geekin-devtoys 0.1.3 → 0.1.4

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.
@@ -0,0 +1,2487 @@
1
+ import { ElMessageBox as Ul } from "element-plus";
2
+ import { withDirectives as fl, createElementBlock as vl, openBlock as Il, vShow as Tl } from "vue";
3
+ import { _ as Hl } from "../_plugin-vue_export-helper-CHgC5LLL.mjs";
4
+ var Fl = "0123456789abcdefghijklmnopqrstuvwxyz";
5
+ function U(t) {
6
+ return Fl.charAt(t);
7
+ }
8
+ function kl(t, l) {
9
+ return t & l;
10
+ }
11
+ function O(t, l) {
12
+ return t | l;
13
+ }
14
+ function Xl(t, l) {
15
+ return t ^ l;
16
+ }
17
+ function ol(t, l) {
18
+ return t & ~l;
19
+ }
20
+ function Cl(t) {
21
+ if (t == 0)
22
+ return -1;
23
+ var l = 0;
24
+ return (t & 65535) == 0 && (t >>= 16, l += 16), (t & 255) == 0 && (t >>= 8, l += 8), (t & 15) == 0 && (t >>= 4, l += 4), (t & 3) == 0 && (t >>= 2, l += 2), (t & 1) == 0 && ++l, l;
25
+ }
26
+ function gl(t) {
27
+ for (var l = 0; t != 0; )
28
+ t &= t - 1, ++l;
29
+ return l;
30
+ }
31
+ var z = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", xl = "=";
32
+ function D(t) {
33
+ var l, i, Z = "";
34
+ for (l = 0; l + 3 <= t.length; l += 3)
35
+ i = parseInt(t.substring(l, l + 3), 16), Z += z.charAt(i >> 6) + z.charAt(i & 63);
36
+ for (l + 1 == t.length ? (i = parseInt(t.substring(l, l + 1), 16), Z += z.charAt(i << 2)) : l + 2 == t.length && (i = parseInt(t.substring(l, l + 2), 16), Z += z.charAt(i >> 2) + z.charAt((i & 3) << 4)); (Z.length & 3) > 0; )
37
+ Z += xl;
38
+ return Z;
39
+ }
40
+ function Wl(t) {
41
+ var l = "", i, Z = 0, d = 0;
42
+ for (i = 0; i < t.length && t.charAt(i) != xl; ++i) {
43
+ var b = z.indexOf(t.charAt(i));
44
+ b < 0 || (Z == 0 ? (l += U(b >> 2), d = b & 3, Z = 1) : Z == 1 ? (l += U(d << 2 | b >> 4), d = b & 15, Z = 2) : Z == 2 ? (l += U(d), l += U(b >> 2), d = b & 3, Z = 3) : (l += U(d << 2 | b >> 4), l += U(b & 15), Z = 0));
45
+ }
46
+ return Z == 1 && (l += U(d << 2)), l;
47
+ }
48
+ var C, zl = {
49
+ decode: function(t) {
50
+ var l;
51
+ if (C === void 0) {
52
+ var i = "0123456789ABCDEF", Z = ` \f
53
+ \r  \u2028\u2029`;
54
+ for (C = {}, l = 0; l < 16; ++l)
55
+ C[i.charAt(l)] = l;
56
+ for (i = i.toLowerCase(), l = 10; l < 16; ++l)
57
+ C[i.charAt(l)] = l;
58
+ for (l = 0; l < Z.length; ++l)
59
+ C[Z.charAt(l)] = -1;
60
+ }
61
+ var d = [], b = 0, m = 0;
62
+ for (l = 0; l < t.length; ++l) {
63
+ var s = t.charAt(l);
64
+ if (s == "=")
65
+ break;
66
+ if (s = C[s], s != -1) {
67
+ if (s === void 0)
68
+ throw new Error("Illegal character at offset " + l);
69
+ b |= s, ++m >= 2 ? (d[d.length] = b, b = 0, m = 0) : b <<= 4;
70
+ }
71
+ }
72
+ if (m)
73
+ throw new Error("Hex encoding incomplete: 4 bits missing");
74
+ return d;
75
+ }
76
+ }, H, ul = {
77
+ decode: function(t) {
78
+ var l;
79
+ if (H === void 0) {
80
+ var i = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", Z = `= \f
81
+ \r  \u2028\u2029`;
82
+ for (H = /* @__PURE__ */ Object.create(null), l = 0; l < 64; ++l)
83
+ H[i.charAt(l)] = l;
84
+ for (H["-"] = 62, H._ = 63, l = 0; l < Z.length; ++l)
85
+ H[Z.charAt(l)] = -1;
86
+ }
87
+ var d = [], b = 0, m = 0;
88
+ for (l = 0; l < t.length; ++l) {
89
+ var s = t.charAt(l);
90
+ if (s == "=")
91
+ break;
92
+ if (s = H[s], s != -1) {
93
+ if (s === void 0)
94
+ throw new Error("Illegal character at offset " + l);
95
+ b |= s, ++m >= 4 ? (d[d.length] = b >> 16, d[d.length] = b >> 8 & 255, d[d.length] = b & 255, b = 0, m = 0) : b <<= 6;
96
+ }
97
+ }
98
+ switch (m) {
99
+ case 1:
100
+ throw new Error("Base64 encoding incomplete: at least 2 bits missing");
101
+ case 2:
102
+ d[d.length] = b >> 10;
103
+ break;
104
+ case 3:
105
+ d[d.length] = b >> 16, d[d.length] = b >> 8 & 255;
106
+ break;
107
+ }
108
+ return d;
109
+ },
110
+ re: /-----BEGIN [^-]+-----([A-Za-z0-9+\/=\s]+)-----END [^-]+-----|begin-base64[^\n]+\n([A-Za-z0-9+\/=\s]+)====/,
111
+ unarmor: function(t) {
112
+ var l = ul.re.exec(t);
113
+ if (l)
114
+ if (l[1])
115
+ t = l[1];
116
+ else if (l[2])
117
+ t = l[2];
118
+ else
119
+ throw new Error("RegExp out of sync");
120
+ return ul.decode(t);
121
+ }
122
+ }, g = 1e13, M = (
123
+ /** @class */
124
+ (function() {
125
+ function t(l) {
126
+ this.buf = [+l || 0];
127
+ }
128
+ return t.prototype.mulAdd = function(l, i) {
129
+ var Z = this.buf, d = Z.length, b, m;
130
+ for (b = 0; b < d; ++b)
131
+ m = Z[b] * l + i, m < g ? i = 0 : (i = 0 | m / g, m -= i * g), Z[b] = m;
132
+ i > 0 && (Z[b] = i);
133
+ }, t.prototype.sub = function(l) {
134
+ var i = this.buf, Z = i.length, d, b;
135
+ for (d = 0; d < Z; ++d)
136
+ b = i[d] - l, b < 0 ? (b += g, l = 1) : l = 0, i[d] = b;
137
+ for (; i[i.length - 1] === 0; )
138
+ i.pop();
139
+ }, t.prototype.toString = function(l) {
140
+ if ((l || 10) != 10)
141
+ throw new Error("only base 10 is supported");
142
+ for (var i = this.buf, Z = i[i.length - 1].toString(), d = i.length - 2; d >= 0; --d)
143
+ Z += (g + i[d]).toString().substring(1);
144
+ return Z;
145
+ }, t.prototype.valueOf = function() {
146
+ for (var l = this.buf, i = 0, Z = l.length - 1; Z >= 0; --Z)
147
+ i = i * g + l[Z];
148
+ return i;
149
+ }, t.prototype.simplify = function() {
150
+ var l = this.buf;
151
+ return l.length == 1 ? l[0] : this;
152
+ }, t;
153
+ })()
154
+ ), Ll = "…", Pl = /^(\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/, jl = /^(\d\d\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/;
155
+ function P(t, l) {
156
+ return t.length > l && (t = t.substring(0, l) + Ll), t;
157
+ }
158
+ var bl = (
159
+ /** @class */
160
+ (function() {
161
+ function t(l, i) {
162
+ this.hexDigits = "0123456789ABCDEF", l instanceof t ? (this.enc = l.enc, this.pos = l.pos) : (this.enc = l, this.pos = i);
163
+ }
164
+ return t.prototype.get = function(l) {
165
+ if (l === void 0 && (l = this.pos++), l >= this.enc.length)
166
+ throw new Error("Requesting byte offset ".concat(l, " on a stream of length ").concat(this.enc.length));
167
+ return typeof this.enc == "string" ? this.enc.charCodeAt(l) : this.enc[l];
168
+ }, t.prototype.hexByte = function(l) {
169
+ return this.hexDigits.charAt(l >> 4 & 15) + this.hexDigits.charAt(l & 15);
170
+ }, t.prototype.hexDump = function(l, i, Z) {
171
+ for (var d = "", b = l; b < i; ++b)
172
+ if (d += this.hexByte(this.get(b)), Z !== !0)
173
+ switch (b & 15) {
174
+ case 7:
175
+ d += " ";
176
+ break;
177
+ case 15:
178
+ d += `
179
+ `;
180
+ break;
181
+ default:
182
+ d += " ";
183
+ }
184
+ return d;
185
+ }, t.prototype.isASCII = function(l, i) {
186
+ for (var Z = l; Z < i; ++Z) {
187
+ var d = this.get(Z);
188
+ if (d < 32 || d > 176)
189
+ return !1;
190
+ }
191
+ return !0;
192
+ }, t.prototype.parseStringISO = function(l, i) {
193
+ for (var Z = "", d = l; d < i; ++d)
194
+ Z += String.fromCharCode(this.get(d));
195
+ return Z;
196
+ }, t.prototype.parseStringUTF = function(l, i) {
197
+ for (var Z = "", d = l; d < i; ) {
198
+ var b = this.get(d++);
199
+ b < 128 ? Z += String.fromCharCode(b) : b > 191 && b < 224 ? Z += String.fromCharCode((b & 31) << 6 | this.get(d++) & 63) : Z += String.fromCharCode((b & 15) << 12 | (this.get(d++) & 63) << 6 | this.get(d++) & 63);
200
+ }
201
+ return Z;
202
+ }, t.prototype.parseStringBMP = function(l, i) {
203
+ for (var Z = "", d, b, m = l; m < i; )
204
+ d = this.get(m++), b = this.get(m++), Z += String.fromCharCode(d << 8 | b);
205
+ return Z;
206
+ }, t.prototype.parseTime = function(l, i, Z) {
207
+ var d = this.parseStringISO(l, i), b = (Z ? Pl : jl).exec(d);
208
+ return b ? (Z && (b[1] = +b[1], b[1] += +b[1] < 70 ? 2e3 : 1900), d = b[1] + "-" + b[2] + "-" + b[3] + " " + b[4], b[5] && (d += ":" + b[5], b[6] && (d += ":" + b[6], b[7] && (d += "." + b[7]))), b[8] && (d += " UTC", b[8] != "Z" && (d += b[8], b[9] && (d += ":" + b[9]))), d) : "Unrecognized time: " + d;
209
+ }, t.prototype.parseInteger = function(l, i) {
210
+ for (var Z = this.get(l), d = Z > 127, b = d ? 255 : 0, m, s = ""; Z == b && ++l < i; )
211
+ Z = this.get(l);
212
+ if (m = i - l, m === 0)
213
+ return d ? -1 : 0;
214
+ if (m > 4) {
215
+ for (s = Z, m <<= 3; ((+s ^ b) & 128) == 0; )
216
+ s = +s << 1, --m;
217
+ s = "(" + m + ` bit)
218
+ `;
219
+ }
220
+ d && (Z = Z - 256);
221
+ for (var c = new M(Z), e = l + 1; e < i; ++e)
222
+ c.mulAdd(256, this.get(e));
223
+ return s + c.toString();
224
+ }, t.prototype.parseBitString = function(l, i, Z) {
225
+ for (var d = this.get(l), b = (i - l - 1 << 3) - d, m = "(" + b + ` bit)
226
+ `, s = "", c = l + 1; c < i; ++c) {
227
+ for (var e = this.get(c), h = c == i - 1 ? d : 0, n = 7; n >= h; --n)
228
+ s += e >> n & 1 ? "1" : "0";
229
+ if (s.length > Z)
230
+ return m + P(s, Z);
231
+ }
232
+ return m + s;
233
+ }, t.prototype.parseOctetString = function(l, i, Z) {
234
+ if (this.isASCII(l, i))
235
+ return P(this.parseStringISO(l, i), Z);
236
+ var d = i - l, b = "(" + d + ` byte)
237
+ `;
238
+ Z /= 2, d > Z && (i = l + Z);
239
+ for (var m = l; m < i; ++m)
240
+ b += this.hexByte(this.get(m));
241
+ return d > Z && (b += Ll), b;
242
+ }, t.prototype.parseOID = function(l, i, Z) {
243
+ for (var d = "", b = new M(), m = 0, s = l; s < i; ++s) {
244
+ var c = this.get(s);
245
+ if (b.mulAdd(128, c & 127), m += 7, !(c & 128)) {
246
+ if (d === "")
247
+ if (b = b.simplify(), b instanceof M)
248
+ b.sub(80), d = "2." + b.toString();
249
+ else {
250
+ var e = b < 80 ? b < 40 ? 0 : 1 : 2;
251
+ d = e + "." + (b - e * 40);
252
+ }
253
+ else
254
+ d += "." + b.toString();
255
+ if (d.length > Z)
256
+ return P(d, Z);
257
+ b = new M(), m = 0;
258
+ }
259
+ }
260
+ return m > 0 && (d += ".incomplete"), d;
261
+ }, t;
262
+ })()
263
+ ), Ql = (
264
+ /** @class */
265
+ (function() {
266
+ function t(l, i, Z, d, b) {
267
+ if (!(d instanceof al))
268
+ throw new Error("Invalid tag value.");
269
+ this.stream = l, this.header = i, this.length = Z, this.tag = d, this.sub = b;
270
+ }
271
+ return t.prototype.typeName = function() {
272
+ switch (this.tag.tagClass) {
273
+ case 0:
274
+ switch (this.tag.tagNumber) {
275
+ case 0:
276
+ return "EOC";
277
+ case 1:
278
+ return "BOOLEAN";
279
+ case 2:
280
+ return "INTEGER";
281
+ case 3:
282
+ return "BIT_STRING";
283
+ case 4:
284
+ return "OCTET_STRING";
285
+ case 5:
286
+ return "NULL";
287
+ case 6:
288
+ return "OBJECT_IDENTIFIER";
289
+ case 7:
290
+ return "ObjectDescriptor";
291
+ case 8:
292
+ return "EXTERNAL";
293
+ case 9:
294
+ return "REAL";
295
+ case 10:
296
+ return "ENUMERATED";
297
+ case 11:
298
+ return "EMBEDDED_PDV";
299
+ case 12:
300
+ return "UTF8String";
301
+ case 16:
302
+ return "SEQUENCE";
303
+ case 17:
304
+ return "SET";
305
+ case 18:
306
+ return "NumericString";
307
+ case 19:
308
+ return "PrintableString";
309
+ // ASCII subset
310
+ case 20:
311
+ return "TeletexString";
312
+ // aka T61String
313
+ case 21:
314
+ return "VideotexString";
315
+ case 22:
316
+ return "IA5String";
317
+ // ASCII
318
+ case 23:
319
+ return "UTCTime";
320
+ case 24:
321
+ return "GeneralizedTime";
322
+ case 25:
323
+ return "GraphicString";
324
+ case 26:
325
+ return "VisibleString";
326
+ // ASCII subset
327
+ case 27:
328
+ return "GeneralString";
329
+ case 28:
330
+ return "UniversalString";
331
+ case 30:
332
+ return "BMPString";
333
+ }
334
+ return "Universal_" + this.tag.tagNumber.toString();
335
+ case 1:
336
+ return "Application_" + this.tag.tagNumber.toString();
337
+ case 2:
338
+ return "[" + this.tag.tagNumber.toString() + "]";
339
+ // Context
340
+ case 3:
341
+ return "Private_" + this.tag.tagNumber.toString();
342
+ }
343
+ }, t.prototype.content = function(l) {
344
+ if (this.tag === void 0)
345
+ return null;
346
+ l === void 0 && (l = 1 / 0);
347
+ var i = this.posContent(), Z = Math.abs(this.length);
348
+ if (!this.tag.isUniversal())
349
+ return this.sub !== null ? "(" + this.sub.length + " elem)" : this.stream.parseOctetString(i, i + Z, l);
350
+ switch (this.tag.tagNumber) {
351
+ case 1:
352
+ return this.stream.get(i) === 0 ? "false" : "true";
353
+ case 2:
354
+ return this.stream.parseInteger(i, i + Z);
355
+ case 3:
356
+ return this.sub ? "(" + this.sub.length + " elem)" : this.stream.parseBitString(i, i + Z, l);
357
+ case 4:
358
+ return this.sub ? "(" + this.sub.length + " elem)" : this.stream.parseOctetString(i, i + Z, l);
359
+ // case 0x05: // NULL
360
+ case 6:
361
+ return this.stream.parseOID(i, i + Z, l);
362
+ // case 0x07: // ObjectDescriptor
363
+ // case 0x08: // EXTERNAL
364
+ // case 0x09: // REAL
365
+ // case 0x0A: // ENUMERATED
366
+ // case 0x0B: // EMBEDDED_PDV
367
+ case 16:
368
+ // SEQUENCE
369
+ case 17:
370
+ return this.sub !== null ? "(" + this.sub.length + " elem)" : "(no elem)";
371
+ case 12:
372
+ return P(this.stream.parseStringUTF(i, i + Z), l);
373
+ case 18:
374
+ // NumericString
375
+ case 19:
376
+ // PrintableString
377
+ case 20:
378
+ // TeletexString
379
+ case 21:
380
+ // VideotexString
381
+ case 22:
382
+ // IA5String
383
+ // case 0x19: // GraphicString
384
+ case 26:
385
+ return P(this.stream.parseStringISO(i, i + Z), l);
386
+ case 30:
387
+ return P(this.stream.parseStringBMP(i, i + Z), l);
388
+ case 23:
389
+ // UTCTime
390
+ case 24:
391
+ return this.stream.parseTime(i, i + Z, this.tag.tagNumber == 23);
392
+ }
393
+ return null;
394
+ }, t.prototype.toString = function() {
395
+ return this.typeName() + "@" + this.stream.pos + "[header:" + this.header + ",length:" + this.length + ",sub:" + (this.sub === null ? "null" : this.sub.length) + "]";
396
+ }, t.prototype.toPrettyString = function(l) {
397
+ l === void 0 && (l = "");
398
+ var i = l + this.typeName() + " @" + this.stream.pos;
399
+ if (this.length >= 0 && (i += "+"), i += this.length, this.tag.tagConstructed ? i += " (constructed)" : this.tag.isUniversal() && (this.tag.tagNumber == 3 || this.tag.tagNumber == 4) && this.sub !== null && (i += " (encapsulates)"), i += `
400
+ `, this.sub !== null) {
401
+ l += " ";
402
+ for (var Z = 0, d = this.sub.length; Z < d; ++Z)
403
+ i += this.sub[Z].toPrettyString(l);
404
+ }
405
+ return i;
406
+ }, t.prototype.posStart = function() {
407
+ return this.stream.pos;
408
+ }, t.prototype.posContent = function() {
409
+ return this.stream.pos + this.header;
410
+ }, t.prototype.posEnd = function() {
411
+ return this.stream.pos + this.header + Math.abs(this.length);
412
+ }, t.prototype.toHexString = function() {
413
+ return this.stream.hexDump(this.posStart(), this.posEnd(), !0);
414
+ }, t.decodeLength = function(l) {
415
+ var i = l.get(), Z = i & 127;
416
+ if (Z == i)
417
+ return Z;
418
+ if (Z > 6)
419
+ throw new Error("Length over 48 bits not supported at position " + (l.pos - 1));
420
+ if (Z === 0)
421
+ return null;
422
+ i = 0;
423
+ for (var d = 0; d < Z; ++d)
424
+ i = i * 256 + l.get();
425
+ return i;
426
+ }, t.prototype.getHexStringValue = function() {
427
+ var l = this.toHexString(), i = this.header * 2, Z = this.length * 2;
428
+ return l.substring(i, i + Z);
429
+ }, t.decode = function(l) {
430
+ var i;
431
+ l instanceof bl ? i = l : i = new bl(l, 0);
432
+ var Z = new bl(i), d = new al(i), b = t.decodeLength(i), m = i.pos, s = m - Z.pos, c = null, e = function() {
433
+ var n = [];
434
+ if (b !== null) {
435
+ for (var W = m + b; i.pos < W; )
436
+ n[n.length] = t.decode(i);
437
+ if (i.pos != W)
438
+ throw new Error("Content size is not correct for container starting at offset " + m);
439
+ } else
440
+ try {
441
+ for (; ; ) {
442
+ var X = t.decode(i);
443
+ if (X.tag.isEOC())
444
+ break;
445
+ n[n.length] = X;
446
+ }
447
+ b = m - i.pos;
448
+ } catch (p) {
449
+ throw new Error("Exception while decoding undefined length content: " + p);
450
+ }
451
+ return n;
452
+ };
453
+ if (d.tagConstructed)
454
+ c = e();
455
+ else if (d.isUniversal() && (d.tagNumber == 3 || d.tagNumber == 4))
456
+ try {
457
+ if (d.tagNumber == 3 && i.get() != 0)
458
+ throw new Error("BIT STRINGs with unused bits cannot encapsulate.");
459
+ c = e();
460
+ for (var h = 0; h < c.length; ++h)
461
+ if (c[h].tag.isEOC())
462
+ throw new Error("EOC is not supposed to be actual content.");
463
+ } catch {
464
+ c = null;
465
+ }
466
+ if (c === null) {
467
+ if (b === null)
468
+ throw new Error("We can't skip over an invalid tag with undefined length at offset " + m);
469
+ i.pos = m + Math.abs(b);
470
+ }
471
+ return new t(Z, s, b, d, c);
472
+ }, t;
473
+ })()
474
+ ), al = (
475
+ /** @class */
476
+ (function() {
477
+ function t(l) {
478
+ var i = l.get();
479
+ if (this.tagClass = i >> 6, this.tagConstructed = (i & 32) !== 0, this.tagNumber = i & 31, this.tagNumber == 31) {
480
+ var Z = new M();
481
+ do
482
+ i = l.get(), Z.mulAdd(128, i & 127);
483
+ while (i & 128);
484
+ this.tagNumber = Z.simplify();
485
+ }
486
+ }
487
+ return t.prototype.isUniversal = function() {
488
+ return this.tagClass === 0;
489
+ }, t.prototype.isEOC = function() {
490
+ return this.tagClass === 0 && this.tagNumber === 0;
491
+ }, t;
492
+ })()
493
+ ), I, wl = 244837814094590, Vl = (wl & 16777215) == 15715070, S = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997], Ml = (1 << 26) / S[S.length - 1], o = (
494
+ /** @class */
495
+ (function() {
496
+ function t(l, i, Z) {
497
+ l != null && (typeof l == "number" ? this.fromNumber(l, i, Z) : i == null && typeof l != "string" ? this.fromString(l, 256) : this.fromString(l, i));
498
+ }
499
+ return t.prototype.toString = function(l) {
500
+ if (this.s < 0)
501
+ return "-" + this.negate().toString(l);
502
+ var i;
503
+ if (l == 16)
504
+ i = 4;
505
+ else if (l == 8)
506
+ i = 3;
507
+ else if (l == 2)
508
+ i = 1;
509
+ else if (l == 32)
510
+ i = 5;
511
+ else if (l == 4)
512
+ i = 2;
513
+ else
514
+ return this.toRadix(l);
515
+ var Z = (1 << i) - 1, d, b = !1, m = "", s = this.t, c = this.DB - s * this.DB % i;
516
+ if (s-- > 0)
517
+ for (c < this.DB && (d = this[s] >> c) > 0 && (b = !0, m = U(d)); s >= 0; )
518
+ c < i ? (d = (this[s] & (1 << c) - 1) << i - c, d |= this[--s] >> (c += this.DB - i)) : (d = this[s] >> (c -= i) & Z, c <= 0 && (c += this.DB, --s)), d > 0 && (b = !0), b && (m += U(d));
519
+ return b ? m : "0";
520
+ }, t.prototype.negate = function() {
521
+ var l = a();
522
+ return t.ZERO.subTo(this, l), l;
523
+ }, t.prototype.abs = function() {
524
+ return this.s < 0 ? this.negate() : this;
525
+ }, t.prototype.compareTo = function(l) {
526
+ var i = this.s - l.s;
527
+ if (i != 0)
528
+ return i;
529
+ var Z = this.t;
530
+ if (i = Z - l.t, i != 0)
531
+ return this.s < 0 ? -i : i;
532
+ for (; --Z >= 0; )
533
+ if ((i = this[Z] - l[Z]) != 0)
534
+ return i;
535
+ return 0;
536
+ }, t.prototype.bitLength = function() {
537
+ return this.t <= 0 ? 0 : this.DB * (this.t - 1) + A(this[this.t - 1] ^ this.s & this.DM);
538
+ }, t.prototype.mod = function(l) {
539
+ var i = a();
540
+ return this.abs().divRemTo(l, null, i), this.s < 0 && i.compareTo(t.ZERO) > 0 && l.subTo(i, i), i;
541
+ }, t.prototype.modPowInt = function(l, i) {
542
+ var Z;
543
+ return l < 256 || i.isEven() ? Z = new pl(i) : Z = new Gl(i), this.exp(l, Z);
544
+ }, t.prototype.clone = function() {
545
+ var l = a();
546
+ return this.copyTo(l), l;
547
+ }, t.prototype.intValue = function() {
548
+ if (this.s < 0) {
549
+ if (this.t == 1)
550
+ return this[0] - this.DV;
551
+ if (this.t == 0)
552
+ return -1;
553
+ } else {
554
+ if (this.t == 1)
555
+ return this[0];
556
+ if (this.t == 0)
557
+ return 0;
558
+ }
559
+ return (this[1] & (1 << 32 - this.DB) - 1) << this.DB | this[0];
560
+ }, t.prototype.byteValue = function() {
561
+ return this.t == 0 ? this.s : this[0] << 24 >> 24;
562
+ }, t.prototype.shortValue = function() {
563
+ return this.t == 0 ? this.s : this[0] << 16 >> 16;
564
+ }, t.prototype.signum = function() {
565
+ return this.s < 0 ? -1 : this.t <= 0 || this.t == 1 && this[0] <= 0 ? 0 : 1;
566
+ }, t.prototype.toByteArray = function() {
567
+ var l = this.t, i = [];
568
+ i[0] = this.s;
569
+ var Z = this.DB - l * this.DB % 8, d, b = 0;
570
+ if (l-- > 0)
571
+ for (Z < this.DB && (d = this[l] >> Z) != (this.s & this.DM) >> Z && (i[b++] = d | this.s << this.DB - Z); l >= 0; )
572
+ Z < 8 ? (d = (this[l] & (1 << Z) - 1) << 8 - Z, d |= this[--l] >> (Z += this.DB - 8)) : (d = this[l] >> (Z -= 8) & 255, Z <= 0 && (Z += this.DB, --l)), (d & 128) != 0 && (d |= -256), b == 0 && (this.s & 128) != (d & 128) && ++b, (b > 0 || d != this.s) && (i[b++] = d);
573
+ return i;
574
+ }, t.prototype.equals = function(l) {
575
+ return this.compareTo(l) == 0;
576
+ }, t.prototype.min = function(l) {
577
+ return this.compareTo(l) < 0 ? this : l;
578
+ }, t.prototype.max = function(l) {
579
+ return this.compareTo(l) > 0 ? this : l;
580
+ }, t.prototype.and = function(l) {
581
+ var i = a();
582
+ return this.bitwiseTo(l, kl, i), i;
583
+ }, t.prototype.or = function(l) {
584
+ var i = a();
585
+ return this.bitwiseTo(l, O, i), i;
586
+ }, t.prototype.xor = function(l) {
587
+ var i = a();
588
+ return this.bitwiseTo(l, Xl, i), i;
589
+ }, t.prototype.andNot = function(l) {
590
+ var i = a();
591
+ return this.bitwiseTo(l, ol, i), i;
592
+ }, t.prototype.not = function() {
593
+ for (var l = a(), i = 0; i < this.t; ++i)
594
+ l[i] = this.DM & ~this[i];
595
+ return l.t = this.t, l.s = ~this.s, l;
596
+ }, t.prototype.shiftLeft = function(l) {
597
+ var i = a();
598
+ return l < 0 ? this.rShiftTo(-l, i) : this.lShiftTo(l, i), i;
599
+ }, t.prototype.shiftRight = function(l) {
600
+ var i = a();
601
+ return l < 0 ? this.lShiftTo(-l, i) : this.rShiftTo(l, i), i;
602
+ }, t.prototype.getLowestSetBit = function() {
603
+ for (var l = 0; l < this.t; ++l)
604
+ if (this[l] != 0)
605
+ return l * this.DB + Cl(this[l]);
606
+ return this.s < 0 ? this.t * this.DB : -1;
607
+ }, t.prototype.bitCount = function() {
608
+ for (var l = 0, i = this.s & this.DM, Z = 0; Z < this.t; ++Z)
609
+ l += gl(this[Z] ^ i);
610
+ return l;
611
+ }, t.prototype.testBit = function(l) {
612
+ var i = Math.floor(l / this.DB);
613
+ return i >= this.t ? this.s != 0 : (this[i] & 1 << l % this.DB) != 0;
614
+ }, t.prototype.setBit = function(l) {
615
+ return this.changeBit(l, O);
616
+ }, t.prototype.clearBit = function(l) {
617
+ return this.changeBit(l, ol);
618
+ }, t.prototype.flipBit = function(l) {
619
+ return this.changeBit(l, Xl);
620
+ }, t.prototype.add = function(l) {
621
+ var i = a();
622
+ return this.addTo(l, i), i;
623
+ }, t.prototype.subtract = function(l) {
624
+ var i = a();
625
+ return this.subTo(l, i), i;
626
+ }, t.prototype.multiply = function(l) {
627
+ var i = a();
628
+ return this.multiplyTo(l, i), i;
629
+ }, t.prototype.divide = function(l) {
630
+ var i = a();
631
+ return this.divRemTo(l, i, null), i;
632
+ }, t.prototype.remainder = function(l) {
633
+ var i = a();
634
+ return this.divRemTo(l, null, i), i;
635
+ }, t.prototype.divideAndRemainder = function(l) {
636
+ var i = a(), Z = a();
637
+ return this.divRemTo(l, i, Z), [i, Z];
638
+ }, t.prototype.modPow = function(l, i) {
639
+ var Z = l.bitLength(), d, b = f(1), m;
640
+ if (Z <= 0)
641
+ return b;
642
+ Z < 18 ? d = 1 : Z < 48 ? d = 3 : Z < 144 ? d = 4 : Z < 768 ? d = 5 : d = 6, Z < 8 ? m = new pl(i) : i.isEven() ? m = new El(i) : m = new Gl(i);
643
+ var s = [], c = 3, e = d - 1, h = (1 << d) - 1;
644
+ if (s[1] = m.convert(this), d > 1) {
645
+ var n = a();
646
+ for (m.sqrTo(s[1], n); c <= h; )
647
+ s[c] = a(), m.mulTo(n, s[c - 2], s[c]), c += 2;
648
+ }
649
+ var W = l.t - 1, X, p = !0, G = a(), R;
650
+ for (Z = A(l[W]) - 1; W >= 0; ) {
651
+ for (Z >= e ? X = l[W] >> Z - e & h : (X = (l[W] & (1 << Z + 1) - 1) << e - Z, W > 0 && (X |= l[W - 1] >> this.DB + Z - e)), c = d; (X & 1) == 0; )
652
+ X >>= 1, --c;
653
+ if ((Z -= c) < 0 && (Z += this.DB, --W), p)
654
+ s[X].copyTo(b), p = !1;
655
+ else {
656
+ for (; c > 1; )
657
+ m.sqrTo(b, G), m.sqrTo(G, b), c -= 2;
658
+ c > 0 ? m.sqrTo(b, G) : (R = b, b = G, G = R), m.mulTo(G, s[X], b);
659
+ }
660
+ for (; W >= 0 && (l[W] & 1 << Z) == 0; )
661
+ m.sqrTo(b, G), R = b, b = G, G = R, --Z < 0 && (Z = this.DB - 1, --W);
662
+ }
663
+ return m.revert(b);
664
+ }, t.prototype.modInverse = function(l) {
665
+ var i = l.isEven();
666
+ if (this.isEven() && i || l.signum() == 0)
667
+ return t.ZERO;
668
+ for (var Z = l.clone(), d = this.clone(), b = f(1), m = f(0), s = f(0), c = f(1); Z.signum() != 0; ) {
669
+ for (; Z.isEven(); )
670
+ Z.rShiftTo(1, Z), i ? ((!b.isEven() || !m.isEven()) && (b.addTo(this, b), m.subTo(l, m)), b.rShiftTo(1, b)) : m.isEven() || m.subTo(l, m), m.rShiftTo(1, m);
671
+ for (; d.isEven(); )
672
+ d.rShiftTo(1, d), i ? ((!s.isEven() || !c.isEven()) && (s.addTo(this, s), c.subTo(l, c)), s.rShiftTo(1, s)) : c.isEven() || c.subTo(l, c), c.rShiftTo(1, c);
673
+ Z.compareTo(d) >= 0 ? (Z.subTo(d, Z), i && b.subTo(s, b), m.subTo(c, m)) : (d.subTo(Z, d), i && s.subTo(b, s), c.subTo(m, c));
674
+ }
675
+ if (d.compareTo(t.ONE) != 0)
676
+ return t.ZERO;
677
+ if (c.compareTo(l) >= 0)
678
+ return c.subtract(l);
679
+ if (c.signum() < 0)
680
+ c.addTo(l, c);
681
+ else
682
+ return c;
683
+ return c.signum() < 0 ? c.add(l) : c;
684
+ }, t.prototype.pow = function(l) {
685
+ return this.exp(l, new Dl());
686
+ }, t.prototype.gcd = function(l) {
687
+ var i = this.s < 0 ? this.negate() : this.clone(), Z = l.s < 0 ? l.negate() : l.clone();
688
+ if (i.compareTo(Z) < 0) {
689
+ var d = i;
690
+ i = Z, Z = d;
691
+ }
692
+ var b = i.getLowestSetBit(), m = Z.getLowestSetBit();
693
+ if (m < 0)
694
+ return i;
695
+ for (b < m && (m = b), m > 0 && (i.rShiftTo(m, i), Z.rShiftTo(m, Z)); i.signum() > 0; )
696
+ (b = i.getLowestSetBit()) > 0 && i.rShiftTo(b, i), (b = Z.getLowestSetBit()) > 0 && Z.rShiftTo(b, Z), i.compareTo(Z) >= 0 ? (i.subTo(Z, i), i.rShiftTo(1, i)) : (Z.subTo(i, Z), Z.rShiftTo(1, Z));
697
+ return m > 0 && Z.lShiftTo(m, Z), Z;
698
+ }, t.prototype.isProbablePrime = function(l) {
699
+ var i, Z = this.abs();
700
+ if (Z.t == 1 && Z[0] <= S[S.length - 1]) {
701
+ for (i = 0; i < S.length; ++i)
702
+ if (Z[0] == S[i])
703
+ return !0;
704
+ return !1;
705
+ }
706
+ if (Z.isEven())
707
+ return !1;
708
+ for (i = 1; i < S.length; ) {
709
+ for (var d = S[i], b = i + 1; b < S.length && d < Ml; )
710
+ d *= S[b++];
711
+ for (d = Z.modInt(d); i < b; )
712
+ if (d % S[i++] == 0)
713
+ return !1;
714
+ }
715
+ return Z.millerRabin(l);
716
+ }, t.prototype.copyTo = function(l) {
717
+ for (var i = this.t - 1; i >= 0; --i)
718
+ l[i] = this[i];
719
+ l.t = this.t, l.s = this.s;
720
+ }, t.prototype.fromInt = function(l) {
721
+ this.t = 1, this.s = l < 0 ? -1 : 0, l > 0 ? this[0] = l : l < -1 ? this[0] = l + this.DV : this.t = 0;
722
+ }, t.prototype.fromString = function(l, i) {
723
+ var Z;
724
+ if (i == 16)
725
+ Z = 4;
726
+ else if (i == 8)
727
+ Z = 3;
728
+ else if (i == 256)
729
+ Z = 8;
730
+ else if (i == 2)
731
+ Z = 1;
732
+ else if (i == 32)
733
+ Z = 5;
734
+ else if (i == 4)
735
+ Z = 2;
736
+ else {
737
+ this.fromRadix(l, i);
738
+ return;
739
+ }
740
+ this.t = 0, this.s = 0;
741
+ for (var d = l.length, b = !1, m = 0; --d >= 0; ) {
742
+ var s = Z == 8 ? +l[d] & 255 : Yl(l, d);
743
+ if (s < 0) {
744
+ l.charAt(d) == "-" && (b = !0);
745
+ continue;
746
+ }
747
+ b = !1, m == 0 ? this[this.t++] = s : m + Z > this.DB ? (this[this.t - 1] |= (s & (1 << this.DB - m) - 1) << m, this[this.t++] = s >> this.DB - m) : this[this.t - 1] |= s << m, m += Z, m >= this.DB && (m -= this.DB);
748
+ }
749
+ Z == 8 && (+l[0] & 128) != 0 && (this.s = -1, m > 0 && (this[this.t - 1] |= (1 << this.DB - m) - 1 << m)), this.clamp(), b && t.ZERO.subTo(this, this);
750
+ }, t.prototype.clamp = function() {
751
+ for (var l = this.s & this.DM; this.t > 0 && this[this.t - 1] == l; )
752
+ --this.t;
753
+ }, t.prototype.dlShiftTo = function(l, i) {
754
+ var Z;
755
+ for (Z = this.t - 1; Z >= 0; --Z)
756
+ i[Z + l] = this[Z];
757
+ for (Z = l - 1; Z >= 0; --Z)
758
+ i[Z] = 0;
759
+ i.t = this.t + l, i.s = this.s;
760
+ }, t.prototype.drShiftTo = function(l, i) {
761
+ for (var Z = l; Z < this.t; ++Z)
762
+ i[Z - l] = this[Z];
763
+ i.t = Math.max(this.t - l, 0), i.s = this.s;
764
+ }, t.prototype.lShiftTo = function(l, i) {
765
+ for (var Z = l % this.DB, d = this.DB - Z, b = (1 << d) - 1, m = Math.floor(l / this.DB), s = this.s << Z & this.DM, c = this.t - 1; c >= 0; --c)
766
+ i[c + m + 1] = this[c] >> d | s, s = (this[c] & b) << Z;
767
+ for (var c = m - 1; c >= 0; --c)
768
+ i[c] = 0;
769
+ i[m] = s, i.t = this.t + m + 1, i.s = this.s, i.clamp();
770
+ }, t.prototype.rShiftTo = function(l, i) {
771
+ i.s = this.s;
772
+ var Z = Math.floor(l / this.DB);
773
+ if (Z >= this.t) {
774
+ i.t = 0;
775
+ return;
776
+ }
777
+ var d = l % this.DB, b = this.DB - d, m = (1 << d) - 1;
778
+ i[0] = this[Z] >> d;
779
+ for (var s = Z + 1; s < this.t; ++s)
780
+ i[s - Z - 1] |= (this[s] & m) << b, i[s - Z] = this[s] >> d;
781
+ d > 0 && (i[this.t - Z - 1] |= (this.s & m) << b), i.t = this.t - Z, i.clamp();
782
+ }, t.prototype.subTo = function(l, i) {
783
+ for (var Z = 0, d = 0, b = Math.min(l.t, this.t); Z < b; )
784
+ d += this[Z] - l[Z], i[Z++] = d & this.DM, d >>= this.DB;
785
+ if (l.t < this.t) {
786
+ for (d -= l.s; Z < this.t; )
787
+ d += this[Z], i[Z++] = d & this.DM, d >>= this.DB;
788
+ d += this.s;
789
+ } else {
790
+ for (d += this.s; Z < l.t; )
791
+ d -= l[Z], i[Z++] = d & this.DM, d >>= this.DB;
792
+ d -= l.s;
793
+ }
794
+ i.s = d < 0 ? -1 : 0, d < -1 ? i[Z++] = this.DV + d : d > 0 && (i[Z++] = d), i.t = Z, i.clamp();
795
+ }, t.prototype.multiplyTo = function(l, i) {
796
+ var Z = this.abs(), d = l.abs(), b = Z.t;
797
+ for (i.t = b + d.t; --b >= 0; )
798
+ i[b] = 0;
799
+ for (b = 0; b < d.t; ++b)
800
+ i[b + Z.t] = Z.am(0, d[b], i, b, 0, Z.t);
801
+ i.s = 0, i.clamp(), this.s != l.s && t.ZERO.subTo(i, i);
802
+ }, t.prototype.squareTo = function(l) {
803
+ for (var i = this.abs(), Z = l.t = 2 * i.t; --Z >= 0; )
804
+ l[Z] = 0;
805
+ for (Z = 0; Z < i.t - 1; ++Z) {
806
+ var d = i.am(Z, i[Z], l, 2 * Z, 0, 1);
807
+ (l[Z + i.t] += i.am(Z + 1, 2 * i[Z], l, 2 * Z + 1, d, i.t - Z - 1)) >= i.DV && (l[Z + i.t] -= i.DV, l[Z + i.t + 1] = 1);
808
+ }
809
+ l.t > 0 && (l[l.t - 1] += i.am(Z, i[Z], l, 2 * Z, 0, 1)), l.s = 0, l.clamp();
810
+ }, t.prototype.divRemTo = function(l, i, Z) {
811
+ var d = l.abs();
812
+ if (!(d.t <= 0)) {
813
+ var b = this.abs();
814
+ if (b.t < d.t) {
815
+ i?.fromInt(0), Z != null && this.copyTo(Z);
816
+ return;
817
+ }
818
+ Z == null && (Z = a());
819
+ var m = a(), s = this.s, c = l.s, e = this.DB - A(d[d.t - 1]);
820
+ e > 0 ? (d.lShiftTo(e, m), b.lShiftTo(e, Z)) : (d.copyTo(m), b.copyTo(Z));
821
+ var h = m.t, n = m[h - 1];
822
+ if (n != 0) {
823
+ var W = n * (1 << this.F1) + (h > 1 ? m[h - 2] >> this.F2 : 0), X = this.FV / W, p = (1 << this.F1) / W, G = 1 << this.F2, R = Z.t, F = R - h, N = i ?? a();
824
+ for (m.dlShiftTo(F, N), Z.compareTo(N) >= 0 && (Z[Z.t++] = 1, Z.subTo(N, Z)), t.ONE.dlShiftTo(h, N), N.subTo(m, m); m.t < h; )
825
+ m[m.t++] = 0;
826
+ for (; --F >= 0; ) {
827
+ var k = Z[--R] == n ? this.DM : Math.floor(Z[R] * X + (Z[R - 1] + G) * p);
828
+ if ((Z[R] += m.am(0, k, Z, F, 0, h)) < k)
829
+ for (m.dlShiftTo(F, N), Z.subTo(N, Z); Z[R] < --k; )
830
+ Z.subTo(N, Z);
831
+ }
832
+ i != null && (Z.drShiftTo(h, i), s != c && t.ZERO.subTo(i, i)), Z.t = h, Z.clamp(), e > 0 && Z.rShiftTo(e, Z), s < 0 && t.ZERO.subTo(Z, Z);
833
+ }
834
+ }
835
+ }, t.prototype.invDigit = function() {
836
+ if (this.t < 1)
837
+ return 0;
838
+ var l = this[0];
839
+ if ((l & 1) == 0)
840
+ return 0;
841
+ var i = l & 3;
842
+ return i = i * (2 - (l & 15) * i) & 15, i = i * (2 - (l & 255) * i) & 255, i = i * (2 - ((l & 65535) * i & 65535)) & 65535, i = i * (2 - l * i % this.DV) % this.DV, i > 0 ? this.DV - i : -i;
843
+ }, t.prototype.isEven = function() {
844
+ return (this.t > 0 ? this[0] & 1 : this.s) == 0;
845
+ }, t.prototype.exp = function(l, i) {
846
+ if (l > 4294967295 || l < 1)
847
+ return t.ONE;
848
+ var Z = a(), d = a(), b = i.convert(this), m = A(l) - 1;
849
+ for (b.copyTo(Z); --m >= 0; )
850
+ if (i.sqrTo(Z, d), (l & 1 << m) > 0)
851
+ i.mulTo(d, b, Z);
852
+ else {
853
+ var s = Z;
854
+ Z = d, d = s;
855
+ }
856
+ return i.revert(Z);
857
+ }, t.prototype.chunkSize = function(l) {
858
+ return Math.floor(Math.LN2 * this.DB / Math.log(l));
859
+ }, t.prototype.toRadix = function(l) {
860
+ if (l == null && (l = 10), this.signum() == 0 || l < 2 || l > 36)
861
+ return "0";
862
+ var i = this.chunkSize(l), Z = Math.pow(l, i), d = f(Z), b = a(), m = a(), s = "";
863
+ for (this.divRemTo(d, b, m); b.signum() > 0; )
864
+ s = (Z + m.intValue()).toString(l).substring(1) + s, b.divRemTo(d, b, m);
865
+ return m.intValue().toString(l) + s;
866
+ }, t.prototype.fromRadix = function(l, i) {
867
+ this.fromInt(0), i == null && (i = 10);
868
+ for (var Z = this.chunkSize(i), d = Math.pow(i, Z), b = !1, m = 0, s = 0, c = 0; c < l.length; ++c) {
869
+ var e = Yl(l, c);
870
+ if (e < 0) {
871
+ l.charAt(c) == "-" && this.signum() == 0 && (b = !0);
872
+ continue;
873
+ }
874
+ s = i * s + e, ++m >= Z && (this.dMultiply(d), this.dAddOffset(s, 0), m = 0, s = 0);
875
+ }
876
+ m > 0 && (this.dMultiply(Math.pow(i, m)), this.dAddOffset(s, 0)), b && t.ZERO.subTo(this, this);
877
+ }, t.prototype.fromNumber = function(l, i, Z) {
878
+ if (typeof i == "number")
879
+ if (l < 2)
880
+ this.fromInt(1);
881
+ else
882
+ for (this.fromNumber(l, Z), this.testBit(l - 1) || this.bitwiseTo(t.ONE.shiftLeft(l - 1), O, this), this.isEven() && this.dAddOffset(1, 0); !this.isProbablePrime(i); )
883
+ this.dAddOffset(2, 0), this.bitLength() > l && this.subTo(t.ONE.shiftLeft(l - 1), this);
884
+ else {
885
+ var d = [], b = l & 7;
886
+ d.length = (l >> 3) + 1, i.nextBytes(d), b > 0 ? d[0] &= (1 << b) - 1 : d[0] = 0, this.fromString(d, 256);
887
+ }
888
+ }, t.prototype.bitwiseTo = function(l, i, Z) {
889
+ var d, b, m = Math.min(l.t, this.t);
890
+ for (d = 0; d < m; ++d)
891
+ Z[d] = i(this[d], l[d]);
892
+ if (l.t < this.t) {
893
+ for (b = l.s & this.DM, d = m; d < this.t; ++d)
894
+ Z[d] = i(this[d], b);
895
+ Z.t = this.t;
896
+ } else {
897
+ for (b = this.s & this.DM, d = m; d < l.t; ++d)
898
+ Z[d] = i(b, l[d]);
899
+ Z.t = l.t;
900
+ }
901
+ Z.s = i(this.s, l.s), Z.clamp();
902
+ }, t.prototype.changeBit = function(l, i) {
903
+ var Z = t.ONE.shiftLeft(l);
904
+ return this.bitwiseTo(Z, i, Z), Z;
905
+ }, t.prototype.addTo = function(l, i) {
906
+ for (var Z = 0, d = 0, b = Math.min(l.t, this.t); Z < b; )
907
+ d += this[Z] + l[Z], i[Z++] = d & this.DM, d >>= this.DB;
908
+ if (l.t < this.t) {
909
+ for (d += l.s; Z < this.t; )
910
+ d += this[Z], i[Z++] = d & this.DM, d >>= this.DB;
911
+ d += this.s;
912
+ } else {
913
+ for (d += this.s; Z < l.t; )
914
+ d += l[Z], i[Z++] = d & this.DM, d >>= this.DB;
915
+ d += l.s;
916
+ }
917
+ i.s = d < 0 ? -1 : 0, d > 0 ? i[Z++] = d : d < -1 && (i[Z++] = this.DV + d), i.t = Z, i.clamp();
918
+ }, t.prototype.dMultiply = function(l) {
919
+ this[this.t] = this.am(0, l - 1, this, 0, 0, this.t), ++this.t, this.clamp();
920
+ }, t.prototype.dAddOffset = function(l, i) {
921
+ if (l != 0) {
922
+ for (; this.t <= i; )
923
+ this[this.t++] = 0;
924
+ for (this[i] += l; this[i] >= this.DV; )
925
+ this[i] -= this.DV, ++i >= this.t && (this[this.t++] = 0), ++this[i];
926
+ }
927
+ }, t.prototype.multiplyLowerTo = function(l, i, Z) {
928
+ var d = Math.min(this.t + l.t, i);
929
+ for (Z.s = 0, Z.t = d; d > 0; )
930
+ Z[--d] = 0;
931
+ for (var b = Z.t - this.t; d < b; ++d)
932
+ Z[d + this.t] = this.am(0, l[d], Z, d, 0, this.t);
933
+ for (var b = Math.min(l.t, i); d < b; ++d)
934
+ this.am(0, l[d], Z, d, 0, i - d);
935
+ Z.clamp();
936
+ }, t.prototype.multiplyUpperTo = function(l, i, Z) {
937
+ --i;
938
+ var d = Z.t = this.t + l.t - i;
939
+ for (Z.s = 0; --d >= 0; )
940
+ Z[d] = 0;
941
+ for (d = Math.max(i - this.t, 0); d < l.t; ++d)
942
+ Z[this.t + d - i] = this.am(i - d, l[d], Z, 0, 0, this.t + d - i);
943
+ Z.clamp(), Z.drShiftTo(1, Z);
944
+ }, t.prototype.modInt = function(l) {
945
+ if (l <= 0)
946
+ return 0;
947
+ var i = this.DV % l, Z = this.s < 0 ? l - 1 : 0;
948
+ if (this.t > 0)
949
+ if (i == 0)
950
+ Z = this[0] % l;
951
+ else
952
+ for (var d = this.t - 1; d >= 0; --d)
953
+ Z = (i * Z + this[d]) % l;
954
+ return Z;
955
+ }, t.prototype.millerRabin = function(l) {
956
+ var i = this.subtract(t.ONE), Z = i.getLowestSetBit();
957
+ if (Z <= 0)
958
+ return !1;
959
+ var d = i.shiftRight(Z);
960
+ l = l + 1 >> 1, l > S.length && (l = S.length);
961
+ for (var b = a(), m = 0; m < l; ++m) {
962
+ b.fromInt(S[Math.floor(Math.random() * S.length)]);
963
+ var s = b.modPow(d, this);
964
+ if (s.compareTo(t.ONE) != 0 && s.compareTo(i) != 0) {
965
+ for (var c = 1; c++ < Z && s.compareTo(i) != 0; )
966
+ if (s = s.modPowInt(2, this), s.compareTo(t.ONE) == 0)
967
+ return !1;
968
+ if (s.compareTo(i) != 0)
969
+ return !1;
970
+ }
971
+ }
972
+ return !0;
973
+ }, t.prototype.square = function() {
974
+ var l = a();
975
+ return this.squareTo(l), l;
976
+ }, t.prototype.gcda = function(l, i) {
977
+ var Z = this.s < 0 ? this.negate() : this.clone(), d = l.s < 0 ? l.negate() : l.clone();
978
+ if (Z.compareTo(d) < 0) {
979
+ var b = Z;
980
+ Z = d, d = b;
981
+ }
982
+ var m = Z.getLowestSetBit(), s = d.getLowestSetBit();
983
+ if (s < 0) {
984
+ i(Z);
985
+ return;
986
+ }
987
+ m < s && (s = m), s > 0 && (Z.rShiftTo(s, Z), d.rShiftTo(s, d));
988
+ var c = function() {
989
+ (m = Z.getLowestSetBit()) > 0 && Z.rShiftTo(m, Z), (m = d.getLowestSetBit()) > 0 && d.rShiftTo(m, d), Z.compareTo(d) >= 0 ? (Z.subTo(d, Z), Z.rShiftTo(1, Z)) : (d.subTo(Z, d), d.rShiftTo(1, d)), Z.signum() > 0 ? setTimeout(c, 0) : (s > 0 && d.lShiftTo(s, d), setTimeout(function() {
990
+ i(d);
991
+ }, 0));
992
+ };
993
+ setTimeout(c, 10);
994
+ }, t.prototype.fromNumberAsync = function(l, i, Z, d) {
995
+ if (typeof i == "number")
996
+ if (l < 2)
997
+ this.fromInt(1);
998
+ else {
999
+ this.fromNumber(l, Z), this.testBit(l - 1) || this.bitwiseTo(t.ONE.shiftLeft(l - 1), O, this), this.isEven() && this.dAddOffset(1, 0);
1000
+ var b = this, m = function() {
1001
+ b.dAddOffset(2, 0), b.bitLength() > l && b.subTo(t.ONE.shiftLeft(l - 1), b), b.isProbablePrime(i) ? setTimeout(function() {
1002
+ d();
1003
+ }, 0) : setTimeout(m, 0);
1004
+ };
1005
+ setTimeout(m, 0);
1006
+ }
1007
+ else {
1008
+ var s = [], c = l & 7;
1009
+ s.length = (l >> 3) + 1, i.nextBytes(s), c > 0 ? s[0] &= (1 << c) - 1 : s[0] = 0, this.fromString(s, 256);
1010
+ }
1011
+ }, t;
1012
+ })()
1013
+ ), Dl = (
1014
+ /** @class */
1015
+ (function() {
1016
+ function t() {
1017
+ }
1018
+ return t.prototype.convert = function(l) {
1019
+ return l;
1020
+ }, t.prototype.revert = function(l) {
1021
+ return l;
1022
+ }, t.prototype.mulTo = function(l, i, Z) {
1023
+ l.multiplyTo(i, Z);
1024
+ }, t.prototype.sqrTo = function(l, i) {
1025
+ l.squareTo(i);
1026
+ }, t;
1027
+ })()
1028
+ ), pl = (
1029
+ /** @class */
1030
+ (function() {
1031
+ function t(l) {
1032
+ this.m = l;
1033
+ }
1034
+ return t.prototype.convert = function(l) {
1035
+ return l.s < 0 || l.compareTo(this.m) >= 0 ? l.mod(this.m) : l;
1036
+ }, t.prototype.revert = function(l) {
1037
+ return l;
1038
+ }, t.prototype.reduce = function(l) {
1039
+ l.divRemTo(this.m, null, l);
1040
+ }, t.prototype.mulTo = function(l, i, Z) {
1041
+ l.multiplyTo(i, Z), this.reduce(Z);
1042
+ }, t.prototype.sqrTo = function(l, i) {
1043
+ l.squareTo(i), this.reduce(i);
1044
+ }, t;
1045
+ })()
1046
+ ), Gl = (
1047
+ /** @class */
1048
+ (function() {
1049
+ function t(l) {
1050
+ this.m = l, this.mp = l.invDigit(), this.mpl = this.mp & 32767, this.mph = this.mp >> 15, this.um = (1 << l.DB - 15) - 1, this.mt2 = 2 * l.t;
1051
+ }
1052
+ return t.prototype.convert = function(l) {
1053
+ var i = a();
1054
+ return l.abs().dlShiftTo(this.m.t, i), i.divRemTo(this.m, null, i), l.s < 0 && i.compareTo(o.ZERO) > 0 && this.m.subTo(i, i), i;
1055
+ }, t.prototype.revert = function(l) {
1056
+ var i = a();
1057
+ return l.copyTo(i), this.reduce(i), i;
1058
+ }, t.prototype.reduce = function(l) {
1059
+ for (; l.t <= this.mt2; )
1060
+ l[l.t++] = 0;
1061
+ for (var i = 0; i < this.m.t; ++i) {
1062
+ var Z = l[i] & 32767, d = Z * this.mpl + ((Z * this.mph + (l[i] >> 15) * this.mpl & this.um) << 15) & l.DM;
1063
+ for (Z = i + this.m.t, l[Z] += this.m.am(0, d, l, i, 0, this.m.t); l[Z] >= l.DV; )
1064
+ l[Z] -= l.DV, l[++Z]++;
1065
+ }
1066
+ l.clamp(), l.drShiftTo(this.m.t, l), l.compareTo(this.m) >= 0 && l.subTo(this.m, l);
1067
+ }, t.prototype.mulTo = function(l, i, Z) {
1068
+ l.multiplyTo(i, Z), this.reduce(Z);
1069
+ }, t.prototype.sqrTo = function(l, i) {
1070
+ l.squareTo(i), this.reduce(i);
1071
+ }, t;
1072
+ })()
1073
+ ), El = (
1074
+ /** @class */
1075
+ (function() {
1076
+ function t(l) {
1077
+ this.m = l, this.r2 = a(), this.q3 = a(), o.ONE.dlShiftTo(2 * l.t, this.r2), this.mu = this.r2.divide(l);
1078
+ }
1079
+ return t.prototype.convert = function(l) {
1080
+ if (l.s < 0 || l.t > 2 * this.m.t)
1081
+ return l.mod(this.m);
1082
+ if (l.compareTo(this.m) < 0)
1083
+ return l;
1084
+ var i = a();
1085
+ return l.copyTo(i), this.reduce(i), i;
1086
+ }, t.prototype.revert = function(l) {
1087
+ return l;
1088
+ }, t.prototype.reduce = function(l) {
1089
+ for (l.drShiftTo(this.m.t - 1, this.r2), l.t > this.m.t + 1 && (l.t = this.m.t + 1, l.clamp()), this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3), this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2); l.compareTo(this.r2) < 0; )
1090
+ l.dAddOffset(1, this.m.t + 1);
1091
+ for (l.subTo(this.r2, l); l.compareTo(this.m) >= 0; )
1092
+ l.subTo(this.m, l);
1093
+ }, t.prototype.mulTo = function(l, i, Z) {
1094
+ l.multiplyTo(i, Z), this.reduce(Z);
1095
+ }, t.prototype.sqrTo = function(l, i) {
1096
+ l.squareTo(i), this.reduce(i);
1097
+ }, t;
1098
+ })()
1099
+ );
1100
+ function a() {
1101
+ return new o(null);
1102
+ }
1103
+ function y(t, l) {
1104
+ return new o(t, l);
1105
+ }
1106
+ var yl = typeof navigator < "u";
1107
+ yl && Vl && navigator.appName == "Microsoft Internet Explorer" ? (o.prototype.am = function(l, i, Z, d, b, m) {
1108
+ for (var s = i & 32767, c = i >> 15; --m >= 0; ) {
1109
+ var e = this[l] & 32767, h = this[l++] >> 15, n = c * e + h * s;
1110
+ e = s * e + ((n & 32767) << 15) + Z[d] + (b & 1073741823), b = (e >>> 30) + (n >>> 15) + c * h + (b >>> 30), Z[d++] = e & 1073741823;
1111
+ }
1112
+ return b;
1113
+ }, I = 30) : yl && Vl && navigator.appName != "Netscape" ? (o.prototype.am = function(l, i, Z, d, b, m) {
1114
+ for (; --m >= 0; ) {
1115
+ var s = i * this[l++] + Z[d] + b;
1116
+ b = Math.floor(s / 67108864), Z[d++] = s & 67108863;
1117
+ }
1118
+ return b;
1119
+ }, I = 26) : (o.prototype.am = function(l, i, Z, d, b, m) {
1120
+ for (var s = i & 16383, c = i >> 14; --m >= 0; ) {
1121
+ var e = this[l] & 16383, h = this[l++] >> 14, n = c * e + h * s;
1122
+ e = s * e + ((n & 16383) << 14) + Z[d] + b, b = (e >> 28) + (n >> 14) + c * h, Z[d++] = e & 268435455;
1123
+ }
1124
+ return b;
1125
+ }, I = 28);
1126
+ o.prototype.DB = I;
1127
+ o.prototype.DM = (1 << I) - 1;
1128
+ o.prototype.DV = 1 << I;
1129
+ var hl = 52;
1130
+ o.prototype.FV = Math.pow(2, hl);
1131
+ o.prototype.F1 = hl - I;
1132
+ o.prototype.F2 = 2 * I - hl;
1133
+ var tl = [], j, x;
1134
+ j = 48;
1135
+ for (x = 0; x <= 9; ++x)
1136
+ tl[j++] = x;
1137
+ j = 97;
1138
+ for (x = 10; x < 36; ++x)
1139
+ tl[j++] = x;
1140
+ j = 65;
1141
+ for (x = 10; x < 36; ++x)
1142
+ tl[j++] = x;
1143
+ function Yl(t, l) {
1144
+ var i = tl[t.charCodeAt(l)];
1145
+ return i ?? -1;
1146
+ }
1147
+ function f(t) {
1148
+ var l = a();
1149
+ return l.fromInt(t), l;
1150
+ }
1151
+ function A(t) {
1152
+ var l = 1, i;
1153
+ return (i = t >>> 16) != 0 && (t = i, l += 16), (i = t >> 8) != 0 && (t = i, l += 8), (i = t >> 4) != 0 && (t = i, l += 4), (i = t >> 2) != 0 && (t = i, l += 2), (i = t >> 1) != 0 && (t = i, l += 1), l;
1154
+ }
1155
+ o.ZERO = f(0);
1156
+ o.ONE = f(1);
1157
+ var Bl = (
1158
+ /** @class */
1159
+ (function() {
1160
+ function t() {
1161
+ this.i = 0, this.j = 0, this.S = [];
1162
+ }
1163
+ return t.prototype.init = function(l) {
1164
+ var i, Z, d;
1165
+ for (i = 0; i < 256; ++i)
1166
+ this.S[i] = i;
1167
+ for (Z = 0, i = 0; i < 256; ++i)
1168
+ Z = Z + this.S[i] + l[i % l.length] & 255, d = this.S[i], this.S[i] = this.S[Z], this.S[Z] = d;
1169
+ this.i = 0, this.j = 0;
1170
+ }, t.prototype.next = function() {
1171
+ var l;
1172
+ return this.i = this.i + 1 & 255, this.j = this.j + this.S[this.i] & 255, l = this.S[this.i], this.S[this.i] = this.S[this.j], this.S[this.j] = l, this.S[l + this.S[this.i] & 255];
1173
+ }, t;
1174
+ })()
1175
+ );
1176
+ function Ol() {
1177
+ return new Bl();
1178
+ }
1179
+ var Kl = 256, q, v = null, K;
1180
+ if (v == null) {
1181
+ v = [], K = 0;
1182
+ var _ = void 0;
1183
+ if (typeof window < "u" && self.crypto && self.crypto.getRandomValues) {
1184
+ var ml = new Uint32Array(256);
1185
+ for (self.crypto.getRandomValues(ml), _ = 0; _ < ml.length; ++_)
1186
+ v[K++] = ml[_] & 255;
1187
+ }
1188
+ var $ = 0, ll = function(t) {
1189
+ if ($ = $ || 0, $ >= 256 || K >= Kl) {
1190
+ self.removeEventListener ? self.removeEventListener("mousemove", ll, !1) : self.detachEvent && self.detachEvent("onmousemove", ll);
1191
+ return;
1192
+ }
1193
+ try {
1194
+ var l = t.x + t.y;
1195
+ v[K++] = l & 255, $ += 1;
1196
+ } catch {
1197
+ }
1198
+ };
1199
+ typeof window < "u" && (self.addEventListener ? self.addEventListener("mousemove", ll, !1) : self.attachEvent && self.attachEvent("onmousemove", ll));
1200
+ }
1201
+ function Al() {
1202
+ if (q == null) {
1203
+ for (q = Ol(); K < Kl; ) {
1204
+ var t = Math.floor(65536 * Math.random());
1205
+ v[K++] = t & 255;
1206
+ }
1207
+ for (q.init(v), K = 0; K < v.length; ++K)
1208
+ v[K] = 0;
1209
+ K = 0;
1210
+ }
1211
+ return q.next();
1212
+ }
1213
+ var Zl = (
1214
+ /** @class */
1215
+ (function() {
1216
+ function t() {
1217
+ }
1218
+ return t.prototype.nextBytes = function(l) {
1219
+ for (var i = 0; i < l.length; ++i)
1220
+ l[i] = Al();
1221
+ }, t;
1222
+ })()
1223
+ );
1224
+ function el(t) {
1225
+ return _l(mi(ql(t), t.length * 8));
1226
+ }
1227
+ function rl(t) {
1228
+ for (var l = "0123456789abcdef", i = "", Z = 0; Z < t.length; Z++) {
1229
+ var d = t.charCodeAt(Z);
1230
+ i += l.charAt(d >>> 4 & 15) + l.charAt(d & 15);
1231
+ }
1232
+ return i;
1233
+ }
1234
+ function ql(t) {
1235
+ for (var l = Array(t.length >> 2), i = 0; i < l.length; i++)
1236
+ l[i] = 0;
1237
+ for (var i = 0; i < t.length * 8; i += 8)
1238
+ l[i >> 5] |= (t.charCodeAt(i / 8) & 255) << 24 - i % 32;
1239
+ return l;
1240
+ }
1241
+ function _l(t) {
1242
+ for (var l = "", i = 0; i < t.length * 32; i += 8)
1243
+ l += String.fromCharCode(t[i >> 5] >>> 24 - i % 32 & 255);
1244
+ return l;
1245
+ }
1246
+ function J(t, l) {
1247
+ return t >>> l | t << 32 - l;
1248
+ }
1249
+ function Nl(t, l) {
1250
+ return t >>> l;
1251
+ }
1252
+ function $l(t, l, i) {
1253
+ return t & l ^ ~t & i;
1254
+ }
1255
+ function li(t, l, i) {
1256
+ return t & l ^ t & i ^ l & i;
1257
+ }
1258
+ function ii(t) {
1259
+ return J(t, 2) ^ J(t, 13) ^ J(t, 22);
1260
+ }
1261
+ function Zi(t) {
1262
+ return J(t, 6) ^ J(t, 11) ^ J(t, 25);
1263
+ }
1264
+ function ti(t) {
1265
+ return J(t, 7) ^ J(t, 18) ^ Nl(t, 3);
1266
+ }
1267
+ function di(t) {
1268
+ return J(t, 17) ^ J(t, 19) ^ Nl(t, 10);
1269
+ }
1270
+ var bi = new Array(1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993, -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987, 1925078388, -2132889090, -1680079193, -1046744716, -459576895, -272742522, 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, -1740746414, -1473132947, -1341970488, -1084653625, -958395405, -710438585, 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, 1695183700, 1986661051, -2117940946, -1838011259, -1564481375, -1474664885, -1035236496, -949202525, -778901479, -694614492, -200395387, 275423344, 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, 1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872, -1866530822, -1538233109, -1090935817, -965641998);
1271
+ function mi(t, l) {
1272
+ var i = new Array(1779033703, -1150833019, 1013904242, -1521486534, 1359893119, -1694144372, 528734635, 1541459225), Z = new Array(64), d, b, m, s, c, e, h, n, W, X, p, G;
1273
+ for (t[l >> 5] |= 128 << 24 - l % 32, t[(l + 64 >> 9 << 4) + 15] = l, W = 0; W < t.length; W += 16) {
1274
+ for (d = i[0], b = i[1], m = i[2], s = i[3], c = i[4], e = i[5], h = i[6], n = i[7], X = 0; X < 64; X++)
1275
+ X < 16 ? Z[X] = t[X + W] : Z[X] = r(r(r(di(Z[X - 2]), Z[X - 7]), ti(Z[X - 15])), Z[X - 16]), p = r(r(r(r(n, Zi(c)), $l(c, e, h)), bi[X]), Z[X]), G = r(ii(d), li(d, b, m)), n = h, h = e, e = c, c = r(s, p), s = m, m = b, b = d, d = r(p, G);
1276
+ i[0] = r(d, i[0]), i[1] = r(b, i[1]), i[2] = r(m, i[2]), i[3] = r(s, i[3]), i[4] = r(c, i[4]), i[5] = r(e, i[5]), i[6] = r(h, i[6]), i[7] = r(n, i[7]);
1277
+ }
1278
+ return i;
1279
+ }
1280
+ function r(t, l) {
1281
+ var i = (t & 65535) + (l & 65535), Z = (t >> 16) + (l >> 16) + (i >> 16);
1282
+ return Z << 16 | i & 65535;
1283
+ }
1284
+ function si(t, l) {
1285
+ if (l < t.length + 22)
1286
+ return console.error("Message too long for RSA"), null;
1287
+ for (var i = l - t.length - 6, Z = "", d = 0; d < i; d += 2)
1288
+ Z += "ff";
1289
+ var b = "0001" + Z + "00" + t;
1290
+ return y(b, 16);
1291
+ }
1292
+ function ci(t, l) {
1293
+ if (l < t.length + 11)
1294
+ return console.error("Message too long for RSA"), null;
1295
+ for (var i = [], Z = t.length - 1; Z >= 0 && l > 0; ) {
1296
+ var d = t.charCodeAt(Z--);
1297
+ d < 128 ? i[--l] = d : d > 127 && d < 2048 ? (i[--l] = d & 63 | 128, i[--l] = d >> 6 | 192) : (i[--l] = d & 63 | 128, i[--l] = d >> 6 & 63 | 128, i[--l] = d >> 12 | 224);
1298
+ }
1299
+ i[--l] = 0;
1300
+ for (var b = new Zl(), m = []; l > 2; ) {
1301
+ for (m[0] = 0; m[0] == 0; )
1302
+ b.nextBytes(m);
1303
+ i[--l] = m[0];
1304
+ }
1305
+ return i[--l] = 2, i[--l] = 0, new o(i);
1306
+ }
1307
+ function Sl(t, l, i) {
1308
+ for (var Z = "", d = 0; Z.length < l; )
1309
+ Z += i(String.fromCharCode.apply(String, t.concat([
1310
+ (d & 4278190080) >> 24,
1311
+ (d & 16711680) >> 16,
1312
+ (d & 65280) >> 8,
1313
+ d & 255
1314
+ ]))), d += 1;
1315
+ return Z;
1316
+ }
1317
+ var ui = 32;
1318
+ function ei(t, l) {
1319
+ var i = ui, Z = el;
1320
+ if (t.length + 2 * i + 2 > l)
1321
+ throw "Message too long for RSA";
1322
+ var d = "", b;
1323
+ for (b = 0; b < l - t.length - 2 * i - 2; b += 1)
1324
+ d += "\0";
1325
+ var m = Z("") + d + "" + t, s = new Array(i);
1326
+ new Zl().nextBytes(s);
1327
+ var c = Sl(s, m.length, Z), e = [];
1328
+ for (b = 0; b < m.length; b += 1)
1329
+ e[b] = m.charCodeAt(b) ^ c.charCodeAt(b);
1330
+ var h = Sl(e, s.length, Z), n = [0];
1331
+ for (b = 0; b < s.length; b += 1)
1332
+ n[b + 1] = s[b] ^ h.charCodeAt(b);
1333
+ return new o(n.concat(e));
1334
+ }
1335
+ var hi = (
1336
+ /** @class */
1337
+ (function() {
1338
+ function t() {
1339
+ this.n = null, this.e = 0, this.d = null, this.p = null, this.q = null, this.dmp1 = null, this.dmq1 = null, this.coeff = null;
1340
+ }
1341
+ return t.prototype.doPublic = function(l) {
1342
+ return l.modPowInt(this.e, this.n);
1343
+ }, t.prototype.doPrivate = function(l) {
1344
+ if (this.p == null || this.q == null)
1345
+ return l.modPow(this.d, this.n);
1346
+ for (var i = l.mod(this.p).modPow(this.dmp1, this.p), Z = l.mod(this.q).modPow(this.dmq1, this.q); i.compareTo(Z) < 0; )
1347
+ i = i.add(this.p);
1348
+ return i.subtract(Z).multiply(this.coeff).mod(this.p).multiply(this.q).add(Z);
1349
+ }, t.prototype.setPublic = function(l, i) {
1350
+ l != null && i != null && l.length > 0 && i.length > 0 ? (this.n = y(l, 16), this.e = parseInt(i, 16)) : console.error("Invalid RSA public key");
1351
+ }, t.prototype.encrypt = function(l, i) {
1352
+ typeof i > "u" && (i = ci);
1353
+ var Z = this.n.bitLength() + 7 >> 3, d = i(l, Z);
1354
+ if (d == null)
1355
+ return null;
1356
+ var b = this.doPublic(d);
1357
+ if (b == null)
1358
+ return null;
1359
+ for (var m = b.toString(16), s = m.length, c = 0; c < Z * 2 - s; c++)
1360
+ m = "0" + m;
1361
+ return m;
1362
+ }, t.prototype.setPrivate = function(l, i, Z) {
1363
+ l != null && i != null && l.length > 0 && i.length > 0 ? (this.n = y(l, 16), this.e = parseInt(i, 16), this.d = y(Z, 16)) : console.error("Invalid RSA private key");
1364
+ }, t.prototype.setPrivateEx = function(l, i, Z, d, b, m, s, c) {
1365
+ l != null && i != null && l.length > 0 && i.length > 0 ? (this.n = y(l, 16), this.e = parseInt(i, 16), this.d = y(Z, 16), this.p = y(d, 16), this.q = y(b, 16), this.dmp1 = y(m, 16), this.dmq1 = y(s, 16), this.coeff = y(c, 16)) : console.error("Invalid RSA private key");
1366
+ }, t.prototype.generate = function(l, i) {
1367
+ var Z = new Zl(), d = l >> 1;
1368
+ this.e = parseInt(i, 16);
1369
+ for (var b = new o(i, 16); ; ) {
1370
+ for (; this.p = new o(l - d, 1, Z), !(this.p.subtract(o.ONE).gcd(b).compareTo(o.ONE) == 0 && this.p.isProbablePrime(10)); )
1371
+ ;
1372
+ for (; this.q = new o(d, 1, Z), !(this.q.subtract(o.ONE).gcd(b).compareTo(o.ONE) == 0 && this.q.isProbablePrime(10)); )
1373
+ ;
1374
+ if (this.p.compareTo(this.q) <= 0) {
1375
+ var m = this.p;
1376
+ this.p = this.q, this.q = m;
1377
+ }
1378
+ var s = this.p.subtract(o.ONE), c = this.q.subtract(o.ONE), e = s.multiply(c);
1379
+ if (e.gcd(b).compareTo(o.ONE) == 0) {
1380
+ this.n = this.p.multiply(this.q), this.d = b.modInverse(e), this.dmp1 = this.d.mod(s), this.dmq1 = this.d.mod(c), this.coeff = this.q.modInverse(this.p);
1381
+ break;
1382
+ }
1383
+ }
1384
+ }, t.prototype.decrypt = function(l) {
1385
+ var i = y(l, 16), Z = this.doPrivate(i);
1386
+ return Z == null ? null : ni(Z, this.n.bitLength() + 7 >> 3);
1387
+ }, t.prototype.generateAsync = function(l, i, Z) {
1388
+ var d = new Zl(), b = l >> 1;
1389
+ this.e = parseInt(i, 16);
1390
+ var m = new o(i, 16), s = this, c = function() {
1391
+ var e = function() {
1392
+ if (s.p.compareTo(s.q) <= 0) {
1393
+ var W = s.p;
1394
+ s.p = s.q, s.q = W;
1395
+ }
1396
+ var X = s.p.subtract(o.ONE), p = s.q.subtract(o.ONE), G = X.multiply(p);
1397
+ G.gcd(m).compareTo(o.ONE) == 0 ? (s.n = s.p.multiply(s.q), s.d = m.modInverse(G), s.dmp1 = s.d.mod(X), s.dmq1 = s.d.mod(p), s.coeff = s.q.modInverse(s.p), setTimeout(function() {
1398
+ Z();
1399
+ }, 0)) : setTimeout(c, 0);
1400
+ }, h = function() {
1401
+ s.q = a(), s.q.fromNumberAsync(b, 1, d, function() {
1402
+ s.q.subtract(o.ONE).gcda(m, function(W) {
1403
+ W.compareTo(o.ONE) == 0 && s.q.isProbablePrime(10) ? setTimeout(e, 0) : setTimeout(h, 0);
1404
+ });
1405
+ });
1406
+ }, n = function() {
1407
+ s.p = a(), s.p.fromNumberAsync(l - b, 1, d, function() {
1408
+ s.p.subtract(o.ONE).gcda(m, function(W) {
1409
+ W.compareTo(o.ONE) == 0 && s.p.isProbablePrime(10) ? setTimeout(h, 0) : setTimeout(n, 0);
1410
+ });
1411
+ });
1412
+ };
1413
+ setTimeout(n, 0);
1414
+ };
1415
+ setTimeout(c, 0);
1416
+ }, t.prototype.sign = function(l, i, Z) {
1417
+ var d = Xi(Z), b = d + i(l).toString(), m = this.n.bitLength() / 4, s = si(b, m);
1418
+ if (s == null)
1419
+ return null;
1420
+ var c = this.doPrivate(s);
1421
+ if (c == null)
1422
+ return null;
1423
+ for (var e = c.toString(16), h = e.length, n = 0; n < m - h; n++)
1424
+ e = "0" + e;
1425
+ return e;
1426
+ }, t.prototype.verify = function(l, i, Z) {
1427
+ var d = y(i, 16), b = this.doPublic(d);
1428
+ if (b == null)
1429
+ return null;
1430
+ var m = b.toString(16).replace(/^1f+00/, ""), s = oi(m);
1431
+ return s == Z(l).toString();
1432
+ }, t;
1433
+ })()
1434
+ );
1435
+ function ni(t, l) {
1436
+ for (var i = t.toByteArray(), Z = 0; Z < i.length && i[Z] == 0; )
1437
+ ++Z;
1438
+ if (i.length - Z != l - 1 || i[Z] != 2)
1439
+ return null;
1440
+ for (++Z; i[Z] != 0; )
1441
+ if (++Z >= i.length)
1442
+ return null;
1443
+ for (var d = ""; ++Z < i.length; ) {
1444
+ var b = i[Z] & 255;
1445
+ b < 128 ? d += String.fromCharCode(b) : b > 191 && b < 224 ? (d += String.fromCharCode((b & 31) << 6 | i[Z + 1] & 63), ++Z) : (d += String.fromCharCode((b & 15) << 12 | (i[Z + 1] & 63) << 6 | i[Z + 2] & 63), Z += 2);
1446
+ }
1447
+ return d;
1448
+ }
1449
+ var il = {
1450
+ md2: "3020300c06082a864886f70d020205000410",
1451
+ md5: "3020300c06082a864886f70d020505000410",
1452
+ sha1: "3021300906052b0e03021a05000414",
1453
+ sha224: "302d300d06096086480165030402040500041c",
1454
+ sha256: "3031300d060960864801650304020105000420",
1455
+ sha384: "3041300d060960864801650304020205000430",
1456
+ sha512: "3051300d060960864801650304020305000440",
1457
+ ripemd160: "3021300906052b2403020105000414"
1458
+ };
1459
+ function Xi(t) {
1460
+ return il[t] || "";
1461
+ }
1462
+ function oi(t) {
1463
+ for (var l in il)
1464
+ if (il.hasOwnProperty(l)) {
1465
+ var i = il[l], Z = i.length;
1466
+ if (t.substring(0, Z) == i)
1467
+ return t.substring(Z);
1468
+ }
1469
+ return t;
1470
+ }
1471
+ function Y(t, l, i) {
1472
+ if (!l || !t)
1473
+ throw new Error("extend failed, please check that all dependencies are included.");
1474
+ var Z = function() {
1475
+ };
1476
+ Z.prototype = l.prototype, t.prototype = new Z(), t.prototype.constructor = t, t.superclass = l.prototype, l.prototype.constructor == Object.prototype.constructor && (l.prototype.constructor = l);
1477
+ }
1478
+ var u = {};
1479
+ (typeof u.asn1 > "u" || !u.asn1) && (u.asn1 = {});
1480
+ u.asn1.ASN1Util = new function() {
1481
+ this.integerToByteHex = function(t) {
1482
+ var l = t.toString(16);
1483
+ return l.length % 2 == 1 && (l = "0" + l), l;
1484
+ }, this.bigIntToMinTwosComplementsHex = function(t) {
1485
+ var l = t.toString(16);
1486
+ if (l.substring(0, 1) != "-")
1487
+ l.length % 2 == 1 ? l = "0" + l : l.match(/^[0-7]/) || (l = "00" + l);
1488
+ else {
1489
+ var i = l.substring(1), Z = i.length;
1490
+ Z % 2 == 1 ? Z += 1 : l.match(/^[0-7]/) || (Z += 2);
1491
+ for (var d = "", b = 0; b < Z; b++)
1492
+ d += "f";
1493
+ var m = new o(d, 16), s = m.xor(t).add(o.ONE);
1494
+ l = s.toString(16).replace(/^-/, "");
1495
+ }
1496
+ return l;
1497
+ }, this.getPEMStringFromHex = function(t, l) {
1498
+ return hextopem(t, l);
1499
+ }, this.newObject = function(t) {
1500
+ var l = u, i = l.asn1, Z = i.DERBoolean, d = i.DERInteger, b = i.DERBitString, m = i.DEROctetString, s = i.DERNull, c = i.DERObjectIdentifier, e = i.DEREnumerated, h = i.DERUTF8String, n = i.DERNumericString, W = i.DERPrintableString, X = i.DERTeletexString, p = i.DERIA5String, G = i.DERUTCTime, R = i.DERGeneralizedTime, F = i.DERSequence, N = i.DERSet, k = i.DERTaggedObject, E = i.ASN1Util.newObject, nl = Object.keys(t);
1501
+ if (nl.length != 1)
1502
+ throw "key of param shall be only one.";
1503
+ var V = nl[0];
1504
+ if (":bool:int:bitstr:octstr:null:oid:enum:utf8str:numstr:prnstr:telstr:ia5str:utctime:gentime:seq:set:tag:".indexOf(":" + V + ":") == -1)
1505
+ throw "undefined key: " + V;
1506
+ if (V == "bool")
1507
+ return new Z(t[V]);
1508
+ if (V == "int")
1509
+ return new d(t[V]);
1510
+ if (V == "bitstr")
1511
+ return new b(t[V]);
1512
+ if (V == "octstr")
1513
+ return new m(t[V]);
1514
+ if (V == "null")
1515
+ return new s(t[V]);
1516
+ if (V == "oid")
1517
+ return new c(t[V]);
1518
+ if (V == "enum")
1519
+ return new e(t[V]);
1520
+ if (V == "utf8str")
1521
+ return new h(t[V]);
1522
+ if (V == "numstr")
1523
+ return new n(t[V]);
1524
+ if (V == "prnstr")
1525
+ return new W(t[V]);
1526
+ if (V == "telstr")
1527
+ return new X(t[V]);
1528
+ if (V == "ia5str")
1529
+ return new p(t[V]);
1530
+ if (V == "utctime")
1531
+ return new G(t[V]);
1532
+ if (V == "gentime")
1533
+ return new R(t[V]);
1534
+ if (V == "seq") {
1535
+ for (var Q = t[V], w = [], T = 0; T < Q.length; T++) {
1536
+ var dl = E(Q[T]);
1537
+ w.push(dl);
1538
+ }
1539
+ return new F({ array: w });
1540
+ }
1541
+ if (V == "set") {
1542
+ for (var Q = t[V], w = [], T = 0; T < Q.length; T++) {
1543
+ var dl = E(Q[T]);
1544
+ w.push(dl);
1545
+ }
1546
+ return new N({ array: w });
1547
+ }
1548
+ if (V == "tag") {
1549
+ var L = t[V];
1550
+ if (Object.prototype.toString.call(L) === "[object Array]" && L.length == 3) {
1551
+ var Jl = E(L[2]);
1552
+ return new k({
1553
+ tag: L[0],
1554
+ explicit: L[1],
1555
+ obj: Jl
1556
+ });
1557
+ } else {
1558
+ var B = {};
1559
+ if (L.explicit !== void 0 && (B.explicit = L.explicit), L.tag !== void 0 && (B.tag = L.tag), L.obj === void 0)
1560
+ throw "obj shall be specified for 'tag'.";
1561
+ return B.obj = E(L.obj), new k(B);
1562
+ }
1563
+ }
1564
+ }, this.jsonToASN1HEX = function(t) {
1565
+ var l = this.newObject(t);
1566
+ return l.getEncodedHex();
1567
+ };
1568
+ }();
1569
+ u.asn1.ASN1Util.oidHexToInt = function(t) {
1570
+ for (var d = "", l = parseInt(t.substring(0, 2), 16), i = Math.floor(l / 40), Z = l % 40, d = i + "." + Z, b = "", m = 2; m < t.length; m += 2) {
1571
+ var s = parseInt(t.substring(m, m + 2), 16), c = ("00000000" + s.toString(2)).slice(-8);
1572
+ if (b = b + c.substring(1, 8), c.substring(0, 1) == "0") {
1573
+ var e = new o(b, 2);
1574
+ d = d + "." + e.toString(10), b = "";
1575
+ }
1576
+ }
1577
+ return d;
1578
+ };
1579
+ u.asn1.ASN1Util.oidIntToHex = function(t) {
1580
+ var l = function(s) {
1581
+ var c = s.toString(16);
1582
+ return c.length == 1 && (c = "0" + c), c;
1583
+ }, i = function(s) {
1584
+ var c = "", e = new o(s, 10), h = e.toString(2), n = 7 - h.length % 7;
1585
+ n == 7 && (n = 0);
1586
+ for (var W = "", X = 0; X < n; X++)
1587
+ W += "0";
1588
+ h = W + h;
1589
+ for (var X = 0; X < h.length - 1; X += 7) {
1590
+ var p = h.substring(X, X + 7);
1591
+ X != h.length - 7 && (p = "1" + p), c += l(parseInt(p, 2));
1592
+ }
1593
+ return c;
1594
+ };
1595
+ if (!t.match(/^[0-9.]+$/))
1596
+ throw "malformed oid string: " + t;
1597
+ var Z = "", d = t.split("."), b = parseInt(d[0]) * 40 + parseInt(d[1]);
1598
+ Z += l(b), d.splice(0, 2);
1599
+ for (var m = 0; m < d.length; m++)
1600
+ Z += i(d[m]);
1601
+ return Z;
1602
+ };
1603
+ u.asn1.ASN1Object = function() {
1604
+ var t = "";
1605
+ this.getLengthHexFromValue = function() {
1606
+ if (typeof this.hV > "u" || this.hV == null)
1607
+ throw "this.hV is null or undefined.";
1608
+ if (this.hV.length % 2 == 1)
1609
+ throw "value hex must be even length: n=" + t.length + ",v=" + this.hV;
1610
+ var l = this.hV.length / 2, i = l.toString(16);
1611
+ if (i.length % 2 == 1 && (i = "0" + i), l < 128)
1612
+ return i;
1613
+ var Z = i.length / 2;
1614
+ if (Z > 15)
1615
+ throw "ASN.1 length too long to represent by 8x: n = " + l.toString(16);
1616
+ var d = 128 + Z;
1617
+ return d.toString(16) + i;
1618
+ }, this.getEncodedHex = function() {
1619
+ return (this.hTLV == null || this.isModified) && (this.hV = this.getFreshValueHex(), this.hL = this.getLengthHexFromValue(), this.hTLV = this.hT + this.hL + this.hV, this.isModified = !1), this.hTLV;
1620
+ }, this.getValueHex = function() {
1621
+ return this.getEncodedHex(), this.hV;
1622
+ }, this.getFreshValueHex = function() {
1623
+ return "";
1624
+ };
1625
+ };
1626
+ u.asn1.DERAbstractString = function(t) {
1627
+ u.asn1.DERAbstractString.superclass.constructor.call(this), this.getString = function() {
1628
+ return this.s;
1629
+ }, this.setString = function(l) {
1630
+ this.hTLV = null, this.isModified = !0, this.s = l, this.hV = stohex(this.s);
1631
+ }, this.setStringHex = function(l) {
1632
+ this.hTLV = null, this.isModified = !0, this.s = null, this.hV = l;
1633
+ }, this.getFreshValueHex = function() {
1634
+ return this.hV;
1635
+ }, typeof t < "u" && (typeof t == "string" ? this.setString(t) : typeof t.str < "u" ? this.setString(t.str) : typeof t.hex < "u" && this.setStringHex(t.hex));
1636
+ };
1637
+ Y(u.asn1.DERAbstractString, u.asn1.ASN1Object);
1638
+ u.asn1.DERAbstractTime = function(t) {
1639
+ u.asn1.DERAbstractTime.superclass.constructor.call(this), this.localDateToUTC = function(l) {
1640
+ utc = l.getTime() + l.getTimezoneOffset() * 6e4;
1641
+ var i = new Date(utc);
1642
+ return i;
1643
+ }, this.formatDate = function(l, i, Z) {
1644
+ var d = this.zeroPadding, b = this.localDateToUTC(l), m = String(b.getFullYear());
1645
+ i == "utc" && (m = m.substring(2, 4));
1646
+ var s = d(String(b.getMonth() + 1), 2), c = d(String(b.getDate()), 2), e = d(String(b.getHours()), 2), h = d(String(b.getMinutes()), 2), n = d(String(b.getSeconds()), 2), W = m + s + c + e + h + n;
1647
+ if (Z === !0) {
1648
+ var X = b.getMilliseconds();
1649
+ if (X != 0) {
1650
+ var p = d(String(X), 3);
1651
+ p = p.replace(/[0]+$/, ""), W = W + "." + p;
1652
+ }
1653
+ }
1654
+ return W + "Z";
1655
+ }, this.zeroPadding = function(l, i) {
1656
+ return l.length >= i ? l : new Array(i - l.length + 1).join("0") + l;
1657
+ }, this.getString = function() {
1658
+ return this.s;
1659
+ }, this.setString = function(l) {
1660
+ this.hTLV = null, this.isModified = !0, this.s = l, this.hV = stohex(l);
1661
+ }, this.setByDateValue = function(l, i, Z, d, b, m) {
1662
+ var s = new Date(Date.UTC(l, i - 1, Z, d, b, m, 0));
1663
+ this.setByDate(s);
1664
+ }, this.getFreshValueHex = function() {
1665
+ return this.hV;
1666
+ };
1667
+ };
1668
+ Y(u.asn1.DERAbstractTime, u.asn1.ASN1Object);
1669
+ u.asn1.DERAbstractStructured = function(t) {
1670
+ u.asn1.DERAbstractString.superclass.constructor.call(this), this.setByASN1ObjectArray = function(l) {
1671
+ this.hTLV = null, this.isModified = !0, this.asn1Array = l;
1672
+ }, this.appendASN1Object = function(l) {
1673
+ this.hTLV = null, this.isModified = !0, this.asn1Array.push(l);
1674
+ }, this.asn1Array = new Array(), typeof t < "u" && typeof t.array < "u" && (this.asn1Array = t.array);
1675
+ };
1676
+ Y(u.asn1.DERAbstractStructured, u.asn1.ASN1Object);
1677
+ u.asn1.DERBoolean = function() {
1678
+ u.asn1.DERBoolean.superclass.constructor.call(this), this.hT = "01", this.hTLV = "0101ff";
1679
+ };
1680
+ Y(u.asn1.DERBoolean, u.asn1.ASN1Object);
1681
+ u.asn1.DERInteger = function(t) {
1682
+ u.asn1.DERInteger.superclass.constructor.call(this), this.hT = "02", this.setByBigInteger = function(l) {
1683
+ this.hTLV = null, this.isModified = !0, this.hV = u.asn1.ASN1Util.bigIntToMinTwosComplementsHex(l);
1684
+ }, this.setByInteger = function(l) {
1685
+ var i = new o(String(l), 10);
1686
+ this.setByBigInteger(i);
1687
+ }, this.setValueHex = function(l) {
1688
+ this.hV = l;
1689
+ }, this.getFreshValueHex = function() {
1690
+ return this.hV;
1691
+ }, typeof t < "u" && (typeof t.bigint < "u" ? this.setByBigInteger(t.bigint) : typeof t.int < "u" ? this.setByInteger(t.int) : typeof t == "number" ? this.setByInteger(t) : typeof t.hex < "u" && this.setValueHex(t.hex));
1692
+ };
1693
+ Y(u.asn1.DERInteger, u.asn1.ASN1Object);
1694
+ u.asn1.DERBitString = function(t) {
1695
+ if (t !== void 0 && typeof t.obj < "u") {
1696
+ var l = u.asn1.ASN1Util.newObject(t.obj);
1697
+ t.hex = "00" + l.getEncodedHex();
1698
+ }
1699
+ u.asn1.DERBitString.superclass.constructor.call(this), this.hT = "03", this.setHexValueIncludingUnusedBits = function(i) {
1700
+ this.hTLV = null, this.isModified = !0, this.hV = i;
1701
+ }, this.setUnusedBitsAndHexValue = function(i, Z) {
1702
+ if (i < 0 || 7 < i)
1703
+ throw "unused bits shall be from 0 to 7: u = " + i;
1704
+ var d = "0" + i;
1705
+ this.hTLV = null, this.isModified = !0, this.hV = d + Z;
1706
+ }, this.setByBinaryString = function(i) {
1707
+ i = i.replace(/0+$/, "");
1708
+ var Z = 8 - i.length % 8;
1709
+ Z == 8 && (Z = 0);
1710
+ for (var d = 0; d <= Z; d++)
1711
+ i += "0";
1712
+ for (var b = "", d = 0; d < i.length - 1; d += 8) {
1713
+ var m = i.substring(d, d + 8), s = parseInt(m, 2).toString(16);
1714
+ s.length == 1 && (s = "0" + s), b += s;
1715
+ }
1716
+ this.hTLV = null, this.isModified = !0, this.hV = "0" + Z + b;
1717
+ }, this.setByBooleanArray = function(i) {
1718
+ for (var Z = "", d = 0; d < i.length; d++)
1719
+ i[d] == !0 ? Z += "1" : Z += "0";
1720
+ this.setByBinaryString(Z);
1721
+ }, this.newFalseArray = function(i) {
1722
+ for (var Z = new Array(i), d = 0; d < i; d++)
1723
+ Z[d] = !1;
1724
+ return Z;
1725
+ }, this.getFreshValueHex = function() {
1726
+ return this.hV;
1727
+ }, typeof t < "u" && (typeof t == "string" && t.toLowerCase().match(/^[0-9a-f]+$/) ? this.setHexValueIncludingUnusedBits(t) : typeof t.hex < "u" ? this.setHexValueIncludingUnusedBits(t.hex) : typeof t.bin < "u" ? this.setByBinaryString(t.bin) : typeof t.array < "u" && this.setByBooleanArray(t.array));
1728
+ };
1729
+ Y(u.asn1.DERBitString, u.asn1.ASN1Object);
1730
+ u.asn1.DEROctetString = function(t) {
1731
+ if (t !== void 0 && typeof t.obj < "u") {
1732
+ var l = u.asn1.ASN1Util.newObject(t.obj);
1733
+ t.hex = l.getEncodedHex();
1734
+ }
1735
+ u.asn1.DEROctetString.superclass.constructor.call(this, t), this.hT = "04";
1736
+ };
1737
+ Y(u.asn1.DEROctetString, u.asn1.DERAbstractString);
1738
+ u.asn1.DERNull = function() {
1739
+ u.asn1.DERNull.superclass.constructor.call(this), this.hT = "05", this.hTLV = "0500";
1740
+ };
1741
+ Y(u.asn1.DERNull, u.asn1.ASN1Object);
1742
+ u.asn1.DERObjectIdentifier = function(t) {
1743
+ var l = function(Z) {
1744
+ var d = Z.toString(16);
1745
+ return d.length == 1 && (d = "0" + d), d;
1746
+ }, i = function(Z) {
1747
+ var d = "", b = new o(Z, 10), m = b.toString(2), s = 7 - m.length % 7;
1748
+ s == 7 && (s = 0);
1749
+ for (var c = "", e = 0; e < s; e++)
1750
+ c += "0";
1751
+ m = c + m;
1752
+ for (var e = 0; e < m.length - 1; e += 7) {
1753
+ var h = m.substring(e, e + 7);
1754
+ e != m.length - 7 && (h = "1" + h), d += l(parseInt(h, 2));
1755
+ }
1756
+ return d;
1757
+ };
1758
+ u.asn1.DERObjectIdentifier.superclass.constructor.call(this), this.hT = "06", this.setValueHex = function(Z) {
1759
+ this.hTLV = null, this.isModified = !0, this.s = null, this.hV = Z;
1760
+ }, this.setValueOidString = function(Z) {
1761
+ if (!Z.match(/^[0-9.]+$/))
1762
+ throw "malformed oid string: " + Z;
1763
+ var d = "", b = Z.split("."), m = parseInt(b[0]) * 40 + parseInt(b[1]);
1764
+ d += l(m), b.splice(0, 2);
1765
+ for (var s = 0; s < b.length; s++)
1766
+ d += i(b[s]);
1767
+ this.hTLV = null, this.isModified = !0, this.s = null, this.hV = d;
1768
+ }, this.setValueName = function(Z) {
1769
+ var d = u.asn1.x509.OID.name2oid(Z);
1770
+ if (d !== "")
1771
+ this.setValueOidString(d);
1772
+ else
1773
+ throw "DERObjectIdentifier oidName undefined: " + Z;
1774
+ }, this.getFreshValueHex = function() {
1775
+ return this.hV;
1776
+ }, t !== void 0 && (typeof t == "string" ? t.match(/^[0-2].[0-9.]+$/) ? this.setValueOidString(t) : this.setValueName(t) : t.oid !== void 0 ? this.setValueOidString(t.oid) : t.hex !== void 0 ? this.setValueHex(t.hex) : t.name !== void 0 && this.setValueName(t.name));
1777
+ };
1778
+ Y(u.asn1.DERObjectIdentifier, u.asn1.ASN1Object);
1779
+ u.asn1.DEREnumerated = function(t) {
1780
+ u.asn1.DEREnumerated.superclass.constructor.call(this), this.hT = "0a", this.setByBigInteger = function(l) {
1781
+ this.hTLV = null, this.isModified = !0, this.hV = u.asn1.ASN1Util.bigIntToMinTwosComplementsHex(l);
1782
+ }, this.setByInteger = function(l) {
1783
+ var i = new o(String(l), 10);
1784
+ this.setByBigInteger(i);
1785
+ }, this.setValueHex = function(l) {
1786
+ this.hV = l;
1787
+ }, this.getFreshValueHex = function() {
1788
+ return this.hV;
1789
+ }, typeof t < "u" && (typeof t.int < "u" ? this.setByInteger(t.int) : typeof t == "number" ? this.setByInteger(t) : typeof t.hex < "u" && this.setValueHex(t.hex));
1790
+ };
1791
+ Y(u.asn1.DEREnumerated, u.asn1.ASN1Object);
1792
+ u.asn1.DERUTF8String = function(t) {
1793
+ u.asn1.DERUTF8String.superclass.constructor.call(this, t), this.hT = "0c";
1794
+ };
1795
+ Y(u.asn1.DERUTF8String, u.asn1.DERAbstractString);
1796
+ u.asn1.DERNumericString = function(t) {
1797
+ u.asn1.DERNumericString.superclass.constructor.call(this, t), this.hT = "12";
1798
+ };
1799
+ Y(u.asn1.DERNumericString, u.asn1.DERAbstractString);
1800
+ u.asn1.DERPrintableString = function(t) {
1801
+ u.asn1.DERPrintableString.superclass.constructor.call(this, t), this.hT = "13";
1802
+ };
1803
+ Y(u.asn1.DERPrintableString, u.asn1.DERAbstractString);
1804
+ u.asn1.DERTeletexString = function(t) {
1805
+ u.asn1.DERTeletexString.superclass.constructor.call(this, t), this.hT = "14";
1806
+ };
1807
+ Y(u.asn1.DERTeletexString, u.asn1.DERAbstractString);
1808
+ u.asn1.DERIA5String = function(t) {
1809
+ u.asn1.DERIA5String.superclass.constructor.call(this, t), this.hT = "16";
1810
+ };
1811
+ Y(u.asn1.DERIA5String, u.asn1.DERAbstractString);
1812
+ u.asn1.DERUTCTime = function(t) {
1813
+ u.asn1.DERUTCTime.superclass.constructor.call(this, t), this.hT = "17", this.setByDate = function(l) {
1814
+ this.hTLV = null, this.isModified = !0, this.date = l, this.s = this.formatDate(this.date, "utc"), this.hV = stohex(this.s);
1815
+ }, this.getFreshValueHex = function() {
1816
+ return typeof this.date > "u" && typeof this.s > "u" && (this.date = /* @__PURE__ */ new Date(), this.s = this.formatDate(this.date, "utc"), this.hV = stohex(this.s)), this.hV;
1817
+ }, t !== void 0 && (t.str !== void 0 ? this.setString(t.str) : typeof t == "string" && t.match(/^[0-9]{12}Z$/) ? this.setString(t) : t.hex !== void 0 ? this.setStringHex(t.hex) : t.date !== void 0 && this.setByDate(t.date));
1818
+ };
1819
+ Y(u.asn1.DERUTCTime, u.asn1.DERAbstractTime);
1820
+ u.asn1.DERGeneralizedTime = function(t) {
1821
+ u.asn1.DERGeneralizedTime.superclass.constructor.call(this, t), this.hT = "18", this.withMillis = !1, this.setByDate = function(l) {
1822
+ this.hTLV = null, this.isModified = !0, this.date = l, this.s = this.formatDate(this.date, "gen", this.withMillis), this.hV = stohex(this.s);
1823
+ }, this.getFreshValueHex = function() {
1824
+ return this.date === void 0 && this.s === void 0 && (this.date = /* @__PURE__ */ new Date(), this.s = this.formatDate(this.date, "gen", this.withMillis), this.hV = stohex(this.s)), this.hV;
1825
+ }, t !== void 0 && (t.str !== void 0 ? this.setString(t.str) : typeof t == "string" && t.match(/^[0-9]{14}Z$/) ? this.setString(t) : t.hex !== void 0 ? this.setStringHex(t.hex) : t.date !== void 0 && this.setByDate(t.date), t.millis === !0 && (this.withMillis = !0));
1826
+ };
1827
+ Y(u.asn1.DERGeneralizedTime, u.asn1.DERAbstractTime);
1828
+ u.asn1.DERSequence = function(t) {
1829
+ u.asn1.DERSequence.superclass.constructor.call(this, t), this.hT = "30", this.getFreshValueHex = function() {
1830
+ for (var l = "", i = 0; i < this.asn1Array.length; i++) {
1831
+ var Z = this.asn1Array[i];
1832
+ l += Z.getEncodedHex();
1833
+ }
1834
+ return this.hV = l, this.hV;
1835
+ };
1836
+ };
1837
+ Y(u.asn1.DERSequence, u.asn1.DERAbstractStructured);
1838
+ u.asn1.DERSet = function(t) {
1839
+ u.asn1.DERSet.superclass.constructor.call(this, t), this.hT = "31", this.sortFlag = !0, this.getFreshValueHex = function() {
1840
+ for (var l = new Array(), i = 0; i < this.asn1Array.length; i++) {
1841
+ var Z = this.asn1Array[i];
1842
+ l.push(Z.getEncodedHex());
1843
+ }
1844
+ return this.sortFlag == !0 && l.sort(), this.hV = l.join(""), this.hV;
1845
+ }, typeof t < "u" && typeof t.sortflag < "u" && t.sortflag == !1 && (this.sortFlag = !1);
1846
+ };
1847
+ Y(u.asn1.DERSet, u.asn1.DERAbstractStructured);
1848
+ u.asn1.DERTaggedObject = function(t) {
1849
+ u.asn1.DERTaggedObject.superclass.constructor.call(this), this.hT = "a0", this.hV = "", this.isExplicit = !0, this.asn1Object = null, this.setASN1Object = function(l, i, Z) {
1850
+ this.hT = i, this.isExplicit = l, this.asn1Object = Z, this.isExplicit ? (this.hV = this.asn1Object.getEncodedHex(), this.hTLV = null, this.isModified = !0) : (this.hV = null, this.hTLV = Z.getEncodedHex(), this.hTLV = this.hTLV.replace(/^../, i), this.isModified = !1);
1851
+ }, this.getFreshValueHex = function() {
1852
+ return this.hV;
1853
+ }, typeof t < "u" && (typeof t.tag < "u" && (this.hT = t.tag), typeof t.explicit < "u" && (this.isExplicit = t.explicit), typeof t.obj < "u" && (this.asn1Object = t.obj, this.setASN1Object(this.isExplicit, this.hT, this.asn1Object)));
1854
+ };
1855
+ Y(u.asn1.DERTaggedObject, u.asn1.ASN1Object);
1856
+ var Wi = /* @__PURE__ */ (function() {
1857
+ var t = function(l, i) {
1858
+ return t = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(Z, d) {
1859
+ Z.__proto__ = d;
1860
+ } || function(Z, d) {
1861
+ for (var b in d) Object.prototype.hasOwnProperty.call(d, b) && (Z[b] = d[b]);
1862
+ }, t(l, i);
1863
+ };
1864
+ return function(l, i) {
1865
+ if (typeof i != "function" && i !== null)
1866
+ throw new TypeError("Class extends value " + String(i) + " is not a constructor or null");
1867
+ t(l, i);
1868
+ function Z() {
1869
+ this.constructor = l;
1870
+ }
1871
+ l.prototype = i === null ? Object.create(i) : (Z.prototype = i.prototype, new Z());
1872
+ };
1873
+ })(), Rl = (
1874
+ /** @class */
1875
+ (function(t) {
1876
+ Wi(l, t);
1877
+ function l(i) {
1878
+ var Z = t.call(this) || this;
1879
+ return i && (typeof i == "string" ? Z.parseKey(i) : (l.hasPrivateKeyProperty(i) || l.hasPublicKeyProperty(i)) && Z.parsePropertiesFrom(i)), Z;
1880
+ }
1881
+ return l.prototype.parseKey = function(i) {
1882
+ try {
1883
+ var Z = 0, d = 0, b = /^\s*(?:[0-9A-Fa-f][0-9A-Fa-f]\s*)+$/, m = b.test(i) ? zl.decode(i) : ul.unarmor(i), s = Ql.decode(m);
1884
+ if (s.sub.length === 3 && (s = s.sub[2].sub[0]), s.sub.length === 9) {
1885
+ Z = s.sub[1].getHexStringValue(), this.n = y(Z, 16), d = s.sub[2].getHexStringValue(), this.e = parseInt(d, 16);
1886
+ var c = s.sub[3].getHexStringValue();
1887
+ this.d = y(c, 16);
1888
+ var e = s.sub[4].getHexStringValue();
1889
+ this.p = y(e, 16);
1890
+ var h = s.sub[5].getHexStringValue();
1891
+ this.q = y(h, 16);
1892
+ var n = s.sub[6].getHexStringValue();
1893
+ this.dmp1 = y(n, 16);
1894
+ var W = s.sub[7].getHexStringValue();
1895
+ this.dmq1 = y(W, 16);
1896
+ var X = s.sub[8].getHexStringValue();
1897
+ this.coeff = y(X, 16);
1898
+ } else if (s.sub.length === 2)
1899
+ if (s.sub[0].sub) {
1900
+ var p = s.sub[1], G = p.sub[0];
1901
+ Z = G.sub[0].getHexStringValue(), this.n = y(Z, 16), d = G.sub[1].getHexStringValue(), this.e = parseInt(d, 16);
1902
+ } else
1903
+ Z = s.sub[0].getHexStringValue(), this.n = y(Z, 16), d = s.sub[1].getHexStringValue(), this.e = parseInt(d, 16);
1904
+ else
1905
+ return !1;
1906
+ return !0;
1907
+ } catch {
1908
+ return !1;
1909
+ }
1910
+ }, l.prototype.getPrivateBaseKey = function() {
1911
+ var i = {
1912
+ array: [
1913
+ new u.asn1.DERInteger({ int: 0 }),
1914
+ new u.asn1.DERInteger({ bigint: this.n }),
1915
+ new u.asn1.DERInteger({ int: this.e }),
1916
+ new u.asn1.DERInteger({ bigint: this.d }),
1917
+ new u.asn1.DERInteger({ bigint: this.p }),
1918
+ new u.asn1.DERInteger({ bigint: this.q }),
1919
+ new u.asn1.DERInteger({ bigint: this.dmp1 }),
1920
+ new u.asn1.DERInteger({ bigint: this.dmq1 }),
1921
+ new u.asn1.DERInteger({ bigint: this.coeff })
1922
+ ]
1923
+ }, Z = new u.asn1.DERSequence(i);
1924
+ return Z.getEncodedHex();
1925
+ }, l.prototype.getPrivateBaseKeyB64 = function() {
1926
+ return D(this.getPrivateBaseKey());
1927
+ }, l.prototype.getPublicBaseKey = function() {
1928
+ var i = new u.asn1.DERSequence({
1929
+ array: [
1930
+ new u.asn1.DERObjectIdentifier({ oid: "1.2.840.113549.1.1.1" }),
1931
+ // RSA Encryption pkcs #1 oid
1932
+ new u.asn1.DERNull()
1933
+ ]
1934
+ }), Z = new u.asn1.DERSequence({
1935
+ array: [
1936
+ new u.asn1.DERInteger({ bigint: this.n }),
1937
+ new u.asn1.DERInteger({ int: this.e })
1938
+ ]
1939
+ }), d = new u.asn1.DERBitString({
1940
+ hex: "00" + Z.getEncodedHex()
1941
+ }), b = new u.asn1.DERSequence({
1942
+ array: [i, d]
1943
+ });
1944
+ return b.getEncodedHex();
1945
+ }, l.prototype.getPublicBaseKeyB64 = function() {
1946
+ return D(this.getPublicBaseKey());
1947
+ }, l.wordwrap = function(i, Z) {
1948
+ if (Z = Z || 64, !i)
1949
+ return i;
1950
+ var d = "(.{1," + Z + `})( +|$
1951
+ ?)|(.{1,` + Z + "})";
1952
+ return i.match(RegExp(d, "g")).join(`
1953
+ `);
1954
+ }, l.prototype.getPrivateKey = function() {
1955
+ var i = `-----BEGIN RSA PRIVATE KEY-----
1956
+ `;
1957
+ return i += l.wordwrap(this.getPrivateBaseKeyB64()) + `
1958
+ `, i += "-----END RSA PRIVATE KEY-----", i;
1959
+ }, l.prototype.getPublicKey = function() {
1960
+ var i = `-----BEGIN PUBLIC KEY-----
1961
+ `;
1962
+ return i += l.wordwrap(this.getPublicBaseKeyB64()) + `
1963
+ `, i += "-----END PUBLIC KEY-----", i;
1964
+ }, l.hasPublicKeyProperty = function(i) {
1965
+ return i = i || {}, i.hasOwnProperty("n") && i.hasOwnProperty("e");
1966
+ }, l.hasPrivateKeyProperty = function(i) {
1967
+ return i = i || {}, i.hasOwnProperty("n") && i.hasOwnProperty("e") && i.hasOwnProperty("d") && i.hasOwnProperty("p") && i.hasOwnProperty("q") && i.hasOwnProperty("dmp1") && i.hasOwnProperty("dmq1") && i.hasOwnProperty("coeff");
1968
+ }, l.prototype.parsePropertiesFrom = function(i) {
1969
+ this.n = i.n, this.e = i.e, i.hasOwnProperty("d") && (this.d = i.d, this.p = i.p, this.q = i.q, this.dmp1 = i.dmp1, this.dmq1 = i.dmq1, this.coeff = i.coeff);
1970
+ }, l;
1971
+ })(hi)
1972
+ ), sl, ai = typeof process < "u" ? (sl = process.env) === null || sl === void 0 ? void 0 : sl.npm_package_version : void 0, Vi = (
1973
+ /** @class */
1974
+ (function() {
1975
+ function t(l) {
1976
+ l === void 0 && (l = {}), this.default_key_size = l.default_key_size ? parseInt(l.default_key_size, 10) : 1024, this.default_public_exponent = l.default_public_exponent || "010001", this.log = l.log || !1, this.key = l.key || null;
1977
+ }
1978
+ return t.prototype.setKey = function(l) {
1979
+ l ? (this.log && this.key && console.warn("A key was already set, overriding existing."), this.key = new Rl(l)) : !this.key && this.log && console.error("A key was not set.");
1980
+ }, t.prototype.setPrivateKey = function(l) {
1981
+ this.setKey(l);
1982
+ }, t.prototype.setPublicKey = function(l) {
1983
+ this.setKey(l);
1984
+ }, t.prototype.decrypt = function(l) {
1985
+ try {
1986
+ return this.getKey().decrypt(Wl(l));
1987
+ } catch {
1988
+ return !1;
1989
+ }
1990
+ }, t.prototype.encrypt = function(l) {
1991
+ try {
1992
+ return D(this.getKey().encrypt(l));
1993
+ } catch {
1994
+ return !1;
1995
+ }
1996
+ }, t.prototype.encryptOAEP = function(l) {
1997
+ try {
1998
+ return D(this.getKey().encrypt(l, ei));
1999
+ } catch {
2000
+ return !1;
2001
+ }
2002
+ }, t.prototype.sign = function(l, i, Z) {
2003
+ i === void 0 && (i = function(d) {
2004
+ return d;
2005
+ }), Z === void 0 && (Z = "");
2006
+ try {
2007
+ return D(this.getKey().sign(l, i, Z));
2008
+ } catch {
2009
+ return !1;
2010
+ }
2011
+ }, t.prototype.signSha256 = function(l) {
2012
+ return this.sign(l, function(i) {
2013
+ return rl(el(i));
2014
+ }, "sha256");
2015
+ }, t.prototype.verify = function(l, i, Z) {
2016
+ Z === void 0 && (Z = function(d) {
2017
+ return d;
2018
+ });
2019
+ try {
2020
+ return this.getKey().verify(l, Wl(i), Z);
2021
+ } catch {
2022
+ return !1;
2023
+ }
2024
+ }, t.prototype.verifySha256 = function(l, i) {
2025
+ return this.verify(l, i, function(Z) {
2026
+ return rl(el(Z));
2027
+ });
2028
+ }, t.prototype.getKey = function(l) {
2029
+ if (!this.key) {
2030
+ if (this.key = new Rl(), l && {}.toString.call(l) === "[object Function]") {
2031
+ this.key.generateAsync(this.default_key_size, this.default_public_exponent, l);
2032
+ return;
2033
+ }
2034
+ this.key.generate(this.default_key_size, this.default_public_exponent);
2035
+ }
2036
+ return this.key;
2037
+ }, t.prototype.getPrivateKey = function() {
2038
+ return this.getKey().getPrivateKey();
2039
+ }, t.prototype.getPrivateKeyB64 = function() {
2040
+ return this.getKey().getPrivateBaseKeyB64();
2041
+ }, t.prototype.getPublicKey = function() {
2042
+ return this.getKey().getPublicKey();
2043
+ }, t.prototype.getPublicKeyB64 = function() {
2044
+ return this.getKey().getPublicBaseKeyB64();
2045
+ }, t.version = ai, t;
2046
+ })()
2047
+ );
2048
+ const pi = {
2049
+ name: "GPluginVideo",
2050
+ props: {
2051
+ // 是否播放
2052
+ isPlayVideo: {
2053
+ type: Boolean,
2054
+ default: !1
2055
+ },
2056
+ // 是否全屏播放
2057
+ isFullScreen: {
2058
+ type: Boolean,
2059
+ default: !1
2060
+ },
2061
+ //监控点编号值
2062
+ cameraIndexCode: {
2063
+ type: String,
2064
+ default: ""
2065
+ },
2066
+ // 播放类型 1:回放 0:预览
2067
+ currentPlayType: {
2068
+ type: Number,
2069
+ default: 0
2070
+ },
2071
+ // 下载插件的url
2072
+ baseUrl: {
2073
+ type: String,
2074
+ default: "http://92.97.137.81:48181"
2075
+ },
2076
+ // 应用Key
2077
+ usefullData: {
2078
+ type: Object,
2079
+ default: {
2080
+ appkey: "24460774",
2081
+ secret: "vphyI4pTqEVk4lT67jVe",
2082
+ ip: "61.27.16.15",
2083
+ port: 443
2084
+ }
2085
+ },
2086
+ size: {
2087
+ type: Object,
2088
+ default: {
2089
+ windowWidth: 300,
2090
+ windowHeight: 200
2091
+ }
2092
+ },
2093
+ // 是否批量
2094
+ isMulTip: {
2095
+ type: Boolean,
2096
+ default: !1
2097
+ },
2098
+ multipPointsArr: {
2099
+ type: Array,
2100
+ default: () => []
2101
+ },
2102
+ happenedTime: {
2103
+ type: String,
2104
+ default: ""
2105
+ }
2106
+ },
2107
+ data() {
2108
+ return {
2109
+ camlength: "1x1",
2110
+ layoutMode: "1x1",
2111
+ oWebControl: null,
2112
+ initCount: 0,
2113
+ pubKey: "",
2114
+ isLoading: !0,
2115
+ playText: "",
2116
+ videoTotal: 0,
2117
+ selectAll: [],
2118
+ currentPage: 1,
2119
+ currentArr: [],
2120
+ pageSize: 0
2121
+ };
2122
+ },
2123
+ mounted() {
2124
+ this.loadH5PlayerScript().then(() => {
2125
+ this.isPlayVideo && this.initPlugin();
2126
+ }).catch(() => {
2127
+ this.showPluginDownloadDialog();
2128
+ }), this.isMulTip && (this.pageSize = 4, this.videoTotal = this.multipPointsArr.length, this.videoTotal === 1 ? this.layoutMode = "1x1" : this.videoTotal === 2 ? this.layoutMode = "2x2" : this.videoTotal > 2 && (this.layoutMode = "2x2"), this.selectAll = this.multipPointsArr, this.selectAll = this.chunkArray(this.selectAll, 4), this.currentArr = [...this.selectAll[this.currentPage - 1]]);
2129
+ },
2130
+ beforeDestroy() {
2131
+ this.oWebControl.JS_RequestInterface({
2132
+ funcName: "stopAllPreview"
2133
+ }), this.oWebControl.JS_HideWnd(), this.oWebControl.JS_RequestInterface({
2134
+ funcName: "destroyWnd"
2135
+ });
2136
+ },
2137
+ watch: {
2138
+ happenedTime() {
2139
+ this.startMultiPlayback();
2140
+ },
2141
+ cameraIndexCode(t, l) {
2142
+ t !== l && (this.oWebControl.JS_RequestInterface({
2143
+ funcName: "stopAllPreview"
2144
+ }), this.oWebControl.JS_HideWnd(), this.oWebControl.JS_RequestInterface({
2145
+ funcName: "destroyWnd"
2146
+ }), this.oWebControl.JS_Disconnect().then(
2147
+ () => {
2148
+ this.initPlugin();
2149
+ },
2150
+ () => {
2151
+ }
2152
+ ));
2153
+ },
2154
+ playText(t) {
2155
+ t != "" && this.showPluginDownloadDialog();
2156
+ }
2157
+ },
2158
+ methods: {
2159
+ // 动态加载h5player.min.js脚本
2160
+ loadH5PlayerScript() {
2161
+ return new Promise((t, l) => {
2162
+ if (window.WebControl) {
2163
+ t();
2164
+ return;
2165
+ }
2166
+ const i = document.createElement("script");
2167
+ let Z;
2168
+ try {
2169
+ Z = new URL("data:text/javascript;base64,dmFyIFdlYkNvbnRyb2w9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIGU9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp7fTtmdW5jdGlvbiB0KGUpe3JldHVybiB0PSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfSx0KGUpfWZ1bmN0aW9uIG4oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBvKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBvPXRbbl07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITEsby5jb25maWd1cmFibGU9ITAsInZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxvLmtleSxvKX19ZnVuY3Rpb24gcihlLHQsbil7cmV0dXJuIHQmJm8oZS5wcm90b3R5cGUsdCksbiYmbyhlLG4pLGV9dmFyIGk9ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuTWF0aD09TWF0aCYmZX0scz1pKCJvYmplY3QiPT0oInVuZGVmaW5lZCI9PXR5cGVvZiBnbG9iYWxUaGlzPyJ1bmRlZmluZWQiOnQoZ2xvYmFsVGhpcykpJiZnbG9iYWxUaGlzKXx8aSgib2JqZWN0Ij09KCJ1bmRlZmluZWQiPT10eXBlb2Ygd2luZG93PyJ1bmRlZmluZWQiOnQod2luZG93KSkmJndpbmRvdyl8fGkoIm9iamVjdCI9PSgidW5kZWZpbmVkIj09dHlwZW9mIHNlbGY/InVuZGVmaW5lZCI6dChzZWxmKSkmJnNlbGYpfHxpKCJvYmplY3QiPT10KGUpJiZlKXx8ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30oKXx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSxhPXt9LHU9ZnVuY3Rpb24oZSl7dHJ5e3JldHVybiEhZSgpfWNhdGNoKGUpe3JldHVybiEwfX0sYz0hdSgoZnVuY3Rpb24oKXtyZXR1cm4gNyE9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LDEse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pWzFdfSkpLGw9RnVuY3Rpb24ucHJvdG90eXBlLmNhbGwsZD1sLmJpbmQ/bC5iaW5kKGwpOmZ1bmN0aW9uKCl7cmV0dXJuIGwuYXBwbHkobCxhcmd1bWVudHMpfSxmPXt9LGg9e30ucHJvcGVydHlJc0VudW1lcmFibGUscD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLHY9cCYmIWguY2FsbCh7MToyfSwxKTtmLmY9dj9mdW5jdGlvbihlKXt2YXIgdD1wKHRoaXMsZSk7cmV0dXJuISF0JiZ0LmVudW1lcmFibGV9Omg7dmFyIGIsZyxtPWZ1bmN0aW9uKGUsdCl7cmV0dXJue2VudW1lcmFibGU6ISgxJmUpLGNvbmZpZ3VyYWJsZTohKDImZSksd3JpdGFibGU6ISg0JmUpLHZhbHVlOnR9fSx5PUZ1bmN0aW9uLnByb3RvdHlwZSxfPXkuYmluZCx3PXkuY2FsbCxDPV8mJl8uYmluZCh3KSxrPV8/ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJkModyxlKX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmZ1bmN0aW9uKCl7cmV0dXJuIHcuYXBwbHkoZSxhcmd1bWVudHMpfX0sUz1rLFI9Uyh7fS50b1N0cmluZykscT1TKCIiLnNsaWNlKSxJPWZ1bmN0aW9uKGUpe3JldHVybiBxKFIoZSksOCwtMSl9LFA9ayxFPXUsTz1JLFQ9cy5PYmplY3Qsej1QKCIiLnNwbGl0KSxBPUUoKGZ1bmN0aW9uKCl7cmV0dXJuIVQoInoiKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKX0pKT9mdW5jdGlvbihlKXtyZXR1cm4iU3RyaW5nIj09TyhlKT96KGUsIiIpOlQoZSl9OlQsVT1zLlR5cGVFcnJvcixEPWZ1bmN0aW9uKGUpe2lmKG51bGw9PWUpdGhyb3cgVSgiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIitlKTtyZXR1cm4gZX0seD1BLFc9RCxGPWZ1bmN0aW9uKGUpe3JldHVybiB4KFcoZSkpfSxNPWZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlfSxMPU0sSj1mdW5jdGlvbihlKXtyZXR1cm4ib2JqZWN0Ij09dChlKT9udWxsIT09ZTpMKGUpfSxqPXMsTj1NLEI9ZnVuY3Rpb24oZSl7cmV0dXJuIE4oZSk/ZTp2b2lkIDB9LFo9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP0IoaltlXSk6altlXSYmaltlXVt0XX0sSD1rKHt9LmlzUHJvdG90eXBlT2YpLEc9WigibmF2aWdhdG9yIiwidXNlckFnZW50Iil8fCIiLFY9cyxYPUcsWT1WLnByb2Nlc3MsSz1WLkRlbm8sJD1ZJiZZLnZlcnNpb25zfHxLJiZLLnZlcnNpb24sUT0kJiYkLnY4O1EmJihnPShiPVEuc3BsaXQoIi4iKSlbMF0+MCYmYlswXTw0PzE6KyhiWzBdK2JbMV0pKSwhZyYmWCYmKCEoYj1YLm1hdGNoKC9FZGdlXC8oXGQrKS8pKXx8YlsxXT49NzQpJiYoYj1YLm1hdGNoKC9DaHJvbWVcLyhcZCspLykpJiYoZz0rYlsxXSk7dmFyIGVlPWcsdGU9ZWUsbmU9dSxvZT0hIU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMmJiFuZSgoZnVuY3Rpb24oKXt2YXIgZT1TeW1ib2woKTtyZXR1cm4hU3RyaW5nKGUpfHwhKE9iamVjdChlKWluc3RhbmNlb2YgU3ltYm9sKXx8IVN5bWJvbC5zaGFtJiZ0ZSYmdGU8NDF9KSkscmU9b2UmJiFTeW1ib2wuc2hhbSYmInN5bWJvbCI9PXQoU3ltYm9sLml0ZXJhdG9yKSxpZT1aLHNlPU0sYWU9SCx1ZT1yZSxjZT1zLk9iamVjdCxsZT11ZT9mdW5jdGlvbihlKXtyZXR1cm4ic3ltYm9sIj09dChlKX06ZnVuY3Rpb24oZSl7dmFyIHQ9aWUoIlN5bWJvbCIpO3JldHVybiBzZSh0KSYmYWUodC5wcm90b3R5cGUsY2UoZSkpfSxkZT1zLlN0cmluZyxmZT1mdW5jdGlvbihlKXt0cnl7cmV0dXJuIGRlKGUpfWNhdGNoKGUpe3JldHVybiJPYmplY3QifX0saGU9TSxwZT1mZSx2ZT1zLlR5cGVFcnJvcixiZT1mdW5jdGlvbihlKXtpZihoZShlKSlyZXR1cm4gZTt0aHJvdyB2ZShwZShlKSsiIGlzIG5vdCBhIGZ1bmN0aW9uIil9LGdlPWJlLG1lPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZVt0XTtyZXR1cm4gbnVsbD09bj92b2lkIDA6Z2Uobil9LHllPWQsX2U9TSx3ZT1KLENlPXMuVHlwZUVycm9yLGtlPXtleHBvcnRzOnt9fSxTZT1zLFJlPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxxZT1mdW5jdGlvbihlLHQpe3RyeXtSZShTZSxlLHt2YWx1ZTp0LGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pfWNhdGNoKG4pe1NlW2VdPXR9cmV0dXJuIHR9LEllPXFlLFBlPSJfX2NvcmUtanNfc2hhcmVkX18iLEVlPXNbUGVdfHxJZShQZSx7fSksT2U9RWU7KGtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gT2VbZV18fChPZVtlXT12b2lkIDAhPT10P3Q6e30pfSkoInZlcnNpb25zIixbXSkucHVzaCh7dmVyc2lvbjoiMy4xOS4xIixtb2RlOiJnbG9iYWwiLGNvcHlyaWdodDoiwqkgMjAyMSBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KSJ9KTt2YXIgVGU9RCx6ZT1zLk9iamVjdCxBZT1mdW5jdGlvbihlKXtyZXR1cm4gemUoVGUoZSkpfSxVZT1BZSxEZT1rKHt9Lmhhc093blByb3BlcnR5KSx4ZT1PYmplY3QuaGFzT3dufHxmdW5jdGlvbihlLHQpe3JldHVybiBEZShVZShlKSx0KX0sV2U9ayxGZT0wLE1lPU1hdGgucmFuZG9tKCksTGU9V2UoMS4udG9TdHJpbmcpLEplPWZ1bmN0aW9uKGUpe3JldHVybiJTeW1ib2woIisodm9pZCAwPT09ZT8iIjplKSsiKV8iK0xlKCsrRmUrTWUsMzYpfSxqZT1zLE5lPWtlLmV4cG9ydHMsQmU9eGUsWmU9SmUsSGU9b2UsR2U9cmUsVmU9TmUoIndrcyIpLFhlPWplLlN5bWJvbCxZZT1YZSYmWGUuZm9yLEtlPUdlP1hlOlhlJiZYZS53aXRob3V0U2V0dGVyfHxaZSwkZT1mdW5jdGlvbihlKXtpZighQmUoVmUsZSl8fCFIZSYmInN0cmluZyIhPXR5cGVvZiBWZVtlXSl7dmFyIHQ9IlN5bWJvbC4iK2U7SGUmJkJlKFhlLGUpP1ZlW2VdPVhlW2VdOlZlW2VdPUdlJiZZZT9ZZSh0KTpLZSh0KX1yZXR1cm4gVmVbZV19LFFlPWQsZXQ9Six0dD1sZSxudD1tZSxvdD1mdW5jdGlvbihlLHQpe3ZhciBuLG87aWYoInN0cmluZyI9PT10JiZfZShuPWUudG9TdHJpbmcpJiYhd2Uobz15ZShuLGUpKSlyZXR1cm4gbztpZihfZShuPWUudmFsdWVPZikmJiF3ZShvPXllKG4sZSkpKXJldHVybiBvO2lmKCJzdHJpbmciIT09dCYmX2Uobj1lLnRvU3RyaW5nKSYmIXdlKG89eWUobixlKSkpcmV0dXJuIG87dGhyb3cgQ2UoIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZSIpfSxydD0kZSxpdD1zLlR5cGVFcnJvcixzdD1ydCgidG9QcmltaXRpdmUiKSxhdD1mdW5jdGlvbihlLHQpe2lmKCFldChlKXx8dHQoZSkpcmV0dXJuIGU7dmFyIG4sbz1udChlLHN0KTtpZihvKXtpZih2b2lkIDA9PT10JiYodD0iZGVmYXVsdCIpLG49UWUobyxlLHQpLCFldChuKXx8dHQobikpcmV0dXJuIG47dGhyb3cgaXQoIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZSIpfXJldHVybiB2b2lkIDA9PT10JiYodD0ibnVtYmVyIiksb3QoZSx0KX0sdXQ9bGUsY3Q9ZnVuY3Rpb24oZSl7dmFyIHQ9YXQoZSwic3RyaW5nIik7cmV0dXJuIHV0KHQpP3Q6dCsiIn0sbHQ9SixkdD1zLmRvY3VtZW50LGZ0PWx0KGR0KSYmbHQoZHQuY3JlYXRlRWxlbWVudCksaHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ0P2R0LmNyZWF0ZUVsZW1lbnQoZSk6e319LHB0PWh0LHZ0PSFjJiYhdSgoZnVuY3Rpb24oKXtyZXR1cm4gNyE9T2JqZWN0LmRlZmluZVByb3BlcnR5KHB0KCJkaXYiKSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pLmF9KSksYnQ9YyxndD1kLG10PWYseXQ9bSxfdD1GLHd0PWN0LEN0PXhlLGt0PXZ0LFN0PU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7YS5mPWJ0P1N0OmZ1bmN0aW9uKGUsdCl7aWYoZT1fdChlKSx0PXd0KHQpLGt0KXRyeXtyZXR1cm4gU3QoZSx0KX1jYXRjaChlKXt9aWYoQ3QoZSx0KSlyZXR1cm4geXQoIWd0KG10LmYsZSx0KSxlW3RdKX07dmFyIFJ0PXt9LHF0PXMsSXQ9SixQdD1xdC5TdHJpbmcsRXQ9cXQuVHlwZUVycm9yLE90PWZ1bmN0aW9uKGUpe2lmKEl0KGUpKXJldHVybiBlO3Rocm93IEV0KFB0KGUpKyIgaXMgbm90IGFuIG9iamVjdCIpfSxUdD1jLHp0PXZ0LEF0PU90LFV0PWN0LER0PXMuVHlwZUVycm9yLHh0PU9iamVjdC5kZWZpbmVQcm9wZXJ0eTtSdC5mPVR0P3h0OmZ1bmN0aW9uKGUsdCxuKXtpZihBdChlKSx0PVV0KHQpLEF0KG4pLHp0KXRyeXtyZXR1cm4geHQoZSx0LG4pfWNhdGNoKGUpe31pZigiZ2V0ImluIG58fCJzZXQiaW4gbil0aHJvdyBEdCgiQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQiKTtyZXR1cm4idmFsdWUiaW4gbiYmKGVbdF09bi52YWx1ZSksZX07dmFyIFd0PVJ0LEZ0PW0sTXQ9Yz9mdW5jdGlvbihlLHQsbil7cmV0dXJuIFd0LmYoZSx0LEZ0KDEsbikpfTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGVbdF09bixlfSxMdD17ZXhwb3J0czp7fX0sSnQ9TSxqdD1FZSxOdD1rKEZ1bmN0aW9uLnRvU3RyaW5nKTtKdChqdC5pbnNwZWN0U291cmNlKXx8KGp0Lmluc3BlY3RTb3VyY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIE50KGUpfSk7dmFyIEJ0LFp0LEh0LEd0PWp0Lmluc3BlY3RTb3VyY2UsVnQ9TSxYdD1HdCxZdD1zLldlYWtNYXAsS3Q9VnQoWXQpJiYvbmF0aXZlIGNvZGUvLnRlc3QoWHQoWXQpKSwkdD1rZS5leHBvcnRzLFF0PUplLGVuPSR0KCJrZXlzIiksdG49ZnVuY3Rpb24oZSl7cmV0dXJuIGVuW2VdfHwoZW5bZV09UXQoZSkpfSxubj17fSxvbj1LdCxybj1zLHNuPWssYW49Six1bj1NdCxjbj14ZSxsbj1FZSxkbj10bixmbj1ubixobj0iT2JqZWN0IGFscmVhZHkgaW5pdGlhbGl6ZWQiLHBuPXJuLlR5cGVFcnJvcix2bj1ybi5XZWFrTWFwO2lmKG9ufHxsbi5zdGF0ZSl7dmFyIGJuPWxuLnN0YXRlfHwobG4uc3RhdGU9bmV3IHZuKSxnbj1zbihibi5nZXQpLG1uPXNuKGJuLmhhcykseW49c24oYm4uc2V0KTtCdD1mdW5jdGlvbihlLHQpe2lmKG1uKGJuLGUpKXRocm93IG5ldyBwbihobik7cmV0dXJuIHQuZmFjYWRlPWUseW4oYm4sZSx0KSx0fSxadD1mdW5jdGlvbihlKXtyZXR1cm4gZ24oYm4sZSl8fHt9fSxIdD1mdW5jdGlvbihlKXtyZXR1cm4gbW4oYm4sZSl9fWVsc2V7dmFyIF9uPWRuKCJzdGF0ZSIpO2ZuW19uXT0hMCxCdD1mdW5jdGlvbihlLHQpe2lmKGNuKGUsX24pKXRocm93IG5ldyBwbihobik7cmV0dXJuIHQuZmFjYWRlPWUsdW4oZSxfbix0KSx0fSxadD1mdW5jdGlvbihlKXtyZXR1cm4gY24oZSxfbik/ZVtfbl06e319LEh0PWZ1bmN0aW9uKGUpe3JldHVybiBjbihlLF9uKX19dmFyIHduPXtzZXQ6QnQsZ2V0Olp0LGhhczpIdCxlbmZvcmNlOmZ1bmN0aW9uKGUpe3JldHVybiBIdChlKT9adChlKTpCdChlLHt9KX0sZ2V0dGVyRm9yOmZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgbjtpZighYW4odCl8fChuPVp0KHQpKS50eXBlIT09ZSl0aHJvdyBwbigiSW5jb21wYXRpYmxlIHJlY2VpdmVyLCAiK2UrIiByZXF1aXJlZCIpO3JldHVybiBufX19LENuPWMsa249eGUsU249RnVuY3Rpb24ucHJvdG90eXBlLFJuPUNuJiZPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLHFuPWtuKFNuLCJuYW1lIiksSW49e0VYSVNUUzpxbixQUk9QRVI6cW4mJiJzb21ldGhpbmciPT09ZnVuY3Rpb24oKXt9Lm5hbWUsQ09ORklHVVJBQkxFOnFuJiYoIUNufHxDbiYmUm4oU24sIm5hbWUiKS5jb25maWd1cmFibGUpfSxQbj1zLEVuPU0sT249eGUsVG49TXQsem49cWUsQW49R3QsVW49SW4uQ09ORklHVVJBQkxFLERuPXduLmdldCx4bj13bi5lbmZvcmNlLFduPVN0cmluZyhTdHJpbmcpLnNwbGl0KCJTdHJpbmciKTsoTHQuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixvKXt2YXIgcixpPSEhbyYmISFvLnVuc2FmZSxzPSEhbyYmISFvLmVudW1lcmFibGUsYT0hIW8mJiEhby5ub1RhcmdldEdldCx1PW8mJnZvaWQgMCE9PW8ubmFtZT9vLm5hbWU6dDtFbihuKSYmKCJTeW1ib2woIj09PVN0cmluZyh1KS5zbGljZSgwLDcpJiYodT0iWyIrU3RyaW5nKHUpLnJlcGxhY2UoL15TeW1ib2xcKChbXildKilcKS8sIiQxIikrIl0iKSwoIU9uKG4sIm5hbWUiKXx8VW4mJm4ubmFtZSE9PXUpJiZUbihuLCJuYW1lIix1KSwocj14bihuKSkuc291cmNlfHwoci5zb3VyY2U9V24uam9pbigic3RyaW5nIj09dHlwZW9mIHU/dToiIikpKSxlIT09UG4/KGk/IWEmJmVbdF0mJihzPSEwKTpkZWxldGUgZVt0XSxzP2VbdF09bjpUbihlLHQsbikpOnM/ZVt0XT1uOnpuKHQsbil9KShGdW5jdGlvbi5wcm90b3R5cGUsInRvU3RyaW5nIiwoZnVuY3Rpb24oKXtyZXR1cm4gRW4odGhpcykmJkRuKHRoaXMpLnNvdXJjZXx8QW4odGhpcyl9KSk7dmFyIEZuPXt9LE1uPU1hdGguY2VpbCxMbj1NYXRoLmZsb29yLEpuPWZ1bmN0aW9uKGUpe3ZhciB0PStlO3JldHVybiB0IT10fHwwPT09dD8wOih0PjA/TG46TW4pKHQpfSxqbj1KbixObj1NYXRoLm1heCxCbj1NYXRoLm1pbixabj1KbixIbj1NYXRoLm1pbixHbj1mdW5jdGlvbihlKXtyZXR1cm4gZT4wP0huKFpuKGUpLDkwMDcxOTkyNTQ3NDA5OTEpOjB9LFZuPWZ1bmN0aW9uKGUpe3JldHVybiBHbihlLmxlbmd0aCl9LFhuPUYsWW49ZnVuY3Rpb24oZSx0KXt2YXIgbj1qbihlKTtyZXR1cm4gbjwwP05uKG4rdCwwKTpCbihuLHQpfSxLbj1Wbiwkbj1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCxuLG8pe3ZhciByLGk9WG4odCkscz1LbihpKSxhPVluKG8scyk7aWYoZSYmbiE9bil7Zm9yKDtzPmE7KWlmKChyPWlbYSsrXSkhPXIpcmV0dXJuITB9ZWxzZSBmb3IoO3M+YTthKyspaWYoKGV8fGEgaW4gaSkmJmlbYV09PT1uKXJldHVybiBlfHxhfHwwO3JldHVybiFlJiYtMX19LFFuPXtpbmNsdWRlczokbighMCksaW5kZXhPZjokbighMSl9LGVvPXhlLHRvPUYsbm89UW4uaW5kZXhPZixvbz1ubixybz1rKFtdLnB1c2gpLGlvPWZ1bmN0aW9uKGUsdCl7dmFyIG4sbz10byhlKSxyPTAsaT1bXTtmb3IobiBpbiBvKSFlbyhvbyxuKSYmZW8obyxuKSYmcm8oaSxuKTtmb3IoO3QubGVuZ3RoPnI7KWVvKG8sbj10W3IrK10pJiYofm5vKGksbil8fHJvKGksbikpO3JldHVybiBpfSxzbz1bImNvbnN0cnVjdG9yIiwiaGFzT3duUHJvcGVydHkiLCJpc1Byb3RvdHlwZU9mIiwicHJvcGVydHlJc0VudW1lcmFibGUiLCJ0b0xvY2FsZVN0cmluZyIsInRvU3RyaW5nIiwidmFsdWVPZiJdLGFvPWlvLHVvPXNvLmNvbmNhdCgibGVuZ3RoIiwicHJvdG90eXBlIik7Rm4uZj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc3x8ZnVuY3Rpb24oZSl7cmV0dXJuIGFvKGUsdW8pfTt2YXIgY289e307Y28uZj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO3ZhciBsbz1aLGZvPUZuLGhvPWNvLHBvPU90LHZvPWsoW10uY29uY2F0KSxibz1sbygiUmVmbGVjdCIsIm93bktleXMiKXx8ZnVuY3Rpb24oZSl7dmFyIHQ9Zm8uZihwbyhlKSksbj1oby5mO3JldHVybiBuP3ZvKHQsbihlKSk6dH0sZ289eGUsbW89Ym8seW89YSxfbz1SdCx3bz1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1tbyh0KSxvPV9vLmYscj15by5mLGk9MDtpPG4ubGVuZ3RoO2krKyl7dmFyIHM9bltpXTtnbyhlLHMpfHxvKGUscyxyKHQscykpfX0sQ289dSxrbz1NLFNvPS8jfFwucHJvdG90eXBlXC4vLFJvPWZ1bmN0aW9uKGUsdCl7dmFyIG49SW9bcW8oZSldO3JldHVybiBuPT1Fb3x8biE9UG8mJihrbyh0KT9Dbyh0KTohIXQpfSxxbz1Sby5ub3JtYWxpemU9ZnVuY3Rpb24oZSl7cmV0dXJuIFN0cmluZyhlKS5yZXBsYWNlKFNvLCIuIikudG9Mb3dlckNhc2UoKX0sSW89Um8uZGF0YT17fSxQbz1Sby5OQVRJVkU9Ik4iLEVvPVJvLlBPTFlGSUxMPSJQIixPbz1SbyxUbz1zLHpvPWEuZixBbz1NdCxVbz1MdC5leHBvcnRzLERvPXFlLHhvPXdvLFdvPU9vLEZvPWZ1bmN0aW9uKGUsbil7dmFyIG8scixpLHMsYSx1PWUudGFyZ2V0LGM9ZS5nbG9iYWwsbD1lLnN0YXQ7aWYobz1jP1RvOmw/VG9bdV18fERvKHUse30pOihUb1t1XXx8e30pLnByb3RvdHlwZSlmb3IociBpbiBuKXtpZihzPW5bcl0saT1lLm5vVGFyZ2V0R2V0PyhhPXpvKG8scikpJiZhLnZhbHVlOm9bcl0sIVdvKGM/cjp1KyhsPyIuIjoiIyIpK3IsZS5mb3JjZWQpJiZ2b2lkIDAhPT1pKXtpZih0KHMpPT10KGkpKWNvbnRpbnVlO3hvKHMsaSl9KGUuc2hhbXx8aSYmaS5zaGFtKSYmQW8ocywic2hhbSIsITApLFVvKG8scixzLGUpfX0sTW89aW8sTG89c28sSm89T2JqZWN0LmtleXN8fGZ1bmN0aW9uKGUpe3JldHVybiBNbyhlLExvKX0sam89YyxObz1rLEJvPWQsWm89dSxIbz1KbyxHbz1jbyxWbz1mLFhvPUFlLFlvPUEsS289T2JqZWN0LmFzc2lnbiwkbz1PYmplY3QuZGVmaW5lUHJvcGVydHksUW89Tm8oW10uY29uY2F0KSxlcj0hS298fFpvKChmdW5jdGlvbigpe2lmKGpvJiYxIT09S28oe2I6MX0sS28oJG8oe30sImEiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpeyRvKHRoaXMsImIiLHt2YWx1ZTozLGVudW1lcmFibGU6ITF9KX19KSx7YjoyfSkpLmIpcmV0dXJuITA7dmFyIGU9e30sdD17fSxuPVN5bWJvbCgpLG89ImFiY2RlZmdoaWprbG1ub3BxcnN0IjtyZXR1cm4gZVtuXT03LG8uc3BsaXQoIiIpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3RbZV09ZX0pKSw3IT1Lbyh7fSxlKVtuXXx8SG8oS28oe30sdCkpLmpvaW4oIiIpIT1vfSkpP2Z1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPVhvKGUpLG89YXJndW1lbnRzLmxlbmd0aCxyPTEsaT1Hby5mLHM9Vm8uZjtvPnI7KWZvcih2YXIgYSx1PVlvKGFyZ3VtZW50c1tyKytdKSxjPWk/UW8oSG8odSksaSh1KSk6SG8odSksbD1jLmxlbmd0aCxkPTA7bD5kOylhPWNbZCsrXSxqbyYmIUJvKHMsdSxhKXx8KG5bYV09dVthXSk7cmV0dXJuIG59OktvLHRyPWVyO0ZvKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6T2JqZWN0LmFzc2lnbiE9PXRyfSx7YXNzaWduOnRyfSk7dmFyIG5yPXM7bnIuT2JqZWN0LmFzc2lnbjt2YXIgb3IscnI9IXUoKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe31yZXR1cm4gZS5wcm90b3R5cGUuY29uc3RydWN0b3I9bnVsbCxPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3IGUpIT09ZS5wcm90b3R5cGV9KSksaXI9cyxzcj14ZSxhcj1NLHVyPUFlLGNyPXJyLGxyPXRuKCJJRV9QUk9UTyIpLGRyPWlyLk9iamVjdCxmcj1kci5wcm90b3R5cGUsaHI9Y3I/ZHIuZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24oZSl7dmFyIHQ9dXIoZSk7aWYoc3IodCxscikpcmV0dXJuIHRbbHJdO3ZhciBuPXQuY29uc3RydWN0b3I7cmV0dXJuIGFyKG4pJiZ0IGluc3RhbmNlb2Ygbj9uLnByb3RvdHlwZTp0IGluc3RhbmNlb2YgZHI/ZnI6bnVsbH0scHI9cyx2cj1NLGJyPXByLlN0cmluZyxncj1wci5UeXBlRXJyb3IsbXI9ayx5cj1PdCxfcj1mdW5jdGlvbihlKXtpZigib2JqZWN0Ij09dChlKXx8dnIoZSkpcmV0dXJuIGU7dGhyb3cgZ3IoIkNhbid0IHNldCAiK2JyKGUpKyIgYXMgYSBwcm90b3R5cGUiKX0sd3I9T2JqZWN0LnNldFByb3RvdHlwZU9mfHwoIl9fcHJvdG9fXyJpbnt9P2Z1bmN0aW9uKCl7dmFyIGUsdD0hMSxuPXt9O3RyeXsoZT1tcihPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5wcm90b3R5cGUsIl9fcHJvdG9fXyIpLnNldCkpKG4sW10pLHQ9biBpbnN0YW5jZW9mIEFycmF5fWNhdGNoKGUpe31yZXR1cm4gZnVuY3Rpb24obixvKXtyZXR1cm4geXIobiksX3IobyksdD9lKG4sbyk6bi5fX3Byb3RvX189byxufX0oKTp2b2lkIDApLENyPVJ0LGtyPU90LFNyPUYsUnI9Sm8scXI9Yz9PYmplY3QuZGVmaW5lUHJvcGVydGllczpmdW5jdGlvbihlLHQpe2tyKGUpO2Zvcih2YXIgbixvPVNyKHQpLHI9UnIodCksaT1yLmxlbmd0aCxzPTA7aT5zOylDci5mKGUsbj1yW3MrK10sb1tuXSk7cmV0dXJuIGV9LElyPVooImRvY3VtZW50IiwiZG9jdW1lbnRFbGVtZW50IiksUHI9T3QsRXI9cXIsT3I9c28sVHI9bm4senI9SXIsQXI9aHQsVXI9dG4oIklFX1BST1RPIiksRHI9ZnVuY3Rpb24oKXt9LHhyPWZ1bmN0aW9uKGUpe3JldHVybiI8c2NyaXB0PiIrZSsiPC8iKyJzY3JpcHQ+In0sV3I9ZnVuY3Rpb24oZSl7ZS53cml0ZSh4cigiIikpLGUuY2xvc2UoKTt2YXIgdD1lLnBhcmVudFdpbmRvdy5PYmplY3Q7cmV0dXJuIGU9bnVsbCx0fSxGcj1mdW5jdGlvbigpe3RyeXtvcj1uZXcgQWN0aXZlWE9iamVjdCgiaHRtbGZpbGUiKX1jYXRjaChlKXt9dmFyIGUsdDtGcj0idW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50P2RvY3VtZW50LmRvbWFpbiYmb3I/V3Iob3IpOigodD1BcigiaWZyYW1lIikpLnN0eWxlLmRpc3BsYXk9Im5vbmUiLHpyLmFwcGVuZENoaWxkKHQpLHQuc3JjPVN0cmluZygiamF2YXNjcmlwdDoiKSwoZT10LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQpLm9wZW4oKSxlLndyaXRlKHhyKCJkb2N1bWVudC5GPU9iamVjdCIpKSxlLmNsb3NlKCksZS5GKTpXcihvcik7Zm9yKHZhciBuPU9yLmxlbmd0aDtuLS07KWRlbGV0ZSBGci5wcm90b3R5cGVbT3Jbbl1dO3JldHVybiBGcigpfTtUcltVcl09ITA7dmFyIE1yPU9iamVjdC5jcmVhdGV8fGZ1bmN0aW9uKGUsdCl7dmFyIG47cmV0dXJuIG51bGwhPT1lPyhEci5wcm90b3R5cGU9UHIoZSksbj1uZXcgRHIsRHIucHJvdG90eXBlPW51bGwsbltVcl09ZSk6bj1GcigpLHZvaWQgMD09PXQ/bjpFcihuLHQpfSxMcj1rKFtdLnNsaWNlKSxKcj1rLGpyPUxyLE5yPUpyKCIiLnJlcGxhY2UpLEJyPUpyKCIiLnNwbGl0KSxacj1KcihbXS5qb2luKSxIcj1TdHJpbmcoRXJyb3IoInp4Y2FzZCIpLnN0YWNrKSxHcj0vXG5ccyphdCBbXjpdKjpbXlxuXSovLFZyPUdyLnRlc3QoSHIpLFhyPS9AW15cbl0qXG4vLnRlc3QoSHIpJiYhL3p4Y2FzZC8udGVzdChIciksWXI9SixLcj1NdCwkcj1iZSxRcj1rKGsuYmluZCksZWk9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gJHIoZSksdm9pZCAwPT09dD9lOlFyP1FyKGUsdCk6ZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseSh0LGFyZ3VtZW50cyl9fSx0aT17fSxuaT10aSxvaT0kZSgiaXRlcmF0b3IiKSxyaT1BcnJheS5wcm90b3R5cGUsaWk9e307aWlbJGUoInRvU3RyaW5nVGFnIildPSJ6Ijt2YXIgc2k9IltvYmplY3Qgel0iPT09U3RyaW5nKGlpKSxhaT1zLHVpPXNpLGNpPU0sbGk9SSxkaT0kZSgidG9TdHJpbmdUYWciKSxmaT1haS5PYmplY3QsaGk9IkFyZ3VtZW50cyI9PWxpKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSkscGk9dWk/bGk6ZnVuY3Rpb24oZSl7dmFyIHQsbixvO3JldHVybiB2b2lkIDA9PT1lPyJVbmRlZmluZWQiOm51bGw9PT1lPyJOdWxsIjoic3RyaW5nIj09dHlwZW9mKG49ZnVuY3Rpb24oZSx0KXt0cnl7cmV0dXJuIGVbdF19Y2F0Y2goZSl7fX0odD1maShlKSxkaSkpP246aGk/bGkodCk6Ik9iamVjdCI9PShvPWxpKHQpKSYmY2kodC5jYWxsZWUpPyJBcmd1bWVudHMiOm99LHZpPXBpLGJpPW1lLGdpPXRpLG1pPSRlKCJpdGVyYXRvciIpLHlpPWZ1bmN0aW9uKGUpe2lmKG51bGwhPWUpcmV0dXJuIGJpKGUsbWkpfHxiaShlLCJAQGl0ZXJhdG9yIil8fGdpW3ZpKGUpXX0sX2k9ZCx3aT1iZSxDaT1PdCxraT1mZSxTaT15aSxSaT1zLlR5cGVFcnJvcixxaT1kLElpPU90LFBpPW1lLEVpPWVpLE9pPWQsVGk9T3Qsemk9ZmUsQWk9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMCE9PWUmJihuaS5BcnJheT09PWV8fHJpW29pXT09PWUpfSxVaT1WbixEaT1ILHhpPWZ1bmN0aW9uKGUsdCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aDwyP1NpKGUpOnQ7aWYod2kobikpcmV0dXJuIENpKF9pKG4sZSkpO3Rocm93IFJpKGtpKGUpKyIgaXMgbm90IGl0ZXJhYmxlIil9LFdpPXlpLEZpPWZ1bmN0aW9uKGUsdCxuKXt2YXIgbyxyO0lpKGUpO3RyeXtpZighKG89UGkoZSwicmV0dXJuIikpKXtpZigidGhyb3ciPT09dCl0aHJvdyBuO3JldHVybiBufW89cWkobyxlKX1jYXRjaChlKXtyPSEwLG89ZX1pZigidGhyb3ciPT09dCl0aHJvdyBuO2lmKHIpdGhyb3cgbztyZXR1cm4gSWkobyksbn0sTWk9cy5UeXBlRXJyb3IsTGk9ZnVuY3Rpb24oZSx0KXt0aGlzLnN0b3BwZWQ9ZSx0aGlzLnJlc3VsdD10fSxKaT1MaS5wcm90b3R5cGUsamk9ZnVuY3Rpb24oZSxuLG8pe3ZhciByLGkscyxhLHUsYyxsLGQ9byYmby50aGF0LGY9ISghb3x8IW8uQVNfRU5UUklFUyksaD0hKCFvfHwhby5JU19JVEVSQVRPUikscD0hKCFvfHwhby5JTlRFUlJVUFRFRCksdj1FaShuLGQpLGI9ZnVuY3Rpb24oZSl7cmV0dXJuIHImJkZpKHIsIm5vcm1hbCIsZSksbmV3IExpKCEwLGUpfSxnPWZ1bmN0aW9uKGUpe3JldHVybiBmPyhUaShlKSxwP3YoZVswXSxlWzFdLGIpOnYoZVswXSxlWzFdKSk6cD92KGUsYik6dihlKX07aWYoaClyPWU7ZWxzZXtpZighKGk9V2koZSkpKXRocm93IE1pKHppKGUpKyIgaXMgbm90IGl0ZXJhYmxlIik7aWYoQWkoaSkpe2ZvcihzPTAsYT1VaShlKTthPnM7cysrKWlmKCh1PWcoZVtzXSkpJiZEaShKaSx1KSlyZXR1cm4gdTtyZXR1cm4gbmV3IExpKCExKX1yPXhpKGUsaSl9Zm9yKGM9ci5uZXh0OyEobD1PaShjLHIpKS5kb25lOyl7dHJ5e3U9ZyhsLnZhbHVlKX1jYXRjaChlKXtGaShyLCJ0aHJvdyIsZSl9aWYoIm9iamVjdCI9PXQodSkmJnUmJkRpKEppLHUpKXJldHVybiB1fXJldHVybiBuZXcgTGkoITEpfSxOaT1waSxCaT1zLlN0cmluZyxaaT1mdW5jdGlvbihlKXtpZigiU3ltYm9sIj09PU5pKGUpKXRocm93IFR5cGVFcnJvcigiQ2Fubm90IGNvbnZlcnQgYSBTeW1ib2wgdmFsdWUgdG8gYSBzdHJpbmciKTtyZXR1cm4gQmkoZSl9LEhpPVppLEdpPW0sVmk9IXUoKGZ1bmN0aW9uKCl7dmFyIGU9RXJyb3IoImEiKTtyZXR1cm4hKCJzdGFjayJpbiBlKXx8KE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJzdGFjayIsR2koMSw3KSksNyE9PWUuc3RhY2spfSkpLFhpPUZvLFlpPXMsS2k9SCwkaT1ocixRaT13cixlcz13byx0cz1Ncixucz1NdCxvcz1tLHJzPWZ1bmN0aW9uKGUsdCl7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiBlO2lmKFZyKWZvcig7dC0tOyllPU5yKGUsR3IsIiIpO2Vsc2UgaWYoWHIpcmV0dXJuIFpyKGpyKEJyKGUsIlxuIiksdCksIlxuIik7cmV0dXJuIGV9LGlzPWZ1bmN0aW9uKGUsdCl7WXIodCkmJiJjYXVzZSJpbiB0JiZLcihlLCJjYXVzZSIsdC5jYXVzZSl9LHNzPWppLGFzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PWU/YXJndW1lbnRzLmxlbmd0aDwyPyIiOnQ6SGkoZSl9LHVzPVZpLGNzPSRlKCJ0b1N0cmluZ1RhZyIpLGxzPVlpLkVycm9yLGRzPVtdLnB1c2gsZnM9ZnVuY3Rpb24oZSx0KXt2YXIgbixvPWFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06dm9pZCAwLHI9S2koaHMsdGhpcyk7UWk/bj1RaShuZXcgbHModm9pZCAwKSxyPyRpKHRoaXMpOmhzKToobj1yP3RoaXM6dHMoaHMpLG5zKG4sY3MsIkVycm9yIikpLG5zKG4sIm1lc3NhZ2UiLGFzKHQsIiIpKSx1cyYmbnMobiwic3RhY2siLHJzKG4uc3RhY2ssMSkpLGlzKG4sbyk7dmFyIGk9W107cmV0dXJuIHNzKGUsZHMse3RoYXQ6aX0pLG5zKG4sImVycm9ycyIsaSksbn07UWk/UWkoZnMsbHMpOmVzKGZzLGxzKTt2YXIgaHM9ZnMucHJvdG90eXBlPXRzKGxzLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6b3MoMSxmcyksbWVzc2FnZTpvcygxLCIiKSxuYW1lOm9zKDEsIkFnZ3JlZ2F0ZUVycm9yIil9KTtYaSh7Z2xvYmFsOiEwfSx7QWdncmVnYXRlRXJyb3I6ZnN9KTt2YXIgcHM9TXIsdnM9UnQsYnM9JGUoInVuc2NvcGFibGVzIiksZ3M9QXJyYXkucHJvdG90eXBlO251bGw9PWdzW2JzXSYmdnMuZihncyxicyx7Y29uZmlndXJhYmxlOiEwLHZhbHVlOnBzKG51bGwpfSk7dmFyIG1zLHlzLF9zLHdzPXUsQ3M9TSxrcz1ocixTcz1MdC5leHBvcnRzLFJzPSRlKCJpdGVyYXRvciIpLHFzPSExO1tdLmtleXMmJigibmV4dCJpbihfcz1bXS5rZXlzKCkpPyh5cz1rcyhrcyhfcykpKSE9PU9iamVjdC5wcm90b3R5cGUmJihtcz15cyk6cXM9ITApO3ZhciBJcz1udWxsPT1tc3x8d3MoKGZ1bmN0aW9uKCl7dmFyIGU9e307cmV0dXJuIG1zW1JzXS5jYWxsKGUpIT09ZX0pKTtJcyYmKG1zPXt9KSxDcyhtc1tSc10pfHxTcyhtcyxScywoZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pKTt2YXIgUHM9e0l0ZXJhdG9yUHJvdG90eXBlOm1zLEJVR0dZX1NBRkFSSV9JVEVSQVRPUlM6cXN9LEVzPVJ0LmYsT3M9eGUsVHM9JGUoInRvU3RyaW5nVGFnIiksenM9ZnVuY3Rpb24oZSx0LG4pe2UmJiFPcyhlPW4/ZTplLnByb3RvdHlwZSxUcykmJkVzKGUsVHMse2NvbmZpZ3VyYWJsZTohMCx2YWx1ZTp0fSl9LEFzPVBzLkl0ZXJhdG9yUHJvdG90eXBlLFVzPU1yLERzPW0seHM9enMsV3M9dGksRnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sTXM9Rm8sTHM9ZCxKcz1Jbixqcz1NLE5zPWZ1bmN0aW9uKGUsdCxuKXt2YXIgbz10KyIgSXRlcmF0b3IiO3JldHVybiBlLnByb3RvdHlwZT1VcyhBcyx7bmV4dDpEcygxLG4pfSkseHMoZSxvLCExKSxXc1tvXT1GcyxlfSxCcz1ocixacz13cixIcz16cyxHcz1NdCxWcz1MdC5leHBvcnRzLFhzPXRpLFlzPUpzLlBST1BFUixLcz1Kcy5DT05GSUdVUkFCTEUsJHM9UHMuSXRlcmF0b3JQcm90b3R5cGUsUXM9UHMuQlVHR1lfU0FGQVJJX0lURVJBVE9SUyxlYT0kZSgiaXRlcmF0b3IiKSx0YT0ia2V5cyIsbmE9InZhbHVlcyIsb2E9ImVudHJpZXMiLHJhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGlhPWZ1bmN0aW9uKGUsdCxuLG8scixpLHMpe05zKG4sdCxvKTt2YXIgYSx1LGMsbD1mdW5jdGlvbihlKXtpZihlPT09ciYmdilyZXR1cm4gdjtpZighUXMmJmUgaW4gaClyZXR1cm4gaFtlXTtzd2l0Y2goZSl7Y2FzZSB0YTpjYXNlIG5hOmNhc2Ugb2E6cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMsZSl9fXJldHVybiBmdW5jdGlvbigpe3JldHVybiBuZXcgbih0aGlzKX19LGQ9dCsiIEl0ZXJhdG9yIixmPSExLGg9ZS5wcm90b3R5cGUscD1oW2VhXXx8aFsiQEBpdGVyYXRvciJdfHxyJiZoW3JdLHY9IVFzJiZwfHxsKHIpLGI9IkFycmF5Ij09dCYmaC5lbnRyaWVzfHxwO2lmKGImJihhPUJzKGIuY2FsbChuZXcgZSkpKSE9PU9iamVjdC5wcm90b3R5cGUmJmEubmV4dCYmKEJzKGEpIT09JHMmJihacz9acyhhLCRzKTpqcyhhW2VhXSl8fFZzKGEsZWEscmEpKSxIcyhhLGQsITApKSxZcyYmcj09bmEmJnAmJnAubmFtZSE9PW5hJiYoS3M/R3MoaCwibmFtZSIsbmEpOihmPSEwLHY9ZnVuY3Rpb24oKXtyZXR1cm4gTHMocCx0aGlzKX0pKSxyKWlmKHU9e3ZhbHVlczpsKG5hKSxrZXlzOmk/djpsKHRhKSxlbnRyaWVzOmwob2EpfSxzKWZvcihjIGluIHUpKFFzfHxmfHwhKGMgaW4gaCkpJiZWcyhoLGMsdVtjXSk7ZWxzZSBNcyh7dGFyZ2V0OnQscHJvdG86ITAsZm9yY2VkOlFzfHxmfSx1KTtyZXR1cm4gaFtlYV0hPT12JiZWcyhoLGVhLHYse25hbWU6cn0pLFhzW3RdPXYsdX0sc2E9RixhYT1mdW5jdGlvbihlKXtnc1tic11bZV09ITB9LHVhPXRpLGNhPXduLGxhPWlhLGRhPSJBcnJheSBJdGVyYXRvciIsZmE9Y2Euc2V0LGhhPWNhLmdldHRlckZvcihkYSkscGE9bGEoQXJyYXksIkFycmF5IiwoZnVuY3Rpb24oZSx0KXtmYSh0aGlzLHt0eXBlOmRhLHRhcmdldDpzYShlKSxpbmRleDowLGtpbmQ6dH0pfSksKGZ1bmN0aW9uKCl7dmFyIGU9aGEodGhpcyksdD1lLnRhcmdldCxuPWUua2luZCxvPWUuaW5kZXgrKztyZXR1cm4hdHx8bz49dC5sZW5ndGg/KGUudGFyZ2V0PXZvaWQgMCx7dmFsdWU6dm9pZCAwLGRvbmU6ITB9KToia2V5cyI9PW4/e3ZhbHVlOm8sZG9uZTohMX06InZhbHVlcyI9PW4/e3ZhbHVlOnRbb10sZG9uZTohMX06e3ZhbHVlOltvLHRbb11dLGRvbmU6ITF9fSksInZhbHVlcyIpO3VhLkFyZ3VtZW50cz11YS5BcnJheSxhYSgia2V5cyIpLGFhKCJ2YWx1ZXMiKSxhYSgiZW50cmllcyIpO3ZhciB2YT1waSxiYT1zaT97fS50b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiJbb2JqZWN0ICIrdmEodGhpcykrIl0ifSxnYT1zaSxtYT1MdC5leHBvcnRzLHlhPWJhO2dhfHxtYShPYmplY3QucHJvdG90eXBlLCJ0b1N0cmluZyIseWEse3Vuc2FmZTohMH0pO3ZhciBfYT1zLlByb21pc2Usd2E9THQuZXhwb3J0cyxDYT1aLGthPVJ0LFNhPWMsUmE9JGUoInNwZWNpZXMiKSxxYT1ILElhPXMuVHlwZUVycm9yLFBhPSRlKCJpdGVyYXRvciIpLEVhPSExO3RyeXt2YXIgT2E9MCxUYT17bmV4dDpmdW5jdGlvbigpe3JldHVybntkb25lOiEhT2ErK319LHJldHVybjpmdW5jdGlvbigpe0VhPSEwfX07VGFbUGFdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LEFycmF5LmZyb20oVGEsKGZ1bmN0aW9uKCl7dGhyb3cgMn0pKX1jYXRjaChlKXt9dmFyIHphLEFhLFVhLERhLHhhPWssV2E9dSxGYT1NLE1hPXBpLExhPUd0LEphPWZ1bmN0aW9uKCl7fSxqYT1bXSxOYT1aKCJSZWZsZWN0IiwiY29uc3RydWN0IiksQmE9L15ccyooPzpjbGFzc3xmdW5jdGlvbilcYi8sWmE9eGEoQmEuZXhlYyksSGE9IUJhLmV4ZWMoSmEpLEdhPWZ1bmN0aW9uKGUpe2lmKCFGYShlKSlyZXR1cm4hMTt0cnl7cmV0dXJuIE5hKEphLGphLGUpLCEwfWNhdGNoKGUpe3JldHVybiExfX0sVmE9IU5hfHxXYSgoZnVuY3Rpb24oKXt2YXIgZTtyZXR1cm4gR2EoR2EuY2FsbCl8fCFHYShPYmplY3QpfHwhR2EoKGZ1bmN0aW9uKCl7ZT0hMH0pKXx8ZX0pKT9mdW5jdGlvbihlKXtpZighRmEoZSkpcmV0dXJuITE7c3dpdGNoKE1hKGUpKXtjYXNlIkFzeW5jRnVuY3Rpb24iOmNhc2UiR2VuZXJhdG9yRnVuY3Rpb24iOmNhc2UiQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiI6cmV0dXJuITF9cmV0dXJuIEhhfHwhIVphKEJhLExhKGUpKX06R2EsWGE9VmEsWWE9ZmUsS2E9cy5UeXBlRXJyb3IsJGE9T3QsUWE9ZnVuY3Rpb24oZSl7aWYoWGEoZSkpcmV0dXJuIGU7dGhyb3cgS2EoWWEoZSkrIiBpcyBub3QgYSBjb25zdHJ1Y3RvciIpfSxldT0kZSgic3BlY2llcyIpLHR1PWZ1bmN0aW9uKGUsdCl7dmFyIG4sbz0kYShlKS5jb25zdHJ1Y3RvcjtyZXR1cm4gdm9pZCAwPT09b3x8bnVsbD09KG49JGEobylbZXVdKT90OlFhKG4pfSxudT1GdW5jdGlvbi5wcm90b3R5cGUsb3U9bnUuYXBwbHkscnU9bnUuYmluZCxpdT1udS5jYWxsLHN1PSJvYmplY3QiPT0oInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0PyJ1bmRlZmluZWQiOnQoUmVmbGVjdCkpJiZSZWZsZWN0LmFwcGx5fHwocnU/aXUuYmluZChvdSk6ZnVuY3Rpb24oKXtyZXR1cm4gaXUuYXBwbHkob3UsYXJndW1lbnRzKX0pLGF1PS8oPzppcGFkfGlwaG9uZXxpcG9kKS4qYXBwbGV3ZWJraXQvaS50ZXN0KEcpLHV1PSJwcm9jZXNzIj09SShzLnByb2Nlc3MpLGN1PXMsbHU9c3UsZHU9ZWksZnU9TSxodT14ZSxwdT11LHZ1PUlyLGJ1PUxyLGd1PWh0LG11PWF1LHl1PXV1LF91PWN1LnNldEltbWVkaWF0ZSx3dT1jdS5jbGVhckltbWVkaWF0ZSxDdT1jdS5wcm9jZXNzLGt1PWN1LkRpc3BhdGNoLFN1PWN1LkZ1bmN0aW9uLFJ1PWN1Lk1lc3NhZ2VDaGFubmVsLHF1PWN1LlN0cmluZyxJdT0wLFB1PXt9LEV1PSJvbnJlYWR5c3RhdGVjaGFuZ2UiO3RyeXt6YT1jdS5sb2NhdGlvbn1jYXRjaChlKXt9dmFyIE91PWZ1bmN0aW9uKGUpe2lmKGh1KFB1LGUpKXt2YXIgdD1QdVtlXTtkZWxldGUgUHVbZV0sdCgpfX0sVHU9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7T3UoZSl9fSx6dT1mdW5jdGlvbihlKXtPdShlLmRhdGEpfSxBdT1mdW5jdGlvbihlKXtjdS5wb3N0TWVzc2FnZShxdShlKSx6YS5wcm90b2NvbCsiLy8iK3phLmhvc3QpfTtfdSYmd3V8fChfdT1mdW5jdGlvbihlKXt2YXIgdD1idShhcmd1bWVudHMsMSk7cmV0dXJuIFB1WysrSXVdPWZ1bmN0aW9uKCl7bHUoZnUoZSk/ZTpTdShlKSx2b2lkIDAsdCl9LEFhKEl1KSxJdX0sd3U9ZnVuY3Rpb24oZSl7ZGVsZXRlIFB1W2VdfSx5dT9BYT1mdW5jdGlvbihlKXtDdS5uZXh0VGljayhUdShlKSl9Omt1JiZrdS5ub3c/QWE9ZnVuY3Rpb24oZSl7a3Uubm93KFR1KGUpKX06UnUmJiFtdT8oRGE9KFVhPW5ldyBSdSkucG9ydDIsVWEucG9ydDEub25tZXNzYWdlPXp1LEFhPWR1KERhLnBvc3RNZXNzYWdlLERhKSk6Y3UuYWRkRXZlbnRMaXN0ZW5lciYmZnUoY3UucG9zdE1lc3NhZ2UpJiYhY3UuaW1wb3J0U2NyaXB0cyYmemEmJiJmaWxlOiIhPT16YS5wcm90b2NvbCYmIXB1KEF1KT8oQWE9QXUsY3UuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsenUsITEpKTpBYT1FdSBpbiBndSgic2NyaXB0Iik/ZnVuY3Rpb24oZSl7dnUuYXBwZW5kQ2hpbGQoZ3UoInNjcmlwdCIpKS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXt2dS5yZW1vdmVDaGlsZCh0aGlzKSxPdShlKX19OmZ1bmN0aW9uKGUpe3NldFRpbWVvdXQoVHUoZSksMCl9KTt2YXIgVXUsRHUseHUsV3UsRnUsTXUsTHUsSnUsanU9e3NldDpfdSxjbGVhcjp3dX0sTnU9cyxCdT0vaXBhZHxpcGhvbmV8aXBvZC9pLnRlc3QoRykmJnZvaWQgMCE9PU51LlBlYmJsZSxadT0vd2ViMHMoPyEuKmNocm9tZSkvaS50ZXN0KEcpLEh1PXMsR3U9ZWksVnU9YS5mLFh1PWp1LnNldCxZdT1hdSxLdT1CdSwkdT1adSxRdT11dSxlYz1IdS5NdXRhdGlvbk9ic2VydmVyfHxIdS5XZWJLaXRNdXRhdGlvbk9ic2VydmVyLHRjPUh1LmRvY3VtZW50LG5jPUh1LnByb2Nlc3Msb2M9SHUuUHJvbWlzZSxyYz1WdShIdSwicXVldWVNaWNyb3Rhc2siKSxpYz1yYyYmcmMudmFsdWU7aWN8fChVdT1mdW5jdGlvbigpe3ZhciBlLHQ7Zm9yKFF1JiYoZT1uYy5kb21haW4pJiZlLmV4aXQoKTtEdTspe3Q9RHUuZm4sRHU9RHUubmV4dDt0cnl7dCgpfWNhdGNoKGUpe3Rocm93IER1P1d1KCk6eHU9dm9pZCAwLGV9fXh1PXZvaWQgMCxlJiZlLmVudGVyKCl9LFl1fHxRdXx8JHV8fCFlY3x8IXRjPyFLdSYmb2MmJm9jLnJlc29sdmU/KChMdT1vYy5yZXNvbHZlKHZvaWQgMCkpLmNvbnN0cnVjdG9yPW9jLEp1PUd1KEx1LnRoZW4sTHUpLFd1PWZ1bmN0aW9uKCl7SnUoVXUpfSk6UXU/V3U9ZnVuY3Rpb24oKXtuYy5uZXh0VGljayhVdSl9OihYdT1HdShYdSxIdSksV3U9ZnVuY3Rpb24oKXtYdShVdSl9KTooRnU9ITAsTXU9dGMuY3JlYXRlVGV4dE5vZGUoIiIpLG5ldyBlYyhVdSkub2JzZXJ2ZShNdSx7Y2hhcmFjdGVyRGF0YTohMH0pLFd1PWZ1bmN0aW9uKCl7TXUuZGF0YT1GdT0hRnV9KSk7dmFyIHNjPWljfHxmdW5jdGlvbihlKXt2YXIgdD17Zm46ZSxuZXh0OnZvaWQgMH07eHUmJih4dS5uZXh0PXQpLER1fHwoRHU9dCxXdSgpKSx4dT10fSxhYz17fSx1Yz1iZSxjYz1mdW5jdGlvbihlKXt2YXIgdCxuO3RoaXMucHJvbWlzZT1uZXcgZSgoZnVuY3Rpb24oZSxvKXtpZih2b2lkIDAhPT10fHx2b2lkIDAhPT1uKXRocm93IFR5cGVFcnJvcigiQmFkIFByb21pc2UgY29uc3RydWN0b3IiKTt0PWUsbj1vfSkpLHRoaXMucmVzb2x2ZT11Yyh0KSx0aGlzLnJlamVjdD11YyhuKX07YWMuZj1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IGNjKGUpfTt2YXIgbGMsZGMsZmMsaGMscGM9T3QsdmM9SixiYz1hYyxnYz1mdW5jdGlvbihlLHQpe2lmKHBjKGUpLHZjKHQpJiZ0LmNvbnN0cnVjdG9yPT09ZSlyZXR1cm4gdDt2YXIgbj1iYy5mKGUpO3JldHVybigwLG4ucmVzb2x2ZSkodCksbi5wcm9taXNlfSxtYz1zLHljPWZ1bmN0aW9uKGUpe3RyeXtyZXR1cm57ZXJyb3I6ITEsdmFsdWU6ZSgpfX1jYXRjaChlKXtyZXR1cm57ZXJyb3I6ITAsdmFsdWU6ZX19fSxfYz0ib2JqZWN0Ij09KCJ1bmRlZmluZWQiPT10eXBlb2Ygd2luZG93PyJ1bmRlZmluZWQiOnQod2luZG93KSksd2M9Rm8sQ2M9cyxrYz1aLFNjPWQsUmM9X2EscWM9THQuZXhwb3J0cyxJYz1mdW5jdGlvbihlLHQsbil7Zm9yKHZhciBvIGluIHQpd2EoZSxvLHRbb10sbik7cmV0dXJuIGV9LFBjPXdyLEVjPXpzLE9jPWZ1bmN0aW9uKGUpe3ZhciB0PUNhKGUpLG49a2EuZjtTYSYmdCYmIXRbUmFdJiZuKHQsUmEse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc319KX0sVGM9YmUsemM9TSxBYz1KLFVjPWZ1bmN0aW9uKGUsdCl7aWYocWEodCxlKSlyZXR1cm4gZTt0aHJvdyBJYSgiSW5jb3JyZWN0IGludm9jYXRpb24iKX0sRGM9R3QseGM9amksV2M9ZnVuY3Rpb24oZSx0KXtpZighdCYmIUVhKXJldHVybiExO3ZhciBuPSExO3RyeXt2YXIgbz17fTtvW1BhXT1mdW5jdGlvbigpe3JldHVybntuZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2RvbmU6bj0hMH19fX0sZShvKX1jYXRjaChlKXt9cmV0dXJuIG59LEZjPXR1LE1jPWp1LnNldCxMYz1zYyxKYz1nYyxqYz1mdW5jdGlvbihlLHQpe3ZhciBuPW1jLmNvbnNvbGU7biYmbi5lcnJvciYmKDE9PWFyZ3VtZW50cy5sZW5ndGg/bi5lcnJvcihlKTpuLmVycm9yKGUsdCkpfSxOYz1hYyxCYz15YyxaYz13bixIYz1PbyxHYz1fYyxWYz11dSxYYz1lZSxZYz0kZSgic3BlY2llcyIpLEtjPSJQcm9taXNlIiwkYz1aYy5nZXQsUWM9WmMuc2V0LGVsPVpjLmdldHRlckZvcihLYyksdGw9UmMmJlJjLnByb3RvdHlwZSxubD1SYyxvbD10bCxybD1DYy5UeXBlRXJyb3IsaWw9Q2MuZG9jdW1lbnQsc2w9Q2MucHJvY2VzcyxhbD1OYy5mLHVsPWFsLGNsPSEhKGlsJiZpbC5jcmVhdGVFdmVudCYmQ2MuZGlzcGF0Y2hFdmVudCksbGw9emMoQ2MuUHJvbWlzZVJlamVjdGlvbkV2ZW50KSxkbD0idW5oYW5kbGVkcmVqZWN0aW9uIixmbD0hMSxobD1IYyhLYywoZnVuY3Rpb24oKXt2YXIgZT1EYyhubCksdD1lIT09U3RyaW5nKG5sKTtpZighdCYmNjY9PT1YYylyZXR1cm4hMDtpZihYYz49NTEmJi9uYXRpdmUgY29kZS8udGVzdChlKSlyZXR1cm4hMTt2YXIgbj1uZXcgbmwoKGZ1bmN0aW9uKGUpe2UoMSl9KSksbz1mdW5jdGlvbihlKXtlKChmdW5jdGlvbigpe30pLChmdW5jdGlvbigpe30pKX07cmV0dXJuKG4uY29uc3RydWN0b3I9e30pW1ljXT1vLCEoZmw9bi50aGVuKChmdW5jdGlvbigpe30pKWluc3RhbmNlb2Ygbyl8fCF0JiZHYyYmIWxsfSkpLHBsPWhsfHwhV2MoKGZ1bmN0aW9uKGUpe25sLmFsbChlKS5jYXRjaCgoZnVuY3Rpb24oKXt9KSl9KSksdmw9ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuISghQWMoZSl8fCF6Yyh0PWUudGhlbikpJiZ0fSxibD1mdW5jdGlvbihlLHQpe2lmKCFlLm5vdGlmaWVkKXtlLm5vdGlmaWVkPSEwO3ZhciBuPWUucmVhY3Rpb25zO0xjKChmdW5jdGlvbigpe2Zvcih2YXIgbz1lLnZhbHVlLHI9MT09ZS5zdGF0ZSxpPTA7bi5sZW5ndGg+aTspe3ZhciBzLGEsdSxjPW5baSsrXSxsPXI/Yy5vazpjLmZhaWwsZD1jLnJlc29sdmUsZj1jLnJlamVjdCxoPWMuZG9tYWluO3RyeXtsPyhyfHwoMj09PWUucmVqZWN0aW9uJiZfbChlKSxlLnJlamVjdGlvbj0xKSwhMD09PWw/cz1vOihoJiZoLmVudGVyKCkscz1sKG8pLGgmJihoLmV4aXQoKSx1PSEwKSkscz09PWMucHJvbWlzZT9mKHJsKCJQcm9taXNlLWNoYWluIGN5Y2xlIikpOihhPXZsKHMpKT9TYyhhLHMsZCxmKTpkKHMpKTpmKG8pfWNhdGNoKGUpe2gmJiF1JiZoLmV4aXQoKSxmKGUpfX1lLnJlYWN0aW9ucz1bXSxlLm5vdGlmaWVkPSExLHQmJiFlLnJlamVjdGlvbiYmbWwoZSl9KSl9fSxnbD1mdW5jdGlvbihlLHQsbil7dmFyIG8scjtjbD8oKG89aWwuY3JlYXRlRXZlbnQoIkV2ZW50IikpLnByb21pc2U9dCxvLnJlYXNvbj1uLG8uaW5pdEV2ZW50KGUsITEsITApLENjLmRpc3BhdGNoRXZlbnQobykpOm89e3Byb21pc2U6dCxyZWFzb246bn0sIWxsJiYocj1DY1sib24iK2VdKT9yKG8pOmU9PT1kbCYmamMoIlVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbiIsbil9LG1sPWZ1bmN0aW9uKGUpe1NjKE1jLENjLChmdW5jdGlvbigpe3ZhciB0LG49ZS5mYWNhZGUsbz1lLnZhbHVlO2lmKHlsKGUpJiYodD1CYygoZnVuY3Rpb24oKXtWYz9zbC5lbWl0KCJ1bmhhbmRsZWRSZWplY3Rpb24iLG8sbik6Z2woZGwsbixvKX0pKSxlLnJlamVjdGlvbj1WY3x8eWwoZSk/MjoxLHQuZXJyb3IpKXRocm93IHQudmFsdWV9KSl9LHlsPWZ1bmN0aW9uKGUpe3JldHVybiAxIT09ZS5yZWplY3Rpb24mJiFlLnBhcmVudH0sX2w9ZnVuY3Rpb24oZSl7U2MoTWMsQ2MsKGZ1bmN0aW9uKCl7dmFyIHQ9ZS5mYWNhZGU7VmM/c2wuZW1pdCgicmVqZWN0aW9uSGFuZGxlZCIsdCk6Z2woInJlamVjdGlvbmhhbmRsZWQiLHQsZS52YWx1ZSl9KSl9LHdsPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24obyl7ZSh0LG8sbil9fSxDbD1mdW5jdGlvbihlLHQsbil7ZS5kb25lfHwoZS5kb25lPSEwLG4mJihlPW4pLGUudmFsdWU9dCxlLnN0YXRlPTIsYmwoZSwhMCkpfSxrbD1mdW5jdGlvbiBlKHQsbixvKXtpZighdC5kb25lKXt0LmRvbmU9ITAsbyYmKHQ9byk7dHJ5e2lmKHQuZmFjYWRlPT09bil0aHJvdyBybCgiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGYiKTt2YXIgcj12bChuKTtyP0xjKChmdW5jdGlvbigpe3ZhciBvPXtkb25lOiExfTt0cnl7U2MocixuLHdsKGUsbyx0KSx3bChDbCxvLHQpKX1jYXRjaChlKXtDbChvLGUsdCl9fSkpOih0LnZhbHVlPW4sdC5zdGF0ZT0xLGJsKHQsITEpKX1jYXRjaChlKXtDbCh7ZG9uZTohMX0sZSx0KX19fTtpZihobCYmKG9sPShubD1mdW5jdGlvbihlKXtVYyh0aGlzLG9sKSxUYyhlKSxTYyhsYyx0aGlzKTt2YXIgdD0kYyh0aGlzKTt0cnl7ZSh3bChrbCx0KSx3bChDbCx0KSl9Y2F0Y2goZSl7Q2wodCxlKX19KS5wcm90b3R5cGUsKGxjPWZ1bmN0aW9uKGUpe1FjKHRoaXMse3R5cGU6S2MsZG9uZTohMSxub3RpZmllZDohMSxwYXJlbnQ6ITEscmVhY3Rpb25zOltdLHJlamVjdGlvbjohMSxzdGF0ZTowLHZhbHVlOnZvaWQgMH0pfSkucHJvdG90eXBlPUljKG9sLHt0aGVuOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZWwodGhpcyksbz1uLnJlYWN0aW9ucyxyPWFsKEZjKHRoaXMsbmwpKTtyZXR1cm4gci5vaz0hemMoZSl8fGUsci5mYWlsPXpjKHQpJiZ0LHIuZG9tYWluPVZjP3NsLmRvbWFpbjp2b2lkIDAsbi5wYXJlbnQ9ITAsb1tvLmxlbmd0aF09ciwwIT1uLnN0YXRlJiZibChuLCExKSxyLnByb21pc2V9LGNhdGNoOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRoZW4odm9pZCAwLGUpfX0pLGRjPWZ1bmN0aW9uKCl7dmFyIGU9bmV3IGxjLHQ9JGMoZSk7dGhpcy5wcm9taXNlPWUsdGhpcy5yZXNvbHZlPXdsKGtsLHQpLHRoaXMucmVqZWN0PXdsKENsLHQpfSxOYy5mPWFsPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09bmx8fGU9PT1mYz9uZXcgZGMoZSk6dWwoZSl9LHpjKFJjKSYmdGwhPT1PYmplY3QucHJvdG90eXBlKSl7aGM9dGwudGhlbixmbHx8KHFjKHRsLCJ0aGVuIiwoZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO3JldHVybiBuZXcgbmwoKGZ1bmN0aW9uKGUsdCl7U2MoaGMsbixlLHQpfSkpLnRoZW4oZSx0KX0pLHt1bnNhZmU6ITB9KSxxYyh0bCwiY2F0Y2giLG9sLmNhdGNoLHt1bnNhZmU6ITB9KSk7dHJ5e2RlbGV0ZSB0bC5jb25zdHJ1Y3Rvcn1jYXRjaChlKXt9UGMmJlBjKHRsLG9sKX13Yyh7Z2xvYmFsOiEwLHdyYXA6ITAsZm9yY2VkOmhsfSx7UHJvbWlzZTpubH0pLEVjKG5sLEtjLCExKSxPYyhLYyksZmM9a2MoS2MpLHdjKHt0YXJnZXQ6S2Msc3RhdDohMCxmb3JjZWQ6aGx9LHtyZWplY3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9YWwodGhpcyk7cmV0dXJuIFNjKHQucmVqZWN0LHZvaWQgMCxlKSx0LnByb21pc2V9fSksd2Moe3RhcmdldDpLYyxzdGF0OiEwLGZvcmNlZDpobH0se3Jlc29sdmU6ZnVuY3Rpb24oZSl7cmV0dXJuIEpjKHRoaXMsZSl9fSksd2Moe3RhcmdldDpLYyxzdGF0OiEwLGZvcmNlZDpwbH0se2FsbDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49YWwodCksbz1uLnJlc29sdmUscj1uLnJlamVjdCxpPUJjKChmdW5jdGlvbigpe3ZhciBuPVRjKHQucmVzb2x2ZSksaT1bXSxzPTAsYT0xO3hjKGUsKGZ1bmN0aW9uKGUpe3ZhciB1PXMrKyxjPSExO2ErKyxTYyhuLHQsZSkudGhlbigoZnVuY3Rpb24oZSl7Y3x8KGM9ITAsaVt1XT1lLC0tYXx8byhpKSl9KSxyKX0pKSwtLWF8fG8oaSl9KSk7cmV0dXJuIGkuZXJyb3ImJnIoaS52YWx1ZSksbi5wcm9taXNlfSxyYWNlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj1hbCh0KSxvPW4ucmVqZWN0LHI9QmMoKGZ1bmN0aW9uKCl7dmFyIHI9VGModC5yZXNvbHZlKTt4YyhlLChmdW5jdGlvbihlKXtTYyhyLHQsZSkudGhlbihuLnJlc29sdmUsbyl9KSl9KSk7cmV0dXJuIHIuZXJyb3ImJm8oci52YWx1ZSksbi5wcm9taXNlfX0pO3ZhciBTbD1kLFJsPWJlLHFsPWFjLElsPXljLFBsPWppO0ZvKHt0YXJnZXQ6IlByb21pc2UiLHN0YXQ6ITB9LHthbGxTZXR0bGVkOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj1xbC5mKHQpLG89bi5yZXNvbHZlLHI9bi5yZWplY3QsaT1JbCgoZnVuY3Rpb24oKXt2YXIgbj1SbCh0LnJlc29sdmUpLHI9W10saT0wLHM9MTtQbChlLChmdW5jdGlvbihlKXt2YXIgYT1pKyssdT0hMTtzKyssU2wobix0LGUpLnRoZW4oKGZ1bmN0aW9uKGUpe3V8fCh1PSEwLHJbYV09e3N0YXR1czoiZnVsZmlsbGVkIix2YWx1ZTplfSwtLXN8fG8ocikpfSksKGZ1bmN0aW9uKGUpe3V8fCh1PSEwLHJbYV09e3N0YXR1czoicmVqZWN0ZWQiLHJlYXNvbjplfSwtLXN8fG8ocikpfSkpfSkpLC0tc3x8byhyKX0pKTtyZXR1cm4gaS5lcnJvciYmcihpLnZhbHVlKSxuLnByb21pc2V9fSk7dmFyIEVsPWJlLE9sPVosVGw9ZCx6bD1hYyxBbD15YyxVbD1qaSxEbD0iTm8gb25lIHByb21pc2UgcmVzb2x2ZWQiO0ZvKHt0YXJnZXQ6IlByb21pc2UiLHN0YXQ6ITB9LHthbnk6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPU9sKCJBZ2dyZWdhdGVFcnJvciIpLG89emwuZih0KSxyPW8ucmVzb2x2ZSxpPW8ucmVqZWN0LHM9QWwoKGZ1bmN0aW9uKCl7dmFyIG89RWwodC5yZXNvbHZlKSxzPVtdLGE9MCx1PTEsYz0hMTtVbChlLChmdW5jdGlvbihlKXt2YXIgbD1hKyssZD0hMTt1KyssVGwobyx0LGUpLnRoZW4oKGZ1bmN0aW9uKGUpe2R8fGN8fChjPSEwLHIoZSkpfSksKGZ1bmN0aW9uKGUpe2R8fGN8fChkPSEwLHNbbF09ZSwtLXV8fGkobmV3IG4ocyxEbCkpKX0pKX0pKSwtLXV8fGkobmV3IG4ocyxEbCkpfSkpO3JldHVybiBzLmVycm9yJiZpKHMudmFsdWUpLG8ucHJvbWlzZX19KTt2YXIgeGw9Rm8sV2w9X2EsRmw9dSxNbD1aLExsPU0sSmw9dHUsamw9Z2MsTmw9THQuZXhwb3J0cztpZih4bCh7dGFyZ2V0OiJQcm9taXNlIixwcm90bzohMCxyZWFsOiEwLGZvcmNlZDohIVdsJiZGbCgoZnVuY3Rpb24oKXtXbC5wcm90b3R5cGUuZmluYWxseS5jYWxsKHt0aGVuOmZ1bmN0aW9uKCl7fX0sKGZ1bmN0aW9uKCl7fSkpfSkpfSx7ZmluYWxseTpmdW5jdGlvbihlKXt2YXIgdD1KbCh0aGlzLE1sKCJQcm9taXNlIikpLG49TGwoZSk7cmV0dXJuIHRoaXMudGhlbihuP2Z1bmN0aW9uKG4pe3JldHVybiBqbCh0LGUoKSkudGhlbigoZnVuY3Rpb24oKXtyZXR1cm4gbn0pKX06ZSxuP2Z1bmN0aW9uKG4pe3JldHVybiBqbCh0LGUoKSkudGhlbigoZnVuY3Rpb24oKXt0aHJvdyBufSkpfTplKX19KSxMbChXbCkpe3ZhciBCbD1NbCgiUHJvbWlzZSIpLnByb3RvdHlwZS5maW5hbGx5O1dsLnByb3RvdHlwZS5maW5hbGx5IT09QmwmJk5sKFdsLnByb3RvdHlwZSwiZmluYWxseSIsQmwse3Vuc2FmZTohMH0pfXZhciBabD1rLEhsPUpuLEdsPVppLFZsPUQsWGw9WmwoIiIuY2hhckF0KSxZbD1abCgiIi5jaGFyQ29kZUF0KSxLbD1abCgiIi5zbGljZSksJGw9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQsbil7dmFyIG8scixpPUdsKFZsKHQpKSxzPUhsKG4pLGE9aS5sZW5ndGg7cmV0dXJuIHM8MHx8cz49YT9lPyIiOnZvaWQgMDoobz1ZbChpLHMpKTw1NTI5Nnx8bz41NjMxOXx8cysxPT09YXx8KHI9WWwoaSxzKzEpKTw1NjMyMHx8cj41NzM0Mz9lP1hsKGkscyk6bzplP0tsKGkscyxzKzIpOnItNTYzMjArKG8tNTUyOTY8PDEwKSs2NTUzNn19LFFsPXtjb2RlQXQ6JGwoITEpLGNoYXJBdDokbCghMCl9LmNoYXJBdCxlZD1aaSx0ZD13bixuZD1pYSxvZD0iU3RyaW5nIEl0ZXJhdG9yIixyZD10ZC5zZXQsaWQ9dGQuZ2V0dGVyRm9yKG9kKTtuZChTdHJpbmcsIlN0cmluZyIsKGZ1bmN0aW9uKGUpe3JkKHRoaXMse3R5cGU6b2Qsc3RyaW5nOmVkKGUpLGluZGV4OjB9KX0pLChmdW5jdGlvbigpe3ZhciBlLHQ9aWQodGhpcyksbj10LnN0cmluZyxvPXQuaW5kZXg7cmV0dXJuIG8+PW4ubGVuZ3RoP3t2YWx1ZTp2b2lkIDAsZG9uZTohMH06KGU9UWwobixvKSx0LmluZGV4Kz1lLmxlbmd0aCx7dmFsdWU6ZSxkb25lOiExfSl9KSksbnIuUHJvbWlzZTt2YXIgc2QsYWQ9aHQoInNwYW4iKS5jbGFzc0xpc3QsdWQ9YWQmJmFkLmNvbnN0cnVjdG9yJiZhZC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsY2Q9dWQ9PT1PYmplY3QucHJvdG90eXBlP3ZvaWQgMDp1ZCxsZD1zLGRkPXtDU1NSdWxlTGlzdDowLENTU1N0eWxlRGVjbGFyYXRpb246MCxDU1NWYWx1ZUxpc3Q6MCxDbGllbnRSZWN0TGlzdDowLERPTVJlY3RMaXN0OjAsRE9NU3RyaW5nTGlzdDowLERPTVRva2VuTGlzdDoxLERhdGFUcmFuc2Zlckl0ZW1MaXN0OjAsRmlsZUxpc3Q6MCxIVE1MQWxsQ29sbGVjdGlvbjowLEhUTUxDb2xsZWN0aW9uOjAsSFRNTEZvcm1FbGVtZW50OjAsSFRNTFNlbGVjdEVsZW1lbnQ6MCxNZWRpYUxpc3Q6MCxNaW1lVHlwZUFycmF5OjAsTmFtZWROb2RlTWFwOjAsTm9kZUxpc3Q6MSxQYWludFJlcXVlc3RMaXN0OjAsUGx1Z2luOjAsUGx1Z2luQXJyYXk6MCxTVkdMZW5ndGhMaXN0OjAsU1ZHTnVtYmVyTGlzdDowLFNWR1BhdGhTZWdMaXN0OjAsU1ZHUG9pbnRMaXN0OjAsU1ZHU3RyaW5nTGlzdDowLFNWR1RyYW5zZm9ybUxpc3Q6MCxTb3VyY2VCdWZmZXJMaXN0OjAsU3R5bGVTaGVldExpc3Q6MCxUZXh0VHJhY2tDdWVMaXN0OjAsVGV4dFRyYWNrTGlzdDowLFRvdWNoTGlzdDowfSxmZD1jZCxoZD1wYSxwZD1NdCx2ZD0kZSxiZD12ZCgiaXRlcmF0b3IiKSxnZD12ZCgidG9TdHJpbmdUYWciKSxtZD1oZC52YWx1ZXMseWQ9ZnVuY3Rpb24oZSx0KXtpZihlKXtpZihlW2JkXSE9PW1kKXRyeXtwZChlLGJkLG1kKX1jYXRjaCh0KXtlW2JkXT1tZH1pZihlW2dkXXx8cGQoZSxnZCx0KSxkZFt0XSlmb3IodmFyIG4gaW4gaGQpaWYoZVtuXSE9PWhkW25dKXRyeXtwZChlLG4saGRbbl0pfWNhdGNoKHQpe2Vbbl09aGRbbl19fX07Zm9yKHZhciBfZCBpbiBkZCl5ZChsZFtfZF0mJmxkW19kXS5wcm90b3R5cGUsX2QpO3lkKGZkLCJET01Ub2tlbkxpc3QiKTt2YXIgd2Q9bmV3IFVpbnQ4QXJyYXkoMTYpO2Z1bmN0aW9uIENkKCl7aWYoIXNkJiYhKHNkPSJ1bmRlZmluZWQiIT10eXBlb2YgY3J5cHRvJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQoY3J5cHRvKXx8InVuZGVmaW5lZCIhPXR5cGVvZiBtc0NyeXB0byYmImZ1bmN0aW9uIj09dHlwZW9mIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyYmbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQobXNDcnlwdG8pKSl0aHJvdyBuZXcgRXJyb3IoImNyeXB0by5nZXRSYW5kb21WYWx1ZXMoKSBub3Qgc3VwcG9ydGVkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkI2dldHJhbmRvbXZhbHVlcy1ub3Qtc3VwcG9ydGVkIik7cmV0dXJuIHNkKHdkKX12YXIga2Q9L14oPzpbMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMS01XVswLTlhLWZdezN9LVs4OWFiXVswLTlhLWZdezN9LVswLTlhLWZdezEyfXwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDApJC9pO2Z1bmN0aW9uIFNkKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZSYma2QudGVzdChlKX1mb3IodmFyIFJkPVtdLHFkPTA7cWQ8MjU2OysrcWQpUmQucHVzaCgocWQrMjU2KS50b1N0cmluZygxNikuc3Vic3RyKDEpKTtmdW5jdGlvbiBJZChlLHQsbil7dmFyIG89KGU9ZXx8e30pLnJhbmRvbXx8KGUucm5nfHxDZCkoKTtpZihvWzZdPTE1Jm9bNl18NjQsb1s4XT02MyZvWzhdfDEyOCx0KXtuPW58fDA7Zm9yKHZhciByPTA7cjwxNjsrK3IpdFtuK3JdPW9bcl07cmV0dXJuIHR9cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowLG49KFJkW2VbdCswXV0rUmRbZVt0KzFdXStSZFtlW3QrMl1dK1JkW2VbdCszXV0rIi0iK1JkW2VbdCs0XV0rUmRbZVt0KzVdXSsiLSIrUmRbZVt0KzZdXStSZFtlW3QrN11dKyItIitSZFtlW3QrOF1dK1JkW2VbdCs5XV0rIi0iK1JkW2VbdCsxMF1dK1JkW2VbdCsxMV1dK1JkW2VbdCsxMl1dK1JkW2VbdCsxM11dK1JkW2VbdCsxNF1dK1JkW2VbdCsxNV1dKS50b0xvd2VyQ2FzZSgpO2lmKCFTZChuKSl0aHJvdyBUeXBlRXJyb3IoIlN0cmluZ2lmaWVkIFVVSUQgaXMgaW52YWxpZCIpO3JldHVybiBufShvKX12YXIgUGQsRWQ9IjMuNy4yIixPZD0iZnVuY3Rpb24iPT10eXBlb2YgYXRvYixUZD0iZnVuY3Rpb24iPT10eXBlb2YgYnRvYSx6ZD0iZnVuY3Rpb24iPT10eXBlb2YgQnVmZmVyLEFkPSJmdW5jdGlvbiI9PXR5cGVvZiBUZXh0RGVjb2Rlcj9uZXcgVGV4dERlY29kZXI6dm9pZCAwLFVkPSJmdW5jdGlvbiI9PXR5cGVvZiBUZXh0RW5jb2Rlcj9uZXcgVGV4dEVuY29kZXI6dm9pZCAwLERkPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIpLHhkPShQZD17fSxEZC5mb3JFYWNoKChmdW5jdGlvbihlLHQpe3JldHVybiBQZFtlXT10fSkpLFBkKSxXZD0vXig/OltBLVphLXpcZCtcL117NH0pKj8oPzpbQS1aYS16XGQrXC9dezJ9KD86PT0pP3xbQS1aYS16XGQrXC9dezN9PT8pPyQvLEZkPVN0cmluZy5mcm9tQ2hhckNvZGUuYmluZChTdHJpbmcpLE1kPSJmdW5jdGlvbiI9PXR5cGVvZiBVaW50OEFycmF5LmZyb20/VWludDhBcnJheS5mcm9tLmJpbmQoVWludDhBcnJheSk6ZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOmZ1bmN0aW9uKGUpe3JldHVybiBlfTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZSwwKS5tYXAodCkpfSxMZD1mdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKC89L2csIiIpLnJlcGxhY2UoL1srXC9dL2csKGZ1bmN0aW9uKGUpe3JldHVybiIrIj09ZT8iLSI6Il8ifSkpfSxKZD1mdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKC9bXkEtWmEtejAtOVwrXC9dL2csIiIpfSxqZD1mdW5jdGlvbihlKXtmb3IodmFyIHQsbixvLHIsaT0iIixzPWUubGVuZ3RoJTMsYT0wO2E8ZS5sZW5ndGg7KXtpZigobj1lLmNoYXJDb2RlQXQoYSsrKSk+MjU1fHwobz1lLmNoYXJDb2RlQXQoYSsrKSk+MjU1fHwocj1lLmNoYXJDb2RlQXQoYSsrKSk+MjU1KXRocm93IG5ldyBUeXBlRXJyb3IoImludmFsaWQgY2hhcmFjdGVyIGZvdW5kIik7aSs9RGRbKHQ9bjw8MTZ8bzw8OHxyKT4+MTgmNjNdK0RkW3Q+PjEyJjYzXStEZFt0Pj42JjYzXStEZFs2MyZ0XX1yZXR1cm4gcz9pLnNsaWNlKDAscy0zKSsiPT09Ii5zdWJzdHJpbmcocyk6aX0sTmQ9VGQ/ZnVuY3Rpb24oZSl7cmV0dXJuIGJ0b2EoZSl9OnpkP2Z1bmN0aW9uKGUpe3JldHVybiBCdWZmZXIuZnJvbShlLCJiaW5hcnkiKS50b1N0cmluZygiYmFzZTY0Iil9OmpkLEJkPXpkP2Z1bmN0aW9uKGUpe3JldHVybiBCdWZmZXIuZnJvbShlKS50b1N0cmluZygiYmFzZTY0Iil9OmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTAsbz1lLmxlbmd0aDtuPG87bis9NDA5Nil0LnB1c2goRmQuYXBwbHkobnVsbCxlLnN1YmFycmF5KG4sbis0MDk2KSkpO3JldHVybiBOZCh0LmpvaW4oIiIpKX0sWmQ9ZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXTtyZXR1cm4gdD9MZChCZChlKSk6QmQoZSl9LEhkPWZ1bmN0aW9uKGUpe2lmKGUubGVuZ3RoPDIpcmV0dXJuKHQ9ZS5jaGFyQ29kZUF0KDApKTwxMjg/ZTp0PDIwNDg/RmQoMTkyfHQ+Pj42KStGZCgxMjh8NjMmdCk6RmQoMjI0fHQ+Pj4xMiYxNSkrRmQoMTI4fHQ+Pj42JjYzKStGZCgxMjh8NjMmdCk7dmFyIHQ9NjU1MzYrMTAyNCooZS5jaGFyQ29kZUF0KDApLTU1Mjk2KSsoZS5jaGFyQ29kZUF0KDEpLTU2MzIwKTtyZXR1cm4gRmQoMjQwfHQ+Pj4xOCY3KStGZCgxMjh8dD4+PjEyJjYzKStGZCgxMjh8dD4+PjYmNjMpK0ZkKDEyOHw2MyZ0KX0sR2Q9L1tcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGRl18W15ceDAwLVx4N0ZdL2csVmQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShHZCxIZCl9LFhkPXpkP2Z1bmN0aW9uKGUpe3JldHVybiBCdWZmZXIuZnJvbShlLCJ1dGY4IikudG9TdHJpbmcoImJhc2U2NCIpfTpVZD9mdW5jdGlvbihlKXtyZXR1cm4gQmQoVWQuZW5jb2RlKGUpKX06ZnVuY3Rpb24oZSl7cmV0dXJuIE5kKFZkKGUpKX0sWWQ9ZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXTtyZXR1cm4gdD9MZChYZChlKSk6WGQoZSl9LEtkPWZ1bmN0aW9uKGUpe3JldHVybiBZZChlLCEwKX0sJGQ9L1tceEMwLVx4REZdW1x4ODAtXHhCRl18W1x4RTAtXHhFRl1bXHg4MC1ceEJGXXsyfXxbXHhGMC1ceEY3XVtceDgwLVx4QkZdezN9L2csUWQ9ZnVuY3Rpb24oZSl7c3dpdGNoKGUubGVuZ3RoKXtjYXNlIDQ6dmFyIHQ9KCg3JmUuY2hhckNvZGVBdCgwKSk8PDE4fCg2MyZlLmNoYXJDb2RlQXQoMSkpPDwxMnwoNjMmZS5jaGFyQ29kZUF0KDIpKTw8Nnw2MyZlLmNoYXJDb2RlQXQoMykpLTY1NTM2O3JldHVybiBGZCg1NTI5NisodD4+PjEwKSkrRmQoNTYzMjArKDEwMjMmdCkpO2Nhc2UgMzpyZXR1cm4gRmQoKDE1JmUuY2hhckNvZGVBdCgwKSk8PDEyfCg2MyZlLmNoYXJDb2RlQXQoMSkpPDw2fDYzJmUuY2hhckNvZGVBdCgyKSk7ZGVmYXVsdDpyZXR1cm4gRmQoKDMxJmUuY2hhckNvZGVBdCgwKSk8PDZ8NjMmZS5jaGFyQ29kZUF0KDEpKX19LGVmPWZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoJGQsUWQpfSx0Zj1mdW5jdGlvbihlKXtpZihlPWUucmVwbGFjZSgvXHMrL2csIiIpLCFXZC50ZXN0KGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIm1hbGZvcm1lZCBiYXNlNjQuIik7ZSs9Ij09Ii5zbGljZSgyLSgzJmUubGVuZ3RoKSk7Zm9yKHZhciB0LG4sbyxyPSIiLGk9MDtpPGUubGVuZ3RoOyl0PXhkW2UuY2hhckF0KGkrKyldPDwxOHx4ZFtlLmNoYXJBdChpKyspXTw8MTJ8KG49eGRbZS5jaGFyQXQoaSsrKV0pPDw2fChvPXhkW2UuY2hhckF0KGkrKyldKSxyKz02ND09PW4/RmQodD4+MTYmMjU1KTo2ND09PW8/RmQodD4+MTYmMjU1LHQ+PjgmMjU1KTpGZCh0Pj4xNiYyNTUsdD4+OCYyNTUsMjU1JnQpO3JldHVybiByfSxuZj1PZD9mdW5jdGlvbihlKXtyZXR1cm4gYXRvYihKZChlKSl9OnpkP2Z1bmN0aW9uKGUpe3JldHVybiBCdWZmZXIuZnJvbShlLCJiYXNlNjQiKS50b1N0cmluZygiYmluYXJ5Iil9OnRmLG9mPXpkP2Z1bmN0aW9uKGUpe3JldHVybiBNZChCdWZmZXIuZnJvbShlLCJiYXNlNjQiKSl9OmZ1bmN0aW9uKGUpe3JldHVybiBNZChuZihlKSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2hhckNvZGVBdCgwKX0pKX0scmY9ZnVuY3Rpb24oZSl7cmV0dXJuIG9mKGFmKGUpKX0sc2Y9emQ/ZnVuY3Rpb24oZSl7cmV0dXJuIEJ1ZmZlci5mcm9tKGUsImJhc2U2NCIpLnRvU3RyaW5nKCJ1dGY4Iil9OkFkP2Z1bmN0aW9uKGUpe3JldHVybiBBZC5kZWNvZGUob2YoZSkpfTpmdW5jdGlvbihlKXtyZXR1cm4gZWYobmYoZSkpfSxhZj1mdW5jdGlvbihlKXtyZXR1cm4gSmQoZS5yZXBsYWNlKC9bLV9dL2csKGZ1bmN0aW9uKGUpe3JldHVybiItIj09ZT8iKyI6Ii8ifSkpKX0sdWY9ZnVuY3Rpb24oZSl7cmV0dXJuIHNmKGFmKGUpKX0sY2Y9ZnVuY3Rpb24oZSl7cmV0dXJue3ZhbHVlOmUsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSxsZj1mdW5jdGlvbigpe3ZhciBlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdHJpbmcucHJvdG90eXBlLGUsY2YodCkpfTtlKCJmcm9tQmFzZTY0IiwoZnVuY3Rpb24oKXtyZXR1cm4gdWYodGhpcyl9KSksZSgidG9CYXNlNjQiLChmdW5jdGlvbihlKXtyZXR1cm4gWWQodGhpcyxlKX0pKSxlKCJ0b0Jhc2U2NFVSSSIsKGZ1bmN0aW9uKCl7cmV0dXJuIFlkKHRoaXMsITApfSkpLGUoInRvQmFzZTY0VVJMIiwoZnVuY3Rpb24oKXtyZXR1cm4gWWQodGhpcywhMCl9KSksZSgidG9VaW50OEFycmF5IiwoZnVuY3Rpb24oKXtyZXR1cm4gcmYodGhpcyl9KSl9LGRmPWZ1bmN0aW9uKCl7dmFyIGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KFVpbnQ4QXJyYXkucHJvdG90eXBlLGUsY2YodCkpfTtlKCJ0b0Jhc2U2NCIsKGZ1bmN0aW9uKGUpe3JldHVybiBaZCh0aGlzLGUpfSkpLGUoInRvQmFzZTY0VVJJIiwoZnVuY3Rpb24oKXtyZXR1cm4gWmQodGhpcywhMCl9KSksZSgidG9CYXNlNjRVUkwiLChmdW5jdGlvbigpe3JldHVybiBaZCh0aGlzLCEwKX0pKX0sZmY9e3ZlcnNpb246RWQsVkVSU0lPTjoiMy43LjIiLGF0b2I6bmYsYXRvYlBvbHlmaWxsOnRmLGJ0b2E6TmQsYnRvYVBvbHlmaWxsOmpkLGZyb21CYXNlNjQ6dWYsdG9CYXNlNjQ6WWQsZW5jb2RlOllkLGVuY29kZVVSSTpLZCxlbmNvZGVVUkw6S2QsdXRvYjpWZCxidG91OmVmLGRlY29kZTp1Zixpc1ZhbGlkOmZ1bmN0aW9uKGUpe2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4hMTt2YXIgdD1lLnJlcGxhY2UoL1xzKy9nLCIiKS5yZXBsYWNlKC89ezAsMn0kLywiIik7cmV0dXJuIS9bXlxzMC05YS16QS1aXCsvXS8udGVzdCh0KXx8IS9bXlxzMC05YS16QS1aXC1fXS8udGVzdCh0KX0sZnJvbVVpbnQ4QXJyYXk6WmQsdG9VaW50OEFycmF5OnJmLGV4dGVuZFN0cmluZzpsZixleHRlbmRVaW50OEFycmF5OmRmLGV4dGVuZEJ1aWx0aW5zOmZ1bmN0aW9uKCl7bGYoKSxkZigpfX0saGY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7bih0aGlzLGUpLHRoaXMub0Jhc2U2ND1mZn1yZXR1cm4gcihlLFt7a2V5OiJicm93c2VyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPW5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSx0PS8oZWRnZSlbL10oW1x3Ll0rKS8uZXhlYyhlKXx8LyhjaHJvbWUpWy9dKFtcdy5dKykvLmV4ZWMoZSl8fC8oc2FmYXJpKVsvXShbXHcuXSspLy5leGVjKGUpfHwvKG9wZXJhKSg/Oi4qdmVyc2lvbik/Wy9dKFtcdy5dKykvLmV4ZWMoZSl8fC8odHJpZGVudC4qcnY6KShbXHcuXSspLy5leGVjKGUpfHwvKG1zaWUpIChbXHcuXSspLy5leGVjKGUpfHxlLmluZGV4T2YoImNvbXBhdGlibGUiKTwwJiYvKG1vemlsbGEpKD86Lio/IHJ2OihbXHcuXSspKT8vLmV4ZWMoZSl8fFsidW5rbm93IiwiMCJdO3QubGVuZ3RoPjAmJnRbMV0uaW5kZXhPZigidHJpZGVudCIpPi0xJiYodFsxXT0ibXNpZSIpO3ZhciBuPXt9O3JldHVybiBuW3RbMV1dPSEwLG4udmVyc2lvbj10WzJdLG59fSx7a2V5OiJnZXRDcmVhdGVXbmRNb2RlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPW5hdmlnYXRvci51c2VyQWdlbnQsdD1uYXZpZ2F0b3IucGxhdGZvcm0sbj0iV2luNjQiPT09dHx8IldpbjMyIj09PXR8fCJXaW5kb3dzIj09PXQsbz10aGlzLmJyb3dzZXIoKSxyPSEwO3JldHVybiB3aW5kb3cudG9wIT09d2luZG93P3I9ITE6bj8oZS5pbmRleE9mKCJXaW5kb3dzIE5UIDEwLjAiKT4tMSYmby5tb3ppbGxhJiYocj0hMSksby5lZGdlJiYocj0hMSkpOnI9ITEscn19LHtrZXk6ImdldFduZFBvc3Rpb24iLHZhbHVlOmZ1bmN0aW9uKGUsdCxuLG8pe3ZhciByPTAsaT0wLHM9ZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LGE9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx1PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpLGM9e3RvcDphLnRvcCtwYXJzZUludCh1WyJib3JkZXItdG9wLXdpZHRoIl0uc2xpY2UoMCwtMiksMTApLGxlZnQ6YS5sZWZ0K3BhcnNlSW50KHVbImJvcmRlci1sZWZ0LXdpZHRoIl0uc2xpY2UoMCwtMiksMTApfSxsPXRoaXMuZ2V0RGV2aWNlUGl4ZWxSYXRpbygpO2lmKHQpaWYodGhpcy5icm93c2VyKCkubXNpZSl7dmFyIGQ9cy5vdXRlcldpZHRoLXMuaW5uZXJXaWR0aC0ocy5zY3JlZW5MZWZ0LXMuc2NyZWVuWCk7cj1jLmxlZnQrKHMuc2NyZWVuTGVmdC1zLnNjcmVlblgpLWQsaT1jLnRvcCsocy5zY3JlZW5Ub3Atcy5zY3JlZW5ZKX1lbHNle3ZhciBmPTAsaD0wLHA9dGhpcy5icm93c2VyKCkuY2hyb21lP3Mub3V0ZXJXaWR0aC9sOnMub3V0ZXJXaWR0aCx2PXRoaXMuYnJvd3NlcigpLmNocm9tZT9zLm91dGVySGVpZ2h0L2w6cy5vdXRlckhlaWdodCxiPU1hdGgucm91bmQoKHAtcy5pbm5lcldpZHRoKS8yKTt0aGlzLmlzV2luZG93cygpJiZ0aGlzLmJyb3dzZXIoKS5jaHJvbWUmJigtOD09PWJ8fHMuc2NyZWVuLmhlaWdodC1zLm91dGVySGVpZ2h0PT0wPy04PT09YiYmKGY9OCxoPTgpOjg9PT1iP2Y9LTU6MD09PWImJihoPTgpKSx0aGlzLmJyb3dzZXIoKS5tb3ppbGxhJiYoNz09PWJ8fDY9PT1iP2Y9LTY6OD09PWImJihmPS04KSkscj1jLmxlZnQrYitmLGk9Yy50b3ArKHYtcy5pbm5lckhlaWdodC1iKStofWVsc2V7dmFyIGc9d2luZG93LnRvcCxtPTAseT0wLF89MCx3PTA7dHJ5e209Zy5vdXRlcldpZHRoLWcuaW5uZXJXaWR0aCx5PWcub3V0ZXJIZWlnaHQtZy5pbm5lckhlaWdodCxfPWcuc2NyZWVuTGVmdC1nLnNjcmVlblgsdz1nLnNjcmVlblRvcC1nLnNjcmVlbll9Y2F0Y2goZSl7bT1uLm91dGVyV2lkdGgtbi5pbm5lcldpZHRoLHk9bi5vdXRlckhlaWdodC1uLmlubmVySGVpZ2h0LF89bi5zY3JlZW5MZWZ0LW4uc2NyZWVuWCx3PW4uc2NyZWVuVG9wLW4uc2NyZWVuWX1pZih0aGlzLmJyb3dzZXIoKS5tc2llKXswLHI9Yy5sZWZ0K18tMCxpPWMudG9wK3d9ZWxzZXt2YXIgQz1tLzI7cj1jLmxlZnQrQyxpPWMudG9wKyh5LUMpLHRoaXMuaXNXaW5kb3dzKCkmJnRoaXMuYnJvd3NlcigpLmNocm9tZSYmMD09PUMmJihyKz04LGkrPTgpfXIrPW8ubGVmdCxpKz1vLnRvcH1yZXR1cm4gdGhpcy5pc1dpbmRvd3MoKSYmKHRoaXMuYnJvd3NlcigpLmNocm9tZXx8dGhpcy5icm93c2VyKCkuc2FmYXJpKSYmKHI9Yy5sZWZ0LGk9Yy50b3Ascis9by5sZWZ0LGkrPW8udG9wKSx0aGlzLmJyb3dzZXIoKS5tc2llJiYiMTAuMCI9PT10aGlzLmJyb3dzZXIoKS52ZXJzaW9uJiYocis9cy5wYWdlWE9mZnNldCxpKz1zLnBhZ2VZT2Zmc2V0KSx7bGVmdDpyPU1hdGgucm91bmQocipsKSx0b3A6aT1NYXRoLnJvdW5kKGkqbCl9fX0se2tleToiZGV0ZWN0UG9ydCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe2lmKGUhPT10KXt2YXIgbz0iSGlrQ2VudHJhbFdlYkNvbnRyb2xQb3J0OiIuY29uY2F0KGUsIi0iKS5jb25jYXQodCkscj10aGlzLGk9MCxzPSExLGE9bnVsbDtzZXNzaW9uU3RvcmFnZSYmbnVsbCE9PShhPXNlc3Npb25TdG9yYWdlLmdldEl0ZW0obykpJiYoYT1wYXJzZUludChhLDEwKSk7Zm9yKHZhciB1PVtdLGM9ZTtjPD10O2MrKyljIT09YSYmdS5wdXNoKGMpO251bGwhPT1hJiZ1LnVuc2hpZnQoYSk7Zm9yKHZhciBsPVtdLGQ9ZnVuY3Rpb24oKXtpPjAmJmNsZWFyVGltZW91dChpKX0sZj1mdW5jdGlvbigpe2Zvcih2YXIgZT0wLHQ9bC5sZW5ndGg7ZTx0O2UrKylkZWxldGUgbFtlXX0saD0wLHA9KG5ldyBEYXRlKS5nZXRUaW1lKCksdj1mdW5jdGlvbihlLHQpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7bC5wdXNoKHIuY3JlYXRlSW1hZ2VIdHRwKHVbdF0se3RpbWVTdGFtcDpwK3Qsc3VjY2VzczpmdW5jdGlvbihlKXshZnVuY3Rpb24oZSl7c2Vzc2lvblN0b3JhZ2UmJnNlc3Npb25TdG9yYWdlLnNldEl0ZW0obyxlKSwhcyYmbi5zdWNjZXNzJiYoZCgpLGYoKSxuLnN1Y2Nlc3MoZSkpfShlKX0sZXJyb3I6ZnVuY3Rpb24oKXtoKyssdS5sZW5ndGg9PT1oJiYhcyYmbi5lcnJvciYmKGQoKSxmKCksbi5lcnJvcigpKX19KSl9KSwxMDApfSxiPTAsZz11Lmxlbmd0aDtiPGc7YisrKXYoMCxiKTtpPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7cz0hMCxuLmVycm9yJiYoZigpLG4uZXJyb3IoKSl9KSw2ZTQpfWVsc2Ugbi5zdWNjZXNzKGUpfX0se2tleToiY3JlYXRlSW1hZ2VIdHRwIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPW5ldyBJbWFnZTtyZXR1cm4gbi5jcm9zc09yaWdpbj0iYW5vbnltb3VzIixuLm9ubG9hZD1mdW5jdGlvbigpe3Quc3VjY2VzcyYmdC5zdWNjZXNzKGUpfSxuLm9uZXJyb3I9ZnVuY3Rpb24oKXt0LmVycm9yJiZ0LmVycm9yKCl9LG4ub25hYm9ydD1mdW5jdGlvbigpe3QuYWJvcnQmJnQuYWJvcnQoKX0sbi5zcmM9Imh0dHA6Ly8xMjcuMC4wLjE6Ii5jb25jYXQoZSwiL2ltZ2h0dHAvbG9jYWw/dXBkYXRlPSIpLmNvbmNhdCh0LnRpbWVTdGFtcCksbn19LHtrZXk6InV0Zjh0bzE2Iix2YWx1ZTpmdW5jdGlvbihlKXtmb3IodmFyIHQsbixvLHI9IiIsaT0wLHM9ZS5sZW5ndGg7aTxzOylzd2l0Y2goKHQ9ZS5jaGFyQ29kZUF0KGkrKykpPj40KXtjYXNlIDA6Y2FzZSAxOmNhc2UgMjpjYXNlIDM6Y2FzZSA0OmNhc2UgNTpjYXNlIDY6Y2FzZSA3OnIrPWUuY2hhckF0KGktMSk7YnJlYWs7Y2FzZSAxMjpjYXNlIDEzOm49ZS5jaGFyQ29kZUF0KGkrKykscis9U3RyaW5nLmZyb21DaGFyQ29kZSgoMzEmdCk8PDZ8NjMmbik7YnJlYWs7Y2FzZSAxNDpuPWUuY2hhckNvZGVBdChpKyspLG89ZS5jaGFyQ29kZUF0KGkrKykscis9U3RyaW5nLmZyb21DaGFyQ29kZSgoMTUmdCk8PDEyfCg2MyZuKTw8NnwoNjMmbyk8PDApfXJldHVybiByfX0se2tleToiY3JlYXRlRXZlbnRTY3JpcHQiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtvLmh0bWxGb3I9ZSxvLmV2ZW50PXQsby5pbm5lckhUTUw9bixkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKS5hcHBlbmRDaGlsZChvKX19LHtrZXk6ImlzTWFjT1MiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIk1hY0ludGVsIj09PW5hdmlnYXRvci5wbGF0Zm9ybX19LHtrZXk6ImlzV2luZG93cyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnBsYXRmb3JtLmluZGV4T2YoIldpbiIpPi0xfX0se2tleToiZ2V0RGV2aWNlUGl4ZWxSYXRpbyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT0xO3JldHVybiB0aGlzLmlzTWFjT1MoKXx8KGU9d2luZG93LmRldmljZVBpeGVsUmF0aW98fHdpbmRvdy5zY3JlZW4uZGV2aWNlWERQSS93aW5kb3cuc2NyZWVuLmxvZ2ljYWxYRFBJKSxlfX0se2tleToiQmFzZTY0Iix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9CYXNlNjR8fHt9fX1dKSxlfSgpLHBmPW5ldyBoZix2Zj0i44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CA44CAIjtmdW5jdGlvbiBiZihlKXt3aW5kb3cudG9wLmRvY3VtZW50LnRpdGxlPXdpbmRvdy50b3AuZG9jdW1lbnQudGl0bGUrdmYrZX1mdW5jdGlvbiBnZihlKXt3aW5kb3cudG9wLmRvY3VtZW50LnRpdGxlPXdpbmRvdy50b3AuZG9jdW1lbnQudGl0bGUucmVwbGFjZSh2ZitlLCIiKX1mdW5jdGlvbiBtZihlLHQpeyh0fHxiZikoZSl9ZnVuY3Rpb24geWYoZSx0KXsodHx8Z2YpKGUpfXZhciBfZj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7bih0aGlzLGUpLHRoaXMub09wdGlvbnM9T2JqZWN0LmFzc2lnbih7aVBvcnQ6LTEsY2JDb25uZWN0U3VjY2VzczpudWxsLGNiQ29ubmVjdEVycm9yOm51bGwsY2JDb25uZWN0Q2xvc2U6bnVsbH0sdCksdGhpcy5vV2ViU29ja2V0PW51bGwsdGhpcy5zelVVSUQ9IiIsdGhpcy5zelZlcnNpb249IiIsdGhpcy5vUmVxdWVzdExpc3Q9e30sdGhpcy5iTm9ybWFsQ2xvc2U9ITEsdGhpcy5vV2luZG93Q29udHJvbENhbGxiYWNrPXt9LHRoaXMub1NhZHBDYWxsYmFjaz17fSx0aGlzLm9TbGljZUNhbGxiYWNrPXt9LHRoaXMub1NlcmlhbENhbGxiYWNrPXt9LHRoaXMub1VJQ29udHJvbENhbGxiYWNrPXt9LHRoaXMub1VwZ3JhZGVDYWxsYmFjaz17fSx0aGlzLmluaXQoKX1yZXR1cm4gcihlLFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1mdW5jdGlvbigpe2Uub09wdGlvbnMuY2JDb25uZWN0Q2xvc2UmJmUub09wdGlvbnMuY2JDb25uZWN0Q2xvc2UoZS5iTm9ybWFsQ2xvc2UpLGUuYk5vcm1hbENsb3NlPSExfTtlLm9XZWJTb2NrZXQ9bmV3IFdlYlNvY2tldCgid3M6Ly8xMjcuMC4wLjE6Ii5jb25jYXQoZS5vT3B0aW9ucy5pUG9ydCkpLGUub1dlYlNvY2tldC5vbmVycm9yPWZ1bmN0aW9uKCl7fSxlLm9XZWJTb2NrZXQub25vcGVuPWZ1bmN0aW9uKCl7dmFyIHQ9e3NlcXVlbmNlOklkKCksY21kOiJzeXN0ZW0uY29ubmVjdCJ9LG49SlNPTi5zdHJpbmdpZnkodCk7ZS5vV2ViU29ja2V0LnNlbmQobil9LGUub1dlYlNvY2tldC5vbm1lc3NhZ2U9ZnVuY3Rpb24odCl7dmFyIG49dC5kYXRhLG89SlNPTi5wYXJzZShuKSxyPW8uc2VxdWVuY2U7dm9pZCAwPT09ciYmdm9pZCAwPT09by5jbWQ/KGUuc3pVVUlEPW8udXVpZCxlLnN6VmVyc2lvbj1vLnZlcnNpb24sZS5vT3B0aW9ucy5jYkNvbm5lY3RTdWNjZXNzJiZlLm9PcHRpb25zLmNiQ29ubmVjdFN1Y2Nlc3MoKSk6dm9pZCAwIT09by5jbWQ/ZS5wYXJzZUNtZChvKTp2b2lkIDAhPT1lLm9SZXF1ZXN0TGlzdFtyXSYmKDA9PT1vLmVycm9yTW9kdWxlJiYwPT09by5lcnJvckNvZGU/ZS5vUmVxdWVzdExpc3Rbcl0ucmVzb2x2ZShvKTplLm9SZXF1ZXN0TGlzdFtyXS5yZWplY3QobyksZGVsZXRlIGUub1JlcXVlc3RMaXN0W3JdKX0sZS5vV2ViU29ja2V0Lm9uY2xvc2U9ZnVuY3Rpb24oKXtlLm9XZWJTb2NrZXQ9bnVsbCxwZi5icm93c2VyKCkubW96aWxsYT9zZXRUaW1lb3V0KChmdW5jdGlvbigpe3QoKX0pLDEwMCk6dCgpfX19LHtrZXk6InNldFdpbmRvd0NvbnRyb2xDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5vV2luZG93Q29udHJvbENhbGxiYWNrPWV9fSx7a2V5OiJzZXRTYWRwQ2FsbGJhY2siLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMub1NhZHBDYWxsYmFjaz1lfX0se2tleToic2V0U2xpY2VDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5vU2xpY2VDYWxsYmFjaz1lfX0se2tleToic2V0U2VyaWFsQ2FsbGJhY2siLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMub1NlcmlhbENhbGxiYWNrPWV9fSx7a2V5OiJzZXRVSUNvbnRyb2xDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5vVUlDb250cm9sQ2FsbGJhY2s9ZX19LHtrZXk6InNldFVwZ3JhZGVDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5vVXBncmFkZUNhbGxiYWNrPWV9fSx7a2V5OiJnZXRTZXJ2aWNlVmVyc2lvbiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zelZlcnNpb259fSx7a2V5OiJnZXRSZXF1ZXN0VVVJRCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zelVVSUR9fSx7a2V5OiJkaXNjb25uZWN0Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuYk5vcm1hbENsb3NlPSEwLHRoaXMub1dlYlNvY2tldCYmV2ViU29ja2V0Lk9QRU49PT10aGlzLm9XZWJTb2NrZXQucmVhZHlTdGF0ZSYmKHRoaXMub1dlYlNvY2tldC5jbG9zZSgpLGRlbGV0ZSB0aGlzLm9XZWJTb2NrZXQpfX0se2tleToic2VuZFJlcXVlc3QiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihuLG8pe3ZhciByPUlkKCk7ZS5zZXF1ZW5jZT1yLHQub1JlcXVlc3RMaXN0W3JdPXtyZXNvbHZlOm4scmVqZWN0Om99LGUudXVpZD10LnN6VVVJRCxlLnRpbWVzdGFtcD0iIi5jb25jYXQoKG5ldyBEYXRlKS5nZXRUaW1lKCkpO3ZhciBpPUpTT04uc3RyaW5naWZ5KGUpO3Qub1dlYlNvY2tldCYmV2ViU29ja2V0Lk9QRU49PT10Lm9XZWJTb2NrZXQucmVhZHlTdGF0ZT90Lm9XZWJTb2NrZXQuc2VuZChpKTpvKCl9KSl9fSx7a2V5OiJwYXJzZUNtZCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jbWQuc3BsaXQoIi4iKSxuPXRbMV0ucmVwbGFjZSgvXlthLXpdezF9L2csKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRvVXBwZXJDYXNlKCl9KSk7IndpbmRvdyI9PT10WzBdfHwicGxheSI9PT10WzBdP3RoaXMub1dpbmRvd0NvbnRyb2xDYWxsYmFja1siY2IiLmNvbmNhdChuKV0mJnRoaXMub1dpbmRvd0NvbnRyb2xDYWxsYmFja1siY2IiLmNvbmNhdChuKV0oZSk6InNhZHAiPT09dFswXT90aGlzLm9TYWRwQ2FsbGJhY2tbImNiIi5jb25jYXQobildJiZ0aGlzLm9TYWRwQ2FsbGJhY2tbImNiIi5jb25jYXQobildKGUpOiJzZXJpYWwiPT09dFswXT90aGlzLm9TZXJpYWxDYWxsYmFja1siY2IiLmNvbmNhdChuKV0mJnRoaXMub1NlcmlhbENhbGxiYWNrWyJjYiIuY29uY2F0KG4pXShlKToic2xpY2UiPT09dFswXT90aGlzLm9TbGljZUNhbGxiYWNrWyJjYiIuY29uY2F0KG4pXSYmdGhpcy5vU2xpY2VDYWxsYmFja1siY2IiLmNvbmNhdChuKV0oZSk6InVpIj09PXRbMF0/dGhpcy5vVUlDb250cm9sQ2FsbGJhY2tbImNiIi5jb25jYXQobildJiZ0aGlzLm9VSUNvbnRyb2xDYWxsYmFja1siY2IiLmNvbmNhdChuKV0oZSk6InVwZ3JhZGUiPT09dFswXSYmdGhpcy5vVXBncmFkZUNhbGxiYWNrWyJjYiIuY29uY2F0KG4pXSYmdGhpcy5vVXBncmFkZUNhbGxiYWNrWyJjYiIuY29uY2F0KG4pXShlKX19XSksZX0oKTsKLyohIHBha28gMi4wLjQgaHR0cHM6Ly9naXRodWIuY29tL25vZGVjYS9wYWtvIEBsaWNlbnNlIChNSVQgQU5EIFpsaWIpICovZnVuY3Rpb24gd2YoZSl7Zm9yKHZhciB0PWUubGVuZ3RoOy0tdD49MDspZVt0XT0wfXZhciBDZj0yNTYsa2Y9Mjg2LFNmPTMwLFJmPTE1LHFmPW5ldyBVaW50OEFycmF5KFswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDBdKSxJZj1uZXcgVWludDhBcnJheShbMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM10pLFBmPW5ldyBVaW50OEFycmF5KFswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMyw3XSksRWY9bmV3IFVpbnQ4QXJyYXkoWzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdKSxPZj1uZXcgQXJyYXkoNTc2KTt3ZihPZik7dmFyIFRmPW5ldyBBcnJheSg2MCk7d2YoVGYpO3ZhciB6Zj1uZXcgQXJyYXkoNTEyKTt3Zih6Zik7dmFyIEFmPW5ldyBBcnJheSgyNTYpO3dmKEFmKTt2YXIgVWY9bmV3IEFycmF5KDI5KTt3ZihVZik7dmFyIERmLHhmLFdmLEZmPW5ldyBBcnJheShTZik7ZnVuY3Rpb24gTWYoZSx0LG4sbyxyKXt0aGlzLnN0YXRpY190cmVlPWUsdGhpcy5leHRyYV9iaXRzPXQsdGhpcy5leHRyYV9iYXNlPW4sdGhpcy5lbGVtcz1vLHRoaXMubWF4X2xlbmd0aD1yLHRoaXMuaGFzX3N0cmVlPWUmJmUubGVuZ3RofWZ1bmN0aW9uIExmKGUsdCl7dGhpcy5keW5fdHJlZT1lLHRoaXMubWF4X2NvZGU9MCx0aGlzLnN0YXRfZGVzYz10fXdmKEZmKTt2YXIgSmY9ZnVuY3Rpb24oZSl7cmV0dXJuIGU8MjU2P3pmW2VdOnpmWzI1NisoZT4+PjcpXX0samY9ZnVuY3Rpb24oZSx0KXtlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT0yNTUmdCxlLnBlbmRpbmdfYnVmW2UucGVuZGluZysrXT10Pj4+OCYyNTV9LE5mPWZ1bmN0aW9uKGUsdCxuKXtlLmJpX3ZhbGlkPjE2LW4/KGUuYmlfYnVmfD10PDxlLmJpX3ZhbGlkJjY1NTM1LGpmKGUsZS5iaV9idWYpLGUuYmlfYnVmPXQ+PjE2LWUuYmlfdmFsaWQsZS5iaV92YWxpZCs9bi0xNik6KGUuYmlfYnVmfD10PDxlLmJpX3ZhbGlkJjY1NTM1LGUuYmlfdmFsaWQrPW4pfSxCZj1mdW5jdGlvbihlLHQsbil7TmYoZSxuWzIqdF0sblsyKnQrMV0pfSxaZj1mdW5jdGlvbihlLHQpe3ZhciBuPTA7ZG97bnw9MSZlLGU+Pj49MSxuPDw9MX13aGlsZSgtLXQ+MCk7cmV0dXJuIG4+Pj4xfSxIZj1mdW5jdGlvbihlLHQsbil7dmFyIG8scixpPW5ldyBBcnJheSgxNikscz0wO2ZvcihvPTE7bzw9UmY7bysrKWlbb109cz1zK25bby0xXTw8MTtmb3Iocj0wO3I8PXQ7cisrKXt2YXIgYT1lWzIqcisxXTswIT09YSYmKGVbMipyXT1aZihpW2FdKyssYSkpfX0sR2Y9ZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKHQ9MDt0PGtmO3QrKyllLmR5bl9sdHJlZVsyKnRdPTA7Zm9yKHQ9MDt0PFNmO3QrKyllLmR5bl9kdHJlZVsyKnRdPTA7Zm9yKHQ9MDt0PDE5O3QrKyllLmJsX3RyZWVbMip0XT0wO2UuZHluX2x0cmVlWzUxMl09MSxlLm9wdF9sZW49ZS5zdGF0aWNfbGVuPTAsZS5sYXN0X2xpdD1lLm1hdGNoZXM9MH0sVmY9ZnVuY3Rpb24oZSl7ZS5iaV92YWxpZD44P2pmKGUsZS5iaV9idWYpOmUuYmlfdmFsaWQ+MCYmKGUucGVuZGluZ19idWZbZS5wZW5kaW5nKytdPWUuYmlfYnVmKSxlLmJpX2J1Zj0wLGUuYmlfdmFsaWQ9MH0sWGY9ZnVuY3Rpb24oZSx0LG4sbyl7dmFyIHI9Mip0LGk9MipuO3JldHVybiBlW3JdPGVbaV18fGVbcl09PT1lW2ldJiZvW3RdPD1vW25dfSxZZj1mdW5jdGlvbihlLHQsbil7Zm9yKHZhciBvPWUuaGVhcFtuXSxyPW48PDE7cjw9ZS5oZWFwX2xlbiYmKHI8ZS5oZWFwX2xlbiYmWGYodCxlLmhlYXBbcisxXSxlLmhlYXBbcl0sZS5kZXB0aCkmJnIrKywhWGYodCxvLGUuaGVhcFtyXSxlLmRlcHRoKSk7KWUuaGVhcFtuXT1lLmhlYXBbcl0sbj1yLHI8PD0xO2UuaGVhcFtuXT1vfSxLZj1mdW5jdGlvbihlLHQsbil7dmFyIG8scixpLHMsYT0wO2lmKDAhPT1lLmxhc3RfbGl0KWRve289ZS5wZW5kaW5nX2J1ZltlLmRfYnVmKzIqYV08PDh8ZS5wZW5kaW5nX2J1ZltlLmRfYnVmKzIqYSsxXSxyPWUucGVuZGluZ19idWZbZS5sX2J1ZithXSxhKyssMD09PW8/QmYoZSxyLHQpOihpPUFmW3JdLEJmKGUsaStDZisxLHQpLDAhPT0ocz1xZltpXSkmJihyLT1VZltpXSxOZihlLHIscykpLG8tLSxpPUpmKG8pLEJmKGUsaSxuKSwwIT09KHM9SWZbaV0pJiYoby09RmZbaV0sTmYoZSxvLHMpKSl9d2hpbGUoYTxlLmxhc3RfbGl0KTtCZihlLDI1Nix0KX0sJGY9ZnVuY3Rpb24oZSx0KXt2YXIgbixvLHIsaT10LmR5bl90cmVlLHM9dC5zdGF0X2Rlc2Muc3RhdGljX3RyZWUsYT10LnN0YXRfZGVzYy5oYXNfc3RyZWUsdT10LnN0YXRfZGVzYy5lbGVtcyxjPS0xO2ZvcihlLmhlYXBfbGVuPTAsZS5oZWFwX21heD01NzMsbj0wO248dTtuKyspMCE9PWlbMipuXT8oZS5oZWFwWysrZS5oZWFwX2xlbl09Yz1uLGUuZGVwdGhbbl09MCk6aVsyKm4rMV09MDtmb3IoO2UuaGVhcF9sZW48MjspaVsyKihyPWUuaGVhcFsrK2UuaGVhcF9sZW5dPWM8Mj8rK2M6MCldPTEsZS5kZXB0aFtyXT0wLGUub3B0X2xlbi0tLGEmJihlLnN0YXRpY19sZW4tPXNbMipyKzFdKTtmb3IodC5tYXhfY29kZT1jLG49ZS5oZWFwX2xlbj4+MTtuPj0xO24tLSlZZihlLGksbik7cj11O2Rve249ZS5oZWFwWzFdLGUuaGVhcFsxXT1lLmhlYXBbZS5oZWFwX2xlbi0tXSxZZihlLGksMSksbz1lLmhlYXBbMV0sZS5oZWFwWy0tZS5oZWFwX21heF09bixlLmhlYXBbLS1lLmhlYXBfbWF4XT1vLGlbMipyXT1pWzIqbl0raVsyKm9dLGUuZGVwdGhbcl09KGUuZGVwdGhbbl0+PWUuZGVwdGhbb10/ZS5kZXB0aFtuXTplLmRlcHRoW29dKSsxLGlbMipuKzFdPWlbMipvKzFdPXIsZS5oZWFwWzFdPXIrKyxZZihlLGksMSl9d2hpbGUoZS5oZWFwX2xlbj49Mik7ZS5oZWFwWy0tZS5oZWFwX21heF09ZS5oZWFwWzFdLGZ1bmN0aW9uKGUsdCl7dmFyIG4sbyxyLGkscyxhLHU9dC5keW5fdHJlZSxjPXQubWF4X2NvZGUsbD10LnN0YXRfZGVzYy5zdGF0aWNfdHJlZSxkPXQuc3RhdF9kZXNjLmhhc19zdHJlZSxmPXQuc3RhdF9kZXNjLmV4dHJhX2JpdHMsaD10LnN0YXRfZGVzYy5leHRyYV9iYXNlLHA9dC5zdGF0X2Rlc2MubWF4X2xlbmd0aCx2PTA7Zm9yKGk9MDtpPD1SZjtpKyspZS5ibF9jb3VudFtpXT0wO2Zvcih1WzIqZS5oZWFwW2UuaGVhcF9tYXhdKzFdPTAsbj1lLmhlYXBfbWF4KzE7bjw1NzM7bisrKShpPXVbMip1WzIqKG89ZS5oZWFwW25dKSsxXSsxXSsxKT5wJiYoaT1wLHYrKyksdVsyKm8rMV09aSxvPmN8fChlLmJsX2NvdW50W2ldKysscz0wLG8+PWgmJihzPWZbby1oXSksYT11WzIqb10sZS5vcHRfbGVuKz1hKihpK3MpLGQmJihlLnN0YXRpY19sZW4rPWEqKGxbMipvKzFdK3MpKSk7aWYoMCE9PXYpe2Rve2ZvcihpPXAtMTswPT09ZS5ibF9jb3VudFtpXTspaS0tO2UuYmxfY291bnRbaV0tLSxlLmJsX2NvdW50W2krMV0rPTIsZS5ibF9jb3VudFtwXS0tLHYtPTJ9d2hpbGUodj4wKTtmb3IoaT1wOzAhPT1pO2ktLSlmb3Iobz1lLmJsX2NvdW50W2ldOzAhPT1vOykocj1lLmhlYXBbLS1uXSk+Y3x8KHVbMipyKzFdIT09aSYmKGUub3B0X2xlbis9KGktdVsyKnIrMV0pKnVbMipyXSx1WzIqcisxXT1pKSxvLS0pfX0oZSx0KSxIZihpLGMsZS5ibF9jb3VudCl9LFFmPWZ1bmN0aW9uKGUsdCxuKXt2YXIgbyxyLGk9LTEscz10WzFdLGE9MCx1PTcsYz00O2ZvcigwPT09cyYmKHU9MTM4LGM9MyksdFsyKihuKzEpKzFdPTY1NTM1LG89MDtvPD1uO28rKylyPXMscz10WzIqKG8rMSkrMV0sKythPHUmJnI9PT1zfHwoYTxjP2UuYmxfdHJlZVsyKnJdKz1hOjAhPT1yPyhyIT09aSYmZS5ibF90cmVlWzIqcl0rKyxlLmJsX3RyZWVbMzJdKyspOmE8PTEwP2UuYmxfdHJlZVszNF0rKzplLmJsX3RyZWVbMzZdKyssYT0wLGk9ciwwPT09cz8odT0xMzgsYz0zKTpyPT09cz8odT02LGM9Myk6KHU9NyxjPTQpKX0sZWg9ZnVuY3Rpb24oZSx0LG4pe3ZhciBvLHIsaT0tMSxzPXRbMV0sYT0wLHU9NyxjPTQ7Zm9yKDA9PT1zJiYodT0xMzgsYz0zKSxvPTA7bzw9bjtvKyspaWYocj1zLHM9dFsyKihvKzEpKzFdLCEoKythPHUmJnI9PT1zKSl7aWYoYTxjKWRve0JmKGUscixlLmJsX3RyZWUpfXdoaWxlKDAhPS0tYSk7ZWxzZSAwIT09cj8ociE9PWkmJihCZihlLHIsZS5ibF90cmVlKSxhLS0pLEJmKGUsMTYsZS5ibF90cmVlKSxOZihlLGEtMywyKSk6YTw9MTA/KEJmKGUsMTcsZS5ibF90cmVlKSxOZihlLGEtMywzKSk6KEJmKGUsMTgsZS5ibF90cmVlKSxOZihlLGEtMTEsNykpO2E9MCxpPXIsMD09PXM/KHU9MTM4LGM9Myk6cj09PXM/KHU9NixjPTMpOih1PTcsYz00KX19LHRoPSExLG5oPWZ1bmN0aW9uKGUsdCxuLG8pe05mKGUsMCsobz8xOjApLDMpLGZ1bmN0aW9uKGUsdCxuLG8pe1ZmKGUpLG8mJihqZihlLG4pLGpmKGUsfm4pKSxlLnBlbmRpbmdfYnVmLnNldChlLndpbmRvdy5zdWJhcnJheSh0LHQrbiksZS5wZW5kaW5nKSxlLnBlbmRpbmcrPW59KGUsdCxuLCEwKX0sb2g9ZnVuY3Rpb24oZSx0LG4sbyl7dmFyIHIsaSxzPTA7ZS5sZXZlbD4wPygyPT09ZS5zdHJtLmRhdGFfdHlwZSYmKGUuc3RybS5kYXRhX3R5cGU9ZnVuY3Rpb24oZSl7dmFyIHQsbj00MDkzNjI0NDQ3O2Zvcih0PTA7dDw9MzE7dCsrLG4+Pj49MSlpZigxJm4mJjAhPT1lLmR5bl9sdHJlZVsyKnRdKXJldHVybiAwO2lmKDAhPT1lLmR5bl9sdHJlZVsxOF18fDAhPT1lLmR5bl9sdHJlZVsyMF18fDAhPT1lLmR5bl9sdHJlZVsyNl0pcmV0dXJuIDE7Zm9yKHQ9MzI7dDxDZjt0KyspaWYoMCE9PWUuZHluX2x0cmVlWzIqdF0pcmV0dXJuIDE7cmV0dXJuIDB9KGUpKSwkZihlLGUubF9kZXNjKSwkZihlLGUuZF9kZXNjKSxzPWZ1bmN0aW9uKGUpe3ZhciB0O2ZvcihRZihlLGUuZHluX2x0cmVlLGUubF9kZXNjLm1heF9jb2RlKSxRZihlLGUuZHluX2R0cmVlLGUuZF9kZXNjLm1heF9jb2RlKSwkZihlLGUuYmxfZGVzYyksdD0xODt0Pj0zJiYwPT09ZS5ibF90cmVlWzIqRWZbdF0rMV07dC0tKTtyZXR1cm4gZS5vcHRfbGVuKz0zKih0KzEpKzUrNSs0LHR9KGUpLHI9ZS5vcHRfbGVuKzMrNz4+PjMsKGk9ZS5zdGF0aWNfbGVuKzMrNz4+PjMpPD1yJiYocj1pKSk6cj1pPW4rNSxuKzQ8PXImJi0xIT09dD9uaChlLHQsbixvKTo0PT09ZS5zdHJhdGVneXx8aT09PXI/KE5mKGUsMisobz8xOjApLDMpLEtmKGUsT2YsVGYpKTooTmYoZSw0KyhvPzE6MCksMyksZnVuY3Rpb24oZSx0LG4sbyl7dmFyIHI7Zm9yKE5mKGUsdC0yNTcsNSksTmYoZSxuLTEsNSksTmYoZSxvLTQsNCkscj0wO3I8bztyKyspTmYoZSxlLmJsX3RyZWVbMipFZltyXSsxXSwzKTtlaChlLGUuZHluX2x0cmVlLHQtMSksZWgoZSxlLmR5bl9kdHJlZSxuLTEpfShlLGUubF9kZXNjLm1heF9jb2RlKzEsZS5kX2Rlc2MubWF4X2NvZGUrMSxzKzEpLEtmKGUsZS5keW5fbHRyZWUsZS5keW5fZHRyZWUpKSxHZihlKSxvJiZWZihlKX0scmg9e190cl9pbml0OmZ1bmN0aW9uKGUpe3RofHwoIWZ1bmN0aW9uKCl7dmFyIGUsdCxuLG8scixpPW5ldyBBcnJheSgxNik7Zm9yKG49MCxvPTA7bzwyODtvKyspZm9yKFVmW29dPW4sZT0wO2U8MTw8cWZbb107ZSsrKUFmW24rK109bztmb3IoQWZbbi0xXT1vLHI9MCxvPTA7bzwxNjtvKyspZm9yKEZmW29dPXIsZT0wO2U8MTw8SWZbb107ZSsrKXpmW3IrK109bztmb3Iocj4+PTc7bzxTZjtvKyspZm9yKEZmW29dPXI8PDcsZT0wO2U8MTw8SWZbb10tNztlKyspemZbMjU2K3IrK109bztmb3IodD0wO3Q8PVJmO3QrKylpW3RdPTA7Zm9yKGU9MDtlPD0xNDM7KU9mWzIqZSsxXT04LGUrKyxpWzhdKys7Zm9yKDtlPD0yNTU7KU9mWzIqZSsxXT05LGUrKyxpWzldKys7Zm9yKDtlPD0yNzk7KU9mWzIqZSsxXT03LGUrKyxpWzddKys7Zm9yKDtlPD0yODc7KU9mWzIqZSsxXT04LGUrKyxpWzhdKys7Zm9yKEhmKE9mLDI4NyxpKSxlPTA7ZTxTZjtlKyspVGZbMiplKzFdPTUsVGZbMiplXT1aZihlLDUpO0RmPW5ldyBNZihPZixxZiwyNTcsa2YsUmYpLHhmPW5ldyBNZihUZixJZiwwLFNmLFJmKSxXZj1uZXcgTWYobmV3IEFycmF5KDApLFBmLDAsMTksNyl9KCksdGg9ITApLGUubF9kZXNjPW5ldyBMZihlLmR5bl9sdHJlZSxEZiksZS5kX2Rlc2M9bmV3IExmKGUuZHluX2R0cmVlLHhmKSxlLmJsX2Rlc2M9bmV3IExmKGUuYmxfdHJlZSxXZiksZS5iaV9idWY9MCxlLmJpX3ZhbGlkPTAsR2YoZSl9LF90cl9zdG9yZWRfYmxvY2s6bmgsX3RyX2ZsdXNoX2Jsb2NrOm9oLF90cl90YWxseTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGUucGVuZGluZ19idWZbZS5kX2J1ZisyKmUubGFzdF9saXRdPXQ+Pj44JjI1NSxlLnBlbmRpbmdfYnVmW2UuZF9idWYrMiplLmxhc3RfbGl0KzFdPTI1NSZ0LGUucGVuZGluZ19idWZbZS5sX2J1ZitlLmxhc3RfbGl0XT0yNTUmbixlLmxhc3RfbGl0KyssMD09PXQ/ZS5keW5fbHRyZWVbMipuXSsrOihlLm1hdGNoZXMrKyx0LS0sZS5keW5fbHRyZWVbMiooQWZbbl0rQ2YrMSldKyssZS5keW5fZHRyZWVbMipKZih0KV0rKyksZS5sYXN0X2xpdD09PWUubGl0X2J1ZnNpemUtMX0sX3RyX2FsaWduOmZ1bmN0aW9uKGUpe05mKGUsMiwzKSxCZihlLDI1NixPZiksZnVuY3Rpb24oZSl7MTY9PT1lLmJpX3ZhbGlkPyhqZihlLGUuYmlfYnVmKSxlLmJpX2J1Zj0wLGUuYmlfdmFsaWQ9MCk6ZS5iaV92YWxpZD49OCYmKGUucGVuZGluZ19idWZbZS5wZW5kaW5nKytdPTI1NSZlLmJpX2J1ZixlLmJpX2J1Zj4+PTgsZS5iaV92YWxpZC09OCl9KGUpfX0saWg9ZnVuY3Rpb24oZSx0LG4sbyl7Zm9yKHZhciByPTY1NTM1JmV8MCxpPWU+Pj4xNiY2NTUzNXwwLHM9MDswIT09bjspe24tPXM9bj4yZTM/MmUzOm47ZG97aT1pKyhyPXIrdFtvKytdfDApfDB9d2hpbGUoLS1zKTtyJT02NTUyMSxpJT02NTUyMX1yZXR1cm4gcnxpPDwxNnwwfSxzaD1uZXcgVWludDMyQXJyYXkoZnVuY3Rpb24oKXtmb3IodmFyIGUsdD1bXSxuPTA7bjwyNTY7bisrKXtlPW47Zm9yKHZhciBvPTA7bzw4O28rKyllPTEmZT8zOTg4MjkyMzg0XmU+Pj4xOmU+Pj4xO3Rbbl09ZX1yZXR1cm4gdH0oKSksYWg9ZnVuY3Rpb24oZSx0LG4sbyl7dmFyIHI9c2gsaT1vK247ZV49LTE7Zm9yKHZhciBzPW87czxpO3MrKyllPWU+Pj44XnJbMjU1JihlXnRbc10pXTtyZXR1cm4tMV5lfSx1aD17MjoibmVlZCBkaWN0aW9uYXJ5IiwxOiJzdHJlYW0gZW5kIiwwOiIiLCItMSI6ImZpbGUgZXJyb3IiLCItMiI6InN0cmVhbSBlcnJvciIsIi0zIjoiZGF0YSBlcnJvciIsIi00IjoiaW5zdWZmaWNpZW50IG1lbW9yeSIsIi01IjoiYnVmZmVyIGVycm9yIiwiLTYiOiJpbmNvbXBhdGlibGUgdmVyc2lvbiJ9LGNoPXtaX05PX0ZMVVNIOjAsWl9QQVJUSUFMX0ZMVVNIOjEsWl9TWU5DX0ZMVVNIOjIsWl9GVUxMX0ZMVVNIOjMsWl9GSU5JU0g6NCxaX0JMT0NLOjUsWl9UUkVFUzo2LFpfT0s6MCxaX1NUUkVBTV9FTkQ6MSxaX05FRURfRElDVDoyLFpfRVJSTk86LTEsWl9TVFJFQU1fRVJST1I6LTIsWl9EQVRBX0VSUk9SOi0zLFpfTUVNX0VSUk9SOi00LFpfQlVGX0VSUk9SOi01LFpfTk9fQ09NUFJFU1NJT046MCxaX0JFU1RfU1BFRUQ6MSxaX0JFU1RfQ09NUFJFU1NJT046OSxaX0RFRkFVTFRfQ09NUFJFU1NJT046LTEsWl9GSUxURVJFRDoxLFpfSFVGRk1BTl9PTkxZOjIsWl9STEU6MyxaX0ZJWEVEOjQsWl9ERUZBVUxUX1NUUkFURUdZOjAsWl9CSU5BUlk6MCxaX1RFWFQ6MSxaX1VOS05PV046MixaX0RFRkxBVEVEOjh9LGxoPXJoLl90cl9pbml0LGRoPXJoLl90cl9zdG9yZWRfYmxvY2ssZmg9cmguX3RyX2ZsdXNoX2Jsb2NrLGhoPXJoLl90cl90YWxseSxwaD1yaC5fdHJfYWxpZ24sdmg9Y2guWl9OT19GTFVTSCxiaD1jaC5aX1BBUlRJQUxfRkxVU0gsZ2g9Y2guWl9GVUxMX0ZMVVNILG1oPWNoLlpfRklOSVNILHloPWNoLlpfQkxPQ0ssX2g9Y2guWl9PSyx3aD1jaC5aX1NUUkVBTV9FTkQsQ2g9Y2guWl9TVFJFQU1fRVJST1Isa2g9Y2guWl9EQVRBX0VSUk9SLFNoPWNoLlpfQlVGX0VSUk9SLFJoPWNoLlpfREVGQVVMVF9DT01QUkVTU0lPTixxaD1jaC5aX0ZJTFRFUkVELEloPWNoLlpfSFVGRk1BTl9PTkxZLFBoPWNoLlpfUkxFLEVoPWNoLlpfRklYRUQsT2g9Y2guWl9ERUZBVUxUX1NUUkFURUdZLFRoPWNoLlpfVU5LTk9XTix6aD1jaC5aX0RFRkxBVEVELEFoPTI1OCxVaD0yNjIsRGg9MTAzLHhoPTExMyxXaD02NjYsRmg9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5tc2c9dWhbdF0sdH0sTWg9ZnVuY3Rpb24oZSl7cmV0dXJuKGU8PDEpLShlPjQ/OTowKX0sTGg9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWUubGVuZ3RoOy0tdD49MDspZVt0XT0wfSxKaD1mdW5jdGlvbihlLHQsbil7cmV0dXJuKHQ8PGUuaGFzaF9zaGlmdF5uKSZlLmhhc2hfbWFza30samg9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zdGF0ZSxuPXQucGVuZGluZztuPmUuYXZhaWxfb3V0JiYobj1lLmF2YWlsX291dCksMCE9PW4mJihlLm91dHB1dC5zZXQodC5wZW5kaW5nX2J1Zi5zdWJhcnJheSh0LnBlbmRpbmdfb3V0LHQucGVuZGluZ19vdXQrbiksZS5uZXh0X291dCksZS5uZXh0X291dCs9bix0LnBlbmRpbmdfb3V0Kz1uLGUudG90YWxfb3V0Kz1uLGUuYXZhaWxfb3V0LT1uLHQucGVuZGluZy09biwwPT09dC5wZW5kaW5nJiYodC5wZW5kaW5nX291dD0wKSl9LE5oPWZ1bmN0aW9uKGUsdCl7ZmgoZSxlLmJsb2NrX3N0YXJ0Pj0wP2UuYmxvY2tfc3RhcnQ6LTEsZS5zdHJzdGFydC1lLmJsb2NrX3N0YXJ0LHQpLGUuYmxvY2tfc3RhcnQ9ZS5zdHJzdGFydCxqaChlLnN0cm0pfSxCaD1mdW5jdGlvbihlLHQpe2UucGVuZGluZ19idWZbZS5wZW5kaW5nKytdPXR9LFpoPWZ1bmN0aW9uKGUsdCl7ZS5wZW5kaW5nX2J1ZltlLnBlbmRpbmcrK109dD4+PjgmMjU1LGUucGVuZGluZ19idWZbZS5wZW5kaW5nKytdPTI1NSZ0fSxIaD1mdW5jdGlvbihlLHQpe3ZhciBuLG8scj1lLm1heF9jaGFpbl9sZW5ndGgsaT1lLnN0cnN0YXJ0LHM9ZS5wcmV2X2xlbmd0aCxhPWUubmljZV9tYXRjaCx1PWUuc3Ryc3RhcnQ+ZS53X3NpemUtVWg/ZS5zdHJzdGFydC0oZS53X3NpemUtVWgpOjAsYz1lLndpbmRvdyxsPWUud19tYXNrLGQ9ZS5wcmV2LGY9ZS5zdHJzdGFydCtBaCxoPWNbaStzLTFdLHA9Y1tpK3NdO2UucHJldl9sZW5ndGg+PWUuZ29vZF9tYXRjaCYmKHI+Pj0yKSxhPmUubG9va2FoZWFkJiYoYT1lLmxvb2thaGVhZCk7ZG97aWYoY1sobj10KStzXT09PXAmJmNbbitzLTFdPT09aCYmY1tuXT09PWNbaV0mJmNbKytuXT09PWNbaSsxXSl7aSs9MixuKys7ZG97fXdoaWxlKGNbKytpXT09PWNbKytuXSYmY1srK2ldPT09Y1srK25dJiZjWysraV09PT1jWysrbl0mJmNbKytpXT09PWNbKytuXSYmY1srK2ldPT09Y1srK25dJiZjWysraV09PT1jWysrbl0mJmNbKytpXT09PWNbKytuXSYmY1srK2ldPT09Y1srK25dJiZpPGYpO2lmKG89QWgtKGYtaSksaT1mLUFoLG8+cyl7aWYoZS5tYXRjaF9zdGFydD10LHM9byxvPj1hKWJyZWFrO2g9Y1tpK3MtMV0scD1jW2krc119fX13aGlsZSgodD1kW3QmbF0pPnUmJjAhPS0tcik7cmV0dXJuIHM8PWUubG9va2FoZWFkP3M6ZS5sb29rYWhlYWR9LEdoPWZ1bmN0aW9uKGUpe3ZhciB0LG4sbyxyLGkscyxhLHUsYyxsLGQ9ZS53X3NpemU7ZG97aWYocj1lLndpbmRvd19zaXplLWUubG9va2FoZWFkLWUuc3Ryc3RhcnQsZS5zdHJzdGFydD49ZCsoZC1VaCkpe2Uud2luZG93LnNldChlLndpbmRvdy5zdWJhcnJheShkLGQrZCksMCksZS5tYXRjaF9zdGFydC09ZCxlLnN0cnN0YXJ0LT1kLGUuYmxvY2tfc3RhcnQtPWQsdD1uPWUuaGFzaF9zaXplO2Rve289ZS5oZWFkWy0tdF0sZS5oZWFkW3RdPW8+PWQ/by1kOjB9d2hpbGUoLS1uKTt0PW49ZDtkb3tvPWUucHJldlstLXRdLGUucHJldlt0XT1vPj1kP28tZDowfXdoaWxlKC0tbik7cis9ZH1pZigwPT09ZS5zdHJtLmF2YWlsX2luKWJyZWFrO2lmKHM9ZS5zdHJtLGE9ZS53aW5kb3csdT1lLnN0cnN0YXJ0K2UubG9va2FoZWFkLGM9cixsPXZvaWQgMCwobD1zLmF2YWlsX2luKT5jJiYobD1jKSxuPTA9PT1sPzA6KHMuYXZhaWxfaW4tPWwsYS5zZXQocy5pbnB1dC5zdWJhcnJheShzLm5leHRfaW4scy5uZXh0X2luK2wpLHUpLDE9PT1zLnN0YXRlLndyYXA/cy5hZGxlcj1paChzLmFkbGVyLGEsbCx1KToyPT09cy5zdGF0ZS53cmFwJiYocy5hZGxlcj1haChzLmFkbGVyLGEsbCx1KSkscy5uZXh0X2luKz1sLHMudG90YWxfaW4rPWwsbCksZS5sb29rYWhlYWQrPW4sZS5sb29rYWhlYWQrZS5pbnNlcnQ+PTMpZm9yKGk9ZS5zdHJzdGFydC1lLmluc2VydCxlLmluc19oPWUud2luZG93W2ldLGUuaW5zX2g9SmgoZSxlLmluc19oLGUud2luZG93W2krMV0pO2UuaW5zZXJ0JiYoZS5pbnNfaD1KaChlLGUuaW5zX2gsZS53aW5kb3dbaSszLTFdKSxlLnByZXZbaSZlLndfbWFza109ZS5oZWFkW2UuaW5zX2hdLGUuaGVhZFtlLmluc19oXT1pLGkrKyxlLmluc2VydC0tLCEoZS5sb29rYWhlYWQrZS5pbnNlcnQ8MykpOyk7fXdoaWxlKGUubG9va2FoZWFkPFVoJiYwIT09ZS5zdHJtLmF2YWlsX2luKX0sVmg9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4sbzs7KXtpZihlLmxvb2thaGVhZDxVaCl7aWYoR2goZSksZS5sb29rYWhlYWQ8VWgmJnQ9PT12aClyZXR1cm4gMTtpZigwPT09ZS5sb29rYWhlYWQpYnJlYWt9aWYobj0wLGUubG9va2FoZWFkPj0zJiYoZS5pbnNfaD1KaChlLGUuaW5zX2gsZS53aW5kb3dbZS5zdHJzdGFydCszLTFdKSxuPWUucHJldltlLnN0cnN0YXJ0JmUud19tYXNrXT1lLmhlYWRbZS5pbnNfaF0sZS5oZWFkW2UuaW5zX2hdPWUuc3Ryc3RhcnQpLDAhPT1uJiZlLnN0cnN0YXJ0LW48PWUud19zaXplLVVoJiYoZS5tYXRjaF9sZW5ndGg9SGgoZSxuKSksZS5tYXRjaF9sZW5ndGg+PTMpaWYobz1oaChlLGUuc3Ryc3RhcnQtZS5tYXRjaF9zdGFydCxlLm1hdGNoX2xlbmd0aC0zKSxlLmxvb2thaGVhZC09ZS5tYXRjaF9sZW5ndGgsZS5tYXRjaF9sZW5ndGg8PWUubWF4X2xhenlfbWF0Y2gmJmUubG9va2FoZWFkPj0zKXtlLm1hdGNoX2xlbmd0aC0tO2Rve2Uuc3Ryc3RhcnQrKyxlLmluc19oPUpoKGUsZS5pbnNfaCxlLndpbmRvd1tlLnN0cnN0YXJ0KzMtMV0pLG49ZS5wcmV2W2Uuc3Ryc3RhcnQmZS53X21hc2tdPWUuaGVhZFtlLmluc19oXSxlLmhlYWRbZS5pbnNfaF09ZS5zdHJzdGFydH13aGlsZSgwIT0tLWUubWF0Y2hfbGVuZ3RoKTtlLnN0cnN0YXJ0Kyt9ZWxzZSBlLnN0cnN0YXJ0Kz1lLm1hdGNoX2xlbmd0aCxlLm1hdGNoX2xlbmd0aD0wLGUuaW5zX2g9ZS53aW5kb3dbZS5zdHJzdGFydF0sZS5pbnNfaD1KaChlLGUuaW5zX2gsZS53aW5kb3dbZS5zdHJzdGFydCsxXSk7ZWxzZSBvPWhoKGUsMCxlLndpbmRvd1tlLnN0cnN0YXJ0XSksZS5sb29rYWhlYWQtLSxlLnN0cnN0YXJ0Kys7aWYobyYmKE5oKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KSlyZXR1cm4gMX1yZXR1cm4gZS5pbnNlcnQ9ZS5zdHJzdGFydDwyP2Uuc3Ryc3RhcnQ6Mix0PT09bWg/KE5oKGUsITApLDA9PT1lLnN0cm0uYXZhaWxfb3V0PzM6NCk6ZS5sYXN0X2xpdCYmKE5oKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KT8xOjJ9LFhoPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuLG8scjs7KXtpZihlLmxvb2thaGVhZDxVaCl7aWYoR2goZSksZS5sb29rYWhlYWQ8VWgmJnQ9PT12aClyZXR1cm4gMTtpZigwPT09ZS5sb29rYWhlYWQpYnJlYWt9aWYobj0wLGUubG9va2FoZWFkPj0zJiYoZS5pbnNfaD1KaChlLGUuaW5zX2gsZS53aW5kb3dbZS5zdHJzdGFydCszLTFdKSxuPWUucHJldltlLnN0cnN0YXJ0JmUud19tYXNrXT1lLmhlYWRbZS5pbnNfaF0sZS5oZWFkW2UuaW5zX2hdPWUuc3Ryc3RhcnQpLGUucHJldl9sZW5ndGg9ZS5tYXRjaF9sZW5ndGgsZS5wcmV2X21hdGNoPWUubWF0Y2hfc3RhcnQsZS5tYXRjaF9sZW5ndGg9MiwwIT09biYmZS5wcmV2X2xlbmd0aDxlLm1heF9sYXp5X21hdGNoJiZlLnN0cnN0YXJ0LW48PWUud19zaXplLVVoJiYoZS5tYXRjaF9sZW5ndGg9SGgoZSxuKSxlLm1hdGNoX2xlbmd0aDw9NSYmKGUuc3RyYXRlZ3k9PT1xaHx8Mz09PWUubWF0Y2hfbGVuZ3RoJiZlLnN0cnN0YXJ0LWUubWF0Y2hfc3RhcnQ+NDA5NikmJihlLm1hdGNoX2xlbmd0aD0yKSksZS5wcmV2X2xlbmd0aD49MyYmZS5tYXRjaF9sZW5ndGg8PWUucHJldl9sZW5ndGgpe3I9ZS5zdHJzdGFydCtlLmxvb2thaGVhZC0zLG89aGgoZSxlLnN0cnN0YXJ0LTEtZS5wcmV2X21hdGNoLGUucHJldl9sZW5ndGgtMyksZS5sb29rYWhlYWQtPWUucHJldl9sZW5ndGgtMSxlLnByZXZfbGVuZ3RoLT0yO2RveysrZS5zdHJzdGFydDw9ciYmKGUuaW5zX2g9SmgoZSxlLmluc19oLGUud2luZG93W2Uuc3Ryc3RhcnQrMy0xXSksbj1lLnByZXZbZS5zdHJzdGFydCZlLndfbWFza109ZS5oZWFkW2UuaW5zX2hdLGUuaGVhZFtlLmluc19oXT1lLnN0cnN0YXJ0KX13aGlsZSgwIT0tLWUucHJldl9sZW5ndGgpO2lmKGUubWF0Y2hfYXZhaWxhYmxlPTAsZS5tYXRjaF9sZW5ndGg9MixlLnN0cnN0YXJ0KyssbyYmKE5oKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KSlyZXR1cm4gMX1lbHNlIGlmKGUubWF0Y2hfYXZhaWxhYmxlKXtpZigobz1oaChlLDAsZS53aW5kb3dbZS5zdHJzdGFydC0xXSkpJiZOaChlLCExKSxlLnN0cnN0YXJ0KyssZS5sb29rYWhlYWQtLSwwPT09ZS5zdHJtLmF2YWlsX291dClyZXR1cm4gMX1lbHNlIGUubWF0Y2hfYXZhaWxhYmxlPTEsZS5zdHJzdGFydCsrLGUubG9va2FoZWFkLS19cmV0dXJuIGUubWF0Y2hfYXZhaWxhYmxlJiYobz1oaChlLDAsZS53aW5kb3dbZS5zdHJzdGFydC0xXSksZS5tYXRjaF9hdmFpbGFibGU9MCksZS5pbnNlcnQ9ZS5zdHJzdGFydDwyP2Uuc3Ryc3RhcnQ6Mix0PT09bWg/KE5oKGUsITApLDA9PT1lLnN0cm0uYXZhaWxfb3V0PzM6NCk6ZS5sYXN0X2xpdCYmKE5oKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KT8xOjJ9O2Z1bmN0aW9uIFloKGUsdCxuLG8scil7dGhpcy5nb29kX2xlbmd0aD1lLHRoaXMubWF4X2xhenk9dCx0aGlzLm5pY2VfbGVuZ3RoPW4sdGhpcy5tYXhfY2hhaW49byx0aGlzLmZ1bmM9cn12YXIgS2g9W25ldyBZaCgwLDAsMCwwLChmdW5jdGlvbihlLHQpe3ZhciBuPTY1NTM1O2ZvcihuPmUucGVuZGluZ19idWZfc2l6ZS01JiYobj1lLnBlbmRpbmdfYnVmX3NpemUtNSk7Oyl7aWYoZS5sb29rYWhlYWQ8PTEpe2lmKEdoKGUpLDA9PT1lLmxvb2thaGVhZCYmdD09PXZoKXJldHVybiAxO2lmKDA9PT1lLmxvb2thaGVhZClicmVha31lLnN0cnN0YXJ0Kz1lLmxvb2thaGVhZCxlLmxvb2thaGVhZD0wO3ZhciBvPWUuYmxvY2tfc3RhcnQrbjtpZigoMD09PWUuc3Ryc3RhcnR8fGUuc3Ryc3RhcnQ+PW8pJiYoZS5sb29rYWhlYWQ9ZS5zdHJzdGFydC1vLGUuc3Ryc3RhcnQ9byxOaChlLCExKSwwPT09ZS5zdHJtLmF2YWlsX291dCkpcmV0dXJuIDE7aWYoZS5zdHJzdGFydC1lLmJsb2NrX3N0YXJ0Pj1lLndfc2l6ZS1VaCYmKE5oKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KSlyZXR1cm4gMX1yZXR1cm4gZS5pbnNlcnQ9MCx0PT09bWg/KE5oKGUsITApLDA9PT1lLnN0cm0uYXZhaWxfb3V0PzM6NCk6KGUuc3Ryc3RhcnQ+ZS5ibG9ja19zdGFydCYmKE5oKGUsITEpLGUuc3RybS5hdmFpbF9vdXQpLDEpfSkpLG5ldyBZaCg0LDQsOCw0LFZoKSxuZXcgWWgoNCw1LDE2LDgsVmgpLG5ldyBZaCg0LDYsMzIsMzIsVmgpLG5ldyBZaCg0LDQsMTYsMTYsWGgpLG5ldyBZaCg4LDE2LDMyLDMyLFhoKSxuZXcgWWgoOCwxNiwxMjgsMTI4LFhoKSxuZXcgWWgoOCwzMiwxMjgsMjU2LFhoKSxuZXcgWWgoMzIsMTI4LDI1OCwxMDI0LFhoKSxuZXcgWWgoMzIsMjU4LDI1OCw0MDk2LFhoKV07ZnVuY3Rpb24gJGgoKXt0aGlzLnN0cm09bnVsbCx0aGlzLnN0YXR1cz0wLHRoaXMucGVuZGluZ19idWY9bnVsbCx0aGlzLnBlbmRpbmdfYnVmX3NpemU9MCx0aGlzLnBlbmRpbmdfb3V0PTAsdGhpcy5wZW5kaW5nPTAsdGhpcy53cmFwPTAsdGhpcy5nemhlYWQ9bnVsbCx0aGlzLmd6aW5kZXg9MCx0aGlzLm1ldGhvZD16aCx0aGlzLmxhc3RfZmx1c2g9LTEsdGhpcy53X3NpemU9MCx0aGlzLndfYml0cz0wLHRoaXMud19tYXNrPTAsdGhpcy53aW5kb3c9bnVsbCx0aGlzLndpbmRvd19zaXplPTAsdGhpcy5wcmV2PW51bGwsdGhpcy5oZWFkPW51bGwsdGhpcy5pbnNfaD0wLHRoaXMuaGFzaF9zaXplPTAsdGhpcy5oYXNoX2JpdHM9MCx0aGlzLmhhc2hfbWFzaz0wLHRoaXMuaGFzaF9zaGlmdD0wLHRoaXMuYmxvY2tfc3RhcnQ9MCx0aGlzLm1hdGNoX2xlbmd0aD0wLHRoaXMucHJldl9tYXRjaD0wLHRoaXMubWF0Y2hfYXZhaWxhYmxlPTAsdGhpcy5zdHJzdGFydD0wLHRoaXMubWF0Y2hfc3RhcnQ9MCx0aGlzLmxvb2thaGVhZD0wLHRoaXMucHJldl9sZW5ndGg9MCx0aGlzLm1heF9jaGFpbl9sZW5ndGg9MCx0aGlzLm1heF9sYXp5X21hdGNoPTAsdGhpcy5sZXZlbD0wLHRoaXMuc3RyYXRlZ3k9MCx0aGlzLmdvb2RfbWF0Y2g9MCx0aGlzLm5pY2VfbWF0Y2g9MCx0aGlzLmR5bl9sdHJlZT1uZXcgVWludDE2QXJyYXkoMTE0NiksdGhpcy5keW5fZHRyZWU9bmV3IFVpbnQxNkFycmF5KDEyMiksdGhpcy5ibF90cmVlPW5ldyBVaW50MTZBcnJheSg3OCksTGgodGhpcy5keW5fbHRyZWUpLExoKHRoaXMuZHluX2R0cmVlKSxMaCh0aGlzLmJsX3RyZWUpLHRoaXMubF9kZXNjPW51bGwsdGhpcy5kX2Rlc2M9bnVsbCx0aGlzLmJsX2Rlc2M9bnVsbCx0aGlzLmJsX2NvdW50PW5ldyBVaW50MTZBcnJheSgxNiksdGhpcy5oZWFwPW5ldyBVaW50MTZBcnJheSg1NzMpLExoKHRoaXMuaGVhcCksdGhpcy5oZWFwX2xlbj0wLHRoaXMuaGVhcF9tYXg9MCx0aGlzLmRlcHRoPW5ldyBVaW50MTZBcnJheSg1NzMpLExoKHRoaXMuZGVwdGgpLHRoaXMubF9idWY9MCx0aGlzLmxpdF9idWZzaXplPTAsdGhpcy5sYXN0X2xpdD0wLHRoaXMuZF9idWY9MCx0aGlzLm9wdF9sZW49MCx0aGlzLnN0YXRpY19sZW49MCx0aGlzLm1hdGNoZXM9MCx0aGlzLmluc2VydD0wLHRoaXMuYmlfYnVmPTAsdGhpcy5iaV92YWxpZD0wfXZhciBRaD1mdW5jdGlvbihlKXtpZighZXx8IWUuc3RhdGUpcmV0dXJuIEZoKGUsQ2gpO2UudG90YWxfaW49ZS50b3RhbF9vdXQ9MCxlLmRhdGFfdHlwZT1UaDt2YXIgdD1lLnN0YXRlO3JldHVybiB0LnBlbmRpbmc9MCx0LnBlbmRpbmdfb3V0PTAsdC53cmFwPDAmJih0LndyYXA9LXQud3JhcCksdC5zdGF0dXM9dC53cmFwPzQyOnhoLGUuYWRsZXI9Mj09PXQud3JhcD8wOjEsdC5sYXN0X2ZsdXNoPXZoLGxoKHQpLF9ofSxlcD1mdW5jdGlvbihlKXt2YXIgdCxuPVFoKGUpO3JldHVybiBuPT09X2gmJigodD1lLnN0YXRlKS53aW5kb3dfc2l6ZT0yKnQud19zaXplLExoKHQuaGVhZCksdC5tYXhfbGF6eV9tYXRjaD1LaFt0LmxldmVsXS5tYXhfbGF6eSx0Lmdvb2RfbWF0Y2g9S2hbdC5sZXZlbF0uZ29vZF9sZW5ndGgsdC5uaWNlX21hdGNoPUtoW3QubGV2ZWxdLm5pY2VfbGVuZ3RoLHQubWF4X2NoYWluX2xlbmd0aD1LaFt0LmxldmVsXS5tYXhfY2hhaW4sdC5zdHJzdGFydD0wLHQuYmxvY2tfc3RhcnQ9MCx0Lmxvb2thaGVhZD0wLHQuaW5zZXJ0PTAsdC5tYXRjaF9sZW5ndGg9dC5wcmV2X2xlbmd0aD0yLHQubWF0Y2hfYXZhaWxhYmxlPTAsdC5pbnNfaD0wKSxufSx0cD1mdW5jdGlvbihlLHQsbixvLHIsaSl7aWYoIWUpcmV0dXJuIENoO3ZhciBzPTE7aWYodD09PVJoJiYodD02KSxvPDA/KHM9MCxvPS1vKTpvPjE1JiYocz0yLG8tPTE2KSxyPDF8fHI+OXx8biE9PXpofHxvPDh8fG8+MTV8fHQ8MHx8dD45fHxpPDB8fGk+RWgpcmV0dXJuIEZoKGUsQ2gpOzg9PT1vJiYobz05KTt2YXIgYT1uZXcgJGg7cmV0dXJuIGUuc3RhdGU9YSxhLnN0cm09ZSxhLndyYXA9cyxhLmd6aGVhZD1udWxsLGEud19iaXRzPW8sYS53X3NpemU9MTw8YS53X2JpdHMsYS53X21hc2s9YS53X3NpemUtMSxhLmhhc2hfYml0cz1yKzcsYS5oYXNoX3NpemU9MTw8YS5oYXNoX2JpdHMsYS5oYXNoX21hc2s9YS5oYXNoX3NpemUtMSxhLmhhc2hfc2hpZnQ9fn4oKGEuaGFzaF9iaXRzKzMtMSkvMyksYS53aW5kb3c9bmV3IFVpbnQ4QXJyYXkoMiphLndfc2l6ZSksYS5oZWFkPW5ldyBVaW50MTZBcnJheShhLmhhc2hfc2l6ZSksYS5wcmV2PW5ldyBVaW50MTZBcnJheShhLndfc2l6ZSksYS5saXRfYnVmc2l6ZT0xPDxyKzYsYS5wZW5kaW5nX2J1Zl9zaXplPTQqYS5saXRfYnVmc2l6ZSxhLnBlbmRpbmdfYnVmPW5ldyBVaW50OEFycmF5KGEucGVuZGluZ19idWZfc2l6ZSksYS5kX2J1Zj0xKmEubGl0X2J1ZnNpemUsYS5sX2J1Zj0zKmEubGl0X2J1ZnNpemUsYS5sZXZlbD10LGEuc3RyYXRlZ3k9aSxhLm1ldGhvZD1uLGVwKGUpfSxucD1mdW5jdGlvbihlLHQpe3JldHVybiBlJiZlLnN0YXRlPzIhPT1lLnN0YXRlLndyYXA/Q2g6KGUuc3RhdGUuZ3poZWFkPXQsX2gpOkNofSxvcD1mdW5jdGlvbihlLHQpe3ZhciBuLG87aWYoIWV8fCFlLnN0YXRlfHx0PnlofHx0PDApcmV0dXJuIGU/RmgoZSxDaCk6Q2g7dmFyIHI9ZS5zdGF0ZTtpZighZS5vdXRwdXR8fCFlLmlucHV0JiYwIT09ZS5hdmFpbF9pbnx8ci5zdGF0dXM9PT1XaCYmdCE9PW1oKXJldHVybiBGaChlLDA9PT1lLmF2YWlsX291dD9TaDpDaCk7ci5zdHJtPWU7dmFyIGk9ci5sYXN0X2ZsdXNoO2lmKHIubGFzdF9mbHVzaD10LDQyPT09ci5zdGF0dXMpaWYoMj09PXIud3JhcCllLmFkbGVyPTAsQmgociwzMSksQmgociwxMzkpLEJoKHIsOCksci5nemhlYWQ/KEJoKHIsKHIuZ3poZWFkLnRleHQ/MTowKSsoci5nemhlYWQuaGNyYz8yOjApKyhyLmd6aGVhZC5leHRyYT80OjApKyhyLmd6aGVhZC5uYW1lPzg6MCkrKHIuZ3poZWFkLmNvbW1lbnQ/MTY6MCkpLEJoKHIsMjU1JnIuZ3poZWFkLnRpbWUpLEJoKHIsci5nemhlYWQudGltZT4+OCYyNTUpLEJoKHIsci5nemhlYWQudGltZT4+MTYmMjU1KSxCaChyLHIuZ3poZWFkLnRpbWU+PjI0JjI1NSksQmgociw5PT09ci5sZXZlbD8yOnIuc3RyYXRlZ3k+PUlofHxyLmxldmVsPDI/NDowKSxCaChyLDI1NSZyLmd6aGVhZC5vcyksci5nemhlYWQuZXh0cmEmJnIuZ3poZWFkLmV4dHJhLmxlbmd0aCYmKEJoKHIsMjU1JnIuZ3poZWFkLmV4dHJhLmxlbmd0aCksQmgocixyLmd6aGVhZC5leHRyYS5sZW5ndGg+PjgmMjU1KSksci5nemhlYWQuaGNyYyYmKGUuYWRsZXI9YWgoZS5hZGxlcixyLnBlbmRpbmdfYnVmLHIucGVuZGluZywwKSksci5nemluZGV4PTAsci5zdGF0dXM9NjkpOihCaChyLDApLEJoKHIsMCksQmgociwwKSxCaChyLDApLEJoKHIsMCksQmgociw5PT09ci5sZXZlbD8yOnIuc3RyYXRlZ3k+PUlofHxyLmxldmVsPDI/NDowKSxCaChyLDMpLHIuc3RhdHVzPXhoKTtlbHNle3ZhciBzPXpoKyhyLndfYml0cy04PDw0KTw8ODtzfD0oci5zdHJhdGVneT49SWh8fHIubGV2ZWw8Mj8wOnIubGV2ZWw8Nj8xOjY9PT1yLmxldmVsPzI6Myk8PDYsMCE9PXIuc3Ryc3RhcnQmJihzfD0zMikscys9MzEtcyUzMSxyLnN0YXR1cz14aCxaaChyLHMpLDAhPT1yLnN0cnN0YXJ0JiYoWmgocixlLmFkbGVyPj4+MTYpLFpoKHIsNjU1MzUmZS5hZGxlcikpLGUuYWRsZXI9MX1pZig2OT09PXIuc3RhdHVzKWlmKHIuZ3poZWFkLmV4dHJhKXtmb3Iobj1yLnBlbmRpbmc7ci5nemluZGV4PCg2NTUzNSZyLmd6aGVhZC5leHRyYS5sZW5ndGgpJiYoci5wZW5kaW5nIT09ci5wZW5kaW5nX2J1Zl9zaXplfHwoci5nemhlYWQuaGNyYyYmci5wZW5kaW5nPm4mJihlLmFkbGVyPWFoKGUuYWRsZXIsci5wZW5kaW5nX2J1ZixyLnBlbmRpbmctbixuKSksamgoZSksbj1yLnBlbmRpbmcsci5wZW5kaW5nIT09ci5wZW5kaW5nX2J1Zl9zaXplKSk7KUJoKHIsMjU1JnIuZ3poZWFkLmV4dHJhW3IuZ3ppbmRleF0pLHIuZ3ppbmRleCsrO3IuZ3poZWFkLmhjcmMmJnIucGVuZGluZz5uJiYoZS5hZGxlcj1haChlLmFkbGVyLHIucGVuZGluZ19idWYsci5wZW5kaW5nLW4sbikpLHIuZ3ppbmRleD09PXIuZ3poZWFkLmV4dHJhLmxlbmd0aCYmKHIuZ3ppbmRleD0wLHIuc3RhdHVzPTczKX1lbHNlIHIuc3RhdHVzPTczO2lmKDczPT09ci5zdGF0dXMpaWYoci5nemhlYWQubmFtZSl7bj1yLnBlbmRpbmc7ZG97aWYoci5wZW5kaW5nPT09ci5wZW5kaW5nX2J1Zl9zaXplJiYoci5nemhlYWQuaGNyYyYmci5wZW5kaW5nPm4mJihlLmFkbGVyPWFoKGUuYWRsZXIsci5wZW5kaW5nX2J1ZixyLnBlbmRpbmctbixuKSksamgoZSksbj1yLnBlbmRpbmcsci5wZW5kaW5nPT09ci5wZW5kaW5nX2J1Zl9zaXplKSl7bz0xO2JyZWFrfW89ci5nemluZGV4PHIuZ3poZWFkLm5hbWUubGVuZ3RoPzI1NSZyLmd6aGVhZC5uYW1lLmNoYXJDb2RlQXQoci5nemluZGV4KyspOjAsQmgocixvKX13aGlsZSgwIT09byk7ci5nemhlYWQuaGNyYyYmci5wZW5kaW5nPm4mJihlLmFkbGVyPWFoKGUuYWRsZXIsci5wZW5kaW5nX2J1ZixyLnBlbmRpbmctbixuKSksMD09PW8mJihyLmd6aW5kZXg9MCxyLnN0YXR1cz05MSl9ZWxzZSByLnN0YXR1cz05MTtpZig5MT09PXIuc3RhdHVzKWlmKHIuZ3poZWFkLmNvbW1lbnQpe249ci5wZW5kaW5nO2Rve2lmKHIucGVuZGluZz09PXIucGVuZGluZ19idWZfc2l6ZSYmKHIuZ3poZWFkLmhjcmMmJnIucGVuZGluZz5uJiYoZS5hZGxlcj1haChlLmFkbGVyLHIucGVuZGluZ19idWYsci5wZW5kaW5nLW4sbikpLGpoKGUpLG49ci5wZW5kaW5nLHIucGVuZGluZz09PXIucGVuZGluZ19idWZfc2l6ZSkpe289MTticmVha31vPXIuZ3ppbmRleDxyLmd6aGVhZC5jb21tZW50Lmxlbmd0aD8yNTUmci5nemhlYWQuY29tbWVudC5jaGFyQ29kZUF0KHIuZ3ppbmRleCsrKTowLEJoKHIsbyl9d2hpbGUoMCE9PW8pO3IuZ3poZWFkLmhjcmMmJnIucGVuZGluZz5uJiYoZS5hZGxlcj1haChlLmFkbGVyLHIucGVuZGluZ19idWYsci5wZW5kaW5nLW4sbikpLDA9PT1vJiYoci5zdGF0dXM9RGgpfWVsc2Ugci5zdGF0dXM9RGg7aWYoci5zdGF0dXM9PT1EaCYmKHIuZ3poZWFkLmhjcmM/KHIucGVuZGluZysyPnIucGVuZGluZ19idWZfc2l6ZSYmamgoZSksci5wZW5kaW5nKzI8PXIucGVuZGluZ19idWZfc2l6ZSYmKEJoKHIsMjU1JmUuYWRsZXIpLEJoKHIsZS5hZGxlcj4+OCYyNTUpLGUuYWRsZXI9MCxyLnN0YXR1cz14aCkpOnIuc3RhdHVzPXhoKSwwIT09ci5wZW5kaW5nKXtpZihqaChlKSwwPT09ZS5hdmFpbF9vdXQpcmV0dXJuIHIubGFzdF9mbHVzaD0tMSxfaH1lbHNlIGlmKDA9PT1lLmF2YWlsX2luJiZNaCh0KTw9TWgoaSkmJnQhPT1taClyZXR1cm4gRmgoZSxTaCk7aWYoci5zdGF0dXM9PT1XaCYmMCE9PWUuYXZhaWxfaW4pcmV0dXJuIEZoKGUsU2gpO2lmKDAhPT1lLmF2YWlsX2lufHwwIT09ci5sb29rYWhlYWR8fHQhPT12aCYmci5zdGF0dXMhPT1XaCl7dmFyIGE9ci5zdHJhdGVneT09PUloP2Z1bmN0aW9uKGUsdCl7Zm9yKHZhciBuOzspe2lmKDA9PT1lLmxvb2thaGVhZCYmKEdoKGUpLDA9PT1lLmxvb2thaGVhZCkpe2lmKHQ9PT12aClyZXR1cm4gMTticmVha31pZihlLm1hdGNoX2xlbmd0aD0wLG49aGgoZSwwLGUud2luZG93W2Uuc3Ryc3RhcnRdKSxlLmxvb2thaGVhZC0tLGUuc3Ryc3RhcnQrKyxuJiYoTmgoZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpKXJldHVybiAxfXJldHVybiBlLmluc2VydD0wLHQ9PT1taD8oTmgoZSwhMCksMD09PWUuc3RybS5hdmFpbF9vdXQ/Mzo0KTplLmxhc3RfbGl0JiYoTmgoZSwhMSksMD09PWUuc3RybS5hdmFpbF9vdXQpPzE6Mn0ocix0KTpyLnN0cmF0ZWd5PT09UGg/ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4sbyxyLGkscz1lLndpbmRvdzs7KXtpZihlLmxvb2thaGVhZDw9QWgpe2lmKEdoKGUpLGUubG9va2FoZWFkPD1BaCYmdD09PXZoKXJldHVybiAxO2lmKDA9PT1lLmxvb2thaGVhZClicmVha31pZihlLm1hdGNoX2xlbmd0aD0wLGUubG9va2FoZWFkPj0zJiZlLnN0cnN0YXJ0PjAmJihvPXNbcj1lLnN0cnN0YXJ0LTFdKT09PXNbKytyXSYmbz09PXNbKytyXSYmbz09PXNbKytyXSl7aT1lLnN0cnN0YXJ0K0FoO2Rve313aGlsZShvPT09c1srK3JdJiZvPT09c1srK3JdJiZvPT09c1srK3JdJiZvPT09c1srK3JdJiZvPT09c1srK3JdJiZvPT09c1srK3JdJiZvPT09c1srK3JdJiZvPT09c1srK3JdJiZyPGkpO2UubWF0Y2hfbGVuZ3RoPUFoLShpLXIpLGUubWF0Y2hfbGVuZ3RoPmUubG9va2FoZWFkJiYoZS5tYXRjaF9sZW5ndGg9ZS5sb29rYWhlYWQpfWlmKGUubWF0Y2hfbGVuZ3RoPj0zPyhuPWhoKGUsMSxlLm1hdGNoX2xlbmd0aC0zKSxlLmxvb2thaGVhZC09ZS5tYXRjaF9sZW5ndGgsZS5zdHJzdGFydCs9ZS5tYXRjaF9sZW5ndGgsZS5tYXRjaF9sZW5ndGg9MCk6KG49aGgoZSwwLGUud2luZG93W2Uuc3Ryc3RhcnRdKSxlLmxvb2thaGVhZC0tLGUuc3Ryc3RhcnQrKyksbiYmKE5oKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KSlyZXR1cm4gMX1yZXR1cm4gZS5pbnNlcnQ9MCx0PT09bWg/KE5oKGUsITApLDA9PT1lLnN0cm0uYXZhaWxfb3V0PzM6NCk6ZS5sYXN0X2xpdCYmKE5oKGUsITEpLDA9PT1lLnN0cm0uYXZhaWxfb3V0KT8xOjJ9KHIsdCk6S2hbci5sZXZlbF0uZnVuYyhyLHQpO2lmKDMhPT1hJiY0IT09YXx8KHIuc3RhdHVzPVdoKSwxPT09YXx8Mz09PWEpcmV0dXJuIDA9PT1lLmF2YWlsX291dCYmKHIubGFzdF9mbHVzaD0tMSksX2g7aWYoMj09PWEmJih0PT09Ymg/cGgocik6dCE9PXloJiYoZGgociwwLDAsITEpLHQ9PT1naCYmKExoKHIuaGVhZCksMD09PXIubG9va2FoZWFkJiYoci5zdHJzdGFydD0wLHIuYmxvY2tfc3RhcnQ9MCxyLmluc2VydD0wKSkpLGpoKGUpLDA9PT1lLmF2YWlsX291dCkpcmV0dXJuIHIubGFzdF9mbHVzaD0tMSxfaH1yZXR1cm4gdCE9PW1oP19oOnIud3JhcDw9MD93aDooMj09PXIud3JhcD8oQmgociwyNTUmZS5hZGxlciksQmgocixlLmFkbGVyPj44JjI1NSksQmgocixlLmFkbGVyPj4xNiYyNTUpLEJoKHIsZS5hZGxlcj4+MjQmMjU1KSxCaChyLDI1NSZlLnRvdGFsX2luKSxCaChyLGUudG90YWxfaW4+PjgmMjU1KSxCaChyLGUudG90YWxfaW4+PjE2JjI1NSksQmgocixlLnRvdGFsX2luPj4yNCYyNTUpKTooWmgocixlLmFkbGVyPj4+MTYpLFpoKHIsNjU1MzUmZS5hZGxlcikpLGpoKGUpLHIud3JhcD4wJiYoci53cmFwPS1yLndyYXApLDAhPT1yLnBlbmRpbmc/X2g6d2gpfSxycD17ZGVmbGF0ZUluaXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHAoZSx0LHpoLDE1LDgsT2gpfSxkZWZsYXRlSW5pdDI6dHAsZGVmbGF0ZVJlc2V0OmVwLGRlZmxhdGVSZXNldEtlZXA6UWgsZGVmbGF0ZVNldEhlYWRlcjpucCxkZWZsYXRlOm9wLGRlZmxhdGVFbmQ6ZnVuY3Rpb24oZSl7aWYoIWV8fCFlLnN0YXRlKXJldHVybiBDaDt2YXIgdD1lLnN0YXRlLnN0YXR1cztyZXR1cm4gNDIhPT10JiY2OSE9PXQmJjczIT09dCYmOTEhPT10JiZ0IT09RGgmJnQhPT14aCYmdCE9PVdoP0ZoKGUsQ2gpOihlLnN0YXRlPW51bGwsdD09PXhoP0ZoKGUsa2gpOl9oKX0sZGVmbGF0ZVNldERpY3Rpb25hcnk6ZnVuY3Rpb24oZSx0KXt2YXIgbj10Lmxlbmd0aDtpZighZXx8IWUuc3RhdGUpcmV0dXJuIENoO3ZhciBvPWUuc3RhdGUscj1vLndyYXA7aWYoMj09PXJ8fDE9PT1yJiY0MiE9PW8uc3RhdHVzfHxvLmxvb2thaGVhZClyZXR1cm4gQ2g7aWYoMT09PXImJihlLmFkbGVyPWloKGUuYWRsZXIsdCxuLDApKSxvLndyYXA9MCxuPj1vLndfc2l6ZSl7MD09PXImJihMaChvLmhlYWQpLG8uc3Ryc3RhcnQ9MCxvLmJsb2NrX3N0YXJ0PTAsby5pbnNlcnQ9MCk7dmFyIGk9bmV3IFVpbnQ4QXJyYXkoby53X3NpemUpO2kuc2V0KHQuc3ViYXJyYXkobi1vLndfc2l6ZSxuKSwwKSx0PWksbj1vLndfc2l6ZX12YXIgcz1lLmF2YWlsX2luLGE9ZS5uZXh0X2luLHU9ZS5pbnB1dDtmb3IoZS5hdmFpbF9pbj1uLGUubmV4dF9pbj0wLGUuaW5wdXQ9dCxHaChvKTtvLmxvb2thaGVhZD49Mzspe3ZhciBjPW8uc3Ryc3RhcnQsbD1vLmxvb2thaGVhZC0yO2Rve28uaW5zX2g9SmgobyxvLmluc19oLG8ud2luZG93W2MrMy0xXSksby5wcmV2W2Mmby53X21hc2tdPW8uaGVhZFtvLmluc19oXSxvLmhlYWRbby5pbnNfaF09YyxjKyt9d2hpbGUoLS1sKTtvLnN0cnN0YXJ0PWMsby5sb29rYWhlYWQ9MixHaChvKX1yZXR1cm4gby5zdHJzdGFydCs9by5sb29rYWhlYWQsby5ibG9ja19zdGFydD1vLnN0cnN0YXJ0LG8uaW5zZXJ0PW8ubG9va2FoZWFkLG8ubG9va2FoZWFkPTAsby5tYXRjaF9sZW5ndGg9by5wcmV2X2xlbmd0aD0yLG8ubWF0Y2hfYXZhaWxhYmxlPTAsZS5uZXh0X2luPWEsZS5pbnB1dD11LGUuYXZhaWxfaW49cyxvLndyYXA9cixfaH0sZGVmbGF0ZUluZm86InBha28gZGVmbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCkifSxpcD1mdW5jdGlvbihlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX0sc3A9ZnVuY3Rpb24oZSl7Zm9yKHZhciBuPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtuLmxlbmd0aDspe3ZhciBvPW4uc2hpZnQoKTtpZihvKXtpZigib2JqZWN0IiE9PXQobykpdGhyb3cgbmV3IFR5cGVFcnJvcihvKyJtdXN0IGJlIG5vbi1vYmplY3QiKTtmb3IodmFyIHIgaW4gbylpcChvLHIpJiYoZVtyXT1vW3JdKX19cmV0dXJuIGV9LGFwPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wLG49MCxvPWUubGVuZ3RoO248bztuKyspdCs9ZVtuXS5sZW5ndGg7Zm9yKHZhciByPW5ldyBVaW50OEFycmF5KHQpLGk9MCxzPTAsYT1lLmxlbmd0aDtpPGE7aSsrKXt2YXIgdT1lW2ldO3Iuc2V0KHUscykscys9dS5sZW5ndGh9cmV0dXJuIHJ9O3RyeXtTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsbmV3IFVpbnQ4QXJyYXkoMSkpfWNhdGNoKGUpeyExfWZvcih2YXIgdXA9bmV3IFVpbnQ4QXJyYXkoMjU2KSxjcD0wO2NwPDI1NjtjcCsrKXVwW2NwXT1jcD49MjUyPzY6Y3A+PTI0OD81OmNwPj0yNDA/NDpjcD49MjI0PzM6Y3A+PTE5Mj8yOjE7dXBbMjU0XT11cFsyNTRdPTE7dmFyIGxwPWZ1bmN0aW9uKGUpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBUZXh0RW5jb2RlciYmVGV4dEVuY29kZXIucHJvdG90eXBlLmVuY29kZSlyZXR1cm4obmV3IFRleHRFbmNvZGVyKS5lbmNvZGUoZSk7dmFyIHQsbixvLHIsaSxzPWUubGVuZ3RoLGE9MDtmb3Iocj0wO3I8cztyKyspNTUyOTY9PSg2NDUxMiYobj1lLmNoYXJDb2RlQXQocikpKSYmcisxPHMmJjU2MzIwPT0oNjQ1MTImKG89ZS5jaGFyQ29kZUF0KHIrMSkpKSYmKG49NjU1MzYrKG4tNTUyOTY8PDEwKSsoby01NjMyMCkscisrKSxhKz1uPDEyOD8xOm48MjA0OD8yOm48NjU1MzY/Mzo0O2Zvcih0PW5ldyBVaW50OEFycmF5KGEpLGk9MCxyPTA7aTxhO3IrKyk1NTI5Nj09KDY0NTEyJihuPWUuY2hhckNvZGVBdChyKSkpJiZyKzE8cyYmNTYzMjA9PSg2NDUxMiYobz1lLmNoYXJDb2RlQXQocisxKSkpJiYobj02NTUzNisobi01NTI5Njw8MTApKyhvLTU2MzIwKSxyKyspLG48MTI4P3RbaSsrXT1uOm48MjA0OD8odFtpKytdPTE5MnxuPj4+Nix0W2krK109MTI4fDYzJm4pOm48NjU1MzY/KHRbaSsrXT0yMjR8bj4+PjEyLHRbaSsrXT0xMjh8bj4+PjYmNjMsdFtpKytdPTEyOHw2MyZuKToodFtpKytdPTI0MHxuPj4+MTgsdFtpKytdPTEyOHxuPj4+MTImNjMsdFtpKytdPTEyOHxuPj4+NiY2Myx0W2krK109MTI4fDYzJm4pO3JldHVybiB0fTt2YXIgZHA9ZnVuY3Rpb24oKXt0aGlzLmlucHV0PW51bGwsdGhpcy5uZXh0X2luPTAsdGhpcy5hdmFpbF9pbj0wLHRoaXMudG90YWxfaW49MCx0aGlzLm91dHB1dD1udWxsLHRoaXMubmV4dF9vdXQ9MCx0aGlzLmF2YWlsX291dD0wLHRoaXMudG90YWxfb3V0PTAsdGhpcy5tc2c9IiIsdGhpcy5zdGF0ZT1udWxsLHRoaXMuZGF0YV90eXBlPTIsdGhpcy5hZGxlcj0wfSxmcD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLGhwPWNoLlpfTk9fRkxVU0gscHA9Y2guWl9TWU5DX0ZMVVNILHZwPWNoLlpfRlVMTF9GTFVTSCxicD1jaC5aX0ZJTklTSCxncD1jaC5aX09LLG1wPWNoLlpfU1RSRUFNX0VORCx5cD1jaC5aX0RFRkFVTFRfQ09NUFJFU1NJT04sX3A9Y2guWl9ERUZBVUxUX1NUUkFURUdZLHdwPWNoLlpfREVGTEFURUQ7ZnVuY3Rpb24gQ3AoZSl7dGhpcy5vcHRpb25zPXNwKHtsZXZlbDp5cCxtZXRob2Q6d3AsY2h1bmtTaXplOjE2Mzg0LHdpbmRvd0JpdHM6MTUsbWVtTGV2ZWw6OCxzdHJhdGVneTpfcH0sZXx8e30pO3ZhciB0PXRoaXMub3B0aW9uczt0LnJhdyYmdC53aW5kb3dCaXRzPjA/dC53aW5kb3dCaXRzPS10LndpbmRvd0JpdHM6dC5nemlwJiZ0LndpbmRvd0JpdHM+MCYmdC53aW5kb3dCaXRzPDE2JiYodC53aW5kb3dCaXRzKz0xNiksdGhpcy5lcnI9MCx0aGlzLm1zZz0iIix0aGlzLmVuZGVkPSExLHRoaXMuY2h1bmtzPVtdLHRoaXMuc3RybT1uZXcgZHAsdGhpcy5zdHJtLmF2YWlsX291dD0wO3ZhciBuPXJwLmRlZmxhdGVJbml0Mih0aGlzLnN0cm0sdC5sZXZlbCx0Lm1ldGhvZCx0LndpbmRvd0JpdHMsdC5tZW1MZXZlbCx0LnN0cmF0ZWd5KTtpZihuIT09Z3ApdGhyb3cgbmV3IEVycm9yKHVoW25dKTtpZih0LmhlYWRlciYmcnAuZGVmbGF0ZVNldEhlYWRlcih0aGlzLnN0cm0sdC5oZWFkZXIpLHQuZGljdGlvbmFyeSl7dmFyIG87aWYobz0ic3RyaW5nIj09dHlwZW9mIHQuZGljdGlvbmFyeT9scCh0LmRpY3Rpb25hcnkpOiJbb2JqZWN0IEFycmF5QnVmZmVyXSI9PT1mcC5jYWxsKHQuZGljdGlvbmFyeSk/bmV3IFVpbnQ4QXJyYXkodC5kaWN0aW9uYXJ5KTp0LmRpY3Rpb25hcnksKG49cnAuZGVmbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLG8pKSE9PWdwKXRocm93IG5ldyBFcnJvcih1aFtuXSk7dGhpcy5fZGljdF9zZXQ9ITB9fWZ1bmN0aW9uIGtwKGUsdCl7dmFyIG49bmV3IENwKHQpO2lmKG4ucHVzaChlLCEwKSxuLmVycil0aHJvdyBuLm1zZ3x8dWhbbi5lcnJdO3JldHVybiBuLnJlc3VsdH1DcC5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihlLHQpe3ZhciBuLG8scj10aGlzLnN0cm0saT10aGlzLm9wdGlvbnMuY2h1bmtTaXplO2lmKHRoaXMuZW5kZWQpcmV0dXJuITE7Zm9yKG89dD09PX5+dD90OiEwPT09dD9icDpocCwic3RyaW5nIj09dHlwZW9mIGU/ci5pbnB1dD1scChlKToiW29iamVjdCBBcnJheUJ1ZmZlcl0iPT09ZnAuY2FsbChlKT9yLmlucHV0PW5ldyBVaW50OEFycmF5KGUpOnIuaW5wdXQ9ZSxyLm5leHRfaW49MCxyLmF2YWlsX2luPXIuaW5wdXQubGVuZ3RoOzspaWYoMD09PXIuYXZhaWxfb3V0JiYoci5vdXRwdXQ9bmV3IFVpbnQ4QXJyYXkoaSksci5uZXh0X291dD0wLHIuYXZhaWxfb3V0PWkpLChvPT09cHB8fG89PT12cCkmJnIuYXZhaWxfb3V0PD02KXRoaXMub25EYXRhKHIub3V0cHV0LnN1YmFycmF5KDAsci5uZXh0X291dCkpLHIuYXZhaWxfb3V0PTA7ZWxzZXtpZigobj1ycC5kZWZsYXRlKHIsbykpPT09bXApcmV0dXJuIHIubmV4dF9vdXQ+MCYmdGhpcy5vbkRhdGEoci5vdXRwdXQuc3ViYXJyYXkoMCxyLm5leHRfb3V0KSksbj1ycC5kZWZsYXRlRW5kKHRoaXMuc3RybSksdGhpcy5vbkVuZChuKSx0aGlzLmVuZGVkPSEwLG49PT1ncDtpZigwIT09ci5hdmFpbF9vdXQpe2lmKG8+MCYmci5uZXh0X291dD4wKXRoaXMub25EYXRhKHIub3V0cHV0LnN1YmFycmF5KDAsci5uZXh0X291dCkpLHIuYXZhaWxfb3V0PTA7ZWxzZSBpZigwPT09ci5hdmFpbF9pbilicmVha31lbHNlIHRoaXMub25EYXRhKHIub3V0cHV0KX1yZXR1cm4hMH0sQ3AucHJvdG90eXBlLm9uRGF0YT1mdW5jdGlvbihlKXt0aGlzLmNodW5rcy5wdXNoKGUpfSxDcC5wcm90b3R5cGUub25FbmQ9ZnVuY3Rpb24oZSl7ZT09PWdwJiYodGhpcy5yZXN1bHQ9YXAodGhpcy5jaHVua3MpKSx0aGlzLmNodW5rcz1bXSx0aGlzLmVycj1lLHRoaXMubXNnPXRoaXMuc3RybS5tc2d9O3ZhciBTcCxScCxxcCxJcD17RGVmbGF0ZTpDcCxkZWZsYXRlOmtwLGRlZmxhdGVSYXc6ZnVuY3Rpb24oZSx0KXtyZXR1cm4odD10fHx7fSkucmF3PSEwLGtwKGUsdCl9LGd6aXA6ZnVuY3Rpb24oZSx0KXtyZXR1cm4odD10fHx7fSkuZ3ppcD0hMCxrcChlLHQpfSxjb25zdGFudHM6Y2h9LmRlZmxhdGUsUHA9KFNwPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXtuKHRoaXMsZSksdGhpcy5vT3B0aW9ucz1PYmplY3QuYXNzaWduKHtpUG9ydDotMSxjYkNvbm5lY3RTdWNjZXNzOm51bGwsY2JDb25uZWN0RXJyb3I6bnVsbCxjYkNvbm5lY3RDbG9zZTpudWxsfSx0KSx0aGlzLnN6SG9zdD0iaHR0cDovLzEyNy4wLjAuMSIsdGhpcy5zelVVSUQ9IiIsdGhpcy5zelZlcnNpb249IiIsdGhpcy5iTm9ybWFsQ2xvc2U9ITEsdGhpcy5iQ29ubmVjdGVkPSExLHRoaXMuYkluaXRDb25uZWN0PSEwLHRoaXMuaUdldEVycm9yQ291bnQ9MCx0aGlzLm9XaW5kb3dDb250cm9sQ2FsbGJhY2s9e30sdGhpcy5vU2FkcENhbGxiYWNrPXt9LHRoaXMub1NsaWNlQ2FsbGJhY2s9e30sdGhpcy5vU2VyaWFsQ2FsbGJhY2s9e30sdGhpcy5vVUlDb250cm9sQ2FsbGJhY2s9e30sdGhpcy5vVXBncmFkZUNhbGxiYWNrPXt9LHRoaXMuaW5pdCgpfXJldHVybiByKGUsW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PUlkKCksbj17c2VxdWVuY2U6dCxjbWQ6InN5c3RlbS5jb25uZWN0In0sbz1KU09OLnN0cmluZ2lmeShuKTtlLnNlbmRJbWFnZUh0dHAoIiIuY29uY2F0KGUuc3pIb3N0LCI6IikuY29uY2F0KGUub09wdGlvbnMuaVBvcnQsIi9pbWdodHRwL2xvY2FsIiksbyx0LHtzdWNjZXNzOmZ1bmN0aW9uKHQpe3ZhciBuPUpTT04ucGFyc2UodCk7ZS5zelVVSUQ9bi51dWlkLGUuc3pWZXJzaW9uPW4udmVyc2lvbixlLmJDb25uZWN0ZWQ9ITAsZS5iSW5pdENvbm5lY3Q9ITEsc2V0VGltZW91dCgoZnVuY3Rpb24oKXtlLmltYWdlSHR0cFBvbGxpbmcoKX0pLDEwMCksZS5vT3B0aW9ucy5jYkNvbm5lY3RTdWNjZXNzJiZlLm9PcHRpb25zLmNiQ29ubmVjdFN1Y2Nlc3MoKX0sZXJyb3I6ZnVuY3Rpb24oKXt9fSl9fSx7a2V5OiJzZW5kSW1hZ2VIdHRwIix2YWx1ZTpmdW5jdGlvbihlLHQsbixvKXt2YXIgcj10aGlzO289T2JqZWN0LmFzc2lnbih7c3VjY2VzczpudWxsLGVycm9yOm51bGwsYWJvcnQ6bnVsbH0sbyk7dmFyIGk9SXAodCk7IiIhPT0obmV3IFVpbnQ4QXJyYXkpLnRvU3RyaW5nKCkmJihwZi5pc01hY09TKCl8fHBmLmJyb3dzZXIoKS5tc2llKSYmKGk9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoaSkpO2Zvcih2YXIgcz1lbmNvZGVVUklDb21wb25lbnQoYnRvYShpKSksYT10aGlzLnNwbGl0U3RyKHMpLHU9W10sYz0iIixsPTAsZD1hLmxlbmd0aDtsPGQ7bCsrKWM9bD09PWQtMT8idXBkYXRlPSIuY29uY2F0KChuZXcgRGF0ZSkuZ2V0VGltZSgpLCImaXNMYXN0PXRydWUmZGF0YT0iKS5jb25jYXQoYVtsXSwiJnNlcXVlbmNlPSIpLmNvbmNhdChuKToidXBkYXRlPSIuY29uY2F0KChuZXcgRGF0ZSkuZ2V0VGltZSgpLCImaXNMYXN0PWZhbHNlJmRhdGE9IikuY29uY2F0KGFbbF0sIiZzZXF1ZW5jZT0iKS5jb25jYXQobiksdS5wdXNoKGMpO3UubGVuZ3RoPjAmJmZ1bmN0aW9uIHQoKXtyLmltYWdlSHR0cCgiIi5jb25jYXQoZSwiPyIpLmNvbmNhdCh1WzBdKSx7c3VjY2VzczpmdW5jdGlvbihlKXt1LnNoaWZ0KCksdS5sZW5ndGg+MD8oci5iSW5pdENvbm5lY3R8fHIuYkNvbm5lY3RlZCkmJnQoKTpvLnN1Y2Nlc3MmJm8uc3VjY2VzcyhlKX0sZXJyb3I6ZnVuY3Rpb24oKXtvLmVycm9yJiZvLmVycm9yKCl9LGFib3J0OmZ1bmN0aW9uKCl7by5hYm9ydCYmby5hYm9ydCgpfX0pfSgpfX0se2tleToic3BsaXRTdHIiLHZhbHVlOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD10aGlzLmdldEJ5dGVMZW4oZSksbj1bXSxvPTE1MDAscj0wLGk9TWF0aC5jZWlsKHQvbyk7cjxpO3IrKyluW3JdPWUuc2xpY2UobypyLG8qKHIrMSkpO3JldHVybiBufX0se2tleToiZ2V0Qnl0ZUxlbiIsdmFsdWU6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj0iIixvPTAscj1lLmxlbmd0aDtvPHI7bysrKW49ZS5jaGFyQXQobyksL1teXHgwMC1ceGZmXS8udGVzdChuKT90Kz0yOnQrPTE7cmV0dXJuIHR9fSx7a2V5OiJpbWFnZUh0dHAiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dD1PYmplY3QuYXNzaWduKHtzdWNjZXNzOm51bGwsZXJyb3I6bnVsbCxhYm9ydDpudWxsfSx0KTt2YXIgbj1uZXcgSW1hZ2U7bi5vbmxvYWQ9ZnVuY3Rpb24oKXtpZih0LnN1Y2Nlc3Mpe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLG89ZS5nZXRDb250ZXh0KCIyZCIpLHI9bi53aWR0aCxpPW4uaGVpZ2h0O2Uud2lkdGg9cixlLmhlaWdodD1pO3RyeXtvLmRyYXdJbWFnZShuLDAsMCk7Zm9yKHZhciBzPW8uZ2V0SW1hZ2VEYXRhKDAsMCxyLGkpLmRhdGEsYT0iIix1PS0xLGM9aS0xO2M+PTA7Yy0tKWZvcih2YXIgbD0wO2w8NCpyJiYwIT09c1t1PWMqcio0K2xdO2wrKykyNTUhPT1zW3VdJiYoYSs9U3RyaW5nLmZyb21DaGFyQ29kZShzW3VdKSk7dC5zdWNjZXNzKHBmLnV0Zjh0bzE2KGEpKX1jYXRjaChlKXt0LmVycm9yJiZ0LmVycm9yKCl9fX0sbi5vbmVycm9yPWZ1bmN0aW9uKCl7dC5lcnJvciYmdC5lcnJvcigpfSxuLm9uYWJvcnQ9ZnVuY3Rpb24oKXt0LmFib3J0JiZ0LmFib3J0KCl9LG4uY3Jvc3NPcmlnaW49ImFub255bW91cyIsbi5zcmM9ZX19LHtrZXk6InNldFdpbmRvd0NvbnRyb2xDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5vV2luZG93Q29udHJvbENhbGxiYWNrPWV9fSx7a2V5OiJzZXRTYWRwQ2FsbGJhY2siLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMub1NhZHBDYWxsYmFjaz1lfX0se2tleToic2V0U2xpY2VDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5vU2xpY2VDYWxsYmFjaz1lfX0se2tleToic2V0U2VyaWFsQ2FsbGJhY2siLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMub1NlcmlhbENhbGxiYWNrPWV9fSx7a2V5OiJzZXRVSUNvbnRyb2xDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5vVUlDb250cm9sQ2FsbGJhY2s9ZX19LHtrZXk6InNldFVwZ3JhZGVDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5vVXBncmFkZUNhbGxiYWNrPWV9fSx7a2V5OiJnZXRTZXJ2aWNlVmVyc2lvbiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zelZlcnNpb259fSx7a2V5OiJnZXRSZXF1ZXN0VVVJRCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zelVVSUR9fSx7a2V5OiJkaXNjb25uZWN0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1JZCgpLG49e3NlcXVlbmNlOnQsdXVpZDplLnN6VVVJRCxjbWQ6InN5c3RlbS5kaXNjb25uZWN0In0sbz1KU09OLnN0cmluZ2lmeShuKTtlLmJDb25uZWN0ZWQmJmUuc2VuZEltYWdlSHR0cCgiIi5jb25jYXQoZS5zekhvc3QsIjoiKS5jb25jYXQoZS5vT3B0aW9ucy5pUG9ydCwiL2ltZ2h0dHAvbG9jYWwiKSxvLHQse3N1Y2Nlc3M6ZnVuY3Rpb24oKXtlLmJOb3JtYWxDbG9zZT0hMCxlLmJDb25uZWN0ZWQ9ITEsZS5vT3B0aW9ucy5jYkNvbm5lY3RDbG9zZSYmZS5vT3B0aW9ucy5jYkNvbm5lY3RDbG9zZShlLmJOb3JtYWxDbG9zZSl9LGVycm9yOmZ1bmN0aW9uKCl7ZS5iQ29ubmVjdGVkPSExfX0pfX0se2tleToiaW1hZ2VIdHRwUG9sbGluZyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9SWQoKSxuPXtzZXF1ZW5jZTp0LHV1aWQ6ZS5zelVVSUQsY21kOiJzeXN0ZW0uZ2V0In0sbz1KU09OLnN0cmluZ2lmeShuKTtlLmJDb25uZWN0ZWQmJmUuc2VuZEltYWdlSHR0cCgiIi5jb25jYXQoZS5zekhvc3QsIjoiKS5jb25jYXQoZS5vT3B0aW9ucy5pUG9ydCwiL2ltZ2h0dHAvbG9jYWwiKSxvLHQse3N1Y2Nlc3M6ZnVuY3Rpb24odCl7aWYoZS5pR2V0RXJyb3JDb3VudD0wLCJ0aW1lb3V0Ij09PXQpc2V0VGltZW91dCgoZnVuY3Rpb24oKXtlLmltYWdlSHR0cFBvbGxpbmcoKX0pLDEwMCk7ZWxzZSBpZigiaW52YWxpZCI9PT10KWUuYkNvbm5lY3RlZD0hMSxlLm9PcHRpb25zLmNiQ29ubmVjdEVycm9yJiZlLm9PcHRpb25zLmNiQ29ubmVjdEVycm9yKCk7ZWxzZSBpZigiY2xvc2VkIj09PXQpY29uc29sZS5sb2coImNvbm5lY3RlZCBpcyBkaXNjb25uZWN0ZWQiKTtlbHNle3ZhciBuPUpTT04ucGFyc2UodCk7dm9pZCAwIT09bi5jbWQ/ZS5wYXJzZUNtZChuKTpjb25zb2xlLmxvZygiW2pzV2ViQ29udHJvbF1pbWdIdHRwUG9sbGluZyBwdXNoIG1lc3NhZ2UgZXJyb3I6Ii5jb25jYXQodCkpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZS5pbWFnZUh0dHBQb2xsaW5nKCl9KSwxMDApfX0sZXJyb3I6ZnVuY3Rpb24oKXs1PT09ZS5pR2V0RXJyb3JDb3VudD8oY29uc29sZS5sb2coIltqc1dlYkNvbnRyb2xdaW1hZ2VIdHRwUG9sbGluZyBnZXQgcG9sbGluZyBmaW5pc2hlZCIpLGUuYk5vcm1hbENsb3NlPSExLGUuYkNvbm5lY3RlZD0hMSxlLm9PcHRpb25zLmNiQ29ubmVjdENsb3NlJiZlLm9PcHRpb25zLmNiQ29ubmVjdENsb3NlKGUuYk5vcm1hbENsb3NlKSk6c2V0VGltZW91dCgoZnVuY3Rpb24oKXtjb25zb2xlLmxvZygiW2pzV2ViQ29udHJvbF1pbWdIdHRwUG9sbGluZyBnZXQgcG9sbGluZyBmYWlsZWQiKSxlLmlHZXRFcnJvckNvdW50KyssZS5pbWFnZUh0dHBQb2xsaW5nKCl9KSwxMDApfX0pfX0se2tleToic2VuZFJlcXVlc3QiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihuLG8pe3ZhciByPWUuY21kLnNwbGl0KCIuIiksaT0iIjtyLmxlbmd0aD4xP2k9ImxhcHV0YSI9PT1yWzBdPyJsYXB1dGEiOiJsb2NhbCI6bygpO3ZhciBzPUlkKCk7ZS5zZXF1ZW5jZT1zLGUudXVpZD10LnN6VVVJRCxlLnRpbWVzdGFtcD0iIi5jb25jYXQoKG5ldyBEYXRlKS5nZXRUaW1lKCkpO3ZhciBhPUpTT04uc3RyaW5naWZ5KGUpO3QuYkNvbm5lY3RlZD90LnNlbmRJbWFnZUh0dHAoIiIuY29uY2F0KHQuc3pIb3N0LCI6IikuY29uY2F0KHQub09wdGlvbnMuaVBvcnQsIi9pbWdodHRwLyIpLmNvbmNhdChpKSxhLHMse3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7dmFyIHQ9SlNPTi5wYXJzZShlKTswPT09dC5lcnJvck1vZHVsZSYmMD09PXQuZXJyb3JDb2RlP24odCk6byh0KX0sZXJyb3I6ZnVuY3Rpb24oKXtvKCl9fSk6bygpfSkpfX0se2tleToicGFyc2VDbWQiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuY21kLnNwbGl0KCIuIiksbj10WzFdLnJlcGxhY2UoL15bYS16XXsxfS9nLChmdW5jdGlvbihlKXtyZXR1cm4gZS50b1VwcGVyQ2FzZSgpfSkpOyJ3aW5kb3ciPT09dFswXXx8InBsYXkiPT09dFswXT90aGlzLm9XaW5kb3dDb250cm9sQ2FsbGJhY2tbImNiIi5jb25jYXQobildJiZ0aGlzLm9XaW5kb3dDb250cm9sQ2FsbGJhY2tbImNiIi5jb25jYXQobildKGUpOiJzYWRwIj09PXRbMF0/dGhpcy5vU2FkcENhbGxiYWNrWyJjYiIuY29uY2F0KG4pXSYmdGhpcy5vU2FkcENhbGxiYWNrWyJjYiIuY29uY2F0KG4pXShlKToic2VyaWFsIj09PXRbMF0/dGhpcy5vU2VyaWFsQ2FsbGJhY2tbImNiIi5jb25jYXQobildJiZ0aGlzLm9TZXJpYWxDYWxsYmFja1siY2IiLmNvbmNhdChuKV0oZSk6InNsaWNlIj09PXRbMF0/dGhpcy5vU2xpY2VDYWxsYmFja1siY2IiLmNvbmNhdChuKV0mJnRoaXMub1NsaWNlQ2FsbGJhY2tbImNiIi5jb25jYXQobildKGUpOiJ1aSI9PT10WzBdP3RoaXMub1VJQ29udHJvbENhbGxiYWNrWyJjYiIuY29uY2F0KG4pXSYmdGhpcy5vVUlDb250cm9sQ2FsbGJhY2tbImNiIi5jb25jYXQobildKGUpOiJ1cGdyYWRlIj09PXRbMF0mJnRoaXMub1VwZ3JhZGVDYWxsYmFja1siY2IiLmNvbmNhdChuKV0mJnRoaXMub1VwZ3JhZGVDYWxsYmFja1siY2IiLmNvbmNhdChuKV0oZSl9fV0pLGV9KCksU3ApLEVwPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXtuKHRoaXMsZSksdGhpcy5vT3B0aW9ucz1PYmplY3QuYXNzaWduKHtzelBsdWdpbkNvbnRhaW5lcjoiIixpUG9ydDotMSxjYkNvbm5lY3RTdWNjZXNzOm51bGwsY2JDb25uZWN0RXJyb3I6bnVsbCxjYkNvbm5lY3RDbG9zZTpudWxsLHN6Q2xhc3NJZDoiIn0sdCksdGhpcy5vUGx1Z2luPW51bGwsdGhpcy5zelBsdWdpbklkPSIiLHRoaXMuc3pVVUlEPSIiLHRoaXMuc3pWZXJzaW9uPSIiLHRoaXMub1JlcXVlc3RMaXN0PXt9LHRoaXMuYk5vcm1hbENsb3NlPSExLHRoaXMuYU1lc3NhZ2U9W10sdGhpcy5vV2luZG93Q29udHJvbENhbGxiYWNrPXt9LHRoaXMub1NhZHBDYWxsYmFjaz17fSx0aGlzLm9TbGljZUNhbGxiYWNrPXt9LHRoaXMub1NlcmlhbENhbGxiYWNrPXt9LHRoaXMub1VJQ29udHJvbENhbGxiYWNrPXt9LHRoaXMub1VwZ3JhZGVDYWxsYmFjaz17fSx0aGlzLmluaXQoKX1yZXR1cm4gcihlLFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5pbml0UGx1Z2luKCksZS5vUGx1Z2luLm9iamVjdCYmZS5vUGx1Z2luLmNyZWF0ZVNvY2tldCgid3M6Ly8xMjcuMC4wLjE6Ii5jb25jYXQoZS5vT3B0aW9ucy5pUG9ydCkpfX0se2tleToiaW5pdFBsdWdpbiIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuc3pQbHVnaW5JZD0id2ViQWN0aXZlWF8iLmNvbmNhdCgobmV3IERhdGUpLmdldFRpbWUoKSk7dmFyIHQ9IjxvYmplY3QgaWQ9JyIuY29uY2F0KHRoaXMuc3pQbHVnaW5JZCwiJyBjbGFzc2lkPSdjbHNpZDoiKS5jb25jYXQoZS5vT3B0aW9ucy5zekNsYXNzSWQsIicgY29kZWJhc2U9Jycgc3RhbmRieT0nV2FpdGluZy4uLicgd2lkdGg9JzEwMCUnIGhlaWdodD0nMTAwJScgYWxpZ249J2NlbnRlcicgPjwvb2JqZWN0PiIpLG49ZS5vT3B0aW9ucy5zelBsdWdpbkNvbnRhaW5lcjtpZigiIj09PW4pe249IiIuY29uY2F0KHRoaXMuc3pQbHVnaW5JZCwiX2RpdiIpO3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO28uaWQ9bixkb2N1bWVudC5ib2R5LnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQobyl9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobikuaW5uZXJIVE1MPXQsZS5vUGx1Z2luPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc3pQbHVnaW5JZCksd2luZG93Lm9uQ29ubmVjdE1lc3NhZ2U9ZnVuY3Rpb24odCxuKXtuPyhlLmFNZXNzYWdlLnB1c2godCksZS5vbkNvbm5lY3RNZXNzYWdlKGUuYU1lc3NhZ2Uuam9pbigiIikpLGUuYU1lc3NhZ2UubGVuZ3RoPTApOmUuYU1lc3NhZ2UucHVzaCh0KX0sd2luZG93Lm9uQ29ubmVjdENsb3NlPWZ1bmN0aW9uKCl7ZS5vbkNvbm5lY3RDbG9zZSgpfSx3aW5kb3cub25Db25uZWN0RXJyb3I9ZnVuY3Rpb24oKXtlLm9uQ29ubmVjdEVycm9yKCl9LHdpbmRvdy5vbkNvbm5lY3RDbG9zZUV4Y2VwdGlvbj1mdW5jdGlvbigpe2Uub25Db25uZWN0Q2xvc2VFeGNlcHRpb24oKX0sd2luZG93Lm9uQ29ubmVjdE9wZW49ZnVuY3Rpb24oKXtlLm9uQ29ubmVjdE9wZW4oKX0scGYuY3JlYXRlRXZlbnRTY3JpcHQodGhpcy5zelBsdWdpbklkLCJvbkNvbm5lY3RNZXNzYWdlKHN6RGF0YSwgYkxhc3QpIiwib25Db25uZWN0TWVzc2FnZShzekRhdGEsIGJMYXN0KTsiKSxwZi5jcmVhdGVFdmVudFNjcmlwdCh0aGlzLnN6UGx1Z2luSWQsIm9uQ29ubmVjdENsb3NlKCkiLCJvbkNvbm5lY3RDbG9zZSgpOyIpLHBmLmNyZWF0ZUV2ZW50U2NyaXB0KHRoaXMuc3pQbHVnaW5JZCwib25Db25uZWN0RXJyb3IoKSIsIm9uQ29ubmVjdEVycm9yKCk7IikscGYuY3JlYXRlRXZlbnRTY3JpcHQodGhpcy5zelBsdWdpbklkLCJvbkNvbm5lY3RDbG9zZUV4Y2VwdGlvbigpIiwib25Db25uZWN0Q2xvc2VFeGNlcHRpb24oKTsiKSxwZi5jcmVhdGVFdmVudFNjcmlwdCh0aGlzLnN6UGx1Z2luSWQsIm9uQ29ubmVjdE9wZW4oKSIsIm9uQ29ubmVjdE9wZW4oKTsiKX19LHtrZXk6Im9uQ29ubmVjdE1lc3NhZ2UiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7aWYoZSl7dmFyIG49SlNPTi5wYXJzZShlKSxvPW4uc2VxdWVuY2U7dm9pZCAwPT09byYmdm9pZCAwPT09bi5jbWQ/KHQuc3pVVUlEPW4udXVpZCx0LnN6VmVyc2lvbj1uLnZlcnNpb24sdC5vT3B0aW9ucy5jYkNvbm5lY3RTdWNjZXNzJiZ0Lm9PcHRpb25zLmNiQ29ubmVjdFN1Y2Nlc3MoKSk6dm9pZCAwIT09bi5jbWQ/dC5wYXJzZUNtZChuKTp2b2lkIDAhPT10Lm9SZXF1ZXN0TGlzdFtvXSYmKDA9PT1uLmVycm9yTW9kdWxlJiYwPT09bi5lcnJvckNvZGU/dC5vUmVxdWVzdExpc3Rbb10ucmVzb2x2ZShuKTp0Lm9SZXF1ZXN0TGlzdFtvXS5yZWplY3QobiksZGVsZXRlIHQub1JlcXVlc3RMaXN0W29dKX19fSx7a2V5OiJvbkNvbm5lY3RDbG9zZSIsdmFsdWU6ZnVuY3Rpb24oKXtpZih0aGlzLm9QbHVnaW49bnVsbCwiIiE9PXRoaXMuc3pQbHVnaW5JZCl7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5zelBsdWdpbklkKTtlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSk7dmFyIHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIiIuY29uY2F0KHRoaXMuc3pQbHVnaW5JZCwiX2RpdiIpKTtudWxsIT09dCYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpfXRoaXMub09wdGlvbnMuY2JDb25uZWN0Q2xvc2UmJnRoaXMub09wdGlvbnMuY2JDb25uZWN0Q2xvc2UodGhpcy5iTm9ybWFsQ2xvc2UpfX0se2tleToib25Db25uZWN0Q2xvc2VFeGNlcHRpb24iLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcztzZXRUaW1lb3V0KChmdW5jdGlvbigpe2Uub1BsdWdpbi5vYmplY3QmJmUub1BsdWdpbi5jbG9zZVNvY2tldCgpfSksMWUzKX19LHtrZXk6Im9uQ29ubmVjdE9wZW4iLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9e3NlcXVlbmNlOklkKCksY21kOiJzeXN0ZW0uY29ubmVjdCJ9LHQ9SlNPTi5zdHJpbmdpZnkoZSk7dGhpcy5vUGx1Z2luLm9iamVjdCYmdGhpcy5vUGx1Z2luLnNlbmRSZXF1ZXN0KHQpfX0se2tleToib25Db25uZWN0RXJyb3IiLHZhbHVlOmZ1bmN0aW9uKCl7fX0se2tleToic2V0V2luZG93Q29udHJvbENhbGxiYWNrIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLm9XaW5kb3dDb250cm9sQ2FsbGJhY2s9ZX19LHtrZXk6InNldFNhZHBDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5vU2FkcENhbGxiYWNrPWV9fSx7a2V5OiJzZXRTbGljZUNhbGxiYWNrIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLm9TbGljZUNhbGxiYWNrPWV9fSx7a2V5OiJzZXRTZXJpYWxDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5vU2VyaWFsQ2FsbGJhY2s9ZX19LHtrZXk6InNldFVJQ29udHJvbENhbGxiYWNrIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLm9VSUNvbnRyb2xDYWxsYmFjaz1lfX0se2tleToic2V0VXBncmFkZUNhbGxiYWNrIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLm9VcGdyYWRlQ2FsbGJhY2s9ZX19LHtrZXk6ImdldFNlcnZpY2VWZXJzaW9uIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN6VmVyc2lvbn19LHtrZXk6ImdldFJlcXVlc3RVVUlEIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN6VVVJRH19LHtrZXk6ImRpc2Nvbm5lY3QiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5iTm9ybWFsQ2xvc2U9ITAsdGhpcy5vUGx1Z2luJiZ0aGlzLm9QbHVnaW4ub2JqZWN0JiZ0aGlzLm9QbHVnaW4uY2xvc2VTb2NrZXQoKX19LHtrZXk6InNlbmRSZXF1ZXN0Iix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3JldHVybiJ3aW5kb3cuaGlkZVduZCI9PT1lLmNtZD90Lm9QbHVnaW4mJnQub1BsdWdpbi5vYmplY3QmJih0Lm9QbHVnaW4uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIik6IndpbmRvdy5zaG93V25kIj09PWUuY21kJiZ0Lm9QbHVnaW4mJnQub1BsdWdpbi5vYmplY3QmJih0Lm9QbHVnaW4uc3R5bGUudmlzaWJpbGl0eT0idmlzaWJsZSIpLG5ldyBQcm9taXNlKChmdW5jdGlvbihuLG8pe3ZhciByPUlkKCk7ZS5zZXF1ZW5jZT1yLHQub1JlcXVlc3RMaXN0W3JdPXtyZXNvbHZlOm4scmVqZWN0Om99LGUudXVpZD10LnN6VVVJRCxlLnRpbWVzdGFtcD0iIi5jb25jYXQoKG5ldyBEYXRlKS5nZXRUaW1lKCkpO3ZhciBpPUpTT04uc3RyaW5naWZ5KGUpO3Qub1BsdWdpbiYmdC5vUGx1Z2luLm9iamVjdD90Lm9QbHVnaW4uc2VuZFJlcXVlc3QoaSk6bygpfSkpfX0se2tleToicGFyc2VDbWQiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuY21kLnNwbGl0KCIuIiksbj10WzFdLnJlcGxhY2UoL15bYS16XXsxfS9nLChmdW5jdGlvbihlKXtyZXR1cm4gZS50b1VwcGVyQ2FzZSgpfSkpOyJ3aW5kb3ciPT09dFswXXx8InBsYXkiPT09dFswXT90aGlzLm9XaW5kb3dDb250cm9sQ2FsbGJhY2tbImNiIi5jb25jYXQobildJiZ0aGlzLm9XaW5kb3dDb250cm9sQ2FsbGJhY2tbImNiIi5jb25jYXQobildKGUpOiJzYWRwIj09PXRbMF0/dGhpcy5vU2FkcENhbGxiYWNrWyJjYiIuY29uY2F0KG4pXSYmdGhpcy5vU2FkcENhbGxiYWNrWyJjYiIuY29uY2F0KG4pXShlKToic2VyaWFsIj09PXRbMF0/dGhpcy5vU2VyaWFsQ2FsbGJhY2tbImNiIi5jb25jYXQobildJiZ0aGlzLm9TZXJpYWxDYWxsYmFja1siY2IiLmNvbmNhdChuKV0oZSk6InNsaWNlIj09PXRbMF0/dGhpcy5vU2xpY2VDYWxsYmFja1siY2IiLmNvbmNhdChuKV0mJnRoaXMub1NsaWNlQ2FsbGJhY2tbImNiIi5jb25jYXQobildKGUpOiJ1aSI9PT10WzBdP3RoaXMub1VJQ29udHJvbENhbGxiYWNrWyJjYiIuY29uY2F0KG4pXSYmdGhpcy5vVUlDb250cm9sQ2FsbGJhY2tbImNiIi5jb25jYXQobildKGUpOiJ1cGdyYWRlIj09PXRbMF0mJnRoaXMub1VwZ3JhZGVDYWxsYmFja1siY2IiLmNvbmNhdChuKV0mJnRoaXMub1VwZ3JhZGVDYWxsYmFja1siY2IiLmNvbmNhdChuKV0oZSl9fV0pLGV9KCksT3A9KFJwPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXtuKHRoaXMsZSksdGhpcy5vT3B0aW9ucz1PYmplY3QuYXNzaWduKHtzelBsdWdpbkNvbnRhaW5lcjoiIixjYkNvbm5lY3RTdWNjZXNzOm51bGwsY2JDb25uZWN0RXJyb3I6bnVsbCxjYkNvbm5lY3RDbG9zZTpudWxsLGlTZXJ2aWNlUG9ydFN0YXJ0Oi0xLGlTZXJ2aWNlUG9ydEVuZDotMSxzekNsYXNzSWQ6IiJ9LHQpLHRoaXMuaVBvcnQ9LTEsdGhpcy5vUmVxdWVzdD1udWxsLHRoaXMuYkluaXQ9ITEsdGhpcy5vQ2FsbGJhY2tzPXt9LHRoaXMuaW5pdCgpfXJldHVybiByKGUsW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcztwZi5kZXRlY3RQb3J0KGUub09wdGlvbnMuaVNlcnZpY2VQb3J0U3RhcnQsZS5vT3B0aW9ucy5pU2VydmljZVBvcnRFbmQse3N1Y2Nlc3M6ZnVuY3Rpb24odCl7aWYoZS5pUG9ydD10LHBmLmJyb3dzZXIoKS5tc2llKSIxMS4wIj09PXBmLmJyb3dzZXIoKS52ZXJzaW9uPyJodHRwczoiPT09d2luZG93LmxvY2F0aW9uLnByb3RvY29sP2Uub1JlcXVlc3Q9bmV3IFBwKHtpUG9ydDplLmlQb3J0LGNiQ29ubmVjdFN1Y2Nlc3M6ZS5vT3B0aW9ucy5jYkNvbm5lY3RTdWNjZXNzLGNiQ29ubmVjdEVycm9yOmUub09wdGlvbnMuY2JDb25uZWN0RXJyb3IsY2JDb25uZWN0Q2xvc2U6ZS5vT3B0aW9ucy5jYkNvbm5lY3RDbG9zZX0pOmUub1JlcXVlc3Q9bmV3IF9mKHtpUG9ydDplLmlQb3J0LGNiQ29ubmVjdFN1Y2Nlc3M6ZS5vT3B0aW9ucy5jYkNvbm5lY3RTdWNjZXNzLGNiQ29ubmVjdEVycm9yOmUub09wdGlvbnMuY2JDb25uZWN0RXJyb3IsY2JDb25uZWN0Q2xvc2U6ZS5vT3B0aW9ucy5jYkNvbm5lY3RDbG9zZX0pOmUub1JlcXVlc3Q9bmV3IEVwKHtzelBsdWdpbkNvbnRhaW5lcjplLm9PcHRpb25zLnN6UGx1Z2luQ29udGFpbmVyLGlQb3J0OmUuaVBvcnQsY2JDb25uZWN0U3VjY2VzczplLm9PcHRpb25zLmNiQ29ubmVjdFN1Y2Nlc3MsY2JDb25uZWN0RXJyb3I6ZS5vT3B0aW9ucy5jYkNvbm5lY3RFcnJvcixjYkNvbm5lY3RDbG9zZTplLm9PcHRpb25zLmNiQ29ubmVjdENsb3NlLHN6Q2xhc3NJZDplLm9PcHRpb25zLnN6Q2xhc3NJZH0pO2Vsc2UgaWYoImh0dHBzOiI9PT13aW5kb3cubG9jYXRpb24ucHJvdG9jb2wpaWYocGYuYnJvd3NlcigpLmNocm9tZSl0cnl7ZS5vUmVxdWVzdD1uZXcgX2Yoe2lQb3J0OmUuaVBvcnQsY2JDb25uZWN0U3VjY2VzczplLm9PcHRpb25zLmNiQ29ubmVjdFN1Y2Nlc3MsY2JDb25uZWN0RXJyb3I6ZS5vT3B0aW9ucy5jYkNvbm5lY3RFcnJvcixjYkNvbm5lY3RDbG9zZTplLm9PcHRpb25zLmNiQ29ubmVjdENsb3NlfSl9Y2F0Y2godCl7ZS5vUmVxdWVzdD1uZXcgUHAoe2lQb3J0OmUuaVBvcnQsY2JDb25uZWN0U3VjY2VzczplLm9PcHRpb25zLmNiQ29ubmVjdFN1Y2Nlc3MsY2JDb25uZWN0RXJyb3I6ZS5vT3B0aW9ucy5jYkNvbm5lY3RFcnJvcixjYkNvbm5lY3RDbG9zZTplLm9PcHRpb25zLmNiQ29ubmVjdENsb3NlfSl9ZWxzZSBlLm9SZXF1ZXN0PW5ldyBQcCh7aVBvcnQ6ZS5pUG9ydCxjYkNvbm5lY3RTdWNjZXNzOmUub09wdGlvbnMuY2JDb25uZWN0U3VjY2VzcyxjYkNvbm5lY3RFcnJvcjplLm9PcHRpb25zLmNiQ29ubmVjdEVycm9yLGNiQ29ubmVjdENsb3NlOmUub09wdGlvbnMuY2JDb25uZWN0Q2xvc2V9KTtlbHNlIldlYlNvY2tldCJpbiB3aW5kb3cmJihlLm9SZXF1ZXN0PW5ldyBfZih7aVBvcnQ6ZS5pUG9ydCxjYkNvbm5lY3RTdWNjZXNzOmUub09wdGlvbnMuY2JDb25uZWN0U3VjY2VzcyxjYkNvbm5lY3RFcnJvcjplLm9PcHRpb25zLmNiQ29ubmVjdEVycm9yLGNiQ29ubmVjdENsb3NlOmUub09wdGlvbnMuY2JDb25uZWN0Q2xvc2V9KSk7Zm9yKHZhciBuIGluIGUuYkluaXQ9ITAsZS5vQ2FsbGJhY2tzKWUub1JlcXVlc3Rbbl0oZS5vQ2FsbGJhY2tzW25dKX0sZXJyb3I6ZnVuY3Rpb24oKXtlLm9PcHRpb25zLmNiQ29ubmVjdEVycm9yJiZlLm9PcHRpb25zLmNiQ29ubmVjdEVycm9yKCl9fSl9fSx7a2V5OiJzZXRXaW5kb3dDb250cm9sQ2FsbGJhY2siLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMuYkluaXQ/dGhpcy5vUmVxdWVzdC5zZXRXaW5kb3dDb250cm9sQ2FsbGJhY2soZSk6dGhpcy5vQ2FsbGJhY2tzLnNldFdpbmRvd0NvbnRyb2xDYWxsYmFjaz1lfX0se2tleToic2V0U2FkcENhbGxiYWNrIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLmJJbml0P3RoaXMub1JlcXVlc3Quc2V0U2FkcENhbGxiYWNrKGUpOnRoaXMub0NhbGxiYWNrcy5zZXRTYWRwQ2FsbGJhY2s9ZX19LHtrZXk6InNldFNsaWNlQ2FsbGJhY2siLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMuYkluaXQ/dGhpcy5vUmVxdWVzdC5zZXRTbGljZUNhbGxiYWNrKGUpOnRoaXMub0NhbGxiYWNrcy5zZXRTbGljZUNhbGxiYWNrPWV9fSx7a2V5OiJzZXRTZXJpYWxDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5iSW5pdD90aGlzLm9SZXF1ZXN0LnNldFNlcmlhbENhbGxiYWNrKGUpOnRoaXMub0NhbGxiYWNrcy5zZXRTZXJpYWxDYWxsYmFjaz1lfX0se2tleToic2V0VUlDb250cm9sQ2FsbGJhY2siLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMuYkluaXQ/dGhpcy5vUmVxdWVzdC5zZXRVSUNvbnRyb2xDYWxsYmFjayhlKTp0aGlzLm9DYWxsYmFja3Muc2V0VUlDb250cm9sQ2FsbGJhY2s9ZX19LHtrZXk6InNldFVwZ3JhZGVDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5iSW5pdD90aGlzLm9SZXF1ZXN0LnNldFVwZ3JhZGVDYWxsYmFjayhlKTp0aGlzLm9DYWxsYmFja3Muc2V0VXBncmFkZUNhbGxiYWNrPWV9fSx7a2V5OiJnZXRTZXJ2aWNlVmVyc2lvbiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5nZXRTZXJ2aWNlVmVyc2lvbigpfX0se2tleToiZ2V0UmVxdWVzdFVVSUQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub1JlcXVlc3QuZ2V0UmVxdWVzdFVVSUQoKX19LHtrZXk6InN0YXJ0U2VydmljZSIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj17Y21kOiJzeXN0ZW0uc3RhcnRTZXJ2aWNlIix0eXBlOmV9O3JldHVybiB2b2lkIDAhPT10JiYobi5vcHRpb25zPXQpLHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qobil9fSx7a2V5OiJzdG9wU2VydmljZSIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKG4sbyl7bnVsbCE9PXQub1JlcXVlc3Q/dC5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJzeXN0ZW0uc3RvcFNlcnZpY2UiLHR5cGU6ZX0pLnRoZW4oKGZ1bmN0aW9uKGUpe24oZSl9KSwoZnVuY3Rpb24oZSl7byhlKX0pKTpvKCl9KSl9fSx7a2V5OiJkaXNjb25uZWN0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbih0LG4pe251bGwhPT1lLm9SZXF1ZXN0PyhlLm9SZXF1ZXN0LmRpc2Nvbm5lY3QoKSx0KCJjYkNvbm5lY3RDbG9zZSBjYWxsYmFjayBpcyByZWFsbHkgc3VjY2VzcyIpKTpuKCl9KSl9fSx7a2V5OiJvcGVuRGlyZWN0b3J5Iix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJzeXN0ZW0ub3BlbkRpcmVjdG9yeSIscGF0aDplfSl9fSx7a2V5OiJvcGVuRmlsZSIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6InN5c3RlbS5vcGVuRmlsZSIscGF0aDplLHJlbGF0aXZlOnQsdmVyc2lvbjpufSl9fSx7a2V5OiJzZWxlY3REaXJlY3RvcnkiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKG8scil7bnVsbCE9PW4ub1JlcXVlc3Q/bi5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJzeXN0ZW0uc2VsZWN0RGlyZWN0b3J5IixjYXB0aW9uOnZvaWQgMCE9PWUmJiIiIT09ZT9wZi5CYXNlNjQoKS5lbmNvZGUoZSk6IiIsZGlyOnZvaWQgMCE9PXQmJiIiIT09dD9wZi5CYXNlNjQoKS5lbmNvZGUodCk6IiJ9KS50aGVuKChmdW5jdGlvbihlKXsiIiE9PWUucGF0aCYmKGUucGF0aD1wZi5CYXNlNjQoKS5kZWNvZGUoZS5wYXRoKSksbyhlKX0pLChmdW5jdGlvbihlKXtyKGUpfSkpOnIoKX0pKX19LHtrZXk6InNlbGVjdEZpbGUiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgbz10aGlzO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocixpKXtudWxsIT09by5vUmVxdWVzdD9vLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6InN5c3RlbS5zZWxlY3RGaWxlIixjYXB0aW9uOiIiIT09ZT9wZi5CYXNlNjQoKS5lbmNvZGUoZSk6IiIsZGlyOiIiIT09dD9wZi5CYXNlNjQoKS5lbmNvZGUodCk6IiIsZmlsdGVyOm59KS50aGVuKChmdW5jdGlvbihlKXsiIiE9PWUucGF0aCYmKGUucGF0aD1wZi5CYXNlNjQoKS5kZWNvZGUoZS5wYXRoKSkscihlKX0pLChmdW5jdGlvbihlKXtpKGUpfSkpOmkoKX0pKX19LHtrZXk6ImdldExvY2FsQ29uZmlnIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJzeXN0ZW0uZ2V0TG9jYWxDb25maWciLGRlZmF1bHQ6ZX0pfX0se2tleToic2V0TG9jYWxDb25maWciLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBlLmNtZD0ic3lzdGVtLnNldExvY2FsQ29uZmlnIix0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KGUpfX0se2tleToiY3JlYXRlV25kIix2YWx1ZTpmdW5jdGlvbihlLHQsbixvLHIsaSxzKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoPjcmJnZvaWQgMCE9PWFyZ3VtZW50c1s3XT9hcmd1bWVudHNbN106IiI7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoid2luZG93LmNyZWF0ZVduZCIscmVjdDp7bGVmdDplLHRvcDp0LHdpZHRoOm4saGVpZ2h0Om99LGNsYXNzTmFtZTpyLGVtYmVkOmksYWN0aXZlWFBhcmVudFduZDpzLEhXTkQ6YX0pfX0se2tleToic2hvd1duZCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJ3aW5kb3cuc2hvd1duZCJ9KX19LHtrZXk6ImhpZGVXbmQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoid2luZG93LmhpZGVXbmQifSl9fSx7a2V5OiJkZXN0cm95V25kIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbih0LG4pe251bGwhPT1lLm9SZXF1ZXN0P2Uub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoid2luZG93LmRlc3Ryb3lXbmQifSkudGhlbigoZnVuY3Rpb24oZSl7dChlKX0pLChmdW5jdGlvbihlKXtuKGUpfSkpOm4oKX0pKX19LHtrZXk6InNldFduZEdlb21ldHJ5Iix2YWx1ZTpmdW5jdGlvbihlLHQsbixvKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJ3aW5kb3cuc2V0V25kR2VvbWV0cnkiLHJlY3Q6e2xlZnQ6ZSx0b3A6dCx3aWR0aDpuLGhlaWdodDpvfX0pfX0se2tleToic2V0V25kQ292ZXIiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKG8scil7bnVsbCE9PW4ub1JlcXVlc3Q/bi5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJ3aW5kb3cuc2V0V25kQ292ZXIiLHBvc2l0aW9uOmUsc2l6ZTp0fSkudGhlbigoZnVuY3Rpb24oZSl7byhlKX0pLChmdW5jdGlvbihlKXtyKGUpfSkpOnIoKX0pKX19LHtrZXk6ImN1dHRpbmdQYXJ0V2luZG93Iix2YWx1ZTpmdW5jdGlvbihlLHQsbixvLHIpe3ZhciBpPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihzLGEpe251bGwhPT1pLm9SZXF1ZXN0P2kub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoid2luZG93LmN1dHRpbmdQYXJ0V2luZG93IixyZWN0OntsZWZ0OmUsdG9wOnQsd2lkdGg6bixoZWlnaHQ6b30scm91bmQ6cn0pLnRoZW4oKGZ1bmN0aW9uKGUpe3MoZSl9KSwoZnVuY3Rpb24oZSl7YShlKX0pKTphKCl9KSl9fSx7a2V5OiJyZXBhaXJQYXJ0V2luZG93Iix2YWx1ZTpmdW5jdGlvbihlLHQsbixvLHIpe3ZhciBpPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihzLGEpe251bGwhPT1pLm9SZXF1ZXN0P2kub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoid2luZG93LnJlcGFpclBhcnRXaW5kb3ciLHJlY3Q6e2xlZnQ6ZSx0b3A6dCx3aWR0aDpuLGhlaWdodDpvfSxyb3VuZDpyfSkudGhlbigoZnVuY3Rpb24oZSl7cyhlKX0pLChmdW5jdGlvbihlKXthKGUpfSkpOmEoKX0pKX19LHtrZXk6InNldFduZFpPcmRlciIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoid2luZG93LnNldFduZFpPcmRlciIsZmxhZzplfSl9fSx7a2V5OiJjaGFuZ2VQbGF5TW9kZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoid2luZG93LmNoYW5nZVBsYXlNb2RlIix0eXBlOmV9KX19LHtrZXk6InNldExhbmd1YWdlVHlwZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoid2luZG93LnNldExhbmd1YWdlVHlwZSIsdHlwZTplfSl9fSx7a2V5OiJpbml0TG9naW5JbmZvIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJ3aW5kb3cuaW5pdExvZ2luSW5mbyIsdnNtQWRkcmVzczplLnZzbUFkZHJlc3MsdnNtUG9ydDplLnZzbVBvcnQsc2Vzc2lvbklEOmUuc2Vzc2lvbklELGxvZ2luTW9kZWw6ZS5sb2dpbk1vZGVsLHVzZXJUeXBlOmUudXNlclR5cGUsbmV0d29ya1R5cGU6ZS5uZXR3b3JrVHlwZX0pfX0se2tleToic2V0VHJhbnNsYXRlRmlsZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoid2luZG93LnNldFRyYW5zbGF0ZUZpbGUiLHVybDplfSl9fSx7a2V5OiJzd2l0Y2hUb1NpbXBsZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoid2luZG93LnN3aXRjaFRvU2ltcGxlIixzaW1wbGU6ZX0pfX0se2tleToic2V0VnNtVG9rZW4iLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6InBsYXkuc2V0VnNtVG9rZW4iLHRva2VuOmV9KX19LHtrZXk6InN0YXJ0UGxheSIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4sbyxyLGkscyxhLHUpe3ZhciBjPXtjbWQ6InBsYXkuc3RhcnRQbGF5Iix1cmw6ZSx1c2VybmFtZTp0LHBhc3N3b3JkOm4sc2l0ZUlEOm8sYXJlYU5hbWU6cGYuQmFzZTY0KCkuZW5jb2RlKHIpLGNhbWVyYU5hbWU6cGYuQmFzZTY0KCkuZW5jb2RlKGkpLHBlcm1pc3Npb246cyx3bmRJbmRleDphfTtyZXR1cm4gdm9pZCAwIT09dSYmKGMub3B0aW9ucz11LHZvaWQgMCE9PWMub3B0aW9ucy5zaXRlTmFtZSYmKGMub3B0aW9ucy5zaXRlTmFtZT1wZi5CYXNlNjQoKS5lbmNvZGUoYy5vcHRpb25zLnNpdGVOYW1lKSkpLHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3QoYyl9fSx7a2V5OiJzZXRQcmV2aWV3M0RQb3NpdGlvbiIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoicGxheS5zZXRQcmV2aWV3M0RQb3NpdGlvbiIsb3BlbjplfSl9fSx7a2V5OiJzdG9wVG90YWwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcztyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHQsbil7bnVsbCE9PWUub1JlcXVlc3Q/ZS5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJwbGF5LnN0b3BUb3RhbCJ9KS50aGVuKChmdW5jdGlvbihlKXt0KGUpfSksKGZ1bmN0aW9uKGUpe24oZSl9KSk6bigpfSkpfX0se2tleToic2V0RHJhZ01vZGUiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6InBsYXkuc2V0RHJhZ01vZGUiLGRyYWc6ZX0pfX0se2tleToic2hvd0Vycm9ySW5mb0luRnVsbFNjcmVlbiIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoicGxheS5zaG93RXJyb3JJbmZvSW5GdWxsU2NyZWVuIixlcnJvcjpwZi5CYXNlNjQoKS5lbmNvZGUoZSl9KX19LHtrZXk6InNldE51bWJlck9mV2luZG93cyIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoicGxheS5zZXROdW1iZXJPZldpbmRvd3MiLG51bWJlcjplfSl9fSx7a2V5OiJpbml0Q2FyZFJlYWRlciIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoic2VyaWFsLkFDU0luaXRDYXJkUmVhZGVyIixwYXJhbTplfSl9fSx7a2V5OiJ1bkluaXRDYXJkUmVhZGVyIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6InNlcmlhbC5BQ1NVbkluaXRDYXJkUmVhZGVyIn0pfX0se2tleToic3RhcnRBdXRvTW9kZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJzZXJpYWwuQUNTU3RhcnRBdXRvTW9kZSJ9KX19LHtrZXk6InN0b3BBdXRvTW9kZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJzZXJpYWwuQUNTU3RvcEF1dG9Nb2RlIn0pfX0se2tleToiaW5pdEZpbmdlcnByaW50Iix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJzZXJpYWwuQUNTSW5pdEZpbmdlcnByaW50IixwYXJhbTplfSl9fSx7a2V5OiJ1bkluaXRGaW5nZXJwcmludCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJzZXJpYWwuQUNTVW5Jbml0RmluZ2VycHJpbnQifSl9fSx7a2V5OiJzdGFydENvbGxlY3RGaW5nZXJwcmludCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJzZXJpYWwuQUNTU3RhcnRDb2xsZWN0RmluZ2VycHJpbnQifSl9fSx7a2V5OiJzdG9wQ29sbGVjdEZpbmdlcnByaW50Iix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6InNlcmlhbC5BQ1NTdG9wQ29sbGVjdEZpbmdlcnByaW50In0pfX0se2tleToiaXNDb2xsZWN0aW5nRmluZ2VycHJpbnQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoic2VyaWFsLkFDU0lzQ29sbGVjdGluZ0ZpbmdlcnByaW50In0pfX0se2tleToiaW5pdFZpZGVvY2FwdHVyZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUubWFqb3JUaXRsZT1wZi5CYXNlNjQoKS5lbmNvZGUoZS5tYWpvclRpdGxlKSxlLnRpcD1wZi5CYXNlNjQoKS5lbmNvZGUoZS50aXApLGUuY2FwdHVyZUJ0blR4dD1wZi5CYXNlNjQoKS5lbmNvZGUoZS5jYXB0dXJlQnRuVHh0KSxlLlVTQlJlbW92ZWRUaXA9cGYuQmFzZTY0KCkuZW5jb2RlKGUuVVNCUmVtb3ZlZFRpcCksdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJzZXJpYWwuQUNTU3RhcnRDb2xsZWN0SW1hZ2UiLHBhcmFtOmV9KX19LHtrZXk6InVuSW5pdFZpZGVvY2FwdHVyZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJzZXJpYWwuQUNTU3RvcENvbGxlY3RJbWFnZSJ9KX19LHtrZXk6InJlZ2lzdGVyRGV2aWNlVHlwZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoic2FkcC5yZWdpc3REZXZpY2VUeXBlIixkZXZpY2VUeXBlOmV9KX19LHtrZXk6ImFjdGl2ZU9ubGluZURldmljZSIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJzYWRwLmFjdGl2ZURldmljZSIsc2VyaWFsTnVtYmVyOmUscGFzc3dvcmQ6dH0pfX0se2tleToicmVmcmVzaERldmljZUxpc3QiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoic2FkcC5yZWZyZXNoRGV2aWNlTGlzdCJ9KX19LHtrZXk6Im1vZGlmeURldmljZU5ldFBhcmFtIix2YWx1ZTpmdW5jdGlvbihlLHQsbixvLHIsaSxzKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJzYWRwLm1vZGlmeURldmljZVBhcmFtIixtYWNBZGRyZXNzOmUscGFzc3dvcmQ6dCxpcHY0QWRkcmVzczpuLGlwdjRHYXRld2F5Om8saXB2NFN1Ym5ldE1hc2s6cixwb3J0OmksaHR0cFBvcnQ6c30pfX0se2tleToiZXhwb3J0S2V5RmlsZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoic2FkcC5leHBvcnRLZXlGaWxlIixzZXJpYWxOdW1iZXI6ZX0pfX0se2tleToiaW1wb3J0S2V5RmlsZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJzYWRwLmltcG9ydEtleUZpbGUifSl9fSx7a2V5OiJyZXNldFBhc3N3b3JkIix2YWx1ZTpmdW5jdGlvbihlLHQsbixvKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJzYWRwLnJlc2V0UGFzc3dvcmQiLHNlcmlhbE51bWJlcjplLHBhc3N3b3JkOnQsaW1wb3J0RmlsZURhdGE6bixzekNvZGU6b30pfX0se2tleToidXBsb2FkUGljdHVyZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoic2xpY2UudXBsb2FkUGljdHVyZSIscGF0aDpwZi5CYXNlNjQoKS5lbmNvZGUoZSl9KX19LHtrZXk6InNob3dTZWxlY3RNZW51Iix2YWx1ZTpmdW5jdGlvbihlLHQsbixvLHIpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6InVpLnNob3dTZWxlY3RNZW51IixpdGVtczpyLHJlY3Q6e2xlZnQ6ZSx0b3A6dCx3aWR0aDpuLGhlaWdodDpvfX0pfX0se2tleToiaGlkZVNlbGVjdE1lbnUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoidWkuaGlkZVNlbGVjdE1lbnUifSl9fSx7a2V5OiJkZXN0cm95U2VsZWN0TWVudSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24odCxuKXtudWxsIT09ZS5vUmVxdWVzdD9lLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6InVpLmRlc3Ryb3lTZWxlY3RNZW51In0pLnRoZW4oKGZ1bmN0aW9uKGUpe3QoZSl9KSwoZnVuY3Rpb24oZSl7bihlKX0pKTpuKCl9KSl9fSx7a2V5OiJkZXZpY2VDb25maWciLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6ImxhcHV0YS5lbmNvZGluZ0RldmljZSIscGFyYW06ZX0pfX0se2tleToiY2xvdWRTdG9yYWdlQ29uZmlnIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJsYXB1dGEuY2xvdWRTdG9yYWdlIixwYXJhbTplfSl9fSx7a2V5OiJlenZpelJlbW90ZUNvbmZpZyIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoibGFwdXRhLmV6dml6UmVtb3RlIixwYXJhbTplfSl9fSx7a2V5OiJzaG93QWxhcm1JbmZvSW5GdWxsU2NyZWVuIix2YWx1ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoid2luZG93LnNob3dBbGFybUluZm9JbkZ1bGxTY3JlZW4iLGFsYXJtVGl0bGU6ZSxhbGFybU1lc3NhZ2U6dCxhbGFybUlkOm59KX19LHtrZXk6InVwZGF0ZVBhcmVudFduZCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJ3aW5kb3cudXBkYXRlUGFyZW50V25kIn0pfX0se2tleToicmVzdG9yZVduZCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJ3aW5kb3cucmVzdG9yZVduZCJ9KX19LHtrZXk6InNldEltbWVkaWF0ZVBsYXliYWNrVGltZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoicGxheS5zZXRJbW1lZGlhdGVQbGF5YmFja1RpbWUiLHNwZWNpZnlUaW1lOmV9KX19LHtrZXk6InNldERyYXdTdGF0dXMiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6ImRyYXcuc2V0RHJhd1N0YXR1cyIsZW5hYmxlOmV9KX19LHtrZXk6ImNsZWFyUmVnaW9uIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6ImRyYXcuY2xlYXJSZWdpb24ifSl9fSx7a2V5OiJzZXREcmF3U2hhcGVJbmZvIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6ImRyYXcuc2V0RHJhd1NoYXBlSW5mbyIsZHJhd1R5cGU6ZSxkcmF3SW5mbzp0fSl9fSx7a2V5OiJzZXRHcmlkSW5mbyIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoiZHJhdy5zZXRHcmlkSW5mbyIsZ3JpZEluZm86ZX0pfX0se2tleToiZ2V0R3JpZEluZm8iLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoiZHJhdy5nZXRHcmlkSW5mbyJ9KX19LHtrZXk6InNldFBvbHlnb25JbmZvIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJkcmF3LnNldFBvbHlnb25JbmZvIixwb2x5Z29uSW5mbzplfSl9fSx7a2V5OiJnZXRQb2x5Z29uSW5mbyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJkcmF3LmdldFBvbHlnb25JbmZvIn0pfX0se2tleToic2V0TGluZUluZm8iLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6ImRyYXcuc2V0TGluZUluZm8iLGxpbmVJbmZvOmV9KX19LHtrZXk6ImdldExpbmVJbmZvIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6ImRyYXcuZ2V0TGluZUluZm8ifSl9fSx7a2V5OiJzZXRSZWN0SW5mbyIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoiZHJhdy5zZXRSZWN0SW5mbyIscmVjdEluZm86ZX0pfX0se2tleToiZ2V0UmVjdEluZm8iLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoiZHJhdy5nZXRSZWN0SW5mbyJ9KX19LHtrZXk6ImNsZWFyU2hhcGVCeVR5cGUiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6ImRyYXcuY2xlYXJTaGFwZUJ5VHlwZSIsdHlwZTplfSl9fSx7a2V5OiJzZW5zaXRpdmVFbmNyeXB0Iix2YWx1ZTpmdW5jdGlvbihlLHQsbil7dmFyIG89e2NtZDoibGFwdXRhLnNlbnNpdGl2ZUVuY3J5cHQiLGVuY3J5cHRUeXBlOmUsZW5jcnlwdEZpZWxkOnR9O3JldHVybiB2b2lkIDAhPT1uJiYoby5vcHRpb25zPW4pLHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qobyl9fSx7a2V5OiJzZW5kUmVxdWVzdCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3QoZSl9fSx7a2V5OiJyZXF1ZXN0SW50ZXJmYWNlIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD17Y21kOiJ3aW5kb3cucmVxdWVzdEludGVyZmFjZSJ9O3JldHVybiB0LnJlcXVlc3RQYXJhbXM9ZSx0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHQpfX0se2tleToic3RvcFBsYXkiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0tMSksdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJwbGF5LnN0b3BQbGF5Iix3bmRJbmRleDplfSl9fSx7a2V5OiJzaG93UmVtb3RlQ29uZmlnIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3JldHVybiBlLmNtZD0iY29uZmlnLnNob3dSZW1vdGVDb25maWciLG5ldyBQcm9taXNlKChmdW5jdGlvbihuLG8pe251bGwhPT10Lm9SZXF1ZXN0P3Qub1JlcXVlc3Quc2VuZFJlcXVlc3QoZSkudGhlbigoZnVuY3Rpb24oZSl7bihlKX0pLChmdW5jdGlvbihlKXtvKGUpfSkpOm8oKX0pKX19LHtrZXk6InZpZGVvMlBpY3R1cmUiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9e2NtZDoid2luZG93LnZpZGVvMlBpY3R1cmUifTtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdChlKX19LHtrZXk6InBpY3R1cmUyVmlkZW8iLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9e2NtZDoid2luZG93LnBpY3R1cmUyVmlkZW8ifTtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdChlKX19LHtrZXk6InB0ekNvbnRyb2wiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6ImxhcHV0YS5wdHpDb250cm9sIixwYXJhbTplfSl9fSx7a2V5OiJzaW1Nb3VzZUNsaWNrRXZlbnQiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoid2luZG93LnNpbU1vdXNlQ2xpY2tFdmVudCIscG9pbnRYOmUscG9pbnRZOnR9KX19LHtrZXk6InVzX1NldE1heEpvYkNvdW50Iix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJ1cGdyYWRlLnNldE1heEpvYkNvdW50Iix4bWw6ZX0pfX0se2tleToidXNfR2V0TWF4Sm9iQ291bnQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoidXBncmFkZS5nZXRNYXhKb2JDb3VudCJ9KX19LHtrZXk6InVzX0FkZFNjaGVkdWxlIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJ1cGdyYWRlLmFkZFNjaGVkdWxlIix4bWw6cGYuQmFzZTY0KCkuZW5jb2RlKGUpfSl9fSx7a2V5OiJ1c19EZWxTY2hlZHVsZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoidXBncmFkZS5kZWxTY2hlZHVsZSIsc2NoZWR1bGVJZDplfSl9fSx7a2V5OiJ1c19HZXRTY2hlZHVsZUxpc3QiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihuLG8pe251bGwhPT10Lm9SZXF1ZXN0P3Qub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoidXBncmFkZS5nZXRTY2hlZHVsZUxpc3QiLHhtbDplfSkudGhlbigoZnVuY3Rpb24oZSl7IiIhPT1lLnhtbCYmKGUueG1sPXBmLkJhc2U2NCgpLmRlY29kZShlLnhtbCkpLG4oZSl9KSwoZnVuY3Rpb24oZSl7byhlKX0pKTpvKCl9KSl9fSx7a2V5OiJ1c19HZXRTY2hlZHVsZSIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24obyxyKXtudWxsIT09bi5vUmVxdWVzdD9uLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6InVwZ3JhZGUuZ2V0U2NoZWR1bGUiLHhtbDp0LHNjaGVkdWxlSWQ6ZX0pLnRoZW4oKGZ1bmN0aW9uKGUpeyIiIT09ZS54bWwmJihlLnhtbD1wZi5CYXNlNjQoKS5kZWNvZGUoZS54bWwpKSxvKGUpfSksKGZ1bmN0aW9uKGUpe3IoZSl9KSk6cigpfSkpfX0se2tleToidXNfVXBncmFkZUFjdGlvbiIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJ1cGdyYWRlLnVwZ3JhZGVBY3Rpb24iLHhtbDp0LHNjaGVkdWxlSWQ6ZX0pfX0se2tleToidXNfQ2hlY2tVcGdyYWRlYWJsZURldmljZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoidXBncmFkZS5jaGVja1VwZ3JhZGVhYmxlRGV2aWNlIixwYXJhbTplfSl9fSx7a2V5OiJ1c19DaGVja1VwZ3JhZGVhYmxlRGV2aWNlTGlzdCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoidXBncmFkZS5jaGVja1VwZ3JhZGVhYmxlRGV2aWNlTGlzdCIscGFyYW06ZX0pfX0se2tleToidXNfSXNSdW5uaW5nQXN5Q2hlY2tVcGdyYWRlYWJsZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJ1cGdyYWRlLmlzUnVubmluZ0FzeUNoZWNrVXBncmFkZWFibGUifSl9fSx7a2V5OiJ1c19TdG9wQXN5Q2hlY2tVcGdyYWRlYWJsZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJ1cGdyYWRlLnN0b3BBc3lDaGVja1VwZ3JhZGVhYmxlIn0pfX0se2tleToiZ2V0RmlzaEV5ZVBUWlByZXNldCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoicGxheS5nZXRGaXNoRXllUFRaUHJlc2V0Iix3bmRJbmRleDplfSl9fSx7a2V5OiJzZXRGaXNoRXllUFRaUHJlc2V0Iix2YWx1ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VuZFJlcXVlc3Qoe2NtZDoicGxheS5zZXRGaXNoRXllUFRaUHJlc2V0Iix3bmRJbmRleDplLGNvbW1hbmQ6dCxwcmVzZXRJbmZvOm59KX19LHtrZXk6ImNvbnRyb2xGaXNoRXllUFRaIix2YWx1ZTpmdW5jdGlvbihlLHQsbixvKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJwbGF5LmNvbnRyb2xGaXNoRXllUFRaIix3bmRJbmRleDplLGNvbW1hbmQ6dCxzdG9wOm4sc3BlZWQ6b30pfX0se2tleToiY29udHJvbEZpc2hFeWVQYXJvbCIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6InBsYXkuY29udHJvbEZpc2hFeWVQYXJvbCIsd25kSW5kZXg6ZSxjb21tYW5kOnQsY3J1aXNlUG9pbnRMaXN0Om59KX19LHtrZXk6InNldEZpcnN0RGF5T2ZXZWVrIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJ3aW5kb3cuc2V0Rmlyc3REYXlPZldlZWsiLGZpcnN0RGF5OmV9KX19LHtrZXk6InNldEVob21lUGxheUluZm8iLHZhbHVlOmZ1bmN0aW9uKGUsdCxuLG8scixpKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJwbGF5LnNldEVob21lUGxheUluZm8iLGd1aWQ6ZSxwcm90b2NhbDp0LHNlc3Npb246bix0b2tlbjpvLGlwOnIscG9ydDppfSl9fSx7a2V5OiJzdGFydFBsYXlQYXRjaCIsdmFsdWU6ZnVuY3Rpb24oZSl7aWYoZS5sZW5ndGg+MClmb3IodmFyIHQ9MCxuPWUubGVuZ3RoO3Q8bjt0KyspZVt0XS5hcmVhTmFtZT1wZi5CYXNlNjQoKS5lbmNvZGUoZVt0XS5hcmVhTmFtZSksZVt0XS5jYW1lcmFOYW1lPXBmLkJhc2U2NCgpLmVuY29kZShlW3RdLmNhbWVyYU5hbWUpO3JldHVybiB0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6InBsYXkuc3RhcnRQbGF5UGF0Y2giLHBhcmFtczplfSl9fSx7a2V5OiJncmFiT3BlbiIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24odCxuKXtudWxsIT09ZS5vUmVxdWVzdD9lLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6IndpbmRvdy5ncmFiT3BlbiJ9KS50aGVuKChmdW5jdGlvbihlKXt0KGUpfSksKGZ1bmN0aW9uKGUpe24oZSl9KSk6bigpfSkpfX0se2tleToic2V0V25kQXV0b1BhblN0YXRlIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNlbmRSZXF1ZXN0KHtjbWQ6InBsYXkuc2V0V25kQXV0b1BhblN0YXRlIix3bmRJbmRleDplLG9wZW46dH0pfX0se2tleToiZW5hYmxlUHJpdmlsZWdlcyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdCh7Y21kOiJzeXN0ZW0uZW5hYmxlUHJpdmlsZWdlcyJ9KX19XSksZX0oKSxScCksVHA9KHFwPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXtuKHRoaXMsZSk7dmFyIG89dGhpczt0aGlzLm9PcHRpb25zPU9iamVjdC5hc3NpZ24oe3N6UGx1Z2luQ29udGFpbmVyOiIiLGNiQ29ubmVjdFN1Y2Nlc3M6bnVsbCxjYkNvbm5lY3RFcnJvcjpudWxsLGNiQ29ubmVjdENsb3NlOm51bGwsaVNlcnZpY2VQb3J0U3RhcnQ6MTY5NjAsaVNlcnZpY2VQb3J0RW5kOjE2OTY5LHN6Q2xhc3NJZDoiNTVBNzMyOUUtRkFBRC00MzlhLTg3QkMtNzVCQUIzMzMyRTdDIn0sdCksdGhpcy5iRnJlZXplPSExLHRoaXMuYkZvY3VzPSEwLHRoaXMuYkVtYmVkPXBmLmdldENyZWF0ZVduZE1vZGUoKSx0aGlzLnN6V25kSWQ9IiIsdGhpcy5pQ3JlYXRlV25kVGltZXI9LTEsdGhpcy5pVXBkYXRlUGFyZW50V25kVGltZXI9LTEsdGhpcy5iRGV2VG9vbD0hMSx0aGlzLmlWQ1RpbWVTdGFydD0tMSx0aGlzLmlWQ1RpbWVFbmQ9LTEsdGhpcy5vV25kQ292ZXI9e2xlZnQ6MCx0b3A6MCxyaWdodDowLGJvdHRvbTowfSx0aGlzLm9Eb2NPZmZzZXQ9e2xlZnQ6MCx0b3A6MH0sdGhpcy5zelRpdGxlPSIiLHRoaXMub1dpbmRvd0F0dHI9e291dGVyV2lkdGg6MCxpbm5lcldpZHRoOjAsb3V0ZXJIZWlnaHQ6MCxpbm5lckhlaWdodDowLHNjcmVlblRvcDowLHNjcmVlbkxlZnQ6MCxzY3JlZW5YOjAsc2NyZWVuWTowfSx0aGlzLmlGaXhlZFJlc2l6ZVRpbWVyPS0xLHRoaXMuZlZpc2liaWxpdHlDaGFuZ2U9ZnVuY3Rpb24oKXtpZihwZi5pc01hY09TKCkpZG9jdW1lbnQuaGlkZGVuP28uZkhpZGVXbmQoKTpvLmZTaG93V25kKCk7ZWxzZSBpZihkb2N1bWVudC5oaWRkZW4pby5pVkNUaW1lU3RhcnQ9KG5ldyBEYXRlKS5nZXRUaW1lKCksby5mSGlkZVduZCgpO2Vsc2V7by5pVkNUaW1lRW5kPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3ZhciBlPXBmLmJyb3dzZXIoKTtpZihlLmNocm9tZXx8ZS5tb3ppbGxhKWlmKG8uaVVwZGF0ZVBhcmVudFduZFRpbWVyPjAmJihjbGVhclRpbWVvdXQoby5pVXBkYXRlUGFyZW50V25kVGltZXIpLG8uaVVwZGF0ZVBhcmVudFduZFRpbWVyPS0xKSxvLmlWQ1RpbWVFbmQtby5pVkNUaW1lU3RhcnQ8MTAwKXt2YXIgdD1vLm9SZXF1ZXN0LmdldFJlcXVlc3RVVUlEKCk7bWYodCxvLm9PcHRpb25zLmNiU2V0RG9jVGl0bGUpLG8uaVVwZGF0ZVBhcmVudFduZFRpbWVyPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7by5vUmVxdWVzdC51cGRhdGVQYXJlbnRXbmQoKS50aGVuKChmdW5jdGlvbigpe3lmKHQsby5vT3B0aW9ucy5jYlVuc2V0RG9jVGl0bGUpLG8uYkZyZWV6ZXx8by5iRGV2VG9vbHx8by5mU2hvd1duZCgpfSksKGZ1bmN0aW9uKCl7eWYodCxvLm9PcHRpb25zLmNiVW5zZXREb2NUaXRsZSl9KSl9KSwxMDApfWVsc2Ugby5iRnJlZXplfHxvLmJEZXZUb29sfHxvLmZTaG93V25kKCk7ZWxzZSBvLmJGcmVlemV8fG8uYkRldlRvb2x8fG8uZlNob3dXbmQoKX19LHRoaXMuZkhpZGVXbmQ9ZnVuY3Rpb24oKXtvLm9SZXF1ZXN0LmhpZGVXbmQoKS50aGVuKChmdW5jdGlvbigpe30pLChmdW5jdGlvbigpe30pKX0sdGhpcy5mU2hvd1duZD1mdW5jdGlvbigpe28ub1JlcXVlc3Quc2hvd1duZCgpLnRoZW4oKGZ1bmN0aW9uKCl7fSksKGZ1bmN0aW9uKCl7fSkpfSx0aGlzLmZGb2N1cz1mdW5jdGlvbigpe28uYkZvY3VzPSEwLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7by5yZW1vdmVHcmFiSW1hZ2UoKSxkb2N1bWVudC5oaWRkZW58fG8uYkZyZWV6ZXx8by5iRGV2VG9vbHx8by5mU2hvd1duZCgpfSksMjAwKX0sdGhpcy5mQmx1cj1mdW5jdGlvbigpe28uYkZvY3VzPSExfSx0aGlzLnJlbW92ZUdyYWJJbWFnZT1mdW5jdGlvbigpe2lmKCFwZi5pc01hY09TKCkpe3ZhciBlPW51bGw7aWYoIiIhPT1vLnN6V25kSWQmJihlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG8uc3pXbmRJZCkpKXt2YXIgdD1lLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLW5hbWU9IndjLWdyYWItb3Blbi1pbWFnZSJdJyk7QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpfSkpfX19LHRoaXMub1JlcXVlc3Q9bmV3IE9wKHtzelBsdWdpbkNvbnRhaW5lcjp0aGlzLm9PcHRpb25zLnN6UGx1Z2luQ29udGFpbmVyLGNiQ29ubmVjdFN1Y2Nlc3M6dGhpcy5vT3B0aW9ucy5jYkNvbm5lY3RTdWNjZXNzLGNiQ29ubmVjdEVycm9yOnRoaXMub09wdGlvbnMuY2JDb25uZWN0RXJyb3IsY2JDb25uZWN0Q2xvc2U6ZnVuY3Rpb24oZSl7by5pQ3JlYXRlV25kVGltZXI+MCYmKGNsZWFyVGltZW91dChvLmlDcmVhdGVXbmRUaW1lciksby5pQ3JlYXRlV25kVGltZXI9LTEpLG8ucmVtb3ZlR3JhYkltYWdlKCksby5vT3B0aW9ucy5jYkNvbm5lY3RDbG9zZSYmby5vT3B0aW9ucy5jYkNvbm5lY3RDbG9zZShlKX0saVNlcnZpY2VQb3J0U3RhcnQ6dGhpcy5vT3B0aW9ucy5pU2VydmljZVBvcnRTdGFydCxpU2VydmljZVBvcnRFbmQ6dGhpcy5vT3B0aW9ucy5pU2VydmljZVBvcnRFbmQsc3pDbGFzc0lkOnRoaXMub09wdGlvbnMuc3pDbGFzc0lkfSl9cmV0dXJuIHIoZSxbe2tleToiSlNfU2V0V2luZG93Q29udHJvbENhbGxiYWNrIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49e2NiU2VsZWN0V25kOmZ1bmN0aW9uKHQpe2UuY2JTZWxlY3RXbmQmJmUuY2JTZWxlY3RXbmQocGFyc2VJbnQodC53bmRJbmRleCwxMCksdC5jYW1lcmFJRCx0LnNpdGVJRCx0Lm9wZW5kRmlzaGV5ZSl9LGNiVG9nZ2xlUFRaOmZ1bmN0aW9uKHQpe2UuY2JUb2dnbGVQVFomJmUuY2JUb2dnbGVQVFoodC5jYW1lcmFJRCx0LnNpdGVJRCl9LGNiVXBkYXRlQ2FtZXJhSWNvbjpmdW5jdGlvbih0KXtlLmNiVXBkYXRlQ2FtZXJhSWNvbiYmZS5jYlVwZGF0ZUNhbWVyYUljb24odC5jYW1lcmFJRCxwYXJzZUludCh0LnBsYXlpbmcsMTApLHQuc2l0ZUlEKX0sY2JHZXRMYXN0RXJyb3I6ZnVuY3Rpb24odCl7ZS5jYkdldExhc3RFcnJvciYmZS5jYkdldExhc3RFcnJvcih0LmVycm9yLHBhcnNlSW50KHQudHlwZSwxMCkpfSxjYlRhbGtVcmxFbXB0eTpmdW5jdGlvbih0KXtlLmNiVGFsa1VybEVtcHR5JiZlLmNiVGFsa1VybEVtcHR5KHQuY2FtZXJhSUQpfSxjYkdvdG9QbGF5YmFjazpmdW5jdGlvbih0KXtlLmNiR290b1BsYXliYWNrJiZlLmNiR290b1BsYXliYWNrKHQuY2FtZXJhSUQsdC5zaXRlSUQpfSxjYlNob3dEaXNwbGF5SW5mbzpmdW5jdGlvbih0KXtlLmNiU2hvd0Rpc3BsYXlJbmZvJiZlLmNiU2hvd0Rpc3BsYXlJbmZvKHBhcnNlSW50KHQudmlkZW9XaWR0aCwxMCkscGFyc2VJbnQodC52aWRlb0hlaWdodCwxMCkscGFyc2VJbnQodC5mcmFtZVJhdGUsMTApKX0sY2JQcmV2aWV3V25kM0RQb3N0aW9uOmZ1bmN0aW9uKHQpe2UuY2JQcmV2aWV3V25kM0RQb3N0aW9uJiZlLmNiUHJldmlld1duZDNEUG9zdGlvbihwYXJzZUludCh0LnN0YXJ0WCwxMCkscGFyc2VJbnQodC5zdGFydFksMTApLHBhcnNlSW50KHQuZW5kWCwxMCkscGFyc2VJbnQodC5lbmRZLDEwKSl9LGNiU3RvcFBsYXlBbGw6ZnVuY3Rpb24oKXtlLmNiU3RvcFBsYXlBbGwmJmUuY2JTdG9wUGxheUFsbCgpfSxjYldoZWVsRXZlbnQ6ZnVuY3Rpb24odCl7ZS5jYldoZWVsRXZlbnQmJmUuY2JXaGVlbEV2ZW50KHBhcnNlSW50KHQuZGVsdGEsMTApKX0sY2JBbGFybURldGFpbDpmdW5jdGlvbih0KXtlLmNiQWxhcm1EZXRhaWwmJmUuY2JBbGFybURldGFpbCh0LmFsYXJtSWQpfSxjYlF1aXRlZEZ1bGxTY3JlZW46ZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3QuZlNob3dXbmQoKX0pLDEwMCl9LGNiTWFudWFsbHlDbG9zZTpmdW5jdGlvbih0KXtlLmNiTWFudWFsbHlDbG9zZSYmZS5jYk1hbnVhbGx5Q2xvc2UodC5jYW1lcmFJRCx0LnNpdGVJRCxwYXJzZUludCh0LnduZEluZGV4LDEwKSl9LGNiSW50ZWdyYXRpb25DYWxsQmFjazpmdW5jdGlvbih0KXtlLmNiSW50ZWdyYXRpb25DYWxsQmFjayYmZS5jYkludGVncmF0aW9uQ2FsbEJhY2sodCl9LGNiQ2hhbmdlU3RvcmFnZTpmdW5jdGlvbih0KXtlLmNiQ2hhbmdlU3RvcmFnZSYmZS5jYkNoYW5nZVN0b3JhZ2UocGFyc2VJbnQodC5zdG9yYWdlVHlwZSwxMCksdC5jYW1lcmFJRCx0LnNpdGVJRCl9LGNiRmlzaGV5ZUV4cGFuZENoYW5nZWQ6ZnVuY3Rpb24odCl7ZS5jYkZpc2hleWVFeHBhbmRDaGFuZ2VkJiZlLmNiRmlzaGV5ZUV4cGFuZENoYW5nZWQodC5jYW1lcmFJRCx0LnNpdGVJRCxwYXJzZUludCh0LnduZEluZGV4LDEwKSx0Lm9wZW4pfSxjYkdldEVob21lUGxheUluZm86ZnVuY3Rpb24odCl7ZS5jYkdldEVob21lUGxheUluZm8mJmUuY2JHZXRFaG9tZVBsYXlJbmZvKHQuc2l0ZUlELHQuZ3VpZCl9LGNiV25kUHR6Q29udHJvbDpmdW5jdGlvbih0KXtlLmNiV25kUHR6Q29udHJvbCYmZS5jYlduZFB0ekNvbnRyb2wocGFyc2VJbnQodC53bmRJbmRleCwxMCksdC5jYW1lcmFJRCx0LmNvbW1hbmQsdC5zcGVlZCx0LnN0b3ApfSxjYk1lc3NhZ2VDYWxsQmFjazpmdW5jdGlvbihuKXtuPW4uZGF0YTt2YXIgbz10Lm9SZXF1ZXN0LmdldFJlcXVlc3RVVUlEKCk7Im1lbnVPcGVuIj09PW4udHlwZT8iIiE9PXQuc3pXbmRJZCYmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHQuc3pXbmRJZCkuaW5uZXJIVE1MPSI8aW1nIGRhdGEtbmFtZT0nd2MtZ3JhYi1vcGVuLWltYWdlJyBzcmM9J2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwiLmNvbmNhdChuLm1lc3NhZ2UuaW1hZ2UsIicgd2lkdGg9JzEwMCUnIGhlaWdodD0nMTAwJScgLz4iKSk6ImNoYW5nZVRpdGxlIj09PW4udHlwZT8tMT09PWRvY3VtZW50LnRpdGxlLmluZGV4T2YobykmJih0LnN6VGl0bGU9ZG9jdW1lbnQudGl0bGUsbWYobyx0Lm9PcHRpb25zLmNiU2V0RG9jVGl0bGUpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7InVwZGF0ZVBhcmVudFduZCI9PT1uLm1lc3NhZ2U/dC5vUmVxdWVzdC51cGRhdGVQYXJlbnRXbmQoKToicmVzdG9yZVduZCI9PT1uLm1lc3NhZ2UmJnQub1JlcXVlc3QucmVzdG9yZVduZCgpfSksMzAwKSk6ImNoYW5nZVRpdGxlRG9uZSI9PT1uLnR5cGU/IiIhPT10LnN6VGl0bGUmJnlmKG8sdC5vT3B0aW9ucy5jYlVuc2V0RG9jVGl0bGUpOiJzcGxpdENoYW5nZSI9PT1uLnR5cGU/ZS5jYlNwbGl0Q2hhbmdlJiZlLmNiU3BsaXRDaGFuZ2Uobi5tZXNzYWdlLnNwbGl0VHlwZSk6InNob3dNYXhpbWl6ZWQiPT09bi50eXBlJiZlLmNiU2hvd01heGltaXplZCYmZS5jYlNob3dNYXhpbWl6ZWQobi5tZXNzYWdlLnNob3dNYXgpfX07dGhpcy5vUmVxdWVzdC5zZXRXaW5kb3dDb250cm9sQ2FsbGJhY2sobil9fSx7a2V5OiJKU19TZXRTYWRwQ2FsbGJhY2siLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXtjYkRldmljZUZpbmQ6bnVsbH07T2JqZWN0LmFzc2lnbih0LGUpLHRoaXMub1JlcXVlc3Quc2V0U2FkcENhbGxiYWNrKHQpfX0se2tleToiSlNfU2V0U2xpY2VDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9e2NiSW1hZ2VTbGljZWQ6ZnVuY3Rpb24odCl7ZS5jYkltYWdlU2xpY2VkJiYoIiIhPT10LnBpY05hbWUmJih0LnBpY05hbWU9cGYuQmFzZTY0KCkuZGVjb2RlKHQucGljTmFtZSkpLGUuY2JJbWFnZVNsaWNlZCh0KSl9fTt0aGlzLm9SZXF1ZXN0LnNldFNsaWNlQ2FsbGJhY2sodCl9fSx7a2V5OiJKU19TZXRTZXJpYWxDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9e2NiQ2FyZEZpbmQ6ZnVuY3Rpb24odCl7ZS5jYkNhcmRGaW5kJiZlLmNiQ2FyZEZpbmQodCl9LGNiRmluZ2VyRmluZDpmdW5jdGlvbih0KXtlLmNiRmluZ2VyRmluZCYmZS5jYkZpbmdlckZpbmQodC5maW5nZXJQcmludCx0LmZpbmdlclF1YWxpdHkpfSxjYkltYWdlRmluZDpmdW5jdGlvbih0KXtlLmNiSW1hZ2VGaW5kJiZlLmNiSW1hZ2VGaW5kKHQuaW1hZ2UpfSxjYkltYWdlRXJyb3JGaW5kOmZ1bmN0aW9uKHQpe2UuY2JJbWFnZUVycm9yRmluZCYmZS5jYkltYWdlRXJyb3JGaW5kKHQuZXJyb3JNb2R1bGUsdC5lcnJvckNvZGUpfSxjYkltYWdlV25kVmlzaWJsZUZpbmQ6ZnVuY3Rpb24odCl7ZS5jYkltYWdlV25kVmlzaWJsZUZpbmQmJmUuY2JJbWFnZVduZFZpc2libGVGaW5kKHQudmlzaWJsZSl9fTt0aGlzLm9SZXF1ZXN0LnNldFNlcmlhbENhbGxiYWNrKHQpfX0se2tleToiSlNfU2V0VUlDb250cm9sQ2FsbGJhY2siLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXtjYkNsaWNrTWVudUl0ZW06ZnVuY3Rpb24odCl7ZS5jYkNsaWNrTWVudUl0ZW0mJmUuY2JDbGlja01lbnVJdGVtKHQuaXRlbUluZGV4KX0sY2JNZW51TW91c2VJbjpmdW5jdGlvbigpe2UuY2JNZW51TW91c2VJbiYmZS5jYk1lbnVNb3VzZUluKCl9LGNiTWVudU1vdXNlT3V0OmZ1bmN0aW9uKCl7ZS5jYk1lbnVNb3VzZU91dCYmZS5jYk1lbnVNb3VzZU91dCgpfX07dGhpcy5vUmVxdWVzdC5zZXRVSUNvbnRyb2xDYWxsYmFjayh0KX19LHtrZXk6IkpTX1NldFVwZ3JhZGVDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9e2NiQ2hlY2tVcGdyYWRlOmZ1bmN0aW9uKHQpe2UuY2JDaGVja1VwZ3JhZGUmJmUuY2JDaGVja1VwZ3JhZGUodCl9fTt0aGlzLm9SZXF1ZXN0LnNldFVwZ3JhZGVDYWxsYmFjayh0KX19LHtrZXk6IkpTX0NoZWNrVmVyc2lvbiIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5vUmVxdWVzdC5nZXRTZXJ2aWNlVmVyc2lvbigpLG49W10sbz1bXTsiIiE9PXQmJihuPSh0PXQucmVwbGFjZSgvLFtcc10qL2csIi4iKSkuc3BsaXQoIi4iKSksIiIhPT1lJiYobz0oZT1lLnJlcGxhY2UoLyxbXHNdKi9nLCIuIikpLnNwbGl0KCIuIikpO3ZhciByPSExO2lmKG8ubGVuZ3RoPT09bi5sZW5ndGgpZm9yKHZhciBpPTAscz1uLmxlbmd0aDtpPHM7aSsrKWlmKHBhcnNlSW50KG9baV0sMTApIT09cGFyc2VJbnQobltpXSwxMCkpe2lmKHBhcnNlSW50KG9baV0sMTApPnBhcnNlSW50KG5baV0sMTApKXtyPSEwO2JyZWFrfWJyZWFrfXJldHVybiByfX0se2tleToiSlNfU3RhcnRTZXJ2aWNlIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnN0YXJ0U2VydmljZShlLHQpfX0se2tleToiSlNfU3RvcFNlcnZpY2UiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnN0b3BTZXJ2aWNlKGUpfX0se2tleToiSlNfRGlzY29ubmVjdCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5kaXNjb25uZWN0KCl9fSx7a2V5OiJKU19PcGVuRGlyZWN0b3J5Iix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5vcGVuRGlyZWN0b3J5KGUpfX0se2tleToiSlNfT3BlbkZpbGUiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5vcGVuRmlsZShlLHQsbil9fSx7a2V5OiJKU19TZWxlY3REaXJlY3RvcnkiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VsZWN0RGlyZWN0b3J5KGUsdCl9fSx7a2V5OiJKU19TZWxlY3RGaWxlIix2YWx1ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2VsZWN0RmlsZShlLHQsbil9fSx7a2V5OiJKU19HZXRMb2NhbENvbmZpZyIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3QuZ2V0TG9jYWxDb25maWcoZSl9fSx7a2V5OiJKU19TZXRMb2NhbENvbmZpZyIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2V0TG9jYWxDb25maWcoZSl9fSx7a2V5OiJKU19TZXREb2NPZmZzZXQiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBlJiYodGhpcy5vRG9jT2Zmc2V0PWUpLCEwfX0se2tleToiSlNfU2V0V2luZG93QXR0ciIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJih0aGlzLm9XaW5kb3dBdHRyPWUpLCEwfX0se2tleToiSlNfQ3JlYXRlV25kIix2YWx1ZTpmdW5jdGlvbihlLHQsbixvKXt2YXIgcj10aGlzO3RoaXMuc3pXbmRJZD1lLHZvaWQgMCE9PShvPW98fHt9KS5iRW1iZWQmJih0aGlzLmJFbWJlZD1vLmJFbWJlZCk7dmFyIGk9ITA7cmV0dXJuIHZvaWQgMCE9PW8uYkFjdGl2ZVhQYXJlbnRXbmQmJihpPW8uYkFjdGl2ZVhQYXJlbnRXbmQpLG5ldyBQcm9taXNlKChmdW5jdGlvbihzLGEpe3ZhciB1PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpO2lmKHUpe3ZhciBjPSIiO3BmLmJyb3dzZXIoKS5tc2llP2M9IklFRnJhbWUiOnBmLmJyb3dzZXIoKS5jaHJvbWU/Yz0iQ2hyb21lIjpwZi5icm93c2VyKCkuc2FmYXJpJiYoYz13aW5kb3cudG9wLmRvY3VtZW50LnRpdGxlKSxvLmNiU2V0RG9jVGl0bGUmJihyLm9PcHRpb25zLmNiU2V0RG9jVGl0bGU9by5jYlNldERvY1RpdGxlKSxvLmNiVW5zZXREb2NUaXRsZSYmKHIub09wdGlvbnMuY2JVbnNldERvY1RpdGxlPW8uY2JVbnNldERvY1RpdGxlKTt2YXIgbD1yLm9SZXF1ZXN0LmdldFJlcXVlc3RVVUlEKCk7bWYobCxvLmNiU2V0RG9jVGl0bGUpLHIuaUNyZWF0ZVduZFRpbWVyPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7aWYoIXIuYkRldlRvb2wpe3ZhciBlPXBmLmdldERldmljZVBpeGVsUmF0aW8oKSxkPXBmLmdldFduZFBvc3Rpb24odSxyLmJFbWJlZCxyLm9XaW5kb3dBdHRyLHIub0RvY09mZnNldCk7dD1NYXRoLnJvdW5kKHQqZSksbj1NYXRoLnJvdW5kKG4qZSksci5vUmVxdWVzdC5jcmVhdGVXbmQoZC5sZWZ0LGQudG9wLHQsbixjLHIuYkVtYmVkLGksby5IV05EfHwiIikudGhlbigoZnVuY3Rpb24oKXt5ZihsLG8uY2JVbnNldERvY1RpdGxlKSxzKCl9KSwoZnVuY3Rpb24oZSl7eWYobCxvLmNiVW5zZXREb2NUaXRsZSksNTAwMT09PWUuZXJyb3JDb2RlPyhkb2N1bWVudC5oaWRkZW58fHIuYkZyZWV6ZXx8IXIuYkZvY3VzfHxyLmZTaG93V25kKCkscygpKTphKGUpfSkpfX0pLDMwMCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsci5mVmlzaWJpbGl0eUNoYW5nZSwhMSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIixyLmZGb2N1cyksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLHIuZkJsdXIpfWVsc2UgYSgpfSkpfX0se2tleToiSlNfU2hvd1duZCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmJGcmVlemU9ITEsZG9jdW1lbnQuaGlkZGVufHx0aGlzLmJEZXZUb29sfHx0aGlzLmZTaG93V25kKCl9fSx7a2V5OiJKU19IaWRlV25kIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuYkZyZWV6ZT0hMCx0aGlzLmZIaWRlV25kKCl9fSx7a2V5OiJKU19EZXN0cm95V25kIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIix0aGlzLmZWaXNpYmlsaXR5Q2hhbmdlLCExKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuZkZvY3VzKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYmx1ciIsdGhpcy5mQmx1ciksdGhpcy5vUmVxdWVzdC5kZXN0cm95V25kKCl9fSx7a2V5OiJKU19SZXNpemUiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgbz10aGlzLHI9bnVsbCxpPWUscz10O2lmKCIiIT09dGhpcy5zelduZElkJiYocj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnN6V25kSWQpKSxyKXt2YXIgYT1wZi5nZXRXbmRQb3N0aW9uKHIsdGhpcy5iRW1iZWQsdGhpcy5vV2luZG93QXR0cix0aGlzLm9Eb2NPZmZzZXQpLHU9cGYuZ2V0RGV2aWNlUGl4ZWxSYXRpbygpOyghcGYuYnJvd3NlcigpLm1zaWV8fHBmLmJyb3dzZXIoKS5tc2llJiYiMTEuMCI9PT1wZi5icm93c2VyKCkudmVyc2lvbikmJih0aGlzLm9XbmRDb3Zlci5sZWZ0PjAmJihhLmxlZnQrPU1hdGgucm91bmQodGhpcy5vV25kQ292ZXIubGVmdCp1KSxlLT10aGlzLm9XbmRDb3Zlci5sZWZ0KSx0aGlzLm9XbmRDb3Zlci50b3A+MCYmKGEudG9wKz1NYXRoLnJvdW5kKHRoaXMub1duZENvdmVyLnRvcCp1KSx0LT10aGlzLm9XbmRDb3Zlci50b3ApLHRoaXMub1duZENvdmVyLnJpZ2h0PjAmJihlLT10aGlzLm9XbmRDb3Zlci5yaWdodCksdGhpcy5vV25kQ292ZXIuYm90dG9tPjAmJih0LT10aGlzLm9XbmRDb3Zlci5ib3R0b20pKSxlPU1hdGgucm91bmQoZSp1KSx0PU1hdGgucm91bmQodCp1KSx0aGlzLm9SZXF1ZXN0LnNldFduZEdlb21ldHJ5KGEubGVmdCxhLnRvcCxlLHQpLChwZi5icm93c2VyKCkubXNpZSYmIjExLjAiPT09cGYuYnJvd3NlcigpLnZlcnNpb258fCFwZi5pc1dpbmRvd3MoKSkmJihuJiZuLmJGaXhlZD90aGlzLmlGaXhlZFJlc2l6ZVRpbWVyPS0xOih0aGlzLmlGaXhlZFJlc2l6ZVRpbWVyPi0xJiYoY2xlYXJUaW1lb3V0KHRoaXMuaUZpeGVkUmVzaXplVGltZXIpLHRoaXMuaUZpeGVkUmVzaXplVGltZXI9LTEpLHRoaXMuaUZpeGVkUmVzaXplVGltZXI9c2V0VGltZW91dCgoZnVuY3Rpb24oKXtvLkpTX1Jlc2l6ZShpLHMse2JGaXhlZDohMH0pfSksMzAwKSkpfX19LHtrZXk6IkpTX1NldFduZENvdmVyIix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPXBmLmdldERldmljZVBpeGVsUmF0aW8oKTtyZXR1cm4oIXBmLmJyb3dzZXIoKS5tc2llfHxwZi5icm93c2VyKCkubXNpZSYmIjExLjAiPT09cGYuYnJvd3NlcigpLnZlcnNpb24pJiYoImxlZnQiPT09ZT90aGlzLm9XbmRDb3Zlci5sZWZ0PXQ6InRvcCI9PT1lP3RoaXMub1duZENvdmVyLnRvcD10OiJyaWdodCI9PT1lP3RoaXMub1duZENvdmVyLnJpZ2h0PXQ6ImJvdHRvbSI9PT1lJiYodGhpcy5vV25kQ292ZXIuYm90dG9tPXQpKSx0PU1hdGgucm91bmQodCpuKSx0aGlzLm9SZXF1ZXN0LnNldFduZENvdmVyKGUsdCl9fSx7a2V5OiJKU19DdXR0aW5nUGFydFdpbmRvdyIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4sbyxyKXt2YXIgaT1wZi5nZXREZXZpY2VQaXhlbFJhdGlvKCk7cmV0dXJuIGU9TWF0aC5yb3VuZChlKmkpLHQ9TWF0aC5yb3VuZCh0KmkpLG49TWF0aC5yb3VuZChuKmkpLG89TWF0aC5yb3VuZChvKmkpLHI9TWF0aC5yb3VuZChyKmkpLHRoaXMub1JlcXVlc3QuY3V0dGluZ1BhcnRXaW5kb3coZSx0LG4sbyxyKX19LHtrZXk6IkpTX1JlcGFpclBhcnRXaW5kb3ciLHZhbHVlOmZ1bmN0aW9uKGUsdCxuLG8scil7dmFyIGk9cGYuZ2V0RGV2aWNlUGl4ZWxSYXRpbygpO3JldHVybiBlPU1hdGgucm91bmQoZSppKSx0PU1hdGgucm91bmQodCppKSxuPU1hdGgucm91bmQobippKSxvPU1hdGgucm91bmQobyppKSxyPU1hdGgucm91bmQocippKSx0aGlzLm9SZXF1ZXN0LnJlcGFpclBhcnRXaW5kb3coZSx0LG4sbyxyKX19LHtrZXk6IkpTX0NoYW5nZVBsYXlNb2RlIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5jaGFuZ2VQbGF5TW9kZShlKX19LHtrZXk6IkpTX1NldExhbmd1YWdlVHlwZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2V0TGFuZ3VhZ2VUeXBlKGUpfX0se2tleToiSlNfSW5pdExvZ2luSW5mbyIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3QuaW5pdExvZ2luSW5mbyhlKX19LHtrZXk6IkpTX1NldFRyYW5zbGF0ZUZpbGUiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNldFRyYW5zbGF0ZUZpbGUoZSl9fSx7a2V5OiJKU19Td2l0Y2hUb1NpbXBsZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc3dpdGNoVG9TaW1wbGUoZSl9fSx7a2V5OiJKU19TZXRWc21Ub2tlbiIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2V0VnNtVG9rZW4oZSl9fSx7a2V5OiJKU19QbGF5Iix2YWx1ZTpmdW5jdGlvbihlLHQsbixvLHIsaSxzLGEsdSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc3RhcnRQbGF5KGUsdCxuLG8scixpLHMsYSx1KX19LHtrZXk6IkpTX0VuYWJsZTNEWm9vbSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2V0UHJldmlldzNEUG9zaXRpb24oZSl9fSx7a2V5OiJKU19TdG9wVG90YWwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc3RvcFRvdGFsKCl9fSx7a2V5OiJKU19TZXREcmFnTW9kZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2V0RHJhZ01vZGUoZSl9fSx7a2V5OiJKU19TaG93RXJyb3JJbmZvSW5GdWxsU2NyZWVuIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zaG93RXJyb3JJbmZvSW5GdWxsU2NyZWVuKGUpfX0se2tleToiSlNfU2V0TnVtYmVyT2ZXaW5kb3dzIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZXROdW1iZXJPZldpbmRvd3MoZSl9fSx7a2V5OiJKU19Jbml0Q2FyZFJlYWRlciIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3QuaW5pdENhcmRSZWFkZXIoZSl9fSx7a2V5OiJKU19VbkluaXRDYXJkUmVhZGVyIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnVuSW5pdENhcmRSZWFkZXIoKX19LHtrZXk6IkpTX1N0YXJ0QXV0b01vZGUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc3RhcnRBdXRvTW9kZSgpfX0se2tleToiSlNfU3RvcEF1dG9Nb2RlIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnN0b3BBdXRvTW9kZSgpfX0se2tleToiSlNfSW5pdEZpbmdlcnByaW50Iix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5pbml0RmluZ2VycHJpbnQoZSl9fSx7a2V5OiJKU19VbkluaXRGaW5nZXJwcmludCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC51bkluaXRGaW5nZXJwcmludCgpfX0se2tleToiSlNfU3RhcnRDb2xsZWN0RmluZ2VycHJpbnQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc3RhcnRDb2xsZWN0RmluZ2VycHJpbnQoKX19LHtrZXk6IkpTX1N0b3BDb2xsZWN0RmluZ2VycHJpbnQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc3RvcENvbGxlY3RGaW5nZXJwcmludCgpfX0se2tleToiSlNfSXNDb2xsZWN0aW5nRmluZ2VycHJpbnQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub1JlcXVlc3QuaXNDb2xsZWN0aW5nRmluZ2VycHJpbnQoKX19LHtrZXk6IkpTX0luaXRWaWRlb2NhcHR1cmUiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LmluaXRWaWRlb2NhcHR1cmUoZSl9fSx7a2V5OiJKU19VbkluaXRWaWRlb2NhcHR1cmUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub1JlcXVlc3QudW5Jbml0VmlkZW9jYXB0dXJlKCl9fSx7a2V5OiJKU19SZWdpc3RlckRldmljZVR5cGUiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnJlZ2lzdGVyRGV2aWNlVHlwZShlKX19LHtrZXk6IkpTX0FjdGl2ZU9ubGluZURldmljZSIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5hY3RpdmVPbmxpbmVEZXZpY2UoZSx0KX19LHtrZXk6IkpTX1JlZnJlc2hEZXZpY2VMaXN0Iix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnJlZnJlc2hEZXZpY2VMaXN0KCl9fSx7a2V5OiJKU19Nb2RpZnlEZXZpY2VOZXRQYXJhbSIsdmFsdWU6ZnVuY3Rpb24oZSx0LG4sbyxyLGkscyl7cmV0dXJuIHRoaXMub1JlcXVlc3QubW9kaWZ5RGV2aWNlTmV0UGFyYW0oZSx0LG4sbyxyLGkscyl9fSx7a2V5OiJKU19FeHBvcnRLZXlGaWxlIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5leHBvcnRLZXlGaWxlKGUpfX0se2tleToiSlNfSW1wb3J0S2V5RmlsZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5pbXBvcnRLZXlGaWxlKCl9fSx7a2V5OiJKU19SZXNldFBhc3N3b3JkIix2YWx1ZTpmdW5jdGlvbihlLHQsbixvKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5yZXNldFBhc3N3b3JkKGUsdCxuLG8pfX0se2tleToiSlNfVXBsb2FkUGljdHVyZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3QudXBsb2FkUGljdHVyZShlKX19LHtrZXk6IkpTX1Nob3dTZWxlY3RNZW51Iix2YWx1ZTpmdW5jdGlvbihlLHQsbixvLHIpe3ZhciBpPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpO2lmKGkpe3ZhciBzPXBmLmdldFduZFBvc3Rpb24oaSwhMSx0aGlzLm9XaW5kb3dBdHRyLHRoaXMub0RvY09mZnNldCk7ImNlbnRlciI9PT1yP3MubGVmdC09TWF0aC5yb3VuZCgodC1pLm9mZnNldFdpZHRoKS8yKToicmlnaHQiPT09ciYmKHMubGVmdC09TWF0aC5yb3VuZCh0LWkub2Zmc2V0V2lkdGgpKTt2YXIgYT1wZi5nZXREZXZpY2VQaXhlbFJhdGlvKCk7dD1NYXRoLnJvdW5kKHQqYSksbj1NYXRoLnJvdW5kKG4qYSk7dmFyIHU9MSp3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShpKS5oZWlnaHQuc2xpY2UoMCwtMiksYz1NYXRoLnJvdW5kKHUqYSk7dGhpcy5vUmVxdWVzdC5zaG93U2VsZWN0TWVudShzLmxlZnQscy50b3ArYyx0LG4sbyl9fX0se2tleToiSlNfSGlkZVNlbGVjdE1lbnUiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5vUmVxdWVzdC5oaWRlU2VsZWN0TWVudSgpfX0se2tleToiSlNfRGVzdHJveVNlbGVjdE1lbnUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub1JlcXVlc3QuZGVzdHJveVNlbGVjdE1lbnUoKX19LHtrZXk6IkpTX0RldmljZUNvbmZpZyIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3QuZGV2aWNlQ29uZmlnKGUpfX0se2tleToiSlNfQ2xvdWRTdG9yYWdlQ29uZmlnIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5jbG91ZFN0b3JhZ2VDb25maWcoZSl9fSx7a2V5OiJKU19FenZpelJlbW90ZUNvbmZpZyIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3QuZXp2aXpSZW1vdGVDb25maWcoZSl9fSx7a2V5OiJKU19TaG93QWxhcm1JbmZvSW5GdWxsU2NyZWVuIix2YWx1ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2hvd0FsYXJtSW5mb0luRnVsbFNjcmVlbihlLHQsbil9fSx7a2V5OiJKU19TZXRJbW1lZGlhdGVQbGF5YmFja1RpbWUiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNldEltbWVkaWF0ZVBsYXliYWNrVGltZShlKX19LHtrZXk6IkpTX1NldERyYXdTdGF0dXMiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNldERyYXdTdGF0dXMoZSl9fSx7a2V5OiJKU19DbGVhclJlZ2lvbiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5jbGVhclJlZ2lvbigpfX0se2tleToiSlNfU2V0RHJhd1NoYXBlSW5mbyIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZXREcmF3U2hhcGVJbmZvKGUsdCl9fSx7a2V5OiJKU19TZXRHcmlkSW5mbyIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2V0R3JpZEluZm8oZSl9fSx7a2V5OiJKU19HZXRHcmlkSW5mbyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5nZXRHcmlkSW5mbygpfX0se2tleToiSlNfU2V0UG9seWdvbkluZm8iLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnNldFBvbHlnb25JbmZvKGUpfX0se2tleToiSlNfR2V0UG9seWdvbkluZm8iLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub1JlcXVlc3QuZ2V0UG9seWdvbkluZm8oKX19LHtrZXk6IkpTX1NldExpbmVJbmZvIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZXRMaW5lSW5mbyhlKX19LHtrZXk6IkpTX0dldExpbmVJbmZvIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9SZXF1ZXN0LmdldExpbmVJbmZvKCl9fSx7a2V5OiJKU19TZXRSZWN0SW5mbyIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2V0UmVjdEluZm8oZSl9fSx7a2V5OiJKU19HZXRSZWN0SW5mbyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5nZXRSZWN0SW5mbygpfX0se2tleToiSlNfQ2xlYXJTaGFwZUJ5VHlwZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3QuY2xlYXJTaGFwZUJ5VHlwZShlKX19LHtrZXk6IkpTX1NlbnNpdGl2ZUVuY3J5cHQiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5zaXRpdmVFbmNyeXB0KGUsdCxuKX19LHtrZXk6IkpTX1NlbmRSZXF1ZXN0Iix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZW5kUmVxdWVzdChlKX19LHtrZXk6IkpTX1JlcXVlc3RJbnRlcmZhY2UiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnJlcXVlc3RJbnRlcmZhY2UoZSl9fSx7a2V5OiJKU19TdG9wUGxheSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc3RvcFBsYXkoZSl9fSx7a2V5OiJKU19TaG93UmVtb3RlQ29uZmlnIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zaG93UmVtb3RlQ29uZmlnKGUpfX0se2tleToiSlNfVmlkZW8yUGljdHVyZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC52aWRlbzJQaWN0dXJlKCl9fSx7a2V5OiJKU19QaWN0dXJlMlZpZGVvIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnBpY3R1cmUyVmlkZW8oKX19LHtrZXk6IkpTX1B0ekNvbnRyb2wiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnB0ekNvbnRyb2woZSl9fSx7a2V5OiJKU19TaW1Nb3VzZUNsaWNrRXZlbnQiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2ltTW91c2VDbGlja0V2ZW50KGUsdCl9fSx7a2V5OiJKU19VU19TZXRNYXhKb2JDb3VudCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3QudXNfU2V0TWF4Sm9iQ291bnQoZSl9fSx7a2V5OiJKU19VU19HZXRNYXhKb2JDb3VudCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC51c19HZXRNYXhKb2JDb3VudCgpfX0se2tleToiSlNfVVNfQWRkU2NoZWR1bGUiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnVzX0FkZFNjaGVkdWxlKGUpfX0se2tleToiSlNfVVNfRGVsU2NoZWR1bGUiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnVzX0RlbFNjaGVkdWxlKGUpfX0se2tleToiSlNfVVNfR2V0U2NoZWR1bGVMaXN0Iix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC51c19HZXRTY2hlZHVsZUxpc3QoZSl9fSx7a2V5OiJKU19VU19HZXRTY2hlZHVsZSIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5vUmVxdWVzdC51c19HZXRTY2hlZHVsZShlLHQpfX0se2tleToiSlNfVVNfVXBncmFkZUFjdGlvbiIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5vUmVxdWVzdC51c19VcGdyYWRlQWN0aW9uKGUsdCl9fSx7a2V5OiJKU19VU19DaGVja1VwZ3JhZGVhYmxlRGV2aWNlIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC51c19DaGVja1VwZ3JhZGVhYmxlRGV2aWNlKGUpfX0se2tleToiSlNfVVNfQ2hlY2tVcGdyYWRlYWJsZURldmljZUxpc3QiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9SZXF1ZXN0LnVzX0NoZWNrVXBncmFkZWFibGVEZXZpY2VMaXN0KGUpfX0se2tleToiSlNfVVNfSXNSdW5uaW5nQXN5Q2hlY2tVcGdyYWRlYWJsZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC51c19Jc1J1bm5pbmdBc3lDaGVja1VwZ3JhZGVhYmxlKCl9fSx7a2V5OiJKU19VU19TdG9wQXN5Q2hlY2tVcGdyYWRlYWJsZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC51c19TdG9wQXN5Q2hlY2tVcGdyYWRlYWJsZSgpfX0se2tleToiSlNfR2V0RmlzaEV5ZVBUWlByZXNldCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3QuZ2V0RmlzaEV5ZVBUWlByZXNldChlKX19LHtrZXk6IkpTX1NldEZpc2hFeWVQVFpQcmVzZXQiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZXRGaXNoRXllUFRaUHJlc2V0KGUsdCxuKX19LHtrZXk6IkpTX0NvbnRyb2xGaXNoRXllUFRaIix2YWx1ZTpmdW5jdGlvbihlLHQsbixvKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5jb250cm9sRmlzaEV5ZVBUWihlLHQsbixvKX19LHtrZXk6IkpTX0NvbnRyb2xGaXNoRXllUGFyb2wiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5jb250cm9sRmlzaEV5ZVBhcm9sKGUsdCxuKX19LHtrZXk6IkpTX1NldEZpcnN0RGF5T2ZXZWVrIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZXRGaXJzdERheU9mV2VlayhlKX19LHtrZXk6IkpTX1NldEVob21lUGxheUluZm8iLHZhbHVlOmZ1bmN0aW9uKGUsdCxuLG8scixpKXtyZXR1cm4gdGhpcy5vUmVxdWVzdC5zZXRFaG9tZVBsYXlJbmZvKGUsdCxuLG8scixpKX19LHtrZXk6IkpTX1BsYXlQYXRjaCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc3RhcnRQbGF5UGF0Y2goZSl9fSx7a2V5OiJKU19TZXRXbmRBdXRvUGFuU3RhdGUiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMub1JlcXVlc3Quc2V0V25kQXV0b1BhblN0YXRlKGUsdCl9fSx7a2V5OiJKU19FbmFibGVQcml2aWxlZ2VzIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9SZXF1ZXN0LmVuYWJsZVByaXZpbGVnZXMoKX19XSxbe2tleToiSlNfV2FrZVVwIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0LnN0eWxlLmRpc3BsYXk9Im5vbmUiLHQuc3JjPWUsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0KSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodCl9KSwzZTMpfX1dKSxlfSgpLHFwKTtyZXR1cm4gVHAudmVyc2lvbj0iMS4yLjUiLFRwfSgpOwo=", import.meta.url).href;
2170
+ } catch {
2171
+ Z = "./web-control_1.2.5.min.js";
2172
+ }
2173
+ i.src = Z, i.async = !0, i.onload = () => {
2174
+ console.log("web-control_1.2.5.min.js加载成功"), t();
2175
+ }, i.onerror = () => {
2176
+ console.error("web-control_1.2.5.min加载失败"), l(new Error("加载hweb-control_1.2.5.min.js失败"));
2177
+ }, document.head.appendChild(i);
2178
+ });
2179
+ },
2180
+ getPreviousMinute(t) {
2181
+ const l = new Date(Number(t));
2182
+ return l.setMinutes(l.getMinutes() - 1), l.getTime();
2183
+ },
2184
+ getNextMinute(t) {
2185
+ const l = new Date(Number(t));
2186
+ return l.setMinutes(l.getMinutes() + 1), l.getTime();
2187
+ },
2188
+ chunkArray(t, l) {
2189
+ let i = [];
2190
+ for (let Z = 0; Z < t.length; Z += l) {
2191
+ let d = t.slice(Z, Z + l);
2192
+ i.push(d);
2193
+ }
2194
+ return i;
2195
+ },
2196
+ // 关闭视频
2197
+ closeVideo() {
2198
+ this.$emit("closeVideoEmit"), this.oWebControl !== null && (this.oWebControl.JS_RequestInterface({
2199
+ funcName: "stopAllPreview"
2200
+ }), this.oWebControl.JS_HideWnd(), this.oWebControl.JS_Disconnect().then(
2201
+ () => {
2202
+ },
2203
+ () => {
2204
+ }
2205
+ ));
2206
+ },
2207
+ // 批量播放
2208
+ startMultiPreview() {
2209
+ const t = {
2210
+ argument: {
2211
+ list: []
2212
+ }
2213
+ };
2214
+ for (let l = 0; l < this.currentArr.length; l++) {
2215
+ let Z = {
2216
+ cameraIndexCode: this.currentArr[l].indexCode.replace(/(^\s*)/g, ""),
2217
+ gpuMode: 0,
2218
+ streamMode: 0,
2219
+ transMode: 1,
2220
+ wndId: l + 1
2221
+ };
2222
+ t.argument.list.unshift(Z);
2223
+ }
2224
+ this.oWebControl.JS_RequestInterface({
2225
+ funcName: "startMultiPreviewByCameraIndexCode",
2226
+ argument: JSON.stringify(t.argument)
2227
+ });
2228
+ },
2229
+ // 批量回放
2230
+ startMultiPlayback() {
2231
+ let t = "", l = "";
2232
+ this.happenedTime ? (console.log(
2233
+ this.getPreviousMinute(this.happenedTime),
2234
+ this.getNextMinute(this.happenedTime)
2235
+ ), t = this.getPreviousMinute(this.happenedTime), l = this.getNextMinute(this.happenedTime)) : (t = (/* @__PURE__ */ new Date()).getTime() - 1440 * 60 * 1e3, l = (/* @__PURE__ */ new Date()).getTime());
2236
+ const i = {
2237
+ argument: {
2238
+ list: []
2239
+ }
2240
+ };
2241
+ for (let Z = 0; Z < this.currentArr.length; Z++) {
2242
+ let d = this.currentArr[Z], b = {
2243
+ startTimeStamp: Math.floor(t / 1e3).toString(),
2244
+ // 录像查询开始时间戳,单位:秒
2245
+ endTimeStamp: Math.floor(l / 1e3).toString(),
2246
+ // 录像结束开始时间戳,单位:秒
2247
+ cameraIndexCode: d.indexCode.replace(/(^\s*)/g, ""),
2248
+ gpuMode: 0,
2249
+ streamMode: 0,
2250
+ transMode: 1,
2251
+ wndId: Z + 1
2252
+ };
2253
+ i.argument.list.unshift(b);
2254
+ }
2255
+ this.oWebControl.JS_RequestInterface({
2256
+ funcName: "startMultiPlaybackByCameraIndexCode",
2257
+ argument: JSON.stringify(i.argument)
2258
+ });
2259
+ },
2260
+ // 回放
2261
+ startPlayback() {
2262
+ console.log(this.getPreviousMinute(this.happenedTime));
2263
+ let t = "", l = "", i = "";
2264
+ this.happenedTime ? (console.log(
2265
+ this.getPreviousMinute(this.happenedTime),
2266
+ this.getNextMinute(this.happenedTime)
2267
+ ), t = this.cameraIndexCode, l = this.getPreviousMinute(this.happenedTime), i = this.getNextMinute(this.happenedTime)) : (t = this.cameraIndexCode, l = (/* @__PURE__ */ new Date()).getTime() - 1440 * 60 * 1e3, i = (/* @__PURE__ */ new Date()).getTime()), this.oWebControl.JS_RequestInterface({
2268
+ funcName: "startPlayback",
2269
+ argument: JSON.stringify({
2270
+ cameraIndexCode: t,
2271
+ // 监控点编号
2272
+ startTimeStamp: Math.floor(l / 1e3).toString(),
2273
+ // 录像查询开始时间戳,单位:秒
2274
+ endTimeStamp: Math.floor(i / 1e3).toString(),
2275
+ // 录像结束开始时间戳,单位:秒
2276
+ recordLocation: 1,
2277
+ // 录像存储类型:0-中心存储,1-设备存储
2278
+ transMode: 1,
2279
+ // 传输协议:0-UDP,1-TCP
2280
+ gpuMode: 0,
2281
+ // 是否启用GPU硬解,0-不启用,1-启用
2282
+ wndId: -1
2283
+ // 可指定播放窗口
2284
+ })
2285
+ });
2286
+ },
2287
+ // 播放事件
2288
+ startPlay() {
2289
+ let t = this.cameraIndexCode;
2290
+ const l = 0, i = 1, Z = 0, d = -1;
2291
+ t = t.replace(/(^\s*)/g, ""), t = t.replace(/(\s*$)/g, ""), this.oWebControl.JS_RequestInterface({
2292
+ funcName: "startPreview",
2293
+ argument: JSON.stringify({
2294
+ cameraIndexCode: t,
2295
+ //监控点编号
2296
+ streamMode: l,
2297
+ //主子码流标识
2298
+ transMode: i,
2299
+ //传输协议
2300
+ gpuMode: Z,
2301
+ //是否开启GPU硬解
2302
+ wndId: d
2303
+ //可指定播放窗口
2304
+ })
2305
+ });
2306
+ },
2307
+ // 创建播放实例
2308
+ initPlugin() {
2309
+ this.oWebControl = new window.WebControl({
2310
+ szPluginContainer: "playWnd",
2311
+ // 指定容器id
2312
+ iServicePortStart: 15900,
2313
+ // 指定起止端口号,建议使用该值
2314
+ iServicePortEnd: 15900,
2315
+ szClassId: "23BF3B0A-2C56-4D97-9C03-0CB103AA8F11",
2316
+ cbConnectSuccess: () => {
2317
+ this.oWebControl.JS_StartService("window", {
2318
+ dllPath: "./VideoPluginConnect.dll"
2319
+ }).then(
2320
+ () => {
2321
+ this.oWebControl.JS_SetWindowControlCallback({
2322
+ cbIntegrationCallBack: this.cbIntegrationCallBack
2323
+ }), this.oWebControl.JS_CreateWnd("playWnd", this.size.windowWidth, this.size.windowHeight).then(() => {
2324
+ this.init();
2325
+ });
2326
+ },
2327
+ function() {
2328
+ }
2329
+ );
2330
+ },
2331
+ cbConnectError: () => {
2332
+ this.oWebControl = null, this.$message.error("插件未启动,正在尝试启动,请稍候..."), this.playText = "插件未启动,正在尝试启动,请稍候...", window.WebControl.JS_WakeUp("VideoWebPlugin://"), this.initCount++, this.initCount < 3 ? setTimeout(() => {
2333
+ this.initPlugin();
2334
+ }, 3e3) : (this.$message.error("插件启动失败,请检查插件是否安装!"), this.playText = "插件启动失败,请检查插件是否安装!");
2335
+ },
2336
+ cbConnectClose: (t) => {
2337
+ t || (this.oWebControl = null, this.playText = "插件未启动,正在尝试启动,请稍候...", this.initCount++, this.initCount < 3 ? setTimeout(() => {
2338
+ this.initPlugin();
2339
+ }, 3e3) : (this.$message.error("插件启动失败,请检查插件是否安装!"), this.playText = "插件启动失败,请检查插件是否安装!"));
2340
+ }
2341
+ });
2342
+ },
2343
+ //初始化
2344
+ init() {
2345
+ this.getPubKey(() => {
2346
+ this.oWebControl.JS_RequestInterface({
2347
+ funcName: "init",
2348
+ argument: JSON.stringify({
2349
+ appkey: this.usefullData.appkey,
2350
+ //API网关提供的appkey
2351
+ secret: this.setEncrypt(this.usefullData.secret),
2352
+ //API网关提供的secret
2353
+ ip: this.usefullData.ip,
2354
+ //API网关IP地址
2355
+ playMode: this.currentPlayType,
2356
+ //播放模式(决定显示预览还是回放界面)
2357
+ port: this.usefullData.port,
2358
+ //端口
2359
+ snapDir: "D:\\SnapDir",
2360
+ //抓图存储路径
2361
+ videoDir: "D:\\VideoDir",
2362
+ //紧急录像或录像剪辑存储路径
2363
+ layout: this.layoutMode,
2364
+ //布局
2365
+ enableHTTPS: 1,
2366
+ //是否启用HTTPS协议
2367
+ encryptedFields: "secret",
2368
+ //加密字段
2369
+ showToolbar: 1,
2370
+ //是否显示工具栏
2371
+ showSmart: 0,
2372
+ //是否显示智能信息
2373
+ buttonIDs: "0,256,257,258,259,260,512,513,514,515,516,517,768,769"
2374
+ //自定义工具条按钮
2375
+ })
2376
+ }).then(() => {
2377
+ this.oWebControl.JS_Resize(this.size.windowWidth, this.size.windowHeight), this.isMulTip ? this.currentPlayType === 1 ? this.startMultiPlayback() : this.startMultiPreview() : this.currentPlayType === 1 ? this.startPlayback() : this.startPlay();
2378
+ }), this.isFullScreen && this.oWebControl.JS_RequestInterface({
2379
+ funcName: "setFullScreen"
2380
+ });
2381
+ });
2382
+ },
2383
+ //获取公钥
2384
+ getPubKey(t) {
2385
+ this.oWebControl.JS_RequestInterface({
2386
+ funcName: "getRSAPubKey",
2387
+ argument: JSON.stringify({
2388
+ keyLength: 1024
2389
+ })
2390
+ }).then((l) => {
2391
+ l.responseMsg.data && (this.pubKey = l.responseMsg.data, t());
2392
+ });
2393
+ },
2394
+ //RSA加密
2395
+ setEncrypt(t) {
2396
+ let l = new Vi();
2397
+ return l.setPublicKey(this.pubKey), l.encrypt(t);
2398
+ },
2399
+ // 格式化时间
2400
+ dateFormat(t, l) {
2401
+ let i = {
2402
+ "M+": t.getMonth() + 1,
2403
+ //月份
2404
+ "d+": t.getDate(),
2405
+ //日
2406
+ "h+": t.getHours(),
2407
+ //小时
2408
+ "m+": t.getMinutes(),
2409
+ //分
2410
+ "s+": t.getSeconds(),
2411
+ //秒
2412
+ "q+": Math.floor((t.getMonth() + 3) / 3),
2413
+ //季度
2414
+ S: t.getMilliseconds()
2415
+ //毫秒
2416
+ };
2417
+ /(y+)/.test(l) && (l = l.replace(
2418
+ RegExp.$1,
2419
+ (t.getFullYear() + "").substr(4 - RegExp.$1.length)
2420
+ ));
2421
+ for (let Z in i)
2422
+ new RegExp("(" + Z + ")").test(l) && (l = l.replace(
2423
+ RegExp.$1,
2424
+ RegExp.$1.length == 1 ? i[Z] : ("00" + i[Z]).substr(("" + i[Z]).length)
2425
+ ));
2426
+ return l;
2427
+ },
2428
+ // 回调接口
2429
+ cbIntegrationCallBack(t) {
2430
+ const { responseMsg: l, responseMsg: i } = t;
2431
+ l.type === 6 && (this.videoTotal = this.multipPointsArr.length, this.currentPage = 1, this.selectAll = this.multipPointsArr, this.layoutMode = l.msg.layout, this.pageSize = l.msg.wndNum, this.selectAll = this.chunkArray(this.selectAll, l.msg.wndNum), this.currentArr = [...this.selectAll[this.currentPage - 1]], this.oWebControl.JS_Disconnect().then(
2432
+ () => {
2433
+ this.initPlugin();
2434
+ },
2435
+ () => {
2436
+ }
2437
+ )), l.type === 7 && this.closeVideo();
2438
+ },
2439
+ // 显示下载插件弹窗
2440
+ showPluginDownloadDialog() {
2441
+ Ul.confirm(
2442
+ "播放视频需要下载插件",
2443
+ "提示",
2444
+ {
2445
+ confirmButtonText: "下载插件",
2446
+ cancelButtonText: "取消",
2447
+ type: "info",
2448
+ showCancelButton: !0
2449
+ }
2450
+ ).then(() => {
2451
+ deleteSysMenu(row.id).then(() => {
2452
+ this.downloadPlugin(), this.showLoading.close();
2453
+ });
2454
+ }).catch(() => {
2455
+ this.closeVideo(), this.showLoading.close();
2456
+ });
2457
+ },
2458
+ // 下载插件
2459
+ downloadPlugin() {
2460
+ try {
2461
+ const t = this.baseUrl + "static/VideoWebPlugin.exe", l = document.createElement("a");
2462
+ l.href = t, l.download = "VideoWebPlugin.exe", l.style.display = "none", document.body.appendChild(l), l.click(), setTimeout(() => {
2463
+ l.parentNode && l.parentNode.removeChild(l), this.closeVideo();
2464
+ }, 100);
2465
+ } catch {
2466
+ this.closeVideo();
2467
+ }
2468
+ }
2469
+ }
2470
+ }, Gi = {
2471
+ ref: "playWnd",
2472
+ id: "playWnd",
2473
+ class: "playWnd"
2474
+ };
2475
+ function yi(t, l, i, Z, d, b) {
2476
+ return fl((Il(), vl("div", Gi, null, 512)), [
2477
+ [Tl, !i.isFullScreen]
2478
+ ]);
2479
+ }
2480
+ const cl = /* @__PURE__ */ Hl(pi, [["render", yi]]);
2481
+ cl.install = (t) => {
2482
+ t.component(cl.name, cl);
2483
+ };
2484
+ export {
2485
+ cl as GPluginVideo,
2486
+ cl as default
2487
+ };