@aztec/prover-client 0.69.1 → 0.71.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.
Files changed (130) hide show
  1. package/dest/bin/get-proof-inputs.d.ts +2 -0
  2. package/dest/bin/get-proof-inputs.d.ts.map +1 -0
  3. package/dest/bin/get-proof-inputs.js +50 -0
  4. package/dest/block_builder/light.d.ts +3 -5
  5. package/dest/block_builder/light.d.ts.map +1 -1
  6. package/dest/block_builder/light.js +9 -22
  7. package/dest/config.d.ts +2 -1
  8. package/dest/config.d.ts.map +1 -1
  9. package/dest/config.js +3 -2
  10. package/dest/mocks/fixtures.d.ts +1 -1
  11. package/dest/mocks/fixtures.d.ts.map +1 -1
  12. package/dest/mocks/fixtures.js +2 -2
  13. package/dest/mocks/test_context.d.ts +1 -1
  14. package/dest/mocks/test_context.d.ts.map +1 -1
  15. package/dest/mocks/test_context.js +11 -12
  16. package/dest/orchestrator/block-building-helpers.d.ts +15 -29
  17. package/dest/orchestrator/block-building-helpers.d.ts.map +1 -1
  18. package/dest/orchestrator/block-building-helpers.js +51 -58
  19. package/dest/orchestrator/block-proving-state.d.ts +40 -44
  20. package/dest/orchestrator/block-proving-state.d.ts.map +1 -1
  21. package/dest/orchestrator/block-proving-state.js +149 -85
  22. package/dest/orchestrator/epoch-proving-state.d.ts +23 -30
  23. package/dest/orchestrator/epoch-proving-state.d.ts.map +1 -1
  24. package/dest/orchestrator/epoch-proving-state.js +92 -65
  25. package/dest/orchestrator/orchestrator.d.ts +17 -48
  26. package/dest/orchestrator/orchestrator.d.ts.map +1 -1
  27. package/dest/orchestrator/orchestrator.js +208 -351
  28. package/dest/orchestrator/tx-proving-state.d.ts +10 -6
  29. package/dest/orchestrator/tx-proving-state.d.ts.map +1 -1
  30. package/dest/orchestrator/tx-proving-state.js +57 -46
  31. package/dest/prover-agent/memory-proving-queue.d.ts +4 -4
  32. package/dest/prover-agent/memory-proving-queue.d.ts.map +1 -1
  33. package/dest/prover-agent/memory-proving-queue.js +5 -5
  34. package/dest/prover-agent/prover-agent.d.ts +0 -2
  35. package/dest/prover-agent/prover-agent.d.ts.map +1 -1
  36. package/dest/prover-agent/prover-agent.js +7 -9
  37. package/dest/prover-client/factory.d.ts.map +1 -1
  38. package/dest/prover-client/factory.js +3 -3
  39. package/dest/prover-client/prover-client.d.ts +4 -2
  40. package/dest/prover-client/prover-client.d.ts.map +1 -1
  41. package/dest/prover-client/prover-client.js +16 -15
  42. package/dest/prover-client/server-epoch-prover.d.ts +25 -0
  43. package/dest/prover-client/server-epoch-prover.d.ts.map +1 -0
  44. package/dest/prover-client/server-epoch-prover.js +40 -0
  45. package/dest/proving_broker/broker_prover_facade.d.ts +19 -7
  46. package/dest/proving_broker/broker_prover_facade.d.ts.map +1 -1
  47. package/dest/proving_broker/broker_prover_facade.js +271 -49
  48. package/dest/proving_broker/config.d.ts +61 -0
  49. package/dest/proving_broker/config.d.ts.map +1 -0
  50. package/dest/proving_broker/config.js +83 -0
  51. package/dest/proving_broker/factory.d.ts +1 -1
  52. package/dest/proving_broker/factory.d.ts.map +1 -1
  53. package/dest/proving_broker/factory.js +4 -7
  54. package/dest/proving_broker/fixtures.d.ts +5 -0
  55. package/dest/proving_broker/fixtures.d.ts.map +1 -0
  56. package/dest/proving_broker/fixtures.js +12 -0
  57. package/dest/proving_broker/index.d.ts +2 -1
  58. package/dest/proving_broker/index.d.ts.map +1 -1
  59. package/dest/proving_broker/index.js +3 -2
  60. package/dest/proving_broker/proof_store/factory.d.ts +6 -0
  61. package/dest/proving_broker/proof_store/factory.d.ts.map +1 -0
  62. package/dest/proving_broker/proof_store/factory.js +39 -0
  63. package/dest/proving_broker/proof_store/gcs_proof_store.d.ts +13 -0
  64. package/dest/proving_broker/proof_store/gcs_proof_store.d.ts.map +1 -0
  65. package/dest/proving_broker/proof_store/gcs_proof_store.js +46 -0
  66. package/dest/proving_broker/proof_store/index.d.ts +4 -0
  67. package/dest/proving_broker/proof_store/index.d.ts.map +1 -0
  68. package/dest/proving_broker/proof_store/index.js +4 -0
  69. package/dest/proving_broker/proof_store/inline_proof_store.d.ts +14 -0
  70. package/dest/proving_broker/proof_store/inline_proof_store.d.ts.map +1 -0
  71. package/dest/proving_broker/proof_store/inline_proof_store.js +37 -0
  72. package/dest/proving_broker/{proof_store.d.ts → proof_store/proof_store.d.ts} +1 -12
  73. package/dest/proving_broker/proof_store/proof_store.d.ts.map +1 -0
  74. package/dest/proving_broker/proof_store/proof_store.js +2 -0
  75. package/dest/proving_broker/proving_agent.d.ts +4 -4
  76. package/dest/proving_broker/proving_agent.d.ts.map +1 -1
  77. package/dest/proving_broker/proving_agent.js +5 -5
  78. package/dest/proving_broker/proving_broker.d.ts +16 -12
  79. package/dest/proving_broker/proving_broker.d.ts.map +1 -1
  80. package/dest/proving_broker/proving_broker.js +307 -274
  81. package/dest/proving_broker/proving_broker_database/memory.d.ts +4 -2
  82. package/dest/proving_broker/proving_broker_database/memory.d.ts.map +1 -1
  83. package/dest/proving_broker/proving_broker_database/memory.js +17 -4
  84. package/dest/proving_broker/proving_broker_database/persisted.d.ts +10 -6
  85. package/dest/proving_broker/proving_broker_database/persisted.d.ts.map +1 -1
  86. package/dest/proving_broker/proving_broker_database/persisted.js +106 -14
  87. package/dest/proving_broker/proving_broker_database.d.ts +7 -3
  88. package/dest/proving_broker/proving_broker_database.d.ts.map +1 -1
  89. package/dest/proving_broker/proving_job_controller.js +4 -4
  90. package/dest/proving_broker/rpc.d.ts.map +1 -1
  91. package/dest/proving_broker/rpc.js +4 -4
  92. package/dest/test/mock_prover.d.ts +8 -8
  93. package/dest/test/mock_prover.d.ts.map +1 -1
  94. package/dest/test/mock_prover.js +9 -10
  95. package/package.json +14 -12
  96. package/src/bin/get-proof-inputs.ts +60 -0
  97. package/src/block_builder/light.ts +7 -31
  98. package/src/config.ts +4 -4
  99. package/src/mocks/fixtures.ts +1 -1
  100. package/src/mocks/test_context.ts +9 -11
  101. package/src/orchestrator/block-building-helpers.ts +360 -402
  102. package/src/orchestrator/block-proving-state.ts +251 -121
  103. package/src/orchestrator/epoch-proving-state.ts +159 -88
  104. package/src/orchestrator/orchestrator.ts +262 -542
  105. package/src/orchestrator/tx-proving-state.ts +30 -18
  106. package/src/prover-agent/memory-proving-queue.ts +12 -16
  107. package/src/prover-agent/prover-agent.ts +14 -8
  108. package/src/prover-client/factory.ts +2 -3
  109. package/src/prover-client/prover-client.ts +17 -20
  110. package/src/prover-client/server-epoch-prover.ts +44 -0
  111. package/src/proving_broker/broker_prover_facade.ts +347 -67
  112. package/src/proving_broker/config.ts +93 -0
  113. package/src/proving_broker/factory.ts +11 -10
  114. package/src/proving_broker/fixtures.ts +14 -0
  115. package/src/proving_broker/index.ts +2 -1
  116. package/src/proving_broker/proof_store/factory.ts +42 -0
  117. package/src/proving_broker/proof_store/gcs_proof_store.ts +72 -0
  118. package/src/proving_broker/proof_store/index.ts +3 -0
  119. package/src/proving_broker/{proof_store.ts → proof_store/inline_proof_store.ts} +1 -44
  120. package/src/proving_broker/proof_store/proof_store.ts +54 -0
  121. package/src/proving_broker/proving_agent.ts +11 -5
  122. package/src/proving_broker/proving_broker.ts +122 -73
  123. package/src/proving_broker/proving_broker_database/memory.ts +24 -4
  124. package/src/proving_broker/proving_broker_database/persisted.ts +142 -20
  125. package/src/proving_broker/proving_broker_database.ts +8 -3
  126. package/src/proving_broker/proving_job_controller.ts +5 -5
  127. package/src/proving_broker/rpc.ts +2 -3
  128. package/src/test/mock_prover.ts +12 -18
  129. package/dest/proving_broker/proof_store.d.ts.map +0 -1
  130. package/dest/proving_broker/proof_store.js +0 -37
@@ -42,13 +42,13 @@ export class ProvingJobController {
42
42
  }
43
43
 
44
44
  this.status = ProvingJobControllerStatus.PROVING;
45
+
45
46
  this.promise = this.generateProof()
46
47
  .then(
47
48
  result => {
48
49
  if (this.status === ProvingJobControllerStatus.ABORTED) {
49
50
  return;
50
51
  }
51
-
52
52
  this.status = ProvingJobControllerStatus.DONE;
53
53
  return this.onComplete(this.jobId, this.inputs.type, undefined, result);
54
54
  },
@@ -124,6 +124,10 @@ export class ProvingJobController {
124
124
  return await this.circuitProver.getBlockRootRollupProof(inputs, signal, this.epochNumber);
125
125
  }
126
126
 
127
+ case ProvingRequestType.SINGLE_TX_BLOCK_ROOT_ROLLUP: {
128
+ return await this.circuitProver.getSingleTxBlockRootRollupProof(inputs, signal, this.epochNumber);
129
+ }
130
+
127
131
  case ProvingRequestType.BLOCK_MERGE_ROLLUP: {
128
132
  return await this.circuitProver.getBlockMergeRollupProof(inputs, signal, this.epochNumber);
129
133
  }
@@ -140,10 +144,6 @@ export class ProvingJobController {
140
144
  return await this.circuitProver.getRootParityProof(inputs, signal, this.epochNumber);
141
145
  }
142
146
 
143
- case ProvingRequestType.PRIVATE_KERNEL_EMPTY: {
144
- return await this.circuitProver.getEmptyPrivateKernelProof(inputs, signal, this.epochNumber);
145
- }
146
-
147
147
  case ProvingRequestType.TUBE_PROOF: {
148
148
  return await this.circuitProver.getTubeProof(inputs, signal, this.epochNumber);
149
149
  }
@@ -6,7 +6,6 @@ import {
6
6
  type ProvingJobConsumer,
7
7
  ProvingJobId,
8
8
  type ProvingJobProducer,
9
- ProvingJobSettledResult,
10
9
  ProvingJobStatus,
11
10
  ProvingRequestType,
12
11
  } from '@aztec/circuit-types';
@@ -26,10 +25,10 @@ const GetProvingJobResponse = z.object({
26
25
  });
27
26
 
28
27
  export const ProvingJobProducerSchema: ApiSchemaFor<ProvingJobProducer> = {
29
- enqueueProvingJob: z.function().args(ProvingJob).returns(z.void()),
28
+ enqueueProvingJob: z.function().args(ProvingJob).returns(ProvingJobStatus),
30
29
  getProvingJobStatus: z.function().args(ProvingJobId).returns(ProvingJobStatus),
31
30
  cancelProvingJob: z.function().args(ProvingJobId).returns(z.void()),
32
- waitForJobToSettle: z.function().args(ProvingJobId).returns(ProvingJobSettledResult),
31
+ getCompletedJobs: z.function().args(z.array(ProvingJobId)).returns(z.array(ProvingJobId)),
33
32
  };
34
33
 
35
34
  export const ProvingJobConsumerSchema: ApiSchemaFor<ProvingJobConsumer> = {
@@ -3,7 +3,6 @@ import {
3
3
  type ProvingJob,
4
4
  type ProvingJobId,
5
5
  type ProvingJobProducer,
6
- type ProvingJobSettledResult,
7
6
  type ProvingJobStatus,
8
7
  type PublicInputsAndRecursiveProof,
9
8
  type ServerCircuitProver,
@@ -17,8 +16,6 @@ import {
17
16
  type BaseParityInputs,
18
17
  NESTED_RECURSIVE_PROOF_LENGTH,
19
18
  NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH,
20
- type PrivateKernelEmptyInputData,
21
- type PrivateToRollupKernelCircuitPublicInputs,
22
19
  RECURSIVE_PROOF_LENGTH,
23
20
  type RootParityInputs,
24
21
  TUBE_PROOF_LENGTH,
@@ -37,24 +34,23 @@ import {
37
34
  type PublicBaseRollupInputs,
38
35
  type RootRollupInputs,
39
36
  type RootRollupPublicInputs,
37
+ type SingleTxBlockRootRollupInputs,
40
38
  } from '@aztec/circuits.js/rollup';
41
39
  import {
42
40
  makeBaseOrMergeRollupPublicInputs,
43
41
  makeBlockRootOrBlockMergeRollupPublicInputs,
44
42
  makeParityPublicInputs,
45
- makePrivateToRollupKernelCircuitPublicInputs,
46
43
  makeRootRollupPublicInputs,
47
44
  } from '@aztec/circuits.js/testing';
48
45
  import { times } from '@aztec/foundation/collection';
49
- import { NoopTelemetryClient } from '@aztec/telemetry-client/noop';
50
46
 
51
- import { InlineProofStore, type ProofStore } from '../proving_broker/proof_store.js';
47
+ import { InlineProofStore, type ProofStore } from '../proving_broker/proof_store/index.js';
52
48
  import { ProvingAgent } from '../proving_broker/proving_agent.js';
53
49
  import { ProvingBroker } from '../proving_broker/proving_broker.js';
54
50
  import { InMemoryBrokerDatabase } from '../proving_broker/proving_broker_database/memory.js';
55
51
 
56
52
  export class TestBroker implements ProvingJobProducer {
57
- private broker = new ProvingBroker(new InMemoryBrokerDatabase(), new NoopTelemetryClient());
53
+ private broker = new ProvingBroker(new InMemoryBrokerDatabase());
58
54
  private agents: ProvingAgent[];
59
55
 
60
56
  constructor(
@@ -65,7 +61,7 @@ export class TestBroker implements ProvingJobProducer {
65
61
  ) {
66
62
  this.agents = times(
67
63
  agentCount,
68
- () => new ProvingAgent(this.broker, proofStore, prover, new NoopTelemetryClient(), undefined, agentPollInterval),
64
+ () => new ProvingAgent(this.broker, proofStore, prover, undefined, agentPollInterval),
69
65
  );
70
66
  }
71
67
 
@@ -83,7 +79,7 @@ export class TestBroker implements ProvingJobProducer {
83
79
  return this.proofStore;
84
80
  }
85
81
 
86
- enqueueProvingJob(job: ProvingJob): Promise<void> {
82
+ enqueueProvingJob(job: ProvingJob): Promise<ProvingJobStatus> {
87
83
  return this.broker.enqueueProvingJob(job);
88
84
  }
89
85
  getProvingJobStatus(id: ProvingJobId): Promise<ProvingJobStatus> {
@@ -92,8 +88,9 @@ export class TestBroker implements ProvingJobProducer {
92
88
  cancelProvingJob(id: string): Promise<void> {
93
89
  return this.broker.cancelProvingJob(id);
94
90
  }
95
- waitForJobToSettle(id: ProvingJobId): Promise<ProvingJobSettledResult> {
96
- return this.broker.waitForJobToSettle(id);
91
+
92
+ getCompletedJobs(ids: ProvingJobId[]): Promise<ProvingJobId[]> {
93
+ return this.broker.getCompletedJobs(ids);
97
94
  }
98
95
  }
99
96
 
@@ -219,19 +216,16 @@ export class MockProver implements ServerCircuitProver {
219
216
  );
220
217
  }
221
218
 
222
- getEmptyPrivateKernelProof(
223
- _inputs: PrivateKernelEmptyInputData,
219
+ getSingleTxBlockRootRollupProof(
220
+ _input: SingleTxBlockRootRollupInputs,
224
221
  _signal?: AbortSignal,
225
222
  _epochNumber?: number,
226
223
  ): Promise<
227
- PublicInputsAndRecursiveProof<
228
- PrivateToRollupKernelCircuitPublicInputs,
229
- typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH
230
- >
224
+ PublicInputsAndRecursiveProof<BlockRootOrBlockMergePublicInputs, typeof NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH>
231
225
  > {
232
226
  return Promise.resolve(
233
227
  makePublicInputsAndRecursiveProof(
234
- makePrivateToRollupKernelCircuitPublicInputs(),
228
+ makeBlockRootOrBlockMergeRollupPublicInputs(),
235
229
  makeRecursiveProof(NESTED_RECURSIVE_ROLLUP_HONK_PROOF_LENGTH),
236
230
  VerificationKeyData.makeFakeHonk(),
237
231
  ),
@@ -1 +0,0 @@
1
- {"version":3,"file":"proof_store.d.ts","sourceRoot":"","sources":["../../src/proving_broker/proof_store.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,gBAAgB,EAChB,KAAK,mBAAmB,EACxB,gBAAgB,EAChB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACxB,MAAM,sBAAsB,CAAC;AAI9B;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;;;;;OAMG;IACH,cAAc,CAAC,CAAC,SAAS,kBAAkB,EACzC,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,CAAC,EACP,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAC7B,OAAO,CAAC,QAAQ,CAAC,CAAC;IAErB;;;;;;OAMG;IACH,eAAe,CAAC,CAAC,SAAS,kBAAkB,EAC1C,EAAE,EAAE,YAAY,EAChB,IAAI,EAAE,CAAC,EACP,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAC9B,OAAO,CAAC,QAAQ,CAAC,CAAC;IAErB;;;;OAIG;IACH,aAAa,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAExD;;;;OAIG;IACH,cAAc,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAC1D;AAOD;;GAEG;AACH,qBAAa,gBAAiB,YAAW,UAAU;IACjD,cAAc,CAAC,CAAC,SAAS,kBAAkB,EACzC,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,CAAC,EACP,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAC7B,OAAO,CAAC,QAAQ,CAAC;IAKpB,eAAe,CAAC,CAAC,SAAS,kBAAkB,EAC1C,GAAG,EAAE,YAAY,EACjB,IAAI,EAAE,CAAC,EACP,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAC9B,OAAO,CAAC,QAAQ,CAAC;IAKpB,aAAa,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAIvD,cAAc,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAIxD,OAAO,CAAC,MAAM;IAKd,OAAO,CAAC,MAAM;CAQf"}
@@ -1,37 +0,0 @@
1
- import { ProvingJobInputs, ProvingJobResult, } from '@aztec/circuit-types';
2
- import { jsonParseWithSchema, jsonStringify } from '@aztec/foundation/json-rpc';
3
- // use an ASCII encoded data uri https://datatracker.ietf.org/doc/html/rfc2397#section-2
4
- // we do this to avoid double encoding to base64 (since the inputs already serialize to a base64 string)
5
- const PREFIX = 'data:application/json;charset=utf-8';
6
- const SEPARATOR = ',';
7
- /**
8
- * An implementation of a proof input/output database that stores data inline in the URI.
9
- */
10
- export class InlineProofStore {
11
- saveProofInput(_id, type, inputs) {
12
- const jobInputs = { type, inputs };
13
- return Promise.resolve(this.encode(jobInputs));
14
- }
15
- saveProofOutput(_id, type, result) {
16
- const jobResult = { type, result };
17
- return Promise.resolve(this.encode(jobResult));
18
- }
19
- getProofInput(uri) {
20
- return Promise.resolve(this.decode(uri, ProvingJobInputs));
21
- }
22
- getProofOutput(uri) {
23
- return Promise.resolve(this.decode(uri, ProvingJobResult));
24
- }
25
- encode(obj) {
26
- const encoded = encodeURIComponent(jsonStringify(obj));
27
- return (PREFIX + SEPARATOR + encoded);
28
- }
29
- decode(uri, schema) {
30
- const [prefix, data] = uri.split(SEPARATOR);
31
- if (prefix !== PREFIX) {
32
- throw new Error('Invalid proof input URI: ' + prefix);
33
- }
34
- return jsonParseWithSchema(decodeURIComponent(data), schema);
35
- }
36
- }
37
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvb2Zfc3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJvdmluZ19icm9rZXIvcHJvb2Zfc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLGdCQUFnQixFQUVoQixnQkFBZ0IsR0FHakIsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFnRGhGLHdGQUF3RjtBQUN4Rix3R0FBd0c7QUFDeEcsTUFBTSxNQUFNLEdBQUcscUNBQXFDLENBQUM7QUFDckQsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDO0FBRXRCOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGdCQUFnQjtJQUMzQixjQUFjLENBQ1osR0FBaUIsRUFDakIsSUFBTyxFQUNQLE1BQThCO1FBRTlCLE1BQU0sU0FBUyxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBc0IsQ0FBQztRQUN2RCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxlQUFlLENBQ2IsR0FBaUIsRUFDakIsSUFBTyxFQUNQLE1BQStCO1FBRS9CLE1BQU0sU0FBUyxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBc0IsQ0FBQztRQUN2RCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxhQUFhLENBQUMsR0FBYTtRQUN6QixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRCxjQUFjLENBQUMsR0FBYTtRQUMxQixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFTyxNQUFNLENBQUMsR0FBVztRQUN4QixNQUFNLE9BQU8sR0FBRyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN2RCxPQUFPLENBQUMsTUFBTSxHQUFHLFNBQVMsR0FBRyxPQUFPLENBQWEsQ0FBQztJQUNwRCxDQUFDO0lBRU8sTUFBTSxDQUFJLEdBQWEsRUFBRSxNQUFpQjtRQUNoRCxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDNUMsSUFBSSxNQUFNLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsR0FBRyxNQUFNLENBQUMsQ0FBQztRQUN4RCxDQUFDO1FBRUQsT0FBTyxtQkFBbUIsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMvRCxDQUFDO0NBQ0YifQ==