@getopenpay/openpay-js 0.5.13 → 0.5.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/{ExportResult-B-YLKMaU.js → ExportResult-BacsqwKA.js} +1 -1
  2. package/dist/{Resource-BZeevyoh.js → Resource-Ds5bbQ3b.js} +4 -4
  3. package/dist/SimpleSpanProcessor-0bSccE1S.js +910 -0
  4. package/dist/_commonjsHelpers-CdLE1o9f.js +30 -0
  5. package/dist/detect-resources-UwRkF4Xd.js +862 -0
  6. package/dist/{diag-api-CHLb_Weo.js → diag-api-CMlZXyyv.js} +2 -2
  7. package/dist/index-1jECpTsg.js +147 -0
  8. package/dist/index-BZEpD-f0.js +6718 -0
  9. package/dist/index-BhZy-TW3.js +430 -0
  10. package/dist/index-BmKZeOoc.js +1619 -0
  11. package/dist/index-CDdbDQxQ.js +6 -0
  12. package/dist/index-CWTkU3J-.js +18 -0
  13. package/dist/index-DFO-DCsT.js +127 -0
  14. package/dist/index-DsxDp11a.js +28 -0
  15. package/dist/index-JNJd_YS1.js +1012 -0
  16. package/dist/index-j7i6AeZa.js +7005 -0
  17. package/dist/index.d.ts +29 -4
  18. package/dist/index.es.js +2 -2
  19. package/dist/index.umd.js +45 -45
  20. package/dist/lifecycle-D1BdEbZs.js +119 -0
  21. package/dist/{metrics-api-ClKmMX3Y.js → metrics-api-C9pRFfr-.js} +2 -2
  22. package/dist/sdk-info-ChuKu8zW.js +285 -0
  23. package/dist/suppress-tracing-B94rObkn.js +17 -0
  24. package/dist/url-CdPstDG9.js +798 -0
  25. package/dist/utils--M6ihaNw.js +101 -0
  26. package/dist/utils-De78ey-v.js +12 -0
  27. package/dist/utils-VJ-0MC7c.js +270 -0
  28. package/package.json +4 -4
  29. package/dist/SimpleSpanProcessor-CwJD-GjM.js +0 -957
  30. package/dist/_commonjsHelpers-f76XedMs.js +0 -25
  31. package/dist/detect-resources-BatabDmW.js +0 -854
  32. package/dist/index-ByaN1AdQ.js +0 -6685
  33. package/dist/index-CU4AI3HW.js +0 -52
  34. package/dist/index-Cb34s3AM.js +0 -1599
  35. package/dist/index-CmtkHZgE.js +0 -330
  36. package/dist/index-CtZ-xuHu.js +0 -7041
  37. package/dist/index-D5OCmVN-.js +0 -19
  38. package/dist/index-DLJd6nUV.js +0 -150
  39. package/dist/index-DjekHBls.js +0 -431
  40. package/dist/index-DoKHV9rR.js +0 -130
  41. package/dist/index-_ZTp3kCj.js +0 -830
  42. package/dist/lifecycle-BjQ-7GLm.js +0 -119
  43. package/dist/sdk-info-DYuuxEVK.js +0 -484
  44. package/dist/url-BAeEv8aD.js +0 -797
  45. package/dist/utils--qqdHZ_b.js +0 -142
  46. package/dist/utils-Bf8wDuNo.js +0 -381
  47. package/dist/utils-CX5YT7yI.js +0 -14
@@ -1,830 +0,0 @@
1
- import { z as de, p as T, r as _e, w as ye, j as ve, n as he, y as me, dJ as ge, h as Se, dK as Ae, l as Ee, q as Te, i as Pe, m as Re, o as Oe, t as be, u as Ce } from "./url-BAeEv8aD.js";
2
- import { b as k, t as O, i as Y, T as b, d as Ie, c as B } from "./index-CtZ-xuHu.js";
3
- import { d as _ } from "./diag-api-CHLb_Weo.js";
4
- import { h as X, E as je } from "./ExportResult-B-YLKMaU.js";
5
- import { D as Me, j as Ne, br as we, bs as De, bt as Le, b as xe, T as Ge, bu as Be, h as Ve, i as Ue, bv as He } from "./sdk-info-DYuuxEVK.js";
6
- import { _ as Ke } from "./utils-CX5YT7yI.js";
7
- var p;
8
- (function(e) {
9
- e[e.NOT_RECORD = 0] = "NOT_RECORD", e[e.RECORD = 1] = "RECORD", e[e.RECORD_AND_SAMPLED = 2] = "RECORD_AND_SAMPLED";
10
- })(p || (p = {}));
11
- var N = k("OpenTelemetry SDK Context Key SUPPRESS_TRACING");
12
- function W(e) {
13
- return e.setValue(N, !0);
14
- }
15
- function Fe(e) {
16
- return e.deleteValue(N);
17
- }
18
- function w(e) {
19
- return e.getValue(N) === !0;
20
- }
21
- var ze = "=", C = ";", S = ",", P = "baggage", ke = 180, Ye = 4096, Xe = 8192, We = function(e, r) {
22
- var t = typeof Symbol == "function" && e[Symbol.iterator];
23
- if (!t) return e;
24
- var n = t.call(e), a, i = [], o;
25
- try {
26
- for (; (r === void 0 || r-- > 0) && !(a = n.next()).done; ) i.push(a.value);
27
- } catch (u) {
28
- o = { error: u };
29
- } finally {
30
- try {
31
- a && !a.done && (t = n.return) && t.call(n);
32
- } finally {
33
- if (o) throw o.error;
34
- }
35
- }
36
- return i;
37
- };
38
- function $(e) {
39
- return e.reduce(function(r, t) {
40
- var n = "" + r + (r !== "" ? S : "") + t;
41
- return n.length > Xe ? r : n;
42
- }, "");
43
- }
44
- function J(e) {
45
- return e.getAllEntries().map(function(r) {
46
- var t = We(r, 2), n = t[0], a = t[1], i = encodeURIComponent(n) + "=" + encodeURIComponent(a.value);
47
- return a.metadata !== void 0 && (i += C + a.metadata.toString()), i;
48
- });
49
- }
50
- function D(e) {
51
- var r = e.split(C);
52
- if (!(r.length <= 0)) {
53
- var t = r.shift();
54
- if (t) {
55
- var n = t.indexOf(ze);
56
- if (!(n <= 0)) {
57
- var a = decodeURIComponent(t.substring(0, n).trim()), i = decodeURIComponent(t.substring(n + 1).trim()), o;
58
- return r.length > 0 && (o = de(r.join(C))), { key: a, value: i, metadata: o };
59
- }
60
- }
61
- }
62
- }
63
- function $e(e) {
64
- return typeof e != "string" || e.length === 0 ? {} : e.split(S).map(function(r) {
65
- return D(r);
66
- }).filter(function(r) {
67
- return r !== void 0 && r.value.length > 0;
68
- }).reduce(function(r, t) {
69
- return r[t.key] = t.value, r;
70
- }, {});
71
- }
72
- var Je = (
73
- /** @class */
74
- function() {
75
- function e() {
76
- }
77
- return e.prototype.inject = function(r, t, n) {
78
- var a = T.getBaggage(r);
79
- if (!(!a || w(r))) {
80
- var i = J(a).filter(function(u) {
81
- return u.length <= Ye;
82
- }).slice(0, ke), o = $(i);
83
- o.length > 0 && n.set(t, P, o);
84
- }
85
- }, e.prototype.extract = function(r, t, n) {
86
- var a = n.get(t, P), i = Array.isArray(a) ? a.join(S) : a;
87
- if (!i)
88
- return r;
89
- var o = {};
90
- if (i.length === 0)
91
- return r;
92
- var u = i.split(S);
93
- return u.forEach(function(f) {
94
- var l = D(f);
95
- if (l) {
96
- var c = { value: l.value };
97
- l.metadata && (c.metadata = l.metadata), o[l.key] = c;
98
- }
99
- }), Object.entries(o).length === 0 ? r : T.setBaggage(r, T.createBaggage(o));
100
- }, e.prototype.fields = function() {
101
- return [P];
102
- }, e;
103
- }()
104
- ), qe = (
105
- /** @class */
106
- function() {
107
- function e(r, t) {
108
- this._monotonicClock = t, this._epochMillis = r.now(), this._performanceMillis = t.now();
109
- }
110
- return e.prototype.now = function() {
111
- var r = this._monotonicClock.now() - this._performanceMillis;
112
- return this._epochMillis + r;
113
- }, e;
114
- }()
115
- ), q = function(e) {
116
- var r = typeof Symbol == "function" && Symbol.iterator, t = r && e[r], n = 0;
117
- if (t) return t.call(e);
118
- if (e && typeof e.length == "number") return {
119
- next: function() {
120
- return e && n >= e.length && (e = void 0), { value: e && e[n++], done: !e };
121
- }
122
- };
123
- throw new TypeError(r ? "Object is not iterable." : "Symbol.iterator is not defined.");
124
- }, Qe = function(e, r) {
125
- var t = typeof Symbol == "function" && e[Symbol.iterator];
126
- if (!t) return e;
127
- var n = t.call(e), a, i = [], o;
128
- try {
129
- for (; (r === void 0 || r-- > 0) && !(a = n.next()).done; ) i.push(a.value);
130
- } catch (u) {
131
- o = { error: u };
132
- } finally {
133
- try {
134
- a && !a.done && (t = n.return) && t.call(n);
135
- } finally {
136
- if (o) throw o.error;
137
- }
138
- }
139
- return i;
140
- };
141
- function Ze(e) {
142
- var r, t, n = {};
143
- if (typeof e != "object" || e == null)
144
- return n;
145
- try {
146
- for (var a = q(Object.entries(e)), i = a.next(); !i.done; i = a.next()) {
147
- var o = Qe(i.value, 2), u = o[0], f = o[1];
148
- if (!Q(u)) {
149
- _.warn("Invalid attribute key: " + u);
150
- continue;
151
- }
152
- if (!Z(f)) {
153
- _.warn("Invalid attribute value set for key: " + u);
154
- continue;
155
- }
156
- Array.isArray(f) ? n[u] = f.slice() : n[u] = f;
157
- }
158
- } catch (l) {
159
- r = { error: l };
160
- } finally {
161
- try {
162
- i && !i.done && (t = a.return) && t.call(a);
163
- } finally {
164
- if (r) throw r.error;
165
- }
166
- }
167
- return n;
168
- }
169
- function Q(e) {
170
- return typeof e == "string" && e.length > 0;
171
- }
172
- function Z(e) {
173
- return e == null ? !0 : Array.isArray(e) ? er(e) : ee(e);
174
- }
175
- function er(e) {
176
- var r, t, n;
177
- try {
178
- for (var a = q(e), i = a.next(); !i.done; i = a.next()) {
179
- var o = i.value;
180
- if (o != null) {
181
- if (!n) {
182
- if (ee(o)) {
183
- n = typeof o;
184
- continue;
185
- }
186
- return !1;
187
- }
188
- if (typeof o !== n)
189
- return !1;
190
- }
191
- }
192
- } catch (u) {
193
- r = { error: u };
194
- } finally {
195
- try {
196
- i && !i.done && (t = a.return) && t.call(a);
197
- } finally {
198
- if (r) throw r.error;
199
- }
200
- }
201
- return !0;
202
- }
203
- function ee(e) {
204
- switch (typeof e) {
205
- case "number":
206
- case "boolean":
207
- case "string":
208
- return !0;
209
- }
210
- return !1;
211
- }
212
- function re() {
213
- return function(e) {
214
- _.error(rr(e));
215
- };
216
- }
217
- function rr(e) {
218
- return typeof e == "string" ? e : JSON.stringify(tr(e));
219
- }
220
- function tr(e) {
221
- for (var r = {}, t = e; t !== null; )
222
- Object.getOwnPropertyNames(t).forEach(function(n) {
223
- if (!r[n]) {
224
- var a = t[n];
225
- a && (r[n] = String(a));
226
- }
227
- }), t = Object.getPrototypeOf(t);
228
- return r;
229
- }
230
- var te = re();
231
- function nr(e) {
232
- te = e;
233
- }
234
- function ne(e) {
235
- try {
236
- te(e);
237
- } catch {
238
- }
239
- }
240
- var ar = function(e, r) {
241
- var t = typeof Symbol == "function" && e[Symbol.iterator];
242
- if (!t) return e;
243
- var n = t.call(e), a, i = [], o;
244
- try {
245
- for (; (r === void 0 || r-- > 0) && !(a = n.next()).done; ) i.push(a.value);
246
- } catch (u) {
247
- o = { error: u };
248
- } finally {
249
- try {
250
- a && !a.done && (t = n.return) && t.call(n);
251
- } finally {
252
- if (o) throw o.error;
253
- }
254
- }
255
- return i;
256
- }, ir = function(e, r, t) {
257
- if (t || arguments.length === 2) for (var n = 0, a = r.length, i; n < a; n++)
258
- (i || !(n in r)) && (i || (i = Array.prototype.slice.call(r, 0, n)), i[n] = r[n]);
259
- return e.concat(i || Array.prototype.slice.call(r));
260
- };
261
- function or(e) {
262
- return btoa(String.fromCharCode.apply(String, ir([], ar(X(e)), !1)));
263
- }
264
- var ur = 8, fr = 16, lr = (
265
- /** @class */
266
- /* @__PURE__ */ function() {
267
- function e() {
268
- this.generateTraceId = V(fr), this.generateSpanId = V(ur);
269
- }
270
- return e;
271
- }()
272
- ), y = Array(32);
273
- function V(e) {
274
- return function() {
275
- for (var t = 0; t < e * 2; t++)
276
- y[t] = Math.floor(Math.random() * 16) + 48, y[t] >= 58 && (y[t] += 39);
277
- return String.fromCharCode.apply(null, y.slice(0, e * 2));
278
- };
279
- }
280
- function sr(e) {
281
- }
282
- var cr = function(e) {
283
- var r = typeof Symbol == "function" && Symbol.iterator, t = r && e[r], n = 0;
284
- if (t) return t.call(e);
285
- if (e && typeof e.length == "number") return {
286
- next: function() {
287
- return e && n >= e.length && (e = void 0), { value: e && e[n++], done: !e };
288
- }
289
- };
290
- throw new TypeError(r ? "Object is not iterable." : "Symbol.iterator is not defined.");
291
- }, pr = (
292
- /** @class */
293
- function() {
294
- function e(r) {
295
- r === void 0 && (r = {});
296
- var t;
297
- this._propagators = (t = r.propagators) !== null && t !== void 0 ? t : [], this._fields = Array.from(new Set(this._propagators.map(function(n) {
298
- return typeof n.fields == "function" ? n.fields() : [];
299
- }).reduce(function(n, a) {
300
- return n.concat(a);
301
- }, [])));
302
- }
303
- return e.prototype.inject = function(r, t, n) {
304
- var a, i;
305
- try {
306
- for (var o = cr(this._propagators), u = o.next(); !u.done; u = o.next()) {
307
- var f = u.value;
308
- try {
309
- f.inject(r, t, n);
310
- } catch (l) {
311
- _.warn("Failed to inject with " + f.constructor.name + ". Err: " + l.message);
312
- }
313
- }
314
- } catch (l) {
315
- a = { error: l };
316
- } finally {
317
- try {
318
- u && !u.done && (i = o.return) && i.call(o);
319
- } finally {
320
- if (a) throw a.error;
321
- }
322
- }
323
- }, e.prototype.extract = function(r, t, n) {
324
- return this._propagators.reduce(function(a, i) {
325
- try {
326
- return i.extract(a, t, n);
327
- } catch (o) {
328
- _.warn("Failed to extract with " + i.constructor.name + ". Err: " + o.message);
329
- }
330
- return a;
331
- }, r);
332
- }, e.prototype.fields = function() {
333
- return this._fields.slice();
334
- }, e;
335
- }()
336
- ), I = "[_0-9a-z-*/]", dr = "[a-z]" + I + "{0,255}", _r = "[a-z0-9]" + I + "{0,240}@[a-z]" + I + "{0,13}", yr = new RegExp("^(?:" + dr + "|" + _r + ")$"), vr = /^[ -~]{0,255}[!-~]$/, hr = /,|=/;
337
- function mr(e) {
338
- return yr.test(e);
339
- }
340
- function gr(e) {
341
- return vr.test(e) && !hr.test(e);
342
- }
343
- var U = 32, Sr = 512, H = ",", K = "=", ae = (
344
- /** @class */
345
- function() {
346
- function e(r) {
347
- this._internalState = /* @__PURE__ */ new Map(), r && this._parse(r);
348
- }
349
- return e.prototype.set = function(r, t) {
350
- var n = this._clone();
351
- return n._internalState.has(r) && n._internalState.delete(r), n._internalState.set(r, t), n;
352
- }, e.prototype.unset = function(r) {
353
- var t = this._clone();
354
- return t._internalState.delete(r), t;
355
- }, e.prototype.get = function(r) {
356
- return this._internalState.get(r);
357
- }, e.prototype.serialize = function() {
358
- var r = this;
359
- return this._keys().reduce(function(t, n) {
360
- return t.push(n + K + r.get(n)), t;
361
- }, []).join(H);
362
- }, e.prototype._parse = function(r) {
363
- r.length > Sr || (this._internalState = r.split(H).reverse().reduce(function(t, n) {
364
- var a = n.trim(), i = a.indexOf(K);
365
- if (i !== -1) {
366
- var o = a.slice(0, i), u = a.slice(i + 1, n.length);
367
- mr(o) && gr(u) && t.set(o, u);
368
- }
369
- return t;
370
- }, /* @__PURE__ */ new Map()), this._internalState.size > U && (this._internalState = new Map(Array.from(this._internalState.entries()).reverse().slice(0, U))));
371
- }, e.prototype._keys = function() {
372
- return Array.from(this._internalState.keys()).reverse();
373
- }, e.prototype._clone = function() {
374
- var r = new e();
375
- return r._internalState = new Map(this._internalState), r;
376
- }, e;
377
- }()
378
- ), v = "traceparent", h = "tracestate", Ar = "00", Er = "(?!ff)[\\da-f]{2}", Tr = "(?![0]{32})[\\da-f]{32}", Pr = "(?![0]{16})[\\da-f]{16}", Rr = "[\\da-f]{2}", Or = new RegExp("^\\s?(" + Er + ")-(" + Tr + ")-(" + Pr + ")-(" + Rr + ")(-.*)?\\s?$");
379
- function ie(e) {
380
- var r = Or.exec(e);
381
- return !r || r[1] === "00" && r[5] ? null : {
382
- traceId: r[2],
383
- spanId: r[3],
384
- traceFlags: parseInt(r[4], 16)
385
- };
386
- }
387
- var br = (
388
- /** @class */
389
- function() {
390
- function e() {
391
- }
392
- return e.prototype.inject = function(r, t, n) {
393
- var a = O.getSpanContext(r);
394
- if (!(!a || w(r) || !Y(a))) {
395
- var i = Ar + "-" + a.traceId + "-" + a.spanId + "-0" + Number(a.traceFlags || b.NONE).toString(16);
396
- n.set(t, v, i), a.traceState && n.set(t, h, a.traceState.serialize());
397
- }
398
- }, e.prototype.extract = function(r, t, n) {
399
- var a = n.get(t, v);
400
- if (!a)
401
- return r;
402
- var i = Array.isArray(a) ? a[0] : a;
403
- if (typeof i != "string")
404
- return r;
405
- var o = ie(i);
406
- if (!o)
407
- return r;
408
- o.isRemote = !0;
409
- var u = n.get(t, h);
410
- if (u) {
411
- var f = Array.isArray(u) ? u.join(",") : u;
412
- o.traceState = new ae(typeof f == "string" ? f : void 0);
413
- }
414
- return O.setSpanContext(r, o);
415
- }, e.prototype.fields = function() {
416
- return [v, h];
417
- }, e;
418
- }()
419
- ), L = k("OpenTelemetry SDK Context Key RPC_METADATA"), j;
420
- (function(e) {
421
- e.HTTP = "http";
422
- })(j || (j = {}));
423
- function Cr(e, r) {
424
- return e.setValue(L, r);
425
- }
426
- function Ir(e) {
427
- return e.deleteValue(L);
428
- }
429
- function jr(e) {
430
- return e.getValue(L);
431
- }
432
- var M = (
433
- /** @class */
434
- function() {
435
- function e() {
436
- }
437
- return e.prototype.shouldSample = function() {
438
- return {
439
- decision: p.NOT_RECORD
440
- };
441
- }, e.prototype.toString = function() {
442
- return "AlwaysOffSampler";
443
- }, e;
444
- }()
445
- ), m = (
446
- /** @class */
447
- function() {
448
- function e() {
449
- }
450
- return e.prototype.shouldSample = function() {
451
- return {
452
- decision: p.RECORD_AND_SAMPLED
453
- };
454
- }, e.prototype.toString = function() {
455
- return "AlwaysOnSampler";
456
- }, e;
457
- }()
458
- ), Mr = (
459
- /** @class */
460
- function() {
461
- function e(r) {
462
- var t, n, a, i;
463
- this._root = r.root, this._root || (ne(new Error("ParentBasedSampler must have a root sampler configured")), this._root = new m()), this._remoteParentSampled = (t = r.remoteParentSampled) !== null && t !== void 0 ? t : new m(), this._remoteParentNotSampled = (n = r.remoteParentNotSampled) !== null && n !== void 0 ? n : new M(), this._localParentSampled = (a = r.localParentSampled) !== null && a !== void 0 ? a : new m(), this._localParentNotSampled = (i = r.localParentNotSampled) !== null && i !== void 0 ? i : new M();
464
- }
465
- return e.prototype.shouldSample = function(r, t, n, a, i, o) {
466
- var u = O.getSpanContext(r);
467
- return !u || !Y(u) ? this._root.shouldSample(r, t, n, a, i, o) : u.isRemote ? u.traceFlags & b.SAMPLED ? this._remoteParentSampled.shouldSample(r, t, n, a, i, o) : this._remoteParentNotSampled.shouldSample(r, t, n, a, i, o) : u.traceFlags & b.SAMPLED ? this._localParentSampled.shouldSample(r, t, n, a, i, o) : this._localParentNotSampled.shouldSample(r, t, n, a, i, o);
468
- }, e.prototype.toString = function() {
469
- return "ParentBased{root=" + this._root.toString() + ", remoteParentSampled=" + this._remoteParentSampled.toString() + ", remoteParentNotSampled=" + this._remoteParentNotSampled.toString() + ", localParentSampled=" + this._localParentSampled.toString() + ", localParentNotSampled=" + this._localParentNotSampled.toString() + "}";
470
- }, e;
471
- }()
472
- ), Nr = (
473
- /** @class */
474
- function() {
475
- function e(r) {
476
- r === void 0 && (r = 0), this._ratio = r, this._ratio = this._normalize(r), this._upperBound = Math.floor(this._ratio * 4294967295);
477
- }
478
- return e.prototype.shouldSample = function(r, t) {
479
- return {
480
- decision: Ie(t) && this._accumulate(t) < this._upperBound ? p.RECORD_AND_SAMPLED : p.NOT_RECORD
481
- };
482
- }, e.prototype.toString = function() {
483
- return "TraceIdRatioBased{" + this._ratio + "}";
484
- }, e.prototype._normalize = function(r) {
485
- return typeof r != "number" || isNaN(r) ? 0 : r >= 1 ? 1 : r <= 0 ? 0 : r;
486
- }, e.prototype._accumulate = function(r) {
487
- for (var t = 0, n = 0; n < r.length / 8; n++) {
488
- var a = n * 8, i = parseInt(r.slice(a, a + 8), 16);
489
- t = (t ^ i) >>> 0;
490
- }
491
- return t;
492
- }, e;
493
- }()
494
- ), wr = "[object Object]", Dr = "[object Null]", Lr = "[object Undefined]", xr = Function.prototype, oe = xr.toString, Gr = oe.call(Object), Br = Vr(Object.getPrototypeOf, Object), ue = Object.prototype, fe = ue.hasOwnProperty, s = Symbol ? Symbol.toStringTag : void 0, le = ue.toString;
495
- function Vr(e, r) {
496
- return function(t) {
497
- return e(r(t));
498
- };
499
- }
500
- function F(e) {
501
- if (!Ur(e) || Hr(e) !== wr)
502
- return !1;
503
- var r = Br(e);
504
- if (r === null)
505
- return !0;
506
- var t = fe.call(r, "constructor") && r.constructor;
507
- return typeof t == "function" && t instanceof t && oe.call(t) === Gr;
508
- }
509
- function Ur(e) {
510
- return e != null && typeof e == "object";
511
- }
512
- function Hr(e) {
513
- return e == null ? e === void 0 ? Lr : Dr : s && s in Object(e) ? Kr(e) : Fr(e);
514
- }
515
- function Kr(e) {
516
- var r = fe.call(e, s), t = e[s], n = !1;
517
- try {
518
- e[s] = void 0, n = !0;
519
- } catch {
520
- }
521
- var a = le.call(e);
522
- return n && (r ? e[s] = t : delete e[s]), a;
523
- }
524
- function Fr(e) {
525
- return le.call(e);
526
- }
527
- var zr = 20;
528
- function kr() {
529
- for (var e = [], r = 0; r < arguments.length; r++)
530
- e[r] = arguments[r];
531
- for (var t = e.shift(), n = /* @__PURE__ */ new WeakMap(); e.length > 0; )
532
- t = se(t, e.shift(), 0, n);
533
- return t;
534
- }
535
- function R(e) {
536
- return A(e) ? e.slice() : e;
537
- }
538
- function se(e, r, t, n) {
539
- t === void 0 && (t = 0);
540
- var a;
541
- if (!(t > zr)) {
542
- if (t++, g(e) || g(r) || ce(r))
543
- a = R(r);
544
- else if (A(e)) {
545
- if (a = e.slice(), A(r))
546
- for (var i = 0, o = r.length; i < o; i++)
547
- a.push(R(r[i]));
548
- else if (d(r))
549
- for (var u = Object.keys(r), i = 0, o = u.length; i < o; i++) {
550
- var f = u[i];
551
- a[f] = R(r[f]);
552
- }
553
- } else if (d(e))
554
- if (d(r)) {
555
- if (!Yr(e, r))
556
- return r;
557
- a = Object.assign({}, e);
558
- for (var u = Object.keys(r), i = 0, o = u.length; i < o; i++) {
559
- var f = u[i], l = r[f];
560
- if (g(l))
561
- typeof l > "u" ? delete a[f] : a[f] = l;
562
- else {
563
- var c = a[f], E = l;
564
- if (z(e, f, n) || z(r, f, n))
565
- delete a[f];
566
- else {
567
- if (d(c) && d(E)) {
568
- var x = n.get(c) || [], G = n.get(E) || [];
569
- x.push({ obj: e, key: f }), G.push({ obj: r, key: f }), n.set(c, x), n.set(E, G);
570
- }
571
- a[f] = se(a[f], l, t, n);
572
- }
573
- }
574
- }
575
- } else
576
- a = r;
577
- return a;
578
- }
579
- }
580
- function z(e, r, t) {
581
- for (var n = t.get(e[r]) || [], a = 0, i = n.length; a < i; a++) {
582
- var o = n[a];
583
- if (o.key === r && o.obj === e)
584
- return !0;
585
- }
586
- return !1;
587
- }
588
- function A(e) {
589
- return Array.isArray(e);
590
- }
591
- function ce(e) {
592
- return typeof e == "function";
593
- }
594
- function d(e) {
595
- return !g(e) && !A(e) && !ce(e) && typeof e == "object";
596
- }
597
- function g(e) {
598
- return typeof e == "string" || typeof e == "number" || typeof e == "boolean" || typeof e > "u" || e instanceof Date || e instanceof RegExp || e === null;
599
- }
600
- function Yr(e, r) {
601
- return !(!F(e) || !F(r));
602
- }
603
- var Xr = /* @__PURE__ */ function() {
604
- var e = function(r, t) {
605
- return e = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(n, a) {
606
- n.__proto__ = a;
607
- } || function(n, a) {
608
- for (var i in a) Object.prototype.hasOwnProperty.call(a, i) && (n[i] = a[i]);
609
- }, e(r, t);
610
- };
611
- return function(r, t) {
612
- if (typeof t != "function" && t !== null)
613
- throw new TypeError("Class extends value " + String(t) + " is not a constructor or null");
614
- e(r, t);
615
- function n() {
616
- this.constructor = r;
617
- }
618
- r.prototype = t === null ? Object.create(t) : (n.prototype = t.prototype, new n());
619
- };
620
- }(), pe = (
621
- /** @class */
622
- function(e) {
623
- Xr(r, e);
624
- function r(t) {
625
- var n = e.call(this, t) || this;
626
- return Object.setPrototypeOf(n, r.prototype), n;
627
- }
628
- return r;
629
- }(Error)
630
- );
631
- function Wr(e, r) {
632
- var t, n = new Promise(function(i, o) {
633
- t = setTimeout(function() {
634
- o(new pe("Operation timed out."));
635
- }, r);
636
- });
637
- return Promise.race([e, n]).then(function(a) {
638
- return clearTimeout(t), a;
639
- }, function(a) {
640
- throw clearTimeout(t), a;
641
- });
642
- }
643
- function $r(e) {
644
- return typeof e == "function" && typeof e.__original == "function" && typeof e.__unwrap == "function" && e.__wrapped === !0;
645
- }
646
- var Jr = (
647
- /** @class */
648
- function() {
649
- function e() {
650
- var r = this;
651
- this._promise = new Promise(function(t, n) {
652
- r._resolve = t, r._reject = n;
653
- });
654
- }
655
- return Object.defineProperty(e.prototype, "promise", {
656
- get: function() {
657
- return this._promise;
658
- },
659
- enumerable: !1,
660
- configurable: !0
661
- }), e.prototype.resolve = function(r) {
662
- this._resolve(r);
663
- }, e.prototype.reject = function(r) {
664
- this._reject(r);
665
- }, e;
666
- }()
667
- ), qr = function(e, r) {
668
- var t = typeof Symbol == "function" && e[Symbol.iterator];
669
- if (!t) return e;
670
- var n = t.call(e), a, i = [], o;
671
- try {
672
- for (; (r === void 0 || r-- > 0) && !(a = n.next()).done; ) i.push(a.value);
673
- } catch (u) {
674
- o = { error: u };
675
- } finally {
676
- try {
677
- a && !a.done && (t = n.return) && t.call(n);
678
- } finally {
679
- if (o) throw o.error;
680
- }
681
- }
682
- return i;
683
- }, Qr = function(e, r, t) {
684
- if (t || arguments.length === 2) for (var n = 0, a = r.length, i; n < a; n++)
685
- (i || !(n in r)) && (i || (i = Array.prototype.slice.call(r, 0, n)), i[n] = r[n]);
686
- return e.concat(i || Array.prototype.slice.call(r));
687
- }, Zr = (
688
- /** @class */
689
- function() {
690
- function e(r, t) {
691
- this._callback = r, this._that = t, this._isCalled = !1, this._deferred = new Jr();
692
- }
693
- return Object.defineProperty(e.prototype, "isCalled", {
694
- get: function() {
695
- return this._isCalled;
696
- },
697
- enumerable: !1,
698
- configurable: !0
699
- }), Object.defineProperty(e.prototype, "promise", {
700
- get: function() {
701
- return this._deferred.promise;
702
- },
703
- enumerable: !1,
704
- configurable: !0
705
- }), e.prototype.call = function() {
706
- for (var r, t = this, n = [], a = 0; a < arguments.length; a++)
707
- n[a] = arguments[a];
708
- if (!this._isCalled) {
709
- this._isCalled = !0;
710
- try {
711
- Promise.resolve((r = this._callback).call.apply(r, Qr([this._that], qr(n), !1))).then(function(i) {
712
- return t._deferred.resolve(i);
713
- }, function(i) {
714
- return t._deferred.reject(i);
715
- });
716
- } catch (i) {
717
- this._deferred.reject(i);
718
- }
719
- }
720
- return this._deferred.promise;
721
- }, e;
722
- }()
723
- );
724
- function et(e, r) {
725
- return new Promise(function(t) {
726
- B.with(W(B.active()), function() {
727
- e.export(r, function(n) {
728
- t(n);
729
- });
730
- });
731
- });
732
- }
733
- var rt = {
734
- getKeyPairs: J,
735
- serializeKeyPairs: $,
736
- parseKeyPairsIntoRecord: $e,
737
- parsePairKeyValue: D
738
- }, tt = {
739
- _export: et
740
- };
741
- const lt = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
742
- __proto__: null,
743
- AlwaysOffSampler: M,
744
- AlwaysOnSampler: m,
745
- AnchoredClock: qe,
746
- BindOnceFuture: Zr,
747
- CompositePropagator: pr,
748
- DEFAULT_ATTRIBUTE_COUNT_LIMIT: Me,
749
- DEFAULT_ATTRIBUTE_VALUE_LENGTH_LIMIT: Ne,
750
- DEFAULT_ENVIRONMENT: we,
751
- DEFAULT_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT: De,
752
- DEFAULT_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT: Le,
753
- get ExportResultCode() {
754
- return je;
755
- },
756
- ParentBasedSampler: Mr,
757
- get RPCType() {
758
- return j;
759
- },
760
- RandomIdGenerator: lr,
761
- SDK_INFO: xe,
762
- TRACE_PARENT_HEADER: v,
763
- TRACE_STATE_HEADER: h,
764
- TimeoutError: pe,
765
- TraceIdRatioBasedSampler: Nr,
766
- TraceState: ae,
767
- get TracesSamplerValues() {
768
- return Ge;
769
- },
770
- VERSION: Be,
771
- W3CBaggagePropagator: Je,
772
- W3CTraceContextPropagator: br,
773
- _globalThis: Ke,
774
- addHrTimes: _e,
775
- baggageUtils: rt,
776
- callWithTimeout: Wr,
777
- deleteRPCMetadata: Ir,
778
- getEnv: Ve,
779
- getEnvWithoutDefaults: Ue,
780
- getRPCMetadata: jr,
781
- getTimeOrigin: ye,
782
- globalErrorHandler: ne,
783
- hexToBase64: or,
784
- hexToBinary: X,
785
- hrTime: ve,
786
- hrTimeDuration: he,
787
- hrTimeToMicroseconds: me,
788
- hrTimeToMilliseconds: ge,
789
- hrTimeToNanoseconds: Se,
790
- hrTimeToTimeStamp: Ae,
791
- internal: tt,
792
- isAttributeKey: Q,
793
- isAttributeValue: Z,
794
- isTimeInput: Ee,
795
- isTimeInputHrTime: Te,
796
- isTracingSuppressed: w,
797
- isUrlIgnored: Pe,
798
- isWrapped: $r,
799
- loggingErrorHandler: re,
800
- merge: kr,
801
- millisToHrTime: Re,
802
- otperformance: Oe,
803
- parseEnvironment: He,
804
- parseTraceParent: ie,
805
- sanitizeAttributes: Ze,
806
- setGlobalErrorHandler: nr,
807
- setRPCMetadata: Cr,
808
- suppressTracing: W,
809
- timeInputToHrTime: be,
810
- unrefTimer: sr,
811
- unsuppressTracing: Fe,
812
- urlMatches: Ce
813
- }, Symbol.toStringTag, { value: "Module" }));
814
- export {
815
- Zr as B,
816
- pr as C,
817
- p as S,
818
- br as W,
819
- W as a,
820
- w as b,
821
- Je as c,
822
- tt as d,
823
- lt as e,
824
- ne as g,
825
- Z as i,
826
- kr as m,
827
- Ze as s,
828
- sr as u
829
- };
830
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiaW5kZXgtIX57MDBsfX4uanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IHogYXMgYmFnZ2FnZUVudHJ5TWV0YWRhdGFGcm9tU3RyaW5nLCBwIGFzIHByb3BhZ2F0aW9uLCByIGFzIGFkZEhyVGltZXMsIHcgYXMgZ2V0VGltZU9yaWdpbiwgaiBhcyBoclRpbWUsIG4gYXMgaHJUaW1lRHVyYXRpb24sIHkgYXMgaHJUaW1lVG9NaWNyb3NlY29uZHMsIGRKIGFzIGhyVGltZVRvTWlsbGlzZWNvbmRzLCBoIGFzIGhyVGltZVRvTmFub3NlY29uZHMsIGRLIGFzIGhyVGltZVRvVGltZVN0YW1wLCBsIGFzIGlzVGltZUlucHV0LCBxIGFzIGlzVGltZUlucHV0SHJUaW1lLCBpIGFzIGlzVXJsSWdub3JlZCwgbSBhcyBtaWxsaXNUb0hyVGltZSwgbyBhcyBvdHBlcmZvcm1hbmNlLCB0IGFzIHRpbWVJbnB1dFRvSHJUaW1lLCB1IGFzIHVybE1hdGNoZXMgfSBmcm9tICcuL3VybC0hfnswMDl9fi5qcyc7XG5pbXBvcnQgeyBiIGFzIGNyZWF0ZUNvbnRleHRLZXksIHQgYXMgdHJhY2UsIGkgYXMgaXNTcGFuQ29udGV4dFZhbGlkLCBUIGFzIFRyYWNlRmxhZ3MsIGQgYXMgaXNWYWxpZFRyYWNlSWQsIGMgYXMgY29udGV4dCB9IGZyb20gJy4vaW5kZXgtIX57MDA2fX4uanMnO1xuaW1wb3J0IHsgZCBhcyBkaWFnIH0gZnJvbSAnLi9kaWFnLWFwaS0hfnswMDV9fi5qcyc7XG5pbXBvcnQgeyBoIGFzIGhleFRvQmluYXJ5LCBFIGFzIEV4cG9ydFJlc3VsdENvZGUgfSBmcm9tICcuL0V4cG9ydFJlc3VsdC0hfnswMGR9fi5qcyc7XG5pbXBvcnQgeyBEIGFzIERFRkFVTFRfQVRUUklCVVRFX0NPVU5UX0xJTUlULCBqIGFzIERFRkFVTFRfQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVCwgYnIgYXMgREVGQVVMVF9FTlZJUk9OTUVOVCwgYnMgYXMgREVGQVVMVF9TUEFOX0FUVFJJQlVURV9QRVJfRVZFTlRfQ09VTlRfTElNSVQsIGJ0IGFzIERFRkFVTFRfU1BBTl9BVFRSSUJVVEVfUEVSX0xJTktfQ09VTlRfTElNSVQsIGIgYXMgU0RLX0lORk8sIFQgYXMgVHJhY2VzU2FtcGxlclZhbHVlcywgYnUgYXMgVkVSU0lPTiQxLCBoIGFzIGdldEVudiwgaSBhcyBnZXRFbnZXaXRob3V0RGVmYXVsdHMsIGJ2IGFzIHBhcnNlRW52aXJvbm1lbnQgfSBmcm9tICcuL3Nkay1pbmZvLSF+ezAwYn1+LmpzJztcbmltcG9ydCB7IF8gYXMgX2dsb2JhbFRoaXMgfSBmcm9tICcuL3V0aWxzLSF+ezAwY31+LmpzJztcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIHRoZSBvbmUgZGVjbGFyZWQgaW4gQG9wZW50ZWxlbWV0cnkvc2RrLXRyYWNlLWJhc2UgaW5zdGVhZC5cbiAqIEEgc2FtcGxpbmcgZGVjaXNpb24gdGhhdCBkZXRlcm1pbmVzIGhvdyBhIHtAbGluayBTcGFufSB3aWxsIGJlIHJlY29yZGVkXG4gKiBhbmQgY29sbGVjdGVkLlxuICovXG52YXIgU2FtcGxpbmdEZWNpc2lvbjtcbihmdW5jdGlvbiAoU2FtcGxpbmdEZWNpc2lvbikge1xuICAgIC8qKlxuICAgICAqIGBTcGFuLmlzUmVjb3JkaW5nKCkgPT09IGZhbHNlYCwgc3BhbiB3aWxsIG5vdCBiZSByZWNvcmRlZCBhbmQgYWxsIGV2ZW50c1xuICAgICAqIGFuZCBhdHRyaWJ1dGVzIHdpbGwgYmUgZHJvcHBlZC5cbiAgICAgKi9cbiAgICBTYW1wbGluZ0RlY2lzaW9uW1NhbXBsaW5nRGVjaXNpb25bXCJOT1RfUkVDT1JEXCJdID0gMF0gPSBcIk5PVF9SRUNPUkRcIjtcbiAgICAvKipcbiAgICAgKiBgU3Bhbi5pc1JlY29yZGluZygpID09PSB0cnVlYCwgYnV0IGBTYW1wbGVkYCBmbGFnIGluIHtAbGluayBUcmFjZUZsYWdzfVxuICAgICAqIE1VU1QgTk9UIGJlIHNldC5cbiAgICAgKi9cbiAgICBTYW1wbGluZ0RlY2lzaW9uW1NhbXBsaW5nRGVjaXNpb25bXCJSRUNPUkRcIl0gPSAxXSA9IFwiUkVDT1JEXCI7XG4gICAgLyoqXG4gICAgICogYFNwYW4uaXNSZWNvcmRpbmcoKSA9PT0gdHJ1ZWAgQU5EIGBTYW1wbGVkYCBmbGFnIGluIHtAbGluayBUcmFjZUZsYWdzfVxuICAgICAqIE1VU1QgYmUgc2V0LlxuICAgICAqL1xuICAgIFNhbXBsaW5nRGVjaXNpb25bU2FtcGxpbmdEZWNpc2lvbltcIlJFQ09SRF9BTkRfU0FNUExFRFwiXSA9IDJdID0gXCJSRUNPUkRfQU5EX1NBTVBMRURcIjtcbn0pKFNhbXBsaW5nRGVjaXNpb24gfHwgKFNhbXBsaW5nRGVjaXNpb24gPSB7fSkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIFNVUFBSRVNTX1RSQUNJTkdfS0VZID0gY3JlYXRlQ29udGV4dEtleSgnT3BlblRlbGVtZXRyeSBTREsgQ29udGV4dCBLZXkgU1VQUFJFU1NfVFJBQ0lORycpO1xuZnVuY3Rpb24gc3VwcHJlc3NUcmFjaW5nKGNvbnRleHQpIHtcbiAgICByZXR1cm4gY29udGV4dC5zZXRWYWx1ZShTVVBQUkVTU19UUkFDSU5HX0tFWSwgdHJ1ZSk7XG59XG5mdW5jdGlvbiB1bnN1cHByZXNzVHJhY2luZyhjb250ZXh0KSB7XG4gICAgcmV0dXJuIGNvbnRleHQuZGVsZXRlVmFsdWUoU1VQUFJFU1NfVFJBQ0lOR19LRVkpO1xufVxuZnVuY3Rpb24gaXNUcmFjaW5nU3VwcHJlc3NlZChjb250ZXh0KSB7XG4gICAgcmV0dXJuIGNvbnRleHQuZ2V0VmFsdWUoU1VQUFJFU1NfVFJBQ0lOR19LRVkpID09PSB0cnVlO1xufVxuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIEJBR0dBR0VfS0VZX1BBSVJfU0VQQVJBVE9SID0gJz0nO1xudmFyIEJBR0dBR0VfUFJPUEVSVElFU19TRVBBUkFUT1IgPSAnOyc7XG52YXIgQkFHR0FHRV9JVEVNU19TRVBBUkFUT1IgPSAnLCc7XG4vLyBOYW1lIG9mIHRoZSBodHRwIGhlYWRlciB1c2VkIHRvIHByb3BhZ2F0ZSB0aGUgYmFnZ2FnZVxudmFyIEJBR0dBR0VfSEVBREVSID0gJ2JhZ2dhZ2UnO1xuLy8gTWF4aW11bSBudW1iZXIgb2YgbmFtZS12YWx1ZSBwYWlycyBhbGxvd2VkIGJ5IHczYyBzcGVjXG52YXIgQkFHR0FHRV9NQVhfTkFNRV9WQUxVRV9QQUlSUyA9IDE4MDtcbi8vIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHBlciBhIHNpbmdsZSBuYW1lLXZhbHVlIHBhaXIgYWxsb3dlZCBieSB3M2Mgc3BlY1xudmFyIEJBR0dBR0VfTUFYX1BFUl9OQU1FX1ZBTFVFX1BBSVJTID0gNDA5Njtcbi8vIE1heGltdW0gdG90YWwgbGVuZ3RoIG9mIGFsbCBuYW1lLXZhbHVlIHBhaXJzIGFsbG93ZWQgYnkgdzNjIHNwZWNcbnZhciBCQUdHQUdFX01BWF9UT1RBTF9MRU5HVEggPSA4MTkyO1xuXG52YXIgX19yZWFkJDMgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX3JlYWQpIHx8IGZ1bmN0aW9uIChvLCBuKSB7XG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICAgIGlmICghbSkgcmV0dXJuIG87XG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gICAgdHJ5IHtcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gICAgfVxuICAgIHJldHVybiBhcjtcbn07XG5mdW5jdGlvbiBzZXJpYWxpemVLZXlQYWlycyhrZXlQYWlycykge1xuICAgIHJldHVybiBrZXlQYWlycy5yZWR1Y2UoZnVuY3Rpb24gKGhWYWx1ZSwgY3VycmVudCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBcIlwiICsgaFZhbHVlICsgKGhWYWx1ZSAhPT0gJycgPyBCQUdHQUdFX0lURU1TX1NFUEFSQVRPUiA6ICcnKSArIGN1cnJlbnQ7XG4gICAgICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPiBCQUdHQUdFX01BWF9UT1RBTF9MRU5HVEggPyBoVmFsdWUgOiB2YWx1ZTtcbiAgICB9LCAnJyk7XG59XG5mdW5jdGlvbiBnZXRLZXlQYWlycyhiYWdnYWdlKSB7XG4gICAgcmV0dXJuIGJhZ2dhZ2UuZ2V0QWxsRW50cmllcygpLm1hcChmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgdmFyIF9iID0gX19yZWFkJDMoX2EsIDIpLCBrZXkgPSBfYlswXSwgdmFsdWUgPSBfYlsxXTtcbiAgICAgICAgdmFyIGVudHJ5ID0gZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgKyBcIj1cIiArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZS52YWx1ZSk7XG4gICAgICAgIC8vIGluY2x1ZGUgb3BhcXVlIG1ldGFkYXRhIGlmIHByb3ZpZGVkXG4gICAgICAgIC8vIE5PVEU6IHdlIGludGVudGlvbmFsbHkgZG9uJ3QgVVJJLWVuY29kZSB0aGUgbWV0YWRhdGEgLSB0aGF0IHJlc3BvbnNpYmlsaXR5IGZhbGxzIG9uIHRoZSBtZXRhZGF0YSBpbXBsZW1lbnRhdGlvblxuICAgICAgICBpZiAodmFsdWUubWV0YWRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZW50cnkgKz0gQkFHR0FHRV9QUk9QRVJUSUVTX1NFUEFSQVRPUiArIHZhbHVlLm1ldGFkYXRhLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH0pO1xufVxuZnVuY3Rpb24gcGFyc2VQYWlyS2V5VmFsdWUoZW50cnkpIHtcbiAgICB2YXIgdmFsdWVQcm9wcyA9IGVudHJ5LnNwbGl0KEJBR0dBR0VfUFJPUEVSVElFU19TRVBBUkFUT1IpO1xuICAgIGlmICh2YWx1ZVByb3BzLmxlbmd0aCA8PSAwKVxuICAgICAgICByZXR1cm47XG4gICAgdmFyIGtleVBhaXJQYXJ0ID0gdmFsdWVQcm9wcy5zaGlmdCgpO1xuICAgIGlmICgha2V5UGFpclBhcnQpXG4gICAgICAgIHJldHVybjtcbiAgICB2YXIgc2VwYXJhdG9ySW5kZXggPSBrZXlQYWlyUGFydC5pbmRleE9mKEJBR0dBR0VfS0VZX1BBSVJfU0VQQVJBVE9SKTtcbiAgICBpZiAoc2VwYXJhdG9ySW5kZXggPD0gMClcbiAgICAgICAgcmV0dXJuO1xuICAgIHZhciBrZXkgPSBkZWNvZGVVUklDb21wb25lbnQoa2V5UGFpclBhcnQuc3Vic3RyaW5nKDAsIHNlcGFyYXRvckluZGV4KS50cmltKCkpO1xuICAgIHZhciB2YWx1ZSA9IGRlY29kZVVSSUNvbXBvbmVudChrZXlQYWlyUGFydC5zdWJzdHJpbmcoc2VwYXJhdG9ySW5kZXggKyAxKS50cmltKCkpO1xuICAgIHZhciBtZXRhZGF0YTtcbiAgICBpZiAodmFsdWVQcm9wcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG1ldGFkYXRhID0gYmFnZ2FnZUVudHJ5TWV0YWRhdGFGcm9tU3RyaW5nKHZhbHVlUHJvcHMuam9pbihCQUdHQUdFX1BST1BFUlRJRVNfU0VQQVJBVE9SKSk7XG4gICAgfVxuICAgIHJldHVybiB7IGtleToga2V5LCB2YWx1ZTogdmFsdWUsIG1ldGFkYXRhOiBtZXRhZGF0YSB9O1xufVxuLyoqXG4gKiBQYXJzZSBhIHN0cmluZyBzZXJpYWxpemVkIGluIHRoZSBiYWdnYWdlIEhUVFAgRm9ybWF0ICh3aXRob3V0IG1ldGFkYXRhKTpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS93M2MvYmFnZ2FnZS9ibG9iL21hc3Rlci9iYWdnYWdlL0hUVFBfSEVBREVSX0ZPUk1BVC5tZFxuICovXG5mdW5jdGlvbiBwYXJzZUtleVBhaXJzSW50b1JlY29yZCh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8IHZhbHVlLmxlbmd0aCA9PT0gMClcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIHJldHVybiB2YWx1ZVxuICAgICAgICAuc3BsaXQoQkFHR0FHRV9JVEVNU19TRVBBUkFUT1IpXG4gICAgICAgIC5tYXAoZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICAgIHJldHVybiBwYXJzZVBhaXJLZXlWYWx1ZShlbnRyeSk7XG4gICAgfSlcbiAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoa2V5UGFpcikgeyByZXR1cm4ga2V5UGFpciAhPT0gdW5kZWZpbmVkICYmIGtleVBhaXIudmFsdWUubGVuZ3RoID4gMDsgfSlcbiAgICAgICAgLnJlZHVjZShmdW5jdGlvbiAoaGVhZGVycywga2V5UGFpcikge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICBoZWFkZXJzW2tleVBhaXIua2V5XSA9IGtleVBhaXIudmFsdWU7XG4gICAgICAgIHJldHVybiBoZWFkZXJzO1xuICAgIH0sIHt9KTtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogUHJvcGFnYXRlcyB7QGxpbmsgQmFnZ2FnZX0gdGhyb3VnaCBDb250ZXh0IGZvcm1hdCBwcm9wYWdhdGlvbi5cbiAqXG4gKiBCYXNlZCBvbiB0aGUgQmFnZ2FnZSBzcGVjaWZpY2F0aW9uOlxuICogaHR0cHM6Ly93M2MuZ2l0aHViLmlvL2JhZ2dhZ2UvXG4gKi9cbnZhciBXM0NCYWdnYWdlUHJvcGFnYXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBXM0NCYWdnYWdlUHJvcGFnYXRvcigpIHtcbiAgICB9XG4gICAgVzNDQmFnZ2FnZVByb3BhZ2F0b3IucHJvdG90eXBlLmluamVjdCA9IGZ1bmN0aW9uIChjb250ZXh0LCBjYXJyaWVyLCBzZXR0ZXIpIHtcbiAgICAgICAgdmFyIGJhZ2dhZ2UgPSBwcm9wYWdhdGlvbi5nZXRCYWdnYWdlKGNvbnRleHQpO1xuICAgICAgICBpZiAoIWJhZ2dhZ2UgfHwgaXNUcmFjaW5nU3VwcHJlc3NlZChjb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdmFyIGtleVBhaXJzID0gZ2V0S2V5UGFpcnMoYmFnZ2FnZSlcbiAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKHBhaXIpIHtcbiAgICAgICAgICAgIHJldHVybiBwYWlyLmxlbmd0aCA8PSBCQUdHQUdFX01BWF9QRVJfTkFNRV9WQUxVRV9QQUlSUztcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5zbGljZSgwLCBCQUdHQUdFX01BWF9OQU1FX1ZBTFVFX1BBSVJTKTtcbiAgICAgICAgdmFyIGhlYWRlclZhbHVlID0gc2VyaWFsaXplS2V5UGFpcnMoa2V5UGFpcnMpO1xuICAgICAgICBpZiAoaGVhZGVyVmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc2V0dGVyLnNldChjYXJyaWVyLCBCQUdHQUdFX0hFQURFUiwgaGVhZGVyVmFsdWUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBXM0NCYWdnYWdlUHJvcGFnYXRvci5wcm90b3R5cGUuZXh0cmFjdCA9IGZ1bmN0aW9uIChjb250ZXh0LCBjYXJyaWVyLCBnZXR0ZXIpIHtcbiAgICAgICAgdmFyIGhlYWRlclZhbHVlID0gZ2V0dGVyLmdldChjYXJyaWVyLCBCQUdHQUdFX0hFQURFUik7XG4gICAgICAgIHZhciBiYWdnYWdlU3RyaW5nID0gQXJyYXkuaXNBcnJheShoZWFkZXJWYWx1ZSlcbiAgICAgICAgICAgID8gaGVhZGVyVmFsdWUuam9pbihCQUdHQUdFX0lURU1TX1NFUEFSQVRPUilcbiAgICAgICAgICAgIDogaGVhZGVyVmFsdWU7XG4gICAgICAgIGlmICghYmFnZ2FnZVN0cmluZylcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB2YXIgYmFnZ2FnZSA9IHt9O1xuICAgICAgICBpZiAoYmFnZ2FnZVN0cmluZy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYWlycyA9IGJhZ2dhZ2VTdHJpbmcuc3BsaXQoQkFHR0FHRV9JVEVNU19TRVBBUkFUT1IpO1xuICAgICAgICBwYWlycy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICAgICAgdmFyIGtleVBhaXIgPSBwYXJzZVBhaXJLZXlWYWx1ZShlbnRyeSk7XG4gICAgICAgICAgICBpZiAoa2V5UGFpcikge1xuICAgICAgICAgICAgICAgIHZhciBiYWdnYWdlRW50cnkgPSB7IHZhbHVlOiBrZXlQYWlyLnZhbHVlIH07XG4gICAgICAgICAgICAgICAgaWYgKGtleVBhaXIubWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgYmFnZ2FnZUVudHJ5Lm1ldGFkYXRhID0ga2V5UGFpci5tZXRhZGF0YTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYmFnZ2FnZVtrZXlQYWlyLmtleV0gPSBiYWdnYWdlRW50cnk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoT2JqZWN0LmVudHJpZXMoYmFnZ2FnZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcGFnYXRpb24uc2V0QmFnZ2FnZShjb250ZXh0LCBwcm9wYWdhdGlvbi5jcmVhdGVCYWdnYWdlKGJhZ2dhZ2UpKTtcbiAgICB9O1xuICAgIFczQ0JhZ2dhZ2VQcm9wYWdhdG9yLnByb3RvdHlwZS5maWVsZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBbQkFHR0FHRV9IRUFERVJdO1xuICAgIH07XG4gICAgcmV0dXJuIFczQ0JhZ2dhZ2VQcm9wYWdhdG9yO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQSB1dGlsaXR5IGZvciByZXR1cm5pbmcgd2FsbCB0aW1lcyBhbmNob3JlZCB0byBhIGdpdmVuIHBvaW50IGluIHRpbWUuIFdhbGwgdGltZSBtZWFzdXJlbWVudHMgd2lsbFxuICogbm90IGJlIHRha2VuIGZyb20gdGhlIHN5c3RlbSwgYnV0IGluc3RlYWQgYXJlIGNvbXB1dGVkIGJ5IGFkZGluZyBhIG1vbm90b25pYyBjbG9jayB0aW1lXG4gKiB0byB0aGUgYW5jaG9yIHBvaW50LlxuICpcbiAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIHN5c3RlbSB0aW1lIGNhbiBjaGFuZ2UgYW5kIHJlc3VsdCBpbiB1bmV4cGVjdGVkIHNpdHVhdGlvbnMgbGlrZVxuICogc3BhbnMgZW5kaW5nIGJlZm9yZSB0aGV5IGFyZSBzdGFydGVkLiBDcmVhdGluZyBhbiBhbmNob3JlZCBjbG9jayBmb3IgZWFjaCBsb2NhbCByb290IHNwYW5cbiAqIGVuc3VyZXMgdGhhdCBzcGFuIHRpbWluZ3MgYW5kIGR1cmF0aW9ucyBhcmUgYWNjdXJhdGUgd2hpbGUgcHJldmVudGluZyBzcGFuIHRpbWVzIGZyb20gZHJpZnRpbmdcbiAqIHRvbyBmYXIgZnJvbSB0aGUgc3lzdGVtIGNsb2NrLlxuICpcbiAqIE9ubHkgY3JlYXRpbmcgYW4gYW5jaG9yZWQgY2xvY2sgb25jZSBwZXIgbG9jYWwgdHJhY2UgZW5zdXJlcyBzcGFuIHRpbWVzIGFyZSBjb3JyZWN0IHJlbGF0aXZlXG4gKiB0byBlYWNoIG90aGVyLiBGb3IgZXhhbXBsZSwgYSBjaGlsZCBzcGFuIHdpbGwgbmV2ZXIgaGF2ZSBhIHN0YXJ0IHRpbWUgYmVmb3JlIGl0cyBwYXJlbnQgZXZlblxuICogaWYgdGhlIHN5c3RlbSBjbG9jayBpcyBjb3JyZWN0ZWQgZHVyaW5nIHRoZSBsb2NhbCB0cmFjZS5cbiAqXG4gKiBIZWF2aWx5IGluc3BpcmVkIGJ5IHRoZSBPVGVsIEphdmEgYW5jaG9yZWQgY2xvY2tcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuLXRlbGVtZXRyeS9vcGVudGVsZW1ldHJ5LWphdmEvYmxvYi9tYWluL3Nkay90cmFjZS9zcmMvbWFpbi9qYXZhL2lvL29wZW50ZWxlbWV0cnkvc2RrL3RyYWNlL0FuY2hvcmVkQ2xvY2suamF2YVxuICovXG52YXIgQW5jaG9yZWRDbG9jayA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgQW5jaG9yZWRDbG9jayBhbmNob3JlZCB0byB0aGUgY3VycmVudCB0aW1lIHJldHVybmVkIGJ5IHN5c3RlbUNsb2NrLlxuICAgICAqXG4gICAgICogQHBhcmFtIHN5c3RlbUNsb2NrIHNob3VsZCBiZSBhIGNsb2NrIHRoYXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSBKYW51YXJ5IDEgMTk3MCBzdWNoIGFzIERhdGVcbiAgICAgKiBAcGFyYW0gbW9ub3RvbmljQ2xvY2sgc2hvdWxkIGJlIGEgY2xvY2sgdGhhdCBjb3VudHMgbWlsbGlzZWNvbmRzIG1vbm90b25pY2FsbHkgc3VjaCBhcyB3aW5kb3cucGVyZm9ybWFuY2Ugb3IgcGVyZl9ob29rcy5wZXJmb3JtYW5jZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIEFuY2hvcmVkQ2xvY2soc3lzdGVtQ2xvY2ssIG1vbm90b25pY0Nsb2NrKSB7XG4gICAgICAgIHRoaXMuX21vbm90b25pY0Nsb2NrID0gbW9ub3RvbmljQ2xvY2s7XG4gICAgICAgIHRoaXMuX2Vwb2NoTWlsbGlzID0gc3lzdGVtQ2xvY2subm93KCk7XG4gICAgICAgIHRoaXMuX3BlcmZvcm1hbmNlTWlsbGlzID0gbW9ub3RvbmljQ2xvY2subm93KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdGltZSBieSBhZGRpbmcgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgdGhlXG4gICAgICogQW5jaG9yZWRDbG9jayB3YXMgY3JlYXRlZCB0byB0aGUgY3JlYXRpb24gZXBvY2ggdGltZVxuICAgICAqL1xuICAgIEFuY2hvcmVkQ2xvY2sucHJvdG90eXBlLm5vdyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRlbHRhID0gdGhpcy5fbW9ub3RvbmljQ2xvY2subm93KCkgLSB0aGlzLl9wZXJmb3JtYW5jZU1pbGxpcztcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Vwb2NoTWlsbGlzICsgZGVsdGE7XG4gICAgfTtcbiAgICByZXR1cm4gQW5jaG9yZWRDbG9jaztcbn0oKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgX192YWx1ZXMkMSA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fdmFsdWVzKSB8fCBmdW5jdGlvbihvKSB7XG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbn07XG52YXIgX19yZWFkJDIgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX3JlYWQpIHx8IGZ1bmN0aW9uIChvLCBuKSB7XG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICAgIGlmICghbSkgcmV0dXJuIG87XG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gICAgdHJ5IHtcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gICAgfVxuICAgIHJldHVybiBhcjtcbn07XG5mdW5jdGlvbiBzYW5pdGl6ZUF0dHJpYnV0ZXMoYXR0cmlidXRlcykge1xuICAgIHZhciBlXzEsIF9hO1xuICAgIHZhciBvdXQgPSB7fTtcbiAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZXMgIT09ICdvYmplY3QnIHx8IGF0dHJpYnV0ZXMgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBmb3IgKHZhciBfYiA9IF9fdmFsdWVzJDEoT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlcykpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICB2YXIgX2QgPSBfX3JlYWQkMihfYy52YWx1ZSwgMiksIGtleSA9IF9kWzBdLCB2YWwgPSBfZFsxXTtcbiAgICAgICAgICAgIGlmICghaXNBdHRyaWJ1dGVLZXkoa2V5KSkge1xuICAgICAgICAgICAgICAgIGRpYWcud2FybihcIkludmFsaWQgYXR0cmlidXRlIGtleTogXCIgKyBrZXkpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc0F0dHJpYnV0ZVZhbHVlKHZhbCkpIHtcbiAgICAgICAgICAgICAgICBkaWFnLndhcm4oXCJJbnZhbGlkIGF0dHJpYnV0ZSB2YWx1ZSBzZXQgZm9yIGtleTogXCIgKyBrZXkpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICAgICAgICAgIG91dFtrZXldID0gdmFsLnNsaWNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBvdXRba2V5XSA9IHZhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbmZ1bmN0aW9uIGlzQXR0cmlidXRlS2V5KGtleSkge1xuICAgIHJldHVybiB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJiBrZXkubGVuZ3RoID4gMDtcbn1cbmZ1bmN0aW9uIGlzQXR0cmlidXRlVmFsdWUodmFsKSB7XG4gICAgaWYgKHZhbCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIHJldHVybiBpc0hvbW9nZW5lb3VzQXR0cmlidXRlVmFsdWVBcnJheSh2YWwpO1xuICAgIH1cbiAgICByZXR1cm4gaXNWYWxpZFByaW1pdGl2ZUF0dHJpYnV0ZVZhbHVlKHZhbCk7XG59XG5mdW5jdGlvbiBpc0hvbW9nZW5lb3VzQXR0cmlidXRlVmFsdWVBcnJheShhcnIpIHtcbiAgICB2YXIgZV8yLCBfYTtcbiAgICB2YXIgdHlwZTtcbiAgICB0cnkge1xuICAgICAgICBmb3IgKHZhciBhcnJfMSA9IF9fdmFsdWVzJDEoYXJyKSwgYXJyXzFfMSA9IGFycl8xLm5leHQoKTsgIWFycl8xXzEuZG9uZTsgYXJyXzFfMSA9IGFycl8xLm5leHQoKSkge1xuICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBhcnJfMV8xLnZhbHVlO1xuICAgICAgICAgICAgLy8gbnVsbC91bmRlZmluZWQgZWxlbWVudHMgYXJlIGFsbG93ZWRcbiAgICAgICAgICAgIGlmIChlbGVtZW50ID09IG51bGwpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIXR5cGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZFByaW1pdGl2ZUF0dHJpYnV0ZVZhbHVlKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSB0eXBlb2YgZWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGVuY291bnRlcmVkIGFuIGludmFsaWQgcHJpbWl0aXZlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSB0eXBlKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGVfMl8xKSB7IGVfMiA9IHsgZXJyb3I6IGVfMl8xIH07IH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChhcnJfMV8xICYmICFhcnJfMV8xLmRvbmUgJiYgKF9hID0gYXJyXzEucmV0dXJuKSkgX2EuY2FsbChhcnJfMSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGlzVmFsaWRQcmltaXRpdmVBdHRyaWJ1dGVWYWx1ZSh2YWwpIHtcbiAgICBzd2l0Y2ggKHR5cGVvZiB2YWwpIHtcbiAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBsb2dzIGFuIGVycm9yIHVzaW5nIHRoZSBwcm92aWRlZCBsb2dnZXIsIG9yIGFcbiAqIGNvbnNvbGUgbG9nZ2VyIGlmIG9uZSB3YXMgbm90IHByb3ZpZGVkLlxuICovXG5mdW5jdGlvbiBsb2dnaW5nRXJyb3JIYW5kbGVyKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZXgpIHtcbiAgICAgICAgZGlhZy5lcnJvcihzdHJpbmdpZnlFeGNlcHRpb24oZXgpKTtcbiAgICB9O1xufVxuLyoqXG4gKiBDb252ZXJ0cyBhbiBleGNlcHRpb24gaW50byBhIHN0cmluZyByZXByZXNlbnRhdGlvblxuICogQHBhcmFtIHtFeGNlcHRpb259IGV4XG4gKi9cbmZ1bmN0aW9uIHN0cmluZ2lmeUV4Y2VwdGlvbihleCkge1xuICAgIGlmICh0eXBlb2YgZXggPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBleDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShmbGF0dGVuRXhjZXB0aW9uKGV4KSk7XG4gICAgfVxufVxuLyoqXG4gKiBGbGF0dGVucyBhbiBleGNlcHRpb24gaW50byBrZXktdmFsdWUgcGFpcnMgYnkgdHJhdmVyc2luZyB0aGUgcHJvdG90eXBlIGNoYWluXG4gKiBhbmQgY29lcmNpbmcgdmFsdWVzIHRvIHN0cmluZ3MuIER1cGxpY2F0ZSBwcm9wZXJ0aWVzIHdpbGwgbm90IGJlIG92ZXJ3cml0dGVuO1xuICogdGhlIGZpcnN0IGluc2VydCB3aW5zLlxuICovXG5mdW5jdGlvbiBmbGF0dGVuRXhjZXB0aW9uKGV4KSB7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIHZhciBjdXJyZW50ID0gZXg7XG4gICAgd2hpbGUgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoY3VycmVudCkuZm9yRWFjaChmdW5jdGlvbiAocHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICBpZiAocmVzdWx0W3Byb3BlcnR5TmFtZV0pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gY3VycmVudFtwcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W3Byb3BlcnR5TmFtZV0gPSBTdHJpbmcodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY3VycmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKiBUaGUgZ2xvYmFsIGVycm9yIGhhbmRsZXIgZGVsZWdhdGUgKi9cbnZhciBkZWxlZ2F0ZUhhbmRsZXIgPSBsb2dnaW5nRXJyb3JIYW5kbGVyKCk7XG4vKipcbiAqIFNldCB0aGUgZ2xvYmFsIGVycm9yIGhhbmRsZXJcbiAqIEBwYXJhbSB7RXJyb3JIYW5kbGVyfSBoYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIHNldEdsb2JhbEVycm9ySGFuZGxlcihoYW5kbGVyKSB7XG4gICAgZGVsZWdhdGVIYW5kbGVyID0gaGFuZGxlcjtcbn1cbi8qKlxuICogUmV0dXJuIHRoZSBnbG9iYWwgZXJyb3IgaGFuZGxlclxuICogQHBhcmFtIHtFeGNlcHRpb259IGV4XG4gKi9cbmZ1bmN0aW9uIGdsb2JhbEVycm9ySGFuZGxlcihleCkge1xuICAgIHRyeSB7XG4gICAgICAgIGRlbGVnYXRlSGFuZGxlcihleCk7XG4gICAgfVxuICAgIGNhdGNoIChfYSkgeyB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZW1wdHlcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBfX3JlYWQkMSA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fcmVhZCkgfHwgZnVuY3Rpb24gKG8sIG4pIHtcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XG4gICAgaWYgKCFtKSByZXR1cm4gbztcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcbiAgICB0cnkge1xuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XG4gICAgZmluYWxseSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cbiAgICB9XG4gICAgcmV0dXJuIGFyO1xufTtcbnZhciBfX3NwcmVhZEFycmF5JDEgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX3NwcmVhZEFycmF5KSB8fCBmdW5jdGlvbiAodG8sIGZyb20sIHBhY2spIHtcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xufTtcbmZ1bmN0aW9uIGhleFRvQmFzZTY0KGhleFN0cikge1xuICAgIHJldHVybiBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBfX3NwcmVhZEFycmF5JDEoW10sIF9fcmVhZCQxKGhleFRvQmluYXJ5KGhleFN0cikpLCBmYWxzZSkpKTtcbn1cblxudmFyIFNQQU5fSURfQllURVMgPSA4O1xudmFyIFRSQUNFX0lEX0JZVEVTID0gMTY7XG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSB0aGUgb25lIGRlZmluZWQgaW4gQG9wZW50ZWxlbWV0cnkvc2RrLXRyYWNlLWJhc2UgaW5zdGVhZC5cbiAqL1xudmFyIFJhbmRvbUlkR2VuZXJhdG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFJhbmRvbUlkR2VuZXJhdG9yKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIHJhbmRvbSAxNi1ieXRlIHRyYWNlIElEIGZvcm1hdHRlZC9lbmNvZGVkIGFzIGEgMzIgbG93ZXJjYXNlIGhleFxuICAgICAgICAgKiBjaGFyYWN0ZXJzIGNvcnJlc3BvbmRpbmcgdG8gMTI4IGJpdHMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmdlbmVyYXRlVHJhY2VJZCA9IGdldElkR2VuZXJhdG9yKFRSQUNFX0lEX0JZVEVTKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSByYW5kb20gOC1ieXRlIHNwYW4gSUQgZm9ybWF0dGVkL2VuY29kZWQgYXMgYSAxNiBsb3dlcmNhc2UgaGV4XG4gICAgICAgICAqIGNoYXJhY3RlcnMgY29ycmVzcG9uZGluZyB0byA2NCBiaXRzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5nZW5lcmF0ZVNwYW5JZCA9IGdldElkR2VuZXJhdG9yKFNQQU5fSURfQllURVMpO1xuICAgIH1cbiAgICByZXR1cm4gUmFuZG9tSWRHZW5lcmF0b3I7XG59KCkpO1xudmFyIFNIQVJFRF9DSEFSX0NPREVTX0FSUkFZID0gQXJyYXkoMzIpO1xuZnVuY3Rpb24gZ2V0SWRHZW5lcmF0b3IoYnl0ZXMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gZ2VuZXJhdGVJZCgpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcyAqIDI7IGkrKykge1xuICAgICAgICAgICAgU0hBUkVEX0NIQVJfQ09ERVNfQVJSQVlbaV0gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxNikgKyA0ODtcbiAgICAgICAgICAgIC8vIHZhbGlkIGhleCBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZSA0OC01NyBhbmQgOTctMTAyXG4gICAgICAgICAgICBpZiAoU0hBUkVEX0NIQVJfQ09ERVNfQVJSQVlbaV0gPj0gNTgpIHtcbiAgICAgICAgICAgICAgICBTSEFSRURfQ0hBUl9DT0RFU19BUlJBWVtpXSArPSAzOTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBTSEFSRURfQ0hBUl9DT0RFU19BUlJBWS5zbGljZSgwLCBieXRlcyAqIDIpKTtcbiAgICB9O1xufVxuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuZnVuY3Rpb24gdW5yZWZUaW1lcihfdGltZXIpIHsgfVxuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIF9fdmFsdWVzID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX192YWx1ZXMpIHx8IGZ1bmN0aW9uKG8pIHtcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xuICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xufTtcbi8qKiBDb21iaW5lcyBtdWx0aXBsZSBwcm9wYWdhdG9ycyBpbnRvIGEgc2luZ2xlIHByb3BhZ2F0b3IuICovXG52YXIgQ29tcG9zaXRlUHJvcGFnYXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3QgYSBjb21wb3NpdGUgcHJvcGFnYXRvciBmcm9tIGEgbGlzdCBvZiBwcm9wYWdhdG9ycy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBbY29uZmlnXSBDb25maWd1cmF0aW9uIG9iamVjdCBmb3IgY29tcG9zaXRlIHByb3BhZ2F0b3JcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBDb21wb3NpdGVQcm9wYWdhdG9yKGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnID09PSB2b2lkIDApIHsgY29uZmlnID0ge307IH1cbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0aGlzLl9wcm9wYWdhdG9ycyA9IChfYSA9IGNvbmZpZy5wcm9wYWdhdG9ycykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogW107XG4gICAgICAgIHRoaXMuX2ZpZWxkcyA9IEFycmF5LmZyb20obmV3IFNldCh0aGlzLl9wcm9wYWdhdG9yc1xuICAgICAgICAgICAgLy8gb2xkZXIgcHJvcGFnYXRvcnMgbWF5IG5vdCBoYXZlIGZpZWxkcyBmdW5jdGlvbiwgbnVsbCBjaGVjayB0byBiZSBzdXJlXG4gICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChwKSB7IHJldHVybiAodHlwZW9mIHAuZmllbGRzID09PSAnZnVuY3Rpb24nID8gcC5maWVsZHMoKSA6IFtdKTsgfSlcbiAgICAgICAgICAgIC5yZWR1Y2UoZnVuY3Rpb24gKHgsIHkpIHsgcmV0dXJuIHguY29uY2F0KHkpOyB9LCBbXSkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUnVuIGVhY2ggb2YgdGhlIGNvbmZpZ3VyZWQgcHJvcGFnYXRvcnMgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dCBhbmQgY2Fycmllci5cbiAgICAgKiBQcm9wYWdhdG9ycyBhcmUgcnVuIGluIHRoZSBvcmRlciB0aGV5IGFyZSBjb25maWd1cmVkLCBzbyBpZiBtdWx0aXBsZVxuICAgICAqIHByb3BhZ2F0b3JzIHdyaXRlIHRoZSBzYW1lIGNhcnJpZXIga2V5LCB0aGUgcHJvcGFnYXRvciBsYXRlciBpbiB0aGUgbGlzdFxuICAgICAqIHdpbGwgXCJ3aW5cIi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdG8gaW5qZWN0XG4gICAgICogQHBhcmFtIGNhcnJpZXIgQ2FycmllciBpbnRvIHdoaWNoIGNvbnRleHQgd2lsbCBiZSBpbmplY3RlZFxuICAgICAqL1xuICAgIENvbXBvc2l0ZVByb3BhZ2F0b3IucHJvdG90eXBlLmluamVjdCA9IGZ1bmN0aW9uIChjb250ZXh0LCBjYXJyaWVyLCBzZXR0ZXIpIHtcbiAgICAgICAgdmFyIGVfMSwgX2E7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfYiA9IF9fdmFsdWVzKHRoaXMuX3Byb3BhZ2F0b3JzKSwgX2MgPSBfYi5uZXh0KCk7ICFfYy5kb25lOyBfYyA9IF9iLm5leHQoKSkge1xuICAgICAgICAgICAgICAgIHZhciBwcm9wYWdhdG9yID0gX2MudmFsdWU7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcGFnYXRvci5pbmplY3QoY29udGV4dCwgY2Fycmllciwgc2V0dGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICBkaWFnLndhcm4oXCJGYWlsZWQgdG8gaW5qZWN0IHdpdGggXCIgKyBwcm9wYWdhdG9yLmNvbnN0cnVjdG9yLm5hbWUgKyBcIi4gRXJyOiBcIiArIGVyci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgLyoqXG4gICAgICogUnVuIGVhY2ggb2YgdGhlIGNvbmZpZ3VyZWQgcHJvcGFnYXRvcnMgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dCBhbmQgY2Fycmllci5cbiAgICAgKiBQcm9wYWdhdG9ycyBhcmUgcnVuIGluIHRoZSBvcmRlciB0aGV5IGFyZSBjb25maWd1cmVkLCBzbyBpZiBtdWx0aXBsZVxuICAgICAqIHByb3BhZ2F0b3JzIHdyaXRlIHRoZSBzYW1lIGNvbnRleHQga2V5LCB0aGUgcHJvcGFnYXRvciBsYXRlciBpbiB0aGUgbGlzdFxuICAgICAqIHdpbGwgXCJ3aW5cIi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdG8gYWRkIHZhbHVlcyB0b1xuICAgICAqIEBwYXJhbSBjYXJyaWVyIENhcnJpZXIgZnJvbSB3aGljaCB0byBleHRyYWN0IGNvbnRleHRcbiAgICAgKi9cbiAgICBDb21wb3NpdGVQcm9wYWdhdG9yLnByb3RvdHlwZS5leHRyYWN0ID0gZnVuY3Rpb24gKGNvbnRleHQsIGNhcnJpZXIsIGdldHRlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJvcGFnYXRvcnMucmVkdWNlKGZ1bmN0aW9uIChjdHgsIHByb3BhZ2F0b3IpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3BhZ2F0b3IuZXh0cmFjdChjdHgsIGNhcnJpZXIsIGdldHRlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZGlhZy53YXJuKFwiRmFpbGVkIHRvIGV4dHJhY3Qgd2l0aCBcIiArIHByb3BhZ2F0b3IuY29uc3RydWN0b3IubmFtZSArIFwiLiBFcnI6IFwiICsgZXJyLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGN0eDtcbiAgICAgICAgfSwgY29udGV4dCk7XG4gICAgfTtcbiAgICBDb21wb3NpdGVQcm9wYWdhdG9yLnByb3RvdHlwZS5maWVsZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIHJldHVybiBhIG5ldyBhcnJheSBzbyBvdXIgZmllbGRzIGNhbm5vdCBiZSBtb2RpZmllZFxuICAgICAgICByZXR1cm4gdGhpcy5fZmllbGRzLnNsaWNlKCk7XG4gICAgfTtcbiAgICByZXR1cm4gQ29tcG9zaXRlUHJvcGFnYXRvcjtcbn0oKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgVkFMSURfS0VZX0NIQVJfUkFOR0UgPSAnW18wLTlhLXotKi9dJztcbnZhciBWQUxJRF9LRVkgPSBcIlthLXpdXCIgKyBWQUxJRF9LRVlfQ0hBUl9SQU5HRSArIFwiezAsMjU1fVwiO1xudmFyIFZBTElEX1ZFTkRPUl9LRVkgPSBcIlthLXowLTldXCIgKyBWQUxJRF9LRVlfQ0hBUl9SQU5HRSArIFwiezAsMjQwfUBbYS16XVwiICsgVkFMSURfS0VZX0NIQVJfUkFOR0UgKyBcInswLDEzfVwiO1xudmFyIFZBTElEX0tFWV9SRUdFWCA9IG5ldyBSZWdFeHAoXCJeKD86XCIgKyBWQUxJRF9LRVkgKyBcInxcIiArIFZBTElEX1ZFTkRPUl9LRVkgKyBcIikkXCIpO1xudmFyIFZBTElEX1ZBTFVFX0JBU0VfUkVHRVggPSAvXlsgLX5dezAsMjU1fVshLX5dJC87XG52YXIgSU5WQUxJRF9WQUxVRV9DT01NQV9FUVVBTF9SRUdFWCA9IC8sfD0vO1xuLyoqXG4gKiBLZXkgaXMgb3BhcXVlIHN0cmluZyB1cCB0byAyNTYgY2hhcmFjdGVycyBwcmludGFibGUuIEl0IE1VU1QgYmVnaW4gd2l0aCBhXG4gKiBsb3dlcmNhc2UgbGV0dGVyLCBhbmQgY2FuIG9ubHkgY29udGFpbiBsb3dlcmNhc2UgbGV0dGVycyBhLXosIGRpZ2l0cyAwLTksXG4gKiB1bmRlcnNjb3JlcyBfLCBkYXNoZXMgLSwgYXN0ZXJpc2tzICosIGFuZCBmb3J3YXJkIHNsYXNoZXMgLy5cbiAqIEZvciBtdWx0aS10ZW5hbnQgdmVuZG9yIHNjZW5hcmlvcywgYW4gYXQgc2lnbiAoQCkgY2FuIGJlIHVzZWQgdG8gcHJlZml4IHRoZVxuICogdmVuZG9yIG5hbWUuIFZlbmRvcnMgU0hPVUxEIHNldCB0aGUgdGVuYW50IElEIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGtleS5cbiAqIHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvdHJhY2UtY29udGV4dC8ja2V5XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlS2V5KGtleSkge1xuICAgIHJldHVybiBWQUxJRF9LRVlfUkVHRVgudGVzdChrZXkpO1xufVxuLyoqXG4gKiBWYWx1ZSBpcyBvcGFxdWUgc3RyaW5nIHVwIHRvIDI1NiBjaGFyYWN0ZXJzIHByaW50YWJsZSBBU0NJSSBSRkMwMDIwXG4gKiBjaGFyYWN0ZXJzIChpLmUuLCB0aGUgcmFuZ2UgMHgyMCB0byAweDdFKSBleGNlcHQgY29tbWEgLCBhbmQgPS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiAoVkFMSURfVkFMVUVfQkFTRV9SRUdFWC50ZXN0KHZhbHVlKSAmJlxuICAgICAgICAhSU5WQUxJRF9WQUxVRV9DT01NQV9FUVVBTF9SRUdFWC50ZXN0KHZhbHVlKSk7XG59XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgTUFYX1RSQUNFX1NUQVRFX0lURU1TID0gMzI7XG52YXIgTUFYX1RSQUNFX1NUQVRFX0xFTiA9IDUxMjtcbnZhciBMSVNUX01FTUJFUlNfU0VQQVJBVE9SID0gJywnO1xudmFyIExJU1RfTUVNQkVSX0tFWV9WQUxVRV9TUExJVFRFUiA9ICc9Jztcbi8qKlxuICogVHJhY2VTdGF0ZSBtdXN0IGJlIGEgY2xhc3MgYW5kIG5vdCBhIHNpbXBsZSBvYmplY3QgdHlwZSBiZWNhdXNlIG9mIHRoZSBzcGVjXG4gKiByZXF1aXJlbWVudCAoaHR0cHM6Ly93d3cudzMub3JnL1RSL3RyYWNlLWNvbnRleHQvI3RyYWNlc3RhdGUtZmllbGQpLlxuICpcbiAqIEhlcmUgaXMgdGhlIGxpc3Qgb2YgYWxsb3dlZCBtdXRhdGlvbnM6XG4gKiAtIE5ldyBrZXktdmFsdWUgcGFpciBzaG91bGQgYmUgYWRkZWQgaW50byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0XG4gKiAtIFRoZSB2YWx1ZSBvZiBhbnkga2V5IGNhbiBiZSB1cGRhdGVkLiBNb2RpZmllZCBrZXlzIE1VU1QgYmUgbW92ZWQgdG8gdGhlXG4gKiBiZWdpbm5pbmcgb2YgdGhlIGxpc3QuXG4gKi9cbnZhciBUcmFjZVN0YXRlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRyYWNlU3RhdGUocmF3VHJhY2VTdGF0ZSkge1xuICAgICAgICB0aGlzLl9pbnRlcm5hbFN0YXRlID0gbmV3IE1hcCgpO1xuICAgICAgICBpZiAocmF3VHJhY2VTdGF0ZSlcbiAgICAgICAgICAgIHRoaXMuX3BhcnNlKHJhd1RyYWNlU3RhdGUpO1xuICAgIH1cbiAgICBUcmFjZVN0YXRlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICAvLyBUT0RPOiBCZW5jaG1hcmsgdGhlIGRpZmZlcmVudCBhcHByb2FjaGVzKG1hcCB2cyBsaXN0KSBhbmRcbiAgICAgICAgLy8gdXNlIHRoZSBmYXN0ZXIgb25lLlxuICAgICAgICB2YXIgdHJhY2VTdGF0ZSA9IHRoaXMuX2Nsb25lKCk7XG4gICAgICAgIGlmICh0cmFjZVN0YXRlLl9pbnRlcm5hbFN0YXRlLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICB0cmFjZVN0YXRlLl9pbnRlcm5hbFN0YXRlLmRlbGV0ZShrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHRyYWNlU3RhdGUuX2ludGVybmFsU3RhdGUuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gdHJhY2VTdGF0ZTtcbiAgICB9O1xuICAgIFRyYWNlU3RhdGUucHJvdG90eXBlLnVuc2V0ID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgdHJhY2VTdGF0ZSA9IHRoaXMuX2Nsb25lKCk7XG4gICAgICAgIHRyYWNlU3RhdGUuX2ludGVybmFsU3RhdGUuZGVsZXRlKGtleSk7XG4gICAgICAgIHJldHVybiB0cmFjZVN0YXRlO1xuICAgIH07XG4gICAgVHJhY2VTdGF0ZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW50ZXJuYWxTdGF0ZS5nZXQoa2V5KTtcbiAgICB9O1xuICAgIFRyYWNlU3RhdGUucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHRoaXMuX2tleXMoKVxuICAgICAgICAgICAgLnJlZHVjZShmdW5jdGlvbiAoYWdnLCBrZXkpIHtcbiAgICAgICAgICAgIGFnZy5wdXNoKGtleSArIExJU1RfTUVNQkVSX0tFWV9WQUxVRV9TUExJVFRFUiArIF90aGlzLmdldChrZXkpKTtcbiAgICAgICAgICAgIHJldHVybiBhZ2c7XG4gICAgICAgIH0sIFtdKVxuICAgICAgICAgICAgLmpvaW4oTElTVF9NRU1CRVJTX1NFUEFSQVRPUik7XG4gICAgfTtcbiAgICBUcmFjZVN0YXRlLnByb3RvdHlwZS5fcGFyc2UgPSBmdW5jdGlvbiAocmF3VHJhY2VTdGF0ZSkge1xuICAgICAgICBpZiAocmF3VHJhY2VTdGF0ZS5sZW5ndGggPiBNQVhfVFJBQ0VfU1RBVEVfTEVOKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLl9pbnRlcm5hbFN0YXRlID0gcmF3VHJhY2VTdGF0ZVxuICAgICAgICAgICAgLnNwbGl0KExJU1RfTUVNQkVSU19TRVBBUkFUT1IpXG4gICAgICAgICAgICAucmV2ZXJzZSgpIC8vIFN0b3JlIGluIHJldmVyc2Ugc28gbmV3IGtleXMgKC5zZXQoLi4uKSkgd2lsbCBiZSBwbGFjZWQgYXQgdGhlIGJlZ2lubmluZ1xuICAgICAgICAgICAgLnJlZHVjZShmdW5jdGlvbiAoYWdnLCBwYXJ0KSB7XG4gICAgICAgICAgICB2YXIgbGlzdE1lbWJlciA9IHBhcnQudHJpbSgpOyAvLyBPcHRpb25hbCBXaGl0ZXNwYWNlIChPV1MpIGhhbmRsaW5nXG4gICAgICAgICAgICB2YXIgaSA9IGxpc3RNZW1iZXIuaW5kZXhPZihMSVNUX01FTUJFUl9LRVlfVkFMVUVfU1BMSVRURVIpO1xuICAgICAgICAgICAgaWYgKGkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IGxpc3RNZW1iZXIuc2xpY2UoMCwgaSk7XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gbGlzdE1lbWJlci5zbGljZShpICsgMSwgcGFydC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0ZUtleShrZXkpICYmIHZhbGlkYXRlVmFsdWUodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFnZy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFnZztcbiAgICAgICAgfSwgbmV3IE1hcCgpKTtcbiAgICAgICAgLy8gQmVjYXVzZSBvZiB0aGUgcmV2ZXJzZSgpIHJlcXVpcmVtZW50LCB0cnVuYyBtdXN0IGJlIGRvbmUgYWZ0ZXIgbWFwIGlzIGNyZWF0ZWRcbiAgICAgICAgaWYgKHRoaXMuX2ludGVybmFsU3RhdGUuc2l6ZSA+IE1BWF9UUkFDRV9TVEFURV9JVEVNUykge1xuICAgICAgICAgICAgdGhpcy5faW50ZXJuYWxTdGF0ZSA9IG5ldyBNYXAoQXJyYXkuZnJvbSh0aGlzLl9pbnRlcm5hbFN0YXRlLmVudHJpZXMoKSlcbiAgICAgICAgICAgICAgICAucmV2ZXJzZSgpIC8vIFVzZSByZXZlcnNlIHNhbWUgYXMgb3JpZ2luYWwgdHJhY2VzdGF0ZSBwYXJzZSBjaGFpblxuICAgICAgICAgICAgICAgIC5zbGljZSgwLCBNQVhfVFJBQ0VfU1RBVEVfSVRFTVMpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgVHJhY2VTdGF0ZS5wcm90b3R5cGUuX2tleXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuX2ludGVybmFsU3RhdGUua2V5cygpKS5yZXZlcnNlKCk7XG4gICAgfTtcbiAgICBUcmFjZVN0YXRlLnByb3RvdHlwZS5fY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0cmFjZVN0YXRlID0gbmV3IFRyYWNlU3RhdGUoKTtcbiAgICAgICAgdHJhY2VTdGF0ZS5faW50ZXJuYWxTdGF0ZSA9IG5ldyBNYXAodGhpcy5faW50ZXJuYWxTdGF0ZSk7XG4gICAgICAgIHJldHVybiB0cmFjZVN0YXRlO1xuICAgIH07XG4gICAgcmV0dXJuIFRyYWNlU3RhdGU7XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIFRSQUNFX1BBUkVOVF9IRUFERVIgPSAndHJhY2VwYXJlbnQnO1xudmFyIFRSQUNFX1NUQVRFX0hFQURFUiA9ICd0cmFjZXN0YXRlJztcbnZhciBWRVJTSU9OID0gJzAwJztcbnZhciBWRVJTSU9OX1BBUlQgPSAnKD8hZmYpW1xcXFxkYS1mXXsyfSc7XG52YXIgVFJBQ0VfSURfUEFSVCA9ICcoPyFbMF17MzJ9KVtcXFxcZGEtZl17MzJ9JztcbnZhciBQQVJFTlRfSURfUEFSVCA9ICcoPyFbMF17MTZ9KVtcXFxcZGEtZl17MTZ9JztcbnZhciBGTEFHU19QQVJUID0gJ1tcXFxcZGEtZl17Mn0nO1xudmFyIFRSQUNFX1BBUkVOVF9SRUdFWCA9IG5ldyBSZWdFeHAoXCJeXFxcXHM/KFwiICsgVkVSU0lPTl9QQVJUICsgXCIpLShcIiArIFRSQUNFX0lEX1BBUlQgKyBcIiktKFwiICsgUEFSRU5UX0lEX1BBUlQgKyBcIiktKFwiICsgRkxBR1NfUEFSVCArIFwiKSgtLiopP1xcXFxzPyRcIik7XG4vKipcbiAqIFBhcnNlcyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBbdHJhY2VwYXJlbnRdIHNwYW4gdGFnIGFuZCBjb252ZXJ0cyBpdCBpbnRvIHtAbGluayBTcGFuQ29udGV4dH1cbiAqIEBwYXJhbSB0cmFjZVBhcmVudCAtIEEgbWV0YSBwcm9wZXJ0eSB0aGF0IGNvbWVzIGZyb20gc2VydmVyLlxuICogICAgIEl0IHNob3VsZCBiZSBkeW5hbWljYWxseSBnZW5lcmF0ZWQgc2VydmVyIHNpZGUgdG8gaGF2ZSB0aGUgc2VydmVyJ3MgcmVxdWVzdCB0cmFjZSBJZCxcbiAqICAgICBhIHBhcmVudCBzcGFuIElkIHRoYXQgd2FzIHNldCBvbiB0aGUgc2VydmVyJ3MgcmVxdWVzdCBzcGFuLFxuICogICAgIGFuZCB0aGUgdHJhY2UgZmxhZ3MgdG8gaW5kaWNhdGUgdGhlIHNlcnZlcidzIHNhbXBsaW5nIGRlY2lzaW9uXG4gKiAgICAgKDAxID0gc2FtcGxlZCwgMDAgPSBub3Qgc2FtcGxlZCkuXG4gKiAgICAgZm9yIGV4YW1wbGU6ICd7dmVyc2lvbn0te3RyYWNlSWR9LXtzcGFuSWR9LXtzYW1wbGVEZWNpc2lvbn0nXG4gKiAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIHtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvdHJhY2UtY29udGV4dC99XG4gKi9cbmZ1bmN0aW9uIHBhcnNlVHJhY2VQYXJlbnQodHJhY2VQYXJlbnQpIHtcbiAgICB2YXIgbWF0Y2ggPSBUUkFDRV9QQVJFTlRfUkVHRVguZXhlYyh0cmFjZVBhcmVudCk7XG4gICAgaWYgKCFtYXRjaClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgLy8gQWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uIHRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgY29tcGF0aWJsZVxuICAgIC8vIHdpdGggZnV0dXJlIHZlcnNpb25zLiBJZiB0aGVyZSBhcmUgbW9yZSBwYXJ0cywgd2Ugb25seSByZWplY3QgaXQgaWYgaXQncyB1c2luZyB2ZXJzaW9uIDAwXG4gICAgLy8gU2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi90cmFjZS1jb250ZXh0LyN2ZXJzaW9uaW5nLW9mLXRyYWNlcGFyZW50XG4gICAgaWYgKG1hdGNoWzFdID09PSAnMDAnICYmIG1hdGNoWzVdKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgICB0cmFjZUlkOiBtYXRjaFsyXSxcbiAgICAgICAgc3BhbklkOiBtYXRjaFszXSxcbiAgICAgICAgdHJhY2VGbGFnczogcGFyc2VJbnQobWF0Y2hbNF0sIDE2KSxcbiAgICB9O1xufVxuLyoqXG4gKiBQcm9wYWdhdGVzIHtAbGluayBTcGFuQ29udGV4dH0gdGhyb3VnaCBUcmFjZSBDb250ZXh0IGZvcm1hdCBwcm9wYWdhdGlvbi5cbiAqXG4gKiBCYXNlZCBvbiB0aGUgVHJhY2UgQ29udGV4dCBzcGVjaWZpY2F0aW9uOlxuICogaHR0cHM6Ly93d3cudzMub3JnL1RSL3RyYWNlLWNvbnRleHQvXG4gKi9cbnZhciBXM0NUcmFjZUNvbnRleHRQcm9wYWdhdG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFczQ1RyYWNlQ29udGV4dFByb3BhZ2F0b3IoKSB7XG4gICAgfVxuICAgIFczQ1RyYWNlQ29udGV4dFByb3BhZ2F0b3IucHJvdG90eXBlLmluamVjdCA9IGZ1bmN0aW9uIChjb250ZXh0LCBjYXJyaWVyLCBzZXR0ZXIpIHtcbiAgICAgICAgdmFyIHNwYW5Db250ZXh0ID0gdHJhY2UuZ2V0U3BhbkNvbnRleHQoY29udGV4dCk7XG4gICAgICAgIGlmICghc3BhbkNvbnRleHQgfHxcbiAgICAgICAgICAgIGlzVHJhY2luZ1N1cHByZXNzZWQoY29udGV4dCkgfHxcbiAgICAgICAgICAgICFpc1NwYW5Db250ZXh0VmFsaWQoc3BhbkNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB2YXIgdHJhY2VQYXJlbnQgPSBWRVJTSU9OICsgXCItXCIgKyBzcGFuQ29udGV4dC50cmFjZUlkICsgXCItXCIgKyBzcGFuQ29udGV4dC5zcGFuSWQgKyBcIi0wXCIgKyBOdW1iZXIoc3BhbkNvbnRleHQudHJhY2VGbGFncyB8fCBUcmFjZUZsYWdzLk5PTkUpLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgc2V0dGVyLnNldChjYXJyaWVyLCBUUkFDRV9QQVJFTlRfSEVBREVSLCB0cmFjZVBhcmVudCk7XG4gICAgICAgIGlmIChzcGFuQ29udGV4dC50cmFjZVN0YXRlKSB7XG4gICAgICAgICAgICBzZXR0ZXIuc2V0KGNhcnJpZXIsIFRSQUNFX1NUQVRFX0hFQURFUiwgc3BhbkNvbnRleHQudHJhY2VTdGF0ZS5zZXJpYWxpemUoKSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFczQ1RyYWNlQ29udGV4dFByb3BhZ2F0b3IucHJvdG90eXBlLmV4dHJhY3QgPSBmdW5jdGlvbiAoY29udGV4dCwgY2FycmllciwgZ2V0dGVyKSB7XG4gICAgICAgIHZhciB0cmFjZVBhcmVudEhlYWRlciA9IGdldHRlci5nZXQoY2FycmllciwgVFJBQ0VfUEFSRU5UX0hFQURFUik7XG4gICAgICAgIGlmICghdHJhY2VQYXJlbnRIZWFkZXIpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICAgICAgdmFyIHRyYWNlUGFyZW50ID0gQXJyYXkuaXNBcnJheSh0cmFjZVBhcmVudEhlYWRlcilcbiAgICAgICAgICAgID8gdHJhY2VQYXJlbnRIZWFkZXJbMF1cbiAgICAgICAgICAgIDogdHJhY2VQYXJlbnRIZWFkZXI7XG4gICAgICAgIGlmICh0eXBlb2YgdHJhY2VQYXJlbnQgIT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgICAgIHZhciBzcGFuQ29udGV4dCA9IHBhcnNlVHJhY2VQYXJlbnQodHJhY2VQYXJlbnQpO1xuICAgICAgICBpZiAoIXNwYW5Db250ZXh0KVxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgICAgIHNwYW5Db250ZXh0LmlzUmVtb3RlID0gdHJ1ZTtcbiAgICAgICAgdmFyIHRyYWNlU3RhdGVIZWFkZXIgPSBnZXR0ZXIuZ2V0KGNhcnJpZXIsIFRSQUNFX1NUQVRFX0hFQURFUik7XG4gICAgICAgIGlmICh0cmFjZVN0YXRlSGVhZGVyKSB7XG4gICAgICAgICAgICAvLyBJZiBtb3JlIHRoYW4gb25lIGB0cmFjZXN0YXRlYCBoZWFkZXIgaXMgZm91bmQsIHdlIG1lcmdlIHRoZW0gaW50byBhXG4gICAgICAgICAgICAvLyBzaW5nbGUgaGVhZGVyLlxuICAgICAgICAgICAgdmFyIHN0YXRlID0gQXJyYXkuaXNBcnJheSh0cmFjZVN0YXRlSGVhZGVyKVxuICAgICAgICAgICAgICAgID8gdHJhY2VTdGF0ZUhlYWRlci5qb2luKCcsJylcbiAgICAgICAgICAgICAgICA6IHRyYWNlU3RhdGVIZWFkZXI7XG4gICAgICAgICAgICBzcGFuQ29udGV4dC50cmFjZVN0YXRlID0gbmV3IFRyYWNlU3RhdGUodHlwZW9mIHN0YXRlID09PSAnc3RyaW5nJyA/IHN0YXRlIDogdW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJhY2Uuc2V0U3BhbkNvbnRleHQoY29udGV4dCwgc3BhbkNvbnRleHQpO1xuICAgIH07XG4gICAgVzNDVHJhY2VDb250ZXh0UHJvcGFnYXRvci5wcm90b3R5cGUuZmllbGRzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gW1RSQUNFX1BBUkVOVF9IRUFERVIsIFRSQUNFX1NUQVRFX0hFQURFUl07XG4gICAgfTtcbiAgICByZXR1cm4gVzNDVHJhY2VDb250ZXh0UHJvcGFnYXRvcjtcbn0oKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgUlBDX01FVEFEQVRBX0tFWSA9IGNyZWF0ZUNvbnRleHRLZXkoJ09wZW5UZWxlbWV0cnkgU0RLIENvbnRleHQgS2V5IFJQQ19NRVRBREFUQScpO1xudmFyIFJQQ1R5cGU7XG4oZnVuY3Rpb24gKFJQQ1R5cGUpIHtcbiAgICBSUENUeXBlW1wiSFRUUFwiXSA9IFwiaHR0cFwiO1xufSkoUlBDVHlwZSB8fCAoUlBDVHlwZSA9IHt9KSk7XG5mdW5jdGlvbiBzZXRSUENNZXRhZGF0YShjb250ZXh0LCBtZXRhKSB7XG4gICAgcmV0dXJuIGNvbnRleHQuc2V0VmFsdWUoUlBDX01FVEFEQVRBX0tFWSwgbWV0YSk7XG59XG5mdW5jdGlvbiBkZWxldGVSUENNZXRhZGF0YShjb250ZXh0KSB7XG4gICAgcmV0dXJuIGNvbnRleHQuZGVsZXRlVmFsdWUoUlBDX01FVEFEQVRBX0tFWSk7XG59XG5mdW5jdGlvbiBnZXRSUENNZXRhZGF0YShjb250ZXh0KSB7XG4gICAgcmV0dXJuIGNvbnRleHQuZ2V0VmFsdWUoUlBDX01FVEFEQVRBX0tFWSk7XG59XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSB0aGUgb25lIGRlZmluZWQgaW4gQG9wZW50ZWxlbWV0cnkvc2RrLXRyYWNlLWJhc2UgaW5zdGVhZC5cbiAqIFNhbXBsZXIgdGhhdCBzYW1wbGVzIG5vIHRyYWNlcy5cbiAqL1xudmFyIEFsd2F5c09mZlNhbXBsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQWx3YXlzT2ZmU2FtcGxlcigpIHtcbiAgICB9XG4gICAgQWx3YXlzT2ZmU2FtcGxlci5wcm90b3R5cGUuc2hvdWxkU2FtcGxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGVjaXNpb246IFNhbXBsaW5nRGVjaXNpb24uTk9UX1JFQ09SRCxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIEFsd2F5c09mZlNhbXBsZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJ0Fsd2F5c09mZlNhbXBsZXInO1xuICAgIH07XG4gICAgcmV0dXJuIEFsd2F5c09mZlNhbXBsZXI7XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgdGhlIG9uZSBkZWZpbmVkIGluIEBvcGVudGVsZW1ldHJ5L3Nkay10cmFjZS1iYXNlIGluc3RlYWQuXG4gKiBTYW1wbGVyIHRoYXQgc2FtcGxlcyBhbGwgdHJhY2VzLlxuICovXG52YXIgQWx3YXlzT25TYW1wbGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEFsd2F5c09uU2FtcGxlcigpIHtcbiAgICB9XG4gICAgQWx3YXlzT25TYW1wbGVyLnByb3RvdHlwZS5zaG91bGRTYW1wbGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkZWNpc2lvbjogU2FtcGxpbmdEZWNpc2lvbi5SRUNPUkRfQU5EX1NBTVBMRUQsXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBBbHdheXNPblNhbXBsZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJ0Fsd2F5c09uU2FtcGxlcic7XG4gICAgfTtcbiAgICByZXR1cm4gQWx3YXlzT25TYW1wbGVyO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBvbmUgZGVmaW5lZCBpbiBAb3BlbnRlbGVtZXRyeS9zZGstdHJhY2UtYmFzZSBpbnN0ZWFkLlxuICogQSBjb21wb3NpdGUgc2FtcGxlciB0aGF0IGVpdGhlciByZXNwZWN0cyB0aGUgcGFyZW50IHNwYW4ncyBzYW1wbGluZyBkZWNpc2lvblxuICogb3IgZGVsZWdhdGVzIHRvIGBkZWxlZ2F0ZVNhbXBsZXJgIGZvciByb290IHNwYW5zLlxuICovXG52YXIgUGFyZW50QmFzZWRTYW1wbGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFBhcmVudEJhc2VkU2FtcGxlcihjb25maWcpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICB0aGlzLl9yb290ID0gY29uZmlnLnJvb3Q7XG4gICAgICAgIGlmICghdGhpcy5fcm9vdCkge1xuICAgICAgICAgICAgZ2xvYmFsRXJyb3JIYW5kbGVyKG5ldyBFcnJvcignUGFyZW50QmFzZWRTYW1wbGVyIG11c3QgaGF2ZSBhIHJvb3Qgc2FtcGxlciBjb25maWd1cmVkJykpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdCA9IG5ldyBBbHdheXNPblNhbXBsZXIoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZW1vdGVQYXJlbnRTYW1wbGVkID1cbiAgICAgICAgICAgIChfYSA9IGNvbmZpZy5yZW1vdGVQYXJlbnRTYW1wbGVkKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBuZXcgQWx3YXlzT25TYW1wbGVyKCk7XG4gICAgICAgIHRoaXMuX3JlbW90ZVBhcmVudE5vdFNhbXBsZWQgPVxuICAgICAgICAgICAgKF9iID0gY29uZmlnLnJlbW90ZVBhcmVudE5vdFNhbXBsZWQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IG5ldyBBbHdheXNPZmZTYW1wbGVyKCk7XG4gICAgICAgIHRoaXMuX2xvY2FsUGFyZW50U2FtcGxlZCA9XG4gICAgICAgICAgICAoX2MgPSBjb25maWcubG9jYWxQYXJlbnRTYW1wbGVkKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBuZXcgQWx3YXlzT25TYW1wbGVyKCk7XG4gICAgICAgIHRoaXMuX2xvY2FsUGFyZW50Tm90U2FtcGxlZCA9XG4gICAgICAgICAgICAoX2QgPSBjb25maWcubG9jYWxQYXJlbnROb3RTYW1wbGVkKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBuZXcgQWx3YXlzT2ZmU2FtcGxlcigpO1xuICAgIH1cbiAgICBQYXJlbnRCYXNlZFNhbXBsZXIucHJvdG90eXBlLnNob3VsZFNhbXBsZSA9IGZ1bmN0aW9uIChjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKSB7XG4gICAgICAgIHZhciBwYXJlbnRDb250ZXh0ID0gdHJhY2UuZ2V0U3BhbkNvbnRleHQoY29udGV4dCk7XG4gICAgICAgIGlmICghcGFyZW50Q29udGV4dCB8fCAhaXNTcGFuQ29udGV4dFZhbGlkKHBhcmVudENvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcm9vdC5zaG91bGRTYW1wbGUoY29udGV4dCwgdHJhY2VJZCwgc3Bhbk5hbWUsIHNwYW5LaW5kLCBhdHRyaWJ1dGVzLCBsaW5rcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmVudENvbnRleHQuaXNSZW1vdGUpIHtcbiAgICAgICAgICAgIGlmIChwYXJlbnRDb250ZXh0LnRyYWNlRmxhZ3MgJiBUcmFjZUZsYWdzLlNBTVBMRUQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVtb3RlUGFyZW50U2FtcGxlZC5zaG91bGRTYW1wbGUoY29udGV4dCwgdHJhY2VJZCwgc3Bhbk5hbWUsIHNwYW5LaW5kLCBhdHRyaWJ1dGVzLCBsaW5rcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVtb3RlUGFyZW50Tm90U2FtcGxlZC5zaG91bGRTYW1wbGUoY29udGV4dCwgdHJhY2VJZCwgc3Bhbk5hbWUsIHNwYW5LaW5kLCBhdHRyaWJ1dGVzLCBsaW5rcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmVudENvbnRleHQudHJhY2VGbGFncyAmIFRyYWNlRmxhZ3MuU0FNUExFRCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsUGFyZW50U2FtcGxlZC5zaG91bGRTYW1wbGUoY29udGV4dCwgdHJhY2VJZCwgc3Bhbk5hbWUsIHNwYW5LaW5kLCBhdHRyaWJ1dGVzLCBsaW5rcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsUGFyZW50Tm90U2FtcGxlZC5zaG91bGRTYW1wbGUoY29udGV4dCwgdHJhY2VJZCwgc3Bhbk5hbWUsIHNwYW5LaW5kLCBhdHRyaWJ1dGVzLCBsaW5rcyk7XG4gICAgfTtcbiAgICBQYXJlbnRCYXNlZFNhbXBsZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gXCJQYXJlbnRCYXNlZHtyb290PVwiICsgdGhpcy5fcm9vdC50b1N0cmluZygpICsgXCIsIHJlbW90ZVBhcmVudFNhbXBsZWQ9XCIgKyB0aGlzLl9yZW1vdGVQYXJlbnRTYW1wbGVkLnRvU3RyaW5nKCkgKyBcIiwgcmVtb3RlUGFyZW50Tm90U2FtcGxlZD1cIiArIHRoaXMuX3JlbW90ZVBhcmVudE5vdFNhbXBsZWQudG9TdHJpbmcoKSArIFwiLCBsb2NhbFBhcmVudFNhbXBsZWQ9XCIgKyB0aGlzLl9sb2NhbFBhcmVudFNhbXBsZWQudG9TdHJpbmcoKSArIFwiLCBsb2NhbFBhcmVudE5vdFNhbXBsZWQ9XCIgKyB0aGlzLl9sb2NhbFBhcmVudE5vdFNhbXBsZWQudG9TdHJpbmcoKSArIFwifVwiO1xuICAgIH07XG4gICAgcmV0dXJuIFBhcmVudEJhc2VkU2FtcGxlcjtcbn0oKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSB0aGUgb25lIGRlZmluZWQgaW4gQG9wZW50ZWxlbWV0cnkvc2RrLXRyYWNlLWJhc2UgaW5zdGVhZC5cbiAqIFNhbXBsZXIgdGhhdCBzYW1wbGVzIGEgZ2l2ZW4gZnJhY3Rpb24gb2YgdHJhY2VzIGJhc2VkIG9mIHRyYWNlIGlkIGRldGVybWluaXN0aWNhbGx5LlxuICovXG52YXIgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlcihfcmF0aW8pIHtcbiAgICAgICAgaWYgKF9yYXRpbyA9PT0gdm9pZCAwKSB7IF9yYXRpbyA9IDA7IH1cbiAgICAgICAgdGhpcy5fcmF0aW8gPSBfcmF0aW87XG4gICAgICAgIHRoaXMuX3JhdGlvID0gdGhpcy5fbm9ybWFsaXplKF9yYXRpbyk7XG4gICAgICAgIHRoaXMuX3VwcGVyQm91bmQgPSBNYXRoLmZsb29yKHRoaXMuX3JhdGlvICogMHhmZmZmZmZmZik7XG4gICAgfVxuICAgIFRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlci5wcm90b3R5cGUuc2hvdWxkU2FtcGxlID0gZnVuY3Rpb24gKGNvbnRleHQsIHRyYWNlSWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRlY2lzaW9uOiBpc1ZhbGlkVHJhY2VJZCh0cmFjZUlkKSAmJiB0aGlzLl9hY2N1bXVsYXRlKHRyYWNlSWQpIDwgdGhpcy5fdXBwZXJCb3VuZFxuICAgICAgICAgICAgICAgID8gU2FtcGxpbmdEZWNpc2lvbi5SRUNPUkRfQU5EX1NBTVBMRURcbiAgICAgICAgICAgICAgICA6IFNhbXBsaW5nRGVjaXNpb24uTk9UX1JFQ09SRCxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIFRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBcIlRyYWNlSWRSYXRpb0Jhc2Vke1wiICsgdGhpcy5fcmF0aW8gKyBcIn1cIjtcbiAgICB9O1xuICAgIFRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlci5wcm90b3R5cGUuX25vcm1hbGl6ZSA9IGZ1bmN0aW9uIChyYXRpbykge1xuICAgICAgICBpZiAodHlwZW9mIHJhdGlvICE9PSAnbnVtYmVyJyB8fCBpc05hTihyYXRpbykpXG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgcmV0dXJuIHJhdGlvID49IDEgPyAxIDogcmF0aW8gPD0gMCA/IDAgOiByYXRpbztcbiAgICB9O1xuICAgIFRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlci5wcm90b3R5cGUuX2FjY3VtdWxhdGUgPSBmdW5jdGlvbiAodHJhY2VJZCkge1xuICAgICAgICB2YXIgYWNjdW11bGF0aW9uID0gMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmFjZUlkLmxlbmd0aCAvIDg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHBvcyA9IGkgKiA4O1xuICAgICAgICAgICAgdmFyIHBhcnQgPSBwYXJzZUludCh0cmFjZUlkLnNsaWNlKHBvcywgcG9zICsgOCksIDE2KTtcbiAgICAgICAgICAgIGFjY3VtdWxhdGlvbiA9IChhY2N1bXVsYXRpb24gXiBwYXJ0KSA+Pj4gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjdW11bGF0aW9uO1xuICAgIH07XG4gICAgcmV0dXJuIFRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlcjtcbn0oKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4vKipcbiAqIGJhc2VkIG9uIGxvZGFzaCBpbiBvcmRlciB0byBzdXBwb3J0IGVzbSBidWlsZHMgd2l0aG91dCBlc01vZHVsZUludGVyb3AuXG4gKiBsb2Rhc2ggaXMgdXNpbmcgTUlUIExpY2Vuc2UuXG4gKiovXG52YXIgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XSc7XG52YXIgbnVsbFRhZyA9ICdbb2JqZWN0IE51bGxdJztcbnZhciB1bmRlZmluZWRUYWcgPSAnW29iamVjdCBVbmRlZmluZWRdJztcbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGU7XG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xudmFyIG9iamVjdEN0b3JTdHJpbmcgPSBmdW5jVG9TdHJpbmcuY2FsbChPYmplY3QpO1xudmFyIGdldFByb3RvdHlwZSA9IG92ZXJBcmcoT2JqZWN0LmdldFByb3RvdHlwZU9mLCBPYmplY3QpO1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xudmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG4vKipcbiAqIENyZWF0ZXMgYSB1bmFyeSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggaXRzIGFyZ3VtZW50IHRyYW5zZm9ybWVkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gb3ZlckFyZyhmdW5jLCB0cmFuc2Zvcm0pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGFyZykge1xuICAgICAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0oYXJnKSk7XG4gICAgfTtcbn1cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIHRoYXQgaXMsIGFuIG9iamVjdCBjcmVhdGVkIGJ5IHRoZVxuICogYE9iamVjdGAgY29uc3RydWN0b3Igb3Igb25lIHdpdGggYSBgW1tQcm90b3R5cGVdXWAgb2YgYG51bGxgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC44LjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqIH1cbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QobmV3IEZvbyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoeyAneCc6IDAsICd5JzogMCB9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgICBpZiAoIWlzT2JqZWN0TGlrZSh2YWx1ZSkgfHwgYmFzZUdldFRhZyh2YWx1ZSkgIT09IG9iamVjdFRhZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBwcm90byA9IGdldFByb3RvdHlwZSh2YWx1ZSk7XG4gICAgaWYgKHByb3RvID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB2YXIgQ3RvciA9IGhhc093blByb3BlcnR5LmNhbGwocHJvdG8sICdjb25zdHJ1Y3RvcicpICYmIHByb3RvLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiAodHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICBDdG9yIGluc3RhbmNlb2YgQ3RvciAmJlxuICAgICAgICBmdW5jVG9TdHJpbmcuY2FsbChDdG9yKSA9PT0gb2JqZWN0Q3RvclN0cmluZyk7XG59XG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgZ2V0VGFnYCB3aXRob3V0IGZhbGxiYWNrcyBmb3IgYnVnZ3kgZW52aXJvbm1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGJhc2VHZXRUYWcodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZFRhZyA6IG51bGxUYWc7XG4gICAgfVxuICAgIHJldHVybiBzeW1Ub1N0cmluZ1RhZyAmJiBzeW1Ub1N0cmluZ1RhZyBpbiBPYmplY3QodmFsdWUpXG4gICAgICAgID8gZ2V0UmF3VGFnKHZhbHVlKVxuICAgICAgICA6IG9iamVjdFRvU3RyaW5nKHZhbHVlKTtcbn1cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlR2V0VGFnYCB3aGljaCBpZ25vcmVzIGBTeW1ib2wudG9TdHJpbmdUYWdgIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByYXcgYHRvU3RyaW5nVGFnYC5cbiAqL1xuZnVuY3Rpb24gZ2V0UmF3VGFnKHZhbHVlKSB7XG4gICAgdmFyIGlzT3duID0gaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgc3ltVG9TdHJpbmdUYWcpLCB0YWcgPSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG4gICAgdmFyIHVubWFza2VkID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdW5kZWZpbmVkO1xuICAgICAgICB1bm1hc2tlZCA9IHRydWU7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIC8vIHNpbGVuY2VcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICAgIGlmICh1bm1hc2tlZCkge1xuICAgICAgICBpZiAoaXNPd24pIHtcbiAgICAgICAgICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnXSA9IHRhZztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRlbGV0ZSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyB1c2luZyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyh2YWx1ZSkge1xuICAgIHJldHVybiBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbnZhciBNQVhfTEVWRUwgPSAyMDtcbi8qKlxuICogTWVyZ2VzIG9iamVjdHMgdG9nZXRoZXJcbiAqIEBwYXJhbSBhcmdzIC0gb2JqZWN0cyAvIHZhbHVlcyB0byBiZSBtZXJnZWRcbiAqL1xuZnVuY3Rpb24gbWVyZ2UoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuICAgIHZhciByZXN1bHQgPSBhcmdzLnNoaWZ0KCk7XG4gICAgdmFyIG9iamVjdHMgPSBuZXcgV2Vha01hcCgpO1xuICAgIHdoaWxlIChhcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzdWx0ID0gbWVyZ2VUd29PYmplY3RzKHJlc3VsdCwgYXJncy5zaGlmdCgpLCAwLCBvYmplY3RzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIHRha2VWYWx1ZSh2YWx1ZSkge1xuICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWUuc2xpY2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuLyoqXG4gKiBNZXJnZXMgdHdvIG9iamVjdHNcbiAqIEBwYXJhbSBvbmUgLSBmaXJzdCBvYmplY3RcbiAqIEBwYXJhbSB0d28gLSBzZWNvbmQgb2JqZWN0XG4gKiBAcGFyYW0gbGV2ZWwgLSBjdXJyZW50IGRlZXAgbGV2ZWxcbiAqIEBwYXJhbSBvYmplY3RzIC0gb2JqZWN0cyBob2xkZXIgdGhhdCBoYXMgYmVlbiBhbHJlYWR5IHJlZmVyZW5jZWQgLSB0byBwcmV2ZW50XG4gKiBjeWNsaWMgZGVwZW5kZW5jeVxuICovXG5mdW5jdGlvbiBtZXJnZVR3b09iamVjdHMob25lLCB0d28sIGxldmVsLCBvYmplY3RzKSB7XG4gICAgaWYgKGxldmVsID09PSB2b2lkIDApIHsgbGV2ZWwgPSAwOyB9XG4gICAgdmFyIHJlc3VsdDtcbiAgICBpZiAobGV2ZWwgPiBNQVhfTEVWRUwpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgbGV2ZWwrKztcbiAgICBpZiAoaXNQcmltaXRpdmUob25lKSB8fCBpc1ByaW1pdGl2ZSh0d28pIHx8IGlzRnVuY3Rpb24odHdvKSkge1xuICAgICAgICByZXN1bHQgPSB0YWtlVmFsdWUodHdvKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNBcnJheShvbmUpKSB7XG4gICAgICAgIHJlc3VsdCA9IG9uZS5zbGljZSgpO1xuICAgICAgICBpZiAoaXNBcnJheSh0d28pKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IHR3by5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0YWtlVmFsdWUodHdvW2ldKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNPYmplY3QodHdvKSkge1xuICAgICAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh0d28pO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSBrZXlzLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdGFrZVZhbHVlKHR3b1trZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChpc09iamVjdChvbmUpKSB7XG4gICAgICAgIGlmIChpc09iamVjdCh0d28pKSB7XG4gICAgICAgICAgICBpZiAoIXNob3VsZE1lcmdlKG9uZSwgdHdvKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0d287XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQgPSBPYmplY3QuYXNzaWduKHt9LCBvbmUpO1xuICAgICAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh0d28pO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSBrZXlzLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgICAgICAgIHZhciB0d29WYWx1ZSA9IHR3b1trZXldO1xuICAgICAgICAgICAgICAgIGlmIChpc1ByaW1pdGl2ZSh0d29WYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0d29WYWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXN1bHRba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3VsdFtrZXldID0gdGFrZVZhbHVlKHR3b1ZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdHdvVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBvYmoxID0gcmVzdWx0W2tleV07XG4gICAgICAgICAgICAgICAgICAgIHZhciBvYmoyID0gdHdvVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGlmICh3YXNPYmplY3RSZWZlcmVuY2VkKG9uZSwga2V5LCBvYmplY3RzKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgd2FzT2JqZWN0UmVmZXJlbmNlZCh0d28sIGtleSwgb2JqZWN0cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXN1bHRba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc09iamVjdChvYmoxKSAmJiBpc09iamVjdChvYmoyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcnIxID0gb2JqZWN0cy5nZXQob2JqMSkgfHwgW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFycjIgPSBvYmplY3RzLmdldChvYmoyKSB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnIxLnB1c2goeyBvYmo6IG9uZSwga2V5OiBrZXkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyMi5wdXNoKHsgb2JqOiB0d28sIGtleToga2V5IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHMuc2V0KG9iajEsIGFycjEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHMuc2V0KG9iajIsIGFycjIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBtZXJnZVR3b09iamVjdHMocmVzdWx0W2tleV0sIHR3b1ZhbHVlLCBsZXZlbCwgb2JqZWN0cyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSB0d287XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogRnVuY3Rpb24gdG8gY2hlY2sgaWYgb2JqZWN0IGhhcyBiZWVuIGFscmVhZHkgcmVmZXJlbmNlXG4gKiBAcGFyYW0gb2JqXG4gKiBAcGFyYW0ga2V5XG4gKiBAcGFyYW0gb2JqZWN0c1xuICovXG5mdW5jdGlvbiB3YXNPYmplY3RSZWZlcmVuY2VkKG9iaiwga2V5LCBvYmplY3RzKSB7XG4gICAgdmFyIGFyciA9IG9iamVjdHMuZ2V0KG9ialtrZXldKSB8fCBbXTtcbiAgICBmb3IgKHZhciBpID0gMCwgaiA9IGFyci5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICAgICAgdmFyIGluZm8gPSBhcnJbaV07XG4gICAgICAgIGlmIChpbmZvLmtleSA9PT0ga2V5ICYmIGluZm8ub2JqID09PSBvYmopIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGlzQXJyYXkodmFsdWUpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gICAgcmV0dXJuICghaXNQcmltaXRpdmUodmFsdWUpICYmXG4gICAgICAgICFpc0FycmF5KHZhbHVlKSAmJlxuICAgICAgICAhaXNGdW5jdGlvbih2YWx1ZSkgJiZcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jyk7XG59XG5mdW5jdGlvbiBpc1ByaW1pdGl2ZSh2YWx1ZSkge1xuICAgIHJldHVybiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8XG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBEYXRlIHx8XG4gICAgICAgIHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwIHx8XG4gICAgICAgIHZhbHVlID09PSBudWxsKTtcbn1cbmZ1bmN0aW9uIHNob3VsZE1lcmdlKG9uZSwgdHdvKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KG9uZSkgfHwgIWlzUGxhaW5PYmplY3QodHdvKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIF9fZXh0ZW5kcyA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG4vKipcbiAqIEVycm9yIHRoYXQgaXMgdGhyb3duIG9uIHRpbWVvdXRzLlxuICovXG52YXIgVGltZW91dEVycm9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhUaW1lb3V0RXJyb3IsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gVGltZW91dEVycm9yKG1lc3NhZ2UpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgbWVzc2FnZSkgfHwgdGhpcztcbiAgICAgICAgLy8gbWFudWFsbHkgYWRqdXN0IHByb3RvdHlwZSB0byByZXRhaW4gYGluc3RhbmNlb2ZgIGZ1bmN0aW9uYWxpdHkgd2hlbiB0YXJnZXRpbmcgRVM1LCBzZWU6XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC13aWtpL2Jsb2IvbWFpbi9CcmVha2luZy1DaGFuZ2VzLm1kI2V4dGVuZGluZy1idWlsdC1pbnMtbGlrZS1lcnJvci1hcnJheS1hbmQtbWFwLW1heS1uby1sb25nZXItd29ya1xuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoX3RoaXMsIFRpbWVvdXRFcnJvci5wcm90b3R5cGUpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIHJldHVybiBUaW1lb3V0RXJyb3I7XG59KEVycm9yKSk7XG4vKipcbiAqIEFkZHMgYSB0aW1lb3V0IHRvIGEgcHJvbWlzZSBhbmQgcmVqZWN0cyBpZiB0aGUgc3BlY2lmaWVkIHRpbWVvdXQgaGFzIGVsYXBzZWQuIEFsc28gcmVqZWN0cyBpZiB0aGUgc3BlY2lmaWVkIHByb21pc2VcbiAqIHJlamVjdHMsIGFuZCByZXNvbHZlcyBpZiB0aGUgc3BlY2lmaWVkIHByb21pc2UgcmVzb2x2ZXMuXG4gKlxuICogPHA+IE5PVEU6IHRoaXMgb3BlcmF0aW9uIHdpbGwgY29udGludWUgZXZlbiBhZnRlciBpdCB0aHJvd3MgYSB7QGxpbmsgVGltZW91dEVycm9yfS5cbiAqXG4gKiBAcGFyYW0gcHJvbWlzZSBwcm9taXNlIHRvIHVzZSB3aXRoIHRpbWVvdXQuXG4gKiBAcGFyYW0gdGltZW91dCB0aGUgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgdW50aWwgdGhlIHJldHVybmVkIHByb21pc2UgaXMgcmVqZWN0ZWQuXG4gKi9cbmZ1bmN0aW9uIGNhbGxXaXRoVGltZW91dChwcm9taXNlLCB0aW1lb3V0KSB7XG4gICAgdmFyIHRpbWVvdXRIYW5kbGU7XG4gICAgdmFyIHRpbWVvdXRQcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gdGltZW91dEZ1bmN0aW9uKF9yZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdGltZW91dEhhbmRsZSA9IHNldFRpbWVvdXQoZnVuY3Rpb24gdGltZW91dEhhbmRsZXIoKSB7XG4gICAgICAgICAgICByZWplY3QobmV3IFRpbWVvdXRFcnJvcignT3BlcmF0aW9uIHRpbWVkIG91dC4nKSk7XG4gICAgICAgIH0sIHRpbWVvdXQpO1xuICAgIH0pO1xuICAgIHJldHVybiBQcm9taXNlLnJhY2UoW3Byb21pc2UsIHRpbWVvdXRQcm9taXNlXSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SGFuZGxlKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SGFuZGxlKTtcbiAgICAgICAgdGhyb3cgcmVhc29uO1xuICAgIH0pO1xufVxuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBDaGVja3MgaWYgY2VydGFpbiBmdW5jdGlvbiBoYXMgYmVlbiBhbHJlYWR5IHdyYXBwZWRcbiAqIEBwYXJhbSBmdW5jXG4gKi9cbmZ1bmN0aW9uIGlzV3JhcHBlZChmdW5jKSB7XG4gICAgcmV0dXJuICh0eXBlb2YgZnVuYyA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICB0eXBlb2YgZnVuYy5fX29yaWdpbmFsID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgIHR5cGVvZiBmdW5jLl9fdW53cmFwID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgIGZ1bmMuX193cmFwcGVkID09PSB0cnVlKTtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBEZWZlcnJlZCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBEZWZlcnJlZCgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5fcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIF90aGlzLl9yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgICAgIF90aGlzLl9yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRGVmZXJyZWQucHJvdG90eXBlLCBcInByb21pc2VcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9taXNlO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgRGVmZXJyZWQucHJvdG90eXBlLnJlc29sdmUgPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgIHRoaXMuX3Jlc29sdmUodmFsKTtcbiAgICB9O1xuICAgIERlZmVycmVkLnByb3RvdHlwZS5yZWplY3QgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIHRoaXMuX3JlamVjdChlcnIpO1xuICAgIH07XG4gICAgcmV0dXJuIERlZmVycmVkO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBfX3JlYWQgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX3JlYWQpIHx8IGZ1bmN0aW9uIChvLCBuKSB7XG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICAgIGlmICghbSkgcmV0dXJuIG87XG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gICAgdHJ5IHtcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gICAgfVxuICAgIHJldHVybiBhcjtcbn07XG52YXIgX19zcHJlYWRBcnJheSA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fc3ByZWFkQXJyYXkpIHx8IGZ1bmN0aW9uICh0bywgZnJvbSwgcGFjaykge1xuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59O1xuLyoqXG4gKiBCaW5kIHRoZSBjYWxsYmFjayBhbmQgb25seSBpbnZva2UgdGhlIGNhbGxiYWNrIG9uY2UgcmVnYXJkbGVzcyBob3cgbWFueSB0aW1lcyBgQmluZE9uY2VGdXR1cmUuY2FsbGAgaXMgaW52b2tlZC5cbiAqL1xudmFyIEJpbmRPbmNlRnV0dXJlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJpbmRPbmNlRnV0dXJlKF9jYWxsYmFjaywgX3RoYXQpIHtcbiAgICAgICAgdGhpcy5fY2FsbGJhY2sgPSBfY2FsbGJhY2s7XG4gICAgICAgIHRoaXMuX3RoYXQgPSBfdGhhdDtcbiAgICAgICAgdGhpcy5faXNDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZGVmZXJyZWQgPSBuZXcgRGVmZXJyZWQoKTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJpbmRPbmNlRnV0dXJlLnByb3RvdHlwZSwgXCJpc0NhbGxlZFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lzQ2FsbGVkO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJpbmRPbmNlRnV0dXJlLnByb3RvdHlwZSwgXCJwcm9taXNlXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmZXJyZWQucHJvbWlzZTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIEJpbmRPbmNlRnV0dXJlLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBhcmdzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9pc0NhbGxlZCkge1xuICAgICAgICAgICAgdGhpcy5faXNDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKF9hID0gdGhpcy5fY2FsbGJhY2spLmNhbGwuYXBwbHkoX2EsIF9fc3ByZWFkQXJyYXkoW3RoaXMuX3RoYXRdLCBfX3JlYWQoYXJncyksIGZhbHNlKSkpLnRoZW4oZnVuY3Rpb24gKHZhbCkgeyByZXR1cm4gX3RoaXMuX2RlZmVycmVkLnJlc29sdmUodmFsKTsgfSwgZnVuY3Rpb24gKGVycikgeyByZXR1cm4gX3RoaXMuX2RlZmVycmVkLnJlamVjdChlcnIpOyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kZWZlcnJlZC5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZGVmZXJyZWQucHJvbWlzZTtcbiAgICB9O1xuICAgIHJldHVybiBCaW5kT25jZUZ1dHVyZTtcbn0oKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBpbnRlcm5hbFxuICogU2hhcmVkIGZ1bmN0aW9uYWxpdHkgdXNlZCBieSBFeHBvcnRlcnMgd2hpbGUgZXhwb3J0aW5nIGRhdGEsIGluY2x1ZGluZyBzdXBwcmVzc2lvbiBvZiBUcmFjZXMuXG4gKi9cbmZ1bmN0aW9uIF9leHBvcnQoZXhwb3J0ZXIsIGFyZykge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAvLyBwcmV2ZW50IGRvd25zdHJlYW0gZXhwb3J0ZXIgY2FsbHMgZnJvbSBnZW5lcmF0aW5nIHNwYW5zXG4gICAgICAgIGNvbnRleHQud2l0aChzdXBwcmVzc1RyYWNpbmcoY29udGV4dC5hY3RpdmUoKSksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGV4cG9ydGVyLmV4cG9ydChhcmcsIGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgYmFnZ2FnZVV0aWxzID0ge1xuICAgIGdldEtleVBhaXJzOiBnZXRLZXlQYWlycyxcbiAgICBzZXJpYWxpemVLZXlQYWlyczogc2VyaWFsaXplS2V5UGFpcnMsXG4gICAgcGFyc2VLZXlQYWlyc0ludG9SZWNvcmQ6IHBhcnNlS2V5UGFpcnNJbnRvUmVjb3JkLFxuICAgIHBhcnNlUGFpcktleVZhbHVlOiBwYXJzZVBhaXJLZXlWYWx1ZSxcbn07XG52YXIgaW50ZXJuYWwgPSB7XG4gICAgX2V4cG9ydDogX2V4cG9ydCxcbn07XG5cbmNvbnN0IGVzbSA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKC8qI19fUFVSRV9fKi9PYmplY3QuZGVmaW5lUHJvcGVydHkoe1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBBbHdheXNPZmZTYW1wbGVyLFxuICAgIEFsd2F5c09uU2FtcGxlcixcbiAgICBBbmNob3JlZENsb2NrLFxuICAgIEJpbmRPbmNlRnV0dXJlLFxuICAgIENvbXBvc2l0ZVByb3BhZ2F0b3IsXG4gICAgREVGQVVMVF9BVFRSSUJVVEVfQ09VTlRfTElNSVQsXG4gICAgREVGQVVMVF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlULFxuICAgIERFRkFVTFRfRU5WSVJPTk1FTlQsXG4gICAgREVGQVVMVF9TUEFOX0FUVFJJQlVURV9QRVJfRVZFTlRfQ09VTlRfTElNSVQsXG4gICAgREVGQVVMVF9TUEFOX0FUVFJJQlVURV9QRVJfTElOS19DT1VOVF9MSU1JVCxcbiAgICBnZXQgRXhwb3J0UmVzdWx0Q29kZSAoKSB7IHJldHVybiBFeHBvcnRSZXN1bHRDb2RlOyB9LFxuICAgIFBhcmVudEJhc2VkU2FtcGxlcixcbiAgICBnZXQgUlBDVHlwZSAoKSB7IHJldHVybiBSUENUeXBlOyB9LFxuICAgIFJhbmRvbUlkR2VuZXJhdG9yLFxuICAgIFNES19JTkZPLFxuICAgIFRSQUNFX1BBUkVOVF9IRUFERVIsXG4gICAgVFJBQ0VfU1RBVEVfSEVBREVSLFxuICAgIFRpbWVvdXRFcnJvcixcbiAgICBUcmFjZUlkUmF0aW9CYXNlZFNhbXBsZXIsXG4gICAgVHJhY2VTdGF0ZSxcbiAgICBnZXQgVHJhY2VzU2FtcGxlclZhbHVlcyAoKSB7IHJldHVybiBUcmFjZXNTYW1wbGVyVmFsdWVzOyB9LFxuICAgIFZFUlNJT046IFZFUlNJT04kMSxcbiAgICBXM0NCYWdnYWdlUHJvcGFnYXRvcixcbiAgICBXM0NUcmFjZUNvbnRleHRQcm9wYWdhdG9yLFxuICAgIF9nbG9iYWxUaGlzLFxuICAgIGFkZEhyVGltZXMsXG4gICAgYmFnZ2FnZVV0aWxzLFxuICAgIGNhbGxXaXRoVGltZW91dCxcbiAgICBkZWxldGVSUENNZXRhZGF0YSxcbiAgICBnZXRFbnYsXG4gICAgZ2V0RW52V2l0aG91dERlZmF1bHRzLFxuICAgIGdldFJQQ01ldGFkYXRhLFxuICAgIGdldFRpbWVPcmlnaW4sXG4gICAgZ2xvYmFsRXJyb3JIYW5kbGVyLFxuICAgIGhleFRvQmFzZTY0LFxuICAgIGhleFRvQmluYXJ5LFxuICAgIGhyVGltZSxcbiAgICBoclRpbWVEdXJhdGlvbixcbiAgICBoclRpbWVUb01pY3Jvc2Vjb25kcyxcbiAgICBoclRpbWVUb01pbGxpc2Vjb25kcyxcbiAgICBoclRpbWVUb05hbm9zZWNvbmRzLFxuICAgIGhyVGltZVRvVGltZVN0YW1wLFxuICAgIGludGVybmFsLFxuICAgIGlzQXR0cmlidXRlS2V5LFxuICAgIGlzQXR0cmlidXRlVmFsdWUsXG4gICAgaXNUaW1lSW5wdXQsXG4gICAgaXNUaW1lSW5wdXRIclRpbWUsXG4gICAgaXNUcmFjaW5nU3VwcHJlc3NlZCxcbiAgICBpc1VybElnbm9yZWQsXG4gICAgaXNXcmFwcGVkLFxuICAgIGxvZ2dpbmdFcnJvckhhbmRsZXIsXG4gICAgbWVyZ2UsXG4gICAgbWlsbGlzVG9IclRpbWUsXG4gICAgb3RwZXJmb3JtYW5jZSxcbiAgICBwYXJzZUVudmlyb25tZW50LFxuICAgIHBhcnNlVHJhY2VQYXJlbnQsXG4gICAgc2FuaXRpemVBdHRyaWJ1dGVzLFxuICAgIHNldEdsb2JhbEVycm9ySGFuZGxlcixcbiAgICBzZXRSUENNZXRhZGF0YSxcbiAgICBzdXBwcmVzc1RyYWNpbmcsXG4gICAgdGltZUlucHV0VG9IclRpbWUsXG4gICAgdW5yZWZUaW1lcixcbiAgICB1bnN1cHByZXNzVHJhY2luZyxcbiAgICB1cmxNYXRjaGVzXG59LCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pKTtcblxuZXhwb3J0IHsgQmluZE9uY2VGdXR1cmUgYXMgQiwgQ29tcG9zaXRlUHJvcGFnYXRvciBhcyBDLCBTYW1wbGluZ0RlY2lzaW9uIGFzIFMsIFczQ1RyYWNlQ29udGV4dFByb3BhZ2F0b3IgYXMgVywgc3VwcHJlc3NUcmFjaW5nIGFzIGEsIGlzVHJhY2luZ1N1cHByZXNzZWQgYXMgYiwgVzNDQmFnZ2FnZVByb3BhZ2F0b3IgYXMgYywgaW50ZXJuYWwgYXMgZCwgZXNtIGFzIGUsIGdsb2JhbEVycm9ySGFuZGxlciBhcyBnLCBpc0F0dHJpYnV0ZVZhbHVlIGFzIGksIG1lcmdlIGFzIG0sIHNhbml0aXplQXR0cmlidXRlcyBhcyBzLCB1bnJlZlRpbWVyIGFzIHUgfTsiXSwKICAibWFwcGluZ3MiOiAiQUFBQSxTQUFTLEtBQUtBLElBQWdDLEtBQUtDLEdBQWEsS0FBS0MsSUFBWSxLQUFLQyxJQUFlLEtBQUtDLElBQVEsS0FBS0MsSUFBZ0IsS0FBS0MsSUFBc0IsTUFBTUMsSUFBc0IsS0FBS0MsSUFBcUIsTUFBTUMsSUFBbUIsS0FBS0MsSUFBYSxLQUFLQyxJQUFtQixLQUFLQyxJQUFjLEtBQUtDLElBQWdCLEtBQUtDLElBQWUsS0FBS0MsSUFBbUIsS0FBS0MsVUFBa0I7QUFDdFksU0FBUyxLQUFLQyxHQUFrQixLQUFLQyxHQUFPLEtBQUtDLEdBQW9CLEtBQUtDLEdBQVksS0FBS0MsSUFBZ0IsS0FBS0MsU0FBZTtBQUMvSCxTQUFTLEtBQUtDLFNBQVk7QUFDMUIsU0FBUyxLQUFLQyxHQUFhLEtBQUtDLFVBQXdCO0FBQ3hELFNBQVMsS0FBS0MsSUFBK0IsS0FBS0MsSUFBc0MsTUFBTUMsSUFBcUIsTUFBTUMsSUFBOEMsTUFBTUMsSUFBNkMsS0FBS0MsSUFBVSxLQUFLQyxJQUFxQixNQUFNQyxJQUFXLEtBQUtDLElBQVEsS0FBS0MsSUFBdUIsTUFBTUMsVUFBd0I7QUFDM1YsU0FB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Q0FBQyxDQUFDOyIsCiAgIm5hbWVzIjogWyJiYWdnYWdlRW50cnlNZXRhZGF0YUZyb21TdHJpbmciLCAicHJvcGFnYXRpb24iLCAiYWRkSHJUaW1lcyIsICJnZXRUaW1lT3JpZ2luIiwgImhyVGltZSIsICJoclRpbWVEdXJhdGlvbiIsICJoclRpbWVUb01pY3Jvc2Vjb25kcyIsICJoclRpbWVUb01pbGxpc2Vjb25kcyIsICJoclRpbWVUb05hbm9zZWNvbmRzIiwgImhyVGltZVRvVGltZVN0YW1wIiwgImlzVGltZUlucHV0IiwgImlzVGltZUlucHV0SHJUaW1lIiwgImlzVXJsSWdub3JlZCIsICJtaWxsaXNUb0hyVGltZSIsICJvdHBlcmZvcm1hbmNlIiwgInRpbWVJbnB1dFRvSHJUaW1lIiwgInVybE1hdGNoZXMiLCAiY3JlYXRlQ29udGV4dEtleSIsICJ0cmFjZSIsICJpc1NwYW5Db250ZXh0VmFsaWQiLCAiVHJhY2VGbGFncyIsICJpc1ZhbGlkVHJhY2VJZCIsICJjb250ZXh0IiwgImRpYWciLCAiaGV4VG9CaW5hcnkiLCAiRXhwb3J0UmVzdWx0Q29kZSIsICJERUZBVUxUX0FUVFJJQlVURV9DT1VOVF9MSU1JVCIsICJERUZBVUxUX0FUVFJJQlVURV9WQUxVRV9MRU5HVEhfTElNSVQiLCAiREVGQVVMVF9FTlZJUk9OTUVOVCIsICJERUZBVUxUX1NQQU5fQVRUUklCVVRFX1BFUl9FVkVOVF9DT1VOVF9MSU1JVCIsICJERUZBVUxUX1NQQU5fQVRUUklCVVRFX1BFUl9MSU5LX0NPVU5UX0xJTUlUIiwgIlNES19JTkZPIiwgIlRyYWNlc1NhbXBsZXJWYWx1ZXMiLCAiVkVSU0lPTiQxIiwgImdldEVudiIsICJnZXRFbnZXaXRob3V0RGVmYXVsdHMiLCAicGFyc2VFbnZpcm9ubWVudCIsICJfZ2xvYmFsVGhpcyIsICJTYW1wbGluZ0RlY2lzaW9uIiwgIlNVUFBSRVNTX1RSQUNJTkdfS0VZIiwgInN1cHByZXNzVHJhY2luZyIsICJ1bnN1cHByZXNzVHJhY2luZyIsICJpc1RyYWNpbmdTdXBwcmVzc2VkIiwgIkJBR0dBR0VfS0VZX1BBSVJfU0VQQVJBVE9SIiwgIkJBR0dBR0VfUFJPUEVSVElFU19TRVBBUkFUT1IiLCAiQkFHR0FHRV9JVEVNU19TRVBBUkFUT1IiLCAiQkFHR0FHRV9IRUFERVIiLCAiQkFHR0FHRV9NQVhfTkFNRV9WQUxVRV9QQUlSUyIsICJCQUdHQUdFX01BWF9QRVJfTkFNRV9WQUxVRV9QQUlSUyIsICJCQUdHQUdFX01BWF9UT1RBTF9MRU5HVEgiLCAiX19yZWFkJDMiLCAibyIsICJuIiwgIm0iLCAiaSIsICJyIiwgImFyIiwgImUiLCAiZXJyb3IiLCAic2VyaWFsaXplS2V5UGFpcnMiLCAia2V5UGFpcnMiLCAiaFZhbHVlIiwgImN1cnJlbnQiLCAidmFsdWUiLCAiZ2V0S2V5UGFpcnMiLCAiYmFnZ2FnZSIsICJfYSIsICJfYiIsICJrZXkiLCAiZW50cnkiLCAicGFyc2VQYWlyS2V5VmFsdWUiLCAidmFsdWVQcm9wcyIsICJrZXlQYWlyUGFydCIsICJzZXBhcmF0b3JJbmRleCIsICJtZXRhZGF0YSIsICJwYXJzZUtleVBhaXJzSW50b1JlY29yZCIsICJrZXlQYWlyIiwgImhlYWRlcnMiLCAiVzNDQmFnZ2FnZVByb3BhZ2F0b3IiLCAiY2FycmllciIsICJzZXR0ZXIiLCAicGFpciIsICJoZWFkZXJWYWx1ZSIsICJnZXR0ZXIiLCAiYmFnZ2FnZVN0cmluZyIsICJwYWlycyIsICJiYWdnYWdlRW50cnkiLCAiQW5jaG9yZWRDbG9jayIsICJzeXN0ZW1DbG9jayIsICJtb25vdG9uaWNDbG9jayIsICJkZWx0YSIsICJfX3ZhbHVlcyQxIiwgInMiLCAiX19yZWFkJDIiLCAic2FuaXRpemVBdHRyaWJ1dGVzIiwgImF0dHJpYnV0ZXMiLCAiZV8xIiwgIm91dCIsICJfYyIsICJfZCIsICJ2YWwiLCAiaXNBdHRyaWJ1dGVLZXkiLCAiaXNBdHRyaWJ1dGVWYWx1ZSIsICJlXzFfMSIsICJpc0hvbW9nZW5lb3VzQXR0cmlidXRlVmFsdWVBcnJheSIsICJpc1ZhbGlkUHJpbWl0aXZlQXR0cmlidXRlVmFsdWUiLCAiYXJyIiwgImVfMiIsICJ0eXBlIiwgImFycl8xIiwgImFycl8xXzEiLCAiZWxlbWVudCIsICJlXzJfMSIsICJsb2dnaW5nRXJyb3JIYW5kbGVyIiwgImV4IiwgInN0cmluZ2lmeUV4Y2VwdGlvbiIsICJmbGF0dGVuRXhjZXB0aW9uIiwgInJlc3VsdCIsICJwcm9wZXJ0eU5hbWUiLCAiZGVsZWdhdGVIYW5kbGVyIiwgInNldEdsb2JhbEVycm9ySGFuZGxlciIsICJoYW5kbGVyIiwgImdsb2JhbEVycm9ySGFuZGxlciIsICJfX3JlYWQkMSIsICJfX3NwcmVhZEFycmF5JDEiLCAidG8iLCAiZnJvbSIsICJwYWNrIiwgImwiLCAiaGV4VG9CYXNlNjQiLCAiaGV4U3RyIiwgIlNQQU5fSURfQllURVMiLCAiVFJBQ0VfSURfQllURVMiLCAiUmFuZG9tSWRHZW5lcmF0b3IiLCAiZ2V0SWRHZW5lcmF0b3IiLCAiU0hBUkVEX0NIQVJfQ09ERVNfQVJSQVkiLCAiYnl0ZXMiLCAidW5yZWZUaW1lciIsICJfdGltZXIiLCAiX192YWx1ZXMiLCAiQ29tcG9zaXRlUHJvcGFnYXRvciIsICJjb25maWciLCAicCIsICJ4IiwgInkiLCAicHJvcGFnYXRvciIsICJlcnIiLCAiY3R4IiwgIlZBTElEX0tFWV9DSEFSX1JBTkdFIiwgIlZBTElEX0tFWSIsICJWQUxJRF9WRU5ET1JfS0VZIiwgIlZBTElEX0tFWV9SRUdFWCIsICJWQUxJRF9WQUxVRV9CQVNFX1JFR0VYIiwgIklOVkFMSURfVkFMVUVfQ09NTUFfRVFVQUxfUkVHRVgiLCAidmFsaWRhdGVLZXkiLCAidmFsaWRhdGVWYWx1ZSIsICJNQVhfVFJBQ0VfU1RBVEVfSVRFTVMiLCAiTUFYX1RSQUNFX1NUQVRFX0xFTiIsICJMSVNUX01FTUJFUlNfU0VQQVJBVE9SIiwgIkxJU1RfTUVNQkVSX0tFWV9WQUxVRV9TUExJVFRFUiIsICJUcmFjZVN0YXRlIiwgInJhd1RyYWNlU3RhdGUiLCAidHJhY2VTdGF0ZSIsICJfdGhpcyIsICJhZ2ciLCAicGFydCIsICJsaXN0TWVtYmVyIiwgIlRSQUNFX1BBUkVOVF9IRUFERVIiLCAiVFJBQ0VfU1RBVEVfSEVBREVSIiwgIlZFUlNJT04iLCAiVkVSU0lPTl9QQVJUIiwgIlRSQUNFX0lEX1BBUlQiLCAiUEFSRU5UX0lEX1BBUlQiLCAiRkxBR1NfUEFSVCIsICJUUkFDRV9QQVJFTlRfUkVHRVgiLCAicGFyc2VUcmFjZVBhcmVudCIsICJ0cmFjZVBhcmVudCIsICJtYXRjaCIsICJXM0NUcmFjZUNvbnRleHRQcm9wYWdhdG9yIiwgInNwYW5Db250ZXh0IiwgInRyYWNlUGFyZW50SGVhZGVyIiwgInRyYWNlU3RhdGVIZWFkZXIiLCAic3RhdGUiLCAiUlBDX01FVEFEQVRBX0tFWSIsICJSUENUeXBlIiwgInNldFJQQ01ldGFkYXRhIiwgIm1ldGEiLCAiZGVsZXRlUlBDTWV0YWRhdGEiLCAiZ2V0UlBDTWV0YWRhdGEiLCAiQWx3YXlzT2ZmU2FtcGxlciIsICJBbHdheXNPblNhbXBsZXIiLCAiUGFyZW50QmFzZWRTYW1wbGVyIiwgInRyYWNlSWQiLCAic3Bhbk5hbWUiLCAic3BhbktpbmQiLCAibGlua3MiLCAicGFyZW50Q29udGV4dCIsICJUcmFjZUlkUmF0aW9CYXNlZFNhbXBsZXIiLCAiX3JhdGlvIiwgInJhdGlvIiwgImFjY3VtdWxhdGlvbiIsICJwb3MiLCAib2JqZWN0VGFnIiwgIm51bGxUYWciLCAidW5kZWZpbmVkVGFnIiwgImZ1bmNQcm90byIsICJmdW5jVG9TdHJpbmciLCAib2JqZWN0Q3RvclN0cmluZyIsICJnZXRQcm90b3R5cGUiLCAib3ZlckFyZyIsICJvYmplY3RQcm90byIsICJoYXNPd25Qcm9wZXJ0eSIsICJzeW1Ub1N0cmluZ1RhZyIsICJuYXRpdmVPYmplY3RUb1N0cmluZyIsICJmdW5jIiwgInRyYW5zZm9ybSIsICJhcmciLCAiaXNQbGFpbk9iamVjdCIsICJpc09iamVjdExpa2UiLCAiYmFzZUdldFRhZyIsICJwcm90byIsICJDdG9yIiwgImdldFJhd1RhZyIsICJvYmplY3RUb1N0cmluZyIsICJpc093biIsICJ0YWciLCAidW5tYXNrZWQiLCAiTUFYX0xFVkVMIiwgIm1lcmdlIiwgImFyZ3MiLCAiX2kiLCAib2JqZWN0cyIsICJtZXJnZVR3b09iamVjdHMiLCAidGFrZVZhbHVlIiwgImlzQXJyYXkiLCAib25lIiwgInR3byIsICJsZXZlbCIsICJpc1ByaW1pdGl2ZSIsICJpc0Z1bmN0aW9uIiwgImoiLCAiaXNPYmplY3QiLCAia2V5cyIsICJzaG91bGRNZXJnZSIsICJ0d29WYWx1ZSIsICJvYmoxIiwgIm9iajIiLCAid2FzT2JqZWN0UmVmZXJlbmNlZCIsICJhcnIxIiwgImFycjIiLCAib2JqIiwgImluZm8iLCAiX19leHRlbmRzIiwgImV4dGVuZFN0YXRpY3MiLCAiZCIsICJiIiwgIl9fIiwgIlRpbWVvdXRFcnJvciIsICJfc3VwZXIiLCAibWVzc2FnZSIsICJjYWxsV2l0aFRpbWVvdXQiLCAicHJvbWlzZSIsICJ0aW1lb3V0IiwgInRpbWVvdXRIYW5kbGUiLCAidGltZW91dFByb21pc2UiLCAiX3Jlc29sdmUiLCAicmVqZWN0IiwgInJlYXNvbiIsICJpc1dyYXBwZWQiLCAiRGVmZXJyZWQiLCAicmVzb2x2ZSIsICJfX3JlYWQiLCAiX19zcHJlYWRBcnJheSIsICJCaW5kT25jZUZ1dHVyZSIsICJfY2FsbGJhY2siLCAiX3RoYXQiLCAiX2V4cG9ydCIsICJleHBvcnRlciIsICJiYWdnYWdlVXRpbHMiLCAiaW50ZXJuYWwiLCAiZXNtIl0KfQo=