@aztec/prover-node 0.76.4 → 0.77.0-testnet-ignition.17

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 (45) hide show
  1. package/dest/config.d.ts +5 -2
  2. package/dest/config.d.ts.map +1 -1
  3. package/dest/config.js +24 -30
  4. package/dest/factory.d.ts +6 -3
  5. package/dest/factory.d.ts.map +1 -1
  6. package/dest/factory.js +21 -14
  7. package/dest/http.d.ts +1 -1
  8. package/dest/http.d.ts.map +1 -1
  9. package/dest/http.js +2 -4
  10. package/dest/index.js +0 -1
  11. package/dest/job/epoch-proving-job.d.ts +7 -4
  12. package/dest/job/epoch-proving-job.d.ts.map +1 -1
  13. package/dest/job/epoch-proving-job.js +233 -193
  14. package/dest/metrics.d.ts +5 -2
  15. package/dest/metrics.d.ts.map +1 -1
  16. package/dest/metrics.js +50 -25
  17. package/dest/monitors/epoch-monitor.d.ts +22 -3
  18. package/dest/monitors/epoch-monitor.d.ts.map +1 -1
  19. package/dest/monitors/epoch-monitor.js +102 -48
  20. package/dest/monitors/index.js +0 -1
  21. package/dest/prover-coordination/config.js +2 -3
  22. package/dest/prover-coordination/factory.d.ts +5 -5
  23. package/dest/prover-coordination/factory.d.ts.map +1 -1
  24. package/dest/prover-coordination/factory.js +11 -8
  25. package/dest/prover-coordination/index.js +0 -1
  26. package/dest/prover-node-publisher.d.ts +5 -4
  27. package/dest/prover-node-publisher.d.ts.map +1 -1
  28. package/dest/prover-node-publisher.js +60 -52
  29. package/dest/prover-node.d.ts +12 -7
  30. package/dest/prover-node.d.ts.map +1 -1
  31. package/dest/prover-node.js +237 -224
  32. package/dest/test/index.d.ts +2 -2
  33. package/dest/test/index.d.ts.map +1 -1
  34. package/dest/test/index.js +2 -1
  35. package/package.json +21 -22
  36. package/src/config.ts +23 -31
  37. package/src/factory.ts +17 -8
  38. package/src/http.ts +2 -2
  39. package/src/job/epoch-proving-job.ts +11 -13
  40. package/src/metrics.ts +26 -5
  41. package/src/monitors/epoch-monitor.ts +57 -12
  42. package/src/prover-coordination/factory.ts +9 -12
  43. package/src/prover-node-publisher.ts +21 -14
  44. package/src/prover-node.ts +24 -22
  45. package/src/test/index.ts +2 -2
@@ -1,215 +1,255 @@
1
- import { __esDecorate, __runInitializers } from "tslib";
2
- import { EpochProvingJobTerminalState, } from '@aztec/circuit-types';
1
+ function _ts_decorate(decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ }
3
7
  import { asyncPool } from '@aztec/foundation/async-pool';
4
8
  import { createLogger } from '@aztec/foundation/log';
5
9
  import { promiseWithResolvers } from '@aztec/foundation/promise';
6
10
  import { Timer } from '@aztec/foundation/timer';
11
+ import { EpochProvingJobTerminalState } from '@aztec/stdlib/interfaces/server';
7
12
  import { Attributes, trackSpan } from '@aztec/telemetry-client';
8
13
  import * as crypto from 'node:crypto';
9
14
  /**
10
15
  * Job that grabs a range of blocks from the unfinalised chain from L1, gets their txs given their hashes,
11
16
  * re-executes their public calls, generates a rollup proof, and submits it to L1. This job will update the
12
17
  * world state as part of public call execution via the public processor.
13
- */
14
- let EpochProvingJob = (() => {
15
- var _a;
16
- let _instanceExtraInitializers = [];
17
- let _run_decorators;
18
- return _a = class EpochProvingJob {
19
- constructor(dbProvider, epochNumber, blocks, txs, prover, publicProcessorFactory, publisher, l2BlockSource, l1ToL2MessageSource, metrics, deadline, config = { parallelBlockLimit: 32 }, cleanUp = () => Promise.resolve()) {
20
- this.dbProvider = (__runInitializers(this, _instanceExtraInitializers), dbProvider);
21
- this.epochNumber = epochNumber;
22
- this.blocks = blocks;
23
- this.txs = txs;
24
- this.prover = prover;
25
- this.publicProcessorFactory = publicProcessorFactory;
26
- this.publisher = publisher;
27
- this.l2BlockSource = l2BlockSource;
28
- this.l1ToL2MessageSource = l1ToL2MessageSource;
29
- this.metrics = metrics;
30
- this.deadline = deadline;
31
- this.config = config;
32
- this.cleanUp = cleanUp;
33
- this.state = 'initialized';
34
- this.log = createLogger('prover-node:epoch-proving-job');
35
- this.uuid = crypto.randomUUID();
36
- this.tracer = metrics.client.getTracer('EpochProvingJob');
37
- }
38
- getId() {
39
- return this.uuid;
18
+ */ export class EpochProvingJob {
19
+ dbProvider;
20
+ epochNumber;
21
+ blocks;
22
+ txs;
23
+ prover;
24
+ publicProcessorFactory;
25
+ publisher;
26
+ l2BlockSource;
27
+ l1ToL2MessageSource;
28
+ metrics;
29
+ deadline;
30
+ config;
31
+ cleanUp;
32
+ state;
33
+ log;
34
+ uuid;
35
+ runPromise;
36
+ deadlineTimeoutHandler;
37
+ tracer;
38
+ constructor(dbProvider, epochNumber, blocks, txs, prover, publicProcessorFactory, publisher, l2BlockSource, l1ToL2MessageSource, metrics, deadline, config = {
39
+ parallelBlockLimit: 32
40
+ }, cleanUp = ()=>Promise.resolve()){
41
+ this.dbProvider = dbProvider;
42
+ this.epochNumber = epochNumber;
43
+ this.blocks = blocks;
44
+ this.txs = txs;
45
+ this.prover = prover;
46
+ this.publicProcessorFactory = publicProcessorFactory;
47
+ this.publisher = publisher;
48
+ this.l2BlockSource = l2BlockSource;
49
+ this.l1ToL2MessageSource = l1ToL2MessageSource;
50
+ this.metrics = metrics;
51
+ this.deadline = deadline;
52
+ this.config = config;
53
+ this.cleanUp = cleanUp;
54
+ this.state = 'initialized';
55
+ this.log = createLogger('prover-node:epoch-proving-job');
56
+ this.uuid = crypto.randomUUID();
57
+ this.tracer = metrics.client.getTracer('EpochProvingJob');
58
+ }
59
+ getId() {
60
+ return this.uuid;
61
+ }
62
+ getState() {
63
+ return this.state;
64
+ }
65
+ getEpochNumber() {
66
+ return this.epochNumber;
67
+ }
68
+ /**
69
+ * Proves the given epoch and submits the proof to L1.
70
+ */ async run() {
71
+ this.scheduleDeadlineStop();
72
+ const epochNumber = Number(this.epochNumber);
73
+ const epochSizeBlocks = this.blocks.length;
74
+ const epochSizeTxs = this.blocks.reduce((total, current)=>total + current.body.txEffects.length, 0);
75
+ const [fromBlock, toBlock] = [
76
+ this.blocks[0].number,
77
+ this.blocks.at(-1).number
78
+ ];
79
+ this.log.info(`Starting epoch ${epochNumber} proving job with blocks ${fromBlock} to ${toBlock}`, {
80
+ fromBlock,
81
+ toBlock,
82
+ epochSizeBlocks,
83
+ epochNumber,
84
+ uuid: this.uuid
85
+ });
86
+ this.progressState('processing');
87
+ const timer = new Timer();
88
+ const { promise, resolve } = promiseWithResolvers();
89
+ this.runPromise = promise;
90
+ try {
91
+ this.prover.startNewEpoch(epochNumber, fromBlock, epochSizeBlocks);
92
+ await this.prover.startTubeCircuits(this.txs);
93
+ await asyncPool(this.config.parallelBlockLimit, this.blocks, async (block)=>{
94
+ this.checkState();
95
+ const globalVariables = block.header.globalVariables;
96
+ const txs = await this.getTxs(block);
97
+ const l1ToL2Messages = await this.getL1ToL2Messages(block);
98
+ const previousHeader = await this.getBlockHeader(block.number - 1);
99
+ this.log.verbose(`Starting processing block ${block.number}`, {
100
+ number: block.number,
101
+ blockHash: (await block.hash()).toString(),
102
+ lastArchive: block.header.lastArchive.root,
103
+ noteHashTreeRoot: block.header.state.partial.noteHashTree.root,
104
+ nullifierTreeRoot: block.header.state.partial.nullifierTree.root,
105
+ publicDataTreeRoot: block.header.state.partial.publicDataTree.root,
106
+ previousHeader: previousHeader.hash(),
107
+ uuid: this.uuid,
108
+ ...globalVariables
109
+ });
110
+ // Start block proving
111
+ await this.prover.startNewBlock(globalVariables, l1ToL2Messages, previousHeader);
112
+ // Process public fns
113
+ const db = await this.dbProvider.fork(block.number - 1);
114
+ const publicProcessor = this.publicProcessorFactory.create(db, globalVariables, true);
115
+ const processed = await this.processTxs(publicProcessor, txs);
116
+ await this.prover.addTxs(processed);
117
+ await db.close();
118
+ this.log.verbose(`Processed all ${txs.length} txs for block ${block.number}`, {
119
+ blockNumber: block.number,
120
+ blockHash: (await block.hash()).toString(),
121
+ uuid: this.uuid
122
+ });
123
+ // Mark block as completed to pad it
124
+ await this.prover.setBlockCompleted(block.number, block.header);
125
+ });
126
+ const executionTime = timer.ms();
127
+ this.progressState('awaiting-prover');
128
+ const { publicInputs, proof } = await this.prover.finaliseEpoch();
129
+ this.log.info(`Finalised proof for epoch ${epochNumber}`, {
130
+ epochNumber,
131
+ uuid: this.uuid,
132
+ duration: timer.ms()
133
+ });
134
+ this.progressState('publishing-proof');
135
+ const success = await this.publisher.submitEpochProof({
136
+ fromBlock,
137
+ toBlock,
138
+ epochNumber,
139
+ publicInputs,
140
+ proof
141
+ });
142
+ if (!success) {
143
+ throw new Error('Failed to submit epoch proof to L1');
40
144
  }
41
- getState() {
42
- return this.state;
145
+ this.log.info(`Submitted proof for epoch ${epochNumber} (blocks ${fromBlock} to ${toBlock})`, {
146
+ epochNumber,
147
+ uuid: this.uuid
148
+ });
149
+ this.state = 'completed';
150
+ this.metrics.recordProvingJob(executionTime, timer.ms(), epochSizeBlocks, epochSizeTxs);
151
+ } catch (err) {
152
+ if (err && err.name === 'HaltExecutionError') {
153
+ this.log.warn(`Halted execution of epoch ${epochNumber} prover job`, {
154
+ uuid: this.uuid,
155
+ epochNumber
156
+ });
157
+ return;
43
158
  }
44
- getEpochNumber() {
45
- return this.epochNumber;
159
+ this.log.error(`Error running epoch ${epochNumber} prover job`, err, {
160
+ uuid: this.uuid,
161
+ epochNumber
162
+ });
163
+ this.state = 'failed';
164
+ } finally{
165
+ clearTimeout(this.deadlineTimeoutHandler);
166
+ await this.cleanUp(this);
167
+ await this.prover.stop();
168
+ resolve();
169
+ }
170
+ }
171
+ progressState(state) {
172
+ this.checkState();
173
+ this.state = state;
174
+ }
175
+ checkState() {
176
+ if (this.state === 'timed-out' || this.state === 'stopped' || this.state === 'failed') {
177
+ throw new HaltExecutionError(this.state);
178
+ }
179
+ }
180
+ async stop(state = 'stopped') {
181
+ this.state = state;
182
+ this.prover.cancel();
183
+ // TODO(palla/prover): Stop the publisher as well
184
+ if (this.runPromise) {
185
+ await this.runPromise;
186
+ }
187
+ }
188
+ scheduleDeadlineStop() {
189
+ const deadline = this.deadline;
190
+ if (deadline) {
191
+ const timeout = deadline.getTime() - Date.now();
192
+ if (timeout <= 0) {
193
+ throw new Error('Cannot start job with deadline in the past');
46
194
  }
47
- /**
48
- * Proves the given epoch and submits the proof to L1.
49
- */
50
- async run() {
51
- this.scheduleDeadlineStop();
52
- const epochNumber = Number(this.epochNumber);
53
- const epochSizeBlocks = this.blocks.length;
54
- const epochSizeTxs = this.blocks.reduce((total, current) => total + current.body.txEffects.length, 0);
55
- const [fromBlock, toBlock] = [this.blocks[0].number, this.blocks.at(-1).number];
56
- this.log.info(`Starting epoch ${epochNumber} proving job with blocks ${fromBlock} to ${toBlock}`, {
57
- fromBlock,
58
- toBlock,
59
- epochSizeBlocks,
60
- epochNumber,
195
+ this.deadlineTimeoutHandler = setTimeout(()=>{
196
+ if (EpochProvingJobTerminalState.includes(this.state)) {
197
+ return;
198
+ }
199
+ this.log.warn('Stopping job due to deadline hit', {
61
200
  uuid: this.uuid,
201
+ epochNumber: this.epochNumber
62
202
  });
63
- this.progressState('processing');
64
- const timer = new Timer();
65
- const { promise, resolve } = promiseWithResolvers();
66
- this.runPromise = promise;
67
- try {
68
- this.prover.startNewEpoch(epochNumber, fromBlock, epochSizeBlocks);
69
- await this.prover.startTubeCircuits(this.txs);
70
- await asyncPool(this.config.parallelBlockLimit, this.blocks, async (block) => {
71
- this.checkState();
72
- const globalVariables = block.header.globalVariables;
73
- const txs = await this.getTxs(block);
74
- const l1ToL2Messages = await this.getL1ToL2Messages(block);
75
- const previousHeader = (await this.getBlockHeader(block.number - 1));
76
- this.log.verbose(`Starting processing block ${block.number}`, {
77
- number: block.number,
78
- blockHash: (await block.hash()).toString(),
79
- lastArchive: block.header.lastArchive.root,
80
- noteHashTreeRoot: block.header.state.partial.noteHashTree.root,
81
- nullifierTreeRoot: block.header.state.partial.nullifierTree.root,
82
- publicDataTreeRoot: block.header.state.partial.publicDataTree.root,
83
- previousHeader: previousHeader.hash(),
84
- uuid: this.uuid,
85
- ...globalVariables,
86
- });
87
- // Start block proving
88
- await this.prover.startNewBlock(globalVariables, l1ToL2Messages, previousHeader);
89
- // Process public fns
90
- const db = await this.dbProvider.fork(block.number - 1);
91
- const publicProcessor = this.publicProcessorFactory.create(db, globalVariables, true);
92
- const processed = await this.processTxs(publicProcessor, txs);
93
- await this.prover.addTxs(processed);
94
- await db.close();
95
- this.log.verbose(`Processed all ${txs.length} txs for block ${block.number}`, {
96
- blockNumber: block.number,
97
- blockHash: (await block.hash()).toString(),
98
- uuid: this.uuid,
99
- });
100
- // Mark block as completed to pad it
101
- await this.prover.setBlockCompleted(block.number, block.header);
102
- });
103
- const executionTime = timer.ms();
104
- this.progressState('awaiting-prover');
105
- const { publicInputs, proof } = await this.prover.finaliseEpoch();
106
- this.log.info(`Finalised proof for epoch ${epochNumber}`, { epochNumber, uuid: this.uuid, duration: timer.ms() });
107
- this.progressState('publishing-proof');
108
- const success = await this.publisher.submitEpochProof({ fromBlock, toBlock, epochNumber, publicInputs, proof });
109
- if (!success) {
110
- throw new Error('Failed to submit epoch proof to L1');
111
- }
112
- this.log.info(`Submitted proof for epoch ${epochNumber} (blocks ${fromBlock} to ${toBlock})`, {
113
- epochNumber,
203
+ this.stop('timed-out').catch((err)=>{
204
+ this.log.error('Error stopping job', err, {
114
205
  uuid: this.uuid,
206
+ epochNumber: this.epochNumber
115
207
  });
116
- this.state = 'completed';
117
- this.metrics.recordProvingJob(executionTime, timer.ms(), epochSizeBlocks, epochSizeTxs);
118
- }
119
- catch (err) {
120
- if (err && err.name === 'HaltExecutionError') {
121
- this.log.warn(`Halted execution of epoch ${epochNumber} prover job`, { uuid: this.uuid, epochNumber });
122
- return;
123
- }
124
- this.log.error(`Error running epoch ${epochNumber} prover job`, err, { uuid: this.uuid, epochNumber });
125
- this.state = 'failed';
126
- }
127
- finally {
128
- clearTimeout(this.deadlineTimeoutHandler);
129
- await this.cleanUp(this);
130
- await this.prover.stop();
131
- resolve();
132
- }
133
- }
134
- progressState(state) {
135
- this.checkState();
136
- this.state = state;
137
- }
138
- checkState() {
139
- if (this.state === 'timed-out' || this.state === 'stopped' || this.state === 'failed') {
140
- throw new HaltExecutionError(this.state);
141
- }
142
- }
143
- async stop(state = 'stopped') {
144
- this.state = state;
145
- this.prover.cancel();
146
- // TODO(palla/prover): Stop the publisher as well
147
- if (this.runPromise) {
148
- await this.runPromise;
149
- }
150
- }
151
- scheduleDeadlineStop() {
152
- const deadline = this.deadline;
153
- if (deadline) {
154
- const timeout = deadline.getTime() - Date.now();
155
- if (timeout <= 0) {
156
- throw new Error('Cannot start job with deadline in the past');
157
- }
158
- this.deadlineTimeoutHandler = setTimeout(() => {
159
- if (EpochProvingJobTerminalState.includes(this.state)) {
160
- return;
161
- }
162
- this.log.warn('Stopping job due to deadline hit', { uuid: this.uuid, epochNumber: this.epochNumber });
163
- this.stop('timed-out').catch(err => {
164
- this.log.error('Error stopping job', err, { uuid: this.uuid, epochNumber: this.epochNumber });
165
- });
166
- }, timeout);
167
- }
168
- }
169
- /* Returns the header for the given block number, or the genesis block for block zero. */
170
- async getBlockHeader(blockNumber) {
171
- if (blockNumber === 0) {
172
- return (await this.dbProvider.fork()).getInitialHeader();
173
- }
174
- return this.l2BlockSource.getBlockHeader(blockNumber);
175
- }
176
- async getTxs(block) {
177
- const txHashes = block.body.txEffects.map(tx => tx.txHash.toBigInt());
178
- const txsAndHashes = await Promise.all(this.txs.map(async (tx) => ({ tx, hash: await tx.getTxHash() })));
179
- return txsAndHashes
180
- .filter(txAndHash => txHashes.includes(txAndHash.hash.toBigInt()))
181
- .map(txAndHash => txAndHash.tx);
182
- }
183
- getL1ToL2Messages(block) {
184
- return this.l1ToL2MessageSource.getL1ToL2Messages(BigInt(block.number));
185
- }
186
- async processTxs(publicProcessor, txs) {
187
- const { deadline } = this;
188
- const [processedTxs, failedTxs] = await publicProcessor.process(txs, { deadline });
189
- if (failedTxs.length) {
190
- throw new Error(`Txs failed processing: ${failedTxs.map(({ tx, error }) => `${tx.getTxHash()} (${error})`).join(', ')}`);
191
- }
192
- if (processedTxs.length !== txs.length) {
193
- throw new Error(`Failed to process all txs: processed ${processedTxs.length} out of ${txs.length}`);
194
- }
195
- return processedTxs;
196
- }
197
- },
198
- (() => {
199
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
200
- _run_decorators = [trackSpan('EpochProvingJob.run', function () {
201
- return { [Attributes.EPOCH_NUMBER]: Number(this.epochNumber) };
202
- })];
203
- __esDecorate(_a, null, _run_decorators, { kind: "method", name: "run", static: false, private: false, access: { has: obj => "run" in obj, get: obj => obj.run }, metadata: _metadata }, null, _instanceExtraInitializers);
204
- if (_metadata) Object.defineProperty(_a, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
205
- })(),
206
- _a;
207
- })();
208
- export { EpochProvingJob };
208
+ });
209
+ }, timeout);
210
+ }
211
+ }
212
+ /* Returns the header for the given block number, or the genesis block for block zero. */ async getBlockHeader(blockNumber) {
213
+ if (blockNumber === 0) {
214
+ return (await this.dbProvider.fork()).getInitialHeader();
215
+ }
216
+ return this.l2BlockSource.getBlockHeader(blockNumber);
217
+ }
218
+ async getTxs(block) {
219
+ const txHashes = block.body.txEffects.map((tx)=>tx.txHash.toBigInt());
220
+ const txsAndHashes = await Promise.all(this.txs.map(async (tx)=>({
221
+ tx,
222
+ hash: await tx.getTxHash()
223
+ })));
224
+ return txsAndHashes.filter((txAndHash)=>txHashes.includes(txAndHash.hash.toBigInt())).map((txAndHash)=>txAndHash.tx);
225
+ }
226
+ getL1ToL2Messages(block) {
227
+ return this.l1ToL2MessageSource.getL1ToL2Messages(BigInt(block.number));
228
+ }
229
+ async processTxs(publicProcessor, txs) {
230
+ const { deadline } = this;
231
+ const [processedTxs, failedTxs] = await publicProcessor.process(txs, {
232
+ deadline
233
+ });
234
+ if (failedTxs.length) {
235
+ throw new Error(`Txs failed processing: ${failedTxs.map(({ tx, error })=>`${tx.getTxHash()} (${error})`).join(', ')}`);
236
+ }
237
+ if (processedTxs.length !== txs.length) {
238
+ throw new Error(`Failed to process all txs: processed ${processedTxs.length} out of ${txs.length}`);
239
+ }
240
+ return processedTxs;
241
+ }
242
+ }
243
+ _ts_decorate([
244
+ trackSpan('EpochProvingJob.run', function() {
245
+ return {
246
+ [Attributes.EPOCH_NUMBER]: Number(this.epochNumber)
247
+ };
248
+ })
249
+ ], EpochProvingJob.prototype, "run", null);
209
250
  class HaltExecutionError extends Error {
210
- constructor(state) {
251
+ constructor(state){
211
252
  super(`Halted execution due to state ${state}`);
212
253
  this.name = 'HaltExecutionError';
213
254
  }
214
255
  }
215
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXBvY2gtcHJvdmluZy1qb2IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvam9iL2Vwb2NoLXByb3Zpbmctam9iLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBR0wsNEJBQTRCLEdBTzdCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFaEQsT0FBTyxFQUFFLFVBQVUsRUFBK0IsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFN0YsT0FBTyxLQUFLLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFLdEM7Ozs7R0FJRztJQUNVLGVBQWU7Ozs7c0JBQWYsZUFBZTtZQVUxQixZQUNVLFVBQW9DLEVBQ3BDLFdBQW1CLEVBQ25CLE1BQWlCLEVBQ2pCLEdBQVMsRUFDVCxNQUFtQixFQUNuQixzQkFBOEMsRUFDOUMsU0FBOEIsRUFDOUIsYUFBNEIsRUFDNUIsbUJBQXdDLEVBQ3hDLE9BQTBCLEVBQzFCLFFBQTBCLEVBQzFCLFNBQXlDLEVBQUUsa0JBQWtCLEVBQUUsRUFBRSxFQUFFLEVBQ25FLFVBQW1ELEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUU7Z0JBWjFFLGVBQVUsSUFYVCxtREFBZSxFQVdoQixVQUFVLEVBQTBCO2dCQUNwQyxnQkFBVyxHQUFYLFdBQVcsQ0FBUTtnQkFDbkIsV0FBTSxHQUFOLE1BQU0sQ0FBVztnQkFDakIsUUFBRyxHQUFILEdBQUcsQ0FBTTtnQkFDVCxXQUFNLEdBQU4sTUFBTSxDQUFhO2dCQUNuQiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO2dCQUM5QyxjQUFTLEdBQVQsU0FBUyxDQUFxQjtnQkFDOUIsa0JBQWEsR0FBYixhQUFhLENBQWU7Z0JBQzVCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7Z0JBQ3hDLFlBQU8sR0FBUCxPQUFPLENBQW1CO2dCQUMxQixhQUFRLEdBQVIsUUFBUSxDQUFrQjtnQkFDMUIsV0FBTSxHQUFOLE1BQU0sQ0FBNkQ7Z0JBQ25FLFlBQU8sR0FBUCxPQUFPLENBQW1FO2dCQXRCNUUsVUFBSyxHQUF5QixhQUFhLENBQUM7Z0JBQzVDLFFBQUcsR0FBRyxZQUFZLENBQUMsK0JBQStCLENBQUMsQ0FBQztnQkF1QjFELElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNoQyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDNUQsQ0FBQztZQUVNLEtBQUs7Z0JBQ1YsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ25CLENBQUM7WUFFTSxRQUFRO2dCQUNiLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztZQUNwQixDQUFDO1lBRU0sY0FBYztnQkFDbkIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQzFCLENBQUM7WUFFRDs7ZUFFRztZQUlJLEtBQUssQ0FBQyxHQUFHO2dCQUNkLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2dCQUU1QixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUM3QyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDM0MsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN0RyxNQUFNLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDakYsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLFdBQVcsNEJBQTRCLFNBQVMsT0FBTyxPQUFPLEVBQUUsRUFBRTtvQkFDaEcsU0FBUztvQkFDVCxPQUFPO29CQUNQLGVBQWU7b0JBQ2YsV0FBVztvQkFDWCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7aUJBQ2hCLENBQUMsQ0FBQztnQkFFSCxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUNqQyxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUMxQixNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLG9CQUFvQixFQUFRLENBQUM7Z0JBQzFELElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDO2dCQUUxQixJQUFJLENBQUM7b0JBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxlQUFlLENBQUMsQ0FBQztvQkFDbkUsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFFOUMsTUFBTSxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBQyxLQUFLLEVBQUMsRUFBRTt3QkFDekUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO3dCQUVsQixNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQzt3QkFDckQsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUNyQyxNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDM0QsTUFBTSxjQUFjLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBRSxDQUFDO3dCQUV0RSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFOzRCQUM1RCxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07NEJBQ3BCLFNBQVMsRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFOzRCQUMxQyxXQUFXLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSTs0QkFDMUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJOzRCQUM5RCxpQkFBaUIsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUk7NEJBQ2hFLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsSUFBSTs0QkFDbEUsY0FBYyxFQUFFLGNBQWMsQ0FBQyxJQUFJLEVBQUU7NEJBQ3JDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTs0QkFDZixHQUFHLGVBQWU7eUJBQ25CLENBQUMsQ0FBQzt3QkFFSCxzQkFBc0I7d0JBQ3RCLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsZUFBZSxFQUFFLGNBQWMsRUFBRSxjQUFjLENBQUMsQ0FBQzt3QkFFakYscUJBQXFCO3dCQUNyQixNQUFNLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7d0JBQ3hELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQzt3QkFDdEYsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsQ0FBQzt3QkFDOUQsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQzt3QkFDcEMsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQ2pCLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGlCQUFpQixHQUFHLENBQUMsTUFBTSxrQkFBa0IsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFOzRCQUM1RSxXQUFXLEVBQUUsS0FBSyxDQUFDLE1BQU07NEJBQ3pCLFNBQVMsRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFOzRCQUMxQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7eUJBQ2hCLENBQUMsQ0FBQzt3QkFFSCxvQ0FBb0M7d0JBQ3BDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDbEUsQ0FBQyxDQUFDLENBQUM7b0JBRUgsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDO29CQUVqQyxJQUFJLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLENBQUM7b0JBQ3RDLE1BQU0sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUNsRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyw2QkFBNkIsV0FBVyxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBRWxILElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQztvQkFDdkMsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7b0JBQ2hILElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDYixNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7b0JBQ3hELENBQUM7b0JBRUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLFdBQVcsWUFBWSxTQUFTLE9BQU8sT0FBTyxHQUFHLEVBQUU7d0JBQzVGLFdBQVc7d0JBQ1gsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO3FCQUNoQixDQUFDLENBQUM7b0JBQ0gsSUFBSSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUM7b0JBQ3pCLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxlQUFlLEVBQUUsWUFBWSxDQUFDLENBQUM7Z0JBQzFGLENBQUM7Z0JBQUMsT0FBTyxHQUFRLEVBQUUsQ0FBQztvQkFDbEIsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxvQkFBb0IsRUFBRSxDQUFDO3dCQUM3QyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyw2QkFBNkIsV0FBVyxhQUFhLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO3dCQUN2RyxPQUFPO29CQUNULENBQUM7b0JBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsdUJBQXVCLFdBQVcsYUFBYSxFQUFFLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7b0JBQ3ZHLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDO2dCQUN4QixDQUFDO3dCQUFTLENBQUM7b0JBQ1QsWUFBWSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO29CQUMxQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3pCLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDekIsT0FBTyxFQUFFLENBQUM7Z0JBQ1osQ0FBQztZQUNILENBQUM7WUFFTyxhQUFhLENBQUMsS0FBMkI7Z0JBQy9DLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDbEIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDckIsQ0FBQztZQUVPLFVBQVU7Z0JBQ2hCLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxXQUFXLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFDdEYsTUFBTSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDM0MsQ0FBQztZQUNILENBQUM7WUFFTSxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQThCLFNBQVM7Z0JBQ3ZELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO2dCQUNuQixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNyQixpREFBaUQ7Z0JBQ2pELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUNwQixNQUFNLElBQUksQ0FBQyxVQUFVLENBQUM7Z0JBQ3hCLENBQUM7WUFDSCxDQUFDO1lBRU8sb0JBQW9CO2dCQUMxQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUMvQixJQUFJLFFBQVEsRUFBRSxDQUFDO29CQUNiLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQ2hELElBQUksT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDO3dCQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7b0JBQ2hFLENBQUM7b0JBRUQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7d0JBQzVDLElBQUksNEJBQTRCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDOzRCQUN0RCxPQUFPO3dCQUNULENBQUM7d0JBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0NBQWtDLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7d0JBQ3RHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFOzRCQUNqQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7d0JBQ2hHLENBQUMsQ0FBQyxDQUFDO29CQUNMLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDZCxDQUFDO1lBQ0gsQ0FBQztZQUVELHlGQUF5RjtZQUNqRixLQUFLLENBQUMsY0FBYyxDQUFDLFdBQW1CO2dCQUM5QyxJQUFJLFdBQVcsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDdEIsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQzNELENBQUM7Z0JBQ0QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN4RCxDQUFDO1lBRU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFjO2dCQUNqQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7Z0JBQ3RFLE1BQU0sWUFBWSxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUMsRUFBRSxFQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN2RyxPQUFPLFlBQVk7cUJBQ2hCLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO3FCQUNqRSxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDcEMsQ0FBQztZQUVPLGlCQUFpQixDQUFDLEtBQWM7Z0JBQ3RDLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUMxRSxDQUFDO1lBRU8sS0FBSyxDQUFDLFVBQVUsQ0FBQyxlQUFnQyxFQUFFLEdBQVM7Z0JBQ2xFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUM7Z0JBQzFCLE1BQU0sQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLEdBQUcsTUFBTSxlQUFlLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7Z0JBRW5GLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUNyQixNQUFNLElBQUksS0FBSyxDQUNiLDBCQUEwQixTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFBRSxLQUFLLEtBQUssR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQ3hHLENBQUM7Z0JBQ0osQ0FBQztnQkFFRCxJQUFJLFlBQVksQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUN2QyxNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxZQUFZLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO2dCQUN0RyxDQUFDO2dCQUVELE9BQU8sWUFBWSxDQUFDO1lBQ3RCLENBQUM7Ozs7K0JBOUtBLFNBQVMsQ0FBQyxxQkFBcUIsRUFBRTtvQkFDaEMsT0FBTyxFQUFFLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDakUsQ0FBQyxDQUFDO1lBQ0YsMEpBQWEsR0FBRyw2REE4RmY7Ozs7O1NBN0lVLGVBQWU7QUE2TjVCLE1BQU0sa0JBQW1CLFNBQVEsS0FBSztJQUNwQyxZQUFZLEtBQTJCO1FBQ3JDLEtBQUssQ0FBQyxpQ0FBaUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsSUFBSSxHQUFHLG9CQUFvQixDQUFDO0lBQ25DLENBQUM7Q0FDRiJ9
package/dest/metrics.d.ts CHANGED
@@ -1,7 +1,8 @@
1
- import { type L1PublishProofStats } from '@aztec/circuit-types/stats';
1
+ import type { L1PublishProofStats } from '@aztec/stdlib/stats';
2
2
  import { type Histogram, type TelemetryClient, type UpDownCounter } from '@aztec/telemetry-client';
3
3
  export declare class ProverNodeMetrics {
4
4
  readonly client: TelemetryClient;
5
+ private logger;
5
6
  proverEpochExecutionDuration: Histogram;
6
7
  provingJobDuration: Histogram;
7
8
  provingJobBlocks: Histogram;
@@ -14,10 +15,12 @@ export declare class ProverNodeMetrics {
14
15
  txCalldataGas: Histogram;
15
16
  txBlobDataGasUsed: Histogram;
16
17
  txBlobDataGasCost: Histogram;
17
- constructor(client: TelemetryClient, name?: string);
18
+ private senderBalance;
19
+ constructor(client: TelemetryClient, name?: string, logger?: import("@aztec/foundation/log").Logger);
18
20
  recordFailedTx(): void;
19
21
  recordSubmitProof(durationMs: number, stats: L1PublishProofStats): void;
20
22
  recordProvingJob(executionTimeMs: number, totalTimeMs: number, numBlocks: number, numTxs: number): void;
23
+ recordSenderBalance(wei: bigint, senderAddress: string): void;
21
24
  private recordTx;
22
25
  }
23
26
  //# sourceMappingURL=metrics.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAuB,MAAM,4BAA4B,CAAC;AAC3F,OAAO,EAEL,KAAK,SAAS,EAEd,KAAK,eAAe,EACpB,KAAK,aAAa,EAEnB,MAAM,yBAAyB,CAAC;AAIjC,qBAAa,iBAAiB;aAeA,MAAM,EAAE,eAAe;IAdnD,4BAA4B,EAAE,SAAS,CAAC;IACxC,kBAAkB,EAAE,SAAS,CAAC;IAC9B,gBAAgB,EAAE,SAAS,CAAC;IAC5B,sBAAsB,EAAE,SAAS,CAAC;IAElC,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,aAAa,CAAC;IACvB,UAAU,EAAE,SAAS,CAAC;IACtB,KAAK,EAAE,SAAS,CAAC;IACjB,cAAc,EAAE,SAAS,CAAC;IAC1B,aAAa,EAAE,SAAS,CAAC;IACzB,iBAAiB,EAAE,SAAS,CAAC;IAC7B,iBAAiB,EAAE,SAAS,CAAC;gBAED,MAAM,EAAE,eAAe,EAAE,IAAI,SAAe;IAoExE,cAAc;IAOd,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB;IAIzD,gBAAgB,CAAC,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAOvG,OAAO,CAAC,QAAQ;CA6BjB"}
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAkB,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAGL,KAAK,SAAS,EAEd,KAAK,eAAe,EACpB,KAAK,aAAa,EAEnB,MAAM,yBAAyB,CAAC;AAIjC,qBAAa,iBAAiB;aAkBV,MAAM,EAAE,eAAe;IAEvC,OAAO,CAAC,MAAM;IAnBhB,4BAA4B,EAAE,SAAS,CAAC;IACxC,kBAAkB,EAAE,SAAS,CAAC;IAC9B,gBAAgB,EAAE,SAAS,CAAC;IAC5B,sBAAsB,EAAE,SAAS,CAAC;IAElC,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,aAAa,CAAC;IACvB,UAAU,EAAE,SAAS,CAAC;IACtB,KAAK,EAAE,SAAS,CAAC;IACjB,cAAc,EAAE,SAAS,CAAC;IAC1B,aAAa,EAAE,SAAS,CAAC;IACzB,iBAAiB,EAAE,SAAS,CAAC;IAC7B,iBAAiB,EAAE,SAAS,CAAC;IAE7B,OAAO,CAAC,aAAa,CAAQ;gBAGX,MAAM,EAAE,eAAe,EACvC,IAAI,SAAe,EACX,MAAM,yCAAgD;IA2EhE,cAAc;IAOd,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB;IAIzD,gBAAgB,CAAC,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAOhG,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM;IAO7D,OAAO,CAAC,QAAQ;CA6BjB"}