@rljson/io 0.0.23 → 0.0.24

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-mem.d.ts CHANGED
@@ -1,11 +1,12 @@
1
1
  import { JsonValue } from '@rljson/json';
2
- import { Rljson, TableCfg } from '@rljson/rljson';
2
+ import { Rljson, TableCfg, TableKey } from '@rljson/rljson';
3
3
  import { Io } from './io.ts';
4
4
  /**
5
5
  * In-Memory implementation of the Rljson Io interface.
6
6
  */
7
7
  export declare class IoMem implements Io {
8
8
  constructor();
9
+ init(): Promise<void>;
9
10
  static example: () => Promise<IoMem>;
10
11
  isReady(): Promise<void>;
11
12
  dump(): Promise<Rljson>;
@@ -22,6 +23,7 @@ export declare class IoMem implements Io {
22
23
  write(request: {
23
24
  data: Rljson;
24
25
  }): Promise<void>;
26
+ tableExists(tableKey: TableKey): Promise<boolean>;
25
27
  createOrExtendTable(request: {
26
28
  tableCfg: TableCfg;
27
29
  }): Promise<void>;
@@ -1,4 +1,4 @@
1
- import { TableCfg, TableKey } from '@rljson/rljson';
1
+ import { Rljson, TableCfg, TableKey } from '@rljson/rljson';
2
2
  import { Io } from './io.ts';
3
3
  /**
4
4
  * Provides utility functions for the Io interface.
@@ -11,18 +11,27 @@ export declare class IoTools {
11
11
  */
12
12
  constructor(io: Io);
13
13
  /**
14
- * Initializes the revisions table.
14
+ * Returns the table configuration of the tableCfgs table.
15
15
  */
16
- initRevisionsTable: () => Promise<void>;
16
+ static get tableCfgsTableCfg(): TableCfg;
17
17
  /**
18
- * Returns the table configuration of the tableCfgs table.
18
+ * Initializes the revisions table.
19
19
  */
20
- get tableCfgsTableCfg(): TableCfg;
20
+ initRevisionsTable: () => Promise<void>;
21
21
  /**
22
22
  * Example object for test purposes
23
23
  * @returns An instance of io tools
24
24
  */
25
25
  static example: () => Promise<IoTools>;
26
+ /**
27
+ * Throws if the table does not exist
28
+ */
29
+ throwWhenTableDoesNotExist(table: TableKey): Promise<void>;
30
+ /**
31
+ * Throws if any of the tables in rljson do not exist
32
+ * @param rljson - The Rljson object to check
33
+ */
34
+ throwWhenTablesDoNotExist(rljson: Rljson): Promise<void>;
26
35
  /**
27
36
  * Returns a list with all table names
28
37
  */
package/dist/io.d.ts CHANGED
@@ -1,6 +1,8 @@
1
1
  import { JsonValue } from '@rljson/json';
2
- import { Rljson, TableCfg } from '@rljson/rljson';
2
+ import { Rljson, TableCfg, TableKey } from '@rljson/rljson';
3
3
  export interface Io {
4
+ /** Starts the initialization */
5
+ init(): Promise<void>;
4
6
  /** A promise resolving once the Io interface is ready
5
7
  *
6
8
  * 💡 Use @rljson/is-ready
@@ -12,6 +14,10 @@ export interface Io {
12
14
  dumpTable(request: {
13
15
  table: string;
14
16
  }): Promise<Rljson>;
17
+ /**
18
+ * Returns true if the table exists
19
+ */
20
+ tableExists(tableKey: TableKey): Promise<boolean>;
15
21
  /**
16
22
  * Creates a table with a given config.
17
23
  * If the table already exists, new columns are added to the existing table.
@@ -34,7 +40,7 @@ export interface Io {
34
40
  readRows(request: {
35
41
  table: string;
36
42
  where: {
37
- [column: string]: JsonValue;
43
+ [column: string]: JsonValue | null;
38
44
  };
39
45
  }): Promise<Rljson>;
40
46
  /** Returns the number of rows in the given table */
package/dist/io.js CHANGED
@@ -3,8 +3,8 @@ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { en
3
3
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
4
  import { hip, hsh } from "@rljson/hash";
5
5
  import { IsReady } from "@rljson/is-ready";
6
- import { jsonValueTypes, copy, equals } from "@rljson/json";
7
- import { iterateTablesSync } from "@rljson/rljson";
6
+ import { copy, equals } from "@rljson/json";
7
+ import { iterateTables, throwOnInvalidTableCfg, iterateTablesSync } from "@rljson/rljson";
8
8
  // @license
9
9
  const _IoTools = class _IoTools {
10
10
  /**
@@ -24,6 +24,7 @@ const _IoTools = class _IoTools {
24
24
  isRoot: true,
25
25
  isShared: false,
26
26
  columns: [
27
+ { key: "_hash", type: "string" },
27
28
  { key: "table", type: "string" },
28
29
  { key: "predecessor", type: "string" },
29
30
  { key: "successor", type: "string" },
@@ -38,7 +39,7 @@ const _IoTools = class _IoTools {
38
39
  /**
39
40
  * Returns the table configuration of the tableCfgs table.
40
41
  */
41
- get tableCfgsTableCfg() {
42
+ static get tableCfgsTableCfg() {
42
43
  const tableCfg = hip({
43
44
  _hash: "",
44
45
  key: "tableCfgs",
@@ -47,6 +48,7 @@ const _IoTools = class _IoTools {
47
48
  isRoot: false,
48
49
  isShared: true,
49
50
  version: 1,
51
+ previous: "",
50
52
  columns: [
51
53
  { key: "_hash", type: "string" },
52
54
  { key: "key", type: "string" },
@@ -55,11 +57,40 @@ const _IoTools = class _IoTools {
55
57
  { key: "isRoot", type: "boolean" },
56
58
  { key: "isShared", type: "boolean" },
57
59
  { key: "version", type: "number" },
60
+ { key: "previous", type: "string" },
58
61
  { key: "columns", type: "jsonArray" }
59
62
  ]
60
63
  });
61
64
  return tableCfg;
62
65
  }
66
+ /**
67
+ * Throws if the table does not exist
68
+ */
69
+ async throwWhenTableDoesNotExist(table) {
70
+ const exists = await this.io.tableExists(table);
71
+ if (!exists) {
72
+ throw new Error(`Table "${table}" not found`);
73
+ }
74
+ }
75
+ /**
76
+ * Throws if any of the tables in rljson do not exist
77
+ * @param rljson - The Rljson object to check
78
+ */
79
+ async throwWhenTablesDoNotExist(rljson) {
80
+ try {
81
+ await iterateTables(rljson, async (tableKey) => {
82
+ const exists = await this.io.tableExists(tableKey);
83
+ if (!exists) {
84
+ throw new Error(`Table "${tableKey}" not found`);
85
+ }
86
+ });
87
+ } catch (e) {
88
+ const missingTables = e.map((e2) => e2.tableKey);
89
+ throw new Error(
90
+ `The following tables do not exist: ${missingTables.join(", ")}`
91
+ );
92
+ }
93
+ }
63
94
  /**
64
95
  * Returns a list with all table names
65
96
  */
@@ -102,13 +133,7 @@ const _IoTools = class _IoTools {
102
133
  */
103
134
  async throwWhenTableIsNotCompatible(update) {
104
135
  const prefix = `Invalid update of table able "${update.key}"`;
105
- for (const column of update.columns) {
106
- if (!jsonValueTypes.includes(column.type)) {
107
- throw new Error(
108
- `${prefix}: Column "${column.key}" has an unsupported type "${column.type}"`
109
- );
110
- }
111
- }
136
+ throwOnInvalidTableCfg(update);
112
137
  const existing = await this.tableCfgOrNull(update.key);
113
138
  if (existing) {
114
139
  if (existing.columns.length > update.columns.length) {
@@ -150,6 +175,8 @@ const _IoTools = class _IoTools {
150
175
  */
151
176
  __publicField(_IoTools, "example", async () => {
152
177
  const io = await IoMem.example();
178
+ await io.init();
179
+ await io.isReady();
153
180
  return new _IoTools(io);
154
181
  });
155
182
  let IoTools = _IoTools;
@@ -166,7 +193,7 @@ const _IoMem = class _IoMem {
166
193
  __publicField(this, "_mem", hip({}));
167
194
  // ...........................................................................
168
195
  __publicField(this, "_initTableCfgs", () => {
169
- const tableCfg = this._ioTools.tableCfgsTableCfg;
196
+ const tableCfg = IoTools.tableCfgsTableCfg;
170
197
  this._mem.tableCfgs = hip({
171
198
  _data: [tableCfg],
172
199
  _type: "ingredients",
@@ -174,7 +201,9 @@ const _IoMem = class _IoMem {
174
201
  });
175
202
  hip(this._mem, { updateExistingHashes: true, throwOnWrongHashes: false });
176
203
  });
177
- this._init();
204
+ }
205
+ init() {
206
+ return this._init();
178
207
  }
179
208
  // ...........................................................................
180
209
  // General
@@ -208,6 +237,10 @@ const _IoMem = class _IoMem {
208
237
  }
209
238
  // ...........................................................................
210
239
  // Table management
240
+ async tableExists(tableKey) {
241
+ const table = this._mem[tableKey];
242
+ return table ? true : false;
243
+ }
211
244
  createOrExtendTable(request) {
212
245
  return this._createOrExtendTable(request);
213
246
  }
@@ -240,6 +273,7 @@ const _IoMem = class _IoMem {
240
273
  // ...........................................................................
241
274
  async _createOrExtendTable(request) {
242
275
  var _a;
276
+ throwOnInvalidTableCfg(request.tableCfg);
243
277
  await this._ioTools.throwWhenTableIsNotCompatible(request.tableCfg);
244
278
  const { type, key } = request.tableCfg;
245
279
  const newConfig = hsh(request.tableCfg);
@@ -267,10 +301,8 @@ const _IoMem = class _IoMem {
267
301
  }
268
302
  // ...........................................................................
269
303
  async _dumpTable(request) {
304
+ await this._ioTools.throwWhenTableDoesNotExist(request.table);
270
305
  const table = this._mem[request.table];
271
- if (!table) {
272
- throw new Error(`Table ${request.table} not found`);
273
- }
274
306
  return {
275
307
  [request.table]: copy(table)
276
308
  };
@@ -279,13 +311,10 @@ const _IoMem = class _IoMem {
279
311
  async _write(request) {
280
312
  const addedData = hsh(request.data);
281
313
  const tables = Object.keys(addedData);
314
+ await this._ioTools.throwWhenTablesDoNotExist(request.data);
282
315
  for (const table of tables) {
283
316
  if (table.startsWith("_")) {
284
317
  continue;
285
- } else {
286
- if (!this._mem[table]) {
287
- throw new Error(`Table ${table} does not exist`);
288
- }
289
318
  }
290
319
  const oldTable = this._mem[table];
291
320
  const newTable = addedData[table];
@@ -307,10 +336,8 @@ const _IoMem = class _IoMem {
307
336
  }
308
337
  // ...........................................................................
309
338
  async _readRows(request) {
339
+ await this._ioTools.throwWhenTableDoesNotExist(request.table);
310
340
  const table = this._mem[request.table];
311
- if (!table) {
312
- throw new Error(`Table ${request.table} not found`);
313
- }
314
341
  const result = {
315
342
  [request.table]: {
316
343
  _data: table._data.filter((row) => {
@@ -442,3 +469,4 @@ export {
442
469
  calcReverseRefs,
443
470
  exampleIo
444
471
  };
472
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW8uanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9pby10b29scy50cyIsIi4uL3NyYy9pby1tZW0udHMiLCIuLi9zcmMvaW8udHMiLCIuLi9zcmMvcmV2ZXJzZS1yZWYudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQGxpY2Vuc2Vcbi8vIENvcHlyaWdodCAoYykgMjAyNSBSbGpzb25cbi8vXG4vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0ZXJtcyB0aGF0IGNhbiBiZVxuLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHBhY2thZ2UuXG5cbmltcG9ydCB7IGhpcCB9IGZyb20gJ0BybGpzb24vaGFzaCc7XG5pbXBvcnQge1xuICBpdGVyYXRlVGFibGVzLFxuICBSbGpzb24sXG4gIFRhYmxlQ2ZnLFxuICBUYWJsZUtleSxcbiAgdGhyb3dPbkludmFsaWRUYWJsZUNmZyxcbn0gZnJvbSAnQHJsanNvbi9ybGpzb24nO1xuXG5pbXBvcnQgeyBJb01lbSB9IGZyb20gJy4vaW8tbWVtLnRzJztcbmltcG9ydCB7IElvIH0gZnJvbSAnLi9pby50cyc7XG5cbi8qKlxuICogUHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHRoZSBJbyBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBJb1Rvb2xzIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSBpbyBUaGUgSW8gaW50ZXJmYWNlIHRvIHVzZVxuICAgKi9cbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IGlvOiBJbykge31cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGFibGUgY29uZmlndXJhdGlvbiBvZiB0aGUgdGFibGVDZmdzIHRhYmxlLlxuICAgKi9cbiAgc3RhdGljIGdldCB0YWJsZUNmZ3NUYWJsZUNmZygpIHtcbiAgICBjb25zdCB0YWJsZUNmZyA9IGhpcDxUYWJsZUNmZz4oe1xuICAgICAgX2hhc2g6ICcnLFxuICAgICAga2V5OiAndGFibGVDZmdzJyxcbiAgICAgIHR5cGU6ICdpbmdyZWRpZW50cycsXG4gICAgICBpc0hlYWQ6IGZhbHNlLFxuICAgICAgaXNSb290OiBmYWxzZSxcbiAgICAgIGlzU2hhcmVkOiB0cnVlLFxuICAgICAgdmVyc2lvbjogMSxcbiAgICAgIHByZXZpb3VzOiAnJyxcblxuICAgICAgY29sdW1uczogW1xuICAgICAgICB7IGtleTogJ19oYXNoJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgeyBrZXk6ICdrZXknLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICB7IGtleTogJ3R5cGUnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICB7IGtleTogJ2lzSGVhZCcsIHR5cGU6ICdib29sZWFuJyB9LFxuICAgICAgICB7IGtleTogJ2lzUm9vdCcsIHR5cGU6ICdib29sZWFuJyB9LFxuICAgICAgICB7IGtleTogJ2lzU2hhcmVkJywgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgICAgIHsga2V5OiAndmVyc2lvbicsIHR5cGU6ICdudW1iZXInIH0sXG4gICAgICAgIHsga2V5OiAncHJldmlvdXMnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICB7IGtleTogJ2NvbHVtbnMnLCB0eXBlOiAnanNvbkFycmF5JyB9LFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0YWJsZUNmZztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgcmV2aXNpb25zIHRhYmxlLlxuICAgKi9cbiAgaW5pdFJldmlzaW9uc1RhYmxlID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlQ2ZnOiBUYWJsZUNmZyA9IHtcbiAgICAgIHZlcnNpb246IDEsXG4gICAgICBrZXk6ICdyZXZpc2lvbnMnLFxuICAgICAgdHlwZTogJ2luZ3JlZGllbnRzJyxcbiAgICAgIGlzSGVhZDogdHJ1ZSxcbiAgICAgIGlzUm9vdDogdHJ1ZSxcbiAgICAgIGlzU2hhcmVkOiBmYWxzZSxcblxuICAgICAgY29sdW1uczogW1xuICAgICAgICB7IGtleTogJ19oYXNoJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgeyBrZXk6ICd0YWJsZScsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHsga2V5OiAncHJlZGVjZXNzb3InLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICB7IGtleTogJ3N1Y2Nlc3NvcicsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHsga2V5OiAndGltZXN0YW1wJywgdHlwZTogJ251bWJlcicgfSxcbiAgICAgICAgeyBrZXk6ICdpZCcsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICBdLFxuICAgIH07XG5cbiAgICBhd2FpdCB0aGlzLmlvLmNyZWF0ZU9yRXh0ZW5kVGFibGUoeyB0YWJsZUNmZyB9KTtcbiAgfTtcblxuICAvKipcbiAgICogRXhhbXBsZSBvYmplY3QgZm9yIHRlc3QgcHVycG9zZXNcbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgaW8gdG9vbHNcbiAgICovXG4gIHN0YXRpYyBleGFtcGxlID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGlvID0gYXdhaXQgSW9NZW0uZXhhbXBsZSgpO1xuICAgIGF3YWl0IGlvLmluaXQoKTtcbiAgICBhd2FpdCBpby5pc1JlYWR5KCk7XG4gICAgcmV0dXJuIG5ldyBJb1Rvb2xzKGlvKTtcbiAgfTtcblxuICAvKipcbiAgICogVGhyb3dzIGlmIHRoZSB0YWJsZSBkb2VzIG5vdCBleGlzdFxuICAgKi9cbiAgYXN5bmMgdGhyb3dXaGVuVGFibGVEb2VzTm90RXhpc3QodGFibGU6IFRhYmxlS2V5KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZXhpc3RzID0gYXdhaXQgdGhpcy5pby50YWJsZUV4aXN0cyh0YWJsZSk7XG4gICAgaWYgKCFleGlzdHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGFibGUgXCIke3RhYmxlfVwiIG5vdCBmb3VuZGApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgaWYgYW55IG9mIHRoZSB0YWJsZXMgaW4gcmxqc29uIGRvIG5vdCBleGlzdFxuICAgKiBAcGFyYW0gcmxqc29uIC0gVGhlIFJsanNvbiBvYmplY3QgdG8gY2hlY2tcbiAgICovXG4gIGFzeW5jIHRocm93V2hlblRhYmxlc0RvTm90RXhpc3Qocmxqc29uOiBSbGpzb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgaXRlcmF0ZVRhYmxlcyhybGpzb24sIGFzeW5jICh0YWJsZUtleSkgPT4ge1xuICAgICAgICBjb25zdCBleGlzdHMgPSBhd2FpdCB0aGlzLmlvLnRhYmxlRXhpc3RzKHRhYmxlS2V5KTtcbiAgICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlIFwiJHt0YWJsZUtleX1cIiBub3QgZm91bmRgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgbWlzc2luZ1RhYmxlcyA9IChlIGFzIEFycmF5PGFueT4pLm1hcCgoZSkgPT4gZS50YWJsZUtleSk7XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSBmb2xsb3dpbmcgdGFibGVzIGRvIG5vdCBleGlzdDogJHttaXNzaW5nVGFibGVzLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IHdpdGggYWxsIHRhYmxlIG5hbWVzXG4gICAqL1xuICBhc3luYyBhbGxUYWJsZUtleXMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IChhd2FpdCB0aGlzLmlvLnRhYmxlQ2ZncygpKS50YWJsZUNmZ3MuX2RhdGEubWFwKFxuICAgICAgKGUpID0+IGUua2V5LFxuICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uIG9mIGEgZ2l2ZW4gdGFibGVcbiAgICovXG4gIGFzeW5jIHRhYmxlQ2ZnKHRhYmxlOiBUYWJsZUtleSk6IFByb21pc2U8VGFibGVDZmc+IHtcbiAgICBjb25zdCB0YWJsZUNmZyA9IGF3YWl0IHRoaXMudGFibGVDZmdPck51bGwodGFibGUpO1xuICAgIGlmICghdGFibGVDZmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGFibGUgXCIke3RhYmxlfVwiIG5vdCBmb3VuZGApO1xuICAgIH1cblxuICAgIHJldHVybiB0YWJsZUNmZyE7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBvZiBhIGdpdmVuIHRhYmxlIG9yIG51bGwgaWYgaXQgZG9lcyBub3QgZXhpc3QuXG5cbiAgICovXG4gIGFzeW5jIHRhYmxlQ2ZnT3JOdWxsKHRhYmxlOiBUYWJsZUtleSk6IFByb21pc2U8VGFibGVDZmcgfCBudWxsPiB7XG4gICAgY29uc3QgdGFibGVDZmdzID0gYXdhaXQgdGhpcy5pby50YWJsZUNmZ3MoKTtcbiAgICBjb25zdCB0YWJsZUNmZyA9IHRhYmxlQ2Zncy50YWJsZUNmZ3MuX2RhdGEuZmluZCgoZSkgPT4gZS5rZXkgPT09IHRhYmxlKTtcbiAgICByZXR1cm4gdGFibGVDZmcgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgY29sdW1uIG5hbWVzIG9mIGEgZ2l2ZW4gdGFibGVcbiAgICovXG4gIGFzeW5jIGFsbENvbHVtbktleXModGFibGU6IFRhYmxlS2V5KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHRhYmxlQ2ZnID0gYXdhaXQgdGhpcy50YWJsZUNmZyh0YWJsZSk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGFibGVDZmcuY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gY29sdW1uLmtleSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3Mgd2hlbiBhIHRhYmxlIHVwZGF0ZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IHRhYmxlXG4gICAqIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBhc3luYyB0aHJvd1doZW5UYWJsZUlzTm90Q29tcGF0aWJsZSh1cGRhdGU6IFRhYmxlQ2ZnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHJlZml4ID0gYEludmFsaWQgdXBkYXRlIG9mIHRhYmxlIGFibGUgXCIke3VwZGF0ZS5rZXl9XCJgO1xuXG4gICAgdGhyb3dPbkludmFsaWRUYWJsZUNmZyh1cGRhdGUpO1xuXG4gICAgLy8gQ2hlY2sgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIHRhYmxlXG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLnRhYmxlQ2ZnT3JOdWxsKHVwZGF0ZS5rZXkpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgLy8gSGF2ZSBjb2x1bW5zIGJlZW4gZGVsZXRlZD9cbiAgICAgIGlmIChleGlzdGluZy5jb2x1bW5zLmxlbmd0aCA+IHVwZGF0ZS5jb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBkZWxldGVkQ29sdW1uS2V5cyA9IGV4aXN0aW5nLmNvbHVtbnNcbiAgICAgICAgICAubWFwKChjb2x1bW4pID0+IGNvbHVtbi5rZXkpXG4gICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgIChrZXkpID0+ICF1cGRhdGUuY29sdW1ucy5zb21lKChjb2x1bW4pID0+IGNvbHVtbi5rZXkgPT09IGtleSksXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKGRlbGV0ZWRDb2x1bW5LZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBkZWxldGVkQ29sdW1ucyA9IGRlbGV0ZWRDb2x1bW5LZXlzLmpvaW4oJywgJyk7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYCR7cHJlZml4fTogQ29sdW1ucyBtdXN0IG5vdCBiZSBkZWxldGVkLiBgICtcbiAgICAgICAgICAgICAgYERlbGV0ZWQgY29sdW1uczogJHtkZWxldGVkQ29sdW1uc319YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhdmUgY29sdW1uIGtleXMgY2hhbmdlZD9cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhpc3RpbmcuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBiZWZvcmUgPSBleGlzdGluZy5jb2x1bW5zW2ldLmtleTtcbiAgICAgICAgY29uc3QgYWZ0ZXIgPSB1cGRhdGUuY29sdW1uc1tpXS5rZXk7XG4gICAgICAgIGlmIChiZWZvcmUgIT09IGFmdGVyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYCR7cHJlZml4fTogYCArXG4gICAgICAgICAgICAgIGBDb2x1bW4ga2V5cyBtdXN0IG5vdCBjaGFuZ2UhIGAgK1xuICAgICAgICAgICAgICBgQ29sdW1uIFwiJHtiZWZvcmV9XCIgd2FzIHJlbmFtZWQgaW50byBcIiR7YWZ0ZXJ9XCIuYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhdmUgY29sdW1uIHR5cGVzIGNoYW5nZWQ/XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4aXN0aW5nLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gZXhpc3RpbmcuY29sdW1uc1tpXS5rZXk7XG4gICAgICAgIGNvbnN0IGJlZm9yZSA9IGV4aXN0aW5nLmNvbHVtbnNbaV0udHlwZTtcbiAgICAgICAgY29uc3QgYWZ0ZXIgPSB1cGRhdGUuY29sdW1uc1tpXS50eXBlO1xuICAgICAgICBpZiAoYmVmb3JlICE9PSBhZnRlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGAke3ByZWZpeH06IGAgK1xuICAgICAgICAgICAgICBgQ29sdW1uIHR5cGVzIG11c3Qgbm90IGNoYW5nZSEgYCArXG4gICAgICAgICAgICAgIGBUeXBlIG9mIGNvbHVtbiBcIiR7Y29sdW1ufVwiIHdhcyBjaGFuZ2VkIGZyb20gXCIke2JlZm9yZX1cIiB0byAke2FmdGVyfS5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIi8vIEBsaWNlbnNlXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXG4vL1xuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGVybXMgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxuXG5pbXBvcnQgeyBoaXAsIGhzaCB9IGZyb20gJ0BybGpzb24vaGFzaCc7XG5pbXBvcnQgeyBJc1JlYWR5IH0gZnJvbSAnQHJsanNvbi9pcy1yZWFkeSc7XG5pbXBvcnQgeyBjb3B5LCBlcXVhbHMsIEpzb25WYWx1ZSB9IGZyb20gJ0BybGpzb24vanNvbic7XG5pbXBvcnQge1xuICBSbGpzb24sXG4gIFRhYmxlQ2ZnLFxuICBUYWJsZUtleSxcbiAgVGFibGVUeXBlLFxuICB0aHJvd09uSW52YWxpZFRhYmxlQ2ZnLFxufSBmcm9tICdAcmxqc29uL3JsanNvbic7XG5cbmltcG9ydCB7IElvVG9vbHMgfSBmcm9tICcuL2lvLXRvb2xzLnRzJztcbmltcG9ydCB7IElvIH0gZnJvbSAnLi9pby50cyc7XG5cbi8qKlxuICogSW4tTWVtb3J5IGltcGxlbWVudGF0aW9uIG9mIHRoZSBSbGpzb24gSW8gaW50ZXJmYWNlLlxuICovXG5leHBvcnQgY2xhc3MgSW9NZW0gaW1wbGVtZW50cyBJbyB7XG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBDb25zdHJ1Y3RvciAmIGV4YW1wbGVcbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIGluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2luaXQoKTtcbiAgfVxuXG4gIHN0YXRpYyBleGFtcGxlID0gYXN5bmMgKCkgPT4ge1xuICAgIHJldHVybiBuZXcgSW9NZW0oKTtcbiAgfTtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gR2VuZXJhbFxuICBpc1JlYWR5KCkge1xuICAgIHJldHVybiB0aGlzLl9pc1JlYWR5LnByb21pc2U7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gRHVtcFxuXG4gIGR1bXAoKTogUHJvbWlzZTxSbGpzb24+IHtcbiAgICByZXR1cm4gdGhpcy5fZHVtcCgpO1xuICB9XG5cbiAgYXN5bmMgZHVtcFRhYmxlKHJlcXVlc3Q6IHsgdGFibGU6IHN0cmluZyB9KTogUHJvbWlzZTxSbGpzb24+IHtcbiAgICByZXR1cm4gdGhpcy5fZHVtcFRhYmxlKHJlcXVlc3QpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFJvd3NcblxuICByZWFkUm93cyhyZXF1ZXN0OiB7XG4gICAgdGFibGU6IHN0cmluZztcbiAgICB3aGVyZTogeyBbY29sdW1uOiBzdHJpbmddOiBKc29uVmFsdWUgfTtcbiAgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRSb3dzKHJlcXVlc3QpO1xuICB9XG5cbiAgYXN5bmMgcm93Q291bnQodGFibGU6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgdGFibGVEYXRhID0gdGhpcy5fbWVtW3RhYmxlXSBhcyBUYWJsZVR5cGU7XG4gICAgaWYgKCF0YWJsZURhdGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGFibGUgXCIke3RhYmxlfVwiIG5vdCBmb3VuZGApO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRhYmxlRGF0YS5fZGF0YS5sZW5ndGgpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFdyaXRlXG5cbiAgd3JpdGUocmVxdWVzdDogeyBkYXRhOiBSbGpzb24gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93cml0ZShyZXF1ZXN0KTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBUYWJsZSBtYW5hZ2VtZW50XG4gIGFzeW5jIHRhYmxlRXhpc3RzKHRhYmxlS2V5OiBUYWJsZUtleSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5fbWVtW3RhYmxlS2V5XSBhcyBUYWJsZVR5cGU7XG4gICAgcmV0dXJuIHRhYmxlID8gdHJ1ZSA6IGZhbHNlO1xuICB9XG5cbiAgY3JlYXRlT3JFeHRlbmRUYWJsZShyZXF1ZXN0OiB7IHRhYmxlQ2ZnOiBUYWJsZUNmZyB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZU9yRXh0ZW5kVGFibGUocmVxdWVzdCk7XG4gIH1cblxuICBhc3luYyB0YWJsZUNmZ3MoKTogUHJvbWlzZTxSbGpzb24+IHtcbiAgICBjb25zdCB0YWJsZXMgPSB0aGlzLl9tZW0udGFibGVDZmdzLl9kYXRhIGFzIFRhYmxlQ2ZnW107XG5cbiAgICAvLyBUYWtlIHRoZSBsYXN0IHZlcnNpb24gb2YgZWFjdGggdHlwZSBrZXlcbiAgICBjb25zdCBuZXdlc3RWZXJzaW9uOiBSZWNvcmQ8VGFibGVLZXksIFRhYmxlQ2ZnPiA9IHt9O1xuICAgIGZvciAoY29uc3QgdGFibGUgb2YgdGFibGVzKSB7XG4gICAgICBjb25zdCBleGlzdGluZyA9IG5ld2VzdFZlcnNpb25bdGFibGUua2V5XTtcbiAgICAgIGlmICghZXhpc3RpbmcpIHtcbiAgICAgICAgbmV3ZXN0VmVyc2lvblt0YWJsZS5rZXldID0gdGFibGU7XG4gICAgICB9IGVsc2UgaWYgKHRhYmxlLnZlcnNpb24gPiBleGlzdGluZy52ZXJzaW9uKSB7XG4gICAgICAgIG5ld2VzdFZlcnNpb25bdGFibGUua2V5XSA9IHRhYmxlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdERhdGEgPSBPYmplY3QudmFsdWVzKG5ld2VzdFZlcnNpb24pO1xuXG4gICAgcmV0dXJuIGhpcCh7XG4gICAgICB0YWJsZUNmZ3M6IHtcbiAgICAgICAgX3R5cGU6ICdpbmdyZWRpZW50cycsXG4gICAgICAgIF9kYXRhOiByZXN1bHREYXRhLFxuICAgICAgfSxcbiAgICB9IGFzIFJsanNvbik7XG4gIH1cblxuICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4gIC8vIFByaXZhdGVcbiAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuXG4gIHByaXZhdGUgX2lvVG9vbHMhOiBJb1Rvb2xzO1xuXG4gIHByaXZhdGUgX2lzUmVhZHkgPSBuZXcgSXNSZWFkeSgpO1xuXG4gIHByaXZhdGUgX21lbTogUmxqc29uID0gaGlwKHt9IGFzIFJsanNvbik7XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX2luaXQoKSB7XG4gICAgdGhpcy5faW9Ub29scyA9IG5ldyBJb1Rvb2xzKHRoaXMpO1xuICAgIHRoaXMuX2luaXRUYWJsZUNmZ3MoKTtcbiAgICBhd2FpdCB0aGlzLl9pb1Rvb2xzLmluaXRSZXZpc2lvbnNUYWJsZSgpO1xuXG4gICAgdGhpcy5faXNSZWFkeS5yZXNvbHZlKCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBfaW5pdFRhYmxlQ2ZncyA9ICgpID0+IHtcbiAgICBjb25zdCB0YWJsZUNmZyA9IElvVG9vbHMudGFibGVDZmdzVGFibGVDZmc7XG5cbiAgICB0aGlzLl9tZW0udGFibGVDZmdzID0gaGlwKHtcbiAgICAgIF9kYXRhOiBbdGFibGVDZmddLFxuICAgICAgX3R5cGU6ICdpbmdyZWRpZW50cycsXG4gICAgICBfdGFibGVDZmc6IHRhYmxlQ2ZnLl9oYXNoIGFzIHN0cmluZyxcbiAgICB9KTtcblxuICAgIGhpcCh0aGlzLl9tZW0sIHsgdXBkYXRlRXhpc3RpbmdIYXNoZXM6IHRydWUsIHRocm93T25Xcm9uZ0hhc2hlczogZmFsc2UgfSk7XG4gIH07XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX2NyZWF0ZU9yRXh0ZW5kVGFibGUocmVxdWVzdDoge1xuICAgIHRhYmxlQ2ZnOiBUYWJsZUNmZztcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFZhbGlkYXRlIHRoZSB0YWJsZSBjb25maWdcbiAgICB0aHJvd09uSW52YWxpZFRhYmxlQ2ZnKHJlcXVlc3QudGFibGVDZmcpO1xuXG4gICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHRhYmxlIGNvbmZpZyBpcyBjb21wYXRpYmxlXG4gICAgLy8gd2l0aCBhbiBwb3RlbnRpYWwgZXhpc3RpbmcgdGFibGVcbiAgICBhd2FpdCB0aGlzLl9pb1Rvb2xzLnRocm93V2hlblRhYmxlSXNOb3RDb21wYXRpYmxlKHJlcXVlc3QudGFibGVDZmcpO1xuXG4gICAgY29uc3QgeyB0eXBlLCBrZXkgfSA9IHJlcXVlc3QudGFibGVDZmc7XG5cbiAgICAvLyBSZWNyZWF0ZSBoYXNoZXMgaW4gdGhlIGNhc2UgdGhlIGV4aXN0aW5nIGhhc2hlcyBhcmUgd3JvbmdcbiAgICBjb25zdCBuZXdDb25maWcgPSBoc2gocmVxdWVzdC50YWJsZUNmZyk7XG5cbiAgICAvLyBGaW5kIGFuIGV4aXN0aW5nIHRhYmxlIGNvbmZpZyB3aXRoIHRoZSBzYW1lIGhhc2hcbiAgICBjb25zdCBleGlzdGluZ0NvbmZpZzogVGFibGVDZmcgPSB0aGlzLl9tZW0udGFibGVDZmdzLl9kYXRhLmZpbmQoXG4gICAgICAoY2ZnKSA9PiBjZmcuX2hhc2ggPT09IG5ld0NvbmZpZy5faGFzaCxcbiAgICApO1xuXG4gICAgLy8gV3JpdGUgdGhlIG5ldyBjb25maWcgaW50byB0aGUgZGF0YWJhc2VcbiAgICBpZiAoIWV4aXN0aW5nQ29uZmlnKSB7XG4gICAgICB0aGlzLl9tZW0udGFibGVDZmdzLl9kYXRhLnB1c2gobmV3Q29uZmlnKTtcbiAgICAgIHRoaXMuX21lbS50YWJsZUNmZ3MuX2hhc2ggPSAnJztcbiAgICAgIGhpcCh0aGlzLl9tZW0udGFibGVDZmdzLCB7XG4gICAgICAgIHVwZGF0ZUV4aXN0aW5nSGFzaGVzOiBmYWxzZSxcbiAgICAgICAgdGhyb3dPbldyb25nSGFzaGVzOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aGUgdGFibGUgYW5uZCBhc3NpZ24gdGhlIHRhYmxlIGNvbmZpZyBoYXNoXG4gICAgY29uc3QgdGFibGU6IFRhYmxlVHlwZSA9IHtcbiAgICAgIF9kYXRhOiBbXSxcbiAgICAgIF90eXBlOiB0eXBlLFxuICAgICAgX3RhYmxlQ2ZnOiBuZXdDb25maWcuX2hhc2ggYXMgc3RyaW5nLFxuICAgIH07XG5cbiAgICAvLyBBZGQgaGFzaGVzIHRvIHRoZSB0YWJsZVxuICAgIHRoaXMuX21lbVtrZXldID8/PSBoaXAodGFibGUpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5cbiAgcHJpdmF0ZSBhc3luYyBfZHVtcCgpOiBQcm9taXNlPFJsanNvbj4ge1xuICAgIHJldHVybiBjb3B5KHRoaXMuX21lbSk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBhc3luYyBfZHVtcFRhYmxlKHJlcXVlc3Q6IHsgdGFibGU6IHN0cmluZyB9KTogUHJvbWlzZTxSbGpzb24+IHtcbiAgICBhd2FpdCB0aGlzLl9pb1Rvb2xzLnRocm93V2hlblRhYmxlRG9lc05vdEV4aXN0KHJlcXVlc3QudGFibGUpO1xuXG4gICAgY29uc3QgdGFibGUgPSB0aGlzLl9tZW1bcmVxdWVzdC50YWJsZV0gYXMgVGFibGVUeXBlO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIFtyZXF1ZXN0LnRhYmxlXTogY29weSh0YWJsZSksXG4gICAgfTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIGFzeW5jIF93cml0ZShyZXF1ZXN0OiB7IGRhdGE6IFJsanNvbiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYWRkZWREYXRhID0gaHNoKHJlcXVlc3QuZGF0YSk7XG4gICAgY29uc3QgdGFibGVzID0gT2JqZWN0LmtleXMoYWRkZWREYXRhKTtcblxuICAgIGF3YWl0IHRoaXMuX2lvVG9vbHMudGhyb3dXaGVuVGFibGVzRG9Ob3RFeGlzdChyZXF1ZXN0LmRhdGEpO1xuXG4gICAgZm9yIChjb25zdCB0YWJsZSBvZiB0YWJsZXMpIHtcbiAgICAgIGlmICh0YWJsZS5zdGFydHNXaXRoKCdfJykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9sZFRhYmxlID0gdGhpcy5fbWVtW3RhYmxlXSBhcyBUYWJsZVR5cGU7XG4gICAgICBjb25zdCBuZXdUYWJsZSA9IGFkZGVkRGF0YVt0YWJsZV0gYXMgVGFibGVUeXBlO1xuXG4gICAgICAvLyBNYWtlIHN1cmUgb2xkVGFibGUgYW5kIG5ld1RhYmxlIGhhdmUgdGhlIHNhbWUgdHlwZVxuICAgICAgaWYgKG9sZFRhYmxlLl90eXBlICE9PSBuZXdUYWJsZS5fdHlwZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRhYmxlICR7dGFibGV9IGhhcyBkaWZmZXJlbnQgdHlwZXM6IFwiJHtvbGRUYWJsZS5fdHlwZX1cIiB2cyBcIiR7bmV3VGFibGUuX3R5cGV9XCJgLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBUYWJsZSBleGlzdHMuIE1lcmdlIGRhdGFcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBuZXdUYWJsZS5fZGF0YSkge1xuICAgICAgICBjb25zdCBoYXNoID0gaXRlbS5faGFzaDtcbiAgICAgICAgY29uc3QgZXhpc3RzID0gb2xkVGFibGUuX2RhdGEuZmluZCgoaSkgPT4gaS5faGFzaCA9PT0gaGFzaCk7XG4gICAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgICAgb2xkVGFibGUuX2RhdGEucHVzaChpdGVtIGFzIGFueSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZWNhbGMgbWFpbiBoYXNoZXNcbiAgICAodGhpcy5fbWVtIGFzIGFueSkuX2hhc2ggPSAnJztcbiAgICBoaXAodGhpcy5fbWVtLCB7IHVwZGF0ZUV4aXN0aW5nSGFzaGVzOiBmYWxzZSwgdGhyb3dPbldyb25nSGFzaGVzOiBmYWxzZSB9KTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIGFzeW5jIF9yZWFkUm93cyhyZXF1ZXN0OiB7XG4gICAgdGFibGU6IHN0cmluZztcbiAgICB3aGVyZTogeyBbY29sdW1uOiBzdHJpbmddOiBKc29uVmFsdWUgfTtcbiAgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZURvZXNOb3RFeGlzdChyZXF1ZXN0LnRhYmxlKTtcblxuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5fbWVtW3JlcXVlc3QudGFibGVdIGFzIFRhYmxlVHlwZTtcblxuICAgIGNvbnN0IHJlc3VsdDogUmxqc29uID0ge1xuICAgICAgW3JlcXVlc3QudGFibGVdOiB7XG4gICAgICAgIF9kYXRhOiB0YWJsZS5fZGF0YS5maWx0ZXIoKHJvdykgPT4ge1xuICAgICAgICAgIGZvciAoY29uc3QgY29sdW1uIGluIHJlcXVlc3Qud2hlcmUpIHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSByb3dbY29sdW1uXTtcbiAgICAgICAgICAgIGNvbnN0IGIgPSByZXF1ZXN0LndoZXJlW2NvbHVtbl07XG4gICAgICAgICAgICBpZiAoIWVxdWFscyhhLCBiKSkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfSBhcyBhbnk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iLCIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuaW1wb3J0IHsgSnNvblZhbHVlIH0gZnJvbSAnQHJsanNvbi9qc29uJztcbmltcG9ydCB7IFJsanNvbiwgVGFibGVDZmcsIFRhYmxlS2V5IH0gZnJvbSAnQHJsanNvbi9ybGpzb24nO1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuZXhwb3J0IGludGVyZmFjZSBJbyB7XG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBHZW5lcmFsXG5cbiAgLyoqIFN0YXJ0cyB0aGUgaW5pdGlhbGl6YXRpb24gKi9cbiAgaW5pdCgpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKiBBIHByb21pc2UgcmVzb2x2aW5nIG9uY2UgdGhlIElvIGludGVyZmFjZSBpcyByZWFkeVxuICAgKlxuICAgKiDwn5KhIFVzZSBAcmxqc29uL2lzLXJlYWR5XG4gICAqL1xuICBpc1JlYWR5KCk6IFByb21pc2U8dm9pZD47XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIER1bXBcblxuICAvKiogUmV0dXJucyB0aGUgY29tcGxldGUgZGIgY29udGVudCBhcyBSbGpzb24gKi9cbiAgZHVtcCgpOiBQcm9taXNlPFJsanNvbj47XG5cbiAgLyoqIFJldHVybnMgdGhlIGR1bXAgb2YgYSBjb21wbGV0ZSB0YWJsZSAqL1xuICBkdW1wVGFibGUocmVxdWVzdDogeyB0YWJsZTogc3RyaW5nIH0pOiBQcm9taXNlPFJsanNvbj47XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFRhYmxlc1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRhYmxlIGV4aXN0c1xuICAgKi9cbiAgdGFibGVFeGlzdHModGFibGVLZXk6IFRhYmxlS2V5KTogUHJvbWlzZTxib29sZWFuPjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHRhYmxlIHdpdGggYSBnaXZlbiBjb25maWcuXG4gICAqIElmIHRoZSB0YWJsZSBhbHJlYWR5IGV4aXN0cywgbmV3IGNvbHVtbnMgYXJlIGFkZGVkIHRvIHRoZSBleGlzdGluZyB0YWJsZS5cbiAgICogSWYgdGhlIHRhYmxlIGRvZXMgbm90IGV4aXN0LCBpdCBpcyBjcmVhdGVkIHdpdGggdGhlIGdpdmVuIGNvbmZpZy5cbiAgICogSWYgdGhlIHRhYmxlIGV4aXN0cyBhbmQgY29sdW1ucyBhcmUgcmVtb3ZlZCwgYW4gZXJyb3IgaXMgdGhyb3duLlxuICAgKiBJZiB0aGUgdGFibGUgZXhpc3RzIGFuZCB0aGUgY29sdW1uIHR5cGUgaXMgY2hhbmdlZCwgYW4gZXJyb3IgaXMgdGhyb3duLlxuICAgKi9cbiAgY3JlYXRlT3JFeHRlbmRUYWJsZShyZXF1ZXN0OiB7IHRhYmxlQ2ZnOiBUYWJsZUNmZyB9KTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogUmV0dXJucyBhIGpzb24gc3RydWN0dXJlIHJldHVybmluZyBjdXJyZW50IHRhYmxlIGNvbmZpZ3VyYXRpb25zXG4gICAqL1xuICB0YWJsZUNmZ3MoKTogUHJvbWlzZTxSbGpzb24+O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBXcml0ZVxuXG4gIC8qKiBXcml0ZXMgUmxqc29uIGRhdGEgaW50byB0aGUgZGF0YWJhc2UgKi9cbiAgd3JpdGUocmVxdWVzdDogeyBkYXRhOiBSbGpzb24gfSk6IFByb21pc2U8dm9pZD47XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFJlYWQgcm93c1xuXG4gIC8qKiBRdWVyaWVzIGEgbGlzdCBvZiByb3dzICovXG4gIHJlYWRSb3dzKHJlcXVlc3Q6IHtcbiAgICB0YWJsZTogc3RyaW5nO1xuICAgIHdoZXJlOiB7IFtjb2x1bW46IHN0cmluZ106IEpzb25WYWx1ZSB8IG51bGwgfTtcbiAgfSk6IFByb21pc2U8Umxqc29uPjtcblxuICAvKiogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIGdpdmVuIHRhYmxlICovXG4gIHJvd0NvdW50KHRhYmxlOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj47XG59XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5leHBvcnQgY29uc3QgZXhhbXBsZUlvID1cbiAgJ0NoZWNrb3V0IEBybGpzb24vaW8tbWVtIGZvciBhbiBleGFtcGxlIGltcGxlbWVudGF0aW9uJztcbiIsIi8vIEBsaWNlbnNlXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXG4vL1xuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGVybXMgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxuXG5pbXBvcnQgeyBKc29uIH0gZnJvbSAnQHJsanNvbi9qc29uJztcbmltcG9ydCB7XG4gIEJ1ZmZldCxcbiAgQ2FrZSxcbiAgaXRlcmF0ZVRhYmxlc1N5bmMsXG4gIExheWVyLFxuICBSZWYsXG4gIFJsanNvbixcbiAgVGFibGVLZXksXG59IGZyb20gJ0BybGpzb24vcmxqc29uJztcblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbi8qKlxuICogRGVzY3JpYmVzIGEgcm93IHRoYXQgcmVmZXJlbmNlcyBhIGNoaWxkIHRhYmxlIHJvd1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcmVudFJlZiB7XG4gIC8qKlxuICAgKiBUaGUgcGFyZW50IHRhYmxlIHRoYXQgcmVmZXJlbmNlcyB0aGUgY2hpbGQgdGFibGVcbiAgICovXG4gIFtwYXJlbnRUYWJsZTogVGFibGVLZXldOiB7XG4gICAgLyoqXG4gICAgICogVGhlIHBhcmVudCByb3cgdGhhdCByZWZlcmVuY2VzIHRoZSBjaGlsZCByb3dcbiAgICAgKi9cbiAgICBbcGFyZW50Um93OiBSZWZdOiB7XG4gICAgICAvKipcbiAgICAgICAqIERldGFpbHMgYWJvdXQgdGhlIHJlZmVyZW5jZSwgZS5nLiBhbiBhcnJheSBpbmRleCBldGMuXG4gICAgICAgKi9cbiAgICAgIGRldGFpbHM/OiBKc29uO1xuICAgIH07XG4gIH07XG59XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4vKipcbiAqIERlc2NyaWJlcyB0aGUgcGFyZW50IHRhYmxlIHJvd3MgcmVmZXJlbmNpbmcgYSBjaGlsZCB0YWJsZSByb3dcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXZlcnNlUmVmcyB7XG4gIC8qKlxuICAgKiBUaGUgY2hpbGQgdGFibGUgd2UgbmVlZCB0aGUgcmVmZXJlbmNpbmcgcm93cyBmb3JcbiAgICovXG4gIFtjaGlsZFRhYmxlOiBUYWJsZUtleV06IHtcbiAgICAvKipcbiAgICAgKiBUaGUgcm93IGhhc2h3ZSBuZWVkIHRoZSByZWZlcmVuY2luZyByb3dzIGZvclxuICAgICAqL1xuICAgIFtjaGlsZFJvdzogUmVmXTogUGFyZW50UmVmO1xuICB9O1xufVxuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSByZXZlcnNlIHJlZmVyZW5jZXMgZm9yIGEgZ2l2ZW4gcmxqc29uIG9iamVjdFxuICovXG5leHBvcnQgY29uc3QgY2FsY1JldmVyc2VSZWZzID0gKHJsanNvbjogUmxqc29uKTogUmV2ZXJzZVJlZnMgPT4ge1xuICBjb25zdCByZXN1bHQ6IFJldmVyc2VSZWZzID0ge307XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBQcmVwYXJlIGRhdGEgc3RydWN0dXJlXG4gIGl0ZXJhdGVUYWJsZXNTeW5jKHJsanNvbiwgKGNoaWxkVGFibGVLZXksIHRhYmxlKSA9PiB7XG4gICAgY29uc3QgY2hpbGRUYWJsZTogeyBbY2hpbGRSb3dIYXNoOiBzdHJpbmddOiBQYXJlbnRSZWYgfSA9IHt9O1xuICAgIHJlc3VsdFtjaGlsZFRhYmxlS2V5XSA9IGNoaWxkVGFibGU7XG4gICAgZm9yIChjb25zdCBjaGlsZFJvdyBvZiB0YWJsZS5fZGF0YSkge1xuICAgICAgY2hpbGRUYWJsZVtjaGlsZFJvdy5faGFzaF0gPSB7fTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gR2VuZXJhdGUgcmV2ZXJzZSByZWZlcmVuY2VzXG4gIGl0ZXJhdGVUYWJsZXNTeW5jKHJsanNvbiwgKHBhcmVudFRhYmxlS2V5LCBwYXJlbnRUYWJsZSkgPT4ge1xuICAgIC8vIEl0ZXJhdGUgYWxsIHJvd3Mgb2YgZWFjaCB0YWJsZVxuICAgIGZvciAoY29uc3QgcGFyZW50VGFibGVSb3cgb2YgcGFyZW50VGFibGUuX2RhdGEpIHtcbiAgICAgIC8vIEZpbmQgb3V0IHdoZSBvdGhlciB0YWJsZXMgJiByb3dzIGFyZSByZWZlcmVuY2VkIGJ5IHRoaXMgcm93XG4gICAgICAvLyBXcml0ZSB0aGVzZSBpbmZvcm1hdGlvbiBpbnR0byByZXN1bHRcbiAgICAgIHN3aXRjaCAocGFyZW50VGFibGUuX3R5cGUpIHtcbiAgICAgICAgY2FzZSAnaW5ncmVkaWVudHMnOlxuICAgICAgICAgIF93cml0ZUluZ3JlZGllbnRSZWZzKHBhcmVudFRhYmxlS2V5LCBwYXJlbnRUYWJsZVJvdywgcmVzdWx0KTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdsYXllcnMnOiB7XG4gICAgICAgICAgX3dyaXRlTGF5ZXJSZWZzKHBhcmVudFRhYmxlS2V5LCBwYXJlbnRUYWJsZVJvdywgcmVzdWx0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ3NsaWNlSWRzJzoge1xuICAgICAgICAgIC8vIFNsaWNlIGlkcyBkbyBub3QgcmVmZXJlbmNlIG90aGVyIHRhYmxlc1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnY2FrZXMnOiB7XG4gICAgICAgICAgX3dyaXRlQ2FrZVJlZnMocGFyZW50VGFibGVLZXksIHBhcmVudFRhYmxlUm93LCByZXN1bHQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnYnVmZmV0cyc6IHtcbiAgICAgICAgICBfd3JpdGVCdWZmZXRSZWZzKHBhcmVudFRhYmxlS2V5LCBwYXJlbnRUYWJsZVJvdywgcmVzdWx0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5jb25zdCBfd3JpdGVJbmdyZWRpZW50UmVmcyA9IChcbiAgcGFyZW50VGFibGVOYW1lOiBUYWJsZUtleSxcbiAgcGFyZW50Um93OiBKc29uLFxuICByZXN1bHQ6IFJldmVyc2VSZWZzLFxuKSA9PiB7XG4gIGNvbnN0IHBhcmVudFJvd0hhc2ggPSBwYXJlbnRSb3cuX2hhc2ggYXMgc3RyaW5nO1xuXG4gIGZvciAoY29uc3QgcGFyZW50Q29sdW1uTmFtZSBpbiBwYXJlbnRSb3cpIHtcbiAgICBpZiAocGFyZW50Q29sdW1uTmFtZS5zdGFydHNXaXRoKCdfJykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghcGFyZW50Q29sdW1uTmFtZS5lbmRzV2l0aCgnUmVmJykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkVGFibGVOYW1lID0gcGFyZW50Q29sdW1uTmFtZS5zbGljZSgwLCAtMyk7XG4gICAgY29uc3QgY2hpbGRSb3dIYXNoID0gcGFyZW50Um93W3BhcmVudENvbHVtbk5hbWVdIGFzIHN0cmluZztcblxuICAgIF93cml0ZShcbiAgICAgIHJlc3VsdCxcbiAgICAgIGNoaWxkVGFibGVOYW1lLFxuICAgICAgY2hpbGRSb3dIYXNoLFxuICAgICAgcGFyZW50VGFibGVOYW1lLFxuICAgICAgcGFyZW50Um93SGFzaCxcbiAgICApO1xuICB9XG59O1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuY29uc3QgX3dyaXRlTGF5ZXJSZWZzID0gKFxuICBwYXJlbnRUYWJsZU5hbWU6IFRhYmxlS2V5LFxuICBwYXJlbnRSb3c6IExheWVyLFxuICByZXN1bHQ6IFJldmVyc2VSZWZzLFxuKSA9PiB7XG4gIGNvbnN0IGNoaWxkVGFibGVOYW1lID0gcGFyZW50Um93LmluZ3JlZGllbnRzVGFibGU7XG4gIGNvbnN0IHBhcmVudFJvd0hhc2ggPSBwYXJlbnRSb3cuX2hhc2ggYXMgc3RyaW5nO1xuXG4gIGZvciAoY29uc3Qgc2xpY2VJZCBpbiBwYXJlbnRSb3cuYXNzaWduKSB7XG4gICAgaWYgKHNsaWNlSWQuc3RhcnRzV2l0aCgnXycpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBzbGljZUhhc2ggPSBwYXJlbnRSb3cuYXNzaWduW3NsaWNlSWRdIGFzIHN0cmluZztcblxuICAgIF93cml0ZShyZXN1bHQsIGNoaWxkVGFibGVOYW1lLCBzbGljZUhhc2gsIHBhcmVudFRhYmxlTmFtZSwgcGFyZW50Um93SGFzaCk7XG4gIH1cbn07XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5jb25zdCBfd3JpdGVDYWtlUmVmcyA9IChcbiAgcGFyZW50VGFibGVOYW1lOiBUYWJsZUtleSxcbiAgcGFyZW50Um93OiBDYWtlLFxuICByZXN1bHQ6IFJldmVyc2VSZWZzLFxuKSA9PiB7XG4gIGNvbnN0IHBhcmVudFJvd0hhc2ggPSBwYXJlbnRSb3cuX2hhc2ggYXMgc3RyaW5nO1xuXG4gIGZvciAoY29uc3QgbGF5ZXIgaW4gcGFyZW50Um93LmxheWVycykge1xuICAgIGNvbnN0IGNoaWxkVGFibGVOYW1lID0gcGFyZW50Um93LmxheWVyc1RhYmxlO1xuICAgIGNvbnN0IGNoaWxkUm93SGFzaCA9IHBhcmVudFJvdy5sYXllcnNbbGF5ZXJdIGFzIHN0cmluZztcbiAgICBfd3JpdGUoXG4gICAgICByZXN1bHQsXG4gICAgICBjaGlsZFRhYmxlTmFtZSxcbiAgICAgIGNoaWxkUm93SGFzaCxcbiAgICAgIHBhcmVudFRhYmxlTmFtZSxcbiAgICAgIHBhcmVudFJvd0hhc2gsXG4gICAgKTtcbiAgfVxufTtcblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbmNvbnN0IF93cml0ZUJ1ZmZldFJlZnMgPSAoXG4gIHBhcmVudFRhYmxlTmFtZTogVGFibGVLZXksXG4gIHBhcmVudFJvdzogQnVmZmV0LFxuICByZXN1bHQ6IFJldmVyc2VSZWZzLFxuKSA9PiB7XG4gIGNvbnN0IHBhcmVudFJvd0hhc2ggPSBwYXJlbnRSb3cuX2hhc2ggYXMgc3RyaW5nO1xuXG4gIGZvciAoY29uc3QgaXRlbSBvZiBwYXJlbnRSb3cuaXRlbXMpIHtcbiAgICBjb25zdCBjaGlsZFRhYmxlTmFtZSA9IGl0ZW0udGFibGU7XG4gICAgY29uc3QgY2hpbGRSb3dIYXNoID0gaXRlbS5yZWY7XG4gICAgX3dyaXRlKFxuICAgICAgcmVzdWx0LFxuICAgICAgY2hpbGRUYWJsZU5hbWUsXG4gICAgICBjaGlsZFJvd0hhc2gsXG4gICAgICBwYXJlbnRUYWJsZU5hbWUsXG4gICAgICBwYXJlbnRSb3dIYXNoLFxuICAgICk7XG4gIH1cbn07XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5jb25zdCBfd3JpdGUgPSAoXG4gIHJlc3VsdDogUmV2ZXJzZVJlZnMsXG4gIGNoaWxkVGFibGVOYW1lOiBzdHJpbmcsXG4gIGNoaWxkUm93SGFzaDogc3RyaW5nLFxuICBwYXJlbnRUYWJsZU5hbWU6IHN0cmluZyxcbiAgcGFyZW50Um93SGFzaDogc3RyaW5nLFxuKSA9PiB7XG4gIGNvbnN0IHJlZmVyZW5jZXNGb3JDaGlsZFRhYmxlID0gKHJlc3VsdFtjaGlsZFRhYmxlTmFtZV0gPz89IHt9KTtcbiAgY29uc3QgcmVmZXJlbmNlc0ZvckNoaWxkVGFibGVSb3cgPSAocmVmZXJlbmNlc0ZvckNoaWxkVGFibGVbY2hpbGRSb3dIYXNoXSA/Pz1cbiAgICB7fSk7XG5cbiAgcmVmZXJlbmNlc0ZvckNoaWxkVGFibGVSb3dbcGFyZW50VGFibGVOYW1lXSA/Pz0ge307XG4gIHJlZmVyZW5jZXNGb3JDaGlsZFRhYmxlUm93W3BhcmVudFRhYmxlTmFtZV1bcGFyZW50Um93SGFzaF0gPz89IHt9O1xufTtcbiJdLCJuYW1lcyI6WyJlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFxQk8sTUFBTSxXQUFOLE1BQU0sU0FBUTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLbkIsWUFBNEIsSUFBUTtBQW1DcEM7QUFBQTtBQUFBO0FBQUEsOENBQXFCLFlBQVk7QUFDL0IsWUFBTSxXQUFxQjtBQUFBLFFBQ3pCLFNBQVM7QUFBQSxRQUNULEtBQUs7QUFBQSxRQUNMLE1BQU07QUFBQSxRQUNOLFFBQVE7QUFBQSxRQUNSLFFBQVE7QUFBQSxRQUNSLFVBQVU7QUFBQSxRQUVWLFNBQVM7QUFBQSxVQUNQLEVBQUUsS0FBSyxTQUFTLE1BQU0sU0FBUztBQUFBLFVBQy9CLEVBQUUsS0FBSyxTQUFTLE1BQU0sU0FBUztBQUFBLFVBQy9CLEVBQUUsS0FBSyxlQUFlLE1BQU0sU0FBUztBQUFBLFVBQ3JDLEVBQUUsS0FBSyxhQUFhLE1BQU0sU0FBUztBQUFBLFVBQ25DLEVBQUUsS0FBSyxhQUFhLE1BQU0sU0FBUztBQUFBLFVBQ25DLEVBQUUsS0FBSyxNQUFNLE1BQU0sU0FBUztBQUFBLFFBQUE7QUFBQSxNQUVoQztBQUVBLFlBQU0sS0FBSyxHQUFHLG9CQUFvQixFQUFFLFVBQVU7QUFBQSxJQUNoRDtBQXZENEIsU0FBQSxLQUFBO0FBQUEsRUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSzVCLFdBQVcsb0JBQW9CO0FBQzdCLFVBQU0sV0FBVyxJQUFjO0FBQUEsTUFDN0IsT0FBTztBQUFBLE1BQ1AsS0FBSztBQUFBLE1BQ0wsTUFBTTtBQUFBLE1BQ04sUUFBUTtBQUFBLE1BQ1IsUUFBUTtBQUFBLE1BQ1IsVUFBVTtBQUFBLE1BQ1YsU0FBUztBQUFBLE1BQ1QsVUFBVTtBQUFBLE1BRVYsU0FBUztBQUFBLFFBQ1AsRUFBRSxLQUFLLFNBQVMsTUFBTSxTQUFTO0FBQUEsUUFDL0IsRUFBRSxLQUFLLE9BQU8sTUFBTSxTQUFTO0FBQUEsUUFDN0IsRUFBRSxLQUFLLFFBQVEsTUFBTSxTQUFTO0FBQUEsUUFDOUIsRUFBRSxLQUFLLFVBQVUsTUFBTSxVQUFVO0FBQUEsUUFDakMsRUFBRSxLQUFLLFVBQVUsTUFBTSxVQUFVO0FBQUEsUUFDakMsRUFBRSxLQUFLLFlBQVksTUFBTSxVQUFVO0FBQUEsUUFDbkMsRUFBRSxLQUFLLFdBQVcsTUFBTSxTQUFTO0FBQUEsUUFDakMsRUFBRSxLQUFLLFlBQVksTUFBTSxTQUFTO0FBQUEsUUFDbEMsRUFBRSxLQUFLLFdBQVcsTUFBTSxZQUFZO0FBQUEsTUFBQTtBQUFBLElBQ3RDLENBQ0Q7QUFFTSxXQUFBO0FBQUEsRUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBMENULE1BQU0sMkJBQTJCLE9BQWdDO0FBQy9ELFVBQU0sU0FBUyxNQUFNLEtBQUssR0FBRyxZQUFZLEtBQUs7QUFDOUMsUUFBSSxDQUFDLFFBQVE7QUFDWCxZQUFNLElBQUksTUFBTSxVQUFVLEtBQUssYUFBYTtBQUFBLElBQUE7QUFBQSxFQUM5QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPRixNQUFNLDBCQUEwQixRQUErQjtBQUN6RCxRQUFBO0FBQ0ksWUFBQSxjQUFjLFFBQVEsT0FBTyxhQUFhO0FBQzlDLGNBQU0sU0FBUyxNQUFNLEtBQUssR0FBRyxZQUFZLFFBQVE7QUFDakQsWUFBSSxDQUFDLFFBQVE7QUFDWCxnQkFBTSxJQUFJLE1BQU0sVUFBVSxRQUFRLGFBQWE7QUFBQSxRQUFBO0FBQUEsTUFDakQsQ0FDRDtBQUFBLGFBQ00sR0FBRztBQUNWLFlBQU0sZ0JBQWlCLEVBQWlCLElBQUksQ0FBQ0EsT0FBTUEsR0FBRSxRQUFRO0FBRTdELFlBQU0sSUFBSTtBQUFBLFFBQ1Isc0NBQXNDLGNBQWMsS0FBSyxJQUFJLENBQUM7QUFBQSxNQUNoRTtBQUFBLElBQUE7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNRixNQUFNLGVBQWtDO0FBQ3RDLFVBQU0sVUFBVSxNQUFNLEtBQUssR0FBRyxhQUFhLFVBQVUsTUFBTTtBQUFBLE1BQ3pELENBQUMsTUFBTSxFQUFFO0FBQUEsSUFDWDtBQUNPLFdBQUE7QUFBQSxFQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNVCxNQUFNLFNBQVMsT0FBb0M7QUFDakQsVUFBTSxXQUFXLE1BQU0sS0FBSyxlQUFlLEtBQUs7QUFDaEQsUUFBSSxDQUFDLFVBQVU7QUFDYixZQUFNLElBQUksTUFBTSxVQUFVLEtBQUssYUFBYTtBQUFBLElBQUE7QUFHdkMsV0FBQTtBQUFBLEVBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT1QsTUFBTSxlQUFlLE9BQTJDO0FBQzlELFVBQU0sWUFBWSxNQUFNLEtBQUssR0FBRyxVQUFVO0FBQ3BDLFVBQUEsV0FBVyxVQUFVLFVBQVUsTUFBTSxLQUFLLENBQUMsTUFBTSxFQUFFLFFBQVEsS0FBSztBQUN0RSxXQUFPLFlBQVk7QUFBQSxFQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNckIsTUFBTSxjQUFjLE9BQW9DO0FBQ3RELFVBQU0sV0FBVyxNQUFNLEtBQUssU0FBUyxLQUFLO0FBQzFDLFVBQU0sU0FBUyxTQUFTLFFBQVEsSUFBSSxDQUFDLFdBQVcsT0FBTyxHQUFHO0FBQ25ELFdBQUE7QUFBQSxFQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9ULE1BQU0sOEJBQThCLFFBQWlDO0FBQzdELFVBQUEsU0FBUyxpQ0FBaUMsT0FBTyxHQUFHO0FBRTFELDJCQUF1QixNQUFNO0FBRzdCLFVBQU0sV0FBVyxNQUFNLEtBQUssZUFBZSxPQUFPLEdBQUc7QUFDckQsUUFBSSxVQUFVO0FBRVosVUFBSSxTQUFTLFFBQVEsU0FBUyxPQUFPLFFBQVEsUUFBUTtBQUM3QyxjQUFBLG9CQUFvQixTQUFTLFFBQ2hDLElBQUksQ0FBQyxXQUFXLE9BQU8sR0FBRyxFQUMxQjtBQUFBLFVBQ0MsQ0FBQyxRQUFRLENBQUMsT0FBTyxRQUFRLEtBQUssQ0FBQyxXQUFXLE9BQU8sUUFBUSxHQUFHO0FBQUEsUUFDOUQ7QUFDRSxZQUFBLGtCQUFrQixTQUFTLEdBQUc7QUFDMUIsZ0JBQUEsaUJBQWlCLGtCQUFrQixLQUFLLElBQUk7QUFDbEQsZ0JBQU0sSUFBSTtBQUFBLFlBQ1IsR0FBRyxNQUFNLG1EQUNhLGNBQWM7QUFBQSxVQUN0QztBQUFBLFFBQUE7QUFBQSxNQUNGO0FBSUYsZUFBUyxJQUFJLEdBQUcsSUFBSSxTQUFTLFFBQVEsUUFBUSxLQUFLO0FBQ2hELGNBQU0sU0FBUyxTQUFTLFFBQVEsQ0FBQyxFQUFFO0FBQ25DLGNBQU0sUUFBUSxPQUFPLFFBQVEsQ0FBQyxFQUFFO0FBQ2hDLFlBQUksV0FBVyxPQUFPO0FBQ3BCLGdCQUFNLElBQUk7QUFBQSxZQUNSLEdBQUcsTUFBTSwwQ0FFSSxNQUFNLHVCQUF1QixLQUFLO0FBQUEsVUFDakQ7QUFBQSxRQUFBO0FBQUEsTUFDRjtBQUlGLGVBQVMsSUFBSSxHQUFHLElBQUksU0FBUyxRQUFRLFFBQVEsS0FBSztBQUNoRCxjQUFNLFNBQVMsU0FBUyxRQUFRLENBQUMsRUFBRTtBQUNuQyxjQUFNLFNBQVMsU0FBUyxRQUFRLENBQUMsRUFBRTtBQUNuQyxjQUFNLFFBQVEsT0FBTyxRQUFRLENBQUMsRUFBRTtBQUNoQyxZQUFJLFdBQVcsT0FBTztBQUNwQixnQkFBTSxJQUFJO0FBQUEsWUFDUixHQUFHLE1BQU0sbURBRVksTUFBTSx1QkFBdUIsTUFBTSxRQUFRLEtBQUs7QUFBQSxVQUN2RTtBQUFBLFFBQUE7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFSjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBdklFLGNBbEVXLFVBa0VKLFdBQVUsWUFBWTtBQUNyQixRQUFBLEtBQUssTUFBTSxNQUFNLFFBQVE7QUFDL0IsUUFBTSxHQUFHLEtBQUs7QUFDZCxRQUFNLEdBQUcsUUFBUTtBQUNWLFNBQUEsSUFBSSxTQUFRLEVBQUU7QUFDdkI7QUF2RUssSUFBTSxVQUFOO0FDckJQO0FBdUJPLE1BQU0sU0FBTixNQUFNLE9BQW9CO0FBQUE7QUFBQTtBQUFBLEVBRy9CLGNBQWM7QUEyRk47QUFBQTtBQUFBO0FBQUE7QUFFQSxvQ0FBVyxJQUFJLFFBQVE7QUFFdkIsZ0NBQWUsSUFBSSxFQUFZO0FBWS9CO0FBQUEsMENBQWlCLE1BQU07QUFDN0IsWUFBTSxXQUFXLFFBQVE7QUFFcEIsV0FBQSxLQUFLLFlBQVksSUFBSTtBQUFBLFFBQ3hCLE9BQU8sQ0FBQyxRQUFRO0FBQUEsUUFDaEIsT0FBTztBQUFBLFFBQ1AsV0FBVyxTQUFTO0FBQUEsTUFBQSxDQUNyQjtBQUVELFVBQUksS0FBSyxNQUFNLEVBQUUsc0JBQXNCLE1BQU0sb0JBQW9CLE9BQU87QUFBQSxJQUMxRTtBQUFBLEVBckhjO0FBQUEsRUFFZCxPQUFzQjtBQUNwQixXQUFPLEtBQUssTUFBTTtBQUFBLEVBQUE7QUFBQTtBQUFBO0FBQUEsRUFTcEIsVUFBVTtBQUNSLFdBQU8sS0FBSyxTQUFTO0FBQUEsRUFBQTtBQUFBO0FBQUE7QUFBQSxFQU12QixPQUF3QjtBQUN0QixXQUFPLEtBQUssTUFBTTtBQUFBLEVBQUE7QUFBQSxFQUdwQixNQUFNLFVBQVUsU0FBNkM7QUFDcEQsV0FBQSxLQUFLLFdBQVcsT0FBTztBQUFBLEVBQUE7QUFBQTtBQUFBO0FBQUEsRUFNaEMsU0FBUyxTQUdXO0FBQ1gsV0FBQSxLQUFLLFVBQVUsT0FBTztBQUFBLEVBQUE7QUFBQSxFQUcvQixNQUFNLFNBQVMsT0FBZ0M7QUFDdkMsVUFBQSxZQUFZLEtBQUssS0FBSyxLQUFLO0FBQ2pDLFFBQUksQ0FBQyxXQUFXO0FBQ2QsWUFBTSxJQUFJLE1BQU0sVUFBVSxLQUFLLGFBQWE7QUFBQSxJQUFBO0FBRTlDLFdBQU8sUUFBUSxRQUFRLFVBQVUsTUFBTSxNQUFNO0FBQUEsRUFBQTtBQUFBO0FBQUE7QUFBQSxFQU0vQyxNQUFNLFNBQTBDO0FBQ3ZDLFdBQUEsS0FBSyxPQUFPLE9BQU87QUFBQSxFQUFBO0FBQUE7QUFBQTtBQUFBLEVBSzVCLE1BQU0sWUFBWSxVQUFzQztBQUNoRCxVQUFBLFFBQVEsS0FBSyxLQUFLLFFBQVE7QUFDaEMsV0FBTyxRQUFRLE9BQU87QUFBQSxFQUFBO0FBQUEsRUFHeEIsb0JBQW9CLFNBQWdEO0FBQzNELFdBQUEsS0FBSyxxQkFBcUIsT0FBTztBQUFBLEVBQUE7QUFBQSxFQUcxQyxNQUFNLFlBQTZCO0FBQzNCLFVBQUEsU0FBUyxLQUFLLEtBQUssVUFBVTtBQUduQyxVQUFNLGdCQUE0QyxDQUFDO0FBQ25ELGVBQVcsU0FBUyxRQUFRO0FBQ3BCLFlBQUEsV0FBVyxjQUFjLE1BQU0sR0FBRztBQUN4QyxVQUFJLENBQUMsVUFBVTtBQUNDLHNCQUFBLE1BQU0sR0FBRyxJQUFJO0FBQUEsTUFDbEIsV0FBQSxNQUFNLFVBQVUsU0FBUyxTQUFTO0FBQzdCLHNCQUFBLE1BQU0sR0FBRyxJQUFJO0FBQUEsTUFBQTtBQUFBLElBQzdCO0FBR0ksVUFBQSxhQUFhLE9BQU8sT0FBTyxhQUFhO0FBRTlDLFdBQU8sSUFBSTtBQUFBLE1BQ1QsV0FBVztBQUFBLFFBQ1QsT0FBTztBQUFBLFFBQ1AsT0FBTztBQUFBLE1BQUE7QUFBQSxJQUNULENBQ1M7QUFBQSxFQUFBO0FBQUE7QUFBQSxFQWNiLE1BQWMsUUFBUTtBQUNmLFNBQUEsV0FBVyxJQUFJLFFBQVEsSUFBSTtBQUNoQyxTQUFLLGVBQWU7QUFDZCxVQUFBLEtBQUssU0FBUyxtQkFBbUI7QUFFdkMsU0FBSyxTQUFTLFFBQVE7QUFBQSxFQUFBO0FBQUE7QUFBQSxFQWlCeEIsTUFBYyxxQkFBcUIsU0FFakI7O0FBRWhCLDJCQUF1QixRQUFRLFFBQVE7QUFJdkMsVUFBTSxLQUFLLFNBQVMsOEJBQThCLFFBQVEsUUFBUTtBQUVsRSxVQUFNLEVBQUUsTUFBTSxJQUFJLElBQUksUUFBUTtBQUd4QixVQUFBLFlBQVksSUFBSSxRQUFRLFFBQVE7QUFHdEMsVUFBTSxpQkFBMkIsS0FBSyxLQUFLLFVBQVUsTUFBTTtBQUFBLE1BQ3pELENBQUMsUUFBUSxJQUFJLFVBQVUsVUFBVTtBQUFBLElBQ25DO0FBR0EsUUFBSSxDQUFDLGdCQUFnQjtBQUNuQixXQUFLLEtBQUssVUFBVSxNQUFNLEtBQUssU0FBUztBQUNuQyxXQUFBLEtBQUssVUFBVSxRQUFRO0FBQ3hCLFVBQUEsS0FBSyxLQUFLLFdBQVc7QUFBQSxRQUN2QixzQkFBc0I7QUFBQSxRQUN0QixvQkFBb0I7QUFBQSxNQUFBLENBQ3JCO0FBQUEsSUFBQTtBQUlILFVBQU0sUUFBbUI7QUFBQSxNQUN2QixPQUFPLENBQUM7QUFBQSxNQUNSLE9BQU87QUFBQSxNQUNQLFdBQVcsVUFBVTtBQUFBLElBQ3ZCO0FBR0EsZUFBSyxNQUFMLG1CQUFtQixJQUFJLEtBQUs7QUFBQSxFQUFBO0FBQUE7QUFBQSxFQUs5QixNQUFjLFFBQXlCO0FBQzlCLFdBQUEsS0FBSyxLQUFLLElBQUk7QUFBQSxFQUFBO0FBQUE7QUFBQSxFQUl2QixNQUFjLFdBQVcsU0FBNkM7QUFDcEUsVUFBTSxLQUFLLFNBQVMsMkJBQTJCLFFBQVEsS0FBSztBQUU1RCxVQUFNLFFBQVEsS0FBSyxLQUFLLFFBQVEsS0FBSztBQUU5QixXQUFBO0FBQUEsTUFDTCxDQUFDLFFBQVEsS0FBSyxHQUFHLEtBQUssS0FBSztBQUFBLElBQzdCO0FBQUEsRUFBQTtBQUFBO0FBQUEsRUFJRixNQUFjLE9BQU8sU0FBMEM7QUFDdkQsVUFBQSxZQUFZLElBQUksUUFBUSxJQUFJO0FBQzVCLFVBQUEsU0FBUyxPQUFPLEtBQUssU0FBUztBQUVwQyxVQUFNLEtBQUssU0FBUywwQkFBMEIsUUFBUSxJQUFJO0FBRTFELGVBQVcsU0FBUyxRQUFRO0FBQ3RCLFVBQUEsTUFBTSxXQUFXLEdBQUcsR0FBRztBQUN6QjtBQUFBLE1BQUE7QUFHSSxZQUFBLFdBQVcsS0FBSyxLQUFLLEtBQUs7QUFDMUIsWUFBQSxXQUFXLFVBQVUsS0FBSztBQUc1QixVQUFBLFNBQVMsVUFBVSxTQUFTLE9BQU87QUFDckMsY0FBTSxJQUFJO0FBQUEsVUFDUixTQUFTLEtBQUssMEJBQTBCLFNBQVMsS0FBSyxTQUFTLFNBQVMsS0FBSztBQUFBLFFBQy9FO0FBQUEsTUFBQTtBQUlTLGlCQUFBLFFBQVEsU0FBUyxPQUFPO0FBQ2pDLGNBQU0sT0FBTyxLQUFLO0FBQ1osY0FBQSxTQUFTLFNBQVMsTUFBTSxLQUFLLENBQUMsTUFBTSxFQUFFLFVBQVUsSUFBSTtBQUMxRCxZQUFJLENBQUMsUUFBUTtBQUNGLG1CQUFBLE1BQU0sS0FBSyxJQUFXO0FBQUEsUUFBQTtBQUFBLE1BQ2pDO0FBQUEsSUFDRjtBQUlELFNBQUssS0FBYSxRQUFRO0FBQzNCLFFBQUksS0FBSyxNQUFNLEVBQUUsc0JBQXNCLE9BQU8sb0JBQW9CLE9BQU87QUFBQSxFQUFBO0FBQUE7QUFBQSxFQUkzRSxNQUFjLFVBQVUsU0FHSjtBQUNsQixVQUFNLEtBQUssU0FBUywyQkFBMkIsUUFBUSxLQUFLO0FBRTVELFVBQU0sUUFBUSxLQUFLLEtBQUssUUFBUSxLQUFLO0FBRXJDLFVBQU0sU0FBaUI7QUFBQSxNQUNyQixDQUFDLFFBQVEsS0FBSyxHQUFHO0FBQUEsUUFDZixPQUFPLE1BQU0sTUFBTSxPQUFPLENBQUMsUUFBUTtBQUN0QixxQkFBQSxVQUFVLFFBQVEsT0FBTztBQUM1QixrQkFBQSxJQUFJLElBQUksTUFBTTtBQUNkLGtCQUFBLElBQUksUUFBUSxNQUFNLE1BQU07QUFDOUIsZ0JBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxHQUFHO0FBQ1YscUJBQUE7QUFBQSxZQUFBO0FBQUEsVUFDVDtBQUVLLGlCQUFBO0FBQUEsUUFDUixDQUFBO0FBQUEsTUFBQTtBQUFBLElBRUw7QUFFTyxXQUFBO0FBQUEsRUFBQTtBQUVYO0FBM09FLGNBVFcsUUFTSixXQUFVLFlBQVk7QUFDM0IsU0FBTyxJQUFJLE9BQU07QUFDbkI7QUFYSyxJQUFNLFFBQU47QUN2QlA7QUEwRU8sTUFBTSxZQUNYO0FDM0VGO0FBMERhLE1BQUEsa0JBQWtCLENBQUMsV0FBZ0M7QUFDOUQsUUFBTSxTQUFzQixDQUFDO0FBSVgsb0JBQUEsUUFBUSxDQUFDLGVBQWUsVUFBVTtBQUNsRCxVQUFNLGFBQW9ELENBQUM7QUFDM0QsV0FBTyxhQUFhLElBQUk7QUFDYixlQUFBLFlBQVksTUFBTSxPQUFPO0FBQ3ZCLGlCQUFBLFNBQVMsS0FBSyxJQUFJLENBQUM7QUFBQSxJQUFBO0FBQUEsRUFDaEMsQ0FDRDtBQUlpQixvQkFBQSxRQUFRLENBQUMsZ0JBQWdCLGdCQUFnQjtBQUU5QyxlQUFBLGtCQUFrQixZQUFZLE9BQU87QUFHOUMsY0FBUSxZQUFZLE9BQU87QUFBQSxRQUN6QixLQUFLO0FBQ2tCLCtCQUFBLGdCQUFnQixnQkFBZ0IsTUFBTTtBQUMzRDtBQUFBLFFBRUYsS0FBSyxVQUFVO0FBQ0csMEJBQUEsZ0JBQWdCLGdCQUFnQixNQUFNO0FBQ3REO0FBQUEsUUFBQTtBQUFBLFFBR0YsS0FBSyxZQUFZO0FBRWY7QUFBQSxRQUFBO0FBQUEsUUFHRixLQUFLLFNBQVM7QUFDRyx5QkFBQSxnQkFBZ0IsZ0JBQWdCLE1BQU07QUFDckQ7QUFBQSxRQUFBO0FBQUEsUUFHRixLQUFLLFdBQVc7QUFDRywyQkFBQSxnQkFBZ0IsZ0JBQWdCLE1BQU07QUFDdkQ7QUFBQSxRQUFBO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGLENBQ0Q7QUFFTSxTQUFBO0FBQ1Q7QUFHQSxNQUFNLHVCQUF1QixDQUMzQixpQkFDQSxXQUNBLFdBQ0c7QUFDSCxRQUFNLGdCQUFnQixVQUFVO0FBRWhDLGFBQVcsb0JBQW9CLFdBQVc7QUFDcEMsUUFBQSxpQkFBaUIsV0FBVyxHQUFHLEdBQUc7QUFDcEM7QUFBQSxJQUFBO0FBR0YsUUFBSSxDQUFDLGlCQUFpQixTQUFTLEtBQUssR0FBRztBQUNyQztBQUFBLElBQUE7QUFHRixVQUFNLGlCQUFpQixpQkFBaUIsTUFBTSxHQUFHLEVBQUU7QUFDN0MsVUFBQSxlQUFlLFVBQVUsZ0JBQWdCO0FBRS9DO0FBQUEsTUFDRTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBQUEsRUFBQTtBQUVKO0FBR0EsTUFBTSxrQkFBa0IsQ0FDdEIsaUJBQ0EsV0FDQSxXQUNHO0FBQ0gsUUFBTSxpQkFBaUIsVUFBVTtBQUNqQyxRQUFNLGdCQUFnQixVQUFVO0FBRXJCLGFBQUEsV0FBVyxVQUFVLFFBQVE7QUFDbEMsUUFBQSxRQUFRLFdBQVcsR0FBRyxHQUFHO0FBQzNCO0FBQUEsSUFBQTtBQUdJLFVBQUEsWUFBWSxVQUFVLE9BQU8sT0FBTztBQUUxQyxXQUFPLFFBQVEsZ0JBQWdCLFdBQVcsaUJBQWlCLGFBQWE7QUFBQSxFQUFBO0FBRTVFO0FBR0EsTUFBTSxpQkFBaUIsQ0FDckIsaUJBQ0EsV0FDQSxXQUNHO0FBQ0gsUUFBTSxnQkFBZ0IsVUFBVTtBQUVyQixhQUFBLFNBQVMsVUFBVSxRQUFRO0FBQ3BDLFVBQU0saUJBQWlCLFVBQVU7QUFDM0IsVUFBQSxlQUFlLFVBQVUsT0FBTyxLQUFLO0FBQzNDO0FBQUEsTUFDRTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBQUEsRUFBQTtBQUVKO0FBR0EsTUFBTSxtQkFBbUIsQ0FDdkIsaUJBQ0EsV0FDQSxXQUNHO0FBQ0gsUUFBTSxnQkFBZ0IsVUFBVTtBQUVyQixhQUFBLFFBQVEsVUFBVSxPQUFPO0FBQ2xDLFVBQU0saUJBQWlCLEtBQUs7QUFDNUIsVUFBTSxlQUFlLEtBQUs7QUFDMUI7QUFBQSxNQUNFO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFBQSxFQUFBO0FBRUo7QUFHQSxNQUFNLFNBQVMsQ0FDYixRQUNBLGdCQUNBLGNBQ0EsaUJBQ0Esa0JBQ0c7O0FBQ0gsUUFBTSwwQkFBMkIsb0RBQTJCLENBQUM7QUFDN0QsUUFBTSw2QkFBOEIsa0ZBQ2xDLENBQUM7QUFFd0IsZ0dBQXFCLENBQUM7QUFDakQsbUNBQTJCLGVBQWUsR0FBMUMsdUNBQStELENBQUM7QUFDbEU7In0=
@@ -4,59 +4,7 @@
4
4
  // Use of this source code is governed by terms that can be
5
5
  // found in the LICENSE file in the root of this package.
6
6
 
7
- import { hip, hsh } from '@rljson/hash';
8
- import { Rljson, TableCfg } from '@rljson/rljson';
9
-
10
- import { IoMem } from './io-mem.ts';
11
-
12
7
  // Run »pnpm updateGoldens« when you change this file
13
- export const example = async () => {
14
- const ioMem = new IoMem();
15
-
16
- const row = { keyA2: 'a2' };
17
- const rowWithHash = hsh(row);
18
-
19
- // Create a table config first
20
- const tableCfg = hip<TableCfg>({
21
- key: 'tableA',
22
- type: 'ingredients',
23
- columns: [],
24
- version: 1,
25
- isHead: true,
26
- isRoot: true,
27
- isShared: false,
28
- });
29
-
30
- await ioMem.write({
31
- data: {
32
- tableCfgs: {
33
- _type: 'ingredients',
34
- _data: [tableCfg],
35
- },
36
- },
37
- });
38
-
39
- // Create a table first
40
- await ioMem.createOrExtendTable({ tableCfg: tableCfg });
41
-
42
- // Write data into the table
43
- await ioMem.write({
44
- data: {
45
- tableA: {
46
- _type: 'ingredients',
47
- _data: [row],
48
- },
49
- },
50
- });
51
-
52
- // Read data from the table
53
- const data: Rljson = await ioMem.readRows({
54
- table: 'tableA',
55
- where: { _hash: (rowWithHash as any)._hash },
56
- });
57
-
58
- // Print the return rljson data
59
- console.log(JSON.stringify(data, null, 2));
60
- };
8
+ export const example = async () => {};
61
9
 
62
10
  // example();
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@rljson/io",
3
- "version": "0.0.23",
4
- "packageManager": "pnpm@10.6.2",
3
+ "version": "0.0.24",
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",
7
7
  "bugs": "https://github.com/rljson/io/issues",
@@ -59,7 +59,7 @@
59
59
  "@rljson/hash": "^0.0.15",
60
60
  "@rljson/is-ready": "^0.0.17",
61
61
  "@rljson/json": "^0.0.21",
62
- "@rljson/rljson": "^0.0.42",
62
+ "@rljson/rljson": "^0.0.43",
63
63
  "@rljson/validate": "^0.0.10"
64
64
  }
65
65
  }