@aztec/bb-prover 0.40.0 → 0.41.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  /* eslint-disable require-await */
2
2
  import { PublicKernelType, makePublicInputsAndProof, } from '@aztec/circuit-types';
3
- import { Fr, Proof, RecursiveProof, RollupTypes, RootParityInput, VerificationKeyAsFields, } from '@aztec/circuits.js';
3
+ import { Fr, NESTED_RECURSIVE_PROOF_LENGTH, Proof, RECURSIVE_PROOF_LENGTH, RecursiveProof, RollupTypes, RootParityInput, VerificationKeyAsFields, } from '@aztec/circuits.js';
4
4
  import { randomBytes } from '@aztec/foundation/crypto';
5
5
  import { createDebugLogger } from '@aztec/foundation/log';
6
6
  import { Timer } from '@aztec/foundation/timer';
@@ -9,7 +9,7 @@ import { NativeACVMSimulator } from '@aztec/simulator';
9
9
  import * as fs from 'fs/promises';
10
10
  import { BB_RESULT, PROOF_FIELDS_FILENAME, PROOF_FILENAME, VK_FIELDS_FILENAME, VK_FILENAME, generateKeyForNoirCircuit, generateProof, verifyProof, } from '../bb/execute.js';
11
11
  import { PublicKernelArtifactMapping } from '../mappings/mappings.js';
12
- import { circuitTypeToCircuitName, emitCircuitProvingStats, emitCircuitWitnessGenerationStats } from '../stats.js';
12
+ import { mapProtocolArtifactNameToCircuitName } from '../stats.js';
13
13
  import { AGGREGATION_OBJECT_SIZE, CIRCUIT_PUBLIC_INPUTS_INDEX, CIRCUIT_RECURSIVE_INDEX, CIRCUIT_SIZE_INDEX, } from './verification_key_data.js';
14
14
  const logger = createDebugLogger('aztec:bb-prover');
15
15
  const CIRCUITS_WITHOUT_AGGREGATION = new Set(['BaseParityArtifact']);
@@ -36,8 +36,7 @@ export class BBNativeRollupProver {
36
36
  * @returns The public inputs of the parity circuit.
37
37
  */
38
38
  async getBaseParityProof(inputs) {
39
- const witnessMap = convertBaseParityInputsToWitnessMap(inputs);
40
- const [circuitOutput, proof] = await this.createRecursiveProof(witnessMap, 'BaseParityArtifact', convertBaseParityOutputsFromWitnessMap);
39
+ const [circuitOutput, proof] = await this.createRecursiveProof(inputs, 'BaseParityArtifact', RECURSIVE_PROOF_LENGTH, convertBaseParityInputsToWitnessMap, convertBaseParityOutputsFromWitnessMap);
41
40
  const verificationKey = await this.getVerificationKeyDataForCircuit('BaseParityArtifact');
42
41
  const vk = new VerificationKeyAsFields(verificationKey.keyAsFields, verificationKey.hash);
43
42
  return new RootParityInput(proof, vk, circuitOutput);
@@ -48,8 +47,7 @@ export class BBNativeRollupProver {
48
47
  * @returns The public inputs of the parity circuit.
49
48
  */
50
49
  async getRootParityProof(inputs) {
51
- const witnessMap = convertRootParityInputsToWitnessMap(inputs);
52
- const [circuitOutput, proof] = await this.createRecursiveProof(witnessMap, 'RootParityArtifact', convertRootParityOutputsFromWitnessMap);
50
+ const [circuitOutput, proof] = await this.createRecursiveProof(inputs, 'RootParityArtifact', NESTED_RECURSIVE_PROOF_LENGTH, convertRootParityInputsToWitnessMap, convertRootParityOutputsFromWitnessMap);
53
51
  const verificationKey = await this.getVerificationKeyDataForCircuit('RootParityArtifact');
54
52
  const vk = new VerificationKeyAsFields(verificationKey.keyAsFields, verificationKey.hash);
55
53
  return new RootParityInput(proof, vk, circuitOutput);
@@ -64,9 +62,7 @@ export class BBNativeRollupProver {
64
62
  if (kernelOps === undefined) {
65
63
  throw new Error(`Unable to prove kernel type ${PublicKernelType[kernelRequest.type]}`);
66
64
  }
67
- const witnessMap = kernelOps.convertInputs(kernelRequest.inputs);
68
- const [outputWitness, proof] = await this.createProof(witnessMap, kernelOps.artifact);
69
- const result = kernelOps.convertOutputs(outputWitness);
65
+ const [result, proof] = await this.createProof(kernelRequest.inputs, kernelOps.artifact, kernelOps.convertInputs, kernelOps.convertOutputs);
70
66
  return makePublicInputsAndProof(result, proof);
71
67
  }
72
68
  /**
@@ -75,9 +71,7 @@ export class BBNativeRollupProver {
75
71
  * @returns The requested circuit's public inputs and proof
76
72
  */
77
73
  async getPublicTailProof(kernelRequest) {
78
- const witnessMap = convertPublicTailInputsToWitnessMap(kernelRequest.inputs);
79
- const [outputWitness, proof] = await this.createProof(witnessMap, 'PublicKernelTailArtifact');
80
- const result = convertPublicTailOutputFromWitnessMap(outputWitness);
74
+ const [result, proof] = await this.createProof(kernelRequest.inputs, 'PublicKernelTailArtifact', convertPublicTailInputsToWitnessMap, convertPublicTailOutputFromWitnessMap);
81
75
  return makePublicInputsAndProof(result, proof);
82
76
  }
83
77
  /**
@@ -86,9 +80,7 @@ export class BBNativeRollupProver {
86
80
  * @returns The public inputs as outputs of the simulation.
87
81
  */
88
82
  async getBaseRollupProof(input) {
89
- const witnessMap = convertBaseRollupInputsToWitnessMap(input);
90
- const [outputWitness, proof] = await this.createProof(witnessMap, 'BaseRollupArtifact');
91
- const result = convertBaseRollupOutputsFromWitnessMap(outputWitness);
83
+ const [result, proof] = await this.createProof(input, 'BaseRollupArtifact', convertBaseRollupInputsToWitnessMap, convertBaseRollupOutputsFromWitnessMap);
92
84
  return makePublicInputsAndProof(result, proof);
93
85
  }
94
86
  /**
@@ -99,9 +91,7 @@ export class BBNativeRollupProver {
99
91
  async getMergeRollupProof(input) {
100
92
  // verify both inputs
101
93
  await Promise.all(input.previousRollupData.map(prev => this.verifyPreviousRollupProof(prev)));
102
- const witnessMap = convertMergeRollupInputsToWitnessMap(input);
103
- const [outputWitness, proof] = await this.createProof(witnessMap, 'MergeRollupArtifact');
104
- const result = convertMergeRollupOutputsFromWitnessMap(outputWitness);
94
+ const [result, proof] = await this.createProof(input, 'MergeRollupArtifact', convertMergeRollupInputsToWitnessMap, convertMergeRollupOutputsFromWitnessMap);
105
95
  return makePublicInputsAndProof(result, proof);
106
96
  }
107
97
  /**
@@ -112,14 +102,12 @@ export class BBNativeRollupProver {
112
102
  async getRootRollupProof(input) {
113
103
  // verify the inputs
114
104
  await Promise.all(input.previousRollupData.map(prev => this.verifyPreviousRollupProof(prev)));
115
- const witnessMap = convertRootRollupInputsToWitnessMap(input);
116
- const [outputWitness, proof] = await this.createProof(witnessMap, 'RootRollupArtifact');
105
+ const [result, proof] = await this.createProof(input, 'RootRollupArtifact', convertRootRollupInputsToWitnessMap, convertRootRollupOutputsFromWitnessMap);
117
106
  await this.verifyProof('RootRollupArtifact', proof);
118
- const result = convertRootRollupOutputsFromWitnessMap(outputWitness);
119
107
  return makePublicInputsAndProof(result, proof);
120
108
  }
121
109
  // TODO(@PhilWindle): Delete when no longer required
122
- async createProof(witnessMap, circuitType) {
110
+ async createProof(input, circuitType, convertInput, convertOutput) {
123
111
  // Create random directory to be used for temp files
124
112
  const bbWorkingDirectory = `${this.config.bbWorkingDirectory}/${randomBytes(8).toString('hex')}`;
125
113
  await fs.mkdir(bbWorkingDirectory, { recursive: true });
@@ -131,9 +119,16 @@ export class BBNativeRollupProver {
131
119
  const simulator = new NativeACVMSimulator(this.config.acvmWorkingDirectory, this.config.acvmBinaryPath, outputWitnessFile);
132
120
  const artifact = ServerCircuitArtifacts[circuitType];
133
121
  logger.debug(`Generating witness data for ${circuitType}`);
122
+ const witnessMap = convertInput(input);
134
123
  const timer = new Timer();
135
124
  const outputWitness = await simulator.simulateCircuit(witnessMap, artifact);
136
- emitCircuitWitnessGenerationStats(circuitTypeToCircuitName(circuitType), timer.ms(), witnessMap.size * Fr.SIZE_IN_BYTES, outputWitness.size * Fr.SIZE_IN_BYTES, logger);
125
+ logger.debug(`Generated witness`, {
126
+ circuitName: mapProtocolArtifactNameToCircuitName(circuitType),
127
+ duration: timer.ms(),
128
+ inputSize: witnessMap.size * Fr.SIZE_IN_BYTES,
129
+ outputSize: outputWitness.size * Fr.SIZE_IN_BYTES,
130
+ eventName: 'circuit-witness-generation',
131
+ });
137
132
  // Now prove the circuit from the generated witness
138
133
  logger.debug(`Proving ${circuitType}...`);
139
134
  const provingResult = await generateProof(this.config.bbBinaryPath, bbWorkingDirectory, circuitType, Buffer.from(artifact.bytecode, 'base64'), outputWitnessFile, logger.debug);
@@ -142,23 +137,35 @@ export class BBNativeRollupProver {
142
137
  throw new Error(provingResult.reason);
143
138
  }
144
139
  // Ensure our vk cache is up to date
145
- await this.updateVerificationKeyAfterProof(provingResult.vkPath, circuitType);
140
+ const vkData = await this.updateVerificationKeyAfterProof(provingResult.vkPath, circuitType);
146
141
  // Read the proof and then cleanup up our temporary directory
147
- const proof = await fs.readFile(`${provingResult.proofPath}/${PROOF_FILENAME}`);
148
- // does not include reading the proof from disk above because duration comes from the bb wrapper
149
- emitCircuitProvingStats(circuitTypeToCircuitName(circuitType), provingResult.duration, witnessMap.size * Fr.SIZE_IN_BYTES, outputWitness.size * Fr.SIZE_IN_BYTES, proof.length, logger);
142
+ const rawProof = await fs.readFile(`${provingResult.proofPath}/${PROOF_FILENAME}`);
150
143
  await fs.rm(bbWorkingDirectory, { recursive: true, force: true });
151
- logger.info(`Generated proof for ${circuitType} in ${provingResult.duration} ms, size: ${proof.length} fields`);
152
- return [outputWitness, new Proof(proof)];
144
+ const output = convertOutput(outputWitness);
145
+ const proof = new Proof(rawProof);
146
+ logger.info(`Generated proof for ${circuitType} in ${provingResult.duration} ms, size: ${proof.buffer.length} fields`, {
147
+ circuitName: mapProtocolArtifactNameToCircuitName(circuitType),
148
+ // does not include reading the proof from disk
149
+ duration: provingResult.duration,
150
+ proofSize: proof.buffer.length,
151
+ eventName: 'circuit-proving',
152
+ inputSize: input.toBuffer().length,
153
+ outputSize: output.toBuffer().length,
154
+ circuitSize: vkData.circuitSize,
155
+ numPublicInputs: vkData.numPublicInputs,
156
+ });
157
+ return [output, proof];
153
158
  }
154
159
  /**
155
160
  * Executes a circuit and returns it's outputs and corresponding proof with embedded aggregation object
156
161
  * @param witnessMap - The input witness
157
162
  * @param circuitType - The type of circuit to be executed
163
+ * @param proofLength - The length of the proof to be generated. This is a dummy parameter to aid in type checking
164
+ * @param convertInput - Function for mapping the input object to a witness map.
158
165
  * @param convertOutput - Function for parsing the output witness to it's corresponding object
159
166
  * @returns The circuits output object and it's proof
160
167
  */
161
- async createRecursiveProof(witnessMap, circuitType, convertOutput) {
168
+ async createRecursiveProof(input, circuitType, proofLength, convertInput, convertOutput) {
162
169
  // Create random directory to be used for temp files
163
170
  const bbWorkingDirectory = `${this.config.bbWorkingDirectory}/${randomBytes(8).toString('hex')}`;
164
171
  await fs.mkdir(bbWorkingDirectory, { recursive: true });
@@ -172,9 +179,18 @@ export class BBNativeRollupProver {
172
179
  const artifact = ServerCircuitArtifacts[circuitType];
173
180
  logger.debug(`Generating witness data for ${circuitType}`);
174
181
  const timer = new Timer();
182
+ const witnessMap = convertInput(input);
175
183
  const outputWitness = await simulator.simulateCircuit(witnessMap, artifact);
176
- emitCircuitWitnessGenerationStats(circuitTypeToCircuitName(circuitType), timer.ms(), witnessMap.size * Fr.SIZE_IN_BYTES, outputWitness.size * Fr.SIZE_IN_BYTES, logger);
177
- const outputType = convertOutput(outputWitness);
184
+ const output = convertOutput(outputWitness);
185
+ const inputSize = input.toBuffer().length;
186
+ const outputSize = output.toBuffer().length;
187
+ logger.debug(`Generated witness`, {
188
+ circuitName: mapProtocolArtifactNameToCircuitName(circuitType),
189
+ duration: timer.ms(),
190
+ inputSize,
191
+ outputSize,
192
+ eventName: 'circuit-witness-generation',
193
+ });
178
194
  // Now prove the circuit from the generated witness
179
195
  logger.debug(`Proving ${circuitType}...`);
180
196
  const provingResult = await generateProof(this.config.bbBinaryPath, bbWorkingDirectory, circuitType, Buffer.from(artifact.bytecode, 'base64'), outputWitnessFile, logger.debug);
@@ -183,12 +199,20 @@ export class BBNativeRollupProver {
183
199
  throw new Error(provingResult.reason);
184
200
  }
185
201
  // Ensure our vk cache is up to date
186
- await this.updateVerificationKeyAfterProof(provingResult.vkPath, circuitType);
202
+ const vkData = await this.updateVerificationKeyAfterProof(provingResult.vkPath, circuitType);
187
203
  // Read the proof and then cleanup up our temporary directory
188
- const proof = await this.readProofAsFields(provingResult.proofPath, circuitType);
189
- logger.info(`Generated proof for ${circuitType} in ${provingResult.duration} ms, size: ${proof.proof.length} fields`);
190
- emitCircuitProvingStats(circuitTypeToCircuitName(circuitType), provingResult.duration, witnessMap.size * Fr.SIZE_IN_BYTES, outputWitness.size * Fr.SIZE_IN_BYTES, proof.binaryProof.buffer.length, logger);
191
- return [outputType, proof];
204
+ const proof = await this.readProofAsFields(provingResult.proofPath, circuitType, proofLength);
205
+ logger.info(`Generated proof for ${circuitType} in ${provingResult.duration} ms, size: ${proof.proof.length} fields`, {
206
+ circuitName: mapProtocolArtifactNameToCircuitName(circuitType),
207
+ circuitSize: vkData.circuitSize,
208
+ duration: provingResult.duration,
209
+ inputSize,
210
+ outputSize,
211
+ proofSize: proof.binaryProof.buffer.length,
212
+ eventName: 'circuit-proving',
213
+ numPublicInputs: vkData.numPublicInputs,
214
+ });
215
+ return [output, proof];
192
216
  }
193
217
  finally {
194
218
  await fs.rm(bbWorkingDirectory, { recursive: true, force: true });
@@ -290,7 +314,7 @@ export class BBNativeRollupProver {
290
314
  promise = this.convertVk(filePath);
291
315
  this.verificationKeys.set(circuitType, promise);
292
316
  }
293
- await promise;
317
+ return promise;
294
318
  }
295
319
  /**
296
320
  * Parses and returns the proof data stored at the specified directory
@@ -298,7 +322,7 @@ export class BBNativeRollupProver {
298
322
  * @param circuitType - The type of circuit proven
299
323
  * @returns The proof
300
324
  */
301
- async readProofAsFields(filePath, circuitType) {
325
+ async readProofAsFields(filePath, circuitType, proofLength) {
302
326
  const [binaryProof, proofString] = await Promise.all([
303
327
  fs.readFile(`${filePath}/${PROOF_FILENAME}`),
304
328
  fs.readFile(`${filePath}/${PROOF_FIELDS_FILENAME}`, { encoding: 'utf-8' }),
@@ -315,7 +339,10 @@ export class BBNativeRollupProver {
315
339
  const fieldsWithoutPublicInputs = fields.slice(numPublicInputs);
316
340
  logger.debug(`Circuit type: ${circuitType}, complete proof length: ${fields.length}, without public inputs: ${fieldsWithoutPublicInputs.length}, num public inputs: ${numPublicInputs}, circuit size: ${vkData.circuitSize}, is recursive: ${vkData.isRecursive}, raw length: ${binaryProof.length}`);
317
341
  const proof = new RecursiveProof(fieldsWithoutPublicInputs, new Proof(binaryProof));
342
+ if (proof.proof.length !== proofLength) {
343
+ throw new Error("Proof length doesn't match expected length");
344
+ }
318
345
  return proof;
319
346
  }
320
347
  }
321
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmJfcHJvdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Byb3Zlci9iYl9wcm92ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0NBQWtDO0FBQ2xDLE9BQU8sRUFJTCxnQkFBZ0IsRUFFaEIsd0JBQXdCLEdBQ3pCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUlMLEVBQUUsRUFNRixLQUFLLEVBR0wsY0FBYyxFQUNkLFdBQVcsRUFDWCxlQUFlLEVBS2YsdUJBQXVCLEdBQ3hCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRCxPQUFPLEVBQ0wsc0JBQXNCLEVBRXRCLG1DQUFtQyxFQUNuQyxzQ0FBc0MsRUFDdEMsbUNBQW1DLEVBQ25DLHNDQUFzQyxFQUN0QyxvQ0FBb0MsRUFDcEMsdUNBQXVDLEVBQ3ZDLG1DQUFtQyxFQUNuQyxxQ0FBcUMsRUFDckMsbUNBQW1DLEVBQ25DLHNDQUFzQyxFQUN0QyxtQ0FBbUMsRUFDbkMsc0NBQXNDLEdBQ3ZDLE1BQU0scUNBQXFDLENBQUM7QUFDN0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFHdkQsT0FBTyxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFbEMsT0FBTyxFQUNMLFNBQVMsRUFDVCxxQkFBcUIsRUFDckIsY0FBYyxFQUNkLGtCQUFrQixFQUNsQixXQUFXLEVBQ1gseUJBQXlCLEVBQ3pCLGFBQWEsRUFDYixXQUFXLEdBQ1osTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsdUJBQXVCLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbkgsT0FBTyxFQUNMLHVCQUF1QixFQUN2QiwyQkFBMkIsRUFDM0IsdUJBQXVCLEVBQ3ZCLGtCQUFrQixHQUVuQixNQUFNLDRCQUE0QixDQUFDO0FBRXBDLE1BQU0sTUFBTSxHQUFHLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFFcEQsTUFBTSw0QkFBNEIsR0FBZ0MsSUFBSSxHQUFHLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7QUFXbEc7O0dBRUc7QUFDSCxNQUFNLE9BQU8sb0JBQW9CO0lBSy9CLFlBQW9CLE1BQXNCO1FBQXRCLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBSmxDLHFCQUFnQixHQUE4RCxJQUFJLEdBQUcsRUFHMUYsQ0FBQztJQUN5QyxDQUFDO0lBRTlDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQXNCO1FBQ3JDLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUQsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEQsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLE1BQU0sQ0FBQyxZQUFZLDBCQUEwQixNQUFNLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1FBQzVHLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLE1BQU0sQ0FBQyxjQUFjLDBCQUEwQixNQUFNLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO1FBRWxILE9BQU8sSUFBSSxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxNQUF3QjtRQUN0RCxNQUFNLFVBQVUsR0FBRyxtQ0FBbUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUUvRCxNQUFNLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUM1RCxVQUFVLEVBQ1Ysb0JBQW9CLEVBQ3BCLHNDQUFzQyxDQUN2QyxDQUFDO1FBRUYsTUFBTSxlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0NBQWdDLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUUxRixNQUFNLEVBQUUsR0FBRyxJQUFJLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTFGLE9BQU8sSUFBSSxlQUFlLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxrQkFBa0IsQ0FDN0IsTUFBd0I7UUFFeEIsTUFBTSxVQUFVLEdBQUcsbUNBQW1DLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFL0QsTUFBTSxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FHNUQsVUFBVSxFQUFFLG9CQUFvQixFQUFFLHNDQUFzQyxDQUFDLENBQUM7UUFFNUUsTUFBTSxlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0NBQWdDLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUUxRixNQUFNLEVBQUUsR0FBRyxJQUFJLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTFGLE9BQU8sSUFBSSxlQUFlLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxvQkFBb0IsQ0FDL0IsYUFBeUM7UUFFekMsTUFBTSxTQUFTLEdBQUcsMkJBQTJCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xFLElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekYsQ0FBQztRQUNELE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWpFLE1BQU0sQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFdEYsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN2RCxPQUFPLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxrQkFBa0IsQ0FDN0IsYUFBc0M7UUFFdEMsTUFBTSxVQUFVLEdBQUcsbUNBQW1DLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTdFLE1BQU0sQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO1FBRTlGLE1BQU0sTUFBTSxHQUFHLHFDQUFxQyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3BFLE9BQU8sd0JBQXdCLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksS0FBSyxDQUFDLGtCQUFrQixDQUM3QixLQUF1QjtRQUV2QixNQUFNLFVBQVUsR0FBRyxtQ0FBbUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU5RCxNQUFNLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztRQUV4RixNQUFNLE1BQU0sR0FBRyxzQ0FBc0MsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUVyRSxPQUFPLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxtQkFBbUIsQ0FDOUIsS0FBd0I7UUFFeEIscUJBQXFCO1FBQ3JCLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU5RixNQUFNLFVBQVUsR0FBRyxvQ0FBb0MsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUvRCxNQUFNLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUV6RixNQUFNLE1BQU0sR0FBRyx1Q0FBdUMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUV0RSxPQUFPLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxLQUF1QjtRQUNyRCxvQkFBb0I7UUFDcEIsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTlGLE1BQU0sVUFBVSxHQUFHLG1DQUFtQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTlELE1BQU0sQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBRXhGLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVwRCxNQUFNLE1BQU0sR0FBRyxzQ0FBc0MsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNyRSxPQUFPLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsb0RBQW9EO0lBQzdDLEtBQUssQ0FBQyxXQUFXLENBQUMsVUFBc0IsRUFBRSxXQUFtQztRQUNsRixvREFBb0Q7UUFDcEQsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2pHLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRXhELE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBRXBDLCtDQUErQztRQUMvQyxNQUFNLGlCQUFpQixHQUFHLEdBQUcsa0JBQWtCLHFCQUFxQixDQUFDO1FBRXJFLDhDQUE4QztRQUM5QyxnSkFBZ0o7UUFDaEosTUFBTSxTQUFTLEdBQUcsSUFBSSxtQkFBbUIsQ0FDdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsRUFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQzFCLGlCQUFpQixDQUNsQixDQUFDO1FBRUYsTUFBTSxRQUFRLEdBQUcsc0JBQXNCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFckQsTUFBTSxDQUFDLEtBQUssQ0FBQywrQkFBK0IsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUUzRCxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQzFCLE1BQU0sYUFBYSxHQUFHLE1BQU0sU0FBUyxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDNUUsaUNBQWlDLENBQy9CLHdCQUF3QixDQUFDLFdBQVcsQ0FBQyxFQUNyQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQ1YsVUFBVSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsYUFBYSxFQUNsQyxhQUFhLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxhQUFhLEVBQ3JDLE1BQU0sQ0FDUCxDQUFDO1FBRUYsbURBQW1EO1FBQ25ELE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxXQUFXLEtBQUssQ0FBQyxDQUFDO1FBRTFDLE1BQU0sYUFBYSxHQUFHLE1BQU0sYUFBYSxDQUN2QyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFDeEIsa0JBQWtCLEVBQ2xCLFdBQVcsRUFDWCxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLEVBQ3hDLGlCQUFpQixFQUNqQixNQUFNLENBQUMsS0FBSyxDQUNiLENBQUM7UUFFRixJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQy9DLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLFdBQVcsS0FBSyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUNyRixNQUFNLElBQUksS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBRUQsb0NBQW9DO1FBQ3BDLE1BQU0sSUFBSSxDQUFDLCtCQUErQixDQUFDLGFBQWEsQ0FBQyxNQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFL0UsNkRBQTZEO1FBQzdELE1BQU0sS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxTQUFVLElBQUksY0FBYyxFQUFFLENBQUMsQ0FBQztRQUVqRixnR0FBZ0c7UUFDaEcsdUJBQXVCLENBQ3JCLHdCQUF3QixDQUFDLFdBQVcsQ0FBQyxFQUNyQyxhQUFhLENBQUMsUUFBUSxFQUN0QixVQUFVLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxhQUFhLEVBQ2xDLGFBQWEsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLGFBQWEsRUFDckMsS0FBSyxDQUFDLE1BQU0sRUFDWixNQUFNLENBQ1AsQ0FBQztRQUVGLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFbEUsTUFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsV0FBVyxPQUFPLGFBQWEsQ0FBQyxRQUFRLGNBQWMsS0FBSyxDQUFDLE1BQU0sU0FBUyxDQUFDLENBQUM7UUFFaEgsT0FBTyxDQUFDLGFBQWEsRUFBRSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxLQUFLLENBQUMsb0JBQW9CLENBQy9CLFVBQXNCLEVBQ3RCLFdBQW1DLEVBQ25DLGFBQStEO1FBRS9ELG9EQUFvRDtRQUNwRCxNQUFNLGtCQUFrQixHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDakcsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLGtCQUFrQixFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFeEQsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFFcEMsSUFBSSxDQUFDO1lBQ0gsK0NBQStDO1lBQy9DLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxrQkFBa0IscUJBQXFCLENBQUM7WUFFckUsOENBQThDO1lBQzlDLGdKQUFnSjtZQUNoSixNQUFNLFNBQVMsR0FBRyxJQUFJLG1CQUFtQixDQUN2QyxJQUFJLENBQUMsTUFBTSxDQUFDLG9CQUFvQixFQUNoQyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFDMUIsaUJBQWlCLENBQ2xCLENBQUM7WUFFRixNQUFNLFFBQVEsR0FBRyxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUVyRCxNQUFNLENBQUMsS0FBSyxDQUFDLCtCQUErQixXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBRTNELE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7WUFDMUIsTUFBTSxhQUFhLEdBQUcsTUFBTSxTQUFTLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUU1RSxpQ0FBaUMsQ0FDL0Isd0JBQXdCLENBQUMsV0FBVyxDQUFDLEVBQ3JDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFDVixVQUFVLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxhQUFhLEVBQ2xDLGFBQWEsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLGFBQWEsRUFDckMsTUFBTSxDQUNQLENBQUM7WUFFRixNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7WUFFaEQsbURBQW1EO1lBQ25ELE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxXQUFXLEtBQUssQ0FBQyxDQUFDO1lBRTFDLE1BQU0sYUFBYSxHQUFHLE1BQU0sYUFBYSxDQUN2QyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFDeEIsa0JBQWtCLEVBQ2xCLFdBQVcsRUFDWCxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLEVBQ3hDLGlCQUFpQixFQUNqQixNQUFNLENBQUMsS0FBSyxDQUNiLENBQUM7WUFFRixJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUMvQyxNQUFNLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxXQUFXLEtBQUssYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7Z0JBQ3JGLE1BQU0sSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hDLENBQUM7WUFFRCxvQ0FBb0M7WUFDcEMsTUFBTSxJQUFJLENBQUMsK0JBQStCLENBQUMsYUFBYSxDQUFDLE1BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztZQUUvRSw2REFBNkQ7WUFDN0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQWUsYUFBYSxDQUFDLFNBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUVoRyxNQUFNLENBQUMsSUFBSSxDQUNULHVCQUF1QixXQUFXLE9BQU8sYUFBYSxDQUFDLFFBQVEsY0FBYyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sU0FBUyxDQUN6RyxDQUFDO1lBRUYsdUJBQXVCLENBQ3JCLHdCQUF3QixDQUFDLFdBQVcsQ0FBQyxFQUNyQyxhQUFhLENBQUMsUUFBUSxFQUN0QixVQUFVLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxhQUFhLEVBQ2xDLGFBQWEsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLGFBQWEsRUFDckMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUMvQixNQUFNLENBQ1AsQ0FBQztZQUVGLE9BQU8sQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDN0IsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNwRSxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsV0FBVyxDQUFDLFdBQW1DLEVBQUUsS0FBWTtRQUN4RSxvREFBb0Q7UUFDcEQsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2pHLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRXhELE1BQU0sYUFBYSxHQUFHLEdBQUcsa0JBQWtCLFFBQVEsQ0FBQztRQUNwRCxNQUFNLG1CQUFtQixHQUFHLEdBQUcsa0JBQWtCLEtBQUssQ0FBQztRQUN2RCxNQUFNLGVBQWUsR0FBRyxNQUFNLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVqRixNQUFNLENBQUMsS0FBSyxDQUFDLHVCQUF1QixlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUV2RSxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoRCxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLEVBQUUsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRXBFLE1BQU0sV0FBVyxHQUFHLENBQUMsT0FBZSxFQUFFLEVBQUU7WUFDdEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLFdBQVcsYUFBYSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3JELENBQUMsQ0FBQztRQUVGLE1BQU0sTUFBTSxHQUFHLE1BQU0sV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxtQkFBb0IsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUU3RyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRWxFLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDeEMsTUFBTSxZQUFZLEdBQUcsb0JBQW9CLFdBQVcsU0FBUyxDQUFDO1lBQzlELE1BQU0sSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMseUJBQXlCLFdBQVcsYUFBYSxNQUFNLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxXQUFtQztRQUMzRSxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN4RSxPQUFPLElBQUksdUJBQXVCLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVPLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxrQkFBc0M7UUFDNUUsTUFBTSxLQUFLLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxDQUFDO1FBQ3ZDLE1BQU0sV0FBVyxHQUNmLGtCQUFrQixDQUFDLDZCQUE2QixDQUFDLFVBQVUsS0FBSyxXQUFXLENBQUMsSUFBSTtZQUM5RSxDQUFDLENBQUMsb0JBQW9CO1lBQ3RCLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQztRQUM1QixNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssS0FBSyxDQUFDLGdDQUFnQyxDQUFDLFdBQW1DO1FBQ2hGLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsT0FBTyxHQUFHLHlCQUF5QixDQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsRUFDOUIsV0FBVyxFQUNYLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxFQUNuQyxJQUFJLEVBQ0osTUFBTSxDQUFDLEtBQUssQ0FDYixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDZCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUN4QyxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxXQUFXLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7Z0JBQzlGLENBQUM7Z0JBQ0QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFPLENBQUMsQ0FBQztZQUN4QyxDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2xELENBQUM7UUFDRCxPQUFPLE1BQU0sT0FBTyxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFnQjtRQUN0QyxNQUFNLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUMvQyxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsUUFBUSxJQUFJLGtCQUFrQixFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDdkUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFFBQVEsSUFBSSxXQUFXLEVBQUUsQ0FBQztTQUMxQyxDQUFDLENBQUM7UUFDSCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzdDLGdFQUFnRTtRQUNoRSxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQyxNQUFNLEVBQUUsR0FBd0I7WUFDOUIsSUFBSSxFQUFFLE1BQU07WUFDWixXQUFXLEVBQUUsUUFBK0Q7WUFDNUUsVUFBVSxFQUFFLFNBQVM7WUFDckIsZUFBZSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsMkJBQTJCLENBQUMsQ0FBQztZQUM5RCxXQUFXLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ2pELFdBQVcsRUFBRSxRQUFRLENBQUMsdUJBQXVCLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRztTQUN6RCxDQUFDO1FBQ0YsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxRQUFnQixFQUFFLFdBQW1DO1FBQ2pHLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbkMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDbEQsQ0FBQztRQUNELE1BQU0sT0FBTyxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLEtBQUssQ0FBQyxpQkFBaUIsQ0FDN0IsUUFBZ0IsRUFDaEIsV0FBbUM7UUFFbkMsTUFBTSxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDbkQsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFFBQVEsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUM1QyxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsUUFBUSxJQUFJLHFCQUFxQixFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUM7U0FDM0UsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNyQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN2QyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBQ0QsTUFBTSxlQUFlLEdBQUcsNEJBQTRCLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQztZQUNuRSxDQUFDLENBQUMsTUFBTSxDQUFDLGVBQWU7WUFDeEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxlQUFlLEdBQUcsdUJBQXVCLENBQUM7UUFDckQsTUFBTSx5QkFBeUIsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sQ0FBQyxLQUFLLENBQ1YsaUJBQWlCLFdBQVcsNEJBQTRCLE1BQU0sQ0FBQyxNQUFNLDRCQUE0Qix5QkFBeUIsQ0FBQyxNQUFNLHdCQUF3QixlQUFlLG1CQUFtQixNQUFNLENBQUMsV0FBVyxtQkFBbUIsTUFBTSxDQUFDLFdBQVcsaUJBQWlCLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FDeFIsQ0FBQztRQUNGLE1BQU0sS0FBSyxHQUFHLElBQUksY0FBYyxDQUFlLHlCQUF5QixFQUFFLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDbEcsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0NBQ0YifQ==
348
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmJfcHJvdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Byb3Zlci9iYl9wcm92ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0NBQWtDO0FBQ2xDLE9BQU8sRUFJTCxnQkFBZ0IsRUFFaEIsd0JBQXdCLEdBQ3pCLE1BQU0sc0JBQXNCLENBQUM7QUFFOUIsT0FBTyxFQUlMLEVBQUUsRUFHRiw2QkFBNkIsRUFFN0IsS0FBSyxFQUVMLHNCQUFzQixFQUN0QixjQUFjLEVBQ2QsV0FBVyxFQUNYLGVBQWUsRUFLZix1QkFBdUIsR0FDeEIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFMUQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2hELE9BQU8sRUFDTCxzQkFBc0IsRUFFdEIsbUNBQW1DLEVBQ25DLHNDQUFzQyxFQUN0QyxtQ0FBbUMsRUFDbkMsc0NBQXNDLEVBQ3RDLG9DQUFvQyxFQUNwQyx1Q0FBdUMsRUFDdkMsbUNBQW1DLEVBQ25DLHFDQUFxQyxFQUNyQyxtQ0FBbUMsRUFDbkMsc0NBQXNDLEVBQ3RDLG1DQUFtQyxFQUNuQyxzQ0FBc0MsR0FDdkMsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUd2RCxPQUFPLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVsQyxPQUFPLEVBQ0wsU0FBUyxFQUNULHFCQUFxQixFQUNyQixjQUFjLEVBQ2Qsa0JBQWtCLEVBQ2xCLFdBQVcsRUFDWCx5QkFBeUIsRUFDekIsYUFBYSxFQUNiLFdBQVcsR0FDWixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RFLE9B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
package/dest/stats.d.ts CHANGED
@@ -1,9 +1,6 @@
1
1
  import { type PublicKernelRequest } from '@aztec/circuit-types';
2
2
  import type { CircuitName } from '@aztec/circuit-types/stats';
3
- import { type Logger } from '@aztec/foundation/log';
4
- import { type ServerProtocolArtifact } from '@aztec/noir-protocol-circuits-types';
5
- export declare function emitCircuitWitnessGenerationStats(circuitName: CircuitName, duration: number, inputSize: number, outputSize: number, logger: Logger): void;
6
- export declare function emitCircuitProvingStats(circuitName: CircuitName, duration: number, inputSize: number, outputSize: number, proofSize: number, logger: Logger): void;
3
+ import { type ClientProtocolArtifact, type ServerProtocolArtifact } from '@aztec/noir-protocol-circuits-types';
7
4
  export declare function mapPublicKernelToCircuitName(kernelType: PublicKernelRequest['type']): CircuitName;
8
- export declare function circuitTypeToCircuitName(circuitType: ServerProtocolArtifact): CircuitName;
5
+ export declare function mapProtocolArtifactNameToCircuitName(artifact: ServerProtocolArtifact | ClientProtocolArtifact): CircuitName;
9
6
  //# sourceMappingURL=stats.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../src/stats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAoB,MAAM,sBAAsB,CAAC;AAClF,OAAO,KAAK,EAAE,WAAW,EAAsD,MAAM,4BAA4B,CAAC;AAClH,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAElF,wBAAgB,iCAAiC,CAC/C,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,QAWf;AAED,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,QAYf;AAED,wBAAgB,4BAA4B,CAAC,UAAU,EAAE,mBAAmB,CAAC,MAAM,CAAC,GAAG,WAAW,CAajG;AAED,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,sBAAsB,GAAG,WAAW,CAuBzF"}
1
+ {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../src/stats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAoB,MAAM,sBAAsB,CAAC;AAClF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,KAAK,sBAAsB,EAAE,KAAK,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAE/G,wBAAgB,4BAA4B,CAAC,UAAU,EAAE,mBAAmB,CAAC,MAAM,CAAC,GAAG,WAAW,CAajG;AAED,wBAAgB,oCAAoC,CAClD,QAAQ,EAAE,sBAAsB,GAAG,sBAAsB,GACxD,WAAW,CAuCb"}
package/dest/stats.js CHANGED
@@ -1,25 +1,4 @@
1
1
  import { PublicKernelType } from '@aztec/circuit-types';
2
- export function emitCircuitWitnessGenerationStats(circuitName, duration, inputSize, outputSize, logger) {
3
- const stats = {
4
- eventName: 'circuit-witness-generation',
5
- circuitName,
6
- inputSize,
7
- outputSize,
8
- duration,
9
- };
10
- logger.debug('Circuit witness generation stats', stats);
11
- }
12
- export function emitCircuitProvingStats(circuitName, duration, inputSize, outputSize, proofSize, logger) {
13
- const stats = {
14
- eventName: 'circuit-proving',
15
- circuitName,
16
- duration,
17
- inputSize,
18
- outputSize,
19
- proofSize,
20
- };
21
- logger.debug('Circuit proving stats', stats);
22
- }
23
2
  export function mapPublicKernelToCircuitName(kernelType) {
24
3
  switch (kernelType) {
25
4
  case PublicKernelType.SETUP:
@@ -34,8 +13,8 @@ export function mapPublicKernelToCircuitName(kernelType) {
34
13
  throw new Error(`Unknown kernel type: ${kernelType}`);
35
14
  }
36
15
  }
37
- export function circuitTypeToCircuitName(circuitType) {
38
- switch (circuitType) {
16
+ export function mapProtocolArtifactNameToCircuitName(artifact) {
17
+ switch (artifact) {
39
18
  case 'BaseParityArtifact':
40
19
  return 'base-parity';
41
20
  case 'RootParityArtifact':
@@ -54,8 +33,24 @@ export function circuitTypeToCircuitName(circuitType) {
54
33
  return 'public-kernel-teardown';
55
34
  case 'PublicKernelTailArtifact':
56
35
  return 'public-kernel-tail';
36
+ case 'PrivateKernelInitArtifact':
37
+ return 'private-kernel-init';
38
+ case 'PrivateKernelInnerArtifact':
39
+ return 'private-kernel-inner';
40
+ case 'PrivateKernelTailArtifact':
41
+ return 'private-kernel-tail';
42
+ case 'PrivateKernelTailToPublicArtifact':
43
+ return 'private-kernel-tail-to-public';
44
+ case 'PrivateKernelResetFullArtifact':
45
+ return 'private-kernel-reset-full';
46
+ case 'PrivateKernelResetBigArtifact':
47
+ return 'private-kernel-reset-big';
48
+ case 'PrivateKernelResetMediumArtifact':
49
+ return 'private-kernel-reset-medium';
50
+ case 'PrivateKernelResetSmallArtifact':
51
+ return 'private-kernel-reset-small';
57
52
  default:
58
- throw new Error(`Unknown circuit type: ${circuitType}`);
53
+ throw new Error(`Unknown circuit type: ${artifact}`);
59
54
  }
60
55
  }
61
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3RhdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUE0QixnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBS2xGLE1BQU0sVUFBVSxpQ0FBaUMsQ0FDL0MsV0FBd0IsRUFDeEIsUUFBZ0IsRUFDaEIsU0FBaUIsRUFDakIsVUFBa0IsRUFDbEIsTUFBYztJQUVkLE1BQU0sS0FBSyxHQUFrQztRQUMzQyxTQUFTLEVBQUUsNEJBQTRCO1FBQ3ZDLFdBQVc7UUFDWCxTQUFTO1FBQ1QsVUFBVTtRQUNWLFFBQVE7S0FDVCxDQUFDO0lBRUYsTUFBTSxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBRUQsTUFBTSxVQUFVLHVCQUF1QixDQUNyQyxXQUF3QixFQUN4QixRQUFnQixFQUNoQixTQUFpQixFQUNqQixVQUFrQixFQUNsQixTQUFpQixFQUNqQixNQUFjO0lBRWQsTUFBTSxLQUFLLEdBQXdCO1FBQ2pDLFNBQVMsRUFBRSxpQkFBaUI7UUFDNUIsV0FBVztRQUNYLFFBQVE7UUFDUixTQUFTO1FBQ1QsVUFBVTtRQUNWLFNBQVM7S0FDVixDQUFDO0lBRUYsTUFBTSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBRUQsTUFBTSxVQUFVLDRCQUE0QixDQUFDLFVBQXVDO0lBQ2xGLFFBQVEsVUFBVSxFQUFFLENBQUM7UUFDbkIsS0FBSyxnQkFBZ0IsQ0FBQyxLQUFLO1lBQ3pCLE9BQU8scUJBQXFCLENBQUM7UUFDL0IsS0FBSyxnQkFBZ0IsQ0FBQyxTQUFTO1lBQzdCLE9BQU8seUJBQXlCLENBQUM7UUFDbkMsS0FBSyxnQkFBZ0IsQ0FBQyxRQUFRO1lBQzVCLE9BQU8sd0JBQXdCLENBQUM7UUFDbEMsS0FBSyxnQkFBZ0IsQ0FBQyxJQUFJO1lBQ3hCLE9BQU8sb0JBQW9CLENBQUM7UUFDOUI7WUFDRSxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQzFELENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLHdCQUF3QixDQUFDLFdBQW1DO0lBQzFFLFFBQVEsV0FBVyxFQUFFLENBQUM7UUFDcEIsS0FBSyxvQkFBb0I7WUFDdkIsT0FBTyxhQUFhLENBQUM7UUFDdkIsS0FBSyxvQkFBb0I7WUFDdkIsT0FBTyxhQUFhLENBQUM7UUFDdkIsS0FBSyxvQkFBb0I7WUFDdkIsT0FBTyxhQUFhLENBQUM7UUFDdkIsS0FBSyxxQkFBcUI7WUFDeEIsT0FBTyxjQUFjLENBQUM7UUFDeEIsS0FBSyxvQkFBb0I7WUFDdkIsT0FBTyxhQUFhLENBQUM7UUFDdkIsS0FBSywyQkFBMkI7WUFDOUIsT0FBTyxxQkFBcUIsQ0FBQztRQUMvQixLQUFLLDhCQUE4QjtZQUNqQyxPQUFPLHlCQUF5QixDQUFDO1FBQ25DLEtBQUssOEJBQThCO1lBQ2pDLE9BQU8sd0JBQXdCLENBQUM7UUFDbEMsS0FBSywwQkFBMEI7WUFDN0IsT0FBTyxvQkFBb0IsQ0FBQztRQUM5QjtZQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDNUQsQ0FBQztBQUNILENBQUMifQ==
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3RhdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUE0QixnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBSWxGLE1BQU0sVUFBVSw0QkFBNEIsQ0FBQyxVQUF1QztJQUNsRixRQUFRLFVBQVUsRUFBRSxDQUFDO1FBQ25CLEtBQUssZ0JBQWdCLENBQUMsS0FBSztZQUN6QixPQUFPLHFCQUFxQixDQUFDO1FBQy9CLEtBQUssZ0JBQWdCLENBQUMsU0FBUztZQUM3QixPQUFPLHlCQUF5QixDQUFDO1FBQ25DLEtBQUssZ0JBQWdCLENBQUMsUUFBUTtZQUM1QixPQUFPLHdCQUF3QixDQUFDO1FBQ2xDLEtBQUssZ0JBQWdCLENBQUMsSUFBSTtZQUN4QixPQUFPLG9CQUFvQixDQUFDO1FBQzlCO1lBQ0UsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUMxRCxDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxvQ0FBb0MsQ0FDbEQsUUFBeUQ7SUFFekQsUUFBUSxRQUFRLEVBQUUsQ0FBQztRQUNqQixLQUFLLG9CQUFvQjtZQUN2QixPQUFPLGFBQWEsQ0FBQztRQUN2QixLQUFLLG9CQUFvQjtZQUN2QixPQUFPLGFBQWEsQ0FBQztRQUN2QixLQUFLLG9CQUFvQjtZQUN2QixPQUFPLGFBQWEsQ0FBQztRQUN2QixLQUFLLHFCQUFxQjtZQUN4QixPQUFPLGNBQWMsQ0FBQztRQUN4QixLQUFLLG9CQUFvQjtZQUN2QixPQUFPLGFBQWEsQ0FBQztRQUN2QixLQUFLLDJCQUEyQjtZQUM5QixPQUFPLHFCQUFxQixDQUFDO1FBQy9CLEtBQUssOEJBQThCO1lBQ2pDLE9BQU8seUJBQXlCLENBQUM7UUFDbkMsS0FBSyw4QkFBOEI7WUFDakMsT0FBTyx3QkFBd0IsQ0FBQztRQUNsQyxLQUFLLDBCQUEwQjtZQUM3QixPQUFPLG9CQUFvQixDQUFDO1FBQzlCLEtBQUssMkJBQTJCO1lBQzlCLE9BQU8scUJBQXFCLENBQUM7UUFDL0IsS0FBSyw0QkFBNEI7WUFDL0IsT0FBTyxzQkFBc0IsQ0FBQztRQUNoQyxLQUFLLDJCQUEyQjtZQUM5QixPQUFPLHFCQUFxQixDQUFDO1FBQy9CLEtBQUssbUNBQW1DO1lBQ3RDLE9BQU8sK0JBQStCLENBQUM7UUFDekMsS0FBSyxnQ0FBZ0M7WUFDbkMsT0FBTywyQkFBMkIsQ0FBQztRQUNyQyxLQUFLLCtCQUErQjtZQUNsQyxPQUFPLDBCQUEwQixDQUFDO1FBQ3BDLEtBQUssa0NBQWtDO1lBQ3JDLE9BQU8sNkJBQTZCLENBQUM7UUFDdkMsS0FBSyxpQ0FBaUM7WUFDcEMsT0FBTyw0QkFBNEIsQ0FBQztRQUN0QztZQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDekQsQ0FBQztBQUNILENBQUMifQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/bb-prover",
3
- "version": "0.40.0",
3
+ "version": "0.41.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./dest/index.js"
@@ -51,11 +51,11 @@
51
51
  ]
52
52
  },
53
53
  "dependencies": {
54
- "@aztec/circuit-types": "0.40.0",
55
- "@aztec/circuits.js": "0.40.0",
56
- "@aztec/foundation": "0.40.0",
57
- "@aztec/noir-protocol-circuits-types": "0.40.0",
58
- "@aztec/simulator": "0.40.0",
54
+ "@aztec/circuit-types": "0.41.0",
55
+ "@aztec/circuits.js": "0.41.0",
56
+ "@aztec/foundation": "0.41.0",
57
+ "@aztec/noir-protocol-circuits-types": "0.41.0",
58
+ "@aztec/simulator": "0.41.0",
59
59
  "@noir-lang/noirc_abi": "portal:../../noir/packages/noirc_abi",
60
60
  "@noir-lang/types": "portal:../../noir/packages/types",
61
61
  "commander": "^9.0.0",
package/src/bb/execute.ts CHANGED
@@ -32,6 +32,12 @@ export type BBFailure = {
32
32
 
33
33
  export type BBResult = BBSuccess | BBFailure;
34
34
 
35
+ type BBExecResult = {
36
+ status: BB_RESULT;
37
+ exitCode: number;
38
+ signal: string | undefined;
39
+ };
40
+
35
41
  /**
36
42
  * Invokes the Barretenberg binary with the provided command and args
37
43
  * @param pathToBB - The path to the BB binary
@@ -47,26 +53,20 @@ export function executeBB(
47
53
  args: string[],
48
54
  logger: LogFn,
49
55
  resultParser = (code: number) => code === 0,
50
- ) {
51
- return new Promise<BB_RESULT.SUCCESS | BB_RESULT.FAILURE>((resolve, reject) => {
56
+ ): Promise<BBExecResult> {
57
+ return new Promise<BBExecResult>(resolve => {
52
58
  // spawn the bb process
53
- const bb = proc.spawn(pathToBB, [command, ...args]);
54
- bb.stdout.on('data', data => {
55
- const message = data.toString('utf-8').replace(/\n$/, '');
56
- logger(message);
59
+ const bb = proc.spawn(pathToBB, [command, ...args], {
60
+ stdio: 'pipe',
57
61
  });
58
- bb.stderr.on('data', data => {
59
- const message = data.toString('utf-8').replace(/\n$/, '');
60
- logger(message);
61
- });
62
- bb.on('close', (code: number) => {
63
- if (resultParser(code)) {
64
- resolve(BB_RESULT.SUCCESS);
62
+ bb.on('close', (exitCode: number, signal?: string) => {
63
+ if (resultParser(exitCode)) {
64
+ resolve({ status: BB_RESULT.SUCCESS, exitCode, signal });
65
65
  } else {
66
- reject();
66
+ resolve({ status: BB_RESULT.FAILURE, exitCode, signal });
67
67
  }
68
68
  });
69
- }).catch(_ => BB_RESULT.FAILURE);
69
+ }).catch(_ => ({ status: BB_RESULT.FAILURE, exitCode: -1, signal: undefined }));
70
70
  }
71
71
 
72
72
  const bytecodeHashFilename = 'bytecode_hash';
@@ -154,14 +154,14 @@ export async function generateKeyForNoirCircuit(
154
154
  const timer = new Timer();
155
155
  let result = await executeBB(pathToBB, `write_${key}`, args, log);
156
156
  // If we succeeded and the type of key if verification, have bb write the 'fields' version too
157
- if (result == BB_RESULT.SUCCESS && key === 'vk') {
157
+ if (result.status == BB_RESULT.SUCCESS && key === 'vk') {
158
158
  const asFieldsArgs = ['-k', `${outputPath}/${VK_FILENAME}`, '-o', `${outputPath}/${VK_FIELDS_FILENAME}`, '-v'];
159
159
  result = await executeBB(pathToBB, `vk_as_fields`, asFieldsArgs, log);
160
160
  }
161
161
  const duration = timer.ms();
162
162
  // Cleanup the bytecode file
163
163
  await fs.rm(bytecodePath, { force: true });
164
- if (result == BB_RESULT.SUCCESS) {
164
+ if (result.status == BB_RESULT.SUCCESS) {
165
165
  // Store the bytecode hash so we don't need to regenerate at a later time
166
166
  await fs.writeFile(bytecodeHashPath, bytecodeHash);
167
167
  return {
@@ -173,7 +173,10 @@ export async function generateKeyForNoirCircuit(
173
173
  };
174
174
  }
175
175
  // Not a great error message here but it is difficult to decipher what comes from bb
176
- return { status: BB_RESULT.FAILURE, reason: `Failed to generate key` };
176
+ return {
177
+ status: BB_RESULT.FAILURE,
178
+ reason: `Failed to generate key. Exit code: ${result.exitCode}. Signal ${result.signal}.`,
179
+ };
177
180
  } catch (error) {
178
181
  return { status: BB_RESULT.FAILURE, reason: `${error}` };
179
182
  }
@@ -231,7 +234,7 @@ export async function generateProof(
231
234
  const duration = timer.ms();
232
235
  // cleanup the bytecode
233
236
  await fs.rm(bytecodePath, { force: true });
234
- if (result == BB_RESULT.SUCCESS) {
237
+ if (result.status == BB_RESULT.SUCCESS) {
235
238
  return {
236
239
  status: BB_RESULT.SUCCESS,
237
240
  duration,
@@ -241,7 +244,10 @@ export async function generateProof(
241
244
  };
242
245
  }
243
246
  // Not a great error message here but it is difficult to decipher what comes from bb
244
- return { status: BB_RESULT.FAILURE, reason: `Failed to generate proof` };
247
+ return {
248
+ status: BB_RESULT.FAILURE,
249
+ reason: `Failed to generate proof. Exit code ${result.exitCode}. Signal ${result.signal}.`,
250
+ };
245
251
  } catch (error) {
246
252
  return { status: BB_RESULT.FAILURE, reason: `${error}` };
247
253
  }
@@ -274,11 +280,14 @@ export async function verifyProof(
274
280
  const timer = new Timer();
275
281
  const result = await executeBB(pathToBB, 'verify', args, log);
276
282
  const duration = timer.ms();
277
- if (result == BB_RESULT.SUCCESS) {
283
+ if (result.status == BB_RESULT.SUCCESS) {
278
284
  return { status: BB_RESULT.SUCCESS, duration };
279
285
  }
280
286
  // Not a great error message here but it is difficult to decipher what comes from bb
281
- return { status: BB_RESULT.FAILURE, reason: `Failed to verify proof` };
287
+ return {
288
+ status: BB_RESULT.FAILURE,
289
+ reason: `Failed to verify proof. Exit code ${result.exitCode}. Signal ${result.signal}.`,
290
+ };
282
291
  } catch (error) {
283
292
  return { status: BB_RESULT.FAILURE, reason: `${error}` };
284
293
  }
@@ -311,11 +320,14 @@ export async function writeVkAsFields(
311
320
  const timer = new Timer();
312
321
  const result = await executeBB(pathToBB, 'vk_as_fields', args, log);
313
322
  const duration = timer.ms();
314
- if (result == BB_RESULT.SUCCESS) {
323
+ if (result.status == BB_RESULT.SUCCESS) {
315
324
  return { status: BB_RESULT.SUCCESS, duration, vkPath: verificationKeyPath };
316
325
  }
317
326
  // Not a great error message here but it is difficult to decipher what comes from bb
318
- return { status: BB_RESULT.FAILURE, reason: `Failed to create vk as fields` };
327
+ return {
328
+ status: BB_RESULT.FAILURE,
329
+ reason: `Failed to create vk as fields. Exit code ${result.exitCode}. Signal ${result.signal}.`,
330
+ };
319
331
  } catch (error) {
320
332
  return { status: BB_RESULT.FAILURE, reason: `${error}` };
321
333
  }
@@ -348,11 +360,14 @@ export async function writeProofAsFields(
348
360
  const timer = new Timer();
349
361
  const result = await executeBB(pathToBB, 'proof_as_fields', args, log);
350
362
  const duration = timer.ms();
351
- if (result == BB_RESULT.SUCCESS) {
363
+ if (result.status == BB_RESULT.SUCCESS) {
352
364
  return { status: BB_RESULT.SUCCESS, duration, proofPath: proofPath };
353
365
  }
354
366
  // Not a great error message here but it is difficult to decipher what comes from bb
355
- return { status: BB_RESULT.FAILURE, reason: `Failed to create proof as fields` };
367
+ return {
368
+ status: BB_RESULT.FAILURE,
369
+ reason: `Failed to create proof as fields. Exit code ${result.exitCode}. Signal ${result.signal}.`,
370
+ };
356
371
  } catch (error) {
357
372
  return { status: BB_RESULT.FAILURE, reason: `${error}` };
358
373
  }