@myop/sdk 0.2.6 → 0.2.7

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 (43) hide show
  1. package/README.md +3 -3
  2. package/dist/bundled-declarations.d.ts +67 -7
  3. package/dist/cjs/_IframeSDK.43696632.min.js +1 -0
  4. package/dist/cjs/{_IframeSDK.2793f0c2.js → _IframeSDK.65146759.js} +185 -33
  5. package/dist/cjs/_IframeSDK.65146759.js.map +7 -0
  6. package/dist/cjs/{_MyopHelpers.7baba8b8.js → _MyopHelpers.02c01d3a.js} +96 -11
  7. package/dist/cjs/{_MyopHelpers.7baba8b8.js.map → _MyopHelpers.02c01d3a.js.map} +3 -3
  8. package/dist/cjs/_MyopHelpers.abd584e8.min.js +1 -0
  9. package/dist/cjs/{_WebComponentSDK.ba6c3d1b.js → _WebComponentSDK.4a661403.js} +185 -33
  10. package/dist/cjs/_WebComponentSDK.4a661403.js.map +7 -0
  11. package/dist/cjs/_WebComponentSDK.5d90b79c.min.js +1 -0
  12. package/dist/cjs/{_hostSDK.71e17cf2.js → _hostSDK.933cfab5.js} +185 -33
  13. package/dist/cjs/_hostSDK.933cfab5.js.map +7 -0
  14. package/dist/cjs/_hostSDK.98520a3d.min.js +1 -0
  15. package/dist/cjs/myop_sdk.js +14 -14
  16. package/dist/cjs/myop_sdk.js.map +1 -1
  17. package/dist/cjs/myop_sdk.min.js +1 -1
  18. package/dist/cjs-bundled/myop_sdk.bundled.js +188 -35
  19. package/dist/cjs-bundled/myop_sdk.bundled.js.map +2 -2
  20. package/dist/cjs-bundled/myop_sdk.bundled.min.js +1 -1
  21. package/dist/module/Iframe/index.js +209 -60
  22. package/dist/module/Iframe/index.js.map +3 -3
  23. package/dist/module/SDK.js +211 -61
  24. package/dist/module/SDK.js.map +2 -2
  25. package/dist/module/helpers/CloudRepository.d.ts +15 -6
  26. package/dist/module/helpers/index.js +97 -12
  27. package/dist/module/helpers/index.js.map +3 -3
  28. package/dist/module/host/components/IMyopComponent.d.ts +43 -0
  29. package/dist/module/host/components/myopIframeComponent.d.ts +8 -1
  30. package/dist/module/host/components/myopRefComponent.d.ts +2 -2
  31. package/dist/module/host/index.d.ts +1 -0
  32. package/dist/module/host/index.js +209 -60
  33. package/dist/module/host/index.js.map +3 -3
  34. package/dist/module/webcomponent/index.js +209 -60
  35. package/dist/module/webcomponent/index.js.map +3 -3
  36. package/package.json +1 -1
  37. package/dist/cjs/_IframeSDK.2793f0c2.js.map +0 -7
  38. package/dist/cjs/_IframeSDK.fb84c8eb.min.js +0 -1
  39. package/dist/cjs/_MyopHelpers.3d50ac48.min.js +0 -1
  40. package/dist/cjs/_WebComponentSDK.0fee50b6.min.js +0 -1
  41. package/dist/cjs/_WebComponentSDK.ba6c3d1b.js.map +0 -7
  42. package/dist/cjs/_hostSDK.159c1adb.min.js +0 -1
  43. package/dist/cjs/_hostSDK.71e17cf2.js.map +0 -7
@@ -1,4 +1,4 @@
1
- import { IUserFlow, v2_IVariantConfig } from "../common";
1
+ import { IComponentConfig, IUserFlow } from "../common";
2
2
  /**
3
3
  * CloudRepository - Unified cloud data access layer for Myop components
4
4
  *
@@ -11,26 +11,35 @@ export declare class CloudRepository {
11
11
  static Main: CloudRepository;
12
12
  private variants;
13
13
  private userFlows;
14
+ private _defaultEnv;
14
15
  constructor(_baseUrl?: string);
16
+ /**
17
+ * Set the default environment for this CloudRepository instance
18
+ */
19
+ setEnvironment(env: string): void;
20
+ /**
21
+ * Get the current default environment
22
+ */
23
+ getDefaultEnvironment(): string;
15
24
  /**
16
25
  * Check if a component is already cached/preloaded (v2)
17
26
  */
18
- isPreloaded(componentId: string): boolean;
27
+ isPreloaded(componentId: string, env?: string, preview?: boolean): boolean;
19
28
  /**
20
- * Fetch a v2 component variant
29
+ * Fetch a v2 component config
21
30
  */
22
- fetchComponentV2(componentId: string, environmentIdentifier?: string): Promise<v2_IVariantConfig>;
31
+ fetchComponentV2(componentId: string, environmentIdentifier?: string, preview?: boolean): Promise<IComponentConfig>;
23
32
  /**
24
33
  * Fetch a v1 component from a flow
25
34
  */
26
- fetchComponentV1(componentId: string, flowId?: string): Promise<import("../common").IComponentConfig>;
35
+ fetchComponentV1(componentId: string, flowId?: string): Promise<IComponentConfig>;
27
36
  fetchAutoFlow(componentId: string): Promise<IUserFlow>;
28
37
  fetchFlow(flowId: string): Promise<IUserFlow>;
29
38
  /**
30
39
  * @deprecated Use fetchComponentV2 or fetchComponentV1 explicitly
31
40
  * Defaults to v1 behavior for backward compatibility with existing code
32
41
  */
33
- fetchComponent(componentId: string, flowId?: string): Promise<import("../common").IComponentConfig>;
42
+ fetchComponent(componentId: string, flowId?: string): Promise<IComponentConfig>;
34
43
  }
35
44
  /**
36
45
  * @deprecated Use CloudRepository instead
@@ -330,7 +330,64 @@ __publicField(_ComponentConfig, "create", () => {
330
330
  });
331
331
  var ComponentConfig = _ComponentConfig;
332
332
 
333
+ // src/common/index.ts
334
+ var PropConfigBehaviorTypes = {
335
+ "message": "message",
336
+ "code": "code"
337
+ };
338
+
333
339
  // src/helpers/CloudRepository.ts
340
+ var convertV2VariantToComponentConfig = (config) => {
341
+ return {
342
+ instance: {
343
+ id: "auto",
344
+ componentId: config.componentId,
345
+ componentName: config.name,
346
+ skinSelector: {
347
+ type: "Dedicated",
348
+ skin: {
349
+ id: "skin_auto_v2_converted"
350
+ }
351
+ }
352
+ },
353
+ type: {
354
+ id: config.id,
355
+ name: config.name,
356
+ description: config.description,
357
+ props: [
358
+ {
359
+ id: "in_auto_v2_converted",
360
+ name: "myop_init_interface",
361
+ type: "any",
362
+ behavior: {
363
+ type: PropConfigBehaviorTypes.code
364
+ }
365
+ },
366
+ {
367
+ id: "out_auto_v2_converted",
368
+ name: "myop_cta_handler",
369
+ type: "any",
370
+ behavior: {
371
+ type: PropConfigBehaviorTypes.code
372
+ }
373
+ }
374
+ ],
375
+ refs: [],
376
+ skins: [
377
+ {
378
+ id: "skin_auto_v2_converted",
379
+ name: "auto_v2_converted",
380
+ description: "",
381
+ //TODO : handle empty :
382
+ // @ts-ignore
383
+ loader: config.consume_variant[0].loader
384
+ }
385
+ ],
386
+ defaultSkin: 0
387
+ },
388
+ name: config.name
389
+ };
390
+ };
334
391
  var _CloudRepository = class _CloudRepository {
335
392
  constructor(_baseUrl = "https://cloud.myop.dev") {
336
393
  this._baseUrl = _baseUrl;
@@ -338,35 +395,63 @@ var _CloudRepository = class _CloudRepository {
338
395
  __publicField(this, "variants", {});
339
396
  // v1 cache
340
397
  __publicField(this, "userFlows", {});
398
+ __publicField(this, "_defaultEnv", "production");
399
+ }
400
+ /**
401
+ * Set the default environment for this CloudRepository instance
402
+ */
403
+ setEnvironment(env) {
404
+ this._defaultEnv = env;
405
+ }
406
+ /**
407
+ * Get the current default environment
408
+ */
409
+ getDefaultEnvironment() {
410
+ return this._defaultEnv;
341
411
  }
342
412
  // ============ V2 Methods (Default) ============
343
413
  /**
344
414
  * Check if a component is already cached/preloaded (v2)
345
415
  */
346
- isPreloaded(componentId) {
347
- return componentId in this.variants;
416
+ isPreloaded(componentId, env, preview) {
417
+ const cacheKey = `${componentId}:${env || this._defaultEnv}:${preview ? "preview" : "live"}`;
418
+ return cacheKey in this.variants;
348
419
  }
349
420
  /**
350
- * Fetch a v2 component variant
421
+ * Fetch a v2 component config
351
422
  */
352
- fetchComponentV2(componentId, environmentIdentifier) {
423
+ fetchComponentV2(componentId, environmentIdentifier, preview) {
353
424
  return __async(this, null, function* () {
354
- if (!this.variants[componentId]) {
355
- this.variants[componentId] = new Promise(
425
+ const env = environmentIdentifier || this._defaultEnv;
426
+ const cacheKey = `${componentId}:${env}:${preview ? "preview" : "live"}`;
427
+ if (!this.variants[cacheKey]) {
428
+ this.variants[cacheKey] = new Promise(
356
429
  (resolve, reject) => __async(this, null, function* () {
357
430
  try {
358
- const res = yield fetch(
359
- `${this._baseUrl}/consume?id=${componentId}&env=${environmentIdentifier}`
360
- );
431
+ let url = `${this._baseUrl}/consume?id=${componentId}&env=${env}`;
432
+ if (preview) {
433
+ url += "&preview=true";
434
+ }
435
+ const res = yield fetch(url);
361
436
  const json = yield res.json();
362
- resolve(json.item);
437
+ const variant = json.item;
438
+ if (!variant) {
439
+ reject(new Error(`Component "${componentId}" not found`));
440
+ return;
441
+ }
442
+ if (!variant.consume_variant || !variant.consume_variant.length) {
443
+ reject(new Error(`Component "${componentId}" has no implementation for environment "${env}"`));
444
+ return;
445
+ }
446
+ const componentConfig = convertV2VariantToComponentConfig(variant);
447
+ resolve(componentConfig);
363
448
  } catch (e) {
364
449
  reject(e);
365
450
  }
366
451
  })
367
452
  );
368
453
  }
369
- return yield this.variants[componentId];
454
+ return yield this.variants[cacheKey];
370
455
  });
371
456
  }
372
457
  // ============ V1 Methods (Legacy) ============
@@ -456,4 +541,4 @@ export {
456
541
  removeClass,
457
542
  v2_CloudRepository
458
543
  };
459
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3V0aWxzL3V1aWQudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0Jhc2VNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9FeGVjdXRlU2NyaXB0TWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ3VzdG9tUmVmTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvaGVscGVycy9hcHBseVN0eWxlc2hlZXQudHMiLCAiLi4vLi4vLi4vc3JjL2hlbHBlcnMvaWZyYW1lU2tpblVybFRva2VuaXplci50cyIsICIuLi8uLi8uLi9zcmMvaGVscGVycy9jbGFzc0xpc3QudHMiLCAiLi4vLi4vLi4vc3JjL2hlbHBlcnMvY29uZmlnQnVpbGRlci50cyIsICIuLi8uLi8uLi9zcmMvaGVscGVycy9DbG91ZFJlcG9zaXRvcnkudHMiLCAiLi4vLi4vLi4vc3JjL2hlbHBlcnMvZXhlYy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLy9UT0RPIDogcmV1c2UgZnJvbSBvbmUgcGxhY2UuXG4vLyBuZWVkcyB0byBiZSB1c2VkIGluIG15b3Atc2RrLCBteW9wLWRhc2hiYW9yZCwgbXlvcC1zZXJ2ZXIsIG15b3AtY2xpIC4uXG5cbmV4cG9ydCBjb25zdCB1dWlkdjQgPSAoKSA9PiB7XG4gICAgcmV0dXJuIFwiMTAwMDAwMDAtMTAwMC00MDAwLTgwMDAtMTAwMDAwMDAwMDAwXCIucmVwbGFjZSgvWzAxOF0vZywgYyA9PlxuICAgICAgICAoK2MgXiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KDEpKVswXSAmIDE1ID4+ICtjIC8gNCkudG9TdHJpbmcoMTYpXG4gICAgKTtcbn1cblxuLy8gQ29udmVydCBVVUlEIHN0cmluZyB0byBieXRlc1xuZXhwb3J0IGNvbnN0IHV1aWRUb0J5dGVzID0gKHV1aWQ6IHN0cmluZyk6IFVpbnQ4QXJyYXkgPT4ge1xuICAgIHJldHVybiBVaW50OEFycmF5LmZyb20oXG4gICAgICAgIHV1aWQucmVwbGFjZSgvLS9nLCAnJykubWF0Y2goLy57MSwyfS9nKSEubWFwKGJ5dGUgPT4gcGFyc2VJbnQoYnl0ZSwgMTYpKVxuICAgICk7XG59O1xuXG4vLyBDb252ZXJ0IGJ5dGVzIHRvIFVVSUQgc3RyaW5nXG5leHBvcnQgY29uc3QgYnl0ZXNUb1V1aWQgPSAoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGhleCA9IFsuLi5ieXRlc10ubWFwKGIgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgaGV4LnNsaWNlKDAsIDgpLFxuICAgICAgICBoZXguc2xpY2UoOCwgMTIpLFxuICAgICAgICBoZXguc2xpY2UoMTIsIDE2KSxcbiAgICAgICAgaGV4LnNsaWNlKDE2LCAyMCksXG4gICAgICAgIGhleC5zbGljZSgyMClcbiAgICBdLmpvaW4oJy0nKTtcbn07XG5cbi8vIEJhc2U2NCBVUkwtc2FmZSBlbmNvZGVcbmV4cG9ydCBjb25zdCBiYXNlNjRVcmxFbmNvZGUgPSAoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGJhc2U2NCA9IGJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZSguLi5ieXRlcykpO1xuICAgIHJldHVybiBiYXNlNjQucmVwbGFjZSgvXFwrL2csICctJykucmVwbGFjZSgvXFwvL2csICdfJykucmVwbGFjZSgvPSskLywgJycpO1xufTtcblxuLy8gQmFzZTY0IFVSTC1zYWZlIGRlY29kZVxuZXhwb3J0IGNvbnN0IGJhc2U2NFVybERlY29kZSA9IChzdHI6IHN0cmluZyk6IFVpbnQ4QXJyYXkgPT4ge1xuICAgIGxldCBiYXNlNjQgPSBzdHIucmVwbGFjZSgvLS9nLCAnKycpLnJlcGxhY2UoL18vZywgJy8nKTtcbiAgICB3aGlsZSAoYmFzZTY0Lmxlbmd0aCAlIDQpIGJhc2U2NCArPSAnPSc7XG4gICAgY29uc3QgYmluYXJ5ID0gYXRvYihiYXNlNjQpO1xuICAgIHJldHVybiBVaW50OEFycmF5LmZyb20oYmluYXJ5LCBjaGFyID0+IGNoYXIuY2hhckNvZGVBdCgwKSk7XG59O1xuXG4vLyBDb21wcmVzcyBhbiBhcnJheSBvZiBVVUlEcyBpbnRvIGEgc2hvcnQgVVJMLXNhZmUgc3RyaW5nXG5leHBvcnQgY29uc3QgY29tcHJlc3NVVUlEcyA9ICh1dWlkczogc3RyaW5nW10pOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGFsbEJ5dGVzID0gdXVpZHMuZmxhdE1hcCh1dWlkID0+IEFycmF5LmZyb20odXVpZFRvQnl0ZXModXVpZCkpKTtcbiAgICByZXR1cm4gYmFzZTY0VXJsRW5jb2RlKG5ldyBVaW50OEFycmF5KGFsbEJ5dGVzKSk7XG59O1xuXG4vLyBEZWNvbXByZXNzIGZyb20gVVJMLXNhZmUgc3RyaW5nIGJhY2sgdG8gYW4gYXJyYXkgb2YgVVVJRHNcbmV4cG9ydCBjb25zdCBkZWNvbXByZXNzVVVJRHMgPSAoZW5jb2RlZDogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAgIGNvbnN0IGJ5dGVzID0gYmFzZTY0VXJsRGVjb2RlKGVuY29kZWQpO1xuICAgIGlmIChieXRlcy5sZW5ndGggJSAxNiAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGlucHV0IGxlbmd0aCcpO1xuXG4gICAgY29uc3QgdXVpZHM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMTYpIHtcbiAgICAgICAgdXVpZHMucHVzaChieXRlc1RvVXVpZChieXRlcy5zbGljZShpLCBpICsgMTYpKSk7XG4gICAgfVxuICAgIHJldHVybiB1dWlkcztcbn07XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi9ob3N0XCI7XG5pbXBvcnQge0lSZWZDb25maWd9IGZyb20gXCIuLi9jb21tb25cIjtcblxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VEaXJlY3Rpb24ge1xuICAgIHN0YXRpYyBkb3duID0gJ2Rvd24nIGFzIGNvbnN0XG4gICAgc3RhdGljIHVwID0gJ3VwJyBhcyBjb25zdFxufVxuXG5leHBvcnQgdHlwZSBNZXNzYWdlRGlyZWN0aW9uT3B0aW9uID0gJ3VwJyB8ICdkb3duJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNeW9wTWVzc2FnZTxUID0gYW55PiB7XG4gICAgaWQgPSB1dWlkdjQoKVxuXG4gICAgc3RhdGljIGNyZWF0ZTxULCBVIGV4dGVuZHMgbmV3ICguLi5hcmdzOiBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8VT4pID0+IFQgPSB0eXBlb2YgdGhpcz4oXG4gICAgICAgIHRoaXM6IFUsXG4gICAgICAgIC4uLmFyZ3M6IENvbnN0cnVjdG9yUGFyYW1ldGVyczxVPlxuICAgICk6IEluc3RhbmNlVHlwZTx0eXBlb2YgdGhpcz4ge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHJldHVybiBuZXcgdGhpcyguLi5hcmdzKTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnbWVlc2FnZSBpZCBjcmVhdGVkJywgdGhpcy5pZCwgZG9jdW1lbnQubG9jYXRpb24uaHJlZik7XG4gICAgfVxuXG4gICAgbXlvcCA9IHRydWVcblxuICAgIGFic3RyYWN0IG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleSB8IHN0cmluZztcblxuICAgIGNvbnRlbnQ/OiBUXG5cbiAgICAvLyBUT0RPIDogY2FudCBiZSBvcHRpb25hbCBcbiAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICBkZXN0aW5hdGlvbj86IHN0cmluZ1xuXG4gICAgcm91dGU/OiBzdHJpbmdbXVxuXG4gICAgcmVmPzogUmVmXG5cbiAgICBkaXJlY3Rpb24/OiBNZXNzYWdlRGlyZWN0aW9uT3B0aW9uXG5cbiAgICBjbGVhbmFibGU6IGJvb2xlYW4gPSBmYWxzZVxuXG4gICAgaXNUeXBlb2YobXNnOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIG1zZy5tZXNzYWdlVHlwZSA9PT0gdGhpcy5tZXNzYWdlVHlwZVxuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE15b3BFbGVtZW50TWVzc2FnZTxUID0gYW55PiBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTxUPiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNeW9wQmluZFJlcGxheU1lc3NhZ2U8VCA9IGFueT4gZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8VD4ge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI/OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNeW9wQmluZE1lc3NhZ2U8VCA9IGFueSwgUiBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSA9IGFueT4gZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8VD4ge1xuXG4gICAgcHVibGljIGFic3RyYWN0IHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXk7XG5cbiAgICBwdWJsaWMgaGFuZGxlclVuaXF1ZUlkID0gdXVpZHY0KClcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBoYW5kbGVyOiAobWVzc2FnZTogUikgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcigpXG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVmIHtcbiAgICBwdWJsaWMgbXlvcCA9IHRydWU7XG5cbiAgICBwdWJsaWMgX19ub25Qcm94aWVkPzogUmVmO1xuXG4gICAgc3RhdGljIGNyZWF0ZShzZWxlY3Rvcjogc3RyaW5nLCByZWZDb25maWc/OiBJUmVmQ29uZmlnLCBjb21wb25lbnQ/OiBJTXlvcENvbXBvbmVudCkge1xuICAgICAgICBsZXQgX3JlZkNvbmZpZyA9IHJlZkNvbmZpZztcbiAgICAgICAgaWYgKCFfcmVmQ29uZmlnKSB7XG4gICAgICAgICAgICBfcmVmQ29uZmlnID0ge1xuICAgICAgICAgICAgICAgIGlkOiAnJyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnJyxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgICAgICAgICAgc2VsZWN0b3JUeXBlOiAnaWQtYXR0cmlidXRlJyxcbiAgICAgICAgICAgICAgICBzZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgYmVoYXZpb3I6IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NvZGUnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBhcyBJUmVmQ29uZmlnXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBSZWYoX3JlZkNvbmZpZywgY29tcG9uZW50KTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmQ29uZmlnOiBJUmVmQ29uZmlnLCBwdWJsaWMgY29tcG9uZW50PzogSU15b3BDb21wb25lbnQpIHtcbiAgICAgICAgdGhpcy5fX25vblByb3hpZWQgPSB7XG4gICAgICAgICAgICAuLi50aGlzLFxuICAgICAgICAgICAgY29tcG9uZW50OiBudWxsIC8vIGluIG9yZGVyIHRvIGJlIHNlcmlhbGl6YWJsZVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtSb290UmVmfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0V4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UnXG5cbmNvbnN0IGZ1bmN0aW9uQm9keVJlZ2V4ID0gLyg/OmZ1bmN0aW9uXFxzKlxcdypcXHMqXFwoW14pXSpcXClcXHMqXFx7KFtcXHNcXFNdKj8pXFx9fChcXChbXildKlxcKVxccyo9PlxccypcXHsoW1xcc1xcU10qPylcXH0pKVxccyokLztcbmNvbnN0IGV4cHJlc3Npb25Cb2R5UmVnZXggPSAvXFwoXFxzKlteKV0rXFxzKlxcKVxccyo9PlxccyooLispLztcblxuZXhwb3J0IGNvbnN0IHN0cmlwRnVuY3Rpb24gPSAoY29udGVudDogc3RyaW5nKSA9PiB7XG4gICAgbGV0IG1hdGNoID0gY29udGVudC5tYXRjaChmdW5jdGlvbkJvZHlSZWdleCk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIHJldHVybiBtYXRjaFsxXSB8fCBtYXRjaFszXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgbWF0Y2ggPSBjb250ZW50Lm1hdGNoKGV4cHJlc3Npb25Cb2R5UmVnZXgpO1xuICAgICAgICBpZiAobWF0Y2gpXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hbMV0udHJpbSgpO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgc2NyaXB0SW5wdXRzID0ge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW5cbn0gfCB7fTtcblxuZXhwb3J0IHR5cGUgc2NyaXB0VmFyczxUPiA9IHtcbiAgICBzZW5kOiAoZGF0YTogVCkgPT4gdm9pZDtcbiAgICAvLyBjb21wbGV0ZVN0cmVhbTogKCkgPT4gdm9pZDtcbiAgICByb290UmVmOiBSb290UmVmO1xuICAgIG1ha2VTZXJpYWxpemFibGU6IHR5cGVvZiBtYWtlU2VyaWFsaXphYmxlXG59XG5cbmV4cG9ydCB0eXBlIGV4dGVuZGVkU2NyaXB0VmFyczxULCBJPiA9IHtcbiAgICBbSyBpbiBrZXlvZiBJXTogSVtLXTtcbn0gJiBzY3JpcHRWYXJzPFQ+XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlU2NyaXB0TWVzc2FnZTxUID0gYW55LCBJIGV4dGVuZHMgc2NyaXB0SW5wdXRzID0gYW55PiBleHRlbmRzIE15b3BCaW5kTWVzc2FnZTxzdHJpbmcsIEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2U8VD4+IHtcblxuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5O1xuICAgIG1lc3NhZ2VUeXBlID0gJ0V4ZWN1dGVTY3JpcHRNZXNzYWdlJztcbiAgICBzY3JpcHQ6IHN0cmluZyA9ICcnXG5cbiAgICBzdGF0aWMgcmVwbGllcktleSA9ICdzZW5kJztcbiAgICBzdGF0aWMgY29tcGxldGVTdHJlYW1LZXkgPSAnY29tcGxldGVTdHJlYW0nO1xuXG4gICAgY29uc3RydWN0b3Ioc2NyaXB0OiAodmFyczogZXh0ZW5kZWRTY3JpcHRWYXJzPFQsIEk+KSA9PiBULCBoYW5kbGVyOiAobWVzc2FnZTogRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZTxUPikgPT4gdm9pZCA9ICgpID0+IHtcbiAgICB9LCBwdWJsaWMgc2NyaXB0SW5wdXRzPzogSSkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICAgICAgdGhpcy5zY3JpcHQgPSBzY3JpcHQudG9TdHJpbmcoKTtcblxuICAgICAgICAvL1RPRE86IGNhbiBiZSByZW1vdmVcbiAgICAgICAgdGhpcy5jb250ZW50ID0gc2NyaXB0LnRvU3RyaW5nKClcbiAgICAgICAgdGhpcy5jb250ZW50ID0gc3RyaXBGdW5jdGlvbih0aGlzLmNvbnRlbnQpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2U8VCA9IGFueT4gZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2U8VD4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5O1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlcGxheVRvSGFuZGxlcjogc3RyaW5nLCBwdWJsaWMgY29udGVudDogVCkge1xuICAgICAgICBzdXBlcihyZXBsYXlUb0hhbmRsZXIpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge1xuICAgIEV4ZWN1dGVTY3JpcHRNZXNzYWdlLFxuICAgIEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UsXG4gICAgZXh0ZW5kZWRTY3JpcHRWYXJzLFxuICAgIHNjcmlwdElucHV0cywgc3RyaXBGdW5jdGlvblxufSBmcm9tIFwiLi9FeGVjdXRlU2NyaXB0TWVzc2FnZS50c1wiO1xuXG5leHBvcnQgdHlwZSBjdXN0b21SZWZTY3JpcHRJbnB1dHMgPSB7XG4gICAgZWxlbWVudElkOiBzdHJpbmcsXG4gICAgcmVmPzogSFRNTEVsZW1lbnQsXG4gICAgX3NjcmlwdD86IHN0cmluZyxcbiAgICBfX3NjcmlwdElucHV0cz86IE9iamVjdFxufTtcblxuZXhwb3J0IGNsYXNzIEN1c3RvbVJlZk1lc3NhZ2U8VCA9IGFueSwgSSBleHRlbmRzIHNjcmlwdElucHV0cyA9IGN1c3RvbVJlZlNjcmlwdElucHV0cz4gZXh0ZW5kcyBFeGVjdXRlU2NyaXB0TWVzc2FnZTxULCBJICYgY3VzdG9tUmVmU2NyaXB0SW5wdXRzPiB7XG5cbiAgICBjb25zdHJ1Y3RvcihzY3JpcHQ6ICh2YXJzOiBleHRlbmRlZFNjcmlwdFZhcnM8VCwgSSAmIGN1c3RvbVJlZlNjcmlwdElucHV0cz4pID0+IFQsXG4gICAgICAgICAgICAgICAgcHVibGljIHNjcmlwdElucHV0czogSSAmIGN1c3RvbVJlZlNjcmlwdElucHV0cyxcbiAgICAgICAgICAgICAgICBoYW5kbGVyOiAobWVzc2FnZTogRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZTxUPikgPT4gdm9pZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB9KSB7XG5cbiAgICAgICAgLy9tb2NrIHZhcnNcbiAgICAgICAgLy8gbGV0IHJvb3RSZWYsIGVsZW1lbnRJZCwgX3NjcmlwdCwgX19zY3JpcHRJbnB1dHM7XG4gICAgICAgIHN1cGVyKCh7cm9vdFJlZiwgZWxlbWVudElkLCBfc2NyaXB0LCBfX3NjcmlwdElucHV0c30pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlZnMgPSAocm9vdFJlZi5zaGFkb3dSb290IHx8IHJvb3RSZWYuY29udGFpbmVyKS5xdWVyeVNlbGVjdG9yQWxsKGBbJHsnbXlvcC1pZCd9PScke2VsZW1lbnRJZH0nXWApO1xuICAgICAgICAgICAgaWYgKHJlZnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gIGNvbnN0IHJlZiA9IHJlZnNbMF07XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiB0aGluayBhYm91dCBleHBvc2luZyBcInJlZnNcIiBhbmQgbm90IG9ubHkgXCJyZWZcIlxuICAgICAgICAgICAgICAgIC8vZm9yIGNhc2VzIHdoZXJlIHRoZSBSZWYgaGFzIG11bHRpcGxhdGUgaW1wbGVtZW50YXRpb25zXG5cbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgX19zY3JpcHRJbnB1dHMucmVmID0gcmVmc1swXTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGR5bmFtaWNGdW5jdGlvbiA9IG5ldyBGdW5jdGlvbihgcmV0dXJuICgke19zY3JpcHR9KSguLi5hcmd1bWVudHMpYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGR5bmFtaWNGdW5jdGlvbihfX3NjcmlwdElucHV0cyk7XG5cbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgLy9yZXR1cm4gRnVuY3Rpb24oJ3JlZicsICdyb290UmVmJywgLi4uT2JqZWN0LmtleXMoX19zY3JpcHRJbnB1dHMpLCBfc2NyaXB0ISkocmVmLCByb290UmVmLCAuLi5PYmplY3QudmFsdWVzKF9fc2NyaXB0SW5wdXRzKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsIGFzIFQ7XG4gICAgICAgIH0sIGhhbmRsZXIpO1xuXG4gICAgICAgIHRoaXMuc2NyaXB0SW5wdXRzID0ge1xuICAgICAgICAgICAgLi4uc2NyaXB0SW5wdXRzLFxuICAgICAgICAgICAgLy9fc2NyaXB0OiBzdHJpcEZ1bmN0aW9uKHNjcmlwdC50b1N0cmluZygpKSxcbiAgICAgICAgICAgIF9zY3JpcHQ6IHNjcmlwdC50b1N0cmluZygpXG4gICAgICAgIH07XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlICogYXMgQ1NTIGZyb20gXCJjc3N0eXBlXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vaG9zdFwiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi91dGlscy91dGlscy50c1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0TWVzc2FnZX0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5cbi8vIGlnbm9yaW5nIGRvY3VtZW50YXRpb25cbi8qKiBAaWdub3JlICovXG5leHBvcnQgaW50ZXJmYWNlIENTU1Byb3BlcnRpZXMgZXh0ZW5kcyBDU1MuUHJvcGVydGllczxzdHJpbmcgfCBudW1iZXI+IHtcbn1cblxuZXhwb3J0IHR5cGUgU3R5bGVzaGVldERlZmluaXRpb24gPSB7IFtrZXk6IHN0cmluZ106IENTU1Byb3BlcnRpZXMgfTtcblxuZXhwb3J0IGNvbnN0IGFwcGx5U3R5bGVzaGVldCA9IChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBzdHlsZXNoZWV0OiBTdHlsZXNoZWV0RGVmaW5pdGlvbiwgY3NzPzogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgdGFnSWQgPSBgbXlvcC1jc3MtJHt1dWlkdjQoKX1gO1xuICAgIGNvbXBvbmVudC5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoe3Jvb3RSZWYsIF9zdHlsZXNoZWV0LCBfdGFnSWQsIF9jc3N9KSA9PiB7XG4gICAgICAgIGNvbnN0IHN0eWxlVGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgc3R5bGVUYWcudHlwZSA9ICd0ZXh0L2Nzcyc7XG5cbiAgICAgICAgLy8gQnVpbGQgdGhlIENTUyBzdHJpbmcgZnJvbSB0aGUgc3R5bGVzIG9iamVjdFxuICAgICAgICBsZXQgY3NzU3RyaW5nID0gX2NzcztcblxuICAgICAgICBmb3IgKGNvbnN0IHNlbGVjdG9yIGluIF9zdHlsZXNoZWV0KSB7XG4gICAgICAgICAgICBjc3NTdHJpbmcgKz0gYCR7c2VsZWN0b3J9IHsgYDtcbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBfc3R5bGVzaGVldFtzZWxlY3Rvcl07XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICBjc3NTdHJpbmcgKz0gYCR7cHJvcGVydHl9OiAke3Byb3BlcnRpZXNbcHJvcGVydHldfTsgYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNzc1N0cmluZyArPSAnfSAnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHRoZSBDU1Mgc3RyaW5nIGFzIHRoZSBjb250ZW50IG9mIHRoZSA8c3R5bGU+IGVsZW1lbnRcbiAgICAgICAgc3R5bGVUYWcuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzU3RyaW5nKSk7XG4gICAgICAgIHN0eWxlVGFnLmlkID0gX3RhZ0lkO1xuICAgICAgICAvLyBBcHBlbmQgdGhlIDxzdHlsZT4gZWxlbWVudFxuICAgICAgICAocm9vdFJlZi5zaGFkb3dSb290IHx8IHJvb3RSZWYuY29udGFpbmVyKS5hcHBlbmRDaGlsZChzdHlsZVRhZyk7XG5cbiAgICB9LCAoKSA9PiB7XG4gICAgfSwge1xuICAgICAgICBfc3R5bGVzaGVldDogc3R5bGVzaGVldCxcbiAgICAgICAgX2NzcyA6IGNzcyA/IGNzcyA6ICcnLFxuICAgICAgICBfdGFnSWQ6IHRhZ0lkXG4gICAgfSkpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCh7cm9vdFJlZiwgX3RhZ0lkfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IChyb290UmVmLnNoYWRvd1Jvb3QgfHwgZG9jdW1lbnQpLmdldEVsZW1lbnRCeUlkKF90YWdJZCk7XG4gICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgX3RhZ0lkOiB0YWdJZFxuICAgICAgICB9KSlcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBhcHBseVN0eWxlc2hlZXRMaW5rID0gKGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIGxpbms6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHRhZ0lkID0gYG15b3AtY3NzLSR7dXVpZHY0KCl9YDtcbiAgICBjb21wb25lbnQuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKHtyb290UmVmLCBfdGFnSWQsIF9saW5rfSkgPT4ge1xuICAgICAgICBjb25zdCBsaW5rRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgICAgbGlua0VsZW1lbnQuaWQgPSBfdGFnSWQ7XG4gICAgICAgIGxpbmtFbGVtZW50LnJlbCA9ICdzdHlsZXNoZWV0JztcbiAgICAgICAgbGlua0VsZW1lbnQuaHJlZiA9IF9saW5rO1xuICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGxpbmtFbGVtZW50KTtcblxuICAgICAgICAvLyBBcHBlbmQgdGhlIDxzdHlsZT4gZWxlbWVudFxuICAgICAgICAocm9vdFJlZi5zaGFkb3dSb290IHx8IHJvb3RSZWYuY29udGFpbmVyKS5hcHBlbmRDaGlsZChsaW5rRWxlbWVudCk7XG4gICAgfSwgKCkgPT4ge1xuICAgIH0sIHtcbiAgICAgICAgX2xpbmsgOiBsaW5rLFxuICAgICAgICBfdGFnSWQ6IHRhZ0lkXG4gICAgfSkpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCh7cm9vdFJlZiwgX3RhZ0lkfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IChyb290UmVmLnNoYWRvd1Jvb3QgfHwgZG9jdW1lbnQpLmdldEVsZW1lbnRCeUlkKF90YWdJZCk7XG4gICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgX3RhZ0lkOiB0YWdJZFxuICAgICAgICB9KSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtJSWZyYW1lTG9hZGVyQ29uZmlnLCBJU2tpbkNvbmZpZ30gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5leHBvcnQgdHlwZSBUb2tlbk1hcCA9IFJlY29yZDxzdHJpbmcsIHN0cmluZ3wgbnVtYmVyPlxuXG5jb25zdCByZXBsYWNlVG9rZW5zID0gKGlucHV0OiBzdHJpbmcsIHRva2VuTWFwOiBUb2tlbk1hcCk6IHN0cmluZyA9PiB7XG4gICAgLy8gQ3JlYXRlIGEgcmVnZXggcGF0dGVybiBmcm9tIHRoZSBrZXlzIG9mIHRoZSB0b2tlbk1hcFxuICAgIGNvbnN0IHBhdHRlcm4gPSBuZXcgUmVnRXhwKE9iamVjdC5rZXlzKHRva2VuTWFwKS5qb2luKCd8JyksICdnJyk7XG5cbiAgICAvLyBSZXBsYWNlIHRva2VucyBpbiB0aGUgaW5wdXQgc3RyaW5nIHVzaW5nIHRoZSByZWdleFxuICAgIHJldHVybiBpbnB1dC5yZXBsYWNlKHBhdHRlcm4sIChtYXRjaGVkKSA9PiB7XG4gICAgICAgIC8vIFJldHVybiB0aGUgcmVwbGFjZW1lbnQgdmFsdWUgZnJvbSB0aGUgdG9rZW5NYXBcbiAgICAgICAgcmV0dXJuICh0b2tlbk1hcFttYXRjaGVkXSB8fCBtYXRjaGVkKS50b1N0cmluZygpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlSWZyYW1lU2tpbkJ5VG9rZW5pemVyID0gKHNlbGVjdGVkU2tpbjogSVNraW5Db25maWcsIHRva2VuTWFwOiBUb2tlbk1hcCkgPT4ge1xuICAgIGNvbnN0IHR5cGVkU2tpbkNvbmZpZyA9IChzZWxlY3RlZFNraW4ubG9hZGVyIGFzIElJZnJhbWVMb2FkZXJDb25maWcpXG4gICAgaWYgKHR5cGVkU2tpbkNvbmZpZy50eXBlICE9PSAnSWZyYW1lTG9hZGVyJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGlmcmFtZVNraW5VcmxUb2tlbml6ZXIgcmVjZWl2ZWQgc2tpbiB3aXRoIGxvYWRlciB0eXBlIFwiJHt0eXBlZFNraW5Db25maWcudHlwZX1cIiwgY3VycmVudGx5IG9ubHkgXCJJZnJhbWVMb2FkZXJcIiBpcyBzdXBwb3J0ZWRgKVxuICAgIH1cblxuICAgIHNlbGVjdGVkU2tpbi5sb2FkZXIgPSB7XG4gICAgICAgIC4uLnNlbGVjdGVkU2tpbi5sb2FkZXJcbiAgICB9XG5cbiAgICBzZWxlY3RlZFNraW4ubG9hZGVyLnVybCA9IHJlcGxhY2VUb2tlbnMoc2VsZWN0ZWRTa2luLmxvYWRlci51cmwsIHRva2VuTWFwKTtcblxuICAgIHJldHVybiBzZWxlY3RlZFNraW47XG59XG5cbmV4cG9ydCBjb25zdCBjaGFuZ2VTa2luVXJsQnlUb2tlbml6ZXIgPSAodG9rZW5NYXA6IFRva2VuTWFwKSA9PiB7XG4gICAgcmV0dXJuIGFzeW5jIChzZWxlY3RlZFNraW46IElTa2luQ29uZmlnKSA9PiB7XG4gICAgICAgIHJldHVybiBjcmVhdGVJZnJhbWVTa2luQnlUb2tlbml6ZXIoc2VsZWN0ZWRTa2luLCB0b2tlbk1hcCk7XG4gICAgfVxufSIsICJpbXBvcnQge0N1c3RvbVJlZk1lc3NhZ2V9IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uL2hvc3RcIjtcblxuLy8gY29uc3Qgc3BhY2UgPSAnICc7XG4vLyBleHBvcnQgY29uc3QgZ2V0Q2xhc3NlcyA9IGFzeW5jIChjb25uZWN0ZWRSZWY6IFJlZik6IFByb21pc2U8c3RyaW5nW10+ID0+IChhd2FpdCBleGVjKGFjdEFzPEhUTUxEaXZFbGVtZW50Pihjb25uZWN0ZWRSZWYpLmNsYXNzTGlzdCkpLnZhbHVlLnNwbGl0KHNwYWNlKTtcbi8vIGV4cG9ydCBjb25zdCBhZGRDbGFzcyA9IGFzeW5jIChjb25uZWN0ZWRSZWY6IFJlZiwgY2xhc3NOYW1lOiBzdHJpbmcpID0+IHtcbi8vICAgICBjb25zdCBjbGFzc2VzID0gYXdhaXQgZ2V0Q2xhc3Nlcyhjb25uZWN0ZWRSZWYpO1xuLy8gICAgIGNsYXNzZXMuaW5jbHVkZXMoY2xhc3NOYW1lKSB8fCBjbGFzc2VzLnB1c2goY2xhc3NOYW1lKTtcbi8vICAgICAvLyBAdHMtaWdub3JlXG4vLyAgICAgY29ubmVjdGVkUmVmLmNsYXNzTGlzdCA9IGNsYXNzZXMuam9pbihzcGFjZSk7XG4vLyB9XG4vLyBleHBvcnQgY29uc3QgcmVtb3ZlQ2xhc3MgPSBhc3luYyAoY29ubmVjdGVkUmVmOiBSZWYsIGNsYXNzTmFtZTogc3RyaW5nLCkgPT4ge1xuLy8gICAgIGxldCBjbGFzc2VzID0gYXdhaXQgZ2V0Q2xhc3Nlcyhjb25uZWN0ZWRSZWYpO1xuLy8gICAgIC8vIEB0cy1pZ25vcmVcbi8vICAgICBjb25uZWN0ZWRSZWYuY2xhc3NMaXN0ID0gY2xhc3Nlcy5maWx0ZXIoYyA9PiBjICE9PSBjbGFzc05hbWUpLmpvaW4oc3BhY2UpO1xuLy8gfVxuLy9cbi8vXG5cbmV4cG9ydCBjb25zdCBhZGRDbGFzcyA9IChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBjbGFzc05hbWU6IHN0cmluZywgbXlvcElkOiBzdHJpbmcpID0+IHtcbiAgICBjb21wb25lbnQuc2VuZChuZXcgQ3VzdG9tUmVmTWVzc2FnZSgoe3JlZiwgX2NsYXNzTmFtZX0pID0+IHtcbiAgICAgICAgcmVmPy5jbGFzc0xpc3QuYWRkKF9jbGFzc05hbWUpO1xuICAgIH0sIHtcbiAgICAgICAgZWxlbWVudElkOiBteW9wSWQsXG4gICAgICAgIF9jbGFzc05hbWU6IGNsYXNzTmFtZVxuICAgIH0pKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJlbW92ZUNsYXNzID0gKGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIGNsYXNzTmFtZTogc3RyaW5nLCBteW9wSWQ6IHN0cmluZykgPT4ge1xuICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDdXN0b21SZWZNZXNzYWdlKCh7cmVmLCBfY2xhc3NOYW1lfSkgPT4ge1xuICAgICAgICByZWY/LmNsYXNzTGlzdC5yZW1vdmUoX2NsYXNzTmFtZSk7XG4gICAgfSwge1xuICAgICAgICBlbGVtZW50SWQ6IG15b3BJZCxcbiAgICAgICAgX2NsYXNzTmFtZTogY2xhc3NOYW1lXG4gICAgfSkpO1xufSIsICJpbXBvcnQge1xuICAgIElDb21wb25lbnRDb25maWcsXG4gICAgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnLCBJSFRNTExvYWRlckNvbmZpZywgSVJlZkNvbmZpZyxcbiAgICBJU2tpbkxvYWRlckNvbmZpZyxcbiAgICBJU2tpblNlbGVjdG9yQ29uZmlnLFxuICAgIElEZWRpY2F0ZWRTa2luQ29uZmlnLCBJU2tpbkNvbmZpZ1xufSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBTa2luQ29uZmlnIGltcGxlbWVudHMgSVNraW5Db25maWcge1xuICAgIF9ydW5UaW1lSW5zdGFuY2VJZCA9ICdydW50aW1lLWluc3RhbmNlLWlkLScgKyB1dWlkdjQoKTtcbiAgICBfcnVuVGltZUlkID0gJ3J1bnRpbWUtaWQtJyArIHV1aWR2NCgpO1xuICAgIF9ydW5UaW1lTmFtZSA9ICdydW50aW1lLW5hbWUtJyArIHV1aWR2NCgpO1xuXG4gICAgc3RhdGljIGNyZWF0ZSA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTa2luQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgaWQgPSB0aGlzLl9ydW5UaW1lSWQ7XG4gICAgbmFtZSA9IHRoaXMuX3J1blRpbWVOYW1lO1xuICAgIGRlc2NyaXB0aW9uID0gJyc7XG4gICAgbG9hZGVyID0gbnVsbCBhcyB1bmtub3duIGFzIElTa2luTG9hZGVyQ29uZmlnO1xuXG4gICAgd2l0aExvYWRlciA9IChsb2FkZXI6IElTa2luTG9hZGVyQ29uZmlnKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGVyID0gbG9hZGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB3aXRoSFRNTExvYWRlciA9IChsb2FkZXI6IE9taXQ8SUhUTUxMb2FkZXJDb25maWcsICd0eXBlJz4pID0+IHtcbiAgICAgICAgbG9hZGVyLnR5cGUgPSAnSFRNTExvYWRlcic7XG4gICAgICAgIHRoaXMubG9hZGVyID0gbG9hZGVyIGFzIElIVE1MTG9hZGVyQ29uZmlnO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBidWlsZCA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50Q29uZmlnIGltcGxlbWVudHMgSUNvbXBvbmVudENvbmZpZyB7XG4gICAgX3J1blRpbWVJbnN0YW5jZUlkID0gJ3J1bnRpbWUtaW5zdGFuY2UtaWQtJyArIHV1aWR2NCgpO1xuICAgIF9ydW5UaW1lSWQgPSAncnVudGltZS1pZC0nICsgdXVpZHY0KCk7XG4gICAgX3J1blRpbWVOYW1lID0gJ3J1bnRpbWUtbmFtZS0nICsgdXVpZHY0KCk7XG5cbiAgICBzdGF0aWMgY3JlYXRlID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudENvbmZpZygpO1xuICAgIH1cblxuICAgIGluc3RhbmNlID0ge1xuICAgICAgICBpZDogdGhpcy5fcnVuVGltZUluc3RhbmNlSWQsXG4gICAgICAgIGNvbXBvbmVudElkOiB0aGlzLl9ydW5UaW1lSWQsXG4gICAgICAgIGNvbXBvbmVudE5hbWU6IHRoaXMuX3J1blRpbWVOYW1lLFxuICAgICAgICBza2luU2VsZWN0b3I6IG51bGwgYXMgdW5rbm93biBhcyBJU2tpblNlbGVjdG9yQ29uZmlnXG4gICAgfSBhcyBJQ29tcG9uZW50SW5zdGFuY2VDb25maWc7XG5cbiAgICBuYW1lID0gdGhpcy5fcnVuVGltZU5hbWVcbiAgICB0eXBlID0ge1xuICAgICAgICBpZDogdGhpcy5fcnVuVGltZUlkLFxuICAgICAgICBuYW1lOiB0aGlzLl9ydW5UaW1lTmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICBwcm9wczogW10sXG4gICAgICAgIHJlZnM6IFtdLFxuICAgICAgICBza2luczogW10sXG4gICAgICAgIGRlZmF1bHRTa2luOiAwXG4gICAgfSBhcyBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1xuXG4gICAgd2l0aEluc3RhbmNlID0gKGluc3RhbmNlOiBJQ29tcG9uZW50SW5zdGFuY2VDb25maWcpID0+IHtcbiAgICAgICAgdGhpcy5pbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB3aXRoVHlwZSA9ICh0eXBlOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZykgPT4ge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB3aXRoTmFtZSA9IChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aERlZmF1bHRTa2luID0gKGRlZmF1bHRTa2luOiBJU2tpbkNvbmZpZykgPT4ge1xuICAgICAgICB0aGlzLnR5cGUuc2tpbnMucHVzaChkZWZhdWx0U2tpbik7XG4gICAgICAgIHRoaXMudHlwZS5kZWZhdWx0U2tpbiA9IHRoaXMudHlwZS5za2lucy5sZW5ndGggLSAxO1xuICAgICAgICB0aGlzLmluc3RhbmNlLnNraW5TZWxlY3RvciA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdEZWRpY2F0ZWQnLFxuICAgICAgICAgICAgc2tpbjoge1xuICAgICAgICAgICAgICAgIGlkOiBkZWZhdWx0U2tpbi5pZFxuICAgICAgICAgICAgfVxuICAgICAgICB9IGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnXG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aFJlZiA9IChyZWY6IElSZWZDb25maWcpID0+IHtcbiAgICAgICAgdGhpcy50eXBlLnJlZnMucHVzaChyZWYpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB3aXRoQmFzaWNSZWYgPSAocmVmU2VsZWN0b3I6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBuZXdCYXNpY1JlZiA9IHtcbiAgICAgICAgICAgIGlkOiAnJyxcbiAgICAgICAgICAgIG5hbWU6IHJlZlNlbGVjdG9yLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAgICAgc2VsZWN0b3JUeXBlOiAnaWQtYXR0cmlidXRlJyxcbiAgICAgICAgICAgIHNlbGVjdG9yOiByZWZTZWxlY3RvcixcbiAgICAgICAgICAgIGJlaGF2aW9yOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2NvZGUnXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gYXMgSVJlZkNvbmZpZ1xuXG4gICAgICAgIHRoaXMudHlwZS5yZWZzLnB1c2gobmV3QmFzaWNSZWYpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBidWlsZCA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcykpXG4gICAgfVxufVxuIiwgImltcG9ydCB7SVVzZXJGbG93LCB2Ml9JVmFyaWFudENvbmZpZ30gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG4vKipcbiAqIENsb3VkUmVwb3NpdG9yeSAtIFVuaWZpZWQgY2xvdWQgZGF0YSBhY2Nlc3MgbGF5ZXIgZm9yIE15b3AgY29tcG9uZW50c1xuICpcbiAqIFN1cHBvcnRzIGJvdGggdjIgKGRlZmF1bHQpIGFuZCB2MSBtb2RlczpcbiAqIC0gdjI6IFVzZXMgL2NvbnN1bWUgZW5kcG9pbnQgZm9yIGZldGNoaW5nIHZhcmlhbnRzXG4gKiAtIHYxOiBVc2VzIC9mbG93IGVuZHBvaW50IGZvciBmZXRjaGluZyB1c2VyIGZsb3dzXG4gKi9cbmV4cG9ydCBjbGFzcyBDbG91ZFJlcG9zaXRvcnkge1xuICAgIHN0YXRpYyBNYWluID0gbmV3IENsb3VkUmVwb3NpdG9yeSgpO1xuXG4gICAgLy8gdjIgY2FjaGVcbiAgICBwcml2YXRlIHZhcmlhbnRzOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPHYyX0lWYXJpYW50Q29uZmlnPj4gPSB7fTtcblxuICAgIC8vIHYxIGNhY2hlXG4gICAgcHJpdmF0ZSB1c2VyRmxvd3M6IFJlY29yZDxzdHJpbmcsIFByb21pc2U8SVVzZXJGbG93Pj4gPSB7fTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Jhc2VVcmwgPSAnaHR0cHM6Ly9jbG91ZC5teW9wLmRldicpIHtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT0gVjIgTWV0aG9kcyAoRGVmYXVsdCkgPT09PT09PT09PT09XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBhIGNvbXBvbmVudCBpcyBhbHJlYWR5IGNhY2hlZC9wcmVsb2FkZWQgKHYyKVxuICAgICAqL1xuICAgIGlzUHJlbG9hZGVkKGNvbXBvbmVudElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudElkIGluIHRoaXMudmFyaWFudHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2ggYSB2MiBjb21wb25lbnQgdmFyaWFudFxuICAgICAqL1xuICAgIGFzeW5jIGZldGNoQ29tcG9uZW50VjIoY29tcG9uZW50SWQ6IHN0cmluZywgZW52aXJvbm1lbnRJZGVudGlmaWVyPzogc3RyaW5nKTogUHJvbWlzZTx2Ml9JVmFyaWFudENvbmZpZz4ge1xuICAgICAgICBpZiAoIXRoaXMudmFyaWFudHNbY29tcG9uZW50SWRdKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgICAgICAgICAgdGhpcy52YXJpYW50c1tjb21wb25lbnRJZF0gPSBuZXcgUHJvbWlzZShcbiAgICAgICAgICAgICAgICBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLl9iYXNlVXJsfS9jb25zdW1lP2lkPSR7Y29tcG9uZW50SWR9JmVudj0ke2Vudmlyb25tZW50SWRlbnRpZmllcn1gXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGpzb24uaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy52YXJpYW50c1tjb21wb25lbnRJZF07XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09IFYxIE1ldGhvZHMgKExlZ2FjeSkgPT09PT09PT09PT09XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaCBhIHYxIGNvbXBvbmVudCBmcm9tIGEgZmxvd1xuICAgICAqL1xuICAgIGFzeW5jIGZldGNoQ29tcG9uZW50VjEoY29tcG9uZW50SWQ6IHN0cmluZywgZmxvd0lkPzogc3RyaW5nKSB7XG4gICAgICAgIGlmIChmbG93SWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZsb3cgPSBhd2FpdCB0aGlzLmZldGNoRmxvdyhmbG93SWQpO1xuICAgICAgICAgICAgcmV0dXJuIGZsb3cuY29tcG9uZW50cy5maW5kKGMgPT4gYy50eXBlLmlkID09PSBjb21wb25lbnRJZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBmbG93ID0gYXdhaXQgdGhpcy5mZXRjaEF1dG9GbG93KGNvbXBvbmVudElkKTtcbiAgICAgICAgICAgIHJldHVybiBmbG93LmNvbXBvbmVudHNbMF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBmZXRjaEF1dG9GbG93KGNvbXBvbmVudElkOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF0pIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICB0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF0gPSBuZXcgUHJvbWlzZShcbiAgICAgICAgICAgICAgICBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLl9iYXNlVXJsfS9mbG93P2lkPSR7Y29tcG9uZW50SWR9JmF1dG89dHJ1ZWBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoanNvbi5pdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF07XG4gICAgfVxuXG4gICAgYXN5bmMgZmV0Y2hGbG93KGZsb3dJZDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy51c2VyRmxvd3NbZmxvd0lkXSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgICAgICAgIHRoaXMudXNlckZsb3dzW2Zsb3dJZF0gPSBuZXcgUHJvbWlzZShcbiAgICAgICAgICAgICAgICBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLl9iYXNlVXJsfS9mbG93P2lkPSR7Zmxvd0lkfSZyZXNvbHZlPWNvbXBvbmVudHNgXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGpzb24uaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy51c2VyRmxvd3NbZmxvd0lkXTtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT0gQmFja3dhcmQgQ29tcGF0aWJpbGl0eSA9PT09PT09PT09PT1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSBmZXRjaENvbXBvbmVudFYyIG9yIGZldGNoQ29tcG9uZW50VjEgZXhwbGljaXRseVxuICAgICAqIERlZmF1bHRzIHRvIHYxIGJlaGF2aW9yIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgY29kZVxuICAgICAqL1xuICAgIGFzeW5jIGZldGNoQ29tcG9uZW50KGNvbXBvbmVudElkOiBzdHJpbmcsIGZsb3dJZD86IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaENvbXBvbmVudFYxKGNvbXBvbmVudElkLCBmbG93SWQpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgQ2xvdWRSZXBvc2l0b3J5IGluc3RlYWRcbiAqL1xuZXhwb3J0IGNvbnN0IHYyX0Nsb3VkUmVwb3NpdG9yeSA9IENsb3VkUmVwb3NpdG9yeTtcbiIsICJleHBvcnQgY29uc3QgZXhlYyA9IGFzeW5jIChnZXR0ZXI6IGFueSkgPT4ge1xuICAgIHJldHVybiBhd2FpdCBnZXR0ZXIoKVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR08sSUFBTSxTQUFTLE1BQU07QUFDeEIsU0FBTyx1Q0FBdUM7QUFBQSxJQUFRO0FBQUEsSUFBVSxRQUMzRCxDQUFDLElBQUksT0FBTyxnQkFBZ0IsSUFBSSxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxHQUFHLFNBQVMsRUFBRTtBQUFBLEVBQ2xGO0FBQ0o7OztBQ0tPLElBQWUsa0JBQWYsTUFBd0M7QUFBQSxFQVczQyxjQUFjO0FBVmQsOEJBQUssT0FBTztBQWNaLGdDQUFPO0FBSVA7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
544
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3V0aWxzL3V1aWQudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0Jhc2VNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9FeGVjdXRlU2NyaXB0TWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ3VzdG9tUmVmTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvaGVscGVycy9hcHBseVN0eWxlc2hlZXQudHMiLCAiLi4vLi4vLi4vc3JjL2hlbHBlcnMvaWZyYW1lU2tpblVybFRva2VuaXplci50cyIsICIuLi8uLi8uLi9zcmMvaGVscGVycy9jbGFzc0xpc3QudHMiLCAiLi4vLi4vLi4vc3JjL2hlbHBlcnMvY29uZmlnQnVpbGRlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL2luZGV4LnRzIiwgIi4uLy4uLy4uL3NyYy9oZWxwZXJzL0Nsb3VkUmVwb3NpdG9yeS50cyIsICIuLi8uLi8uLi9zcmMvaGVscGVycy9leGVjLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvL1RPRE8gOiByZXVzZSBmcm9tIG9uZSBwbGFjZS5cbi8vIG5lZWRzIHRvIGJlIHVzZWQgaW4gbXlvcC1zZGssIG15b3AtZGFzaGJhb3JkLCBteW9wLXNlcnZlciwgbXlvcC1jbGkgLi5cblxuZXhwb3J0IGNvbnN0IHV1aWR2NCA9ICgpID0+IHtcbiAgICByZXR1cm4gXCIxMDAwMDAwMC0xMDAwLTQwMDAtODAwMC0xMDAwMDAwMDAwMDBcIi5yZXBsYWNlKC9bMDE4XS9nLCBjID0+XG4gICAgICAgICgrYyBeIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMSkpWzBdICYgMTUgPj4gK2MgLyA0KS50b1N0cmluZygxNilcbiAgICApO1xufVxuXG4vLyBDb252ZXJ0IFVVSUQgc3RyaW5nIHRvIGJ5dGVzXG5leHBvcnQgY29uc3QgdXVpZFRvQnl0ZXMgPSAodXVpZDogc3RyaW5nKTogVWludDhBcnJheSA9PiB7XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShcbiAgICAgICAgdXVpZC5yZXBsYWNlKC8tL2csICcnKS5tYXRjaCgvLnsxLDJ9L2cpIS5tYXAoYnl0ZSA9PiBwYXJzZUludChieXRlLCAxNikpXG4gICAgKTtcbn07XG5cbi8vIENvbnZlcnQgYnl0ZXMgdG8gVVVJRCBzdHJpbmdcbmV4cG9ydCBjb25zdCBieXRlc1RvVXVpZCA9IChieXRlczogVWludDhBcnJheSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgaGV4ID0gWy4uLmJ5dGVzXS5tYXAoYiA9PiBiLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKS5qb2luKCcnKTtcbiAgICByZXR1cm4gW1xuICAgICAgICBoZXguc2xpY2UoMCwgOCksXG4gICAgICAgIGhleC5zbGljZSg4LCAxMiksXG4gICAgICAgIGhleC5zbGljZSgxMiwgMTYpLFxuICAgICAgICBoZXguc2xpY2UoMTYsIDIwKSxcbiAgICAgICAgaGV4LnNsaWNlKDIwKVxuICAgIF0uam9pbignLScpO1xufTtcblxuLy8gQmFzZTY0IFVSTC1zYWZlIGVuY29kZVxuZXhwb3J0IGNvbnN0IGJhc2U2NFVybEVuY29kZSA9IChieXRlczogVWludDhBcnJheSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgYmFzZTY0ID0gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmJ5dGVzKSk7XG4gICAgcmV0dXJuIGJhc2U2NC5yZXBsYWNlKC9cXCsvZywgJy0nKS5yZXBsYWNlKC9cXC8vZywgJ18nKS5yZXBsYWNlKC89KyQvLCAnJyk7XG59O1xuXG4vLyBCYXNlNjQgVVJMLXNhZmUgZGVjb2RlXG5leHBvcnQgY29uc3QgYmFzZTY0VXJsRGVjb2RlID0gKHN0cjogc3RyaW5nKTogVWludDhBcnJheSA9PiB7XG4gICAgbGV0IGJhc2U2NCA9IHN0ci5yZXBsYWNlKC8tL2csICcrJykucmVwbGFjZSgvXy9nLCAnLycpO1xuICAgIHdoaWxlIChiYXNlNjQubGVuZ3RoICUgNCkgYmFzZTY0ICs9ICc9JztcbiAgICBjb25zdCBiaW5hcnkgPSBhdG9iKGJhc2U2NCk7XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShiaW5hcnksIGNoYXIgPT4gY2hhci5jaGFyQ29kZUF0KDApKTtcbn07XG5cbi8vIENvbXByZXNzIGFuIGFycmF5IG9mIFVVSURzIGludG8gYSBzaG9ydCBVUkwtc2FmZSBzdHJpbmdcbmV4cG9ydCBjb25zdCBjb21wcmVzc1VVSURzID0gKHV1aWRzOiBzdHJpbmdbXSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgYWxsQnl0ZXMgPSB1dWlkcy5mbGF0TWFwKHV1aWQgPT4gQXJyYXkuZnJvbSh1dWlkVG9CeXRlcyh1dWlkKSkpO1xuICAgIHJldHVybiBiYXNlNjRVcmxFbmNvZGUobmV3IFVpbnQ4QXJyYXkoYWxsQnl0ZXMpKTtcbn07XG5cbi8vIERlY29tcHJlc3MgZnJvbSBVUkwtc2FmZSBzdHJpbmcgYmFjayB0byBhbiBhcnJheSBvZiBVVUlEc1xuZXhwb3J0IGNvbnN0IGRlY29tcHJlc3NVVUlEcyA9IChlbmNvZGVkOiBzdHJpbmcpOiBzdHJpbmdbXSA9PiB7XG4gICAgY29uc3QgYnl0ZXMgPSBiYXNlNjRVcmxEZWNvZGUoZW5jb2RlZCk7XG4gICAgaWYgKGJ5dGVzLmxlbmd0aCAlIDE2ICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaW5wdXQgbGVuZ3RoJyk7XG5cbiAgICBjb25zdCB1dWlkczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAxNikge1xuICAgICAgICB1dWlkcy5wdXNoKGJ5dGVzVG9VdWlkKGJ5dGVzLnNsaWNlKGksIGkgKyAxNikpKTtcbiAgICB9XG4gICAgcmV0dXJuIHV1aWRzO1xufTtcbiIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uL2hvc3RcIjtcbmltcG9ydCB7SVJlZkNvbmZpZ30gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5leHBvcnQgY2xhc3MgTWVzc2FnZURpcmVjdGlvbiB7XG4gICAgc3RhdGljIGRvd24gPSAnZG93bicgYXMgY29uc3RcbiAgICBzdGF0aWMgdXAgPSAndXAnIGFzIGNvbnN0XG59XG5cbmV4cG9ydCB0eXBlIE1lc3NhZ2VEaXJlY3Rpb25PcHRpb24gPSAndXAnIHwgJ2Rvd24nO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BNZXNzYWdlPFQgPSBhbnk+IHtcbiAgICBpZCA9IHV1aWR2NCgpXG5cbiAgICBzdGF0aWMgY3JlYXRlPFQsIFUgZXh0ZW5kcyBuZXcgKC4uLmFyZ3M6IENvbnN0cnVjdG9yUGFyYW1ldGVyczxVPikgPT4gVCA9IHR5cGVvZiB0aGlzPihcbiAgICAgICAgdGhpczogVSxcbiAgICAgICAgLi4uYXJnczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFU+XG4gICAgKTogSW5zdGFuY2VUeXBlPHR5cGVvZiB0aGlzPiB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIG5ldyB0aGlzKC4uLmFyZ3MpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdtZWVzYWdlIGlkIGNyZWF0ZWQnLCB0aGlzLmlkLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtcbiAgICB9XG5cbiAgICBteW9wID0gdHJ1ZVxuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5IHwgc3RyaW5nO1xuXG4gICAgY29udGVudD86IFRcblxuICAgIC8vIFRPRE8gOiBjYW50IGJlIG9wdGlvbmFsIFxuICAgIHNvdXJjZT86IHN0cmluZ1xuICAgIGRlc3RpbmF0aW9uPzogc3RyaW5nXG5cbiAgICByb3V0ZT86IHN0cmluZ1tdXG5cbiAgICByZWY/OiBSZWZcblxuICAgIGRpcmVjdGlvbj86IE1lc3NhZ2VEaXJlY3Rpb25PcHRpb25cblxuICAgIGNsZWFuYWJsZTogYm9vbGVhbiA9IGZhbHNlXG5cbiAgICBpc1R5cGVvZihtc2c6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gbXNnLm1lc3NhZ2VUeXBlID09PSB0aGlzLm1lc3NhZ2VUeXBlXG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXlvcEVsZW1lbnRNZXNzYWdlPFQgPSBhbnk+IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE15b3BCaW5kUmVwbGF5TWVzc2FnZTxUID0gYW55PiBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTxUPiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHJlcGxheVRvSGFuZGxlcj86IHN0cmluZykge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE15b3BCaW5kTWVzc2FnZTxUID0gYW55LCBSIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlID0gYW55PiBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTxUPiB7XG5cbiAgICBwdWJsaWMgYWJzdHJhY3QgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleTtcblxuICAgIHB1YmxpYyBoYW5kbGVyVW5pcXVlSWQgPSB1dWlkdjQoKVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGhhbmRsZXI6IChtZXNzYWdlOiBSKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWYge1xuICAgIHB1YmxpYyBteW9wID0gdHJ1ZTtcblxuICAgIHB1YmxpYyBfX25vblByb3hpZWQ/OiBSZWY7XG5cbiAgICBzdGF0aWMgY3JlYXRlKHNlbGVjdG9yOiBzdHJpbmcsIHJlZkNvbmZpZz86IElSZWZDb25maWcsIGNvbXBvbmVudD86IElNeW9wQ29tcG9uZW50KSB7XG4gICAgICAgIGxldCBfcmVmQ29uZmlnID0gcmVmQ29uZmlnO1xuICAgICAgICBpZiAoIV9yZWZDb25maWcpIHtcbiAgICAgICAgICAgIF9yZWZDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgaWQ6ICcnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICcnLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICAgICAgICBzZWxlY3RvclR5cGU6ICdpZC1hdHRyaWJ1dGUnLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBzZWxlY3RvcixcbiAgICAgICAgICAgICAgICBiZWhhdmlvcjoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY29kZSdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGFzIElSZWZDb25maWdcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFJlZihfcmVmQ29uZmlnLCBjb21wb25lbnQpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWZDb25maWc6IElSZWZDb25maWcsIHB1YmxpYyBjb21wb25lbnQ/OiBJTXlvcENvbXBvbmVudCkge1xuICAgICAgICB0aGlzLl9fbm9uUHJveGllZCA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMsXG4gICAgICAgICAgICBjb21wb25lbnQ6IG51bGwgLy8gaW4gb3JkZXIgdG8gYmUgc2VyaWFsaXphYmxlXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1Jvb3RSZWZ9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZSdcblxuY29uc3QgZnVuY3Rpb25Cb2R5UmVnZXggPSAvKD86ZnVuY3Rpb25cXHMqXFx3KlxccypcXChbXildKlxcKVxccypcXHsoW1xcc1xcU10qPylcXH18KFxcKFteKV0qXFwpXFxzKj0+XFxzKlxceyhbXFxzXFxTXSo/KVxcfSkpXFxzKiQvO1xuY29uc3QgZXhwcmVzc2lvbkJvZHlSZWdleCA9IC9cXChcXHMqW14pXStcXHMqXFwpXFxzKj0+XFxzKiguKykvO1xuXG5leHBvcnQgY29uc3Qgc3RyaXBGdW5jdGlvbiA9IChjb250ZW50OiBzdHJpbmcpID0+IHtcbiAgICBsZXQgbWF0Y2ggPSBjb250ZW50Lm1hdGNoKGZ1bmN0aW9uQm9keVJlZ2V4KTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoWzFdIHx8IG1hdGNoWzNdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBtYXRjaCA9IGNvbnRlbnQubWF0Y2goZXhwcmVzc2lvbkJvZHlSZWdleCk7XG4gICAgICAgIGlmIChtYXRjaClcbiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXS50cmltKCk7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBzY3JpcHRJbnB1dHMgPSB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhblxufSB8IHt9O1xuXG5leHBvcnQgdHlwZSBzY3JpcHRWYXJzPFQ+ID0ge1xuICAgIHNlbmQ6IChkYXRhOiBUKSA9PiB2b2lkO1xuICAgIC8vIGNvbXBsZXRlU3RyZWFtOiAoKSA9PiB2b2lkO1xuICAgIHJvb3RSZWY6IFJvb3RSZWY7XG4gICAgbWFrZVNlcmlhbGl6YWJsZTogdHlwZW9mIG1ha2VTZXJpYWxpemFibGVcbn1cblxuZXhwb3J0IHR5cGUgZXh0ZW5kZWRTY3JpcHRWYXJzPFQsIEk+ID0ge1xuICAgIFtLIGluIGtleW9mIEldOiBJW0tdO1xufSAmIHNjcmlwdFZhcnM8VD5cblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVTY3JpcHRNZXNzYWdlPFQgPSBhbnksIEkgZXh0ZW5kcyBzY3JpcHRJbnB1dHMgPSBhbnk+IGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHN0cmluZywgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZTxUPj4ge1xuXG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXk7XG4gICAgbWVzc2FnZVR5cGUgPSAnRXhlY3V0ZVNjcmlwdE1lc3NhZ2UnO1xuICAgIHNjcmlwdDogc3RyaW5nID0gJydcblxuICAgIHN0YXRpYyByZXBsaWVyS2V5ID0gJ3NlbmQnO1xuICAgIHN0YXRpYyBjb21wbGV0ZVN0cmVhbUtleSA9ICdjb21wbGV0ZVN0cmVhbSc7XG5cbiAgICBjb25zdHJ1Y3RvcihzY3JpcHQ6ICh2YXJzOiBleHRlbmRlZFNjcmlwdFZhcnM8VCwgST4pID0+IFQsIGhhbmRsZXI6IChtZXNzYWdlOiBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQ+KSA9PiB2b2lkID0gKCkgPT4ge1xuICAgIH0sIHB1YmxpYyBzY3JpcHRJbnB1dHM/OiBJKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgICAgICB0aGlzLnNjcmlwdCA9IHNjcmlwdC50b1N0cmluZygpO1xuXG4gICAgICAgIC8vVE9ETzogY2FuIGJlIHJlbW92ZVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBzY3JpcHQudG9TdHJpbmcoKVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBzdHJpcEZ1bmN0aW9uKHRoaXMuY29udGVudCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZTxUID0gYW55PiBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZTxUPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXk7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyOiBzdHJpbmcsIHB1YmxpYyBjb250ZW50OiBUKSB7XG4gICAgICAgIHN1cGVyKHJlcGxheVRvSGFuZGxlcik7XG4gICAgfVxufVxuIiwgImltcG9ydCB7XG4gICAgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UsXG4gICAgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZSxcbiAgICBleHRlbmRlZFNjcmlwdFZhcnMsXG4gICAgc2NyaXB0SW5wdXRzLCBzdHJpcEZ1bmN0aW9uXG59IGZyb20gXCIuL0V4ZWN1dGVTY3JpcHRNZXNzYWdlLnRzXCI7XG5cbmV4cG9ydCB0eXBlIGN1c3RvbVJlZlNjcmlwdElucHV0cyA9IHtcbiAgICBlbGVtZW50SWQ6IHN0cmluZyxcbiAgICByZWY/OiBIVE1MRWxlbWVudCxcbiAgICBfc2NyaXB0Pzogc3RyaW5nLFxuICAgIF9fc2NyaXB0SW5wdXRzPzogT2JqZWN0XG59O1xuXG5leHBvcnQgY2xhc3MgQ3VzdG9tUmVmTWVzc2FnZTxUID0gYW55LCBJIGV4dGVuZHMgc2NyaXB0SW5wdXRzID0gY3VzdG9tUmVmU2NyaXB0SW5wdXRzPiBleHRlbmRzIEV4ZWN1dGVTY3JpcHRNZXNzYWdlPFQsIEkgJiBjdXN0b21SZWZTY3JpcHRJbnB1dHM+IHtcblxuICAgIGNvbnN0cnVjdG9yKHNjcmlwdDogKHZhcnM6IGV4dGVuZGVkU2NyaXB0VmFyczxULCBJICYgY3VzdG9tUmVmU2NyaXB0SW5wdXRzPikgPT4gVCxcbiAgICAgICAgICAgICAgICBwdWJsaWMgc2NyaXB0SW5wdXRzOiBJICYgY3VzdG9tUmVmU2NyaXB0SW5wdXRzLFxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IChtZXNzYWdlOiBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQ+KSA9PiB2b2lkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIH0pIHtcblxuICAgICAgICAvL21vY2sgdmFyc1xuICAgICAgICAvLyBsZXQgcm9vdFJlZiwgZWxlbWVudElkLCBfc2NyaXB0LCBfX3NjcmlwdElucHV0cztcbiAgICAgICAgc3VwZXIoKHtyb290UmVmLCBlbGVtZW50SWQsIF9zY3JpcHQsIF9fc2NyaXB0SW5wdXRzfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVmcyA9IChyb290UmVmLnNoYWRvd1Jvb3QgfHwgcm9vdFJlZi5jb250YWluZXIpLnF1ZXJ5U2VsZWN0b3JBbGwoYFskeydteW9wLWlkJ309JyR7ZWxlbWVudElkfSddYCk7XG4gICAgICAgICAgICBpZiAocmVmcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyAgY29uc3QgcmVmID0gcmVmc1swXTtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHRoaW5rIGFib3V0IGV4cG9zaW5nIFwicmVmc1wiIGFuZCBub3Qgb25seSBcInJlZlwiXG4gICAgICAgICAgICAgICAgLy9mb3IgY2FzZXMgd2hlcmUgdGhlIFJlZiBoYXMgbXVsdGlwbGF0ZSBpbXBsZW1lbnRhdGlvbnNcblxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBfX3NjcmlwdElucHV0cy5yZWYgPSByZWZzWzBdO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZHluYW1pY0Z1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKGByZXR1cm4gKCR7X3NjcmlwdH0pKC4uLmFyZ3VtZW50cylgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZHluYW1pY0Z1bmN0aW9uKF9fc2NyaXB0SW5wdXRzKTtcblxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAvL3JldHVybiBGdW5jdGlvbigncmVmJywgJ3Jvb3RSZWYnLCAuLi5PYmplY3Qua2V5cyhfX3NjcmlwdElucHV0cyksIF9zY3JpcHQhKShyZWYsIHJvb3RSZWYsIC4uLk9iamVjdC52YWx1ZXMoX19zY3JpcHRJbnB1dHMpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGwgYXMgVDtcbiAgICAgICAgfSwgaGFuZGxlcik7XG5cbiAgICAgICAgdGhpcy5zY3JpcHRJbnB1dHMgPSB7XG4gICAgICAgICAgICAuLi5zY3JpcHRJbnB1dHMsXG4gICAgICAgICAgICAvL19zY3JpcHQ6IHN0cmlwRnVuY3Rpb24oc2NyaXB0LnRvU3RyaW5nKCkpLFxuICAgICAgICAgICAgX3NjcmlwdDogc2NyaXB0LnRvU3RyaW5nKClcbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgKiBhcyBDU1MgZnJvbSBcImNzc3R5cGVcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi9ob3N0XCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzLnRzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRNZXNzYWdlfSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcblxuLy8gaWdub3JpbmcgZG9jdW1lbnRhdGlvblxuLyoqIEBpZ25vcmUgKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ1NTUHJvcGVydGllcyBleHRlbmRzIENTUy5Qcm9wZXJ0aWVzPHN0cmluZyB8IG51bWJlcj4ge1xufVxuXG5leHBvcnQgdHlwZSBTdHlsZXNoZWV0RGVmaW5pdGlvbiA9IHsgW2tleTogc3RyaW5nXTogQ1NTUHJvcGVydGllcyB9O1xuXG5leHBvcnQgY29uc3QgYXBwbHlTdHlsZXNoZWV0ID0gKGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIHN0eWxlc2hlZXQ6IFN0eWxlc2hlZXREZWZpbml0aW9uLCBjc3M/OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB0YWdJZCA9IGBteW9wLWNzcy0ke3V1aWR2NCgpfWA7XG4gICAgY29tcG9uZW50LnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCh7cm9vdFJlZiwgX3N0eWxlc2hlZXQsIF90YWdJZCwgX2Nzc30pID0+IHtcbiAgICAgICAgY29uc3Qgc3R5bGVUYWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICBzdHlsZVRhZy50eXBlID0gJ3RleHQvY3NzJztcblxuICAgICAgICAvLyBCdWlsZCB0aGUgQ1NTIHN0cmluZyBmcm9tIHRoZSBzdHlsZXMgb2JqZWN0XG4gICAgICAgIGxldCBjc3NTdHJpbmcgPSBfY3NzO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc2VsZWN0b3IgaW4gX3N0eWxlc2hlZXQpIHtcbiAgICAgICAgICAgIGNzc1N0cmluZyArPSBgJHtzZWxlY3Rvcn0geyBgO1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IF9zdHlsZXNoZWV0W3NlbGVjdG9yXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gcHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgIGNzc1N0cmluZyArPSBgJHtwcm9wZXJ0eX06ICR7cHJvcGVydGllc1twcm9wZXJ0eV19OyBgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3NzU3RyaW5nICs9ICd9ICc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdGhlIENTUyBzdHJpbmcgYXMgdGhlIGNvbnRlbnQgb2YgdGhlIDxzdHlsZT4gZWxlbWVudFxuICAgICAgICBzdHlsZVRhZy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3NTdHJpbmcpKTtcbiAgICAgICAgc3R5bGVUYWcuaWQgPSBfdGFnSWQ7XG4gICAgICAgIC8vIEFwcGVuZCB0aGUgPHN0eWxlPiBlbGVtZW50XG4gICAgICAgIChyb290UmVmLnNoYWRvd1Jvb3QgfHwgcm9vdFJlZi5jb250YWluZXIpLmFwcGVuZENoaWxkKHN0eWxlVGFnKTtcblxuICAgIH0sICgpID0+IHtcbiAgICB9LCB7XG4gICAgICAgIF9zdHlsZXNoZWV0OiBzdHlsZXNoZWV0LFxuICAgICAgICBfY3NzIDogY3NzID8gY3NzIDogJycsXG4gICAgICAgIF90YWdJZDogdGFnSWRcbiAgICB9KSk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKHtyb290UmVmLCBfdGFnSWR9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gKHJvb3RSZWYuc2hhZG93Um9vdCB8fCBkb2N1bWVudCkuZ2V0RWxlbWVudEJ5SWQoX3RhZ0lkKTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICB9LCB7XG4gICAgICAgICAgICBfdGFnSWQ6IHRhZ0lkXG4gICAgICAgIH0pKVxuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IGFwcGx5U3R5bGVzaGVldExpbmsgPSAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgbGluazogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgdGFnSWQgPSBgbXlvcC1jc3MtJHt1dWlkdjQoKX1gO1xuICAgIGNvbXBvbmVudC5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoe3Jvb3RSZWYsIF90YWdJZCwgX2xpbmt9KSA9PiB7XG4gICAgICAgIGNvbnN0IGxpbmtFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgICBsaW5rRWxlbWVudC5pZCA9IF90YWdJZDtcbiAgICAgICAgbGlua0VsZW1lbnQucmVsID0gJ3N0eWxlc2hlZXQnO1xuICAgICAgICBsaW5rRWxlbWVudC5ocmVmID0gX2xpbms7XG4gICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobGlua0VsZW1lbnQpO1xuXG4gICAgICAgIC8vIEFwcGVuZCB0aGUgPHN0eWxlPiBlbGVtZW50XG4gICAgICAgIChyb290UmVmLnNoYWRvd1Jvb3QgfHwgcm9vdFJlZi5jb250YWluZXIpLmFwcGVuZENoaWxkKGxpbmtFbGVtZW50KTtcbiAgICB9LCAoKSA9PiB7XG4gICAgfSwge1xuICAgICAgICBfbGluayA6IGxpbmssXG4gICAgICAgIF90YWdJZDogdGFnSWRcbiAgICB9KSk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKHtyb290UmVmLCBfdGFnSWR9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gKHJvb3RSZWYuc2hhZG93Um9vdCB8fCBkb2N1bWVudCkuZ2V0RWxlbWVudEJ5SWQoX3RhZ0lkKTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICB9LCB7XG4gICAgICAgICAgICBfdGFnSWQ6IHRhZ0lkXG4gICAgICAgIH0pKVxuICAgIH1cbn1cbiIsICJpbXBvcnQge0lJZnJhbWVMb2FkZXJDb25maWcsIElTa2luQ29uZmlnfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmV4cG9ydCB0eXBlIFRva2VuTWFwID0gUmVjb3JkPHN0cmluZywgc3RyaW5nfCBudW1iZXI+XG5cbmNvbnN0IHJlcGxhY2VUb2tlbnMgPSAoaW5wdXQ6IHN0cmluZywgdG9rZW5NYXA6IFRva2VuTWFwKTogc3RyaW5nID0+IHtcbiAgICAvLyBDcmVhdGUgYSByZWdleCBwYXR0ZXJuIGZyb20gdGhlIGtleXMgb2YgdGhlIHRva2VuTWFwXG4gICAgY29uc3QgcGF0dGVybiA9IG5ldyBSZWdFeHAoT2JqZWN0LmtleXModG9rZW5NYXApLmpvaW4oJ3wnKSwgJ2cnKTtcblxuICAgIC8vIFJlcGxhY2UgdG9rZW5zIGluIHRoZSBpbnB1dCBzdHJpbmcgdXNpbmcgdGhlIHJlZ2V4XG4gICAgcmV0dXJuIGlucHV0LnJlcGxhY2UocGF0dGVybiwgKG1hdGNoZWQpID0+IHtcbiAgICAgICAgLy8gUmV0dXJuIHRoZSByZXBsYWNlbWVudCB2YWx1ZSBmcm9tIHRoZSB0b2tlbk1hcFxuICAgICAgICByZXR1cm4gKHRva2VuTWFwW21hdGNoZWRdIHx8IG1hdGNoZWQpLnRvU3RyaW5nKCk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVJZnJhbWVTa2luQnlUb2tlbml6ZXIgPSAoc2VsZWN0ZWRTa2luOiBJU2tpbkNvbmZpZywgdG9rZW5NYXA6IFRva2VuTWFwKSA9PiB7XG4gICAgY29uc3QgdHlwZWRTa2luQ29uZmlnID0gKHNlbGVjdGVkU2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZylcbiAgICBpZiAodHlwZWRTa2luQ29uZmlnLnR5cGUgIT09ICdJZnJhbWVMb2FkZXInKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgaWZyYW1lU2tpblVybFRva2VuaXplciByZWNlaXZlZCBza2luIHdpdGggbG9hZGVyIHR5cGUgXCIke3R5cGVkU2tpbkNvbmZpZy50eXBlfVwiLCBjdXJyZW50bHkgb25seSBcIklmcmFtZUxvYWRlclwiIGlzIHN1cHBvcnRlZGApXG4gICAgfVxuXG4gICAgc2VsZWN0ZWRTa2luLmxvYWRlciA9IHtcbiAgICAgICAgLi4uc2VsZWN0ZWRTa2luLmxvYWRlclxuICAgIH1cblxuICAgIHNlbGVjdGVkU2tpbi5sb2FkZXIudXJsID0gcmVwbGFjZVRva2VucyhzZWxlY3RlZFNraW4ubG9hZGVyLnVybCwgdG9rZW5NYXApO1xuXG4gICAgcmV0dXJuIHNlbGVjdGVkU2tpbjtcbn1cblxuZXhwb3J0IGNvbnN0IGNoYW5nZVNraW5VcmxCeVRva2VuaXplciA9ICh0b2tlbk1hcDogVG9rZW5NYXApID0+IHtcbiAgICByZXR1cm4gYXN5bmMgKHNlbGVjdGVkU2tpbjogSVNraW5Db25maWcpID0+IHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUlmcmFtZVNraW5CeVRva2VuaXplcihzZWxlY3RlZFNraW4sIHRva2VuTWFwKTtcbiAgICB9XG59IiwgImltcG9ydCB7Q3VzdG9tUmVmTWVzc2FnZX0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vaG9zdFwiO1xuXG4vLyBjb25zdCBzcGFjZSA9ICcgJztcbi8vIGV4cG9ydCBjb25zdCBnZXRDbGFzc2VzID0gYXN5bmMgKGNvbm5lY3RlZFJlZjogUmVmKTogUHJvbWlzZTxzdHJpbmdbXT4gPT4gKGF3YWl0IGV4ZWMoYWN0QXM8SFRNTERpdkVsZW1lbnQ+KGNvbm5lY3RlZFJlZikuY2xhc3NMaXN0KSkudmFsdWUuc3BsaXQoc3BhY2UpO1xuLy8gZXhwb3J0IGNvbnN0IGFkZENsYXNzID0gYXN5bmMgKGNvbm5lY3RlZFJlZjogUmVmLCBjbGFzc05hbWU6IHN0cmluZykgPT4ge1xuLy8gICAgIGNvbnN0IGNsYXNzZXMgPSBhd2FpdCBnZXRDbGFzc2VzKGNvbm5lY3RlZFJlZik7XG4vLyAgICAgY2xhc3Nlcy5pbmNsdWRlcyhjbGFzc05hbWUpIHx8IGNsYXNzZXMucHVzaChjbGFzc05hbWUpO1xuLy8gICAgIC8vIEB0cy1pZ25vcmVcbi8vICAgICBjb25uZWN0ZWRSZWYuY2xhc3NMaXN0ID0gY2xhc3Nlcy5qb2luKHNwYWNlKTtcbi8vIH1cbi8vIGV4cG9ydCBjb25zdCByZW1vdmVDbGFzcyA9IGFzeW5jIChjb25uZWN0ZWRSZWY6IFJlZiwgY2xhc3NOYW1lOiBzdHJpbmcsKSA9PiB7XG4vLyAgICAgbGV0IGNsYXNzZXMgPSBhd2FpdCBnZXRDbGFzc2VzKGNvbm5lY3RlZFJlZik7XG4vLyAgICAgLy8gQHRzLWlnbm9yZVxuLy8gICAgIGNvbm5lY3RlZFJlZi5jbGFzc0xpc3QgPSBjbGFzc2VzLmZpbHRlcihjID0+IGMgIT09IGNsYXNzTmFtZSkuam9pbihzcGFjZSk7XG4vLyB9XG4vL1xuLy9cblxuZXhwb3J0IGNvbnN0IGFkZENsYXNzID0gKGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIGNsYXNzTmFtZTogc3RyaW5nLCBteW9wSWQ6IHN0cmluZykgPT4ge1xuICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDdXN0b21SZWZNZXNzYWdlKCh7cmVmLCBfY2xhc3NOYW1lfSkgPT4ge1xuICAgICAgICByZWY/LmNsYXNzTGlzdC5hZGQoX2NsYXNzTmFtZSk7XG4gICAgfSwge1xuICAgICAgICBlbGVtZW50SWQ6IG15b3BJZCxcbiAgICAgICAgX2NsYXNzTmFtZTogY2xhc3NOYW1lXG4gICAgfSkpO1xufVxuXG5leHBvcnQgY29uc3QgcmVtb3ZlQ2xhc3MgPSAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgY2xhc3NOYW1lOiBzdHJpbmcsIG15b3BJZDogc3RyaW5nKSA9PiB7XG4gICAgY29tcG9uZW50LnNlbmQobmV3IEN1c3RvbVJlZk1lc3NhZ2UoKHtyZWYsIF9jbGFzc05hbWV9KSA9PiB7XG4gICAgICAgIHJlZj8uY2xhc3NMaXN0LnJlbW92ZShfY2xhc3NOYW1lKTtcbiAgICB9LCB7XG4gICAgICAgIGVsZW1lbnRJZDogbXlvcElkLFxuICAgICAgICBfY2xhc3NOYW1lOiBjbGFzc05hbWVcbiAgICB9KSk7XG59IiwgImltcG9ydCB7XG4gICAgSUNvbXBvbmVudENvbmZpZyxcbiAgICBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJQ29tcG9uZW50SW5zdGFuY2VDb25maWcsIElIVE1MTG9hZGVyQ29uZmlnLCBJUmVmQ29uZmlnLFxuICAgIElTa2luTG9hZGVyQ29uZmlnLFxuICAgIElTa2luU2VsZWN0b3JDb25maWcsXG4gICAgSURlZGljYXRlZFNraW5Db25maWcsIElTa2luQ29uZmlnXG59IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi4vdXRpbHMvdXRpbHMudHNcIjtcblxuZXhwb3J0IGNsYXNzIFNraW5Db25maWcgaW1wbGVtZW50cyBJU2tpbkNvbmZpZyB7XG4gICAgX3J1blRpbWVJbnN0YW5jZUlkID0gJ3J1bnRpbWUtaW5zdGFuY2UtaWQtJyArIHV1aWR2NCgpO1xuICAgIF9ydW5UaW1lSWQgPSAncnVudGltZS1pZC0nICsgdXVpZHY0KCk7XG4gICAgX3J1blRpbWVOYW1lID0gJ3J1bnRpbWUtbmFtZS0nICsgdXVpZHY0KCk7XG5cbiAgICBzdGF0aWMgY3JlYXRlID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFNraW5Db25maWcoKTtcbiAgICB9XG5cbiAgICBpZCA9IHRoaXMuX3J1blRpbWVJZDtcbiAgICBuYW1lID0gdGhpcy5fcnVuVGltZU5hbWU7XG4gICAgZGVzY3JpcHRpb24gPSAnJztcbiAgICBsb2FkZXIgPSBudWxsIGFzIHVua25vd24gYXMgSVNraW5Mb2FkZXJDb25maWc7XG5cbiAgICB3aXRoTG9hZGVyID0gKGxvYWRlcjogSVNraW5Mb2FkZXJDb25maWcpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkZXIgPSBsb2FkZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhIVE1MTG9hZGVyID0gKGxvYWRlcjogT21pdDxJSFRNTExvYWRlckNvbmZpZywgJ3R5cGUnPikgPT4ge1xuICAgICAgICBsb2FkZXIudHlwZSA9ICdIVE1MTG9hZGVyJztcbiAgICAgICAgdGhpcy5sb2FkZXIgPSBsb2FkZXIgYXMgSUhUTUxMb2FkZXJDb25maWc7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGJ1aWxkID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb21wb25lbnRDb25maWcgaW1wbGVtZW50cyBJQ29tcG9uZW50Q29uZmlnIHtcbiAgICBfcnVuVGltZUluc3RhbmNlSWQgPSAncnVudGltZS1pbnN0YW5jZS1pZC0nICsgdXVpZHY0KCk7XG4gICAgX3J1blRpbWVJZCA9ICdydW50aW1lLWlkLScgKyB1dWlkdjQoKTtcbiAgICBfcnVuVGltZU5hbWUgPSAncnVudGltZS1uYW1lLScgKyB1dWlkdjQoKTtcblxuICAgIHN0YXRpYyBjcmVhdGUgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50Q29uZmlnKCk7XG4gICAgfVxuXG4gICAgaW5zdGFuY2UgPSB7XG4gICAgICAgIGlkOiB0aGlzLl9ydW5UaW1lSW5zdGFuY2VJZCxcbiAgICAgICAgY29tcG9uZW50SWQ6IHRoaXMuX3J1blRpbWVJZCxcbiAgICAgICAgY29tcG9uZW50TmFtZTogdGhpcy5fcnVuVGltZU5hbWUsXG4gICAgICAgIHNraW5TZWxlY3RvcjogbnVsbCBhcyB1bmtub3duIGFzIElTa2luU2VsZWN0b3JDb25maWdcbiAgICB9IGFzIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZztcblxuICAgIG5hbWUgPSB0aGlzLl9ydW5UaW1lTmFtZVxuICAgIHR5cGUgPSB7XG4gICAgICAgIGlkOiB0aGlzLl9ydW5UaW1lSWQsXG4gICAgICAgIG5hbWU6IHRoaXMuX3J1blRpbWVOYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgIHByb3BzOiBbXSxcbiAgICAgICAgcmVmczogW10sXG4gICAgICAgIHNraW5zOiBbXSxcbiAgICAgICAgZGVmYXVsdFNraW46IDBcbiAgICB9IGFzIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnXG5cbiAgICB3aXRoSW5zdGFuY2UgPSAoaW5zdGFuY2U6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZykgPT4ge1xuICAgICAgICB0aGlzLmluc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhUeXBlID0gKHR5cGU6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnKSA9PiB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhOYW1lID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB3aXRoRGVmYXVsdFNraW4gPSAoZGVmYXVsdFNraW46IElTa2luQ29uZmlnKSA9PiB7XG4gICAgICAgIHRoaXMudHlwZS5za2lucy5wdXNoKGRlZmF1bHRTa2luKTtcbiAgICAgICAgdGhpcy50eXBlLmRlZmF1bHRTa2luID0gdGhpcy50eXBlLnNraW5zLmxlbmd0aCAtIDE7XG4gICAgICAgIHRoaXMuaW5zdGFuY2Uuc2tpblNlbGVjdG9yID0ge1xuICAgICAgICAgICAgdHlwZTogJ0RlZGljYXRlZCcsXG4gICAgICAgICAgICBza2luOiB7XG4gICAgICAgICAgICAgICAgaWQ6IGRlZmF1bHRTa2luLmlkXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gYXMgSURlZGljYXRlZFNraW5Db25maWdcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB3aXRoUmVmID0gKHJlZjogSVJlZkNvbmZpZykgPT4ge1xuICAgICAgICB0aGlzLnR5cGUucmVmcy5wdXNoKHJlZik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhCYXNpY1JlZiA9IChyZWZTZWxlY3Rvcjogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld0Jhc2ljUmVmID0ge1xuICAgICAgICAgICAgaWQ6ICcnLFxuICAgICAgICAgICAgbmFtZTogcmVmU2VsZWN0b3IsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgICAgICBzZWxlY3RvclR5cGU6ICdpZC1hdHRyaWJ1dGUnLFxuICAgICAgICAgICAgc2VsZWN0b3I6IHJlZlNlbGVjdG9yLFxuICAgICAgICAgICAgYmVoYXZpb3I6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnY29kZSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBhcyBJUmVmQ29uZmlnXG5cbiAgICAgICAgdGhpcy50eXBlLnJlZnMucHVzaChuZXdCYXNpY1JlZik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGJ1aWxkID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzKSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4vTXlvcE1lc3NhZ2VzXCI7XG5cbmV4cG9ydCAqIGZyb20gJy4vTXlvcEVsZW1lbnRSZWYnO1xuZXhwb3J0ICogZnJvbSAnLi9iYXNlTWVzc2FnZUhhbmRsZXInO1xuZXhwb3J0ICogZnJvbSAnLi9CYXNlTXlvcFNESyc7XG5cbmV4cG9ydCB0eXBlIENsZWFudXBIYW5kbGVyID0gKCkgPT4gdm9pZFxuXG5leHBvcnQgdHlwZSBEaWN0aW9uYXJ5PFQ+ID0geyBba2V5OiBzdHJpbmddOiBUOyB9O1xuXG4vL2V4cG9ydCB0eXBlIFNraW5Mb2FkZXJUeXBlID0gJ0lmcmFtZUxvYWRlcicgfCAnV2ViQ29tcG9uZW50TG9hZGVyJyB8ICdIVE1MTG9hZGVyJyB8IHN0cmluZztcblxuZXhwb3J0IGNvbnN0IFNraW5Mb2FkZXJzID0ge1xuICAgIFwiSWZyYW1lTG9hZGVyXCI6IFwiSWZyYW1lTG9hZGVyXCIsXG4gICAgXCJXZWJDb21wb25lbnRMb2FkZXJcIjogXCJXZWJDb21wb25lbnRMb2FkZXJcIixcbiAgICBcIkhUTUxMb2FkZXJcIjogXCJIVE1MTG9hZGVyXCIsXG4gICAgXCJNaW5pbWl6ZWRMb2FkZXJcIjogXCJNaW5pbWl6ZWRMb2FkZXJcIlxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFNraW5Mb2FkZXJUeXBlID0ga2V5b2YgdHlwZW9mIFNraW5Mb2FkZXJzO1xuXG5leHBvcnQgdHlwZSBQcm9wVHlwZSA9ICdhbnknIHwgJ3N0cmluZycgfCAnbnVtYmVyJyB8IHN0cmluZzsgLy8gVE9ETyA6IDxcbmV4cG9ydCB0eXBlIFJlZlNlbGVjdG9yVHlwZSA9ICdpZC1hdHRyaWJ1dGUnIHwgJ2Nzcy1zZWxlY3RvcicgfCAneHBhdGgnIHwgc3RyaW5nO1xuXG5leHBvcnQgY29uc3QgTG9hZGVyRnJhbWV3b3JrcyA9IHtcbiAgICBcInJlYWN0XCI6IFwicmVhY3RcIixcbiAgICBcInZ1ZVwiOiBcInZ1ZVwiLFxuICAgIFwiYW5ndWxhclwiOiBcImFuZ3VsYXJcIixcbn0gYXMgY29uc3RcbmV4cG9ydCB0eXBlIExvYWRlckZyYW1ld29ya1R5cGUgPSBrZXlvZiB0eXBlb2YgTG9hZGVyRnJhbWV3b3JrcztcblxuZXhwb3J0IGludGVyZmFjZSBJV2ViQ29tcG9uZW50TG9hZGVyQ29uZmlnIGV4dGVuZHMgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFwiV2ViQ29tcG9uZW50TG9hZGVyXCI7XG4gICAgdXJsOiBzdHJpbmcsXG4gICAgdGFnOiBzdHJpbmcsXG4gICAgZnJhbWV3b3JrPzogTG9hZGVyRnJhbWV3b3JrVHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElJZnJhbWVMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJJZnJhbWVMb2FkZXJcIjtcbiAgICB1cmw6IHN0cmluZ1xuICAgIGF1dG9IZWlnaHQ6IGJvb2xlYW5cbiAgICBoZWlnaHQ/OiBzdHJpbmdcbiAgICB3aWR0aD86IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgU2hhZG93Um9vdE1vZGVUeXBlID0ge1xuICAgIFwib3BlblwiOiBcIm9wZW5cIixcbiAgICBcImNsb3NlZFwiOiBcImNsb3NlZFwiLFxuICAgIFwibm9uZVwiOiBcIm5vbmVcIixcbiAgICBcImxvY2FsRnJhbWVcIjogXCJsb2NhbEZyYW1lXCJcbn0gYXMgY29uc3Q7XG5cblxuZXhwb3J0IGludGVyZmFjZSBJSFRNTExvYWRlckNvbmZpZyBleHRlbmRzIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBcIkhUTUxMb2FkZXJcIjtcbiAgICBIVE1MOiBzdHJpbmc7XG4gICAgLy9UT0RPOiByZW5hbWUocm9vdE1vZGUvY3VzdG9tRWxlbWVudE1vZGUpICsgZGIgbWlncmF0aW9uXG4gICAgc2hhZG93Um9vdE1vZGU/OiBrZXlvZiB0eXBlb2YgU2hhZG93Um9vdE1vZGVUeXBlO1xuICAgIGF1dG9IZWlnaHQ/OiBib29sZWFuO1xuICAgIGhlaWdodD86IHN0cmluZztcbiAgICB3aWR0aD86IHN0cmluZztcbn1cblxuLy9mb3IgaW50ZXJuYWwgZGFzaGJvYXJkIHVzYWdlXG5leHBvcnQgaW50ZXJmYWNlIElNaW5pbWl6ZWRMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJNaW5pbWl6ZWRMb2FkZXJcIjtcbn1cblxuaW50ZXJmYWNlIERhc2hib2FyZE9iamVjdCB7XG4gICAgX3RlbXBfY2xpZW50X2lkPzogc3RyaW5nLFxufVxuXG50eXBlIEV4dGVuZDxULCBVPiA9IFQgJiBVO1xuXG50eXBlIEV4dGVuZFJlY3Vyc2l2ZWx5PFQsIEU+ID0ge1xuICAgIFtLIGluIGtleW9mIEVdOiBFW0tdO1xufSAmIHtcbiAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIG9iamVjdFxuICAgICAgICA/IEV4dGVuZFJlY3Vyc2l2ZWx5PFRbS10sIEU+XG4gICAgICAgIDogVFtLXTtcbn07XG5cbmV4cG9ydCB0eXBlIElEYXNoYm9hcmQ8VD4gPSBFeHRlbmRSZWN1cnNpdmVseTxULCBEYXNoYm9hcmRPYmplY3Q+O1xuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBTa2luTG9hZGVyVHlwZVxuXG4gICAgW2tleTogc3RyaW5nXTogYW55OyAvLyBBbGxvd3MgYW55IGFkZGl0aW9uYWwgcHJvcGVydGllc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lSZWxlYXNlTWV0YWRhdGEge1xuICAgIGVudmlyb25tZW50SWQ6IHN0cmluZztcbiAgICBlbnZpcm9ubWVudElkZW50aWZpZXI6IHN0cmluZztcbiAgICAvL1xuICAgIC8vIHVwZGF0ZWRPbj86IHN0cmluZ1xuICAgIC8vIHVwZGF0ZWRCeT86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lWYXJpYW50Q29uZmlnIGV4dGVuZHMgdjJfSU15b3BTdG9yZWRPYmplY3Qge1xuICAgIGxvYWRlcjogSVNraW5Mb2FkZXJDb25maWdcbiAgICBjb21wb25lbnRJZDogc3RyaW5nO1xuXG4gICAgcmVsZWFzZXM/OiB2Ml9JUmVsZWFzZU1ldGFkYXRhW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2tpbkNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICBsb2FkZXI6IElTa2luTG9hZGVyQ29uZmlnXG4gICAgY3JlYXRlZEJ5Pzogc3RyaW5nXG4gICAgY3JlYXRlZE9uPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSVNraW5Db25maWcgZXh0ZW5kcyBJU2tpbkNvbmZpZyB7XG4gICAgY29tcG9uZW50SWQ6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNZXNzYWdlUHJvcENvbmZpZyBleHRlbmRzIElQcm9wQ29uZmlnIHtcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElCaW5kTWVzc2FnZVByb3BDb25maWcgZXh0ZW5kcyBJUHJvcENvbmZpZyB7XG4gICAgdHlwZTogUHJvcFR5cGVcbiAgICBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXlcbn1cblxuZXhwb3J0IGNvbnN0IFByb3BNZXNzYWdlTW9kZXMgPSB7XG4gICAgXCJpbnB1dFwiOiBcImlucHV0XCIsXG4gICAgXCJvdXRwdXRcIjogXCJvdXRwdXRcIlxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFByb3BDb25maWdCZWhhdmlvclR5cGVzID0ge1xuICAgIFwibWVzc2FnZVwiOiBcIm1lc3NhZ2VcIixcbiAgICBcImNvZGVcIjogXCJjb2RlXCJcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BNZXNzYWdlQmVoYXZpb3JQYXJhbSB7XG4gICAgdmFsdWU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQmVoYXZpb3Ige1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQ29kZUJlaGF2aW9yIGV4dGVuZHMgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZTogXCJjb2RlXCJcbiAgICByZW1hcD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wTWVzc2FnZUJlaGF2aW9yIGV4dGVuZHMgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZTogXCJtZXNzYWdlXCJcbiAgICBtZXNzYWdlOiBNeW9wTWVzc2FnZUtleVxuICAgIHJlZjogc3RyaW5nLCAvL1RPRE8gbWFrZSBpdCBpZFxuICAgIHBhcmFtczogSVByb3BNZXNzYWdlQmVoYXZpb3JQYXJhbVtdXG4gICAgbW9kZToga2V5b2YgdHlwZW9mIFByb3BNZXNzYWdlTW9kZXNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUHJvcENvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIGJlaGF2aW9yOiBJUHJvcEJlaGF2aW9yXG59XG5cblxuZXhwb3J0IGNsYXNzIFJlZkJlaGF2aW9yVHlwZSB7XG4gICAgc3RhdGljIGNvZGUgPSAnY29kZScgYXMgY29uc3RcbiAgICBzdGF0aWMgY29tcG9uZW50ID0gJ2NvbXBvbmVudCcgYXMgY29uc3Rcbn1cblxuZXhwb3J0IHR5cGUgSVJlZkJlaGF2aW9yVHlwZSA9ICdjb2RlJyB8ICdjb21wb25lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogSVJlZkJlaGF2aW9yVHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnRSZWZCZWhhdmlvciBleHRlbmRzIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogJ2NvbXBvbmVudCdcbiAgICBjb21wb25lbnRJZDogc3RyaW5nXG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIFByb3BlcnR5IGluc3RhbmNlIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuXG4gICAgICovXG4gICAgaW5zdGFuY2U6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb2RlUmVmQmVoYXZpb3IgZXh0ZW5kcyBJUmVmQmVoYXZpb3Ige1xuICAgIHR5cGU6ICdjb2RlJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElSZWZDb25maWcge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgc2VsZWN0b3JUeXBlOiBSZWZTZWxlY3RvclR5cGVcbiAgICBzZWxlY3Rvcjogc3RyaW5nXG4gICAgYmVoYXZpb3I6IElSZWZCZWhhdmlvclxufVxuXG4vKipcbiAqIEV4cGVyaWVuY2Ugc2VnbWVudCBydWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2VTZWdtZW50UnVsZSB7XG4gICAgcHJvcGVydHk6IHN0cmluZztcbiAgICBvcGVyYXRvcjogc3RyaW5nO1xuICAgIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBBL0Igc3BsaXQgdmVyc2lvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlQUJTcGxpdFZlcnNpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgcGVyY2VudGFnZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIEV4cGVyaWVuY2UgQS9CIHNwbGl0IGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZUFCU3BsaXQge1xuICAgIHZlcnNpb25zOiBJRXhwZXJpZW5jZUFCU3BsaXRWZXJzaW9uW107XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBzZWdtZW50IGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZVNlZ21lbnQge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgcnVsZXM6IElFeHBlcmllbmNlU2VnbWVudFJ1bGVbXTtcbiAgICB1c2VBYjogYm9vbGVhbjtcbiAgICBjb21wb25lbnRWYXJpYW50czogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG4gICAgYWJTcGxpdD86IElFeHBlcmllbmNlQUJTcGxpdDtcbiAgICBzdGlja3lQcm9wZXJ0aWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBkZWZpbml0aW9uIGNvbmZpZyAodjIpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2VEZWZpbml0aW9uQ29uZmlnIGV4dGVuZHMgdjJfSU15b3BTdG9yZWRPYmplY3Qge1xuICAgIC8qKiBTZWxlY3RlZCBjb21wb25lbnQgSURzICovXG4gICAgY29tcG9uZW50czogc3RyaW5nW107XG4gICAgLyoqIFNlZ21lbnQgY29uZmlndXJhdGlvbnMgKi9cbiAgICBzZWdtZW50czogSUV4cGVyaWVuY2VTZWdtZW50W107XG4gICAgLyoqIEZhbGxiYWNrIHZhcmlhbnQgcGVyIGNvbXBvbmVudCAqL1xuICAgIGZhbGxiYWNrOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIC8qKiBUYWdzICovXG4gICAgdGFnczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgLy8gcHJvcHM6IFJlY29yZDxzdHJpbmcsIElQcm9wQ29uZmlnPiAvL2lkIC0gdHlwZVxuICAgIC8vIHJlZnM6IFJlY29yZDxzdHJpbmcsIElSZWZDb25maWc+LFxuICAgIC8vIHNraW5zOiBSZWNvcmQ8c3RyaW5nLCBJU2tpbkNvbmZpZz5cbiAgICBwcm9wczogSVByb3BDb25maWdbXSxcbiAgICByZWZzOiBJUmVmQ29uZmlnW10sXG4gICAgc2tpbnM6IElTa2luQ29uZmlnW10sXG4gICAgZGVmYXVsdFNraW46IG51bWJlcjtcblxuICAgIC8vVE9ETyA6IHRoaW5rIGFib3V0IHRoYXRcbiAgICAvL3Jlc29sdmVkRGVmaW5pdGlvbnM/OiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1tdXG4gICAgLy9UT0RPIDogbW92ZSB0byBiYXNlIGNsYXNzICggSVN0b3JhYmxlSXRlbSBvciBzby4uLilcblxuICAgIGNyZWF0ZWRPbj86IHN0cmluZ1xuICAgIGNyZWF0ZWRCeT86IHN0cmluZ1xuICAgIHVwZGF0ZWRCeT86IHN0cmluZ1xufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSUJhc2VNeW9wT2JqZWN0IHtcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lNeW9wU3RvcmVkT2JqZWN0IGV4dGVuZHMgdjJfSUJhc2VNeW9wT2JqZWN0IHtcbiAgICB1cGRhdGVkT24/OiBzdHJpbmdcbiAgICB1cGRhdGVkQnk/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyBleHRlbmRzIHYyX0lNeW9wU3RvcmVkT2JqZWN0IHtcbiAgICB2YXJpYW50c19pZHM6IHN0cmluZ1tdLFxuICAgIERUT3M6IHYyX0lEVE9bXSxcbiAgICB0YWdzOiBzdHJpbmdbXSxcblxuICAgIC8vXG4gICAgdmFyaWFudHNfbmFtZXM6IHN0cmluZ1tdLFxuICAgIHZhcmlhbnRzX2RhdGE6IHtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBpZDogc3RyaW5nXG4gICAgICAgIHVwZGF0ZWRPbj86IHN0cmluZ1xuICAgICAgICB1cGRhdGVkQnk/OiBzdHJpbmdcbiAgICAgICAgaGFzX3JlbGVhc2VzPzogYm9vbGVhblxuICAgIH1bXSxcblxuICAgIHByZXZpZXdfdmFyaWFudDogdjJfSVZhcmlhbnRDb25maWc7XG4gICAgZXh0cmE/OiB7XG4gICAgICAgIGZpcnN0VmFyaWFudDogdjJfSVZhcmlhbnRDb25maWc7IC8vd2hlbiBuZXcgY29tcG9uZW50IGNyZWF0ZXMgYXQgdGhlIGNsaWVudFxuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JRFRPIGV4dGVuZHMgdjJfSU15b3BTdG9yZWRPYmplY3Qge1xuICAgIGRhdGE6IG9iamVjdFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luSW5zdGFuY2VDb25maWcge1xuICAgIGlkOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2tpblNlbGVjdG9yQ29uZmlnIHtcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgU2tpblNlbGVjdG9yVHlwZXMsXG4gICAgLy9za2luczogSVNraW5JbnN0YW5jZUNvbmZpZ1tdXG59XG5cbmV4cG9ydCBjb25zdCBTZWdtZW50VHlwZSA9IHtcbiAgICBcIkZ1bmN0aW9uUmVzdWx0XCI6IFwiRnVuY3Rpb25SZXN1bHRcIixcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlZ21lbnRJbnN0YW5jZSB7XG4gICAgc2VnbWVudElkOiBzdHJpbmc7XG4gICAgc2tpblNlbGVjdG9yOiBJU2tpblNlbGVjdG9yQ29uZmlnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlZ21lbnREZWZpbml0aW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBTZWdtZW50VHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElGdW5jdGlvblJlc3VsdHNTZWdtZW50IGV4dGVuZHMgSVNlZ21lbnREZWZpbml0aW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHR5cGU6IHR5cGVvZiBTZWdtZW50VHlwZS5GdW5jdGlvblJlc3VsdFxuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICBmdW5jdGlvbjogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBTa2luU2VsZWN0b3JUeXBlcyA9IHtcbiAgICBcIlNlZ21lbnRlZFwiOiBcIlNlZ21lbnRlZFwiLFxuICAgIFwiRGVkaWNhdGVkXCI6IFwiRGVkaWNhdGVkXCIsXG5cbiAgICAvKipcbiAgICAgKiBUaGlzIFNlbGVjdG9yIFR5cGUgaXMgbm90IHlldCBzdXBwb3J0ZWQgYnV0IHdpbGwgYmUgYWRkZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS5cbiAgICAgKiBQbGVhc2UgY2hlY2sgdGhlIGRvY3VtZW50YXRpb24gZm9yIHVwZGF0ZXMuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIFwiRGVmYXVsdFwiOiBcIkRlZmF1bHRcIlxufSBhcyBjb25zdDtcblxuXG4vKipcbiAqIFRoaXMgU2tpbiBDb25maWcgVHlwZSBpcyBub3QgeWV0IHN1cHBvcnRlZCBidXQgd2lsbCBiZSBhZGRlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLlxuICogUGxlYXNlIGNoZWNrIHRoZSBkb2N1bWVudGF0aW9uIGZvciB1cGRhdGVzLlxuICpcbiAqIEB0eXBlIHtJRGVmYXVsdFNraW5Db25maWd9XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURlZmF1bHRTa2luQ29uZmlnIGV4dGVuZHMgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZTogdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLkRlZmF1bHQsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlZ21lbnRlZFNraW5Db25maWcgZXh0ZW5kcyBJU2tpblNlbGVjdG9yQ29uZmlnIHtcbiAgICB0eXBlOiB0eXBlb2YgU2tpblNlbGVjdG9yVHlwZXMuU2VnbWVudGVkLFxuICAgIHNlZ21lbnRzOiBJU2VnbWVudEluc3RhbmNlW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGVkaWNhdGVkU2tpbkNvbmZpZyBleHRlbmRzIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcy5EZWRpY2F0ZWQsXG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHNraW59IGluc3RlYWQuXG4gICAgICogUHJvcGVydHkgc2tpbnMgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy5cbiAgICAgKiBQbGVhc2UgdXBkYXRlIHlvdXIgY29kZSB0byB1c2Uge0BsaW5rIHNraW59IGZvciBiZXR0ZXIgY29tcGF0aWJpbGl0eS5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgc2tpbnM/OiBJU2tpbkluc3RhbmNlQ29uZmlnW10gLy8gZGVwcmVjYXRlZFxuICAgIHNraW46IElTa2luSW5zdGFuY2VDb25maWdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29tcG9uZW50SW5zdGFuY2VDb25maWcge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgY29tcG9uZW50SWQ6IHN0cmluZztcblxuICAgIC8vVE9ETyA6XG4gICAgLy8gUmVmSUQgPyB0byBzdXBwb3J0IG1vcmUgdGhhbiAxIGNvbXBvbmVudCBmcm9tIHRoZSBzYW1lIHR5cGUgaW4gY29tcG9zaXRlcyA/XG5cbiAgICAvL1RPRE8gOiByZW1vdmVcbiAgICBjb21wb25lbnROYW1lOiBzdHJpbmc7IC8vIDw8IGNoZWNrXG5cbiAgICBza2luU2VsZWN0b3I6IElTa2luU2VsZWN0b3JDb25maWdcblxuICAgIC8vIHN0b3JpbmcgdGhlIG5lc3RlZCBjb25maWcgZm9yIHJlZiBjb21wb25lbnRzXG4gICAgbmVzdGVkQ29tcG9uZW50cz86IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1tdXG5cbiAgICAvL29ubHkgb24gR0VUP1xuICAgIC8vVE9ETyA6IHRoaW5rIGFib3V0IHRoYXRcbiAgICByZXNvbHZlZEV4cGVyaWVuY2VzPzogSUV4cGVyaWVuY2VbXVxuICAgIC8vIHdpbGwgaW5jbHVkZSBpbnN0YW5jZSBhbmQgZGVmIGNvbmZpZyBpbiBvcmRlciB0byByZW5kZXIgaW4gcHJvZHVjdGlvblxuICAgIHJlc29sdmVkTmVzdGVkQ29tcG9uZW50cz86IElDb21wb25lbnRDb25maWdbXVxufVxuXG5leHBvcnQgY29uc3QgRXhwZXJpZW5jZVR5cGVzID0ge1xuICAgIFwiU2VnbWVudFwiOiBcIlNlZ21lbnRcIixcbiAgICBcIlByb21vXCI6IFwiUHJvbW9cIixcbiAgICBcIkFCXCI6IFwiQUJcIlxufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZSB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgRXhwZXJpZW5jZVR5cGVzXG4gICAgZXhwZXJpZW5jZXM6IElFeHBlcmllbmNlW11cbiAgICAvL3N0aWNraW5lc3NGYWN0b3JcbiAgICAvL0VuZERhdGVcbn1cblxuLy8gZXhwb3J0IGludGVyZmFjZSBJQUJFeHBlcmllbmNlR3JvdXAge1xuLy8gICAgIGlkOiBzdHJpbmdcbi8vICAgICBuYW1lOiBzdHJpbmdcbi8vICAgICBwZXJjZW50YWdlOiBudW1iZXJcbi8vIH1cblxuZXhwb3J0IGludGVyZmFjZSBJQUJFeHBlcmllbmNlIGV4dGVuZHMgSUV4cGVyaWVuY2Uge1xuICAgIHR5cGU6IHR5cGVvZiBFeHBlcmllbmNlVHlwZXMuQUJcbiAgICAvLyBncm91cHM6IElBQkV4cGVyaWVuY2VHcm91cFtdXG4gICAgZXhwZXJpZW5jZXM6IElFeHBlcmllbmNlW11cbiAgICBwZXJjZW50YWdlOiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGF0ZVJhbmdlIHtcbiAgICBpZDogc3RyaW5nXG4gICAgc3RhcnQ6IERhdGVcbiAgICBlbmQ6IERhdGVcbiAgICB0aW1lem9uZTogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlZ21lbnRFeHBlcmllbmNlIGV4dGVuZHMgSUV4cGVyaWVuY2Uge1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBFeHBlcmllbmNlVHlwZXNcbiAgICBzZWdtZW50OiBJU2VnbWVudERlZmluaXRpb25cbiAgICBkYXRlUmFuZ2U/OiBJRGF0ZVJhbmdlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVVzZXJGbG93RGVmaW5pdGlvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBjb21wb25lbnRzOiBJQ29tcG9uZW50SW5zdGFuY2VDb25maWdbXTtcbiAgICBvcmlnaW5zOiBzdHJpbmdbXSxcbiAgICBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXVxuICAgIGJyYW5jaD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnRDb25maWcge1xuICAgIGluc3RhbmNlOiBJQ29tcG9uZW50SW5zdGFuY2VDb25maWdcbiAgICB0eXBlOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1xuXG4gICAgLy8gVE9ETyA6IHZlcmlmeSB1bmlxdWVuZXNzIChkYXNoYm9hcmQgJiBzZXJ2ZXIpXG4gICAgbmFtZTogc3RyaW5nXG59XG5cbmludGVyZmFjZSBJQnJhbmNoYWJsZSB7XG4gICAgYnJhbmNoPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVVzZXJGbG93IGV4dGVuZHMgT21pdDxJVXNlckZsb3dEZWZpbml0aW9uLCAnY29tcG9uZW50cyc+LCBJQnJhbmNoYWJsZSB7XG4gICAgY29tcG9uZW50czogSUNvbXBvbmVudENvbmZpZ1tdXG59XG5cbmV4cG9ydCBjbGFzcyBSb290UmVmIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgcHVibGljIHNoYWRvd1Jvb3Q/OiBTaGFkb3dSb290KSB7XG5cbiAgICB9XG5cbiAgICBnZXRSb290RGl2ID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gKHRoaXMuc2hhZG93Um9vdCB8fCB0aGlzLmNvbnRhaW5lcikucXVlcnlTZWxlY3RvcignZGl2JylcbiAgICB9XG5cbiAgICBnZXRSb290ID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gKHRoaXMuc2hhZG93Um9vdCB8fCB0aGlzLmNvbnRhaW5lcik7XG4gICAgfVxufVxuIiwgImltcG9ydCB7XG4gICAgSUNvbXBvbmVudENvbmZpZyxcbiAgICBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJQ29tcG9uZW50SW5zdGFuY2VDb25maWcsXG4gICAgSURlZGljYXRlZFNraW5Db25maWcsXG4gICAgSVByb3BDb25maWcsXG4gICAgSVNraW5Db25maWcsXG4gICAgSVVzZXJGbG93LFxuICAgIFByb3BDb25maWdCZWhhdmlvclR5cGVzLFxuICAgIHYyX0lWYXJpYW50Q29uZmlnXG59IGZyb20gXCIuLi9jb21tb25cIjtcblxuY29uc3QgY29udmVydFYyVmFyaWFudFRvQ29tcG9uZW50Q29uZmlnID0gKGNvbmZpZzogdjJfSVZhcmlhbnRDb25maWcpOiBJQ29tcG9uZW50Q29uZmlnID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgICBpbnN0YW5jZToge1xuICAgICAgICAgICAgaWQ6ICdhdXRvJyxcbiAgICAgICAgICAgIGNvbXBvbmVudElkOiBjb25maWcuY29tcG9uZW50SWQsXG4gICAgICAgICAgICBjb21wb25lbnROYW1lOiBjb25maWcubmFtZSxcblxuICAgICAgICAgICAgc2tpblNlbGVjdG9yOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0RlZGljYXRlZCcsXG4gICAgICAgICAgICAgICAgc2tpbjoge1xuICAgICAgICAgICAgICAgICAgICBpZDogJ3NraW5fYXV0b192Ml9jb252ZXJ0ZWQnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZ1xuXG4gICAgICAgIH0gYXMgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBpZDogY29uZmlnLmlkLFxuICAgICAgICAgICAgbmFtZTogY29uZmlnLm5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogY29uZmlnLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgcHJvcHM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAnaW5fYXV0b192Ml9jb252ZXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbXlvcF9pbml0X2ludGVyZmFjZScsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhbnknLFxuICAgICAgICAgICAgICAgICAgICBiZWhhdmlvcjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMuY29kZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBhcyBJUHJvcENvbmZpZyxcblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdvdXRfYXV0b192Ml9jb252ZXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbXlvcF9jdGFfaGFuZGxlcicsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhbnknLFxuICAgICAgICAgICAgICAgICAgICBiZWhhdmlvcjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMuY29kZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBhcyBJUHJvcENvbmZpZ1xuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHJlZnM6IFtdLFxuICAgICAgICAgICAgc2tpbnM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAnc2tpbl9hdXRvX3YyX2NvbnZlcnRlZCcsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdhdXRvX3YyX2NvbnZlcnRlZCcsXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogaGFuZGxlIGVtcHR5IDpcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBsb2FkZXI6IGNvbmZpZy5jb25zdW1lX3ZhcmlhbnRbMF0ubG9hZGVyXG4gICAgICAgICAgICAgICAgfSBhcyBJU2tpbkNvbmZpZ1xuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGRlZmF1bHRTa2luOiAwXG4gICAgICAgIH0gYXMgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgICAgIG5hbWU6IGNvbmZpZy5uYW1lXG4gICAgfSBhcyBJQ29tcG9uZW50Q29uZmlnO1xufTtcblxuLyoqXG4gKiBDbG91ZFJlcG9zaXRvcnkgLSBVbmlmaWVkIGNsb3VkIGRhdGEgYWNjZXNzIGxheWVyIGZvciBNeW9wIGNvbXBvbmVudHNcbiAqXG4gKiBTdXBwb3J0cyBib3RoIHYyIChkZWZhdWx0KSBhbmQgdjEgbW9kZXM6XG4gKiAtIHYyOiBVc2VzIC9jb25zdW1lIGVuZHBvaW50IGZvciBmZXRjaGluZyB2YXJpYW50c1xuICogLSB2MTogVXNlcyAvZmxvdyBlbmRwb2ludCBmb3IgZmV0Y2hpbmcgdXNlciBmbG93c1xuICovXG5leHBvcnQgY2xhc3MgQ2xvdWRSZXBvc2l0b3J5IHtcbiAgICBzdGF0aWMgTWFpbiA9IG5ldyBDbG91ZFJlcG9zaXRvcnkoKTtcblxuICAgIC8vIHYyIGNhY2hlXG4gICAgcHJpdmF0ZSB2YXJpYW50czogUmVjb3JkPHN0cmluZywgUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnPj4gPSB7fTtcblxuICAgIC8vIHYxIGNhY2hlXG4gICAgcHJpdmF0ZSB1c2VyRmxvd3M6IFJlY29yZDxzdHJpbmcsIFByb21pc2U8SVVzZXJGbG93Pj4gPSB7fTtcblxuICAgIHByaXZhdGUgX2RlZmF1bHRFbnYgPSAncHJvZHVjdGlvbic7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9iYXNlVXJsID0gJ2h0dHBzOi8vY2xvdWQubXlvcC5kZXYnKSB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBkZWZhdWx0IGVudmlyb25tZW50IGZvciB0aGlzIENsb3VkUmVwb3NpdG9yeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHNldEVudmlyb25tZW50KGVudjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRFbnYgPSBlbnY7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50IGRlZmF1bHQgZW52aXJvbm1lbnRcbiAgICAgKi9cbiAgICBnZXREZWZhdWx0RW52aXJvbm1lbnQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRFbnY7XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09IFYyIE1ldGhvZHMgKERlZmF1bHQpID09PT09PT09PT09PVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYSBjb21wb25lbnQgaXMgYWxyZWFkeSBjYWNoZWQvcHJlbG9hZGVkICh2MilcbiAgICAgKi9cbiAgICBpc1ByZWxvYWRlZChjb21wb25lbnRJZDogc3RyaW5nLCBlbnY/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7Y29tcG9uZW50SWR9OiR7ZW52IHx8IHRoaXMuX2RlZmF1bHRFbnZ9OiR7cHJldmlldyA/ICdwcmV2aWV3JyA6ICdsaXZlJ31gO1xuICAgICAgICByZXR1cm4gY2FjaGVLZXkgaW4gdGhpcy52YXJpYW50cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaCBhIHYyIGNvbXBvbmVudCBjb25maWdcbiAgICAgKi9cbiAgICBhc3luYyBmZXRjaENvbXBvbmVudFYyKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudmlyb25tZW50SWRlbnRpZmllcj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiBQcm9taXNlPElDb21wb25lbnRDb25maWc+IHtcbiAgICAgICAgY29uc3QgZW52ID0gZW52aXJvbm1lbnRJZGVudGlmaWVyIHx8IHRoaXMuX2RlZmF1bHRFbnY7XG4gICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7Y29tcG9uZW50SWR9OiR7ZW52fToke3ByZXZpZXcgPyAncHJldmlldycgOiAnbGl2ZSd9YDtcblxuICAgICAgICBpZiAoIXRoaXMudmFyaWFudHNbY2FjaGVLZXldKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgICAgICAgICAgdGhpcy52YXJpYW50c1tjYWNoZUtleV0gPSBuZXcgUHJvbWlzZShcbiAgICAgICAgICAgICAgICBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gYCR7dGhpcy5fYmFzZVVybH0vY29uc3VtZT9pZD0ke2NvbXBvbmVudElkfSZlbnY9JHtlbnZ9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2aWV3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsICs9ICcmcHJldmlldz10cnVlJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhcmlhbnQgPSBqc29uLml0ZW07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmFyaWFudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYENvbXBvbmVudCBcIiR7Y29tcG9uZW50SWR9XCIgbm90IGZvdW5kYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YXJpYW50LmNvbnN1bWVfdmFyaWFudCB8fCAhdmFyaWFudC5jb25zdW1lX3ZhcmlhbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQ29tcG9uZW50IFwiJHtjb21wb25lbnRJZH1cIiBoYXMgbm8gaW1wbGVtZW50YXRpb24gZm9yIGVudmlyb25tZW50IFwiJHtlbnZ9XCJgKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRDb25maWcgPSBjb252ZXJ0VjJWYXJpYW50VG9Db21wb25lbnRDb25maWcodmFyaWFudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNvbXBvbmVudENvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy52YXJpYW50c1tjYWNoZUtleV07XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09IFYxIE1ldGhvZHMgKExlZ2FjeSkgPT09PT09PT09PT09XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaCBhIHYxIGNvbXBvbmVudCBmcm9tIGEgZmxvd1xuICAgICAqL1xuICAgIGFzeW5jIGZldGNoQ29tcG9uZW50VjEoY29tcG9uZW50SWQ6IHN0cmluZywgZmxvd0lkPzogc3RyaW5nKSB7XG4gICAgICAgIGlmIChmbG93SWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZsb3cgPSBhd2FpdCB0aGlzLmZldGNoRmxvdyhmbG93SWQpO1xuICAgICAgICAgICAgcmV0dXJuIGZsb3cuY29tcG9uZW50cy5maW5kKGMgPT4gYy50eXBlLmlkID09PSBjb21wb25lbnRJZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBmbG93ID0gYXdhaXQgdGhpcy5mZXRjaEF1dG9GbG93KGNvbXBvbmVudElkKTtcbiAgICAgICAgICAgIHJldHVybiBmbG93LmNvbXBvbmVudHNbMF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBmZXRjaEF1dG9GbG93KGNvbXBvbmVudElkOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF0pIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICB0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF0gPSBuZXcgUHJvbWlzZShcbiAgICAgICAgICAgICAgICBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLl9iYXNlVXJsfS9mbG93P2lkPSR7Y29tcG9uZW50SWR9JmF1dG89dHJ1ZWBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoanNvbi5pdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF07XG4gICAgfVxuXG4gICAgYXN5bmMgZmV0Y2hGbG93KGZsb3dJZDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy51c2VyRmxvd3NbZmxvd0lkXSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgICAgICAgIHRoaXMudXNlckZsb3dzW2Zsb3dJZF0gPSBuZXcgUHJvbWlzZShcbiAgICAgICAgICAgICAgICBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLl9iYXNlVXJsfS9mbG93P2lkPSR7Zmxvd0lkfSZyZXNvbHZlPWNvbXBvbmVudHNgXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGpzb24uaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy51c2VyRmxvd3NbZmxvd0lkXTtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT0gQmFja3dhcmQgQ29tcGF0aWJpbGl0eSA9PT09PT09PT09PT1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSBmZXRjaENvbXBvbmVudFYyIG9yIGZldGNoQ29tcG9uZW50VjEgZXhwbGljaXRseVxuICAgICAqIERlZmF1bHRzIHRvIHYxIGJlaGF2aW9yIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgY29kZVxuICAgICAqL1xuICAgIGFzeW5jIGZldGNoQ29tcG9uZW50KGNvbXBvbmVudElkOiBzdHJpbmcsIGZsb3dJZD86IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaENvbXBvbmVudFYxKGNvbXBvbmVudElkLCBmbG93SWQpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgQ2xvdWRSZXBvc2l0b3J5IGluc3RlYWRcbiAqL1xuZXhwb3J0IGNvbnN0IHYyX0Nsb3VkUmVwb3NpdG9yeSA9IENsb3VkUmVwb3NpdG9yeTtcbiIsICJleHBvcnQgY29uc3QgZXhlYyA9IGFzeW5jIChnZXR0ZXI6IGFueSkgPT4ge1xuICAgIHJldHVybiBhd2FpdCBnZXR0ZXIoKVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR08sSUFBTSxTQUFTLE1BQU07QUFDeEIsU0FBTyx1Q0FBdUM7QUFBQSxJQUFRO0FBQUEsSUFBVSxRQUMzRCxDQUFDLElBQUksT0FBTyxnQkFBZ0IsSUFBSSxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxHQUFHLFNBQVMsRUFBRTtBQUFBLEVBQ2xGO0FBQ0o7OztBQ0tPLElBQWUsa0JBQWYsTUFBd0M7QUFBQSxFQVczQyxjQUFjO0FBVmQsOEJBQUssT0FBTztBQWNaLGdDQUFPO0FBSVA7QUFHQTtBQUFBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQSxxQ0FBcUI7QUFBQSxFQWxCckI7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QUFBQTtBQUFBO0FBQUEsRUFPTSxpQkFBaUIsYUFBcUIsUUFBaUI7QUFBQTtBQUN6RCxVQUFJLFFBQVE7QUFDUixjQUFNLE9BQU8sTUFBTSxLQUFLLFVBQVUsTUFBTTtBQUN4QyxlQUFPLEtBQUssV0FBVyxLQUFLLE9BQUssRUFBRSxLQUFLLE9BQU8sV0FBVztBQUFBLE1BQzlELE9BQU87QUFDSCxjQUFNLE9BQU8sTUFBTSxLQUFLLGNBQWMsV0FBVztBQUNqRCxlQUFPLEtBQUssV0FBVyxDQUFDO0FBQUEsTUFDNUI7QUFBQSxJQUNKO0FBQUE7QUFBQSxFQUVNLGNBQWMsYUFBcUI7QUFBQTtBQUNyQyxVQUFJLENBQUMsS0FBSyxVQUFVLFdBQVcsR0FBRztBQUU5QixhQUFLLFVBQVUsV0FBVyxJQUFJLElBQUk7QUFBQSxVQUM5QixDQUFPLFNBQVMsV0FBVztBQUN2QixnQkFBSTtBQUNBLG9CQUFNLE1BQU0sTUFBTTtBQUFBLGdCQUNkLEdBQUcsS0FBSyxRQUFRLFlBQVksV0FBVztBQUFBLGNBQzNDO0FBQ0Esb0JBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixzQkFBUSxLQUFLLElBQUk7QUFBQSxZQUNyQixTQUFTLEdBQUc7QUFDUixxQkFBTyxDQUFDO0FBQUEsWUFDWjtBQUFBLFVBQ0o7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUVBLGFBQU8sTUFBTSxLQUFLLFVBQVUsV0FBVztBQUFBLElBQzNDO0FBQUE7QUFBQSxFQUVNLFVBQVUsUUFBZ0I7QUFBQTtBQUM1QixVQUFJLENBQUMsS0FBSyxVQUFVLE1BQU0sR0FBRztBQUV6QixhQUFLLFVBQVUsTUFBTSxJQUFJLElBQUk7QUFBQSxVQUN6QixDQUFPLFNBQVMsV0FBVztBQUN2QixnQkFBSTtBQUNBLG9CQUFNLE1BQU0sTUFBTTtBQUFBLGdCQUNkLEdBQUcsS0FBSyxRQUFRLFlBQVksTUFBTTtBQUFBLGNBQ3RDO0FBQ0Esb0JBQU0sT0FBTyxNQUFNLElBQUksS0FBSztBQUM1QixzQkFBUSxLQUFLLElBQUk7QUFBQSxZQUNyQixTQUFTLEdBQUc7QUFDUixxQkFBTyxDQUFDO0FBQUEsWUFDWjtBQUFBLFVBQ0o7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUVBLGFBQU8sTUFBTSxLQUFLLFVBQVUsTUFBTTtBQUFBLElBQ3RDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRTSxlQUFlLGFBQXFCLFFBQWlCO0FBQUE7QUFDdkQsYUFBTyxLQUFLLGlCQUFpQixhQUFhLE1BQU07QUFBQSxJQUNwRDtBQUFBO0FBQ0o7QUFqSkksY0FEUyxrQkFDRixRQUFPLElBQUksaUJBQWdCO0FBRC9CLElBQU0sa0JBQU47QUF1SkEsSUFBTSxxQkFBcUI7OztBQ2pPM0IsSUFBTSxPQUFPLENBQU8sV0FBZ0I7QUFDdkMsU0FBTyxNQUFNLE9BQU87QUFDeEI7IiwKICAibmFtZXMiOiBbIm1hdGNoIiwgInNjcmlwdElucHV0cyIsICJzY3JpcHRJbnB1dHMiXQp9Cg==