@reclaimprotocol/attestor-core 4.0.0 → 4.0.1
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.
- package/lib/avs/tests/test.operator.js +4 -4
- package/lib/client/create-claim.js +19 -9
- package/lib/client/tunnels/make-rpc-tcp-tunnel.js +3 -3
- package/lib/client/tunnels/make-rpc-tls-tunnel.js +3 -3
- package/lib/client/utils/message-handler.js +2 -2
- package/lib/config/index.d.ts +5 -2
- package/lib/config/index.js +5 -4
- package/lib/proto/api.d.ts +1 -0
- package/lib/proto/api.js +7 -1
- package/lib/providers/http/index.js +43 -10
- package/lib/scripts/check-avs-registration.js +2 -2
- package/lib/scripts/generate-provider-types.js +2 -2
- package/lib/scripts/generate-toprf-keys.js +2 -2
- package/lib/scripts/register-avs-operator.js +2 -2
- package/lib/scripts/start-server.js +10 -3
- package/lib/scripts/update-avs-metadata.js +2 -2
- package/lib/scripts/verify-root-ca.js +2 -2
- package/lib/scripts/whitelist-operator.js +2 -2
- package/lib/server/handlers/claimTunnel.js +2 -2
- package/lib/server/handlers/createTunnel.js +3 -3
- package/lib/server/socket.js +4 -4
- package/lib/server/tunnels/make-tcp-tunnel.js +15 -8
- package/lib/server/utils/apm.js +8 -4
- package/lib/server/utils/assert-valid-claim-request.d.ts +2 -2
- package/lib/server/utils/assert-valid-claim-request.js +14 -11
- package/lib/tests/test.claim-creation.js +2 -2
- package/lib/tests/test.http-provider-utils.js +382 -229
- package/lib/tests/test.http-provider.js +30 -2
- package/lib/tests/test.rpc-tunnel.js +10 -6
- package/lib/tests/test.zk.d.ts +1 -1
- package/lib/tests/test.zk.js +127 -9
- package/lib/types/providers.d.ts +18 -3
- package/lib/types/providers.gen.d.ts +2 -3
- package/lib/types/providers.gen.js +2 -2
- package/lib/types/tunnel.d.ts +2 -2
- package/lib/types/zk.d.ts +0 -1
- package/lib/utils/http-parser.d.ts +4 -0
- package/lib/utils/http-parser.js +4 -2
- package/lib/utils/zk.d.ts +1 -1
- package/lib/utils/zk.js +94 -55
- package/lib/window-rpc/utils.js +2 -2
- package/package.json +4 -3
- package/lib/providers/httpb64/index.d.ts +0 -3
- package/lib/providers/httpb64/index.js +0 -209
- package/lib/providers/httpb64/utils.d.ts +0 -77
- package/lib/providers/httpb64/utils.js +0 -358
- package/lib/server/utils/verify-server-certificates.d.ts +0 -7
- package/lib/server/utils/verify-server-certificates.js +0 -101
package/lib/utils/zk.js
CHANGED
|
@@ -17,7 +17,7 @@ const logger_1 = require("../utils/logger");
|
|
|
17
17
|
const redactions_1 = require("../utils/redactions");
|
|
18
18
|
const ZK_CONCURRENCY = +((0, env_1.getEnvVariable)('ZK_CONCURRENCY')
|
|
19
19
|
|| config_1.DEFAULT_ZK_CONCURRENCY);
|
|
20
|
-
async function makeZkProofGenerator({ zkOperators, oprfOperators, logger = logger_1.logger, zkProofConcurrency = ZK_CONCURRENCY,
|
|
20
|
+
async function makeZkProofGenerator({ zkOperators, oprfOperators, logger = logger_1.logger, zkProofConcurrency = ZK_CONCURRENCY, cipherSuite, zkEngine = 'snarkjs' }) {
|
|
21
21
|
const { default: PQueue } = await import('p-queue');
|
|
22
22
|
const zkQueue = new PQueue({
|
|
23
23
|
concurrency: zkProofConcurrency,
|
|
@@ -25,7 +25,7 @@ async function makeZkProofGenerator({ zkOperators, oprfOperators, logger = logge
|
|
|
25
25
|
});
|
|
26
26
|
const packetsToProve = [];
|
|
27
27
|
logger = (logger || logger_1.logger).child({ module: 'zk', zkEngine: zkEngine });
|
|
28
|
-
let
|
|
28
|
+
let zkProofsToGen = 0;
|
|
29
29
|
return {
|
|
30
30
|
/**
|
|
31
31
|
* Adds the given packet to the list of packets to
|
|
@@ -39,69 +39,91 @@ async function makeZkProofGenerator({ zkOperators, oprfOperators, logger = logge
|
|
|
39
39
|
}
|
|
40
40
|
const alg = (0, generics_1.getZkAlgorithmForCipherSuite)(cipherSuite);
|
|
41
41
|
const chunkSizeBytes = getChunkSizeBytes(alg);
|
|
42
|
-
//const { redactedPlaintext } = reveal
|
|
43
42
|
const key = await tls_1.crypto.exportKey(packet.encKey);
|
|
44
43
|
const iv = packet.iv;
|
|
45
44
|
const ciphertext = (0, generics_1.getPureCiphertext)(packet.ciphertext, cipherSuite);
|
|
46
|
-
const chunks = Math.ceil(ciphertext.length / chunkSizeBytes);
|
|
47
45
|
const packetToProve = {
|
|
48
46
|
onGeneratedProofs,
|
|
49
47
|
algorithm: alg,
|
|
50
48
|
proofsToGenerate: [],
|
|
51
49
|
iv: packet.fixedIv,
|
|
52
50
|
};
|
|
53
|
-
const
|
|
51
|
+
const slicesDone = [];
|
|
54
52
|
// first we'll handle all TOPRF blocks
|
|
55
53
|
// we do these first, because they can span multiple chunks
|
|
56
54
|
// & we need to be able to span the right chunks
|
|
57
55
|
for (const toprf of toprfs || []) {
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
56
|
+
const fromIndex = getIdealOffsetForToprfBlock(alg, toprf);
|
|
57
|
+
const toIndex = Math.min(fromIndex + chunkSizeBytes, ciphertext.length);
|
|
58
|
+
// ensure this OPRF block doesn't overlap with any other OPRF block
|
|
59
|
+
const slice = { fromIndex, toIndex };
|
|
60
|
+
assertNoOverlapOprf(slice);
|
|
61
|
+
addProofsToGenerate(slice, {
|
|
64
62
|
...toprf,
|
|
65
63
|
dataLocation: {
|
|
66
64
|
...toprf.dataLocation,
|
|
67
|
-
fromIndex: toprf.dataLocation.fromIndex
|
|
65
|
+
fromIndex: toprf.dataLocation.fromIndex - fromIndex
|
|
68
66
|
}
|
|
69
67
|
});
|
|
70
68
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
69
|
+
// now we'll go through the rest of the ciphertext, and add proofs
|
|
70
|
+
// for the sections that haven't been covered by the TOPRF blocks
|
|
71
|
+
const slicesCp = sortSlices(slicesDone.slice());
|
|
72
|
+
let fromIndex = 0;
|
|
73
|
+
for (const done of slicesCp) {
|
|
74
|
+
if (done.fromIndex > fromIndex) {
|
|
75
|
+
addProofsToGenerate({
|
|
76
|
+
fromIndex,
|
|
77
|
+
toIndex: done.fromIndex
|
|
78
|
+
});
|
|
75
79
|
}
|
|
76
|
-
|
|
80
|
+
fromIndex = done.toIndex;
|
|
81
|
+
}
|
|
82
|
+
if (fromIndex < ciphertext.length) {
|
|
83
|
+
addProofsToGenerate({
|
|
84
|
+
fromIndex,
|
|
85
|
+
toIndex: ciphertext.length
|
|
86
|
+
});
|
|
77
87
|
}
|
|
78
88
|
// generate proofs in order of start index
|
|
79
89
|
packetToProve.proofsToGenerate
|
|
80
90
|
.sort((a, b) => a.startIdx - b.startIdx);
|
|
81
91
|
packetsToProve.push(packetToProve);
|
|
82
|
-
function
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
toprf,
|
|
91
|
-
});
|
|
92
|
-
if (!proofParams) {
|
|
93
|
-
return;
|
|
92
|
+
function assertNoOverlapOprf(slice) {
|
|
93
|
+
for (const done of slicesDone) {
|
|
94
|
+
if (
|
|
95
|
+
// 1d box overlap
|
|
96
|
+
slice.fromIndex < done.toIndex
|
|
97
|
+
&& slice.toIndex > done.fromIndex) {
|
|
98
|
+
throw new error_1.AttestorError('ERROR_BAD_REQUEST', 'Single chunk has multiple OPRFs');
|
|
99
|
+
}
|
|
94
100
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
101
|
+
}
|
|
102
|
+
function addProofsToGenerate({ fromIndex, toIndex }, toprf) {
|
|
103
|
+
for (let i = fromIndex; i < toIndex; i += chunkSizeBytes) {
|
|
104
|
+
const slice = {
|
|
105
|
+
fromIndex: i,
|
|
106
|
+
toIndex: Math.min(i + chunkSizeBytes, toIndex)
|
|
107
|
+
};
|
|
108
|
+
slicesDone.push(slice);
|
|
109
|
+
const proofParams = getProofGenerationParamsForSlice({
|
|
110
|
+
key,
|
|
111
|
+
iv,
|
|
112
|
+
ciphertext,
|
|
113
|
+
redactedPlaintext,
|
|
114
|
+
slice,
|
|
115
|
+
toprf,
|
|
116
|
+
});
|
|
117
|
+
if (!proofParams) {
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
packetToProve.proofsToGenerate.push(proofParams);
|
|
121
|
+
zkProofsToGen += 1;
|
|
100
122
|
}
|
|
101
123
|
}
|
|
102
124
|
},
|
|
103
125
|
getTotalChunksToProve() {
|
|
104
|
-
return
|
|
126
|
+
return zkProofsToGen;
|
|
105
127
|
},
|
|
106
128
|
async generateProofs(onChunkDone) {
|
|
107
129
|
var _a;
|
|
@@ -126,13 +148,10 @@ async function makeZkProofGenerator({ zkOperators, oprfOperators, logger = logge
|
|
|
126
148
|
}
|
|
127
149
|
}
|
|
128
150
|
await Promise.all(tasks);
|
|
129
|
-
logger === null || logger === void 0 ? void 0 : logger.info({
|
|
130
|
-
durationMs: Date.now() - start,
|
|
131
|
-
chunks: zkChunksToProve,
|
|
132
|
-
}, 'generated ZK proofs');
|
|
151
|
+
logger === null || logger === void 0 ? void 0 : logger.info({ durationMs: Date.now() - start, zkProofsToGen }, 'generated ZK proofs');
|
|
133
152
|
// reset the packets to prove
|
|
134
153
|
packetsToProve.splice(0, packetsToProve.length);
|
|
135
|
-
|
|
154
|
+
zkProofsToGen = 0;
|
|
136
155
|
// release ZK resources to free up memory
|
|
137
156
|
const alg = (0, generics_1.getZkAlgorithmForCipherSuite)(cipherSuite);
|
|
138
157
|
const zkOperator = await getZkOperatorForAlgorithm(alg);
|
|
@@ -203,8 +222,6 @@ async function verifyZkPacket({ cipherSuite, ciphertext, zkReveal, zkOperators,
|
|
|
203
222
|
* in the proofs
|
|
204
223
|
*/
|
|
205
224
|
const realRedactedPlaintext = new Uint8Array(ciphertext.length).fill(redactions_1.REDACTION_CHAR_CODE);
|
|
206
|
-
const alg = (0, generics_1.getZkAlgorithmForCipherSuite)(cipherSuite);
|
|
207
|
-
const chunkSizeBytes = getChunkSizeBytes(alg);
|
|
208
225
|
await Promise.all(proofs.map(async (proof, i) => {
|
|
209
226
|
try {
|
|
210
227
|
await verifyProofPacket(proof);
|
|
@@ -253,7 +270,6 @@ async function verifyZkPacket({ cipherSuite, ciphertext, zkReveal, zkOperators,
|
|
|
253
270
|
if (!(0, redactions_1.isRedactionCongruent)(comparePlaintext, decryptedRedactedCiphertext)) {
|
|
254
271
|
throw new Error('redacted ciphertext not congruent');
|
|
255
272
|
}
|
|
256
|
-
const chunkIndex = startIdx / chunkSizeBytes;
|
|
257
273
|
let nonce = (0, tls_1.concatenateUint8Arrays)([iv, recordIV]);
|
|
258
274
|
if (!recordIV.length) {
|
|
259
275
|
nonce = (0, tls_1.generateIV)(nonce, recordNumber);
|
|
@@ -269,7 +285,7 @@ async function verifyZkPacket({ cipherSuite, ciphertext, zkReveal, zkOperators,
|
|
|
269
285
|
publicInput: {
|
|
270
286
|
ciphertext: ciphertextChunk,
|
|
271
287
|
iv: nonce,
|
|
272
|
-
|
|
288
|
+
offsetBytes: startIdx
|
|
273
289
|
},
|
|
274
290
|
logger,
|
|
275
291
|
...(toprf
|
|
@@ -297,6 +313,8 @@ async function verifyZkPacket({ cipherSuite, ciphertext, zkReveal, zkOperators,
|
|
|
297
313
|
|| makeDefaultOPRFOperator(algorithm, zkEngine, logger);
|
|
298
314
|
}
|
|
299
315
|
}
|
|
316
|
+
// the chunk size of the ZK circuit in bytes
|
|
317
|
+
// this will be >= the block size
|
|
300
318
|
function getChunkSizeBytes(alg) {
|
|
301
319
|
const { chunkSize, bitsPerWord } = zk_symmetric_crypto_1.CONFIG[alg];
|
|
302
320
|
return chunkSize * bitsPerWord / 8;
|
|
@@ -374,14 +392,9 @@ function getEngineProto(engine) {
|
|
|
374
392
|
}
|
|
375
393
|
throw new Error(`Unknown ZK engine: ${engine}`);
|
|
376
394
|
}
|
|
377
|
-
function
|
|
378
|
-
const
|
|
379
|
-
const
|
|
380
|
-
const endIdx = (offsetChunks + 1) * chunkSize;
|
|
381
|
-
const ciphertextChunk = ciphertext
|
|
382
|
-
.slice(startIdx, endIdx);
|
|
383
|
-
const plaintextChunk = redactedPlaintext
|
|
384
|
-
.slice(startIdx, endIdx);
|
|
395
|
+
function getProofGenerationParamsForSlice({ key, iv, ciphertext, redactedPlaintext, slice: { fromIndex, toIndex }, toprf, }) {
|
|
396
|
+
const ciphertextChunk = ciphertext.slice(fromIndex, toIndex);
|
|
397
|
+
const plaintextChunk = redactedPlaintext.slice(fromIndex, toIndex);
|
|
385
398
|
if ((0, redactions_1.isFullyRedacted)(plaintextChunk)) {
|
|
386
399
|
return;
|
|
387
400
|
}
|
|
@@ -395,11 +408,37 @@ function getProofGenerationParamsForChunk(algorithm, { key, iv, ciphertext, reda
|
|
|
395
408
|
}
|
|
396
409
|
}
|
|
397
410
|
return {
|
|
398
|
-
startIdx,
|
|
411
|
+
startIdx: fromIndex,
|
|
399
412
|
redactedPlaintext: plaintextChunk,
|
|
400
413
|
privateInput: { key },
|
|
401
|
-
publicInput: { ciphertext: ciphertextChunk, iv,
|
|
414
|
+
publicInput: { ciphertext: ciphertextChunk, iv, offsetBytes: fromIndex },
|
|
402
415
|
toprf
|
|
403
416
|
};
|
|
404
417
|
}
|
|
405
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemsuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvemsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE2RUEsb0RBcVBDO0FBS0Qsd0NBMktDO0FBNEJELHNEQThCQztBQUVELDBEQThCQztBQUVELDBDQVVDO0FBR0Qsd0NBVUM7QUFybUJELDhDQUErRztBQUMvRyw4RUFleUQ7QUFDekQsdUNBQThIO0FBQzlILHVDQUEwSDtBQUUxSCx1Q0FBaUU7QUFDakUsMkNBQStDO0FBQy9DLGlEQUFrSDtBQUNsSCw2Q0FBbUQ7QUFDbkQscURBQWtIO0FBZ0RsSCxNQUFNLGNBQWMsR0FBRyxDQUFDLENBQ3ZCLElBQUEsb0JBQWMsRUFBQyxnQkFBZ0IsQ0FBQztPQUM3QiwrQkFBc0IsQ0FDekIsQ0FBQTtBQUVNLEtBQUssVUFBVSxvQkFBb0IsQ0FDekMsRUFDQyxXQUFXLEVBQ1gsYUFBYSxFQUNiLE1BQU0sR0FBRyxlQUFNLEVBQ2Ysa0JBQWtCLEdBQUcsY0FBYyxFQUNuQyxXQUFXLEdBQUcsc0JBQWEsRUFDM0IsV0FBVyxFQUNYLFFBQVEsR0FBRyxTQUFTLEVBQ0M7SUFHdEIsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUNuRCxNQUFNLE9BQU8sR0FBRyxJQUFJLE1BQU0sQ0FBQztRQUMxQixXQUFXLEVBQUUsa0JBQWtCO1FBQy9CLFNBQVMsRUFBRSxJQUFJO0tBQ2YsQ0FBQyxDQUFBO0lBRUYsTUFBTSxjQUFjLEdBQXNCLEVBQUUsQ0FBQTtJQUU1QyxNQUFNLEdBQUcsQ0FBQyxNQUFNLElBQUksZUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQTtJQUN2RSxJQUFJLGVBQWUsR0FBRyxDQUFDLENBQUE7SUFFdkIsT0FBTztRQUNOOzs7OztXQUtHO1FBQ0gsS0FBSyxDQUFDLGdCQUFnQixDQUNyQixNQUF5QixFQUN6QixFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBZ0IsRUFDM0MsaUJBQXVEO1lBRXZELElBQUcsTUFBTSxDQUFDLElBQUksS0FBSyxXQUFXLEVBQUUsQ0FBQztnQkFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFBO1lBQ3ZELENBQUM7WUFFRCxNQUFNLEdBQUcsR0FBRyxJQUFBLHVDQUE0QixFQUFDLFdBQVcsQ0FBQyxDQUFBO1lBQ3JELE1BQU0sY0FBYyxHQUFHLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBRTdDLHNDQUFzQztZQUN0QyxNQUFNLEdBQUcsR0FBRyxNQUFNLFlBQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQ2pELE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUE7WUFDcEIsTUFBTSxVQUFVLEdBQUcsSUFBQSw0QkFBaUIsRUFDbkMsTUFBTSxDQUFDLFVBQVUsRUFDakIsV0FBVyxDQUNYLENBQUE7WUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsY0FBYyxDQUFDLENBQUE7WUFDNUQsTUFBTSxhQUFhLEdBQW9CO2dCQUN0QyxpQkFBaUI7Z0JBQ2pCLFNBQVMsRUFBRSxHQUFHO2dCQUNkLGdCQUFnQixFQUFFLEVBQUU7Z0JBQ3BCLEVBQUUsRUFBRSxNQUFNLENBQUMsT0FBTzthQUNsQixDQUFBO1lBQ0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQTtZQUVwQyxzQ0FBc0M7WUFDdEMsMkRBQTJEO1lBQzNELGdEQUFnRDtZQUNoRCxLQUFJLE1BQU0sS0FBSyxJQUFJLE1BQU0sSUFBSSxFQUFFLEVBQUUsQ0FBQztnQkFDakMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDNUIsS0FBSyxDQUFDLFlBQWEsQ0FBQyxTQUFTLEdBQUcsY0FBYyxDQUM5QyxDQUFBO2dCQUNELElBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO29CQUMvQixNQUFNLElBQUkscUJBQWEsQ0FDdEIsbUJBQW1CLEVBQ25CLFNBQVMsVUFBVSxnQ0FBZ0M7MEJBQ2pELHlCQUF5QixDQUMzQixDQUFBO2dCQUNGLENBQUM7Z0JBRUQsa0JBQWtCLENBQ2pCLFVBQVUsRUFDVjtvQkFDQyxHQUFHLEtBQUs7b0JBQ1IsWUFBWSxFQUFFO3dCQUNiLEdBQUcsS0FBSyxDQUFDLFlBQWE7d0JBQ3RCLFNBQVMsRUFBRSxLQUFLLENBQUMsWUFBYSxDQUFDLFNBQVMsR0FBRyxjQUFjO3FCQUN6RDtpQkFDRCxDQUNELENBQUE7WUFDRixDQUFDO1lBRUQsS0FBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUMsQ0FBQyxHQUFHLE1BQU0sRUFBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUM5QiwwQkFBMEI7Z0JBQzFCLElBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUN0QixTQUFRO2dCQUNULENBQUM7Z0JBRUQsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDdEIsQ0FBQztZQUVELDBDQUEwQztZQUMxQyxhQUFhLENBQUMsZ0JBQWdCO2lCQUM1QixJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUV6QyxjQUFjLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1lBRWxDLFNBQVMsa0JBQWtCLENBQzFCLFlBQW9CLEVBQ3BCLEtBQXdCO2dCQUV4QixVQUFVLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFBO2dCQUU1QixNQUFNLFdBQVcsR0FBRyxnQ0FBZ0MsQ0FDbkQsR0FBRyxFQUNIO29CQUNDLEdBQUc7b0JBQ0gsRUFBRTtvQkFDRixVQUFVO29CQUNWLGlCQUFpQjtvQkFDakIsWUFBWTtvQkFDWixLQUFLO2lCQUNMLENBQ0QsQ0FBQTtnQkFFRCxJQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQ2pCLE9BQU07Z0JBQ1AsQ0FBQztnQkFFRCxhQUFhLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFBO2dCQUNoRCxlQUFlLElBQUksQ0FBQyxDQUFBO2dCQUVwQixJQUFHLGVBQWUsR0FBRyxXQUFXLEVBQUUsQ0FBQztvQkFDbEMsTUFBTSxJQUFJLEtBQUssQ0FDZCwyQkFBMkI7MEJBQ3pCLElBQUksZUFBZSxNQUFNLFdBQVcsRUFBRSxDQUN4QyxDQUFBO2dCQUNGLENBQUM7WUFDRixDQUFDO1FBQ0YsQ0FBQztRQUNELHFCQUFxQjtZQUNwQixPQUFPLGVBQWUsQ0FBQTtRQUN2QixDQUFDO1FBQ0QsS0FBSyxDQUFDLGNBQWMsQ0FBQyxXQUF3Qjs7WUFDNUMsSUFBRyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDM0IsT0FBTTtZQUNQLENBQUM7WUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUE7WUFDeEIsTUFBTSxLQUFLLEdBQW9CLEVBQUUsQ0FBQTtZQUNqQyxLQUFJLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxjQUFjLEVBQUUsQ0FBQztnQkFDaEYsTUFBTSxNQUFNLEdBQWMsRUFBRSxDQUFBO2dCQUU1QixJQUFJLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUE7Z0JBQ3hDLEtBQUksTUFBTSxVQUFVLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztvQkFDMUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBRyxFQUFFO3dCQUNoQyxNQUFNLEtBQUssR0FBRyxNQUFNLHFCQUFxQixDQUN4QyxTQUFTLEVBQ1QsVUFBVSxDQUNWLENBQUE7d0JBRUQsV0FBVyxhQUFYLFdBQVcsdUJBQVgsV0FBVyxFQUFJLENBQUE7d0JBQ2YsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTt3QkFFbEIsVUFBVSxJQUFJLENBQUMsQ0FBQTt3QkFDZixJQUFHLFVBQVUsS0FBSyxDQUFDLEVBQUUsQ0FBQzs0QkFDckIsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUE7d0JBQzFCLENBQUM7b0JBQ0YsQ0FBQyxFQUFFLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQTtnQkFDOUIsQ0FBQztZQUNGLENBQUM7WUFFRCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7WUFFeEIsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLElBQUksQ0FDWDtnQkFDQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUs7Z0JBQzlCLE1BQU0sRUFBRSxlQUFlO2FBQ3ZCLEVBQ0QscUJBQXFCLENBQ3JCLENBQUE7WUFFRCw2QkFBNkI7WUFDN0IsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQy9DLGVBQWUsR0FBRyxDQUFDLENBQUE7WUFFbkIseUNBQXlDO1lBQ3pDLE1BQU0sR0FBRyxHQUFHLElBQUEsdUNBQTRCLEVBQUMsV0FBVyxDQUFDLENBQUE7WUFDckQsTUFBTSxVQUFVLEdBQUcsTUFBTSx5QkFBeUIsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUN2RCxNQUFBLFVBQVUsQ0FBQyxPQUFPLDBEQUFJLENBQUE7UUFDdkIsQ0FBQztLQUNELENBQUE7SUFFRCxLQUFLLFVBQVUscUJBQXFCLENBQ25DLFNBQThCLEVBQzlCLEVBQ0MsUUFBUSxFQUFFLGlCQUFpQixFQUMzQixZQUFZLEVBQUUsV0FBVyxFQUN6QixLQUFLLEdBQ2M7UUFFcEIsTUFBTSxRQUFRLEdBQUcsS0FBSztZQUNyQixDQUFDLENBQUMsMkJBQTJCLENBQUMsU0FBUyxDQUFDO1lBQ3hDLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUN2QyxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUEsbUNBQWEsRUFDaEM7WUFDQyxTQUFTO1lBQ1QsWUFBWTtZQUNaLFdBQVc7WUFDWCxRQUFRO1lBQ1IsTUFBTTtZQUNOLEdBQUcsQ0FDRixLQUFLO2dCQUNKLENBQUMsQ0FBQztvQkFDRCxLQUFLLEVBQUU7d0JBQ04sR0FBRyxFQUFFLEtBQUssQ0FBQyxZQUFhLENBQUMsU0FBUzt3QkFDbEMsR0FBRyxFQUFFLEtBQUssQ0FBQyxZQUFhLENBQUMsTUFBTTt3QkFDL0IsTUFBTSxFQUFFLEtBQUssQ0FBQyxTQUFTO3dCQUN2QixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7d0JBQzFCLGVBQWUsRUFBRSwrQkFBc0I7cUJBQ3ZDO29CQUNELElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtpQkFDaEI7Z0JBQ0QsQ0FBQyxDQUFDLEVBQUUsQ0FDTDtTQUNELENBQ0QsQ0FBQTtRQUVELE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxLQUFLLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSwyQkFBMkIsQ0FBQyxDQUFBO1FBRXhELE9BQU87WUFDTiwwQkFBMEI7WUFDMUIsU0FBUyxFQUFFLEVBQUU7WUFDYixTQUFTLEVBQUUsT0FBTyxLQUFLLENBQUMsU0FBUyxLQUFLLFFBQVE7Z0JBQzdDLENBQUMsQ0FBQyxJQUFBLHFCQUFlLEVBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztnQkFDbEMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTO1lBQ2xCLEtBQUs7WUFDTCwyQkFBMkIsRUFBRSxLQUFLLENBQUMsU0FBUztZQUM1QyxpQkFBaUI7WUFDakIsUUFBUTtTQUNSLENBQUE7SUFDRixDQUFDO0lBRUQsU0FBUyx5QkFBeUIsQ0FBQyxTQUE4QjtRQUNoRSxPQUFPLENBQUEsV0FBVyxhQUFYLFdBQVcsdUJBQVgsV0FBVyxDQUFHLFNBQVMsQ0FBQztlQUMzQixxQkFBcUIsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFBO0lBQ3ZELENBQUM7SUFFRCxTQUFTLDJCQUEyQixDQUFDLFNBQThCO1FBQ2xFLE9BQU8sQ0FBQSxhQUFhLGFBQWIsYUFBYSx1QkFBYixhQUFhLENBQUcsU0FBUyxDQUFDO2VBQzdCLHVCQUF1QixDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDekQsQ0FBQztBQUNGLENBQUM7QUFFRDs7R0FFRztBQUNJLEtBQUssVUFBVSxjQUFjLENBQ25DLEVBQ0MsV0FBVyxFQUNYLFVBQVUsRUFDVixRQUFRLEVBQ1IsV0FBVyxFQUNYLGFBQWEsRUFDYixNQUFNLEdBQUcsZUFBTSxFQUNmLFFBQVEsR0FBRyxTQUFTLEVBQ3BCLEVBQUUsRUFDRixZQUFZLEVBQ0U7SUFFZixJQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxNQUFNLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFBO0lBQ2hDLENBQUM7SUFFRCxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFBO0lBQzNCLE1BQU0sU0FBUyxHQUFHLElBQUEsdUNBQTRCLEVBQUMsV0FBVyxDQUFDLENBQUE7SUFFM0QsTUFBTSxRQUFRLEdBQUcsSUFBQSxzQkFBVyxFQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQTtJQUNyRCxVQUFVLEdBQUcsSUFBQSw0QkFBaUIsRUFBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUE7SUFDdkQ7Ozs7OztPQU1HO0lBQ0gsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLFVBQVUsQ0FDM0MsVUFBVSxDQUFDLE1BQU0sQ0FDakIsQ0FBQyxJQUFJLENBQUMsZ0NBQW1CLENBQUMsQ0FBQTtJQUUzQixNQUFNLEdBQUcsR0FBRyxJQUFBLHVDQUE0QixFQUFDLFdBQVcsQ0FBQyxDQUFBO0lBQ3JELE1BQU0sY0FBYyxHQUFHLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBRTdDLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDaEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzVCLElBQUksQ0FBQztZQUNKLE1BQU0saUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDL0IsQ0FBQztRQUFDLE9BQU0sQ0FBQyxFQUFFLENBQUM7WUFDWCxDQUFDLENBQUMsT0FBTyxJQUFJLFdBQVcsQ0FBQyxjQUFjLEtBQUssQ0FBQyxRQUFRLEdBQUcsQ0FBQTtZQUN4RCxNQUFNLENBQUMsQ0FBQTtRQUNSLENBQUM7SUFDRixDQUFDLENBQUMsQ0FDRixDQUFBO0lBRUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLHFCQUFxQixFQUFFLENBQUE7SUFFbkQsS0FBSyxVQUFVLGlCQUFpQixDQUMvQixFQUNDLFNBQVMsRUFDVCxTQUFTLEVBQ1QsMkJBQTJCLEVBQzNCLGlCQUFpQixFQUNqQixRQUFRLEVBQ1IsS0FBSyxHQUNJOztRQUVWLHVEQUF1RDtRQUN2RCwwREFBMEQ7UUFDMUQsNkRBQTZEO1FBQzdELE1BQU0sZUFBZSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQ3ZDLFFBQVEsRUFDUixRQUFRLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUNuQyxDQUFBO1FBQ0QsNkNBQTZDO1FBQzdDLDBDQUEwQztRQUMxQyx1REFBdUQ7UUFDdkQsNkNBQTZDO1FBQzdDLEtBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFDLENBQUMsR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDOUMsSUFBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxnQ0FBbUIsRUFBRSxDQUFDO2dCQUNqRCxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsZ0NBQW1CLENBQUE7WUFDekMsQ0FBQztRQUNGLENBQUM7UUFFRCxxREFBcUQ7UUFDckQsMkJBQTJCO1FBQzNCLElBQUksZ0JBQWdCLEdBQUcsaUJBQWlCLENBQUE7UUFDeEMsSUFBRyxLQUFLLEVBQUUsQ0FBQztZQUNWLGdCQUFnQixHQUFHLElBQUksVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUE7WUFDcEQsS0FBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxZQUFhLENBQUMsTUFBTSxFQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ2xELGdCQUFnQixDQUNmLENBQUMsR0FBRyxLQUFLLENBQUMsWUFBYSxDQUFDLFNBQVMsQ0FDakMsR0FBRyxnQ0FBbUIsQ0FBQTtZQUN4QixDQUFDO1lBRUQsbURBQW1EO1lBQ25ELGlEQUFpRDtZQUNqRCxrREFBa0Q7WUFDbEQsNkJBQTZCO1lBQzdCLE1BQU0sV0FBVyxHQUFHLElBQUEsNEJBQWUsRUFDbEMsS0FBSyxDQUFDLFNBQVMsRUFDZixLQUFLLENBQUMsWUFBYSxDQUFDLE1BQU0sQ0FDMUIsQ0FBQTtZQUNELE1BQU0sT0FBTyxHQUFHLGlCQUFpQixDQUFDLEtBQUssQ0FDdEMsTUFBQSxLQUFLLENBQUMsWUFBWSwwQ0FBRSxTQUFTLEVBQzdCLENBQUEsTUFBQSxLQUFLLENBQUMsWUFBWSwwQ0FBRSxTQUFVO21CQUMzQixNQUFBLEtBQUssQ0FBQyxZQUFZLDBDQUFFLE1BQU8sQ0FBQSxDQUM5QixDQUFBO1lBQ0QsSUFDQyxJQUFBLDBCQUFlLEVBQUMsT0FBTyxDQUFDLEtBQUssV0FBVztpQkFDdEMsS0FBSyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQ3pCLENBQUM7Z0JBQ0YsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFBO1lBQ2hELENBQUM7UUFDRixDQUFDO1FBRUQsSUFBRyxDQUFDLElBQUEsaUNBQW9CLEVBQ3ZCLGdCQUFnQixFQUNoQiwyQkFBMkIsQ0FDM0IsRUFBRSxDQUFDO1lBQ0gsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFBO1FBQ3JELENBQUM7UUFFRCxNQUFNLFVBQVUsR0FBRyxRQUFRLEdBQUcsY0FBYyxDQUFBO1FBQzVDLElBQUksS0FBSyxHQUFHLElBQUEsNEJBQXNCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQTtRQUVsRCxJQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3JCLEtBQUssR0FBRyxJQUFBLGdCQUFVLEVBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFBO1FBQ3hDLENBQUM7UUFFRCxNQUFNLElBQUEsaUNBQVcsRUFDaEI7WUFDQyxLQUFLLEVBQUU7Z0JBQ04sU0FBUztnQkFDVCxTQUFTLEVBQUUsU0FBUyxDQUFDLE1BQU07b0JBQzFCLENBQUMsQ0FBQyxTQUFTO29CQUNYLENBQUMsQ0FBQyxJQUFBLHFCQUFlLEVBQUMsU0FBUyxDQUFDO2dCQUM3QixTQUFTLEVBQUUsMkJBQTJCO2FBQ3RDO1lBQ0QsV0FBVyxFQUFFO2dCQUNaLFVBQVUsRUFBRSxlQUFlO2dCQUMzQixFQUFFLEVBQUUsS0FBSztnQkFDVCxNQUFNLEVBQUUsVUFBVTthQUNsQjtZQUNELE1BQU07WUFDTixHQUFHLENBQ0YsS0FBSztnQkFDSixDQUFDLENBQUM7b0JBQ0QsUUFBUSxFQUFFLGVBQWUsRUFBRTtvQkFDM0IsS0FBSyxFQUFFO3dCQUNOLEdBQUcsRUFBRSxLQUFLLENBQUMsWUFBYSxDQUFDLFNBQVM7d0JBQ2xDLEdBQUcsRUFBRSxLQUFLLENBQUMsWUFBYSxDQUFDLE1BQU07d0JBQy9CLGVBQWUsRUFBRSwrQkFBc0I7d0JBQ3ZDLE1BQU0sRUFBRSxLQUFLLENBQUMsU0FBUzt3QkFDdkIsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO3FCQUMxQjtpQkFDRDtnQkFDRCxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLEVBQUUsQ0FDaEM7U0FDRCxDQUNELENBQUE7UUFFRCxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsS0FBSyxDQUNaLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxFQUFFLEVBQ3pELGdCQUFnQixDQUNoQixDQUFBO1FBRUQscUJBQXFCLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQ3ZELENBQUM7SUFFRCxTQUFTLGFBQWE7UUFDckIsT0FBTyxDQUFBLFdBQVcsYUFBWCxXQUFXLHVCQUFYLFdBQVcsQ0FBRyxTQUFTLENBQUM7ZUFDM0IscUJBQXFCLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQTtJQUN2RCxDQUFDO0lBRUQsU0FBUyxlQUFlO1FBQ3ZCLE9BQU8sQ0FBQSxhQUFhLGFBQWIsYUFBYSx1QkFBYixhQUFhLENBQUcsU0FBUyxDQUFDO2VBQzdCLHVCQUF1QixDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDekQsQ0FBQztBQUNGLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLEdBQXdCO0lBQ2xELE1BQU0sRUFDTCxTQUFTLEVBQ1QsV0FBVyxFQUNYLEdBQUcsNEJBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUVsQixPQUFPLFNBQVMsR0FBRyxXQUFXLEdBQUcsQ0FBQyxDQUFBO0FBQ25DLENBQUM7QUFFRCxNQUFNLFNBQVMsR0FFWCxFQUFFLENBQUE7QUFFTixNQUFNLFdBQVcsR0FFYixFQUFFLENBQUE7QUFFTixNQUFNLGNBQWMsR0FBdUU7SUFDMUYsU0FBUyxFQUFFLDJDQUFxQjtJQUNoQyxPQUFPLEVBQUUseUNBQW1CO0NBQzVCLENBQUE7QUFFRCxNQUFNLG9CQUFvQixHQUErQztJQUN4RSxPQUFPLEVBQUUsMkNBQXFCO0NBQzlCLENBQUE7QUFFRCxTQUFnQixxQkFBcUIsQ0FDcEMsU0FBOEIsRUFDOUIsUUFBa0IsRUFDbEIsTUFBYztJQUVkLElBQUksV0FBVyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUNyQyxJQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakIsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQTtRQUN4QixXQUFXLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ2xDLENBQUM7SUFFRCxJQUFHLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDNUIsTUFBTSxNQUFNLEdBQUcsSUFBQSx1QkFBaUIsR0FBRSxLQUFLLE1BQU0sQ0FBQTtRQUM3QyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFBO1FBQzFDLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxFQUFFLHNCQUFzQixDQUFDLENBQUE7UUFFakUsTUFBTSxPQUFPLEdBQUcsTUFBTSxLQUFLLE9BQU87WUFDakMsQ0FBQyxDQUFDLElBQUEsd0NBQWtCLEdBQUU7WUFDdEIsQ0FBQyxDQUFDLElBQUEseUNBQW1CLEVBQUM7Z0JBQ3JCLE9BQU8sRUFBRSwyQ0FBa0M7YUFDM0MsQ0FBQyxDQUFBO1FBQ0gsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3RDLElBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLFFBQVEsRUFBRSxDQUFDLENBQUE7UUFDeEQsQ0FBQztRQUVELFdBQVcsQ0FBQyxTQUFTLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQTtJQUN2RCxDQUFDO0lBRUQsT0FBTyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUE7QUFDOUIsQ0FBQztBQUVELFNBQWdCLHVCQUF1QixDQUN0QyxTQUE4QixFQUM5QixRQUFrQixFQUNsQixNQUFjO0lBRWQsSUFBSSxTQUFTLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3JDLElBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNmLFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUE7UUFDMUIsU0FBUyxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUNsQyxDQUFDO0lBRUQsSUFBRyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQzFCLE1BQU0sTUFBTSxHQUFHLElBQUEsdUJBQWlCLEdBQUUsS0FBSyxNQUFNLENBQUE7UUFDN0MsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQTtRQUN4QyxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxFQUFFLHdCQUF3QixDQUFDLENBQUE7UUFFM0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxLQUFLLE9BQU87WUFDL0IsQ0FBQyxDQUFDLElBQUEsd0NBQWtCLEdBQUU7WUFDdEIsQ0FBQyxDQUFDLElBQUEseUNBQW1CLEVBQUM7Z0JBQ3JCLE9BQU8sRUFBRSwyQ0FBa0M7YUFDM0MsQ0FBQyxDQUFBO1FBQ0gsTUFBTSxLQUFLLEdBQUcsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDNUMsSUFBRyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsUUFBUSxFQUFFLENBQUMsQ0FBQTtRQUMxRCxDQUFDO1FBRUQsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFBO0lBQ3JELENBQUM7SUFFRCxPQUFPLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQTtBQUM1QixDQUFDO0FBRUQsU0FBZ0IsZUFBZSxDQUFDLE1BQXFCO0lBQ3BELElBQUcsTUFBTSxLQUFLLG1CQUFhLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDN0MsT0FBTyxPQUFPLENBQUE7SUFDZixDQUFDO0lBRUQsSUFBRyxNQUFNLEtBQUssbUJBQWEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQy9DLE9BQU8sU0FBUyxDQUFBO0lBQ2pCLENBQUM7SUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixNQUFNLEVBQUUsQ0FBQyxDQUFBO0FBQ2hELENBQUM7QUFHRCxTQUFnQixjQUFjLENBQUMsTUFBZ0I7SUFDOUMsSUFBRyxNQUFNLEtBQUssT0FBTyxFQUFFLENBQUM7UUFDdkIsT0FBTyxtQkFBYSxDQUFDLGVBQWUsQ0FBQTtJQUNyQyxDQUFDO0lBRUQsSUFBRyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDekIsT0FBTyxtQkFBYSxDQUFDLGlCQUFpQixDQUFBO0lBQ3ZDLENBQUM7SUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixNQUFNLEVBQUUsQ0FBQyxDQUFBO0FBQ2hELENBQUM7QUFFRCxTQUFTLGdDQUFnQyxDQUN4QyxTQUE4QixFQUM5QixFQUNDLEdBQUcsRUFDSCxFQUFFLEVBQ0YsVUFBVSxFQUNWLGlCQUFpQixFQUNqQixZQUFZLEVBQ1osS0FBSyxHQUNxQjtJQUUzQixNQUFNLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUU5QyxNQUFNLFFBQVEsR0FBRyxZQUFZLEdBQUcsU0FBUyxDQUFBO0lBQ3pDLE1BQU0sTUFBTSxHQUFHLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQTtJQUM3QyxNQUFNLGVBQWUsR0FBRyxVQUFVO1NBQ2hDLEtBQUssQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDekIsTUFBTSxjQUFjLEdBQUcsaUJBQWlCO1NBQ3RDLEtBQUssQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDekIsSUFBRyxJQUFBLDRCQUFlLEVBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztRQUNwQyxPQUFNO0lBQ1AsQ0FBQztJQUVELDZDQUE2QztJQUM3QywwQ0FBMEM7SUFDMUMsdURBQXVEO0lBQ3ZELDZDQUE2QztJQUM3QyxLQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBQyxDQUFDLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzlDLElBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxLQUFLLGdDQUFtQixFQUFFLENBQUM7WUFDOUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLGdDQUFtQixDQUFBO1FBQ3pDLENBQUM7SUFDRixDQUFDO0lBRUQsT0FBTztRQUNOLFFBQVE7UUFDUixpQkFBaUIsRUFBRSxjQUFjO1FBQ2pDLFlBQVksRUFBRSxFQUFFLEdBQUcsRUFBRTtRQUNyQixXQUFXLEVBQUUsRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFO1FBQ3RFLEtBQUs7S0FDTCxDQUFBO0FBQ0YsQ0FBQyJ9
|
|
418
|
+
/**
|
|
419
|
+
* Get the ideal location to generate a ZK proof for a TOPRF block.
|
|
420
|
+
* Ideally it should be put into a slice that's a divisor of the chunk size,
|
|
421
|
+
* as that'll minimize the number of proofs that need to be generated.
|
|
422
|
+
* @returns the offset in bytes
|
|
423
|
+
*/
|
|
424
|
+
function getIdealOffsetForToprfBlock(alg, { dataLocation }) {
|
|
425
|
+
const chunkSizeBytes = getChunkSizeBytes(alg);
|
|
426
|
+
const offsetChunks = Math.floor(dataLocation.fromIndex / chunkSizeBytes) * chunkSizeBytes;
|
|
427
|
+
const endOffsetChunks = Math.floor((dataLocation.fromIndex + dataLocation.length) / chunkSizeBytes);
|
|
428
|
+
// happy case -- the OPRF block fits into a single chunk, that's a
|
|
429
|
+
// divisor of the chunk size
|
|
430
|
+
if (endOffsetChunks === offsetChunks) {
|
|
431
|
+
return offsetChunks * chunkSizeBytes;
|
|
432
|
+
}
|
|
433
|
+
const blockSizeBytes = (0, zk_symmetric_crypto_1.getBlockSizeBytes)(alg);
|
|
434
|
+
const offsetBytes = Math.floor(dataLocation.fromIndex / blockSizeBytes) * blockSizeBytes;
|
|
435
|
+
if ((dataLocation.fromIndex + dataLocation.length) - offsetBytes
|
|
436
|
+
> chunkSizeBytes) {
|
|
437
|
+
throw new error_1.AttestorError('ERROR_BAD_REQUEST', 'OPRF data cannot fit into a single chunk');
|
|
438
|
+
}
|
|
439
|
+
return offsetBytes;
|
|
440
|
+
}
|
|
441
|
+
function sortSlices(slices) {
|
|
442
|
+
return slices.sort((a, b) => a.fromIndex - b.fromIndex);
|
|
443
|
+
}
|
|
444
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemsuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvemsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUErRUEsb0RBZ1FDO0FBS0Qsd0NBc0tDO0FBMEJELHNEQThCQztBQUVELDBEQThCQztBQUVELDBDQVVDO0FBR0Qsd0NBVUM7QUEzbUJELDhDQUErRztBQUMvRyw4RUFleUQ7QUFDekQsdUNBQStHO0FBQy9HLHVDQUEwSDtBQUUxSCx1Q0FBaUU7QUFDakUsMkNBQStDO0FBQy9DLGlEQUFrSDtBQUNsSCw2Q0FBbUQ7QUFDbkQscURBQWtIO0FBa0RsSCxNQUFNLGNBQWMsR0FBRyxDQUFDLENBQ3ZCLElBQUEsb0JBQWMsRUFBQyxnQkFBZ0IsQ0FBQztPQUM3QiwrQkFBc0IsQ0FDekIsQ0FBQTtBQUVNLEtBQUssVUFBVSxvQkFBb0IsQ0FDekMsRUFDQyxXQUFXLEVBQ1gsYUFBYSxFQUNiLE1BQU0sR0FBRyxlQUFNLEVBQ2Ysa0JBQWtCLEdBQUcsY0FBYyxFQUNuQyxXQUFXLEVBQ1gsUUFBUSxHQUFHLFNBQVMsRUFDQztJQUd0QixNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQ25ELE1BQU0sT0FBTyxHQUFHLElBQUksTUFBTSxDQUFDO1FBQzFCLFdBQVcsRUFBRSxrQkFBa0I7UUFDL0IsU0FBUyxFQUFFLElBQUk7S0FDZixDQUFDLENBQUE7SUFFRixNQUFNLGNBQWMsR0FBc0IsRUFBRSxDQUFBO0lBRTVDLE1BQU0sR0FBRyxDQUFDLE1BQU0sSUFBSSxlQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBQ3ZFLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQTtJQUVyQixPQUFPO1FBQ047Ozs7O1dBS0c7UUFDSCxLQUFLLENBQUMsZ0JBQWdCLENBQ3JCLE1BQXlCLEVBQ3pCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFnQixFQUMzQyxpQkFBdUQ7WUFFdkQsSUFBRyxNQUFNLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBRSxDQUFDO2dCQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUE7WUFDdkQsQ0FBQztZQUVELE1BQU0sR0FBRyxHQUFHLElBQUEsdUNBQTRCLEVBQUMsV0FBVyxDQUFDLENBQUE7WUFDckQsTUFBTSxjQUFjLEdBQUcsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUE7WUFFN0MsTUFBTSxHQUFHLEdBQUcsTUFBTSxZQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUNqRCxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFBO1lBQ3BCLE1BQU0sVUFBVSxHQUFHLElBQUEsNEJBQWlCLEVBQ25DLE1BQU0sQ0FBQyxVQUFVLEVBQ2pCLFdBQVcsQ0FDWCxDQUFBO1lBQ0QsTUFBTSxhQUFhLEdBQW9CO2dCQUN0QyxpQkFBaUI7Z0JBQ2pCLFNBQVMsRUFBRSxHQUFHO2dCQUNkLGdCQUFnQixFQUFFLEVBQUU7Z0JBQ3BCLEVBQUUsRUFBRSxNQUFNLENBQUMsT0FBTzthQUNsQixDQUFBO1lBQ0QsTUFBTSxVQUFVLEdBQWlCLEVBQUUsQ0FBQTtZQUNuQyxzQ0FBc0M7WUFDdEMsMkRBQTJEO1lBQzNELGdEQUFnRDtZQUNoRCxLQUFJLE1BQU0sS0FBSyxJQUFJLE1BQU0sSUFBSSxFQUFFLEVBQUUsQ0FBQztnQkFDakMsTUFBTSxTQUFTLEdBQUcsMkJBQTJCLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFBO2dCQUN6RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxjQUFjLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFBO2dCQUV2RSxtRUFBbUU7Z0JBQ25FLE1BQU0sS0FBSyxHQUFlLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFBO2dCQUNoRCxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtnQkFFMUIsbUJBQW1CLENBQ2xCLEtBQUssRUFDTDtvQkFDQyxHQUFHLEtBQUs7b0JBQ1IsWUFBWSxFQUFFO3dCQUNiLEdBQUcsS0FBSyxDQUFDLFlBQWE7d0JBQ3RCLFNBQVMsRUFBRSxLQUFLLENBQUMsWUFBYSxDQUFDLFNBQVMsR0FBRyxTQUFTO3FCQUNwRDtpQkFDRCxDQUNELENBQUE7WUFDRixDQUFDO1lBRUQsa0VBQWtFO1lBQ2xFLGlFQUFpRTtZQUNqRSxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUE7WUFDL0MsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFBO1lBQ2pCLEtBQUksTUFBTSxJQUFJLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQzVCLElBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLEVBQUUsQ0FBQztvQkFDL0IsbUJBQW1CLENBQUM7d0JBQ25CLFNBQVM7d0JBQ1QsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTO3FCQUN2QixDQUFDLENBQUE7Z0JBQ0gsQ0FBQztnQkFFRCxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQTtZQUN6QixDQUFDO1lBRUQsSUFBRyxTQUFTLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNsQyxtQkFBbUIsQ0FBQztvQkFDbkIsU0FBUztvQkFDVCxPQUFPLEVBQUUsVUFBVSxDQUFDLE1BQU07aUJBQzFCLENBQUMsQ0FBQTtZQUNILENBQUM7WUFFRCwwQ0FBMEM7WUFDMUMsYUFBYSxDQUFDLGdCQUFnQjtpQkFDNUIsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDekMsY0FBYyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQTtZQUVsQyxTQUFTLG1CQUFtQixDQUFDLEtBQWlCO2dCQUM3QyxLQUFJLE1BQU0sSUFBSSxJQUFJLFVBQVUsRUFBRSxDQUFDO29CQUM5QjtvQkFDQyxpQkFBaUI7b0JBQ2pCLEtBQUssQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU87MkJBQzFCLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFDakMsQ0FBQzt3QkFDRixNQUFNLElBQUkscUJBQWEsQ0FDdEIsbUJBQW1CLEVBQ25CLGlDQUFpQyxDQUNqQyxDQUFBO29CQUNGLENBQUM7Z0JBQ0YsQ0FBQztZQUNGLENBQUM7WUFFRCxTQUFTLG1CQUFtQixDQUMzQixFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQWMsRUFDbEMsS0FBd0I7Z0JBRXhCLEtBQUksSUFBSSxDQUFDLEdBQUcsU0FBUyxFQUFDLENBQUMsR0FBRyxPQUFPLEVBQUMsQ0FBQyxJQUFJLGNBQWMsRUFBRSxDQUFDO29CQUN2RCxNQUFNLEtBQUssR0FBZTt3QkFDekIsU0FBUyxFQUFFLENBQUM7d0JBQ1osT0FBTyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLGNBQWMsRUFBRSxPQUFPLENBQUM7cUJBQzlDLENBQUE7b0JBRUQsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtvQkFDdEIsTUFBTSxXQUFXLEdBQUcsZ0NBQWdDLENBQ25EO3dCQUNDLEdBQUc7d0JBQ0gsRUFBRTt3QkFDRixVQUFVO3dCQUNWLGlCQUFpQjt3QkFDakIsS0FBSzt3QkFDTCxLQUFLO3FCQUNMLENBQ0QsQ0FBQTtvQkFFRCxJQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7d0JBQ2pCLFNBQVE7b0JBQ1QsQ0FBQztvQkFFRCxhQUFhLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFBO29CQUNoRCxhQUFhLElBQUksQ0FBQyxDQUFBO2dCQUNuQixDQUFDO1lBQ0YsQ0FBQztRQUNGLENBQUM7UUFDRCxxQkFBcUI7WUFDcEIsT0FBTyxhQUFhLENBQUE7UUFDckIsQ0FBQztRQUNELEtBQUssQ0FBQyxjQUFjLENBQUMsV0FBd0I7O1lBQzVDLElBQUcsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQzNCLE9BQU07WUFDUCxDQUFDO1lBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFBO1lBQ3hCLE1BQU0sS0FBSyxHQUFvQixFQUFFLENBQUE7WUFDakMsS0FBSSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLElBQUksY0FBYyxFQUFFLENBQUM7Z0JBQ2hGLE1BQU0sTUFBTSxHQUFjLEVBQUUsQ0FBQTtnQkFFNUIsSUFBSSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFBO2dCQUN4QyxLQUFJLE1BQU0sVUFBVSxJQUFJLGdCQUFnQixFQUFFLENBQUM7b0JBQzFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUcsRUFBRTt3QkFDaEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxxQkFBcUIsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUE7d0JBRWhFLFdBQVcsYUFBWCxXQUFXLHVCQUFYLFdBQVcsRUFBSSxDQUFBO3dCQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7d0JBRWxCLFVBQVUsSUFBSSxDQUFDLENBQUE7d0JBQ2YsSUFBRyxVQUFVLEtBQUssQ0FBQyxFQUFFLENBQUM7NEJBQ3JCLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFBO3dCQUMxQixDQUFDO29CQUNGLENBQUMsRUFBRSxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUE7Z0JBQzlCLENBQUM7WUFDRixDQUFDO1lBRUQsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBRXhCLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxJQUFJLENBQ1gsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssRUFBRSxhQUFhLEVBQUUsRUFDakQscUJBQXFCLENBQ3JCLENBQUE7WUFFRCw2QkFBNkI7WUFDN0IsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQy9DLGFBQWEsR0FBRyxDQUFDLENBQUE7WUFFakIseUNBQXlDO1lBQ3pDLE1BQU0sR0FBRyxHQUFHLElBQUEsdUNBQTRCLEVBQUMsV0FBVyxDQUFDLENBQUE7WUFDckQsTUFBTSxVQUFVLEdBQUcsTUFBTSx5QkFBeUIsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUN2RCxNQUFBLFVBQVUsQ0FBQyxPQUFPLDBEQUFJLENBQUE7UUFDdkIsQ0FBQztLQUNELENBQUE7SUFFRCxLQUFLLFVBQVUscUJBQXFCLENBQ25DLFNBQThCLEVBQzlCLEVBQ0MsUUFBUSxFQUFFLGlCQUFpQixFQUMzQixZQUFZLEVBQUUsV0FBVyxFQUN6QixLQUFLLEdBQ2M7UUFFcEIsTUFBTSxRQUFRLEdBQUcsS0FBSztZQUNyQixDQUFDLENBQUMsMkJBQTJCLENBQUMsU0FBUyxDQUFDO1lBQ3hDLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUN2QyxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUEsbUNBQWEsRUFDaEM7WUFDQyxTQUFTO1lBQ1QsWUFBWTtZQUNaLFdBQVc7WUFDWCxRQUFRO1lBQ1IsTUFBTTtZQUNOLEdBQUcsQ0FDRixLQUFLO2dCQUNKLENBQUMsQ0FBQztvQkFDRCxLQUFLLEVBQUU7d0JBQ04sR0FBRyxFQUFFLEtBQUssQ0FBQyxZQUFhLENBQUMsU0FBUzt3QkFDbEMsR0FBRyxFQUFFLEtBQUssQ0FBQyxZQUFhLENBQUMsTUFBTTt3QkFDL0IsTUFBTSxFQUFFLEtBQUssQ0FBQyxTQUFTO3dCQUN2QixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7d0JBQzFCLGVBQWUsRUFBRSwrQkFBc0I7cUJBQ3ZDO29CQUNELElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtpQkFDaEI7Z0JBQ0QsQ0FBQyxDQUFDLEVBQUUsQ0FDTDtTQUNELENBQ0QsQ0FBQTtRQUVELE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxLQUFLLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSwyQkFBMkIsQ0FBQyxDQUFBO1FBRXhELE9BQU87WUFDTiwwQkFBMEI7WUFDMUIsU0FBUyxFQUFFLEVBQUU7WUFDYixTQUFTLEVBQUUsT0FBTyxLQUFLLENBQUMsU0FBUyxLQUFLLFFBQVE7Z0JBQzdDLENBQUMsQ0FBQyxJQUFBLHFCQUFlLEVBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztnQkFDbEMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTO1lBQ2xCLEtBQUs7WUFDTCwyQkFBMkIsRUFBRSxLQUFLLENBQUMsU0FBUztZQUM1QyxpQkFBaUI7WUFDakIsUUFBUTtTQUNSLENBQUE7SUFDRixDQUFDO0lBRUQsU0FBUyx5QkFBeUIsQ0FBQyxTQUE4QjtRQUNoRSxPQUFPLENBQUEsV0FBVyxhQUFYLFdBQVcsdUJBQVgsV0FBVyxDQUFHLFNBQVMsQ0FBQztlQUMzQixxQkFBcUIsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFBO0lBQ3ZELENBQUM7SUFFRCxTQUFTLDJCQUEyQixDQUFDLFNBQThCO1FBQ2xFLE9BQU8sQ0FBQSxhQUFhLGFBQWIsYUFBYSx1QkFBYixhQUFhLENBQUcsU0FBUyxDQUFDO2VBQzdCLHVCQUF1QixDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDekQsQ0FBQztBQUNGLENBQUM7QUFFRDs7R0FFRztBQUNJLEtBQUssVUFBVSxjQUFjLENBQ25DLEVBQ0MsV0FBVyxFQUNYLFVBQVUsRUFDVixRQUFRLEVBQ1IsV0FBVyxFQUNYLGFBQWEsRUFDYixNQUFNLEdBQUcsZUFBTSxFQUNmLFFBQVEsR0FBRyxTQUFTLEVBQ3BCLEVBQUUsRUFDRixZQUFZLEVBQ0U7SUFFZixJQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxNQUFNLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFBO0lBQ2hDLENBQUM7SUFFRCxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFBO0lBQzNCLE1BQU0sU0FBUyxHQUFHLElBQUEsdUNBQTRCLEVBQUMsV0FBVyxDQUFDLENBQUE7SUFFM0QsTUFBTSxRQUFRLEdBQUcsSUFBQSxzQkFBVyxFQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQTtJQUNyRCxVQUFVLEdBQUcsSUFBQSw0QkFBaUIsRUFBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUE7SUFDdkQ7Ozs7OztPQU1HO0lBQ0gsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLFVBQVUsQ0FDM0MsVUFBVSxDQUFDLE1BQU0sQ0FDakIsQ0FBQyxJQUFJLENBQUMsZ0NBQW1CLENBQUMsQ0FBQTtJQUUzQixNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUM1QixJQUFJLENBQUM7WUFDSixNQUFNLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQy9CLENBQUM7UUFBQyxPQUFNLENBQUMsRUFBRSxDQUFDO1lBQ1gsQ0FBQyxDQUFDLE9BQU8sSUFBSSxXQUFXLENBQUMsY0FBYyxLQUFLLENBQUMsUUFBUSxHQUFHLENBQUE7WUFDeEQsTUFBTSxDQUFDLENBQUE7UUFDUixDQUFDO0lBQ0YsQ0FBQyxDQUFDLENBQ0YsQ0FBQTtJQUVELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxxQkFBcUIsRUFBRSxDQUFBO0lBRW5ELEtBQUssVUFBVSxpQkFBaUIsQ0FDL0IsRUFDQyxTQUFTLEVBQ1QsU0FBUyxFQUNULDJCQUEyQixFQUMzQixpQkFBaUIsRUFDakIsUUFBUSxFQUNSLEtBQUssR0FDSTs7UUFFVix1REFBdUQ7UUFDdkQsMERBQTBEO1FBQzFELDZEQUE2RDtRQUM3RCxNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUN2QyxRQUFRLEVBQ1IsUUFBUSxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FDbkMsQ0FBQTtRQUNELDZDQUE2QztRQUM3QywwQ0FBMEM7UUFDMUMsdURBQXVEO1FBQ3ZELDZDQUE2QztRQUM3QyxLQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBQyxDQUFDLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzlDLElBQUcsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEtBQUssZ0NBQW1CLEVBQUUsQ0FBQztnQkFDakQsZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLGdDQUFtQixDQUFBO1lBQ3pDLENBQUM7UUFDRixDQUFDO1FBRUQscURBQXFEO1FBQ3JELDJCQUEyQjtRQUMzQixJQUFJLGdCQUFnQixHQUFHLGlCQUFpQixDQUFBO1FBQ3hDLElBQUcsS0FBSyxFQUFFLENBQUM7WUFDVixnQkFBZ0IsR0FBRyxJQUFJLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO1lBQ3BELEtBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsWUFBYSxDQUFDLE1BQU0sRUFBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNsRCxnQkFBZ0IsQ0FDZixDQUFDLEdBQUcsS0FBSyxDQUFDLFlBQWEsQ0FBQyxTQUFTLENBQ2pDLEdBQUcsZ0NBQW1CLENBQUE7WUFDeEIsQ0FBQztZQUVELG1EQUFtRDtZQUNuRCxpREFBaUQ7WUFDakQsa0RBQWtEO1lBQ2xELDZCQUE2QjtZQUM3QixNQUFNLFdBQVcsR0FBRyxJQUFBLDRCQUFlLEVBQ2xDLEtBQUssQ0FBQyxTQUFTLEVBQ2YsS0FBSyxDQUFDLFlBQWEsQ0FBQyxNQUFNLENBQzFCLENBQUE7WUFDRCxNQUFNLE9BQU8sR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLENBQ3RDLE1BQUEsS0FBSyxDQUFDLFlBQVksMENBQUUsU0FBUyxFQUM3QixDQUFBLE1BQUEsS0FBSyxDQUFDLFlBQVksMENBQUUsU0FBVTttQkFDM0IsTUFBQSxLQUFLLENBQUMsWUFBWSwwQ0FBRSxNQUFPLENBQUEsQ0FDOUIsQ0FBQTtZQUNELElBQ0MsSUFBQSwwQkFBZSxFQUFDLE9BQU8sQ0FBQyxLQUFLLFdBQVc7aUJBQ3RDLEtBQUssQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUN6QixDQUFDO2dCQUNGLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQTtZQUNoRCxDQUFDO1FBQ0YsQ0FBQztRQUVELElBQUcsQ0FBQyxJQUFBLGlDQUFvQixFQUN2QixnQkFBZ0IsRUFDaEIsMkJBQTJCLENBQzNCLEVBQUUsQ0FBQztZQUNILE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQTtRQUNyRCxDQUFDO1FBRUQsSUFBSSxLQUFLLEdBQUcsSUFBQSw0QkFBc0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFBO1FBQ2xELElBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDckIsS0FBSyxHQUFHLElBQUEsZ0JBQVUsRUFBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUE7UUFDeEMsQ0FBQztRQUVELE1BQU0sSUFBQSxpQ0FBVyxFQUNoQjtZQUNDLEtBQUssRUFBRTtnQkFDTixTQUFTO2dCQUNULFNBQVMsRUFBRSxTQUFTLENBQUMsTUFBTTtvQkFDMUIsQ0FBQyxDQUFDLFNBQVM7b0JBQ1gsQ0FBQyxDQUFDLElBQUEscUJBQWUsRUFBQyxTQUFTLENBQUM7Z0JBQzdCLFNBQVMsRUFBRSwyQkFBMkI7YUFDdEM7WUFDRCxXQUFXLEVBQUU7Z0JBQ1osVUFBVSxFQUFFLGVBQWU7Z0JBQzNCLEVBQUUsRUFBRSxLQUFLO2dCQUNULFdBQVcsRUFBRSxRQUFRO2FBQ3JCO1lBQ0QsTUFBTTtZQUNOLEdBQUcsQ0FDRixLQUFLO2dCQUNKLENBQUMsQ0FBQztvQkFDRCxRQUFRLEVBQUUsZUFBZSxFQUFFO29CQUMzQixLQUFLLEVBQUU7d0JBQ04sR0FBRyxFQUFFLEtBQUssQ0FBQyxZQUFhLENBQUMsU0FBUzt3QkFDbEMsR0FBRyxFQUFFLEtBQUssQ0FBQyxZQUFhLENBQUMsTUFBTTt3QkFDL0IsZUFBZSxFQUFFLCtCQUFzQjt3QkFDdkMsTUFBTSxFQUFFLEtBQUssQ0FBQyxTQUFTO3dCQUN2QixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7cUJBQzFCO2lCQUNEO2dCQUNELENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsRUFBRSxDQUNoQztTQUNELENBQ0QsQ0FBQTtRQUVELE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxLQUFLLENBQ1osRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsRUFDekQsZ0JBQWdCLENBQ2hCLENBQUE7UUFFRCxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDdkQsQ0FBQztJQUVELFNBQVMsYUFBYTtRQUNyQixPQUFPLENBQUEsV0FBVyxhQUFYLFdBQVcsdUJBQVgsV0FBVyxDQUFHLFNBQVMsQ0FBQztlQUMzQixxQkFBcUIsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFBO0lBQ3ZELENBQUM7SUFFRCxTQUFTLGVBQWU7UUFDdkIsT0FBTyxDQUFBLGFBQWEsYUFBYixhQUFhLHVCQUFiLGFBQWEsQ0FBRyxTQUFTLENBQUM7ZUFDN0IsdUJBQXVCLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQTtJQUN6RCxDQUFDO0FBQ0YsQ0FBQztBQUVELDRDQUE0QztBQUM1QyxpQ0FBaUM7QUFDakMsU0FBUyxpQkFBaUIsQ0FBQyxHQUF3QjtJQUNsRCxNQUFNLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxHQUFHLDRCQUFTLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDakQsT0FBTyxTQUFTLEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FBQTtBQUNuQyxDQUFDO0FBRUQsTUFBTSxTQUFTLEdBRVgsRUFBRSxDQUFBO0FBRU4sTUFBTSxXQUFXLEdBRWIsRUFBRSxDQUFBO0FBRU4sTUFBTSxjQUFjLEdBQXVFO0lBQzFGLFNBQVMsRUFBRSwyQ0FBcUI7SUFDaEMsT0FBTyxFQUFFLHlDQUFtQjtDQUM1QixDQUFBO0FBRUQsTUFBTSxvQkFBb0IsR0FBK0M7SUFDeEUsT0FBTyxFQUFFLDJDQUFxQjtDQUM5QixDQUFBO0FBRUQsU0FBZ0IscUJBQXFCLENBQ3BDLFNBQThCLEVBQzlCLFFBQWtCLEVBQ2xCLE1BQWM7SUFFZCxJQUFJLFdBQVcsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDckMsSUFBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2pCLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUE7UUFDeEIsV0FBVyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUNsQyxDQUFDO0lBRUQsSUFBRyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQzVCLE1BQU0sTUFBTSxHQUFHLElBQUEsdUJBQWlCLEdBQUUsS0FBSyxNQUFNLENBQUE7UUFDN0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQTtRQUMxQyxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsRUFBRSxzQkFBc0IsQ0FBQyxDQUFBO1FBRWpFLE1BQU0sT0FBTyxHQUFHLE1BQU0sS0FBSyxPQUFPO1lBQ2pDLENBQUMsQ0FBQyxJQUFBLHdDQUFrQixHQUFFO1lBQ3RCLENBQUMsQ0FBQyxJQUFBLHlDQUFtQixFQUFDO2dCQUNyQixPQUFPLEVBQUUsMkNBQWtDO2FBQzNDLENBQUMsQ0FBQTtRQUNILE1BQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN0QyxJQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixRQUFRLEVBQUUsQ0FBQyxDQUFBO1FBQ3hELENBQUM7UUFFRCxXQUFXLENBQUMsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUE7SUFDdkQsQ0FBQztJQUVELE9BQU8sV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFBO0FBQzlCLENBQUM7QUFFRCxTQUFnQix1QkFBdUIsQ0FDdEMsU0FBOEIsRUFDOUIsUUFBa0IsRUFDbEIsTUFBYztJQUVkLElBQUksU0FBUyxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUNyQyxJQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDZixXQUFXLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFBO1FBQzFCLFNBQVMsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDbEMsQ0FBQztJQUVELElBQUcsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUMxQixNQUFNLE1BQU0sR0FBRyxJQUFBLHVCQUFpQixHQUFFLEtBQUssTUFBTSxDQUFBO1FBQzdDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUE7UUFDeEMsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsRUFBRSx3QkFBd0IsQ0FBQyxDQUFBO1FBRTNELE1BQU0sT0FBTyxHQUFHLElBQUksS0FBSyxPQUFPO1lBQy9CLENBQUMsQ0FBQyxJQUFBLHdDQUFrQixHQUFFO1lBQ3RCLENBQUMsQ0FBQyxJQUFBLHlDQUFtQixFQUFDO2dCQUNyQixPQUFPLEVBQUUsMkNBQWtDO2FBQzNDLENBQUMsQ0FBQTtRQUNILE1BQU0sS0FBSyxHQUFHLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzVDLElBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLFFBQVEsRUFBRSxDQUFDLENBQUE7UUFDMUQsQ0FBQztRQUVELFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQTtJQUNyRCxDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUE7QUFDNUIsQ0FBQztBQUVELFNBQWdCLGVBQWUsQ0FBQyxNQUFxQjtJQUNwRCxJQUFHLE1BQU0sS0FBSyxtQkFBYSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzdDLE9BQU8sT0FBTyxDQUFBO0lBQ2YsQ0FBQztJQUVELElBQUcsTUFBTSxLQUFLLG1CQUFhLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUMvQyxPQUFPLFNBQVMsQ0FBQTtJQUNqQixDQUFDO0lBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsTUFBTSxFQUFFLENBQUMsQ0FBQTtBQUNoRCxDQUFDO0FBR0QsU0FBZ0IsY0FBYyxDQUFDLE1BQWdCO0lBQzlDLElBQUcsTUFBTSxLQUFLLE9BQU8sRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sbUJBQWEsQ0FBQyxlQUFlLENBQUE7SUFDckMsQ0FBQztJQUVELElBQUcsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sbUJBQWEsQ0FBQyxpQkFBaUIsQ0FBQTtJQUN2QyxDQUFDO0lBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsTUFBTSxFQUFFLENBQUMsQ0FBQTtBQUNoRCxDQUFDO0FBRUQsU0FBUyxnQ0FBZ0MsQ0FDeEMsRUFDQyxHQUFHLEVBQ0gsRUFBRSxFQUNGLFVBQVUsRUFDVixpQkFBaUIsRUFDakIsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxFQUM3QixLQUFLLEdBQ3FCO0lBRTNCLE1BQU0sZUFBZSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQzVELE1BQU0sY0FBYyxHQUFHLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDbEUsSUFBRyxJQUFBLDRCQUFlLEVBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztRQUNwQyxPQUFNO0lBQ1AsQ0FBQztJQUVELDZDQUE2QztJQUM3QywwQ0FBMEM7SUFDMUMsdURBQXVEO0lBQ3ZELDZDQUE2QztJQUM3QyxLQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBQyxDQUFDLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzlDLElBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxLQUFLLGdDQUFtQixFQUFFLENBQUM7WUFDOUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLGdDQUFtQixDQUFBO1FBQ3pDLENBQUM7SUFDRixDQUFDO0lBRUQsT0FBTztRQUNOLFFBQVEsRUFBRSxTQUFTO1FBQ25CLGlCQUFpQixFQUFFLGNBQWM7UUFDakMsWUFBWSxFQUFFLEVBQUUsR0FBRyxFQUFFO1FBQ3JCLFdBQVcsRUFBRSxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUU7UUFDeEUsS0FBSztLQUNMLENBQUE7QUFDRixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLDJCQUEyQixDQUNuQyxHQUF3QixFQUN4QixFQUFFLFlBQVksRUFBb0I7SUFFbEMsTUFBTSxjQUFjLEdBQUcsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDN0MsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDOUIsWUFBYSxDQUFDLFNBQVMsR0FBRyxjQUFjLENBQ3hDLEdBQUcsY0FBYyxDQUFBO0lBQ2xCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQ2pDLENBQUMsWUFBYSxDQUFDLFNBQVMsR0FBRyxZQUFhLENBQUMsTUFBTSxDQUFDLEdBQUcsY0FBYyxDQUNqRSxDQUFBO0lBRUQsa0VBQWtFO0lBQ2xFLDRCQUE0QjtJQUM1QixJQUFHLGVBQWUsS0FBSyxZQUFZLEVBQUUsQ0FBQztRQUNyQyxPQUFPLFlBQVksR0FBRyxjQUFjLENBQUE7SUFDckMsQ0FBQztJQUVELE1BQU0sY0FBYyxHQUFHLElBQUEsdUNBQWlCLEVBQUMsR0FBRyxDQUFDLENBQUE7SUFDN0MsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDN0IsWUFBYSxDQUFDLFNBQVMsR0FBRyxjQUFjLENBQ3hDLEdBQUcsY0FBYyxDQUFBO0lBQ2xCLElBQ0MsQ0FBQyxZQUFhLENBQUMsU0FBUyxHQUFHLFlBQWEsQ0FBQyxNQUFNLENBQUMsR0FBRyxXQUFXO1VBQzNELGNBQWMsRUFDaEIsQ0FBQztRQUNGLE1BQU0sSUFBSSxxQkFBYSxDQUN0QixtQkFBbUIsRUFDbkIsMENBQTBDLENBQzFDLENBQUE7SUFDRixDQUFDO0lBRUQsT0FBTyxXQUFXLENBQUE7QUFDbkIsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLE1BQW9CO0lBQ3ZDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFBO0FBQ3hELENBQUMifQ==
|
package/lib/window-rpc/utils.js
CHANGED
|
@@ -24,7 +24,7 @@ async function getCurrentMemoryUsage() {
|
|
|
24
24
|
}
|
|
25
25
|
else {
|
|
26
26
|
try {
|
|
27
|
-
const result =
|
|
27
|
+
const result = performance.measureUserAgentSpecificMemory();
|
|
28
28
|
const totalmb = Math.round(result.bytes / 1024 / 1024);
|
|
29
29
|
return {
|
|
30
30
|
available: true,
|
|
@@ -99,4 +99,4 @@ function waitForResponse(type, requestId, bridge, timeoutMs = 60000) {
|
|
|
99
99
|
});
|
|
100
100
|
});
|
|
101
101
|
}
|
|
102
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
102
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd2luZG93LXJwYy91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQU9BLHNEQStCQztBQUVELG9EQUVDO0FBTUQsMERBSUM7QUFFRCw0REFzQkM7QUFFRCwwQ0FxQ0M7QUFuSEQsbUNBQStCO0FBQy9CLHVDQUF3QztBQUV4QyxxQ0FBcUU7QUFHckUscUJBQXFCO0FBQ2QsS0FBSyxVQUFVLHFCQUFxQjtJQUMxQyxJQUFHLENBQUMsTUFBTSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDaEMsT0FBTztZQUNOLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLE9BQU8sRUFBRSxzQ0FBc0M7U0FDL0MsQ0FBQTtJQUNGLENBQUM7U0FBTSxJQUFHLENBQUMsV0FBVyxDQUFDLDhCQUE4QixFQUFFLENBQUM7UUFDdkQsT0FBTztZQUNOLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLE9BQU8sRUFBRSxxRUFBcUU7U0FDOUUsQ0FBQTtJQUNGLENBQUM7U0FBTSxDQUFDO1FBQ1AsSUFBSSxDQUFDO1lBQ0osTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLDhCQUE4QixFQUFFLENBQUE7WUFDM0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQTtZQUV0RCxPQUFPO2dCQUNOLFNBQVMsRUFBRSxJQUFJO2dCQUNmLE9BQU8sRUFBRSxHQUFHLE9BQU8sSUFBSTthQUN2QixDQUFBO1FBQ0YsQ0FBQztRQUFDLE9BQU0sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFHLEtBQUssWUFBWSxZQUFZLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxlQUFlLEVBQUUsQ0FBQztnQkFDcEUsT0FBTztvQkFDTixTQUFTLEVBQUUsS0FBSztvQkFDaEIsT0FBTyxFQUFFLFFBQVEsS0FBSyxDQUFDLE9BQU8sR0FBRztpQkFDakMsQ0FB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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reclaimprotocol/attestor-core",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.1",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "lib/index",
|
|
6
6
|
"scripts": {
|
|
@@ -30,7 +30,8 @@
|
|
|
30
30
|
"start:chain": "bash ./avs/utils/anvil/start-anvil-chain-with-el-and-avs-deployed.sh",
|
|
31
31
|
"commitlint": "commitlint --edit",
|
|
32
32
|
"download:zk-files": "node node_modules/@reclaimprotocol/zk-symmetric-crypto/lib/scripts/download-files",
|
|
33
|
-
"generate:toprf-keys": "npm run run:tsc -- src/scripts/generate-toprf-keys.ts"
|
|
33
|
+
"generate:toprf-keys": "npm run run:tsc -- src/scripts/generate-toprf-keys.ts",
|
|
34
|
+
"publish:pkg": "npm publish --access public"
|
|
34
35
|
},
|
|
35
36
|
"files": [
|
|
36
37
|
"lib/*"
|
|
@@ -66,7 +67,7 @@
|
|
|
66
67
|
"@commitlint/cli": "^17.8.1",
|
|
67
68
|
"@commitlint/config-conventional": "^17.8.1",
|
|
68
69
|
"@reclaimprotocol/tls": "github:reclaimprotocol/tls",
|
|
69
|
-
"@reclaimprotocol/zk-symmetric-crypto": "^3.0.
|
|
70
|
+
"@reclaimprotocol/zk-symmetric-crypto": "^3.0.5",
|
|
70
71
|
"ajv": "^8.17.1",
|
|
71
72
|
"canonicalize": "^2.0.0",
|
|
72
73
|
"dotenv": "^16.4.6",
|
|
@@ -1,209 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const tls_1 = require("@reclaimprotocol/tls");
|
|
4
|
-
const utils_1 = require("ethers/lib/utils");
|
|
5
|
-
const config_1 = require("../../config");
|
|
6
|
-
const utils_2 = require("../../providers/http/utils");
|
|
7
|
-
const utils_3 = require("../../utils");
|
|
8
|
-
const HTTP_BASE64_PROVIDER = {
|
|
9
|
-
hostPort: getHostPort,
|
|
10
|
-
writeRedactionMode(params) {
|
|
11
|
-
return ('writeRedactionMode' in params)
|
|
12
|
-
? params.writeRedactionMode
|
|
13
|
-
: undefined;
|
|
14
|
-
},
|
|
15
|
-
geoLocation(params) {
|
|
16
|
-
return ('geoLocation' in params)
|
|
17
|
-
? getGeoLocation(params)
|
|
18
|
-
: undefined;
|
|
19
|
-
},
|
|
20
|
-
additionalClientOptions(params) {
|
|
21
|
-
let defaultOptions = {
|
|
22
|
-
applicationLayerProtocols: ['http/1.1']
|
|
23
|
-
};
|
|
24
|
-
if ('additionalClientOptions' in params) {
|
|
25
|
-
defaultOptions = {
|
|
26
|
-
...defaultOptions,
|
|
27
|
-
...params.additionalClientOptions
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
return defaultOptions;
|
|
31
|
-
},
|
|
32
|
-
createRequest(secretParams, params) {
|
|
33
|
-
if (!secretParams.cookieStr &&
|
|
34
|
-
!secretParams.authorisationHeader &&
|
|
35
|
-
!secretParams.headers) {
|
|
36
|
-
throw new Error('auth parameters are not set');
|
|
37
|
-
}
|
|
38
|
-
const pubHeaders = params.headers || {};
|
|
39
|
-
const secHeaders = { ...secretParams.headers };
|
|
40
|
-
if (secretParams.cookieStr) {
|
|
41
|
-
secHeaders['Cookie'] = secretParams.cookieStr;
|
|
42
|
-
}
|
|
43
|
-
if (secretParams.authorisationHeader) {
|
|
44
|
-
secHeaders['Authorization'] = secretParams.authorisationHeader;
|
|
45
|
-
}
|
|
46
|
-
const hasUserAgent = Object.keys(pubHeaders)
|
|
47
|
-
.some(k => k.toLowerCase() === 'user-agent') ||
|
|
48
|
-
Object.keys(secHeaders)
|
|
49
|
-
.some(k => k.toLowerCase() === 'user-agent');
|
|
50
|
-
if (!hasUserAgent) {
|
|
51
|
-
//only set user-agent if not set by provider
|
|
52
|
-
pubHeaders['User-Agent'] = config_1.RECLAIM_USER_AGENT;
|
|
53
|
-
}
|
|
54
|
-
const url = new URL(params.url);
|
|
55
|
-
const { pathname } = url;
|
|
56
|
-
const searchParams = params.url.includes('?') ? params.url.split('?')[1] : '';
|
|
57
|
-
utils_3.logger.info({ url: params.url, path: pathname, query: searchParams.toString() });
|
|
58
|
-
const body = params.body instanceof Uint8Array
|
|
59
|
-
? params.body
|
|
60
|
-
: (0, tls_1.strToUint8Array)(params.body || '');
|
|
61
|
-
const contentLength = body.length;
|
|
62
|
-
const reqLine = `${params.method} ${pathname}${(searchParams === null || searchParams === void 0 ? void 0 : searchParams.length) ? '?' + searchParams : ''} HTTP/1.1`;
|
|
63
|
-
const secHeadersList = (0, utils_2.buildHeaders)(secHeaders);
|
|
64
|
-
utils_3.logger.info({ requestLine: reqLine });
|
|
65
|
-
const httpReqHeaderStr = [
|
|
66
|
-
reqLine,
|
|
67
|
-
`Host: ${getHostHeaderString(url)}`,
|
|
68
|
-
`Content-Length: ${contentLength}`,
|
|
69
|
-
'Connection: close',
|
|
70
|
-
//no compression
|
|
71
|
-
'Accept-Encoding: identity',
|
|
72
|
-
...(0, utils_2.buildHeaders)(pubHeaders),
|
|
73
|
-
...secHeadersList,
|
|
74
|
-
'\r\n',
|
|
75
|
-
].join('\r\n');
|
|
76
|
-
const headerStr = (0, tls_1.strToUint8Array)(httpReqHeaderStr);
|
|
77
|
-
const data = (0, tls_1.concatenateUint8Arrays)([headerStr, body]);
|
|
78
|
-
// hide all secret headers
|
|
79
|
-
const secHeadersStr = secHeadersList.join('\r\n');
|
|
80
|
-
const tokenStartIndex = (0, utils_3.findIndexInUint8Array)(data, (0, tls_1.strToUint8Array)(secHeadersStr));
|
|
81
|
-
const redactions = [
|
|
82
|
-
{
|
|
83
|
-
fromIndex: tokenStartIndex,
|
|
84
|
-
toIndex: tokenStartIndex + secHeadersStr.length,
|
|
85
|
-
}
|
|
86
|
-
];
|
|
87
|
-
return {
|
|
88
|
-
data,
|
|
89
|
-
redactions: redactions,
|
|
90
|
-
};
|
|
91
|
-
},
|
|
92
|
-
getResponseRedactions() {
|
|
93
|
-
return [];
|
|
94
|
-
},
|
|
95
|
-
assertValidProviderReceipt(receipt, params) {
|
|
96
|
-
var _a;
|
|
97
|
-
const extractedParams = {};
|
|
98
|
-
const req = (0, utils_3.getHttpRequestDataFromTranscript)(receipt);
|
|
99
|
-
if (req.method !== params.method.toLowerCase()) {
|
|
100
|
-
throw new Error(`Invalid method: ${req.method}`);
|
|
101
|
-
}
|
|
102
|
-
const url = new URL(params.url);
|
|
103
|
-
const { protocol, pathname } = url;
|
|
104
|
-
if (protocol !== 'https:') {
|
|
105
|
-
utils_3.logger.error('params URL: %s', params.url);
|
|
106
|
-
throw new Error(`Expected protocol: https, found: ${protocol}`);
|
|
107
|
-
}
|
|
108
|
-
const searchParams = params.url.includes('?') ? params.url.split('?')[1] : '';
|
|
109
|
-
const expectedPath = pathname + ((searchParams === null || searchParams === void 0 ? void 0 : searchParams.length) ? '?' + searchParams : '');
|
|
110
|
-
if (req.url !== expectedPath) {
|
|
111
|
-
utils_3.logger.error('params URL: %s', params.url);
|
|
112
|
-
throw new Error(`Expected path: ${expectedPath}, found: ${req.url}`);
|
|
113
|
-
}
|
|
114
|
-
const expectedHostStr = getHostHeaderString(url);
|
|
115
|
-
if (req.headers.host !== expectedHostStr) {
|
|
116
|
-
throw new Error(`Expected host: ${expectedHostStr}, found: ${req.headers.host}`);
|
|
117
|
-
}
|
|
118
|
-
const connectionHeader = req.headers['connection'];
|
|
119
|
-
if (connectionHeader !== 'close') {
|
|
120
|
-
throw new Error(`Connection header must be "close", got "${connectionHeader}"`);
|
|
121
|
-
}
|
|
122
|
-
const serverBlocks = receipt
|
|
123
|
-
.filter(s => s.sender === 'server')
|
|
124
|
-
.map((r) => r.message)
|
|
125
|
-
.filter(b => !b.every(b => b === utils_3.REDACTION_CHAR_CODE)); // filter out fully redacted blocks
|
|
126
|
-
const response = concatArrays(...serverBlocks);
|
|
127
|
-
const res = (0, utils_2.parseHttpResponse)(response);
|
|
128
|
-
if (((res.statusCode / 100) >> 0) !== 2) {
|
|
129
|
-
throw new Error(`Provider returned ${res.statusCode} ${res.statusMessage} error`);
|
|
130
|
-
}
|
|
131
|
-
const bodyStartIdx = (_a = res.bodyStartIndex) !== null && _a !== void 0 ? _a : 0;
|
|
132
|
-
if (bodyStartIdx < 4) {
|
|
133
|
-
utils_3.logger.error({ response: (0, utils_3.uint8ArrayToBinaryStr)(response) });
|
|
134
|
-
throw new Error('Failed to find response body');
|
|
135
|
-
}
|
|
136
|
-
extractedParams['data'] = utils_1.base64.encode(res.body);
|
|
137
|
-
return { extractedParameters: extractedParams };
|
|
138
|
-
},
|
|
139
|
-
};
|
|
140
|
-
function concatArrays(...bufs) {
|
|
141
|
-
const totalSize = bufs.reduce((acc, e) => acc + e.length, 0);
|
|
142
|
-
const merged = new Uint8Array(totalSize);
|
|
143
|
-
let lenDone = 0;
|
|
144
|
-
for (const array of bufs) {
|
|
145
|
-
merged.set(array, lenDone);
|
|
146
|
-
lenDone += array.length;
|
|
147
|
-
}
|
|
148
|
-
return merged;
|
|
149
|
-
}
|
|
150
|
-
function getHostPort(params) {
|
|
151
|
-
const { host } = new URL(getURL(params));
|
|
152
|
-
if (!host) {
|
|
153
|
-
throw new Error('url is incorrect');
|
|
154
|
-
}
|
|
155
|
-
return host;
|
|
156
|
-
}
|
|
157
|
-
/**
|
|
158
|
-
* Obtain the host header string from the URL.
|
|
159
|
-
* https://stackoverflow.com/a/3364396
|
|
160
|
-
*/
|
|
161
|
-
function getHostHeaderString(url) {
|
|
162
|
-
const host = url.hostname;
|
|
163
|
-
const port = url.port;
|
|
164
|
-
return port && +port !== config_1.DEFAULT_HTTPS_PORT
|
|
165
|
-
? `${host}:${port}`
|
|
166
|
-
: host;
|
|
167
|
-
}
|
|
168
|
-
const paramsRegex = /\{\{([^{}]+)}}/sgi;
|
|
169
|
-
function getGeoLocation(v2Params) {
|
|
170
|
-
if (v2Params === null || v2Params === void 0 ? void 0 : v2Params.geoLocation) {
|
|
171
|
-
const paramNames = new Set();
|
|
172
|
-
let geo = v2Params.geoLocation;
|
|
173
|
-
//extract param names
|
|
174
|
-
let match = null;
|
|
175
|
-
while (match = paramsRegex.exec(geo)) {
|
|
176
|
-
paramNames.add(match[1]);
|
|
177
|
-
}
|
|
178
|
-
for (const pn of paramNames) {
|
|
179
|
-
if (v2Params.paramValues && pn in v2Params.paramValues) {
|
|
180
|
-
geo = geo.replaceAll(`{{${pn}}}`, v2Params.paramValues[pn].toString());
|
|
181
|
-
}
|
|
182
|
-
else {
|
|
183
|
-
throw new Error(`parameter "${pn}" value not found in templateParams`);
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
return geo;
|
|
187
|
-
}
|
|
188
|
-
return undefined;
|
|
189
|
-
}
|
|
190
|
-
function getURL(v2Params) {
|
|
191
|
-
let hostPort = v2Params === null || v2Params === void 0 ? void 0 : v2Params.url;
|
|
192
|
-
const paramNames = new Set();
|
|
193
|
-
//extract param names
|
|
194
|
-
let match = null;
|
|
195
|
-
while (match = paramsRegex.exec(hostPort)) {
|
|
196
|
-
paramNames.add(match[1]);
|
|
197
|
-
}
|
|
198
|
-
for (const pn of paramNames) {
|
|
199
|
-
if (v2Params.paramValues && pn in v2Params.paramValues) {
|
|
200
|
-
hostPort = hostPort.replaceAll(`{{${pn}}}`, v2Params.paramValues[pn].toString());
|
|
201
|
-
}
|
|
202
|
-
else {
|
|
203
|
-
throw new Error(`parameter "${pn}" value not found in templateParams`);
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
return hostPort;
|
|
207
|
-
}
|
|
208
|
-
exports.default = HTTP_BASE64_PROVIDER;
|
|
209
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcHJvdmlkZXJzL2h0dHBiNjQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw4Q0FBb0c7QUFDcEcsNENBQXlDO0FBQ3pDLHVDQUFtRTtBQUNuRSxvREFFaUM7QUFFakMscUNBS2tCO0FBSWxCLE1BQU0sb0JBQW9CLEdBQXdCO0lBQ2pELFFBQVEsRUFBRSxXQUFXO0lBQ3JCLGtCQUFrQixDQUFDLE1BQU07UUFDeEIsT0FBTyxDQUFDLG9CQUFvQixJQUFJLE1BQU0sQ0FBQztZQUN0QyxDQUFDLENBQUMsTUFBTSxDQUFDLGtCQUFrQjtZQUMzQixDQUFDLENBQUMsU0FBUyxDQUFBO0lBQ2IsQ0FBQztJQUNELFdBQVcsQ0FBQyxNQUFNO1FBQ2pCLE9BQU8sQ0FBQyxhQUFhLElBQUksTUFBTSxDQUFDO1lBQy9CLENBQUMsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDO1lBQ3hCLENBQUMsQ0FBQyxTQUFTLENBQUE7SUFDYixDQUFDO0lBQ0QsdUJBQXVCLENBQUMsTUFBTTtRQUM3QixJQUFJLGNBQWMsR0FBeUI7WUFDMUMseUJBQXlCLEVBQUcsQ0FBQyxVQUFVLENBQUM7U0FDeEMsQ0FBQTtRQUNELElBQUcseUJBQXlCLElBQUksTUFBTSxFQUFFLENBQUM7WUFDeEMsY0FBYyxHQUFHO2dCQUNoQixHQUFHLGNBQWM7Z0JBQ2pCLEdBQUcsTUFBTSxDQUFDLHVCQUF1QjthQUNqQyxDQUFBO1FBQ0YsQ0FBQztRQUVELE9BQU8sY0FBYyxDQUFBO0lBQ3RCLENBQUM7SUFDRCxhQUFhLENBQUMsWUFBWSxFQUFFLE1BQU07UUFDakMsSUFDQyxDQUFDLFlBQVksQ0FBQyxTQUFTO1lBQ2QsQ0FBQyxZQUFZLENBQUMsbUJBQW1CO1lBQ2pDLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFDN0IsQ0FBQztZQUNGLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQTtR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
|