@ultipa-graph/ultipa-driver 6.0.13 → 6.0.15

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/client.js CHANGED
@@ -45,6 +45,27 @@ const transaction_1 = require("./transaction");
45
45
  const types_1 = require("./types");
46
46
  const services_1 = require("./services");
47
47
  const index_1 = require("./services/index");
48
+ /**
49
+ * Map an `InsertType` value to the GQL keyword(s) selecting the
50
+ * matching server-side semantics.
51
+ *
52
+ * - `InsertType.Normal` -> `"INSERT"` (error on duplicate `_id`)
53
+ * - `InsertType.Overwrite` -> `"INSERT OVERWRITE"` (replace on duplicate)
54
+ * - `InsertType.Upsert` -> `"UPSERT"` (merge on duplicate)
55
+ *
56
+ * `Overwrite` and `Upsert` are different semantics on existing rows;
57
+ * they are NOT interchangeable. See {@link InsertType} docs.
58
+ */
59
+ function insertKeywordForType(type) {
60
+ switch (type) {
61
+ case types_1.InsertType.Overwrite:
62
+ return 'INSERT OVERWRITE';
63
+ case types_1.InsertType.Upsert:
64
+ return 'UPSERT';
65
+ default:
66
+ return 'INSERT';
67
+ }
68
+ }
48
69
  /** Main client for interacting with GQLDB */
49
70
  class GqldbClient {
50
71
  config;
@@ -70,13 +91,29 @@ class GqldbClient {
70
91
  const metadata = new grpc.Metadata();
71
92
  const session = this.sessions.getSession();
72
93
  metadata.add('session-id', session?.id?.toString() || '0');
94
+ if (this.clientSessionId) {
95
+ metadata.add('x-ultipa-session-id', this.clientSessionId);
96
+ }
73
97
  return metadata;
74
98
  }
99
+ /**
100
+ * Stable per-client logical session id surfaced under the
101
+ * transaction-branch model. See TRANSACTIONS_DRIVER_GUIDE.md §2.0–2.1.
102
+ * Falls back to a UUID v4 hex generated at construction when
103
+ * `config.sessionId` is not set.
104
+ */
105
+ clientSessionId;
75
106
  constructor(config) {
76
107
  (0, config_1.validateConfig)(config);
77
108
  this.config = config;
78
109
  this.sessions = new session_1.SessionManager();
79
110
  this.txManager = new transaction_1.TransactionManager();
111
+ // Bootstrap stable per-client session id (used as `x-ultipa-session-id`
112
+ // metadata when §2.1 opt-in is enabled, and surfaced on every Transaction).
113
+ const cfgSid = config.sessionId;
114
+ this.clientSessionId = cfgSid && cfgSid.length > 0
115
+ ? cfgSid
116
+ : require('crypto').randomBytes(16).toString('hex');
80
117
  // Create gRPC credentials
81
118
  let credentials;
82
119
  if (config.tlsOptions) {
@@ -97,7 +134,7 @@ class GqldbClient {
97
134
  const host = config.hosts[0];
98
135
  this.clients = (0, services_1.createServiceClients)(host, credentials, options);
99
136
  // Initialize service context
100
- const ctx = new index_1.ServiceContext(this.config, this.sessions, this.txManager, this.clients);
137
+ const ctx = new index_1.ServiceContext(this.config, this.sessions, this.txManager, this.clients, this.clientSessionId);
101
138
  // Initialize service instances
102
139
  this.sessionService = new index_1.SessionService(ctx);
103
140
  this.queryService = new index_1.QueryService(ctx);
@@ -239,7 +276,11 @@ class GqldbClient {
239
276
  // ===========================================================================
240
277
  /** Start a new transaction */
241
278
  async beginTransaction(graphName, readOnly = false, timeout = 0) {
242
- return this.transactionService.beginTransaction(graphName, readOnly, timeout);
279
+ const tx = await this.transactionService.beginTransaction(graphName, readOnly, timeout);
280
+ // Surface the per-client logical session id on the returned tx
281
+ // (transaction-branch ergonomic, see TRANSACTIONS_DRIVER_GUIDE.md).
282
+ tx.clientSessionId = this.clientSessionId;
283
+ return tx;
243
284
  }
244
285
  /** Commit a transaction */
245
286
  async commit(transactionId) {
@@ -257,6 +298,53 @@ class GqldbClient {
257
298
  async withTransaction(graphName, fn, readOnly = false) {
258
299
  return this.transactionService.withTransaction(graphName, fn, readOnly);
259
300
  }
301
+ // ---- Admin DDL surface (transaction-branch) -------------------------------
302
+ /**
303
+ * Return active transactions via the GQL admin DDL `SHOW TRANSACTIONS`.
304
+ * Each row mirrors the 5-column server-side schema:
305
+ * `transactionId / status / readOnly / startTime / sessionId`.
306
+ * `sessionId` is `''` unless the server has auto-derived one from peer
307
+ * info or the driver explicitly surfaces `x-ultipa-session-id` metadata.
308
+ *
309
+ * Distinct from `listTransactions()` which uses the legacy gRPC.
310
+ */
311
+ async showTransactions() {
312
+ const resp = await this.gql('SHOW TRANSACTIONS');
313
+ const idx = {};
314
+ resp.columns.forEach((c, i) => { idx[c] = i; });
315
+ const rows = [];
316
+ for (const row of resp.rows) {
317
+ const get = (n, fallback = '') => {
318
+ const i = idx[n];
319
+ return i === undefined ? fallback : row.values[i]?.value ?? row.values[i];
320
+ };
321
+ rows.push({
322
+ transactionId: String(get('transaction_id', '') ?? ''),
323
+ status: String(get('status', '') ?? ''),
324
+ readOnly: Boolean(get('read_only', false)),
325
+ startTime: String(get('start_time', '') ?? ''),
326
+ sessionId: String(get('session_id', '') ?? ''),
327
+ });
328
+ }
329
+ return rows;
330
+ }
331
+ /**
332
+ * Roll back a single transaction by id via `KILL TRANSACTION '<id>'`.
333
+ * `transactionId` here is the **string** id surfaced by
334
+ * `showTransactions()` (e.g. `'tx_a396c531-...'`), distinct from the
335
+ * `number` id returned by `begin()`.
336
+ */
337
+ async killTransaction(transactionId) {
338
+ const escaped = String(transactionId).replace(/'/g, "''");
339
+ return this.gql(`KILL TRANSACTION '${escaped}'`);
340
+ }
341
+ /**
342
+ * Roll back every active transaction via `RESET TRANSACTIONS`. Admin-only.
343
+ * Intended as an escape hatch when an orphan tx blocks new BEGINs.
344
+ */
345
+ async resetTransactions() {
346
+ return this.gql('RESET TRANSACTIONS');
347
+ }
260
348
  // ===========================================================================
261
349
  // Data Service
262
350
  // ===========================================================================
@@ -804,20 +892,14 @@ class GqldbClient {
804
892
  async stopTask(taskId, config) {
805
893
  return this.gql(`STOP TASK ${taskId}`, config);
806
894
  }
807
- // ===========================================================================
808
- // Convenience API Data Insert Operations (4 methods)
809
- // ===========================================================================
810
- /**
811
- * Insert nodes using GQL INSERT syntax with RETURN clause.
812
- * GQL: INSERT (n0:Label {p1: v1}), (n1:Label {p2: v2}) RETURN n0, n1
813
- * When config.insertType is InsertType.Overwrite, uses INSERT OVERWRITE syntax.
814
- * If NodeData.id is set (non-empty), includes it as _id property in the GQL.
815
- * Returns the raw Response containing the inserted nodes in columns n0, n1, etc.
816
- *
817
- * @param nodes Nodes to insert.
818
- * @param config Optional InsertConfig. Supports per-call graphName and insertType.
819
- */
820
- async insertNodes(nodes, config) {
895
+ async insertNodes(arg1, arg2, arg3) {
896
+ // Path 1: legacy bulk-gRPC signature (graphName, nodes, config?)
897
+ if (typeof arg1 === 'string') {
898
+ return this.dataService.insertNodes(arg1, arg2, arg3);
899
+ }
900
+ // Path 2: convenience GQL-emitter signature (nodes, config?)
901
+ const nodes = arg1;
902
+ const config = arg2;
821
903
  if (nodes.length === 0)
822
904
  return new response_1.Response([], [], 0, false, [], 0);
823
905
  nodes.forEach((node, i) => {
@@ -839,27 +921,21 @@ class GqldbClient {
839
921
  const propStr = (0, types_1.buildPropertiesValueString)(props);
840
922
  return propStr ? `(${varName}:${label} ${propStr})` : `(${varName}:${label})`;
841
923
  });
842
- const insertType = config?.insertType ?? types_1.InsertType.Normal;
843
- const insertKeyword = insertType === types_1.InsertType.Overwrite ? 'INSERT OVERWRITE' : 'INSERT';
924
+ const insertKeyword = insertKeywordForType(config?.insertType);
844
925
  const gqlStr = insertKeyword + ' ' + parts.join(', ') + ' RETURN ' + varNames.join(', ');
845
926
  return this.gql(gqlStr, config);
846
927
  }
847
- /**
848
- * Insert edges using GQL INSERT syntax with RETURN clause.
849
- * Each edge is inserted individually using MATCH + INSERT to resolve node IDs.
850
- * GQL: MATCH (src WHERE id(src) = 'from'), (dst WHERE id(dst) = 'to')
851
- * INSERT (src)-[e0:Label {p1: v1}]->(dst) RETURN e0
852
- * When config.insertType is InsertType.Overwrite, uses INSERT OVERWRITE syntax.
853
- * Returns a merged Response containing all inserted edges in columns e0, e1, etc.
854
- *
855
- * @param edges Edges to insert.
856
- * @param config Optional InsertConfig. Supports per-call graphName and insertType.
857
- */
858
- async insertEdges(edges, config) {
928
+ async insertEdges(arg1, arg2, arg3) {
929
+ // Path 1: legacy bulk-gRPC signature
930
+ if (typeof arg1 === 'string') {
931
+ return this.dataService.insertEdges(arg1, arg2, arg3);
932
+ }
933
+ // Path 2: convenience GQL-emitter signature
934
+ const edges = arg1;
935
+ const config = arg2;
859
936
  if (edges.length === 0)
860
937
  return new response_1.Response([], [], 0, false, [], 0);
861
- const insertType = config?.insertType ?? types_1.InsertType.Normal;
862
- const insertKeyword = insertType === types_1.InsertType.Overwrite ? 'INSERT OVERWRITE' : 'INSERT';
938
+ const insertKeyword = insertKeywordForType(config?.insertType);
863
939
  const allColumns = [];
864
940
  const allValues = [];
865
941
  let totalAffected = 0;
@@ -1310,4 +1386,4 @@ function parseGraphStats(resp) {
1310
1386
  }
1311
1387
  return gs;
1312
1388
  }
1313
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILG9EQUFzQztBQUV0QyxxQ0FBdUQ7QUFFdkQseUNBV29CO0FBQ3BCLHVDQUFvRDtBQUNwRCwrQ0FBZ0U7QUFDaEUsbUNBMkNpQjtBQUNqQix5Q0FBNEY7QUFDNUYsNENBVzBCO0FBMkMxQiw2Q0FBNkM7QUFDN0MsTUFBYSxXQUFXO0lBQ2QsTUFBTSxDQUFjO0lBQ3BCLE9BQU8sQ0FBaUI7SUFDeEIsUUFBUSxDQUFpQjtJQUN6QixTQUFTLENBQXFCO0lBQzlCLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFFdkIsd0NBQXdDO0lBQ2hDLGNBQWMsR0FBVyxFQUFFLENBQUM7SUFDNUIsY0FBYyxHQUFXLEVBQUUsQ0FBQztJQUM1QixXQUFXLEdBQVcsRUFBRSxDQUFDO0lBRWpDLG9CQUFvQjtJQUNaLGNBQWMsQ0FBaUI7SUFDL0IsWUFBWSxDQUFlO0lBQzNCLFlBQVksQ0FBZTtJQUMzQixrQkFBa0IsQ0FBcUI7SUFDdkMsV0FBVyxDQUFjO0lBQ3pCLGFBQWEsQ0FBZ0I7SUFDN0IsWUFBWSxDQUFlO0lBQzNCLGlCQUFpQixDQUFvQjtJQUU3QyxzREFBc0Q7SUFDOUMsa0JBQWtCO1FBQ3hCLE1BQU0sUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDM0MsUUFBUSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUMzRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsWUFBWSxNQUFtQjtRQUM3QixJQUFBLHVCQUFjLEVB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QU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFFRCxPQUFPLEVBQUUsQ0FBQztBQUNaLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1haW4gY2xpZW50IGZvciBHUUxEQiBOb2RlLmpzIGRyaXZlci5cbiAqL1xuXG5pbXBvcnQgKiBhcyBncnBjIGZyb20gJ0BncnBjL2dycGMtanMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJztcbmltcG9ydCB7IEdxbGRiQ29uZmlnLCB2YWxpZGF0ZUNvbmZpZyB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7IEVtcHR5UXVlcnlFcnJvciwgTG9naW5GYWlsZWRFcnJvciwgUXVlcnlGYWlsZWRFcnJvciB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7XG4gIFJlc3BvbnNlLFxuICBSb3csXG4gIEluc2VydE5vZGVzUmVzdWx0LFxuICBJbnNlcnRFZGdlc1Jlc3VsdCxcbiAgRGVsZXRlUmVzdWx0LFxuICBFeHBvcnROb2Rlc1Jlc3VsdCxcbiAgRXhwb3J0RWRnZXNSZXN1bHQsXG4gIEV4cG9ydENvbmZpZyxcbiAgRXhwb3J0Q2h1bmssXG4gIEV4cG9ydFN0YXRzLFxufSBmcm9tICcuL3Jlc3BvbnNlJztcbmltcG9ydCB7IFNlc3Npb24sIFNlc3Npb25NYW5hZ2VyIH0gZnJvbSAnLi9zZXNzaW9uJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvbk1hbmFnZXIgfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7XG4gIEdyYXBoSW5mbyxcbiAgR3JhcGhUeXBlLFxuICBIZWFsdGhTdGF0dXMsXG4gIENhY2hlU3RhdHMsXG4gIENhY2hlVHlwZSxcbiAgU3RhdGlzdGljcyxcbiAgQ29tcGFjdFJlc3VsdCxcbiAgQ29tcHV0ZVRvcG9sb2d5UmVzdWx0LFxuICBTeXN0ZW1NZXRyaWNzLFxuICBOb2RlRGF0YSxcbiAgRWRnZURhdGEsXG4gIEJ1bGtDcmVhdGVOb2Rlc09wdGlvbnMsXG4gIEJ1bGtDcmVhdGVFZGdlc09wdGlvbnMsXG4gIEJ1bGtJbXBvcnRPcHRpb25zLFxuICBCdWxrSW1wb3J0U2Vzc2lvbixcbiAgQ2hlY2twb2ludFJlc3VsdCxcbiAgRW5kQnVsa0ltcG9ydFJlc3VsdCxcbiAgQWJvcnRCdWxrSW1wb3J0UmVzdWx0LFxuICBCdWxrSW1wb3J0U3RhdHVzLFxuICBUcmFuc2FjdGlvbkluZm8sXG4gIERCVHlwZSxcbiAgSW5zZXJ0VHlwZSxcbiAgTGFiZWxJbmZvLFxuICBOb2RlVHlwZUluZm8sXG4gIEVkZ2VUeXBlSW5mbyxcbiAgTGFiZWxEZWYsXG4gIENvbnZQcm9wZXJ0eURlZixcbiAgSW5kZXhQcm9wZXJ0eSxcbiAgSW5kZXhJbmZvLFxuICBGdWxsdGV4dEluZm8sXG4gIFRhc2tJbmZvLFxuICBQcm9jZXNzSW5mbyxcbiAgR3JhcGhTdGF0cyxcbiAgQWxnb0luZm8sXG4gIEFpU3RhZ2UsXG4gIEFpUmVhZFJlc3VsdCxcbiAgcGFyc2VQcm9wZXJ0eVN0cmluZyxcbiAgYnVpbGRQcm9wZXJ0eURlZlN0cmluZyxcbiAgYnVpbGRJbmRleFByb3BlcnR5U3RyaW5nLFxuICBidWlsZFByb3BlcnRpZXNWYWx1ZVN0cmluZyxcbiAgdXNlR3JhcGhQcmVmaXgsXG4gIGRiVHlwZVRvS2V5d29yZCxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVTZXJ2aWNlQ2xpZW50cywgcHJvbWlzaWZ5Q2FsbCwgcHJvbWlzaWZ5Q2FsbFdpdGhEZWFkbGluZSB9IGZyb20gJy4vc2VydmljZXMnO1xuaW1wb3J0IHtcbiAgU2VydmljZUNvbnRleHQsXG4gIFNlcnZpY2VDbGllbnRzLFxuICBTZXNzaW9uU2VydmljZSxcbiAgUXVlcnlTZXJ2aWNlLFxuICBHcmFwaFNlcnZpY2UsXG4gIFRyYW5zYWN0aW9uU2VydmljZSxcbiAgRGF0YVNlcnZpY2UsXG4gIEhlYWx0aFNlcnZpY2UsXG4gIEFkbWluU2VydmljZSxcbiAgQnVsa0ltcG9ydFNlcnZpY2UsXG59IGZyb20gJy4vc2VydmljZXMvaW5kZXgnO1xuXG4vKiogQ29uZmlndXJhdGlvbiBmb3IgYSBxdWVyeSAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWVyeUNvbmZpZyB7XG4gIGdyYXBoTmFtZT86IHN0cmluZztcbiAgcGFyYW1ldGVycz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIHRyYW5zYWN0aW9uSWQ/OiBudW1iZXI7XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG4gIHJlYWRPbmx5PzogYm9vbGVhbjtcbiAgLyoqIE1heCBwYXRocyB0byByZXR1cm4gZnJvbSBwYXRoIHF1ZXJpZXMgKDAgPSB1bmxpbWl0ZWQpICovXG4gIG1heFBhdGhSZXN1bHRzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGluc2VydE5vZGVzIC8gaW5zZXJ0RWRnZXMgY29udmVuaWVuY2UgbWV0aG9kcy5cbiAqIEV4dGVuZHMgUXVlcnlDb25maWcgd2l0aCBpbnNlcnQtc3BlY2lmaWMgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnNlcnRDb25maWcgZXh0ZW5kcyBRdWVyeUNvbmZpZyB7XG4gIC8qKiBJbnNlcnQgbW9kZS4gRGVmYXVsdHMgdG8gSW5zZXJ0VHlwZS5Ob3JtYWwgd2hlbiBvbWl0dGVkLiAqL1xuICBpbnNlcnRUeXBlPzogSW5zZXJ0VHlwZTtcbn1cblxuLyoqIENvbmZpZ3VyYXRpb24gZm9yIGluc2VydCBub2RlcyAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnNlcnROb2Rlc0NvbmZpZyB7XG4gIG9wdGlvbnM/OiBCdWxrQ3JlYXRlTm9kZXNPcHRpb25zO1xuICBidWxrSW1wb3J0U2Vzc2lvbklkPzogc3RyaW5nO1xufVxuXG4vKiogQ29uZmlndXJhdGlvbiBmb3IgaW5zZXJ0IGVkZ2VzICovXG5leHBvcnQgaW50ZXJmYWNlIEluc2VydEVkZ2VzQ29uZmlnIHtcbiAgb3B0aW9ucz86IEJ1bGtDcmVhdGVFZGdlc09wdGlvbnM7XG4gIGJ1bGtJbXBvcnRTZXNzaW9uSWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogSGVhbHRoIHdhdGNoZXIgaW50ZXJmYWNlIGZvciBzdHJlYW1pbmcgaGVhbHRoIHVwZGF0ZXMuXG4gKiBFbWl0cyAnc3RhdHVzJyBldmVudHMgd2l0aCBIZWFsdGhTdGF0dXMgYW5kICdlcnJvcicgZXZlbnRzIG9uIGZhaWx1cmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGVhbHRoV2F0Y2hlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIC8qKiBTdG9wIHdhdGNoaW5nIGhlYWx0aCB1cGRhdGVzICovXG4gIHN0b3AoKTogdm9pZDtcbn1cblxuLyoqIE1haW4gY2xpZW50IGZvciBpbnRlcmFjdGluZyB3aXRoIEdRTERCICovXG5leHBvcnQgY2xhc3MgR3FsZGJDbGllbnQge1xuICBwcml2YXRlIGNvbmZpZzogR3FsZGJDb25maWc7XG4gIHByaXZhdGUgY2xpZW50czogU2VydmljZUNsaWVudHM7XG4gIHByaXZhdGUgc2Vzc2lvbnM6IFNlc3Npb25NYW5hZ2VyO1xuICBwcml2YXRlIHR4TWFuYWdlcjogVHJhbnNhY3Rpb25NYW5hZ2VyO1xuICBwcml2YXRlIGNsb3NlZCA9IGZhbHNlO1xuXG4gIC8vIFN0b3JlZCBjcmVkZW50aWFscyBmb3IgYXV0by1yZWNvbm5lY3RcbiAgcHJpdmF0ZSBzdG9yZWRVc2VybmFtZTogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgc3RvcmVkUGFzc3dvcmQ6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIHN0b3JlZEdyYXBoOiBzdHJpbmcgPSAnJztcblxuICAvLyBTZXJ2aWNlIGluc3RhbmNlc1xuICBwcml2YXRlIHNlc3Npb25TZXJ2aWNlOiBTZXNzaW9uU2VydmljZTtcbiAgcHJpdmF0ZSBxdWVyeVNlcnZpY2U6IFF1ZXJ5U2VydmljZTtcbiAgcHJpdmF0ZSBncmFwaFNlcnZpY2U6IEdyYXBoU2VydmljZTtcbiAgcHJpdmF0ZSB0cmFuc2FjdGlvblNlcnZpY2U6IFRyYW5zYWN0aW9uU2VydmljZTtcbiAgcHJpdmF0ZSBkYXRhU2VydmljZTogRGF0YVNlcnZpY2U7XG4gIHByaXZhdGUgaGVhbHRoU2VydmljZTogSGVhbHRoU2VydmljZTtcbiAgcHJpdmF0ZSBhZG1pblNlcnZpY2U6IEFkbWluU2VydmljZTtcbiAgcHJpdmF0ZSBidWxrSW1wb3J0U2VydmljZTogQnVsa0ltcG9ydFNlcnZpY2U7XG5cbiAgLyoqIEdldCBzZXNzaW9uIG1ldGFkYXRhIGZvciBhdXRoZW50aWNhdGVkIHJlcXVlc3RzICovXG4gIHByaXZhdGUgZ2V0U2Vzc2lvbk1ldGFkYXRhKCk6IGdycGMuTWV0YWRhdGEge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gbmV3IGdycGMuTWV0YWRhdGEoKTtcbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5zZXNzaW9ucy5nZXRTZXNzaW9uKCk7XG4gICAgbWV0YWRhdGEuYWRkKCdzZXNzaW9uLWlkJywgc2Vzc2lvbj8uaWQ/LnRvU3RyaW5nKCkgfHwgJzAnKTtcbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IEdxbGRiQ29uZmlnKSB7XG4gICAgdmFsaWRhdGVDb25maWcoY29uZmlnKTtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLnNlc3Npb25zID0gbmV3IFNlc3Npb25NYW5hZ2VyKCk7XG4gICAgdGhpcy50eE1hbmFnZXIgPSBuZXcgVHJhbnNhY3Rpb25NYW5hZ2VyKCk7XG5cbiAgICAvLyBDcmVhdGUgZ1JQQyBjcmVkZW50aWFsc1xuICAgIGxldCBjcmVkZW50aWFsczogZ3JwYy5DaGFubmVsQ3JlZGVudGlhbHM7XG4gICAgaWYgKGNvbmZpZy50bHNPcHRpb25zKSB7XG4gICAgICBjcmVkZW50aWFscyA9IGdycGMuY3JlZGVudGlhbHMuY3JlYXRlU3NsKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNyZWRlbnRpYWxzID0gZ3JwYy5jcmVkZW50aWFscy5jcmVhdGVJbnNlY3VyZSgpO1xuICAgIH1cblxuICAgIC8vIENoYW5uZWwgb3B0aW9uc1xuICAgIGNvbnN0IG9wdGlvbnM6IGdycGMuQ2hhbm5lbE9wdGlvbnMgPSB7XG4gICAgICAnZ3JwYy5tYXhfcmVjZWl2ZV9tZXNzYWdlX2xlbmd0aCc6IGNvbmZpZy5tYXhSZWN2U2l6ZSA/PyA2NCAqIDEwMjQgKiAxMDI0LFxuICAgICAgJ2dycGMubWF4X3NlbmRfbWVzc2FnZV9sZW5ndGgnOiBjb25maWcubWF4UmVjdlNpemUgPz8gNjQgKiAxMDI0ICogMTAyNCxcbiAgICAgICdncnBjLmtlZXBhbGl2ZV90aW1lX21zJzogMzAwMDAsXG4gICAgICAnZ3JwYy5rZWVwYWxpdmVfdGltZW91dF9tcyc6IDEwMDAwLFxuICAgICAgJ2dycGMua2VlcGFsaXZlX3Blcm1pdF93aXRob3V0X2NhbGxzJzogMSxcbiAgICB9O1xuXG4gICAgLy8gQ3JlYXRlIHNlcnZpY2UgY2xpZW50cyBmb3IgdGhlIGZpcnN0IGhvc3RcbiAgICBjb25zdCBob3N0ID0gY29uZmlnLmhvc3RzWzBdO1xuICAgIHRoaXMuY2xpZW50cyA9IGNyZWF0ZVNlcnZpY2VDbGllbnRzKGhvc3QsIGNyZWRlbnRpYWxzLCBvcHRpb25zKTtcblxuICAgIC8vIEluaXRpYWxpemUgc2VydmljZSBjb250ZXh0XG4gICAgY29uc3QgY3R4ID0gbmV3IFNlcnZpY2VDb250ZXh0KHRoaXMuY29uZmlnLCB0aGlzLnNlc3Npb25zLCB0aGlzLnR4TWFuYWdlciwgdGhpcy5jbGllbnRzKTtcblxuICAgIC8vIEluaXRpYWxpemUgc2VydmljZSBpbnN0YW5jZXNcbiAgICB0aGlzLnNlc3Npb25TZXJ2aWNlID0gbmV3IFNlc3Npb25TZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5xdWVyeVNlcnZpY2UgPSBuZXcgUXVlcnlTZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5ncmFwaFNlcnZpY2UgPSBuZXcgR3JhcGhTZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy50cmFuc2FjdGlvblNlcnZpY2UgPSBuZXcgVHJhbnNhY3Rpb25TZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5kYXRhU2VydmljZSA9IG5ldyBEYXRhU2VydmljZShjdHgpO1xuICAgIHRoaXMuaGVhbHRoU2VydmljZSA9IG5ldyBIZWFsdGhTZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5hZG1pblNlcnZpY2UgPSBuZXcgQWRtaW5TZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5idWxrSW1wb3J0U2VydmljZSA9IG5ldyBCdWxrSW1wb3J0U2VydmljZShjdHgpO1xuICB9XG5cbiAgLyoqIENsb3NlIHRoZSBjbGllbnQgYW5kIGFsbCBjb25uZWN0aW9ucyAqL1xuICBhc3luYyBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jbG9zZWQpIHJldHVybjtcbiAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG5cbiAgICBpZiAodGhpcy5zZXNzaW9ucy5pc0xvZ2dlZEluKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9nb3V0KCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIElnbm9yZSBsb2dvdXQgZXJyb3JzIGR1cmluZyBjbG9zZVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENsb3NlIGFsbCBzZXJ2aWNlIGNsaWVudHNcbiAgICB0cnkge1xuICAgICAgKHRoaXMuY2xpZW50cy5zZXNzaW9uU2VydmljZSBhcyBhbnkpLmNsb3NlPy4oKTtcbiAgICAgICh0aGlzLmNsaWVudHMucXVlcnlTZXJ2aWNlIGFzIGFueSkuY2xvc2U/LigpO1xuICAgICAgKHRoaXMuY2xpZW50cy5ncmFwaFNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XG4gICAgICAodGhpcy5jbGllbnRzLnRyYW5zYWN0aW9uU2VydmljZSBhcyBhbnkpLmNsb3NlPy4oKTtcbiAgICAgICh0aGlzLmNsaWVudHMuZGF0YVNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XG4gICAgICAodGhpcy5jbGllbnRzLmhlYWx0aFNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XG4gICAgICAodGhpcy5jbGllbnRzLmFkbWluU2VydmljZSBhcyBhbnkpLmNsb3NlPy4oKTtcbiAgICAgICh0aGlzLmNsaWVudHMuYnVsa0ltcG9ydFNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWdub3JlIGNsb3NlIGVycm9yc1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTZXNzaW9uIFNlcnZpY2VcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEF1dGhlbnRpY2F0ZSB0aGUgdXNlciBhbmQgY3JlYXRlIGEgc2Vzc2lvbiAqL1xuICBhc3luYyBsb2dpbih1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxTZXNzaW9uPiB7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHRoaXMuc2Vzc2lvblNlcnZpY2UubG9naW4odXNlcm5hbWUsIHBhc3N3b3JkLCB0aGlzLmNvbmZpZy5kZWZhdWx0R3JhcGggfHwgJycpO1xuICAgIC8vIFN0b3JlIGNyZWRlbnRpYWxzIGZvciBhdXRvLXJlY29ubmVjdFxuICAgIHRoaXMuc3RvcmVkVXNlcm5hbWUgPSB1c2VybmFtZTtcbiAgICB0aGlzLnN0b3JlZFBhc3N3b3JkID0gcGFzc3dvcmQ7XG4gICAgcmV0dXJuIHNlc3Npb247XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBmbiBhbmQgYXV0by1yZWNvbm5lY3Qgb24gVU5BVVRIRU5USUNBVEVEIGVycm9yLlxuICAgKiBJZiBmbiB0aHJvd3MgYW4gVU5BVVRIRU5USUNBVEVEIGdSUEMgZXJyb3IgYW5kIGNyZWRlbnRpYWxzIGFyZSBzdG9yZWQsXG4gICAqIHJlLWxvZ2luIGFuZCByZXRyeSBmbiBvbmNlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3aXRoQXV0b1JlY29ubmVjdDxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGNvbnN0IG1zZ0xvd2VyID0gZT8ubWVzc2FnZSA/IFN0cmluZyhlLm1lc3NhZ2UpLnRvTG93ZXJDYXNlKCkgOiAnJztcbiAgICAgIGNvbnN0IGlzVW5hdXRoZW50aWNhdGVkID1cbiAgICAgICAgKGU/LmNvZGUgPT09IGdycGMuc3RhdHVzLlVOQVVUSEVOVElDQVRFRCkgfHxcbiAgICAgICAgbXNnTG93ZXIuaW5jbHVkZXMoJ3VuYXV0aGVudGljYXRlZCcpIHx8XG4gICAgICAgIG1zZ0xvd2VyLmluY2x1ZGVzKCdzZXNzaW9uIG5vdCBmb3VuZCcpIHx8XG4gICAgICAgIG1zZ0xvd2VyLmluY2x1ZGVzKCdzZXNzaW9uIGV4cGlyZWQnKTtcbiAgICAgIGlmIChpc1VuYXV0aGVudGljYXRlZCAmJiB0aGlzLnN0b3JlZFVzZXJuYW1lKSB7XG4gICAgICAgIC8vIFNhdmUgY3VycmVudCBncmFwaCBjb250ZXh0IGJlZm9yZSByZS1sb2dpblxuICAgICAgICBjb25zdCBzYXZlZEdyYXBoID0gdGhpcy5zdG9yZWRHcmFwaDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmxvZ2luKHRoaXMuc3RvcmVkVXNlcm5hbWUsIHRoaXMuc3RvcmVkUGFzc3dvcmQpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICB0aHJvdyBlOyAvLyBSZXR1cm4gb3JpZ2luYWwgZXJyb3IgaWYgcmUtbG9naW4gZmFpbHNcbiAgICAgICAgfVxuICAgICAgICAvLyBSZXN0b3JlIGdyYXBoIGNvbnRleHQgYWZ0ZXIgcmUtbG9naW5cbiAgICAgICAgaWYgKHNhdmVkR3JhcGggJiYgc2F2ZWRHcmFwaCAhPT0gJ19fc3lzdGVtX18nKSB7XG4gICAgICAgICAgdHJ5IHsgYXdhaXQgdGhpcy51c2VHcmFwaChzYXZlZEdyYXBoKTsgfSBjYXRjaCB7IC8qIGJlc3QgZWZmb3J0ICovIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm4oKTsgLy8gUmV0cnkgb25jZVxuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICAvKiogVGVybWluYXRlIHRoZSBjdXJyZW50IHNlc3Npb24gKi9cbiAgYXN5bmMgbG9nb3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25TZXJ2aWNlLmxvZ291dCgpO1xuICB9XG5cbiAgLyoqIENoZWNrIHRoZSBjb25uZWN0aW9uIGFuZCByZXR1cm4gdGhlIGxhdGVuY3kgaW4gbmFub3NlY29uZHMgKi9cbiAgYXN5bmMgcGluZygpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25TZXJ2aWNlLnBpbmcoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBRdWVyeSBTZXJ2aWNlXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBFeGVjdXRlIGEgR1FMIHF1ZXJ5IGFuZCByZXR1cm4gdGhlIHJlc3VsdCAqL1xuICBhc3luYyBncWwocXVlcnk6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMud2l0aEF1dG9SZWNvbm5lY3QoKCkgPT4gdGhpcy5xdWVyeVNlcnZpY2UuZ3FsKHF1ZXJ5LCBjb25maWcpKTtcbiAgfVxuXG4gIC8qKiBFeGVjdXRlIGEgR1FMIHF1ZXJ5IGFuZCBzdHJlYW0gdGhlIHJlc3VsdHMgKi9cbiAgYXN5bmMgZ3FsU3RyZWFtKFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICAgY29uZmlnPzogUXVlcnlDb25maWcsXG4gICAgY2FsbGJhY2s/OiAocmVzcG9uc2U6IFJlc3BvbnNlKSA9PiB2b2lkXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLndpdGhBdXRvUmVjb25uZWN0KCgpID0+IHRoaXMucXVlcnlTZXJ2aWNlLmdxbFN0cmVhbShxdWVyeSwgY29uZmlnLCBjYWxsYmFjaykpO1xuICB9XG5cbiAgLyoqIFJldHVybiB0aGUgZXhlY3V0aW9uIHBsYW4gZm9yIGEgcXVlcnkgKi9cbiAgYXN5bmMgZXhwbGFpbihxdWVyeTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMud2l0aEF1dG9SZWNvbm5lY3QoKCkgPT4gdGhpcy5xdWVyeVNlcnZpY2UuZXhwbGFpbihxdWVyeSwgY29uZmlnKSk7XG4gIH1cblxuICAvKiogRXhlY3V0ZSBhIHF1ZXJ5IHdpdGggcHJvZmlsaW5nIGFuZCByZXR1cm4gc3RhdGlzdGljcyAqL1xuICBhc3luYyBwcm9maWxlKHF1ZXJ5OiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy53aXRoQXV0b1JlY29ubmVjdCgoKSA9PiB0aGlzLnF1ZXJ5U2VydmljZS5wcm9maWxlKHF1ZXJ5LCBjb25maWcpKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBHcmFwaCBTZXJ2aWNlXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBDcmVhdGUgYSBuZXcgZ3JhcGggKi9cbiAgYXN5bmMgY3JlYXRlR3JhcGgoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGdyYXBoVHlwZTogR3JhcGhUeXBlID0gR3JhcGhUeXBlLk9QRU4sXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyA9ICcnXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmdyYXBoU2VydmljZS5jcmVhdGVHcmFwaChuYW1lLCBncmFwaFR5cGUsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIC8qKiBEZWxldGUgYSBncmFwaCAqL1xuICBhc3luYyBkcm9wR3JhcGgobmFtZTogc3RyaW5nLCBpZkV4aXN0czogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhcGhTZXJ2aWNlLmRyb3BHcmFwaChuYW1lLCBpZkV4aXN0cyk7XG4gIH1cblxuICAvKiogU2V0IHRoZSBjdXJyZW50IGdyYXBoIGZvciB0aGUgc2Vzc2lvbiAqL1xuICBhc3luYyB1c2VHcmFwaChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmdyYXBoU2VydmljZS51c2VHcmFwaChuYW1lKTtcbiAgICB0aGlzLnN0b3JlZEdyYXBoID0gbmFtZTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWxsIGF2YWlsYWJsZSBncmFwaHMgKi9cbiAgYXN5bmMgbGlzdEdyYXBocygpOiBQcm9taXNlPEdyYXBoSW5mb1tdPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhcGhTZXJ2aWNlLmxpc3RHcmFwaHMoKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBncmFwaCAqL1xuICBhc3luYyBnZXRHcmFwaEluZm8obmFtZTogc3RyaW5nKTogUHJvbWlzZTxHcmFwaEluZm8+IHtcbiAgICByZXR1cm4gdGhpcy5ncmFwaFNlcnZpY2UuZ2V0R3JhcGhJbmZvKG5hbWUpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFRyYW5zYWN0aW9uIFNlcnZpY2VcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIFN0YXJ0IGEgbmV3IHRyYW5zYWN0aW9uICovXG4gIGFzeW5jIGJlZ2luVHJhbnNhY3Rpb24oXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgcmVhZE9ubHk6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICB0aW1lb3V0OiBudW1iZXIgPSAwXG4gICk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvblNlcnZpY2UuYmVnaW5UcmFuc2FjdGlvbihncmFwaE5hbWUsIHJlYWRPbmx5LCB0aW1lb3V0KTtcbiAgfVxuXG4gIC8qKiBDb21taXQgYSB0cmFuc2FjdGlvbiAqL1xuICBhc3luYyBjb21taXQodHJhbnNhY3Rpb25JZDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25TZXJ2aWNlLmNvbW1pdCh0cmFuc2FjdGlvbklkKTtcbiAgfVxuXG4gIC8qKiBSb2xsYmFjayBhIHRyYW5zYWN0aW9uICovXG4gIGFzeW5jIHJvbGxiYWNrKHRyYW5zYWN0aW9uSWQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uU2VydmljZS5yb2xsYmFjayh0cmFuc2FjdGlvbklkKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWN0aXZlIHRyYW5zYWN0aW9ucyAqL1xuICBhc3luYyBsaXN0VHJhbnNhY3Rpb25zKCk6IFByb21pc2U8VHJhbnNhY3Rpb25JbmZvW10+IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvblNlcnZpY2UubGlzdFRyYW5zYWN0aW9ucygpO1xuICB9XG5cbiAgLyoqIEV4ZWN1dGUgYSBmdW5jdGlvbiB3aXRoaW4gYSB0cmFuc2FjdGlvbiAqL1xuICBhc3luYyB3aXRoVHJhbnNhY3Rpb248VD4oXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgZm46ICh0eElkOiBudW1iZXIpID0+IFByb21pc2U8VD4sXG4gICAgcmVhZE9ubHk6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvblNlcnZpY2Uud2l0aFRyYW5zYWN0aW9uKGdyYXBoTmFtZSwgZm4sIHJlYWRPbmx5KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBEYXRhIFNlcnZpY2VcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEluc2VydCBtdWx0aXBsZSBub2RlcyBpbnRvIGEgZ3JhcGggdXNpbmcgZ1JQQyBidWxrIGluc2VydCAqL1xuICBhc3luYyBpbnNlcnROb2Rlc0JhdGNoQXV0byhcbiAgICBncmFwaE5hbWU6IHN0cmluZyxcbiAgICBub2RlczogTm9kZURhdGFbXSxcbiAgICBjb25maWc/OiBJbnNlcnROb2Rlc0NvbmZpZ1xuICApOiBQcm9taXNlPEluc2VydE5vZGVzUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2UuaW5zZXJ0Tm9kZXMoZ3JhcGhOYW1lLCBub2RlcywgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBJbnNlcnQgbXVsdGlwbGUgZWRnZXMgaW50byBhIGdyYXBoIHVzaW5nIGdSUEMgYnVsayBpbnNlcnQgKi9cbiAgYXN5bmMgaW5zZXJ0RWRnZXNCYXRjaEF1dG8oXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgZWRnZXM6IEVkZ2VEYXRhW10sXG4gICAgY29uZmlnPzogSW5zZXJ0RWRnZXNDb25maWdcbiAgKTogUHJvbWlzZTxJbnNlcnRFZGdlc1Jlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLmluc2VydEVkZ2VzKGdyYXBoTmFtZSwgZWRnZXMsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogRGVsZXRlIG5vZGVzIGZyb20gYSBncmFwaCAqL1xuICBhc3luYyBkZWxldGVOb2RlcyhcbiAgICBncmFwaE5hbWU6IHN0cmluZyxcbiAgICBub2RlSWRzPzogc3RyaW5nW10sXG4gICAgbGFiZWxzPzogc3RyaW5nW10sXG4gICAgd2hlcmU/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxEZWxldGVSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5kZWxldGVOb2RlcyhncmFwaE5hbWUsIG5vZGVJZHMsIGxhYmVscywgd2hlcmUpO1xuICB9XG5cbiAgLyoqIERlbGV0ZSBlZGdlcyBmcm9tIGEgZ3JhcGggKi9cbiAgYXN5bmMgZGVsZXRlRWRnZXMoXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgZWRnZUlkcz86IHN0cmluZ1tdLFxuICAgIGxhYmVsPzogc3RyaW5nLFxuICAgIHdoZXJlPzogc3RyaW5nXG4gICk6IFByb21pc2U8RGVsZXRlUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2UuZGVsZXRlRWRnZXMoZ3JhcGhOYW1lLCBlZGdlSWRzLCBsYWJlbCwgd2hlcmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCBncmFwaCBkYXRhIGluIEpTT04gTGluZXMgZm9ybWF0IChzdHJlYW1pbmcpLlxuICAgKiBAcGFyYW0gY29uZmlnIEV4cG9ydCBjb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSBjYWxsYmFjayBDYWxsYmFjayBmb3IgZWFjaCBleHBvcnRlZCBjaHVua1xuICAgKi9cbiAgYXN5bmMgZXhwb3J0KFxuICAgIGNvbmZpZzogRXhwb3J0Q29uZmlnLFxuICAgIGNhbGxiYWNrPzogKGNodW5rOiBFeHBvcnRDaHVuaykgPT4gdm9pZFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5leHBvcnQoY29uZmlnLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogU3RyZWFtIG5vZGVzIGZyb20gYSBncmFwaFxuICAgKiBAZGVwcmVjYXRlZCBVc2UgZXhwb3J0KCkgd2l0aCBFeHBvcnRDb25maWcgaW5zdGVhZFxuICAgKi9cbiAgYXN5bmMgZXhwb3J0Tm9kZXMoXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgbGFiZWxzPzogc3RyaW5nW10sXG4gICAgbGltaXQ6IG51bWJlciA9IDAsXG4gICAgY2FsbGJhY2s/OiAocmVzdWx0OiBFeHBvcnROb2Rlc1Jlc3VsdCkgPT4gdm9pZFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5leHBvcnROb2RlcyhncmFwaE5hbWUsIGxhYmVscywgbGltaXQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJlYW0gZWRnZXMgZnJvbSBhIGdyYXBoXG4gICAqIEBkZXByZWNhdGVkIFVzZSBleHBvcnQoKSB3aXRoIEV4cG9ydENvbmZpZyBpbnN0ZWFkXG4gICAqL1xuICBhc3luYyBleHBvcnRFZGdlcyhcbiAgICBncmFwaE5hbWU6IHN0cmluZyxcbiAgICBsYWJlbHM/OiBzdHJpbmdbXSxcbiAgICBsaW1pdDogbnVtYmVyID0gMCxcbiAgICBjYWxsYmFjaz86IChyZXN1bHQ6IEV4cG9ydEVkZ2VzUmVzdWx0KSA9PiB2b2lkXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLmV4cG9ydEVkZ2VzKGdyYXBoTmFtZSwgbGFiZWxzLCBsaW1pdCwgY2FsbGJhY2spO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEhlYWx0aCBTZXJ2aWNlXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBDaGVjayB0aGUgaGVhbHRoIG9mIGEgc2VydmljZSAqL1xuICBhc3luYyBoZWFsdGhDaGVjayhzZXJ2aWNlOiBzdHJpbmcgPSAnJyk6IFByb21pc2U8SGVhbHRoU3RhdHVzPiB7XG4gICAgcmV0dXJuIHRoaXMuaGVhbHRoU2VydmljZS5oZWFsdGhDaGVjayhzZXJ2aWNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYXRjaCBoZWFsdGggc3RhdHVzIGNoYW5nZXMgdmlhIHNlcnZlci1zaWRlIHN0cmVhbWluZy5cbiAgICogUmV0dXJucyBhIEhlYWx0aFdhdGNoZXIgdGhhdCBlbWl0cyAnc3RhdHVzJyBldmVudHMgd2l0aCBIZWFsdGhTdGF0dXMgdmFsdWVzLlxuICAgKiBDYWxsIHN0b3AoKSB0byBjYW5jZWwgdGhlIHN0cmVhbS5cbiAgICpcbiAgICogQHBhcmFtIHNlcnZpY2UgLSBPcHRpb25hbCBzZXJ2aWNlIG5hbWUgdG8gd2F0Y2hcbiAgICogQHJldHVybnMgSGVhbHRoV2F0Y2hlciAtIEV2ZW50RW1pdHRlciB3aXRoIHN0b3AoKSBtZXRob2RcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB3YXRjaGVyID0gY2xpZW50LndhdGNoKCk7XG4gICAqIHdhdGNoZXIub24oJ3N0YXR1cycsIChzdGF0dXM6IEhlYWx0aFN0YXR1cykgPT4ge1xuICAgKiAgIGNvbnNvbGUubG9nKCdIZWFsdGggc3RhdHVzOicsIHN0YXR1cyk7XG4gICAqIH0pO1xuICAgKiB3YXRjaGVyLm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICogICBjb25zb2xlLmVycm9yKCdXYXRjaCBlcnJvcjonLCBlcnIpO1xuICAgKiB9KTtcbiAgICogd2F0Y2hlci5vbignZW5kJywgKCkgPT4ge1xuICAgKiAgIGNvbnNvbGUubG9nKCdXYXRjaCBzdHJlYW0gZW5kZWQnKTtcbiAgICogfSk7XG4gICAqIC8vIExhdGVyLCB0byBzdG9wIHdhdGNoaW5nOlxuICAgKiB3YXRjaGVyLnN0b3AoKTtcbiAgICogYGBgXG4gICAqL1xuICB3YXRjaChzZXJ2aWNlOiBzdHJpbmcgPSAnJyk6IEhlYWx0aFdhdGNoZXIge1xuICAgIHJldHVybiB0aGlzLmhlYWx0aFNlcnZpY2Uud2F0Y2goc2VydmljZSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQWRtaW4gU2VydmljZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogUHJlLWFsbG9jYXRlIHBhcnNlciBpbnN0YW5jZXMgKi9cbiAgYXN5bmMgd2FybXVwUGFyc2VyKGNvdW50OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5hZG1pblNlcnZpY2Uud2FybXVwUGFyc2VyKGNvdW50KTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gY2FjaGUgc3RhdGlzdGljcyAqL1xuICBhc3luYyBnZXRDYWNoZVN0YXRzKGNhY2hlVHlwZTogQ2FjaGVUeXBlID0gQ2FjaGVUeXBlLkFMTCk6IFByb21pc2U8Q2FjaGVTdGF0cz4ge1xuICAgIHJldHVybiB0aGlzLmFkbWluU2VydmljZS5nZXRDYWNoZVN0YXRzKGNhY2hlVHlwZSk7XG4gIH1cblxuICAvKiogQ2xlYXIgdGhlIHNwZWNpZmllZCBjYWNoZSAqL1xuICBhc3luYyBjbGVhckNhY2hlKGNhY2hlVHlwZTogQ2FjaGVUeXBlID0gQ2FjaGVUeXBlLkFMTCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmFkbWluU2VydmljZS5jbGVhckNhY2hlKGNhY2hlVHlwZSk7XG4gIH1cblxuICAvKiogUmV0dXJuIGRhdGFiYXNlIHN0YXRpc3RpY3MgKi9cbiAgYXN5bmMgZ2V0U3RhdGlzdGljcyhncmFwaE5hbWU6IHN0cmluZyA9ICcnKTogUHJvbWlzZTxTdGF0aXN0aWNzPiB7XG4gICAgcmV0dXJuIHRoaXMuYWRtaW5TZXJ2aWNlLmdldFN0YXRpc3RpY3MoZ3JhcGhOYW1lKTtcbiAgfVxuXG4gIC8qKiBJbnZhbGlkYXRlIHRoZSBSQkFDIHBlcm1pc3Npb24gY2FjaGUgKi9cbiAgYXN5bmMgaW52YWxpZGF0ZVBlcm1pc3Npb25DYWNoZSh1c2VybmFtZTogc3RyaW5nID0gJycpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5hZG1pblNlcnZpY2UuaW52YWxpZGF0ZVBlcm1pc3Npb25DYWNoZSh1c2VybmFtZSk7XG4gIH1cblxuICAvKiogUmV0dXJuIHN5c3RlbS1sZXZlbCBtZXRyaWNzIChDUFUsIG1lbW9yeSwgZGlzayBJL08sIHN0b3JhZ2UsIG5ldHdvcmspICovXG4gIGFzeW5jIGdldFN5c3RlbU1ldHJpY3MoKTogUHJvbWlzZTxTeXN0ZW1NZXRyaWNzPiB7XG4gICAgcmV0dXJuIHRoaXMuYWRtaW5TZXJ2aWNlLmdldFN5c3RlbU1ldHJpY3MoKTtcbiAgfVxuXG4gIC8qKiBUcmlnZ2VyIG1hbnVhbCBjb21wYWN0aW9uIG9mIHRoZSBkYXRhYmFzZSBzdG9yYWdlICovXG4gIGFzeW5jIGNvbXBhY3QoKTogUHJvbWlzZTxDb21wYWN0UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuYWRtaW5TZXJ2aWNlLmNvbXBhY3QoKTtcbiAgfVxuXG4gIC8qKiBXYWl0IGZvciB0aGUgY29tcHV0aW5nIGVuZ2luZSB0b3BvbG9neSB0byBiZSByZWFkeSAqL1xuICBhc3luYyB3YWl0Rm9yQ29tcHV0ZVRvcG9sb2d5KGdyYXBoTmFtZTogc3RyaW5nLCB0aW1lb3V0TXM6IG51bWJlciA9IDApOiBQcm9taXNlPENvbXB1dGVUb3BvbG9neVJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmFkbWluU2VydmljZS53YWl0Rm9yQ29tcHV0ZVRvcG9sb2d5KGdyYXBoTmFtZSwgdGltZW91dE1zKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBCdWxrIEltcG9ydCBTZXJ2aWNlXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBTdGFydCBhIGJ1bGsgaW1wb3J0IHNlc3Npb24gZm9yIG9wdGltaXplZCBoaWdoLXRocm91Z2hwdXQgaW5zZXJ0cy5cbiAgICogQHBhcmFtIGdyYXBoTmFtZSBUYXJnZXQgZ3JhcGggbmFtZVxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25hbCBidWxrIGltcG9ydCBjb25maWd1cmF0aW9uXG4gICAqL1xuICBhc3luYyBzdGFydEJ1bGtJbXBvcnQoZ3JhcGhOYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiBCdWxrSW1wb3J0T3B0aW9ucyk6IFByb21pc2U8QnVsa0ltcG9ydFNlc3Npb24+IHtcbiAgICByZXR1cm4gdGhpcy5idWxrSW1wb3J0U2VydmljZS5zdGFydEJ1bGtJbXBvcnQoZ3JhcGhOYW1lLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBDaGVja3BvaW50IGlzIG5vIGxvbmdlciBuZWVkZWQuIFVzZSBlbmRCdWxrSW1wb3J0KCkgd2hpY2ggcGVyZm9ybXMgYSBmaW5hbCBmbHVzaC5cbiAgICovXG4gIGFzeW5jIGNoZWNrcG9pbnQoc2Vzc2lvbklkOiBzdHJpbmcpOiBQcm9taXNlPENoZWNrcG9pbnRSZXN1bHQ+IHtcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIHJlY29yZENvdW50OiAwLFxuICAgICAgbGFzdENoZWNrcG9pbnRDb3VudDogMCxcbiAgICAgIG1lc3NhZ2U6ICdDaGVja3BvaW50IGhhcyBiZWVuIHJlbW92ZWQ7IHVzZSBlbmRCdWxrSW1wb3J0IHdoaWNoIHBlcmZvcm1zIGEgZmluYWwgZmx1c2gnLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRW5kIHRoZSBidWxrIGltcG9ydCBzZXNzaW9uIHdpdGggYSBmaW5hbCBjaGVja3BvaW50LlxuICAgKiBAcGFyYW0gc2Vzc2lvbklkIEJ1bGsgaW1wb3J0IHNlc3Npb24gSURcbiAgICovXG4gIGFzeW5jIGVuZEJ1bGtJbXBvcnQoc2Vzc2lvbklkOiBzdHJpbmcpOiBQcm9taXNlPEVuZEJ1bGtJbXBvcnRSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5idWxrSW1wb3J0U2VydmljZS5lbmRCdWxrSW1wb3J0KHNlc3Npb25JZCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VsIHRoZSBidWxrIGltcG9ydCBzZXNzaW9uIHdpdGhvdXQgZmluYWwgc3luYy5cbiAgICogQHBhcmFtIHNlc3Npb25JZCBCdWxrIGltcG9ydCBzZXNzaW9uIElEXG4gICAqL1xuICBhc3luYyBhYm9ydEJ1bGtJbXBvcnQoc2Vzc2lvbklkOiBzdHJpbmcpOiBQcm9taXNlPEFib3J0QnVsa0ltcG9ydFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmJ1bGtJbXBvcnRTZXJ2aWNlLmFib3J0QnVsa0ltcG9ydChzZXNzaW9uSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgY3VycmVudCBzdGF0dXMgb2YgYSBidWxrIGltcG9ydCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gc2Vzc2lvbklkIEJ1bGsgaW1wb3J0IHNlc3Npb24gSURcbiAgICovXG4gIGFzeW5jIGdldEJ1bGtJbXBvcnRTdGF0dXMoc2Vzc2lvbklkOiBzdHJpbmcpOiBQcm9taXNlPEJ1bGtJbXBvcnRTdGF0dXM+IHtcbiAgICByZXR1cm4gdGhpcy5idWxrSW1wb3J0U2VydmljZS5nZXRCdWxrSW1wb3J0U3RhdHVzKHNlc3Npb25JZCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29udmVuaWVuY2UgTWV0aG9kcyDigJQgR2V0dGVyc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogR2V0IHRoZSBjdXJyZW50IHNlc3Npb24gKi9cbiAgZ2V0U2Vzc2lvbigpOiBTZXNzaW9uIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbnMuZ2V0U2Vzc2lvbigpO1xuICB9XG5cbiAgLyoqIENoZWNrIGlmIHRoZXJlIGlzIGFuIGFjdGl2ZSBzZXNzaW9uICovXG4gIGlzTG9nZ2VkSW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbnMuaXNMb2dnZWRJbigpO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgY2xpZW50IGNvbmZpZ3VyYXRpb24gKi9cbiAgZ2V0Q29uZmlnKCk6IEdxbGRiQ29uZmlnIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWc7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGlzIGNsaWVudCBpcyBjb25uZWN0ZWQgdG8gYSBjbHVzdGVyIGRlcGxveW1lbnQgKi9cbiAgZ2V0IGlzQ2x1c3RlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9ucy5nZXRTZXNzaW9uKCk/LmlzQ2x1c3RlciB8fCBmYWxzZTtcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIGNsdXN0ZXIgSUQgKGVtcHR5IHN0cmluZyBpZiBub3QgYSBjbHVzdGVyKSAqL1xuICBnZXQgY2x1c3RlcklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbnMuZ2V0U2Vzc2lvbigpPy5jbHVzdGVySWQgfHwgJyc7XG4gIH1cblxuICAvKiogR2V0IHRoZSBwYXJ0aXRpb24gY291bnQgKDAgaWYgbm90IGEgY2x1c3RlcikgKi9cbiAgZ2V0IHBhcnRpdGlvbkNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbnMuZ2V0U2Vzc2lvbigpPy5wYXJ0aXRpb25Db3VudCB8fCAwO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEludGVybmFsIEhlbHBlcnMg4oCUIE5hbWUgUXVvdGluZ1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogV3JhcCBhIG5hbWUgaW4gYmFja3RpY2tzIGZvciBzYWZlIHVzZSBpbiBHUUwgc3RhdGVtZW50cy5cbiAgICogTGFiZWwgbmFtZXMgYW5kIHByb3BlcnR5IG5hbWVzIHNob3VsZCBiZSBxdW90ZWQ7IGdyYXBoIG5hbWVzLCBpbmRleCBuYW1lcyxcbiAgICogYW5kIGZ1bGx0ZXh0IG5hbWVzIHNob3VsZCBOT1QgYmUgd3JhcHBlZCBpbiBiYWNrdGlja3MuICovXG4gIHByaXZhdGUgc3RhdGljIHF1b3RlTGFiZWwobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ2AnICsgbmFtZSArICdgJztcbiAgfVxuXG4gIC8qKiBXcmFwIGVhY2ggbGFiZWwgbmFtZSBpbiBiYWNrdGlja3MgYW5kIGpvaW4gd2l0aCBcIiwgXCIgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcXVvdGVMYWJlbHMoLi4ubmFtZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmFtZXMubWFwKG4gPT4gJ2AnICsgbiArICdgJykuam9pbignLCAnKTtcbiAgfVxuXG4gIC8qKiBKb2luIG5hbWVzIHdpdGggXCIsIFwiIHdpdGhvdXQgYmFja3RpY2sgd3JhcHBpbmcgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgam9pbk5hbWVzKC4uLm5hbWVzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5hbWVzLmpvaW4oJywgJyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29udmVuaWVuY2UgQVBJIOKAlCBHcmFwaCBPcGVyYXRpb25zICg2IG1ldGhvZHMpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBDcmVhdGUgYSBuZXcgb3BlbiAoc2NoZW1hLWxlc3MpIGdyYXBoXG4gICAqXG4gICAqIHY2IEdRTDogYENSRUFURSBHUkFQSCBnYCAtPiBPUEVOOyBgQ1JFQVRFIEdSQVBIIGcge31gIC0+IENMT1NFRC4gVGhlXG4gICAqIGJyYWNlLWxlc3MgZm9ybSBpcyByZXF1aXJlZCB0byBhY3R1YWxseSBnZXQgYW4gT1BFTiBncmFwaC5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZU9wZW5HcmFwaChuYW1lOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgQ1JFQVRFIEdSQVBIICR7bmFtZX1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhIG5ldyBjbG9zZWQgKHNjaGVtYS1lbmZvcmNlZCkgZ3JhcGggd2l0aCBub2RlIGFuZCBlZGdlIGxhYmVsIGRlZmluaXRpb25zICovXG4gIGFzeW5jIGNyZWF0ZUNsb3NlZEdyYXBoKG5hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBDUkVBVEUgR1JBUEggJHtuYW1lfSB7fWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgZ3JhcGggaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC5cbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBncmFwaCB3YXMgY3JlYXRlZCwgZmFsc2UgaWYgaXQgYWxyZWFkeSBleGlzdGVkLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlR3JhcGhJZk5vdEV4aXN0KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBncmFwaFR5cGU6IEdyYXBoVHlwZSA9IEdyYXBoVHlwZS5PUEVOLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcgPSAnJ1xuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jcmVhdGVHcmFwaChuYW1lLCBncmFwaFR5cGUsIGRlc2NyaXB0aW9uKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgY29uc3QgbXNnID0gKGUubWVzc2FnZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChtc2cuaW5jbHVkZXMoJ2FscmVhZHkgZXhpc3QnKSB8fCBtc2cuaW5jbHVkZXMoJ2R1cGxpY2F0ZScpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgLyoqIENoZWNrIHdoZXRoZXIgYSBncmFwaCB3aXRoIHRoZSBnaXZlbiBuYW1lIGV4aXN0cyAqL1xuICBhc3luYyBoYXNHcmFwaChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBncmFwaHMgPSBhd2FpdCB0aGlzLmxpc3RHcmFwaHMoKTtcbiAgICByZXR1cm4gZ3JhcGhzLnNvbWUoZyA9PiBnLm5hbWUgPT09IG5hbWUpO1xuICB9XG5cbiAgLyoqIFJlbmFtZSBhIGdyYXBoICovXG4gIGFzeW5jIGFsdGVyR3JhcGgoZ3JhcGhOYW1lOiBzdHJpbmcsIG5ld05hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBBTFRFUiBHUkFQSCAke2dyYXBoTmFtZX0gUkVOQU1FIFRPICR7bmV3TmFtZX1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIFJlbW92ZSBhbGwgZGF0YSBmcm9tIGEgZ3JhcGggd2hpbGUga2VlcGluZyBpdHMgc3RydWN0dXJlICovXG4gIGFzeW5jIHRydW5jYXRlKGdyYXBoTmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoYFRSVU5DQVRFIEdSQVBIICR7Z3JhcGhOYW1lfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29udmVuaWVuY2UgQVBJIOKAlCBMYWJlbCBPcGVyYXRpb25zICgxNiBtZXRob2RzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogUmV0dXJuIGFsbCBsYWJlbHMgKG5vZGUgYW5kIGVkZ2UpIGluIHRoZSBjdXJyZW50IGdyYXBoICovXG4gIGFzeW5jIHNob3dMYWJlbHMoY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPExhYmVsSW5mb1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdTSE9XIExBQkVMUycsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHBhcnNlTGFiZWxJbmZvUm93cyhyZXNwKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWxsIG5vZGUgbGFiZWxzIGluIHRoZSBjdXJyZW50IGdyYXBoICovXG4gIGFzeW5jIHNob3dOb2RlTGFiZWxzKGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxMYWJlbEluZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBOT0RFIExBQkVMUycsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHBhcnNlTGFiZWxJbmZvUm93cyhyZXNwLCAnTk9ERScpO1xuICB9XG5cbiAgLyoqIFJldHVybiBhbGwgZWRnZSBsYWJlbHMgaW4gdGhlIGN1cnJlbnQgZ3JhcGggKi9cbiAgYXN5bmMgc2hvd0VkZ2VMYWJlbHMoY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPExhYmVsSW5mb1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdTSE9XIEVER0UgTEFCRUxTJywgY29uZmlnKTtcbiAgICByZXR1cm4gcGFyc2VMYWJlbEluZm9Sb3dzKHJlc3AsICdFREdFJyk7XG4gIH1cblxuICAvKiogUmV0dXJuIGFsbCBub2RlIHR5cGVzIHdpdGggdGhlaXIgcHJvcGVydGllcyAqL1xuICBhc3luYyBzaG93Tm9kZVR5cGVzKGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxOb2RlVHlwZUluZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBOT0RFIFRZUEVTJywgY29uZmlnKTtcbiAgICByZXR1cm4gcGFyc2VOb2RlVHlwZUluZm9Sb3dzKHJlc3ApO1xuICB9XG5cbiAgLyoqIFJldHVybiBhbGwgZWRnZSB0eXBlcyB3aXRoIHRoZWlyIHByb3BlcnRpZXMgKi9cbiAgYXN5bmMgc2hvd0VkZ2VUeXBlcyhjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8RWRnZVR5cGVJbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgRURHRSBUWVBFUycsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHBhcnNlRWRnZVR5cGVJbmZvUm93cyhyZXNwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBzcGVjaWZpYyBsYWJlbCBieSBuYW1lIGZyb20gdGhlIGN1cnJlbnQgZ3JhcGgsIG9yIG51bGwgaWYgbm90IGZvdW5kLlxuICAgKiBNYXRjaGVzIGVudHJpZXMgd2hlcmUgYG5hbWVgIGlzIG9uZSBvZiB0aGUgLmxhYmVscyAoc3VwcG9ydHMgbXVsdGktbGFiZWwgZ3JvdXBzKS5cbiAgICovXG4gIGFzeW5jIGdldExhYmVsKG5hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPExhYmVsSW5mbyB8IG51bGw+IHtcbiAgICBjb25zdCBsYWJlbHMgPSBhd2FpdCB0aGlzLnNob3dMYWJlbHMoY29uZmlnKTtcbiAgICByZXR1cm4gbGFiZWxzLmZpbmQobCA9PiBsLmxhYmVscy5pbmNsdWRlcyhuYW1lKSkgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYSBzcGVjaWZpYyBub2RlIHR5cGUgYnkgbmFtZSwgb3IgbnVsbCBpZiBub3QgZm91bmQgKi9cbiAgYXN5bmMgZ2V0Tm9kZUxhYmVsKG5hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPE5vZGVUeXBlSW5mbyB8IG51bGw+IHtcbiAgICBjb25zdCB0eXBlcyA9IGF3YWl0IHRoaXMuc2hvd05vZGVUeXBlcyhjb25maWcpO1xuICAgIHJldHVybiB0eXBlcy5maW5kKHQgPT4gdC5uYW1lID09PSBuYW1lKSB8fCBudWxsO1xuICB9XG5cbiAgLyoqIFJldHVybiBhIHNwZWNpZmljIGVkZ2UgdHlwZSBieSBuYW1lLCBvciBudWxsIGlmIG5vdCBmb3VuZCAqL1xuICBhc3luYyBnZXRFZGdlTGFiZWwobmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8RWRnZVR5cGVJbmZvIHwgbnVsbD4ge1xuICAgIGNvbnN0IHR5cGVzID0gYXdhaXQgdGhpcy5zaG93RWRnZVR5cGVzKGNvbmZpZyk7XG4gICAgcmV0dXJuIHR5cGVzLmZpbmQodCA9PiB0Lm5hbWUgPT09IG5hbWUpIHx8IG51bGw7XG4gIH1cblxuICAvKiogQ3JlYXRlIGEgbm9kZSBsYWJlbCBpbiB0aGUgY3VycmVudCBncmFwaCAoY2xvc2VkIGdyYXBoKSAqL1xuICBhc3luYyBjcmVhdGVOb2RlTGFiZWwoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBDb252UHJvcGVydHlEZWZbXSA9IFtdLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCB0YXJnZXRHcmFwaCA9IGNvbmZpZz8uZ3JhcGhOYW1lIHx8IHRoaXMuc2Vzc2lvbnMuZ2V0RGVmYXVsdEdyYXBoKCk7XG4gICAgY29uc3QgcHJvcFN0ciA9IGJ1aWxkUHJvcGVydHlEZWZTdHJpbmcocHJvcHMpO1xuICAgIHJldHVybiB0aGlzLmdxbChgQUxURVIgR1JBUEggJHt0YXJnZXRHcmFwaH0gQUREIE5PREUgeyAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobmFtZSl9ICgke3Byb3BTdHJ9KSB9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBDcmVhdGUgYW4gZWRnZSBsYWJlbCBpbiB0aGUgY3VycmVudCBncmFwaCAoY2xvc2VkIGdyYXBoKSAqL1xuICBhc3luYyBjcmVhdGVFZGdlTGFiZWwoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBDb252UHJvcGVydHlEZWZbXSA9IFtdLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCB0YXJnZXRHcmFwaCA9IGNvbmZpZz8uZ3JhcGhOYW1lIHx8IHRoaXMuc2Vzc2lvbnMuZ2V0RGVmYXVsdEdyYXBoKCk7XG4gICAgY29uc3QgcHJvcFN0ciA9IGJ1aWxkUHJvcGVydHlEZWZTdHJpbmcocHJvcHMpO1xuICAgIHJldHVybiB0aGlzLmdxbChgQUxURVIgR1JBUEggJHt0YXJnZXRHcmFwaH0gQUREIEVER0UgeyAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobmFtZSl9ICgpLVske3Byb3BTdHJ9XS0+KCkgfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogRHJvcCBhIG5vZGUgbGFiZWwgZnJvbSB0aGUgY3VycmVudCBncmFwaCAoY2xvc2VkIGdyYXBoKSAqL1xuICBhc3luYyBkcm9wTm9kZUxhYmVsKG5hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgdGFyZ2V0R3JhcGggPSBjb25maWc/LmdyYXBoTmFtZSB8fCB0aGlzLnNlc3Npb25zLmdldERlZmF1bHRHcmFwaCgpO1xuICAgIHJldHVybiB0aGlzLmdxbChgQUxURVIgR1JBUEggJHt0YXJnZXRHcmFwaH0gRFJPUCBOT0RFICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChuYW1lKX1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIERyb3Agb25lIG9yIG1vcmUgZWRnZSBsYWJlbHMgZnJvbSB0aGUgY3VycmVudCBncmFwaCAoY2xvc2VkIGdyYXBoKSAqL1xuICBhc3luYyBkcm9wRWRnZUxhYmVsKC4uLm5hbWVzT3JDb25maWc6IEFycmF5PHN0cmluZyB8IFF1ZXJ5Q29uZmlnIHwgdW5kZWZpbmVkPik6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICAvLyBMYXN0IGFyZyBtYXkgYmUgYSBRdWVyeUNvbmZpZyAob3IgdW5kZWZpbmVkKTsgdHJlYXQgbm9uLXN0cmluZyBhcyBjb25maWcuXG4gICAgbGV0IGNvbmZpZzogUXVlcnlDb25maWcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IG5hbWVzOiBzdHJpbmdbXTtcbiAgICBpZiAobmFtZXNPckNvbmZpZy5sZW5ndGggPiAwICYmIHR5cGVvZiBuYW1lc09yQ29uZmlnW25hbWVzT3JDb25maWcubGVuZ3RoIC0gMV0gIT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25maWcgPSBuYW1lc09yQ29uZmlnW25hbWVzT3JDb25maWcubGVuZ3RoIC0gMV0gYXMgUXVlcnlDb25maWcgfCB1bmRlZmluZWQ7XG4gICAgICBuYW1lcyA9IG5hbWVzT3JDb25maWcuc2xpY2UoMCwgLTEpIGFzIHN0cmluZ1tdO1xuICAgIH0gZWxzZSB7XG4gICAgICBuYW1lcyA9IG5hbWVzT3JDb25maWcgYXMgc3RyaW5nW107XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldEdyYXBoID0gY29uZmlnPy5ncmFwaE5hbWUgfHwgdGhpcy5zZXNzaW9ucy5nZXREZWZhdWx0R3JhcGgoKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEFMVEVSIEdSQVBIICR7dGFyZ2V0R3JhcGh9IERST1AgRURHRSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWxzKC4uLm5hbWVzKX1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGxhYmVsIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBjcmVhdGVkLCBmYWxzZSBpZiBpdCBhbHJlYWR5IGV4aXN0ZWQuXG4gICAqL1xuICBhc3luYyBjcmVhdGVMYWJlbElmTm90RXhpc3QoXG4gICAgbm9kZU9yRWRnZTogREJUeXBlLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogQ29udlByb3BlcnR5RGVmW10gPSBbXSxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBsYWJlbHMgPSBhd2FpdCB0aGlzLnNob3dMYWJlbHMoY29uZmlnKTtcbiAgICBjb25zdCB0YXJnZXRUeXBlID0gbm9kZU9yRWRnZSA9PT0gREJUeXBlLkVER0UgPyAnRURHRScgOiAnTk9ERSc7XG5cbiAgICBpZiAobGFiZWxzLnNvbWUobCA9PiBsLmxhYmVscy5pbmNsdWRlcyhuYW1lKSAmJiBsLnR5cGUgPT09IHRhcmdldFR5cGUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKG5vZGVPckVkZ2UgPT09IERCVHlwZS5OT0RFKSB7XG4gICAgICBhd2FpdCB0aGlzLmNyZWF0ZU5vZGVMYWJlbChuYW1lLCBwcm9wcywgY29uZmlnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5jcmVhdGVFZGdlTGFiZWwobmFtZSwgcHJvcHMsIGNvbmZpZyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIFJlbmFtZSBhIG5vZGUgbGFiZWwgKi9cbiAgYXN5bmMgYWx0ZXJOb2RlTGFiZWwob2xkTmFtZTogc3RyaW5nLCBuZXdOYW1lOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgQUxURVIgTk9ERSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwob2xkTmFtZSl9IFJFTkFNRSBUTyAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobmV3TmFtZSl9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBSZW5hbWUgYW4gZWRnZSBsYWJlbCAqL1xuICBhc3luYyBhbHRlckVkZ2VMYWJlbChvbGROYW1lOiBzdHJpbmcsIG5ld05hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBBTFRFUiBFREdFICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChvbGROYW1lKX0gUkVOQU1FIFRPICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChuZXdOYW1lKX1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIFJldHVybiBhbGwgYXZhaWxhYmxlIGFsZ29yaXRobXMgKi9cbiAgYXN5bmMgc2hvd0FsZ29zKGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxBbGdvSW5mb1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdTSE9XIEFMR09TJywgY29uZmlnKTtcbiAgICByZXR1cm4gcGFyc2VBbGdvSW5mb1Jvd3MocmVzcCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29udmVuaWVuY2UgQVBJIOKAlCBQcm9wZXJ0eSBPcGVyYXRpb25zICgxMyBtZXRob2RzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogUmV0dXJuIHByb3BlcnRpZXMgZm9yIGEgbGFiZWwgKG5vZGUgb3IgZWRnZSkgaW4gdGhlIGN1cnJlbnQgZ3JhcGggKi9cbiAgYXN5bmMgc2hvd1Byb3BlcnR5KFxuICAgIG5vZGVPckVkZ2U6IERCVHlwZSxcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPENvbnZQcm9wZXJ0eURlZltdPiB7XG4gICAgaWYgKG5vZGVPckVkZ2UgPT09IERCVHlwZS5OT0RFKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaG93Tm9kZVByb3BlcnR5KGxhYmVsTmFtZSwgY29uZmlnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2hvd0VkZ2VQcm9wZXJ0eShsYWJlbE5hbWUsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogUmV0dXJuIHByb3BlcnRpZXMgZm9yIGEgbm9kZSBsYWJlbCAqL1xuICBhc3luYyBzaG93Tm9kZVByb3BlcnR5KGxhYmVsTmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8Q29udlByb3BlcnR5RGVmW10+IHtcbiAgICBjb25zdCBudCA9IGF3YWl0IHRoaXMuZ2V0Tm9kZUxhYmVsKGxhYmVsTmFtZSwgY29uZmlnKTtcbiAgICBpZiAoIW50KSB0aHJvdyBuZXcgRXJyb3IoYE5vZGUgbGFiZWwgXCIke2xhYmVsTmFtZX1cIiBub3QgZm91bmRgKTtcbiAgICByZXR1cm4gbnQucHJvcGVydGllcztcbiAgfVxuXG4gIC8qKiBSZXR1cm4gcHJvcGVydGllcyBmb3IgYW4gZWRnZSBsYWJlbCAqL1xuICBhc3luYyBzaG93RWRnZVByb3BlcnR5KGxhYmVsTmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8Q29udlByb3BlcnR5RGVmW10+IHtcbiAgICBjb25zdCBldCA9IGF3YWl0IHRoaXMuZ2V0RWRnZUxhYmVsKGxhYmVsTmFtZSwgY29uZmlnKTtcbiAgICBpZiAoIWV0KSB0aHJvdyBuZXcgRXJyb3IoYEVkZ2UgbGFiZWwgXCIke2xhYmVsTmFtZX1cIiBub3QgZm91bmRgKTtcbiAgICByZXR1cm4gZXQucHJvcGVydGllcztcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYSBzcGVjaWZpYyBwcm9wZXJ0eSBkZWZpbml0aW9uIGZvciBhIGxhYmVsLCBvciBudWxsIGlmIG5vdCBmb3VuZCAqL1xuICBhc3luYyBnZXRQcm9wZXJ0eShcbiAgICBub2RlT3JFZGdlOiBEQlR5cGUsXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcE5hbWU6IHN0cmluZyxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPENvbnZQcm9wZXJ0eURlZiB8IG51bGw+IHtcbiAgICBjb25zdCBwcm9wcyA9IGF3YWl0IHRoaXMuc2hvd1Byb3BlcnR5KG5vZGVPckVkZ2UsIGxhYmVsTmFtZSwgY29uZmlnKTtcbiAgICByZXR1cm4gcHJvcHMuZmluZChwID0+IHAubmFtZSA9PT0gcHJvcE5hbWUpIHx8IG51bGw7XG4gIH1cblxuICAvKiogUmV0dXJuIGEgc3BlY2lmaWMgcHJvcGVydHkgZGVmaW5pdGlvbiBmb3IgYSBub2RlIGxhYmVsLCBvciBudWxsIGlmIG5vdCBmb3VuZCAqL1xuICBhc3luYyBnZXROb2RlUHJvcGVydHkoXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcE5hbWU6IHN0cmluZyxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPENvbnZQcm9wZXJ0eURlZiB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShEQlR5cGUuTk9ERSwgbGFiZWxOYW1lLCBwcm9wTmFtZSwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYSBzcGVjaWZpYyBwcm9wZXJ0eSBkZWZpbml0aW9uIGZvciBhbiBlZGdlIGxhYmVsLCBvciBudWxsIGlmIG5vdCBmb3VuZCAqL1xuICBhc3luYyBnZXRFZGdlUHJvcGVydHkoXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcE5hbWU6IHN0cmluZyxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPENvbnZQcm9wZXJ0eURlZiB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShEQlR5cGUuRURHRSwgbGFiZWxOYW1lLCBwcm9wTmFtZSwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBBZGQgcHJvcGVydGllcyB0byBhIGxhYmVsIChub2RlIG9yIGVkZ2UpICovXG4gIGFzeW5jIGNyZWF0ZVByb3BlcnR5KFxuICAgIG5vZGVPckVkZ2U6IERCVHlwZSxcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogQ29udlByb3BlcnR5RGVmW10sXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGlmIChub2RlT3JFZGdlID09PSBEQlR5cGUuTk9ERSkge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlTm9kZVByb3BlcnR5KGxhYmVsTmFtZSwgcHJvcHMsIGNvbmZpZyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNyZWF0ZUVkZ2VQcm9wZXJ0eShsYWJlbE5hbWUsIHByb3BzLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIEFkZCBwcm9wZXJ0aWVzIHRvIGEgbm9kZSBsYWJlbCAqL1xuICBhc3luYyBjcmVhdGVOb2RlUHJvcGVydHkoXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IENvbnZQcm9wZXJ0eURlZltdLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCBwcm9wU3RyID0gYnVpbGRQcm9wZXJ0eURlZlN0cmluZyhwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBBTFRFUiBOT0RFICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChsYWJlbE5hbWUpfSBBREQgUFJPUEVSVFkgJHtwcm9wU3RyfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogQWRkIHByb3BlcnRpZXMgdG8gYW4gZWRnZSBsYWJlbCAqL1xuICBhc3luYyBjcmVhdGVFZGdlUHJvcGVydHkoXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IENvbnZQcm9wZXJ0eURlZltdLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCBwcm9wU3RyID0gYnVpbGRQcm9wZXJ0eURlZlN0cmluZyhwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBBTFRFUiBFREdFICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChsYWJlbE5hbWUpfSBBREQgUFJPUEVSVFkgJHtwcm9wU3RyfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogRHJvcCBwcm9wZXJ0aWVzIGZyb20gYSBsYWJlbCAobm9kZSBvciBlZGdlKSAqL1xuICBhc3luYyBkcm9wUHJvcGVydHkoXG4gICAgbm9kZU9yRWRnZTogREJUeXBlLFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIC4uLnByb3BOYW1lc09yQ29uZmlnOiBBcnJheTxzdHJpbmcgfCBRdWVyeUNvbmZpZyB8IHVuZGVmaW5lZD5cbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHsgbmFtZXMsIGNvbmZpZyB9ID0gc3BsaXRUcmFpbGluZ0NvbmZpZyhwcm9wTmFtZXNPckNvbmZpZyk7XG4gICAgaWYgKG5vZGVPckVkZ2UgPT09IERCVHlwZS5OT0RFKSB7XG4gICAgICByZXR1cm4gdGhpcy5kcm9wTm9kZVByb3BlcnR5KGxhYmVsTmFtZSwgLi4ubmFtZXMsIGNvbmZpZyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRyb3BFZGdlUHJvcGVydHkobGFiZWxOYW1lLCAuLi5uYW1lcywgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBEcm9wIHByb3BlcnRpZXMgZnJvbSBhIG5vZGUgbGFiZWwgKi9cbiAgYXN5bmMgZHJvcE5vZGVQcm9wZXJ0eShcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICAuLi5wcm9wTmFtZXNPckNvbmZpZzogQXJyYXk8c3RyaW5nIHwgUXVlcnlDb25maWcgfCB1bmRlZmluZWQ+XG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCB7IG5hbWVzLCBjb25maWcgfSA9IHNwbGl0VHJhaWxpbmdDb25maWcocHJvcE5hbWVzT3JDb25maWcpO1xuICAgIHJldHVybiB0aGlzLmdxbChgQUxURVIgTk9ERSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobGFiZWxOYW1lKX0gRFJPUCBQUk9QRVJUWSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWxzKC4uLm5hbWVzKX1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIERyb3AgcHJvcGVydGllcyBmcm9tIGFuIGVkZ2UgbGFiZWwgKi9cbiAgYXN5bmMgZHJvcEVkZ2VQcm9wZXJ0eShcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICAuLi5wcm9wTmFtZXNPckNvbmZpZzogQXJyYXk8c3RyaW5nIHwgUXVlcnlDb25maWcgfCB1bmRlZmluZWQ+XG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCB7IG5hbWVzLCBjb25maWcgfSA9IHNwbGl0VHJhaWxpbmdDb25maWcocHJvcE5hbWVzT3JDb25maWcpO1xuICAgIHJldHVybiB0aGlzLmdxbChgQUxURVIgRURHRSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobGFiZWxOYW1lKX0gRFJPUCBQUk9QRVJUWSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWxzKC4uLm5hbWVzKX1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBwcm9wZXJ0aWVzIG9uIGEgbGFiZWwgaWYgdGhleSBkbyBub3QgYWxyZWFkeSBleGlzdC5cbiAgICogUmV0dXJucyB0cnVlIGlmIGFueSBwcm9wZXJ0aWVzIHdlcmUgY3JlYXRlZCwgZmFsc2UgaWYgYWxsIGFscmVhZHkgZXhpc3RlZC5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVByb3BlcnR5SWZOb3RFeGlzdChcbiAgICBub2RlT3JFZGdlOiBEQlR5cGUsXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IENvbnZQcm9wZXJ0eURlZltdLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5zaG93UHJvcGVydHkobm9kZU9yRWRnZSwgbGFiZWxOYW1lLCBjb25maWcpO1xuICAgIGNvbnN0IGV4aXN0aW5nU2V0ID0gbmV3IFNldChleGlzdGluZy5tYXAocCA9PiBwLm5hbWUpKTtcbiAgICBjb25zdCBuZXdQcm9wcyA9IHByb3BzLmZpbHRlcihwID0+ICFleGlzdGluZ1NldC5oYXMocC5uYW1lKSk7XG5cbiAgICBpZiAobmV3UHJvcHMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICBhd2FpdCB0aGlzLmNyZWF0ZVByb3BlcnR5KG5vZGVPckVkZ2UsIGxhYmVsTmFtZSwgbmV3UHJvcHMsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29udmVuaWVuY2UgQVBJIOKAlCBDb25zdHJhaW50IE9wZXJhdGlvbnMgKDQgbWV0aG9kcylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIENyZWF0ZSBhIE5PVCBOVUxMIGNvbnN0cmFpbnQgb24gYSBwcm9wZXJ0eSAqL1xuICBhc3luYyBjcmVhdGVOb3ROdWxsQ29uc3RyYWludChcbiAgICBub2RlT3JFZGdlOiBEQlR5cGUsXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcE5hbWU6IHN0cmluZyxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgZW50aXR5VHlwZSA9IGRiVHlwZVRvS2V5d29yZChub2RlT3JFZGdlKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEFMVEVSICR7ZW50aXR5VHlwZX0gJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKGxhYmVsTmFtZSl9IEFERCBDT05TVFJBSU5UIE5PVCBOVUxMIE9OICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChwcm9wTmFtZSl9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBDcmVhdGUgYSBVTklRVUUgY29uc3RyYWludCBvbiBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzICovXG4gIGFzeW5jIGNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnQoXG4gICAgbm9kZU9yRWRnZTogREJUeXBlLFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIC4uLnByb3BOYW1lc09yQ29uZmlnOiBBcnJheTxzdHJpbmcgfCBRdWVyeUNvbmZpZyB8IHVuZGVmaW5lZD5cbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHsgbmFtZXMsIGNvbmZpZyB9ID0gc3BsaXRUcmFpbGluZ0NvbmZpZyhwcm9wTmFtZXNPckNvbmZpZyk7XG4gICAgY29uc3QgZW50aXR5VHlwZSA9IGRiVHlwZVRvS2V5d29yZChub2RlT3JFZGdlKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEFMVEVSICR7ZW50aXR5VHlwZX0gJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKGxhYmVsTmFtZSl9IEFERCBDT05TVFJBSU5UIFVOSVFVRSBPTiAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWxzKC4uLm5hbWVzKX1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIFJlbW92ZSBhIE5PVCBOVUxMIGNvbnN0cmFpbnQgZnJvbSBhIHByb3BlcnR5ICovXG4gIGFzeW5jIGRyb3BOb3ROdWxsQ29uc3RyYWludChcbiAgICBub2RlT3JFZGdlOiBEQlR5cGUsXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcE5hbWU6IHN0cmluZyxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgZW50aXR5VHlwZSA9IGRiVHlwZVRvS2V5d29yZChub2RlT3JFZGdlKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEFMVEVSICR7ZW50aXR5VHlwZX0gJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKGxhYmVsTmFtZSl9IERST1AgQ09OU1RSQUlOVCBOT1QgTlVMTCBPTiAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwocHJvcE5hbWUpfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogUmVtb3ZlIGEgVU5JUVVFIGNvbnN0cmFpbnQgZnJvbSBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzICovXG4gIGFzeW5jIGRyb3BVbmlxdWVDb25zdHJhaW50KFxuICAgIG5vZGVPckVkZ2U6IERCVHlwZSxcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICAuLi5wcm9wTmFtZXNPckNvbmZpZzogQXJyYXk8c3RyaW5nIHwgUXVlcnlDb25maWcgfCB1bmRlZmluZWQ+XG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCB7IG5hbWVzLCBjb25maWcgfSA9IHNwbGl0VHJhaWxpbmdDb25maWcocHJvcE5hbWVzT3JDb25maWcpO1xuICAgIGNvbnN0IGVudGl0eVR5cGUgPSBkYlR5cGVUb0tleXdvcmQobm9kZU9yRWRnZSk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBBTFRFUiAke2VudGl0eVR5cGV9ICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChsYWJlbE5hbWUpfSBEUk9QIENPTlNUUkFJTlQgVU5JUVVFIE9OICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbHMoLi4ubmFtZXMpfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29udmVuaWVuY2UgQVBJIOKAlCBJbmRleCBPcGVyYXRpb25zICg3IG1ldGhvZHMpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBSZXR1cm4gYWxsIGluZGV4ZXMgaW4gdGhlIGN1cnJlbnQgZ3JhcGggKi9cbiAgYXN5bmMgc2hvd0luZGV4KGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxJbmRleEluZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBJTkRFWCcsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHBhcnNlSW5kZXhJbmZvUm93cyhyZXNwKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWxsIG5vZGUgaW5kZXhlcyBpbiB0aGUgY3VycmVudCBncmFwaCAqL1xuICBhc3luYyBzaG93Tm9kZUluZGV4KGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxJbmRleEluZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBOT0RFIElOREVYJywgY29uZmlnKTtcbiAgICByZXR1cm4gcGFyc2VJbmRleEluZm9Sb3dzKHJlc3ApO1xuICB9XG5cbiAgLyoqIFJldHVybiBhbGwgZWRnZSBpbmRleGVzIGluIHRoZSBjdXJyZW50IGdyYXBoICovXG4gIGFzeW5jIHNob3dFZGdlSW5kZXgoY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPEluZGV4SW5mb1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdTSE9XIEVER0UgSU5ERVgnLCBjb25maWcpO1xuICAgIHJldHVybiBwYXJzZUluZGV4SW5mb1Jvd3MocmVzcCk7XG4gIH1cblxuICAvKiogQ3JlYXRlIGFuIGluZGV4IG9uIGEgbm9kZSBsYWJlbCAqL1xuICBhc3luYyBjcmVhdGVOb2RlSW5kZXgoXG4gICAgaW5kZXhOYW1lOiBzdHJpbmcsXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IEluZGV4UHJvcGVydHlbXSxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcHJvcFN0ciA9IGJ1aWxkSW5kZXhQcm9wZXJ0eVN0cmluZyhwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBDUkVBVEUgSU5ERVggJHtpbmRleE5hbWV9IE9OIE5PREUgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKGxhYmVsTmFtZSl9ICgke3Byb3BTdHJ9KWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogQ3JlYXRlIGFuIGluZGV4IG9uIGFuIGVkZ2UgbGFiZWwgKi9cbiAgYXN5bmMgY3JlYXRlRWRnZUluZGV4KFxuICAgIGluZGV4TmFtZTogc3RyaW5nLFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBJbmRleFByb3BlcnR5W10sXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHByb3BTdHIgPSBidWlsZEluZGV4UHJvcGVydHlTdHJpbmcocHJvcHMpO1xuICAgIHJldHVybiB0aGlzLmdxbChgQ1JFQVRFIElOREVYICR7aW5kZXhOYW1lfSBPTiBFREdFICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChsYWJlbE5hbWUpfSAoJHtwcm9wU3RyfSlgLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIERyb3AgYSBub2RlIGluZGV4IGJ5IG5hbWUgKi9cbiAgYXN5bmMgZHJvcE5vZGVJbmRleChpbmRleE5hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBEUk9QIE5PREUgSU5ERVggJHtpbmRleE5hbWV9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBEcm9wIGFuIGVkZ2UgaW5kZXggYnkgbmFtZSAqL1xuICBhc3luYyBkcm9wRWRnZUluZGV4KGluZGV4TmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoYERST1AgRURHRSBJTkRFWCAke2luZGV4TmFtZX1gLCBjb25maWcpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENvbnZlbmllbmNlIEFQSSDigJQgRnVsbHRleHQgT3BlcmF0aW9ucyAoNyBtZXRob2RzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogUmV0dXJuIGFsbCBmdWxsdGV4dCBpbmRleGVzIGluIHRoZSBjdXJyZW50IGdyYXBoICovXG4gIGFzeW5jIHNob3dGdWxsdGV4dChjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8RnVsbHRleHRJbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgRlVMTFRFWFQnLCBjb25maWcpO1xuICAgIHJldHVybiBwYXJzZUZ1bGx0ZXh0SW5mb1Jvd3MocmVzcCk7XG4gIH1cblxuICAvKiogUmV0dXJuIGFsbCBub2RlIGZ1bGx0ZXh0IGluZGV4ZXMgKi9cbiAgYXN5bmMgc2hvd05vZGVGdWxsdGV4dChjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8RnVsbHRleHRJbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgTk9ERSBGVUxMVEVYVCcsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHBhcnNlRnVsbHRleHRJbmZvUm93cyhyZXNwKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWxsIGVkZ2UgZnVsbHRleHQgaW5kZXhlcyAqL1xuICBhc3luYyBzaG93RWRnZUZ1bGx0ZXh0KGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxGdWxsdGV4dEluZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBFREdFIEZVTExURVhUJywgY29uZmlnKTtcbiAgICByZXR1cm4gcGFyc2VGdWxsdGV4dEluZm9Sb3dzKHJlc3ApO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhIGZ1bGx0ZXh0IGluZGV4IG9uIGEgbm9kZSBsYWJlbCAqL1xuICBhc3luYyBjcmVhdGVOb2RlRnVsbHRleHQoXG4gICAgaW5kZXhOYW1lOiBzdHJpbmcsXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IHN0cmluZ1tdLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoYENSRUFURSBGVUxMVEVYVCAke2luZGV4TmFtZX0gT04gTk9ERSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobGFiZWxOYW1lKX0gKCR7R3FsZGJDbGllbnQucXVvdGVMYWJlbHMoLi4ucHJvcHMpfSlgLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhIGZ1bGx0ZXh0IGluZGV4IG9uIGFuIGVkZ2UgbGFiZWwgKi9cbiAgYXN5bmMgY3JlYXRlRWRnZUZ1bGx0ZXh0KFxuICAgIGluZGV4TmFtZTogc3RyaW5nLFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBzdHJpbmdbXSxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBDUkVBVEUgRlVMTFRFWFQgJHtpbmRleE5hbWV9IE9OIEVER0UgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKGxhYmVsTmFtZSl9ICgke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWxzKC4uLnByb3BzKX0pYCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBEcm9wIGEgbm9kZSBmdWxsdGV4dCBpbmRleCBieSBuYW1lICovXG4gIGFzeW5jIGRyb3BOb2RlRnVsbHRleHQoaW5kZXhOYW1lOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgRFJPUCBOT0RFIEZVTExURVhUICR7aW5kZXhOYW1lfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogRHJvcCBhbiBlZGdlIGZ1bGx0ZXh0IGluZGV4IGJ5IG5hbWUgKi9cbiAgYXN5bmMgZHJvcEVkZ2VGdWxsdGV4dChpbmRleE5hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBEUk9QIEVER0UgRlVMTFRFWFQgJHtpbmRleE5hbWV9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb252ZW5pZW5jZSBBUEkg4oCUIFRhc2sgT3BlcmF0aW9ucyAoMyBtZXRob2RzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogUmV0dXJuIGFsbCB0YXNrcyBpbiB0aGUgY3VycmVudCBncmFwaCAqL1xuICBhc3luYyBzaG93VGFza3MoY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFRhc2tJbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgVEFTS1MnLCBjb25maWcpO1xuICAgIHJldHVybiBwYXJzZVRhc2tJbmZvUm93cyhyZXNwKTtcbiAgfVxuXG4gIC8qKiBEZWxldGUgYSB0YXNrIGJ5IElEICovXG4gIGFzeW5jIGRlbGV0ZVRhc2sodGFza0lkOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgREVMRVRFIFRBU0sgJHt0YXNrSWR9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBTdG9wIGEgcnVubmluZyB0YXNrIGJ5IElEICovXG4gIGFzeW5jIHN0b3BUYXNrKHRhc2tJZDogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoYFNUT1AgVEFTSyAke3Rhc2tJZH1gLCBjb25maWcpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENvbnZlbmllbmNlIEFQSSDigJQgRGF0YSBJbnNlcnQgT3BlcmF0aW9ucyAoNCBtZXRob2RzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogSW5zZXJ0IG5vZGVzIHVzaW5nIEdRTCBJTlNFUlQgc3ludGF4IHdpdGggUkVUVVJOIGNsYXVzZS5cbiAgICogR1FMOiBJTlNFUlQgKG4wOkxhYmVsIHtwMTogdjF9KSwgKG4xOkxhYmVsIHtwMjogdjJ9KSBSRVRVUk4gbjAsIG4xXG4gICAqIFdoZW4gY29uZmlnLmluc2VydFR5cGUgaXMgSW5zZXJ0VHlwZS5PdmVyd3JpdGUsIHVzZXMgSU5TRVJUIE9WRVJXUklURSBzeW50YXguXG4gICAqIElmIE5vZGVEYXRhLmlkIGlzIHNldCAobm9uLWVtcHR5KSwgaW5jbHVkZXMgaXQgYXMgX2lkIHByb3BlcnR5IGluIHRoZSBHUUwuXG4gICAqIFJldHVybnMgdGhlIHJhdyBSZXNwb25zZSBjb250YWluaW5nIHRoZSBpbnNlcnRlZCBub2RlcyBpbiBjb2x1bW5zIG4wLCBuMSwgZXRjLlxuICAgKlxuICAgKiBAcGFyYW0gbm9kZXMgTm9kZXMgdG8gaW5zZXJ0LlxuICAgKiBAcGFyYW0gY29uZmlnIE9wdGlvbmFsIEluc2VydENvbmZpZy4gU3VwcG9ydHMgcGVyLWNhbGwgZ3JhcGhOYW1lIGFuZCBpbnNlcnRUeXBlLlxuICAgKi9cbiAgYXN5bmMgaW5zZXJ0Tm9kZXMobm9kZXM6IE5vZGVEYXRhW10sIGNvbmZpZz86IEluc2VydENvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBpZiAobm9kZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbmV3IFJlc3BvbnNlKFtdLCBbXSwgMCwgZmFsc2UsIFtdLCAwKTtcblxuICAgIG5vZGVzLmZvckVhY2goKG5vZGUsIGkpID0+IHtcbiAgICAgIGlmICghbm9kZS5sYWJlbHMgfHwgbm9kZS5sYWJlbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm9kZSBhdCBpbmRleCAke2l9IGhhcyBubyBsYWJlbHMuIEF0IGxlYXN0IG9uZSBsYWJlbCBpcyByZXF1aXJlZC5gKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHZhck5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHBhcnRzID0gbm9kZXMubWFwKChub2RlLCBpKSA9PiB7XG4gICAgICBjb25zdCB2YXJOYW1lID0gYG4ke2l9YDtcbiAgICAgIHZhck5hbWVzLnB1c2godmFyTmFtZSk7XG4gICAgICAvLyBHUUwgSU5TRVJUIG9ubHkgc3VwcG9ydHMgc2luZ2xlIGxhYmVsIHBlciBub2RlXG4gICAgICBjb25zdCBsYWJlbCA9IEdxbGRiQ2xpZW50LnF1b3RlTGFiZWwobm9kZS5sYWJlbHNbMF0pO1xuICAgICAgLy8gQnVpbGQgcHJvcGVydGllcyBpbmNsdWRpbmcgX2lkIGlmIHNldFxuICAgICAgbGV0IHByb3BzID0gbm9kZS5wcm9wZXJ0aWVzO1xuICAgICAgaWYgKG5vZGUuaWQpIHtcbiAgICAgICAgcHJvcHMgPSB7IF9pZDogbm9kZS5pZCwgLi4ucHJvcHMgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHByb3BTdHIgPSBidWlsZFByb3BlcnRpZXNWYWx1ZVN0cmluZyhwcm9wcyk7XG4gICAgICByZXR1cm4gcHJvcFN0ciA/IGAoJHt2YXJOYW1lfToke2xhYmVsfSAke3Byb3BTdHJ9KWAgOiBgKCR7dmFyTmFtZX06JHtsYWJlbH0pYDtcbiAgICB9KTtcblxuICAgIGNvbnN0IGluc2VydFR5cGUgPSBjb25maWc/Lmluc2VydFR5cGUgPz8gSW5zZXJ0VHlwZS5Ob3JtYWw7XG4gICAgY29uc3QgaW5zZXJ0S2V5d29yZCA9IGluc2VydFR5cGUgPT09IEluc2VydFR5cGUuT3ZlcndyaXRlID8gJ0lOU0VSVCBPVkVSV1JJVEUnIDogJ0lOU0VSVCc7XG4gICAgY29uc3QgZ3FsU3RyID0gaW5zZXJ0S2V5d29yZCArICcgJyArIHBhcnRzLmpvaW4oJywgJykgKyAnIFJFVFVSTiAnICsgdmFyTmFtZXMuam9pbignLCAnKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoZ3FsU3RyLCBjb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydCBlZGdlcyB1c2luZyBHUUwgSU5TRVJUIHN5bnRheCB3aXRoIFJFVFVSTiBjbGF1c2UuXG4gICAqIEVhY2ggZWRnZSBpcyBpbnNlcnRlZCBpbmRpdmlkdWFsbHkgdXNpbmcgTUFUQ0ggKyBJTlNFUlQgdG8gcmVzb2x2ZSBub2RlIElEcy5cbiAgICogR1FMOiBNQVRDSCAoc3JjIFdIRVJFIGlkKHNyYykgPSAnZnJvbScpLCAoZHN0IFdIRVJFIGlkKGRzdCkgPSAndG8nKVxuICAgKiAgICAgIElOU0VSVCAoc3JjKS1bZTA6TGFiZWwge3AxOiB2MX1dLT4oZHN0KSBSRVRVUk4gZTBcbiAgICogV2hlbiBjb25maWcuaW5zZXJ0VHlwZSBpcyBJbnNlcnRUeXBlLk92ZXJ3cml0ZSwgdXNlcyBJTlNFUlQgT1ZFUldSSVRFIHN5bnRheC5cbiAgICogUmV0dXJucyBhIG1lcmdlZCBSZXNwb25zZSBjb250YWluaW5nIGFsbCBpbnNlcnRlZCBlZGdlcyBpbiBjb2x1bW5zIGUwLCBlMSwgZXRjLlxuICAgKlxuICAgKiBAcGFyYW0gZWRnZXMgRWRnZXMgdG8gaW5zZXJ0LlxuICAgKiBAcGFyYW0gY29uZmlnIE9wdGlvbmFsIEluc2VydENvbmZpZy4gU3VwcG9ydHMgcGVyLWNhbGwgZ3JhcGhOYW1lIGFuZCBpbnNlcnRUeXBlLlxuICAgKi9cbiAgYXN5bmMgaW5zZXJ0RWRnZXMoZWRnZXM6IEVkZ2VEYXRhW10sIGNvbmZpZz86IEluc2VydENvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBpZiAoZWRnZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbmV3IFJlc3BvbnNlKFtdLCBbXSwgMCwgZmFsc2UsIFtdLCAwKTtcblxuICAgIGNvbnN0IGluc2VydFR5cGUgPSBjb25maWc/Lmluc2VydFR5cGUgPz8gSW5zZXJ0VHlwZS5Ob3JtYWw7XG4gICAgY29uc3QgaW5zZXJ0S2V5d29yZCA9IGluc2VydFR5cGUgPT09IEluc2VydFR5cGUuT3ZlcndyaXRlID8gJ0lOU0VSVCBPVkVSV1JJVEUnIDogJ0lOU0VSVCc7XG4gICAgY29uc3QgYWxsQ29sdW1uczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBhbGxWYWx1ZXM6IGFueVtdID0gW107XG4gICAgbGV0IHRvdGFsQWZmZWN0ZWQgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGVkZ2UgPSBlZGdlc1tpXTtcbiAgICAgIGNvbnN0IHZhck5hbWUgPSBgZSR7aX1gO1xuICAgICAgY29uc3QgbGFiZWxQYXJ0ID0gZWRnZS5sYWJlbCA/ICc6JyArIEdxbGRiQ2xpZW50LnF1b3RlTGFiZWwoZWRnZS5sYWJlbCkgOiAnJztcbiAgICAgIGNvbnN0IHByb3BTdHIgPSBidWlsZFByb3BlcnRpZXNWYWx1ZVN0cmluZyhlZGdlLnByb3BlcnRpZXMpO1xuICAgICAgY29uc3QgZWRnZVBhcnQgPSBwcm9wU3RyID8gYFske3Zhck5hbWV9JHtsYWJlbFBhcnR9ICR7cHJvcFN0cn1dYCA6IGBbJHt2YXJOYW1lfSR7bGFiZWxQYXJ0fV1gO1xuICAgICAgY29uc3QgZ3FsU3RyID0gYE1BVENIIChzcmMgV0hFUkUgaWQoc3JjKSA9ICcke2VkZ2UuZnJvbU5vZGVJZH0nKSwgYFxuICAgICAgICArIGAoZHN0IFdIRVJFIGlkKGRzdCkgPSAnJHtlZGdlLnRvTm9kZUlkfScpIGBcbiAgICAgICAgKyBgJHtpbnNlcnRLZXl3b3JkfSAoc3JjKS0ke2VkZ2VQYXJ0fS0+KGRzdCkgUkVUVVJOICR7dmFyTmFtZX1gO1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKGdxbFN0ciwgY29uZmlnKTtcbiAgICAgIHRvdGFsQWZmZWN0ZWQgKz0gcmVzcC5yb3dzQWZmZWN0ZWQ7XG4gICAgICBhbGxDb2x1bW5zLnB1c2godmFyTmFtZSk7XG4gICAgICBpZiAocmVzcC5yb3dzLmxlbmd0aCA+IDAgJiYgcmVzcC5yb3dzWzBdLnZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGFsbFZhbHVlcy5wdXNoKHJlc3Aucm93c1swXS52YWx1ZXNbMF0pO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBtZXJnZWRSb3cgPSBuZXcgUm93KGFsbFZhbHVlcyk7XG4gICAgcmV0dXJuIG5ldyBSZXNwb25zZShhbGxDb2x1bW5zLCBbbWVyZ2VkUm93XSwgMSwgZmFsc2UsIFtdLCB0b3RhbEFmZmVjdGVkKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb252ZW5pZW5jZSBBUEkg4oCUIFN5c3RlbSAmIFByb2Nlc3MgT3BlcmF0aW9ucyAoNCBtZXRob2RzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogUmV0dXJuIGN1cnJlbnRseSBydW5uaW5nIHByb2Nlc3NlcyAocXVlcmllcykgKi9cbiAgYXN5bmMgdG9wKGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxQcm9jZXNzSW5mb1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdUT1AnLCBjb25maWcpO1xuICAgIHJldHVybiBwYXJzZVByb2Nlc3NJbmZvUm93cyhyZXNwKTtcbiAgfVxuXG4gIC8qKiBUZXJtaW5hdGUgYSBydW5uaW5nIHF1ZXJ5IGJ5IGl0cyBxdWVyeSBJRCAqL1xuICBhc3luYyBraWxsKHF1ZXJ5SWQ6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBLSUxMICcke3F1ZXJ5SWR9J2AsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogUmV0dXJuIHN0YXRpc3RpY3MgZm9yIHRoZSBjdXJyZW50IGdyYXBoIHVzaW5nIGRiLnN0YXRzKCkgKi9cbiAgYXN5bmMgc3RhdHMoY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPEdyYXBoU3RhdHM+IHtcbiAgICBjb25zdCBjdXJyZW50R3JhcGggPSBjb25maWc/LmdyYXBoTmFtZSB8fCB0aGlzLnNlc3Npb25zLmdldERlZmF1bHRHcmFwaCgpO1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnUkVUVVJOIGRiLnN0YXRzKCkgQVMgc3RhdHMnLCBjb25maWcpO1xuICAgIGNvbnN0IGdzID0gcGFyc2VHcmFwaFN0YXRzKHJlc3ApO1xuICAgIGlmICghZ3MuZ3JhcGhOYW1lKSBncy5ncmFwaE5hbWUgPSBjdXJyZW50R3JhcGg7XG4gICAgcmV0dXJuIGdzO1xuICB9XG5cbiAgLyoqIFNlbmQgYSBwaW5nIHRvIHRoZSBzZXJ2ZXIgYW5kIHJldHVybiB0aGUgbGF0ZW5jeSBpbiBuYW5vc2Vjb25kcyAqL1xuICBhc3luYyB0ZXN0KCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMucGluZygpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENvbnZlbmllbmNlIEFQSSDigJQgQUkgT3BlcmF0aW9ucyAoMiBtZXRob2RzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogWUlFTEQgY29sdW1ucyBlbWl0dGVkIGJ5IENBTEwgYWkucmVhZCAvIGFpLmdxbCAoa2VwdCBpbiBzeW5jIHdpdGggc2VydmVyKS4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQUlfWUlFTERfQ09MUyA9XG4gICAgJ3N0YWdlLCBkZXRhaWwsIGVsYXBzZWRfbXMsIHRva2Vuc19pbnB1dCwgdG9rZW5zX291dHB1dCwgdG9rZW5zX2NhY2hlZCwgZGF0YSc7XG5cbiAgLyoqXG4gICAqIEFzayB0aGUgQUkgdG8gZ2VuZXJhdGUgYSBHUUwgc3RhdGVtZW50IGFuZCBhdXRvLWV4ZWN1dGUgaXQuXG4gICAqXG4gICAqIFdyYXBzIGBDQUxMIGFpLnJlYWQoXCI8cHJvbXB0PlwiKSBZSUVMRCAuLi5gLCBzdHJlYW1zIHN0YWdlIHJvd3MgZnJvbSB0aGVcbiAgICogc2VydmVyLCBhbmQgcmUtcnVucyB0aGUgc3ludGhlc2l6ZWQgR1FMIHNvIGBBaVJlYWRSZXN1bHQuZGF0YWAgaG9sZHMgdGhlXG4gICAqIHJlYWwgcXVlcnkge0BsaW5rIFJlc3BvbnNlfSAocm93cyAvIGNvbHVtbnMpIOKAlCBtYXRjaGluZyB3aGF0IE1hbmFnZXIgVUlcbiAgICogZGlzcGxheXMuXG4gICAqXG4gICAqIE9ubHkgdHJhbnNwb3J0LWxldmVsIGVycm9ycyByZWplY3QgdGhlIFByb21pc2UuIEFJLXNpZGUgZXJyb3JzIHNldFxuICAgKiBgc3VjY2Vzcz1mYWxzZWAgYW5kIHBvcHVsYXRlIGBlcnJvcmAsIHdpdGggYGRhdGE9bnVsbGAuXG4gICAqL1xuICBhc3luYyBhaVJlYWQocHJvbXB0OiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxBaVJlYWRSZXN1bHQ+IHtcbiAgICBjb25zdCBncWwgPSBgQ0FMTCBhaS5yZWFkKFwiJHtHcWxkYkNsaWVudC5lc2NhcGVBaVByb21wdChwcm9tcHQpfVwiKSBZSUVMRCAke0dxbGRiQ2xpZW50LkFJX1lJRUxEX0NPTFN9YDtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoZ3FsLCBjb25maWcpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucGFyc2VBaVJlc3VsdChyZXNwKTtcbiAgICAvLyBBdXRvIHJlLXJ1biB0aGUgZ2VuZXJhdGVkIEdRTCBzbyBgZGF0YWAgaXMgYSBwcm9wZXIgUmVzcG9uc2UgKHJvd3MvY29sdW1ucyksXG4gICAgLy8gbm90IHRoZSBleGVjdXRpb24gbWV0YWRhdGEgZGljdCByZXR1cm5lZCBpbiB0aGUgZmluYWwgc3RhZ2UuXG4gICAgaWYgKHJlc3VsdC5zdWNjZXNzICYmIHJlc3VsdC5nZW5lcmF0ZWRHcWwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdC5kYXRhID0gYXdhaXQgdGhpcy5ncWwocmVzdWx0LmdlbmVyYXRlZEdxbCwgY29uZmlnKTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICByZXN1bHQuc3VjY2VzcyA9IGZhbHNlO1xuICAgICAgICByZXN1bHQuZXJyb3IgPSBgR2VuZXJhdGVkIEdRTCBmYWlsZWQgdG8gZXhlY3V0ZTogJHtlPy5tZXNzYWdlID8/IFN0cmluZyhlKX1gO1xuICAgICAgICByZXN1bHQuZGF0YSA9IG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5kYXRhID0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc2sgdGhlIEFJIHRvIGdlbmVyYXRlIGEgR1FMIHN0YXRlbWVudCAqd2l0aG91dCogZXhlY3V0aW5nIGl0LlxuICAgKlxuICAgKiBUaGUgZ2VuZXJhdGVkIEdRTCBpcyBleHBvc2VkIHZpYSBgQWlSZWFkUmVzdWx0LmdlbmVyYXRlZEdxbGAgc28gdGhlXG4gICAqIGNhbGxlciBjYW4gcmV2aWV3IC8gZWRpdCBpdCBiZWZvcmUgcnVubmluZyBpdCBtYW51YWxseSB2aWEgYGNsaWVudC5ncWwoKWAuXG4gICAqIGBBaVJlYWRSZXN1bHQuZGF0YWAgaXMgYWx3YXlzIG51bGwgZm9yIGBhaUdxbGAuXG4gICAqL1xuICBhc3luYyBhaUdxbChwcm9tcHQ6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPEFpUmVhZFJlc3VsdD4ge1xuICAgIGNvbnN0IGdxbCA9IGBDQUxMIGFpLmdxbChcIiR7R3FsZGJDbGllbnQuZXNjYXBlQWlQcm9tcHQocHJvbXB0KX1cIikgWUlFTEQgJHtHcWxkYkNsaWVudC5BSV9ZSUVMRF9DT0xTfWA7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKGdxbCwgY29uZmlnKTtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnBhcnNlQWlSZXN1bHQocmVzcCk7XG4gICAgLy8gYWlfZ3FsIGlzIFwiZ2VuZXJhdGUgb25seVwiIOKAlCBuZXZlciBhdXRvLWV4ZWN1dGUuXG4gICAgcmVzdWx0LmRhdGEgPSBudWxsO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKiogRXNjYXBlIGEgcHJvbXB0IHNvIGl0IGNhbiBiZSBzYWZlbHkgZW1iZWRkZWQgaW4gYSBkb3VibGUtcXVvdGVkIEdRTCBzdHJpbmcuICovXG4gIHByaXZhdGUgc3RhdGljIGVzY2FwZUFpUHJvbXB0KHByb21wdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcHJvbXB0LnJlcGxhY2UoL1xcXFwvZywgJ1xcXFxcXFxcJykucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpO1xuICB9XG5cbiAgLyoqIFBhcnNlIGEgQ0FMTCBhaS5yZWFkIC8gYWkuZ3FsIFlJRUxEIHJlc3BvbnNlIGludG8gYW4gQWlSZWFkUmVzdWx0LiAqL1xuICBwcml2YXRlIHBhcnNlQWlSZXN1bHQocmVzcDogUmVzcG9uc2UpOiBBaVJlYWRSZXN1bHQge1xuICAgIGNvbnN0IHJlc3VsdDogQWlSZWFkUmVzdWx0ID0ge1xuICAgICAgc3RhZ2VzOiBbXSxcbiAgICAgIGdlbmVyYXRlZEdxbDogbnVsbCxcbiAgICAgIGRhdGE6IG51bGwsXG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgZXJyb3I6IG51bGwsXG4gICAgICB0b3RhbEVsYXBzZWRNczogMCxcbiAgICAgIHRvdGFsVG9rZW5zSW5wdXQ6IDAsXG4gICAgICB0b3RhbFRva2Vuc091dHB1dDogMCxcbiAgICAgIHRvdGFsVG9rZW5zQ2FjaGVkOiAwLFxuICAgIH07XG5cbiAgICBjb25zdCBjb2xJZHg6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3AuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29sSWR4W3Jlc3AuY29sdW1uc1tpXV0gPSBpO1xuICAgIH1cbiAgICBjb25zdCBnZXRDb2wgPSAocm93OiBSb3csIG5hbWU6IHN0cmluZyk6IGFueSA9PiB7XG4gICAgICBjb25zdCBpZHggPSBjb2xJZHhbbmFtZV07XG4gICAgICBpZiAoaWR4ID09PSB1bmRlZmluZWQpIHJldHVybiBudWxsO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJvdy5nZXQoaWR4KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCByb3cgb2YgcmVzcC5yb3dzKSB7XG4gICAgICBjb25zdCBzdGFnZVZhbCA9IGdldENvbChyb3csICdzdGFnZScpO1xuICAgICAgY29uc3QgZGV0YWlsVmFsID0gZ2V0Q29sKHJvdywgJ2RldGFpbCcpO1xuICAgICAgY29uc3QgZWxhcHNlZFZhbCA9IGdldENvbChyb3csICdlbGFwc2VkX21zJyk7XG4gICAgICBjb25zdCB0SW5WYWwgPSBnZXRDb2wocm93LCAndG9rZW5zX2lucHV0Jyk7XG4gICAgICBjb25zdCB0T3V0VmFsID0gZ2V0Q29sKHJvdywgJ3Rva2Vuc19vdXRwdXQnKTtcbiAgICAgIGNvbnN0IHRDYWNoZWRWYWwgPSBnZXRDb2wocm93LCAndG9rZW5zX2NhY2hlZCcpO1xuICAgICAgY29uc3QgZGF0YVZhbCA9IGdldENvbChyb3csICdkYXRhJyk7XG5cbiAgICAgIGNvbnN0IHN0YWdlOiBBaVN0YWdlID0ge1xuICAgICAgICBzdGFnZTogc3RhZ2VWYWwgPT0gbnVsbCA/ICcnIDogU3RyaW5nKHN0YWdlVmFsKSxcbiAgICAgICAgZGV0YWlsOiBkZXRhaWxWYWwgPT0gbnVsbCA/ICcnIDogU3RyaW5nKGRldGFpbFZhbCksXG4gICAgICAgIGVsYXBzZWRNczogZWxhcHNlZFZhbCA9PSBudWxsID8gMCA6IE51bWJlcihlbGFwc2VkVmFsKSB8fCAwLFxuICAgICAgICB0b2tlbnNJbnB1dDogdEluVmFsID09IG51bGwgPyAwIDogTnVtYmVyKHRJblZhbCkgfHwgMCxcbiAgICAgICAgdG9rZW5zT3V0cHV0OiB0T3V0VmFsID09IG51bGwgPyAwIDogTnVtYmVyKHRPdXRWYWwpIHx8IDAsXG4gICAgICAgIHRva2Vuc0NhY2hlZDogdENhY2hlZFZhbCA9PSBudWxsID8gMCA6IE51bWJlcih0Q2FjaGVkVmFsKSB8fCAwLFxuICAgICAgICBkYXRhOiBkYXRhVmFsLFxuICAgICAgfTtcbiAgICAgIHJlc3VsdC5zdGFnZXMucHVzaChzdGFnZSk7XG5cbiAgICAgIC8vIFRyYWNrIGFnZ3JlZ2F0ZXM6IGVsYXBzZWRfbXMgaXMgY3VtdWxhdGl2ZSBvbiBzZXJ2ZXIgc2lkZSwgdGFrZSBtYXguXG4gICAgICBpZiAoc3RhZ2UuZWxhcHNlZE1zID4gcmVzdWx0LnRvdGFsRWxhcHNlZE1zKSB7XG4gICAgICAgIHJlc3VsdC50b3RhbEVsYXBzZWRNcyA9IHN0YWdlLmVsYXBzZWRNcztcbiAgICAgIH1cbiAgICAgIHJlc3VsdC50b3RhbFRva2Vuc0lucHV0ICs9IHN0YWdlLnRva2Vuc0lucHV0O1xuICAgICAgcmVzdWx0LnRvdGFsVG9rZW5zT3V0cHV0ICs9IHN0YWdlLnRva2Vuc091dHB1dDtcbiAgICAgIHJlc3VsdC50b3RhbFRva2Vuc0NhY2hlZCArPSBzdGFnZS50b2tlbnNDYWNoZWQ7XG5cbiAgICAgIC8vIEV4dHJhY3QgZ2VuZXJhdGVkIEdRTCBmcm9tIGFueSBzdGFnZSdzIGRhdGEuZ3FsIC8gLmZpbmFsX2dxbCAvIC5jYW5kaWRhdGVcbiAgICAgIGlmIChzdGFnZS5kYXRhICYmIHR5cGVvZiBzdGFnZS5kYXRhID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShzdGFnZS5kYXRhKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBbJ2dxbCcsICdmaW5hbF9ncWwnLCAnY2FuZGlkYXRlJ10pIHtcbiAgICAgICAgICBjb25zdCB2YWwgPSAoc3RhZ2UuZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldO1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJyAmJiB2YWwudHJpbSgpKSB7XG4gICAgICAgICAgICByZXN1bHQuZ2VuZXJhdGVkR3FsID0gdmFsO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGFnZS5zdGFnZSA9PT0gJ2Vycm9yJykge1xuICAgICAgICByZXN1bHQuc3VjY2VzcyA9IGZhbHNlO1xuICAgICAgICByZXN1bHQuZXJyb3IgPSBzdGFnZS5kZXRhaWwgfHwgJ0FJIHN0YWdlIHJlcG9ydGVkIGVycm9yJztcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YWdlLnN0YWdlID09PSAnZmluYWwnKSB7XG4gICAgICAgIC8vIFNlcnZlciBlbWl0cyBleGVjdXRpb24gbWV0YWRhdGEgZGljdCBoZXJlOyBhaVJlYWQgb3ZlcndyaXRlcyB3aXRoIGEgcmVhbFxuICAgICAgICAvLyBSZXNwb25zZSBhZnRlciByZS1leGVjdXRpbmcgdGhlIGdlbmVyYXRlZCBHUUwuIFRoZSBgYW55YCBoZXJlIGlzIHVuYXZvaWRhYmxlXG4gICAgICAgIC8vIGJlY2F1c2UgdGhlIHNlcnZlciBoYW5kcyBiYWNrIGEgSlNPTiBkaWN0IGJlZm9yZSB3ZSBrbm93IHRoZSBmaW5hbCBzaGFwZS5cbiAgICAgICAgKHJlc3VsdCBhcyBhbnkpLmRhdGEgPSBzdGFnZS5kYXRhO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrOiBpZiBnZW5lcmF0ZWRfZ3FsIHdhcyBuZXZlciBjYXB0dXJlZCBmcm9tIGEgZGF0YSBkaWN0LFxuICAgIC8vIGZhbGwgYmFjayB0byB0aGUgZmluYWwgc3RhZ2UncyBkZXRhaWwgc3RyaW5nLlxuICAgIGlmIChyZXN1bHQuZ2VuZXJhdGVkR3FsID09PSBudWxsKSB7XG4gICAgICBmb3IgKGxldCBpID0gcmVzdWx0LnN0YWdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBjb25zdCBzID0gcmVzdWx0LnN0YWdlc1tpXTtcbiAgICAgICAgaWYgKHMuc3RhZ2UgPT09ICdmaW5hbCcgJiYgcy5kZXRhaWwpIHtcbiAgICAgICAgICByZXN1bHQuZ2VuZXJhdGVkR3FsID0gcy5kZXRhaWw7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBJbnRlcm5hbCBIZWxwZXJzIOKAlCBUcmFpbGluZyBDb25maWcgU3BsaXR0ZXJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogU3BsaXQgYSB2YXJpYWRpYyBhcmcgbGlzdCB3aGVyZSB0aGUgbGFzdCBlbGVtZW50ICptYXkqIGJlIGEgUXVlcnlDb25maWdcbiAqIGludG8gc2VwYXJhdGUgc3RyaW5nIG5hbWVzIGFuZCBhbiBvcHRpb25hbCBjb25maWcuIFB5dGhvbiB1c2VzIGtleXdvcmQtb25seVxuICogYGNvbmZpZ2AgaW4gdGhlc2UgQVBJczsgdGhlIFR5cGVTY3JpcHQgZXF1aXZhbGVudCBpcyBhbiBvcHRpb25hbCB0cmFpbGluZ1xuICogY29uZmlnIG9iamVjdCBkZXRlY3RlZCBieSBcIm5vdCBhIHN0cmluZ1wiLlxuICovXG5mdW5jdGlvbiBzcGxpdFRyYWlsaW5nQ29uZmlnKFxuICBhcmdzOiBBcnJheTxzdHJpbmcgfCBRdWVyeUNvbmZpZyB8IHVuZGVmaW5lZD5cbik6IHsgbmFtZXM6IHN0cmluZ1tdOyBjb25maWc/OiBRdWVyeUNvbmZpZyB9IHtcbiAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSByZXR1cm4geyBuYW1lczogW10gfTtcbiAgY29uc3QgbGFzdCA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTtcbiAgaWYgKGxhc3QgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgbGFzdCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4geyBuYW1lczogYXJncy5zbGljZSgwLCAtMSkgYXMgc3RyaW5nW10sIGNvbmZpZzogbGFzdCBhcyBRdWVyeUNvbmZpZyB9O1xuICB9XG4gIC8vIElmIGxhc3QgaXMgdW5kZWZpbmVkLCBzdHJpcCBpdCBhcyBhIHRyYWlsaW5nIG9wdGlvbmFsIGNvbmZpZyBwbGFjZWhvbGRlci5cbiAgaWYgKGxhc3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB7IG5hbWVzOiBhcmdzLnNsaWNlKDAsIC0xKSBhcyBzdHJpbmdbXSB9O1xuICB9XG4gIHJldHVybiB7IG5hbWVzOiBhcmdzIGFzIHN0cmluZ1tdIH07XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBJbnRlcm5hbCBIZWxwZXJzIOKAlCBQYXJzaW5nIFJlc3BvbnNlIFJvd3Ncbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBGaW5kIHRoZSBpbmRleCBvZiBhIGNvbHVtbiBieSBuYW1lIChjYXNlLWluc2Vuc2l0aXZlKSwgb3IgLTEgaWYgbm90IGZvdW5kICovXG5mdW5jdGlvbiBmaW5kQ29sdW1uSW5kZXgocmVzcDogUmVzcG9uc2UsIG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IGxvd2VyID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3AuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChyZXNwLmNvbHVtbnNbaV0udG9Mb3dlckNhc2UoKSA9PT0gbG93ZXIpIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn1cblxuLyoqIFNhZmVseSBleHRyYWN0IGEgc3RyaW5nIGZyb20gYSByb3cgYXQgdGhlIGdpdmVuIGNvbHVtbiBpbmRleCAqL1xuZnVuY3Rpb24gZ2V0U3RyaW5nVmFsKHJvdzogUm93LCBpZHg6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChpZHggPCAwKSByZXR1cm4gJyc7XG4gIHRyeSB7XG4gICAgY29uc3QgdmFsID0gcm93LmdldChpZHgpO1xuICAgIGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHJldHVybiAnJztcbiAgICByZXR1cm4gU3RyaW5nKHZhbCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiAnJztcbiAgfVxufVxuXG4vKiogU2FmZWx5IGV4dHJhY3QgYSBudW1iZXIgZnJvbSBhIHJvdyBhdCB0aGUgZ2l2ZW4gY29sdW1uIGluZGV4ICovXG5mdW5jdGlvbiBnZXROdW1iZXJWYWwocm93OiBSb3csIGlkeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKGlkeCA8IDApIHJldHVybiAwO1xuICB0cnkge1xuICAgIGNvbnN0IHZhbCA9IHJvdy5nZXQoaWR4KTtcbiAgICBpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMDtcbiAgICBjb25zdCBudW0gPSBOdW1iZXIodmFsKTtcbiAgICByZXR1cm4gaXNOYU4obnVtKSA/IDAgOiBudW07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiAwO1xuICB9XG59XG5cbi8qKiBOb3JtYWxpemUgYSBsYWJlbCBjb2x1bW4gdmFsdWUgdG8gYSBzdHJpbmcgYXJyYXkuXG4gKlxuICogU2VydmVyIHJldHVybnMgYSBsaXN0IChtdWx0aS1sYWJlbCBzdXBwb3J0KS4gQWNjZXB0IGxpc3Qgb2Ygc3RyaW5ncyxcbiAqIGEgc2luZ2xlIHN0cmluZyAoZGVncmFkZWQgc2VydmVycyksIG9yIG51bGwvdW5kZWZpbmVkLlxuICovXG5mdW5jdGlvbiBwYXJzZUxhYmVsc1ZhbHVlKHZhbDogYW55KTogc3RyaW5nW10ge1xuICBpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gW107XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHJldHVybiB2YWwubWFwKCh4OiBhbnkpID0+IFN0cmluZyh4KSk7XG4gIHJldHVybiBbU3RyaW5nKHZhbCldO1xufVxuXG5mdW5jdGlvbiBwYXJzZUxhYmVsSW5mb1Jvd3MocmVzcDogUmVzcG9uc2UsIGZvcmNlZFR5cGU/OiBzdHJpbmcpOiBMYWJlbEluZm9bXSB7XG4gIGlmIChyZXNwLnJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgbGV0IGxhYmVsSWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdsYWJlbCcpO1xuICBpZiAobGFiZWxJZHggPCAwKSBsYWJlbElkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnbmFtZScpO1xuICBsZXQgdHlwZUlkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAndHlwZScpO1xuICBpZiAodHlwZUlkeCA8IDApIHR5cGVJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2VsZW1lbnRfdHlwZScpO1xuXG4gIHJldHVybiByZXNwLnJvd3MubWFwKHJvdyA9PiB7XG4gICAgY29uc3QgcmF3TGFiZWwgPSBsYWJlbElkeCA+PSAwID8gcm93LmdldChsYWJlbElkeCkgOiBudWxsO1xuICAgIGNvbnN0IHR5cGUgPSBmb3JjZWRUeXBlICE9PSB1bmRlZmluZWQgPyBmb3JjZWRUeXBlIDogZ2V0U3RyaW5nVmFsKHJvdywgdHlwZUlkeCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsczogcGFyc2VMYWJlbHNWYWx1ZShyYXdMYWJlbCksXG4gICAgICB0eXBlLFxuICAgIH07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBwYXJzZU5vZGVUeXBlSW5mb1Jvd3MocmVzcDogUmVzcG9uc2UpOiBOb2RlVHlwZUluZm9bXSB7XG4gIGlmIChyZXNwLnJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgbGV0IG5hbWVJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ25hbWUnKTtcbiAgY29uc3QgdHlwZUlkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAndHlwZScpO1xuICBjb25zdCBwcm9wc0lkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAncHJvcGVydGllcycpO1xuXG4gIGlmIChuYW1lSWR4IDwgMCkgbmFtZUlkeCA9IHR5cGVJZHg7XG5cbiAgcmV0dXJuIHJlc3Aucm93cy5tYXAocm93ID0+ICh7XG4gICAgbmFtZTogZ2V0U3RyaW5nVmFsKHJvdywgbmFtZUlkeCksXG4gICAgcHJvcGVydGllczogcGFyc2VQcm9wZXJ0eVN0cmluZyhnZXRTdHJpbmdWYWwocm93LCBwcm9wc0lkeCkpLFxuICB9KSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRWRnZVR5cGVJbmZvUm93cyhyZXNwOiBSZXNwb25zZSk6IEVkZ2VUeXBlSW5mb1tdIHtcbiAgaWYgKHJlc3Aucm93cy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICBsZXQgbmFtZUlkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnbmFtZScpO1xuICBjb25zdCB0eXBlSWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICd0eXBlJyk7XG4gIGNvbnN0IHByb3BzSWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdwcm9wZXJ0aWVzJyk7XG5cbiAgaWYgKG5hbWVJZHggPCAwKSBuYW1lSWR4ID0gdHlwZUlkeDtcblxuICByZXR1cm4gcmVzcC5yb3dzLm1hcChyb3cgPT4gKHtcbiAgICBuYW1lOiBnZXRTdHJpbmdWYWwocm93LCBuYW1lSWR4KSxcbiAgICBwcm9wZXJ0aWVzOiBwYXJzZVByb3BlcnR5U3RyaW5nKGdldFN0cmluZ1ZhbChyb3csIHByb3BzSWR4KSksXG4gIH0pKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VBbGdvSW5mb1Jvd3MocmVzcDogUmVzcG9uc2UpOiBBbGdvSW5mb1tdIHtcbiAgaWYgKHJlc3Aucm93cy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICBjb25zdCBuYW1lSWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICduYW1lJyk7XG4gIGNvbnN0IGRlc2NJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2Rlc2NyaXB0aW9uJyk7XG4gIGNvbnN0IHZlcklkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAndmVyc2lvbicpO1xuICBjb25zdCBwYXJhbXNJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3BhcmFtZXRlcnMnKTtcblxuICByZXR1cm4gcmVzcC5yb3dzLm1hcChyb3cgPT4gKHtcbiAgICBuYW1lOiBnZXRTdHJpbmdWYWwocm93LCBuYW1lSWR4KSxcbiAgICBkZXNjcmlwdGlvbjogZ2V0U3RyaW5nVmFsKHJvdywgZGVzY0lkeCksXG4gICAgdmVyc2lvbjogZ2V0U3RyaW5nVmFsKHJvdywgdmVySWR4KSxcbiAgICBwYXJhbWV0ZXJzOiBnZXRTdHJpbmdWYWwocm93LCBwYXJhbXNJZHgpLFxuICB9KSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlSW5kZXhJbmZvUm93cyhyZXNwOiBSZXNwb25zZSk6IEluZGV4SW5mb1tdIHtcbiAgaWYgKHJlc3Aucm93cy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICBjb25zdCBpZHhOYW1lID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdpbmRleF9uYW1lJyk7XG4gIGNvbnN0IGlkeEVudGl0eSA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnZW50aXR5X3R5cGUnKTtcbiAgY29uc3QgaWR4TGFiZWwgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2xhYmVsJyk7XG4gIGNvbnN0IGlkeFByb3AgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3Byb3BlcnR5Jyk7XG4gIGNvbnN0IGlkeFByZWZpeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAncHJlZml4X2xlbmd0aCcpO1xuICBjb25zdCBpZHhTdGF0dXMgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3N0YXR1cycpO1xuICBjb25zdCBpZHhQcm9ncmVzcyA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAncHJvZ3Jlc3MnKTtcbiAgY29uc3QgaWR4SW5kZXhlZCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnaW5kZXhlZF9jb3VudCcpO1xuICBjb25zdCBpZHhUb3RhbCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAndG90YWxfY291bnQnKTtcbiAgY29uc3QgaWR4RXJyb3IgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2Vycm9yJyk7XG5cbiAgcmV0dXJuIHJlc3Aucm93cy5tYXAocm93ID0+IHtcbiAgICBjb25zdCBpbmZvOiBJbmRleEluZm8gPSB7XG4gICAgICBpbmRleE5hbWU6IGdldFN0cmluZ1ZhbChyb3csIGlkeE5hbWUpLFxuICAgICAgZW50aXR5VHlwZTogZ2V0U3RyaW5nVmFsKHJvdywgaWR4RW50aXR5KSxcbiAgICAgIGxhYmVsOiBnZXRTdHJpbmdWYWwocm93LCBpZHhMYWJlbCksXG4gICAgICBwcm9wZXJ0eTogZ2V0U3RyaW5nVmFsKHJvdywgaWR4UHJvcCksXG4gICAgICBzdGF0dXM6IGdldFN0cmluZ1ZhbChyb3csIGlkeFN0YXR1cyksXG4gICAgICBwcm9ncmVzczogZ2V0U3RyaW5nVmFsKHJvdywgaWR4UHJvZ3Jlc3MpLFxuICAgICAgaW5kZXhlZENvdW50OiBnZXROdW1iZXJWYWwocm93LCBpZHhJbmRleGVkKSxcbiAgICAgIHRvdGFsQ291bnQ6IGdldE51bWJlclZhbChyb3csIGlkeFRvdGFsKSxcbiAgICAgIGVycm9yOiBnZXRTdHJpbmdWYWwocm93LCBpZHhFcnJvciksXG4gICAgfTtcbiAgICBpZiAoaWR4UHJlZml4ID49IDApIHtcbiAgICAgIGluZm8ucHJlZml4TGVuZ3RoID0gZ2V0TnVtYmVyVmFsKHJvdywgaWR4UHJlZml4KTtcbiAgICB9XG4gICAgcmV0dXJuIGluZm87XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBwYXJzZUZ1bGx0ZXh0SW5mb1Jvd3MocmVzcDogUmVzcG9uc2UpOiBGdWxsdGV4dEluZm9bXSB7XG4gIGlmIChyZXNwLnJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgY29uc3QgaWR4TmFtZSA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnaW5kZXhfbmFtZScpO1xuICBjb25zdCBpZHhFbnRpdHkgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2VudGl0eV90eXBlJyk7XG4gIGNvbnN0IGlkeFNjaGVtYSA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnc2NoZW1hX25hbWUnKTtcbiAgY29uc3QgaWR4UHJvcHMgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3Byb3BlcnRpZXMnKTtcbiAgY29uc3QgaWR4QW5hbHl6ZXIgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2FuYWx5emVyJyk7XG4gIGNvbnN0IGlkeFN0YXR1cyA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnc3RhdHVzJyk7XG4gIGNvbnN0IGlkeERvY0NvdW50ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdkb2NfY291bnQnKTtcbiAgY29uc3QgaWR4UHJvZ3Jlc3MgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3Byb2dyZXNzJyk7XG5cbiAgcmV0dXJuIHJlc3Aucm93cy5tYXAocm93ID0+ICh7XG4gICAgaW5kZXhOYW1lOiBnZXRTdHJpbmdWYWwocm93LCBpZHhOYW1lKSxcbiAgICBlbnRpdHlUeXBlOiBnZXRTdHJpbmdWYWwocm93LCBpZHhFbnRpdHkpLFxuICAgIHNjaGVtYU5hbWU6IGdldFN0cmluZ1ZhbChyb3csIGlkeFNjaGVtYSksXG4gICAgcHJvcGVydGllczogZ2V0U3RyaW5nVmFsKHJvdywgaWR4UHJvcHMpLFxuICAgIGFuYWx5emVyOiBnZXRTdHJpbmdWYWwocm93LCBpZHhBbmFseXplciksXG4gICAgc3RhdHVzOiBnZXRTdHJpbmdWYWwocm93LCBpZHhTdGF0dXMpLFxuICAgIGRvY0NvdW50OiBnZXROdW1iZXJWYWwocm93LCBpZHhEb2NDb3VudCksXG4gICAgcHJvZ3Jlc3M6IGdldFN0cmluZ1ZhbChyb3csIGlkeFByb2dyZXNzKSxcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZVRhc2tJbmZvUm93cyhyZXNwOiBSZXNwb25zZSk6IFRhc2tJbmZvW10ge1xuICBpZiAocmVzcC5yb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGlkeElkID0gZmluZENvbHVtbkluZGV4KHJlc3AsICd0YXNrX2lkJyk7XG4gIGNvbnN0IGlkeFR5cGUgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3R5cGUnKTtcbiAgY29uc3QgaWR4UXVlcnkgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3F1ZXJ5Jyk7XG4gIGNvbnN0IGlkeEFsZ28gPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2FsZ29fbmFtZScpO1xuICBjb25zdCBpZHhTdGF0dXMgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3N0YXR1cycpO1xuICBjb25zdCBpZHhTdGFydGVkID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdzdGFydGVkX2F0Jyk7XG4gIGNvbnN0IGlkeFByb2dyZXNzID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdwcm9ncmVzcycpO1xuICBjb25zdCBpZHhQYXJhbXMgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3BhcmFtZXRlcnMnKTtcbiAgY29uc3QgaWR4Tm9kZXMgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ25vZGVzX3dyaXR0ZW4nKTtcbiAgY29uc3QgaWR4Q29tcHV0ZSA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnY29tcHV0ZV90aW1lX21zJyk7XG4gIGNvbnN0IGlkeFdyaXRlID0gZmluZENvbHVtbkluZGV4KHJlc3AsICd3cml0ZV90aW1lX21zJyk7XG5cbiAgcmV0dXJuIHJlc3Aucm93cy5tYXAocm93ID0+ICh7XG4gICAgdGFza0lkOiBnZXRTdHJpbmdWYWwocm93LCBpZHhJZCksXG4gICAgdHlwZTogZ2V0U3RyaW5nVmFsKHJvdywgaWR4VHlwZSksXG4gICAgcXVlcnk6IGdldFN0cmluZ1ZhbChyb3csIGlkeFF1ZXJ5KSxcbiAgICBhbGdvTmFtZTogZ2V0U3RyaW5nVmFsKHJvdywgaWR4QWxnbyksXG4gICAgc3RhdHVzOiBnZXRTdHJpbmdWYWwocm93LCBpZHhTdGF0dXMpLFxuICAgIHN0YXJ0ZWRBdDogZ2V0U3RyaW5nVmFsKHJvdywgaWR4U3RhcnRlZCksXG4gICAgcHJvZ3Jlc3M6IGdldFN0cmluZ1ZhbChyb3csIGlkeFByb2dyZXNzKSxcbiAgICBwYXJhbWV0ZXJzOiBnZXRTdHJpbmdWYWwocm93LCBpZHhQYXJhbXMpLFxuICAgIG5vZGVzV3JpdHRlbjogZ2V0TnVtYmVyVmFsKHJvdywgaWR4Tm9kZXMpLFxuICAgIGNvbXB1dGVUaW1lTXM6IGdldE51bWJlclZhbChyb3csIGlkeENvbXB1dGUpLFxuICAgIHdyaXRlVGltZU1zOiBnZXROdW1iZXJWYWwocm93LCBpZHhXcml0ZSksXG4gIH0pKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VQcm9jZXNzSW5mb1Jvd3MocmVzcDogUmVzcG9uc2UpOiBQcm9jZXNzSW5mb1tdIHtcbiAgaWYgKHJlc3Aucm93cy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICBjb25zdCBpZHhJZCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAncXVlcnlfaWQnKTtcbiAgY29uc3QgaWR4VGV4dCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAncXVlcnlfdGV4dCcpO1xuICBjb25zdCBpZHhTdGFydCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnc3RhcnRfdGltZScpO1xuICBjb25zdCBpZHhEdXJhdGlvbiA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnZHVyYXRpb25fbXMnKTtcbiAgY29uc3QgaWR4U3RhdHVzID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdzdGF0dXMnKTtcblxuICByZXR1cm4gcmVzcC5yb3dzLm1hcChyb3cgPT4gKHtcbiAgICBxdWVyeUlkOiBnZXRTdHJpbmdWYWwocm93LCBpZHhJZCksXG4gICAgcXVlcnlUZXh0OiBnZXRTdHJpbmdWYWwocm93LCBpZHhUZXh0KSxcbiAgICBzdGFydFRpbWU6IGdldFN0cmluZ1ZhbChyb3csIGlkeFN0YXJ0KSxcbiAgICBkdXJhdGlvbk1zOiBnZXROdW1iZXJWYWwocm93LCBpZHhEdXJhdGlvbiksXG4gICAgc3RhdHVzOiBnZXRTdHJpbmdWYWwocm93LCBpZHhTdGF0dXMpLFxuICB9KSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlR3JhcGhTdGF0cyhyZXNwOiBSZXNwb25zZSk6IEdyYXBoU3RhdHMge1xuICBjb25zdCBnczogR3JhcGhTdGF0cyA9IHtcbiAgICBncmFwaE5hbWU6ICcnLFxuICAgIG5vZGVDb3VudDogMCxcbiAgICBlZGdlQ291bnQ6IDAsXG4gICAgbGFiZWxDb3VudHM6IHt9LFxuICAgIGVkZ2VMYWJlbENvdW50czoge30sXG4gICAgbm9kZVByb3BlcnR5U3RhdHM6IHt9LFxuICAgIGVkZ2VQcm9wZXJ0eVN0YXRzOiB7fSxcbiAgfTtcblxuICBpZiAocmVzcC5yb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGdzO1xuXG4gIGxldCBzdGF0c0lkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnc3RhdHMnKTtcbiAgaWYgKHN0YXRzSWR4IDwgMCkgc3RhdHNJZHggPSAwO1xuXG4gIGlmIChyZXNwLnJvd3MubGVuZ3RoID09PSAwIHx8IHN0YXRzSWR4ID49IHJlc3Aucm93c1swXS52YWx1ZXMubGVuZ3RoKSByZXR1cm4gZ3M7XG5cbiAgY29uc3QgdmFsID0gcmVzcC5yb3dzWzBdLmdldChzdGF0c0lkeCk7XG4gIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAodmFsLmdyYXBoX25hbWUgIT09IHVuZGVmaW5lZCkgZ3MuZ3JhcGhOYW1lID0gU3RyaW5nKHZhbC5ncmFwaF9uYW1lKTtcbiAgICBpZiAodmFsLm5vZGVfY291bnQgIT09IHVuZGVmaW5lZCkgZ3Mubm9kZUNvdW50ID0gTnVtYmVyKHZhbC5ub2RlX2NvdW50KSB8fCAwO1xuICAgIGlmICh2YWwuZWRnZV9jb3VudCAhPT0gdW5kZWZpbmVkKSBncy5lZGdlQ291bnQgPSBOdW1iZXIodmFsLmVkZ2VfY291bnQpIHx8IDA7XG4gIH1cblxuICByZXR1cm4gZ3M7XG59XG4iXX0=
1389
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILG9EQUFzQztBQUV0QyxxQ0FBdUQ7QUFFdkQseUNBV29CO0FBQ3BCLHVDQUFvRDtBQUNwRCwrQ0FBZ0U7QUFDaEUsbUNBNENpQjtBQUNqQix5Q0FBNEY7QUFDNUYsNENBVzBCO0FBMkMxQjs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBUyxvQkFBb0IsQ0FBQyxJQUE0QjtJQUN4RCxRQUFRLElBQUksRUFBRSxDQUFDO1FBQ2IsS0FBSyxrQkFBVSxDQUFDLFNBQVM7WUFDdkIsT0FBTyxrQkFBa0IsQ0FBQztRQUM1QixLQUFLLGtCQUFVLENBQUMsTUFBTTtZQUNwQixPQUFPLFFBQVEsQ0FBQztRQUNsQjtZQUNFLE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUM7QUFDSCxDQUFDO0FBRUQsNkNBQTZDO0FBQzdDLE1BQWEsV0FBVztJQUNkLE1BQU0sQ0FBYztJQUNwQixPQUFPLENBQWlCO0lBQ3hCLFFBQVEsQ0FBaUI7SUFDekIsU0FBUyxDQUFxQjtJQUM5QixNQUFNLEdBQUcsS0FBSyxDQUFDO0lBRXZCLHdDQUF3QztJQUNoQyxjQUFjLEdBQVcsRUFBRSxDQUFDO0lBQzVCLGNBQWMsR0FBVyxFQUFFLENBQUM7SUFDNUIsV0FBVyxHQUFXLEVBQUUsQ0FBQztJQUVqQyxvQkFBb0I7SUFDWixjQUFjLENBQWlCO0lBQy9CLFlBQVksQ0FBZTtJQUMzQixZQUFZLENBQWU7SUFDM0Isa0JBQWtCLENBQXFCO0lBQ3ZDLFdBQVcsQ0FBYztJQUN6QixhQUFhLENBQWdCO0lBQzdCLFlBQVksQ0FBZTtJQUMzQixpQkFBaUIsQ0FBb0I7SUFFN0Msc0RBQXNEO0lBQzlDLGtCQUFrQjtRQUN4QixNQUFNLFFBQVEsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLEVB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LENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU07UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUVoRixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2QyxJQUFJLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNuQyxJQUFJLEdBQUcsQ0FBQyxVQUFVLEtBQUssU0FBUztZQUFFLEVBQUUsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN4RSxJQUFJLEdBQUcsQ0FBQyxVQUFVLEtBQUssU0FBUztZQUFFLEVBQUUsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0UsSUFBSSxHQUFHLENBQUMsVUFBVSxLQUFLLFNBQVM7WUFBRSxFQUFFLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFFRCxPQUFPLEVBQUUsQ0FBQztBQUNaLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1haW4gY2xpZW50IGZvciBHUUxEQiBOb2RlLmpzIGRyaXZlci5cbiAqL1xuXG5pbXBvcnQgKiBhcyBncnBjIGZyb20gJ0BncnBjL2dycGMtanMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJztcbmltcG9ydCB7IEdxbGRiQ29uZmlnLCB2YWxpZGF0ZUNvbmZpZyB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7IEVtcHR5UXVlcnlFcnJvciwgTG9naW5GYWlsZWRFcnJvciwgUXVlcnlGYWlsZWRFcnJvciB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7XG4gIFJlc3BvbnNlLFxuICBSb3csXG4gIEluc2VydE5vZGVzUmVzdWx0LFxuICBJbnNlcnRFZGdlc1Jlc3VsdCxcbiAgRGVsZXRlUmVzdWx0LFxuICBFeHBvcnROb2Rlc1Jlc3VsdCxcbiAgRXhwb3J0RWRnZXNSZXN1bHQsXG4gIEV4cG9ydENvbmZpZyxcbiAgRXhwb3J0Q2h1bmssXG4gIEV4cG9ydFN0YXRzLFxufSBmcm9tICcuL3Jlc3BvbnNlJztcbmltcG9ydCB7IFNlc3Npb24sIFNlc3Npb25NYW5hZ2VyIH0gZnJvbSAnLi9zZXNzaW9uJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvbk1hbmFnZXIgfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7XG4gIEdyYXBoSW5mbyxcbiAgR3JhcGhUeXBlLFxuICBIZWFsdGhTdGF0dXMsXG4gIENhY2hlU3RhdHMsXG4gIENhY2hlVHlwZSxcbiAgU3RhdGlzdGljcyxcbiAgQ29tcGFjdFJlc3VsdCxcbiAgQ29tcHV0ZVRvcG9sb2d5UmVzdWx0LFxuICBTeXN0ZW1NZXRyaWNzLFxuICBOb2RlRGF0YSxcbiAgRWRnZURhdGEsXG4gIEJ1bGtDcmVhdGVOb2Rlc09wdGlvbnMsXG4gIEJ1bGtDcmVhdGVFZGdlc09wdGlvbnMsXG4gIEJ1bGtJbXBvcnRPcHRpb25zLFxuICBCdWxrSW1wb3J0U2Vzc2lvbixcbiAgQ2hlY2twb2ludFJlc3VsdCxcbiAgRW5kQnVsa0ltcG9ydFJlc3VsdCxcbiAgQWJvcnRCdWxrSW1wb3J0UmVzdWx0LFxuICBCdWxrSW1wb3J0U3RhdHVzLFxuICBUcmFuc2FjdGlvbkluZm8sXG4gIFRyYW5zYWN0aW9uUm93LFxuICBEQlR5cGUsXG4gIEluc2VydFR5cGUsXG4gIExhYmVsSW5mbyxcbiAgTm9kZVR5cGVJbmZvLFxuICBFZGdlVHlwZUluZm8sXG4gIExhYmVsRGVmLFxuICBDb252UHJvcGVydHlEZWYsXG4gIEluZGV4UHJvcGVydHksXG4gIEluZGV4SW5mbyxcbiAgRnVsbHRleHRJbmZvLFxuICBUYXNrSW5mbyxcbiAgUHJvY2Vzc0luZm8sXG4gIEdyYXBoU3RhdHMsXG4gIEFsZ29JbmZvLFxuICBBaVN0YWdlLFxuICBBaVJlYWRSZXN1bHQsXG4gIHBhcnNlUHJvcGVydHlTdHJpbmcsXG4gIGJ1aWxkUHJvcGVydHlEZWZTdHJpbmcsXG4gIGJ1aWxkSW5kZXhQcm9wZXJ0eVN0cmluZyxcbiAgYnVpbGRQcm9wZXJ0aWVzVmFsdWVTdHJpbmcsXG4gIHVzZUdyYXBoUHJlZml4LFxuICBkYlR5cGVUb0tleXdvcmQsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlU2VydmljZUNsaWVudHMsIHByb21pc2lmeUNhbGwsIHByb21pc2lmeUNhbGxXaXRoRGVhZGxpbmUgfSBmcm9tICcuL3NlcnZpY2VzJztcbmltcG9ydCB7XG4gIFNlcnZpY2VDb250ZXh0LFxuICBTZXJ2aWNlQ2xpZW50cyxcbiAgU2Vzc2lvblNlcnZpY2UsXG4gIFF1ZXJ5U2VydmljZSxcbiAgR3JhcGhTZXJ2aWNlLFxuICBUcmFuc2FjdGlvblNlcnZpY2UsXG4gIERhdGFTZXJ2aWNlLFxuICBIZWFsdGhTZXJ2aWNlLFxuICBBZG1pblNlcnZpY2UsXG4gIEJ1bGtJbXBvcnRTZXJ2aWNlLFxufSBmcm9tICcuL3NlcnZpY2VzL2luZGV4JztcblxuLyoqIENvbmZpZ3VyYXRpb24gZm9yIGEgcXVlcnkgKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlDb25maWcge1xuICBncmFwaE5hbWU/OiBzdHJpbmc7XG4gIHBhcmFtZXRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICB0cmFuc2FjdGlvbklkPzogbnVtYmVyO1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICByZWFkT25seT86IGJvb2xlYW47XG4gIC8qKiBNYXggcGF0aHMgdG8gcmV0dXJuIGZyb20gcGF0aCBxdWVyaWVzICgwID0gdW5saW1pdGVkKSAqL1xuICBtYXhQYXRoUmVzdWx0cz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBpbnNlcnROb2RlcyAvIGluc2VydEVkZ2VzIGNvbnZlbmllbmNlIG1ldGhvZHMuXG4gKiBFeHRlbmRzIFF1ZXJ5Q29uZmlnIHdpdGggaW5zZXJ0LXNwZWNpZmljIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zZXJ0Q29uZmlnIGV4dGVuZHMgUXVlcnlDb25maWcge1xuICAvKiogSW5zZXJ0IG1vZGUuIERlZmF1bHRzIHRvIEluc2VydFR5cGUuTm9ybWFsIHdoZW4gb21pdHRlZC4gKi9cbiAgaW5zZXJ0VHlwZT86IEluc2VydFR5cGU7XG59XG5cbi8qKiBDb25maWd1cmF0aW9uIGZvciBpbnNlcnQgbm9kZXMgKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zZXJ0Tm9kZXNDb25maWcge1xuICBvcHRpb25zPzogQnVsa0NyZWF0ZU5vZGVzT3B0aW9ucztcbiAgYnVsa0ltcG9ydFNlc3Npb25JZD86IHN0cmluZztcbn1cblxuLyoqIENvbmZpZ3VyYXRpb24gZm9yIGluc2VydCBlZGdlcyAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnNlcnRFZGdlc0NvbmZpZyB7XG4gIG9wdGlvbnM/OiBCdWxrQ3JlYXRlRWRnZXNPcHRpb25zO1xuICBidWxrSW1wb3J0U2Vzc2lvbklkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhlYWx0aCB3YXRjaGVyIGludGVyZmFjZSBmb3Igc3RyZWFtaW5nIGhlYWx0aCB1cGRhdGVzLlxuICogRW1pdHMgJ3N0YXR1cycgZXZlbnRzIHdpdGggSGVhbHRoU3RhdHVzIGFuZCAnZXJyb3InIGV2ZW50cyBvbiBmYWlsdXJlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhlYWx0aFdhdGNoZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAvKiogU3RvcCB3YXRjaGluZyBoZWFsdGggdXBkYXRlcyAqL1xuICBzdG9wKCk6IHZvaWQ7XG59XG5cbi8qKlxuICogTWFwIGFuIGBJbnNlcnRUeXBlYCB2YWx1ZSB0byB0aGUgR1FMIGtleXdvcmQocykgc2VsZWN0aW5nIHRoZVxuICogbWF0Y2hpbmcgc2VydmVyLXNpZGUgc2VtYW50aWNzLlxuICpcbiAqICAgLSBgSW5zZXJ0VHlwZS5Ob3JtYWxgICAgIC0+IGBcIklOU0VSVFwiYCAoZXJyb3Igb24gZHVwbGljYXRlIGBfaWRgKVxuICogICAtIGBJbnNlcnRUeXBlLk92ZXJ3cml0ZWAgLT4gYFwiSU5TRVJUIE9WRVJXUklURVwiYCAocmVwbGFjZSBvbiBkdXBsaWNhdGUpXG4gKiAgIC0gYEluc2VydFR5cGUuVXBzZXJ0YCAgICAtPiBgXCJVUFNFUlRcImAgKG1lcmdlIG9uIGR1cGxpY2F0ZSlcbiAqXG4gKiBgT3ZlcndyaXRlYCBhbmQgYFVwc2VydGAgYXJlIGRpZmZlcmVudCBzZW1hbnRpY3Mgb24gZXhpc3Rpbmcgcm93cztcbiAqIHRoZXkgYXJlIE5PVCBpbnRlcmNoYW5nZWFibGUuIFNlZSB7QGxpbmsgSW5zZXJ0VHlwZX0gZG9jcy5cbiAqL1xuZnVuY3Rpb24gaW5zZXJ0S2V5d29yZEZvclR5cGUodHlwZTogSW5zZXJ0VHlwZSB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgSW5zZXJ0VHlwZS5PdmVyd3JpdGU6XG4gICAgICByZXR1cm4gJ0lOU0VSVCBPVkVSV1JJVEUnO1xuICAgIGNhc2UgSW5zZXJ0VHlwZS5VcHNlcnQ6XG4gICAgICByZXR1cm4gJ1VQU0VSVCc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAnSU5TRVJUJztcbiAgfVxufVxuXG4vKiogTWFpbiBjbGllbnQgZm9yIGludGVyYWN0aW5nIHdpdGggR1FMREIgKi9cbmV4cG9ydCBjbGFzcyBHcWxkYkNsaWVudCB7XG4gIHByaXZhdGUgY29uZmlnOiBHcWxkYkNvbmZpZztcbiAgcHJpdmF0ZSBjbGllbnRzOiBTZXJ2aWNlQ2xpZW50cztcbiAgcHJpdmF0ZSBzZXNzaW9uczogU2Vzc2lvbk1hbmFnZXI7XG4gIHByaXZhdGUgdHhNYW5hZ2VyOiBUcmFuc2FjdGlvbk1hbmFnZXI7XG4gIHByaXZhdGUgY2xvc2VkID0gZmFsc2U7XG5cbiAgLy8gU3RvcmVkIGNyZWRlbnRpYWxzIGZvciBhdXRvLXJlY29ubmVjdFxuICBwcml2YXRlIHN0b3JlZFVzZXJuYW1lOiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBzdG9yZWRQYXNzd29yZDogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgc3RvcmVkR3JhcGg6IHN0cmluZyA9ICcnO1xuXG4gIC8vIFNlcnZpY2UgaW5zdGFuY2VzXG4gIHByaXZhdGUgc2Vzc2lvblNlcnZpY2U6IFNlc3Npb25TZXJ2aWNlO1xuICBwcml2YXRlIHF1ZXJ5U2VydmljZTogUXVlcnlTZXJ2aWNlO1xuICBwcml2YXRlIGdyYXBoU2VydmljZTogR3JhcGhTZXJ2aWNlO1xuICBwcml2YXRlIHRyYW5zYWN0aW9uU2VydmljZTogVHJhbnNhY3Rpb25TZXJ2aWNlO1xuICBwcml2YXRlIGRhdGFTZXJ2aWNlOiBEYXRhU2VydmljZTtcbiAgcHJpdmF0ZSBoZWFsdGhTZXJ2aWNlOiBIZWFsdGhTZXJ2aWNlO1xuICBwcml2YXRlIGFkbWluU2VydmljZTogQWRtaW5TZXJ2aWNlO1xuICBwcml2YXRlIGJ1bGtJbXBvcnRTZXJ2aWNlOiBCdWxrSW1wb3J0U2VydmljZTtcblxuICAvKiogR2V0IHNlc3Npb24gbWV0YWRhdGEgZm9yIGF1dGhlbnRpY2F0ZWQgcmVxdWVzdHMgKi9cbiAgcHJpdmF0ZSBnZXRTZXNzaW9uTWV0YWRhdGEoKTogZ3JwYy5NZXRhZGF0YSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBuZXcgZ3JwYy5NZXRhZGF0YSgpO1xuICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLnNlc3Npb25zLmdldFNlc3Npb24oKTtcbiAgICBtZXRhZGF0YS5hZGQoJ3Nlc3Npb24taWQnLCBzZXNzaW9uPy5pZD8udG9TdHJpbmcoKSB8fCAnMCcpO1xuICAgIGlmICh0aGlzLmNsaWVudFNlc3Npb25JZCkge1xuICAgICAgbWV0YWRhdGEuYWRkKCd4LXVsdGlwYS1zZXNzaW9uLWlkJywgdGhpcy5jbGllbnRTZXNzaW9uSWQpO1xuICAgIH1cbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH1cblxuICAvKipcbiAgICogU3RhYmxlIHBlci1jbGllbnQgbG9naWNhbCBzZXNzaW9uIGlkIHN1cmZhY2VkIHVuZGVyIHRoZVxuICAgKiB0cmFuc2FjdGlvbi1icmFuY2ggbW9kZWwuIFNlZSBUUkFOU0FDVElPTlNfRFJJVkVSX0dVSURFLm1kIMKnMi4w4oCTMi4xLlxuICAgKiBGYWxscyBiYWNrIHRvIGEgVVVJRCB2NCBoZXggZ2VuZXJhdGVkIGF0IGNvbnN0cnVjdGlvbiB3aGVuXG4gICAqIGBjb25maWcuc2Vzc2lvbklkYCBpcyBub3Qgc2V0LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNsaWVudFNlc3Npb25JZDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogR3FsZGJDb25maWcpIHtcbiAgICB2YWxpZGF0ZUNvbmZpZyhjb25maWcpO1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMuc2Vzc2lvbnMgPSBuZXcgU2Vzc2lvbk1hbmFnZXIoKTtcbiAgICB0aGlzLnR4TWFuYWdlciA9IG5ldyBUcmFuc2FjdGlvbk1hbmFnZXIoKTtcbiAgICAvLyBCb290c3RyYXAgc3RhYmxlIHBlci1jbGllbnQgc2Vzc2lvbiBpZCAodXNlZCBhcyBgeC11bHRpcGEtc2Vzc2lvbi1pZGBcbiAgICAvLyBtZXRhZGF0YSB3aGVuIMKnMi4xIG9wdC1pbiBpcyBlbmFibGVkLCBhbmQgc3VyZmFjZWQgb24gZXZlcnkgVHJhbnNhY3Rpb24pLlxuICAgIGNvbnN0IGNmZ1NpZCA9IChjb25maWcgYXMgYW55KS5zZXNzaW9uSWQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHRoaXMuY2xpZW50U2Vzc2lvbklkID0gY2ZnU2lkICYmIGNmZ1NpZC5sZW5ndGggPiAwXG4gICAgICA/IGNmZ1NpZFxuICAgICAgOiByZXF1aXJlKCdjcnlwdG8nKS5yYW5kb21CeXRlcygxNikudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgLy8gQ3JlYXRlIGdSUEMgY3JlZGVudGlhbHNcbiAgICBsZXQgY3JlZGVudGlhbHM6IGdycGMuQ2hhbm5lbENyZWRlbnRpYWxzO1xuICAgIGlmIChjb25maWcudGxzT3B0aW9ucykge1xuICAgICAgY3JlZGVudGlhbHMgPSBncnBjLmNyZWRlbnRpYWxzLmNyZWF0ZVNzbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjcmVkZW50aWFscyA9IGdycGMuY3JlZGVudGlhbHMuY3JlYXRlSW5zZWN1cmUoKTtcbiAgICB9XG5cbiAgICAvLyBDaGFubmVsIG9wdGlvbnNcbiAgICBjb25zdCBvcHRpb25zOiBncnBjLkNoYW5uZWxPcHRpb25zID0ge1xuICAgICAgJ2dycGMubWF4X3JlY2VpdmVfbWVzc2FnZV9sZW5ndGgnOiBjb25maWcubWF4UmVjdlNpemUgPz8gNjQgKiAxMDI0ICogMTAyNCxcbiAgICAgICdncnBjLm1heF9zZW5kX21lc3NhZ2VfbGVuZ3RoJzogY29uZmlnLm1heFJlY3ZTaXplID8/IDY0ICogMTAyNCAqIDEwMjQsXG4gICAgICAnZ3JwYy5rZWVwYWxpdmVfdGltZV9tcyc6IDMwMDAwLFxuICAgICAgJ2dycGMua2VlcGFsaXZlX3RpbWVvdXRfbXMnOiAxMDAwMCxcbiAgICAgICdncnBjLmtlZXBhbGl2ZV9wZXJtaXRfd2l0aG91dF9jYWxscyc6IDEsXG4gICAgfTtcblxuICAgIC8vIENyZWF0ZSBzZXJ2aWNlIGNsaWVudHMgZm9yIHRoZSBmaXJzdCBob3N0XG4gICAgY29uc3QgaG9zdCA9IGNvbmZpZy5ob3N0c1swXTtcbiAgICB0aGlzLmNsaWVudHMgPSBjcmVhdGVTZXJ2aWNlQ2xpZW50cyhob3N0LCBjcmVkZW50aWFscywgb3B0aW9ucyk7XG5cbiAgICAvLyBJbml0aWFsaXplIHNlcnZpY2UgY29udGV4dFxuICAgIGNvbnN0IGN0eCA9IG5ldyBTZXJ2aWNlQ29udGV4dCh0aGlzLmNvbmZpZywgdGhpcy5zZXNzaW9ucywgdGhpcy50eE1hbmFnZXIsIHRoaXMuY2xpZW50cywgdGhpcy5jbGllbnRTZXNzaW9uSWQpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBzZXJ2aWNlIGluc3RhbmNlc1xuICAgIHRoaXMuc2Vzc2lvblNlcnZpY2UgPSBuZXcgU2Vzc2lvblNlcnZpY2UoY3R4KTtcbiAgICB0aGlzLnF1ZXJ5U2VydmljZSA9IG5ldyBRdWVyeVNlcnZpY2UoY3R4KTtcbiAgICB0aGlzLmdyYXBoU2VydmljZSA9IG5ldyBHcmFwaFNlcnZpY2UoY3R4KTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uU2VydmljZSA9IG5ldyBUcmFuc2FjdGlvblNlcnZpY2UoY3R4KTtcbiAgICB0aGlzLmRhdGFTZXJ2aWNlID0gbmV3IERhdGFTZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5oZWFsdGhTZXJ2aWNlID0gbmV3IEhlYWx0aFNlcnZpY2UoY3R4KTtcbiAgICB0aGlzLmFkbWluU2VydmljZSA9IG5ldyBBZG1pblNlcnZpY2UoY3R4KTtcbiAgICB0aGlzLmJ1bGtJbXBvcnRTZXJ2aWNlID0gbmV3IEJ1bGtJbXBvcnRTZXJ2aWNlKGN0eCk7XG4gIH1cblxuICAvKiogQ2xvc2UgdGhlIGNsaWVudCBhbmQgYWxsIGNvbm5lY3Rpb25zICovXG4gIGFzeW5jIGNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmNsb3NlZCkgcmV0dXJuO1xuICAgIHRoaXMuY2xvc2VkID0gdHJ1ZTtcblxuICAgIGlmICh0aGlzLnNlc3Npb25zLmlzTG9nZ2VkSW4oKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dvdXQoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gSWdub3JlIGxvZ291dCBlcnJvcnMgZHVyaW5nIGNsb3NlXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2xvc2UgYWxsIHNlcnZpY2UgY2xpZW50c1xuICAgIHRyeSB7XG4gICAgICAodGhpcy5jbGllbnRzLnNlc3Npb25TZXJ2aWNlIGFzIGFueSkuY2xvc2U/LigpO1xuICAgICAgKHRoaXMuY2xpZW50cy5xdWVyeVNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XG4gICAgICAodGhpcy5jbGllbnRzLmdyYXBoU2VydmljZSBhcyBhbnkpLmNsb3NlPy4oKTtcbiAgICAgICh0aGlzLmNsaWVudHMudHJhbnNhY3Rpb25TZXJ2aWNlIGFzIGFueSkuY2xvc2U/LigpO1xuICAgICAgKHRoaXMuY2xpZW50cy5kYXRhU2VydmljZSBhcyBhbnkpLmNsb3NlPy4oKTtcbiAgICAgICh0aGlzLmNsaWVudHMuaGVhbHRoU2VydmljZSBhcyBhbnkpLmNsb3NlPy4oKTtcbiAgICAgICh0aGlzLmNsaWVudHMuYWRtaW5TZXJ2aWNlIGFzIGFueSkuY2xvc2U/LigpO1xuICAgICAgKHRoaXMuY2xpZW50cy5idWxrSW1wb3J0U2VydmljZSBhcyBhbnkpLmNsb3NlPy4oKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZ25vcmUgY2xvc2UgZXJyb3JzXG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFNlc3Npb24gU2VydmljZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogQXV0aGVudGljYXRlIHRoZSB1c2VyIGFuZCBjcmVhdGUgYSBzZXNzaW9uICovXG4gIGFzeW5jIGxvZ2luKHVzZXJuYW1lOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPFNlc3Npb24+IHtcbiAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgdGhpcy5zZXNzaW9uU2VydmljZS5sb2dpbih1c2VybmFtZSwgcGFzc3dvcmQsIHRoaXMuY29uZmlnLmRlZmF1bHRHcmFwaCB8fCAnJyk7XG4gICAgLy8gU3RvcmUgY3JlZGVudGlhbHMgZm9yIGF1dG8tcmVjb25uZWN0XG4gICAgdGhpcy5zdG9yZWRVc2VybmFtZSA9IHVzZXJuYW1lO1xuICAgIHRoaXMuc3RvcmVkUGFzc3dvcmQgPSBwYXNzd29yZDtcbiAgICByZXR1cm4gc2Vzc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGZuIGFuZCBhdXRvLXJlY29ubmVjdCBvbiBVTkFVVEhFTlRJQ0FURUQgZXJyb3IuXG4gICAqIElmIGZuIHRocm93cyBhbiBVTkFVVEhFTlRJQ0FURUQgZ1JQQyBlcnJvciBhbmQgY3JlZGVudGlhbHMgYXJlIHN0b3JlZCxcbiAgICogcmUtbG9naW4gYW5kIHJldHJ5IGZuIG9uY2UuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdpdGhBdXRvUmVjb25uZWN0PFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmbigpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgY29uc3QgbXNnTG93ZXIgPSBlPy5tZXNzYWdlID8gU3RyaW5nKGUubWVzc2FnZSkudG9Mb3dlckNhc2UoKSA6ICcnO1xuICAgICAgY29uc3QgaXNVbmF1dGhlbnRpY2F0ZWQgPVxuICAgICAgICAoZT8uY29kZSA9PT0gZ3JwYy5zdGF0dXMuVU5BVVRIRU5USUNBVEVEKSB8fFxuICAgICAgICBtc2dMb3dlci5pbmNsdWRlcygndW5hdXRoZW50aWNhdGVkJykgfHxcbiAgICAgICAgbXNnTG93ZXIuaW5jbHVkZXMoJ3Nlc3Npb24gbm90IGZvdW5kJykgfHxcbiAgICAgICAgbXNnTG93ZXIuaW5jbHVkZXMoJ3Nlc3Npb24gZXhwaXJlZCcpO1xuICAgICAgaWYgKGlzVW5hdXRoZW50aWNhdGVkICYmIHRoaXMuc3RvcmVkVXNlcm5hbWUpIHtcbiAgICAgICAgLy8gU2F2ZSBjdXJyZW50IGdyYXBoIGNvbnRleHQgYmVmb3JlIHJlLWxvZ2luXG4gICAgICAgIGNvbnN0IHNhdmVkR3JhcGggPSB0aGlzLnN0b3JlZEdyYXBoO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMubG9naW4odGhpcy5zdG9yZWRVc2VybmFtZSwgdGhpcy5zdG9yZWRQYXNzd29yZCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHRocm93IGU7IC8vIFJldHVybiBvcmlnaW5hbCBlcnJvciBpZiByZS1sb2dpbiBmYWlsc1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlc3RvcmUgZ3JhcGggY29udGV4dCBhZnRlciByZS1sb2dpblxuICAgICAgICBpZiAoc2F2ZWRHcmFwaCAmJiBzYXZlZEdyYXBoICE9PSAnX19zeXN0ZW1fXycpIHtcbiAgICAgICAgICB0cnkgeyBhd2FpdCB0aGlzLnVzZUdyYXBoKHNhdmVkR3JhcGgpOyB9IGNhdGNoIHsgLyogYmVzdCBlZmZvcnQgKi8gfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbigpOyAvLyBSZXRyeSBvbmNlXG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUZXJtaW5hdGUgdGhlIGN1cnJlbnQgc2Vzc2lvbiAqL1xuICBhc3luYyBsb2dvdXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvblNlcnZpY2UubG9nb3V0KCk7XG4gIH1cblxuICAvKiogQ2hlY2sgdGhlIGNvbm5lY3Rpb24gYW5kIHJldHVybiB0aGUgbGF0ZW5jeSBpbiBuYW5vc2Vjb25kcyAqL1xuICBhc3luYyBwaW5nKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvblNlcnZpY2UucGluZygpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFF1ZXJ5IFNlcnZpY2VcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEV4ZWN1dGUgYSBHUUwgcXVlcnkgYW5kIHJldHVybiB0aGUgcmVzdWx0ICovXG4gIGFzeW5jIGdxbChxdWVyeTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy53aXRoQXV0b1JlY29ubmVjdCgoKSA9PiB0aGlzLnF1ZXJ5U2VydmljZS5ncWwocXVlcnksIGNvbmZpZykpO1xuICB9XG5cbiAgLyoqIEV4ZWN1dGUgYSBHUUwgcXVlcnkgYW5kIHN0cmVhbSB0aGUgcmVzdWx0cyAqL1xuICBhc3luYyBncWxTdHJlYW0oXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZyxcbiAgICBjYWxsYmFjaz86IChyZXNwb25zZTogUmVzcG9uc2UpID0+IHZvaWRcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMud2l0aEF1dG9SZWNvbm5lY3QoKCkgPT4gdGhpcy5xdWVyeVNlcnZpY2UuZ3FsU3RyZWFtKHF1ZXJ5LCBjb25maWcsIGNhbGxiYWNrKSk7XG4gIH1cblxuICAvKiogUmV0dXJuIHRoZSBleGVjdXRpb24gcGxhbiBmb3IgYSBxdWVyeSAqL1xuICBhc3luYyBleHBsYWluKHF1ZXJ5OiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy53aXRoQXV0b1JlY29ubmVjdCgoKSA9PiB0aGlzLnF1ZXJ5U2VydmljZS5leHBsYWluKHF1ZXJ5LCBjb25maWcpKTtcbiAgfVxuXG4gIC8qKiBFeGVjdXRlIGEgcXVlcnkgd2l0aCBwcm9maWxpbmcgYW5kIHJldHVybiBzdGF0aXN0aWNzICovXG4gIGFzeW5jIHByb2ZpbGUocXVlcnk6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLndpdGhBdXRvUmVjb25uZWN0KCgpID0+IHRoaXMucXVlcnlTZXJ2aWNlLnByb2ZpbGUocXVlcnksIGNvbmZpZykpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEdyYXBoIFNlcnZpY2VcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIENyZWF0ZSBhIG5ldyBncmFwaCAqL1xuICBhc3luYyBjcmVhdGVHcmFwaChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZ3JhcGhUeXBlOiBHcmFwaFR5cGUgPSBHcmFwaFR5cGUuT1BFTixcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nID0gJydcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhcGhTZXJ2aWNlLmNyZWF0ZUdyYXBoKG5hbWUsIGdyYXBoVHlwZSwgZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgLyoqIERlbGV0ZSBhIGdyYXBoICovXG4gIGFzeW5jIGRyb3BHcmFwaChuYW1lOiBzdHJpbmcsIGlmRXhpc3RzOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5ncmFwaFNlcnZpY2UuZHJvcEdyYXBoKG5hbWUsIGlmRXhpc3RzKTtcbiAgfVxuXG4gIC8qKiBTZXQgdGhlIGN1cnJlbnQgZ3JhcGggZm9yIHRoZSBzZXNzaW9uICovXG4gIGFzeW5jIHVzZUdyYXBoKG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZ3JhcGhTZXJ2aWNlLnVzZUdyYXBoKG5hbWUpO1xuICAgIHRoaXMuc3RvcmVkR3JhcGggPSBuYW1lO1xuICB9XG5cbiAgLyoqIFJldHVybiBhbGwgYXZhaWxhYmxlIGdyYXBocyAqL1xuICBhc3luYyBsaXN0R3JhcGhzKCk6IFByb21pc2U8R3JhcGhJbmZvW10+IHtcbiAgICByZXR1cm4gdGhpcy5ncmFwaFNlcnZpY2UubGlzdEdyYXBocygpO1xuICB9XG5cbiAgLyoqIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmljIGdyYXBoICovXG4gIGFzeW5jIGdldEdyYXBoSW5mbyhuYW1lOiBzdHJpbmcpOiBQcm9taXNlPEdyYXBoSW5mbz4ge1xuICAgIHJldHVybiB0aGlzLmdyYXBoU2VydmljZS5nZXRHcmFwaEluZm8obmFtZSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVHJhbnNhY3Rpb24gU2VydmljZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogU3RhcnQgYSBuZXcgdHJhbnNhY3Rpb24gKi9cbiAgYXN5bmMgYmVnaW5UcmFuc2FjdGlvbihcbiAgICBncmFwaE5hbWU6IHN0cmluZyxcbiAgICByZWFkT25seTogYm9vbGVhbiA9IGZhbHNlLFxuICAgIHRpbWVvdXQ6IG51bWJlciA9IDBcbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdGhpcy50cmFuc2FjdGlvblNlcnZpY2UuYmVnaW5UcmFuc2FjdGlvbihncmFwaE5hbWUsIHJlYWRPbmx5LCB0aW1lb3V0KTtcbiAgICAvLyBTdXJmYWNlIHRoZSBwZXItY2xpZW50IGxvZ2ljYWwgc2Vzc2lvbiBpZCBvbiB0aGUgcmV0dXJuZWQgdHhcbiAgICAvLyAodHJhbnNhY3Rpb24tYnJhbmNoIGVyZ29ub21pYywgc2VlIFRSQU5TQUNUSU9OU19EUklWRVJfR1VJREUubWQpLlxuICAgICh0eCBhcyBhbnkpLmNsaWVudFNlc3Npb25JZCA9IHRoaXMuY2xpZW50U2Vzc2lvbklkO1xuICAgIHJldHVybiB0eDtcbiAgfVxuXG4gIC8qKiBDb21taXQgYSB0cmFuc2FjdGlvbiAqL1xuICBhc3luYyBjb21taXQodHJhbnNhY3Rpb25JZDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25TZXJ2aWNlLmNvbW1pdCh0cmFuc2FjdGlvbklkKTtcbiAgfVxuXG4gIC8qKiBSb2xsYmFjayBhIHRyYW5zYWN0aW9uICovXG4gIGFzeW5jIHJvbGxiYWNrKHRyYW5zYWN0aW9uSWQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uU2VydmljZS5yb2xsYmFjayh0cmFuc2FjdGlvbklkKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWN0aXZlIHRyYW5zYWN0aW9ucyAqL1xuICBhc3luYyBsaXN0VHJhbnNhY3Rpb25zKCk6IFByb21pc2U8VHJhbnNhY3Rpb25JbmZvW10+IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvblNlcnZpY2UubGlzdFRyYW5zYWN0aW9ucygpO1xuICB9XG5cbiAgLyoqIEV4ZWN1dGUgYSBmdW5jdGlvbiB3aXRoaW4gYSB0cmFuc2FjdGlvbiAqL1xuICBhc3luYyB3aXRoVHJhbnNhY3Rpb248VD4oXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgZm46ICh0eElkOiBudW1iZXIpID0+IFByb21pc2U8VD4sXG4gICAgcmVhZE9ubHk6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvblNlcnZpY2Uud2l0aFRyYW5zYWN0aW9uKGdyYXBoTmFtZSwgZm4sIHJlYWRPbmx5KTtcbiAgfVxuXG4gIC8vIC0tLS0gQWRtaW4gRERMIHN1cmZhY2UgKHRyYW5zYWN0aW9uLWJyYW5jaCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYWN0aXZlIHRyYW5zYWN0aW9ucyB2aWEgdGhlIEdRTCBhZG1pbiBEREwgYFNIT1cgVFJBTlNBQ1RJT05TYC5cbiAgICogRWFjaCByb3cgbWlycm9ycyB0aGUgNS1jb2x1bW4gc2VydmVyLXNpZGUgc2NoZW1hOlxuICAgKiBgdHJhbnNhY3Rpb25JZCAvIHN0YXR1cyAvIHJlYWRPbmx5IC8gc3RhcnRUaW1lIC8gc2Vzc2lvbklkYC5cbiAgICogYHNlc3Npb25JZGAgaXMgYCcnYCB1bmxlc3MgdGhlIHNlcnZlciBoYXMgYXV0by1kZXJpdmVkIG9uZSBmcm9tIHBlZXJcbiAgICogaW5mbyBvciB0aGUgZHJpdmVyIGV4cGxpY2l0bHkgc3VyZmFjZXMgYHgtdWx0aXBhLXNlc3Npb24taWRgIG1ldGFkYXRhLlxuICAgKlxuICAgKiBEaXN0aW5jdCBmcm9tIGBsaXN0VHJhbnNhY3Rpb25zKClgIHdoaWNoIHVzZXMgdGhlIGxlZ2FjeSBnUlBDLlxuICAgKi9cbiAgYXN5bmMgc2hvd1RyYW5zYWN0aW9ucygpOiBQcm9taXNlPFRyYW5zYWN0aW9uUm93W10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgVFJBTlNBQ1RJT05TJyk7XG4gICAgY29uc3QgaWR4OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gICAgcmVzcC5jb2x1bW5zLmZvckVhY2goKGMsIGkpID0+IHsgaWR4W2NdID0gaTsgfSk7XG4gICAgY29uc3Qgcm93czogVHJhbnNhY3Rpb25Sb3dbXSA9IFtdO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIHJlc3Aucm93cykge1xuICAgICAgY29uc3QgZ2V0ID0gKG46IHN0cmluZywgZmFsbGJhY2s6IGFueSA9ICcnKSA9PiB7XG4gICAgICAgIGNvbnN0IGkgPSBpZHhbbl07XG4gICAgICAgIHJldHVybiBpID09PSB1bmRlZmluZWQgPyBmYWxsYmFjayA6IChyb3cudmFsdWVzW2ldIGFzIGFueSk/LnZhbHVlID8/IHJvdy52YWx1ZXNbaV07XG4gICAgICB9O1xuICAgICAgcm93cy5wdXNoKHtcbiAgICAgICAgdHJhbnNhY3Rpb25JZDogU3RyaW5nKGdldCgndHJhbnNhY3Rpb25faWQnLCAnJykgPz8gJycpLFxuICAgICAgICBzdGF0dXM6IFN0cmluZyhnZXQoJ3N0YXR1cycsICcnKSA/PyAnJyksXG4gICAgICAgIHJlYWRPbmx5OiBCb29sZWFuKGdldCgncmVhZF9vbmx5JywgZmFsc2UpKSxcbiAgICAgICAgc3RhcnRUaW1lOiBTdHJpbmcoZ2V0KCdzdGFydF90aW1lJywgJycpID8/ICcnKSxcbiAgICAgICAgc2Vzc2lvbklkOiBTdHJpbmcoZ2V0KCdzZXNzaW9uX2lkJywgJycpID8/ICcnKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcm93cztcbiAgfVxuXG4gIC8qKlxuICAgKiBSb2xsIGJhY2sgYSBzaW5nbGUgdHJhbnNhY3Rpb24gYnkgaWQgdmlhIGBLSUxMIFRSQU5TQUNUSU9OICc8aWQ+J2AuXG4gICAqIGB0cmFuc2FjdGlvbklkYCBoZXJlIGlzIHRoZSAqKnN0cmluZyoqIGlkIHN1cmZhY2VkIGJ5XG4gICAqIGBzaG93VHJhbnNhY3Rpb25zKClgIChlLmcuIGAndHhfYTM5NmM1MzEtLi4uJ2ApLCBkaXN0aW5jdCBmcm9tIHRoZVxuICAgKiBgbnVtYmVyYCBpZCByZXR1cm5lZCBieSBgYmVnaW4oKWAuXG4gICAqL1xuICBhc3luYyBraWxsVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25JZDogc3RyaW5nKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IGVzY2FwZWQgPSBTdHJpbmcodHJhbnNhY3Rpb25JZCkucmVwbGFjZSgvJy9nLCBcIicnXCIpO1xuICAgIHJldHVybiB0aGlzLmdxbChgS0lMTCBUUkFOU0FDVElPTiAnJHtlc2NhcGVkfSdgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSb2xsIGJhY2sgZXZlcnkgYWN0aXZlIHRyYW5zYWN0aW9uIHZpYSBgUkVTRVQgVFJBTlNBQ1RJT05TYC4gQWRtaW4tb25seS5cbiAgICogSW50ZW5kZWQgYXMgYW4gZXNjYXBlIGhhdGNoIHdoZW4gYW4gb3JwaGFuIHR4IGJsb2NrcyBuZXcgQkVHSU5zLlxuICAgKi9cbiAgYXN5bmMgcmVzZXRUcmFuc2FjdGlvbnMoKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbCgnUkVTRVQgVFJBTlNBQ1RJT05TJyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRGF0YSBTZXJ2aWNlXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBJbnNlcnQgbXVsdGlwbGUgbm9kZXMgaW50byBhIGdyYXBoIHVzaW5nIGdSUEMgYnVsayBpbnNlcnQgKi9cbiAgYXN5bmMgaW5zZXJ0Tm9kZXNCYXRjaEF1dG8oXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgbm9kZXM6IE5vZGVEYXRhW10sXG4gICAgY29uZmlnPzogSW5zZXJ0Tm9kZXNDb25maWdcbiAgKTogUHJvbWlzZTxJbnNlcnROb2Rlc1Jlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLmluc2VydE5vZGVzKGdyYXBoTmFtZSwgbm9kZXMsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogSW5zZXJ0IG11bHRpcGxlIGVkZ2VzIGludG8gYSBncmFwaCB1c2luZyBnUlBDIGJ1bGsgaW5zZXJ0ICovXG4gIGFzeW5jIGluc2VydEVkZ2VzQmF0Y2hBdXRvKFxuICAgIGdyYXBoTmFtZTogc3RyaW5nLFxuICAgIGVkZ2VzOiBFZGdlRGF0YVtdLFxuICAgIGNvbmZpZz86IEluc2VydEVkZ2VzQ29uZmlnXG4gICk6IFByb21pc2U8SW5zZXJ0RWRnZXNSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5pbnNlcnRFZGdlcyhncmFwaE5hbWUsIGVkZ2VzLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIERlbGV0ZSBub2RlcyBmcm9tIGEgZ3JhcGggKi9cbiAgYXN5bmMgZGVsZXRlTm9kZXMoXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgbm9kZUlkcz86IHN0cmluZ1tdLFxuICAgIGxhYmVscz86IHN0cmluZ1tdLFxuICAgIHdoZXJlPzogc3RyaW5nXG4gICk6IFByb21pc2U8RGVsZXRlUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2UuZGVsZXRlTm9kZXMoZ3JhcGhOYW1lLCBub2RlSWRzLCBsYWJlbHMsIHdoZXJlKTtcbiAgfVxuXG4gIC8qKiBEZWxldGUgZWRnZXMgZnJvbSBhIGdyYXBoICovXG4gIGFzeW5jIGRlbGV0ZUVkZ2VzKFxuICAgIGdyYXBoTmFtZTogc3RyaW5nLFxuICAgIGVkZ2VJZHM/OiBzdHJpbmdbXSxcbiAgICBsYWJlbD86IHN0cmluZyxcbiAgICB3aGVyZT86IHN0cmluZ1xuICApOiBQcm9taXNlPERlbGV0ZVJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLmRlbGV0ZUVkZ2VzKGdyYXBoTmFtZSwgZWRnZUlkcywgbGFiZWwsIHdoZXJlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnQgZ3JhcGggZGF0YSBpbiBKU09OIExpbmVzIGZvcm1hdCAoc3RyZWFtaW5nKS5cbiAgICogQHBhcmFtIGNvbmZpZyBFeHBvcnQgY29uZmlndXJhdGlvblxuICAgKiBAcGFyYW0gY2FsbGJhY2sgQ2FsbGJhY2sgZm9yIGVhY2ggZXhwb3J0ZWQgY2h1bmtcbiAgICovXG4gIGFzeW5jIGV4cG9ydChcbiAgICBjb25maWc6IEV4cG9ydENvbmZpZyxcbiAgICBjYWxsYmFjaz86IChjaHVuazogRXhwb3J0Q2h1bmspID0+IHZvaWRcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2UuZXhwb3J0KGNvbmZpZywgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0cmVhbSBub2RlcyBmcm9tIGEgZ3JhcGhcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGV4cG9ydCgpIHdpdGggRXhwb3J0Q29uZmlnIGluc3RlYWRcbiAgICovXG4gIGFzeW5jIGV4cG9ydE5vZGVzKFxuICAgIGdyYXBoTmFtZTogc3RyaW5nLFxuICAgIGxhYmVscz86IHN0cmluZ1tdLFxuICAgIGxpbWl0OiBudW1iZXIgPSAwLFxuICAgIGNhbGxiYWNrPzogKHJlc3VsdDogRXhwb3J0Tm9kZXNSZXN1bHQpID0+IHZvaWRcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2UuZXhwb3J0Tm9kZXMoZ3JhcGhOYW1lLCBsYWJlbHMsIGxpbWl0LCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogU3RyZWFtIGVkZ2VzIGZyb20gYSBncmFwaFxuICAgKiBAZGVwcmVjYXRlZCBVc2UgZXhwb3J0KCkgd2l0aCBFeHBvcnRDb25maWcgaW5zdGVhZFxuICAgKi9cbiAgYXN5bmMgZXhwb3J0RWRnZXMoXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgbGFiZWxzPzogc3RyaW5nW10sXG4gICAgbGltaXQ6IG51bWJlciA9IDAsXG4gICAgY2FsbGJhY2s/OiAocmVzdWx0OiBFeHBvcnRFZGdlc1Jlc3VsdCkgPT4gdm9pZFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5leHBvcnRFZGdlcyhncmFwaE5hbWUsIGxhYmVscywgbGltaXQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBIZWFsdGggU2VydmljZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogQ2hlY2sgdGhlIGhlYWx0aCBvZiBhIHNlcnZpY2UgKi9cbiAgYXN5bmMgaGVhbHRoQ2hlY2soc2VydmljZTogc3RyaW5nID0gJycpOiBQcm9taXNlPEhlYWx0aFN0YXR1cz4ge1xuICAgIHJldHVybiB0aGlzLmhlYWx0aFNlcnZpY2UuaGVhbHRoQ2hlY2soc2VydmljZSk7XG4gIH1cblxuICAvKipcbiAgICogV2F0Y2ggaGVhbHRoIHN0YXR1cyBjaGFuZ2VzIHZpYSBzZXJ2ZXItc2lkZSBzdHJlYW1pbmcuXG4gICAqIFJldHVybnMgYSBIZWFsdGhXYXRjaGVyIHRoYXQgZW1pdHMgJ3N0YXR1cycgZXZlbnRzIHdpdGggSGVhbHRoU3RhdHVzIHZhbHVlcy5cbiAgICogQ2FsbCBzdG9wKCkgdG8gY2FuY2VsIHRoZSBzdHJlYW0uXG4gICAqXG4gICAqIEBwYXJhbSBzZXJ2aWNlIC0gT3B0aW9uYWwgc2VydmljZSBuYW1lIHRvIHdhdGNoXG4gICAqIEByZXR1cm5zIEhlYWx0aFdhdGNoZXIgLSBFdmVudEVtaXR0ZXIgd2l0aCBzdG9wKCkgbWV0aG9kXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgd2F0Y2hlciA9IGNsaWVudC53YXRjaCgpO1xuICAgKiB3YXRjaGVyLm9uKCdzdGF0dXMnLCAoc3RhdHVzOiBIZWFsdGhTdGF0dXMpID0+IHtcbiAgICogICBjb25zb2xlLmxvZygnSGVhbHRoIHN0YXR1czonLCBzdGF0dXMpO1xuICAgKiB9KTtcbiAgICogd2F0Y2hlci5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAqICAgY29uc29sZS5lcnJvcignV2F0Y2ggZXJyb3I6JywgZXJyKTtcbiAgICogfSk7XG4gICAqIHdhdGNoZXIub24oJ2VuZCcsICgpID0+IHtcbiAgICogICBjb25zb2xlLmxvZygnV2F0Y2ggc3RyZWFtIGVuZGVkJyk7XG4gICAqIH0pO1xuICAgKiAvLyBMYXRlciwgdG8gc3RvcCB3YXRjaGluZzpcbiAgICogd2F0Y2hlci5zdG9wKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgd2F0Y2goc2VydmljZTogc3RyaW5nID0gJycpOiBIZWFsdGhXYXRjaGVyIHtcbiAgICByZXR1cm4gdGhpcy5oZWFsdGhTZXJ2aWNlLndhdGNoKHNlcnZpY2UpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFkbWluIFNlcnZpY2VcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIFByZS1hbGxvY2F0ZSBwYXJzZXIgaW5zdGFuY2VzICovXG4gIGFzeW5jIHdhcm11cFBhcnNlcihjb3VudDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuYWRtaW5TZXJ2aWNlLndhcm11cFBhcnNlcihjb3VudCk7XG4gIH1cblxuICAvKiogUmV0dXJuIGNhY2hlIHN0YXRpc3RpY3MgKi9cbiAgYXN5bmMgZ2V0Q2FjaGVTdGF0cyhjYWNoZVR5cGU6IENhY2hlVHlwZSA9IENhY2hlVHlwZS5BTEwpOiBQcm9taXNlPENhY2hlU3RhdHM+IHtcbiAgICByZXR1cm4gdGhpcy5hZG1pblNlcnZpY2UuZ2V0Q2FjaGVTdGF0cyhjYWNoZVR5cGUpO1xuICB9XG5cbiAgLyoqIENsZWFyIHRoZSBzcGVjaWZpZWQgY2FjaGUgKi9cbiAgYXN5bmMgY2xlYXJDYWNoZShjYWNoZVR5cGU6IENhY2hlVHlwZSA9IENhY2hlVHlwZS5BTEwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5hZG1pblNlcnZpY2UuY2xlYXJDYWNoZShjYWNoZVR5cGUpO1xuICB9XG5cbiAgLyoqIFJldHVybiBkYXRhYmFzZSBzdGF0aXN0aWNzICovXG4gIGFzeW5jIGdldFN0YXRpc3RpY3MoZ3JhcGhOYW1lOiBzdHJpbmcgPSAnJyk6IFByb21pc2U8U3RhdGlzdGljcz4ge1xuICAgIHJldHVybiB0aGlzLmFkbWluU2VydmljZS5nZXRTdGF0aXN0aWNzKGdyYXBoTmFtZSk7XG4gIH1cblxuICAvKiogSW52YWxpZGF0ZSB0aGUgUkJBQyBwZXJtaXNzaW9uIGNhY2hlICovXG4gIGFzeW5jIGludmFsaWRhdGVQZXJtaXNzaW9uQ2FjaGUodXNlcm5hbWU6IHN0cmluZyA9ICcnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuYWRtaW5TZXJ2aWNlLmludmFsaWRhdGVQZXJtaXNzaW9uQ2FjaGUodXNlcm5hbWUpO1xuICB9XG5cbiAgLyoqIFJldHVybiBzeXN0ZW0tbGV2ZWwgbWV0cmljcyAoQ1BVLCBtZW1vcnksIGRpc2sgSS9PLCBzdG9yYWdlLCBuZXR3b3JrKSAqL1xuICBhc3luYyBnZXRTeXN0ZW1NZXRyaWNzKCk6IFByb21pc2U8U3lzdGVtTWV0cmljcz4ge1xuICAgIHJldHVybiB0aGlzLmFkbWluU2VydmljZS5nZXRTeXN0ZW1NZXRyaWNzKCk7XG4gIH1cblxuICAvKiogVHJpZ2dlciBtYW51YWwgY29tcGFjdGlvbiBvZiB0aGUgZGF0YWJhc2Ugc3RvcmFnZSAqL1xuICBhc3luYyBjb21wYWN0KCk6IFByb21pc2U8Q29tcGFjdFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmFkbWluU2VydmljZS5jb21wYWN0KCk7XG4gIH1cblxuICAvKiogV2FpdCBmb3IgdGhlIGNvbXB1dGluZyBlbmdpbmUgdG9wb2xvZ3kgdG8gYmUgcmVhZHkgKi9cbiAgYXN5bmMgd2FpdEZvckNvbXB1dGVUb3BvbG9neShncmFwaE5hbWU6IHN0cmluZywgdGltZW91dE1zOiBudW1iZXIgPSAwKTogUHJvbWlzZTxDb21wdXRlVG9wb2xvZ3lSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5hZG1pblNlcnZpY2Uud2FpdEZvckNvbXB1dGVUb3BvbG9neShncmFwaE5hbWUsIHRpbWVvdXRNcyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQnVsayBJbXBvcnQgU2VydmljZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogU3RhcnQgYSBidWxrIGltcG9ydCBzZXNzaW9uIGZvciBvcHRpbWl6ZWQgaGlnaC10aHJvdWdocHV0IGluc2VydHMuXG4gICAqIEBwYXJhbSBncmFwaE5hbWUgVGFyZ2V0IGdyYXBoIG5hbWVcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uYWwgYnVsayBpbXBvcnQgY29uZmlndXJhdGlvblxuICAgKi9cbiAgYXN5bmMgc3RhcnRCdWxrSW1wb3J0KGdyYXBoTmFtZTogc3RyaW5nLCBvcHRpb25zPzogQnVsa0ltcG9ydE9wdGlvbnMpOiBQcm9taXNlPEJ1bGtJbXBvcnRTZXNzaW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuYnVsa0ltcG9ydFNlcnZpY2Uuc3RhcnRCdWxrSW1wb3J0KGdyYXBoTmFtZSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgQ2hlY2twb2ludCBpcyBubyBsb25nZXIgbmVlZGVkLiBVc2UgZW5kQnVsa0ltcG9ydCgpIHdoaWNoIHBlcmZvcm1zIGEgZmluYWwgZmx1c2guXG4gICAqL1xuICBhc3luYyBjaGVja3BvaW50KHNlc3Npb25JZDogc3RyaW5nKTogUHJvbWlzZTxDaGVja3BvaW50UmVzdWx0PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICByZWNvcmRDb3VudDogMCxcbiAgICAgIGxhc3RDaGVja3BvaW50Q291bnQ6IDAsXG4gICAgICBtZXNzYWdlOiAnQ2hlY2twb2ludCBoYXMgYmVlbiByZW1vdmVkOyB1c2UgZW5kQnVsa0ltcG9ydCB3aGljaCBwZXJmb3JtcyBhIGZpbmFsIGZsdXNoJyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEVuZCB0aGUgYnVsayBpbXBvcnQgc2Vzc2lvbiB3aXRoIGEgZmluYWwgY2hlY2twb2ludC5cbiAgICogQHBhcmFtIHNlc3Npb25JZCBCdWxrIGltcG9ydCBzZXNzaW9uIElEXG4gICAqL1xuICBhc3luYyBlbmRCdWxrSW1wb3J0KHNlc3Npb25JZDogc3RyaW5nKTogUHJvbWlzZTxFbmRCdWxrSW1wb3J0UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuYnVsa0ltcG9ydFNlcnZpY2UuZW5kQnVsa0ltcG9ydChzZXNzaW9uSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbCB0aGUgYnVsayBpbXBvcnQgc2Vzc2lvbiB3aXRob3V0IGZpbmFsIHN5bmMuXG4gICAqIEBwYXJhbSBzZXNzaW9uSWQgQnVsayBpbXBvcnQgc2Vzc2lvbiBJRFxuICAgKi9cbiAgYXN5bmMgYWJvcnRCdWxrSW1wb3J0KHNlc3Npb25JZDogc3RyaW5nKTogUHJvbWlzZTxBYm9ydEJ1bGtJbXBvcnRSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5idWxrSW1wb3J0U2VydmljZS5hYm9ydEJ1bGtJbXBvcnQoc2Vzc2lvbklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgc3RhdHVzIG9mIGEgYnVsayBpbXBvcnQgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHNlc3Npb25JZCBCdWxrIGltcG9ydCBzZXNzaW9uIElEXG4gICAqL1xuICBhc3luYyBnZXRCdWxrSW1wb3J0U3RhdHVzKHNlc3Npb25JZDogc3RyaW5nKTogUHJvbWlzZTxCdWxrSW1wb3J0U3RhdHVzPiB7XG4gICAgcmV0dXJuIHRoaXMuYnVsa0ltcG9ydFNlcnZpY2UuZ2V0QnVsa0ltcG9ydFN0YXR1cyhzZXNzaW9uSWQpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENvbnZlbmllbmNlIE1ldGhvZHMg4oCUIEdldHRlcnNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEdldCB0aGUgY3VycmVudCBzZXNzaW9uICovXG4gIGdldFNlc3Npb24oKTogU2Vzc2lvbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25zLmdldFNlc3Npb24oKTtcbiAgfVxuXG4gIC8qKiBDaGVjayBpZiB0aGVyZSBpcyBhbiBhY3RpdmUgc2Vzc2lvbiAqL1xuICBpc0xvZ2dlZEluKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25zLmlzTG9nZ2VkSW4oKTtcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIGNsaWVudCBjb25maWd1cmF0aW9uICovXG4gIGdldENvbmZpZygpOiBHcWxkYkNvbmZpZyB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhpcyBjbGllbnQgaXMgY29ubmVjdGVkIHRvIGEgY2x1c3RlciBkZXBsb3ltZW50ICovXG4gIGdldCBpc0NsdXN0ZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbnMuZ2V0U2Vzc2lvbigpPy5pc0NsdXN0ZXIgfHwgZmFsc2U7XG4gIH1cblxuICAvKiogR2V0IHRoZSBjbHVzdGVyIElEIChlbXB0eSBzdHJpbmcgaWYgbm90IGEgY2x1c3RlcikgKi9cbiAgZ2V0IGNsdXN0ZXJJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25zLmdldFNlc3Npb24oKT8uY2x1c3RlcklkIHx8ICcnO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgcGFydGl0aW9uIGNvdW50ICgwIGlmIG5vdCBhIGNsdXN0ZXIpICovXG4gIGdldCBwYXJ0aXRpb25Db3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25zLmdldFNlc3Npb24oKT8ucGFydGl0aW9uQ291bnQgfHwgMDtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJbnRlcm5hbCBIZWxwZXJzIOKAlCBOYW1lIFF1b3RpbmdcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIFdyYXAgYSBuYW1lIGluIGJhY2t0aWNrcyBmb3Igc2FmZSB1c2UgaW4gR1FMIHN0YXRlbWVudHMuXG4gICAqIExhYmVsIG5hbWVzIGFuZCBwcm9wZXJ0eSBuYW1lcyBzaG91bGQgYmUgcXVvdGVkOyBncmFwaCBuYW1lcywgaW5kZXggbmFtZXMsXG4gICAqIGFuZCBmdWxsdGV4dCBuYW1lcyBzaG91bGQgTk9UIGJlIHdyYXBwZWQgaW4gYmFja3RpY2tzLiAqL1xuICBwcml2YXRlIHN0YXRpYyBxdW90ZUxhYmVsKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdgJyArIG5hbWUgKyAnYCc7XG4gIH1cblxuICAvKiogV3JhcCBlYWNoIGxhYmVsIG5hbWUgaW4gYmFja3RpY2tzIGFuZCBqb2luIHdpdGggXCIsIFwiICovXG4gIHByaXZhdGUgc3RhdGljIHF1b3RlTGFiZWxzKC4uLm5hbWVzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5hbWVzLm1hcChuID0+ICdgJyArIG4gKyAnYCcpLmpvaW4oJywgJyk7XG4gIH1cblxuICAvKiogSm9pbiBuYW1lcyB3aXRoIFwiLCBcIiB3aXRob3V0IGJhY2t0aWNrIHdyYXBwaW5nICovXG4gIHByaXZhdGUgc3RhdGljIGpvaW5OYW1lcyguLi5uYW1lczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIHJldHVybiBuYW1lcy5qb2luKCcsICcpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENvbnZlbmllbmNlIEFQSSDigJQgR3JhcGggT3BlcmF0aW9ucyAoNiBtZXRob2RzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogQ3JlYXRlIGEgbmV3IG9wZW4gKHNjaGVtYS1sZXNzKSBncmFwaFxuICAgKlxuICAgKiB2NiBHUUw6IGBDUkVBVEUgR1JBUEggZ2AgLT4gT1BFTjsgYENSRUFURSBHUkFQSCBnIHt9YCAtPiBDTE9TRUQuIFRoZVxuICAgKiBicmFjZS1sZXNzIGZvcm0gaXMgcmVxdWlyZWQgdG8gYWN0dWFsbHkgZ2V0IGFuIE9QRU4gZ3JhcGguXG4gICAqL1xuICBhc3luYyBjcmVhdGVPcGVuR3JhcGgobmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoYENSRUFURSBHUkFQSCAke25hbWV9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBDcmVhdGUgYSBuZXcgY2xvc2VkIChzY2hlbWEtZW5mb3JjZWQpIGdyYXBoIHdpdGggbm9kZSBhbmQgZWRnZSBsYWJlbCBkZWZpbml0aW9ucyAqL1xuICBhc3luYyBjcmVhdGVDbG9zZWRHcmFwaChuYW1lOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgQ1JFQVRFIEdSQVBIICR7bmFtZX0ge31gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGdyYXBoIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ3JhcGggd2FzIGNyZWF0ZWQsIGZhbHNlIGlmIGl0IGFscmVhZHkgZXhpc3RlZC5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZUdyYXBoSWZOb3RFeGlzdChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZ3JhcGhUeXBlOiBHcmFwaFR5cGUgPSBHcmFwaFR5cGUuT1BFTixcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nID0gJydcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuY3JlYXRlR3JhcGgobmFtZSwgZ3JhcGhUeXBlLCBkZXNjcmlwdGlvbik7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGNvbnN0IG1zZyA9IChlLm1lc3NhZ2UgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAobXNnLmluY2x1ZGVzKCdhbHJlYWR5IGV4aXN0JykgfHwgbXNnLmluY2x1ZGVzKCdkdXBsaWNhdGUnKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDaGVjayB3aGV0aGVyIGEgZ3JhcGggd2l0aCB0aGUgZ2l2ZW4gbmFtZSBleGlzdHMgKi9cbiAgYXN5bmMgaGFzR3JhcGgobmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgZ3JhcGhzID0gYXdhaXQgdGhpcy5saXN0R3JhcGhzKCk7XG4gICAgcmV0dXJuIGdyYXBocy5zb21lKGcgPT4gZy5uYW1lID09PSBuYW1lKTtcbiAgfVxuXG4gIC8qKiBSZW5hbWUgYSBncmFwaCAqL1xuICBhc3luYyBhbHRlckdyYXBoKGdyYXBoTmFtZTogc3RyaW5nLCBuZXdOYW1lOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgQUxURVIgR1JBUEggJHtncmFwaE5hbWV9IFJFTkFNRSBUTyAke25ld05hbWV9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBSZW1vdmUgYWxsIGRhdGEgZnJvbSBhIGdyYXBoIHdoaWxlIGtlZXBpbmcgaXRzIHN0cnVjdHVyZSAqL1xuICBhc3luYyB0cnVuY2F0ZShncmFwaE5hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBUUlVOQ0FURSBHUkFQSCAke2dyYXBoTmFtZX1gLCBjb25maWcpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENvbnZlbmllbmNlIEFQSSDigJQgTGFiZWwgT3BlcmF0aW9ucyAoMTYgbWV0aG9kcylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIFJldHVybiBhbGwgbGFiZWxzIChub2RlIGFuZCBlZGdlKSBpbiB0aGUgY3VycmVudCBncmFwaCAqL1xuICBhc3luYyBzaG93TGFiZWxzKGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxMYWJlbEluZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBMQUJFTFMnLCBjb25maWcpO1xuICAgIHJldHVybiBwYXJzZUxhYmVsSW5mb1Jvd3MocmVzcCk7XG4gIH1cblxuICAvKiogUmV0dXJuIGFsbCBub2RlIGxhYmVscyBpbiB0aGUgY3VycmVudCBncmFwaCAqL1xuICBhc3luYyBzaG93Tm9kZUxhYmVscyhjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8TGFiZWxJbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgTk9ERSBMQUJFTFMnLCBjb25maWcpO1xuICAgIHJldHVybiBwYXJzZUxhYmVsSW5mb1Jvd3MocmVzcCwgJ05PREUnKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWxsIGVkZ2UgbGFiZWxzIGluIHRoZSBjdXJyZW50IGdyYXBoICovXG4gIGFzeW5jIHNob3dFZGdlTGFiZWxzKGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxMYWJlbEluZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBFREdFIExBQkVMUycsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHBhcnNlTGFiZWxJbmZvUm93cyhyZXNwLCAnRURHRScpO1xuICB9XG5cbiAgLyoqIFJldHVybiBhbGwgbm9kZSB0eXBlcyB3aXRoIHRoZWlyIHByb3BlcnRpZXMgKi9cbiAgYXN5bmMgc2hvd05vZGVUeXBlcyhjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8Tm9kZVR5cGVJbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgTk9ERSBUWVBFUycsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHBhcnNlTm9kZVR5cGVJbmZvUm93cyhyZXNwKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWxsIGVkZ2UgdHlwZXMgd2l0aCB0aGVpciBwcm9wZXJ0aWVzICovXG4gIGFzeW5jIHNob3dFZGdlVHlwZXMoY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPEVkZ2VUeXBlSW5mb1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdTSE9XIEVER0UgVFlQRVMnLCBjb25maWcpO1xuICAgIHJldHVybiBwYXJzZUVkZ2VUeXBlSW5mb1Jvd3MocmVzcCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgc3BlY2lmaWMgbGFiZWwgYnkgbmFtZSBmcm9tIHRoZSBjdXJyZW50IGdyYXBoLCBvciBudWxsIGlmIG5vdCBmb3VuZC5cbiAgICogTWF0Y2hlcyBlbnRyaWVzIHdoZXJlIGBuYW1lYCBpcyBvbmUgb2YgdGhlIC5sYWJlbHMgKHN1cHBvcnRzIG11bHRpLWxhYmVsIGdyb3VwcykuXG4gICAqL1xuICBhc3luYyBnZXRMYWJlbChuYW1lOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxMYWJlbEluZm8gfCBudWxsPiB7XG4gICAgY29uc3QgbGFiZWxzID0gYXdhaXQgdGhpcy5zaG93TGFiZWxzKGNvbmZpZyk7XG4gICAgcmV0dXJuIGxhYmVscy5maW5kKGwgPT4gbC5sYWJlbHMuaW5jbHVkZXMobmFtZSkpIHx8IG51bGw7XG4gIH1cblxuICAvKiogUmV0dXJuIGEgc3BlY2lmaWMgbm9kZSB0eXBlIGJ5IG5hbWUsIG9yIG51bGwgaWYgbm90IGZvdW5kICovXG4gIGFzeW5jIGdldE5vZGVMYWJlbChuYW1lOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxOb2RlVHlwZUluZm8gfCBudWxsPiB7XG4gICAgY29uc3QgdHlwZXMgPSBhd2FpdCB0aGlzLnNob3dOb2RlVHlwZXMoY29uZmlnKTtcbiAgICByZXR1cm4gdHlwZXMuZmluZCh0ID0+IHQubmFtZSA9PT0gbmFtZSkgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYSBzcGVjaWZpYyBlZGdlIHR5cGUgYnkgbmFtZSwgb3IgbnVsbCBpZiBub3QgZm91bmQgKi9cbiAgYXN5bmMgZ2V0RWRnZUxhYmVsKG5hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPEVkZ2VUeXBlSW5mbyB8IG51bGw+IHtcbiAgICBjb25zdCB0eXBlcyA9IGF3YWl0IHRoaXMuc2hvd0VkZ2VUeXBlcyhjb25maWcpO1xuICAgIHJldHVybiB0eXBlcy5maW5kKHQgPT4gdC5uYW1lID09PSBuYW1lKSB8fCBudWxsO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhIG5vZGUgbGFiZWwgaW4gdGhlIGN1cnJlbnQgZ3JhcGggKGNsb3NlZCBncmFwaCkgKi9cbiAgYXN5bmMgY3JlYXRlTm9kZUxhYmVsKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogQ29udlByb3BlcnR5RGVmW10gPSBbXSxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgdGFyZ2V0R3JhcGggPSBjb25maWc/LmdyYXBoTmFtZSB8fCB0aGlzLnNlc3Npb25zLmdldERlZmF1bHRHcmFwaCgpO1xuICAgIGNvbnN0IHByb3BTdHIgPSBidWlsZFByb3BlcnR5RGVmU3RyaW5nKHByb3BzKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEFMVEVSIEdSQVBIICR7dGFyZ2V0R3JhcGh9IEFERCBOT0RFIHsgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKG5hbWUpfSAoJHtwcm9wU3RyfSkgfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogQ3JlYXRlIGFuIGVkZ2UgbGFiZWwgaW4gdGhlIGN1cnJlbnQgZ3JhcGggKGNsb3NlZCBncmFwaCkgKi9cbiAgYXN5bmMgY3JlYXRlRWRnZUxhYmVsKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogQ29udlByb3BlcnR5RGVmW10gPSBbXSxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgdGFyZ2V0R3JhcGggPSBjb25maWc/LmdyYXBoTmFtZSB8fCB0aGlzLnNlc3Npb25zLmdldERlZmF1bHRHcmFwaCgpO1xuICAgIGNvbnN0IHByb3BTdHIgPSBidWlsZFByb3BlcnR5RGVmU3RyaW5nKHByb3BzKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEFMVEVSIEdSQVBIICR7dGFyZ2V0R3JhcGh9IEFERCBFREdFIHsgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKG5hbWUpfSAoKS1bJHtwcm9wU3RyfV0tPigpIH1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIERyb3AgYSBub2RlIGxhYmVsIGZyb20gdGhlIGN1cnJlbnQgZ3JhcGggKGNsb3NlZCBncmFwaCkgKi9cbiAgYXN5bmMgZHJvcE5vZGVMYWJlbChuYW1lOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHRhcmdldEdyYXBoID0gY29uZmlnPy5ncmFwaE5hbWUgfHwgdGhpcy5zZXNzaW9ucy5nZXREZWZhdWx0R3JhcGgoKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEFMVEVSIEdSQVBIICR7dGFyZ2V0R3JhcGh9IERST1AgTk9ERSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobmFtZSl9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBEcm9wIG9uZSBvciBtb3JlIGVkZ2UgbGFiZWxzIGZyb20gdGhlIGN1cnJlbnQgZ3JhcGggKGNsb3NlZCBncmFwaCkgKi9cbiAgYXN5bmMgZHJvcEVkZ2VMYWJlbCguLi5uYW1lc09yQ29uZmlnOiBBcnJheTxzdHJpbmcgfCBRdWVyeUNvbmZpZyB8IHVuZGVmaW5lZD4pOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgLy8gTGFzdCBhcmcgbWF5IGJlIGEgUXVlcnlDb25maWcgKG9yIHVuZGVmaW5lZCk7IHRyZWF0IG5vbi1zdHJpbmcgYXMgY29uZmlnLlxuICAgIGxldCBjb25maWc6IFF1ZXJ5Q29uZmlnIHwgdW5kZWZpbmVkO1xuICAgIGxldCBuYW1lczogc3RyaW5nW107XG4gICAgaWYgKG5hbWVzT3JDb25maWcubGVuZ3RoID4gMCAmJiB0eXBlb2YgbmFtZXNPckNvbmZpZ1tuYW1lc09yQ29uZmlnLmxlbmd0aCAtIDFdICE9PSAnc3RyaW5nJykge1xuICAgICAgY29uZmlnID0gbmFtZXNPckNvbmZpZ1tuYW1lc09yQ29uZmlnLmxlbmd0aCAtIDFdIGFzIFF1ZXJ5Q29uZmlnIHwgdW5kZWZpbmVkO1xuICAgICAgbmFtZXMgPSBuYW1lc09yQ29uZmlnLnNsaWNlKDAsIC0xKSBhcyBzdHJpbmdbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmFtZXMgPSBuYW1lc09yQ29uZmlnIGFzIHN0cmluZ1tdO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXRHcmFwaCA9IGNvbmZpZz8uZ3JhcGhOYW1lIHx8IHRoaXMuc2Vzc2lvbnMuZ2V0RGVmYXVsdEdyYXBoKCk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBBTFRFUiBHUkFQSCAke3RhcmdldEdyYXBofSBEUk9QIEVER0UgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVscyguLi5uYW1lcyl9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBsYWJlbCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LlxuICAgKiBSZXR1cm5zIHRydWUgaWYgY3JlYXRlZCwgZmFsc2UgaWYgaXQgYWxyZWFkeSBleGlzdGVkLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlTGFiZWxJZk5vdEV4aXN0KFxuICAgIG5vZGVPckVkZ2U6IERCVHlwZSxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IENvbnZQcm9wZXJ0eURlZltdID0gW10sXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgbGFiZWxzID0gYXdhaXQgdGhpcy5zaG93TGFiZWxzKGNvbmZpZyk7XG4gICAgY29uc3QgdGFyZ2V0VHlwZSA9IG5vZGVPckVkZ2UgPT09IERCVHlwZS5FREdFID8gJ0VER0UnIDogJ05PREUnO1xuXG4gICAgaWYgKGxhYmVscy5zb21lKGwgPT4gbC5sYWJlbHMuaW5jbHVkZXMobmFtZSkgJiYgbC50eXBlID09PSB0YXJnZXRUeXBlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChub2RlT3JFZGdlID09PSBEQlR5cGUuTk9ERSkge1xuICAgICAgYXdhaXQgdGhpcy5jcmVhdGVOb2RlTGFiZWwobmFtZSwgcHJvcHMsIGNvbmZpZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuY3JlYXRlRWRnZUxhYmVsKG5hbWUsIHByb3BzLCBjb25maWcpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBSZW5hbWUgYSBub2RlIGxhYmVsICovXG4gIGFzeW5jIGFsdGVyTm9kZUxhYmVsKG9sZE5hbWU6IHN0cmluZywgbmV3TmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEFMVEVSIE5PREUgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKG9sZE5hbWUpfSBSRU5BTUUgVE8gJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKG5ld05hbWUpfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogUmVuYW1lIGFuIGVkZ2UgbGFiZWwgKi9cbiAgYXN5bmMgYWx0ZXJFZGdlTGFiZWwob2xkTmFtZTogc3RyaW5nLCBuZXdOYW1lOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgQUxURVIgRURHRSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwob2xkTmFtZSl9IFJFTkFNRSBUTyAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobmV3TmFtZSl9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWxsIGF2YWlsYWJsZSBhbGdvcml0aG1zICovXG4gIGFzeW5jIHNob3dBbGdvcyhjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8QWxnb0luZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBBTEdPUycsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHBhcnNlQWxnb0luZm9Sb3dzKHJlc3ApO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENvbnZlbmllbmNlIEFQSSDigJQgUHJvcGVydHkgT3BlcmF0aW9ucyAoMTMgbWV0aG9kcylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIFJldHVybiBwcm9wZXJ0aWVzIGZvciBhIGxhYmVsIChub2RlIG9yIGVkZ2UpIGluIHRoZSBjdXJyZW50IGdyYXBoICovXG4gIGFzeW5jIHNob3dQcm9wZXJ0eShcbiAgICBub2RlT3JFZGdlOiBEQlR5cGUsXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxDb252UHJvcGVydHlEZWZbXT4ge1xuICAgIGlmIChub2RlT3JFZGdlID09PSBEQlR5cGUuTk9ERSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2hvd05vZGVQcm9wZXJ0eShsYWJlbE5hbWUsIGNvbmZpZyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNob3dFZGdlUHJvcGVydHkobGFiZWxOYW1lLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIFJldHVybiBwcm9wZXJ0aWVzIGZvciBhIG5vZGUgbGFiZWwgKi9cbiAgYXN5bmMgc2hvd05vZGVQcm9wZXJ0eShsYWJlbE5hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPENvbnZQcm9wZXJ0eURlZltdPiB7XG4gICAgY29uc3QgbnQgPSBhd2FpdCB0aGlzLmdldE5vZGVMYWJlbChsYWJlbE5hbWUsIGNvbmZpZyk7XG4gICAgaWYgKCFudCkgdGhyb3cgbmV3IEVycm9yKGBOb2RlIGxhYmVsIFwiJHtsYWJlbE5hbWV9XCIgbm90IGZvdW5kYCk7XG4gICAgcmV0dXJuIG50LnByb3BlcnRpZXM7XG4gIH1cblxuICAvKiogUmV0dXJuIHByb3BlcnRpZXMgZm9yIGFuIGVkZ2UgbGFiZWwgKi9cbiAgYXN5bmMgc2hvd0VkZ2VQcm9wZXJ0eShsYWJlbE5hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPENvbnZQcm9wZXJ0eURlZltdPiB7XG4gICAgY29uc3QgZXQgPSBhd2FpdCB0aGlzLmdldEVkZ2VMYWJlbChsYWJlbE5hbWUsIGNvbmZpZyk7XG4gICAgaWYgKCFldCkgdGhyb3cgbmV3IEVycm9yKGBFZGdlIGxhYmVsIFwiJHtsYWJlbE5hbWV9XCIgbm90IGZvdW5kYCk7XG4gICAgcmV0dXJuIGV0LnByb3BlcnRpZXM7XG4gIH1cblxuICAvKiogUmV0dXJuIGEgc3BlY2lmaWMgcHJvcGVydHkgZGVmaW5pdGlvbiBmb3IgYSBsYWJlbCwgb3IgbnVsbCBpZiBub3QgZm91bmQgKi9cbiAgYXN5bmMgZ2V0UHJvcGVydHkoXG4gICAgbm9kZU9yRWRnZTogREJUeXBlLFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIHByb3BOYW1lOiBzdHJpbmcsXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxDb252UHJvcGVydHlEZWYgfCBudWxsPiB7XG4gICAgY29uc3QgcHJvcHMgPSBhd2FpdCB0aGlzLnNob3dQcm9wZXJ0eShub2RlT3JFZGdlLCBsYWJlbE5hbWUsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHByb3BzLmZpbmQocCA9PiBwLm5hbWUgPT09IHByb3BOYW1lKSB8fCBudWxsO1xuICB9XG5cbiAgLyoqIFJldHVybiBhIHNwZWNpZmljIHByb3BlcnR5IGRlZmluaXRpb24gZm9yIGEgbm9kZSBsYWJlbCwgb3IgbnVsbCBpZiBub3QgZm91bmQgKi9cbiAgYXN5bmMgZ2V0Tm9kZVByb3BlcnR5KFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIHByb3BOYW1lOiBzdHJpbmcsXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxDb252UHJvcGVydHlEZWYgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHkoREJUeXBlLk5PREUsIGxhYmVsTmFtZSwgcHJvcE5hbWUsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogUmV0dXJuIGEgc3BlY2lmaWMgcHJvcGVydHkgZGVmaW5pdGlvbiBmb3IgYW4gZWRnZSBsYWJlbCwgb3IgbnVsbCBpZiBub3QgZm91bmQgKi9cbiAgYXN5bmMgZ2V0RWRnZVByb3BlcnR5KFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIHByb3BOYW1lOiBzdHJpbmcsXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxDb252UHJvcGVydHlEZWYgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHkoREJUeXBlLkVER0UsIGxhYmVsTmFtZSwgcHJvcE5hbWUsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogQWRkIHByb3BlcnRpZXMgdG8gYSBsYWJlbCAobm9kZSBvciBlZGdlKSAqL1xuICBhc3luYyBjcmVhdGVQcm9wZXJ0eShcbiAgICBub2RlT3JFZGdlOiBEQlR5cGUsXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IENvbnZQcm9wZXJ0eURlZltdLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBpZiAobm9kZU9yRWRnZSA9PT0gREJUeXBlLk5PREUpIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZU5vZGVQcm9wZXJ0eShsYWJlbE5hbWUsIHByb3BzLCBjb25maWcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jcmVhdGVFZGdlUHJvcGVydHkobGFiZWxOYW1lLCBwcm9wcywgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBBZGQgcHJvcGVydGllcyB0byBhIG5vZGUgbGFiZWwgKi9cbiAgYXN5bmMgY3JlYXRlTm9kZVByb3BlcnR5KFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBDb252UHJvcGVydHlEZWZbXSxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcHJvcFN0ciA9IGJ1aWxkUHJvcGVydHlEZWZTdHJpbmcocHJvcHMpO1xuICAgIHJldHVybiB0aGlzLmdxbChgQUxURVIgTk9ERSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobGFiZWxOYW1lKX0gQUREIFBST1BFUlRZICR7cHJvcFN0cn1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIEFkZCBwcm9wZXJ0aWVzIHRvIGFuIGVkZ2UgbGFiZWwgKi9cbiAgYXN5bmMgY3JlYXRlRWRnZVByb3BlcnR5KFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBDb252UHJvcGVydHlEZWZbXSxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcHJvcFN0ciA9IGJ1aWxkUHJvcGVydHlEZWZTdHJpbmcocHJvcHMpO1xuICAgIHJldHVybiB0aGlzLmdxbChgQUxURVIgRURHRSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobGFiZWxOYW1lKX0gQUREIFBST1BFUlRZICR7cHJvcFN0cn1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIERyb3AgcHJvcGVydGllcyBmcm9tIGEgbGFiZWwgKG5vZGUgb3IgZWRnZSkgKi9cbiAgYXN5bmMgZHJvcFByb3BlcnR5KFxuICAgIG5vZGVPckVkZ2U6IERCVHlwZSxcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICAuLi5wcm9wTmFtZXNPckNvbmZpZzogQXJyYXk8c3RyaW5nIHwgUXVlcnlDb25maWcgfCB1bmRlZmluZWQ+XG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCB7IG5hbWVzLCBjb25maWcgfSA9IHNwbGl0VHJhaWxpbmdDb25maWcocHJvcE5hbWVzT3JDb25maWcpO1xuICAgIGlmIChub2RlT3JFZGdlID09PSBEQlR5cGUuTk9ERSkge1xuICAgICAgcmV0dXJuIHRoaXMuZHJvcE5vZGVQcm9wZXJ0eShsYWJlbE5hbWUsIC4uLm5hbWVzLCBjb25maWcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kcm9wRWRnZVByb3BlcnR5KGxhYmVsTmFtZSwgLi4ubmFtZXMsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogRHJvcCBwcm9wZXJ0aWVzIGZyb20gYSBub2RlIGxhYmVsICovXG4gIGFzeW5jIGRyb3BOb2RlUHJvcGVydHkoXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgLi4ucHJvcE5hbWVzT3JDb25maWc6IEFycmF5PHN0cmluZyB8IFF1ZXJ5Q29uZmlnIHwgdW5kZWZpbmVkPlxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgeyBuYW1lcywgY29uZmlnIH0gPSBzcGxpdFRyYWlsaW5nQ29uZmlnKHByb3BOYW1lc09yQ29uZmlnKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEFMVEVSIE5PREUgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKGxhYmVsTmFtZSl9IERST1AgUFJPUEVSVFkgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVscyguLi5uYW1lcyl9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBEcm9wIHByb3BlcnRpZXMgZnJvbSBhbiBlZGdlIGxhYmVsICovXG4gIGFzeW5jIGRyb3BFZGdlUHJvcGVydHkoXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgLi4ucHJvcE5hbWVzT3JDb25maWc6IEFycmF5PHN0cmluZyB8IFF1ZXJ5Q29uZmlnIHwgdW5kZWZpbmVkPlxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgeyBuYW1lcywgY29uZmlnIH0gPSBzcGxpdFRyYWlsaW5nQ29uZmlnKHByb3BOYW1lc09yQ29uZmlnKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEFMVEVSIEVER0UgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKGxhYmVsTmFtZSl9IERST1AgUFJPUEVSVFkgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVscyguLi5uYW1lcyl9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgcHJvcGVydGllcyBvbiBhIGxhYmVsIGlmIHRoZXkgZG8gbm90IGFscmVhZHkgZXhpc3QuXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBhbnkgcHJvcGVydGllcyB3ZXJlIGNyZWF0ZWQsIGZhbHNlIGlmIGFsbCBhbHJlYWR5IGV4aXN0ZWQuXG4gICAqL1xuICBhc3luYyBjcmVhdGVQcm9wZXJ0eUlmTm90RXhpc3QoXG4gICAgbm9kZU9yRWRnZTogREJUeXBlLFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBDb252UHJvcGVydHlEZWZbXSxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHRoaXMuc2hvd1Byb3BlcnR5KG5vZGVPckVkZ2UsIGxhYmVsTmFtZSwgY29uZmlnKTtcbiAgICBjb25zdCBleGlzdGluZ1NldCA9IG5ldyBTZXQoZXhpc3RpbmcubWFwKHAgPT4gcC5uYW1lKSk7XG4gICAgY29uc3QgbmV3UHJvcHMgPSBwcm9wcy5maWx0ZXIocCA9PiAhZXhpc3RpbmdTZXQuaGFzKHAubmFtZSkpO1xuXG4gICAgaWYgKG5ld1Byb3BzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgYXdhaXQgdGhpcy5jcmVhdGVQcm9wZXJ0eShub2RlT3JFZGdlLCBsYWJlbE5hbWUsIG5ld1Byb3BzLCBjb25maWcpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENvbnZlbmllbmNlIEFQSSDigJQgQ29uc3RyYWludCBPcGVyYXRpb25zICg0IG1ldGhvZHMpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBDcmVhdGUgYSBOT1QgTlVMTCBjb25zdHJhaW50IG9uIGEgcHJvcGVydHkgKi9cbiAgYXN5bmMgY3JlYXRlTm90TnVsbENvbnN0cmFpbnQoXG4gICAgbm9kZU9yRWRnZTogREJUeXBlLFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIHByb3BOYW1lOiBzdHJpbmcsXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IGVudGl0eVR5cGUgPSBkYlR5cGVUb0tleXdvcmQobm9kZU9yRWRnZSk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBBTFRFUiAke2VudGl0eVR5cGV9ICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChsYWJlbE5hbWUpfSBBREQgQ09OU1RSQUlOVCBOT1QgTlVMTCBPTiAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwocHJvcE5hbWUpfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogQ3JlYXRlIGEgVU5JUVVFIGNvbnN0cmFpbnQgb24gb25lIG9yIG1vcmUgcHJvcGVydGllcyAqL1xuICBhc3luYyBjcmVhdGVVbmlxdWVDb25zdHJhaW50KFxuICAgIG5vZGVPckVkZ2U6IERCVHlwZSxcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICAuLi5wcm9wTmFtZXNPckNvbmZpZzogQXJyYXk8c3RyaW5nIHwgUXVlcnlDb25maWcgfCB1bmRlZmluZWQ+XG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCB7IG5hbWVzLCBjb25maWcgfSA9IHNwbGl0VHJhaWxpbmdDb25maWcocHJvcE5hbWVzT3JDb25maWcpO1xuICAgIGNvbnN0IGVudGl0eVR5cGUgPSBkYlR5cGVUb0tleXdvcmQobm9kZU9yRWRnZSk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBBTFRFUiAke2VudGl0eVR5cGV9ICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChsYWJlbE5hbWUpfSBBREQgQ09OU1RSQUlOVCBVTklRVUUgT04gJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVscyguLi5uYW1lcyl9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBSZW1vdmUgYSBOT1QgTlVMTCBjb25zdHJhaW50IGZyb20gYSBwcm9wZXJ0eSAqL1xuICBhc3luYyBkcm9wTm90TnVsbENvbnN0cmFpbnQoXG4gICAgbm9kZU9yRWRnZTogREJUeXBlLFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIHByb3BOYW1lOiBzdHJpbmcsXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IGVudGl0eVR5cGUgPSBkYlR5cGVUb0tleXdvcmQobm9kZU9yRWRnZSk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBBTFRFUiAke2VudGl0eVR5cGV9ICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChsYWJlbE5hbWUpfSBEUk9QIENPTlNUUkFJTlQgTk9UIE5VTEwgT04gJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKHByb3BOYW1lKX1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIFJlbW92ZSBhIFVOSVFVRSBjb25zdHJhaW50IGZyb20gb25lIG9yIG1vcmUgcHJvcGVydGllcyAqL1xuICBhc3luYyBkcm9wVW5pcXVlQ29uc3RyYWludChcbiAgICBub2RlT3JFZGdlOiBEQlR5cGUsXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgLi4ucHJvcE5hbWVzT3JDb25maWc6IEFycmF5PHN0cmluZyB8IFF1ZXJ5Q29uZmlnIHwgdW5kZWZpbmVkPlxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgeyBuYW1lcywgY29uZmlnIH0gPSBzcGxpdFRyYWlsaW5nQ29uZmlnKHByb3BOYW1lc09yQ29uZmlnKTtcbiAgICBjb25zdCBlbnRpdHlUeXBlID0gZGJUeXBlVG9LZXl3b3JkKG5vZGVPckVkZ2UpO1xuICAgIHJldHVybiB0aGlzLmdxbChgQUxURVIgJHtlbnRpdHlUeXBlfSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobGFiZWxOYW1lKX0gRFJPUCBDT05TVFJBSU5UIFVOSVFVRSBPTiAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWxzKC4uLm5hbWVzKX1gLCBjb25maWcpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENvbnZlbmllbmNlIEFQSSDigJQgSW5kZXggT3BlcmF0aW9ucyAoNyBtZXRob2RzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogUmV0dXJuIGFsbCBpbmRleGVzIGluIHRoZSBjdXJyZW50IGdyYXBoICovXG4gIGFzeW5jIHNob3dJbmRleChjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8SW5kZXhJbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgSU5ERVgnLCBjb25maWcpO1xuICAgIHJldHVybiBwYXJzZUluZGV4SW5mb1Jvd3MocmVzcCk7XG4gIH1cblxuICAvKiogUmV0dXJuIGFsbCBub2RlIGluZGV4ZXMgaW4gdGhlIGN1cnJlbnQgZ3JhcGggKi9cbiAgYXN5bmMgc2hvd05vZGVJbmRleChjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8SW5kZXhJbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgTk9ERSBJTkRFWCcsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHBhcnNlSW5kZXhJbmZvUm93cyhyZXNwKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWxsIGVkZ2UgaW5kZXhlcyBpbiB0aGUgY3VycmVudCBncmFwaCAqL1xuICBhc3luYyBzaG93RWRnZUluZGV4KGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxJbmRleEluZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBFREdFIElOREVYJywgY29uZmlnKTtcbiAgICByZXR1cm4gcGFyc2VJbmRleEluZm9Sb3dzKHJlc3ApO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhbiBpbmRleCBvbiBhIG5vZGUgbGFiZWwgKi9cbiAgYXN5bmMgY3JlYXRlTm9kZUluZGV4KFxuICAgIGluZGV4TmFtZTogc3RyaW5nLFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBJbmRleFByb3BlcnR5W10sXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHByb3BTdHIgPSBidWlsZEluZGV4UHJvcGVydHlTdHJpbmcocHJvcHMpO1xuICAgIHJldHVybiB0aGlzLmdxbChgQ1JFQVRFIElOREVYICR7aW5kZXhOYW1lfSBPTiBOT0RFICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChsYWJlbE5hbWUpfSAoJHtwcm9wU3RyfSlgLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhbiBpbmRleCBvbiBhbiBlZGdlIGxhYmVsICovXG4gIGFzeW5jIGNyZWF0ZUVkZ2VJbmRleChcbiAgICBpbmRleE5hbWU6IHN0cmluZyxcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogSW5kZXhQcm9wZXJ0eVtdLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCBwcm9wU3RyID0gYnVpbGRJbmRleFByb3BlcnR5U3RyaW5nKHByb3BzKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYENSRUFURSBJTkRFWCAke2luZGV4TmFtZX0gT04gRURHRSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobGFiZWxOYW1lKX0gKCR7cHJvcFN0cn0pYCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBEcm9wIGEgbm9kZSBpbmRleCBieSBuYW1lICovXG4gIGFzeW5jIGRyb3BOb2RlSW5kZXgoaW5kZXhOYW1lOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgRFJPUCBOT0RFIElOREVYICR7aW5kZXhOYW1lfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogRHJvcCBhbiBlZGdlIGluZGV4IGJ5IG5hbWUgKi9cbiAgYXN5bmMgZHJvcEVkZ2VJbmRleChpbmRleE5hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBEUk9QIEVER0UgSU5ERVggJHtpbmRleE5hbWV9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb252ZW5pZW5jZSBBUEkg4oCUIEZ1bGx0ZXh0IE9wZXJhdGlvbnMgKDcgbWV0aG9kcylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIFJldHVybiBhbGwgZnVsbHRleHQgaW5kZXhlcyBpbiB0aGUgY3VycmVudCBncmFwaCAqL1xuICBhc3luYyBzaG93RnVsbHRleHQoY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPEZ1bGx0ZXh0SW5mb1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdTSE9XIEZVTExURVhUJywgY29uZmlnKTtcbiAgICByZXR1cm4gcGFyc2VGdWxsdGV4dEluZm9Sb3dzKHJlc3ApO1xuICB9XG5cbiAgLyoqIFJldHVybiBhbGwgbm9kZSBmdWxsdGV4dCBpbmRleGVzICovXG4gIGFzeW5jIHNob3dOb2RlRnVsbHRleHQoY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPEZ1bGx0ZXh0SW5mb1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdTSE9XIE5PREUgRlVMTFRFWFQnLCBjb25maWcpO1xuICAgIHJldHVybiBwYXJzZUZ1bGx0ZXh0SW5mb1Jvd3MocmVzcCk7XG4gIH1cblxuICAvKiogUmV0dXJuIGFsbCBlZGdlIGZ1bGx0ZXh0IGluZGV4ZXMgKi9cbiAgYXN5bmMgc2hvd0VkZ2VGdWxsdGV4dChjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8RnVsbHRleHRJbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgRURHRSBGVUxMVEVYVCcsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHBhcnNlRnVsbHRleHRJbmZvUm93cyhyZXNwKTtcbiAgfVxuXG4gIC8qKiBDcmVhdGUgYSBmdWxsdGV4dCBpbmRleCBvbiBhIG5vZGUgbGFiZWwgKi9cbiAgYXN5bmMgY3JlYXRlTm9kZUZ1bGx0ZXh0KFxuICAgIGluZGV4TmFtZTogc3RyaW5nLFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBzdHJpbmdbXSxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBDUkVBVEUgRlVMTFRFWFQgJHtpbmRleE5hbWV9IE9OIE5PREUgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKGxhYmVsTmFtZSl9ICgke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWxzKC4uLnByb3BzKX0pYCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBDcmVhdGUgYSBmdWxsdGV4dCBpbmRleCBvbiBhbiBlZGdlIGxhYmVsICovXG4gIGFzeW5jIGNyZWF0ZUVkZ2VGdWxsdGV4dChcbiAgICBpbmRleE5hbWU6IHN0cmluZyxcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogc3RyaW5nW10sXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgQ1JFQVRFIEZVTExURVhUICR7aW5kZXhOYW1lfSBPTiBFREdFICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChsYWJlbE5hbWUpfSAoJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVscyguLi5wcm9wcyl9KWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogRHJvcCBhIG5vZGUgZnVsbHRleHQgaW5kZXggYnkgbmFtZSAqL1xuICBhc3luYyBkcm9wTm9kZUZ1bGx0ZXh0KGluZGV4TmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoYERST1AgTk9ERSBGVUxMVEVYVCAke2luZGV4TmFtZX1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIERyb3AgYW4gZWRnZSBmdWxsdGV4dCBpbmRleCBieSBuYW1lICovXG4gIGFzeW5jIGRyb3BFZGdlRnVsbHRleHQoaW5kZXhOYW1lOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgRFJPUCBFREdFIEZVTExURVhUICR7aW5kZXhOYW1lfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29udmVuaWVuY2UgQVBJIOKAlCBUYXNrIE9wZXJhdGlvbnMgKDMgbWV0aG9kcylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIFJldHVybiBhbGwgdGFza3MgaW4gdGhlIGN1cnJlbnQgZ3JhcGggKi9cbiAgYXN5bmMgc2hvd1Rhc2tzKGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxUYXNrSW5mb1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdTSE9XIFRBU0tTJywgY29uZmlnKTtcbiAgICByZXR1cm4gcGFyc2VUYXNrSW5mb1Jvd3MocmVzcCk7XG4gIH1cblxuICAvKiogRGVsZXRlIGEgdGFzayBieSBJRCAqL1xuICBhc3luYyBkZWxldGVUYXNrKHRhc2tJZDogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoYERFTEVURSBUQVNLICR7dGFza0lkfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogU3RvcCBhIHJ1bm5pbmcgdGFzayBieSBJRCAqL1xuICBhc3luYyBzdG9wVGFzayh0YXNrSWQ6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBTVE9QIFRBU0sgJHt0YXNrSWR9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb252ZW5pZW5jZSBBUEkg4oCUIERhdGEgSW5zZXJ0IE9wZXJhdGlvbnMgKDQgbWV0aG9kcylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEluc2VydCBub2RlcyDigJQgYmFja3dhcmQtY29tcGF0aWJsZSBvdmVybG9hZGVkIGVudHJ5IHBvaW50LlxuICAgKlxuICAgKiBUd28gY2FsbCBzaGFwZXMgYXJlIGFjY2VwdGVkOyB0aGUgcnVudGltZSBkaXNwYXRjaGVzIG9uIHRoZSBmaXJzdFxuICAgKiBhcmd1bWVudCdzIHR5cGU6XG4gICAqXG4gICAqICAgMS4gYGluc2VydE5vZGVzKGdyYXBoTmFtZTogc3RyaW5nLCBub2RlcywgY29uZmlnPylgIOKAlCBvcmlnaW5hbFxuICAgKiAgICAgIDYuMC4wIHNpZ25hdHVyZSwgcm91dGVzIHRocm91Z2ggdGhlIGJ1bGstaW1wb3J0IGdSUEMgcGF0aFxuICAgKiAgICAgIChgRGF0YVNlcnZpY2UuSW5zZXJ0Tm9kZXNgKS4gUmV0dXJucyBgSW5zZXJ0Tm9kZXNSZXN1bHRgIHdpdGhcbiAgICogICAgICBnUlBDLWxldmVsIG1ldGFkYXRhLiBQcmVzZXJ2ZXMgc291cmNlIGNvbXBhdGliaWxpdHkgZm9yXG4gICAqICAgICAgY2FsbGVycyB3cml0dGVuIGFnYWluc3QgNi4wLjAgKGUuZy4gZ3FsZGItbWFuYWdlcikuXG4gICAqXG4gICAqICAgMi4gYGluc2VydE5vZGVzKG5vZGVzLCBjb25maWc/KWAg4oCUIGNvbnZlbmllbmNlIEdRTCBlbWl0dGVyIChhZGRlZFxuICAgKiAgICAgIGFmdGVyIDYuMC4wKS4gU3ludGhlc2l6ZXNcbiAgICogICAgICBgSU5TRVJUIChuMDpMYWJlbCB7Li4ufSksIChuMTpMYWJlbCB7Li4ufSkgUkVUVVJOIG4wLCBuMWAsXG4gICAqICAgICAgd2l0aCBgSU5TRVJUIE9WRVJXUklURWAgd2hlbiBgY29uZmlnLmluc2VydFR5cGVgIGlzXG4gICAqICAgICAgYEluc2VydFR5cGUuT3ZlcndyaXRlYC4gUmV0dXJucyB0aGUgcmF3IGBSZXNwb25zZWAuXG4gICAqICAgICAgYE5vZGVEYXRhLmlkYCwgd2hlbiBzZXQsIGlzIGVtaXR0ZWQgYXMgdGhlIGBfaWRgIHByb3BlcnR5LlxuICAgKi9cbiAgYXN5bmMgaW5zZXJ0Tm9kZXMoXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgbm9kZXM6IE5vZGVEYXRhW10sXG4gICAgY29uZmlnPzogSW5zZXJ0Tm9kZXNDb25maWdcbiAgKTogUHJvbWlzZTxJbnNlcnROb2Rlc1Jlc3VsdD47XG4gIGFzeW5jIGluc2VydE5vZGVzKFxuICAgIG5vZGVzOiBOb2RlRGF0YVtdLFxuICAgIGNvbmZpZz86IEluc2VydENvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPjtcbiAgYXN5bmMgaW5zZXJ0Tm9kZXMoXG4gICAgYXJnMTogc3RyaW5nIHwgTm9kZURhdGFbXSxcbiAgICBhcmcyPzogTm9kZURhdGFbXSB8IEluc2VydENvbmZpZyxcbiAgICBhcmczPzogSW5zZXJ0Tm9kZXNDb25maWdcbiAgKTogUHJvbWlzZTxJbnNlcnROb2Rlc1Jlc3VsdCB8IFJlc3BvbnNlPiB7XG4gICAgLy8gUGF0aCAxOiBsZWdhY3kgYnVsay1nUlBDIHNpZ25hdHVyZSAoZ3JhcGhOYW1lLCBub2RlcywgY29uZmlnPylcbiAgICBpZiAodHlwZW9mIGFyZzEgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5pbnNlcnROb2RlcyhcbiAgICAgICAgYXJnMSxcbiAgICAgICAgYXJnMiBhcyBOb2RlRGF0YVtdLFxuICAgICAgICBhcmczXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFBhdGggMjogY29udmVuaWVuY2UgR1FMLWVtaXR0ZXIgc2lnbmF0dXJlIChub2RlcywgY29uZmlnPylcbiAgICBjb25zdCBub2RlcyA9IGFyZzE7XG4gICAgY29uc3QgY29uZmlnID0gYXJnMiBhcyBJbnNlcnRDb25maWcgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAobm9kZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbmV3IFJlc3BvbnNlKFtdLCBbXSwgMCwgZmFsc2UsIFtdLCAwKTtcblxuICAgIG5vZGVzLmZvckVhY2goKG5vZGUsIGkpID0+IHtcbiAgICAgIGlmICghbm9kZS5sYWJlbHMgfHwgbm9kZS5sYWJlbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm9kZSBhdCBpbmRleCAke2l9IGhhcyBubyBsYWJlbHMuIEF0IGxlYXN0IG9uZSBsYWJlbCBpcyByZXF1aXJlZC5gKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHZhck5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHBhcnRzID0gbm9kZXMubWFwKChub2RlLCBpKSA9PiB7XG4gICAgICBjb25zdCB2YXJOYW1lID0gYG4ke2l9YDtcbiAgICAgIHZhck5hbWVzLnB1c2godmFyTmFtZSk7XG4gICAgICAvLyBHUUwgSU5TRVJUIG9ubHkgc3VwcG9ydHMgc2luZ2xlIGxhYmVsIHBlciBub2RlXG4gICAgICBjb25zdCBsYWJlbCA9IEdxbGRiQ2xpZW50LnF1b3RlTGFiZWwobm9kZS5sYWJlbHNbMF0pO1xuICAgICAgLy8gQnVpbGQgcHJvcGVydGllcyBpbmNsdWRpbmcgX2lkIGlmIHNldFxuICAgICAgbGV0IHByb3BzID0gbm9kZS5wcm9wZXJ0aWVzO1xuICAgICAgaWYgKG5vZGUuaWQpIHtcbiAgICAgICAgcHJvcHMgPSB7IF9pZDogbm9kZS5pZCwgLi4ucHJvcHMgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHByb3BTdHIgPSBidWlsZFByb3BlcnRpZXNWYWx1ZVN0cmluZyhwcm9wcyk7XG4gICAgICByZXR1cm4gcHJvcFN0ciA/IGAoJHt2YXJOYW1lfToke2xhYmVsfSAke3Byb3BTdHJ9KWAgOiBgKCR7dmFyTmFtZX06JHtsYWJlbH0pYDtcbiAgICB9KTtcblxuICAgIGNvbnN0IGluc2VydEtleXdvcmQgPSBpbnNlcnRLZXl3b3JkRm9yVHlwZShjb25maWc/Lmluc2VydFR5cGUpO1xuICAgIGNvbnN0IGdxbFN0ciA9IGluc2VydEtleXdvcmQgKyAnICcgKyBwYXJ0cy5qb2luKCcsICcpICsgJyBSRVRVUk4gJyArIHZhck5hbWVzLmpvaW4oJywgJyk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGdxbFN0ciwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcnQgZWRnZXMg4oCUIGJhY2t3YXJkLWNvbXBhdGlibGUgb3ZlcmxvYWRlZCBlbnRyeSBwb2ludC5cbiAgICpcbiAgICogVHdvIGNhbGwgc2hhcGVzIGFyZSBhY2NlcHRlZDsgdGhlIHJ1bnRpbWUgZGlzcGF0Y2hlcyBvbiB0aGUgZmlyc3RcbiAgICogYXJndW1lbnQncyB0eXBlOlxuICAgKlxuICAgKiAgIDEuIGBpbnNlcnRFZGdlcyhncmFwaE5hbWU6IHN0cmluZywgZWRnZXMsIGNvbmZpZz8pYCDigJQgb3JpZ2luYWxcbiAgICogICAgICA2LjAuMCBzaWduYXR1cmUsIHJvdXRlcyB0aHJvdWdoIHRoZSBidWxrLWltcG9ydCBnUlBDIHBhdGhcbiAgICogICAgICAoYERhdGFTZXJ2aWNlLkluc2VydEVkZ2VzYCkuIFJldHVybnMgYEluc2VydEVkZ2VzUmVzdWx0YCB3aXRoXG4gICAqICAgICAgZ1JQQy1sZXZlbCBtZXRhZGF0YS4gUHJlc2VydmVzIHNvdXJjZSBjb21wYXRpYmlsaXR5IGZvclxuICAgKiAgICAgIDYuMC4wIGNhbGxlcnMuXG4gICAqXG4gICAqICAgMi4gYGluc2VydEVkZ2VzKGVkZ2VzLCBjb25maWc/KWAg4oCUIGNvbnZlbmllbmNlIEdRTCBlbWl0dGVyXG4gICAqICAgICAgKGFkZGVkIGFmdGVyIDYuMC4wKS4gUGVyIGVkZ2Ugc3ludGhlc2l6ZXNcbiAgICogICAgICBgTUFUQ0ggKHNyYyBXSEVSRSBpZChzcmMpID0gJ2Zyb20nKSwgKGRzdCBXSEVSRSBpZChkc3QpID0gJ3RvJykgSU5TRVJUIChzcmMpLVtlMDpMYWJlbCB7Li4ufV0tPihkc3QpIFJFVFVSTiBlMGAuXG4gICAqICAgICAgUmV0dXJucyBhIG1lcmdlZCBgUmVzcG9uc2VgIHdpdGggY29sdW1ucyBgZTAsIGUxLCAuLi5gLlxuICAgKi9cbiAgYXN5bmMgaW5zZXJ0RWRnZXMoXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgZWRnZXM6IEVkZ2VEYXRhW10sXG4gICAgY29uZmlnPzogSW5zZXJ0RWRnZXNDb25maWdcbiAgKTogUHJvbWlzZTxJbnNlcnRFZGdlc1Jlc3VsdD47XG4gIGFzeW5jIGluc2VydEVkZ2VzKFxuICAgIGVkZ2VzOiBFZGdlRGF0YVtdLFxuICAgIGNvbmZpZz86IEluc2VydENvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPjtcbiAgYXN5bmMgaW5zZXJ0RWRnZXMoXG4gICAgYXJnMTogc3RyaW5nIHwgRWRnZURhdGFbXSxcbiAgICBhcmcyPzogRWRnZURhdGFbXSB8IEluc2VydENvbmZpZyxcbiAgICBhcmczPzogSW5zZXJ0RWRnZXNDb25maWdcbiAgKTogUHJvbWlzZTxJbnNlcnRFZGdlc1Jlc3VsdCB8IFJlc3BvbnNlPiB7XG4gICAgLy8gUGF0aCAxOiBsZWdhY3kgYnVsay1nUlBDIHNpZ25hdHVyZVxuICAgIGlmICh0eXBlb2YgYXJnMSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLmluc2VydEVkZ2VzKFxuICAgICAgICBhcmcxLFxuICAgICAgICBhcmcyIGFzIEVkZ2VEYXRhW10sXG4gICAgICAgIGFyZzNcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gUGF0aCAyOiBjb252ZW5pZW5jZSBHUUwtZW1pdHRlciBzaWduYXR1cmVcbiAgICBjb25zdCBlZGdlcyA9IGFyZzE7XG4gICAgY29uc3QgY29uZmlnID0gYXJnMiBhcyBJbnNlcnRDb25maWcgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoZWRnZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbmV3IFJlc3BvbnNlKFtdLCBbXSwgMCwgZmFsc2UsIFtdLCAwKTtcblxuICAgIGNvbnN0IGluc2VydEtleXdvcmQgPSBpbnNlcnRLZXl3b3JkRm9yVHlwZShjb25maWc/Lmluc2VydFR5cGUpO1xuICAgIGNvbnN0IGFsbENvbHVtbnM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgYWxsVmFsdWVzOiBhbnlbXSA9IFtdO1xuICAgIGxldCB0b3RhbEFmZmVjdGVkID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlZGdlID0gZWRnZXNbaV07XG4gICAgICBjb25zdCB2YXJOYW1lID0gYGUke2l9YDtcbiAgICAgIGNvbnN0IGxhYmVsUGFydCA9IGVkZ2UubGFiZWwgPyAnOicgKyBHcWxkYkNsaWVudC5xdW90ZUxhYmVsKGVkZ2UubGFiZWwpIDogJyc7XG4gICAgICBjb25zdCBwcm9wU3RyID0gYnVpbGRQcm9wZXJ0aWVzVmFsdWVTdHJpbmcoZWRnZS5wcm9wZXJ0aWVzKTtcbiAgICAgIGNvbnN0IGVkZ2VQYXJ0ID0gcHJvcFN0ciA/IGBbJHt2YXJOYW1lfSR7bGFiZWxQYXJ0fSAke3Byb3BTdHJ9XWAgOiBgWyR7dmFyTmFtZX0ke2xhYmVsUGFydH1dYDtcbiAgICAgIGNvbnN0IGdxbFN0ciA9IGBNQVRDSCAoc3JjIFdIRVJFIGlkKHNyYykgPSAnJHtlZGdlLmZyb21Ob2RlSWR9JyksIGBcbiAgICAgICAgKyBgKGRzdCBXSEVSRSBpZChkc3QpID0gJyR7ZWRnZS50b05vZGVJZH0nKSBgXG4gICAgICAgICsgYCR7aW5zZXJ0S2V5d29yZH0gKHNyYyktJHtlZGdlUGFydH0tPihkc3QpIFJFVFVSTiAke3Zhck5hbWV9YDtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbChncWxTdHIsIGNvbmZpZyk7XG4gICAgICB0b3RhbEFmZmVjdGVkICs9IHJlc3Aucm93c0FmZmVjdGVkO1xuICAgICAgYWxsQ29sdW1ucy5wdXNoKHZhck5hbWUpO1xuICAgICAgaWYgKHJlc3Aucm93cy5sZW5ndGggPiAwICYmIHJlc3Aucm93c1swXS52YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBhbGxWYWx1ZXMucHVzaChyZXNwLnJvd3NbMF0udmFsdWVzWzBdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbWVyZ2VkUm93ID0gbmV3IFJvdyhhbGxWYWx1ZXMpO1xuICAgIHJldHVybiBuZXcgUmVzcG9uc2UoYWxsQ29sdW1ucywgW21lcmdlZFJvd10sIDEsIGZhbHNlLCBbXSwgdG90YWxBZmZlY3RlZCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29udmVuaWVuY2UgQVBJIOKAlCBTeXN0ZW0gJiBQcm9jZXNzIE9wZXJhdGlvbnMgKDQgbWV0aG9kcylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIFJldHVybiBjdXJyZW50bHkgcnVubmluZyBwcm9jZXNzZXMgKHF1ZXJpZXMpICovXG4gIGFzeW5jIHRvcChjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8UHJvY2Vzc0luZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnVE9QJywgY29uZmlnKTtcbiAgICByZXR1cm4gcGFyc2VQcm9jZXNzSW5mb1Jvd3MocmVzcCk7XG4gIH1cblxuICAvKiogVGVybWluYXRlIGEgcnVubmluZyBxdWVyeSBieSBpdHMgcXVlcnkgSUQgKi9cbiAgYXN5bmMga2lsbChxdWVyeUlkOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgS0lMTCAnJHtxdWVyeUlkfSdgLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIFJldHVybiBzdGF0aXN0aWNzIGZvciB0aGUgY3VycmVudCBncmFwaCB1c2luZyBkYi5zdGF0cygpICovXG4gIGFzeW5jIHN0YXRzKGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxHcmFwaFN0YXRzPiB7XG4gICAgY29uc3QgY3VycmVudEdyYXBoID0gY29uZmlnPy5ncmFwaE5hbWUgfHwgdGhpcy5zZXNzaW9ucy5nZXREZWZhdWx0R3JhcGgoKTtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1JFVFVSTiBkYi5zdGF0cygpIEFTIHN0YXRzJywgY29uZmlnKTtcbiAgICBjb25zdCBncyA9IHBhcnNlR3JhcGhTdGF0cyhyZXNwKTtcbiAgICBpZiAoIWdzLmdyYXBoTmFtZSkgZ3MuZ3JhcGhOYW1lID0gY3VycmVudEdyYXBoO1xuICAgIHJldHVybiBncztcbiAgfVxuXG4gIC8qKiBTZW5kIGEgcGluZyB0byB0aGUgc2VydmVyIGFuZCByZXR1cm4gdGhlIGxhdGVuY3kgaW4gbmFub3NlY29uZHMgKi9cbiAgYXN5bmMgdGVzdCgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLnBpbmcoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb252ZW5pZW5jZSBBUEkg4oCUIEFJIE9wZXJhdGlvbnMgKDIgbWV0aG9kcylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIFlJRUxEIGNvbHVtbnMgZW1pdHRlZCBieSBDQUxMIGFpLnJlYWQgLyBhaS5ncWwgKGtlcHQgaW4gc3luYyB3aXRoIHNlcnZlcikuICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFJX1lJRUxEX0NPTFMgPVxuICAgICdzdGFnZSwgZGV0YWlsLCBlbGFwc2VkX21zLCB0b2tlbnNfaW5wdXQsIHRva2Vuc19vdXRwdXQsIHRva2Vuc19jYWNoZWQsIGRhdGEnO1xuXG4gIC8qKlxuICAgKiBBc2sgdGhlIEFJIHRvIGdlbmVyYXRlIGEgR1FMIHN0YXRlbWVudCBhbmQgYXV0by1leGVjdXRlIGl0LlxuICAgKlxuICAgKiBXcmFwcyBgQ0FMTCBhaS5yZWFkKFwiPHByb21wdD5cIikgWUlFTEQgLi4uYCwgc3RyZWFtcyBzdGFnZSByb3dzIGZyb20gdGhlXG4gICAqIHNlcnZlciwgYW5kIHJlLXJ1bnMgdGhlIHN5bnRoZXNpemVkIEdRTCBzbyBgQWlSZWFkUmVzdWx0LmRhdGFgIGhvbGRzIHRoZVxuICAgKiByZWFsIHF1ZXJ5IHtAbGluayBSZXNwb25zZX0gKHJvd3MgLyBjb2x1bW5zKSDigJQgbWF0Y2hpbmcgd2hhdCBNYW5hZ2VyIFVJXG4gICAqIGRpc3BsYXlzLlxuICAgKlxuICAgKiBPbmx5IHRyYW5zcG9ydC1sZXZlbCBlcnJvcnMgcmVqZWN0IHRoZSBQcm9taXNlLiBBSS1zaWRlIGVycm9ycyBzZXRcbiAgICogYHN1Y2Nlc3M9ZmFsc2VgIGFuZCBwb3B1bGF0ZSBgZXJyb3JgLCB3aXRoIGBkYXRhPW51bGxgLlxuICAgKi9cbiAgYXN5bmMgYWlSZWFkKHByb21wdDogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8QWlSZWFkUmVzdWx0PiB7XG4gICAgY29uc3QgZ3FsID0gYENBTEwgYWkucmVhZChcIiR7R3FsZGJDbGllbnQuZXNjYXBlQWlQcm9tcHQocHJvbXB0KX1cIikgWUlFTEQgJHtHcWxkYkNsaWVudC5BSV9ZSUVMRF9DT0xTfWA7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKGdxbCwgY29uZmlnKTtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnBhcnNlQWlSZXN1bHQocmVzcCk7XG4gICAgLy8gQXV0byByZS1ydW4gdGhlIGdlbmVyYXRlZCBHUUwgc28gYGRhdGFgIGlzIGEgcHJvcGVyIFJlc3BvbnNlIChyb3dzL2NvbHVtbnMpLFxuICAgIC8vIG5vdCB0aGUgZXhlY3V0aW9uIG1ldGFkYXRhIGRpY3QgcmV0dXJuZWQgaW4gdGhlIGZpbmFsIHN0YWdlLlxuICAgIGlmIChyZXN1bHQuc3VjY2VzcyAmJiByZXN1bHQuZ2VuZXJhdGVkR3FsKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQuZGF0YSA9IGF3YWl0IHRoaXMuZ3FsKHJlc3VsdC5nZW5lcmF0ZWRHcWwsIGNvbmZpZyk7XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgcmVzdWx0LnN1Y2Nlc3MgPSBmYWxzZTtcbiAgICAgICAgcmVzdWx0LmVycm9yID0gYEdlbmVyYXRlZCBHUUwgZmFpbGVkIHRvIGV4ZWN1dGU6ICR7ZT8ubWVzc2FnZSA/PyBTdHJpbmcoZSl9YDtcbiAgICAgICAgcmVzdWx0LmRhdGEgPSBudWxsO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQuZGF0YSA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQXNrIHRoZSBBSSB0byBnZW5lcmF0ZSBhIEdRTCBzdGF0ZW1lbnQgKndpdGhvdXQqIGV4ZWN1dGluZyBpdC5cbiAgICpcbiAgICogVGhlIGdlbmVyYXRlZCBHUUwgaXMgZXhwb3NlZCB2aWEgYEFpUmVhZFJlc3VsdC5nZW5lcmF0ZWRHcWxgIHNvIHRoZVxuICAgKiBjYWxsZXIgY2FuIHJldmlldyAvIGVkaXQgaXQgYmVmb3JlIHJ1bm5pbmcgaXQgbWFudWFsbHkgdmlhIGBjbGllbnQuZ3FsKClgLlxuICAgKiBgQWlSZWFkUmVzdWx0LmRhdGFgIGlzIGFsd2F5cyBudWxsIGZvciBgYWlHcWxgLlxuICAgKi9cbiAgYXN5bmMgYWlHcWwocHJvbXB0OiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxBaVJlYWRSZXN1bHQ+IHtcbiAgICBjb25zdCBncWwgPSBgQ0FMTCBhaS5ncWwoXCIke0dxbGRiQ2xpZW50LmVzY2FwZUFpUHJvbXB0KHByb21wdCl9XCIpIFlJRUxEICR7R3FsZGJDbGllbnQuQUlfWUlFTERfQ09MU31gO1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbChncWwsIGNvbmZpZyk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wYXJzZUFpUmVzdWx0KHJlc3ApO1xuICAgIC8vIGFpX2dxbCBpcyBcImdlbmVyYXRlIG9ubHlcIiDigJQgbmV2ZXIgYXV0by1leGVjdXRlLlxuICAgIHJlc3VsdC5kYXRhID0gbnVsbDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqIEVzY2FwZSBhIHByb21wdCBzbyBpdCBjYW4gYmUgc2FmZWx5IGVtYmVkZGVkIGluIGEgZG91YmxlLXF1b3RlZCBHUUwgc3RyaW5nLiAqL1xuICBwcml2YXRlIHN0YXRpYyBlc2NhcGVBaVByb21wdChwcm9tcHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHByb21wdC5yZXBsYWNlKC9cXFxcL2csICdcXFxcXFxcXCcpLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKTtcbiAgfVxuXG4gIC8qKiBQYXJzZSBhIENBTEwgYWkucmVhZCAvIGFpLmdxbCBZSUVMRCByZXNwb25zZSBpbnRvIGFuIEFpUmVhZFJlc3VsdC4gKi9cbiAgcHJpdmF0ZSBwYXJzZUFpUmVzdWx0KHJlc3A6IFJlc3BvbnNlKTogQWlSZWFkUmVzdWx0IHtcbiAgICBjb25zdCByZXN1bHQ6IEFpUmVhZFJlc3VsdCA9IHtcbiAgICAgIHN0YWdlczogW10sXG4gICAgICBnZW5lcmF0ZWRHcWw6IG51bGwsXG4gICAgICBkYXRhOiBudWxsLFxuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIGVycm9yOiBudWxsLFxuICAgICAgdG90YWxFbGFwc2VkTXM6IDAsXG4gICAgICB0b3RhbFRva2Vuc0lucHV0OiAwLFxuICAgICAgdG90YWxUb2tlbnNPdXRwdXQ6IDAsXG4gICAgICB0b3RhbFRva2Vuc0NhY2hlZDogMCxcbiAgICB9O1xuXG4gICAgY29uc3QgY29sSWR4OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNwLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbElkeFtyZXNwLmNvbHVtbnNbaV1dID0gaTtcbiAgICB9XG4gICAgY29uc3QgZ2V0Q29sID0gKHJvdzogUm93LCBuYW1lOiBzdHJpbmcpOiBhbnkgPT4ge1xuICAgICAgY29uc3QgaWR4ID0gY29sSWR4W25hbWVdO1xuICAgICAgaWYgKGlkeCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiByb3cuZ2V0KGlkeCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZvciAoY29uc3Qgcm93IG9mIHJlc3Aucm93cykge1xuICAgICAgY29uc3Qgc3RhZ2VWYWwgPSBnZXRDb2wocm93LCAnc3RhZ2UnKTtcbiAgICAgIGNvbnN0IGRldGFpbFZhbCA9IGdldENvbChyb3csICdkZXRhaWwnKTtcbiAgICAgIGNvbnN0IGVsYXBzZWRWYWwgPSBnZXRDb2wocm93LCAnZWxhcHNlZF9tcycpO1xuICAgICAgY29uc3QgdEluVmFsID0gZ2V0Q29sKHJvdywgJ3Rva2Vuc19pbnB1dCcpO1xuICAgICAgY29uc3QgdE91dFZhbCA9IGdldENvbChyb3csICd0b2tlbnNfb3V0cHV0Jyk7XG4gICAgICBjb25zdCB0Q2FjaGVkVmFsID0gZ2V0Q29sKHJvdywgJ3Rva2Vuc19jYWNoZWQnKTtcbiAgICAgIGNvbnN0IGRhdGFWYWwgPSBnZXRDb2wocm93LCAnZGF0YScpO1xuXG4gICAgICBjb25zdCBzdGFnZTogQWlTdGFnZSA9IHtcbiAgICAgICAgc3RhZ2U6IHN0YWdlVmFsID09IG51bGwgPyAnJyA6IFN0cmluZyhzdGFnZVZhbCksXG4gICAgICAgIGRldGFpbDogZGV0YWlsVmFsID09IG51bGwgPyAnJyA6IFN0cmluZyhkZXRhaWxWYWwpLFxuICAgICAgICBlbGFwc2VkTXM6IGVsYXBzZWRWYWwgPT0gbnVsbCA/IDAgOiBOdW1iZXIoZWxhcHNlZFZhbCkgfHwgMCxcbiAgICAgICAgdG9rZW5zSW5wdXQ6IHRJblZhbCA9PSBudWxsID8gMCA6IE51bWJlcih0SW5WYWwpIHx8IDAsXG4gICAgICAgIHRva2Vuc091dHB1dDogdE91dFZhbCA9PSBudWxsID8gMCA6IE51bWJlcih0T3V0VmFsKSB8fCAwLFxuICAgICAgICB0b2tlbnNDYWNoZWQ6IHRDYWNoZWRWYWwgPT0gbnVsbCA/IDAgOiBOdW1iZXIodENhY2hlZFZhbCkgfHwgMCxcbiAgICAgICAgZGF0YTogZGF0YVZhbCxcbiAgICAgIH07XG4gICAgICByZXN1bHQuc3RhZ2VzLnB1c2goc3RhZ2UpO1xuXG4gICAgICAvLyBUcmFjayBhZ2dyZWdhdGVzOiBlbGFwc2VkX21zIGlzIGN1bXVsYXRpdmUgb24gc2VydmVyIHNpZGUsIHRha2UgbWF4LlxuICAgICAgaWYgKHN0YWdlLmVsYXBzZWRNcyA+IHJlc3VsdC50b3RhbEVsYXBzZWRNcykge1xuICAgICAgICByZXN1bHQudG90YWxFbGFwc2VkTXMgPSBzdGFnZS5lbGFwc2VkTXM7XG4gICAgICB9XG4gICAgICByZXN1bHQudG90YWxUb2tlbnNJbnB1dCArPSBzdGFnZS50b2tlbnNJbnB1dDtcbiAgICAgIHJlc3VsdC50b3RhbFRva2Vuc091dHB1dCArPSBzdGFnZS50b2tlbnNPdXRwdXQ7XG4gICAgICByZXN1bHQudG90YWxUb2tlbnNDYWNoZWQgKz0gc3RhZ2UudG9rZW5zQ2FjaGVkO1xuXG4gICAgICAvLyBFeHRyYWN0IGdlbmVyYXRlZCBHUUwgZnJvbSBhbnkgc3RhZ2UncyBkYXRhLmdxbCAvIC5maW5hbF9ncWwgLyAuY2FuZGlkYXRlXG4gICAgICBpZiAoc3RhZ2UuZGF0YSAmJiB0eXBlb2Ygc3RhZ2UuZGF0YSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoc3RhZ2UuZGF0YSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgWydncWwnLCAnZmluYWxfZ3FsJywgJ2NhbmRpZGF0ZSddKSB7XG4gICAgICAgICAgY29uc3QgdmFsID0gKHN0YWdlLmRhdGEgYXMgUmVjb3JkPHN0cmluZywgYW55Pilba2V5XTtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgdmFsLnRyaW0oKSkge1xuICAgICAgICAgICAgcmVzdWx0LmdlbmVyYXRlZEdxbCA9IHZhbDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3RhZ2Uuc3RhZ2UgPT09ICdlcnJvcicpIHtcbiAgICAgICAgcmVzdWx0LnN1Y2Nlc3MgPSBmYWxzZTtcbiAgICAgICAgcmVzdWx0LmVycm9yID0gc3RhZ2UuZGV0YWlsIHx8ICdBSSBzdGFnZSByZXBvcnRlZCBlcnJvcic7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGFnZS5zdGFnZSA9PT0gJ2ZpbmFsJykge1xuICAgICAgICAvLyBTZXJ2ZXIgZW1pdHMgZXhlY3V0aW9uIG1ldGFkYXRhIGRpY3QgaGVyZTsgYWlSZWFkIG92ZXJ3cml0ZXMgd2l0aCBhIHJlYWxcbiAgICAgICAgLy8gUmVzcG9uc2UgYWZ0ZXIgcmUtZXhlY3V0aW5nIHRoZSBnZW5lcmF0ZWQgR1FMLiBUaGUgYGFueWAgaGVyZSBpcyB1bmF2b2lkYWJsZVxuICAgICAgICAvLyBiZWNhdXNlIHRoZSBzZXJ2ZXIgaGFuZHMgYmFjayBhIEpTT04gZGljdCBiZWZvcmUgd2Uga25vdyB0aGUgZmluYWwgc2hhcGUuXG4gICAgICAgIChyZXN1bHQgYXMgYW55KS5kYXRhID0gc3RhZ2UuZGF0YTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjazogaWYgZ2VuZXJhdGVkX2dxbCB3YXMgbmV2ZXIgY2FwdHVyZWQgZnJvbSBhIGRhdGEgZGljdCxcbiAgICAvLyBmYWxsIGJhY2sgdG8gdGhlIGZpbmFsIHN0YWdlJ3MgZGV0YWlsIHN0cmluZy5cbiAgICBpZiAocmVzdWx0LmdlbmVyYXRlZEdxbCA9PT0gbnVsbCkge1xuICAgICAgZm9yIChsZXQgaSA9IHJlc3VsdC5zdGFnZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgcyA9IHJlc3VsdC5zdGFnZXNbaV07XG4gICAgICAgIGlmIChzLnN0YWdlID09PSAnZmluYWwnICYmIHMuZGV0YWlsKSB7XG4gICAgICAgICAgcmVzdWx0LmdlbmVyYXRlZEdxbCA9IHMuZGV0YWlsO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSW50ZXJuYWwgSGVscGVycyDigJQgVHJhaWxpbmcgQ29uZmlnIFNwbGl0dGVyXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFNwbGl0IGEgdmFyaWFkaWMgYXJnIGxpc3Qgd2hlcmUgdGhlIGxhc3QgZWxlbWVudCAqbWF5KiBiZSBhIFF1ZXJ5Q29uZmlnXG4gKiBpbnRvIHNlcGFyYXRlIHN0cmluZyBuYW1lcyBhbmQgYW4gb3B0aW9uYWwgY29uZmlnLiBQeXRob24gdXNlcyBrZXl3b3JkLW9ubHlcbiAqIGBjb25maWdgIGluIHRoZXNlIEFQSXM7IHRoZSBUeXBlU2NyaXB0IGVxdWl2YWxlbnQgaXMgYW4gb3B0aW9uYWwgdHJhaWxpbmdcbiAqIGNvbmZpZyBvYmplY3QgZGV0ZWN0ZWQgYnkgXCJub3QgYSBzdHJpbmdcIi5cbiAqL1xuZnVuY3Rpb24gc3BsaXRUcmFpbGluZ0NvbmZpZyhcbiAgYXJnczogQXJyYXk8c3RyaW5nIHwgUXVlcnlDb25maWcgfCB1bmRlZmluZWQ+XG4pOiB7IG5hbWVzOiBzdHJpbmdbXTsgY29uZmlnPzogUXVlcnlDb25maWcgfSB7XG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgbmFtZXM6IFtdIH07XG4gIGNvbnN0IGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gIGlmIChsYXN0ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGxhc3QgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgbmFtZXM6IGFyZ3Muc2xpY2UoMCwgLTEpIGFzIHN0cmluZ1tdLCBjb25maWc6IGxhc3QgYXMgUXVlcnlDb25maWcgfTtcbiAgfVxuICAvLyBJZiBsYXN0IGlzIHVuZGVmaW5lZCwgc3RyaXAgaXQgYXMgYSB0cmFpbGluZyBvcHRpb25hbCBjb25maWcgcGxhY2Vob2xkZXIuXG4gIGlmIChsYXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4geyBuYW1lczogYXJncy5zbGljZSgwLCAtMSkgYXMgc3RyaW5nW10gfTtcbiAgfVxuICByZXR1cm4geyBuYW1lczogYXJncyBhcyBzdHJpbmdbXSB9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSW50ZXJuYWwgSGVscGVycyDigJQgUGFyc2luZyBSZXNwb25zZSBSb3dzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogRmluZCB0aGUgaW5kZXggb2YgYSBjb2x1bW4gYnkgbmFtZSAoY2FzZS1pbnNlbnNpdGl2ZSksIG9yIC0xIGlmIG5vdCBmb3VuZCAqL1xuZnVuY3Rpb24gZmluZENvbHVtbkluZGV4KHJlc3A6IFJlc3BvbnNlLCBuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBsb3dlciA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNwLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAocmVzcC5jb2x1bW5zW2ldLnRvTG93ZXJDYXNlKCkgPT09IGxvd2VyKSByZXR1cm4gaTtcbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbi8qKiBTYWZlbHkgZXh0cmFjdCBhIHN0cmluZyBmcm9tIGEgcm93IGF0IHRoZSBnaXZlbiBjb2x1bW4gaW5kZXggKi9cbmZ1bmN0aW9uIGdldFN0cmluZ1ZhbChyb3c6IFJvdywgaWR4OiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoaWR4IDwgMCkgcmV0dXJuICcnO1xuICB0cnkge1xuICAgIGNvbnN0IHZhbCA9IHJvdy5nZXQoaWR4KTtcbiAgICBpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gJyc7XG4gICAgcmV0dXJuIFN0cmluZyh2YWwpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbn1cblxuLyoqIFNhZmVseSBleHRyYWN0IGEgbnVtYmVyIGZyb20gYSByb3cgYXQgdGhlIGdpdmVuIGNvbHVtbiBpbmRleCAqL1xuZnVuY3Rpb24gZ2V0TnVtYmVyVmFsKHJvdzogUm93LCBpZHg6IG51bWJlcik6IG51bWJlciB7XG4gIGlmIChpZHggPCAwKSByZXR1cm4gMDtcbiAgdHJ5IHtcbiAgICBjb25zdCB2YWwgPSByb3cuZ2V0KGlkeCk7XG4gICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuIDA7XG4gICAgY29uc3QgbnVtID0gTnVtYmVyKHZhbCk7XG4gICAgcmV0dXJuIGlzTmFOKG51bSkgPyAwIDogbnVtO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gMDtcbiAgfVxufVxuXG4vKiogTm9ybWFsaXplIGEgbGFiZWwgY29sdW1uIHZhbHVlIHRvIGEgc3RyaW5nIGFycmF5LlxuICpcbiAqIFNlcnZlciByZXR1cm5zIGEgbGlzdCAobXVsdGktbGFiZWwgc3VwcG9ydCkuIEFjY2VwdCBsaXN0IG9mIHN0cmluZ3MsXG4gKiBhIHNpbmdsZSBzdHJpbmcgKGRlZ3JhZGVkIHNlcnZlcnMpLCBvciBudWxsL3VuZGVmaW5lZC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VMYWJlbHNWYWx1ZSh2YWw6IGFueSk6IHN0cmluZ1tdIHtcbiAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFtdO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm4gdmFsLm1hcCgoeDogYW55KSA9PiBTdHJpbmcoeCkpO1xuICByZXR1cm4gW1N0cmluZyh2YWwpXTtcbn1cblxuZnVuY3Rpb24gcGFyc2VMYWJlbEluZm9Sb3dzKHJlc3A6IFJlc3BvbnNlLCBmb3JjZWRUeXBlPzogc3RyaW5nKTogTGFiZWxJbmZvW10ge1xuICBpZiAocmVzcC5yb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuXG4gIGxldCBsYWJlbElkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnbGFiZWwnKTtcbiAgaWYgKGxhYmVsSWR4IDwgMCkgbGFiZWxJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ25hbWUnKTtcbiAgbGV0IHR5cGVJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3R5cGUnKTtcbiAgaWYgKHR5cGVJZHggPCAwKSB0eXBlSWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdlbGVtZW50X3R5cGUnKTtcblxuICByZXR1cm4gcmVzcC5yb3dzLm1hcChyb3cgPT4ge1xuICAgIGNvbnN0IHJhd0xhYmVsID0gbGFiZWxJZHggPj0gMCA/IHJvdy5nZXQobGFiZWxJZHgpIDogbnVsbDtcbiAgICBjb25zdCB0eXBlID0gZm9yY2VkVHlwZSAhPT0gdW5kZWZpbmVkID8gZm9yY2VkVHlwZSA6IGdldFN0cmluZ1ZhbChyb3csIHR5cGVJZHgpO1xuICAgIHJldHVybiB7XG4gICAgICBsYWJlbHM6IHBhcnNlTGFiZWxzVmFsdWUocmF3TGFiZWwpLFxuICAgICAgdHlwZSxcbiAgICB9O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcGFyc2VOb2RlVHlwZUluZm9Sb3dzKHJlc3A6IFJlc3BvbnNlKTogTm9kZVR5cGVJbmZvW10ge1xuICBpZiAocmVzcC5yb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuXG4gIGxldCBuYW1lSWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICduYW1lJyk7XG4gIGNvbnN0IHR5cGVJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3R5cGUnKTtcbiAgY29uc3QgcHJvcHNJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3Byb3BlcnRpZXMnKTtcblxuICBpZiAobmFtZUlkeCA8IDApIG5hbWVJZHggPSB0eXBlSWR4O1xuXG4gIHJldHVybiByZXNwLnJvd3MubWFwKHJvdyA9PiAoe1xuICAgIG5hbWU6IGdldFN0cmluZ1ZhbChyb3csIG5hbWVJZHgpLFxuICAgIHByb3BlcnRpZXM6IHBhcnNlUHJvcGVydHlTdHJpbmcoZ2V0U3RyaW5nVmFsKHJvdywgcHJvcHNJZHgpKSxcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZUVkZ2VUeXBlSW5mb1Jvd3MocmVzcDogUmVzcG9uc2UpOiBFZGdlVHlwZUluZm9bXSB7XG4gIGlmIChyZXNwLnJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgbGV0IG5hbWVJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ25hbWUnKTtcbiAgY29uc3QgdHlwZUlkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAndHlwZScpO1xuICBjb25zdCBwcm9wc0lkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAncHJvcGVydGllcycpO1xuXG4gIGlmIChuYW1lSWR4IDwgMCkgbmFtZUlkeCA9IHR5cGVJZHg7XG5cbiAgcmV0dXJuIHJlc3Aucm93cy5tYXAocm93ID0+ICh7XG4gICAgbmFtZTogZ2V0U3RyaW5nVmFsKHJvdywgbmFtZUlkeCksXG4gICAgcHJvcGVydGllczogcGFyc2VQcm9wZXJ0eVN0cmluZyhnZXRTdHJpbmdWYWwocm93LCBwcm9wc0lkeCkpLFxuICB9KSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQWxnb0luZm9Sb3dzKHJlc3A6IFJlc3BvbnNlKTogQWxnb0luZm9bXSB7XG4gIGlmIChyZXNwLnJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgY29uc3QgbmFtZUlkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnbmFtZScpO1xuICBjb25zdCBkZXNjSWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdkZXNjcmlwdGlvbicpO1xuICBjb25zdCB2ZXJJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3ZlcnNpb24nKTtcbiAgY29uc3QgcGFyYW1zSWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdwYXJhbWV0ZXJzJyk7XG5cbiAgcmV0dXJuIHJlc3Aucm93cy5tYXAocm93ID0+ICh7XG4gICAgbmFtZTogZ2V0U3RyaW5nVmFsKHJvdywgbmFtZUlkeCksXG4gICAgZGVzY3JpcHRpb246IGdldFN0cmluZ1ZhbChyb3csIGRlc2NJZHgpLFxuICAgIHZlcnNpb246IGdldFN0cmluZ1ZhbChyb3csIHZlcklkeCksXG4gICAgcGFyYW1ldGVyczogZ2V0U3RyaW5nVmFsKHJvdywgcGFyYW1zSWR4KSxcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZUluZGV4SW5mb1Jvd3MocmVzcDogUmVzcG9uc2UpOiBJbmRleEluZm9bXSB7XG4gIGlmIChyZXNwLnJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgY29uc3QgaWR4TmFtZSA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnaW5kZXhfbmFtZScpO1xuICBjb25zdCBpZHhFbnRpdHkgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2VudGl0eV90eXBlJyk7XG4gIGNvbnN0IGlkeExhYmVsID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdsYWJlbCcpO1xuICBjb25zdCBpZHhQcm9wID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdwcm9wZXJ0eScpO1xuICBjb25zdCBpZHhQcmVmaXggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3ByZWZpeF9sZW5ndGgnKTtcbiAgY29uc3QgaWR4U3RhdHVzID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdzdGF0dXMnKTtcbiAgY29uc3QgaWR4UHJvZ3Jlc3MgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3Byb2dyZXNzJyk7XG4gIGNvbnN0IGlkeEluZGV4ZWQgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2luZGV4ZWRfY291bnQnKTtcbiAgY29uc3QgaWR4VG90YWwgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3RvdGFsX2NvdW50Jyk7XG4gIGNvbnN0IGlkeEVycm9yID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdlcnJvcicpO1xuXG4gIHJldHVybiByZXNwLnJvd3MubWFwKHJvdyA9PiB7XG4gICAgY29uc3QgaW5mbzogSW5kZXhJbmZvID0ge1xuICAgICAgaW5kZXhOYW1lOiBnZXRTdHJpbmdWYWwocm93LCBpZHhOYW1lKSxcbiAgICAgIGVudGl0eVR5cGU6IGdldFN0cmluZ1ZhbChyb3csIGlkeEVudGl0eSksXG4gICAgICBsYWJlbDogZ2V0U3RyaW5nVmFsKHJvdywgaWR4TGFiZWwpLFxuICAgICAgcHJvcGVydHk6IGdldFN0cmluZ1ZhbChyb3csIGlkeFByb3ApLFxuICAgICAgc3RhdHVzOiBnZXRTdHJpbmdWYWwocm93LCBpZHhTdGF0dXMpLFxuICAgICAgcHJvZ3Jlc3M6IGdldFN0cmluZ1ZhbChyb3csIGlkeFByb2dyZXNzKSxcbiAgICAgIGluZGV4ZWRDb3VudDogZ2V0TnVtYmVyVmFsKHJvdywgaWR4SW5kZXhlZCksXG4gICAgICB0b3RhbENvdW50OiBnZXROdW1iZXJWYWwocm93LCBpZHhUb3RhbCksXG4gICAgICBlcnJvcjogZ2V0U3RyaW5nVmFsKHJvdywgaWR4RXJyb3IpLFxuICAgIH07XG4gICAgaWYgKGlkeFByZWZpeCA+PSAwKSB7XG4gICAgICBpbmZvLnByZWZpeExlbmd0aCA9IGdldE51bWJlclZhbChyb3csIGlkeFByZWZpeCk7XG4gICAgfVxuICAgIHJldHVybiBpbmZvO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcGFyc2VGdWxsdGV4dEluZm9Sb3dzKHJlc3A6IFJlc3BvbnNlKTogRnVsbHRleHRJbmZvW10ge1xuICBpZiAocmVzcC5yb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGlkeE5hbWUgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2luZGV4X25hbWUnKTtcbiAgY29uc3QgaWR4RW50aXR5ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdlbnRpdHlfdHlwZScpO1xuICBjb25zdCBpZHhTY2hlbWEgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3NjaGVtYV9uYW1lJyk7XG4gIGNvbnN0IGlkeFByb3BzID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdwcm9wZXJ0aWVzJyk7XG4gIGNvbnN0IGlkeEFuYWx5emVyID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdhbmFseXplcicpO1xuICBjb25zdCBpZHhTdGF0dXMgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3N0YXR1cycpO1xuICBjb25zdCBpZHhEb2NDb3VudCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnZG9jX2NvdW50Jyk7XG4gIGNvbnN0IGlkeFByb2dyZXNzID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdwcm9ncmVzcycpO1xuXG4gIHJldHVybiByZXNwLnJvd3MubWFwKHJvdyA9PiAoe1xuICAgIGluZGV4TmFtZTogZ2V0U3RyaW5nVmFsKHJvdywgaWR4TmFtZSksXG4gICAgZW50aXR5VHlwZTogZ2V0U3RyaW5nVmFsKHJvdywgaWR4RW50aXR5KSxcbiAgICBzY2hlbWFOYW1lOiBnZXRTdHJpbmdWYWwocm93LCBpZHhTY2hlbWEpLFxuICAgIHByb3BlcnRpZXM6IGdldFN0cmluZ1ZhbChyb3csIGlkeFByb3BzKSxcbiAgICBhbmFseXplcjogZ2V0U3RyaW5nVmFsKHJvdywgaWR4QW5hbHl6ZXIpLFxuICAgIHN0YXR1czogZ2V0U3RyaW5nVmFsKHJvdywgaWR4U3RhdHVzKSxcbiAgICBkb2NDb3VudDogZ2V0TnVtYmVyVmFsKHJvdywgaWR4RG9jQ291bnQpLFxuICAgIHByb2dyZXNzOiBnZXRTdHJpbmdWYWwocm93LCBpZHhQcm9ncmVzcyksXG4gIH0pKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VUYXNrSW5mb1Jvd3MocmVzcDogUmVzcG9uc2UpOiBUYXNrSW5mb1tdIHtcbiAgaWYgKHJlc3Aucm93cy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICBjb25zdCBpZHhJZCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAndGFza19pZCcpO1xuICBjb25zdCBpZHhUeXBlID0gZmluZENvbHVtbkluZGV4KHJlc3AsICd0eXBlJyk7XG4gIGNvbnN0IGlkeFF1ZXJ5ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdxdWVyeScpO1xuICBjb25zdCBpZHhBbGdvID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdhbGdvX25hbWUnKTtcbiAgY29uc3QgaWR4U3RhdHVzID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdzdGF0dXMnKTtcbiAgY29uc3QgaWR4U3RhcnRlZCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnc3RhcnRlZF9hdCcpO1xuICBjb25zdCBpZHhQcm9ncmVzcyA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAncHJvZ3Jlc3MnKTtcbiAgY29uc3QgaWR4UGFyYW1zID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdwYXJhbWV0ZXJzJyk7XG4gIGNvbnN0IGlkeE5vZGVzID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdub2Rlc193cml0dGVuJyk7XG4gIGNvbnN0IGlkeENvbXB1dGUgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2NvbXB1dGVfdGltZV9tcycpO1xuICBjb25zdCBpZHhXcml0ZSA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnd3JpdGVfdGltZV9tcycpO1xuXG4gIHJldHVybiByZXNwLnJvd3MubWFwKHJvdyA9PiAoe1xuICAgIHRhc2tJZDogZ2V0U3RyaW5nVmFsKHJvdywgaWR4SWQpLFxuICAgIHR5cGU6IGdldFN0cmluZ1ZhbChyb3csIGlkeFR5cGUpLFxuICAgIHF1ZXJ5OiBnZXRTdHJpbmdWYWwocm93LCBpZHhRdWVyeSksXG4gICAgYWxnb05hbWU6IGdldFN0cmluZ1ZhbChyb3csIGlkeEFsZ28pLFxuICAgIHN0YXR1czogZ2V0U3RyaW5nVmFsKHJvdywgaWR4U3RhdHVzKSxcbiAgICBzdGFydGVkQXQ6IGdldFN0cmluZ1ZhbChyb3csIGlkeFN0YXJ0ZWQpLFxuICAgIHByb2dyZXNzOiBnZXRTdHJpbmdWYWwocm93LCBpZHhQcm9ncmVzcyksXG4gICAgcGFyYW1ldGVyczogZ2V0U3RyaW5nVmFsKHJvdywgaWR4UGFyYW1zKSxcbiAgICBub2Rlc1dyaXR0ZW46IGdldE51bWJlclZhbChyb3csIGlkeE5vZGVzKSxcbiAgICBjb21wdXRlVGltZU1zOiBnZXROdW1iZXJWYWwocm93LCBpZHhDb21wdXRlKSxcbiAgICB3cml0ZVRpbWVNczogZ2V0TnVtYmVyVmFsKHJvdywgaWR4V3JpdGUpLFxuICB9KSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlUHJvY2Vzc0luZm9Sb3dzKHJlc3A6IFJlc3BvbnNlKTogUHJvY2Vzc0luZm9bXSB7XG4gIGlmIChyZXNwLnJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgY29uc3QgaWR4SWQgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3F1ZXJ5X2lkJyk7XG4gIGNvbnN0IGlkeFRleHQgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3F1ZXJ5X3RleHQnKTtcbiAgY29uc3QgaWR4U3RhcnQgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3N0YXJ0X3RpbWUnKTtcbiAgY29uc3QgaWR4RHVyYXRpb24gPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2R1cmF0aW9uX21zJyk7XG4gIGNvbnN0IGlkeFN0YXR1cyA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnc3RhdHVzJyk7XG5cbiAgcmV0dXJuIHJlc3Aucm93cy5tYXAocm93ID0+ICh7XG4gICAgcXVlcnlJZDogZ2V0U3RyaW5nVmFsKHJvdywgaWR4SWQpLFxuICAgIHF1ZXJ5VGV4dDogZ2V0U3RyaW5nVmFsKHJvdywgaWR4VGV4dCksXG4gICAgc3RhcnRUaW1lOiBnZXRTdHJpbmdWYWwocm93LCBpZHhTdGFydCksXG4gICAgZHVyYXRpb25NczogZ2V0TnVtYmVyVmFsKHJvdywgaWR4RHVyYXRpb24pLFxuICAgIHN0YXR1czogZ2V0U3RyaW5nVmFsKHJvdywgaWR4U3RhdHVzKSxcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZUdyYXBoU3RhdHMocmVzcDogUmVzcG9uc2UpOiBHcmFwaFN0YXRzIHtcbiAgY29uc3QgZ3M6IEdyYXBoU3RhdHMgPSB7XG4gICAgZ3JhcGhOYW1lOiAnJyxcbiAgICBub2RlQ291bnQ6IDAsXG4gICAgZWRnZUNvdW50OiAwLFxuICAgIGxhYmVsQ291bnRzOiB7fSxcbiAgICBlZGdlTGFiZWxDb3VudHM6IHt9LFxuICAgIG5vZGVQcm9wZXJ0eVN0YXRzOiB7fSxcbiAgICBlZGdlUHJvcGVydHlTdGF0czoge30sXG4gIH07XG5cbiAgaWYgKHJlc3Aucm93cy5sZW5ndGggPT09IDApIHJldHVybiBncztcblxuICBsZXQgc3RhdHNJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3N0YXRzJyk7XG4gIGlmIChzdGF0c0lkeCA8IDApIHN0YXRzSWR4ID0gMDtcblxuICBpZiAocmVzcC5yb3dzLmxlbmd0aCA9PT0gMCB8fCBzdGF0c0lkeCA+PSByZXNwLnJvd3NbMF0udmFsdWVzLmxlbmd0aCkgcmV0dXJuIGdzO1xuXG4gIGNvbnN0IHZhbCA9IHJlc3Aucm93c1swXS5nZXQoc3RhdHNJZHgpO1xuICBpZiAodmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKHZhbC5ncmFwaF9uYW1lICE9PSB1bmRlZmluZWQpIGdzLmdyYXBoTmFtZSA9IFN0cmluZyh2YWwuZ3JhcGhfbmFtZSk7XG4gICAgaWYgKHZhbC5ub2RlX2NvdW50ICE9PSB1bmRlZmluZWQpIGdzLm5vZGVDb3VudCA9IE51bWJlcih2YWwubm9kZV9jb3VudCkgfHwgMDtcbiAgICBpZiAodmFsLmVkZ2VfY291bnQgIT09IHVuZGVmaW5lZCkgZ3MuZWRnZUNvdW50ID0gTnVtYmVyKHZhbC5lZGdlX2NvdW50KSB8fCAwO1xuICB9XG5cbiAgcmV0dXJuIGdzO1xufVxuIl19