@reclaimprotocol/attestor-core 3.0.5 → 3.1.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 (34) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +58 -8
  3. package/lib/avs/client/create-claim-on-avs.d.ts +2 -0
  4. package/lib/avs/client/create-claim-on-avs.js +2 -2
  5. package/lib/config/index.d.ts +1 -4
  6. package/lib/config/index.js +3 -6
  7. package/lib/providers/http/index.js +21 -43
  8. package/lib/providers/httpb64/index.d.ts +3 -0
  9. package/lib/providers/httpb64/index.js +209 -0
  10. package/lib/providers/httpb64/utils.d.ts +77 -0
  11. package/lib/providers/httpb64/utils.js +358 -0
  12. package/lib/providers/index.js +3 -1
  13. package/lib/scripts/generate-receipt.js +1 -1
  14. package/lib/scripts/update-avs-metadata.d.ts +1 -0
  15. package/lib/scripts/update-avs-metadata.js +22 -0
  16. package/lib/server/utils/assert-valid-claim-request.d.ts +2 -1
  17. package/lib/server/utils/assert-valid-claim-request.js +2 -2
  18. package/lib/server/utils/verify-server-certificates.d.ts +7 -0
  19. package/lib/server/utils/verify-server-certificates.js +101 -0
  20. package/lib/tests/describe-with-server.d.ts +2 -1
  21. package/lib/tests/describe-with-server.js +2 -2
  22. package/lib/tests/test.tcp-tunnel.js +2 -2
  23. package/lib/tests/test.zk.js +2 -2
  24. package/lib/types/providers.gen.d.ts +156 -0
  25. package/lib/types/providers.gen.js +5 -1
  26. package/lib/types/zk.d.ts +1 -2
  27. package/lib/utils/generics.js +4 -4
  28. package/lib/utils/zk.d.ts +3 -3
  29. package/lib/utils/zk.js +28 -60
  30. package/lib/window-rpc/setup-window-rpc.js +2 -2
  31. package/lib/window-rpc/types.d.ts +3 -3
  32. package/lib/window-rpc/window-rpc-zk.d.ts +1 -2
  33. package/lib/window-rpc/window-rpc-zk.js +2 -2
  34. package/package.json +7 -5
@@ -0,0 +1,358 @@
1
+ "use strict";
2
+ // noinspection ExceptionCaughtLocallyJS
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.extractHTMLElement = extractHTMLElement;
5
+ exports.extractHTMLElements = extractHTMLElements;
6
+ exports.extractHTMLElementIndex = extractHTMLElementIndex;
7
+ exports.extractHTMLElementsIndexes = extractHTMLElementsIndexes;
8
+ exports.extractJSONValueIndex = extractJSONValueIndex;
9
+ exports.extractJSONValueIndexes = extractJSONValueIndexes;
10
+ exports.buildHeaders = buildHeaders;
11
+ exports.convertResponsePosToAbsolutePos = convertResponsePosToAbsolutePos;
12
+ exports.getRedactionsForChunkHeaders = getRedactionsForChunkHeaders;
13
+ exports.parseHttpResponse = parseHttpResponse;
14
+ exports.makeRegex = makeRegex;
15
+ exports.matchRedactedStrings = matchRedactedStrings;
16
+ exports.generateRequstAndResponseFromTranscript = generateRequstAndResponseFromTranscript;
17
+ const tls_1 = require("@reclaimprotocol/tls");
18
+ const esprima_next_1 = require("esprima-next");
19
+ const jsonpath_plus_1 = require("jsonpath-plus");
20
+ const utils_1 = require("../../utils");
21
+ let RE2;
22
+ try {
23
+ RE2 = require('re2');
24
+ if (!Object.keys(RE2).length) {
25
+ RE2 = undefined;
26
+ throw new Error();
27
+ }
28
+ }
29
+ catch (_a) {
30
+ console.log('RE2 not found. Using standard regex');
31
+ }
32
+ let jsd;
33
+ if (typeof window !== 'undefined') {
34
+ // @ts-ignore
35
+ jsd = window.jsdom;
36
+ }
37
+ else {
38
+ jsd = require('jsdom');
39
+ }
40
+ /**
41
+ * Returns only first extracted element
42
+ * @param html
43
+ * @param xpathExpression
44
+ * @param contentsOnly
45
+ */
46
+ function extractHTMLElement(html, xpathExpression, contentsOnly) {
47
+ const { start, end } = extractHTMLElementIndex(html, xpathExpression, contentsOnly);
48
+ return html.slice(start, end);
49
+ }
50
+ /**
51
+ * Returns all extracted elements
52
+ * @param html
53
+ * @param xpathExpression
54
+ * @param contentsOnly
55
+ */
56
+ function extractHTMLElements(html, xpathExpression, contentsOnly) {
57
+ const indexes = extractHTMLElementsIndexes(html, xpathExpression, contentsOnly);
58
+ const res = [];
59
+ for (const { start, end } of indexes) {
60
+ res.push(html.slice(start, end));
61
+ }
62
+ return res;
63
+ }
64
+ /**
65
+ * returns a single index of extracted element
66
+ * @param html
67
+ * @param xpathExpression
68
+ * @param contentsOnly
69
+ */
70
+ function extractHTMLElementIndex(html, xpathExpression, contentsOnly) {
71
+ return extractHTMLElementsIndexes(html, xpathExpression, contentsOnly)[0];
72
+ }
73
+ /**
74
+ * Returns indexes of all extracted elements
75
+ * @param html
76
+ * @param xpathExpression
77
+ * @param contentsOnly
78
+ */
79
+ function extractHTMLElementsIndexes(html, xpathExpression, contentsOnly) {
80
+ const dom = new jsd.JSDOM(html, {
81
+ contentType: 'text/html',
82
+ includeNodeLocations: true
83
+ });
84
+ const document = dom.window.document;
85
+ const xpathResult = document.evaluate(xpathExpression, document, null, dom.window.XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
86
+ const nodes = [];
87
+ if ((xpathResult === null || xpathResult === void 0 ? void 0 : xpathResult.resultType) === dom.window.XPathResult.ORDERED_NODE_SNAPSHOT_TYPE &&
88
+ (xpathResult === null || xpathResult === void 0 ? void 0 : xpathResult.snapshotLength)) {
89
+ for (let i = 0; i < xpathResult.snapshotLength; ++i) {
90
+ nodes.push(xpathResult.snapshotItem(i));
91
+ }
92
+ }
93
+ if (!nodes.length) {
94
+ throw new Error(`Failed to find XPath: "${xpathExpression}"`);
95
+ }
96
+ const res = [];
97
+ for (const node of nodes) {
98
+ const nodeLocation = dom.nodeLocation(node);
99
+ if (!nodeLocation) {
100
+ throw new Error(`Failed to find XPath node location: "${xpathExpression}"`);
101
+ }
102
+ if (contentsOnly) {
103
+ const start = nodeLocation.startTag ? nodeLocation.startTag.endOffset : nodeLocation.startOffset;
104
+ const end = nodeLocation.endTag ? nodeLocation.endTag.startOffset : nodeLocation.endOffset;
105
+ res.push({ start, end });
106
+ }
107
+ else {
108
+ res.push({ start: nodeLocation.startOffset, end: nodeLocation.endOffset });
109
+ }
110
+ }
111
+ return res;
112
+ }
113
+ function extractJSONValueIndex(json, jsonPath) {
114
+ return extractJSONValueIndexes(json, jsonPath)[0];
115
+ }
116
+ function extractJSONValueIndexes(json, jsonPath) {
117
+ const pointers = (0, jsonpath_plus_1.JSONPath)({
118
+ path: jsonPath,
119
+ json: JSON.parse(json),
120
+ wrap: false,
121
+ resultType: 'pointer',
122
+ eval: 'safe',
123
+ // @ts-ignore
124
+ ignoreEvalErrors: true
125
+ });
126
+ if (!pointers) {
127
+ throw new Error('jsonPath not found');
128
+ }
129
+ const tree = (0, esprima_next_1.parseScript)('(' + json + ')', { range: true }); //wrap in parentheses for esprima to parse
130
+ if (tree.body[0] instanceof esprima_next_1.ExpressionStatement
131
+ && (tree.body[0].expression instanceof esprima_next_1.ObjectExpression || tree.body[0].expression instanceof esprima_next_1.ArrayExpression)) {
132
+ const traversePointers = Array.isArray(pointers) ? pointers : [pointers];
133
+ const res = [];
134
+ for (const pointer of traversePointers) {
135
+ const index = traverse(tree.body[0].expression, '', [pointer]);
136
+ if (index) {
137
+ res.push({
138
+ start: index.start - 1, //account for '('
139
+ end: index.end - 1,
140
+ });
141
+ }
142
+ }
143
+ return res;
144
+ }
145
+ throw new Error('jsonPath not found');
146
+ }
147
+ /**
148
+ * recursively go through AST tree and build a JSON path while it's not equal to the one we search for
149
+ * @param o - esprima expression for root object
150
+ * @param path - path that is being built
151
+ * @param pointers - JSON pointers to compare to
152
+ */
153
+ function traverse(o, path, pointers) {
154
+ if (o instanceof esprima_next_1.ObjectExpression) {
155
+ for (const p of o.properties) {
156
+ if (!(p instanceof esprima_next_1.Property)) {
157
+ continue;
158
+ }
159
+ const localPath = p.key.type === esprima_next_1.Syntax.Literal
160
+ ? path + '/' + p.key.value
161
+ : path;
162
+ if (pointers.includes(localPath) && 'range' in p && Array.isArray(p.range)) {
163
+ return {
164
+ start: p.range[0],
165
+ end: p.range[1],
166
+ };
167
+ }
168
+ if (p.value instanceof esprima_next_1.ObjectExpression
169
+ || p.value instanceof esprima_next_1.ArrayExpression) {
170
+ const res = traverse(p.value, localPath, pointers);
171
+ if (res) {
172
+ return res;
173
+ }
174
+ }
175
+ }
176
+ }
177
+ if (o instanceof esprima_next_1.ArrayExpression) {
178
+ for (let i = 0; i < o.elements.length; i++) {
179
+ const element = o.elements[i];
180
+ if (!element) {
181
+ continue;
182
+ }
183
+ const localPath = path + '/' + i;
184
+ if (pointers.includes(localPath) &&
185
+ 'range' in element &&
186
+ Array.isArray(element.range)) {
187
+ return {
188
+ start: element.range[0],
189
+ end: element.range[1],
190
+ };
191
+ }
192
+ if (element instanceof esprima_next_1.ObjectExpression) {
193
+ const res = traverse(element, localPath, pointers);
194
+ if (res) {
195
+ return res;
196
+ }
197
+ }
198
+ if (element instanceof esprima_next_1.ArrayExpression) {
199
+ const res = traverse(element, localPath, pointers);
200
+ if (res) {
201
+ return res;
202
+ }
203
+ }
204
+ }
205
+ }
206
+ return null;
207
+ }
208
+ function buildHeaders(input) {
209
+ const headers = [];
210
+ for (const [key, value] of Object.entries(input || {})) {
211
+ headers.push(`${key}: ${value}`);
212
+ }
213
+ return headers;
214
+ }
215
+ /**
216
+ * Converts position in HTTP response body to an absolute position in TLS transcript considering chunked encoding
217
+ * @param pos
218
+ * @param bodyStartIdx
219
+ * @param chunks
220
+ */
221
+ function convertResponsePosToAbsolutePos(pos, bodyStartIdx, chunks) {
222
+ if (chunks === null || chunks === void 0 ? void 0 : chunks.length) {
223
+ let chunkBodyStart = 0;
224
+ for (const chunk of chunks) {
225
+ const chunkSize = chunk.toIndex - chunk.fromIndex;
226
+ if (pos >= chunkBodyStart && pos <= (chunkBodyStart + chunkSize)) {
227
+ return pos - chunkBodyStart + chunk.fromIndex;
228
+ }
229
+ chunkBodyStart += chunkSize;
230
+ }
231
+ throw new Error('position out of range');
232
+ }
233
+ return bodyStartIdx + pos;
234
+ }
235
+ /**
236
+ * Returns parts of response which contain chunk headers and must be redacted out
237
+ * of revealed response part
238
+ * @param from
239
+ * @param to
240
+ * @param chunks
241
+ */
242
+ function getRedactionsForChunkHeaders(from, to, chunks) {
243
+ const res = [];
244
+ if (chunks === null || chunks === void 0 ? void 0 : chunks.length) {
245
+ for (let i = 1; i < (chunks === null || chunks === void 0 ? void 0 : chunks.length); i++) {
246
+ if (chunks[i].fromIndex > from && chunks[i].fromIndex < to) {
247
+ res.push({ fromIndex: chunks[i - 1].toIndex, toIndex: chunks[i].fromIndex });
248
+ }
249
+ }
250
+ }
251
+ return res;
252
+ }
253
+ function parseHttpResponse(buff) {
254
+ const parser = (0, utils_1.makeHttpResponseParser)();
255
+ parser.onChunk(buff);
256
+ parser.streamEnded();
257
+ return parser.res;
258
+ }
259
+ function makeRegex(str) {
260
+ if (RE2 !== undefined) {
261
+ return RE2(str, 'sgiu');
262
+ }
263
+ return new RegExp(str, 'sgi');
264
+ }
265
+ const TEMPLATE_START_CHARCODE = '{'.charCodeAt(0);
266
+ const TEMPLATE_END_CHARCODE = '}'.charCodeAt(0);
267
+ /**
268
+ * Try to match strings that contain templates like {{param}}
269
+ * against redacted string that has *** instead of that param
270
+ */
271
+ function matchRedactedStrings(templateString, redactedString) {
272
+ if (templateString.length === 0 && (redactedString === null || redactedString === void 0 ? void 0 : redactedString.length) === 0) {
273
+ return true;
274
+ }
275
+ if (!redactedString) {
276
+ return false;
277
+ }
278
+ let ts = -1;
279
+ let rs = -1;
280
+ while (ts < templateString.length && rs < redactedString.length) {
281
+ let ct = getTChar();
282
+ let cr = getRChar();
283
+ if (ct !== cr) {
284
+ // only valid if param contains "{" & redacted contains "*"
285
+ if (ct === TEMPLATE_START_CHARCODE && cr === utils_1.REDACTION_CHAR_CODE) {
286
+ //check that the char after first "{" is also "{"
287
+ if (getTChar() !== TEMPLATE_START_CHARCODE) {
288
+ return false;
289
+ }
290
+ //look for first closing bracket
291
+ while (((ct = getTChar()) !== TEMPLATE_END_CHARCODE) && ct !== -1) {
292
+ }
293
+ //look for second closing bracket
294
+ while (((ct = getTChar()) !== TEMPLATE_END_CHARCODE) && ct !== -1) {
295
+ }
296
+ if (ct === -1) {
297
+ return false;
298
+ }
299
+ //find the end of redaction
300
+ while (((cr = getRChar()) === utils_1.REDACTION_CHAR_CODE) && cr !== -1) {
301
+ }
302
+ if (cr === -1) {
303
+ //if there's nothing after template too then both ended at the end of strings
304
+ return getTChar() === -1;
305
+ }
306
+ //rewind redacted string position back 1 char because we read one extra
307
+ rs--;
308
+ }
309
+ else {
310
+ return false;
311
+ }
312
+ }
313
+ }
314
+ function getTChar() {
315
+ ts++;
316
+ if (ts < templateString.length) {
317
+ return templateString[ts];
318
+ }
319
+ else {
320
+ return -1;
321
+ }
322
+ }
323
+ function getRChar() {
324
+ if (!redactedString) {
325
+ return -1;
326
+ }
327
+ rs++;
328
+ if (rs < redactedString.length) {
329
+ return redactedString[rs];
330
+ }
331
+ else {
332
+ return -1;
333
+ }
334
+ }
335
+ return ts === templateString.length && rs === redactedString.length;
336
+ }
337
+ function generateRequstAndResponseFromTranscript(transcript, tlsVersion) {
338
+ const allPackets = transcript;
339
+ const packets = [];
340
+ for (const b of allPackets) {
341
+ if (b.message.type !== 'ciphertext'
342
+ || !(0, utils_1.isApplicationData)(b.message, tlsVersion)) {
343
+ continue;
344
+ }
345
+ const plaintext = tlsVersion === 'TLS1_3'
346
+ ? b.message.plaintext.slice(0, -1)
347
+ : b.message.plaintext;
348
+ packets.push({
349
+ message: plaintext,
350
+ sender: b.sender
351
+ });
352
+ }
353
+ const req = (0, utils_1.getHttpRequestDataFromTranscript)(packets);
354
+ const responsePackets = (0, tls_1.concatenateUint8Arrays)(packets.filter(p => p.sender === 'server').map(p => p.message).filter(b => !b.every(b => b === utils_1.REDACTION_CHAR_CODE)));
355
+ const res = parseHttpResponse(responsePackets);
356
+ return { req, res };
357
+ }
358
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcHJvdmlkZXJzL2h0dHBiNjQvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHdDQUF3Qzs7QUFpRHhDLGdEQU9DO0FBUUQsa0RBWUM7QUFRRCwwREFNQztBQVFELGdFQTRDQztBQUVELHNEQUVDO0FBRUQsMERBa0NDO0FBaUZELG9DQVFDO0FBUUQsMEVBa0JDO0FBU0Qsb0VBV0M7QUFFRCw4Q0FLQztBQUVELDhCQU1DO0FBU0Qsb0RBNEVDO0FBRUQsMEZBMEJDO0FBM2JELDhDQUE2RDtBQUM3RCwrQ0FRcUI7QUFDckIsaURBQXdDO0FBRXhDLHFDQUF1SjtBQVN2SixJQUFJLEdBQUcsQ0FBQTtBQUNQLElBQUksQ0FBQztJQUNKLEdBQUcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDcEIsSUFBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDN0IsR0FBRyxHQUFHLFNBQVMsQ0FBQTtRQUNmLE1BQU0sSUFBSSxLQUFLLEVBQUUsQ0FBQTtJQUNsQixDQUFDO0FBQ0YsQ0FBQztBQUFDLFdBQUssQ0FBQztJQUNQLE9BQU8sQ0FBQyxHQUFHLENBQUMscUNBQXFDLENBQUMsQ0FBQTtBQUNuRCxDQUFDO0FBRUQsSUFBSSxHQUFHLENBQUE7QUFFUCxJQUFHLE9BQU8sTUFBTSxLQUFLLFdBQVcsRUFBRSxDQUFDO0lBQ2xDLGFBQWE7SUFDYixHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQTtBQUNuQixDQUFDO0tBQU0sQ0FBQztJQUNQLEdBQUcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7QUFDdkIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0Isa0JBQWtCLENBQ2pDLElBQVksRUFDWixlQUF1QixFQUN2QixZQUFxQjtJQUVyQixNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLHVCQUF1QixDQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsWUFBWSxDQUFDLENBQUE7SUFDbkYsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQTtBQUM5QixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQixtQkFBbUIsQ0FDbEMsSUFBWSxFQUNaLGVBQXVCLEVBQ3ZCLFlBQXFCO0lBRXJCLE1BQU0sT0FBTyxHQUFHLDBCQUEwQixDQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsWUFBWSxDQUFDLENBQUE7SUFDL0UsTUFBTSxHQUFHLEdBQWEsRUFBRSxDQUFBO0lBQ3hCLEtBQUksTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNyQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUE7SUFDakMsQ0FBQztJQUVELE9BQU8sR0FBRyxDQUFBO0FBQ1gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsdUJBQXVCLENBQ3RDLElBQVksRUFDWixlQUF1QixFQUN2QixZQUFxQjtJQUVyQixPQUFPLDBCQUEwQixDQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDMUUsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsMEJBQTBCLENBQ3pDLElBQVksRUFDWixlQUF1QixFQUN2QixZQUFxQjtJQUdyQixNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFO1FBQy9CLFdBQVcsRUFBRSxXQUFXO1FBQ3hCLG9CQUFvQixFQUFFLElBQUk7S0FDMUIsQ0FBQyxDQUFBO0lBRUYsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUE7SUFDcEMsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQywwQkFBMEIsRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUMvSCxNQUFNLEtBQUssR0FBVyxFQUFFLENBQUE7SUFDeEIsSUFBRyxDQUFBLFdBQVcsYUFBWCxXQUFXLHVCQUFYLFdBQVcsQ0FBRSxVQUFVLE1BQUssR0FBRyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsMEJBQTBCO1NBQy9FLFdBQVcsYUFBWCxXQUFXLHVCQUFYLFdBQVcsQ0FBRSxjQUFjLENBQUEsRUFBRSxDQUFDO1FBQzlCLEtBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDcEQsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDeEMsQ0FBQztJQUNGLENBQUM7SUFFRCxJQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLGVBQWUsR0FBRyxDQUFDLENBQUE7SUFDOUQsQ0FBQztJQUdELE1BQU0sR0FBRyxHQUFxQyxFQUFFLENBQUE7SUFFaEQsS0FBSSxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN6QixNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzNDLElBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNsQixNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxlQUFlLEdBQUcsQ0FBQyxDQUFBO1FBQzVFLENBQUM7UUFFRCxJQUFHLFlBQVksRUFBRSxDQUFDO1lBQ2pCLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFBO1lBQ2hHLE1BQU0sR0FBRyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFBO1lBQzFGLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQTtRQUN6QixDQUFDO2FBQU0sQ0FBQztZQUNQLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUUsWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUE7UUFDMUUsQ0FBQztJQUNGLENBQUM7SUFFRCxPQUFPLEdBQUcsQ0FBQTtBQUNYLENBQUM7QUFFRCxTQUFnQixxQkFBcUIsQ0FBQyxJQUFZLEVBQUUsUUFBZ0I7SUFDbkUsT0FBTyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDbEQsQ0FBQztBQUVELFNBQWdCLHVCQUF1QixDQUFDLElBQVksRUFBRSxRQUFnQjtJQUNyRSxNQUFNLFFBQVEsR0FBRyxJQUFBLHdCQUFRLEVBQUM7UUFDekIsSUFBSSxFQUFFLFFBQVE7UUFDZCxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDdEIsSUFBSSxFQUFFLEtBQUs7UUFDWCxVQUFVLEVBQUUsU0FBUztRQUNyQixJQUFJLEVBQUMsTUFBTTtRQUNYLGFBQWE7UUFDYixnQkFBZ0IsRUFBRSxJQUFJO0tBQ3RCLENBQUMsQ0FBQTtJQUNGLElBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQTtJQUN0QyxDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUcsSUFBQSwwQkFBVyxFQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUEsQ0FBQywwQ0FBMEM7SUFDdEcsSUFBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLGtDQUFtQjtXQUMxQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxZQUFZLCtCQUFnQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxZQUFZLDhCQUFlLENBQUMsRUFBRSxDQUFDO1FBRWpILE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3hFLE1BQU0sR0FBRyxHQUFxQyxFQUFFLENBQUE7UUFDaEQsS0FBSSxNQUFNLE9BQU8sSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO1lBQzlELElBQUcsS0FBSyxFQUFFLENBQUM7Z0JBQ1YsR0FBRyxDQUFDLElBQUksQ0FBQztvQkFDUixLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsaUJBQWlCO29CQUN6QyxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDO2lCQUNsQixDQUFDLENBQUE7WUFDSCxDQUFDO1FBQ0YsQ0FBQztRQUVELE9BQU8sR0FBRyxDQUFBO0lBQ1gsQ0FBQztJQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQTtBQUN0QyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLFFBQVEsQ0FDaEIsQ0FBYSxFQUNiLElBQVksRUFDWixRQUFrQjtJQUVsQixJQUFHLENBQUMsWUFBWSwrQkFBZ0IsRUFBRSxDQUFDO1FBQ2xDLEtBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzdCLElBQUcsQ0FBQyxDQUFDLENBQUMsWUFBWSx1QkFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDN0IsU0FBUTtZQUNULENBQUM7WUFFRCxNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxxQkFBTSxDQUFDLE9BQU87Z0JBQzlDLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSztnQkFDMUIsQ0FBQyxDQUFDLElBQUksQ0FBQTtZQUVQLElBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzNFLE9BQU87b0JBQ04sS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO29CQUNqQixHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7aUJBQ2YsQ0FBQTtZQUNGLENBQUM7WUFFRCxJQUNDLENBQUMsQ0FBQyxLQUFLLFlBQVksK0JBQWdCO21CQUNoQyxDQUFDLENBQUMsS0FBSyxZQUFZLDhCQUFlLEVBQ3BDLENBQUM7Z0JBQ0YsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFBO2dCQUNsRCxJQUFHLEdBQUcsRUFBRSxDQUFDO29CQUNSLE9BQU8sR0FBRyxDQUFBO2dCQUNYLENBQUM7WUFDRixDQUFDO1FBQ0YsQ0FBQztJQUNGLENBQUM7SUFFRCxJQUFHLENBQUMsWUFBWSw4QkFBZSxFQUFFLENBQUM7UUFDakMsS0FBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDM0MsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUM3QixJQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2IsU0FBUTtZQUNULENBQUM7WUFFRCxNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQTtZQUVoQyxJQUNDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO2dCQUNoQixPQUFPLElBQUksT0FBTztnQkFDbEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQ3ZDLENBQUM7Z0JBQ0YsT0FBTztvQkFDTixLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBQ3ZCLEdBQUcsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztpQkFDckIsQ0FBQTtZQUNGLENBQUM7WUFFRCxJQUFHLE9BQU8sWUFBWSwrQkFBZ0IsRUFBRSxDQUFDO2dCQUN4QyxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQTtnQkFDbEQsSUFBRyxHQUFHLEVBQUUsQ0FBQztvQkFDUixPQUFPLEdBQUcsQ0FBQTtnQkFDWCxDQUFDO1lBQ0YsQ0FBQztZQUVELElBQUcsT0FBTyxZQUFZLDhCQUFlLEVBQUUsQ0FBQztnQkFDdkMsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUE7Z0JBQ2xELElBQUcsR0FBRyxFQUFFLENBQUM7b0JBQ1IsT0FBTyxHQUFHLENBQUE7Z0JBQ1gsQ0FBQztZQUNGLENBQUM7UUFDRixDQUFDO0lBQ0YsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFBO0FBQ1osQ0FBQztBQUVELFNBQWdCLFlBQVksQ0FBQyxLQUFvQztJQUNoRSxNQUFNLE9BQU8sR0FBYSxFQUFFLENBQUE7SUFFNUIsS0FBSSxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDdkQsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxLQUFLLEVBQUUsQ0FBQyxDQUFBO0lBQ2pDLENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQTtBQUNmLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQWdCLCtCQUErQixDQUFDLEdBQVcsRUFBRSxZQUFvQixFQUFFLE1BQXFCO0lBQ3ZHLElBQUcsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLE1BQU0sRUFBRSxDQUFDO1FBQ25CLElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQTtRQUN0QixLQUFJLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBRTNCLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQTtZQUVqRCxJQUFHLEdBQUcsSUFBSSxjQUFjLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pFLE9BQU8sR0FBRyxHQUFHLGNBQWMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFBO1lBQzlDLENBQUM7WUFFRCxjQUFjLElBQUksU0FBUyxDQUFBO1FBQzVCLENBQUM7UUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUE7SUFDekMsQ0FBQztJQUVELE9BQU8sWUFBWSxHQUFHLEdBQUcsQ0FBQTtBQUMxQixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsNEJBQTRCLENBQUMsSUFBSSxFQUFFLEVBQVUsRUFBRSxNQUFxQjtJQUNuRixNQUFNLEdBQUcsR0FBaUIsRUFBRSxDQUFBO0lBQzVCLElBQUcsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLE1BQU0sRUFBRSxDQUFDO1FBQ25CLEtBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBRyxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsTUFBTSxDQUFBLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN4QyxJQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsRUFBRSxFQUFFLENBQUM7Z0JBQzNELEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLEVBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFBO1lBQzNFLENBQUM7UUFDRixDQUFDO0lBQ0YsQ0FBQztJQUVELE9BQU8sR0FBRyxDQUFBO0FBQ1gsQ0FBQztBQUVELFNBQWdCLGlCQUFpQixDQUFDLElBQWdCO0lBQ2pELE1BQU0sTUFBTSxHQUFHLElBQUEsOEJBQXNCLEdBQUUsQ0FBQTtJQUN2QyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ3BCLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUNwQixPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUE7QUFDbEIsQ0FBQztBQUVELFNBQWdCLFNBQVMsQ0FBQyxHQUFXO0lBQ3BDLElBQUcsR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQTtJQUN4QixDQUFDO0lBRUQsT0FBTyxJQUFJLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUE7QUFDOUIsQ0FBQztBQUVELE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNqRCxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFFL0M7OztHQUdHO0FBQ0gsU0FBZ0Isb0JBQW9CLENBQUMsY0FBMEIsRUFBRSxjQUEyQjtJQUUzRixJQUFHLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUEsY0FBYyxhQUFkLGNBQWMsdUJBQWQsY0FBYyxDQUFFLE1BQU0sTUFBSyxDQUFDLEVBQUUsQ0FBQztRQUNoRSxPQUFPLElBQUksQ0FBQTtJQUNaLENBQUM7SUFFRCxJQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDcEIsT0FBTyxLQUFLLENBQUE7SUFDYixDQUFDO0lBRUQsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUE7SUFDWCxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUNYLE9BQU0sRUFBRSxHQUFHLGNBQWMsQ0FBQyxNQUFNLElBQUksRUFBRSxHQUFHLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNoRSxJQUFJLEVBQUUsR0FBRyxRQUFRLEVBQUUsQ0FBQTtRQUNuQixJQUFJLEVBQUUsR0FBRyxRQUFRLEVBQUUsQ0FBQTtRQUNuQixJQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUNkLDJEQUEyRDtZQUMzRCxJQUFHLEVBQUUsS0FBSyx1QkFBdUIsSUFBSSxFQUFFLEtBQUssMkJBQW1CLEVBQUUsQ0FBQztnQkFDakUsaURBQWlEO2dCQUNqRCxJQUFHLFFBQVEsRUFBRSxLQUFLLHVCQUF1QixFQUFFLENBQUM7b0JBQzNDLE9BQU8sS0FBSyxDQUFBO2dCQUNiLENBQUM7Z0JBRUQsZ0NBQWdDO2dCQUNoQyxPQUFNLENBQUMsQ0FBQyxFQUFFLEdBQUcsUUFBUSxFQUFFLENBQUMsS0FBSyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNuRSxDQUFDO2dCQUVELGlDQUFpQztnQkFDakMsT0FBTSxDQUFDLENBQUMsRUFBRSxHQUFHLFFBQVEsRUFBRSxDQUFDLEtBQUsscUJBQXFCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDbkUsQ0FBQztnQkFFRCxJQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUNkLE9BQU8sS0FBSyxDQUFBO2dCQUNiLENBQUM7Z0JBRUQsMkJBQTJCO2dCQUMzQixPQUFNLENBQUMsQ0FBQyxFQUFFLEdBQUcsUUFBUSxFQUFFLENBQUMsS0FBSywyQkFBbUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNqRSxDQUFDO2dCQUVELElBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ2QsNkVBQTZFO29CQUM3RSxPQUFPLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO2dCQUN6QixDQUFDO2dCQUVELHVFQUF1RTtnQkFDdkUsRUFBRSxFQUFFLENBQUE7WUFDTCxDQUFDO2lCQUFNLENBQUM7Z0JBQ1AsT0FBTyxLQUFLLENBQUE7WUFDYixDQUFDO1FBQ0YsQ0FBQztJQUNGLENBQUM7SUFHRCxTQUFTLFFBQVE7UUFDaEIsRUFBRSxFQUFFLENBQUE7UUFDSixJQUFHLEVBQUUsR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDL0IsT0FBTyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDMUIsQ0FBQzthQUFNLENBQUM7WUFDUCxPQUFPLENBQUMsQ0FBQyxDQUFBO1FBQ1YsQ0FBQztJQUNGLENBQUM7SUFFRCxTQUFTLFFBQVE7UUFDaEIsSUFBRyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3BCLE9BQU8sQ0FBQyxDQUFDLENBQUE7UUFDVixDQUFDO1FBRUQsRUFBRSxFQUFFLENBQUE7UUFDSixJQUFHLEVBQUUsR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDL0IsT0FBTyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDMUIsQ0FBQzthQUFNLENBQUM7WUFDUCxPQUFPLENBQUMsQ0FBQyxDQUFBO1FBQ1YsQ0FBQztJQUNGLENBQUM7SUFFRCxPQUFPLEVBQUUsS0FBSyxjQUFjLENBQUMsTUFBTSxJQUFJLEVBQUUsS0FBSyxjQUFjLENBQUMsTUFBTSxDQUFBO0FBQ3BFLENBQUM7QUFFRCxTQUFnQix1Q0FBdUMsQ0FBQyxVQUF5QyxFQUFFLFVBQWtCO0lBQ3BILE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQTtJQUU3QixNQUFNLE9BQU8sR0FBMkIsRUFBRSxDQUFBO0lBQzFDLEtBQUksTUFBTSxDQUFDLElBQUksVUFBVSxFQUFFLENBQUM7UUFDM0IsSUFBRyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxZQUFZO2VBQzlCLENBQUMsSUFBQSx5QkFBaUIsRUFBQyxDQUFDLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDL0MsU0FBUTtRQUNULENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxVQUFVLEtBQUssUUFBUTtZQUN4QyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNsQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUE7UUFFdEIsT0FBTyxDQUFDLElBQUksQ0FBQztZQUNaLE9BQU8sRUFBRSxTQUFTO1lBQ2xCLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTTtTQUNoQixDQUFDLENBQUE7SUFDSCxDQUFDO0lBRUQsTUFBTSxHQUFHLEdBQUcsSUFBQSx3Q0FBZ0MsRUFBQyxPQUFPLENBQUMsQ0FBQTtJQUVyRCxNQUFNLGVBQWUsR0FBRyxJQUFBLDRCQUFzQixFQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssMkJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDcEssTUFBTSxHQUFHLEdBQUcsaUJBQWlCLENBQUMsZUFBZSxDQUFDLENBQUE7SUFFOUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQTtBQUNwQixDQUFDIn0=
@@ -5,7 +5,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.providers = void 0;
7
7
  const http_1 = __importDefault(require("../providers/http"));
8
+ const httpb64_1 = __importDefault(require("../providers/httpb64"));
8
9
  exports.providers = {
9
10
  http: http_1.default,
11
+ httpb64: httpb64_1.default
10
12
  };
11
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJvdmlkZXJzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDhEQUFxQztBQUd4QixRQUFBLFNBQVMsR0FFbEI7SUFDSCxJQUFJLEVBQUosY0FBSTtDQUNKLENBQUEifQ==
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJvdmlkZXJzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDhEQUFxQztBQUNyQyxvRUFBMkM7QUFHOUIsUUFBQSxTQUFTLEdBRWxCO0lBQ0gsSUFBSSxFQUFKLGNBQUk7SUFDSixPQUFPLEVBQVAsaUJBQU87Q0FDUCxDQUFBIn0=
@@ -27,7 +27,7 @@ async function main(receiptParams) {
27
27
  server = await (0, server_1.createServer)();
28
28
  attestorHostPort = `ws://localhost:${__1.API_SERVER_PORT}${__1.WS_PATHNAME}`;
29
29
  }
30
- const zkEngine = (0, utils_1.getCliArgument)('zk') === 'gnark' ? 'gnark' : 'snarkJS';
30
+ const zkEngine = (0, utils_1.getCliArgument)('zk') === 'gnark' ? 'gnark' : 'snarkjs';
31
31
  const receipt = await (0, __1.createClaimOnAttestor)({
32
32
  name: paramsJson.name,
33
33
  secretParams: paramsJson.secretParams,
@@ -0,0 +1 @@
1
+ import '../server/utils/config-env';
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ // eslint-disable-next-line simple-import-sort/imports
4
+ require("../server/utils/config-env");
5
+ const contracts_1 = require("../avs/utils/contracts");
6
+ const utils_1 = require("../scripts/utils");
7
+ async function main() {
8
+ const { contract } = (0, contracts_1.getContracts)();
9
+ const minSignaturesPerTask = (0, utils_1.getCliArgument)('minSignaturesPerTask');
10
+ if (!minSignaturesPerTask) {
11
+ throw new Error('Provide operator address via --minSignaturesPerTask <num>');
12
+ }
13
+ const tx = await contract.updateTaskCreationMetadata({
14
+ minSignaturesPerTask: +(minSignaturesPerTask || 0),
15
+ maxTaskCreationDelayS: 0,
16
+ maxTaskLifetimeS: 0,
17
+ });
18
+ await tx.wait();
19
+ console.log('Updated task creation metadata');
20
+ }
21
+ main();
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLWF2cy1tZXRhZGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JpcHRzL3VwZGF0ZS1hdnMtbWV0YWRhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxzREFBc0Q7QUFDdEQsdUNBQW9DO0FBQ3BDLHVEQUFzRDtBQUN0RCw2Q0FBa0Q7QUFFbEQsS0FBSyxVQUFVLElBQUk7SUFDbEIsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUEsd0JBQVksR0FBRSxDQUFBO0lBRW5DLE1BQU0sb0JBQW9CLEdBQUcsSUFBQSxzQkFBYyxFQUFDLHNCQUFzQixDQUFDLENBQUE7SUFDbkUsSUFBRyxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FDZCwyREFBMkQsQ0FDM0QsQ0FBQTtJQUNGLENBQUM7SUFFRCxNQUFNLEVBQUUsR0FBRyxNQUFNLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQztRQUNwRCxvQkFBb0IsRUFBRSxDQUFDLENBQUMsb0JBQW9CLElBQUksQ0FBQyxDQUFDO1FBQ2xELHFCQUFxQixFQUFFLENBQUM7UUFDeEIsZ0JBQWdCLEVBQUUsQ0FBQztLQUNuQixDQUFDLENBQUE7SUFDRixNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUVmLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0NBQWdDLENBQUMsQ0FBQTtBQUM5QyxDQUFDO0FBRUQsSUFBSSxFQUFFLENBQUEifQ==
@@ -1,5 +1,6 @@
1
+ import { ZKEngine } from '@reclaimprotocol/zk-symmetric-crypto';
1
2
  import { ClaimTunnelRequest, InitRequest, ProviderClaimInfo } from '../../proto/api';
2
- import { IDecryptedTranscript, Logger, TCPSocketProperties, Transcript, ZKEngine } from '../../types';
3
+ import { IDecryptedTranscript, Logger, TCPSocketProperties, Transcript } from '../../types';
3
4
  /**
4
5
  * Asserts that the claim request is valid.
5
6
  *
@@ -43,7 +43,7 @@ async function assertValidClaimRequest(request, metadata, logger) {
43
43
  if (!verified) {
44
44
  throw new utils_1.AttestorError('ERROR_INVALID_CLAIM', 'Invalid signature on claim request');
45
45
  }
46
- const receipt = await decryptTranscript(request.transcript, logger, zkEngine === api_1.ZKProofEngine.ZK_ENGINE_GNARK ? 'gnark' : 'snarkJS', fixedServerIV, fixedClientIV);
46
+ const receipt = await decryptTranscript(request.transcript, logger, zkEngine === api_1.ZKProofEngine.ZK_ENGINE_GNARK ? 'gnark' : 'snarkjs', fixedServerIV, fixedClientIV);
47
47
  const reqHost = (_a = request.request) === null || _a === void 0 ? void 0 : _a.host;
48
48
  if (receipt.hostname !== reqHost) {
49
49
  throw new Error(`Expected server name ${reqHost}, got ${receipt.hostname}`);
@@ -186,4 +186,4 @@ function getWithoutHeader(message) {
186
186
  // strip the record header (xx 03 03 xx xx)
187
187
  return message.slice(5);
188
188
  }
189
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXJ0LXZhbGlkLWNsYWltLXJlcXVlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmVyL3V0aWxzL2Fzc2VydC12YWxpZC1jbGFpbS1yZXF1ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBNENBLDBEQWtFQztBQU1ELHNFQWtDQztBQU9ELHdEQTJDQztBQUVELDhDQThGQztBQUVELDRDQUdDO0FBN1NELDhDQUc2QjtBQUM3Qix1Q0FNc0I7QUFDdEIsNkNBQXlDO0FBQ3pDLHdEQUErRDtBQUMvRCwwRUFBcUU7QUFTckUscUNBTWtCO0FBQ2xCLHFEQUFpRDtBQUVqRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSSxLQUFLLFVBQVUsdUJBQXVCLENBQzVDLE9BQTJCLEVBQzNCLFFBQXFCLEVBQ3JCLE1BQWM7O0lBRWQsTUFBTSxFQUNMLElBQUksRUFDSixVQUFVLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLEVBQUUsRUFDckMsUUFBUSxFQUNSLGFBQWEsRUFDYixhQUFhLEVBQ2IsR0FBRyxPQUFPLENBQUE7SUFDWCxJQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixNQUFNLElBQUkscUJBQWEsQ0FDdEIscUJBQXFCLEVBQ3JCLG1DQUFtQyxDQUNuQyxDQUFBO0lBQ0YsQ0FBQztJQUVELElBQUcsQ0FBQyxDQUFBLGdCQUFnQixhQUFoQixnQkFBZ0IsdUJBQWhCLGdCQUFnQixDQUFFLE1BQU0sQ0FBQSxFQUFFLENBQUM7UUFDOUIsTUFBTSxJQUFJLHFCQUFhLENBQ3RCLHFCQUFxQixFQUNyQix3Q0FBd0MsQ0FDeEMsQ0FBQTtJQUNGLENBQUM7SUFFRCwyQkFBMkI7SUFDM0IsTUFBTSxhQUFhLEdBQUcsd0JBQWtCO1NBQ3RDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsQ0FBQztTQUM3QyxNQUFNLEVBQUUsQ0FBQTtJQUNWLE1BQU0sRUFBRSxNQUFNLEVBQUUs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
189
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXJ0LXZhbGlkLWNsYWltLXJlcXVlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmVyL3V0aWxzL2Fzc2VydC12YWxpZC1jbGFpbS1yZXF1ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBNENBLDBEQWtFQztBQU1ELHNFQWtDQztBQU9ELHdEQTJDQztBQUVELDhDQThGQztBQUVELDRDQUdDO0FBN1NELDhDQUc2QjtBQUU3Qix1Q0FNc0I7QUFDdEIsNkNBQXlDO0FBQ3pDLHdEQUErRDtBQUMvRCwwRUFBcUU7QUFRckUscUNBTWtCO0FBQ2xCLHFEQUFpRDtBQUVqRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSSxLQUFLLFVBQVUsdUJBQXVCLENBQzVDLE9BQTJCLEVBQzNCLFFBQXFCLEVBQ3JCLE1BQWM7O0lBRWQsTUFBTSxFQUNMLElBQUksRUFDSixVQUFVLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLEVBQUUsRUFDckMsUUFBUSxFQUNSLGFBQWEsRUFDYixhQUFhLEVBQ2IsR0FBRyxPQUFPLENBQUE7SUFDWCxJQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixNQUFNLElBQUkscUJBQWEsQ0FDdEIscUJBQXFCLEVBQ3JCLG1DQUFtQyxDQUNuQyxDQUFBO0lBQ0YsQ0FBQztJQUVELElBQUcsQ0FBQyxDQUFBLGdCQUFnQixhQUFoQixnQkFBZ0IsdUJBQWhCLGdCQUFnQixDQUFFLE1BQU0sQ0FBQSxFQUFFLENBQUM7UUFDOUIsTUFBTSxJQUFJLHFCQUFhLENBQ3RCLHFCQUFxQixFQUNyQix3Q0FBd0MsQ0FDeEMsQ0FBQTtJQUNGLENBQUM7SUFFRCwyQkFBMkI7SUFDM0IsTUFBTSxhQUFhLEdBQUcsd0JBQWtCO1NBQ3RDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsQ0FBQztTQUM3QyxNQUFNLEVBQUUsQ0FBQTtJQUNWLE1BQU0sRUFBRSxNQUFNLEVBQUUs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
@@ -0,0 +1,7 @@
1
+ import { IDecryptedTranscript } from '../../types';
2
+ /**
3
+ * Verifies server cert chain and removes handshake messages from transcript, returning new one
4
+ * @param receipt
5
+ * @param logger
6
+ */
7
+ export declare function verifyServerCertificates(receipt: IDecryptedTranscript, logger: any): Promise<IDecryptedTranscript>;
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.verifyServerCertificates = verifyServerCertificates;
4
+ const tls_1 = require("@reclaimprotocol/tls");
5
+ const parse_certificate_1 = require("@reclaimprotocol/tls/lib/utils/parse-certificate");
6
+ const utils_1 = require("../../utils");
7
+ const RECORD_LENGTH_BYTES = 3;
8
+ /**
9
+ * Verifies server cert chain and removes handshake messages from transcript, returning new one
10
+ * @param receipt
11
+ * @param logger
12
+ */
13
+ async function verifyServerCertificates(receipt, logger) {
14
+ const handshakeMsgs = (0, utils_1.extractHandshakeFromTranscript)(receipt);
15
+ let handshakeData = (0, tls_1.concatenateUint8Arrays)(handshakeMsgs.messages.map(m => m.message));
16
+ let packetData;
17
+ const handshakeRawMessages = [];
18
+ const certificates = [];
19
+ let cipherSuite = undefined;
20
+ let serverRandom = undefined;
21
+ let clientRandom = undefined;
22
+ let certVerified = false;
23
+ while ((packetData = readPacket()) && !certVerified) {
24
+ const { type, content } = packetData;
25
+ switch (type) {
26
+ case tls_1.SUPPORTED_RECORD_TYPE_MAP.CLIENT_HELLO:
27
+ const clientHello = (0, tls_1.parseClientHello)(handshakeRawMessages[0]);
28
+ clientRandom = clientHello.serverRandom;
29
+ break;
30
+ case tls_1.SUPPORTED_RECORD_TYPE_MAP.SERVER_HELLO:
31
+ const serverHello = await (0, tls_1.parseServerHello)(content);
32
+ cipherSuite = serverHello.cipherSuite;
33
+ serverRandom = serverHello.serverRandom;
34
+ break;
35
+ case tls_1.SUPPORTED_RECORD_TYPE_MAP.CERTIFICATE:
36
+ const parseResult = (0, tls_1.parseCertificates)(content, { version: receipt.tlsVersion });
37
+ certificates.push(...parseResult.certificates);
38
+ break;
39
+ case tls_1.SUPPORTED_RECORD_TYPE_MAP.CERTIFICATE_VERIFY:
40
+ const signature = (0, tls_1.parseServerCertificateVerify)(content);
41
+ if (!(certificates === null || certificates === void 0 ? void 0 : certificates.length)) {
42
+ throw new Error('No provider certificates received');
43
+ }
44
+ const signatureData = await (0, tls_1.getSignatureDataTls13)(handshakeRawMessages.slice(0, -1), cipherSuite);
45
+ await (0, tls_1.verifyCertificateSignature)({
46
+ ...signature,
47
+ publicKey: certificates[0].getPublicKey(),
48
+ signatureData,
49
+ });
50
+ await (0, parse_certificate_1.verifyCertificateChain)(certificates, receipt.hostname);
51
+ logger.info({ host: receipt.hostname }, 'verified provider certificate chain');
52
+ certVerified = true;
53
+ break;
54
+ case tls_1.SUPPORTED_RECORD_TYPE_MAP.SERVER_KEY_SHARE:
55
+ if (!(certificates === null || certificates === void 0 ? void 0 : certificates.length)) {
56
+ throw new Error('No provider certificates received');
57
+ }
58
+ const keyShare = await (0, tls_1.processServerKeyShare)(content);
59
+ const signatureData12 = await (0, tls_1.getSignatureDataTls12)({
60
+ clientRandom: clientRandom,
61
+ serverRandom: serverRandom,
62
+ curveType: keyShare.publicKeyType,
63
+ publicKey: keyShare.publicKey,
64
+ });
65
+ // verify signature
66
+ await (0, tls_1.verifyCertificateSignature)({
67
+ signature: keyShare.signatureBytes,
68
+ algorithm: keyShare.signatureAlgorithm,
69
+ publicKey: certificates[0].getPublicKey(),
70
+ signatureData: signatureData12,
71
+ });
72
+ await (0, parse_certificate_1.verifyCertificateChain)(certificates, receipt.hostname);
73
+ logger.info({ host: receipt.hostname }, 'verified provider certificate chain');
74
+ certVerified = true;
75
+ break;
76
+ }
77
+ }
78
+ if (!certVerified) {
79
+ throw new Error('No provider certificates received');
80
+ }
81
+ function readPacket() {
82
+ if (!handshakeData.length) {
83
+ return;
84
+ }
85
+ const type = handshakeData[0];
86
+ const content = (0, tls_1.readWithLength)(handshakeData.slice(1), RECORD_LENGTH_BYTES);
87
+ if (!content) {
88
+ logger.warn('missing bytes from packet');
89
+ return;
90
+ }
91
+ const totalLength = 1 + RECORD_LENGTH_BYTES + content.length;
92
+ handshakeRawMessages.push(handshakeData.slice(0, totalLength));
93
+ handshakeData = handshakeData.slice(totalLength);
94
+ return { type, content };
95
+ }
96
+ return {
97
+ tlsVersion: receipt.tlsVersion,
98
+ hostname: receipt.hostname,
99
+ transcript: receipt.transcript.slice(handshakeMsgs.lastMsgIndex)
100
+ };
101
+ }
@@ -1,6 +1,7 @@
1
+ import { ZKEngine } from '@reclaimprotocol/zk-symmetric-crypto';
1
2
  import { AttestorClient } from '../client/utils/client-socket';
2
3
  import { createMockServer } from '../tests/mock-provider-server';
3
- import { IAttestorServerSocket, ZKEngine } from '../types';
4
+ import { IAttestorServerSocket } from '../types';
4
5
  type ServerOpts = {
5
6
  /**
6
7
  * Get the client's connection on the server.
@@ -55,7 +55,7 @@ const describeWithServer = (name, fn) => describe(name, () => {
55
55
  },
56
56
  mockHttpsServer,
57
57
  mockhttpsServerPort: httpsServerPort,
58
- zkEngine: 'snarkJS'
58
+ zkEngine: 'snarkjs'
59
59
  });
60
60
  function getClientOnServer() {
61
61
  var _a;
@@ -64,4 +64,4 @@ const describeWithServer = (name, fn) => describe(name, () => {
64
64
  }
65
65
  });
66
66
  exports.describeWithServer = describeWithServer;
67
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpYmUtd2l0aC1zZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdHMvZGVzY3JpYmUtd2l0aC1zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsa0VBQStEO0FBQy9ELHVDQUF3QztBQUN4Qyx1Q0FBeUM7QUFDekMseUVBQWlFO0FBQ2pFLDJDQUE4QztBQUM5QywyQ0FBaUU7QUFFakUscUNBQWtDO0FBQ2xDLDJCQUFvRDtBQWdCcEQ7OztHQUdHO0FBQ0ksTUFBTSxrQkFBa0IsR0FBRyxDQUNqQyxJQUFZLEVBQ1osRUFBOEIsRUFDN0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFO0lBQ3hCLElBQUksUUFBeUIsQ0FBQTtJQUU3QixJQUFJLFdBQW1CLENBQUE7SUFFdkIsSUFBSSxhQUFxQixDQUFBO0lBQ3pCLElBQUksTUFBc0IsQ0FBQTtJQUUxQixNQUFNLFlBQVksR0FBRyxJQUFBLHFCQUFhLEdBQUUsQ0FBQTtJQUNwQyxNQUFNLGVBQWUsR0FBRyxJQUFBLHFCQUFhLEdBQUUsQ0FBQTtJQUV2QyxNQUFNLGVBQWUsR0FBRyxJQUFBLHVDQUFnQixFQUFDLGVBQWUsQ0FBQyxDQUFBO0lBRXpELFNBQVMsQ0FBQyxLQUFLLElBQUcsRUFBRTtRQUNuQixRQUFRLEdBQUcsTUFBTSxJQUFBLHFCQUFZLEVBQUMsWUFBWSxDQUFDLENBQUE7UUFDM0MsV0FBVyxHQUFHLGtCQUFrQixZQUFZLEdBQUcsb0JBQVcsRUFBRSxDQUFBO0lBQzdELENBQUMsQ0FBQyxDQUFBO0lBRUYsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUNiLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUNoQixlQUFlLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQy9CLENBQUMsQ0FBQyxDQUFBO0lBRUYsVUFBVSxDQUFDLEtBQUssSUFBRyxFQUFFO1FBQ3BCLG9CQUFZLENBQUMsU0FBUyxFQUFFLENBQUE7UUFFeEIsYUFBYSxHQUFHLElBQUEsd0JBQWdCLEdBQUUsQ0FBQTtRQUNsQyxNQUFNLEdBQUcsSUFBSSw4QkFBYyxDQUFDO1lBQzNCLE1BQU0sRUFBRSxjQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ25DLEdBQUcsRUFBRSxXQUFXO1lBQ2hCLFNBQVMsRUFBRSxjQUFTO1NBQ3BCLENBQUMsQ0FBQTtRQUNGLE1BQU0sTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQzNCLENBQUMsQ0FBQyxDQUFBO0lBRUYsU0FBUyxDQUFDLEtBQUssSUFBRyxFQUFFO1FBQ25CLE1BQU0sTUFBTSxDQUFDLG1CQUFtQixFQUFFLENBQUE7SUFDbkMsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUM7UUFDRixpQkFBaUI7UUFDakIsSUFBSSxNQUFNO1lBQ1QsT0FBTyxNQUFNLENBQUE7UUFDZCxDQUFDO1FBQ0QsSUFBSSxhQUFhO1lBQ2hCLE9BQU8sYUFBYSxDQUFBO1FBQ3JCLENBQUM7UUFDRCxJQUFJLFNBQVM7WUFDWixPQUFPLFdBQVcsQ0FBQTtRQUNuQixDQUFDO1FBQ0QsZUFBZTtRQUNmLG1CQUFtQixFQUFFLGVBQWU7UUFDcEMsUUFBUSxFQUFFLFNBQVM7S0FDbkIsQ0FBQyxDQUFBO0lBRUYsU0FBUyxpQkFBaUI7O1FBQ3pCLE1BQU0sYUFBYSxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFnQixDQUFBO1FBQ25FLE9BQU8sTUFBQSxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLDBDQUFFLFlBQVksQ0FBQTtJQUMxQyxDQUFDO0FBQ0YsQ0FBQyxDQUFDLENBQUE7QUE5RFcsUUFBQSxrQkFBa0Isc0JBOEQ3QiJ9
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpYmUtd2l0aC1zZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdHMvZGVzY3JpYmUtd2l0aC1zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0Esa0VBQStEO0FBQy9ELHVDQUF3QztBQUN4Qyx1Q0FBeUM7QUFDekMseUVBQWlFO0FBQ2pFLDJDQUE4QztBQUM5QywyQ0FBaUU7QUFFakUscUNBQWtDO0FBQ2xDLDJCQUFvRDtBQWdCcEQ7OztHQUdHO0FBQ0ksTUFBTSxrQkFBa0IsR0FBRyxDQUNqQyxJQUFZLEVBQ1osRUFBOEIsRUFDN0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFO0lBQ3hCLElBQUksUUFBeUIsQ0FBQTtJQUU3QixJQUFJLFdBQW1CLENBQUE7SUFFdkIsSUFBSSxhQUFxQixDQUFBO0lBQ3pCLElBQUksTUFBc0IsQ0FBQTtJQUUxQixNQUFNLFlBQVksR0FBRyxJQUFBLHFCQUFhLEdBQUUsQ0FBQTtJQUNwQyxNQUFNLGVBQWUsR0FBRyxJQUFBLHFCQUFhLEdBQUUsQ0FBQTtJQUV2QyxNQUFNLGVBQWUsR0FBRyxJQUFBLHVDQUFnQixFQUFDLGVBQWUsQ0FBQyxDQUFBO0lBRXpELFNBQVMsQ0FBQyxLQUFLLElBQUcsRUFBRTtRQUNuQixRQUFRLEdBQUcsTUFBTSxJQUFBLHFCQUFZLEVBQUMsWUFBWSxDQUFDLENBQUE7UUFDM0MsV0FBVyxHQUFHLGtCQUFrQixZQUFZLEdBQUcsb0JBQVcsRUFBRSxDQUFBO0lBQzdELENBQUMsQ0FBQyxDQUFBO0lBRUYsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUNiLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUNoQixlQUFlLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQy9CLENBQUMsQ0FBQyxDQUFBO0lBRUYsVUFBVSxDQUFDLEtBQUssSUFBRyxFQUFFO1FBQ3BCLG9CQUFZLENBQUMsU0FBUyxFQUFFLENBQUE7UUFFeEIsYUFBYSxHQUFHLElBQUEsd0JBQWdCLEdBQUUsQ0FBQTtRQUNsQyxNQUFNLEdBQUcsSUFBSSw4QkFBYyxDQUFDO1lBQzNCLE1BQU0sRUFBRSxjQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ25DLEdBQUcsRUFBRSxXQUFXO1lBQ2hCLFNBQVMsRUFBRSxjQUFTO1NBQ3BCLENBQUMsQ0FBQTtRQUNGLE1BQU0sTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQzNCLENBQUMsQ0FBQyxDQUFBO0lBRUYsU0FBUyxDQUFDLEtBQUssSUFBRyxFQUFFO1FBQ25CLE1BQU0sTUFBTSxDQUFDLG1CQUFtQixFQUFFLENBQUE7SUFDbkMsQ0FBQyxDQUFDLENBQUE7SUFFRixFQUFFLENBQUM7UUFDRixpQkFBaUI7UUFDakIsSUFBSSxNQUFNO1lBQ1QsT0FBTyxNQUFNLENBQUE7UUFDZCxDQUFDO1FBQ0QsSUFBSSxhQUFhO1lBQ2hCLE9BQU8sYUFBYSxDQUFBO1FBQ3JCLENBQUM7UUFDRCxJQUFJLFNBQVM7WUFDWixPQUFPLFdBQVcsQ0FBQTtRQUNuQixDQUFDO1FBQ0QsZUFBZTtRQUNmLG1CQUFtQixFQUFFLGVBQWU7UUFDcEMsUUFBUSxFQUFFLFNBQVM7S0FDbkIsQ0FBQyxDQUFBO0lBRUYsU0FBUyxpQkFBaUI7O1FBQ3pCLE1BQU0sYUFBYSxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFnQixDQUFBO1FBQ25FLE9BQU8sTUFBQSxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLDBDQUFFLFlBQVksQ0FBQTtJQUMxQyxDQUFDO0FBQ0YsQ0FBQyxDQUFDLENBQUE7QUE5RFcsUUFBQSxrQkFBa0Isc0JBOEQ3QiJ9