@myop/sdk 0.1.45 → 0.1.47

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 (42) hide show
  1. package/README.md +1 -1
  2. package/dist/bundled-declarations.d.ts +70 -1
  3. package/dist/cjs/_IframeSDK.7d51275f.min.js +1 -0
  4. package/dist/cjs/{_IframeSDK.6e68e329.js → _IframeSDK.cc82a827.js} +34 -6
  5. package/dist/cjs/_IframeSDK.cc82a827.js.map +7 -0
  6. package/dist/cjs/_MyopHelpers.a07c6289.js +2810 -0
  7. package/dist/cjs/_MyopHelpers.a07c6289.js.map +7 -0
  8. package/dist/cjs/_MyopHelpers.ac3e8038.min.js +1 -0
  9. package/dist/cjs/{_WebComponentSDK.1f50ec03.js → _WebComponentSDK.64c6a9c1.js} +34 -6
  10. package/dist/cjs/_WebComponentSDK.64c6a9c1.js.map +7 -0
  11. package/dist/cjs/_WebComponentSDK.6c4296d5.min.js +1 -0
  12. package/dist/cjs/{_hostSDK.3215ab07.js → _hostSDK.788bdb7f.js} +34 -6
  13. package/dist/cjs/_hostSDK.788bdb7f.js.map +7 -0
  14. package/dist/cjs/_hostSDK.e5552529.min.js +1 -0
  15. package/dist/cjs/myop_sdk.js +14 -14
  16. package/dist/cjs/myop_sdk.js.map +1 -1
  17. package/dist/cjs/myop_sdk.min.js +1 -1
  18. package/dist/module/Iframe/index.js +47 -19
  19. package/dist/module/Iframe/index.js.map +3 -3
  20. package/dist/module/SDK.js +136 -21
  21. package/dist/module/SDK.js.map +3 -3
  22. package/dist/module/common/index.d.ts +55 -1
  23. package/dist/module/common/index.js +3 -2
  24. package/dist/module/common/index.js.map +2 -2
  25. package/dist/module/helpers/EnableV2.d.ts +12 -0
  26. package/dist/module/helpers/index.d.ts +1 -0
  27. package/dist/module/helpers/index.js +2520 -4
  28. package/dist/module/helpers/index.js.map +4 -4
  29. package/dist/module/host/index.js +47 -19
  30. package/dist/module/host/index.js.map +3 -3
  31. package/dist/module/webcomponent/index.js +47 -19
  32. package/dist/module/webcomponent/index.js.map +3 -3
  33. package/package.json +1 -1
  34. package/dist/cjs/_IframeSDK.1993fad2.min.js +0 -1
  35. package/dist/cjs/_IframeSDK.6e68e329.js.map +0 -7
  36. package/dist/cjs/_MyopHelpers.98cae3f9.js +0 -417
  37. package/dist/cjs/_MyopHelpers.98cae3f9.js.map +0 -7
  38. package/dist/cjs/_MyopHelpers.f3e207e0.min.js +0 -1
  39. package/dist/cjs/_WebComponentSDK.1f50ec03.js.map +0 -7
  40. package/dist/cjs/_WebComponentSDK.c0dcea75.min.js +0 -1
  41. package/dist/cjs/_hostSDK.3215ab07.js.map +0 -7
  42. package/dist/cjs/_hostSDK.f697667b.min.js +0 -1
@@ -17,6 +17,10 @@ var __spreadValues = (a, b) => {
17
17
  return a;
18
18
  };
19
19
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ var __export = (target, all) => {
21
+ for (var name in all)
22
+ __defProp(target, name, { get: all[name], enumerable: true });
23
+ };
20
24
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
21
25
  var __async = (__this, __arguments, generator) => {
22
26
  return new Promise((resolve, reject) => {
@@ -46,8 +50,84 @@ var uuidv4 = () => {
46
50
  (c) => (+c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> +c / 4).toString(16)
47
51
  );
48
52
  };
53
+ var bytesToUuid = (bytes) => {
54
+ const hex = [...bytes].map((b) => b.toString(16).padStart(2, "0")).join("");
55
+ return [
56
+ hex.slice(0, 8),
57
+ hex.slice(8, 12),
58
+ hex.slice(12, 16),
59
+ hex.slice(16, 20),
60
+ hex.slice(20)
61
+ ].join("-");
62
+ };
63
+ var base64UrlDecode = (str) => {
64
+ let base64 = str.replace(/-/g, "+").replace(/_/g, "/");
65
+ while (base64.length % 4) base64 += "=";
66
+ const binary = atob(base64);
67
+ return Uint8Array.from(binary, (char) => char.charCodeAt(0));
68
+ };
69
+ var decompressUUIDs = (encoded) => {
70
+ const bytes = base64UrlDecode(encoded);
71
+ if (bytes.length % 16 !== 0) throw new Error("Invalid input length");
72
+ const uuids = [];
73
+ for (let i = 0; i < bytes.length; i += 16) {
74
+ uuids.push(bytesToUuid(bytes.slice(i, i + 16)));
75
+ }
76
+ return uuids;
77
+ };
78
+
79
+ // src/utils/utils.ts
80
+ var wait = (ms) => {
81
+ return new Promise((resolve) => setTimeout(resolve, ms));
82
+ };
83
+
84
+ // src/messages/index.ts
85
+ var messages_exports = {};
86
+ __export(messages_exports, {
87
+ AddEventListenerMessage: () => AddEventListenerMessage,
88
+ BaseMyopMessage: () => BaseMyopMessage,
89
+ BindClickMessage: () => BindClickMessage,
90
+ ChangeTextMessage: () => ChangeTextMessage,
91
+ CleanupMessage: () => CleanupMessage,
92
+ CleanupReplayMessage: () => CleanupReplayMessage,
93
+ ClickReplayMessage: () => ClickReplayMessage,
94
+ CreateRefComponentMessage: () => CreateRefComponentMessage,
95
+ CustomRefMessage: () => CustomRefMessage,
96
+ DetectMyopRefsMessage: () => DetectMyopRefsMessage,
97
+ DetectedMyopRefsMessage: () => DetectedMyopRefsMessage,
98
+ DisposeMessage: () => DisposeMessage,
99
+ ElementValueReplayMessage: () => ElementValueReplayMessage,
100
+ EnvelopedMessage: () => EnvelopedMessage,
101
+ EventListenerCallbackMessage: () => EventListenerCallbackMessage,
102
+ ExecuteComponentMethod: () => ExecuteComponentMethod,
103
+ ExecuteScriptMessage: () => ExecuteScriptMessage,
104
+ ExecuteScriptReplyMessage: () => ExecuteScriptReplyMessage,
105
+ GetAttributeMessage: () => GetAttributeMessage,
106
+ GetAttributeReplayMessage: () => GetAttributeReplayMessage,
107
+ GetElementValueMessage: () => GetElementValueMessage,
108
+ InitMessage: () => InitMessage,
109
+ InitRequest: () => InitRequest,
110
+ InitResponse: () => InitResponse,
111
+ MessageDirection: () => MessageDirection,
112
+ MutationObserverMessage: () => MutationObserverMessage,
113
+ MyopBindMessage: () => MyopBindMessage,
114
+ MyopBindReplayMessage: () => MyopBindReplayMessage,
115
+ MyopElementMessage: () => MyopElementMessage,
116
+ Ref: () => Ref,
117
+ RefComponentCreatedMessage: () => RefComponentCreatedMessage,
118
+ ResizeObserverMessage: () => ResizeObserverMessage,
119
+ SetAttributeMessage: () => SetAttributeMessage,
120
+ SetInnerHtml: () => SetInnerHtml,
121
+ SetMutationObserverMessage: () => SetMutationObserverMessage,
122
+ SetResizeObserverMessage: () => SetResizeObserverMessage,
123
+ stripFunction: () => stripFunction
124
+ });
49
125
 
50
126
  // src/messages/BaseMessage.ts
127
+ var MessageDirection = class {
128
+ };
129
+ __publicField(MessageDirection, "down", "down");
130
+ __publicField(MessageDirection, "up", "up");
51
131
  var BaseMyopMessage = class {
52
132
  constructor() {
53
133
  __publicField(this, "id", uuidv4());
@@ -68,6 +148,18 @@ var BaseMyopMessage = class {
68
148
  return msg.messageType === this.messageType;
69
149
  }
70
150
  };
151
+ var MyopElementMessage = class extends BaseMyopMessage {
152
+ constructor(ref) {
153
+ super();
154
+ this.ref = ref;
155
+ }
156
+ };
157
+ var MyopBindReplayMessage = class extends BaseMyopMessage {
158
+ constructor(replayToHandler) {
159
+ super();
160
+ this.replayToHandler = replayToHandler;
161
+ }
162
+ };
71
163
  var MyopBindMessage = class extends BaseMyopMessage {
72
164
  constructor(handler) {
73
165
  super();
@@ -75,9 +167,65 @@ var MyopBindMessage = class extends BaseMyopMessage {
75
167
  __publicField(this, "handlerUniqueId", uuidv4());
76
168
  }
77
169
  };
170
+ var Ref = class _Ref {
171
+ constructor(refConfig, component) {
172
+ this.refConfig = refConfig;
173
+ this.component = component;
174
+ __publicField(this, "myop", true);
175
+ __publicField(this, "__nonProxied");
176
+ this.__nonProxied = __spreadProps(__spreadValues({}, this), {
177
+ component: null
178
+ // in order to be serializable
179
+ });
180
+ }
181
+ static create(selector, refConfig, component) {
182
+ let _refConfig = refConfig;
183
+ if (!_refConfig) {
184
+ _refConfig = {
185
+ id: "",
186
+ name: "",
187
+ description: "",
188
+ selectorType: "id-attribute",
189
+ selector,
190
+ behavior: {
191
+ type: "code"
192
+ }
193
+ };
194
+ }
195
+ return new _Ref(_refConfig, component);
196
+ }
197
+ };
198
+
199
+ // src/messages/BindClickMessage.ts
200
+ var ReplayMessageKey = "ClickReplayMessage";
201
+ var BindClickMessage = class extends MyopBindMessage {
202
+ constructor(ref, handler) {
203
+ super(handler);
204
+ this.ref = ref;
205
+ __publicField(this, "replyMessageKey", ReplayMessageKey);
206
+ __publicField(this, "messageType", "BindClickMessage");
207
+ __publicField(this, "cleanable", true);
208
+ }
209
+ };
210
+ var ClickReplayMessage = class extends MyopBindReplayMessage {
211
+ constructor() {
212
+ super(...arguments);
213
+ __publicField(this, "messageType", ReplayMessageKey);
214
+ }
215
+ };
216
+
217
+ // src/messages/ChangeTextMessage.ts
218
+ var ChangeTextMessage = class extends BaseMyopMessage {
219
+ constructor(ref, text) {
220
+ super();
221
+ this.ref = ref;
222
+ __publicField(this, "messageType", "ChangeTextMessage");
223
+ this.content = text;
224
+ }
225
+ };
78
226
 
79
227
  // src/messages/ExecuteScriptMessage.ts
80
- var ReplayMessageKey = "ExecuteScriptReplyMessage";
228
+ var ReplayMessageKey2 = "ExecuteScriptReplyMessage";
81
229
  var functionBodyRegex = /(?:function\s*\w*\s*\([^)]*\)\s*\{([\s\S]*?)\}|(\([^)]*\)\s*=>\s*\{([\s\S]*?)\}))\s*$/;
82
230
  var expressionBodyRegex = /\(\s*[^)]+\s*\)\s*=>\s*(.+)/;
83
231
  var stripFunction = (content) => {
@@ -95,7 +243,7 @@ var ExecuteScriptMessage = class extends MyopBindMessage {
95
243
  }, scriptInputs2) {
96
244
  super(handler);
97
245
  this.scriptInputs = scriptInputs2;
98
- __publicField(this, "replyMessageKey", ReplayMessageKey);
246
+ __publicField(this, "replyMessageKey", ReplayMessageKey2);
99
247
  __publicField(this, "messageType", "ExecuteScriptMessage");
100
248
  __publicField(this, "script", "");
101
249
  this.script = script.toString();
@@ -105,6 +253,14 @@ var ExecuteScriptMessage = class extends MyopBindMessage {
105
253
  };
106
254
  __publicField(ExecuteScriptMessage, "replierKey", "send");
107
255
  __publicField(ExecuteScriptMessage, "completeStreamKey", "completeStream");
256
+ var ExecuteScriptReplyMessage = class extends MyopBindReplayMessage {
257
+ constructor(replayToHandler, content) {
258
+ super(replayToHandler);
259
+ this.replayToHandler = replayToHandler;
260
+ this.content = content;
261
+ __publicField(this, "messageType", ReplayMessageKey2);
262
+ }
263
+ };
108
264
 
109
265
  // src/messages/CustomRefMessage.ts
110
266
  var CustomRefMessage = class extends ExecuteScriptMessage {
@@ -127,6 +283,238 @@ var CustomRefMessage = class extends ExecuteScriptMessage {
127
283
  }
128
284
  };
129
285
 
286
+ // src/messages/AddEventListenerMessage.ts
287
+ var ReplayMessageKey3 = "EventListenerCallbackMessage";
288
+ var AddEventListenerMessage = class extends MyopBindMessage {
289
+ // {} // empty
290
+ constructor(ref, type, handler) {
291
+ super(handler);
292
+ this.ref = ref;
293
+ this.type = type;
294
+ this.handler = handler;
295
+ __publicField(this, "replyMessageKey", ReplayMessageKey3);
296
+ __publicField(this, "messageType", "AddEventListenerMessage");
297
+ __publicField(this, "cleanable", true);
298
+ __publicField(this, "serializableSkeleton", false);
299
+ }
300
+ withSerializableSkeleton(serializableSkeleton) {
301
+ this.serializableSkeleton = serializableSkeleton;
302
+ return this;
303
+ }
304
+ };
305
+ var EventListenerCallbackMessage = class extends MyopBindReplayMessage {
306
+ constructor(replayToHandler, e) {
307
+ super(replayToHandler);
308
+ this.replayToHandler = replayToHandler;
309
+ this.e = e;
310
+ __publicField(this, "messageType", ReplayMessageKey3);
311
+ this.content = {
312
+ e
313
+ };
314
+ }
315
+ };
316
+
317
+ // src/messages/SetAttributeMessage.ts
318
+ var SetAttributeMessage = class extends BaseMyopMessage {
319
+ constructor(ref, name, value) {
320
+ super();
321
+ this.ref = ref;
322
+ this.name = name;
323
+ this.value = value;
324
+ __publicField(this, "messageType", "SetAttributeMessage");
325
+ }
326
+ };
327
+
328
+ // src/messages/GetElementValueMessage.ts
329
+ var ReplayMessageKey4 = "ElementValueReplayMessage";
330
+ var GetElementValueMessage = class extends MyopBindMessage {
331
+ constructor(ref, handler) {
332
+ super(handler);
333
+ this.ref = ref;
334
+ __publicField(this, "replyMessageKey", ReplayMessageKey4);
335
+ __publicField(this, "messageType", "GetElementValueMessage");
336
+ }
337
+ };
338
+ var ElementValueReplayMessage = class extends MyopBindReplayMessage {
339
+ constructor(content) {
340
+ super();
341
+ this.content = content;
342
+ __publicField(this, "messageType", ReplayMessageKey4);
343
+ }
344
+ };
345
+
346
+ // src/messages/SetInnerHtml.ts
347
+ var SetInnerHtml = class extends BaseMyopMessage {
348
+ constructor(ref, innerHtml) {
349
+ super();
350
+ this.ref = ref;
351
+ __publicField(this, "messageType", "SetInnerHtml");
352
+ this.content = innerHtml;
353
+ }
354
+ };
355
+
356
+ // src/messages/InitMessage.ts
357
+ var InitMessage = class extends BaseMyopMessage {
358
+ constructor(id) {
359
+ super();
360
+ __publicField(this, "messageType", "InitMessage");
361
+ this.content = { id };
362
+ }
363
+ isTypeof(msg) {
364
+ return msg.messageType === this.messageType;
365
+ }
366
+ };
367
+ var InitResponse = class extends InitMessage {
368
+ constructor() {
369
+ super(...arguments);
370
+ __publicField(this, "messageType", "InitResponse");
371
+ }
372
+ };
373
+ var InitRequest = class extends BaseMyopMessage {
374
+ constructor() {
375
+ super(...arguments);
376
+ __publicField(this, "messageType", "InitRequest");
377
+ }
378
+ };
379
+
380
+ // src/messages/CreateRefComponentMessage.ts
381
+ var ReplayMessageKey5 = "RefComponentCreatedMessage";
382
+ var CreateRefComponentMessage = class extends MyopBindMessage {
383
+ constructor(refConfig, nestedComponentConfig, options, handler) {
384
+ super(handler);
385
+ this.refConfig = refConfig;
386
+ this.nestedComponentConfig = nestedComponentConfig;
387
+ this.options = options;
388
+ __publicField(this, "replyMessageKey", ReplayMessageKey5);
389
+ __publicField(this, "messageType", "CreateRefComponentMessage");
390
+ }
391
+ };
392
+ var RefComponentCreatedMessage = class extends MyopBindReplayMessage {
393
+ constructor(replayToHandler, nestedRefs, failed) {
394
+ super(replayToHandler);
395
+ this.replayToHandler = replayToHandler;
396
+ this.nestedRefs = nestedRefs;
397
+ this.failed = failed;
398
+ __publicField(this, "messageType", ReplayMessageKey5);
399
+ }
400
+ };
401
+
402
+ // src/messages/EnvelopedMessage.ts
403
+ var EnvelopedMessage = class extends BaseMyopMessage {
404
+ constructor(destination, message) {
405
+ super();
406
+ this.destination = destination;
407
+ this.message = message;
408
+ __publicField(this, "messageType", "EnvelopedMessage");
409
+ const innerEnvelopedMessage = message;
410
+ this.route = [destination, ...innerEnvelopedMessage.route ? innerEnvelopedMessage.route : []];
411
+ }
412
+ };
413
+
414
+ // src/messages/DetectMyopRefsMessage.ts
415
+ var ReplayMessageKey6 = "DetectedMyopRefsMessage";
416
+ var DetectMyopRefsMessage = class extends MyopBindMessage {
417
+ constructor() {
418
+ super(...arguments);
419
+ __publicField(this, "messageType", "DetectMyopRefsMessage");
420
+ __publicField(this, "replyMessageKey", ReplayMessageKey6);
421
+ }
422
+ };
423
+ var DetectedMyopRefsMessage = class extends MyopBindReplayMessage {
424
+ constructor(replayToHandler, myopElementRefs) {
425
+ super(replayToHandler);
426
+ this.replayToHandler = replayToHandler;
427
+ __publicField(this, "messageType", ReplayMessageKey6);
428
+ this.content = myopElementRefs;
429
+ }
430
+ isTypeof(msg) {
431
+ return msg.messageType === this.messageType;
432
+ }
433
+ };
434
+
435
+ // src/messages/GetAttributeMessage.ts
436
+ var ReplayMessageKey7 = "GetAttributeReplayMessage";
437
+ var GetAttributeMessage = class extends MyopBindMessage {
438
+ constructor(ref, name, handler) {
439
+ super(handler);
440
+ this.ref = ref;
441
+ this.name = name;
442
+ __publicField(this, "replyMessageKey", ReplayMessageKey7);
443
+ __publicField(this, "messageType", "GetAttributeMessage");
444
+ }
445
+ };
446
+ var GetAttributeReplayMessage = class extends MyopBindReplayMessage {
447
+ constructor(content) {
448
+ super();
449
+ this.content = content;
450
+ __publicField(this, "messageType", ReplayMessageKey7);
451
+ }
452
+ };
453
+
454
+ // src/messages/componentMessages/ExecuteComponentMethod.ts
455
+ var ExecuteComponentMethod = class extends BaseMyopMessage {
456
+ constructor(method) {
457
+ super();
458
+ this.method = method;
459
+ __publicField(this, "messageType", "ExecuteComponentMethod");
460
+ }
461
+ };
462
+
463
+ // src/messages/componentMessages/SetMutationObserverMessage.ts
464
+ var SetMutationObserverMessage = class extends BaseMyopMessage {
465
+ constructor() {
466
+ super(...arguments);
467
+ __publicField(this, "messageType", "SetMutationObserverMessage");
468
+ }
469
+ };
470
+ var MutationObserverMessage = class extends BaseMyopMessage {
471
+ constructor() {
472
+ super(...arguments);
473
+ __publicField(this, "messageType", "MutationObserverMessage");
474
+ }
475
+ };
476
+
477
+ // src/messages/CleanupMessage.ts
478
+ var ReplayMessageKey8 = "CleanupReplayMessage";
479
+ var CleanupMessage = class extends MyopBindMessage {
480
+ constructor(cleanupForMessageId, handler) {
481
+ super(handler);
482
+ this.cleanupForMessageId = cleanupForMessageId;
483
+ __publicField(this, "replyMessageKey", ReplayMessageKey8);
484
+ __publicField(this, "messageType", "CleanupMessage");
485
+ }
486
+ };
487
+ var CleanupReplayMessage = class extends MyopBindReplayMessage {
488
+ constructor(customCleanup) {
489
+ super();
490
+ this.customCleanup = customCleanup;
491
+ __publicField(this, "messageType", ReplayMessageKey8);
492
+ }
493
+ };
494
+
495
+ // src/messages/DisposeMessage.ts
496
+ var DisposeMessage = class extends BaseMyopMessage {
497
+ constructor() {
498
+ super(...arguments);
499
+ __publicField(this, "messageType", "DisposeMessage");
500
+ }
501
+ };
502
+
503
+ // src/messages/componentMessages/SetResizeObserverMessage.ts
504
+ var SetResizeObserverMessage = class extends BaseMyopMessage {
505
+ constructor() {
506
+ super(...arguments);
507
+ __publicField(this, "cleanable", true);
508
+ __publicField(this, "messageType", "SetResizeObserverMessage");
509
+ }
510
+ };
511
+ var ResizeObserverMessage = class extends BaseMyopMessage {
512
+ constructor() {
513
+ super(...arguments);
514
+ __publicField(this, "messageType", "ResizeObserverMessage");
515
+ }
516
+ };
517
+
130
518
  // src/helpers/applyStylesheet.ts
131
519
  var applyStylesheet = (component, stylesheet, css) => {
132
520
  const tagId = `myop-css-${uuidv4()}`;
@@ -396,6 +784,2132 @@ var CloudRepository = _CloudRepository;
396
784
  var exec = (getter) => __async(void 0, null, function* () {
397
785
  return yield getter();
398
786
  });
787
+
788
+ // src/dynamicImport/defineDynamicImport.ts
789
+ var __federation__ = "__federation__";
790
+ var onLoadKey = "onLoad";
791
+ var defineDynamicImport = (globalName, module) => {
792
+ if (window[__federation__] && window[__federation__][globalName] && window[__federation__][globalName][onLoadKey]) {
793
+ window[__federation__][globalName][onLoadKey]({ [globalName]: module });
794
+ } else {
795
+ }
796
+ };
797
+
798
+ // src/common/MyopMessages.ts
799
+ var MyopMessages = {
800
+ //host to component
801
+ "InitRequest": "InitRequest",
802
+ "InitResponse": "InitResponse",
803
+ "InitMessage": "InitMessage",
804
+ "DisposeMessage": "DisposeMessage",
805
+ "ChangeTextMessage": "ChangeTextMessage",
806
+ "BindClickMessage": "BindClickMessage",
807
+ "DetectMyopRefsMessage": "DetectMyopRefsMessage",
808
+ "ExecuteScriptMessage": "ExecuteScriptMessage",
809
+ "AddEventListenerMessage": "AddEventListenerMessage",
810
+ "SetAttributeMessage": "SetAttributeMessage",
811
+ "CreateRefComponentMessage": "CreateRefComponentMessage",
812
+ "EnvelopedMessage": "EnvelopedMessage",
813
+ "GetElementValueMessage": "GetElementValueMessage",
814
+ "GetAttributeMessage": "GetAttributeMessage",
815
+ "SetInnerHtml": "SetInnerHtml",
816
+ //component messages
817
+ "ExecuteComponentMethod": "ExecuteComponentMethod",
818
+ "SetMutationObserverMessage": "SetMutationObserverMessage",
819
+ "SetResizeObserverMessage": "SetResizeObserverMessage",
820
+ "CleanupMessage": "CleanupMessage",
821
+ // external to host :
822
+ In: {
823
+ "DetectedMyopRefsMessage": "DetectedMyopRefsMessage",
824
+ "ClickReplayMessage": "ClickReplayMessage",
825
+ "ExecuteScriptReplyMessage": "ExecuteScriptReplyMessage",
826
+ "EventListenerCallbackMessage": "EventListenerCallbackMessage",
827
+ "ElementValueReplayMessage": "ElementValueReplayMessage",
828
+ "GetAttributeReplayMessage": "GetAttributeReplayMessage",
829
+ "RefComponentCreatedMessage": "RefComponentCreatedMessage",
830
+ "EnvelopedMessage": "EnvelopedMessage",
831
+ "MutationObserverMessage": "MutationObserverMessage",
832
+ "CleanupReplayMessage": "CleanupReplayMessage",
833
+ "ResizeObserverMessage": "ResizeObserverMessage"
834
+ }
835
+ };
836
+
837
+ // src/host/components/IMyopComponent.ts
838
+ var BaseMyopComponent = class {
839
+ constructor(componentDefinition, container, options) {
840
+ this.componentDefinition = componentDefinition;
841
+ this.container = container;
842
+ __publicField(this, "id", "");
843
+ __publicField(this, "messageHandlers", {});
844
+ __publicField(this, "element");
845
+ __publicField(this, "_markedForDisposed", false);
846
+ //TODO: use bindWhen with return true predicate ...
847
+ __publicField(this, "bind", (messageType, handler) => {
848
+ if (!this.messageHandlers[messageType]) {
849
+ this.messageHandlers[messageType] = [];
850
+ }
851
+ if (!this.messageHandlers[messageType].includes(handler)) {
852
+ this.messageHandlers[messageType].push(handler);
853
+ }
854
+ });
855
+ __publicField(this, "bindWhen", (messageType, predicate, handler) => {
856
+ if (!handler) {
857
+ throw new Error("can't use component.bindWhen without an handler");
858
+ }
859
+ if (!this.messageHandlers[messageType]) {
860
+ this.messageHandlers[messageType] = [];
861
+ }
862
+ const handlers = this.messageHandlers[messageType];
863
+ const predicateWrappedHandler = (e) => {
864
+ if (predicate(e)) {
865
+ handler(e);
866
+ return true;
867
+ }
868
+ return false;
869
+ };
870
+ handlers.push(predicateWrappedHandler);
871
+ return () => {
872
+ const index = handlers.indexOf(predicateWrappedHandler);
873
+ if (index > -1) {
874
+ handlers.splice(index, 1);
875
+ }
876
+ };
877
+ });
878
+ __publicField(this, "setInitiated", () => {
879
+ this.isInitiated = true;
880
+ if (this._whenInitiatedResolve)
881
+ this._whenInitiatedResolve();
882
+ });
883
+ __publicField(this, "isInitiated", false);
884
+ __publicField(this, "_whenInitiatedResolve");
885
+ __publicField(this, "_whenInitiatedReject");
886
+ __publicField(this, "_whenInitiated", new Promise((resolve, reject) => {
887
+ this._whenInitiatedResolve = resolve;
888
+ this._whenInitiatedReject = reject;
889
+ }));
890
+ __publicField(this, "initiated", () => {
891
+ return this._whenInitiated;
892
+ });
893
+ __publicField(this, "props", {});
894
+ __publicField(this, "refs", {});
895
+ this.id = (options == null ? void 0 : options.id) || HostSDK.Instance().assignId(componentDefinition);
896
+ const timeout = (options == null ? void 0 : options.timeout) ? options == null ? void 0 : options.timeout : 5 * 1e3;
897
+ setTimeout(() => {
898
+ if (!this.isInitiated && this._whenInitiatedReject && !this._markedForDisposed) {
899
+ this._whenInitiatedReject(`timeout_${timeout} ${this.id}`);
900
+ }
901
+ }, timeout);
902
+ this.initiated().then(() => {
903
+ if (window.myop.hostSDK.inspected) {
904
+ this.inspect();
905
+ }
906
+ });
907
+ }
908
+ get markedForDisposed() {
909
+ return this._markedForDisposed;
910
+ }
911
+ set markedForDisposed(value) {
912
+ if (this._markedForDisposed) {
913
+ throw new Error("InvalidOperationException: The component is already in the process of being disposed. Dispose operation cannot be performed again until the current disposal process is complete.");
914
+ }
915
+ this._markedForDisposed = value;
916
+ }
917
+ onMessageReceived(incomeMessage) {
918
+ if (incomeMessage.messageType === MyopMessages.ExecuteComponentMethod) {
919
+ const typedMessage = incomeMessage;
920
+ if (this[typedMessage.method]) {
921
+ this[typedMessage.method](typedMessage.content);
922
+ } else {
923
+ console.log(`method not found ${typedMessage.method} on component`, this);
924
+ }
925
+ return true;
926
+ }
927
+ const handlers = this.messageHandlers[incomeMessage.messageType];
928
+ if (handlers && handlers.length) {
929
+ let handled = false;
930
+ handlers.forEach((handler) => {
931
+ handled = handled || handler(incomeMessage);
932
+ });
933
+ return handled;
934
+ } else {
935
+ }
936
+ return false;
937
+ }
938
+ sendCleanupMessage(message) {
939
+ message.source = this.id;
940
+ message.destination = this.id;
941
+ message.direction = MessageDirection.down;
942
+ const cleanupHandler = this.bindWhen(message.replyMessageKey, (msg) => {
943
+ return msg.replayToHandler === message.handlerUniqueId;
944
+ }, (m) => {
945
+ message.handler(m);
946
+ cleanupHandler();
947
+ });
948
+ const handler = message.handler;
949
+ delete message.handler;
950
+ this.send(message);
951
+ message.handler = handler;
952
+ }
953
+ send(message) {
954
+ if (!message.source)
955
+ message.source = this.id;
956
+ if (!message.destination)
957
+ message.destination = this.id;
958
+ message.direction = MessageDirection.down;
959
+ let cleanupHandler;
960
+ if (message.handler) {
961
+ const typedMessage = message;
962
+ cleanupHandler = this.bindWhen(typedMessage.replyMessageKey, (msg) => {
963
+ return msg.replayToHandler === typedMessage.handlerUniqueId;
964
+ }, typedMessage.handler);
965
+ delete message.handler;
966
+ }
967
+ if (message.ref) {
968
+ message.ref = message.ref.__nonProxied || message.ref;
969
+ }
970
+ if (message.cleanable) {
971
+ return () => {
972
+ this.sendCleanupMessage(new CleanupMessage(message.id, (replay) => {
973
+ }));
974
+ if (cleanupHandler) {
975
+ cleanupHandler();
976
+ }
977
+ };
978
+ } else {
979
+ return () => {
980
+ };
981
+ }
982
+ }
983
+ dispose() {
984
+ this.markedForDisposed = true;
985
+ if (!this.isInitiated) {
986
+ return;
987
+ }
988
+ console.log("disposing component", this.id);
989
+ this.send(new DisposeMessage());
990
+ const onDisposeHandlers = this.messageHandlers["onDispose"];
991
+ if (onDisposeHandlers) {
992
+ onDisposeHandlers.forEach((disposeHandler) => {
993
+ disposeHandler(null);
994
+ });
995
+ }
996
+ this.messageHandlers = {};
997
+ this.id += "_disposed";
998
+ this.isInitiated = false;
999
+ }
1000
+ };
1001
+
1002
+ // src/common/MyopElementRef.ts
1003
+ var MyopElementRef = class {
1004
+ constructor(myopId, htmlTagName, BoundingRect, offsetTop, offsetLeft) {
1005
+ this.myopId = myopId;
1006
+ this.htmlTagName = htmlTagName;
1007
+ this.BoundingRect = BoundingRect;
1008
+ this.offsetTop = offsetTop;
1009
+ this.offsetLeft = offsetLeft;
1010
+ __publicField(this, "type", "MyopElementRef");
1011
+ }
1012
+ };
1013
+
1014
+ // src/common/baseMessageHandler.ts
1015
+ var runExecutorCleanup = (task) => __async(void 0, null, function* () {
1016
+ if (typeof task === "function") {
1017
+ task();
1018
+ } else if (task instanceof Promise) {
1019
+ const result = yield task;
1020
+ if (typeof result === "function") {
1021
+ result();
1022
+ }
1023
+ }
1024
+ });
1025
+ var BaseMessageHandler = class {
1026
+ //TODO : add dispose method
1027
+ constructor(messageToHost) {
1028
+ this.messageToHost = messageToHost;
1029
+ }
1030
+ };
1031
+ var BaseContextMessageHandler = class extends BaseMessageHandler {
1032
+ constructor(messageToHost, context) {
1033
+ super(messageToHost);
1034
+ this.messageToHost = messageToHost;
1035
+ this.context = context;
1036
+ }
1037
+ };
1038
+
1039
+ // src/common/BaseMyopSDK.ts
1040
+ var HostedComponent = class {
1041
+ //onMessageReceived: (msg: IMyopMessage) => void;
1042
+ constructor(id, context) {
1043
+ this.id = id;
1044
+ this.context = context;
1045
+ __publicField(this, "send", (message) => {
1046
+ });
1047
+ }
1048
+ };
1049
+ var BaseMyopSDK = class {
1050
+ constructor() {
1051
+ __publicField(this, "messageToHandleAfterInit", []);
1052
+ __publicField(this, "components", {});
1053
+ __publicField(this, "alwaysPassEnvelopesToHost", false);
1054
+ __publicField(this, "messageCleanupCache", {});
1055
+ }
1056
+ handleIncomeMessages(event) {
1057
+ const eventContent = event.data ? event.data : event.detail;
1058
+ if (!eventContent || !eventContent.myop) {
1059
+ return;
1060
+ } else {
1061
+ let message = eventContent;
1062
+ if (message.direction !== MessageDirection.down) {
1063
+ return;
1064
+ }
1065
+ if (message.messageType === MyopMessages.DisposeMessage) {
1066
+ if (message.destination)
1067
+ delete this.components[message.destination];
1068
+ return;
1069
+ }
1070
+ if (message.messageType === MyopMessages.InitMessage) {
1071
+ const newComponentId = message.content.id;
1072
+ if (this.components[newComponentId]) {
1073
+ return;
1074
+ }
1075
+ this.components[newComponentId] = new HostedComponent(newComponentId);
1076
+ this.messageToHost(new InitResponse(newComponentId));
1077
+ return;
1078
+ }
1079
+ if (message.messageType === MyopMessages.EnvelopedMessage) {
1080
+ const envelopedMessage = message;
1081
+ const innerMessage = envelopedMessage.message;
1082
+ message = innerMessage;
1083
+ if (this.alwaysPassEnvelopesToHost || this.components[message.destination]) {
1084
+ const destinationComponent = myop.hostSDK.components.find((c) => c.id === innerMessage.destination);
1085
+ if (destinationComponent) {
1086
+ destinationComponent.send(innerMessage);
1087
+ return;
1088
+ }
1089
+ const envelopedDestinationComponent = myop.hostSDK.components.find((c) => c.id === envelopedMessage.destination);
1090
+ if (envelopedDestinationComponent) {
1091
+ envelopedDestinationComponent.send(innerMessage);
1092
+ return;
1093
+ }
1094
+ } else {
1095
+ return;
1096
+ }
1097
+ }
1098
+ if (message.messageType) {
1099
+ if (message.messageType === MyopMessages.CleanupMessage) {
1100
+ const typedMessage = message;
1101
+ const cleanup = this.messageCleanupCache[typedMessage.cleanupForMessageId];
1102
+ const cleanupMessage = new CleanupReplayMessage(!!cleanup);
1103
+ cleanupMessage.destination = message.destination;
1104
+ if (!!cleanup) {
1105
+ delete this.messageCleanupCache[typedMessage.cleanupForMessageId];
1106
+ runExecutorCleanup(cleanup).then(() => {
1107
+ this.messageToHost(cleanupMessage, typedMessage);
1108
+ }).catch(() => {
1109
+ });
1110
+ } else {
1111
+ this.messageToHost(cleanupMessage, typedMessage);
1112
+ }
1113
+ return;
1114
+ }
1115
+ let actionHandlerFound = false;
1116
+ this.supportedHandlers.forEach((handler) => {
1117
+ if (handler.messageType === message.messageType) {
1118
+ actionHandlerFound = true;
1119
+ const cleanup = handler.executor(message);
1120
+ if (message.cleanable && cleanup) {
1121
+ this.messageCleanupCache[message.id] = cleanup;
1122
+ }
1123
+ if (cleanup && !message.cleanable) {
1124
+ throw new Error(`Cleanup handler generated for non-cleanable message.
1125
+ messageType - ${message.messageType}, handler executor was - ${handler.executor}
1126
+
1127
+ Please review the message definition object & message handler.
1128
+ To ensure cleanup properly set 'cleanable' true at message definition and return IMessageExecutorCleanup from your handlers.`);
1129
+ }
1130
+ if (!cleanup && message.cleanable) {
1131
+ throw new Error(`No cleanup handler generated for a cleanable message.
1132
+ messageType - ${message.messageType}, handler executor was - ${handler.executor}
1133
+
1134
+ Please review the message definition object & message handler.
1135
+ To ensure cleanup properly set 'cleanable' true at message definition and return IMessageExecutorCleanup from your handlers.`);
1136
+ }
1137
+ }
1138
+ });
1139
+ if (!actionHandlerFound) {
1140
+ }
1141
+ } else {
1142
+ console.log("unsupported message type");
1143
+ }
1144
+ }
1145
+ }
1146
+ };
1147
+
1148
+ // src/common/index.ts
1149
+ var SkinLoaders = {
1150
+ "IframeLoader": "IframeLoader",
1151
+ "WebComponentLoader": "WebComponentLoader",
1152
+ "HTMLLoader": "HTMLLoader",
1153
+ "MinimizedLoader": "MinimizedLoader"
1154
+ };
1155
+ var ShadowRootModeType = {
1156
+ "open": "open",
1157
+ "closed": "closed",
1158
+ "none": "none",
1159
+ "localFrame": "localFrame"
1160
+ };
1161
+ var PropConfigBehaviorTypes = {
1162
+ "message": "message",
1163
+ "code": "code"
1164
+ };
1165
+ var RefBehaviorType = class {
1166
+ };
1167
+ __publicField(RefBehaviorType, "code", "code");
1168
+ __publicField(RefBehaviorType, "component", "component");
1169
+ var SkinSelectorTypes = {
1170
+ "Segmented": "Segmented",
1171
+ "Dedicated": "Dedicated",
1172
+ /**
1173
+ * This Selector Type is not yet supported but will be added in a future release.
1174
+ * Please check the documentation for updates.
1175
+ *
1176
+ * @type {string}
1177
+ */
1178
+ "Default": "Default"
1179
+ };
1180
+ var ExperienceTypes = {
1181
+ "Segment": "Segment",
1182
+ "Promo": "Promo",
1183
+ "AB": "AB"
1184
+ };
1185
+ var RootRef = class {
1186
+ constructor(container, shadowRoot) {
1187
+ this.container = container;
1188
+ this.shadowRoot = shadowRoot;
1189
+ __publicField(this, "getRootDiv", () => {
1190
+ return (this.shadowRoot || this.container).querySelector("div");
1191
+ });
1192
+ __publicField(this, "getRoot", () => {
1193
+ return this.shadowRoot || this.container;
1194
+ });
1195
+ }
1196
+ };
1197
+
1198
+ // src/common/utils/serialization.ts
1199
+ var isPrimitive = (value) => {
1200
+ return value !== Object(value);
1201
+ };
1202
+ var isFunction = (value) => {
1203
+ return typeof value === "function";
1204
+ };
1205
+ var containsPrimitivesOnly = (obj) => {
1206
+ if (isPrimitive(obj)) {
1207
+ return true;
1208
+ }
1209
+ if (isFunction(obj)) {
1210
+ return false;
1211
+ }
1212
+ if (Object.getPrototypeOf(obj)) {
1213
+ return false;
1214
+ }
1215
+ for (const key in obj) {
1216
+ const value = obj[key];
1217
+ if (typeof value === "object") {
1218
+ if (!containsPrimitivesOnly(value)) {
1219
+ return false;
1220
+ }
1221
+ } else if (isPrimitive(value)) {
1222
+ continue;
1223
+ } else {
1224
+ return false;
1225
+ }
1226
+ }
1227
+ return true;
1228
+ };
1229
+ var makeSerializable = (obj, skeleton = {}, includeFalsyKeys = true, seen3 = /* @__PURE__ */ new WeakMap()) => {
1230
+ if (isPrimitive(obj)) {
1231
+ return obj;
1232
+ }
1233
+ if (Array.isArray(obj)) {
1234
+ if (seen3.has(obj)) {
1235
+ return seen3.get(obj);
1236
+ }
1237
+ const serializableArray = [];
1238
+ seen3.set(obj, serializableArray);
1239
+ for (let index = 0; index < obj.length; index++) {
1240
+ const element = obj[index];
1241
+ serializableArray[index] = makeSerializable(element, skeleton, includeFalsyKeys, seen3);
1242
+ }
1243
+ return serializableArray;
1244
+ }
1245
+ if (obj !== null && typeof obj === "object") {
1246
+ if (seen3.has(obj)) {
1247
+ return seen3.get(obj);
1248
+ }
1249
+ const serializableObject = {};
1250
+ seen3.set(obj, serializableObject);
1251
+ for (const key in obj) {
1252
+ const keyInSkeleton = typeof skeleton == "boolean" ? skeleton : skeleton[key];
1253
+ if (keyInSkeleton) {
1254
+ if (keyInSkeleton === true) {
1255
+ if (includeFalsyKeys ? obj[key] !== void 0 : obj[key]) {
1256
+ serializableObject[key] = makeSerializable(obj[key], true, includeFalsyKeys, seen3);
1257
+ }
1258
+ } else if (typeof keyInSkeleton === "object") {
1259
+ serializableObject[key] = makeSerializable(obj[key], keyInSkeleton, includeFalsyKeys, seen3);
1260
+ }
1261
+ }
1262
+ }
1263
+ return serializableObject;
1264
+ }
1265
+ return {};
1266
+ };
1267
+
1268
+ // src/host/logMessages.ts
1269
+ var Errors = {
1270
+ notSerializableRefCall: (prop, arg) => {
1271
+ throw new Error(`
1272
+ The input provided to '${prop.toString()}' is not serializable. Serialization is required to ensure that the data can be safely transferred to the skin implementation.
1273
+ The following types of data are considered non-serializable and cannot be processed:
1274
+
1275
+ - Functions
1276
+ - DOM elements
1277
+ - Class instances
1278
+ - Circular references
1279
+ - Symbols
1280
+ - BigInt values
1281
+
1282
+ In the following execution we detected :
1283
+ ~~~~~~~~
1284
+ ${arg}
1285
+ ~~~~~~~~
1286
+ as not serializable.
1287
+
1288
+ To resolve this issue, please ensure that all inputs passed to '${prop.toString()}' are in a serializable format.
1289
+ This typically includes primitive types (strings, numbers, booleans), arrays, and plain objects.
1290
+ If you need to include complex data types, consider converting them to a serializable structure before passing them to the function.
1291
+ Or use Myop message that support it: CustomRefMessage, AddEventListenerMessage or ExecuteScriptMessage.
1292
+
1293
+ Suggested Fix:
1294
+ 1. Remove or replace non-serializable values from your input.
1295
+ 2. If using objects, ensure they do not contain any functions or circular references.
1296
+ 3. Convert any class instances to plain objects or JSON-compatible formats.
1297
+ 4. Use dedicated Myop message.
1298
+
1299
+ For more details on serialization and Myop message examples, refer to https://docs.myop.dev.
1300
+
1301
+ `);
1302
+ }
1303
+ };
1304
+
1305
+ // src/host/components/myopRefComponent.ts
1306
+ var MyopRefComponent = class extends BaseMyopComponent {
1307
+ constructor(componentDefinition, parent, options) {
1308
+ super(componentDefinition, parent.container, options);
1309
+ this.componentDefinition = componentDefinition;
1310
+ this.parent = parent;
1311
+ __publicField(this, "send", (message) => {
1312
+ const handler = message.handler;
1313
+ const cleanupHandler = super.send(message);
1314
+ this.parent.send(new EnvelopedMessage(this.id, message));
1315
+ message.handler = handler;
1316
+ return cleanupHandler;
1317
+ });
1318
+ __publicField(this, "dispose", () => {
1319
+ if (this.isInitiated)
1320
+ this.send(new ExecuteComponentMethod("dispose"));
1321
+ super.dispose();
1322
+ });
1323
+ }
1324
+ hide() {
1325
+ this.send(new ExecuteComponentMethod("hide"));
1326
+ }
1327
+ show() {
1328
+ this.send(new ExecuteComponentMethod("show"));
1329
+ }
1330
+ inspect() {
1331
+ return this.send(new ExecuteComponentMethod("inspect"));
1332
+ }
1333
+ setHeightBasedOnDocumentElement() {
1334
+ this.send(new ExecuteComponentMethod("setHeightBasedOnDocumentElement"));
1335
+ }
1336
+ setHeightBasedOnScrollHeight() {
1337
+ this.send(new ExecuteComponentMethod("setHeightBasedOnScrollHeight"));
1338
+ }
1339
+ onMessageReceived(incomeMessage) {
1340
+ return super.onMessageReceived(incomeMessage);
1341
+ }
1342
+ };
1343
+
1344
+ // src/host/componentCore.ts
1345
+ var createDebugTitle = (text, top, componentDefinitionConfig) => {
1346
+ const titleEl = document.createElement("a");
1347
+ titleEl.textContent = text;
1348
+ titleEl.style.position = "relative";
1349
+ titleEl.style.padding = "0 5px";
1350
+ titleEl.style.fontSize = "14px";
1351
+ titleEl.style["top"] = "0";
1352
+ titleEl.style.top = `${top}px`;
1353
+ titleEl.style.transform = "translateX(-50%)";
1354
+ titleEl.target = "_blank";
1355
+ titleEl.href = `https://dashboard.myop.dev/dashboard/component/${componentDefinitionConfig.id}`;
1356
+ return titleEl;
1357
+ };
1358
+ var setDebugStyle = (id, type, top, container, componentElement, componentDefinitionConfig) => {
1359
+ const topText = createDebugTitle(`${componentDefinitionConfig.name} : ${type}`, top, componentDefinitionConfig);
1360
+ container.insertBefore(topText, componentElement);
1361
+ componentElement.style.border = "1px solid #007BFF";
1362
+ componentElement.style.display = "block";
1363
+ return () => {
1364
+ componentElement.style.border = "unset";
1365
+ container.removeChild(topText);
1366
+ };
1367
+ };
1368
+ var reportError = (propConfig, propName, component) => {
1369
+ if (!propConfig) {
1370
+ console.error(
1371
+ // throw new Error(
1372
+ `Error: Undefined Prop
1373
+
1374
+ It looks like you've tried to use a prop that hasn't been defined.
1375
+ Please check the prop name for any typos or ensure that it is properly defined in the component's prop list.
1376
+
1377
+ Prop Name: ${propName}
1378
+ Component: ${component.componentDefinition.name}, ID: ${component.componentDefinition.id}
1379
+
1380
+ For more information, refer to the component page https://dashboard.myop.dev/dashboard/component/${component.componentDefinition.id} or consult the developer guide.`
1381
+ );
1382
+ return true;
1383
+ }
1384
+ return false;
1385
+ };
1386
+ var reportUnsupported = (propConfig, propName, component) => {
1387
+ console.error(
1388
+ `Error: Code Prop Not Supported
1389
+
1390
+ Currently, code props are only supported in local frame components.
1391
+ \u26A0\uFE0F This is a work in progress feature \u2014 code props will be supported in upcoming versions.
1392
+
1393
+ In the meantime, you can use message props.
1394
+
1395
+ Prop Name: ${propName}
1396
+ Component: ${component.componentDefinition.name}, ID: ${component.componentDefinition.id}
1397
+
1398
+ For more information, refer to the component page https://dashboard.myop.dev/dashboard/component/${component.componentDefinition.id} or consult the developer guide.`
1399
+ );
1400
+ };
1401
+ var connectProps = (component, propsConfig, selectedSkin) => {
1402
+ const propsMap = propsConfig.reduce((previousValue, currentValue) => {
1403
+ return __spreadProps(__spreadValues({}, previousValue), {
1404
+ [currentValue.name]: __spreadValues({}, currentValue)
1405
+ });
1406
+ }, {});
1407
+ const propsHandler = {
1408
+ get: (_, prop) => {
1409
+ const propConfig = propsMap[prop];
1410
+ if (reportError(propConfig, prop, component)) {
1411
+ return false;
1412
+ }
1413
+ if (propConfig.behavior.type === PropConfigBehaviorTypes.code) {
1414
+ if (selectedSkin.loader.type === SkinLoaders.HTMLLoader) {
1415
+ const typedLoader = selectedSkin.loader;
1416
+ if (typedLoader.shadowRootMode === ShadowRootModeType.localFrame) {
1417
+ const typedPropBehavior = propConfig.behavior;
1418
+ return component.element.contentWindow[typedPropBehavior.remap || prop];
1419
+ }
1420
+ }
1421
+ reportUnsupported(propConfig, prop, component);
1422
+ return false;
1423
+ }
1424
+ if (propConfig.mode === "output") {
1425
+ return new Promise((resolve) => {
1426
+ const messageParams = [];
1427
+ if (propConfig.behavior.ref) {
1428
+ messageParams.push(Ref.create(propConfig.behavior.ref));
1429
+ }
1430
+ messageParams.push((data) => {
1431
+ resolve(data);
1432
+ });
1433
+ if (propConfig.behavior.params) {
1434
+ messageParams.push(...propConfig.behavior.params);
1435
+ }
1436
+ const messageCtor = messages_exports[propConfig.behavior.message];
1437
+ component.send(new messageCtor(...messageParams));
1438
+ });
1439
+ }
1440
+ return null;
1441
+ },
1442
+ set: (_, prop, value) => {
1443
+ const propConfig = propsMap[prop];
1444
+ if (reportError(propConfig, prop, component)) {
1445
+ return false;
1446
+ }
1447
+ if (propConfig.behavior.type === PropConfigBehaviorTypes.code) {
1448
+ if (selectedSkin.loader.type === SkinLoaders.HTMLLoader) {
1449
+ const typedLoader = selectedSkin.loader;
1450
+ if (typedLoader.shadowRootMode === ShadowRootModeType.localFrame) {
1451
+ const typedPropBehavior = propConfig.behavior;
1452
+ component.element.contentWindow[typedPropBehavior.remap || prop] = value;
1453
+ return true;
1454
+ }
1455
+ }
1456
+ reportUnsupported(propConfig, prop, component);
1457
+ return false;
1458
+ } else {
1459
+ if (propConfig.mode === "input") {
1460
+ if (propConfig.behavior.type === "message") {
1461
+ const messageParams = [];
1462
+ if (propConfig.behavior.ref) {
1463
+ messageParams.push(Ref.create(propConfig.behavior.ref));
1464
+ }
1465
+ messageParams.push(value);
1466
+ if (propConfig.behavior.params) {
1467
+ messageParams.push(...propConfig.behavior.params);
1468
+ }
1469
+ const messageCtor = messages_exports[propConfig.behavior.message];
1470
+ component.send(new messageCtor(...messageParams));
1471
+ return true;
1472
+ } else {
1473
+ throw new Error(
1474
+ `Error: Unsupported Behavior
1475
+
1476
+ The 'behavior' field provided is not supported.
1477
+ Component: ${component.componentDefinition.name}, ID: ${component.componentDefinition.id}
1478
+
1479
+ Prop Name: ${prop}
1480
+ Behavior Field: ${propConfig.behavior.type}
1481
+
1482
+ Check the documentation for valid behavior options.`
1483
+ );
1484
+ return false;
1485
+ }
1486
+ }
1487
+ }
1488
+ return false;
1489
+ }
1490
+ };
1491
+ component.props = {};
1492
+ component.props = new Proxy(component.props, propsHandler);
1493
+ return component;
1494
+ };
1495
+ var createRefProxy = (target, component) => {
1496
+ return new Proxy(target, {
1497
+ get(target2, prop) {
1498
+ if (target2[prop]) {
1499
+ return target2[prop];
1500
+ }
1501
+ const getterFunction = (...args) => {
1502
+ return new Promise((resolve) => {
1503
+ args.forEach((arg) => {
1504
+ if (!containsPrimitivesOnly(arg)) {
1505
+ Errors.notSerializableRefCall(prop, arg);
1506
+ }
1507
+ });
1508
+ component.send(new CustomRefMessage(
1509
+ ({ ref, propName, functionArgs, makeSerializable: makeSerializable2 }) => {
1510
+ if (ref) {
1511
+ const value = ref[propName];
1512
+ if (typeof value === "function") {
1513
+ return makeSerializable2(ref[propName](...functionArgs), true);
1514
+ } else {
1515
+ return makeSerializable2(value, true);
1516
+ }
1517
+ }
1518
+ return null;
1519
+ },
1520
+ {
1521
+ //TODO : turn it to config
1522
+ elementId: target2.refConfig.selector,
1523
+ propName: prop,
1524
+ functionArgs: args
1525
+ },
1526
+ (msg) => {
1527
+ resolve(msg.content);
1528
+ }
1529
+ ));
1530
+ });
1531
+ };
1532
+ return getterFunction;
1533
+ },
1534
+ set(target2, prop, value) {
1535
+ component.send(new CustomRefMessage(
1536
+ ({ ref, propName, propValue }) => {
1537
+ if (ref)
1538
+ ref[propName] = propValue;
1539
+ },
1540
+ {
1541
+ //TODO : fix that
1542
+ elementId: target2.refConfig.selector,
1543
+ propValue: value,
1544
+ propName: prop
1545
+ },
1546
+ (msg) => {
1547
+ }
1548
+ ));
1549
+ return true;
1550
+ }
1551
+ });
1552
+ };
1553
+ var createRefComponent = (ref, componentConfig, components, options) => __async(void 0, null, function* () {
1554
+ const component = ref.component;
1555
+ if (!component)
1556
+ throw new Error("cant createRefComponent with detached ref");
1557
+ return new Promise((resolve, reject) => __async(void 0, null, function* () {
1558
+ const refComponent = new MyopRefComponent(componentConfig.type, component, options);
1559
+ components.push(refComponent);
1560
+ yield component.initiated();
1561
+ const timeout = setTimeout(() => {
1562
+ reject("timeout");
1563
+ }, 5e3);
1564
+ component.send(new CreateRefComponentMessage(
1565
+ ref.refConfig,
1566
+ componentConfig,
1567
+ __spreadProps(__spreadValues({}, options ? options : {}), {
1568
+ id: refComponent.id,
1569
+ _hasParent: true
1570
+ }),
1571
+ (message) => __async(void 0, null, function* () {
1572
+ clearTimeout(timeout);
1573
+ if (message.failed) {
1574
+ reject("CreateRefComponentMessage failed");
1575
+ return;
1576
+ }
1577
+ const implementationComponent = components.find((c) => c.id == refComponent.id);
1578
+ if (implementationComponent !== refComponent) {
1579
+ component.refs[ref.refConfig.name] = implementationComponent;
1580
+ resolve(implementationComponent);
1581
+ return;
1582
+ } else {
1583
+ refComponent.setInitiated();
1584
+ component.refs[ref.refConfig.name] = refComponent;
1585
+ }
1586
+ message.nestedRefs.forEach((nestedRefConfig) => {
1587
+ const nestedComponentDefinition = componentConfig.instance.resolvedNestedComponents.find((c) => c.type.id === nestedRefConfig.componentDefinitionId).type;
1588
+ const nestedComponent = new MyopRefComponent(nestedComponentDefinition, refComponent);
1589
+ nestedComponent.setInitiated();
1590
+ refComponent.refs[nestedRefConfig.refName] = nestedComponent;
1591
+ components.push(nestedComponent);
1592
+ });
1593
+ try {
1594
+ yield connectRefs(refComponent, componentConfig, components, true);
1595
+ if (component.setHeightBasedOnScrollHeight)
1596
+ component.setHeightBasedOnScrollHeight();
1597
+ resolve(refComponent);
1598
+ } catch (e) {
1599
+ reject(e);
1600
+ }
1601
+ })
1602
+ ));
1603
+ }));
1604
+ });
1605
+ var connectRefs = (component, componentConfig, components, withoutRefComponents = false) => __async(void 0, null, function* () {
1606
+ if (!component.refs)
1607
+ component.refs = {};
1608
+ const waitFor = Object.values(component.componentDefinition.refs).map((ref) => {
1609
+ return new Promise((resolve, reject) => __async(void 0, null, function* () {
1610
+ var _a;
1611
+ if (ref.behavior.type == RefBehaviorType.component) {
1612
+ if (withoutRefComponents) {
1613
+ resolve();
1614
+ return;
1615
+ }
1616
+ let refComponentId = ref.behavior.componentId;
1617
+ if (!refComponentId)
1618
+ refComponentId = ref.behavior.instance.componentId;
1619
+ const nestedComponentConfig = (_a = componentConfig.instance.resolvedNestedComponents) == null ? void 0 : _a.find((nestedComponent) => nestedComponent.type.id === refComponentId);
1620
+ if (!nestedComponentConfig) {
1621
+ throw new Error("componentConfig provided without nestedComponentConfig check the config object");
1622
+ return;
1623
+ }
1624
+ const _ref = Ref.create("", ref, component);
1625
+ try {
1626
+ const nestedComponent = yield createRefComponent(_ref, nestedComponentConfig, components);
1627
+ component.refs[ref.name] = nestedComponent;
1628
+ resolve();
1629
+ } catch (e) {
1630
+ reject(e);
1631
+ }
1632
+ } else {
1633
+ try {
1634
+ const __nonProxied = Ref.create("", ref, component);
1635
+ component.refs[ref.name] = createRefProxy(__nonProxied, component);
1636
+ resolve();
1637
+ } catch (e) {
1638
+ }
1639
+ }
1640
+ }));
1641
+ });
1642
+ try {
1643
+ yield Promise.all(waitFor);
1644
+ } catch (e) {
1645
+ throw e;
1646
+ }
1647
+ });
1648
+
1649
+ // src/host/components/myopIframeComponent.ts
1650
+ var MyopIframeComponent = class extends BaseMyopComponent {
1651
+ constructor(componentConfig, skin, container, IframeElement, options) {
1652
+ super(componentConfig, container, options);
1653
+ this.componentConfig = componentConfig;
1654
+ this.container = container;
1655
+ this.IframeElement = IframeElement;
1656
+ __publicField(this, "cleanupInspect");
1657
+ __publicField(this, "setHeightBasedOnDocumentElement", () => {
1658
+ const cleanupHandler = this.send(new ExecuteScriptMessage(() => {
1659
+ return window.document.documentElement.scrollHeight;
1660
+ }, (ret) => {
1661
+ this.IframeElement.style.height = `${ret.content}px`;
1662
+ cleanupHandler();
1663
+ }));
1664
+ });
1665
+ __publicField(this, "observeSizeBasedOnDocumentElement", () => {
1666
+ const cleanupHandler = this.send(new ExecuteScriptMessage(({ send }) => {
1667
+ const { height, width } = document.documentElement.getBoundingClientRect();
1668
+ const observer = new ResizeObserver(() => {
1669
+ const { height: height2, width: width2 } = document.documentElement.getBoundingClientRect();
1670
+ send({ height: height2, width: width2 });
1671
+ });
1672
+ observer.observe(document.documentElement);
1673
+ observer.observe(document.body);
1674
+ return { height, width };
1675
+ }, (ret) => {
1676
+ this.IframeElement.style.width = `${ret.content.width}px`;
1677
+ this.IframeElement.style.height = `${ret.content.height}px`;
1678
+ }));
1679
+ return cleanupHandler;
1680
+ });
1681
+ __publicField(this, "setSizeBasedOnDocumentElement", () => {
1682
+ const cleanupHandler = this.send(new ExecuteScriptMessage(() => {
1683
+ const { height, width } = document.documentElement.getBoundingClientRect();
1684
+ return { height, width };
1685
+ }, (ret) => {
1686
+ this.IframeElement.style.width = `${ret.content.width}px`;
1687
+ this.IframeElement.style.height = `${ret.content.height}px`;
1688
+ cleanupHandler();
1689
+ }));
1690
+ });
1691
+ __publicField(this, "setHeightBasedOnScrollHeight", () => {
1692
+ const cleanupHandler = this.send(new ExecuteScriptMessage(() => {
1693
+ const noOp = () => {
1694
+ return 0;
1695
+ };
1696
+ let x = noOp();
1697
+ x++;
1698
+ x--;
1699
+ return Math.max(
1700
+ Math.max(
1701
+ window.document.body.clientHeight,
1702
+ window.document.body.scrollHeight
1703
+ ),
1704
+ window.document.body.offsetHeight
1705
+ ) + x + "px";
1706
+ }, (ret) => {
1707
+ this.IframeElement.style.height = ret.content;
1708
+ cleanupHandler();
1709
+ }));
1710
+ });
1711
+ __publicField(this, "send", (message) => {
1712
+ var _a, _b;
1713
+ let message_ = __spreadValues({}, message);
1714
+ if (message_.messageType === MyopMessages.ExecuteComponentMethod) {
1715
+ const typedMessage = message_;
1716
+ this[typedMessage.method]();
1717
+ return () => {
1718
+ };
1719
+ }
1720
+ message_.direction = MessageDirection.down;
1721
+ const cleanupHandler = super.send(message_);
1722
+ (_b = (_a = this.IframeElement) == null ? void 0 : _a.contentWindow) == null ? void 0 : _b.postMessage(message_, "*");
1723
+ return cleanupHandler;
1724
+ });
1725
+ __publicField(this, "dispose", () => {
1726
+ if (this.cleanupInspect)
1727
+ this.cleanupInspect();
1728
+ super.dispose();
1729
+ this.IframeElement.parentNode.removeChild(this.IframeElement);
1730
+ });
1731
+ if (skin.loader.autoHeight) {
1732
+ this.initiated().then(() => {
1733
+ this.setHeightBasedOnScrollHeight();
1734
+ });
1735
+ }
1736
+ this.element = this.IframeElement;
1737
+ }
1738
+ inspect() {
1739
+ if (this.cleanupInspect) {
1740
+ return this.cleanupInspect;
1741
+ }
1742
+ this.cleanupInspect = setDebugStyle(this.id, "MyopIframeComponent", 10, this.container, this.IframeElement, this.componentDefinition);
1743
+ return () => {
1744
+ this.cleanupInspect();
1745
+ this.cleanupInspect = void 0;
1746
+ };
1747
+ }
1748
+ hide() {
1749
+ this.IframeElement.style.opacity = "0";
1750
+ this.IframeElement.style.position = "absolute";
1751
+ this.IframeElement.style.pointerEvents = "none";
1752
+ this.IframeElement.style.visibility = "hidden";
1753
+ }
1754
+ show() {
1755
+ this.IframeElement.style.opacity = "1";
1756
+ this.IframeElement.style.position = "unset";
1757
+ this.IframeElement.style.pointerEvents = "all";
1758
+ this.IframeElement.style.visibility = "visible";
1759
+ }
1760
+ onMessageReceived(incomeMessage) {
1761
+ if (incomeMessage.messageType === MyopMessages.In.MutationObserverMessage || incomeMessage.messageType === MyopMessages.In.ResizeObserverMessage) {
1762
+ this.setHeightBasedOnScrollHeight();
1763
+ return true;
1764
+ }
1765
+ return super.onMessageReceived(incomeMessage);
1766
+ }
1767
+ };
1768
+
1769
+ // src/host/loaders/IMyopLoader.ts
1770
+ var BaseMyopLoader = class {
1771
+ constructor() {
1772
+ __publicField(this, "appendChild", (container, element, options) => {
1773
+ var _a;
1774
+ if (options == null ? void 0 : options.relative) {
1775
+ if (options.relative.direction === "before") {
1776
+ return container.insertBefore(element, options.relative.child);
1777
+ }
1778
+ if (options.relative.direction === "after") {
1779
+ const nextSibling = (_a = options.relative.child) == null ? void 0 : _a.nextSibling;
1780
+ return container.insertBefore(element, nextSibling ? nextSibling : null);
1781
+ }
1782
+ } else {
1783
+ return container.appendChild(element);
1784
+ }
1785
+ });
1786
+ }
1787
+ };
1788
+
1789
+ // src/host/loaders/iframeLoader.ts
1790
+ var addQueryParam = (url, param, value) => {
1791
+ const urlObj = new URL(url);
1792
+ urlObj.searchParams.append(param, value);
1793
+ return urlObj.toString();
1794
+ };
1795
+ var MyopIframeLoader = class extends BaseMyopLoader {
1796
+ constructor() {
1797
+ super(...arguments);
1798
+ __publicField(this, "type", SkinLoaders.IframeLoader);
1799
+ // @ts-ignore
1800
+ __publicField(this, "load", (componentDefinition, skin, container, options) => __async(this, null, function* () {
1801
+ let IframeElement;
1802
+ const typedLoaderConfig = skin.loader;
1803
+ if ((container == null ? void 0 : container.nodeName) === "IFRAME") {
1804
+ console.log("needs to load into an exsisting Iframe...", typedLoaderConfig.url, container);
1805
+ IframeElement = container;
1806
+ IframeElement.src = typedLoaderConfig.url;
1807
+ } else {
1808
+ const uniqId = uuidv4();
1809
+ const domId = `myop-comp-${uniqId}`;
1810
+ IframeElement = document.createElement("iframe");
1811
+ if (!container.querySelector('[id^="myop-comp-"]'))
1812
+ container.innerHTML = "";
1813
+ if (options == null ? void 0 : options.hidden) {
1814
+ IframeElement.style.visibility = "hidden";
1815
+ }
1816
+ IframeElement = this.appendChild(container, IframeElement, options);
1817
+ let url2load = skin.loader.url;
1818
+ if (options == null ? void 0 : options._hasParent)
1819
+ url2load = addQueryParam(url2load, "_myop-comp", uniqId);
1820
+ let elementAttributesString = "";
1821
+ if (options == null ? void 0 : options.elementAttributes)
1822
+ elementAttributesString = Object.entries(options == null ? void 0 : options.elementAttributes).map(([key, value]) => {
1823
+ if (value === "" || value === null || value === void 0) {
1824
+ return key;
1825
+ }
1826
+ return `${key}="${String(value)}"`;
1827
+ }).join(" ");
1828
+ IframeElement.outerHTML = `<iframe
1829
+ id="${domId}"
1830
+ style="
1831
+ padding: 0;
1832
+ margin: 0;
1833
+ height: ${typedLoaderConfig.autoHeight || !typedLoaderConfig.height ? "" : typedLoaderConfig.height};
1834
+ width : 100%;
1835
+ overflow: hidden;
1836
+ border: none;
1837
+ opacity: ${(options == null ? void 0 : options.hidden) ? "0" : "1"};
1838
+ position: ${(options == null ? void 0 : options.hidden) ? "absolute" : "static"};
1839
+ pointer-events: ${(options == null ? void 0 : options.hidden) ? "none" : "all"};
1840
+ "
1841
+ src="${url2load}"
1842
+ ${elementAttributesString}
1843
+ ></iframe>`;
1844
+ IframeElement = container.querySelector(`#${domId}`);
1845
+ }
1846
+ return new MyopIframeComponent(componentDefinition, skin, container, IframeElement, options);
1847
+ }));
1848
+ }
1849
+ };
1850
+
1851
+ // src/webcomponent/consts.ts
1852
+ var myopWebcomponentConsts = {
1853
+ webcomponent_message_key: "myop_webcomponent_message"
1854
+ };
1855
+
1856
+ // src/host/components/myopWebcomponent.ts
1857
+ var MyopWebComponent = class extends BaseMyopComponent {
1858
+ constructor(componentDefinition, skin, container, customElement, options) {
1859
+ super(componentDefinition, container, options);
1860
+ this.container = container;
1861
+ this.customElement = customElement;
1862
+ __publicField(this, "cleanupInspect", () => {
1863
+ });
1864
+ __publicField(this, "send", (message) => {
1865
+ let message_ = __spreadValues({}, message);
1866
+ const cleanupHandler = super.send(message_);
1867
+ const msg = new CustomEvent(myopWebcomponentConsts.webcomponent_message_key, {
1868
+ // @ts-ignore
1869
+ detail: message_
1870
+ // bubbles: true,
1871
+ // cancelable: false,
1872
+ // composed: true
1873
+ });
1874
+ try {
1875
+ this.customElement.dispatchEvent(msg);
1876
+ } catch (e) {
1877
+ console.log("error while trying to dispatchEvent", e);
1878
+ }
1879
+ return cleanupHandler;
1880
+ });
1881
+ __publicField(this, "dispose", () => {
1882
+ var _a;
1883
+ super.dispose();
1884
+ (_a = this.customElement.parentNode) == null ? void 0 : _a.removeChild(this.customElement);
1885
+ });
1886
+ this.element = customElement;
1887
+ }
1888
+ inspect() {
1889
+ this.cleanupInspect = setDebugStyle(this.id, "MyopWebComponent", 0, this.container, this.customElement, this.componentDefinition);
1890
+ return this.cleanupInspect;
1891
+ }
1892
+ hide() {
1893
+ this.customElement.style.opacity = "0";
1894
+ this.customElement.style.position = "absolute";
1895
+ this.customElement.style.pointerEvents = "none";
1896
+ this.customElement.style.visibility = "hidden";
1897
+ this.customElement.style.height = "0";
1898
+ this.customElement.style.width = "0";
1899
+ }
1900
+ show() {
1901
+ this.customElement.style.opacity = "1";
1902
+ this.customElement.style.position = "unset";
1903
+ this.customElement.style.pointerEvents = "all";
1904
+ this.customElement.style.visibility = "visible";
1905
+ this.customElement.style.height = "";
1906
+ this.customElement.style.width = "";
1907
+ }
1908
+ };
1909
+
1910
+ // src/host/loaders/webcomponentLoader.ts
1911
+ var seen = {};
1912
+ var WebcomponentLoader = class extends BaseMyopLoader {
1913
+ constructor() {
1914
+ super(...arguments);
1915
+ __publicField(this, "type", SkinLoaders.WebComponentLoader);
1916
+ __publicField(this, "load", (componentDefinition, skin, container, options) => __async(this, null, function* () {
1917
+ const loaderConfig = skin.loader;
1918
+ if (!seen[loaderConfig.url]) {
1919
+ seen[loaderConfig.url] = new Promise((resolve, reject) => {
1920
+ const webComponentLoadUrl = loaderConfig.url;
1921
+ const script = document.createElement("script");
1922
+ script.type = "module";
1923
+ script.src = webComponentLoadUrl;
1924
+ script.onload = () => {
1925
+ resolve();
1926
+ };
1927
+ script.onerror = () => {
1928
+ reject();
1929
+ };
1930
+ document.head.appendChild(script);
1931
+ });
1932
+ } else {
1933
+ console.log("Module alreday loaded or in loading process");
1934
+ }
1935
+ yield seen[loaderConfig.url];
1936
+ yield wait(1);
1937
+ let domId = `myop-comp-${uuidv4()}`;
1938
+ const element = document.createElement(loaderConfig.tag);
1939
+ if (!container.querySelector('[id^="myop-comp-"]'))
1940
+ container.innerHTML = "";
1941
+ element.id = domId;
1942
+ if (options == null ? void 0 : options.hidden) {
1943
+ element.style.opacity = "0";
1944
+ element.style.position = "absolute";
1945
+ element.style.height = "0";
1946
+ element.style.width = "0";
1947
+ element.style.pointerEvents = "none";
1948
+ element.style.visibility = "hidden";
1949
+ }
1950
+ if (options == null ? void 0 : options._environment) {
1951
+ element._myopEnvironment = options == null ? void 0 : options._environment;
1952
+ }
1953
+ this.appendChild(container, element, options);
1954
+ return new MyopWebComponent(componentDefinition, skin, container, element, options);
1955
+ }));
1956
+ }
1957
+ };
1958
+
1959
+ // version:myop-sdk-version
1960
+ var myop_sdk_version_default = "0.1.47";
1961
+
1962
+ // src/webcomponent/messageHandlers/BaseWebComponentMessageHandler.ts
1963
+ var BaseWebComponentMessageHandler = class extends BaseContextMessageHandler {
1964
+ constructor(messageToHost, context) {
1965
+ super(messageToHost);
1966
+ this.context = context;
1967
+ __publicField(this, "executor", (event) => {
1968
+ if (event.destination) {
1969
+ const destination = event.destination;
1970
+ if (this.context[destination].context) {
1971
+ const _messageToHost = (message, replayTo) => {
1972
+ this.messageToHost(__spreadProps(__spreadValues({}, message), {
1973
+ source: event.destination ? event.destination : event.source,
1974
+ destination: event.source ? event.source : event.destination
1975
+ }), replayTo);
1976
+ };
1977
+ return this.innerExecutor(event, this.context[destination].context, _messageToHost);
1978
+ } else {
1979
+ debugger;
1980
+ }
1981
+ } else {
1982
+ debugger;
1983
+ }
1984
+ });
1985
+ }
1986
+ };
1987
+
1988
+ // src/consts.ts
1989
+ var myopAttributes = {
1990
+ id: "myop-id"
1991
+ };
1992
+
1993
+ // src/common/messageHandlers/helpers.ts
1994
+ var getElementsByRef = (ref, el) => {
1995
+ return el.querySelectorAll(`[${myopAttributes.id}='${ref.refConfig.selector}']`);
1996
+ };
1997
+
1998
+ // src/webcomponent/messageHandlers/bindOnClickHandler.ts
1999
+ var BindOnClickHandler = class extends BaseWebComponentMessageHandler {
2000
+ constructor() {
2001
+ super(...arguments);
2002
+ __publicField(this, "messageType", MyopMessages.BindClickMessage);
2003
+ __publicField(this, "innerExecutor", (event, shadowRootRef, messageToHost) => {
2004
+ const items = getElementsByRef(event.ref, shadowRootRef.shadowRoot);
2005
+ const cleanupTasks = [];
2006
+ items.forEach((item) => {
2007
+ const handler = () => {
2008
+ messageToHost(new ClickReplayMessage(event.handlerUniqueId));
2009
+ };
2010
+ item.addEventListener("click", handler);
2011
+ cleanupTasks.push(() => {
2012
+ item.removeEventListener("click", handler);
2013
+ });
2014
+ });
2015
+ return () => {
2016
+ cleanupTasks.forEach((task) => task());
2017
+ };
2018
+ });
2019
+ }
2020
+ };
2021
+
2022
+ // src/webcomponent/messageHandlers/changeTextHandler.ts
2023
+ var ChangeTextHandler = class extends BaseWebComponentMessageHandler {
2024
+ constructor() {
2025
+ super(...arguments);
2026
+ __publicField(this, "messageType", MyopMessages.ChangeTextMessage);
2027
+ __publicField(this, "innerExecutor", (event, shadowRootRef) => {
2028
+ const items = getElementsByRef(event.ref, shadowRootRef.shadowRoot);
2029
+ items.forEach((item) => {
2030
+ item.textContent = event.content;
2031
+ });
2032
+ });
2033
+ }
2034
+ };
2035
+
2036
+ // src/webcomponent/shadowRootRef.ts
2037
+ var ShadowRootRef = class extends RootRef {
2038
+ constructor(container, shadowRoot) {
2039
+ super(container, shadowRoot);
2040
+ this.container = container;
2041
+ this.shadowRoot = shadowRoot;
2042
+ }
2043
+ };
2044
+
2045
+ // src/webcomponent/messageHandlers/DetectMyopRefsMessageHandler.ts
2046
+ var DetectMyopRefsMessageHandler = class extends BaseWebComponentMessageHandler {
2047
+ constructor() {
2048
+ super(...arguments);
2049
+ __publicField(this, "innerExecutor", (event, shadowRootRef) => {
2050
+ const allMyopItems = shadowRootRef.shadowRoot.querySelectorAll(`[${myopAttributes.id}]`);
2051
+ let myopRefs = [];
2052
+ allMyopItems.forEach((item) => {
2053
+ const myopId = item.getAttribute(myopAttributes.id);
2054
+ if (myopId) {
2055
+ myopRefs.push(new MyopElementRef(myopId, item.tagName, item.getBoundingClientRect(), item.offsetTop, item.offsetLeft));
2056
+ }
2057
+ });
2058
+ this.messageToHost(new DetectedMyopRefsMessage(event.handlerUniqueId, myopRefs));
2059
+ });
2060
+ __publicField(this, "messageType", MyopMessages.DetectMyopRefsMessage);
2061
+ }
2062
+ };
2063
+
2064
+ // src/webcomponent/messageHandlers/setAttributeHandler.ts
2065
+ var setAttributeHandler = class extends BaseWebComponentMessageHandler {
2066
+ constructor() {
2067
+ super(...arguments);
2068
+ __publicField(this, "messageType", MyopMessages.SetAttributeMessage);
2069
+ __publicField(this, "innerExecutor", (event, shadowRootRef) => {
2070
+ const items = getElementsByRef(event.ref, shadowRootRef.shadowRoot);
2071
+ items.forEach((item) => {
2072
+ item.setAttribute(event.name, event.value);
2073
+ });
2074
+ });
2075
+ }
2076
+ };
2077
+
2078
+ // src/webcomponent/messageHandlers/addEventListenerHandler.ts
2079
+ var AddEventListenerHandler = class extends BaseWebComponentMessageHandler {
2080
+ constructor() {
2081
+ super(...arguments);
2082
+ __publicField(this, "messageType", MyopMessages.AddEventListenerMessage);
2083
+ __publicField(this, "innerExecutor", (event, shadowRootRef, messageToHost) => {
2084
+ const items = getElementsByRef(event.ref, shadowRootRef.shadowRoot);
2085
+ const cleanupTasks = [];
2086
+ items.forEach((item) => {
2087
+ const handler = (e) => {
2088
+ messageToHost(new EventListenerCallbackMessage(event.handlerUniqueId, makeSerializable(e, event.serializableSkeleton)));
2089
+ };
2090
+ item.addEventListener(event.type, handler);
2091
+ cleanupTasks.push(() => {
2092
+ item.removeEventListener(event.type, handler);
2093
+ });
2094
+ });
2095
+ return () => {
2096
+ cleanupTasks.forEach((task) => task());
2097
+ };
2098
+ });
2099
+ }
2100
+ };
2101
+
2102
+ // src/webcomponent/messageHandlers/CreateRefComponentMessageHandler.ts
2103
+ var CreateRefComponentMessageHandler = class extends BaseWebComponentMessageHandler {
2104
+ constructor() {
2105
+ super(...arguments);
2106
+ __publicField(this, "messageType", MyopMessages.CreateRefComponentMessage);
2107
+ __publicField(this, "innerExecutor", (event, shadowRootRef, messageToHost) => {
2108
+ const createRef = () => __async(this, null, function* () {
2109
+ const allItems = shadowRootRef.shadowRoot.querySelectorAll(`[${myopAttributes.id}='${event.refConfig.selector}']`);
2110
+ if (allItems.length === 1) {
2111
+ const hostSDK2 = HostSDK.Instance();
2112
+ const refComponent = hostSDK2.components.find((c) => c.id === event.options.id);
2113
+ if (refComponent) {
2114
+ refComponent.dispose();
2115
+ } else {
2116
+ }
2117
+ const index = hostSDK2.components.indexOf(refComponent);
2118
+ if (index !== -1) {
2119
+ hostSDK2.components.splice(index, 1);
2120
+ } else {
2121
+ }
2122
+ const implementationComponent = yield hostSDK2.loadComponent(
2123
+ event.nestedComponentConfig,
2124
+ allItems.item(0),
2125
+ event.options
2126
+ );
2127
+ const nestedRefConfig = [];
2128
+ Object.keys(implementationComponent.refs).forEach((refName) => {
2129
+ let ref = implementationComponent.refs[refName];
2130
+ ref = ref.__nonProxied || ref;
2131
+ if (ref.componentDefinition) {
2132
+ nestedRefConfig.push({
2133
+ refName,
2134
+ componentDefinitionId: ref.componentDefinition.id
2135
+ });
2136
+ }
2137
+ });
2138
+ messageToHost(new RefComponentCreatedMessage(event.handlerUniqueId, nestedRefConfig));
2139
+ } else {
2140
+ console.error("CreateRefComponentMessageHandler - DOM element not found");
2141
+ this.messageToHost(new RefComponentCreatedMessage(event.handlerUniqueId, [], true));
2142
+ debugger;
2143
+ }
2144
+ });
2145
+ createRef().then();
2146
+ });
2147
+ }
2148
+ };
2149
+
2150
+ // src/common/messageHandlers/executeScriptHandler.ts
2151
+ var ExecuteScriptHandlerExecutor = (event, replier, rootRef) => {
2152
+ const __scriptInputs = event.scriptInputs ? event.scriptInputs : {};
2153
+ __scriptInputs.makeSerializable = makeSerializable;
2154
+ __scriptInputs.send = replier;
2155
+ __scriptInputs.rootRef = rootRef;
2156
+ __scriptInputs.__scriptInputs = __scriptInputs;
2157
+ const dynamicFunction = new Function(`return (${event.script})(...arguments)`);
2158
+ const ret = dynamicFunction(__scriptInputs);
2159
+ replier(ret);
2160
+ };
2161
+
2162
+ // src/webcomponent/messageHandlers/executeScriptHandler.ts
2163
+ var ExecuteScriptHandler = class extends BaseWebComponentMessageHandler {
2164
+ constructor() {
2165
+ super(...arguments);
2166
+ __publicField(this, "messageType", MyopMessages.ExecuteScriptMessage);
2167
+ __publicField(this, "innerExecutor", (event, shadowRootRef, messageToHost) => {
2168
+ const replier = (data) => {
2169
+ messageToHost(new ExecuteScriptReplyMessage(event.handlerUniqueId, data));
2170
+ };
2171
+ ExecuteScriptHandlerExecutor(event, replier, shadowRootRef);
2172
+ });
2173
+ }
2174
+ };
2175
+
2176
+ // src/webcomponent/messageHandlers/GetElementValueHandler.ts
2177
+ var getInputValue = (element) => {
2178
+ if (!element) return null;
2179
+ if (element.tagName === "FORM") {
2180
+ const formData = new FormData(element);
2181
+ const dataObject = {
2182
+ formData: {},
2183
+ unmappedData: []
2184
+ };
2185
+ const elements = element.querySelectorAll("input, select, textarea");
2186
+ let autoNameIndexer = -1;
2187
+ elements.forEach((element2) => {
2188
+ if (typeof element2.value === "string") {
2189
+ const myopId = element2.getAttribute(myopAttributes.id);
2190
+ let key = element2.getAttribute("name");
2191
+ const nodeData = {
2192
+ id: element2.id,
2193
+ name: key,
2194
+ value: getInputValue(element2),
2195
+ required: element2.required,
2196
+ validity: makeSerializable(element2.validity, true),
2197
+ myopId
2198
+ };
2199
+ if (!key) {
2200
+ dataObject.unmappedData.push(nodeData);
2201
+ } else {
2202
+ if (dataObject.formData[key]) {
2203
+ if (dataObject.formData[key].value) {
2204
+ dataObject.unmappedData.push(nodeData);
2205
+ } else {
2206
+ dataObject.unmappedData.push(dataObject.formData[key]);
2207
+ dataObject.formData[key] = nodeData;
2208
+ }
2209
+ } else {
2210
+ dataObject.formData[key] = nodeData;
2211
+ }
2212
+ }
2213
+ }
2214
+ });
2215
+ return dataObject;
2216
+ }
2217
+ if (element.type === "checkbox" || element.type === "radio") {
2218
+ return element.checked ? element.value : null;
2219
+ }
2220
+ if (element.tagName === "INPUT" || element.tagName === "TEXTAREA") {
2221
+ return element.value;
2222
+ }
2223
+ if (element.tagName === "SELECT") {
2224
+ return element.value;
2225
+ }
2226
+ if (element.isContentEditable) {
2227
+ return element.innerText || element.textContent;
2228
+ }
2229
+ return null;
2230
+ };
2231
+ var GetElementValueHandler = class extends BaseWebComponentMessageHandler {
2232
+ constructor() {
2233
+ super(...arguments);
2234
+ __publicField(this, "messageType", MyopMessages.GetElementValueMessage);
2235
+ __publicField(this, "innerExecutor", (event, shadowRootRef, messageToHost) => {
2236
+ const items = getElementsByRef(event.ref, shadowRootRef.shadowRoot);
2237
+ items.forEach((item) => {
2238
+ messageToHost(new ElementValueReplayMessage(getInputValue(item)), event);
2239
+ });
2240
+ });
2241
+ }
2242
+ };
2243
+
2244
+ // src/webcomponent/messageHandlers/setInnerHtmlHandler.ts
2245
+ var SetInnerHtmlHandler = class extends BaseWebComponentMessageHandler {
2246
+ constructor() {
2247
+ super(...arguments);
2248
+ __publicField(this, "messageType", MyopMessages.SetInnerHtml);
2249
+ __publicField(this, "innerExecutor", (event, shadowRootRef) => {
2250
+ const items = getElementsByRef(event.ref, shadowRootRef.shadowRoot);
2251
+ items.forEach((item) => {
2252
+ item.innerHTML = event.content;
2253
+ });
2254
+ });
2255
+ }
2256
+ };
2257
+
2258
+ // src/webcomponent/WebComponentSDK.ts
2259
+ var WebComponentSDK = class extends BaseMyopSDK {
2260
+ constructor() {
2261
+ super(...arguments);
2262
+ __publicField(this, "alwaysPassEnvelopesToHost", true);
2263
+ //when new web component created.
2264
+ __publicField(this, "connectedCallback", (container, shadow) => {
2265
+ container.addEventListener(myopWebcomponentConsts.webcomponent_message_key, (e) => {
2266
+ const eventContent = e.data ? e.data : e.detail;
2267
+ if (!eventContent || !eventContent.myop) {
2268
+ debugger;
2269
+ throw new Error("recvied webcomponent_message with wrong type");
2270
+ } else {
2271
+ const message = eventContent;
2272
+ this.handleIncomeMessages(e);
2273
+ if (message.messageType === MyopMessages.InitMessage) {
2274
+ const newComponentId = message.content.id;
2275
+ this.components[newComponentId].context = new ShadowRootRef(container, shadow);
2276
+ }
2277
+ }
2278
+ });
2279
+ setTimeout(() => {
2280
+ this.messageToHost(new InitRequest());
2281
+ }, 1);
2282
+ });
2283
+ __publicField(this, "messageToHost", (message, replayTo) => {
2284
+ message.direction = MessageDirection.up;
2285
+ if (!message.replayToHandler && (replayTo == null ? void 0 : replayTo.handlerUniqueId))
2286
+ message.replayToHandler = replayTo.handlerUniqueId;
2287
+ window.myop.hostSDK.send(message);
2288
+ });
2289
+ __publicField(this, "supportedHandlers", [
2290
+ new ChangeTextHandler(this.messageToHost, this.components),
2291
+ new SetInnerHtmlHandler(this.messageToHost, this.components),
2292
+ new BindOnClickHandler(this.messageToHost, this.components),
2293
+ new DetectMyopRefsMessageHandler(this.messageToHost, this.components),
2294
+ new setAttributeHandler(this.messageToHost, this.components),
2295
+ new AddEventListenerHandler(this.messageToHost, this.components),
2296
+ new ExecuteScriptHandler(this.messageToHost, this.components),
2297
+ new GetElementValueHandler(this.messageToHost, this.components),
2298
+ //
2299
+ new CreateRefComponentMessageHandler(this.messageToHost, this.components)
2300
+ ]);
2301
+ __publicField(this, "init", () => {
2302
+ });
2303
+ }
2304
+ };
2305
+ defineDynamicImport("WebComponentSDK", WebComponentSDK);
2306
+
2307
+ // src/host/loaders/HTMLComponentLoader.ts
2308
+ var seen2 = [];
2309
+ var sdk;
2310
+ var getInitiatedSdk = () => __async(void 0, null, function* () {
2311
+ if (!sdk) {
2312
+ sdk = new WebComponentSDK();
2313
+ sdk.init();
2314
+ }
2315
+ return sdk;
2316
+ });
2317
+ function createHTMLElementConstructor(htmlString, ShadowRootMode) {
2318
+ return class extends HTMLElement {
2319
+ connectedCallback() {
2320
+ const mode = ShadowRootMode === ShadowRootModeType.open ? "open" : "closed";
2321
+ const shadow = this.attachShadow({ mode });
2322
+ getInitiatedSdk().then((sdk2) => {
2323
+ sdk2.connectedCallback(this, shadow);
2324
+ shadow.innerHTML = htmlString;
2325
+ });
2326
+ }
2327
+ };
2328
+ }
2329
+ var createCustomWebComponent = (componentName, html, ShadowRootMode) => {
2330
+ customElements.define(componentName, createHTMLElementConstructor(html, ShadowRootMode));
2331
+ console.log(`define('${componentName}') was called, web component ready to use`);
2332
+ };
2333
+ var toWebComponentName = (str) => {
2334
+ return str.replace(/([a-z])([A-Z])/g, "$1-$2").replace(/(\d+)/g, "-$1").toLowerCase();
2335
+ };
2336
+ var toCustomElementName = (name) => {
2337
+ name = toWebComponentName(name);
2338
+ return name.replace(/_/g, "-");
2339
+ };
2340
+ var HTMLComponentLoader = class extends BaseMyopLoader {
2341
+ constructor() {
2342
+ super(...arguments);
2343
+ __publicField(this, "type", SkinLoaders.HTMLLoader);
2344
+ __publicField(this, "load", (componentDefinition, skin, container, options) => __async(this, null, function* () {
2345
+ const loaderConfig = skin.loader;
2346
+ let domId = `myop-comp-${uuidv4()}`;
2347
+ let element;
2348
+ if (loaderConfig.shadowRootMode === ShadowRootModeType.localFrame) {
2349
+ const uniqId = uuidv4();
2350
+ const domId2 = `myop-comp-${uniqId}`;
2351
+ let IframeElement = document.createElement("iframe");
2352
+ if (!container.querySelector('[id^="myop-comp-"]'))
2353
+ container.innerHTML = "";
2354
+ if (options == null ? void 0 : options.hidden) {
2355
+ IframeElement.style.visibility = "hidden";
2356
+ }
2357
+ IframeElement = this.appendChild(container, IframeElement, options);
2358
+ IframeElement.id = domId2;
2359
+ IframeElement.setAttribute("style", `
2360
+ padding: 0;
2361
+ margin: 0;
2362
+ overflow: hidden;
2363
+ border: none;
2364
+ opacity: ${(options == null ? void 0 : options.hidden) ? "0" : "1"};
2365
+ width: 100%;
2366
+ height: 100%;
2367
+ position: ${(options == null ? void 0 : options.hidden) ? "absolute" : "static"};
2368
+ pointer-events: ${(options == null ? void 0 : options.hidden) ? "none" : "all"};
2369
+ `);
2370
+ container.appendChild(IframeElement);
2371
+ const doc = IframeElement.contentDocument || IframeElement.contentWindow.document;
2372
+ doc.open();
2373
+ let HTML2Render = loaderConfig.HTML;
2374
+ if (options == null ? void 0 : options._inspection) {
2375
+ const parser = new DOMParser();
2376
+ const _doc = parser.parseFromString(loaderConfig.HTML, "text/html");
2377
+ const myop_preview_script = _doc.getElementById("myop_preview");
2378
+ myop_preview_script == null ? void 0 : myop_preview_script.removeAttribute("type");
2379
+ const temp = _doc.implementation.createHTMLDocument();
2380
+ temp.body.innerHTML = `<script>
2381
+ const beforeKeysWindow = new Set(Object.keys(window));
2382
+ window.myopState = {
2383
+ beforeKeysWindow,
2384
+ };
2385
+ <\/script>`;
2386
+ const node = temp.body.firstChild;
2387
+ if (node && _doc.head) {
2388
+ _doc.head.insertBefore(_doc.importNode(node, true), _doc.head.firstChild);
2389
+ }
2390
+ HTML2Render = _doc.documentElement.outerHTML;
2391
+ }
2392
+ doc.writeln(HTML2Render);
2393
+ doc.writeln(`<script src="${window.myop.__ROOT_SDK_PUBLIC_URL__}"><\/script>
2394
+ <script>
2395
+
2396
+ window.__federation__.__public_path__ = window.__federation__.__public_path__;
2397
+
2398
+ const __myop_init = async () => {
2399
+ const {IframeSDK} = (await window.myop.rootSDK.getIframeModule());
2400
+ const sdk = new IframeSDK()
2401
+ sdk.init();
2402
+ }
2403
+
2404
+ __myop_init().then();
2405
+
2406
+ <\/script>`);
2407
+ doc.close();
2408
+ const comp = new MyopIframeComponent(componentDefinition, skin, container, IframeElement, options);
2409
+ if (loaderConfig.autoHeight) {
2410
+ IframeElement.onload = () => {
2411
+ comp.observeSizeBasedOnDocumentElement();
2412
+ };
2413
+ }
2414
+ return comp;
2415
+ }
2416
+ if (loaderConfig.shadowRootMode === ShadowRootModeType.none) {
2417
+ const template = document.createElement("template");
2418
+ template.innerHTML = loaderConfig.HTML;
2419
+ element = template.content.firstElementChild;
2420
+ getInitiatedSdk().then((sdk2) => {
2421
+ sdk2.connectedCallback(element, element);
2422
+ });
2423
+ } else {
2424
+ const customElementName = toCustomElementName(componentDefinition.name + skin.id);
2425
+ if (!seen2.includes(customElementName)) {
2426
+ createCustomWebComponent(customElementName, loaderConfig.HTML, loaderConfig.shadowRootMode);
2427
+ seen2.push(customElementName);
2428
+ }
2429
+ element = document.createElement(customElementName);
2430
+ }
2431
+ if (!container.querySelector('[id^="myop-comp-"]'))
2432
+ container.innerHTML = "";
2433
+ element.id = domId;
2434
+ if (options == null ? void 0 : options.hidden) {
2435
+ element.style.opacity = "0";
2436
+ element.style.position = "absolute";
2437
+ element.style.height = "0";
2438
+ element.style.width = "0";
2439
+ element.style.pointerEvents = "none";
2440
+ element.style.visibility = "hidden";
2441
+ }
2442
+ this.appendChild(container, element, options);
2443
+ return new MyopWebComponent(componentDefinition, skin, container, element, options);
2444
+ }));
2445
+ }
2446
+ };
2447
+
2448
+ // src/host/myopOverride.ts
2449
+ var checkMyopOverride = (componentConfig) => __async(void 0, null, function* () {
2450
+ try {
2451
+ const url = new URL(window.location.href);
2452
+ const params = new URLSearchParams(url.search);
2453
+ const myopOverride = params.get("myopOverride");
2454
+ if (myopOverride) {
2455
+ const [source, ...uuids] = decompressUUIDs(myopOverride);
2456
+ switch (source) {
2457
+ case "component":
2458
+ {
2459
+ const [componentId, skinId] = uuids;
2460
+ const componentToOverride = yield CloudRepository.Main.fetchComponent(componentId);
2461
+ if (componentToOverride) {
2462
+ const skin = componentToOverride.type.skins.find((skin2) => skin2.id === skinId);
2463
+ if (skin) {
2464
+ componentToOverride.instance.skinSelector = {
2465
+ type: SkinSelectorTypes.Dedicated,
2466
+ skin: {
2467
+ id: skinId
2468
+ }
2469
+ };
2470
+ return componentToOverride;
2471
+ }
2472
+ }
2473
+ }
2474
+ break;
2475
+ // case 'flow': {
2476
+ default:
2477
+ {
2478
+ const [flowId, experimentId] = decompressUUIDs(myopOverride);
2479
+ const flow = yield CloudRepository.Main.fetchFlow(flowId);
2480
+ const componentToOverride = flow.components.find((c) => c.type.id === componentConfig.type.id);
2481
+ if (componentToOverride) {
2482
+ if (componentToOverride.instance.skinSelector.type === SkinSelectorTypes.Segmented) {
2483
+ if (componentToOverride.instance.resolvedExperiences) {
2484
+ const resolvedExperience = componentToOverride.instance.resolvedExperiences.find((e) => e.id === experimentId);
2485
+ if ((resolvedExperience == null ? void 0 : resolvedExperience.type) === ExperienceTypes.Segment) {
2486
+ const typedResolvedExperience = resolvedExperience;
2487
+ const typedSkinSelector = componentToOverride.instance.skinSelector;
2488
+ const segment = typedSkinSelector.segments.find((s) => s.segmentId === typedResolvedExperience.segment.id);
2489
+ if (segment) {
2490
+ componentToOverride.instance.skinSelector = segment == null ? void 0 : segment.skinSelector;
2491
+ return componentToOverride;
2492
+ }
2493
+ }
2494
+ }
2495
+ }
2496
+ }
2497
+ }
2498
+ break;
2499
+ }
2500
+ }
2501
+ } finally {
2502
+ return null;
2503
+ }
2504
+ });
2505
+
2506
+ // src/host/hostSDK.ts
2507
+ var __ROOT_SDK_PUBLIC_URL__ = "https://cdn.myop.dev/sdk/next/myop_sdk.min.js";
2508
+ var HostSDK = class {
2509
+ constructor() {
2510
+ __publicField(this, "components2init", []);
2511
+ __publicField(this, "components", []);
2512
+ __publicField(this, "componentsLoaders", []);
2513
+ __publicField(this, "initiated", false);
2514
+ __publicField(this, "version", myop_sdk_version_default);
2515
+ __publicField(this, "type2InstanceCount", {});
2516
+ __publicField(this, "assignId", (componentDefinition) => {
2517
+ if (!this.type2InstanceCount[componentDefinition.id]) {
2518
+ this.type2InstanceCount[componentDefinition.id] = 0;
2519
+ }
2520
+ return `${componentDefinition.id}_${++this.type2InstanceCount[componentDefinition.id]}`;
2521
+ });
2522
+ //TODO : fix the inspect implementation inside refComponent
2523
+ //then inspected maybe can be dropped
2524
+ __publicField(this, "inspected", false);
2525
+ __publicField(this, "inspect", () => {
2526
+ if (this.inspected)
2527
+ return;
2528
+ this.inspected = true;
2529
+ this.components.forEach((component) => {
2530
+ if (component.inspect) {
2531
+ component.inspect();
2532
+ }
2533
+ });
2534
+ });
2535
+ __publicField(this, "incomingMessageHandler", (event) => {
2536
+ if (event.origin === document.location.origin) {
2537
+ }
2538
+ if (event.data.myop) {
2539
+ if (event.data.direction !== MessageDirection.up && event.data.messageType !== MyopMessages.EnvelopedMessage) {
2540
+ return;
2541
+ }
2542
+ const myopMessage = event.data;
2543
+ if (myopMessage.messageType === MyopMessages.InitRequest) {
2544
+ this.components2init.forEach((component2) => {
2545
+ component2.send(new InitMessage(component2.id));
2546
+ });
2547
+ return;
2548
+ }
2549
+ if (myopMessage.messageType === MyopMessages.InitResponse) {
2550
+ this.components2init = this.components2init.filter((component2) => component2.id !== myopMessage.content.id);
2551
+ const initiatedComponent = this.components.find((component2) => {
2552
+ var _a;
2553
+ return component2.id === ((_a = myopMessage.content) == null ? void 0 : _a.id);
2554
+ });
2555
+ initiatedComponent == null ? void 0 : initiatedComponent.setInitiated();
2556
+ return;
2557
+ }
2558
+ if (myopMessage.messageType === MyopMessages.EnvelopedMessage) {
2559
+ const typedMessage = myopMessage;
2560
+ const refComponent = this.components.find((component2) => component2.id === typedMessage.destination);
2561
+ if (refComponent) {
2562
+ if (typedMessage.direction === MessageDirection.down) {
2563
+ if (typedMessage.message.messageType === ExecuteComponentMethod.name) {
2564
+ refComponent.onMessageReceived(typedMessage.message);
2565
+ } else {
2566
+ typedMessage.message.route = typedMessage.route;
2567
+ refComponent.send(typedMessage.message);
2568
+ }
2569
+ return;
2570
+ }
2571
+ } else {
2572
+ const innerComponent = this.components.find((component2) => component2.id === typedMessage.message.destination);
2573
+ if (innerComponent) {
2574
+ innerComponent.send(typedMessage.message);
2575
+ } else {
2576
+ }
2577
+ }
2578
+ return;
2579
+ }
2580
+ const component = this.components.find((component2) => component2.id === myopMessage.destination);
2581
+ if (!component) {
2582
+ if (window.myop.IframeSDK) {
2583
+ window.myop.IframeSDK.messageToHost(myopMessage);
2584
+ }
2585
+ return;
2586
+ }
2587
+ if (component) {
2588
+ if (component.onMessageReceived(myopMessage)) {
2589
+ return;
2590
+ } else {
2591
+ if (window.myop.IframeSDK)
2592
+ window.myop.IframeSDK.messageToHost(myopMessage);
2593
+ }
2594
+ }
2595
+ }
2596
+ });
2597
+ __publicField(this, "send", (message) => {
2598
+ const syntheticEvent = new MessageEvent(
2599
+ "",
2600
+ { data: message }
2601
+ );
2602
+ this.incomingMessageHandler(syntheticEvent);
2603
+ });
2604
+ __publicField(this, "init", (customComponentLoaderCreators) => {
2605
+ if (this.initiated) {
2606
+ throw new Error("hostSDK already initiated");
2607
+ }
2608
+ const basicLoaders = [
2609
+ new MyopIframeLoader(),
2610
+ new WebcomponentLoader(),
2611
+ new HTMLComponentLoader()
2612
+ ];
2613
+ this.componentsLoaders = [
2614
+ ...basicLoaders
2615
+ ];
2616
+ if (customComponentLoaderCreators) {
2617
+ const loaderByType = {};
2618
+ customComponentLoaderCreators.forEach((customComponentLoaderCreator) => {
2619
+ const customLoader = new customComponentLoaderCreator(this.componentsLoaders);
2620
+ loaderByType[customLoader.type] = customLoader;
2621
+ });
2622
+ this.componentsLoaders.forEach((loader) => {
2623
+ if (!loaderByType[loader.type])
2624
+ loaderByType[loader.type] = loader;
2625
+ });
2626
+ this.componentsLoaders = Object.values(loaderByType);
2627
+ }
2628
+ window.addEventListener(
2629
+ "message",
2630
+ this.incomingMessageHandler,
2631
+ false
2632
+ );
2633
+ console.log("myop hostSDK initiated", document.location.href);
2634
+ this.initiated = true;
2635
+ });
2636
+ __publicField(this, "_getSkinIdBySkinSelector", (_0, ..._1) => __async(this, [_0, ..._1], function* (skinSelector, experiences = [], hooks) {
2637
+ var _a;
2638
+ function asyncFind(array, predicate) {
2639
+ return __async(this, null, function* () {
2640
+ for (const item of array) {
2641
+ if (yield predicate(item)) {
2642
+ return item;
2643
+ }
2644
+ }
2645
+ return void 0;
2646
+ });
2647
+ }
2648
+ switch (skinSelector.type) {
2649
+ // @ts-ignore
2650
+ case "DedicatedSkin":
2651
+ //backward compatibility
2652
+ case SkinSelectorTypes.Dedicated:
2653
+ {
2654
+ let selectedSkinId = ((_a = skinSelector.skin) == null ? void 0 : _a.id) || skinSelector.skins[0].id;
2655
+ return selectedSkinId;
2656
+ }
2657
+ break;
2658
+ case SkinSelectorTypes.Segmented:
2659
+ {
2660
+ const typedSkinSelector = skinSelector;
2661
+ const segment = yield asyncFind(typedSkinSelector.segments, (segment2) => __async(this, null, function* () {
2662
+ if (segment2.segmentId === "Default") {
2663
+ return true;
2664
+ }
2665
+ const experience = experiences.find((experience2) => {
2666
+ if (experience2.type === ExperienceTypes.Segment) {
2667
+ return experience2.segment.id === segment2.segmentId;
2668
+ }
2669
+ return false;
2670
+ });
2671
+ if (!experience) {
2672
+ throw new Error("experience not found");
2673
+ }
2674
+ const typedExperience = experience;
2675
+ const typedSegment = typedExperience.segment;
2676
+ const segmentFunction = (hooks ? hooks : {})[typedSegment.function];
2677
+ if (segmentFunction) {
2678
+ const results = yield segmentFunction();
2679
+ return results;
2680
+ } else {
2681
+ console.warn(`segmentId:${segment2.segmentId}, ${typedSegment.function} function not provided !`);
2682
+ }
2683
+ return false;
2684
+ }));
2685
+ if (segment)
2686
+ return this._getSkinIdBySkinSelector(segment.skinSelector, experiences);
2687
+ else {
2688
+ debugger;
2689
+ }
2690
+ }
2691
+ break;
2692
+ default: {
2693
+ debugger;
2694
+ }
2695
+ }
2696
+ return "";
2697
+ }));
2698
+ __publicField(this, "runSkinSelector", (componentConfig, hooks) => __async(this, null, function* () {
2699
+ const skinId = yield this._getSkinIdBySkinSelector(componentConfig.instance.skinSelector, componentConfig.instance.resolvedExperiences, hooks);
2700
+ return componentConfig.type.skins.find((skin) => skin.id === skinId);
2701
+ }));
2702
+ __publicField(this, "loaderHooks");
2703
+ __publicField(this, "loadComponent", (componentConfig, container, options) => __async(this, null, function* () {
2704
+ var _a, _b, _c, _d;
2705
+ if (!container) {
2706
+ debugger;
2707
+ throw new Error("no container was found for this component");
2708
+ }
2709
+ const overriddenConfig = yield checkMyopOverride(componentConfig);
2710
+ if (overriddenConfig) {
2711
+ componentConfig = overriddenConfig;
2712
+ }
2713
+ const hooks = __spreadValues(__spreadValues({}, (_a = this.loaderHooks) != null ? _a : {}), (_b = options == null ? void 0 : options.hooks) != null ? _b : {});
2714
+ const ref = container;
2715
+ if (ref.myop) {
2716
+ if (ref.component) {
2717
+ componentConfig = __spreadValues({}, componentConfig);
2718
+ componentConfig.instance = __spreadValues({}, componentConfig.instance);
2719
+ let selectedSkin2 = yield this.runSkinSelector(componentConfig, hooks);
2720
+ if (!selectedSkin2) {
2721
+ throw new Error("runSkinSelector failed to choose skin, check the provided config");
2722
+ }
2723
+ if ((_c = options == null ? void 0 : options.hooks) == null ? void 0 : _c.afterSkinSelected) {
2724
+ selectedSkin2 = yield options.hooks.afterSkinSelected(__spreadValues({}, selectedSkin2));
2725
+ }
2726
+ componentConfig.instance.skinSelector = {
2727
+ type: SkinSelectorTypes.Dedicated,
2728
+ skin: selectedSkin2
2729
+ // skins: [selectedSkin]
2730
+ };
2731
+ if (options) {
2732
+ options = __spreadValues({}, options);
2733
+ delete options.hooks;
2734
+ }
2735
+ const refComponent = yield createRefComponent(ref, componentConfig, this.components, options);
2736
+ return refComponent;
2737
+ } else {
2738
+ throw new Error("load component got a detached ref.");
2739
+ }
2740
+ }
2741
+ container = container;
2742
+ let selectedSkin = yield this.runSkinSelector(componentConfig, hooks);
2743
+ if (!selectedSkin) {
2744
+ throw new Error("runSkinSelector failed to choose skin, check the provided config");
2745
+ }
2746
+ if ((_d = options == null ? void 0 : options.hooks) == null ? void 0 : _d.afterSkinSelected) {
2747
+ selectedSkin = yield options.hooks.afterSkinSelected(__spreadValues({}, selectedSkin));
2748
+ }
2749
+ const componentLoader = this.componentsLoaders.find((loader) => loader.type === selectedSkin.loader.type);
2750
+ if (!componentLoader) {
2751
+ debugger;
2752
+ throw new Error(`no loader "${selectedSkin.loader.type}" was found for component`);
2753
+ }
2754
+ let component = yield componentLoader.load(componentConfig.type, selectedSkin, container, options);
2755
+ if (!component.isInitiated)
2756
+ this.components2init.push(component);
2757
+ component.bind("onDispose", () => {
2758
+ this.components = this.components.filter((c) => c !== component);
2759
+ this.components2init = this.components2init.filter((c) => c !== component);
2760
+ return true;
2761
+ });
2762
+ this.components.push(component);
2763
+ if (!options || options.connectProps !== false) {
2764
+ component = connectProps(component, componentConfig.type.props, selectedSkin);
2765
+ }
2766
+ try {
2767
+ yield connectRefs(component, componentConfig, this.components);
2768
+ } catch (e) {
2769
+ throw e;
2770
+ }
2771
+ if (!(options == null ? void 0 : options.skipInit))
2772
+ yield component.initiated();
2773
+ return component;
2774
+ }));
2775
+ __publicField(this, "navigate", (component, newComponentConfig, options) => __async(this, null, function* () {
2776
+ if (component.parent) {
2777
+ throw new Error("Navigating on remote ref components is not implemented yet");
2778
+ }
2779
+ if (options == null ? void 0 : options.staged) {
2780
+ let newComponent = yield this.loadComponent(newComponentConfig, component.container, __spreadValues({
2781
+ hidden: true,
2782
+ relative: { direction: "after", child: component.element }
2783
+ }, options));
2784
+ if (options.init)
2785
+ yield options.init(newComponent);
2786
+ newComponent.show();
2787
+ component.dispose();
2788
+ return newComponent;
2789
+ } else {
2790
+ const nextSibling = component.element.nextSibling;
2791
+ component.dispose();
2792
+ return this.loadComponent(newComponentConfig, component.container, __spreadValues({
2793
+ relative: {
2794
+ direction: "before",
2795
+ child: nextSibling
2796
+ }
2797
+ }, options));
2798
+ }
2799
+ }));
2800
+ }
2801
+ };
2802
+ __publicField(HostSDK, "Instance", () => window.myop.hostSDK);
2803
+ if (!window.myop) {
2804
+ window.myop = {
2805
+ __ROOT_SDK_PUBLIC_URL__
2806
+ };
2807
+ }
2808
+ if (!window.myop.hostSDK) {
2809
+ const _hostSDK = new HostSDK();
2810
+ _hostSDK.init();
2811
+ if (!window.myop) {
2812
+ window.myop = {
2813
+ __ROOT_SDK_PUBLIC_URL__
2814
+ };
2815
+ }
2816
+ window.myop.hostSDK = _hostSDK;
2817
+ }
2818
+ var hostSDK = window.myop.hostSDK;
2819
+ defineDynamicImport("hostSDK", hostSDK);
2820
+
2821
+ // src/helpers/EnableV2.ts
2822
+ var _v2_CloudRepository = class _v2_CloudRepository {
2823
+ constructor(_baseUrl = "https://cloud.myop.dev") {
2824
+ this._baseUrl = _baseUrl;
2825
+ __publicField(this, "variants", {});
2826
+ }
2827
+ fetchComponent(componentId, environmentIdentifier) {
2828
+ return __async(this, null, function* () {
2829
+ if (!this.variants[componentId]) {
2830
+ this.variants[componentId] = new Promise(
2831
+ (resolve, reject) => __async(this, null, function* () {
2832
+ try {
2833
+ const res = yield fetch(
2834
+ `${this._baseUrl}/consume?id=${componentId}&env=${environmentIdentifier}`
2835
+ );
2836
+ const json = yield res.json();
2837
+ resolve(json.item);
2838
+ } catch (e) {
2839
+ reject(e);
2840
+ }
2841
+ })
2842
+ );
2843
+ }
2844
+ return yield this.variants[componentId];
2845
+ });
2846
+ }
2847
+ };
2848
+ __publicField(_v2_CloudRepository, "Main", new _v2_CloudRepository());
2849
+ var v2_CloudRepository = _v2_CloudRepository;
2850
+ var enableV2 = (environmentIdentifier, cloudRepository) => {
2851
+ const _cloudRepository = cloudRepository ? cloudRepository : new v2_CloudRepository();
2852
+ return {
2853
+ loadComponent: (componentId, container, options) => __async(void 0, null, function* () {
2854
+ const config = yield _cloudRepository.fetchComponent(componentId, environmentIdentifier);
2855
+ if (!config.consume_variant || !config.consume_variant.length) {
2856
+ console.warn(
2857
+ `[Myop Warning] Component "${componentId}" has no implementation for environment "${environmentIdentifier}".`
2858
+ );
2859
+ }
2860
+ const componentConfig = {
2861
+ instance: {
2862
+ id: "auto",
2863
+ componentId: config.componentId,
2864
+ componentName: config.name,
2865
+ skinSelector: {
2866
+ type: "Dedicated",
2867
+ skin: {
2868
+ id: "skin_auto_v2_converted"
2869
+ }
2870
+ }
2871
+ },
2872
+ type: {
2873
+ id: config.id,
2874
+ name: config.name,
2875
+ description: config.description,
2876
+ props: [
2877
+ {
2878
+ id: "in_auto_v2_converted",
2879
+ name: "myop_init_interface",
2880
+ type: "any",
2881
+ behavior: {
2882
+ type: PropConfigBehaviorTypes.code
2883
+ }
2884
+ },
2885
+ {
2886
+ id: "out_auto_v2_converted",
2887
+ name: "myop_cta_handler",
2888
+ type: "any",
2889
+ behavior: {
2890
+ type: PropConfigBehaviorTypes.code
2891
+ }
2892
+ }
2893
+ ],
2894
+ refs: [],
2895
+ skins: [
2896
+ {
2897
+ id: "skin_auto_v2_converted",
2898
+ name: "auto_v2_converted",
2899
+ description: "",
2900
+ //TODO : handle empty :
2901
+ // @ts-ignore
2902
+ loader: config.consume_variant[0].loader
2903
+ }
2904
+ ],
2905
+ defaultSkin: 0
2906
+ },
2907
+ name: config.name
2908
+ };
2909
+ return yield hostSDK.loadComponent(componentConfig, container, options);
2910
+ })
2911
+ };
2912
+ };
399
2913
  export {
400
2914
  CloudRepository,
401
2915
  ComponentConfig,
@@ -405,7 +2919,9 @@ export {
405
2919
  applyStylesheetLink,
406
2920
  changeSkinUrlByTokenizer,
407
2921
  createIframeSkinByTokenizer,
2922
+ enableV2,
408
2923
  exec,
409
- removeClass
2924
+ removeClass,
2925
+ v2_CloudRepository
410
2926
  };
411
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3V0aWxzL3V1aWQudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0Jhc2VNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9FeGVjdXRlU2NyaXB0TWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ3VzdG9tUmVmTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvaGVscGVycy9hcHBseVN0eWxlc2hlZXQudHMiLCAiLi4vLi4vLi4vc3JjL2hlbHBlcnMvaWZyYW1lU2tpblVybFRva2VuaXplci50cyIsICIuLi8uLi8uLi9zcmMvaGVscGVycy9jbGFzc0xpc3QudHMiLCAiLi4vLi4vLi4vc3JjL2hlbHBlcnMvY29uZmlnQnVpbGRlci50cyIsICIuLi8uLi8uLi9zcmMvaGVscGVycy9DbG91ZFJlcG9zaXRvcnkudHMiLCAiLi4vLi4vLi4vc3JjL2hlbHBlcnMvZXhlYy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLy9UT0RPIDogcmV1c2UgZnJvbSBvbmUgcGxhY2UuXG4vLyBuZWVkcyB0byBiZSB1c2VkIGluIG15b3Atc2RrLCBteW9wLWRhc2hiYW9yZCwgbXlvcC1zZXJ2ZXIsIG15b3AtY2xpIC4uXG5cbmV4cG9ydCBjb25zdCB1dWlkdjQgPSAoKSA9PiB7XG4gICAgcmV0dXJuIFwiMTAwMDAwMDAtMTAwMC00MDAwLTgwMDAtMTAwMDAwMDAwMDAwXCIucmVwbGFjZSgvWzAxOF0vZywgYyA9PlxuICAgICAgICAoK2MgXiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KDEpKVswXSAmIDE1ID4+ICtjIC8gNCkudG9TdHJpbmcoMTYpXG4gICAgKTtcbn1cblxuLy8gQ29udmVydCBVVUlEIHN0cmluZyB0byBieXRlc1xuZXhwb3J0IGNvbnN0IHV1aWRUb0J5dGVzID0gKHV1aWQ6IHN0cmluZyk6IFVpbnQ4QXJyYXkgPT4ge1xuICAgIHJldHVybiBVaW50OEFycmF5LmZyb20oXG4gICAgICAgIHV1aWQucmVwbGFjZSgvLS9nLCAnJykubWF0Y2goLy57MSwyfS9nKSEubWFwKGJ5dGUgPT4gcGFyc2VJbnQoYnl0ZSwgMTYpKVxuICAgICk7XG59O1xuXG4vLyBDb252ZXJ0IGJ5dGVzIHRvIFVVSUQgc3RyaW5nXG5leHBvcnQgY29uc3QgYnl0ZXNUb1V1aWQgPSAoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGhleCA9IFsuLi5ieXRlc10ubWFwKGIgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgaGV4LnNsaWNlKDAsIDgpLFxuICAgICAgICBoZXguc2xpY2UoOCwgMTIpLFxuICAgICAgICBoZXguc2xpY2UoMTIsIDE2KSxcbiAgICAgICAgaGV4LnNsaWNlKDE2LCAyMCksXG4gICAgICAgIGhleC5zbGljZSgyMClcbiAgICBdLmpvaW4oJy0nKTtcbn07XG5cbi8vIEJhc2U2NCBVUkwtc2FmZSBlbmNvZGVcbmV4cG9ydCBjb25zdCBiYXNlNjRVcmxFbmNvZGUgPSAoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGJhc2U2NCA9IGJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZSguLi5ieXRlcykpO1xuICAgIHJldHVybiBiYXNlNjQucmVwbGFjZSgvXFwrL2csICctJykucmVwbGFjZSgvXFwvL2csICdfJykucmVwbGFjZSgvPSskLywgJycpO1xufTtcblxuLy8gQmFzZTY0IFVSTC1zYWZlIGRlY29kZVxuZXhwb3J0IGNvbnN0IGJhc2U2NFVybERlY29kZSA9IChzdHI6IHN0cmluZyk6IFVpbnQ4QXJyYXkgPT4ge1xuICAgIGxldCBiYXNlNjQgPSBzdHIucmVwbGFjZSgvLS9nLCAnKycpLnJlcGxhY2UoL18vZywgJy8nKTtcbiAgICB3aGlsZSAoYmFzZTY0Lmxlbmd0aCAlIDQpIGJhc2U2NCArPSAnPSc7XG4gICAgY29uc3QgYmluYXJ5ID0gYXRvYihiYXNlNjQpO1xuICAgIHJldHVybiBVaW50OEFycmF5LmZyb20oYmluYXJ5LCBjaGFyID0+IGNoYXIuY2hhckNvZGVBdCgwKSk7XG59O1xuXG4vLyBDb21wcmVzcyBhbiBhcnJheSBvZiBVVUlEcyBpbnRvIGEgc2hvcnQgVVJMLXNhZmUgc3RyaW5nXG5leHBvcnQgY29uc3QgY29tcHJlc3NVVUlEcyA9ICh1dWlkczogc3RyaW5nW10pOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGFsbEJ5dGVzID0gdXVpZHMuZmxhdE1hcCh1dWlkID0+IEFycmF5LmZyb20odXVpZFRvQnl0ZXModXVpZCkpKTtcbiAgICByZXR1cm4gYmFzZTY0VXJsRW5jb2RlKG5ldyBVaW50OEFycmF5KGFsbEJ5dGVzKSk7XG59O1xuXG4vLyBEZWNvbXByZXNzIGZyb20gVVJMLXNhZmUgc3RyaW5nIGJhY2sgdG8gYW4gYXJyYXkgb2YgVVVJRHNcbmV4cG9ydCBjb25zdCBkZWNvbXByZXNzVVVJRHMgPSAoZW5jb2RlZDogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAgIGNvbnN0IGJ5dGVzID0gYmFzZTY0VXJsRGVjb2RlKGVuY29kZWQpO1xuICAgIGlmIChieXRlcy5sZW5ndGggJSAxNiAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGlucHV0IGxlbmd0aCcpO1xuXG4gICAgY29uc3QgdXVpZHM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMTYpIHtcbiAgICAgICAgdXVpZHMucHVzaChieXRlc1RvVXVpZChieXRlcy5zbGljZShpLCBpICsgMTYpKSk7XG4gICAgfVxuICAgIHJldHVybiB1dWlkcztcbn07XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi9ob3N0XCI7XG5pbXBvcnQge0lSZWZDb25maWd9IGZyb20gXCIuLi9jb21tb25cIjtcblxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VEaXJlY3Rpb24ge1xuICAgIHN0YXRpYyBkb3duID0gJ2Rvd24nIGFzIGNvbnN0XG4gICAgc3RhdGljIHVwID0gJ3VwJyBhcyBjb25zdFxufVxuXG5leHBvcnQgdHlwZSBNZXNzYWdlRGlyZWN0aW9uT3B0aW9uID0gJ3VwJyB8ICdkb3duJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNeW9wTWVzc2FnZTxUID0gYW55PiB7XG4gICAgaWQgPSB1dWlkdjQoKVxuXG4gICAgc3RhdGljIGNyZWF0ZTxULCBVIGV4dGVuZHMgbmV3ICguLi5hcmdzOiBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8VT4pID0+IFQgPSB0eXBlb2YgdGhpcz4oXG4gICAgICAgIHRoaXM6IFUsXG4gICAgICAgIC4uLmFyZ3M6IENvbnN0cnVjdG9yUGFyYW1ldGVyczxVPlxuICAgICk6IEluc3RhbmNlVHlwZTx0eXBlb2YgdGhpcz4ge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHJldHVybiBuZXcgdGhpcyguLi5hcmdzKTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnbWVlc2FnZSBpZCBjcmVhdGVkJywgdGhpcy5pZCwgZG9jdW1lbnQubG9jYXRpb24uaHJlZik7XG4gICAgfVxuXG4gICAgbXlvcCA9IHRydWVcblxuICAgIGFic3RyYWN0IG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleSB8IHN0cmluZztcblxuICAgIGNvbnRlbnQ/OiBUXG5cbiAgICAvLyBUT0RPIDogY2FudCBiZSBvcHRpb25hbCBcbiAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICBkZXN0aW5hdGlvbj86IHN0cmluZ1xuXG4gICAgcm91dGU/OiBzdHJpbmdbXVxuXG4gICAgcmVmPzogUmVmXG5cbiAgICBkaXJlY3Rpb24/OiBNZXNzYWdlRGlyZWN0aW9uT3B0aW9uXG5cbiAgICBjbGVhbmFibGU6IGJvb2xlYW4gPSBmYWxzZVxuXG4gICAgaXNUeXBlb2YobXNnOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIG1zZy5tZXNzYWdlVHlwZSA9PT0gdGhpcy5tZXNzYWdlVHlwZVxuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE15b3BFbGVtZW50TWVzc2FnZTxUID0gYW55PiBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTxUPiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNeW9wQmluZFJlcGxheU1lc3NhZ2U8VCA9IGFueT4gZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8VD4ge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI/OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNeW9wQmluZE1lc3NhZ2U8VCA9IGFueSwgUiBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSA9IGFueT4gZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8VD4ge1xuXG4gICAgcHVibGljIGFic3RyYWN0IHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXk7XG5cbiAgICBwdWJsaWMgaGFuZGxlclVuaXF1ZUlkID0gdXVpZHY0KClcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBoYW5kbGVyOiAobWVzc2FnZTogUikgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcigpXG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVmIHtcbiAgICBwdWJsaWMgbXlvcCA9IHRydWU7XG5cbiAgICBwdWJsaWMgX19ub25Qcm94aWVkPzogUmVmO1xuXG4gICAgc3RhdGljIGNyZWF0ZShzZWxlY3Rvcjogc3RyaW5nLCByZWZDb25maWc/OiBJUmVmQ29uZmlnLCBjb21wb25lbnQ/OiBJTXlvcENvbXBvbmVudCkge1xuICAgICAgICBsZXQgX3JlZkNvbmZpZyA9IHJlZkNvbmZpZztcbiAgICAgICAgaWYgKCFfcmVmQ29uZmlnKSB7XG4gICAgICAgICAgICBfcmVmQ29uZmlnID0ge1xuICAgICAgICAgICAgICAgIGlkOiAnJyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnJyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgICAgICAgICAgc2VsZWN0b3JUeXBlOiAnaWQtYXR0cmlidXRlJyxcbiAgICAgICAgICAgICAgICBzZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgYmVoYXZpb3I6IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NvZGUnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBhcyBJUmVmQ29uZmlnXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBSZWYoX3JlZkNvbmZpZywgY29tcG9uZW50KTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmQ29uZmlnOiBJUmVmQ29uZmlnLCBwdWJsaWMgY29tcG9uZW50PzogSU15b3BDb21wb25lbnQpIHtcbiAgICAgICAgdGhpcy5fX25vblByb3hpZWQgPSB7XG4gICAgICAgICAgICAuLi50aGlzLFxuICAgICAgICAgICAgY29tcG9uZW50OiBudWxsIC8vIGluIG9yZGVyIHRvIGJlIHNlcmlhbGl6YWJsZVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtSb290UmVmfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0V4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UnXG5cbmNvbnN0IGZ1bmN0aW9uQm9keVJlZ2V4ID0gLyg/OmZ1bmN0aW9uXFxzKlxcdypcXHMqXFwoW14pXSpcXClcXHMqXFx7KFtcXHNcXFNdKj8pXFx9fChcXChbXildKlxcKVxccyo9PlxccypcXHsoW1xcc1xcU10qPylcXH0pKVxccyokLztcbmNvbnN0IGV4cHJlc3Npb25Cb2R5UmVnZXggPSAvXFwoXFxzKlteKV0rXFxzKlxcKVxccyo9PlxccyooLispLztcblxuZXhwb3J0IGNvbnN0IHN0cmlwRnVuY3Rpb24gPSAoY29udGVudDogc3RyaW5nKSA9PiB7XG4gICAgbGV0IG1hdGNoID0gY29udGVudC5tYXRjaChmdW5jdGlvbkJvZHlSZWdleCk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIHJldHVybiBtYXRjaFsxXSB8fCBtYXRjaFszXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgbWF0Y2ggPSBjb250ZW50Lm1hdGNoKGV4cHJlc3Npb25Cb2R5UmVnZXgpO1xuICAgICAgICBpZiAobWF0Y2gpXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hbMV0udHJpbSgpO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgc2NyaXB0SW5wdXRzID0ge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW5cbn0gfCB7fTtcblxuZXhwb3J0IHR5cGUgc2NyaXB0VmFyczxUPiA9IHtcbiAgICBzZW5kOiAoZGF0YTogVCkgPT4gdm9pZDtcbiAgICAvLyBjb21wbGV0ZVN0cmVhbTogKCkgPT4gdm9pZDtcbiAgICByb290UmVmOiBSb290UmVmO1xuICAgIG1ha2VTZXJpYWxpemFibGU6IHR5cGVvZiBtYWtlU2VyaWFsaXphYmxlXG59XG5cbmV4cG9ydCB0eXBlIGV4dGVuZGVkU2NyaXB0VmFyczxULCBJPiA9IHtcbiAgICBbSyBpbiBrZXlvZiBJXTogSVtLXTtcbn0gJiBzY3JpcHRWYXJzPFQ+XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlU2NyaXB0TWVzc2FnZTxUID0gYW55LCBJIGV4dGVuZHMgc2NyaXB0SW5wdXRzID0gYW55PiBleHRlbmRzIE15b3BCaW5kTWVzc2FnZTxzdHJpbmcsIEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2U8VD4+IHtcblxuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5O1xuICAgIG1lc3NhZ2VUeXBlID0gJ0V4ZWN1dGVTY3JpcHRNZXNzYWdlJztcbiAgICBzY3JpcHQ6IHN0cmluZyA9ICcnXG5cbiAgICBzdGF0aWMgcmVwbGllcktleSA9ICdzZW5kJztcbiAgICBzdGF0aWMgY29tcGxldGVTdHJlYW1LZXkgPSAnY29tcGxldGVTdHJlYW0nO1xuXG4gICAgY29uc3RydWN0b3Ioc2NyaXB0OiAodmFyczogZXh0ZW5kZWRTY3JpcHRWYXJzPFQsIEk+KSA9PiBULCBoYW5kbGVyOiAobWVzc2FnZTogRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZTxUPikgPT4gdm9pZCA9ICgpID0+IHtcbiAgICB9LCBwdWJsaWMgc2NyaXB0SW5wdXRzPzogSSkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICAgICAgdGhpcy5zY3JpcHQgPSBzY3JpcHQudG9TdHJpbmcoKTtcblxuICAgICAgICAvL1RPRE86IGNhbiBiZSByZW1vdmVcbiAgICAgICAgdGhpcy5jb250ZW50ID0gc2NyaXB0LnRvU3RyaW5nKClcbiAgICAgICAgdGhpcy5jb250ZW50ID0gc3RyaXBGdW5jdGlvbih0aGlzLmNvbnRlbnQpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2U8VCA9IGFueT4gZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2U8VD4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5O1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlcGxheVRvSGFuZGxlcjogc3RyaW5nLCBwdWJsaWMgY29udGVudDogVCkge1xuICAgICAgICBzdXBlcihyZXBsYXlUb0hhbmRsZXIpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge1xuICAgIEV4ZWN1dGVTY3JpcHRNZXNzYWdlLFxuICAgIEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UsXG4gICAgZXh0ZW5kZWRTY3JpcHRWYXJzLFxuICAgIHNjcmlwdElucHV0cywgc3RyaXBGdW5jdGlvblxufSBmcm9tIFwiLi9FeGVjdXRlU2NyaXB0TWVzc2FnZS50c1wiO1xuXG5leHBvcnQgdHlwZSBjdXN0b21SZWZTY3JpcHRJbnB1dHMgPSB7XG4gICAgZWxlbWVudElkOiBzdHJpbmcsXG4gICAgcmVmPzogSFRNTEVsZW1lbnQsXG4gICAgX3NjcmlwdD86IHN0cmluZyxcbiAgICBfX3NjcmlwdElucHV0cz86IE9iamVjdFxufTtcblxuZXhwb3J0IGNsYXNzIEN1c3RvbVJlZk1lc3NhZ2U8VCA9IGFueSwgSSBleHRlbmRzIHNjcmlwdElucHV0cyA9IGN1c3RvbVJlZlNjcmlwdElucHV0cz4gZXh0ZW5kcyBFeGVjdXRlU2NyaXB0TWVzc2FnZTxULCBJICYgY3VzdG9tUmVmU2NyaXB0SW5wdXRzPiB7XG5cbiAgICBjb25zdHJ1Y3RvcihzY3JpcHQ6ICh2YXJzOiBleHRlbmRlZFNjcmlwdFZhcnM8VCwgSSAmIGN1c3RvbVJlZlNjcmlwdElucHV0cz4pID0+IFQsXG4gICAgICAgICAgICAgICAgcHVibGljIHNjcmlwdElucHV0czogSSAmIGN1c3RvbVJlZlNjcmlwdElucHV0cyxcbiAgICAgICAgICAgICAgICBoYW5kbGVyOiAobWVzc2FnZTogRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZTxUPikgPT4gdm9pZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB9KSB7XG5cbiAgICAgICAgLy9tb2NrIHZhcnNcbiAgICAgICAgLy8gbGV0IHJvb3RSZWYsIGVsZW1lbnRJZCwgX3NjcmlwdCwgX19zY3JpcHRJbnB1dHM7XG4gICAgICAgIHN1cGVyKCh7cm9vdFJlZiwgZWxlbWVudElkLCBfc2NyaXB0LCBfX3NjcmlwdElucHV0c30pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlZnMgPSAocm9vdFJlZi5zaGFkb3dSb290IHx8IHJvb3RSZWYuY29udGFpbmVyKS5xdWVyeVNlbGVjdG9yQWxsKGBbJHsnbXlvcC1pZCd9PScke2VsZW1lbnRJZH0nXWApO1xuICAgICAgICAgICAgaWYgKHJlZnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gIGNvbnN0IHJlZiA9IHJlZnNbMF07XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiB0aGluayBhYm91dCBleHBvc2luZyBcInJlZnNcIiBhbmQgbm90IG9ubHkgXCJyZWZcIlxuICAgICAgICAgICAgICAgIC8vZm9yIGNhc2VzIHdoZXJlIHRoZSBSZWYgaGFzIG11bHRpcGxhdGUgaW1wbGVtZW50YXRpb25zXG5cbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgX19zY3JpcHRJbnB1dHMucmVmID0gcmVmc1swXTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGR5bmFtaWNGdW5jdGlvbiA9IG5ldyBGdW5jdGlvbihgcmV0dXJuICgke19zY3JpcHR9KSguLi5hcmd1bWVudHMpYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGR5bmFtaWNGdW5jdGlvbihfX3NjcmlwdElucHV0cyk7XG5cbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgLy9yZXR1cm4gRnVuY3Rpb24oJ3JlZicsICdyb290UmVmJywgLi4uT2JqZWN0LmtleXMoX19zY3JpcHRJbnB1dHMpLCBfc2NyaXB0ISkocmVmLCByb290UmVmLCAuLi5PYmplY3QudmFsdWVzKF9fc2NyaXB0SW5wdXRzKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsIGFzIFQ7XG4gICAgICAgIH0sIGhhbmRsZXIpO1xuXG4gICAgICAgIHRoaXMuc2NyaXB0SW5wdXRzID0ge1xuICAgICAgICAgICAgLi4uc2NyaXB0SW5wdXRzLFxuICAgICAgICAgICAgLy9fc2NyaXB0OiBzdHJpcEZ1bmN0aW9uKHNjcmlwdC50b1N0cmluZygpKSxcbiAgICAgICAgICAgIF9zY3JpcHQ6IHNjcmlwdC50b1N0cmluZygpXG4gICAgICAgIH07XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlICogYXMgQ1NTIGZyb20gXCJjc3N0eXBlXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vaG9zdFwiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi91dGlscy91dGlscy50c1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0TWVzc2FnZX0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5cbi8vIGlnbm9yaW5nIGRvY3VtZW50YXRpb25cbi8qKiBAaWdub3JlICovXG5leHBvcnQgaW50ZXJmYWNlIENTU1Byb3BlcnRpZXMgZXh0ZW5kcyBDU1MuUHJvcGVydGllczxzdHJpbmcgfCBudW1iZXI+IHtcbn1cblxuZXhwb3J0IHR5cGUgU3R5bGVzaGVldERlZmluaXRpb24gPSB7IFtrZXk6IHN0cmluZ106IENTU1Byb3BlcnRpZXMgfTtcblxuZXhwb3J0IGNvbnN0IGFwcGx5U3R5bGVzaGVldCA9IChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBzdHlsZXNoZWV0OiBTdHlsZXNoZWV0RGVmaW5pdGlvbiwgY3NzPzogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgdGFnSWQgPSBgbXlvcC1jc3MtJHt1dWlkdjQoKX1gO1xuICAgIGNvbXBvbmVudC5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoe3Jvb3RSZWYsIF9zdHlsZXNoZWV0LCBfdGFnSWQsIF9jc3N9KSA9PiB7XG4gICAgICAgIGNvbnN0IHN0eWxlVGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgc3R5bGVUYWcudHlwZSA9ICd0ZXh0L2Nzcyc7XG5cbiAgICAgICAgLy8gQnVpbGQgdGhlIENTUyBzdHJpbmcgZnJvbSB0aGUgc3R5bGVzIG9iamVjdFxuICAgICAgICBsZXQgY3NzU3RyaW5nID0gX2NzcztcblxuICAgICAgICBmb3IgKGNvbnN0IHNlbGVjdG9yIGluIF9zdHlsZXNoZWV0KSB7XG4gICAgICAgICAgICBjc3NTdHJpbmcgKz0gYCR7c2VsZWN0b3J9IHsgYDtcbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBfc3R5bGVzaGVldFtzZWxlY3Rvcl07XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICBjc3NTdHJpbmcgKz0gYCR7cHJvcGVydHl9OiAke3Byb3BlcnRpZXNbcHJvcGVydHldfTsgYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNzc1N0cmluZyArPSAnfSAnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHRoZSBDU1Mgc3RyaW5nIGFzIHRoZSBjb250ZW50IG9mIHRoZSA8c3R5bGU+IGVsZW1lbnRcbiAgICAgICAgc3R5bGVUYWcuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzU3RyaW5nKSk7XG4gICAgICAgIHN0eWxlVGFnLmlkID0gX3RhZ0lkO1xuICAgICAgICAvLyBBcHBlbmQgdGhlIDxzdHlsZT4gZWxlbWVudFxuICAgICAgICAocm9vdFJlZi5zaGFkb3dSb290IHx8IHJvb3RSZWYuY29udGFpbmVyKS5hcHBlbmRDaGlsZChzdHlsZVRhZyk7XG5cbiAgICB9LCAoKSA9PiB7XG4gICAgfSwge1xuICAgICAgICBfc3R5bGVzaGVldDogc3R5bGVzaGVldCxcbiAgICAgICAgX2NzcyA6IGNzcyA/IGNzcyA6ICcnLFxuICAgICAgICBfdGFnSWQ6IHRhZ0lkXG4gICAgfSkpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCh7cm9vdFJlZiwgX3RhZ0lkfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IChyb290UmVmLnNoYWRvd1Jvb3QgfHwgZG9jdW1lbnQpLmdldEVsZW1lbnRCeUlkKF90YWdJZCk7XG4gICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgX3RhZ0lkOiB0YWdJZFxuICAgICAgICB9KSlcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBhcHBseVN0eWxlc2hlZXRMaW5rID0gKGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIGxpbms6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHRhZ0lkID0gYG15b3AtY3NzLSR7dXVpZHY0KCl9YDtcbiAgICBjb21wb25lbnQuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKHtyb290UmVmLCBfdGFnSWQsIF9saW5rfSkgPT4ge1xuICAgICAgICBjb25zdCBsaW5rRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgICAgbGlua0VsZW1lbnQuaWQgPSBfdGFnSWQ7XG4gICAgICAgIGxpbmtFbGVtZW50LnJlbCA9ICdzdHlsZXNoZWV0JztcbiAgICAgICAgbGlua0VsZW1lbnQuaHJlZiA9IF9saW5rO1xuICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGxpbmtFbGVtZW50KTtcblxuICAgICAgICAvLyBBcHBlbmQgdGhlIDxzdHlsZT4gZWxlbWVudFxuICAgICAgICAocm9vdFJlZi5zaGFkb3dSb290IHx8IHJvb3RSZWYuY29udGFpbmVyKS5hcHBlbmRDaGlsZChsaW5rRWxlbWVudCk7XG4gICAgfSwgKCkgPT4ge1xuICAgIH0sIHtcbiAgICAgICAgX2xpbmsgOiBsaW5rLFxuICAgICAgICBfdGFnSWQ6IHRhZ0lkXG4gICAgfSkpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCh7cm9vdFJlZiwgX3RhZ0lkfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IChyb290UmVmLnNoYWRvd1Jvb3QgfHwgZG9jdW1lbnQpLmdldEVsZW1lbnRCeUlkKF90YWdJZCk7XG4gICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgX3RhZ0lkOiB0YWdJZFxuICAgICAgICB9KSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtJSWZyYW1lTG9hZGVyQ29uZmlnLCBJU2tpbkNvbmZpZ30gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5leHBvcnQgdHlwZSBUb2tlbk1hcCA9IFJlY29yZDxzdHJpbmcsIHN0cmluZ3wgbnVtYmVyPlxuXG5jb25zdCByZXBsYWNlVG9rZW5zID0gKGlucHV0OiBzdHJpbmcsIHRva2VuTWFwOiBUb2tlbk1hcCk6IHN0cmluZyA9PiB7XG4gICAgLy8gQ3JlYXRlIGEgcmVnZXggcGF0dGVybiBmcm9tIHRoZSBrZXlzIG9mIHRoZSB0b2tlbk1hcFxuICAgIGNvbnN0IHBhdHRlcm4gPSBuZXcgUmVnRXhwKE9iamVjdC5rZXlzKHRva2VuTWFwKS5qb2luKCd8JyksICdnJyk7XG5cbiAgICAvLyBSZXBsYWNlIHRva2VucyBpbiB0aGUgaW5wdXQgc3RyaW5nIHVzaW5nIHRoZSByZWdleFxuICAgIHJldHVybiBpbnB1dC5yZXBsYWNlKHBhdHRlcm4sIChtYXRjaGVkKSA9PiB7XG4gICAgICAgIC8vIFJldHVybiB0aGUgcmVwbGFjZW1lbnQgdmFsdWUgZnJvbSB0aGUgdG9rZW5NYXBcbiAgICAgICAgcmV0dXJuICh0b2tlbk1hcFttYXRjaGVkXSB8fCBtYXRjaGVkKS50b1N0cmluZygpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlSWZyYW1lU2tpbkJ5VG9rZW5pemVyID0gKHNlbGVjdGVkU2tpbjogSVNraW5Db25maWcsIHRva2VuTWFwOiBUb2tlbk1hcCkgPT4ge1xuICAgIGNvbnN0IHR5cGVkU2tpbkNvbmZpZyA9IChzZWxlY3RlZFNraW4ubG9hZGVyIGFzIElJZnJhbWVMb2FkZXJDb25maWcpXG4gICAgaWYgKHR5cGVkU2tpbkNvbmZpZy50eXBlICE9PSAnSWZyYW1lTG9hZGVyJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGlmcmFtZVNraW5VcmxUb2tlbml6ZXIgcmVjZWl2ZWQgc2tpbiB3aXRoIGxvYWRlciB0eXBlIFwiJHt0eXBlZFNraW5Db25maWcudHlwZX1cIiwgY3VycmVudGx5IG9ubHkgXCJJZnJhbWVMb2FkZXJcIiBpcyBzdXBwb3J0ZWRgKVxuICAgIH1cblxuICAgIHNlbGVjdGVkU2tpbi5sb2FkZXIgPSB7XG4gICAgICAgIC4uLnNlbGVjdGVkU2tpbi5sb2FkZXJcbiAgICB9XG5cbiAgICBzZWxlY3RlZFNraW4ubG9hZGVyLnVybCA9IHJlcGxhY2VUb2tlbnMoc2VsZWN0ZWRTa2luLmxvYWRlci51cmwsIHRva2VuTWFwKTtcblxuICAgIHJldHVybiBzZWxlY3RlZFNraW47XG59XG5cbmV4cG9ydCBjb25zdCBjaGFuZ2VTa2luVXJsQnlUb2tlbml6ZXIgPSAodG9rZW5NYXA6IFRva2VuTWFwKSA9PiB7XG4gICAgcmV0dXJuIGFzeW5jIChzZWxlY3RlZFNraW46IElTa2luQ29uZmlnKSA9PiB7XG4gICAgICAgIHJldHVybiBjcmVhdGVJZnJhbWVTa2luQnlUb2tlbml6ZXIoc2VsZWN0ZWRTa2luLCB0b2tlbk1hcCk7XG4gICAgfVxufSIsICJpbXBvcnQge0N1c3RvbVJlZk1lc3NhZ2V9IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uL2hvc3RcIjtcblxuLy8gY29uc3Qgc3BhY2UgPSAnICc7XG4vLyBleHBvcnQgY29uc3QgZ2V0Q2xhc3NlcyA9IGFzeW5jIChjb25uZWN0ZWRSZWY6IFJlZik6IFByb21pc2U8c3RyaW5nW10+ID0+IChhd2FpdCBleGVjKGFjdEFzPEhUTUxEaXZFbGVtZW50Pihjb25uZWN0ZWRSZWYpLmNsYXNzTGlzdCkpLnZhbHVlLnNwbGl0KHNwYWNlKTtcbi8vIGV4cG9ydCBjb25zdCBhZGRDbGFzcyA9IGFzeW5jIChjb25uZWN0ZWRSZWY6IFJlZiwgY2xhc3NOYW1lOiBzdHJpbmcpID0+IHtcbi8vICAgICBjb25zdCBjbGFzc2VzID0gYXdhaXQgZ2V0Q2xhc3Nlcyhjb25uZWN0ZWRSZWYpO1xuLy8gICAgIGNsYXNzZXMuaW5jbHVkZXMoY2xhc3NOYW1lKSB8fCBjbGFzc2VzLnB1c2goY2xhc3NOYW1lKTtcbi8vICAgICAvLyBAdHMtaWdub3JlXG4vLyAgICAgY29ubmVjdGVkUmVmLmNsYXNzTGlzdCA9IGNsYXNzZXMuam9pbihzcGFjZSk7XG4vLyB9XG4vLyBleHBvcnQgY29uc3QgcmVtb3ZlQ2xhc3MgPSBhc3luYyAoY29ubmVjdGVkUmVmOiBSZWYsIGNsYXNzTmFtZTogc3RyaW5nLCkgPT4ge1xuLy8gICAgIGxldCBjbGFzc2VzID0gYXdhaXQgZ2V0Q2xhc3Nlcyhjb25uZWN0ZWRSZWYpO1xuLy8gICAgIC8vIEB0cy1pZ25vcmVcbi8vICAgICBjb25uZWN0ZWRSZWYuY2xhc3NMaXN0ID0gY2xhc3Nlcy5maWx0ZXIoYyA9PiBjICE9PSBjbGFzc05hbWUpLmpvaW4oc3BhY2UpO1xuLy8gfVxuLy9cbi8vXG5cbmV4cG9ydCBjb25zdCBhZGRDbGFzcyA9IChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBjbGFzc05hbWU6IHN0cmluZywgbXlvcElkOiBzdHJpbmcpID0+IHtcbiAgICBjb21wb25lbnQuc2VuZChuZXcgQ3VzdG9tUmVmTWVzc2FnZSgoe3JlZiwgX2NsYXNzTmFtZX0pID0+IHtcbiAgICAgICAgcmVmPy5jbGFzc0xpc3QuYWRkKF9jbGFzc05hbWUpO1xuICAgIH0sIHtcbiAgICAgICAgZWxlbWVudElkOiBteW9wSWQsXG4gICAgICAgIF9jbGFzc05hbWU6IGNsYXNzTmFtZVxuICAgIH0pKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJlbW92ZUNsYXNzID0gKGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIGNsYXNzTmFtZTogc3RyaW5nLCBteW9wSWQ6IHN0cmluZykgPT4ge1xuICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDdXN0b21SZWZNZXNzYWdlKCh7cmVmLCBfY2xhc3NOYW1lfSkgPT4ge1xuICAgICAgICByZWY/LmNsYXNzTGlzdC5yZW1vdmUoX2NsYXNzTmFtZSk7XG4gICAgfSwge1xuICAgICAgICBlbGVtZW50SWQ6IG15b3BJZCxcbiAgICAgICAgX2NsYXNzTmFtZTogY2xhc3NOYW1lXG4gICAgfSkpO1xufSIsICJpbXBvcnQge1xuICAgIElDb21wb25lbnRDb25maWcsXG4gICAgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnLCBJSFRNTExvYWRlckNvbmZpZywgSVJlZkNvbmZpZyxcbiAgICBJU2tpbkxvYWRlckNvbmZpZyxcbiAgICBJU2tpblNlbGVjdG9yQ29uZmlnLFxuICAgIElEZWRpY2F0ZWRTa2luQ29uZmlnLCBJU2tpbkNvbmZpZ1xufSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBTa2luQ29uZmlnIGltcGxlbWVudHMgSVNraW5Db25maWcge1xuICAgIF9ydW5UaW1lSW5zdGFuY2VJZCA9ICdydW50aW1lLWluc3RhbmNlLWlkLScgKyB1dWlkdjQoKTtcbiAgICBfcnVuVGltZUlkID0gJ3J1bnRpbWUtaWQtJyArIHV1aWR2NCgpO1xuICAgIF9ydW5UaW1lTmFtZSA9ICdydW50aW1lLW5hbWUtJyArIHV1aWR2NCgpO1xuXG4gICAgc3RhdGljIGNyZWF0ZSA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTa2luQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgaWQgPSB0aGlzLl9ydW5UaW1lSWQ7XG4gICAgbmFtZSA9IHRoaXMuX3J1blRpbWVOYW1lO1xuICAgIGRlc2NyaXB0aW9uID0gJyc7XG4gICAgbG9hZGVyID0gbnVsbCBhcyB1bmtub3duIGFzIElTa2luTG9hZGVyQ29uZmlnO1xuXG4gICAgd2l0aExvYWRlciA9IChsb2FkZXI6IElTa2luTG9hZGVyQ29uZmlnKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGVyID0gbG9hZGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB3aXRoSFRNTExvYWRlciA9IChsb2FkZXI6IE9taXQ8SUhUTUxMb2FkZXJDb25maWcsICd0eXBlJz4pID0+IHtcbiAgICAgICAgbG9hZGVyLnR5cGUgPSAnSFRNTExvYWRlcic7XG4gICAgICAgIHRoaXMubG9hZGVyID0gbG9hZGVyIGFzIElIVE1MTG9hZGVyQ29uZmlnO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBidWlsZCA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50Q29uZmlnIGltcGxlbWVudHMgSUNvbXBvbmVudENvbmZpZyB7XG4gICAgX3J1blRpbWVJbnN0YW5jZUlkID0gJ3J1bnRpbWUtaW5zdGFuY2UtaWQtJyArIHV1aWR2NCgpO1xuICAgIF9ydW5UaW1lSWQgPSAncnVudGltZS1pZC0nICsgdXVpZHY0KCk7XG4gICAgX3J1blRpbWVOYW1lID0gJ3J1bnRpbWUtbmFtZS0nICsgdXVpZHY0KCk7XG5cbiAgICBzdGF0aWMgY3JlYXRlID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudENvbmZpZygpO1xuICAgIH1cblxuICAgIGluc3RhbmNlID0ge1xuICAgICAgICBpZDogdGhpcy5fcnVuVGltZUluc3RhbmNlSWQsXG4gICAgICAgIGNvbXBvbmVudElkOiB0aGlzLl9ydW5UaW1lSWQsXG4gICAgICAgIGNvbXBvbmVudE5hbWU6IHRoaXMuX3J1blRpbWVOYW1lLFxuICAgICAgICBza2luU2VsZWN0b3I6IG51bGwgYXMgdW5rbm93biBhcyBJU2tpblNlbGVjdG9yQ29uZmlnXG4gICAgfSBhcyBJQ29tcG9uZW50SW5zdGFuY2VDb25maWc7XG5cbiAgICBuYW1lID0gdGhpcy5fcnVuVGltZU5hbWVcbiAgICB0eXBlID0ge1xuICAgICAgICBpZDogdGhpcy5fcnVuVGltZUlkLFxuICAgICAgICBuYW1lOiB0aGlzLl9ydW5UaW1lTmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICBwcm9wczogW10sXG4gICAgICAgIHJlZnM6IFtdLFxuICAgICAgICBza2luczogW10sXG4gICAgICAgIGRlZmF1bHRTa2luOiAwXG4gICAgfSBhcyBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1xuXG4gICAgd2l0aEluc3RhbmNlID0gKGluc3RhbmNlOiBJQ29tcG9uZW50SW5zdGFuY2VDb25maWcpID0+IHtcbiAgICAgICAgdGhpcy5pbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB3aXRoVHlwZSA9ICh0eXBlOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZykgPT4ge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB3aXRoTmFtZSA9IChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aERlZmF1bHRTa2luID0gKGRlZmF1bHRTa2luOiBJU2tpbkNvbmZpZykgPT4ge1xuICAgICAgICB0aGlzLnR5cGUuc2tpbnMucHVzaChkZWZhdWx0U2tpbik7XG4gICAgICAgIHRoaXMudHlwZS5kZWZhdWx0U2tpbiA9IHRoaXMudHlwZS5za2lucy5sZW5ndGggLSAxO1xuICAgICAgICB0aGlzLmluc3RhbmNlLnNraW5TZWxlY3RvciA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdEZWRpY2F0ZWQnLFxuICAgICAgICAgICAgc2tpbjoge1xuICAgICAgICAgICAgICAgIGlkOiBkZWZhdWx0U2tpbi5pZFxuICAgICAgICAgICAgfVxuICAgICAgICB9IGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnXG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aFJlZiA9IChyZWY6IElSZWZDb25maWcpID0+IHtcbiAgICAgICAgdGhpcy50eXBlLnJlZnMucHVzaChyZWYpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB3aXRoQmFzaWNSZWYgPSAocmVmU2VsZWN0b3I6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBuZXdCYXNpY1JlZiA9IHtcbiAgICAgICAgICAgIGlkOiAnJyxcbiAgICAgICAgICAgIG5hbWU6IHJlZlNlbGVjdG9yLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAgICAgc2VsZWN0b3JUeXBlOiAnaWQtYXR0cmlidXRlJyxcbiAgICAgICAgICAgIHNlbGVjdG9yOiByZWZTZWxlY3RvcixcbiAgICAgICAgICAgIGJlaGF2aW9yOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2NvZGUnXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gYXMgSVJlZkNvbmZpZ1xuXG4gICAgICAgIHRoaXMudHlwZS5yZWZzLnB1c2gobmV3QmFzaWNSZWYpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBidWlsZCA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcykpXG4gICAgfVxufVxuIiwgImltcG9ydCB7SVVzZXJGbG93fSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbi8qKlxuICpcbiAqICMjIE92ZXJ2aWV3XG4gKlxuICogVGhlIGBDbG91ZFJlcG9zaXRvcnlgIGNsYXNzIHNlcnZlcyBhcyBhIGNlbnRyYWxpemVkIGRhdGEgYWNjZXNzIGxheWVyIGZvciByZXRyaWV2aW5nIHVzZXIgZmxvd3MgYW5kIGNvbXBvbmVudHMgZnJvbSB0aGUgTXlvcC5kZXYgY2xvdWQgc2VydmljZS4gSXQgaW1wbGVtZW50cyBhIHNpbmdsZXRvbiBwYXR0ZXJuIGFuZCBwcm92aWRlcyBjYWNoaW5nIG1lY2hhbmlzbXMgdG8gb3B0aW1pemUgQVBJIGNhbGxzIGFuZCBpbXByb3ZlIHBlcmZvcm1hbmNlLlxuICpcbiAqICMjIENsYXNzIFN0cnVjdHVyZVxuICpcbiAqICMjIyBDb25zdHJ1Y3RvclxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Jhc2VVcmwgPSAnaHR0cHM6Ly9jbG91ZC5teW9wLmRldicpXG4gKiBgYGBcbiAqXG4gKiAqKlBhcmFtZXRlcnM6KipcbiAqIC0gYF9iYXNlVXJsYCAob3B0aW9uYWwpOiBUaGUgYmFzZSBVUkwgZm9yIHRoZSBNeW9wLmRldiBjbG91ZCBBUEkuIERlZmF1bHRzIHRvIGAnaHR0cHM6Ly9jbG91ZC5teW9wLmRldidgXG4gKlxuICogIyMjIFN0YXRpYyBQcm9wZXJ0aWVzXG4gKlxuICogIyMjIyBNYWluXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBzdGF0aWMgTWFpbiA9IG5ldyBDbG91ZFJlcG9zaXRvcnkoKTtcbiAqIGBgYFxuICpcbiAqIEEgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBgQ2xvdWRSZXBvc2l0b3J5YCBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkIHRocm91Z2hvdXQgdGhlIGFwcGxpY2F0aW9uIHdpdGhvdXQgY3JlYXRpbmcgbXVsdGlwbGUgaW5zdGFuY2VzLlxuICpcbiAqICMjIyBQcml2YXRlIFByb3BlcnRpZXNcbiAqXG4gKiAjIyMjIHVzZXJGbG93c1xuICogYGBgdHlwZXNjcmlwdFxuICogcHJpdmF0ZSB1c2VyRmxvd3M6IFJlY29yZDxzdHJpbmcsIFByb21pc2U8SVVzZXJGbG93Pj4gPSB7fTtcbiAqIGBgYFxuICpcbiAqIEEgY2FjaGUgb2JqZWN0IHRoYXQgc3RvcmVzIHByb21pc2VzIGZvciB1c2VyIGZsb3dzLCBpbmRleGVkIGJ5IGZsb3cgSUQuIFRoaXMgcHJldmVudHMgZHVwbGljYXRlIEFQSSBjYWxscyBmb3IgdGhlIHNhbWUgZmxvdyBhbmQgZW5zdXJlcyBjb25zaXN0ZW50IGRhdGEgcmV0cmlldmFsLlxuICpcbiAqICMjIyMgX2Jhc2VVcmxcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHByaXZhdGUgX2Jhc2VVcmw6IHN0cmluZ1xuICogYGBgXG4gKlxuICogVGhlIGJhc2UgVVJMIGZvciB0aGUgY2xvdWQgQVBJIGVuZHBvaW50cywgc2V0IGR1cmluZyBjb25zdHJ1Y3Rpb24uXG4gKlxuICogIyMgTWV0aG9kc1xuICpcbiAqICMjIyBmZXRjaEZsb3coZmxvd0lkOiBzdHJpbmcpXG4gKlxuICogUmV0cmlldmVzIGEgY29tcGxldGUgdXNlciBmbG93IGZyb20gdGhlIGNsb3VkIHJlcG9zaXRvcnksIGluY2x1ZGluZyBhbGwgcmVzb2x2ZWQgY29tcG9uZW50cy5cbiAqXG4gKiAqKlBhcmFtZXRlcnM6KipcbiAqIC0gYGZsb3dJZGA6IFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHVzZXIgZmxvdyB0byByZXRyaWV2ZVxuICpcbiAqICoqUmV0dXJuczoqKlxuICogLSBgUHJvbWlzZTxJVXNlckZsb3c+YDogQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbXBsZXRlIHVzZXIgZmxvdyBvYmplY3RcbiAqXG4gKiAqKkJlaGF2aW9yOioqXG4gKiAtIEltcGxlbWVudHMgcmVxdWVzdCBjYWNoaW5nIHRvIGF2b2lkIGR1cGxpY2F0ZSBBUEkgY2FsbHMgZm9yIHRoZSBzYW1lIGZsb3cgSURcbiAqIC0gTWFrZXMgYSBHRVQgcmVxdWVzdCB0byBgL2Zsb3c/aWQ9e2Zsb3dJZH0mcmVzb2x2ZT1jb21wb25lbnRzYFxuICogLSBBdXRvbWF0aWNhbGx5IHJlc29sdmVzIGNvbXBvbmVudCByZWZlcmVuY2VzIHdpdGhpbiB0aGUgZmxvd1xuICogLSBTdG9yZXMgdGhlIHByb21pc2UgaW4gdGhlIGNhY2hlIGZvciBmdXR1cmUgdXNlXG4gKlxuICogKipFeGFtcGxlIFVzYWdlOioqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBmbG93ID0gYXdhaXQgQ2xvdWRSZXBvc2l0b3J5Lk1haW4uZmV0Y2hGbG93KCdteS1mbG93LWlkJyk7XG4gKiBjb25zb2xlLmxvZyhmbG93LmNvbXBvbmVudHMpO1xuICogYGBgXG4gKlxuICogIyMjIGZldGNoQ29tcG9uZW50KGNvbXBvbmVudElkOiBzdHJpbmcsIGZsb3dJZDogc3RyaW5nKVxuICpcbiAqIFJldHJpZXZlcyBhIHNwZWNpZmljIGNvbXBvbmVudCBmcm9tIHdpdGhpbiBhIHVzZXIgZmxvdy5cbiAqXG4gKiAqKlBhcmFtZXRlcnM6KipcbiAqIC0gYGNvbXBvbmVudElkYDogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgY29tcG9uZW50IHRvIHJldHJpZXZlXG4gKiAtIGBmbG93SWRgOiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSB1c2VyIGZsb3cgY29udGFpbmluZyB0aGUgY29tcG9uZW50XG4gKlxuICogKipSZXR1cm5zOioqXG4gKiAtIGBQcm9taXNlPENvbXBvbmVudCB8IHVuZGVmaW5lZD5gOiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY29tcG9uZW50IG9iamVjdCBpZiBmb3VuZCwgb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZFxuICpcbiAqICoqQmVoYXZpb3I6KipcbiAqIC0gRmlyc3QgZmV0Y2hlcyB0aGUgY29tcGxldGUgZmxvdyB1c2luZyBgZmV0Y2hGbG93KClgXG4gKiAtIFNlYXJjaGVzIHRocm91Z2ggdGhlIGZsb3cncyBjb21wb25lbnRzIGFycmF5IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGNvbXBvbmVudFxuICogLSBVc2VzIHRoZSBjb21wb25lbnQncyBgdHlwZS5pZGAgcHJvcGVydHkgZm9yIG1hdGNoaW5nXG4gKlxuICogKipFeGFtcGxlIFVzYWdlOioqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBjb21wb25lbnQgPSBhd2FpdCBDbG91ZFJlcG9zaXRvcnkuTWFpbi5mZXRjaENvbXBvbmVudCgnYnV0dG9uLWNvbXBvbmVudCcsICdteS1mbG93LWlkJyk7XG4gKiBpZiAoY29tcG9uZW50KSB7XG4gKiAgICAgY29uc29sZS5sb2coJ0NvbXBvbmVudCBmb3VuZDonLCBjb21wb25lbnQpO1xuICogfSBlbHNlIHtcbiAqICAgICBjb25zb2xlLmxvZygnQ29tcG9uZW50IG5vdCBmb3VuZCBpbiBmbG93Jyk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiAjIyBBUEkgSW50ZWdyYXRpb25cbiAqXG4gKiAjIyMgRW5kcG9pbnQgU3RydWN0dXJlXG4gKlxuICogVGhlIGNsYXNzIGludGVncmF0ZXMgd2l0aCB0aGUgZm9sbG93aW5nIE15b3AuZGV2IGNsb3VkIEFQSSBlbmRwb2ludDpcbiAqXG4gKiBgYGBcbiAqIEdFVCB7YmFzZVVybH0vZmxvdz9pZD17Zmxvd0lkfSZyZXNvbHZlPWNvbXBvbmVudHNcbiAqIGBgYFxuICpcbiAqICoqUXVlcnkgUGFyYW1ldGVyczoqKlxuICogLSBgaWRgOiBUaGUgZmxvdyBpZGVudGlmaWVyXG4gKiAtIGByZXNvbHZlPWNvbXBvbmVudHNgOiBJbnN0cnVjdHMgdGhlIEFQSSB0byBpbmNsdWRlIHJlc29sdmVkIGNvbXBvbmVudCBkYXRhIGluIHRoZSByZXNwb25zZVxuICpcbiAqICMjIyBSZXNwb25zZSBGb3JtYXRcbiAqXG4gKiBUaGUgQVBJIGlzIGV4cGVjdGVkIHRvIHJldHVybiBhIEpTT04gcmVzcG9uc2Ugd2l0aCB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZTpcbiAqXG4gKiBgYGBqc29uXG4gKiB7XG4gKiAgICAgXCJpdGVtXCI6IHtcbiAqICAgICAgICAgLy8gSVVzZXJGbG93IG9iamVjdCB3aXRoIHJlc29sdmVkIGNvbXBvbmVudHNcbiAqICAgICAgICAgXCJjb21wb25lbnRzXCI6IFtcbiAqICAgICAgICAgICAgIHtcbiAqICAgICAgICAgICAgICAgICBcInR5cGVcIjoge1xuICogICAgICAgICAgICAgICAgICAgICBcImlkXCI6IFwiY29tcG9uZW50LWlkXCJcbiAqICAgICAgICAgICAgICAgICB9XG4gKiAgICAgICAgICAgICAgICAgLy8gLi4uIG90aGVyIGNvbXBvbmVudCBwcm9wZXJ0aWVzXG4gKiAgICAgICAgICAgICB9XG4gKiAgICAgICAgIF1cbiAqICAgICAgICAgLy8gLi4uIG90aGVyIGZsb3cgcHJvcGVydGllc1xuICogICAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqICMjIENhY2hpbmcgU3RyYXRlZ3lcbiAqXG4gKiBUaGUgYENsb3VkUmVwb3NpdG9yeWAgaW1wbGVtZW50cyBhIHByb21pc2UtYmFzZWQgY2FjaGluZyBtZWNoYW5pc206XG4gKlxuICogMS4gKipDYWNoZSBLZXkqKjogRmxvdyBJRCBpcyB1c2VkIGFzIHRoZSBjYWNoZSBrZXlcbiAqIDIuICoqQ2FjaGUgVmFsdWUqKjogUHJvbWlzZXMgYXJlIGNhY2hlZCByYXRoZXIgdGhhbiByZXNvbHZlZCB2YWx1ZXMgdG8gaGFuZGxlIGNvbmN1cnJlbnQgcmVxdWVzdHNcbiAqIDMuICoqQ2FjaGUgRHVyYXRpb24qKjogQ2FjaGUgcGVyc2lzdHMgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogNC4gKipDYWNoZSBJbnZhbGlkYXRpb24qKjogTm8gYXV0b21hdGljIGNhY2hlIGludmFsaWRhdGlvbiBpcyBpbXBsZW1lbnRlZFxuICpcbiAqICMjIEVycm9yIEhhbmRsaW5nXG4gKlxuICogLSBOZXR3b3JrIGVycm9ycyBhbmQgQVBJIGZhaWx1cmVzIGFyZSBwcm9wYWdhdGVkIHRocm91Z2ggcHJvbWlzZSByZWplY3Rpb25cbiAqIC0gTm8gc3BlY2lmaWMgZXJyb3IgaGFuZGxpbmcgb3IgcmV0cnkgbG9naWMgaXMgaW1wbGVtZW50ZWQgYXQgdGhlIHJlcG9zaXRvcnkgbGV2ZWxcbiAqIC0gQ29uc3VtZXJzIHNob3VsZCBpbXBsZW1lbnQgYXBwcm9wcmlhdGUgZXJyb3IgaGFuZGxpbmcgd2hlbiBjYWxsaW5nIHJlcG9zaXRvcnkgbWV0aG9kc1xuICpcbiAqICMjIFVzYWdlIFBhdHRlcm5zXG4gKlxuICogIyMjIFNpbmdsZXRvbiBBY2Nlc3NcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IENsb3VkUmVwb3NpdG9yeSB9IGZyb20gJy4vcGF0aC90by9DbG91ZFJlcG9zaXRvcnknO1xuICpcbiAqIC8vIFVzZSB0aGUgc2luZ2xldG9uIGluc3RhbmNlXG4gKiBjb25zdCBmbG93ID0gYXdhaXQgQ2xvdWRSZXBvc2l0b3J5Lk1haW4uZmV0Y2hGbG93KCdmbG93LWlkJyk7XG4gKiBgYGBcbiAqXG4gKiAjIyMgQ3VzdG9tIEluc3RhbmNlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBjdXN0b20gaW5zdGFuY2Ugd2l0aCBkaWZmZXJlbnQgYmFzZSBVUkxcbiAqIGNvbnN0IGN1c3RvbVJlcG8gPSBuZXcgQ2xvdWRSZXBvc2l0b3J5KCdodHRwczovL2N1c3RvbS1hcGkuZXhhbXBsZS5jb20nKTtcbiAqIGNvbnN0IGZsb3cgPSBhd2FpdCBjdXN0b21SZXBvLmZldGNoRmxvdygnZmxvdy1pZCcpO1xuICogYGBgXG4gKlxuICogIyMjIENvbXBvbmVudCBSZXRyaWV2YWxcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEdldCBhIHNwZWNpZmljIGNvbXBvbmVudCBmcm9tIGEgZmxvd1xuICogY29uc3QgY29tcG9uZW50ID0gYXdhaXQgQ2xvdWRSZXBvc2l0b3J5Lk1haW4uZmV0Y2hDb21wb25lbnQoJ2NvbXBvbmVudC1pZCcsICdmbG93LWlkJyk7XG4gKiBgYGBcbiAqXG4gKiAjIyBEZXBlbmRlbmNpZXNcbiAqXG4gKiAtICoqSVVzZXJGbG93Kio6IEludGVyZmFjZSBpbXBvcnRlZCBmcm9tIGAuLi9jb21tb25gIHRoYXQgZGVmaW5lcyB0aGUgc3RydWN0dXJlIG9mIHVzZXIgZmxvdyBvYmplY3RzXG4gKiAtICoqRmV0Y2ggQVBJKio6IFVzZXMgdGhlIG5hdGl2ZSBgZmV0Y2hgIGZ1bmN0aW9uIGZvciBIVFRQIHJlcXVlc3RzXG4gKlxuICogIyMgUGVyZm9ybWFuY2UgQ29uc2lkZXJhdGlvbnNcbiAqXG4gKiAtICoqQ2FjaGluZyoqOiBQcmV2ZW50cyBkdXBsaWNhdGUgQVBJIGNhbGxzIGZvciB0aGUgc2FtZSBmbG93IElEXG4gKiAtICoqUHJvbWlzZSBDYWNoaW5nKio6IEhhbmRsZXMgY29uY3VycmVudCByZXF1ZXN0cyBlZmZpY2llbnRseSBieSBjYWNoaW5nIHByb21pc2VzXG4gKiAtICoqQ29tcG9uZW50IFJlc29sdXRpb24qKjogVGhlIGByZXNvbHZlPWNvbXBvbmVudHNgIHBhcmFtZXRlciBlbnN1cmVzIGNvbXBvbmVudHMgYXJlIGZ1bGx5IHJlc29sdmVkIGluIGEgc2luZ2xlIEFQSSBjYWxsXG4gKlxuICogIyMgRnV0dXJlIEVuaGFuY2VtZW50c1xuICpcbiAqIFRoZSBjbGFzcyBzdHJ1Y3R1cmUgc3VnZ2VzdHMgcGxhbm5lZCBmdW5jdGlvbmFsaXR5IHRoYXQgY291bGQgYmUgaW1wbGVtZW50ZWQ6XG4gKlxuICogLSAqKkNvbXBvbmVudCBDYWNoaW5nKio6IFRoZSBjb21tZW50ZWQgYGNvbXBvbmVudHNgIHByb3BlcnR5IGluZGljYXRlcyBwb3RlbnRpYWwgaW5kaXZpZHVhbCBjb21wb25lbnQgY2FjaGluZ1xuICogLSAqKkNhY2hlIEludmFsaWRhdGlvbioqOiBNZXRob2RzIHRvIGNsZWFyIG9yIHJlZnJlc2ggY2FjaGVkIGRhdGFcbiAqIC0gKipFcnJvciBSZXRyeSBMb2dpYyoqOiBBdXRvbWF0aWMgcmV0cnkgbWVjaGFuaXNtcyBmb3IgZmFpbGVkIHJlcXVlc3RzXG4gKiAtICoqQmF0Y2ggT3BlcmF0aW9ucyoqOiBNZXRob2RzIHRvIGZldGNoIG11bHRpcGxlIGZsb3dzIG9yIGNvbXBvbmVudHMgaW4gYSBzaW5nbGUgcmVxdWVzdFxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIENsb3VkUmVwb3NpdG9yeSB7XG4gICAgc3RhdGljIE1haW4gPSBuZXcgQ2xvdWRSZXBvc2l0b3J5KCk7XG5cbiAgICBwcml2YXRlIHVzZXJGbG93czogUmVjb3JkPHN0cmluZywgUHJvbWlzZTxJVXNlckZsb3c+PiA9IHt9O1xuXG4gICAgLy8gcHJpdmF0ZSBjb21wb25lbnRzOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPElVc2VyRmxvdz4+ID0ge307XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9iYXNlVXJsID0gJ2h0dHBzOi8vY2xvdWQubXlvcC5kZXYnKSB7XG4gICAgfVxuXG4gICAgYXN5bmMgZmV0Y2hDb21wb25lbnQoY29tcG9uZW50SWQ6IHN0cmluZywgZmxvd0lkPzogc3RyaW5nKSB7XG4gICAgICAgIGlmIChmbG93SWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZsb3cgPSBhd2FpdCB0aGlzLmZldGNoRmxvdyhmbG93SWQpO1xuICAgICAgICAgICAgcmV0dXJuIGZsb3cuY29tcG9uZW50cy5maW5kKGMgPT4gYy50eXBlLmlkID09PSBjb21wb25lbnRJZCk7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgY29uc3QgZmxvdyA9IGF3YWl0IHRoaXMuZmV0Y2hBdXRvRmxvdyhjb21wb25lbnRJZCk7XG4gICAgICAgICAgICByZXR1cm4gZmxvdy5jb21wb25lbnRzWzBdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZmV0Y2hBdXRvRmxvdyhjb21wb25lbnRJZDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy51c2VyRmxvd3NbY29tcG9uZW50SWRdKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgICAgICAgICAgdGhpcy51c2VyRmxvd3NbY29tcG9uZW50SWRdID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5fYmFzZVVybH0vZmxvdz9pZD0ke2NvbXBvbmVudElkfSZhdXRvPXRydWVgXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGpzb24uaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy51c2VyRmxvd3NbY29tcG9uZW50SWRdO1xuICAgIH1cblxuXG4gICAgYXN5bmMgZmV0Y2hGbG93KGZsb3dJZDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy51c2VyRmxvd3NbZmxvd0lkXSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgICAgICAgIHRoaXMudXNlckZsb3dzW2Zsb3dJZF0gPSBuZXcgUHJvbWlzZShcbiAgICAgICAgICAgICAgICBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLl9iYXNlVXJsfS9mbG93P2lkPSR7Zmxvd0lkfSZyZXNvbHZlPWNvbXBvbmVudHNgXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGpzb24uaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy51c2VyRmxvd3NbZmxvd0lkXTtcbiAgICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IGV4ZWMgPSBhc3luYyAoZ2V0dGVyOiBhbnkpID0+IHtcbiAgICByZXR1cm4gYXdhaXQgZ2V0dGVyKClcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUdPLElBQU0sU0FBUyxNQUFNO0FBQ3hCLFNBQU8sdUNBQXVDO0FBQUEsSUFBUTtBQUFBLElBQVUsUUFDM0QsQ0FBQyxJQUFJLE9BQU8sZ0JBQWdCLElBQUksV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksR0FBRyxTQUFTLEVBQUU7QUFBQSxFQUNsRjtBQUNKOzs7QUNLTyxJQUFlLGtCQUFmLE1BQXdDO0FBQUEsRUFXM0MsY0FBYztBQVZkLDhCQUFLLE9BQU87QUFjWixnQ0FBTztBQUlQO0FBR0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUEscUNBQXFCO0FBQUEsRUFsQnJCO0FBQUEsRUFWQSxPQUFPLFVBRUEsTUFDc0I7QUFFekIsV0FBTyxJQUFJLEtBQUssR0FBRyxJQUFJO0FBQUEsRUFDM0I7QUFBQSxFQXdCQSxTQUFTLEtBQStCO0FBQ3BDLFdBQU8s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
2927
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3V0aWxzL3V1aWQudHMiLCAiLi4vLi4vLi4vc3JjL3V0aWxzL3V0aWxzLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9pbmRleC50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQmFzZU1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0JpbmRDbGlja01lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0NoYW5nZVRleHRNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9FeGVjdXRlU2NyaXB0TWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ3VzdG9tUmVmTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL1NldEF0dHJpYnV0ZU1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL1NldElubmVySHRtbC50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvSW5pdE1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0VudmVsb3BlZE1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0RldGVjdE15b3BSZWZzTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvR2V0QXR0cmlidXRlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvY29tcG9uZW50TWVzc2FnZXMvRXhlY3V0ZUNvbXBvbmVudE1ldGhvZC50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvY29tcG9uZW50TWVzc2FnZXMvU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0NsZWFudXBNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9EaXNwb3NlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvY29tcG9uZW50TWVzc2FnZXMvU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9oZWxwZXJzL2FwcGx5U3R5bGVzaGVldC50cyIsICIuLi8uLi8uLi9zcmMvaGVscGVycy9pZnJhbWVTa2luVXJsVG9rZW5pemVyLnRzIiwgIi4uLy4uLy4uL3NyYy9oZWxwZXJzL2NsYXNzTGlzdC50cyIsICIuLi8uLi8uLi9zcmMvaGVscGVycy9jb25maWdCdWlsZGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9oZWxwZXJzL0Nsb3VkUmVwb3NpdG9yeS50cyIsICIuLi8uLi8uLi9zcmMvaGVscGVycy9leGVjLnRzIiwgIi4uLy4uLy4uL3NyYy9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnQudHMiLCAiLi4vLi4vLi4vc3JjL2NvbW1vbi9NeW9wTWVzc2FnZXMudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50cy9JTXlvcENvbXBvbmVudC50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL015b3BFbGVtZW50UmVmLnRzIiwgIi4uLy4uLy4uL3NyYy9jb21tb24vYmFzZU1lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9jb21tb24vQmFzZU15b3BTREsudHMiLCAiLi4vLi4vLi4vc3JjL2NvbW1vbi9pbmRleC50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvbG9nTWVzc2FnZXMudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50cy9teW9wUmVmQ29tcG9uZW50LnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudENvcmUudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50cy9teW9wSWZyYW1lQ29tcG9uZW50LnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvSU15b3BMb2FkZXIudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvbG9hZGVycy9pZnJhbWVMb2FkZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9jb25zdHMudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50cy9teW9wV2ViY29tcG9uZW50LnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvd2ViY29tcG9uZW50TG9hZGVyLnRzIiwgInZlcnNpb246bXlvcC1zZGstdmVyc2lvbiIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL2NvbnN0cy50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L3NoYWRvd1Jvb3RSZWYudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvc2V0SW5uZXJIdG1sSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L1dlYkNvbXBvbmVudFNESy50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9sb2FkZXJzL0hUTUxDb21wb25lbnRMb2FkZXIudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvbXlvcE92ZXJyaWRlLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2hvc3RTREsudHMiLCAiLi4vLi4vLi4vc3JjL2hlbHBlcnMvRW5hYmxlVjIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8vVE9ETyA6IHJldXNlIGZyb20gb25lIHBsYWNlLlxuLy8gbmVlZHMgdG8gYmUgdXNlZCBpbiBteW9wLXNkaywgbXlvcC1kYXNoYmFvcmQsIG15b3Atc2VydmVyLCBteW9wLWNsaSAuLlxuXG5leHBvcnQgY29uc3QgdXVpZHY0ID0gKCkgPT4ge1xuICAgIHJldHVybiBcIjEwMDAwMDAwLTEwMDAtNDAwMC04MDAwLTEwMDAwMDAwMDAwMFwiLnJlcGxhY2UoL1swMThdL2csIGMgPT5cbiAgICAgICAgKCtjIF4gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSgxKSlbMF0gJiAxNSA+PiArYyAvIDQpLnRvU3RyaW5nKDE2KVxuICAgICk7XG59XG5cbi8vIENvbnZlcnQgVVVJRCBzdHJpbmcgdG8gYnl0ZXNcbmV4cG9ydCBjb25zdCB1dWlkVG9CeXRlcyA9ICh1dWlkOiBzdHJpbmcpOiBVaW50OEFycmF5ID0+IHtcbiAgICByZXR1cm4gVWludDhBcnJheS5mcm9tKFxuICAgICAgICB1dWlkLnJlcGxhY2UoLy0vZywgJycpLm1hdGNoKC8uezEsMn0vZykhLm1hcChieXRlID0+IHBhcnNlSW50KGJ5dGUsIDE2KSlcbiAgICApO1xufTtcblxuLy8gQ29udmVydCBieXRlcyB0byBVVUlEIHN0cmluZ1xuZXhwb3J0IGNvbnN0IGJ5dGVzVG9VdWlkID0gKGJ5dGVzOiBVaW50OEFycmF5KTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBoZXggPSBbLi4uYnl0ZXNdLm1hcChiID0+IGIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJykpLmpvaW4oJycpO1xuICAgIHJldHVybiBbXG4gICAgICAgIGhleC5zbGljZSgwLCA4KSxcbiAgICAgICAgaGV4LnNsaWNlKDgsIDEyKSxcbiAgICAgICAgaGV4LnNsaWNlKDEyLCAxNiksXG4gICAgICAgIGhleC5zbGljZSgxNiwgMjApLFxuICAgICAgICBoZXguc2xpY2UoMjApXG4gICAgXS5qb2luKCctJyk7XG59O1xuXG4vLyBCYXNlNjQgVVJMLXNhZmUgZW5jb2RlXG5leHBvcnQgY29uc3QgYmFzZTY0VXJsRW5jb2RlID0gKGJ5dGVzOiBVaW50OEFycmF5KTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBiYXNlNjQgPSBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUoLi4uYnl0ZXMpKTtcbiAgICByZXR1cm4gYmFzZTY0LnJlcGxhY2UoL1xcKy9nLCAnLScpLnJlcGxhY2UoL1xcLy9nLCAnXycpLnJlcGxhY2UoLz0rJC8sICcnKTtcbn07XG5cbi8vIEJhc2U2NCBVUkwtc2FmZSBkZWNvZGVcbmV4cG9ydCBjb25zdCBiYXNlNjRVcmxEZWNvZGUgPSAoc3RyOiBzdHJpbmcpOiBVaW50OEFycmF5ID0+IHtcbiAgICBsZXQgYmFzZTY0ID0gc3RyLnJlcGxhY2UoLy0vZywgJysnKS5yZXBsYWNlKC9fL2csICcvJyk7XG4gICAgd2hpbGUgKGJhc2U2NC5sZW5ndGggJSA0KSBiYXNlNjQgKz0gJz0nO1xuICAgIGNvbnN0IGJpbmFyeSA9IGF0b2IoYmFzZTY0KTtcbiAgICByZXR1cm4gVWludDhBcnJheS5mcm9tKGJpbmFyeSwgY2hhciA9PiBjaGFyLmNoYXJDb2RlQXQoMCkpO1xufTtcblxuLy8gQ29tcHJlc3MgYW4gYXJyYXkgb2YgVVVJRHMgaW50byBhIHNob3J0IFVSTC1zYWZlIHN0cmluZ1xuZXhwb3J0IGNvbnN0IGNvbXByZXNzVVVJRHMgPSAodXVpZHM6IHN0cmluZ1tdKTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBhbGxCeXRlcyA9IHV1aWRzLmZsYXRNYXAodXVpZCA9PiBBcnJheS5mcm9tKHV1aWRUb0J5dGVzKHV1aWQpKSk7XG4gICAgcmV0dXJuIGJhc2U2NFVybEVuY29kZShuZXcgVWludDhBcnJheShhbGxCeXRlcykpO1xufTtcblxuLy8gRGVjb21wcmVzcyBmcm9tIFVSTC1zYWZlIHN0cmluZyBiYWNrIHRvIGFuIGFycmF5IG9mIFVVSURzXG5leHBvcnQgY29uc3QgZGVjb21wcmVzc1VVSURzID0gKGVuY29kZWQ6IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcbiAgICBjb25zdCBieXRlcyA9IGJhc2U2NFVybERlY29kZShlbmNvZGVkKTtcbiAgICBpZiAoYnl0ZXMubGVuZ3RoICUgMTYgIT09IDApIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBpbnB1dCBsZW5ndGgnKTtcblxuICAgIGNvbnN0IHV1aWRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IDE2KSB7XG4gICAgICAgIHV1aWRzLnB1c2goYnl0ZXNUb1V1aWQoYnl0ZXMuc2xpY2UoaSwgaSArIDE2KSkpO1xuICAgIH1cbiAgICByZXR1cm4gdXVpZHM7XG59O1xuIiwgImV4cG9ydCAqIGZyb20gJy4vdXVpZC50cydcblxuZXhwb3J0IGNvbnN0IHdhaXQgPSAobXM6IG51bWJlcikgPT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbn0iLCAiZXhwb3J0ICogZnJvbSAnLi9CYXNlTWVzc2FnZSc7XG5cbi8vdXNlcidzIG1lc3NhZ2VzXG5leHBvcnQgKiBmcm9tICcuL0JpbmRDbGlja01lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9DaGFuZ2VUZXh0TWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0V4ZWN1dGVTY3JpcHRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQ3VzdG9tUmVmTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0FkZEV2ZW50TGlzdGVuZXJNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vU2V0QXR0cmlidXRlTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9TZXRJbm5lckh0bWwnO1xuXG4vL3N5c3RlbSBtZXNzYWdlc1xuZXhwb3J0ICogZnJvbSAnLi9Jbml0TWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9FbnZlbG9wZWRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRGV0ZWN0TXlvcFJlZnNNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICAnLi9HZXRBdHRyaWJ1dGVNZXNzYWdlJztcblxuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRNZXNzYWdlcy9FeGVjdXRlQ29tcG9uZW50TWV0aG9kJztcbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50TWVzc2FnZXMvU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9DbGVhbnVwTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0Rpc3Bvc2VNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50TWVzc2FnZXMvU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlJzsiLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi9ob3N0XCI7XG5pbXBvcnQge0lSZWZDb25maWd9IGZyb20gXCIuLi9jb21tb25cIjtcblxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VEaXJlY3Rpb24ge1xuICAgIHN0YXRpYyBkb3duID0gJ2Rvd24nIGFzIGNvbnN0XG4gICAgc3RhdGljIHVwID0gJ3VwJyBhcyBjb25zdFxufVxuXG5leHBvcnQgdHlwZSBNZXNzYWdlRGlyZWN0aW9uT3B0aW9uID0gJ3VwJyB8ICdkb3duJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNeW9wTWVzc2FnZTxUID0gYW55PiB7XG4gICAgaWQgPSB1dWlkdjQoKVxuXG4gICAgc3RhdGljIGNyZWF0ZTxULCBVIGV4dGVuZHMgbmV3ICguLi5hcmdzOiBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8VT4pID0+IFQgPSB0eXBlb2YgdGhpcz4oXG4gICAgICAgIHRoaXM6IFUsXG4gICAgICAgIC4uLmFyZ3M6IENvbnN0cnVjdG9yUGFyYW1ldGVyczxVPlxuICAgICk6IEluc3RhbmNlVHlwZTx0eXBlb2YgdGhpcz4ge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHJldHVybiBuZXcgdGhpcyguLi5hcmdzKTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnbWVlc2FnZSBpZCBjcmVhdGVkJywgdGhpcy5pZCwgZG9jdW1lbnQubG9jYXRpb24uaHJlZik7XG4gICAgfVxuXG4gICAgbXlvcCA9IHRydWVcblxuICAgIGFic3RyYWN0IG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleSB8IHN0cmluZztcblxuICAgIGNvbnRlbnQ/OiBUXG5cbiAgICAvLyBUT0RPIDogY2FudCBiZSBvcHRpb25hbCBcbiAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICBkZXN0aW5hdGlvbj86IHN0cmluZ1xuXG4gICAgcm91dGU/OiBzdHJpbmdbXVxuXG4gICAgcmVmPzogUmVmXG5cbiAgICBkaXJlY3Rpb24/OiBNZXNzYWdlRGlyZWN0aW9uT3B0aW9uXG5cbiAgICBjbGVhbmFibGU6IGJvb2xlYW4gPSBmYWxzZVxuXG4gICAgaXNUeXBlb2YobXNnOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIG1zZy5tZXNzYWdlVHlwZSA9PT0gdGhpcy5tZXNzYWdlVHlwZVxuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE15b3BFbGVtZW50TWVzc2FnZTxUID0gYW55PiBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTxUPiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNeW9wQmluZFJlcGxheU1lc3NhZ2U8VCA9IGFueT4gZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8VD4ge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI/OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNeW9wQmluZE1lc3NhZ2U8VCA9IGFueSwgUiBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSA9IGFueT4gZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8VD4ge1xuXG4gICAgcHVibGljIGFic3RyYWN0IHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXk7XG5cbiAgICBwdWJsaWMgaGFuZGxlclVuaXF1ZUlkID0gdXVpZHY0KClcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBoYW5kbGVyOiAobWVzc2FnZTogUikgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcigpXG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVmIHtcbiAgICBwdWJsaWMgbXlvcCA9IHRydWU7XG5cbiAgICBwdWJsaWMgX19ub25Qcm94aWVkPzogUmVmO1xuXG4gICAgc3RhdGljIGNyZWF0ZShzZWxlY3Rvcjogc3RyaW5nLCByZWZDb25maWc/OiBJUmVmQ29uZmlnLCBjb21wb25lbnQ/OiBJTXlvcENvbXBvbmVudCkge1xuICAgICAgICBsZXQgX3JlZkNvbmZpZyA9IHJlZkNvbmZpZztcbiAgICAgICAgaWYgKCFfcmVmQ29uZmlnKSB7XG4gICAgICAgICAgICBfcmVmQ29uZmlnID0ge1xuICAgICAgICAgICAgICAgIGlkOiAnJyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnJyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgICAgICAgICAgc2VsZWN0b3JUeXBlOiAnaWQtYXR0cmlidXRlJyxcbiAgICAgICAgICAgICAgICBzZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgYmVoYXZpb3I6IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NvZGUnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBhcyBJUmVmQ29uZmlnXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBSZWYoX3JlZkNvbmZpZywgY29tcG9uZW50KTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmQ29uZmlnOiBJUmVmQ29uZmlnLCBwdWJsaWMgY29tcG9uZW50PzogSU15b3BDb21wb25lbnQpIHtcbiAgICAgICAgdGhpcy5fX25vblByb3hpZWQgPSB7XG4gICAgICAgICAgICAuLi50aGlzLFxuICAgICAgICAgICAgY29tcG9uZW50OiBudWxsIC8vIGluIG9yZGVyIHRvIGJlIHNlcmlhbGl6YWJsZVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnQ2xpY2tSZXBsYXlNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgQmluZENsaWNrTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kTWVzc2FnZTx2b2lkLCBDbGlja1JlcGxheU1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0JpbmRDbGlja01lc3NhZ2UnO1xuICAgIGNsZWFuYWJsZSA9IHRydWU7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIGhhbmRsZXI6IChtZXNzYWdlOiBDbGlja1JlcGxheU1lc3NhZ2UpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2xpY2tSZXBsYXlNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcbn1cblxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cbmV4cG9ydCBjbGFzcyBDaGFuZ2VUZXh0TWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTxzdHJpbmc+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gJ0NoYW5nZVRleHRNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuY29udGVudCA9IHRleHRcbiAgICB9XG59IiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtSb290UmVmfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0V4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UnXG5cbmNvbnN0IGZ1bmN0aW9uQm9keVJlZ2V4ID0gLyg/OmZ1bmN0aW9uXFxzKlxcdypcXHMqXFwoW14pXSpcXClcXHMqXFx7KFtcXHNcXFNdKj8pXFx9fChcXChbXildKlxcKVxccyo9PlxccypcXHsoW1xcc1xcU10qPylcXH0pKVxccyokLztcbmNvbnN0IGV4cHJlc3Npb25Cb2R5UmVnZXggPSAvXFwoXFxzKlteKV0rXFxzKlxcKVxccyo9PlxccyooLispLztcblxuZXhwb3J0IGNvbnN0IHN0cmlwRnVuY3Rpb24gPSAoY29udGVudDogc3RyaW5nKSA9PiB7XG4gICAgbGV0IG1hdGNoID0gY29udGVudC5tYXRjaChmdW5jdGlvbkJvZHlSZWdleCk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIHJldHVybiBtYXRjaFsxXSB8fCBtYXRjaFszXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgbWF0Y2ggPSBjb250ZW50Lm1hdGNoKGV4cHJlc3Npb25Cb2R5UmVnZXgpO1xuICAgICAgICBpZiAobWF0Y2gpXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hbMV0udHJpbSgpO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgc2NyaXB0SW5wdXRzID0ge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW5cbn0gfCB7fTtcblxuZXhwb3J0IHR5cGUgc2NyaXB0VmFyczxUPiA9IHtcbiAgICBzZW5kOiAoZGF0YTogVCkgPT4gdm9pZDtcbiAgICAvLyBjb21wbGV0ZVN0cmVhbTogKCkgPT4gdm9pZDtcbiAgICByb290UmVmOiBSb290UmVmO1xuICAgIG1ha2VTZXJpYWxpemFibGU6IHR5cGVvZiBtYWtlU2VyaWFsaXphYmxlXG59XG5cbmV4cG9ydCB0eXBlIGV4dGVuZGVkU2NyaXB0VmFyczxULCBJPiA9IHtcbiAgICBbSyBpbiBrZXlvZiBJXTogSVtLXTtcbn0gJiBzY3JpcHRWYXJzPFQ+XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlU2NyaXB0TWVzc2FnZTxUID0gYW55LCBJIGV4dGVuZHMgc2NyaXB0SW5wdXRzID0gYW55PiBleHRlbmRzIE15b3BCaW5kTWVzc2FnZTxzdHJpbmcsIEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2U8VD4+IHtcblxuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5O1xuICAgIG1lc3NhZ2VUeXBlID0gJ0V4ZWN1dGVTY3JpcHRNZXNzYWdlJztcbiAgICBzY3JpcHQ6IHN0cmluZyA9ICcnXG5cbiAgICBzdGF0aWMgcmVwbGllcktleSA9ICdzZW5kJztcbiAgICBzdGF0aWMgY29tcGxldGVTdHJlYW1LZXkgPSAnY29tcGxldGVTdHJlYW0nO1xuXG4gICAgY29uc3RydWN0b3Ioc2NyaXB0OiAodmFyczogZXh0ZW5kZWRTY3JpcHRWYXJzPFQsIEk+KSA9PiBULCBoYW5kbGVyOiAobWVzc2FnZTogRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZTxUPikgPT4gdm9pZCA9ICgpID0+IHtcbiAgICB9LCBwdWJsaWMgc2NyaXB0SW5wdXRzPzogSSkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICAgICAgdGhpcy5zY3JpcHQgPSBzY3JpcHQudG9TdHJpbmcoKTtcblxuICAgICAgICAvL1RPRE86IGNhbiBiZSByZW1vdmVcbiAgICAgICAgdGhpcy5jb250ZW50ID0gc2NyaXB0LnRvU3RyaW5nKClcbiAgICAgICAgdGhpcy5jb250ZW50ID0gc3RyaXBGdW5jdGlvbih0aGlzLmNvbnRlbnQpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2U8VCA9IGFueT4gZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2U8VD4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5O1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlcGxheVRvSGFuZGxlcjogc3RyaW5nLCBwdWJsaWMgY29udGVudDogVCkge1xuICAgICAgICBzdXBlcihyZXBsYXlUb0hhbmRsZXIpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge1xuICAgIEV4ZWN1dGVTY3JpcHRNZXNzYWdlLFxuICAgIEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UsXG4gICAgZXh0ZW5kZWRTY3JpcHRWYXJzLFxuICAgIHNjcmlwdElucHV0cywgc3RyaXBGdW5jdGlvblxufSBmcm9tIFwiLi9FeGVjdXRlU2NyaXB0TWVzc2FnZS50c1wiO1xuXG5leHBvcnQgdHlwZSBjdXN0b21SZWZTY3JpcHRJbnB1dHMgPSB7XG4gICAgZWxlbWVudElkOiBzdHJpbmcsXG4gICAgcmVmPzogSFRNTEVsZW1lbnQsXG4gICAgX3NjcmlwdD86IHN0cmluZyxcbiAgICBfX3NjcmlwdElucHV0cz86IE9iamVjdFxufTtcblxuZXhwb3J0IGNsYXNzIEN1c3RvbVJlZk1lc3NhZ2U8VCA9IGFueSwgSSBleHRlbmRzIHNjcmlwdElucHV0cyA9IGN1c3RvbVJlZlNjcmlwdElucHV0cz4gZXh0ZW5kcyBFeGVjdXRlU2NyaXB0TWVzc2FnZTxULCBJICYgY3VzdG9tUmVmU2NyaXB0SW5wdXRzPiB7XG5cbiAgICBjb25zdHJ1Y3RvcihzY3JpcHQ6ICh2YXJzOiBleHRlbmRlZFNjcmlwdFZhcnM8VCwgSSAmIGN1c3RvbVJlZlNjcmlwdElucHV0cz4pID0+IFQsXG4gICAgICAgICAgICAgICAgcHVibGljIHNjcmlwdElucHV0czogSSAmIGN1c3RvbVJlZlNjcmlwdElucHV0cyxcbiAgICAgICAgICAgICAgICBoYW5kbGVyOiAobWVzc2FnZTogRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZTxUPikgPT4gdm9pZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB9KSB7XG5cbiAgICAgICAgLy9tb2NrIHZhcnNcbiAgICAgICAgLy8gbGV0IHJvb3RSZWYsIGVsZW1lbnRJZCwgX3NjcmlwdCwgX19zY3JpcHRJbnB1dHM7XG4gICAgICAgIHN1cGVyKCh7cm9vdFJlZiwgZWxlbWVudElkLCBfc2NyaXB0LCBfX3NjcmlwdElucHV0c30pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlZnMgPSAocm9vdFJlZi5zaGFkb3dSb290IHx8IHJvb3RSZWYuY29udGFpbmVyKS5xdWVyeVNlbGVjdG9yQWxsKGBbJHsnbXlvcC1pZCd9PScke2VsZW1lbnRJZH0nXWApO1xuICAgICAgICAgICAgaWYgKHJlZnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gIGNvbnN0IHJlZiA9IHJlZnNbMF07XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiB0aGluayBhYm91dCBleHBvc2luZyBcInJlZnNcIiBhbmQgbm90IG9ubHkgXCJyZWZcIlxuICAgICAgICAgICAgICAgIC8vZm9yIGNhc2VzIHdoZXJlIHRoZSBSZWYgaGFzIG11bHRpcGxhdGUgaW1wbGVtZW50YXRpb25zXG5cbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgX19zY3JpcHRJbnB1dHMucmVmID0gcmVmc1swXTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGR5bmFtaWNGdW5jdGlvbiA9IG5ldyBGdW5jdGlvbihgcmV0dXJuICgke19zY3JpcHR9KSguLi5hcmd1bWVudHMpYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGR5bmFtaWNGdW5jdGlvbihfX3NjcmlwdElucHV0cyk7XG5cbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgLy9yZXR1cm4gRnVuY3Rpb24oJ3JlZicsICdyb290UmVmJywgLi4uT2JqZWN0LmtleXMoX19zY3JpcHRJbnB1dHMpLCBfc2NyaXB0ISkocmVmLCByb290UmVmLCAuLi5PYmplY3QudmFsdWVzKF9fc2NyaXB0SW5wdXRzKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsIGFzIFQ7XG4gICAgICAgIH0sIGhhbmRsZXIpO1xuXG4gICAgICAgIHRoaXMuc2NyaXB0SW5wdXRzID0ge1xuICAgICAgICAgICAgLi4uc2NyaXB0SW5wdXRzLFxuICAgICAgICAgICAgLy9fc2NyaXB0OiBzdHJpcEZ1bmN0aW9uKHNjcmlwdC50b1N0cmluZygpKSxcbiAgICAgICAgICAgIF9zY3JpcHQ6IHNjcmlwdC50b1N0cmluZygpXG4gICAgICAgIH07XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NlcmlhbGl6YWJsZSwgU2VyaWFsaXphYmxlU2tlbGV0b259IGZyb20gXCIuLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0V2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBBZGRFdmVudExpc3RlbmVyTWVzc2FnZTxUIGV4dGVuZHMga2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcCA9IGtleW9mIEhUTUxFbGVtZW50RXZlbnRNYXA+IGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlIHtcblxuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5O1xuICAgIG1lc3NhZ2VUeXBlID0gJ0FkZEV2ZW50TGlzdGVuZXJNZXNzYWdlJztcbiAgICBjbGVhbmFibGUgPSB0cnVlO1xuICAgIHNlcmlhbGl6YWJsZVNrZWxldG9uOiBTZXJpYWxpemFibGVTa2VsZXRvbjxIVE1MRWxlbWVudEV2ZW50TWFwW1RdPiA9IGZhbHNlIC8vIHt9IC8vIGVtcHR5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIHB1YmxpYyB0eXBlOiBULCBwdWJsaWMgaGFuZGxlcjogKG1lc3NhZ2U6IEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcilcbiAgICB9XG5cbiAgICB3aXRoU2VyaWFsaXphYmxlU2tlbGV0b24oc2VyaWFsaXphYmxlU2tlbGV0b246IFNlcmlhbGl6YWJsZVNrZWxldG9uPEhUTUxFbGVtZW50RXZlbnRNYXBbVF0+KSB7XG4gICAgICAgIHRoaXMuc2VyaWFsaXphYmxlU2tlbGV0b24gPSBzZXJpYWxpemFibGVTa2VsZXRvbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5O1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlcGxheVRvSGFuZGxlcjogc3RyaW5nLCBwdWJsaWMgZTogU2VyaWFsaXphYmxlPEV2ZW50Pikge1xuICAgICAgICBzdXBlcihyZXBsYXlUb0hhbmRsZXIpO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSB7XG4gICAgICAgICAgICBlXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIFJlZix9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cblxuZXhwb3J0IGNsYXNzIFNldEF0dHJpYnV0ZU1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuXG4gICAgbWVzc2FnZVR5cGUgPSAnU2V0QXR0cmlidXRlTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIHB1YmxpYyBuYW1lOiBzdHJpbmcsIHB1YmxpYyB2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgR2V0RWxlbWVudFZhbHVlTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kTWVzc2FnZTx2b2lkLCBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdHZXRFbGVtZW50VmFsdWVNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgaGFuZGxlcjogKG1lc3NhZ2U6IEVsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBGb3JtRGF0YUVudHJ5ID0ge1xuICAgIGlkPzogc3RyaW5nLFxuICAgIG5hbWU/OiBzdHJpbmcsXG4gICAgdmFsdWU/OiBJbnB1dEVsZW1lbnRWYWx1ZSxcbiAgICByZXF1aXJlZD86IGJvb2xlYW4sXG4gICAgdmFsaWRpdHk/OiBTZXJpYWxpemFibGU8VmFsaWRpdHlTdGF0ZT4sXG4gICAgbXlvcElkPzogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIElucHV0RWxlbWVudEZvcm1WYWx1ZSA9IHtcbiAgICBmb3JtRGF0YT86IHsgW2tleTogc3RyaW5nXTogRm9ybURhdGFFbnRyeSB9XG4gICAgdW5tYXBwZWREYXRhPzogRm9ybURhdGFFbnRyeVtdXG59O1xuXG5leHBvcnQgdHlwZSBJbnB1dEVsZW1lbnRWYWx1ZSA9IHN0cmluZyB8IElucHV0RWxlbWVudEZvcm1WYWx1ZSB8IG51bGwgfCB1bmRlZmluZWRcblxuZXhwb3J0IGNsYXNzIEVsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbnRlbnQ6IElucHV0RWxlbWVudFZhbHVlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuXG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2UudHNcIjtcblxuZXhwb3J0IGNsYXNzIFNldElubmVySHRtbCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTxzdHJpbmc+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gJ1NldElubmVySHRtbCc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIGlubmVySHRtbDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuY29udGVudCA9IGlubmVySHRtbFxuICAgIH1cbn0iLCAiaW1wb3J0IHsgQmFzZU15b3BNZXNzYWdlIH0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuLy8gc2VudCBieSBob3N0IHRvIGNvbXBvbmVudHMsIGNvbnRhaW5zIHRoaWVyIGlkIFxuZXhwb3J0IGNsYXNzIEluaXRNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPHsgaWQ6IHN0cmluZyB9PiB7XG4gICAgbWVzc2FnZVR5cGUgPSAnSW5pdE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IoaWQ6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpXG4gICAgICAgIHRoaXMuY29udGVudCA9IHsgaWQgfVxuICAgIH1cblxuICAgIGlzVHlwZW9mKG1zZzogQmFzZU15b3BNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBtc2cubWVzc2FnZVR5cGUgPT09IHRoaXMubWVzc2FnZVR5cGVcbiAgICB9XG59XG5cbi8vIGNvbXBvbmVudCBub3RpZnkgaG9zdCB0aGUgaXQgd2FzIGluaXRhdGVkIFxuZXhwb3J0IGNsYXNzIEluaXRSZXNwb25zZSBleHRlbmRzIEluaXRNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdJbml0UmVzcG9uc2UnO1xufVxuXG4vLyBjb21wb25lbnQgYXNrIHRvIGhvc3QgdG8gZ2V0IGluaXRhdGVkIFxuZXhwb3J0IGNsYXNzIEluaXRSZXF1ZXN0IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdJbml0UmVxdWVzdCc7XG59XG4iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0lDb21wb25lbnRDb25maWcsIElSZWZDb25maWd9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3QvaG9zdFNESy50c1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ1JlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kTWVzc2FnZTx2b2lkLCBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmQ29uZmlnOiBJUmVmQ29uZmlnLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBuZXN0ZWRDb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsXG4gICAgICAgICAgICAgICAgcHVibGljIG9wdGlvbnM6IGxvYWRlck9wdGlvbnMsXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogKG1lc3NhZ2U6IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKSA9PiB2b2lkLFxuICAgICkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcblxuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgTmVzdGVkUmVmID0ge1xuICAgIHJlZk5hbWU6IHN0cmluZyxcbiAgICBjb21wb25lbnREZWZpbml0aW9uSWQ6IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlcGxheVRvSGFuZGxlcjogc3RyaW5nLCBwdWJsaWMgbmVzdGVkUmVmczogTmVzdGVkUmVmW10sIHB1YmxpYyBmYWlsZWQ/OiBib29sZWFuKSB7XG4gICAgICAgIHN1cGVyKHJlcGxheVRvSGFuZGxlcik7XG4gICAgfVxufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgRW52ZWxvcGVkTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnRW52ZWxvcGVkTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgZGVzdGluYXRpb246IHN0cmluZywgcHVibGljIG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIGNvbnN0IGlubmVyRW52ZWxvcGVkTWVzc2FnZSA9IChtZXNzYWdlIGFzIEVudmVsb3BlZE1lc3NhZ2UpO1xuICAgICAgICB0aGlzLnJvdXRlID0gW2Rlc3RpbmF0aW9uLCAuLi5pbm5lckVudmVsb3BlZE1lc3NhZ2Uucm91dGUgPyBpbm5lckVudmVsb3BlZE1lc3NhZ2Uucm91dGUgOiBbXV07XG4gICAgfVxufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7SUVsZW1lbnRSZWZ9IGZyb20gXCIuLi9jb21tb25cIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdEZXRlY3RlZE15b3BSZWZzTWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIERldGVjdE15b3BSZWZzTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kTWVzc2FnZTxhbnksIERldGVjdGVkTXlvcFJlZnNNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSAnRGV0ZWN0TXlvcFJlZnNNZXNzYWdlJ1xuICAgIHJlcGx5TWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXk7XG59XG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RlZE15b3BSZWZzTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZTxJRWxlbWVudFJlZltdPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXk7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyOiBzdHJpbmcsIG15b3BFbGVtZW50UmVmczogSUVsZW1lbnRSZWZbXSkge1xuICAgICAgICBzdXBlcihyZXBsYXlUb0hhbmRsZXIpXG4gICAgICAgIHRoaXMuY29udGVudCA9IG15b3BFbGVtZW50UmVmcztcbiAgICB9XG5cbiAgICBpc1R5cGVvZihtc2c6IEJhc2VNeW9wTWVzc2FnZTxhbnk+KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBtc2cubWVzc2FnZVR5cGUgPT09IHRoaXMubWVzc2FnZVR5cGVcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgR2V0QXR0cmlidXRlTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kTWVzc2FnZTx2b2lkLCBHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdHZXRBdHRyaWJ1dGVNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgcHVibGljIG5hbWU6IHN0cmluZywgaGFuZGxlcjogKG1lc3NhZ2U6IEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2UpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29udGVudDogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cblxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi8uLi9ob3N0XCI7XG5cbnR5cGUgTWV0aG9kTmFtZXM8VD4gPSB7XG4gICAgLy8gW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueSA/IEsgOiBuZXZlcjtcbiAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICgpID0+IHZvaWQgPyBLIDogbmV2ZXI7XG59W2tleW9mIFRdO1xuXG4vLyBEZWZpbmUgYSB0eXBlIHRoYXQgYWxsb3dzIG9ubHkgc3RyaW5ncyBjb3JyZXNwb25kaW5nIHRvIHRoZSBtZXRob2QgbmFtZXMgb2YgVFxudHlwZSBNZXRob2RTdHJpbmc8VD4gPSBNZXRob2ROYW1lczxUPiBleHRlbmRzIGluZmVyIE0gPyBNIGV4dGVuZHMgc3RyaW5nID8gTSA6IG5ldmVyIDogbmV2ZXI7XG5cblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVDb21wb25lbnRNZXRob2QgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0V4ZWN1dGVDb21wb25lbnRNZXRob2QnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIG1ldGhvZDogTWV0aG9kU3RyaW5nPElNeW9wQ29tcG9uZW50Pikge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4uL0Jhc2VNZXNzYWdlXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnO1xufVxuXG5leHBvcnQgY2xhc3MgTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ011dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJztcbn0iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnQ2xlYW51cFJlcGxheU1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBDbGVhbnVwTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kTWVzc2FnZTx2b2lkLCBDbGVhbnVwUmVwbGF5TWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnQ2xlYW51cE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNsZWFudXBGb3JNZXNzYWdlSWQ6IHN0cmluZywgaGFuZGxlcjogKG1lc3NhZ2U6IENsZWFudXBSZXBsYXlNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENsZWFudXBSZXBsYXlNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjdXN0b21DbGVhbnVwOiBib29sZWFuKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgRGlzcG9zZU1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0Rpc3Bvc2VNZXNzYWdlJztcbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4uL0Jhc2VNZXNzYWdlXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIGNsZWFuYWJsZSA9IHRydWU7XG4gICAgbWVzc2FnZVR5cGUgPSAnU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlJztcbn1cblxuZXhwb3J0IGNsYXNzIFJlc2l6ZU9ic2VydmVyTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnUmVzaXplT2JzZXJ2ZXJNZXNzYWdlJztcbn0iLCAiaW1wb3J0IHR5cGUgKiBhcyBDU1MgZnJvbSBcImNzc3R5cGVcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi9ob3N0XCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzLnRzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRNZXNzYWdlfSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcblxuLy8gaWdub3JpbmcgZG9jdW1lbnRhdGlvblxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ1NTUHJvcGVydGllcyBleHRlbmRzIENTUy5Qcm9wZXJ0aWVzPHN0cmluZyB8IG51bWJlcj4ge1xufVxuXG5leHBvcnQgdHlwZSBTdHlsZXNoZWV0RGVmaW5pdGlvbiA9IHsgW2tleTogc3RyaW5nXTogQ1NTUHJvcGVydGllcyB9O1xuXG5leHBvcnQgY29uc3QgYXBwbHlTdHlsZXNoZWV0ID0gKGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIHN0eWxlc2hlZXQ6IFN0eWxlc2hlZXREZWZpbml0aW9uLCBjc3M/OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB0YWdJZCA9IGBteW9wLWNzcy0ke3V1aWR2NCgpfWA7XG4gICAgY29tcG9uZW50LnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCh7cm9vdFJlZiwgX3N0eWxlc2hlZXQsIF90YWdJZCwgX2Nzc30pID0+IHtcbiAgICAgICAgY29uc3Qgc3R5bGVUYWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICBzdHlsZVRhZy50eXBlID0gJ3RleHQvY3NzJztcblxuICAgICAgICAvLyBCdWlsZCB0aGUgQ1NTIHN0cmluZyBmcm9tIHRoZSBzdHlsZXMgb2JqZWN0XG4gICAgICAgIGxldCBjc3NTdHJpbmcgPSBfY3NzO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc2VsZWN0b3IgaW4gX3N0eWxlc2hlZXQpIHtcbiAgICAgICAgICAgIGNzc1N0cmluZyArPSBgJHtzZWxlY3Rvcn0geyBgO1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IF9zdHlsZXNoZWV0W3NlbGVjdG9yXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gcHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIGNzc1N0cmluZyArPSBgJHtwcm9wZXJ0eX06ICR7cHJvcGVydGllc1twcm9wZXJ0eV19OyBgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3NzU3RyaW5nICs9ICd9ICc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdGhlIENTUyBzdHJpbmcgYXMgdGhlIGNvbnRlbnQgb2YgdGhlIDxzdHlsZT4gZWxlbWVudFxuICAgICAgICBzdHlsZVRhZy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3NTdHJpbmcpKTtcbiAgICAgICAgc3R5bGVUYWcuaWQgPSBfdGFnSWQ7XG4gICAgICAgIC8vIEFwcGVuZCB0aGUgPHN0eWxlPiBlbGVtZW50XG4gICAgICAgIChyb290UmVmLnNoYWRvd1Jvb3QgfHwgcm9vdFJlZi5jb250YWluZXIpLmFwcGVuZENoaWxkKHN0eWxlVGFnKTtcblxuICAgIH0sICgpID0+IHtcbiAgICB9LCB7XG4gICAgICAgIF9zdHlsZXNoZWV0OiBzdHlsZXNoZWV0LFxuICAgICAgICBfY3NzIDogY3NzID8gY3NzIDogJycsXG4gICAgICAgIF90YWdJZDogdGFnSWRcbiAgICB9KSk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKHtyb290UmVmLCBfdGFnSWR9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gKHJvb3RSZWYuc2hhZG93Um9vdCB8fCBkb2N1bWVudCkuZ2V0RWxlbWVudEJ5SWQoX3RhZ0lkKTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICB9LCB7XG4gICAgICAgICAgICBfdGFnSWQ6IHRhZ0lkXG4gICAgICAgIH0pKVxuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IGFwcGx5U3R5bGVzaGVldExpbmsgPSAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgbGluazogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgdGFnSWQgPSBgbXlvcC1jc3MtJHt1dWlkdjQoKX1gO1xuICAgIGNvbXBvbmVudC5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoe3Jvb3RSZWYsIF90YWdJZCwgX2xpbmt9KSA9PiB7XG4gICAgICAgIGNvbnN0IGxpbmtFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgICBsaW5rRWxlbWVudC5pZCA9IF90YWdJZDtcbiAgICAgICAgbGlua0VsZW1lbnQucmVsID0gJ3N0eWxlc2hlZXQnO1xuICAgICAgICBsaW5rRWxlbWVudC5ocmVmID0gX2xpbms7XG4gICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobGlua0VsZW1lbnQpO1xuXG4gICAgICAgIC8vIEFwcGVuZCB0aGUgPHN0eWxlPiBlbGVtZW50XG4gICAgICAgIChyb290UmVmLnNoYWRvd1Jvb3QgfHwgcm9vdFJlZi5jb250YWluZXIpLmFwcGVuZENoaWxkKGxpbmtFbGVtZW50KTtcbiAgICB9LCAoKSA9PiB7XG4gICAgfSwge1xuICAgICAgICBfbGluayA6IGxpbmssXG4gICAgICAgIF90YWdJZDogdGFnSWRcbiAgICB9KSk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKHtyb290UmVmLCBfdGFnSWR9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gKHJvb3RSZWYuc2hhZG93Um9vdCB8fCBkb2N1bWVudCkuZ2V0RWxlbWVudEJ5SWQoX3RhZ0lkKTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICB9LCB7XG4gICAgICAgICAgICBfdGFnSWQ6IHRhZ0lkXG4gICAgICAgIH0pKVxuICAgIH1cbn1cbiIsICJpbXBvcnQge0lJZnJhbWVMb2FkZXJDb25maWcsIElTa2luQ29uZmlnfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmV4cG9ydCB0eXBlIFRva2VuTWFwID0gUmVjb3JkPHN0cmluZywgc3RyaW5nfCBudW1iZXI+XG5cbmNvbnN0IHJlcGxhY2VUb2tlbnMgPSAoaW5wdXQ6IHN0cmluZywgdG9rZW5NYXA6IFRva2VuTWFwKTogc3RyaW5nID0+IHtcbiAgICAvLyBDcmVhdGUgYSByZWdleCBwYXR0ZXJuIGZyb20gdGhlIGtleXMgb2YgdGhlIHRva2VuTWFwXG4gICAgY29uc3QgcGF0dGVybiA9IG5ldyBSZWdFeHAoT2JqZWN0LmtleXModG9rZW5NYXApLmpvaW4oJ3wnKSwgJ2cnKTtcblxuICAgIC8vIFJlcGxhY2UgdG9rZW5zIGluIHRoZSBpbnB1dCBzdHJpbmcgdXNpbmcgdGhlIHJlZ2V4XG4gICAgcmV0dXJuIGlucHV0LnJlcGxhY2UocGF0dGVybiwgKG1hdGNoZWQpID0+IHtcbiAgICAgICAgLy8gUmV0dXJuIHRoZSByZXBsYWNlbWVudCB2YWx1ZSBmcm9tIHRoZSB0b2tlbk1hcFxuICAgICAgICByZXR1cm4gKHRva2VuTWFwW21hdGNoZWRdIHx8IG1hdGNoZWQpLnRvU3RyaW5nKCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVJZnJhbWVTa2luQnlUb2tlbml6ZXIgPSAoc2VsZWN0ZWRTa2luOiBJU2tpbkNvbmZpZywgdG9rZW5NYXA6IFRva2VuTWFwKSA9PiB7XG4gICAgY29uc3QgdHlwZWRTa2luQ29uZmlnID0gKHNlbGVjdGVkU2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZylcbiAgICBpZiAodHlwZWRTa2luQ29uZmlnLnR5cGUgIT09ICdJZnJhbWVMb2FkZXInKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgaWZyYW1lU2tpblVybFRva2VuaXplciByZWNlaXZlZCBza2luIHdpdGggbG9hZGVyIHR5cGUgXCIke3R5cGVkU2tpbkNvbmZpZy50eXBlfVwiLCBjdXJyZW50bHkgb25seSBcIklmcmFtZUxvYWRlclwiIGlzIHN1cHBvcnRlZGApXG4gICAgfVxuXG4gICAgc2VsZWN0ZWRTa2luLmxvYWRlciA9IHtcbiAgICAgICAgLi4uc2VsZWN0ZWRTa2luLmxvYWRlclxuICAgIH1cblxuICAgIHNlbGVjdGVkU2tpbi5sb2FkZXIudXJsID0gcmVwbGFjZVRva2VucyhzZWxlY3RlZFNraW4ubG9hZGVyLnVybCwgdG9rZW5NYXApO1xuXG4gICAgcmV0dXJuIHNlbGVjdGVkU2tpbjtcbn1cblxuZXhwb3J0IGNvbnN0IGNoYW5nZVNraW5VcmxCeVRva2VuaXplciA9ICh0b2tlbk1hcDogVG9rZW5NYXApID0+IHtcbiAgICByZXR1cm4gYXN5bmMgKHNlbGVjdGVkU2tpbjogSVNraW5Db25maWcpID0+IHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUlmcmFtZVNraW5CeVRva2VuaXplcihzZWxlY3RlZFNraW4sIHRva2VuTWFwKTtcbiAgICB9XG59IiwgImltcG9ydCB7Q3VzdG9tUmVmTWVzc2FnZX0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vaG9zdFwiO1xuXG4vLyBjb25zdCBzcGFjZSA9ICcgJztcbi8vIGV4cG9ydCBjb25zdCBnZXRDbGFzc2VzID0gYXN5bmMgKGNvbm5lY3RlZFJlZjogUmVmKTogUHJvbWlzZTxzdHJpbmdbXT4gPT4gKGF3YWl0IGV4ZWMoYWN0QXM8SFRNTERpdkVsZW1lbnQ+KGNvbm5lY3RlZFJlZikuY2xhc3NMaXN0KSkudmFsdWUuc3BsaXQoc3BhY2UpO1xuLy8gZXhwb3J0IGNvbnN0IGFkZENsYXNzID0gYXN5bmMgKGNvbm5lY3RlZFJlZjogUmVmLCBjbGFzc05hbWU6IHN0cmluZykgPT4ge1xuLy8gICAgIGNvbnN0IGNsYXNzZXMgPSBhd2FpdCBnZXRDbGFzc2VzKGNvbm5lY3RlZFJlZik7XG4vLyAgICAgY2xhc3Nlcy5pbmNsdWRlcyhjbGFzc05hbWUpIHx8IGNsYXNzZXMucHVzaChjbGFzc05hbWUpO1xuLy8gICAgIC8vIEB0cy1pZ25vcmVcbi8vICAgICBjb25uZWN0ZWRSZWYuY2xhc3NMaXN0ID0gY2xhc3Nlcy5qb2luKHNwYWNlKTtcbi8vIH1cbi8vIGV4cG9ydCBjb25zdCByZW1vdmVDbGFzcyA9IGFzeW5jIChjb25uZWN0ZWRSZWY6IFJlZiwgY2xhc3NOYW1lOiBzdHJpbmcsKSA9PiB7XG4vLyAgICAgbGV0IGNsYXNzZXMgPSBhd2FpdCBnZXRDbGFzc2VzKGNvbm5lY3RlZFJlZik7XG4vLyAgICAgLy8gQHRzLWlnbm9yZVxuLy8gICAgIGNvbm5lY3RlZFJlZi5jbGFzc0xpc3QgPSBjbGFzc2VzLmZpbHRlcihjID0+IGMgIT09IGNsYXNzTmFtZSkuam9pbihzcGFjZSk7XG4vLyB9XG4vL1xuLy9cblxuZXhwb3J0IGNvbnN0IGFkZENsYXNzID0gKGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIGNsYXNzTmFtZTogc3RyaW5nLCBteW9wSWQ6IHN0cmluZykgPT4ge1xuICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDdXN0b21SZWZNZXNzYWdlKCh7cmVmLCBfY2xhc3NOYW1lfSkgPT4ge1xuICAgICAgICByZWY/LmNsYXNzTGlzdC5hZGQoX2NsYXNzTmFtZSk7XG4gICAgfSwge1xuICAgICAgICBlbGVtZW50SWQ6IG15b3BJZCxcbiAgICAgICAgX2NsYXNzTmFtZTogY2xhc3NOYW1lXG4gICAgfSkpO1xufVxuXG5leHBvcnQgY29uc3QgcmVtb3ZlQ2xhc3MgPSAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgY2xhc3NOYW1lOiBzdHJpbmcsIG15b3BJZDogc3RyaW5nKSA9PiB7XG4gICAgY29tcG9uZW50LnNlbmQobmV3IEN1c3RvbVJlZk1lc3NhZ2UoKHtyZWYsIF9jbGFzc05hbWV9KSA9PiB7XG4gICAgICAgIHJlZj8uY2xhc3NMaXN0LnJlbW92ZShfY2xhc3NOYW1lKTtcbiAgICB9LCB7XG4gICAgICAgIGVsZW1lbnRJZDogbXlvcElkLFxuICAgICAgICBfY2xhc3NOYW1lOiBjbGFzc05hbWVcbiAgICB9KSk7XG59IiwgImltcG9ydCB7XG4gICAgSUNvbXBvbmVudENvbmZpZyxcbiAgICBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJQ29tcG9uZW50SW5zdGFuY2VDb25maWcsIElIVE1MTG9hZGVyQ29uZmlnLCBJUmVmQ29uZmlnLFxuICAgIElTa2luTG9hZGVyQ29uZmlnLFxuICAgIElTa2luU2VsZWN0b3JDb25maWcsXG4gICAgSURlZGljYXRlZFNraW5Db25maWcsIElTa2luQ29uZmlnXG59IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi4vdXRpbHMvdXRpbHMudHNcIjtcblxuZXhwb3J0IGNsYXNzIFNraW5Db25maWcgaW1wbGVtZW50cyBJU2tpbkNvbmZpZyB7XG4gICAgX3J1blRpbWVJbnN0YW5jZUlkID0gJ3J1bnRpbWUtaW5zdGFuY2UtaWQtJyArIHV1aWR2NCgpO1xuICAgIF9ydW5UaW1lSWQgPSAncnVudGltZS1pZC0nICsgdXVpZHY0KCk7XG4gICAgX3J1blRpbWVOYW1lID0gJ3J1bnRpbWUtbmFtZS0nICsgdXVpZHY0KCk7XG5cbiAgICBzdGF0aWMgY3JlYXRlID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFNraW5Db25maWcoKTtcbiAgICB9XG5cbiAgICBpZCA9IHRoaXMuX3J1blRpbWVJZDtcbiAgICBuYW1lID0gdGhpcy5fcnVuVGltZU5hbWU7XG4gICAgZGVzY3JpcHRpb24gPSAnJztcbiAgICBsb2FkZXIgPSBudWxsIGFzIHVua25vd24gYXMgSVNraW5Mb2FkZXJDb25maWc7XG5cbiAgICB3aXRoTG9hZGVyID0gKGxvYWRlcjogSVNraW5Mb2FkZXJDb25maWcpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkZXIgPSBsb2FkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhIVE1MTG9hZGVyID0gKGxvYWRlcjogT21pdDxJSFRNTExvYWRlckNvbmZpZywgJ3R5cGUnPikgPT4ge1xuICAgICAgICBsb2FkZXIudHlwZSA9ICdIVE1MTG9hZGVyJztcbiAgICAgICAgdGhpcy5sb2FkZXIgPSBsb2FkZXIgYXMgSUhUTUxMb2FkZXJDb25maWc7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGJ1aWxkID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb21wb25lbnRDb25maWcgaW1wbGVtZW50cyBJQ29tcG9uZW50Q29uZmlnIHtcbiAgICBfcnVuVGltZUluc3RhbmNlSWQgPSAncnVudGltZS1pbnN0YW5jZS1pZC0nICsgdXVpZHY0KCk7XG4gICAgX3J1blRpbWVJZCA9ICdydW50aW1lLWlkLScgKyB1dWlkdjQoKTtcbiAgICBfcnVuVGltZU5hbWUgPSAncnVudGltZS1uYW1lLScgKyB1dWlkdjQoKTtcblxuICAgIHN0YXRpYyBjcmVhdGUgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50Q29uZmlnKCk7XG4gICAgfVxuXG4gICAgaW5zdGFuY2UgPSB7XG4gICAgICAgIGlkOiB0aGlzLl9ydW5UaW1lSW5zdGFuY2VJZCxcbiAgICAgICAgY29tcG9uZW50SWQ6IHRoaXMuX3J1blRpbWVJZCxcbiAgICAgICAgY29tcG9uZW50TmFtZTogdGhpcy5fcnVuVGltZU5hbWUsXG4gICAgICAgIHNraW5TZWxlY3RvcjogbnVsbCBhcyB1bmtub3duIGFzIElTa2luU2VsZWN0b3JDb25maWdcbiAgICB9IGFzIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZztcblxuICAgIG5hbWUgPSB0aGlzLl9ydW5UaW1lTmFtZVxuICAgIHR5cGUgPSB7XG4gICAgICAgIGlkOiB0aGlzLl9ydW5UaW1lSWQsXG4gICAgICAgIG5hbWU6IHRoaXMuX3J1blRpbWVOYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgIHByb3BzOiBbXSxcbiAgICAgICAgcmVmczogW10sXG4gICAgICAgIHNraW5zOiBbXSxcbiAgICAgICAgZGVmYXVsdFNraW46IDBcbiAgICB9IGFzIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnXG5cbiAgICB3aXRoSW5zdGFuY2UgPSAoaW5zdGFuY2U6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZykgPT4ge1xuICAgICAgICB0aGlzLmluc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhUeXBlID0gKHR5cGU6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnKSA9PiB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhOYW1lID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB3aXRoRGVmYXVsdFNraW4gPSAoZGVmYXVsdFNraW46IElTa2luQ29uZmlnKSA9PiB7XG4gICAgICAgIHRoaXMudHlwZS5za2lucy5wdXNoKGRlZmF1bHRTa2luKTtcbiAgICAgICAgdGhpcy50eXBlLmRlZmF1bHRTa2luID0gdGhpcy50eXBlLnNraW5zLmxlbmd0aCAtIDE7XG4gICAgICAgIHRoaXMuaW5zdGFuY2Uuc2tpblNlbGVjdG9yID0ge1xuICAgICAgICAgICAgdHlwZTogJ0RlZGljYXRlZCcsXG4gICAgICAgICAgICBza2luOiB7XG4gICAgICAgICAgICAgICAgaWQ6IGRlZmF1bHRTa2luLmlkXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gYXMgSURlZGljYXRlZFNraW5Db25maWdcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB3aXRoUmVmID0gKHJlZjogSVJlZkNvbmZpZykgPT4ge1xuICAgICAgICB0aGlzLnR5cGUucmVmcy5wdXNoKHJlZik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhCYXNpY1JlZiA9IChyZWZTZWxlY3Rvcjogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld0Jhc2ljUmVmID0ge1xuICAgICAgICAgICAgaWQ6ICcnLFxuICAgICAgICAgICAgbmFtZTogcmVmU2VsZWN0b3IsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgICAgICBzZWxlY3RvclR5cGU6ICdpZC1hdHRyaWJ1dGUnLFxuICAgICAgICAgICAgc2VsZWN0b3I6IHJlZlNlbGVjdG9yLFxuICAgICAgICAgICAgYmVoYXZpb3I6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnY29kZSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBhcyBJUmVmQ29uZmlnXG5cbiAgICAgICAgdGhpcy50eXBlLnJlZnMucHVzaChuZXdCYXNpY1JlZik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGJ1aWxkID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzKSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtJVXNlckZsb3d9IGZyb20gXCIuLi9jb21tb25cIjtcblxuLyoqXG4gKlxuICogIyMgT3ZlcnZpZXdcbiAqXG4gKiBUaGUgYENsb3VkUmVwb3NpdG9yeWAgY2xhc3Mgc2VydmVzIGFzIGEgY2VudHJhbGl6ZWQgZGF0YSBhY2Nlc3MgbGF5ZXIgZm9yIHJldHJpZXZpbmcgdXNlciBmbG93cyBhbmQgY29tcG9uZW50cyBmcm9tIHRoZSBNeW9wLmRldiBjbG91ZCBzZXJ2aWNlLiBJdCBpbXBsZW1lbnRzIGEgc2luZ2xldG9uIHBhdHRlcm4gYW5kIHByb3ZpZGVzIGNhY2hpbmcgbWVjaGFuaXNtcyB0byBvcHRpbWl6ZSBBUEkgY2FsbHMgYW5kIGltcHJvdmUgcGVyZm9ybWFuY2UuXG4gKlxuICogIyMgQ2xhc3MgU3RydWN0dXJlXG4gKlxuICogIyMjIENvbnN0cnVjdG9yXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3RydWN0b3IocHJpdmF0ZSBfYmFzZVVybCA9ICdodHRwczovL2Nsb3VkLm15b3AuZGV2JylcbiAqIGBgYFxuICpcbiAqICoqUGFyYW1ldGVyczoqKlxuICogLSBgX2Jhc2VVcmxgIChvcHRpb25hbCk6IFRoZSBiYXNlIFVSTCBmb3IgdGhlIE15b3AuZGV2IGNsb3VkIEFQSS4gRGVmYXVsdHMgdG8gYCdodHRwczovL2Nsb3VkLm15b3AuZGV2J2BcbiAqXG4gKiAjIyMgU3RhdGljIFByb3BlcnRpZXNcbiAqXG4gKiAjIyMjIE1haW5cbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHN0YXRpYyBNYWluID0gbmV3IENsb3VkUmVwb3NpdG9yeSgpO1xuICogYGBgXG4gKlxuICogQSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGBDbG91ZFJlcG9zaXRvcnlgIGNsYXNzIHRoYXQgY2FuIGJlIHVzZWQgdGhyb3VnaG91dCB0aGUgYXBwbGljYXRpb24gd2l0aG91dCBjcmVhdGluZyBtdWx0aXBsZSBpbnN0YW5jZXMuXG4gKlxuICogIyMjIFByaXZhdGUgUHJvcGVydGllc1xuICpcbiAqICMjIyMgdXNlckZsb3dzXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBwcml2YXRlIHVzZXJGbG93czogUmVjb3JkPHN0cmluZywgUHJvbWlzZTxJVXNlckZsb3c+PiA9IHt9O1xuICogYGBgXG4gKlxuICogQSBjYWNoZSBvYmplY3QgdGhhdCBzdG9yZXMgcHJvbWlzZXMgZm9yIHVzZXIgZmxvd3MsIGluZGV4ZWQgYnkgZmxvdyBJRC4gVGhpcyBwcmV2ZW50cyBkdXBsaWNhdGUgQVBJIGNhbGxzIGZvciB0aGUgc2FtZSBmbG93IGFuZCBlbnN1cmVzIGNvbnNpc3RlbnQgZGF0YSByZXRyaWV2YWwuXG4gKlxuICogIyMjIyBfYmFzZVVybFxuICogYGBgdHlwZXNjcmlwdFxuICogcHJpdmF0ZSBfYmFzZVVybDogc3RyaW5nXG4gKiBgYGBcbiAqXG4gKiBUaGUgYmFzZSBVUkwgZm9yIHRoZSBjbG91ZCBBUEkgZW5kcG9pbnRzLCBzZXQgZHVyaW5nIGNvbnN0cnVjdGlvbi5cbiAqXG4gKiAjIyBNZXRob2RzXG4gKlxuICogIyMjIGZldGNoRmxvdyhmbG93SWQ6IHN0cmluZylcbiAqXG4gKiBSZXRyaWV2ZXMgYSBjb21wbGV0ZSB1c2VyIGZsb3cgZnJvbSB0aGUgY2xvdWQgcmVwb3NpdG9yeSwgaW5jbHVkaW5nIGFsbCByZXNvbHZlZCBjb21wb25lbnRzLlxuICpcbiAqICoqUGFyYW1ldGVyczoqKlxuICogLSBgZmxvd0lkYDogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgdXNlciBmbG93IHRvIHJldHJpZXZlXG4gKlxuICogKipSZXR1cm5zOioqXG4gKiAtIGBQcm9taXNlPElVc2VyRmxvdz5gOiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY29tcGxldGUgdXNlciBmbG93IG9iamVjdFxuICpcbiAqICoqQmVoYXZpb3I6KipcbiAqIC0gSW1wbGVtZW50cyByZXF1ZXN0IGNhY2hpbmcgdG8gYXZvaWQgZHVwbGljYXRlIEFQSSBjYWxscyBmb3IgdGhlIHNhbWUgZmxvdyBJRFxuICogLSBNYWtlcyBhIEdFVCByZXF1ZXN0IHRvIGAvZmxvdz9pZD17Zmxvd0lkfSZyZXNvbHZlPWNvbXBvbmVudHNgXG4gKiAtIEF1dG9tYXRpY2FsbHkgcmVzb2x2ZXMgY29tcG9uZW50IHJlZmVyZW5jZXMgd2l0aGluIHRoZSBmbG93XG4gKiAtIFN0b3JlcyB0aGUgcHJvbWlzZSBpbiB0aGUgY2FjaGUgZm9yIGZ1dHVyZSB1c2VcbiAqXG4gKiAqKkV4YW1wbGUgVXNhZ2U6KipcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGZsb3cgPSBhd2FpdCBDbG91ZFJlcG9zaXRvcnkuTWFpbi5mZXRjaEZsb3coJ215LWZsb3ctaWQnKTtcbiAqIGNvbnNvbGUubG9nKGZsb3cuY29tcG9uZW50cyk7XG4gKiBgYGBcbiAqXG4gKiAjIyMgZmV0Y2hDb21wb25lbnQoY29tcG9uZW50SWQ6IHN0cmluZywgZmxvd0lkOiBzdHJpbmcpXG4gKlxuICogUmV0cmlldmVzIGEgc3BlY2lmaWMgY29tcG9uZW50IGZyb20gd2l0aGluIGEgdXNlciBmbG93LlxuICpcbiAqICoqUGFyYW1ldGVyczoqKlxuICogLSBgY29tcG9uZW50SWRgOiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjb21wb25lbnQgdG8gcmV0cmlldmVcbiAqIC0gYGZsb3dJZGA6IFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHVzZXIgZmxvdyBjb250YWluaW5nIHRoZSBjb21wb25lbnRcbiAqXG4gKiAqKlJldHVybnM6KipcbiAqIC0gYFByb21pc2U8Q29tcG9uZW50IHwgdW5kZWZpbmVkPmA6IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjb21wb25lbnQgb2JqZWN0IGlmIGZvdW5kLCBvciB1bmRlZmluZWQgaWYgbm90IGZvdW5kXG4gKlxuICogKipCZWhhdmlvcjoqKlxuICogLSBGaXJzdCBmZXRjaGVzIHRoZSBjb21wbGV0ZSBmbG93IHVzaW5nIGBmZXRjaEZsb3coKWBcbiAqIC0gU2VhcmNoZXMgdGhyb3VnaCB0aGUgZmxvdydzIGNvbXBvbmVudHMgYXJyYXkgdG8gZmluZCB0aGUgbWF0Y2hpbmcgY29tcG9uZW50XG4gKiAtIFVzZXMgdGhlIGNvbXBvbmVudCdzIGB0eXBlLmlkYCBwcm9wZXJ0eSBmb3IgbWF0Y2hpbmdcbiAqXG4gKiAqKkV4YW1wbGUgVXNhZ2U6KipcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGNvbXBvbmVudCA9IGF3YWl0IENsb3VkUmVwb3NpdG9yeS5NYWluLmZldGNoQ29tcG9uZW50KCdidXR0b24tY29tcG9uZW50JywgJ215LWZsb3ctaWQnKTtcbiAqIGlmIChjb21wb25lbnQpIHtcbiAqICAgICBjb25zb2xlLmxvZygnQ29tcG9uZW50IGZvdW5kOicsIGNvbXBvbmVudCk7XG4gKiB9IGVsc2Uge1xuICogICAgIGNvbnNvbGUubG9nKCdDb21wb25lbnQgbm90IGZvdW5kIGluIGZsb3cnKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqICMjIEFQSSBJbnRlZ3JhdGlvblxuICpcbiAqICMjIyBFbmRwb2ludCBTdHJ1Y3R1cmVcbiAqXG4gKiBUaGUgY2xhc3MgaW50ZWdyYXRlcyB3aXRoIHRoZSBmb2xsb3dpbmcgTXlvcC5kZXYgY2xvdWQgQVBJIGVuZHBvaW50OlxuICpcbiAqIGBgYFxuICogR0VUIHtiYXNlVXJsfS9mbG93P2lkPXtmbG93SWR9JnJlc29sdmU9Y29tcG9uZW50c1xuICogYGBgXG4gKlxuICogKipRdWVyeSBQYXJhbWV0ZXJzOioqXG4gKiAtIGBpZGA6IFRoZSBmbG93IGlkZW50aWZpZXJcbiAqIC0gYHJlc29sdmU9Y29tcG9uZW50c2A6IEluc3RydWN0cyB0aGUgQVBJIHRvIGluY2x1ZGUgcmVzb2x2ZWQgY29tcG9uZW50IGRhdGEgaW4gdGhlIHJlc3BvbnNlXG4gKlxuICogIyMjIFJlc3BvbnNlIEZvcm1hdFxuICpcbiAqIFRoZSBBUEkgaXMgZXhwZWN0ZWQgdG8gcmV0dXJuIGEgSlNPTiByZXNwb25zZSB3aXRoIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOlxuICpcbiAqIGBgYGpzb25cbiAqIHtcbiAqICAgICBcIml0ZW1cIjoge1xuICogICAgICAgICAvLyBJVXNlckZsb3cgb2JqZWN0IHdpdGggcmVzb2x2ZWQgY29tcG9uZW50c1xuICogICAgICAgICBcImNvbXBvbmVudHNcIjogW1xuICogICAgICAgICAgICAge1xuICogICAgICAgICAgICAgICAgIFwidHlwZVwiOiB7XG4gKiAgICAgICAgICAgICAgICAgICAgIFwiaWRcIjogXCJjb21wb25lbnQtaWRcIlxuICogICAgICAgICAgICAgICAgIH1cbiAqICAgICAgICAgICAgICAgICAvLyAuLi4gb3RoZXIgY29tcG9uZW50IHByb3BlcnRpZXNcbiAqICAgICAgICAgICAgIH1cbiAqICAgICAgICAgXVxuICogICAgICAgICAvLyAuLi4gb3RoZXIgZmxvdyBwcm9wZXJ0aWVzXG4gKiAgICAgfVxuICogfVxuICogYGBgXG4gKlxuICogIyMgQ2FjaGluZyBTdHJhdGVneVxuICpcbiAqIFRoZSBgQ2xvdWRSZXBvc2l0b3J5YCBpbXBsZW1lbnRzIGEgcHJvbWlzZS1iYXNlZCBjYWNoaW5nIG1lY2hhbmlzbTpcbiAqXG4gKiAxLiAqKkNhY2hlIEtleSoqOiBGbG93IElEIGlzIHVzZWQgYXMgdGhlIGNhY2hlIGtleVxuICogMi4gKipDYWNoZSBWYWx1ZSoqOiBQcm9taXNlcyBhcmUgY2FjaGVkIHJhdGhlciB0aGFuIHJlc29sdmVkIHZhbHVlcyB0byBoYW5kbGUgY29uY3VycmVudCByZXF1ZXN0c1xuICogMy4gKipDYWNoZSBEdXJhdGlvbioqOiBDYWNoZSBwZXJzaXN0cyBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSByZXBvc2l0b3J5IGluc3RhbmNlXG4gKiA0LiAqKkNhY2hlIEludmFsaWRhdGlvbioqOiBObyBhdXRvbWF0aWMgY2FjaGUgaW52YWxpZGF0aW9uIGlzIGltcGxlbWVudGVkXG4gKlxuICogIyMgRXJyb3IgSGFuZGxpbmdcbiAqXG4gKiAtIE5ldHdvcmsgZXJyb3JzIGFuZCBBUEkgZmFpbHVyZXMgYXJlIHByb3BhZ2F0ZWQgdGhyb3VnaCBwcm9taXNlIHJlamVjdGlvblxuICogLSBObyBzcGVjaWZpYyBlcnJvciBoYW5kbGluZyBvciByZXRyeSBsb2dpYyBpcyBpbXBsZW1lbnRlZCBhdCB0aGUgcmVwb3NpdG9yeSBsZXZlbFxuICogLSBDb25zdW1lcnMgc2hvdWxkIGltcGxlbWVudCBhcHByb3ByaWF0ZSBlcnJvciBoYW5kbGluZyB3aGVuIGNhbGxpbmcgcmVwb3NpdG9yeSBtZXRob2RzXG4gKlxuICogIyMgVXNhZ2UgUGF0dGVybnNcbiAqXG4gKiAjIyMgU2luZ2xldG9uIEFjY2Vzc1xuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgQ2xvdWRSZXBvc2l0b3J5IH0gZnJvbSAnLi9wYXRoL3RvL0Nsb3VkUmVwb3NpdG9yeSc7XG4gKlxuICogLy8gVXNlIHRoZSBzaW5nbGV0b24gaW5zdGFuY2VcbiAqIGNvbnN0IGZsb3cgPSBhd2FpdCBDbG91ZFJlcG9zaXRvcnkuTWFpbi5mZXRjaEZsb3coJ2Zsb3ctaWQnKTtcbiAqIGBgYFxuICpcbiAqICMjIyBDdXN0b20gSW5zdGFuY2VcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIGN1c3RvbSBpbnN0YW5jZSB3aXRoIGRpZmZlcmVudCBiYXNlIFVSTFxuICogY29uc3QgY3VzdG9tUmVwbyA9IG5ldyBDbG91ZFJlcG9zaXRvcnkoJ2h0dHBzOi8vY3VzdG9tLWFwaS5leGFtcGxlLmNvbScpO1xuICogY29uc3QgZmxvdyA9IGF3YWl0IGN1c3RvbVJlcG8uZmV0Y2hGbG93KCdmbG93LWlkJyk7XG4gKiBgYGBcbiAqXG4gKiAjIyMgQ29tcG9uZW50IFJldHJpZXZhbFxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gR2V0IGEgc3BlY2lmaWMgY29tcG9uZW50IGZyb20gYSBmbG93XG4gKiBjb25zdCBjb21wb25lbnQgPSBhd2FpdCBDbG91ZFJlcG9zaXRvcnkuTWFpbi5mZXRjaENvbXBvbmVudCgnY29tcG9uZW50LWlkJywgJ2Zsb3ctaWQnKTtcbiAqIGBgYFxuICpcbiAqICMjIERlcGVuZGVuY2llc1xuICpcbiAqIC0gKipJVXNlckZsb3cqKjogSW50ZXJmYWNlIGltcG9ydGVkIGZyb20gYC4uL2NvbW1vbmAgdGhhdCBkZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdXNlciBmbG93IG9iamVjdHNcbiAqIC0gKipGZXRjaCBBUEkqKjogVXNlcyB0aGUgbmF0aXZlIGBmZXRjaGAgZnVuY3Rpb24gZm9yIEhUVFAgcmVxdWVzdHNcbiAqXG4gKiAjIyBQZXJmb3JtYW5jZSBDb25zaWRlcmF0aW9uc1xuICpcbiAqIC0gKipDYWNoaW5nKio6IFByZXZlbnRzIGR1cGxpY2F0ZSBBUEkgY2FsbHMgZm9yIHRoZSBzYW1lIGZsb3cgSURcbiAqIC0gKipQcm9taXNlIENhY2hpbmcqKjogSGFuZGxlcyBjb25jdXJyZW50IHJlcXVlc3RzIGVmZmljaWVudGx5IGJ5IGNhY2hpbmcgcHJvbWlzZXNcbiAqIC0gKipDb21wb25lbnQgUmVzb2x1dGlvbioqOiBUaGUgYHJlc29sdmU9Y29tcG9uZW50c2AgcGFyYW1ldGVyIGVuc3VyZXMgY29tcG9uZW50cyBhcmUgZnVsbHkgcmVzb2x2ZWQgaW4gYSBzaW5nbGUgQVBJIGNhbGxcbiAqXG4gKiAjIyBGdXR1cmUgRW5oYW5jZW1lbnRzXG4gKlxuICogVGhlIGNsYXNzIHN0cnVjdHVyZSBzdWdnZXN0cyBwbGFubmVkIGZ1bmN0aW9uYWxpdHkgdGhhdCBjb3VsZCBiZSBpbXBsZW1lbnRlZDpcbiAqXG4gKiAtICoqQ29tcG9uZW50IENhY2hpbmcqKjogVGhlIGNvbW1lbnRlZCBgY29tcG9uZW50c2AgcHJvcGVydHkgaW5kaWNhdGVzIHBvdGVudGlhbCBpbmRpdmlkdWFsIGNvbXBvbmVudCBjYWNoaW5nXG4gKiAtICoqQ2FjaGUgSW52YWxpZGF0aW9uKio6IE1ldGhvZHMgdG8gY2xlYXIgb3IgcmVmcmVzaCBjYWNoZWQgZGF0YVxuICogLSAqKkVycm9yIFJldHJ5IExvZ2ljKio6IEF1dG9tYXRpYyByZXRyeSBtZWNoYW5pc21zIGZvciBmYWlsZWQgcmVxdWVzdHNcbiAqIC0gKipCYXRjaCBPcGVyYXRpb25zKio6IE1ldGhvZHMgdG8gZmV0Y2ggbXVsdGlwbGUgZmxvd3Mgb3IgY29tcG9uZW50cyBpbiBhIHNpbmdsZSByZXF1ZXN0XG4gKlxuICovXG5leHBvcnQgY2xhc3MgQ2xvdWRSZXBvc2l0b3J5IHtcbiAgICBzdGF0aWMgTWFpbiA9IG5ldyBDbG91ZFJlcG9zaXRvcnkoKTtcblxuICAgIHByaXZhdGUgdXNlckZsb3dzOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPElVc2VyRmxvdz4+ID0ge307XG5cbiAgICAvLyBwcml2YXRlIGNvbXBvbmVudHM6IFJlY29yZDxzdHJpbmcsIFByb21pc2U8SVVzZXJGbG93Pj4gPSB7fTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Jhc2VVcmwgPSAnaHR0cHM6Ly9jbG91ZC5teW9wLmRldicpIHtcbiAgICB9XG5cbiAgICBhc3luYyBmZXRjaENvbXBvbmVudChjb21wb25lbnRJZDogc3RyaW5nLCBmbG93SWQ/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGZsb3dJZCkge1xuICAgICAgICAgICAgY29uc3QgZmxvdyA9IGF3YWl0IHRoaXMuZmV0Y2hGbG93KGZsb3dJZCk7XG4gICAgICAgICAgICByZXR1cm4gZmxvdy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLnR5cGUuaWQgPT09IGNvbXBvbmVudElkKTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBjb25zdCBmbG93ID0gYXdhaXQgdGhpcy5mZXRjaEF1dG9GbG93KGNvbXBvbmVudElkKTtcbiAgICAgICAgICAgIHJldHVybiBmbG93LmNvbXBvbmVudHNbMF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBmZXRjaEF1dG9GbG93KGNvbXBvbmVudElkOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF0pIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICB0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF0gPSBuZXcgUHJvbWlzZShcbiAgICAgICAgICAgICAgICBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLl9iYXNlVXJsfS9mbG93P2lkPSR7Y29tcG9uZW50SWR9JmF1dG89dHJ1ZWBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoanNvbi5pdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF07XG4gICAgfVxuXG5cbiAgICBhc3luYyBmZXRjaEZsb3coZmxvd0lkOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnVzZXJGbG93c1tmbG93SWRdKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgICAgICAgICAgdGhpcy51c2VyRmxvd3NbZmxvd0lkXSA9IG5ldyBQcm9taXNlKFxuICAgICAgICAgICAgICAgIGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke3RoaXMuX2Jhc2VVcmx9L2Zsb3c/aWQ9JHtmbG93SWR9JnJlc29sdmU9Y29tcG9uZW50c2BcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoanNvbi5pdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnVzZXJGbG93c1tmbG93SWRdO1xuICAgIH1cbn1cbiIsICJleHBvcnQgY29uc3QgZXhlYyA9IGFzeW5jIChnZXR0ZXI6IGFueSkgPT4ge1xuICAgIHJldHVybiBhd2FpdCBnZXR0ZXIoKVxufVxuIiwgImV4cG9ydCBjb25zdCBfX2ZlZGVyYXRpb25fXyA9IFwiX19mZWRlcmF0aW9uX19cIlxuZXhwb3J0IGNvbnN0IG9uTG9hZEtleSA9IFwib25Mb2FkXCJcbmV4cG9ydCBjb25zdCBtb2R1bGVJbnN0YW5jZUtleSA9IFwibW9kdWxlSW5zdGFuY2VcIlxuXG5leHBvcnQgY29uc3QgZGVmaW5lRHluYW1pY0ltcG9ydCA9IChnbG9iYWxOYW1lOiBzdHJpbmcsIG1vZHVsZTogYW55KSA9PiB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmICh3aW5kb3dbX19mZWRlcmF0aW9uX19dICYmIHdpbmRvd1tfX2ZlZGVyYXRpb25fX11bZ2xvYmFsTmFtZV0gJiYgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXVtvbkxvYWRLZXldKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXVtvbkxvYWRLZXldKHtbZ2xvYmFsTmFtZV06IG1vZHVsZX0pXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnX19mZWRlcmF0aW9uX18gbG9hZGVyIG5vdCBkZWZpbmVkIGZvciBtb2R1bGUnLCBtb2R1bGUpO1xuICAgIH1cbn0iLCAidHlwZSBTdHJpbmdXaXRoQXV0b2NvbXBsZXRlPFQ+ID0gVCB8IChzdHJpbmcgJiBSZWNvcmQ8bmV2ZXIsIG5ldmVyPik7XG5cbmV4cG9ydCB0eXBlIE15b3BNZXNzYWdlS2V5ID0gU3RyaW5nV2l0aEF1dG9jb21wbGV0ZTxrZXlvZiB0eXBlb2YgTXlvcE1lc3NhZ2VzIHwga2V5b2YgdHlwZW9mIE15b3BNZXNzYWdlcy5Jbj47XG5cbmV4cG9ydCBjb25zdCBNeW9wTWVzc2FnZXMgPSB7XG4gICAgLy9ob3N0IHRvIGNvbXBvbmVudFxuICAgICdJbml0UmVxdWVzdCc6ICdJbml0UmVxdWVzdCcsXG4gICAgJ0luaXRSZXNwb25zZSc6ICdJbml0UmVzcG9uc2UnLFxuICAgICdJbml0TWVzc2FnZSc6ICdJbml0TWVzc2FnZScsXG4gICAgJ0Rpc3Bvc2VNZXNzYWdlJzogJ0Rpc3Bvc2VNZXNzYWdlJyxcblxuICAgICdDaGFuZ2VUZXh0TWVzc2FnZSc6ICdDaGFuZ2VUZXh0TWVzc2FnZScsXG4gICAgJ0JpbmRDbGlja01lc3NhZ2UnOiAnQmluZENsaWNrTWVzc2FnZScsXG4gICAgJ0RldGVjdE15b3BSZWZzTWVzc2FnZSc6ICdEZXRlY3RNeW9wUmVmc01lc3NhZ2UnLFxuXG4gICAgJ0V4ZWN1dGVTY3JpcHRNZXNzYWdlJzogJ0V4ZWN1dGVTY3JpcHRNZXNzYWdlJyxcblxuICAgICdBZGRFdmVudExpc3RlbmVyTWVzc2FnZSc6ICdBZGRFdmVudExpc3RlbmVyTWVzc2FnZScsXG4gICAgJ1NldEF0dHJpYnV0ZU1lc3NhZ2UnOiAnU2V0QXR0cmlidXRlTWVzc2FnZScsXG5cbiAgICAnQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSc6ICdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlJyxcbiAgICAnRW52ZWxvcGVkTWVzc2FnZSc6ICdFbnZlbG9wZWRNZXNzYWdlJyxcblxuICAgICdHZXRFbGVtZW50VmFsdWVNZXNzYWdlJzogJ0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnLFxuICAgICdHZXRBdHRyaWJ1dGVNZXNzYWdlJzogJ0dldEF0dHJpYnV0ZU1lc3NhZ2UnLFxuXG4gICAgJ1NldElubmVySHRtbCc6ICdTZXRJbm5lckh0bWwnLFxuXG4gICAgLy9jb21wb25lbnQgbWVzc2FnZXNcbiAgICAnRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCc6ICdFeGVjdXRlQ29tcG9uZW50TWV0aG9kJyxcbiAgICAnU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnOiAnU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnLFxuICAgICdTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnOiAnU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlJyxcblxuICAgICdDbGVhbnVwTWVzc2FnZSc6ICdDbGVhbnVwTWVzc2FnZScsXG5cbiAgICAvLyBleHRlcm5hbCB0byBob3N0IDpcbiAgICBJbjoge1xuICAgICAgICAnRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UnOiAnRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UnLFxuICAgICAgICAnQ2xpY2tSZXBsYXlNZXNzYWdlJzogJ0NsaWNrUmVwbGF5TWVzc2FnZScsXG4gICAgICAgICdFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlJzogJ0V4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UnLFxuXG4gICAgICAgICdFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlJzogJ0V2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UnLFxuICAgICAgICAnRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSc6ICdFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlJyxcblxuICAgICAgICBcIkdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2VcIjogXCJHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlXCIsXG4gICAgICAgICdSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSc6ICdSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZScsXG4gICAgICAgICdFbnZlbG9wZWRNZXNzYWdlJzogJ0VudmVsb3BlZE1lc3NhZ2UnLFxuXG4gICAgICAgICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc6ICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZScsXG4gICAgICAgICdDbGVhbnVwUmVwbGF5TWVzc2FnZSc6ICdDbGVhbnVwUmVwbGF5TWVzc2FnZScsXG4gICAgICAgICdSZXNpemVPYnNlcnZlck1lc3NhZ2UnOiAnUmVzaXplT2JzZXJ2ZXJNZXNzYWdlJ1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5LCBNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSxcbiAgICBEaXNwb3NlTWVzc2FnZSwgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCwgTWVzc2FnZURpcmVjdGlvbixcbiAgICBDbGVhbnVwTWVzc2FnZSwgQ2xlYW51cFJlcGxheU1lc3NhZ2UsXG4gICAgTXlvcEJpbmRNZXNzYWdlLFxuICAgIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmXG59IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudERlZmluaXRpb25Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7SG9zdFNESywgbG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcblxuLy9UT0RPIDogY2hhbmdlIElNeW9wQ29tcG9uZW50IHRvIHJlZiBzcGVjaWZpYyBpbXBsXG50eXBlIFJlZlR5cGVzID0ge1xuICAgIFtrZXk6IHN0cmluZ106IElNeW9wQ29tcG9uZW50IHwgUmVmXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIElNeW9wQ29tcG9uZW50PFAgPSBhbnksIFIgPSBhbnk+IHtcblxuICAgIGlkOiBzdHJpbmc7XG5cbiAgICBpc0luaXRpYXRlZDogYm9vbGVhbjtcblxuICAgIG1hcmtlZEZvckRpc3Bvc2VkOiBib29sZWFuO1xuXG4gICAgc2V0SW5pdGlhdGVkOiAoKSA9PiB2b2lkXG5cbiAgICBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1xuXG4gICAgY29udGFpbmVyOiBIVE1MRWxlbWVudFxuXG4gICAgLy9yZWYgY29tcG9uZW50cyBjYW4gYmUgZWxlbWVudC1sZXNzXG4gICAgZWxlbWVudD86IEhUTUxFbGVtZW50XG5cbiAgICBzZW5kOiAobXNnOiBCYXNlTXlvcE1lc3NhZ2UpID0+IENsZWFudXBIYW5kbGVyXG5cbiAgICBiaW5kKG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleSwgaGFuZGxlcjogKCkgPT4gYm9vbGVhbik6IHZvaWQ7XG5cbiAgICBiaW5kPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+KG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleSwgaGFuZGxlcjogKG1lc3NhZ2U6IFQpID0+IGJvb2xlYW4pOiB2b2lkO1xuXG4gICAgLy8gYm9vbGVhbiByZXR1cm5lZCB2YWx1ZSA9IGhhbmRsZWQgb3Igbm90XG4gICAgb25NZXNzYWdlUmVjZWl2ZWQ6IChtc2c6IEJhc2VNeW9wTWVzc2FnZSkgPT4gYm9vbGVhblxuXG4gICAgaW5pdGlhdGVkOiAoKSA9PiBQcm9taXNlPGFueT47XG5cbiAgICBkaXNwb3NlOiAoKSA9PiB2b2lkXG5cbiAgICBoaWRlKCk6IHZvaWQ7XG5cbiAgICBzaG93KCk6IHZvaWQ7XG5cbiAgICBpbnNwZWN0KCk6IHZvaWQ7XG5cbiAgICBwYXJlbnQ/OiBJTXlvcENvbXBvbmVudDtcblxuICAgIHByb3BzOiBQXG5cbiAgICByZWZzOiBSXG59XG5cbmZ1bmN0aW9uIGlzSW5oZXJpdEZyb20ob2JqOiBhbnksIGJhc2VDbGFzczogYW55KSB7XG4gICAgaWYgKCFvYmopIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik7XG5cbiAgICBpZiAoIXByb3RvKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAocHJvdG8uY29uc3RydWN0b3IubmFtZSA9PT0gYmFzZUNsYXNzLm5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBpc0luaGVyaXRGcm9tKHByb3RvLCBiYXNlQ2xhc3MpO1xufVxuXG4vLyBUT0RPIDogbW92ZSA6IFxudHlwZSBtZXNzYWdlSGFuZGxlcjxUPiA9IChtZXNzYWdlOiBUKSA9PiBib29sZWFuO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BDb21wb25lbnQ8UCA9IGFueSwgUiBleHRlbmRzIFJlZlR5cGVzID0gUmVmVHlwZXM+IGltcGxlbWVudHMgSU15b3BDb21wb25lbnQ8UD4ge1xuICAgIGlkOiBzdHJpbmcgPSAnJ1xuXG4gICAgbWVzc2FnZUhhbmRsZXJzOiBSZWNvcmQ8c3RyaW5nLCBtZXNzYWdlSGFuZGxlcjxhbnk+W10+ID0ge307XG5cbiAgICBlbGVtZW50PzogSFRNTEVsZW1lbnRcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihwdWJsaWMgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICB0aGlzLmlkID0gb3B0aW9ucz8uaWQgfHwgSG9zdFNESy5JbnN0YW5jZSgpLmFzc2lnbklkKGNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gb3B0aW9ucz8udGltZW91dCA/IG9wdGlvbnM/LnRpbWVvdXQgOiA1ICogMTAwMDtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNJbml0aWF0ZWQgJiYgdGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdCAmJiAhdGhpcy5fbWFya2VkRm9yRGlzcG9zZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0KGB0aW1lb3V0XyR7dGltZW91dH0gJHt0aGlzLmlkfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aW1lb3V0KTtcblxuICAgICAgICAvLyBUT0RPIDogYXV0byBpbnNwZWN0LCBjb250cm9sIGZyb20gY29uZmlnXG4gICAgICAgIHRoaXMuaW5pdGlhdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpZiAod2luZG93Lm15b3AuaG9zdFNESy5pbnNwZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluc3BlY3QoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfbWFya2VkRm9yRGlzcG9zZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGdldCBtYXJrZWRGb3JEaXNwb3NlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcmtlZEZvckRpc3Bvc2VkO1xuICAgIH1cblxuICAgIHNldCBtYXJrZWRGb3JEaXNwb3NlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fbWFya2VkRm9yRGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbjogVGhlIGNvbXBvbmVudCBpcyBhbHJlYWR5IGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGRpc3Bvc2VkLiBEaXNwb3NlIG9wZXJhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkIGFnYWluIHVudGlsIHRoZSBjdXJyZW50IGRpc3Bvc2FsIHByb2Nlc3MgaXMgY29tcGxldGUuJylcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXJrZWRGb3JEaXNwb3NlZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIGFic3RyYWN0IGhpZGUoKTogdm9pZDtcblxuICAgIGFic3RyYWN0IHNob3coKTogdm9pZDtcblxuICAgIGFic3RyYWN0IGluc3BlY3QoKTogQ2xlYW51cEhhbmRsZXI7XG5cbiAgICAvL1RPRE86IHVzZSBiaW5kV2hlbiB3aXRoIHJldHVybiB0cnVlIHByZWRpY2F0ZSAuLi5cbiAgICBiaW5kID0gPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+KG1lc3NhZ2VUeXBlOiBzdHJpbmcsIGhhbmRsZXI6IChtZXNzYWdlOiBUKSA9PiBib29sZWFuKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0gPSBbXVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaGFuZGxlIGR1cGxpY2F0ZSByZWdpc3RyYXRpb25cbiAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0uaW5jbHVkZXMoaGFuZGxlcikpIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXS5wdXNoKGhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYmluZFdoZW4gPSA8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4obWVzc2FnZVR5cGU6IHN0cmluZywgcHJlZGljYXRlOiAobWVzc2FnZTogVCkgPT4gYm9vbGVhbiwgaGFuZGxlcjogKG1lc3NhZ2U6IFQpID0+IHZvaWQpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5cXCd0IHVzZSBjb21wb25lbnQuYmluZFdoZW4gd2l0aG91dCBhbiBoYW5kbGVyJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXSkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdID0gW11cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdO1xuXG4gICAgICAgIGNvbnN0IHByZWRpY2F0ZVdyYXBwZWRIYW5kbGVyID0gKGU6IFQpID0+IHtcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoZSkpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyKGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vVE9ETyA6IGhhbmRsZSBkdXBsaWNhdGUgcmVnaXN0cmF0aW9uID9cbiAgICAgICAgaGFuZGxlcnMucHVzaChwcmVkaWNhdGVXcmFwcGVkSGFuZGxlcik7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaGFuZGxlcnMuaW5kZXhPZihwcmVkaWNhdGVXcmFwcGVkSGFuZGxlcik7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnb25NZXNzYWdlUmVjZWl2ZWQnLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmLCBpbmNvbWVNZXNzYWdlLCB0aGlzKTtcbiAgICAgICAgLy9UT0RPIDogaGFuZGVsIHNwZWNpYWwgZXZldHMgPyBsaWtlIGluaXRSZXMgP1xuICAgICAgICBpZiAoaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkV4ZWN1dGVDb21wb25lbnRNZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IChpbmNvbWVNZXNzYWdlIGFzIEV4ZWN1dGVDb21wb25lbnRNZXRob2QpO1xuXG4gICAgICAgICAgICAvL2tlZXBpbmcgdGhpcy5tZXRob2QoKSBzbyB0aGF0IGNvbnRleHQgd2lsbCBzYXZlZFxuICAgICAgICAgICAgaWYgKCh0aGlzIGFzIGFueSlbdHlwZWRNZXNzYWdlLm1ldGhvZF0pIHtcbiAgICAgICAgICAgICAgICAodGhpcyBhcyBhbnkpW3R5cGVkTWVzc2FnZS5tZXRob2RdKHR5cGVkTWVzc2FnZS5jb250ZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYG1ldGhvZCBub3QgZm91bmQgJHt0eXBlZE1lc3NhZ2UubWV0aG9kfSBvbiBjb21wb25lbnRgLCB0aGlzKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnNbaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZV07XG4gICAgICAgIGlmIChoYW5kbGVycyAmJiBoYW5kbGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBoYW5kbGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGhhbmRsZXJzLmZvckVhY2goaGFuZGxlciA9PiB7XG4gICAgICAgICAgICAgICAgaGFuZGxlZCA9IGhhbmRsZWQgfHwgaGFuZGxlcihpbmNvbWVNZXNzYWdlKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy9UT0RPIDogY29uc29sZSBvbmx5IHdoZW4gZGVidWcgY29uZmlnXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdubyBoYW5kbGVycyBmb3VuZCBmb3IgJywgaW5jb21lTWVzc2FnZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc2V0SW5pdGlhdGVkID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmlzSW5pdGlhdGVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAodGhpcy5fd2hlbkluaXRpYXRlZFJlc29sdmUpXG4gICAgICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIGlzSW5pdGlhdGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBfd2hlbkluaXRpYXRlZFJlc29sdmU/OiAodmFsdWU/OiBhbnkpID0+IGFueTtcbiAgICBfd2hlbkluaXRpYXRlZFJlamVjdD86ICh2YWx1ZT86IGFueSkgPT4gYW55O1xuXG4gICAgX3doZW5Jbml0aWF0ZWQ6IFByb21pc2U8YW55PiA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xuXG4gICAgaW5pdGlhdGVkID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2hlbkluaXRpYXRlZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbmRDbGVhbnVwTWVzc2FnZShtZXNzYWdlOiBDbGVhbnVwTWVzc2FnZSk6IHZvaWQge1xuICAgICAgICBtZXNzYWdlLnNvdXJjZSA9IHRoaXMuaWQ7XG4gICAgICAgIG1lc3NhZ2UuZGVzdGluYXRpb24gPSB0aGlzLmlkO1xuICAgICAgICBtZXNzYWdlLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24uZG93bjtcblxuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuYmluZFdoZW4obWVzc2FnZS5yZXBseU1lc3NhZ2VLZXksIChtc2c6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG1zZy5yZXBsYXlUb0hhbmRsZXIgPT09IG1lc3NhZ2UuaGFuZGxlclVuaXF1ZUlkXG4gICAgICAgIH0sIChtOiBDbGVhbnVwUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZS5oYW5kbGVyKG0pO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgaGFuZGxlciA9IG1lc3NhZ2UuaGFuZGxlcjtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBkZWxldGUgbWVzc2FnZS5oYW5kbGVyXG5cbiAgICAgICAgdGhpcy5zZW5kKG1lc3NhZ2UpO1xuXG4gICAgICAgIG1lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXI7XG4gICAgfVxuXG4gICAgc2VuZChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBDbGVhbnVwSGFuZGxlciB7XG4gICAgICAgIC8vbWVzc2FnZXMgdGhhdCBleGV0cmFjdGVkIGZyb20gZW52ZWxvcGUgYWxyZWFkeSBoYXZlIHNvdXJjZSBpbiB0aGVtXG4gICAgICAgIGlmICghbWVzc2FnZS5zb3VyY2UpXG4gICAgICAgICAgICBtZXNzYWdlLnNvdXJjZSA9IHRoaXMuaWQ7XG5cbiAgICAgICAgaWYgKCFtZXNzYWdlLmRlc3RpbmF0aW9uKVxuICAgICAgICAgICAgbWVzc2FnZS5kZXN0aW5hdGlvbiA9IHRoaXMuaWQ7XG5cbiAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLmRvd247XG5cbiAgICAgICAgbGV0IGNsZWFudXBIYW5kbGVyO1xuICAgICAgICAvLyBUT0RPIDogZml4IGhlYXZ5IG9wLi5cbiAgICAgICAgLy8gIGlmIChpc0luaGVyaXRGcm9tKG1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZSkpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAobWVzc2FnZS5oYW5kbGVyKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSAobWVzc2FnZSBhcyBNeW9wQmluZE1lc3NhZ2UpO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIgPSB0aGlzLmJpbmRXaGVuKHR5cGVkTWVzc2FnZS5yZXBseU1lc3NhZ2VLZXksIChtc2c6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBtc2cucmVwbGF5VG9IYW5kbGVyID09PSB0eXBlZE1lc3NhZ2UuaGFuZGxlclVuaXF1ZUlkXG4gICAgICAgICAgICB9LCB0eXBlZE1lc3NhZ2UuaGFuZGxlcik7XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGRlbGV0ZSBtZXNzYWdlLmhhbmRsZXJcbiAgICAgICAgfVxuXG4gICAgICAgIC8vVE9ETzogdGhpbmsgYWJvdXQgdGhhdFxuICAgICAgICBpZiAobWVzc2FnZS5yZWYpIHtcbiAgICAgICAgICAgIC8vIHNlcmlhbGl6YWJsZVxuICAgICAgICAgICAgbWVzc2FnZS5yZWYgPSBtZXNzYWdlLnJlZi5fX25vblByb3hpZWQgfHwgbWVzc2FnZS5yZWY7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWVzc2FnZS5jbGVhbmFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kQ2xlYW51cE1lc3NhZ2UobmV3IENsZWFudXBNZXNzYWdlKG1lc3NhZ2UuaWQsIChyZXBsYXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogbG9nIHJlcGxheT9cbiAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2xlYW51cEhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXJrZWRGb3JEaXNwb3NlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzSW5pdGlhdGVkKSB7XG4gICAgICAgICAgICAvL1RPRE8gOiB1c2Ugc2RrLmxvZ2dlclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnZGlzcG9zaW5nIGJlZm9yZSBpc0luaXRpYXRlZCcsIHRoaXMuaWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKCdkaXNwb3NpbmcgY29tcG9uZW50JywgdGhpcy5pZCk7XG5cbiAgICAgICAgLy8gLy9UT0RPIDogaW1wbGVtZW50IGRpc3Bvc2UgZmxvd1xuICAgICAgICAvLyBPYmplY3Qua2V5cyh0aGlzLnJlZnMpLmZvckVhY2gocmVmS2V5PT57XG4gICAgICAgIC8vICAgICB0aGlzLnJlZnNbcmVmS2V5XS5kaXNwb3NlKCk7XG4gICAgICAgIC8vIH0pO1xuXG4gICAgICAgIC8vVE9ETyA6IGNoZWNrIGlmIHRoZXJlIGlzIGFueSB0aW1lIGZvciB0aGUgb1xuICAgICAgICAvLyB0aGVyIHNpZGUgdG8gcHJvY2Nlc3MgdG8gbWVzc2FnZSBiZWZvcmUgZGllID9cbiAgICAgICAgLy9ub3RpZnkgdGhlIG90aGVyIHNpZGUgU0RLXG4gICAgICAgIHRoaXMuc2VuZChuZXcgRGlzcG9zZU1lc3NhZ2UoKSlcblxuICAgICAgICBjb25zdCBvbkRpc3Bvc2VIYW5kbGVycyA9IHRoaXMubWVzc2FnZUhhbmRsZXJzWydvbkRpc3Bvc2UnXVxuICAgICAgICBpZiAob25EaXNwb3NlSGFuZGxlcnMpIHtcbiAgICAgICAgICAgIG9uRGlzcG9zZUhhbmRsZXJzLmZvckVhY2goZGlzcG9zZUhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHNlbmQgbnVsbCBvciBmaXggdGhlIHR5cGUgP1xuICAgICAgICAgICAgICAgIGRpc3Bvc2VIYW5kbGVyKG51bGwpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY29uc29sZS5sb2codGhpcy5jb250YWluZXIpO1xuICAgICAgICAvL3RoaXMuY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVycyA9IHt9XG4gICAgICAgIHRoaXMuaWQgKz0gJ19kaXNwb3NlZCc7XG4gICAgICAgIHRoaXMuaXNJbml0aWF0ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcm9wczogUCA9IHt9IGFzIHVua25vd24gYXMgUDtcbiAgICByZWZzOiBSID0ge30gYXMgdW5rbm93biBhcyBSO1xufVxuIiwgImV4cG9ydCBpbnRlcmZhY2UgSUVsZW1lbnRSZWYge1xuICAgIG15b3BJZD86IHN0cmluZ1xuICAgIGh0bWxUYWdOYW1lOiBzdHJpbmdcbiAgICBCb3VuZGluZ1JlY3Q/OiBET01SZWN0XG4gICAgb2Zmc2V0VG9wPzogbnVtYmVyXG4gICAgb2Zmc2V0TGVmdD86IG51bWJlclxuXG4gICAgdHlwZTogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBYUGF0aEVsZW1lbnRSZWYgaW1wbGVtZW50cyBJRWxlbWVudFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHhQYXRoOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIGh0bWxUYWdOYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIEJvdW5kaW5nUmVjdD86IERPTVJlY3QsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldFRvcD86IG51bWJlcixcbiAgICAgICAgICAgICAgICBwdWJsaWMgb2Zmc2V0TGVmdD86IG51bWJlcikge1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmcgPSAnWFBhdGhFbGVtZW50UmVmJ1xufVxuXG5leHBvcnQgY2xhc3MgTXlvcEVsZW1lbnRSZWYgaW1wbGVtZW50cyBJRWxlbWVudFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIG15b3BJZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBodG1sVGFnTmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBCb3VuZGluZ1JlY3Q/OiBET01SZWN0LFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvZmZzZXRUb3A/OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldExlZnQ/OiBudW1iZXIpIHtcblxuICAgIH1cblxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmcgPSAnTXlvcEVsZW1lbnRSZWYnXG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlcn0gZnJvbSBcIi4vaW5kZXgudHNcIjtcblxuZXhwb3J0IHR5cGUgSU1lc3NhZ2VFeGVjdXRvckNsZWFudXAgPSBDbGVhbnVwSGFuZGxlciB8IFByb21pc2U8Q2xlYW51cEhhbmRsZXI+IHwgUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5cbmV4cG9ydCBjb25zdCBydW5FeGVjdXRvckNsZWFudXAgPSBhc3luYyAodGFzazogSU1lc3NhZ2VFeGVjdXRvckNsZWFudXApID0+IHtcbiAgICBpZiAodHlwZW9mIHRhc2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gSXQncyBhIGZ1bmN0aW9uLCBjYWxsIGl0XG4gICAgICAgIHRhc2soKTtcbiAgICB9IGVsc2UgaWYgKHRhc2sgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIC8vIEl0J3MgYSBQcm9taXNlLCBhd2FpdCBpdFxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0YXNrO1xuXG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgcmVzdWx0IGlzIGEgZnVuY3Rpb24sIGNhbGwgaXRcbiAgICAgICAgICAgIHJlc3VsdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIElmIHRhc2sgaXMgdm9pZCwgZG8gbm90aGluZ1xufVxuXG50eXBlIElNZXNzYWdlRXhlY3V0b3I8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4gPSAobWVzc2FnZTogVCkgPT4gSU1lc3NhZ2VFeGVjdXRvckNsZWFudXA7XG5cbmludGVyZmFjZSBJTWVzc2FnZUhhbmRsZXI8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxuXG4gICAgZXhlY3V0b3I6IElNZXNzYWdlRXhlY3V0b3I8VD47XG5cbiAgICBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNZXNzYWdlSGFuZGxlcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlID0gYW55PiBpbXBsZW1lbnRzIElNZXNzYWdlSGFuZGxlcjxUPiB7XG5cbiAgICAvL1RPRE8gOiBhZGQgZGlzcG9zZSBtZXRob2RcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZCkge1xuXG4gICAgfVxuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5XG4gICAgYWJzdHJhY3QgZXhlY3V0b3I6IElNZXNzYWdlRXhlY3V0b3I8VD47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlQ29udGV4dE1lc3NhZ2VIYW5kbGVyPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2UgPSBhbnksIEUgPSBhbnk+IGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWQsIHB1YmxpYyBjb250ZXh0PzogRSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlVG9Ib3N0KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgcnVuRXhlY3V0b3JDbGVhbnVwfSBmcm9tIFwiLi9pbmRleC50c1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL2Jhc2VNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsIENsZWFudXBNZXNzYWdlLCBDbGVhbnVwUmVwbGF5TWVzc2FnZSwgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgRW52ZWxvcGVkTWVzc2FnZSxcbiAgICBJbml0TWVzc2FnZSxcbiAgICBJbml0UmVzcG9uc2UsXG4gICAgTWVzc2FnZURpcmVjdGlvbixcbiAgICBNeW9wQmluZE1lc3NhZ2UsXG4gICAgTXlvcEJpbmRSZXBsYXlNZXNzYWdlXG59IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuXG5leHBvcnQgY2xhc3MgSG9zdGVkQ29tcG9uZW50PFQgPSBhbnk+IHtcbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4ge1xuICAgICAgICAvL2RlYnVnZ2VyO1xuICAgIH1cblxuICAgIC8vb25NZXNzYWdlUmVjZWl2ZWQ6IChtc2c6IElNeW9wTWVzc2FnZSkgPT4gdm9pZDtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBpZDogc3RyaW5nLCBwdWJsaWMgY29udGV4dD86IFQpIHtcblxuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTXlvcFNESyB7XG4gICAgaW5pdDogKCkgPT4gdm9pZDtcblxuICAgIG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkXG5cbiAgICBzdXBwb3J0ZWRIYW5kbGVyczogQmFzZU1lc3NhZ2VIYW5kbGVyW107XG5cbiAgICBoYW5kbGVJbmNvbWVNZXNzYWdlczogKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4gdm9pZFxuXG4gICAgY29tcG9uZW50czogUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50Pjtcbn1cblxuLy8gY29uc3QgbG9jYWxIb3N0SGFuZGxlZE1lc3NhZ2VzID0gW1xuLy8gICAgIE15b3BNZXNzYWdlcy5Jbml0UmVxdWVzdCxcbi8vICAgICBNeW9wTWVzc2FnZXMuSW5pdFJlc3BvbnNlLFxuLy8gICAgIC8vTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UsXG4vLyBdXG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcFNESyBpbXBsZW1lbnRzIElNeW9wU0RLIHtcblxuICAgIGFic3RyYWN0IG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkO1xuXG4gICAgYWJzdHJhY3Qgc3VwcG9ydGVkSGFuZGxlcnM6IEJhc2VNZXNzYWdlSGFuZGxlcltdO1xuXG4gICAgbWVzc2FnZVRvSGFuZGxlQWZ0ZXJJbml0OiBCYXNlTXlvcE1lc3NhZ2VbXSA9IFtdO1xuXG4gICAgY29tcG9uZW50czogUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50PiA9IHt9O1xuXG4gICAgYWx3YXlzUGFzc0VudmVsb3Blc1RvSG9zdDogYm9vbGVhbiA9IGZhbHNlXG5cbiAgICBtZXNzYWdlQ2xlYW51cENhY2hlOiBSZWNvcmQ8c3RyaW5nLCBDbGVhbnVwSGFuZGxlciB8IFByb21pc2U8Q2xlYW51cEhhbmRsZXI+PiB8IFByb21pc2U8dm9pZD4gPSB7fTtcblxuICAgIGhhbmRsZUluY29tZU1lc3NhZ2VzKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgY29uc3QgZXZlbnRDb250ZW50ID0gZXZlbnQuZGF0YSA/IGV2ZW50LmRhdGEgOiBldmVudC5kZXRhaWw7XG5cbiAgICAgICAgaWYgKCFldmVudENvbnRlbnQgfHwgIWV2ZW50Q29udGVudC5teW9wKSB7XG4gICAgICAgICAgICAvLyBub3QgbXlvcCBtYXJrZWQgZXZlbnQgXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGV2ZW50Q29udGVudCBhcyBCYXNlTXlvcE1lc3NhZ2U7XG5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlLmRpcmVjdGlvbiAhPT0gTWVzc2FnZURpcmVjdGlvbi5kb3duKSB7XG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnbWVzc2FnZSBkcm9wcGVkIGluIGJhc2VTREssIGRpcmVjdGlvbiB3YXMgJywgZXZlbnQuZGF0YS5kaXJlY3Rpb24pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZiAobG9jYWxIb3N0SGFuZGxlZE1lc3NhZ2VzLmluY2x1ZGVzKG1lc3NhZ2UubWVzc2FnZVR5cGUpKSB7XG4gICAgICAgICAgICAvLyAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICAvLyAgICAgLy9UT0RPIDogZml4IGRpcmVjdGlvbiA/IG1lc3NhZ2Ugd2lsbCBub3QgcHJvY2Nlc3Mgb3RoZXJ3aXNlXG4gICAgICAgICAgICAvLyAgICAgd2luZG93Lm15b3AuaG9zdFNESy5zZW5kKG1lc3NhZ2UpXG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkRpc3Bvc2VNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHNob3VsZCBub3QgYmUgb3B0aW9uYWwsIGZpeCBhbmQgcmVtb3ZlICdpZidcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5kZXN0aW5hdGlvbilcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY29tcG9uZW50c1ttZXNzYWdlLmRlc3RpbmF0aW9uXVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gV2UgZ290IG91ciBpZCBmcm9tIG91ciBob3N0U0RLXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgLy9UT0RPIDogU0RLIG1heSBzZXJ2ZSBtb3JlIHRoYW4gMSBjb21wb25lbnQgLi4gdGhpbmsgYWJvdXQgdGhhdFxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdDb21wb25lbnRJZCA9IChtZXNzYWdlIGFzIEluaXRNZXNzYWdlKS5jb250ZW50LmlkO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50c1tuZXdDb21wb25lbnRJZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICAgICAgLy90aHJvdyBuZXcgRXJyb3IoXCJyZWNoaXZlZCBpbml0IG1lc3NhZ2UgZm9yIGFuIGV4c2lzaW5nIGNvbXBvbmVudC5cIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c1tuZXdDb21wb25lbnRJZF0gPSBuZXcgSG9zdGVkQ29tcG9uZW50KG5ld0NvbXBvbmVudElkKVxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgSW5pdFJlc3BvbnNlKG5ld0NvbXBvbmVudElkKSk7XG5cbiAgICAgICAgICAgICAgICAvLyBUT0RPIDogaXMgaXQgdHJ1ZSB0byBub3QgcGFzcyBmdXJ0aGVyICggdG8gdGhlIGNvbXBvbmVudCApXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBmb3Igc2FtZSBIb3N0U0RLIGNhc2VzXG4gICAgICAgICAgICAvLyB3aGVuIGJvdGggUmVmQ29tcG9uZW50IGFuZCByZWFsQ29tcG9uZW50IGhvc3RlZCBpbiB0aGUgc2FtZSBIb3N0U0RLXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnZlbG9wZWRNZXNzYWdlID0gKG1lc3NhZ2UgYXMgRW52ZWxvcGVkTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5uZXJNZXNzYWdlID0gZW52ZWxvcGVkTWVzc2FnZS5tZXNzYWdlO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBpbm5lck1lc3NhZ2U7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hbHdheXNQYXNzRW52ZWxvcGVzVG9Ib3N0IHx8IHRoaXMuY29tcG9uZW50c1ttZXNzYWdlLmRlc3RpbmF0aW9uIV0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbkNvbXBvbmVudCA9IG15b3AuaG9zdFNESy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09PSBpbm5lck1lc3NhZ2UuZGVzdGluYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdGluYXRpb25Db21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uQ29tcG9uZW50LnNlbmQoaW5uZXJNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW52ZWxvcGVkRGVzdGluYXRpb25Db21wb25lbnQgPSBteW9wLmhvc3RTREsuY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PT0gZW52ZWxvcGVkTWVzc2FnZS5kZXN0aW5hdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnZlbG9wZWREZXN0aW5hdGlvbkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGVkRGVzdGluYXRpb25Db21wb25lbnQuc2VuZChpbm5lck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2Upe1xuICAgICAgICAgICAgLy8gICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA6IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UgPSBtZXNzYWdlIGFzIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U7XG4gICAgICAgICAgICAvLyAvLyAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkNsZWFudXBNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IG1lc3NhZ2UgYXMgQ2xlYW51cE1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFudXAgPSB0aGlzLm1lc3NhZ2VDbGVhbnVwQ2FjaGVbdHlwZWRNZXNzYWdlLmNsZWFudXBGb3JNZXNzYWdlSWRdO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFudXBNZXNzYWdlID0gbmV3IENsZWFudXBSZXBsYXlNZXNzYWdlKCEhY2xlYW51cCk7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFudXBNZXNzYWdlLmRlc3RpbmF0aW9uID0gbWVzc2FnZS5kZXN0aW5hdGlvbjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoISFjbGVhbnVwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5tZXNzYWdlQ2xlYW51cENhY2hlW3R5cGVkTWVzc2FnZS5jbGVhbnVwRm9yTWVzc2FnZUlkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkV4ZWN1dG9yQ2xlYW51cChjbGVhbnVwKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QoY2xlYW51cE1lc3NhZ2UsIHR5cGVkTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogaGFuZGVsIGVycm9yP1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChjbGVhbnVwTWVzc2FnZSwgdHlwZWRNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGFjdGlvbkhhbmRsZXJGb3VuZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5zdXBwb3J0ZWRIYW5kbGVycy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlci5tZXNzYWdlVHlwZSA9PT0gbWVzc2FnZS5tZXNzYWdlVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uSGFuZGxlckZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFudXAgPSBoYW5kbGVyLmV4ZWN1dG9yKG1lc3NhZ2UpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5jbGVhbmFibGUgJiYgY2xlYW51cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZUNsZWFudXBDYWNoZVttZXNzYWdlLmlkXSA9IGNsZWFudXA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGVhbnVwICYmICFtZXNzYWdlLmNsZWFuYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2xlYW51cCBoYW5kbGVyIGdlbmVyYXRlZCBmb3Igbm9uLWNsZWFuYWJsZSBtZXNzYWdlLiBcbm1lc3NhZ2VUeXBlIC0gJHttZXNzYWdlLm1lc3NhZ2VUeXBlfSwgaGFuZGxlciBleGVjdXRvciB3YXMgLSAke2hhbmRsZXIuZXhlY3V0b3J9XG5cblBsZWFzZSByZXZpZXcgdGhlIG1lc3NhZ2UgZGVmaW5pdGlvbiBvYmplY3QgJiBtZXNzYWdlIGhhbmRsZXIuXG5UbyBlbnN1cmUgY2xlYW51cCBwcm9wZXJseSBzZXQgJ2NsZWFuYWJsZScgdHJ1ZSBhdCBtZXNzYWdlIGRlZmluaXRpb24gYW5kIHJldHVybiBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cCBmcm9tIHlvdXIgaGFuZGxlcnMuYClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjbGVhbnVwICYmIG1lc3NhZ2UuY2xlYW5hYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjbGVhbnVwIGhhbmRsZXIgZ2VuZXJhdGVkIGZvciBhIGNsZWFuYWJsZSBtZXNzYWdlLiBcbm1lc3NhZ2VUeXBlIC0gJHttZXNzYWdlLm1lc3NhZ2VUeXBlfSwgaGFuZGxlciBleGVjdXRvciB3YXMgLSAke2hhbmRsZXIuZXhlY3V0b3J9XG5cblBsZWFzZSByZXZpZXcgdGhlIG1lc3NhZ2UgZGVmaW5pdGlvbiBvYmplY3QgJiBtZXNzYWdlIGhhbmRsZXIuXG5UbyBlbnN1cmUgY2xlYW51cCBwcm9wZXJseSBzZXQgJ2NsZWFuYWJsZScgdHJ1ZSBhdCBtZXNzYWdlIGRlZmluaXRpb24gYW5kIHJldHVybiBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cCBmcm9tIHlvdXIgaGFuZGxlcnMuYClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBpZiAoIWFjdGlvbkhhbmRsZXJGb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBwcmludCB3aXRoIGRlYnVnIGNvbmZpZyBvbmx5XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ25vIG1lc3NhZ2UgaGFuZGxlciB3YXMgZm91bmQgZm9yICcsIG1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndW5zdXBwb3J0ZWQgbWVzc2FnZSB0eXBlJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFic3RyYWN0IGluaXQ6ICgpID0+IHZvaWQ7XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4vTXlvcE1lc3NhZ2VzXCI7XG5cbmV4cG9ydCAqIGZyb20gJy4vTXlvcEVsZW1lbnRSZWYnO1xuZXhwb3J0ICogZnJvbSAnLi9iYXNlTWVzc2FnZUhhbmRsZXInO1xuZXhwb3J0ICogZnJvbSAnLi9CYXNlTXlvcFNESyc7XG5cbmV4cG9ydCB0eXBlIENsZWFudXBIYW5kbGVyID0gKCkgPT4gdm9pZFxuXG5leHBvcnQgdHlwZSBEaWN0aW9uYXJ5PFQ+ID0geyBba2V5OiBzdHJpbmddOiBUOyB9O1xuXG4vL2V4cG9ydCB0eXBlIFNraW5Mb2FkZXJUeXBlID0gJ0lmcmFtZUxvYWRlcicgfCAnV2ViQ29tcG9uZW50TG9hZGVyJyB8ICdIVE1MTG9hZGVyJyB8IHN0cmluZztcblxuZXhwb3J0IGNvbnN0IFNraW5Mb2FkZXJzID0ge1xuICAgIFwiSWZyYW1lTG9hZGVyXCI6IFwiSWZyYW1lTG9hZGVyXCIsXG4gICAgXCJXZWJDb21wb25lbnRMb2FkZXJcIjogXCJXZWJDb21wb25lbnRMb2FkZXJcIixcbiAgICBcIkhUTUxMb2FkZXJcIjogXCJIVE1MTG9hZGVyXCIsXG4gICAgXCJNaW5pbWl6ZWRMb2FkZXJcIjogXCJNaW5pbWl6ZWRMb2FkZXJcIlxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFNraW5Mb2FkZXJUeXBlID0ga2V5b2YgdHlwZW9mIFNraW5Mb2FkZXJzO1xuXG5leHBvcnQgdHlwZSBQcm9wVHlwZSA9ICdhbnknIHwgJ3N0cmluZycgfCAnbnVtYmVyJyB8IHN0cmluZzsgLy8gVE9ETyA6IDxcbmV4cG9ydCB0eXBlIFJlZlNlbGVjdG9yVHlwZSA9ICdpZC1hdHRyaWJ1dGUnIHwgJ2Nzcy1zZWxlY3RvcicgfCAneHBhdGgnIHwgc3RyaW5nO1xuXG5leHBvcnQgY29uc3QgTG9hZGVyRnJhbWV3b3JrcyA9IHtcbiAgICBcInJlYWN0XCI6IFwicmVhY3RcIixcbiAgICBcInZ1ZVwiOiBcInZ1ZVwiLFxuICAgIFwiYW5ndWxhclwiOiBcImFuZ3VsYXJcIixcbn0gYXMgY29uc3RcbmV4cG9ydCB0eXBlIExvYWRlckZyYW1ld29ya1R5cGUgPSBrZXlvZiB0eXBlb2YgTG9hZGVyRnJhbWV3b3JrcztcblxuZXhwb3J0IGludGVyZmFjZSBJV2ViQ29tcG9uZW50TG9hZGVyQ29uZmlnIGV4dGVuZHMgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFwiV2ViQ29tcG9uZW50TG9hZGVyXCI7XG4gICAgdXJsOiBzdHJpbmcsXG4gICAgdGFnOiBzdHJpbmcsXG4gICAgZnJhbWV3b3JrPzogTG9hZGVyRnJhbWV3b3JrVHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElJZnJhbWVMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJJZnJhbWVMb2FkZXJcIjtcbiAgICB1cmw6IHN0cmluZ1xuICAgIGF1dG9IZWlnaHQ6IGJvb2xlYW5cbiAgICBoZWlnaHQ/OiBzdHJpbmdcbiAgICB3aWR0aD86IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgU2hhZG93Um9vdE1vZGVUeXBlID0ge1xuICAgIFwib3BlblwiOiBcIm9wZW5cIixcbiAgICBcImNsb3NlZFwiOiBcImNsb3NlZFwiLFxuICAgIFwibm9uZVwiOiBcIm5vbmVcIixcbiAgICBcImxvY2FsRnJhbWVcIjogXCJsb2NhbEZyYW1lXCJcbn0gYXMgY29uc3Q7XG5cblxuZXhwb3J0IGludGVyZmFjZSBJSFRNTExvYWRlckNvbmZpZyBleHRlbmRzIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBcIkhUTUxMb2FkZXJcIjtcbiAgICBIVE1MOiBzdHJpbmc7XG4gICAgLy9UT0RPOiByZW5hbWUocm9vdE1vZGUvY3VzdG9tRWxlbWVudE1vZGUpICsgZGIgbWlncmF0aW9uXG4gICAgc2hhZG93Um9vdE1vZGU/OiBrZXlvZiB0eXBlb2YgU2hhZG93Um9vdE1vZGVUeXBlO1xuICAgIGF1dG9IZWlnaHQ/OiBib29sZWFuO1xuICAgIGhlaWdodD86IHN0cmluZztcbiAgICB3aWR0aD86IHN0cmluZztcbn1cblxuLy9mb3IgaW50ZXJuYWwgZGFzaGJvYXJkIHVzYWdlXG5leHBvcnQgaW50ZXJmYWNlIElNaW5pbWl6ZWRMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJNaW5pbWl6ZWRMb2FkZXJcIjtcbn1cblxuaW50ZXJmYWNlIERhc2hib2FyZE9iamVjdCB7XG4gICAgX3RlbXBfY2xpZW50X2lkPzogc3RyaW5nLFxufVxuXG50eXBlIEV4dGVuZDxULCBVPiA9IFQgJiBVO1xuXG50eXBlIEV4dGVuZFJlY3Vyc2l2ZWx5PFQsIEU+ID0ge1xuICAgIFtLIGluIGtleW9mIEVdOiBFW0tdO1xufSAmIHtcbiAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIG9iamVjdFxuICAgICAgICA/IEV4dGVuZFJlY3Vyc2l2ZWx5PFRbS10sIEU+XG4gICAgICAgIDogVFtLXTtcbn07XG5cbmV4cG9ydCB0eXBlIElEYXNoYm9hcmQ8VD4gPSBFeHRlbmRSZWN1cnNpdmVseTxULCBEYXNoYm9hcmRPYmplY3Q+O1xuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBTa2luTG9hZGVyVHlwZVxuXG4gICAgW2tleTogc3RyaW5nXTogYW55OyAvLyBBbGxvd3MgYW55IGFkZGl0aW9uYWwgcHJvcGVydGllc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lSZWxlYXNlTWV0YWRhdGEge1xuICAgIGVudmlyb25tZW50SWQ6IHN0cmluZztcbiAgICBlbnZpcm9ubWVudElkZW50aWZpZXI6IHN0cmluZztcbiAgICAvL1xuICAgIC8vIHVwZGF0ZWRPbj86IHN0cmluZ1xuICAgIC8vIHVwZGF0ZWRCeT86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lWYXJpYW50Q29uZmlnIGV4dGVuZHMgdjJfSU15b3BTdG9yZWRPYmplY3Qge1xuICAgIGxvYWRlcjogSVNraW5Mb2FkZXJDb25maWdcbiAgICBjb21wb25lbnRJZDogc3RyaW5nO1xuXG4gICAgcmVsZWFzZXM/OiB2Ml9JUmVsZWFzZU1ldGFkYXRhW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2tpbkNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICBsb2FkZXI6IElTa2luTG9hZGVyQ29uZmlnXG4gICAgY3JlYXRlZEJ5Pzogc3RyaW5nXG4gICAgY3JlYXRlZE9uPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSVNraW5Db25maWcgZXh0ZW5kcyBJU2tpbkNvbmZpZyB7XG4gICAgY29tcG9uZW50SWQ6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNZXNzYWdlUHJvcENvbmZpZyBleHRlbmRzIElQcm9wQ29uZmlnIHtcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElCaW5kTWVzc2FnZVByb3BDb25maWcgZXh0ZW5kcyBJUHJvcENvbmZpZyB7XG4gICAgdHlwZTogUHJvcFR5cGVcbiAgICBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXlcbn1cblxuZXhwb3J0IGNvbnN0IFByb3BNZXNzYWdlTW9kZXMgPSB7XG4gICAgXCJpbnB1dFwiOiBcImlucHV0XCIsXG4gICAgXCJvdXRwdXRcIjogXCJvdXRwdXRcIlxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFByb3BDb25maWdCZWhhdmlvclR5cGVzID0ge1xuICAgIFwibWVzc2FnZVwiOiBcIm1lc3NhZ2VcIixcbiAgICBcImNvZGVcIjogXCJjb2RlXCJcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BNZXNzYWdlQmVoYXZpb3JQYXJhbSB7XG4gICAgdmFsdWU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQmVoYXZpb3Ige1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQ29kZUJlaGF2aW9yIGV4dGVuZHMgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZTogXCJjb2RlXCJcbiAgICByZW1hcD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wTWVzc2FnZUJlaGF2aW9yIGV4dGVuZHMgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZTogXCJtZXNzYWdlXCJcbiAgICBtZXNzYWdlOiBNeW9wTWVzc2FnZUtleVxuICAgIHJlZjogc3RyaW5nLCAvL1RPRE8gbWFrZSBpdCBpZFxuICAgIHBhcmFtczogSVByb3BNZXNzYWdlQmVoYXZpb3JQYXJhbVtdXG4gICAgbW9kZToga2V5b2YgdHlwZW9mIFByb3BNZXNzYWdlTW9kZXNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUHJvcENvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIGJlaGF2aW9yOiBJUHJvcEJlaGF2aW9yXG59XG5cblxuZXhwb3J0IGNsYXNzIFJlZkJlaGF2aW9yVHlwZSB7XG4gICAgc3RhdGljIGNvZGUgPSAnY29kZScgYXMgY29uc3RcbiAgICBzdGF0aWMgY29tcG9uZW50ID0gJ2NvbXBvbmVudCcgYXMgY29uc3Rcbn1cblxuZXhwb3J0IHR5cGUgSVJlZkJlaGF2aW9yVHlwZSA9ICdjb2RlJyB8ICdjb21wb25lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogSVJlZkJlaGF2aW9yVHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnRSZWZCZWhhdmlvciBleHRlbmRzIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogJ2NvbXBvbmVudCdcbiAgICBjb21wb25lbnRJZDogc3RyaW5nXG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIFByb3BlcnR5IGluc3RhbmNlIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuXG4gICAgICovXG4gICAgaW5zdGFuY2U6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb2RlUmVmQmVoYXZpb3IgZXh0ZW5kcyBJUmVmQmVoYXZpb3Ige1xuICAgIHR5cGU6ICdjb2RlJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElSZWZDb25maWcge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgc2VsZWN0b3JUeXBlOiBSZWZTZWxlY3RvclR5cGVcbiAgICBzZWxlY3Rvcjogc3RyaW5nXG4gICAgYmVoYXZpb3I6IElSZWZCZWhhdmlvclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICAgIC8vIHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBJUHJvcENvbmZpZz4gLy9pZCAtIHR5cGVcbiAgICAvLyByZWZzOiBSZWNvcmQ8c3RyaW5nLCBJUmVmQ29uZmlnPixcbiAgICAvLyBza2luczogUmVjb3JkPHN0cmluZywgSVNraW5Db25maWc+XG4gICAgcHJvcHM6IElQcm9wQ29uZmlnW10sXG4gICAgcmVmczogSVJlZkNvbmZpZ1tdLFxuICAgIHNraW5zOiBJU2tpbkNvbmZpZ1tdLFxuICAgIGRlZmF1bHRTa2luOiBudW1iZXI7XG5cbiAgICAvL1RPRE8gOiB0aGluayBhYm91dCB0aGF0XG4gICAgLy9yZXNvbHZlZERlZmluaXRpb25zPzogSUNvbXBvbmVudERlZmluaXRpb25Db25maWdbXVxuICAgIC8vVE9ETyA6IG1vdmUgdG8gYmFzZSBjbGFzcyAoIElTdG9yYWJsZUl0ZW0gb3Igc28uLi4pXG5cbiAgICBjcmVhdGVkT24/OiBzdHJpbmdcbiAgICBjcmVhdGVkQnk/OiBzdHJpbmdcbiAgICB1cGRhdGVkQnk/OiBzdHJpbmdcbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lCYXNlTXlvcE9iamVjdCB7XG4gICAgaWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JTXlvcFN0b3JlZE9iamVjdCBleHRlbmRzIHYyX0lCYXNlTXlvcE9iamVjdCB7XG4gICAgdXBkYXRlZE9uPzogc3RyaW5nXG4gICAgdXBkYXRlZEJ5Pzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSUNvbXBvbmVudERlZmluaXRpb25Db25maWcgZXh0ZW5kcyB2Ml9JTXlvcFN0b3JlZE9iamVjdCB7XG4gICAgdmFyaWFudHNfaWRzOiBzdHJpbmdbXSxcbiAgICBEVE9zOiB2Ml9JRFRPW10sXG4gICAgdGFnczogc3RyaW5nW10sXG5cbiAgICAvL1xuICAgIHZhcmlhbnRzX25hbWVzOiBzdHJpbmdbXSxcbiAgICB2YXJpYW50c19kYXRhOiB7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgaWQ6IHN0cmluZ1xuICAgICAgICB1cGRhdGVkT24/OiBzdHJpbmdcbiAgICAgICAgdXBkYXRlZEJ5Pzogc3RyaW5nXG4gICAgICAgIGhhc19yZWxlYXNlcz86IGJvb2xlYW5cbiAgICB9W10sXG5cbiAgICBwcmV2aWV3X3ZhcmlhbnQ6IHYyX0lWYXJpYW50Q29uZmlnO1xuICAgIGV4dHJhPzoge1xuICAgICAgICBmaXJzdFZhcmlhbnQ6IHYyX0lWYXJpYW50Q29uZmlnOyAvL3doZW4gbmV3IGNvbXBvbmVudCBjcmVhdGVzIGF0IHRoZSBjbGllbnRcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSURUTyBleHRlbmRzIHYyX0lNeW9wU3RvcmVkT2JqZWN0IHtcbiAgICBkYXRhOiBvYmplY3RcbiAgICBtZXRob2ROYW1lOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2tpbkluc3RhbmNlQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLFxuICAgIC8vc2tpbnM6IElTa2luSW5zdGFuY2VDb25maWdbXVxufVxuXG5leHBvcnQgY29uc3QgU2VnbWVudFR5cGUgPSB7XG4gICAgXCJGdW5jdGlvblJlc3VsdFwiOiBcIkZ1bmN0aW9uUmVzdWx0XCIsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIElTZWdtZW50SW5zdGFuY2Uge1xuICAgIHNlZ21lbnRJZDogc3RyaW5nO1xuICAgIHNraW5TZWxlY3RvcjogSVNraW5TZWxlY3RvckNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZWdtZW50RGVmaW5pdGlvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgU2VnbWVudFR5cGVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRnVuY3Rpb25SZXN1bHRzU2VnbWVudCBleHRlbmRzIElTZWdtZW50RGVmaW5pdGlvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB0eXBlOiB0eXBlb2YgU2VnbWVudFR5cGUuRnVuY3Rpb25SZXN1bHRcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgZnVuY3Rpb246IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgU2tpblNlbGVjdG9yVHlwZXMgPSB7XG4gICAgXCJTZWdtZW50ZWRcIjogXCJTZWdtZW50ZWRcIixcbiAgICBcIkRlZGljYXRlZFwiOiBcIkRlZGljYXRlZFwiLFxuXG4gICAgLyoqXG4gICAgICogVGhpcyBTZWxlY3RvciBUeXBlIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGJ1dCB3aWxsIGJlIGFkZGVkIGluIGEgZnV0dXJlIHJlbGVhc2UuXG4gICAgICogUGxlYXNlIGNoZWNrIHRoZSBkb2N1bWVudGF0aW9uIGZvciB1cGRhdGVzLlxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBcIkRlZmF1bHRcIjogXCJEZWZhdWx0XCJcbn0gYXMgY29uc3Q7XG5cblxuLyoqXG4gKiBUaGlzIFNraW4gQ29uZmlnIFR5cGUgaXMgbm90IHlldCBzdXBwb3J0ZWQgYnV0IHdpbGwgYmUgYWRkZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS5cbiAqIFBsZWFzZSBjaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdXBkYXRlcy5cbiAqXG4gKiBAdHlwZSB7SURlZmF1bHRTa2luQ29uZmlnfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElEZWZhdWx0U2tpbkNvbmZpZyBleHRlbmRzIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcy5EZWZhdWx0LFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZWdtZW50ZWRTa2luQ29uZmlnIGV4dGVuZHMgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZTogdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLlNlZ21lbnRlZCxcbiAgICBzZWdtZW50czogSVNlZ21lbnRJbnN0YW5jZVtdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURlZGljYXRlZFNraW5Db25maWcgZXh0ZW5kcyBJU2tpblNlbGVjdG9yQ29uZmlnIHtcbiAgICB0eXBlOiB0eXBlb2YgU2tpblNlbGVjdG9yVHlwZXMuRGVkaWNhdGVkLFxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBza2lufSBpbnN0ZWFkLlxuICAgICAqIFByb3BlcnR5IHNraW5zIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuXG4gICAgICogUGxlYXNlIHVwZGF0ZSB5b3VyIGNvZGUgdG8gdXNlIHtAbGluayBza2lufSBmb3IgYmV0dGVyIGNvbXBhdGliaWxpdHkuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHNraW5zPzogSVNraW5JbnN0YW5jZUNvbmZpZ1tdIC8vIGRlcHJlY2F0ZWRcbiAgICBza2luOiBJU2tpbkluc3RhbmNlQ29uZmlnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGNvbXBvbmVudElkOiBzdHJpbmc7XG5cbiAgICAvL1RPRE8gOlxuICAgIC8vIFJlZklEID8gdG8gc3VwcG9ydCBtb3JlIHRoYW4gMSBjb21wb25lbnQgZnJvbSB0aGUgc2FtZSB0eXBlIGluIGNvbXBvc2l0ZXMgP1xuXG4gICAgLy9UT0RPIDogcmVtb3ZlXG4gICAgY29tcG9uZW50TmFtZTogc3RyaW5nOyAvLyA8PCBjaGVja1xuXG4gICAgc2tpblNlbGVjdG9yOiBJU2tpblNlbGVjdG9yQ29uZmlnXG5cbiAgICAvLyBzdG9yaW5nIHRoZSBuZXN0ZWQgY29uZmlnIGZvciByZWYgY29tcG9uZW50c1xuICAgIG5lc3RlZENvbXBvbmVudHM/OiBJQ29tcG9uZW50SW5zdGFuY2VDb25maWdbXVxuXG4gICAgLy9vbmx5IG9uIEdFVD9cbiAgICAvL1RPRE8gOiB0aGluayBhYm91dCB0aGF0XG4gICAgcmVzb2x2ZWRFeHBlcmllbmNlcz86IElFeHBlcmllbmNlW11cbiAgICAvLyB3aWxsIGluY2x1ZGUgaW5zdGFuY2UgYW5kIGRlZiBjb25maWcgaW4gb3JkZXIgdG8gcmVuZGVyIGluIHByb2R1Y3Rpb25cbiAgICByZXNvbHZlZE5lc3RlZENvbXBvbmVudHM/OiBJQ29tcG9uZW50Q29uZmlnW11cbn1cblxuZXhwb3J0IGNvbnN0IEV4cGVyaWVuY2VUeXBlcyA9IHtcbiAgICBcIlNlZ21lbnRcIjogXCJTZWdtZW50XCIsXG4gICAgXCJQcm9tb1wiOiBcIlByb21vXCIsXG4gICAgXCJBQlwiOiBcIkFCXCJcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2Uge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgdHlwZToga2V5b2YgdHlwZW9mIEV4cGVyaWVuY2VUeXBlc1xuICAgIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdXG4gICAgLy9zdGlja2luZXNzRmFjdG9yXG4gICAgLy9FbmREYXRlXG59XG5cbi8vIGV4cG9ydCBpbnRlcmZhY2UgSUFCRXhwZXJpZW5jZUdyb3VwIHtcbi8vICAgICBpZDogc3RyaW5nXG4vLyAgICAgbmFtZTogc3RyaW5nXG4vLyAgICAgcGVyY2VudGFnZTogbnVtYmVyXG4vLyB9XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFCRXhwZXJpZW5jZSBleHRlbmRzIElFeHBlcmllbmNlIHtcbiAgICB0eXBlOiB0eXBlb2YgRXhwZXJpZW5jZVR5cGVzLkFCXG4gICAgLy8gZ3JvdXBzOiBJQUJFeHBlcmllbmNlR3JvdXBbXVxuICAgIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdXG4gICAgcGVyY2VudGFnZTogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURhdGVSYW5nZSB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIHN0YXJ0OiBEYXRlXG4gICAgZW5kOiBEYXRlXG4gICAgdGltZXpvbmU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZWdtZW50RXhwZXJpZW5jZSBleHRlbmRzIElFeHBlcmllbmNlIHtcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgRXhwZXJpZW5jZVR5cGVzXG4gICAgc2VnbWVudDogSVNlZ21lbnREZWZpbml0aW9uXG4gICAgZGF0ZVJhbmdlPzogSURhdGVSYW5nZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElVc2VyRmxvd0RlZmluaXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgY29tcG9uZW50czogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnW107XG4gICAgb3JpZ2luczogc3RyaW5nW10sXG4gICAgZXhwZXJpZW5jZXM6IElFeHBlcmllbmNlW11cbiAgICBicmFuY2g/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29tcG9uZW50Q29uZmlnIHtcbiAgICBpbnN0YW5jZTogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnXG4gICAgdHlwZTogSUNvbXBvbmVudERlZmluaXRpb25Db25maWdcblxuICAgIC8vIFRPRE8gOiB2ZXJpZnkgdW5pcXVlbmVzcyAoZGFzaGJvYXJkICYgc2VydmVyKVxuICAgIG5hbWU6IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgSUJyYW5jaGFibGUge1xuICAgIGJyYW5jaD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElVc2VyRmxvdyBleHRlbmRzIE9taXQ8SVVzZXJGbG93RGVmaW5pdGlvbiwgJ2NvbXBvbmVudHMnPiwgSUJyYW5jaGFibGUge1xuICAgIGNvbXBvbmVudHM6IElDb21wb25lbnRDb25maWdbXVxufVxuXG5leHBvcnQgY2xhc3MgUm9vdFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHB1YmxpYyBzaGFkb3dSb290PzogU2hhZG93Um9vdCkge1xuXG4gICAgfVxuXG4gICAgZ2V0Um9vdERpdiA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnNoYWRvd1Jvb3QgfHwgdGhpcy5jb250YWluZXIpLnF1ZXJ5U2VsZWN0b3IoJ2RpdicpXG4gICAgfVxuXG4gICAgZ2V0Um9vdCA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnNoYWRvd1Jvb3QgfHwgdGhpcy5jb250YWluZXIpO1xuICAgIH1cbn1cbiIsICJleHBvcnQgdHlwZSBTZXJpYWxpemFibGU8VD4gPVxuICAgIFQgZXh0ZW5kcyBGdW5jdGlvbiA/IG5ldmVyIDogLy8gRXhjbHVkZSBmdW5jdGlvbnNcbiAgICAgICAgVCBleHRlbmRzIEFycmF5PGluZmVyIFU+ID8gU2VyaWFsaXphYmxlPFU+W10gOiAvLyBIYW5kbGUgYXJyYXlzXG4gICAgICAgICAgICBUIGV4dGVuZHMgb2JqZWN0ID8ge1xuICAgICAgICAgICAgICAgIFtLIGluIGtleW9mIFQgYXMgVFtLXSBleHRlbmRzIEZ1bmN0aW9uID8gbmV2ZXIgOiBLXTogU2VyaWFsaXphYmxlPFRbS10+XG4gICAgICAgICAgICB9IDogVDsgLy8gSGFuZGxlIG9iamVjdHNcblxuY29uc3QgaXNQcmltaXRpdmUgPSAodmFsdWUpID0+IHtcbiAgICByZXR1cm4gdmFsdWUgIT09IE9iamVjdCh2YWx1ZSk7XG59XG5cbmNvbnN0IGlzRnVuY3Rpb24gPSAodmFsdWUpID0+IHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufVxuXG5leHBvcnQgY29uc3QgY29udGFpbnNQcmltaXRpdmVzT25seSA9IChvYmopID0+IHtcbiAgICBpZiAoaXNQcmltaXRpdmUob2JqKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNGdW5jdGlvbihvYmopKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNoZWNrIGlmIGl0J3MgYSBuZXN0ZWQgb2JqZWN0XG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5zUHJpbWl0aXZlc09ubHkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzUHJpbWl0aXZlKHZhbHVlKSkge1xuICAgICAgICAgICAgY29udGludWU7IC8vIEl0J3MgYSBwcmltaXRpdmUsIHNvIHdlIGNhbiBza2lwIGl0XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIEZvdW5kIGEgbm9uLXByaW1pdGl2ZSB2YWx1ZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7IC8vIEFsbCB2YWx1ZXMgYXJlIHByaW1pdGl2ZXMgb3IgbmVzdGVkIG9iamVjdHMgd2l0aCBwcmltaXRpdmVzXG59XG5cbi8vIGN1cnJlbnRseSBzdXBwb3J0IHJvb3QgbGV2ZWwgb25seVxuLy8ge3g6IDEsIHkgOiAnYScsIHogOiAoKT0+ey4uLn0sIGlubmVyIDogeyB4OiAxICwgeSA6ICdhJ30gfVxuLy8ge3g6IDEsIHkgOiAnYSd9XG4vL2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvR2xvc3NhcnkvRmFsc3lcbmV4cG9ydCB0eXBlIFNlcmlhbGl6YWJsZVNrZWxldG9uPFQ+ID0gUGFydGlhbDxSZWNvcmQ8a2V5b2YgVCwgYm9vbGVhbiB8IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgYm9vbGVhbj4+Pj4gfCBib29sZWFuO1xuXG5leHBvcnQgY29uc3QgbWFrZVNlcmlhbGl6YWJsZSA9IDxUPihcbiAgICBvYmo6IFQsXG4gICAgc2tlbGV0b246IFNlcmlhbGl6YWJsZVNrZWxldG9uPFQ+ID0ge30sXG4gICAgaW5jbHVkZUZhbHN5S2V5czogYm9vbGVhbiA9IHRydWUsIC8vIFRPRE8gOiB1c2UgdGhhdCBhcmdcbiAgICBzZWVuOiBXZWFrTWFwPG9iamVjdCwgU2VyaWFsaXphYmxlPGFueT4+ID0gbmV3IFdlYWtNYXAoKVxuKTogU2VyaWFsaXphYmxlPFQ+ID0+IHtcblxuICAgIGlmIChpc1ByaW1pdGl2ZShvYmopKSB7XG4gICAgICAgIHJldHVybiBvYmogYXMgU2VyaWFsaXphYmxlPFQ+OyAvLyBEaXJlY3RseSByZXR1cm4gcHJpbWl0aXZlIHZhbHVlc1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgaWYgKHNlZW4uaGFzKG9iaikpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWVuLmdldChvYmopITsgLy8gUmV0dXJuIHRoZSBhbHJlYWR5IHByb2Nlc3NlZCBvYmplY3RcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhbmRsZSBhcnJheSBzZXJpYWxpemF0aW9uXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6YWJsZUFycmF5OiBTZXJpYWxpemFibGU8YW55PltdID0gW107XG4gICAgICAgIHNlZW4uc2V0KG9iaiwgc2VyaWFsaXphYmxlQXJyYXkpOyAvLyBTdG9yZSB0aGUgYXJyYXkgaW4gc2VlblxuXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBvYmoubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gb2JqW2luZGV4XTtcbiAgICAgICAgICAgIHNlcmlhbGl6YWJsZUFycmF5W2luZGV4XSA9IG1ha2VTZXJpYWxpemFibGUoZWxlbWVudCwgc2tlbGV0b24sIGluY2x1ZGVGYWxzeUtleXMsIHNlZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJpYWxpemFibGVBcnJheSBhcyBTZXJpYWxpemFibGU8VD47XG4gICAgfVxuXG4gICAgaWYgKG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICAvLyBDaGVjayBmb3IgY3ljbGljIHJlZmVyZW5jZXNcbiAgICAgICAgaWYgKHNlZW4uaGFzKG9iaikpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWVuLmdldChvYmopITsgLy8gUmV0dXJuIHRoZSBhbHJlYWR5IHByb2Nlc3NlZCBvYmplY3RcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZXJpYWxpemFibGVPYmplY3Q6IFBhcnRpYWw8U2VyaWFsaXphYmxlPFQ+PiA9IHt9O1xuICAgICAgICBzZWVuLnNldChvYmosIHNlcmlhbGl6YWJsZU9iamVjdCk7IC8vIFN0b3JlIHRoZSBvYmplY3QgaW4gc2VlblxuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGtleSBpcyBpbiB0aGUgc2tlbGV0b24gYW5kIGlmIGl0J3MgYSB2YWxpZCBrZXkgdG8gc2VyaWFsaXplXG5cbiAgICAgICAgICAgIGNvbnN0IGtleUluU2tlbGV0b24gPSB0eXBlb2Ygc2tlbGV0b24gPT0gXCJib29sZWFuXCIgPyBza2VsZXRvbiA6IHNrZWxldG9uW2tleV07XG5cbiAgICAgICAgICAgIGlmIChrZXlJblNrZWxldG9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleUluU2tlbGV0b24gPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNrZWxldG9uIGluZGljYXRlcyB0byBzZXJpYWxpemUgdGhpcyBrZXlcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVGYWxzeUtleXMgPyBvYmpba2V5XSAhPT0gdW5kZWZpbmVkIDogb2JqW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6YWJsZU9iamVjdFtrZXldID0gbWFrZVNlcmlhbGl6YWJsZShvYmpba2V5XSwgdHJ1ZSwgaW5jbHVkZUZhbHN5S2V5cywgc2Vlbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBrZXlJblNrZWxldG9uID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2tlbGV0b24gaW5kaWNhdGVzIG5lc3RlZCBrZXlzIHRvIHNlcmlhbGl6ZVxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6YWJsZU9iamVjdFtrZXldID0gbWFrZVNlcmlhbGl6YWJsZShvYmpba2V5XSwga2V5SW5Ta2VsZXRvbiwgaW5jbHVkZUZhbHN5S2V5cywgc2Vlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJpYWxpemFibGVPYmplY3QgYXMgU2VyaWFsaXphYmxlPFQ+O1xuICAgIH1cblxuICAgIHJldHVybiB7fSBhcyBhbnk7IC8vIFJldHVybiBhbiBlbXB0eSBvYmplY3QgZm9yIG90aGVyIGNhc2VzXG59XG4iLCAiZXhwb3J0IGNvbnN0IEVycm9ycyA9IHtcbiAgICBub3RTZXJpYWxpemFibGVSZWZDYWxsOiAocHJvcCwgYXJnKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgXG5UaGUgaW5wdXQgcHJvdmlkZWQgdG8gJyR7cHJvcC50b1N0cmluZygpfScgaXMgbm90IHNlcmlhbGl6YWJsZS4gU2VyaWFsaXphdGlvbiBpcyByZXF1aXJlZCB0byBlbnN1cmUgdGhhdCB0aGUgZGF0YSBjYW4gYmUgc2FmZWx5IHRyYW5zZmVycmVkIHRvIHRoZSBza2luIGltcGxlbWVudGF0aW9uLiBcblRoZSBmb2xsb3dpbmcgdHlwZXMgb2YgZGF0YSBhcmUgY29uc2lkZXJlZCBub24tc2VyaWFsaXphYmxlIGFuZCBjYW5ub3QgYmUgcHJvY2Vzc2VkOlxuXG4tIEZ1bmN0aW9uc1xuLSBET00gZWxlbWVudHNcbi0gQ2xhc3MgaW5zdGFuY2VzXG4tIENpcmN1bGFyIHJlZmVyZW5jZXNcbi0gU3ltYm9sc1xuLSBCaWdJbnQgdmFsdWVzXG5cbkluIHRoZSBmb2xsb3dpbmcgZXhlY3V0aW9uIHdlIGRldGVjdGVkIDpcbn5+fn5+fn5+XG4ke2FyZ30gXG5+fn5+fn5+flxuYXMgbm90IHNlcmlhbGl6YWJsZS5cblxuVG8gcmVzb2x2ZSB0aGlzIGlzc3VlLCBwbGVhc2UgZW5zdXJlIHRoYXQgYWxsIGlucHV0cyBwYXNzZWQgdG8gJyR7cHJvcC50b1N0cmluZygpfScgYXJlIGluIGEgc2VyaWFsaXphYmxlIGZvcm1hdC5cblRoaXMgdHlwaWNhbGx5IGluY2x1ZGVzIHByaW1pdGl2ZSB0eXBlcyAoc3RyaW5ncywgbnVtYmVycywgYm9vbGVhbnMpLCBhcnJheXMsIGFuZCBwbGFpbiBvYmplY3RzLiBcbklmIHlvdSBuZWVkIHRvIGluY2x1ZGUgY29tcGxleCBkYXRhIHR5cGVzLCBjb25zaWRlciBjb252ZXJ0aW5nIHRoZW0gdG8gYSBzZXJpYWxpemFibGUgc3RydWN0dXJlIGJlZm9yZSBwYXNzaW5nIHRoZW0gdG8gdGhlIGZ1bmN0aW9uLlxuT3IgdXNlIE15b3AgbWVzc2FnZSB0aGF0IHN1cHBvcnQgaXQ6IEN1c3RvbVJlZk1lc3NhZ2UsIEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlIG9yIEV4ZWN1dGVTY3JpcHRNZXNzYWdlLlxuXG5TdWdnZXN0ZWQgRml4OlxuMS4gUmVtb3ZlIG9yIHJlcGxhY2Ugbm9uLXNlcmlhbGl6YWJsZSB2YWx1ZXMgZnJvbSB5b3VyIGlucHV0LlxuMi4gSWYgdXNpbmcgb2JqZWN0cywgZW5zdXJlIHRoZXkgZG8gbm90IGNvbnRhaW4gYW55IGZ1bmN0aW9ucyBvciBjaXJjdWxhciByZWZlcmVuY2VzLlxuMy4gQ29udmVydCBhbnkgY2xhc3MgaW5zdGFuY2VzIHRvIHBsYWluIG9iamVjdHMgb3IgSlNPTi1jb21wYXRpYmxlIGZvcm1hdHMuXG40LiBVc2UgZGVkaWNhdGVkIE15b3AgbWVzc2FnZS5cblxuRm9yIG1vcmUgZGV0YWlscyBvbiBzZXJpYWxpemF0aW9uIGFuZCBNeW9wIG1lc3NhZ2UgZXhhbXBsZXMsIHJlZmVyIHRvIGh0dHBzOi8vZG9jcy5teW9wLmRldlxcLlxuXG5gKTtcbiAgICB9XG59XG5cbiIsICJpbXBvcnQge0Jhc2VNeW9wQ29tcG9uZW50LCBJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBFeGVjdXRlQ29tcG9uZW50TWV0aG9kfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7SUNvbXBvbmVudERlZmluaXRpb25Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7RW52ZWxvcGVkTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzL0VudmVsb3BlZE1lc3NhZ2VcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcblxuZXhwb3J0IGNsYXNzIE15b3BSZWZDb21wb25lbnQgZXh0ZW5kcyBCYXNlTXlvcENvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHB1YmxpYyBwYXJlbnQ6IElNeW9wQ29tcG9uZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICAvL1RPRE8gOiBjaGVjayBwYXJlbnRDb21wb25lbnQuY29udGFpbmVyLi4uXG4gICAgICAgIHN1cGVyKGNvbXBvbmVudERlZmluaXRpb24sIHBhcmVudC5jb250YWluZXIsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGhpZGUoKSB7XG4gICAgICAgIC8vdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKGFyZ3VtZW50cy5jYWxsZWUubmFtZSkpO1xuICAgICAgICB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ2hpZGUnKSk7XG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdzaG93JykpO1xuICAgIH1cblxuICAgIGluc3BlY3QoKSB7XG4gICAgICAgIC8vVE9ETyA6IHN1cHBvcnQgcmVhbCBjbGVhbnVwXG4gICAgICAgIC8vY29uc29sZS5sb2coJ3JlZiBpbnNwZWN0IGNhbGxlZCwgY3JlYXRpbmcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCBpbnNwZWN0JywgZG9jdW1lbnQubG9jYXRpb24uaHJlZiwgdGhpcy5pZCk7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ2luc3BlY3QnKSk7XG4gICAgfVxuXG4gICAgc2V0SGVpZ2h0QmFzZWRPbkRvY3VtZW50RWxlbWVudCgpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ3NldEhlaWdodEJhc2VkT25Eb2N1bWVudEVsZW1lbnQnKSk7XG4gICAgfVxuXG4gICAgc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCgpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ3NldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQnKSk7XG4gICAgfVxuXG4gICAgb25NZXNzYWdlUmVjZWl2ZWQoaW5jb21lTWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIGlmIChpbmNvbWVNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSAnTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnKSB7XG4gICAgICAgIC8vICBkZWJ1Z2dlcjtcbiAgICAgICAgLy8gICAgIHRoaXMuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCgpO1xuICAgICAgICAvLyAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIC8vIH1cbiAgICAgICAgcmV0dXJuIHN1cGVyLm9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2UpO1xuICAgIH1cblxuXG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygncmVmIG1lc3NhZ2Ugc2VuZGluZyAnLCBtZXNzYWdlKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBjb25zdCBoYW5kbGVyID0gbWVzc2FnZS5oYW5kbGVyXG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gc3VwZXIuc2VuZChtZXNzYWdlKTtcblxuICAgICAgICAvLyB0aGlzLmlkIHdpbGwgYmUgYXZhaWxhYmxlIG9uIHRoZSBuZXN0ZWQgY29tcG9uZW50XG4gICAgICAgIHRoaXMucGFyZW50LnNlbmQobmV3IEVudmVsb3BlZE1lc3NhZ2UodGhpcy5pZCwgbWVzc2FnZSkpO1xuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbWVzc2FnZS5oYW5kbGVyID0gaGFuZGxlclxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfTtcblxuICAgIGRpc3Bvc2UgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzSW5pdGlhdGVkKVxuICAgICAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdkaXNwb3NlJykpO1xuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgfVxufVxuIiwgIi8vdHlwZSBBQ29uc3RydWN0b3JUeXBlT2Y8VD4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50cy9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBDdXN0b21SZWZNZXNzYWdlLCBSZWZ9IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0ICogYXMgbWVzc2FnZXMgZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge1xuICAgIENsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50Q29uZmlnLFxuICAgIHR5cGUgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgSUNvbXBvbmVudFJlZkJlaGF2aW9yLCBJSFRNTExvYWRlckNvbmZpZywgSVByb3BDb2RlQmVoYXZpb3IsXG4gICAgSVByb3BDb25maWcsIElTa2luQ29uZmlnLCBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcyxcbiAgICBSZWZCZWhhdmlvclR5cGUsIFNoYWRvd1Jvb3RNb2RlVHlwZSwgU2tpbkxvYWRlcnMsIFNraW5Mb2FkZXJUeXBlXG59IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7Y29udGFpbnNQcmltaXRpdmVzT25seX0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uXCI7XG5pbXBvcnQge0Vycm9yc30gZnJvbSBcIi4vbG9nTWVzc2FnZXNcIjtcbmltcG9ydCB7TXlvcFJlZkNvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50cy9teW9wUmVmQ29tcG9uZW50XCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuL2hvc3RTREtcIjtcblxudHlwZSBjb21wb25lbnREZWZpbml0aW9uUHJvcHMgPSBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1sncHJvcHMnXVxuXG5jb25zdCBjcmVhdGVEZWJ1Z1RpdGxlID0gKHRleHQ6IHN0cmluZywgdG9wOiBudW1iZXIsIGNvbXBvbmVudERlZmluaXRpb25Db25maWc6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnKSA9PiB7XG4gICAgY29uc3QgdGl0bGVFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICB0aXRsZUVsLnRleHRDb250ZW50ID0gdGV4dDtcbiAgICB0aXRsZUVsLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICB0aXRsZUVsLnN0eWxlLnBhZGRpbmcgPSAnMCA1cHgnO1xuICAgIHRpdGxlRWwuc3R5bGUuZm9udFNpemUgPSAnMTRweCc7XG4gICAgdGl0bGVFbC5zdHlsZVsndG9wJ10gPSAnMCc7XG4gICAgdGl0bGVFbC5zdHlsZS50b3AgPSBgJHt0b3B9cHhgO1xuICAgIC8vdGl0bGVFbC5zdHlsZS5sZWZ0ID0gJzUwJSc7XG4gICAgdGl0bGVFbC5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlWCgtNTAlKSc7XG4gICAgdGl0bGVFbC50YXJnZXQgPSAnX2JsYW5rJztcbiAgICB0aXRsZUVsLmhyZWYgPSBgaHR0cHM6Ly9kYXNoYm9hcmQubXlvcC5kZXYvZGFzaGJvYXJkL2NvbXBvbmVudC8ke2NvbXBvbmVudERlZmluaXRpb25Db25maWcuaWR9YFxuXG4gICAgcmV0dXJuIHRpdGxlRWw7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0RGVidWdTdHlsZSA9IChpZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1xuKTogQ2xlYW51cEhhbmRsZXIgPT4ge1xuICAgIC8vIzAwN0JGRiAoYmx1ZSkgb3IgI0ZGNTcyMiAob3JhbmdlKVxuICAgIC8vIzRDQUY1MCAoZ3JlZW4pIG9yICNGRkMxMDcgKGFtYmVyKVxuICAgIC8vIGNvbnN0IHRvcFRleHQgPSBjcmVhdGVEZWJ1Z1RpdGxlKGAke2lkfSA6ICR7dHlwZX1gLCB0b3AsIGNvbXBvbmVudERlZmluaXRpb25Db25maWcpO1xuICAgIGNvbnN0IHRvcFRleHQgPSBjcmVhdGVEZWJ1Z1RpdGxlKGAke2NvbXBvbmVudERlZmluaXRpb25Db25maWcubmFtZX0gOiAke3R5cGV9YCwgdG9wLCBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnKTtcbiAgICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKHRvcFRleHQsIGNvbXBvbmVudEVsZW1lbnQpO1xuICAgIGNvbXBvbmVudEVsZW1lbnQuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCAjMDA3QkZGJztcbiAgICBjb21wb25lbnRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY29tcG9uZW50RWxlbWVudC5zdHlsZS5ib3JkZXIgPSAndW5zZXQnO1xuICAgICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQodG9wVGV4dCk7XG4gICAgfVxufVxuXG5jb25zdCByZXBvcnRFcnJvciA9IChwcm9wQ29uZmlnOiBJUHJvcENvbmZpZywgcHJvcE5hbWU6IHN0cmluZywgY29tcG9uZW50OiBJTXlvcENvbXBvbmVudDxhbnksIGFueT4pID0+IHtcbiAgICBpZiAoIXByb3BDb25maWcpIHtcblxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgLy8gdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEVycm9yOiBVbmRlZmluZWQgUHJvcFxcblxcbmAgK1xuICAgICAgICAgICAgYEl0IGxvb2tzIGxpa2UgeW91J3ZlIHRyaWVkIHRvIHVzZSBhIHByb3AgdGhhdCBoYXNuJ3QgYmVlbiBkZWZpbmVkLlxcbmAgK1xuICAgICAgICAgICAgYFBsZWFzZSBjaGVjayB0aGUgcHJvcCBuYW1lIGZvciBhbnkgdHlwb3Mgb3IgZW5zdXJlIHRoYXQgaXQgaXMgcHJvcGVybHkgZGVmaW5lZCBpbiB0aGUgY29tcG9uZW50J3MgcHJvcCBsaXN0LlxcblxcbmAgK1xuICAgICAgICAgICAgYFByb3AgTmFtZTogJHtwcm9wTmFtZX1cXG5gICtcbiAgICAgICAgICAgIGBDb21wb25lbnQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ubmFtZX0sIElEOiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfVxcblxcbmAgK1xuICAgICAgICAgICAgYEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlciB0byB0aGUgY29tcG9uZW50IHBhZ2UgaHR0cHM6Ly9kYXNoYm9hcmQubXlvcC5kZXYvZGFzaGJvYXJkL2NvbXBvbmVudC8ke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfSBvciBjb25zdWx0IHRoZSBkZXZlbG9wZXIgZ3VpZGUuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2Vcbn1cblxuY29uc3QgcmVwb3J0VW5zdXBwb3J0ZWQgPSAocHJvcENvbmZpZzogSVByb3BDb25maWcsIHByb3BOYW1lOiBzdHJpbmcsIGNvbXBvbmVudDogSU15b3BDb21wb25lbnQ8YW55LCBhbnk+KSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYEVycm9yOiBDb2RlIFByb3AgTm90IFN1cHBvcnRlZFxcblxcbmAgK1xuICAgICAgICBgQ3VycmVudGx5LCBjb2RlIHByb3BzIGFyZSBvbmx5IHN1cHBvcnRlZCBpbiBsb2NhbCBmcmFtZSBjb21wb25lbnRzLlxcbmAgK1xuICAgICAgICBgXHUyNkEwXHVGRTBGIFRoaXMgaXMgYSB3b3JrIGluIHByb2dyZXNzIGZlYXR1cmUgXHUyMDE0IGNvZGUgcHJvcHMgd2lsbCBiZSBzdXBwb3J0ZWQgaW4gdXBjb21pbmcgdmVyc2lvbnMuXFxuXFxuYCArXG4gICAgICAgIGBJbiB0aGUgbWVhbnRpbWUsIHlvdSBjYW4gdXNlIG1lc3NhZ2UgcHJvcHMuXFxuXFxuYCArXG4gICAgICAgIGBQcm9wIE5hbWU6ICR7cHJvcE5hbWV9XFxuYCArXG4gICAgICAgIGBDb21wb25lbnQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ubmFtZX0sIElEOiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfVxcblxcbmAgK1xuICAgICAgICBgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlZmVyIHRvIHRoZSBjb21wb25lbnQgcGFnZSBodHRwczovL2Rhc2hib2FyZC5teW9wLmRldi9kYXNoYm9hcmQvY29tcG9uZW50LyR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9IG9yIGNvbnN1bHQgdGhlIGRldmVsb3BlciBndWlkZS5gXG4gICAgKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbm5lY3RQcm9wcyA9IDxUIGV4dGVuZHMgY29tcG9uZW50RGVmaW5pdGlvblByb3BzPihjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBwcm9wc0NvbmZpZzogSVByb3BDb25maWdbXSwgc2VsZWN0ZWRTa2luOiBJU2tpbkNvbmZpZykgPT4ge1xuXG4gICAgY29uc3QgcHJvcHNNYXAgPSBwcm9wc0NvbmZpZy5yZWR1Y2UoKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRWYWx1ZSkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ucHJldmlvdXNWYWx1ZSxcbiAgICAgICAgICAgIFtjdXJyZW50VmFsdWUubmFtZV06IHsuLi5jdXJyZW50VmFsdWV9XG4gICAgICAgIH1cbiAgICB9LCB7fSk7XG5cbiAgICBjb25zdCBwcm9wc0hhbmRsZXIgPSB7XG4gICAgICAgIGdldDogKF86IElNeW9wQ29tcG9uZW50LCBwcm9wOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IHByb3BDb25maWcgPSBwcm9wc01hcFtwcm9wXTtcblxuICAgICAgICAgICAgaWYgKHJlcG9ydEVycm9yKHByb3BDb25maWcsIHByb3AsIGNvbXBvbmVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnR5cGUgPT09IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGUpIHtcblxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZFNraW4ubG9hZGVyLnR5cGUgPT09IFNraW5Mb2FkZXJzLkhUTUxMb2FkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRMb2FkZXIgPSBzZWxlY3RlZFNraW4ubG9hZGVyIGFzIElIVE1MTG9hZGVyQ29uZmlnO1xuICAgICAgICAgICAgICAgICAgICAvLyBmb3IgbG9jYWwgZnJhbWUgY29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZExvYWRlci5zaGFkb3dSb290TW9kZSA9PT0gU2hhZG93Um9vdE1vZGVUeXBlLmxvY2FsRnJhbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUHJvcEJlaGF2aW9yID0gcHJvcENvbmZpZy5iZWhhdmlvciBhcyBJUHJvcENvZGVCZWhhdmlvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQuZWxlbWVudC5jb250ZW50V2luZG93W3R5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3BdXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXBvcnRVbnN1cHBvcnRlZChwcm9wQ29uZmlnLCBwcm9wLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb3BDb25maWcubW9kZSA9PT0gJ291dHB1dCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZVBhcmFtczogYW55W10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogdHVybiBpdCBpbnRvIGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci5yZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaChSZWYuY3JlYXRlKHByb3BDb25maWcuYmVoYXZpb3IucmVmKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IucGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goLi4ucHJvcENvbmZpZy5iZWhhdmlvci5wYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlQ3RvciA9IG1lc3NhZ2VzW3Byb3BDb25maWcuYmVoYXZpb3IubWVzc2FnZV07XG5cbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IG1lc3NhZ2VDdG9yKC4uLm1lc3NhZ2VQYXJhbXMpKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiAoXzogSU15b3BDb21wb25lbnQsIHByb3A6IHN0cmluZywgdmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgcHJvcENvbmZpZyA9IHByb3BzTWFwW3Byb3BdO1xuXG4gICAgICAgICAgICBpZiAocmVwb3J0RXJyb3IocHJvcENvbmZpZywgcHJvcCwgY29tcG9uZW50KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IudHlwZSA9PT0gUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMuY29kZSkge1xuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZFNraW4ubG9hZGVyLnR5cGUgPT09IFNraW5Mb2FkZXJzLkhUTUxMb2FkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRMb2FkZXIgPSBzZWxlY3RlZFNraW4ubG9hZGVyIGFzIElIVE1MTG9hZGVyQ29uZmlnO1xuICAgICAgICAgICAgICAgICAgICAvLyBmb3IgbG9jYWwgZnJhbWUgY29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZExvYWRlci5zaGFkb3dSb290TW9kZSA9PT0gU2hhZG93Um9vdE1vZGVUeXBlLmxvY2FsRnJhbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUHJvcEJlaGF2aW9yID0gcHJvcENvbmZpZy5iZWhhdmlvciBhcyBJUHJvcENvZGVCZWhhdmlvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmNvbnRlbnRXaW5kb3dbdHlwZWRQcm9wQmVoYXZpb3IucmVtYXAgfHwgcHJvcF0gPSB2YWx1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlcG9ydFVuc3VwcG9ydGVkKHByb3BDb25maWcsIHByb3AsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvL2lmKHByb3BDb25maWcuYmVoYXZpb3IgPT09IFByb3BDb25maWdCZWhhdmlvclR5cGVzLm1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcubW9kZSA9PT0gJ2lucHV0Jykge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBzdXBwb3J0IG11bHRpIGJlaGF2aW9yc1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnR5cGUgPT09ICdtZXNzYWdlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZVBhcmFtczogYW55W10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHR1cm4gaXQgaW50byBjb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnJlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaChSZWYuY3JlYXRlKHByb3BDb25maWcuYmVoYXZpb3IucmVmKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IucGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKC4uLnByb3BDb25maWcuYmVoYXZpb3IucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZUN0b3IgPSBtZXNzYWdlc1twcm9wQ29uZmlnLmJlaGF2aW9yLm1lc3NhZ2VdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IG1lc3NhZ2VDdG9yKC4uLm1lc3NhZ2VQYXJhbXMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yOiBVbnN1cHBvcnRlZCBCZWhhdmlvclxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBUaGUgJ2JlaGF2aW9yJyBmaWVsZCBwcm92aWRlZCBpcyBub3Qgc3VwcG9ydGVkLlxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBDb21wb25lbnQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ubmFtZX0sIElEOiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfVxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBQcm9wIE5hbWU6ICR7cHJvcH1cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQmVoYXZpb3IgRmllbGQ6ICR7cHJvcENvbmZpZy5iZWhhdmlvci50eXBlfVxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBDaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdmFsaWQgYmVoYXZpb3Igb3B0aW9ucy5gXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29tcG9uZW50LnByb3BzID0ge307XG4gICAgY29tcG9uZW50LnByb3BzID0gbmV3IFByb3h5KGNvbXBvbmVudC5wcm9wcywgcHJvcHNIYW5kbGVyKTtcblxuICAgIHJldHVybiBjb21wb25lbnQgYXMgKE9taXQ8SU15b3BDb21wb25lbnQsICdwcm9wcyc+ICYge1xuICAgICAgICBwcm9wczogcHJvcFR5cGVzPFQ+XG4gICAgfSlcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVJlZlByb3h5ID0gKHRhcmdldDogUmVmLCBjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50KSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm94eSh0YXJnZXQsIHtcbiAgICAgICAgZ2V0KHRhcmdldCwgcHJvcCkge1xuXG4gICAgICAgICAgICAvLyBpZiAocHJvcCA9PT0gJ19fbm9uUHJveGllZCcpIHtcbiAgICAgICAgICAgIC8vICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpZiAodGFyZ2V0W3Byb3BdKSB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRbcHJvcF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IGdldHRlckZ1bmN0aW9uID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXJncy5mb3JFYWNoKGFyZyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRhaW5zUHJpbWl0aXZlc09ubHkoYXJnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9ycy5ub3RTZXJpYWxpemFibGVSZWZDYWxsKHByb3AsIGFyZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgQ3VzdG9tUmVmTWVzc2FnZSgoe3JlZiwgcHJvcE5hbWUsIGZ1bmN0aW9uQXJncywgbWFrZVNlcmlhbGl6YWJsZX0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByZWZbcHJvcE5hbWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFrZVNlcmlhbGl6YWJsZShyZWZbcHJvcE5hbWVdKC4uLmZ1bmN0aW9uQXJncyksIHRydWUpIC8vIEludm9rZSB0aGUgZnVuY3Rpb24gYW5kIHJldHVybiBpdHMgcmVzdWx0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFrZVNlcmlhbGl6YWJsZSh2YWx1ZSwgdHJ1ZSk7IC8vIFJldHVybiB0aGUgcHJvcGVydHkgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogdHVybiBpdCB0byBjb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SWQ6IHRhcmdldC5yZWZDb25maWcuc2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE5hbWU6IHByb3AsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25BcmdzOiBhcmdzXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgKG1zZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobXNnLmNvbnRlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvL1RPRE86IHdlIGNhbiBpbXBsZW1lbnQgdGhpbmdzIGxpa2UgYXV0byBzZXJpYWxpemF0aW9uIGFuZCBiaW5kaW5nIGZ1bmN0aW9ucyBoZXJlXG4gICAgICAgICAgICAvL2dldHRlckZ1bmN0aW9uLnRlc3QgPSAnMTIzJztcblxuICAgICAgICAgICAgcmV0dXJuIGdldHRlckZ1bmN0aW9uO1xuXG4gICAgICAgICAgICAvL3JldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3ApO1xuICAgICAgICB9LFxuICAgICAgICBzZXQodGFyZ2V0LCBwcm9wOiBzdHJpbmcsIHZhbHVlKSB7XG4gICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgQ3VzdG9tUmVmTWVzc2FnZSgoe3JlZiwgcHJvcE5hbWUsIHByb3BWYWx1ZX0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlZilcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZltwcm9wTmFtZV0gPSBwcm9wVmFsdWU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGZpeCB0aGF0XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJZDogdGFyZ2V0LnJlZkNvbmZpZy5zZWxlY3RvcixcbiAgICAgICAgICAgICAgICAgICAgcHJvcFZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcE5hbWU6IHByb3BcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChtc2cpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogbG9nP1xuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVSZWZDb21wb25lbnQgPSBhc3luYyA8VCBleHRlbmRzIElNeW9wQ29tcG9uZW50ID0gSU15b3BDb21wb25lbnQ+KHJlZjogUmVmLCBjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIGNvbXBvbmVudHM6IElNeW9wQ29tcG9uZW50W10sIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKTogUHJvbWlzZTxUPiA9PiB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gcmVmLmNvbXBvbmVudDtcbiAgICBpZiAoIWNvbXBvbmVudClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW50IGNyZWF0ZVJlZkNvbXBvbmVudCB3aXRoIGRldGFjaGVkIHJlZicpO1xuXG4gICAgLy9jb25zb2xlLmxvZygnY3JlYXRlUmVmQ29tcG9uZW50IGNhbGxlZCcsIHJlZiwgY29tcG9uZW50Q29uZmlnKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IG5ldyBNeW9wUmVmQ29tcG9uZW50KGNvbXBvbmVudENvbmZpZy50eXBlLCBjb21wb25lbnQsIG9wdGlvbnMpO1xuICAgICAgICBjb21wb25lbnRzLnB1c2gocmVmQ29tcG9uZW50KTtcblxuICAgICAgICAvL2ZvciBjYXNlcyB3aGVyZSByZWYgY29tcG9uZW50cyBkZWZpbmUgaW4gdGhlIGNvbXBvbmVudCBjb25maWdcbiAgICAgICAgLy8gd2UgbmVlZCB0byB3YWl0IGZvciB0aGUgcm9vdCBjb21wb25lbnQgdGhlIGJlIGluaXRpYXRlZCBiZWZvcmUgaW50ZXJhY3Rpbmcgd2l0aCBpdFxuICAgICAgICBhd2FpdCBjb21wb25lbnQuaW5pdGlhdGVkKCk7XG5cblxuICAgICAgICAvL1RPRE8gOlxuICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAvL3JlamVjdCgndGltZW91dD8nKTtcbiAgICAgICAgICAgIHJlamVjdCgndGltZW91dCcpO1xuICAgICAgICB9LCA1MDAwKTtcblxuICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZShyZWYucmVmQ29uZmlnLFxuICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMgPyBvcHRpb25zIDoge30sXG4gICAgICAgICAgICAgICAgaWQ6IHJlZkNvbXBvbmVudC5pZCxcbiAgICAgICAgICAgICAgICBfaGFzUGFyZW50OiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXN5bmMgKG1lc3NhZ2UpID0+IHtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGNoZWNrIGlmIHRpbWVvdXQgYWxyZWFkeSBwYXNzZWRcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG5cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5mYWlsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDpcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlIGZhaWxlZCcpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaW1wbGVtZW50YXRpb25Db21wb25lbnQgPSBjb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09IHJlZkNvbXBvbmVudC5pZCk7XG5cbiAgICAgICAgICAgICAgICAvL3NhbWUgbWVtb3J5IGVudiwgc2FtZSBIb3N0U0RLXG4gICAgICAgICAgICAgICAgaWYgKGltcGxlbWVudGF0aW9uQ29tcG9uZW50ICE9PSByZWZDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogY2xlYW4gcmVmQ29tcG9uZW50ID9cblxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdID0gaW1wbGVtZW50YXRpb25Db21wb25lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoaW1wbGVtZW50YXRpb25Db21wb25lbnQgYXMgdW5rbm93biBhcyBUKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5zZXRJbml0aWF0ZWQoKVxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdID0gcmVmQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGhlcmUgPlxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHdoYXQgYWJvdXQgcmVhcHRlcnMgPyEgZHluYW1pYyA/IVxuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGV4c2lzdGluZ1JlZkNvbXBvbmVudCA9IGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gYXMgTXlvcFJlZkNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAvLyBpZiAoZXhzaXN0aW5nUmVmQ29tcG9uZW50LmlkICYmIGV4c2lzdGluZ1JlZkNvbXBvbmVudC5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSA9IFtjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdLCByZWZDb21wb25lbnRdO1xuICAgICAgICAgICAgICAgIC8vIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdKSkge1xuICAgICAgICAgICAgICAgIC8vICAgICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdLnB1c2gocmVmQ29tcG9uZW50KVxuICAgICAgICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdID0gcmVmQ29tcG9uZW50OyAvL2hvc3RTREsuY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PT0gcmVmQ29tcG9uZW50LmlkKSE7XG4gICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogaW4gd2ViY29tcG9uZW50IGNhc2UgdGhlIHNhbWUgaWQgd2lsbCBhbHJlZGF5IGJlIGhlcmUsIHdoaWNoIGlzIGdvb2QgIVxuICAgICAgICAgICAgICAgIC8vIG5hbWU6XG4gICAgICAgICAgICAgICAgLy8gICAgIGlkXG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbXBvbmVudERlZmluaXRpb25JZFxuXG4gICAgICAgICAgICAgICAgLy8gZm9yIGlubmVyIGNvbXBvbmVudHMgaW5zaWRlIHJlZiBjb21wb25lbnQgOlxuICAgICAgICAgICAgICAgIG1lc3NhZ2UubmVzdGVkUmVmcy5mb3JFYWNoKG5lc3RlZFJlZkNvbmZpZyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbXBvbmVudERlZmluaXRpb24gPSBjb21wb25lbnRDb25maWcuaW5zdGFuY2UucmVzb2x2ZWROZXN0ZWRDb21wb25lbnRzIS5maW5kKGMgPT4gYy50eXBlLmlkID09PSBuZXN0ZWRSZWZDb25maWcuY29tcG9uZW50RGVmaW5pdGlvbklkKSEudHlwZTtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zdCBuZXN0ZWRDb21wb25lbnREZWZpbml0aW9uID0gY29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ucmVzb2x2ZWREZWZpbml0aW9ucz8uZmluZChkZWYgPT4gZGVmLmlkID09PSBuZXN0ZWRSZWZDb25maWcuY29tcG9uZW50RGVmaW5pdGlvbklkKSE7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IHJlZkNvbmZpZyA9IGNvbXBvbmVudENvbmZpZy50eXBlLnJlZnMuZmluZChyID0+IHIubmFtZSA9PT0gbmVzdGVkUmVmQ29uZmlnLnJlZk5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiAoIXJlZkNvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKCdubyByZWZDb25maWcgZm91bmQgZm9yIG5lc3RlZCByZWYnKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkQ29tcG9uZW50ID0gbmV3IE15b3BSZWZDb21wb25lbnQobmVzdGVkQ29tcG9uZW50RGVmaW5pdGlvbiwgcmVmQ29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICAgICAgbmVzdGVkQ29tcG9uZW50LnNldEluaXRpYXRlZCgpO1xuICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnQucmVmc1tuZXN0ZWRSZWZDb25maWcucmVmTmFtZV0gPSBuZXN0ZWRDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMucHVzaChuZXN0ZWRDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb25uZWN0UmVmcyhyZWZDb21wb25lbnQsIGNvbXBvbmVudENvbmZpZywgY29tcG9uZW50cywgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDp1c2UgY29uZmlnIGNoZWNrIGZvciBhdXRvLWhpZ2h0IGFuZCBjb252ZXJ0IHR5cGUgcHJvcGVybHlcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVmQ29tcG9uZW50IGFzIHVua25vd24gYXMgVCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3cgZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICB9KVxufVxuXG5leHBvcnQgY29uc3QgY29ubmVjdFJlZnMgPSBhc3luYyAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBjb21wb25lbnRzOiBJTXlvcENvbXBvbmVudFtdLCB3aXRob3V0UmVmQ29tcG9uZW50czogYm9vbGVhbiA9IGZhbHNlKSA9PiB7XG5cbiAgICBpZiAoIWNvbXBvbmVudC5yZWZzKVxuICAgICAgICBjb21wb25lbnQucmVmcyA9IHt9O1xuXG4gICAgY29uc3Qgd2FpdEZvciA9IE9iamVjdC52YWx1ZXMoY29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ucmVmcykubWFwKHJlZiA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPihhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVmLmJlaGF2aW9yLnR5cGUgPT0gUmVmQmVoYXZpb3JUeXBlLmNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudC5yZWZzW3JlZi5uYW1lXSA9XG5cbiAgICAgICAgICAgICAgICBpZiAod2l0aG91dFJlZkNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gY29tcG9uZW50LlxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGNoYW5nZSB0byBnZXQgaXQgZnJvbSB0aGUgZmxvd1xuICAgICAgICAgICAgICAgIGxldCByZWZDb21wb25lbnRJZCA9IChyZWYuYmVoYXZpb3IgYXMgSUNvbXBvbmVudFJlZkJlaGF2aW9yKS5jb21wb25lbnRJZDtcbiAgICAgICAgICAgICAgICBpZiAoIXJlZkNvbXBvbmVudElkKVxuICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnRJZCA9IChyZWYuYmVoYXZpb3IgYXMgSUNvbXBvbmVudFJlZkJlaGF2aW9yKS5pbnN0YW5jZS5jb21wb25lbnRJZFxuXG4gICAgICAgICAgICAgICAgLy8gaWYgKCFjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZXNvbHZlZERlZmluaXRpb25zKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJlamVjdChuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IHJlc29sdmVkRGVmaW5pdGlvbnMgY2hlY2sgdGhlIGNvbmZpZyBvYmplY3QnKSk7XG4gICAgICAgICAgICAgICAgLy8gICAgIC8vdGhyb3cgbmV3IEVycm9yKCdjb21wb25lbnRDb25maWcgcHJvdmlkZWQgd2l0aG91dCByZXNvbHZlZERlZmluaXRpb25zIGNoZWNrIHRoZSBjb25maWcgb2JqZWN0Jyk7XG4gICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGNvbXBvbmVudERlZmluaXRpb25Db25maWcgPSBjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZXNvbHZlZERlZmluaXRpb25zIS5maW5kKGNvbXBkZWYgPT4gY29tcGRlZi5pZCA9PT0gcmVmQ29tcG9uZW50SWQpITtcbiAgICAgICAgICAgICAgICAvLyAvL2NvbnN0IGNvbXBvbmVudERlZmluaXRpb25Db25maWcgPSBhd2FpdCBnZXRDb21wb25lbnREZWZpbml0aW9uQ29uZmlnKGNvbXBvbmVudEluc3RhbmNlQ29uZmlnLmNvbXBvbmVudElkKTtcbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIGlmICghY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZykge1xuICAgICAgICAgICAgICAgIC8vICAgICByZWplY3QobmV3IEVycm9yKCdjb21wb25lbnRDb25maWcgcHJvdmlkZWQgd2l0aG91dCByZXNvbHZlZERlZmluaXRpb25zIGNoZWNrIHRoZSBjb25maWcgb2JqZWN0JykpO1xuICAgICAgICAgICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPOiBpZiB3ZSBoYXZlIHRoZSBzYW1lIGNvbXBvbmVudCBtb3JlIHRoYW4gb25jZSB3ZSB3aWxsIG5lZWQgaW5zdGFuY2UgaWQgaGVyZSAuLi5cbiAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDb21wb25lbnRDb25maWcgPSBjb21wb25lbnRDb25maWcuaW5zdGFuY2UucmVzb2x2ZWROZXN0ZWRDb21wb25lbnRzPy5maW5kKG5lc3RlZENvbXBvbmVudCA9PiBuZXN0ZWRDb21wb25lbnQudHlwZS5pZCA9PT0gcmVmQ29tcG9uZW50SWQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFuZXN0ZWRDb21wb25lbnRDb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb21wb25lbnRDb25maWcgcHJvdmlkZWQgd2l0aG91dCBuZXN0ZWRDb21wb25lbnRDb25maWcgY2hlY2sgdGhlIGNvbmZpZyBvYmplY3QnKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vY29uc3QgY29tcG9uZW50SW5zdGFuY2VDb25maWcgPSBjb21wb25lbnRDb25maWcuaW5zdGFuY2UubmVzdGVkQ29tcG9uZW50cz8uZmluZChjb21wb25lbnRJbnN0YWNlID0+IGNvbXBvbmVudEluc3RhY2UuY29tcG9uZW50SWQgPT09IGNvbXBvbmVudERlZmluaXRpb25Db25maWcuaWQpO1xuICAgICAgICAgICAgICAgIC8vIGlmKCFjb21wb25lbnREZWZpbml0aW9uQ29uZmlnKXtcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKCdUT0RPIFRPRE8gVE9ETyAnKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6dGhpbmsgYWJvdXQgdGhhdCA6XG4gICAgICAgICAgICAgICAgLy8gICBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnLnJlc29sdmVkRGVmaW5pdGlvbnMgPSBjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZXNvbHZlZERlZmluaXRpb25zO1xuICAgICAgICAgICAgICAgIC8vICAgY29uc3QgbmVzdGVkQ29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnID0ge1xuICAgICAgICAgICAgICAgIC8vICAgICAgIGluc3RhbmNlOiBuZXN0ZWRDb21wb25lbnRDb25maWcuaW5zdGFuY2UhLFxuICAgICAgICAgICAgICAgIC8vICAgICAgIHR5cGU6IG5lc3RlZENvbXBvbmVudENvbmZpZy50eXBlLFxuICAgICAgICAgICAgICAgIC8vICAgICAgIG5hbWU6IG5lc3RlZENvbXBvbmVudENvbmZpZy5uYW1lXG4gICAgICAgICAgICAgICAgLy8gICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBfcmVmID0gUmVmLmNyZWF0ZSgnJywgcmVmLCBjb21wb25lbnQpO1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnbmVzdGVkICEhIGNyZWF0ZVJlZkNvbXBvbmVudCBjYWxsZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkQ29tcG9uZW50ID0gYXdhaXQgY3JlYXRlUmVmQ29tcG9uZW50KF9yZWYsIG5lc3RlZENvbXBvbmVudENvbmZpZyEsIGNvbXBvbmVudHMpXG4gICAgICAgICAgICAgICAgICAgIC8vVERPTyA6IHB1dCB0aGF0IHJlZiBjb21wb25lbnQgc29tZXdoZXJlP1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGRlYnVnZ2VyO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQucmVmc1tyZWYubmFtZV0gPSBuZXN0ZWRDb21wb25lbnQ7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgX19ub25Qcm94aWVkID0gUmVmLmNyZWF0ZSgnJywgcmVmLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQucmVmc1tyZWYubmFtZV0gPSBjcmVhdGVSZWZQcm94eShfX25vblByb3hpZWQsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vYWxlcnQoJz8nKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9KVxuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHdhaXRGb3IpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy9kZWJ1Z2dlclxuICAgICAgICB0aHJvdyBlO1xuICAgIH1cblxufVxuXG5leHBvcnQgdHlwZSBwcm9wVHlwZXM8VCBleHRlbmRzIGNvbXBvbmVudERlZmluaXRpb25Qcm9wcz4gPSB7XG4gICAgW1Byb3BlcnR5IGluIGtleW9mIFRdOlxuICAgIFRbUHJvcGVydHldIGV4dGVuZHMgeyBtb2RlOiAnaW5wdXQnIH0gP1xuICAgICAgICBUW1Byb3BlcnR5XVsndHlwZSddIDpcbiAgICAgICAgUHJvbWlzZTxUW1Byb3BlcnR5XVsndHlwZSddPlxufVxuXG5leHBvcnQgY29uc3QgZXhlYyA9IGFzeW5jIChnZXR0ZXI6IGFueSkgPT4ge1xuICAgIHJldHVybiBhd2FpdCBnZXR0ZXIoKVxufVxuXG5leHBvcnQgY29uc3QgYWN0QXMgPSA8VD4ocmVmOiBSZWYpID0+IHtcbiAgICByZXR1cm4gcmVmIGFzIHVua25vd24gYXMgRnVuY3Rpb25pZnlSZWY8VD5cbn1cblxuZXhwb3J0IHR5cGUgRnVuY3Rpb25pZnlSZWY8VCA9IGFueT4gPSB7XG4gICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyAoLi4uYXJnczogaW5mZXIgQSkgPT4gaW5mZXIgUiAvLyBJZiBpdCdzIGEgZnVuY3Rpb25cbiAgICAgICAgPyAoLi4uYXJnczogQSkgPT4gUHJvbWlzZTxSPiAvLyBDb252ZXJ0IGl0IHRvIGEgcHJvbWlzZWQgZnVuY3Rpb25cbiAgICAgICAgOiBUW0tdXG59O1xuIiwgImltcG9ydCB7QmFzZU15b3BDb21wb25lbnR9IGZyb20gXCIuL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSxcbiAgICBFeGVjdXRlQ29tcG9uZW50TWV0aG9kLFxuICAgIEV4ZWN1dGVTY3JpcHRNZXNzYWdlLCBNZXNzYWdlRGlyZWN0aW9uXG59IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElJZnJhbWVMb2FkZXJDb25maWcsIElTa2luQ29uZmlnfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge3NldERlYnVnU3R5bGV9IGZyb20gXCIuLi9jb21wb25lbnRDb3JlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXMudHNcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcblxuZXhwb3J0IGNsYXNzIE15b3BJZnJhbWVDb21wb25lbnQgZXh0ZW5kcyBCYXNlTXlvcENvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwcml2YXRlIElmcmFtZUVsZW1lbnQ6IEhUTUxJRnJhbWVFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICBzdXBlcihjb21wb25lbnRDb25maWcsIGNvbnRhaW5lciwgb3B0aW9ucylcblxuICAgICAgICBpZiAoKHNraW4ubG9hZGVyIGFzIElJZnJhbWVMb2FkZXJDb25maWcpLmF1dG9IZWlnaHQpIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IHRoaXMuSWZyYW1lRWxlbWVudDtcbiAgICAgICAgLy8gdGhpcy5JZnJhbWVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgICAvLyAgICAgaWYgKHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QpXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdChgSWZyYW1lRWxlbWVudCBlcnJvcmApO1xuICAgICAgICAvLyB9KTtcbiAgICB9XG5cbiAgICBjbGVhbnVwSW5zcGVjdD86IENsZWFudXBIYW5kbGVyO1xuXG4gICAgaW5zcGVjdCgpIHtcbiAgICAgICAgLy8gVE9ETyA6IHVzZSBiZXR0ZXIgY2hlY2sgZm9yIGluc3BlY3QgbW9kZVxuICAgICAgICBpZiAodGhpcy5jbGVhbnVwSW5zcGVjdCkge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnaW5zcGVjdCBjYWxsIG1vcmUgdGhhbiBvbmNlJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jbGVhbnVwSW5zcGVjdFxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QgPSBzZXREZWJ1Z1N0eWxlKHRoaXMuaWQsICdNeW9wSWZyYW1lQ29tcG9uZW50JywgMTAsIHRoaXMuY29udGFpbmVyLCB0aGlzLklmcmFtZUVsZW1lbnQsIHRoaXMuY29tcG9uZW50RGVmaW5pdGlvbik7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ISgpO1xuICAgICAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzEnO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAndW5zZXQnXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2FsbCdcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgfVxuXG4gICAgc2V0SGVpZ2h0QmFzZWRPbkRvY3VtZW50RWxlbWVudCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodDtcbiAgICAgICAgfSwgKHJldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3JldC5jb250ZW50fXB4YDtcbiAgICAgICAgICAgIGNsZWFudXBIYW5kbGVyKCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBvYnNlcnZlU2l6ZUJhc2VkT25Eb2N1bWVudEVsZW1lbnQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoe3NlbmR9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7aGVpZ2h0LCB3aWR0aH0gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7aGVpZ2h0LCB3aWR0aH0gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgc2VuZCh7aGVpZ2h0LCB3aWR0aH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHkpO1xuXG4gICAgICAgICAgICByZXR1cm4ge2hlaWdodCwgd2lkdGh9XG4gICAgICAgIH0sIChyZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3JldC5jb250ZW50LndpZHRofXB4YDtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtyZXQuY29udGVudC5oZWlnaHR9cHhgO1xuICAgICAgICB9KSk7XG5cbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH1cblxuICAgIHNldFNpemVCYXNlZE9uRG9jdW1lbnRFbGVtZW50ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qge2hlaWdodCwgd2lkdGh9ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgcmV0dXJuIHtoZWlnaHQsIHdpZHRofVxuICAgICAgICB9LCAocmV0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHtyZXQuY29udGVudC53aWR0aH1weGA7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7cmV0LmNvbnRlbnQuaGVpZ2h0fXB4YDtcbiAgICAgICAgICAgIGNsZWFudXBIYW5kbGVyKCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBzZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKCkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgLy8gcmV0dXJuIHdpbmRvdy5kb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodCArICdweCc7XG5cblxuICAgICAgICAgICAgLy9UT0RPOiBmaXggdGhhdCBoYWNrLCBrZWVwIHRoZSBmdW5jdGlvbiBpbiByaWdodCBmb3JtYXQgd2hpbGUgbWluaWZpZWQgOihcbiAgICAgICAgICAgIGNvbnN0IG5vT3AgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gTm8gb3BlcmF0aW9uIHBlcmZvcm1lZFxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVG8gZW5zdXJlIGl0J3Mgbm90IG9wdGltaXplZCBhd2F5LCB5b3UgY2FuIGNhbGwgaXQgYXQgbGVhc3Qgb25jZVxuICAgICAgICAgICAgbGV0IHggPSBub09wKCk7XG4gICAgICAgICAgICB4Kys7XG4gICAgICAgICAgICB4LS07XG5cbiAgICAgICAgICAgIC8vcmV0dXJuIGAke3dpbmRvdy5kb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodH1weGA7XG5cbiAgICAgICAgICAgIC8vVE9ETyA6IGNoZWNrIHRoYXQgKzEgP1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KE1hdGgubWF4KFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodClcbiAgICAgICAgICAgICAgICAsIHdpbmRvdy5kb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCkgKyB4ICsgJ3B4J1xuXG4gICAgICAgIH0sIChyZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5oZWlnaHQgPSByZXQuY29udGVudDtcbiAgICAgICAgICAgIGNsZWFudXBIYW5kbGVyKCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IENsZWFudXBIYW5kbGVyID0+IHtcbiAgICAgICAgbGV0IG1lc3NhZ2VfID0gey4uLm1lc3NhZ2V9IGFzIEJhc2VNeW9wTWVzc2FnZTtcbiAgICAgICAgLy9UT0RPIDogPyE/ISBzaG91bGQgaXQgYmUgaGVyZSA/XG4gICAgICAgIGlmIChtZXNzYWdlXy5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkV4ZWN1dGVDb21wb25lbnRNZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IChtZXNzYWdlXyBhcyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKVxuICAgICAgICAgICAgdGhpc1t0eXBlZE1lc3NhZ2UubWV0aG9kXSgpO1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vVE9ETyA6IGZpeCB0aGF0IGhhY2sgOihcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL2NvbnN0IGhhbmRsZXIgPSBtZXNzYWdlLmhhbmRsZXJcblxuICAgICAgICBtZXNzYWdlXy5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLmRvd247XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gc3VwZXIuc2VuZChtZXNzYWdlXyk7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudD8uY29udGVudFdpbmRvdz8ucG9zdE1lc3NhZ2UobWVzc2FnZV8sICcqJyk7XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL21lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXJcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfTtcblxuICAgIG9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluLk11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlXG4gICAgICAgICAgICB8fCBpbmNvbWVNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW4uUmVzaXplT2JzZXJ2ZXJNZXNzYWdlKSB7XG4gICAgICAgICAgICB0aGlzLnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKTtcbiAgICAgICAgICAgIC8vZGVidWdnZXJcbiAgICAgICAgICAgIC8vdGhpcy5zZXRIZWlnaHRCYXNlZE9uRG9jdW1lbnRFbGVtZW50KCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdXBlci5vbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlKTtcbiAgICB9XG5cbiAgICBkaXNwb3NlID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jbGVhbnVwSW5zcGVjdClcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QoKTtcblxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5wYXJlbnROb2RlIS5yZW1vdmVDaGlsZCh0aGlzLklmcmFtZUVsZW1lbnQpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNES1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWcsIFNraW5Mb2FkZXJUeXBlfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU15b3BMb2FkZXIge1xuICAgIHR5cGU6IFNraW5Mb2FkZXJUeXBlO1xuICAgIGxvYWQ6IChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiBQcm9taXNlPElNeW9wQ29tcG9uZW50Pjtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNeW9wTG9hZGVyIGltcGxlbWVudHMgSU15b3BMb2FkZXIge1xuICAgIGFic3RyYWN0IHR5cGU6IFNraW5Mb2FkZXJUeXBlO1xuICAgIGFic3RyYWN0IGxvYWQ6IChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiBQcm9taXNlPElNeW9wQ29tcG9uZW50PjtcblxuICAgIGFwcGVuZENoaWxkID0gKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucywpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnJlbGF0aXZlKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5yZWxhdGl2ZS5kaXJlY3Rpb24gPT09ICdiZWZvcmUnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUoZWxlbWVudCwgb3B0aW9ucy5yZWxhdGl2ZS5jaGlsZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlbGF0aXZlLmRpcmVjdGlvbiA9PT0gJ2FmdGVyJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHRTaWJsaW5nID0gb3B0aW9ucy5yZWxhdGl2ZS5jaGlsZD8ubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUoZWxlbWVudCwgbmV4dFNpYmxpbmcgPyBuZXh0U2libGluZyA6IG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BJZnJhbWVDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BJZnJhbWVDb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BMb2FkZXJ9IGZyb20gXCIuL0lNeW9wTG9hZGVyXCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLXCI7XG5pbXBvcnQge0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJSWZyYW1lTG9hZGVyQ29uZmlnLCBJU2tpbkNvbmZpZywgU2tpbkxvYWRlcnN9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcblxuY29uc3QgYWRkUXVlcnlQYXJhbSA9ICh1cmw6IHN0cmluZywgcGFyYW06IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4ge1xuICAgIC8vIENyZWF0ZSBhIFVSTCBvYmplY3RcbiAgICBjb25zdCB1cmxPYmogPSBuZXcgVVJMKHVybCk7XG5cbiAgICAvLyBBZGQgdGhlIHF1ZXJ5IHBhcmFtZXRlclxuICAgIHVybE9iai5zZWFyY2hQYXJhbXMuYXBwZW5kKHBhcmFtLCB2YWx1ZSk7XG5cbiAgICAvLyBSZXR1cm4gdGhlIHVwZGF0ZWQgVVJMXG4gICAgcmV0dXJuIHVybE9iai50b1N0cmluZygpO1xufVxuXG5leHBvcnQgY2xhc3MgTXlvcElmcmFtZUxvYWRlciBleHRlbmRzIEJhc2VNeW9wTG9hZGVyIHtcbiAgICB0eXBlID0gU2tpbkxvYWRlcnMuSWZyYW1lTG9hZGVyXG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbG9hZCA9IGFzeW5jIChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiB7XG4gICAgICAgIGxldCBJZnJhbWVFbGVtZW50OiBIVE1MSUZyYW1lRWxlbWVudDtcblxuICAgICAgICBjb25zdCB0eXBlZExvYWRlckNvbmZpZyA9IChza2luLmxvYWRlciBhcyBJSWZyYW1lTG9hZGVyQ29uZmlnKTtcblxuICAgICAgICBpZiAoY29udGFpbmVyPy5ub2RlTmFtZSA9PT0gXCJJRlJBTUVcIikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ25lZWRzIHRvIGxvYWQgaW50byBhbiBleHNpc3RpbmcgSWZyYW1lLi4uJywgdHlwZWRMb2FkZXJDb25maWcudXJsLCBjb250YWluZXIpO1xuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gKGNvbnRhaW5lciBhcyBIVE1MSUZyYW1lRWxlbWVudClcbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc3JjID0gdHlwZWRMb2FkZXJDb25maWcudXJsXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB1bmlxSWQgPSB1dWlkdjQoKTtcbiAgICAgICAgICAgIGNvbnN0IGRvbUlkID0gYG15b3AtY29tcC0ke3VuaXFJZH1gXG5cbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCduZWVkcyB0byBjcmVhdGUgbmV3IElmcmFtZS4uLicsIGRvbUlkLCB0eXBlZExvYWRlckNvbmZpZy51cmwsIGNvbnRhaW5lcik7XG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gOiBkbyBpdCBvbmx5IHdpdGggZmxhZyA/XG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbaWRePVwibXlvcC1jb21wLVwiXScpKVxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAgICAgLy9UT0RPIDogY2hlY2sgdGhhdCA6XG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uaGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgSWZyYW1lRWxlbWVudCwgb3B0aW9ucykgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgIC8vIGluIG9yZGVyIHRvIGhhbmRsZSBpc3N1ZSB0byBsb2FkIGlmcmFtZSBpbnNpZGUgYW4gaWZyYW1lIHdpdGggdGhlIHNhbWUgdXJsXG4gICAgICAgICAgICBsZXQgdXJsMmxvYWQgPSAoc2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZykudXJsO1xuICAgICAgICAgICAgLy9jb25zdCB1bmlxVXJsID0gdXJsMmxvYWQgPT09IGRvY3VtZW50LmxvY2F0aW9uLmhyZWYgPyBhZGRRdWVyeVBhcmFtKHVybDJsb2FkLCBcIl9tXCIsIGRvbUlkKSA6IHVybDJsb2FkXG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uX2hhc1BhcmVudClcbiAgICAgICAgICAgICAgICB1cmwybG9hZCA9IGFkZFF1ZXJ5UGFyYW0odXJsMmxvYWQsIFwiX215b3AtY29tcFwiLCB1bmlxSWQpO1xuXG4gICAgICAgICAgICAvL1RPRE8gOiBoYW5kbGUgJ3N0eWxlJyBhdHRyIG1lcmdlIGhlcmVcbiAgICAgICAgICAgIGxldCBlbGVtZW50QXR0cmlidXRlc1N0cmluZyA9ICcnO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmVsZW1lbnRBdHRyaWJ1dGVzKVxuICAgICAgICAgICAgICAgIGVsZW1lbnRBdHRyaWJ1dGVzU3RyaW5nID0gT2JqZWN0LmVudHJpZXMob3B0aW9ucz8uZWxlbWVudEF0dHJpYnV0ZXMpXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke2tleX09XCIke1N0cmluZyh2YWx1ZSl9XCJgO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuam9pbignICcpO1xuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50Lm91dGVySFRNTCA9IGA8aWZyYW1lIFxuICAgICAgICAgICAgICAgaWQ9XCIke2RvbUlkfVwiXG4gICAgICAgICAgICAgICBzdHlsZT1cIlxuICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgICAgICAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICAgICAgICAgICAgIGhlaWdodDogJHt0eXBlZExvYWRlckNvbmZpZy5hdXRvSGVpZ2h0IHx8ICF0eXBlZExvYWRlckNvbmZpZy5oZWlnaHQgPyAnJyA6IHR5cGVkTG9hZGVyQ29uZmlnLmhlaWdodH07ICAgIFxuICAgICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwJTtcbiAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAke29wdGlvbnM/LmhpZGRlbiA/ICcwJyA6ICcxJ307XG4gICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICR7b3B0aW9ucz8uaGlkZGVuID8gJ2Fic29sdXRlJyA6ICdzdGF0aWMnfTtcbiAgICAgICAgICAgICAgICAgICBwb2ludGVyLWV2ZW50czogJHtvcHRpb25zPy5oaWRkZW4gPyAnbm9uZScgOiAnYWxsJ307XG4gICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgc3JjPVwiJHt1cmwybG9hZH1cIlxuICAgICAgICAgICAgJHtlbGVtZW50QXR0cmlidXRlc1N0cmluZ31cbiAgICAgICAgICAgID48L2lmcmFtZT5gO1xuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYCMke2RvbUlkfWApIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuXG4gICAgICAgICAgICAvLyAgIElmcmFtZUVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkb21JZCkgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgICAgICAgICAvL05PIDogSWZyYW1lRWxlbWVudCA9IGNvbnRhaW5lci5sYXN0RWxlbWVudENoaWxkIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBNeW9wSWZyYW1lQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGNvbnRhaW5lciwgSWZyYW1lRWxlbWVudCwgb3B0aW9ucyk7XG4gICAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBteW9wV2ViY29tcG9uZW50Q29uc3RzID0ge1xuICAgIHdlYmNvbXBvbmVudF9tZXNzYWdlX2tleTogJ215b3Bfd2ViY29tcG9uZW50X21lc3NhZ2UnXG59XG4iLCAiaW1wb3J0IHtteW9wV2ViY29tcG9uZW50Q29uc3RzfSBmcm9tIFwiLi4vLi4vd2ViY29tcG9uZW50L2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXIsIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJU2tpbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtzZXREZWJ1Z1N0eWxlfSBmcm9tIFwiLi4vY29tcG9uZW50Q29yZVwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNES1wiO1xuXG5leHBvcnQgY2xhc3MgTXlvcFdlYkNvbXBvbmVudCBleHRlbmRzIEJhc2VNeW9wQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgcHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHByaXZhdGUgY3VzdG9tRWxlbWVudDogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKGNvbXBvbmVudERlZmluaXRpb24sIGNvbnRhaW5lciAsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBjdXN0b21FbGVtZW50O1xuICAgIH1cblxuICAgIGNsZWFudXBJbnNwZWN0OiBDbGVhbnVwSGFuZGxlciA9ICgpID0+IHtcbiAgICB9XG5cbiAgICBpbnNwZWN0KCkge1xuICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ID0gc2V0RGVidWdTdHlsZSh0aGlzLmlkLCAnTXlvcFdlYkNvbXBvbmVudCcsIDAsIHRoaXMuY29udGFpbmVyLCB0aGlzLmN1c3RvbUVsZW1lbnQsIHRoaXMuY29tcG9uZW50RGVmaW5pdGlvbik7XG4gICAgICAgIHJldHVybiB0aGlzLmNsZWFudXBJbnNwZWN0O1xuICAgIH1cblxuICAgIGhpZGUoKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMCdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLndpZHRoID0gJzAnXG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICd1bnNldCdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYWxsJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLmhlaWdodCA9ICcnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUud2lkdGggPSAnJztcbiAgICB9XG5cbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZTxhbnk+KSA9PiB7XG4gICAgICAgIGxldCBtZXNzYWdlXyA9IHsuLi5tZXNzYWdlfSBhcyBCYXNlTXlvcE1lc3NhZ2U7XG5cbiAgICAgICAgLy9UT0RPIDogY2FuIGJlIGRvbmUgd2l0aG91dCBjbG9uaW5nP1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vY29uc3QgaGFuZGxlciA9IG1lc3NhZ2VfLmhhbmRsZXJcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSBzdXBlci5zZW5kKG1lc3NhZ2VfKTtcblxuICAgICAgICBjb25zdCBtc2cgPSBuZXcgQ3VzdG9tRXZlbnQ8QmFzZU15b3BNZXNzYWdlPihteW9wV2ViY29tcG9uZW50Q29uc3RzLndlYmNvbXBvbmVudF9tZXNzYWdlX2tleSwge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZGV0YWlsOiBtZXNzYWdlXyxcbiAgICAgICAgICAgIC8vIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgICAvLyBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIC8vIGNvbXBvc2VkOiB0cnVlXG4gICAgICAgIH0pXG5cbiAgICAgICAgLy90aGlzLmNvbnRhaW5lci5kaXNwYXRjaEV2ZW50KG1zZylcblxuICAgICAgICAvL3NlbmRpbmcgZGF0YSBmcm9tIGhvc3QgdG8gdGhlIGNvbXBvbmVudFxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LmRpc3BhdGNoRXZlbnQobXNnKVxuICAgICAgICAgICAgLy8gaWYgKHRoaXMuY3VzdG9tRWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gICAgIHRoaXMuY3VzdG9tRWxlbWVudC5jaGlsZHJlblswXS5kaXNwYXRjaEV2ZW50KG1zZylcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yIHdoaWxlIHRyeWluZyB0byBkaXNwYXRjaEV2ZW50JywgZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vbWVzc2FnZS5oYW5kbGVyID0gaGFuZGxlclxuXG4gICAgICAgIHJldHVybiBjbGVhbnVwSGFuZGxlcjtcbiAgICB9XG5cbiAgICBkaXNwb3NlID0gKCkgPT4ge1xuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5wYXJlbnROb2RlPy5yZW1vdmVDaGlsZCh0aGlzLmN1c3RvbUVsZW1lbnQpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BXZWJDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BXZWJjb21wb25lbnRcIjtcbmltcG9ydCB7QmFzZU15b3BMb2FkZXJ9IGZyb20gXCIuL0lNeW9wTG9hZGVyXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5pbXBvcnQge3V1aWR2NCwgd2FpdH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWxzLnRzXCI7XG5pbXBvcnQge0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJU2tpbkNvbmZpZywgSVdlYkNvbXBvbmVudExvYWRlckNvbmZpZywgU2tpbkxvYWRlcnN9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcblxuY29uc3Qgc2VlbjogUmVjb3JkPHN0cmluZywgUHJvbWlzZTx2b2lkPj4gPSB7fTtcblxuZXhwb3J0IGNsYXNzIFdlYmNvbXBvbmVudExvYWRlciBleHRlbmRzIEJhc2VNeW9wTG9hZGVyIHtcblxuICAgIHR5cGUgPSBTa2luTG9hZGVycy5XZWJDb21wb25lbnRMb2FkZXJcblxuICAgIGxvYWQgPSBhc3luYyAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4ge1xuXG4gICAgICAgIGNvbnN0IGxvYWRlckNvbmZpZyA9IChza2luLmxvYWRlciBhcyBJV2ViQ29tcG9uZW50TG9hZGVyQ29uZmlnKTtcblxuICAgICAgICBpZiAoIXNlZW5bbG9hZGVyQ29uZmlnLnVybF0pIHtcbiAgICAgICAgICAgIC8vIGF3YWl0IGltcG9ydCggLyogQHZpdGUtaWdub3JlICovIHdlYkNvbXBvbmVudExvYWRVcmwpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ21vZHVsZSBsb2FkZWQnKTtcbiAgICAgICAgICAgIHNlZW5bbG9hZGVyQ29uZmlnLnVybF0gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2ViQ29tcG9uZW50TG9hZFVybCA9IGxvYWRlckNvbmZpZy51cmxcbiAgICAgICAgICAgICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgICAgICAgICAgICBzY3JpcHQudHlwZSA9ICdtb2R1bGUnO1xuICAgICAgICAgICAgICAgIHNjcmlwdC5zcmMgPSB3ZWJDb21wb25lbnRMb2FkVXJsO1xuICAgICAgICAgICAgICAgIHNjcmlwdC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzY3JpcHQub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnTW9kdWxlIGFscmVkYXkgbG9hZGVkIG9yIGluIGxvYWRpbmcgcHJvY2VzcycpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgc2Vlbltsb2FkZXJDb25maWcudXJsXTtcblxuICAgICAgICAvL1RPRE8gOiBhZGQgcmV0cnkgbWVjaGFuaXNtIGluIGZhaWwgY2FzZS5cblxuICAgICAgICAvL1RPRE8gOiBmaXggdGhhdCBoYWNrLCBzaG91bGQgZml4IHRoZSByYWNlIGNvbmRpdGlvbiBmb3IgbG9hZGVkIG1vZHVsZXNcbiAgICAgICAgYXdhaXQgd2FpdCgxKTtcblxuICAgICAgICBsZXQgZG9tSWQgPSBgbXlvcC1jb21wLSR7dXVpZHY0KCl9YFxuICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChsb2FkZXJDb25maWcudGFnKTtcblxuICAgICAgICAvLyBUT0RPIDogZG8gaXQgb25seSB3aXRoIGZsYWcgP1xuICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbaWRePVwibXlvcC1jb21wLVwiXScpKVxuICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgIC8vZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIGVsZW1lbnQuaWQgPSBkb21JZDtcblxuICAgICAgICBpZiAob3B0aW9ucz8uaGlkZGVuKSB7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMCdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiAoY29udGFpbmVyLmlkLnN0YXJ0c1dpdGgoJ215b3AtY29tcC0nKSkge1xuICAgICAgICAvLyAgICAgLy8gaW4gcGxhY2UgcmVwbGFjZW1lbnRcbiAgICAgICAgLy8gICAgIGNvbnRhaW5lci5yZXBsYWNlV2l0aChlbGVtZW50KTtcbiAgICAgICAgLy8gICAgIC8vY29udGFpbmVyID0gZWxlbWVudC5wYXJlbnRFbGVtZW50ITtcbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgLy8gICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGlmKG9wdGlvbnM/Ll9lbnZpcm9ubWVudCl7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBlbGVtZW50Ll9teW9wRW52aXJvbm1lbnQgPSBvcHRpb25zPy5fZW52aXJvbm1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgICAgIC8vZWxlbWVudC5pbm5lckhUTUwgPSBgPCR7bG9hZGVyQ29uZmlnLnRhZ30gLz5gO1xuICAgICAgICByZXR1cm4gbmV3IE15b3BXZWJDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBlbGVtZW50LCBvcHRpb25zKTtcbiAgICB9XG5cbn1cbiIsICJleHBvcnQgZGVmYXVsdCAnMC4xLjQ3JzsiLCAiaW1wb3J0IHtCYXNlQ29udGV4dE1lc3NhZ2VIYW5kbGVyLCBIb3N0ZWRDb21wb25lbnR9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBNeW9wQmluZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuXG5leHBvcnQgdHlwZSBNZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4gdm9pZFxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2UgPSBhbnk+IGV4dGVuZHMgQmFzZUNvbnRleHRNZXNzYWdlSGFuZGxlcjxULCBSZWNvcmQ8c3RyaW5nLCBIb3N0ZWRDb21wb25lbnQ8U2hhZG93Um9vdFJlZj4+PiB7XG5cbiAgICBhYnN0cmFjdCBtZXNzYWdlVHlwZTogc3RyaW5nXG5cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlVG9Ib3N0OiBhbnksIHB1YmxpYyBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCBIb3N0ZWRDb21wb25lbnQ8U2hhZG93Um9vdFJlZj4+KSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2VUb0hvc3QpO1xuICAgIH1cblxuICAgIGFic3RyYWN0IGlubmVyRXhlY3V0b3I6IChldmVudDogVCwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4gdm9pZDtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBUKSA9PiB7XG4gICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgIGlmIChldmVudC5kZXN0aW5hdGlvbikge1xuICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSBldmVudC5kZXN0aW5hdGlvbjtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHRbZGVzdGluYXRpb25dLmNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIC8vIHBhdGNoIHRoZSBzb3VyY2UgaWQsIHRoaW5rIGFib3V0IHRoYXQgP1xuICAgICAgICAgICAgICAgIGNvbnN0IF9tZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGV2ZW50LmRlc3RpbmF0aW9uID8gZXZlbnQuZGVzdGluYXRpb24gOiBldmVudC5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbjogZXZlbnQuc291cmNlID8gZXZlbnQuc291cmNlIDogZXZlbnQuZGVzdGluYXRpb25cbiAgICAgICAgICAgICAgICAgICAgfSBhcyBCYXNlTXlvcE1lc3NhZ2UsIHJlcGxheVRvKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlubmVyRXhlY3V0b3IoZXZlbnQsIHRoaXMuY29udGV4dFtkZXN0aW5hdGlvbl0uY29udGV4dCwgX21lc3NhZ2VUb0hvc3QpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBteW9wQXR0cmlidXRlcyA9IHtcbiAgICBpZDogJ215b3AtaWQnXG59XG4iLCAiaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0cy50c1wiO1xuaW1wb3J0IHtSZWZ9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuXG5leHBvcnQgY29uc3QgZ2V0RWxlbWVudHNCeVJlZiA9IChyZWY6IFJlZiwgZWw6IFBhcmVudE5vZGUpID0+IHtcbiAgICByZXR1cm4gZWwucXVlcnlTZWxlY3RvckFsbChgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9PScke3JlZi5yZWZDb25maWcuc2VsZWN0b3J9J11gKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldEZpcnN0RWxlbWVudEJ5UmVmID0gKHJlZjogUmVmLCBlbDogUGFyZW50Tm9kZSkgPT4ge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gZ2V0RWxlbWVudHNCeVJlZihyZWYsIGVsKTtcbiAgICBpZiAoZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50cy5pdGVtKDApO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn0iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0JpbmRDbGlja01lc3NhZ2UsIENsaWNrUmVwbGF5TWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQmluZE9uQ2xpY2tIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEJpbmRDbGlja01lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkJpbmRDbGlja01lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBCaW5kQ2xpY2tNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdClcbiAgICAgICAgY29uc3QgY2xlYW51cFRhc2tzOiBhbnlbXSA9IFtdO1xuXG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IENsaWNrUmVwbGF5TWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQpKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcik7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MuZm9yRWFjaCh0YXNrID0+IHRhc2soKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge015b3BFbGVtZW50TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIENoYW5nZVRleHRIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPE15b3BFbGVtZW50TWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQ2hhbmdlVGV4dE1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBNeW9wRWxlbWVudE1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGl0ZW0udGV4dENvbnRlbnQgPSBldmVudC5jb250ZW50O1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge1Jvb3RSZWZ9IGZyb20gXCIuLi9jb21tb25cIjtcblxuZXhwb3J0IGNsYXNzIFNoYWRvd1Jvb3RSZWYgZXh0ZW5kcyBSb290UmVmIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgcHVibGljIHNoYWRvd1Jvb3Q6IFNoYWRvd1Jvb3QpIHtcbiAgICAgICAgc3VwZXIoY29udGFpbmVyLCBzaGFkb3dSb290KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wRWxlbWVudFJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtEZXRlY3RlZE15b3BSZWZzTWVzc2FnZSwgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5leHBvcnQgY2xhc3MgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxEZXRlY3RNeW9wUmVmc01lc3NhZ2U+IHtcbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBEZXRlY3RNeW9wUmVmc01lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYpID0+IHtcblxuICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICBjb25zdCBhbGxNeW9wSXRlbXMgPSBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbChgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9XWApO1xuXG4gICAgICAgIGxldCBteW9wUmVmczogTXlvcEVsZW1lbnRSZWZbXSA9IFtdO1xuXG4gICAgICAgIGFsbE15b3BJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuXG4gICAgICAgICAgICAvLyBUT0RPIDogdGFrZSB0aGF0IGJhY2sgdG8gdGhlIGRhc2hib2FyZD9cbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coaXRlbSwgaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IG15b3BJZCA9IGl0ZW0uZ2V0QXR0cmlidXRlKG15b3BBdHRyaWJ1dGVzLmlkKTtcblxuICAgICAgICAgICAgaWYgKG15b3BJZCkge1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ3djIHJlY3QnLCAgaXRlbS5wYXJlbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKVxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBteW9wUmVmcy5wdXNoKG5ldyBNeW9wRWxlbWVudFJlZihteW9wSWQsIGl0ZW0udGFnTmFtZSwgaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgaXRlbS5vZmZzZXRUb3AsIGl0ZW0ub2Zmc2V0TGVmdCkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBEZXRlY3RlZE15b3BSZWZzTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIG15b3BSZWZzKSlcbiAgICB9O1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRGV0ZWN0TXlvcFJlZnNNZXNzYWdlO1xuXG5cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2V0QXR0cmlidXRlTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIHNldEF0dHJpYnV0ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8U2V0QXR0cmlidXRlTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0QXR0cmlidXRlTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IFNldEF0dHJpYnV0ZU1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGl0ZW0uc2V0QXR0cmlidXRlKGV2ZW50Lm5hbWUsIGV2ZW50LnZhbHVlKVxuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7XG4gICAgQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UsXG4gICAgRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSxcbn0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBBZGRFdmVudExpc3RlbmVySGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxBZGRFdmVudExpc3RlbmVyTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBBZGRFdmVudExpc3RlbmVyTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGNvbnN0IGNsZWFudXBUYXNrczogKCgpID0+IHZvaWQpW10gPSBbXTtcblxuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gaW4gZmFjdCB3aGVuIHJ1bm5pbmcgaW4gV2ViQ29tcG9uZW50IHdlIGNhbiB0cmFuc2ZlciB0aGUgb3JpZ2luYWwgZVxuICAgICAgICAgICAgICAgIC8vIGN1cnJlbnRseSB1c2luZyBtYWtlU2VyaWFsaXphYmxlIGZvciBuZXN0ZWQgY2FzZXMsIHRoaW5rIGFib3V0IHRoYXRcbiAgICAgICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgIG1ha2VTZXJpYWxpemFibGUoZSwgZXZlbnQuc2VyaWFsaXphYmxlU2tlbGV0b24pKSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQudHlwZSwgaGFuZGxlcik7XG5cbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQudHlwZSwgaGFuZGxlcik7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY2xlYW51cFRhc2tzLmZvckVhY2godGFzayA9PiB0YXNrKCkpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzXCI7XG5pbXBvcnQge0hvc3RTREt9IGZyb20gXCIuLi8uLi9ob3N0L2hvc3RTREtcIjtcbmltcG9ydCB7Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlcy9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vaG9zdFwiO1xuXG5leHBvcnQgY2xhc3MgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcblxuICAgICAgICBjb25zdCBjcmVhdGVSZWYgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAvL2NvbnN0IGFsbEl0ZW1zID0gc2hhZG93Um9vdFJlZi5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KGBbJHtteW9wQXR0cmlidXRlcy5pZH09JyR7ZXZlbnQucmVmPy5yZWZDb25maWcuc2VsZWN0b3J9J11gKTtcbiAgICAgICAgICAgIGNvbnN0IGFsbEl0ZW1zID0gc2hhZG93Um9vdFJlZi5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KGBbJHtteW9wQXR0cmlidXRlcy5pZH09JyR7ZXZlbnQucmVmQ29uZmlnLnNlbGVjdG9yfSddYCk7XG5cbiAgICAgICAgICAgIGlmIChhbGxJdGVtcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBob3N0U0RLID0gSG9zdFNESy5JbnN0YW5jZSgpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gaG9zdFNESy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09PSBldmVudC5vcHRpb25zLmlkKSE7XG4gICAgICAgICAgICAgICAgaWYgKHJlZkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAvLy8vPj4+PlxuICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnQuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyAgY29uc29sZS5sb2coYGZhaWxlZCB0byBmaW5kICR7ZXZlbnQub3B0aW9ucy5pZH0gaW4gbWVtIHNjb3BlYCwgaG9zdFNESyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vd2UgaGF2ZSB0aGUgcmVmIGNvbXBvbmVudCBpbiBvdXIgSG9zdFNESyAoc2FtZSBtZW1vcnkgd2hlbiB1c2luZyB3ZWJjb21wb25lbnQpXG4gICAgICAgICAgICAgICAgLy8gIHJlZkNvbXBvbmVudC5wYXJlbnQgPSBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAvL2RlbGV0ZSB0aGUgcmVmIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaG9zdFNESy5jb21wb25lbnRzLmluZGV4T2YocmVmQ29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGhvc3RTREsuY29tcG9uZW50cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdjcmVhdGVSZWZDb21wb25lbnQgY2FsbGVkIHJlbW92ZWQgdGVtcCByZWYgY29tcG9uZW50Jyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnY3JlYXRlUmVmQ29tcG9uZW50IGNhbGxlZCB1c2luZyB0ZW1wIHJlZiBjb21wb25lbnQnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudCA9IGF3YWl0IGhvc3RTREsubG9hZENvbXBvbmVudChldmVudC5uZXN0ZWRDb21wb25lbnRDb25maWcsXG4gICAgICAgICAgICAgICAgICAgIGFsbEl0ZW1zLml0ZW0oMCksXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50Lm9wdGlvbnMpXG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBubyBuZWVkIHRoaXMsIHBhc3Mgb3B0aW9ucyBmcm9tIHBhcmVudFxuICAgICAgICAgICAgICAgIC8vaW1wbGVtZW50YXRpb25Db21wb25lbnQuaWQgPSBldmVudC5wcmVkZWZpbmVkSWQ7XG4gICAgICAgICAgICAgICAgLy9yZWZDb21wb25lbnQuaWQgKz0gJy4nO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogbm90IHJlYWxseSBuZWVkZWQgP1xuICAgICAgICAgICAgICAgIC8vIGF3YWl0IGltcGxlbWVudGF0aW9uQ29tcG9uZW50LmluaXRpYXRlZCgpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkUmVmQ29uZmlnOiBhbnlbXSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoaW1wbGVtZW50YXRpb25Db21wb25lbnQucmVmcykuZm9yRWFjaChyZWZOYW1lID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZiA9IGltcGxlbWVudGF0aW9uQ29tcG9uZW50LnJlZnNbcmVmTmFtZV07XG4gICAgICAgICAgICAgICAgICAgIHJlZiA9IHJlZi5fX25vblByb3hpZWQgfHwgcmVmO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICgocmVmIGFzIElNeW9wQ29tcG9uZW50KS5jb21wb25lbnREZWZpbml0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWRSZWZDb25maWcucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnREZWZpbml0aW9uSWQ6IChyZWYgYXMgSU15b3BDb21wb25lbnQpLmNvbXBvbmVudERlZmluaXRpb24uaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIG5lc3RlZFJlZkNvbmZpZykpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciAtIERPTSBlbGVtZW50IG5vdCBmb3VuZCcpXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIFtdLCB0cnVlKSk7XG5cbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNyZWF0ZVJlZigpLnRoZW4oKVxuICAgICAgICAvL3JldHVybmluZyB1bmRlZmluZWQgc28gaXQgd29uJ3QgYWN0IGFzIGEgY2xlYW51cFxuICAgIH1cbn1cbiIsICJpbXBvcnQge0V4ZWN1dGVTY3JpcHRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Um9vdFJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5leHBvcnQgY29uc3QgRXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvciA9IChldmVudDogRXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIHJlcGxpZXI6IChkYXRhOiBhbnkpID0+IHZvaWQsIHJvb3RSZWY6IFJvb3RSZWYpID0+IHtcbiAgICBjb25zdCBfX3NjcmlwdElucHV0cyA9IGV2ZW50LnNjcmlwdElucHV0cyA/IGV2ZW50LnNjcmlwdElucHV0cyA6IHt9XG4gICAgX19zY3JpcHRJbnB1dHMubWFrZVNlcmlhbGl6YWJsZSA9IG1ha2VTZXJpYWxpemFibGU7XG5cbiAgICBfX3NjcmlwdElucHV0cy5zZW5kID0gcmVwbGllcjtcbiAgICBfX3NjcmlwdElucHV0cy5yb290UmVmID0gcm9vdFJlZjtcbiAgICBfX3NjcmlwdElucHV0cy5fX3NjcmlwdElucHV0cyA9IF9fc2NyaXB0SW5wdXRzO1xuXG4gICAgY29uc3QgZHluYW1pY0Z1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKGByZXR1cm4gKCR7ZXZlbnQuc2NyaXB0fSkoLi4uYXJndW1lbnRzKWApO1xuICAgIGNvbnN0IHJldCA9IGR5bmFtaWNGdW5jdGlvbihfX3NjcmlwdElucHV0cyk7XG5cbiAgICAvLyBjb25zdCBkeW5hbWljRnVuY3Rpb24gPSBGdW5jdGlvbignc2VuZCcsICdyb290UmVmJywnX19zY3JpcHRJbnB1dHMnLCAuLi5PYmplY3Qua2V5cyhfX3NjcmlwdElucHV0cyksIGV2ZW50LmNvbnRlbnQgPyBldmVudC5jb250ZW50IDogJycpXG4gICAgLy9jb25zdCByZXQgPSBkeW5hbWljRnVuY3Rpb24ocmVwbGllciwgcm9vdFJlZiwgX19zY3JpcHRJbnB1dHMsIC4uLk9iamVjdC52YWx1ZXMoX19zY3JpcHRJbnB1dHMpKTtcbiAgICByZXBsaWVyKHJldCk7XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRNZXNzYWdlLCBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvcn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHNcIjtcblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVTY3JpcHRIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEV4ZWN1dGVTY3JpcHRNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRXhlY3V0ZVNjcmlwdE1lc3NhZ2VcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEV4ZWN1dGVTY3JpcHRNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcGxpZXIgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgZGF0YSkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIEV4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3IoZXZlbnQsIHJlcGxpZXIsIHNoYWRvd1Jvb3RSZWYpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7RWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSwgRm9ybURhdGFFbnRyeSwgR2V0RWxlbWVudFZhbHVlTWVzc2FnZSwgSW5wdXRFbGVtZW50VmFsdWUsfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0cy50c1wiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuY29uc3QgZ2V0SW5wdXRWYWx1ZSA9IChlbGVtZW50KTogSW5wdXRFbGVtZW50VmFsdWUgPT4ge1xuICAgIGlmICghZWxlbWVudCkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBDaGVjayBpZiBpdCdzIGEgZm9ybVxuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShlbGVtZW50KTtcbiAgICAgICAgY29uc3QgZGF0YU9iamVjdDogSW5wdXRFbGVtZW50VmFsdWUgPSB7XG4gICAgICAgICAgICBmb3JtRGF0YToge30sXG4gICAgICAgICAgICB1bm1hcHBlZERhdGE6IFtdXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gTWFudWFsbHkgYWRkIGVsZW1lbnRzIHdpdGhvdXQgbmFtZXNcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0LCBzZWxlY3QsIHRleHRhcmVhJyk7XG4gICAgICAgIGxldCBhdXRvTmFtZUluZGV4ZXIgPSAtMTtcblxuICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50LnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG15b3BJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKG15b3BBdHRyaWJ1dGVzLmlkKTtcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ25hbWUnKTtcblxuICAgICAgICAgICAgICAgIC8vIGBfJHsoKythdXRvTmFtZUluZGV4ZXIpfWBcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVEYXRhOiBGb3JtRGF0YUVudHJ5ID0ge1xuICAgICAgICAgICAgICAgICAgICBpZDogZWxlbWVudC5pZCxcbiAgICAgICAgICAgICAgICAgICAgbmFtZToga2V5LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZ2V0SW5wdXRWYWx1ZShlbGVtZW50KSxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGVsZW1lbnQucmVxdWlyZWQsXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkaXR5OiBtYWtlU2VyaWFsaXphYmxlKGVsZW1lbnQudmFsaWRpdHksIHRydWUpLFxuICAgICAgICAgICAgICAgICAgICBteW9wSWQsXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGlmICgha2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSA9IG5vZGVEYXRhXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkYXRhT2JqZWN0O1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBjaGVja2JveCBvciByYWRpbyBidXR0b25cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsZW1lbnQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5jaGVja2VkID8gZWxlbWVudC52YWx1ZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGlucHV0IGFuZCB0ZXh0YXJlYSBlbGVtZW50c1xuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdJTlBVVCcgfHwgZWxlbWVudC50YWdOYW1lID09PSAnVEVYVEFSRUEnKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzZWxlY3QgZWxlbWVudHMgKGRyb3Bkb3ducylcbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnU0VMRUNUJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZWRpdGFibGUgZGl2cyAoY29udGVudEVkaXRhYmxlKVxuICAgIGlmIChlbGVtZW50LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmlubmVyVGV4dCB8fCBlbGVtZW50LnRleHRDb250ZW50O1xuICAgIH1cblxuICAgIC8vIElmIGl0J3MgYW4gdW5zdXBwb3J0ZWQgZWxlbWVudCB0eXBlXG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRFbGVtZW50VmFsdWVIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkdldEVsZW1lbnRWYWx1ZU1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBHZXRFbGVtZW50VmFsdWVNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlKGdldElucHV0VmFsdWUoaXRlbSkpLCBldmVudCk7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXRJbm5lckh0bWx9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtNeW9wRWxlbWVudE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRJbm5lckh0bWxIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPFNldElubmVySHRtbD4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0SW5uZXJIdG1sO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogTXlvcEVsZW1lbnRNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtLmlubmVySFRNTCA9IGV2ZW50LmNvbnRlbnQ7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKiBUaGUgV2ViY29tcG9uZW50IFNESyBpcyB0YWlsb3JlZCBmb3IgdXNpbmcgTXlvcCBjb21wb25lbnRzIHBhY2thZ2VkIGFzIHNlcGFyYXRlIGJ1bmRsZXMgYW5kIGV4cG9zZWQgYXMgd2ViIGNvbXBvbmVudHMuPGJyLz5cbiAqIERldmVsb3BlcnMgaW1wb3J0aW5nIHRoaXMgU0RLIGNhbiBsZXZlcmFnZSBBUElzIGFuZCB1dGlsaXRpZXMgc3BlY2lmaWNhbGx5IGNyYWZ0ZWQgdG8gc3VwcG9ydCB0aGUgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgYW5kIGNvbW11bmljYXRpb24gcGF0dGVybnMgcmVxdWlyZWQgZm9yIHdlYiBjb21wb25lbnRzIHdpdGhpbiB0aGUgTXlvcCBhcmNoaXRlY3R1cmUuPGJyLz5cbiAqIFRoaXMgU0RLIHByb21vdGVzIHJldXNhYmlsaXR5IGFuZCBlbmNhcHN1bGF0aW9uLCBlbmFibGluZyBkZXZlbG9wZXJzIHRvIGJ1aWxkIG1vZHVsYXIsIHNlbGYtY29udGFpbmVkIGNvbXBvbmVudHMgdGhhdCBjYW4gYmUgc2VhbWxlc3NseSBpbnRlZ3JhdGVkIGludG8gdGhlIGhvc3QgYXBwbGljYXRpb24ncyBET00gc3RydWN0dXJlLlxuICpcbiAqXG4gKiBPbmNlIGxvYWRlZCB0aGUgYFJvb3RTREtgLCB5b3UgY2FuIGxvYWQgdGhlIGBJZnJhbWVTREtgXG4gKiBgYGBqc1xuICogY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRXZWJjb21wb25lbnRNb2R1bGUoKSk7XG4gKiBgYGBcbiAqIG9yXG4gKiBgYGB0c1xuICogaW1wb3J0IHtnZXRXZWJjb21wb25lbnRNb2R1bGV9IGZyb20gJ0BteW9wL3Nkayc7XG4gKiBjb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IChhd2FpdCBnZXRXZWJjb21wb25lbnRNb2R1bGUoKSk7XG4gKiBgYGBcbiAqIG9yXG4gKiBgYGB0c1xuICogaW1wb3J0IHtXZWJDb21wb25lbnRTREt9IGZyb20gJ0BteW9wL3Nkay93ZWJjb21wb25lbnQnO1xuICogYGBgXG4gKlxuICovXG5pbXBvcnQge0Jhc2VNeW9wU0RLfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcFdlYmNvbXBvbmVudENvbnN0c30gZnJvbSBcIi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtCaW5kT25DbGlja0hhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9iaW5kT25DbGlja0hhbmRsZXJcIjtcbmltcG9ydCB7Q2hhbmdlVGV4dEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlclwiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9EZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge2RlZmluZUR5bmFtaWNJbXBvcnR9IGZyb20gXCIuLi9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnRcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLFxuICAgIEluaXRNZXNzYWdlLFxuICAgIEluaXRSZXF1ZXN0LFxuICAgIE1lc3NhZ2VEaXJlY3Rpb24sXG4gICAgTXlvcEJpbmRNZXNzYWdlLFxuICAgIE15b3BCaW5kUmVwbGF5TWVzc2FnZVxufSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7c2V0QXR0cmlidXRlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL3NldEF0dHJpYnV0ZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7QWRkRXZlbnRMaXN0ZW5lckhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9hZGRFdmVudExpc3RlbmVySGFuZGxlci50c1wiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHNcIjtcbmltcG9ydCB7R2V0RWxlbWVudFZhbHVlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2V0SW5uZXJIdG1sSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL3NldElubmVySHRtbEhhbmRsZXIudHNcIjtcblxuLyoqXG4gKiBUaGUgV2ViY29tcG9uZW50IFNESyBpcyB0YWlsb3JlZCBmb3IgdXNpbmcgTXlvcCBjb21wb25lbnRzIHBhY2thZ2VkIGFzIHNlcGFyYXRlIGJ1bmRsZXMgYW5kIGV4cG9zZWQgYXMgd2ViIGNvbXBvbmVudHMuPGJyLz5cbiAqIERldmVsb3BlcnMgaW1wb3J0aW5nIHRoaXMgU0RLIGNhbiBsZXZlcmFnZSBBUElzIGFuZCB1dGlsaXRpZXMgc3BlY2lmaWNhbGx5IGNyYWZ0ZWQgdG8gc3VwcG9ydCB0aGUgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgYW5kIGNvbW11bmljYXRpb24gcGF0dGVybnMgcmVxdWlyZWQgZm9yIHdlYiBjb21wb25lbnRzIHdpdGhpbiB0aGUgTXlvcCBhcmNoaXRlY3R1cmUuPGJyLz5cbiAqIFRoaXMgU0RLIHByb21vdGVzIHJldXNhYmlsaXR5IGFuZCBlbmNhcHN1bGF0aW9uLCBlbmFibGluZyBkZXZlbG9wZXJzIHRvIGJ1aWxkIG1vZHVsYXIsIHNlbGYtY29udGFpbmVkIGNvbXBvbmVudHMgdGhhdCBjYW4gYmUgc2VhbWxlc3NseSBpbnRlZ3JhdGVkIGludG8gdGhlIGhvc3QgYXBwbGljYXRpb24ncyBET00gc3RydWN0dXJlLlxuICpcbiAqXG4gKiBPbmNlIGxvYWRlZCB0aGUgYFJvb3QgU0RLYCwgeW91IGNhbiBsb2FkIHRoZSBgSWZyYW1lU0RLYFxuICogYGBganNcbiAqIGNvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKiBvclxuICogYGBgdHNcbiAqIGltcG9ydCB7Z2V0V2ViY29tcG9uZW50TW9kdWxlfSBmcm9tICdAbXlvcC9zZGsnO1xuICogY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSAoYXdhaXQgZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKlxuICovXG5leHBvcnQgY2xhc3MgV2ViQ29tcG9uZW50U0RLIGV4dGVuZHMgQmFzZU15b3BTREsge1xuXG4gICAgYWx3YXlzUGFzc0VudmVsb3Blc1RvSG9zdCA9IHRydWU7XG5cbiAgICAvL3doZW4gbmV3IHdlYiBjb21wb25lbnQgY3JlYXRlZC5cbiAgICBjb25uZWN0ZWRDYWxsYmFjayA9IChjb250YWluZXI6IEhUTUxFbGVtZW50LCBzaGFkb3c6IFNoYWRvd1Jvb3QpID0+IHtcbiAgICAgICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIobXlvcFdlYmNvbXBvbmVudENvbnN0cy53ZWJjb21wb25lbnRfbWVzc2FnZV9rZXksIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICBjb25zdCBldmVudENvbnRlbnQgPSBlLmRhdGEgPyBlLmRhdGEgOiBlLmRldGFpbDtcbiAgICAgICAgICAgIGlmICghZXZlbnRDb250ZW50IHx8ICFldmVudENvbnRlbnQubXlvcCkge1xuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncmVjdmllZCB3ZWJjb21wb25lbnRfbWVzc2FnZSB3aXRoIHdyb25nIHR5cGUnKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXZlbnRDb250ZW50IGFzIEJhc2VNeW9wTWVzc2FnZTtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHNlbmQgY29udGFpbmVyIC8gY29tcG9lbm50IGlkZW50aWZpZXIgZm9yIG11bHRpbCBjb21wb25lbnRzIHN1cHBvcnRcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUluY29tZU1lc3NhZ2VzKGUpXG5cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3Q29tcG9uZW50SWQgPSAobWVzc2FnZSBhcyBJbml0TWVzc2FnZSkuY29udGVudC5pZDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzW25ld0NvbXBvbmVudElkXS5jb250ZXh0ID0gbmV3IFNoYWRvd1Jvb3RSZWYoY29udGFpbmVyLCBzaGFkb3cpXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5zdXBwb3J0ZWRIYW5kbGVycy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgaGFuZGxlci5jb250ZXh0ID0gdGhpcy5zaGFkb3dSb290cztcbiAgICAgICAgICAgICAgICAgICAgLy8gfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vVE9ETyA6IGZpeCB0aGF0IGhhY2suIHJhY2UgY29uZGl0aW9uIHdpdGggaG9zdC5sb2FkIHdoZW4gbW9kdWxlIGxvYWRlZFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgSW5pdFJlcXVlc3QoKSlcbiAgICAgICAgfSwgMSlcbiAgICB9XG5cbiAgICBtZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHtcbiAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLnVwXG4gICAgICAgIC8vbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgPSByZXBsYXlUbz8uaGFuZGxlclVuaXF1ZUlkO1xuXG4gICAgICAgIGlmICghbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgJiYgcmVwbGF5VG8/LmhhbmRsZXJVbmlxdWVJZClcbiAgICAgICAgICAgIG1lc3NhZ2UucmVwbGF5VG9IYW5kbGVyID0gcmVwbGF5VG8uaGFuZGxlclVuaXF1ZUlkXG5cbiAgICAgICAgd2luZG93Lm15b3AuaG9zdFNESy5zZW5kKG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgc3VwcG9ydGVkSGFuZGxlcnM6IEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcltdID0gW1xuICAgICAgICBuZXcgQ2hhbmdlVGV4dEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgU2V0SW5uZXJIdG1sSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBCaW5kT25DbGlja0hhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBzZXRBdHRyaWJ1dGVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEV4ZWN1dGVTY3JpcHRIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEdldEVsZW1lbnRWYWx1ZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICAvL1xuICAgICAgICBuZXcgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpXG4gICAgXTtcblxuICAgIHB1YmxpYyBpbml0ID0gKCkgPT4ge1xuICAgICAgICAvL3RoaXMubXlDb21wb25lbnRJZFxuICAgICAgICAvL3RoaXMuaGFuZGxlSW5jb21lTWVzc2FnZXNcbiAgICB9XG59XG5cbmRlZmluZUR5bmFtaWNJbXBvcnQoJ1dlYkNvbXBvbmVudFNESycsIFdlYkNvbXBvbmVudFNESyk7XG4iLCAiaW1wb3J0IHtNeW9wV2ViQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wV2ViY29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTG9hZGVyfSBmcm9tIFwiLi9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi8uLi91dGlscy91dGlscy50c1wiO1xuaW1wb3J0IHtcbiAgICBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJSFRNTExvYWRlckNvbmZpZyxcbiAgICBJU2tpbkNvbmZpZywgU2hhZG93Um9vdE1vZGVUeXBlLFxuICAgIFNraW5Mb2FkZXJzXG59IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7V2ViQ29tcG9uZW50U0RLfSBmcm9tIFwiLi4vLi4vd2ViY29tcG9uZW50XCI7XG5pbXBvcnQge015b3BJZnJhbWVDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BJZnJhbWVDb21wb25lbnQudHNcIjtcbi8vaW1wb3J0IHtnZXRXZWJjb21wb25lbnRNb2R1bGV9IGZyb20gXCIuLi8uLi9TREsudHNcIjtcblxuY29uc3Qgc2Vlbjogc3RyaW5nW10gPSBbXTtcbmxldCBzZGs7XG5jb25zdCBnZXRJbml0aWF0ZWRTZGsgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFzZGspIHtcbiAgICAgICAgLy9jb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IGF3YWl0IGdldFdlYmNvbXBvbmVudE1vZHVsZSgpXG4gICAgICAgIHNkayA9IG5ldyBXZWJDb21wb25lbnRTREsoKTtcbiAgICAgICAgc2RrLmluaXQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHNkaztcbn1cblxuZnVuY3Rpb24gY3JlYXRlSFRNTEVsZW1lbnRDb25zdHJ1Y3RvcihodG1sU3RyaW5nOiBzdHJpbmcsIFNoYWRvd1Jvb3RNb2RlPzoga2V5b2YgdHlwZW9mIFNoYWRvd1Jvb3RNb2RlVHlwZSk6IG5ldyAoKSA9PiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuXG4gICAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgICAgICAgY29uc3QgbW9kZSA9IFNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUub3BlbiA/ICdvcGVuJyA6ICdjbG9zZWQnO1xuICAgICAgICAgICAgY29uc3Qgc2hhZG93ID0gdGhpcy5hdHRhY2hTaGFkb3coe21vZGV9KTtcbiAgICAgICAgICAgIGdldEluaXRpYXRlZFNkaygpLnRoZW4oKHNkaykgPT4ge1xuICAgICAgICAgICAgICAgIHNkay5jb25uZWN0ZWRDYWxsYmFjayh0aGlzLCBzaGFkb3cpO1xuICAgICAgICAgICAgICAgIHNoYWRvdy5pbm5lckhUTUwgPSBodG1sU3RyaW5nXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfTtcbn1cblxuY29uc3QgY3JlYXRlQ3VzdG9tV2ViQ29tcG9uZW50ID0gKGNvbXBvbmVudE5hbWU6IHN0cmluZywgaHRtbDogc3RyaW5nLCBTaGFkb3dSb290TW9kZT86IGtleW9mIHR5cGVvZiBTaGFkb3dSb290TW9kZVR5cGUpID0+IHtcbiAgICBjdXN0b21FbGVtZW50cy5kZWZpbmUoY29tcG9uZW50TmFtZSwgY3JlYXRlSFRNTEVsZW1lbnRDb25zdHJ1Y3RvcihodG1sLCBTaGFkb3dSb290TW9kZSkpO1xuICAgIGNvbnNvbGUubG9nKGBkZWZpbmUoJyR7Y29tcG9uZW50TmFtZX0nKSB3YXMgY2FsbGVkLCB3ZWIgY29tcG9uZW50IHJlYWR5IHRvIHVzZWApO1xufVxuXG5jb25zdCB0b1dlYkNvbXBvbmVudE5hbWUgPSAoc3RyKSA9PiB7XG4gICAgcmV0dXJuIHN0clxuICAgICAgICAucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgJyQxLSQyJykgLy8gQWRkIGh5cGhlbiBiZWZvcmUgdXBwZXJjYXNlIGxldHRlcnNcbiAgICAgICAgLnJlcGxhY2UoLyhcXGQrKS9nLCAnLSQxJykgLy8gQWRkIGh5cGhlbiBiZWZvcmUgZGlnaXRzXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpOyAvLyBDb252ZXJ0IHRvIGxvd2VyY2FzZVxufVxuXG5jb25zdCB0b0N1c3RvbUVsZW1lbnROYW1lID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgIG5hbWUgPSB0b1dlYkNvbXBvbmVudE5hbWUobmFtZSk7XG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZSgvXy9nLCAnLScpO1xufVxuXG5sZXQgcGFyc2VyOiBET01QYXJzZXI7IC8vID0gbmV3IERPTVBhcnNlcigpO1xuXG5leHBvcnQgY2xhc3MgSFRNTENvbXBvbmVudExvYWRlciBleHRlbmRzIEJhc2VNeW9wTG9hZGVyIHtcblxuICAgIHR5cGUgPSBTa2luTG9hZGVycy5IVE1MTG9hZGVyXG5cbiAgICBsb2FkID0gYXN5bmMgKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IHtcblxuICAgICAgICBjb25zdCBsb2FkZXJDb25maWcgPSAoc2tpbi5sb2FkZXIgYXMgSUhUTUxMb2FkZXJDb25maWcpO1xuICAgICAgICBsZXQgZG9tSWQgPSBgbXlvcC1jb21wLSR7dXVpZHY0KCl9YFxuICAgICAgICBsZXQgZWxlbWVudDtcblxuICAgICAgICBpZiAobG9hZGVyQ29uZmlnLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubG9jYWxGcmFtZSkge1xuICAgICAgICAgICAgY29uc3QgdW5pcUlkID0gdXVpZHY0KCk7XG4gICAgICAgICAgICBjb25zdCBkb21JZCA9IGBteW9wLWNvbXAtJHt1bmlxSWR9YFxuXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnbmVlZHMgdG8gY3JlYXRlIG5ldyBJZnJhbWUuLi4nLCBkb21JZCwgdHlwZWRMb2FkZXJDb25maWcudXJsLCBjb250YWluZXIpO1xuICAgICAgICAgICAgbGV0IElmcmFtZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uaGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgSWZyYW1lRWxlbWVudCwgb3B0aW9ucykgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LmlkID0gZG9tSWQ7XG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBgXG4gICAgICAgICAgICAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgICAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgICAgICAgICAgICAgb3BhY2l0eTogJHtvcHRpb25zPy5oaWRkZW4gPyAnMCcgOiAnMSd9O1xuICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJHtvcHRpb25zPy5oaWRkZW4gPyAnYWJzb2x1dGUnIDogJ3N0YXRpYyd9O1xuICAgICAgICAgICAgICAgICAgIHBvaW50ZXItZXZlbnRzOiAke29wdGlvbnM/LmhpZGRlbiA/ICdub25lJyA6ICdhbGwnfTtcbiAgICAgICAgICAgICAgIGApO1xuICAgICAgICAgICAgLy8gIGhlaWdodDogJHt0eXBlZExvYWRlckNvbmZpZy5hdXRvSGVpZ2h0IHx8ICF0eXBlZExvYWRlckNvbmZpZy5oZWlnaHQgPyAnJyA6IHR5cGVkTG9hZGVyQ29uZmlnLmhlaWdodH07XG5cbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChJZnJhbWVFbGVtZW50KTtcblxuICAgICAgICAgICAgLy8gV3JpdGUgY29udGVudCBpbnRvIHRoZSBpZnJhbWVcbiAgICAgICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgZG9jID0gSWZyYW1lRWxlbWVudC5jb250ZW50RG9jdW1lbnQgfHwgSWZyYW1lRWxlbWVudC5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICAgICAgICAgICAgZG9jLm9wZW4oKTtcblxuXG4gICAgICAgICAgICBsZXQgSFRNTDJSZW5kZXIgPSBsb2FkZXJDb25maWcuSFRNTDtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/Ll9pbnNwZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgLy9pbmplY3QgaW5zcGVjdGlvbiBzY3JpcHQgZm9yIHByb3BzIGRldGVjdGlvblxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBfZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhsb2FkZXJDb25maWcuSFRNTCwgJ3RleHQvaHRtbCcpO1xuXG4gICAgICAgICAgICAgICAgLy8gVE9ETyA6IHBhcnQgb2YgQUkgY29tcG9uZW50cywgdGhpbmsgYWJvdXQgdGhhdCwgZG9jdW1lbnQgaXQuXG4gICAgICAgICAgICAgICAgY29uc3QgbXlvcF9wcmV2aWV3X3NjcmlwdCA9IF9kb2MuZ2V0RWxlbWVudEJ5SWQoJ215b3BfcHJldmlldycpO1xuICAgICAgICAgICAgICAgIG15b3BfcHJldmlld19zY3JpcHQ/LnJlbW92ZUF0dHJpYnV0ZSgndHlwZScpO1xuXG4gICAgICAgICAgICAgICAgLy8gUGFyc2UgdGhlIGluamVjdGVkIEhUTUwgc3RyaW5nIGludG8gYSBub2RlXG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcCA9IF9kb2MuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCk7XG4gICAgICAgICAgICAgICAgdGVtcC5ib2R5LmlubmVySFRNTCA9IGA8c2NyaXB0PlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmVmb3JlS2V5c1dpbmRvdyA9IG5ldyBTZXQoT2JqZWN0LmtleXMod2luZG93KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcFN0YXRlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZUtleXNXaW5kb3csXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmA7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gdGVtcC5ib2R5LmZpcnN0Q2hpbGQ7XG5cbiAgICAgICAgICAgICAgICBpZiAobm9kZSAmJiBfZG9jLmhlYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgX2RvYy5oZWFkLmluc2VydEJlZm9yZShfZG9jLmltcG9ydE5vZGUobm9kZSwgdHJ1ZSksIF9kb2MuaGVhZC5maXJzdENoaWxkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBIVE1MMlJlbmRlciA9IF9kb2MuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIGRlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICAgICAgLy8gY29uc3QgX2RvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcobG9hZGVyQ29uZmlnLkhUTUwsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgICAgIC8vIGNvbnN0IHggPSBfZG9jLmdldEVsZW1lbnRCeUlkKCdteW9wX3ByZXZpZXcnKTtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBpZih4KXtcbiAgICAgICAgICAgIC8vICAgICB4LnJlbW92ZSgpO1xuICAgICAgICAgICAgLy8gICAgIEhUTUwyUmVuZGVyID0gX2RvYy5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coeCk7XG4gICAgICAgICAgICAvLyBkZWJ1Z2dlcjtcblxuXG4gICAgICAgICAgICBkb2Mud3JpdGVsbihIVE1MMlJlbmRlcik7XG5cbiAgICAgICAgICAgIC8vIHdpbmRvdy5fX2ZlZGVyYXRpb25fXyA9XG4gICAgICAgICAgICAvLyAgICAgeyAuLi53aW5kb3cuX19mZWRlcmF0aW9uX18sXG4gICAgICAgICAgICAvLyAgICAgICAgIC8vVE9ETyA6IGdldCBmcm9tIEVOViBhdCBidWlsZCB0aW1lLFxuICAgICAgICAgICAgLy8gICAgICAgICAvLyBpbmplY3QgdmFsdWUgdG8gbW9kdWxlIGF0IGJ1aWxkIHRpbWVcbiAgICAgICAgICAgIC8vICAgICAgICAgLy8gdG9kYXkgd2UgZG9pbmcgc28ganVzdCBmb3IgdGhlIENKUyB2ZXJzaW9uXG4gICAgICAgICAgICAvLyAgICAgICAgIF9fcHVibGljX3BhdGhfXyA6J2h0dHBzOi8vY2RuLm15b3AuZGV2L3Nkay9uZXh0J1xuICAgICAgICAgICAgLy8gICAgICAgICAsLi4uJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgd2luZG93Ll9fZmVkZXJhdGlvbl9fKVxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vICAgICB9O1xuXG4gICAgICAgICAgICBkb2Mud3JpdGVsbihgPHNjcmlwdCBzcmM9XCIke3dpbmRvdy5teW9wLl9fUk9PVF9TREtfUFVCTElDX1VSTF9ffVwiPjwvc2NyaXB0PlxuICAgICAgICAgICAgICAgICAgICA8c2NyaXB0PlxuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgd2luZG93Ll9fZmVkZXJhdGlvbl9fLl9fcHVibGljX3BhdGhfXyA9ICB3aW5kb3cuX19mZWRlcmF0aW9uX18uX19wdWJsaWNfcGF0aF9fO1xuICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgY29uc3QgX19teW9wX2luaXQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7SWZyYW1lU0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldElmcmFtZU1vZHVsZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNkayA9IG5ldyBJZnJhbWVTREsoKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2RrLmluaXQoKTtcbiAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgIF9fbXlvcF9pbml0KCkudGhlbigpO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgPC9zY3JpcHQ+YCk7XG5cbiAgICAgICAgICAgIGRvYy5jbG9zZSgpO1xuXG4gICAgICAgICAgICAvLyBUT0RPIDogY29udHJvbCBmcm9tIGRhc2hib2FyZFxuICAgICAgICAgICAgLy8gIChza2luLmxvYWRlciBhcyBJSWZyYW1lTG9hZGVyQ29uZmlnKS5hdXRvSGVpZ2h0ID0gdHJ1ZTtcblxuICAgICAgICAgICAgY29uc3QgY29tcCA9IG5ldyBNeW9wSWZyYW1lQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGNvbnRhaW5lciwgSWZyYW1lRWxlbWVudCwgb3B0aW9ucyk7XG5cbiAgICAgICAgICAgIGlmIChsb2FkZXJDb25maWcuYXV0b0hlaWdodCkge1xuICAgICAgICAgICAgICAgIElmcmFtZUVsZW1lbnQub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb21wLm9ic2VydmVTaXplQmFzZWRPbkRvY3VtZW50RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAvLyBjb21wLnByb3BzLl9nbG9iYWwgPSBjb21wLmVsZW1lbnQuY29udGVudFdpbmRvdztcbiAgICAgICAgICAgIHJldHVybiBjb21wO1xuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobG9hZGVyQ29uZmlnLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubm9uZSkge1xuICAgICAgICAgICAgLy8gcGFyc2VyID0gcGFyc2VyID8gcGFyc2VyIDogbmV3IERPTVBhcnNlcigpO1xuICAgICAgICAgICAgLy8gY29uc3QgZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhsb2FkZXJDb25maWcuSFRNTCwgJ3RleHQvaHRtbCcpO1xuICAgICAgICAgICAgLy8gZWxlbWVudCA9IGRvYy5ib2R5LmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAvL2VsZW1lbnQuc2V0QXR0cmlidXRlKCdpZCcsIGRvbUlkKTtcblxuICAgICAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICAgICAgICAgICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gbG9hZGVyQ29uZmlnLkhUTUw7Ly8udHJpbSgpO1xuICAgICAgICAgICAgZWxlbWVudCA9IHRlbXBsYXRlLmNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cbiAgICAgICAgICAgIC8vICAgY29uc3QgZmlyc3RFbGVtZW50ID0gdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgICAgIC8vICAgY29uc3QgeiA9IGZpcnN0RWxlbWVudCA/IGZpcnN0RWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgOiBudWxsO1xuICAgICAgICAgICAgLy8gICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vICAgY29uc29sZS5sb2codGVtcGxhdGUsIGZpcnN0RWxlbWVudCwgeilcbiAgICAgICAgICAgIC8vICAgZWxlbWVudCA9IGZpcnN0RWxlbWVudFxuXG4gICAgICAgICAgICAvLyBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0Ym9keScpO1xuICAgICAgICAgICAgLy8gZGVidWdnZXI7XG4gICAgICAgICAgICAvLyBjb250YWluZXIuaW5uZXJIVE1MID0gbG9hZGVyQ29uZmlnLkhUTUw7XG4gICAgICAgICAgICAvLyBlbGVtZW50ID0gY29udGFpbmVyLmZpcnN0RWxlbWVudENoaWxkO1xuXG4gICAgICAgICAgICBnZXRJbml0aWF0ZWRTZGsoKS50aGVuKChzZGspID0+IHtcbiAgICAgICAgICAgICAgICBzZGsuY29ubmVjdGVkQ2FsbGJhY2soZWxlbWVudCwgZWxlbWVudCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY3VzdG9tRWxlbWVudE5hbWUgPSB0b0N1c3RvbUVsZW1lbnROYW1lKGNvbXBvbmVudERlZmluaXRpb24ubmFtZSArIHNraW4uaWQpO1xuXG4gICAgICAgICAgICAvL1RPRE8gOiBzdXBwb3J0IHJlZGVmaW5lICFcbiAgICAgICAgICAgIGlmICghc2Vlbi5pbmNsdWRlcyhjdXN0b21FbGVtZW50TmFtZSkpIHtcbiAgICAgICAgICAgICAgICBjcmVhdGVDdXN0b21XZWJDb21wb25lbnQoY3VzdG9tRWxlbWVudE5hbWUsIGxvYWRlckNvbmZpZy5IVE1MLCBsb2FkZXJDb25maWcuc2hhZG93Um9vdE1vZGUpO1xuICAgICAgICAgICAgICAgIHNlZW4ucHVzaChjdXN0b21FbGVtZW50TmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChjdXN0b21FbGVtZW50TmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSlcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAvL2VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICBlbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgKGNvbnRhaW5lci5pZC5zdGFydHNXaXRoKCdteW9wLWNvbXAtJykpIHtcbiAgICAgICAgLy8gICAgIC8vIGluIHBsYWNlIHJlcGxhY2VtZW50XG4gICAgICAgIC8vICAgICBjb250YWluZXIucmVwbGFjZVdpdGgoZWxlbWVudCk7XG4gICAgICAgIC8vICAgICAvL2NvbnRhaW5lciA9IGVsZW1lbnQucGFyZW50RWxlbWVudCE7XG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIC8vIH1cblxuICAgICAgICB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG5cbiAgICAgICAgLy9lbGVtZW50LmlubmVySFRNTCA9IGA8JHtjdXN0b21FbGVtZW50TmFtZX0gLz5gO1xuICAgICAgICByZXR1cm4gbmV3IE15b3BXZWJDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBlbGVtZW50LCBvcHRpb25zKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtkZWNvbXByZXNzVVVJRHN9IGZyb20gXCIuLi91dGlscy91dWlkLnRzXCI7XG5pbXBvcnQge0Nsb3VkUmVwb3NpdG9yeX0gZnJvbSBcIi4uL2hlbHBlcnNcIjtcbmltcG9ydCB7XG4gICAgRXhwZXJpZW5jZVR5cGVzLFxuICAgIElDb21wb25lbnRDb25maWcsIElEZWRpY2F0ZWRTa2luQ29uZmlnLFxuICAgIElTZWdtZW50ZWRTa2luQ29uZmlnLFxuICAgIElTZWdtZW50RXhwZXJpZW5jZSwgSVNraW5JbnN0YW5jZUNvbmZpZyxcbiAgICBTa2luU2VsZWN0b3JUeXBlc1xufSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjb25zdCBjaGVja015b3BPdmVycmlkZSA9IGFzeW5jIChjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcpOiBQcm9taXNlPElDb21wb25lbnRDb25maWcgfCBudWxsPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgLy9UT0RPOiBzdXBwb3J0IGRpc2FibGluZyB0aGUgbWVjaGFuaXNtXG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHVybC5zZWFyY2gpO1xuICAgICAgICBjb25zdCBteW9wT3ZlcnJpZGUgPSBwYXJhbXMuZ2V0KCdteW9wT3ZlcnJpZGUnKTtcbiAgICAgICAgaWYgKG15b3BPdmVycmlkZSkge1xuICAgICAgICAgICAgY29uc3QgW3NvdXJjZSwgLi4udXVpZHNdID0gZGVjb21wcmVzc1VVSURzKG15b3BPdmVycmlkZSk7XG5cbiAgICAgICAgICAgIHN3aXRjaCAoc291cmNlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnY29tcG9uZW50Jzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbY29tcG9uZW50SWQsIHNraW5JZF0gPSB1dWlkcztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50VG9PdmVycmlkZSA9IGF3YWl0IENsb3VkUmVwb3NpdG9yeS5NYWluLmZldGNoQ29tcG9uZW50KGNvbXBvbmVudElkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRvT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvZG86IGNoZWNrIGZldGNoQXV0b0Zsb3cuIExvb2tzIGxpa2Ugb25seSBvbmUgc2tpbiBpcyByZXR1cm5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2tpbiA9IGNvbXBvbmVudFRvT3ZlcnJpZGUudHlwZS5za2lucy5maW5kKHNraW4gPT4gc2tpbi5pZCA9PT0gc2tpbklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChza2luKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9kbzogZm9yIG5vdyBqdXN0IHNldCBza2luIGlkLiBDaGVjayB0aGUgY2xvdWQgaW1wbGVtZW50YXRpb25cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2Uuc2tpblNlbGVjdG9yID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBTa2luU2VsZWN0b3JUeXBlcy5EZWRpY2F0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraW46IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBza2luSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBJU2tpbkluc3RhbmNlQ29uZmlnXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudFRvT3ZlcnJpZGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAvLyAgICBjYXNlICdmbG93Jzoge1xuICAgICAgICAgICAgICAgIGRlZmF1bHQgOiB7XG4gICAgICAgICAgICAgICAgICAgLy8gY29uc3QgW2Zsb3dJZCwgZXhwZXJpbWVudElkXSA9IHV1aWRzO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbZmxvd0lkLCBleHBlcmltZW50SWRdID0gZGVjb21wcmVzc1VVSURzKG15b3BPdmVycmlkZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb3cgPSBhd2FpdCBDbG91ZFJlcG9zaXRvcnkuTWFpbi5mZXRjaEZsb3coZmxvd0lkKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50VG9PdmVycmlkZSA9IGZsb3cuY29tcG9uZW50cy5maW5kKGMgPT4gYy50eXBlLmlkID09PSBjb21wb25lbnRDb25maWcudHlwZS5pZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRUb092ZXJyaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5za2luU2VsZWN0b3IudHlwZSA9PT0gU2tpblNlbGVjdG9yVHlwZXMuU2VnbWVudGVkKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5yZXNvbHZlZEV4cGVyaWVuY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkRXhwZXJpZW5jZSA9IGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2UucmVzb2x2ZWRFeHBlcmllbmNlcy5maW5kKGUgPT4gZS5pZCA9PT0gZXhwZXJpbWVudElkKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRFeHBlcmllbmNlPy50eXBlID09PSBFeHBlcmllbmNlVHlwZXMuU2VnbWVudCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFJlc29sdmVkRXhwZXJpZW5jZSA9IHJlc29sdmVkRXhwZXJpZW5jZSBhcyBJU2VnbWVudEV4cGVyaWVuY2VcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRTa2luU2VsZWN0b3IgPSBjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnNraW5TZWxlY3RvciBhcyBJU2VnbWVudGVkU2tpbkNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VnbWVudCA9IHR5cGVkU2tpblNlbGVjdG9yLnNlZ21lbnRzLmZpbmQocyA9PiBzLnNlZ21lbnRJZCA9PT0gdHlwZWRSZXNvbHZlZEV4cGVyaWVuY2Uuc2VnbWVudC5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2Uuc2tpblNlbGVjdG9yID0gc2VnbWVudD8uc2tpblNlbGVjdG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRUb092ZXJyaWRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn0iLCAiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqIFRoZSBIb3N0IFNESyBpcyBkZXNpZ25lZCBmb3IgaW50ZWdyYXRpb24gd2l0aGluIHRoZSBob3N0IGFwcGxpY2F0aW9uIHRoYXQgc2VydmVzIGFzIHRoZSBjb250YWluZXIgZm9yIE15b3AgIGNvbXBvbmVudHMuPGJyLz48YnIvPlxuICogSXQgcHJvdmlkZXMgZXNzZW50aWFsIGZ1bmN0aW9uYWxpdGllcyBhbmQgQVBJcyBmb3IgcmVnaXN0ZXJpbmcsIG1hbmFnaW5nLCBhbmQgY29tbXVuaWNhdGluZyB3aXRoIE15b3AgY29tcG9uZW50cy48YnIvPjxici8+XG4gKiBUaGlzIFNESyBlbmFibGVzIHNlYW1sZXNzIGVtYmVkZGluZyBvZiBpbmRlcGVuZGVudGx5IGRldmVsb3BlZCBjb21wb25lbnRzIGludG8gdGhlIGhvc3QgYXBwbGljYXRpb24sIGVuc3VyaW5nIHNtb290aCBpbnRlcm9wZXJhYmlsaXR5IGFuZCBjb25zaXN0ZW50IHVzZXIgZXhwZXJpZW5jZSBhY3Jvc3MgdmFyaW91cyBNeW9wIGNvbXBvbmVudCBpbXBsZW1lbnRhdGlvbnMuXG4gKi9cbmltcG9ydCB7ZGVmaW5lRHluYW1pY0ltcG9ydH0gZnJvbSBcIi4uL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydFwiO1xuaW1wb3J0IHtJTXlvcExvYWRlcn0gZnJvbSBcIi4vbG9hZGVycy9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50cy9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSxcbiAgICBFbnZlbG9wZWRNZXNzYWdlLCBFeGVjdXRlQ29tcG9uZW50TWV0aG9kLFxuICAgIEluaXRNZXNzYWdlLFxuICAgIEluaXRSZXNwb25zZSwgTWVzc2FnZURpcmVjdGlvbiwgUmVmXG59IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtNeW9wSWZyYW1lTG9hZGVyfSBmcm9tIFwiLi9sb2FkZXJzL2lmcmFtZUxvYWRlclwiO1xuaW1wb3J0IHtXZWJjb21wb25lbnRMb2FkZXJ9IGZyb20gXCIuL2xvYWRlcnMvd2ViY29tcG9uZW50TG9hZGVyXCI7XG5pbXBvcnQgdHlwZSB7SWZyYW1lU0RLfSBmcm9tIFwiLi4vSWZyYW1lXCI7XG5pbXBvcnQge2Nvbm5lY3RQcm9wcywgY29ubmVjdFJlZnMsIGNyZWF0ZVJlZkNvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50Q29yZVwiO1xuaW1wb3J0IHtcbiAgICBFeHBlcmllbmNlVHlwZXMsXG4gICAgSUNvbXBvbmVudENvbmZpZyxcbiAgICBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJRGVkaWNhdGVkU2tpbkNvbmZpZywgSUV4cGVyaWVuY2UsIElGdW5jdGlvblJlc3VsdHNTZWdtZW50LCBJU2VnbWVudGVkU2tpbkNvbmZpZywgSVNlZ21lbnRFeHBlcmllbmNlLFxuICAgIElTa2luQ29uZmlnLCBJU2tpblNlbGVjdG9yQ29uZmlnLCBTa2luU2VsZWN0b3JUeXBlcyxcblxuXG59IGZyb20gXCIuLi9jb21tb25cIjtcbi8vIEB0cy1pZ25vcmUgaGFuZGxlZCBieSBjdXN0b20gZXNidWlsZCBwbHVnaW5cbmltcG9ydCB2ZXJzaW9uIGZyb20gXCJteW9wLXNkay12ZXJzaW9uXCI7XG5pbXBvcnQge0hUTUxDb21wb25lbnRMb2FkZXJ9IGZyb20gXCIuL2xvYWRlcnMvSFRNTENvbXBvbmVudExvYWRlclwiO1xuaW1wb3J0IHtjaGVja015b3BPdmVycmlkZX0gZnJvbSBcIi4vbXlvcE92ZXJyaWRlLnRzXCI7XG5cbmludGVyZmFjZSBjb21wb25lbnRMb2FkZXJDcmVhdG9yIHtcbiAgICBuZXcobG9hZGVyczogSU15b3BMb2FkZXJbXSk6IGFueTtcbn1cblxuLy8gY29uc3QgZ2V0Q29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IGFzeW5jIChpZDogc3RyaW5nKSA9PiB7XG4vLyAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYGh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9jb21wb25lbnQ/aWQ9JHtpZH1gKTtcbi8vICAgICBjb25zdCBjb21wb25lbnREZWY6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnID0gKGF3YWl0IHJlcy5qc29uKCkpLml0ZW07XG4vLyAgICAgcmV0dXJuIGNvbXBvbmVudERlZlxuLy8gfVxuXG4vL2NvbnN0IF9fUk9PVF9TREtfUFVCTElDX1VSTF9fID0gJ2h0dHBzOi8vZGZkbGsycDFtMTg3di5jbG91ZGZyb250Lm5ldC9teW9wX3Nkay5taW4uanMnXG5jb25zdCBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfXyA9ICdodHRwczovL2Nkbi5teW9wLmRldi9zZGsvbmV4dC9teW9wX3Nkay5taW4uanMnXG5cbi8qKlxuICogVGhlIEhvc3QgU0RLIGlzIGRlc2lnbmVkIGZvciBpbnRlZ3JhdGlvbiB3aXRoaW4gdGhlIGhvc3QgYXBwbGljYXRpb24gdGhhdCBzZXJ2ZXMgYXMgdGhlIGNvbnRhaW5lciBmb3IgTXlvcCAgY29tcG9uZW50cy48YnIvPjxici8+XG4gKiBJdCBwcm92aWRlcyBlc3NlbnRpYWwgZnVuY3Rpb25hbGl0aWVzIGFuZCBBUElzIGZvciByZWdpc3RlcmluZywgbWFuYWdpbmcsIGFuZCBjb21tdW5pY2F0aW5nIHdpdGggTXlvcCBjb21wb25lbnRzLjxici8+PGJyLz5cbiAqIFRoaXMgU0RLIGVuYWJsZXMgc2VhbWxlc3MgZW1iZWRkaW5nIG9mIGluZGVwZW5kZW50bHkgZGV2ZWxvcGVkIGNvbXBvbmVudHMgaW50byB0aGUgaG9zdCBhcHBsaWNhdGlvbiwgZW5zdXJpbmcgc21vb3RoIGludGVyb3BlcmFiaWxpdHkgYW5kIGNvbnNpc3RlbnQgdXNlciBleHBlcmllbmNlIGFjcm9zcyB2YXJpb3VzIE15b3AgY29tcG9uZW50IGltcGxlbWVudGF0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvc3RTREsge1xuICAgIHN0YXRpYyBJbnN0YW5jZSA9ICgpID0+IHdpbmRvdy5teW9wLmhvc3RTREs7XG5cbiAgICBjb21wb25lbnRzMmluaXQ6IElNeW9wQ29tcG9uZW50W10gPSBbXTtcbiAgICBjb21wb25lbnRzOiBJTXlvcENvbXBvbmVudFtdID0gW107XG4gICAgY29tcG9uZW50c0xvYWRlcnM6IElNeW9wTG9hZGVyW10gPSBbXTtcblxuICAgIHB1YmxpYyBpbml0aWF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHB1YmxpYyB2ZXJzaW9uID0gdmVyc2lvbjtcblxuICAgIHR5cGUySW5zdGFuY2VDb3VudDogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAgIHB1YmxpYyBhc3NpZ25JZCA9IChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZykgPT4ge1xuICAgICAgICBpZiAoIXRoaXMudHlwZTJJbnN0YW5jZUNvdW50W2NvbXBvbmVudERlZmluaXRpb24uaWRdKSB7XG4gICAgICAgICAgICB0aGlzLnR5cGUySW5zdGFuY2VDb3VudFtjb21wb25lbnREZWZpbml0aW9uLmlkXSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke2NvbXBvbmVudERlZmluaXRpb24uaWR9XyR7Kyt0aGlzLnR5cGUySW5zdGFuY2VDb3VudFtjb21wb25lbnREZWZpbml0aW9uLmlkXX1gO1xuICAgIH1cblxuICAgIC8vVE9ETyA6IGZpeCB0aGUgaW5zcGVjdCBpbXBsZW1lbnRhdGlvbiBpbnNpZGUgcmVmQ29tcG9uZW50XG4gICAgLy90aGVuIGluc3BlY3RlZCBtYXliZSBjYW4gYmUgZHJvcHBlZFxuICAgIHByaXZhdGUgaW5zcGVjdGVkID0gZmFsc2U7XG4gICAgcHVibGljIGluc3BlY3QgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmluc3BlY3RlZClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICB0aGlzLmluc3BlY3RlZCA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5jb21wb25lbnRzLmZvckVhY2goY29tcG9uZW50ID0+IHtcbiAgICAgICAgICAgIGlmIChjb21wb25lbnQuaW5zcGVjdCkge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbnNwZWN0KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwcml2YXRlIGluY29taW5nTWVzc2FnZUhhbmRsZXIgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudDxCYXNlTXlvcE1lc3NhZ2U+KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ2luY29taW5nTWVzc2FnZUhhbmRsZXIgR09UICcsIGV2ZW50KVxuICAgICAgICAvL1RPRE8gOiAgaWYgKGV2ZW50Lm9yaWdpbiAhPT0gXCJodHRwOi8vZXhhbXBsZS5vcmc6ODA4MFwiKSByZXR1cm47XG4gICAgICAgIGlmIChldmVudC5vcmlnaW4gPT09IGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbikge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnSSBLbm93IHRoYXQgISEhJyk7XG4gICAgICAgICAgICAvLyAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vY29uc29sZS5sb2coXCJldmVudCBvbiBob3N0IHNpZGUgXCIsIGV2ZW50KTtcblxuICAgICAgICBpZiAoZXZlbnQuZGF0YS5teW9wKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuZGF0YS5kaXJlY3Rpb24gIT09IE1lc3NhZ2VEaXJlY3Rpb24udXAgJiYgZXZlbnQuZGF0YS5tZXNzYWdlVHlwZSAhPT0gTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdtZXNzYWdlIGRyb3BwZWQgaW4gaG9zdHNkaywgZGlyZWN0aW9uIHdhcyAnLCBldmVudC5kYXRhLmRpcmVjdGlvbilcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImV2ZW50IG9uIGhvc3Qgc2lkZSBcIiwgZXZlbnQpO1xuXG4gICAgICAgICAgICBjb25zdCBteW9wTWVzc2FnZTogQmFzZU15b3BNZXNzYWdlID0gZXZlbnQuZGF0YTtcblxuICAgICAgICAgICAgaWYgKG15b3BNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW5pdFJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMyaW5pdC5mb3JFYWNoKGNvbXBvbmVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBJbml0TWVzc2FnZShjb21wb25lbnQuaWQpKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG15b3BNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW5pdFJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gY29tcG9uZW50cyAyIGluaXRcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzMmluaXQgPSB0aGlzLmNvbXBvbmVudHMyaW5pdC5maWx0ZXIoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCAhPT0gKG15b3BNZXNzYWdlIGFzIEluaXRSZXNwb25zZSkuY29udGVudC5pZClcblxuICAgICAgICAgICAgICAgIGNvbnN0IGluaXRpYXRlZENvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50cy5maW5kKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgPT09IChteW9wTWVzc2FnZSBhcyBJbml0UmVzcG9uc2UpLmNvbnRlbnQ/LmlkKTtcbiAgICAgICAgICAgICAgICBpbml0aWF0ZWRDb21wb25lbnQ/LnNldEluaXRpYXRlZCgpXG4gICAgICAgICAgICAgICAgLy9pbml0aWF0ZWRDb21wb25lbnQ/LnBhcmVudD8uc2V0SW5pdGlhdGVkKCk7XG4gICAgICAgICAgICAgICAgLy8gVE9ETyA6IGlzIGl0IHRydWUgdG8gbm90IHBhc3MgZnVydGhlciAoIHRvIHRoZSBjb21wb25lbnQgKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG15b3BNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRW52ZWxvcGVkTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZWRNZXNzYWdlID0gbXlvcE1lc3NhZ2UgYXMgRW52ZWxvcGVkTWVzc2FnZVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50cy5maW5kKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgPT09IHR5cGVkTWVzc2FnZS5kZXN0aW5hdGlvbik7XG5cbiAgICAgICAgICAgICAgICBpZiAocmVmQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZE1lc3NhZ2UuZGlyZWN0aW9uID09PSBNZXNzYWdlRGlyZWN0aW9uLmRvd24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZE1lc3NhZ2UubWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gRXhlY3V0ZUNvbXBvbmVudE1ldGhvZC5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50Lm9uTWVzc2FnZVJlY2VpdmVkKHR5cGVkTWVzc2FnZS5tZXNzYWdlKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVkTWVzc2FnZS5tZXNzYWdlLnJvdXRlID0gdHlwZWRNZXNzYWdlLnJvdXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5zZW5kKHR5cGVkTWVzc2FnZS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlubmVyQ29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzLmZpbmQoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCA9PT0gdHlwZWRNZXNzYWdlLm1lc3NhZ2UuZGVzdGluYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5uZXJDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyQ29tcG9uZW50LnNlbmQodHlwZWRNZXNzYWdlLm1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIDogbG9nID9cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgLy9jb21wb25lbnQucmVmcy5ib2R5Lm9uTWVzc2FnZVJlY2VpdmVkKG15b3BNZXNzYWdlLm1lc3NhZ2UpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHMuZmluZChjb21wb25lbnQgPT4gY29tcG9uZW50LmlkID09PSBteW9wTWVzc2FnZS5kZXN0aW5hdGlvbik7XG5cbiAgICAgICAgICAgIGlmICghY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgLy9ubyBpbiBtZW0gY29tcG9uZW50XG4gICAgICAgICAgICAgICAgLy9wYXNzIHRvIHBhcmVudCBIb3N0U0RLIHRvIHRyeSBwcm9jZXNzIHRoZXJlXG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5teW9wLklmcmFtZVNESykge1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcC5JZnJhbWVTREsubWVzc2FnZVRvSG9zdChteW9wTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQub25NZXNzYWdlUmVjZWl2ZWQobXlvcE1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL25vdCBwcm9jZXNzZWQgaW4gb25NZXNzYWdlUmVjZWl2ZWRcbiAgICAgICAgICAgICAgICAgICAgLy9wYXNzIHRvIHBhcmVudCBIb3N0U0RLIHRvIHRyeSBwcm9jZXNzIHRoZXJlXG4gICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cubXlvcC5JZnJhbWVTREspXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcC5JZnJhbWVTREsubWVzc2FnZVRvSG9zdChteW9wTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZXZlbnQuc291cmNlLnBvc3RNZXNzYWdlKFxuICAgICAgICAvLyAgICAgXCJoaSB0aGVyZSB5b3Vyc2VsZiEgIHRoZSBzZWNyZXQgcmVzcG9uc2UgXCIgKyBcImlzOiByaGVlZWVldCFcIixcbiAgICAgICAgLy8gICAgIGV2ZW50Lm9yaWdpbixcbiAgICAgICAgLy8gICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBzeW50aGV0aWNFdmVudCA9IG5ldyBNZXNzYWdlRXZlbnQ8QmFzZU15b3BNZXNzYWdlPignJyxcbiAgICAgICAgICAgIHtkYXRhOiBtZXNzYWdlfVxuICAgICAgICApXG5cbiAgICAgICAgdGhpcy5pbmNvbWluZ01lc3NhZ2VIYW5kbGVyKHN5bnRoZXRpY0V2ZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5pdCA9IChjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9ycz86IGNvbXBvbmVudExvYWRlckNyZWF0b3JbXSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pbml0aWF0ZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaG9zdFNESyBhbHJlYWR5IGluaXRpYXRlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYmFzaWNMb2FkZXJzID0gW1xuICAgICAgICAgICAgbmV3IE15b3BJZnJhbWVMb2FkZXIoKSxcbiAgICAgICAgICAgIG5ldyBXZWJjb21wb25lbnRMb2FkZXIoKSxcbiAgICAgICAgICAgIG5ldyBIVE1MQ29tcG9uZW50TG9hZGVyKClcbiAgICAgICAgXTtcblxuICAgICAgICB0aGlzLmNvbXBvbmVudHNMb2FkZXJzID0gW1xuICAgICAgICAgICAgLi4uYmFzaWNMb2FkZXJzXG4gICAgICAgIF07XG5cbiAgICAgICAgaWYgKGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3JzKSB7XG4gICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgY29uc3QgbG9hZGVyQnlUeXBlOiBSZWNvcmQ8c3RyaW5nLCBJTXlvcExvYWRlcj4gPSB7fTtcblxuICAgICAgICAgICAgY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcnMuZm9yRWFjaChjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9yID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXN0b21Mb2FkZXIgPSBuZXcgY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcih0aGlzLmNvbXBvbmVudHNMb2FkZXJzKTtcbiAgICAgICAgICAgICAgICBsb2FkZXJCeVR5cGVbY3VzdG9tTG9hZGVyLnR5cGVdID0gY3VzdG9tTG9hZGVyO1xuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzTG9hZGVycy5mb3JFYWNoKGxvYWRlciA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFsb2FkZXJCeVR5cGVbbG9hZGVyLnR5cGVdKVxuICAgICAgICAgICAgICAgICAgICBsb2FkZXJCeVR5cGVbbG9hZGVyLnR5cGVdID0gbG9hZGVyO1xuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzTG9hZGVycyA9IE9iamVjdC52YWx1ZXMobG9hZGVyQnlUeXBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluY29tbWluZyBtZXNzYWdlcyBmcm9tIElGcmFtZXNcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICBcIm1lc3NhZ2VcIixcbiAgICAgICAgICAgIHRoaXMuaW5jb21pbmdNZXNzYWdlSGFuZGxlcixcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCdteW9wIGhvc3RTREsgaW5pdGlhdGVkJywgZG9jdW1lbnQubG9jYXRpb24uaHJlZik7XG4gICAgICAgIHRoaXMuaW5pdGlhdGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRTa2luSWRCeVNraW5TZWxlY3RvciA9IGFzeW5jIChza2luU2VsZWN0b3I6IElTa2luU2VsZWN0b3JDb25maWcsIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdID0gW10sIGhvb2tzPzogbG9hZGVySG9va3MpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgICAgICBhc3luYyBmdW5jdGlvbiBhc3luY0ZpbmQ8VD4oXG4gICAgICAgICAgICBhcnJheTogVFtdLFxuICAgICAgICAgICAgcHJlZGljYXRlOiAoaXRlbTogVCkgPT4gUHJvbWlzZTxib29sZWFuPlxuICAgICAgICApOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBhcnJheSkge1xuICAgICAgICAgICAgICAgIGlmIChhd2FpdCBwcmVkaWNhdGUoaXRlbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gUmV0dXJuIHVuZGVmaW5lZCBpZiBubyBtYXRjaCBpcyBmb3VuZFxuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChza2luU2VsZWN0b3IudHlwZSkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY2FzZSBcIkRlZGljYXRlZFNraW5cIiA6IC8vYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgY2FzZSBTa2luU2VsZWN0b3JUeXBlcy5EZWRpY2F0ZWQ6IHtcbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRTa2luSWQgPSAoc2tpblNlbGVjdG9yIGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnKS5za2luPy5pZFxuICAgICAgICAgICAgICAgICAgICB8fCAoc2tpblNlbGVjdG9yIGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnKS5za2lucyFbMF0uaWQ7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRTa2luSWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNraW5TZWxlY3RvclR5cGVzLlNlZ21lbnRlZDoge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkU2tpblNlbGVjdG9yID0gKHNraW5TZWxlY3RvciBhcyBJU2VnbWVudGVkU2tpbkNvbmZpZylcbiAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50ID0gYXdhaXQgYXN5bmNGaW5kKHR5cGVkU2tpblNlbGVjdG9yLnNlZ21lbnRzLCBhc3luYyBzZWdtZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQuc2VnbWVudElkID09PSAnRGVmYXVsdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhwZXJpZW5jZSA9IGV4cGVyaWVuY2VzLmZpbmQoZXhwZXJpZW5jZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhwZXJpZW5jZS50eXBlID09PSBFeHBlcmllbmNlVHlwZXMuU2VnbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXhwZXJpZW5jZSBhcyBJU2VnbWVudEV4cGVyaWVuY2UpLnNlZ21lbnQuaWQgPT09IHNlZ21lbnQuc2VnbWVudElkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghZXhwZXJpZW5jZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZXhwZXJpZW5jZSBub3QgZm91bmRcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZEV4cGVyaWVuY2UgPSBleHBlcmllbmNlIGFzIElTZWdtZW50RXhwZXJpZW5jZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRTZWdtZW50ID0gKHR5cGVkRXhwZXJpZW5jZS5zZWdtZW50IGFzIElGdW5jdGlvblJlc3VsdHNTZWdtZW50KVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRGdW5jdGlvbiA9IChob29rcyA/IGhvb2tzIDoge30pW3R5cGVkU2VnbWVudC5mdW5jdGlvbl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50RnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBzZWdtZW50RnVuY3Rpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBzZWdtZW50SWQ6JHtzZWdtZW50LnNlZ21lbnRJZH0sICR7dHlwZWRTZWdtZW50LmZ1bmN0aW9ufSBmdW5jdGlvbiBub3QgcHJvdmlkZWQgIWApXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2VnbWVudClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFNraW5JZEJ5U2tpblNlbGVjdG9yKHNlZ21lbnQuc2tpblNlbGVjdG9yLCBleHBlcmllbmNlcyk7XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJycgLy9UT0RPXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBydW5Ta2luU2VsZWN0b3IgPSBhc3luYyAoY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBob29rcz86IGxvYWRlckhvb2tzKSA9PiB7XG4gICAgICAgIGNvbnN0IHNraW5JZCA9IGF3YWl0IHRoaXMuX2dldFNraW5JZEJ5U2tpblNlbGVjdG9yKGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5za2luU2VsZWN0b3IsIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5yZXNvbHZlZEV4cGVyaWVuY2VzLCBob29rcyk7XG4gICAgICAgIHJldHVybiBjb21wb25lbnRDb25maWcudHlwZS5za2lucy5maW5kKHNraW4gPT4gc2tpbi5pZCA9PT0gc2tpbklkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZGVySG9va3M/OiBsb2FkZXJIb29rcztcblxuICAgIHB1YmxpYyBsb2FkQ29tcG9uZW50ID0gYXN5bmMgPFQgZXh0ZW5kcyBJTXlvcENvbXBvbmVudCA9IElNeW9wQ29tcG9uZW50Pihjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIGNvbnRhaW5lcj86IEhUTUxFbGVtZW50IHwgUmVmLCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucyk6XG4gICAgICAgIFByb21pc2U8VD4gPT4ge1xuXG4gICAgICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbm8gY29udGFpbmVyIHdhcyBmb3VuZCBmb3IgdGhpcyBjb21wb25lbnQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG92ZXJyaWRkZW5Db25maWcgPSBhd2FpdCBjaGVja015b3BPdmVycmlkZShjb21wb25lbnRDb25maWcpO1xuICAgICAgICBpZiAob3ZlcnJpZGRlbkNvbmZpZykge1xuICAgICAgICAgICAgLy9UT0RPIDogbG9nXG4gICAgICAgICAgICBjb21wb25lbnRDb25maWcgPSBvdmVycmlkZGVuQ29uZmlnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gLy8gQHRzLWlnbm9yZVxuICAgICAgICAvLyBpZiAoIWNvbnRhaW5lci5fX25vblByb3hpZWQpIHtcbiAgICAgICAgLy8gICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IChjb250YWluZXIgYXMgdW5rbm93biBhcyBNeW9wUmVmQ29tcG9uZW50KTtcbiAgICAgICAgLy8gICAgIC8vaWYgd2UgZ290IGxvYWRDb21wb25lbnQgb3ZlciBNeW9wUmVmQ29tcG9uZW50XG4gICAgICAgIC8vICAgICBpZiAocmVmQ29tcG9uZW50LmlkICYmIHJlZkNvbXBvbmVudC5wYXJlbnQpIHtcbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gdGhpcy5sb2FkQ29tcG9uZW50KGNvbXBvbmVudENvbmZpZywgcmVmQ29tcG9uZW50LnJlZiwgb3B0aW9ucyk7XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgICAgLy8gbGV0IHJvb3RDb21wb25lbnQ6IElNeW9wQ29tcG9uZW50ID0gcmVmQ29tcG9uZW50O1xuICAgICAgICAvLyAgICAgICAgIC8vIHdoaWxlKCFyb290Q29tcG9uZW50LmVsZW1lbnQgJiYgcm9vdENvbXBvbmVudC5wYXJlbnQpe1xuICAgICAgICAvLyAgICAgICAgIC8vICAgICByb290Q29tcG9uZW50ID0gcm9vdENvbXBvbmVudC5wYXJlbnRcbiAgICAgICAgLy8gICAgICAgICAvLyB9XG4gICAgICAgIC8vICAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICAgICAvLyByb290Q29tcG9uZW50LmVsZW1lbnRcbiAgICAgICAgLy8gICAgICAgICAvLyAvL3doYXQgbm93ID9cbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGNvbnN0IGhvb2tzID0gey4uLih0aGlzLmxvYWRlckhvb2tzID8/IHt9KSwgLi4uKG9wdGlvbnM/Lmhvb2tzID8/IHt9KX07XG5cbiAgICAgICAgY29uc3QgcmVmID0gY29udGFpbmVyIGFzIFJlZjtcbiAgICAgICAgaWYgKHJlZi5teW9wKSB7XG4gICAgICAgICAgICBpZiAocmVmLmNvbXBvbmVudCkge1xuXG4gICAgICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnID0gey4uLmNvbXBvbmVudENvbmZpZ307XG4gICAgICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnLmluc3RhbmNlID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5jb21wb25lbnRDb25maWcuaW5zdGFuY2VcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRTa2luID0gYXdhaXQgdGhpcy5ydW5Ta2luU2VsZWN0b3IoY29tcG9uZW50Q29uZmlnLCBob29rcykhXG4gICAgICAgICAgICAgICAgaWYgKCFzZWxlY3RlZFNraW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicnVuU2tpblNlbGVjdG9yIGZhaWxlZCB0byBjaG9vc2Ugc2tpbiwgY2hlY2sgdGhlIHByb3ZpZGVkIGNvbmZpZ1wiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucz8uaG9va3M/LmFmdGVyU2tpblNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkU2tpbiA9IGF3YWl0IG9wdGlvbnMuaG9va3MuYWZ0ZXJTa2luU2VsZWN0ZWQoey4uLnNlbGVjdGVkU2tpbn0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5za2luU2VsZWN0b3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFNraW5TZWxlY3RvclR5cGVzLkRlZGljYXRlZCxcbiAgICAgICAgICAgICAgICAgICAgc2tpbjogc2VsZWN0ZWRTa2luXG4gICAgICAgICAgICAgICAgICAgIC8vICBza2luczogW3NlbGVjdGVkU2tpbl1cbiAgICAgICAgICAgICAgICB9IGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnXG5cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gey4uLm9wdGlvbnN9XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zLmhvb2tzXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gYXdhaXQgY3JlYXRlUmVmQ29tcG9uZW50PFQ+KHJlZiwgY29tcG9uZW50Q29uZmlnLCB0aGlzLmNvbXBvbmVudHMsIG9wdGlvbnMpO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogY29ubmVjdCByZWZzIGFuZCBwcm9wcyBpbnNvZGUgY3JlYXRlUmVmQ29tcG9uZW50LCBlbHNld2hlcmUgaXRzIG5vdCByZWFsbHkgPFQ+XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZkNvbXBvbmVudDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdsb2FkIGNvbXBvbmVudCBnb3QgYSBkZXRhY2hlZCByZWYuJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lciBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICAvKipcbiAgICAgICAgICpcbiAgICAgICAgICogY2hvb3NlIHNraW4gb24gcnVudGltZSAuLi5cbiAgICAgICAgICogICAgICAgIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5za2luU2VsZWN0b3IudHlwZVxuICAgICAgICAgKi9cblxuICAgICAgICBsZXQgc2VsZWN0ZWRTa2luID0gYXdhaXQgdGhpcy5ydW5Ta2luU2VsZWN0b3IoY29tcG9uZW50Q29uZmlnLCBob29rcykhXG5cbiAgICAgICAgaWYgKCFzZWxlY3RlZFNraW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJ1blNraW5TZWxlY3RvciBmYWlsZWQgdG8gY2hvb3NlIHNraW4sIGNoZWNrIHRoZSBwcm92aWRlZCBjb25maWdcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8uaG9va3M/LmFmdGVyU2tpblNlbGVjdGVkKSB7XG4gICAgICAgICAgICBzZWxlY3RlZFNraW4gPSBhd2FpdCBvcHRpb25zLmhvb2tzLmFmdGVyU2tpblNlbGVjdGVkKHsuLi5zZWxlY3RlZFNraW59KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21wb25lbnRMb2FkZXIgPSB0aGlzLmNvbXBvbmVudHNMb2FkZXJzLmZpbmQobG9hZGVyID0+IGxvYWRlci50eXBlID09PSBzZWxlY3RlZFNraW4ubG9hZGVyLnR5cGUpO1xuXG4gICAgICAgIGlmICghY29tcG9uZW50TG9hZGVyKSB7XG4gICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbm8gbG9hZGVyIFwiJHtzZWxlY3RlZFNraW4ubG9hZGVyLnR5cGV9XCIgd2FzIGZvdW5kIGZvciBjb21wb25lbnRgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vZm9yIGxvYWRlZCB3ZWJjb21wb25lbnQgbW9kdWxlcyB0byBmb2xsb3dpbmcgbGluZSBjcmVhdGVzIGEgcmFjZSBjb25kaXRpb24gd2l0aCB0aGUgaW5pdCBtZXNzYWdlIGZsb3dcbiAgICAgICAgbGV0IGNvbXBvbmVudCA9IGF3YWl0IGNvbXBvbmVudExvYWRlci5sb2FkKGNvbXBvbmVudENvbmZpZy50eXBlLCBzZWxlY3RlZFNraW4sIGNvbnRhaW5lciwgb3B0aW9ucyk7XG5cbiAgICAgICAgLy8gVE9ETyA6IHdoZW4gdGhpcyBpcyBub3QgdHJ1ZSA/XG4gICAgICAgIGlmICghY29tcG9uZW50LmlzSW5pdGlhdGVkKVxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzMmluaXQucHVzaChjb21wb25lbnQpXG5cbiAgICAgICAgY29tcG9uZW50LmJpbmQoJ29uRGlzcG9zZScsICgpID0+IHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2NvbXBvbmVudCBkaXNwb3NlJywgY29tcG9uZW50KTtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50cyA9IHRoaXMuY29tcG9uZW50cy5maWx0ZXIoYyA9PiBjICE9PSBjb21wb25lbnQpXG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMyaW5pdCA9IHRoaXMuY29tcG9uZW50czJpbml0LmZpbHRlcihjID0+IGMgIT09IGNvbXBvbmVudClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG5cbiAgICAgICAgLy8gdHJ1ZSBieSBkZWZhdWx0XG4gICAgICAgIGlmICghb3B0aW9ucyB8fCBvcHRpb25zLmNvbm5lY3RQcm9wcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIC8vVE9ETyA6IG1ha2UgdHlwZSBmaWVsZCBjb25kaXRpb25hbCB0eXBlIGluZmVyIFwic3RyaW5nXCIgPiBzdHJpbmcsIFwibnVtYmVyXCIgPiBudW1iZXIsIGV0Yy4uLlxuICAgICAgICAgICAgY29tcG9uZW50ID0gY29ubmVjdFByb3BzKGNvbXBvbmVudCwgY29tcG9uZW50Q29uZmlnLnR5cGUucHJvcHMsIHNlbGVjdGVkU2tpbik7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy9UT0RPIDogbWFrZSBvcHRpb25hbD9cbiAgICAgICAgICAgIC8vVE9ETyA6IGZpeCBpc3N1ZXMgd2l0aCB0aW1lb3V0IGFuZCB3cm9uZyByZWYgbmFtZXMgZnJvbSBjb25maWcgdnMgY3VycmVudCBza2luXG4gICAgICAgICAgICBhd2FpdCBjb25uZWN0UmVmcyhjb21wb25lbnQsIGNvbXBvbmVudENvbmZpZywgdGhpcy5jb21wb25lbnRzKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICAvLyBUT09EIDogdGhyb3cgP1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3B0aW9ucz8uc2tpcEluaXQpXG4gICAgICAgICAgICBhd2FpdCBjb21wb25lbnQuaW5pdGlhdGVkKCk7XG5cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudCBhcyBUO1xuICAgIH1cblxuICAgIHB1YmxpYyBuYXZpZ2F0ZSA9IGFzeW5jIDxUIGV4dGVuZHMgSU15b3BDb21wb25lbnQgPSBJTXlvcENvbXBvbmVudD4oY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgbmV3Q29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBvcHRpb25zPzogbmF2aWdhdGlvbk9wdGlvbnMpID0+IHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC5wYXJlbnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTmF2aWdhdGluZyBvbiByZW1vdGUgcmVmIGNvbXBvbmVudHMgaXMgbm90IGltcGxlbWVudGVkIHlldCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jb21wb25lbnQubWFya2VkRm9yRGlzcG9zZWQgPSB0cnVlO1xuXG4gICAgICAgIC8vIGlmIChvcHRpb25zPy5pbnBsYWNlKSB7XG4gICAgICAgIC8vICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgLy8gICAgICAgICBsZXQgbmV3Q29tcG9uZW50ID0gYXdhaXQgdGhpcy5sb2FkQ29tcG9uZW50PFQ+KG5ld0NvbXBvbmVudENvbmZpZywgY29tcG9uZW50LmVsZW1lbnQpO1xuICAgICAgICAvLyAgICAgICAgIGF3YWl0IG5ld0NvbXBvbmVudC5pbml0aWF0ZWQoKTtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICAgICBpZiAob3B0aW9ucy5pbml0KVxuICAgICAgICAvLyAgICAgICAgICAgICBhd2FpdCBvcHRpb25zLmluaXQobmV3Q29tcG9uZW50KTtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gbmV3Q29tcG9uZW50O1xuICAgICAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJy4uLicpXG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8uc3RhZ2VkKSB7XG4gICAgICAgICAgICAvL2NvbnN0IHNlbGVjdGVkU2tpbiA9IHRoaXMucnVuU2tpblNlbGVjdG9yKG5ld0NvbXBvbmVudENvbmZpZylcbiAgICAgICAgICAgIGxldCBuZXdDb21wb25lbnQgPSBhd2FpdCB0aGlzLmxvYWRDb21wb25lbnQ8VD4obmV3Q29tcG9uZW50Q29uZmlnLCBjb21wb25lbnQuY29udGFpbmVyLCB7XG4gICAgICAgICAgICAgICAgaGlkZGVuOiB0cnVlLFxuICAgICAgICAgICAgICAgIHJlbGF0aXZlOiB7ZGlyZWN0aW9uOiAnYWZ0ZXInLCBjaGlsZDogY29tcG9uZW50LmVsZW1lbnQhfSxcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuaW5pdClcbiAgICAgICAgICAgICAgICBhd2FpdCBvcHRpb25zLmluaXQobmV3Q29tcG9uZW50KTtcblxuICAgICAgICAgICAgbmV3Q29tcG9uZW50LnNob3coKTtcbiAgICAgICAgICAgIGNvbXBvbmVudC5kaXNwb3NlKCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3Q29tcG9uZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbmV4dFNpYmxpbmcgPSBjb21wb25lbnQuZWxlbWVudCEubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgIGNvbXBvbmVudC5kaXNwb3NlKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkQ29tcG9uZW50PFQ+KG5ld0NvbXBvbmVudENvbmZpZywgY29tcG9uZW50LmNvbnRhaW5lciwge1xuICAgICAgICAgICAgICAgIHJlbGF0aXZlOiB7XG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogXCJiZWZvcmVcIixcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQ6IG5leHRTaWJsaW5nLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIG5hdmlnYXRpb25PcHRpb25zID0ge1xuICAgIHN0YWdlZD86IGJvb2xlYW4sXG4gICAgLy9pbnBsYWNlPzogYm9vbGVhbixcbiAgICBpbml0PzogKGNvbXBvbmVudDogSU15b3BDb21wb25lbnQpID0+IFByb21pc2U8dm9pZD5cbiAgICBza2lwSW5pdD86IGJvb2xlYW5cbn0gJiBsb2FkZXJPcHRpb25zXG5cbnR5cGUgcmVsYXRpdmVMb2FkQ29uZmlnRGlyZWN0aW9uID0gJ2JlZm9yZScgfCAnYWZ0ZXInO1xuXG5cbmV4cG9ydCB0eXBlIGxvYWRlckhvb2tzID0ge1xuICAgIGFmdGVyU2tpblNlbGVjdGVkPzogKHNlbGVjdGVkU2tpbjogSVNraW5Db25maWcpID0+IFByb21pc2U8SVNraW5Db25maWc+XG59ICZcbiAgICAvLyBzZWdtZW50YXRpb24gaG9va3NcbiAgICAoeyBba2V5OiBzdHJpbmddOiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+IHwgYm9vbGVhbiB9IHwge30pXG5cbi8vVE9ETzogc3VwcG9ydCBzZXJpYWxpemFibGUgdmVyc2lvbiBvZiB0aGF0IG9iamVjdFxuZXhwb3J0IGludGVyZmFjZSByZWxhdGl2ZUxvYWRDb25maWcge1xuICAgIC8vSWYgdGhpcyBpcyBudWxsLCB0aGVuIG5ld05vZGUgaXMgaW5zZXJ0ZWQgYXQgdGhlIGVuZCBvZiBub2RlJ3MgY2hpbGQgbm9kZXMuXG4gICAgLy9odHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTm9kZS9pbnNlcnRCZWZvcmVcbiAgICBjaGlsZDogQ2hpbGROb2RlIHwgbnVsbFxuICAgIGRpcmVjdGlvbjogcmVsYXRpdmVMb2FkQ29uZmlnRGlyZWN0aW9uXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUVudmlyb25tZW50IHtcbiAgICBba2V5OiBzdHJpbmddOiBhbnlcbn1cblxudHlwZSBFbGVtZW50QXR0cmlidXRlcyA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbDtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgbG9hZGVyT3B0aW9ucyB7XG4gICAgaWQ/OiBzdHJpbmdcbiAgICBoaWRkZW4/OiBib29sZWFuXG4gICAgY29ubmVjdFByb3BzPzogYm9vbGVhblxuICAgIHRpbWVvdXQ/OiBudW1iZXJcbiAgICBza2lwSW5pdD86IGJvb2xlYW5cbiAgICByZWxhdGl2ZT86IHJlbGF0aXZlTG9hZENvbmZpZ1xuICAgIGhvb2tzPzogbG9hZGVySG9va3NcbiAgICBlbGVtZW50QXR0cmlidXRlcz86IEVsZW1lbnRBdHRyaWJ1dGVzXG4gICAgX2Vudmlyb25tZW50PzogSUVudmlyb25tZW50XG4gICAgX2hhc1BhcmVudD86IGJvb2xlYW5cbiAgICBfaW5zcGVjdGlvbj86IGJvb2xlYW5cbn1cblxuaWYgKCF3aW5kb3cubXlvcCkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB3aW5kb3cubXlvcCA9IHtcbiAgICAgICAgX19ST09UX1NES19QVUJMSUNfVVJMX19cbiAgICB9O1xufVxuXG5pZiAoIXdpbmRvdy5teW9wLmhvc3RTREspIHtcbiAgICBjb25zdCBfaG9zdFNESyA9IG5ldyBIb3N0U0RLKCk7XG4gICAgLy9UT0RPOiBlbmFibGUgbGF6eSBpbml0P1xuICAgIF9ob3N0U0RLLmluaXQoKTtcblxuICAgIGlmICghd2luZG93Lm15b3ApIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB3aW5kb3cubXlvcCA9IHtcbiAgICAgICAgICAgIF9fUk9PVF9TREtfUFVCTElDX1VSTF9fXG4gICAgICAgIH07XG4gICAgfVxuICAgIHdpbmRvdy5teW9wLmhvc3RTREsgPSBfaG9zdFNESztcbn1cblxuLy8gQHRzLWlnbm9yZVxuZXhwb3J0IGNvbnN0IGhvc3RTREs6IEhvc3RTREsgPSB3aW5kb3cubXlvcC5ob3N0U0RLO1xuXG5kZWZpbmVEeW5hbWljSW1wb3J0KCdob3N0U0RLJywgaG9zdFNESyk7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICAgICAgbXlvcDoge1xuICAgICAgICAgICAgX19ST09UX1NES19QVUJMSUNfVVJMX186IHN0cmluZyxcbiAgICAgICAgICAgIGhvc3RTREs6IEhvc3RTREssXG4gICAgICAgICAgICBJZnJhbWVTREs6IEluc3RhbmNlVHlwZTx0eXBlb2YgSWZyYW1lU0RLPlxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7aG9zdFNES30gZnJvbSAnLi4vaG9zdCc7XG5pbXBvcnQge1xuICAgIElDb21wb25lbnRDb25maWcsXG4gICAgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnLCBJRGVkaWNhdGVkU2tpbkNvbmZpZyxcbiAgICBJUHJvcENvbmZpZyxcbiAgICBJU2tpbkNvbmZpZyxcbiAgICBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcyxcbiAgICB2Ml9JVmFyaWFudENvbmZpZ1xufSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0L2hvc3RTREsudHNcIjtcblxuZXhwb3J0IGNsYXNzIHYyX0Nsb3VkUmVwb3NpdG9yeSB7XG4gICAgc3RhdGljIE1haW4gPSBuZXcgdjJfQ2xvdWRSZXBvc2l0b3J5KCk7XG5cbiAgICBwcml2YXRlIHZhcmlhbnRzOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPHYyX0lWYXJpYW50Q29uZmlnPj4gPSB7fTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Jhc2VVcmwgPSAnaHR0cHM6Ly9jbG91ZC5teW9wLmRldicpIHtcbiAgICB9XG5cbiAgICBhc3luYyBmZXRjaENvbXBvbmVudChjb21wb25lbnRJZDogc3RyaW5nLCBlbnZpcm9ubWVudElkZW50aWZpZXI/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhcmlhbnRzW2NvbXBvbmVudElkXSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgICAgICAgIHRoaXMudmFyaWFudHNbY29tcG9uZW50SWRdID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5fYmFzZVVybH0vY29uc3VtZT9pZD0ke2NvbXBvbmVudElkfSZlbnY9JHtlbnZpcm9ubWVudElkZW50aWZpZXJ9YFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShqc29uLml0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudmFyaWFudHNbY29tcG9uZW50SWRdO1xuICAgIH1cblxufVxuXG5leHBvcnQgY29uc3QgZW5hYmxlVjIgPSAoZW52aXJvbm1lbnRJZGVudGlmaWVyOiBzdHJpbmcsIGNsb3VkUmVwb3NpdG9yeT86IHYyX0Nsb3VkUmVwb3NpdG9yeSkgPT4ge1xuICAgIGNvbnN0IF9jbG91ZFJlcG9zaXRvcnkgPSBjbG91ZFJlcG9zaXRvcnkgPyBjbG91ZFJlcG9zaXRvcnkgOiBuZXcgdjJfQ2xvdWRSZXBvc2l0b3J5KCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBsb2FkQ29tcG9uZW50OiBhc3luYyAoY29tcG9uZW50SWQ6IHN0cmluZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IF9jbG91ZFJlcG9zaXRvcnkuZmV0Y2hDb21wb25lbnQoY29tcG9uZW50SWQsIGVudmlyb25tZW50SWRlbnRpZmllcilcblxuICAgICAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgICAgICBpZiAoIWNvbmZpZy5jb25zdW1lX3ZhcmlhbnQgfHwgIWNvbmZpZy5jb25zdW1lX3ZhcmlhbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgICBgW015b3AgV2FybmluZ10gQ29tcG9uZW50IFwiJHtjb21wb25lbnRJZH1cIiBoYXMgbm8gaW1wbGVtZW50YXRpb24gZm9yIGVudmlyb25tZW50IFwiJHtlbnZpcm9ubWVudElkZW50aWZpZXJ9XCIuYFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudENvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZToge1xuICAgICAgICAgICAgICAgICAgICBpZDogJ2F1dG8nLFxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRJZDogY29uZmlnLmNvbXBvbmVudElkLFxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnROYW1lOiBjb25maWcubmFtZSxcblxuICAgICAgICAgICAgICAgICAgICBza2luU2VsZWN0b3I6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdEZWRpY2F0ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2tpbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnc2tpbl9hdXRvX3YyX2NvbnZlcnRlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZ1xuXG4gICAgICAgICAgICAgICAgfSBhcyBJQ29tcG9uZW50SW5zdGFuY2VDb25maWcsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBpZDogY29uZmlnLmlkLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBjb25maWcubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGNvbmZpZy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgcHJvcHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ2luX2F1dG9fdjJfY29udmVydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbXlvcF9pbml0X2ludGVyZmFjZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FueScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMuY29kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gYXMgSVByb3BDb25maWcsXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ291dF9hdXRvX3YyX2NvbnZlcnRlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ215b3BfY3RhX2hhbmRsZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhbnknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGFzIElQcm9wQ29uZmlnXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIHJlZnM6IFtdLFxuICAgICAgICAgICAgICAgICAgICBza2luczogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnc2tpbl9hdXRvX3YyX2NvbnZlcnRlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2F1dG9fdjJfY29udmVydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogaGFuZGxlIGVtcHR5IDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyOiBjb25maWcuY29uc3VtZV92YXJpYW50WzBdLmxvYWRlclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBJU2tpbkNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0U2tpbjogMFxuICAgICAgICAgICAgICAgIH0gYXMgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgICAgICAgICAgICAgbmFtZTogY29uZmlnLm5hbWVcbiAgICAgICAgICAgIH0gYXMgSUNvbXBvbmVudENvbmZpZztcblxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGhvc3RTREsubG9hZENvbXBvbmVudChjb21wb25lbnRDb25maWcsIGNvbnRhaW5lciwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR08sSUFBTSxTQUFTLE1BQU07QUFDeEIsU0FBTyx1Q0FBdUM7QUFBQSxJQUFRO0FBQUEsSUFBVSxRQUMzRCxDQUFDLElBQUksT0FBTyxnQkFBZ0IsSUFBSSxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxHQUFHLFNBQVMsRUFBRTtBQUFBLEVBQ2xGO0FBQ0o7QUFVTyxJQUFNLGNBQWMsQ0FBQyxVQUE4QjtBQUN0RCxRQUFNLE1BQU0sQ0FBQyxHQUFHLEtBQUssRUFBRSxJQUFJLE9BQUssRUFBRSxTQUFTLEVBQUUsRUFBRSxTQUFTLEdBQUcsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFO0FBQ3hFLFNBQU87QUFBQSxJQUNILElBQUksTUFBTSxHQUFHLENBQUM7QUFBQSxJQUNkLElBQUksTUFBTSxHQUFHLEVBQUU7QUFBQSxJQUNmLElBQUksTUFBTSxJQUFJLEVBQUU7QUFBQSxJQUNoQixJQUFJLE1BQU0sSUFBSSxFQUFFO0FBQUEsSUFDaEIsSUFBSSxN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QUEsY0FDSSxJQUFJO0FBQUEsY0FDSixNQUFNO0FBQUEsY0FDTixhQUFhO0FBQUE7QUFBQTtBQUFBLGNBR2IsUUFBUSxPQUFPLGdCQUFnQixDQUFDLEVBQUU7QUFBQSxZQUN0QztBQUFBLFVBQ0o7QUFBQSxVQUNBLGFBQWE7QUFBQSxRQUNqQjtBQUFBLFFBQ0EsTUFBTSxPQUFPO0FBQUEsTUFDakI7QUFFQSxhQUFPLE1BQU0sUUFBUSxjQUFjLGlCQUFpQixXQUFXLE9BQU87QUFBQSxJQUMxRTtBQUFBLEVBQ0o7QUFDSjsiLAogICJuYW1lcyI6IFsiUmVwbGF5TWVzc2FnZUtleSIsICJtYXRjaCIsICJzY3JpcHRJbnB1dHMiLCAic2NyaXB0SW5wdXRzIiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgInNlZW4iLCAidGFyZ2V0IiwgIm1ha2VTZXJpYWxpemFibGUiLCAiaGVpZ2h0IiwgIndpZHRoIiwgImhvc3RTREsiLCAiZWxlbWVudCIsICJzZWVuIiwgInNkayIsICJkb21JZCIsICJzZGsiLCAic2VlbiIsICJza2luIiwgImNvbXBvbmVudCIsICJzZWdtZW50IiwgImV4cGVyaWVuY2UiLCAic2VsZWN0ZWRTa2luIl0KfQo=