@milkio/stargate-worker 1.0.1 → 1.0.3

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.
Files changed (3) hide show
  1. package/index.d.ts +22 -2
  2. package/index.js +212 -25
  3. package/package.json +1 -1
package/index.d.ts CHANGED
@@ -8,11 +8,26 @@ export type MilkioStargateOptions = {
8
8
  data: any;
9
9
  }) => void) => void;
10
10
  };
11
+ cacheStorage?: CacheStorage;
12
+ cacheEncryption?: boolean;
11
13
  };
12
14
  export type Mixin<T, U> = U & Omit<T, keyof U>;
13
- export type ExecuteOptions = {
15
+ export type CacheStrategy = 'off' | 'fallback' | 'throttle';
16
+ export type RetryStrategy = boolean | number;
17
+ export interface CacheStorage {
18
+ get: (key: string) => Promise<{
19
+ data: any;
20
+ timestamp: number;
21
+ } | null>;
22
+ set: (key: string, data: any) => Promise<void>;
23
+ }
24
+ export type ExecuteOptions<T extends any = any> = {
14
25
  params?: Record<any, any>;
15
26
  headers?: Record<string, string>;
27
+ cacheStrategy?: CacheStrategy;
28
+ cacheThrottleMs?: number;
29
+ onCacheHit?: (result: T) => void | Promise<void>;
30
+ retryStrategy?: RetryStrategy;
16
31
  };
17
32
  export type ExecuteResultsOption = {
18
33
  executeId: string;
@@ -23,7 +38,7 @@ export declare function createStargateWorker<Generated extends {
23
38
  rejectCode: any;
24
39
  }>(stargateOptions: MilkioStargateOptions): Promise<{
25
40
  close(): void;
26
- execute<Path extends keyof Generated["routeSchema"]>(path: Path, options: Mixin<ExecuteOptions, {
41
+ execute<Path extends keyof Generated["routeSchema"]>(path: Path, options: Mixin<ExecuteOptions<Generated["routeSchema"][Path]["types"]["result"]>, {
27
42
  params?: Generated["routeSchema"][Path]["types"]["params"];
28
43
  }>): Promise<Generated["routeSchema"][Path]["types"]["\uD83E\uDD5B"] extends boolean ? // action
29
44
  [Partial<Generated["rejectCode"]>, null, ExecuteResultsOption] | [null, Generated["routeSchema"][Path]["types"]["result"], ExecuteResultsOption] : // stream
@@ -43,3 +58,8 @@ export type MilkioFlow<T, TReturn = any, TNext = any> = {
43
58
  throw(error: any, disablePostCloseMessage?: true): Promise<IteratorResult<T, TReturn>>;
44
59
  };
45
60
  export declare function createFlow<T>(stargateOptions: MilkioStargateOptions, executeId: string): MilkioFlow<T>;
61
+ export declare function reviveJSONParse<T>(json: T): T;
62
+ export declare function createDefaultCacheStorage(options?: {
63
+ encryption?: boolean;
64
+ encryptionKey?: string;
65
+ }): Promise<CacheStorage>;
package/index.js CHANGED
@@ -110,32 +110,85 @@ async function createStargateWorker(stargateOptions) {
110
110
  async execute(path, options) {
111
111
  return new Promise(async (resolve) => {
112
112
  await connect;
113
- const executeId = __createId();
114
- executeIds.add(executeId);
115
113
  if (!path.endsWith("~")) {
116
- const handler = (event) => {
117
- if (typeof event.data !== "object")
118
- return;
119
- if (event.data.executeId !== executeId)
120
- return;
121
- executeIds.delete(executeId);
122
- stargateOptions.port.removeEventListener("message", handler);
123
- if (!event.data.success) {
124
- const error = {};
125
- error[event.data.error.code] = event.data.error.reject;
126
- resolve([error, null, { executeId }]);
114
+ const cacheStrategy = options?.cacheStrategy ?? "off";
115
+ let retryCount = 0;
116
+ if (options?.retryStrategy === true || options?.retryStrategy === 2) {
117
+ retryCount = 2;
118
+ } else if (typeof options?.retryStrategy === "number" && options?.retryStrategy > 0) {
119
+ retryCount = options?.retryStrategy;
120
+ }
121
+ const cacheThrottleMs = options?.cacheThrottleMs ?? 0;
122
+ const cacheKey = generateCacheKey(path, options?.params);
123
+ let cacheStorage = stargateOptions.cacheStorage;
124
+ if (cacheStrategy !== "off" && !cacheStorage) {
125
+ cacheStorage = await createDefaultCacheStorage({ encryption: stargateOptions.cacheEncryption });
126
+ }
127
+ if (cacheStrategy !== "off" && cacheStorage && options?.onCacheHit) {
128
+ const cached = await cacheStorage.get(cacheKey);
129
+ if (cached) {
130
+ try {
131
+ await options.onCacheHit(cached.data);
132
+ } catch {}
127
133
  }
128
- if (event.data.success)
129
- resolve([null, event.data.data, { executeId }]);
134
+ }
135
+ if (cacheStrategy === "throttle" && cacheStorage) {
136
+ const cached = await cacheStorage.get(cacheKey);
137
+ if (cached && Date.now() - cached.timestamp < cacheThrottleMs) {
138
+ return resolve([null, cached.data, { executeId: "cached" }]);
139
+ }
140
+ }
141
+ const executeRequest = () => {
142
+ return new Promise((reqResolve) => {
143
+ const reqExecuteId = __createId();
144
+ executeIds.add(reqExecuteId);
145
+ const handler = (event) => {
146
+ if (typeof event.data !== "object")
147
+ return;
148
+ if (event.data.executeId !== reqExecuteId)
149
+ return;
150
+ executeIds.delete(reqExecuteId);
151
+ stargateOptions.port.removeEventListener("message", handler);
152
+ if (!event.data.success) {
153
+ const error2 = {};
154
+ error2[event.data.error.code] = event.data.error.reject;
155
+ reqResolve([error2, null, { executeId: reqExecuteId }]);
156
+ } else {
157
+ reqResolve([null, event.data.data, { executeId: reqExecuteId }]);
158
+ }
159
+ };
160
+ stargateOptions.port.addEventListener("message", handler);
161
+ stargateOptions.port.postMessage({
162
+ executeId: reqExecuteId,
163
+ path,
164
+ params: options?.params,
165
+ headers: options?.headers
166
+ });
167
+ });
130
168
  };
131
- stargateOptions.port.addEventListener("message", handler);
132
- stargateOptions.port.postMessage({
133
- executeId,
134
- path,
135
- params: options?.params,
136
- headers: options?.headers
137
- });
169
+ let [error, result, resultOption] = await executeRequest();
170
+ for (let retryIndex = 0;retryIndex < retryCount && error; retryIndex++) {
171
+ if (retryIndex > 0) {
172
+ await new Promise((r) => setTimeout(r, 500));
173
+ }
174
+ [error, result, resultOption] = await executeRequest();
175
+ }
176
+ if (error) {
177
+ if (cacheStrategy !== "off" && cacheStorage) {
178
+ const cached = await cacheStorage.get(cacheKey);
179
+ if (cached) {
180
+ return resolve([null, cached.data, { executeId: "cached" }]);
181
+ }
182
+ }
183
+ return resolve([error, null, resultOption]);
184
+ }
185
+ if (cacheStrategy !== "off" && cacheStorage) {
186
+ await cacheStorage.set(cacheKey, result);
187
+ }
188
+ resolve([null, result, resultOption]);
138
189
  } else {
190
+ const executeId = __createId();
191
+ executeIds.add(executeId);
139
192
  let flow;
140
193
  const handler = (event) => {
141
194
  if (typeof event.data !== "object")
@@ -250,10 +303,144 @@ function withResolvers() {
250
303
  });
251
304
  return { promise, resolve, reject };
252
305
  }
306
+ var isoDatePattern = /^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,3})?)(Z|[+-]\d{2}:?\d{2})?$/;
307
+ function reviveJSONParse(json) {
308
+ if (json !== null && typeof json === "object") {
309
+ if (json instanceof Date || typeof json.getTime === "function" && typeof json.toISOString === "function") {
310
+ return json;
311
+ }
312
+ if (Array.isArray(json)) {
313
+ return json.map((item) => reviveJSONParse(item));
314
+ }
315
+ return Object.entries(json).reduce((acc, [key, value]) => {
316
+ acc[key] = reviveJSONParse(value);
317
+ return acc;
318
+ }, {});
319
+ }
320
+ if (typeof json === "string") {
321
+ const match = json.match(isoDatePattern);
322
+ if (match) {
323
+ const normalizedDateString = match[2] ? `${match[1]}${match[2].replace(":", "")}` : `${match[1]}Z`;
324
+ return new Date(normalizedDateString);
325
+ }
326
+ }
327
+ return json;
328
+ }
329
+ var DB_NAME = "StargateWorker";
330
+ var STORE_NAME = "caches";
331
+ var dbInstance = null;
332
+ async function openDB() {
333
+ if (dbInstance)
334
+ return dbInstance;
335
+ return new Promise((resolve, reject) => {
336
+ const request = indexedDB.open(DB_NAME, 1);
337
+ request.onerror = () => reject(request.error);
338
+ request.onsuccess = () => {
339
+ dbInstance = request.result;
340
+ resolve(dbInstance);
341
+ };
342
+ request.onupgradeneeded = (event) => {
343
+ const db = event.target.result;
344
+ if (!db.objectStoreNames.contains(STORE_NAME)) {
345
+ db.createObjectStore(STORE_NAME);
346
+ }
347
+ };
348
+ });
349
+ }
350
+ async function createDefaultCacheStorage(options) {
351
+ await openDB();
352
+ let encryptionKey = null;
353
+ const counter = new Uint8Array(16);
354
+ if (options?.encryption) {
355
+ const keyString = options.encryptionKey ?? DB_NAME;
356
+ new TextEncoder().encode(keyString).forEach((byte, i) => {
357
+ if (i < 16)
358
+ counter[i] = byte;
359
+ });
360
+ const encoder = new TextEncoder;
361
+ const keyData = encoder.encode(keyString);
362
+ const importedKey = await crypto.subtle.importKey("raw", keyData, { name: "PBKDF2" }, false, ["deriveKey"]);
363
+ encryptionKey = await crypto.subtle.deriveKey({
364
+ name: "PBKDF2",
365
+ salt: encoder.encode("milkio-stargate-worker-cache"),
366
+ iterations: 1e5,
367
+ hash: "SHA-256"
368
+ }, importedKey, { name: "AES-CTR", length: 256 }, false, ["encrypt", "decrypt"]);
369
+ }
370
+ const encryptData = async (data) => {
371
+ if (!encryptionKey)
372
+ return data;
373
+ const jsonString = JSON.stringify(data);
374
+ const encoder = new TextEncoder;
375
+ const dataBytes = encoder.encode(jsonString);
376
+ const encryptedArrayBuffer = await crypto.subtle.encrypt({
377
+ name: "AES-CTR",
378
+ counter,
379
+ length: 64
380
+ }, encryptionKey, dataBytes);
381
+ return new Uint8Array(encryptedArrayBuffer);
382
+ };
383
+ const decryptData = async (encryptedData) => {
384
+ if (!encryptionKey || !encryptedData)
385
+ return encryptedData;
386
+ const arrayBuffer = encryptedData instanceof Uint8Array ? encryptedData.buffer : encryptedData;
387
+ const decryptedBytes = await crypto.subtle.decrypt({
388
+ name: "AES-CTR",
389
+ counter,
390
+ length: 64
391
+ }, encryptionKey, arrayBuffer);
392
+ const decoder = new TextDecoder;
393
+ const jsonString = decoder.decode(decryptedBytes);
394
+ return reviveJSONParse(JSON.parse(jsonString));
395
+ };
396
+ return {
397
+ async get(key) {
398
+ const db = await openDB();
399
+ return new Promise((resolve, reject) => {
400
+ const transaction = db.transaction(STORE_NAME, "readonly");
401
+ const store = transaction.objectStore(STORE_NAME);
402
+ const request = store.get(key);
403
+ request.onerror = () => reject(request.error);
404
+ request.onsuccess = async () => {
405
+ const result = request.result;
406
+ if (!result) {
407
+ resolve(null);
408
+ return;
409
+ }
410
+ if (options?.encryption && (result.data instanceof ArrayBuffer || result.data instanceof Uint8Array)) {
411
+ const decryptedData = await decryptData(result.data);
412
+ resolve({ data: decryptedData, timestamp: result.timestamp });
413
+ return;
414
+ }
415
+ resolve(result ?? null);
416
+ };
417
+ });
418
+ },
419
+ async set(key, data) {
420
+ const db = await openDB();
421
+ let dataToStore = data;
422
+ if (options?.encryption) {
423
+ dataToStore = await encryptData(data);
424
+ }
425
+ return new Promise((resolve, reject) => {
426
+ const transaction = db.transaction(STORE_NAME, "readwrite");
427
+ const store = transaction.objectStore(STORE_NAME);
428
+ const request = store.put({ data: dataToStore, timestamp: Date.now() }, key);
429
+ request.onerror = () => reject(request.error);
430
+ request.onsuccess = () => resolve();
431
+ });
432
+ }
433
+ };
434
+ }
435
+ function generateCacheKey(path, params) {
436
+ return `${path}:${JSON.stringify(params ?? {})}`;
437
+ }
253
438
  export {
439
+ reviveJSONParse,
254
440
  createStargateWorker,
255
- createFlow
441
+ createFlow,
442
+ createDefaultCacheStorage
256
443
  };
257
444
 
258
- //# debugId=1BC79B1210E27E9364756E2164756E21
259
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vdXRpbHMvY3JlYXRlLWlkLnRzIiwgIi4uL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgInR5cGUgSWRHZW5lcmF0b3JPcHRpb25zID0ge1xuICBsZW5ndGg/OiBudW1iZXI7XG4gIHRpbWVzdGFtcDogYm9vbGVhbjtcbiAgc2VxdWVudGlhbDogYm9vbGVhbjtcbn07XG5cbmZ1bmN0aW9uIGRlZmluZUlkR2VuZXJhdG9yKG9wdGlvbnM6IElkR2VuZXJhdG9yT3B0aW9ucykge1xuICBpZiAoIW9wdGlvbnMubGVuZ3RoKSBvcHRpb25zLmxlbmd0aCA9IDI0O1xuICBpZiAob3B0aW9ucy5sZW5ndGggPCAxKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGxlbmd0aFwiKTtcbiAgaWYgKG9wdGlvbnMubGVuZ3RoID4gNjEpIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgbGVuZ3RoXCIpO1xuICBpZiAob3B0aW9ucy50aW1lc3RhbXAgJiYgb3B0aW9ucy5sZW5ndGggPCA5KSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGxlbmd0aFwiKTtcbiAgbGV0IGxhc3RUaW1lID0gMDtcbiAgbGV0IGxhc3REZWNpbWFsID0gMG47XG4gIHJldHVybiB7XG4gICAgY3JlYXRlSWQoKSB7XG4gICAgICBsZXQgcmFuZExlbmd0aCA9IG9wdGlvbnMubGVuZ3RoITtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBsZXQgaWQgPSBcIlwiO1xuICAgICAgaWYgKG9wdGlvbnMudGltZXN0YW1wKSB7XG4gICAgICAgIHJhbmRMZW5ndGggLT0gODtcbiAgICAgICAgaWQgPSBgJHtpZH0ke19fYmlnSW50VG9TdHJpbmcoQmlnSW50KG5vdykpLnBhZFN0YXJ0KDgsIFwiMFwiKX1gO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMuc2VxdWVudGlhbCAmJiBsYXN0VGltZSA9PT0gbm93KSB7XG4gICAgICAgIGlkID0gYCR7aWR9JHtfX2JpZ0ludFRvU3RyaW5nKCsrbGFzdERlY2ltYWwpLnBhZFN0YXJ0KDEsIFwiMFwiKX1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGFzdFRpbWUgPSBub3c7XG4gICAgICAgIGNvbnN0IG1pbiA9IDBuO1xuICAgICAgICBjb25zdCBtYXggPSBfX2dldE1heFZhbHVlKEJpZ0ludChyYW5kTGVuZ3RoKSk7XG4gICAgICAgIGxhc3REZWNpbWFsID0gX19zZWN1cmVSYW5kb21CaWdJbnQobWluLCBtYXgpO1xuICAgICAgICBpZCA9IGAke2lkfSR7X19iaWdJbnRUb1N0cmluZyhsYXN0RGVjaW1hbCkucGFkU3RhcnQocmFuZExlbmd0aCwgXCIwXCIpfWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gaWQ7XG4gICAgfSxcbiAgICBnZXRJZFRpbWVzdGFtcChpZDogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy50aW1lc3RhbXAgPyBOdW1iZXIoX19zdHJpbmdUb0JpZ0ludChpZC5zbGljZSgwLCA4KS5yZXBsYWNlQWxsKFwiMFwiLCBcIlwiKSkpIDogMDtcbiAgICB9LFxuICB9O1xufVxuXG5jb25zdCBFTkNPRElORyA9IFwiMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcIjtcblxuZnVuY3Rpb24gX19zZWN1cmVSYW5kb21CaWdJbnQobWluOiBiaWdpbnQsIG1heDogYmlnaW50KTogYmlnaW50IHtcbiAgaWYgKG1pbiA+PSBtYXgpIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcmFuZ2VcIik7XG5cbiAgY29uc3QgcmFuZ2UgPSBtYXggLSBtaW4gKyAxbjtcbiAgY29uc3QgYnl0ZUNvdW50ID0gTWF0aC5jZWlsKE51bWJlcihCaWdJbnQocmFuZ2UudG9TdHJpbmcoMikubGVuZ3RoKSkgLyA4KTtcbiAgY29uc3QgZW50cm9weUJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnl0ZUNvdW50KTtcblxuICBsZXQgcmFuZG9tVmFsdWU6IGJpZ2ludDtcbiAgZG8ge1xuICAgIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMoZW50cm9weUJ5dGVzKTtcbiAgICByYW5kb21WYWx1ZSA9XG4gICAgICBCaWdJbnQoXG4gICAgICAgIGAweCR7QXJyYXkuZnJvbShlbnRyb3B5Qnl0ZXMpXG4gICAgICAgICAgLm1hcCgoYikgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKVxuICAgICAgICAgIC5qb2luKFwiXCIpfWAsXG4gICAgICApICUgcmFuZ2U7XG4gIH0gd2hpbGUgKHJhbmRvbVZhbHVlIDwgMG4pO1xuXG4gIHJldHVybiBtaW4gKyByYW5kb21WYWx1ZTtcbn1cblxuZnVuY3Rpb24gX19iaWdJbnRUb1N0cmluZyh2YWx1ZTogYmlnaW50KTogc3RyaW5nIHtcbiAgY29uc3QgYmFzZSA9IEJpZ0ludChFTkNPRElORy5sZW5ndGgpO1xuICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgbGV0IGN1cnJlbnQgPSB2YWx1ZTtcblxuICBpZiAoY3VycmVudCA9PT0gMG4pIHJldHVybiBFTkNPRElOR1swXTtcblxuICB3aGlsZSAoY3VycmVudCA+IDBuKSB7XG4gICAgY29uc3QgcmVtYWluZGVyID0gY3VycmVudCAlIGJhc2U7XG4gICAgcmVzdWx0ID0gRU5DT0RJTkdbTnVtYmVyKHJlbWFpbmRlcildICsgcmVzdWx0O1xuICAgIGN1cnJlbnQgPSBjdXJyZW50IC8gYmFzZTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBfX3N0cmluZ1RvQmlnSW50KHN0cjogc3RyaW5nKTogYmlnaW50IHtcbiAgY29uc3QgY2hhck1hcDogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IEVOQ09ESU5HLmxlbmd0aDsgaSsrKSB7XG4gICAgY2hhck1hcFtFTkNPRElOR1tpXV0gPSBpO1xuICB9XG5cbiAgY29uc3QgYmFzZSA9IEJpZ0ludChFTkNPRElORy5sZW5ndGgpO1xuICBsZXQgcmVzdWx0ID0gMG47XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjaGFyID0gc3RyW2ldO1xuICAgIGlmICghKGNoYXIgaW4gY2hhck1hcCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjaGFyYWN0ZXIgJyR7Y2hhcn0nIGluIGlucHV0IHN0cmluZ2ApO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IEJpZ0ludChjaGFyTWFwW2NoYXJdKTtcbiAgICByZXN1bHQgPSByZXN1bHQgKiBiYXNlICsgdmFsdWU7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBfX2dldE1heFZhbHVlKG46IGJpZ2ludCk6IGJpZ2ludCB7XG4gIHJldHVybiBCaWdJbnQoRU5DT0RJTkcubGVuZ3RoKSAqKiBuIC0gMW47XG59XG5cbmNvbnN0IGlkR2VuZXJhdG9yID0gZGVmaW5lSWRHZW5lcmF0b3IoeyBsZW5ndGg6IDI0LCB0aW1lc3RhbXA6IGZhbHNlLCBzZXF1ZW50aWFsOiBmYWxzZSB9KTtcblxuZXhwb3J0IGNvbnN0IF9fY3JlYXRlSWQgPSBpZEdlbmVyYXRvci5jcmVhdGVJZDtcbiIsCiAgICAiaW1wb3J0IHsgX19jcmVhdGVJZCB9IGZyb20gXCIuL3V0aWxzL2NyZWF0ZS1pZC50c1wiO1xuXG5leHBvcnQgdHlwZSBNaWxraW9TdGFyZ2F0ZU9wdGlvbnMgPSB7XG4gICAgcG9ydDoge1xuICAgICAgICBwb3N0TWVzc2FnZTogKGRhdGE6IGFueSkgPT4gdm9pZDtcbiAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcjogKGV2ZW50OiBcIm1lc3NhZ2VcIiwgY2FsbGJhY2s6IChldmVudDogeyBkYXRhOiBhbnkgfSkgPT4gdm9pZCkgPT4gdm9pZDtcbiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcjogKGV2ZW50OiBcIm1lc3NhZ2VcIiwgY2FsbGJhY2s6IChldmVudDogeyBkYXRhOiBhbnkgfSkgPT4gdm9pZCkgPT4gdm9pZDtcbiAgICB9O1xufTtcblxuZXhwb3J0IHR5cGUgTWl4aW48VCwgVT4gPSBVICYgT21pdDxULCBrZXlvZiBVPjtcblxuZXhwb3J0IHR5cGUgRXhlY3V0ZU9wdGlvbnMgPSB7XG4gICAgcGFyYW1zPzogUmVjb3JkPGFueSwgYW55PjtcbiAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn07XG5cbmV4cG9ydCB0eXBlIEV4ZWN1dGVSZXN1bHRzT3B0aW9uID0geyBleGVjdXRlSWQ6IHN0cmluZyB9O1xuXG5leHBvcnQgdHlwZSBHZW5lcmF0b3JHZW5lcmljPFQ+ID0gVCBleHRlbmRzIEFzeW5jR2VuZXJhdG9yPGluZmVyIEk+ID8gSSA6IG5ldmVyO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlU3RhcmdhdGVXb3JrZXI8R2VuZXJhdGVkIGV4dGVuZHMgeyByb3V0ZVNjaGVtYTogYW55OyByZWplY3RDb2RlOiBhbnkgfT4oc3RhcmdhdGVPcHRpb25zOiBNaWxraW9TdGFyZ2F0ZU9wdGlvbnMpIHtcbiAgICBjb25zdCBleGVjdXRlSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgY29ubmVjdCA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoZXZlbnQ6IHsgZGF0YTogYW55IH0pID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudC5kYXRhICE9PSBcIlBPTkdcIikgcmV0dXJuO1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7XG4gICAgICAgICAgICBzdGFyZ2F0ZU9wdGlvbnMucG9ydC5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgIH07XG4gICAgICAgIHN0YXJnYXRlT3B0aW9ucy5wb3J0LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGhhbmRsZXIpO1xuICAgICAgICBzdGFyZ2F0ZU9wdGlvbnMucG9ydC5wb3N0TWVzc2FnZShcIlBJTkdcIik7XG4gICAgICAgIGNvbnN0IHRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4gc3RhcmdhdGVPcHRpb25zLnBvcnQucG9zdE1lc3NhZ2UoXCJQSU5HXCIpLCA0Mik7XG4gICAgfSk7XG4gICAgY29uc3Qgc3RhcmdhdGUgPSB7XG4gICAgICAgIGNsb3NlKCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBleGVjdXRlSWQgb2YgZXhlY3V0ZUlkcykge1xuICAgICAgICAgICAgICAgIHN0YXJnYXRlT3B0aW9ucy5wb3J0LnBvc3RNZXNzYWdlKGBDTE9TRV9TVFJFQU06JHtleGVjdXRlSWR9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGFyZ2F0ZU9wdGlvbnMucG9ydC5wb3N0TWVzc2FnZShcIkNMT1NFRFwiKTtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgZXhlY3V0ZTxQYXRoIGV4dGVuZHMga2V5b2YgR2VuZXJhdGVkW1wicm91dGVTY2hlbWFcIl0+KFxuICAgICAgICAgICAgcGF0aDogUGF0aCxcbiAgICAgICAgICAgIG9wdGlvbnM6IE1peGluPFxuICAgICAgICAgICAgICAgIEV4ZWN1dGVPcHRpb25zLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zPzogR2VuZXJhdGVkW1wicm91dGVTY2hlbWFcIl1bUGF0aF1bXCJ0eXBlc1wiXVtcInBhcmFtc1wiXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA+LFxuICAgICAgICApOiBQcm9taXNlPFxuICAgICAgICAgICAgR2VuZXJhdGVkW1wicm91dGVTY2hlbWFcIl1bUGF0aF1bXCJ0eXBlc1wiXVtcIvCfpZtcIl0gZXh0ZW5kcyBib29sZWFuXG4gICAgICAgICAgICA/IC8vIGFjdGlvblxuICAgICAgICAgICAgW1BhcnRpYWw8R2VuZXJhdGVkW1wicmVqZWN0Q29kZVwiXT4sIG51bGwsIEV4ZWN1dGVSZXN1bHRzT3B0aW9uXSB8IFtudWxsLCBHZW5lcmF0ZWRbXCJyb3V0ZVNjaGVtYVwiXVtQYXRoXVtcInR5cGVzXCJdW1wicmVzdWx0XCJdLCBFeGVjdXRlUmVzdWx0c09wdGlvbl1cbiAgICAgICAgICAgIDogLy8gc3RyZWFtXG4gICAgICAgICAgICBbUGFydGlhbDxHZW5lcmF0ZWRbXCJyZWplY3RDb2RlXCJdPiwgbnVsbCwgRXhlY3V0ZVJlc3VsdHNPcHRpb25dIHwgW251bGwsIEFzeW5jR2VuZXJhdG9yPFtQYXJ0aWFsPEdlbmVyYXRlZFtcInJlamVjdENvZGVcIl0+LCBudWxsXSB8IFtudWxsLCBHZW5lcmF0b3JHZW5lcmljPEdlbmVyYXRlZFtcInJvdXRlU2NoZW1hXCJdW1BhdGhdW1widHlwZXNcIl1bXCJyZXN1bHRcIl0+XSwgdW5kZWZpbmVkPiwgRXhlY3V0ZVJlc3VsdHNPcHRpb25dXG4gICAgICAgID4ge1xuICAgICAgICAgICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3Q7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhlY3V0ZUlkID0gX19jcmVhdGVJZCgpO1xuICAgICAgICAgICAgICAgIGV4ZWN1dGVJZHMuYWRkKGV4ZWN1dGVJZCk7XG4gICAgICAgICAgICAgICAgaWYgKCEocGF0aCBhcyBzdHJpbmcpLmVuZHNXaXRoKFwiflwiKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKGV2ZW50OiB7IGRhdGE6IGFueSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGV2ZW50LmRhdGEgIT09IFwib2JqZWN0XCIpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5kYXRhLmV4ZWN1dGVJZCAhPT0gZXhlY3V0ZUlkKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlSWRzLmRlbGV0ZShleGVjdXRlSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcmdhdGVPcHRpb25zLnBvcnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV2ZW50LmRhdGEuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcltldmVudC5kYXRhLmVycm9yLmNvZGVdID0gZXZlbnQuZGF0YS5lcnJvci5yZWplY3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShbZXJyb3IsIG51bGwsIHsgZXhlY3V0ZUlkIH1dKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5kYXRhLnN1Y2Nlc3MpIHJlc29sdmUoW251bGwsIGV2ZW50LmRhdGEuZGF0YSwgeyBleGVjdXRlSWQgfV0gYXMgYW55KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgc3RhcmdhdGVPcHRpb25zLnBvcnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJnYXRlT3B0aW9ucy5wb3J0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IG9wdGlvbnM/LnBhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IG9wdGlvbnM/LmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmbG93OiBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVGbG93PiB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IChldmVudDogeyBkYXRhOiBhbnkgfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBldmVudC5kYXRhICE9PSBcIm9iamVjdFwiKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZGF0YS5leGVjdXRlSWQgIT09IGV4ZWN1dGVJZCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmbG93KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvdyA9IGNyZWF0ZUZsb3coc3RhcmdhdGVPcHRpb25zLCBleGVjdXRlSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXZlbnQuZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JbZXZlbnQuZGF0YS5lcnJvci5jb2RlXSA9IGV2ZW50LmRhdGEuZXJyb3IucmVqZWN0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKFtlcnJvciwgbnVsbCwgeyBleGVjdXRlSWQgfV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZGF0YS5zdWNjZXNzKSByZXNvbHZlKFtudWxsLCBmbG93LCB7IGV4ZWN1dGVJZCB9XSBhcyBhbnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZGF0YS5kb25lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJnYXRlT3B0aW9ucy5wb3J0LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlSWRzLmRlbGV0ZShleGVjdXRlSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZGF0YS5zdWNjZXNzKSBmbG93LnJldHVybih1bmRlZmluZWQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGZsb3cudGhyb3coZXZlbnQuZGF0YS5kYXRhPy5hdCgwKSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZXZlbnQuZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJnYXRlT3B0aW9ucy5wb3J0LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlSWRzLmRlbGV0ZShleGVjdXRlSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93LnRocm93KGV2ZW50LmRhdGEuZGF0YSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5kYXRhLnN1Y2Nlc3MpIGZsb3cuZW1pdChldmVudC5kYXRhLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBzdGFyZ2F0ZU9wdGlvbnMucG9ydC5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgc3RhcmdhdGVPcHRpb25zLnBvcnQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogb3B0aW9ucz8ucGFyYW1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogb3B0aW9ucz8uaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgICR0eXBlczogdW5kZWZpbmVkIGFzIHVua25vd24gYXMge1xuICAgICAgICAgICAgZ2VuZXJhdGVkOiBHZW5lcmF0ZWQsXG4gICAgICAgICAgICBlcnJvcjogR2VuZXJhdGVkW1wicmVqZWN0Q29kZVwiXTtcbiAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgIFtQYXRoIGluIGtleW9mIEdlbmVyYXRlZFtcInJvdXRlU2NoZW1hXCJdXTogR2VuZXJhdGVkW1wicm91dGVTY2hlbWFcIl1bUGF0aF1bXCJ0eXBlc1wiXVtcInBhcmFtc1wiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlc3VsdHM6IHtcbiAgICAgICAgICAgICAgICBbUGF0aCBpbiBrZXlvZiBHZW5lcmF0ZWRbXCJyb3V0ZVNjaGVtYVwiXV06IEdlbmVyYXRlZFtcInJvdXRlU2NoZW1hXCJdW1BhdGhdW1widHlwZXNcIl1bXCLwn6WbXCJdIGV4dGVuZHMgYm9vbGVhblxuICAgICAgICAgICAgICAgID8gLy8gYWN0aW9uXG4gICAgICAgICAgICAgICAgR2VuZXJhdGVkW1wicm91dGVTY2hlbWFcIl1bUGF0aF1bXCJ0eXBlc1wiXVtcInJlc3VsdFwiXVxuICAgICAgICAgICAgICAgIDogLy8gc3RyZWFtXG4gICAgICAgICAgICAgICAgQXN5bmNHZW5lcmF0b3I8W1BhcnRpYWw8R2VuZXJhdGVkW1wicmVqZWN0Q29kZVwiXT4sIG51bGxdIHwgW251bGwsIEdlbmVyYXRvckdlbmVyaWM8R2VuZXJhdGVkW1wicm91dGVTY2hlbWFcIl1bUGF0aF1bXCJ0eXBlc1wiXVtcInJlc3VsdFwiXT5dLCB1bmRlZmluZWQ+XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH07XG5cbiAgICByZXR1cm4gc3RhcmdhdGU7XG59XG5cbmV4cG9ydCB0eXBlIE1pbGtpb0Zsb3c8VCwgVFJldHVybiA9IGFueSwgVE5leHQgPSBhbnk+ID0ge1xuICAgIGVtaXQ6IChmbG93OiBUKSA9PiB2b2lkO1xuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IE1pbGtpb0Zsb3c8VD47XG4gICAgbmV4dCguLi5bdmFsdWVdOiBbXSB8IFtUTmV4dF0pOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQsIFRSZXR1cm4+PjtcbiAgICByZXR1cm4oZGF0YTogdW5kZWZpbmVkLCBkaXNhYmxlUG9zdENsb3NlTWVzc2FnZT86IHRydWUpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQsIFRSZXR1cm4+PjtcbiAgICB0aHJvdyhlcnJvcjogYW55LCBkaXNhYmxlUG9zdENsb3NlTWVzc2FnZT86IHRydWUpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQsIFRSZXR1cm4+Pjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGbG93PFQ+KHN0YXJnYXRlT3B0aW9uczogTWlsa2lvU3RhcmdhdGVPcHRpb25zLCBleGVjdXRlSWQ6IHN0cmluZyk6IE1pbGtpb0Zsb3c8VD4ge1xuICAgIGxldCBzdGF0dXM6IFwicGVuZGluZ1wiIHwgXCJyZXNvbHZlZFwiIHwgXCJyZWplY3RlZFwiID0gXCJwZW5kaW5nXCI7XG4gICAgY29uc3QgZmxvd3M6IEFycmF5PHtcbiAgICAgICAgYmxhbms6IGJvb2xlYW47XG4gICAgICAgIHByb21pc2U6IFByb21pc2U8VD47XG4gICAgICAgIHJlc29sdmU6ICh2YWx1ZT86IFQgfCBQcm9taXNlTGlrZTxUPikgPT4gdm9pZDtcbiAgICAgICAgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkO1xuICAgIH0+ID0gW107XG5cbiAgICBjb25zdCBpdGVyYXRvciA9IHtcbiAgICAgICAgZW1pdDogKGZsb3c6IFQpID0+IHtcbiAgICAgICAgICAgIGlmIChmbG93cy5hdCgtMSk/LmJsYW5rID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGZsb3dzLmF0KC0xKSE7XG4gICAgICAgICAgICAgICAgaXRlbS5ibGFuayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVzb2x2ZShmbG93KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVycyA9IHdpdGhSZXNvbHZlcnM8VD4oKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlcnMucmVzb2x2ZShmbG93KTtcbiAgICAgICAgICAgICAgICBmbG93cy5wdXNoKHsgLi4ucmVzb2x2ZXJzLCBibGFuazogZmFsc2UgfSBhcyBhbnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAuLi4oe1xuICAgICAgICAgICAgYXN5bmMgbmV4dCgpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQ+PiB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPT0gXCJwZW5kaW5nXCIpIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiBudWxsIH07XG4gICAgICAgICAgICAgICAgaWYgKGZsb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlcnMgPSB3aXRoUmVzb2x2ZXJzPFQ+KCk7XG4gICAgICAgICAgICAgICAgICAgIGZsb3dzLnB1c2goeyAuLi5yZXNvbHZlcnMsIGJsYW5rOiB0cnVlIH0gYXMgYW55KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZmxvdyA9IGZsb3dzLmF0KDApITtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmbG93LnByb21pc2U7XG4gICAgICAgICAgICAgICAgZmxvd3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBkb25lOiBzdGF0dXMgIT09IFwicGVuZGluZ1wiLCB2YWx1ZTogcmVzdWx0IH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXN5bmMgcmV0dXJuKF86IHVuZGVmaW5lZCwgZGlzYWJsZVBvc3RDbG9zZU1lc3NhZ2U/OiB0cnVlKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDx2b2lkPj4ge1xuICAgICAgICAgICAgICAgIHN0YXR1cyA9IFwicmVzb2x2ZWRcIjtcbiAgICAgICAgICAgICAgICBpZiAoIWRpc2FibGVQb3N0Q2xvc2VNZXNzYWdlKSBzdGFyZ2F0ZU9wdGlvbnMucG9ydC5wb3N0TWVzc2FnZShgQ0xPU0VfU1RSRUFNOiR7ZXhlY3V0ZUlkfWApO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZmxvdyBvZiBmbG93cykge1xuICAgICAgICAgICAgICAgICAgICBmbG93LmJsYW5rID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGZsb3cucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogbnVsbCB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFzeW5jIHRocm93KGVycjogYW55LCBkaXNhYmxlUG9zdENsb3NlTWVzc2FnZT86IHRydWUpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PHZvaWQ+PiB7XG4gICAgICAgICAgICAgICAgc3RhdHVzID0gXCJyZWplY3RlZFwiO1xuICAgICAgICAgICAgICAgIGlmICghZGlzYWJsZVBvc3RDbG9zZU1lc3NhZ2UpIHN0YXJnYXRlT3B0aW9ucy5wb3J0LnBvc3RNZXNzYWdlKGBDTE9TRV9TVFJFQU06JHtleGVjdXRlSWR9YCk7XG4gICAgICAgICAgICAgICAgaWYgKGZsb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlcnMgPSB3aXRoUmVzb2x2ZXJzPFQ+KCk7XG4gICAgICAgICAgICAgICAgICAgIGZsb3dzLnB1c2goeyAuLi5yZXNvbHZlcnMsIGJsYW5rOiB0cnVlIH0gYXMgYW55KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBmbG93IG9mIGZsb3dzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZsb3cuYmxhbmsgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgZmxvdy5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IG51bGwgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0gc2F0aXNmaWVzIEFzeW5jSXRlcmF0b3I8dW5rbm93bj4pLFxuICAgICAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG4gICAgfTtcblxuICAgIHJldHVybiBpdGVyYXRvciBhcyBNaWxraW9GbG93PFQ+O1xufVxuXG5mdW5jdGlvbiB3aXRoUmVzb2x2ZXJzPFQgPSBhbnk+KCk6IFByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+IHtcbiAgICBsZXQgcmVzb2x2ZTogUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD5bXCJyZXNvbHZlXCJdO1xuICAgIGxldCByZWplY3Q6IFByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+W1wicmVqZWN0XCJdO1xuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxUPigocmVzLCByZWopID0+IHtcbiAgICAgICAgcmVzb2x2ZSA9IHJlcztcbiAgICAgICAgcmVqZWN0ID0gcmVqO1xuICAgIH0pO1xuICAgIHJldHVybiB7IHByb21pc2UsIHJlc29sdmU6IHJlc29sdmUhLCByZWplY3Q6IHJlamVjdCEgfTtcbn1cbiIK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QUNuRDtBQUFBLFFBQ0EsTUFBTSxPQUFPLE1BQU0sR0FBRyxDQUFDO0FBQUEsUUFDdkIsTUFBTSxTQUFTLE1BQU0sS0FBSztBQUFBLFFBQzFCLE1BQU0sTUFBTTtBQUFBLFFBQ1osT0FBTyxFQUFFLE1BQU0sV0FBVyxXQUFXLE9BQU8sT0FBTztBQUFBO0FBQUEsV0FFakQsT0FBTSxDQUFDLEdBQWMseUJBQStEO0FBQUEsUUFDdEYsU0FBUztBQUFBLFFBQ1QsSUFBSSxDQUFDO0FBQUEsVUFBeUIsZ0JBQWdCLEtBQUssWUFBWSxnQkFBZ0IsV0FBVztBQUFBLFFBQzFGLFdBQVcsUUFBUSxPQUFPO0FBQUEsVUFDdEIsS0FBSyxRQUFRO0FBQUEsVUFDYixLQUFLLFFBQVEsU0FBUztBQUFBLFFBQzFCO0FBQUEsUUFDQSxPQUFPLEVBQUUsTUFBTSxNQUFNLE9BQU8sS0FBSztBQUFBO0FBQUEsV0FFL0IsTUFBSyxDQUFDLEtBQVUseUJBQStEO0FBQUEsUUFDakYsU0FBUztBQUFBLFFBQ1QsSUFBSSxDQUFDO0FBQUEsVUFBeUIsZ0JBQWdCLEtBQUssWUFBWSxnQkFBZ0IsV0FBVztBQUFBLFFBQzFGLElBQUksTUFBTSxXQUFXLEdBQUc7QUFBQSxVQUNwQixNQUFNLFlBQVksY0FBaUI7QUFBQSxVQUNuQyxNQUFNLEtBQUssS0FBSyxXQUFXLE9BQU8sS0FBSyxDQUFRO0FBQUEsUUFDbkQ7QUFBQSxRQUNBLFdBQVcsUUFBUSxPQUFPO0FBQUEsVUFDdEIsS0FBSyxRQUFRO0FBQUEsVUFDYixLQUFLLE9BQU8sR0FBRztBQUFBLFFBQ25CO0FBQUEsUUFDQSxPQUFPLEVBQUUsTUFBTSxNQUFNLE9BQU8sS0FBSztBQUFBO0FBQUEsSUFFekM7QUFBQSxLQUNDLE9BQU8sY0FBYyxHQUFHO0FBQUEsTUFDckIsT0FBTztBQUFBO0FBQUEsRUFFZjtBQUFBLEVBRUEsT0FBTztBQUFBO0FBR1gsU0FBUyxhQUFzQixHQUE0QjtBQUFBLEVBQ3ZELElBQUk7QUFBQSxFQUNKLElBQUk7QUFBQSxFQUNKLE1BQU0sVUFBVSxJQUFJLFFBQVcsQ0FBQyxLQUFLLFFBQVE7QUFBQSxJQUN6QyxVQUFVO0FBQUEsSUFDVixTQUFTO0FBQUEsR0FDWjtBQUFBLEVBQ0QsT0FBTyxFQUFFLFNBQVMsU0FBbUIsT0FBZ0I7QUFBQTsiLAogICJkZWJ1Z0lkIjogIjFCQzc5QjEyMTBFMjdFOTM2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
445
+ //# debugId=A0E5907D1372DBD864756E2164756E21
446
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vdXRpbHMvY3JlYXRlLWlkLnRzIiwgIi4uL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgInR5cGUgSWRHZW5lcmF0b3JPcHRpb25zID0ge1xuICBsZW5ndGg/OiBudW1iZXI7XG4gIHRpbWVzdGFtcDogYm9vbGVhbjtcbiAgc2VxdWVudGlhbDogYm9vbGVhbjtcbn07XG5cbmZ1bmN0aW9uIGRlZmluZUlkR2VuZXJhdG9yKG9wdGlvbnM6IElkR2VuZXJhdG9yT3B0aW9ucykge1xuICBpZiAoIW9wdGlvbnMubGVuZ3RoKSBvcHRpb25zLmxlbmd0aCA9IDI0O1xuICBpZiAob3B0aW9ucy5sZW5ndGggPCAxKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGxlbmd0aFwiKTtcbiAgaWYgKG9wdGlvbnMubGVuZ3RoID4gNjEpIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgbGVuZ3RoXCIpO1xuICBpZiAob3B0aW9ucy50aW1lc3RhbXAgJiYgb3B0aW9ucy5sZW5ndGggPCA5KSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGxlbmd0aFwiKTtcbiAgbGV0IGxhc3RUaW1lID0gMDtcbiAgbGV0IGxhc3REZWNpbWFsID0gMG47XG4gIHJldHVybiB7XG4gICAgY3JlYXRlSWQoKSB7XG4gICAgICBsZXQgcmFuZExlbmd0aCA9IG9wdGlvbnMubGVuZ3RoITtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBsZXQgaWQgPSBcIlwiO1xuICAgICAgaWYgKG9wdGlvbnMudGltZXN0YW1wKSB7XG4gICAgICAgIHJhbmRMZW5ndGggLT0gODtcbiAgICAgICAgaWQgPSBgJHtpZH0ke19fYmlnSW50VG9TdHJpbmcoQmlnSW50KG5vdykpLnBhZFN0YXJ0KDgsIFwiMFwiKX1gO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMuc2VxdWVudGlhbCAmJiBsYXN0VGltZSA9PT0gbm93KSB7XG4gICAgICAgIGlkID0gYCR7aWR9JHtfX2JpZ0ludFRvU3RyaW5nKCsrbGFzdERlY2ltYWwpLnBhZFN0YXJ0KDEsIFwiMFwiKX1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGFzdFRpbWUgPSBub3c7XG4gICAgICAgIGNvbnN0IG1pbiA9IDBuO1xuICAgICAgICBjb25zdCBtYXggPSBfX2dldE1heFZhbHVlKEJpZ0ludChyYW5kTGVuZ3RoKSk7XG4gICAgICAgIGxhc3REZWNpbWFsID0gX19zZWN1cmVSYW5kb21CaWdJbnQobWluLCBtYXgpO1xuICAgICAgICBpZCA9IGAke2lkfSR7X19iaWdJbnRUb1N0cmluZyhsYXN0RGVjaW1hbCkucGFkU3RhcnQocmFuZExlbmd0aCwgXCIwXCIpfWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gaWQ7XG4gICAgfSxcbiAgICBnZXRJZFRpbWVzdGFtcChpZDogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy50aW1lc3RhbXAgPyBOdW1iZXIoX19zdHJpbmdUb0JpZ0ludChpZC5zbGljZSgwLCA4KS5yZXBsYWNlQWxsKFwiMFwiLCBcIlwiKSkpIDogMDtcbiAgICB9LFxuICB9O1xufVxuXG5jb25zdCBFTkNPRElORyA9IFwiMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcIjtcblxuZnVuY3Rpb24gX19zZWN1cmVSYW5kb21CaWdJbnQobWluOiBiaWdpbnQsIG1heDogYmlnaW50KTogYmlnaW50IHtcbiAgaWYgKG1pbiA+PSBtYXgpIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcmFuZ2VcIik7XG5cbiAgY29uc3QgcmFuZ2UgPSBtYXggLSBtaW4gKyAxbjtcbiAgY29uc3QgYnl0ZUNvdW50ID0gTWF0aC5jZWlsKE51bWJlcihCaWdJbnQocmFuZ2UudG9TdHJpbmcoMikubGVuZ3RoKSkgLyA4KTtcbiAgY29uc3QgZW50cm9weUJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnl0ZUNvdW50KTtcblxuICBsZXQgcmFuZG9tVmFsdWU6IGJpZ2ludDtcbiAgZG8ge1xuICAgIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMoZW50cm9weUJ5dGVzKTtcbiAgICByYW5kb21WYWx1ZSA9XG4gICAgICBCaWdJbnQoXG4gICAgICAgIGAweCR7QXJyYXkuZnJvbShlbnRyb3B5Qnl0ZXMpXG4gICAgICAgICAgLm1hcCgoYikgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpKVxuICAgICAgICAgIC5qb2luKFwiXCIpfWAsXG4gICAgICApICUgcmFuZ2U7XG4gIH0gd2hpbGUgKHJhbmRvbVZhbHVlIDwgMG4pO1xuXG4gIHJldHVybiBtaW4gKyByYW5kb21WYWx1ZTtcbn1cblxuZnVuY3Rpb24gX19iaWdJbnRUb1N0cmluZyh2YWx1ZTogYmlnaW50KTogc3RyaW5nIHtcbiAgY29uc3QgYmFzZSA9IEJpZ0ludChFTkNPRElORy5sZW5ndGgpO1xuICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgbGV0IGN1cnJlbnQgPSB2YWx1ZTtcblxuICBpZiAoY3VycmVudCA9PT0gMG4pIHJldHVybiBFTkNPRElOR1swXTtcblxuICB3aGlsZSAoY3VycmVudCA+IDBuKSB7XG4gICAgY29uc3QgcmVtYWluZGVyID0gY3VycmVudCAlIGJhc2U7XG4gICAgcmVzdWx0ID0gRU5DT0RJTkdbTnVtYmVyKHJlbWFpbmRlcildICsgcmVzdWx0O1xuICAgIGN1cnJlbnQgPSBjdXJyZW50IC8gYmFzZTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBfX3N0cmluZ1RvQmlnSW50KHN0cjogc3RyaW5nKTogYmlnaW50IHtcbiAgY29uc3QgY2hhck1hcDogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IEVOQ09ESU5HLmxlbmd0aDsgaSsrKSB7XG4gICAgY2hhck1hcFtFTkNPRElOR1tpXV0gPSBpO1xuICB9XG5cbiAgY29uc3QgYmFzZSA9IEJpZ0ludChFTkNPRElORy5sZW5ndGgpO1xuICBsZXQgcmVzdWx0ID0gMG47XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjaGFyID0gc3RyW2ldO1xuICAgIGlmICghKGNoYXIgaW4gY2hhck1hcCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjaGFyYWN0ZXIgJyR7Y2hhcn0nIGluIGlucHV0IHN0cmluZ2ApO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IEJpZ0ludChjaGFyTWFwW2NoYXJdKTtcbiAgICByZXN1bHQgPSByZXN1bHQgKiBiYXNlICsgdmFsdWU7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBfX2dldE1heFZhbHVlKG46IGJpZ2ludCk6IGJpZ2ludCB7XG4gIHJldHVybiBCaWdJbnQoRU5DT0RJTkcubGVuZ3RoKSAqKiBuIC0gMW47XG59XG5cbmNvbnN0IGlkR2VuZXJhdG9yID0gZGVmaW5lSWRHZW5lcmF0b3IoeyBsZW5ndGg6IDI0LCB0aW1lc3RhbXA6IGZhbHNlLCBzZXF1ZW50aWFsOiBmYWxzZSB9KTtcblxuZXhwb3J0IGNvbnN0IF9fY3JlYXRlSWQgPSBpZEdlbmVyYXRvci5jcmVhdGVJZDtcbiIsCiAgICAiaW1wb3J0IHsgX19jcmVhdGVJZCB9IGZyb20gXCIuL3V0aWxzL2NyZWF0ZS1pZC50c1wiO1xuXG5leHBvcnQgdHlwZSBNaWxraW9TdGFyZ2F0ZU9wdGlvbnMgPSB7XG4gICAgcG9ydDoge1xuICAgICAgICBwb3N0TWVzc2FnZTogKGRhdGE6IGFueSkgPT4gdm9pZDtcbiAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcjogKGV2ZW50OiBcIm1lc3NhZ2VcIiwgY2FsbGJhY2s6IChldmVudDogeyBkYXRhOiBhbnkgfSkgPT4gdm9pZCkgPT4gdm9pZDtcbiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcjogKGV2ZW50OiBcIm1lc3NhZ2VcIiwgY2FsbGJhY2s6IChldmVudDogeyBkYXRhOiBhbnkgfSkgPT4gdm9pZCkgPT4gdm9pZDtcbiAgICB9O1xuICAgIGNhY2hlU3RvcmFnZT86IENhY2hlU3RvcmFnZTtcbiAgICBjYWNoZUVuY3J5cHRpb24/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgTWl4aW48VCwgVT4gPSBVICYgT21pdDxULCBrZXlvZiBVPjtcblxuZXhwb3J0IHR5cGUgQ2FjaGVTdHJhdGVneSA9ICdvZmYnIHwgJ2ZhbGxiYWNrJyB8ICd0aHJvdHRsZSc7XG5cbmV4cG9ydCB0eXBlIFJldHJ5U3RyYXRlZ3kgPSBib29sZWFuIHwgbnVtYmVyO1xuXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlU3RvcmFnZSB7XG4gICAgZ2V0OiAoa2V5OiBzdHJpbmcpID0+IFByb21pc2U8eyBkYXRhOiBhbnk7IHRpbWVzdGFtcDogbnVtYmVyIH0gfCBudWxsPjtcbiAgICBzZXQ6IChrZXk6IHN0cmluZywgZGF0YTogYW55KSA9PiBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgdHlwZSBFeGVjdXRlT3B0aW9uczxUIGV4dGVuZHMgYW55ID0gYW55PiA9IHtcbiAgICBwYXJhbXM/OiBSZWNvcmQ8YW55LCBhbnk+O1xuICAgIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIGNhY2hlU3RyYXRlZ3k/OiBDYWNoZVN0cmF0ZWd5O1xuICAgIGNhY2hlVGhyb3R0bGVNcz86IG51bWJlcjtcbiAgICBvbkNhY2hlSGl0PzogKHJlc3VsdDogVCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gICAgcmV0cnlTdHJhdGVneT86IFJldHJ5U3RyYXRlZ3k7XG59O1xuXG5leHBvcnQgdHlwZSBFeGVjdXRlUmVzdWx0c09wdGlvbiA9IHsgZXhlY3V0ZUlkOiBzdHJpbmcgfTtcblxuZXhwb3J0IHR5cGUgR2VuZXJhdG9yR2VuZXJpYzxUPiA9IFQgZXh0ZW5kcyBBc3luY0dlbmVyYXRvcjxpbmZlciBJPiA/IEkgOiBuZXZlcjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVN0YXJnYXRlV29ya2VyPEdlbmVyYXRlZCBleHRlbmRzIHsgcm91dGVTY2hlbWE6IGFueTsgcmVqZWN0Q29kZTogYW55IH0+KHN0YXJnYXRlT3B0aW9uczogTWlsa2lvU3RhcmdhdGVPcHRpb25zKSB7XG4gICAgY29uc3QgZXhlY3V0ZUlkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IGNvbm5lY3QgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gKGV2ZW50OiB7IGRhdGE6IGFueSB9KSA9PiB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuZGF0YSAhPT0gXCJQT05HXCIpIHJldHVybjtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpO1xuICAgICAgICAgICAgc3RhcmdhdGVPcHRpb25zLnBvcnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgaGFuZGxlcik7XG4gICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICB9O1xuICAgICAgICBzdGFyZ2F0ZU9wdGlvbnMucG9ydC5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBoYW5kbGVyKTtcbiAgICAgICAgc3RhcmdhdGVPcHRpb25zLnBvcnQucG9zdE1lc3NhZ2UoXCJQSU5HXCIpO1xuICAgICAgICBjb25zdCB0aW1lciA9IHNldEludGVydmFsKCgpID0+IHN0YXJnYXRlT3B0aW9ucy5wb3J0LnBvc3RNZXNzYWdlKFwiUElOR1wiKSwgNDIpO1xuICAgIH0pO1xuICAgIGNvbnN0IHN0YXJnYXRlID0ge1xuICAgICAgICBjbG9zZSgpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZXhlY3V0ZUlkIG9mIGV4ZWN1dGVJZHMpIHtcbiAgICAgICAgICAgICAgICBzdGFyZ2F0ZU9wdGlvbnMucG9ydC5wb3N0TWVzc2FnZShgQ0xPU0VfU1RSRUFNOiR7ZXhlY3V0ZUlkfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RhcmdhdGVPcHRpb25zLnBvcnQucG9zdE1lc3NhZ2UoXCJDTE9TRURcIik7XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIGV4ZWN1dGU8UGF0aCBleHRlbmRzIGtleW9mIEdlbmVyYXRlZFtcInJvdXRlU2NoZW1hXCJdPihcbiAgICAgICAgICAgIHBhdGg6IFBhdGgsXG4gICAgICAgICAgICBvcHRpb25zOiBNaXhpbjxcbiAgICAgICAgICAgICAgICBFeGVjdXRlT3B0aW9uczxHZW5lcmF0ZWRbXCJyb3V0ZVNjaGVtYVwiXVtQYXRoXVtcInR5cGVzXCJdW1wicmVzdWx0XCJdPixcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcz86IEdlbmVyYXRlZFtcInJvdXRlU2NoZW1hXCJdW1BhdGhdW1widHlwZXNcIl1bXCJwYXJhbXNcIl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPixcbiAgICAgICAgKTogUHJvbWlzZTxcbiAgICAgICAgICAgIEdlbmVyYXRlZFtcInJvdXRlU2NoZW1hXCJdW1BhdGhdW1widHlwZXNcIl1bXCLwn6WbXCJdIGV4dGVuZHMgYm9vbGVhblxuICAgICAgICAgICAgPyAvLyBhY3Rpb25cbiAgICAgICAgICAgIFtQYXJ0aWFsPEdlbmVyYXRlZFtcInJlamVjdENvZGVcIl0+LCBudWxsLCBFeGVjdXRlUmVzdWx0c09wdGlvbl0gfCBbbnVsbCwgR2VuZXJhdGVkW1wicm91dGVTY2hlbWFcIl1bUGF0aF1bXCJ0eXBlc1wiXVtcInJlc3VsdFwiXSwgRXhlY3V0ZVJlc3VsdHNPcHRpb25dXG4gICAgICAgICAgICA6IC8vIHN0cmVhbVxuICAgICAgICAgICAgW1BhcnRpYWw8R2VuZXJhdGVkW1wicmVqZWN0Q29kZVwiXT4sIG51bGwsIEV4ZWN1dGVSZXN1bHRzT3B0aW9uXSB8IFtudWxsLCBBc3luY0dlbmVyYXRvcjxbUGFydGlhbDxHZW5lcmF0ZWRbXCJyZWplY3RDb2RlXCJdPiwgbnVsbF0gfCBbbnVsbCwgR2VuZXJhdG9yR2VuZXJpYzxHZW5lcmF0ZWRbXCJyb3V0ZVNjaGVtYVwiXVtQYXRoXVtcInR5cGVzXCJdW1wicmVzdWx0XCJdPl0sIHVuZGVmaW5lZD4sIEV4ZWN1dGVSZXN1bHRzT3B0aW9uXVxuICAgICAgICA+IHtcbiAgICAgICAgICAgIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBjb25uZWN0O1xuXG4gICAgICAgICAgICAgICAgaWYgKCEocGF0aCBhcyBzdHJpbmcpLmVuZHNXaXRoKFwiflwiKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBhY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FjaGVTdHJhdGVneSA9IG9wdGlvbnM/LmNhY2hlU3RyYXRlZ3kgPz8gJ29mZic7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXRyeUNvdW50ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnM/LnJldHJ5U3RyYXRlZ3kgPT09IHRydWUgfHwgb3B0aW9ucz8ucmV0cnlTdHJhdGVneSA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0cnlDb3VudCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnM/LnJldHJ5U3RyYXRlZ3kgPT09ICdudW1iZXInICYmIG9wdGlvbnM/LnJldHJ5U3RyYXRlZ3kgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRyeUNvdW50ID0gb3B0aW9ucz8ucmV0cnlTdHJhdGVneTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWNoZVRocm90dGxlTXMgPSBvcHRpb25zPy5jYWNoZVRocm90dGxlTXMgPz8gMDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBnZW5lcmF0ZUNhY2hlS2V5KHBhdGggYXMgc3RyaW5nLCBvcHRpb25zPy5wYXJhbXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBjYWNoZVN0b3JhZ2UgPSBzdGFyZ2F0ZU9wdGlvbnMuY2FjaGVTdG9yYWdlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVTdHJhdGVneSAhPT0gJ29mZicgJiYgIWNhY2hlU3RvcmFnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVTdG9yYWdlID0gYXdhaXQgY3JlYXRlRGVmYXVsdENhY2hlU3RvcmFnZSh7IGVuY3J5cHRpb246IHN0YXJnYXRlT3B0aW9ucy5jYWNoZUVuY3J5cHRpb24gfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVTdHJhdGVneSAhPT0gJ29mZicgJiYgY2FjaGVTdG9yYWdlICYmIG9wdGlvbnM/Lm9uQ2FjaGVIaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhY2hlZCA9IGF3YWl0IGNhY2hlU3RvcmFnZS5nZXQoY2FjaGVLZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IG9wdGlvbnMub25DYWNoZUhpdChjYWNoZWQuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBvbkNhY2hlSGl0IGVycm9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZVN0cmF0ZWd5ID09PSAndGhyb3R0bGUnICYmIGNhY2hlU3RvcmFnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FjaGVkID0gYXdhaXQgY2FjaGVTdG9yYWdlLmdldChjYWNoZUtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkICYmIERhdGUubm93KCkgLSBjYWNoZWQudGltZXN0YW1wIDwgY2FjaGVUaHJvdHRsZU1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoW251bGwsIGNhY2hlZC5kYXRhLCB7IGV4ZWN1dGVJZDogJ2NhY2hlZCcgfV0gYXMgYW55KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVSZXF1ZXN0ID0gKCk6IFByb21pc2U8W2FueSwgYW55LCBFeGVjdXRlUmVzdWx0c09wdGlvbl0+ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVxUmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcUV4ZWN1dGVJZCA9IF9fY3JlYXRlSWQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlSWRzLmFkZChyZXFFeGVjdXRlSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoZXZlbnQ6IHsgZGF0YTogYW55IH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBldmVudC5kYXRhICE9PSBcIm9iamVjdFwiKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5kYXRhLmV4ZWN1dGVJZCAhPT0gcmVxRXhlY3V0ZUlkKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVJZHMuZGVsZXRlKHJlcUV4ZWN1dGVJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJnYXRlT3B0aW9ucy5wb3J0LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV2ZW50LmRhdGEuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3I6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JbZXZlbnQuZGF0YS5lcnJvci5jb2RlXSA9IGV2ZW50LmRhdGEuZXJyb3IucmVqZWN0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxUmVzb2x2ZShbZXJyb3IsIG51bGwsIHsgZXhlY3V0ZUlkOiByZXFFeGVjdXRlSWQgfV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxUmVzb2x2ZShbbnVsbCwgZXZlbnQuZGF0YS5kYXRhLCB7IGV4ZWN1dGVJZDogcmVxRXhlY3V0ZUlkIH1dKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcmdhdGVPcHRpb25zLnBvcnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcmdhdGVPcHRpb25zLnBvcnQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlSWQ6IHJlcUV4ZWN1dGVJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiBvcHRpb25zPy5wYXJhbXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IG9wdGlvbnM/LmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgW2Vycm9yLCByZXN1bHQsIHJlc3VsdE9wdGlvbl0gPSBhd2FpdCBleGVjdXRlUmVxdWVzdCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJldHJ5SW5kZXggPSAwOyByZXRyeUluZGV4IDwgcmV0cnlDb3VudCAmJiBlcnJvcjsgcmV0cnlJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0cnlJbmRleCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCA1MDApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFtlcnJvciwgcmVzdWx0LCByZXN1bHRPcHRpb25dID0gYXdhaXQgZXhlY3V0ZVJlcXVlc3QoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlU3RyYXRlZ3kgIT09ICdvZmYnICYmIGNhY2hlU3RvcmFnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhY2hlZCA9IGF3YWl0IGNhY2hlU3RvcmFnZS5nZXQoY2FjaGVLZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoW251bGwsIGNhY2hlZC5kYXRhLCB7IGV4ZWN1dGVJZDogJ2NhY2hlZCcgfV0gYXMgYW55KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShbZXJyb3IsIG51bGwsIHJlc3VsdE9wdGlvbl0pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlU3RyYXRlZ3kgIT09ICdvZmYnICYmIGNhY2hlU3RvcmFnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2FjaGVTdG9yYWdlLnNldChjYWNoZUtleSwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoW251bGwsIHJlc3VsdCwgcmVzdWx0T3B0aW9uXSBhcyBhbnkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHN0cmVhbVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBleGVjdXRlSWQgPSBfX2NyZWF0ZUlkKCk7XG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVJZHMuYWRkKGV4ZWN1dGVJZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGZsb3c6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUZsb3c+IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKGV2ZW50OiB7IGRhdGE6IGFueSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGV2ZW50LmRhdGEgIT09IFwib2JqZWN0XCIpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5kYXRhLmV4ZWN1dGVJZCAhPT0gZXhlY3V0ZUlkKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZsb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93ID0gY3JlYXRlRmxvdyhzdGFyZ2F0ZU9wdGlvbnMsIGV4ZWN1dGVJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFldmVudC5kYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3I6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcltldmVudC5kYXRhLmVycm9yLmNvZGVdID0gZXZlbnQuZGF0YS5lcnJvci5yZWplY3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoW2Vycm9yLCBudWxsLCB7IGV4ZWN1dGVJZCB9XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5kYXRhLnN1Y2Nlc3MpIHJlc29sdmUoW251bGwsIGZsb3csIHsgZXhlY3V0ZUlkIH1dIGFzIGFueSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5kYXRhLmRvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcmdhdGVPcHRpb25zLnBvcnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVJZHMuZGVsZXRlKGV4ZWN1dGVJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5kYXRhLnN1Y2Nlc3MpIGZsb3cucmV0dXJuKHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgZmxvdy50aHJvdyhldmVudC5kYXRhLmRhdGE/LmF0KDApLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFldmVudC5kYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcmdhdGVPcHRpb25zLnBvcnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVJZHMuZGVsZXRlKGV4ZWN1dGVJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3cudGhyb3coZXZlbnQuZGF0YS5kYXRhLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmRhdGEuc3VjY2VzcykgZmxvdy5lbWl0KGV2ZW50LmRhdGEuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHN0YXJnYXRlT3B0aW9ucy5wb3J0LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgICAgICBzdGFyZ2F0ZU9wdGlvbnMucG9ydC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiBvcHRpb25zPy5wYXJhbXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBvcHRpb25zPy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgJHR5cGVzOiB1bmRlZmluZWQgYXMgdW5rbm93biBhcyB7XG4gICAgICAgICAgICBnZW5lcmF0ZWQ6IEdlbmVyYXRlZCxcbiAgICAgICAgICAgIGVycm9yOiBHZW5lcmF0ZWRbXCJyZWplY3RDb2RlXCJdO1xuICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgW1BhdGggaW4ga2V5b2YgR2VuZXJhdGVkW1wicm91dGVTY2hlbWFcIl1dOiBHZW5lcmF0ZWRbXCJyb3V0ZVNjaGVtYVwiXVtQYXRoXVtcInR5cGVzXCJdW1wicGFyYW1zXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVzdWx0czoge1xuICAgICAgICAgICAgICAgIFtQYXRoIGluIGtleW9mIEdlbmVyYXRlZFtcInJvdXRlU2NoZW1hXCJdXTogR2VuZXJhdGVkW1wicm91dGVTY2hlbWFcIl1bUGF0aF1bXCJ0eXBlc1wiXVtcIvCfpZtcIl0gZXh0ZW5kcyBib29sZWFuXG4gICAgICAgICAgICAgICAgPyAvLyBhY3Rpb25cbiAgICAgICAgICAgICAgICBHZW5lcmF0ZWRbXCJyb3V0ZVNjaGVtYVwiXVtQYXRoXVtcInR5cGVzXCJdW1wicmVzdWx0XCJdXG4gICAgICAgICAgICAgICAgOiAvLyBzdHJlYW1cbiAgICAgICAgICAgICAgICBBc3luY0dlbmVyYXRvcjxbUGFydGlhbDxHZW5lcmF0ZWRbXCJyZWplY3RDb2RlXCJdPiwgbnVsbF0gfCBbbnVsbCwgR2VuZXJhdG9yR2VuZXJpYzxHZW5lcmF0ZWRbXCJyb3V0ZVNjaGVtYVwiXVtQYXRoXVtcInR5cGVzXCJdW1wicmVzdWx0XCJdPl0sIHVuZGVmaW5lZD5cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfTtcblxuICAgIHJldHVybiBzdGFyZ2F0ZTtcbn1cblxuZXhwb3J0IHR5cGUgTWlsa2lvRmxvdzxULCBUUmV0dXJuID0gYW55LCBUTmV4dCA9IGFueT4gPSB7XG4gICAgZW1pdDogKGZsb3c6IFQpID0+IHZvaWQ7XG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4gTWlsa2lvRmxvdzxUPjtcbiAgICBuZXh0KC4uLlt2YWx1ZV06IFtdIHwgW1ROZXh0XSk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VCwgVFJldHVybj4+O1xuICAgIHJldHVybihkYXRhOiB1bmRlZmluZWQsIGRpc2FibGVQb3N0Q2xvc2VNZXNzYWdlPzogdHJ1ZSk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VCwgVFJldHVybj4+O1xuICAgIHRocm93KGVycm9yOiBhbnksIGRpc2FibGVQb3N0Q2xvc2VNZXNzYWdlPzogdHJ1ZSk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VCwgVFJldHVybj4+O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZsb3c8VD4oc3RhcmdhdGVPcHRpb25zOiBNaWxraW9TdGFyZ2F0ZU9wdGlvbnMsIGV4ZWN1dGVJZDogc3RyaW5nKTogTWlsa2lvRmxvdzxUPiB7XG4gICAgbGV0IHN0YXR1czogXCJwZW5kaW5nXCIgfCBcInJlc29sdmVkXCIgfCBcInJlamVjdGVkXCIgPSBcInBlbmRpbmdcIjtcbiAgICBjb25zdCBmbG93czogQXJyYXk8e1xuICAgICAgICBibGFuazogYm9vbGVhbjtcbiAgICAgICAgcHJvbWlzZTogUHJvbWlzZTxUPjtcbiAgICAgICAgcmVzb2x2ZTogKHZhbHVlPzogVCB8IFByb21pc2VMaWtlPFQ+KSA9PiB2b2lkO1xuICAgICAgICByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQ7XG4gICAgfT4gPSBbXTtcblxuICAgIGNvbnN0IGl0ZXJhdG9yID0ge1xuICAgICAgICBlbWl0OiAoZmxvdzogVCkgPT4ge1xuICAgICAgICAgICAgaWYgKGZsb3dzLmF0KC0xKT8uYmxhbmsgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gZmxvd3MuYXQoLTEpITtcbiAgICAgICAgICAgICAgICBpdGVtLmJsYW5rID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaXRlbS5yZXNvbHZlKGZsb3cpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZXJzID0gd2l0aFJlc29sdmVyczxUPigpO1xuICAgICAgICAgICAgICAgIHJlc29sdmVycy5yZXNvbHZlKGZsb3cpO1xuICAgICAgICAgICAgICAgIGZsb3dzLnB1c2goeyAuLi5yZXNvbHZlcnMsIGJsYW5rOiBmYWxzZSB9IGFzIGFueSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIC4uLih7XG4gICAgICAgICAgICBhc3luYyBuZXh0KCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VD4+IHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9PSBcInBlbmRpbmdcIikgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IG51bGwgfTtcbiAgICAgICAgICAgICAgICBpZiAoZmxvd3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVycyA9IHdpdGhSZXNvbHZlcnM8VD4oKTtcbiAgICAgICAgICAgICAgICAgICAgZmxvd3MucHVzaCh7IC4uLnJlc29sdmVycywgYmxhbms6IHRydWUgfSBhcyBhbnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBmbG93ID0gZmxvd3MuYXQoMCkhO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZsb3cucHJvbWlzZTtcbiAgICAgICAgICAgICAgICBmbG93cy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IHN0YXR1cyAhPT0gXCJwZW5kaW5nXCIsIHZhbHVlOiByZXN1bHQgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhc3luYyByZXR1cm4oXzogdW5kZWZpbmVkLCBkaXNhYmxlUG9zdENsb3NlTWVzc2FnZT86IHRydWUpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PHZvaWQ+PiB7XG4gICAgICAgICAgICAgICAgc3RhdHVzID0gXCJyZXNvbHZlZFwiO1xuICAgICAgICAgICAgICAgIGlmICghZGlzYWJsZVBvc3RDbG9zZU1lc3NhZ2UpIHN0YXJnYXRlT3B0aW9ucy5wb3J0LnBvc3RNZXNzYWdlKGBDTE9TRV9TVFJFQU06JHtleGVjdXRlSWR9YCk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBmbG93IG9mIGZsb3dzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZsb3cuYmxhbmsgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgZmxvdy5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiBudWxsIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXN5bmMgdGhyb3coZXJyOiBhbnksIGRpc2FibGVQb3N0Q2xvc2VNZXNzYWdlPzogdHJ1ZSk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8dm9pZD4+IHtcbiAgICAgICAgICAgICAgICBzdGF0dXMgPSBcInJlamVjdGVkXCI7XG4gICAgICAgICAgICAgICAgaWYgKCFkaXNhYmxlUG9zdENsb3NlTWVzc2FnZSkgc3RhcmdhdGVPcHRpb25zLnBvcnQucG9zdE1lc3NhZ2UoYENMT1NFX1NUUkVBTToke2V4ZWN1dGVJZH1gKTtcbiAgICAgICAgICAgICAgICBpZiAoZmxvd3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVycyA9IHdpdGhSZXNvbHZlcnM8VD4oKTtcbiAgICAgICAgICAgICAgICAgICAgZmxvd3MucHVzaCh7IC4uLnJlc29sdmVycywgYmxhbms6IHRydWUgfSBhcyBhbnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZsb3cgb2YgZmxvd3MpIHtcbiAgICAgICAgICAgICAgICAgICAgZmxvdy5ibGFuayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBmbG93LnJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogbnVsbCB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSBzYXRpc2ZpZXMgQXN5bmNJdGVyYXRvcjx1bmtub3duPiksXG4gICAgICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGl0ZXJhdG9yIGFzIE1pbGtpb0Zsb3c8VD47XG59XG5cbmZ1bmN0aW9uIHdpdGhSZXNvbHZlcnM8VCA9IGFueT4oKTogUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4ge1xuICAgIGxldCByZXNvbHZlOiBQcm9taXNlV2l0aFJlc29sdmVyczxUPltcInJlc29sdmVcIl07XG4gICAgbGV0IHJlamVjdDogUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD5bXCJyZWplY3RcIl07XG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlPFQ+KChyZXMsIHJlaikgPT4ge1xuICAgICAgICByZXNvbHZlID0gcmVzO1xuICAgICAgICByZWplY3QgPSByZWo7XG4gICAgfSk7XG4gICAgcmV0dXJuIHsgcHJvbWlzZSwgcmVzb2x2ZTogcmVzb2x2ZSEsIHJlamVjdDogcmVqZWN0ISB9O1xufVxuXG5jb25zdCBpc29EYXRlUGF0dGVybiA9IC9eKFxcZHs0fS1cXGR7Mn0tXFxkezJ9VFxcZHsyfTpcXGR7Mn06XFxkezJ9KD86XFwuXFxkezEsM30pPykoWnxbKy1dXFxkezJ9Oj9cXGR7Mn0pPyQvO1xuXG5leHBvcnQgZnVuY3Rpb24gcmV2aXZlSlNPTlBhcnNlPFQ+KGpzb246IFQpOiBUIHtcbiAgICBpZiAoanNvbiAhPT0gbnVsbCAmJiB0eXBlb2YganNvbiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKGpzb24gaW5zdGFuY2VvZiBEYXRlIHx8ICh0eXBlb2YgKGpzb24gYXMgYW55KS5nZXRUaW1lID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiAoanNvbiBhcyBhbnkpLnRvSVNPU3RyaW5nID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgICAgICAgcmV0dXJuIGpzb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoanNvbikpIHtcbiAgICAgICAgICAgIHJldHVybiBqc29uLm1hcCgoaXRlbSkgPT4gcmV2aXZlSlNPTlBhcnNlKGl0ZW0pKSBhcyBhbnk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGpzb24pLnJlZHVjZSgoYWNjLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgIGFjY1trZXkgYXMga2V5b2YgVF0gPSByZXZpdmVKU09OUGFyc2UodmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwge30gYXMgVCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YganNvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBqc29uLm1hdGNoKGlzb0RhdGVQYXR0ZXJuKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICBjb25zdCBub3JtYWxpemVkRGF0ZVN0cmluZyA9IG1hdGNoWzJdID8gYCR7bWF0Y2hbMV19JHttYXRjaFsyXS5yZXBsYWNlKCc6JywgJycpfWAgOiBgJHttYXRjaFsxXX1aYDtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShub3JtYWxpemVkRGF0ZVN0cmluZykgYXMgYW55O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBqc29uO1xufVxuXG5jb25zdCBEQl9OQU1FID0gJ1N0YXJnYXRlV29ya2VyJztcbmNvbnN0IFNUT1JFX05BTUUgPSAnY2FjaGVzJztcbmxldCBkYkluc3RhbmNlOiBJREJEYXRhYmFzZSB8IG51bGwgPSBudWxsO1xuXG5hc3luYyBmdW5jdGlvbiBvcGVuREIoKTogUHJvbWlzZTxJREJEYXRhYmFzZT4ge1xuICAgIGlmIChkYkluc3RhbmNlKSByZXR1cm4gZGJJbnN0YW5jZTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIub3BlbihEQl9OQU1FLCAxKTtcbiAgICAgICAgcmVxdWVzdC5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHJlcXVlc3QuZXJyb3IpO1xuICAgICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgIGRiSW5zdGFuY2UgPSByZXF1ZXN0LnJlc3VsdDtcbiAgICAgICAgICAgIHJlc29sdmUoZGJJbnN0YW5jZSk7XG4gICAgICAgIH07XG4gICAgICAgIHJlcXVlc3Qub251cGdyYWRlbmVlZGVkID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYiA9IChldmVudC50YXJnZXQgYXMgSURCT3BlbkRCUmVxdWVzdCkucmVzdWx0O1xuICAgICAgICAgICAgaWYgKCFkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKFNUT1JFX05BTUUpKSB7XG4gICAgICAgICAgICAgICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUoU1RPUkVfTkFNRSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0Q2FjaGVTdG9yYWdlKG9wdGlvbnM/OiB7IGVuY3J5cHRpb24/OiBib29sZWFuOyBlbmNyeXB0aW9uS2V5Pzogc3RyaW5nIH0pOiBQcm9taXNlPENhY2hlU3RvcmFnZT4ge1xuICAgIGF3YWl0IG9wZW5EQigpO1xuXG4gICAgbGV0IGVuY3J5cHRpb25LZXk6IENyeXB0b0tleSB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IGNvdW50ZXIgPSBuZXcgVWludDhBcnJheSgxNik7XG5cbiAgICBpZiAob3B0aW9ucz8uZW5jcnlwdGlvbikge1xuICAgICAgICBjb25zdCBrZXlTdHJpbmcgPSBvcHRpb25zLmVuY3J5cHRpb25LZXkgPz8gREJfTkFNRTtcbiAgICAgICAgbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGtleVN0cmluZykuZm9yRWFjaCgoYnl0ZSwgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKGkgPCAxNikgY291bnRlcltpXSA9IGJ5dGU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgICAgICAgY29uc3Qga2V5RGF0YSA9IGVuY29kZXIuZW5jb2RlKGtleVN0cmluZyk7XG4gICAgICAgIGNvbnN0IGltcG9ydGVkS2V5ID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoJ3JhdycsIGtleURhdGEsIHsgbmFtZTogJ1BCS0RGMicgfSwgZmFsc2UsIFsnZGVyaXZlS2V5J10pO1xuXG4gICAgICAgIGVuY3J5cHRpb25LZXkgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmRlcml2ZUtleShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnUEJLREYyJyxcbiAgICAgICAgICAgICAgICBzYWx0OiBlbmNvZGVyLmVuY29kZSgnbWlsa2lvLXN0YXJnYXRlLXdvcmtlci1jYWNoZScpLFxuICAgICAgICAgICAgICAgIGl0ZXJhdGlvbnM6IDEwMDAwMCxcbiAgICAgICAgICAgICAgICBoYXNoOiAnU0hBLTI1NicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW1wb3J0ZWRLZXksXG4gICAgICAgICAgICB7IG5hbWU6ICdBRVMtQ1RSJywgbGVuZ3RoOiAyNTYgfSxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWydlbmNyeXB0JywgJ2RlY3J5cHQnXSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbmNyeXB0RGF0YSA9IGFzeW5jIChkYXRhOiBhbnkpOiBQcm9taXNlPFVpbnQ4QXJyYXk+ID0+IHtcbiAgICAgICAgaWYgKCFlbmNyeXB0aW9uS2V5KSByZXR1cm4gZGF0YTtcblxuICAgICAgICBjb25zdCBqc29uU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgICAgICAgY29uc3QgZGF0YUJ5dGVzID0gZW5jb2Rlci5lbmNvZGUoanNvblN0cmluZyk7XG5cbiAgICAgICAgY29uc3QgZW5jcnlwdGVkQXJyYXlCdWZmZXIgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmVuY3J5cHQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0FFUy1DVFInLFxuICAgICAgICAgICAgICAgIGNvdW50ZXI6IGNvdW50ZXIsXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiA2NCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uS2V5ISxcbiAgICAgICAgICAgIGRhdGFCeXRlcyxcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZW5jcnlwdGVkQXJyYXlCdWZmZXIpO1xuICAgIH07XG5cbiAgICBjb25zdCBkZWNyeXB0RGF0YSA9IGFzeW5jIChlbmNyeXB0ZWREYXRhOiBBcnJheUJ1ZmZlciB8IFVpbnQ4QXJyYXkpOiBQcm9taXNlPGFueT4gPT4ge1xuICAgICAgICBpZiAoIWVuY3J5cHRpb25LZXkgfHwgIWVuY3J5cHRlZERhdGEpIHJldHVybiBlbmNyeXB0ZWREYXRhO1xuXG4gICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gZW5jcnlwdGVkRGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgPyAoZW5jcnlwdGVkRGF0YS5idWZmZXIgYXMgQXJyYXlCdWZmZXIpIDogZW5jcnlwdGVkRGF0YTtcblxuICAgICAgICBjb25zdCBkZWNyeXB0ZWRCeXRlcyA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGVjcnlwdChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQUVTLUNUUicsXG4gICAgICAgICAgICAgICAgY291bnRlcjogY291bnRlcixcbiAgICAgICAgICAgICAgICBsZW5ndGg6IDY0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXkhLFxuICAgICAgICAgICAgYXJyYXlCdWZmZXIsXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuICAgICAgICBjb25zdCBqc29uU3RyaW5nID0gZGVjb2Rlci5kZWNvZGUoZGVjcnlwdGVkQnl0ZXMpO1xuICAgICAgICByZXR1cm4gcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UoanNvblN0cmluZykpO1xuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBhc3luYyBnZXQoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHsgZGF0YTogYW55OyB0aW1lc3RhbXA6IG51bWJlciB9IHwgbnVsbD4ge1xuICAgICAgICAgICAgY29uc3QgZGIgPSBhd2FpdCBvcGVuREIoKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBkYi50cmFuc2FjdGlvbihTVE9SRV9OQU1FLCAncmVhZG9ubHknKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKFNUT1JFX05BTUUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBzdG9yZS5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoKSA9PiByZWplY3QocmVxdWVzdC5lcnJvcik7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlcXVlc3QucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zPy5lbmNyeXB0aW9uICYmIChyZXN1bHQuZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8IHJlc3VsdC5kYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlY3J5cHRlZERhdGEgPSBhd2FpdCBkZWNyeXB0RGF0YShyZXN1bHQuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHsgZGF0YTogZGVjcnlwdGVkRGF0YSwgdGltZXN0YW1wOiByZXN1bHQudGltZXN0YW1wIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQgPz8gbnVsbCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBhc3luYyBzZXQoa2V5OiBzdHJpbmcsIGRhdGE6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAgICAgY29uc3QgZGIgPSBhd2FpdCBvcGVuREIoKTtcbiAgICAgICAgICAgIGxldCBkYXRhVG9TdG9yZTogYW55ID0gZGF0YTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmVuY3J5cHRpb24pIHtcbiAgICAgICAgICAgICAgICBkYXRhVG9TdG9yZSA9IGF3YWl0IGVuY3J5cHREYXRhKGRhdGEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gZGIudHJhbnNhY3Rpb24oU1RPUkVfTkFNRSwgJ3JlYWR3cml0ZScpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoU1RPUkVfTkFNRSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IHN0b3JlLnB1dCh7IGRhdGE6IGRhdGFUb1N0b3JlLCB0aW1lc3RhbXA6IERhdGUubm93KCkgfSwga2V5KTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoKSA9PiByZWplY3QocmVxdWVzdC5lcnJvcik7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUNhY2hlS2V5KHBhdGg6IHN0cmluZywgcGFyYW1zOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtwYXRofToke0pTT04uc3RyaW5naWZ5KHBhcmFtcyA/PyB7fSl9YDtcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICI7QUFNQSxTQUFTLGlCQUFpQixDQUFDLFNBQTZCO0FBQUEsRUFDdEQsSUFBSSxDQUFDLFFBQVE7QUFBQSxJQUFRLFFBQVEsU0FBUztBQUFBLEVBQ3RDLElBQUksUUFBUSxTQUFTO0FBQUEsSUFBRyxNQUFNLElBQUksTUFBTSxnQkFBZ0I7QUFBQSxFQUN4RCxJQUFJLFFBQVEsU0FBUztBQUFBLElBQUksTUFBTSxJQUFJLE1BQU0sZ0JBQWdCO0FBQUEsRUFDekQsSUFBSSxRQUFRLGFBQWEsUUFBUSxTQUFTO0FBQUEsSUFBRyxNQUFNLElBQUksTUFBTSxnQkFBZ0I7QUFBQSxFQUM3RSxJQUFJLFdBQVc7QUFBQSxFQUNmLElBQUksY0FBYztBQUFBLEVBQ2xCLE9BQU87QUFBQSxJQUNMLFFBQVEsR0FBRztBQUFBLE1BQ1QsSUFBSSxhQUFhLFFBQVE7QUFBQSxNQUN6QixNQUFNLE1BQU0sS0FBSyxJQUFJO0FBQUEsTUFDckIsSUFBSSxLQUFLO0FBQUEsTUFDVCxJQUFJLFFBQVEsV0FBVztBQUFBLFFBQ3JCLGNBQWM7QUFBQSxRQUNkLEtBQUssR0FBRyxLQUFLLGlCQUFpQixPQUFPLEdBQUcsQ0FBQyxFQUFF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RUFHakQsT0FBTztBQUFBLFNBQ0csSUFBRyxDQUFDLEtBQStEO0FBQUEsTUFDckUsTUFBTSxLQUFLLE1BQU0sT0FBTztBQUFBLE1BQ3hCLE9BQU8sSUFBSSxRQUFRLENBQUMsU0FBUyxXQUFXO0FBQUEsUUFDcEMsTUFBTSxjQUFjLEdBQUcsWUFBWSxZQUFZLFVBQVU7QUFBQSxRQUN6RCxNQUFNLFFBQVEsWUFBWSxZQUFZLFVBQVU7QUFBQSxRQUNoRCxNQUFNLFVBQVUsTUFBTSxJQUFJLEdBQUc7QUFBQSxRQUM3QixRQUFRLFVBQVUsTUFBTSxPQUFPLFFBQVEsS0FBSztBQUFBLFFBQzVDLFFBQVEsWUFBWSxZQUFZO0FBQUEsVUFDNUIsTUFBTSxTQUFTLFFBQVE7QUFBQSxVQUN2QixJQUFJLENBQUMsUUFBUTtBQUFBLFlBQ1QsUUFBUSxJQUFJO0FBQUEsWUFDWjtBQUFBLFVBQ0o7QUFBQSxVQUVBLElBQUksU0FBUyxlQUFlLE9BQU8sZ0JBQWdCLGVBQWUsT0FBTyxnQkFBZ0IsYUFBYTtBQUFBLFlBQ2xHLE1BQU0sZ0JBQWdCLE1BQU0sWUFBWSxPQUFPLElBQUk7QUFBQSxZQUNuRCxRQUFRLEVBQUUsTUFBTSxlQUFlLFdBQVcsT0FBTyxVQUFVLENBQUM7QUFBQSxZQUM1RDtBQUFBLFVBQ0o7QUFBQSxVQUVBLFFBQVEsVUFBVSxJQUFJO0FBQUE7QUFBQSxPQUU3QjtBQUFBO0FBQUEsU0FFQyxJQUFHLENBQUMsS0FBYSxNQUEwQjtBQUFBLE1BQzdDLE1BQU0sS0FBSyxNQUFNLE9BQU87QUFBQSxNQUN4QixJQUFJLGNBQW1CO0FBQUEsTUFFdkIsSUFBSSxTQUFTLFlBQVk7QUFBQSxRQUNyQixjQUFjLE1BQU0sWUFBWSxJQUFJO0FBQUEsTUFDeEM7QUFBQSxNQUVBLE9BQU8sSUFBSSxRQUFRLENBQUMsU0FBUyxXQUFXO0FBQUEsUUFDcEMsTUFBTSxjQUFjLEdBQUcsWUFBWSxZQUFZLFdBQVc7QUFBQSxRQUMxRCxNQUFNLFFBQVEsWUFBWSxZQUFZLFVBQVU7QUFBQSxRQUNoRCxNQUFNLFVBQVUsTUFBTSxJQUFJLEVBQUUsTUFBTSxhQUFhLFdBQVcsS0FBSyxJQUFJLEVBQUUsR0FBRyxHQUFHO0FBQUEsUUFDM0UsUUFBUSxVQUFVLE1BQU0sT0FBTyxRQUFRLEtBQUs7QUFBQSxRQUM1QyxRQUFRLFlBQVksTUFBTSxRQUFRO0FBQUEsT0FDckM7QUFBQTtBQUFBLEVBRVQ7QUFBQTtBQUdKLFNBQVMsZ0JBQWdCLENBQUMsTUFBYyxRQUFxQjtBQUFBLEVBQ3pELE9BQU8sR0FBRyxRQUFRLEtBQUssVUFBVSxVQUFVLENBQUMsQ0FBQztBQUFBOyIsCiAgImRlYnVnSWQiOiAiQTBFNTkwN0QxMzcyREJEODY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@milkio/stargate-worker",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "type": "module",
5
5
  "exports": "./index.js",
6
6
  "types": "./index.d.ts",