@rljson/io 0.0.41 → 0.0.42

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/io.js CHANGED
@@ -1,38 +1,14 @@
1
- var __defProp = Object.defineProperty;
2
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
1
  import { hip, hsh } from "@rljson/hash";
5
2
  import { IsReady } from "@rljson/is-ready";
6
3
  import { copy, equals } from "@rljson/json";
7
4
  import { iterateTables, throwOnInvalidTableCfg, validateRljsonAgainstTableCfg, iterateTablesSync } from "@rljson/rljson";
8
5
  // @license
9
- const _IoTools = class _IoTools {
6
+ class IoTools {
10
7
  /**
11
8
  * Constructor
12
9
  * @param io The Io interface to use
13
10
  */
14
11
  constructor(io) {
15
- /**
16
- * Initializes the revisions table.
17
- */
18
- __publicField(this, "initRevisionsTable", async () => {
19
- const tableCfg = {
20
- key: "revisions",
21
- type: "ingredients",
22
- isHead: true,
23
- isRoot: true,
24
- isShared: false,
25
- columns: [
26
- { key: "_hash", type: "string" },
27
- { key: "table", type: "string" },
28
- { key: "predecessor", type: "string" },
29
- { key: "successor", type: "string" },
30
- { key: "timestamp", type: "number" },
31
- { key: "id", type: "string" }
32
- ]
33
- };
34
- await this.io.createOrExtendTable({ tableCfg });
35
- });
36
12
  this.io = io;
37
13
  }
38
14
  /**
@@ -42,7 +18,7 @@ const _IoTools = class _IoTools {
42
18
  const tableCfg = hip({
43
19
  _hash: "",
44
20
  key: "tableCfgs",
45
- type: "ingredients",
21
+ type: "tableCfgs",
46
22
  isHead: false,
47
23
  isRoot: false,
48
24
  isShared: true,
@@ -60,6 +36,37 @@ const _IoTools = class _IoTools {
60
36
  });
61
37
  return tableCfg;
62
38
  }
39
+ /**
40
+ * Initializes the revisions table.
41
+ */
42
+ initRevisionsTable = async () => {
43
+ const tableCfg = {
44
+ key: "revisions",
45
+ type: "revisions",
46
+ isHead: true,
47
+ isRoot: true,
48
+ isShared: false,
49
+ columns: [
50
+ { key: "_hash", type: "string" },
51
+ { key: "table", type: "string" },
52
+ { key: "predecessor", type: "string" },
53
+ { key: "successor", type: "string" },
54
+ { key: "timestamp", type: "number" },
55
+ { key: "id", type: "string" }
56
+ ]
57
+ };
58
+ await this.io.createOrExtendTable({ tableCfg });
59
+ };
60
+ /**
61
+ * Example object for test purposes
62
+ * @returns An instance of io tools
63
+ */
64
+ static example = async () => {
65
+ const io = await IoMem.example();
66
+ await io.init();
67
+ await io.isReady();
68
+ return new IoTools(io);
69
+ };
63
70
  /**
64
71
  * Throws if the table does not exist
65
72
  */
@@ -247,37 +254,9 @@ ${errors.map((e) => `- ${e}`).join("\n")}`
247
254
  throwOnWrongHashes: false
248
255
  });
249
256
  }
250
- };
251
- /**
252
- * Example object for test purposes
253
- * @returns An instance of io tools
254
- */
255
- __publicField(_IoTools, "example", async () => {
256
- const io = await IoMem.example();
257
- await io.init();
258
- await io.isReady();
259
- return new _IoTools(io);
260
- });
261
- let IoTools = _IoTools;
257
+ }
262
258
  // @license
263
- const _IoMem = class _IoMem {
264
- constructor() {
265
- // ######################
266
- // Private
267
- // ######################
268
- __publicField(this, "_ioTools");
269
- __publicField(this, "_isReady", new IsReady());
270
- __publicField(this, "_isOpen", false);
271
- __publicField(this, "_mem", hip({}));
272
- // ...........................................................................
273
- __publicField(this, "_initTableCfgs", () => {
274
- const tableCfg = IoTools.tableCfgsTableCfg;
275
- this._mem.tableCfgs = hip({
276
- _data: [tableCfg],
277
- _tableCfg: tableCfg._hash
278
- });
279
- });
280
- }
259
+ class IoMem {
281
260
  // ...........................................................................
282
261
  // Constructor & example
283
262
  init() {
@@ -291,6 +270,9 @@ const _IoMem = class _IoMem {
291
270
  get isOpen() {
292
271
  return this._isOpen;
293
272
  }
273
+ static example = async () => {
274
+ return new IoMem();
275
+ };
294
276
  // ...........................................................................
295
277
  // General
296
278
  isReady() {
@@ -334,6 +316,13 @@ const _IoMem = class _IoMem {
334
316
  const tables = this._mem.tableCfgs._data;
335
317
  return tables;
336
318
  }
319
+ // ######################
320
+ // Private
321
+ // ######################
322
+ _ioTools;
323
+ _isReady = new IsReady();
324
+ _isOpen = false;
325
+ _mem = hip({});
337
326
  // ...........................................................................
338
327
  async _init() {
339
328
  this._ioTools = new IoTools(this);
@@ -344,6 +333,15 @@ const _IoMem = class _IoMem {
344
333
  this._isReady.resolve();
345
334
  }
346
335
  // ...........................................................................
336
+ _initTableCfgs = () => {
337
+ const tableCfg = IoTools.tableCfgsTableCfg;
338
+ this._mem.tableCfgs = hip({
339
+ _type: "tableCfgs",
340
+ _data: [tableCfg],
341
+ _tableCfg: tableCfg._hash
342
+ });
343
+ };
344
+ // ...........................................................................
347
345
  _updateGlobalHash() {
348
346
  this._mem._hash = "";
349
347
  hip(this._mem, {
@@ -371,15 +369,15 @@ const _IoMem = class _IoMem {
371
369
  }
372
370
  // ...........................................................................
373
371
  _createTable(newConfig, tableKey) {
374
- var _a;
375
372
  newConfig = hsh(newConfig);
376
373
  this._mem.tableCfgs._data.push(newConfig);
377
374
  this._ioTools.sortTableDataAndUpdateHash(this._mem.tableCfgs);
378
375
  const table = {
376
+ _type: newConfig.type,
379
377
  _data: [],
380
378
  _tableCfg: newConfig._hash
381
379
  };
382
- (_a = this._mem)[tableKey] ?? (_a[tableKey] = hip(table));
380
+ this._mem[tableKey] ??= hip(table);
383
381
  this._updateTableHash(tableKey);
384
382
  this._updateGlobalHash();
385
383
  }
@@ -455,6 +453,7 @@ const _IoMem = class _IoMem {
455
453
  return true;
456
454
  });
457
455
  const tableFiltered = {
456
+ _type: table._type,
458
457
  _data: tableDataFiltered
459
458
  };
460
459
  this._ioTools.sortTableDataAndUpdateHash(tableFiltered);
@@ -475,11 +474,7 @@ const _IoMem = class _IoMem {
475
474
  }
476
475
  });
477
476
  }
478
- };
479
- __publicField(_IoMem, "example", async () => {
480
- return new _IoMem();
481
- });
482
- let IoMem = _IoMem;
477
+ }
483
478
  // @license
484
479
  const exampleTestSetup = () => {
485
480
  return {
@@ -509,8 +504,8 @@ const calcReverseRefs = (rljson) => {
509
504
  iterateTablesSync(rljson, (parentTableKey, parentTable) => {
510
505
  for (const parentTableRow of parentTable._data) {
511
506
  switch (parentTable._type) {
512
- case "ingredients":
513
- _writeIngredientRefs(parentTableKey, parentTableRow, result);
507
+ case "components":
508
+ _writeComponentRefs(parentTableKey, parentTableRow, result);
514
509
  break;
515
510
  case "layers": {
516
511
  _writeLayerRefs(parentTableKey, parentTableRow, result);
@@ -532,7 +527,7 @@ const calcReverseRefs = (rljson) => {
532
527
  });
533
528
  return result;
534
529
  };
535
- const _writeIngredientRefs = (parentTableName, parentRow, result) => {
530
+ const _writeComponentRefs = (parentTableName, parentRow, result) => {
536
531
  const parentRowHash = parentRow._hash;
537
532
  for (const parentColumnName in parentRow) {
538
533
  if (parentColumnName.startsWith("_")) {
@@ -553,20 +548,20 @@ const _writeIngredientRefs = (parentTableName, parentRow, result) => {
553
548
  }
554
549
  };
555
550
  const _writeLayerRefs = (parentTableName, parentRow, result) => {
556
- const childTableName = parentRow.ingredientsTable;
551
+ const childTableName = parentRow.componentsTable;
557
552
  const parentRowHash = parentRow._hash;
558
- for (const sliceId in parentRow.assign) {
553
+ for (const sliceId in parentRow.add) {
559
554
  if (sliceId.startsWith("_")) {
560
555
  continue;
561
556
  }
562
- const sliceHash = parentRow.assign[sliceId];
557
+ const sliceHash = parentRow.add[sliceId];
563
558
  _write(result, childTableName, sliceHash, parentTableName, parentRowHash);
564
559
  }
565
560
  };
566
561
  const _writeCakeRefs = (parentTableName, parentRow, result) => {
567
562
  const parentRowHash = parentRow._hash;
568
563
  for (const layer in parentRow.layers) {
569
- const childTableName = parentRow.layersTable;
564
+ const childTableName = layer;
570
565
  const childRowHash = parentRow.layers[layer];
571
566
  _write(
572
567
  result,
@@ -592,11 +587,10 @@ const _writeBuffetRefs = (parentTableName, parentRow, result) => {
592
587
  }
593
588
  };
594
589
  const _write = (result, childTableName, childRowHash, parentTableName, parentRowHash) => {
595
- var _a;
596
- const referencesForChildTable = result[childTableName] ?? (result[childTableName] = {});
597
- const referencesForChildTableRow = referencesForChildTable[childRowHash] ?? (referencesForChildTable[childRowHash] = {});
598
- referencesForChildTableRow[parentTableName] ?? (referencesForChildTableRow[parentTableName] = {});
599
- (_a = referencesForChildTableRow[parentTableName])[parentRowHash] ?? (_a[parentRowHash] = {});
590
+ const referencesForChildTable = result[childTableName] ??= {};
591
+ const referencesForChildTableRow = referencesForChildTable[childRowHash] ??= {};
592
+ referencesForChildTableRow[parentTableName] ??= {};
593
+ referencesForChildTableRow[parentTableName][parentRowHash] ??= {};
600
594
  };
601
595
  export {
602
596
  IoMem,
@@ -605,4 +599,4 @@ export {
605
599
  exampleIo,
606
600
  exampleTestSetup
607
601
  };
608
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW8uanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9pby10b29scy50cyIsIi4uL3NyYy9pby1tZW0udHMiLCIuLi9zcmMvaW8tdGVzdC1zZXR1cC50cyIsIi4uL3NyYy9pby50cyIsIi4uL3NyYy9yZXZlcnNlLXJlZi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAbGljZW5zZVxyXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXHJcbi8vXHJcbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXHJcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxyXG5cclxuaW1wb3J0IHsgaGlwIH0gZnJvbSAnQHJsanNvbi9oYXNoJztcclxuaW1wb3J0IHtcclxuICBpdGVyYXRlVGFibGVzLFxyXG4gIFJsanNvbixcclxuICBUYWJsZUNmZyxcclxuICBUYWJsZUtleSxcclxuICBUYWJsZVR5cGUsXHJcbiAgdGhyb3dPbkludmFsaWRUYWJsZUNmZyxcclxuICB2YWxpZGF0ZVJsanNvbkFnYWluc3RUYWJsZUNmZyxcclxufSBmcm9tICdAcmxqc29uL3JsanNvbic7XHJcblxyXG5pbXBvcnQgeyBJb01lbSB9IGZyb20gJy4vaW8tbWVtLnRzJztcclxuaW1wb3J0IHsgSW8gfSBmcm9tICcuL2lvLnRzJztcclxuXHJcbi8qKlxyXG4gKiBQcm92aWRlcyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgdGhlIElvIGludGVyZmFjZS5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBJb1Rvb2xzIHtcclxuICAvKipcclxuICAgKiBDb25zdHJ1Y3RvclxyXG4gICAqIEBwYXJhbSBpbyBUaGUgSW8gaW50ZXJmYWNlIHRvIHVzZVxyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBpbzogSW8pIHt9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIHRhYmxlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHRhYmxlQ2ZncyB0YWJsZS5cclxuICAgKi9cclxuICBzdGF0aWMgZ2V0IHRhYmxlQ2Znc1RhYmxlQ2ZnKCkge1xyXG4gICAgY29uc3QgdGFibGVDZmcgPSBoaXA8VGFibGVDZmc+KHtcclxuICAgICAgX2hhc2g6ICcnLFxyXG4gICAgICBrZXk6ICd0YWJsZUNmZ3MnLFxyXG4gICAgICB0eXBlOiAnaW5ncmVkaWVudHMnLFxyXG4gICAgICBpc0hlYWQ6IGZhbHNlLFxyXG4gICAgICBpc1Jvb3Q6IGZhbHNlLFxyXG4gICAgICBpc1NoYXJlZDogdHJ1ZSxcclxuICAgICAgcHJldmlvdXM6ICcnLFxyXG5cclxuICAgICAgY29sdW1uczogW1xyXG4gICAgICAgIHsga2V5OiAnX2hhc2gnLCB0eXBlOiAnc3RyaW5nJyB9LFxyXG4gICAgICAgIHsga2V5OiAna2V5JywgdHlwZTogJ3N0cmluZycgfSxcclxuICAgICAgICB7IGtleTogJ3R5cGUnLCB0eXBlOiAnc3RyaW5nJyB9LFxyXG4gICAgICAgIHsga2V5OiAnaXNIZWFkJywgdHlwZTogJ2Jvb2xlYW4nIH0sXHJcbiAgICAgICAgeyBrZXk6ICdpc1Jvb3QnLCB0eXBlOiAnYm9vbGVhbicgfSxcclxuICAgICAgICB7IGtleTogJ2lzU2hhcmVkJywgdHlwZTogJ2Jvb2xlYW4nIH0sXHJcbiAgICAgICAgeyBrZXk6ICdwcmV2aW91cycsIHR5cGU6ICdzdHJpbmcnIH0sXHJcbiAgICAgICAgeyBrZXk6ICdjb2x1bW5zJywgdHlwZTogJ2pzb25BcnJheScgfSxcclxuICAgICAgXSxcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB0YWJsZUNmZztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluaXRpYWxpemVzIHRoZSByZXZpc2lvbnMgdGFibGUuXHJcbiAgICovXHJcbiAgaW5pdFJldmlzaW9uc1RhYmxlID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgY29uc3QgdGFibGVDZmc6IFRhYmxlQ2ZnID0ge1xyXG4gICAgICBrZXk6ICdyZXZpc2lvbnMnLFxyXG4gICAgICB0eXBlOiAnaW5ncmVkaWVudHMnLFxyXG4gICAgICBpc0hlYWQ6IHRydWUsXHJcbiAgICAgIGlzUm9vdDogdHJ1ZSxcclxuICAgICAgaXNTaGFyZWQ6IGZhbHNlLFxyXG5cclxuICAgICAgY29sdW1uczogW1xyXG4gICAgICAgIHsga2V5OiAnX2hhc2gnLCB0eXBlOiAnc3RyaW5nJyB9LFxyXG4gICAgICAgIHsga2V5OiAndGFibGUnLCB0eXBlOiAnc3RyaW5nJyB9LFxyXG4gICAgICAgIHsga2V5OiAncHJlZGVjZXNzb3InLCB0eXBlOiAnc3RyaW5nJyB9LFxyXG4gICAgICAgIHsga2V5OiAnc3VjY2Vzc29yJywgdHlwZTogJ3N0cmluZycgfSxcclxuICAgICAgICB7IGtleTogJ3RpbWVzdGFtcCcsIHR5cGU6ICdudW1iZXInIH0sXHJcbiAgICAgICAgeyBrZXk6ICdpZCcsIHR5cGU6ICdzdHJpbmcnIH0sXHJcbiAgICAgIF0sXHJcbiAgICB9O1xyXG5cclxuICAgIGF3YWl0IHRoaXMuaW8uY3JlYXRlT3JFeHRlbmRUYWJsZSh7IHRhYmxlQ2ZnIH0pO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIEV4YW1wbGUgb2JqZWN0IGZvciB0ZXN0IHB1cnBvc2VzXHJcbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgaW8gdG9vbHNcclxuICAgKi9cclxuICBzdGF0aWMgZXhhbXBsZSA9IGFzeW5jICgpID0+IHtcclxuICAgIGNvbnN0IGlvID0gYXdhaXQgSW9NZW0uZXhhbXBsZSgpO1xyXG4gICAgYXdhaXQgaW8uaW5pdCgpO1xyXG4gICAgYXdhaXQgaW8uaXNSZWFkeSgpO1xyXG4gICAgcmV0dXJuIG5ldyBJb1Rvb2xzKGlvKTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBUaHJvd3MgaWYgdGhlIHRhYmxlIGRvZXMgbm90IGV4aXN0XHJcbiAgICovXHJcbiAgYXN5bmMgdGhyb3dXaGVuVGFibGVEb2VzTm90RXhpc3QodGFibGU6IFRhYmxlS2V5KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBleGlzdHMgPSBhd2FpdCB0aGlzLmlvLnRhYmxlRXhpc3RzKHRhYmxlKTtcclxuICAgIGlmICghZXhpc3RzKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGFibGUgXCIke3RhYmxlfVwiIG5vdCBmb3VuZGApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhyb3dzIGlmIGFueSBvZiB0aGUgdGFibGVzIGluIHJsanNvbiBkbyBub3QgZXhpc3RcclxuICAgKiBAcGFyYW0gcmxqc29uIC0gVGhlIFJsanNvbiBvYmplY3QgdG8gY2hlY2tcclxuICAgKi9cclxuICBhc3luYyB0aHJvd1doZW5UYWJsZXNEb05vdEV4aXN0KHJsanNvbjogUmxqc29uKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBhd2FpdCBpdGVyYXRlVGFibGVzKHJsanNvbiwgYXN5bmMgKHRhYmxlS2V5KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZXhpc3RzID0gYXdhaXQgdGhpcy5pby50YWJsZUV4aXN0cyh0YWJsZUtleSk7XHJcbiAgICAgICAgaWYgKCFleGlzdHMpIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGFibGUgXCIke3RhYmxlS2V5fVwiIG5vdCBmb3VuZGApO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIGNvbnN0IG1pc3NpbmdUYWJsZXMgPSAoZSBhcyBBcnJheTxhbnk+KS5tYXAoKGUpID0+IGUudGFibGVLZXkpO1xyXG5cclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgIGBUaGUgZm9sbG93aW5nIHRhYmxlcyBkbyBub3QgZXhpc3Q6ICR7bWlzc2luZ1RhYmxlcy5qb2luKCcsICcpfWAsXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHRhYmxlIGNmZ3Mgb2YgYWxsIHRhYmxlc1xyXG4gICAqIEByZXR1cm5zIFRoZSB0YWJsZSBjb25maWd1cmF0aW9uIG9mIGFsbCB0YWJsZXNcclxuICAgKi9cclxuICBhc3luYyB0YWJsZUNmZ3MoKTogUHJvbWlzZTxUYWJsZUNmZ1tdPiB7XHJcbiAgICBjb25zdCB0YWJsZXMgPSBhd2FpdCB0aGlzLmlvLnJhd1RhYmxlQ2ZncygpO1xyXG5cclxuICAgIC8vIFRha2UgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGVhY2ggdHlwZSBrZXlcclxuICAgIGNvbnN0IG5ld2VzdFZlcnNpb246IFJlY29yZDxUYWJsZUtleSwgVGFibGVDZmc+ID0ge307XHJcbiAgICBmb3IgKGxldCBpID0gdGFibGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgIGNvbnN0IHRhYmxlID0gdGFibGVzW2ldO1xyXG4gICAgICBjb25zdCBleGlzdGluZyA9IG5ld2VzdFZlcnNpb25bdGFibGUua2V5XTtcclxuICAgICAgLyogdjggaWdub3JlIHN0YXJ0ICovXHJcbiAgICAgIGlmICghZXhpc3RpbmcgfHwgZXhpc3RpbmcuY29sdW1ucy5sZW5ndGggPCB0YWJsZS5jb2x1bW5zLmxlbmd0aCkge1xyXG4gICAgICAgIG5ld2VzdFZlcnNpb25bdGFibGUua2V5XSA9IHRhYmxlO1xyXG4gICAgICB9XHJcbiAgICAgIC8qIHY4IGlnbm9yZSBlbmQgKi9cclxuICAgIH1cclxuXHJcbiAgICAvLyBTb3J0IHRoZSB0YWJsZXMgYnkga2V5XHJcbiAgICBjb25zdCByZXN1bHREYXRhID0gT2JqZWN0LnZhbHVlcyhuZXdlc3RWZXJzaW9uKS5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgIGlmIChhLmtleSA8IGIua2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChhLmtleSA+IGIua2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgLyogdjggaWdub3JlIHN0YXJ0ICovXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgICAvKiB2OCBpZ25vcmUgZW5kICovXHJcbiAgICB9KTtcclxuICAgIHJldHVybiByZXN1bHREYXRhO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIGxpc3Qgd2l0aCBhbGwgdGFibGUgbmFtZXNcclxuICAgKi9cclxuICBhc3luYyBhbGxUYWJsZUtleXMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xyXG4gICAgY29uc3QgcmVzdWx0ID0gKGF3YWl0IHRoaXMudGFibGVDZmdzKCkpLm1hcCgoZSkgPT4gZS5rZXkpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBnaXZlbiB0YWJsZVxyXG4gICAqL1xyXG4gIGFzeW5jIHRhYmxlQ2ZnKHRhYmxlOiBUYWJsZUtleSk6IFByb21pc2U8VGFibGVDZmc+IHtcclxuICAgIGNvbnN0IHRhYmxlQ2ZnID0gYXdhaXQgdGhpcy50YWJsZUNmZ09yTnVsbCh0YWJsZSk7XHJcbiAgICBpZiAoIXRhYmxlQ2ZnKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGFibGUgXCIke3RhYmxlfVwiIG5vdCBmb3VuZGApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0YWJsZUNmZyE7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uIG9mIGEgZ2l2ZW4gdGFibGUgb3IgbnVsbCBpZiBpdCBkb2VzIG5vdCBleGlzdC5cclxuXHJcbiAgICovXHJcbiAgYXN5bmMgdGFibGVDZmdPck51bGwodGFibGU6IFRhYmxlS2V5KTogUHJvbWlzZTxUYWJsZUNmZyB8IG51bGw+IHtcclxuICAgIGNvbnN0IHRhYmxlQ2ZncyA9IGF3YWl0IHRoaXMudGFibGVDZmdzKCk7XHJcbiAgICBjb25zdCB0YWJsZUNmZyA9IHRhYmxlQ2Zncy5maW5kKChlKSA9PiBlLmtleSA9PT0gdGFibGUpO1xyXG4gICAgcmV0dXJuIHRhYmxlQ2ZnID8/IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgY29sdW1uIG5hbWVzIG9mIGEgZ2l2ZW4gdGFibGVcclxuICAgKi9cclxuICBhc3luYyBhbGxDb2x1bW5LZXlzKHRhYmxlOiBUYWJsZUtleSk6IFByb21pc2U8c3RyaW5nW10+IHtcclxuICAgIGNvbnN0IHRhYmxlQ2ZnID0gYXdhaXQgdGhpcy50YWJsZUNmZyh0YWJsZSk7XHJcbiAgICBjb25zdCByZXN1bHQgPSB0YWJsZUNmZy5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ua2V5KTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaHJvd3Mgd2hlbiBhIGNvbHVtbiBkb2VzIG5vdCBleGlzdCBpbiBhIGdpdmVuIHRhYmxlXHJcbiAgICogQHBhcmFtIHRhYmxlIC0gVGhlIHRhYmxlIHRvIGNoZWNrXHJcbiAgICogQHBhcmFtIGNvbHVtbnMgLSBUaGUgY29sdW1uIHRvIGNoZWNrXHJcbiAgICovXHJcbiAgYXN5bmMgdGhyb3dXaGVuQ29sdW1uRG9lc05vdEV4aXN0KFxyXG4gICAgdGFibGU6IFRhYmxlS2V5LFxyXG4gICAgY29sdW1uczogc3RyaW5nW10sXHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCB0YWJsZUNmZyA9IGF3YWl0IHRoaXMudGFibGVDZmcodGFibGUpO1xyXG4gICAgY29uc3QgY29sdW1uS2V5cyA9IHRhYmxlQ2ZnLmNvbHVtbnMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5rZXkpO1xyXG4gICAgY29uc3QgbWlzc2luZ0NvbHVtbnMgPSBjb2x1bW5zLmZpbHRlcihcclxuICAgICAgKGNvbHVtbikgPT4gIWNvbHVtbktleXMuaW5jbHVkZXMoY29sdW1uKSxcclxuICAgICk7XHJcbiAgICBpZiAobWlzc2luZ0NvbHVtbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgYFRoZSBmb2xsb3dpbmcgY29sdW1ucyBkbyBub3QgZXhpc3QgaW4gdGFibGUgXCIke3RhYmxlfVwiOiAke21pc3NpbmdDb2x1bW5zLmpvaW4oXHJcbiAgICAgICAgICAnLCAnLFxyXG4gICAgICAgICl9LmAsXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaHJvd3Mgd2hlbiBhIHRhYmxlIHVwZGF0ZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IHRhYmxlXHJcbiAgICogY29uZmlndXJhdGlvbi5cclxuICAgKi9cclxuICBhc3luYyB0aHJvd1doZW5UYWJsZUlzTm90Q29tcGF0aWJsZSh1cGRhdGU6IFRhYmxlQ2ZnKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBwcmVmaXggPSBgSW52YWxpZCB1cGRhdGUgb2YgdGFibGUgYWJsZSBcIiR7dXBkYXRlLmtleX1cImA7XHJcblxyXG4gICAgdGhyb3dPbkludmFsaWRUYWJsZUNmZyh1cGRhdGUpO1xyXG5cclxuICAgIC8vIENoZWNrIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyB0YWJsZVxyXG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLnRhYmxlQ2ZnT3JOdWxsKHVwZGF0ZS5rZXkpO1xyXG4gICAgaWYgKGV4aXN0aW5nKSB7XHJcbiAgICAgIC8vIEhhdmUgY29sdW1ucyBiZWVuIGRlbGV0ZWQ/XHJcbiAgICAgIGlmIChleGlzdGluZy5jb2x1bW5zLmxlbmd0aCA+IHVwZGF0ZS5jb2x1bW5zLmxlbmd0aCkge1xyXG4gICAgICAgIGNvbnN0IGRlbGV0ZWRDb2x1bW5LZXlzID0gZXhpc3RpbmcuY29sdW1uc1xyXG4gICAgICAgICAgLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ua2V5KVxyXG4gICAgICAgICAgLmZpbHRlcihcclxuICAgICAgICAgICAgKGtleSkgPT4gIXVwZGF0ZS5jb2x1bW5zLnNvbWUoKGNvbHVtbikgPT4gY29sdW1uLmtleSA9PT0ga2V5KSxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgaWYgKGRlbGV0ZWRDb2x1bW5LZXlzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGNvbnN0IGRlbGV0ZWRDb2x1bW5zID0gZGVsZXRlZENvbHVtbktleXMuam9pbignLCAnKTtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAgICAgYCR7cHJlZml4fTogQ29sdW1ucyBtdXN0IG5vdCBiZSBkZWxldGVkLiBgICtcclxuICAgICAgICAgICAgICBgRGVsZXRlZCBjb2x1bW5zOiAke2RlbGV0ZWRDb2x1bW5zfX1gLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEhhdmUgY29sdW1uIGtleXMgY2hhbmdlZD9cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleGlzdGluZy5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgYmVmb3JlID0gZXhpc3RpbmcuY29sdW1uc1tpXS5rZXk7XHJcbiAgICAgICAgY29uc3QgYWZ0ZXIgPSB1cGRhdGUuY29sdW1uc1tpXS5rZXk7XHJcbiAgICAgICAgaWYgKGJlZm9yZSAhPT0gYWZ0ZXIpIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAgICAgYCR7cHJlZml4fTogYCArXHJcbiAgICAgICAgICAgICAgYENvbHVtbiBrZXlzIG11c3Qgbm90IGNoYW5nZSEgYCArXHJcbiAgICAgICAgICAgICAgYENvbHVtbiBcIiR7YmVmb3JlfVwiIHdhcyByZW5hbWVkIGludG8gXCIke2FmdGVyfVwiLmAsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gSGF2ZSBjb2x1bW4gdHlwZXMgY2hhbmdlZD9cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleGlzdGluZy5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgY29sdW1uID0gZXhpc3RpbmcuY29sdW1uc1tpXS5rZXk7XHJcbiAgICAgICAgY29uc3QgYmVmb3JlID0gZXhpc3RpbmcuY29sdW1uc1tpXS50eXBlO1xyXG4gICAgICAgIGNvbnN0IGFmdGVyID0gdXBkYXRlLmNvbHVtbnNbaV0udHlwZTtcclxuICAgICAgICBpZiAoYmVmb3JlICE9PSBhZnRlcikge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICBgJHtwcmVmaXh9OiBgICtcclxuICAgICAgICAgICAgICBgQ29sdW1uIHR5cGVzIG11c3Qgbm90IGNoYW5nZSEgYCArXHJcbiAgICAgICAgICAgICAgYFR5cGUgb2YgY29sdW1uIFwiJHtjb2x1bW59XCIgd2FzIGNoYW5nZWQgZnJvbSBcIiR7YmVmb3JlfVwiIHRvICR7YWZ0ZXJ9LmAsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhyb3dzIGlmIHRoZSBkYXRhIGluIHRoZSB0YWJsZSBkbyBub3QgbWF0Y2ggdGhlIHRhYmxlIGNvbmZpZ3VyYXRpb25cclxuICAgKi9cclxuICBhc3luYyB0aHJvd1doZW5UYWJsZURhdGFEb2VzTm90TWF0Y2hDZmcoZGF0YTogUmxqc29uKSB7XHJcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgYXdhaXQgaXRlcmF0ZVRhYmxlcyhkYXRhLCBhc3luYyAodGFibGVLZXkpID0+IHtcclxuICAgICAgY29uc3QgdGFibGVDZmcgPSBhd2FpdCB0aGlzLnRhYmxlQ2ZnKHRhYmxlS2V5KTtcclxuICAgICAgY29uc3QgdGFibGUgPSBkYXRhW3RhYmxlS2V5XTtcclxuICAgICAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGVSbGpzb25BZ2FpbnN0VGFibGVDZmcodGFibGUuX2RhdGEsIHRhYmxlQ2ZnKSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgIGBUYWJsZSBkYXRhIGRvZXMgbm90IG1hdGNoIHRoZSBjb25maWd1cmF0aW9uLlxcblxcbkVycm9yczpcXG4ke2Vycm9yc1xyXG4gICAgICAgICAgLm1hcCgoZSkgPT4gYC0gJHtlfWApXHJcbiAgICAgICAgICAuam9pbignXFxuJyl9YCxcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNvcnRzIHRoZSBkYXRhIG9mIGEgdGFibGUgYnkgdGhlIGhhc2ggYW5kIHVwZGF0ZXMgdGhlIHRhYmxlIGhhc2ggaW4gcGxhY2VcclxuICAgKi9cclxuICBzb3J0VGFibGVEYXRhQW5kVXBkYXRlSGFzaCh0YWJsZTogVGFibGVUeXBlKTogdm9pZCB7XHJcbiAgICB0YWJsZS5fZGF0YS5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgIGNvbnN0IGhhc2hBID0gYS5faGFzaCBhcyBzdHJpbmc7XHJcbiAgICAgIGNvbnN0IGhhc2hCID0gYi5faGFzaCBhcyBzdHJpbmc7XHJcbiAgICAgIGlmIChoYXNoQSA8IGhhc2hCKSB7XHJcbiAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChoYXNoQSA+IGhhc2hCKSB7XHJcbiAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgLyogdjggaWdub3JlIHN0YXJ0ICovXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgICAvKiB2OCBpZ25vcmUgZW5kICovXHJcbiAgICB9KTtcclxuXHJcbiAgICB0YWJsZS5faGFzaCA9ICcnO1xyXG4gICAgaGlwKHRhYmxlLCB7XHJcbiAgICAgIHVwZGF0ZUV4aXN0aW5nSGFzaGVzOiBmYWxzZSxcclxuICAgICAgdGhyb3dPbldyb25nSGFzaGVzOiBmYWxzZSxcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCIvLyBAbGljZW5zZVxyXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXHJcbi8vXHJcbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXHJcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxyXG5cclxuaW1wb3J0IHsgaGlwLCBoc2ggfSBmcm9tICdAcmxqc29uL2hhc2gnO1xyXG5pbXBvcnQgeyBJc1JlYWR5IH0gZnJvbSAnQHJsanNvbi9pcy1yZWFkeSc7XHJcbmltcG9ydCB7IGNvcHksIGVxdWFscywgSnNvblZhbHVlIH0gZnJvbSAnQHJsanNvbi9qc29uJztcclxuaW1wb3J0IHtcclxuICBpdGVyYXRlVGFibGVzU3luYyxcclxuICBSbGpzb24sXHJcbiAgVGFibGVDZmcsXHJcbiAgVGFibGVLZXksXHJcbiAgVGFibGVUeXBlLFxyXG59IGZyb20gJ0BybGpzb24vcmxqc29uJztcclxuXHJcbmltcG9ydCB7IElvVG9vbHMgfSBmcm9tICcuL2lvLXRvb2xzLnRzJztcclxuaW1wb3J0IHsgSW8gfSBmcm9tICcuL2lvLnRzJztcclxuXHJcbi8qKlxyXG4gKiBJbi1NZW1vcnkgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJsanNvbiBJbyBpbnRlcmZhY2UuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgSW9NZW0gaW1wbGVtZW50cyBJbyB7XHJcbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXHJcbiAgLy8gQ29uc3RydWN0b3IgJiBleGFtcGxlXHJcblxyXG4gIGluaXQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl9pc09wZW4gPSB0cnVlO1xyXG4gICAgcmV0dXJuIHRoaXMuX2luaXQoKTtcclxuICB9XHJcblxyXG4gIGNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5faXNPcGVuID0gZmFsc2U7XHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzT3BlbjtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBleGFtcGxlID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgcmV0dXJuIG5ldyBJb01lbSgpO1xyXG4gIH07XHJcblxyXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxyXG4gIC8vIEdlbmVyYWxcclxuICBpc1JlYWR5KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzUmVhZHkucHJvbWlzZTtcclxuICB9XHJcblxyXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxyXG4gIC8vIER1bXBcclxuXHJcbiAgZHVtcCgpOiBQcm9taXNlPFJsanNvbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2R1bXAoKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGR1bXBUYWJsZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Umxqc29uPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZHVtcFRhYmxlKHJlcXVlc3QpO1xyXG4gIH1cclxuXHJcbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXHJcbiAgLy8gUm93c1xyXG5cclxuICByZWFkUm93cyhyZXF1ZXN0OiB7XHJcbiAgICB0YWJsZTogc3RyaW5nO1xyXG4gICAgd2hlcmU6IHsgW2NvbHVtbjogc3RyaW5nXTogSnNvblZhbHVlIH07XHJcbiAgfSk6IFByb21pc2U8Umxqc29uPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmVhZFJvd3MocmVxdWVzdCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyByb3dDb3VudCh0YWJsZTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgIGNvbnN0IHRhYmxlRGF0YSA9IHRoaXMuX21lbVt0YWJsZV0gYXMgVGFibGVUeXBlO1xyXG4gICAgaWYgKCF0YWJsZURhdGEpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSBcIiR7dGFibGV9XCIgbm90IGZvdW5kYCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRhYmxlRGF0YS5fZGF0YS5sZW5ndGgpO1xyXG4gIH1cclxuXHJcbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXHJcbiAgLy8gV3JpdGVcclxuXHJcbiAgd3JpdGUocmVxdWVzdDogeyBkYXRhOiBSbGpzb24gfSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3dyaXRlKHJlcXVlc3QpO1xyXG4gIH1cclxuXHJcbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXHJcbiAgLy8gVGFibGUgbWFuYWdlbWVudFxyXG4gIGFzeW5jIHRhYmxlRXhpc3RzKHRhYmxlS2V5OiBUYWJsZUtleSk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgdGFibGUgPSB0aGlzLl9tZW1bdGFibGVLZXldIGFzIFRhYmxlVHlwZTtcclxuICAgIHJldHVybiB0YWJsZSA/IHRydWUgOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZU9yRXh0ZW5kVGFibGUocmVxdWVzdDogeyB0YWJsZUNmZzogVGFibGVDZmcgfSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZU9yRXh0ZW5kVGFibGUocmVxdWVzdCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyByYXdUYWJsZUNmZ3MoKTogUHJvbWlzZTxUYWJsZUNmZ1tdPiB7XHJcbiAgICBjb25zdCB0YWJsZXMgPSB0aGlzLl9tZW0udGFibGVDZmdzLl9kYXRhIGFzIFRhYmxlQ2ZnW107XHJcbiAgICByZXR1cm4gdGFibGVzO1xyXG4gIH1cclxuXHJcbiAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xyXG4gIC8vIFByaXZhdGVcclxuICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXHJcblxyXG4gIHByaXZhdGUgX2lvVG9vbHMhOiBJb1Rvb2xzO1xyXG5cclxuICBwcml2YXRlIF9pc1JlYWR5ID0gbmV3IElzUmVhZHkoKTtcclxuICBwcml2YXRlIF9pc09wZW4gPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBfbWVtOiBSbGpzb24gPSBoaXAoe30gYXMgUmxqc29uKTtcclxuXHJcbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXHJcbiAgcHJpdmF0ZSBhc3luYyBfaW5pdCgpIHtcclxuICAgIHRoaXMuX2lvVG9vbHMgPSBuZXcgSW9Ub29scyh0aGlzKTtcclxuICAgIHRoaXMuX2luaXRUYWJsZUNmZ3MoKTtcclxuICAgIHRoaXMuX3VwZGF0ZUdsb2JhbEhhc2goKTtcclxuICAgIGF3YWl0IHRoaXMuX2lvVG9vbHMuaW5pdFJldmlzaW9uc1RhYmxlKCk7XHJcbiAgICBoc2godGhpcy5fbWVtKTtcclxuXHJcbiAgICB0aGlzLl9pc1JlYWR5LnJlc29sdmUoKTtcclxuICB9XHJcblxyXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxyXG4gIHByaXZhdGUgX2luaXRUYWJsZUNmZ3MgPSAoKSA9PiB7XHJcbiAgICBjb25zdCB0YWJsZUNmZyA9IElvVG9vbHMudGFibGVDZmdzVGFibGVDZmc7XHJcblxyXG4gICAgdGhpcy5fbWVtLnRhYmxlQ2ZncyA9IGhpcCh7XHJcbiAgICAgIF9kYXRhOiBbdGFibGVDZmddLFxyXG4gICAgICBfdGFibGVDZmc6IHRhYmxlQ2ZnLl9oYXNoIGFzIHN0cmluZyxcclxuICAgIH0pO1xyXG4gIH07XHJcblxyXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxyXG4gIHByaXZhdGUgX3VwZGF0ZUdsb2JhbEhhc2goKSB7XHJcbiAgICAodGhpcy5fbWVtIGFzIGFueSkuX2hhc2ggPSAnJztcclxuICAgIGhpcCh0aGlzLl9tZW0sIHtcclxuICAgICAgdXBkYXRlRXhpc3RpbmdIYXNoZXM6IGZhbHNlLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cclxuICBwcml2YXRlIF91cGRhdGVUYWJsZUhhc2godGFibGVLZXk6IFRhYmxlS2V5KSB7XHJcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuX21lbVt0YWJsZUtleV0gYXMgVGFibGVUeXBlO1xyXG4gICAgdGFibGUuX2hhc2ggPSAnJztcclxuICAgIGhpcCh0YWJsZSwgeyB1cGRhdGVFeGlzdGluZ0hhc2hlczogZmFsc2UgfSk7XHJcbiAgfVxyXG5cclxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cclxuICBwcml2YXRlIGFzeW5jIF9jcmVhdGVPckV4dGVuZFRhYmxlKHJlcXVlc3Q6IHtcclxuICAgIHRhYmxlQ2ZnOiBUYWJsZUNmZztcclxuICB9KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgdGFibGUgY29uZmlnIGlzIGNvbXBhdGlibGVcclxuICAgIC8vIHdpdGggYW4gcG90ZW50aWFsIGV4aXN0aW5nIHRhYmxlXHJcbiAgICBjb25zdCB0YWJsZUNmZyA9IHJlcXVlc3QudGFibGVDZmc7XHJcbiAgICBhd2FpdCB0aGlzLl9pb1Rvb2xzLnRocm93V2hlblRhYmxlSXNOb3RDb21wYXRpYmxlKHRhYmxlQ2ZnKTtcclxuXHJcbiAgICBjb25zdCB7IGtleSB9ID0gdGFibGVDZmc7XHJcblxyXG4gICAgLy8gUmVjcmVhdGUgaGFzaGVzIGluIHRoZSBjYXNlIHRoZSBleGlzdGluZyBoYXNoZXMgYXJlIHdyb25nXHJcbiAgICBjb25zdCBuZXdDb25maWcgPSBoc2godGFibGVDZmcpO1xyXG5cclxuICAgIC8vIEZpbmQgYW4gZXhpc3RpbmcgdGFibGUgY29uZmlnIHdpdGggdGhlIHNhbWUgaGFzaFxyXG4gICAgY29uc3QgZXhpc3RpbmdDb25maWcgPSBhd2FpdCB0aGlzLl9pb1Rvb2xzLnRhYmxlQ2ZnT3JOdWxsKGtleSk7XHJcblxyXG4gICAgLy8gV3JpdGUgdGhlIG5ldyBjb25maWcgaW50byB0aGUgZGF0YWJhc2VcclxuICAgIGlmICghZXhpc3RpbmdDb25maWcpIHtcclxuICAgICAgdGhpcy5fY3JlYXRlVGFibGUobmV3Q29uZmlnLCBrZXkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fZXh0ZW5kVGFibGUoZXhpc3RpbmdDb25maWcsIG5ld0NvbmZpZyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cclxuICBwcml2YXRlIF9jcmVhdGVUYWJsZShuZXdDb25maWc6IFRhYmxlQ2ZnLCB0YWJsZUtleTogVGFibGVLZXkpIHtcclxuICAgIC8vIFdyaXRlIHRoZSB0YWJsZSBjb25maWcgaW50byB0aGUgZGF0YWJhc2VcclxuICAgIG5ld0NvbmZpZyA9IGhzaChuZXdDb25maWcpO1xyXG4gICAgdGhpcy5fbWVtLnRhYmxlQ2Zncy5fZGF0YS5wdXNoKG5ld0NvbmZpZyk7XHJcbiAgICB0aGlzLl9pb1Rvb2xzLnNvcnRUYWJsZURhdGFBbmRVcGRhdGVIYXNoKHRoaXMuX21lbS50YWJsZUNmZ3MpO1xyXG5cclxuICAgIC8vIENyZWF0ZSBhIHRhYmxlIGFuZCB3cml0ZSBpdCBpbnRvIHRoZSBkYXRhYmFzZVxyXG4gICAgY29uc3QgdGFibGU6IFRhYmxlVHlwZSA9IHtcclxuICAgICAgX2RhdGE6IFtdLFxyXG4gICAgICBfdGFibGVDZmc6IG5ld0NvbmZpZy5faGFzaCBhcyBzdHJpbmcsXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuX21lbVt0YWJsZUtleV0gPz89IGhpcCh0YWJsZSk7XHJcblxyXG4gICAgLy8gVXBkYXRlIGhhc2hlc1xyXG4gICAgdGhpcy5fdXBkYXRlVGFibGVIYXNoKHRhYmxlS2V5KTtcclxuICAgIHRoaXMuX3VwZGF0ZUdsb2JhbEhhc2goKTtcclxuICB9XHJcblxyXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxyXG4gIHByaXZhdGUgX2V4dGVuZFRhYmxlKGV4aXN0aW5nQ29uZmlnOiBUYWJsZUNmZywgbmV3Q29uZmlnOiBUYWJsZUNmZykge1xyXG4gICAgLy8gTm8gY29sdW1ucyBhZGRlZD8gUmV0dXJuLlxyXG4gICAgaWYgKGV4aXN0aW5nQ29uZmlnLmNvbHVtbnMubGVuZ3RoID09PSBuZXdDb25maWcuY29sdW1ucy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFdyaXRlIHRoZSBuZXcgdGFibGUgY29uZmlnIGludG8gdGhlIGRhdGFiYXNlXHJcbiAgICBuZXdDb25maWcgPSBoc2gobmV3Q29uZmlnKTtcclxuICAgIHRoaXMuX21lbS50YWJsZUNmZ3MuX2RhdGEucHVzaChuZXdDb25maWcpO1xyXG4gICAgdGhpcy5faW9Ub29scy5zb3J0VGFibGVEYXRhQW5kVXBkYXRlSGFzaCh0aGlzLl9tZW0udGFibGVDZmdzKTtcclxuXHJcbiAgICAvLyBVcGRhdGUgdGhlIGNvbmZpZyBvZiB0aGUgZXhpc3RpbmcgdGFibGVcclxuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5fbWVtW25ld0NvbmZpZy5rZXldIGFzIFRhYmxlVHlwZTtcclxuICAgIHRhYmxlLl90YWJsZUNmZyA9IG5ld0NvbmZpZy5faGFzaCBhcyBzdHJpbmc7XHJcblxyXG4gICAgLy8gVXBkYXRlIHRoZSBoYXNoZXNcclxuICAgIHRoaXMuX3VwZGF0ZVRhYmxlSGFzaChuZXdDb25maWcua2V5KTtcclxuICAgIHRoaXMuX3VwZGF0ZUdsb2JhbEhhc2goKTtcclxuICB9XHJcblxyXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9kdW1wKCk6IFByb21pc2U8Umxqc29uPiB7XHJcbiAgICByZXR1cm4gY29weSh0aGlzLl9tZW0pO1xyXG4gIH1cclxuXHJcbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXHJcbiAgcHJpdmF0ZSBhc3luYyBfZHVtcFRhYmxlKHJlcXVlc3Q6IHsgdGFibGU6IHN0cmluZyB9KTogUHJvbWlzZTxSbGpzb24+IHtcclxuICAgIGF3YWl0IHRoaXMuX2lvVG9vbHMudGhyb3dXaGVuVGFibGVEb2VzTm90RXhpc3QocmVxdWVzdC50YWJsZSk7XHJcblxyXG4gICAgY29uc3QgdGFibGUgPSB0aGlzLl9tZW1bcmVxdWVzdC50YWJsZV0gYXMgVGFibGVUeXBlO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIFtyZXF1ZXN0LnRhYmxlXTogY29weSh0YWJsZSksXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXHJcbiAgcHJpdmF0ZSBhc3luYyBfd3JpdGUocmVxdWVzdDogeyBkYXRhOiBSbGpzb24gfSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgYWRkZWREYXRhID0gaHNoKHJlcXVlc3QuZGF0YSk7XHJcbiAgICB0aGlzLl9yZW1vdmVOdWxsVmFsdWVzKGFkZGVkRGF0YSk7XHJcbiAgICBjb25zdCB0YWJsZXMgPSBPYmplY3Qua2V5cyhhZGRlZERhdGEpO1xyXG4gICAgaHNoKGFkZGVkRGF0YSk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZXNEb05vdEV4aXN0KHJlcXVlc3QuZGF0YSk7XHJcbiAgICBhd2FpdCB0aGlzLl9pb1Rvb2xzLnRocm93V2hlblRhYmxlRGF0YURvZXNOb3RNYXRjaENmZyhyZXF1ZXN0LmRhdGEpO1xyXG5cclxuICAgIGZvciAoY29uc3QgdGFibGUgb2YgdGFibGVzKSB7XHJcbiAgICAgIGlmICh0YWJsZS5zdGFydHNXaXRoKCdfJykpIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3Qgb2xkVGFibGUgPSB0aGlzLl9tZW1bdGFibGVdIGFzIFRhYmxlVHlwZTtcclxuICAgICAgY29uc3QgbmV3VGFibGUgPSBhZGRlZERhdGFbdGFibGVdIGFzIFRhYmxlVHlwZTtcclxuXHJcbiAgICAgIC8vIFRhYmxlIGV4aXN0cy4gTWVyZ2UgZGF0YVxyXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbmV3VGFibGUuX2RhdGEpIHtcclxuICAgICAgICBjb25zdCBoYXNoID0gaXRlbS5faGFzaDtcclxuICAgICAgICBjb25zdCBleGlzdHMgPSBvbGRUYWJsZS5fZGF0YS5maW5kKChpKSA9PiBpLl9oYXNoID09PSBoYXNoKTtcclxuICAgICAgICBpZiAoIWV4aXN0cykge1xyXG4gICAgICAgICAgb2xkVGFibGUuX2RhdGEucHVzaChpdGVtIGFzIGFueSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLl9pb1Rvb2xzLnNvcnRUYWJsZURhdGFBbmRVcGRhdGVIYXNoKG9sZFRhYmxlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZWNhbGMgbWFpbiBoYXNoZXNcclxuICAgIHRoaXMuX3VwZGF0ZUdsb2JhbEhhc2goKTtcclxuICB9XHJcblxyXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxyXG4gIHByaXZhdGUgYXN5bmMgX3JlYWRSb3dzKHJlcXVlc3Q6IHtcclxuICAgIHRhYmxlOiBzdHJpbmc7XHJcbiAgICB3aGVyZTogeyBbY29sdW1uOiBzdHJpbmddOiBKc29uVmFsdWUgfTtcclxuICB9KTogUHJvbWlzZTxSbGpzb24+IHtcclxuICAgIGF3YWl0IHRoaXMuX2lvVG9vbHMudGhyb3dXaGVuVGFibGVEb2VzTm90RXhpc3QocmVxdWVzdC50YWJsZSk7XHJcbiAgICBhd2FpdCB0aGlzLl9pb1Rvb2xzLnRocm93V2hlbkNvbHVtbkRvZXNOb3RFeGlzdChcclxuICAgICAgcmVxdWVzdC50YWJsZSxcclxuICAgICAgT2JqZWN0LmtleXMocmVxdWVzdC53aGVyZSksXHJcbiAgICApO1xyXG5cclxuICAgIC8vIFJlYWQgdGFibGUgZnJvbSBkYXRhXHJcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuX21lbVtyZXF1ZXN0LnRhYmxlXSBhcyBUYWJsZVR5cGU7XHJcblxyXG4gICAgLy8gRmlsdGVyIHRhYmxlIGRhdGFcclxuICAgIGNvbnN0IHRhYmxlRGF0YUZpbHRlcmVkID0gdGFibGUuX2RhdGEuZmlsdGVyKChyb3cpID0+IHtcclxuICAgICAgZm9yIChjb25zdCBjb2x1bW4gaW4gcmVxdWVzdC53aGVyZSkge1xyXG4gICAgICAgIGNvbnN0IGEgPSByb3dbY29sdW1uXTtcclxuICAgICAgICBjb25zdCBiID0gcmVxdWVzdC53aGVyZVtjb2x1bW5dO1xyXG4gICAgICAgIGlmIChiID09PSBudWxsICYmIGEgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWVxdWFscyhhLCBiKSkge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIENyZWF0ZSBhbiB0YWJsZVxyXG4gICAgY29uc3QgdGFibGVGaWx0ZXJlZDogVGFibGVUeXBlID0ge1xyXG4gICAgICBfZGF0YTogdGFibGVEYXRhRmlsdGVyZWQsXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuX2lvVG9vbHMuc29ydFRhYmxlRGF0YUFuZFVwZGF0ZUhhc2godGFibGVGaWx0ZXJlZCk7XHJcblxyXG4gICAgY29uc3QgcmVzdWx0OiBSbGpzb24gPSB7XHJcbiAgICAgIFtyZXF1ZXN0LnRhYmxlXTogdGFibGVGaWx0ZXJlZCxcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIF9yZW1vdmVOdWxsVmFsdWVzKHJsanNvbjogUmxqc29uKSB7XHJcbiAgICBpdGVyYXRlVGFibGVzU3luYyhybGpzb24sICh0YWJsZSkgPT4ge1xyXG4gICAgICBjb25zdCBkYXRhID0gcmxqc29uW3RhYmxlXS5fZGF0YTtcclxuXHJcbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIGRhdGEpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiByb3cpIHtcclxuICAgICAgICAgIGlmIChyb3dba2V5XSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBkZWxldGUgcm93W2tleV07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIiwiLy8gQGxpY2Vuc2VcclxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxyXG4vL1xyXG4vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0ZXJtcyB0aGF0IGNhbiBiZVxyXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cclxuXHJcbmltcG9ydCB7IElvLCBJb01lbSB9IGZyb20gJy4vaW5kZXgudHMnO1xyXG5cclxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cclxuLyoqXHJcbiAqIElvIGltcGxlbWVudGF0aW9uIG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIHRvIGJlIHVzZWQgaW5cclxuICogY29uZm9ybWFuY2UgdGVzdHMuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIElvVGVzdFNldHVwIHtcclxuICAvKiogc2V0dXAgYmVmb3JlIHRoZSBzaW5nbGUgc2V0dXBzICovXHJcbiAgYmVmb3JlQWxsOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xyXG5cclxuICAvKipcclxuICAgKiBJbml0aWFsaXplcyB0aGUgaW8gaW1wbGVtZW50YXRpb24uXHJcbiAgICogQHJldHVybnMgVGhlIGlvIGltcGxlbWVudGF0aW9uLlxyXG4gICAqL1xyXG4gIGJlZm9yZUVhY2g6ICgpID0+IFByb21pc2U8dm9pZD47XHJcblxyXG4gIC8qKlxyXG4gICAqIFRlYXJzIGRvd24gdGhlIGlvIGltcGxlbWVudGF0aW9uLlxyXG4gICAqIEByZXR1cm5zIFRoZSBpbyBpbXBsZW1lbnRhdGlvbi5cclxuICAgKi9cclxuICBhZnRlckVhY2g6ICgpID0+IFByb21pc2U8dm9pZD47XHJcblxyXG4gIC8qKiBjbGVhbnVwIGFmdGVyIGFsbCB0ZXN0cyAqL1xyXG4gIGFmdGVyQWxsOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgaW8gaW1wbGVtZW50YXRpb24gdG8gYmUgdXNlZCBpbiB0aGUgY29uZm9ybWFuY2UgdGVzdHMuXHJcbiAgICovXHJcbiAgaW86IElvO1xyXG59XHJcblxyXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxyXG4vLyBFeGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBJb1Rlc3RTZXR1cCBpbnRlcmZhY2VcclxuZXhwb3J0IGNvbnN0IGV4YW1wbGVUZXN0U2V0dXAgPSAoKTogSW9UZXN0U2V0dXAgPT4ge1xyXG4gIHJldHVybiB7XHJcbiAgICBpbzogbmV3IElvTWVtKCksXHJcbiAgICBiZWZvcmVBbGw6IGFzeW5jICgpID0+IHtcclxuICAgICAgLy8gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgZm9yIGFueSBhZGRpdGlvbmFsIHNldHVwIHJlcXVpcmVkIGJlZm9yZSBpbml0LlxyXG4gICAgICAvLyBDdXJyZW50bHksIGl0IGRvZXMgbm90aGluZy5cclxuICAgIH0sXHJcblxyXG4gICAgYmVmb3JlRWFjaDogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAvLyBJbml0aWFsaXplIHRoZSBpbyBpbXBsZW1lbnRhdGlvblxyXG4gICAgfSxcclxuICAgIGFmdGVyRWFjaDogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAvLyBUZWFyIGRvd24gdGhlIGlvIGltcGxlbWVudGF0aW9uXHJcbiAgICB9LFxyXG5cclxuICAgIGFmdGVyQWxsOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgIC8vIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIGZvciBhbnkgYWRkaXRpb25hbCBjbGVhbnVwIGFmdGVyIHRlYXJEb3duLlxyXG4gICAgfSxcclxuICB9O1xyXG59O1xyXG4iLCIvLyBAbGljZW5zZVxyXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXHJcbi8vXHJcbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXHJcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxyXG5cclxuaW1wb3J0IHsgSnNvblZhbHVlIH0gZnJvbSAnQHJsanNvbi9qc29uJztcclxuaW1wb3J0IHsgUmxqc29uLCBUYWJsZUNmZywgVGFibGVLZXkgfSBmcm9tICdAcmxqc29uL3JsanNvbic7XHJcblxyXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxyXG5leHBvcnQgaW50ZXJmYWNlIElvIHtcclxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cclxuICAvLyBHZW5lcmFsXHJcblxyXG4gIC8qKiBTdGFydHMgdGhlIGluaXRpYWxpemF0aW9uICovXHJcbiAgaW5pdCgpOiBQcm9taXNlPHZvaWQ+O1xyXG5cclxuICAvKiogQ2xvc2VzIHRoZSBpbyAqL1xyXG4gIGNsb3NlKCk6IFByb21pc2U8dm9pZD47XHJcblxyXG4gIC8qKiBSZXR1cm5zIHRydWUgaWYgaW8gaXMgb3BlbmVkICovXHJcbiAgaXNPcGVuOiBib29sZWFuO1xyXG5cclxuICAvKiogQSBwcm9taXNlIHJlc29sdmluZyBvbmNlIHRoZSBJbyBpbnRlcmZhY2UgaXMgcmVhZHlcclxuICAgKlxyXG4gICAqIPCfkqEgVXNlIEBybGpzb24vaXMtcmVhZHlcclxuICAgKi9cclxuICBpc1JlYWR5KCk6IFByb21pc2U8dm9pZD47XHJcblxyXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxyXG4gIC8vIER1bXBcclxuXHJcbiAgLyoqIFJldHVybnMgdGhlIGNvbXBsZXRlIGRiIGNvbnRlbnQgYXMgUmxqc29uICovXHJcbiAgZHVtcCgpOiBQcm9taXNlPFJsanNvbj47XHJcblxyXG4gIC8qKiBSZXR1cm5zIHRoZSBkdW1wIG9mIGEgY29tcGxldGUgdGFibGUgKi9cclxuICBkdW1wVGFibGUocmVxdWVzdDogeyB0YWJsZTogc3RyaW5nIH0pOiBQcm9taXNlPFJsanNvbj47XHJcblxyXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxyXG4gIC8vIFRhYmxlc1xyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRhYmxlIGV4aXN0c1xyXG4gICAqL1xyXG4gIHRhYmxlRXhpc3RzKHRhYmxlS2V5OiBUYWJsZUtleSk6IFByb21pc2U8Ym9vbGVhbj47XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgYSB0YWJsZSB3aXRoIGEgZ2l2ZW4gY29uZmlnLlxyXG4gICAqIElmIHRoZSB0YWJsZSBhbHJlYWR5IGV4aXN0cywgbmV3IGNvbHVtbnMgYXJlIGFkZGVkIHRvIHRoZSBleGlzdGluZyB0YWJsZS5cclxuICAgKiBJZiB0aGUgdGFibGUgZG9lcyBub3QgZXhpc3QsIGl0IGlzIGNyZWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gY29uZmlnLlxyXG4gICAqIElmIHRoZSB0YWJsZSBleGlzdHMgYW5kIGNvbHVtbnMgYXJlIHJlbW92ZWQsIGFuIGVycm9yIGlzIHRocm93bi5cclxuICAgKiBJZiB0aGUgdGFibGUgZXhpc3RzIGFuZCB0aGUgY29sdW1uIHR5cGUgaXMgY2hhbmdlZCwgYW4gZXJyb3IgaXMgdGhyb3duLlxyXG4gICAqL1xyXG4gIGNyZWF0ZU9yRXh0ZW5kVGFibGUocmVxdWVzdDogeyB0YWJsZUNmZzogVGFibGVDZmcgfSk6IFByb21pc2U8dm9pZD47XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBqc29uIHN0cnVjdHVyZSByZXR1cm5pbmcgY3VycmVudCB0YWJsZSBjb25maWd1cmF0aW9uc1xyXG4gICAqL1xyXG4gIHJhd1RhYmxlQ2ZncygpOiBQcm9taXNlPFRhYmxlQ2ZnW10+O1xyXG5cclxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cclxuICAvLyBXcml0ZVxyXG5cclxuICAvKiogV3JpdGVzIFJsanNvbiBkYXRhIGludG8gdGhlIGRhdGFiYXNlICovXHJcbiAgd3JpdGUocmVxdWVzdDogeyBkYXRhOiBSbGpzb24gfSk6IFByb21pc2U8dm9pZD47XHJcblxyXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxyXG4gIC8vIFJlYWQgcm93c1xyXG5cclxuICAvKiogUXVlcmllcyBhIGxpc3Qgb2Ygcm93cyAqL1xyXG4gIHJlYWRSb3dzKHJlcXVlc3Q6IHtcclxuICAgIHRhYmxlOiBzdHJpbmc7XHJcbiAgICB3aGVyZTogeyBbY29sdW1uOiBzdHJpbmddOiBKc29uVmFsdWUgfCBudWxsIH07XHJcbiAgfSk6IFByb21pc2U8Umxqc29uPjtcclxuXHJcbiAgLyoqIFJldHVybnMgdGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBnaXZlbiB0YWJsZSAqL1xyXG4gIHJvd0NvdW50KHRhYmxlOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj47XHJcbn1cclxuXHJcbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXHJcbmV4cG9ydCBjb25zdCBleGFtcGxlSW8gPVxyXG4gICdDaGVja291dCBAcmxqc29uL2lvLW1lbSBmb3IgYW4gZXhhbXBsZSBpbXBsZW1lbnRhdGlvbic7XHJcbiIsIi8vIEBsaWNlbnNlXHJcbi8vIENvcHlyaWdodCAoYykgMjAyNSBSbGpzb25cclxuLy9cclxuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGVybXMgdGhhdCBjYW4gYmVcclxuLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHBhY2thZ2UuXHJcblxyXG5pbXBvcnQgeyBKc29uIH0gZnJvbSAnQHJsanNvbi9qc29uJztcclxuaW1wb3J0IHtcclxuICBCdWZmZXQsXHJcbiAgQ2FrZSxcclxuICBpdGVyYXRlVGFibGVzU3luYyxcclxuICBMYXllcixcclxuICBSZWYsXHJcbiAgUmxqc29uLFxyXG4gIFRhYmxlS2V5LFxyXG59IGZyb20gJ0BybGpzb24vcmxqc29uJztcclxuXHJcbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXHJcbi8qKlxyXG4gKiBEZXNjcmliZXMgYSByb3cgdGhhdCByZWZlcmVuY2VzIGEgY2hpbGQgdGFibGUgcm93XHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFBhcmVudFJlZiB7XHJcbiAgLyoqXHJcbiAgICogVGhlIHBhcmVudCB0YWJsZSB0aGF0IHJlZmVyZW5jZXMgdGhlIGNoaWxkIHRhYmxlXHJcbiAgICovXHJcbiAgW3BhcmVudFRhYmxlOiBUYWJsZUtleV06IHtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIHBhcmVudCByb3cgdGhhdCByZWZlcmVuY2VzIHRoZSBjaGlsZCByb3dcclxuICAgICAqL1xyXG4gICAgW3BhcmVudFJvdzogUmVmXToge1xyXG4gICAgICAvKipcclxuICAgICAgICogRGV0YWlscyBhYm91dCB0aGUgcmVmZXJlbmNlLCBlLmcuIGFuIGFycmF5IGluZGV4IGV0Yy5cclxuICAgICAgICovXHJcbiAgICAgIGRldGFpbHM/OiBKc29uO1xyXG4gICAgfTtcclxuICB9O1xyXG59XHJcblxyXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxyXG4vKipcclxuICogRGVzY3JpYmVzIHRoZSBwYXJlbnQgdGFibGUgcm93cyByZWZlcmVuY2luZyBhIGNoaWxkIHRhYmxlIHJvd1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBSZXZlcnNlUmVmcyB7XHJcbiAgLyoqXHJcbiAgICogVGhlIGNoaWxkIHRhYmxlIHdlIG5lZWQgdGhlIHJlZmVyZW5jaW5nIHJvd3MgZm9yXHJcbiAgICovXHJcbiAgW2NoaWxkVGFibGU6IFRhYmxlS2V5XToge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcm93IGhhc2h3ZSBuZWVkIHRoZSByZWZlcmVuY2luZyByb3dzIGZvclxyXG4gICAgICovXHJcbiAgICBbY2hpbGRSb3c6IFJlZl06IFBhcmVudFJlZjtcclxuICB9O1xyXG59XHJcblxyXG4vKiB2OCBpZ25vcmUgc3RhcnQgKi9cclxuXHJcbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXHJcbi8qKlxyXG4gKiBDYWxjdWxhdGVzIHRoZSByZXZlcnNlIHJlZmVyZW5jZXMgZm9yIGEgZ2l2ZW4gcmxqc29uIG9iamVjdFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGNhbGNSZXZlcnNlUmVmcyA9IChybGpzb246IFJsanNvbik6IFJldmVyc2VSZWZzID0+IHtcclxuICBjb25zdCByZXN1bHQ6IFJldmVyc2VSZWZzID0ge307XHJcblxyXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cclxuICAvLyBQcmVwYXJlIGRhdGEgc3RydWN0dXJlXHJcbiAgaXRlcmF0ZVRhYmxlc1N5bmMocmxqc29uLCAoY2hpbGRUYWJsZUtleSwgdGFibGUpID0+IHtcclxuICAgIGNvbnN0IGNoaWxkVGFibGU6IHsgW2NoaWxkUm93SGFzaDogc3RyaW5nXTogUGFyZW50UmVmIH0gPSB7fTtcclxuICAgIHJlc3VsdFtjaGlsZFRhYmxlS2V5XSA9IGNoaWxkVGFibGU7XHJcbiAgICBmb3IgKGNvbnN0IGNoaWxkUm93IG9mIHRhYmxlLl9kYXRhKSB7XHJcbiAgICAgIGNoaWxkVGFibGVbY2hpbGRSb3cuX2hhc2hdID0ge307XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cclxuICAvLyBHZW5lcmF0ZSByZXZlcnNlIHJlZmVyZW5jZXNcclxuICBpdGVyYXRlVGFibGVzU3luYyhybGpzb24sIChwYXJlbnRUYWJsZUtleSwgcGFyZW50VGFibGUpID0+IHtcclxuICAgIC8vIEl0ZXJhdGUgYWxsIHJvd3Mgb2YgZWFjaCB0YWJsZVxyXG4gICAgZm9yIChjb25zdCBwYXJlbnRUYWJsZVJvdyBvZiBwYXJlbnRUYWJsZS5fZGF0YSkge1xyXG4gICAgICAvLyBGaW5kIG91dCB3aGUgb3RoZXIgdGFibGVzICYgcm93cyBhcmUgcmVmZXJlbmNlZCBieSB0aGlzIHJvd1xyXG4gICAgICAvLyBXcml0ZSB0aGVzZSBpbmZvcm1hdGlvbiBpbnR0byByZXN1bHRcclxuICAgICAgc3dpdGNoIChwYXJlbnRUYWJsZS5fdHlwZSkge1xyXG4gICAgICAgIGNhc2UgJ2luZ3JlZGllbnRzJzpcclxuICAgICAgICAgIF93cml0ZUluZ3JlZGllbnRSZWZzKHBhcmVudFRhYmxlS2V5LCBwYXJlbnRUYWJsZVJvdywgcmVzdWx0KTtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlICdsYXllcnMnOiB7XHJcbiAgICAgICAgICBfd3JpdGVMYXllclJlZnMocGFyZW50VGFibGVLZXksIHBhcmVudFRhYmxlUm93LCByZXN1bHQpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjYXNlICdzbGljZUlkcyc6IHtcclxuICAgICAgICAgIC8vIFNsaWNlIGlkcyBkbyBub3QgcmVmZXJlbmNlIG90aGVyIHRhYmxlc1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjYXNlICdjYWtlcyc6IHtcclxuICAgICAgICAgIF93cml0ZUNha2VSZWZzKHBhcmVudFRhYmxlS2V5LCBwYXJlbnRUYWJsZVJvdywgcmVzdWx0KTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY2FzZSAnYnVmZmV0cyc6IHtcclxuICAgICAgICAgIF93cml0ZUJ1ZmZldFJlZnMocGFyZW50VGFibGVLZXksIHBhcmVudFRhYmxlUm93LCByZXN1bHQpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIHJldHVybiByZXN1bHQ7XHJcbn07XHJcblxyXG4vKiB2OCBpZ25vcmUgZW5kICovXHJcblxyXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxyXG5jb25zdCBfd3JpdGVJbmdyZWRpZW50UmVmcyA9IChcclxuICBwYXJlbnRUYWJsZU5hbWU6IFRhYmxlS2V5LFxyXG4gIHBhcmVudFJvdzogSnNvbixcclxuICByZXN1bHQ6IFJldmVyc2VSZWZzLFxyXG4pID0+IHtcclxuICBjb25zdCBwYXJlbnRSb3dIYXNoID0gcGFyZW50Um93Ll9oYXNoIGFzIHN0cmluZztcclxuXHJcbiAgZm9yIChjb25zdCBwYXJlbnRDb2x1bW5OYW1lIGluIHBhcmVudFJvdykge1xyXG4gICAgaWYgKHBhcmVudENvbHVtbk5hbWUuc3RhcnRzV2l0aCgnXycpKSB7XHJcbiAgICAgIGNvbnRpbnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghcGFyZW50Q29sdW1uTmFtZS5lbmRzV2l0aCgnUmVmJykpIHtcclxuICAgICAgY29udGludWU7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY2hpbGRUYWJsZU5hbWUgPSBwYXJlbnRDb2x1bW5OYW1lLnNsaWNlKDAsIC0zKTtcclxuICAgIGNvbnN0IGNoaWxkUm93SGFzaCA9IHBhcmVudFJvd1twYXJlbnRDb2x1bW5OYW1lXSBhcyBzdHJpbmc7XHJcblxyXG4gICAgX3dyaXRlKFxyXG4gICAgICByZXN1bHQsXHJcbiAgICAgIGNoaWxkVGFibGVOYW1lLFxyXG4gICAgICBjaGlsZFJvd0hhc2gsXHJcbiAgICAgIHBhcmVudFRhYmxlTmFtZSxcclxuICAgICAgcGFyZW50Um93SGFzaCxcclxuICAgICk7XHJcbiAgfVxyXG59O1xyXG5cclxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cclxuY29uc3QgX3dyaXRlTGF5ZXJSZWZzID0gKFxyXG4gIHBhcmVudFRhYmxlTmFtZTogVGFibGVLZXksXHJcbiAgcGFyZW50Um93OiBMYXllcixcclxuICByZXN1bHQ6IFJldmVyc2VSZWZzLFxyXG4pID0+IHtcclxuICBjb25zdCBjaGlsZFRhYmxlTmFtZSA9IHBhcmVudFJvdy5pbmdyZWRpZW50c1RhYmxlO1xyXG4gIGNvbnN0IHBhcmVudFJvd0hhc2ggPSBwYXJlbnRSb3cuX2hhc2ggYXMgc3RyaW5nO1xyXG5cclxuICBmb3IgKGNvbnN0IHNsaWNlSWQgaW4gcGFyZW50Um93LmFzc2lnbikge1xyXG4gICAgaWYgKHNsaWNlSWQuc3RhcnRzV2l0aCgnXycpKSB7XHJcbiAgICAgIGNvbnRpbnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHNsaWNlSGFzaCA9IHBhcmVudFJvdy5hc3NpZ25bc2xpY2VJZF0gYXMgc3RyaW5nO1xyXG5cclxuICAgIF93cml0ZShyZXN1bHQsIGNoaWxkVGFibGVOYW1lLCBzbGljZUhhc2gsIHBhcmVudFRhYmxlTmFtZSwgcGFyZW50Um93SGFzaCk7XHJcbiAgfVxyXG59O1xyXG5cclxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cclxuY29uc3QgX3dyaXRlQ2FrZVJlZnMgPSAoXHJcbiAgcGFyZW50VGFibGVOYW1lOiBUYWJsZUtleSxcclxuICBwYXJlbnRSb3c6IENha2UsXHJcbiAgcmVzdWx0OiBSZXZlcnNlUmVmcyxcclxuKSA9PiB7XHJcbiAgY29uc3QgcGFyZW50Um93SGFzaCA9IHBhcmVudFJvdy5faGFzaCBhcyBzdHJpbmc7XHJcblxyXG4gIGZvciAoY29uc3QgbGF5ZXIgaW4gcGFyZW50Um93LmxheWVycykge1xyXG4gICAgY29uc3QgY2hpbGRUYWJsZU5hbWUgPSBwYXJlbnRSb3cubGF5ZXJzVGFibGU7XHJcbiAgICBjb25zdCBjaGlsZFJvd0hhc2ggPSBwYXJlbnRSb3cubGF5ZXJzW2xheWVyXSBhcyBzdHJpbmc7XHJcbiAgICBfd3JpdGUoXHJcbiAgICAgIHJlc3VsdCxcclxuICAgICAgY2hpbGRUYWJsZU5hbWUsXHJcbiAgICAgIGNoaWxkUm93SGFzaCxcclxuICAgICAgcGFyZW50VGFibGVOYW1lLFxyXG4gICAgICBwYXJlbnRSb3dIYXNoLFxyXG4gICAgKTtcclxuICB9XHJcbn07XHJcblxyXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxyXG5jb25zdCBfd3JpdGVCdWZmZXRSZWZzID0gKFxyXG4gIHBhcmVudFRhYmxlTmFtZTogVGFibGVLZXksXHJcbiAgcGFyZW50Um93OiBCdWZmZXQsXHJcbiAgcmVzdWx0OiBSZXZlcnNlUmVmcyxcclxuKSA9PiB7XHJcbiAgY29uc3QgcGFyZW50Um93SGFzaCA9IHBhcmVudFJvdy5faGFzaCBhcyBzdHJpbmc7XHJcblxyXG4gIGZvciAoY29uc3QgaXRlbSBvZiBwYXJlbnRSb3cuaXRlbXMpIHtcclxuICAgIGNvbnN0IGNoaWxkVGFibGVOYW1lID0gaXRlbS50YWJsZTtcclxuICAgIGNvbnN0IGNoaWxkUm93SGFzaCA9IGl0ZW0ucmVmO1xyXG4gICAgX3dyaXRlKFxyXG4gICAgICByZXN1bHQsXHJcbiAgICAgIGNoaWxkVGFibGVOYW1lLFxyXG4gICAgICBjaGlsZFJvd0hhc2gsXHJcbiAgICAgIHBhcmVudFRhYmxlTmFtZSxcclxuICAgICAgcGFyZW50Um93SGFzaCxcclxuICAgICk7XHJcbiAgfVxyXG59O1xyXG5cclxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cclxuY29uc3QgX3dyaXRlID0gKFxyXG4gIHJlc3VsdDogUmV2ZXJzZVJlZnMsXHJcbiAgY2hpbGRUYWJsZU5hbWU6IHN0cmluZyxcclxuICBjaGlsZFJvd0hhc2g6IHN0cmluZyxcclxuICBwYXJlbnRUYWJsZU5hbWU6IHN0cmluZyxcclxuICBwYXJlbnRSb3dIYXNoOiBzdHJpbmcsXHJcbikgPT4ge1xyXG4gIGNvbnN0IHJlZmVyZW5jZXNGb3JDaGlsZFRhYmxlID0gKHJlc3VsdFtjaGlsZFRhYmxlTmFtZV0gPz89IHt9KTtcclxuICBjb25zdCByZWZlcmVuY2VzRm9yQ2hpbGRUYWJsZVJvdyA9IChyZWZlcmVuY2VzRm9yQ2hpbGRUYWJsZVtjaGlsZFJvd0hhc2hdID8/PVxyXG4gICAge30pO1xyXG5cclxuICByZWZlcmVuY2VzRm9yQ2hpbGRUYWJsZVJvd1twYXJlbnRUYWJsZU5hbWVdID8/PSB7fTtcclxuICByZWZlcmVuY2VzRm9yQ2hpbGRUYWJsZVJvd1twYXJlbnRUYWJsZU5hbWVdW3BhcmVudFJvd0hhc2hdID8/PSB7fTtcclxufTtcclxuIl0sIm5hbWVzIjpbImUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQXVCTyxNQUFNLFdBQU4sTUFBTSxTQUFRO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtuQixZQUE0QixJQUFRO0FBaUNwQztBQUFBO0FBQUE7QUFBQSw4Q0FBcUIsWUFBWTtB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
602
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW8uanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9pby10b29scy50cyIsIi4uL3NyYy9pby1tZW0udHMiLCIuLi9zcmMvaW8tdGVzdC1zZXR1cC50cyIsIi4uL3NyYy9pby50cyIsIi4uL3NyYy9yZXZlcnNlLXJlZi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuaW1wb3J0IHsgaGlwIH0gZnJvbSAnQHJsanNvbi9oYXNoJztcbmltcG9ydCB7XG4gIGl0ZXJhdGVUYWJsZXMsXG4gIFJsanNvbixcbiAgVGFibGVDZmcsXG4gIFRhYmxlS2V5LFxuICBUYWJsZVR5cGUsXG4gIHRocm93T25JbnZhbGlkVGFibGVDZmcsXG4gIHZhbGlkYXRlUmxqc29uQWdhaW5zdFRhYmxlQ2ZnLFxufSBmcm9tICdAcmxqc29uL3JsanNvbic7XG5cbmltcG9ydCB7IElvTWVtIH0gZnJvbSAnLi9pby1tZW0udHMnO1xuaW1wb3J0IHsgSW8gfSBmcm9tICcuL2lvLnRzJztcblxuLyoqXG4gKiBQcm92aWRlcyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgdGhlIElvIGludGVyZmFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIElvVG9vbHMge1xuICAvKipcbiAgICogQ29uc3RydWN0b3JcbiAgICogQHBhcmFtIGlvIFRoZSBJbyBpbnRlcmZhY2UgdG8gdXNlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgaW86IElvKSB7fVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0YWJsZSBjb25maWd1cmF0aW9uIG9mIHRoZSB0YWJsZUNmZ3MgdGFibGUuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlQ2Znc1RhYmxlQ2ZnKCkge1xuICAgIGNvbnN0IHRhYmxlQ2ZnID0gaGlwPFRhYmxlQ2ZnPih7XG4gICAgICBfaGFzaDogJycsXG4gICAgICBrZXk6ICd0YWJsZUNmZ3MnLFxuICAgICAgdHlwZTogJ3RhYmxlQ2ZncycsXG4gICAgICBpc0hlYWQ6IGZhbHNlLFxuICAgICAgaXNSb290OiBmYWxzZSxcbiAgICAgIGlzU2hhcmVkOiB0cnVlLFxuICAgICAgcHJldmlvdXM6ICcnLFxuXG4gICAgICBjb2x1bW5zOiBbXG4gICAgICAgIHsga2V5OiAnX2hhc2gnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICB7IGtleTogJ2tleScsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHsga2V5OiAndHlwZScsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHsga2V5OiAnaXNIZWFkJywgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgICAgIHsga2V5OiAnaXNSb290JywgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgICAgIHsga2V5OiAnaXNTaGFyZWQnLCB0eXBlOiAnYm9vbGVhbicgfSxcbiAgICAgICAgeyBrZXk6ICdwcmV2aW91cycsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHsga2V5OiAnY29sdW1ucycsIHR5cGU6ICdqc29uQXJyYXknIH0sXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRhYmxlQ2ZnO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSByZXZpc2lvbnMgdGFibGUuXG4gICAqL1xuICBpbml0UmV2aXNpb25zVGFibGUgPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGVDZmc6IFRhYmxlQ2ZnID0ge1xuICAgICAga2V5OiAncmV2aXNpb25zJyxcbiAgICAgIHR5cGU6ICdyZXZpc2lvbnMnLFxuICAgICAgaXNIZWFkOiB0cnVlLFxuICAgICAgaXNSb290OiB0cnVlLFxuICAgICAgaXNTaGFyZWQ6IGZhbHNlLFxuXG4gICAgICBjb2x1bW5zOiBbXG4gICAgICAgIHsga2V5OiAnX2hhc2gnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICB7IGtleTogJ3RhYmxlJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgeyBrZXk6ICdwcmVkZWNlc3NvcicsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHsga2V5OiAnc3VjY2Vzc29yJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgeyBrZXk6ICd0aW1lc3RhbXAnLCB0eXBlOiAnbnVtYmVyJyB9LFxuICAgICAgICB7IGtleTogJ2lkJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgIF0sXG4gICAgfTtcblxuICAgIGF3YWl0IHRoaXMuaW8uY3JlYXRlT3JFeHRlbmRUYWJsZSh7IHRhYmxlQ2ZnIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBFeGFtcGxlIG9iamVjdCBmb3IgdGVzdCBwdXJwb3Nlc1xuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiBpbyB0b29sc1xuICAgKi9cbiAgc3RhdGljIGV4YW1wbGUgPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgaW8gPSBhd2FpdCBJb01lbS5leGFtcGxlKCk7XG4gICAgYXdhaXQgaW8uaW5pdCgpO1xuICAgIGF3YWl0IGlvLmlzUmVhZHkoKTtcbiAgICByZXR1cm4gbmV3IElvVG9vbHMoaW8pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaHJvd3MgaWYgdGhlIHRhYmxlIGRvZXMgbm90IGV4aXN0XG4gICAqL1xuICBhc3luYyB0aHJvd1doZW5UYWJsZURvZXNOb3RFeGlzdCh0YWJsZTogVGFibGVLZXkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBleGlzdHMgPSBhd2FpdCB0aGlzLmlvLnRhYmxlRXhpc3RzKHRhYmxlKTtcbiAgICBpZiAoIWV4aXN0cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSBcIiR7dGFibGV9XCIgbm90IGZvdW5kYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBpZiBhbnkgb2YgdGhlIHRhYmxlcyBpbiBybGpzb24gZG8gbm90IGV4aXN0XG4gICAqIEBwYXJhbSBybGpzb24gLSBUaGUgUmxqc29uIG9iamVjdCB0byBjaGVja1xuICAgKi9cbiAgYXN5bmMgdGhyb3dXaGVuVGFibGVzRG9Ob3RFeGlzdChybGpzb246IFJsanNvbik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBpdGVyYXRlVGFibGVzKHJsanNvbiwgYXN5bmMgKHRhYmxlS2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IGV4aXN0cyA9IGF3YWl0IHRoaXMuaW8udGFibGVFeGlzdHModGFibGVLZXkpO1xuICAgICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGFibGUgXCIke3RhYmxlS2V5fVwiIG5vdCBmb3VuZGApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zdCBtaXNzaW5nVGFibGVzID0gKGUgYXMgQXJyYXk8YW55PikubWFwKChlKSA9PiBlLnRhYmxlS2V5KTtcblxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIGZvbGxvd2luZyB0YWJsZXMgZG8gbm90IGV4aXN0OiAke21pc3NpbmdUYWJsZXMuam9pbignLCAnKX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCB0YWJsZSBjZmdzIG9mIGFsbCB0YWJsZXNcbiAgICogQHJldHVybnMgVGhlIHRhYmxlIGNvbmZpZ3VyYXRpb24gb2YgYWxsIHRhYmxlc1xuICAgKi9cbiAgYXN5bmMgdGFibGVDZmdzKCk6IFByb21pc2U8VGFibGVDZmdbXT4ge1xuICAgIGNvbnN0IHRhYmxlcyA9IGF3YWl0IHRoaXMuaW8ucmF3VGFibGVDZmdzKCk7XG5cbiAgICAvLyBUYWtlIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBlYWNoIHR5cGUga2V5XG4gICAgY29uc3QgbmV3ZXN0VmVyc2lvbjogUmVjb3JkPFRhYmxlS2V5LCBUYWJsZUNmZz4gPSB7fTtcbiAgICBmb3IgKGxldCBpID0gdGFibGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCB0YWJsZSA9IHRhYmxlc1tpXTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gbmV3ZXN0VmVyc2lvblt0YWJsZS5rZXldO1xuICAgICAgLyogdjggaWdub3JlIHN0YXJ0ICovXG4gICAgICBpZiAoIWV4aXN0aW5nIHx8IGV4aXN0aW5nLmNvbHVtbnMubGVuZ3RoIDwgdGFibGUuY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgbmV3ZXN0VmVyc2lvblt0YWJsZS5rZXldID0gdGFibGU7XG4gICAgICB9XG4gICAgICAvKiB2OCBpZ25vcmUgZW5kICovXG4gICAgfVxuXG4gICAgLy8gU29ydCB0aGUgdGFibGVzIGJ5IGtleVxuICAgIGNvbnN0IHJlc3VsdERhdGEgPSBPYmplY3QudmFsdWVzKG5ld2VzdFZlcnNpb24pLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGlmIChhLmtleSA8IGIua2V5KSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIGlmIChhLmtleSA+IGIua2V5KSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgICAvKiB2OCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIDA7XG4gICAgICAvKiB2OCBpZ25vcmUgZW5kICovXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdERhdGE7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgd2l0aCBhbGwgdGFibGUgbmFtZXNcbiAgICovXG4gIGFzeW5jIGFsbFRhYmxlS2V5cygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gKGF3YWl0IHRoaXMudGFibGVDZmdzKCkpLm1hcCgoZSkgPT4gZS5rZXkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBvZiBhIGdpdmVuIHRhYmxlXG4gICAqL1xuICBhc3luYyB0YWJsZUNmZyh0YWJsZTogVGFibGVLZXkpOiBQcm9taXNlPFRhYmxlQ2ZnPiB7XG4gICAgY29uc3QgdGFibGVDZmcgPSBhd2FpdCB0aGlzLnRhYmxlQ2ZnT3JOdWxsKHRhYmxlKTtcbiAgICBpZiAoIXRhYmxlQ2ZnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlIFwiJHt0YWJsZX1cIiBub3QgZm91bmRgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFibGVDZmchO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBnaXZlbiB0YWJsZSBvciBudWxsIGlmIGl0IGRvZXMgbm90IGV4aXN0LlxuXG4gICAqL1xuICBhc3luYyB0YWJsZUNmZ09yTnVsbCh0YWJsZTogVGFibGVLZXkpOiBQcm9taXNlPFRhYmxlQ2ZnIHwgbnVsbD4ge1xuICAgIGNvbnN0IHRhYmxlQ2ZncyA9IGF3YWl0IHRoaXMudGFibGVDZmdzKCk7XG4gICAgY29uc3QgdGFibGVDZmcgPSB0YWJsZUNmZ3MuZmluZCgoZSkgPT4gZS5rZXkgPT09IHRhYmxlKTtcbiAgICByZXR1cm4gdGFibGVDZmcgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgY29sdW1uIG5hbWVzIG9mIGEgZ2l2ZW4gdGFibGVcbiAgICovXG4gIGFzeW5jIGFsbENvbHVtbktleXModGFibGU6IFRhYmxlS2V5KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHRhYmxlQ2ZnID0gYXdhaXQgdGhpcy50YWJsZUNmZyh0YWJsZSk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGFibGVDZmcuY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gY29sdW1uLmtleSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3Mgd2hlbiBhIGNvbHVtbiBkb2VzIG5vdCBleGlzdCBpbiBhIGdpdmVuIHRhYmxlXG4gICAqIEBwYXJhbSB0YWJsZSAtIFRoZSB0YWJsZSB0byBjaGVja1xuICAgKiBAcGFyYW0gY29sdW1ucyAtIFRoZSBjb2x1bW4gdG8gY2hlY2tcbiAgICovXG4gIGFzeW5jIHRocm93V2hlbkNvbHVtbkRvZXNOb3RFeGlzdChcbiAgICB0YWJsZTogVGFibGVLZXksXG4gICAgY29sdW1uczogc3RyaW5nW10sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRhYmxlQ2ZnID0gYXdhaXQgdGhpcy50YWJsZUNmZyh0YWJsZSk7XG4gICAgY29uc3QgY29sdW1uS2V5cyA9IHRhYmxlQ2ZnLmNvbHVtbnMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5rZXkpO1xuICAgIGNvbnN0IG1pc3NpbmdDb2x1bW5zID0gY29sdW1ucy5maWx0ZXIoXG4gICAgICAoY29sdW1uKSA9PiAhY29sdW1uS2V5cy5pbmNsdWRlcyhjb2x1bW4pLFxuICAgICk7XG4gICAgaWYgKG1pc3NpbmdDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSBmb2xsb3dpbmcgY29sdW1ucyBkbyBub3QgZXhpc3QgaW4gdGFibGUgXCIke3RhYmxlfVwiOiAke21pc3NpbmdDb2x1bW5zLmpvaW4oXG4gICAgICAgICAgJywgJyxcbiAgICAgICAgKX0uYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyB3aGVuIGEgdGFibGUgdXBkYXRlIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgdGFibGVcbiAgICogY29uZmlndXJhdGlvbi5cbiAgICovXG4gIGFzeW5jIHRocm93V2hlblRhYmxlSXNOb3RDb21wYXRpYmxlKHVwZGF0ZTogVGFibGVDZmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwcmVmaXggPSBgSW52YWxpZCB1cGRhdGUgb2YgdGFibGUgYWJsZSBcIiR7dXBkYXRlLmtleX1cImA7XG5cbiAgICB0aHJvd09uSW52YWxpZFRhYmxlQ2ZnKHVwZGF0ZSk7XG5cbiAgICAvLyBDaGVjayBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgdGFibGVcbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHRoaXMudGFibGVDZmdPck51bGwodXBkYXRlLmtleSk7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAvLyBIYXZlIGNvbHVtbnMgYmVlbiBkZWxldGVkP1xuICAgICAgaWYgKGV4aXN0aW5nLmNvbHVtbnMubGVuZ3RoID4gdXBkYXRlLmNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGRlbGV0ZWRDb2x1bW5LZXlzID0gZXhpc3RpbmcuY29sdW1uc1xuICAgICAgICAgIC5tYXAoKGNvbHVtbikgPT4gY29sdW1uLmtleSlcbiAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgKGtleSkgPT4gIXVwZGF0ZS5jb2x1bW5zLnNvbWUoKGNvbHVtbikgPT4gY29sdW1uLmtleSA9PT0ga2V5KSxcbiAgICAgICAgICApO1xuICAgICAgICBpZiAoZGVsZXRlZENvbHVtbktleXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGRlbGV0ZWRDb2x1bW5zID0gZGVsZXRlZENvbHVtbktleXMuam9pbignLCAnKTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgJHtwcmVmaXh9OiBDb2x1bW5zIG11c3Qgbm90IGJlIGRlbGV0ZWQuIGAgK1xuICAgICAgICAgICAgICBgRGVsZXRlZCBjb2x1bW5zOiAke2RlbGV0ZWRDb2x1bW5zfX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSGF2ZSBjb2x1bW4ga2V5cyBjaGFuZ2VkP1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleGlzdGluZy5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGJlZm9yZSA9IGV4aXN0aW5nLmNvbHVtbnNbaV0ua2V5O1xuICAgICAgICBjb25zdCBhZnRlciA9IHVwZGF0ZS5jb2x1bW5zW2ldLmtleTtcbiAgICAgICAgaWYgKGJlZm9yZSAhPT0gYWZ0ZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgJHtwcmVmaXh9OiBgICtcbiAgICAgICAgICAgICAgYENvbHVtbiBrZXlzIG11c3Qgbm90IGNoYW5nZSEgYCArXG4gICAgICAgICAgICAgIGBDb2x1bW4gXCIke2JlZm9yZX1cIiB3YXMgcmVuYW1lZCBpbnRvIFwiJHthZnRlcn1cIi5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSGF2ZSBjb2x1bW4gdHlwZXMgY2hhbmdlZD9cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhpc3RpbmcuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSBleGlzdGluZy5jb2x1bW5zW2ldLmtleTtcbiAgICAgICAgY29uc3QgYmVmb3JlID0gZXhpc3RpbmcuY29sdW1uc1tpXS50eXBlO1xuICAgICAgICBjb25zdCBhZnRlciA9IHVwZGF0ZS5jb2x1bW5zW2ldLnR5cGU7XG4gICAgICAgIGlmIChiZWZvcmUgIT09IGFmdGVyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYCR7cHJlZml4fTogYCArXG4gICAgICAgICAgICAgIGBDb2x1bW4gdHlwZXMgbXVzdCBub3QgY2hhbmdlISBgICtcbiAgICAgICAgICAgICAgYFR5cGUgb2YgY29sdW1uIFwiJHtjb2x1bW59XCIgd2FzIGNoYW5nZWQgZnJvbSBcIiR7YmVmb3JlfVwiIHRvICR7YWZ0ZXJ9LmAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgaWYgdGhlIGRhdGEgaW4gdGhlIHRhYmxlIGRvIG5vdCBtYXRjaCB0aGUgdGFibGUgY29uZmlndXJhdGlvblxuICAgKi9cbiAgYXN5bmMgdGhyb3dXaGVuVGFibGVEYXRhRG9lc05vdE1hdGNoQ2ZnKGRhdGE6IFJsanNvbikge1xuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgIGF3YWl0IGl0ZXJhdGVUYWJsZXMoZGF0YSwgYXN5bmMgKHRhYmxlS2V5KSA9PiB7XG4gICAgICBjb25zdCB0YWJsZUNmZyA9IGF3YWl0IHRoaXMudGFibGVDZmcodGFibGVLZXkpO1xuICAgICAgY29uc3QgdGFibGUgPSBkYXRhW3RhYmxlS2V5XTtcbiAgICAgIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlUmxqc29uQWdhaW5zdFRhYmxlQ2ZnKHRhYmxlLl9kYXRhLCB0YWJsZUNmZykpO1xuICAgIH0pO1xuXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUYWJsZSBkYXRhIGRvZXMgbm90IG1hdGNoIHRoZSBjb25maWd1cmF0aW9uLlxcblxcbkVycm9yczpcXG4ke2Vycm9yc1xuICAgICAgICAgIC5tYXAoKGUpID0+IGAtICR7ZX1gKVxuICAgICAgICAgIC5qb2luKCdcXG4nKX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU29ydHMgdGhlIGRhdGEgb2YgYSB0YWJsZSBieSB0aGUgaGFzaCBhbmQgdXBkYXRlcyB0aGUgdGFibGUgaGFzaCBpbiBwbGFjZVxuICAgKi9cbiAgc29ydFRhYmxlRGF0YUFuZFVwZGF0ZUhhc2godGFibGU6IFRhYmxlVHlwZSk6IHZvaWQge1xuICAgIHRhYmxlLl9kYXRhLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGhhc2hBID0gYS5faGFzaCBhcyBzdHJpbmc7XG4gICAgICBjb25zdCBoYXNoQiA9IGIuX2hhc2ggYXMgc3RyaW5nO1xuICAgICAgaWYgKGhhc2hBIDwgaGFzaEIpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgaWYgKGhhc2hBID4gaGFzaEIpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIC8qIHY4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gMDtcbiAgICAgIC8qIHY4IGlnbm9yZSBlbmQgKi9cbiAgICB9KTtcblxuICAgIHRhYmxlLl9oYXNoID0gJyc7XG4gICAgaGlwKHRhYmxlLCB7XG4gICAgICB1cGRhdGVFeGlzdGluZ0hhc2hlczogZmFsc2UsXG4gICAgICB0aHJvd09uV3JvbmdIYXNoZXM6IGZhbHNlLFxuICAgIH0pO1xuICB9XG59XG4iLCIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuaW1wb3J0IHsgaGlwLCBoc2ggfSBmcm9tICdAcmxqc29uL2hhc2gnO1xuaW1wb3J0IHsgSXNSZWFkeSB9IGZyb20gJ0BybGpzb24vaXMtcmVhZHknO1xuaW1wb3J0IHsgY29weSwgZXF1YWxzLCBKc29uVmFsdWUgfSBmcm9tICdAcmxqc29uL2pzb24nO1xuaW1wb3J0IHtcbiAgaXRlcmF0ZVRhYmxlc1N5bmMsXG4gIFJsanNvbixcbiAgVGFibGVDZmcsXG4gIFRhYmxlS2V5LFxuICBUYWJsZVR5cGUsXG59IGZyb20gJ0BybGpzb24vcmxqc29uJztcblxuaW1wb3J0IHsgSW9Ub29scyB9IGZyb20gJy4vaW8tdG9vbHMudHMnO1xuaW1wb3J0IHsgSW8gfSBmcm9tICcuL2lvLnRzJztcblxuLyoqXG4gKiBJbi1NZW1vcnkgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJsanNvbiBJbyBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBJb01lbSBpbXBsZW1lbnRzIElvIHtcbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIENvbnN0cnVjdG9yICYgZXhhbXBsZVxuXG4gIGluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5faXNPcGVuID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5faW5pdCgpO1xuICB9XG5cbiAgY2xvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5faXNPcGVuID0gZmFsc2U7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgZ2V0IGlzT3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNPcGVuO1xuICB9XG5cbiAgc3RhdGljIGV4YW1wbGUgPSBhc3luYyAoKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBJb01lbSgpO1xuICB9O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBHZW5lcmFsXG4gIGlzUmVhZHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzUmVhZHkucHJvbWlzZTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBEdW1wXG5cbiAgZHVtcCgpOiBQcm9taXNlPFJsanNvbj4ge1xuICAgIHJldHVybiB0aGlzLl9kdW1wKCk7XG4gIH1cblxuICBhc3luYyBkdW1wVGFibGUocmVxdWVzdDogeyB0YWJsZTogc3RyaW5nIH0pOiBQcm9taXNlPFJsanNvbj4ge1xuICAgIHJldHVybiB0aGlzLl9kdW1wVGFibGUocmVxdWVzdCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gUm93c1xuXG4gIHJlYWRSb3dzKHJlcXVlc3Q6IHtcbiAgICB0YWJsZTogc3RyaW5nO1xuICAgIHdoZXJlOiB7IFtjb2x1bW46IHN0cmluZ106IEpzb25WYWx1ZSB9O1xuICB9KTogUHJvbWlzZTxSbGpzb24+IHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZFJvd3MocmVxdWVzdCk7XG4gIH1cblxuICBhc3luYyByb3dDb3VudCh0YWJsZTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB0YWJsZURhdGEgPSB0aGlzLl9tZW1bdGFibGVdIGFzIFRhYmxlVHlwZTtcbiAgICBpZiAoIXRhYmxlRGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSBcIiR7dGFibGV9XCIgbm90IGZvdW5kYCk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGFibGVEYXRhLl9kYXRhLmxlbmd0aCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gV3JpdGVcblxuICB3cml0ZShyZXF1ZXN0OiB7IGRhdGE6IFJsanNvbiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dyaXRlKHJlcXVlc3QpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFRhYmxlIG1hbmFnZW1lbnRcbiAgYXN5bmMgdGFibGVFeGlzdHModGFibGVLZXk6IFRhYmxlS2V5KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLl9tZW1bdGFibGVLZXldIGFzIFRhYmxlVHlwZTtcbiAgICByZXR1cm4gdGFibGUgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICBjcmVhdGVPckV4dGVuZFRhYmxlKHJlcXVlc3Q6IHsgdGFibGVDZmc6IFRhYmxlQ2ZnIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlT3JFeHRlbmRUYWJsZShyZXF1ZXN0KTtcbiAgfVxuXG4gIGFzeW5jIHJhd1RhYmxlQ2ZncygpOiBQcm9taXNlPFRhYmxlQ2ZnW10+IHtcbiAgICBjb25zdCB0YWJsZXMgPSB0aGlzLl9tZW0udGFibGVDZmdzLl9kYXRhIGFzIFRhYmxlQ2ZnW107XG4gICAgcmV0dXJuIHRhYmxlcztcbiAgfVxuXG4gIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiAgLy8gUHJpdmF0ZVxuICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cbiAgcHJpdmF0ZSBfaW9Ub29scyE6IElvVG9vbHM7XG5cbiAgcHJpdmF0ZSBfaXNSZWFkeSA9IG5ldyBJc1JlYWR5KCk7XG4gIHByaXZhdGUgX2lzT3BlbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX21lbTogUmxqc29uID0gaGlwKHt9IGFzIFJsanNvbik7XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX2luaXQoKSB7XG4gICAgdGhpcy5faW9Ub29scyA9IG5ldyBJb1Rvb2xzKHRoaXMpO1xuICAgIHRoaXMuX2luaXRUYWJsZUNmZ3MoKTtcbiAgICB0aGlzLl91cGRhdGVHbG9iYWxIYXNoKCk7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy5pbml0UmV2aXNpb25zVGFibGUoKTtcbiAgICBoc2godGhpcy5fbWVtKTtcblxuICAgIHRoaXMuX2lzUmVhZHkucmVzb2x2ZSgpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgX2luaXRUYWJsZUNmZ3MgPSAoKSA9PiB7XG4gICAgY29uc3QgdGFibGVDZmcgPSBJb1Rvb2xzLnRhYmxlQ2Znc1RhYmxlQ2ZnO1xuXG4gICAgdGhpcy5fbWVtLnRhYmxlQ2ZncyA9IGhpcCh7XG4gICAgICBfdHlwZTogJ3RhYmxlQ2ZncycsXG4gICAgICBfZGF0YTogW3RhYmxlQ2ZnXSxcbiAgICAgIF90YWJsZUNmZzogdGFibGVDZmcuX2hhc2ggYXMgc3RyaW5nLFxuICAgIH0pO1xuICB9O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF91cGRhdGVHbG9iYWxIYXNoKCkge1xuICAgICh0aGlzLl9tZW0gYXMgYW55KS5faGFzaCA9ICcnO1xuICAgIGhpcCh0aGlzLl9tZW0sIHtcbiAgICAgIHVwZGF0ZUV4aXN0aW5nSGFzaGVzOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF91cGRhdGVUYWJsZUhhc2godGFibGVLZXk6IFRhYmxlS2V5KSB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLl9tZW1bdGFibGVLZXldIGFzIFRhYmxlVHlwZTtcbiAgICB0YWJsZS5faGFzaCA9ICcnO1xuICAgIGhpcCh0YWJsZSwgeyB1cGRhdGVFeGlzdGluZ0hhc2hlczogZmFsc2UgfSk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBhc3luYyBfY3JlYXRlT3JFeHRlbmRUYWJsZShyZXF1ZXN0OiB7XG4gICAgdGFibGVDZmc6IFRhYmxlQ2ZnO1xuICB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHRhYmxlIGNvbmZpZyBpcyBjb21wYXRpYmxlXG4gICAgLy8gd2l0aCBhbiBwb3RlbnRpYWwgZXhpc3RpbmcgdGFibGVcbiAgICBjb25zdCB0YWJsZUNmZyA9IHJlcXVlc3QudGFibGVDZmc7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZUlzTm90Q29tcGF0aWJsZSh0YWJsZUNmZyk7XG5cbiAgICBjb25zdCB7IGtleSB9ID0gdGFibGVDZmc7XG5cbiAgICAvLyBSZWNyZWF0ZSBoYXNoZXMgaW4gdGhlIGNhc2UgdGhlIGV4aXN0aW5nIGhhc2hlcyBhcmUgd3JvbmdcbiAgICBjb25zdCBuZXdDb25maWcgPSBoc2godGFibGVDZmcpO1xuXG4gICAgLy8gRmluZCBhbiBleGlzdGluZyB0YWJsZSBjb25maWcgd2l0aCB0aGUgc2FtZSBoYXNoXG4gICAgY29uc3QgZXhpc3RpbmdDb25maWcgPSBhd2FpdCB0aGlzLl9pb1Rvb2xzLnRhYmxlQ2ZnT3JOdWxsKGtleSk7XG5cbiAgICAvLyBXcml0ZSB0aGUgbmV3IGNvbmZpZyBpbnRvIHRoZSBkYXRhYmFzZVxuICAgIGlmICghZXhpc3RpbmdDb25maWcpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVRhYmxlKG5ld0NvbmZpZywga2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZXh0ZW5kVGFibGUoZXhpc3RpbmdDb25maWcsIG5ld0NvbmZpZyk7XG4gICAgfVxuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgX2NyZWF0ZVRhYmxlKG5ld0NvbmZpZzogVGFibGVDZmcsIHRhYmxlS2V5OiBUYWJsZUtleSkge1xuICAgIC8vIFdyaXRlIHRoZSB0YWJsZSBjb25maWcgaW50byB0aGUgZGF0YWJhc2VcbiAgICBuZXdDb25maWcgPSBoc2gobmV3Q29uZmlnKTtcbiAgICB0aGlzLl9tZW0udGFibGVDZmdzLl9kYXRhLnB1c2gobmV3Q29uZmlnKTtcbiAgICB0aGlzLl9pb1Rvb2xzLnNvcnRUYWJsZURhdGFBbmRVcGRhdGVIYXNoKHRoaXMuX21lbS50YWJsZUNmZ3MpO1xuXG4gICAgLy8gQ3JlYXRlIGEgdGFibGUgYW5kIHdyaXRlIGl0IGludG8gdGhlIGRhdGFiYXNlXG4gICAgY29uc3QgdGFibGU6IFRhYmxlVHlwZSA9IHtcbiAgICAgIF90eXBlOiBuZXdDb25maWcudHlwZSxcbiAgICAgIF9kYXRhOiBbXSxcbiAgICAgIF90YWJsZUNmZzogbmV3Q29uZmlnLl9oYXNoIGFzIHN0cmluZyxcbiAgICB9O1xuXG4gICAgdGhpcy5fbWVtW3RhYmxlS2V5XSA/Pz0gaGlwKHRhYmxlKTtcblxuICAgIC8vIFVwZGF0ZSBoYXNoZXNcbiAgICB0aGlzLl91cGRhdGVUYWJsZUhhc2godGFibGVLZXkpO1xuICAgIHRoaXMuX3VwZGF0ZUdsb2JhbEhhc2goKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF9leHRlbmRUYWJsZShleGlzdGluZ0NvbmZpZzogVGFibGVDZmcsIG5ld0NvbmZpZzogVGFibGVDZmcpIHtcbiAgICAvLyBObyBjb2x1bW5zIGFkZGVkPyBSZXR1cm4uXG4gICAgaWYgKGV4aXN0aW5nQ29uZmlnLmNvbHVtbnMubGVuZ3RoID09PSBuZXdDb25maWcuY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBXcml0ZSB0aGUgbmV3IHRhYmxlIGNvbmZpZyBpbnRvIHRoZSBkYXRhYmFzZVxuICAgIG5ld0NvbmZpZyA9IGhzaChuZXdDb25maWcpO1xuICAgIHRoaXMuX21lbS50YWJsZUNmZ3MuX2RhdGEucHVzaChuZXdDb25maWcpO1xuICAgIHRoaXMuX2lvVG9vbHMuc29ydFRhYmxlRGF0YUFuZFVwZGF0ZUhhc2godGhpcy5fbWVtLnRhYmxlQ2Zncyk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGNvbmZpZyBvZiB0aGUgZXhpc3RpbmcgdGFibGVcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuX21lbVtuZXdDb25maWcua2V5XSBhcyBUYWJsZVR5cGU7XG4gICAgdGFibGUuX3RhYmxlQ2ZnID0gbmV3Q29uZmlnLl9oYXNoIGFzIHN0cmluZztcblxuICAgIC8vIFVwZGF0ZSB0aGUgaGFzaGVzXG4gICAgdGhpcy5fdXBkYXRlVGFibGVIYXNoKG5ld0NvbmZpZy5rZXkpO1xuICAgIHRoaXMuX3VwZGF0ZUdsb2JhbEhhc2goKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuXG4gIHByaXZhdGUgYXN5bmMgX2R1bXAoKTogUHJvbWlzZTxSbGpzb24+IHtcbiAgICByZXR1cm4gY29weSh0aGlzLl9tZW0pO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX2R1bXBUYWJsZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZURvZXNOb3RFeGlzdChyZXF1ZXN0LnRhYmxlKTtcblxuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5fbWVtW3JlcXVlc3QudGFibGVdIGFzIFRhYmxlVHlwZTtcblxuICAgIHJldHVybiB7XG4gICAgICBbcmVxdWVzdC50YWJsZV06IGNvcHkodGFibGUpLFxuICAgIH07XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBhc3luYyBfd3JpdGUocmVxdWVzdDogeyBkYXRhOiBSbGpzb24gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFkZGVkRGF0YSA9IGhzaChyZXF1ZXN0LmRhdGEpO1xuICAgIHRoaXMuX3JlbW92ZU51bGxWYWx1ZXMoYWRkZWREYXRhKTtcbiAgICBjb25zdCB0YWJsZXMgPSBPYmplY3Qua2V5cyhhZGRlZERhdGEpO1xuICAgIGhzaChhZGRlZERhdGEpO1xuXG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZXNEb05vdEV4aXN0KHJlcXVlc3QuZGF0YSk7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZURhdGFEb2VzTm90TWF0Y2hDZmcocmVxdWVzdC5kYXRhKTtcblxuICAgIGZvciAoY29uc3QgdGFibGUgb2YgdGFibGVzKSB7XG4gICAgICBpZiAodGFibGUuc3RhcnRzV2l0aCgnXycpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvbGRUYWJsZSA9IHRoaXMuX21lbVt0YWJsZV0gYXMgVGFibGVUeXBlO1xuICAgICAgY29uc3QgbmV3VGFibGUgPSBhZGRlZERhdGFbdGFibGVdIGFzIFRhYmxlVHlwZTtcblxuICAgICAgLy8gVGFibGUgZXhpc3RzLiBNZXJnZSBkYXRhXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbmV3VGFibGUuX2RhdGEpIHtcbiAgICAgICAgY29uc3QgaGFzaCA9IGl0ZW0uX2hhc2g7XG4gICAgICAgIGNvbnN0IGV4aXN0cyA9IG9sZFRhYmxlLl9kYXRhLmZpbmQoKGkpID0+IGkuX2hhc2ggPT09IGhhc2gpO1xuICAgICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICAgIG9sZFRhYmxlLl9kYXRhLnB1c2goaXRlbSBhcyBhbnkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2lvVG9vbHMuc29ydFRhYmxlRGF0YUFuZFVwZGF0ZUhhc2gob2xkVGFibGUpO1xuICAgIH1cblxuICAgIC8vIFJlY2FsYyBtYWluIGhhc2hlc1xuICAgIHRoaXMuX3VwZGF0ZUdsb2JhbEhhc2goKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIGFzeW5jIF9yZWFkUm93cyhyZXF1ZXN0OiB7XG4gICAgdGFibGU6IHN0cmluZztcbiAgICB3aGVyZTogeyBbY29sdW1uOiBzdHJpbmddOiBKc29uVmFsdWUgfTtcbiAgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZURvZXNOb3RFeGlzdChyZXF1ZXN0LnRhYmxlKTtcbiAgICBhd2FpdCB0aGlzLl9pb1Rvb2xzLnRocm93V2hlbkNvbHVtbkRvZXNOb3RFeGlzdChcbiAgICAgIHJlcXVlc3QudGFibGUsXG4gICAgICBPYmplY3Qua2V5cyhyZXF1ZXN0LndoZXJlKSxcbiAgICApO1xuXG4gICAgLy8gUmVhZCB0YWJsZSBmcm9tIGRhdGFcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuX21lbVtyZXF1ZXN0LnRhYmxlXSBhcyBUYWJsZVR5cGU7XG5cbiAgICAvLyBGaWx0ZXIgdGFibGUgZGF0YVxuICAgIGNvbnN0IHRhYmxlRGF0YUZpbHRlcmVkID0gdGFibGUuX2RhdGEuZmlsdGVyKChyb3cpID0+IHtcbiAgICAgIGZvciAoY29uc3QgY29sdW1uIGluIHJlcXVlc3Qud2hlcmUpIHtcbiAgICAgICAgY29uc3QgYSA9IHJvd1tjb2x1bW5dO1xuICAgICAgICBjb25zdCBiID0gcmVxdWVzdC53aGVyZVtjb2x1bW5dO1xuICAgICAgICBpZiAoYiA9PT0gbnVsbCAmJiBhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZXF1YWxzKGEsIGIpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSBhbiB0YWJsZVxuICAgIGNvbnN0IHRhYmxlRmlsdGVyZWQ6IFRhYmxlVHlwZSA9IHtcbiAgICAgIF90eXBlOiB0YWJsZS5fdHlwZSxcbiAgICAgIF9kYXRhOiB0YWJsZURhdGFGaWx0ZXJlZCxcbiAgICB9O1xuXG4gICAgdGhpcy5faW9Ub29scy5zb3J0VGFibGVEYXRhQW5kVXBkYXRlSGFzaCh0YWJsZUZpbHRlcmVkKTtcblxuICAgIGNvbnN0IHJlc3VsdDogUmxqc29uID0ge1xuICAgICAgW3JlcXVlc3QudGFibGVdOiB0YWJsZUZpbHRlcmVkLFxuICAgIH07XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgX3JlbW92ZU51bGxWYWx1ZXMocmxqc29uOiBSbGpzb24pIHtcbiAgICBpdGVyYXRlVGFibGVzU3luYyhybGpzb24sICh0YWJsZSkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IHJsanNvblt0YWJsZV0uX2RhdGE7XG5cbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIGRhdGEpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcm93KSB7XG4gICAgICAgICAgaWYgKHJvd1trZXldID09PSBudWxsKSB7XG4gICAgICAgICAgICBkZWxldGUgcm93W2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsIi8vIEBsaWNlbnNlXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXG4vL1xuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGVybXMgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxuXG5pbXBvcnQgeyBJbywgSW9NZW0gfSBmcm9tICcuL2luZGV4LnRzJztcblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbi8qKlxuICogSW8gaW1wbGVtZW50YXRpb24gbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgdG8gYmUgdXNlZCBpblxuICogY29uZm9ybWFuY2UgdGVzdHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW9UZXN0U2V0dXAge1xuICAvKiogc2V0dXAgYmVmb3JlIHRoZSBzaW5nbGUgc2V0dXBzICovXG4gIGJlZm9yZUFsbDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIGlvIGltcGxlbWVudGF0aW9uLlxuICAgKiBAcmV0dXJucyBUaGUgaW8gaW1wbGVtZW50YXRpb24uXG4gICAqL1xuICBiZWZvcmVFYWNoOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBUZWFycyBkb3duIHRoZSBpbyBpbXBsZW1lbnRhdGlvbi5cbiAgICogQHJldHVybnMgVGhlIGlvIGltcGxlbWVudGF0aW9uLlxuICAgKi9cbiAgYWZ0ZXJFYWNoOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKiBjbGVhbnVwIGFmdGVyIGFsbCB0ZXN0cyAqL1xuICBhZnRlckFsbDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVGhlIGlvIGltcGxlbWVudGF0aW9uIHRvIGJlIHVzZWQgaW4gdGhlIGNvbmZvcm1hbmNlIHRlc3RzLlxuICAgKi9cbiAgaW86IElvO1xufVxuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuLy8gRXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSW9UZXN0U2V0dXAgaW50ZXJmYWNlXG5leHBvcnQgY29uc3QgZXhhbXBsZVRlc3RTZXR1cCA9ICgpOiBJb1Rlc3RTZXR1cCA9PiB7XG4gIHJldHVybiB7XG4gICAgaW86IG5ldyBJb01lbSgpLFxuICAgIGJlZm9yZUFsbDogYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgZm9yIGFueSBhZGRpdGlvbmFsIHNldHVwIHJlcXVpcmVkIGJlZm9yZSBpbml0LlxuICAgICAgLy8gQ3VycmVudGx5LCBpdCBkb2VzIG5vdGhpbmcuXG4gICAgfSxcblxuICAgIGJlZm9yZUVhY2g6IGFzeW5jICgpID0+IHtcbiAgICAgIC8vIEluaXRpYWxpemUgdGhlIGlvIGltcGxlbWVudGF0aW9uXG4gICAgfSxcbiAgICBhZnRlckVhY2g6IGFzeW5jICgpID0+IHtcbiAgICAgIC8vIFRlYXIgZG93biB0aGUgaW8gaW1wbGVtZW50YXRpb25cbiAgICB9LFxuXG4gICAgYWZ0ZXJBbGw6IGFzeW5jICgpID0+IHtcbiAgICAgIC8vIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIGZvciBhbnkgYWRkaXRpb25hbCBjbGVhbnVwIGFmdGVyIHRlYXJEb3duLlxuICAgIH0sXG4gIH07XG59O1xuIiwiLy8gQGxpY2Vuc2Vcbi8vIENvcHlyaWdodCAoYykgMjAyNSBSbGpzb25cbi8vXG4vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0ZXJtcyB0aGF0IGNhbiBiZVxuLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHBhY2thZ2UuXG5cbmltcG9ydCB7IEpzb25WYWx1ZSB9IGZyb20gJ0BybGpzb24vanNvbic7XG5pbXBvcnQgeyBSbGpzb24sIFRhYmxlQ2ZnLCBUYWJsZUtleSB9IGZyb20gJ0BybGpzb24vcmxqc29uJztcblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbmV4cG9ydCBpbnRlcmZhY2UgSW8ge1xuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gR2VuZXJhbFxuXG4gIC8qKiBTdGFydHMgdGhlIGluaXRpYWxpemF0aW9uICovXG4gIGluaXQoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKiogQ2xvc2VzIHRoZSBpbyAqL1xuICBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKiBSZXR1cm5zIHRydWUgaWYgaW8gaXMgb3BlbmVkICovXG4gIGlzT3BlbjogYm9vbGVhbjtcblxuICAvKiogQSBwcm9taXNlIHJlc29sdmluZyBvbmNlIHRoZSBJbyBpbnRlcmZhY2UgaXMgcmVhZHlcbiAgICpcbiAgICog8J+SoSBVc2UgQHJsanNvbi9pcy1yZWFkeVxuICAgKi9cbiAgaXNSZWFkeSgpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBEdW1wXG5cbiAgLyoqIFJldHVybnMgdGhlIGNvbXBsZXRlIGRiIGNvbnRlbnQgYXMgUmxqc29uICovXG4gIGR1bXAoKTogUHJvbWlzZTxSbGpzb24+O1xuXG4gIC8qKiBSZXR1cm5zIHRoZSBkdW1wIG9mIGEgY29tcGxldGUgdGFibGUgKi9cbiAgZHVtcFRhYmxlKHJlcXVlc3Q6IHsgdGFibGU6IHN0cmluZyB9KTogUHJvbWlzZTxSbGpzb24+O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBUYWJsZXNcblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB0YWJsZSBleGlzdHNcbiAgICovXG4gIHRhYmxlRXhpc3RzKHRhYmxlS2V5OiBUYWJsZUtleSk6IFByb21pc2U8Ym9vbGVhbj47XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB0YWJsZSB3aXRoIGEgZ2l2ZW4gY29uZmlnLlxuICAgKiBJZiB0aGUgdGFibGUgYWxyZWFkeSBleGlzdHMsIG5ldyBjb2x1bW5zIGFyZSBhZGRlZCB0byB0aGUgZXhpc3RpbmcgdGFibGUuXG4gICAqIElmIHRoZSB0YWJsZSBkb2VzIG5vdCBleGlzdCwgaXQgaXMgY3JlYXRlZCB3aXRoIHRoZSBnaXZlbiBjb25maWcuXG4gICAqIElmIHRoZSB0YWJsZSBleGlzdHMgYW5kIGNvbHVtbnMgYXJlIHJlbW92ZWQsIGFuIGVycm9yIGlzIHRocm93bi5cbiAgICogSWYgdGhlIHRhYmxlIGV4aXN0cyBhbmQgdGhlIGNvbHVtbiB0eXBlIGlzIGNoYW5nZWQsIGFuIGVycm9yIGlzIHRocm93bi5cbiAgICovXG4gIGNyZWF0ZU9yRXh0ZW5kVGFibGUocmVxdWVzdDogeyB0YWJsZUNmZzogVGFibGVDZmcgfSk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBqc29uIHN0cnVjdHVyZSByZXR1cm5pbmcgY3VycmVudCB0YWJsZSBjb25maWd1cmF0aW9uc1xuICAgKi9cbiAgcmF3VGFibGVDZmdzKCk6IFByb21pc2U8VGFibGVDZmdbXT47XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFdyaXRlXG5cbiAgLyoqIFdyaXRlcyBSbGpzb24gZGF0YSBpbnRvIHRoZSBkYXRhYmFzZSAqL1xuICB3cml0ZShyZXF1ZXN0OiB7IGRhdGE6IFJsanNvbiB9KTogUHJvbWlzZTx2b2lkPjtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gUmVhZCByb3dzXG5cbiAgLyoqIFF1ZXJpZXMgYSBsaXN0IG9mIHJvd3MgKi9cbiAgcmVhZFJvd3MocmVxdWVzdDoge1xuICAgIHRhYmxlOiBzdHJpbmc7XG4gICAgd2hlcmU6IHsgW2NvbHVtbjogc3RyaW5nXTogSnNvblZhbHVlIHwgbnVsbCB9O1xuICB9KTogUHJvbWlzZTxSbGpzb24+O1xuXG4gIC8qKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgZ2l2ZW4gdGFibGUgKi9cbiAgcm93Q291bnQodGFibGU6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPjtcbn1cblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbmV4cG9ydCBjb25zdCBleGFtcGxlSW8gPVxuICAnQ2hlY2tvdXQgQHJsanNvbi9pby1tZW0gZm9yIGFuIGV4YW1wbGUgaW1wbGVtZW50YXRpb24nO1xuIiwiLy8gQGxpY2Vuc2Vcbi8vIENvcHlyaWdodCAoYykgMjAyNSBSbGpzb25cbi8vXG4vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0ZXJtcyB0aGF0IGNhbiBiZVxuLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHBhY2thZ2UuXG5cbmltcG9ydCB7IEpzb24gfSBmcm9tICdAcmxqc29uL2pzb24nO1xuaW1wb3J0IHtcbiAgQnVmZmV0LFxuICBDYWtlLFxuICBpdGVyYXRlVGFibGVzU3luYyxcbiAgTGF5ZXIsXG4gIFJlZixcbiAgUmxqc29uLFxuICBUYWJsZUtleSxcbn0gZnJvbSAnQHJsanNvbi9ybGpzb24nO1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuLyoqXG4gKiBEZXNjcmliZXMgYSByb3cgdGhhdCByZWZlcmVuY2VzIGEgY2hpbGQgdGFibGUgcm93XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyZW50UmVmIHtcbiAgLyoqXG4gICAqIFRoZSBwYXJlbnQgdGFibGUgdGhhdCByZWZlcmVuY2VzIHRoZSBjaGlsZCB0YWJsZVxuICAgKi9cbiAgW3BhcmVudFRhYmxlOiBUYWJsZUtleV06IHtcbiAgICAvKipcbiAgICAgKiBUaGUgcGFyZW50IHJvdyB0aGF0IHJlZmVyZW5jZXMgdGhlIGNoaWxkIHJvd1xuICAgICAqL1xuICAgIFtwYXJlbnRSb3c6IFJlZl06IHtcbiAgICAgIC8qKlxuICAgICAgICogRGV0YWlscyBhYm91dCB0aGUgcmVmZXJlbmNlLCBlLmcuIGFuIGFycmF5IGluZGV4IGV0Yy5cbiAgICAgICAqL1xuICAgICAgZGV0YWlscz86IEpzb247XG4gICAgfTtcbiAgfTtcbn1cblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbi8qKlxuICogRGVzY3JpYmVzIHRoZSBwYXJlbnQgdGFibGUgcm93cyByZWZlcmVuY2luZyBhIGNoaWxkIHRhYmxlIHJvd1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJldmVyc2VSZWZzIHtcbiAgLyoqXG4gICAqIFRoZSBjaGlsZCB0YWJsZSB3ZSBuZWVkIHRoZSByZWZlcmVuY2luZyByb3dzIGZvclxuICAgKi9cbiAgW2NoaWxkVGFibGU6IFRhYmxlS2V5XToge1xuICAgIC8qKlxuICAgICAqIFRoZSByb3cgaGFzaHdlIG5lZWQgdGhlIHJlZmVyZW5jaW5nIHJvd3MgZm9yXG4gICAgICovXG4gICAgW2NoaWxkUm93OiBSZWZdOiBQYXJlbnRSZWY7XG4gIH07XG59XG5cbi8qIHY4IGlnbm9yZSBzdGFydCAqL1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSByZXZlcnNlIHJlZmVyZW5jZXMgZm9yIGEgZ2l2ZW4gcmxqc29uIG9iamVjdFxuICovXG5leHBvcnQgY29uc3QgY2FsY1JldmVyc2VSZWZzID0gKHJsanNvbjogUmxqc29uKTogUmV2ZXJzZVJlZnMgPT4ge1xuICBjb25zdCByZXN1bHQ6IFJldmVyc2VSZWZzID0ge307XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBQcmVwYXJlIGRhdGEgc3RydWN0dXJlXG4gIGl0ZXJhdGVUYWJsZXNTeW5jKHJsanNvbiwgKGNoaWxkVGFibGVLZXksIHRhYmxlKSA9PiB7XG4gICAgY29uc3QgY2hpbGRUYWJsZTogeyBbY2hpbGRSb3dIYXNoOiBzdHJpbmddOiBQYXJlbnRSZWYgfSA9IHt9O1xuICAgIHJlc3VsdFtjaGlsZFRhYmxlS2V5XSA9IGNoaWxkVGFibGU7XG4gICAgZm9yIChjb25zdCBjaGlsZFJvdyBvZiB0YWJsZS5fZGF0YSkge1xuICAgICAgY2hpbGRUYWJsZVtjaGlsZFJvdy5faGFzaF0gPSB7fTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gR2VuZXJhdGUgcmV2ZXJzZSByZWZlcmVuY2VzXG4gIGl0ZXJhdGVUYWJsZXNTeW5jKHJsanNvbiwgKHBhcmVudFRhYmxlS2V5LCBwYXJlbnRUYWJsZSkgPT4ge1xuICAgIC8vIEl0ZXJhdGUgYWxsIHJvd3Mgb2YgZWFjaCB0YWJsZVxuICAgIGZvciAoY29uc3QgcGFyZW50VGFibGVSb3cgb2YgcGFyZW50VGFibGUuX2RhdGEpIHtcbiAgICAgIC8vIEZpbmQgb3V0IHdoZSBvdGhlciB0YWJsZXMgJiByb3dzIGFyZSByZWZlcmVuY2VkIGJ5IHRoaXMgcm93XG4gICAgICAvLyBXcml0ZSB0aGVzZSBpbmZvcm1hdGlvbiBpbnR0byByZXN1bHRcbiAgICAgIHN3aXRjaCAocGFyZW50VGFibGUuX3R5cGUpIHtcbiAgICAgICAgY2FzZSAnY29tcG9uZW50cyc6XG4gICAgICAgICAgX3dyaXRlQ29tcG9uZW50UmVmcyhwYXJlbnRUYWJsZUtleSwgcGFyZW50VGFibGVSb3csIHJlc3VsdCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnbGF5ZXJzJzoge1xuICAgICAgICAgIF93cml0ZUxheWVyUmVmcyhwYXJlbnRUYWJsZUtleSwgcGFyZW50VGFibGVSb3csIHJlc3VsdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdzbGljZUlkcyc6IHtcbiAgICAgICAgICAvLyBTbGljZSBpZHMgZG8gbm90IHJlZmVyZW5jZSBvdGhlciB0YWJsZXNcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ2Nha2VzJzoge1xuICAgICAgICAgIF93cml0ZUNha2VSZWZzKHBhcmVudFRhYmxlS2V5LCBwYXJlbnRUYWJsZVJvdywgcmVzdWx0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ2J1ZmZldHMnOiB7XG4gICAgICAgICAgX3dyaXRlQnVmZmV0UmVmcyhwYXJlbnRUYWJsZUtleSwgcGFyZW50VGFibGVSb3csIHJlc3VsdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKiB2OCBpZ25vcmUgZW5kICovXG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5jb25zdCBfd3JpdGVDb21wb25lbnRSZWZzID0gKFxuICBwYXJlbnRUYWJsZU5hbWU6IFRhYmxlS2V5LFxuICBwYXJlbnRSb3c6IEpzb24sXG4gIHJlc3VsdDogUmV2ZXJzZVJlZnMsXG4pID0+IHtcbiAgY29uc3QgcGFyZW50Um93SGFzaCA9IHBhcmVudFJvdy5faGFzaCBhcyBzdHJpbmc7XG5cbiAgZm9yIChjb25zdCBwYXJlbnRDb2x1bW5OYW1lIGluIHBhcmVudFJvdykge1xuICAgIGlmIChwYXJlbnRDb2x1bW5OYW1lLnN0YXJ0c1dpdGgoJ18nKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJlbnRDb2x1bW5OYW1lLmVuZHNXaXRoKCdSZWYnKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgY2hpbGRUYWJsZU5hbWUgPSBwYXJlbnRDb2x1bW5OYW1lLnNsaWNlKDAsIC0zKTtcbiAgICBjb25zdCBjaGlsZFJvd0hhc2ggPSBwYXJlbnRSb3dbcGFyZW50Q29sdW1uTmFtZV0gYXMgc3RyaW5nO1xuXG4gICAgX3dyaXRlKFxuICAgICAgcmVzdWx0LFxuICAgICAgY2hpbGRUYWJsZU5hbWUsXG4gICAgICBjaGlsZFJvd0hhc2gsXG4gICAgICBwYXJlbnRUYWJsZU5hbWUsXG4gICAgICBwYXJlbnRSb3dIYXNoLFxuICAgICk7XG4gIH1cbn07XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5jb25zdCBfd3JpdGVMYXllclJlZnMgPSAoXG4gIHBhcmVudFRhYmxlTmFtZTogVGFibGVLZXksXG4gIHBhcmVudFJvdzogTGF5ZXIsXG4gIHJlc3VsdDogUmV2ZXJzZVJlZnMsXG4pID0+IHtcbiAgY29uc3QgY2hpbGRUYWJsZU5hbWUgPSBwYXJlbnRSb3cuY29tcG9uZW50c1RhYmxlO1xuICBjb25zdCBwYXJlbnRSb3dIYXNoID0gcGFyZW50Um93Ll9oYXNoIGFzIHN0cmluZztcblxuICBmb3IgKGNvbnN0IHNsaWNlSWQgaW4gcGFyZW50Um93LmFkZCkge1xuICAgIGlmIChzbGljZUlkLnN0YXJ0c1dpdGgoJ18nKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qgc2xpY2VIYXNoID0gcGFyZW50Um93LmFkZFtzbGljZUlkXSBhcyBzdHJpbmc7XG5cbiAgICBfd3JpdGUocmVzdWx0LCBjaGlsZFRhYmxlTmFtZSwgc2xpY2VIYXNoLCBwYXJlbnRUYWJsZU5hbWUsIHBhcmVudFJvd0hhc2gpO1xuICB9XG59O1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuY29uc3QgX3dyaXRlQ2FrZVJlZnMgPSAoXG4gIHBhcmVudFRhYmxlTmFtZTogVGFibGVLZXksXG4gIHBhcmVudFJvdzogQ2FrZSxcbiAgcmVzdWx0OiBSZXZlcnNlUmVmcyxcbikgPT4ge1xuICBjb25zdCBwYXJlbnRSb3dIYXNoID0gcGFyZW50Um93Ll9oYXNoIGFzIHN0cmluZztcblxuICBmb3IgKGNvbnN0IGxheWVyIGluIHBhcmVudFJvdy5sYXllcnMpIHtcbiAgICBjb25zdCBjaGlsZFRhYmxlTmFtZSA9IGxheWVyO1xuICAgIGNvbnN0IGNoaWxkUm93SGFzaCA9IHBhcmVudFJvdy5sYXllcnNbbGF5ZXJdIGFzIHN0cmluZztcbiAgICBfd3JpdGUoXG4gICAgICByZXN1bHQsXG4gICAgICBjaGlsZFRhYmxlTmFtZSxcbiAgICAgIGNoaWxkUm93SGFzaCxcbiAgICAgIHBhcmVudFRhYmxlTmFtZSxcbiAgICAgIHBhcmVudFJvd0hhc2gsXG4gICAgKTtcbiAgfVxufTtcblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbmNvbnN0IF93cml0ZUJ1ZmZldFJlZnMgPSAoXG4gIHBhcmVudFRhYmxlTmFtZTogVGFibGVLZXksXG4gIHBhcmVudFJvdzogQnVmZmV0LFxuICByZXN1bHQ6IFJldmVyc2VSZWZzLFxuKSA9PiB7XG4gIGNvbnN0IHBhcmVudFJvd0hhc2ggPSBwYXJlbnRSb3cuX2hhc2ggYXMgc3RyaW5nO1xuXG4gIGZvciAoY29uc3QgaXRlbSBvZiBwYXJlbnRSb3cuaXRlbXMpIHtcbiAgICBjb25zdCBjaGlsZFRhYmxlTmFtZSA9IGl0ZW0udGFibGU7XG4gICAgY29uc3QgY2hpbGRSb3dIYXNoID0gaXRlbS5yZWY7XG4gICAgX3dyaXRlKFxuICAgICAgcmVzdWx0LFxuICAgICAgY2hpbGRUYWJsZU5hbWUsXG4gICAgICBjaGlsZFJvd0hhc2gsXG4gICAgICBwYXJlbnRUYWJsZU5hbWUsXG4gICAgICBwYXJlbnRSb3dIYXNoLFxuICAgICk7XG4gIH1cbn07XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5jb25zdCBfd3JpdGUgPSAoXG4gIHJlc3VsdDogUmV2ZXJzZVJlZnMsXG4gIGNoaWxkVGFibGVOYW1lOiBzdHJpbmcsXG4gIGNoaWxkUm93SGFzaDogc3RyaW5nLFxuICBwYXJlbnRUYWJsZU5hbWU6IHN0cmluZyxcbiAgcGFyZW50Um93SGFzaDogc3RyaW5nLFxuKSA9PiB7XG4gIGNvbnN0IHJlZmVyZW5jZXNGb3JDaGlsZFRhYmxlID0gKHJlc3VsdFtjaGlsZFRhYmxlTmFtZV0gPz89IHt9KTtcbiAgY29uc3QgcmVmZXJlbmNlc0ZvckNoaWxkVGFibGVSb3cgPSAocmVmZXJlbmNlc0ZvckNoaWxkVGFibGVbY2hpbGRSb3dIYXNoXSA/Pz1cbiAgICB7fSk7XG5cbiAgcmVmZXJlbmNlc0ZvckNoaWxkVGFibGVSb3dbcGFyZW50VGFibGVOYW1lXSA/Pz0ge307XG4gIHJlZmVyZW5jZXNGb3JDaGlsZFRhYmxlUm93W3BhcmVudFRhYmxlTmFtZV1bcGFyZW50Um93SGFzaF0gPz89IHt9O1xufTtcbiJdLCJuYW1lcyI6WyJlIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUF1Qk8sTUFBTSxRQUFRO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtuQixZQUE0QixJQUFRO0FBQVIsU0FBQSxLQUFBO0FBQUEsRUFBUztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS3JDLFdBQVcsb0JBQW9CO0FBQzdCLFVBQU0sV0FBVyxJQUFjO0FBQUEsTUFDN0IsT0FBTztBQUFBLE1BQ1AsS0FBSztBQUFBLE1BQ0wsTUFBTTtBQUFBLE1BQ04sUUFBUTtBQUFBLE1BQ1IsUUFBUTtBQUFBLE1BQ1IsVUFBVTtBQUFBLE1BQ1YsVUFBVTtBQUFBLE1BRVYsU0FBUztBQUFBLFFBQ1AsRUFB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
@@ -1,10 +1,10 @@
1
- // @license
2
- // Copyright (c) 2025 Rljson
3
- //
4
- // Use of this source code is governed by terms that can be
5
- // found in the LICENSE file in the root of this package.
6
-
7
- // Run »pnpm updateGoldens« when you change this file
8
- export const example = async () => {};
9
-
10
- // example();
1
+ // @license
2
+ // Copyright (c) 2025 Rljson
3
+ //
4
+ // Use of this source code is governed by terms that can be
5
+ // found in the LICENSE file in the root of this package.
6
+
7
+ // Run »pnpm updateGoldens« when you change this file
8
+ export const example = async () => {};
9
+
10
+ // example();