@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,330 +0,0 @@
1
- import { R as l } from "./Resource-BZeevyoh.js";
2
- import { d as ee } from "./Resource-BZeevyoh.js";
3
- import { d as v } from "./diag-api-CHLb_Weo.js";
4
- import { e as A, f as m, g as b, h as w, S as D } from "./sdk-info-DYuuxEVK.js";
5
- var T = (
6
- /** @class */
7
- function() {
8
- function e() {
9
- }
10
- return e.prototype.detect = function() {
11
- return new l({});
12
- }, e;
13
- }()
14
- ), h = new T(), I = (
15
- /** @class */
16
- function() {
17
- function e() {
18
- }
19
- return e.prototype.detect = function() {
20
- return Promise.resolve(h.detect());
21
- }, e;
22
- }()
23
- ), _ = new I(), H = _, F = h, X = _, k = h, K = _, Y = _, q = h, E = function() {
24
- return E = Object.assign || function(e) {
25
- for (var n, t = 1, i = arguments.length; t < i; t++) {
26
- n = arguments[t];
27
- for (var o in n) Object.prototype.hasOwnProperty.call(n, o) && (e[o] = n[o]);
28
- }
29
- return e;
30
- }, E.apply(this, arguments);
31
- }, N = (
32
- /** @class */
33
- function() {
34
- function e() {
35
- }
36
- return e.prototype.detect = function(n) {
37
- var t, i, o, r, u = typeof navigator < "u" && ((o = (i = global.process) === null || i === void 0 ? void 0 : i.versions) === null || o === void 0 ? void 0 : o.node) === void 0 && // Node.js v21 adds `navigator`
38
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
39
- // @ts-ignore don't have Bun types
40
- ((r = global.Bun) === null || r === void 0 ? void 0 : r.version) === void 0;
41
- if (!u)
42
- return l.empty();
43
- var a = (t = {}, t[A] = "browser", t[m] = "Web Browser", t[b] = navigator.userAgent, t);
44
- return this._getResourceAttributes(a, n);
45
- }, e.prototype._getResourceAttributes = function(n, t) {
46
- return n[b] === "" ? (v.debug("BrowserDetector failed: Unable to find required browser resources. "), l.empty()) : new l(E({}, n));
47
- }, e;
48
- }()
49
- ), O = new N(), M = (
50
- /** @class */
51
- function() {
52
- function e() {
53
- }
54
- return e.prototype.detect = function(n) {
55
- return Promise.resolve(O.detect(n));
56
- }, e;
57
- }()
58
- ), J = new M(), L = function(e) {
59
- var n = typeof Symbol == "function" && Symbol.iterator, t = n && e[n], i = 0;
60
- if (t) return t.call(e);
61
- if (e && typeof e.length == "number") return {
62
- next: function() {
63
- return e && i >= e.length && (e = void 0), { value: e && e[i++], done: !e };
64
- }
65
- };
66
- throw new TypeError(n ? "Object is not iterable." : "Symbol.iterator is not defined.");
67
- }, x = function(e, n) {
68
- var t = typeof Symbol == "function" && e[Symbol.iterator];
69
- if (!t) return e;
70
- var i = t.call(e), o, r = [], u;
71
- try {
72
- for (; (n === void 0 || n-- > 0) && !(o = i.next()).done; ) r.push(o.value);
73
- } catch (a) {
74
- u = { error: a };
75
- } finally {
76
- try {
77
- o && !o.done && (t = i.return) && t.call(i);
78
- } finally {
79
- if (u) throw u.error;
80
- }
81
- }
82
- return r;
83
- }, C = (
84
- /** @class */
85
- function() {
86
- function e() {
87
- this._MAX_LENGTH = 255, this._COMMA_SEPARATOR = ",", this._LABEL_KEY_VALUE_SPLITTER = "=", this._ERROR_MESSAGE_INVALID_CHARS = "should be a ASCII string with a length greater than 0 and not exceed " + this._MAX_LENGTH + " characters.", this._ERROR_MESSAGE_INVALID_VALUE = "should be a ASCII string with a length not exceed " + this._MAX_LENGTH + " characters.";
88
- }
89
- return e.prototype.detect = function(n) {
90
- var t = {}, i = w(), o = i.OTEL_RESOURCE_ATTRIBUTES, r = i.OTEL_SERVICE_NAME;
91
- if (o)
92
- try {
93
- var u = this._parseResourceAttributes(o);
94
- Object.assign(t, u);
95
- } catch (a) {
96
- v.debug("EnvDetector failed: " + a.message);
97
- }
98
- return r && (t[D] = r), new l(t);
99
- }, e.prototype._parseResourceAttributes = function(n) {
100
- var t, i;
101
- if (!n)
102
- return {};
103
- var o = {}, r = n.split(this._COMMA_SEPARATOR, -1);
104
- try {
105
- for (var u = L(r), a = u.next(); !a.done; a = u.next()) {
106
- var f = a.value, c = f.split(this._LABEL_KEY_VALUE_SPLITTER, -1);
107
- if (c.length === 2) {
108
- var s = x(c, 2), d = s[0], y = s[1];
109
- if (d = d.trim(), y = y.trim().split(/^"|"$/).join(""), !this._isValidAndNotEmpty(d))
110
- throw new Error("Attribute key " + this._ERROR_MESSAGE_INVALID_CHARS);
111
- if (!this._isValid(y))
112
- throw new Error("Attribute value " + this._ERROR_MESSAGE_INVALID_VALUE);
113
- o[d] = decodeURIComponent(y);
114
- }
115
- }
116
- } catch (g) {
117
- t = { error: g };
118
- } finally {
119
- try {
120
- a && !a.done && (i = u.return) && i.call(u);
121
- } finally {
122
- if (t) throw t.error;
123
- }
124
- }
125
- return o;
126
- }, e.prototype._isValid = function(n) {
127
- return n.length <= this._MAX_LENGTH && this._isBaggageOctetString(n);
128
- }, e.prototype._isBaggageOctetString = function(n) {
129
- for (var t = 0; t < n.length; t++) {
130
- var i = n.charCodeAt(t);
131
- if (i < 33 || i === 44 || i === 59 || i === 92 || i > 126)
132
- return !1;
133
- }
134
- return !0;
135
- }, e.prototype._isValidAndNotEmpty = function(n) {
136
- return n.length > 0 && this._isValid(n);
137
- }, e;
138
- }()
139
- ), V = new C(), B = (
140
- /** @class */
141
- function() {
142
- function e() {
143
- }
144
- return e.prototype.detect = function(n) {
145
- return Promise.resolve(V.detect(n));
146
- }, e;
147
- }()
148
- ), W = new B(), U = function(e) {
149
- return e !== null && typeof e == "object" && typeof e.then == "function";
150
- }, S = function(e, n, t, i) {
151
- function o(r) {
152
- return r instanceof t ? r : new t(function(u) {
153
- u(r);
154
- });
155
- }
156
- return new (t || (t = Promise))(function(r, u) {
157
- function a(s) {
158
- try {
159
- c(i.next(s));
160
- } catch (d) {
161
- u(d);
162
- }
163
- }
164
- function f(s) {
165
- try {
166
- c(i.throw(s));
167
- } catch (d) {
168
- u(d);
169
- }
170
- }
171
- function c(s) {
172
- s.done ? r(s.value) : o(s.value).then(a, f);
173
- }
174
- c((i = i.apply(e, n || [])).next());
175
- });
176
- }, p = function(e, n) {
177
- var t = { label: 0, sent: function() {
178
- if (r[0] & 1) throw r[1];
179
- return r[1];
180
- }, trys: [], ops: [] }, i, o, r, u;
181
- return u = { next: a(0), throw: a(1), return: a(2) }, typeof Symbol == "function" && (u[Symbol.iterator] = function() {
182
- return this;
183
- }), u;
184
- function a(c) {
185
- return function(s) {
186
- return f([c, s]);
187
- };
188
- }
189
- function f(c) {
190
- if (i) throw new TypeError("Generator is already executing.");
191
- for (; t; ) try {
192
- if (i = 1, o && (r = c[0] & 2 ? o.return : c[0] ? o.throw || ((r = o.return) && r.call(o), 0) : o.next) && !(r = r.call(o, c[1])).done) return r;
193
- switch (o = 0, r && (c = [c[0] & 2, r.value]), c[0]) {
194
- case 0:
195
- case 1:
196
- r = c;
197
- break;
198
- case 4:
199
- return t.label++, { value: c[1], done: !1 };
200
- case 5:
201
- t.label++, o = c[1], c = [0];
202
- continue;
203
- case 7:
204
- c = t.ops.pop(), t.trys.pop();
205
- continue;
206
- default:
207
- if (r = t.trys, !(r = r.length > 0 && r[r.length - 1]) && (c[0] === 6 || c[0] === 2)) {
208
- t = 0;
209
- continue;
210
- }
211
- if (c[0] === 3 && (!r || c[1] > r[0] && c[1] < r[3])) {
212
- t.label = c[1];
213
- break;
214
- }
215
- if (c[0] === 6 && t.label < r[1]) {
216
- t.label = r[1], r = c;
217
- break;
218
- }
219
- if (r && t.label < r[2]) {
220
- t.label = r[2], t.ops.push(c);
221
- break;
222
- }
223
- r[2] && t.ops.pop(), t.trys.pop();
224
- continue;
225
- }
226
- c = n.call(e, t);
227
- } catch (s) {
228
- c = [6, s], o = 0;
229
- } finally {
230
- i = r = 0;
231
- }
232
- if (c[0] & 5) throw c[1];
233
- return { value: c[0] ? c[1] : void 0, done: !0 };
234
- }
235
- }, $ = function(e) {
236
- return e === void 0 && (e = {}), S(void 0, void 0, void 0, function() {
237
- var n;
238
- return p(this, function(t) {
239
- switch (t.label) {
240
- case 0:
241
- return [4, Promise.all((e.detectors || []).map(function(i) {
242
- return S(void 0, void 0, void 0, function() {
243
- var o, r;
244
- return p(this, function(u) {
245
- switch (u.label) {
246
- case 0:
247
- return u.trys.push([0, 2, , 3]), [4, i.detect(e)];
248
- case 1:
249
- return o = u.sent(), v.debug(i.constructor.name + " found resource.", o), [2, o];
250
- case 2:
251
- return r = u.sent(), v.debug(i.constructor.name + " failed: " + r.message), [2, l.empty()];
252
- case 3:
253
- return [
254
- 2
255
- /*return*/
256
- ];
257
- }
258
- });
259
- });
260
- }))];
261
- case 1:
262
- return n = t.sent(), R(n), [2, n.reduce(function(i, o) {
263
- return i.merge(o);
264
- }, l.empty())];
265
- }
266
- });
267
- });
268
- }, z = function(e) {
269
- var n;
270
- e === void 0 && (e = {});
271
- var t = ((n = e.detectors) !== null && n !== void 0 ? n : []).map(function(o) {
272
- try {
273
- var r = o.detect(e), u;
274
- if (U(r)) {
275
- var a = function() {
276
- return S(void 0, void 0, void 0, function() {
277
- var f, c;
278
- return p(this, function(s) {
279
- switch (s.label) {
280
- case 0:
281
- return [4, r];
282
- case 1:
283
- return f = s.sent(), [4, (c = f.waitForAsyncAttributes) === null || c === void 0 ? void 0 : c.call(f)];
284
- case 2:
285
- return s.sent(), [2, f.attributes];
286
- }
287
- });
288
- });
289
- };
290
- u = new l({}, a());
291
- } else
292
- u = r;
293
- return u.waitForAsyncAttributes ? u.waitForAsyncAttributes().then(function() {
294
- return v.debug(o.constructor.name + " found resource.", u);
295
- }) : v.debug(o.constructor.name + " found resource.", u), u;
296
- } catch (f) {
297
- return v.error(o.constructor.name + " failed: " + f.message), l.empty();
298
- }
299
- }), i = t.reduce(function(o, r) {
300
- return o.merge(r);
301
- }, l.empty());
302
- return i.waitForAsyncAttributes && i.waitForAsyncAttributes().then(function() {
303
- R(t);
304
- }), i;
305
- }, R = function(e) {
306
- e.forEach(function(n) {
307
- if (Object.keys(n.attributes).length > 0) {
308
- var t = JSON.stringify(n.attributes, null, 4);
309
- v.verbose(t);
310
- }
311
- });
312
- };
313
- export {
314
- l as Resource,
315
- J as browserDetector,
316
- O as browserDetectorSync,
317
- ee as defaultServiceName,
318
- $ as detectResources,
319
- z as detectResourcesSync,
320
- W as envDetector,
321
- V as envDetectorSync,
322
- H as hostDetector,
323
- F as hostDetectorSync,
324
- X as osDetector,
325
- k as osDetectorSync,
326
- K as processDetector,
327
- Y as processDetectorSync,
328
- q as serviceInstanceIdDetectorSync
329
- };
330
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiaW5kZXgtIX57MDBrfX4uanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IFIgYXMgUmVzb3VyY2UgfSBmcm9tICcuL1Jlc291cmNlLSF+ezAwYX1+LmpzJztcbmV4cG9ydCB7IGQgYXMgZGVmYXVsdFNlcnZpY2VOYW1lIH0gZnJvbSAnLi9SZXNvdXJjZS0hfnswMGF9fi5qcyc7XG5pbXBvcnQgeyBkIGFzIGRpYWcgfSBmcm9tICcuL2RpYWctYXBpLSF+ezAwNX1+LmpzJztcbmltcG9ydCB7IGUgYXMgU0VNUkVTQVRUUlNfUFJPQ0VTU19SVU5USU1FX05BTUUsIGYgYXMgU0VNUkVTQVRUUlNfUFJPQ0VTU19SVU5USU1FX0RFU0NSSVBUSU9OLCBnIGFzIFNFTVJFU0FUVFJTX1BST0NFU1NfUlVOVElNRV9WRVJTSU9OLCBoIGFzIGdldEVudiwgUyBhcyBTRU1SRVNBVFRSU19TRVJWSUNFX05BTUUgfSBmcm9tICcuL3Nkay1pbmZvLSF+ezAwYn1+LmpzJztcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBOb29wRGV0ZWN0b3JTeW5jID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE5vb3BEZXRlY3RvclN5bmMoKSB7XG4gICAgfVxuICAgIE5vb3BEZXRlY3RvclN5bmMucHJvdG90eXBlLmRldGVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZSh7fSk7XG4gICAgfTtcbiAgICByZXR1cm4gTm9vcERldGVjdG9yU3luYztcbn0oKSk7XG52YXIgbm9vcERldGVjdG9yU3luYyA9IG5ldyBOb29wRGV0ZWN0b3JTeW5jKCk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgTm9vcERldGVjdG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE5vb3BEZXRlY3RvcigpIHtcbiAgICB9XG4gICAgTm9vcERldGVjdG9yLnByb3RvdHlwZS5kZXRlY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobm9vcERldGVjdG9yU3luYy5kZXRlY3QoKSk7XG4gICAgfTtcbiAgICByZXR1cm4gTm9vcERldGVjdG9yO1xufSgpKTtcbnZhciBub29wRGV0ZWN0b3IgPSBuZXcgTm9vcERldGVjdG9yKCk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgaG9zdERldGVjdG9yID0gbm9vcERldGVjdG9yO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIGhvc3REZXRlY3RvclN5bmMgPSBub29wRGV0ZWN0b3JTeW5jO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIG9zRGV0ZWN0b3IgPSBub29wRGV0ZWN0b3I7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgb3NEZXRlY3RvclN5bmMgPSBub29wRGV0ZWN0b3JTeW5jO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIHByb2Nlc3NEZXRlY3RvciA9IG5vb3BEZXRlY3RvcjtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBwcm9jZXNzRGV0ZWN0b3JTeW5jID0gbm9vcERldGVjdG9yO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbnZhciBzZXJ2aWNlSW5zdGFuY2VJZERldGVjdG9yU3luYyA9IG5vb3BEZXRlY3RvclN5bmM7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgX19hc3NpZ24gPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX2Fzc2lnbikgfHwgZnVuY3Rpb24gKCkge1xuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7XG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSlcbiAgICAgICAgICAgICAgICB0W3BdID0gc1twXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9O1xuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcbi8qKlxuICogQnJvd3NlckRldGVjdG9yU3luYyB3aWxsIGJlIHVzZWQgdG8gZGV0ZWN0IHRoZSByZXNvdXJjZXMgcmVsYXRlZCB0byBicm93c2VyLlxuICovXG52YXIgQnJvd3NlckRldGVjdG9yU3luYyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBCcm93c2VyRGV0ZWN0b3JTeW5jKCkge1xuICAgIH1cbiAgICBCcm93c2VyRGV0ZWN0b3JTeW5jLnByb3RvdHlwZS5kZXRlY3QgPSBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIF9iLCBfYywgX2Q7XG4gICAgICAgIHZhciBpc0Jyb3dzZXIgPSB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgKChfYyA9IChfYiA9IGdsb2JhbC5wcm9jZXNzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IudmVyc2lvbnMpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5ub2RlKSA9PT0gdW5kZWZpbmVkICYmIC8vIE5vZGUuanMgdjIxIGFkZHMgYG5hdmlnYXRvcmBcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgZG9uJ3QgaGF2ZSBCdW4gdHlwZXNcbiAgICAgICAgICAgICgoX2QgPSBnbG9iYWwuQnVuKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QudmVyc2lvbikgPT09IHVuZGVmaW5lZDsgLy8gQnVuIChidW4uc2gpIGRlZmluZXMgYG5hdmlnYXRvcmBcbiAgICAgICAgaWYgKCFpc0Jyb3dzZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBSZXNvdXJjZS5lbXB0eSgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBicm93c2VyUmVzb3VyY2UgPSAoX2EgPSB7fSxcbiAgICAgICAgICAgIF9hW1NFTVJFU0FUVFJTX1BST0NFU1NfUlVOVElNRV9OQU1FXSA9ICdicm93c2VyJyxcbiAgICAgICAgICAgIF9hW1NFTVJFU0FUVFJTX1BST0NFU1NfUlVOVElNRV9ERVNDUklQVElPTl0gPSAnV2ViIEJyb3dzZXInLFxuICAgICAgICAgICAgX2FbU0VNUkVTQVRUUlNfUFJPQ0VTU19SVU5USU1FX1ZFUlNJT05dID0gbmF2aWdhdG9yLnVzZXJBZ2VudCxcbiAgICAgICAgICAgIF9hKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFJlc291cmNlQXR0cmlidXRlcyhicm93c2VyUmVzb3VyY2UsIGNvbmZpZyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZXMgcHJvY2VzcyByZXNvdXJjZSBhdHRyaWJ1dGUgbWFwIGZyb20gcHJvY2VzcyB2YXJpYWJsZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBicm93c2VyUmVzb3VyY2UgVGhlIHVuLXNhbml0aXplZCByZXNvdXJjZSBhdHRyaWJ1dGVzIGZyb20gcHJvY2VzcyBhcyBrZXkvdmFsdWUgcGFpcnMuXG4gICAgICogQHBhcmFtIGNvbmZpZzogQ29uZmlnXG4gICAgICogQHJldHVybnMgVGhlIHNhbml0aXplZCByZXNvdXJjZSBhdHRyaWJ1dGVzLlxuICAgICAqL1xuICAgIEJyb3dzZXJEZXRlY3RvclN5bmMucHJvdG90eXBlLl9nZXRSZXNvdXJjZUF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoYnJvd3NlclJlc291cmNlLCBfY29uZmlnKSB7XG4gICAgICAgIGlmIChicm93c2VyUmVzb3VyY2VbU0VNUkVTQVRUUlNfUFJPQ0VTU19SVU5USU1FX1ZFUlNJT05dID09PSAnJykge1xuICAgICAgICAgICAgZGlhZy5kZWJ1ZygnQnJvd3NlckRldGVjdG9yIGZhaWxlZDogVW5hYmxlIHRvIGZpbmQgcmVxdWlyZWQgYnJvd3NlciByZXNvdXJjZXMuICcpO1xuICAgICAgICAgICAgcmV0dXJuIFJlc291cmNlLmVtcHR5KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlKF9fYXNzaWduKHt9LCBicm93c2VyUmVzb3VyY2UpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIEJyb3dzZXJEZXRlY3RvclN5bmM7XG59KCkpO1xudmFyIGJyb3dzZXJEZXRlY3RvclN5bmMgPSBuZXcgQnJvd3NlckRldGVjdG9yU3luYygpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBCcm93c2VyRGV0ZWN0b3Igd2lsbCBiZSB1c2VkIHRvIGRldGVjdCB0aGUgcmVzb3VyY2VzIHJlbGF0ZWQgdG8gYnJvd3Nlci5cbiAqL1xudmFyIEJyb3dzZXJEZXRlY3RvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBCcm93c2VyRGV0ZWN0b3IoKSB7XG4gICAgfVxuICAgIEJyb3dzZXJEZXRlY3Rvci5wcm90b3R5cGUuZGV0ZWN0ID0gZnVuY3Rpb24gKGNvbmZpZykge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGJyb3dzZXJEZXRlY3RvclN5bmMuZGV0ZWN0KGNvbmZpZykpO1xuICAgIH07XG4gICAgcmV0dXJuIEJyb3dzZXJEZXRlY3Rvcjtcbn0oKSk7XG52YXIgYnJvd3NlckRldGVjdG9yID0gbmV3IEJyb3dzZXJEZXRlY3RvcigpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIF9fdmFsdWVzID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX192YWx1ZXMpIHx8IGZ1bmN0aW9uKG8pIHtcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xuICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xufTtcbnZhciBfX3JlYWQgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX3JlYWQpIHx8IGZ1bmN0aW9uIChvLCBuKSB7XG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICAgIGlmICghbSkgcmV0dXJuIG87XG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gICAgdHJ5IHtcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gICAgfVxuICAgIHJldHVybiBhcjtcbn07XG4vKipcbiAqIEVudkRldGVjdG9yU3luYyBjYW4gYmUgdXNlZCB0byBkZXRlY3QgdGhlIHByZXNlbmNlIG9mIGFuZCBjcmVhdGUgYSBSZXNvdXJjZVxuICogZnJvbSB0aGUgT1RFTF9SRVNPVVJDRV9BVFRSSUJVVEVTIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICovXG52YXIgRW52RGV0ZWN0b3JTeW5jID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEVudkRldGVjdG9yU3luYygpIHtcbiAgICAgICAgLy8gVHlwZSwgYXR0cmlidXRlIGtleXMsIGFuZCBhdHRyaWJ1dGUgdmFsdWVzIHNob3VsZCBub3QgZXhjZWVkIDI1NiBjaGFyYWN0ZXJzLlxuICAgICAgICB0aGlzLl9NQVhfTEVOR1RIID0gMjU1O1xuICAgICAgICAvLyBPVEVMX1JFU09VUkNFX0FUVFJJQlVURVMgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBhdHRyaWJ1dGVzLlxuICAgICAgICB0aGlzLl9DT01NQV9TRVBBUkFUT1IgPSAnLCc7XG4gICAgICAgIC8vIE9URUxfUkVTT1VSQ0VfQVRUUklCVVRFUyBjb250YWlucyBrZXkgdmFsdWUgcGFpciBzZXBhcmF0ZWQgYnkgJz0nLlxuICAgICAgICB0aGlzLl9MQUJFTF9LRVlfVkFMVUVfU1BMSVRURVIgPSAnPSc7XG4gICAgICAgIHRoaXMuX0VSUk9SX01FU1NBR0VfSU5WQUxJRF9DSEFSUyA9ICdzaG91bGQgYmUgYSBBU0NJSSBzdHJpbmcgd2l0aCBhIGxlbmd0aCBncmVhdGVyIHRoYW4gMCBhbmQgbm90IGV4Y2VlZCAnICtcbiAgICAgICAgICAgIHRoaXMuX01BWF9MRU5HVEggK1xuICAgICAgICAgICAgJyBjaGFyYWN0ZXJzLic7XG4gICAgICAgIHRoaXMuX0VSUk9SX01FU1NBR0VfSU5WQUxJRF9WQUxVRSA9ICdzaG91bGQgYmUgYSBBU0NJSSBzdHJpbmcgd2l0aCBhIGxlbmd0aCBub3QgZXhjZWVkICcgK1xuICAgICAgICAgICAgdGhpcy5fTUFYX0xFTkdUSCArXG4gICAgICAgICAgICAnIGNoYXJhY3RlcnMuJztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHtAbGluayBSZXNvdXJjZX0gcG9wdWxhdGVkIHdpdGggYXR0cmlidXRlcyBmcm9tIHRoZVxuICAgICAqIE9URUxfUkVTT1VSQ0VfQVRUUklCVVRFUyBlbnZpcm9ubWVudCB2YXJpYWJsZS4gTm90ZSB0aGlzIGlzIGFuIGFzeW5jXG4gICAgICogZnVuY3Rpb24gdG8gY29uZm9ybSB0byB0aGUgRGV0ZWN0b3IgaW50ZXJmYWNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbmZpZyBUaGUgcmVzb3VyY2UgZGV0ZWN0aW9uIGNvbmZpZ1xuICAgICAqL1xuICAgIEVudkRldGVjdG9yU3luYy5wcm90b3R5cGUuZGV0ZWN0ID0gZnVuY3Rpb24gKF9jb25maWcpIHtcbiAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSB7fTtcbiAgICAgICAgdmFyIGVudiA9IGdldEVudigpO1xuICAgICAgICB2YXIgcmF3QXR0cmlidXRlcyA9IGVudi5PVEVMX1JFU09VUkNFX0FUVFJJQlVURVM7XG4gICAgICAgIHZhciBzZXJ2aWNlTmFtZSA9IGVudi5PVEVMX1NFUlZJQ0VfTkFNRTtcbiAgICAgICAgaWYgKHJhd0F0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIHBhcnNlZEF0dHJpYnV0ZXMgPSB0aGlzLl9wYXJzZVJlc291cmNlQXR0cmlidXRlcyhyYXdBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGF0dHJpYnV0ZXMsIHBhcnNlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBkaWFnLmRlYnVnKFwiRW52RGV0ZWN0b3IgZmFpbGVkOiBcIiArIGUubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlcnZpY2VOYW1lKSB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzW1NFTVJFU0FUVFJTX1NFUlZJQ0VfTkFNRV0gPSBzZXJ2aWNlTmFtZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlKGF0dHJpYnV0ZXMpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhdHRyaWJ1dGUgbWFwIGZyb20gdGhlIE9URUxfUkVTT1VSQ0VfQVRUUklCVVRFUyBlbnZpcm9ubWVudFxuICAgICAqIHZhcmlhYmxlLlxuICAgICAqXG4gICAgICogT1RFTF9SRVNPVVJDRV9BVFRSSUJVVEVTOiBBIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGF0dHJpYnV0ZXMgZGVzY3JpYmluZ1xuICAgICAqIHRoZSBzb3VyY2UgaW4gbW9yZSBkZXRhaWwsIGUuZy4g4oCca2V5MT12YWwxLGtleTI9dmFsMuKAnS4gRG9tYWluIG5hbWVzIGFuZFxuICAgICAqIHBhdGhzIGFyZSBhY2NlcHRlZCBhcyBhdHRyaWJ1dGUga2V5cy4gVmFsdWVzIG1heSBiZSBxdW90ZWQgb3IgdW5xdW90ZWQgaW5cbiAgICAgKiBnZW5lcmFsLiBJZiBhIHZhbHVlIGNvbnRhaW5zIHdoaXRlc3BhY2UsID0sIG9yIFwiIGNoYXJhY3RlcnMsIGl0IG11c3RcbiAgICAgKiBhbHdheXMgYmUgcXVvdGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJhd0VudkF0dHJpYnV0ZXMgVGhlIHJlc291cmNlIGF0dHJpYnV0ZXMgYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdFxuICAgICAqIG9mIGtleS92YWx1ZSBwYWlycy5cbiAgICAgKiBAcmV0dXJucyBUaGUgc2FuaXRpemVkIHJlc291cmNlIGF0dHJpYnV0ZXMuXG4gICAgICovXG4gICAgRW52RGV0ZWN0b3JTeW5jLnByb3RvdHlwZS5fcGFyc2VSZXNvdXJjZUF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAocmF3RW52QXR0cmlidXRlcykge1xuICAgICAgICB2YXIgZV8xLCBfYTtcbiAgICAgICAgaWYgKCFyYXdFbnZBdHRyaWJ1dGVzKVxuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB2YXIgYXR0cmlidXRlcyA9IHt9O1xuICAgICAgICB2YXIgcmF3QXR0cmlidXRlcyA9IHJhd0VudkF0dHJpYnV0ZXMuc3BsaXQodGhpcy5fQ09NTUFfU0VQQVJBVE9SLCAtMSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKHZhciByYXdBdHRyaWJ1dGVzXzEgPSBfX3ZhbHVlcyhyYXdBdHRyaWJ1dGVzKSwgcmF3QXR0cmlidXRlc18xXzEgPSByYXdBdHRyaWJ1dGVzXzEubmV4dCgpOyAhcmF3QXR0cmlidXRlc18xXzEuZG9uZTsgcmF3QXR0cmlidXRlc18xXzEgPSByYXdBdHRyaWJ1dGVzXzEubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJhd0F0dHJpYnV0ZSA9IHJhd0F0dHJpYnV0ZXNfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgIHZhciBrZXlWYWx1ZVBhaXIgPSByYXdBdHRyaWJ1dGUuc3BsaXQodGhpcy5fTEFCRUxfS0VZX1ZBTFVFX1NQTElUVEVSLCAtMSk7XG4gICAgICAgICAgICAgICAgaWYgKGtleVZhbHVlUGFpci5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBfYiA9IF9fcmVhZChrZXlWYWx1ZVBhaXIsIDIpLCBrZXkgPSBfYlswXSwgdmFsdWUgPSBfYlsxXTtcbiAgICAgICAgICAgICAgICAvLyBMZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlcyBhcmUgdHJpbW1lZC5cbiAgICAgICAgICAgICAgICBrZXkgPSBrZXkudHJpbSgpO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudHJpbSgpLnNwbGl0KC9eXCJ8XCIkLykuam9pbignJyk7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9pc1ZhbGlkQW5kTm90RW1wdHkoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBdHRyaWJ1dGUga2V5IFwiICsgdGhpcy5fRVJST1JfTUVTU0FHRV9JTlZBTElEX0NIQVJTKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9pc1ZhbGlkKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBdHRyaWJ1dGUgdmFsdWUgXCIgKyB0aGlzLl9FUlJPUl9NRVNTQUdFX0lOVkFMSURfVkFMVUUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzW2tleV0gPSBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlXzFfMSkgeyBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OyB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAocmF3QXR0cmlidXRlc18xXzEgJiYgIXJhd0F0dHJpYnV0ZXNfMV8xLmRvbmUgJiYgKF9hID0gcmF3QXR0cmlidXRlc18xLnJldHVybikpIF9hLmNhbGwocmF3QXR0cmlidXRlc18xKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXR0cmlidXRlcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4gU3RyaW5nIGlzIGEgdmFsaWQgcHJpbnRhYmxlIEFTQ0lJIHN0cmluZyB3aXRoXG4gICAgICogYSBsZW5ndGggbm90IGV4Y2VlZCBfTUFYX0xFTkdUSCBjaGFyYWN0ZXJzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHN0ciBUaGUgU3RyaW5nIHRvIGJlIHZhbGlkYXRlZC5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBTdHJpbmcgaXMgdmFsaWQuXG4gICAgICovXG4gICAgRW52RGV0ZWN0b3JTeW5jLnByb3RvdHlwZS5faXNWYWxpZCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHJldHVybiBuYW1lLmxlbmd0aCA8PSB0aGlzLl9NQVhfTEVOR1RIICYmIHRoaXMuX2lzQmFnZ2FnZU9jdGV0U3RyaW5nKG5hbWUpO1xuICAgIH07XG4gICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2JhZ2dhZ2UvI2RlZmluaXRpb25cbiAgICBFbnZEZXRlY3RvclN5bmMucHJvdG90eXBlLl9pc0JhZ2dhZ2VPY3RldFN0cmluZyA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjaCA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgaWYgKGNoIDwgMHgyMSB8fCBjaCA9PT0gMHgyYyB8fCBjaCA9PT0gMHgzYiB8fCBjaCA9PT0gMHg1YyB8fCBjaCA+IDB4N2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdpdmVuIFN0cmluZyBpcyBhIHZhbGlkIHByaW50YWJsZSBBU0NJSSBzdHJpbmcgd2l0aFxuICAgICAqIGEgbGVuZ3RoIGdyZWF0ZXIgdGhhbiAwIGFuZCBub3QgZXhjZWVkIF9NQVhfTEVOR1RIIGNoYXJhY3RlcnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3RyIFRoZSBTdHJpbmcgdG8gYmUgdmFsaWRhdGVkLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIFN0cmluZyBpcyB2YWxpZCBhbmQgbm90IGVtcHR5LlxuICAgICAqL1xuICAgIEVudkRldGVjdG9yU3luYy5wcm90b3R5cGUuX2lzVmFsaWRBbmROb3RFbXB0eSA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgICAgcmV0dXJuIHN0ci5sZW5ndGggPiAwICYmIHRoaXMuX2lzVmFsaWQoc3RyKTtcbiAgICB9O1xuICAgIHJldHVybiBFbnZEZXRlY3RvclN5bmM7XG59KCkpO1xudmFyIGVudkRldGVjdG9yU3luYyA9IG5ldyBFbnZEZXRlY3RvclN5bmMoKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogRW52RGV0ZWN0b3IgY2FuIGJlIHVzZWQgdG8gZGV0ZWN0IHRoZSBwcmVzZW5jZSBvZiBhbmQgY3JlYXRlIGEgUmVzb3VyY2VcbiAqIGZyb20gdGhlIE9URUxfUkVTT1VSQ0VfQVRUUklCVVRFUyBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAqL1xudmFyIEVudkRldGVjdG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEVudkRldGVjdG9yKCkge1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFJlc291cmNlfSBwb3B1bGF0ZWQgd2l0aCBhdHRyaWJ1dGVzIGZyb20gdGhlXG4gICAgICogT1RFTF9SRVNPVVJDRV9BVFRSSUJVVEVTIGVudmlyb25tZW50IHZhcmlhYmxlLiBOb3RlIHRoaXMgaXMgYW4gYXN5bmNcbiAgICAgKiBmdW5jdGlvbiB0byBjb25mb3JtIHRvIHRoZSBEZXRlY3RvciBpbnRlcmZhY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29uZmlnIFRoZSByZXNvdXJjZSBkZXRlY3Rpb24gY29uZmlnXG4gICAgICovXG4gICAgRW52RGV0ZWN0b3IucHJvdG90eXBlLmRldGVjdCA9IGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShlbnZEZXRlY3RvclN5bmMuZGV0ZWN0KGNvbmZpZykpO1xuICAgIH07XG4gICAgcmV0dXJuIEVudkRldGVjdG9yO1xufSgpKTtcbnZhciBlbnZEZXRlY3RvciA9IG5ldyBFbnZEZXRlY3RvcigpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIGlzUHJvbWlzZUxpa2UgPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgcmV0dXJuICh2YWwgIT09IG51bGwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbC50aGVuID09PSAnZnVuY3Rpb24nKTtcbn07XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgX19hd2FpdGVyID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG52YXIgX19nZW5lcmF0b3IgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX2dlbmVyYXRvcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGJvZHkpIHtcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICAgIH1cbn07XG4vKipcbiAqIFJ1bnMgYWxsIHJlc291cmNlIGRldGVjdG9ycyBhbmQgcmV0dXJucyB0aGUgcmVzdWx0cyBtZXJnZWQgaW50byBhIHNpbmdsZSBSZXNvdXJjZS4gUHJvbWlzZVxuICogZG9lcyBub3QgcmVzb2x2ZSB1bnRpbCBhbGwgdGhlIHVuZGVybHlpbmcgZGV0ZWN0b3JzIGhhdmUgcmVzb2x2ZWQsIHVubGlrZVxuICogZGV0ZWN0UmVzb3VyY2VzU3luYy5cbiAqXG4gKiBAZGVwcmVjYXRlZCB1c2UgZGV0ZWN0UmVzb3VyY2VzU3luYygpIGluc3RlYWQuXG4gKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYXRpb24gZm9yIHJlc291cmNlIGRldGVjdGlvblxuICovXG52YXIgZGV0ZWN0UmVzb3VyY2VzID0gZnVuY3Rpb24gKGNvbmZpZykge1xuICAgIGlmIChjb25maWcgPT09IHZvaWQgMCkgeyBjb25maWcgPSB7fTsgfVxuICAgIHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcmVzb3VyY2VzO1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCBQcm9taXNlLmFsbCgoY29uZmlnLmRldGVjdG9ycyB8fCBbXSkubWFwKGZ1bmN0aW9uIChkKSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc291cmNlLCBlXzE7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzAsIDIsICwgM10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgZC5kZXRlY3QoY29uZmlnKV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhZy5kZWJ1ZyhkLmNvbnN0cnVjdG9yLm5hbWUgKyBcIiBmb3VuZCByZXNvdXJjZS5cIiwgcmVzb3VyY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlc291cmNlXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZV8xID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhZy5kZWJ1ZyhkLmNvbnN0cnVjdG9yLm5hbWUgKyBcIiBmYWlsZWQ6IFwiICsgZV8xLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFJlc291cmNlLmVtcHR5KCldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBbMiAvKnJldHVybiovXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7IH0pKV07XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZ1dHVyZSBjaGVjayBpZiB2ZXJib3NlIGxvZ2dpbmcgaXMgZW5hYmxlZCBpc3N1ZSAjMTkwM1xuICAgICAgICAgICAgICAgICAgICBsb2dSZXNvdXJjZXMocmVzb3VyY2VzKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlc291cmNlcy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcmVzb3VyY2UpIHsgcmV0dXJuIGFjYy5tZXJnZShyZXNvdXJjZSk7IH0sIFJlc291cmNlLmVtcHR5KCkpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG59O1xuLyoqXG4gKiBSdW5zIGFsbCByZXNvdXJjZSBkZXRlY3RvcnMgc3luY2hyb25vdXNseSwgbWVyZ2luZyB0aGVpciByZXN1bHRzLiBJbiBjYXNlIG9mIGF0dHJpYnV0ZSBjb2xsaXNpb24gbGF0ZXIgcmVzb3VyY2VzIHdpbGwgdGFrZSBwcmVjZWRlbmNlLlxuICpcbiAqIEBwYXJhbSBjb25maWcgQ29uZmlndXJhdGlvbiBmb3IgcmVzb3VyY2UgZGV0ZWN0aW9uXG4gKi9cbnZhciBkZXRlY3RSZXNvdXJjZXNTeW5jID0gZnVuY3Rpb24gKGNvbmZpZykge1xuICAgIHZhciBfYTtcbiAgICBpZiAoY29uZmlnID09PSB2b2lkIDApIHsgY29uZmlnID0ge307IH1cbiAgICB2YXIgcmVzb3VyY2VzID0gKChfYSA9IGNvbmZpZy5kZXRlY3RvcnMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdKS5tYXAoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciByZXNvdXJjZU9yUHJvbWlzZV8xID0gZC5kZXRlY3QoY29uZmlnKTtcbiAgICAgICAgICAgIHZhciByZXNvdXJjZV8xO1xuICAgICAgICAgICAgaWYgKGlzUHJvbWlzZUxpa2UocmVzb3VyY2VPclByb21pc2VfMSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgY3JlYXRlUHJvbWlzZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZFJlc291cmNlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIHJlc291cmNlT3JQcm9taXNlXzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRSZXNvdXJjZSA9IF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgKChfYSA9IHJlc29sdmVkUmVzb3VyY2Uud2FpdEZvckFzeW5jQXR0cmlidXRlcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwocmVzb2x2ZWRSZXNvdXJjZSkpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJlc29sdmVkUmVzb3VyY2UuYXR0cmlidXRlc107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pOyB9O1xuICAgICAgICAgICAgICAgIHJlc291cmNlXzEgPSBuZXcgUmVzb3VyY2Uoe30sIGNyZWF0ZVByb21pc2UoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNvdXJjZV8xID0gcmVzb3VyY2VPclByb21pc2VfMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXNvdXJjZV8xLndhaXRGb3JBc3luY0F0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgICAgICB2b2lkIHJlc291cmNlXzFcbiAgICAgICAgICAgICAgICAgICAgLndhaXRGb3JBc3luY0F0dHJpYnV0ZXMoKVxuICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkaWFnLmRlYnVnKGQuY29uc3RydWN0b3IubmFtZSArIFwiIGZvdW5kIHJlc291cmNlLlwiLCByZXNvdXJjZV8xKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRpYWcuZGVidWcoZC5jb25zdHJ1Y3Rvci5uYW1lICsgXCIgZm91bmQgcmVzb3VyY2UuXCIsIHJlc291cmNlXzEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlXzE7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGRpYWcuZXJyb3IoZC5jb25zdHJ1Y3Rvci5uYW1lICsgXCIgZmFpbGVkOiBcIiArIGUubWVzc2FnZSk7XG4gICAgICAgICAgICByZXR1cm4gUmVzb3VyY2UuZW1wdHkoKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHZhciBtZXJnZWRSZXNvdXJjZXMgPSByZXNvdXJjZXMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHJlc291cmNlKSB7IHJldHVybiBhY2MubWVyZ2UocmVzb3VyY2UpOyB9LCBSZXNvdXJjZS5lbXB0eSgpKTtcbiAgICBpZiAobWVyZ2VkUmVzb3VyY2VzLndhaXRGb3JBc3luY0F0dHJpYnV0ZXMpIHtcbiAgICAgICAgdm9pZCBtZXJnZWRSZXNvdXJjZXMud2FpdEZvckFzeW5jQXR0cmlidXRlcygpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gRnV0dXJlIGNoZWNrIGlmIHZlcmJvc2UgbG9nZ2luZyBpcyBlbmFibGVkIGlzc3VlICMxOTAzXG4gICAgICAgICAgICBsb2dSZXNvdXJjZXMocmVzb3VyY2VzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBtZXJnZWRSZXNvdXJjZXM7XG59O1xuLyoqXG4gKiBXcml0ZXMgZGVidWcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRldGVjdGVkIHJlc291cmNlcyB0byB0aGUgbG9nZ2VyIGRlZmluZWQgaW4gdGhlIHJlc291cmNlIGRldGVjdGlvbiBjb25maWcsIGlmIG9uZSBpcyBwcm92aWRlZC5cbiAqXG4gKiBAcGFyYW0gcmVzb3VyY2VzIFRoZSBhcnJheSBvZiB7QGxpbmsgUmVzb3VyY2V9IHRoYXQgc2hvdWxkIGJlIGxvZ2dlZC4gRW1wdHkgZW50cmllcyB3aWxsIGJlIGlnbm9yZWQuXG4gKi9cbnZhciBsb2dSZXNvdXJjZXMgPSBmdW5jdGlvbiAocmVzb3VyY2VzKSB7XG4gICAgcmVzb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHJlc291cmNlKSB7XG4gICAgICAgIC8vIFByaW50IG9ubHkgcG9wdWxhdGVkIHJlc291cmNlc1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMocmVzb3VyY2UuYXR0cmlidXRlcykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdmFyIHJlc291cmNlRGVidWdTdHJpbmcgPSBKU09OLnN0cmluZ2lmeShyZXNvdXJjZS5hdHRyaWJ1dGVzLCBudWxsLCA0KTtcbiAgICAgICAgICAgIGRpYWcudmVyYm9zZShyZXNvdXJjZURlYnVnU3RyaW5nKTtcbiAgICAgICAgfVxuICAgIH0pO1xufTtcblxuZXhwb3J0IHsgUmVzb3VyY2UsIGJyb3dzZXJEZXRlY3RvciwgYnJvd3NlckRldGVjdG9yU3luYywgZGV0ZWN0UmVzb3VyY2VzLCBkZXRlY3RSZXNvdXJjZXNTeW5jLCBlbnZEZXRlY3RvciwgZW52RGV0ZWN0b3JTeW5jLCBob3N0RGV0ZWN0b3IsIGhvc3REZXRlY3RvclN5bmMsIG9zRGV0ZWN0b3IsIG9zRGV0ZWN0b3JTeW5jLCBwcm9jZXNzRGV0ZWN0b3IsIHByb2Nlc3NEZXRlY3RvclN5bmMsIHNlcnZpY2VJbnN0YW5jZUlkRGV0ZWN0b3JTeW5jIH07Il0sCiAgIm1hcHBpbmdzIjogIkFBQUEsU0FBUyxLQUFLQSxTQUFnQjtBQUM5QixTQUFjLEtBQUxDLFVBQStCO0FBQ3hDLFNBQVMsS0FBS0MsU0FBWTtBQUMxQixTQUFTLEtBQUtDLEdBQWtDLEtBQUtDLEdBQXlDLEtBQUtDLEdBQXFDLEtBQUtDLEdBQVEsS0FBS0MsU0FBZ0M7QUFpQjFMLElBQUlDO0FBQUE7QUFBQSxFQUFrQyxXQUFZO0FBQzlDLGFBQVNBLElBQW1CO0FBQUEsSUFDNUI7QUFDQSxXQUFBQSxFQUFpQixVQUFVLFNBQVMsV0FBWTtBQUM1QyxhQUFPLElBQUlSLEVBQVMsQ0FBQyxDQUFDO0FBQUEsSUFDMUIsR0FDT1E7QUFBQSxFQUNYLEVBQUU7QUFBQSxHQUNFQyxJQUFtQixJQUFJRCxFQUFpQixHQWlCeENFO0FBQUE7QUFBQSxFQUE4QixXQUFZO0FBQzFDLGFBQVNBLElBQWU7QUFBQSxJQUN4QjtBQUNBLFdBQUFBLEVBQWEsVUFBVSxTQUFTLFdBQVk7QUFDeEMsYUFBTyxRQUFRLFFBQVFELEVBQWlCLE9BQU8sQ0FBQztBQUFBLElBQ3BELEdBQ09DO0FBQUEsRUFDWCxFQUFFO0FBQUEsR0FD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RyxFQUFTLENBQUMsR0FBR2lHLEVBQWMsQ0FBQztBQUFBLE1BQ2pEO0FBRUksUUFBQUQsSUFBYUQ7QUFFakIsYUFBSUMsRUFBVyx5QkFDTkEsRUFDQSx1QkFBdUIsRUFDdkIsS0FBSyxXQUFZO0FBQ2xCLGVBQU85RixFQUFLLE1BQU1ELEVBQUUsWUFBWSxPQUFPLG9CQUFvQitGLENBQVU7QUFBQSxNQUN6RSxDQUFDLElBR0Q5RixFQUFLLE1BQU1ELEVBQUUsWUFBWSxPQUFPLG9CQUFvQitGLENBQVUsR0FFM0RBO0FBQUEsSUFDWCxTQUNPckQsR0FBRztBQUNOLGFBQUF6QyxFQUFLLE1BQU1ELEVBQUUsWUFBWSxPQUFPLGNBQWMwQyxFQUFFLE9BQU8sR0FDaEQzQyxFQUFTLE1BQU07QUFBQSxJQUMxQjtBQUFBLEVBQ0osQ0FBQyxHQUNHbUcsSUFBa0JULEVBQVUsT0FBTyxTQUFVRyxHQUFLRixHQUFVO0FBQUUsV0FBT0UsRUFBSSxNQUFNRixDQUFRO0FBQUEsRUFBRyxHQUFHM0YsRUFBUyxNQUFNLENBQUM7QUFDakgsU0FBSW1HLEVBQWdCLDBCQUNYQSxFQUFnQix1QkFBdUIsRUFBRSxLQUFLLFdBQVk7QUFFM0QsSUFBQVAsRUFBYUYsQ0FBUztBQUFBLEVBQzFCLENBQUMsR0FFRVM7QUFDWCxHQU1JUCxJQUFlLFNBQVVGLEdBQVc7QUFDcEMsRUFBQUEsRUFBVSxRQUFRLFNBQVVDLEdBQVU7QUFFbEMsUUFBSSxPQUFPLEtBQUtBLEVBQVMsVUFBVSxFQUFFLFNBQVMsR0FBRztBQUM3QyxVQUFJUyxJQUFzQixLQUFLLFVBQVVULEVBQVMsWUFBWSxNQUFNLENBQUM7QUFDckUsTUFBQXpGLEVBQUssUUFBUWtHLENBQW1CO0FBQUEsSUFDcEM7QUFBQSxFQUNKLENBQUM7QUFDTDsiLAogICJuYW1lcyI6IFsiUmVzb3VyY2UiLCAiZCIsICJkaWFnIiwgIlNFTVJFU0FUVFJTX1BST0NFU1NfUlVOVElNRV9OQU1FIiwgIlNFTVJFU0FUVFJTX1BST0NFU1NfUlVOVElNRV9ERVNDUklQVElPTiIsICJTRU1SRVNBVFRSU19QUk9DRVNTX1JVTlRJTUVfVkVSU0lPTiIsICJnZXRFbnYiLCAiU0VNUkVTQVRUUlNfU0VSVklDRV9OQU1FIiwgIk5vb3BEZXRlY3RvclN5bmMiLCAibm9vcERldGVjdG9yU3luYyIsICJOb29wRGV0ZWN0b3IiLCAibm9vcERldGVjdG9yIiwgImhvc3REZXRlY3RvciIsICJob3N0RGV0ZWN0b3JTeW5jIiwgIm9zRGV0ZWN0b3IiLCAib3NEZXRlY3RvclN5bmMiLCAicHJvY2Vzc0RldGVjdG9yIiwgInByb2Nlc3NEZXRlY3RvclN5bmMiLCAic2VydmljZUluc3RhbmNlSWREZXRlY3RvclN5bmMiLCAiX19hc3NpZ24iLCAidCIsICJzIiwgImkiLCAibiIsICJwIiwgIkJyb3dzZXJEZXRlY3RvclN5bmMiLCAiY29uZmlnIiwgIl9hIiwgIl9iIiwgIl9jIiwgIl9kIiwgImlzQnJvd3NlciIsICJicm93c2VyUmVzb3VyY2UiLCAiX2NvbmZpZyIsICJicm93c2VyRGV0ZWN0b3JTeW5jIiwgIkJyb3dzZXJEZXRlY3RvciIsICJicm93c2VyRGV0ZWN0b3IiLCAiX192YWx1ZXMiLCAibyIsICJtIiwgIl9fcmVhZCIsICJyIiwgImFyIiwgImUiLCAiZXJyb3IiLCAiRW52RGV0ZWN0b3JTeW5jIiwgImF0dHJpYnV0ZXMiLCAiZW52IiwgInJhd0F0dHJpYnV0ZXMiLCAic2VydmljZU5hbWUiLCAicGFyc2VkQXR0cmlidXRlcyIsICJyYXdFbnZBdHRyaWJ1dGVzIiwgImVfMSIsICJyYXdBdHRyaWJ1dGVzXzEiLCAicmF3QXR0cmlidXRlc18xXzEiLCAicmF3QXR0cmlidXRlIiwgImtleVZhbHVlUGFpciIsICJrZXkiLCAidmFsdWUiLCAiZV8xXzEiLCAibmFtZSIsICJzdHIiLCAiY2giLCAiZW52RGV0ZWN0b3JTeW5jIiwgIkVudkRldGVjdG9yIiwgImVudkRldGVjdG9yIiwgImlzUHJvbWlzZUxpa2UiLCAidmFsIiwgIl9fYXdhaXRlciIsICJ0aGlzQXJnIiwgIl9hcmd1bWVudHMiLCAiUCIsICJnZW5lcmF0b3IiLCAiYWRvcHQiLCAicmVzb2x2ZSIsICJyZWplY3QiLCAiZnVsZmlsbGVkIiwgInN0ZXAiLCAicmVqZWN0ZWQiLCAicmVzdWx0IiwgIl9fZ2VuZXJhdG9yIiwgImJvZHkiLCAiXyIsICJmIiwgInkiLCAiZyIsICJ2ZXJiIiwgInYiLCAib3AiLCAiZGV0ZWN0UmVzb3VyY2VzIiwgInJlc291cmNlcyIsICJyZXNvdXJjZSIsICJsb2dSZXNvdXJjZXMiLCAiYWNjIiwgImRldGVjdFJlc291cmNlc1N5bmMiLCAicmVzb3VyY2VPclByb21pc2VfMSIsICJyZXNvdXJjZV8xIiwgImNyZWF0ZVByb21pc2UiLCAicmVzb2x2ZWRSZXNvdXJjZSIsICJtZXJnZWRSZXNvdXJjZXMiLCAicmVzb3VyY2VEZWJ1Z1N0cmluZyJdCn0K