@rljson/io 0.0.28 → 0.0.30

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.
@@ -1 +1,9 @@
1
+ <!--
2
+ @license
3
+ Copyright (c) 2025 Rljson
4
+
5
+ Use of this source code is governed by terms that can be
6
+ found in the LICENSE file in the root of this package.
7
+ -->
8
+
1
9
  # Architecture
@@ -1 +1,9 @@
1
+ <!--
2
+ @license
3
+ Copyright (c) 2025 Rljson
4
+
5
+ Use of this source code is governed by terms that can be
6
+ found in the LICENSE file in the root of this package.
7
+ -->
8
+
1
9
  # Architecture
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from './io-mem.ts';
2
+ export * from './io-test-setup.ts';
2
3
  export * from './io-tools.ts';
3
4
  export * from './io.ts';
4
5
  export * from './reverse-ref.ts';
package/dist/io-mem.d.ts CHANGED
@@ -7,6 +7,7 @@ import { Io } from './io.ts';
7
7
  export declare class IoMem implements Io {
8
8
  constructor();
9
9
  init(): Promise<void>;
10
+ close(): Promise<void>;
10
11
  static example: () => Promise<IoMem>;
11
12
  isReady(): Promise<void>;
12
13
  dump(): Promise<Rljson>;
@@ -0,0 +1,22 @@
1
+ import { Io } from './io.ts';
2
+ /**
3
+ * Io implementation need to implement this interface to be used in
4
+ * conformance tests.
5
+ */
6
+ export interface IoTestSetup {
7
+ /**
8
+ * Initializes the io implementation.
9
+ * @returns The io implementation.
10
+ */
11
+ init: () => Promise<void>;
12
+ /**
13
+ * Tears down the io implementation.
14
+ * @returns The io implementation.
15
+ */
16
+ tearDown: () => Promise<void>;
17
+ /**
18
+ * The io implementation to be used in the conformance tests.
19
+ */
20
+ io: Io;
21
+ }
22
+ export declare const exampleTestSetup: () => IoTestSetup;
@@ -49,6 +49,12 @@ export declare class IoTools {
49
49
  * Returns a list of all column names of a given table
50
50
  */
51
51
  allColumnKeys(table: TableKey): Promise<string[]>;
52
+ /**
53
+ * Throws when a column does not exist in a given table
54
+ * @param table - The table to check
55
+ * @param columns - The column to check
56
+ */
57
+ throwWhenColumnDoesNotExist(table: TableKey, columns: string[]): Promise<void>;
52
58
  /**
53
59
  * Throws when a table update is not compatible with the current table
54
60
  * configuration.
package/dist/io.d.ts CHANGED
@@ -3,6 +3,8 @@ import { Rljson, TableCfg, TableKey } from '@rljson/rljson';
3
3
  export interface Io {
4
4
  /** Starts the initialization */
5
5
  init(): Promise<void>;
6
+ /** Closes the io */
7
+ close(): Promise<void>;
6
8
  /** A promise resolving once the Io interface is ready
7
9
  *
8
10
  * 💡 Use @rljson/is-ready
package/dist/io.js CHANGED
@@ -124,6 +124,25 @@ const _IoTools = class _IoTools {
124
124
  const result = tableCfg.columns.map((column) => column.key);
125
125
  return result;
126
126
  }
127
+ /**
128
+ * Throws when a column does not exist in a given table
129
+ * @param table - The table to check
130
+ * @param columns - The column to check
131
+ */
132
+ async throwWhenColumnDoesNotExist(table, columns) {
133
+ const tableCfg = await this.tableCfg(table);
134
+ const columnKeys = tableCfg.columns.map((column) => column.key);
135
+ const missingColumns = columns.filter(
136
+ (column) => !columnKeys.includes(column)
137
+ );
138
+ if (missingColumns.length > 0) {
139
+ throw new Error(
140
+ `The following columns do not exist in table "${table}": ${missingColumns.join(
141
+ ", "
142
+ )}.`
143
+ );
144
+ }
145
+ }
127
146
  /**
128
147
  * Throws when a table update is not compatible with the current table
129
148
  * configuration.
@@ -220,6 +239,9 @@ const _IoMem = class _IoMem {
220
239
  init() {
221
240
  return this._init();
222
241
  }
242
+ close() {
243
+ return Promise.resolve();
244
+ }
223
245
  // ...........................................................................
224
246
  // General
225
247
  isReady() {
@@ -355,6 +377,10 @@ const _IoMem = class _IoMem {
355
377
  // ...........................................................................
356
378
  async _readRows(request) {
357
379
  await this._ioTools.throwWhenTableDoesNotExist(request.table);
380
+ await this._ioTools.throwWhenColumnDoesNotExist(
381
+ request.table,
382
+ Object.keys(request.where)
383
+ );
358
384
  const table = this._mem[request.table];
359
385
  const result = {
360
386
  [request.table]: {
@@ -378,6 +404,16 @@ __publicField(_IoMem, "example", async () => {
378
404
  });
379
405
  let IoMem = _IoMem;
380
406
  // @license
407
+ const exampleTestSetup = () => {
408
+ return {
409
+ io: new IoMem(),
410
+ init: async () => {
411
+ },
412
+ tearDown: async () => {
413
+ }
414
+ };
415
+ };
416
+ // @license
381
417
  const exampleIo = "Checkout @rljson/io-mem for an example implementation";
382
418
  // @license
383
419
  const calcReverseRefs = (rljson) => {
@@ -485,6 +521,7 @@ export {
485
521
  IoMem,
486
522
  IoTools,
487
523
  calcReverseRefs,
488
- exampleIo
524
+ exampleIo,
525
+ exampleTestSetup
489
526
  };
490
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW8uanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9pby10b29scy50cyIsIi4uL3NyYy9pby1tZW0udHMiLCIuLi9zcmMvaW8udHMiLCIuLi9zcmMvcmV2ZXJzZS1yZWYudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQGxpY2Vuc2Vcbi8vIENvcHlyaWdodCAoYykgMjAyNSBSbGpzb25cbi8vXG4vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0ZXJtcyB0aGF0IGNhbiBiZVxuLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHBhY2thZ2UuXG5cbmltcG9ydCB7IGhpcCB9IGZyb20gJ0BybGpzb24vaGFzaCc7XG5pbXBvcnQge1xuICBpdGVyYXRlVGFibGVzLFxuICBSbGpzb24sXG4gIFRhYmxlQ2ZnLFxuICBUYWJsZUtleSxcbiAgdGhyb3dPbkludmFsaWRUYWJsZUNmZyxcbiAgdmFsaWRhdGVSbGpzb25BZ2FpbnN0VGFibGVDZmcsXG59IGZyb20gJ0BybGpzb24vcmxqc29uJztcblxuaW1wb3J0IHsgSW9NZW0gfSBmcm9tICcuL2lvLW1lbS50cyc7XG5pbXBvcnQgeyBJbyB9IGZyb20gJy4vaW8udHMnO1xuXG4vKipcbiAqIFByb3ZpZGVzIHV0aWxpdHkgZnVuY3Rpb25zIGZvciB0aGUgSW8gaW50ZXJmYWNlLlxuICovXG5leHBvcnQgY2xhc3MgSW9Ub29scyB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0gaW8gVGhlIElvIGludGVyZmFjZSB0byB1c2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBpbzogSW8pIHt9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRhYmxlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHRhYmxlQ2ZncyB0YWJsZS5cbiAgICovXG4gIHN0YXRpYyBnZXQgdGFibGVDZmdzVGFibGVDZmcoKSB7XG4gICAgY29uc3QgdGFibGVDZmcgPSBoaXA8VGFibGVDZmc+KHtcbiAgICAgIF9oYXNoOiAnJyxcbiAgICAgIGtleTogJ3RhYmxlQ2ZncycsXG4gICAgICB0eXBlOiAnaW5ncmVkaWVudHMnLFxuICAgICAgaXNIZWFkOiBmYWxzZSxcbiAgICAgIGlzUm9vdDogZmFsc2UsXG4gICAgICBpc1NoYXJlZDogdHJ1ZSxcbiAgICAgIHByZXZpb3VzOiAnJyxcblxuICAgICAgY29sdW1uczogW1xuICAgICAgICB7IGtleTogJ19oYXNoJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgeyBrZXk6ICdrZXknLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICB7IGtleTogJ3R5cGUnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICB7IGtleTogJ2lzSGVhZCcsIHR5cGU6ICdib29sZWFuJyB9LFxuICAgICAgICB7IGtleTogJ2lzUm9vdCcsIHR5cGU6ICdib29sZWFuJyB9LFxuICAgICAgICB7IGtleTogJ2lzU2hhcmVkJywgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgICAgIHsga2V5OiAncHJldmlvdXMnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICB7IGtleTogJ2NvbHVtbnMnLCB0eXBlOiAnanNvbkFycmF5JyB9LFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0YWJsZUNmZztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgcmV2aXNpb25zIHRhYmxlLlxuICAgKi9cbiAgaW5pdFJldmlzaW9uc1RhYmxlID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlQ2ZnOiBUYWJsZUNmZyA9IHtcbiAgICAgIGtleTogJ3JldmlzaW9ucycsXG4gICAgICB0eXBlOiAnaW5ncmVkaWVudHMnLFxuICAgICAgaXNIZWFkOiB0cnVlLFxuICAgICAgaXNSb290OiB0cnVlLFxuICAgICAgaXNTaGFyZWQ6IGZhbHNlLFxuXG4gICAgICBjb2x1bW5zOiBbXG4gICAgICAgIHsga2V5OiAnX2hhc2gnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICB7IGtleTogJ3RhYmxlJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgeyBrZXk6ICdwcmVkZWNlc3NvcicsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHsga2V5OiAnc3VjY2Vzc29yJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgeyBrZXk6ICd0aW1lc3RhbXAnLCB0eXBlOiAnbnVtYmVyJyB9LFxuICAgICAgICB7IGtleTogJ2lkJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgIF0sXG4gICAgfTtcblxuICAgIGF3YWl0IHRoaXMuaW8uY3JlYXRlT3JFeHRlbmRUYWJsZSh7IHRhYmxlQ2ZnIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBFeGFtcGxlIG9iamVjdCBmb3IgdGVzdCBwdXJwb3Nlc1xuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiBpbyB0b29sc1xuICAgKi9cbiAgc3RhdGljIGV4YW1wbGUgPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgaW8gPSBhd2FpdCBJb01lbS5leGFtcGxlKCk7XG4gICAgYXdhaXQgaW8uaW5pdCgpO1xuICAgIGF3YWl0IGlvLmlzUmVhZHkoKTtcbiAgICByZXR1cm4gbmV3IElvVG9vbHMoaW8pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaHJvd3MgaWYgdGhlIHRhYmxlIGRvZXMgbm90IGV4aXN0XG4gICAqL1xuICBhc3luYyB0aHJvd1doZW5UYWJsZURvZXNOb3RFeGlzdCh0YWJsZTogVGFibGVLZXkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBleGlzdHMgPSBhd2FpdCB0aGlzLmlvLnRhYmxlRXhpc3RzKHRhYmxlKTtcbiAgICBpZiAoIWV4aXN0cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSBcIiR7dGFibGV9XCIgbm90IGZvdW5kYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBpZiBhbnkgb2YgdGhlIHRhYmxlcyBpbiBybGpzb24gZG8gbm90IGV4aXN0XG4gICAqIEBwYXJhbSBybGpzb24gLSBUaGUgUmxqc29uIG9iamVjdCB0byBjaGVja1xuICAgKi9cbiAgYXN5bmMgdGhyb3dXaGVuVGFibGVzRG9Ob3RFeGlzdChybGpzb246IFJsanNvbik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBpdGVyYXRlVGFibGVzKHJsanNvbiwgYXN5bmMgKHRhYmxlS2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IGV4aXN0cyA9IGF3YWl0IHRoaXMuaW8udGFibGVFeGlzdHModGFibGVLZXkpO1xuICAgICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGFibGUgXCIke3RhYmxlS2V5fVwiIG5vdCBmb3VuZGApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zdCBtaXNzaW5nVGFibGVzID0gKGUgYXMgQXJyYXk8YW55PikubWFwKChlKSA9PiBlLnRhYmxlS2V5KTtcblxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIGZvbGxvd2luZyB0YWJsZXMgZG8gbm90IGV4aXN0OiAke21pc3NpbmdUYWJsZXMuam9pbignLCAnKX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgd2l0aCBhbGwgdGFibGUgbmFtZXNcbiAgICovXG4gIGFzeW5jIGFsbFRhYmxlS2V5cygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gKGF3YWl0IHRoaXMuaW8udGFibGVDZmdzKCkpLnRhYmxlQ2Zncy5fZGF0YS5tYXAoXG4gICAgICAoZSkgPT4gZS5rZXksXG4gICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBnaXZlbiB0YWJsZVxuICAgKi9cbiAgYXN5bmMgdGFibGVDZmcodGFibGU6IFRhYmxlS2V5KTogUHJvbWlzZTxUYWJsZUNmZz4ge1xuICAgIGNvbnN0IHRhYmxlQ2ZnID0gYXdhaXQgdGhpcy50YWJsZUNmZ09yTnVsbCh0YWJsZSk7XG4gICAgaWYgKCF0YWJsZUNmZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSBcIiR7dGFibGV9XCIgbm90IGZvdW5kYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhYmxlQ2ZnITtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uIG9mIGEgZ2l2ZW4gdGFibGUgb3IgbnVsbCBpZiBpdCBkb2VzIG5vdCBleGlzdC5cblxuICAgKi9cbiAgYXN5bmMgdGFibGVDZmdPck51bGwodGFibGU6IFRhYmxlS2V5KTogUHJvbWlzZTxUYWJsZUNmZyB8IG51bGw+IHtcbiAgICBjb25zdCB0YWJsZUNmZ3MgPSBhd2FpdCB0aGlzLmlvLnRhYmxlQ2ZncygpO1xuICAgIGNvbnN0IHRhYmxlQ2ZnID0gdGFibGVDZmdzLnRhYmxlQ2Zncy5fZGF0YS5maW5kKChlKSA9PiBlLmtleSA9PT0gdGFibGUpO1xuICAgIHJldHVybiB0YWJsZUNmZyA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBjb2x1bW4gbmFtZXMgb2YgYSBnaXZlbiB0YWJsZVxuICAgKi9cbiAgYXN5bmMgYWxsQ29sdW1uS2V5cyh0YWJsZTogVGFibGVLZXkpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgdGFibGVDZmcgPSBhd2FpdCB0aGlzLnRhYmxlQ2ZnKHRhYmxlKTtcbiAgICBjb25zdCByZXN1bHQgPSB0YWJsZUNmZy5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ua2V5KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyB3aGVuIGEgdGFibGUgdXBkYXRlIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgdGFibGVcbiAgICogY29uZmlndXJhdGlvbi5cbiAgICovXG4gIGFzeW5jIHRocm93V2hlblRhYmxlSXNOb3RDb21wYXRpYmxlKHVwZGF0ZTogVGFibGVDZmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwcmVmaXggPSBgSW52YWxpZCB1cGRhdGUgb2YgdGFibGUgYWJsZSBcIiR7dXBkYXRlLmtleX1cImA7XG5cbiAgICB0aHJvd09uSW52YWxpZFRhYmxlQ2ZnKHVwZGF0ZSk7XG5cbiAgICAvLyBDaGVjayBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgdGFibGVcbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHRoaXMudGFibGVDZmdPck51bGwodXBkYXRlLmtleSk7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAvLyBIYXZlIGNvbHVtbnMgYmVlbiBkZWxldGVkP1xuICAgICAgaWYgKGV4aXN0aW5nLmNvbHVtbnMubGVuZ3RoID4gdXBkYXRlLmNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGRlbGV0ZWRDb2x1bW5LZXlzID0gZXhpc3RpbmcuY29sdW1uc1xuICAgICAgICAgIC5tYXAoKGNvbHVtbikgPT4gY29sdW1uLmtleSlcbiAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgKGtleSkgPT4gIXVwZGF0ZS5jb2x1bW5zLnNvbWUoKGNvbHVtbikgPT4gY29sdW1uLmtleSA9PT0ga2V5KSxcbiAgICAgICAgICApO1xuICAgICAgICBpZiAoZGVsZXRlZENvbHVtbktleXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGRlbGV0ZWRDb2x1bW5zID0gZGVsZXRlZENvbHVtbktleXMuam9pbignLCAnKTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgJHtwcmVmaXh9OiBDb2x1bW5zIG11c3Qgbm90IGJlIGRlbGV0ZWQuIGAgK1xuICAgICAgICAgICAgICBgRGVsZXRlZCBjb2x1bW5zOiAke2RlbGV0ZWRDb2x1bW5zfX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSGF2ZSBjb2x1bW4ga2V5cyBjaGFuZ2VkP1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleGlzdGluZy5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGJlZm9yZSA9IGV4aXN0aW5nLmNvbHVtbnNbaV0ua2V5O1xuICAgICAgICBjb25zdCBhZnRlciA9IHVwZGF0ZS5jb2x1bW5zW2ldLmtleTtcbiAgICAgICAgaWYgKGJlZm9yZSAhPT0gYWZ0ZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgJHtwcmVmaXh9OiBgICtcbiAgICAgICAgICAgICAgYENvbHVtbiBrZXlzIG11c3Qgbm90IGNoYW5nZSEgYCArXG4gICAgICAgICAgICAgIGBDb2x1bW4gXCIke2JlZm9yZX1cIiB3YXMgcmVuYW1lZCBpbnRvIFwiJHthZnRlcn1cIi5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSGF2ZSBjb2x1bW4gdHlwZXMgY2hhbmdlZD9cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhpc3RpbmcuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSBleGlzdGluZy5jb2x1bW5zW2ldLmtleTtcbiAgICAgICAgY29uc3QgYmVmb3JlID0gZXhpc3RpbmcuY29sdW1uc1tpXS50eXBlO1xuICAgICAgICBjb25zdCBhZnRlciA9IHVwZGF0ZS5jb2x1bW5zW2ldLnR5cGU7XG4gICAgICAgIGlmIChiZWZvcmUgIT09IGFmdGVyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYCR7cHJlZml4fTogYCArXG4gICAgICAgICAgICAgIGBDb2x1bW4gdHlwZXMgbXVzdCBub3QgY2hhbmdlISBgICtcbiAgICAgICAgICAgICAgYFR5cGUgb2YgY29sdW1uIFwiJHtjb2x1bW59XCIgd2FzIGNoYW5nZWQgZnJvbSBcIiR7YmVmb3JlfVwiIHRvICR7YWZ0ZXJ9LmAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgaWYgdGhlIGRhdGEgaW4gdGhlIHRhYmxlIGRvIG5vdCBtYXRjaCB0aGUgdGFibGUgY29uZmlndXJhdGlvblxuICAgKi9cbiAgYXN5bmMgdGhyb3dXaGVuVGFibGVEYXRhRG9lc05vdE1hdGNoQ2ZnKGRhdGE6IFJsanNvbikge1xuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgIGF3YWl0IGl0ZXJhdGVUYWJsZXMoZGF0YSwgYXN5bmMgKHRhYmxlS2V5KSA9PiB7XG4gICAgICBjb25zdCB0YWJsZUNmZyA9IGF3YWl0IHRoaXMudGFibGVDZmcodGFibGVLZXkpO1xuICAgICAgY29uc3QgdGFibGUgPSBkYXRhW3RhYmxlS2V5XTtcbiAgICAgIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlUmxqc29uQWdhaW5zdFRhYmxlQ2ZnKHRhYmxlLl9kYXRhLCB0YWJsZUNmZykpO1xuICAgIH0pO1xuXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUYWJsZSBkYXRhIGRvZXMgbm90IG1hdGNoIHRoZSBjb25maWd1cmF0aW9uLlxcblxcbkVycm9yczpcXG4ke2Vycm9yc1xuICAgICAgICAgIC5tYXAoKGUpID0+IGAtICR7ZX1gKVxuICAgICAgICAgIC5qb2luKCdcXG4nKX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8vIEBsaWNlbnNlXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXG4vL1xuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGVybXMgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxuXG5pbXBvcnQgeyBoaXAsIGhzaCB9IGZyb20gJ0BybGpzb24vaGFzaCc7XG5pbXBvcnQgeyBJc1JlYWR5IH0gZnJvbSAnQHJsanNvbi9pcy1yZWFkeSc7XG5pbXBvcnQgeyBjb3B5LCBlcXVhbHMsIEpzb25WYWx1ZSB9IGZyb20gJ0BybGpzb24vanNvbic7XG5pbXBvcnQgeyBSbGpzb24sIFRhYmxlQ2ZnLCBUYWJsZUtleSwgVGFibGVUeXBlIH0gZnJvbSAnQHJsanNvbi9ybGpzb24nO1xuXG5pbXBvcnQgeyBJb1Rvb2xzIH0gZnJvbSAnLi9pby10b29scy50cyc7XG5pbXBvcnQgeyBJbyB9IGZyb20gJy4vaW8udHMnO1xuXG4vKipcbiAqIEluLU1lbW9yeSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUmxqc29uIElvIGludGVyZmFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIElvTWVtIGltcGxlbWVudHMgSW8ge1xuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gQ29uc3RydWN0b3IgJiBleGFtcGxlXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBpbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9pbml0KCk7XG4gIH1cblxuICBzdGF0aWMgZXhhbXBsZSA9IGFzeW5jICgpID0+IHtcbiAgICByZXR1cm4gbmV3IElvTWVtKCk7XG4gIH07XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIEdlbmVyYWxcbiAgaXNSZWFkeSgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNSZWFkeS5wcm9taXNlO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIER1bXBcblxuICBkdW1wKCk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgcmV0dXJuIHRoaXMuX2R1bXAoKTtcbiAgfVxuXG4gIGFzeW5jIGR1bXBUYWJsZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgcmV0dXJuIHRoaXMuX2R1bXBUYWJsZShyZXF1ZXN0KTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBSb3dzXG5cbiAgcmVhZFJvd3MocmVxdWVzdDoge1xuICAgIHRhYmxlOiBzdHJpbmc7XG4gICAgd2hlcmU6IHsgW2NvbHVtbjogc3RyaW5nXTogSnNvblZhbHVlIH07XG4gIH0pOiBQcm9taXNlPFJsanNvbj4ge1xuICAgIHJldHVybiB0aGlzLl9yZWFkUm93cyhyZXF1ZXN0KTtcbiAgfVxuXG4gIGFzeW5jIHJvd0NvdW50KHRhYmxlOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHRhYmxlRGF0YSA9IHRoaXMuX21lbVt0YWJsZV0gYXMgVGFibGVUeXBlO1xuICAgIGlmICghdGFibGVEYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlIFwiJHt0YWJsZX1cIiBub3QgZm91bmRgKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0YWJsZURhdGEuX2RhdGEubGVuZ3RoKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBXcml0ZVxuXG4gIHdyaXRlKHJlcXVlc3Q6IHsgZGF0YTogUmxqc29uIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd3JpdGUocmVxdWVzdCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gVGFibGUgbWFuYWdlbWVudFxuICBhc3luYyB0YWJsZUV4aXN0cyh0YWJsZUtleTogVGFibGVLZXkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuX21lbVt0YWJsZUtleV0gYXMgVGFibGVUeXBlO1xuICAgIHJldHVybiB0YWJsZSA/IHRydWUgOiBmYWxzZTtcbiAgfVxuXG4gIGNyZWF0ZU9yRXh0ZW5kVGFibGUocmVxdWVzdDogeyB0YWJsZUNmZzogVGFibGVDZmcgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9jcmVhdGVPckV4dGVuZFRhYmxlKHJlcXVlc3QpO1xuICB9XG5cbiAgYXN5bmMgdGFibGVDZmdzKCk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgY29uc3QgdGFibGVzID0gdGhpcy5fbWVtLnRhYmxlQ2Zncy5fZGF0YSBhcyBUYWJsZUNmZ1tdO1xuXG4gICAgLy8gVGFrZSB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgZWFjaCB0eXBlIGtleVxuICAgIGNvbnN0IG5ld2VzdFZlcnNpb246IFJlY29yZDxUYWJsZUtleSwgVGFibGVDZmc+ID0ge307XG4gICAgZm9yIChsZXQgaSA9IHRhYmxlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgdGFibGUgPSB0YWJsZXNbaV07XG4gICAgICBjb25zdCBleGlzdGluZyA9IG5ld2VzdFZlcnNpb25bdGFibGUua2V5XTtcbiAgICAgIGlmICghZXhpc3RpbmcpIHtcbiAgICAgICAgbmV3ZXN0VmVyc2lvblt0YWJsZS5rZXldID0gdGFibGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0RGF0YSA9IE9iamVjdC52YWx1ZXMobmV3ZXN0VmVyc2lvbikucmV2ZXJzZSgpO1xuXG4gICAgcmV0dXJuIGhpcCh7XG4gICAgICB0YWJsZUNmZ3M6IHtcbiAgICAgICAgX2RhdGE6IHJlc3VsdERhdGEsXG4gICAgICB9LFxuICAgIH0gYXMgUmxqc29uKTtcbiAgfVxuXG4gIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiAgLy8gUHJpdmF0ZVxuICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cbiAgcHJpdmF0ZSBfaW9Ub29scyE6IElvVG9vbHM7XG5cbiAgcHJpdmF0ZSBfaXNSZWFkeSA9IG5ldyBJc1JlYWR5KCk7XG5cbiAgcHJpdmF0ZSBfbWVtOiBSbGpzb24gPSBoaXAoe30gYXMgUmxqc29uKTtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBhc3luYyBfaW5pdCgpIHtcbiAgICB0aGlzLl9pb1Rvb2xzID0gbmV3IElvVG9vbHModGhpcyk7XG4gICAgdGhpcy5faW5pdFRhYmxlQ2ZncygpO1xuICAgIGF3YWl0IHRoaXMuX2lvVG9vbHMuaW5pdFJldmlzaW9uc1RhYmxlKCk7XG5cbiAgICB0aGlzLl9pc1JlYWR5LnJlc29sdmUoKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF9pbml0VGFibGVDZmdzID0gKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlQ2ZnID0gSW9Ub29scy50YWJsZUNmZ3NUYWJsZUNmZztcblxuICAgIHRoaXMuX21lbS50YWJsZUNmZ3MgPSBoaXAoe1xuICAgICAgX2RhdGE6IFt0YWJsZUNmZ10sXG4gICAgICBfdGFibGVDZmc6IHRhYmxlQ2ZnLl9oYXNoIGFzIHN0cmluZyxcbiAgICB9KTtcblxuICAgIGhpcCh0aGlzLl9tZW0sIHsgdXBkYXRlRXhpc3RpbmdIYXNoZXM6IHRydWUsIHRocm93T25Xcm9uZ0hhc2hlczogZmFsc2UgfSk7XG4gIH07XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX2NyZWF0ZU9yRXh0ZW5kVGFibGUocmVxdWVzdDoge1xuICAgIHRhYmxlQ2ZnOiBUYWJsZUNmZztcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSB0YWJsZSBjb25maWcgaXMgY29tcGF0aWJsZVxuICAgIC8vIHdpdGggYW4gcG90ZW50aWFsIGV4aXN0aW5nIHRhYmxlXG4gICAgY29uc3QgdGFibGVDZmcgPSByZXF1ZXN0LnRhYmxlQ2ZnO1xuICAgIGF3YWl0IHRoaXMuX2lvVG9vbHMudGhyb3dXaGVuVGFibGVJc05vdENvbXBhdGlibGUodGFibGVDZmcpO1xuXG4gICAgY29uc3QgeyBrZXkgfSA9IHRhYmxlQ2ZnO1xuXG4gICAgLy8gUmVjcmVhdGUgaGFzaGVzIGluIHRoZSBjYXNlIHRoZSBleGlzdGluZyBoYXNoZXMgYXJlIHdyb25nXG4gICAgY29uc3QgbmV3Q29uZmlnID0gaHNoKHRhYmxlQ2ZnKTtcblxuICAgIC8vIEZpbmQgYW4gZXhpc3RpbmcgdGFibGUgY29uZmlnIHdpdGggdGhlIHNhbWUgaGFzaFxuICAgIGNvbnN0IGV4aXN0aW5nQ29uZmlnID0gYXdhaXQgdGhpcy5faW9Ub29scy50YWJsZUNmZ09yTnVsbChrZXkpO1xuXG4gICAgLy8gV3JpdGUgdGhlIG5ldyBjb25maWcgaW50byB0aGUgZGF0YWJhc2VcbiAgICBpZiAoIWV4aXN0aW5nQ29uZmlnKSB7XG4gICAgICB0aGlzLl9jcmVhdGVUYWJsZShuZXdDb25maWcsIGtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2V4dGVuZFRhYmxlKGV4aXN0aW5nQ29uZmlnLCBuZXdDb25maWcpO1xuICAgIH1cbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF9jcmVhdGVUYWJsZShuZXdDb25maWc6IFRhYmxlQ2ZnLCB0YWJsZUtleTogVGFibGVLZXkpIHtcbiAgICAvLyBXcml0ZSB0aGUgdGFibGUgY29uZmlnIGludG8gdGhlIGRhdGFiYXNlXG4gICAgbmV3Q29uZmlnID0gaHNoKG5ld0NvbmZpZyk7XG4gICAgdGhpcy5fbWVtLnRhYmxlQ2Zncy5fZGF0YS5wdXNoKG5ld0NvbmZpZyk7XG5cbiAgICAvLyBDcmVhdGUgYSB0YWJsZSBhbmQgd3JpdGUgaXQgaW50byB0aGUgZGF0YWJhc2VcbiAgICBjb25zdCB0YWJsZTogVGFibGVUeXBlID0ge1xuICAgICAgX2RhdGE6IFtdLFxuICAgICAgX3RhYmxlQ2ZnOiBuZXdDb25maWcuX2hhc2ggYXMgc3RyaW5nLFxuICAgIH07XG5cbiAgICB0aGlzLl9tZW1bdGFibGVLZXldID8/PSBoaXAodGFibGUpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgX2V4dGVuZFRhYmxlKGV4aXN0aW5nQ29uZmlnOiBUYWJsZUNmZywgbmV3Q29uZmlnOiBUYWJsZUNmZykge1xuICAgIC8vIE5vIGNvbHVtbnMgYWRkZWQ/IFJldHVybi5cbiAgICBpZiAoZXhpc3RpbmdDb25maWcuY29sdW1ucy5sZW5ndGggPT09IG5ld0NvbmZpZy5jb2x1bW5zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFdyaXRlIHRoZSBuZXcgdGFibGUgY29uZmlnIGludG8gdGhlIGRhdGFiYXNlXG4gICAgbmV3Q29uZmlnID0gaHNoKG5ld0NvbmZpZyk7XG4gICAgdGhpcy5fbWVtLnRhYmxlQ2Zncy5fZGF0YS5wdXNoKG5ld0NvbmZpZyk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGNvbmZpZyBvZiB0aGUgZXhpc3RpbmcgdGFibGVcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuX21lbVtuZXdDb25maWcua2V5XSBhcyBUYWJsZVR5cGU7XG4gICAgdGFibGUuX3RhYmxlQ2ZnID0gbmV3Q29uZmlnLl9oYXNoIGFzIHN0cmluZztcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuXG4gIHByaXZhdGUgYXN5bmMgX2R1bXAoKTogUHJvbWlzZTxSbGpzb24+IHtcbiAgICByZXR1cm4gY29weSh0aGlzLl9tZW0pO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX2R1bXBUYWJsZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZURvZXNOb3RFeGlzdChyZXF1ZXN0LnRhYmxlKTtcblxuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5fbWVtW3JlcXVlc3QudGFibGVdIGFzIFRhYmxlVHlwZTtcblxuICAgIHJldHVybiB7XG4gICAgICBbcmVxdWVzdC50YWJsZV06IGNvcHkodGFibGUpLFxuICAgIH07XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBhc3luYyBfd3JpdGUocmVxdWVzdDogeyBkYXRhOiBSbGpzb24gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFkZGVkRGF0YSA9IGhzaChyZXF1ZXN0LmRhdGEpO1xuICAgIGNvbnN0IHRhYmxlcyA9IE9iamVjdC5rZXlzKGFkZGVkRGF0YSk7XG5cbiAgICBhd2FpdCB0aGlzLl9pb1Rvb2xzLnRocm93V2hlblRhYmxlc0RvTm90RXhpc3QocmVxdWVzdC5kYXRhKTtcbiAgICBhd2FpdCB0aGlzLl9pb1Rvb2xzLnRocm93V2hlblRhYmxlRGF0YURvZXNOb3RNYXRjaENmZyhyZXF1ZXN0LmRhdGEpO1xuXG4gICAgZm9yIChjb25zdCB0YWJsZSBvZiB0YWJsZXMpIHtcbiAgICAgIGlmICh0YWJsZS5zdGFydHNXaXRoKCdfJykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9sZFRhYmxlID0gdGhpcy5fbWVtW3RhYmxlXSBhcyBUYWJsZVR5cGU7XG4gICAgICBjb25zdCBuZXdUYWJsZSA9IGFkZGVkRGF0YVt0YWJsZV0gYXMgVGFibGVUeXBlO1xuXG4gICAgICAvLyBUYWJsZSBleGlzdHMuIE1lcmdlIGRhdGFcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBuZXdUYWJsZS5fZGF0YSkge1xuICAgICAgICBjb25zdCBoYXNoID0gaXRlbS5faGFzaDtcbiAgICAgICAgY29uc3QgZXhpc3RzID0gb2xkVGFibGUuX2RhdGEuZmluZCgoaSkgPT4gaS5faGFzaCA9PT0gaGFzaCk7XG4gICAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgICAgb2xkVGFibGUuX2RhdGEucHVzaChpdGVtIGFzIGFueSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZWNhbGMgbWFpbiBoYXNoZXNcbiAgICAodGhpcy5fbWVtIGFzIGFueSkuX2hhc2ggPSAnJztcbiAgICBoaXAodGhpcy5fbWVtLCB7IHVwZGF0ZUV4aXN0aW5nSGFzaGVzOiBmYWxzZSwgdGhyb3dPbldyb25nSGFzaGVzOiBmYWxzZSB9KTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIGFzeW5jIF9yZWFkUm93cyhyZXF1ZXN0OiB7XG4gICAgdGFibGU6IHN0cmluZztcbiAgICB3aGVyZTogeyBbY29sdW1uOiBzdHJpbmddOiBKc29uVmFsdWUgfTtcbiAgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZURvZXNOb3RFeGlzdChyZXF1ZXN0LnRhYmxlKTtcblxuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5fbWVtW3JlcXVlc3QudGFibGVdIGFzIFRhYmxlVHlwZTtcblxuICAgIGNvbnN0IHJlc3VsdDogUmxqc29uID0ge1xuICAgICAgW3JlcXVlc3QudGFibGVdOiB7XG4gICAgICAgIF9kYXRhOiB0YWJsZS5fZGF0YS5maWx0ZXIoKHJvdykgPT4ge1xuICAgICAgICAgIGZvciAoY29uc3QgY29sdW1uIGluIHJlcXVlc3Qud2hlcmUpIHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSByb3dbY29sdW1uXTtcbiAgICAgICAgICAgIGNvbnN0IGIgPSByZXF1ZXN0LndoZXJlW2NvbHVtbl07XG4gICAgICAgICAgICBpZiAoIWVxdWFscyhhLCBiKSkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfSBhcyBhbnk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iLCIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuaW1wb3J0IHsgSnNvblZhbHVlIH0gZnJvbSAnQHJsanNvbi9qc29uJztcbmltcG9ydCB7IFJsanNvbiwgVGFibGVDZmcsIFRhYmxlS2V5IH0gZnJvbSAnQHJsanNvbi9ybGpzb24nO1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuZXhwb3J0IGludGVyZmFjZSBJbyB7XG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBHZW5lcmFsXG5cbiAgLyoqIFN0YXJ0cyB0aGUgaW5pdGlhbGl6YXRpb24gKi9cbiAgaW5pdCgpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKiBBIHByb21pc2UgcmVzb2x2aW5nIG9uY2UgdGhlIElvIGludGVyZmFjZSBpcyByZWFkeVxuICAgKlxuICAgKiDwn5KhIFVzZSBAcmxqc29uL2lzLXJlYWR5XG4gICAqL1xuICBpc1JlYWR5KCk6IFByb21pc2U8dm9pZD47XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIER1bXBcblxuICAvKiogUmV0dXJucyB0aGUgY29tcGxldGUgZGIgY29udGVudCBhcyBSbGpzb24gKi9cbiAgZHVtcCgpOiBQcm9taXNlPFJsanNvbj47XG5cbiAgLyoqIFJldHVybnMgdGhlIGR1bXAgb2YgYSBjb21wbGV0ZSB0YWJsZSAqL1xuICBkdW1wVGFibGUocmVxdWVzdDogeyB0YWJsZTogc3RyaW5nIH0pOiBQcm9taXNlPFJsanNvbj47XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFRhYmxlc1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRhYmxlIGV4aXN0c1xuICAgKi9cbiAgdGFibGVFeGlzdHModGFibGVLZXk6IFRhYmxlS2V5KTogUHJvbWlzZTxib29sZWFuPjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHRhYmxlIHdpdGggYSBnaXZlbiBjb25maWcuXG4gICAqIElmIHRoZSB0YWJsZSBhbHJlYWR5IGV4aXN0cywgbmV3IGNvbHVtbnMgYXJlIGFkZGVkIHRvIHRoZSBleGlzdGluZyB0YWJsZS5cbiAgICogSWYgdGhlIHRhYmxlIGRvZXMgbm90IGV4aXN0LCBpdCBpcyBjcmVhdGVkIHdpdGggdGhlIGdpdmVuIGNvbmZpZy5cbiAgICogSWYgdGhlIHRhYmxlIGV4aXN0cyBhbmQgY29sdW1ucyBhcmUgcmVtb3ZlZCwgYW4gZXJyb3IgaXMgdGhyb3duLlxuICAgKiBJZiB0aGUgdGFibGUgZXhpc3RzIGFuZCB0aGUgY29sdW1uIHR5cGUgaXMgY2hhbmdlZCwgYW4gZXJyb3IgaXMgdGhyb3duLlxuICAgKi9cbiAgY3JlYXRlT3JFeHRlbmRUYWJsZShyZXF1ZXN0OiB7IHRhYmxlQ2ZnOiBUYWJsZUNmZyB9KTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogUmV0dXJucyBhIGpzb24gc3RydWN0dXJlIHJldHVybmluZyBjdXJyZW50IHRhYmxlIGNvbmZpZ3VyYXRpb25zXG4gICAqL1xuICB0YWJsZUNmZ3MoKTogUHJvbWlzZTxSbGpzb24+O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBXcml0ZVxuXG4gIC8qKiBXcml0ZXMgUmxqc29uIGRhdGEgaW50byB0aGUgZGF0YWJhc2UgKi9cbiAgd3JpdGUocmVxdWVzdDogeyBkYXRhOiBSbGpzb24gfSk6IFByb21pc2U8dm9pZD47XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFJlYWQgcm93c1xuXG4gIC8qKiBRdWVyaWVzIGEgbGlzdCBvZiByb3dzICovXG4gIHJlYWRSb3dzKHJlcXVlc3Q6IHtcbiAgICB0YWJsZTogc3RyaW5nO1xuICAgIHdoZXJlOiB7IFtjb2x1bW46IHN0cmluZ106IEpzb25WYWx1ZSB8IG51bGwgfTtcbiAgfSk6IFByb21pc2U8Umxqc29uPjtcblxuICAvKiogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIGdpdmVuIHRhYmxlICovXG4gIHJvd0NvdW50KHRhYmxlOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj47XG59XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5leHBvcnQgY29uc3QgZXhhbXBsZUlvID1cbiAgJ0NoZWNrb3V0IEBybGpzb24vaW8tbWVtIGZvciBhbiBleGFtcGxlIGltcGxlbWVudGF0aW9uJztcbiIsIi8vIEBsaWNlbnNlXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXG4vL1xuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGVybXMgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxuXG5pbXBvcnQgeyBKc29uIH0gZnJvbSAnQHJsanNvbi9qc29uJztcbmltcG9ydCB7XG4gIEJ1ZmZldCxcbiAgQ2FrZSxcbiAgaXRlcmF0ZVRhYmxlc1N5bmMsXG4gIExheWVyLFxuICBSZWYsXG4gIFJsanNvbixcbiAgVGFibGVLZXksXG59IGZyb20gJ0BybGpzb24vcmxqc29uJztcblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbi8qKlxuICogRGVzY3JpYmVzIGEgcm93IHRoYXQgcmVmZXJlbmNlcyBhIGNoaWxkIHRhYmxlIHJvd1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcmVudFJlZiB7XG4gIC8qKlxuICAgKiBUaGUgcGFyZW50IHRhYmxlIHRoYXQgcmVmZXJlbmNlcyB0aGUgY2hpbGQgdGFibGVcbiAgICovXG4gIFtwYXJlbnRUYWJsZTogVGFibGVLZXldOiB7XG4gICAgLyoqXG4gICAgICogVGhlIHBhcmVudCByb3cgdGhhdCByZWZlcmVuY2VzIHRoZSBjaGlsZCByb3dcbiAgICAgKi9cbiAgICBbcGFyZW50Um93OiBSZWZdOiB7XG4gICAgICAvKipcbiAgICAgICAqIERldGFpbHMgYWJvdXQgdGhlIHJlZmVyZW5jZSwgZS5nLiBhbiBhcnJheSBpbmRleCBldGMuXG4gICAgICAgKi9cbiAgICAgIGRldGFpbHM/OiBKc29uO1xuICAgIH07XG4gIH07XG59XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4vKipcbiAqIERlc2NyaWJlcyB0aGUgcGFyZW50IHRhYmxlIHJvd3MgcmVmZXJlbmNpbmcgYSBjaGlsZCB0YWJsZSByb3dcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXZlcnNlUmVmcyB7XG4gIC8qKlxuICAgKiBUaGUgY2hpbGQgdGFibGUgd2UgbmVlZCB0aGUgcmVmZXJlbmNpbmcgcm93cyBmb3JcbiAgICovXG4gIFtjaGlsZFRhYmxlOiBUYWJsZUtleV06IHtcbiAgICAvKipcbiAgICAgKiBUaGUgcm93IGhhc2h3ZSBuZWVkIHRoZSByZWZlcmVuY2luZyByb3dzIGZvclxuICAgICAqL1xuICAgIFtjaGlsZFJvdzogUmVmXTogUGFyZW50UmVmO1xuICB9O1xufVxuXG4vKiB2OCBpZ25vcmUgc3RhcnQgKi9cblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgcmV2ZXJzZSByZWZlcmVuY2VzIGZvciBhIGdpdmVuIHJsanNvbiBvYmplY3RcbiAqL1xuZXhwb3J0IGNvbnN0IGNhbGNSZXZlcnNlUmVmcyA9IChybGpzb246IFJsanNvbik6IFJldmVyc2VSZWZzID0+IHtcbiAgY29uc3QgcmVzdWx0OiBSZXZlcnNlUmVmcyA9IHt9O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gUHJlcGFyZSBkYXRhIHN0cnVjdHVyZVxuICBpdGVyYXRlVGFibGVzU3luYyhybGpzb24sIChjaGlsZFRhYmxlS2V5LCB0YWJsZSkgPT4ge1xuICAgIGNvbnN0IGNoaWxkVGFibGU6IHsgW2NoaWxkUm93SGFzaDogc3RyaW5nXTogUGFyZW50UmVmIH0gPSB7fTtcbiAgICByZXN1bHRbY2hpbGRUYWJsZUtleV0gPSBjaGlsZFRhYmxlO1xuICAgIGZvciAoY29uc3QgY2hpbGRSb3cgb2YgdGFibGUuX2RhdGEpIHtcbiAgICAgIGNoaWxkVGFibGVbY2hpbGRSb3cuX2hhc2hdID0ge307XG4gICAgfVxuICB9KTtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIEdlbmVyYXRlIHJldmVyc2UgcmVmZXJlbmNlc1xuICBpdGVyYXRlVGFibGVzU3luYyhybGpzb24sIChwYXJlbnRUYWJsZUtleSwgcGFyZW50VGFibGUpID0+IHtcbiAgICAvLyBJdGVyYXRlIGFsbCByb3dzIG9mIGVhY2ggdGFibGVcbiAgICBmb3IgKGNvbnN0IHBhcmVudFRhYmxlUm93IG9mIHBhcmVudFRhYmxlLl9kYXRhKSB7XG4gICAgICAvLyBGaW5kIG91dCB3aGUgb3RoZXIgdGFibGVzICYgcm93cyBhcmUgcmVmZXJlbmNlZCBieSB0aGlzIHJvd1xuICAgICAgLy8gV3JpdGUgdGhlc2UgaW5mb3JtYXRpb24gaW50dG8gcmVzdWx0XG4gICAgICBzd2l0Y2ggKHBhcmVudFRhYmxlLl90eXBlKSB7XG4gICAgICAgIGNhc2UgJ2luZ3JlZGllbnRzJzpcbiAgICAgICAgICBfd3JpdGVJbmdyZWRpZW50UmVmcyhwYXJlbnRUYWJsZUtleSwgcGFyZW50VGFibGVSb3csIHJlc3VsdCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnbGF5ZXJzJzoge1xuICAgICAgICAgIF93cml0ZUxheWVyUmVmcyhwYXJlbnRUYWJsZUtleSwgcGFyZW50VGFibGVSb3csIHJlc3VsdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdzbGljZUlkcyc6IHtcbiAgICAgICAgICAvLyBTbGljZSBpZHMgZG8gbm90IHJlZmVyZW5jZSBvdGhlciB0YWJsZXNcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ2Nha2VzJzoge1xuICAgICAgICAgIF93cml0ZUNha2VSZWZzKHBhcmVudFRhYmxlS2V5LCBwYXJlbnRUYWJsZVJvdywgcmVzdWx0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ2J1ZmZldHMnOiB7XG4gICAgICAgICAgX3dyaXRlQnVmZmV0UmVmcyhwYXJlbnRUYWJsZUtleSwgcGFyZW50VGFibGVSb3csIHJlc3VsdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKiB2OCBpZ25vcmUgZW5kICovXG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5jb25zdCBfd3JpdGVJbmdyZWRpZW50UmVmcyA9IChcbiAgcGFyZW50VGFibGVOYW1lOiBUYWJsZUtleSxcbiAgcGFyZW50Um93OiBKc29uLFxuICByZXN1bHQ6IFJldmVyc2VSZWZzLFxuKSA9PiB7XG4gIGNvbnN0IHBhcmVudFJvd0hhc2ggPSBwYXJlbnRSb3cuX2hhc2ggYXMgc3RyaW5nO1xuXG4gIGZvciAoY29uc3QgcGFyZW50Q29sdW1uTmFtZSBpbiBwYXJlbnRSb3cpIHtcbiAgICBpZiAocGFyZW50Q29sdW1uTmFtZS5zdGFydHNXaXRoKCdfJykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghcGFyZW50Q29sdW1uTmFtZS5lbmRzV2l0aCgnUmVmJykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkVGFibGVOYW1lID0gcGFyZW50Q29sdW1uTmFtZS5zbGljZSgwLCAtMyk7XG4gICAgY29uc3QgY2hpbGRSb3dIYXNoID0gcGFyZW50Um93W3BhcmVudENvbHVtbk5hbWVdIGFzIHN0cmluZztcblxuICAgIF93cml0ZShcbiAgICAgIHJlc3VsdCxcbiAgICAgIGNoaWxkVGFibGVOYW1lLFxuICAgICAgY2hpbGRSb3dIYXNoLFxuICAgICAgcGFyZW50VGFibGVOYW1lLFxuICAgICAgcGFyZW50Um93SGFzaCxcbiAgICApO1xuICB9XG59O1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuY29uc3QgX3dyaXRlTGF5ZXJSZWZzID0gKFxuICBwYXJlbnRUYWJsZU5hbWU6IFRhYmxlS2V5LFxuICBwYXJlbnRSb3c6IExheWVyLFxuICByZXN1bHQ6IFJldmVyc2VSZWZzLFxuKSA9PiB7XG4gIGNvbnN0IGNoaWxkVGFibGVOYW1lID0gcGFyZW50Um93LmluZ3JlZGllbnRzVGFibGU7XG4gIGNvbnN0IHBhcmVudFJvd0hhc2ggPSBwYXJlbnRSb3cuX2hhc2ggYXMgc3RyaW5nO1xuXG4gIGZvciAoY29uc3Qgc2xpY2VJZCBpbiBwYXJlbnRSb3cuYXNzaWduKSB7XG4gICAgaWYgKHNsaWNlSWQuc3RhcnRzV2l0aCgnXycpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBzbGljZUhhc2ggPSBwYXJlbnRSb3cuYXNzaWduW3NsaWNlSWRdIGFzIHN0cmluZztcblxuICAgIF93cml0ZShyZXN1bHQsIGNoaWxkVGFibGVOYW1lLCBzbGljZUhhc2gsIHBhcmVudFRhYmxlTmFtZSwgcGFyZW50Um93SGFzaCk7XG4gIH1cbn07XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5jb25zdCBfd3JpdGVDYWtlUmVmcyA9IChcbiAgcGFyZW50VGFibGVOYW1lOiBUYWJsZUtleSxcbiAgcGFyZW50Um93OiBDYWtlLFxuICByZXN1bHQ6IFJldmVyc2VSZWZzLFxuKSA9PiB7XG4gIGNvbnN0IHBhcmVudFJvd0hhc2ggPSBwYXJlbnRSb3cuX2hhc2ggYXMgc3RyaW5nO1xuXG4gIGZvciAoY29uc3QgbGF5ZXIgaW4gcGFyZW50Um93LmxheWVycykge1xuICAgIGNvbnN0IGNoaWxkVGFibGVOYW1lID0gcGFyZW50Um93LmxheWVyc1RhYmxlO1xuICAgIGNvbnN0IGNoaWxkUm93SGFzaCA9IHBhcmVudFJvdy5sYXllcnNbbGF5ZXJdIGFzIHN0cmluZztcbiAgICBfd3JpdGUoXG4gICAgICByZXN1bHQsXG4gICAgICBjaGlsZFRhYmxlTmFtZSxcbiAgICAgIGNoaWxkUm93SGFzaCxcbiAgICAgIHBhcmVudFRhYmxlTmFtZSxcbiAgICAgIHBhcmVudFJvd0hhc2gsXG4gICAgKTtcbiAgfVxufTtcblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbmNvbnN0IF93cml0ZUJ1ZmZldFJlZnMgPSAoXG4gIHBhcmVudFRhYmxlTmFtZTogVGFibGVLZXksXG4gIHBhcmVudFJvdzogQnVmZmV0LFxuICByZXN1bHQ6IFJldmVyc2VSZWZzLFxuKSA9PiB7XG4gIGNvbnN0IHBhcmVudFJvd0hhc2ggPSBwYXJlbnRSb3cuX2hhc2ggYXMgc3RyaW5nO1xuXG4gIGZvciAoY29uc3QgaXRlbSBvZiBwYXJlbnRSb3cuaXRlbXMpIHtcbiAgICBjb25zdCBjaGlsZFRhYmxlTmFtZSA9IGl0ZW0udGFibGU7XG4gICAgY29uc3QgY2hpbGRSb3dIYXNoID0gaXRlbS5yZWY7XG4gICAgX3dyaXRlKFxuICAgICAgcmVzdWx0LFxuICAgICAgY2hpbGRUYWJsZU5hbWUsXG4gICAgICBjaGlsZFJvd0hhc2gsXG4gICAgICBwYXJlbnRUYWJsZU5hbWUsXG4gICAgICBwYXJlbnRSb3dIYXNoLFxuICAgICk7XG4gIH1cbn07XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5jb25zdCBfd3JpdGUgPSAoXG4gIHJlc3VsdDogUmV2ZXJzZVJlZnMsXG4gIGNoaWxkVGFibGVOYW1lOiBzdHJpbmcsXG4gIGNoaWxkUm93SGFzaDogc3RyaW5nLFxuICBwYXJlbnRUYWJsZU5hbWU6IHN0cmluZyxcbiAgcGFyZW50Um93SGFzaDogc3RyaW5nLFxuKSA9PiB7XG4gIGNvbnN0IHJlZmVyZW5jZXNGb3JDaGlsZFRhYmxlID0gKHJlc3VsdFtjaGlsZFRhYmxlTmFtZV0gPz89IHt9KTtcbiAgY29uc3QgcmVmZXJlbmNlc0ZvckNoaWxkVGFibGVSb3cgPSAocmVmZXJlbmNlc0ZvckNoaWxkVGFibGVbY2hpbGRSb3dIYXNoXSA/Pz1cbiAgICB7fSk7XG5cbiAgcmVmZXJlbmNlc0ZvckNoaWxkVGFibGVSb3dbcGFyZW50VGFibGVOYW1lXSA/Pz0ge307XG4gIHJlZmVyZW5jZXNGb3JDaGlsZFRhYmxlUm93W3BhcmVudFRhYmxlTmFtZV1bcGFyZW50Um93SGFzaF0gPz89IHt9O1xufTtcbiJdLCJuYW1lcyI6WyJlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFzQk8sTUFBTSxXQUFOLE1BQU0sU0FBUTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLbkIsWUFBNEIsSUFBUTtBQWlDcEM7QUFBQTtBQUFBO0FBQUEsOENBQXFCLFlBQVk7QUFDL0IsWUFBTSxXQUFxQjtBQUFBLFFBQ3pCLEtBQUs7QUFBQSxRQUNMLE1BQU07QUFBQSxRQUNOLFFBQVE7QUFBQSxRQUNSLFFBQVE7QUFBQSxRQUNSLFVBQVU7QUFBQSxRQUVW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
527
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW8uanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9pby10b29scy50cyIsIi4uL3NyYy9pby1tZW0udHMiLCIuLi9zcmMvaW8tdGVzdC1zZXR1cC50cyIsIi4uL3NyYy9pby50cyIsIi4uL3NyYy9yZXZlcnNlLXJlZi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuaW1wb3J0IHsgaGlwIH0gZnJvbSAnQHJsanNvbi9oYXNoJztcbmltcG9ydCB7XG4gIGl0ZXJhdGVUYWJsZXMsXG4gIFJsanNvbixcbiAgVGFibGVDZmcsXG4gIFRhYmxlS2V5LFxuICB0aHJvd09uSW52YWxpZFRhYmxlQ2ZnLFxuICB2YWxpZGF0ZVJsanNvbkFnYWluc3RUYWJsZUNmZyxcbn0gZnJvbSAnQHJsanNvbi9ybGpzb24nO1xuXG5pbXBvcnQgeyBJb01lbSB9IGZyb20gJy4vaW8tbWVtLnRzJztcbmltcG9ydCB7IElvIH0gZnJvbSAnLi9pby50cyc7XG5cbi8qKlxuICogUHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHRoZSBJbyBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBJb1Rvb2xzIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSBpbyBUaGUgSW8gaW50ZXJmYWNlIHRvIHVzZVxuICAgKi9cbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGlvOiBJbykge31cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGFibGUgY29uZmlndXJhdGlvbiBvZiB0aGUgdGFibGVDZmdzIHRhYmxlLlxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZUNmZ3NUYWJsZUNmZygpIHtcbiAgICBjb25zdCB0YWJsZUNmZyA9IGhpcDxUYWJsZUNmZz4oe1xuICAgICAgX2hhc2g6ICcnLFxuICAgICAga2V5OiAndGFibGVDZmdzJyxcbiAgICAgIHR5cGU6ICdpbmdyZWRpZW50cycsXG4gICAgICBpc0hlYWQ6IGZhbHNlLFxuICAgICAgaXNSb290OiBmYWxzZSxcbiAgICAgIGlzU2hhcmVkOiB0cnVlLFxuICAgICAgcHJldmlvdXM6ICcnLFxuXG4gICAgICBjb2x1bW5zOiBbXG4gICAgICAgIHsga2V5OiAnX2hhc2gnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICB7IGtleTogJ2tleScsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHsga2V5OiAndHlwZScsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHsga2V5OiAnaXNIZWFkJywgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgICAgIHsga2V5OiAnaXNSb290JywgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgICAgIHsga2V5OiAnaXNTaGFyZWQnLCB0eXBlOiAnYm9vbGVhbicgfSxcbiAgICAgICAgeyBrZXk6ICdwcmV2aW91cycsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHsga2V5OiAnY29sdW1ucycsIHR5cGU6ICdqc29uQXJyYXknIH0sXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRhYmxlQ2ZnO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSByZXZpc2lvbnMgdGFibGUuXG4gICAqL1xuICBpbml0UmV2aXNpb25zVGFibGUgPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGVDZmc6IFRhYmxlQ2ZnID0ge1xuICAgICAga2V5OiAncmV2aXNpb25zJyxcbiAgICAgIHR5cGU6ICdpbmdyZWRpZW50cycsXG4gICAgICBpc0hlYWQ6IHRydWUsXG4gICAgICBpc1Jvb3Q6IHRydWUsXG4gICAgICBpc1NoYXJlZDogZmFsc2UsXG5cbiAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAgeyBrZXk6ICdfaGFzaCcsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHsga2V5OiAndGFibGUnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICB7IGtleTogJ3ByZWRlY2Vzc29yJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgeyBrZXk6ICdzdWNjZXNzb3InLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICB7IGtleTogJ3RpbWVzdGFtcCcsIHR5cGU6ICdudW1iZXInIH0sXG4gICAgICAgIHsga2V5OiAnaWQnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgXSxcbiAgICB9O1xuXG4gICAgYXdhaXQgdGhpcy5pby5jcmVhdGVPckV4dGVuZFRhYmxlKHsgdGFibGVDZmcgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEV4YW1wbGUgb2JqZWN0IGZvciB0ZXN0IHB1cnBvc2VzXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIGlvIHRvb2xzXG4gICAqL1xuICBzdGF0aWMgZXhhbXBsZSA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbyA9IGF3YWl0IElvTWVtLmV4YW1wbGUoKTtcbiAgICBhd2FpdCBpby5pbml0KCk7XG4gICAgYXdhaXQgaW8uaXNSZWFkeSgpO1xuICAgIHJldHVybiBuZXcgSW9Ub29scyhpbyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFRocm93cyBpZiB0aGUgdGFibGUgZG9lcyBub3QgZXhpc3RcbiAgICovXG4gIGFzeW5jIHRocm93V2hlblRhYmxlRG9lc05vdEV4aXN0KHRhYmxlOiBUYWJsZUtleSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGV4aXN0cyA9IGF3YWl0IHRoaXMuaW8udGFibGVFeGlzdHModGFibGUpO1xuICAgIGlmICghZXhpc3RzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlIFwiJHt0YWJsZX1cIiBub3QgZm91bmRgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGlmIGFueSBvZiB0aGUgdGFibGVzIGluIHJsanNvbiBkbyBub3QgZXhpc3RcbiAgICogQHBhcmFtIHJsanNvbiAtIFRoZSBSbGpzb24gb2JqZWN0IHRvIGNoZWNrXG4gICAqL1xuICBhc3luYyB0aHJvd1doZW5UYWJsZXNEb05vdEV4aXN0KHJsanNvbjogUmxqc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGl0ZXJhdGVUYWJsZXMocmxqc29uLCBhc3luYyAodGFibGVLZXkpID0+IHtcbiAgICAgICAgY29uc3QgZXhpc3RzID0gYXdhaXQgdGhpcy5pby50YWJsZUV4aXN0cyh0YWJsZUtleSk7XG4gICAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSBcIiR7dGFibGVLZXl9XCIgbm90IGZvdW5kYCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnN0IG1pc3NpbmdUYWJsZXMgPSAoZSBhcyBBcnJheTxhbnk+KS5tYXAoKGUpID0+IGUudGFibGVLZXkpO1xuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgZm9sbG93aW5nIHRhYmxlcyBkbyBub3QgZXhpc3Q6ICR7bWlzc2luZ1RhYmxlcy5qb2luKCcsICcpfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCB3aXRoIGFsbCB0YWJsZSBuYW1lc1xuICAgKi9cbiAgYXN5bmMgYWxsVGFibGVLZXlzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgdGhpcy5pby50YWJsZUNmZ3MoKSkudGFibGVDZmdzLl9kYXRhLm1hcChcbiAgICAgIChlKSA9PiBlLmtleSxcbiAgICApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBvZiBhIGdpdmVuIHRhYmxlXG4gICAqL1xuICBhc3luYyB0YWJsZUNmZyh0YWJsZTogVGFibGVLZXkpOiBQcm9taXNlPFRhYmxlQ2ZnPiB7XG4gICAgY29uc3QgdGFibGVDZmcgPSBhd2FpdCB0aGlzLnRhYmxlQ2ZnT3JOdWxsKHRhYmxlKTtcbiAgICBpZiAoIXRhYmxlQ2ZnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlIFwiJHt0YWJsZX1cIiBub3QgZm91bmRgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFibGVDZmchO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBnaXZlbiB0YWJsZSBvciBudWxsIGlmIGl0IGRvZXMgbm90IGV4aXN0LlxuXG4gICAqL1xuICBhc3luYyB0YWJsZUNmZ09yTnVsbCh0YWJsZTogVGFibGVLZXkpOiBQcm9taXNlPFRhYmxlQ2ZnIHwgbnVsbD4ge1xuICAgIGNvbnN0IHRhYmxlQ2ZncyA9IGF3YWl0IHRoaXMuaW8udGFibGVDZmdzKCk7XG4gICAgY29uc3QgdGFibGVDZmcgPSB0YWJsZUNmZ3MudGFibGVDZmdzLl9kYXRhLmZpbmQoKGUpID0+IGUua2V5ID09PSB0YWJsZSk7XG4gICAgcmV0dXJuIHRhYmxlQ2ZnID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIGNvbHVtbiBuYW1lcyBvZiBhIGdpdmVuIHRhYmxlXG4gICAqL1xuICBhc3luYyBhbGxDb2x1bW5LZXlzKHRhYmxlOiBUYWJsZUtleSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCB0YWJsZUNmZyA9IGF3YWl0IHRoaXMudGFibGVDZmcodGFibGUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRhYmxlQ2ZnLmNvbHVtbnMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5rZXkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIHdoZW4gYSBjb2x1bW4gZG9lcyBub3QgZXhpc3QgaW4gYSBnaXZlbiB0YWJsZVxuICAgKiBAcGFyYW0gdGFibGUgLSBUaGUgdGFibGUgdG8gY2hlY2tcbiAgICogQHBhcmFtIGNvbHVtbnMgLSBUaGUgY29sdW1uIHRvIGNoZWNrXG4gICAqL1xuICBhc3luYyB0aHJvd1doZW5Db2x1bW5Eb2VzTm90RXhpc3QoXG4gICAgdGFibGU6IFRhYmxlS2V5LFxuICAgIGNvbHVtbnM6IHN0cmluZ1tdLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0YWJsZUNmZyA9IGF3YWl0IHRoaXMudGFibGVDZmcodGFibGUpO1xuICAgIGNvbnN0IGNvbHVtbktleXMgPSB0YWJsZUNmZy5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ua2V5KTtcbiAgICBjb25zdCBtaXNzaW5nQ29sdW1ucyA9IGNvbHVtbnMuZmlsdGVyKFxuICAgICAgKGNvbHVtbikgPT4gIWNvbHVtbktleXMuaW5jbHVkZXMoY29sdW1uKSxcbiAgICApO1xuICAgIGlmIChtaXNzaW5nQ29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgZm9sbG93aW5nIGNvbHVtbnMgZG8gbm90IGV4aXN0IGluIHRhYmxlIFwiJHt0YWJsZX1cIjogJHttaXNzaW5nQ29sdW1ucy5qb2luKFxuICAgICAgICAgICcsICcsXG4gICAgICAgICl9LmAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3Mgd2hlbiBhIHRhYmxlIHVwZGF0ZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IHRhYmxlXG4gICAqIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBhc3luYyB0aHJvd1doZW5UYWJsZUlzTm90Q29tcGF0aWJsZSh1cGRhdGU6IFRhYmxlQ2ZnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHJlZml4ID0gYEludmFsaWQgdXBkYXRlIG9mIHRhYmxlIGFibGUgXCIke3VwZGF0ZS5rZXl9XCJgO1xuXG4gICAgdGhyb3dPbkludmFsaWRUYWJsZUNmZyh1cGRhdGUpO1xuXG4gICAgLy8gQ2hlY2sgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIHRhYmxlXG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLnRhYmxlQ2ZnT3JOdWxsKHVwZGF0ZS5rZXkpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgLy8gSGF2ZSBjb2x1bW5zIGJlZW4gZGVsZXRlZD9cbiAgICAgIGlmIChleGlzdGluZy5jb2x1bW5zLmxlbmd0aCA+IHVwZGF0ZS5jb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBkZWxldGVkQ29sdW1uS2V5cyA9IGV4aXN0aW5nLmNvbHVtbnNcbiAgICAgICAgICAubWFwKChjb2x1bW4pID0+IGNvbHVtbi5rZXkpXG4gICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgIChrZXkpID0+ICF1cGRhdGUuY29sdW1ucy5zb21lKChjb2x1bW4pID0+IGNvbHVtbi5rZXkgPT09IGtleSksXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKGRlbGV0ZWRDb2x1bW5LZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBkZWxldGVkQ29sdW1ucyA9IGRlbGV0ZWRDb2x1bW5LZXlzLmpvaW4oJywgJyk7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYCR7cHJlZml4fTogQ29sdW1ucyBtdXN0IG5vdCBiZSBkZWxldGVkLiBgICtcbiAgICAgICAgICAgICAgYERlbGV0ZWQgY29sdW1uczogJHtkZWxldGVkQ29sdW1uc319YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhdmUgY29sdW1uIGtleXMgY2hhbmdlZD9cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhpc3RpbmcuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBiZWZvcmUgPSBleGlzdGluZy5jb2x1bW5zW2ldLmtleTtcbiAgICAgICAgY29uc3QgYWZ0ZXIgPSB1cGRhdGUuY29sdW1uc1tpXS5rZXk7XG4gICAgICAgIGlmIChiZWZvcmUgIT09IGFmdGVyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYCR7cHJlZml4fTogYCArXG4gICAgICAgICAgICAgIGBDb2x1bW4ga2V5cyBtdXN0IG5vdCBjaGFuZ2UhIGAgK1xuICAgICAgICAgICAgICBgQ29sdW1uIFwiJHtiZWZvcmV9XCIgd2FzIHJlbmFtZWQgaW50byBcIiR7YWZ0ZXJ9XCIuYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhdmUgY29sdW1uIHR5cGVzIGNoYW5nZWQ/XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4aXN0aW5nLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gZXhpc3RpbmcuY29sdW1uc1tpXS5rZXk7XG4gICAgICAgIGNvbnN0IGJlZm9yZSA9IGV4aXN0aW5nLmNvbHVtbnNbaV0udHlwZTtcbiAgICAgICAgY29uc3QgYWZ0ZXIgPSB1cGRhdGUuY29sdW1uc1tpXS50eXBlO1xuICAgICAgICBpZiAoYmVmb3JlICE9PSBhZnRlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGAke3ByZWZpeH06IGAgK1xuICAgICAgICAgICAgICBgQ29sdW1uIHR5cGVzIG11c3Qgbm90IGNoYW5nZSEgYCArXG4gICAgICAgICAgICAgIGBUeXBlIG9mIGNvbHVtbiBcIiR7Y29sdW1ufVwiIHdhcyBjaGFuZ2VkIGZyb20gXCIke2JlZm9yZX1cIiB0byAke2FmdGVyfS5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGlmIHRoZSBkYXRhIGluIHRoZSB0YWJsZSBkbyBub3QgbWF0Y2ggdGhlIHRhYmxlIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIGFzeW5jIHRocm93V2hlblRhYmxlRGF0YURvZXNOb3RNYXRjaENmZyhkYXRhOiBSbGpzb24pIHtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICBhd2FpdCBpdGVyYXRlVGFibGVzKGRhdGEsIGFzeW5jICh0YWJsZUtleSkgPT4ge1xuICAgICAgY29uc3QgdGFibGVDZmcgPSBhd2FpdCB0aGlzLnRhYmxlQ2ZnKHRhYmxlS2V5KTtcbiAgICAgIGNvbnN0IHRhYmxlID0gZGF0YVt0YWJsZUtleV07XG4gICAgICBlcnJvcnMucHVzaCguLi52YWxpZGF0ZVJsanNvbkFnYWluc3RUYWJsZUNmZyh0YWJsZS5fZGF0YSwgdGFibGVDZmcpKTtcbiAgICB9KTtcblxuICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGFibGUgZGF0YSBkb2VzIG5vdCBtYXRjaCB0aGUgY29uZmlndXJhdGlvbi5cXG5cXG5FcnJvcnM6XFxuJHtlcnJvcnNcbiAgICAgICAgICAubWFwKChlKSA9PiBgLSAke2V9YClcbiAgICAgICAgICAuam9pbignXFxuJyl9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iLCIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuaW1wb3J0IHsgaGlwLCBoc2ggfSBmcm9tICdAcmxqc29uL2hhc2gnO1xuaW1wb3J0IHsgSXNSZWFkeSB9IGZyb20gJ0BybGpzb24vaXMtcmVhZHknO1xuaW1wb3J0IHsgY29weSwgZXF1YWxzLCBKc29uVmFsdWUgfSBmcm9tICdAcmxqc29uL2pzb24nO1xuaW1wb3J0IHsgUmxqc29uLCBUYWJsZUNmZywgVGFibGVLZXksIFRhYmxlVHlwZSB9IGZyb20gJ0BybGpzb24vcmxqc29uJztcblxuaW1wb3J0IHsgSW9Ub29scyB9IGZyb20gJy4vaW8tdG9vbHMudHMnO1xuaW1wb3J0IHsgSW8gfSBmcm9tICcuL2lvLnRzJztcblxuLyoqXG4gKiBJbi1NZW1vcnkgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJsanNvbiBJbyBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBJb01lbSBpbXBsZW1lbnRzIElvIHtcbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIENvbnN0cnVjdG9yICYgZXhhbXBsZVxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgaW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5faW5pdCgpO1xuICB9XG5cbiAgY2xvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgc3RhdGljIGV4YW1wbGUgPSBhc3luYyAoKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBJb01lbSgpO1xuICB9O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBHZW5lcmFsXG4gIGlzUmVhZHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzUmVhZHkucHJvbWlzZTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBEdW1wXG5cbiAgZHVtcCgpOiBQcm9taXNlPFJsanNvbj4ge1xuICAgIHJldHVybiB0aGlzLl9kdW1wKCk7XG4gIH1cblxuICBhc3luYyBkdW1wVGFibGUocmVxdWVzdDogeyB0YWJsZTogc3RyaW5nIH0pOiBQcm9taXNlPFJsanNvbj4ge1xuICAgIHJldHVybiB0aGlzLl9kdW1wVGFibGUocmVxdWVzdCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gUm93c1xuXG4gIHJlYWRSb3dzKHJlcXVlc3Q6IHtcbiAgICB0YWJsZTogc3RyaW5nO1xuICAgIHdoZXJlOiB7IFtjb2x1bW46IHN0cmluZ106IEpzb25WYWx1ZSB9O1xuICB9KTogUHJvbWlzZTxSbGpzb24+IHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZFJvd3MocmVxdWVzdCk7XG4gIH1cblxuICBhc3luYyByb3dDb3VudCh0YWJsZTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB0YWJsZURhdGEgPSB0aGlzLl9tZW1bdGFibGVdIGFzIFRhYmxlVHlwZTtcbiAgICBpZiAoIXRhYmxlRGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSBcIiR7dGFibGV9XCIgbm90IGZvdW5kYCk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGFibGVEYXRhLl9kYXRhLmxlbmd0aCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gV3JpdGVcblxuICB3cml0ZShyZXF1ZXN0OiB7IGRhdGE6IFJsanNvbiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dyaXRlKHJlcXVlc3QpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFRhYmxlIG1hbmFnZW1lbnRcbiAgYXN5bmMgdGFibGVFeGlzdHModGFibGVLZXk6IFRhYmxlS2V5KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLl9tZW1bdGFibGVLZXldIGFzIFRhYmxlVHlwZTtcbiAgICByZXR1cm4gdGFibGUgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICBjcmVhdGVPckV4dGVuZFRhYmxlKHJlcXVlc3Q6IHsgdGFibGVDZmc6IFRhYmxlQ2ZnIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlT3JFeHRlbmRUYWJsZShyZXF1ZXN0KTtcbiAgfVxuXG4gIGFzeW5jIHRhYmxlQ2ZncygpOiBQcm9taXNlPFJsanNvbj4ge1xuICAgIGNvbnN0IHRhYmxlcyA9IHRoaXMuX21lbS50YWJsZUNmZ3MuX2RhdGEgYXMgVGFibGVDZmdbXTtcblxuICAgIC8vIFRha2UgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGVhY2ggdHlwZSBrZXlcbiAgICBjb25zdCBuZXdlc3RWZXJzaW9uOiBSZWNvcmQ8VGFibGVLZXksIFRhYmxlQ2ZnPiA9IHt9O1xuICAgIGZvciAobGV0IGkgPSB0YWJsZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IHRhYmxlID0gdGFibGVzW2ldO1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBuZXdlc3RWZXJzaW9uW3RhYmxlLmtleV07XG4gICAgICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgICAgIG5ld2VzdFZlcnNpb25bdGFibGUua2V5XSA9IHRhYmxlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdERhdGEgPSBPYmplY3QudmFsdWVzKG5ld2VzdFZlcnNpb24pLnJldmVyc2UoKTtcblxuICAgIHJldHVybiBoaXAoe1xuICAgICAgdGFibGVDZmdzOiB7XG4gICAgICAgIF9kYXRhOiByZXN1bHREYXRhLFxuICAgICAgfSxcbiAgICB9IGFzIFJsanNvbik7XG4gIH1cblxuICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4gIC8vIFByaXZhdGVcbiAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuXG4gIHByaXZhdGUgX2lvVG9vbHMhOiBJb1Rvb2xzO1xuXG4gIHByaXZhdGUgX2lzUmVhZHkgPSBuZXcgSXNSZWFkeSgpO1xuXG4gIHByaXZhdGUgX21lbTogUmxqc29uID0gaGlwKHt9IGFzIFJsanNvbik7XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX2luaXQoKSB7XG4gICAgdGhpcy5faW9Ub29scyA9IG5ldyBJb1Rvb2xzKHRoaXMpO1xuICAgIHRoaXMuX2luaXRUYWJsZUNmZ3MoKTtcbiAgICBhd2FpdCB0aGlzLl9pb1Rvb2xzLmluaXRSZXZpc2lvbnNUYWJsZSgpO1xuXG4gICAgdGhpcy5faXNSZWFkeS5yZXNvbHZlKCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBfaW5pdFRhYmxlQ2ZncyA9ICgpID0+IHtcbiAgICBjb25zdCB0YWJsZUNmZyA9IElvVG9vbHMudGFibGVDZmdzVGFibGVDZmc7XG5cbiAgICB0aGlzLl9tZW0udGFibGVDZmdzID0gaGlwKHtcbiAgICAgIF9kYXRhOiBbdGFibGVDZmddLFxuICAgICAgX3RhYmxlQ2ZnOiB0YWJsZUNmZy5faGFzaCBhcyBzdHJpbmcsXG4gICAgfSk7XG5cbiAgICBoaXAodGhpcy5fbWVtLCB7IHVwZGF0ZUV4aXN0aW5nSGFzaGVzOiB0cnVlLCB0aHJvd09uV3JvbmdIYXNoZXM6IGZhbHNlIH0pO1xuICB9O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIGFzeW5jIF9jcmVhdGVPckV4dGVuZFRhYmxlKHJlcXVlc3Q6IHtcbiAgICB0YWJsZUNmZzogVGFibGVDZmc7XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgdGFibGUgY29uZmlnIGlzIGNvbXBhdGlibGVcbiAgICAvLyB3aXRoIGFuIHBvdGVudGlhbCBleGlzdGluZyB0YWJsZVxuICAgIGNvbnN0IHRhYmxlQ2ZnID0gcmVxdWVzdC50YWJsZUNmZztcbiAgICBhd2FpdCB0aGlzLl9pb1Rvb2xzLnRocm93V2hlblRhYmxlSXNOb3RDb21wYXRpYmxlKHRhYmxlQ2ZnKTtcblxuICAgIGNvbnN0IHsga2V5IH0gPSB0YWJsZUNmZztcblxuICAgIC8vIFJlY3JlYXRlIGhhc2hlcyBpbiB0aGUgY2FzZSB0aGUgZXhpc3RpbmcgaGFzaGVzIGFyZSB3cm9uZ1xuICAgIGNvbnN0IG5ld0NvbmZpZyA9IGhzaCh0YWJsZUNmZyk7XG5cbiAgICAvLyBGaW5kIGFuIGV4aXN0aW5nIHRhYmxlIGNvbmZpZyB3aXRoIHRoZSBzYW1lIGhhc2hcbiAgICBjb25zdCBleGlzdGluZ0NvbmZpZyA9IGF3YWl0IHRoaXMuX2lvVG9vbHMudGFibGVDZmdPck51bGwoa2V5KTtcblxuICAgIC8vIFdyaXRlIHRoZSBuZXcgY29uZmlnIGludG8gdGhlIGRhdGFiYXNlXG4gICAgaWYgKCFleGlzdGluZ0NvbmZpZykge1xuICAgICAgdGhpcy5fY3JlYXRlVGFibGUobmV3Q29uZmlnLCBrZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9leHRlbmRUYWJsZShleGlzdGluZ0NvbmZpZywgbmV3Q29uZmlnKTtcbiAgICB9XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBfY3JlYXRlVGFibGUobmV3Q29uZmlnOiBUYWJsZUNmZywgdGFibGVLZXk6IFRhYmxlS2V5KSB7XG4gICAgLy8gV3JpdGUgdGhlIHRhYmxlIGNvbmZpZyBpbnRvIHRoZSBkYXRhYmFzZVxuICAgIG5ld0NvbmZpZyA9IGhzaChuZXdDb25maWcpO1xuICAgIHRoaXMuX21lbS50YWJsZUNmZ3MuX2RhdGEucHVzaChuZXdDb25maWcpO1xuXG4gICAgLy8gQ3JlYXRlIGEgdGFibGUgYW5kIHdyaXRlIGl0IGludG8gdGhlIGRhdGFiYXNlXG4gICAgY29uc3QgdGFibGU6IFRhYmxlVHlwZSA9IHtcbiAgICAgIF9kYXRhOiBbXSxcbiAgICAgIF90YWJsZUNmZzogbmV3Q29uZmlnLl9oYXNoIGFzIHN0cmluZyxcbiAgICB9O1xuXG4gICAgdGhpcy5fbWVtW3RhYmxlS2V5XSA/Pz0gaGlwKHRhYmxlKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF9leHRlbmRUYWJsZShleGlzdGluZ0NvbmZpZzogVGFibGVDZmcsIG5ld0NvbmZpZzogVGFibGVDZmcpIHtcbiAgICAvLyBObyBjb2x1bW5zIGFkZGVkPyBSZXR1cm4uXG4gICAgaWYgKGV4aXN0aW5nQ29uZmlnLmNvbHVtbnMubGVuZ3RoID09PSBuZXdDb25maWcuY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBXcml0ZSB0aGUgbmV3IHRhYmxlIGNvbmZpZyBpbnRvIHRoZSBkYXRhYmFzZVxuICAgIG5ld0NvbmZpZyA9IGhzaChuZXdDb25maWcpO1xuICAgIHRoaXMuX21lbS50YWJsZUNmZ3MuX2RhdGEucHVzaChuZXdDb25maWcpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBjb25maWcgb2YgdGhlIGV4aXN0aW5nIHRhYmxlXG4gICAgY29uc3QgdGFibGUgPSB0aGlzLl9tZW1bbmV3Q29uZmlnLmtleV0gYXMgVGFibGVUeXBlO1xuICAgIHRhYmxlLl90YWJsZUNmZyA9IG5ld0NvbmZpZy5faGFzaCBhcyBzdHJpbmc7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cblxuICBwcml2YXRlIGFzeW5jIF9kdW1wKCk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgcmV0dXJuIGNvcHkodGhpcy5fbWVtKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIGFzeW5jIF9kdW1wVGFibGUocmVxdWVzdDogeyB0YWJsZTogc3RyaW5nIH0pOiBQcm9taXNlPFJsanNvbj4ge1xuICAgIGF3YWl0IHRoaXMuX2lvVG9vbHMudGhyb3dXaGVuVGFibGVEb2VzTm90RXhpc3QocmVxdWVzdC50YWJsZSk7XG5cbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuX21lbVtyZXF1ZXN0LnRhYmxlXSBhcyBUYWJsZVR5cGU7XG5cbiAgICByZXR1cm4ge1xuICAgICAgW3JlcXVlc3QudGFibGVdOiBjb3B5KHRhYmxlKSxcbiAgICB9O1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX3dyaXRlKHJlcXVlc3Q6IHsgZGF0YTogUmxqc29uIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhZGRlZERhdGEgPSBoc2gocmVxdWVzdC5kYXRhKTtcbiAgICBjb25zdCB0YWJsZXMgPSBPYmplY3Qua2V5cyhhZGRlZERhdGEpO1xuXG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZXNEb05vdEV4aXN0KHJlcXVlc3QuZGF0YSk7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZURhdGFEb2VzTm90TWF0Y2hDZmcocmVxdWVzdC5kYXRhKTtcblxuICAgIGZvciAoY29uc3QgdGFibGUgb2YgdGFibGVzKSB7XG4gICAgICBpZiAodGFibGUuc3RhcnRzV2l0aCgnXycpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvbGRUYWJsZSA9IHRoaXMuX21lbVt0YWJsZV0gYXMgVGFibGVUeXBlO1xuICAgICAgY29uc3QgbmV3VGFibGUgPSBhZGRlZERhdGFbdGFibGVdIGFzIFRhYmxlVHlwZTtcblxuICAgICAgLy8gVGFibGUgZXhpc3RzLiBNZXJnZSBkYXRhXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbmV3VGFibGUuX2RhdGEpIHtcbiAgICAgICAgY29uc3QgaGFzaCA9IGl0ZW0uX2hhc2g7XG4gICAgICAgIGNvbnN0IGV4aXN0cyA9IG9sZFRhYmxlLl9kYXRhLmZpbmQoKGkpID0+IGkuX2hhc2ggPT09IGhhc2gpO1xuICAgICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICAgIG9sZFRhYmxlLl9kYXRhLnB1c2goaXRlbSBhcyBhbnkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVjYWxjIG1haW4gaGFzaGVzXG4gICAgKHRoaXMuX21lbSBhcyBhbnkpLl9oYXNoID0gJyc7XG4gICAgaGlwKHRoaXMuX21lbSwgeyB1cGRhdGVFeGlzdGluZ0hhc2hlczogZmFsc2UsIHRocm93T25Xcm9uZ0hhc2hlczogZmFsc2UgfSk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBhc3luYyBfcmVhZFJvd3MocmVxdWVzdDoge1xuICAgIHRhYmxlOiBzdHJpbmc7XG4gICAgd2hlcmU6IHsgW2NvbHVtbjogc3RyaW5nXTogSnNvblZhbHVlIH07XG4gIH0pOiBQcm9taXNlPFJsanNvbj4ge1xuICAgIGF3YWl0IHRoaXMuX2lvVG9vbHMudGhyb3dXaGVuVGFibGVEb2VzTm90RXhpc3QocmVxdWVzdC50YWJsZSk7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5Db2x1bW5Eb2VzTm90RXhpc3QoXG4gICAgICByZXF1ZXN0LnRhYmxlLFxuICAgICAgT2JqZWN0LmtleXMocmVxdWVzdC53aGVyZSksXG4gICAgKTtcblxuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5fbWVtW3JlcXVlc3QudGFibGVdIGFzIFRhYmxlVHlwZTtcblxuICAgIGNvbnN0IHJlc3VsdDogUmxqc29uID0ge1xuICAgICAgW3JlcXVlc3QudGFibGVdOiB7XG4gICAgICAgIF9kYXRhOiB0YWJsZS5fZGF0YS5maWx0ZXIoKHJvdykgPT4ge1xuICAgICAgICAgIGZvciAoY29uc3QgY29sdW1uIGluIHJlcXVlc3Qud2hlcmUpIHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSByb3dbY29sdW1uXTtcbiAgICAgICAgICAgIGNvbnN0IGIgPSByZXF1ZXN0LndoZXJlW2NvbHVtbl07XG4gICAgICAgICAgICBpZiAoIWVxdWFscyhhLCBiKSkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfSBhcyBhbnk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iLCIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuaW1wb3J0IHsgSW9NZW0gfSBmcm9tICcuL2lvLW1lbS50cyc7XG5pbXBvcnQgeyBJbyB9IGZyb20gJy4vaW8udHMnO1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuLyoqXG4gKiBJbyBpbXBsZW1lbnRhdGlvbiBuZWVkIHRvIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSB0byBiZSB1c2VkIGluXG4gKiBjb25mb3JtYW5jZSB0ZXN0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJb1Rlc3RTZXR1cCB7XG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgaW8gaW1wbGVtZW50YXRpb24uXG4gICAqIEByZXR1cm5zIFRoZSBpbyBpbXBsZW1lbnRhdGlvbi5cbiAgICovXG4gIGluaXQ6ICgpID0+IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFRlYXJzIGRvd24gdGhlIGlvIGltcGxlbWVudGF0aW9uLlxuICAgKiBAcmV0dXJucyBUaGUgaW8gaW1wbGVtZW50YXRpb24uXG4gICAqL1xuICB0ZWFyRG93bjogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVGhlIGlvIGltcGxlbWVudGF0aW9uIHRvIGJlIHVzZWQgaW4gdGhlIGNvbmZvcm1hbmNlIHRlc3RzLlxuICAgKi9cbiAgaW86IElvO1xufVxuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuLy8gRXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSW9UZXN0U2V0dXAgaW50ZXJmYWNlXG5leHBvcnQgY29uc3QgZXhhbXBsZVRlc3RTZXR1cCA9ICgpOiBJb1Rlc3RTZXR1cCA9PiB7XG4gIHJldHVybiB7XG4gICAgaW86IG5ldyBJb01lbSgpLFxuICAgIGluaXQ6IGFzeW5jICgpID0+IHtcbiAgICAgIC8vIEluaXRpYWxpemUgdGhlIGlvIGltcGxlbWVudGF0aW9uXG4gICAgfSxcbiAgICB0ZWFyRG93bjogYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gVGVhciBkb3duIHRoZSBpbyBpbXBsZW1lbnRhdGlvblxuICAgIH0sXG4gIH07XG59O1xuIiwiLy8gQGxpY2Vuc2Vcbi8vIENvcHlyaWdodCAoYykgMjAyNSBSbGpzb25cbi8vXG4vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0ZXJtcyB0aGF0IGNhbiBiZVxuLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHBhY2thZ2UuXG5cbmltcG9ydCB7IEpzb25WYWx1ZSB9IGZyb20gJ0BybGpzb24vanNvbic7XG5pbXBvcnQgeyBSbGpzb24sIFRhYmxlQ2ZnLCBUYWJsZUtleSB9IGZyb20gJ0BybGpzb24vcmxqc29uJztcblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbmV4cG9ydCBpbnRlcmZhY2UgSW8ge1xuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gR2VuZXJhbFxuXG4gIC8qKiBTdGFydHMgdGhlIGluaXRpYWxpemF0aW9uICovXG4gIGluaXQoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKiogQ2xvc2VzIHRoZSBpbyAqL1xuICBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKiBBIHByb21pc2UgcmVzb2x2aW5nIG9uY2UgdGhlIElvIGludGVyZmFjZSBpcyByZWFkeVxuICAgKlxuICAgKiDwn5KhIFVzZSBAcmxqc29uL2lzLXJlYWR5XG4gICAqL1xuICBpc1JlYWR5KCk6IFByb21pc2U8dm9pZD47XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIER1bXBcblxuICAvKiogUmV0dXJucyB0aGUgY29tcGxldGUgZGIgY29udGVudCBhcyBSbGpzb24gKi9cbiAgZHVtcCgpOiBQcm9taXNlPFJsanNvbj47XG5cbiAgLyoqIFJldHVybnMgdGhlIGR1bXAgb2YgYSBjb21wbGV0ZSB0YWJsZSAqL1xuICBkdW1wVGFibGUocmVxdWVzdDogeyB0YWJsZTogc3RyaW5nIH0pOiBQcm9taXNlPFJsanNvbj47XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFRhYmxlc1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRhYmxlIGV4aXN0c1xuICAgKi9cbiAgdGFibGVFeGlzdHModGFibGVLZXk6IFRhYmxlS2V5KTogUHJvbWlzZTxib29sZWFuPjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHRhYmxlIHdpdGggYSBnaXZlbiBjb25maWcuXG4gICAqIElmIHRoZSB0YWJsZSBhbHJlYWR5IGV4aXN0cywgbmV3IGNvbHVtbnMgYXJlIGFkZGVkIHRvIHRoZSBleGlzdGluZyB0YWJsZS5cbiAgICogSWYgdGhlIHRhYmxlIGRvZXMgbm90IGV4aXN0LCBpdCBpcyBjcmVhdGVkIHdpdGggdGhlIGdpdmVuIGNvbmZpZy5cbiAgICogSWYgdGhlIHRhYmxlIGV4aXN0cyBhbmQgY29sdW1ucyBhcmUgcmVtb3ZlZCwgYW4gZXJyb3IgaXMgdGhyb3duLlxuICAgKiBJZiB0aGUgdGFibGUgZXhpc3RzIGFuZCB0aGUgY29sdW1uIHR5cGUgaXMgY2hhbmdlZCwgYW4gZXJyb3IgaXMgdGhyb3duLlxuICAgKi9cbiAgY3JlYXRlT3JFeHRlbmRUYWJsZShyZXF1ZXN0OiB7IHRhYmxlQ2ZnOiBUYWJsZUNmZyB9KTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogUmV0dXJucyBhIGpzb24gc3RydWN0dXJlIHJldHVybmluZyBjdXJyZW50IHRhYmxlIGNvbmZpZ3VyYXRpb25zXG4gICAqL1xuICB0YWJsZUNmZ3MoKTogUHJvbWlzZTxSbGpzb24+O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBXcml0ZVxuXG4gIC8qKiBXcml0ZXMgUmxqc29uIGRhdGEgaW50byB0aGUgZGF0YWJhc2UgKi9cbiAgd3JpdGUocmVxdWVzdDogeyBkYXRhOiBSbGpzb24gfSk6IFByb21pc2U8dm9pZD47XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFJlYWQgcm93c1xuXG4gIC8qKiBRdWVyaWVzIGEgbGlzdCBvZiByb3dzICovXG4gIHJlYWRSb3dzKHJlcXVlc3Q6IHtcbiAgICB0YWJsZTogc3RyaW5nO1xuICAgIHdoZXJlOiB7IFtjb2x1bW46IHN0cmluZ106IEpzb25WYWx1ZSB8IG51bGwgfTtcbiAgfSk6IFByb21pc2U8Umxqc29uPjtcblxuICAvKiogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIGdpdmVuIHRhYmxlICovXG4gIHJvd0NvdW50KHRhYmxlOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj47XG59XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5leHBvcnQgY29uc3QgZXhhbXBsZUlvID1cbiAgJ0NoZWNrb3V0IEBybGpzb24vaW8tbWVtIGZvciBhbiBleGFtcGxlIGltcGxlbWVudGF0aW9uJztcbiIsIi8vIEBsaWNlbnNlXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXG4vL1xuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGVybXMgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxuXG5pbXBvcnQgeyBKc29uIH0gZnJvbSAnQHJsanNvbi9qc29uJztcbmltcG9ydCB7XG4gIEJ1ZmZldCxcbiAgQ2FrZSxcbiAgaXRlcmF0ZVRhYmxlc1N5bmMsXG4gIExheWVyLFxuICBSZWYsXG4gIFJsanNvbixcbiAgVGFibGVLZXksXG59IGZyb20gJ0BybGpzb24vcmxqc29uJztcblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbi8qKlxuICogRGVzY3JpYmVzIGEgcm93IHRoYXQgcmVmZXJlbmNlcyBhIGNoaWxkIHRhYmxlIHJvd1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcmVudFJlZiB7XG4gIC8qKlxuICAgKiBUaGUgcGFyZW50IHRhYmxlIHRoYXQgcmVmZXJlbmNlcyB0aGUgY2hpbGQgdGFibGVcbiAgICovXG4gIFtwYXJlbnRUYWJsZTogVGFibGVLZXldOiB7XG4gICAgLyoqXG4gICAgICogVGhlIHBhcmVudCByb3cgdGhhdCByZWZlcmVuY2VzIHRoZSBjaGlsZCByb3dcbiAgICAgKi9cbiAgICBbcGFyZW50Um93OiBSZWZdOiB7XG4gICAgICAvKipcbiAgICAgICAqIERldGFpbHMgYWJvdXQgdGhlIHJlZmVyZW5jZSwgZS5nLiBhbiBhcnJheSBpbmRleCBldGMuXG4gICAgICAgKi9cbiAgICAgIGRldGFpbHM/OiBKc29uO1xuICAgIH07XG4gIH07XG59XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4vKipcbiAqIERlc2NyaWJlcyB0aGUgcGFyZW50IHRhYmxlIHJvd3MgcmVmZXJlbmNpbmcgYSBjaGlsZCB0YWJsZSByb3dcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXZlcnNlUmVmcyB7XG4gIC8qKlxuICAgKiBUaGUgY2hpbGQgdGFibGUgd2UgbmVlZCB0aGUgcmVmZXJlbmNpbmcgcm93cyBmb3JcbiAgICovXG4gIFtjaGlsZFRhYmxlOiBUYWJsZUtleV06IHtcbiAgICAvKipcbiAgICAgKiBUaGUgcm93IGhhc2h3ZSBuZWVkIHRoZSByZWZlcmVuY2luZyByb3dzIGZvclxuICAgICAqL1xuICAgIFtjaGlsZFJvdzogUmVmXTogUGFyZW50UmVmO1xuICB9O1xufVxuXG4vKiB2OCBpZ25vcmUgc3RhcnQgKi9cblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgcmV2ZXJzZSByZWZlcmVuY2VzIGZvciBhIGdpdmVuIHJsanNvbiBvYmplY3RcbiAqL1xuZXhwb3J0IGNvbnN0IGNhbGNSZXZlcnNlUmVmcyA9IChybGpzb246IFJsanNvbik6IFJldmVyc2VSZWZzID0+IHtcbiAgY29uc3QgcmVzdWx0OiBSZXZlcnNlUmVmcyA9IHt9O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gUHJlcGFyZSBkYXRhIHN0cnVjdHVyZVxuICBpdGVyYXRlVGFibGVzU3luYyhybGpzb24sIChjaGlsZFRhYmxlS2V5LCB0YWJsZSkgPT4ge1xuICAgIGNvbnN0IGNoaWxkVGFibGU6IHsgW2NoaWxkUm93SGFzaDogc3RyaW5nXTogUGFyZW50UmVmIH0gPSB7fTtcbiAgICByZXN1bHRbY2hpbGRUYWJsZUtleV0gPSBjaGlsZFRhYmxlO1xuICAgIGZvciAoY29uc3QgY2hpbGRSb3cgb2YgdGFibGUuX2RhdGEpIHtcbiAgICAgIGNoaWxkVGFibGVbY2hpbGRSb3cuX2hhc2hdID0ge307XG4gICAgfVxuICB9KTtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIEdlbmVyYXRlIHJldmVyc2UgcmVmZXJlbmNlc1xuICBpdGVyYXRlVGFibGVzU3luYyhybGpzb24sIChwYXJlbnRUYWJsZUtleSwgcGFyZW50VGFibGUpID0+IHtcbiAgICAvLyBJdGVyYXRlIGFsbCByb3dzIG9mIGVhY2ggdGFibGVcbiAgICBmb3IgKGNvbnN0IHBhcmVudFRhYmxlUm93IG9mIHBhcmVudFRhYmxlLl9kYXRhKSB7XG4gICAgICAvLyBGaW5kIG91dCB3aGUgb3RoZXIgdGFibGVzICYgcm93cyBhcmUgcmVmZXJlbmNlZCBieSB0aGlzIHJvd1xuICAgICAgLy8gV3JpdGUgdGhlc2UgaW5mb3JtYXRpb24gaW50dG8gcmVzdWx0XG4gICAgICBzd2l0Y2ggKHBhcmVudFRhYmxlLl90eXBlKSB7XG4gICAgICAgIGNhc2UgJ2luZ3JlZGllbnRzJzpcbiAgICAgICAgICBfd3JpdGVJbmdyZWRpZW50UmVmcyhwYXJlbnRUYWJsZUtleSwgcGFyZW50VGFibGVSb3csIHJlc3VsdCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnbGF5ZXJzJzoge1xuICAgICAgICAgIF93cml0ZUxheWVyUmVmcyhwYXJlbnRUYWJsZUtleSwgcGFyZW50VGFibGVSb3csIHJlc3VsdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdzbGljZUlkcyc6IHtcbiAgICAgICAgICAvLyBTbGljZSBpZHMgZG8gbm90IHJlZmVyZW5jZSBvdGhlciB0YWJsZXNcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ2Nha2VzJzoge1xuICAgICAgICAgIF93cml0ZUNha2VSZWZzKHBhcmVudFRhYmxlS2V5LCBwYXJlbnRUYWJsZVJvdywgcmVzdWx0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ2J1ZmZldHMnOiB7XG4gICAgICAgICAgX3dyaXRlQnVmZmV0UmVmcyhwYXJlbnRUYWJsZUtleSwgcGFyZW50VGFibGVSb3csIHJlc3VsdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKiB2OCBpZ25vcmUgZW5kICovXG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5jb25zdCBfd3JpdGVJbmdyZWRpZW50UmVmcyA9IChcbiAgcGFyZW50VGFibGVOYW1lOiBUYWJsZUtleSxcbiAgcGFyZW50Um93OiBKc29uLFxuICByZXN1bHQ6IFJldmVyc2VSZWZzLFxuKSA9PiB7XG4gIGNvbnN0IHBhcmVudFJvd0hhc2ggPSBwYXJlbnRSb3cuX2hhc2ggYXMgc3RyaW5nO1xuXG4gIGZvciAoY29uc3QgcGFyZW50Q29sdW1uTmFtZSBpbiBwYXJlbnRSb3cpIHtcbiAgICBpZiAocGFyZW50Q29sdW1uTmFtZS5zdGFydHNXaXRoKCdfJykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghcGFyZW50Q29sdW1uTmFtZS5lbmRzV2l0aCgnUmVmJykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkVGFibGVOYW1lID0gcGFyZW50Q29sdW1uTmFtZS5zbGljZSgwLCAtMyk7XG4gICAgY29uc3QgY2hpbGRSb3dIYXNoID0gcGFyZW50Um93W3BhcmVudENvbHVtbk5hbWVdIGFzIHN0cmluZztcblxuICAgIF93cml0ZShcbiAgICAgIHJlc3VsdCxcbiAgICAgIGNoaWxkVGFibGVOYW1lLFxuICAgICAgY2hpbGRSb3dIYXNoLFxuICAgICAgcGFyZW50VGFibGVOYW1lLFxuICAgICAgcGFyZW50Um93SGFzaCxcbiAgICApO1xuICB9XG59O1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuY29uc3QgX3dyaXRlTGF5ZXJSZWZzID0gKFxuICBwYXJlbnRUYWJsZU5hbWU6IFRhYmxlS2V5LFxuICBwYXJlbnRSb3c6IExheWVyLFxuICByZXN1bHQ6IFJldmVyc2VSZWZzLFxuKSA9PiB7XG4gIGNvbnN0IGNoaWxkVGFibGVOYW1lID0gcGFyZW50Um93LmluZ3JlZGllbnRzVGFibGU7XG4gIGNvbnN0IHBhcmVudFJvd0hhc2ggPSBwYXJlbnRSb3cuX2hhc2ggYXMgc3RyaW5nO1xuXG4gIGZvciAoY29uc3Qgc2xpY2VJZCBpbiBwYXJlbnRSb3cuYXNzaWduKSB7XG4gICAgaWYgKHNsaWNlSWQuc3RhcnRzV2l0aCgnXycpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBzbGljZUhhc2ggPSBwYXJlbnRSb3cuYXNzaWduW3NsaWNlSWRdIGFzIHN0cmluZztcblxuICAgIF93cml0ZShyZXN1bHQsIGNoaWxkVGFibGVOYW1lLCBzbGljZUhhc2gsIHBhcmVudFRhYmxlTmFtZSwgcGFyZW50Um93SGFzaCk7XG4gIH1cbn07XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5jb25zdCBfd3JpdGVDYWtlUmVmcyA9IChcbiAgcGFyZW50VGFibGVOYW1lOiBUYWJsZUtleSxcbiAgcGFyZW50Um93OiBDYWtlLFxuICByZXN1bHQ6IFJldmVyc2VSZWZzLFxuKSA9PiB7XG4gIGNvbnN0IHBhcmVudFJvd0hhc2ggPSBwYXJlbnRSb3cuX2hhc2ggYXMgc3RyaW5nO1xuXG4gIGZvciAoY29uc3QgbGF5ZXIgaW4gcGFyZW50Um93LmxheWVycykge1xuICAgIGNvbnN0IGNoaWxkVGFibGVOYW1lID0gcGFyZW50Um93LmxheWVyc1RhYmxlO1xuICAgIGNvbnN0IGNoaWxkUm93SGFzaCA9IHBhcmVudFJvdy5sYXllcnNbbGF5ZXJdIGFzIHN0cmluZztcbiAgICBfd3JpdGUoXG4gICAgICByZXN1bHQsXG4gICAgICBjaGlsZFRhYmxlTmFtZSxcbiAgICAgIGNoaWxkUm93SGFzaCxcbiAgICAgIHBhcmVudFRhYmxlTmFtZSxcbiAgICAgIHBhcmVudFJvd0hhc2gsXG4gICAgKTtcbiAgfVxufTtcblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbmNvbnN0IF93cml0ZUJ1ZmZldFJlZnMgPSAoXG4gIHBhcmVudFRhYmxlTmFtZTogVGFibGVLZXksXG4gIHBhcmVudFJvdzogQnVmZmV0LFxuICByZXN1bHQ6IFJldmVyc2VSZWZzLFxuKSA9PiB7XG4gIGNvbnN0IHBhcmVudFJvd0hhc2ggPSBwYXJlbnRSb3cuX2hhc2ggYXMgc3RyaW5nO1xuXG4gIGZvciAoY29uc3QgaXRlbSBvZiBwYXJlbnRSb3cuaXRlbXMpIHtcbiAgICBjb25zdCBjaGlsZFRhYmxlTmFtZSA9IGl0ZW0udGFibGU7XG4gICAgY29uc3QgY2hpbGRSb3dIYXNoID0gaXRlbS5yZWY7XG4gICAgX3dyaXRlKFxuICAgICAgcmVzdWx0LFxuICAgICAgY2hpbGRUYWJsZU5hbWUsXG4gICAgICBjaGlsZFJvd0hhc2gsXG4gICAgICBwYXJlbnRUYWJsZU5hbWUsXG4gICAgICBwYXJlbnRSb3dIYXNoLFxuICAgICk7XG4gIH1cbn07XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5jb25zdCBfd3JpdGUgPSAoXG4gIHJlc3VsdDogUmV2ZXJzZVJlZnMsXG4gIGNoaWxkVGFibGVOYW1lOiBzdHJpbmcsXG4gIGNoaWxkUm93SGFzaDogc3RyaW5nLFxuICBwYXJlbnRUYWJsZU5hbWU6IHN0cmluZyxcbiAgcGFyZW50Um93SGFzaDogc3RyaW5nLFxuKSA9PiB7XG4gIGNvbnN0IHJlZmVyZW5jZXNGb3JDaGlsZFRhYmxlID0gKHJlc3VsdFtjaGlsZFRhYmxlTmFtZV0gPz89IHt9KTtcbiAgY29uc3QgcmVmZXJlbmNlc0ZvckNoaWxkVGFibGVSb3cgPSAocmVmZXJlbmNlc0ZvckNoaWxkVGFibGVbY2hpbGRSb3dIYXNoXSA/Pz1cbiAgICB7fSk7XG5cbiAgcmVmZXJlbmNlc0ZvckNoaWxkVGFibGVSb3dbcGFyZW50VGFibGVOYW1lXSA/Pz0ge307XG4gIHJlZmVyZW5jZXNGb3JDaGlsZFRhYmxlUm93W3BhcmVudFRhYmxlTmFtZV1bcGFyZW50Um93SGFzaF0gPz89IHt9O1xufTtcbiJdLCJuYW1lcyI6WyJlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFzQk8sTUFBTSxXQUFOLE1BQU0sU0FBUTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLbkIsWUFBNEIsSUFBUTtBQWlDcEM7QUFBQTtBQUFBO0FBQUEsOENBQXFCLFlBQVk7QUFDL0IsWUFBTSxXQUFxQjtBQUFBLFFBQ3pCLEtBQUs7QUFBQSxRQUNMLE1BQU07QUFBQSxRQUNOLFFBQVE7QUFBQSxRQUNSLFFBQVE7QUFBQSxRQUNSLFVBQVU7QUFBQSxRQUVWLFNBQVM7QUFBQSxVQUNQLEVBQUUsS0FBSyxTQUFTLE1BQU0sU0FBUztBQUFBLFVBQy9CLEVBQUUsS0FBSyxTQUFTLE1BQU0sU0FBUztBQUFBLFVBQy9CLEVBQUUsS0FBSyxlQUFlLE1BQU0sU0FBUztBQUFBLFVBQ3JDLEVBQUUsS0FBSyxhQUFhLE1BQU0sU0FBUztBQUFBLFVBQ25DLEVBQUUsS0FBSyxhQUFhLE1BQU0sU0FBUztBQUFBLFVBQ25DLEVBQUUsS0FBSyxNQUFNLE1BQU0sU0FBUztBQUFBLFFBQUE7QUFBQSxNQUVoQztBQUVBLFlBQU0sS0FBSyxHQUFHLG9CQUFvQixFQUFFLFVBQVU7QUFBQSxJQUNoRDtBQXBENEIsU0FBQSxLQUFBO0FBQUEsRUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSzVCLFdBQVcsb0JBQW9CO0FBQzdCLFVBQU0sV0FBVyxJQUFjO0FBQUEsTUFDN0IsT0FBTztBQUFBLE1BQ1AsS0FBSztBQUFBLE1BQ0wsTUFBTTtBQUFBLE1BQ04sUUFBUTtBQUFBLE1BQ1IsUUFBUTtBQUFBLE1BQ1IsVUFBVTtBQUFBLE1BQ1YsVUFBVTtBQUFBLE1BRVYsU0FBUztBQUFBLFFBQ1AsRUFBRSxLQUFLLFNBQVMsTUFBTSxTQUFTO0FBQUEsUUFDL0IsRUFB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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rljson/io",
3
- "version": "0.0.28",
3
+ "version": "0.0.30",
4
4
  "packageManager": "pnpm@10.9.0",
5
5
  "description": "Low level interface for reading and writing RLJSON data",
6
6
  "homepage": "https://github.com/rljson/io",
@@ -29,24 +29,24 @@
29
29
  "updateGoldens": "cross-env UPDATE_GOLDENS=true pnpm test"
30
30
  },
31
31
  "devDependencies": {
32
- "@types/node": "^22.15.3",
33
- "@typescript-eslint/eslint-plugin": "^8.31.1",
34
- "@typescript-eslint/parser": "^8.31.1",
35
- "@vitest/coverage-v8": "^3.1.2",
32
+ "@types/node": "^22.15.17",
33
+ "@typescript-eslint/eslint-plugin": "^8.32.0",
34
+ "@typescript-eslint/parser": "^8.32.0",
35
+ "@vitest/coverage-v8": "^3.1.3",
36
36
  "cross-env": "^7.0.3",
37
- "eslint": "^9.25.1",
37
+ "eslint": "^9.26.0",
38
38
  "eslint-plugin-jsdoc": "^50.6.11",
39
39
  "eslint-plugin-tsdoc": "^0.4.0",
40
- "globals": "^16.0.0",
40
+ "globals": "^16.1.0",
41
41
  "jsdoc": "^4.0.4",
42
42
  "read-pkg": "^9.0.1",
43
43
  "typescript": "~5.8.3",
44
- "typescript-eslint": "^8.31.1",
45
- "vite": "^6.3.4",
46
- "vite-node": "^3.1.2",
44
+ "typescript-eslint": "^8.32.0",
45
+ "vite": "^6.3.5",
46
+ "vite-node": "^3.1.3",
47
47
  "vite-plugin-dts": "^4.5.3",
48
48
  "vite-tsconfig-paths": "^5.1.4",
49
- "vitest": "^3.1.2",
49
+ "vitest": "^3.1.3",
50
50
  "vitest-dom": "^0.1.1"
51
51
  },
52
52
  "pnpm": {