@rusticarcade/palette 0.4.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/dev/index.js CHANGED
@@ -170,271 +170,6 @@ class PaletteError extends Error {
170
170
  }
171
171
  }
172
172
 
173
- // src/util/attributes.ts
174
- function serializeAttribute(value) {
175
- if (typeof value === "string" || typeof value === "number") {
176
- return `${value}`;
177
- }
178
- if (value === true) {
179
- return "";
180
- }
181
- if (value === null || value === false || value === undefined) {
182
- return null;
183
- }
184
- return value.toString();
185
- }
186
- function createAttributeMap(source) {
187
- const map = new Map;
188
- if (source instanceof HTMLElement) {
189
- for (const name of source.getAttributeNames()) {
190
- map.set(name, serializeAttribute(source.getAttribute(name)));
191
- }
192
- return map;
193
- }
194
- if (source instanceof Map) {
195
- for (const [key, val] of source) {
196
- map.set(key, serializeAttribute(val));
197
- }
198
- return map;
199
- }
200
- if (typeof source === "object" && source !== null) {
201
- for (const [key, val] of Object.entries(source)) {
202
- map.set(key, serializeAttribute(val));
203
- }
204
- return map;
205
- }
206
- throw new PaletteError(0 /* INVARIANT */);
207
- }
208
- function applyAttributeMap(target, attrs) {
209
- const currentNames = new Set(target.getAttributeNames());
210
- const incomingNames = new Set(attrs.keys());
211
- const attributesToRemove = currentNames.difference(incomingNames);
212
- for (const attr of attributesToRemove) {
213
- target.removeAttribute(attr);
214
- }
215
- for (const [name, val] of attrs) {
216
- if (val === null) {
217
- target.removeAttribute(name);
218
- } else {
219
- target.setAttribute(name, val);
220
- }
221
- }
222
- }
223
- // src/util/element-match.ts
224
- function isTagName(str) {
225
- for (let i = 0;i < str.length; i++) {
226
- const char = str.charAt(i);
227
- if (!(char === "-" || char >= "A" && char <= "Z" || char >= "a" && char <= "z")) {
228
- return false;
229
- }
230
- }
231
- return true;
232
- }
233
- function elementMatches(element, query) {
234
- if (query[0] === "#" && query.indexOf(" ") === -1 && query.indexOf(".") === -1 && query.indexOf("[") === -1 && query.indexOf(":") === -1 && query.indexOf(">") === -1) {
235
- return element.id === query.slice(1);
236
- }
237
- if (query[0] === "." && query.indexOf(" ") === -1 && query.indexOf("#") === -1 && query.indexOf("[") === -1 && query.indexOf(":") === -1 && query.indexOf(">") === -1) {
238
- return element.classList.contains(query.slice(1));
239
- }
240
- if (isTagName(query)) {
241
- return element.tagName.toLowerCase() === query.toLowerCase();
242
- }
243
- if (query[0] === "[" && query[query.length - 1] === "]" && query.indexOf(" ") === -1 && query.indexOf(":") === -1) {
244
- const attr = query.slice(1, -1);
245
- const eqIndex = attr.indexOf("=");
246
- if (eqIndex === -1) {
247
- return element.hasAttribute(attr);
248
- }
249
- const attrName = attr.slice(0, eqIndex);
250
- const attrValue = attr.slice(eqIndex + 1).replace(/^["']|["']$/g, "");
251
- return element.getAttribute(attrName) === attrValue;
252
- }
253
- return element.matches(query);
254
- }
255
- // src/util/lru-cache.ts
256
- class LRUCache {
257
- _maxSize;
258
- _data;
259
- _metrics = { hits: 0, misses: 0 };
260
- constructor(maxSize = 500) {
261
- if (maxSize <= 0) {
262
- throw new Error("LRU Cache capacity must be >= 1");
263
- }
264
- if (true) {
265
- this._metrics = { hits: 0, misses: 0 };
266
- }
267
- this._maxSize = maxSize;
268
- this._data = new Map;
269
- }
270
- _trim = () => {
271
- while (this._data.size > this._maxSize) {
272
- const firstKey = this._data.keys().next().value;
273
- if (firstKey === undefined) {
274
- throw new Error("Absurd");
275
- }
276
- this._data.delete(firstKey);
277
- }
278
- };
279
- getMetrics() {
280
- if (true) {
281
- const { hits = 0, misses = 0 } = this._metrics ?? {};
282
- const lookups = hits + misses;
283
- const hitRate = lookups === 0 ? 0 : hits / lookups;
284
- return {
285
- lookups,
286
- hits,
287
- misses,
288
- capacity: this._maxSize,
289
- entries: this._data.size,
290
- hitRate
291
- };
292
- }
293
- }
294
- setCapacity = (maxSize) => {
295
- if (maxSize <= 0 && true) {
296
- console.warn("[Palette LRU Cache] Cache size is <= 0. Cache is disabled.");
297
- }
298
- this._maxSize = maxSize;
299
- this._trim();
300
- };
301
- get(key) {
302
- const value = this._data.get(key);
303
- if (value === undefined) {
304
- if (true) {
305
- this._metrics.misses += 1;
306
- }
307
- return;
308
- }
309
- this._data.delete(key);
310
- this._data.set(key, value);
311
- if (true) {
312
- this._metrics.hits += 1;
313
- }
314
- return value;
315
- }
316
- set(key, value) {
317
- if (this._data.has(key)) {
318
- this._data.delete(key);
319
- }
320
- this._data.set(key, value);
321
- if (this._data.size > this._maxSize) {
322
- this._trim();
323
- }
324
- }
325
- clear() {
326
- this._data.clear();
327
- }
328
- get size() {
329
- return this._data.size;
330
- }
331
- }
332
- var lru_cache_default = LRUCache;
333
-
334
- // src/util/fragments.ts
335
- var fragmentCache = new lru_cache_default;
336
- function htmlToFragment(html) {
337
- const lookup = fragmentCache.get(html);
338
- if (lookup !== undefined) {
339
- return lookup.cloneNode(true);
340
- }
341
- const temp = document.createElement("template");
342
- temp.innerHTML = html;
343
- fragmentCache.set(html, temp.content);
344
- return temp.content.cloneNode(true);
345
- }
346
- function saveFragment(html, fragment) {
347
- fragmentCache.set(html, fragment);
348
- }
349
- // src/helper/css.ts
350
- function parseCSSTemplateStringValue(val) {
351
- if (typeof val === "function") {
352
- const tagName = val.tagName;
353
- if (!isTagName(tagName)) {
354
- throw new PaletteError(203 /* TEMPLATE_INVALID_COMPONENT */, val.name, val.tagName);
355
- }
356
- return tagName;
357
- }
358
- if (typeof val === "string") {
359
- return val;
360
- }
361
- throw new PaletteError(200 /* TEMPLATE_INVALID_VALUE */, String(val));
362
- }
363
- function css(strings, ...values) {
364
- let result = strings[0] ?? "";
365
- for (let i = 0;i < values.length; i++) {
366
- const nextVal = values[i] ?? "";
367
- const nextStr = strings[i + 1] ?? "";
368
- result += parseCSSTemplateStringValue(nextVal);
369
- result += nextStr;
370
- }
371
- const sheet = new CSSStyleSheet;
372
- sheet.replaceSync(result);
373
- return sheet;
374
- }
375
- function classify(...args) {
376
- let resultString = "";
377
- for (let index = 0;index < args.length; index++) {
378
- const argument = args[index];
379
- if (!argument) {
380
- continue;
381
- }
382
- if (typeof argument === "string" || typeof argument === "number") {
383
- if (resultString) {
384
- resultString += " ";
385
- }
386
- resultString += argument;
387
- continue;
388
- }
389
- if (Array.isArray(argument)) {
390
- const nestedResult = classify(...argument);
391
- if (nestedResult) {
392
- if (resultString) {
393
- resultString += " ";
394
- }
395
- resultString += nestedResult;
396
- }
397
- continue;
398
- }
399
- if (typeof argument === "object") {
400
- for (const className in argument) {
401
- if (argument[className]) {
402
- if (resultString) {
403
- resultString += " ";
404
- }
405
- resultString += className;
406
- }
407
- }
408
- }
409
- }
410
- return resultString;
411
- }
412
- // src/helper/html.ts
413
- function parseTemplateStringValue(val) {
414
- if (val instanceof HTMLTemplateElement) {
415
- return val.innerHTML;
416
- }
417
- if (typeof val === "function" && (val.prototype instanceof Component || val === Component)) {
418
- const tagName = val.tagName;
419
- if (!isTagName(tagName)) {
420
- throw new PaletteError(203 /* TEMPLATE_INVALID_COMPONENT */, val.name, val.tagName);
421
- }
422
- return tagName;
423
- }
424
- if (typeof val === "string") {
425
- return `<span ::swap="${val}"></span>`;
426
- }
427
- throw new PaletteError(200 /* TEMPLATE_INVALID_VALUE */, String(val));
428
- }
429
- function html(strings, ...values) {
430
- const fullString = strings.reduce((acc, str, i) => {
431
- const parsedValue = values[i] ? `${parseTemplateStringValue(values[i])}` : "";
432
- return acc + str + parsedValue;
433
- }, "");
434
- const templateElement = document.createElement("template");
435
- templateElement.innerHTML = fullString;
436
- return templateElement;
437
- }
438
173
  // src/state/state.ts
439
174
  var ArrayMutatorFunctions = new Set([
440
175
  "push",
@@ -455,17 +190,18 @@ var DataStructureMutatorFunctions = new Set([
455
190
  ]);
456
191
 
457
192
  class State {
193
+ static isState(value) {
194
+ return value !== null && typeof value === "object" && value instanceof State;
195
+ }
458
196
  _data;
459
197
  _listeners = new Set;
460
198
  _proxy;
461
199
  _proxyCache = new WeakMap;
462
200
  _reverseProxyCache = new WeakMap;
463
- _isLocked = false;
464
- constructor(initialData, onChange) {
201
+ constructor(initialData, listener) {
465
202
  this._data = initialData;
466
- this.get = this.get.bind(this);
467
- if (onChange) {
468
- this._listeners.add(onChange);
203
+ if (listener) {
204
+ this._listeners.add(listener);
469
205
  }
470
206
  }
471
207
  _createProxy(target, path = []) {
@@ -493,9 +229,6 @@ class State {
493
229
  }
494
230
  const res = current[key](...args);
495
231
  if (isMutation) {
496
- if (this._isLocked) {
497
- throw new PaletteError(305 /* STATE_LOCKED */);
498
- }
499
232
  this._processIncomingState(snapshot);
500
233
  }
501
234
  return res;
@@ -507,9 +240,6 @@ class State {
507
240
  return value;
508
241
  },
509
242
  set: (_obj, key, value) => {
510
- if (this._isLocked) {
511
- throw new PaletteError(305 /* STATE_LOCKED */);
512
- }
513
243
  if (typeof key === "symbol") {
514
244
  return false;
515
245
  }
@@ -583,7 +313,7 @@ class State {
583
313
  }
584
314
  if (current[finalKey] !== value && !Object.is(current[finalKey], value)) {
585
315
  current[finalKey] = value;
586
- this._emit(this.current);
316
+ this._emit(this.raw);
587
317
  }
588
318
  }
589
319
  _processIncomingState = (incomingState) => {
@@ -601,13 +331,14 @@ class State {
601
331
  if (hasChanges) {
602
332
  this._emit(this._data);
603
333
  }
334
+ return this;
604
335
  };
605
336
  _emit = (data) => {
606
337
  for (const listener of this._listeners) {
607
338
  listener(data);
608
339
  }
609
340
  };
610
- get current() {
341
+ get raw() {
611
342
  return this._data;
612
343
  }
613
344
  get live() {
@@ -616,9 +347,6 @@ class State {
616
347
  }
617
348
  return this._proxy;
618
349
  }
619
- get isLocked() {
620
- return this._isLocked;
621
- }
622
350
  addListener = (listener) => {
623
351
  this._listeners.add(listener);
624
352
  };
@@ -632,101 +360,229 @@ class State {
632
360
  return structuredClone(this._data);
633
361
  };
634
362
  set = (key, value) => {
635
- if (this._isLocked) {
636
- throw new PaletteError(305 /* STATE_LOCKED */);
637
- }
638
363
  const partial = {};
639
364
  partial[key] = value;
640
- this._processIncomingState(partial);
365
+ return this._processIncomingState(partial);
641
366
  };
642
367
  patch = (patch) => {
643
- if (this._isLocked) {
644
- throw new PaletteError(305 /* STATE_LOCKED */);
645
- }
646
- this._processIncomingState(patch);
647
- return this;
368
+ return this._processIncomingState(patch);
648
369
  };
649
370
  replace = (state) => {
650
- if (this._isLocked) {
651
- throw new PaletteError(305 /* STATE_LOCKED */);
652
- }
653
371
  this._data = state;
654
372
  this._emit(this._data);
655
373
  return this;
656
374
  };
657
- lock = () => {
658
- if (this._isLocked) {
659
- throw new PaletteError(305 /* STATE_LOCKED */);
660
- }
661
- this._isLocked = true;
662
- return this;
663
- };
664
- unlock = () => {
665
- this._isLocked = false;
666
- return this;
667
- };
668
375
  mutate = (mutator) => {
669
- if (this._isLocked) {
670
- throw new PaletteError(305 /* STATE_LOCKED */);
671
- }
672
- this._processIncomingState(mutator(this.snapshot()));
673
- return this;
376
+ return this._processIncomingState(mutator(this.snapshot()));
674
377
  };
675
- mutateAsync = async (mutator, lock = false) => {
676
- if (this._isLocked) {
677
- throw new PaletteError(305 /* STATE_LOCKED */);
378
+ }
379
+ // src/util/lru-cache.ts
380
+ class LRUCache {
381
+ _maxSize;
382
+ _data;
383
+ _metrics = { hits: 0, misses: 0 };
384
+ constructor(maxSize = 500) {
385
+ if (maxSize <= 0) {
386
+ throw new Error("LRU Cache capacity must be >= 1");
678
387
  }
679
- if (lock) {
680
- this._isLocked = true;
388
+ if (true) {
389
+ this._metrics = { hits: 0, misses: 0 };
681
390
  }
682
- const mutationResult = await mutator(this.snapshot());
683
- this._processIncomingState(mutationResult);
684
- if (lock) {
685
- this._isLocked = false;
391
+ this._maxSize = maxSize;
392
+ this._data = new Map;
393
+ }
394
+ _trim = () => {
395
+ while (this._data.size > this._maxSize) {
396
+ const firstKey = this._data.keys().next().value;
397
+ if (firstKey === undefined) {
398
+ throw new Error("Absurd");
399
+ }
400
+ this._data.delete(firstKey);
686
401
  }
687
- return this;
688
402
  };
689
- transaction = (fn) => {
690
- if (this._isLocked) {
691
- throw new PaletteError(305 /* STATE_LOCKED */);
403
+ getMetrics() {
404
+ if (true) {
405
+ const { hits = 0, misses = 0 } = this._metrics ?? {};
406
+ const lookups = hits + misses;
407
+ const hitRate = lookups === 0 ? 0 : hits / lookups;
408
+ return {
409
+ lookups,
410
+ hits,
411
+ misses,
412
+ capacity: this._maxSize,
413
+ entries: this._data.size,
414
+ hitRate
415
+ };
692
416
  }
693
- this._isLocked = true;
694
- let success = true;
695
- try {
696
- const transactionState = new State(this.snapshot());
697
- fn(transactionState);
698
- this._processIncomingState(transactionState.current);
699
- } catch (error) {
417
+ }
418
+ setCapacity = (maxSize) => {
419
+ if (maxSize <= 0 && true) {
420
+ console.warn("[Palette LRU Cache] Cache size is <= 0. Cache is disabled.");
421
+ }
422
+ this._maxSize = maxSize;
423
+ this._trim();
424
+ };
425
+ get(key) {
426
+ const value = this._data.get(key);
427
+ if (value === undefined) {
700
428
  if (true) {
701
- console.warn("[State] Transaction failed due to caught error", error);
429
+ this._metrics.misses += 1;
702
430
  }
703
- success = false;
704
- } finally {
705
- this._isLocked = false;
431
+ return;
706
432
  }
707
- return success;
708
- };
709
- transactionAsync = async (fn) => {
710
- if (this._isLocked) {
711
- throw new PaletteError(305 /* STATE_LOCKED */);
433
+ this._data.delete(key);
434
+ this._data.set(key, value);
435
+ if (true) {
436
+ this._metrics.hits += 1;
437
+ }
438
+ return value;
439
+ }
440
+ set(key, value) {
441
+ if (this._data.has(key)) {
442
+ this._data.delete(key);
443
+ }
444
+ this._data.set(key, value);
445
+ if (this._data.size > this._maxSize) {
446
+ this._trim();
447
+ }
448
+ }
449
+ clear() {
450
+ this._data.clear();
451
+ }
452
+ get size() {
453
+ return this._data.size;
454
+ }
455
+ }
456
+ var lru_cache_default = LRUCache;
457
+
458
+ // src/util/fragments.ts
459
+ var fragmentCache = new lru_cache_default;
460
+ function htmlToFragment(html) {
461
+ const lookup = fragmentCache.get(html);
462
+ if (lookup !== undefined) {
463
+ return lookup.cloneNode(true);
464
+ }
465
+ const temp = document.createElement("template");
466
+ temp.innerHTML = html;
467
+ fragmentCache.set(html, temp.content);
468
+ return temp.content.cloneNode(true);
469
+ }
470
+ function saveFragment(html, fragment) {
471
+ fragmentCache.set(html, fragment);
472
+ }
473
+
474
+ // src/util/attributes.ts
475
+ function serializeAttribute(value) {
476
+ if (typeof value === "string" || typeof value === "number") {
477
+ return `${value}`;
478
+ }
479
+ if (value === true) {
480
+ return "";
481
+ }
482
+ if (value === null || value === false || value === undefined) {
483
+ return null;
484
+ }
485
+ return value.toString();
486
+ }
487
+ function applyAttribute(element, name, value) {
488
+ if (value === null) {
489
+ element.removeAttribute(name);
490
+ } else {
491
+ element.setAttribute(name, value);
492
+ }
493
+ }
494
+ function getElementAttributes(source) {
495
+ const attrs = {};
496
+ for (const name of source.getAttributeNames()) {
497
+ attrs[name] = serializeAttribute(source.getAttribute(name));
498
+ }
499
+ return attrs;
500
+ }
501
+ function applyElementAttributes(target, attrs) {
502
+ const currentNames = new Set(target.getAttributeNames());
503
+ const incomingNames = new Set(Object.keys(attrs));
504
+ const attributesToRemove = currentNames.difference(incomingNames);
505
+ for (const attr of attributesToRemove) {
506
+ target.removeAttribute(attr);
507
+ }
508
+ for (const [name, val] of Object.entries(attrs)) {
509
+ applyAttribute(target, name, serializeAttribute(val));
510
+ }
511
+ }
512
+ function formatAttributeRecord(record) {
513
+ const out = {};
514
+ for (const [key, val] of Object.entries(record)) {
515
+ out[key] = serializeAttribute(val);
516
+ }
517
+ return out;
518
+ }
519
+ // src/util/element-match.ts
520
+ function isTagName(str) {
521
+ for (let i = 0;i < str.length; i++) {
522
+ const char = str.charAt(i);
523
+ if (!(char === "-" || char >= "A" && char <= "Z" || char >= "a" && char <= "z")) {
524
+ return false;
525
+ }
526
+ }
527
+ return true;
528
+ }
529
+ function elementMatches(element, query) {
530
+ if (query[0] === "#" && query.indexOf(" ") === -1 && query.indexOf(".") === -1 && query.indexOf("[") === -1 && query.indexOf(":") === -1 && query.indexOf(">") === -1) {
531
+ return element.id === query.slice(1);
532
+ }
533
+ if (query[0] === "." && query.indexOf(" ") === -1 && query.indexOf("#") === -1 && query.indexOf("[") === -1 && query.indexOf(":") === -1 && query.indexOf(">") === -1) {
534
+ return element.classList.contains(query.slice(1));
535
+ }
536
+ if (isTagName(query)) {
537
+ return element.tagName.toLowerCase() === query.toLowerCase();
538
+ }
539
+ if (query[0] === "[" && query[query.length - 1] === "]" && query.indexOf(" ") === -1 && query.indexOf(":") === -1) {
540
+ const attr = query.slice(1, -1);
541
+ const eqIndex = attr.indexOf("=");
542
+ if (eqIndex === -1) {
543
+ return element.hasAttribute(attr);
712
544
  }
713
- this._isLocked = true;
714
- let success = true;
715
- try {
716
- const transactionState = new State(this.snapshot());
717
- await fn(transactionState);
718
- this._processIncomingState(transactionState.current);
719
- } catch (error) {
720
- if (true) {
721
- console.warn("[State] Transaction failed due to caught error", error);
722
- }
723
- success = false;
724
- } finally {
725
- this._isLocked = false;
545
+ const attrName = attr.slice(0, eqIndex);
546
+ const attrValue = attr.slice(eqIndex + 1).replace(/^["']|["']$/g, "");
547
+ return element.getAttribute(attrName) === attrValue;
548
+ }
549
+ return element.matches(query);
550
+ }
551
+ // src/util/dom.ts
552
+ function walkParents(target, fn) {
553
+ let current = target.parentNode;
554
+ while (current !== null) {
555
+ const result = fn(current);
556
+ if (result) {
557
+ return true;
558
+ }
559
+ if (isShadowRoot(current)) {
560
+ current = current.host;
561
+ } else {
562
+ current = current.parentNode;
726
563
  }
727
- return success;
728
- };
564
+ }
565
+ return false;
566
+ }
567
+ function isElement(value) {
568
+ return value !== null && typeof value === "object" && value instanceof Element;
569
+ }
570
+ function isHTMLElement(value) {
571
+ return value !== null && typeof value === "object" && value instanceof HTMLElement;
729
572
  }
573
+ function isHTMLTemplateElement(value) {
574
+ return value !== null && typeof value === "object" && value instanceof HTMLTemplateElement;
575
+ }
576
+ function isShadowRoot(value) {
577
+ return value !== null && typeof value === "object" && value instanceof ShadowRoot;
578
+ }
579
+ function isNode(value) {
580
+ return value !== null && typeof value === "object" && value instanceof Node;
581
+ }
582
+ function isComment(value) {
583
+ return value !== null && typeof value === "object" && value instanceof Comment;
584
+ }
585
+
730
586
  // src/template/constant.ts
731
587
  var REF_ATTR = "data-node-ref";
732
588
 
@@ -815,8 +671,8 @@ function buildValueAccessor(notation) {
815
671
  }
816
672
 
817
673
  // src/template/util.ts
818
- function htmlStringToTemplate(html2) {
819
- const fragment = htmlToFragment(html2);
674
+ function htmlStringToTemplate(html) {
675
+ const fragment = htmlToFragment(html);
820
676
  const templateElement = document.createElement("template");
821
677
  templateElement.content.appendChild(fragment);
822
678
  return new Template(templateElement);
@@ -827,14 +683,14 @@ function collectOperableNodes(fragment) {
827
683
  const nodes = [];
828
684
  let currentNode = walker.nextNode();
829
685
  while (currentNode) {
830
- if (!(currentNode instanceof HTMLElement)) {
686
+ if (!isHTMLElement(currentNode)) {
831
687
  currentNode = walker.nextNode();
832
688
  continue;
833
689
  }
834
690
  let parent = currentNode.parentNode;
835
691
  let isInoperable = false;
836
692
  while (parent && !isInoperable) {
837
- if (knownIgnores.has(parent) || parent instanceof HTMLElement && (parent.hasAttribute("::each" /* Each */) || parent.hasAttribute("::if" /* If */) || parent.hasAttribute("::else" /* Else */) || parent.hasAttribute("::else-if" /* ElseIf */))) {
693
+ if (knownIgnores.has(parent) || isHTMLElement(parent) && (parent.hasAttribute("::each" /* Each */) || parent.hasAttribute("::if" /* If */) || parent.hasAttribute("::else" /* Else */) || parent.hasAttribute("::else-if" /* ElseIf */))) {
838
694
  isInoperable = true;
839
695
  knownIgnores.add(currentNode);
840
696
  break;
@@ -878,23 +734,14 @@ function compileTemplate(source) {
878
734
  const clonedTemplateElement = source.content.cloneNode(true);
879
735
  const nodes = collectOperableNodes(clonedTemplateElement);
880
736
  for (const node of nodes) {
881
- const attributes2 = createAttributeMap(node);
882
- for (const [attributeName, attributeValue] of attributes2) {
737
+ const allAttributesForNode = node.getAttributeNames();
738
+ for (const attributeName of allAttributesForNode) {
739
+ const attributeValue = node.getAttribute(attributeName);
883
740
  if (attributeValue === null || attributeName[0] !== ":") {
884
741
  continue;
885
742
  }
886
- if (attributeName[1] !== ":") {
887
- const bindName = attributeName.slice(1);
888
- const scheme = {
889
- type: "attr",
890
- notation: parseNotation(attributeValue),
891
- attribute: bindName,
892
- nodeRef: ensureNodeRef(node)
893
- };
894
- compiledSchemes.push(scheme);
895
- }
896
743
  if (attributeName === "::key" /* Key */) {
897
- if (!attributes2.has("::each" /* Each */)) {
744
+ if (!allAttributesForNode.includes("::each" /* Each */)) {
898
745
  throw new PaletteError(208 /* TEMPLATE_INVALID_KEY_DIRECTIVE */);
899
746
  }
900
747
  continue;
@@ -908,9 +755,18 @@ function compileTemplate(source) {
908
755
  parsedNotations.set(attributeValue, notation);
909
756
  }
910
757
  node.removeAttribute(attributeName);
911
- if (attributeName === "::tag" /* Tag */) {
758
+ if (attributeName[1] !== ":") {
759
+ const bindName = attributeName.slice(1);
760
+ const scheme = {
761
+ type: "attr" /* Attribute */,
762
+ notation: parseNotation(attributeValue),
763
+ attribute: bindName,
764
+ nodeRef: ensureNodeRef(node)
765
+ };
766
+ compiledSchemes.push(scheme);
767
+ } else if (attributeName === "::tag" /* Tag */) {
912
768
  compiledSchemes.push({
913
- type: "tag",
769
+ type: "tag" /* Tag */,
914
770
  notation,
915
771
  nodeRef: ensureNodeRef(node)
916
772
  });
@@ -926,7 +782,7 @@ function compileTemplate(source) {
926
782
  node.removeChild(node.firstChild);
927
783
  }
928
784
  const scheme = {
929
- type: "each",
785
+ type: "list" /* List */,
930
786
  notation,
931
787
  keyNotation: parseNotation(keyNotation),
932
788
  nodeRef,
@@ -935,14 +791,14 @@ function compileTemplate(source) {
935
791
  compiledSchemes.push(scheme);
936
792
  } else if (attributeName === "::swap" /* Swap */) {
937
793
  const scheme = {
938
- type: "swap",
794
+ type: "swap" /* Swap */,
939
795
  notation,
940
796
  nodeRef: ensureNodeRef(node)
941
797
  };
942
798
  compiledSchemes.push(scheme);
943
799
  } else if (attributeName === "::if" /* If */) {
944
800
  const scheme = {
945
- type: "cond",
801
+ type: "cond" /* Conditional */,
946
802
  branches: []
947
803
  };
948
804
  node.removeAttribute("::if" /* If */);
@@ -955,7 +811,7 @@ function compileTemplate(source) {
955
811
  scheme.branches.push(ifBranch);
956
812
  let condNode = node.nextElementSibling;
957
813
  while (condNode?.hasAttribute("::else-if" /* ElseIf */)) {
958
- if (!(condNode instanceof HTMLElement)) {
814
+ if (!isHTMLElement(condNode)) {
959
815
  break;
960
816
  }
961
817
  const baseElseIfNotation = condNode.getAttribute("::else-if" /* ElseIf */);
@@ -977,7 +833,7 @@ function compileTemplate(source) {
977
833
  scheme.branches.push(elseIfBranch);
978
834
  condNode = condNode.nextElementSibling;
979
835
  }
980
- if (condNode && condNode instanceof HTMLElement && condNode?.hasAttribute("::else" /* Else */)) {
836
+ if (condNode && isHTMLElement(condNode) && condNode?.hasAttribute("::else" /* Else */)) {
981
837
  condNode.removeAttribute("::else" /* Else */);
982
838
  const elseBranch = {
983
839
  type: "::else" /* Else */,
@@ -1003,17 +859,106 @@ function compileTemplate(source) {
1003
859
  }
1004
860
  const temp = document.createElement("div");
1005
861
  temp.appendChild(clonedTemplateElement.cloneNode(true));
1006
- const html2 = temp.innerHTML;
862
+ const html = temp.innerHTML;
1007
863
  const compiled = {
1008
- html: html2,
864
+ html,
1009
865
  schemes: compiledSchemes,
1010
866
  notations
1011
867
  };
1012
868
  compiledTemplateCache.set(source, compiled);
1013
- saveFragment(html2, clonedTemplateElement);
869
+ saveFragment(html, clonedTemplateElement);
1014
870
  return compiled;
1015
871
  }
1016
872
 
873
+ // src/helper/css.ts
874
+ function parseCSSTemplateStringValue(val) {
875
+ if (typeof val === "function") {
876
+ const tagName = val.tagName;
877
+ if (!isTagName(tagName)) {
878
+ throw new PaletteError(203 /* TEMPLATE_INVALID_COMPONENT */, val.name, val.tagName);
879
+ }
880
+ return tagName;
881
+ }
882
+ if (typeof val === "string") {
883
+ return val;
884
+ }
885
+ throw new PaletteError(200 /* TEMPLATE_INVALID_VALUE */, String(val));
886
+ }
887
+ function css(strings, ...values) {
888
+ let result = strings[0] ?? "";
889
+ for (let i = 0;i < values.length; i++) {
890
+ const nextVal = values[i] ?? "";
891
+ const nextStr = strings[i + 1] ?? "";
892
+ result += parseCSSTemplateStringValue(nextVal);
893
+ result += nextStr;
894
+ }
895
+ const sheet = new CSSStyleSheet;
896
+ sheet.replaceSync(result);
897
+ return sheet;
898
+ }
899
+ function classify(...args) {
900
+ let resultString = "";
901
+ for (let index = 0;index < args.length; index++) {
902
+ const argument = args[index];
903
+ if (!argument) {
904
+ continue;
905
+ }
906
+ if (typeof argument === "string" || typeof argument === "number") {
907
+ if (resultString) {
908
+ resultString += " ";
909
+ }
910
+ resultString += argument;
911
+ continue;
912
+ }
913
+ if (Array.isArray(argument)) {
914
+ const nestedResult = classify(...argument);
915
+ if (nestedResult) {
916
+ if (resultString) {
917
+ resultString += " ";
918
+ }
919
+ resultString += nestedResult;
920
+ }
921
+ continue;
922
+ }
923
+ if (typeof argument === "object") {
924
+ for (const className in argument) {
925
+ if (argument[className]) {
926
+ if (resultString) {
927
+ resultString += " ";
928
+ }
929
+ resultString += className;
930
+ }
931
+ }
932
+ }
933
+ }
934
+ return resultString;
935
+ }
936
+ // src/helper/html.ts
937
+ function parseTemplateStringValue(val) {
938
+ if (isHTMLTemplateElement(val)) {
939
+ return val.innerHTML;
940
+ }
941
+ if (Component.isComponentClass(val)) {
942
+ const tagName = val.tagName;
943
+ if (!isTagName(tagName)) {
944
+ throw new PaletteError(203 /* TEMPLATE_INVALID_COMPONENT */, val.name, val.tagName);
945
+ }
946
+ return tagName;
947
+ }
948
+ if (typeof val === "string") {
949
+ return `<span ::swap="${val}"></span>`;
950
+ }
951
+ throw new PaletteError(200 /* TEMPLATE_INVALID_VALUE */, String(val));
952
+ }
953
+ function html(strings, ...values) {
954
+ const fullString = strings.reduce((acc, str, i) => {
955
+ const parsedValue = values[i] ? `${parseTemplateStringValue(values[i])}` : "";
956
+ return acc + str + parsedValue;
957
+ }, "");
958
+ const templateElement = document.createElement("template");
959
+ templateElement.innerHTML = fullString;
960
+ return templateElement;
961
+ }
1017
962
  // src/template/jobs/common.ts
1018
963
  var SKIPPED_JOB = Symbol("noop");
1019
964
 
@@ -1033,11 +978,7 @@ function prepareAttributeJob(plan, values) {
1033
978
  }
1034
979
  function runAttributeJobs(jobs) {
1035
980
  for (const [node, name, value] of jobs) {
1036
- if (value === null) {
1037
- node.removeAttribute(name);
1038
- } else {
1039
- node.setAttribute(name, value);
1040
- }
981
+ applyAttribute(node, name, value);
1041
982
  }
1042
983
  }
1043
984
 
@@ -1069,7 +1010,7 @@ function runConditionalRenderJobs(jobs) {
1069
1010
  const nodesToRemove = new Set;
1070
1011
  let node = plan.start;
1071
1012
  while (node && node !== plan.end) {
1072
- if (node instanceof HTMLElement) {
1013
+ if (isHTMLElement(node)) {
1073
1014
  nodesToRemove.add(node);
1074
1015
  }
1075
1016
  node = node.nextSibling;
@@ -1104,7 +1045,7 @@ function collectHTMLElements(start, end) {
1104
1045
  let node = start;
1105
1046
  const nodeSet = new Set;
1106
1047
  while (node && node !== end) {
1107
- if (node instanceof HTMLElement) {
1048
+ if (isHTMLElement(node)) {
1108
1049
  nodeSet.add(node);
1109
1050
  }
1110
1051
  node = node.nextSibling;
@@ -1145,7 +1086,7 @@ function prepareListRenderJob(plan, values) {
1145
1086
  context,
1146
1087
  root: rowRoot,
1147
1088
  template: rowTemplate,
1148
- attrMap: createAttributeMap(item)
1089
+ attrs: formatAttributeRecord(item)
1149
1090
  };
1150
1091
  listRenderContexts.set(key, jobItem);
1151
1092
  }
@@ -1171,9 +1112,9 @@ function runListRenderJobs(jobs) {
1171
1112
  const rootsToKeep = new Set;
1172
1113
  let existingDOMNodeIdx = 0;
1173
1114
  for (const renderItem of renderItems) {
1174
- const { root, attrMap, context, template } = renderItem;
1115
+ const { root, attrs: attrMap, context, template } = renderItem;
1175
1116
  const existingDOMNode = existingDOMNodes[existingDOMNodeIdx];
1176
- applyAttributeMap(root, attrMap);
1117
+ applyElementAttributes(root, attrMap);
1177
1118
  template.render(root, context);
1178
1119
  rootsToKeep.add(root);
1179
1120
  if (Object.is(existingDOMNode, root)) {
@@ -1206,11 +1147,11 @@ function prepareContentSwapJob(plan, values) {
1206
1147
  }
1207
1148
  return [plan, document.createTextNode(asStr)];
1208
1149
  } else if (value === null || value === undefined) {
1209
- if (plan.node instanceof Comment) {
1150
+ if (isComment(plan.node)) {
1210
1151
  return SKIPPED_JOB;
1211
1152
  }
1212
1153
  return [plan, document.createComment("empty")];
1213
- } else if (value instanceof HTMLElement) {
1154
+ } else if (isHTMLElement(value)) {
1214
1155
  if (Object.is(plan.node, value)) {
1215
1156
  return SKIPPED_JOB;
1216
1157
  }
@@ -1272,35 +1213,35 @@ function createJobsFromPlans(plans, newValues) {
1272
1213
  };
1273
1214
  for (const plan of plans) {
1274
1215
  switch (plan.type) {
1275
- case "cond": {
1216
+ case "cond" /* Conditional */: {
1276
1217
  const job = prepareConditionalRenderJob(plan, newValues);
1277
1218
  if (job !== SKIPPED_JOB) {
1278
1219
  jobs.conditionals.push(job);
1279
1220
  }
1280
1221
  break;
1281
1222
  }
1282
- case "attr": {
1223
+ case "attr" /* Attribute */: {
1283
1224
  const job = prepareAttributeJob(plan, newValues);
1284
1225
  if (job !== SKIPPED_JOB) {
1285
1226
  jobs.attributes.push(job);
1286
1227
  }
1287
1228
  break;
1288
1229
  }
1289
- case "each": {
1230
+ case "list" /* List */: {
1290
1231
  const job = prepareListRenderJob(plan, newValues);
1291
1232
  if (job !== SKIPPED_JOB) {
1292
1233
  jobs.lists.push(job);
1293
1234
  }
1294
1235
  break;
1295
1236
  }
1296
- case "swap": {
1237
+ case "swap" /* Swap */: {
1297
1238
  const job = prepareContentSwapJob(plan, newValues);
1298
1239
  if (job !== SKIPPED_JOB) {
1299
1240
  jobs.swaps.push(job);
1300
1241
  }
1301
1242
  break;
1302
1243
  }
1303
- case "tag": {
1244
+ case "tag" /* Tag */: {
1304
1245
  const job = prepareTagChangeJob(plan, newValues);
1305
1246
  if (job !== SKIPPED_JOB) {
1306
1247
  jobs.tags.push(job);
@@ -1356,7 +1297,7 @@ function prepareCompiledTemplate(compiled, prototypeFragment) {
1356
1297
  });
1357
1298
  let markNode = walker.nextNode();
1358
1299
  while (markNode) {
1359
- if (!(markNode instanceof HTMLElement)) {
1300
+ if (!isHTMLElement(markNode)) {
1360
1301
  continue;
1361
1302
  }
1362
1303
  const ref = markNode.getAttribute(REF_ATTR);
@@ -1383,7 +1324,7 @@ function prepareCompiledTemplate(compiled, prototypeFragment) {
1383
1324
  throw new PaletteError(3 /* MISSING_NODE_REF */);
1384
1325
  };
1385
1326
  for (const scheme of compiled.schemes) {
1386
- if (scheme.type === "each") {
1327
+ if (scheme.type === "list" /* List */) {
1387
1328
  const itemPrototype = getByNodeRef(scheme.nodeRef);
1388
1329
  const listParentNode = requireParentNode(itemPrototype);
1389
1330
  const rowRootPrototype = itemPrototype.cloneNode(false);
@@ -1394,7 +1335,7 @@ function prepareCompiledTemplate(compiled, prototypeFragment) {
1394
1335
  const rowTemplateElement = document.createElement("template");
1395
1336
  rowTemplateElement.content.appendChild(templateContentFragment);
1396
1337
  const plan = {
1397
- type: "each",
1338
+ type: "list" /* List */,
1398
1339
  notation: scheme.notation,
1399
1340
  keyNotation: scheme.keyNotation,
1400
1341
  listContainer: listParentNode,
@@ -1406,7 +1347,7 @@ function prepareCompiledTemplate(compiled, prototypeFragment) {
1406
1347
  rowRootsByKey: new Map
1407
1348
  };
1408
1349
  associatePlan(plan, scheme.notation.base);
1409
- } else if (scheme.type === "cond") {
1350
+ } else if (scheme.type === "cond" /* Conditional */) {
1410
1351
  const firstBranch = scheme.branches[0];
1411
1352
  if (!firstBranch) {
1412
1353
  throw new PaletteError(0 /* INVARIANT */);
@@ -1417,7 +1358,7 @@ function prepareCompiledTemplate(compiled, prototypeFragment) {
1417
1358
  const lastBranchRoot = getByNodeRef(lastBranch.branchRootRef);
1418
1359
  const endComment = createCommentAfter(lastBranchRoot);
1419
1360
  const plan = {
1420
- type: "cond",
1361
+ type: "cond" /* Conditional */,
1421
1362
  start: startComment,
1422
1363
  end: endComment,
1423
1364
  branches: []
@@ -1443,16 +1384,16 @@ function prepareCompiledTemplate(compiled, prototypeFragment) {
1443
1384
  });
1444
1385
  }
1445
1386
  }
1446
- } else if (scheme.type === "swap" || scheme.type === "tag") {
1387
+ } else if (scheme.type === "swap" /* Swap */ || scheme.type === "tag" /* Tag */) {
1447
1388
  const plan = {
1448
1389
  type: scheme.type,
1449
1390
  notation: scheme.notation,
1450
1391
  node: getByNodeRef(scheme.nodeRef)
1451
1392
  };
1452
1393
  associatePlan(plan, scheme.notation.base);
1453
- } else if (scheme.type === "attr") {
1394
+ } else if (scheme.type === "attr" /* Attribute */) {
1454
1395
  const plan = {
1455
- type: "attr",
1396
+ type: "attr" /* Attribute */,
1456
1397
  attribute: scheme.attribute,
1457
1398
  notation: scheme.notation,
1458
1399
  node: getByNodeRef(scheme.nodeRef)
@@ -1470,6 +1411,9 @@ function prepareCompiledTemplate(compiled, prototypeFragment) {
1470
1411
 
1471
1412
  // src/template/template.ts
1472
1413
  class Template {
1414
+ static isTemplate(value) {
1415
+ return value !== null && typeof value === "object" && value instanceof Template;
1416
+ }
1473
1417
  static cache = {
1474
1418
  clear: () => {
1475
1419
  fragmentCache.clear();
@@ -1572,28 +1516,67 @@ class Template {
1572
1516
  this._latestRenderedValues = resolvedValues;
1573
1517
  };
1574
1518
  }
1575
- // src/component/delegator.ts
1576
- class EventDelegator {
1577
- static nextListenerId = 0;
1578
- static processTargetDescriptor(targetDescriptor) {
1579
- if (targetDescriptor instanceof HTMLElement) {
1580
- if (targetDescriptor.id.length) {
1581
- return `#${targetDescriptor.id}`;
1519
+ // src/task-scheduler.ts
1520
+ class TaskScheduler {
1521
+ _queues = {
1522
+ tasks: [],
1523
+ frames: []
1524
+ };
1525
+ _promises = {};
1526
+ _resolvers = {};
1527
+ _onError;
1528
+ constructor(onError) {
1529
+ this._onError = onError;
1530
+ }
1531
+ _flushQueue = (queueType) => {
1532
+ const queue = this._queues[queueType];
1533
+ try {
1534
+ while (queue.length) {
1535
+ const task = queue.shift();
1536
+ task?.();
1537
+ }
1538
+ } catch (error) {
1539
+ if (this._onError) {
1540
+ this._onError(error);
1582
1541
  } else {
1583
- const generatedId = `listen-${EventDelegator.nextListenerId++}`;
1584
- targetDescriptor.setAttribute("data-listener-id", generatedId);
1585
- return `[data-listener-id="${generatedId}"]`;
1542
+ throw error;
1586
1543
  }
1587
- } else if (typeof targetDescriptor === "function") {
1588
- if (true) {
1589
- if (targetDescriptor.tagName.length === 0) {
1590
- console.warn(`[Component] Automatic listener setup failure: Component ${targetDescriptor.name} has no defined tagname`);
1591
- }
1544
+ } finally {
1545
+ this._resolvers[queueType]?.();
1546
+ this._resolvers[queueType] = undefined;
1547
+ this._promises[queueType] = undefined;
1548
+ }
1549
+ };
1550
+ _schedule = (type, task, prioritize = false) => {
1551
+ const queue = this._queues[type];
1552
+ if (prioritize) {
1553
+ queue.unshift(task);
1554
+ } else {
1555
+ queue.push(task);
1556
+ }
1557
+ if (!this._promises[type]) {
1558
+ this._promises[type] = new Promise((resolve) => {
1559
+ this._resolvers[type] = resolve;
1560
+ });
1561
+ if (type === "frames") {
1562
+ requestAnimationFrame(this._flushQueue.bind(this, "frames"));
1563
+ } else {
1564
+ queueMicrotask(this._flushQueue.bind(this, "tasks"));
1592
1565
  }
1593
- return targetDescriptor.tagName;
1594
1566
  }
1595
- return targetDescriptor;
1596
- }
1567
+ return this._promises[type];
1568
+ };
1569
+ scheduleMicrotask = (task, prioritize = false) => {
1570
+ return this._schedule("tasks", task, prioritize);
1571
+ };
1572
+ scheduleFrameTask = (task, prioritize = false) => {
1573
+ return this._schedule("frames", task, prioritize);
1574
+ };
1575
+ }
1576
+ var asyncTasks = new TaskScheduler;
1577
+
1578
+ // src/component/delegator.ts
1579
+ class EventDelegator {
1597
1580
  _root;
1598
1581
  _rootListeners = new Map;
1599
1582
  _events = new Map;
@@ -1624,7 +1607,7 @@ class EventDelegator {
1624
1607
  const listener = (event) => {
1625
1608
  const handlersForEvent = this._handlersForEvent(eventName);
1626
1609
  const { target } = event;
1627
- if (target === null || !(target instanceof Node)) {
1610
+ if (target === null || !isNode(target)) {
1628
1611
  return;
1629
1612
  }
1630
1613
  let node = target;
@@ -1638,7 +1621,7 @@ class EventDelegator {
1638
1621
  if (node === this._root) {
1639
1622
  break;
1640
1623
  }
1641
- if (!(node instanceof Element)) {
1624
+ if (!isElement(node)) {
1642
1625
  node = node.parentNode;
1643
1626
  continue;
1644
1627
  }
@@ -1656,7 +1639,7 @@ class EventDelegator {
1656
1639
  return;
1657
1640
  }
1658
1641
  node = node.parentNode;
1659
- if (node === this._root || node instanceof ShadowRoot) {
1642
+ if (node === this._root || isShadowRoot(node)) {
1660
1643
  break;
1661
1644
  }
1662
1645
  }
@@ -1687,6 +1670,7 @@ class EventDelegator {
1687
1670
  // src/component/component.ts
1688
1671
  var MAX_SEQUENTIAL_RENDERS = 1e4;
1689
1672
  var BLANK_TEMPLATE = document.createElement("template");
1673
+ var HOST_TARGET = ":host";
1690
1674
  var RootMode;
1691
1675
  ((RootMode2) => {
1692
1676
  RootMode2["Closed"] = "closed";
@@ -1694,212 +1678,161 @@ var RootMode;
1694
1678
  })(RootMode ||= {});
1695
1679
 
1696
1680
  class Component extends HTMLElement {
1681
+ static isComponent(value) {
1682
+ return typeof value === "object" && value !== null && value instanceof Component;
1683
+ }
1684
+ static isComponentClass(value) {
1685
+ return value !== null && typeof value === "function" && (value.prototype instanceof Component || value === Component);
1686
+ }
1687
+ static readComponentTagName(componentClass) {
1688
+ const { tagName } = componentClass;
1689
+ if (true) {
1690
+ if (tagName === "") {
1691
+ console.warn(`[Component] Empty tag name when reading from component ${componentClass.name}`);
1692
+ }
1693
+ }
1694
+ return tagName;
1695
+ }
1697
1696
  static tagName = "";
1698
1697
  static template = BLANK_TEMPLATE;
1699
- static styles = [];
1698
+ static style = [];
1700
1699
  static observedAttributes = [];
1701
1700
  static rootMode = "closed" /* Closed */;
1702
- initialState;
1703
- computedProperties;
1704
- liveAttributes;
1705
- _template;
1706
- _root;
1707
- _state;
1708
- _delegator;
1709
- _ownListeners = new Set;
1710
- _cleanupFn;
1711
- _renderInternals = {
1701
+ root;
1702
+ template;
1703
+ _cmp = {
1712
1704
  isFinalized: false,
1713
- initialRenderComplete: false,
1714
- willRender: false,
1705
+ isInitialRenderComplete: false,
1706
+ isRenderScheduled: false,
1715
1707
  isRendering: false,
1716
- sequentialRenders: 0,
1717
- postRenderCallbacks: [],
1718
- lastRenderedAttributeMap: new Map,
1719
- trackedAttributeChanges: new Map
1708
+ sequentialRenderCount: 0,
1709
+ lastRenderedAttributes: {},
1710
+ pendingAttributeChanges: {}
1720
1711
  };
1721
1712
  constructor() {
1722
1713
  super();
1723
- const { template: template2, styles, rootMode } = this.constructor;
1724
- const newStyles = Array.isArray(styles) ? styles : typeof styles === "object" ? [styles] : [css`${styles}`];
1725
- this._root = this.attachShadow({ mode: rootMode });
1726
- this._root.adoptedStyleSheets.push(...newStyles);
1727
- this._template = template2 instanceof Template ? template2 : new Template(template2);
1714
+ const {
1715
+ template: template2,
1716
+ style,
1717
+ rootMode: mode
1718
+ } = this.constructor;
1719
+ this.root = this.attachShadow({ mode });
1720
+ let adoptStyles = [];
1721
+ if (Array.isArray(style)) {
1722
+ adoptStyles = style;
1723
+ } else if (style instanceof CSSStyleSheet) {
1724
+ adoptStyles = [style];
1725
+ } else {
1726
+ const adoptSheet = new CSSStyleSheet;
1727
+ adoptSheet.replaceSync(style);
1728
+ adoptStyles = [adoptSheet];
1729
+ }
1730
+ this.root.adoptedStyleSheets.push(...adoptStyles);
1731
+ this.template = Template.isTemplate(template2) ? template2 : new Template(template2);
1728
1732
  }
1729
1733
  _getRenderContext(attr) {
1734
+ const state = this._cmp.state?.raw ?? {};
1735
+ const computed = this.computedProperties?.call(this, attr, state);
1730
1736
  return {
1731
- attr: Object.fromEntries(attr),
1732
- data: typeof this.computedProperties === "function" ? this.computedProperties() : this.computedProperties,
1733
- state: this._state ? this._state.current : undefined
1737
+ attr,
1738
+ data: computed,
1739
+ state
1734
1740
  };
1735
1741
  }
1736
1742
  _escalateError(error) {
1737
- let node = this.parentNode;
1738
- while (node) {
1739
- if (node instanceof Component && "onError" in node && typeof node.onError === "function") {
1743
+ const isErrorHandled = walkParents(this, (node) => {
1744
+ if (node instanceof Component && node.onError) {
1740
1745
  node.onError(error);
1741
- return;
1742
- } else if (node instanceof ShadowRoot) {
1743
- node = node.host;
1744
- } else {
1745
- node = node.parentNode;
1746
+ return true;
1746
1747
  }
1748
+ });
1749
+ if (!isErrorHandled) {
1750
+ throw error;
1747
1751
  }
1748
- throw error;
1749
1752
  }
1750
1753
  _reportError(error) {
1751
- if (!this.onError) {
1752
- this._escalateError(error);
1753
- } else {
1754
- this.onError(error);
1755
- }
1754
+ this.onError ? this.onError(error) : this._escalateError(error);
1756
1755
  }
1757
- _executeAttributeChangeHandlers = () => {
1758
- if (!this.liveAttributes) {
1759
- return;
1760
- }
1761
- const prevAttrs = this._renderInternals.lastRenderedAttributeMap;
1762
- const trackedChanges = new Map(this._renderInternals.trackedAttributeChanges);
1763
- this._renderInternals.trackedAttributeChanges.clear();
1764
- for (const [name, val] of trackedChanges) {
1765
- const config = this.liveAttributes[name];
1766
- if (!config) {
1767
- continue;
1768
- }
1769
- if ("onChange" in config) {
1770
- const previousValue = prevAttrs.get(name) ?? null;
1771
- if (config && previousValue !== val) {
1772
- config.onChange?.call(this, val, previousValue);
1773
- }
1774
- }
1775
- }
1776
- };
1777
- _reflectLiveAttributes = () => {
1778
- if (!this.liveAttributes) {
1779
- return;
1780
- }
1781
- const toSet = [];
1782
- for (const [name, config] of Object.entries(this.liveAttributes)) {
1783
- if ("reflect" in config) {
1784
- const val = serializeAttribute(config.reflect?.call(this));
1785
- const current = this.getAttribute(name);
1786
- if (val !== current) {
1787
- toSet.push([name, val]);
1788
- }
1789
- }
1790
- }
1791
- for (const [name, val] of toSet) {
1792
- this.reflectAttribute(name, val);
1793
- }
1794
- };
1795
- _performUpdate = () => {
1756
+ _render = () => {
1796
1757
  try {
1797
- this._renderInternals.isRendering = true;
1798
- this._renderInternals.willRender = false;
1799
- this._executeAttributeChangeHandlers();
1800
- const prevAttrs = this._renderInternals.lastRenderedAttributeMap;
1801
- this.beforeUpdate?.();
1802
- const newAttributes = createAttributeMap(this);
1803
- this._template.render(this.root, this._getRenderContext(newAttributes));
1804
- this._renderInternals.lastRenderedAttributeMap = newAttributes;
1758
+ this._cmp.isRendering = true;
1759
+ this._cmp.isRenderScheduled = false;
1760
+ const prevAttrs = this._cmp.lastRenderedAttributes;
1761
+ this.beforeUpdate?.(this._cmp.pendingAttributeChanges);
1762
+ const newAttributes = getElementAttributes(this);
1763
+ this.template.render(this.root, this._getRenderContext(newAttributes));
1764
+ this._cmp.lastRenderedAttributes = newAttributes;
1805
1765
  this.afterUpdate?.(prevAttrs);
1806
- this._reflectLiveAttributes();
1807
- if (this._renderInternals.postRenderCallbacks.length) {
1808
- const callbacks = this._renderInternals.postRenderCallbacks;
1809
- this._renderInternals.postRenderCallbacks = [];
1810
- for (const fn of callbacks) {
1811
- fn();
1812
- }
1813
- }
1814
- if (this._renderInternals.willRender) {
1815
- this._renderInternals.sequentialRenders += 1;
1816
- if (this._renderInternals.sequentialRenders >= MAX_SEQUENTIAL_RENDERS) {
1817
- throw new PaletteError(306 /* MAX_SEQUENTIAL_RENDERS */, `${this._renderInternals.sequentialRenders}`);
1766
+ if (this._cmp.isRenderScheduled) {
1767
+ this._cmp.sequentialRenderCount += 1;
1768
+ if (this._cmp.sequentialRenderCount >= MAX_SEQUENTIAL_RENDERS) {
1769
+ throw new PaletteError(306 /* MAX_SEQUENTIAL_RENDERS */, `${this._cmp.sequentialRenderCount}`);
1818
1770
  }
1819
- this._performUpdate();
1771
+ this._render();
1820
1772
  } else {
1821
- this._renderInternals.sequentialRenders = 0;
1773
+ this._cmp.sequentialRenderCount = 0;
1822
1774
  }
1823
1775
  } catch (error) {
1824
- this._renderInternals.willRender = false;
1776
+ this._cmp.isRenderScheduled = false;
1825
1777
  this._reportError(error);
1826
1778
  } finally {
1827
- this._renderInternals.isRendering = false;
1828
- }
1829
- };
1830
- _scheduleUpdate = () => {
1831
- if (this._renderInternals.willRender) {
1832
- return;
1779
+ this._cmp.isRendering = false;
1833
1780
  }
1834
- this._renderInternals.willRender = true;
1835
- if (this._renderInternals.isRendering) {
1836
- return;
1837
- }
1838
- requestAnimationFrame(this._performUpdate);
1839
1781
  };
1840
1782
  _adoptState(state) {
1841
- if (Object.is(this._state, state)) {
1783
+ if (Object.is(this._cmp.state, state)) {
1842
1784
  return;
1843
1785
  }
1844
- if (this._state) {
1845
- this._state.removeListener(this._scheduleUpdate);
1846
- this._scheduleUpdate();
1786
+ if (this._cmp.state) {
1787
+ this._cmp.state.removeListener(this.render);
1788
+ this.render();
1847
1789
  }
1848
- const incomingStateObj = state instanceof State ? state : new State(state);
1849
- this._state = incomingStateObj;
1850
- this._state.removeListener(this._scheduleUpdate);
1851
- this._state.addListener(this._scheduleUpdate);
1790
+ const incomingStateObj = State.isState(state) ? state : new State(state);
1791
+ this._cmp.state = incomingStateObj;
1792
+ this._cmp.state.removeListener(this.render);
1793
+ this._cmp.state.addListener(this.render);
1852
1794
  }
1853
1795
  connectedCallback() {
1854
- if (this._renderInternals.initialRenderComplete) {
1796
+ if (this._cmp.isInitialRenderComplete) {
1855
1797
  return;
1856
1798
  }
1857
- if (true) {
1858
- const liveAttributes = new Set(Object.keys(this.liveAttributes ?? {}));
1859
- const observedAttributes = new Set(this.constructor.observedAttributes);
1860
- if (!observedAttributes.isSupersetOf(liveAttributes)) {
1861
- const componentName = this.constructor.name;
1862
- console.warn(`[Component] Component ${componentName} has defined Live Attributes ` + `which are not listed in the Observed Attributes list. As such, ` + `they may not function properly. Be sure to set the static ` + `observedAttributes property on your Component, or use the ` + `define() helper to automatically ensure the correct configuration`);
1863
- }
1864
- }
1865
- queueMicrotask(() => {
1799
+ asyncTasks.scheduleMicrotask(() => {
1866
1800
  try {
1867
- this._renderInternals.isRendering = true;
1868
- this._renderInternals.willRender = false;
1869
- const attributes2 = createAttributeMap(this);
1801
+ this._cmp.isRendering = true;
1802
+ this._cmp.isRenderScheduled = false;
1803
+ const attributes2 = getElementAttributes(this);
1870
1804
  if (this.initialState) {
1871
- const init = typeof this.initialState === "object" ? this.initialState : this.initialState();
1872
- this._adoptState(init);
1805
+ this._adoptState(this.initialState());
1873
1806
  }
1874
- this._template.render(this.root, this._getRenderContext(attributes2));
1875
- this._reflectLiveAttributes();
1876
- this._renderInternals.lastRenderedAttributeMap = attributes2;
1877
- this._renderInternals.initialRenderComplete = true;
1878
- this._cleanupFn = this.script?.() ?? undefined;
1807
+ this.template.render(this.root, this._getRenderContext(attributes2));
1808
+ this._cmp.lastRenderedAttributes = attributes2;
1809
+ this._cmp.isInitialRenderComplete = true;
1810
+ this._cmp.cleanupFn = this.script?.() ?? undefined;
1879
1811
  } catch (error) {
1880
1812
  this._reportError(error);
1881
1813
  } finally {
1882
- this._renderInternals.isRendering = false;
1814
+ this._cmp.isRendering = false;
1883
1815
  }
1884
1816
  });
1885
1817
  }
1886
1818
  disconnectedCallback() {
1887
- if (this._renderInternals.isFinalized) {
1819
+ if (this._cmp.isFinalized) {
1888
1820
  return;
1889
1821
  }
1890
- queueMicrotask(() => {
1891
- if (this.isConnected || !this._renderInternals.initialRenderComplete) {
1822
+ asyncTasks.scheduleMicrotask(() => {
1823
+ if (this.isConnected || !this._cmp.isInitialRenderComplete) {
1892
1824
  return;
1893
1825
  }
1894
- this._renderInternals.isFinalized = true;
1826
+ this._cmp.isFinalized = true;
1895
1827
  try {
1896
- this._delegator?.cleanup();
1897
- if (this._ownListeners && this._ownListeners.size > 0) {
1898
- for (const listener of this._ownListeners) {
1828
+ const { delegator, cleanupFn, hostListeners } = this._cmp;
1829
+ delegator?.cleanup();
1830
+ if (hostListeners && hostListeners.size > 0) {
1831
+ for (const listener of hostListeners) {
1899
1832
  this.removeEventListener(listener.event, listener.handler);
1900
1833
  }
1901
1834
  }
1902
- this._cleanupFn?.();
1835
+ cleanupFn?.();
1903
1836
  } catch (error) {
1904
1837
  this._reportError(error);
1905
1838
  } finally {
@@ -1912,148 +1845,90 @@ class Component extends HTMLElement {
1912
1845
  });
1913
1846
  }
1914
1847
  attributeChangedCallback(name, _, newValue) {
1915
- if (this._renderInternals.isRendering) {
1916
- return;
1917
- }
1918
- if (newValue === this._renderInternals.lastRenderedAttributeMap?.get(name)) {
1848
+ if (this._cmp.isRendering) {
1919
1849
  return;
1920
1850
  }
1921
- this._renderInternals.trackedAttributeChanges.set(name, newValue);
1922
- if (!this._renderInternals.willRender) {
1923
- this._scheduleUpdate();
1851
+ this._cmp.pendingAttributeChanges[name] = newValue;
1852
+ if (!this._cmp.isRenderScheduled) {
1853
+ this.render();
1924
1854
  }
1925
1855
  }
1926
- get root() {
1927
- return this._root;
1928
- }
1929
1856
  get isMounted() {
1930
- return this.isConnected && this._renderInternals.initialRenderComplete;
1857
+ return this.isConnected && this._cmp.isInitialRenderComplete;
1931
1858
  }
1932
- get state() {
1933
- if (!this._state) {
1859
+ getState() {
1860
+ if (!this._cmp.state) {
1934
1861
  throw new PaletteError(301 /* MISSING_STATE */);
1935
1862
  }
1936
- return this._state.live;
1863
+ return this._cmp.state;
1864
+ }
1865
+ get state() {
1866
+ return this.getState().live;
1937
1867
  }
1938
1868
  set state(newState) {
1939
1869
  this._adoptState(newState);
1940
1870
  }
1941
- getState() {
1942
- if (!this._state) {
1943
- throw new PaletteError(301 /* MISSING_STATE */);
1871
+ render = () => {
1872
+ if (this._cmp.isRenderScheduled) {
1873
+ return;
1944
1874
  }
1945
- return this._state;
1946
- }
1947
- requestRender(callback) {
1948
- if (callback) {
1949
- this._renderInternals.postRenderCallbacks.push(callback);
1875
+ this._cmp.isRenderScheduled = true;
1876
+ if (this._cmp.isRendering) {
1877
+ return;
1950
1878
  }
1951
- this._scheduleUpdate();
1952
- }
1879
+ asyncTasks.scheduleFrameTask(this._render);
1880
+ };
1953
1881
  listen(targetDescriptor, eventName, eventHandler) {
1954
- const query = EventDelegator.processTargetDescriptor(targetDescriptor);
1955
- if (query === ":host" || query === ":HOST") {
1956
- if (this._ownListeners === undefined) {
1957
- this._ownListeners = new Set;
1958
- }
1882
+ if (targetDescriptor === HOST_TARGET || targetDescriptor === this) {
1883
+ if (!this._cmp.hostListeners) {
1884
+ this._cmp.hostListeners = new Set;
1885
+ }
1886
+ const hostListeners = this._cmp.hostListeners;
1887
+ const entry = {
1888
+ event: eventName,
1889
+ handler: eventHandler
1890
+ };
1891
+ hostListeners.add(entry);
1959
1892
  this.addEventListener(eventName, eventHandler);
1960
- this._ownListeners.add({
1961
- handler: eventHandler,
1962
- event: eventName
1963
- });
1964
- return;
1965
- }
1966
- if (!this._delegator) {
1967
- this._delegator = new EventDelegator(this.root);
1968
- }
1969
- this._delegator.addListener(eventName, eventHandler, query);
1970
- }
1971
- stopListening(targetDescriptor, eventName, eventHandler) {
1972
- const query = EventDelegator.processTargetDescriptor(targetDescriptor);
1973
- if (query === ":host" || query === ":HOST") {
1974
- if (this._ownListeners === undefined) {
1975
- this._ownListeners = new Set;
1976
- }
1977
- this.removeEventListener(eventName, eventHandler);
1978
- for (const listener of this._ownListeners) {
1979
- if (listener.event === eventName && listener.handler === eventHandler) {
1980
- this._ownListeners.delete(listener);
1981
- }
1982
- }
1983
- return;
1893
+ return () => {
1894
+ this.removeEventListener(eventName, eventHandler);
1895
+ hostListeners.delete(entry);
1896
+ };
1984
1897
  }
1985
- if (!this._delegator) {
1986
- return;
1898
+ if (typeof targetDescriptor === "object") {
1899
+ throw new PaletteError(2 /* INVALID_CALLSITE */);
1987
1900
  }
1988
- this._delegator.removeListener(eventName, eventHandler, query);
1989
- }
1990
- dispatchEvent(event, detail, options) {
1991
- if (event instanceof Event) {
1992
- return super.dispatchEvent(event);
1901
+ if (!this._cmp.delegator) {
1902
+ this._cmp.delegator = new EventDelegator(this.root);
1993
1903
  }
1994
- const opts = {
1995
- bubbles: true,
1996
- cancelable: true,
1997
- composed: true,
1998
- ...options ?? {}
1904
+ const delegator = this._cmp.delegator;
1905
+ const query = typeof targetDescriptor === "string" ? targetDescriptor : Component.readComponentTagName(targetDescriptor);
1906
+ delegator.addListener(eventName, eventHandler, query);
1907
+ return () => {
1908
+ delegator.removeListener(eventName, eventHandler, query);
1999
1909
  };
2000
- return super.dispatchEvent(new CustomEvent(event, {
2001
- detail,
2002
- ...opts
2003
- }));
2004
- }
2005
- querySelector(query) {
2006
- return this._root.querySelector(query);
2007
1910
  }
2008
- querySelectorAll(query) {
2009
- return this._root.querySelectorAll(query);
2010
- }
2011
- getElementById(id) {
2012
- if (this._root instanceof ShadowRoot) {
2013
- return this._root.getElementById(id);
1911
+ dispatchEvent(a, b) {
1912
+ if (typeof a === "object" && typeof b === "undefined") {
1913
+ return super.dispatchEvent(a);
1914
+ } else if (typeof a === "string") {
1915
+ return super.dispatchEvent(new CustomEvent(a, {
1916
+ bubbles: true,
1917
+ cancelable: true,
1918
+ composed: true,
1919
+ ...b
1920
+ }));
2014
1921
  } else {
2015
- return HTMLElement.prototype.querySelector.call(this, `#${id}`);
1922
+ throw new PaletteError(2 /* INVALID_CALLSITE */);
2016
1923
  }
2017
1924
  }
2018
- requireElementById(id) {
2019
- const lookup = this.getElementById(id);
1925
+ ref(id) {
1926
+ const lookup = this.root.getElementById(id);
2020
1927
  if (!lookup) {
2021
1928
  throw new PaletteError(300 /* MISSING_ELEMENT */);
2022
1929
  }
2023
1930
  return lookup;
2024
1931
  }
2025
- setAttribute(name, value) {
2026
- const serialized = serializeAttribute(value);
2027
- if (serialized === null) {
2028
- HTMLElement.prototype.removeAttribute.call(this, name);
2029
- } else {
2030
- HTMLElement.prototype.setAttribute.call(this, name, serialized);
2031
- }
2032
- }
2033
- getAttribute(name, defaultValue) {
2034
- const value = HTMLElement.prototype.getAttribute.call(this, name);
2035
- if (defaultValue === undefined) {
2036
- return value;
2037
- }
2038
- if (typeof defaultValue === "number") {
2039
- if (value === null) {
2040
- return defaultValue;
2041
- }
2042
- const parsed = Number(value);
2043
- if (Number.isNaN(parsed)) {
2044
- return defaultValue;
2045
- }
2046
- return parsed;
2047
- }
2048
- throw new PaletteError(2 /* INVALID_CALLSITE */);
2049
- }
2050
- reflectAttribute(name, value) {
2051
- const current = this.getAttribute(name);
2052
- const reflected = serializeAttribute(value);
2053
- if (current !== reflected) {
2054
- this.setAttribute(name, reflected);
2055
- }
2056
- }
2057
1932
  toString() {
2058
1933
  const { tagName, name } = this.constructor;
2059
1934
  const computedName = tagName === "" ? name : tagName;
@@ -2106,44 +1981,35 @@ function define(a, b) {
2106
1981
  }
2107
1982
  const {
2108
1983
  template: template2 = BLANK_TEMPLATE2,
2109
- styles = [],
2110
- shadowRootMode = "closed",
2111
- initialState,
2112
- computedProperties = {},
2113
- liveAttributes = {},
1984
+ style = [],
1985
+ rootMode = "closed" /* Closed */,
1986
+ initialState: stateInitializer,
1987
+ computedProperties,
1988
+ observedAttributes = [],
2114
1989
  script,
2115
1990
  beforeUpdate,
2116
1991
  afterUpdate,
2117
1992
  finalize,
2118
1993
  onError
2119
1994
  } = definition;
2120
- const fullObservedAttributes = Array.from(new Set([...Object.keys(liveAttributes)]));
1995
+ let getInitialState;
1996
+ if (stateInitializer) {
1997
+ getInitialState = typeof stateInitializer === "function" ? stateInitializer : () => stateInitializer;
1998
+ }
2121
1999
  const cls = class extends Component {
2122
2000
  static tagName = tagName;
2123
2001
  static template = template2;
2124
- static styles = styles;
2125
- static observedAttributes = [...fullObservedAttributes];
2126
- static shadowRootMode = shadowRootMode;
2127
- constructor() {
2128
- super();
2129
- this.initialState = typeof initialState === "function" ? initialState.bind(this) : initialState;
2130
- this.computedProperties = typeof computedProperties === "function" ? computedProperties.bind(this) : computedProperties;
2131
- this.liveAttributes = liveAttributes;
2132
- for (const def of Object.values(this.liveAttributes)) {
2133
- if (def.onChange) {
2134
- def.onChange = def.onChange.bind(this);
2135
- }
2136
- if (def.reflect) {
2137
- def.reflect = def.reflect.bind(this);
2138
- }
2139
- }
2140
- this.script = script?.bind(this) ?? undefined;
2141
- this.beforeUpdate = beforeUpdate?.bind(this) ?? undefined;
2142
- this.afterUpdate = afterUpdate?.bind(this) ?? undefined;
2143
- this.finalize = finalize?.bind(this) ?? undefined;
2144
- this.onError = onError?.bind(this) ?? undefined;
2145
- }
2002
+ static style = style;
2003
+ static observedAttributes = [...observedAttributes];
2004
+ static shadowRootMode = rootMode;
2146
2005
  };
2006
+ cls.prototype.initialState = getInitialState;
2007
+ cls.prototype.computedProperties = computedProperties;
2008
+ cls.prototype.script = script;
2009
+ cls.prototype.beforeUpdate = beforeUpdate;
2010
+ cls.prototype.afterUpdate = afterUpdate;
2011
+ cls.prototype.finalize = finalize;
2012
+ cls.prototype.onError = onError;
2147
2013
  customElements.define(tagName, cls);
2148
2014
  return cls;
2149
2015
  }
@@ -2151,10 +2017,10 @@ function define(a, b) {
2151
2017
  if (typeof window !== "undefined") {
2152
2018
  window.__PALETTE_DEVTOOLS__ = {
2153
2019
  dumpCacheMetrics: () => {
2154
- console.log("Compiled Templates Cache", compiledTemplateCache.getMetrics());
2155
- console.log("HTML Fragments Cache", fragmentCache.getMetrics());
2156
- console.log("Notation Accessor Cache", valueAccessorCache.getMetrics());
2157
- console.log("Parsed Notations Cache", parsedNotationCache.getMetrics());
2020
+ console.log("Compiled Templates", compiledTemplateCache.getMetrics());
2021
+ console.log("HTML Fragments", fragmentCache.getMetrics());
2022
+ console.log("Notation Accessor", valueAccessorCache.getMetrics());
2023
+ console.log("Parsed Notations", parsedNotationCache.getMetrics());
2158
2024
  }
2159
2025
  };
2160
2026
  }
@@ -2170,5 +2036,5 @@ export {
2170
2036
  Component
2171
2037
  };
2172
2038
 
2173
- //# debugId=86B5A91FBB0A820D64756E2164756E21
2174
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2Vycm9ycy50cyIsICJzcmMvdXRpbC9hdHRyaWJ1dGVzLnRzIiwgInNyYy91dGlsL2VsZW1lbnQtbWF0Y2gudHMiLCAic3JjL3V0aWwvbHJ1LWNhY2hlLnRzIiwgInNyYy91dGlsL2ZyYWdtZW50cy50cyIsICJzcmMvaGVscGVyL2Nzcy50cyIsICJzcmMvaGVscGVyL2h0bWwudHMiLCAic3JjL3N0YXRlL3N0YXRlLnRzIiwgInNyYy90ZW1wbGF0ZS9jb25zdGFudC50cyIsICJzcmMvdGVtcGxhdGUvc3ludGF4LnRzIiwgInNyYy90ZW1wbGF0ZS91dGlsLnRzIiwgInNyYy90ZW1wbGF0ZS9jb21waWxlLnRzIiwgInNyYy90ZW1wbGF0ZS9qb2JzL2NvbW1vbi50cyIsICJzcmMvdGVtcGxhdGUvam9icy9hdHRyaWJ1dGUudHMiLCAic3JjL3RlbXBsYXRlL2pvYnMvY29uZGl0aW9uYWwudHMiLCAic3JjL3RlbXBsYXRlL2pvYnMvbGlzdC50cyIsICJzcmMvdGVtcGxhdGUvam9icy9zd2FwLnRzIiwgInNyYy90ZW1wbGF0ZS9qb2JzL3RhZy50cyIsICJzcmMvdGVtcGxhdGUvam9icy9pbmRleC50cyIsICJzcmMvdGVtcGxhdGUvcHJlcGFyZS50cyIsICJzcmMvdGVtcGxhdGUvdGVtcGxhdGUudHMiLCAic3JjL2NvbXBvbmVudC9kZWxlZ2F0b3IudHMiLCAic3JjL2NvbXBvbmVudC9jb21wb25lbnQudHMiLCAic3JjL2NvbXBvbmVudC9mYWN0b3J5LnRzIiwgInNyYy9kZXZ0b29scy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICIvKlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cbi8qKlxuICogUG9zc2libGUgZXJyb3IgdHlwZXMgZm9yIHtAbGluayBQYWxldHRlRXJyb3J9XG4gKlxuICogQ29kZXMgYXJlIGNhdGVnb3JpemVkIGludG8gZ3JvdXBzIGJ5IHRoZSAxMDAnczpcbiAqXG4gKiAtIDAgLSA5OTogSW52YXJpYW50c1xuICogLSAxMDAgLSAxOTk6IEN1c3RvbSBFbGVtZW50cyAvIEVudmlyb25tZW50IEVycm9yc1xuICogLSAyMDAgLSAyOTk6IFRlbXBsYXRpbmcgRXJyb3JzXG4gKiAtIDMwMCAtIDM5OTogUnVudGltZSBFcnJvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gRXJyb3JDb2RlIHtcbiAgLy8gMCAtIDk5OiBJbnZhcmlhbnRzXG4gIElOVkFSSUFOVCA9IDAsXG4gIElOVkFMSURfRU5WID0gMSxcbiAgSU5WQUxJRF9DQUxMU0lURSA9IDIsXG4gIE1JU1NJTkdfTk9ERV9SRUYgPSAzLFxuXG4gIC8vIDEwMCAtIDE5OTogQ3VzdG9tIEVsZW1lbnRzIEVycm9yc1xuICBJTlZBTElEX1RBR05BTUUgPSAxMDAsXG5cbiAgLy8gMjAwIC0gMjk5OiBUZW1wbGF0ZSBFcnJvcnNcbiAgVEVNUExBVEVfSU5WQUxJRF9WQUxVRSA9IDIwMCxcbiAgVEVNUExBVEVfSU5WQUxJRF9OT1RBVElPTl9TWU5UQVggPSAyMDEsXG4gIFRFTVBMQVRFX01JU1NJTkdfTk9UQVRJT04gPSAyMDIsXG4gIFRFTVBMQVRFX0lOVkFMSURfQ09NUE9ORU5UID0gMjAzLFxuICBURU1QTEFURV9JTlZBTElEX0xJU1RfREFUQSA9IDIwNCxcbiAgVEVNUExBVEVfTUlTU0lOR19MSVNUX0tFWSA9IDIwNSxcbiAgVEVNUExBVEVfRFVQTElDQVRFX0xJU1RfS0VZID0gMjA2LFxuICBURU1QTEFURV9JTlZBTElEX0NPTkRJVElPTkFMID0gMjA3LFxuICBURU1QTEFURV9JTlZBTElEX0tFWV9ESVJFQ1RJVkUgPSAyMDgsXG4gIFRFTVBMQVRFX1BBUkVOVF9SRVFVSVJFRCA9IDIwOSxcblxuICAvLyAzMDAgLSAzOTk6IFJ1bnRpbWUgRXJyb3JzXG4gIE1JU1NJTkdfRUxFTUVOVCA9IDMwMCxcbiAgTUlTU0lOR19TVEFURSA9IDMwMSxcbiAgSU5WQUxJRF9DT05URU5UID0gMzAyLFxuICBJTlZBTElEX1NUQVRFX0tFWSA9IDMwMyxcbiAgSU5WQUxJRF9TVEFURV9VUERBVEUgPSAzMDQsXG4gIFNUQVRFX0xPQ0tFRCA9IDMwNSxcbiAgTUFYX1NFUVVFTlRJQUxfUkVOREVSUyA9IDMwNixcbn1cblxuZnVuY3Rpb24gZ2V0RGV2RXJyb3IoY29kZTogRXJyb3JDb2RlKSB7XG4gIGNvbnN0IERFVl9FUlJPUl9JTkZPOiBSZWNvcmQ8RXJyb3JDb2RlLCBzdHJpbmc+ID0ge1xuICAgIFtFcnJvckNvZGUuSU5WQVJJQU5UXTogYFxuSU5WQVJJQU5UXG5BIGNvbmRpdGlvbiBoYXMgb2NjdXJyZWQgd2hpY2ggc2hvdWxkIG5ldmVyIGhhcHBlbiwgc3VjaCBhcyBhIGNvZGUgcGF0aCB0aGF0XG5zaG91bGRuJ3QgYmUgcmVhY2hhYmxlIHdoZW4gdXNpbmcgY29ycmVjdCB0eXBlcywgb3IgYSBkaXNhbGxvd2VkIHN0YXRlLlxuYCxcblxuICAgIFtFcnJvckNvZGUuSU5WQUxJRF9FTlZdOiBgXG5JTlZBTElEX0VOVlxuRmFpbGVkIHRvIGZpbmQgYSBjdXN0b20gZWxlbWVudHMgcmVnaXN0cnkgaW4gdGhpcyBlbnZpcm9ubWVudC4gSXMgYSB3aW5kb3dcbmdsb2JhbCBhdmFpbGFibGUgd2l0aCBhIGN1c3RvbUVsZW1lbnRzIHByb3BlcnR5P1xuYCxcbiAgICBbRXJyb3JDb2RlLklOVkFMSURfQ0FMTFNJVEVdOiBgXG5JTlZBTElEX0NBTExTSVRFXG5BIGZ1bmN0aW9uIHdhcyBpbnZva2VkIHdpdGggYW4gaW52YWxpZCBzZXQgb2YgcGFyYW1ldGVycy4gICBcbmAsXG5cbiAgICBbRXJyb3JDb2RlLklOVkFMSURfVEFHTkFNRV06IGBcbklOVkFMSURfVEFHTkFNRVxuRmFpbGVkIHRvIGRldGVybWluZSBhIHZhbGlkIEhUTUwgVGFnIHRvIHVzZSB3aGVuIHJlZ2lzdGVyaW5nIGEgY29tcG9uZW50IGFzIGFcbmN1c3RvbSBlbGVtZW50LiBTcGVjaWZ5IGEgc3RhdGljIHJlYWRvbmx5IHRhZ05hbWUgcHJvcGVydHkgb24geW91ciBjb21wb25lbnRcbmNsYXNzIG9yIHByb3ZpZGUgYSB0YWdOYW1lIGFyZ3VtZW50IHRvIENvbXBvbmVudC5yZWdpc3Rlci5cblxuQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBkaXJlY3RseSByZWdpc3RlciB5b3VyIGVsZW1lbnQgYXMgeW91IHdvdWxkIGFueSBvdGhlclxuSFRNTCBjdXN0b20gZWxlbWVudDogY3VzdG9tRWxlbWVudHMuZGVmaW5lKFwibXktdGFnXCIsIE15Q29tcG9uZW50Q2xhc3MpO1xuYCxcblxuICAgIFtFcnJvckNvZGUuTUlTU0lOR19FTEVNRU5UXTogYFxuTUlTU0lOR19FTEVNRU5UXG5BbiBlbGVtZW50IHdhcyBleHBlY3RlZCB0byBleGlzdCBidXQgd2FzIG5vdCBmb3VuZCB3aGVuIHRoZSBET00gd2FzIHF1ZXJpZWQuXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5NSVNTSU5HX1NUQVRFXTogYFxuTUlTU0lOR19TVEFURVxuQSBDb21wb25lbnQncyByZWFjdGl2ZSBzdGF0ZSB3YXMgYWNjZXNzZWQsIGJ1dCBubyBpbml0aWFsU3RhdGUgaXMgZGVmaW5lZCBmb3JcbnRoZSBDb21wb25lbnQncyBjbGFzcy4gSW5pdGlhbCBzdGF0ZSBtdXN0IGJlIGRlZmluZWQgYXMgYW4gb2JqZWN0IG9yIGZ1bmN0aW9uLlxuYCxcblxuICAgIFtFcnJvckNvZGUuSU5WQUxJRF9DT05URU5UXTogYFxuSU5WQUxJRF9DT05URU5UXG5UcmllZCB0byBzZXQgYSB2YWx1ZSBhcyBjb250ZW50IGluIGEgdGVtcGxhdGUsIGJ1dCB0aGUgdmFsdWUgd2FzIG5vdCBhIHN1cHBvcnRlZFxudHlwZS4gVmFsdWVzIG11c3QgYmUgYSBzdHJpbmcsIEhUTUxFbGVtZW50LlxuXG5JbnN0ZWFkLCBnb3QgJXM6ICVzLlxuYCxcblxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9WQUxVRV06IGBcblRFTVBMQVRFX0lOVkFMSURcblRoZSB2YWx1ZSAlcyBjYW5ub3QgYmUgaW50ZXJwb2xhdGVkIHZpYSB0aGUgVGVtcGxhdGUgaHRtbCBzdHJpbmcgaGVscGVyLlxuVmFsdWVzIG1heSBvbmx5IGJlIEhUTUxUZW1wbGF0ZUVsZW1lbnRzICh0ZW1wbGF0ZSBjb250ZW50IGlzIGFkb3B0ZWQpIG9yXG5zdHJpbmdzIChzaG9ydGhhbmQgZm9yIGEgOjpzd2FwIGRpcmVjdGl2ZSBvbiBhbiBlbGVtZW50KVxuYCxcblxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9OT1RBVElPTl9TWU5UQVhdOiBgXG5URU1QTEFURV9JTlZBTElEX05PVEFUSU9OXG5BIHRlbXBsYXRlIHZhbHVlIG5vdGF0aW9uIGZhaWxlZCB0byBwYXJzZS4gTm90YXRpb25zIG11c3QgYmVnaW4gd2l0aCBvbmUgb2ZcbkAsICQsICosIG9yICMsIGZvbGxvd2VkIGJ5IGEgZG90LXNlcGFyYXRlZCBwYXRoIG9mIGFjY2Vzc29yIG5hbWVzLiBPcHRpb25hbGx5LFxubm90YXRpb25zIG1heSBoYXZlIG1vZGlmaWVycyBzdWNoIGFzIHRoZSAhIG1vZGlmaWVyLlxuXG5UaGUgbm90YXRpb24gdGhhdCBmYWlsZWQgdG8gcGFyc2Ugd2FzIFwiJXNcIlxuYCxcbiAgICBbRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfQ09NUE9ORU5UXTogYFxuVEVNUExBVEVfSU5WQUxJRF9DT01QT05FTlRcbkZhaWxlZCB0byBpbnRlcnBvbGF0ZSBhIENvbXBvbmVudCBpbiBhbiBodG1sIHRlbXBsYXRlIHN0cmluZyBkdWUgdG8gdGhlXG5Db21wb25lbnQgaGF2aW5nIGFuIGludmFsaWQgdGFnTmFtZSBwcm9wZXJ0eS5cblxuQ29tcG9uZW50IFwiJXNcIiBoYXMgYW4gaW52YWxpZCB0YWdOYW1lIHByb3BlcnR5IFwiJXNcIlxuICAgIGAsXG5cbiAgICBbRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfTElTVF9EQVRBXTogYFxuVEVNUExBVEVfSU5WQUxJRF9MSVNUXG5BIHRlbXBsYXRlIGZhaWxlZCB0byByZW5kZXIgYmVjYXVzZSBhbiA6OmVhY2ggZGlyZWN0aXZlIGZldGNoZWQgYSB2YWx1ZSB3aGljaFxud2FzIG5vdCBhbiBhcnJheSBvZiBhY3Rpb25hYmxlIGRhdGEuXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5NSVNTSU5HX05PREVfUkVGXTogYFxuVEVNUExBVEVfSU5WQUxJRF9OT0RFX1JFRlxuQSB0ZW1wbGF0ZSBmYWlsZWQgdG8gcHJlcGFyZSBhIG5vZGUgZnJvbSBhIGNvbXBpbGVkIHNvdXJjZS4gVHlwaWNhbGx5LCB0aGlzXG5tZWFucyBzb21ldGhpbmcgaXMgYnJva2VuIHdpdGhpbiB0aGUgY29tcGlsZWQgdGVtcGxhdGUgcmF0aGVyIHRoYW4gYW4gZXJyb3Igd2l0aFxudGhlIHRlbXBsYXRlIGNvbnRlbnQgaXRzZWxmLlxuYCxcblxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfTUlTU0lOR19MSVNUX0tFWV06IGBcblRFTVBMQVRFX01JU1NJTkdfTElTVF9LRVlcbkEgdGVtcGxhdGUgZmFpbGVkIHRvIGNvbXBpbGUgYmVjYXVzZSBhbiA6OmVhY2ggZGlyZWN0aXZlIHdhcyBmb3VuZCBvbiBhbiBlbGVtZW50XG53aXRob3V0IGEgY29ycmVzcG9uZGluZyA6OmtleSBkaXJlY3RpdmUuIDo6ZWFjaCBkaXJlY3RpdmVzIG11c3QgaGF2ZSBhIDo6a2V5XG5kaXJlY3RpdmUgc3BlY2lmaWVkIG9uIHRoZSBzYW1lIGVsZW1lbnQsIHdob3NlIG5vdGF0aW9uIGV2YWx1YXRlcyB0byBhIHVuaXF1ZVxudmFsdWUgZm9yIGVhY2ggaXRlbSBpbiB0aGUgbGlzdC5cblxuRXhhbXBsZTogPGxpIDo6ZWFjaD1cIiRpdGVtc1wiIDo6a2V5PVwiI2lkXCI+IC4uLiA8L2xpPlxuYCxcblxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfRFVQTElDQVRFX0xJU1RfS0VZXTogYFxuVEVNUExBVEVfRFVQTElDQVRFX0xJU1RfS0VZXG5BIGxpc3QgZmFpbGVkIHRvIHJlbmRlciBiZWNhdXNlIGl0ZW0ga2V5ICVzIGFwcGVhcmVkIG11bHRpcGxlIHRpbWVzIHdoZW5cbnJlc29sdmluZyBsaXN0IGl0ZW0ga2V5cy4gRWFjaCA6OmtleSBkaXJlY3RpdmUgbXVzdCByZWZlcmVuY2UgYSBub3RhdGlvbiB3aG9zZVxudmFsdWUgaXMgdW5pcXVlIGZvciBlYWNoIGxpc3QgaXRlbS5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfQ09ORElUSU9OQUxdOiBgXG5URU1QTEFURV9JTlZBTElEX0NPTkRJVElPTkFMXG5BIHRlbXBsYXRlIGZhaWxlZCB0byBjb21waWxlIGR1ZSB0byBhbiBpbnZhbGlkIHVzZSBvZiBjb25kaXRpb25hbCBkaXJlY3RpdmVzLlxuXG5Db25kaXRpb25hbCBlbGVtZW50cyBtdXN0IGJlIHNpYmxpbmdzLiBUaGUgZmlyc3QgY29uZGl0aW9uYWwgYnJhbmNoIG11c3QgdXNlIGFuXG46OmlmIGRpcmVjdGl2ZSwgZm9sbG93ZWQgYnkgemVybyBvciBtb3JlIDo6ZWxzZS1pZiBkaXJlY3RpdmVzLCBhbmQgZmluYWxseSB6ZXJvXG5vciBvbmUgOjplbHNlIGRpcmVjdGl2ZS5cblxuOjppZiBhbmQgOjplbHNlLWlmIGRpcmVjdGl2ZXMgbXVzdCBzcGVjaWZ5IGEgbm90YXRpb24gdG8gZXZhbHVhdGUuIDo6ZWxzZSBkb2VzXG5ub3QgdGFrZSBhbnkgdmFsdWVzIGFuZCBpcyBqdXN0IGEgYmluYXJ5IGF0dHJpYnV0ZS5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLlRFTVBMQVRFX01JU1NJTkdfTk9UQVRJT05dOiBgXG5URU1QTEFURV9NSVNTSU5HX05PVEFUSU9OXG5BIHRlbXBsYXRlIGZhaWxlZCB0byBjb21waWxlIGJlY2F1c2UgYSAlcyBkaXJlY3RpdmUgZGlkIG5vdCBoYXZlIGFuIGFzc29jaWF0ZWRcbm5vdGF0aW9uIGRlc3BpdGUgcmVxdWlyaW5nIG9uZS5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLklOVkFMSURfU1RBVEVfS0VZXTogYFxuSU5WQUxJRF9TVEFURV9LRVlcblRyaWVkIHRvIGFjY2VzcyBhIHN0YXRlIHByb3BlcnR5IHdoaWNoIGRvZXMgbm90IGV4aXN0XG5cbktleSBwYXRoOiAlc1xuYCxcblxuICAgIFtFcnJvckNvZGUuSU5WQUxJRF9TVEFURV9VUERBVEVdOiBgXG5JTlZBTElEX1NUQVRFX1VQREFURVxuQSBDb21wb25lbnQncyBzZXRTdGF0ZSgpIHdhcyBjYWxsZWQgd2l0aCBhIHZhbHVlIHdoaWNoIGNvdWxkIG5vdCBiZSBwYXRjaGVkIGluXG50byB0aGUgZXhpc3RpbmcgY29tcG9uZW50IHN0YXRlLlxuXG5zZXRTdGF0ZSgpIHRha2VzIGEgcGFydGlhbCBvYmplY3QgZGVzY3JpYmluZyBzdGF0ZSBrZXlzIHRvIHVwZGF0ZS5cblxuSW5zdGVhZCwgcmVjZWl2ZWQ6ICVzXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5TVEFURV9MT0NLRURdOiBgXG5TVEFURV9MT0NLRURcbkEgU3RhdGUgcmVjZWl2ZWQgYSByZXF1ZXN0IHRvIHVwZGF0ZSBvciBsb2NrIHdoaWxlIGFscmVhZHkgbG9ja2VkLlxuU3RhdGVzIG1heSBiZSBsb2NrZWQgdXNpbmcgdGhlIC5sb2NrKCkgbWV0aG9kIGFuZCB1bmxvY2tlZCB1c2luZyB0aGUgLnVubG9jaygpXG5tZXRob2QuIFN0YXRlcyBsb2NrIGR1cmluZyBhc3luYyBtdXRhdGlvbnMgZG9uZSB0aHJvdWdoIHRoZSAubXV0YXRlQXN5bmMoKVxubWV0aG9kIGlmIFwidHJ1ZVwiIGlzIHBhc3NlZCBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlci5cblxuWW91IGNhbiBjaGVjayB0aGUgbG9jayBzdGF0dXMgb2YgYSBTdGF0ZSBpbnN0YW5jZSB3aXRoIC5pc0xvY2tlZFxuYCxcblxuICAgIFtFcnJvckNvZGUuTUFYX1NFUVVFTlRJQUxfUkVOREVSU106IGBcbk1BWF9TRVFVRU5USUFMX1JFTkRFUlNcbkEgY29tcG9uZW50IGhhcyBlcnJvcmVkIGFmdGVyIHJlLXJlbmRlcmluZyBtb3JlIHRoYW4gJXMgdGltZXMgaW4gdGhlIHNhbWUgZnJhbWUuXG5cblRoaXMgdHlwaWNhbGx5IGhhcHBlbnMgYmVjYXVzZSBzdGF0ZSBvciBsaXZlIGF0dHJpYnV0ZXMgYXJlIGJlaW5nIG1vZGlmaWVkXG5kdXJpbmcgYSByZW5kZXIgbGlmZWN5Y2xlIG1ldGhvZCBzdWNoIGFzIGJlZm9yZVVwZGF0ZSgpIG9yIGFmdGVyVXBkYXRlKCkuIElmXG5zdGF0ZSBjaGFuZ2VzIHVuY29uZGl0aW9uYWxseSBkdXJpbmcgYSByZW5kZXIsIHRoZSByZW5kZXIgd2lsbCBpbmZpbml0ZWx5IGxvb3AuXG5VcGRhdGluZyByZW5kZXIgc291cmNlIGRhdGEgZHVyaW5nIGEgcmVuZGVyIGN5Y2xlIGlzIHN1cHBvcnRlZCwgYnV0IGluZmluaXRlXG51cGRhdGUgbG9vcHMgbWF5IG9jY3VyIGlmIHVuY2hlY2tlZC5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfS0VZX0RJUkVDVElWRV06IGBcblRFTVBMQVRFX0lOVkFMSURfS0VZX0RJUkVDVElWRVxuQSB0ZW1wbGF0ZSBmYWlsZWQgdG8gY29tcGlsZSBiZWNhdXNlIGEgOjprZXkgZGlyZWN0aXZlIHdhcyBmb3VuZCBvbiBhbiBlbGVtZW50XG53aXRoIG5vIGFzc29jaWF0ZWQgOjplYWNoIGRpcmVjdGl2ZS4gOjprZXkgZGlyZWN0aXZlcyBjYW4gb25seSBiZSB1c2VkIGluXG5hc3NvY2lhdGlvbiB3aXRoIGxpc3QgcmVuZGVyaW5nIHZpYSA6OmVhY2guXG5gLFxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfUEFSRU5UX1JFUVVJUkVEXTogYFxuVEVNUExBVEVfUEFSRU5UX1JFUVVJUkVEXG5BIHRlbXBsYXRlIGZhaWxlZCB0byBjb21waWxlIGR1ZSB0byBhbiBlbGVtZW50IHdoaWNoIHJlcXVpcmVzIGEgcGFyZW50IGhhdmluZ1xubm8gYXZhaWxhYmxlIHBhcmVudCBpbiB0aGUgdGVtcGxhdGUuXG5cbjo6ZWFjaCBhbmQgOjppZi86OmVsc2UtaWYvOjplbHNlIGVsZW1lbnRzIG11c3QgaGF2ZSBhIHBhcmVudCBub2RlLlxuYCxcbiAgfTtcblxuICByZXR1cm4gREVWX0VSUk9SX0lORk9bY29kZV07XG59XG5cbi8qKlxuICogQW4gZXJyb3Igb3JpZ2luYXRpbmcgZnJvbSB3aXRoaW4gYSBQYWxldHRlIHN1YnN5c3RlbS5cbiAqXG4gKiBJbiB0aGUgYGRldmVsb3BtZW50YCBlbnZpcm9ubWVudCwgdGhlIGVycm9yIHdpbGwgc3VyZmFjZSB3aXRoIGV4dGVuZGVkIGluZm9cbiAqIGFib3V0IHRoZSBlcnJvciBhbmQgYW55IGRldGFpbHMgd2hpY2ggbWF5IGJlIHJlbGV2YW50IHRvIGhlbHAgd2l0aCBkZWJ1Z2dpbmcuXG4gKlxuICogSW4gdGhlIGBwcm9kdWN0aW9uYCBlbnZpcm9ubWVudCwgYSBtaW5pbWFsIGVycm9yIG9ubHkgc3VyZmFjaW5nIHRoZSBudW1lcmljXG4gKiBlcnJvciBjb2RlIGlzIHRocm93biBpbnN0ZWFkLlxuICpcbiAqIENvZGVzIGFyZSBjYXRlZ29yaXplZCBpbnRvIGdyb3VwcyBieSB0aGUgMTAwJ3M6XG4gKlxuICogLSAwIC0gOTk6IEludmFyaWFudHNcbiAqIC0gMTAwIC0gMTk5OiBDdXN0b20gRWxlbWVudHMgLyBFbnZpcm9ubWVudCBFcnJvcnNcbiAqIC0gMjAwIC0gMjk5OiBUZW1wbGF0aW5nIEVycm9yc1xuICogLSAzMDAgLSAzOTk6IFJ1bnRpbWUgRXJyb3JzXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWxldHRlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIG5hbWUgPSBcIlBhbGV0dGVFcnJvclwiO1xuICBjb2RlOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoY29kZTogbnVtYmVyLCAuLi52YWx1ZXM6IHN0cmluZ1tdKSB7XG4gICAgbGV0IG1lc3NhZ2UgPSBgQ29kZTogJHtjb2RlfWA7XG4gICAgaWYgKF9fREVWX18pIHtcbiAgICAgIG1lc3NhZ2UgKz0gZ2V0RGV2RXJyb3IoY29kZSk7XG5cbiAgICAgIGZvciAoY29uc3QgdmFsIG9mIHZhbHVlcykge1xuICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKGAlc2AsIFN0cmluZyh2YWwpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICB9XG59XG4iLAogICAgIi8qXG4gKiBDb3B5cmlnaHQgwqkgUnVzdGljIEFyY2FkZSwgTExDIDIwMjZcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5cbmltcG9ydCB7IEVycm9yQ29kZSwgUGFsZXR0ZUVycm9yIH0gZnJvbSBcIiNlcnJvclwiO1xuXG4vKiogQW4gYXR0cmlidXRlIHZhbHVlIGFzIHJlYWQgZnJvbSBhIERPTSBlbGVtZW50ICovXG50eXBlIEF0dHJpYnV0ZVZhbHVlID0gc3RyaW5nIHwgbnVsbDtcblxuLyoqIEEgTWFwIG9mIHN0cmluZyBhdHRyaWJ1dGUgbmFtZXMgdG8ge0BsaW5rIEF0dHJpYnV0ZVZhbHVlfSAqL1xudHlwZSBBdHRyaWJ1dGVNYXAgPSBNYXA8c3RyaW5nLCBBdHRyaWJ1dGVWYWx1ZT47XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVBdHRyaWJ1dGUodmFsdWU6IHVua25vd24pOiBBdHRyaWJ1dGVWYWx1ZSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgcmV0dXJuIGAke3ZhbHVlfWA7XG4gIH1cblxuICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gZmFsc2UgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBdHRyaWJ1dGVNYXAoXG4gIHNvdXJjZTogb2JqZWN0IHwgTWFwPHN0cmluZywgdW5rbm93bj4gfCBIVE1MRWxlbWVudCxcbik6IEF0dHJpYnV0ZU1hcCB7XG4gIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmcgfCBudWxsPigpO1xuXG4gIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBzb3VyY2UuZ2V0QXR0cmlidXRlTmFtZXMoKSkge1xuICAgICAgbWFwLnNldChuYW1lLCBzZXJpYWxpemVBdHRyaWJ1dGUoc291cmNlLmdldEF0dHJpYnV0ZShuYW1lKSkpO1xuICAgIH1cbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIE1hcCkge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBzb3VyY2UpIHtcbiAgICAgIG1hcC5zZXQoa2V5LCBzZXJpYWxpemVBdHRyaWJ1dGUodmFsKSk7XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJvYmplY3RcIiAmJiBzb3VyY2UgIT09IG51bGwpIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgT2JqZWN0LmVudHJpZXMoc291cmNlKSkge1xuICAgICAgbWFwLnNldChrZXksIHNlcmlhbGl6ZUF0dHJpYnV0ZSh2YWwpKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hcDtcbiAgfVxuXG4gIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLklOVkFSSUFOVCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUF0dHJpYnV0ZU1hcChcbiAgdGFyZ2V0OiBIVE1MRWxlbWVudCxcbiAgYXR0cnM6IEF0dHJpYnV0ZU1hcCxcbik6IHZvaWQge1xuICBjb25zdCBjdXJyZW50TmFtZXMgPSBuZXcgU2V0KHRhcmdldC5nZXRBdHRyaWJ1dGVOYW1lcygpKTtcbiAgY29uc3QgaW5jb21pbmdOYW1lcyA9IG5ldyBTZXQoYXR0cnMua2V5cygpKTtcbiAgY29uc3QgYXR0cmlidXRlc1RvUmVtb3ZlID0gY3VycmVudE5hbWVzLmRpZmZlcmVuY2UoaW5jb21pbmdOYW1lcyk7XG5cbiAgZm9yIChjb25zdCBhdHRyIG9mIGF0dHJpYnV0ZXNUb1JlbW92ZSkge1xuICAgIHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoYXR0cik7XG4gIH1cblxuICBmb3IgKGNvbnN0IFtuYW1lLCB2YWxdIG9mIGF0dHJzKSB7XG4gICAgaWYgKHZhbCA9PT0gbnVsbCkge1xuICAgICAgdGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZShuYW1lLCB2YWwpO1xuICAgIH1cbiAgfVxufVxuIiwKICAgICIvKlxuICogQ29weXJpZ2h0IMKpIFJ1c3RpYyBBcmNhZGUsIExMQyAyMDI2XG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuXG4vKipcbiAqIENoZWNrIGlmIGEgZ2l2ZW4gc3RyaW5nIGlzIGEgdmFsaWQgaHRtbCB0YWduYW1lLCBvcHRpbWl6ZWQgZm9yIGhvdCBwYXRocy5cbiAqXG4gKiBAcmVtYXJrc1xuICogVGhpcyBmdW5jdGlvbiBhdm9pZHMgdXNpbmcgdGhlIHJlZ2V4IGVuZ2luZSBmb3IgcGVyZm9ybWFuY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVGFnTmFtZShzdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNoYXIgPSBzdHIuY2hhckF0KGkpO1xuXG4gICAgaWYgKFxuICAgICAgIShcbiAgICAgICAgY2hhciA9PT0gXCItXCIgfHxcbiAgICAgICAgKGNoYXIgPj0gXCJBXCIgJiYgY2hhciA8PSBcIlpcIikgfHxcbiAgICAgICAgKGNoYXIgPj0gXCJhXCIgJiYgY2hhciA8PSBcInpcIilcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBBIHBlcmZvcm1hbmNlIG9wdGltaXplZCB2ZXJzaW9uIG9mIGAubWF0Y2hlcygpYCB3aGljaCBpbmNsdWRlcyBmYXN0ZXJcbiAqIG1hdGNoaW5nIHN0cmF0ZWdpZXMgZm9yIGNvbW1vbiBxdWVyaWVzLlxuICpcbiAqIEByZW1hcmtzXG4gKiBPcHRpbWl6ZWQgcXVlcnkgdHlwZXM6XG4gKlxuICogLSBTaW5nbGUgSUQgc2VsZWN0b3IgYFwiI2lkZW50aWZpZXJcImBcbiAqIC0gU2luZ2xlIGNsYXNzIHNlbGVjdG9yIGBcIi5jbGFzc25hbWVcImBcbiAqIC0gVGFnbmFtZSBzZWxlY3RvciBgXCJidXR0b25cImBcbiAqIC0gU2ltcGxlIGF0dHJpYnV0ZSBzZWxlY3RvciBgXCJbYXR0cj0ndmFsdWUnXVwiYFxuICpcbiAqIEFsbCBvdGhlciB0eXBlcyBvZiBxdWVyaWVzIHVzZSB0aGUgYmFzZSAubWF0Y2hlcygpIGZvciBjb21wYXJpc29uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbGVtZW50TWF0Y2hlcyhlbGVtZW50OiBFbGVtZW50LCBxdWVyeTogc3RyaW5nKSB7XG4gIC8vIElmIHRoZSBxdWVyeSBpcyBhIHNpbXBsZSBJRCwgY2hlY2sgaXQgZGlyZWN0bHlcbiAgaWYgKFxuICAgIHF1ZXJ5WzBdID09PSBcIiNcIiAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCIgXCIpID09PSAtMSAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCIuXCIpID09PSAtMSAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCJbXCIpID09PSAtMSAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCI6XCIpID09PSAtMSAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCI+XCIpID09PSAtMVxuICApIHtcbiAgICByZXR1cm4gZWxlbWVudC5pZCA9PT0gcXVlcnkuc2xpY2UoMSk7XG4gIH1cblxuICAvLyBJZiB0aGUgcXVlcnkgaXMgYSBzaW1wbGUgY2xhc3NuYW1lLCBjaGVjayBpdCBkaXJlY3RseVxuICBpZiAoXG4gICAgcXVlcnlbMF0gPT09IFwiLlwiICYmXG4gICAgcXVlcnkuaW5kZXhPZihcIiBcIikgPT09IC0xICYmXG4gICAgcXVlcnkuaW5kZXhPZihcIiNcIikgPT09IC0xICYmXG4gICAgcXVlcnkuaW5kZXhPZihcIltcIikgPT09IC0xICYmXG4gICAgcXVlcnkuaW5kZXhPZihcIjpcIikgPT09IC0xICYmXG4gICAgcXVlcnkuaW5kZXhPZihcIj5cIikgPT09IC0xXG4gICkge1xuICAgIHJldHVybiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhxdWVyeS5zbGljZSgxKSk7XG4gIH1cblxuICAvLyBJZiB0aGUgcXVlcnkgaXMgZm9yIGp1c3QgYSB0YWduYW1lLCBjaGVjayBpdCBkaXJlY3RseVxuICBpZiAoaXNUYWdOYW1lKHF1ZXJ5KSkge1xuICAgIHJldHVybiBlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gcXVlcnkudG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIC8vIElmIHRoZSBxdWVyeSBpcyBmb3IgYSBzaW5nbGUgc2VsZWN0b3IgdmFsdWUsIGNoZWNrIGl0IGRpcmVjdGx5XG4gIGlmIChcbiAgICBxdWVyeVswXSA9PT0gXCJbXCIgJiZcbiAgICBxdWVyeVtxdWVyeS5sZW5ndGggLSAxXSA9PT0gXCJdXCIgJiZcbiAgICBxdWVyeS5pbmRleE9mKFwiIFwiKSA9PT0gLTEgJiZcbiAgICBxdWVyeS5pbmRleE9mKFwiOlwiKSA9PT0gLTFcbiAgKSB7XG4gICAgY29uc3QgYXR0ciA9IHF1ZXJ5LnNsaWNlKDEsIC0xKTtcbiAgICBjb25zdCBlcUluZGV4ID0gYXR0ci5pbmRleE9mKFwiPVwiKTtcbiAgICBpZiAoZXFJbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyKTtcbiAgICB9XG4gICAgY29uc3QgYXR0ck5hbWUgPSBhdHRyLnNsaWNlKDAsIGVxSW5kZXgpO1xuICAgIGNvbnN0IGF0dHJWYWx1ZSA9IGF0dHIuc2xpY2UoZXFJbmRleCArIDEpLnJlcGxhY2UoL15bXCInXXxbXCInXSQvZywgXCJcIik7XG4gICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJOYW1lKSA9PT0gYXR0clZhbHVlO1xuICB9XG5cbiAgLy8gT3RoZXJ3aXNlLCB1c2UgbmF0aXZlIGAubWF0Y2hlc2AgZm9yIGNvbXBsZXggc3R1ZmZcbiAgcmV0dXJuIGVsZW1lbnQubWF0Y2hlcyhxdWVyeSk7XG59XG4iLAogICAgIi8qXG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xudHlwZSBNZXRyaWNzID0ge1xuICBoaXRzOiBudW1iZXI7XG4gIG1pc3NlczogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgTFJVQ2FjaGVNZXRyaWNzID0ge1xuICBsb29rdXBzOiBudW1iZXI7XG4gIGhpdHM6IG51bWJlcjtcbiAgbWlzc2VzOiBudW1iZXI7XG4gIGNhcGFjaXR5OiBudW1iZXI7XG4gIGVudHJpZXM6IG51bWJlcjtcbiAgaGl0UmF0ZTogbnVtYmVyO1xufTtcblxuLyoqXG4gKiBBIHNpbXBsZSBpbi1tZW1vcnkgTFJVIENhY2hlIHVzaW5nIEphdmFTY3JpcHQgbWFwcy5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIENhY2hlZCBuZXR3b3JrIHJlcXVlc3RcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBBIGNhY2hlIG9mIEFQSSBVUkxzIHRvIHRoZWlyIHJldHVybmVkIHBheWxvYWRzXG4gKiBjb25zdCBjYWNoZSA9IG5ldyBMUlVDYWNoZTxzdHJpbmcsIEFQSVBheWxvYWQ+KCk7XG4gKlxuICogYXN5bmMgZnVuY3Rpb24gbWFrZVJlcXVlc3QodXJsOiBzdHJpbmcpIHtcbiAqICAgbGV0IGNhY2hlZCA9IGNhY2hlLmdldCh1cmwpO1xuICogICBpZiAoY2FjaGVkKSB7XG4gKiAgICAgcmV0dXJuIGNhY2hlZDtcbiAqICAgfVxuICpcbiAqICAgLy8gLi4uIE1ha2UgdGhlIHJlcXVlc3QgYW5kIGNhY2hlLnNldCgpIHRoZSByZXNwb25zZVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBMUlVDYWNoZTxLLCBWPiB7XG4gIHByaXZhdGUgX21heFNpemU6IG51bWJlcjtcbiAgcHJpdmF0ZSBfZGF0YTogTWFwPEssIFY+O1xuICBwcml2YXRlIF9tZXRyaWNzOiBNZXRyaWNzID0geyBoaXRzOiAwLCBtaXNzZXM6IDAgfTtcblxuICBjb25zdHJ1Y3RvcihtYXhTaXplOiBudW1iZXIgPSA1MDApIHtcbiAgICBpZiAobWF4U2l6ZSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJMUlUgQ2FjaGUgY2FwYWNpdHkgbXVzdCBiZSA+PSAxXCIpO1xuICAgIH1cblxuICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICB0aGlzLl9tZXRyaWNzID0geyBoaXRzOiAwLCBtaXNzZXM6IDAgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9tYXhTaXplID0gbWF4U2l6ZTtcbiAgICB0aGlzLl9kYXRhID0gbmV3IE1hcDxLLCBWPigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdHJpbSA9ICgpID0+IHtcbiAgICB3aGlsZSAodGhpcy5fZGF0YS5zaXplID4gdGhpcy5fbWF4U2l6ZSkge1xuICAgICAgY29uc3QgZmlyc3RLZXkgPSB0aGlzLl9kYXRhLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICBpZiAoZmlyc3RLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBYnN1cmRcIik7XG4gICAgICB9XG4gICAgICB0aGlzLl9kYXRhLmRlbGV0ZShmaXJzdEtleSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgY2FjaGUgcGVyZm9ybWFuY2UgbWV0cmljcyBmcm9tIHRoaXMgTFJVIENhY2hlIGluc3RhbmNlLlxuICAgKlxuICAgKiBJbiBkZXZlbG9wbWVudCBtb2RlLCB0aGlzIHJldHVybnMgaW5zaWdodHMgaW50byBoaXRzL21pc3NlcyBvZiB0aGUgY2FjaGUsXG4gICAqIGFzIHdlbGwgYXMgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBhbmQgZW50cnkgY291bnQuXG4gICAqXG4gICAqIEluIHByb2R1Y3Rpb24gbW9kZSwgdGhpcyByZXR1cm5zIGEgcGxhY2Vob2xkZXIgb2JqZWN0LCBhcyBtZXRyaWMgY29sbGVjdGlvblxuICAgKiBpcyBub3QgYWN0aXZlIGluIHByb2R1Y3Rpb24uXG4gICAqL1xuICBnZXRNZXRyaWNzKCk6IExSVUNhY2hlTWV0cmljcyB8IHZvaWQge1xuICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICBjb25zdCB7IGhpdHMgPSAwLCBtaXNzZXMgPSAwIH0gPSB0aGlzLl9tZXRyaWNzID8/IHt9O1xuICAgICAgY29uc3QgbG9va3VwcyA9IGhpdHMgKyBtaXNzZXM7XG4gICAgICBjb25zdCBoaXRSYXRlID0gbG9va3VwcyA9PT0gMCA/IDAgOiBoaXRzIC8gbG9va3VwcztcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbG9va3VwcyxcbiAgICAgICAgaGl0czogaGl0cyxcbiAgICAgICAgbWlzc2VzOiBtaXNzZXMsXG4gICAgICAgIGNhcGFjaXR5OiB0aGlzLl9tYXhTaXplLFxuICAgICAgICBlbnRyaWVzOiB0aGlzLl9kYXRhLnNpemUsXG4gICAgICAgIGhpdFJhdGUsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIG1heGltdW0gY2FjaGUgc2l6ZSBmb3IgdGhpcyBpbnN0YW5jZS4gSW1tZWRpYXRlbHkgdHJpZ2dlcnMgYVxuICAgKiBwdXJnZSBvZiBjYWNoZWQgY29udGVudHMgaWYgdGhlIG5ldyBjYXBhY2l0eSBpcyBsZXNzIHRoYW4gdGhlIGN1cnJlbnRcbiAgICogbnVtYmVyIG9mIGNhY2hlZCBlbnRyaWVzLlxuICAgKi9cbiAgc2V0Q2FwYWNpdHkgPSAobWF4U2l6ZTogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgaWYgKG1heFNpemUgPD0gMCAmJiBfX0RFVl9fKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiW1BhbGV0dGUgTFJVIENhY2hlXSBDYWNoZSBzaXplIGlzIDw9IDAuIENhY2hlIGlzIGRpc2FibGVkLlwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLl9tYXhTaXplID0gbWF4U2l6ZTtcbiAgICB0aGlzLl90cmltKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZldGNoIGEgdmFsdWUgZnJvbSB0aGUgY2FjaGUsIHJldHVybmluZyBgdW5kZWZpbmVkYCBpZiBubyB2YWx1ZSB3YXMgZm91bmRcbiAgICovXG4gIGdldChrZXk6IEspOiBWIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2RhdGEuZ2V0KGtleSk7XG5cbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKF9fREVWX18pIHtcbiAgICAgICAgdGhpcy5fbWV0cmljcy5taXNzZXMgKz0gMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gRGVsZXRlIGFuZCByZS1zZXQgdGhlIHZhbHVlIHRvIG1vdmUgdGhlIGtleSB0byB0aGUgZW5kIG9mIHRoZSBrZXkgbGlzdFxuICAgIHRoaXMuX2RhdGEuZGVsZXRlKGtleSk7XG4gICAgdGhpcy5fZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG5cbiAgICBpZiAoX19ERVZfXykge1xuICAgICAgdGhpcy5fbWV0cmljcy5oaXRzICs9IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIHZhbHVlIGluIHRoZSBjYWNoZS4gVGhpcyBhbHNvIG1vdmVzIHRoZSB2YWx1ZSB0byB0aGUgYmFjayBvZiB0aGUgbGlzdFxuICAgKiBvZiB2YWx1ZXMgdG8gY29uc2lkZXIgZXZpY3Rpbmcgd2hlbiB0aGUgY2FjaGUgaXMgZnVsbC5cbiAgICovXG4gIHNldChrZXk6IEssIHZhbHVlOiBWKTogdm9pZCB7XG4gICAgLy8gUmVtb3ZlIGlmIGV4aXN0cyB0byB1cGRhdGUgcG9zaXRpb25cbiAgICBpZiAodGhpcy5fZGF0YS5oYXMoa2V5KSkge1xuICAgICAgdGhpcy5fZGF0YS5kZWxldGUoa2V5KTtcbiAgICB9XG5cbiAgICB0aGlzLl9kYXRhLnNldChrZXksIHZhbHVlKTtcblxuICAgIGlmICh0aGlzLl9kYXRhLnNpemUgPiB0aGlzLl9tYXhTaXplKSB7XG4gICAgICB0aGlzLl90cmltKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBjb250ZW50cyBvZiB0aGlzIGNhY2hlIGluc3RhbmNlXG4gICAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLl9kYXRhLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGlzIGNhY2hlIGluc3RhbmNlXG4gICAqL1xuICBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLnNpemU7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTFJVQ2FjaGU7XG4iLAogICAgIi8qXG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuaW1wb3J0IExSVUNhY2hlIGZyb20gXCIuL2xydS1jYWNoZVwiO1xuXG5leHBvcnQgY29uc3QgZnJhZ21lbnRDYWNoZSA9IG5ldyBMUlVDYWNoZTxzdHJpbmcsIERvY3VtZW50RnJhZ21lbnQ+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBodG1sVG9GcmFnbWVudChodG1sOiBzdHJpbmcpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgY29uc3QgbG9va3VwID0gZnJhZ21lbnRDYWNoZS5nZXQoaHRtbCk7XG5cbiAgaWYgKGxvb2t1cCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGxvb2t1cC5jbG9uZU5vZGUodHJ1ZSkgYXMgRG9jdW1lbnRGcmFnbWVudDtcbiAgfVxuXG4gIGNvbnN0IHRlbXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG4gIHRlbXAuaW5uZXJIVE1MID0gaHRtbDtcbiAgZnJhZ21lbnRDYWNoZS5zZXQoaHRtbCwgdGVtcC5jb250ZW50KTtcbiAgcmV0dXJuIHRlbXAuY29udGVudC5jbG9uZU5vZGUodHJ1ZSkgYXMgRG9jdW1lbnRGcmFnbWVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhdmVGcmFnbWVudChodG1sOiBzdHJpbmcsIGZyYWdtZW50OiBEb2N1bWVudEZyYWdtZW50KTogdm9pZCB7XG4gIGZyYWdtZW50Q2FjaGUuc2V0KGh0bWwsIGZyYWdtZW50KTtcbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQ29tcG9uZW50IH0gZnJvbSBcIiNjb21wb25lbnRcIjtcbmltcG9ydCB7IEVycm9yQ29kZSwgUGFsZXR0ZUVycm9yIH0gZnJvbSBcIiNlcnJvclwiO1xuaW1wb3J0IHsgaXNUYWdOYW1lIH0gZnJvbSBcIiN1dGlsXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNTU1RlbXBsYXRlU3RyaW5nVmFsdWUoXG4gIHZhbDogc3RyaW5nIHwgdHlwZW9mIENvbXBvbmVudCxcbik6IHN0cmluZyB7XG4gIC8vIENvbnZlcnQgY29tcG9uZW50IHJlZnMgdG8gdGhlaXIgdGFnbmFtZXNcbiAgaWYgKHR5cGVvZiB2YWwgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGNvbnN0IHRhZ05hbWUgPSB2YWwudGFnTmFtZTtcbiAgICBpZiAoIWlzVGFnTmFtZSh0YWdOYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihcbiAgICAgICAgRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfQ09NUE9ORU5ULFxuICAgICAgICB2YWwubmFtZSxcbiAgICAgICAgdmFsLnRhZ05hbWUsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGFnTmFtZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuXG4gIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfVkFMVUUsIFN0cmluZyh2YWwpKTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiB7QGxpbmsgQ1NTU3R5bGVTaGVldH1zIGNvbnRhaW5pbmcgdGhlIHByb3ZpZGVkIENTU1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3NzKFxuICBzdHJpbmdzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSxcbiAgLi4udmFsdWVzOiAoc3RyaW5nIHwgdHlwZW9mIENvbXBvbmVudDxhbnk+KVtdXG4pOiBDU1NTdHlsZVNoZWV0IHtcbiAgbGV0IHJlc3VsdCA9IHN0cmluZ3NbMF0gPz8gXCJcIjtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IG5leHRWYWwgPSB2YWx1ZXNbaV0gPz8gXCJcIjtcbiAgICBjb25zdCBuZXh0U3RyID0gc3RyaW5nc1tpICsgMV0gPz8gXCJcIjtcbiAgICByZXN1bHQgKz0gcGFyc2VDU1NUZW1wbGF0ZVN0cmluZ1ZhbHVlKG5leHRWYWwpO1xuICAgIHJlc3VsdCArPSBuZXh0U3RyO1xuICB9XG5cbiAgY29uc3Qgc2hlZXQgPSBuZXcgQ1NTU3R5bGVTaGVldCgpO1xuICBzaGVldC5yZXBsYWNlU3luYyhyZXN1bHQpO1xuICByZXR1cm4gc2hlZXQ7XG59XG5cbnR5cGUgQ2xhc3NWYWx1ZSA9XG4gIHwgc3RyaW5nXG4gIHwgbnVtYmVyXG4gIHwgYm9vbGVhblxuICB8IHVuZGVmaW5lZFxuICB8IG51bGxcbiAgfCBDbGFzc0FycmF5XG4gIHwgQ2xhc3NPYmplY3Q7XG50eXBlIENsYXNzQXJyYXkgPSBDbGFzc1ZhbHVlW107XG50eXBlIENsYXNzT2JqZWN0ID0gUmVjb3JkPHN0cmluZywgYW55PjtcblxuLyoqXG4gKiBHaXZlbiBmbGV4aWJsZSBpbnB1dCwgZ2VuZXJhdGUgYSBzdHJpbmcgc3VpdGFibGUgZm9yIHNldHRpbmcgYXMgYW4gaHRtbCBjbGFzc1xuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3NpZnkoXCJteS1jbGFzc1wiLCBcImFub3RoZXItY2xhc3NcIikgLy8gXCJteS1jbGFzcyBhbm90aGVyLWNsYXNzXCJcbiAqIGNsYXNzaWZ5KFtcIm15LWNsYXNzXCIsIFwiYW5vdGhlci1jbGFzc1wiXSkgLy8gXCJteS1jbGFzcyBhbm90aGVyLWNsYXNzXCJcbiAqIGNsYXNzaWZ5KHsgZW5hYmxlZDogdHJ1ZSwgZGlzYWJsZWQ6IGZhbHNlIH0pIC8vIFwiZW5hYmxlZFwiXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzaWZ5KC4uLmFyZ3M6IENsYXNzVmFsdWVbXSk6IHN0cmluZyB7XG4gIGxldCByZXN1bHRTdHJpbmcgPSBcIlwiO1xuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhcmdzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IGFyZ3VtZW50ID0gYXJnc1tpbmRleF07XG5cbiAgICBpZiAoIWFyZ3VtZW50KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBTdHJpbmdzL251bXMgLT4gRGlyZWN0IGFwcGVuZFxuICAgIGlmICh0eXBlb2YgYXJndW1lbnQgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIGFyZ3VtZW50ID09PSBcIm51bWJlclwiKSB7XG4gICAgICBpZiAocmVzdWx0U3RyaW5nKSB7XG4gICAgICAgIHJlc3VsdFN0cmluZyArPSBcIiBcIjtcbiAgICAgIH1cbiAgICAgIHJlc3VsdFN0cmluZyArPSBhcmd1bWVudDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBhcnJheXMgcmVjdXJzaXZlbHlcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmd1bWVudCkpIHtcbiAgICAgIGNvbnN0IG5lc3RlZFJlc3VsdCA9IGNsYXNzaWZ5KC4uLmFyZ3VtZW50KTtcbiAgICAgIGlmIChuZXN0ZWRSZXN1bHQpIHtcbiAgICAgICAgaWYgKHJlc3VsdFN0cmluZykge1xuICAgICAgICAgIHJlc3VsdFN0cmluZyArPSBcIiBcIjtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHRTdHJpbmcgKz0gbmVzdGVkUmVzdWx0O1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIG9iamVjdHMgd2l0aCBjb25kaXRpb25hbCBjbGFzcyBuYW1lc1xuICAgIGlmICh0eXBlb2YgYXJndW1lbnQgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGZvciAoY29uc3QgY2xhc3NOYW1lIGluIGFyZ3VtZW50KSB7XG4gICAgICAgIC8vIE9ubHkgaW5jbHVkZSBjbGFzcyBuYW1lIGlmIGl0cyB2YWx1ZSBpcyB0cnV0aHlcbiAgICAgICAgaWYgKGFyZ3VtZW50W2NsYXNzTmFtZV0pIHtcbiAgICAgICAgICBpZiAocmVzdWx0U3RyaW5nKSB7XG4gICAgICAgICAgICByZXN1bHRTdHJpbmcgKz0gXCIgXCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdFN0cmluZyArPSBjbGFzc05hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0U3RyaW5nO1xufVxuIiwKICAgICIvKlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gXCIjY29tcG9uZW50XCI7XG5pbXBvcnQgeyBFcnJvckNvZGUsIFBhbGV0dGVFcnJvciB9IGZyb20gXCIjZXJyb3JcIjtcbmltcG9ydCB7IGlzVGFnTmFtZSB9IGZyb20gXCIjdXRpbFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUZW1wbGF0ZVN0cmluZ1ZhbHVlKFxuICB2YWw6IHN0cmluZyB8IHR5cGVvZiBDb21wb25lbnQgfCBIVE1MVGVtcGxhdGVFbGVtZW50LFxuKTogc3RyaW5nIHtcbiAgaWYgKHZhbCBpbnN0YW5jZW9mIEhUTUxUZW1wbGF0ZUVsZW1lbnQpIHtcbiAgICByZXR1cm4gdmFsLmlubmVySFRNTDtcbiAgfVxuXG4gIGlmIChcbiAgICB0eXBlb2YgdmFsID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAodmFsLnByb3RvdHlwZSBpbnN0YW5jZW9mIENvbXBvbmVudCB8fCB2YWwgPT09IENvbXBvbmVudClcbiAgKSB7XG4gICAgY29uc3QgdGFnTmFtZSA9IHZhbC50YWdOYW1lO1xuICAgIGlmICghaXNUYWdOYW1lKHRhZ05hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKFxuICAgICAgICBFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9DT01QT05FTlQsXG4gICAgICAgIHZhbC5uYW1lLFxuICAgICAgICB2YWwudGFnTmFtZSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0YWdOYW1lO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWwgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gYDxzcGFuIDo6c3dhcD1cIiR7dmFsfVwiPjwvc3Bhbj5gO1xuICB9XG5cbiAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9WQUxVRSwgU3RyaW5nKHZhbCkpO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhbiB7QGxpbmsgSFRNTFRlbXBsYXRlRWxlbWVudH0gZnJvbSB0aGUgcHJvdmlkZWQgSFRNTCBzdHJpbmcuXG4gKlxuICogVGhlc2UgSFRNTCBUZW1wbGF0ZXMgY2FuIGJlIHVzZWQgYXMgc3RhbmRhcmQgSFRNTCBUZW1wbGF0ZXMsIG9yIGFzIHRoZVxuICogZm91bmRhdGlvbiBmb3IgYSB7QGxpbmsgQ29tcG9uZW50fSBvciBzdGFuZGFsb25lIHtAbGluayBUZW1wbGF0ZX1cbiAqXG4gKiBJbnRlcnBvbGF0ZXMgdmFsdWVzIGluIHRoZSB0ZW1wbGF0ZSBzdHJpbmcgdG8gcHJvdmlkZSBoZWxwZXJzIGZvciBjb21wb3NpbmdcbiAqIHRlbXBsYXRlczpcbiAqXG4gKiAtIEhUTUxUZW1wbGF0ZUVsZW1lbnQgcmVmZXJlbmNlcyBhcmUgc2VyaWFsaXplZCB0byBIVE1MIGFuZCBpbmxpbmVkXG4gKiAtIFN0cmluZ3MgYXJlIG1vZGlmaWVkIHRvIGJlY29tZSA8c3Bhbj4gdGFncyB3aXRoIHRoZSA6OnN3YXAgZGlyZWN0aXZlIHNldFxuICogICB0byB0aGUgc3RyaW5nIHZhbHVlLiBUaGlzIGlzIGhlbHBmdWwgc2hvcnRoYW5kIGZvciBjb250ZW50IHBsYWNlaG9sZGVycy5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIFRoaXMgdGVtcGxhdGUgc3RyaW5nXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgJHRlbXBsYXRlID0gaHRtbGBcbiAqIDxkaXYgOmNsYXNzPVwiKmNsYXNzbmFtZXNcIj5cbiAqICAgJHtcIkBjb250ZW50XCJ9XG4gKiA8L2Rpdj5cbiAqIGBcbiAqIGBgYFxuICpcbiAqIFByb2R1Y2VzIHRoaXMgdGVtcGxhdGUgZWxlbWVudCAocG9ydHJheWVkIGFzIEhUTUwpXG4gKlxuICogYGBgaHRtbFxuICogPHRlbXBsYXRlPlxuICogICA8ZGl2IDpjbGFzcz1cIipjbGFzc25hbWVzXCI+XG4gKiAgICAgPHNwYW4gOjpzd2FwPVwiQGNvbnRlbnRcIj48L3NwYW4+XG4gKiAgIDwvZGl2PlxuICogPC90ZW1wbGF0ZT5cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gaHRtbChcbiAgc3RyaW5nczogVGVtcGxhdGVTdHJpbmdzQXJyYXksXG4gIC4uLnZhbHVlczogKFxuICAgIHwgYEAke3N0cmluZ31gXG4gICAgfCBgJCR7c3RyaW5nfWBcbiAgICB8IGAjJHtzdHJpbmd9YFxuICAgIHwgYCoke3N0cmluZ31gXG4gICAgfCBIVE1MVGVtcGxhdGVFbGVtZW50XG4gICAgfCB0eXBlb2YgQ29tcG9uZW50PGFueT5cbiAgKVtdXG4pOiBIVE1MVGVtcGxhdGVFbGVtZW50IHtcbiAgY29uc3QgZnVsbFN0cmluZyA9IHN0cmluZ3MucmVkdWNlKChhY2MsIHN0ciwgaSkgPT4ge1xuICAgIGNvbnN0IHBhcnNlZFZhbHVlID0gdmFsdWVzW2ldXG4gICAgICA/IGAke3BhcnNlVGVtcGxhdGVTdHJpbmdWYWx1ZSh2YWx1ZXNbaV0pfWBcbiAgICAgIDogXCJcIjtcbiAgICByZXR1cm4gYWNjICsgc3RyICsgcGFyc2VkVmFsdWU7XG4gIH0sIFwiXCIpO1xuXG4gIGNvbnN0IHRlbXBsYXRlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgdGVtcGxhdGVFbGVtZW50LmlubmVySFRNTCA9IGZ1bGxTdHJpbmc7XG4gIHJldHVybiB0ZW1wbGF0ZUVsZW1lbnQ7XG59XG4iLAogICAgIi8qXG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuXG5pbXBvcnQgeyBFcnJvckNvZGUsIFBhbGV0dGVFcnJvciB9IGZyb20gXCIjZXJyb3JcIjtcblxuZXhwb3J0IHR5cGUgU3RhdGVMaXN0ZW5lcjxTaGFwZT4gPSAoc3RhdGU6IFNoYXBlKSA9PiB2b2lkO1xuXG5jb25zdCBBcnJheU11dGF0b3JGdW5jdGlvbnMgPSBuZXcgU2V0KFtcbiAgXCJwdXNoXCIsXG4gIFwicG9wXCIsXG4gIFwic2hpZnRcIixcbiAgXCJ1bnNoaWZ0XCIsXG4gIFwic3BsaWNlXCIsXG4gIFwic29ydFwiLFxuICBcInJldmVyc2VcIixcbiAgXCJmaWxsXCIsXG4gIFwiY29weVdpdGhpblwiLFxuXSk7XG5cbmNvbnN0IERhdGFTdHJ1Y3R1cmVNdXRhdG9yRnVuY3Rpb25zID0gbmV3IFNldChbXG4gIFwiYWRkXCIsXG4gIFwiZGVsZXRlXCIsXG4gIFwiY2xlYXJcIixcbiAgXCJzZXRcIixcbl0pO1xuXG4vKipcbiAqIFBvd2VyZnVsIGFuZCBmbGV4aWJsZSBzdGF0ZSBtYW5hZ2VtZW50IHdpdGggZGVlcCByZWFjdGl2aXR5LCB0cmFuc2FjdGlvbiwgYW5kXG4gKiBsb2NraW5nIHN1cHBvcnQuXG4gKlxuICogVGhlIFN0YXRlIGNsYXNzIHdyYXBzIHN0YXRlZnVsIGRhdGEgYW5kIHByb3ZpZGVzIGFuIEFQSSBmb3IgbXV0YXRpbmcgdGhlIGRhdGFcbiAqIHdoaWxlIGxpc3RlbmVycyBzdWJzY3JpYmUgdG8gbWVhbmluZ2Z1bCB1cGRhdGVzLlxuICpcbiAqIE1vZGlmeSBzdGF0ZSB3aXRoIHNldHRlcnMsIG11dGF0b3JzLCB0cmFuc2FjdGlvbnMsIG9yIHByb3hpZWQgdXBkYXRlcyB3aXRoXG4gKiBkZWVwIHJlYWN0aXZpdHkgYW5kIGFycmF5IG11dGF0aW9uIHN1cHBvcnQgYnVpbHQgaW4uXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBzdGF0ZSA9IG5ldyBTdGF0ZSh7Y291bnQ6IDF9KTtcbiAqIHN0YXRlLmFkZExpc3RlbmVyKGRhdGEgPT4gY29uc29sZS5sb2coZGF0YSkpXG4gKlxuICogc3RhdGUuc2V0KFwiY291bnRcIiwgMik7IC8vIFByaW50cyBcIjJcIlxuICogc3RhdGUuc2V0KFwiY291bnRcIiwgMik7IC8vIE5vdGhpbmcgaGFwcGVucywgbm8gY2hhbmdlXG4gKiBzdGF0ZS5saXZlLmNvdW50ID0gMzsgLy8gUHJpbnRzIFwiM1wiXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFN0YXRlPFNoYXBlIGV4dGVuZHMgb2JqZWN0PiB7XG4gIHByaXZhdGUgX2RhdGE6IFNoYXBlO1xuICBwcml2YXRlIF9saXN0ZW5lcnM6IFNldDxTdGF0ZUxpc3RlbmVyPFNoYXBlPj4gPSBuZXcgU2V0KCk7XG4gIHByaXZhdGUgX3Byb3h5PzogU2hhcGU7XG4gIHByaXZhdGUgX3Byb3h5Q2FjaGUgPSBuZXcgV2Vha01hcDxvYmplY3QsIGFueT4oKTtcbiAgcHJpdmF0ZSBfcmV2ZXJzZVByb3h5Q2FjaGUgPSBuZXcgV2Vha01hcDxvYmplY3QsIG9iamVjdD4oKTtcbiAgcHJpdmF0ZSBfaXNMb2NrZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihpbml0aWFsRGF0YTogU2hhcGUsIG9uQ2hhbmdlPzogU3RhdGVMaXN0ZW5lcjxTaGFwZT4pIHtcbiAgICB0aGlzLl9kYXRhID0gaW5pdGlhbERhdGE7XG4gICAgdGhpcy5nZXQgPSB0aGlzLmdldC5iaW5kKHRoaXMpO1xuXG4gICAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMuYWRkKG9uQ2hhbmdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGF6aWx5IGNyZWF0ZSBhbmQgY2FjaGUgcHJveGllcyBpbnRvIHRoZSBzdGF0ZSBmb3IgcmVhY3RpdmUgdXBkYXRlcyBvblxuICAgKiBuZXN0ZWQgdmFsdWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBfY3JlYXRlUHJveHk8VD4odGFyZ2V0OiBULCBwYXRoOiBzdHJpbmdbXSA9IFtdKTogVCB7XG4gICAgLy8gUmV0dXJuIHByaW1pdGl2ZXMgaW1tZWRpYXRlbHlcbiAgICBpZiAodHlwZW9mIHRhcmdldCAhPT0gXCJvYmplY3RcIiB8fCB0YXJnZXQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGEgY2FjaGVkIHByb3h5IGZvciB0aGlzIG9iamVjdFxuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuX3Byb3h5Q2FjaGUuZ2V0KHRhcmdldCBhcyBvYmplY3QpO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuXG4gICAgLy8gT3RoZXJ3aXNlIGNyZWF0ZSBhIG5ldyBwcm94eSBhbmQgY2FjaGUgaXRcbiAgICBjb25zdCBwcm94eSA9IG5ldyBQcm94eSh0YXJnZXQgYXMgb2JqZWN0LCB7XG4gICAgICBnZXQ6IChvYmosIGtleTogc3RyaW5nIHwgc3ltYm9sKSA9PiB7XG4gICAgICAgIC8vIFN5bWJvbHMgLT4gRGlyZWN0IHJldHVyblxuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgICAgIHJldHVybiAob2JqIGFzIGFueSlba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gKG9iaiBhcyBhbnkpW2tleV07XG5cbiAgICAgICAgLy8gRm9yIEFycmF5cywgTWFwcywgYW5kIFNldHMsIGhhbmRsZSBtdXRhdG9yIGZ1bmN0aW9ucyBjb3JyZWN0bHlcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChvYmogaW5zdGFuY2VvZiBTZXQgfHwgb2JqIGluc3RhbmNlb2YgTWFwIHx8IEFycmF5LmlzQXJyYXkob2JqKSkgJiZcbiAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBtdXRhdGlvbkZucyA9IEFycmF5LmlzQXJyYXkob2JqKVxuICAgICAgICAgICAgPyBBcnJheU11dGF0b3JGdW5jdGlvbnNcbiAgICAgICAgICAgIDogRGF0YVN0cnVjdHVyZU11dGF0b3JGdW5jdGlvbnM7XG4gICAgICAgICAgY29uc3QgaXNNdXRhdGlvbiA9IG11dGF0aW9uRm5zLmhhcyhrZXkpO1xuXG4gICAgICAgICAgcmV0dXJuICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLnNuYXBzaG90KCk7XG5cbiAgICAgICAgICAgIGxldCBjdXJyZW50OiBhbnkgPSBzbmFwc2hvdDtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBwIG9mIHBhdGgpIHtcbiAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnRbcF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IChjdXJyZW50IGFzIGFueSlba2V5XSguLi5hcmdzKTtcblxuICAgICAgICAgICAgaWYgKGlzTXV0YXRpb24pIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX2lzTG9ja2VkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuU1RBVEVfTE9DS0VEKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLl9wcm9jZXNzSW5jb21pbmdTdGF0ZShzbmFwc2hvdCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9iamVjdHMgLT4gcmVjdXJzaXZlbHkgY3JlYXRlIGEgcHJveHlcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVQcm94eSh2YWx1ZSwgWy4uLnBhdGgsIGtleV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHJpbWl0aXZlcyAtPiBSZXR1cm4gdmFsdWVcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfSxcblxuICAgICAgc2V0OiAoX29iaiwga2V5OiBzdHJpbmcgfCBzeW1ib2wsIHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gUmVqZWN0IGlmIGN1cnJlbnRseSBsb2NrZWRcbiAgICAgICAgaWYgKHRoaXMuX2lzTG9ja2VkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuU1RBVEVfTE9DS0VEKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERpc2FsbG93IHNldHRpbmcgc3ltYm9sIHByb3BlcnRpZXMgb24gdGFyZ2V0IGRhdGEgdmFsdWVzXG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSBcInN5bWJvbFwiKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29tcHV0ZSBhbmQgdXBkYXRlIHRoZSBwYXRoIHdpdGggdGhlIHZhbHVlXG4gICAgICAgIGNvbnN0IG5ld1BhdGggPSBbLi4ucGF0aCwga2V5XTtcbiAgICAgICAgdGhpcy5fc2V0TmVzdGVkKG5ld1BhdGgsIHRoaXMuX3Vud3JhcFByb3h5KHZhbHVlKSk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuXG4gICAgICBoYXM6IChvYmosIGtleTogc3RyaW5nIHwgc3ltYm9sKSA9PiB7XG4gICAgICAgIHJldHVybiBrZXkgaW4gb2JqO1xuICAgICAgfSxcblxuICAgICAgb3duS2V5czogKG9iaikgPT4ge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKG9iaik7XG4gICAgICB9LFxuXG4gICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IChvYmosIGtleTogc3RyaW5nIHwgc3ltYm9sKSA9PiB7XG4gICAgICAgIGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KTtcblxuICAgICAgICBpZiAoZGVzYykge1xuICAgICAgICAgIGRlc2MuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZXNjO1xuICAgICAgfSxcblxuICAgICAgZGVsZXRlUHJvcGVydHk6IChvYmosIGtleSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gXCJzeW1ib2xcIiB8fCAhKGtleSBpbiBvYmopKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29tcHV0ZSBhbmQgdXBkYXRlIHRoZSBwYXRoIHdpdGggdGhlIHZhbHVlXG4gICAgICAgIGNvbnN0IG5ld1BhdGggPSBbLi4ucGF0aCwga2V5XTtcblxuICAgICAgICB0aGlzLl9zZXROZXN0ZWQobmV3UGF0aCwgdW5kZWZpbmVkKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgfSkgYXMgVDtcblxuICAgIHRoaXMuX3Byb3h5Q2FjaGUuc2V0KHRhcmdldCBhcyBvYmplY3QsIHByb3h5KTtcbiAgICB0aGlzLl9yZXZlcnNlUHJveHlDYWNoZS5zZXQocHJveHkgYXMgb2JqZWN0LCB0YXJnZXQgYXMgb2JqZWN0KTtcbiAgICByZXR1cm4gcHJveHk7XG4gIH1cblxuICBwcml2YXRlIF91bndyYXBQcm94eTxUPih2YWx1ZTogVCk6IFQge1xuICAgIC8vIERvbid0IGRvIGFueXRoaW5nIGZvciBwcmltaXRpdmVzXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgb25lIG9mIG91ciBwcm94aWVzXG4gICAgY29uc3QgcmF3VGFyZ2V0ID0gdGhpcy5fcmV2ZXJzZVByb3h5Q2FjaGUuZ2V0KHZhbHVlIGFzIG9iamVjdCk7XG4gICAgaWYgKHJhd1RhcmdldCkge1xuICAgICAgcmV0dXJuIHJhd1RhcmdldCBhcyBUO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBhcnJheXNcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5tYXAoKGl0ZW0pID0+IHRoaXMuX3Vud3JhcFByb3h5KGl0ZW0pKSBhcyBUO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBwbGFpbiBvYmplY3RzXG4gICAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkgPT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAgIGNvbnN0IHVud3JhcHBlZDogYW55ID0ge307XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWx1ZSkge1xuICAgICAgICBpZiAoT2JqZWN0Lmhhc093bih2YWx1ZSwga2V5KSkge1xuICAgICAgICAgIHVud3JhcHBlZFtrZXldID0gdGhpcy5fdW53cmFwUHJveHkoKHZhbHVlIGFzIGFueSlba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB1bndyYXBwZWQ7XG4gICAgfVxuXG4gICAgLy8gT3RoZXIgb2JqZWN0cyAoRGF0ZSwgTWFwLCBTZXQsIGV0Yy4pIHBhc3MgdGhyb3VnaFxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc2V0dGluZyBuZXN0ZWQgdmFsdWVzIGFuZCBlbWl0dGluZyB1cGRhdGVkIGRhdGEgaWYgdGhlIHZhbHVlIGNoYW5nZWRcbiAgICovXG4gIHByaXZhdGUgX3NldE5lc3RlZChwYXRoOiBzdHJpbmdbXSwgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIC8vIE5vdGhpbmcgdG8gZG8gd2l0aCBlbXB0eSBwYXRoc1xuICAgIGlmICghcGF0aC5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTdGFydCBhdCB0aGUgcm9vdCBhbmQgc2VlayB0byB0aGUgdmFsdWUgYmVpbmcgc2V0XG4gICAgbGV0IGN1cnJlbnQ6IGFueSA9IHRoaXMuX2RhdGE7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBwYXRoW2ldID8/IFwiXCI7XG5cbiAgICAgIGlmIChjdXJyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuSU5WQUxJRF9TVEFURV9LRVksIHBhdGguam9pbihcIi5cIikpO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50ID0gY3VycmVudFtrZXldO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbmFsS2V5ID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdID8/IFwiXCI7XG5cbiAgICBpZiAoY3VycmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5JTlZBTElEX1NUQVRFX0tFWSwgcGF0aC5qb2luKFwiLlwiKSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGFuZCBlbWl0IG9ubHkgaWYgdGhlIHZhbHVlIGlzIGRpZmZlcmVudC4gT3RoZXJ3aXNlIG5vLW9wLlxuICAgIGlmIChjdXJyZW50W2ZpbmFsS2V5XSAhPT0gdmFsdWUgJiYgIU9iamVjdC5pcyhjdXJyZW50W2ZpbmFsS2V5XSwgdmFsdWUpKSB7XG4gICAgICBjdXJyZW50W2ZpbmFsS2V5XSA9IHZhbHVlO1xuICAgICAgdGhpcy5fZW1pdCh0aGlzLmN1cnJlbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIGFuIGluY29taW5nIHBhcnRpYWwgc3RhdGUgYW5kIGVtaXQgdXBkYXRlcyB0byBsaXN0ZW5lcnMgaWYgdGhlcmVcbiAgICogYXJlIGFueSBjaGFuZ2VzIGRldGVjdGVkLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBPYmplY3QuaXMoKSB0byBjaGVjayBmb3IgZGlmZmVyZW5jZXMuIERvZXMgbm90IGF0dGVtcHQgZGVlcCBkaWZmaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfcHJvY2Vzc0luY29taW5nU3RhdGUgPSAoaW5jb21pbmdTdGF0ZTogUGFydGlhbDxTaGFwZT4pOiB2b2lkID0+IHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgaW5jb21pbmdTdGF0ZSAhPT0gXCJvYmplY3RcIiB8fFxuICAgICAgaW5jb21pbmdTdGF0ZSA9PT0gbnVsbCB8fFxuICAgICAgQXJyYXkuaXNBcnJheShpbmNvbWluZ1N0YXRlKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihcbiAgICAgICAgRXJyb3JDb2RlLklOVkFMSURfU1RBVEVfVVBEQVRFLFxuICAgICAgICBKU09OLnN0cmluZ2lmeShpbmNvbWluZ1N0YXRlKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGxldCBoYXNDaGFuZ2VzID0gZmFsc2U7XG5cbiAgICAvLyBDaGVjayBpZiBhbnkga2V5L3ZhbHVlIHBhaXIgb24gdGhlIGluY29taW5nIHN0YXRlIGRpZmZlcnMgZnJvbSB0aGVcbiAgICAvLyBleGlzdGluZyBkYXRhXG4gICAgZm9yIChjb25zdCBba2V5LCBuZXdWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoaW5jb21pbmdTdGF0ZSkpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMuX2RhdGFba2V5IGFzIGtleW9mIFNoYXBlXTtcbiAgICAgIGlmICghT2JqZWN0LmlzKGN1cnJlbnRWYWx1ZSwgbmV3VmFsdWUpKSB7XG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICAodGhpcy5fZGF0YSBhcyBhbnkpW2tleV0gPSBuZXdWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFzQ2hhbmdlcykge1xuICAgICAgdGhpcy5fZW1pdCh0aGlzLl9kYXRhKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEVtaXQgdGhlIGN1cnJlbnQgc3RhdGUgdG8gYWxsIGxpc3RlbmVyc1xuICAgKi9cbiAgcHJpdmF0ZSBfZW1pdCA9IChkYXRhOiBTaGFwZSk6IHZvaWQgPT4ge1xuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5fbGlzdGVuZXJzKSB7XG4gICAgICBsaXN0ZW5lcihkYXRhKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHN0YXRlXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFRoaXMgaXMgYSBkaXJlY3QgcmVmZXJlbmNlIHRvIHRoZSBpbnRlcm5hbCBzdGF0ZS4gSXQgaXMgbWFya2VkIGFzIFJlYWRvbmx5XG4gICAqIHRvIGhlbHAgcHJldmVudCBhY2NpZGVudGFsIGNoYW5nZXMuIE5ldmVyIGVkaXQgdGhpcyB2YWx1ZSBkaXJlY3RseS5cbiAgICovXG4gIGdldCBjdXJyZW50KCk6IFJlYWRvbmx5PFNoYXBlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gIH1cblxuICAvKipcbiAgICogTGl2ZSByZWFjdGl2ZSBhY2Nlc3NvciBmb3Igc3RhdGUgZGF0YS4gRGVlcGx5IG5lc3RlZCBjaGFuZ2VzIHRyaWdnZXJcbiAgICogYXV0b21hdGljIHVwZGF0ZXMsIGluY2x1ZGluZyBhcnJheSwgTWFwLCBhbmQgU2V0IG11dGF0aW9ucy5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogRm9yIGRlZXBseSBuZXN0ZWQgdmFsdWVzLCB0aGUgYC5saXZlYCBhY2Nlc3NvciBtYXkgYWRkIHBlcmZvcm1hbmNlIG92ZXJoZWFkXG4gICAqIGNvbXBhcmVkIHRvIGRpcmVjdGx5IGFjY2Vzc2luZyB0aGUgdmFsdWUgdmlhIGAuY3VycmVudGBcbiAgICovXG4gIGdldCBsaXZlKCk6IFNoYXBlIHtcbiAgICBpZiAoIXRoaXMuX3Byb3h5KSB7XG4gICAgICB0aGlzLl9wcm94eSA9IHRoaXMuX2NyZWF0ZVByb3h5KHRoaXMuX2RhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcHJveHk7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoaXMgc3RhdGUgaXMgY3VycmVudGx5IGxvY2tlZCAodHJ1ZSkgb3Igbm90IChmYWxzZSlcbiAgICovXG4gIGdldCBpc0xvY2tlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNMb2NrZWQ7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgaGFuZGxlciBmdW5jdGlvbiBmb3Igd2hlbiB0aGlzIHN0YXRlIGNoYW5nZXMuXG4gICAqXG4gICAqIExpc3RlbmVycyBhcmUgaW52b2tlZCBpbiB0aGUgb3JkZXIgdGhleSBhcmUgcmVnaXN0ZXJlZCBhbmQgYXJlIHBhc3NlZCBhXG4gICAqIHJlZmVyZW5jZSB0byB0aGUgaW50ZXJuYWxseSBtYW5hZ2VkIHN0YXRlIG9iamVjdCBhcyBhIHJlYWRvbmx5IG9iamVjdC5cbiAgICpcbiAgICogKipEbyBub3QgbW9kaWZ5IHN0YXRlIHZhbHVlcyBkaXJlY3RseSoqLiBJbnN0ZWFkLCB1c2Uge0BsaW5rIHNldH0gb3JcbiAgICoge0BsaW5rIHBhdGNofSB0byBtYWtlIGltbXV0YWJsZSB1cGRhdGVzLlxuICAgKi9cbiAgYWRkTGlzdGVuZXIgPSAobGlzdGVuZXI6IFN0YXRlTGlzdGVuZXI8U2hhcGU+KTogdm9pZCA9PiB7XG4gICAgdGhpcy5fbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBzdGF0ZSBoYW5kbGVyXG4gICAqL1xuICByZW1vdmVMaXN0ZW5lciA9IChsaXN0ZW5lcjogU3RhdGVMaXN0ZW5lcjxTaGFwZT4pOiB2b2lkID0+IHtcbiAgICB0aGlzLl9saXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IGEgc2luZ2xlIHZhbHVlIGZyb20gdGhlIHN0YXRlIG9iamVjdFxuICAgKlxuICAgKiBUaGUgdmFsdWUgaXMgcmV0dXJuZWQgYXMgUmVhZG9ubHkgdG8gcHJldmVudCBhY2NpZGVudGFsIHN0YXRlIG11dGF0aW9ucy5cbiAgICogVG8gbXV0YXRlIHN0YXRlZnVsIHByb3BlcnRpZXMsIHVzZSB7QGxpbmsgc2V0fSBvciB7QGxpbmsgcGF0Y2h9IGluc3RlYWQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc3RhdGUgPSBuZXcgU3RhdGUoeyBjb3VudDogMSB9KTtcbiAgICogY29uc29sZS5sb2coc3RhdGUuZ2V0KFwiY291bnRcIikpOyAvLyAxXG4gICAqIGBgYFxuICAgKlxuICAgKi9cbiAgZ2V0ID0gPEsgZXh0ZW5kcyBrZXlvZiBTaGFwZT4oa2V5OiBLKTogUmVhZG9ubHk8U2hhcGVbS10+ID0+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVtrZXldIGFzIFJlYWRvbmx5PFNoYXBlW0tdPjtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyBhIGRlZXAgY2xvbmUgb2YgdGhlIGN1cnJlbnQgc3RhdGUgZGF0YSB1c2luZyBgc3RydWN0dXJlZENsb25lKClgIHRvXG4gICAqIG1ha2UgdGhlIGNvcHkuXG4gICAqXG4gICAqIFRoZSBvYmplY3QgcmV0dXJuZWQgZnJvbSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBlZGl0ZWQgd2l0aG91dCBtb2RpZnlpbmcgdGhlXG4gICAqIGFjdHVhbCBpbnRlcm5hbCBzdGF0ZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzbmFwID0gc3RhdGUuc25hcHNob3QoKTtcbiAgICogc25hcC5jb3VudCArPSAxO1xuICAgKiBzdGF0ZS5wYXRjaChzbmFwKTtcbiAgICogYGBgXG4gICAqL1xuICBzbmFwc2hvdCA9ICgpOiBTaGFwZSA9PiB7XG4gICAgcmV0dXJuIHN0cnVjdHVyZWRDbG9uZSh0aGlzLl9kYXRhKTtcbiAgfTtcblxuICAvKipcbiAgICogU2V0IGEgc2luZ2xlIHN0YXRlZnVsIHByb3BlcnR5IHdoaWxlIGxlYXZpbmcgb3RoZXIgcHJvcGVydGllcyB1bmNoYW5nZWQuXG4gICAqXG4gICAqIFRyaWdnZXJzIGFuIHVwZGF0ZSB0byBhbGwgbGlzdGVuZXJzIGlmIHRoZSB2YWx1ZSBpcyBkaWZmZXJlbnQgZnJvbSBiZWZvcmVcbiAgICogd2hlbiBjb21wYXJlZCB1c2luZyBzaGFsbG93IGVxdWFsaXR5LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHN0YXRlID0gbmV3IFN0YXRlKHsgY291bnQ6IDEsIGNvbG9yOiBcInJlZFwiIH0pO1xuICAgKiBzdGF0ZS5zZXQoXCJjb3VudFwiLCAyKTsgLy8gU3RhdGUgaXMgbm93IHsgY291bnQ6IDIsIGNvbG9yOiBcInJlZFwiIH1cbiAgICogYGBgXG4gICAqL1xuICBzZXQgPSA8SyBleHRlbmRzIGtleW9mIFNoYXBlPihrZXk6IEssIHZhbHVlOiBTaGFwZVtLXSk6IHZvaWQgPT4ge1xuICAgIC8vIFJlamVjdCBpZiBjdXJyZW50bHkgbG9ja2VkXG4gICAgaWYgKHRoaXMuX2lzTG9ja2VkKSB7XG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5TVEFURV9MT0NLRUQpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnRpYWw6IFBhcnRpYWw8U2hhcGU+ID0ge307XG4gICAgcGFydGlhbFtrZXldID0gdmFsdWU7XG5cbiAgICB0aGlzLl9wcm9jZXNzSW5jb21pbmdTdGF0ZShwYXJ0aWFsKTtcbiAgfTtcblxuICAvKipcbiAgICogU2V0IG11bHRpcGxlIHN0YXRlZnVsIHByb3BlcnRpZXMgYXQgb25jZSwgbGVhdmluZyBvbWl0dGVkIHByb3BlcnRpZXNcbiAgICogdW5jaGFuZ2VkLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBQYXRjaCBhIHBhcnRpYWwgc3RhdGUsIHVwZGF0aW5nIGFsbCBsaXN0ZWQgcHJvcGVydGllcyBhdCBvbmNlXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc3RhdGUgPSBuZXcgU3RhdGUoe1xuICAgKiAgIHdlYXRoZXI6IFwic3VubnlcIixcbiAgICogICB0ZW1wZXJhdHVyZTogMzAsXG4gICAqICAgaHVtaWRpdHk6IDcwLFxuICAgKiB9KTtcbiAgICpcbiAgICogLy8gTGVhdmVzIGB0ZW1wZXJhdHVyZWAgdW5jaGFuZ2VkXG4gICAqIHN0YXRlLnBhdGNoKHtcbiAgICogICB3ZWF0aGVyOiBcImNsb3VkeVwiLFxuICAgKiAgIGh1bWlkaXR5OiA1MCxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcGF0Y2ggPSAocGF0Y2g6IFBhcnRpYWw8U2hhcGU+KTogU3RhdGU8U2hhcGU+ID0+IHtcbiAgICAvLyBSZWplY3QgaWYgY3VycmVudGx5IGxvY2tlZFxuICAgIGlmICh0aGlzLl9pc0xvY2tlZCkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuU1RBVEVfTE9DS0VEKTtcbiAgICB9XG5cbiAgICB0aGlzLl9wcm9jZXNzSW5jb21pbmdTdGF0ZShwYXRjaCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZ1bGx5IHJlcGxhY2UgdGhlIGN1cnJlbnQgc3RhdGUgZGF0YSBhbmQgZm9yY2UgbGlzdGVuZXJzIHRvIHJlY2VpdmUgdGhlXG4gICAqIHVwZGF0ZWQgZGF0YSBpbW1lZGlhdGVseS5cbiAgICovXG4gIHJlcGxhY2UgPSAoc3RhdGU6IFNoYXBlKTogU3RhdGU8U2hhcGU+ID0+IHtcbiAgICAvLyBSZWplY3QgaWYgY3VycmVudGx5IGxvY2tlZFxuICAgIGlmICh0aGlzLl9pc0xvY2tlZCkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuU1RBVEVfTE9DS0VEKTtcbiAgICB9XG5cbiAgICB0aGlzLl9kYXRhID0gc3RhdGU7XG4gICAgdGhpcy5fZW1pdCh0aGlzLl9kYXRhKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogTG9jayB0aGlzIFN0YXRlIGluc3RhbmNlLCBwcmV2ZW50aW5nIGZ1cnRoZXIgZXh0ZXJuYWwgY2hhbmdlc1xuICAgKi9cbiAgbG9jayA9ICgpOiBTdGF0ZTxTaGFwZT4gPT4ge1xuICAgIGlmICh0aGlzLl9pc0xvY2tlZCkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuU1RBVEVfTE9DS0VEKTtcbiAgICB9XG5cbiAgICB0aGlzLl9pc0xvY2tlZCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVubG9jayB0aGlzIFN0YXRlIGluc3RhbmNlLCBhbGxvd2luZyBmdXJ0aGVyIGV4dGVybmFsIGNoYW5nZXNcbiAgICovXG4gIHVubG9jayA9ICgpOiBTdGF0ZTxTaGFwZT4gPT4ge1xuICAgIHRoaXMuX2lzTG9ja2VkID0gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIEFwcGx5IGNvbXBsZXggdXBkYXRlcyB0byB0aGUgc3RhdGUgdXNpbmcgYSBtdXRhdG9yIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBUaGUgbXV0YXRvciBmdW5jdGlvbiB0YWtlcyBvbmUgcGFyYW1ldGVyIHdoaWNoIGlzIGEgc3RydWN0dXJlZENsb25lIGNvcHkgb2ZcbiAgICogdGhlIGN1cnJlbnQgc3RhdGUgb2JqZWN0LiBXaGF0ZXZlciBpcyByZXR1cm5lZCBieSB0aGUgbXV0YXRvciBpcyB0aGVuXG4gICAqIHBhdGNoZWQgaW4gdG8gdGhlIHN0YXRlLlxuICAgKi9cbiAgbXV0YXRlID0gKG11dGF0b3I6IChjdXJyZW50OiBTaGFwZSkgPT4gU2hhcGUpOiBTdGF0ZTxTaGFwZT4gPT4ge1xuICAgIGlmICh0aGlzLl9pc0xvY2tlZCkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuU1RBVEVfTE9DS0VEKTtcbiAgICB9XG5cbiAgICB0aGlzLl9wcm9jZXNzSW5jb21pbmdTdGF0ZShtdXRhdG9yKHRoaXMuc25hcHNob3QoKSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQZXJmb3JtIGFuIGFzeW5jIG11dGF0aW9uIG9mIHRoZSBzdGF0ZSwgb3B0aW9uYWxseSBsb2NraW5nIHRoZSBzdGF0ZSBkdXJpbmdcbiAgICogdGhlIHByb2Nlc3MuXG4gICAqIEBwYXJhbSBtdXRhdG9yIEEgZnVuY3Rpb24gdG8gbXV0YXRlIGFuZCByZXR1cm4gdGhlIG5ldyBzdGF0ZVxuICAgKiBAcGFyYW0gbG9jayBJZiBgdHJ1ZWAsIGxvY2sgdGhlIHN0YXRlIHVudGlsIHRoZSBtdXRhdG9yIGNvbXBsZXRlc1xuICAgKi9cbiAgbXV0YXRlQXN5bmMgPSBhc3luYyAoXG4gICAgbXV0YXRvcjogKGN1cnJlbnQ6IFNoYXBlKSA9PiBQcm9taXNlPFNoYXBlPixcbiAgICBsb2NrID0gZmFsc2UsXG4gICk6IFByb21pc2U8U3RhdGU8U2hhcGU+PiA9PiB7XG4gICAgaWYgKHRoaXMuX2lzTG9ja2VkKSB7XG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5TVEFURV9MT0NLRUQpO1xuICAgIH1cblxuICAgIGlmIChsb2NrKSB7XG4gICAgICB0aGlzLl9pc0xvY2tlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgbXV0YXRpb25SZXN1bHQgPSBhd2FpdCBtdXRhdG9yKHRoaXMuc25hcHNob3QoKSk7XG4gICAgdGhpcy5fcHJvY2Vzc0luY29taW5nU3RhdGUobXV0YXRpb25SZXN1bHQpO1xuXG4gICAgaWYgKGxvY2spIHtcbiAgICAgIHRoaXMuX2lzTG9ja2VkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gYSB0cmFuc2FjdGlvbi1zdHlsZSBzZXQgb2YgYWN0aW9ucyBkZWZpbmVkIHdpdGhpbiBhIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBUaGUgcHJvdmlkZWQgZnVuY3Rpb24gY2FuIGRvIGFueXRoaW5nLCBiZXlvbmQganVzdCBzZXR0aW5nIHN0YXRlLiBBbnlcbiAgICogdW5jYXVnaHQgZXJyb3JzIHRocm93biBmcm9tIHdpdGhpbiB0aGUgZnVuY3Rpb24gd2lsbCBjYXVzZSB0aGUgdHJhbnNhY3Rpb25cbiAgICogdG8gZmFpbCBhbmQgdGhlIHN0YXRlIHRvIGF1dG9tYXRpY2FsbHkgcm9sbCBiYWNrIHRvIHRoZSBsYXN0IHZhbGlkIHN0YXRlLlxuICAgKlxuICAgKiBEdXJpbmcgYSB0cmFuc2FjdGlvbiwgdGhpcyBzdGF0ZSBpbnN0YW5jZSB3aWxsIGJlIGxvY2tlZCwgcHJldmVudGluZyBvdGhlclxuICAgKiBjaGFuZ2VzLlxuICAgKlxuICAgKiBUcmFuc2FjdGlvbnMgd2lsbCBhbHdheXMgcmVzdWx0IGluIGEgc3RhdGUgdXBkYXRlIHdoZW4gc3VjY2Vzc2Z1bC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogVHJhbnNhY3Rpb25zIHdpdGggbG9ja2luZyBhbmQgcm9sbGJhY2sgc3VwcG9ydFxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHN0YXRlID0gbmV3IFN0YXRlKHtjb3VudDogMX0pO1xuICAgKlxuICAgKiBzdGF0ZS50cmFuc2FjdGlvbihhc3luYyAocykgPT4ge1xuICAgKiAgIC8vIGBzYCBpcyBhIGZ1bGwgU3RhdGUgb2JqZWN0IHlvdSBjYW4gc2FmZWx5IG1hbmlwdWxhdGVcbiAgICogICBzLnNldChcImNvdW50XCIsIDEwKTtcbiAgICogfSk7XG4gICAqIHN0YXRlLmdldChcImNvdW50XCIpOyAvLyA9PiAxMDtcbiAgICpcbiAgICogLy8gRXJyb3JzIGluc2lkZSB0aGUgdHJhbnNhY3Rpb24gcm9sbCBiYWNrIHRoZSBzdGF0ZVxuICAgKiBzdGF0ZS50cmFuc2FjdGlvbihhc3luYyAocykgPT4ge1xuICAgKiAgIHMuc2V0KFwiY291bnRcIiwgMTAwKTtcbiAgICogICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICogfSk7XG4gICAqIHN0YXRlLmdldChcImNvdW50XCIpOyAvLyA9PiAxMDtcbiAgICovXG4gIHRyYW5zYWN0aW9uID0gKGZuOiAoc3RhdGU6IFN0YXRlPFNoYXBlPikgPT4gdm9pZCk6IGJvb2xlYW4gPT4ge1xuICAgIGlmICh0aGlzLl9pc0xvY2tlZCkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuU1RBVEVfTE9DS0VEKTtcbiAgICB9XG5cbiAgICAvLyBMb2NrIG91dHNpZGUgb2YgdGhlIHRyeS9jYXRjaCB0byB0aHJvdyBpbW1lZGlhdGVseSwgc2VwYXJhdGluZyB0aGVcbiAgICAvLyB0cmFuc2FjdGlvbiBmdW5jdGlvbiBlcnJvciBmcm9tIHRoZSBhY3R1YWwgY2FsbCBzaXRlIGVycm9yc1xuICAgIHRoaXMuX2lzTG9ja2VkID0gdHJ1ZTtcblxuICAgIGxldCBzdWNjZXNzID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBDcmVhdGUgYSB0ZW1wb3Jhcnkgc3RhdGUgb2JqZWN0IHRvIHVzZSB3aXRoaW4gdGhlIHRyYW5zYWN0aW9uXG4gICAgICBjb25zdCB0cmFuc2FjdGlvblN0YXRlID0gbmV3IFN0YXRlPFNoYXBlPih0aGlzLnNuYXBzaG90KCkpO1xuXG4gICAgICAvLyBSdW4gdGhlIHRyYW5zYWN0aW9uIGl0c2VsZlxuICAgICAgZm4odHJhbnNhY3Rpb25TdGF0ZSk7XG5cbiAgICAgIC8vIEFkb3B0IHRoZSByZXN1bHRpbmcgc3RhdGUgb2YgdGhlIHRlbXBvcmFyeSBvYmplY3RcbiAgICAgIHRoaXMuX3Byb2Nlc3NJbmNvbWluZ1N0YXRlKHRyYW5zYWN0aW9uU3RhdGUuY3VycmVudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIltTdGF0ZV0gVHJhbnNhY3Rpb24gZmFpbGVkIGR1ZSB0byBjYXVnaHQgZXJyb3JcIiwgZXJyb3IpO1xuICAgICAgfVxuICAgICAgc3VjY2VzcyA9IGZhbHNlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9pc0xvY2tlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBzdWNjZXNzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQZXJmb3JtIGEgdHJhbnNhY3Rpb24tc3R5bGUgc2V0IG9mIGFjdGlvbnMgZGVmaW5lZCB3aXRoaW4gYW4gYXN5bmMgZnVuY3Rpb25cbiAgICpcbiAgICogVGhlIHByb3ZpZGVkIGZ1bmN0aW9uIGNhbiBkbyBhbnl0aGluZywgYmV5b25kIGp1c3Qgc2V0dGluZyBzdGF0ZS4gQW55XG4gICAqIHVuY2F1Z2h0IGVycm9ycyB0aHJvd24gZnJvbSB3aXRoaW4gdGhlIGZ1bmN0aW9uIHdpbGwgY2F1c2UgdGhlIHRyYW5zYWN0aW9uXG4gICAqIHRvIGZhaWwgYW5kIHRoZSBzdGF0ZSB0byBhdXRvbWF0aWNhbGx5IHJvbGwgYmFjayB0byB0aGUgbGFzdCB2YWxpZCBzdGF0ZS5cbiAgICpcbiAgICogRHVyaW5nIGEgdHJhbnNhY3Rpb24sIHRoaXMgc3RhdGUgaW5zdGFuY2Ugd2lsbCBiZSBsb2NrZWQsIHByZXZlbnRpbmcgb3RoZXJcbiAgICogY2hhbmdlcy5cbiAgICpcbiAgICogVHJhbnNhY3Rpb25zIHdpbGwgYWx3YXlzIHJlc3VsdCBpbiBhIHN0YXRlIHVwZGF0ZSB3aGVuIHN1Y2Nlc3NmdWwuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIFRyYW5zYWN0aW9ucyB3aXRoIGxvY2tpbmcgYW5kIHJvbGxiYWNrIHN1cHBvcnRcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzdGF0ZSA9IG5ldyBTdGF0ZSh7Y291bnQ6IDF9KTtcbiAgICpcbiAgICogLy8gQXdhaXRpbmcgdGhlIHJlc3VsdCBvZiBhIHRyYW5zYWN0aW9uXG4gICAqIGF3YWl0IHN0YXRlLnRyYW5zYWN0aW9uQXN5bmMoYXN5bmMgKHMpID0+IHtcbiAgICogICAvLyBgc2AgaXMgYSBmdWxsIFN0YXRlIG9iamVjdCB5b3UgY2FuIHNhZmVseSBtYW5pcHVsYXRlXG4gICAqICAgcy5zZXQoXCJjb3VudFwiLCAxMCk7XG4gICAqIH0pO1xuICAgKiBzdGF0ZS5nZXQoXCJjb3VudFwiKTsgLy8gPT4gMTA7XG4gICAqXG4gICAqIC8vIEVycm9ycyBpbnNpZGUgdGhlIHRyYW5zYWN0aW9uIHJvbGwgYmFjayB0aGUgc3RhdGVcbiAgICogYXdhaXQgc3RhdGUudHJhbnNhY3Rpb25Bc3luYyhhc3luYyAocykgPT4ge1xuICAgKiAgIHMuc2V0KFwiY291bnRcIiwgMTAwKTtcbiAgICogICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICogfSk7XG4gICAqIHN0YXRlLmdldChcImNvdW50XCIpOyAvLyA9PiAxMDtcbiAgICpcbiAgICogLy8gSWYgeW91IGZvcmdldCB0byBhd2FpdCB0aGUgdHJhbnNhY3Rpb24sIGl0cyBzdGlsbCBsb2NrZWRcbiAgICogc3RhdGUudHJhbnNhY3Rpb25Bc3luYyhhc3luYyAocykgPT4ge1xuICAgKiAgIGF3YWl0IHdhaXRTZWNvbmRzKDEpO1xuICAgKiB9KTtcbiAgICogc3RhdGUuc2V0KFwiY291bnRcIiwgMSk7IC8vIEVycm9yOiBTdGF0ZSBpcyBsb2NrZWQhXG4gICAqIGBgYFxuICAgKi9cbiAgdHJhbnNhY3Rpb25Bc3luYyA9IGFzeW5jIChcbiAgICBmbjogKHN0YXRlOiBTdGF0ZTxTaGFwZT4pID0+IFByb21pc2U8dm9pZD4sXG4gICk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgIGlmICh0aGlzLl9pc0xvY2tlZCkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuU1RBVEVfTE9DS0VEKTtcbiAgICB9XG5cbiAgICAvLyBMb2NrIG91dHNpZGUgb2YgdGhlIHRyeS9jYXRjaCB0byB0aHJvdyBpbW1lZGlhdGVseSwgc2VwYXJhdGluZyB0aGVcbiAgICAvLyB0cmFuc2FjdGlvbiBmdW5jdGlvbiBlcnJvciBmcm9tIHRoZSBhY3R1YWwgY2FsbCBzaXRlIGVycm9yc1xuICAgIHRoaXMuX2lzTG9ja2VkID0gdHJ1ZTtcblxuICAgIGxldCBzdWNjZXNzID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBDcmVhdGUgYSB0ZW1wb3Jhcnkgc3RhdGUgb2JqZWN0IHRvIHVzZSB3aXRoaW4gdGhlIHRyYW5zYWN0aW9uXG4gICAgICBjb25zdCB0cmFuc2FjdGlvblN0YXRlID0gbmV3IFN0YXRlPFNoYXBlPih0aGlzLnNuYXBzaG90KCkpO1xuXG4gICAgICAvLyBSdW4gdGhlIHRyYW5zYWN0aW9uIGl0c2VsZlxuICAgICAgYXdhaXQgZm4odHJhbnNhY3Rpb25TdGF0ZSk7XG5cbiAgICAgIC8vIEFkb3B0IHRoZSByZXN1bHRpbmcgc3RhdGUgb2YgdGhlIHRlbXBvcmFyeSBvYmplY3RcbiAgICAgIHRoaXMuX3Byb2Nlc3NJbmNvbWluZ1N0YXRlKHRyYW5zYWN0aW9uU3RhdGUuY3VycmVudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIltTdGF0ZV0gVHJhbnNhY3Rpb24gZmFpbGVkIGR1ZSB0byBjYXVnaHQgZXJyb3JcIiwgZXJyb3IpO1xuICAgICAgfVxuICAgICAgc3VjY2VzcyA9IGZhbHNlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9pc0xvY2tlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBzdWNjZXNzO1xuICB9O1xufVxuIiwKICAgICJleHBvcnQgY29uc3QgUkVGX0FUVFIgPSBcImRhdGEtbm9kZS1yZWZcIjtcbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5cbmltcG9ydCB7IEVycm9yQ29kZSwgUGFsZXR0ZUVycm9yIH0gZnJvbSBcIiNlcnJvclwiO1xuaW1wb3J0IHsgTFJVQ2FjaGUgfSBmcm9tIFwiI3V0aWxcIjtcblxuY29uc3QgZW51bSBOb3RhdGlvblByZWZpeCB7XG4gIEF0dHJpYnV0ZXMgPSBcIkBcIixcbiAgU3RhdGUgPSBcIiRcIixcbiAgRGF0YSA9IFwiKlwiLFxuICBJdGVtID0gXCIjXCIsXG59XG5cbmNvbnN0IFBSRUZJWF9NQVBQSU5HOiBSZWNvcmQ8Tm90YXRpb25QcmVmaXgsIHN0cmluZz4gPSB7XG4gIFtOb3RhdGlvblByZWZpeC5BdHRyaWJ1dGVzXTogXCJhdHRyXCIsXG4gIFtOb3RhdGlvblByZWZpeC5TdGF0ZV06IFwic3RhdGVcIixcbiAgW05vdGF0aW9uUHJlZml4LkRhdGFdOiBcImRhdGFcIixcbiAgW05vdGF0aW9uUHJlZml4Lkl0ZW1dOiBcIml0ZW1cIixcbn07XG5cbmNvbnN0IHByZWZpeE1hcHBpbmcgPSBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKFBSRUZJWF9NQVBQSU5HKSk7XG5cbmV4cG9ydCB0eXBlIFBhcnNlZE5vdGF0aW9uID0ge1xuICAvKiogVGhlIHJhdyBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHBhcnNlZCBub3RhdGlvbiAqL1xuICBiYXNlOiBzdHJpbmc7XG5cbiAgLyoqIEFuIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGZvcm1pbmcgYSBwYXRoIHRvIHRoZSBub3RhdGlvbiB2YWx1ZSAqL1xuICBwYXRoOiBzdHJpbmdbXTtcblxuICBtb2RpZmllcnM/OiB7XG4gICAgbm90PzogYm9vbGVhbjtcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBwYXJzZWROb3RhdGlvbkNhY2hlID0gbmV3IExSVUNhY2hlPHN0cmluZywgUGFyc2VkTm90YXRpb24+KCk7XG5cbi8qKlxuICogUGFyc2UgYSBub3RhdGlvbiBpbnRvIGFuIG9iamVjdCB3aXRoIHJ1bnRpbWUgaW5mb3JtYXRpb25cbiAqXG4gKiBAcmVtYXJrc1xuICogRm91ciBub3RhdGlvbnMgYXJlIHN1cHBvcnRlZDpcbiAqXG4gKiAtIGBAYXR0cm5hbWVgIC0+IFJvb3QgZWxlbWVudCBhdHRyaWJ1dGVzXG4gKiAtIGAkc3RhdGV2YWx1ZWAgLT4gU3RhdGVmdWwgY29udGVudFxuICogLSBgKnByb3BlcnR5Lm9yLndoYXRldmVyYCAtPiBDb21wdXRlZCBkYXRhIHByb3BlcnRpZXNcbiAqIC0gYCNjb2xvcmAgLT4gTGlzdCBpdGVtIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTm90YXRpb24obm90YXRpb246IHN0cmluZyk6IFBhcnNlZE5vdGF0aW9uIHtcbiAgY29uc3QgY2FjaGVkID0gcGFyc2VkTm90YXRpb25DYWNoZS5nZXQobm90YXRpb24pO1xuICBpZiAoY2FjaGVkKSB7XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciBwcmVmaXggbW9kaWZpZXJzXG4gIGxldCBub3RNb2RpZmllciA9IGZhbHNlO1xuXG4gIGxldCBwYXRoUGFydCA9IFwiXCI7XG4gIGNvbnN0IGNvbXB1dGVkUGF0aDogc3RyaW5nW10gPSBbXTtcblxuICBsZXQgaXNGaXJzdCA9IHRydWU7XG4gIGZvciAoY29uc3QgY2hhciBvZiBub3RhdGlvbikge1xuICAgIC8vICEgYXQgcG9zaXRpb24gMCAtPiBFbmFibGUgTk9UIG1vZGlmaWVyLCBkb250IGNvdW50IHRvd2FyZHMgaWR4XG4gICAgaWYgKGlzRmlyc3QgJiYgY2hhciA9PT0gXCIhXCIpIHtcbiAgICAgIG5vdE1vZGlmaWVyID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UsIHBvc2l0aW9uIDAgbXVzdCBiZSBhIHByZWZpeFxuICAgIGVsc2UgaWYgKGlzRmlyc3QpIHtcbiAgICAgIGNvbnN0IHByZWZpeCA9IHByZWZpeE1hcHBpbmcuZ2V0KGNoYXIpO1xuXG4gICAgICBpZiAoIXByZWZpeCkge1xuICAgICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKFxuICAgICAgICAgIEVycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX05PVEFUSU9OX1NZTlRBWCxcbiAgICAgICAgICBub3RhdGlvbixcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29tcHV0ZWRQYXRoLnB1c2gocHJlZml4KTtcbiAgICAgIGlzRmlyc3QgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDb2xsZWN0IGNoYXJhY3RlcnMgYW5kIHB1c2ggd2hlbiBoaXR0aW5nIGEgZG90IG9yIGVuZFxuICAgIGVsc2UgaWYgKGNoYXIgPT09IFwiLlwiKSB7XG4gICAgICBpZiAocGF0aFBhcnQubGVuZ3RoKSB7XG4gICAgICAgIGNvbXB1dGVkUGF0aC5wdXNoKHBhdGhQYXJ0KTtcbiAgICAgICAgcGF0aFBhcnQgPSBcIlwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihcbiAgICAgICAgICBFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9OT1RBVElPTl9TWU5UQVgsXG4gICAgICAgICAgbm90YXRpb24sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdGhQYXJ0ICs9IGNoYXI7XG4gICAgfVxuICB9XG5cbiAgLy8gQWRkIHRoZSBmaW5hbCBwYXJ0IHdoaWNoIG11c3QgZXhpc3QgKG90aGVyd2lzZSwgaXQgZW5kZWQgaW4gYSBkb3QpXG4gIGlmICghcGF0aFBhcnQubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihcbiAgICAgIEVycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX05PVEFUSU9OX1NZTlRBWCxcbiAgICAgIG5vdGF0aW9uLFxuICAgICk7XG4gIH1cblxuICBjb21wdXRlZFBhdGgucHVzaChwYXRoUGFydCk7XG5cbiAgaWYgKGNvbXB1dGVkUGF0aC5sZW5ndGggPCAyKSB7XG4gICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihcbiAgICAgIEVycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX05PVEFUSU9OX1NZTlRBWCxcbiAgICAgIG5vdGF0aW9uLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBwYXJzZWROb3RhdGlvbjogUGFyc2VkTm90YXRpb24gPSB7XG4gICAgYmFzZTogbm90YXRpb24sXG4gICAgcGF0aDogY29tcHV0ZWRQYXRoLFxuICAgIG1vZGlmaWVyczogbm90TW9kaWZpZXIgPyB7IG5vdDogdHJ1ZSB9IDogdW5kZWZpbmVkLFxuICB9O1xuXG4gIHBhcnNlZE5vdGF0aW9uQ2FjaGUuc2V0KG5vdGF0aW9uLCBwYXJzZWROb3RhdGlvbik7XG5cbiAgcmV0dXJuIHBhcnNlZE5vdGF0aW9uO1xufVxuXG5leHBvcnQgdHlwZSBOb3RhdGlvbkFjY2Vzc29yID0gKHNvdXJjZTogdW5rbm93bikgPT4gdW5rbm93bjtcblxuZXhwb3J0IGNvbnN0IHZhbHVlQWNjZXNzb3JDYWNoZSA9IG5ldyBMUlVDYWNoZTxzdHJpbmcsIE5vdGF0aW9uQWNjZXNzb3I+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFZhbHVlQWNjZXNzb3Iobm90YXRpb246IFBhcnNlZE5vdGF0aW9uKTogTm90YXRpb25BY2Nlc3NvciB7XG4gIGNvbnN0IHsgcGF0aCwgbW9kaWZpZXJzLCBiYXNlIH0gPSBub3RhdGlvbjtcblxuICBjb25zdCBjYWNoZWQgPSB2YWx1ZUFjY2Vzc29yQ2FjaGUuZ2V0KGJhc2UpO1xuICBpZiAoY2FjaGVkKSB7XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfVxuXG4gIGlmIChwYXRoLmxlbmd0aCA8IDIpIHtcbiAgICAvLyBOb3RhdGlvbnMgbXVzdCBhbHdheXMgaGF2ZSBhdCBsZWFzdCAyIHBhcnRzOiB0aGUgbmFtZXNwYWNlLCBhbmQgYXQgbGVhc3RcbiAgICAvLyBvbmUgcHJvcGVydHkgbmFtZSBvbiB0aGUgbmFtZXNwYWNlIChleGFtcGxlOiBbXCJzdGF0ZVwiLCBcInZpc2libGVcIl0pXG4gICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuSU5WQVJJQU5UKTtcbiAgfVxuXG4gIGNvbnN0IGFjY2Vzc29yID0gKHNvdXJjZTogdW5rbm93bikgPT4ge1xuICAgIGxldCBjdXJyZW50ID0gc291cmNlO1xuXG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhdGgpIHtcbiAgICAgIGlmICghY3VycmVudCB8fCB0eXBlb2YgY3VycmVudCAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY3VycmVudCA9IGN1cnJlbnRbcGFydCBhcyBrZXlvZiB0eXBlb2YgY3VycmVudF07XG4gICAgfVxuXG4gICAgaWYgKG1vZGlmaWVycz8ubm90KSB7XG4gICAgICBpZiAocGF0aFswXSA9PT0gXCJhdHRyXCIpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQgIT09IFwiXCIgJiYgIWN1cnJlbnQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gIWN1cnJlbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnQ7XG4gIH07XG5cbiAgdmFsdWVBY2Nlc3NvckNhY2hlLnNldChiYXNlLCBhY2Nlc3Nvcik7XG5cbiAgcmV0dXJuIGFjY2Vzc29yO1xufVxuIiwKICAgICJpbXBvcnQgeyBodG1sVG9GcmFnbWVudCB9IGZyb20gXCIjdXRpbFwiO1xuaW1wb3J0IHsgRGlyZWN0aXZlIH0gZnJvbSBcIi4vZGlyZWN0aXZlXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCIuL3RlbXBsYXRlXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBodG1sU3RyaW5nVG9UZW1wbGF0ZShodG1sOiBzdHJpbmcpOiBUZW1wbGF0ZSB7XG4gIGNvbnN0IGZyYWdtZW50ID0gaHRtbFRvRnJhZ21lbnQoaHRtbCk7XG4gIGNvbnN0IHRlbXBsYXRlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgdGVtcGxhdGVFbGVtZW50LmNvbnRlbnQuYXBwZW5kQ2hpbGQoZnJhZ21lbnQpO1xuICByZXR1cm4gbmV3IFRlbXBsYXRlKHRlbXBsYXRlRWxlbWVudCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0T3BlcmFibGVOb2RlcyhcbiAgZnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQsXG4pOiBIVE1MRWxlbWVudFtdIHtcbiAgY29uc3Qgd2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihmcmFnbWVudCwgTm9kZUZpbHRlci5TSE9XX0VMRU1FTlQpO1xuICBjb25zdCBrbm93bklnbm9yZXMgPSBuZXcgU2V0PE5vZGU+KCk7XG4gIGNvbnN0IG5vZGVzOiBIVE1MRWxlbWVudFtdID0gW107XG5cbiAgbGV0IGN1cnJlbnROb2RlOiBOb2RlIHwgbnVsbCA9IHdhbGtlci5uZXh0Tm9kZSgpO1xuXG4gIHdoaWxlIChjdXJyZW50Tm9kZSkge1xuICAgIGlmICghKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICBjdXJyZW50Tm9kZSA9IHdhbGtlci5uZXh0Tm9kZSgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgbGV0IHBhcmVudCA9IGN1cnJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgbGV0IGlzSW5vcGVyYWJsZSA9IGZhbHNlO1xuXG4gICAgd2hpbGUgKHBhcmVudCAmJiAhaXNJbm9wZXJhYmxlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGtub3duSWdub3Jlcy5oYXMocGFyZW50KSB8fFxuICAgICAgICAocGFyZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiZcbiAgICAgICAgICAocGFyZW50Lmhhc0F0dHJpYnV0ZShEaXJlY3RpdmUuRWFjaCkgfHxcbiAgICAgICAgICAgIHBhcmVudC5oYXNBdHRyaWJ1dGUoRGlyZWN0aXZlLklmKSB8fFxuICAgICAgICAgICAgcGFyZW50Lmhhc0F0dHJpYnV0ZShEaXJlY3RpdmUuRWxzZSkgfHxcbiAgICAgICAgICAgIHBhcmVudC5oYXNBdHRyaWJ1dGUoRGlyZWN0aXZlLkVsc2VJZikpKVxuICAgICAgKSB7XG4gICAgICAgIGlzSW5vcGVyYWJsZSA9IHRydWU7XG4gICAgICAgIGtub3duSWdub3Jlcy5hZGQoY3VycmVudE5vZGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGU7XG4gICAgfVxuXG4gICAgaWYgKCFpc0lub3BlcmFibGUpIHtcbiAgICAgIG5vZGVzLnB1c2goY3VycmVudE5vZGUpO1xuICAgIH1cblxuICAgIGN1cnJlbnROb2RlID0gd2Fsa2VyLm5leHROb2RlKCk7XG4gIH1cblxuICByZXR1cm4gbm9kZXM7XG59XG4iLAogICAgIi8qXG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuXG5pbXBvcnQgeyBFcnJvckNvZGUsIFBhbGV0dGVFcnJvciB9IGZyb20gXCIjZXJyb3JcIjtcbmltcG9ydCB7IGNyZWF0ZUF0dHJpYnV0ZU1hcCwgTFJVQ2FjaGUsIHNhdmVGcmFnbWVudCB9IGZyb20gXCIjdXRpbFwiO1xuaW1wb3J0IHsgUkVGX0FUVFIgfSBmcm9tIFwiLi9jb25zdGFudFwiO1xuaW1wb3J0IHsgRGlyZWN0aXZlIH0gZnJvbSBcIi4vZGlyZWN0aXZlXCI7XG5pbXBvcnQgeyB0eXBlIFBhcnNlZE5vdGF0aW9uLCBwYXJzZU5vdGF0aW9uIH0gZnJvbSBcIi4vc3ludGF4XCI7XG5pbXBvcnQgdHlwZSB7XG4gIEFueVNjaGVtZSxcbiAgQXR0cmlidXRlVXBkYXRlU2NoZW1lLFxuICBDb25kaXRpb25hbFJlbmRlclNjaGVtZSxcbiAgQ29uZGl0aW9uYWxSZW5kZXJTY2hlbWVCcmFuY2gsXG4gIENvbnRlbnRTd2FwU2NoZW1lLFxuICBMaXN0UmVuZGVyU2NoZW1lLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgY29sbGVjdE9wZXJhYmxlTm9kZXMgfSBmcm9tIFwiLi91dGlsXCI7XG5cbmNvbnN0IHJlcXVpcmVzTm90YXRpb24gPSBuZXcgU2V0PHN0cmluZz4oW1xuICBEaXJlY3RpdmUuRWFjaCxcbiAgRGlyZWN0aXZlLklmLFxuICBEaXJlY3RpdmUuRWxzZUlmLFxuICBEaXJlY3RpdmUuS2V5LFxuICBEaXJlY3RpdmUuU3dhcCxcbiAgRGlyZWN0aXZlLlRhZyxcbl0pO1xuXG4vKipcbiAqIEEgSlNPTi1zZXJpYWxpemFibGUgcmVwcmVzZW50YXRpb24gb2YgYSB7QGxpbmsgVGVtcGxhdGV9IGluc3RhbmNlLCBpbmNsdWRpbmdcbiAqIGV2ZXJ5dGhpbmcgbmVlZGVkIHRvIHJlY3JlYXRlIHRoZSB0ZW1wbGF0ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21waWxlZFRlbXBsYXRlIHtcbiAgaHRtbDogc3RyaW5nO1xuICBzY2hlbWVzOiBBbnlTY2hlbWVbXTtcbiAgbm90YXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBQYXJzZWROb3RhdGlvbj47XG59XG5cbmV4cG9ydCBjb25zdCBjb21waWxlZFRlbXBsYXRlQ2FjaGUgPSBuZXcgTFJVQ2FjaGU8XG4gIEhUTUxUZW1wbGF0ZUVsZW1lbnQsXG4gIENvbXBpbGVkVGVtcGxhdGVcbj4oKTtcblxuLyoqXG4gKiBDb21waWxlIGFuIHtAbGluayBIVE1MVGVtcGxhdGVFbGVtZW50fSBpbnRvIGEge0BsaW5rIENvbXBpbGVkVGVtcGxhdGV9IGZvclxuICogY2FjaGluZywgY2xvbmluZywgb3Igc3RvcmFnZS5cbiAqXG4gKiBDb21waWxlZCB0ZW1wbGF0ZSBvYmplY3RzIGNvbnRhaW4gYSBKU09OLXNlcmlhbGl6YWJsZSBkYXRhIHJlcHJlc2VudGF0aW9uIG9mXG4gKiBhIHRlbXBsYXRlIGFuZCBjYW4gYmUgcHJlcGFyZWQgdXNpbmcge0BsaW5rIHByZXBhcmVDb21waWxlZFRlbXBsYXRlfSB0b1xuICogY3JlYXRlIG5ldyBUZW1wbGF0ZSBpbnN0YW5jZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBjb21waWxlZCA9IGNvbXBpbGVUZW1wbGF0ZSgkdGVtcGxhdGVFbGVtZW50KTtcbiAqIGNvbnN0IHN0cmluZ2lmaWVkID0gSlNPTi5zdHJpbmdpZnkoY29tcGlsZWQpOyAvLyBhIEpTT04gdGVtcGxhdGUgYnVuZGxlXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGVUZW1wbGF0ZShzb3VyY2U6IEhUTUxUZW1wbGF0ZUVsZW1lbnQpOiBDb21waWxlZFRlbXBsYXRlIHtcbiAgLy8gQ2hlY2sgaWYgdGhlIHRlbXBsYXRlIGlzIGFscmVhZHkgY2FjaGVkXG4gIGNvbnN0IGNhY2hlZFRlbXBsYXRlID0gY29tcGlsZWRUZW1wbGF0ZUNhY2hlLmdldChzb3VyY2UpO1xuICBpZiAoY2FjaGVkVGVtcGxhdGUpIHtcbiAgICByZXR1cm4gY2FjaGVkVGVtcGxhdGU7XG4gIH1cblxuICBjb25zdCBwYXJzZWROb3RhdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgUGFyc2VkTm90YXRpb24+KCk7XG4gIGNvbnN0IGNvbXBpbGVkU2NoZW1lczogQW55U2NoZW1lW10gPSBbXTtcblxuICBsZXQgbmV4dE5vZGVSZWYgPSAwO1xuICBjb25zdCBlbnN1cmVOb2RlUmVmID0gKGVsOiBIVE1MRWxlbWVudCk6IHN0cmluZyA9PiB7XG4gICAgbGV0IHJlZiA9IGVsLmdldEF0dHJpYnV0ZShSRUZfQVRUUik7XG4gICAgaWYgKCFyZWYpIHtcbiAgICAgIHJlZiA9IGBlbC0ke25leHROb2RlUmVmKyt9YDtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZShSRUZfQVRUUiwgcmVmKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZjtcbiAgfTtcblxuICBjb25zdCBjbG9uZWRUZW1wbGF0ZUVsZW1lbnQgPSBzb3VyY2UuY29udGVudC5jbG9uZU5vZGUoXG4gICAgdHJ1ZSxcbiAgKSBhcyBEb2N1bWVudEZyYWdtZW50O1xuXG4gIGNvbnN0IG5vZGVzOiBIVE1MRWxlbWVudFtdID0gY29sbGVjdE9wZXJhYmxlTm9kZXMoY2xvbmVkVGVtcGxhdGVFbGVtZW50KTtcblxuICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gY3JlYXRlQXR0cmlidXRlTWFwKG5vZGUpO1xuXG4gICAgZm9yIChjb25zdCBbYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWVdIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgIC8vIEJhaWwgcXVpY2tseSBpZiB0aGlzIGlzbid0IGEgZGlyZWN0aXZlXG4gICAgICBpZiAoYXR0cmlidXRlVmFsdWUgPT09IG51bGwgfHwgYXR0cmlidXRlTmFtZVswXSAhPT0gXCI6XCIpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBzZWNvbmQgY2hhcmFjdGVyIGlzIG5vdCBhIGNvbG9uLCBpdCBpcyBhIGJpbmRpbmdcbiAgICAgIGlmIChhdHRyaWJ1dGVOYW1lWzFdICE9PSBcIjpcIikge1xuICAgICAgICBjb25zdCBiaW5kTmFtZSA9IGF0dHJpYnV0ZU5hbWUuc2xpY2UoMSk7XG5cbiAgICAgICAgY29uc3Qgc2NoZW1lOiBBdHRyaWJ1dGVVcGRhdGVTY2hlbWUgPSB7XG4gICAgICAgICAgdHlwZTogXCJhdHRyXCIsXG4gICAgICAgICAgbm90YXRpb246IHBhcnNlTm90YXRpb24oYXR0cmlidXRlVmFsdWUpLFxuICAgICAgICAgIGF0dHJpYnV0ZTogYmluZE5hbWUsXG4gICAgICAgICAgbm9kZVJlZjogZW5zdXJlTm9kZVJlZihub2RlKSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb21waWxlZFNjaGVtZXMucHVzaChzY2hlbWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBFeHBlY3QgYW55IDo6a2V5IHRvIGhhdmUgYW4gOjplYWNoXG4gICAgICBpZiAoYXR0cmlidXRlTmFtZSA9PT0gRGlyZWN0aXZlLktleSkge1xuICAgICAgICBpZiAoIWF0dHJpYnV0ZXMuaGFzKERpcmVjdGl2ZS5FYWNoKSkge1xuICAgICAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfS0VZX0RJUkVDVElWRSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEVuc3VyZSByZXF1aXJlZCBub3RhdGlvbnMgZXhpc3RcbiAgICAgIGlmIChyZXF1aXJlc05vdGF0aW9uLmhhcyhhdHRyaWJ1dGVOYW1lKSAmJiBhdHRyaWJ1dGVWYWx1ZSA9PT0gXCJcIikge1xuICAgICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKFxuICAgICAgICAgIEVycm9yQ29kZS5URU1QTEFURV9NSVNTSU5HX05PVEFUSU9OLFxuICAgICAgICAgIGF0dHJpYnV0ZU5hbWUsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGxldCBub3RhdGlvbiA9IHBhcnNlZE5vdGF0aW9ucy5nZXQoYXR0cmlidXRlVmFsdWUpO1xuXG4gICAgICBpZiAobm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBub3RhdGlvbiA9IHBhcnNlTm90YXRpb24oYXR0cmlidXRlVmFsdWUpO1xuICAgICAgICBwYXJzZWROb3RhdGlvbnMuc2V0KGF0dHJpYnV0ZVZhbHVlLCBub3RhdGlvbik7XG4gICAgICB9XG5cbiAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuXG4gICAgICAvLyBUQUcgQ0hBTkdFIFNDSEVNRVNcbiAgICAgIGlmIChhdHRyaWJ1dGVOYW1lID09PSBEaXJlY3RpdmUuVGFnKSB7XG4gICAgICAgIGNvbXBpbGVkU2NoZW1lcy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiBcInRhZ1wiLFxuICAgICAgICAgIG5vdGF0aW9uLFxuICAgICAgICAgIG5vZGVSZWY6IGVuc3VyZU5vZGVSZWYobm9kZSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBMSVNUIFJFTkRFUiBTQ0hFTUVTXG4gICAgICBlbHNlIGlmIChhdHRyaWJ1dGVOYW1lID09PSBEaXJlY3RpdmUuRWFjaCkge1xuICAgICAgICBjb25zdCBub2RlUmVmID0gZW5zdXJlTm9kZVJlZihub2RlKTtcblxuICAgICAgICAvLyBBIDo6a2V5IGRpcmVjdGl2ZSBpcyByZXF1aXJlZCB3aXRoIGFueSA6OmVhY2hcbiAgICAgICAgY29uc3Qga2V5Tm90YXRpb24gPSBub2RlLmdldEF0dHJpYnV0ZShEaXJlY3RpdmUuS2V5KTtcbiAgICAgICAgaWYgKGtleU5vdGF0aW9uID09PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuVEVNUExBVEVfTUlTU0lOR19MSVNUX0tFWSk7XG4gICAgICAgIH1cblxuICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShEaXJlY3RpdmUuS2V5KTtcblxuICAgICAgICBjb25zdCBsaXN0Q29udGVudEh0bWwgPSBub2RlLmlubmVySFRNTDtcblxuICAgICAgICB3aGlsZSAobm9kZS5maXJzdENoaWxkKSB7XG4gICAgICAgICAgbm9kZS5yZW1vdmVDaGlsZChub2RlLmZpcnN0Q2hpbGQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2NoZW1lOiBMaXN0UmVuZGVyU2NoZW1lID0ge1xuICAgICAgICAgIHR5cGU6IFwiZWFjaFwiLFxuICAgICAgICAgIG5vdGF0aW9uLFxuICAgICAgICAgIGtleU5vdGF0aW9uOiBwYXJzZU5vdGF0aW9uKGtleU5vdGF0aW9uKSxcbiAgICAgICAgICBub2RlUmVmLFxuICAgICAgICAgIGxpc3RDb250ZW50SHRtbCxcbiAgICAgICAgfTtcblxuICAgICAgICBjb21waWxlZFNjaGVtZXMucHVzaChzY2hlbWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBDT05URU5UIFNXQVAgU0NIRU1FU1xuICAgICAgZWxzZSBpZiAoYXR0cmlidXRlTmFtZSA9PT0gRGlyZWN0aXZlLlN3YXApIHtcbiAgICAgICAgY29uc3Qgc2NoZW1lOiBDb250ZW50U3dhcFNjaGVtZSA9IHtcbiAgICAgICAgICB0eXBlOiBcInN3YXBcIixcbiAgICAgICAgICBub3RhdGlvbixcbiAgICAgICAgICBub2RlUmVmOiBlbnN1cmVOb2RlUmVmKG5vZGUpLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbXBpbGVkU2NoZW1lcy5wdXNoKHNjaGVtZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIENPTkRJVElPTkFMIFJFTkRFUiBTQ0hFTUVTXG4gICAgICBlbHNlIGlmIChhdHRyaWJ1dGVOYW1lID09PSBEaXJlY3RpdmUuSWYpIHtcbiAgICAgICAgY29uc3Qgc2NoZW1lOiBDb25kaXRpb25hbFJlbmRlclNjaGVtZSA9IHtcbiAgICAgICAgICB0eXBlOiBcImNvbmRcIixcbiAgICAgICAgICBicmFuY2hlczogW10sXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gRmlyc3QgYnJhbmNoIC0gdGhpcyBJRlxuICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShEaXJlY3RpdmUuSWYpO1xuICAgICAgICBjb25zdCBpZkJyYW5jaDogQ29uZGl0aW9uYWxSZW5kZXJTY2hlbWVCcmFuY2ggPSB7XG4gICAgICAgICAgdHlwZTogRGlyZWN0aXZlLklmLFxuICAgICAgICAgIG5vdGF0aW9uLFxuICAgICAgICAgIGJyYW5jaFJvb3RSZWY6IGVuc3VyZU5vZGVSZWYobm9kZSksXG4gICAgICAgICAgYnJhbmNoVGVtcGxhdGVIVE1MOiBub2RlLmlubmVySFRNTCxcbiAgICAgICAgfTtcblxuICAgICAgICBzY2hlbWUuYnJhbmNoZXMucHVzaChpZkJyYW5jaCk7XG5cbiAgICAgICAgbGV0IGNvbmROb2RlID0gbm9kZS5uZXh0RWxlbWVudFNpYmxpbmc7XG5cbiAgICAgICAgLy8gQ2hlY2sgZnV0dXJlIG5vZGVzIGZvciBlbHNlLWlmXG4gICAgICAgIHdoaWxlIChjb25kTm9kZT8uaGFzQXR0cmlidXRlKERpcmVjdGl2ZS5FbHNlSWYpKSB7XG4gICAgICAgICAgaWYgKCEoY29uZE5vZGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGJhc2VFbHNlSWZOb3RhdGlvbiA9IGNvbmROb2RlLmdldEF0dHJpYnV0ZShEaXJlY3RpdmUuRWxzZUlmKTtcblxuICAgICAgICAgIGlmICghYmFzZUVsc2VJZk5vdGF0aW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKFxuICAgICAgICAgICAgICBFcnJvckNvZGUuVEVNUExBVEVfTUlTU0lOR19OT1RBVElPTixcbiAgICAgICAgICAgICAgRGlyZWN0aXZlLkVsc2VJZixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgdGhlIG5vdGF0aW9uIGhhcyBiZWVuIHBhcnNlZCBiZWZvcmUsIHJldXNlIHRoYXRcbiAgICAgICAgICBsZXQgcGFyc2VkRWxzZUlmTm90YXRpb24gPSBwYXJzZWROb3RhdGlvbnMuZ2V0KGJhc2VFbHNlSWZOb3RhdGlvbik7XG5cbiAgICAgICAgICBpZiAocGFyc2VkRWxzZUlmTm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcGFyc2VkRWxzZUlmTm90YXRpb24gPSBwYXJzZU5vdGF0aW9uKGJhc2VFbHNlSWZOb3RhdGlvbik7XG4gICAgICAgICAgICBwYXJzZWROb3RhdGlvbnMuc2V0KGJhc2VFbHNlSWZOb3RhdGlvbiwgcGFyc2VkRWxzZUlmTm90YXRpb24pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbmROb2RlLnJlbW92ZUF0dHJpYnV0ZShEaXJlY3RpdmUuRWxzZUlmKTtcblxuICAgICAgICAgIGNvbnN0IGVsc2VJZkJyYW5jaDogQ29uZGl0aW9uYWxSZW5kZXJTY2hlbWVCcmFuY2ggPSB7XG4gICAgICAgICAgICB0eXBlOiBEaXJlY3RpdmUuRWxzZUlmLFxuICAgICAgICAgICAgbm90YXRpb246IHBhcnNlZEVsc2VJZk5vdGF0aW9uLFxuICAgICAgICAgICAgYnJhbmNoUm9vdFJlZjogZW5zdXJlTm9kZVJlZihjb25kTm9kZSksXG4gICAgICAgICAgICBicmFuY2hUZW1wbGF0ZUhUTUw6IGNvbmROb2RlLmlubmVySFRNTCxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgc2NoZW1lLmJyYW5jaGVzLnB1c2goZWxzZUlmQnJhbmNoKTtcbiAgICAgICAgICBjb25kTm9kZSA9IGNvbmROb2RlLm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVsc2VcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNvbmROb2RlICYmXG4gICAgICAgICAgY29uZE5vZGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJlxuICAgICAgICAgIGNvbmROb2RlPy5oYXNBdHRyaWJ1dGUoRGlyZWN0aXZlLkVsc2UpXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbmROb2RlLnJlbW92ZUF0dHJpYnV0ZShEaXJlY3RpdmUuRWxzZSk7XG5cbiAgICAgICAgICBjb25zdCBlbHNlQnJhbmNoOiBDb25kaXRpb25hbFJlbmRlclNjaGVtZUJyYW5jaCA9IHtcbiAgICAgICAgICAgIHR5cGU6IERpcmVjdGl2ZS5FbHNlLFxuICAgICAgICAgICAgYnJhbmNoUm9vdFJlZjogZW5zdXJlTm9kZVJlZihjb25kTm9kZSksXG4gICAgICAgICAgICBicmFuY2hUZW1wbGF0ZUhUTUw6IGNvbmROb2RlLmlubmVySFRNTCxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgc2NoZW1lLmJyYW5jaGVzLnB1c2goZWxzZUJyYW5jaCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb21waWxlZFNjaGVtZXMucHVzaChzY2hlbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKF9fREVWX18pIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBhdHRyaWJ1dGVOYW1lID09PSBEaXJlY3RpdmUuRWxzZSB8fFxuICAgICAgICAgICAgYXR0cmlidXRlTmFtZSA9PT0gRGlyZWN0aXZlLkVsc2VJZlxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9DT05ESVRJT05BTCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc29sZS53YXJuKGBUZW1wbGF0ZTogJHthdHRyaWJ1dGVOYW1lfSBpcyBub3QgYSB2YWxpZCBkaXJlY3RpdmVgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG5vdGF0aW9uczogUmVjb3JkPHN0cmluZywgUGFyc2VkTm90YXRpb24+ID0ge307XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIHBhcnNlZE5vdGF0aW9ucykge1xuICAgIG5vdGF0aW9uc1trZXldID0gdmFsO1xuICB9XG5cbiAgY29uc3QgdGVtcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIHRlbXAuYXBwZW5kQ2hpbGQoY2xvbmVkVGVtcGxhdGVFbGVtZW50LmNsb25lTm9kZSh0cnVlKSk7XG4gIGNvbnN0IGh0bWwgPSB0ZW1wLmlubmVySFRNTDtcblxuICBjb25zdCBjb21waWxlZDogQ29tcGlsZWRUZW1wbGF0ZSA9IHtcbiAgICBodG1sLFxuICAgIHNjaGVtZXM6IGNvbXBpbGVkU2NoZW1lcyxcbiAgICBub3RhdGlvbnMsXG4gIH07XG5cbiAgLy8gQ2FjaGUgdGhlIGNvbXBpbGVkIHRlbXBsYXRlIGFuZCBodG1sL2ZyYWdtZW50IGNvbWJvIHRvIHByZXZlbnQgbmVlZGluZ1xuICAvLyB0byByZS1jcmVhdGUgdGhlIGZyYWdtZW50IGZyb20gSFRNTCBhZ2FpbiB3aGVuIGNvbXBpbGluZyBhdCBydW50aW1lXG4gIGNvbXBpbGVkVGVtcGxhdGVDYWNoZS5zZXQoc291cmNlLCBjb21waWxlZCk7XG4gIHNhdmVGcmFnbWVudChodG1sLCBjbG9uZWRUZW1wbGF0ZUVsZW1lbnQpO1xuXG4gIHJldHVybiBjb21waWxlZDtcbn1cbiIsCiAgICAiZXhwb3J0IGNvbnN0IFNLSVBQRURfSk9CID0gU3ltYm9sKFwibm9vcFwiKTtcbmV4cG9ydCB0eXBlIFNraXBwZWRKb2IgPSB0eXBlb2YgU0tJUFBFRF9KT0I7XG4iLAogICAgImltcG9ydCB7IGNsYXNzaWZ5IH0gZnJvbSBcIiNoZWxwZXJcIjtcbmltcG9ydCB7IHNlcmlhbGl6ZUF0dHJpYnV0ZSB9IGZyb20gXCIjdXRpbFwiO1xuaW1wb3J0IHR5cGUgeyBBdHRyaWJ1dGVVcGRhdGVQbGFuIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBTS0lQUEVEX0pPQiwgdHlwZSBTa2lwcGVkSm9iIH0gZnJvbSBcIi4vY29tbW9uXCI7XG5cbmV4cG9ydCB0eXBlIEF0dHJpYnV0ZVVwZGF0ZUpvYiA9IFtcbiAgbm9kZTogSFRNTEVsZW1lbnQsXG4gIG5hbWU6IHN0cmluZyxcbiAgdmFsdWU6IHN0cmluZyB8IG51bGwsXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZUF0dHJpYnV0ZUpvYihcbiAgcGxhbjogQXR0cmlidXRlVXBkYXRlUGxhbixcbiAgdmFsdWVzOiBNYXA8c3RyaW5nLCB1bmtub3duPixcbik6IEF0dHJpYnV0ZVVwZGF0ZUpvYiB8IFNraXBwZWRKb2Ige1xuICBjb25zdCByYXdWYWx1ZSA9IHZhbHVlcy5nZXQocGxhbi5ub3RhdGlvbi5iYXNlKTtcbiAgbGV0IHZhbHVlID0gdHlwZW9mIHJhd1ZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyByYXdWYWx1ZShwbGFuLm5vZGUpIDogcmF3VmFsdWU7XG5cbiAgLy8gUGFyc2UgdGhlIHZhbHVlIHdpdGggYGNsYXNzaWZ5YCBpZiBzZXR0aW5nIHRoZSBjbGFzcyBhdHRyaWJ1dGVcbiAgaWYgKHBsYW4uYXR0cmlidXRlID09PSBcImNsYXNzXCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdmFsdWUgPSBjbGFzc2lmeSh2YWx1ZSk7XG4gIH1cblxuICBjb25zdCBzZXJpYWxpemVkVmFsdWUgPSBzZXJpYWxpemVBdHRyaWJ1dGUodmFsdWUpO1xuICBjb25zdCBjdXJyZW50ID0gcGxhbi5ub2RlLmdldEF0dHJpYnV0ZShwbGFuLmF0dHJpYnV0ZSk7XG5cbiAgaWYgKHNlcmlhbGl6ZWRWYWx1ZSAhPT0gY3VycmVudCkge1xuICAgIHJldHVybiBbcGxhbi5ub2RlLCBwbGFuLmF0dHJpYnV0ZSwgc2VyaWFsaXplZFZhbHVlXTtcbiAgfVxuXG4gIHJldHVybiBTS0lQUEVEX0pPQjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bkF0dHJpYnV0ZUpvYnMoam9iczogQXR0cmlidXRlVXBkYXRlSm9iW10pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbbm9kZSwgbmFtZSwgdmFsdWVdIG9mIGpvYnMpIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9XG59XG4iLAogICAgImltcG9ydCB7IEVycm9yQ29kZSwgUGFsZXR0ZUVycm9yIH0gZnJvbSBcIiNlcnJvclwiO1xuaW1wb3J0IHsgRGlyZWN0aXZlIH0gZnJvbSBcIi4uL2RpcmVjdGl2ZVwiO1xuaW1wb3J0IHR5cGUge1xuICBDb25kaXRpb25hbFJlbmRlclBsYW4sXG4gIENvbmRpdGlvbmFsUmVuZGVyUGxhbkJyYW5jaCxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFNraXBwZWRKb2IgfSBmcm9tIFwiLi9jb21tb25cIjtcblxuZXhwb3J0IHR5cGUgQ29uZGl0aW9uYWxSZW5kZXJKb2IgPSBbXG4gIHBsYW46IENvbmRpdGlvbmFsUmVuZGVyUGxhbixcbiAgYnJhbmNoOiBDb25kaXRpb25hbFJlbmRlclBsYW5CcmFuY2ggfCBudWxsLFxuICB2YWx1ZXM6IE1hcDxzdHJpbmcsIHVua25vd24+LFxuXTtcblxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVDb25kaXRpb25hbFJlbmRlckpvYihcbiAgcGxhbjogQ29uZGl0aW9uYWxSZW5kZXJQbGFuLFxuICB2YWx1ZXM6IE1hcDxzdHJpbmcsIHVua25vd24+LFxuKTogQ29uZGl0aW9uYWxSZW5kZXJKb2IgfCBTa2lwcGVkSm9iIHtcbiAgLy8gRGV0ZXJtaW5lIHdoaWNoIGJyYW5jaCB0byBkaXBzbGF5XG4gIGxldCBkaXNwbGF5ZWRCcmFuY2g6IENvbmRpdGlvbmFsUmVuZGVyUGxhbkJyYW5jaCB8IG51bGwgPSBudWxsO1xuXG4gIGZvciAoY29uc3QgYnJhbmNoIG9mIHBsYW4uYnJhbmNoZXMpIHtcbiAgICBpZiAoYnJhbmNoLnR5cGUgPT09IERpcmVjdGl2ZS5FbHNlKSB7XG4gICAgICBkaXNwbGF5ZWRCcmFuY2ggPSBicmFuY2g7XG4gICAgICBicmVhaztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmF3VmFsdWUgPSB2YWx1ZXMuZ2V0KGJyYW5jaC5ub3RhdGlvbi5iYXNlKTtcbiAgICAgIGNvbnN0IHZhbHVlID1cbiAgICAgICAgdHlwZW9mIHJhd1ZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyByYXdWYWx1ZShwbGFuLnN0YXJ0KSA6IHJhd1ZhbHVlO1xuXG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgZGlzcGxheWVkQnJhbmNoID0gYnJhbmNoO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gW3BsYW4sIGRpc3BsYXllZEJyYW5jaCwgdmFsdWVzXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bkNvbmRpdGlvbmFsUmVuZGVySm9icyhqb2JzOiBDb25kaXRpb25hbFJlbmRlckpvYltdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW3BsYW4sIGJyYW5jaCwgdmFsdWVzXSBvZiBqb2JzKSB7XG4gICAgY29uc3QgcGFyZW50ID0gcGxhbi5zdGFydC5wYXJlbnROb2RlO1xuXG4gICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlRFTVBMQVRFX1BBUkVOVF9SRVFVSVJFRCk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGN1cnJlbnQgcm9vdCBhbmQgYnJhbmNoIHJvb3QgZGlmZmVyLCByZW1vdmUgY29udGVudFxuICAgIGlmIChicmFuY2ggPT09IG51bGwgfHwgIU9iamVjdC5pcyhwbGFuLmN1cnJlbnRSb290LCBicmFuY2guYnJhbmNoUm9vdCkpIHtcbiAgICAgIC8vIFJlbW92ZSBleGlzdGluZyBjb250ZW50IGlmIHRoZSBicmFuY2ggaGFzIGNoYW5nZWRcbiAgICAgIGNvbnN0IG5vZGVzVG9SZW1vdmUgPSBuZXcgU2V0PE5vZGU+KCk7XG5cbiAgICAgIGxldCBub2RlOiBOb2RlIHwgbnVsbCA9IHBsYW4uc3RhcnQ7XG4gICAgICB3aGlsZSAobm9kZSAmJiBub2RlICE9PSBwbGFuLmVuZCkge1xuICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgbm9kZXNUb1JlbW92ZS5hZGQobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgdG9SZW1vdmUgb2Ygbm9kZXNUb1JlbW92ZSkge1xuICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQodG9SZW1vdmUpO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGVuIGFkZCB0aGUgYnJhbmNoIHJvb3QgaWYgbmVlZCBiZVxuICAgICAgaWYgKGJyYW5jaCkge1xuICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGJyYW5jaC5icmFuY2hSb290LCBwbGFuLmVuZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTnVsbCBicmFuY2ggLT4gUmVuZGVyIG5vdGhpbmdcbiAgICBpZiAoYnJhbmNoID09PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UgcmVuZGVyIGJyYW5jaCB0ZW1wbGF0ZVxuICAgIGJyYW5jaC5icmFuY2hUZW1wbGF0ZS5yZW5kZXJXaXRoVmFsdWVzKGJyYW5jaC5icmFuY2hSb290LCB2YWx1ZXMpO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQXR0cmlidXRlTWFwIH0gZnJvbSBcIiNjb21wb25lbnRcIjtcbmltcG9ydCB7IEVycm9yQ29kZSwgUGFsZXR0ZUVycm9yIH0gZnJvbSBcIiNlcnJvclwiO1xuaW1wb3J0IHsgYXBwbHlBdHRyaWJ1dGVNYXAsIGNyZWF0ZUF0dHJpYnV0ZU1hcCB9IGZyb20gXCIjdXRpbFwiO1xuaW1wb3J0IHsgYnVpbGRWYWx1ZUFjY2Vzc29yIH0gZnJvbSBcIi4uL3N5bnRheFwiO1xuaW1wb3J0IHsgVGVtcGxhdGUsIHR5cGUgVGVtcGxhdGVDb250ZXh0IH0gZnJvbSBcIi4uL3RlbXBsYXRlXCI7XG5pbXBvcnQgdHlwZSB7IExpc3RSZW5kZXJQbGFuIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFNraXBwZWRKb2IgfSBmcm9tIFwiLi9jb21tb25cIjtcblxuZXhwb3J0IHR5cGUgTGlzdFJlbmRlckpvYkl0ZW0gPSB7XG4gIGNvbnRleHQ6IFRlbXBsYXRlQ29udGV4dDtcbiAgYXR0ck1hcDogQXR0cmlidXRlTWFwO1xuICByb290OiBIVE1MRWxlbWVudDtcbiAgdGVtcGxhdGU6IFRlbXBsYXRlO1xufTtcblxuZXhwb3J0IHR5cGUgTGlzdFJlbmRlckpvYiA9IFtwbGFuOiBMaXN0UmVuZGVyUGxhbiwgbGlzdDogTGlzdFJlbmRlckpvYkl0ZW1bXV07XG5cbmZ1bmN0aW9uIGZldGNoTGlzdERhdGEoXG4gIHBsYW46IExpc3RSZW5kZXJQbGFuLFxuICB2YWx1ZXM6IE1hcDxzdHJpbmcsIHVua25vd24+LFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSB7XG4gIGNvbnN0IG5vdGF0aW9uVmFsdWUgPSB2YWx1ZXMuZ2V0KHBsYW4ubm90YXRpb24uYmFzZSk7XG4gIGNvbnN0IGV2YWx1YXRlZFZhbHVlID1cbiAgICB0eXBlb2Ygbm90YXRpb25WYWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IG5vdGF0aW9uVmFsdWUocGxhbi5zdGFydE1hcmtlci5wYXJlbnROb2RlKVxuICAgICAgOiBub3RhdGlvblZhbHVlO1xuXG4gIGlmIChldmFsdWF0ZWRWYWx1ZSA9PT0gbnVsbCB8fCBldmFsdWF0ZWRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoZXZhbHVhdGVkVmFsdWUpKSB7XG4gICAgcmV0dXJuIGV2YWx1YXRlZFZhbHVlO1xuICB9XG5cbiAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9MSVNUX0RBVEEpO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0SFRNTEVsZW1lbnRzKHN0YXJ0OiBOb2RlLCBlbmQ6IE5vZGUpOiBTZXQ8SFRNTEVsZW1lbnQ+IHtcbiAgbGV0IG5vZGU6IE5vZGUgfCBudWxsID0gc3RhcnQ7XG4gIGNvbnN0IG5vZGVTZXQgPSBuZXcgU2V0PEhUTUxFbGVtZW50PigpO1xuXG4gIHdoaWxlIChub2RlICYmIG5vZGUgIT09IGVuZCkge1xuICAgIGlmIChub2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgIG5vZGVTZXQuYWRkKG5vZGUpO1xuICAgIH1cblxuICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuICB9XG5cbiAgcmV0dXJuIG5vZGVTZXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlTGlzdFJlbmRlckpvYihcbiAgcGxhbjogTGlzdFJlbmRlclBsYW4sXG4gIHZhbHVlczogTWFwPHN0cmluZywgdW5rbm93bj4sXG4pOiBMaXN0UmVuZGVySm9iIHwgU2tpcHBlZEpvYiB7XG4gIC8vIEZldGNoIHRoZSBkYXRhIGZvciByZW5kZXJpbmcgdGhlIHVwZGF0ZWQgbGlzdCBpdGVtc1xuICBjb25zdCBsaXN0RGF0YSA9IGZldGNoTGlzdERhdGEocGxhbiwgdmFsdWVzKTtcblxuICAvLyBFbXB0eSAtPiBSZW1vdmUgdGhlIGxpc3QgY29udGVudHMgZW50aXJlbHkgYW5kIGV4aXRcbiAgaWYgKGxpc3REYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbcGxhbiwgW11dO1xuICB9XG5cbiAgLy8gQ29sbGVjdCBleGlzdGluZyBlbGVtZW50cyBmcm9tIHRoZSBET00gZm9yIGFzc2Vzc21lbnRcbiAgY29uc3Qge1xuICAgIHJvd1RlbXBsYXRlc0J5Um9vdCxcbiAgICByb3dUZW1wbGF0ZUVsZW1lbnQsXG4gICAgcm93Um9vdFByb3RvdHlwZTogcm93Um9vdEVsZW1lbnQsXG4gIH0gPSBwbGFuO1xuICBjb25zdCBrZXlBY2Nlc3NvciA9IGJ1aWxkVmFsdWVBY2Nlc3NvcihwbGFuLmtleU5vdGF0aW9uKTtcbiAgY29uc3QgbGlzdFJlbmRlckNvbnRleHRzOiBNYXA8dW5rbm93biwgTGlzdFJlbmRlckpvYkl0ZW0+ID0gbmV3IE1hcCgpO1xuXG4gIGZvciAoY29uc3QgaXRlbSBvZiBsaXN0RGF0YSkge1xuICAgIGNvbnN0IGNvbnRleHQ6IFRlbXBsYXRlQ29udGV4dCA9IHtcbiAgICAgIGl0ZW0sXG4gICAgfTtcblxuICAgIGNvbnN0IGtleSA9IGtleUFjY2Vzc29yKGNvbnRleHQpO1xuXG4gICAgaWYgKGxpc3RSZW5kZXJDb250ZXh0cy5oYXMoa2V5KSkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihcbiAgICAgICAgRXJyb3JDb2RlLlRFTVBMQVRFX0RVUExJQ0FURV9MSVNUX0tFWSxcbiAgICAgICAgU3RyaW5nKGtleSksXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEdldCBvciBjcmVhdGUgdGhlIEhUTUwgRWxlbWVudCB3ZSBleHBlY3QgdG8gc2VlIGhlcmVcbiAgICBsZXQgcm93Um9vdCA9IHBsYW4ucm93Um9vdHNCeUtleS5nZXQoa2V5KTtcblxuICAgIGlmIChyb3dSb290ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJvd1Jvb3QgPSByb3dSb290RWxlbWVudC5jbG9uZU5vZGUoZmFsc2UpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgcGxhbi5yb3dSb290c0J5S2V5LnNldChrZXksIHJvd1Jvb3QpO1xuICAgIH1cblxuICAgIC8vIEdldCBvciBjcmVhdGUgdGhlIHRlbXBsYXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcm93IHJvb3RcbiAgICBsZXQgcm93VGVtcGxhdGUgPSByb3dUZW1wbGF0ZXNCeVJvb3QuZ2V0KHJvd1Jvb3QpO1xuXG4gICAgaWYgKHJvd1RlbXBsYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJvd1RlbXBsYXRlID0gbmV3IFRlbXBsYXRlKHJvd1RlbXBsYXRlRWxlbWVudCk7XG4gICAgICByb3dUZW1wbGF0ZXNCeVJvb3Quc2V0KHJvd1Jvb3QsIHJvd1RlbXBsYXRlKTtcbiAgICB9XG5cbiAgICBjb25zdCBqb2JJdGVtOiBMaXN0UmVuZGVySm9iSXRlbSA9IHtcbiAgICAgIGNvbnRleHQsXG4gICAgICByb290OiByb3dSb290LFxuICAgICAgdGVtcGxhdGU6IHJvd1RlbXBsYXRlLFxuICAgICAgYXR0ck1hcDogY3JlYXRlQXR0cmlidXRlTWFwKGl0ZW0pLFxuICAgIH07XG5cbiAgICBsaXN0UmVuZGVyQ29udGV4dHMuc2V0KGtleSwgam9iSXRlbSk7XG4gIH1cblxuICAvLyBDbGVhbiB1cCBjYWNoZWQgZGF0YVxuICBmb3IgKGNvbnN0IFtrZXksIHJvb3RdIG9mIHBsYW4ucm93Um9vdHNCeUtleSkge1xuICAgIGlmICghbGlzdFJlbmRlckNvbnRleHRzLmhhcyhrZXkpKSB7XG4gICAgICBwbGFuLnJvd1Jvb3RzQnlLZXkuZGVsZXRlKGtleSk7XG4gICAgICBwbGFuLnJvd1RlbXBsYXRlc0J5Um9vdC5kZWxldGUocm9vdCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFtwbGFuLCBBcnJheS5mcm9tKGxpc3RSZW5kZXJDb250ZXh0cy52YWx1ZXMoKSldO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuTGlzdFJlbmRlckpvYnMoam9iczogTGlzdFJlbmRlckpvYltdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW3BsYW4sIHJlbmRlckl0ZW1zXSBvZiBqb2JzKSB7XG4gICAgY29uc3QgeyBlbmRNYXJrZXIsIGxpc3RDb250YWluZXI6IGxpc3RDb250YWluZXJFbGVtZW50IH0gPSBwbGFuO1xuXG4gICAgLy8gRmFzdCBwYXRoIGZvciBlbXB0eSBsaXN0cyAtPiBSZW1vdmUgZXZlcnl0aGluZyBhbmQgY29udGludWVcbiAgICBpZiAocmVuZGVySXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBmb3IgKGNvbnN0IHJvb3Qgb2YgcGxhbi5yb3dSb290c0J5S2V5LnZhbHVlcygpKSB7XG4gICAgICAgIHJvb3QucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgICBwbGFuLnJvd1Jvb3RzQnlLZXkuY2xlYXIoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIE90aGVyd2lzZSwgc2NhbiB0aGUgY3VycmVudCBub2RlcyBhbmQgbW9kaWZ5IGFzIG5lZWRlZFxuICAgIGNvbnN0IGV4aXN0aW5nRE9NTm9kZXMgPSBBcnJheS5mcm9tKFxuICAgICAgY29sbGVjdEhUTUxFbGVtZW50cyhwbGFuLnN0YXJ0TWFya2VyLCBwbGFuLmVuZE1hcmtlciksXG4gICAgKTtcblxuICAgIGNvbnN0IHJvb3RzVG9LZWVwID0gbmV3IFNldDxIVE1MRWxlbWVudD4oKTtcblxuICAgIGxldCBleGlzdGluZ0RPTU5vZGVJZHggPSAwO1xuXG4gICAgZm9yIChjb25zdCByZW5kZXJJdGVtIG9mIHJlbmRlckl0ZW1zKSB7XG4gICAgICBjb25zdCB7IHJvb3QsIGF0dHJNYXAsIGNvbnRleHQsIHRlbXBsYXRlIH0gPSByZW5kZXJJdGVtO1xuICAgICAgY29uc3QgZXhpc3RpbmdET01Ob2RlID0gZXhpc3RpbmdET01Ob2Rlc1tleGlzdGluZ0RPTU5vZGVJZHhdO1xuXG4gICAgICAvLyBTcHJlYWQgaXRlbSBhcyBhdHRyaWJ1dGVzIG9uIHRoZSByb290IGFuZCB1cGRhdGUgdGhlIHRlbXBsYXRlXG4gICAgICBhcHBseUF0dHJpYnV0ZU1hcChyb290LCBhdHRyTWFwKTtcbiAgICAgIHRlbXBsYXRlLnJlbmRlcihyb290LCBjb250ZXh0KTtcblxuICAgICAgcm9vdHNUb0tlZXAuYWRkKHJvb3QpO1xuXG4gICAgICAvLyBOb2RlIGlzIHRoZSBleGlzdGluZyBET00gTm9kZSwgY29udGludWVcbiAgICAgIGlmIChPYmplY3QuaXMoZXhpc3RpbmdET01Ob2RlLCByb290KSkge1xuICAgICAgICBleGlzdGluZ0RPTU5vZGVJZHggKz0gMTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIE5vIGV4aXN0aW5nIG5vZGUgLT4gYXBwZW5kIGl0ZW1cbiAgICAgIGlmICghZXhpc3RpbmdET01Ob2RlKSB7XG4gICAgICAgIGxpc3RDb250YWluZXJFbGVtZW50Lmluc2VydEJlZm9yZShyb290LCBlbmRNYXJrZXIpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gRE9NIG5vZGUgZXhpc3RzIGJ1dCBpc24ndCB0aGUgb25lIHdlJ3JlIGxvb2tpbmcgZm9yLiBJbnNlcnQgYmVmb3JlLlxuICAgICAgbGlzdENvbnRhaW5lckVsZW1lbnQuaW5zZXJ0QmVmb3JlKHJvb3QsIGV4aXN0aW5nRE9NTm9kZSk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGFueSByZW1haW5pbmcgb2xkIGVsZW1lbnRzXG4gICAgZm9yIChjb25zdCByb290IG9mIGV4aXN0aW5nRE9NTm9kZXMpIHtcbiAgICAgIGlmICghcm9vdHNUb0tlZXAuaGFzKHJvb3QpKSB7XG4gICAgICAgIHJvb3QucmVtb3ZlKCk7XG4gICAgICAgIHBsYW4ucm93VGVtcGxhdGVzQnlSb290LmRlbGV0ZShyb290KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgRXJyb3JDb2RlLCBQYWxldHRlRXJyb3IgfSBmcm9tIFwiI2Vycm9yXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRlbnRTd2FwUGxhbiB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgU0tJUFBFRF9KT0IsIHR5cGUgU2tpcHBlZEpvYiB9IGZyb20gXCIuL2NvbW1vblwiO1xuXG5leHBvcnQgdHlwZSBDb250ZW50U3dhcEpvYiA9IFtwbGFuOiBDb250ZW50U3dhcFBsYW4sIHN3YXA6IE5vZGVdO1xuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZUNvbnRlbnRTd2FwSm9iKFxuICBwbGFuOiBDb250ZW50U3dhcFBsYW4sXG4gIHZhbHVlczogTWFwPHN0cmluZywgdW5rbm93bj4sXG4pOiBDb250ZW50U3dhcEpvYiB8IFNraXBwZWRKb2Ige1xuICBjb25zdCByYXdWYWx1ZSA9IHZhbHVlcy5nZXQocGxhbi5ub3RhdGlvbi5iYXNlKTtcbiAgY29uc3QgdmFsdWUgPSB0eXBlb2YgcmF3VmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IHJhd1ZhbHVlKHBsYW4ubm9kZSkgOiByYXdWYWx1ZTtcblxuICAvLyBTdHJpbmcsIE51bWJlciwgQm9vbGVhbiAtPiBUZXh0IE5vZGVcbiAgaWYgKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiB8fFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCJcbiAgKSB7XG4gICAgY29uc3QgYXNTdHIgPSBgJHt2YWx1ZX1gO1xuICAgIGlmIChwbGFuLm5vZGUudGV4dENvbnRlbnQgPT09IGFzU3RyKSB7XG4gICAgICByZXR1cm4gU0tJUFBFRF9KT0I7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtwbGFuLCBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhc1N0cildO1xuICB9XG5cbiAgLy8gTnVsbGlzaCB2YWx1ZXMgLT4gQ29tbWVudFxuICBlbHNlIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHBsYW4ubm9kZSBpbnN0YW5jZW9mIENvbW1lbnQpIHtcbiAgICAgIHJldHVybiBTS0lQUEVEX0pPQjtcbiAgICB9XG5cbiAgICByZXR1cm4gW3BsYW4sIGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoXCJlbXB0eVwiKV07XG4gIH1cblxuICAvLyBIVE1MRWxlbWVudCAtPiBTd2FwIG5vZGVzXG4gIGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICBpZiAoT2JqZWN0LmlzKHBsYW4ubm9kZSwgdmFsdWUpKSB7XG4gICAgICByZXR1cm4gU0tJUFBFRF9KT0I7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtwbGFuLCB2YWx1ZS5jbG9uZU5vZGUodHJ1ZSldO1xuICB9XG5cbiAgLy8gQW55dGhpbmcgZWxzZSAtPiBVbnN1cHBvcnRlZFxuICBlbHNlIHtcbiAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKFxuICAgICAgRXJyb3JDb2RlLklOVkFMSURfQ09OVEVOVCxcbiAgICAgIHR5cGVvZiB2YWx1ZSxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHZhbHVlKSxcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5Db250ZW50U3dhcEpvYnMoam9iczogQ29udGVudFN3YXBKb2JbXSk6IHZvaWQge1xuICBmb3IgKGNvbnN0IFtwbGFuLCByZXBsYWNlXSBvZiBqb2JzKSB7XG4gICAgY29uc3QgcGFyZW50ID0gcGxhbi5ub2RlLnBhcmVudE5vZGU7XG5cbiAgICBpZiAoIXBhcmVudCkge1xuICAgICAgLy8gU2hvdWxkIG5ldmVyIGhhcHBlbiBpbiBwcmFjdGljZVxuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuSU5WQVJJQU5UKTtcbiAgICB9XG5cbiAgICBwYXJlbnQucmVwbGFjZUNoaWxkKHJlcGxhY2UsIHBsYW4ubm9kZSk7XG4gICAgcGxhbi5ub2RlID0gcmVwbGFjZTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFRhZ0NoYW5nZVBsYW4gfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFNLSVBQRURfSk9CLCB0eXBlIFNraXBwZWRKb2IgfSBmcm9tIFwiLi9jb21tb25cIjtcblxuZXhwb3J0IHR5cGUgVGFnQ2hhbmdlSm9iID0gW3BsYW46IFRhZ0NoYW5nZVBsYW4sIG5ld1RhZzogc3RyaW5nXTtcblxuLyoqXG4gKiBHaXZlbiBhbiBlbGVtZW50LCByZXBsYWNlIGl0IHdpdGggYSBkaWZmZXJlbnQgdGFnLCBhZG9wdGluZyBhbGwgYXR0cmlidXRlc1xuICogYW5kIGNoaWxkIGVsZW1lbnRzLlxuICogQHBhcmFtICR0YXJnZXQgVGhlIGVsZW1lbnQgdG8gc3dhcCBvdXRcbiAqIEBwYXJhbSBuZXdUYWcgVGhlIG5ldyBIVE1MIHRhZ05hbWUgdG8gdXNlXG4gKiBAcmV0dXJucyBUaGUgbmV3bHkgc3dhcHBlZC1pbiBlbGVtZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGFuZ2VUYWcoJHRhcmdldDogSFRNTEVsZW1lbnQsIG5ld1RhZzogc3RyaW5nKTogSFRNTEVsZW1lbnQge1xuICBjb25zdCAkbmV3RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5ld1RhZyk7XG5cbiAgd2hpbGUgKCR0YXJnZXQuZmlyc3RDaGlsZCAhPT0gbnVsbCkge1xuICAgICRuZXdFbC5hcHBlbmRDaGlsZCgkdGFyZ2V0LmZpcnN0Q2hpbGQpO1xuICB9XG5cbiAgZm9yIChjb25zdCBhdHRyTmFtZSBvZiAkdGFyZ2V0LmdldEF0dHJpYnV0ZU5hbWVzKCkpIHtcbiAgICBjb25zdCB2YWwgPSAkdGFyZ2V0LmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7XG5cbiAgICBpZiAodmFsICE9PSBudWxsKSB7XG4gICAgICAkbmV3RWwuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCB2YWwpO1xuICAgIH1cbiAgfVxuXG4gICR0YXJnZXQucmVwbGFjZVdpdGgoJG5ld0VsKTtcbiAgcmV0dXJuICRuZXdFbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVUYWdDaGFuZ2VKb2IoXG4gIHBsYW46IFRhZ0NoYW5nZVBsYW4sXG4gIHZhbHVlczogTWFwPHN0cmluZywgdW5rbm93bj4sXG4pOiBUYWdDaGFuZ2VKb2IgfCBTa2lwcGVkSm9iIHtcbiAgY29uc3QgcmF3VmFsdWUgPSB2YWx1ZXMuZ2V0KHBsYW4ubm90YXRpb24uYmFzZSkgPz8gXCJcIjtcbiAgY29uc3QgdmFsdWUgPSB0eXBlb2YgcmF3VmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IHJhd1ZhbHVlKHBsYW4ubm9kZSkgOiByYXdWYWx1ZTtcbiAgY29uc3QgbmV4dFRhZyA9IGAke3ZhbHVlfWAudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgY3VycmVudFRhZyA9IHBsYW4ubm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgaWYgKCFuZXh0VGFnIHx8IG5leHRUYWcgPT09IGN1cnJlbnRUYWcpIHtcbiAgICByZXR1cm4gU0tJUFBFRF9KT0I7XG4gIH1cblxuICByZXR1cm4gW3BsYW4sIG5leHRUYWddO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuVGFnQ2hhbmdlSm9icyhqb2JzOiBUYWdDaGFuZ2VKb2JbXSk6IHZvaWQge1xuICBmb3IgKGNvbnN0IFtwbGFuLCBuZXh0VGFnXSBvZiBqb2JzKSB7XG4gICAgcGxhbi5ub2RlID0gY2hhbmdlVGFnKHBsYW4ubm9kZSwgbmV4dFRhZyk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgRXJyb3JDb2RlLCBQYWxldHRlRXJyb3IgfSBmcm9tIFwiI2Vycm9yXCI7XG5pbXBvcnQgdHlwZSB7IEFueVJlbmRlclBsYW4gfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIHR5cGUgQXR0cmlidXRlVXBkYXRlSm9iLFxuICBwcmVwYXJlQXR0cmlidXRlSm9iLFxuICBydW5BdHRyaWJ1dGVKb2JzLFxufSBmcm9tIFwiLi9hdHRyaWJ1dGVcIjtcbmltcG9ydCB7IFNLSVBQRURfSk9CIH0gZnJvbSBcIi4vY29tbW9uXCI7XG5pbXBvcnQge1xuICB0eXBlIENvbmRpdGlvbmFsUmVuZGVySm9iLFxuICBwcmVwYXJlQ29uZGl0aW9uYWxSZW5kZXJKb2IsXG4gIHJ1bkNvbmRpdGlvbmFsUmVuZGVySm9icyxcbn0gZnJvbSBcIi4vY29uZGl0aW9uYWxcIjtcbmltcG9ydCB7XG4gIHR5cGUgTGlzdFJlbmRlckpvYixcbiAgcHJlcGFyZUxpc3RSZW5kZXJKb2IsXG4gIHJ1bkxpc3RSZW5kZXJKb2JzLFxufSBmcm9tIFwiLi9saXN0XCI7XG5pbXBvcnQge1xuICB0eXBlIENvbnRlbnRTd2FwSm9iLFxuICBwcmVwYXJlQ29udGVudFN3YXBKb2IsXG4gIHJ1bkNvbnRlbnRTd2FwSm9icyxcbn0gZnJvbSBcIi4vc3dhcFwiO1xuaW1wb3J0IHtcbiAgcHJlcGFyZVRhZ0NoYW5nZUpvYixcbiAgcnVuVGFnQ2hhbmdlSm9icyxcbiAgdHlwZSBUYWdDaGFuZ2VKb2IsXG59IGZyb20gXCIuL3RhZ1wiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9hdHRyaWJ1dGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbW1vblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29uZGl0aW9uYWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xpc3RcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3N3YXBcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RhZ1wiO1xuXG5pbnRlcmZhY2UgUmVuZGVySm9icyB7XG4gIGNvbmRpdGlvbmFsczogQ29uZGl0aW9uYWxSZW5kZXJKb2JbXTtcbiAgYXR0cmlidXRlczogQXR0cmlidXRlVXBkYXRlSm9iW107XG4gIHN3YXBzOiBDb250ZW50U3dhcEpvYltdO1xuICB0YWdzOiBUYWdDaGFuZ2VKb2JbXTtcbiAgbGlzdHM6IExpc3RSZW5kZXJKb2JbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUpvYnNGcm9tUGxhbnMoXG4gIHBsYW5zOiBTZXQ8QW55UmVuZGVyUGxhbj4sXG4gIG5ld1ZhbHVlczogTWFwPHN0cmluZywgdW5rbm93bj4sXG4pOiBSZW5kZXJKb2JzIHtcbiAgY29uc3Qgam9iczogUmVuZGVySm9icyA9IHtcbiAgICBjb25kaXRpb25hbHM6IFtdLFxuICAgIGF0dHJpYnV0ZXM6IFtdLFxuICAgIHN3YXBzOiBbXSxcbiAgICB0YWdzOiBbXSxcbiAgICBsaXN0czogW10sXG4gIH07XG5cbiAgZm9yIChjb25zdCBwbGFuIG9mIHBsYW5zKSB7XG4gICAgc3dpdGNoIChwbGFuLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJjb25kXCI6IHtcbiAgICAgICAgY29uc3Qgam9iID0gcHJlcGFyZUNvbmRpdGlvbmFsUmVuZGVySm9iKHBsYW4sIG5ld1ZhbHVlcyk7XG4gICAgICAgIGlmIChqb2IgIT09IFNLSVBQRURfSk9CKSB7XG4gICAgICAgICAgam9icy5jb25kaXRpb25hbHMucHVzaChqb2IpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBcImF0dHJcIjoge1xuICAgICAgICBjb25zdCBqb2IgPSBwcmVwYXJlQXR0cmlidXRlSm9iKHBsYW4sIG5ld1ZhbHVlcyk7XG4gICAgICAgIGlmIChqb2IgIT09IFNLSVBQRURfSk9CKSB7XG4gICAgICAgICAgam9icy5hdHRyaWJ1dGVzLnB1c2goam9iKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJlYWNoXCI6IHtcbiAgICAgICAgY29uc3Qgam9iID0gcHJlcGFyZUxpc3RSZW5kZXJKb2IocGxhbiwgbmV3VmFsdWVzKTtcbiAgICAgICAgaWYgKGpvYiAhPT0gU0tJUFBFRF9KT0IpIHtcbiAgICAgICAgICBqb2JzLmxpc3RzLnB1c2goam9iKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJzd2FwXCI6IHtcbiAgICAgICAgY29uc3Qgam9iID0gcHJlcGFyZUNvbnRlbnRTd2FwSm9iKHBsYW4sIG5ld1ZhbHVlcyk7XG4gICAgICAgIGlmIChqb2IgIT09IFNLSVBQRURfSk9CKSB7XG4gICAgICAgICAgam9icy5zd2Fwcy5wdXNoKGpvYik7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwidGFnXCI6IHtcbiAgICAgICAgY29uc3Qgam9iID0gcHJlcGFyZVRhZ0NoYW5nZUpvYihwbGFuLCBuZXdWYWx1ZXMpO1xuICAgICAgICBpZiAoam9iICE9PSBTS0lQUEVEX0pPQikge1xuICAgICAgICAgIGpvYnMudGFncy5wdXNoKGpvYik7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBTaG91bGQgYmUgaW1wb3NzaWJsZSBnaXZlbiBhbiBleGhhdXN0aXZlIHN3aXRjaCBjYXNlXG4gICAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLklOVkFSSUFOVCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGpvYnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRlUmVuZGVySm9icyhqb2JzOiBSZW5kZXJKb2JzKTogdm9pZCB7XG4gIHJ1bkNvbmRpdGlvbmFsUmVuZGVySm9icyhqb2JzLmNvbmRpdGlvbmFscyk7XG4gIHJ1bkF0dHJpYnV0ZUpvYnMoam9icy5hdHRyaWJ1dGVzKTtcbiAgcnVuTGlzdFJlbmRlckpvYnMoam9icy5saXN0cyk7XG4gIHJ1bkNvbnRlbnRTd2FwSm9icyhqb2JzLnN3YXBzKTtcbiAgcnVuVGFnQ2hhbmdlSm9icyhqb2JzLnRhZ3MpO1xufVxuIiwKICAgICIvKlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cbmltcG9ydCB7IEVycm9yQ29kZSwgUGFsZXR0ZUVycm9yIH0gZnJvbSBcIiNlcnJvclwiO1xuaW1wb3J0IHsgaHRtbFRvRnJhZ21lbnQgfSBmcm9tIFwiI3V0aWxcIjtcbmltcG9ydCB0eXBlIHsgQ29tcGlsZWRUZW1wbGF0ZSB9IGZyb20gXCIuL2NvbXBpbGVcIjtcbmltcG9ydCB7IFJFRl9BVFRSIH0gZnJvbSBcIi4vY29uc3RhbnRcIjtcbmltcG9ydCB7IERpcmVjdGl2ZSB9IGZyb20gXCIuL2RpcmVjdGl2ZVwiO1xuaW1wb3J0IHsgYnVpbGRWYWx1ZUFjY2Vzc29yLCB0eXBlIE5vdGF0aW9uQWNjZXNzb3IgfSBmcm9tIFwiLi9zeW50YXhcIjtcbmltcG9ydCB0eXBlIHsgVGVtcGxhdGUgfSBmcm9tIFwiLi90ZW1wbGF0ZVwiO1xuaW1wb3J0IHR5cGUge1xuICBBbnlSZW5kZXJQbGFuLFxuICBBdHRyaWJ1dGVVcGRhdGVQbGFuLFxuICBDb25kaXRpb25hbFJlbmRlclBsYW4sXG4gIENvbnRlbnRTd2FwUGxhbixcbiAgTGlzdFJlbmRlclBsYW4sXG4gIFRhZ0NoYW5nZVBsYW4sXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBodG1sU3RyaW5nVG9UZW1wbGF0ZSB9IGZyb20gXCIuL3V0aWxcIjtcblxuLyoqXG4gKiBBIHByZS1wcm9jZXNzZWQge0BsaW5rIENvbXBpbGVkVGVtcGxhdGV9IHJlc3VsdCBjb250YWluaW5nIHRoZSBidWxrIG9mIHRoZVxuICogZGF0YSBuZWNlc3NhcnkgdG8gY3JlYXRlIGEgdGVtcGxhdGUgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJlcGFyZWRUZW1wbGF0ZSB7XG4gIGZyYWdtZW50OiBEb2N1bWVudEZyYWdtZW50O1xuICBwbGFuc0J5Tm90YXRpb246IE1hcDxzdHJpbmcsIFNldDxBbnlSZW5kZXJQbGFuPj47XG4gIG5vdGF0aW9uQWNjZXNzb3JzOiBNYXA8c3RyaW5nLCBOb3RhdGlvbkFjY2Vzc29yPjtcbiAgc3VidGVtcGxhdGVzOiBTZXQ8VGVtcGxhdGU+O1xufVxuXG5jb25zdCByZXF1aXJlUGFyZW50Tm9kZSA9IChub2RlOiBOb2RlKTogTm9kZSA9PiB7XG4gIGlmICghbm9kZS5wYXJlbnROb2RlKSB7XG4gICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuVEVNUExBVEVfUEFSRU5UX1JFUVVJUkVEKTtcbiAgfVxuXG4gIHJldHVybiBub2RlLnBhcmVudE5vZGU7XG59O1xuXG5jb25zdCBjcmVhdGVDb21tZW50QmVmb3JlID0gKG5vZGU6IE5vZGUsIHRleHQgPSBcIlwiKTogQ29tbWVudCA9PiB7XG4gIGNvbnN0IHBhcmVudCA9IHJlcXVpcmVQYXJlbnROb2RlKG5vZGUpO1xuICBjb25zdCBjb21tZW50ID0gZG9jdW1lbnQuY3JlYXRlQ29tbWVudCh0ZXh0KTtcbiAgcGFyZW50Lmluc2VydEJlZm9yZShjb21tZW50LCBub2RlKTtcbiAgcmV0dXJuIGNvbW1lbnQ7XG59O1xuXG5jb25zdCBjcmVhdGVDb21tZW50QWZ0ZXIgPSAobm9kZTogTm9kZSwgdGV4dCA9IFwiXCIpOiBDb21tZW50ID0+IHtcbiAgY29uc3QgcGFyZW50ID0gcmVxdWlyZVBhcmVudE5vZGUobm9kZSk7XG4gIGNvbnN0IGNvbW1lbnQgPSBkb2N1bWVudC5jcmVhdGVDb21tZW50KHRleHQpO1xuICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNvbW1lbnQsIG5vZGUubmV4dFNpYmxpbmcpO1xuICByZXR1cm4gY29tbWVudDtcbn07XG5cbi8qKlxuICogR2l2ZW4gYSB7QGxpbmsgQ29tcGlsZWRUZW1wbGF0ZX0gc3RydWN0dXJlLCByZXR1cm4gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlXG4gKiBkYXRhIG5lZWRlZCB0byBjcmVhdGUgbmV3IFRlbXBsYXRlIGluc3RhbmNlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGNvbXBpbGVkVGVtcGxhdGUgPSBnZXRDb21waWxlZFRlbXBsYXRlSlNPTigpO1xuICogY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShjb21waWxlZFRlbXBsYXRlKTtcbiAqIGNvbnN0IHByZXBhcmVkID0gcHJlcGFyZUNvbXBpbGVkVGVtcGxhdGUocGFyc2VkKTtcbiAqXG4gKiAvLyBFbHNld2hlcmUuLi5cbiAqXG4gKiBjb25zdCB0ZW1wbGF0ZSA9IG5ldyBUZW1wbGF0ZShwcmVwYXJlZCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVDb21waWxlZFRlbXBsYXRlKFxuICBjb21waWxlZDogQ29tcGlsZWRUZW1wbGF0ZSxcbiAgcHJvdG90eXBlRnJhZ21lbnQ/OiBEb2N1bWVudEZyYWdtZW50LFxuKTogUHJlcGFyZWRUZW1wbGF0ZSB7XG4gIGNvbnN0IHBsYW5zQnlOb3RhdGlvbjogTWFwPHN0cmluZywgU2V0PEFueVJlbmRlclBsYW4+PiA9IG5ldyBNYXAoKTtcbiAgY29uc3Qgbm90YXRpb25BY2Nlc3NvcnM6IE1hcDxzdHJpbmcsIE5vdGF0aW9uQWNjZXNzb3I+ID0gbmV3IE1hcCgpO1xuICBjb25zdCBzdWJ0ZW1wbGF0ZXM6IFNldDxUZW1wbGF0ZT4gPSBuZXcgU2V0KCk7XG4gIGNvbnN0IG5vZGVSZWZzOiBNYXA8c3RyaW5nLCBIVE1MRWxlbWVudD4gPSBuZXcgTWFwKCk7XG5cbiAgZm9yIChjb25zdCBbbm90YXRpb24sIHBhcnNlZF0gb2YgT2JqZWN0LmVudHJpZXMoY29tcGlsZWQubm90YXRpb25zKSkge1xuICAgIG5vdGF0aW9uQWNjZXNzb3JzLnNldChub3RhdGlvbiwgYnVpbGRWYWx1ZUFjY2Vzc29yKHBhcnNlZCkpO1xuICB9XG5cbiAgY29uc3QgZnJhZ21lbnQgPSBwcm90b3R5cGVGcmFnbWVudCA/PyBodG1sVG9GcmFnbWVudChjb21waWxlZC5odG1sKTtcblxuICBjb25zdCB3YWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKGZyYWdtZW50LCBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCwge1xuICAgIGFjY2VwdE5vZGUobm9kZTogSFRNTEVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBub2RlLmhhc0F0dHJpYnV0ZShSRUZfQVRUUilcbiAgICAgICAgPyBOb2RlRmlsdGVyLkZJTFRFUl9BQ0NFUFRcbiAgICAgICAgOiBOb2RlRmlsdGVyLkZJTFRFUl9TS0lQO1xuICAgIH0sXG4gIH0pO1xuXG4gIGxldCBtYXJrTm9kZTogTm9kZSB8IG51bGwgPSB3YWxrZXIubmV4dE5vZGUoKTtcblxuICB3aGlsZSAobWFya05vZGUpIHtcbiAgICBpZiAoIShtYXJrTm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcmVmID0gbWFya05vZGUuZ2V0QXR0cmlidXRlKFJFRl9BVFRSKTtcblxuICAgIGlmIChyZWYgPT09IG51bGwpIHtcbiAgICAgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4gaW4gcHJhY3RpY2UsIGFzIHRoZSB0cmVlIHdhbGtlciBvbmx5IHN1cmZhY2VzXG4gICAgICAvLyBlbGVtZW50cyB3aXRoIGFuIGV4dGFudCBub2RlIHJlZiBhdHRyaWJ1dGVcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLklOVkFSSUFOVCk7XG4gICAgfVxuXG4gICAgbm9kZVJlZnMuc2V0KHJlZiwgbWFya05vZGUpO1xuICAgIG1hcmtOb2RlLnJlbW92ZUF0dHJpYnV0ZShSRUZfQVRUUik7XG4gICAgbWFya05vZGUgPSB3YWxrZXIubmV4dE5vZGUoKTtcbiAgfVxuXG4gIGNvbnN0IGFzc29jaWF0ZVBsYW4gPSAocGxhbjogQW55UmVuZGVyUGxhbiwgbm90YXRpb246IHN0cmluZykgPT4ge1xuICAgIGxldCBub3RhdGlvblBsYW5zID0gcGxhbnNCeU5vdGF0aW9uLmdldChub3RhdGlvbik7XG4gICAgaWYgKCFub3RhdGlvblBsYW5zKSB7XG4gICAgICBub3RhdGlvblBsYW5zID0gbmV3IFNldCgpO1xuICAgICAgcGxhbnNCeU5vdGF0aW9uLnNldChub3RhdGlvbiwgbm90YXRpb25QbGFucyk7XG4gICAgfVxuICAgIG5vdGF0aW9uUGxhbnMuYWRkKHBsYW4pO1xuICB9O1xuXG4gIGNvbnN0IGdldEJ5Tm9kZVJlZiA9IChub2RlUmVmOiBzdHJpbmcpOiBIVE1MRWxlbWVudCA9PiB7XG4gICAgY29uc3QgY2FjaGVkID0gbm9kZVJlZnMuZ2V0KG5vZGVSZWYpO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5NSVNTSU5HX05PREVfUkVGKTtcbiAgfTtcblxuICBmb3IgKGNvbnN0IHNjaGVtZSBvZiBjb21waWxlZC5zY2hlbWVzKSB7XG4gICAgLy8gSHlkcmF0ZSBMaXN0IHNjaGVtZXMgaW50byBMaXN0IHBsYW5zXG4gICAgaWYgKHNjaGVtZS50eXBlID09PSBcImVhY2hcIikge1xuICAgICAgLy8gVXNlIHRoZSBwcm90b3R5cGUgcm93IHJvb3QgdG8gY3JlYXRlIHRoZSBwbGFuXG4gICAgICBjb25zdCBpdGVtUHJvdG90eXBlID0gZ2V0QnlOb2RlUmVmKHNjaGVtZS5ub2RlUmVmKTtcbiAgICAgIGNvbnN0IGxpc3RQYXJlbnROb2RlID0gcmVxdWlyZVBhcmVudE5vZGUoaXRlbVByb3RvdHlwZSk7XG4gICAgICBjb25zdCByb3dSb290UHJvdG90eXBlID0gaXRlbVByb3RvdHlwZS5jbG9uZU5vZGUoZmFsc2UpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgY29uc3Qgc3RhcnRNYXJrZXIgPSBjcmVhdGVDb21tZW50QmVmb3JlKGl0ZW1Qcm90b3R5cGUpO1xuICAgICAgY29uc3QgZW5kTWFya2VyID0gY3JlYXRlQ29tbWVudEFmdGVyKGl0ZW1Qcm90b3R5cGUpO1xuXG4gICAgICAvLyBSZW1vdmUgdGhlIG9yaWdpbmFsIHJvb3QgcHJvdG90eXBlIHNpbmNlIHdlIHdpbGwgYmUgcmVuZGVyaW5nIG5ldyBpdGVtc1xuICAgICAgaXRlbVByb3RvdHlwZS5yZW1vdmUoKTtcblxuICAgICAgLy8gQ29weSB0aGUgY29udGVudHMgb2YgdGhlIHJvdyBpbnRvIGEgdGVtcGxhdGVcbiAgICAgIGNvbnN0IHRlbXBsYXRlQ29udGVudEZyYWdtZW50ID0gaHRtbFRvRnJhZ21lbnQoc2NoZW1lLmxpc3RDb250ZW50SHRtbCk7XG4gICAgICBjb25zdCByb3dUZW1wbGF0ZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG4gICAgICByb3dUZW1wbGF0ZUVsZW1lbnQuY29udGVudC5hcHBlbmRDaGlsZCh0ZW1wbGF0ZUNvbnRlbnRGcmFnbWVudCk7XG5cbiAgICAgIGNvbnN0IHBsYW46IExpc3RSZW5kZXJQbGFuID0ge1xuICAgICAgICB0eXBlOiBcImVhY2hcIixcbiAgICAgICAgbm90YXRpb246IHNjaGVtZS5ub3RhdGlvbixcbiAgICAgICAga2V5Tm90YXRpb246IHNjaGVtZS5rZXlOb3RhdGlvbixcbiAgICAgICAgbGlzdENvbnRhaW5lcjogbGlzdFBhcmVudE5vZGUsXG4gICAgICAgIHJvd1RlbXBsYXRlRWxlbWVudCxcbiAgICAgICAgcm93Um9vdFByb3RvdHlwZSxcbiAgICAgICAgc3RhcnRNYXJrZXIsXG4gICAgICAgIGVuZE1hcmtlcixcbiAgICAgICAgcm93VGVtcGxhdGVzQnlSb290OiBuZXcgV2Vha01hcCgpLFxuICAgICAgICByb3dSb290c0J5S2V5OiBuZXcgTWFwKCksXG4gICAgICB9O1xuXG4gICAgICBhc3NvY2lhdGVQbGFuKHBsYW4sIHNjaGVtZS5ub3RhdGlvbi5iYXNlKTtcbiAgICB9XG5cbiAgICAvLyBIeWRyYXRlIGNvbmRpdGlvbmFsIHJlbmRlciBzY2hlbWVzIGludG8gcGxhbnNcbiAgICBlbHNlIGlmIChzY2hlbWUudHlwZSA9PT0gXCJjb25kXCIpIHtcbiAgICAgIC8vIEdyYWIgdGhlIGZpcnN0IGJyYW5jaCBhbmQgaW5zZXJ0IHRoZSBzdGFydCBjb21tZW50IGJlZm9yZSBpdFxuICAgICAgY29uc3QgZmlyc3RCcmFuY2ggPSBzY2hlbWUuYnJhbmNoZXNbMF07XG4gICAgICBpZiAoIWZpcnN0QnJhbmNoKSB7XG4gICAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLklOVkFSSUFOVCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpcnN0QnJhbmNoUm9vdCA9IGdldEJ5Tm9kZVJlZihmaXJzdEJyYW5jaC5icmFuY2hSb290UmVmKTtcbiAgICAgIGNvbnN0IHN0YXJ0Q29tbWVudCA9IGNyZWF0ZUNvbW1lbnRCZWZvcmUoZmlyc3RCcmFuY2hSb290KTtcblxuICAgICAgLy8gR3JhYiB0aGUgbGFzdCBicmFuY2ggYW5kIGluc2VydCB0aGUgZW5kIGNvbW1lbnQgYWZ0ZXIgaXRcbiAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N0eWxlL25vTm9uTnVsbEFzc2VydGlvbjogTG9naWNhbGx5IGd1YXJhbnRlZWRcbiAgICAgIGNvbnN0IGxhc3RCcmFuY2ggPSBzY2hlbWUuYnJhbmNoZXNbc2NoZW1lLmJyYW5jaGVzLmxlbmd0aCAtIDFdITtcbiAgICAgIGNvbnN0IGxhc3RCcmFuY2hSb290ID0gZ2V0QnlOb2RlUmVmKGxhc3RCcmFuY2guYnJhbmNoUm9vdFJlZik7XG4gICAgICBjb25zdCBlbmRDb21tZW50ID0gY3JlYXRlQ29tbWVudEFmdGVyKGxhc3RCcmFuY2hSb290KTtcblxuICAgICAgY29uc3QgcGxhbjogQ29uZGl0aW9uYWxSZW5kZXJQbGFuID0ge1xuICAgICAgICB0eXBlOiBcImNvbmRcIixcbiAgICAgICAgc3RhcnQ6IHN0YXJ0Q29tbWVudCxcbiAgICAgICAgZW5kOiBlbmRDb21tZW50LFxuICAgICAgICBicmFuY2hlczogW10sXG4gICAgICB9O1xuXG4gICAgICAvLyBIeWRyYXRlIHRoZSBicmFuY2hlc1xuICAgICAgZm9yIChjb25zdCBicmFuY2ggb2Ygc2NoZW1lLmJyYW5jaGVzKSB7XG4gICAgICAgIC8vIElmIGFuZCBFbHNlLUlmIGhhdmUgbm90YXRpb25zXG4gICAgICAgIGlmIChicmFuY2gudHlwZSA9PT0gRGlyZWN0aXZlLklmIHx8IGJyYW5jaC50eXBlID09PSBEaXJlY3RpdmUuRWxzZUlmKSB7XG4gICAgICAgICAgY29uc3QgYnJhbmNoUm9vdCA9IGdldEJ5Tm9kZVJlZihicmFuY2guYnJhbmNoUm9vdFJlZik7XG4gICAgICAgICAgY29uc3QgYnJhbmNoVGVtcGxhdGUgPSBodG1sU3RyaW5nVG9UZW1wbGF0ZShcbiAgICAgICAgICAgIGJyYW5jaC5icmFuY2hUZW1wbGF0ZUhUTUwsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIEFkZCB0aGUgY2hpbGQgdGVtcGxhdGVcbiAgICAgICAgICBzdWJ0ZW1wbGF0ZXMuYWRkKGJyYW5jaFRlbXBsYXRlKTtcblxuICAgICAgICAgIHBsYW4uYnJhbmNoZXMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBicmFuY2gudHlwZSxcbiAgICAgICAgICAgIG5vdGF0aW9uOiBicmFuY2gubm90YXRpb24sXG4gICAgICAgICAgICBicmFuY2hSb290OiBnZXRCeU5vZGVSZWYoYnJhbmNoLmJyYW5jaFJvb3RSZWYpLFxuICAgICAgICAgICAgYnJhbmNoVGVtcGxhdGU6IGh0bWxTdHJpbmdUb1RlbXBsYXRlKGJyYW5jaC5icmFuY2hUZW1wbGF0ZUhUTUwpLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGFzc29jaWF0ZVBsYW4ocGxhbiwgYnJhbmNoLm5vdGF0aW9uLmJhc2UpO1xuICAgICAgICAgIGJyYW5jaFJvb3QucmVtb3ZlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbHNlIGlzIGJpbmFyeSwgbm8gbm90YXRpb24gYXNzb2NpYXRlZFxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBwbGFuLmJyYW5jaGVzLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogYnJhbmNoLnR5cGUsXG4gICAgICAgICAgICBicmFuY2hSb290OiBnZXRCeU5vZGVSZWYoYnJhbmNoLmJyYW5jaFJvb3RSZWYpLFxuICAgICAgICAgICAgYnJhbmNoVGVtcGxhdGU6IGh0bWxTdHJpbmdUb1RlbXBsYXRlKGJyYW5jaC5icmFuY2hUZW1wbGF0ZUhUTUwpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3dhcC9UYWcgYXJlIHRoZSBzYW1lIHNpZ25hdHVyZVxuICAgIGVsc2UgaWYgKHNjaGVtZS50eXBlID09PSBcInN3YXBcIiB8fCBzY2hlbWUudHlwZSA9PT0gXCJ0YWdcIikge1xuICAgICAgY29uc3QgcGxhbjogQ29udGVudFN3YXBQbGFuIHwgVGFnQ2hhbmdlUGxhbiA9IHtcbiAgICAgICAgdHlwZTogc2NoZW1lLnR5cGUsXG4gICAgICAgIG5vdGF0aW9uOiBzY2hlbWUubm90YXRpb24sXG4gICAgICAgIG5vZGU6IGdldEJ5Tm9kZVJlZihzY2hlbWUubm9kZVJlZiksXG4gICAgICB9O1xuXG4gICAgICBhc3NvY2lhdGVQbGFuKHBsYW4sIHNjaGVtZS5ub3RhdGlvbi5iYXNlKTtcbiAgICB9XG5cbiAgICAvLyBIeWRyYXRlIEF0dHJpYnV0ZSB1cGRhdGUgcGxhbnNcbiAgICBlbHNlIGlmIChzY2hlbWUudHlwZSA9PT0gXCJhdHRyXCIpIHtcbiAgICAgIGNvbnN0IHBsYW46IEF0dHJpYnV0ZVVwZGF0ZVBsYW4gPSB7XG4gICAgICAgIHR5cGU6IFwiYXR0clwiLFxuICAgICAgICBhdHRyaWJ1dGU6IHNjaGVtZS5hdHRyaWJ1dGUsXG4gICAgICAgIG5vdGF0aW9uOiBzY2hlbWUubm90YXRpb24sXG4gICAgICAgIG5vZGU6IGdldEJ5Tm9kZVJlZihzY2hlbWUubm9kZVJlZiksXG4gICAgICB9O1xuXG4gICAgICBhc3NvY2lhdGVQbGFuKHBsYW4sIHBsYW4ubm90YXRpb24uYmFzZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwbGFuc0J5Tm90YXRpb24sXG4gICAgbm90YXRpb25BY2Nlc3NvcnMsXG4gICAgZnJhZ21lbnQsXG4gICAgc3VidGVtcGxhdGVzLFxuICB9O1xufVxuIiwKICAgICIvKlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cbmltcG9ydCB7IGZyYWdtZW50Q2FjaGUsIGh0bWxUb0ZyYWdtZW50IH0gZnJvbSBcIi4uL3V0aWwvZnJhZ21lbnRzXCI7XG5pbXBvcnQge1xuICB0eXBlIENvbXBpbGVkVGVtcGxhdGUsXG4gIGNvbXBpbGVkVGVtcGxhdGVDYWNoZSxcbiAgY29tcGlsZVRlbXBsYXRlLFxufSBmcm9tIFwiLi9jb21waWxlXCI7XG5pbXBvcnQgeyBjcmVhdGVKb2JzRnJvbVBsYW5zLCBleGVjdXRlUmVuZGVySm9icyB9IGZyb20gXCIuL2pvYnNcIjtcbmltcG9ydCB7IHByZXBhcmVDb21waWxlZFRlbXBsYXRlIH0gZnJvbSBcIi4vcHJlcGFyZVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBOb3RhdGlvbkFjY2Vzc29yLFxuICBwYXJzZWROb3RhdGlvbkNhY2hlLFxuICB2YWx1ZUFjY2Vzc29yQ2FjaGUsXG59IGZyb20gXCIuL3N5bnRheFwiO1xuaW1wb3J0IHR5cGUgeyBBbnlSZW5kZXJQbGFuIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUgVGVtcGxhdGVSb290ID0gSFRNTEVsZW1lbnQgfCBTaGFkb3dSb290O1xuZXhwb3J0IHR5cGUgVGVtcGxhdGVDb250ZXh0ID0ge1xuICBhdHRyPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD47XG4gIHN0YXRlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgaXRlbT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBpbmRleD86IG51bWJlcjtcbn07XG5cbi8qKlxuICogQSByZW5kZXJhYmxlIHRlbXBsYXRlIGZyb20gYW4gSFRNTFRlbXBsYXRlRWxlbWVudFxuICpcbiAqIExldmVyYWdlcyBhIHNpbXBsZSBzeW50YXggdG8gcHJvdmlkZSBhY2Nlc3NvcnMgdG8gdGVtcGxhdGUgZGF0YSBmcm9tIG9uZSBvZlxuICogZm91ciBjYXRlZ29yaWVzLCBiYXNlZCBvbiB1c2UgY2FzZTpcbiAqXG4gKiBgYGBcbiAqIGBAYCAtPiBUaGUgYGF0dHJgIG5hbWVzcGFjZSAodGhlIGhvc3QgZWxlbWVudCdzIGF0dHJpYnV0ZXMpXG4gKiBgJGAgLT4gVGhlIGBzdGF0ZWAgbmFtZXNwYWNlICh0aGUgaG9zdCBlbGVtZW50J3MgcmVhY3RpdmUgc3RhdGUpXG4gKiBgKmAgLT4gVGhlIGBkYXRhYCBuYW1lc3BhY2UgKHRoZSBob3N0IGVsZW1lbnQncyBjb21wdXRlZCBkYXRhKVxuICogYCNgIC0+IFRoZSBgaXRlbWAgbmFtZXNwYWNlIChsaXN0IGl0ZW0gYWNjZXNzIHdpdGggOjplYWNoKVxuICogYGBgXG4gKlxuICogQmluZCBhdHRyaWJ1dGVzIHRvIGEgdmFsdWUgdXNpbmcgdGhlIGA6YXR0cmlidXRlYCBzeW50YXg6XG4gKlxuICogYGBgaHRtbFxuICogPGRpdiA6aWQ9XCIkaWRcIiA6Y2xhc3M9XCJAY2xhc3NuYW1lXCI+PC9kaXY+XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFRlbXBsYXRlIHtcbiAgLyoqXG4gICAqIFByb3BlcnRpZXMgcmVsYXRlZCB0byB0aGUgZ2xvYmFsIFRlbXBsYXRlIGJ1aWxkIGNhY2hlLlxuICAgKlxuICAgKiBUaGlzIGlzIG5vdCBzb21ldGhpbmcgdHlwaWNhbGx5IG5lZWRlZCBmb3IgZ2VuZXJhbCBhcHAgZGV2ZWxvcG1lbnQsIGJ1dFxuICAgKiBhbGxvd3MgZm9yIGFkdmFuY2VkIGNvbmZpZ3VyYXRpb24gdG8gdHVuZSB0aGUgY2FjaGluZyBzeXN0ZW0gaWYgbmVlZCBiZS5cbiAgICpcbiAgICogQ2FjaGUgc2l6ZXMgZGVmYXVsdCB0byA1MDAgSFRNTCBUZW1wbGF0ZSBGcmFnbWVudHMgYW5kIGNvbXBpbGVkIFBhbGV0dGVcbiAgICogdGVtcGxhdGVzIChpbmNsdWRlcyBuZXN0ZWQgdGVtcGxhdGVzIGxpa2UgbGlzdHMpIHRvIGNvdmVyIG1vc3QgYXBwbGljYXRpb25cbiAgICogbmVlZHMgd2l0aG91dCB1c2luZyBtdWNoIG1lbW9yeS5cbiAgICovXG4gIHN0YXRpYyBjYWNoZSA9IHtcbiAgICAvKipcbiAgICAgKiBXaXBlIGFsbCBjYWNoZWQgdGVtcGxhdGVzIGFuZCBIVE1MIGZyYWdtZW50c1xuICAgICAqL1xuICAgIGNsZWFyOiAoKTogdm9pZCA9PiB7XG4gICAgICBmcmFnbWVudENhY2hlLmNsZWFyKCk7XG4gICAgICBjb21waWxlZFRlbXBsYXRlQ2FjaGUuY2xlYXIoKTtcbiAgICAgIHZhbHVlQWNjZXNzb3JDYWNoZS5jbGVhcigpO1xuICAgICAgcGFyc2VkTm90YXRpb25DYWNoZS5jbGVhcigpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiB0aGUgZGVmYXVsdCBjYWNoZSBjYXBhY2l0eSBvZiA1MDAgaXRlbXMgcGVyIGNhY2hlXG4gICAgICpcbiAgICAgKiBHZW5lcmFsIGNhY2hpbmcgZ3VpZGFuY2U6XG4gICAgICogLSA5NSUgb2YgdGhlIHRpbWUsIDUwMCB3b3JrcyBmaW5lXG4gICAgICogLSBGb3IgdmVyeSBsYXJnZSBhcHBsaWNhdGlvbnMsIHVwIHRvIDEwMDAgaXMgcmVhc29uYWJsZVxuICAgICAqIC0gRm9yIHNtYWxsZXIgYXBwcywgZHJvcHBpbmcgZG93biB0byAxMDAgLSAyNTAgbWF5IHNhdmUgbWVtb3J5XG4gICAgICpcbiAgICAgKiBVbHRpbWF0ZWx5IHRoZSBpbXBhY3Qgd2lsbCBiZSBtaW5pbWFsIHVubGVzcyB5b3VyIGFwcCBoYXMgdmVyeSBzcGVjaWZpY1xuICAgICAqIHJlbmRlcmluZyBuZWVkcy5cbiAgICAgKi9cbiAgICBzZXRDYXBhY2l0eTogKG1heFNpemU6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgICAgZnJhZ21lbnRDYWNoZS5zZXRDYXBhY2l0eShtYXhTaXplKTtcbiAgICAgIGNvbXBpbGVkVGVtcGxhdGVDYWNoZS5zZXRDYXBhY2l0eShtYXhTaXplKTtcbiAgICAgIHZhbHVlQWNjZXNzb3JDYWNoZS5zZXRDYXBhY2l0eShtYXhTaXplKTtcbiAgICAgIHBhcnNlZE5vdGF0aW9uQ2FjaGUuc2V0Q2FwYWNpdHkobWF4U2l6ZSk7XG4gICAgfSxcbiAgfTtcblxuICBwcml2YXRlIF9jb21waWxlZDogQ29tcGlsZWRUZW1wbGF0ZTtcblxuICAvKipcbiAgICogVGhlIG9yaWdpbmFsIHtAbGluayBIVE1MVGVtcGxhdGVFbGVtZW50fSB1c2VkIHRvIGNyZWF0ZSB0aGlzIFRlbXBsYXRlLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBNYWtlIHN1cmUgdG8gbmV2ZXIgb3BlcmF0ZSBkaXJlY3RseSBvbiB0aGlzIGVsZW1lbnQuIEFsd2F5cyBjbG9uZS5cbiAgICovXG4gIHByaXZhdGUgX3RlbXBsYXRlRWxlbWVudD86IEhUTUxUZW1wbGF0ZUVsZW1lbnQ7XG5cbiAgLyoqIFRoZSBjdXJyZW50IGtub3duIHJvb3QgZWxlbWVudCB0aGF0IHRoaXMgVGVtcGxhdGUgaXMgcmVuZGVyZWQgaW50byAqL1xuICBwcml2YXRlIF9tb3VudGVkUm9vdD86IFRlbXBsYXRlUm9vdDtcblxuICAvKiogVGhlIG1vc3QgcmVjZW50IHNldCB2YWx1ZSBmb3IgZWFjaCBub3RhdGlvbiB0aGF0IGhhcyByZW5kZXJlZCAqL1xuICBwcml2YXRlIF9sYXRlc3RSZW5kZXJlZFZhbHVlczogTWFwPHN0cmluZywgdW5rbm93bj4gPSBuZXcgTWFwKCk7XG5cbiAgLyoqIFRoZSBhY3RpdmUgSFRNTEVsZW1lbnQgd2hpY2ggdGhlIHRlbXBsYXRlIGlzIHVwZGF0aW5nIG9uIHJlbmRlcnMgKi9cbiAgcHJpdmF0ZSBfZnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQ7XG5cbiAgLyoqIFZhbHVlIE5vdGF0aW9ucyAtPiBTZXQ8UmVuZGVyIFBsYW5zPiAqL1xuICBwcml2YXRlIF9wbGFuc0J5Tm90YXRpb246IE1hcDxzdHJpbmcsIFNldDxBbnlSZW5kZXJQbGFuPj4gPSBuZXcgTWFwKCk7XG5cbiAgLyoqIFZhbHVlIE5vdGF0aW9ucyAtPiBBY2Nlc3NvciBmdW5jdGlvbnMgKi9cbiAgcHJpdmF0ZSBfbm90YXRpb25BY2Nlc3NvcnM6IE1hcDxzdHJpbmcsIE5vdGF0aW9uQWNjZXNzb3I+ID0gbmV3IE1hcCgpO1xuXG4gIHByaXZhdGUgX3N1YnRlbXBsYXRlczogU2V0PFRlbXBsYXRlPiA9IG5ldyBTZXQoKTtcblxuICBjb25zdHJ1Y3Rvcih0ZW1wbGF0ZTogSFRNTFRlbXBsYXRlRWxlbWVudCkge1xuICAgIHRoaXMuX3RlbXBsYXRlRWxlbWVudCA9IHRlbXBsYXRlO1xuICAgIHRoaXMuX2NvbXBpbGVkID0gY29tcGlsZVRlbXBsYXRlKHRlbXBsYXRlKTtcblxuICAgIC8vIFByZXBhcmUgYSBmcmFnbWVudCBmcm9tIHRoZSBjb21waWxlZCBIVE1MIChjYWNoZWQpXG4gICAgY29uc3QgZnJhZ21lbnQgPSBodG1sVG9GcmFnbWVudCh0aGlzLl9jb21waWxlZC5odG1sKTtcbiAgICBjb25zdCBoeWRyYXRlZCA9IHByZXBhcmVDb21waWxlZFRlbXBsYXRlKHRoaXMuX2NvbXBpbGVkLCBmcmFnbWVudCk7XG5cbiAgICB0aGlzLl9wbGFuc0J5Tm90YXRpb24gPSBoeWRyYXRlZC5wbGFuc0J5Tm90YXRpb247XG4gICAgdGhpcy5fbm90YXRpb25BY2Nlc3NvcnMgPSBoeWRyYXRlZC5ub3RhdGlvbkFjY2Vzc29ycztcbiAgICB0aGlzLl9mcmFnbWVudCA9IGh5ZHJhdGVkLmZyYWdtZW50O1xuICAgIHRoaXMuX3N1YnRlbXBsYXRlcyA9IGh5ZHJhdGVkLnN1YnRlbXBsYXRlcztcblxuICAgIGNvbnN0IGFsbFJlbGV2YW50QWNjZXNzb3JzID0gbmV3IE1hcDxzdHJpbmcsIE5vdGF0aW9uQWNjZXNzb3I+KFxuICAgICAgdGhpcy5fbm90YXRpb25BY2Nlc3NvcnMsXG4gICAgKTtcblxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5fc3VidGVtcGxhdGVzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgY2hpbGQubm90YXRpb25NYXApIHtcbiAgICAgICAgYWxsUmVsZXZhbnRBY2Nlc3NvcnMuc2V0KGtleSwgdmFsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9ub3RhdGlvbkFjY2Vzc29ycyA9IGFsbFJlbGV2YW50QWNjZXNzb3JzO1xuICB9XG5cbiAgZ2V0IGNvbXBpbGVkKCk6IENvbXBpbGVkVGVtcGxhdGUge1xuICAgIHJldHVybiB0aGlzLl9jb21waWxlZDtcbiAgfVxuXG4gIGdldCBub3RhdGlvbk1hcCgpOiBNYXA8c3RyaW5nLCBOb3RhdGlvbkFjY2Vzc29yPiB7XG4gICAgcmV0dXJuIHRoaXMuX25vdGF0aW9uQWNjZXNzb3JzO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGZ1bGwgY29weSBvZiB0aGlzIHRlbXBsYXRlIGZvciB1c2UgaW4gcmVuZGVyaW5nIHRvIGFub3RoZXIgcm9vdFxuICAgKi9cbiAgY2xvbmUgPSAoKTogVGVtcGxhdGUgPT4ge1xuICAgIHJldHVybiBuZXcgVGVtcGxhdGUodGhpcy5lbGVtZW50KCkpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBBbiB7QGxpbmsgSFRNTFRlbXBsYXRlRWxlbWVudH0gcmVwcmVzZW50aW5nIHRoaXMgdGVtcGxhdGVcbiAgICovXG4gIGVsZW1lbnQgPSAoKTogSFRNTFRlbXBsYXRlRWxlbWVudCA9PiB7XG4gICAgaWYgKHRoaXMuX3RlbXBsYXRlRWxlbWVudCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RlbXBsYXRlRWxlbWVudDtcbiAgICB9XG5cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSB0aGlzLl9jb21waWxlZC5odG1sO1xuICAgIHJldHVybiB0ZW1wbGF0ZTtcbiAgfTtcblxuICBwcml2YXRlIF9jb2xsZWN0VXBkYXRlZFZhbHVlcyA9IChcbiAgICBjb250ZXh0OiBUZW1wbGF0ZUNvbnRleHQsXG4gICk6IFtoYXNDaGFuZ2VzOiBib29sZWFuLCB2YWx1ZXM6IE1hcDxzdHJpbmcsIHVua25vd24+XSA9PiB7XG4gICAgY29uc3QgdXBkYXRlZFZhbHVlcyA9IG5ldyBNYXA8c3RyaW5nLCB1bmtub3duPigpO1xuICAgIGxldCBoYXNDaGFuZ2VzID0gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IFtyYXdOb3RhdGlvbiwgYWNjZXNzb3JdIG9mIHRoaXMuX25vdGF0aW9uQWNjZXNzb3JzKSB7XG4gICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gdGhpcy5fbGF0ZXN0UmVuZGVyZWRWYWx1ZXMuZ2V0KHJhd05vdGF0aW9uKTtcbiAgICAgIGNvbnN0IG5ld1ZhbHVlID0gYWNjZXNzb3IoY29udGV4dCk7XG4gICAgICB1cGRhdGVkVmFsdWVzLnNldChyYXdOb3RhdGlvbiwgbmV3VmFsdWUpO1xuXG4gICAgICBpZiAocHJldmlvdXNWYWx1ZSAhPT0gbmV3VmFsdWUgJiYgIU9iamVjdC5pcyhwcmV2aW91c1ZhbHVlLCBuZXdWYWx1ZSkpIHtcbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFtoYXNDaGFuZ2VzLCB1cGRhdGVkVmFsdWVzXTtcbiAgfTtcblxuICBwcml2YXRlIF91cGRhdGUobmV3VmFsdWVzOiBNYXA8c3RyaW5nLCB1bmtub3duPikge1xuICAgIC8vIENvbGxlY3QgYWZmZWN0ZWQgcGxhbnNcbiAgICBjb25zdCBhbGxBZmZlY3RlZFBsYW5zOiBTZXQ8QW55UmVuZGVyUGxhbj4gPSBuZXcgU2V0KCk7XG5cbiAgICBmb3IgKGNvbnN0IFtub3RhdGlvbl0gb2YgbmV3VmFsdWVzKSB7XG4gICAgICBjb25zdCBhZmZlY3RlZFBsYW5zID0gdGhpcy5fcGxhbnNCeU5vdGF0aW9uLmdldChub3RhdGlvbik7XG5cbiAgICAgIGlmICghYWZmZWN0ZWRQbGFucykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBwbGFuIG9mIGFmZmVjdGVkUGxhbnMpIHtcbiAgICAgICAgYWxsQWZmZWN0ZWRQbGFucy5hZGQocGxhbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgam9icyA9IGNyZWF0ZUpvYnNGcm9tUGxhbnMoYWxsQWZmZWN0ZWRQbGFucywgbmV3VmFsdWVzKTtcbiAgICBleGVjdXRlUmVuZGVySm9icyhqb2JzKTtcbiAgfVxuXG4gIHJlbmRlcldpdGhWYWx1ZXMgPSAoXG4gICAgcm9vdDogVGVtcGxhdGVSb290LFxuICAgIHZhbHVlczogTWFwPHN0cmluZywgdW5rbm93bj4sXG4gICk6IHZvaWQgPT4ge1xuICAgIGlmIChyb290ICE9PSB0aGlzLl9tb3VudGVkUm9vdCkge1xuICAgICAgdGhpcy5fbW91bnRlZFJvb3QgPSByb290O1xuICAgICAgd2hpbGUgKHJvb3QuZmlyc3RDaGlsZCkge1xuICAgICAgICByb290LnJlbW92ZUNoaWxkKHJvb3QuZmlyc3RDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIHJvb3QuYXBwZW5kKHRoaXMuX2ZyYWdtZW50KTtcbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGUodmFsdWVzKTtcbiAgfTtcblxuICAvKipcbiAgICogUmVuZGVyIHRoaXMgdGVtcGxhdGUgaW50byBhIHRhcmdldCBob3N0IGVsZW1lbnQuXG4gICAqL1xuICByZW5kZXIgPSAocm9vdDogVGVtcGxhdGVSb290LCBjb250ZXh0OiBUZW1wbGF0ZUNvbnRleHQpOiB2b2lkID0+IHtcbiAgICBjb25zdCBbaGFzQ2hhbmdlcywgcmVzb2x2ZWRWYWx1ZXNdID0gdGhpcy5fY29sbGVjdFVwZGF0ZWRWYWx1ZXMoY29udGV4dCk7XG5cbiAgICAvLyBJZiBubyB2YWx1ZXMgaGF2ZSBjaGFuZ2VkLCBleGl0IGVhcmx5XG4gICAgaWYgKHJvb3QgPT09IHRoaXMuX21vdW50ZWRSb290ICYmICFoYXNDaGFuZ2VzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5yZW5kZXJXaXRoVmFsdWVzKHJvb3QsIHJlc29sdmVkVmFsdWVzKTtcbiAgICB0aGlzLl9sYXRlc3RSZW5kZXJlZFZhbHVlcyA9IHJlc29sdmVkVmFsdWVzO1xuICB9O1xufVxuIiwKICAgICIvKlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cbmltcG9ydCB7IGVsZW1lbnRNYXRjaGVzIH0gZnJvbSBcIiN1dGlsXCI7XG5pbXBvcnQgdHlwZSB7IENvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudFwiO1xuXG5leHBvcnQgdHlwZSBFdmVudE5hbWUgPSBrZXlvZiBHbG9iYWxFdmVudEhhbmRsZXJzRXZlbnRNYXA7XG5leHBvcnQgdHlwZSBFdmVudEhhbmRsZXI8SyBleHRlbmRzIEV2ZW50TmFtZSA9IEV2ZW50TmFtZT4gPSAoXG4gIGV2ZW50OiBHbG9iYWxFdmVudEhhbmRsZXJzRXZlbnRNYXBbS10sXG4pID0+IHZvaWQ7XG5cbnR5cGUgRXZlbnRIYW5kbGVyTWFwID0gTWFwPHN0cmluZywgRXZlbnRIYW5kbGVyPjtcblxuLyoqXG4gKiBNYW5hZ2VkIGV2ZW50IGRlbGVnYXRpb24gdG8gY29hbGVzY2UgZXZlbnQgbGlzdGVuZXJzIGZvciBhbiBlbnRpcmUgdHJlZSBpbnRvXG4gKiBzaW5nbGUgcm9vdC1sZXZlbCBsaXN0ZW5lcnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIExpc3RlbiBmb3IgZXZlbnRzIGZyb20gYW55IGNoaWxkIGVsZW1lbnQgb2YgdGhlIGRlbGVnYXRlZCByb290XG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZGVsZWdhdG9yID0gbmV3IEV2ZW50RGVsZWdhdG9yKCRyb290KTtcbiAqIGRlbGVnYXRvci5hZGREZWxlZ2F0ZWRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUNsaWNrKTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBMaXN0ZW4gZm9yIGV2ZW50cyBmcm9tIGNoaWxkIGVsZW1lbnRzIG1hdGNoaW5nIGAuYWN0aW9uYFxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGRlbGVnYXRvciA9IG5ldyBFdmVudERlbGVnYXRvcigkcm9vdCk7XG4gKiBkZWxlZ2F0b3IuYWRkRGVsZWdhdGVkTGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVDbGljaywgXCIuYWN0aW9uXCIpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBFdmVudERlbGVnYXRvciB7XG4gIHN0YXRpYyBuZXh0TGlzdGVuZXJJZCA9IDA7XG5cbiAgc3RhdGljIHByb2Nlc3NUYXJnZXREZXNjcmlwdG9yKFxuICAgIHRhcmdldERlc2NyaXB0b3I6IHN0cmluZyB8IHR5cGVvZiBDb21wb25lbnQ8YW55PiB8IEhUTUxFbGVtZW50LFxuICApOiBzdHJpbmcge1xuICAgIC8vIENyZWF0ZSBhIHF1ZXJ5IGZpbHRlciBmcm9tIHRoZSB0YXJnZXQgZGVzY3JpcHRvclxuICAgIGlmICh0YXJnZXREZXNjcmlwdG9yIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgIC8vIElmIHRoZSBlbGVtZW50IGhhcyBhbiBJRCwgdXNlIHRoYXRcbiAgICAgIGlmICh0YXJnZXREZXNjcmlwdG9yLmlkLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gYCMke3RhcmdldERlc2NyaXB0b3IuaWR9YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGdlbmVyYXRlZElkID0gYGxpc3Rlbi0ke0V2ZW50RGVsZWdhdG9yLm5leHRMaXN0ZW5lcklkKyt9YDtcbiAgICAgICAgdGFyZ2V0RGVzY3JpcHRvci5zZXRBdHRyaWJ1dGUoXCJkYXRhLWxpc3RlbmVyLWlkXCIsIGdlbmVyYXRlZElkKTtcbiAgICAgICAgcmV0dXJuIGBbZGF0YS1saXN0ZW5lci1pZD1cIiR7Z2VuZXJhdGVkSWR9XCJdYDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0YXJnZXREZXNjcmlwdG9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICAgIGlmICh0YXJnZXREZXNjcmlwdG9yLnRhZ05hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFtDb21wb25lbnRdIEF1dG9tYXRpYyBsaXN0ZW5lciBzZXR1cCBmYWlsdXJlOiBDb21wb25lbnQgJHt0YXJnZXREZXNjcmlwdG9yLm5hbWV9IGhhcyBubyBkZWZpbmVkIHRhZ25hbWVgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIHRhcmdldCBkZXNjcmlwdG9yIGlzIGEgQ29tcG9uZW50IGNsYXNzLCBwdWxsIHRoZSB0YWduYW1lXG4gICAgICByZXR1cm4gdGFyZ2V0RGVzY3JpcHRvci50YWdOYW1lO1xuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXREZXNjcmlwdG9yO1xuICB9XG5cbiAgcHJpdmF0ZSBfcm9vdDogSFRNTEVsZW1lbnQgfCBTaGFkb3dSb290IHwgRG9jdW1lbnQ7XG4gIHByaXZhdGUgX3Jvb3RMaXN0ZW5lcnM6IEV2ZW50SGFuZGxlck1hcCA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBfZXZlbnRzOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBTZXQ8RXZlbnRIYW5kbGVyPj4+ID0gbmV3IE1hcCgpO1xuXG4gIGNvbnN0cnVjdG9yKHJvb3Q6IEhUTUxFbGVtZW50IHwgU2hhZG93Um9vdCB8IERvY3VtZW50ID0gZG9jdW1lbnQpIHtcbiAgICB0aGlzLl9yb290ID0gcm9vdDtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZXJzRm9yRXZlbnQoZXZlbnQ6IHN0cmluZyk6IE1hcDxzdHJpbmcsIFNldDxFdmVudEhhbmRsZXI+PiB7XG4gICAgbGV0IGhhbmRsZXJNYXAgPSB0aGlzLl9ldmVudHMuZ2V0KGV2ZW50KTtcblxuICAgIGlmIChoYW5kbGVyTWFwID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhbmRsZXJNYXAgPSBuZXcgTWFwKCk7XG4gICAgICB0aGlzLl9ldmVudHMuc2V0KGV2ZW50LCBoYW5kbGVyTWFwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaGFuZGxlck1hcDtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZXJzRm9yRXZlbnRBbmRRdWVyeTxFIGV4dGVuZHMgRXZlbnROYW1lPihcbiAgICBldmVudDogRSxcbiAgICBxdWVyeTogc3RyaW5nLFxuICApOiBTZXQ8RXZlbnRIYW5kbGVyPEU+PiB7XG4gICAgY29uc3QgaGFuZGxlck1hcCA9IHRoaXMuX2hhbmRsZXJzRm9yRXZlbnQoZXZlbnQpO1xuICAgIGxldCBoYW5kbGVyU2V0ID0gaGFuZGxlck1hcC5nZXQocXVlcnkpO1xuXG4gICAgaWYgKGhhbmRsZXJTZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFuZGxlclNldCA9IG5ldyBTZXQoKTtcbiAgICAgIGhhbmRsZXJNYXAuc2V0KHF1ZXJ5LCBoYW5kbGVyU2V0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gaGFuZGxlclNldDtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZVJvb3RMaXN0ZW5lcihldmVudE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9yb290TGlzdGVuZXJzLmhhcyhldmVudE5hbWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbGlzdGVuZXIgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBoYW5kbGVyc0ZvckV2ZW50ID0gdGhpcy5faGFuZGxlcnNGb3JFdmVudChldmVudE5hbWUpO1xuICAgICAgY29uc3QgeyB0YXJnZXQgfSA9IGV2ZW50O1xuXG4gICAgICBpZiAodGFyZ2V0ID09PSBudWxsIHx8ICEodGFyZ2V0IGluc3RhbmNlb2YgTm9kZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgbm9kZTogTm9kZSB8IG51bGwgPSB0YXJnZXQ7XG5cbiAgICAgIGxldCBzdG9wSW1tZWRpYXRlQ2FsbGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBvcmlnaW5hbEZuID0gZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uO1xuICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uID0gKCkgPT4ge1xuICAgICAgICBvcmlnaW5hbEZuLmNhbGwoZXZlbnQpO1xuICAgICAgICBzdG9wSW1tZWRpYXRlQ2FsbGVkID0gdHJ1ZTtcbiAgICAgIH07XG5cbiAgICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgIGlmIChub2RlID09PSB0aGlzLl9yb290KSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTa2lwIGludmFsaWQgZWxlbWVudHNcbiAgICAgICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpKSB7XG4gICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEludm9rZSBoYW5kbGVyc1xuICAgICAgICBmb3IgKGNvbnN0IFtxdWVyeSwgaGFuZGxlcnNdIG9mIGhhbmRsZXJzRm9yRXZlbnQpIHtcbiAgICAgICAgICBpZiAocXVlcnkgPT09IFwiKlwiIHx8IGVsZW1lbnRNYXRjaGVzKG5vZGUsIHF1ZXJ5KSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgIGhhbmRsZXIuY2FsbChub2RlLCBldmVudCk7XG5cbiAgICAgICAgICAgICAgLy8gUmVzcGVjdCAuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkgYW5kIC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICAgIGlmIChzdG9wSW1tZWRpYXRlQ2FsbGVkIHx8IGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXNwZWN0IC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICBpZiAoZXZlbnQuY2FuY2VsQnViYmxlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcblxuICAgICAgICBpZiAobm9kZSA9PT0gdGhpcy5fcm9vdCB8fCBub2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuX3Jvb3RMaXN0ZW5lcnMuc2V0KGV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICAgIHRoaXMuX3Jvb3QuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIGFkZExpc3RlbmVyPEUgZXh0ZW5kcyBFdmVudE5hbWU+KFxuICAgIGV2ZW50TmFtZTogRSxcbiAgICBoYW5kbGVyOiBFdmVudEhhbmRsZXI8RT4sXG4gICAgcXVlcnlGaWx0ZXI6IHN0cmluZyA9IFwiKlwiLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLl9oYW5kbGVyc0ZvckV2ZW50QW5kUXVlcnkoZXZlbnROYW1lLCBxdWVyeUZpbHRlcikuYWRkKGhhbmRsZXIpO1xuICAgIHRoaXMuX2NyZWF0ZVJvb3RMaXN0ZW5lcihldmVudE5hbWUpO1xuICB9XG5cbiAgcmVtb3ZlTGlzdGVuZXIoXG4gICAgZXZlbnROYW1lOiBFdmVudE5hbWUsXG4gICAgaGFuZGxlcjogRXZlbnRIYW5kbGVyLFxuICAgIHF1ZXJ5RmlsdGVyOiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGhhbmRsZXJTZXQgPSB0aGlzLl9oYW5kbGVyc0ZvckV2ZW50QW5kUXVlcnkoZXZlbnROYW1lLCBxdWVyeUZpbHRlcik7XG4gICAgaGFuZGxlclNldC5kZWxldGUoaGFuZGxlcik7XG5cbiAgICAvLyBJZiB0aGF0IHdhcyB0aGUgbGFzdCBoYW5kbGVyIGZvciB0aGF0IGV2ZW50L3F1ZXJ5IGNvbWJvLCBkZWxldGUgdGhlIHNldFxuICAgIGlmIChoYW5kbGVyU2V0LnNpemUgPT09IDApIHtcbiAgICAgIGNvbnN0IGV2ZW50SGFuZGxlclNldHMgPSB0aGlzLl9oYW5kbGVyc0ZvckV2ZW50KGV2ZW50TmFtZSk7XG4gICAgICBldmVudEhhbmRsZXJTZXRzLmRlbGV0ZShxdWVyeUZpbHRlcik7XG4gICAgfVxuICB9XG5cbiAgY2xlYW51cCA9ICgpOiB2b2lkID0+IHtcbiAgICBmb3IgKGNvbnN0IFtldmVudCwgaGFuZGxlcl0gb2YgdGhpcy5fcm9vdExpc3RlbmVycykge1xuICAgICAgdGhpcy5fcm9vdC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyKTtcbiAgICB9XG5cbiAgICB0aGlzLl9yb290TGlzdGVuZXJzLmNsZWFyKCk7XG4gIH07XG59XG4iLAogICAgIi8qXG4gKiBDb3B5cmlnaHQgwqkgUnVzdGljIEFyY2FkZSwgTExDIDIwMjZcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5pbXBvcnQgeyBFcnJvckNvZGUsIFBhbGV0dGVFcnJvciB9IGZyb20gXCIjZXJyb3JcIjtcbmltcG9ydCB7IGNzcyB9IGZyb20gXCIjaGVscGVyXCI7XG5pbXBvcnQgeyBTdGF0ZSB9IGZyb20gXCIjc3RhdGVcIjtcbmltcG9ydCB7IFRlbXBsYXRlLCB0eXBlIFRlbXBsYXRlQ29udGV4dCB9IGZyb20gXCIjdGVtcGxhdGVcIjtcbmltcG9ydCB7IGNyZWF0ZUF0dHJpYnV0ZU1hcCwgc2VyaWFsaXplQXR0cmlidXRlIH0gZnJvbSBcIiN1dGlsXCI7XG5pbXBvcnQgeyBFdmVudERlbGVnYXRvciwgdHlwZSBFdmVudEhhbmRsZXIsIHR5cGUgRXZlbnROYW1lIH0gZnJvbSBcIi4vZGVsZWdhdG9yXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEF0dHJpYnV0ZU1hcCxcbiAgQ29tcG9uZW50U3R5bGVzLFxuICBDb21wdXRlZFByb3BlcnRpZXMsXG4gIExpdmVBdHRyaWJ1dGVzLFxuICBTdGF0ZUluaXRpYWxpemVyLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG5jb25zdCBNQVhfU0VRVUVOVElBTF9SRU5ERVJTID0gMTAwMDA7XG5jb25zdCBCTEFOS19URU1QTEFURSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcblxuZXhwb3J0IGVudW0gUm9vdE1vZGUge1xuICBDbG9zZWQgPSBcImNsb3NlZFwiLFxuICBPcGVuID0gXCJvcGVuXCIsXG59XG5cbnR5cGUgSW50ZXJuYWxSZW5kZXJTdGF0dXMgPSB7XG4gIGlzRmluYWxpemVkOiBib29sZWFuO1xuICBpbml0aWFsUmVuZGVyQ29tcGxldGU6IGJvb2xlYW47XG4gIHdpbGxSZW5kZXI6IGJvb2xlYW47XG4gIGlzUmVuZGVyaW5nOiBib29sZWFuO1xuICBzZXF1ZW50aWFsUmVuZGVyczogbnVtYmVyO1xuICBwb3N0UmVuZGVyQ2FsbGJhY2tzOiBWb2lkRnVuY3Rpb25bXTtcbiAgbGFzdFJlbmRlcmVkQXR0cmlidXRlTWFwOiBBdHRyaWJ1dGVNYXA7XG4gIHRyYWNrZWRBdHRyaWJ1dGVDaGFuZ2VzOiBBdHRyaWJ1dGVNYXA7XG59O1xuXG4vKipcbiAqIFRoZSAqKkNvbXBvbmVudCoqIGNsYXNzIGV4dGVuZHMgdGhlIGJhc2UgSFRNTEVsZW1lbnQgY2xhc3MgdG8gcHJvdmlkZSBhblxuICogZXJnb25vbWljIHdheSB0byBkZXNpZ24gYW5kIGRldmVsb3AgV2ViIENvbXBvbmVudHMgd2l0aCByZWFjdGl2ZSBzdGF0ZSxcbiAqIG1hbmFnZWQgYXR0cmlidXRlcywgYW5kIGR5bmFtaWMgdGVtcGxhdGluZy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvbXBvbmVudDxcbiAgU3RhdGVTaGFwZSBleHRlbmRzIG9iamVjdCA9IHt9LFxuPiBleHRlbmRzIEhUTUxFbGVtZW50IHtcbiAgLy8g4pWt4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pWuXG4gIC8vIOKUgiAgICAgICBTdGF0aWMgQ29tcG9uZW50IENvbmZpZ3VyYXRpb24gUHJvcGVydGllcyAgICAgICAg4pSCXG4gIC8vIOKVsOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKVr1xuXG4gIC8qKiBUaGUgSFRNTCB0YWcgbmFtZSB0byB1c2UgZm9yIHRoaXMgQ29tcG9uZW50ICovXG4gIHN0YXRpYyB0YWdOYW1lOiBzdHJpbmcgPSBcIlwiO1xuXG4gIC8qKiBBbiBIVE1MIFRlbXBsYXRlIGVsZW1lbnQgZm9yIHRoaXMgZWxlbWVudCB0byB1c2UuICovXG4gIHN0YXRpYyB0ZW1wbGF0ZTogSFRNTFRlbXBsYXRlRWxlbWVudCB8IFRlbXBsYXRlID0gQkxBTktfVEVNUExBVEU7XG5cbiAgLyoqXG4gICAqIFN0eWxlcyBmb3IgdGhpcyBDb21wb25lbnRcbiAgICovXG4gIHN0YXRpYyBzdHlsZXM6IENvbXBvbmVudFN0eWxlcyA9IFtdO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgYXR0cmlidXRlIG5hbWVzIHRvIHRyYWNrIGNoYW5nZXMgZm9yXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIElmIHlvdSB1c2UgdGhlIHtAbGluayBkZWZpbmV9IGZhY3RvcnkgaGVscGVyLCB0aGlzIHZhbHVlIHdpbGwgYmVcbiAgICogYXV0b21hdGljYWxseSBtZXJnZWQgd2l0aCBhIGxpc3Qgb2YgYW55IGRlZmluZWQge0BsaW5rIGxpdmVBdHRyaWJ1dGVzfS5cbiAgICovXG4gIHN0YXRpYyBvYnNlcnZlZEF0dHJpYnV0ZXM6IHN0cmluZ1tdID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSBtb2RlIGZvciB0aGlzIENvbXBvbmVudCdzIFNoYWRvd1Jvb3QuIE11c3QgYmUgYSB7QGxpbmsgUm9vdE1vZGV9XG4gICAqL1xuICBzdGF0aWMgcm9vdE1vZGU6IFJvb3RNb2RlID0gUm9vdE1vZGUuQ2xvc2VkO1xuXG4gIC8vIOKVreKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKVrlxuICAvLyDilIIgICAgICAgICAgICAgICAgICBMaWZlY3ljbGUgUHJvcGVydGllcyAgICAgICAgICAgICAgICAgIOKUglxuICAvLyDilbDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDila9cblxuICAvKipcbiAgICogSW5pdGlhbGl6YXRpb24gbGlmZWN5Y2xlIG1ldGhvZC4gTWFpbiBzY3JpcHRpbmcgYW5kIGV2ZW50IGxpc3RlbmVycy5cbiAgICogQHJldHVybnMgYSBmdW5jdGlvbiB0byBoYW5kbGUgY2xlYW51cCB0YXNrcyB3aGVuIHRoZSBjb21wb25lbnQgdW5tb3VudHNcbiAgICovXG4gIHByb3RlY3RlZCBzY3JpcHQ/KCk6IFZvaWRGdW5jdGlvbiB8IHZvaWQ7XG5cbiAgLyoqIENhbGxlZCBpbW1lZGlhdGVseSBiZWZvcmUgZWFjaCB0ZW1wbGF0ZSB1cGRhdGUgKi9cbiAgcHJvdGVjdGVkIGJlZm9yZVVwZGF0ZT8oKTogdm9pZDtcblxuICAvKiogQ2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGVhY2ggdGVtcGxhdGUgdXBkYXRlICovXG4gIHByb3RlY3RlZCBhZnRlclVwZGF0ZT8ocHJldmlvdXNBdHRyaWJ1dGVzOiBBdHRyaWJ1dGVNYXApOiB2b2lkO1xuXG4gIC8qKiBGaW5hbCBsaWZlY3ljbGUgbWV0aG9kIGNhbGxlZCBhdCB0aGUgZW5kIG9mIHRoZSB1bm1vdW50aW5nIHByb2Nlc3MuICovXG4gIHByb3RlY3RlZCBmaW5hbGl6ZT8oKTogdm9pZDtcblxuICAvKipcbiAgICogV2hlbiBkZWZpbmVkLCBjYXRjaGVzIGFueSBlcnJvcnMgdGhyb3duIGR1cmluZyBsaWZlY3ljbGUgbXRob2RzIG9mIHRoaXNcbiAgICogY29tcG9uZW50IGFzIHdlbGwgYXMgYW55IHVuY2F1Z2h0IGVycm9ycyBmcm9tIGNoaWxkIGNvbXBvbmVudHMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIFJlY292ZXJpbmcgZnJvbSBlcnJvcnMgb3IgZGlzcGxheWluZyBhIGZhbGxiYWNrXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogb25FcnJvcihlcnJvcikge1xuICAgKiAgIGlmIChlcnJvci5jYW5SZWNvdmVyKSB7XG4gICAqICAgICB0aGlzLnJlY292ZXIoKTtcbiAgICogICAgIHJldHVybjtcbiAgICogICB9XG4gICAqXG4gICAqICAgdGhpcy5yZXBsYWNlV2l0aChcIk9oIGRlYXIsIGFuIGVycm9yIGhhcHBlbmVkIHJlYWwgYmFkXCIpO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgcHJvdGVjdGVkIG9uRXJyb3I/KGVycm9yOiB1bmtub3duKTogdm9pZDtcblxuICAvKipcbiAgICogVGhlIGluaXRpYWwgdmFsdWUgZm9yIHRoaXMgQ29tcG9uZW50J3MgcmVhY3RpdmUgaW50ZXJuYWwgc3RhdGUsIGlmIGFueS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogSWYgYGluaXRpYWxTdGF0ZWAgaXMgZGVmaW5lZCBhcyBhIGZ1bmN0aW9uLCB0aGUgZnVuY3Rpb24gaXMgZXZhbHVhdGVkIGF0XG4gICAqIG1vdW50aW5nIHRpbWUgYW5kIHRoZSByZXR1cm4gdmFsdWUgaXMgdXNlZCBhcyB0aGUgaW5pdGlhbCBzdGF0ZS5cbiAgICovXG4gIHByb3RlY3RlZCBpbml0aWFsU3RhdGU/OiBTdGF0ZUluaXRpYWxpemVyPFN0YXRlU2hhcGU+O1xuXG4gIC8qKlxuICAgKiBBbiBvYmplY3Qgb3IgZnVuY3Rpb24gcmV0dXJuaW5nIGFuIG9iamVjdCB3aGljaCBwb3B1bGF0ZXMgdGhlIGBkYXRhYCB2YWx1ZXNcbiAgICogaW4gdGhlIHRlbXBsYXRpbmcgZW5naW5lLiBTdWNoIHZhbHVlcyBhcmUgYWNjZXNzZWQgdXNpbmcgdGhlIGAqYCBub3RhdGlvbi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBob3N0ID0ge1xuICAgKiAgIGF2YXRhclVybDogXCJodHRwOi8vLi4uXCIsXG4gICAqICAgcmVuZGVyVGltZTogKCkgPT4gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBgYGBodG1sXG4gICAqIDxpbWcgOnNyYz1cIiphdmF0YXJVcmxcIiAvPlxuICAgKiA8c3Bhbj5SZW5kZXJlZCBhdCAke1wiKnJlbmRlclRpbWVcIn08L3NwYW4+XG4gICAqIGBgYFxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbXB1dGVkUHJvcGVydGllcz86IENvbXB1dGVkUHJvcGVydGllczxTdGF0ZVNoYXBlPjtcblxuICAvKipcbiAgICogRGVmaW5lIGF0dHJpYnV0ZSB1cGRhdGUgYW5kIHJlZmxlY3Rpb24gYmVoYXZpb3JzIGFzIGEgcmVjb3JkIG9mIGF0dHJpYnV0ZVxuICAgKiBuYW1lIGtleXMgdG8gb2JqZWN0cyB3aXRoIG9wdGlvbmFsbHkgZGVmaW5lZCBiZWhhdmlvcnMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogbGl2ZUF0dHJpYnV0ZXMgPSB7XG4gICAqICAgZG9uZToge1xuICAgKiAgICAgb25DaGFuZ2UobmV3VmFsdWUpIHtcbiAgICogICAgICAgdGhpcy5zdGF0ZS5zZXQoXCJkb25lXCIsICEhbmV3VmFsdWUpO1xuICAgKiAgICAgfSxcbiAgICogICAgIHJlZmxlY3QoKSB7IHJldHVybiB0aGlzLnN0YXRlLmN1cnJlbnQuZG9uZSB9XG4gICAqICAgfVxuICAgKiB9O1xuICAgKiBgYGBcbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogVGhlIG9wdGlvbmFsIGZ1bmN0aW9ucyBhcmU6XG4gICAqXG4gICAqIGBvbkNoYW5nZShuZXdWYWx1ZSwgb2xkVmFsdWUpOiB2b2lkYCwgYSBoYW5kbGVyIGZ1bmN0aW9uIGZvciB3aGVuIHRoZSB2YWx1ZVxuICAgKiBvZiB0aGlzIGF0dHJpYnV0ZSBoYXMgY2hhbmdlZC4gUnVucyBvbmNlIHBlciB1cGRhdGUgY3ljbGUsICpiZWZvcmUqIHRoZVxuICAgKiB1cGRhdGUgb2NjdXJzLlxuICAgKlxuICAgKiBgcmVmbGVjdCgpOiB1bmtub3duYCwgYSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGEgdmFsdWUgdG8gc2VyaWFsaXplIGFuZCBzZXRcbiAgICogYXMgdGhpcyBhdHRyaWJ1dGUgKmFmdGVyKiBhbiB1cGRhdGUgY29tcGxldGVzLlxuICAgKlxuICAgKiBJZiB1c2luZyB0aGUge0BsaW5rIGRlZmluZX0gaGVscGVyLCB0aGUga2V5cyBvZiB0aGlzIHByb3BlcnR5IGFyZVxuICAgKiBhdXRvbWF0aWNhbGx5IG1lcmdlZCB3aXRoIGFueSBkZWZpbmVkIHtAbGluayBvYnNlcnZlZEF0dHJpYnV0ZXN9LlxuICAgKi9cbiAgcHJvdGVjdGVkIGxpdmVBdHRyaWJ1dGVzPzogTGl2ZUF0dHJpYnV0ZXM8U3RhdGVTaGFwZT47XG5cbiAgLy8g4pWt4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pWuXG4gIC8vIOKUgiAgICAgICAgICAgICAgIEludGVybmFsIFN0YXRlIE1hbmFnZW1lbnQgICAgICAgICAgICAgICAg4pSCXG4gIC8vIOKVsOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKVr1xuXG4gIHByaXZhdGUgX3RlbXBsYXRlOiBUZW1wbGF0ZTtcbiAgcHJpdmF0ZSBfcm9vdDogU2hhZG93Um9vdDtcbiAgcHJpdmF0ZSBfc3RhdGU/OiBTdGF0ZTxTdGF0ZVNoYXBlPjtcbiAgcHJpdmF0ZSBfZGVsZWdhdG9yPzogRXZlbnREZWxlZ2F0b3I7XG4gIHByaXZhdGUgX293bkxpc3RlbmVycz86IFNldDx7XG4gICAgaGFuZGxlcjogRXZlbnRIYW5kbGVyO1xuICAgIGV2ZW50OiBFdmVudE5hbWU7XG4gIH0+ID0gbmV3IFNldCgpO1xuICBwcml2YXRlIF9jbGVhbnVwRm4/OiBWb2lkRnVuY3Rpb247XG5cbiAgcHJpdmF0ZSBfcmVuZGVySW50ZXJuYWxzOiBJbnRlcm5hbFJlbmRlclN0YXR1cyA9IHtcbiAgICBpc0ZpbmFsaXplZDogZmFsc2UsXG4gICAgaW5pdGlhbFJlbmRlckNvbXBsZXRlOiBmYWxzZSxcbiAgICB3aWxsUmVuZGVyOiBmYWxzZSxcblxuICAgIC8qKiBXaGVuIHNldCB0byBgdHJ1ZWAsIHRoZSByZW5kZXIvdXBkYXRlIHByb2Nlc3MgaXMgYWN0aXZlbHkgcnVubmluZyAqL1xuICAgIGlzUmVuZGVyaW5nOiBmYWxzZSxcbiAgICBzZXF1ZW50aWFsUmVuZGVyczogMCxcbiAgICBwb3N0UmVuZGVyQ2FsbGJhY2tzOiBbXSxcbiAgICBsYXN0UmVuZGVyZWRBdHRyaWJ1dGVNYXA6IG5ldyBNYXAoKSxcbiAgICB0cmFja2VkQXR0cmlidXRlQ2hhbmdlczogbmV3IE1hcCgpLFxuICB9O1xuXG4gIC8vIOKVreKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKVrlxuICAvLyDilIIgICAgICAgICAgICAgSW50ZXJuYWxzIGFuZCBQcml2YXRlIE1ldGhvZHMgICAgICAgICAgICAgIOKUglxuICAvLyDilbDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDila9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgY29uc3QgeyB0ZW1wbGF0ZSwgc3R5bGVzLCByb290TW9kZSB9ID0gdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgQ29tcG9uZW50O1xuXG4gICAgLy8gTm9ybWFsaXplIHN0eWxlcyB0byBhbiBhcnJheSBvZiBDU1NTdHlsZVNoZWV0IG9iamVjdHNcbiAgICBjb25zdCBuZXdTdHlsZXMgPSBBcnJheS5pc0FycmF5KHN0eWxlcylcbiAgICAgID8gc3R5bGVzXG4gICAgICA6IHR5cGVvZiBzdHlsZXMgPT09IFwib2JqZWN0XCJcbiAgICAgICAgPyBbc3R5bGVzXVxuICAgICAgICA6IFtjc3NgJHtzdHlsZXN9YF07XG5cbiAgICB0aGlzLl9yb290ID0gdGhpcy5hdHRhY2hTaGFkb3coeyBtb2RlOiByb290TW9kZSB9KTtcbiAgICB0aGlzLl9yb290LmFkb3B0ZWRTdHlsZVNoZWV0cy5wdXNoKC4uLm5ld1N0eWxlcyk7XG4gICAgdGhpcy5fdGVtcGxhdGUgPVxuICAgICAgdGVtcGxhdGUgaW5zdGFuY2VvZiBUZW1wbGF0ZSA/IHRlbXBsYXRlIDogbmV3IFRlbXBsYXRlKHRlbXBsYXRlKTtcbiAgfVxuXG4gIC8qKiBQcm9kdWNlIHRoZSBkYXRhIG9iamVjdCB0byBwYXNzIHRvIHRoZSB0ZW1wbGF0ZSdzIHJlbmRlciBmdW5jdGlvbiAqL1xuICBwcml2YXRlIF9nZXRSZW5kZXJDb250ZXh0KGF0dHI6IEF0dHJpYnV0ZU1hcCk6IFRlbXBsYXRlQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHI6IE9iamVjdC5mcm9tRW50cmllcyhhdHRyKSxcbiAgICAgIGRhdGE6XG4gICAgICAgIHR5cGVvZiB0aGlzLmNvbXB1dGVkUHJvcGVydGllcyA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyB0aGlzLmNvbXB1dGVkUHJvcGVydGllcygpXG4gICAgICAgICAgOiB0aGlzLmNvbXB1dGVkUHJvcGVydGllcyxcbiAgICAgIHN0YXRlOiB0aGlzLl9zdGF0ZSA/IHRoaXMuX3N0YXRlLmN1cnJlbnQgOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2VzY2FsYXRlRXJyb3IoZXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgICBsZXQgbm9kZTogTm9kZSB8IG51bGwgPSB0aGlzLnBhcmVudE5vZGU7XG5cbiAgICB3aGlsZSAobm9kZSkge1xuICAgICAgaWYgKFxuICAgICAgICBub2RlIGluc3RhbmNlb2YgQ29tcG9uZW50ICYmXG4gICAgICAgIFwib25FcnJvclwiIGluIG5vZGUgJiZcbiAgICAgICAgdHlwZW9mIG5vZGUub25FcnJvciA9PT0gXCJmdW5jdGlvblwiXG4gICAgICApIHtcbiAgICAgICAgbm9kZS5vbkVycm9yKGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgICBub2RlID0gbm9kZS5ob3N0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBub3RoaW5nIHdhcyBmb3VuZCB0byBlc2NhbGF0ZSB0bywgdGhyb3cgdGhlIGVycm9yXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBwcml2YXRlIF9yZXBvcnRFcnJvcihlcnJvcjogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICghdGhpcy5vbkVycm9yKSB7XG4gICAgICB0aGlzLl9lc2NhbGF0ZUVycm9yKGVycm9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vbkVycm9yKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9leGVjdXRlQXR0cmlidXRlQ2hhbmdlSGFuZGxlcnMgPSAoKSA9PiB7XG4gICAgaWYgKCF0aGlzLmxpdmVBdHRyaWJ1dGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcHJldkF0dHJzID0gdGhpcy5fcmVuZGVySW50ZXJuYWxzLmxhc3RSZW5kZXJlZEF0dHJpYnV0ZU1hcDtcblxuICAgIC8vIENvcHkgdGhlIGNoYW5nZXMgdG8gYSBuZXcgbWFwIGFuZCBjbGVhciB0aGUgdHJhY2tpbmcgbWFwXG4gICAgY29uc3QgdHJhY2tlZENoYW5nZXMgPSBuZXcgTWFwKFxuICAgICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLnRyYWNrZWRBdHRyaWJ1dGVDaGFuZ2VzLFxuICAgICk7XG4gICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLnRyYWNrZWRBdHRyaWJ1dGVDaGFuZ2VzLmNsZWFyKCk7XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWxdIG9mIHRyYWNrZWRDaGFuZ2VzKSB7XG4gICAgICBjb25zdCBjb25maWcgPSB0aGlzLmxpdmVBdHRyaWJ1dGVzW25hbWVdO1xuICAgICAgaWYgKCFjb25maWcpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChcIm9uQ2hhbmdlXCIgaW4gY29uZmlnKSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSBwcmV2QXR0cnMuZ2V0KG5hbWUpID8/IG51bGw7XG5cbiAgICAgICAgaWYgKGNvbmZpZyAmJiBwcmV2aW91c1ZhbHVlICE9PSB2YWwpIHtcbiAgICAgICAgICBjb25maWcub25DaGFuZ2U/LmNhbGwodGhpcywgdmFsLCBwcmV2aW91c1ZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIF9yZWZsZWN0TGl2ZUF0dHJpYnV0ZXMgPSAoKSA9PiB7XG4gICAgaWYgKCF0aGlzLmxpdmVBdHRyaWJ1dGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdG9TZXQ6IFtuYW1lOiBzdHJpbmcsIHZhbDogc3RyaW5nIHwgbnVsbF1bXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbbmFtZSwgY29uZmlnXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmxpdmVBdHRyaWJ1dGVzKSkge1xuICAgICAgaWYgKFwicmVmbGVjdFwiIGluIGNvbmZpZykge1xuICAgICAgICBjb25zdCB2YWwgPSBzZXJpYWxpemVBdHRyaWJ1dGUoY29uZmlnLnJlZmxlY3Q/LmNhbGwodGhpcykpO1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7XG5cbiAgICAgICAgaWYgKHZhbCAhPT0gY3VycmVudCkge1xuICAgICAgICAgIHRvU2V0LnB1c2goW25hbWUsIHZhbF0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsXSBvZiB0b1NldCkge1xuICAgICAgdGhpcy5yZWZsZWN0QXR0cmlidXRlKG5hbWUsIHZhbCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKiBUaGUgYWN0dWFsIHVwZGF0ZSBiZWhhdmlvciAqL1xuICBwcml2YXRlIF9wZXJmb3JtVXBkYXRlID0gKCk6IHZvaWQgPT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBJbW1lZGlhdGVseSBmbGlwIGZsYWdzIHRvIGRlbm90ZSBhIHJlbmRlciBpcyBpbiBwcm9ncmVzcyBhbmQgYWxsb3dcbiAgICAgIC8vIHF1ZXVlaW5nIGFub3RoZXIgcmVuZGVyIHJlcXVlc3QuXG4gICAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMuaXNSZW5kZXJpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLndpbGxSZW5kZXIgPSBmYWxzZTtcblxuICAgICAgLy8gQXR0cmlidXRlczogUnVuIGFueSBgcmVhZGAgaG9va3MgZm9yIGNoYW5nZWQgYXR0cmlidXRlc1xuICAgICAgdGhpcy5fZXhlY3V0ZUF0dHJpYnV0ZUNoYW5nZUhhbmRsZXJzKCk7XG5cbiAgICAgIC8vIENhY2hlIHRoZSBhdHRyaWJ1dGVzIGZyb20gdGhlIHByZXZpb3VzIHJlbmRlclxuICAgICAgY29uc3QgcHJldkF0dHJzID0gdGhpcy5fcmVuZGVySW50ZXJuYWxzLmxhc3RSZW5kZXJlZEF0dHJpYnV0ZU1hcDtcblxuICAgICAgdGhpcy5iZWZvcmVVcGRhdGU/LigpO1xuXG4gICAgICAvLyBVcGRhdGUgdGhlIGN1cnJlbnQgc25hcHNob3Qgb2YgYXR0cmlidXRlc1xuICAgICAgY29uc3QgbmV3QXR0cmlidXRlcyA9IGNyZWF0ZUF0dHJpYnV0ZU1hcCh0aGlzKTtcbiAgICAgIHRoaXMuX3RlbXBsYXRlLnJlbmRlcih0aGlzLnJvb3QsIHRoaXMuX2dldFJlbmRlckNvbnRleHQobmV3QXR0cmlidXRlcykpO1xuICAgICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLmxhc3RSZW5kZXJlZEF0dHJpYnV0ZU1hcCA9IG5ld0F0dHJpYnV0ZXM7XG4gICAgICB0aGlzLmFmdGVyVXBkYXRlPy4ocHJldkF0dHJzKTtcblxuICAgICAgLy8gQXR0cmlidXRlczogUnVuIGFueSBgd3JpdGVgIGhvb2tzIGZvciB1cGRhdGVkIHZhbHVlc1xuICAgICAgdGhpcy5fcmVmbGVjdExpdmVBdHRyaWJ1dGVzKCk7XG5cbiAgICAgIC8vIFJ1biBhbnkgcmVxdWVzdGVkIHJlbmRlciBjYWxsYmFja3NcbiAgICAgIC8vIFRoZXNlIGFyZSBjb25zaWRlcmVkIGxpZmVjeWNsZSBtZXRob2RzIGFzIHdlbGwsIGFuZCB3aWxsIHJlcG9ydCBlcnJvcnNcbiAgICAgIC8vIGFzIGFueSBvdGhlciBsaWZlY3ljbGUgbWV0aG9kIHdvdWxkXG4gICAgICBpZiAodGhpcy5fcmVuZGVySW50ZXJuYWxzLnBvc3RSZW5kZXJDYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IHRoaXMuX3JlbmRlckludGVybmFscy5wb3N0UmVuZGVyQ2FsbGJhY2tzO1xuICAgICAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMucG9zdFJlbmRlckNhbGxiYWNrcyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGZuIG9mIGNhbGxiYWNrcykge1xuICAgICAgICAgIGZuKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIGB3aWxsUmVuZGVyYCBmbGFnIHdhcyBmbGlwcGVkLCBpbW1lZGlhdGVseSBwZXJmb3JtIGEgcmVuZGVyXG4gICAgICBpZiAodGhpcy5fcmVuZGVySW50ZXJuYWxzLndpbGxSZW5kZXIpIHtcbiAgICAgICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLnNlcXVlbnRpYWxSZW5kZXJzICs9IDE7XG5cbiAgICAgICAgaWYgKHRoaXMuX3JlbmRlckludGVybmFscy5zZXF1ZW50aWFsUmVuZGVycyA+PSBNQVhfU0VRVUVOVElBTF9SRU5ERVJTKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihcbiAgICAgICAgICAgIEVycm9yQ29kZS5NQVhfU0VRVUVOVElBTF9SRU5ERVJTLFxuICAgICAgICAgICAgYCR7dGhpcy5fcmVuZGVySW50ZXJuYWxzLnNlcXVlbnRpYWxSZW5kZXJzfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3BlcmZvcm1VcGRhdGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3JlbmRlckludGVybmFscy5zZXF1ZW50aWFsUmVuZGVycyA9IDA7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX3JlbmRlckludGVybmFscy53aWxsUmVuZGVyID0gZmFsc2U7XG4gICAgICB0aGlzLl9yZXBvcnRFcnJvcihlcnJvcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX3JlbmRlckludGVybmFscy5pc1JlbmRlcmluZyA9IGZhbHNlO1xuICAgIH1cbiAgfTtcblxuICAvKiogU2FmZWx5IHJlcXVlc3QgZm9yIGFuIHVwZGF0ZSB0byBydW4gb24gdGhlIG5leHQgZnJhbWUgKi9cbiAgcHJpdmF0ZSBfc2NoZWR1bGVVcGRhdGUgPSAoKSA9PiB7XG4gICAgLy8gUHJldmVudCBzY2hlZHVsaW5nIG11bHRpcGxlIHJlbmRlcnNcbiAgICBpZiAodGhpcy5fcmVuZGVySW50ZXJuYWxzLndpbGxSZW5kZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMud2lsbFJlbmRlciA9IHRydWU7XG5cbiAgICAvLyBJZiBjdXJyZW50bHkgcmVuZGVyaW5nLCBkb24ndCByZXF1ZXN0IGEgcmVuZGVyLCBpdCB3aWxsIGF1dG8tY29udGludWVcbiAgICAvLyB1bnRpbCB0aGVyZSBhcmUgbm8gY2hhbmdlcyB0byByZW5kZXJcbiAgICBpZiAodGhpcy5fcmVuZGVySW50ZXJuYWxzLmlzUmVuZGVyaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgYSByZW5kZXIgaXMgcmVxdWVzdGVkIGFuZCB3ZSdyZSBub3QgcmVuZGVyaW5nLCByZXF1ZXN0IGEgcmVuZGVyIGZyYW1lXG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuX3BlcmZvcm1VcGRhdGUpO1xuICB9O1xuXG4gIHByaXZhdGUgX2Fkb3B0U3RhdGUoc3RhdGU6IFN0YXRlU2hhcGUgfCBTdGF0ZTxTdGF0ZVNoYXBlPikge1xuICAgIC8vIElmIHRoaXMgaXMgZXhhY3RseSBvdXIgb3duIHN0YXRlIG9iamVjdCwgZG8gbm90aGluZ1xuICAgIGlmIChPYmplY3QuaXModGhpcy5fc3RhdGUsIHN0YXRlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHN0YXRlIGV4aXN0cywgcmVtb3ZlIHRoZSBsaXN0ZW5lciBhbmQgc2NoZWR1bGUgYSByZW5kZXJcbiAgICBpZiAodGhpcy5fc3RhdGUpIHtcbiAgICAgIHRoaXMuX3N0YXRlLnJlbW92ZUxpc3RlbmVyKHRoaXMuX3NjaGVkdWxlVXBkYXRlKTtcbiAgICAgIHRoaXMuX3NjaGVkdWxlVXBkYXRlKCk7XG4gICAgfVxuXG4gICAgLy8gQWRvcHQgdGhlIGluY29taW5nIHN0YXRlIG9iaiBvciB3cmFwIGFuZCBhZG9wdCBpdFxuICAgIGNvbnN0IGluY29taW5nU3RhdGVPYmogPSBzdGF0ZSBpbnN0YW5jZW9mIFN0YXRlID8gc3RhdGUgOiBuZXcgU3RhdGUoc3RhdGUpO1xuICAgIHRoaXMuX3N0YXRlID0gaW5jb21pbmdTdGF0ZU9iajtcblxuICAgIC8vIEVuc3VyZSB0aGVyZSBpcyBub3QgYWNjaWRlbnRhbGx5IHR3byBvZiB0aGUgc2FtZSByZW5kZXIgbGlzdGVuZXJzXG4gICAgdGhpcy5fc3RhdGUucmVtb3ZlTGlzdGVuZXIodGhpcy5fc2NoZWR1bGVVcGRhdGUpO1xuICAgIHRoaXMuX3N0YXRlLmFkZExpc3RlbmVyKHRoaXMuX3NjaGVkdWxlVXBkYXRlKTtcbiAgfVxuXG4gIC8vIOKVreKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKVrlxuICAvLyDilIIgICAgICAgICAgIEN1c3RvbSBFbGVtZW50IENhbGxiYWNrIE92ZXJyaWRlcyAgICAgICAgICAgIOKUglxuICAvLyDilbDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDila9cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBzY3JpcHR9IGluc3RlYWRcbiAgICovXG4gIHByb3RlY3RlZCBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcmVuZGVySW50ZXJuYWxzLmluaXRpYWxSZW5kZXJDb21wbGV0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICBjb25zdCBsaXZlQXR0cmlidXRlcyA9IG5ldyBTZXQoT2JqZWN0LmtleXModGhpcy5saXZlQXR0cmlidXRlcyA/PyB7fSkpO1xuICAgICAgY29uc3Qgb2JzZXJ2ZWRBdHRyaWJ1dGVzID0gbmV3IFNldChcbiAgICAgICAgKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIENvbXBvbmVudCkub2JzZXJ2ZWRBdHRyaWJ1dGVzLFxuICAgICAgKTtcblxuICAgICAgaWYgKCFvYnNlcnZlZEF0dHJpYnV0ZXMuaXNTdXBlcnNldE9mKGxpdmVBdHRyaWJ1dGVzKSkge1xuICAgICAgICBjb25zdCBjb21wb25lbnROYW1lID0gKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIENvbXBvbmVudCkubmFtZTtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbQ29tcG9uZW50XSBDb21wb25lbnQgJHtjb21wb25lbnROYW1lfSBoYXMgZGVmaW5lZCBMaXZlIEF0dHJpYnV0ZXMgYCArXG4gICAgICAgICAgICBgd2hpY2ggYXJlIG5vdCBsaXN0ZWQgaW4gdGhlIE9ic2VydmVkIEF0dHJpYnV0ZXMgbGlzdC4gQXMgc3VjaCwgYCArXG4gICAgICAgICAgICBgdGhleSBtYXkgbm90IGZ1bmN0aW9uIHByb3Blcmx5LiBCZSBzdXJlIHRvIHNldCB0aGUgc3RhdGljIGAgK1xuICAgICAgICAgICAgYG9ic2VydmVkQXR0cmlidXRlcyBwcm9wZXJ0eSBvbiB5b3VyIENvbXBvbmVudCwgb3IgdXNlIHRoZSBgICtcbiAgICAgICAgICAgIGBkZWZpbmUoKSBoZWxwZXIgdG8gYXV0b21hdGljYWxseSBlbnN1cmUgdGhlIGNvcnJlY3QgY29uZmlndXJhdGlvbmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLmlzUmVuZGVyaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLndpbGxSZW5kZXIgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gY3JlYXRlQXR0cmlidXRlTWFwKHRoaXMpO1xuXG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBzdGF0ZWZ1bCBjb21wb25lbnQsIHNldCB1cCB0aGF0IHN0YXRlXG4gICAgICAgIGlmICh0aGlzLmluaXRpYWxTdGF0ZSkge1xuICAgICAgICAgIGNvbnN0IGluaXQgPVxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuaW5pdGlhbFN0YXRlID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgICAgID8gdGhpcy5pbml0aWFsU3RhdGVcbiAgICAgICAgICAgICAgOiB0aGlzLmluaXRpYWxTdGF0ZSgpO1xuXG4gICAgICAgICAgdGhpcy5fYWRvcHRTdGF0ZShpbml0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3RlbXBsYXRlLnJlbmRlcih0aGlzLnJvb3QsIHRoaXMuX2dldFJlbmRlckNvbnRleHQoYXR0cmlidXRlcykpO1xuICAgICAgICB0aGlzLl9yZWZsZWN0TGl2ZUF0dHJpYnV0ZXMoKTtcbiAgICAgICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLmxhc3RSZW5kZXJlZEF0dHJpYnV0ZU1hcCA9IGF0dHJpYnV0ZXM7XG4gICAgICAgIHRoaXMuX3JlbmRlckludGVybmFscy5pbml0aWFsUmVuZGVyQ29tcGxldGUgPSB0cnVlO1xuICAgICAgICB0aGlzLl9jbGVhbnVwRm4gPSB0aGlzLnNjcmlwdD8uKCkgPz8gdW5kZWZpbmVkO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fcmVwb3J0RXJyb3IoZXJyb3IpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLmlzUmVuZGVyaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBmaW5hbGl6ZX1cbiAgICovXG4gIHByb3RlY3RlZCBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcmVuZGVySW50ZXJuYWxzLmlzRmluYWxpemVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgLy8gSWYgdGhpcyB0YXNrIHJ1bnMgYnV0IHRoZSBjb21wb25lbnQgaXMgc3RpbGwgY29ubmVjdGVkLCB0aGVuIGRvIG5vdGhpbmdcbiAgICAgIC8vIGJlY2F1c2UgdGhlIGNvbXBvbmVudCB3YXMganVzdCBtb3ZlZCBpbiB0aGUgRE9NLlxuICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQgfHwgIXRoaXMuX3JlbmRlckludGVybmFscy5pbml0aWFsUmVuZGVyQ29tcGxldGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMuaXNGaW5hbGl6ZWQgPSB0cnVlO1xuXG4gICAgICAvLyBPbmx5IHJ1biB0aGUgZGlzY29ubmVjdCBpZiB0aGUgZWxlbWVudCBpcyBhY3R1YWxseSB1bm1vdW50ZWQgYW5kIG5vdFxuICAgICAgLy8ganVzdCBtb3ZlZC4gVXNpbmcgdGhpcyBpbiBwbGFjZSBvZiBjb25uZWN0ZWRNb3ZlQ2FsbGJhY2soKSBmb3IgY29tcGF0XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9kZWxlZ2F0b3I/LmNsZWFudXAoKTtcblxuICAgICAgICAvLyBDbGVhciBhbnkgbGlzdGVuZXJzIHNldCB1cCBvbiBzZWxmXG4gICAgICAgIGlmICh0aGlzLl9vd25MaXN0ZW5lcnMgJiYgdGhpcy5fb3duTGlzdGVuZXJzLnNpemUgPiAwKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLl9vd25MaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihsaXN0ZW5lci5ldmVudCwgbGlzdGVuZXIuaGFuZGxlcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2xlYW51cEZuPy4oKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX3JlcG9ydEVycm9yKGVycm9yKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIC8vIFJ1biB0aGUgZmluYWxpemUgY2FsbCBhZnRlciBldmVyeXRoaW5nLCBldmVuIGlmIHRoZSBjbGVhbnVwIGZuIGZhaWxlZFxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuZmluYWxpemU/LigpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuX3JlcG9ydEVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgbGl2ZUF0dHJpYnV0ZXN9IGluc3RlYWRcbiAgICovXG4gIHByb3RlY3RlZCBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIF86IHN0cmluZyB8IG51bGwsXG4gICAgbmV3VmFsdWU6IHN0cmluZyB8IG51bGwsXG4gICk6IHZvaWQge1xuICAgIC8vIElnbm9yZSBhdHRyaWJ1dGUgY2hhbmdlcyB0aGF0IG9jY3VyIGR1cmluZyBhbiB1cGRhdGUsIGFzIHRoZXkgYXJlXG4gICAgLy8gY29taW5nIGZyb20gaW5zaWRlIHRoZSBob3VzZVxuICAgIGlmICh0aGlzLl9yZW5kZXJJbnRlcm5hbHMuaXNSZW5kZXJpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTa2lwIG5vbi1jaGFuZ2VzIHVzaW5nIHRoZSBzdG9yZWQgYXR0cmlidXRlcyBhcyByZWZlcmVuY2UgdG8gY29tcGFyZVxuICAgIC8vIHRvIHRoZSByZW5kZXIgc3RhdGUgcmF0aGVyIHRoYW4gdGhlIGRvbVxuICAgIGlmIChcbiAgICAgIG5ld1ZhbHVlID09PSB0aGlzLl9yZW5kZXJJbnRlcm5hbHMubGFzdFJlbmRlcmVkQXR0cmlidXRlTWFwPy5nZXQobmFtZSlcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDYWNoZSB0aGUgdXBkYXRlZCBhdHRyaWJ1dGUgdmFsdWVcbiAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMudHJhY2tlZEF0dHJpYnV0ZUNoYW5nZXMuc2V0KG5hbWUsIG5ld1ZhbHVlKTtcblxuICAgIC8vIFNjaGVkdWxlIGEgcmVuZGVyXG4gICAgaWYgKCF0aGlzLl9yZW5kZXJJbnRlcm5hbHMud2lsbFJlbmRlcikge1xuICAgICAgdGhpcy5fc2NoZWR1bGVVcGRhdGUoKTtcbiAgICB9XG4gIH1cblxuICAvLyDila3ilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDila5cbiAgLy8g4pSCICAgICAgICAgICAgICAgICAgICBQdWJsaWMgSW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICDilIJcbiAgLy8g4pWw4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pWvXG5cbiAgLyoqXG4gICAqIFRoZSBTaGFkb3dSb290IG5vZGUgb2YgdGhpcyBlbGVtZW50XG4gICAqL1xuICBnZXQgcm9vdCgpOiBTaGFkb3dSb290IHtcbiAgICByZXR1cm4gdGhpcy5fcm9vdDtcbiAgfVxuXG4gIGdldCBpc01vdW50ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNDb25uZWN0ZWQgJiYgdGhpcy5fcmVuZGVySW50ZXJuYWxzLmluaXRpYWxSZW5kZXJDb21wbGV0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2Nlc3NvciBmb3IgbGl2ZSByZWFjdGl2ZSBzdGF0ZS5cbiAgICpcbiAgICogRm9yIHRoZSBmdWxsIHN0YXRlIG1hbmlwdWxhdGlvbiBBUEksIHVzZSB7QGxpbmsgZ2V0U3RhdGV9XG4gICAqL1xuICBnZXQgc3RhdGUoKTogU3RhdGVTaGFwZSB7XG4gICAgaWYgKCF0aGlzLl9zdGF0ZSkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuTUlTU0lOR19TVEFURSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlLmxpdmU7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSB0aGUgY3VycmVudCBzdGF0ZSB3aXRoIGEgbmV3IHZhbHVlIG9yIGFkb3B0IGEgd2hvbGUgZGlmZmVyZW50IFN0YXRlXG4gICAqIGluc3RhbmNlXG4gICAqL1xuICBzZXQgc3RhdGUobmV3U3RhdGU6IFN0YXRlU2hhcGUgfCBTdGF0ZTxTdGF0ZVNoYXBlPikge1xuICAgIHRoaXMuX2Fkb3B0U3RhdGUobmV3U3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjY2VzcyB0aGUgZnVsbCB7QGxpbmsgU3RhdGV9IGluc3RhbmNlIGZvciB0aGlzIENvbXBvbmVudC5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhIGNvbXBvbmVudCB3aGljaCBpcyBub3QgdXNpbmcgcmVhY3RpdmUgc3RhdGVcbiAgICogd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IgYmVpbmcgdGhyb3duLlxuICAgKi9cbiAgZ2V0U3RhdGUoKTogU3RhdGU8U3RhdGVTaGFwZT4ge1xuICAgIGlmICghdGhpcy5fc3RhdGUpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLk1JU1NJTkdfU1RBVEUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9zdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYW51YWxseSBzY2hlZHVsZSBhIHJlbmRlciB0byBvY2N1ciwgb3B0aW9uYWxseSBwcm92aWRpbmcgYSBjYWxsYmFjayB0b1xuICAgKiBpbnZva2UgYWZ0ZXIgdGhlIHJlbmRlciBjb21wbGV0ZXMuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIENhbGxpbmcge0BsaW5rIHJlcXVlc3RSZW5kZXJ9IG11bHRpcGxlIHRpbWVzIGluIHRoZSBzYW1lIGV2ZW50IGxvb3Agd29uJ3RcbiAgICogc2NoZWR1bGUgbXVsdGlwbGUgcmVuZGVycy4gUmVuZGVycyBhcmUgc2NoZWR1bGVkIHRvIG9jY3VyIG9uIHRoZSBuZXh0XG4gICAqIGFuaW1hdGlvbiBmcmFtZS5cbiAgICovXG4gIHJlcXVlc3RSZW5kZXIoY2FsbGJhY2s/OiBWb2lkRnVuY3Rpb24pOiB2b2lkIHtcbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIHRoaXMuX3JlbmRlckludGVybmFscy5wb3N0UmVuZGVyQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgIH1cblxuICAgIHRoaXMuX3NjaGVkdWxlVXBkYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdGVuIGZvciBldmVudHMgZnJvbSB3aXRoaW4gdGhpcyBDb21wb25lbnQuXG4gICAqXG4gICAqIFByb3ZpZGUgYSBxdWVyeSBzdHJpbmcgdG8gdGFyZ2V0IHNwZWNpZmljIGVsZW1lbnQgZXZlbnRzLCBvciB1c2UgYDpob3N0YFxuICAgKiB0byBjcmVhdGUgbGlzdGVuZXJzIG9uIHRoZSBob3N0IGVsZW1lbnQgaXRzZWxmLlxuICAgKlxuICAgKiBFdmVudCBsaXN0ZW5lcnMgY3JlYXRlZCB3aXRoIHRoaXMgbWV0aG9kIGFyZSBhdXRvbWF0aWNhbGx5IGNsZWFuZWQgdXAgd2hlblxuICAgKiB0aGUgY29tcG9uZW50IHVubW91bnRzLlxuICAgKi9cbiAgbGlzdGVuPEUgZXh0ZW5kcyBFdmVudE5hbWU+KFxuICAgIHRhcmdldERlc2NyaXB0b3I6IHN0cmluZyB8IHR5cGVvZiBDb21wb25lbnQ8YW55PiB8IEhUTUxFbGVtZW50LFxuICAgIGV2ZW50TmFtZTogRSxcbiAgICBldmVudEhhbmRsZXI6IEV2ZW50SGFuZGxlcjxFPixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgcXVlcnkgPSBFdmVudERlbGVnYXRvci5wcm9jZXNzVGFyZ2V0RGVzY3JpcHRvcih0YXJnZXREZXNjcmlwdG9yKTtcblxuICAgIC8vIElmIHRoZSBxdWVyeSBmaWx0ZXIgaXMgYFwiOmhvc3RcImAsIHNldCB1cCBhbiBvd25MaXN0ZW5lclxuICAgIGlmIChxdWVyeSA9PT0gXCI6aG9zdFwiIHx8IHF1ZXJ5ID09PSBcIjpIT1NUXCIpIHtcbiAgICAgIGlmICh0aGlzLl9vd25MaXN0ZW5lcnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLl9vd25MaXN0ZW5lcnMgPSBuZXcgU2V0KCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGV2ZW50SGFuZGxlcik7XG4gICAgICB0aGlzLl9vd25MaXN0ZW5lcnMuYWRkKHtcbiAgICAgICAgaGFuZGxlcjogZXZlbnRIYW5kbGVyIGFzIEV2ZW50SGFuZGxlcixcbiAgICAgICAgZXZlbnQ6IGV2ZW50TmFtZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE90aGVyd2lzZSwgc2V0IHVwIGEgcm9vdCBsaXN0ZW5lclxuICAgIGlmICghdGhpcy5fZGVsZWdhdG9yKSB7XG4gICAgICB0aGlzLl9kZWxlZ2F0b3IgPSBuZXcgRXZlbnREZWxlZ2F0b3IodGhpcy5yb290KTtcbiAgICB9XG5cbiAgICB0aGlzLl9kZWxlZ2F0b3IuYWRkTGlzdGVuZXIoZXZlbnROYW1lLCBldmVudEhhbmRsZXIsIHF1ZXJ5KTtcbiAgfVxuXG4gIHN0b3BMaXN0ZW5pbmc8RSBleHRlbmRzIEV2ZW50TmFtZT4oXG4gICAgdGFyZ2V0RGVzY3JpcHRvcjogc3RyaW5nIHwgdHlwZW9mIENvbXBvbmVudDxhbnk+IHwgSFRNTEVsZW1lbnQsXG4gICAgZXZlbnROYW1lOiBFLFxuICAgIGV2ZW50SGFuZGxlcjogRXZlbnRIYW5kbGVyPEU+LFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBxdWVyeSA9IEV2ZW50RGVsZWdhdG9yLnByb2Nlc3NUYXJnZXREZXNjcmlwdG9yKHRhcmdldERlc2NyaXB0b3IpO1xuXG4gICAgLy8gSWYgdGhlIHF1ZXJ5IGZpbHRlciBpcyBgXCI6aG9zdFwiYCwgcmVtb3ZlIGZyb20gdGhlIG93bkxpc3RlbmVyIGxpc3RcbiAgICBpZiAocXVlcnkgPT09IFwiOmhvc3RcIiB8fCBxdWVyeSA9PT0gXCI6SE9TVFwiKSB7XG4gICAgICBpZiAodGhpcy5fb3duTGlzdGVuZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fb3duTGlzdGVuZXJzID0gbmV3IFNldCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZXZlbnRIYW5kbGVyIGFzIEV2ZW50SGFuZGxlcik7XG4gICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX293bkxpc3RlbmVycykge1xuICAgICAgICBpZiAobGlzdGVuZXIuZXZlbnQgPT09IGV2ZW50TmFtZSAmJiBsaXN0ZW5lci5oYW5kbGVyID09PSBldmVudEhhbmRsZXIpIHtcbiAgICAgICAgICB0aGlzLl9vd25MaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBkZWxlZ2F0b3IgaXMgbm90IHNldCB1cCwgdGhlcmUncyBub3RoaW5nIHRvIGRvXG4gICAgaWYgKCF0aGlzLl9kZWxlZ2F0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9kZWxlZ2F0b3IucmVtb3ZlTGlzdGVuZXIoXG4gICAgICBldmVudE5hbWUsXG4gICAgICBldmVudEhhbmRsZXIgYXMgRXZlbnRIYW5kbGVyLFxuICAgICAgcXVlcnksXG4gICAgKTtcbiAgfVxuXG4gIGRpc3BhdGNoRXZlbnQoZXZlbnQ6IEV2ZW50KTogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGlzcGF0Y2ggYSB7QGxpbmsgQ3VzdG9tRXZlbnR9IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBkZXRhaWxcbiAgICovXG4gIGRpc3BhdGNoRXZlbnQ8VD4oXG4gICAgZXZlbnQ6IHN0cmluZyxcbiAgICBkZXRhaWw/OiBULFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBidWJibGVzOiBib29sZWFuO1xuICAgICAgY2FuY2VsYWJsZTogYm9vbGVhbjtcbiAgICAgIGNvbXBvc2VkOiBib29sZWFuO1xuICAgIH0sXG4gICk6IGJvb2xlYW47XG4gIGRpc3BhdGNoRXZlbnQ8VD4oXG4gICAgZXZlbnQ6IHN0cmluZyB8IEV2ZW50LFxuICAgIGRldGFpbD86IFQsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIGJ1YmJsZXM6IGJvb2xlYW47XG4gICAgICBjYW5jZWxhYmxlOiBib29sZWFuO1xuICAgICAgY29tcG9zZWQ6IGJvb2xlYW47XG4gICAgfSxcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgRXZlbnQpIHtcbiAgICAgIHJldHVybiBzdXBlci5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRzID0ge1xuICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgIC4uLihvcHRpb25zID8/IHt9KSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHN1cGVyLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQ8VD4oZXZlbnQsIHtcbiAgICAgICAgZGV0YWlsLFxuICAgICAgICAuLi5vcHRzLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHF1ZXJ5U2VsZWN0b3I8RSBleHRlbmRzIEhUTUxFbGVtZW50PihxdWVyeTogc3RyaW5nKTogRSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9yb290LnF1ZXJ5U2VsZWN0b3IocXVlcnkpO1xuICB9XG5cbiAgcXVlcnlTZWxlY3RvckFsbDxFIGV4dGVuZHMgSFRNTEVsZW1lbnQ+KHF1ZXJ5OiBzdHJpbmcpOiBOb2RlTGlzdE9mPEU+IHtcbiAgICByZXR1cm4gdGhpcy5fcm9vdC5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJ5KSBhcyBOb2RlTGlzdE9mPEU+O1xuICB9XG5cbiAgZ2V0RWxlbWVudEJ5SWQ8RSBleHRlbmRzIEhUTUxFbGVtZW50PihpZDogc3RyaW5nKTogRSB8IG51bGwge1xuICAgIGlmICh0aGlzLl9yb290IGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3Jvb3QuZ2V0RWxlbWVudEJ5SWQoaWQpIGFzIEUgfCBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gSFRNTEVsZW1lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3IuY2FsbChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYCMke2lkfWAsXG4gICAgICApIGFzIEUgfCBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHJlcXVpcmVFbGVtZW50QnlJZDxFIGV4dGVuZHMgSFRNTEVsZW1lbnQ+KGlkOiBzdHJpbmcpOiBFIHtcbiAgICBjb25zdCBsb29rdXAgPSB0aGlzLmdldEVsZW1lbnRCeUlkPEU+KGlkKTtcbiAgICBpZiAoIWxvb2t1cCkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuTUlTU0lOR19FTEVNRU5UKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvb2t1cDtcbiAgfVxuXG4gIHNldEF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBTZXQgYSB2YWx1ZSBhcyBhbiBhdHRyaWJ1dGUsIHNlcmlhbGl6aW5nIHRvIGEgc3RyaW5nIG9yIGBudWxsYC5cbiAgICpcbiAgICogbnVsbCB2YWx1ZXMgY2F1c2UgdGhlIGF0dHJpYnV0ZSB0byBiZSByZW1vdmVkIGZyb20gdGhpcyBlbGVtZW50XG4gICAqL1xuICBzZXRBdHRyaWJ1dGUobmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQ7XG4gIHNldEF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IHNlcmlhbGl6ZUF0dHJpYnV0ZSh2YWx1ZSk7XG4gICAgaWYgKHNlcmlhbGl6ZWQgPT09IG51bGwpIHtcbiAgICAgIEhUTUxFbGVtZW50LnByb3RvdHlwZS5yZW1vdmVBdHRyaWJ1dGUuY2FsbCh0aGlzLCBuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgSFRNTEVsZW1lbnQucHJvdG90eXBlLnNldEF0dHJpYnV0ZS5jYWxsKHRoaXMsIG5hbWUsIHNlcmlhbGl6ZWQpO1xuICAgIH1cbiAgfVxuXG4gIGdldEF0dHJpYnV0ZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBHZXQgYW4gYXR0cmlidXRlIGFzIGEgbnVtYmVyLCBmYWxsaW5nIGJhY2sgdG8gYSBzcGVjaWZpZWQgZGVmYXVsdC5cbiAgICpcbiAgICogYG51bGxgIGF0dHJpYnV0ZXMgYXJlIHJldHVybmVkIGFzIGBudWxsYCwgd2hpbGUgc3RyaW5nIGF0dHJpYnV0ZXMgYXJlXG4gICAqIHBhcnNlZCB1c2luZyB0aGUgYE51bWJlcigpYCBjb25zdHJ1Y3Rvci4gTmFOIGlzIGNvZXJjZWQgdG8gYG51bGxgLlxuICAgKi9cbiAgZ2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBudW1iZXIpOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEdldCBhbiBhdHRyaWJ1dGUgYXMgYSBzdHJpbmcsIGZhbGxpbmcgYmFjayB0byBhIHNwZWNpZmllZCBkZWZhdWx0XG4gICAqL1xuICBnZXRBdHRyaWJ1dGUobmFtZTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IHN0cmluZyk6IHN0cmluZztcbiAgZ2V0QXR0cmlidXRlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBkZWZhdWx0VmFsdWU/OiBzdHJpbmcgfCBudW1iZXIsXG4gICk6IHN0cmluZyB8IG51bWJlciB8IG51bGwge1xuICAgIGNvbnN0IHZhbHVlID0gSFRNTEVsZW1lbnQucHJvdG90eXBlLmdldEF0dHJpYnV0ZS5jYWxsKHRoaXMsIG5hbWUpO1xuXG4gICAgaWYgKGRlZmF1bHRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkZWZhdWx0VmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJzZWQgPSBOdW1iZXIodmFsdWUpO1xuXG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKHBhcnNlZCkpIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICB9XG5cbiAgICAvLyBJbnZhbGlkIGZ1bmN0aW9uIGludm9jYXRpb25cbiAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5JTlZBTElEX0NBTExTSVRFKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZSBvbiB0aGlzIGVsZW1lbnQgaWYgdGhlIHByb3ZpZGVkIHZhbHVlXG4gICAqIGRpZmZlcnMgZnJvbSB0aGUgYXR0cmlidXRlIHdoZW4gc2VyaWFsaXplZFxuICAgKi9cbiAgcmVmbGVjdEF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuZ2V0QXR0cmlidXRlKG5hbWUpO1xuICAgIGNvbnN0IHJlZmxlY3RlZCA9IHNlcmlhbGl6ZUF0dHJpYnV0ZSh2YWx1ZSk7XG5cbiAgICBpZiAoY3VycmVudCAhPT0gcmVmbGVjdGVkKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCByZWZsZWN0ZWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgdGhpcyBlbGVtZW50IHRvIGEgc3RyaW5nXG4gICAqL1xuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgdGFnTmFtZSwgbmFtZSB9ID0gdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgQ29tcG9uZW50O1xuICAgIGNvbnN0IGNvbXB1dGVkTmFtZSA9IHRhZ05hbWUgPT09IFwiXCIgPyBuYW1lIDogdGFnTmFtZTtcbiAgICBjb25zdCBhdHRyU3RyaW5nID0gdGhpcy5nZXRBdHRyaWJ1dGVOYW1lcygpXG4gICAgICAubWFwKChhdHRyTmFtZSkgPT4ge1xuICAgICAgICBjb25zdCB2YWwgPSB0aGlzLmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7XG4gICAgICAgIHJldHVybiB2YWwgPyBgJHthdHRyTmFtZX09XCIke3ZhbH1cImAgOiBcIlwiO1xuICAgICAgfSlcbiAgICAgIC5qb2luKFwiIFwiKTtcbiAgICBjb25zdCBhdHRycyA9IGF0dHJTdHJpbmcubGVuZ3RoID4gMCA/IGAgJHthdHRyU3RyaW5nfWAgOiBcIlwiO1xuICAgIHJldHVybiBgPCR7Y29tcHV0ZWROYW1lfSR7YXR0cnN9PjwvJHtjb21wdXRlZE5hbWV9PmA7XG4gIH1cbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5cbmltcG9ydCB7IEVycm9yQ29kZSwgUGFsZXR0ZUVycm9yIH0gZnJvbSBcIiNlcnJvclwiO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7XG4gIEF0dHJpYnV0ZU1hcCxcbiAgQ29tcG9uZW50U3R5bGVzLFxuICBDb21wdXRlZFByb3BlcnRpZXMsXG4gIExpdmVBdHRyaWJ1dGVzLFxuICBTdGF0ZUluaXRpYWxpemVyLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG5jb25zdCBCTEFOS19URU1QTEFURSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcblxuZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnRTaG9ydGhhbmQ8U3RhdGVTaGFwZSBleHRlbmRzIG9iamVjdCA9IHt9PiB7XG4gIC8qKlxuICAgKiBBbiBIVE1MIFRlbXBsYXRlIGVsZW1lbnQgZm9yIHRoaXMgZWxlbWVudCB0byB1c2UuXG4gICAqL1xuICB0ZW1wbGF0ZT86IEhUTUxUZW1wbGF0ZUVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIEEge0BsaW5rIENTU1N0eWxlU2hlZXR9IGFycmF5IHRvIGFkb3B0IHRvIHRoZSBlbGVtZW50J3Mgc2hhZG93IERPTVxuICAgKi9cbiAgc3R5bGVzPzogQ29tcG9uZW50U3R5bGVzO1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kZSBmb3IgdGhpcyBDb21wb25lbnQncyBTaGFkb3dSb290LlxuICAgKlxuICAgKiAtIGBcIm9wZW5cImAgYWxsb3dzIEpTIGFjY2VzcyB0byB0aGUgY2hpbGRyZW4gb2YgdGhpcyBjb21wb25lbnRcbiAgICogLSBgXCJjbG9zZWRcImAgKGRlZmF1bHQpIGRpc2FsbG93cyBpbnRlcm5hbCBKUyBhY2Nlc3NcbiAgICovXG4gIHNoYWRvd1Jvb3RNb2RlPzogXCJjbG9zZWRcIiB8IFwib3BlblwiO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5pdGlhbCBzdGF0ZSBmb3IgdGhpcyBDb21wb25lbnQncyByZWFjdGl2ZSBpbnRlcm5hbCBzdGF0ZSwgaWYgYW55LlxuICAgKi9cbiAgaW5pdGlhbFN0YXRlPzogU3RhdGVJbml0aWFsaXplcjxTdGF0ZVNoYXBlPjtcblxuICAvKipcbiAgICogQW4gb2JqZWN0IG9yIGZ1bmN0aW9uIHJldHVybmluZyBhbiBvYmplY3Qgd2hpY2ggcG9wdWxhdGVzIHRoZSBgZGF0YWAgdmFsdWVzXG4gICAqIGluIHRoZSB0ZW1wbGF0aW5nIGVuZ2luZS4gU3VjaCB2YWx1ZXMgYXJlIGFjY2Vzc2VkIHVzaW5nIHRoZSBgKmAgbm90YXRpb24uXG4gICAqL1xuICBjb21wdXRlZFByb3BlcnRpZXM/OiBDb21wdXRlZFByb3BlcnRpZXM8U3RhdGVTaGFwZT47XG5cbiAgLyoqXG4gICAqIERlY2xhcmF0aW9uIG9mIGF0dHJpYnV0ZSBiZWhhdmlvcnMgZHVyaW5nIHVwZGF0ZXMuXG4gICAqL1xuICBsaXZlQXR0cmlidXRlcz86IExpdmVBdHRyaWJ1dGVzPFN0YXRlU2hhcGU+O1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXphdGlvbiBzY3JpcHRpbmcgZm9yIHRoaXMgQ29tcG9uZW50XG4gICAqL1xuICBzY3JpcHQ/OiAodGhpczogQ29tcG9uZW50PFN0YXRlU2hhcGU+KSA9PiBWb2lkRnVuY3Rpb24gfCB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgaW1tZWRpYXRlbHkgYmVmb3JlIGVhY2ggdGVtcGxhdGUgdXBkYXRlXG4gICAqL1xuICBiZWZvcmVVcGRhdGU/OiAodGhpczogQ29tcG9uZW50PFN0YXRlU2hhcGU+KSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZWFjaCB0ZW1wbGF0ZSB1cGRhdGVcbiAgICovXG4gIGFmdGVyVXBkYXRlPzogKFxuICAgIHRoaXM6IENvbXBvbmVudDxTdGF0ZVNoYXBlPixcbiAgICBwcmV2aW91c0F0dHJpYnV0ZXM6IEF0dHJpYnV0ZU1hcCxcbiAgKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgYXMgdGhlIGZpbmFsIGxpZmVjeWNsZSBtZXRob2QgYXQgdGhlIGVuZCBvZiB0aGUgdW5tb3VudGluZyBwcm9jZXNzLlxuICAgKi9cbiAgZmluYWxpemU/OiAodGhpczogQ29tcG9uZW50PFN0YXRlU2hhcGU+KSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBJZiBkZWZpbmVkLCByZWNlaXZlcyBlcnJvcnMgY2F1Z2h0IGR1cmluZyB0aGUgbGlmZWN5Y2xlIG1ldGhvZHMgb2YgdGhpc1xuICAgKiBjb21wb25lbnQgYW5kIGl0J3MgY2hpbGRyZW4uIElmIG5vdCBkZWZpbmVkLCB0aGlzIGNvbXBvbmVudCB3aWxsIGluc3RlYWRcbiAgICogdGhyb3cgZXJyb3JzIGFzIHRoZXkgYXJlIGZvdW5kLlxuICAgKi9cbiAgb25FcnJvcj86ICh0aGlzOiBDb21wb25lbnQ8U3RhdGVTaGFwZT4sIGVycm9yOiB1bmtub3duKSA9PiB2b2lkO1xufVxuXG5mdW5jdGlvbiBkZWZpbmVGcm9tQ2xhc3M8U3RhdGVTaGFwZSBleHRlbmRzIG9iamVjdCA9IHt9PihcbiAgY2xzOiB0eXBlb2YgQ29tcG9uZW50PFN0YXRlU2hhcGU+LFxuICB0YWdOYW1lPzogc3RyaW5nLFxuKSB7XG4gIC8vIFNldCB0aGUgdGFnTmFtZSBzdGF0aWMgaWYgaXRzIG5vdCBhbHJlYWR5IHNldFxuICBpZiAodGFnTmFtZSAmJiBjbHMudGFnTmFtZSA9PT0gXCJcIikge1xuICAgIGNscy50YWdOYW1lID0gdGFnTmFtZTtcbiAgfVxuXG4gIGlmIChfX0RFVl9fKSB7XG4gICAgaWYgKHRhZ05hbWUgJiYgdGFnTmFtZSAhPT0gY2xzLnRhZ05hbWUpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtDT01QT05FTlRdIENvbXBvbmVudCAke2Nscy5uYW1lfSB3YXMgZGVmaW5lZCB3aXRoIHRhZ25hbWUgJHt0YWdOYW1lfSBgICtcbiAgICAgICAgICBgd2hpY2ggZG9lcyBub3QgbWF0Y2ggaXRzIHN0YXRpYyB0YWdOYW1lIHByb3BlcnR5YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgd2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZShcbiAgICBjbHMudGFnTmFtZSxcbiAgICBjbHMgYXMgdW5rbm93biBhcyBDdXN0b21FbGVtZW50Q29uc3RydWN0b3IsXG4gICk7XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYSBQYWxldHRlIENvbXBvbmVudCBhcyBhIGN1c3RvbSBlbGVtZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmU8Q2xzIGV4dGVuZHMgdHlwZW9mIENvbXBvbmVudDxhbnk+PihkZWZpbml0aW9uOiBDbHMpOiBDbHM7XG5cbi8qKlxuICogUmVnaXN0ZXIgYSBQYWxldHRlIENvbXBvbmVudCBhcyBhIGN1c3RvbSBlbGVtZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmU8Q2xzIGV4dGVuZHMgdHlwZW9mIENvbXBvbmVudDxhbnk+PihcbiAgdGFnTmFtZTogc3RyaW5nLFxuICBkZWZpbml0aW9uOiBDbHMsXG4pOiBDbHM7XG5cbi8qKlxuICogRGVmaW5lIGEgUGFsZXR0ZSBDb21wb25lbnQgdXNpbmcgdGhlIHNob3J0aGFuZCBzeW50YXhcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGRlZmluZShcIm15LWNvbXBvbmVudFwiLCB7XG4gKiAgIHRlbXBsYXRlOiBodG1sYC4uLmAsXG4gKiAgIHN0eWxlczogY3NzYC4uLmAsXG4gKiAgIGluaXRpYWxTdGF0ZTogeyAuLi4gfSxcbiAqICAgY29tcHV0ZWRQcm9wZXJ0aWVzKCkgeyAuLi4gfSxcbiAqICAgc2NyaXB0KCkgeyAuLi4gfSxcbiAqICAgLy8gYW5kIGFueSBvdGhlciBsaWZlY3ljbGUgbWV0aG9kc1xuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZTxTdGF0ZVNoYXBlIGV4dGVuZHMgb2JqZWN0ID0ge30+KFxuICB0YWdOYW1lOiBzdHJpbmcsXG4gIGRlZmluaXRpb246IENvbXBvbmVudFNob3J0aGFuZDxTdGF0ZVNoYXBlPixcbik6IHR5cGVvZiBDb21wb25lbnQ8U3RhdGVTaGFwZT47XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmU8U3RhdGVTaGFwZSBleHRlbmRzIG9iamVjdCA9IHt9PihcbiAgYTogc3RyaW5nIHwgdHlwZW9mIENvbXBvbmVudDxTdGF0ZVNoYXBlPixcbiAgYj86IENvbXBvbmVudFNob3J0aGFuZDxTdGF0ZVNoYXBlPiB8IHR5cGVvZiBDb21wb25lbnQ8U3RhdGVTaGFwZT4sXG4pOiB0eXBlb2YgQ29tcG9uZW50PFN0YXRlU2hhcGU+IHtcbiAgLy8gSGFuZGxlIGNvbXBvbmVudCBjbGFzcyBwYXRoc1xuICBpZiAodHlwZW9mIGEgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGRlZmluZUZyb21DbGFzcyhhKTtcbiAgICByZXR1cm4gYTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgYSA9PT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgYiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgZGVmaW5lRnJvbUNsYXNzKGIsIGEpO1xuICAgIHJldHVybiBiO1xuICB9XG5cbiAgaWYgKGIgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLklOVkFMSURfQ0FMTFNJVEUpO1xuICB9XG5cbiAgLy8gSGFuZGxlIHNob3J0aGFuZFxuICBjb25zdCB0YWdOYW1lID0gYTtcbiAgY29uc3QgZGVmaW5pdGlvbiA9IGI7XG5cbiAgLy8gQ29tcG9uZW50IGNvbnN0cnVjdG9ycyBhcmUgZnVuY3Rpb25zIC0+IERlZmluZSB0aGVtIHdpdGggdGhlaXIgdGFnbmFtZSBpZiBwcmVzZW50XG4gIGlmICh0eXBlb2YgZGVmaW5pdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgLy8gU2V0IHRoZSB0YWdOYW1lIHN0YXRpYyBpZiBpdHMgbm90IGFscmVhZHkgc2V0XG4gICAgaWYgKGRlZmluaXRpb24udGFnTmFtZSA9PT0gXCJcIikge1xuICAgICAgZGVmaW5pdGlvbi50YWdOYW1lID0gdGFnTmFtZTtcbiAgICB9XG5cbiAgICBpZiAoX19ERVZfXykge1xuICAgICAgaWYgKHRhZ05hbWUgIT09IGRlZmluaXRpb24udGFnTmFtZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtDT01QT05FTlRdIENvbXBvbmVudCAke2RlZmluaXRpb24ubmFtZX0gd2FzIGRlZmluZWQgd2l0aCB0YWduYW1lICR7dGFnTmFtZX0gYCArXG4gICAgICAgICAgICBgd2hpY2ggZG9lcyBub3QgbWF0Y2ggaXRzIHN0YXRpYyB0YWdOYW1lIHByb3BlcnR5YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKFxuICAgICAgdGFnTmFtZSxcbiAgICAgIGRlZmluaXRpb24gYXMgdW5rbm93biBhcyBDdXN0b21FbGVtZW50Q29uc3RydWN0b3IsXG4gICAgKTtcbiAgICByZXR1cm4gZGVmaW5pdGlvbjtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICAvLyBDb25maWdcbiAgICB0ZW1wbGF0ZSA9IEJMQU5LX1RFTVBMQVRFLFxuICAgIHN0eWxlcyA9IFtdLFxuICAgIHNoYWRvd1Jvb3RNb2RlID0gXCJjbG9zZWRcIixcbiAgICBpbml0aWFsU3RhdGUsXG4gICAgY29tcHV0ZWRQcm9wZXJ0aWVzID0ge30sXG4gICAgbGl2ZUF0dHJpYnV0ZXMgPSB7fSxcblxuICAgIC8vIExpZmVjeWNsZVxuICAgIHNjcmlwdCxcbiAgICBiZWZvcmVVcGRhdGUsXG4gICAgYWZ0ZXJVcGRhdGUsXG4gICAgZmluYWxpemUsXG4gICAgb25FcnJvcixcbiAgfSA9IGRlZmluaXRpb247XG5cbiAgY29uc3QgZnVsbE9ic2VydmVkQXR0cmlidXRlcyA9IEFycmF5LmZyb20oXG4gICAgbmV3IFNldChbLi4uT2JqZWN0LmtleXMobGl2ZUF0dHJpYnV0ZXMpXSksXG4gICk7XG5cbiAgY29uc3QgY2xzID0gY2xhc3MgZXh0ZW5kcyBDb21wb25lbnQ8U3RhdGVTaGFwZT4ge1xuICAgIHN0YXRpYyB0YWdOYW1lID0gdGFnTmFtZTtcbiAgICBzdGF0aWMgdGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICBzdGF0aWMgc3R5bGVzID0gc3R5bGVzO1xuICAgIHN0YXRpYyBvYnNlcnZlZEF0dHJpYnV0ZXMgPSBbLi4uZnVsbE9ic2VydmVkQXR0cmlidXRlc107XG4gICAgc3RhdGljIHNoYWRvd1Jvb3RNb2RlID0gc2hhZG93Um9vdE1vZGU7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIHN1cGVyKCk7XG5cbiAgICAgIHRoaXMuaW5pdGlhbFN0YXRlID1cbiAgICAgICAgdHlwZW9mIGluaXRpYWxTdGF0ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBpbml0aWFsU3RhdGUuYmluZCh0aGlzKVxuICAgICAgICAgIDogaW5pdGlhbFN0YXRlO1xuICAgICAgdGhpcy5jb21wdXRlZFByb3BlcnRpZXMgPVxuICAgICAgICB0eXBlb2YgY29tcHV0ZWRQcm9wZXJ0aWVzID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IGNvbXB1dGVkUHJvcGVydGllcy5iaW5kKHRoaXMpXG4gICAgICAgICAgOiBjb21wdXRlZFByb3BlcnRpZXM7XG4gICAgICB0aGlzLmxpdmVBdHRyaWJ1dGVzID0gbGl2ZUF0dHJpYnV0ZXM7XG5cbiAgICAgIGZvciAoY29uc3QgZGVmIG9mIE9iamVjdC52YWx1ZXModGhpcy5saXZlQXR0cmlidXRlcykpIHtcbiAgICAgICAgaWYgKGRlZi5vbkNoYW5nZSkge1xuICAgICAgICAgIGRlZi5vbkNoYW5nZSA9IGRlZi5vbkNoYW5nZS5iaW5kKHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlZi5yZWZsZWN0KSB7XG4gICAgICAgICAgZGVmLnJlZmxlY3QgPSBkZWYucmVmbGVjdC5iaW5kKHRoaXMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2NyaXB0ID0gc2NyaXB0Py5iaW5kKHRoaXMpID8/IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuYmVmb3JlVXBkYXRlID0gYmVmb3JlVXBkYXRlPy5iaW5kKHRoaXMpID8/IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuYWZ0ZXJVcGRhdGUgPSBhZnRlclVwZGF0ZT8uYmluZCh0aGlzKSA/PyB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmZpbmFsaXplID0gZmluYWxpemU/LmJpbmQodGhpcykgPz8gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5vbkVycm9yID0gb25FcnJvcj8uYmluZCh0aGlzKSA/PyB1bmRlZmluZWQ7XG4gICAgfVxuICB9O1xuXG4gIGN1c3RvbUVsZW1lbnRzLmRlZmluZSh0YWdOYW1lLCBjbHMpO1xuICByZXR1cm4gY2xzO1xufVxuIiwKICAgICJpbXBvcnQgeyBmcmFnbWVudENhY2hlIH0gZnJvbSBcIiN1dGlsXCI7XG5pbXBvcnQgeyBjb21waWxlZFRlbXBsYXRlQ2FjaGUgfSBmcm9tIFwiLi90ZW1wbGF0ZS9jb21waWxlXCI7XG5pbXBvcnQgeyBwYXJzZWROb3RhdGlvbkNhY2hlLCB2YWx1ZUFjY2Vzc29yQ2FjaGUgfSBmcm9tIFwiLi90ZW1wbGF0ZS9zeW50YXhcIjtcblxuaWYgKF9fREVWX18gJiYgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAod2luZG93IGFzIGFueSkuX19QQUxFVFRFX0RFVlRPT0xTX18gPSB7XG4gICAgZHVtcENhY2hlTWV0cmljczogKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIFwiQ29tcGlsZWQgVGVtcGxhdGVzIENhY2hlXCIsXG4gICAgICAgIGNvbXBpbGVkVGVtcGxhdGVDYWNoZS5nZXRNZXRyaWNzKCksXG4gICAgICApO1xuICAgICAgY29uc29sZS5sb2coXCJIVE1MIEZyYWdtZW50cyBDYWNoZVwiLCBmcmFnbWVudENhY2hlLmdldE1ldHJpY3MoKSk7XG4gICAgICBjb25zb2xlLmxvZyhcIk5vdGF0aW9uIEFjY2Vzc29yIENhY2hlXCIsIHZhbHVlQWNjZXNzb3JDYWNoZS5nZXRNZXRyaWNzKCkpO1xuICAgICAgY29uc29sZS5sb2coXCJQYXJzZWQgTm90YXRpb25zIENhY2hlXCIsIHBhcnNlZE5vdGF0aW9uQ2FjaGUuZ2V0TWV0cmljcygpKTtcbiAgICB9LFxuICB9O1xufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIjtBQStDQSxTQUFTLFdBQVcsQ0FBQyxNQUFpQjtBQUFBLEVBQ3BDLE1BQU0saUJBQTRDO0FBQUEsS0FDL0Msb0JBQXNCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQU10QixzQkFBd0I7QUFBQTtBQUFBO0FB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VyxJQUFJLFNBQVMsS0FBSyxJQUFJO0FBQUEsUUFDdkM7QUFBQSxRQUVBLElBQUksSUFBSSxTQUFTO0FBQUEsVUFDZixJQUFJLFVBQVUsSUFBSSxRQUFRLEtBQUssSUFBSTtBQUFBLFFBQ3JDO0FBQUEsTUFDRjtBQUFBLE1BRUEsS0FBSyxTQUFTLFFBQVEsS0FBSyxJQUFJLEtBQUs7QUFBQSxNQUNwQyxLQUFLLGVBQWUsY0FBYyxLQUFLLElBQUksS0FBSztBQUFBLE1BQ2hELEtBQUssY0FBYyxhQUFhLEtBQUssSUFBSSxLQUFLO0FBQUEsTUFDOUMsS0FBSyxXQUFXLFVBQVUsS0FBSyxJQUFJLEtBQUs7QUFBQSxNQUN4QyxLQUFLLFVBQVUsU0FBUyxLQUFLLElBQUksS0FBSztBQUFBO0FBQUEsRUFFMUM7QUFBQSxFQUVBLGVBQWUsT0FBTyxTQUFTLEdBQUc7QUFBQSxFQUNsQyxPQUFPO0FBQUE7O0FDcFBULElBQWUsT0FBTyxXQUFXLGFBQWE7QUFBQSxFQUMzQyxPQUFlLHVCQUF1QjtBQUFBLElBQ3JDLGtCQUFrQixNQUFNO0FBQUEsTUFDdEIsUUFBUSxJQUNOLDRCQUNBLHNCQUFzQixXQUFXLENBQ25DO0FBQUEsTUFDQSxRQUFRLElBQUksd0JBQXdCLGNBQWMsV0FBVyxDQUFDO0FBQUEsTUFDOUQsUUFBUSxJQUFJLDJCQUEyQixtQkFBbUIsV0FBVyxDQUFDO0FBQUEsTUFDdEUsUUFBUSxJQUFJLDBCQUEwQixvQkFBb0IsV0FBVyxDQUFDO0FBQUE7QUFBQSxFQUUxRTtBQUNGOyIsCiAgImRlYnVnSWQiOiAiODZCNUE5MUZCQjBBODIwRDY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
2039
+ //# debugId=D9A90808356EA17464756E2164756E21
2040
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2Vycm9ycy50cyIsICJzcmMvc3RhdGUvc3RhdGUudHMiLCAic3JjL3V0aWwvbHJ1LWNhY2hlLnRzIiwgInNyYy91dGlsL2ZyYWdtZW50cy50cyIsICJzcmMvdXRpbC9hdHRyaWJ1dGVzLnRzIiwgInNyYy91dGlsL2VsZW1lbnQtbWF0Y2gudHMiLCAic3JjL3V0aWwvZG9tLnRzIiwgInNyYy90ZW1wbGF0ZS9jb25zdGFudC50cyIsICJzcmMvdGVtcGxhdGUvc3ludGF4LnRzIiwgInNyYy90ZW1wbGF0ZS91dGlsLnRzIiwgInNyYy90ZW1wbGF0ZS9jb21waWxlLnRzIiwgInNyYy9oZWxwZXIvY3NzLnRzIiwgInNyYy9oZWxwZXIvaHRtbC50cyIsICJzcmMvdGVtcGxhdGUvam9icy9jb21tb24udHMiLCAic3JjL3RlbXBsYXRlL2pvYnMvYXR0cmlidXRlLnRzIiwgInNyYy90ZW1wbGF0ZS9qb2JzL2NvbmRpdGlvbmFsLnRzIiwgInNyYy90ZW1wbGF0ZS9qb2JzL2xpc3QudHMiLCAic3JjL3RlbXBsYXRlL2pvYnMvc3dhcC50cyIsICJzcmMvdGVtcGxhdGUvam9icy90YWcudHMiLCAic3JjL3RlbXBsYXRlL2pvYnMvaW5kZXgudHMiLCAic3JjL3RlbXBsYXRlL3ByZXBhcmUudHMiLCAic3JjL3RlbXBsYXRlL3RlbXBsYXRlLnRzIiwgInNyYy90YXNrLXNjaGVkdWxlci50cyIsICJzcmMvY29tcG9uZW50L2RlbGVnYXRvci50cyIsICJzcmMvY29tcG9uZW50L2NvbXBvbmVudC50cyIsICJzcmMvY29tcG9uZW50L2ZhY3RvcnkudHMiLCAic3JjL2RldnRvb2xzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIi8qXG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuLyoqXG4gKiBQb3NzaWJsZSBlcnJvciB0eXBlcyBmb3Ige0BsaW5rIFBhbGV0dGVFcnJvcn1cbiAqXG4gKiBDb2RlcyBhcmUgY2F0ZWdvcml6ZWQgaW50byBncm91cHMgYnkgdGhlIDEwMCdzOlxuICpcbiAqIC0gMCAtIDk5OiBJbnZhcmlhbnRzXG4gKiAtIDEwMCAtIDE5OTogQ3VzdG9tIEVsZW1lbnRzIC8gRW52aXJvbm1lbnQgRXJyb3JzXG4gKiAtIDIwMCAtIDI5OTogVGVtcGxhdGluZyBFcnJvcnNcbiAqIC0gMzAwIC0gMzk5OiBSdW50aW1lIEVycm9yc1xuICovXG5leHBvcnQgY29uc3QgZW51bSBFcnJvckNvZGUge1xuICAvLyAwIC0gOTk6IEludmFyaWFudHNcbiAgSU5WQVJJQU5UID0gMCxcbiAgSU5WQUxJRF9FTlYgPSAxLFxuICBJTlZBTElEX0NBTExTSVRFID0gMixcbiAgTUlTU0lOR19OT0RFX1JFRiA9IDMsXG5cbiAgLy8gMTAwIC0gMTk5OiBDdXN0b20gRWxlbWVudHMgRXJyb3JzXG4gIElOVkFMSURfVEFHTkFNRSA9IDEwMCxcblxuICAvLyAyMDAgLSAyOTk6IFRlbXBsYXRlIEVycm9yc1xuICBURU1QTEFURV9JTlZBTElEX1ZBTFVFID0gMjAwLFxuICBURU1QTEFURV9JTlZBTElEX05PVEFUSU9OX1NZTlRBWCA9IDIwMSxcbiAgVEVNUExBVEVfTUlTU0lOR19OT1RBVElPTiA9IDIwMixcbiAgVEVNUExBVEVfSU5WQUxJRF9DT01QT05FTlQgPSAyMDMsXG4gIFRFTVBMQVRFX0lOVkFMSURfTElTVF9EQVRBID0gMjA0LFxuICBURU1QTEFURV9NSVNTSU5HX0xJU1RfS0VZID0gMjA1LFxuICBURU1QTEFURV9EVVBMSUNBVEVfTElTVF9LRVkgPSAyMDYsXG4gIFRFTVBMQVRFX0lOVkFMSURfQ09ORElUSU9OQUwgPSAyMDcsXG4gIFRFTVBMQVRFX0lOVkFMSURfS0VZX0RJUkVDVElWRSA9IDIwOCxcbiAgVEVNUExBVEVfUEFSRU5UX1JFUVVJUkVEID0gMjA5LFxuXG4gIC8vIDMwMCAtIDM5OTogUnVudGltZSBFcnJvcnNcbiAgTUlTU0lOR19FTEVNRU5UID0gMzAwLFxuICBNSVNTSU5HX1NUQVRFID0gMzAxLFxuICBJTlZBTElEX0NPTlRFTlQgPSAzMDIsXG4gIElOVkFMSURfU1RBVEVfS0VZID0gMzAzLFxuICBJTlZBTElEX1NUQVRFX1VQREFURSA9IDMwNCxcbiAgU1RBVEVfTE9DS0VEID0gMzA1LFxuICBNQVhfU0VRVUVOVElBTF9SRU5ERVJTID0gMzA2LFxufVxuXG5mdW5jdGlvbiBnZXREZXZFcnJvcihjb2RlOiBFcnJvckNvZGUpIHtcbiAgY29uc3QgREVWX0VSUk9SX0lORk86IFJlY29yZDxFcnJvckNvZGUsIHN0cmluZz4gPSB7XG4gICAgW0Vycm9yQ29kZS5JTlZBUklBTlRdOiBgXG5JTlZBUklBTlRcbkEgY29uZGl0aW9uIGhhcyBvY2N1cnJlZCB3aGljaCBzaG91bGQgbmV2ZXIgaGFwcGVuLCBzdWNoIGFzIGEgY29kZSBwYXRoIHRoYXRcbnNob3VsZG4ndCBiZSByZWFjaGFibGUgd2hlbiB1c2luZyBjb3JyZWN0IHR5cGVzLCBvciBhIGRpc2FsbG93ZWQgc3RhdGUuXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5JTlZBTElEX0VOVl06IGBcbklOVkFMSURfRU5WXG5GYWlsZWQgdG8gZmluZCBhIGN1c3RvbSBlbGVtZW50cyByZWdpc3RyeSBpbiB0aGlzIGVudmlyb25tZW50LiBJcyBhIHdpbmRvd1xuZ2xvYmFsIGF2YWlsYWJsZSB3aXRoIGEgY3VzdG9tRWxlbWVudHMgcHJvcGVydHk/XG5gLFxuICAgIFtFcnJvckNvZGUuSU5WQUxJRF9DQUxMU0lURV06IGBcbklOVkFMSURfQ0FMTFNJVEVcbkEgZnVuY3Rpb24gd2FzIGludm9rZWQgd2l0aCBhbiBpbnZhbGlkIHNldCBvZiBwYXJhbWV0ZXJzLiAgIFxuYCxcblxuICAgIFtFcnJvckNvZGUuSU5WQUxJRF9UQUdOQU1FXTogYFxuSU5WQUxJRF9UQUdOQU1FXG5GYWlsZWQgdG8gZGV0ZXJtaW5lIGEgdmFsaWQgSFRNTCBUYWcgdG8gdXNlIHdoZW4gcmVnaXN0ZXJpbmcgYSBjb21wb25lbnQgYXMgYVxuY3VzdG9tIGVsZW1lbnQuIFNwZWNpZnkgYSBzdGF0aWMgcmVhZG9ubHkgdGFnTmFtZSBwcm9wZXJ0eSBvbiB5b3VyIGNvbXBvbmVudFxuY2xhc3Mgb3IgcHJvdmlkZSBhIHRhZ05hbWUgYXJndW1lbnQgdG8gQ29tcG9uZW50LnJlZ2lzdGVyLlxuXG5BbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGRpcmVjdGx5IHJlZ2lzdGVyIHlvdXIgZWxlbWVudCBhcyB5b3Ugd291bGQgYW55IG90aGVyXG5IVE1MIGN1c3RvbSBlbGVtZW50OiBjdXN0b21FbGVtZW50cy5kZWZpbmUoXCJteS10YWdcIiwgTXlDb21wb25lbnRDbGFzcyk7XG5gLFxuXG4gICAgW0Vycm9yQ29kZS5NSVNTSU5HX0VMRU1FTlRdOiBgXG5NSVNTSU5HX0VMRU1FTlRcbkFuIGVsZW1lbnQgd2FzIGV4cGVjdGVkIHRvIGV4aXN0IGJ1dCB3YXMgbm90IGZvdW5kIHdoZW4gdGhlIERPTSB3YXMgcXVlcmllZC5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLk1JU1NJTkdfU1RBVEVdOiBgXG5NSVNTSU5HX1NUQVRFXG5BIENvbXBvbmVudCdzIHJlYWN0aXZlIHN0YXRlIHdhcyBhY2Nlc3NlZCwgYnV0IG5vIGluaXRpYWxTdGF0ZSBpcyBkZWZpbmVkIGZvclxudGhlIENvbXBvbmVudCdzIGNsYXNzLiBJbml0aWFsIHN0YXRlIG11c3QgYmUgZGVmaW5lZCBhcyBhbiBvYmplY3Qgb3IgZnVuY3Rpb24uXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5JTlZBTElEX0NPTlRFTlRdOiBgXG5JTlZBTElEX0NPTlRFTlRcblRyaWVkIHRvIHNldCBhIHZhbHVlIGFzIGNvbnRlbnQgaW4gYSB0ZW1wbGF0ZSwgYnV0IHRoZSB2YWx1ZSB3YXMgbm90IGEgc3VwcG9ydGVkXG50eXBlLiBWYWx1ZXMgbXVzdCBiZSBhIHN0cmluZywgSFRNTEVsZW1lbnQuXG5cbkluc3RlYWQsIGdvdCAlczogJXMuXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX1ZBTFVFXTogYFxuVEVNUExBVEVfSU5WQUxJRFxuVGhlIHZhbHVlICVzIGNhbm5vdCBiZSBpbnRlcnBvbGF0ZWQgdmlhIHRoZSBUZW1wbGF0ZSBodG1sIHN0cmluZyBoZWxwZXIuXG5WYWx1ZXMgbWF5IG9ubHkgYmUgSFRNTFRlbXBsYXRlRWxlbWVudHMgKHRlbXBsYXRlIGNvbnRlbnQgaXMgYWRvcHRlZCkgb3JcbnN0cmluZ3MgKHNob3J0aGFuZCBmb3IgYSA6OnN3YXAgZGlyZWN0aXZlIG9uIGFuIGVsZW1lbnQpXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX05PVEFUSU9OX1NZTlRBWF06IGBcblRFTVBMQVRFX0lOVkFMSURfTk9UQVRJT05cbkEgdGVtcGxhdGUgdmFsdWUgbm90YXRpb24gZmFpbGVkIHRvIHBhcnNlLiBOb3RhdGlvbnMgbXVzdCBiZWdpbiB3aXRoIG9uZSBvZlxuQCwgJCwgKiwgb3IgIywgZm9sbG93ZWQgYnkgYSBkb3Qtc2VwYXJhdGVkIHBhdGggb2YgYWNjZXNzb3IgbmFtZXMuIE9wdGlvbmFsbHksXG5ub3RhdGlvbnMgbWF5IGhhdmUgbW9kaWZpZXJzIHN1Y2ggYXMgdGhlICEgbW9kaWZpZXIuXG5cblRoZSBub3RhdGlvbiB0aGF0IGZhaWxlZCB0byBwYXJzZSB3YXMgXCIlc1wiXG5gLFxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9DT01QT05FTlRdOiBgXG5URU1QTEFURV9JTlZBTElEX0NPTVBPTkVOVFxuRmFpbGVkIHRvIGludGVycG9sYXRlIGEgQ29tcG9uZW50IGluIGFuIGh0bWwgdGVtcGxhdGUgc3RyaW5nIGR1ZSB0byB0aGVcbkNvbXBvbmVudCBoYXZpbmcgYW4gaW52YWxpZCB0YWdOYW1lIHByb3BlcnR5LlxuXG5Db21wb25lbnQgXCIlc1wiIGhhcyBhbiBpbnZhbGlkIHRhZ05hbWUgcHJvcGVydHkgXCIlc1wiXG4gICAgYCxcblxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9MSVNUX0RBVEFdOiBgXG5URU1QTEFURV9JTlZBTElEX0xJU1RcbkEgdGVtcGxhdGUgZmFpbGVkIHRvIHJlbmRlciBiZWNhdXNlIGFuIDo6ZWFjaCBkaXJlY3RpdmUgZmV0Y2hlZCBhIHZhbHVlIHdoaWNoXG53YXMgbm90IGFuIGFycmF5IG9mIGFjdGlvbmFibGUgZGF0YS5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLk1JU1NJTkdfTk9ERV9SRUZdOiBgXG5URU1QTEFURV9JTlZBTElEX05PREVfUkVGXG5BIHRlbXBsYXRlIGZhaWxlZCB0byBwcmVwYXJlIGEgbm9kZSBmcm9tIGEgY29tcGlsZWQgc291cmNlLiBUeXBpY2FsbHksIHRoaXNcbm1lYW5zIHNvbWV0aGluZyBpcyBicm9rZW4gd2l0aGluIHRoZSBjb21waWxlZCB0ZW1wbGF0ZSByYXRoZXIgdGhhbiBhbiBlcnJvciB3aXRoXG50aGUgdGVtcGxhdGUgY29udGVudCBpdHNlbGYuXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5URU1QTEFURV9NSVNTSU5HX0xJU1RfS0VZXTogYFxuVEVNUExBVEVfTUlTU0lOR19MSVNUX0tFWVxuQSB0ZW1wbGF0ZSBmYWlsZWQgdG8gY29tcGlsZSBiZWNhdXNlIGFuIDo6ZWFjaCBkaXJlY3RpdmUgd2FzIGZvdW5kIG9uIGFuIGVsZW1lbnRcbndpdGhvdXQgYSBjb3JyZXNwb25kaW5nIDo6a2V5IGRpcmVjdGl2ZS4gOjplYWNoIGRpcmVjdGl2ZXMgbXVzdCBoYXZlIGEgOjprZXlcbmRpcmVjdGl2ZSBzcGVjaWZpZWQgb24gdGhlIHNhbWUgZWxlbWVudCwgd2hvc2Ugbm90YXRpb24gZXZhbHVhdGVzIHRvIGEgdW5pcXVlXG52YWx1ZSBmb3IgZWFjaCBpdGVtIGluIHRoZSBsaXN0LlxuXG5FeGFtcGxlOiA8bGkgOjplYWNoPVwiJGl0ZW1zXCIgOjprZXk9XCIjaWRcIj4gLi4uIDwvbGk+XG5gLFxuXG4gICAgW0Vycm9yQ29kZS5URU1QTEFURV9EVVBMSUNBVEVfTElTVF9LRVldOiBgXG5URU1QTEFURV9EVVBMSUNBVEVfTElTVF9LRVlcbkEgbGlzdCBmYWlsZWQgdG8gcmVuZGVyIGJlY2F1c2UgaXRlbSBrZXkgJXMgYXBwZWFyZWQgbXVsdGlwbGUgdGltZXMgd2hlblxucmVzb2x2aW5nIGxpc3QgaXRlbSBrZXlzLiBFYWNoIDo6a2V5IGRpcmVjdGl2ZSBtdXN0IHJlZmVyZW5jZSBhIG5vdGF0aW9uIHdob3NlXG52YWx1ZSBpcyB1bmlxdWUgZm9yIGVhY2ggbGlzdCBpdGVtLlxuYCxcblxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9DT05ESVRJT05BTF06IGBcblRFTVBMQVRFX0lOVkFMSURfQ09ORElUSU9OQUxcbkEgdGVtcGxhdGUgZmFpbGVkIHRvIGNvbXBpbGUgZHVlIHRvIGFuIGludmFsaWQgdXNlIG9mIGNvbmRpdGlvbmFsIGRpcmVjdGl2ZXMuXG5cbkNvbmRpdGlvbmFsIGVsZW1lbnRzIG11c3QgYmUgc2libGluZ3MuIFRoZSBmaXJzdCBjb25kaXRpb25hbCBicmFuY2ggbXVzdCB1c2UgYW5cbjo6aWYgZGlyZWN0aXZlLCBmb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUgOjplbHNlLWlmIGRpcmVjdGl2ZXMsIGFuZCBmaW5hbGx5IHplcm9cbm9yIG9uZSA6OmVsc2UgZGlyZWN0aXZlLlxuXG46OmlmIGFuZCA6OmVsc2UtaWYgZGlyZWN0aXZlcyBtdXN0IHNwZWNpZnkgYSBub3RhdGlvbiB0byBldmFsdWF0ZS4gOjplbHNlIGRvZXNcbm5vdCB0YWtlIGFueSB2YWx1ZXMgYW5kIGlzIGp1c3QgYSBiaW5hcnkgYXR0cmlidXRlLlxuYCxcblxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfTUlTU0lOR19OT1RBVElPTl06IGBcblRFTVBMQVRFX01JU1NJTkdfTk9UQVRJT05cbkEgdGVtcGxhdGUgZmFpbGVkIHRvIGNvbXBpbGUgYmVjYXVzZSBhICVzIGRpcmVjdGl2ZSBkaWQgbm90IGhhdmUgYW4gYXNzb2NpYXRlZFxubm90YXRpb24gZGVzcGl0ZSByZXF1aXJpbmcgb25lLlxuYCxcblxuICAgIFtFcnJvckNvZGUuSU5WQUxJRF9TVEFURV9LRVldOiBgXG5JTlZBTElEX1NUQVRFX0tFWVxuVHJpZWQgdG8gYWNjZXNzIGEgc3RhdGUgcHJvcGVydHkgd2hpY2ggZG9lcyBub3QgZXhpc3RcblxuS2V5IHBhdGg6ICVzXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5JTlZBTElEX1NUQVRFX1VQREFURV06IGBcbklOVkFMSURfU1RBVEVfVVBEQVRFXG5BIENvbXBvbmVudCdzIHNldFN0YXRlKCkgd2FzIGNhbGxlZCB3aXRoIGEgdmFsdWUgd2hpY2ggY291bGQgbm90IGJlIHBhdGNoZWQgaW5cbnRvIHRoZSBleGlzdGluZyBjb21wb25lbnQgc3RhdGUuXG5cbnNldFN0YXRlKCkgdGFrZXMgYSBwYXJ0aWFsIG9iamVjdCBkZXNjcmliaW5nIHN0YXRlIGtleXMgdG8gdXBkYXRlLlxuXG5JbnN0ZWFkLCByZWNlaXZlZDogJXNcbmAsXG5cbiAgICBbRXJyb3JDb2RlLlNUQVRFX0xPQ0tFRF06IGBcblNUQVRFX0xPQ0tFRFxuQSBTdGF0ZSByZWNlaXZlZCBhIHJlcXVlc3QgdG8gdXBkYXRlIG9yIGxvY2sgd2hpbGUgYWxyZWFkeSBsb2NrZWQuXG5TdGF0ZXMgbWF5IGJlIGxvY2tlZCB1c2luZyB0aGUgLmxvY2soKSBtZXRob2QgYW5kIHVubG9ja2VkIHVzaW5nIHRoZSAudW5sb2NrKClcbm1ldGhvZC4gU3RhdGVzIGxvY2sgZHVyaW5nIGFzeW5jIG11dGF0aW9ucyBkb25lIHRocm91Z2ggdGhlIC5tdXRhdGVBc3luYygpXG5tZXRob2QgaWYgXCJ0cnVlXCIgaXMgcGFzc2VkIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyLlxuXG5Zb3UgY2FuIGNoZWNrIHRoZSBsb2NrIHN0YXR1cyBvZiBhIFN0YXRlIGluc3RhbmNlIHdpdGggLmlzTG9ja2VkXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5NQVhfU0VRVUVOVElBTF9SRU5ERVJTXTogYFxuTUFYX1NFUVVFTlRJQUxfUkVOREVSU1xuQSBjb21wb25lbnQgaGFzIGVycm9yZWQgYWZ0ZXIgcmUtcmVuZGVyaW5nIG1vcmUgdGhhbiAlcyB0aW1lcyBpbiB0aGUgc2FtZSBmcmFtZS5cblxuVGhpcyB0eXBpY2FsbHkgaGFwcGVucyBiZWNhdXNlIHN0YXRlIG9yIGxpdmUgYXR0cmlidXRlcyBhcmUgYmVpbmcgbW9kaWZpZWRcbmR1cmluZyBhIHJlbmRlciBsaWZlY3ljbGUgbWV0aG9kIHN1Y2ggYXMgYmVmb3JlVXBkYXRlKCkgb3IgYWZ0ZXJVcGRhdGUoKS4gSWZcbnN0YXRlIGNoYW5nZXMgdW5jb25kaXRpb25hbGx5IGR1cmluZyBhIHJlbmRlciwgdGhlIHJlbmRlciB3aWxsIGluZmluaXRlbHkgbG9vcC5cblVwZGF0aW5nIHJlbmRlciBzb3VyY2UgZGF0YSBkdXJpbmcgYSByZW5kZXIgY3ljbGUgaXMgc3VwcG9ydGVkLCBidXQgaW5maW5pdGVcbnVwZGF0ZSBsb29wcyBtYXkgb2NjdXIgaWYgdW5jaGVja2VkLlxuYCxcblxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9LRVlfRElSRUNUSVZFXTogYFxuVEVNUExBVEVfSU5WQUxJRF9LRVlfRElSRUNUSVZFXG5BIHRlbXBsYXRlIGZhaWxlZCB0byBjb21waWxlIGJlY2F1c2UgYSA6OmtleSBkaXJlY3RpdmUgd2FzIGZvdW5kIG9uIGFuIGVsZW1lbnRcbndpdGggbm8gYXNzb2NpYXRlZCA6OmVhY2ggZGlyZWN0aXZlLiA6OmtleSBkaXJlY3RpdmVzIGNhbiBvbmx5IGJlIHVzZWQgaW5cbmFzc29jaWF0aW9uIHdpdGggbGlzdCByZW5kZXJpbmcgdmlhIDo6ZWFjaC5cbmAsXG4gICAgW0Vycm9yQ29kZS5URU1QTEFURV9QQVJFTlRfUkVRVUlSRURdOiBgXG5URU1QTEFURV9QQVJFTlRfUkVRVUlSRURcbkEgdGVtcGxhdGUgZmFpbGVkIHRvIGNvbXBpbGUgZHVlIHRvIGFuIGVsZW1lbnQgd2hpY2ggcmVxdWlyZXMgYSBwYXJlbnQgaGF2aW5nXG5ubyBhdmFpbGFibGUgcGFyZW50IGluIHRoZSB0ZW1wbGF0ZS5cblxuOjplYWNoIGFuZCA6OmlmLzo6ZWxzZS1pZi86OmVsc2UgZWxlbWVudHMgbXVzdCBoYXZlIGEgcGFyZW50IG5vZGUuXG5gLFxuICB9O1xuXG4gIHJldHVybiBERVZfRVJST1JfSU5GT1tjb2RlXTtcbn1cblxuLyoqXG4gKiBBbiBlcnJvciBvcmlnaW5hdGluZyBmcm9tIHdpdGhpbiBhIFBhbGV0dGUgc3Vic3lzdGVtLlxuICpcbiAqIEluIHRoZSBgZGV2ZWxvcG1lbnRgIGVudmlyb25tZW50LCB0aGUgZXJyb3Igd2lsbCBzdXJmYWNlIHdpdGggZXh0ZW5kZWQgaW5mb1xuICogYWJvdXQgdGhlIGVycm9yIGFuZCBhbnkgZGV0YWlscyB3aGljaCBtYXkgYmUgcmVsZXZhbnQgdG8gaGVscCB3aXRoIGRlYnVnZ2luZy5cbiAqXG4gKiBJbiB0aGUgYHByb2R1Y3Rpb25gIGVudmlyb25tZW50LCBhIG1pbmltYWwgZXJyb3Igb25seSBzdXJmYWNpbmcgdGhlIG51bWVyaWNcbiAqIGVycm9yIGNvZGUgaXMgdGhyb3duIGluc3RlYWQuXG4gKlxuICogQ29kZXMgYXJlIGNhdGVnb3JpemVkIGludG8gZ3JvdXBzIGJ5IHRoZSAxMDAnczpcbiAqXG4gKiAtIDAgLSA5OTogSW52YXJpYW50c1xuICogLSAxMDAgLSAxOTk6IEN1c3RvbSBFbGVtZW50cyAvIEVudmlyb25tZW50IEVycm9yc1xuICogLSAyMDAgLSAyOTk6IFRlbXBsYXRpbmcgRXJyb3JzXG4gKiAtIDMwMCAtIDM5OTogUnVudGltZSBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIFBhbGV0dGVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgbmFtZSA9IFwiUGFsZXR0ZUVycm9yXCI7XG4gIGNvZGU6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihjb2RlOiBudW1iZXIsIC4uLnZhbHVlczogc3RyaW5nW10pIHtcbiAgICBsZXQgbWVzc2FnZSA9IGBDb2RlOiAke2NvZGV9YDtcbiAgICBpZiAoX19ERVZfXykge1xuICAgICAgbWVzc2FnZSArPSBnZXREZXZFcnJvcihjb2RlKTtcblxuICAgICAgZm9yIChjb25zdCB2YWwgb2YgdmFsdWVzKSB7XG4gICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UoYCVzYCwgU3RyaW5nKHZhbCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gIH1cbn1cbiIsCiAgICAiLypcbiAqIENvcHlyaWdodCDCqSBSdXN0aWMgQXJjYWRlLCBMTEMgMjAyNlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cblxuaW1wb3J0IHsgRXJyb3JDb2RlLCBQYWxldHRlRXJyb3IgfSBmcm9tIFwiI2Vycm9yXCI7XG5cbmV4cG9ydCB0eXBlIFN0YXRlTGlzdGVuZXI8U2hhcGU+ID0gKHN0YXRlOiBTaGFwZSkgPT4gdm9pZDtcblxuY29uc3QgQXJyYXlNdXRhdG9yRnVuY3Rpb25zID0gbmV3IFNldChbXG4gIFwicHVzaFwiLFxuICBcInBvcFwiLFxuICBcInNoaWZ0XCIsXG4gIFwidW5zaGlmdFwiLFxuICBcInNwbGljZVwiLFxuICBcInNvcnRcIixcbiAgXCJyZXZlcnNlXCIsXG4gIFwiZmlsbFwiLFxuICBcImNvcHlXaXRoaW5cIixcbl0pO1xuXG5jb25zdCBEYXRhU3RydWN0dXJlTXV0YXRvckZ1bmN0aW9ucyA9IG5ldyBTZXQoW1xuICBcImFkZFwiLFxuICBcImRlbGV0ZVwiLFxuICBcImNsZWFyXCIsXG4gIFwic2V0XCIsXG5dKTtcblxuLyoqXG4gKiBQb3dlcmZ1bCBhbmQgZmxleGlibGUgc3RhdGUgbWFuYWdlbWVudCB3aXRoIGRlZXAgcmVhY3Rpdml0eSwgdHJhbnNhY3Rpb24sIGFuZFxuICogbG9ja2luZyBzdXBwb3J0LlxuICpcbiAqIFRoZSBTdGF0ZSBjbGFzcyB3cmFwcyBzdGF0ZWZ1bCBkYXRhIGFuZCBwcm92aWRlcyBhbiBBUEkgZm9yIG11dGF0aW5nIHRoZSBkYXRhXG4gKiB3aGlsZSBsaXN0ZW5lcnMgc3Vic2NyaWJlIHRvIG1lYW5pbmdmdWwgdXBkYXRlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFN0YXRlPFNoYXBlIGV4dGVuZHMgb2JqZWN0PiB7XG4gIHN0YXRpYyBpc1N0YXRlPFQgZXh0ZW5kcyBvYmplY3Q+KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgU3RhdGU8VD4ge1xuICAgIHJldHVybiAoXG4gICAgICB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgaW5zdGFuY2VvZiBTdGF0ZVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9kYXRhOiBTaGFwZTtcbiAgcHJpdmF0ZSBfbGlzdGVuZXJzOiBTZXQ8U3RhdGVMaXN0ZW5lcjxTaGFwZT4+ID0gbmV3IFNldCgpO1xuICBwcml2YXRlIF9wcm94eT86IFNoYXBlO1xuICBwcml2YXRlIF9wcm94eUNhY2hlID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBhbnk+KCk7XG4gIHByaXZhdGUgX3JldmVyc2VQcm94eUNhY2hlID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBvYmplY3Q+KCk7XG5cbiAgY29uc3RydWN0b3IoaW5pdGlhbERhdGE6IFNoYXBlLCBsaXN0ZW5lcj86IFN0YXRlTGlzdGVuZXI8U2hhcGU+KSB7XG4gICAgdGhpcy5fZGF0YSA9IGluaXRpYWxEYXRhO1xuICAgIGlmIChsaXN0ZW5lcikge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExhemlseSBjcmVhdGUgYW5kIGNhY2hlIHByb3hpZXMgaW50byB0aGUgc3RhdGUgZm9yIHJlYWN0aXZlIHVwZGF0ZXMgb25cbiAgICogbmVzdGVkIHZhbHVlcy5cbiAgICovXG4gIHByaXZhdGUgX2NyZWF0ZVByb3h5PFQ+KHRhcmdldDogVCwgcGF0aDogc3RyaW5nW10gPSBbXSk6IFQge1xuICAgIC8vIFJldHVybiBwcmltaXRpdmVzIGltbWVkaWF0ZWx5XG4gICAgaWYgKHR5cGVvZiB0YXJnZXQgIT09IFwib2JqZWN0XCIgfHwgdGFyZ2V0ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBhIGNhY2hlZCBwcm94eSBmb3IgdGhpcyBvYmplY3RcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLl9wcm94eUNhY2hlLmdldCh0YXJnZXQgYXMgb2JqZWN0KTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cblxuICAgIC8vIE90aGVyd2lzZSBjcmVhdGUgYSBuZXcgcHJveHkgYW5kIGNhY2hlIGl0XG4gICAgY29uc3QgcHJveHkgPSBuZXcgUHJveHkodGFyZ2V0IGFzIG9iamVjdCwge1xuICAgICAgZ2V0OiAob2JqLCBrZXk6IHN0cmluZyB8IHN5bWJvbCkgPT4ge1xuICAgICAgICAvLyBTeW1ib2xzIC0+IERpcmVjdCByZXR1cm5cbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09IFwic3ltYm9sXCIpIHtcbiAgICAgICAgICByZXR1cm4gKG9iaiBhcyBhbnkpW2tleV07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9IChvYmogYXMgYW55KVtrZXldO1xuXG4gICAgICAgIC8vIEZvciBBcnJheXMsIE1hcHMsIGFuZCBTZXRzLCBoYW5kbGUgbXV0YXRvciBmdW5jdGlvbnMgY29ycmVjdGx5XG4gICAgICAgIGlmIChcbiAgICAgICAgICAob2JqIGluc3RhbmNlb2YgU2V0IHx8IG9iaiBpbnN0YW5jZW9mIE1hcCB8fCBBcnJheS5pc0FycmF5KG9iaikpICYmXG4gICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgbXV0YXRpb25GbnMgPSBBcnJheS5pc0FycmF5KG9iailcbiAgICAgICAgICAgID8gQXJyYXlNdXRhdG9yRnVuY3Rpb25zXG4gICAgICAgICAgICA6IERhdGFTdHJ1Y3R1cmVNdXRhdG9yRnVuY3Rpb25zO1xuICAgICAgICAgIGNvbnN0IGlzTXV0YXRpb24gPSBtdXRhdGlvbkZucy5oYXMoa2V5KTtcblxuICAgICAgICAgIHJldHVybiAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy5zbmFwc2hvdCgpO1xuXG4gICAgICAgICAgICBsZXQgY3VycmVudDogYW55ID0gc25hcHNob3Q7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgcCBvZiBwYXRoKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W3BdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByZXMgPSAoY3VycmVudCBhcyBhbnkpW2tleV0oLi4uYXJncyk7XG5cbiAgICAgICAgICAgIGlmIChpc011dGF0aW9uKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NJbmNvbWluZ1N0YXRlKHNuYXBzaG90KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT2JqZWN0cyAtPiByZWN1cnNpdmVseSBjcmVhdGUgYSBwcm94eVxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZVByb3h5KHZhbHVlLCBbLi4ucGF0aCwga2V5XSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcmltaXRpdmVzIC0+IFJldHVybiB2YWx1ZVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9LFxuXG4gICAgICBzZXQ6IChfb2JqLCBrZXk6IHN0cmluZyB8IHN5bWJvbCwgdmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAvLyBEaXNhbGxvdyBzZXR0aW5nIHN5bWJvbCBwcm9wZXJ0aWVzIG9uIHRhcmdldCBkYXRhIHZhbHVlc1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbXB1dGUgYW5kIHVwZGF0ZSB0aGUgcGF0aCB3aXRoIHRoZSB2YWx1ZVxuICAgICAgICBjb25zdCBuZXdQYXRoID0gWy4uLnBhdGgsIGtleV07XG4gICAgICAgIHRoaXMuX3NldE5lc3RlZChuZXdQYXRoLCB0aGlzLl91bndyYXBQcm94eSh2YWx1ZSkpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcblxuICAgICAgaGFzOiAob2JqLCBrZXk6IHN0cmluZyB8IHN5bWJvbCkgPT4ge1xuICAgICAgICByZXR1cm4ga2V5IGluIG9iajtcbiAgICAgIH0sXG5cbiAgICAgIG93bktleXM6IChvYmopID0+IHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyhvYmopO1xuICAgICAgfSxcblxuICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAob2JqLCBrZXk6IHN0cmluZyB8IHN5bWJvbCkgPT4ge1xuICAgICAgICBjb25zdCBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSk7XG5cbiAgICAgICAgaWYgKGRlc2MpIHtcbiAgICAgICAgICBkZXNjLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVzYztcbiAgICAgIH0sXG5cbiAgICAgIGRlbGV0ZVByb3BlcnR5OiAob2JqLCBrZXkpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09IFwic3ltYm9sXCIgfHwgIShrZXkgaW4gb2JqKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbXB1dGUgYW5kIHVwZGF0ZSB0aGUgcGF0aCB3aXRoIHRoZSB2YWx1ZVxuICAgICAgICBjb25zdCBuZXdQYXRoID0gWy4uLnBhdGgsIGtleV07XG5cbiAgICAgICAgdGhpcy5fc2V0TmVzdGVkKG5ld1BhdGgsIHVuZGVmaW5lZCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuICAgIH0pIGFzIFQ7XG5cbiAgICB0aGlzLl9wcm94eUNhY2hlLnNldCh0YXJnZXQgYXMgb2JqZWN0LCBwcm94eSk7XG4gICAgdGhpcy5fcmV2ZXJzZVByb3h5Q2FjaGUuc2V0KHByb3h5IGFzIG9iamVjdCwgdGFyZ2V0IGFzIG9iamVjdCk7XG4gICAgcmV0dXJuIHByb3h5O1xuICB9XG5cbiAgcHJpdmF0ZSBfdW53cmFwUHJveHk8VD4odmFsdWU6IFQpOiBUIHtcbiAgICAvLyBEb24ndCBkbyBhbnl0aGluZyBmb3IgcHJpbWl0aXZlc1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGlzIGlzIG9uZSBvZiBvdXIgcHJveGllc1xuICAgIGNvbnN0IHJhd1RhcmdldCA9IHRoaXMuX3JldmVyc2VQcm94eUNhY2hlLmdldCh2YWx1ZSBhcyBvYmplY3QpO1xuICAgIGlmIChyYXdUYXJnZXQpIHtcbiAgICAgIHJldHVybiByYXdUYXJnZXQgYXMgVDtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgYXJyYXlzXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUubWFwKChpdGVtKSA9PiB0aGlzLl91bndyYXBQcm94eShpdGVtKSkgYXMgVDtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgcGxhaW4gb2JqZWN0c1xuICAgIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpID09PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgICBjb25zdCB1bndyYXBwZWQ6IGFueSA9IHt9O1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgaWYgKE9iamVjdC5oYXNPd24odmFsdWUsIGtleSkpIHtcbiAgICAgICAgICB1bndyYXBwZWRba2V5XSA9IHRoaXMuX3Vud3JhcFByb3h5KCh2YWx1ZSBhcyBhbnkpW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdW53cmFwcGVkO1xuICAgIH1cblxuICAgIC8vIE90aGVyIG9iamVjdHMgKERhdGUsIE1hcCwgU2V0LCBldGMuKSBwYXNzIHRocm91Z2hcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHNldHRpbmcgbmVzdGVkIHZhbHVlcyBhbmQgZW1pdHRpbmcgdXBkYXRlZCBkYXRhIGlmIHRoZSB2YWx1ZSBjaGFuZ2VkXG4gICAqL1xuICBwcml2YXRlIF9zZXROZXN0ZWQocGF0aDogc3RyaW5nW10sIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICAvLyBOb3RoaW5nIHRvIGRvIHdpdGggZW1wdHkgcGF0aHNcbiAgICBpZiAoIXBhdGgubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU3RhcnQgYXQgdGhlIHJvb3QgYW5kIHNlZWsgdG8gdGhlIHZhbHVlIGJlaW5nIHNldFxuICAgIGxldCBjdXJyZW50OiBhbnkgPSB0aGlzLl9kYXRhO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0gcGF0aFtpXSA/PyBcIlwiO1xuXG4gICAgICBpZiAoY3VycmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLklOVkFMSURfU1RBVEVfS0VZLCBwYXRoLmpvaW4oXCIuXCIpKTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudCA9IGN1cnJlbnRba2V5XTtcbiAgICB9XG5cbiAgICBjb25zdCBmaW5hbEtleSA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXSA/PyBcIlwiO1xuXG4gICAgaWYgKGN1cnJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuSU5WQUxJRF9TVEFURV9LRVksIHBhdGguam9pbihcIi5cIikpO1xuICAgIH1cblxuICAgIC8vIFNldCBhbmQgZW1pdCBvbmx5IGlmIHRoZSB2YWx1ZSBpcyBkaWZmZXJlbnQuIE90aGVyd2lzZSBuby1vcC5cbiAgICBpZiAoY3VycmVudFtmaW5hbEtleV0gIT09IHZhbHVlICYmICFPYmplY3QuaXMoY3VycmVudFtmaW5hbEtleV0sIHZhbHVlKSkge1xuICAgICAgY3VycmVudFtmaW5hbEtleV0gPSB2YWx1ZTtcbiAgICAgIHRoaXMuX2VtaXQodGhpcy5yYXcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIGFuIGluY29taW5nIHBhcnRpYWwgc3RhdGUgYW5kIGVtaXQgdXBkYXRlcyB0byBsaXN0ZW5lcnMgaWYgdGhlcmVcbiAgICogYXJlIGFueSBjaGFuZ2VzIGRldGVjdGVkLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBPYmplY3QuaXMoKSB0byBjaGVjayBmb3IgZGlmZmVyZW5jZXMuIERvZXMgbm90IGF0dGVtcHQgZGVlcCBkaWZmaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfcHJvY2Vzc0luY29taW5nU3RhdGUgPSAoXG4gICAgaW5jb21pbmdTdGF0ZTogUGFydGlhbDxTaGFwZT4sXG4gICk6IFN0YXRlPFNoYXBlPiA9PiB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGluY29taW5nU3RhdGUgIT09IFwib2JqZWN0XCIgfHxcbiAgICAgIGluY29taW5nU3RhdGUgPT09IG51bGwgfHxcbiAgICAgIEFycmF5LmlzQXJyYXkoaW5jb21pbmdTdGF0ZSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoXG4gICAgICAgIEVycm9yQ29kZS5JTlZBTElEX1NUQVRFX1VQREFURSxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoaW5jb21pbmdTdGF0ZSksXG4gICAgICApO1xuICAgIH1cbiAgICBsZXQgaGFzQ2hhbmdlcyA9IGZhbHNlO1xuXG4gICAgLy8gQ2hlY2sgaWYgYW55IGtleS92YWx1ZSBwYWlyIG9uIHRoZSBpbmNvbWluZyBzdGF0ZSBkaWZmZXJzIGZyb20gdGhlXG4gICAgLy8gZXhpc3RpbmcgZGF0YVxuICAgIGZvciAoY29uc3QgW2tleSwgbmV3VmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGluY29taW5nU3RhdGUpKSB7XG4gICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLl9kYXRhW2tleSBhcyBrZXlvZiBTaGFwZV07XG4gICAgICBpZiAoIU9iamVjdC5pcyhjdXJyZW50VmFsdWUsIG5ld1ZhbHVlKSkge1xuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgKHRoaXMuX2RhdGEgYXMgYW55KVtrZXldID0gbmV3VmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGhhc0NoYW5nZXMpIHtcbiAgICAgIHRoaXMuX2VtaXQodGhpcy5fZGF0YSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIEVtaXQgdGhlIGN1cnJlbnQgc3RhdGUgdG8gYWxsIGxpc3RlbmVyc1xuICAgKi9cbiAgcHJpdmF0ZSBfZW1pdCA9IChkYXRhOiBTaGFwZSk6IHZvaWQgPT4ge1xuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5fbGlzdGVuZXJzKSB7XG4gICAgICBsaXN0ZW5lcihkYXRhKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHN0YXRlXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFRoaXMgaXMgYSBkaXJlY3QgcmVmZXJlbmNlIHRvIHRoZSBpbnRlcm5hbCBzdGF0ZS4gSXQgaXMgbWFya2VkIGFzIFJlYWRvbmx5XG4gICAqIHRvIGhlbHAgcHJldmVudCBhY2NpZGVudGFsIGNoYW5nZXMuIE5ldmVyIGVkaXQgdGhpcyB2YWx1ZSBkaXJlY3RseS5cbiAgICovXG4gIGdldCByYXcoKTogUmVhZG9ubHk8U2hhcGU+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXZlIHJlYWN0aXZlIGFjY2Vzc29yIGZvciBzdGF0ZSBkYXRhLiBEZWVwbHkgbmVzdGVkIGNoYW5nZXMgdHJpZ2dlclxuICAgKiBhdXRvbWF0aWMgdXBkYXRlcywgaW5jbHVkaW5nIGFycmF5LCBNYXAsIGFuZCBTZXQgbXV0YXRpb25zLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBGb3IgZGVlcGx5IG5lc3RlZCB2YWx1ZXMsIHRoZSBgLmxpdmVgIGFjY2Vzc29yIG1heSBhZGQgcGVyZm9ybWFuY2Ugb3ZlcmhlYWRcbiAgICogY29tcGFyZWQgdG8gZGlyZWN0bHkgYWNjZXNzaW5nIHRoZSB2YWx1ZSB2aWEgYC5jdXJyZW50YFxuICAgKi9cbiAgZ2V0IGxpdmUoKTogU2hhcGUge1xuICAgIGlmICghdGhpcy5fcHJveHkpIHtcbiAgICAgIHRoaXMuX3Byb3h5ID0gdGhpcy5fY3JlYXRlUHJveHkodGhpcy5fZGF0YSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9wcm94eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBoYW5kbGVyIGZ1bmN0aW9uIGZvciB3aGVuIHRoaXMgc3RhdGUgY2hhbmdlcy5cbiAgICpcbiAgICogTGlzdGVuZXJzIGFyZSBpbnZva2VkIGluIHRoZSBvcmRlciB0aGV5IGFyZSByZWdpc3RlcmVkIGFuZCBhcmUgcGFzc2VkIGFcbiAgICogcmVmZXJlbmNlIHRvIHRoZSBpbnRlcm5hbGx5IG1hbmFnZWQgc3RhdGUgb2JqZWN0IGFzIGEgcmVhZG9ubHkgb2JqZWN0LlxuICAgKlxuICAgKiAqKkRvIG5vdCBtb2RpZnkgc3RhdGUgdmFsdWVzIGRpcmVjdGx5KiouIEluc3RlYWQsIHVzZSB7QGxpbmsgc2V0fSBvclxuICAgKiB7QGxpbmsgcGF0Y2h9IHRvIG1ha2UgaW1tdXRhYmxlIHVwZGF0ZXMuXG4gICAqL1xuICBhZGRMaXN0ZW5lciA9IChsaXN0ZW5lcjogU3RhdGVMaXN0ZW5lcjxTaGFwZT4pOiB2b2lkID0+IHtcbiAgICB0aGlzLl9saXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgfTtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgcHJldmlvdXNseSByZWdpc3RlcmVkIHN0YXRlIGhhbmRsZXJcbiAgICovXG4gIHJlbW92ZUxpc3RlbmVyID0gKGxpc3RlbmVyOiBTdGF0ZUxpc3RlbmVyPFNoYXBlPik6IHZvaWQgPT4ge1xuICAgIHRoaXMuX2xpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgYSBzaW5nbGUgdmFsdWUgZnJvbSB0aGUgc3RhdGUgb2JqZWN0XG4gICAqXG4gICAqIFRoZSB2YWx1ZSBpcyByZXR1cm5lZCBhcyBSZWFkb25seSB0byBwcmV2ZW50IGFjY2lkZW50YWwgc3RhdGUgbXV0YXRpb25zLlxuICAgKiBUbyBtdXRhdGUgc3RhdGVmdWwgcHJvcGVydGllcywgdXNlIHtAbGluayBzZXR9IG9yIHtAbGluayBwYXRjaH0gaW5zdGVhZC5cbiAgICovXG4gIGdldCA9IDxLIGV4dGVuZHMga2V5b2YgU2hhcGU+KGtleTogSyk6IFJlYWRvbmx5PFNoYXBlW0tdPiA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFba2V5XSBhcyBSZWFkb25seTxTaGFwZVtLXT47XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBkZWVwIGNsb25lIG9mIHRoZSBjdXJyZW50IHN0YXRlIGRhdGEgdXNpbmcgYHN0cnVjdHVyZWRDbG9uZSgpYCB0b1xuICAgKiBtYWtlIHRoZSBjb3B5LlxuICAgKlxuICAgKiBUaGUgb2JqZWN0IHJldHVybmVkIGZyb20gdGhpcyBmdW5jdGlvbiBjYW4gYmUgZWRpdGVkIHdpdGhvdXQgbW9kaWZ5aW5nIHRoZVxuICAgKiBhY3R1YWwgaW50ZXJuYWwgc3RhdGUuXG4gICAqIGBgYFxuICAgKi9cbiAgc25hcHNob3QgPSAoKTogU2hhcGUgPT4ge1xuICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5fZGF0YSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldCBhIHNpbmdsZSBzdGF0ZWZ1bCBwcm9wZXJ0eSB3aGlsZSBsZWF2aW5nIG90aGVyIHByb3BlcnRpZXMgdW5jaGFuZ2VkLlxuICAgKlxuICAgKiBUcmlnZ2VycyBhbiB1cGRhdGUgdG8gYWxsIGxpc3RlbmVycyBpZiB0aGUgdmFsdWUgaXMgZGlmZmVyZW50IGZyb20gYmVmb3JlXG4gICAqIHdoZW4gY29tcGFyZWQgdXNpbmcgc2hhbGxvdyBlcXVhbGl0eS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzdGF0ZSA9IG5ldyBTdGF0ZSh7IGNvdW50OiAxLCBjb2xvcjogXCJyZWRcIiB9KTtcbiAgICogc3RhdGUuc2V0KFwiY291bnRcIiwgMik7IC8vIFN0YXRlIGlzIG5vdyB7IGNvdW50OiAyLCBjb2xvcjogXCJyZWRcIiB9XG4gICAqIGBgYFxuICAgKi9cbiAgc2V0ID0gPEsgZXh0ZW5kcyBrZXlvZiBTaGFwZT4oa2V5OiBLLCB2YWx1ZTogU2hhcGVbS10pOiBTdGF0ZTxTaGFwZT4gPT4ge1xuICAgIGNvbnN0IHBhcnRpYWw6IFBhcnRpYWw8U2hhcGU+ID0ge307XG4gICAgcGFydGlhbFtrZXldID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NJbmNvbWluZ1N0YXRlKHBhcnRpYWwpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXQgbXVsdGlwbGUgc3RhdGVmdWwgcHJvcGVydGllcyBhdCBvbmNlLCBsZWF2aW5nIG9taXR0ZWQgcHJvcGVydGllc1xuICAgKiB1bmNoYW5nZWQuXG4gICAqL1xuICBwYXRjaCA9IChwYXRjaDogUGFydGlhbDxTaGFwZT4pOiBTdGF0ZTxTaGFwZT4gPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcm9jZXNzSW5jb21pbmdTdGF0ZShwYXRjaCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZ1bGx5IHJlcGxhY2UgdGhlIGN1cnJlbnQgc3RhdGUgZGF0YSBhbmQgZm9yY2UgYW4gdXBkYXRlXG4gICAqL1xuICByZXBsYWNlID0gKHN0YXRlOiBTaGFwZSk6IFN0YXRlPFNoYXBlPiA9PiB7XG4gICAgdGhpcy5fZGF0YSA9IHN0YXRlO1xuICAgIHRoaXMuX2VtaXQodGhpcy5fZGF0YSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIEFwcGx5IGNvbXBsZXggdXBkYXRlcyB0byB0aGUgc3RhdGUgdXNpbmcgYSBtdXRhdG9yIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBUaGUgbXV0YXRvciBmdW5jdGlvbiB0YWtlcyBvbmUgcGFyYW1ldGVyIHdoaWNoIGlzIGEgc3RydWN0dXJlZENsb25lIGNvcHkgb2ZcbiAgICogdGhlIGN1cnJlbnQgc3RhdGUgb2JqZWN0LiBXaGF0ZXZlciBpcyByZXR1cm5lZCBieSB0aGUgbXV0YXRvciBpcyB0aGVuXG4gICAqIHBhdGNoZWQgaW4gdG8gdGhlIHN0YXRlLlxuICAgKi9cbiAgbXV0YXRlID0gKG11dGF0b3I6IChjdXJyZW50OiBTaGFwZSkgPT4gU2hhcGUpOiBTdGF0ZTxTaGFwZT4gPT4ge1xuICAgIHJldHVybiB0aGlzLl9wcm9jZXNzSW5jb21pbmdTdGF0ZShtdXRhdG9yKHRoaXMuc25hcHNob3QoKSkpO1xuICB9O1xufVxuIiwKICAgICIvKlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cbnR5cGUgTWV0cmljcyA9IHtcbiAgaGl0czogbnVtYmVyO1xuICBtaXNzZXM6IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIExSVUNhY2hlTWV0cmljcyA9IHtcbiAgbG9va3VwczogbnVtYmVyO1xuICBoaXRzOiBudW1iZXI7XG4gIG1pc3NlczogbnVtYmVyO1xuICBjYXBhY2l0eTogbnVtYmVyO1xuICBlbnRyaWVzOiBudW1iZXI7XG4gIGhpdFJhdGU6IG51bWJlcjtcbn07XG5cbi8qKlxuICogQSBzaW1wbGUgaW4tbWVtb3J5IExSVSBDYWNoZSB1c2luZyBKYXZhU2NyaXB0IG1hcHMuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBDYWNoZWQgbmV0d29yayByZXF1ZXN0XG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQSBjYWNoZSBvZiBBUEkgVVJMcyB0byB0aGVpciByZXR1cm5lZCBwYXlsb2Fkc1xuICogY29uc3QgY2FjaGUgPSBuZXcgTFJVQ2FjaGU8c3RyaW5nLCBBUElQYXlsb2FkPigpO1xuICpcbiAqIGFzeW5jIGZ1bmN0aW9uIG1ha2VSZXF1ZXN0KHVybDogc3RyaW5nKSB7XG4gKiAgIGxldCBjYWNoZWQgPSBjYWNoZS5nZXQodXJsKTtcbiAqICAgaWYgKGNhY2hlZCkge1xuICogICAgIHJldHVybiBjYWNoZWQ7XG4gKiAgIH1cbiAqXG4gKiAgIC8vIC4uLiBNYWtlIHRoZSByZXF1ZXN0IGFuZCBjYWNoZS5zZXQoKSB0aGUgcmVzcG9uc2VcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgTFJVQ2FjaGU8SywgVj4ge1xuICBwcml2YXRlIF9tYXhTaXplOiBudW1iZXI7XG4gIHByaXZhdGUgX2RhdGE6IE1hcDxLLCBWPjtcbiAgcHJpdmF0ZSBfbWV0cmljczogTWV0cmljcyA9IHsgaGl0czogMCwgbWlzc2VzOiAwIH07XG5cbiAgY29uc3RydWN0b3IobWF4U2l6ZTogbnVtYmVyID0gNTAwKSB7XG4gICAgaWYgKG1heFNpemUgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTFJVIENhY2hlIGNhcGFjaXR5IG11c3QgYmUgPj0gMVwiKTtcbiAgICB9XG5cbiAgICBpZiAoX19ERVZfXykge1xuICAgICAgdGhpcy5fbWV0cmljcyA9IHsgaGl0czogMCwgbWlzc2VzOiAwIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbWF4U2l6ZSA9IG1heFNpemU7XG4gICAgdGhpcy5fZGF0YSA9IG5ldyBNYXA8SywgVj4oKTtcbiAgfVxuXG4gIHByaXZhdGUgX3RyaW0gPSAoKSA9PiB7XG4gICAgd2hpbGUgKHRoaXMuX2RhdGEuc2l6ZSA+IHRoaXMuX21heFNpemUpIHtcbiAgICAgIGNvbnN0IGZpcnN0S2V5ID0gdGhpcy5fZGF0YS5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgaWYgKGZpcnN0S2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWJzdXJkXCIpO1xuICAgICAgfVxuICAgICAgdGhpcy5fZGF0YS5kZWxldGUoZmlyc3RLZXkpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogR2V0IGNhY2hlIHBlcmZvcm1hbmNlIG1ldHJpY3MgZnJvbSB0aGlzIExSVSBDYWNoZSBpbnN0YW5jZS5cbiAgICpcbiAgICogSW4gZGV2ZWxvcG1lbnQgbW9kZSwgdGhpcyByZXR1cm5zIGluc2lnaHRzIGludG8gaGl0cy9taXNzZXMgb2YgdGhlIGNhY2hlLFxuICAgKiBhcyB3ZWxsIGFzIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gYW5kIGVudHJ5IGNvdW50LlxuICAgKlxuICAgKiBJbiBwcm9kdWN0aW9uIG1vZGUsIHRoaXMgcmV0dXJucyBhIHBsYWNlaG9sZGVyIG9iamVjdCwgYXMgbWV0cmljIGNvbGxlY3Rpb25cbiAgICogaXMgbm90IGFjdGl2ZSBpbiBwcm9kdWN0aW9uLlxuICAgKi9cbiAgZ2V0TWV0cmljcygpOiBMUlVDYWNoZU1ldHJpY3MgfCB2b2lkIHtcbiAgICBpZiAoX19ERVZfXykge1xuICAgICAgY29uc3QgeyBoaXRzID0gMCwgbWlzc2VzID0gMCB9ID0gdGhpcy5fbWV0cmljcyA/PyB7fTtcbiAgICAgIGNvbnN0IGxvb2t1cHMgPSBoaXRzICsgbWlzc2VzO1xuICAgICAgY29uc3QgaGl0UmF0ZSA9IGxvb2t1cHMgPT09IDAgPyAwIDogaGl0cyAvIGxvb2t1cHM7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxvb2t1cHMsXG4gICAgICAgIGhpdHM6IGhpdHMsXG4gICAgICAgIG1pc3NlczogbWlzc2VzLFxuICAgICAgICBjYXBhY2l0eTogdGhpcy5fbWF4U2l6ZSxcbiAgICAgICAgZW50cmllczogdGhpcy5fZGF0YS5zaXplLFxuICAgICAgICBoaXRSYXRlLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBtYXhpbXVtIGNhY2hlIHNpemUgZm9yIHRoaXMgaW5zdGFuY2UuIEltbWVkaWF0ZWx5IHRyaWdnZXJzIGFcbiAgICogcHVyZ2Ugb2YgY2FjaGVkIGNvbnRlbnRzIGlmIHRoZSBuZXcgY2FwYWNpdHkgaXMgbGVzcyB0aGFuIHRoZSBjdXJyZW50XG4gICAqIG51bWJlciBvZiBjYWNoZWQgZW50cmllcy5cbiAgICovXG4gIHNldENhcGFjaXR5ID0gKG1heFNpemU6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgIGlmIChtYXhTaXplIDw9IDAgJiYgX19ERVZfXykge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIltQYWxldHRlIExSVSBDYWNoZV0gQ2FjaGUgc2l6ZSBpcyA8PSAwLiBDYWNoZSBpcyBkaXNhYmxlZC5cIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5fbWF4U2l6ZSA9IG1heFNpemU7XG4gICAgdGhpcy5fdHJpbSgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBGZXRjaCBhIHZhbHVlIGZyb20gdGhlIGNhY2hlLCByZXR1cm5pbmcgYHVuZGVmaW5lZGAgaWYgbm8gdmFsdWUgd2FzIGZvdW5kXG4gICAqL1xuICBnZXQoa2V5OiBLKTogViB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9kYXRhLmdldChrZXkpO1xuXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICAgIHRoaXMuX21ldHJpY3MubWlzc2VzICs9IDE7XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIERlbGV0ZSBhbmQgcmUtc2V0IHRoZSB2YWx1ZSB0byBtb3ZlIHRoZSBrZXkgdG8gdGhlIGVuZCBvZiB0aGUga2V5IGxpc3RcbiAgICB0aGlzLl9kYXRhLmRlbGV0ZShrZXkpO1xuICAgIHRoaXMuX2RhdGEuc2V0KGtleSwgdmFsdWUpO1xuXG4gICAgaWYgKF9fREVWX18pIHtcbiAgICAgIHRoaXMuX21ldHJpY3MuaGl0cyArPSAxO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSB2YWx1ZSBpbiB0aGUgY2FjaGUuIFRoaXMgYWxzbyBtb3ZlcyB0aGUgdmFsdWUgdG8gdGhlIGJhY2sgb2YgdGhlIGxpc3RcbiAgICogb2YgdmFsdWVzIHRvIGNvbnNpZGVyIGV2aWN0aW5nIHdoZW4gdGhlIGNhY2hlIGlzIGZ1bGwuXG4gICAqL1xuICBzZXQoa2V5OiBLLCB2YWx1ZTogVik6IHZvaWQge1xuICAgIC8vIFJlbW92ZSBpZiBleGlzdHMgdG8gdXBkYXRlIHBvc2l0aW9uXG4gICAgaWYgKHRoaXMuX2RhdGEuaGFzKGtleSkpIHtcbiAgICAgIHRoaXMuX2RhdGEuZGVsZXRlKGtleSk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG5cbiAgICBpZiAodGhpcy5fZGF0YS5zaXplID4gdGhpcy5fbWF4U2l6ZSkge1xuICAgICAgdGhpcy5fdHJpbSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgY29udGVudHMgb2YgdGhpcyBjYWNoZSBpbnN0YW5jZVxuICAgKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5fZGF0YS5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhpcyBjYWNoZSBpbnN0YW5jZVxuICAgKi9cbiAgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5zaXplO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IExSVUNhY2hlO1xuIiwKICAgICIvKlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cbmltcG9ydCBMUlVDYWNoZSBmcm9tIFwiLi9scnUtY2FjaGVcIjtcblxuZXhwb3J0IGNvbnN0IGZyYWdtZW50Q2FjaGUgPSBuZXcgTFJVQ2FjaGU8c3RyaW5nLCBEb2N1bWVudEZyYWdtZW50PigpO1xuXG5leHBvcnQgZnVuY3Rpb24gaHRtbFRvRnJhZ21lbnQoaHRtbDogc3RyaW5nKTogRG9jdW1lbnRGcmFnbWVudCB7XG4gIGNvbnN0IGxvb2t1cCA9IGZyYWdtZW50Q2FjaGUuZ2V0KGh0bWwpO1xuXG4gIGlmIChsb29rdXAgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBsb29rdXAuY2xvbmVOb2RlKHRydWUpIGFzIERvY3VtZW50RnJhZ21lbnQ7XG4gIH1cblxuICBjb25zdCB0ZW1wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuICB0ZW1wLmlubmVySFRNTCA9IGh0bWw7XG4gIGZyYWdtZW50Q2FjaGUuc2V0KGh0bWwsIHRlbXAuY29udGVudCk7XG4gIHJldHVybiB0ZW1wLmNvbnRlbnQuY2xvbmVOb2RlKHRydWUpIGFzIERvY3VtZW50RnJhZ21lbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzYXZlRnJhZ21lbnQoaHRtbDogc3RyaW5nLCBmcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCk6IHZvaWQge1xuICBmcmFnbWVudENhY2hlLnNldChodG1sLCBmcmFnbWVudCk7XG59XG4iLAogICAgIi8qXG4gKiBDb3B5cmlnaHQgwqkgUnVzdGljIEFyY2FkZSwgTExDIDIwMjZcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplQXR0cmlidXRlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgcmV0dXJuIGAke3ZhbHVlfWA7XG4gIH1cblxuICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gZmFsc2UgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUF0dHJpYnV0ZShcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gIG5hbWU6IHN0cmluZyxcbiAgdmFsdWU6IHN0cmluZyB8IG51bGwsXG4pOiB2b2lkIHtcbiAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gIH0gZWxzZSB7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbGVtZW50QXR0cmlidXRlcyhcbiAgc291cmNlOiBIVE1MRWxlbWVudCxcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+IHtcbiAgY29uc3QgYXR0cnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+ID0ge307XG5cbiAgZm9yIChjb25zdCBuYW1lIG9mIHNvdXJjZS5nZXRBdHRyaWJ1dGVOYW1lcygpKSB7XG4gICAgYXR0cnNbbmFtZV0gPSBzZXJpYWxpemVBdHRyaWJ1dGUoc291cmNlLmdldEF0dHJpYnV0ZShuYW1lKSk7XG4gIH1cblxuICByZXR1cm4gYXR0cnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUVsZW1lbnRBdHRyaWJ1dGVzKFxuICB0YXJnZXQ6IEhUTUxFbGVtZW50LFxuICBhdHRyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4pOiB2b2lkIHtcbiAgY29uc3QgY3VycmVudE5hbWVzID0gbmV3IFNldCh0YXJnZXQuZ2V0QXR0cmlidXRlTmFtZXMoKSk7XG4gIGNvbnN0IGluY29taW5nTmFtZXMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKGF0dHJzKSk7XG4gIGNvbnN0IGF0dHJpYnV0ZXNUb1JlbW92ZSA9IGN1cnJlbnROYW1lcy5kaWZmZXJlbmNlKGluY29taW5nTmFtZXMpO1xuXG4gIGZvciAoY29uc3QgYXR0ciBvZiBhdHRyaWJ1dGVzVG9SZW1vdmUpIHtcbiAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKGF0dHIpO1xuICB9XG5cbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhhdHRycykpIHtcbiAgICBhcHBseUF0dHJpYnV0ZSh0YXJnZXQsIG5hbWUsIHNlcmlhbGl6ZUF0dHJpYnV0ZSh2YWwpKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0QXR0cmlidXRlUmVjb3JkKFxuICByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD4ge1xuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+ID0ge307XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKHJlY29yZCkpIHtcbiAgICBvdXRba2V5XSA9IHNlcmlhbGl6ZUF0dHJpYnV0ZSh2YWwpO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cbiIsCiAgICAiLypcbiAqIENvcHlyaWdodCDCqSBSdXN0aWMgQXJjYWRlLCBMTEMgMjAyNlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cblxuLyoqXG4gKiBDaGVjayBpZiBhIGdpdmVuIHN0cmluZyBpcyBhIHZhbGlkIGh0bWwgdGFnbmFtZSwgb3B0aW1pemVkIGZvciBob3QgcGF0aHMuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoaXMgZnVuY3Rpb24gYXZvaWRzIHVzaW5nIHRoZSByZWdleCBlbmdpbmUgZm9yIHBlcmZvcm1hbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1RhZ05hbWUoc3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjaGFyID0gc3RyLmNoYXJBdChpKTtcblxuICAgIGlmIChcbiAgICAgICEoXG4gICAgICAgIGNoYXIgPT09IFwiLVwiIHx8XG4gICAgICAgIChjaGFyID49IFwiQVwiICYmIGNoYXIgPD0gXCJaXCIpIHx8XG4gICAgICAgIChjaGFyID49IFwiYVwiICYmIGNoYXIgPD0gXCJ6XCIpXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQSBwZXJmb3JtYW5jZSBvcHRpbWl6ZWQgdmVyc2lvbiBvZiBgLm1hdGNoZXMoKWAgd2hpY2ggaW5jbHVkZXMgZmFzdGVyXG4gKiBtYXRjaGluZyBzdHJhdGVnaWVzIGZvciBjb21tb24gcXVlcmllcy5cbiAqXG4gKiBAcmVtYXJrc1xuICogT3B0aW1pemVkIHF1ZXJ5IHR5cGVzOlxuICpcbiAqIC0gU2luZ2xlIElEIHNlbGVjdG9yIGBcIiNpZGVudGlmaWVyXCJgXG4gKiAtIFNpbmdsZSBjbGFzcyBzZWxlY3RvciBgXCIuY2xhc3NuYW1lXCJgXG4gKiAtIFRhZ25hbWUgc2VsZWN0b3IgYFwiYnV0dG9uXCJgXG4gKiAtIFNpbXBsZSBhdHRyaWJ1dGUgc2VsZWN0b3IgYFwiW2F0dHI9J3ZhbHVlJ11cImBcbiAqXG4gKiBBbGwgb3RoZXIgdHlwZXMgb2YgcXVlcmllcyB1c2UgdGhlIGJhc2UgLm1hdGNoZXMoKSBmb3IgY29tcGFyaXNvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZWxlbWVudE1hdGNoZXMoZWxlbWVudDogRWxlbWVudCwgcXVlcnk6IHN0cmluZykge1xuICAvLyBJZiB0aGUgcXVlcnkgaXMgYSBzaW1wbGUgSUQsIGNoZWNrIGl0IGRpcmVjdGx5XG4gIGlmIChcbiAgICBxdWVyeVswXSA9PT0gXCIjXCIgJiZcbiAgICBxdWVyeS5pbmRleE9mKFwiIFwiKSA9PT0gLTEgJiZcbiAgICBxdWVyeS5pbmRleE9mKFwiLlwiKSA9PT0gLTEgJiZcbiAgICBxdWVyeS5pbmRleE9mKFwiW1wiKSA9PT0gLTEgJiZcbiAgICBxdWVyeS5pbmRleE9mKFwiOlwiKSA9PT0gLTEgJiZcbiAgICBxdWVyeS5pbmRleE9mKFwiPlwiKSA9PT0gLTFcbiAgKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQuaWQgPT09IHF1ZXJ5LnNsaWNlKDEpO1xuICB9XG5cbiAgLy8gSWYgdGhlIHF1ZXJ5IGlzIGEgc2ltcGxlIGNsYXNzbmFtZSwgY2hlY2sgaXQgZGlyZWN0bHlcbiAgaWYgKFxuICAgIHF1ZXJ5WzBdID09PSBcIi5cIiAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCIgXCIpID09PSAtMSAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCIjXCIpID09PSAtMSAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCJbXCIpID09PSAtMSAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCI6XCIpID09PSAtMSAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCI+XCIpID09PSAtMVxuICApIHtcbiAgICByZXR1cm4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMocXVlcnkuc2xpY2UoMSkpO1xuICB9XG5cbiAgLy8gSWYgdGhlIHF1ZXJ5IGlzIGZvciBqdXN0IGEgdGFnbmFtZSwgY2hlY2sgaXQgZGlyZWN0bHlcbiAgaWYgKGlzVGFnTmFtZShxdWVyeSkpIHtcbiAgICByZXR1cm4gZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IHF1ZXJ5LnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICAvLyBJZiB0aGUgcXVlcnkgaXMgZm9yIGEgc2luZ2xlIHNlbGVjdG9yIHZhbHVlLCBjaGVjayBpdCBkaXJlY3RseVxuICBpZiAoXG4gICAgcXVlcnlbMF0gPT09IFwiW1wiICYmXG4gICAgcXVlcnlbcXVlcnkubGVuZ3RoIC0gMV0gPT09IFwiXVwiICYmXG4gICAgcXVlcnkuaW5kZXhPZihcIiBcIikgPT09IC0xICYmXG4gICAgcXVlcnkuaW5kZXhPZihcIjpcIikgPT09IC0xXG4gICkge1xuICAgIGNvbnN0IGF0dHIgPSBxdWVyeS5zbGljZSgxLCAtMSk7XG4gICAgY29uc3QgZXFJbmRleCA9IGF0dHIuaW5kZXhPZihcIj1cIik7XG4gICAgaWYgKGVxSW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cik7XG4gICAgfVxuICAgIGNvbnN0IGF0dHJOYW1lID0gYXR0ci5zbGljZSgwLCBlcUluZGV4KTtcbiAgICBjb25zdCBhdHRyVmFsdWUgPSBhdHRyLnNsaWNlKGVxSW5kZXggKyAxKS5yZXBsYWNlKC9eW1wiJ118W1wiJ10kL2csIFwiXCIpO1xuICAgIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyTmFtZSkgPT09IGF0dHJWYWx1ZTtcbiAgfVxuXG4gIC8vIE90aGVyd2lzZSwgdXNlIG5hdGl2ZSBgLm1hdGNoZXNgIGZvciBjb21wbGV4IHN0dWZmXG4gIHJldHVybiBlbGVtZW50Lm1hdGNoZXMocXVlcnkpO1xufVxuIiwKICAgICJ0eXBlIFdhbGtlckZuID0gKG5vZGU6IE5vZGUpID0+IGJvb2xlYW4gfCB2b2lkO1xuXG4vKipcbiAqIFdhbGsgdXAgdGhlIHBhcmVudCBub2RlcyBmcm9tIGEgdGFyZ2V0IGNoaWxkIGVsZW1lbnQgYW5kIGludm9rZSBhIGZ1bmN0aW9uXG4gKiBvbiBlYWNoIG5vZGUuIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIGB0cnVlYCBmb3IgYSBub2RlLCBleGVjdXRpb24gd2lsbFxuICogc3RvcCBhbmQgdGhpcyBmdW5jdGlvbiB3aWxsIGFsc28gcmV0dXJuIGB0cnVlYC4gSWYgdGhlIGZ1bmN0aW9uIGRvZXMgbm90XG4gKiByZXR1cm4gdHJ1ZSwgaXQgd2lsbCBjb250aW51ZSB3YWxraW5nIHVwIHRoZSBwYXJlbnQgbm9kZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3YWxrUGFyZW50cyh0YXJnZXQ6IE5vZGUsIGZuOiBXYWxrZXJGbik6IGJvb2xlYW4ge1xuICBsZXQgY3VycmVudDogTm9kZSB8IG51bGwgPSB0YXJnZXQucGFyZW50Tm9kZTtcblxuICB3aGlsZSAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGZuKGN1cnJlbnQpO1xuXG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGlzU2hhZG93Um9vdChjdXJyZW50KSkge1xuICAgICAgY3VycmVudCA9IGN1cnJlbnQuaG9zdDtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50Tm9kZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0VsZW1lbnQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBFbGVtZW50IHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgaW5zdGFuY2VvZiBFbGVtZW50XG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0hUTUxFbGVtZW50KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgSFRNTEVsZW1lbnQge1xuICByZXR1cm4gKFxuICAgIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50XG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0hUTUxUZW1wbGF0ZUVsZW1lbnQoXG4gIHZhbHVlOiB1bmtub3duLFxuKTogdmFsdWUgaXMgSFRNTFRlbXBsYXRlRWxlbWVudCB7XG4gIHJldHVybiAoXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICB2YWx1ZSBpbnN0YW5jZW9mIEhUTUxUZW1wbGF0ZUVsZW1lbnRcbiAgKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1NoYWRvd1Jvb3QodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBTaGFkb3dSb290IHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgaW5zdGFuY2VvZiBTaGFkb3dSb290XG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc05vZGUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBOb2RlIHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSBpbnN0YW5jZW9mIE5vZGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbW1lbnQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBDb21tZW50IHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgaW5zdGFuY2VvZiBDb21tZW50XG4gICk7XG59XG4iLAogICAgImV4cG9ydCBjb25zdCBSRUZfQVRUUiA9IFwiZGF0YS1ub2RlLXJlZlwiO1xuIiwKICAgICIvKlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cblxuaW1wb3J0IHsgRXJyb3JDb2RlLCBQYWxldHRlRXJyb3IgfSBmcm9tIFwiI2Vycm9yXCI7XG5pbXBvcnQgeyBMUlVDYWNoZSB9IGZyb20gXCIjdXRpbFwiO1xuXG5jb25zdCBlbnVtIE5vdGF0aW9uUHJlZml4IHtcbiAgQXR0cmlidXRlcyA9IFwiQFwiLFxuICBTdGF0ZSA9IFwiJFwiLFxuICBEYXRhID0gXCIqXCIsXG4gIEl0ZW0gPSBcIiNcIixcbn1cblxuY29uc3QgUFJFRklYX01BUFBJTkc6IFJlY29yZDxOb3RhdGlvblByZWZpeCwgc3RyaW5nPiA9IHtcbiAgW05vdGF0aW9uUHJlZml4LkF0dHJpYnV0ZXNdOiBcImF0dHJcIixcbiAgW05vdGF0aW9uUHJlZml4LlN0YXRlXTogXCJzdGF0ZVwiLFxuICBbTm90YXRpb25QcmVmaXguRGF0YV06IFwiZGF0YVwiLFxuICBbTm90YXRpb25QcmVmaXguSXRlbV06IFwiaXRlbVwiLFxufTtcblxuY29uc3QgcHJlZml4TWFwcGluZyA9IG5ldyBNYXAoT2JqZWN0LmVudHJpZXMoUFJFRklYX01BUFBJTkcpKTtcblxuZXhwb3J0IHR5cGUgUGFyc2VkTm90YXRpb24gPSB7XG4gIC8qKiBUaGUgcmF3IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGFyc2VkIG5vdGF0aW9uICovXG4gIGJhc2U6IHN0cmluZztcblxuICAvKiogQW4gYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgZm9ybWluZyBhIHBhdGggdG8gdGhlIG5vdGF0aW9uIHZhbHVlICovXG4gIHBhdGg6IHN0cmluZ1tdO1xuXG4gIG1vZGlmaWVycz86IHtcbiAgICBub3Q/OiBib29sZWFuO1xuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHBhcnNlZE5vdGF0aW9uQ2FjaGUgPSBuZXcgTFJVQ2FjaGU8c3RyaW5nLCBQYXJzZWROb3RhdGlvbj4oKTtcblxuLyoqXG4gKiBQYXJzZSBhIG5vdGF0aW9uIGludG8gYW4gb2JqZWN0IHdpdGggcnVudGltZSBpbmZvcm1hdGlvblxuICpcbiAqIEByZW1hcmtzXG4gKiBGb3VyIG5vdGF0aW9ucyBhcmUgc3VwcG9ydGVkOlxuICpcbiAqIC0gYEBhdHRybmFtZWAgLT4gUm9vdCBlbGVtZW50IGF0dHJpYnV0ZXNcbiAqIC0gYCRzdGF0ZXZhbHVlYCAtPiBTdGF0ZWZ1bCBjb250ZW50XG4gKiAtIGAqcHJvcGVydHkub3Iud2hhdGV2ZXJgIC0+IENvbXB1dGVkIGRhdGEgcHJvcGVydGllc1xuICogLSBgI2NvbG9yYCAtPiBMaXN0IGl0ZW0gcHJvcGVydGllc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VOb3RhdGlvbihub3RhdGlvbjogc3RyaW5nKTogUGFyc2VkTm90YXRpb24ge1xuICBjb25zdCBjYWNoZWQgPSBwYXJzZWROb3RhdGlvbkNhY2hlLmdldChub3RhdGlvbik7XG4gIGlmIChjYWNoZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIHByZWZpeCBtb2RpZmllcnNcbiAgbGV0IG5vdE1vZGlmaWVyID0gZmFsc2U7XG5cbiAgbGV0IHBhdGhQYXJ0ID0gXCJcIjtcbiAgY29uc3QgY29tcHV0ZWRQYXRoOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGxldCBpc0ZpcnN0ID0gdHJ1ZTtcbiAgZm9yIChjb25zdCBjaGFyIG9mIG5vdGF0aW9uKSB7XG4gICAgLy8gISBhdCBwb3NpdGlvbiAwIC0+IEVuYWJsZSBOT1QgbW9kaWZpZXIsIGRvbnQgY291bnQgdG93YXJkcyBpZHhcbiAgICBpZiAoaXNGaXJzdCAmJiBjaGFyID09PSBcIiFcIikge1xuICAgICAgbm90TW9kaWZpZXIgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIE90aGVyd2lzZSwgcG9zaXRpb24gMCBtdXN0IGJlIGEgcHJlZml4XG4gICAgZWxzZSBpZiAoaXNGaXJzdCkge1xuICAgICAgY29uc3QgcHJlZml4ID0gcHJlZml4TWFwcGluZy5nZXQoY2hhcik7XG5cbiAgICAgIGlmICghcHJlZml4KSB7XG4gICAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoXG4gICAgICAgICAgRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfTk9UQVRJT05fU1lOVEFYLFxuICAgICAgICAgIG5vdGF0aW9uLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb21wdXRlZFBhdGgucHVzaChwcmVmaXgpO1xuICAgICAgaXNGaXJzdCA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIENvbGxlY3QgY2hhcmFjdGVycyBhbmQgcHVzaCB3aGVuIGhpdHRpbmcgYSBkb3Qgb3IgZW5kXG4gICAgZWxzZSBpZiAoY2hhciA9PT0gXCIuXCIpIHtcbiAgICAgIGlmIChwYXRoUGFydC5sZW5ndGgpIHtcbiAgICAgICAgY29tcHV0ZWRQYXRoLnB1c2gocGF0aFBhcnQpO1xuICAgICAgICBwYXRoUGFydCA9IFwiXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKFxuICAgICAgICAgIEVycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX05PVEFUSU9OX1NZTlRBWCxcbiAgICAgICAgICBub3RhdGlvbixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGF0aFBhcnQgKz0gY2hhcjtcbiAgICB9XG4gIH1cblxuICAvLyBBZGQgdGhlIGZpbmFsIHBhcnQgd2hpY2ggbXVzdCBleGlzdCAob3RoZXJ3aXNlLCBpdCBlbmRlZCBpbiBhIGRvdClcbiAgaWYgKCFwYXRoUGFydC5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKFxuICAgICAgRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfTk9UQVRJT05fU1lOVEFYLFxuICAgICAgbm90YXRpb24sXG4gICAgKTtcbiAgfVxuXG4gIGNvbXB1dGVkUGF0aC5wdXNoKHBhdGhQYXJ0KTtcblxuICBpZiAoY29tcHV0ZWRQYXRoLmxlbmd0aCA8IDIpIHtcbiAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKFxuICAgICAgRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfTk9UQVRJT05fU1lOVEFYLFxuICAgICAgbm90YXRpb24sXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHBhcnNlZE5vdGF0aW9uOiBQYXJzZWROb3RhdGlvbiA9IHtcbiAgICBiYXNlOiBub3RhdGlvbixcbiAgICBwYXRoOiBjb21wdXRlZFBhdGgsXG4gICAgbW9kaWZpZXJzOiBub3RNb2RpZmllciA/IHsgbm90OiB0cnVlIH0gOiB1bmRlZmluZWQsXG4gIH07XG5cbiAgcGFyc2VkTm90YXRpb25DYWNoZS5zZXQobm90YXRpb24sIHBhcnNlZE5vdGF0aW9uKTtcblxuICByZXR1cm4gcGFyc2VkTm90YXRpb247XG59XG5cbmV4cG9ydCB0eXBlIE5vdGF0aW9uQWNjZXNzb3IgPSAoc291cmNlOiB1bmtub3duKSA9PiB1bmtub3duO1xuXG5leHBvcnQgY29uc3QgdmFsdWVBY2Nlc3NvckNhY2hlID0gbmV3IExSVUNhY2hlPHN0cmluZywgTm90YXRpb25BY2Nlc3Nvcj4oKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkVmFsdWVBY2Nlc3Nvcihub3RhdGlvbjogUGFyc2VkTm90YXRpb24pOiBOb3RhdGlvbkFjY2Vzc29yIHtcbiAgY29uc3QgeyBwYXRoLCBtb2RpZmllcnMsIGJhc2UgfSA9IG5vdGF0aW9uO1xuXG4gIGNvbnN0IGNhY2hlZCA9IHZhbHVlQWNjZXNzb3JDYWNoZS5nZXQoYmFzZSk7XG4gIGlmIChjYWNoZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG5cbiAgaWYgKHBhdGgubGVuZ3RoIDwgMikge1xuICAgIC8vIE5vdGF0aW9ucyBtdXN0IGFsd2F5cyBoYXZlIGF0IGxlYXN0IDIgcGFydHM6IHRoZSBuYW1lc3BhY2UsIGFuZCBhdCBsZWFzdFxuICAgIC8vIG9uZSBwcm9wZXJ0eSBuYW1lIG9uIHRoZSBuYW1lc3BhY2UgKGV4YW1wbGU6IFtcInN0YXRlXCIsIFwidmlzaWJsZVwiXSlcbiAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5JTlZBUklBTlQpO1xuICB9XG5cbiAgY29uc3QgYWNjZXNzb3IgPSAoc291cmNlOiB1bmtub3duKSA9PiB7XG4gICAgbGV0IGN1cnJlbnQgPSBzb3VyY2U7XG5cbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGF0aCkge1xuICAgICAgaWYgKCFjdXJyZW50IHx8IHR5cGVvZiBjdXJyZW50ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjdXJyZW50ID0gY3VycmVudFtwYXJ0IGFzIGtleW9mIHR5cGVvZiBjdXJyZW50XTtcbiAgICB9XG5cbiAgICBpZiAobW9kaWZpZXJzPy5ub3QpIHtcbiAgICAgIGlmIChwYXRoWzBdID09PSBcImF0dHJcIikge1xuICAgICAgICByZXR1cm4gY3VycmVudCAhPT0gXCJcIiAmJiAhY3VycmVudDtcbiAgICAgIH1cbiAgICAgIHJldHVybiAhY3VycmVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudDtcbiAgfTtcblxuICB2YWx1ZUFjY2Vzc29yQ2FjaGUuc2V0KGJhc2UsIGFjY2Vzc29yKTtcblxuICByZXR1cm4gYWNjZXNzb3I7XG59XG4iLAogICAgImltcG9ydCB7IGh0bWxUb0ZyYWdtZW50IH0gZnJvbSBcIiN1dGlsXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4uL3V0aWwvZG9tXCI7XG5pbXBvcnQgeyBEaXJlY3RpdmUgfSBmcm9tIFwiLi9kaXJlY3RpdmVcIjtcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSBcIi4vdGVtcGxhdGVcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGh0bWxTdHJpbmdUb1RlbXBsYXRlKGh0bWw6IHN0cmluZyk6IFRlbXBsYXRlIHtcbiAgY29uc3QgZnJhZ21lbnQgPSBodG1sVG9GcmFnbWVudChodG1sKTtcbiAgY29uc3QgdGVtcGxhdGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuICB0ZW1wbGF0ZUVsZW1lbnQuY29udGVudC5hcHBlbmRDaGlsZChmcmFnbWVudCk7XG4gIHJldHVybiBuZXcgVGVtcGxhdGUodGVtcGxhdGVFbGVtZW50KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RPcGVyYWJsZU5vZGVzKFxuICBmcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCxcbik6IEhUTUxFbGVtZW50W10ge1xuICBjb25zdCB3YWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKGZyYWdtZW50LCBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCk7XG4gIGNvbnN0IGtub3duSWdub3JlcyA9IG5ldyBTZXQ8Tm9kZT4oKTtcbiAgY29uc3Qgbm9kZXM6IEhUTUxFbGVtZW50W10gPSBbXTtcblxuICBsZXQgY3VycmVudE5vZGU6IE5vZGUgfCBudWxsID0gd2Fsa2VyLm5leHROb2RlKCk7XG5cbiAgd2hpbGUgKGN1cnJlbnROb2RlKSB7XG4gICAgaWYgKCFpc0hUTUxFbGVtZW50KGN1cnJlbnROb2RlKSkge1xuICAgICAgY3VycmVudE5vZGUgPSB3YWxrZXIubmV4dE5vZGUoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGxldCBwYXJlbnQgPSBjdXJyZW50Tm9kZS5wYXJlbnROb2RlO1xuICAgIGxldCBpc0lub3BlcmFibGUgPSBmYWxzZTtcblxuICAgIHdoaWxlIChwYXJlbnQgJiYgIWlzSW5vcGVyYWJsZSkge1xuICAgICAgaWYgKFxuICAgICAgICBrbm93bklnbm9yZXMuaGFzKHBhcmVudCkgfHxcbiAgICAgICAgKGlzSFRNTEVsZW1lbnQocGFyZW50KSAmJlxuICAgICAgICAgIChwYXJlbnQuaGFzQXR0cmlidXRlKERpcmVjdGl2ZS5FYWNoKSB8fFxuICAgICAgICAgICAgcGFyZW50Lmhhc0F0dHJpYnV0ZShEaXJlY3RpdmUuSWYpIHx8XG4gICAgICAgICAgICBwYXJlbnQuaGFzQXR0cmlidXRlKERpcmVjdGl2ZS5FbHNlKSB8fFxuICAgICAgICAgICAgcGFyZW50Lmhhc0F0dHJpYnV0ZShEaXJlY3RpdmUuRWxzZUlmKSkpXG4gICAgICApIHtcbiAgICAgICAgaXNJbm9wZXJhYmxlID0gdHJ1ZTtcbiAgICAgICAga25vd25JZ25vcmVzLmFkZChjdXJyZW50Tm9kZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZTtcbiAgICB9XG5cbiAgICBpZiAoIWlzSW5vcGVyYWJsZSkge1xuICAgICAgbm9kZXMucHVzaChjdXJyZW50Tm9kZSk7XG4gICAgfVxuXG4gICAgY3VycmVudE5vZGUgPSB3YWxrZXIubmV4dE5vZGUoKTtcbiAgfVxuXG4gIHJldHVybiBub2Rlcztcbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5cbmltcG9ydCB7IEVycm9yQ29kZSwgUGFsZXR0ZUVycm9yIH0gZnJvbSBcIiNlcnJvclwiO1xuaW1wb3J0IHsgTFJVQ2FjaGUsIHNhdmVGcmFnbWVudCB9IGZyb20gXCIjdXRpbFwiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuLi91dGlsL2RvbVwiO1xuaW1wb3J0IHsgUkVGX0FUVFIgfSBmcm9tIFwiLi9jb25zdGFudFwiO1xuaW1wb3J0IHsgRGlyZWN0aXZlIH0gZnJvbSBcIi4vZGlyZWN0aXZlXCI7XG5pbXBvcnQgeyB0eXBlIFBhcnNlZE5vdGF0aW9uLCBwYXJzZU5vdGF0aW9uIH0gZnJvbSBcIi4vc3ludGF4XCI7XG5pbXBvcnQge1xuICB0eXBlIEFueVNjaGVtZSxcbiAgdHlwZSBBdHRyaWJ1dGVVcGRhdGVTY2hlbWUsXG4gIHR5cGUgQ29uZGl0aW9uYWxSZW5kZXJTY2hlbWUsXG4gIHR5cGUgQ29uZGl0aW9uYWxSZW5kZXJTY2hlbWVCcmFuY2gsXG4gIHR5cGUgQ29udGVudFN3YXBTY2hlbWUsXG4gIHR5cGUgTGlzdFJlbmRlclNjaGVtZSxcbiAgVXBkYXRlVHlwZSxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGNvbGxlY3RPcGVyYWJsZU5vZGVzIH0gZnJvbSBcIi4vdXRpbFwiO1xuXG5jb25zdCByZXF1aXJlc05vdGF0aW9uID0gbmV3IFNldDxzdHJpbmc+KFtcbiAgRGlyZWN0aXZlLkVhY2gsXG4gIERpcmVjdGl2ZS5JZixcbiAgRGlyZWN0aXZlLkVsc2VJZixcbiAgRGlyZWN0aXZlLktleSxcbiAgRGlyZWN0aXZlLlN3YXAsXG4gIERpcmVjdGl2ZS5UYWcsXG5dKTtcblxuLyoqXG4gKiBBIEpTT04tc2VyaWFsaXphYmxlIHJlcHJlc2VudGF0aW9uIG9mIGEge0BsaW5rIFRlbXBsYXRlfSBpbnN0YW5jZSwgaW5jbHVkaW5nXG4gKiBldmVyeXRoaW5nIG5lZWRlZCB0byByZWNyZWF0ZSB0aGUgdGVtcGxhdGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGlsZWRUZW1wbGF0ZSB7XG4gIGh0bWw6IHN0cmluZztcbiAgc2NoZW1lczogQW55U2NoZW1lW107XG4gIG5vdGF0aW9uczogUmVjb3JkPHN0cmluZywgUGFyc2VkTm90YXRpb24+O1xufVxuXG5leHBvcnQgY29uc3QgY29tcGlsZWRUZW1wbGF0ZUNhY2hlID0gbmV3IExSVUNhY2hlPFxuICBIVE1MVGVtcGxhdGVFbGVtZW50LFxuICBDb21waWxlZFRlbXBsYXRlXG4+KCk7XG5cbi8qKlxuICogQ29tcGlsZSBhbiB7QGxpbmsgSFRNTFRlbXBsYXRlRWxlbWVudH0gaW50byBhIHtAbGluayBDb21waWxlZFRlbXBsYXRlfSBmb3JcbiAqIGNhY2hpbmcsIGNsb25pbmcsIG9yIHN0b3JhZ2UuXG4gKlxuICogQ29tcGlsZWQgdGVtcGxhdGUgb2JqZWN0cyBjb250YWluIGEgSlNPTi1zZXJpYWxpemFibGUgZGF0YSByZXByZXNlbnRhdGlvbiBvZlxuICogYSB0ZW1wbGF0ZSBhbmQgY2FuIGJlIHByZXBhcmVkIHVzaW5nIHtAbGluayBwcmVwYXJlQ29tcGlsZWRUZW1wbGF0ZX0gdG9cbiAqIGNyZWF0ZSBuZXcgVGVtcGxhdGUgaW5zdGFuY2VzLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY29tcGlsZWQgPSBjb21waWxlVGVtcGxhdGUoJHRlbXBsYXRlRWxlbWVudCk7XG4gKiBjb25zdCBzdHJpbmdpZmllZCA9IEpTT04uc3RyaW5naWZ5KGNvbXBpbGVkKTsgLy8gYSBKU09OIHRlbXBsYXRlIGJ1bmRsZVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21waWxlVGVtcGxhdGUoc291cmNlOiBIVE1MVGVtcGxhdGVFbGVtZW50KTogQ29tcGlsZWRUZW1wbGF0ZSB7XG4gIC8vIENoZWNrIGlmIHRoZSB0ZW1wbGF0ZSBpcyBhbHJlYWR5IGNhY2hlZFxuICBjb25zdCBjYWNoZWRUZW1wbGF0ZSA9IGNvbXBpbGVkVGVtcGxhdGVDYWNoZS5nZXQoc291cmNlKTtcbiAgaWYgKGNhY2hlZFRlbXBsYXRlKSB7XG4gICAgcmV0dXJuIGNhY2hlZFRlbXBsYXRlO1xuICB9XG5cbiAgY29uc3QgcGFyc2VkTm90YXRpb25zID0gbmV3IE1hcDxzdHJpbmcsIFBhcnNlZE5vdGF0aW9uPigpO1xuICBjb25zdCBjb21waWxlZFNjaGVtZXM6IEFueVNjaGVtZVtdID0gW107XG5cbiAgbGV0IG5leHROb2RlUmVmID0gMDtcbiAgY29uc3QgZW5zdXJlTm9kZVJlZiA9IChlbDogSFRNTEVsZW1lbnQpOiBzdHJpbmcgPT4ge1xuICAgIGxldCByZWYgPSBlbC5nZXRBdHRyaWJ1dGUoUkVGX0FUVFIpO1xuICAgIGlmICghcmVmKSB7XG4gICAgICByZWYgPSBgZWwtJHtuZXh0Tm9kZVJlZisrfWA7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoUkVGX0FUVFIsIHJlZik7XG4gICAgfVxuICAgIHJldHVybiByZWY7XG4gIH07XG5cbiAgY29uc3QgY2xvbmVkVGVtcGxhdGVFbGVtZW50ID0gc291cmNlLmNvbnRlbnQuY2xvbmVOb2RlKFxuICAgIHRydWUsXG4gICkgYXMgRG9jdW1lbnRGcmFnbWVudDtcblxuICBjb25zdCBub2RlczogSFRNTEVsZW1lbnRbXSA9IGNvbGxlY3RPcGVyYWJsZU5vZGVzKGNsb25lZFRlbXBsYXRlRWxlbWVudCk7XG5cbiAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgY29uc3QgYWxsQXR0cmlidXRlc0Zvck5vZGUgPSBub2RlLmdldEF0dHJpYnV0ZU5hbWVzKCk7XG5cbiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZU5hbWUgb2YgYWxsQXR0cmlidXRlc0Zvck5vZGUpIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gbm9kZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG5cbiAgICAgIC8vIEJhaWwgcXVpY2tseSBpZiB0aGlzIGlzbid0IGEgZGlyZWN0aXZlXG4gICAgICBpZiAoYXR0cmlidXRlVmFsdWUgPT09IG51bGwgfHwgYXR0cmlidXRlTmFtZVswXSAhPT0gXCI6XCIpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEV4cGVjdCBhbnkgOjprZXkgdG8gaGF2ZSBhbiA6OmVhY2hcbiAgICAgIGlmIChhdHRyaWJ1dGVOYW1lID09PSBEaXJlY3RpdmUuS2V5KSB7XG4gICAgICAgIGlmICghYWxsQXR0cmlidXRlc0Zvck5vZGUuaW5jbHVkZXMoRGlyZWN0aXZlLkVhY2gpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9LRVlfRElSRUNUSVZFKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gRW5zdXJlIHJlcXVpcmVkIG5vdGF0aW9ucyBleGlzdFxuICAgICAgaWYgKHJlcXVpcmVzTm90YXRpb24uaGFzKGF0dHJpYnV0ZU5hbWUpICYmIGF0dHJpYnV0ZVZhbHVlID09PSBcIlwiKSB7XG4gICAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoXG4gICAgICAgICAgRXJyb3JDb2RlLlRFTVBMQVRFX01JU1NJTkdfTk9UQVRJT04sXG4gICAgICAgICAgYXR0cmlidXRlTmFtZSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbGV0IG5vdGF0aW9uID0gcGFyc2VkTm90YXRpb25zLmdldChhdHRyaWJ1dGVWYWx1ZSk7XG5cbiAgICAgIGlmIChub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5vdGF0aW9uID0gcGFyc2VOb3RhdGlvbihhdHRyaWJ1dGVWYWx1ZSk7XG4gICAgICAgIHBhcnNlZE5vdGF0aW9ucy5zZXQoYXR0cmlidXRlVmFsdWUsIG5vdGF0aW9uKTtcbiAgICAgIH1cblxuICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG5cbiAgICAgIC8vIElmIHRoZSBzZWNvbmQgY2hhcmFjdGVyIGlzIG5vdCBhIGNvbG9uLCBpdCBpcyBhIGJpbmRpbmdcbiAgICAgIGlmIChhdHRyaWJ1dGVOYW1lWzFdICE9PSBcIjpcIikge1xuICAgICAgICBjb25zdCBiaW5kTmFtZSA9IGF0dHJpYnV0ZU5hbWUuc2xpY2UoMSk7XG5cbiAgICAgICAgY29uc3Qgc2NoZW1lOiBBdHRyaWJ1dGVVcGRhdGVTY2hlbWUgPSB7XG4gICAgICAgICAgdHlwZTogVXBkYXRlVHlwZS5BdHRyaWJ1dGUsXG4gICAgICAgICAgbm90YXRpb246IHBhcnNlTm90YXRpb24oYXR0cmlidXRlVmFsdWUpLFxuICAgICAgICAgIGF0dHJpYnV0ZTogYmluZE5hbWUsXG4gICAgICAgICAgbm9kZVJlZjogZW5zdXJlTm9kZVJlZihub2RlKSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb21waWxlZFNjaGVtZXMucHVzaChzY2hlbWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBUQUcgQ0hBTkdFIFNDSEVNRVNcbiAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWUgPT09IERpcmVjdGl2ZS5UYWcpIHtcbiAgICAgICAgY29tcGlsZWRTY2hlbWVzLnB1c2goe1xuICAgICAgICAgIHR5cGU6IFVwZGF0ZVR5cGUuVGFnLFxuICAgICAgICAgIG5vdGF0aW9uLFxuICAgICAgICAgIG5vZGVSZWY6IGVuc3VyZU5vZGVSZWYobm9kZSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBMSVNUIFJFTkRFUiBTQ0hFTUVTXG4gICAgICBlbHNlIGlmIChhdHRyaWJ1dGVOYW1lID09PSBEaXJlY3RpdmUuRWFjaCkge1xuICAgICAgICBjb25zdCBub2RlUmVmID0gZW5zdXJlTm9kZVJlZihub2RlKTtcblxuICAgICAgICAvLyBBIDo6a2V5IGRpcmVjdGl2ZSBpcyByZXF1aXJlZCB3aXRoIGFueSA6OmVhY2hcbiAgICAgICAgY29uc3Qga2V5Tm90YXRpb24gPSBub2RlLmdldEF0dHJpYnV0ZShEaXJlY3RpdmUuS2V5KTtcbiAgICAgICAgaWYgKGtleU5vdGF0aW9uID09PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuVEVNUExBVEVfTUlTU0lOR19MSVNUX0tFWSk7XG4gICAgICAgIH1cblxuICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShEaXJlY3RpdmUuS2V5KTtcblxuICAgICAgICBjb25zdCBsaXN0Q29udGVudEh0bWwgPSBub2RlLmlubmVySFRNTDtcblxuICAgICAgICB3aGlsZSAobm9kZS5maXJzdENoaWxkKSB7XG4gICAgICAgICAgbm9kZS5yZW1vdmVDaGlsZChub2RlLmZpcnN0Q2hpbGQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2NoZW1lOiBMaXN0UmVuZGVyU2NoZW1lID0ge1xuICAgICAgICAgIHR5cGU6IFVwZGF0ZVR5cGUuTGlzdCxcbiAgICAgICAgICBub3RhdGlvbixcbiAgICAgICAgICBrZXlOb3RhdGlvbjogcGFyc2VOb3RhdGlvbihrZXlOb3RhdGlvbiksXG4gICAgICAgICAgbm9kZVJlZixcbiAgICAgICAgICBsaXN0Q29udGVudEh0bWwsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29tcGlsZWRTY2hlbWVzLnB1c2goc2NoZW1lKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ09OVEVOVCBTV0FQIFNDSEVNRVNcbiAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWUgPT09IERpcmVjdGl2ZS5Td2FwKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtZTogQ29udGVudFN3YXBTY2hlbWUgPSB7XG4gICAgICAgICAgdHlwZTogVXBkYXRlVHlwZS5Td2FwLFxuICAgICAgICAgIG5vdGF0aW9uLFxuICAgICAgICAgIG5vZGVSZWY6IGVuc3VyZU5vZGVSZWYobm9kZSksXG4gICAgICAgIH07XG5cbiAgICAgICAgY29tcGlsZWRTY2hlbWVzLnB1c2goc2NoZW1lKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ09ORElUSU9OQUwgUkVOREVSIFNDSEVNRVNcbiAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWUgPT09IERpcmVjdGl2ZS5JZikge1xuICAgICAgICBjb25zdCBzY2hlbWU6IENvbmRpdGlvbmFsUmVuZGVyU2NoZW1lID0ge1xuICAgICAgICAgIHR5cGU6IFVwZGF0ZVR5cGUuQ29uZGl0aW9uYWwsXG4gICAgICAgICAgYnJhbmNoZXM6IFtdLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEZpcnN0IGJyYW5jaCAtIHRoaXMgSUZcbiAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoRGlyZWN0aXZlLklmKTtcbiAgICAgICAgY29uc3QgaWZCcmFuY2g6IENvbmRpdGlvbmFsUmVuZGVyU2NoZW1lQnJhbmNoID0ge1xuICAgICAgICAgIHR5cGU6IERpcmVjdGl2ZS5JZixcbiAgICAgICAgICBub3RhdGlvbixcbiAgICAgICAgICBicmFuY2hSb290UmVmOiBlbnN1cmVOb2RlUmVmKG5vZGUpLFxuICAgICAgICAgIGJyYW5jaFRlbXBsYXRlSFRNTDogbm9kZS5pbm5lckhUTUwsXG4gICAgICAgIH07XG5cbiAgICAgICAgc2NoZW1lLmJyYW5jaGVzLnB1c2goaWZCcmFuY2gpO1xuXG4gICAgICAgIGxldCBjb25kTm9kZSA9IG5vZGUubmV4dEVsZW1lbnRTaWJsaW5nO1xuXG4gICAgICAgIC8vIENoZWNrIGZ1dHVyZSBub2RlcyBmb3IgZWxzZS1pZlxuICAgICAgICB3aGlsZSAoY29uZE5vZGU/Lmhhc0F0dHJpYnV0ZShEaXJlY3RpdmUuRWxzZUlmKSkge1xuICAgICAgICAgIGlmICghaXNIVE1MRWxlbWVudChjb25kTm9kZSkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGJhc2VFbHNlSWZOb3RhdGlvbiA9IGNvbmROb2RlLmdldEF0dHJpYnV0ZShEaXJlY3RpdmUuRWxzZUlmKTtcblxuICAgICAgICAgIGlmICghYmFzZUVsc2VJZk5vdGF0aW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKFxuICAgICAgICAgICAgICBFcnJvckNvZGUuVEVNUExBVEVfTUlTU0lOR19OT1RBVElPTixcbiAgICAgICAgICAgICAgRGlyZWN0aXZlLkVsc2VJZixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgdGhlIG5vdGF0aW9uIGhhcyBiZWVuIHBhcnNlZCBiZWZvcmUsIHJldXNlIHRoYXRcbiAgICAgICAgICBsZXQgcGFyc2VkRWxzZUlmTm90YXRpb24gPSBwYXJzZWROb3RhdGlvbnMuZ2V0KGJhc2VFbHNlSWZOb3RhdGlvbik7XG5cbiAgICAgICAgICBpZiAocGFyc2VkRWxzZUlmTm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcGFyc2VkRWxzZUlmTm90YXRpb24gPSBwYXJzZU5vdGF0aW9uKGJhc2VFbHNlSWZOb3RhdGlvbik7XG4gICAgICAgICAgICBwYXJzZWROb3RhdGlvbnMuc2V0KGJhc2VFbHNlSWZOb3RhdGlvbiwgcGFyc2VkRWxzZUlmTm90YXRpb24pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbmROb2RlLnJlbW92ZUF0dHJpYnV0ZShEaXJlY3RpdmUuRWxzZUlmKTtcblxuICAgICAgICAgIGNvbnN0IGVsc2VJZkJyYW5jaDogQ29uZGl0aW9uYWxSZW5kZXJTY2hlbWVCcmFuY2ggPSB7XG4gICAgICAgICAgICB0eXBlOiBEaXJlY3RpdmUuRWxzZUlmLFxuICAgICAgICAgICAgbm90YXRpb246IHBhcnNlZEVsc2VJZk5vdGF0aW9uLFxuICAgICAgICAgICAgYnJhbmNoUm9vdFJlZjogZW5zdXJlTm9kZVJlZihjb25kTm9kZSksXG4gICAgICAgICAgICBicmFuY2hUZW1wbGF0ZUhUTUw6IGNvbmROb2RlLmlubmVySFRNTCxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgc2NoZW1lLmJyYW5jaGVzLnB1c2goZWxzZUlmQnJhbmNoKTtcbiAgICAgICAgICBjb25kTm9kZSA9IGNvbmROb2RlLm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVsc2VcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNvbmROb2RlICYmXG4gICAgICAgICAgaXNIVE1MRWxlbWVudChjb25kTm9kZSkgJiZcbiAgICAgICAgICBjb25kTm9kZT8uaGFzQXR0cmlidXRlKERpcmVjdGl2ZS5FbHNlKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25kTm9kZS5yZW1vdmVBdHRyaWJ1dGUoRGlyZWN0aXZlLkVsc2UpO1xuXG4gICAgICAgICAgY29uc3QgZWxzZUJyYW5jaDogQ29uZGl0aW9uYWxSZW5kZXJTY2hlbWVCcmFuY2ggPSB7XG4gICAgICAgICAgICB0eXBlOiBEaXJlY3RpdmUuRWxzZSxcbiAgICAgICAgICAgIGJyYW5jaFJvb3RSZWY6IGVuc3VyZU5vZGVSZWYoY29uZE5vZGUpLFxuICAgICAgICAgICAgYnJhbmNoVGVtcGxhdGVIVE1MOiBjb25kTm9kZS5pbm5lckhUTUwsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHNjaGVtZS5icmFuY2hlcy5wdXNoKGVsc2VCcmFuY2gpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29tcGlsZWRTY2hlbWVzLnB1c2goc2NoZW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgYXR0cmlidXRlTmFtZSA9PT0gRGlyZWN0aXZlLkVsc2UgfHxcbiAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWUgPT09IERpcmVjdGl2ZS5FbHNlSWZcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfQ09ORElUSU9OQUwpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnNvbGUud2FybihgVGVtcGxhdGU6ICR7YXR0cmlidXRlTmFtZX0gaXMgbm90IGEgdmFsaWQgZGlyZWN0aXZlYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBub3RhdGlvbnM6IFJlY29yZDxzdHJpbmcsIFBhcnNlZE5vdGF0aW9uPiA9IHt9O1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBwYXJzZWROb3RhdGlvbnMpIHtcbiAgICBub3RhdGlvbnNba2V5XSA9IHZhbDtcbiAgfVxuXG4gIGNvbnN0IHRlbXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICB0ZW1wLmFwcGVuZENoaWxkKGNsb25lZFRlbXBsYXRlRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuICBjb25zdCBodG1sID0gdGVtcC5pbm5lckhUTUw7XG5cbiAgY29uc3QgY29tcGlsZWQ6IENvbXBpbGVkVGVtcGxhdGUgPSB7XG4gICAgaHRtbCxcbiAgICBzY2hlbWVzOiBjb21waWxlZFNjaGVtZXMsXG4gICAgbm90YXRpb25zLFxuICB9O1xuXG4gIC8vIENhY2hlIHRoZSBjb21waWxlZCB0ZW1wbGF0ZSBhbmQgaHRtbC9mcmFnbWVudCBjb21ibyB0byBwcmV2ZW50IG5lZWRpbmdcbiAgLy8gdG8gcmUtY3JlYXRlIHRoZSBmcmFnbWVudCBmcm9tIEhUTUwgYWdhaW4gd2hlbiBjb21waWxpbmcgYXQgcnVudGltZVxuICBjb21waWxlZFRlbXBsYXRlQ2FjaGUuc2V0KHNvdXJjZSwgY29tcGlsZWQpO1xuICBzYXZlRnJhZ21lbnQoaHRtbCwgY2xvbmVkVGVtcGxhdGVFbGVtZW50KTtcblxuICByZXR1cm4gY29tcGlsZWQ7XG59XG4iLAogICAgIi8qXG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvbXBvbmVudCB9IGZyb20gXCIjY29tcG9uZW50XCI7XG5pbXBvcnQgeyBFcnJvckNvZGUsIFBhbGV0dGVFcnJvciB9IGZyb20gXCIjZXJyb3JcIjtcbmltcG9ydCB7IGlzVGFnTmFtZSB9IGZyb20gXCIjdXRpbFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDU1NUZW1wbGF0ZVN0cmluZ1ZhbHVlKFxuICB2YWw6IHN0cmluZyB8IHR5cGVvZiBDb21wb25lbnQsXG4pOiBzdHJpbmcge1xuICAvLyBDb252ZXJ0IGNvbXBvbmVudCByZWZzIHRvIHRoZWlyIHRhZ25hbWVzXG4gIGlmICh0eXBlb2YgdmFsID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjb25zdCB0YWdOYW1lID0gdmFsLnRhZ05hbWU7XG4gICAgaWYgKCFpc1RhZ05hbWUodGFnTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoXG4gICAgICAgIEVycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX0NPTVBPTkVOVCxcbiAgICAgICAgdmFsLm5hbWUsXG4gICAgICAgIHZhbC50YWdOYW1lLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhZ05hbWU7XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiB2YWw7XG4gIH1cblxuICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX1ZBTFVFLCBTdHJpbmcodmFsKSk7XG59XG5cbi8qKlxuICogQHJldHVybnMgQW4gYXJyYXkgb2Yge0BsaW5rIENTU1N0eWxlU2hlZXR9cyBjb250YWluaW5nIHRoZSBwcm92aWRlZCBDU1NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNzcyhcbiAgc3RyaW5nczogVGVtcGxhdGVTdHJpbmdzQXJyYXksXG4gIC4uLnZhbHVlczogKHN0cmluZyB8IHR5cGVvZiBDb21wb25lbnQ8YW55PilbXVxuKTogQ1NTU3R5bGVTaGVldCB7XG4gIGxldCByZXN1bHQgPSBzdHJpbmdzWzBdID8/IFwiXCI7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBuZXh0VmFsID0gdmFsdWVzW2ldID8/IFwiXCI7XG4gICAgY29uc3QgbmV4dFN0ciA9IHN0cmluZ3NbaSArIDFdID8/IFwiXCI7XG4gICAgcmVzdWx0ICs9IHBhcnNlQ1NTVGVtcGxhdGVTdHJpbmdWYWx1ZShuZXh0VmFsKTtcbiAgICByZXN1bHQgKz0gbmV4dFN0cjtcbiAgfVxuXG4gIGNvbnN0IHNoZWV0ID0gbmV3IENTU1N0eWxlU2hlZXQoKTtcbiAgc2hlZXQucmVwbGFjZVN5bmMocmVzdWx0KTtcbiAgcmV0dXJuIHNoZWV0O1xufVxuXG5leHBvcnQgdHlwZSBDbGFzc2lmeUlucHV0ID1cbiAgfCBzdHJpbmdcbiAgfCBudW1iZXJcbiAgfCBib29sZWFuXG4gIHwgdW5kZWZpbmVkXG4gIHwgbnVsbFxuICB8IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgfCBDbGFzc2lmeUlucHV0W107XG5cbi8qKlxuICogR2l2ZW4gZmxleGlibGUgaW5wdXQsIGdlbmVyYXRlIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBzZXR0aW5nIGFzIGFuIGh0bWwgY2xhc3NcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzaWZ5KFwibXktY2xhc3NcIiwgXCJhbm90aGVyLWNsYXNzXCIpIC8vIFwibXktY2xhc3MgYW5vdGhlci1jbGFzc1wiXG4gKiBjbGFzc2lmeShbXCJteS1jbGFzc1wiLCBcImFub3RoZXItY2xhc3NcIl0pIC8vIFwibXktY2xhc3MgYW5vdGhlci1jbGFzc1wiXG4gKiBjbGFzc2lmeSh7IGVuYWJsZWQ6IHRydWUsIGRpc2FibGVkOiBmYWxzZSB9KSAvLyBcImVuYWJsZWRcIlxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmeSguLi5hcmdzOiBDbGFzc2lmeUlucHV0W10pOiBzdHJpbmcge1xuICBsZXQgcmVzdWx0U3RyaW5nID0gXCJcIjtcblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYXJncy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBhcmd1bWVudCA9IGFyZ3NbaW5kZXhdO1xuXG4gICAgaWYgKCFhcmd1bWVudCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gU3RyaW5ncy9udW1zIC0+IERpcmVjdCBhcHBlbmRcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50ID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiBhcmd1bWVudCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgaWYgKHJlc3VsdFN0cmluZykge1xuICAgICAgICByZXN1bHRTdHJpbmcgKz0gXCIgXCI7XG4gICAgICB9XG4gICAgICByZXN1bHRTdHJpbmcgKz0gYXJndW1lbnQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgYXJyYXlzIHJlY3Vyc2l2ZWx5XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJndW1lbnQpKSB7XG4gICAgICBjb25zdCBuZXN0ZWRSZXN1bHQgPSBjbGFzc2lmeSguLi5hcmd1bWVudCk7XG4gICAgICBpZiAobmVzdGVkUmVzdWx0KSB7XG4gICAgICAgIGlmIChyZXN1bHRTdHJpbmcpIHtcbiAgICAgICAgICByZXN1bHRTdHJpbmcgKz0gXCIgXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0U3RyaW5nICs9IG5lc3RlZFJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBvYmplY3RzIHdpdGggY29uZGl0aW9uYWwgY2xhc3MgbmFtZXNcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBmb3IgKGNvbnN0IGNsYXNzTmFtZSBpbiBhcmd1bWVudCkge1xuICAgICAgICAvLyBPbmx5IGluY2x1ZGUgY2xhc3MgbmFtZSBpZiBpdHMgdmFsdWUgaXMgdHJ1dGh5XG4gICAgICAgIGlmIChhcmd1bWVudFtjbGFzc05hbWVdKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdFN0cmluZykge1xuICAgICAgICAgICAgcmVzdWx0U3RyaW5nICs9IFwiIFwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHRTdHJpbmcgKz0gY2xhc3NOYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFN0cmluZztcbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwiI2NvbXBvbmVudFwiO1xuaW1wb3J0IHsgRXJyb3JDb2RlLCBQYWxldHRlRXJyb3IgfSBmcm9tIFwiI2Vycm9yXCI7XG5pbXBvcnQgeyBpc1RhZ05hbWUgfSBmcm9tIFwiI3V0aWxcIjtcbmltcG9ydCB7IGlzSFRNTFRlbXBsYXRlRWxlbWVudCB9IGZyb20gXCIuLi91dGlsL2RvbVwiO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUZW1wbGF0ZVN0cmluZ1ZhbHVlKFxuICB2YWw6IHN0cmluZyB8IHR5cGVvZiBDb21wb25lbnQgfCBIVE1MVGVtcGxhdGVFbGVtZW50LFxuKTogc3RyaW5nIHtcbiAgaWYgKGlzSFRNTFRlbXBsYXRlRWxlbWVudCh2YWwpKSB7XG4gICAgcmV0dXJuIHZhbC5pbm5lckhUTUw7XG4gIH1cblxuICBpZiAoQ29tcG9uZW50LmlzQ29tcG9uZW50Q2xhc3ModmFsKSkge1xuICAgIGNvbnN0IHRhZ05hbWUgPSB2YWwudGFnTmFtZTtcbiAgICBpZiAoIWlzVGFnTmFtZSh0YWdOYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihcbiAgICAgICAgRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfQ09NUE9ORU5ULFxuICAgICAgICB2YWwubmFtZSxcbiAgICAgICAgdmFsLnRhZ05hbWUsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGFnTmFtZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGA8c3BhbiA6OnN3YXA9XCIke3ZhbH1cIj48L3NwYW4+YDtcbiAgfVxuXG4gIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfVkFMVUUsIFN0cmluZyh2YWwpKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYW4ge0BsaW5rIEhUTUxUZW1wbGF0ZUVsZW1lbnR9IGZyb20gdGhlIHByb3ZpZGVkIEhUTUwgc3RyaW5nLlxuICpcbiAqIFRoZXNlIEhUTUwgVGVtcGxhdGVzIGNhbiBiZSB1c2VkIGFzIHN0YW5kYXJkIEhUTUwgVGVtcGxhdGVzLCBvciBhcyB0aGVcbiAqIGZvdW5kYXRpb24gZm9yIGEge0BsaW5rIENvbXBvbmVudH0gb3Igc3RhbmRhbG9uZSB7QGxpbmsgVGVtcGxhdGV9XG4gKlxuICogSW50ZXJwb2xhdGVzIHZhbHVlcyBpbiB0aGUgdGVtcGxhdGUgc3RyaW5nIHRvIHByb3ZpZGUgaGVscGVycyBmb3IgY29tcG9zaW5nXG4gKiB0ZW1wbGF0ZXM6XG4gKlxuICogLSBIVE1MVGVtcGxhdGVFbGVtZW50IHJlZmVyZW5jZXMgYXJlIHNlcmlhbGl6ZWQgdG8gSFRNTCBhbmQgaW5saW5lZFxuICogLSBTdHJpbmdzIGFyZSBtb2RpZmllZCB0byBiZWNvbWUgPHNwYW4+IHRhZ3Mgd2l0aCB0aGUgOjpzd2FwIGRpcmVjdGl2ZSBzZXRcbiAqICAgdG8gdGhlIHN0cmluZyB2YWx1ZS4gVGhpcyBpcyBoZWxwZnVsIHNob3J0aGFuZCBmb3IgY29udGVudCBwbGFjZWhvbGRlcnMuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBUaGlzIHRlbXBsYXRlIHN0cmluZ1xuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0ICR0ZW1wbGF0ZSA9IGh0bWxgXG4gKiA8ZGl2IDpjbGFzcz1cIipjbGFzc25hbWVzXCI+XG4gKiAgICR7XCJAY29udGVudFwifVxuICogPC9kaXY+XG4gKiBgXG4gKiBgYGBcbiAqXG4gKiBQcm9kdWNlcyB0aGlzIHRlbXBsYXRlIGVsZW1lbnQgKHBvcnRyYXllZCBhcyBIVE1MKVxuICpcbiAqIGBgYGh0bWxcbiAqIDx0ZW1wbGF0ZT5cbiAqICAgPGRpdiA6Y2xhc3M9XCIqY2xhc3NuYW1lc1wiPlxuICogICAgIDxzcGFuIDo6c3dhcD1cIkBjb250ZW50XCI+PC9zcGFuPlxuICogICA8L2Rpdj5cbiAqIDwvdGVtcGxhdGU+XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGh0bWwoXG4gIHN0cmluZ3M6IFRlbXBsYXRlU3RyaW5nc0FycmF5LFxuICAuLi52YWx1ZXM6IChcbiAgICB8IGBAJHtzdHJpbmd9YFxuICAgIHwgYCQke3N0cmluZ31gXG4gICAgfCBgIyR7c3RyaW5nfWBcbiAgICB8IGAqJHtzdHJpbmd9YFxuICAgIHwgSFRNTFRlbXBsYXRlRWxlbWVudFxuICAgIHwgdHlwZW9mIENvbXBvbmVudDxhbnk+XG4gIClbXVxuKTogSFRNTFRlbXBsYXRlRWxlbWVudCB7XG4gIGNvbnN0IGZ1bGxTdHJpbmcgPSBzdHJpbmdzLnJlZHVjZSgoYWNjLCBzdHIsIGkpID0+IHtcbiAgICBjb25zdCBwYXJzZWRWYWx1ZSA9IHZhbHVlc1tpXVxuICAgICAgPyBgJHtwYXJzZVRlbXBsYXRlU3RyaW5nVmFsdWUodmFsdWVzW2ldKX1gXG4gICAgICA6IFwiXCI7XG4gICAgcmV0dXJuIGFjYyArIHN0ciArIHBhcnNlZFZhbHVlO1xuICB9LCBcIlwiKTtcblxuICBjb25zdCB0ZW1wbGF0ZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG4gIHRlbXBsYXRlRWxlbWVudC5pbm5lckhUTUwgPSBmdWxsU3RyaW5nO1xuICByZXR1cm4gdGVtcGxhdGVFbGVtZW50O1xufVxuIiwKICAgICJleHBvcnQgY29uc3QgU0tJUFBFRF9KT0IgPSBTeW1ib2woXCJub29wXCIpO1xuZXhwb3J0IHR5cGUgU2tpcHBlZEpvYiA9IHR5cGVvZiBTS0lQUEVEX0pPQjtcbiIsCiAgICAiaW1wb3J0IHsgY2xhc3NpZnkgfSBmcm9tIFwiI2hlbHBlclwiO1xuaW1wb3J0IHsgYXBwbHlBdHRyaWJ1dGUsIHNlcmlhbGl6ZUF0dHJpYnV0ZSB9IGZyb20gXCIjdXRpbFwiO1xuaW1wb3J0IHR5cGUgeyBBdHRyaWJ1dGVVcGRhdGVQbGFuIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBTS0lQUEVEX0pPQiwgdHlwZSBTa2lwcGVkSm9iIH0gZnJvbSBcIi4vY29tbW9uXCI7XG5cbmV4cG9ydCB0eXBlIEF0dHJpYnV0ZVVwZGF0ZUpvYiA9IFtcbiAgbm9kZTogSFRNTEVsZW1lbnQsXG4gIG5hbWU6IHN0cmluZyxcbiAgdmFsdWU6IHN0cmluZyB8IG51bGwsXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZUF0dHJpYnV0ZUpvYihcbiAgcGxhbjogQXR0cmlidXRlVXBkYXRlUGxhbixcbiAgdmFsdWVzOiBNYXA8c3RyaW5nLCB1bmtub3duPixcbik6IEF0dHJpYnV0ZVVwZGF0ZUpvYiB8IFNraXBwZWRKb2Ige1xuICBjb25zdCByYXdWYWx1ZSA9IHZhbHVlcy5nZXQocGxhbi5ub3RhdGlvbi5iYXNlKTtcbiAgbGV0IHZhbHVlID0gdHlwZW9mIHJhd1ZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyByYXdWYWx1ZShwbGFuLm5vZGUpIDogcmF3VmFsdWU7XG5cbiAgLy8gUGFyc2UgdGhlIHZhbHVlIHdpdGggYGNsYXNzaWZ5YCBpZiBzZXR0aW5nIHRoZSBjbGFzcyBhdHRyaWJ1dGVcbiAgaWYgKHBsYW4uYXR0cmlidXRlID09PSBcImNsYXNzXCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdmFsdWUgPSBjbGFzc2lmeSh2YWx1ZSk7XG4gIH1cblxuICBjb25zdCBzZXJpYWxpemVkVmFsdWUgPSBzZXJpYWxpemVBdHRyaWJ1dGUodmFsdWUpO1xuICBjb25zdCBjdXJyZW50ID0gcGxhbi5ub2RlLmdldEF0dHJpYnV0ZShwbGFuLmF0dHJpYnV0ZSk7XG5cbiAgaWYgKHNlcmlhbGl6ZWRWYWx1ZSAhPT0gY3VycmVudCkge1xuICAgIHJldHVybiBbcGxhbi5ub2RlLCBwbGFuLmF0dHJpYnV0ZSwgc2VyaWFsaXplZFZhbHVlXTtcbiAgfVxuXG4gIHJldHVybiBTS0lQUEVEX0pPQjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bkF0dHJpYnV0ZUpvYnMoam9iczogQXR0cmlidXRlVXBkYXRlSm9iW10pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbbm9kZSwgbmFtZSwgdmFsdWVdIG9mIGpvYnMpIHtcbiAgICBhcHBseUF0dHJpYnV0ZShub2RlLCBuYW1lLCB2YWx1ZSk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgRXJyb3JDb2RlLCBQYWxldHRlRXJyb3IgfSBmcm9tIFwiI2Vycm9yXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4uLy4uL3V0aWwvZG9tXCI7XG5pbXBvcnQgeyBEaXJlY3RpdmUgfSBmcm9tIFwiLi4vZGlyZWN0aXZlXCI7XG5pbXBvcnQgdHlwZSB7XG4gIENvbmRpdGlvbmFsUmVuZGVyUGxhbixcbiAgQ29uZGl0aW9uYWxSZW5kZXJQbGFuQnJhbmNoLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgU2tpcHBlZEpvYiB9IGZyb20gXCIuL2NvbW1vblwiO1xuXG5leHBvcnQgdHlwZSBDb25kaXRpb25hbFJlbmRlckpvYiA9IFtcbiAgcGxhbjogQ29uZGl0aW9uYWxSZW5kZXJQbGFuLFxuICBicmFuY2g6IENvbmRpdGlvbmFsUmVuZGVyUGxhbkJyYW5jaCB8IG51bGwsXG4gIHZhbHVlczogTWFwPHN0cmluZywgdW5rbm93bj4sXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZUNvbmRpdGlvbmFsUmVuZGVySm9iKFxuICBwbGFuOiBDb25kaXRpb25hbFJlbmRlclBsYW4sXG4gIHZhbHVlczogTWFwPHN0cmluZywgdW5rbm93bj4sXG4pOiBDb25kaXRpb25hbFJlbmRlckpvYiB8IFNraXBwZWRKb2Ige1xuICAvLyBEZXRlcm1pbmUgd2hpY2ggYnJhbmNoIHRvIGRpcHNsYXlcbiAgbGV0IGRpc3BsYXllZEJyYW5jaDogQ29uZGl0aW9uYWxSZW5kZXJQbGFuQnJhbmNoIHwgbnVsbCA9IG51bGw7XG5cbiAgZm9yIChjb25zdCBicmFuY2ggb2YgcGxhbi5icmFuY2hlcykge1xuICAgIGlmIChicmFuY2gudHlwZSA9PT0gRGlyZWN0aXZlLkVsc2UpIHtcbiAgICAgIGRpc3BsYXllZEJyYW5jaCA9IGJyYW5jaDtcbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByYXdWYWx1ZSA9IHZhbHVlcy5nZXQoYnJhbmNoLm5vdGF0aW9uLmJhc2UpO1xuICAgICAgY29uc3QgdmFsdWUgPVxuICAgICAgICB0eXBlb2YgcmF3VmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IHJhd1ZhbHVlKHBsYW4uc3RhcnQpIDogcmF3VmFsdWU7XG5cbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBkaXNwbGF5ZWRCcmFuY2ggPSBicmFuY2g7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBbcGxhbiwgZGlzcGxheWVkQnJhbmNoLCB2YWx1ZXNdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuQ29uZGl0aW9uYWxSZW5kZXJKb2JzKGpvYnM6IENvbmRpdGlvbmFsUmVuZGVySm9iW10pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbcGxhbiwgYnJhbmNoLCB2YWx1ZXNdIG9mIGpvYnMpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBwbGFuLnN0YXJ0LnBhcmVudE5vZGU7XG5cbiAgICBpZiAoIXBhcmVudCkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuVEVNUExBVEVfUEFSRU5UX1JFUVVJUkVEKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgY3VycmVudCByb290IGFuZCBicmFuY2ggcm9vdCBkaWZmZXIsIHJlbW92ZSBjb250ZW50XG4gICAgaWYgKGJyYW5jaCA9PT0gbnVsbCB8fCAhT2JqZWN0LmlzKHBsYW4uY3VycmVudFJvb3QsIGJyYW5jaC5icmFuY2hSb290KSkge1xuICAgICAgLy8gUmVtb3ZlIGV4aXN0aW5nIGNvbnRlbnQgaWYgdGhlIGJyYW5jaCBoYXMgY2hhbmdlZFxuICAgICAgY29uc3Qgbm9kZXNUb1JlbW92ZSA9IG5ldyBTZXQ8Tm9kZT4oKTtcblxuICAgICAgbGV0IG5vZGU6IE5vZGUgfCBudWxsID0gcGxhbi5zdGFydDtcbiAgICAgIHdoaWxlIChub2RlICYmIG5vZGUgIT09IHBsYW4uZW5kKSB7XG4gICAgICAgIGlmIChpc0hUTUxFbGVtZW50KG5vZGUpKSB7XG4gICAgICAgICAgbm9kZXNUb1JlbW92ZS5hZGQobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgdG9SZW1vdmUgb2Ygbm9kZXNUb1JlbW92ZSkge1xuICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQodG9SZW1vdmUpO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGVuIGFkZCB0aGUgYnJhbmNoIHJvb3QgaWYgbmVlZCBiZVxuICAgICAgaWYgKGJyYW5jaCkge1xuICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGJyYW5jaC5icmFuY2hSb290LCBwbGFuLmVuZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTnVsbCBicmFuY2ggLT4gUmVuZGVyIG5vdGhpbmdcbiAgICBpZiAoYnJhbmNoID09PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UgcmVuZGVyIGJyYW5jaCB0ZW1wbGF0ZVxuICAgIGJyYW5jaC5icmFuY2hUZW1wbGF0ZS5yZW5kZXJXaXRoVmFsdWVzKGJyYW5jaC5icmFuY2hSb290LCB2YWx1ZXMpO1xuICB9XG59XG4iLAogICAgImltcG9ydCB7IEVycm9yQ29kZSwgUGFsZXR0ZUVycm9yIH0gZnJvbSBcIiNlcnJvclwiO1xuaW1wb3J0IHsgYXBwbHlFbGVtZW50QXR0cmlidXRlcywgZm9ybWF0QXR0cmlidXRlUmVjb3JkIH0gZnJvbSBcIiN1dGlsXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4uLy4uL3V0aWwvZG9tXCI7XG5pbXBvcnQgeyBidWlsZFZhbHVlQWNjZXNzb3IgfSBmcm9tIFwiLi4vc3ludGF4XCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSwgdHlwZSBUZW1wbGF0ZUNvbnRleHQgfSBmcm9tIFwiLi4vdGVtcGxhdGVcIjtcbmltcG9ydCB0eXBlIHsgTGlzdFJlbmRlclBsYW4gfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgU2tpcHBlZEpvYiB9IGZyb20gXCIuL2NvbW1vblwiO1xuXG5leHBvcnQgdHlwZSBMaXN0UmVuZGVySm9iSXRlbSA9IHtcbiAgY29udGV4dDogVGVtcGxhdGVDb250ZXh0O1xuICBhdHRyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD47XG4gIHJvb3Q6IEhUTUxFbGVtZW50O1xuICB0ZW1wbGF0ZTogVGVtcGxhdGU7XG59O1xuXG5leHBvcnQgdHlwZSBMaXN0UmVuZGVySm9iID0gW3BsYW46IExpc3RSZW5kZXJQbGFuLCBsaXN0OiBMaXN0UmVuZGVySm9iSXRlbVtdXTtcblxuZnVuY3Rpb24gZmV0Y2hMaXN0RGF0YShcbiAgcGxhbjogTGlzdFJlbmRlclBsYW4sXG4gIHZhbHVlczogTWFwPHN0cmluZywgdW5rbm93bj4sXG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdIHtcbiAgY29uc3Qgbm90YXRpb25WYWx1ZSA9IHZhbHVlcy5nZXQocGxhbi5ub3RhdGlvbi5iYXNlKTtcbiAgY29uc3QgZXZhbHVhdGVkVmFsdWUgPVxuICAgIHR5cGVvZiBub3RhdGlvblZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gbm90YXRpb25WYWx1ZShwbGFuLnN0YXJ0TWFya2VyLnBhcmVudE5vZGUpXG4gICAgICA6IG5vdGF0aW9uVmFsdWU7XG5cbiAgaWYgKGV2YWx1YXRlZFZhbHVlID09PSBudWxsIHx8IGV2YWx1YXRlZFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShldmFsdWF0ZWRWYWx1ZSkpIHtcbiAgICByZXR1cm4gZXZhbHVhdGVkVmFsdWU7XG4gIH1cblxuICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX0xJU1RfREFUQSk7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RIVE1MRWxlbWVudHMoc3RhcnQ6IE5vZGUsIGVuZDogTm9kZSk6IFNldDxIVE1MRWxlbWVudD4ge1xuICBsZXQgbm9kZTogTm9kZSB8IG51bGwgPSBzdGFydDtcbiAgY29uc3Qgbm9kZVNldCA9IG5ldyBTZXQ8SFRNTEVsZW1lbnQ+KCk7XG5cbiAgd2hpbGUgKG5vZGUgJiYgbm9kZSAhPT0gZW5kKSB7XG4gICAgaWYgKGlzSFRNTEVsZW1lbnQobm9kZSkpIHtcbiAgICAgIG5vZGVTZXQuYWRkKG5vZGUpO1xuICAgIH1cblxuICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuICB9XG5cbiAgcmV0dXJuIG5vZGVTZXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlTGlzdFJlbmRlckpvYihcbiAgcGxhbjogTGlzdFJlbmRlclBsYW4sXG4gIHZhbHVlczogTWFwPHN0cmluZywgdW5rbm93bj4sXG4pOiBMaXN0UmVuZGVySm9iIHwgU2tpcHBlZEpvYiB7XG4gIC8vIEZldGNoIHRoZSBkYXRhIGZvciByZW5kZXJpbmcgdGhlIHVwZGF0ZWQgbGlzdCBpdGVtc1xuICBjb25zdCBsaXN0RGF0YSA9IGZldGNoTGlzdERhdGEocGxhbiwgdmFsdWVzKTtcblxuICAvLyBFbXB0eSAtPiBSZW1vdmUgdGhlIGxpc3QgY29udGVudHMgZW50aXJlbHkgYW5kIGV4aXRcbiAgaWYgKGxpc3REYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbcGxhbiwgW11dO1xuICB9XG5cbiAgLy8gQ29sbGVjdCBleGlzdGluZyBlbGVtZW50cyBmcm9tIHRoZSBET00gZm9yIGFzc2Vzc21lbnRcbiAgY29uc3Qge1xuICAgIHJvd1RlbXBsYXRlc0J5Um9vdCxcbiAgICByb3dUZW1wbGF0ZUVsZW1lbnQsXG4gICAgcm93Um9vdFByb3RvdHlwZTogcm93Um9vdEVsZW1lbnQsXG4gIH0gPSBwbGFuO1xuICBjb25zdCBrZXlBY2Nlc3NvciA9IGJ1aWxkVmFsdWVBY2Nlc3NvcihwbGFuLmtleU5vdGF0aW9uKTtcbiAgY29uc3QgbGlzdFJlbmRlckNvbnRleHRzOiBNYXA8dW5rbm93biwgTGlzdFJlbmRlckpvYkl0ZW0+ID0gbmV3IE1hcCgpO1xuXG4gIGZvciAoY29uc3QgaXRlbSBvZiBsaXN0RGF0YSkge1xuICAgIGNvbnN0IGNvbnRleHQ6IFRlbXBsYXRlQ29udGV4dCA9IHtcbiAgICAgIGl0ZW0sXG4gICAgfTtcblxuICAgIGNvbnN0IGtleSA9IGtleUFjY2Vzc29yKGNvbnRleHQpO1xuXG4gICAgaWYgKGxpc3RSZW5kZXJDb250ZXh0cy5oYXMoa2V5KSkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihcbiAgICAgICAgRXJyb3JDb2RlLlRFTVBMQVRFX0RVUExJQ0FURV9MSVNUX0tFWSxcbiAgICAgICAgU3RyaW5nKGtleSksXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEdldCBvciBjcmVhdGUgdGhlIEhUTUwgRWxlbWVudCB3ZSBleHBlY3QgdG8gc2VlIGhlcmVcbiAgICBsZXQgcm93Um9vdCA9IHBsYW4ucm93Um9vdHNCeUtleS5nZXQoa2V5KTtcblxuICAgIGlmIChyb3dSb290ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJvd1Jvb3QgPSByb3dSb290RWxlbWVudC5jbG9uZU5vZGUoZmFsc2UpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgcGxhbi5yb3dSb290c0J5S2V5LnNldChrZXksIHJvd1Jvb3QpO1xuICAgIH1cblxuICAgIC8vIEdldCBvciBjcmVhdGUgdGhlIHRlbXBsYXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcm93IHJvb3RcbiAgICBsZXQgcm93VGVtcGxhdGUgPSByb3dUZW1wbGF0ZXNCeVJvb3QuZ2V0KHJvd1Jvb3QpO1xuXG4gICAgaWYgKHJvd1RlbXBsYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJvd1RlbXBsYXRlID0gbmV3IFRlbXBsYXRlKHJvd1RlbXBsYXRlRWxlbWVudCk7XG4gICAgICByb3dUZW1wbGF0ZXNCeVJvb3Quc2V0KHJvd1Jvb3QsIHJvd1RlbXBsYXRlKTtcbiAgICB9XG5cbiAgICBjb25zdCBqb2JJdGVtOiBMaXN0UmVuZGVySm9iSXRlbSA9IHtcbiAgICAgIGNvbnRleHQsXG4gICAgICByb290OiByb3dSb290LFxuICAgICAgdGVtcGxhdGU6IHJvd1RlbXBsYXRlLFxuICAgICAgYXR0cnM6IGZvcm1hdEF0dHJpYnV0ZVJlY29yZChpdGVtKSxcbiAgICB9O1xuXG4gICAgbGlzdFJlbmRlckNvbnRleHRzLnNldChrZXksIGpvYkl0ZW0pO1xuICB9XG5cbiAgLy8gQ2xlYW4gdXAgY2FjaGVkIGRhdGFcbiAgZm9yIChjb25zdCBba2V5LCByb290XSBvZiBwbGFuLnJvd1Jvb3RzQnlLZXkpIHtcbiAgICBpZiAoIWxpc3RSZW5kZXJDb250ZXh0cy5oYXMoa2V5KSkge1xuICAgICAgcGxhbi5yb3dSb290c0J5S2V5LmRlbGV0ZShrZXkpO1xuICAgICAgcGxhbi5yb3dUZW1wbGF0ZXNCeVJvb3QuZGVsZXRlKHJvb3QpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBbcGxhbiwgQXJyYXkuZnJvbShsaXN0UmVuZGVyQ29udGV4dHMudmFsdWVzKCkpXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bkxpc3RSZW5kZXJKb2JzKGpvYnM6IExpc3RSZW5kZXJKb2JbXSk6IHZvaWQge1xuICBmb3IgKGNvbnN0IFtwbGFuLCByZW5kZXJJdGVtc10gb2Ygam9icykge1xuICAgIGNvbnN0IHsgZW5kTWFya2VyLCBsaXN0Q29udGFpbmVyOiBsaXN0Q29udGFpbmVyRWxlbWVudCB9ID0gcGxhbjtcblxuICAgIC8vIEZhc3QgcGF0aCBmb3IgZW1wdHkgbGlzdHMgLT4gUmVtb3ZlIGV2ZXJ5dGhpbmcgYW5kIGNvbnRpbnVlXG4gICAgaWYgKHJlbmRlckl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZm9yIChjb25zdCByb290IG9mIHBsYW4ucm93Um9vdHNCeUtleS52YWx1ZXMoKSkge1xuICAgICAgICByb290LnJlbW92ZSgpO1xuICAgICAgfVxuICAgICAgcGxhbi5yb3dSb290c0J5S2V5LmNsZWFyKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UsIHNjYW4gdGhlIGN1cnJlbnQgbm9kZXMgYW5kIG1vZGlmeSBhcyBuZWVkZWRcbiAgICBjb25zdCBleGlzdGluZ0RPTU5vZGVzID0gQXJyYXkuZnJvbShcbiAgICAgIGNvbGxlY3RIVE1MRWxlbWVudHMocGxhbi5zdGFydE1hcmtlciwgcGxhbi5lbmRNYXJrZXIpLFxuICAgICk7XG5cbiAgICBjb25zdCByb290c1RvS2VlcCA9IG5ldyBTZXQ8SFRNTEVsZW1lbnQ+KCk7XG5cbiAgICBsZXQgZXhpc3RpbmdET01Ob2RlSWR4ID0gMDtcblxuICAgIGZvciAoY29uc3QgcmVuZGVySXRlbSBvZiByZW5kZXJJdGVtcykge1xuICAgICAgY29uc3QgeyByb290LCBhdHRyczogYXR0ck1hcCwgY29udGV4dCwgdGVtcGxhdGUgfSA9IHJlbmRlckl0ZW07XG4gICAgICBjb25zdCBleGlzdGluZ0RPTU5vZGUgPSBleGlzdGluZ0RPTU5vZGVzW2V4aXN0aW5nRE9NTm9kZUlkeF07XG5cbiAgICAgIC8vIFNwcmVhZCBpdGVtIGFzIGF0dHJpYnV0ZXMgb24gdGhlIHJvb3QgYW5kIHVwZGF0ZSB0aGUgdGVtcGxhdGVcbiAgICAgIGFwcGx5RWxlbWVudEF0dHJpYnV0ZXMocm9vdCwgYXR0ck1hcCk7XG4gICAgICB0ZW1wbGF0ZS5yZW5kZXIocm9vdCwgY29udGV4dCk7XG5cbiAgICAgIHJvb3RzVG9LZWVwLmFkZChyb290KTtcblxuICAgICAgLy8gTm9kZSBpcyB0aGUgZXhpc3RpbmcgRE9NIE5vZGUsIGNvbnRpbnVlXG4gICAgICBpZiAoT2JqZWN0LmlzKGV4aXN0aW5nRE9NTm9kZSwgcm9vdCkpIHtcbiAgICAgICAgZXhpc3RpbmdET01Ob2RlSWR4ICs9IDE7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBObyBleGlzdGluZyBub2RlIC0+IGFwcGVuZCBpdGVtXG4gICAgICBpZiAoIWV4aXN0aW5nRE9NTm9kZSkge1xuICAgICAgICBsaXN0Q29udGFpbmVyRWxlbWVudC5pbnNlcnRCZWZvcmUocm9vdCwgZW5kTWFya2VyKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIERPTSBub2RlIGV4aXN0cyBidXQgaXNuJ3QgdGhlIG9uZSB3ZSdyZSBsb29raW5nIGZvci4gSW5zZXJ0IGJlZm9yZS5cbiAgICAgIGxpc3RDb250YWluZXJFbGVtZW50Lmluc2VydEJlZm9yZShyb290LCBleGlzdGluZ0RPTU5vZGUpO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIG9sZCBlbGVtZW50c1xuICAgIGZvciAoY29uc3Qgcm9vdCBvZiBleGlzdGluZ0RPTU5vZGVzKSB7XG4gICAgICBpZiAoIXJvb3RzVG9LZWVwLmhhcyhyb290KSkge1xuICAgICAgICByb290LnJlbW92ZSgpO1xuICAgICAgICBwbGFuLnJvd1RlbXBsYXRlc0J5Um9vdC5kZWxldGUocm9vdCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLAogICAgImltcG9ydCB7IEVycm9yQ29kZSwgUGFsZXR0ZUVycm9yIH0gZnJvbSBcIiNlcnJvclwiO1xuaW1wb3J0IHsgaXNDb21tZW50LCBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4uLy4uL3V0aWwvZG9tXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRlbnRTd2FwUGxhbiB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgU0tJUFBFRF9KT0IsIHR5cGUgU2tpcHBlZEpvYiB9IGZyb20gXCIuL2NvbW1vblwiO1xuXG5leHBvcnQgdHlwZSBDb250ZW50U3dhcEpvYiA9IFtwbGFuOiBDb250ZW50U3dhcFBsYW4sIHN3YXA6IE5vZGVdO1xuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZUNvbnRlbnRTd2FwSm9iKFxuICBwbGFuOiBDb250ZW50U3dhcFBsYW4sXG4gIHZhbHVlczogTWFwPHN0cmluZywgdW5rbm93bj4sXG4pOiBDb250ZW50U3dhcEpvYiB8IFNraXBwZWRKb2Ige1xuICBjb25zdCByYXdWYWx1ZSA9IHZhbHVlcy5nZXQocGxhbi5ub3RhdGlvbi5iYXNlKTtcbiAgY29uc3QgdmFsdWUgPSB0eXBlb2YgcmF3VmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IHJhd1ZhbHVlKHBsYW4ubm9kZSkgOiByYXdWYWx1ZTtcblxuICAvLyBTdHJpbmcsIE51bWJlciwgQm9vbGVhbiAtPiBUZXh0IE5vZGVcbiAgaWYgKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiB8fFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCJcbiAgKSB7XG4gICAgY29uc3QgYXNTdHIgPSBgJHt2YWx1ZX1gO1xuICAgIGlmIChwbGFuLm5vZGUudGV4dENvbnRlbnQgPT09IGFzU3RyKSB7XG4gICAgICByZXR1cm4gU0tJUFBFRF9KT0I7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtwbGFuLCBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhc1N0cildO1xuICB9XG5cbiAgLy8gTnVsbGlzaCB2YWx1ZXMgLT4gQ29tbWVudFxuICBlbHNlIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGlzQ29tbWVudChwbGFuLm5vZGUpKSB7XG4gICAgICByZXR1cm4gU0tJUFBFRF9KT0I7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtwbGFuLCBkb2N1bWVudC5jcmVhdGVDb21tZW50KFwiZW1wdHlcIildO1xuICB9XG5cbiAgLy8gSFRNTEVsZW1lbnQgLT4gU3dhcCBub2Rlc1xuICBlbHNlIGlmIChpc0hUTUxFbGVtZW50KHZhbHVlKSkge1xuICAgIGlmIChPYmplY3QuaXMocGxhbi5ub2RlLCB2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBTS0lQUEVEX0pPQjtcbiAgICB9XG5cbiAgICByZXR1cm4gW3BsYW4sIHZhbHVlLmNsb25lTm9kZSh0cnVlKV07XG4gIH1cblxuICAvLyBBbnl0aGluZyBlbHNlIC0+IFVuc3VwcG9ydGVkXG4gIGVsc2Uge1xuICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoXG4gICAgICBFcnJvckNvZGUuSU5WQUxJRF9DT05URU5ULFxuICAgICAgdHlwZW9mIHZhbHVlLFxuICAgICAgSlNPTi5zdHJpbmdpZnkodmFsdWUpLFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bkNvbnRlbnRTd2FwSm9icyhqb2JzOiBDb250ZW50U3dhcEpvYltdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW3BsYW4sIHJlcGxhY2VdIG9mIGpvYnMpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBwbGFuLm5vZGUucGFyZW50Tm9kZTtcblxuICAgIGlmICghcGFyZW50KSB7XG4gICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuIGluIHByYWN0aWNlXG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5JTlZBUklBTlQpO1xuICAgIH1cblxuICAgIHBhcmVudC5yZXBsYWNlQ2hpbGQocmVwbGFjZSwgcGxhbi5ub2RlKTtcbiAgICBwbGFuLm5vZGUgPSByZXBsYWNlO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgVGFnQ2hhbmdlUGxhbiB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgU0tJUFBFRF9KT0IsIHR5cGUgU2tpcHBlZEpvYiB9IGZyb20gXCIuL2NvbW1vblwiO1xuXG5leHBvcnQgdHlwZSBUYWdDaGFuZ2VKb2IgPSBbcGxhbjogVGFnQ2hhbmdlUGxhbiwgbmV3VGFnOiBzdHJpbmddO1xuXG4vKipcbiAqIEdpdmVuIGFuIGVsZW1lbnQsIHJlcGxhY2UgaXQgd2l0aCBhIGRpZmZlcmVudCB0YWcsIGFkb3B0aW5nIGFsbCBhdHRyaWJ1dGVzXG4gKiBhbmQgY2hpbGQgZWxlbWVudHMuXG4gKiBAcGFyYW0gJHRhcmdldCBUaGUgZWxlbWVudCB0byBzd2FwIG91dFxuICogQHBhcmFtIG5ld1RhZyBUaGUgbmV3IEhUTUwgdGFnTmFtZSB0byB1c2VcbiAqIEByZXR1cm5zIFRoZSBuZXdseSBzd2FwcGVkLWluIGVsZW1lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoYW5nZVRhZygkdGFyZ2V0OiBIVE1MRWxlbWVudCwgbmV3VGFnOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB7XG4gIGNvbnN0ICRuZXdFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmV3VGFnKTtcblxuICB3aGlsZSAoJHRhcmdldC5maXJzdENoaWxkICE9PSBudWxsKSB7XG4gICAgJG5ld0VsLmFwcGVuZENoaWxkKCR0YXJnZXQuZmlyc3RDaGlsZCk7XG4gIH1cblxuICBmb3IgKGNvbnN0IGF0dHJOYW1lIG9mICR0YXJnZXQuZ2V0QXR0cmlidXRlTmFtZXMoKSkge1xuICAgIGNvbnN0IHZhbCA9ICR0YXJnZXQuZ2V0QXR0cmlidXRlKGF0dHJOYW1lKTtcblxuICAgIGlmICh2YWwgIT09IG51bGwpIHtcbiAgICAgICRuZXdFbC5zZXRBdHRyaWJ1dGUoYXR0ck5hbWUsIHZhbCk7XG4gICAgfVxuICB9XG5cbiAgJHRhcmdldC5yZXBsYWNlV2l0aCgkbmV3RWwpO1xuICByZXR1cm4gJG5ld0VsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZVRhZ0NoYW5nZUpvYihcbiAgcGxhbjogVGFnQ2hhbmdlUGxhbixcbiAgdmFsdWVzOiBNYXA8c3RyaW5nLCB1bmtub3duPixcbik6IFRhZ0NoYW5nZUpvYiB8IFNraXBwZWRKb2Ige1xuICBjb25zdCByYXdWYWx1ZSA9IHZhbHVlcy5nZXQocGxhbi5ub3RhdGlvbi5iYXNlKSA/PyBcIlwiO1xuICBjb25zdCB2YWx1ZSA9IHR5cGVvZiByYXdWYWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gcmF3VmFsdWUocGxhbi5ub2RlKSA6IHJhd1ZhbHVlO1xuICBjb25zdCBuZXh0VGFnID0gYCR7dmFsdWV9YC50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBjdXJyZW50VGFnID0gcGxhbi5ub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcblxuICBpZiAoIW5leHRUYWcgfHwgbmV4dFRhZyA9PT0gY3VycmVudFRhZykge1xuICAgIHJldHVybiBTS0lQUEVEX0pPQjtcbiAgfVxuXG4gIHJldHVybiBbcGxhbiwgbmV4dFRhZ107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5UYWdDaGFuZ2VKb2JzKGpvYnM6IFRhZ0NoYW5nZUpvYltdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW3BsYW4sIG5leHRUYWddIG9mIGpvYnMpIHtcbiAgICBwbGFuLm5vZGUgPSBjaGFuZ2VUYWcocGxhbi5ub2RlLCBuZXh0VGFnKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBFcnJvckNvZGUsIFBhbGV0dGVFcnJvciB9IGZyb20gXCIjZXJyb3JcIjtcbmltcG9ydCB7IHR5cGUgQW55UmVuZGVyUGxhbiwgVXBkYXRlVHlwZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBBdHRyaWJ1dGVVcGRhdGVKb2IsXG4gIHByZXBhcmVBdHRyaWJ1dGVKb2IsXG4gIHJ1bkF0dHJpYnV0ZUpvYnMsXG59IGZyb20gXCIuL2F0dHJpYnV0ZVwiO1xuaW1wb3J0IHsgU0tJUFBFRF9KT0IgfSBmcm9tIFwiLi9jb21tb25cIjtcbmltcG9ydCB7XG4gIHR5cGUgQ29uZGl0aW9uYWxSZW5kZXJKb2IsXG4gIHByZXBhcmVDb25kaXRpb25hbFJlbmRlckpvYixcbiAgcnVuQ29uZGl0aW9uYWxSZW5kZXJKb2JzLFxufSBmcm9tIFwiLi9jb25kaXRpb25hbFwiO1xuaW1wb3J0IHtcbiAgdHlwZSBMaXN0UmVuZGVySm9iLFxuICBwcmVwYXJlTGlzdFJlbmRlckpvYixcbiAgcnVuTGlzdFJlbmRlckpvYnMsXG59IGZyb20gXCIuL2xpc3RcIjtcbmltcG9ydCB7XG4gIHR5cGUgQ29udGVudFN3YXBKb2IsXG4gIHByZXBhcmVDb250ZW50U3dhcEpvYixcbiAgcnVuQ29udGVudFN3YXBKb2JzLFxufSBmcm9tIFwiLi9zd2FwXCI7XG5pbXBvcnQge1xuICBwcmVwYXJlVGFnQ2hhbmdlSm9iLFxuICBydW5UYWdDaGFuZ2VKb2JzLFxuICB0eXBlIFRhZ0NoYW5nZUpvYixcbn0gZnJvbSBcIi4vdGFnXCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuL2F0dHJpYnV0ZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29tbW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb25kaXRpb25hbFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbGlzdFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc3dhcFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdGFnXCI7XG5cbmludGVyZmFjZSBSZW5kZXJKb2JzIHtcbiAgY29uZGl0aW9uYWxzOiBDb25kaXRpb25hbFJlbmRlckpvYltdO1xuICBhdHRyaWJ1dGVzOiBBdHRyaWJ1dGVVcGRhdGVKb2JbXTtcbiAgc3dhcHM6IENvbnRlbnRTd2FwSm9iW107XG4gIHRhZ3M6IFRhZ0NoYW5nZUpvYltdO1xuICBsaXN0czogTGlzdFJlbmRlckpvYltdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSm9ic0Zyb21QbGFucyhcbiAgcGxhbnM6IFNldDxBbnlSZW5kZXJQbGFuPixcbiAgbmV3VmFsdWVzOiBNYXA8c3RyaW5nLCB1bmtub3duPixcbik6IFJlbmRlckpvYnMge1xuICBjb25zdCBqb2JzOiBSZW5kZXJKb2JzID0ge1xuICAgIGNvbmRpdGlvbmFsczogW10sXG4gICAgYXR0cmlidXRlczogW10sXG4gICAgc3dhcHM6IFtdLFxuICAgIHRhZ3M6IFtdLFxuICAgIGxpc3RzOiBbXSxcbiAgfTtcblxuICBmb3IgKGNvbnN0IHBsYW4gb2YgcGxhbnMpIHtcbiAgICBzd2l0Y2ggKHBsYW4udHlwZSkge1xuICAgICAgY2FzZSBVcGRhdGVUeXBlLkNvbmRpdGlvbmFsOiB7XG4gICAgICAgIGNvbnN0IGpvYiA9IHByZXBhcmVDb25kaXRpb25hbFJlbmRlckpvYihwbGFuLCBuZXdWYWx1ZXMpO1xuICAgICAgICBpZiAoam9iICE9PSBTS0lQUEVEX0pPQikge1xuICAgICAgICAgIGpvYnMuY29uZGl0aW9uYWxzLnB1c2goam9iKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgVXBkYXRlVHlwZS5BdHRyaWJ1dGU6IHtcbiAgICAgICAgY29uc3Qgam9iID0gcHJlcGFyZUF0dHJpYnV0ZUpvYihwbGFuLCBuZXdWYWx1ZXMpO1xuICAgICAgICBpZiAoam9iICE9PSBTS0lQUEVEX0pPQikge1xuICAgICAgICAgIGpvYnMuYXR0cmlidXRlcy5wdXNoKGpvYik7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFVwZGF0ZVR5cGUuTGlzdDoge1xuICAgICAgICBjb25zdCBqb2IgPSBwcmVwYXJlTGlzdFJlbmRlckpvYihwbGFuLCBuZXdWYWx1ZXMpO1xuICAgICAgICBpZiAoam9iICE9PSBTS0lQUEVEX0pPQikge1xuICAgICAgICAgIGpvYnMubGlzdHMucHVzaChqb2IpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBVcGRhdGVUeXBlLlN3YXA6IHtcbiAgICAgICAgY29uc3Qgam9iID0gcHJlcGFyZUNvbnRlbnRTd2FwSm9iKHBsYW4sIG5ld1ZhbHVlcyk7XG4gICAgICAgIGlmIChqb2IgIT09IFNLSVBQRURfSk9CKSB7XG4gICAgICAgICAgam9icy5zd2Fwcy5wdXNoKGpvYik7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFVwZGF0ZVR5cGUuVGFnOiB7XG4gICAgICAgIGNvbnN0IGpvYiA9IHByZXBhcmVUYWdDaGFuZ2VKb2IocGxhbiwgbmV3VmFsdWVzKTtcbiAgICAgICAgaWYgKGpvYiAhPT0gU0tJUFBFRF9KT0IpIHtcbiAgICAgICAgICBqb2JzLnRhZ3MucHVzaChqb2IpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gU2hvdWxkIGJlIGltcG9zc2libGUgZ2l2ZW4gYW4gZXhoYXVzdGl2ZSBzd2l0Y2ggY2FzZVxuICAgICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5JTlZBUklBTlQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBqb2JzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhlY3V0ZVJlbmRlckpvYnMoam9iczogUmVuZGVySm9icyk6IHZvaWQge1xuICBydW5Db25kaXRpb25hbFJlbmRlckpvYnMoam9icy5jb25kaXRpb25hbHMpO1xuICBydW5BdHRyaWJ1dGVKb2JzKGpvYnMuYXR0cmlidXRlcyk7XG4gIHJ1bkxpc3RSZW5kZXJKb2JzKGpvYnMubGlzdHMpO1xuICBydW5Db250ZW50U3dhcEpvYnMoam9icy5zd2Fwcyk7XG4gIHJ1blRhZ0NoYW5nZUpvYnMoam9icy50YWdzKTtcbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5pbXBvcnQgeyBFcnJvckNvZGUsIFBhbGV0dGVFcnJvciB9IGZyb20gXCIjZXJyb3JcIjtcbmltcG9ydCB7IGh0bWxUb0ZyYWdtZW50IH0gZnJvbSBcIiN1dGlsXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4uL3V0aWwvZG9tXCI7XG5pbXBvcnQgdHlwZSB7IENvbXBpbGVkVGVtcGxhdGUgfSBmcm9tIFwiLi9jb21waWxlXCI7XG5pbXBvcnQgeyBSRUZfQVRUUiB9IGZyb20gXCIuL2NvbnN0YW50XCI7XG5pbXBvcnQgeyBEaXJlY3RpdmUgfSBmcm9tIFwiLi9kaXJlY3RpdmVcIjtcbmltcG9ydCB7IGJ1aWxkVmFsdWVBY2Nlc3NvciwgdHlwZSBOb3RhdGlvbkFjY2Vzc29yIH0gZnJvbSBcIi4vc3ludGF4XCI7XG5pbXBvcnQgdHlwZSB7IFRlbXBsYXRlIH0gZnJvbSBcIi4vdGVtcGxhdGVcIjtcbmltcG9ydCB7XG4gIHR5cGUgQW55UmVuZGVyUGxhbixcbiAgdHlwZSBBdHRyaWJ1dGVVcGRhdGVQbGFuLFxuICB0eXBlIENvbmRpdGlvbmFsUmVuZGVyUGxhbixcbiAgdHlwZSBDb250ZW50U3dhcFBsYW4sXG4gIHR5cGUgTGlzdFJlbmRlclBsYW4sXG4gIHR5cGUgVGFnQ2hhbmdlUGxhbixcbiAgVXBkYXRlVHlwZSxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGh0bWxTdHJpbmdUb1RlbXBsYXRlIH0gZnJvbSBcIi4vdXRpbFwiO1xuXG4vKipcbiAqIEEgcHJlLXByb2Nlc3NlZCB7QGxpbmsgQ29tcGlsZWRUZW1wbGF0ZX0gcmVzdWx0IGNvbnRhaW5pbmcgdGhlIGJ1bGsgb2YgdGhlXG4gKiBkYXRhIG5lY2Vzc2FyeSB0byBjcmVhdGUgYSB0ZW1wbGF0ZSBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmVwYXJlZFRlbXBsYXRlIHtcbiAgZnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQ7XG4gIHBsYW5zQnlOb3RhdGlvbjogTWFwPHN0cmluZywgU2V0PEFueVJlbmRlclBsYW4+PjtcbiAgbm90YXRpb25BY2Nlc3NvcnM6IE1hcDxzdHJpbmcsIE5vdGF0aW9uQWNjZXNzb3I+O1xuICBzdWJ0ZW1wbGF0ZXM6IFNldDxUZW1wbGF0ZT47XG59XG5cbmNvbnN0IHJlcXVpcmVQYXJlbnROb2RlID0gKG5vZGU6IE5vZGUpOiBOb2RlID0+IHtcbiAgaWYgKCFub2RlLnBhcmVudE5vZGUpIHtcbiAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5URU1QTEFURV9QQVJFTlRfUkVRVUlSRUQpO1xuICB9XG5cbiAgcmV0dXJuIG5vZGUucGFyZW50Tm9kZTtcbn07XG5cbmNvbnN0IGNyZWF0ZUNvbW1lbnRCZWZvcmUgPSAobm9kZTogTm9kZSwgdGV4dCA9IFwiXCIpOiBDb21tZW50ID0+IHtcbiAgY29uc3QgcGFyZW50ID0gcmVxdWlyZVBhcmVudE5vZGUobm9kZSk7XG4gIGNvbnN0IGNvbW1lbnQgPSBkb2N1bWVudC5jcmVhdGVDb21tZW50KHRleHQpO1xuICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNvbW1lbnQsIG5vZGUpO1xuICByZXR1cm4gY29tbWVudDtcbn07XG5cbmNvbnN0IGNyZWF0ZUNvbW1lbnRBZnRlciA9IChub2RlOiBOb2RlLCB0ZXh0ID0gXCJcIik6IENvbW1lbnQgPT4ge1xuICBjb25zdCBwYXJlbnQgPSByZXF1aXJlUGFyZW50Tm9kZShub2RlKTtcbiAgY29uc3QgY29tbWVudCA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQodGV4dCk7XG4gIHBhcmVudC5pbnNlcnRCZWZvcmUoY29tbWVudCwgbm9kZS5uZXh0U2libGluZyk7XG4gIHJldHVybiBjb21tZW50O1xufTtcblxuLyoqXG4gKiBHaXZlbiBhIHtAbGluayBDb21waWxlZFRlbXBsYXRlfSBzdHJ1Y3R1cmUsIHJldHVybiBhbiBvYmplY3QgY29udGFpbmluZyB0aGVcbiAqIGRhdGEgbmVlZGVkIHRvIGNyZWF0ZSBuZXcgVGVtcGxhdGUgaW5zdGFuY2VzLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY29tcGlsZWRUZW1wbGF0ZSA9IGdldENvbXBpbGVkVGVtcGxhdGVKU09OKCk7XG4gKiBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbXBpbGVkVGVtcGxhdGUpO1xuICogY29uc3QgcHJlcGFyZWQgPSBwcmVwYXJlQ29tcGlsZWRUZW1wbGF0ZShwYXJzZWQpO1xuICpcbiAqIC8vIEVsc2V3aGVyZS4uLlxuICpcbiAqIGNvbnN0IHRlbXBsYXRlID0gbmV3IFRlbXBsYXRlKHByZXBhcmVkKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZUNvbXBpbGVkVGVtcGxhdGUoXG4gIGNvbXBpbGVkOiBDb21waWxlZFRlbXBsYXRlLFxuICBwcm90b3R5cGVGcmFnbWVudD86IERvY3VtZW50RnJhZ21lbnQsXG4pOiBQcmVwYXJlZFRlbXBsYXRlIHtcbiAgY29uc3QgcGxhbnNCeU5vdGF0aW9uOiBNYXA8c3RyaW5nLCBTZXQ8QW55UmVuZGVyUGxhbj4+ID0gbmV3IE1hcCgpO1xuICBjb25zdCBub3RhdGlvbkFjY2Vzc29yczogTWFwPHN0cmluZywgTm90YXRpb25BY2Nlc3Nvcj4gPSBuZXcgTWFwKCk7XG4gIGNvbnN0IHN1YnRlbXBsYXRlczogU2V0PFRlbXBsYXRlPiA9IG5ldyBTZXQoKTtcbiAgY29uc3Qgbm9kZVJlZnM6IE1hcDxzdHJpbmcsIEhUTUxFbGVtZW50PiA9IG5ldyBNYXAoKTtcblxuICBmb3IgKGNvbnN0IFtub3RhdGlvbiwgcGFyc2VkXSBvZiBPYmplY3QuZW50cmllcyhjb21waWxlZC5ub3RhdGlvbnMpKSB7XG4gICAgbm90YXRpb25BY2Nlc3NvcnMuc2V0KG5vdGF0aW9uLCBidWlsZFZhbHVlQWNjZXNzb3IocGFyc2VkKSk7XG4gIH1cblxuICBjb25zdCBmcmFnbWVudCA9IHByb3RvdHlwZUZyYWdtZW50ID8/IGh0bWxUb0ZyYWdtZW50KGNvbXBpbGVkLmh0bWwpO1xuXG4gIGNvbnN0IHdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoZnJhZ21lbnQsIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5ULCB7XG4gICAgYWNjZXB0Tm9kZShub2RlOiBIVE1MRWxlbWVudCkge1xuICAgICAgcmV0dXJuIG5vZGUuaGFzQXR0cmlidXRlKFJFRl9BVFRSKVxuICAgICAgICA/IE5vZGVGaWx0ZXIuRklMVEVSX0FDQ0VQVFxuICAgICAgICA6IE5vZGVGaWx0ZXIuRklMVEVSX1NLSVA7XG4gICAgfSxcbiAgfSk7XG5cbiAgbGV0IG1hcmtOb2RlOiBOb2RlIHwgbnVsbCA9IHdhbGtlci5uZXh0Tm9kZSgpO1xuXG4gIHdoaWxlIChtYXJrTm9kZSkge1xuICAgIGlmICghaXNIVE1MRWxlbWVudChtYXJrTm9kZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHJlZiA9IG1hcmtOb2RlLmdldEF0dHJpYnV0ZShSRUZfQVRUUik7XG5cbiAgICBpZiAocmVmID09PSBudWxsKSB7XG4gICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuIGluIHByYWN0aWNlLCBhcyB0aGUgdHJlZSB3YWxrZXIgb25seSBzdXJmYWNlc1xuICAgICAgLy8gZWxlbWVudHMgd2l0aCBhbiBleHRhbnQgbm9kZSByZWYgYXR0cmlidXRlXG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5JTlZBUklBTlQpO1xuICAgIH1cblxuICAgIG5vZGVSZWZzLnNldChyZWYsIG1hcmtOb2RlKTtcbiAgICBtYXJrTm9kZS5yZW1vdmVBdHRyaWJ1dGUoUkVGX0FUVFIpO1xuICAgIG1hcmtOb2RlID0gd2Fsa2VyLm5leHROb2RlKCk7XG4gIH1cblxuICBjb25zdCBhc3NvY2lhdGVQbGFuID0gKHBsYW46IEFueVJlbmRlclBsYW4sIG5vdGF0aW9uOiBzdHJpbmcpID0+IHtcbiAgICBsZXQgbm90YXRpb25QbGFucyA9IHBsYW5zQnlOb3RhdGlvbi5nZXQobm90YXRpb24pO1xuICAgIGlmICghbm90YXRpb25QbGFucykge1xuICAgICAgbm90YXRpb25QbGFucyA9IG5ldyBTZXQoKTtcbiAgICAgIHBsYW5zQnlOb3RhdGlvbi5zZXQobm90YXRpb24sIG5vdGF0aW9uUGxhbnMpO1xuICAgIH1cbiAgICBub3RhdGlvblBsYW5zLmFkZChwbGFuKTtcbiAgfTtcblxuICBjb25zdCBnZXRCeU5vZGVSZWYgPSAobm9kZVJlZjogc3RyaW5nKTogSFRNTEVsZW1lbnQgPT4ge1xuICAgIGNvbnN0IGNhY2hlZCA9IG5vZGVSZWZzLmdldChub2RlUmVmKTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuTUlTU0lOR19OT0RFX1JFRik7XG4gIH07XG5cbiAgZm9yIChjb25zdCBzY2hlbWUgb2YgY29tcGlsZWQuc2NoZW1lcykge1xuICAgIC8vIEh5ZHJhdGUgTGlzdCBzY2hlbWVzIGludG8gTGlzdCBwbGFuc1xuICAgIGlmIChzY2hlbWUudHlwZSA9PT0gVXBkYXRlVHlwZS5MaXN0KSB7XG4gICAgICAvLyBVc2UgdGhlIHByb3RvdHlwZSByb3cgcm9vdCB0byBjcmVhdGUgdGhlIHBsYW5cbiAgICAgIGNvbnN0IGl0ZW1Qcm90b3R5cGUgPSBnZXRCeU5vZGVSZWYoc2NoZW1lLm5vZGVSZWYpO1xuICAgICAgY29uc3QgbGlzdFBhcmVudE5vZGUgPSByZXF1aXJlUGFyZW50Tm9kZShpdGVtUHJvdG90eXBlKTtcbiAgICAgIGNvbnN0IHJvd1Jvb3RQcm90b3R5cGUgPSBpdGVtUHJvdG90eXBlLmNsb25lTm9kZShmYWxzZSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBjb25zdCBzdGFydE1hcmtlciA9IGNyZWF0ZUNvbW1lbnRCZWZvcmUoaXRlbVByb3RvdHlwZSk7XG4gICAgICBjb25zdCBlbmRNYXJrZXIgPSBjcmVhdGVDb21tZW50QWZ0ZXIoaXRlbVByb3RvdHlwZSk7XG5cbiAgICAgIC8vIFJlbW92ZSB0aGUgb3JpZ2luYWwgcm9vdCBwcm90b3R5cGUgc2luY2Ugd2Ugd2lsbCBiZSByZW5kZXJpbmcgbmV3IGl0ZW1zXG4gICAgICBpdGVtUHJvdG90eXBlLnJlbW92ZSgpO1xuXG4gICAgICAvLyBDb3B5IHRoZSBjb250ZW50cyBvZiB0aGUgcm93IGludG8gYSB0ZW1wbGF0ZVxuICAgICAgY29uc3QgdGVtcGxhdGVDb250ZW50RnJhZ21lbnQgPSBodG1sVG9GcmFnbWVudChzY2hlbWUubGlzdENvbnRlbnRIdG1sKTtcbiAgICAgIGNvbnN0IHJvd1RlbXBsYXRlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcbiAgICAgIHJvd1RlbXBsYXRlRWxlbWVudC5jb250ZW50LmFwcGVuZENoaWxkKHRlbXBsYXRlQ29udGVudEZyYWdtZW50KTtcblxuICAgICAgY29uc3QgcGxhbjogTGlzdFJlbmRlclBsYW4gPSB7XG4gICAgICAgIHR5cGU6IFVwZGF0ZVR5cGUuTGlzdCxcbiAgICAgICAgbm90YXRpb246IHNjaGVtZS5ub3RhdGlvbixcbiAgICAgICAga2V5Tm90YXRpb246IHNjaGVtZS5rZXlOb3RhdGlvbixcbiAgICAgICAgbGlzdENvbnRhaW5lcjogbGlzdFBhcmVudE5vZGUsXG4gICAgICAgIHJvd1RlbXBsYXRlRWxlbWVudCxcbiAgICAgICAgcm93Um9vdFByb3RvdHlwZSxcbiAgICAgICAgc3RhcnRNYXJrZXIsXG4gICAgICAgIGVuZE1hcmtlcixcbiAgICAgICAgcm93VGVtcGxhdGVzQnlSb290OiBuZXcgV2Vha01hcCgpLFxuICAgICAgICByb3dSb290c0J5S2V5OiBuZXcgTWFwKCksXG4gICAgICB9O1xuXG4gICAgICBhc3NvY2lhdGVQbGFuKHBsYW4sIHNjaGVtZS5ub3RhdGlvbi5iYXNlKTtcbiAgICB9XG5cbiAgICAvLyBIeWRyYXRlIGNvbmRpdGlvbmFsIHJlbmRlciBzY2hlbWVzIGludG8gcGxhbnNcbiAgICBlbHNlIGlmIChzY2hlbWUudHlwZSA9PT0gVXBkYXRlVHlwZS5Db25kaXRpb25hbCkge1xuICAgICAgLy8gR3JhYiB0aGUgZmlyc3QgYnJhbmNoIGFuZCBpbnNlcnQgdGhlIHN0YXJ0IGNvbW1lbnQgYmVmb3JlIGl0XG4gICAgICBjb25zdCBmaXJzdEJyYW5jaCA9IHNjaGVtZS5icmFuY2hlc1swXTtcbiAgICAgIGlmICghZmlyc3RCcmFuY2gpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuSU5WQVJJQU5UKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlyc3RCcmFuY2hSb290ID0gZ2V0QnlOb2RlUmVmKGZpcnN0QnJhbmNoLmJyYW5jaFJvb3RSZWYpO1xuICAgICAgY29uc3Qgc3RhcnRDb21tZW50ID0gY3JlYXRlQ29tbWVudEJlZm9yZShmaXJzdEJyYW5jaFJvb3QpO1xuXG4gICAgICAvLyBHcmFiIHRoZSBsYXN0IGJyYW5jaCBhbmQgaW5zZXJ0IHRoZSBlbmQgY29tbWVudCBhZnRlciBpdFxuICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvbm9Ob25OdWxsQXNzZXJ0aW9uOiBMb2dpY2FsbHkgZ3VhcmFudGVlZFxuICAgICAgY29uc3QgbGFzdEJyYW5jaCA9IHNjaGVtZS5icmFuY2hlc1tzY2hlbWUuYnJhbmNoZXMubGVuZ3RoIC0gMV0hO1xuICAgICAgY29uc3QgbGFzdEJyYW5jaFJvb3QgPSBnZXRCeU5vZGVSZWYobGFzdEJyYW5jaC5icmFuY2hSb290UmVmKTtcbiAgICAgIGNvbnN0IGVuZENvbW1lbnQgPSBjcmVhdGVDb21tZW50QWZ0ZXIobGFzdEJyYW5jaFJvb3QpO1xuXG4gICAgICBjb25zdCBwbGFuOiBDb25kaXRpb25hbFJlbmRlclBsYW4gPSB7XG4gICAgICAgIHR5cGU6IFVwZGF0ZVR5cGUuQ29uZGl0aW9uYWwsXG4gICAgICAgIHN0YXJ0OiBzdGFydENvbW1lbnQsXG4gICAgICAgIGVuZDogZW5kQ29tbWVudCxcbiAgICAgICAgYnJhbmNoZXM6IFtdLFxuICAgICAgfTtcblxuICAgICAgLy8gSHlkcmF0ZSB0aGUgYnJhbmNoZXNcbiAgICAgIGZvciAoY29uc3QgYnJhbmNoIG9mIHNjaGVtZS5icmFuY2hlcykge1xuICAgICAgICAvLyBJZiBhbmQgRWxzZS1JZiBoYXZlIG5vdGF0aW9uc1xuICAgICAgICBpZiAoYnJhbmNoLnR5cGUgPT09IERpcmVjdGl2ZS5JZiB8fCBicmFuY2gudHlwZSA9PT0gRGlyZWN0aXZlLkVsc2VJZikge1xuICAgICAgICAgIGNvbnN0IGJyYW5jaFJvb3QgPSBnZXRCeU5vZGVSZWYoYnJhbmNoLmJyYW5jaFJvb3RSZWYpO1xuICAgICAgICAgIGNvbnN0IGJyYW5jaFRlbXBsYXRlID0gaHRtbFN0cmluZ1RvVGVtcGxhdGUoXG4gICAgICAgICAgICBicmFuY2guYnJhbmNoVGVtcGxhdGVIVE1MLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBBZGQgdGhlIGNoaWxkIHRlbXBsYXRlXG4gICAgICAgICAgc3VidGVtcGxhdGVzLmFkZChicmFuY2hUZW1wbGF0ZSk7XG5cbiAgICAgICAgICBwbGFuLmJyYW5jaGVzLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogYnJhbmNoLnR5cGUsXG4gICAgICAgICAgICBub3RhdGlvbjogYnJhbmNoLm5vdGF0aW9uLFxuICAgICAgICAgICAgYnJhbmNoUm9vdDogZ2V0QnlOb2RlUmVmKGJyYW5jaC5icmFuY2hSb290UmVmKSxcbiAgICAgICAgICAgIGJyYW5jaFRlbXBsYXRlOiBodG1sU3RyaW5nVG9UZW1wbGF0ZShicmFuY2guYnJhbmNoVGVtcGxhdGVIVE1MKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBhc3NvY2lhdGVQbGFuKHBsYW4sIGJyYW5jaC5ub3RhdGlvbi5iYXNlKTtcbiAgICAgICAgICBicmFuY2hSb290LnJlbW92ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRWxzZSBpcyBiaW5hcnksIG5vIG5vdGF0aW9uIGFzc29jaWF0ZWRcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgcGxhbi5icmFuY2hlcy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6IGJyYW5jaC50eXBlLFxuICAgICAgICAgICAgYnJhbmNoUm9vdDogZ2V0QnlOb2RlUmVmKGJyYW5jaC5icmFuY2hSb290UmVmKSxcbiAgICAgICAgICAgIGJyYW5jaFRlbXBsYXRlOiBodG1sU3RyaW5nVG9UZW1wbGF0ZShicmFuY2guYnJhbmNoVGVtcGxhdGVIVE1MKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFN3YXAvVGFnIGFyZSB0aGUgc2FtZSBzaWduYXR1cmVcbiAgICBlbHNlIGlmIChcbiAgICAgIHNjaGVtZS50eXBlID09PSBVcGRhdGVUeXBlLlN3YXAgfHxcbiAgICAgIHNjaGVtZS50eXBlID09PSBVcGRhdGVUeXBlLlRhZ1xuICAgICkge1xuICAgICAgY29uc3QgcGxhbjogQ29udGVudFN3YXBQbGFuIHwgVGFnQ2hhbmdlUGxhbiA9IHtcbiAgICAgICAgdHlwZTogc2NoZW1lLnR5cGUsXG4gICAgICAgIG5vdGF0aW9uOiBzY2hlbWUubm90YXRpb24sXG4gICAgICAgIG5vZGU6IGdldEJ5Tm9kZVJlZihzY2hlbWUubm9kZVJlZiksXG4gICAgICB9O1xuXG4gICAgICBhc3NvY2lhdGVQbGFuKHBsYW4sIHNjaGVtZS5ub3RhdGlvbi5iYXNlKTtcbiAgICB9XG5cbiAgICAvLyBIeWRyYXRlIEF0dHJpYnV0ZSB1cGRhdGUgcGxhbnNcbiAgICBlbHNlIGlmIChzY2hlbWUudHlwZSA9PT0gVXBkYXRlVHlwZS5BdHRyaWJ1dGUpIHtcbiAgICAgIGNvbnN0IHBsYW46IEF0dHJpYnV0ZVVwZGF0ZVBsYW4gPSB7XG4gICAgICAgIHR5cGU6IFVwZGF0ZVR5cGUuQXR0cmlidXRlLFxuICAgICAgICBhdHRyaWJ1dGU6IHNjaGVtZS5hdHRyaWJ1dGUsXG4gICAgICAgIG5vdGF0aW9uOiBzY2hlbWUubm90YXRpb24sXG4gICAgICAgIG5vZGU6IGdldEJ5Tm9kZVJlZihzY2hlbWUubm9kZVJlZiksXG4gICAgICB9O1xuXG4gICAgICBhc3NvY2lhdGVQbGFuKHBsYW4sIHBsYW4ubm90YXRpb24uYmFzZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwbGFuc0J5Tm90YXRpb24sXG4gICAgbm90YXRpb25BY2Nlc3NvcnMsXG4gICAgZnJhZ21lbnQsXG4gICAgc3VidGVtcGxhdGVzLFxuICB9O1xufVxuIiwKICAgICIvKlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cbmltcG9ydCB7IGZyYWdtZW50Q2FjaGUsIGh0bWxUb0ZyYWdtZW50IH0gZnJvbSBcIi4uL3V0aWwvZnJhZ21lbnRzXCI7XG5pbXBvcnQge1xuICB0eXBlIENvbXBpbGVkVGVtcGxhdGUsXG4gIGNvbXBpbGVkVGVtcGxhdGVDYWNoZSxcbiAgY29tcGlsZVRlbXBsYXRlLFxufSBmcm9tIFwiLi9jb21waWxlXCI7XG5pbXBvcnQgeyBjcmVhdGVKb2JzRnJvbVBsYW5zLCBleGVjdXRlUmVuZGVySm9icyB9IGZyb20gXCIuL2pvYnNcIjtcbmltcG9ydCB7IHByZXBhcmVDb21waWxlZFRlbXBsYXRlIH0gZnJvbSBcIi4vcHJlcGFyZVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBOb3RhdGlvbkFjY2Vzc29yLFxuICBwYXJzZWROb3RhdGlvbkNhY2hlLFxuICB2YWx1ZUFjY2Vzc29yQ2FjaGUsXG59IGZyb20gXCIuL3N5bnRheFwiO1xuaW1wb3J0IHR5cGUgeyBBbnlSZW5kZXJQbGFuIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUgVGVtcGxhdGVSb290ID0gSFRNTEVsZW1lbnQgfCBTaGFkb3dSb290O1xuZXhwb3J0IHR5cGUgVGVtcGxhdGVDb250ZXh0ID0ge1xuICBhdHRyPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD47XG4gIHN0YXRlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgaXRlbT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBpbmRleD86IG51bWJlcjtcbn07XG5cbi8qKlxuICogQSByZW5kZXJhYmxlIHRlbXBsYXRlIGZyb20gYW4gSFRNTFRlbXBsYXRlRWxlbWVudFxuICpcbiAqIExldmVyYWdlcyBhIHNpbXBsZSBzeW50YXggdG8gcHJvdmlkZSBhY2Nlc3NvcnMgdG8gdGVtcGxhdGUgZGF0YSBmcm9tIG9uZSBvZlxuICogZm91ciBjYXRlZ29yaWVzLCBiYXNlZCBvbiB1c2UgY2FzZTpcbiAqXG4gKiB8IFByZWZpeCB8IE5hbWVzcGFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IC0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG4gKiB8IGBAYCAgICB8IFRoZSBgYXR0cmAgbmFtZXNwYWNlIChob3N0IGVsZW1lbnQgYXR0cmlidXRlcykgICB8XG4gKiB8IGAkYCAgICB8IFRoZSBgc3RhdGVgIG5hbWVzcGFjZSAoY29tcG9uZW50IHJlYWN0aXZlIHN0YXRlKSB8XG4gKiB8IGAqYCAgICB8IFRoZSBgZGF0YWAgbmFtZXNwYWNlIChjb21wb25lbnQgY29tcHV0ZWQgcHJvcHMpICB8XG4gKiB8IGAjYCAgICB8IFRoZSBgaXRlbWAgbmFtZXNwYWNlIChsaXN0IGl0ZW0gY29udGV4dCkgICAgICAgICB8XG4gKlxuICogQmluZCBhdHRyaWJ1dGVzIHRvIGEgdmFsdWUgdXNpbmcgdGhlIGA6YXR0cmlidXRlYCBzeW50YXg6XG4gKlxuICogYGBgaHRtbFxuICogPGRpdiA6aWQ9XCIkaWRcIiA6Y2xhc3M9XCJAY2xhc3NuYW1lXCI+PC9kaXY+XG4gKiBgYGBcbiAqXG4gKiBPciB1c2UgZGlyZWN0aXZlcyB3aXRoIG5vdGF0aW9ucyBmb3IgYWR2YW5jZWQgdGVtcGxhdGluZzpcbiAqXG4gKiBgYGBodG1sXG4gKiA8ZGl2IDo6aWY9XCIqc2hvd0xpc3RcIj5cbiAqICAgPHVsPlxuICogICAgIDxsaSA6OmVhY2g9XCIkaXRlbXNcIiA6OmtleT1cIiNpZFwiPlxuICogICAgICAgPHNwYW4gOjpzd2FwPVwiI2NvbnRlbnRcIj48L3NwYW4+XG4gKiAgICAgPC9saT5cbiAqICAgPC91bD5cbiAqIDwvZGl2PlxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZSB7XG4gIHN0YXRpYyBpc1RlbXBsYXRlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgVGVtcGxhdGUge1xuICAgIHJldHVybiAoXG4gICAgICB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgaW5zdGFuY2VvZiBUZW1wbGF0ZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUHJvcGVydGllcyByZWxhdGVkIHRvIHRoZSBnbG9iYWwgVGVtcGxhdGUgYnVpbGQgY2FjaGUuXG4gICAqXG4gICAqIFRoaXMgaXMgbm90IHNvbWV0aGluZyB0eXBpY2FsbHkgbmVlZGVkIGZvciBnZW5lcmFsIGFwcCBkZXZlbG9wbWVudCwgYnV0XG4gICAqIGFsbG93cyBmb3IgYWR2YW5jZWQgY29uZmlndXJhdGlvbiB0byB0dW5lIHRoZSBjYWNoaW5nIHN5c3RlbSBpZiBuZWVkIGJlLlxuICAgKlxuICAgKiBDYWNoZSBzaXplcyBkZWZhdWx0IHRvIDUwMCBIVE1MIFRlbXBsYXRlIEZyYWdtZW50cyBhbmQgY29tcGlsZWQgUGFsZXR0ZVxuICAgKiB0ZW1wbGF0ZXMgKGluY2x1ZGVzIG5lc3RlZCB0ZW1wbGF0ZXMgbGlrZSBsaXN0cykgdG8gY292ZXIgbW9zdCBhcHBsaWNhdGlvblxuICAgKiBuZWVkcyB3aXRob3V0IHVzaW5nIG11Y2ggbWVtb3J5LlxuICAgKi9cbiAgc3RhdGljIGNhY2hlID0ge1xuICAgIC8qKlxuICAgICAqIFdpcGUgYWxsIGNhY2hlZCB0ZW1wbGF0ZXMgYW5kIEhUTUwgZnJhZ21lbnRzXG4gICAgICovXG4gICAgY2xlYXI6ICgpOiB2b2lkID0+IHtcbiAgICAgIGZyYWdtZW50Q2FjaGUuY2xlYXIoKTtcbiAgICAgIGNvbXBpbGVkVGVtcGxhdGVDYWNoZS5jbGVhcigpO1xuICAgICAgdmFsdWVBY2Nlc3NvckNhY2hlLmNsZWFyKCk7XG4gICAgICBwYXJzZWROb3RhdGlvbkNhY2hlLmNsZWFyKCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIHRoZSBkZWZhdWx0IGNhY2hlIGNhcGFjaXR5IG9mIDUwMCBpdGVtcyBwZXIgY2FjaGVcbiAgICAgKlxuICAgICAqIEdlbmVyYWwgY2FjaGluZyBndWlkYW5jZTpcbiAgICAgKiAtIDk1JSBvZiB0aGUgdGltZSwgNTAwIHdvcmtzIGZpbmVcbiAgICAgKiAtIEZvciB2ZXJ5IGxhcmdlIGFwcGxpY2F0aW9ucywgdXAgdG8gMTAwMCBpcyByZWFzb25hYmxlXG4gICAgICogLSBGb3Igc21hbGxlciBhcHBzLCBkcm9wcGluZyBkb3duIHRvIDEwMCAtIDI1MCBtYXkgc2F2ZSBtZW1vcnlcbiAgICAgKlxuICAgICAqIFVsdGltYXRlbHkgdGhlIGltcGFjdCB3aWxsIGJlIG1pbmltYWwgdW5sZXNzIHlvdXIgYXBwIGhhcyB2ZXJ5IHNwZWNpZmljXG4gICAgICogcmVuZGVyaW5nIG5lZWRzLlxuICAgICAqL1xuICAgIHNldENhcGFjaXR5OiAobWF4U2l6ZTogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICBmcmFnbWVudENhY2hlLnNldENhcGFjaXR5KG1heFNpemUpO1xuICAgICAgY29tcGlsZWRUZW1wbGF0ZUNhY2hlLnNldENhcGFjaXR5KG1heFNpemUpO1xuICAgICAgdmFsdWVBY2Nlc3NvckNhY2hlLnNldENhcGFjaXR5KG1heFNpemUpO1xuICAgICAgcGFyc2VkTm90YXRpb25DYWNoZS5zZXRDYXBhY2l0eShtYXhTaXplKTtcbiAgICB9LFxuICB9O1xuXG4gIHByaXZhdGUgX2NvbXBpbGVkOiBDb21waWxlZFRlbXBsYXRlO1xuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwge0BsaW5rIEhUTUxUZW1wbGF0ZUVsZW1lbnR9IHVzZWQgdG8gY3JlYXRlIHRoaXMgVGVtcGxhdGUuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIE1ha2Ugc3VyZSB0byBuZXZlciBvcGVyYXRlIGRpcmVjdGx5IG9uIHRoaXMgZWxlbWVudC4gQWx3YXlzIGNsb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBfdGVtcGxhdGVFbGVtZW50PzogSFRNTFRlbXBsYXRlRWxlbWVudDtcblxuICAvKiogVGhlIGN1cnJlbnQga25vd24gcm9vdCBlbGVtZW50IHRoYXQgdGhpcyBUZW1wbGF0ZSBpcyByZW5kZXJlZCBpbnRvICovXG4gIHByaXZhdGUgX21vdW50ZWRSb290PzogVGVtcGxhdGVSb290O1xuXG4gIC8qKiBUaGUgbW9zdCByZWNlbnQgc2V0IHZhbHVlIGZvciBlYWNoIG5vdGF0aW9uIHRoYXQgaGFzIHJlbmRlcmVkICovXG4gIHByaXZhdGUgX2xhdGVzdFJlbmRlcmVkVmFsdWVzOiBNYXA8c3RyaW5nLCB1bmtub3duPiA9IG5ldyBNYXAoKTtcblxuICAvKiogVGhlIGFjdGl2ZSBIVE1MRWxlbWVudCB3aGljaCB0aGUgdGVtcGxhdGUgaXMgdXBkYXRpbmcgb24gcmVuZGVycyAqL1xuICBwcml2YXRlIF9mcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudDtcblxuICAvKiogVmFsdWUgTm90YXRpb25zIC0+IFNldDxSZW5kZXIgUGxhbnM+ICovXG4gIHByaXZhdGUgX3BsYW5zQnlOb3RhdGlvbjogTWFwPHN0cmluZywgU2V0PEFueVJlbmRlclBsYW4+PiA9IG5ldyBNYXAoKTtcblxuICAvKiogVmFsdWUgTm90YXRpb25zIC0+IEFjY2Vzc29yIGZ1bmN0aW9ucyAqL1xuICBwcml2YXRlIF9ub3RhdGlvbkFjY2Vzc29yczogTWFwPHN0cmluZywgTm90YXRpb25BY2Nlc3Nvcj4gPSBuZXcgTWFwKCk7XG5cbiAgcHJpdmF0ZSBfc3VidGVtcGxhdGVzOiBTZXQ8VGVtcGxhdGU+ID0gbmV3IFNldCgpO1xuXG4gIGNvbnN0cnVjdG9yKHRlbXBsYXRlOiBIVE1MVGVtcGxhdGVFbGVtZW50KSB7XG4gICAgdGhpcy5fdGVtcGxhdGVFbGVtZW50ID0gdGVtcGxhdGU7XG4gICAgdGhpcy5fY29tcGlsZWQgPSBjb21waWxlVGVtcGxhdGUodGVtcGxhdGUpO1xuXG4gICAgLy8gUHJlcGFyZSBhIGZyYWdtZW50IGZyb20gdGhlIGNvbXBpbGVkIEhUTUwgKGNhY2hlZClcbiAgICBjb25zdCBmcmFnbWVudCA9IGh0bWxUb0ZyYWdtZW50KHRoaXMuX2NvbXBpbGVkLmh0bWwpO1xuICAgIGNvbnN0IGh5ZHJhdGVkID0gcHJlcGFyZUNvbXBpbGVkVGVtcGxhdGUodGhpcy5fY29tcGlsZWQsIGZyYWdtZW50KTtcblxuICAgIHRoaXMuX3BsYW5zQnlOb3RhdGlvbiA9IGh5ZHJhdGVkLnBsYW5zQnlOb3RhdGlvbjtcbiAgICB0aGlzLl9ub3RhdGlvbkFjY2Vzc29ycyA9IGh5ZHJhdGVkLm5vdGF0aW9uQWNjZXNzb3JzO1xuICAgIHRoaXMuX2ZyYWdtZW50ID0gaHlkcmF0ZWQuZnJhZ21lbnQ7XG4gICAgdGhpcy5fc3VidGVtcGxhdGVzID0gaHlkcmF0ZWQuc3VidGVtcGxhdGVzO1xuXG4gICAgY29uc3QgYWxsUmVsZXZhbnRBY2Nlc3NvcnMgPSBuZXcgTWFwPHN0cmluZywgTm90YXRpb25BY2Nlc3Nvcj4oXG4gICAgICB0aGlzLl9ub3RhdGlvbkFjY2Vzc29ycyxcbiAgICApO1xuXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLl9zdWJ0ZW1wbGF0ZXMpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBjaGlsZC5ub3RhdGlvbk1hcCkge1xuICAgICAgICBhbGxSZWxldmFudEFjY2Vzc29ycy5zZXQoa2V5LCB2YWwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX25vdGF0aW9uQWNjZXNzb3JzID0gYWxsUmVsZXZhbnRBY2Nlc3NvcnM7XG4gIH1cblxuICBnZXQgY29tcGlsZWQoKTogQ29tcGlsZWRUZW1wbGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbXBpbGVkO1xuICB9XG5cbiAgZ2V0IG5vdGF0aW9uTWFwKCk6IE1hcDxzdHJpbmcsIE5vdGF0aW9uQWNjZXNzb3I+IHtcbiAgICByZXR1cm4gdGhpcy5fbm90YXRpb25BY2Nlc3NvcnM7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgZnVsbCBjb3B5IG9mIHRoaXMgdGVtcGxhdGUgZm9yIHVzZSBpbiByZW5kZXJpbmcgdG8gYW5vdGhlciByb290XG4gICAqL1xuICBjbG9uZSA9ICgpOiBUZW1wbGF0ZSA9PiB7XG4gICAgcmV0dXJuIG5ldyBUZW1wbGF0ZSh0aGlzLmVsZW1lbnQoKSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIEFuIHtAbGluayBIVE1MVGVtcGxhdGVFbGVtZW50fSByZXByZXNlbnRpbmcgdGhpcyB0ZW1wbGF0ZVxuICAgKi9cbiAgZWxlbWVudCA9ICgpOiBIVE1MVGVtcGxhdGVFbGVtZW50ID0+IHtcbiAgICBpZiAodGhpcy5fdGVtcGxhdGVFbGVtZW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5fdGVtcGxhdGVFbGVtZW50O1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IHRoaXMuX2NvbXBpbGVkLmh0bWw7XG4gICAgcmV0dXJuIHRlbXBsYXRlO1xuICB9O1xuXG4gIHByaXZhdGUgX2NvbGxlY3RVcGRhdGVkVmFsdWVzID0gKFxuICAgIGNvbnRleHQ6IFRlbXBsYXRlQ29udGV4dCxcbiAgKTogW2hhc0NoYW5nZXM6IGJvb2xlYW4sIHZhbHVlczogTWFwPHN0cmluZywgdW5rbm93bj5dID0+IHtcbiAgICBjb25zdCB1cGRhdGVkVmFsdWVzID0gbmV3IE1hcDxzdHJpbmcsIHVua25vd24+KCk7XG4gICAgbGV0IGhhc0NoYW5nZXMgPSBmYWxzZTtcblxuICAgIGZvciAoY29uc3QgW3Jhd05vdGF0aW9uLCBhY2Nlc3Nvcl0gb2YgdGhpcy5fbm90YXRpb25BY2Nlc3NvcnMpIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSB0aGlzLl9sYXRlc3RSZW5kZXJlZFZhbHVlcy5nZXQocmF3Tm90YXRpb24pO1xuICAgICAgY29uc3QgbmV3VmFsdWUgPSBhY2Nlc3Nvcihjb250ZXh0KTtcbiAgICAgIHVwZGF0ZWRWYWx1ZXMuc2V0KHJhd05vdGF0aW9uLCBuZXdWYWx1ZSk7XG5cbiAgICAgIGlmIChwcmV2aW91c1ZhbHVlICE9PSBuZXdWYWx1ZSAmJiAhT2JqZWN0LmlzKHByZXZpb3VzVmFsdWUsIG5ld1ZhbHVlKSkge1xuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW2hhc0NoYW5nZXMsIHVwZGF0ZWRWYWx1ZXNdO1xuICB9O1xuXG4gIHByaXZhdGUgX3VwZGF0ZShuZXdWYWx1ZXM6IE1hcDxzdHJpbmcsIHVua25vd24+KSB7XG4gICAgLy8gQ29sbGVjdCBhZmZlY3RlZCBwbGFuc1xuICAgIGNvbnN0IGFsbEFmZmVjdGVkUGxhbnM6IFNldDxBbnlSZW5kZXJQbGFuPiA9IG5ldyBTZXQoKTtcblxuICAgIGZvciAoY29uc3QgW25vdGF0aW9uXSBvZiBuZXdWYWx1ZXMpIHtcbiAgICAgIGNvbnN0IGFmZmVjdGVkUGxhbnMgPSB0aGlzLl9wbGFuc0J5Tm90YXRpb24uZ2V0KG5vdGF0aW9uKTtcblxuICAgICAgaWYgKCFhZmZlY3RlZFBsYW5zKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IHBsYW4gb2YgYWZmZWN0ZWRQbGFucykge1xuICAgICAgICBhbGxBZmZlY3RlZFBsYW5zLmFkZChwbGFuKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBqb2JzID0gY3JlYXRlSm9ic0Zyb21QbGFucyhhbGxBZmZlY3RlZFBsYW5zLCBuZXdWYWx1ZXMpO1xuICAgIGV4ZWN1dGVSZW5kZXJKb2JzKGpvYnMpO1xuICB9XG5cbiAgcmVuZGVyV2l0aFZhbHVlcyA9IChcbiAgICByb290OiBUZW1wbGF0ZVJvb3QsXG4gICAgdmFsdWVzOiBNYXA8c3RyaW5nLCB1bmtub3duPixcbiAgKTogdm9pZCA9PiB7XG4gICAgaWYgKHJvb3QgIT09IHRoaXMuX21vdW50ZWRSb290KSB7XG4gICAgICB0aGlzLl9tb3VudGVkUm9vdCA9IHJvb3Q7XG4gICAgICB3aGlsZSAocm9vdC5maXJzdENoaWxkKSB7XG4gICAgICAgIHJvb3QucmVtb3ZlQ2hpbGQocm9vdC5maXJzdENoaWxkKTtcbiAgICAgIH1cblxuICAgICAgcm9vdC5hcHBlbmQodGhpcy5fZnJhZ21lbnQpO1xuICAgIH1cblxuICAgIHRoaXMuX3VwZGF0ZSh2YWx1ZXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhpcyB0ZW1wbGF0ZSBpbnRvIGEgdGFyZ2V0IGhvc3QgZWxlbWVudC5cbiAgICovXG4gIHJlbmRlciA9IChyb290OiBUZW1wbGF0ZVJvb3QsIGNvbnRleHQ6IFRlbXBsYXRlQ29udGV4dCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IFtoYXNDaGFuZ2VzLCByZXNvbHZlZFZhbHVlc10gPSB0aGlzLl9jb2xsZWN0VXBkYXRlZFZhbHVlcyhjb250ZXh0KTtcblxuICAgIC8vIElmIG5vIHZhbHVlcyBoYXZlIGNoYW5nZWQsIGV4aXQgZWFybHlcbiAgICBpZiAocm9vdCA9PT0gdGhpcy5fbW91bnRlZFJvb3QgJiYgIWhhc0NoYW5nZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJlbmRlcldpdGhWYWx1ZXMocm9vdCwgcmVzb2x2ZWRWYWx1ZXMpO1xuICAgIHRoaXMuX2xhdGVzdFJlbmRlcmVkVmFsdWVzID0gcmVzb2x2ZWRWYWx1ZXM7XG4gIH07XG59XG4iLAogICAgInR5cGUgVGFza1F1ZXVlID0gXCJ0YXNrc1wiIHwgXCJmcmFtZXNcIjtcbnR5cGUgVGFza1F1ZXVlcyA9IFJlY29yZDxUYXNrUXVldWUsIFZvaWRGdW5jdGlvbltdPjtcbnR5cGUgVGFza1Byb21pc2VzID0gUGFydGlhbDxSZWNvcmQ8VGFza1F1ZXVlLCBQcm9taXNlPHZvaWQ+Pj47XG50eXBlIFRhc2tSZXNvbHZlcnMgPSBQYXJ0aWFsPFJlY29yZDxUYXNrUXVldWUsIFZvaWRGdW5jdGlvbj4+O1xuXG5leHBvcnQgY2xhc3MgVGFza1NjaGVkdWxlciB7XG4gIHByaXZhdGUgX3F1ZXVlczogVGFza1F1ZXVlcyA9IHtcbiAgICB0YXNrczogW10sXG4gICAgZnJhbWVzOiBbXSxcbiAgfTtcbiAgcHJpdmF0ZSBfcHJvbWlzZXM6IFRhc2tQcm9taXNlcyA9IHt9O1xuICBwcml2YXRlIF9yZXNvbHZlcnM6IFRhc2tSZXNvbHZlcnMgPSB7fTtcbiAgcHJpdmF0ZSBfb25FcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihvbkVycm9yPzogKGVycm9yOiB1bmtub3duKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5fb25FcnJvciA9IG9uRXJyb3I7XG4gIH1cblxuICBwcml2YXRlIF9mbHVzaFF1ZXVlID0gKHF1ZXVlVHlwZTogVGFza1F1ZXVlKSA9PiB7XG4gICAgY29uc3QgcXVldWUgPSB0aGlzLl9xdWV1ZXNbcXVldWVUeXBlXTtcbiAgICB0cnkge1xuICAgICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBjb25zdCB0YXNrID0gcXVldWUuc2hpZnQoKTtcbiAgICAgICAgdGFzaz8uKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICh0aGlzLl9vbkVycm9yKSB7XG4gICAgICAgIHRoaXMuX29uRXJyb3IoZXJyb3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIFJlc29sdmUgdGhlIHRhc2sgcHJvbWlzZVxuICAgICAgdGhpcy5fcmVzb2x2ZXJzW3F1ZXVlVHlwZV0/LigpO1xuICAgICAgdGhpcy5fcmVzb2x2ZXJzW3F1ZXVlVHlwZV0gPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9wcm9taXNlc1txdWV1ZVR5cGVdID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIF9zY2hlZHVsZSA9IChcbiAgICB0eXBlOiBUYXNrUXVldWUsXG4gICAgdGFzazogVm9pZEZ1bmN0aW9uLFxuICAgIHByaW9yaXRpemUgPSBmYWxzZSxcbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgcXVldWUgPSB0aGlzLl9xdWV1ZXNbdHlwZV07XG4gICAgaWYgKHByaW9yaXRpemUpIHtcbiAgICAgIHF1ZXVlLnVuc2hpZnQodGFzayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXVlLnB1c2godGFzayk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9wcm9taXNlc1t0eXBlXSkge1xuICAgICAgdGhpcy5fcHJvbWlzZXNbdHlwZV0gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICB0aGlzLl9yZXNvbHZlcnNbdHlwZV0gPSByZXNvbHZlO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICh0eXBlID09PSBcImZyYW1lc1wiKSB7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLl9mbHVzaFF1ZXVlLmJpbmQodGhpcywgXCJmcmFtZXNcIikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVNaWNyb3Rhc2sodGhpcy5fZmx1c2hRdWV1ZS5iaW5kKHRoaXMsIFwidGFza3NcIikpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9wcm9taXNlc1t0eXBlXTtcbiAgfTtcblxuICBzY2hlZHVsZU1pY3JvdGFzayA9IChcbiAgICB0YXNrOiBWb2lkRnVuY3Rpb24sXG4gICAgcHJpb3JpdGl6ZSA9IGZhbHNlLFxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICByZXR1cm4gdGhpcy5fc2NoZWR1bGUoXCJ0YXNrc1wiLCB0YXNrLCBwcmlvcml0aXplKTtcbiAgfTtcblxuICBzY2hlZHVsZUZyYW1lVGFzayA9IChcbiAgICB0YXNrOiBWb2lkRnVuY3Rpb24sXG4gICAgcHJpb3JpdGl6ZSA9IGZhbHNlLFxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICByZXR1cm4gdGhpcy5fc2NoZWR1bGUoXCJmcmFtZXNcIiwgdGFzaywgcHJpb3JpdGl6ZSk7XG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBhc3luY1Rhc2tzID0gbmV3IFRhc2tTY2hlZHVsZXIoKTtcbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5pbXBvcnQgeyBlbGVtZW50TWF0Y2hlcyB9IGZyb20gXCIjdXRpbFwiO1xuaW1wb3J0IHsgaXNFbGVtZW50LCBpc05vZGUsIGlzU2hhZG93Um9vdCB9IGZyb20gXCIuLi91dGlsL2RvbVwiO1xuXG5leHBvcnQgdHlwZSBFdmVudE5hbWUgPSBrZXlvZiBHbG9iYWxFdmVudEhhbmRsZXJzRXZlbnRNYXA7XG5leHBvcnQgdHlwZSBFdmVudEhhbmRsZXI8SyBleHRlbmRzIEV2ZW50TmFtZSA9IEV2ZW50TmFtZT4gPSAoXG4gIGV2ZW50OiBHbG9iYWxFdmVudEhhbmRsZXJzRXZlbnRNYXBbS10sXG4pID0+IHZvaWQ7XG5cbnR5cGUgRXZlbnRIYW5kbGVyTWFwID0gTWFwPHN0cmluZywgRXZlbnRIYW5kbGVyPjtcblxuLyoqXG4gKiBNYW5hZ2VkIGV2ZW50IGRlbGVnYXRpb24gdG8gY29hbGVzY2UgZXZlbnQgbGlzdGVuZXJzIGZvciBhbiBlbnRpcmUgdHJlZSBpbnRvXG4gKiBzaW5nbGUgcm9vdC1sZXZlbCBsaXN0ZW5lcnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIExpc3RlbiBmb3IgZXZlbnRzIGZyb20gYW55IGNoaWxkIGVsZW1lbnQgb2YgdGhlIGRlbGVnYXRlZCByb290XG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZGVsZWdhdG9yID0gbmV3IEV2ZW50RGVsZWdhdG9yKCRyb290KTtcbiAqIGRlbGVnYXRvci5hZGREZWxlZ2F0ZWRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUNsaWNrKTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBMaXN0ZW4gZm9yIGV2ZW50cyBmcm9tIGNoaWxkIGVsZW1lbnRzIG1hdGNoaW5nIGAuYWN0aW9uYFxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGRlbGVnYXRvciA9IG5ldyBFdmVudERlbGVnYXRvcigkcm9vdCk7XG4gKiBkZWxlZ2F0b3IuYWRkRGVsZWdhdGVkTGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVDbGljaywgXCIuYWN0aW9uXCIpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBFdmVudERlbGVnYXRvciB7XG4gIHByaXZhdGUgX3Jvb3Q6IEhUTUxFbGVtZW50IHwgU2hhZG93Um9vdCB8IERvY3VtZW50O1xuICBwcml2YXRlIF9yb290TGlzdGVuZXJzOiBFdmVudEhhbmRsZXJNYXAgPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgX2V2ZW50czogTWFwPHN0cmluZywgTWFwPHN0cmluZywgU2V0PEV2ZW50SGFuZGxlcj4+PiA9IG5ldyBNYXAoKTtcblxuICBjb25zdHJ1Y3Rvcihyb290OiBIVE1MRWxlbWVudCB8IFNoYWRvd1Jvb3QgfCBEb2N1bWVudCA9IGRvY3VtZW50KSB7XG4gICAgdGhpcy5fcm9vdCA9IHJvb3Q7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVyc0ZvckV2ZW50KGV2ZW50OiBzdHJpbmcpOiBNYXA8c3RyaW5nLCBTZXQ8RXZlbnRIYW5kbGVyPj4ge1xuICAgIGxldCBoYW5kbGVyTWFwID0gdGhpcy5fZXZlbnRzLmdldChldmVudCk7XG5cbiAgICBpZiAoaGFuZGxlck1hcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYW5kbGVyTWFwID0gbmV3IE1hcCgpO1xuICAgICAgdGhpcy5fZXZlbnRzLnNldChldmVudCwgaGFuZGxlck1hcCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhhbmRsZXJNYXA7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVyc0ZvckV2ZW50QW5kUXVlcnk8RSBleHRlbmRzIEV2ZW50TmFtZT4oXG4gICAgZXZlbnQ6IEUsXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgKTogU2V0PEV2ZW50SGFuZGxlcjxFPj4ge1xuICAgIGNvbnN0IGhhbmRsZXJNYXAgPSB0aGlzLl9oYW5kbGVyc0ZvckV2ZW50KGV2ZW50KTtcbiAgICBsZXQgaGFuZGxlclNldCA9IGhhbmRsZXJNYXAuZ2V0KHF1ZXJ5KTtcblxuICAgIGlmIChoYW5kbGVyU2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhbmRsZXJTZXQgPSBuZXcgU2V0KCk7XG4gICAgICBoYW5kbGVyTWFwLnNldChxdWVyeSwgaGFuZGxlclNldCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhhbmRsZXJTZXQ7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVSb290TGlzdGVuZXIoZXZlbnROYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcm9vdExpc3RlbmVycy5oYXMoZXZlbnROYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxpc3RlbmVyID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgY29uc3QgaGFuZGxlcnNGb3JFdmVudCA9IHRoaXMuX2hhbmRsZXJzRm9yRXZlbnQoZXZlbnROYW1lKTtcbiAgICAgIGNvbnN0IHsgdGFyZ2V0IH0gPSBldmVudDtcblxuICAgICAgaWYgKHRhcmdldCA9PT0gbnVsbCB8fCAhaXNOb2RlKHRhcmdldCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgbm9kZTogTm9kZSB8IG51bGwgPSB0YXJnZXQ7XG5cbiAgICAgIGxldCBzdG9wSW1tZWRpYXRlQ2FsbGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBvcmlnaW5hbEZuID0gZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uO1xuICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uID0gKCkgPT4ge1xuICAgICAgICBvcmlnaW5hbEZuLmNhbGwoZXZlbnQpO1xuICAgICAgICBzdG9wSW1tZWRpYXRlQ2FsbGVkID0gdHJ1ZTtcbiAgICAgIH07XG5cbiAgICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgIGlmIChub2RlID09PSB0aGlzLl9yb290KSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTa2lwIGludmFsaWQgZWxlbWVudHNcbiAgICAgICAgaWYgKCFpc0VsZW1lbnQobm9kZSkpIHtcbiAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW52b2tlIGhhbmRsZXJzXG4gICAgICAgIGZvciAoY29uc3QgW3F1ZXJ5LCBoYW5kbGVyc10gb2YgaGFuZGxlcnNGb3JFdmVudCkge1xuICAgICAgICAgIGlmIChxdWVyeSA9PT0gXCIqXCIgfHwgZWxlbWVudE1hdGNoZXMobm9kZSwgcXVlcnkpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgaGFuZGxlci5jYWxsKG5vZGUsIGV2ZW50KTtcblxuICAgICAgICAgICAgICAvLyBSZXNwZWN0IC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSBhbmQgLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgaWYgKHN0b3BJbW1lZGlhdGVDYWxsZWQgfHwgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc3BlY3QgLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgIGlmIChldmVudC5jYW5jZWxCdWJibGUpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuXG4gICAgICAgIGlmIChub2RlID09PSB0aGlzLl9yb290IHx8IGlzU2hhZG93Um9vdChub2RlKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuX3Jvb3RMaXN0ZW5lcnMuc2V0KGV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICAgIHRoaXMuX3Jvb3QuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIGFkZExpc3RlbmVyPEUgZXh0ZW5kcyBFdmVudE5hbWU+KFxuICAgIGV2ZW50TmFtZTogRSxcbiAgICBoYW5kbGVyOiBFdmVudEhhbmRsZXI8RT4sXG4gICAgcXVlcnlGaWx0ZXI6IHN0cmluZyA9IFwiKlwiLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLl9oYW5kbGVyc0ZvckV2ZW50QW5kUXVlcnkoZXZlbnROYW1lLCBxdWVyeUZpbHRlcikuYWRkKGhhbmRsZXIpO1xuICAgIHRoaXMuX2NyZWF0ZVJvb3RMaXN0ZW5lcihldmVudE5hbWUpO1xuICB9XG5cbiAgcmVtb3ZlTGlzdGVuZXIoXG4gICAgZXZlbnROYW1lOiBFdmVudE5hbWUsXG4gICAgaGFuZGxlcjogRXZlbnRIYW5kbGVyLFxuICAgIHF1ZXJ5RmlsdGVyOiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGhhbmRsZXJTZXQgPSB0aGlzLl9oYW5kbGVyc0ZvckV2ZW50QW5kUXVlcnkoZXZlbnROYW1lLCBxdWVyeUZpbHRlcik7XG4gICAgaGFuZGxlclNldC5kZWxldGUoaGFuZGxlcik7XG5cbiAgICAvLyBJZiB0aGF0IHdhcyB0aGUgbGFzdCBoYW5kbGVyIGZvciB0aGF0IGV2ZW50L3F1ZXJ5IGNvbWJvLCBkZWxldGUgdGhlIHNldFxuICAgIGlmIChoYW5kbGVyU2V0LnNpemUgPT09IDApIHtcbiAgICAgIGNvbnN0IGV2ZW50SGFuZGxlclNldHMgPSB0aGlzLl9oYW5kbGVyc0ZvckV2ZW50KGV2ZW50TmFtZSk7XG4gICAgICBldmVudEhhbmRsZXJTZXRzLmRlbGV0ZShxdWVyeUZpbHRlcik7XG4gICAgfVxuICB9XG5cbiAgY2xlYW51cCA9ICgpOiB2b2lkID0+IHtcbiAgICBmb3IgKGNvbnN0IFtldmVudCwgaGFuZGxlcl0gb2YgdGhpcy5fcm9vdExpc3RlbmVycykge1xuICAgICAgdGhpcy5fcm9vdC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyKTtcbiAgICB9XG5cbiAgICB0aGlzLl9yb290TGlzdGVuZXJzLmNsZWFyKCk7XG4gIH07XG59XG4iLAogICAgIi8qXG4gKiBDb3B5cmlnaHQgwqkgUnVzdGljIEFyY2FkZSwgTExDIDIwMjZcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5pbXBvcnQgeyBFcnJvckNvZGUsIFBhbGV0dGVFcnJvciB9IGZyb20gXCIjZXJyb3JcIjtcbmltcG9ydCB7IFN0YXRlIH0gZnJvbSBcIiNzdGF0ZVwiO1xuaW1wb3J0IHsgVGVtcGxhdGUsIHR5cGUgVGVtcGxhdGVDb250ZXh0IH0gZnJvbSBcIiN0ZW1wbGF0ZVwiO1xuaW1wb3J0IHsgZ2V0RWxlbWVudEF0dHJpYnV0ZXMgfSBmcm9tIFwiI3V0aWxcIjtcbmltcG9ydCB7IGFzeW5jVGFza3MgfSBmcm9tIFwiLi4vdGFzay1zY2hlZHVsZXJcIjtcbmltcG9ydCB7IHdhbGtQYXJlbnRzIH0gZnJvbSBcIi4uL3V0aWwvZG9tXCI7XG5pbXBvcnQgeyBFdmVudERlbGVnYXRvciwgdHlwZSBFdmVudEhhbmRsZXIsIHR5cGUgRXZlbnROYW1lIH0gZnJvbSBcIi4vZGVsZWdhdG9yXCI7XG5cbmNvbnN0IE1BWF9TRVFVRU5USUFMX1JFTkRFUlMgPSAxMDAwMDtcbmNvbnN0IEJMQU5LX1RFTVBMQVRFID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuY29uc3QgSE9TVF9UQVJHRVQgPSBcIjpob3N0XCI7XG5cbmV4cG9ydCBlbnVtIFJvb3RNb2RlIHtcbiAgQ2xvc2VkID0gXCJjbG9zZWRcIixcbiAgT3BlbiA9IFwib3BlblwiLFxufVxuXG50eXBlIEludGVybmFsczxTdGF0ZVNoYXBlIGV4dGVuZHMgb2JqZWN0ID0ge30+ID0ge1xuICBpc0ZpbmFsaXplZDogYm9vbGVhbjtcbiAgaXNJbml0aWFsUmVuZGVyQ29tcGxldGU6IGJvb2xlYW47XG4gIGlzUmVuZGVyU2NoZWR1bGVkOiBib29sZWFuO1xuICBpc1JlbmRlcmluZzogYm9vbGVhbjtcbiAgc2VxdWVudGlhbFJlbmRlckNvdW50OiBudW1iZXI7XG4gIGxhc3RSZW5kZXJlZEF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+O1xuICBwZW5kaW5nQXR0cmlidXRlQ2hhbmdlczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD47XG5cbiAgc3RhdGU/OiBTdGF0ZTxTdGF0ZVNoYXBlPjtcbiAgZGVsZWdhdG9yPzogRXZlbnREZWxlZ2F0b3I7XG4gIGhvc3RMaXN0ZW5lcnM/OiBTZXQ8Q29tcG9uZW50SG9zdExpc3RlbmVyPjtcbiAgY2xlYW51cEZuPzogVm9pZEZ1bmN0aW9uO1xufTtcblxudHlwZSBDb21wb25lbnRIb3N0TGlzdGVuZXIgPSB7XG4gIGhhbmRsZXI6IEV2ZW50SGFuZGxlcjtcbiAgZXZlbnQ6IEV2ZW50TmFtZTtcbn07XG5cbi8qKlxuICogVGhlICoqQ29tcG9uZW50KiogY2xhc3MgZXh0ZW5kcyB0aGUgYmFzZSBIVE1MRWxlbWVudCBjbGFzcyB0byBwcm92aWRlIGFuXG4gKiBlcmdvbm9taWMgd2F5IHRvIGRlc2lnbiBhbmQgZGV2ZWxvcCBXZWIgQ29tcG9uZW50cyB3aXRoIHJlYWN0aXZlIHN0YXRlLFxuICogbWFuYWdlZCBhdHRyaWJ1dGVzLCBhbmQgZHluYW1pYyB0ZW1wbGF0aW5nLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29tcG9uZW50PFxuICBTdGF0ZVNoYXBlIGV4dGVuZHMgb2JqZWN0ID0ge30sXG4+IGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuICAvKipcbiAgICogQ2hlY2sgaWYgYSB2YWx1ZSBpcyBhIENvbXBvbmVudCBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGlzQ29tcG9uZW50KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgQ29tcG9uZW50IHtcbiAgICByZXR1cm4gKFxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlIGluc3RhbmNlb2YgQ29tcG9uZW50XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHZhbHVlIGlzIGEgQ29tcG9uZW50IGNsYXNzXG4gICAqL1xuICBzdGF0aWMgaXNDb21wb25lbnRDbGFzcyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHR5cGVvZiBDb21wb25lbnQge1xuICAgIHJldHVybiAoXG4gICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICh2YWx1ZS5wcm90b3R5cGUgaW5zdGFuY2VvZiBDb21wb25lbnQgfHwgdmFsdWUgPT09IENvbXBvbmVudClcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIHJlYWRDb21wb25lbnRUYWdOYW1lKGNvbXBvbmVudENsYXNzOiB0eXBlb2YgQ29tcG9uZW50KTogc3RyaW5nIHtcbiAgICBjb25zdCB7IHRhZ05hbWUgfSA9IGNvbXBvbmVudENsYXNzO1xuXG4gICAgaWYgKF9fREVWX18pIHtcbiAgICAgIGlmICh0YWdOYW1lID09PSBcIlwiKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW0NvbXBvbmVudF0gRW1wdHkgdGFnIG5hbWUgd2hlbiByZWFkaW5nIGZyb20gY29tcG9uZW50ICR7Y29tcG9uZW50Q2xhc3MubmFtZX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YWdOYW1lO1xuICB9XG5cbiAgLyoqIFRoZSBIVE1MIHRhZyBuYW1lIHRvIHVzZSBmb3IgdGhpcyBDb21wb25lbnQgKi9cbiAgc3RhdGljIHRhZ05hbWU6IHN0cmluZyA9IFwiXCI7XG5cbiAgLyoqIEFuIEhUTUwgVGVtcGxhdGUgZWxlbWVudCBmb3IgdGhpcyBlbGVtZW50IHRvIHVzZS4gKi9cbiAgc3RhdGljIHRlbXBsYXRlOiBIVE1MVGVtcGxhdGVFbGVtZW50IHwgVGVtcGxhdGUgPSBCTEFOS19URU1QTEFURTtcblxuICAvKiogU3R5bGVzIHRvIGVuY2Fwc3VsYXRlIHRvIHRoaXMgY29tcG9uZW50J3Mgcm9vdC4gKi9cbiAgc3RhdGljIHN0eWxlOiBDU1NTdHlsZVNoZWV0IHwgQ1NTU3R5bGVTaGVldFtdIHwgc3RyaW5nID0gW107XG5cbiAgLyoqIEF0dHJpYnV0ZXMgdG8gd2F0Y2ggZm9yIGNoYW5nZXMgZm9yIHVwZGF0ZXMuICovXG4gIHN0YXRpYyBvYnNlcnZlZEF0dHJpYnV0ZXM6IHN0cmluZ1tdID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSBtb2RlIGZvciB0aGlzIENvbXBvbmVudCdzIFNoYWRvd1Jvb3QuXG4gICAqXG4gICAqIE1ETjogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1NoYWRvd1Jvb3QvbW9kZVxuICAgKi9cbiAgc3RhdGljIHJvb3RNb2RlOiBSb290TW9kZSA9IFJvb3RNb2RlLkNsb3NlZDtcblxuICAvKipcbiAgICogSW5pdGlhbGl6YXRpb24gbGlmZWN5Y2xlIG1ldGhvZC4gTWFpbiBzY3JpcHRpbmcgYW5kIGV2ZW50IGxpc3RlbmVycy5cbiAgICogQHJldHVybnMgYSBmdW5jdGlvbiB0byBoYW5kbGUgY2xlYW51cCB0YXNrcyB3aGVuIHRoZSBjb21wb25lbnQgdW5tb3VudHNcbiAgICovXG4gIHB1YmxpYyBzY3JpcHQ/KCk6IFZvaWRGdW5jdGlvbiB8IHZvaWQ7XG5cbiAgLyoqIENhbGxlZCBpbW1lZGlhdGVseSBiZWZvcmUgZWFjaCB0ZW1wbGF0ZSB1cGRhdGUgKi9cbiAgcHVibGljIGJlZm9yZVVwZGF0ZT8oY2hhbmdlZEF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+KTogdm9pZDtcblxuICAvKiogQ2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGVhY2ggdGVtcGxhdGUgdXBkYXRlICovXG4gIHB1YmxpYyBhZnRlclVwZGF0ZT8ocHJldmlvdXNBdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudWxsPik6IHZvaWQ7XG5cbiAgLyoqIEZpbmFsIGxpZmVjeWNsZSBtZXRob2QgY2FsbGVkIGF0IHRoZSBlbmQgb2YgdGhlIHVubW91bnRpbmcgcHJvY2Vzcy4gKi9cbiAgcHVibGljIGZpbmFsaXplPygpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBIYW5kbGUgZXJyb3JzIHRocm93biBkdXJpbmcgbGlmZWN5Y2xlIG1ldGhvZHMgb2YgdGhpcyBjb21wb25lbnQgb3IgYW55XG4gICAqIHVuaGFuZGxlZCBlcnJvcnMgZnJvbSBjaGlsZCBjb21wb25lbnRzLlxuICAgKi9cbiAgcHVibGljIG9uRXJyb3I/KGVycm9yOiB1bmtub3duKTogdm9pZDtcblxuICAvKiogVGhlIGluaXRpYWwgc3RhdGUgZm9yIHRoaXMgQ29tcG9uZW50ICovXG4gIHB1YmxpYyBpbml0aWFsU3RhdGU/KCk6IFN0YXRlPFN0YXRlU2hhcGU+IHwgU3RhdGVTaGFwZTtcblxuICAvKipcbiAgICogQW4gb2JqZWN0IG9yIGZ1bmN0aW9uIHJldHVybmluZyBhbiBvYmplY3Qgd2hpY2ggcG9wdWxhdGVzIHRoZSBgZGF0YWAgdmFsdWVzXG4gICAqIGluIHRoZSB0ZW1wbGF0aW5nIGVuZ2luZS4gU3VjaCB2YWx1ZXMgYXJlIGFjY2Vzc2VkIHVzaW5nIHRoZSBgKmAgbm90YXRpb24uXG4gICAqL1xuICBwdWJsaWMgY29tcHV0ZWRQcm9wZXJ0aWVzPyhcbiAgICB0aGlzOiBDb21wb25lbnQ8U3RhdGVTaGFwZT4sXG4gICAgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD4sXG4gICAgc3RhdGU6IFN0YXRlU2hhcGUsXG4gICk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIHB1YmxpYyByZWFkb25seSByb290OiBTaGFkb3dSb290O1xuICBwdWJsaWMgcmVhZG9ubHkgdGVtcGxhdGU6IFRlbXBsYXRlO1xuXG4gIHByaXZhdGUgX2NtcDogSW50ZXJuYWxzPFN0YXRlU2hhcGU+ID0ge1xuICAgIGlzRmluYWxpemVkOiBmYWxzZSxcbiAgICBpc0luaXRpYWxSZW5kZXJDb21wbGV0ZTogZmFsc2UsXG4gICAgaXNSZW5kZXJTY2hlZHVsZWQ6IGZhbHNlLFxuICAgIGlzUmVuZGVyaW5nOiBmYWxzZSxcbiAgICBzZXF1ZW50aWFsUmVuZGVyQ291bnQ6IDAsXG4gICAgbGFzdFJlbmRlcmVkQXR0cmlidXRlczoge30sXG4gICAgcGVuZGluZ0F0dHJpYnV0ZUNoYW5nZXM6IHt9LFxuICB9O1xuXG4gIC8vIOKVreKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKVrlxuICAvLyDilIIgICAgICAgICAgICAgSW50ZXJuYWxzIGFuZCBQcml2YXRlIE1ldGhvZHMgICAgICAgICAgICAgIOKUglxuICAvLyDilbDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDila9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgY29uc3Qge1xuICAgICAgdGVtcGxhdGUsXG4gICAgICBzdHlsZSxcbiAgICAgIHJvb3RNb2RlOiBtb2RlLFxuICAgIH0gPSB0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBDb21wb25lbnQ7XG5cbiAgICAvLyBDcmVhdGUgdGhlIGVsZW1lbnQncyBzaGFkb3cgZG9tXG4gICAgdGhpcy5yb290ID0gdGhpcy5hdHRhY2hTaGFkb3coeyBtb2RlIH0pO1xuXG4gICAgLy8gQ29lcmNlIGFuZCBhZG9wdCBzdHlsZXNcbiAgICBsZXQgYWRvcHRTdHlsZXM6IENTU1N0eWxlU2hlZXRbXSA9IFtdO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc3R5bGUpKSB7XG4gICAgICBhZG9wdFN0eWxlcyA9IHN0eWxlO1xuICAgIH0gZWxzZSBpZiAoc3R5bGUgaW5zdGFuY2VvZiBDU1NTdHlsZVNoZWV0KSB7XG4gICAgICBhZG9wdFN0eWxlcyA9IFtzdHlsZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGFkb3B0U2hlZXQgPSBuZXcgQ1NTU3R5bGVTaGVldCgpO1xuICAgICAgYWRvcHRTaGVldC5yZXBsYWNlU3luYyhzdHlsZSk7XG4gICAgICBhZG9wdFN0eWxlcyA9IFthZG9wdFNoZWV0XTtcbiAgICB9XG5cbiAgICB0aGlzLnJvb3QuYWRvcHRlZFN0eWxlU2hlZXRzLnB1c2goLi4uYWRvcHRTdHlsZXMpO1xuXG4gICAgLy8gQWRvcHQgdGVtcGxhdGVcbiAgICB0aGlzLnRlbXBsYXRlID0gVGVtcGxhdGUuaXNUZW1wbGF0ZSh0ZW1wbGF0ZSlcbiAgICAgID8gdGVtcGxhdGVcbiAgICAgIDogbmV3IFRlbXBsYXRlKHRlbXBsYXRlKTtcbiAgfVxuXG4gIC8qKiBQcm9kdWNlIHRoZSBkYXRhIG9iamVjdCB0byBwYXNzIHRvIHRoZSB0ZW1wbGF0ZSdzIHJlbmRlciBmdW5jdGlvbiAqL1xuICBwcml2YXRlIF9nZXRSZW5kZXJDb250ZXh0KFxuICAgIGF0dHI6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+LFxuICApOiBUZW1wbGF0ZUNvbnRleHQge1xuICAgIGNvbnN0IHN0YXRlID0gKHRoaXMuX2NtcC5zdGF0ZT8ucmF3ID8/IHt9KSBhcyBTdGF0ZVNoYXBlO1xuICAgIGNvbnN0IGNvbXB1dGVkID0gdGhpcy5jb21wdXRlZFByb3BlcnRpZXM/LmNhbGwodGhpcywgYXR0ciwgc3RhdGUpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHI6IGF0dHIsXG4gICAgICBkYXRhOiBjb21wdXRlZCxcbiAgICAgIHN0YXRlOiBzdGF0ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfZXNjYWxhdGVFcnJvcihlcnJvcjogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IGlzRXJyb3JIYW5kbGVkID0gd2Fsa1BhcmVudHModGhpcywgKG5vZGU6IE5vZGUpID0+IHtcbiAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgQ29tcG9uZW50ICYmIG5vZGUub25FcnJvcikge1xuICAgICAgICBub2RlLm9uRXJyb3IoZXJyb3IpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICghaXNFcnJvckhhbmRsZWQpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3JlcG9ydEVycm9yKGVycm9yOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5vbkVycm9yID8gdGhpcy5vbkVycm9yKGVycm9yKSA6IHRoaXMuX2VzY2FsYXRlRXJyb3IoZXJyb3IpO1xuICB9XG5cbiAgLyoqIFRoZSBhY3R1YWwgdXBkYXRlIGJlaGF2aW9yICovXG4gIHByaXZhdGUgX3JlbmRlciA9ICgpOiB2b2lkID0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gSW1tZWRpYXRlbHkgZmxpcCBmbGFncyB0byBkZW5vdGUgYSByZW5kZXIgaXMgaW4gcHJvZ3Jlc3MgYW5kIGFsbG93XG4gICAgICAvLyBxdWV1ZWluZyBhbm90aGVyIHJlbmRlciByZXF1ZXN0LlxuICAgICAgdGhpcy5fY21wLmlzUmVuZGVyaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2NtcC5pc1JlbmRlclNjaGVkdWxlZCA9IGZhbHNlO1xuXG4gICAgICAvLyBDYWNoZSB0aGUgYXR0cmlidXRlcyBmcm9tIHRoZSBwcmV2aW91cyByZW5kZXJcbiAgICAgIGNvbnN0IHByZXZBdHRycyA9IHRoaXMuX2NtcC5sYXN0UmVuZGVyZWRBdHRyaWJ1dGVzO1xuXG4gICAgICB0aGlzLmJlZm9yZVVwZGF0ZT8uKHRoaXMuX2NtcC5wZW5kaW5nQXR0cmlidXRlQ2hhbmdlcyk7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgY3VycmVudCBzbmFwc2hvdCBvZiBhdHRyaWJ1dGVzXG4gICAgICBjb25zdCBuZXdBdHRyaWJ1dGVzID0gZ2V0RWxlbWVudEF0dHJpYnV0ZXModGhpcyk7XG4gICAgICB0aGlzLnRlbXBsYXRlLnJlbmRlcih0aGlzLnJvb3QsIHRoaXMuX2dldFJlbmRlckNvbnRleHQobmV3QXR0cmlidXRlcykpO1xuICAgICAgdGhpcy5fY21wLmxhc3RSZW5kZXJlZEF0dHJpYnV0ZXMgPSBuZXdBdHRyaWJ1dGVzO1xuXG4gICAgICB0aGlzLmFmdGVyVXBkYXRlPy4ocHJldkF0dHJzKTtcblxuICAgICAgLy8gSWYgdGhlIGB3aWxsUmVuZGVyYCBmbGFnIHdhcyBmbGlwcGVkLCBpbW1lZGlhdGVseSBwZXJmb3JtIGEgcmVuZGVyXG4gICAgICBpZiAodGhpcy5fY21wLmlzUmVuZGVyU2NoZWR1bGVkKSB7XG4gICAgICAgIHRoaXMuX2NtcC5zZXF1ZW50aWFsUmVuZGVyQ291bnQgKz0gMTtcblxuICAgICAgICBpZiAodGhpcy5fY21wLnNlcXVlbnRpYWxSZW5kZXJDb3VudCA+PSBNQVhfU0VRVUVOVElBTF9SRU5ERVJTKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihcbiAgICAgICAgICAgIEVycm9yQ29kZS5NQVhfU0VRVUVOVElBTF9SRU5ERVJTLFxuICAgICAgICAgICAgYCR7dGhpcy5fY21wLnNlcXVlbnRpYWxSZW5kZXJDb3VudH1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9yZW5kZXIoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2NtcC5zZXF1ZW50aWFsUmVuZGVyQ291bnQgPSAwO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9jbXAuaXNSZW5kZXJTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3JlcG9ydEVycm9yKGVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fY21wLmlzUmVuZGVyaW5nID0gZmFsc2U7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgX2Fkb3B0U3RhdGUoc3RhdGU6IFN0YXRlU2hhcGUgfCBTdGF0ZTxTdGF0ZVNoYXBlPikge1xuICAgIC8vIElmIHRoaXMgaXMgZXhhY3RseSBvdXIgb3duIHN0YXRlIG9iamVjdCwgZG8gbm90aGluZ1xuICAgIGlmIChPYmplY3QuaXModGhpcy5fY21wLnN0YXRlLCBzdGF0ZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBzdGF0ZSBleGlzdHMsIHJlbW92ZSB0aGUgbGlzdGVuZXIgYW5kIHNjaGVkdWxlIGEgcmVuZGVyXG4gICAgaWYgKHRoaXMuX2NtcC5zdGF0ZSkge1xuICAgICAgdGhpcy5fY21wLnN0YXRlLnJlbW92ZUxpc3RlbmVyKHRoaXMucmVuZGVyKTtcbiAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgfVxuXG4gICAgLy8gQWRvcHQgdGhlIGluY29taW5nIHN0YXRlIG9iaiBvciB3cmFwIGFuZCBhZG9wdCBpdFxuICAgIGNvbnN0IGluY29taW5nU3RhdGVPYmogPSBTdGF0ZS5pc1N0YXRlPFN0YXRlU2hhcGU+KHN0YXRlKVxuICAgICAgPyBzdGF0ZVxuICAgICAgOiBuZXcgU3RhdGUoc3RhdGUpO1xuICAgIHRoaXMuX2NtcC5zdGF0ZSA9IGluY29taW5nU3RhdGVPYmo7XG5cbiAgICAvLyBFbnN1cmUgdGhlcmUgaXMgbm90IGFjY2lkZW50YWxseSB0d28gb2YgdGhlIHNhbWUgcmVuZGVyIGxpc3RlbmVyc1xuICAgIHRoaXMuX2NtcC5zdGF0ZS5yZW1vdmVMaXN0ZW5lcih0aGlzLnJlbmRlcik7XG4gICAgdGhpcy5fY21wLnN0YXRlLmFkZExpc3RlbmVyKHRoaXMucmVuZGVyKTtcbiAgfVxuXG4gIC8vIOKVreKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKVrlxuICAvLyDilIIgICAgICAgICAgIEN1c3RvbSBFbGVtZW50IENhbGxiYWNrIE92ZXJyaWRlcyAgICAgICAgICAgIOKUglxuICAvLyDilbDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDila9cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBzY3JpcHR9IGluc3RlYWRcbiAgICovXG4gIHByb3RlY3RlZCBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY21wLmlzSW5pdGlhbFJlbmRlckNvbXBsZXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXN5bmNUYXNrcy5zY2hlZHVsZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9jbXAuaXNSZW5kZXJpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLl9jbXAuaXNSZW5kZXJTY2hlZHVsZWQgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gZ2V0RWxlbWVudEF0dHJpYnV0ZXModGhpcyk7XG5cbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHN0YXRlZnVsIGNvbXBvbmVudCwgc2V0IHVwIHRoYXQgc3RhdGVcbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhbFN0YXRlKSB7XG4gICAgICAgICAgdGhpcy5fYWRvcHRTdGF0ZSh0aGlzLmluaXRpYWxTdGF0ZSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGVtcGxhdGUucmVuZGVyKHRoaXMucm9vdCwgdGhpcy5fZ2V0UmVuZGVyQ29udGV4dChhdHRyaWJ1dGVzKSk7XG5cbiAgICAgICAgdGhpcy5fY21wLmxhc3RSZW5kZXJlZEF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuICAgICAgICB0aGlzLl9jbXAuaXNJbml0aWFsUmVuZGVyQ29tcGxldGUgPSB0cnVlO1xuICAgICAgICB0aGlzLl9jbXAuY2xlYW51cEZuID0gdGhpcy5zY3JpcHQ/LigpID8/IHVuZGVmaW5lZDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX3JlcG9ydEVycm9yKGVycm9yKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMuX2NtcC5pc1JlbmRlcmluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgZmluYWxpemV9XG4gICAqL1xuICBwcm90ZWN0ZWQgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2NtcC5pc0ZpbmFsaXplZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGFzeW5jVGFza3Muc2NoZWR1bGVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgLy8gSWYgdGhpcyB0YXNrIHJ1bnMgYnV0IHRoZSBjb21wb25lbnQgaXMgc3RpbGwgY29ubmVjdGVkLCB0aGVuIGRvIG5vdGhpbmdcbiAgICAgIC8vIGJlY2F1c2UgdGhlIGNvbXBvbmVudCB3YXMganVzdCBtb3ZlZCBpbiB0aGUgRE9NLlxuICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQgfHwgIXRoaXMuX2NtcC5pc0luaXRpYWxSZW5kZXJDb21wbGV0ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2NtcC5pc0ZpbmFsaXplZCA9IHRydWU7XG5cbiAgICAgIC8vIE9ubHkgcnVuIHRoZSBkaXNjb25uZWN0IGlmIHRoZSBlbGVtZW50IGlzIGFjdHVhbGx5IHVubW91bnRlZCBhbmQgbm90XG4gICAgICAvLyBqdXN0IG1vdmVkLiBVc2luZyB0aGlzIGluIHBsYWNlIG9mIGNvbm5lY3RlZE1vdmVDYWxsYmFjaygpIGZvciBjb21wYXRcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgZGVsZWdhdG9yLCBjbGVhbnVwRm4sIGhvc3RMaXN0ZW5lcnMgfSA9IHRoaXMuX2NtcDtcbiAgICAgICAgZGVsZWdhdG9yPy5jbGVhbnVwKCk7XG5cbiAgICAgICAgLy8gQ2xlYXIgYW55IGxpc3RlbmVycyBzZXQgdXAgb24gc2VsZlxuICAgICAgICBpZiAoaG9zdExpc3RlbmVycyAmJiBob3N0TGlzdGVuZXJzLnNpemUgPiAwKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiBob3N0TGlzdGVuZXJzKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIobGlzdGVuZXIuZXZlbnQsIGxpc3RlbmVyLmhhbmRsZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNsZWFudXBGbj8uKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihlcnJvcik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAvLyBSdW4gdGhlIGZpbmFsaXplIGNhbGwgYWZ0ZXIgZXZlcnl0aGluZywgZXZlbiBpZiB0aGUgY2xlYW51cCBmbiBmYWlsZWRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLmZpbmFsaXplPy4oKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIGJlZm9yZVVwZGF0ZX0gYW5kIHtAbGluayBhZnRlclVwZGF0ZX0gaW5zdGVhZFxuICAgKi9cbiAgcHJvdGVjdGVkIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgXzogc3RyaW5nIHwgbnVsbCxcbiAgICBuZXdWYWx1ZTogc3RyaW5nIHwgbnVsbCxcbiAgKTogdm9pZCB7XG4gICAgLy8gSWdub3JlIGF0dHJpYnV0ZSBjaGFuZ2VzIHRoYXQgb2NjdXIgZHVyaW5nIGFuIHVwZGF0ZSwgYXMgdGhleSBhcmVcbiAgICAvLyBjb21pbmcgZnJvbSBpbnNpZGUgdGhlIGhvdXNlXG4gICAgaWYgKHRoaXMuX2NtcC5pc1JlbmRlcmluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENhY2hlIHRoZSB1cGRhdGVkIGF0dHJpYnV0ZSB2YWx1ZVxuICAgIHRoaXMuX2NtcC5wZW5kaW5nQXR0cmlidXRlQ2hhbmdlc1tuYW1lXSA9IG5ld1ZhbHVlO1xuXG4gICAgLy8gU2NoZWR1bGUgYSByZW5kZXJcbiAgICBpZiAoIXRoaXMuX2NtcC5pc1JlbmRlclNjaGVkdWxlZCkge1xuICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICB9XG4gIH1cblxuICAvLyDila3ilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDila5cbiAgLy8g4pSCICAgICAgICAgICAgICAgICAgICBQdWJsaWMgSW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICDilIJcbiAgLy8g4pWw4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pWvXG5cbiAgZ2V0IGlzTW91bnRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0Nvbm5lY3RlZCAmJiB0aGlzLl9jbXAuaXNJbml0aWFsUmVuZGVyQ29tcGxldGU7XG4gIH1cblxuICAvKipcbiAgICogQWNjZXNzIHRoZSBmdWxsIHtAbGluayBTdGF0ZX0gaW5zdGFuY2UgZm9yIHRoaXMgQ29tcG9uZW50LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGEgY29tcG9uZW50IHdoaWNoIGlzIG5vdCB1c2luZyByZWFjdGl2ZSBzdGF0ZVxuICAgKiB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvciBiZWluZyB0aHJvd24uXG4gICAqL1xuICBnZXRTdGF0ZSgpOiBTdGF0ZTxTdGF0ZVNoYXBlPiB7XG4gICAgaWYgKCF0aGlzLl9jbXAuc3RhdGUpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLk1JU1NJTkdfU1RBVEUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9jbXAuc3RhdGU7XG4gIH1cblxuICAvKipcbiAgICogQWNjZXNzb3IgZm9yIGxpdmUgcmVhY3RpdmUgc3RhdGUuXG4gICAqXG4gICAqIEZvciB0aGUgZnVsbCBzdGF0ZSBtYW5pcHVsYXRpb24gQVBJLCB1c2Uge0BsaW5rIGdldFN0YXRlfVxuICAgKi9cbiAgZ2V0IHN0YXRlKCk6IFN0YXRlU2hhcGUge1xuICAgIHJldHVybiB0aGlzLmdldFN0YXRlKCkubGl2ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlIHRoZSBjdXJyZW50IHN0YXRlIHdpdGggYSBuZXcgdmFsdWUgb3IgYWRvcHQgYSB3aG9sZSBkaWZmZXJlbnQgU3RhdGVcbiAgICogaW5zdGFuY2VcbiAgICovXG4gIHNldCBzdGF0ZShuZXdTdGF0ZTogU3RhdGVTaGFwZSB8IFN0YXRlPFN0YXRlU2hhcGU+KSB7XG4gICAgdGhpcy5fYWRvcHRTdGF0ZShuZXdTdGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogTWFudWFsbHkgc2NoZWR1bGUgYSByZW5kZXIgdG8gb2NjdXIsIG9wdGlvbmFsbHkgcHJvdmlkaW5nIGEgY2FsbGJhY2sgdG9cbiAgICogaW52b2tlIGFmdGVyIHRoZSByZW5kZXIgY29tcGxldGVzLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBDYWxsaW5nIHtAbGluayByZW5kZXJ9IG11bHRpcGxlIHRpbWVzIGluIHRoZSBzYW1lIGV2ZW50IGxvb3Agd29uJ3RcbiAgICogc2NoZWR1bGUgbXVsdGlwbGUgcmVuZGVycy4gUmVuZGVycyBhcmUgc2NoZWR1bGVkIHRvIG9jY3VyIG9uIHRoZSBuZXh0XG4gICAqIGFuaW1hdGlvbiBmcmFtZS5cbiAgICovXG4gIHJlbmRlciA9ICgpOiB2b2lkID0+IHtcbiAgICAvLyBQcmV2ZW50IHNjaGVkdWxpbmcgbXVsdGlwbGUgcmVuZGVyc1xuICAgIGlmICh0aGlzLl9jbXAuaXNSZW5kZXJTY2hlZHVsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jbXAuaXNSZW5kZXJTY2hlZHVsZWQgPSB0cnVlO1xuXG4gICAgLy8gSWYgY3VycmVudGx5IHJlbmRlcmluZywgZG9uJ3QgcmVxdWVzdCBhIHJlbmRlciwgaXQgd2lsbCBhdXRvLWNvbnRpbnVlXG4gICAgLy8gdW50aWwgdGhlcmUgYXJlIG5vIGNoYW5nZXMgdG8gcmVuZGVyXG4gICAgaWYgKHRoaXMuX2NtcC5pc1JlbmRlcmluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIGEgcmVuZGVyIGlzIHJlcXVlc3RlZCBhbmQgd2UncmUgbm90IHJlbmRlcmluZywgcmVxdWVzdCBhIHJlbmRlciBmcmFtZVxuICAgIGFzeW5jVGFza3Muc2NoZWR1bGVGcmFtZVRhc2sodGhpcy5fcmVuZGVyKTtcbiAgfTtcblxuICAvKipcbiAgICogTGlzdGVuIGZvciBldmVudHMgb24gYSBjaGlsZCBlbGVtZW50IGJhc2VkIG9uIHRoZSBwcm92aWRlZCBxdWVyeVxuICAgKlxuICAgKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHdoaWNoIHJlbW92ZXMgdGhlIGxpc3RlbmVyIHdoZW4gY2FsbGVkXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIEV2ZW50IGxpc3RlbmVycyBjcmVhdGVkIHdpdGggdGhpcyBtZXRob2QgYXJlIGF1dG9tYXRpY2FsbHkgY2xlYW5lZCB1cCB3aGVuXG4gICAqIHRoZSBjb21wb25lbnQgdW5tb3VudHMuIFlvdSBjYW4gbWFudWFsbHkgcmVtb3ZlIHRoZSBsaXN0ZW5lciBkdXJpbmcgdGhlXG4gICAqIGNvbXBvbmVudCdzIGxpZmVjeWNsZSBieSBjYWxsaW5nIHRoZSByZXR1cm5lZCBmdW5jdGlvbiBpZiBuZWVkIGJlLlxuICAgKi9cbiAgbGlzdGVuPEUgZXh0ZW5kcyBFdmVudE5hbWU+KFxuICAgIHRhcmdldDogc3RyaW5nLFxuICAgIGV2ZW50TmFtZTogRSxcbiAgICBldmVudEhhbmRsZXI6IEV2ZW50SGFuZGxlcjxFPixcbiAgKTogVm9pZEZ1bmN0aW9uO1xuXG4gIC8qKlxuICAgKiBMaXN0ZW4gZm9yIGV2ZW50cyBvbiBhIGNoaWxkIGVsZW1lbnQgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGNvbXBvbmVudCdzIHRhZ1xuICAgKlxuICAgKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHdoaWNoIHJlbW92ZXMgdGhlIGxpc3RlbmVyIHdoZW4gY2FsbGVkXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIEV2ZW50IGxpc3RlbmVycyBjcmVhdGVkIHdpdGggdGhpcyBtZXRob2QgYXJlIGF1dG9tYXRpY2FsbHkgY2xlYW5lZCB1cCB3aGVuXG4gICAqIHRoZSBjb21wb25lbnQgdW5tb3VudHMuIFlvdSBjYW4gbWFudWFsbHkgcmVtb3ZlIHRoZSBsaXN0ZW5lciBkdXJpbmcgdGhlXG4gICAqIGNvbXBvbmVudCdzIGxpZmVjeWNsZSBieSBjYWxsaW5nIHRoZSByZXR1cm5lZCBmdW5jdGlvbiBpZiBuZWVkIGJlLlxuICAgKi9cbiAgbGlzdGVuPEUgZXh0ZW5kcyBFdmVudE5hbWU+KFxuICAgIHRhcmdldDogdHlwZW9mIENvbXBvbmVudDxhbnk+LFxuICAgIGV2ZW50TmFtZTogRSxcbiAgICBldmVudEhhbmRsZXI6IEV2ZW50SGFuZGxlcjxFPixcbiAgKTogVm9pZEZ1bmN0aW9uO1xuXG4gIC8qKlxuICAgKiBMaXN0ZW4gZm9yIGV2ZW50cyBvbiB0aGUgaG9zdCBlbGVtZW50XG4gICAqXG4gICAqIEByZXR1cm5zIEEgZnVuY3Rpb24gd2hpY2ggcmVtb3ZlcyB0aGUgbGlzdGVuZXIgd2hlbiBjYWxsZWRcbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogRXZlbnQgbGlzdGVuZXJzIGNyZWF0ZWQgd2l0aCB0aGlzIG1ldGhvZCBhcmUgYXV0b21hdGljYWxseSBjbGVhbmVkIHVwIHdoZW5cbiAgICogdGhlIGNvbXBvbmVudCB1bm1vdW50cy4gWW91IGNhbiBtYW51YWxseSByZW1vdmUgdGhlIGxpc3RlbmVyIGR1cmluZyB0aGVcbiAgICogY29tcG9uZW50J3MgbGlmZWN5Y2xlIGJ5IGNhbGxpbmcgdGhlIHJldHVybmVkIGZ1bmN0aW9uIGlmIG5lZWQgYmUuXG4gICAqL1xuICBsaXN0ZW48RSBleHRlbmRzIEV2ZW50TmFtZT4oXG4gICAgdGFyZ2V0OiB0eXBlb2YgdGhpcyxcbiAgICBldmVudE5hbWU6IEUsXG4gICAgZXZlbnRIYW5kbGVyOiBFdmVudEhhbmRsZXI8RT4sXG4gICk6IFZvaWRGdW5jdGlvbjtcblxuICAvKipcbiAgICogTGlzdGVuIGZvciBldmVudHMgb24gdGhlIGhvc3QgZWxlbWVudFxuICAgKlxuICAgKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHdoaWNoIHJlbW92ZXMgdGhlIGxpc3RlbmVyIHdoZW4gY2FsbGVkXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIEV2ZW50IGxpc3RlbmVycyBjcmVhdGVkIHdpdGggdGhpcyBtZXRob2QgYXJlIGF1dG9tYXRpY2FsbHkgY2xlYW5lZCB1cCB3aGVuXG4gICAqIHRoZSBjb21wb25lbnQgdW5tb3VudHMuIFlvdSBjYW4gbWFudWFsbHkgcmVtb3ZlIHRoZSBsaXN0ZW5lciBkdXJpbmcgdGhlXG4gICAqIGNvbXBvbmVudCdzIGxpZmVjeWNsZSBieSBjYWxsaW5nIHRoZSByZXR1cm5lZCBmdW5jdGlvbiBpZiBuZWVkIGJlLlxuICAgKi9cbiAgbGlzdGVuPEUgZXh0ZW5kcyBFdmVudE5hbWU+KFxuICAgIHRhcmdldDogXCI6aG9zdFwiLFxuICAgIGV2ZW50TmFtZTogRSxcbiAgICBldmVudEhhbmRsZXI6IEV2ZW50SGFuZGxlcjxFPixcbiAgKTogVm9pZEZ1bmN0aW9uO1xuXG4gIGxpc3RlbjxFIGV4dGVuZHMgRXZlbnROYW1lPihcbiAgICB0YXJnZXREZXNjcmlwdG9yOiBzdHJpbmcgfCB0eXBlb2YgQ29tcG9uZW50PGFueT4gfCB0eXBlb2YgdGhpcyxcbiAgICBldmVudE5hbWU6IEUsXG4gICAgZXZlbnRIYW5kbGVyOiBFdmVudEhhbmRsZXI8RT4sXG4gICk6IFZvaWRGdW5jdGlvbiB7XG4gICAgLy8gSG9zdCBlbGVtZW50IGV2ZW50c1xuICAgIGlmICh0YXJnZXREZXNjcmlwdG9yID09PSBIT1NUX1RBUkdFVCB8fCB0YXJnZXREZXNjcmlwdG9yID09PSB0aGlzKSB7XG4gICAgICBpZiAoIXRoaXMuX2NtcC5ob3N0TGlzdGVuZXJzKSB7XG4gICAgICAgIHRoaXMuX2NtcC5ob3N0TGlzdGVuZXJzID0gbmV3IFNldCgpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBob3N0TGlzdGVuZXJzID0gdGhpcy5fY21wLmhvc3RMaXN0ZW5lcnM7XG5cbiAgICAgIGNvbnN0IGVudHJ5OiBDb21wb25lbnRIb3N0TGlzdGVuZXIgPSB7XG4gICAgICAgIGV2ZW50OiBldmVudE5hbWUsXG4gICAgICAgIGhhbmRsZXI6IGV2ZW50SGFuZGxlciBhcyBFdmVudEhhbmRsZXIsXG4gICAgICB9O1xuXG4gICAgICBob3N0TGlzdGVuZXJzLmFkZChlbnRyeSk7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBldmVudEhhbmRsZXIpO1xuXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBldmVudEhhbmRsZXIpO1xuICAgICAgICBob3N0TGlzdGVuZXJzLmRlbGV0ZShlbnRyeSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIE90aGVyIG9iamVjdHMgYXMgYSBkZXNjcmlwdG9yIGluZGljYXRlIGFuIGVycm9yXG4gICAgaWYgKHR5cGVvZiB0YXJnZXREZXNjcmlwdG9yID09PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5JTlZBTElEX0NBTExTSVRFKTtcbiAgICB9XG5cbiAgICAvLyBDaGlsZCBlbGVtZW50IGV2ZW50c1xuICAgIGlmICghdGhpcy5fY21wLmRlbGVnYXRvcikge1xuICAgICAgdGhpcy5fY21wLmRlbGVnYXRvciA9IG5ldyBFdmVudERlbGVnYXRvcih0aGlzLnJvb3QpO1xuICAgIH1cblxuICAgIGNvbnN0IGRlbGVnYXRvciA9IHRoaXMuX2NtcC5kZWxlZ2F0b3I7XG5cbiAgICBjb25zdCBxdWVyeSA9XG4gICAgICB0eXBlb2YgdGFyZ2V0RGVzY3JpcHRvciA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IHRhcmdldERlc2NyaXB0b3JcbiAgICAgICAgOiBDb21wb25lbnQucmVhZENvbXBvbmVudFRhZ05hbWUodGFyZ2V0RGVzY3JpcHRvcik7XG5cbiAgICBkZWxlZ2F0b3IuYWRkTGlzdGVuZXIoZXZlbnROYW1lLCBldmVudEhhbmRsZXIsIHF1ZXJ5KTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkZWxlZ2F0b3IucmVtb3ZlTGlzdGVuZXIoZXZlbnROYW1lLCBldmVudEhhbmRsZXIgYXMgRXZlbnRIYW5kbGVyLCBxdWVyeSk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoIGEge0BsaW5rIEN1c3RvbUV2ZW50fSB3aXRoIHRoZSBwcm92aWRlZCBuYW1lIGFuZCBvcHRpb25zLlxuICAgKlxuICAgKiBEZWZhdWx0IG9wdGlvbnMgYXJlOlxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHtcbiAgICogICBidWJibGVzOiB0cnVlLFxuICAgKiAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAqICAgY29tcG9zZWQ6IHRydWUsXG4gICAqICAgZGV0YWlsOiB1bmRlZmluZWQsXG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjdXN0b20gZXZlbnQgdG8gcHVibGlzaFxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIHRvIGNvbmZpZ3VyZSB0aGUgY3VzdG9tIGV2ZW50XG4gICAqL1xuICBkaXNwYXRjaEV2ZW50PFQ+KG5hbWU6IHN0cmluZywgb3B0aW9uczogQ3VzdG9tRXZlbnRJbml0PFQ+KTogYm9vbGVhbjtcbiAgZGlzcGF0Y2hFdmVudChldmVudDogRXZlbnQpOiBib29sZWFuO1xuICBkaXNwYXRjaEV2ZW50PFQ+KGE6IEV2ZW50IHwgc3RyaW5nLCBiPzogQ3VzdG9tRXZlbnRJbml0PFQ+KTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiBhID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBiID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICByZXR1cm4gc3VwZXIuZGlzcGF0Y2hFdmVudChhKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gc3VwZXIuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50KGEsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgLi4uYixcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5JTlZBTElEX0NBTExTSVRFKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgSFRNTCBFbGVtZW50IHdpdGggdGhlIHByb3ZpZGVkIElEIHdpdGhpbiB0aGVcbiAgICogc2hhZG93IHJvb3Qgb2YgdGhpcyBjb21wb25lbnQuXG4gICAqXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiBubyBlbGVtZW50IHdpdGggdGhlIHByb3ZpZGVkIElEIGlzIGZvdW5kXG4gICAqL1xuICByZWY8RSBleHRlbmRzIEhUTUxFbGVtZW50PihpZDogc3RyaW5nKTogRSB7XG4gICAgY29uc3QgbG9va3VwID0gdGhpcy5yb290LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICBpZiAoIWxvb2t1cCkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuTUlTU0lOR19FTEVNRU5UKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvb2t1cCBhcyBFO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSB0aGlzIGVsZW1lbnQgdG8gYSBzdHJpbmdcbiAgICovXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3QgeyB0YWdOYW1lLCBuYW1lIH0gPSB0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBDb21wb25lbnQ7XG4gICAgY29uc3QgY29tcHV0ZWROYW1lID0gdGFnTmFtZSA9PT0gXCJcIiA/IG5hbWUgOiB0YWdOYW1lO1xuICAgIGNvbnN0IGF0dHJTdHJpbmcgPSB0aGlzLmdldEF0dHJpYnV0ZU5hbWVzKClcbiAgICAgIC5tYXAoKGF0dHJOYW1lKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuZ2V0QXR0cmlidXRlKGF0dHJOYW1lKTtcbiAgICAgICAgcmV0dXJuIHZhbCA/IGAke2F0dHJOYW1lfT1cIiR7dmFsfVwiYCA6IFwiXCI7XG4gICAgICB9KVxuICAgICAgLmpvaW4oXCIgXCIpO1xuICAgIGNvbnN0IGF0dHJzID0gYXR0clN0cmluZy5sZW5ndGggPiAwID8gYCAke2F0dHJTdHJpbmd9YCA6IFwiXCI7XG4gICAgcmV0dXJuIGA8JHtjb21wdXRlZE5hbWV9JHthdHRyc30+PC8ke2NvbXB1dGVkTmFtZX0+YDtcbiAgfVxufVxuIiwKICAgICIvKlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cblxuaW1wb3J0IHsgRXJyb3JDb2RlLCBQYWxldHRlRXJyb3IgfSBmcm9tIFwiI2Vycm9yXCI7XG5pbXBvcnQgdHlwZSB7IFN0YXRlIH0gZnJvbSBcIiNzdGF0ZVwiO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBSb290TW9kZSB9IGZyb20gXCIuL2NvbXBvbmVudFwiO1xuXG5jb25zdCBCTEFOS19URU1QTEFURSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcblxuZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnRTaG9ydGhhbmQ8U3RhdGVTaGFwZSBleHRlbmRzIG9iamVjdCA9IHt9PiB7XG4gIC8qKiBBbiBIVE1MIFRlbXBsYXRlIGVsZW1lbnQgZm9yIHRoaXMgZWxlbWVudCB0byB1c2UuICovXG4gIHRlbXBsYXRlPzogSFRNTFRlbXBsYXRlRWxlbWVudDtcblxuICAvKiogU3R5bGVzIHRvIGVuY2Fwc3VsYXRlIHRvIHRoaXMgY29tcG9uZW50J3Mgcm9vdC4gKi9cbiAgc3R5bGU/OiBDU1NTdHlsZVNoZWV0IHwgQ1NTU3R5bGVTaGVldFtdIHwgc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kZSBmb3IgdGhpcyBDb21wb25lbnQncyBTaGFkb3dSb290LlxuICAgKlxuICAgKiBNRE46IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9TaGFkb3dSb290L21vZGVcbiAgICovXG4gIHJvb3RNb2RlPzogUm9vdE1vZGU7XG5cbiAgLyoqIEF0dHJpYnV0ZXMgdG8gd2F0Y2ggZm9yIGNoYW5nZXMgZm9yIHVwZGF0ZXMuICovXG4gIG9ic2VydmVkQXR0cmlidXRlcz86IHN0cmluZ1tdO1xuXG4gIC8qKiBUaGUgaW5pdGlhbCBzdGF0ZSBmb3IgdGhpcyBDb21wb25lbnQgKi9cbiAgaW5pdGlhbFN0YXRlPzpcbiAgICB8IFN0YXRlPFN0YXRlU2hhcGU+XG4gICAgfCBTdGF0ZVNoYXBlXG4gICAgfCAoKCkgPT4gU3RhdGU8U3RhdGVTaGFwZT4pXG4gICAgfCAoKCkgPT4gU3RhdGVTaGFwZSk7XG5cbiAgLyoqXG4gICAqIEFuIG9iamVjdCBvciBmdW5jdGlvbiByZXR1cm5pbmcgYW4gb2JqZWN0IHdoaWNoIHBvcHVsYXRlcyB0aGUgYGRhdGFgIHZhbHVlc1xuICAgKiBpbiB0aGUgdGVtcGxhdGluZyBlbmdpbmUuIFN1Y2ggdmFsdWVzIGFyZSBhY2Nlc3NlZCB1c2luZyB0aGUgYCpgIG5vdGF0aW9uLlxuICAgKi9cbiAgY29tcHV0ZWRQcm9wZXJ0aWVzPyhcbiAgICB0aGlzOiBDb21wb25lbnQ8U3RhdGVTaGFwZT4sXG4gICAgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+LFxuICAgIHN0YXRlPzogU3RhdGVTaGFwZSxcbiAgKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLyoqIEluaXRpYWxpemF0aW9uIHNjcmlwdGluZyBmb3IgdGhpcyBDb21wb25lbnQgKi9cbiAgc2NyaXB0PzogKHRoaXM6IENvbXBvbmVudDxTdGF0ZVNoYXBlPikgPT4gVm9pZEZ1bmN0aW9uIHwgdm9pZDtcblxuICAvKiogQ2FsbGVkIGltbWVkaWF0ZWx5IGJlZm9yZSBlYWNoIHRlbXBsYXRlIHVwZGF0ZSAqL1xuICBiZWZvcmVVcGRhdGU/OiAoXG4gICAgdGhpczogQ29tcG9uZW50PFN0YXRlU2hhcGU+LFxuICAgIGNoYW5nZWRBdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD4sXG4gICkgPT4gdm9pZDtcblxuICAvKiogQ2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGVhY2ggdGVtcGxhdGUgdXBkYXRlICovXG4gIGFmdGVyVXBkYXRlPzogKFxuICAgIHRoaXM6IENvbXBvbmVudDxTdGF0ZVNoYXBlPixcbiAgICBwcmV2aW91c0F0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudWxsPixcbiAgKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgYXMgdGhlIGZpbmFsIGxpZmVjeWNsZSBtZXRob2QgYXQgdGhlIGVuZCBvZiB0aGUgdW5tb3VudGluZyBwcm9jZXNzLlxuICAgKi9cbiAgZmluYWxpemU/OiAodGhpczogQ29tcG9uZW50PFN0YXRlU2hhcGU+KSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBJZiBkZWZpbmVkLCByZWNlaXZlcyBlcnJvcnMgY2F1Z2h0IGR1cmluZyB0aGUgbGlmZWN5Y2xlIG1ldGhvZHMgb2YgdGhpc1xuICAgKiBjb21wb25lbnQgYW5kIGl0J3MgY2hpbGRyZW4uIElmIG5vdCBkZWZpbmVkLCB0aGlzIGNvbXBvbmVudCB3aWxsIGluc3RlYWRcbiAgICogdGhyb3cgZXJyb3JzIGFzIHRoZXkgYXJlIGZvdW5kLlxuICAgKi9cbiAgb25FcnJvcj86ICh0aGlzOiBDb21wb25lbnQ8U3RhdGVTaGFwZT4sIGVycm9yOiB1bmtub3duKSA9PiB2b2lkO1xufVxuXG5mdW5jdGlvbiBkZWZpbmVGcm9tQ2xhc3M8U3RhdGVTaGFwZSBleHRlbmRzIG9iamVjdCA9IHt9PihcbiAgY2xzOiB0eXBlb2YgQ29tcG9uZW50PFN0YXRlU2hhcGU+LFxuICB0YWdOYW1lPzogc3RyaW5nLFxuKSB7XG4gIC8vIFNldCB0aGUgdGFnTmFtZSBzdGF0aWMgaWYgaXRzIG5vdCBhbHJlYWR5IHNldFxuICBpZiAodGFnTmFtZSAmJiBjbHMudGFnTmFtZSA9PT0gXCJcIikge1xuICAgIGNscy50YWdOYW1lID0gdGFnTmFtZTtcbiAgfVxuXG4gIGlmIChfX0RFVl9fKSB7XG4gICAgaWYgKHRhZ05hbWUgJiYgdGFnTmFtZSAhPT0gY2xzLnRhZ05hbWUpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtDT01QT05FTlRdIENvbXBvbmVudCAke2Nscy5uYW1lfSB3YXMgZGVmaW5lZCB3aXRoIHRhZ25hbWUgJHt0YWdOYW1lfSBgICtcbiAgICAgICAgICBgd2hpY2ggZG9lcyBub3QgbWF0Y2ggaXRzIHN0YXRpYyB0YWdOYW1lIHByb3BlcnR5YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgd2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZShcbiAgICBjbHMudGFnTmFtZSxcbiAgICBjbHMgYXMgdW5rbm93biBhcyBDdXN0b21FbGVtZW50Q29uc3RydWN0b3IsXG4gICk7XG59XG5cbi8qKlxuICogRGVmaW5lIGEgUGFsZXR0ZSBDb21wb25lbnQgdXNpbmcgdGhlIHNob3J0aGFuZCBzeW50YXhcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGRlZmluZShcIm15LWNvbXBvbmVudFwiLCB7XG4gKiAgIHRlbXBsYXRlOiBodG1sYC4uLmAsXG4gKiAgIHN0eWxlOiBjc3NgLi4uYCxcbiAqICAgaW5pdGlhbFN0YXRlOiB7IC4uLiB9LFxuICogICBjb21wdXRlZFByb3BlcnRpZXMoKSB7IC4uLiB9LFxuICogICBzY3JpcHQoKSB7IC4uLiB9LFxuICogICAvLyBhbmQgYW55IG90aGVyIGxpZmVjeWNsZSBtZXRob2RzXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lPFN0YXRlU2hhcGUgZXh0ZW5kcyBvYmplY3QgPSB7fT4oXG4gIHRhZ05hbWU6IHN0cmluZyxcbiAgZGVmaW5pdGlvbjogQ29tcG9uZW50U2hvcnRoYW5kPFN0YXRlU2hhcGU+LFxuKTogdHlwZW9mIENvbXBvbmVudDxTdGF0ZVNoYXBlPjtcblxuLyoqXG4gKiBSZWdpc3RlciBhIFBhbGV0dGUgQ29tcG9uZW50IGFzIGEgY3VzdG9tIGVsZW1lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZTxDbHMgZXh0ZW5kcyB0eXBlb2YgQ29tcG9uZW50PGFueT4+KGRlZmluaXRpb246IENscyk6IENscztcblxuLyoqXG4gKiBSZWdpc3RlciBhIFBhbGV0dGUgQ29tcG9uZW50IGFzIGEgY3VzdG9tIGVsZW1lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZTxDbHMgZXh0ZW5kcyB0eXBlb2YgQ29tcG9uZW50PGFueT4+KFxuICB0YWdOYW1lOiBzdHJpbmcsXG4gIGRlZmluaXRpb246IENscyxcbik6IENscztcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZTxTdGF0ZVNoYXBlIGV4dGVuZHMgb2JqZWN0ID0ge30+KFxuICBhOiBzdHJpbmcgfCB0eXBlb2YgQ29tcG9uZW50PFN0YXRlU2hhcGU+LFxuICBiPzogQ29tcG9uZW50U2hvcnRoYW5kPFN0YXRlU2hhcGU+IHwgdHlwZW9mIENvbXBvbmVudDxTdGF0ZVNoYXBlPixcbik6IHR5cGVvZiBDb21wb25lbnQ8U3RhdGVTaGFwZT4ge1xuICAvLyBIYW5kbGUgY29tcG9uZW50IGNsYXNzIHBhdGhzXG4gIGlmICh0eXBlb2YgYSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgZGVmaW5lRnJvbUNsYXNzKGEpO1xuICAgIHJldHVybiBhO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBhID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiBiID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBkZWZpbmVGcm9tQ2xhc3MoYiwgYSk7XG4gICAgcmV0dXJuIGI7XG4gIH1cblxuICBpZiAoYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuSU5WQUxJRF9DQUxMU0lURSk7XG4gIH1cblxuICAvLyBIYW5kbGUgc2hvcnRoYW5kXG4gIGNvbnN0IHRhZ05hbWUgPSBhO1xuICBjb25zdCBkZWZpbml0aW9uID0gYjtcblxuICAvLyBDb21wb25lbnQgY29uc3RydWN0b3JzIGFyZSBmdW5jdGlvbnMgLT4gRGVmaW5lIHRoZW0gd2l0aCB0aGVpciB0YWduYW1lIGlmIHByZXNlbnRcbiAgaWYgKHR5cGVvZiBkZWZpbml0aW9uID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAvLyBTZXQgdGhlIHRhZ05hbWUgc3RhdGljIGlmIGl0cyBub3QgYWxyZWFkeSBzZXRcbiAgICBpZiAoZGVmaW5pdGlvbi50YWdOYW1lID09PSBcIlwiKSB7XG4gICAgICBkZWZpbml0aW9uLnRhZ05hbWUgPSB0YWdOYW1lO1xuICAgIH1cblxuICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICBpZiAodGFnTmFtZSAhPT0gZGVmaW5pdGlvbi50YWdOYW1lKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW0NPTVBPTkVOVF0gQ29tcG9uZW50ICR7ZGVmaW5pdGlvbi5uYW1lfSB3YXMgZGVmaW5lZCB3aXRoIHRhZ25hbWUgJHt0YWdOYW1lfSBgICtcbiAgICAgICAgICAgIGB3aGljaCBkb2VzIG5vdCBtYXRjaCBpdHMgc3RhdGljIHRhZ05hbWUgcHJvcGVydHlgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoXG4gICAgICB0YWdOYW1lLFxuICAgICAgZGVmaW5pdGlvbiBhcyB1bmtub3duIGFzIEN1c3RvbUVsZW1lbnRDb25zdHJ1Y3RvcixcbiAgICApO1xuICAgIHJldHVybiBkZWZpbml0aW9uO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIC8vIENvbmZpZ1xuICAgIHRlbXBsYXRlID0gQkxBTktfVEVNUExBVEUsXG4gICAgc3R5bGUgPSBbXSxcbiAgICByb290TW9kZSA9IFJvb3RNb2RlLkNsb3NlZCxcbiAgICBpbml0aWFsU3RhdGU6IHN0YXRlSW5pdGlhbGl6ZXIsXG4gICAgY29tcHV0ZWRQcm9wZXJ0aWVzLFxuICAgIG9ic2VydmVkQXR0cmlidXRlcyA9IFtdLFxuXG4gICAgLy8gTGlmZWN5Y2xlXG4gICAgc2NyaXB0LFxuICAgIGJlZm9yZVVwZGF0ZSxcbiAgICBhZnRlclVwZGF0ZSxcbiAgICBmaW5hbGl6ZSxcbiAgICBvbkVycm9yLFxuICB9ID0gZGVmaW5pdGlvbjtcblxuICBsZXQgZ2V0SW5pdGlhbFN0YXRlOiAoKCkgPT4gU3RhdGU8U3RhdGVTaGFwZT4gfCBTdGF0ZVNoYXBlKSB8IHVuZGVmaW5lZDtcblxuICBpZiAoc3RhdGVJbml0aWFsaXplcikge1xuICAgIGdldEluaXRpYWxTdGF0ZSA9XG4gICAgICB0eXBlb2Ygc3RhdGVJbml0aWFsaXplciA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gc3RhdGVJbml0aWFsaXplclxuICAgICAgICA6ICgpID0+IHN0YXRlSW5pdGlhbGl6ZXI7XG4gIH1cblxuICBjb25zdCBjbHMgPSBjbGFzcyBleHRlbmRzIENvbXBvbmVudDxTdGF0ZVNoYXBlPiB7XG4gICAgc3RhdGljIHRhZ05hbWUgPSB0YWdOYW1lO1xuICAgIHN0YXRpYyB0ZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIHN0YXRpYyBzdHlsZSA9IHN0eWxlO1xuICAgIHN0YXRpYyBvYnNlcnZlZEF0dHJpYnV0ZXMgPSBbLi4ub2JzZXJ2ZWRBdHRyaWJ1dGVzXTtcbiAgICBzdGF0aWMgc2hhZG93Um9vdE1vZGUgPSByb290TW9kZTtcbiAgfTtcblxuICBjbHMucHJvdG90eXBlLmluaXRpYWxTdGF0ZSA9IGdldEluaXRpYWxTdGF0ZTtcbiAgY2xzLnByb3RvdHlwZS5jb21wdXRlZFByb3BlcnRpZXMgPSBjb21wdXRlZFByb3BlcnRpZXM7XG5cbiAgY2xzLnByb3RvdHlwZS5zY3JpcHQgPSBzY3JpcHQ7XG4gIGNscy5wcm90b3R5cGUuYmVmb3JlVXBkYXRlID0gYmVmb3JlVXBkYXRlO1xuICBjbHMucHJvdG90eXBlLmFmdGVyVXBkYXRlID0gYWZ0ZXJVcGRhdGU7XG4gIGNscy5wcm90b3R5cGUuZmluYWxpemUgPSBmaW5hbGl6ZTtcbiAgY2xzLnByb3RvdHlwZS5vbkVycm9yID0gb25FcnJvcjtcblxuICBjdXN0b21FbGVtZW50cy5kZWZpbmUodGFnTmFtZSwgY2xzKTtcbiAgcmV0dXJuIGNscztcbn1cbiIsCiAgICAiaW1wb3J0IHsgZnJhZ21lbnRDYWNoZSB9IGZyb20gXCIjdXRpbFwiO1xuaW1wb3J0IHsgY29tcGlsZWRUZW1wbGF0ZUNhY2hlIH0gZnJvbSBcIi4vdGVtcGxhdGUvY29tcGlsZVwiO1xuaW1wb3J0IHsgcGFyc2VkTm90YXRpb25DYWNoZSwgdmFsdWVBY2Nlc3NvckNhY2hlIH0gZnJvbSBcIi4vdGVtcGxhdGUvc3ludGF4XCI7XG5cbmlmIChfX0RFVl9fICYmIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgKHdpbmRvdyBhcyBhbnkpLl9fUEFMRVRURV9ERVZUT09MU19fID0ge1xuICAgIGR1bXBDYWNoZU1ldHJpY3M6ICgpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKFwiQ29tcGlsZWQgVGVtcGxhdGVzXCIsIGNvbXBpbGVkVGVtcGxhdGVDYWNoZS5nZXRNZXRyaWNzKCkpO1xuICAgICAgY29uc29sZS5sb2coXCJIVE1MIEZyYWdtZW50c1wiLCBmcmFnbWVudENhY2hlLmdldE1ldHJpY3MoKSk7XG4gICAgICBjb25zb2xlLmxvZyhcIk5vdGF0aW9uIEFjY2Vzc29yXCIsIHZhbHVlQWNjZXNzb3JDYWNoZS5nZXRNZXRyaWNzKCkpO1xuICAgICAgY29uc29sZS5sb2coXCJQYXJzZWQgTm90YXRpb25zXCIsIHBhcnNlZE5vdGF0aW9uQ2FjaGUuZ2V0TWV0cmljcygpKTtcbiAgICB9LFxuICB9O1xufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIjtBQStDQSxTQUFTLFdBQVcsQ0FBQyxNQUFpQjtBQUFBLEVBQ3BDLE1BQU0saUJBQTRDO0FBQUEsS0FDL0Msb0JBQXNCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQU10QixzQkFBd0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBS3hCLDJCQUE2QjtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBSzdCLDRCQUE0QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQVU1Qiw0QkFBNEI7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQUs1QiwwQkFBMEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBTTFCLDRCQUE0QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBUTVCLG1DQUFtQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQU9uQyw2Q0FBNkM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBUTdDLHVDQUF1QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBUXZDLHVDQUF1QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FNdkMsMkJBQTZCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBTzdCLHNDQUFzQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQVV0Qyx3Q0FBd0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FPeEMseUNBQXlDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFB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RUFDaEIsTUFBTSxhQUFhO0FBQUEsRUFHbkIsSUFBSSxPQUFPLGVBQWUsWUFBWTtBQUFBLElBRXBDLElBQUksV0FBVyxZQUFZLElBQUk7QUFBQSxNQUM3QixXQUFXLFVBQVU7QUFBQSxJQUN2QjtBQUFBLElBRUEsSUFBSSxNQUFTO0FBQUEsTUFDWCxJQUFJLFlBQVksV0FBVyxTQUFTO0FBQUEsUUFDbEMsUUFBUSxLQUNOLHlCQUF5QixXQUFXLGlDQUFpQyxhQUNuRSxrREFDSjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFFQSxPQUFPLGVBQWUsT0FDcEIsU0FDQSxVQUNGO0FBQUEsSUFDQSxPQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUE7QUFBQSxJQUVFLHNCQUFXO0FBQUEsSUFDWCxRQUFRLENBQUM7QUFBQSxJQUNUO0FBQUEsSUFDQSxjQUFjO0FBQUEsSUFDZDtBQUFBLElBQ0EscUJBQXFCLENBQUM7QUFBQSxJQUd0QjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxNQUNFO0FBQUEsRUFFSixJQUFJO0FBQUEsRUFFSixJQUFJLGtCQUFrQjtBQUFBLElBQ3BCLGtCQUNFLE9BQU8scUJBQXFCLGFBQ3hCLG1CQUNBLE1BQU07QUFBQSxFQUNkO0FBQUEsRUFFQSxNQUFNLE1BQU0sY0FBYyxVQUFzQjtBQUFBLFdBQ3ZDLFVBQVU7QUFBQSxXQUNWLFdBQVc7QUFBQSxXQUNYLFFBQVE7QUFBQSxXQUNSLHFCQUFxQixDQUFDLEdBQUcsa0JBQWtCO0FBQUEsV0FDM0MsaUJBQWlCO0FBQUEsRUFDMUI7QUFBQSxFQUVBLElBQUksVUFBVSxlQUFlO0FBQUEsRUFDN0IsSUFBSSxVQUFVLHFCQUFxQjtBQUFBLEVBRW5DLElBQUksVUFBVSxTQUFTO0FBQUEsRUFDdkIsSUFBSSxVQUFVLGVBQWU7QUFBQSxFQUM3QixJQUFJLFVBQVUsY0FBYztBQUFBLEVBQzVCLElBQUksVUFBVSxXQUFXO0FBQUEsRUFDekIsSUFBSSxVQUFVLFVBQVU7QUFBQSxFQUV4QixlQUFlLE9BQU8sU0FBUyxHQUFHO0FBQUEsRUFDbEMsT0FBTztBQUFBOztBQzFOVCxJQUFlLE9BQU8sV0FBVyxhQUFhO0FBQUEsRUFDM0MsT0FBZSx1QkFBdUI7QUFBQSxJQUNyQyxrQkFBa0IsTUFBTTtBQUFBLE1BQ3RCLFFBQVEsSUFBSSxzQkFBc0Isc0JBQXNCLFdBQVcsQ0FBQztBQUFBLE1BQ3BFLFFBQVEsSUFBSSxrQkFBa0IsY0FBYyxXQUFXLENBQUM7QUFBQSxNQUN4RCxRQUFRLElBQUkscUJBQXFCLG1CQUFtQixXQUFXLENBQUM7QUFBQSxNQUNoRSxRQUFRLElBQUksb0JBQW9CLG9CQUFvQixXQUFXLENBQUM7QUFBQTtBQUFBLEVBRXBFO0FBQ0Y7IiwKICAiZGVidWdJZCI6ICJEOUE5MDgwODM1NkVBMTc0NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==