sonamu 0.9.8 → 0.9.10

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 (84) hide show
  1. package/dist/ai/agents/agent.d.ts.map +1 -1
  2. package/dist/ai/agents/agent.js +4 -2
  3. package/dist/ai/providers/rtzr/api.d.ts +1 -1
  4. package/dist/api/decorators.d.ts +0 -1
  5. package/dist/api/decorators.d.ts.map +1 -1
  6. package/dist/api/decorators.js +8 -6
  7. package/dist/api/sonamu.d.ts.map +1 -1
  8. package/dist/api/sonamu.js +123 -12
  9. package/dist/api/websocket-helpers.d.ts +1 -3
  10. package/dist/api/websocket-helpers.d.ts.map +1 -1
  11. package/dist/api/websocket-helpers.js +2 -15
  12. package/dist/stream/index.d.ts +3 -0
  13. package/dist/stream/index.d.ts.map +1 -1
  14. package/dist/stream/index.js +8 -2
  15. package/dist/stream/ws-core.d.ts +1 -0
  16. package/dist/stream/ws-core.d.ts.map +1 -1
  17. package/dist/stream/ws-delivery.d.ts +8 -0
  18. package/dist/stream/ws-delivery.d.ts.map +1 -1
  19. package/dist/stream/ws-delivery.js +160 -14
  20. package/dist/stream/ws-local-connection-store.d.ts +2 -0
  21. package/dist/stream/ws-local-connection-store.d.ts.map +1 -1
  22. package/dist/stream/ws-local-connection-store.js +21 -1
  23. package/dist/stream/ws-registry.d.ts +6 -2
  24. package/dist/stream/ws-registry.d.ts.map +1 -1
  25. package/dist/stream/ws-registry.js +170 -6
  26. package/dist/stream/ws-telemetry-memory.d.ts +28 -0
  27. package/dist/stream/ws-telemetry-memory.d.ts.map +1 -0
  28. package/dist/stream/ws-telemetry-memory.js +180 -0
  29. package/dist/stream/ws-telemetry-trace.d.ts +12 -0
  30. package/dist/stream/ws-telemetry-trace.d.ts.map +1 -0
  31. package/dist/stream/ws-telemetry-trace.js +41 -0
  32. package/dist/stream/ws-telemetry.d.ts +509 -0
  33. package/dist/stream/ws-telemetry.d.ts.map +1 -0
  34. package/dist/stream/ws-telemetry.js +931 -0
  35. package/dist/stream/ws.d.ts +10 -3
  36. package/dist/stream/ws.d.ts.map +1 -1
  37. package/dist/stream/ws.js +306 -27
  38. package/dist/syncer/file-patterns.js +2 -2
  39. package/dist/syncer/syncer-actions.d.ts +2 -8
  40. package/dist/syncer/syncer-actions.d.ts.map +1 -1
  41. package/dist/syncer/syncer-actions.js +4 -11
  42. package/dist/syncer/syncer.d.ts +1 -1
  43. package/dist/syncer/syncer.d.ts.map +1 -1
  44. package/dist/syncer/syncer.js +8 -6
  45. package/dist/template/template.d.ts +1 -2
  46. package/dist/template/template.d.ts.map +1 -1
  47. package/dist/template/template.js +3 -4
  48. package/dist/template/zod-converter.d.ts +2 -2
  49. package/dist/testing/dev-vitest-manager.d.ts +1 -1
  50. package/dist/testing/dev-vitest-manager.js +2 -2
  51. package/dist/types/types.d.ts +11 -5
  52. package/dist/types/types.d.ts.map +1 -1
  53. package/dist/types/types.js +2 -2
  54. package/dist/utils/class-name.d.ts +6 -0
  55. package/dist/utils/class-name.d.ts.map +1 -0
  56. package/dist/utils/class-name.js +19 -0
  57. package/package.json +2 -2
  58. package/src/ai/agents/agent.ts +2 -1
  59. package/src/api/__tests__/sonamu.websocket.test.ts +84 -10
  60. package/src/api/decorators.ts +6 -6
  61. package/src/api/sonamu.ts +142 -7
  62. package/src/api/websocket-helpers.ts +2 -28
  63. package/src/shared/app.shared.ts.txt +16 -8
  64. package/src/shared/web.shared.ts.txt +8 -7
  65. package/src/skills/sonamu/testing-devrunner.md +1 -1
  66. package/src/stream/__tests__/ws-telemetry.test.ts +821 -0
  67. package/src/stream/__tests__/ws.test.ts +362 -2
  68. package/src/stream/index.ts +3 -0
  69. package/src/stream/ws-core.ts +2 -0
  70. package/src/stream/ws-delivery.ts +161 -19
  71. package/src/stream/ws-local-connection-store.ts +33 -0
  72. package/src/stream/ws-registry.ts +186 -5
  73. package/src/stream/ws-telemetry-memory.ts +246 -0
  74. package/src/stream/ws-telemetry-trace.ts +52 -0
  75. package/src/stream/ws-telemetry.ts +1772 -0
  76. package/src/stream/ws.ts +332 -34
  77. package/src/syncer/file-patterns.ts +3 -3
  78. package/src/syncer/syncer-actions.ts +3 -15
  79. package/src/syncer/syncer.ts +9 -13
  80. package/src/template/__tests__/services.template.websocket.test.ts +2 -0
  81. package/src/template/template.ts +2 -3
  82. package/src/testing/dev-vitest-manager.ts +1 -1
  83. package/src/types/types.ts +10 -3
  84. package/src/utils/class-name.ts +12 -0
@@ -24,6 +24,15 @@ import os from "os";
24
24
  import mime, { lookup } from "mime-types";
25
25
 
26
26
  //#region src/api/sonamu.ts
27
+ function getWebSocketTelemetryContext(ws) {
28
+ if (!isTelemetryContextProvider(ws)) {
29
+ return {};
30
+ }
31
+ return ws.getTelemetryContext();
32
+ }
33
+ function isTelemetryContextProvider(ws) {
34
+ return "getTelemetryContext" in ws && typeof ws.getTelemetryContext === "function";
35
+ }
27
36
  /**
28
37
  * stream 모드에서 키 생성 함수가 지정되지 않았을 때 사용하는 기본 함수입니다.
29
38
  */
@@ -762,6 +771,19 @@ var init_sonamu = __esmMin((() => {
762
771
  async handleDevWebSocketRequest(socket, request, config) {
763
772
  const matchedApi = this.findMatchedApi(request);
764
773
  if (!matchedApi?.websocketOptions) {
774
+ const traceContext = this.websocketRuntime.telemetryController.createConnectionContext({ headers: request.headers });
775
+ this.websocketRuntime.telemetryController.emit({
776
+ name: "ws.connection.rejected",
777
+ level: "warn",
778
+ detail: {
779
+ reason: "routeNotFound",
780
+ path: request.url
781
+ },
782
+ traceId: traceContext.traceId,
783
+ spanId: traceContext.spanId,
784
+ parentSpanId: traceContext.parentSpanId,
785
+ sampled: traceContext.sampled
786
+ });
765
787
  socket.close(1008, "WebSocket route not found");
766
788
  return;
767
789
  }
@@ -773,25 +795,34 @@ var init_sonamu = __esmMin((() => {
773
795
  const socket = connection.socket;
774
796
  let wsContext = null;
775
797
  let rawWs = null;
798
+ let preRegisterPhase = "guard";
799
+ let traceContext = {};
776
800
  try {
801
+ traceContext = this.websocketRuntime.telemetryController.createConnectionContext({ headers: request.headers });
777
802
  runGuards({
778
803
  guards: api.options.guards,
779
804
  config,
780
805
  request,
781
806
  api
782
807
  });
808
+ preRegisterPhase = "query";
783
809
  const reqBody = await this.parseWebSocketRequestParams(api, request);
810
+ preRegisterPhase = "register";
784
811
  rawWs = this.websocketRuntime.registerConnection(socket, {
785
812
  outEvents: api.websocketOptions.outEvents,
786
813
  inEvents: api.websocketOptions.inEvents,
787
814
  namespace: api.websocketOptions.namespace,
788
815
  heartbeat: api.websocketOptions.heartbeat,
789
- maxPayload: api.websocketOptions.maxPayload,
790
- active: false
816
+ active: false,
817
+ traceId: traceContext.traceId,
818
+ spanId: traceContext.spanId,
819
+ parentSpanId: traceContext.parentSpanId,
820
+ sampled: traceContext.sampled
791
821
  });
792
822
  const scopedWs = this.createScopedWebSocketConnection(rawWs, () => wsContext);
793
823
  wsContext = await this.createWebSocketContext(config, request, scopedWs);
794
824
  this.websocketRuntime.activateConnection(rawWs.id);
825
+ preRegisterPhase = "handler";
795
826
  const { ApiParamType } = await import("../types/types.js");
796
827
  const args = api.parameters.map((param) => {
797
828
  if (ApiParamType.isContext(param.type)) {
@@ -804,6 +835,21 @@ var init_sonamu = __esmMin((() => {
804
835
  });
805
836
  } catch (error) {
806
837
  const closeDescriptor = resolveWebSocketCloseDescriptor(error);
838
+ if (!rawWs) {
839
+ this.websocketRuntime.telemetryController.emit({
840
+ name: "ws.connection.rejected",
841
+ level: closeDescriptor.logLevel === "warn" ? "warn" : "error",
842
+ detail: {
843
+ reason: preRegisterPhase,
844
+ code: closeDescriptor.code,
845
+ path: api.path
846
+ },
847
+ traceId: traceContext.traceId,
848
+ spanId: traceContext.spanId,
849
+ parentSpanId: traceContext.parentSpanId,
850
+ sampled: traceContext.sampled
851
+ });
852
+ }
807
853
  if (rawWs) {
808
854
  rawWs.close(closeDescriptor.code, closeDescriptor.reason);
809
855
  } else if (socket.readyState < 2) {
@@ -832,6 +878,7 @@ var init_sonamu = __esmMin((() => {
832
878
  };
833
879
  }
834
880
  createScopedWebSocketConnection(ws, getContext) {
881
+ const telemetryController = this._websocketRuntime?.telemetryController;
835
882
  const runInContext = (callback) => {
836
883
  const context = getContext();
837
884
  if (!context) {
@@ -849,6 +896,9 @@ var init_sonamu = __esmMin((() => {
849
896
  get closed() {
850
897
  return ws.closed;
851
898
  },
899
+ get userId() {
900
+ return ws.userId;
901
+ },
852
902
  transport: "ws",
853
903
  publishUntyped(event, data) {
854
904
  ws.publishUntyped(event, data);
@@ -860,7 +910,69 @@ var init_sonamu = __esmMin((() => {
860
910
  ws.onClose(() => runInContext(callback));
861
911
  },
862
912
  onMessage(event, handler) {
863
- ws.onMessage(event, (data) => runInContext(() => handler(data)));
913
+ ws.onMessage(event, (data, messageTraceContext) => runInContext(async () => {
914
+ const eventName = String(event);
915
+ const traceContext = messageTraceContext ?? getWebSocketTelemetryContext(ws);
916
+ const startedAt = performance.now();
917
+ telemetryController?.emit({
918
+ name: "ws.handler.started",
919
+ level: "debug",
920
+ connectionId: ws.id,
921
+ namespace: ws.namespace,
922
+ userId: ws.userId,
923
+ detail: { event: eventName },
924
+ ...traceContext
925
+ });
926
+ try {
927
+ const result = await handler(data, messageTraceContext);
928
+ const durationMs = performance.now() - startedAt;
929
+ telemetryController?.emit({
930
+ name: "ws.handler.completed",
931
+ level: "debug",
932
+ connectionId: ws.id,
933
+ namespace: ws.namespace,
934
+ userId: ws.userId,
935
+ detail: { event: eventName },
936
+ ...traceContext
937
+ });
938
+ telemetryController?.recordSpan({
939
+ operationName: "ws.message.process",
940
+ kind: "internal",
941
+ durationMs,
942
+ status: "unset",
943
+ connectionId: ws.id,
944
+ namespace: ws.namespace,
945
+ userId: ws.userId,
946
+ attributes: { event: eventName },
947
+ ...traceContext
948
+ });
949
+ return result;
950
+ } catch (error) {
951
+ const durationMs = performance.now() - startedAt;
952
+ telemetryController?.emit({
953
+ name: "ws.handler.failed",
954
+ level: "error",
955
+ connectionId: ws.id,
956
+ namespace: ws.namespace,
957
+ userId: ws.userId,
958
+ detail: { event: eventName },
959
+ ...traceContext
960
+ });
961
+ telemetryController?.recordSpan({
962
+ operationName: "ws.message.process",
963
+ kind: "internal",
964
+ durationMs,
965
+ status: "error",
966
+ connectionId: ws.id,
967
+ namespace: ws.namespace,
968
+ userId: ws.userId,
969
+ attributes: { event: eventName },
970
+ errorType: error instanceof Error ? error.name : typeof error,
971
+ ...traceContext
972
+ });
973
+ throw error;
974
+ }
975
+ }));
864
976
  },
865
977
  publish(event, data) {
866
978
  ws.publish(event, data);
@@ -1156,10 +1268,7 @@ var init_sonamu = __esmMin((() => {
1156
1268
  return;
1157
1269
  }
1158
1270
  const websocketPlugin = (await import("@fastify/websocket")).default;
1159
- const resolvedPluginOptions = resolveWebSocketPluginOptions({
1160
- rawPluginOption: pluginOption,
1161
- apis: this.syncer.apis
1162
- });
1271
+ const resolvedPluginOptions = resolveWebSocketPluginOptions({ rawPluginOption: pluginOption });
1163
1272
  if (resolvedPluginOptions) {
1164
1273
  await server.register(websocketPlugin, resolvedPluginOptions);
1165
1274
  } else {
@@ -1325,15 +1434,17 @@ var init_sonamu = __esmMin((() => {
1325
1434
  async destroy() {
1326
1435
  const { BaseModel } = await import("../database/base-model.js");
1327
1436
  await BaseModel.destroy();
1437
+ if (this._websocketRuntime) {
1438
+ await this._websocketRuntime.shutdown();
1439
+ }
1440
+ this._websocketRuntime = null;
1328
1441
  await Promise.allSettled([
1329
- this._websocketRuntime?.shutdown() ?? Promise.resolve(),
1330
1442
  this._workflows?.destroy() ?? Promise.resolve(),
1331
1443
  this._cache?.disconnect() ?? Promise.resolve(),
1332
1444
  this._devVitestManager?.shutdown() ?? Promise.resolve(),
1333
- this.watcher?.close() ?? Promise.resolve(),
1334
- dispose()
1445
+ this.watcher?.close() ?? Promise.resolve()
1335
1446
  ]);
1336
- this._websocketRuntime = null;
1447
+ await dispose();
1337
1448
  }
1338
1449
  };
1339
1450
  Sonamu = new SonamuClass();
@@ -1348,4 +1459,4 @@ var init_sonamu = __esmMin((() => {
1348
1459
  //#endregion
1349
1460
  init_sonamu();
1350
1461
  export { Sonamu, createWebSocketReplyStub, init_sonamu, resolveWebSocketCloseDescriptor, resolveWebSocketPluginOptions };
1351
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LmpzIiwibmFtZXMiOlsiREIiLCJhdXRoT3B0aW9uczogQmV0dGVyQXV0aE9wdGlvbnMiLCJnbG9iYWxDb21wcmVzc09wdGlvbnM6IENvbXByZXNzT3B0aW9ucyB8IHVuZGVmaW5lZCIsImZzIiwiY2hhbGsiLCJjYWNoZVJlcTogQ2FjaGVDb250cm9sUmVxdWVzdCIsImZpbGVQYXRoIiwiY3NyQ2FjaGVSZXE6IENhY2hlQ29udHJvbFJlcXVlc3QiLCJtaW1lTG9va3VwIiwiY29udGV4dDogQ29udGV4dCIsInJlcUJvZHk6IHtcbiAgICAgICAgICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xuICAgICAgICB9IiwiZmlsZXM6IHtcbiAgICAgICAgICBidWZmZXJlZEZpbGVzOiBCdWZmZXJlZEZpbGVbXTtcbiAgICAgICAgICB1cGxvYWRlZEZpbGVzOiBVcGxvYWRlZEZpbGVbXTtcbiAgICAgICAgfSIsImZpZWxkczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiIsImtleUdlbmVyYXRvcjogS2V5R2VuZXJhdG9yIiwid3NDb250ZXh0OiBXZWJTb2NrZXRDb250ZXh0IHwgbnVsbCIsInJhd1dzOiBSZXR1cm5UeXBlPFdlYlNvY2tldFJ1bnRpbWVbXCJyZWdpc3RlckNvbm5lY3Rpb25cIl0+IHwgbnVsbCIsInBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiIsImxvZ3RhcGVEaXNwb3NlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9zb25hbXUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiYXN5bmNfaG9va3NcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IHR5cGUgSW5jb21pbmdNZXNzYWdlLCB0eXBlIFNlcnZlciwgdHlwZSBTZXJ2ZXJSZXNwb25zZSB9IGZyb20gXCJodHRwXCI7XG5pbXBvcnQgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgdHlwZSB7fSBmcm9tIFwiQGZhc3RpZnkvd2Vic29ja2V0XCI7XG5pbXBvcnQgeyBkaXNwb3NlIGFzIGxvZ3RhcGVEaXNwb3NlIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCB7IHR5cGUgQXV0aCwgdHlwZSBCZXR0ZXJBdXRoT3B0aW9ucyB9IGZyb20gXCJiZXR0ZXItYXV0aFwiO1xuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IHsgdHlwZSBGU1dhdGNoZXIgfSBmcm9tIFwiY2hva2lkYXJcIjtcbmltcG9ydCB7IHR5cGUgRmFzdGlmeUluc3RhbmNlLCB0eXBlIEZhc3RpZnlSZXBseSwgdHlwZSBGYXN0aWZ5UmVxdWVzdCB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgbWltZSwgeyBsb29rdXAgYXMgbWltZUxvb2t1cCB9IGZyb20gXCJtaW1lLXR5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIFdlYlNvY2tldCB9IGZyb20gXCJ3c1wiO1xuaW1wb3J0IHsgdHlwZSBab2RPYmplY3QgfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IEJBU0VfRklFTERfTUFQUElOR1MgfSBmcm9tIFwiLi4vYXV0aC9iZXR0ZXItYXV0aC1lbnRpdGllc1wiO1xuaW1wb3J0IHsgYXBwbHlDYWNoZUhlYWRlcnMsIENhY2hlUHJlc2V0cyB9IGZyb20gXCIuLi9jYWNoZS1jb250cm9sL2NhY2hlLWNvbnRyb2xcIjtcbmltcG9ydCB7IHR5cGUgQ2FjaGVDb250cm9sQ29uZmlnLCB0eXBlIENhY2hlQ29udHJvbFJlcXVlc3QgfSBmcm9tIFwiLi4vY2FjaGUtY29udHJvbC90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBDYWNoZUNvbmZpZywgdHlwZSBDYWNoZU1hbmFnZXIgfSBmcm9tIFwiLi4vY2FjaGUvdHlwZXNcIjtcbmltcG9ydCB7IHRvRmFzdGlmeUNvbXByZXNzT3B0aW9uIH0gZnJvbSBcIi4uL2NvbXByZXNzL2NvbXByZXNzXCI7XG5pbXBvcnQgeyB0eXBlIENvbXByZXNzT3B0aW9ucyB9IGZyb20gXCIuLi9jb21wcmVzcy90eXBlc1wiO1xuaW1wb3J0IHsgREIgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IHR5cGUgU29uYW11REJDb25maWcgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IFNELCBzZXRTRENvbmZpZyB9IGZyb20gXCIuLi9kaWN0L3NkXCI7XG5pbXBvcnQgeyB0eXBlIExvY2FsaXplZFN0cmluZyB9IGZyb20gXCIuLi9kaWN0L3R5cGVzXCI7XG5pbXBvcnQgeyBOb3RGb3VuZEV4Y2VwdGlvbiB9IGZyb20gXCIuLi9leGNlcHRpb25zL3NvLWV4Y2VwdGlvbnNcIjtcbmltcG9ydCB7IEJ1ZmZlcmVkRmlsZSB9IGZyb20gXCIuLi9zdG9yYWdlL2J1ZmZlcmVkLWZpbGVcIjtcbmltcG9ydCB7IHR5cGUgU3RvcmFnZU1hbmFnZXIgfSBmcm9tIFwiLi4vc3RvcmFnZS9zdG9yYWdlLW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgS2V5R2VuZXJhdG9yIH0gZnJvbSBcIi4uL3N0b3JhZ2UvdHlwZXNcIjtcbmltcG9ydCB7IFVwbG9hZGVkRmlsZSB9IGZyb20gXCIuLi9zdG9yYWdlL3VwbG9hZGVkLWZpbGVcIjtcbmltcG9ydCB7IGNyZWF0ZU1vY2tTU0VGYWN0b3J5IH0gZnJvbSBcIi4uL3N0cmVhbS9zc2VcIjtcbmltcG9ydCB7IFdlYlNvY2tldFJ1bnRpbWUsIHR5cGUgV2ViU29ja2V0Q29ubmVjdGlvbiwgdHlwZSBXZWJTb2NrZXRFdmVudE1hcCB9IGZyb20gXCIuLi9zdHJlYW0vd3NcIjtcbmltcG9ydCB7IHR5cGUgU3luY2VyIH0gZnJvbSBcIi4uL3N5bmNlci9zeW5jZXJcIjtcbmltcG9ydCB7IHR5cGUgV29ya2Zsb3dNYW5hZ2VyIH0gZnJvbSBcIi4uL3Rhc2tzL3dvcmtmbG93LW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgRGV2Vml0ZXN0TWFuYWdlciB9IGZyb20gXCIuLi90ZXN0aW5nL2Rldi12aXRlc3QtbWFuYWdlclwiO1xuaW1wb3J0IHsgdHlwZSBTb25hbXVGYXN0aWZ5Q29uZmlnIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBjZW50ZXJUZXh0IH0gZnJvbSBcIi4uL3V0aWxzL2NvbnNvbGUtdXRpbFwiO1xuaW1wb3J0IHsgaXNEYWVtb25TZXJ2ZXIgfSBmcm9tIFwiLi4vdXRpbHMvY29udHJvbGxlclwiO1xuaW1wb3J0IHsgZXhpc3RzLCBmaWxlRXhpc3RzIH0gZnJvbSBcIi4uL3V0aWxzL2ZzLXV0aWxzXCI7XG5pbXBvcnQgeyB0eXBlIEFic29sdXRlUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5pbXBvcnQgeyBjb252ZXJ0RmFzdGlmeUhlYWRlcnNUb1N0YW5kYXJkLCBtZXJnZSB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHsgdHlwZSBTb25hbXVDb25maWcsIHR5cGUgU29uYW11U2VydmVyT3B0aW9ucywgdHlwZSBTb25hbXVUYXNrT3B0aW9ucyB9IGZyb20gXCIuL2NvbmZpZ1wiO1xuaW1wb3J0IHsgdHlwZSBDb250ZXh0LCB0eXBlIFJ1bnRpbWVDb250ZXh0LCB0eXBlIFdlYlNvY2tldENvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0XCI7XG5pbXBvcnQgeyB0eXBlIEV4dGVuZGVkQXBpIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgZ2V0U2VjcmV0cyB9IGZyb20gXCIuL3NlY3JldFwiO1xuaW1wb3J0IHsgdHlwZSBTb25hbXVTZWNyZXRzIH0gZnJvbSBcIi4vc2VjcmV0XCI7XG5pbXBvcnQge1xuICBjcmVhdGVXZWJTb2NrZXRSZXBseVN0dWIsXG4gIHJlc29sdmVXZWJTb2NrZXRDbG9zZURlc2NyaXB0b3IsXG4gIHJlc29sdmVXZWJTb2NrZXRQbHVnaW5PcHRpb25zLFxuICByZXNvbHZlSW50ZWdyYXRlZFZpdGVIbXJPcHRpb25zLFxufSBmcm9tIFwiLi93ZWJzb2NrZXQtaGVscGVyc1wiO1xuXG5leHBvcnQge1xuICBjcmVhdGVXZWJTb2NrZXRSZXBseVN0dWIsXG4gIHJlc29sdmVXZWJTb2NrZXRDbG9zZURlc2NyaXB0b3IsXG4gIHJlc29sdmVXZWJTb2NrZXRQbHVnaW5PcHRpb25zLFxufSBmcm9tIFwiLi93ZWJzb2NrZXQtaGVscGVyc1wiO1xuXG5jbGFzcyBTb25hbXVDbGFzcyB7XG4gIHB1YmxpYyBpc0luaXRpYWxpemVkOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBmb3JUZXN0aW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBhc3luY0xvY2FsU3RvcmFnZTogQXN5bmNMb2NhbFN0b3JhZ2U8e1xuICAgIGNvbnRleHQ6IFJ1bnRpbWVDb250ZXh0O1xuICB9PiA9IG5ldyBBc3luY0xvY2FsU3RvcmFnZSgpO1xuXG4gIHB1YmxpYyBnZXRDb250ZXh0PFQgZXh0ZW5kcyBSdW50aW1lQ29udGV4dCA9IENvbnRleHQ+KCk6IFQge1xuICAgIGNvbnN0IHN0b3JlID0gdGhpcy5hc3luY0xvY2FsU3RvcmFnZS5nZXRTdG9yZSgpO1xuICAgIGlmIChzdG9yZT8uY29udGV4dCkge1xuICAgICAgcmV0dXJuIHN0b3JlLmNvbnRleHQgYXMgVDtcbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwidGVzdFwiKSB7XG4gICAgICAvLyDthYzsiqTtjIUg7ZmY6rK97JeQ7IScIOy7qO2FjeyKpO2KuOqwgCDso7zsnoXrkJjsp4Ag7JWK7J2AIOqyveyasCDruYgg7Luo7YWN7Iqk7Yq4IOumrO2EtFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHJhbnNwb3J0OiBcImh0dHBcIixcbiAgICAgICAgcmVxdWVzdDogbnVsbCxcbiAgICAgICAgcmVwbHk6IG51bGwsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBjcmVhdGVTU0U6IChzY2hlbWE6IFpvZE9iamVjdCkgPT4gY3JlYXRlTW9ja1NTRUZhY3Rvcnkoc2NoZW1hKSxcbiAgICAgICAgbG9jYWxlOiBcIlwiLFxuICAgICAgICB1c2VyOiBudWxsLFxuICAgICAgICBzZXNzaW9uOiBudWxsLFxuICAgICAgICBuYWl0ZVN0b3JlOiBuZXcgTWFwPHN0cmluZywgYW55PigpLFxuICAgICAgfSBhcyB1bmtub3duIGFzIFQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBjYW5ub3QgZmluZCBjb250ZXh0XCIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2FwaVJvb3RQYXRoOiBBYnNvbHV0ZVBhdGggfCBudWxsID0gbnVsbDtcbiAgc2V0IGFwaVJvb3RQYXRoKGFwaVJvb3RQYXRoOiBBYnNvbHV0ZVBhdGgpIHtcbiAgICB0aGlzLl9hcGlSb290UGF0aCA9IGFwaVJvb3RQYXRoO1xuICB9XG4gIGdldCBhcGlSb290UGF0aCgpOiBBYnNvbHV0ZVBhdGgge1xuICAgIGlmICh0aGlzLl9hcGlSb290UGF0aCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2FwaVJvb3RQYXRoO1xuICB9XG4gIGdldCBhcHBSb290UGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmFwaVJvb3RQYXRoLnNwbGl0KHBhdGguc2VwKS5zbGljZSgwLCAtMSkuam9pbihwYXRoLnNlcCk7XG4gIH1cblxuICBwcml2YXRlIF9kYkNvbmZpZzogU29uYW11REJDb25maWcgfCBudWxsID0gbnVsbDtcbiAgc2V0IGRiQ29uZmlnKGRiQ29uZmlnOiBTb25hbXVEQkNvbmZpZykge1xuICAgIHRoaXMuX2RiQ29uZmlnID0gZGJDb25maWc7XG4gIH1cbiAgZ2V0IGRiQ29uZmlnKCk6IFNvbmFtdURCQ29uZmlnIHtcbiAgICBpZiAodGhpcy5fZGJDb25maWcgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9kYkNvbmZpZztcbiAgfVxuXG4gIHByaXZhdGUgX3N5bmNlcjogU3luY2VyIHwgbnVsbCA9IG51bGw7XG4gIHNldCBzeW5jZXIoc3luY2VyOiBTeW5jZXIpIHtcbiAgICB0aGlzLl9zeW5jZXIgPSBzeW5jZXI7XG4gIH1cbiAgZ2V0IHN5bmNlcigpOiBTeW5jZXIge1xuICAgIGlmICh0aGlzLl9zeW5jZXIgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zeW5jZXI7XG4gIH1cblxuICBwcml2YXRlIF9jb25maWc6IFNvbmFtdUNvbmZpZyB8IG51bGwgPSBudWxsO1xuICBzZXQgY29uZmlnKGNvbmZpZzogU29uYW11Q29uZmlnKSB7XG4gICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuICB9XG4gIGdldCBjb25maWcoKTogU29uYW11Q29uZmlnIHtcbiAgICBpZiAodGhpcy5fY29uZmlnID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY29uZmlnO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IHNlY3JldHM6IFNvbmFtdVNlY3JldHMgPSBnZXRTZWNyZXRzKCk7XG5cbiAgcHJpdmF0ZSBfc3RvcmFnZTogU3RvcmFnZU1hbmFnZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIFN0b3JhZ2VNYW5hZ2VyIOyduOyKpO2EtOyKpFxuICAgKi9cbiAgZ2V0IHN0b3JhZ2UoKTogU3RvcmFnZU1hbmFnZXIge1xuICAgIGlmICghdGhpcy5fc3RvcmFnZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3RvcmFnZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuIENoZWNrIHN0b3JhZ2UgY29uZmlnLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3N0b3JhZ2U7XG4gIH1cblxuICBwcml2YXRlIF9jYWNoZTogQ2FjaGVNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIC8qKlxuICAgKiBDYWNoZU1hbmFnZXIg7J247Iqk7YS07IqkIChCZW50b0NhY2hlKVxuICAgKi9cbiAgZ2V0IGNhY2hlKCk6IENhY2hlTWFuYWdlciB7XG4gICAgaWYgKCF0aGlzLl9jYWNoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FjaGUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLiBDaGVjayBjYWNoZSBjb25maWcgaW4gc29uYW11LmNvbmZpZy50cy5cIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jYWNoZTtcbiAgfVxuXG4gIHByaXZhdGUgX3dvcmtmbG93czogV29ya2Zsb3dNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIGdldCB3b3JrZmxvd3MoKTogV29ya2Zsb3dNYW5hZ2VyIHtcbiAgICBpZiAodGhpcy5fd29ya2Zsb3dzID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl93b3JrZmxvd3M7XG4gIH1cblxuICBwcml2YXRlIF9hdXRoOiBBdXRoPEJldHRlckF1dGhPcHRpb25zPiB8IG51bGwgPSBudWxsO1xuICBnZXQgYXV0aCgpOiBBdXRoPEJldHRlckF1dGhPcHRpb25zPiB7XG4gICAgaWYgKCF0aGlzLl9hdXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBdXRoIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4gQ2hlY2sgYXV0aCBjb25maWcgaW4gc29uYW11LmNvbmZpZy50cy5cIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hdXRoO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGV2Vml0ZXN0TWFuYWdlcjogRGV2Vml0ZXN0TWFuYWdlciB8IG51bGwgPSBudWxsO1xuICBnZXQgZGV2Vml0ZXN0TWFuYWdlcigpOiBEZXZWaXRlc3RNYW5hZ2VyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2RldlZpdGVzdE1hbmFnZXI7XG4gIH1cbiAgc2V0IGRldlZpdGVzdE1hbmFnZXIobWFuYWdlcjogRGV2Vml0ZXN0TWFuYWdlciB8IG51bGwpIHtcbiAgICB0aGlzLl9kZXZWaXRlc3RNYW5hZ2VyID0gbWFuYWdlcjtcbiAgfVxuXG4gIC8vIFNvbmFtdeqwgCBydW50aW1l7J2EIOyngeygkSDshozsnKDtlbQgcmVnaXN0cnkvY29ubmVjdGlvbiBsaWZlY3ljbGXsnYQg7JWg7ZSM66as7LyA7J207IWYIOyImOuqheyjvOq4sOyZgCDrj5nquLDtmZTtlahcbiAgcHJpdmF0ZSBfd2Vic29ja2V0UnVudGltZTogV2ViU29ja2V0UnVudGltZSB8IG51bGwgPSBudWxsO1xuICAvLyDqsJnsnYAgRmFzdGlmeSDsnbjsiqTthLTsiqTsl5AgQGZhc3RpZnkvd2Vic29ja2V07J2EIOykkeuztSDrk7HroZ3tlZjripQg6rKD7J2EIFdlYWtTZXTsnLzroZwg7LCo64uo7ZWoXG4gIHByaXZhdGUgcmVhZG9ubHkgd2Vic29ja2V0UGx1Z2luU2VydmVycyA9IG5ldyBXZWFrU2V0PFxuICAgIEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+XG4gID4oKTtcbiAgZ2V0IHdlYnNvY2tldFJ1bnRpbWUoKTogV2ViU29ja2V0UnVudGltZSB7XG4gICAgaWYgKCF0aGlzLl93ZWJzb2NrZXRSdW50aW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXZWJTb2NrZXQgcnVudGltZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fd2Vic29ja2V0UnVudGltZTtcbiAgfVxuICBzZXQgd2Vic29ja2V0UnVudGltZShydW50aW1lOiBXZWJTb2NrZXRSdW50aW1lIHwgbnVsbCkge1xuICAgIHRoaXMuX3dlYnNvY2tldFJ1bnRpbWUgPSBydW50aW1lO1xuICB9XG5cbiAgLy8gSE1SIOyymOumrDog7YyM7J28IOyLnOyKpO2FnCDqsJDsi5wgKyBITVIvc3luYyDsgqzsnbTtgbQg7Iuk7ZaJ7J2AIHdhdGNoZXIg66qo65OI66GcIOychOyehO2VqeuLiOuLpC5cbiAgcHVibGljIHdhdGNoZXI6IEZTV2F0Y2hlciB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSB8IG51bGwgPSBudWxsO1xuXG4gIGFzeW5jIGluaXRGb3JUZXN0aW5nKCkge1xuICAgIGF3YWl0IHRoaXMuaW5pdCh0cnVlLCBmYWxzZSwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgfVxuXG4gIGFzeW5jIGluaXQoXG4gICAgZG9TaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBlbmFibGVTeW5jOiBib29sZWFuID0gdHJ1ZSxcbiAgICBhcGlSb290UGF0aD86IEFic29sdXRlUGF0aCxcbiAgICBmb3JUZXN0aW5nOiBib29sZWFuID0gZmFsc2UsXG4gICkge1xuICAgIHRoaXMuZm9yVGVzdGluZyA9IGZvclRlc3Rpbmc7XG5cbiAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaW5pdFN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cbiAgICAvLyBBUEkg66Oo7Yq4IO2MqOyKpFxuICAgIGNvbnN0IHsgZmluZEFwaVJvb3RQYXRoIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy91dGlsc1wiKTtcbiAgICB0aGlzLmFwaVJvb3RQYXRoID0gYXBpUm9vdFBhdGggPz8gZmluZEFwaVJvb3RQYXRoKCk7XG5cbiAgICAvLyDshKTsoJXsnYQg66Gc65Sp7ZWY64qUIOqyg+u2gO2EsCDsi5zsnpFcbiAgICBjb25zdCBjb25maWdTdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGNvbnN0IHsgbG9hZENvbmZpZyB9ID0gYXdhaXQgaW1wb3J0KFwiLi9jb25maWdcIik7XG4gICAgdGhpcy5jb25maWcgPSBhd2FpdCBsb2FkQ29uZmlnKHRoaXMuYXBpUm9vdFBhdGgpO1xuICAgIGNvbnN0IGNvbmZpZ1RpbWUgPSBwZXJmb3JtYW5jZS5ub3coKSAtIGNvbmZpZ1N0YXJ0O1xuICAgIHNldFNEQ29uZmlnKHRoaXMuY29uZmlnLmkxOG4pO1xuICAgIC8vIHNvbmFtdS5jb25maWcudHMg6riw67O46rCSIOyEpOyglVxuICAgIHRoaXMuY29uZmlnLmRhdGFiYXNlLmRhdGFiYXNlID0gdGhpcy5jb25maWcuZGF0YWJhc2UuZGF0YWJhc2UgPz8gXCJwZ1wiO1xuICAgIHRoaXMuY29uZmlnLmRhdGFiYXNlLmRlZmF1bHRPcHRpb25zLmNsaWVudCA9IHRoaXMuY29uZmlnLmRhdGFiYXNlLmRhdGFiYXNlID8/IFwicGdcIjtcblxuICAgIC8vIOuhnOq5hSDshKTsoJVcbiAgICBjb25zdCB7IGNvbmZpZ3VyZUxvZ1RhcGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL2xvZ2dlci9jb25maWd1cmVcIik7XG4gICAgaWYgKHRoaXMuY29uZmlnLmxvZ2dpbmcgIT09IGZhbHNlKSB7XG4gICAgICBhd2FpdCBjb25maWd1cmVMb2dUYXBlKHtcbiAgICAgICAgLi4udGhpcy5jb25maWcubG9nZ2luZyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIERCIOuhnOuTnFxuICAgIGNvbnN0IHsgREIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2RhdGFiYXNlL2RiXCIpO1xuICAgIHRoaXMuZGJDb25maWcgPSBEQi5nZW5lcmF0ZURCQ29uZmlnKHRoaXMuY29uZmlnLmRhdGFiYXNlKTtcbiAgICBEQi5zZXRDb25maWcodGhpcy5kYkNvbmZpZyk7XG5cbiAgICAvLyBFbnRpdHkg66Gc65OcXG4gICAgLy8g7YWM7Iqk7Yq47JeQ7ISc64+EIEVudGl0eSDsoJXrs7TripQg7ZWE7JqU7ZWp64uI64ukLlxuICAgIC8vIHVwc2VydOqwgCDsoJzrjIDroZwg7J6R64+Z7ZWY66Ck66m0IGVudGl0eeydmCB1bmlxdWUgaW5kZXgg7KCV67O06rCAIO2VhOyalO2VmOq4sCDrlYzrrLjsnoXri4jri6QuXG4gICAgY29uc3QgeyBFbnRpdHlNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIik7XG4gICAgYXdhaXQgRW50aXR5TWFuYWdlci5hdXRvbG9hZChkb1NpbGVudCk7XG5cbiAgICAvLyBDYWNoZSDstIjquLDtmZRcbiAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVDYWNoZSh0aGlzLmNvbmZpZy5zZXJ2ZXIuY2FjaGUsIGZvclRlc3RpbmcpO1xuXG4gICAgLy8gQmV0dGVyQXV0aCDstIjquLDtmZRcbiAgICBjb25zdCBhdXRoQ29uZmlnID0gdGhpcy5jb25maWcuc2VydmVyLmF1dGg7XG4gICAgaWYgKGF1dGhDb25maWcpIHtcbiAgICAgIC8vIOyCrOyaqeyekCDshKTsoJXqs7wg6riw67O46rCS7J2EIG1lcmdlXG4gICAgICBjb25zdCBtZXJnZWRGaWVsZE1hcHBpbmdzID0gbWVyZ2UoQkFTRV9GSUVMRF9NQVBQSU5HUywgYXV0aENvbmZpZyk7XG5cbiAgICAgIC8vIGJldHRlci1hdXRoIOyduOyKpO2EtOyKpCDsg53shLFcbiAgICAgIGNvbnN0IHsgYmV0dGVyQXV0aCB9ID0gYXdhaXQgaW1wb3J0KFwiYmV0dGVyLWF1dGhcIik7XG4gICAgICBjb25zdCB7IHNvbmFtdUtuZXhBZGFwdGVyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9hdXRoL2tuZXgtYWRhcHRlclwiKTtcblxuICAgICAgY29uc3QgYXV0aE9wdGlvbnM6IEJldHRlckF1dGhPcHRpb25zID0ge1xuICAgICAgICBkYXRhYmFzZTogc29uYW11S25leEFkYXB0ZXIoKSxcbiAgICAgICAgLi4ubWVyZ2VkRmllbGRNYXBwaW5ncyxcbiAgICAgIH07XG4gICAgICB0aGlzLl9hdXRoID0gYmV0dGVyQXV0aChhdXRoT3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLy8g7YWM7Iqk7YyF7J24IOqyveyasCDsi7Htgawg7JeG7J20IOykkeuLqFxuICAgIGlmIChmb3JUZXN0aW5nKSB7XG4gICAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRhc2sg65Ox66GdXG4gICAgYXdhaXQgdGhpcy5pbml0aWFsaXplV29ya2Zsb3dzKHRoaXMuY29uZmlnLnRhc2tzKTtcblxuICAgIC8vIFN5bmNlclxuICAgIGNvbnN0IHsgU3luY2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zeW5jZXIvc3luY2VyXCIpO1xuICAgIHRoaXMuc3luY2VyID0gbmV3IFN5bmNlcigpO1xuXG4gICAgLy8gQXV0b2xvYWQ6IE1vZGVscyAvIFR5cGVzIC8gQVBJcyAvIFdvcmtmbG93cyAvIFRlbXBsYXRlcyAvIFNTUiBSb3V0ZXNcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZFR5cGVzKCk7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuYXV0b2xvYWRNb2RlbHMoKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZEFwaXMoKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZFdvcmtmbG93cygpO1xuICAgIGNvbnN0IHsgVGVtcGxhdGVNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi90ZW1wbGF0ZVwiKTtcbiAgICBhd2FpdCBUZW1wbGF0ZU1hbmFnZXIuYXV0b2xvYWQoKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZFNzclJvdXRlcygpO1xuXG4gICAgY29uc3QgeyBpc0xvY2FsLCBpc1Rlc3QsIGlzSG90UmVsb2FkU2VydmVyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9jb250cm9sbGVyXCIpO1xuICAgIGlmIChpc0xvY2FsKCkgJiYgIWlzVGVzdCgpICYmIGlzSG90UmVsb2FkU2VydmVyKCkgJiYgZW5hYmxlU3luYykge1xuICAgICAgYXdhaXQgdGhpcy5zeW5jZXIuc3luYygpO1xuICAgICAgYXdhaXQgdGhpcy5zdGFydFdhdGNoZXIoKTtcbiAgICB9XG5cbiAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIHRoaXMuX2luaXRFbGFwc2VkID0gcGVyZm9ybWFuY2Uubm93KCkgLSBpbml0U3RhcnQ7XG4gICAgdGhpcy5fY29uZmlnRWxhcHNlZCA9IGNvbmZpZ1RpbWU7XG4gIH1cblxuICBwcml2YXRlIF9pbml0RWxhcHNlZCA9IDA7XG4gIHByaXZhdGUgX2NvbmZpZ0VsYXBzZWQgPSAwO1xuXG4gIGFzeW5jIGNyZWF0ZVNlcnZlcihpbml0T3B0aW9ucz86IHsgZW5hYmxlU3luYz86IGJvb2xlYW47IGRvU2lsZW50PzogYm9vbGVhbiB9KSB7XG4gICAgaWYgKCF0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW5pdChpbml0T3B0aW9ucz8uZG9TaWxlbnQsIGluaXRPcHRpb25zPy5lbmFibGVTeW5jKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5jb25maWcuc2VydmVyO1xuICAgIGNvbnN0IHsgZGVmYXVsdDogZmFzdGlmeSB9ID0gYXdhaXQgaW1wb3J0KFwiZmFzdGlmeVwiKTtcbiAgICBjb25zdCB7IGdldExvZ1RhcGVGYXN0aWZ5TG9nZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCJAbG9ndGFwZS9mYXN0aWZ5XCIpO1xuICAgIGNvbnN0IHNlcnZlciA9IGZhc3RpZnkoe1xuICAgICAgLi4ub3B0aW9ucy5mYXN0aWZ5LFxuICAgICAgbG9nZ2VyOlxuICAgICAgICB0aGlzLmNvbmZpZy5sb2dnaW5nICE9PSBmYWxzZVxuICAgICAgICAgID8gZ2V0TG9nVGFwZUZhc3RpZnlMb2dnZXIoe1xuICAgICAgICAgICAgICBjYXRlZ29yeTogdGhpcy5jb25maWcubG9nZ2luZz8uZmFzdGlmeUNhdGVnb3J5ID8/IFtcImZhc3RpZnlcIl0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICAgIHRoaXMuc2VydmVyID0gc2VydmVyO1xuICAgIHRoaXMud2Vic29ja2V0UnVudGltZSA9IG5ldyBXZWJTb2NrZXRSdW50aW1lKG9wdGlvbnMud2Vic29ja2V0KTtcblxuICAgIC8vIFN0b3JhZ2Ug7ISk7KCVIOKGkiBTdG9yYWdlTWFuYWdlciDsg53shLFcbiAgICBpZiAob3B0aW9ucy5zdG9yYWdlKSB7XG4gICAgICBjb25zdCB7IFN0b3JhZ2VNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zdG9yYWdlL3N0b3JhZ2UtbWFuYWdlclwiKTtcbiAgICAgIHRoaXMuX3N0b3JhZ2UgPSBuZXcgU3RvcmFnZU1hbmFnZXIob3B0aW9ucy5zdG9yYWdlKTtcbiAgICB9XG5cbiAgICAvLyDtlIzrn6zqt7jsnbgg65Ox66GdXG4gICAgaWYgKG9wdGlvbnMucGx1Z2lucykge1xuICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlclBsdWdpbnMoc2VydmVyLCBvcHRpb25zLnBsdWdpbnMpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmF1dGgpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJCZXR0ZXJBdXRoKHNlcnZlciwgb3B0aW9ucy5hdXRoKTtcbiAgICB9XG5cbiAgICAvLyBBUEkg65287Jqw7YyFIOyEpOyglVxuICAgIGF3YWl0IHRoaXMud2l0aEZhc3RpZnkoc2VydmVyLCBvcHRpb25zLmFwaUNvbmZpZywge1xuICAgICAgZW5hYmxlU3luYzogaW5pdE9wdGlvbnM/LmVuYWJsZVN5bmMsXG4gICAgICBkb1NpbGVudDogaW5pdE9wdGlvbnM/LmRvU2lsZW50LFxuICAgIH0pO1xuXG4gICAgLy8g7ISc67KEIOyLnOyekVxuICAgIGF3YWl0IHRoaXMuYm9vdChzZXJ2ZXIsIG9wdGlvbnMpO1xuXG4gICAgaWYgKCFpbml0T3B0aW9ucz8uZG9TaWxlbnQpIHtcbiAgICAgIHRoaXMucHJpbnRTdGFydHVwU3VtbWFyeSgpO1xuICAgIH1cblxuICAgIHJldHVybiBzZXJ2ZXI7XG4gIH1cblxuICBhc3luYyB3aXRoRmFzdGlmeShcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICBvcHRpb25zPzoge1xuICAgICAgZW5hYmxlU3luYz86IGJvb2xlYW47XG4gICAgICBkb1NpbGVudD86IGJvb2xlYW47XG4gICAgfSxcbiAgKSB7XG4gICAgaWYgKCF0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW5pdChvcHRpb25zPy5kb1NpbGVudCwgb3B0aW9ucz8uZW5hYmxlU3luYyk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gICAgdGhpcy53ZWJzb2NrZXRSdW50aW1lID8/PSBuZXcgV2ViU29ja2V0UnVudGltZSh0aGlzLmNvbmZpZy5zZXJ2ZXIud2Vic29ja2V0KTtcblxuICAgIC8vIHRpbWV6b25lIOyEpOyglVxuICAgIGNvbnN0IHRpbWV6b25lID0gdGhpcy5jb25maWcuYXBpLnRpbWV6b25lO1xuICAgIGlmICh0aW1lem9uZSkge1xuICAgICAgLy8g7YOA7J6E7KG07JeQIOunnuqyjCDsnZHri7Ug64Kg7KecIOyKpO2KuOungeydhCDrs4DtmZjtlbTso7zslrTslbwg7ZWp64uI64ukLlxuICAgICAgLy8g6rCA66C5IHRpbWV6b25l7J20IFwiQXNpYS9TZW91bFwiIOydtOuptFxuICAgICAgLy8gXCIyMDI1LTExLTIxVDAwOjAwOjAwLjAwMFpcIiDrpbwgXCIyMDI1LTExLTIxVDA5OjAwOjAwKzA5OjAwXCIg7Jy866GcIOuzgO2ZmO2VtOyjvOyWtOyVvCDtlanri4jri6QuXG4gICAgICBjb25zdCB7IGZvcm1hdEluVGltZVpvbmUgfSA9IGF3YWl0IGltcG9ydChcImRhdGUtZm5zLXR6XCIpO1xuXG4gICAgICAvLyBJU08gODYwMSDrgqDsp5wg7ZiV7IudIOygleq3nOyLnSAo7JiIOiAyMDI0LTAxLTE1VDA5OjMwOjAwLjAwMFopXG4gICAgICBjb25zdCBJU09fREFURV9SRUdFWCA9IC9eXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oXFwuXFxkezN9KT9aJC87XG5cbiAgICAgIC8vIFTrpbwg65GY65+s7Iu8IOyekeydgOuUsOyYtO2RnOqwgCDsl4bri6TrqbQgXCIyMDI1LTExLTE5MTc2MzU0NjE4OTAwMDE4OjU2OjI5KzA5OjAwXCLsmYAg6rCZ7J2AIOqysOqzvOqwgCDrgpjsmLXri4jri6QuXG4gICAgICAvLyDsnbTripQgZGF0ZS1mbnMg7Yq57J6F64uI64ukLlxuICAgICAgLy8g7J2066CH6rKMIO2VtOuPhCDqtJzssK7sirXri4jri6QuIFwiMjAyNS0xMS0xOVQxODo1NjoyOSswOTowMFwiIOuqqOyWkeycvOuhnCDsnpgg64KY7Ji164uI64ukLlxuICAgICAgY29uc3QgREFURV9GT1JNQVQgPSBcInl5eXktTU0tZGQnVCdISDptbTpzc1hYWFwiO1xuXG4gICAgICBzZXJ2ZXIuc2V0UmVwbHlTZXJpYWxpemVyKChwYXlsb2FkKSA9PiB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwYXlsb2FkLCAoX2tleSwgdmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIElTT19EQVRFX1JFR0VYLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0SW5UaW1lWm9uZShcbiAgICAgICAgICAgICAgbmV3IERhdGUodmFsdWUpLFxuICAgICAgICAgICAgICB0aW1lem9uZSBhcyBgJHtzdHJpbmd9LyR7c3RyaW5nfWAsXG4gICAgICAgICAgICAgIERBVEVfRk9STUFULFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgLy8gVGltZXpvbmUg66Gc6re464qUIHByaW50U3RhcnR1cFN1bW1hcnnsl5DshJwg7Ya17ZWpIOy2nOugpVxuICAgIH1cblxuICAgIC8vIOyghOyytCDrnbzsmrDtjIUg66as7Iqk7Yq4XG4gICAgc2VydmVyLmdldChcbiAgICAgIGAke3RoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9L3JvdXRlc2AsXG4gICAgICBhc3luYyAoX3JlcXVlc3QsIF9yZXBseSk6IFByb21pc2U8dHlwZW9mIHRoaXMuc3luY2VyLmFwaXM+ID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3luY2VyLmFwaXM7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBIZWFsdGhjaGVjayBBUElcbiAgICBzZXJ2ZXIuZ2V0KFxuICAgICAgYCR7dGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeH0vaGVhbHRoY2hlY2tgLFxuICAgICAgYXN5bmMgKF9yZXF1ZXN0LCBfcmVwbHkpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgICAgICByZXR1cm4gXCJva1wiO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gU29uYW11IFVJIEFQSSAo66Gc7LusIO2ZmOqyveyXkOyEnOunjClcbiAgICBjb25zdCB7IGlzTG9jYWwgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIik7XG4gICAgaWYgKGlzTG9jYWwoKSkge1xuICAgICAgY29uc3QgeyBzb25hbXVVSUFwaVBsdWdpbiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdWkvYXBpXCIpO1xuICAgICAgc2VydmVyLnJlZ2lzdGVyKHNvbmFtdVVJQXBpUGx1Z2luKTtcbiAgICB9XG5cbiAgICAvLyBEZXZSdW5uZXIg7YWM7Iqk7Yq4IOyXlOuTnO2PrOyduO2KuCAo66Gc7LusIO2ZmOqyvSArIGRldlJ1bm5lciDtmZzshLHtmZQg7IucKVxuICAgIGlmIChpc0xvY2FsKCkgJiYgdGhpcy5jb25maWcudGVzdD8uZGV2UnVubmVyPy5lbmFibGVkKSB7XG4gICAgICBjb25zdCB7IHJlZ2lzdGVyRGV2VGVzdFJvdXRlcyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdGVzdGluZy9kZXYtdGVzdC1yb3V0ZXNcIik7XG4gICAgICBhd2FpdCByZWdpc3RlckRldlRlc3RSb3V0ZXMoc2VydmVyLCB0aGlzLmNvbmZpZy50ZXN0LmRldlJ1bm5lcik7XG4gICAgfVxuXG4gICAgY29uc3Qgd2ViUGF0aCA9IHBhdGguam9pbih0aGlzLmFwcFJvb3RQYXRoLCBcIndlYlwiKTtcbiAgICBjb25zdCBoYXNXZWIgPSBhd2FpdCBleGlzdHMod2ViUGF0aCk7XG5cbiAgICAvLyDsoITsl60gY29tcHJlc3Mg7Ji17IWYIOqzhOyCsCAocm91dGUuY29tcHJlc3M6IHRydWXsnbwg65WMIOyCrOyaqSlcbiAgICBjb25zdCBwbHVnaW5Db21wcmVzcyA9IHRoaXMuY29uZmlnLnNlcnZlci5wbHVnaW5zPy5jb21wcmVzcztcbiAgICBjb25zdCBnbG9iYWxDb21wcmVzc09wdGlvbnM6IENvbXByZXNzT3B0aW9ucyB8IHVuZGVmaW5lZCA9IHBsdWdpbkNvbXByZXNzXG4gICAgICA/IHBsdWdpbkNvbXByZXNzID09PSB0cnVlXG4gICAgICAgID8geyB0aHJlc2hvbGQ6IDEwMjQsIGVuY29kaW5nczogW1wiYnJcIiwgXCJnemlwXCIsIFwiZGVmbGF0ZVwiXSB9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgdGhyZXNob2xkOiBwbHVnaW5Db21wcmVzcy50aHJlc2hvbGQsXG4gICAgICAgICAgICBlbmNvZGluZ3M6IHBsdWdpbkNvbXByZXNzLmVuY29kaW5ncyxcbiAgICAgICAgICAgIGN1c3RvbVR5cGVzOiBwbHVnaW5Db21wcmVzcy5jdXN0b21UeXBlcyxcbiAgICAgICAgICB9XG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChpc0xvY2FsKCkpIHtcbiAgICAgIC8vIOuhnOy7rCDqsJzrsJwg7ZmY6rK9OiBjYXRjaC1hbGzroZwgQVBJ66W8IOuPmeyggSDrp6Tsua3tlZjsl6wgSE1S7J2EIOyngOybkO2VqeuLiOuLpC5cbiAgICAgIC8vIFNPTkFNVV9ESVNBQkxFX0lOVEVHUkFURURfV0VCPXllc+uhnCDshKTsoJXtlZjrqbQgZGV2X2FwaSDrqqjrk5zsl5DshJwgVml0ZSDthrXtlansnYQg67mE7Zmc7ISx7ZmU7ZWgIOyImCDsnojsirXri4jri6QuXG4gICAgICBjb25zdCBkaXNhYmxlSW50ZWdyYXRlZFdlYiA9IHByb2Nlc3MuZW52LlNPTkFNVV9ESVNBQkxFX0lOVEVHUkFURURfV0VCID09PSBcInllc1wiO1xuICAgICAgaWYgKGhhc1dlYiAmJiAhZGlzYWJsZUludGVncmF0ZWRXZWIpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXR1cERldlNlcnZlcldpdGhWaXRlKHNlcnZlciwgd2ViUGF0aCwgY29uZmlnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2V0dXBEZXZTZXJ2ZXIoc2VydmVyLCBjb25maWcpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyDtlITroZzrjZXshZgg7ZmY6rK9OiDqsJzrs4QgQVBJIOudvOyasO2KuCArIOygleyggSDtjIzsnbwg7ISc67mZXG4gICAgICBmb3IgKGNvbnN0IGFwaSBvZiB0aGlzLnN5bmNlci5hcGlzKSB7XG4gICAgICAgIGlmICh0aGlzLnN5bmNlci5tb2RlbHNbYXBpLm1vZGVsTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg7KCV7J2Y65CY7KeAIOyViuydgCDrqqjrjbjsl5Ag7KCR6re8ICR7YXBpLm1vZGVsTmFtZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEB3ZWJzb2NrZXQgcm91dGXripQgd3NIYW5kbGVy66GcIOuTseuhne2VmOqzoCwg6rCZ7J2AIHBhdGjsnZgg7J2867CYIEhUVFAgR0VU7J2AIDQyNiDsnZHri7XsnLzroZwgdXBncmFkZeulvCDqsJXsoJztlahcbiAgICAgICAgaWYgKGFwaS53ZWJzb2NrZXRPcHRpb25zKSB7XG4gICAgICAgICAgc2VydmVyLnJvdXRlKHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICAgIHVybDogdGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeCArIGFwaS5wYXRoLFxuICAgICAgICAgICAgaGFuZGxlcjogdGhpcy5jcmVhdGVXZWJTb2NrZXRVcGdyYWRlUmVxdWlyZWRIYW5kbGVyKCksXG4gICAgICAgICAgICB3c0hhbmRsZXI6IHRoaXMuY3JlYXRlV2ViU29ja2V0SGFuZGxlcihhcGksIGNvbmZpZyksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgICAgIG1ldGhvZDogYXBpLm9wdGlvbnMuaHR0cE1ldGhvZCA/PyBcIkdFVFwiLFxuICAgICAgICAgIHVybDogdGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeCArIGFwaS5wYXRoLFxuICAgICAgICAgIGhhbmRsZXI6IHRoaXMuY3JlYXRlQXBpSGFuZGxlcihhcGksIGNvbmZpZyksXG4gICAgICAgICAgY29tcHJlc3M6IHRvRmFzdGlmeUNvbXByZXNzT3B0aW9uKGFwaS5vcHRpb25zLmNvbXByZXNzLCBnbG9iYWxDb21wcmVzc09wdGlvbnMpLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8g7ZSE66Gc642V7IWY7JeQ7ISc64qUIHdlYiDshozsiqQoYXBwUm9vdC93ZWIpIOycoOustOyZgCDrrLTqtIDtlZjqsowsXG4gICAgICAvLyBhcGkvd2ViLWRpc3Qg7KG07J6sIOyXrOu2gOulvCBzZXR1cFN0YXRpY1dlYlNlcnZlciDrgrTrtoDsl5DshJwg7YyQ64uo7ZWp64uI64ukLlxuICAgICAgYXdhaXQgdGhpcy5zZXR1cFN0YXRpY1dlYlNlcnZlcihzZXJ2ZXIsIGNvbmZpZywgZ2xvYmFsQ29tcHJlc3NPcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZGV2IOuqqOuTnCDqs7XthrU6IGNhdGNoLWFsbOyXkOyEnCBzeW5jZXIuYXBpc+ulvCDrj5nsoIHsnLzroZwg7YOQ7IOJ7ZWY7JesIEFQSSDsmpTssq3snYQg7LKY66as7ZWp64uI64ukLlxuICAgKiBzZXJ2ZXIucm91dGUoKeuhnCDqsJzrs4Qg65Ox66Gd7ZWY66m0IGhhbmRsZXLqsIAg6rOg7KCV65CY7Ja0IEhNUuydtCDrj5nsnpHtlZjsp4Ag7JWK7Jy866+A66GcLFxuICAgKiDrp6Qg7JqU7LKt66eI64ukIHN5bmNlci5hcGlz66W8IOyhsO2ajO2VmOuKlCDsnbQg67Cp7Iud7J2EIOyCrOyaqe2VqeuLiOuLpC5cbiAgICpcbiAgICog7JqU7LKt7J20IC9hcGko7KCV7ZmV7Z6I64qUIHRoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXgp66GcIOyLnOyeke2VmOyngCDslYrripQg6rK97Jqw652866m0IG51bGzsnYQg67CY7ZmY7ZWY66mwIOuBneuDheuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgaGFuZGxlRGV2QXBpUmVxdWVzdChcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICk6ICgocmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpID0+IFByb21pc2U8dW5rbm93bj4pIHwgbnVsbCB7XG4gICAgY29uc3QgbWF0Y2hlZEFwaSA9IHRoaXMuZmluZE1hdGNoZWRBcGkocmVxdWVzdCk7XG5cbiAgICBpZiAoIW1hdGNoZWRBcGkpIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihTRChcImVycm9yLmFwaS5ub3RGb3VuZFwiKSk7XG4gICAgfVxuXG4gICAgLy8gd2Vic29ja2V0IHJvdXRl66W8IOydvOuwmCBIVFRQ66GcIOyngeygkSDtmLjstpztlZwg6rK97JqwIDQyNuydhCDrj4zroKTspJggdXBncmFkZSDsl4bsnbQg7KCR6re87ZWY64qUIOqyg+ydhCDssKjri6jtlahcbiAgICBpZiAobWF0Y2hlZEFwaS53ZWJzb2NrZXRPcHRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVXZWJTb2NrZXRVcGdyYWRlUmVxdWlyZWRIYW5kbGVyKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlQXBpSGFuZGxlcihtYXRjaGVkQXBpLCBjb25maWcpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kTWF0Y2hlZEFwaShyZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCk6IEV4dGVuZGVkQXBpIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB1cmwgPSB0aGlzLmdldFBhdGhuYW1lRnJvbVVybChyZXF1ZXN0LnVybCk7XG4gICAgY29uc3QgbWV0aG9kID0gcmVxdWVzdC5tZXRob2Q7XG5cbiAgICBpZiAoIXVybC5zdGFydHNXaXRoKHRoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXgpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN5bmNlci5hcGlzLmZpbmQoKGFwaSkgPT4ge1xuICAgICAgaWYgKHRoaXMuc3luY2VyLm1vZGVsc1thcGkubW9kZWxOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFwaU1ldGhvZCA9IGFwaS5vcHRpb25zLmh0dHBNZXRob2QgPz8gXCJHRVRcIjtcbiAgICAgIGlmIChhcGlNZXRob2QgIT09IG1ldGhvZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICBjb25zdCBmdWxsUGF0aCA9IHRoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXggKyBhcGkucGF0aDtcbiAgICAgIHJldHVybiB0aGlzLmlzUGF0aFBhdHRlcm5NYXRjaChmdWxsUGF0aCwgdXJsKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBkZXYgYXBpIOuqqOuTnDogVml0ZSDsl4bsnbQgQVBJIOuPmeyggSDrnbzsmrDtjIXrp4wg7KCc6rO17ZWp64uI64ukLlxuICAgKiBITVLsnYQg7JyE7ZW0IGNhdGNoLWFsbOyXkOyEnCDrp6Qg7JqU7LKt66eI64ukIHN5bmNlci5hcGlz66W8IOyhsO2ajO2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgc2V0dXBEZXZTZXJ2ZXIoXG4gICAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2U8U2VydmVyLCBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlPixcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICk6IHZvaWQge1xuICAgIC8vIHVwZ3JhZGXripQg7Iuk7KeI7KCB7Jy866GcIEdFVOyXkOyEnOunjCDshLHrpr3tlZjrr4DroZwgR0VUICsgd3NIYW5kbGVyIOyZgCDqt7gg7Jm4IG1ldGhvZOulvCDrs4Trj4Qgcm91dGXroZwg67aE66as7ZWoXG4gICAgc2VydmVyLnJvdXRlKHtcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIHVybDogYCR7dGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeH0vKmAsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMuaGFuZGxlRGV2QXBpUmVxdWVzdChyZXF1ZXN0LCBjb25maWcpO1xuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgIHJldHVybiBoYW5kbGVyKHJlcXVlc3QsIHJlcGx5KTtcbiAgICAgICAgfVxuICAgICAgICAvLyDrk7HroZ3rkJwgQVBJ7JmAIOydvOy5mO2VmOyngCDslYrripQg7JqU7LKt7JeQIOuMgO2VnCBmYWxsYmFja+yeheuLiOuLpC5cbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFNEKFwiZXJyb3IuYXBpLm5vdEZvdW5kXCIpKTtcbiAgICAgIH0sXG4gICAgICB3c0hhbmRsZXI6IGFzeW5jIChjb25uZWN0aW9uLCByZXF1ZXN0KSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRGV2V2ViU29ja2V0UmVxdWVzdChjb25uZWN0aW9uLnNvY2tldCwgcmVxdWVzdCwgY29uZmlnKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgbWV0aG9kOiBbXCJIRUFEXCIsIFwiUE9TVFwiLCBcIlBVVFwiLCBcIkRFTEVURVwiLCBcIlBBVENIXCJdLFxuICAgICAgdXJsOiBgJHt0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4fS8qYCxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVEZXZBcGlSZXF1ZXN0KHJlcXVlc3QsIGNvbmZpZyk7XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgcmV0dXJuIGhhbmRsZXIocmVxdWVzdCwgcmVwbHkpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihTRChcImVycm9yLmFwaS5ub3RGb3VuZFwiKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB2aXRlU2VydmVyOiBhbnkgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBkZXYgYWxsIOuqqOuTnDogVml0ZSBEZXYgU2VydmVy66W8IO2Gte2Vqe2VmOyXrCBBUEkgKyBTU1IgKyBDU1LsnYQg66qo65GQIOygnOqzte2VqeuLiOuLpC5cbiAgICogQVBJIOuPmeyggSDrp6Tsua3snYAgaGFuZGxlRGV2QXBpUmVxdWVzdOulvCDqs7XsnKDtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNldHVwRGV2U2VydmVyV2l0aFZpdGUoXG4gICAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2U8U2VydmVyLCBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlPixcbiAgICB3ZWJQYXRoOiBzdHJpbmcsXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBAZmFzdGlmeS9taWRkaWUg65Ox66GdIChDb25uZWN0LXN0eWxlIG1pZGRsZXdhcmUg7KeA7JuQKVxuICAgIGF3YWl0IHNlcnZlci5yZWdpc3RlcigoYXdhaXQgaW1wb3J0KFwiQGZhc3RpZnkvbWlkZGllXCIpKS5kZWZhdWx0KTtcblxuICAgIGNvbnN0IHZpdGUgPSBhd2FpdCBpbXBvcnQoXCJ2aXRlXCIpO1xuICAgIC8vIEBmYXN0aWZ5L3dlYnNvY2tldCDtlIzrn6zqt7jsnbjsnbQg7Zmc7ISx7ZmU65CY66m0IEhNUiB3ZWJzb2NrZXTqs7wgc2VydmVyIHNvY2tldOydtCDstqnrj4ztlZjrr4DroZwgZGVkaWNhdGVkIO2PrO2KuOuhnCDrtoTrpqztlahcbiAgICBjb25zdCByZXF1aXJlc0RlZGljYXRlZEhtclNlcnZlciA9IEJvb2xlYW4odGhpcy5jb25maWcuc2VydmVyLnBsdWdpbnM/LndzKTtcbiAgICBjb25zdCBobXIgPSByZXNvbHZlSW50ZWdyYXRlZFZpdGVIbXJPcHRpb25zKHtcbiAgICAgIGh0dHBTZXJ2ZXI6IHNlcnZlci5zZXJ2ZXIsXG4gICAgICByZXF1aXJlc0RlZGljYXRlZFdlYlNvY2tldFNlcnZlcjogcmVxdWlyZXNEZWRpY2F0ZWRIbXJTZXJ2ZXIsXG4gICAgfSk7XG5cbiAgICB0aGlzLnZpdGVTZXJ2ZXIgPSBhd2FpdCB2aXRlLmNyZWF0ZVNlcnZlcih7XG4gICAgICByb290OiB3ZWJQYXRoLFxuICAgICAgc2VydmVyOiB7XG4gICAgICAgIG1pZGRsZXdhcmVNb2RlOiB0cnVlLFxuICAgICAgICBobXIsXG4gICAgICB9LFxuICAgICAgYXBwVHlwZTogXCJjdXN0b21cIixcbiAgICB9KTtcblxuICAgIC8vIFZpdGUgbWlkZGxld2FyZSDrk7HroZ0gKFZpdGUg7JeQ7IWLIOyymOumrClcbiAgICBzZXJ2ZXIudXNlKChyZXEsIHJlcywgbmV4dCkgPT4ge1xuICAgICAgLy8gQVBJ7JmAIFNvbmFtdSBVSeuKlCBGYXN0aWZ5IOudvOyasO2KuOqwgCDsspjrpqztlZjrj4TroZ0gc2tpcFxuICAgICAgaWYgKHJlcS51cmw/LnN0YXJ0c1dpdGgodGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeCkgfHwgcmVxLnVybD8uc3RhcnRzV2l0aChcIi9zb25hbXUtdWlcIikpIHtcbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICAgIH1cbiAgICAgIC8vIOuCmOuouOyngOuKlCBWaXRlIG1pZGRsZXdhcmXroZwg7KCE64usXG4gICAgICByZXR1cm4gdGhpcy52aXRlU2VydmVyLm1pZGRsZXdhcmVzKHJlcSwgcmVzLCBuZXh0KTtcbiAgICB9KTtcblxuICAgIC8vIFdTIHVwZ3JhZGUg6rK966GcKEdFVCnsmYAg7J2867CYIEhUVFAg66mU7ISc65Oc66W8IOuzhOuPhCByb3V0ZeuhnCDrtoTrpqztlbQgd2Vic29ja2V0IHJvdXRl6rCAIEhUTUwgZmFsbGJhY2vsl5Ag66i57Z6I7KeAIOyViuuPhOuhnSDtlahcbiAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgdXJsOiBgJHt0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4fS8qYCxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmhhbmRsZURldkFwaVJlcXVlc3QocmVxdWVzdCwgY29uZmlnKTtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQocmVxdWVzdCwgcmVwbHkpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihTRChcImVycm9yLmFwaS5ub3RGb3VuZFwiKSk7XG4gICAgICB9LFxuICAgICAgd3NIYW5kbGVyOiBhc3luYyAoY29ubmVjdGlvbiwgcmVxdWVzdCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZURldldlYlNvY2tldFJlcXVlc3QoY29ubmVjdGlvbi5zb2NrZXQsIHJlcXVlc3QsIGNvbmZpZyk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgc2VydmVyLnJvdXRlKHtcbiAgICAgIG1ldGhvZDogW1wiSEVBRFwiLCBcIlBPU1RcIiwgXCJQVVRcIiwgXCJERUxFVEVcIiwgXCJQQVRDSFwiXSxcbiAgICAgIHVybDogYCR7dGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeH0vKmAsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5oYW5kbGVEZXZBcGlSZXF1ZXN0KHJlcXVlc3QsIGNvbmZpZyk7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0KHJlcXVlc3QsIHJlcGx5KTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oU0QoXCJlcnJvci5hcGkubm90Rm91bmRcIikpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIGNhdGNoLWFsbCDrnbzsmrDtirjsl5DshJwgU1NSL0NTUiDsspjrpqxcbiAgICAvLyDqsJzrsJwg7ZmY6rK97JeQ7ISc64qUIOudvOyasO2KuOuzhCBjb21wcmVzcyDsmLXshZjsnYQg7Y+s6riw7ZWY6rOgIEhNUiDsnbTsoJDsnYQg7Leo7ZWp64uI64ukLlxuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFtcIkdFVFwiLCBcIkhFQURcIl0sXG4gICAgICB1cmw6IFwiLypcIixcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICBjb25zdCB1cmwgPSByZXF1ZXN0LnVybDtcblxuICAgICAgICAvLyAxLiBTU1Ig65287Jqw7Yq4IOyymOumrFxuICAgICAgICBjb25zdCB7IG1hdGNoU1NSUm91dGUsIHJlbmRlclNTUiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3NyXCIpO1xuICAgICAgICBjb25zdCBzc3JNYXRjaCA9IG1hdGNoU1NSUm91dGUodXJsKTtcbiAgICAgICAgaWYgKHNzck1hdGNoKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYFtTU1JdIE1hdGNoZWQgcm91dGU6ICR7c3NyTWF0Y2gucm91dGUucGF0aH1gKTtcbiAgICAgICAgICBjb25zdCBodG1sID0gYXdhaXQgcmVuZGVyU1NSKFxuICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgc3NyTWF0Y2gucm91dGUsXG4gICAgICAgICAgICBzc3JNYXRjaC5wYXJhbXMsXG4gICAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgICAgcmVwbHksXG4gICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICB0aGlzLnZpdGVTZXJ2ZXIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXBseS50eXBlKFwidGV4dC9odG1sXCIpO1xuICAgICAgICAgIHJldHVybiBodG1sO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMi4gQ1NSIGZhbGxiYWNrXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZnMgPSBhd2FpdCBpbXBvcnQoXCJub2RlOmZzL3Byb21pc2VzXCIpO1xuICAgICAgICAgIGxldCB0ZW1wbGF0ZSA9IGF3YWl0IGZzLnJlYWRGaWxlKFxuICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMudml0ZVNlcnZlci5jb25maWcucm9vdCwgXCJpbmRleC5odG1sXCIpLFxuICAgICAgICAgICAgXCJ1dGYtOFwiLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGVtcGxhdGUgPSBhd2FpdCB0aGlzLnZpdGVTZXJ2ZXIudHJhbnNmb3JtSW5kZXhIdG1sKHVybCwgdGVtcGxhdGUpO1xuXG4gICAgICAgICAgcmVwbHkudHlwZShcInRleHQvaHRtbFwiKTtcbiAgICAgICAgICByZXR1cm4gdGVtcGxhdGU7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0aGlzLnZpdGVTZXJ2ZXIuc3NyRml4U3RhY2t0cmFjZShlIGFzIEVycm9yKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgIHJlcGx5LnN0YXR1cyg1MDApO1xuICAgICAgICAgIHJldHVybiAoZSBhcyBFcnJvcikubWVzc2FnZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIOyEnOuyhCDsooXro4wg7IucIFZpdGXrj4Qg7KKF66OMXG4gICAgc2VydmVyLmFkZEhvb2soXCJvbkNsb3NlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMudml0ZVNlcnZlci5jbG9zZSgpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgaWYgKFwicG9ydFwiIGluIGhtcikge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLmRpbShcbiAgICAgICAgICBg4pyTIFZpdGUgSE1SIHVzaW5nIGRlZGljYXRlZCB3ZWJzb2NrZXQgcG9ydCAke2htci5wb3J0fSB0byBhdm9pZCBGYXN0aWZ5IHdlYnNvY2tldCBjb25mbGljdHNgLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKFwi4pyTIFZpdGUgZGV2IHNlcnZlciBpbnRlZ3JhdGVkXCIpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2V0dXBTdGF0aWNXZWJTZXJ2ZXIoXG4gICAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2U8U2VydmVyLCBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlPixcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICAgZ2xvYmFsQ29tcHJlc3NPcHRpb25zOiBDb21wcmVzc09wdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIOqyveuhnCDrqoXtmZXtmZQ6IGFwaS93ZWItZGlzdC9jbGllbnQgKOygleyggSDtjIzsnbwpLCBhcGkvd2ViLWRpc3Qvc2VydmVyIChTU1IgZW50cnkpLCBhcGkvZGlzdC9zc3IgKFNTUiByb3V0ZXMgLSBBUEkg7IaM7JygKVxuICAgIGNvbnN0IHdlYkRpc3RQYXRoID0gcGF0aC5qb2luKHRoaXMuYXBpUm9vdFBhdGgsIFwid2ViLWRpc3RcIiwgXCJjbGllbnRcIik7XG4gICAgY29uc3Qgc3NyUGF0aCA9IHBhdGguam9pbih0aGlzLmFwaVJvb3RQYXRoLCBcIndlYi1kaXN0XCIsIFwic2VydmVyXCIpO1xuICAgIGNvbnN0IHNzckVudHJ5UGF0aCA9IHBhdGguam9pbihzc3JQYXRoLCBcImVudHJ5LXNlcnZlci5nZW5lcmF0ZWQuanNcIik7XG4gICAgY29uc3Qgc3NyUm91dGVzUGF0aCA9IHBhdGguam9pbih0aGlzLmFwaVJvb3RQYXRoLCBcImRpc3RcIiwgXCJzc3JcIiwgXCJyb3V0ZXMuanNcIik7XG5cbiAgICBpZiAoIShhd2FpdCBleGlzdHMod2ViRGlzdFBhdGgpKSkge1xuICAgICAgY29uc29sZS53YXJuKGDimqAgV2ViIGRpc3Qgbm90IGZvdW5kOiAke3dlYkRpc3RQYXRofWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNTUiBlbnRyeSDsobTsnqwg7Jes67aAIO2ZleyduFxuICAgIGNvbnN0IHNzckF2YWlsYWJsZSA9IGF3YWl0IGV4aXN0cyhzc3JFbnRyeVBhdGgpO1xuXG4gICAgaWYgKCFzc3JBdmFpbGFibGUpIHtcbiAgICAgIGNvbnNvbGUud2Fybihg4pqgIFNTUiBlbnRyeSBub3QgZm91bmQ6ICR7c3NyRW50cnlQYXRofWApO1xuICAgICAgY29uc29sZS53YXJuKFwiICBTU1Igd2lsbCBiZSBkaXNhYmxlZC4gT25seSBDU1Igd2lsbCB3b3JrLlwiKTtcbiAgICB9XG5cbiAgICAvLyBTU1Ig65287Jqw7Yq4IOuhnOuTnCAocHJvZHVjdGlvbuyXkOyEnOunjCwg7IKs7Jqp7J6QIO2UhOuhnOygne2KuOydmCBzc3Ivcm91dGVzLnRzKVxuICAgIGlmIChzc3JBdmFpbGFibGUpIHtcbiAgICAgIGlmIChhd2FpdCBleGlzdHMoc3NyUm91dGVzUGF0aCkpIHtcbiAgICAgICAgLy8gdHMtbG9hZGVy652866m0IFwiZmlsZTovL1wi66GcIOyLnOyeke2VmOuKlCBmdWxseS1yZXNvbHZlZCBwYXRo66eMIOuwm+q4sOyXkCDsnbTrpbwg7LKY66as7ZW07KO864qUIGltcG9ydE1lbWJlcnPrpbwg7IKs7Jqp7ZW07JW8IO2WiOqyoOyngOunjCxcbiAgICAgICAgLy8g7Jes6riw64qUIO2UhOuhnOuNleyFmCDtmZjqsr3sl5DshJwgbG9hZGVyIOyXhuydtCDrj4zslYTqsIDquLAg65WM66y47JeQIFwi7KeE7KecIGpzIO2MjOydvFwi7J2YIFwi6re464OlXCIg7KCI64yA6rK966Gc66W8IOuwlOuhnCBpbXBvcnTtlbTrj4Qg65Cp64uI64ukLlxuICAgICAgICAvLyDsnbQg64K07Jqp7J2AIOydtCDtlajsiJgg64K07JeQ7IScIOyVhOuemOyXkCDrgpjsmKwg64uk66W4IGltcG9ydCDtmLjstpzsl5Drj4Qg64+Z7J287ZWY6rKMIOyggeyaqeuQqeuLiOuLpC5cbiAgICAgICAgYXdhaXQgaW1wb3J0KHNzclJvdXRlc1BhdGgpO1xuICAgICAgICBjb25zb2xlLmxvZyhcIuKckyBTU1Igcm91dGVzIGxvYWRlZFwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2Fybihg4pqgIFNTUiByb3V0ZXMgbm90IGZvdW5kOiAke3NzclJvdXRlc1BhdGh9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g66Gk66eBIOyXheuNsOydtO2KuCDrjIDsnZE6IGFzc2V0IGhhc2gg67aI7J287LmYIOyLnCDtmITsnqwg67KE7KCEIOyngeygkSDshJzruZlcbiAgICBzZXJ2ZXIuZ2V0KFwiL2Fzc2V0cy86ZmlsZW5hbWVcIiwgYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0ZWRGaWxlID0gKHJlcXVlc3QucGFyYW1zIGFzIHsgZmlsZW5hbWU6IHN0cmluZyB9KS5maWxlbmFtZTtcbiAgICAgIGNvbnN0IGFzc2V0c0RpciA9IHBhdGguam9pbih3ZWJEaXN0UGF0aCwgXCJhc3NldHNcIik7XG4gICAgICBjb25zdCBzYWZlRmlsZVBhdGggPSB0aGlzLnJlc29sdmVQYXRoV2l0aGluQmFzZURpcihhc3NldHNEaXIsIHJlcXVlc3RlZEZpbGUpO1xuICAgICAgaWYgKHNhZmVGaWxlUGF0aCA9PT0gbnVsbCkge1xuICAgICAgICByZXBseS5zdGF0dXMoNDAzKS5zZW5kKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRSZXF1ZXN0ZWRGaWxlID0gcGF0aC5yZWxhdGl2ZShhc3NldHNEaXIsIHNhZmVGaWxlUGF0aCkucmVwbGFjZSgvXFxcXC9nLCBcIi9cIik7XG5cbiAgICAgIGNvbnN0IGFzc2V0UGF0aCA9IGAvYXNzZXRzLyR7bm9ybWFsaXplZFJlcXVlc3RlZEZpbGV9YDtcblxuICAgICAgLy8gQ2FjaGUtQ29udHJvbCDtl6TrjZQg6rKw7KCVXG4gICAgICBjb25zdCBnZXRDYWNoZUNvbnRyb2xGb3JBc3NldCA9ICgpOiBDYWNoZUNvbnRyb2xDb25maWcgPT4ge1xuICAgICAgICBjb25zdCBjYWNoZVJlcTogQ2FjaGVDb250cm9sUmVxdWVzdCA9IHtcbiAgICAgICAgICB0eXBlOiBcImFzc2V0c1wiLFxuICAgICAgICAgIHVybDogcmVxdWVzdC51cmwsXG4gICAgICAgICAgcGF0aDogYXNzZXRQYXRoLFxuICAgICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8g7IKs7Jqp7J6QIOygleydmCDtlbjrk6Trn6wg7Jqw7ISgXG4gICAgICAgIGlmIChjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcikge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKGNhY2hlUmVxKTtcbiAgICAgICAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g6riw67O46rCSOiBpbW11dGFibGVcbiAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5pbW11dGFibGU7XG4gICAgICB9O1xuXG4gICAgICAvLyBpbmRleC0qLmpzIOuYkOuKlCBpbmRleC0qLmNzcyDsmpTssq3snbgg6rK97JqwXG4gICAgICBpZiAoL15pbmRleC1bYS1mMC05XStcXC4oanN8Y3NzKSQvLnRlc3Qobm9ybWFsaXplZFJlcXVlc3RlZEZpbGUpKSB7XG4gICAgICAgIGNvbnN0IGV4dCA9IG5vcm1hbGl6ZWRSZXF1ZXN0ZWRGaWxlLnNwbGl0KFwiLlwiKS5wb3AoKTtcbiAgICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGFzc2V0c0Rpcik7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRGaWxlID0gZmlsZXMuZmluZCgoZikgPT4gZi5zdGFydHNXaXRoKFwiaW5kZXgtXCIpICYmIGYuZW5kc1dpdGgoYC4ke2V4dH1gKSk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRGaWxlKSB7XG4gICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oYXNzZXRzRGlyLCBjdXJyZW50RmlsZSk7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoKTtcbiAgICAgICAgICByZXBseS50eXBlKGV4dCA9PT0gXCJqc1wiID8gXCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0XCIgOiBcInRleHQvY3NzXCIpO1xuICAgICAgICAgIGFwcGx5Q2FjaGVIZWFkZXJzKHJlcGx5LCBnZXRDYWNoZUNvbnRyb2xGb3JBc3NldCgpKTtcbiAgICAgICAgICByZXR1cm4gcmVwbHkuc2VuZChjb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyDsnbzrsJgg7YyM7J28IOyEnOu5mVxuICAgICAgY29uc3QgZmlsZVBhdGggPSBzYWZlRmlsZVBhdGg7XG4gICAgICBpZiAoYXdhaXQgZXhpc3RzKGZpbGVQYXRoKSkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgpO1xuICAgICAgICBjb25zdCBleHQgPSBub3JtYWxpemVkUmVxdWVzdGVkRmlsZS5zcGxpdChcIi5cIikucG9wKCk7XG4gICAgICAgIHJlcGx5LnR5cGUoZXh0ID09PSBcImpzXCIgPyBcImFwcGxpY2F0aW9uL2phdmFzY3JpcHRcIiA6IGV4dCA9PT0gXCJjc3NcIiA/IFwidGV4dC9jc3NcIiA6IFwiXCIpO1xuICAgICAgICBpZiAobm9ybWFsaXplZFJlcXVlc3RlZEZpbGUuaW5jbHVkZXMoXCItXCIpKSB7XG4gICAgICAgICAgYXBwbHlDYWNoZUhlYWRlcnMocmVwbHksIGdldENhY2hlQ29udHJvbEZvckFzc2V0KCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXBseS5zZW5kKGNvbnRlbnQpO1xuICAgICAgfVxuXG4gICAgICByZXBseS5zdGF0dXMoNDA0KS5zZW5kKCk7XG4gICAgfSk7XG5cbiAgICAvLyBTU1Ig65287Jqw7Yq4IOqwnOuzhCDrk7HroZ0gKGNvbXByZXNzIOyYteyFmOydtCDrnbzsmrDtirjrs4TroZwg7KCB7Jqp65CY64+E66GdKVxuICAgIGlmIChzc3JBdmFpbGFibGUpIHtcbiAgICAgIGNvbnN0IHsgZ2V0U1NSUm91dGVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zc3JcIik7XG4gICAgICBjb25zdCB7IHJlbmRlclNTUiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3NyL3JlbmRlcmVyXCIpO1xuICAgICAgY29uc3Qgc3NyUm91dGVzID0gZ2V0U1NSUm91dGVzKCk7XG5cbiAgICAgIGZvciAoY29uc3Qgcm91dGUgb2Ygc3NyUm91dGVzKSB7XG4gICAgICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICAgICAgbWV0aG9kOiBbXCJHRVRcIiwgXCJIRUFEXCJdLFxuICAgICAgICAgIHVybDogcm91dGUucGF0aCxcbiAgICAgICAgICBjb21wcmVzczogdG9GYXN0aWZ5Q29tcHJlc3NPcHRpb24ocm91dGUuY29tcHJlc3MgPz8gdHJ1ZSwgZ2xvYmFsQ29tcHJlc3NPcHRpb25zKSxcbiAgICAgICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IHJlcXVlc3QudXJsO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFtTU1JdIE1hdGNoZWQgcm91dGU6ICR7cm91dGUucGF0aH1gKTtcblxuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gdGhpcy5leHRyYWN0UGF0aFBhcmFtcyhyb3V0ZS5wYXRoLCB1cmwpO1xuICAgICAgICAgICAgY29uc3QgaHRtbCA9IGF3YWl0IHJlbmRlclNTUih1cmwsIHJvdXRlLCBwYXJhbXMsIHJlcXVlc3QsIHJlcGx5LCBjb25maWcpO1xuXG4gICAgICAgICAgICByZXBseS50eXBlKFwidGV4dC9odG1sXCIpO1xuICAgICAgICAgICAgcmV0dXJuIGh0bWw7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ1NSIG9yIFN0YXRpYyBGaWxlIEZhbGxiYWNrIChTU1Ig65287Jqw7Yq47JeQIOunpOy5reuQmOyngCDslYrripQg66qo65OgIOyalOyyrSlcbiAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgbWV0aG9kOiBbXCJHRVRcIiwgXCJIRUFEXCJdLFxuICAgICAgdXJsOiBcIipcIixcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICAvLyAvYXBpLCAvc29uYW11LXVp64qUIDQwNCDqt7jrjIDroZxcbiAgICAgICAgaWYgKHJlcXVlc3QudXJsLnN0YXJ0c1dpdGgoXCIvYXBpXCIpIHx8IHJlcXVlc3QudXJsLnN0YXJ0c1dpdGgoXCIvc29uYW11LXVpXCIpKSB7XG4gICAgICAgICAgcmVwbHkuc3RhdHVzKDQwNCkuc2VuZCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENTUuyaqSBDYWNoZS1Db250cm9sIO2XpOuNlCDshKTsoJVcbiAgICAgICAgaWYgKGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKSB7XG4gICAgICAgICAgY29uc3QgY3NyQ2FjaGVSZXE6IENhY2hlQ29udHJvbFJlcXVlc3QgPSB7XG4gICAgICAgICAgICB0eXBlOiBcImNzclwiLFxuICAgICAgICAgICAgdXJsOiByZXF1ZXN0LnVybCxcbiAgICAgICAgICAgIHBhdGg6IHJlcXVlc3QudXJsLnNwbGl0KFwiP1wiKVswXSxcbiAgICAgICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBjc3JDYWNoZUNvbmZpZyA9IGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKGNzckNhY2hlUmVxKTtcblxuICAgICAgICAgIGlmIChjc3JDYWNoZUNvbmZpZykge1xuICAgICAgICAgICAgYXBwbHlDYWNoZUhlYWRlcnMocmVwbHksIGNzckNhY2hlQ29uZmlnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyDsoJXsoIEg7YyM7J287J20IOyhtOyerO2VoCDqsr3smrAsIOygleyggSDtjIzsnbzsnYQg66i87KCAIOyEnOu5me2VtOyVvO2VqFxuICAgICAgICBjb25zdCByZXF1ZXN0UGF0aCA9IHRoaXMuZ2V0UGF0aG5hbWVGcm9tVXJsKHJlcXVlc3QudXJsKTtcbiAgICAgICAgY29uc3Qgc2FmZUZpbGVQYXRoID0gdGhpcy5yZXNvbHZlUGF0aFdpdGhpbkJhc2VEaXIod2ViRGlzdFBhdGgsIHJlcXVlc3RQYXRoKTtcbiAgICAgICAgaWYgKHNhZmVGaWxlUGF0aCA9PT0gbnVsbCkge1xuICAgICAgICAgIHJlcGx5LnN0YXR1cyg0MDMpLnNlbmQoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGF3YWl0IGZpbGVFeGlzdHMoc2FmZUZpbGVQYXRoKSkge1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShzYWZlRmlsZVBhdGgpO1xuICAgICAgICAgIHJldHVybiByZXBseS50eXBlKG1pbWVMb29rdXAoc2FmZUZpbGVQYXRoKSB8fCBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiKS5zZW5kKGNvbnRlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ1NSIGZhbGxiYWNrOiBpbmRleC5odG1sIOyEnOu5mVxuICAgICAgICBjb25zdCBpbmRleFBhdGggPSBwYXRoLmpvaW4od2ViRGlzdFBhdGgsIFwiaW5kZXguaHRtbFwiKTtcbiAgICAgICAgcmV0dXJuIHJlcGx5LnR5cGUoXCJ0ZXh0L2h0bWxcIikuc2VuZChhd2FpdCBmcy5yZWFkRmlsZShpbmRleFBhdGgsIFwidXRmLThcIikpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKGDinJMgU3RhdGljIHdlYiBzZXJ2ZXIgY29uZmlndXJlZCB3aXRoICR7c3NyQXZhaWxhYmxlID8gXCJTU1JcIiA6IFwiQ1NSIG9ubHlcIn0gc3VwcG9ydGApO1xuICB9XG5cbiAgY3JlYXRlQXBpSGFuZGxlcihcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKTogKHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LCByZXBseTogRmFzdGlmeVJlcGx5KSA9PiBQcm9taXNlPHVua25vd24+IHtcbiAgICByZXR1cm4gYXN5bmMgKHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LCByZXBseTogRmFzdGlmeVJlcGx5KTogUHJvbWlzZTx1bmtub3duPiA9PiB7XG4gICAgICAvLyBDb250ZXh0IOyDneyEsVxuICAgICAgY29uc3QgY29udGV4dDogQ29udGV4dCA9IGF3YWl0IHRoaXMuY3JlYXRlQ29udGV4dChjb25maWcsIHJlcXVlc3QsIHJlcGx5KTtcblxuICAgICAgcmV0dXJuIHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UucnVuKHsgY29udGV4dCB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIGd1YXJkcyDsspjrpqxcbiAgICAgICAgcnVuR3VhcmRzKHtcbiAgICAgICAgICBndWFyZHM6IGFwaS5vcHRpb25zLmd1YXJkcyxcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICBhcGksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIO2MjOudvOuvuO2EsCDsoJXrs7TroZwgem9kIOyKpO2CpOuniCDruYzrk5xcbiAgICAgICAgY29uc3QgeyBnZXRab2RPYmplY3RGcm9tQXBpIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2NvZGUtY29udmVydGVyc1wiKTtcbiAgICAgICAgY29uc3QgUmVxVHlwZSA9IGdldFpvZE9iamVjdEZyb21BcGkoYXBpLCB0aGlzLnN5bmNlci50eXBlcyk7XG5cbiAgICAgICAgLy8gcmVxdWVzdCDtjIzsi7FcbiAgICAgICAgY29uc3Qgd2hpY2ggPSBhcGkub3B0aW9ucy5odHRwTWV0aG9kID09PSBcIkdFVFwiID8gXCJxdWVyeVwiIDogXCJib2R5XCI7XG4gICAgICAgIGxldCByZXFCb2R5OiB7XG4gICAgICAgICAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbiAgICAgICAgfTtcbiAgICAgICAgLy8g7YyM7J28IOyXheuhnOuTnCDsnojripQg6rK97JqwIOyehOyLnCDrjbDsnbTthLBcbiAgICAgICAgY29uc3QgZmlsZXM6IHtcbiAgICAgICAgICBidWZmZXJlZEZpbGVzOiBCdWZmZXJlZEZpbGVbXTtcbiAgICAgICAgICB1cGxvYWRlZEZpbGVzOiBVcGxvYWRlZEZpbGVbXTtcbiAgICAgICAgfSA9IHtcbiAgICAgICAgICBidWZmZXJlZEZpbGVzOiBbXSxcbiAgICAgICAgICB1cGxvYWRlZEZpbGVzOiBbXSxcbiAgICAgICAgfTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGJvZHkgPSAocmVxdWVzdFt3aGljaF0gPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgIGlmIChhcGkudXBsb2FkT3B0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgcGFydHMgPSByZXF1ZXN0LnBhcnRzKHtcbiAgICAgICAgICAgICAgbGltaXRzOiBhcGkudXBsb2FkT3B0aW9ucy5saW1pdHMsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gRm9ybURhdGHsnZggZmllbGTrk6TsnYQg7J6E7Iuc66GcIOyggOyepVxuICAgICAgICAgICAgY29uc3QgZmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgICAgICAgICAgIGlmIChhcGkudXBsb2FkT3B0aW9ucy5jb25zdW1lID09PSBcImJ1ZmZlclwiIHx8ICFhcGkudXBsb2FkT3B0aW9ucy5jb25zdW1lKSB7XG4gICAgICAgICAgICAgIC8vIEJ1ZmZlciDrqqjrk5w6IOuplOuqqOumrOyXkCDroZzrk5xcbiAgICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gXCJmaWxlXCIpIHtcbiAgICAgICAgICAgICAgICAgIC8vIENSSVRJQ0FMOiDtjIzsnbwg7Iqk7Yq466a87J2EIOymieyLnCBjb25zdW1l7ZW07JW8IOuLpOydjCBwYXJ066GcIOuEmOyWtOqwiCDsiJgg7J6I7J2MXG4gICAgICAgICAgICAgICAgICAvLyDsnbQg7Zi47Lac7J20IOyXhuycvOuptCDsooXsooUgbXVsdGlwYXJ0IO2MjOyLseydtCBwZW5kaW5nIOyDge2DnOuhnCDtg4DsnoTslYTsm4Mg67Cc7IOdXG4gICAgICAgICAgICAgICAgICBjb25zdCBidWZmZXIgPSBhd2FpdCBwYXJ0LnRvQnVmZmVyKCk7XG4gICAgICAgICAgICAgICAgICBmaWxlcy5idWZmZXJlZEZpbGVzLnB1c2gobmV3IEJ1ZmZlcmVkRmlsZShwYXJ0LCBidWZmZXIpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQudHlwZSA9PT0gXCJmaWVsZFwiKSB7XG4gICAgICAgICAgICAgICAgICBmaWVsZHNbcGFydC5maWVsZG5hbWVdID0gU3RyaW5nKHBhcnQudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChhcGkudXBsb2FkT3B0aW9ucy5jb25zdW1lID09PSBcInN0cmVhbVwiKSB7XG4gICAgICAgICAgICAgIC8vIFN0cmVhbSDrqqjrk5w6IOymieyLnCDsoIDsnqXshozroZwg7Iqk7Yq466as67CNXG4gICAgICAgICAgICAgIGNvbnN0IGRpc2tOYW1lID0gYXBpLnVwbG9hZE9wdGlvbnMuZGVzdGluYXRpb247XG4gICAgICAgICAgICAgIGNvbnN0IGRpc2sgPSB0aGlzLnN0b3JhZ2UudXNlKGRpc2tOYW1lKTtcblxuICAgICAgICAgICAgICAvLyDsmrDshKDsiJzsnIQ6IOuNsOy9lOugiOydtO2EsCA+IOyghOyXrSDshKTsoJUgPiDquLDrs7jqsJJcbiAgICAgICAgICAgICAgY29uc3Qga2V5R2VuZXJhdG9yOiBLZXlHZW5lcmF0b3IgPVxuICAgICAgICAgICAgICAgIGFwaS51cGxvYWRPcHRpb25zLmtleUdlbmVyYXRvciA/P1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnNlcnZlci5zdG9yYWdlPy5rZXlHZW5lcmF0b3IgPz9cbiAgICAgICAgICAgICAgICBkZWZhdWx0S2V5R2VuZXJhdG9yO1xuXG4gICAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0LnR5cGUgPT09IFwiZmlsZVwiKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBrZXlHZW5lcmF0b3Ioe1xuICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogcGFydC5maWxlbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbWltZXR5cGU6IHBhcnQubWltZXR5cGUsXG4gICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgYXdhaXQgZGlzay5wdXRTdHJlYW0oa2V5LCBwYXJ0LmZpbGUsIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGU6IHBhcnQubWltZXR5cGUsXG4gICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgZGlzay5nZXRVcmwoa2V5KTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNpZ25lZFVybCA9IGF3YWl0IGRpc2suZ2V0U2lnbmVkVXJsKGtleSk7XG5cbiAgICAgICAgICAgICAgICAgIGZpbGVzLnVwbG9hZGVkRmlsZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgbmV3IFVwbG9hZGVkRmlsZSh7XG4gICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IHBhcnQuZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgbWltZXR5cGU6IHBhcnQubWltZXR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgc2l6ZTogcGFydC5maWxlLmJ5dGVzUmVhZCxcbiAgICAgICAgICAgICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICAgICAgICAgICAgc2lnbmVkVXJsLFxuICAgICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgICBkaXNrTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC50eXBlID09PSBcImZpZWxkXCIpIHtcbiAgICAgICAgICAgICAgICAgIGZpZWxkc1twYXJ0LmZpZWxkbmFtZV0gPSBTdHJpbmcocGFydC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHFz66GcIOykkeyyqSDqtazsobAg7YyM7IuxOiBwYXJhbXNbY2F0ZWdvcnldIOKGkiB7IHBhcmFtczogeyBjYXRlZ29yeTogXCJ0ZXN0XCIgfSB9XG4gICAgICAgICAgICBjb25zdCBxcyA9IGF3YWl0IGltcG9ydChcInFzXCIpO1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcXMuZGVmYXVsdC5wYXJzZShmaWVsZHMpO1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihib2R5LCBwYXJzZWQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHsgZmFzdGlmeUNhc3RlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi9jYXN0ZXJcIik7XG4gICAgICAgICAgcmVxQm9keSA9IGZhc3RpZnlDYXN0ZXIoUmVxVHlwZSkucGFyc2UoYm9keSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zdCB7IFpvZEVycm9yIH0gPSBhd2FpdCBpbXBvcnQoXCJ6b2RcIik7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBab2RFcnJvcikge1xuICAgICAgICAgICAgY29uc3QgeyBodW1hbml6ZVpvZEVycm9yIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy96b2QtZXJyb3JcIik7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlcyA9IGh1bWFuaXplWm9kRXJyb3IoZSlcbiAgICAgICAgICAgICAgLm1hcCgoaXNzdWUpID0+IGlzc3VlLm1lc3NhZ2UpXG4gICAgICAgICAgICAgIC5qb2luKFwiIFwiKTtcbiAgICAgICAgICAgIGNvbnN0IHsgQmFkUmVxdWVzdEV4Y2VwdGlvbiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCIpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24obWVzc2FnZXMgYXMgTG9jYWxpemVkU3RyaW5nLCB7XG4gICAgICAgICAgICAgIHpvZEVycm9yOiBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29udGVudC1UeXBlXG4gICAgICAgIHJlcGx5LnR5cGUoYXBpLm9wdGlvbnMuY29udGVudFR5cGUgPz8gXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuXG4gICAgICAgIC8vIENhY2hlLUNvbnRyb2wg7Zek642UIOyEpOyglVxuICAgICAgICBjb25zdCBhcGlDYWNoZUNvbmZpZyA9IHRoaXMuZ2V0QXBpQ2FjaGVDb250cm9sKGFwaSwgcmVxdWVzdCwgY29uZmlnKTtcbiAgICAgICAgaWYgKGFwaUNhY2hlQ29uZmlnKSB7XG4gICAgICAgICAgYXBwbHlDYWNoZUhlYWRlcnMocmVwbHksIGFwaUNhY2hlQ29uZmlnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOyXheuhnOuTnCDsmLXshZjsnbQg7J6I64qUIOqyveyasCDtjIzsnbwg642w7J207YSw66W8IENvbnRleHTsl5Ag7LaU6rCAXG4gICAgICAgIGlmIChhcGkudXBsb2FkT3B0aW9ucykge1xuICAgICAgICAgIGNvbnN0IGNvbnN1bWUgPSBhcGkudXBsb2FkT3B0aW9ucy5jb25zdW1lID8/IFwiYnVmZmVyXCI7XG4gICAgICAgICAgaWYgKGNvbnN1bWUgPT09IFwiYnVmZmVyXCIpIHtcbiAgICAgICAgICAgIGNvbnRleHQuYnVmZmVyZWRGaWxlcyA9IGZpbGVzLmJ1ZmZlcmVkRmlsZXM7XG4gICAgICAgICAgfSBlbHNlIGlmIChjb25zdW1lID09PSBcInN0cmVhbVwiKSB7XG4gICAgICAgICAgICBjb250ZXh0LnVwbG9hZGVkRmlsZXMgPSBmaWxlcy51cGxvYWRlZEZpbGVzO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOuqqOuNuCDrqZTshozrk5wgYXJncyDsg53shLHtlZjsl6wg7Zi47LacXG4gICAgICAgIGNvbnN0IHsgQXBpUGFyYW1UeXBlIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi90eXBlcy90eXBlc1wiKTtcbiAgICAgICAgY29uc3QgYXJncyA9IGFwaS5wYXJhbWV0ZXJzLm1hcCgocGFyYW0pID0+IHtcbiAgICAgICAgICAvLyBDb250ZXh0IOyduOygneyFmFxuICAgICAgICAgIGlmIChBcGlQYXJhbVR5cGUuaXNDb250ZXh0KHBhcmFtLnR5cGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJlcUJvZHlbcGFyYW0ubmFtZV07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5pbnZva2VNb2RlbE1ldGhvZChhcGksIGFyZ3MsIHJlcGx5KTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICAvLyBXUyBwYXRo66W8IOydvOuwmCBIVFRQIEdFVOycvOuhnCDtmLjstpztlZwg6rK97JqwIDQyNiArIFVwZ3JhZGUg7Zek642U66GcIOuqheyLnOyggeycvOuhnCB3ZWJzb2NrZXQg7KCR7IaN7J2EIOycoOuPhO2VqFxuICBwcml2YXRlIGNyZWF0ZVdlYlNvY2tldFVwZ3JhZGVSZXF1aXJlZEhhbmRsZXIoKSB7XG4gICAgcmV0dXJuIGFzeW5jIChfcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIHJlcGx5LmhlYWRlcihcImNvbm5lY3Rpb25cIiwgXCJVcGdyYWRlXCIpLmhlYWRlcihcInVwZ3JhZGVcIiwgXCJ3ZWJzb2NrZXRcIikuc3RhdHVzKDQyNikuc2VuZCh7XG4gICAgICAgIG1lc3NhZ2U6IFwiV2ViU29ja2V0IHVwZ3JhZGUgcmVxdWlyZWRcIixcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICAvLyBkZXYg66qo65Oc7J2YIGNhdGNoLWFsbCB3c0hhbmRsZXLsl5DshJwg7Iuk7KCcIFdTIEFQSeuhnCDrlJTsiqTtjKjsuZjtlaguIOunpOy5reuQmOuKlCByb3V0ZeqwgCDsl4bsnLzrqbQgMTAwOOuhnCDri6vsnYxcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVEZXZXZWJTb2NrZXRSZXF1ZXN0KFxuICAgIHNvY2tldDogV2ViU29ja2V0LFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbWF0Y2hlZEFwaSA9IHRoaXMuZmluZE1hdGNoZWRBcGkocmVxdWVzdCk7XG4gICAgaWYgKCFtYXRjaGVkQXBpPy53ZWJzb2NrZXRPcHRpb25zKSB7XG4gICAgICBzb2NrZXQuY2xvc2UoMTAwOCwgXCJXZWJTb2NrZXQgcm91dGUgbm90IGZvdW5kXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmNyZWF0ZVdlYlNvY2tldEhhbmRsZXIobWF0Y2hlZEFwaSwgY29uZmlnKTtcbiAgICBhd2FpdCBoYW5kbGVyKHsgc29ja2V0IH0sIHJlcXVlc3QpO1xuICB9XG5cbiAgLy8gV1Mgcm91dGUg7ZW465Ok65+s7J2YIOyLpO2WiSDsiJzshJzrpbwg6rOg7KCV7ZWoOlxuICAvLyAxKSBndWFyZOulvCBjb25uZWN0aW9uIOuTseuhnSDsnbTsoITsl5Ag64+M66CkIOyduOymnSDsi6TtjKgg7IucIOu2gOu2hCDrk7HroZ0g7IOB7YOc66W8IOuCqOq4sOyngCDslYrsnYxcbiAgLy8gMikgcXVlcnkgcGFyYW0g7YyM7Iux64+EIGFjdGl2YXRpb24g7KCE7JeQIOuBneuCtCBoYW5kc2hha2Ug7Iuk7Yyo6rCAIHJlZ2lzdHJ57JeQIOuFuOy2nOuQmOyngCDslYrqsowg7ZWoXG4gIC8vIDMpIGBhY3RpdmU6IGZhbHNlYOuhnCDrqLzsoIAg65Ox66Gd7ZWY6rOgLCBjb250ZXh0IOykgOu5hOqwgCDrgZ3rgpwg65KkIGBhY3RpdmF0ZSgpYO2VtCDruIzroZzrk5zsupDsiqTtirjqsIAg7LSI6riw7ZmUIOykkeqwhCDsg4Htg5zrpbwg67O07KeAIOuqu+2VmOqyjCDtlahcbiAgLy8g7JeQ65+sIOuwnOyDnSDsi5zsl5DripQgcmVzb2x2ZVdlYlNvY2tldENsb3NlRGVzY3JpcHRvciDsoJXssYXsl5Ag65Sw6528IGNsb3NlIGNvZGXrpbwg66ek7ZWR7ZWoXG4gIHByaXZhdGUgY3JlYXRlV2ViU29ja2V0SGFuZGxlcihhcGk6IEV4dGVuZGVkQXBpLCBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcpIHtcbiAgICByZXR1cm4gYXN5bmMgKFxuICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICBzb2NrZXQ6IFdlYlNvY2tldDtcbiAgICAgIH0sXG4gICAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGNvbnN0IHNvY2tldCA9IGNvbm5lY3Rpb24uc29ja2V0O1xuICAgICAgbGV0IHdzQ29udGV4dDogV2ViU29ja2V0Q29udGV4dCB8IG51bGwgPSBudWxsO1xuICAgICAgbGV0IHJhd1dzOiBSZXR1cm5UeXBlPFdlYlNvY2tldFJ1bnRpbWVbXCJyZWdpc3RlckNvbm5lY3Rpb25cIl0+IHwgbnVsbCA9IG51bGw7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJ1bkd1YXJkcyh7XG4gICAgICAgICAgZ3VhcmRzOiBhcGkub3B0aW9ucy5ndWFyZHMsXG4gICAgICAgICAgY29uZmlnLFxuICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgYXBpLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCByZXFCb2R5ID0gYXdhaXQgdGhpcy5wYXJzZVdlYlNvY2tldFJlcXVlc3RQYXJhbXMoYXBpLCByZXF1ZXN0KTtcbiAgICAgICAgcmF3V3MgPSB0aGlzLndlYnNvY2tldFJ1bnRpbWUucmVnaXN0ZXJDb25uZWN0aW9uKHNvY2tldCwge1xuICAgICAgICAgIG91dEV2ZW50czogYXBpLndlYnNvY2tldE9wdGlvbnMhLm91dEV2ZW50cyxcbiAgICAgICAgICBpbkV2ZW50czogYXBpLndlYnNvY2tldE9wdGlvbnMhLmluRXZlbnRzLFxuICAgICAgICAgIG5hbWVzcGFjZTogYXBpLndlYnNvY2tldE9wdGlvbnMhLm5hbWVzcGFjZSxcbiAgICAgICAgICBoZWFydGJlYXQ6IGFwaS53ZWJzb2NrZXRPcHRpb25zIS5oZWFydGJlYXQsXG4gICAgICAgICAgbWF4UGF5bG9hZDogYXBpLndlYnNvY2tldE9wdGlvbnMhLm1heFBheWxvYWQsXG4gICAgICAgICAgYWN0aXZlOiBmYWxzZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgc2NvcGVkV3MgPSB0aGlzLmNyZWF0ZVNjb3BlZFdlYlNvY2tldENvbm5lY3Rpb24ocmF3V3MsICgpID0+IHdzQ29udGV4dCk7XG4gICAgICAgIHdzQ29udGV4dCA9IGF3YWl0IHRoaXMuY3JlYXRlV2ViU29ja2V0Q29udGV4dChjb25maWcsIHJlcXVlc3QsIHNjb3BlZFdzKTtcbiAgICAgICAgdGhpcy53ZWJzb2NrZXRSdW50aW1lLmFjdGl2YXRlQ29ubmVjdGlvbihyYXdXcy5pZCk7XG5cbiAgICAgICAgY29uc3QgeyBBcGlQYXJhbVR5cGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL3R5cGVzL3R5cGVzXCIpO1xuICAgICAgICBjb25zdCBhcmdzID0gYXBpLnBhcmFtZXRlcnMubWFwKChwYXJhbSkgPT4ge1xuICAgICAgICAgIGlmIChBcGlQYXJhbVR5cGUuaXNDb250ZXh0KHBhcmFtLnR5cGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gd3NDb250ZXh0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiByZXFCb2R5W3BhcmFtLm5hbWVdO1xuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7IGNvbnRleHQ6IHdzQ29udGV4dCB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5pbnZva2VNb2RlbE1ldGhvZChhcGksIGFyZ3MpO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGNsb3NlRGVzY3JpcHRvciA9IHJlc29sdmVXZWJTb2NrZXRDbG9zZURlc2NyaXB0b3IoZXJyb3IpO1xuICAgICAgICBpZiAocmF3V3MpIHtcbiAgICAgICAgICByYXdXcy5jbG9zZShjbG9zZURlc2NyaXB0b3IuY29kZSwgY2xvc2VEZXNjcmlwdG9yLnJlYXNvbik7XG4gICAgICAgIH0gZWxzZSBpZiAoc29ja2V0LnJlYWR5U3RhdGUgPCAyKSB7XG4gICAgICAgICAgc29ja2V0LmNsb3NlKGNsb3NlRGVzY3JpcHRvci5jb2RlLCBjbG9zZURlc2NyaXB0b3IucmVhc29uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNlcnZlcj8ubG9nKSB7XG4gICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgIGVycjogZXJyb3IsXG4gICAgICAgICAgICBtb2RlbE5hbWU6IGFwaS5tb2RlbE5hbWUsXG4gICAgICAgICAgICBtZXRob2ROYW1lOiBhcGkubWV0aG9kTmFtZSxcbiAgICAgICAgICAgIHBhdGg6IGFwaS5wYXRoLFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGNsb3NlRGVzY3JpcHRvci5sb2dMZXZlbCA9PT0gXCJ3YXJuXCIpIHtcbiAgICAgICAgICAgIHRoaXMuc2VydmVyLmxvZy53YXJuKHBheWxvYWQsIGNsb3NlRGVzY3JpcHRvci5yZWFzb24pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlcnZlci5sb2cuZXJyb3IocGF5bG9hZCwgY2xvc2VEZXNjcmlwdG9yLnJlYXNvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChjbG9zZURlc2NyaXB0b3IubG9nTGV2ZWwgPT09IFwid2FyblwiKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oY2xvc2VEZXNjcmlwdG9yLnJlYXNvbiwgZXJyb3IpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGNsb3NlRGVzY3JpcHRvci5yZWFzb24sIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gb25NZXNzYWdlL29uQ2xvc2Xsspjrn7wg64uk66W4IHRpY2vsl5DshJwg7Iuk7ZaJ65CY64qUIGNhbGxiYWNr7J2AIEFMUyBjb250ZXh06rCAIOuBiuq4sOuvgOuhnCB3cmFwcGVy7JeQ7IScIGBhc3luY0xvY2FsU3RvcmFnZS5ydW5g7Jy866GcIOuLpOyLnCDqsJDsi7gg67O17JuQ7ZWoXG4gIC8vIHB1Ymxpc2gvam9pbi9sZWF2ZS9zZXRVc2VySWQg6rCZ7J2AIOymieyLnCDsi6TtlokgQVBJ64qUIOuLqOyInCDsnITsnoTrp4wg7ZWY6rOgLCBkZWZlcnJlZCBjYWxsYmFja+yXkOunjCBjb250ZXh0IOuzteybkOydhCDsoIHsmqntlahcbiAgcHJpdmF0ZSBjcmVhdGVTY29wZWRXZWJTb2NrZXRDb25uZWN0aW9uPFxuICAgIFRPdXQgZXh0ZW5kcyBXZWJTb2NrZXRFdmVudE1hcCxcbiAgICBUSW4gZXh0ZW5kcyBXZWJTb2NrZXRFdmVudE1hcCxcbiAgPihcbiAgICB3czogV2ViU29ja2V0Q29ubmVjdGlvbjxUT3V0LCBUSW4+LFxuICAgIGdldENvbnRleHQ6ICgpID0+IFdlYlNvY2tldENvbnRleHQgfCBudWxsLFxuICApOiBXZWJTb2NrZXRDb25uZWN0aW9uPFRPdXQsIFRJbj4ge1xuICAgIGNvbnN0IHJ1bkluQ29udGV4dCA9IDxUPihjYWxsYmFjazogKCkgPT4gVCk6IFQgPT4ge1xuICAgICAgY29uc3QgY29udGV4dCA9IGdldENvbnRleHQoKTtcbiAgICAgIGlmICghY29udGV4dCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UucnVuKHsgY29udGV4dCB9LCBjYWxsYmFjayk7XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB3cy5pZDtcbiAgICAgIH0sXG4gICAgICBnZXQgbmFtZXNwYWNlKCkge1xuICAgICAgICByZXR1cm4gd3MubmFtZXNwYWNlO1xuICAgICAgfSxcbiAgICAgIGdldCBjbG9zZWQoKSB7XG4gICAgICAgIHJldHVybiB3cy5jbG9zZWQ7XG4gICAgICB9LFxuICAgICAgdHJhbnNwb3J0OiBcIndzXCIsXG4gICAgICBwdWJsaXNoVW50eXBlZChldmVudCwgZGF0YSkge1xuICAgICAgICB3cy5wdWJsaXNoVW50eXBlZChldmVudCwgZGF0YSk7XG4gICAgICB9LFxuICAgICAgY2xvc2UoY29kZSwgcmVhc29uKSB7XG4gICAgICAgIHdzLmNsb3NlKGNvZGUsIHJlYXNvbik7XG4gICAgICB9LFxuICAgICAgb25DbG9zZShjYWxsYmFjaykge1xuICAgICAgICB3cy5vbkNsb3NlKCgpID0+IHJ1bkluQ29udGV4dChjYWxsYmFjaykpO1xuICAgICAgfSxcbiAgICAgIG9uTWVzc2FnZShldmVudCwgaGFuZGxlcikge1xuICAgICAgICB3cy5vbk1lc3NhZ2UoZXZlbnQsIChkYXRhKSA9PiBydW5JbkNvbnRleHQoKCkgPT4gaGFuZGxlcihkYXRhKSkpO1xuICAgICAgfSxcbiAgICAgIHB1Ymxpc2goZXZlbnQsIGRhdGEpIHtcbiAgICAgICAgd3MucHVibGlzaChldmVudCwgZGF0YSk7XG4gICAgICB9LFxuICAgICAgd2FpdEZvckNsb3NlKCkge1xuICAgICAgICByZXR1cm4gd3Mud2FpdEZvckNsb3NlKCk7XG4gICAgICB9LFxuICAgICAgam9pbihyb29tSWQpIHtcbiAgICAgICAgd3Muam9pbihyb29tSWQpO1xuICAgICAgfSxcbiAgICAgIGxlYXZlKHJvb21JZCkge1xuICAgICAgICB3cy5sZWF2ZShyb29tSWQpO1xuICAgICAgfSxcbiAgICAgIHNldFVzZXJJZCh1c2VySWQpIHtcbiAgICAgICAgd3Muc2V0VXNlcklkKHVzZXJJZCk7XG4gICAgICB9LFxuICAgICAgY2xlYXJVc2VySWQoKSB7XG4gICAgICAgIHdzLmNsZWFyVXNlcklkKCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHBhcnNlV2ViU29ja2V0UmVxdWVzdFBhcmFtcyhcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gICAgY29uc3QgeyBnZXRab2RPYmplY3RGcm9tQXBpIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2NvZGUtY29udmVydGVyc1wiKTtcbiAgICBjb25zdCBSZXFUeXBlID0gZ2V0Wm9kT2JqZWN0RnJvbUFwaShhcGksIHRoaXMuc3luY2VyLnR5cGVzKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGZhc3RpZnlDYXN0ZXIgfSA9IGF3YWl0IGltcG9ydChcIi4vY2FzdGVyXCIpO1xuICAgICAgcmV0dXJuIGZhc3RpZnlDYXN0ZXIoUmVxVHlwZSkucGFyc2UoKHJlcXVlc3QucXVlcnkgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zdCB7IFpvZEVycm9yIH0gPSBhd2FpdCBpbXBvcnQoXCJ6b2RcIik7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIFpvZEVycm9yKSB7XG4gICAgICAgIGNvbnN0IHsgaHVtYW5pemVab2RFcnJvciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvem9kLWVycm9yXCIpO1xuICAgICAgICBjb25zdCBtZXNzYWdlcyA9IGh1bWFuaXplWm9kRXJyb3IoZSlcbiAgICAgICAgICAubWFwKChpc3N1ZSkgPT4gaXNzdWUubWVzc2FnZSlcbiAgICAgICAgICAuam9pbihcIiBcIik7XG4gICAgICAgIGNvbnN0IHsgQmFkUmVxdWVzdEV4Y2VwdGlvbiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCIpO1xuICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihtZXNzYWdlcyBhcyBMb2NhbGl6ZWRTdHJpbmcsIHtcbiAgICAgICAgICB6b2RFcnJvcjogZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVSTOyXkOyEnCBwYXRoIHBhcmFtc+ulvCDstpTstpztlanri4jri6QuXG4gICAqIOyYiDogcGF0dGVybj1cIi9hZG1pbi9jb21wYW5pZXMvOmNvbXBhbnlJZFwiLCB1cmw9XCIvYWRtaW4vY29tcGFuaWVzLzEyM1wiIOKGkiB7IGNvbXBhbnlJZDogXCIxMjNcIiB9XG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3RQYXRoUGFyYW1zKHBhdHRlcm46IHN0cmluZywgdXJsOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCBwYXR0ZXJuUGFydHMgPSBwYXR0ZXJuLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3QgdXJsUGFydHMgPSB0aGlzLmdldFBhdGhuYW1lRnJvbVVybCh1cmwpLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3QgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdHRlcm5QYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHBhdHRlcm5QYXJ0c1tpXS5zdGFydHNXaXRoKFwiOlwiKSkge1xuICAgICAgICBwYXJhbXNbcGF0dGVyblBhcnRzW2ldLnNsaWNlKDEpXSA9IHVybFBhcnRzW2ldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1BhdGhQYXR0ZXJuTWF0Y2gocGF0dGVybjogc3RyaW5nLCB1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhdHRlcm5QYXJ0cyA9IHBhdHRlcm4uc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCB1cmxQYXJ0cyA9IHRoaXMuZ2V0UGF0aG5hbWVGcm9tVXJsKHVybCkuc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcblxuICAgIGlmIChwYXR0ZXJuUGFydHMubGVuZ3RoICE9PSB1cmxQYXJ0cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdHRlcm5QYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcGF0dGVyblBhcnQgPSBwYXR0ZXJuUGFydHNbaV07XG4gICAgICBjb25zdCB1cmxQYXJ0ID0gdXJsUGFydHNbaV07XG4gICAgICBpZiAocGF0dGVyblBhcnQuc3RhcnRzV2l0aChcIjpcIikpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAocGF0dGVyblBhcnQgIT09IHVybFBhcnQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQYXRobmFtZUZyb21VcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB1cmwuc3BsaXQoXCI/XCIpWzBdO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlUGF0aFdpdGhpbkJhc2VEaXIoYmFzZURpcjogc3RyaW5nLCBpbnB1dFBhdGg6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlVVJJQ29tcG9uZW50KGlucHV0UGF0aCkucmVwbGFjZSgvXFxcXC9nLCBcIi9cIik7XG4gICAgICBpZiAoZGVjb2RlZC5pbmNsdWRlcyhcIlxcMFwiKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IGRlY29kZWQucmVwbGFjZSgvXlxcLysvLCBcIlwiKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IHBhdGgucmVzb2x2ZShiYXNlRGlyLCByZWxhdGl2ZVBhdGgpO1xuICAgICAgY29uc3QgcmVsYXRpdmVGcm9tQmFzZSA9IHBhdGgucmVsYXRpdmUoYmFzZURpciwgcmVzb2x2ZWRQYXRoKTtcbiAgICAgIGlmIChyZWxhdGl2ZUZyb21CYXNlLnN0YXJ0c1dpdGgoXCIuLlwiKSB8fCBwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVGcm9tQmFzZSkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzb2x2ZWRQYXRoO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFQSSDsnZHri7Xsl5Ag7KCB7Jqp7ZWgIENhY2hlLUNvbnRyb2wg7ISk7KCV7J2EIOqysOygle2VqeuLiOuLpC5cbiAgICog7Jqw7ISg7Iic7JyEOiDqsJzrs4Qg7KeA7KCVID4gY2FjaGVDb250cm9sSGFuZGxlclxuICAgKi9cbiAgcHJpdmF0ZSBnZXRBcGlDYWNoZUNvbnRyb2woXG4gICAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICkge1xuICAgIC8vIOuNsOy9lOugiOydtO2EsCDshKTsoJUg7Jqw7ISgXG4gICAgaWYgKGFwaS5vcHRpb25zLmNhY2hlQ29udHJvbCkge1xuICAgICAgcmV0dXJuIGFwaS5vcHRpb25zLmNhY2hlQ29udHJvbDtcbiAgICB9XG5cbiAgICAvLyDsoITsl60g7ZW465Ok65+sXG4gICAgaWYgKGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKSB7XG4gICAgICBjb25zdCBjYWNoZVJlcTogQ2FjaGVDb250cm9sUmVxdWVzdCA9IHtcbiAgICAgICAgdHlwZTogXCJhcGlcIixcbiAgICAgICAgdXJsOiByZXF1ZXN0LnVybCxcbiAgICAgICAgcGF0aDogcmVxdWVzdC5yb3V0ZU9wdGlvbnM/LnVybCA/PyByZXF1ZXN0LnVybC5zcGxpdChcIj9cIilbMF0sXG4gICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgIGFwaSxcbiAgICAgIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcihjYWNoZVJlcSk7XG4gICAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNTUuyaqSBBUEkg7Zi47LacIChIVFRQIOyYpOuyhO2XpOuTnCDsl4bsnbQg7KeB7KCRIO2YuOy2nClcbiAgICogY3JlYXRlQXBpSGFuZGxlcuydmCDroZzsp4HsnYQg7J6s7IKs7Jqp7ZWY65CYLCByZXF1ZXN0IO2MjOyLsSDrjIDsi6AgcGFyYW1zIOyngeygkSDsgqzsmqlcbiAgICovXG4gIGFzeW5jIGludm9rZUFwaUZvclNTUihcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIHBhcmFtczogYW55W10sXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIHJlcGx5OiBGYXN0aWZ5UmVwbHksXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIC8vIENvbnRleHQg7IOd7ISxICjquLDsobQg66mU7IaM65OcIOyerOyCrOyaqSlcbiAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVDb250ZXh0KGNvbmZpZywgcmVxdWVzdCwgcmVwbHkpO1xuXG4gICAgcmV0dXJuIHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UucnVuKHsgY29udGV4dCB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBhcmdzIOyDneyEsTogQ29udGV4dCDtjIzrnbzrr7jthLDripQg7KO87J6FLCDrgpjrqLjsp4DripQgcGFyYW1z7JeQ7IScIOqwgOyguOyYpOq4sFxuICAgICAgY29uc3QgeyBBcGlQYXJhbVR5cGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL3R5cGVzL3R5cGVzXCIpO1xuICAgICAgbGV0IHBhcmFtc0luZGV4ID0gMDtcbiAgICAgIGNvbnN0IGFyZ3MgPSBhcGkucGFyYW1ldGVycy5tYXAoKHBhcmFtKSA9PiB7XG4gICAgICAgIGlmIChBcGlQYXJhbVR5cGUuaXNDb250ZXh0KHBhcmFtLnR5cGUpKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcmFtc1twYXJhbXNJbmRleCsrXTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyDrqqjrjbgg66mU7ISc65OcIO2YuOy2nCAo6riw7KG0IOuplOyEnOuTnCDsnqzsgqzsmqkpXG4gICAgICByZXR1cm4gdGhpcy5pbnZva2VNb2RlbE1ldGhvZChhcGksIGFyZ3MsIHJlcGx5KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFdTIOqyveuhnOyXkOyEnOuKlCBIVFRQIHJlcGx56rCAIOyXhuycvOuvgOuhnCByZXBseeulvCBvcHRpb25hbOuhnCDrsJvslYQg6rO17Ya1IO2YuOy2nCDqsr3roZzrpbwg7Jyg7KeA7ZWoXG4gIGFzeW5jIGludm9rZU1vZGVsTWV0aG9kKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgYXJnczogdW5rbm93bltdLFxuICAgIHJlcGx5PzogRmFzdGlmeVJlcGx5LFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBtb2RlbCA9IHRoaXMuc3luY2VyLm1vZGVsc1thcGkubW9kZWxOYW1lXTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCAobW9kZWwgYXMgYW55KVthcGkubWV0aG9kTmFtZV0uYXBwbHkobW9kZWwsIGFyZ3MpO1xuICAgIHJlcGx5Py50eXBlKGFwaS5vcHRpb25zLmNvbnRlbnRUeXBlID8/IFwiYXBwbGljYXRpb24vanNvblwiKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBhc3luYyBjcmVhdGVDb250ZXh0KFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICByZXBseTogRmFzdGlmeVJlcGx5LFxuICApOiBQcm9taXNlPENvbnRleHQ+IHtcbiAgICAvLyBjcmVhdGVTU0VGYWN0b3J5IO2VqOyImOyXkCDrr7jrpqwgcmVxdWVzdOydmCBzb2NrZXTqs7wgcmVwbHnrpbwg67CU7J2465SpLlxuICAgIGNvbnN0IHsgY3JlYXRlU1NFRmFjdG9yeSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3RyZWFtL3NzZVwiKTtcbiAgICBjb25zdCBjcmVhdGVTU0UgPSAoPFQgZXh0ZW5kcyBab2RPYmplY3Q+KFxuICAgICAgX3JlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgICAgX3JlcGx5OiBGYXN0aWZ5UmVwbHksXG4gICAgICBfZXZlbnRzOiBULFxuICAgICkgPT4gY3JlYXRlU1NFRmFjdG9yeShfcmVxdWVzdC5zb2NrZXQsIF9yZXBseSwgX2V2ZW50cykpLmJpbmQobnVsbCwgcmVxdWVzdCwgcmVwbHkpO1xuXG4gICAgLy8gbG9jYWxlIOqwkOyngFxuICAgIGNvbnN0IGxvY2FsZSA9XG4gICAgICB0aGlzLmRldGVjdExvY2FsZShyZXF1ZXN0LmhlYWRlcnNbXCJhY2NlcHQtbGFuZ3VhZ2VcIl0sIHRoaXMuY29uZmlnLmkxOG4uc3VwcG9ydGVkTG9jYWxlcykgPz9cbiAgICAgIHRoaXMuY29uZmlnLmkxOG4uZGVmYXVsdExvY2FsZTtcblxuICAgIC8vIGF1dGggY29udGV4dCDstpTqsIBcbiAgICBjb25zdCBoZWFkZXJzID0gY29udmVydEZhc3RpZnlIZWFkZXJzVG9TdGFuZGFyZChyZXF1ZXN0LmhlYWRlcnMpO1xuICAgIGNvbnN0IHNlc3Npb24gPSAoYXdhaXQgdGhpcy5fYXV0aD8uYXBpLmdldFNlc3Npb24oeyBoZWFkZXJzIH0pKSA/PyBudWxsO1xuXG4gICAgY29uc3QgY29udGV4dDogQ29udGV4dCA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShcbiAgICAgIGNvbmZpZy5jb250ZXh0UHJvdmlkZXIoXG4gICAgICAgIHtcbiAgICAgICAgICB0cmFuc3BvcnQ6IFwiaHR0cFwiLFxuICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgcmVwbHksXG4gICAgICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgICAgIGNyZWF0ZVNTRSxcbiAgICAgICAgICBuYWl0ZVN0b3JlOiBuZXcgTWFwKCksXG4gICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgIC8vIGF1dGhcbiAgICAgICAgICB1c2VyOiBzZXNzaW9uPy51c2VyID8/IG51bGwsXG4gICAgICAgICAgc2Vzc2lvbjogc2Vzc2lvbj8uc2Vzc2lvbiA/PyBudWxsLFxuICAgICAgICB9LFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICByZXBseSxcbiAgICAgICksXG4gICAgKTtcbiAgICByZXR1cm4gY29udGV4dDtcbiAgfVxuXG4gIC8vIHNlc3Npb24vbG9jYWxlL3N0b3JlIOqwmeydgCDqs7XthrUgc3RhdGXripQgSFRUUCBjb250ZXh07JmAIOqzteycoO2VmOuQmCwgcmVwbHkvY3JlYXRlU1NFIOqwmeydgCBIVFRQIOyghOyaqSBoZWxwZXLripQg64W47Lac7ZWY7KeAIOyViuydjFxuICAvLyDsgqzsmqnsnpDqsIAgd2Vic29ja2V0Q29udGV4dFByb3ZpZGVy66W8IOyjvOuptCDqt7jrjIDroZwg7JyE7J6E7ZWY6rOgLCDsl4bsnLzrqbQg6riw7KG0IGNvbnRleHRQcm92aWRlcuulvCByZXBseS9TU0Ugc3R1YuqzvCDtlajqu5gg7J6s7Zmc7Jqp7ZWoXG4gIGFzeW5jIGNyZWF0ZVdlYlNvY2tldENvbnRleHQoXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIHdzOiBXZWJTb2NrZXRDb250ZXh0W1wid3NcIl0sXG4gICk6IFByb21pc2U8V2ViU29ja2V0Q29udGV4dD4ge1xuICAgIGNvbnN0IGxvY2FsZSA9XG4gICAgICB0aGlzLmRldGVjdExvY2FsZShyZXF1ZXN0LmhlYWRlcnNbXCJhY2NlcHQtbGFuZ3VhZ2VcIl0sIHRoaXMuY29uZmlnLmkxOG4uc3VwcG9ydGVkTG9jYWxlcykgPz9cbiAgICAgIHRoaXMuY29uZmlnLmkxOG4uZGVmYXVsdExvY2FsZTtcblxuICAgIGNvbnN0IGhlYWRlcnMgPSBjb252ZXJ0RmFzdGlmeUhlYWRlcnNUb1N0YW5kYXJkKHJlcXVlc3QuaGVhZGVycyk7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IChhd2FpdCB0aGlzLl9hdXRoPy5hcGkuZ2V0U2Vzc2lvbih7IGhlYWRlcnMgfSkpID8/IG51bGw7XG5cbiAgICBjb25zdCBkZWZhdWx0Q29udGV4dCA9IHtcbiAgICAgIHRyYW5zcG9ydDogXCJ3c1wiIGFzIGNvbnN0LFxuICAgICAgcmVxdWVzdCxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgIHdzLFxuICAgICAgbmFpdGVTdG9yZTogbmV3IE1hcCgpLFxuICAgICAgbG9jYWxlLFxuICAgICAgdXNlcjogc2Vzc2lvbj8udXNlciA/PyBudWxsLFxuICAgICAgc2Vzc2lvbjogc2Vzc2lvbj8uc2Vzc2lvbiA/PyBudWxsLFxuICAgIH07XG5cbiAgICBpZiAoY29uZmlnLndlYnNvY2tldENvbnRleHRQcm92aWRlcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uKGF3YWl0IFByb21pc2UucmVzb2x2ZShjb25maWcud2Vic29ja2V0Q29udGV4dFByb3ZpZGVyKGRlZmF1bHRDb250ZXh0LCByZXF1ZXN0KSkpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyByZXBseS9jcmVhdGVTU0Xsl5Ag7J2Y7KG07ZWY64qUIGNvbnRleHRQcm92aWRlcuqwgCDsnojsnLzrqbQg7KaJ7IucIOyXkOufrOulvCDrjZjsoLggdHJhbnNwb3J0IG1pc3VzZeulvCDruajrpqwg65Oc65+s64OEXG4gICAgY29uc3QgcmVwbHlTdHViID0gY3JlYXRlV2ViU29ja2V0UmVwbHlTdHViKCk7XG4gICAgY29uc3QgY3JlYXRlU1NFID0gPFQgZXh0ZW5kcyBab2RPYmplY3Q+KF9ldmVudHM6IFQpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJjcmVhdGVTU0UgaXMgbm90IGF2YWlsYWJsZSBpbiB3ZWJzb2NrZXQgY29udGV4dC4gRGVmaW5lIHdlYnNvY2tldENvbnRleHRQcm92aWRlciBpZiB5b3VyIGNvbnRleHQgc2V0dXAgZGVwZW5kcyBvbiBTU0UgaGVscGVycy5cIixcbiAgICAgICk7XG4gICAgfTtcbiAgICBjb25zdCBodHRwTGlrZUNvbnRleHQgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUoXG4gICAgICBjb25maWcuY29udGV4dFByb3ZpZGVyKFxuICAgICAgICB7XG4gICAgICAgICAgdHJhbnNwb3J0OiBcImh0dHBcIixcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIHJlcGx5OiByZXBseVN0dWIsXG4gICAgICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgICAgIGNyZWF0ZVNTRSxcbiAgICAgICAgICBuYWl0ZVN0b3JlOiBkZWZhdWx0Q29udGV4dC5uYWl0ZVN0b3JlLFxuICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICB1c2VyOiBkZWZhdWx0Q29udGV4dC51c2VyLFxuICAgICAgICAgIHNlc3Npb246IGRlZmF1bHRDb250ZXh0LnNlc3Npb24sXG4gICAgICAgIH0sXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIHJlcGx5U3R1YixcbiAgICAgICksXG4gICAgKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIHRyYW5zcG9ydDogX3RyYW5zcG9ydCxcbiAgICAgIHJlcGx5OiBfcmVwbHksXG4gICAgICBjcmVhdGVTU0U6IF9jcmVhdGVTU0UsXG4gICAgICBidWZmZXJlZEZpbGVzOiBfYnVmZmVyZWRGaWxlcyxcbiAgICAgIHVwbG9hZGVkRmlsZXM6IF91cGxvYWRlZEZpbGVzLFxuICAgICAgLi4ucmVzdFxuICAgIH0gPSBodHRwTGlrZUNvbnRleHQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ucmVzdCxcbiAgICAgIHRyYW5zcG9ydDogXCJ3c1wiLFxuICAgICAgcmVxdWVzdCxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgIHdzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQWNjZXB0LUxhbmd1YWdlIO2XpOuNlOyXkOyEnCDsp4Dsm5DtlZjripQgbG9jYWxl7J2EIOywvuyKteuLiOuLpC5cbiAgICogQGV4YW1wbGUgXCJrby1LUixrbztxPTAuOSxlbjtxPTAuOFwiIOKGkiBcImtvXCJcbiAgICovXG4gIHByaXZhdGUgZGV0ZWN0TG9jYWxlKFxuICAgIGFjY2VwdExhbmd1YWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc3VwcG9ydGVkOiBzdHJpbmdbXSxcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWFjY2VwdExhbmd1YWdlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgLy8gQWNjZXB0LUxhbmd1YWdlOiBrby1LUixrbztxPTAuOSxlbjtxPTAuOFxuICAgIGNvbnN0IGxhbmdzID0gYWNjZXB0TGFuZ3VhZ2Uuc3BsaXQoXCIsXCIpLm1hcCgobGFuZykgPT4ge1xuICAgICAgY29uc3QgW2NvZGVdID0gbGFuZy5zcGxpdChcIjtcIik7XG4gICAgICByZXR1cm4gY29kZS50cmltKCkuc3BsaXQoXCItXCIpWzBdOyAvLyBrby1LUiDihpIga29cbiAgICB9KTtcblxuICAgIHJldHVybiBsYW5ncy5maW5kKChsYW5nKSA9PiBzdXBwb3J0ZWQuaW5jbHVkZXMobGFuZykpO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRXYXRjaGVyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIHdhdGNoZXIg66qo65OI7J2AIGZpbGUtcGF0dGVybnMg4oaSIFNvbmFtdSDsiJztmZjsnYQg7ZS87ZWY6riwIOychO2VtCBkeW5hbWljIGltcG9ydCDtlanri4jri6QuXG4gICAgY29uc3QgeyBzZXR1cFdhdGNoZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N5bmNlci93YXRjaGVyXCIpO1xuICAgIHRoaXMud2F0Y2hlciA9IGF3YWl0IHNldHVwV2F0Y2hlcigoZmlsZUV2ZW50cykgPT4gdGhpcy5ydW5IbXJTeW5jQ3ljbGUoZmlsZUV2ZW50cykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhdGNoZXLqsIAgMTAwbXMgYmF0Y2jroZwg66qo7J2AIGZpbGVFdmVudHMg7ZWY64KY7JeQIOuMgO2VtCDtlZwg67KI7J2YIEhNUi9zeW5jIOyCrOydtO2BtOydhCDrj5Xri4jri6QuXG4gICAqIGJhdGNoIO2BkOyeiSDrjZXsl5Ag7ZWcIOyLnOygkOyXkCDtlZjrgpjrp4wg7Iuk7ZaJ65Co7J20IOuztOyepeuQqeuLiOuLpCAoZXZlbnQtYmF0Y2hlcuqwgCDsp4HroKztmZQpLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBydW5IbXJTeW5jQ3ljbGUoZmlsZUV2ZW50czogTWFwPEFic29sdXRlUGF0aCwgXCJjaGFuZ2VcIiB8IFwiYWRkXCI+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcblxuICAgIGZvciAoY29uc3QgW2ZpbGVQYXRoLCBldmVudF0gb2YgZmlsZUV2ZW50cykge1xuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZSh0aGlzLmFwcFJvb3RQYXRoLCBmaWxlUGF0aCk7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKGBEZXRlY3RlZCgke2V2ZW50fSk6ICR7Y2hhbGsuYmx1ZShyZWxhdGl2ZVBhdGgpfWApKTtcbiAgICB9XG5cbiAgICAvLyDrs7jssrQ6IOuzgOqyvSDtnaHsiJggKyDssrTtgazshKwg6rCx7IugLlxuICAgIGF3YWl0IHRoaXMuc3luY2VyLmhtckFuZFN5bmMoZmlsZUV2ZW50cyk7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIucmVuZXdDaGVja3N1bXMoKTtcblxuICAgIGNvbnN0IHRvdGFsVGltZSA9IERhdGUubm93KCkgLSBzdGFydGVkQXQ7XG4gICAgY29uc3QgbXNnID0gYEhNUiBEb25lISAke2NoYWxrLmJvbGQud2hpdGUoYCR7dG90YWxUaW1lfW1zYCl9YDtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ibGFjay5iZ0dyZWVuKGNlbnRlclRleHQobXNnKSkpO1xuICB9XG5cbiAgLypcbiAgICAgQSBmdW5jdGlvbiB0aGF0IGF1dG9tYXRpY2FsbHkgaGFuZGxlcyBpbml0IGFuZCBkZXN0cm95IHdoZW4gdXNpbmcgU29uYW11IHZpYSBzY3JpcHRzLlxuICAqL1xuICBhc3luYyBydW5TY3JpcHQoZm46ICgpID0+IFByb21pc2U8dm9pZD4pIHtcbiAgICBhd2FpdCB0aGlzLmluaXQodHJ1ZSwgZmFsc2UsIHVuZGVmaW5lZCwgZmFsc2UpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmbigpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0aGlzLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlZ2lzdGVyUGx1Z2lucyhzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSwgcGx1Z2luczogU29uYW11U2VydmVyT3B0aW9uc1tcInBsdWdpbnNcIl0pIHtcbiAgICBpZiAoIXBsdWdpbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBjb21wcmVzcyDtlIzrn6zqt7jsnbjsnYAg64uk66W4IO2UjOufrOq3uOyduOuztOuLpCDrqLzsoIAg65Ox66Gd65CY7Ja07JW8IO2VqeuLiOuLpC5cbiAgICBpZiAocGx1Z2lucy5jb21wcmVzcykge1xuICAgICAgY29uc3QgY29tcHJlc3NQbHVnaW4gPSAoYXdhaXQgaW1wb3J0KFwiQGZhc3RpZnkvY29tcHJlc3NcIikpLmRlZmF1bHQ7XG4gICAgICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICAgICAgdGhyZXNob2xkOiAxMDI0LFxuICAgICAgICBlbmNvZGluZ3M6IFtcImJyXCIsIFwiZ3ppcFwiLCBcImRlZmxhdGVcIl0gYXMgKFwiYnJcIiB8IFwiZ3ppcFwiIHwgXCJkZWZsYXRlXCIpW10sXG4gICAgICB9O1xuXG4gICAgICBpZiAocGx1Z2lucy5jb21wcmVzcyA9PT0gdHJ1ZSkge1xuICAgICAgICBzZXJ2ZXIucmVnaXN0ZXIoY29tcHJlc3NQbHVnaW4sIGRlZmF1bHRPcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlcnZlci5yZWdpc3Rlcihjb21wcmVzc1BsdWdpbiwge1xuICAgICAgICAgIC4uLmRlZmF1bHRPcHRpb25zLFxuICAgICAgICAgIC4uLnBsdWdpbnMuY29tcHJlc3MsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBsdWdpbnNNb2R1bGVzID0ge1xuICAgICAgY29yczogXCJAZmFzdGlmeS9jb3JzXCIsXG4gICAgICBmb3JtYm9keTogXCJAZmFzdGlmeS9mb3JtYm9keVwiLFxuICAgICAgbXVsdGlwYXJ0OiBcIkBmYXN0aWZ5L211bHRpcGFydFwiLFxuICAgICAgcXM6IFwiZmFzdGlmeS1xc1wiLFxuICAgICAgc3NlOiBcImZhc3RpZnktc3NlLXYyXCIsXG4gICAgICBzdGF0aWM6IFwiQGZhc3RpZnkvc3RhdGljXCIsXG4gICAgfSBhcyBjb25zdDtcblxuICAgIGNvbnN0IHJlZ2lzdGVyUGx1Z2luID0gYXN5bmMgPEsgZXh0ZW5kcyBrZXlvZiBOb25OdWxsYWJsZTx0eXBlb2YgcGx1Z2lucz4+KFxuICAgICAga2V5OiBLLFxuICAgICAgcGx1Z2luTmFtZTogc3RyaW5nLFxuICAgICkgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9uID0gcGx1Z2luc1trZXldO1xuICAgICAgaWYgKCFvcHRpb24pIHJldHVybjtcblxuICAgICAgaWYgKG9wdGlvbiA9PT0gdHJ1ZSkge1xuICAgICAgICBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChwbHVnaW5OYW1lKSkuZGVmYXVsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChwbHVnaW5OYW1lKSkuZGVmYXVsdCwgb3B0aW9uKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBba2V5LCBwbHVnaW5OYW1lXSBvZiBPYmplY3QuZW50cmllcyhwbHVnaW5zTW9kdWxlcykpIHtcbiAgICAgIGF3YWl0IHJlZ2lzdGVyUGx1Z2luKGtleSBhcyBrZXlvZiB0eXBlb2YgcGx1Z2lucywgcGx1Z2luTmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHBsdWdpbnMud3MpIHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlV2ViU29ja2V0UGx1Z2luKHNlcnZlcik7XG4gICAgfVxuXG4gICAgaWYgKHBsdWdpbnMuY3VzdG9tKSB7XG4gICAgICBwbHVnaW5zLmN1c3RvbShzZXJ2ZXIpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEBmYXN0aWZ5L3dlYnNvY2tldOydgCBwbHVnaW5zLndz6rCAIOyEpOygleuQnCDqsr3smrDsl5Drp4wg65Ox66Gd7ZWY6rOgLCDqsJnsnYAgc2VydmVy7JeQIOykkeuztSDrk7HroZ3rkJjsp4Ag7JWK64+E66GdIFdlYWtTZXTsnLzroZwg6riw66Gd7ZWoXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlV2ViU29ja2V0UGx1Z2luKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLndlYnNvY2tldFBsdWdpblNlcnZlcnMuaGFzKHNlcnZlcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwbHVnaW5PcHRpb24gPSB0aGlzLmNvbmZpZy5zZXJ2ZXIucGx1Z2lucz8ud3M7XG4gICAgaWYgKCFwbHVnaW5PcHRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3ZWJzb2NrZXRQbHVnaW4gPSAoYXdhaXQgaW1wb3J0KFwiQGZhc3RpZnkvd2Vic29ja2V0XCIpKS5kZWZhdWx0O1xuICAgIGNvbnN0IHJlc29sdmVkUGx1Z2luT3B0aW9ucyA9IHJlc29sdmVXZWJTb2NrZXRQbHVnaW5PcHRpb25zKHtcbiAgICAgIHJhd1BsdWdpbk9wdGlvbjogcGx1Z2luT3B0aW9uLFxuICAgICAgYXBpczogdGhpcy5zeW5jZXIuYXBpcyxcbiAgICB9KTtcbiAgICBpZiAocmVzb2x2ZWRQbHVnaW5PcHRpb25zKSB7XG4gICAgICBhd2FpdCBzZXJ2ZXIucmVnaXN0ZXIod2Vic29ja2V0UGx1Z2luLCByZXNvbHZlZFBsdWdpbk9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBzZXJ2ZXIucmVnaXN0ZXIod2Vic29ja2V0UGx1Z2luKTtcbiAgICB9XG5cbiAgICB0aGlzLndlYnNvY2tldFBsdWdpblNlcnZlcnMuYWRkKHNlcnZlcik7XG4gICAgdGhpcy53YXJuT25Qb3RlbnRpYWxXZWJTb2NrZXRUaW1lb3V0Q29uZmxpY3RzKHNlcnZlcik7XG4gIH1cblxuICAvLyBoZWFydGJlYXQgaW50ZXJ2YWzsnbQgRmFzdGlmeSBrZWVwQWxpdmVUaW1lb3V0IOydtOyDgeydtOuptCDsnbjtlITrnbzqsIAg66i87KCAIGlkbGUg7Jew6rKw7J2EIOuBiuydhCDsiJgg7J6I7Ja0IOqyveqzoOunjCDrgqjquLDqs6Ag64SY7Ja06rCQXG4gIHByaXZhdGUgd2Fybk9uUG90ZW50aWFsV2ViU29ja2V0VGltZW91dENvbmZsaWN0cyhcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+LFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBoZWFydGJlYXRzID0gdGhpcy5zeW5jZXIuYXBpc1xuICAgICAgLm1hcCgoYXBpKSA9PiBhcGkud2Vic29ja2V0T3B0aW9ucz8uaGVhcnRiZWF0ID8/IDMwMDAwKVxuICAgICAgLmZpbHRlcigoaGVhcnRiZWF0KSA9PiBoZWFydGJlYXQgPiAwKTtcblxuICAgIGlmIChoZWFydGJlYXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGtlZXBBbGl2ZVRpbWVvdXQgPSB0aGlzLmNvbmZpZy5zZXJ2ZXIuZmFzdGlmeT8ua2VlcEFsaXZlVGltZW91dDtcbiAgICBpZiAoIWtlZXBBbGl2ZVRpbWVvdXQgfHwga2VlcEFsaXZlVGltZW91dCA8PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbGFyZ2VzdEhlYXJ0YmVhdCA9IE1hdGgubWF4KC4uLmhlYXJ0YmVhdHMpO1xuICAgIGlmIChsYXJnZXN0SGVhcnRiZWF0ID49IGtlZXBBbGl2ZVRpbWVvdXQpIHtcbiAgICAgIHNlcnZlci5sb2cud2FybihcbiAgICAgICAge1xuICAgICAgICAgIGtlZXBBbGl2ZVRpbWVvdXQsXG4gICAgICAgICAgbGFyZ2VzdEhlYXJ0YmVhdCxcbiAgICAgICAgfSxcbiAgICAgICAgXCJXZWJTb2NrZXQgaGVhcnRiZWF0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBrZWVwQWxpdmVUaW1lb3V0OyBhbGlnbiBpbmZyYXN0cnVjdHVyZSBpZGxlIHRpbWVvdXRzIHRvIGF2b2lkIHVuZXhwZWN0ZWQgZGlzY29ubmVjdHMuXCIsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBiZXR0ZXItYXV0aCDrnbzsmrDtirjrpbwg65Ox66Gd7ZWp64uI64ukLlxuICAgKiAvYXBpL2F1dGgvKiDqsr3roZzroZwg7J247KadIEFQSeqwgCDsnpDrj5kg65Ox66Gd65Cp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWdpc3RlckJldHRlckF1dGgoXG4gICAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UsXG4gICAgb3B0aW9uczogTm9uTnVsbGFibGU8U29uYW11U2VydmVyT3B0aW9uc1tcImF1dGhcIl0+LFxuICApIHtcbiAgICBpZiAoIW9wdGlvbnMpIHJldHVybjtcblxuICAgIGNvbnN0IGJhc2VQYXRoID0gb3B0aW9ucy5iYXNlUGF0aCA/PyBcIi9hcGkvYXV0aFwiO1xuXG4gICAgLy8gYmV0dGVyLWF1dGgg65287Jqw7Yq4IOuTseuhnVxuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFtcIkdFVFwiLCBcIlBPU1RcIl0sXG4gICAgICB1cmw6IGAke2Jhc2VQYXRofS8qYCxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsLCBgaHR0cDovLyR7cmVxdWVzdC5oZWFkZXJzLmhvc3R9YCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBjb252ZXJ0RmFzdGlmeUhlYWRlcnNUb1N0YW5kYXJkKHJlcXVlc3QuaGVhZGVycyk7XG5cbiAgICAgICAgLy8gSVAg7Zek642UIGZhbGxiYWNrOiDtlITroZ3si5zqsIAg7ZGc7KSAIElQIO2XpOuNlOulvCDso7zsnoXtlZjsp4Ag7JWK64qUIO2ZmOqyveyXkOyEnOuPhFxuICAgICAgICAvLyBiZXR0ZXItYXV0aC9pbmZyYeydmCBnZXRDbGllbnRJcEZyb21SZXF1ZXN0KCnqsIAgSVDrpbwg7J247Iud7ZWgIOyImCDsnojrj4TroZ1cbiAgICAgICAgLy8gRmFzdGlmeeqwgCByZXNvbHZl7ZWcIHJlcXVlc3QuaXDrpbwgeC1yZWFsLWlw66GcIOyjvOyehe2VnOuLpC5cbiAgICAgICAgY29uc3QgSVBfSEVBREVSUyA9IFtcbiAgICAgICAgICBcImNmLWNvbm5lY3RpbmctaXBcIixcbiAgICAgICAgICBcIngtZm9yd2FyZGVkLWZvclwiLFxuICAgICAgICAgIFwieC1yZWFsLWlwXCIsXG4gICAgICAgICAgXCJ4LXZlcmNlbC1mb3J3YXJkZWQtZm9yXCIsXG4gICAgICAgIF07XG4gICAgICAgIGlmIChyZXF1ZXN0LmlwICYmICFJUF9IRUFERVJTLnNvbWUoKGgpID0+IGhlYWRlcnMuaGFzKGgpKSkge1xuICAgICAgICAgIGhlYWRlcnMuc2V0KFwieC1yZWFsLWlwXCIsIHJlcXVlc3QuaXApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVxID0gbmV3IFJlcXVlc3QodXJsLnRvU3RyaW5nKCksIHtcbiAgICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgLi4uKHJlcXVlc3QuYm9keSA/IHsgYm9keTogSlNPTi5zdHJpbmdpZnkocmVxdWVzdC5ib2R5KSB9IDoge30pLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXV0aC5oYW5kbGVyKHJlcSk7XG5cbiAgICAgICAgcmVwbHkuc3RhdHVzKHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgIHJlc3BvbnNlLmhlYWRlcnMuZm9yRWFjaCgodmFsdWU6IHN0cmluZywga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICByZXBseS5oZWFkZXIoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVwbHkuc2VuZChyZXNwb25zZS5ib2R5ID8gYXdhaXQgcmVzcG9uc2UudGV4dCgpIDogbnVsbCk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcmludFN0YXJ0dXBTdW1tYXJ5KCkge1xuICAgIGNvbnN0IGNoYWxrID0gKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0O1xuICAgIGNvbnN0IGVudiA9IHByb2Nlc3MuZW52Lk5PREVfRU5WID8/IFwiZGV2ZWxvcG1lbnRcIjtcbiAgICBjb25zdCBhY3RpdmVQcmVzZXQgPSBlbnYgPT09IFwicHJvZHVjdGlvblwiID8gXCJwcm9kdWN0aW9uX21hc3RlclwiIDogXCJkZXZlbG9wbWVudF9tYXN0ZXJcIjtcblxuICAgIGNvbnN0IGRpbSA9IChtc2c6IHN0cmluZykgPT4gY29uc29sZS5sb2coY2hhbGsuZGltKGDinJMgJHttc2d9YCkpO1xuICAgIGNvbnN0IGdyZWVuID0gKG1zZzogc3RyaW5nKSA9PiBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihg4pyTICR7bXNnfWApKTtcblxuICAgIGRpbShgQ29uZmlnIGxvYWRlZCR7Zm9ybWF0VGltZSh0aGlzLl9jb25maWdFbGFwc2VkKX1gKTtcblxuICAgIC8vIERCIHByZXNldCDrqqnroZ1cbiAgICBncmVlbihcIkRCXCIpO1xuICAgIGNvbnN0IHsgaXNMb2NhbCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvY29udHJvbGxlclwiKTtcbiAgICBjb25zdCBwcmVzZXROYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMuZGJDb25maWcpIGFzIChrZXlvZiBTb25hbXVEQkNvbmZpZylbXTtcbiAgICBjb25zdCBtYXhMZW4gPSBNYXRoLm1heCguLi5wcmVzZXROYW1lcy5tYXAoKG4pID0+IG4ubGVuZ3RoKSk7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHByZXNldE5hbWVzKSB7XG4gICAgICBjb25zdCBjb25uID0gdGhpcy5kYkNvbmZpZ1tuYW1lXS5jb25uZWN0aW9uIGFzXG4gICAgICAgIHwgeyBob3N0Pzogc3RyaW5nOyBwb3J0PzogbnVtYmVyOyBkYXRhYmFzZT86IHN0cmluZyB9XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaG9zdCA9IGNvbm4/Lmhvc3QgPz8gXCJsb2NhbGhvc3RcIjtcbiAgICAgIGNvbnN0IGFkZHIgPSBgQCAke2hvc3R9OiR7Y29ubj8ucG9ydCA/PyA1NDMyfS8ke2Nvbm4/LmRhdGFiYXNlID8/IHRoaXMuY29uZmlnLmRhdGFiYXNlLm5hbWV9YDtcbiAgICAgIGNvbnN0IHBhZGRlZCA9IG5hbWUucGFkRW5kKG1heExlbik7XG4gICAgICBjb25zdCByZW1vdGVUYWcgPSBpc0xvY2FsKCkgJiYgIWlzTG9jYWxIb3N0KGhvc3QpID8gY2hhbGsueWVsbG93KGAgXFx1MjZhMCByZW1vdGVgKSA6IFwiXCI7XG5cbiAgICAgIGlmIChuYW1lID09PSBhY3RpdmVQcmVzZXQpIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYCAgXFx1MjViOCAke3BhZGRlZH0gJHthZGRyfWApICsgcmVtb3RlVGFnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgICAgICR7cGFkZGVkfSAke2FkZHJ9YCkgKyByZW1vdGVUYWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5zZXJ2ZXIuYXV0aCkge1xuICAgICAgY29uc3QgYmFzZVBhdGggPSB0aGlzLmNvbmZpZy5zZXJ2ZXIuYXV0aC5iYXNlUGF0aCA/PyBcIi9hcGkvYXV0aFwiO1xuICAgICAgZGltKGBBdXRoOiBiZXR0ZXItYXV0aCBhdCAke2Jhc2VQYXRofS8qYCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbmZpZy5hcGkudGltZXpvbmUpIHtcbiAgICAgIGRpbShgVGltZXpvbmU6ICR7dGhpcy5jb25maWcuYXBpLnRpbWV6b25lfWApO1xuICAgIH1cbiAgICBncmVlbihgU29uYW11IHJlYWR5JHtmb3JtYXRUaW1lKHRoaXMuX2luaXRFbGFwc2VkKX1gKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZUNhY2hlKGNvbmZpZzogQ2FjaGVDb25maWcgfCB1bmRlZmluZWQsIGZvclRlc3Rpbmc6IGJvb2xlYW4pIHtcbiAgICBjb25zdCB7IHNldENhY2hlTWFuYWdlclJlZiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vY2FjaGUvZGVjb3JhdG9yXCIpO1xuXG4gICAgLy8g7YWM7Iqk7Yq4IO2ZmOqyveyXkOyEnCDrqZTrqqjrpqwg65Oc65287J2067KEIOyekOuPmSDsgqzsmqlcbiAgICBpZiAoZm9yVGVzdGluZykge1xuICAgICAgY29uc3QgeyBjcmVhdGVUZXN0Q2FjaGVNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9jYWNoZS9jYWNoZS1tYW5hZ2VyXCIpO1xuICAgICAgdGhpcy5fY2FjaGUgPSBjcmVhdGVUZXN0Q2FjaGVNYW5hZ2VyKCk7XG4gICAgICBzZXRDYWNoZU1hbmFnZXJSZWYodGhpcy5fY2FjaGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOyEpOygleydtCDsl4bsnLzrqbQg7LqQ7IucIOu5hO2ZnOyEse2ZlFxuICAgIGlmICghY29uZmlnKSB7XG4gICAgICBzZXRDYWNoZU1hbmFnZXJSZWYobnVsbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g7ISk7KCV7JeQIOuUsOudvCBDYWNoZU1hbmFnZXIg7IOd7ISxXG4gICAgY29uc3QgeyBjcmVhdGVDYWNoZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2NhY2hlL2NhY2hlLW1hbmFnZXJcIik7XG4gICAgdGhpcy5fY2FjaGUgPSBjcmVhdGVDYWNoZU1hbmFnZXIoY29uZmlnKTtcbiAgICBzZXRDYWNoZU1hbmFnZXJSZWYodGhpcy5fY2FjaGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplV29ya2Zsb3dzKG9wdGlvbnM6IFNvbmFtdVRhc2tPcHRpb25zIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgeyBXb3JrZmxvd01hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3Rhc2tzL3dvcmtmbG93LW1hbmFnZXJcIik7XG4gICAgLy8gTk9URTogQHNvbmFtdS1raXQvdGFza3Mg7JWI7JeQ7ISgIGtuZXggY29uZmln66W8IOyImOygle2VmOq4sCDrlYzrrLjsl5AgY29ubmVjdGlvbuydtCDslYTri4wgY29uZmlnIOynuOuhnCDrs7Trg4Xri4jri6QuXG4gICAgdGhpcy5fd29ya2Zsb3dzID0gbmV3IFdvcmtmbG93TWFuYWdlcihEQi5nZXREQkNvbmZpZyhcIndcIikpO1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVuYWJsZVdvcmtlciA9IG9wdGlvbnMuZW5hYmxlV29ya2VyID8/IGlzRGFlbW9uU2VydmVyKCk7XG4gICAgY29uc3QgZGVmYXVsdFdvcmtlck9wdGlvbnMgPSB7XG4gICAgICBjb25jdXJyZW5jeTogb3MuY3B1cygpLmxlbmd0aCAtIDEsXG4gICAgICB1c2VQdWJTdWI6IHRydWUsXG4gICAgICBsaXN0ZW5EZWxheTogNTAwLFxuICAgIH07XG5cbiAgICBpZiAoZW5hYmxlV29ya2VyKSB7XG4gICAgICB0aGlzLndvcmtmbG93cy5zZXR1cFdvcmtlcih7XG4gICAgICAgIC4uLmRlZmF1bHRXb3JrZXJPcHRpb25zLFxuICAgICAgICAuLi5vcHRpb25zLndvcmtlck9wdGlvbnMsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJvb3Qoc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UsIG9wdGlvbnM6IFNvbmFtdVNlcnZlck9wdGlvbnMpIHtcbiAgICBjb25zdCBwb3J0ID0gb3B0aW9ucy5saXN0ZW4/LnBvcnQgPz8gMzAwMDtcbiAgICBjb25zdCBob3N0ID0gb3B0aW9ucy5saXN0ZW4/Lmhvc3QgPz8gXCJsb2NhbGhvc3RcIjtcblxuICAgIHNlcnZlci5hZGRIb29rKFwib25DbG9zZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBvcHRpb25zLmxpZmVjeWNsZT8ub25TaHV0ZG93bj8uKHNlcnZlcik7XG4gICAgICBhd2FpdCB0aGlzLndvcmtmbG93cy5kZXN0cm95KCk7XG4gICAgICBhd2FpdCB0aGlzLmRlc3Ryb3koKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHNodXRkb3duID0gYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc2VydmVyLmNsb3NlKCk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZHVyaW5nIHNodXRkb3duOlwiLCBlcnIpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgc2h1dGRvd24pO1xuICAgIHByb2Nlc3Mub24oXCJTSUdURVJNXCIsIHNodXRkb3duKTtcblxuICAgIGlmIChvcHRpb25zLmxpZmVjeWNsZT8ub25FcnJvcikge1xuICAgICAgc2VydmVyLnNldEVycm9ySGFuZGxlcihvcHRpb25zLmxpZmVjeWNsZT8ub25FcnJvcik7XG4gICAgfVxuXG4gICAgc2VydmVyXG4gICAgICAubGlzdGVuKHsgcG9ydCwgaG9zdCB9KVxuICAgICAgLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLndvcmtmbG93cy5zdGFydFdvcmtlcigpO1xuICAgICAgICBhd2FpdCBvcHRpb25zLmxpZmVjeWNsZT8ub25TdGFydD8uKHNlcnZlcik7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGFzeW5jIChlcnIpID0+IHtcbiAgICAgICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFwiRmFpbGVkIHRvIHN0YXJ0IHNlcnZlcjpcIiwgZXJyKSk7XG4gICAgICAgIGF3YWl0IHNodXRkb3duKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBCYXNlTW9kZWwgfSA9IGF3YWl0IGltcG9ydChcIi4uL2RhdGFiYXNlL2Jhc2UtbW9kZWxcIik7XG4gICAgLy8g66i87KCAIOyymOumrO2VtOyVvO2VqC5cbiAgICBhd2FpdCBCYXNlTW9kZWwuZGVzdHJveSgpO1xuICAgIC8vIO2UhOuhnOyEuOyKpCDsooXro4wg7IucIOyCtOyVhOyeiOuKlCBXUyDsl7DqsrDsnYQg66i87KCAIOygleumrO2VtCDsnbTtm4Qg64uk66W4IOumrOyGjOyKpCDtlbTsoJwg6rO87KCV7JeQ7IScIOyelOyXrCBjYWxsYmFja+ydtCDtioDsp4Ag7JWK6rKMIO2VqFxuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICB0aGlzLl93ZWJzb2NrZXRSdW50aW1lPy5zaHV0ZG93bigpID8/IFByb21pc2UucmVzb2x2ZSgpLFxuICAgICAgdGhpcy5fd29ya2Zsb3dzPy5kZXN0cm95KCkgPz8gUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgICB0aGlzLl9jYWNoZT8uZGlzY29ubmVjdCgpID8/IFByb21pc2UucmVzb2x2ZSgpLFxuICAgICAgdGhpcy5fZGV2Vml0ZXN0TWFuYWdlcj8uc2h1dGRvd24oKSA/PyBQcm9taXNlLnJlc29sdmUoKSxcbiAgICAgIHRoaXMud2F0Y2hlcj8uY2xvc2UoKSA/PyBQcm9taXNlLnJlc29sdmUoKSxcbiAgICAgIGxvZ3RhcGVEaXNwb3NlKCksXG4gICAgXSk7XG4gICAgdGhpcy5fd2Vic29ja2V0UnVudGltZSA9IG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFNvbmFtdSA9IG5ldyBTb25hbXVDbGFzcygpO1xuXG4vKipcbiAqIHN0cmVhbSDrqqjrk5zsl5DshJwg7YKkIOyDneyEsSDtlajsiJjqsIAg7KeA7KCV65CY7KeAIOyViuyVmOydhCDrlYwg7IKs7Jqp7ZWY64qUIOq4sOuzuCDtlajsiJjsnoXri4jri6QuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRLZXlHZW5lcmF0b3IoZmlsZTogeyBmaWxlbmFtZTogc3RyaW5nOyBtaW1ldHlwZTogc3RyaW5nIH0pOiBzdHJpbmcge1xuICBjb25zdCBleHQgPSBtaW1lLmV4dGVuc2lvbihmaWxlLm1pbWV0eXBlKSB8fCBcImJpblwiO1xuICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICBjb25zdCByYW5kb20gPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCA4KTtcbiAgcmV0dXJuIGB1cGxvYWRzLyR7dGltZXN0YW1wfS0ke3JhbmRvbX0uJHtleHR9YDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VGltZShtczogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgZm9ybWF0dGVkID0gbXMgPj0gMTAwMCA/IGAkeyhtcyAvIDEwMDApLnRvRml4ZWQoMil9c2AgOiBgJHtNYXRoLnJvdW5kKG1zKX1tc2A7XG4gIHJldHVybiBgICgke2Zvcm1hdHRlZH0pYDtcbn1cblxuY29uc3QgTE9DQUxfSE9TVFMgPSBuZXcgU2V0KFtcImxvY2FsaG9zdFwiLCBcIjEyNy4wLjAuMVwiLCBcIjAuMC4wLjBcIiwgXCI6OjFcIl0pO1xuZnVuY3Rpb24gaXNMb2NhbEhvc3QoaG9zdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBMT0NBTF9IT1NUUy5oYXMoaG9zdCk7XG59XG5cbi8vIGAuZXZlcnkoKWDqsIAg7LKrIGd1YXJkIOydtO2bhCDsiJztmozrpbwg66mI7LaU64qUIOusuOygnOqwgCDsnojslrQgYGZvci4uLm9mYOuhnCDrqqjrk6AgZ3VhcmTrpbwg7Iic7ISc64yA66GcIOyLpO2Wie2VmOuPhOuhnSDqs6DsoJXtlahcbmZ1bmN0aW9uIHJ1bkd1YXJkcyh7XG4gIGd1YXJkcyxcbiAgY29uZmlnLFxuICByZXF1ZXN0LFxuICBhcGksXG59OiB7XG4gIGd1YXJkczogRXh0ZW5kZWRBcGlbXCJvcHRpb25zXCJdW1wiZ3VhcmRzXCJdIHwgdW5kZWZpbmVkO1xuICBjb25maWc6IFBpY2s8U29uYW11RmFzdGlmeUNvbmZpZywgXCJndWFyZEhhbmRsZXJcIj47XG4gIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0O1xuICBhcGk6IEV4dGVuZGVkQXBpO1xufSk6IHZvaWQge1xuICBmb3IgKGNvbnN0IGd1YXJkIG9mIGd1YXJkcyA/PyBbXSkge1xuICAgIGNvbmZpZy5ndWFyZEhhbmRsZXIoZ3VhcmQsIHJlcXVlc3QsIGFwaSk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtMERBLFNBQVMsb0JBQW9CLE1BQXNEO0NBQ2pGLE1BQU0sTUFBTSxLQUFLLFVBQVUsS0FBSyxTQUFTLElBQUk7Q0FDN0MsTUFBTSxZQUFZLEtBQUssS0FBSztDQUM1QixNQUFNLFNBQVMsS0FBSyxRQUFRLENBQUMsU0FBUyxHQUFHLENBQUMsTUFBTSxHQUFHLEVBQUU7QUFDckQsUUFBTyxXQUFXLFVBQVUsR0FBRyxPQUFPLEdBQUc7O0FBRzNDLFNBQVMsV0FBVyxJQUFvQjtDQUN0QyxNQUFNLFlBQVksTUFBTSxNQUFPLElBQUksS0FBSyxLQUFNLFFBQVEsRUFBRSxDQUFDLEtBQUssR0FBRyxLQUFLLE1BQU0sR0FBRyxDQUFDO0FBQ2hGLFFBQU8sS0FBSyxVQUFVOztBQUl4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
1462
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LmpzIiwibmFtZXMiOlsiREIiLCJhdXRoT3B0aW9uczogQmV0dGVyQXV0aE9wdGlvbnMiLCJnbG9iYWxDb21wcmVzc09wdGlvbnM6IENvbXByZXNzT3B0aW9ucyB8IHVuZGVmaW5lZCIsImZzIiwiY2hhbGsiLCJjYWNoZVJlcTogQ2FjaGVDb250cm9sUmVxdWVzdCIsImZpbGVQYXRoIiwiY3NyQ2FjaGVSZXE6IENhY2hlQ29udHJvbFJlcXVlc3QiLCJtaW1lTG9va3VwIiwiY29udGV4dDogQ29udGV4dCIsInJlcUJvZHk6IHtcbiAgICAgICAgICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xuICAgICAgICB9IiwiZmlsZXM6IHtcbiAgICAgICAgICBidWZmZXJlZEZpbGVzOiBCdWZmZXJlZEZpbGVbXTtcbiAgICAgICAgICB1cGxvYWRlZEZpbGVzOiBVcGxvYWRlZEZpbGVbXTtcbiAgICAgICAgfSIsImZpZWxkczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiIsImtleUdlbmVyYXRvcjogS2V5R2VuZXJhdG9yIiwid3NDb250ZXh0OiBXZWJTb2NrZXRDb250ZXh0IHwgbnVsbCIsInJhd1dzOiBSZXR1cm5UeXBlPFdlYlNvY2tldFJ1bnRpbWVbXCJyZWdpc3RlckNvbm5lY3Rpb25cIl0+IHwgbnVsbCIsInByZVJlZ2lzdGVyUGhhc2U6IFwiZ3VhcmRcIiB8IFwicXVlcnlcIiB8IFwicmVnaXN0ZXJcIiB8IFwiaGFuZGxlclwiIiwidHJhY2VDb250ZXh0OiBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uQ29udGV4dCIsInBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiIsImxvZ3RhcGVEaXNwb3NlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9zb25hbXUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiYXN5bmNfaG9va3NcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IHR5cGUgSW5jb21pbmdNZXNzYWdlLCB0eXBlIFNlcnZlciwgdHlwZSBTZXJ2ZXJSZXNwb25zZSB9IGZyb20gXCJodHRwXCI7XG5pbXBvcnQgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgdHlwZSB7fSBmcm9tIFwiQGZhc3RpZnkvd2Vic29ja2V0XCI7XG5pbXBvcnQgeyBkaXNwb3NlIGFzIGxvZ3RhcGVEaXNwb3NlIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCB7IHR5cGUgQXV0aCwgdHlwZSBCZXR0ZXJBdXRoT3B0aW9ucyB9IGZyb20gXCJiZXR0ZXItYXV0aFwiO1xuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IHsgdHlwZSBGU1dhdGNoZXIgfSBmcm9tIFwiY2hva2lkYXJcIjtcbmltcG9ydCB7IHR5cGUgRmFzdGlmeUluc3RhbmNlLCB0eXBlIEZhc3RpZnlSZXBseSwgdHlwZSBGYXN0aWZ5UmVxdWVzdCB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgbWltZSwgeyBsb29rdXAgYXMgbWltZUxvb2t1cCB9IGZyb20gXCJtaW1lLXR5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIFdlYlNvY2tldCB9IGZyb20gXCJ3c1wiO1xuaW1wb3J0IHsgdHlwZSBab2RPYmplY3QgfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IEJBU0VfRklFTERfTUFQUElOR1MgfSBmcm9tIFwiLi4vYXV0aC9iZXR0ZXItYXV0aC1lbnRpdGllc1wiO1xuaW1wb3J0IHsgYXBwbHlDYWNoZUhlYWRlcnMsIENhY2hlUHJlc2V0cyB9IGZyb20gXCIuLi9jYWNoZS1jb250cm9sL2NhY2hlLWNvbnRyb2xcIjtcbmltcG9ydCB7IHR5cGUgQ2FjaGVDb250cm9sQ29uZmlnLCB0eXBlIENhY2hlQ29udHJvbFJlcXVlc3QgfSBmcm9tIFwiLi4vY2FjaGUtY29udHJvbC90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBDYWNoZUNvbmZpZywgdHlwZSBDYWNoZU1hbmFnZXIgfSBmcm9tIFwiLi4vY2FjaGUvdHlwZXNcIjtcbmltcG9ydCB7IHRvRmFzdGlmeUNvbXByZXNzT3B0aW9uIH0gZnJvbSBcIi4uL2NvbXByZXNzL2NvbXByZXNzXCI7XG5pbXBvcnQgeyB0eXBlIENvbXByZXNzT3B0aW9ucyB9IGZyb20gXCIuLi9jb21wcmVzcy90eXBlc1wiO1xuaW1wb3J0IHsgREIgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IHR5cGUgU29uYW11REJDb25maWcgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IFNELCBzZXRTRENvbmZpZyB9IGZyb20gXCIuLi9kaWN0L3NkXCI7XG5pbXBvcnQgeyB0eXBlIExvY2FsaXplZFN0cmluZyB9IGZyb20gXCIuLi9kaWN0L3R5cGVzXCI7XG5pbXBvcnQgeyBOb3RGb3VuZEV4Y2VwdGlvbiB9IGZyb20gXCIuLi9leGNlcHRpb25zL3NvLWV4Y2VwdGlvbnNcIjtcbmltcG9ydCB7IEJ1ZmZlcmVkRmlsZSB9IGZyb20gXCIuLi9zdG9yYWdlL2J1ZmZlcmVkLWZpbGVcIjtcbmltcG9ydCB7IHR5cGUgU3RvcmFnZU1hbmFnZXIgfSBmcm9tIFwiLi4vc3RvcmFnZS9zdG9yYWdlLW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgS2V5R2VuZXJhdG9yIH0gZnJvbSBcIi4uL3N0b3JhZ2UvdHlwZXNcIjtcbmltcG9ydCB7IFVwbG9hZGVkRmlsZSB9IGZyb20gXCIuLi9zdG9yYWdlL3VwbG9hZGVkLWZpbGVcIjtcbmltcG9ydCB7IGNyZWF0ZU1vY2tTU0VGYWN0b3J5IH0gZnJvbSBcIi4uL3N0cmVhbS9zc2VcIjtcbmltcG9ydCB7IFdlYlNvY2tldFJ1bnRpbWUsIHR5cGUgV2ViU29ja2V0Q29ubmVjdGlvbiwgdHlwZSBXZWJTb2NrZXRFdmVudE1hcCB9IGZyb20gXCIuLi9zdHJlYW0vd3NcIjtcbmltcG9ydCB7XG4gIHR5cGUgVGVsZW1ldHJ5Q29udGV4dFByb3ZpZGVyLFxuICB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25Db250ZXh0LFxufSBmcm9tIFwiLi4vc3RyZWFtL3dzLXRlbGVtZXRyeVwiO1xuaW1wb3J0IHsgdHlwZSBTeW5jZXIgfSBmcm9tIFwiLi4vc3luY2VyL3N5bmNlclwiO1xuaW1wb3J0IHsgdHlwZSBXb3JrZmxvd01hbmFnZXIgfSBmcm9tIFwiLi4vdGFza3Mvd29ya2Zsb3ctbWFuYWdlclwiO1xuaW1wb3J0IHsgdHlwZSBEZXZWaXRlc3RNYW5hZ2VyIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZGV2LXZpdGVzdC1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIFNvbmFtdUZhc3RpZnlDb25maWcgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGNlbnRlclRleHQgfSBmcm9tIFwiLi4vdXRpbHMvY29uc29sZS11dGlsXCI7XG5pbXBvcnQgeyBpc0RhZW1vblNlcnZlciB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5pbXBvcnQgeyBleGlzdHMsIGZpbGVFeGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IHR5cGUgQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGNvbnZlcnRGYXN0aWZ5SGVhZGVyc1RvU3RhbmRhcmQsIG1lcmdlIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgeyB0eXBlIFNvbmFtdUNvbmZpZywgdHlwZSBTb25hbXVTZXJ2ZXJPcHRpb25zLCB0eXBlIFNvbmFtdVRhc2tPcHRpb25zIH0gZnJvbSBcIi4vY29uZmlnXCI7XG5pbXBvcnQgeyB0eXBlIENvbnRleHQsIHR5cGUgUnVudGltZUNvbnRleHQsIHR5cGUgV2ViU29ja2V0Q29udGV4dCB9IGZyb20gXCIuL2NvbnRleHRcIjtcbmltcG9ydCB7IHR5cGUgRXh0ZW5kZWRBcGkgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBnZXRTZWNyZXRzIH0gZnJvbSBcIi4vc2VjcmV0XCI7XG5pbXBvcnQgeyB0eXBlIFNvbmFtdVNlY3JldHMgfSBmcm9tIFwiLi9zZWNyZXRcIjtcbmltcG9ydCB7XG4gIGNyZWF0ZVdlYlNvY2tldFJlcGx5U3R1YixcbiAgcmVzb2x2ZVdlYlNvY2tldENsb3NlRGVzY3JpcHRvcixcbiAgcmVzb2x2ZVdlYlNvY2tldFBsdWdpbk9wdGlvbnMsXG4gIHJlc29sdmVJbnRlZ3JhdGVkVml0ZUhtck9wdGlvbnMsXG59IGZyb20gXCIuL3dlYnNvY2tldC1oZWxwZXJzXCI7XG5cbmV4cG9ydCB7XG4gIGNyZWF0ZVdlYlNvY2tldFJlcGx5U3R1YixcbiAgcmVzb2x2ZVdlYlNvY2tldENsb3NlRGVzY3JpcHRvcixcbiAgcmVzb2x2ZVdlYlNvY2tldFBsdWdpbk9wdGlvbnMsXG59IGZyb20gXCIuL3dlYnNvY2tldC1oZWxwZXJzXCI7XG5cbmNsYXNzIFNvbmFtdUNsYXNzIHtcbiAgcHVibGljIGlzSW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGZvclRlc3Rpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGFzeW5jTG9jYWxTdG9yYWdlOiBBc3luY0xvY2FsU3RvcmFnZTx7XG4gICAgY29udGV4dDogUnVudGltZUNvbnRleHQ7XG4gIH0+ID0gbmV3IEFzeW5jTG9jYWxTdG9yYWdlKCk7XG5cbiAgcHVibGljIGdldENvbnRleHQ8VCBleHRlbmRzIFJ1bnRpbWVDb250ZXh0ID0gQ29udGV4dD4oKTogVCB7XG4gICAgY29uc3Qgc3RvcmUgPSB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLmdldFN0b3JlKCk7XG4gICAgaWYgKHN0b3JlPy5jb250ZXh0KSB7XG4gICAgICByZXR1cm4gc3RvcmUuY29udGV4dCBhcyBUO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJ0ZXN0XCIpIHtcbiAgICAgIC8vIO2FjOyKpO2MhSDtmZjqsr3sl5DshJwg7Luo7YWN7Iqk7Yq46rCAIOyjvOyeheuQmOyngCDslYrsnYAg6rK97JqwIOu5iCDsu6jthY3siqTtirgg66as7YS0XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0cmFuc3BvcnQ6IFwiaHR0cFwiLFxuICAgICAgICByZXF1ZXN0OiBudWxsLFxuICAgICAgICByZXBseTogbnVsbCxcbiAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgIGNyZWF0ZVNTRTogKHNjaGVtYTogWm9kT2JqZWN0KSA9PiBjcmVhdGVNb2NrU1NFRmFjdG9yeShzY2hlbWEpLFxuICAgICAgICBsb2NhbGU6IFwiXCIsXG4gICAgICAgIHVzZXI6IG51bGwsXG4gICAgICAgIHNlc3Npb246IG51bGwsXG4gICAgICAgIG5haXRlU3RvcmU6IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCksXG4gICAgICB9IGFzIHVua25vd24gYXMgVDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGNhbm5vdCBmaW5kIGNvbnRleHRcIik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYXBpUm9vdFBhdGg6IEFic29sdXRlUGF0aCB8IG51bGwgPSBudWxsO1xuICBzZXQgYXBpUm9vdFBhdGgoYXBpUm9vdFBhdGg6IEFic29sdXRlUGF0aCkge1xuICAgIHRoaXMuX2FwaVJvb3RQYXRoID0gYXBpUm9vdFBhdGg7XG4gIH1cbiAgZ2V0IGFwaVJvb3RQYXRoKCk6IEFic29sdXRlUGF0aCB7XG4gICAgaWYgKHRoaXMuX2FwaVJvb3RQYXRoID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYXBpUm9vdFBhdGg7XG4gIH1cbiAgZ2V0IGFwcFJvb3RQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYXBpUm9vdFBhdGguc3BsaXQocGF0aC5zZXApLnNsaWNlKDAsIC0xKS5qb2luKHBhdGguc2VwKTtcbiAgfVxuXG4gIHByaXZhdGUgX2RiQ29uZmlnOiBTb25hbXVEQkNvbmZpZyB8IG51bGwgPSBudWxsO1xuICBzZXQgZGJDb25maWcoZGJDb25maWc6IFNvbmFtdURCQ29uZmlnKSB7XG4gICAgdGhpcy5fZGJDb25maWcgPSBkYkNvbmZpZztcbiAgfVxuICBnZXQgZGJDb25maWcoKTogU29uYW11REJDb25maWcge1xuICAgIGlmICh0aGlzLl9kYkNvbmZpZyA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2RiQ29uZmlnO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3luY2VyOiBTeW5jZXIgfCBudWxsID0gbnVsbDtcbiAgc2V0IHN5bmNlcihzeW5jZXI6IFN5bmNlcikge1xuICAgIHRoaXMuX3N5bmNlciA9IHN5bmNlcjtcbiAgfVxuICBnZXQgc3luY2VyKCk6IFN5bmNlciB7XG4gICAgaWYgKHRoaXMuX3N5bmNlciA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3N5bmNlcjtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbmZpZzogU29uYW11Q29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIHNldCBjb25maWcoY29uZmlnOiBTb25hbXVDb25maWcpIHtcbiAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gIH1cbiAgZ2V0IGNvbmZpZygpOiBTb25hbXVDb25maWcge1xuICAgIGlmICh0aGlzLl9jb25maWcgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgc2VjcmV0czogU29uYW11U2VjcmV0cyA9IGdldFNlY3JldHMoKTtcblxuICBwcml2YXRlIF9zdG9yYWdlOiBTdG9yYWdlTWFuYWdlciB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogU3RvcmFnZU1hbmFnZXIg7J247Iqk7YS07IqkXG4gICAqL1xuICBnZXQgc3RvcmFnZSgpOiBTdG9yYWdlTWFuYWdlciB7XG4gICAgaWYgKCF0aGlzLl9zdG9yYWdlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTdG9yYWdlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4gQ2hlY2sgc3RvcmFnZSBjb25maWcuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc3RvcmFnZTtcbiAgfVxuXG4gIHByaXZhdGUgX2NhY2hlOiBDYWNoZU1hbmFnZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIENhY2hlTWFuYWdlciDsnbjsiqTthLTsiqQgKEJlbnRvQ2FjaGUpXG4gICAqL1xuICBnZXQgY2FjaGUoKTogQ2FjaGVNYW5hZ2VyIHtcbiAgICBpZiAoIXRoaXMuX2NhY2hlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYWNoZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuIENoZWNrIGNhY2hlIGNvbmZpZyBpbiBzb25hbXUuY29uZmlnLnRzLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlO1xuICB9XG5cbiAgcHJpdmF0ZSBfd29ya2Zsb3dzOiBXb3JrZmxvd01hbmFnZXIgfCBudWxsID0gbnVsbDtcbiAgZ2V0IHdvcmtmbG93cygpOiBXb3JrZmxvd01hbmFnZXIge1xuICAgIGlmICh0aGlzLl93b3JrZmxvd3MgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3dvcmtmbG93cztcbiAgfVxuXG4gIHByaXZhdGUgX2F1dGg6IEF1dGg8QmV0dGVyQXV0aE9wdGlvbnM+IHwgbnVsbCA9IG51bGw7XG4gIGdldCBhdXRoKCk6IEF1dGg8QmV0dGVyQXV0aE9wdGlvbnM+IHtcbiAgICBpZiAoIXRoaXMuX2F1dGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkF1dGggaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLiBDaGVjayBhdXRoIGNvbmZpZyBpbiBzb25hbXUuY29uZmlnLnRzLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2F1dGg7XG4gIH1cblxuICBwcml2YXRlIF9kZXZWaXRlc3RNYW5hZ2VyOiBEZXZWaXRlc3RNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIGdldCBkZXZWaXRlc3RNYW5hZ2VyKCk6IERldlZpdGVzdE1hbmFnZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZGV2Vml0ZXN0TWFuYWdlcjtcbiAgfVxuICBzZXQgZGV2Vml0ZXN0TWFuYWdlcihtYW5hZ2VyOiBEZXZWaXRlc3RNYW5hZ2VyIHwgbnVsbCkge1xuICAgIHRoaXMuX2RldlZpdGVzdE1hbmFnZXIgPSBtYW5hZ2VyO1xuICB9XG5cbiAgLy8gU29uYW116rCAIHJ1bnRpbWXsnYQg7KeB7KCRIOyGjOycoO2VtCByZWdpc3RyeS9jb25uZWN0aW9uIGxpZmVjeWNsZeydhCDslaDtlIzrpqzsvIDsnbTshZgg7IiY66qF7KO86riw7JmAIOuPmeq4sO2ZlO2VqFxuICBwcml2YXRlIF93ZWJzb2NrZXRSdW50aW1lOiBXZWJTb2NrZXRSdW50aW1lIHwgbnVsbCA9IG51bGw7XG4gIC8vIOqwmeydgCBGYXN0aWZ5IOyduOyKpO2EtOyKpOyXkCBAZmFzdGlmeS93ZWJzb2NrZXTsnYQg7KSR67O1IOuTseuhne2VmOuKlCDqsoPsnYQgV2Vha1NldOycvOuhnCDssKjri6jtlahcbiAgcHJpdmF0ZSByZWFkb25seSB3ZWJzb2NrZXRQbHVnaW5TZXJ2ZXJzID0gbmV3IFdlYWtTZXQ8XG4gICAgRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT5cbiAgPigpO1xuICBnZXQgd2Vic29ja2V0UnVudGltZSgpOiBXZWJTb2NrZXRSdW50aW1lIHtcbiAgICBpZiAoIXRoaXMuX3dlYnNvY2tldFJ1bnRpbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIldlYlNvY2tldCBydW50aW1lIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC5cIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl93ZWJzb2NrZXRSdW50aW1lO1xuICB9XG4gIHNldCB3ZWJzb2NrZXRSdW50aW1lKHJ1bnRpbWU6IFdlYlNvY2tldFJ1bnRpbWUgfCBudWxsKSB7XG4gICAgdGhpcy5fd2Vic29ja2V0UnVudGltZSA9IHJ1bnRpbWU7XG4gIH1cblxuICAvLyBITVIg7LKY66asOiDtjIzsnbwg7Iuc7Iqk7YWcIOqwkOyLnCArIEhNUi9zeW5jIOyCrOydtO2BtCDsi6TtlonsnYAgd2F0Y2hlciDrqqjrk4jroZwg7JyE7J6E7ZWp64uI64ukLlxuICBwdWJsaWMgd2F0Y2hlcjogRlNXYXRjaGVyIHwgbnVsbCA9IG51bGw7XG5cbiAgcHVibGljIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlIHwgbnVsbCA9IG51bGw7XG5cbiAgYXN5bmMgaW5pdEZvclRlc3RpbmcoKSB7XG4gICAgYXdhaXQgdGhpcy5pbml0KHRydWUsIGZhbHNlLCB1bmRlZmluZWQsIHRydWUpO1xuICB9XG5cbiAgYXN5bmMgaW5pdChcbiAgICBkb1NpbGVudDogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGVuYWJsZVN5bmM6IGJvb2xlYW4gPSB0cnVlLFxuICAgIGFwaVJvb3RQYXRoPzogQWJzb2x1dGVQYXRoLFxuICAgIGZvclRlc3Rpbmc6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKSB7XG4gICAgdGhpcy5mb3JUZXN0aW5nID0gZm9yVGVzdGluZztcblxuICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpbml0U3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcblxuICAgIC8vIEFQSSDro6jtirgg7Yyo7IqkXG4gICAgY29uc3QgeyBmaW5kQXBpUm9vdFBhdGggfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL3V0aWxzXCIpO1xuICAgIHRoaXMuYXBpUm9vdFBhdGggPSBhcGlSb290UGF0aCA/PyBmaW5kQXBpUm9vdFBhdGgoKTtcblxuICAgIC8vIOyEpOygleydhCDroZzrlKntlZjripQg6rKD67aA7YSwIOyLnOyekVxuICAgIGNvbnN0IGNvbmZpZ1N0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgY29uc3QgeyBsb2FkQ29uZmlnIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2NvbmZpZ1wiKTtcbiAgICB0aGlzLmNvbmZpZyA9IGF3YWl0IGxvYWRDb25maWcodGhpcy5hcGlSb290UGF0aCk7XG4gICAgY29uc3QgY29uZmlnVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpIC0gY29uZmlnU3RhcnQ7XG4gICAgc2V0U0RDb25maWcodGhpcy5jb25maWcuaTE4bik7XG4gICAgLy8gc29uYW11LmNvbmZpZy50cyDquLDrs7jqsJIg7ISk7KCVXG4gICAgdGhpcy5jb25maWcuZGF0YWJhc2UuZGF0YWJhc2UgPSB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kYXRhYmFzZSA/PyBcInBnXCI7XG4gICAgdGhpcy5jb25maWcuZGF0YWJhc2UuZGVmYXVsdE9wdGlvbnMuY2xpZW50ID0gdGhpcy5jb25maWcuZGF0YWJhc2UuZGF0YWJhc2UgPz8gXCJwZ1wiO1xuXG4gICAgLy8g66Gc6rmFIOyEpOyglVxuICAgIGNvbnN0IHsgY29uZmlndXJlTG9nVGFwZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vbG9nZ2VyL2NvbmZpZ3VyZVwiKTtcbiAgICBpZiAodGhpcy5jb25maWcubG9nZ2luZyAhPT0gZmFsc2UpIHtcbiAgICAgIGF3YWl0IGNvbmZpZ3VyZUxvZ1RhcGUoe1xuICAgICAgICAuLi50aGlzLmNvbmZpZy5sb2dnaW5nLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gREIg66Gc65OcXG4gICAgY29uc3QgeyBEQiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZGF0YWJhc2UvZGJcIik7XG4gICAgdGhpcy5kYkNvbmZpZyA9IERCLmdlbmVyYXRlREJDb25maWcodGhpcy5jb25maWcuZGF0YWJhc2UpO1xuICAgIERCLnNldENvbmZpZyh0aGlzLmRiQ29uZmlnKTtcblxuICAgIC8vIEVudGl0eSDroZzrk5xcbiAgICAvLyDthYzsiqTtirjsl5DshJzrj4QgRW50aXR5IOygleuztOuKlCDtlYTsmpTtlanri4jri6QuXG4gICAgLy8gdXBzZXJ06rCAIOygnOuMgOuhnCDsnpHrj5ntlZjroKTrqbQgZW50aXR57J2YIHVuaXF1ZSBpbmRleCDsoJXrs7TqsIAg7ZWE7JqU7ZWY6riwIOuVjOusuOyeheuLiOuLpC5cbiAgICBjb25zdCB7IEVudGl0eU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiKTtcbiAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLmF1dG9sb2FkKGRvU2lsZW50KTtcblxuICAgIC8vIENhY2hlIOy0iOq4sO2ZlFxuICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZUNhY2hlKHRoaXMuY29uZmlnLnNlcnZlci5jYWNoZSwgZm9yVGVzdGluZyk7XG5cbiAgICAvLyBCZXR0ZXJBdXRoIOy0iOq4sO2ZlFxuICAgIGNvbnN0IGF1dGhDb25maWcgPSB0aGlzLmNvbmZpZy5zZXJ2ZXIuYXV0aDtcbiAgICBpZiAoYXV0aENvbmZpZykge1xuICAgICAgLy8g7IKs7Jqp7J6QIOyEpOygleqzvCDquLDrs7jqsJLsnYQgbWVyZ2VcbiAgICAgIGNvbnN0IG1lcmdlZEZpZWxkTWFwcGluZ3MgPSBtZXJnZShCQVNFX0ZJRUxEX01BUFBJTkdTLCBhdXRoQ29uZmlnKTtcblxuICAgICAgLy8gYmV0dGVyLWF1dGgg7J247Iqk7YS07IqkIOyDneyEsVxuICAgICAgY29uc3QgeyBiZXR0ZXJBdXRoIH0gPSBhd2FpdCBpbXBvcnQoXCJiZXR0ZXItYXV0aFwiKTtcbiAgICAgIGNvbnN0IHsgc29uYW11S25leEFkYXB0ZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2F1dGgva25leC1hZGFwdGVyXCIpO1xuXG4gICAgICBjb25zdCBhdXRoT3B0aW9uczogQmV0dGVyQXV0aE9wdGlvbnMgPSB7XG4gICAgICAgIGRhdGFiYXNlOiBzb25hbXVLbmV4QWRhcHRlcigpLFxuICAgICAgICAuLi5tZXJnZWRGaWVsZE1hcHBpbmdzLFxuICAgICAgfTtcbiAgICAgIHRoaXMuX2F1dGggPSBiZXR0ZXJBdXRoKGF1dGhPcHRpb25zKTtcbiAgICB9XG5cbiAgICAvLyDthYzsiqTtjIXsnbgg6rK97JqwIOyLse2BrCDsl4bsnbQg7KSR64uoXG4gICAgaWYgKGZvclRlc3RpbmcpIHtcbiAgICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGFzayDrk7HroZ1cbiAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVXb3JrZmxvd3ModGhpcy5jb25maWcudGFza3MpO1xuXG4gICAgLy8gU3luY2VyXG4gICAgY29uc3QgeyBTeW5jZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N5bmNlci9zeW5jZXJcIik7XG4gICAgdGhpcy5zeW5jZXIgPSBuZXcgU3luY2VyKCk7XG5cbiAgICAvLyBBdXRvbG9hZDogTW9kZWxzIC8gVHlwZXMgLyBBUElzIC8gV29ya2Zsb3dzIC8gVGVtcGxhdGVzIC8gU1NSIFJvdXRlc1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkVHlwZXMoKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZE1vZGVscygpO1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkQXBpcygpO1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkV29ya2Zsb3dzKCk7XG4gICAgY29uc3QgeyBUZW1wbGF0ZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3RlbXBsYXRlXCIpO1xuICAgIGF3YWl0IFRlbXBsYXRlTWFuYWdlci5hdXRvbG9hZCgpO1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkU3NyUm91dGVzKCk7XG5cbiAgICBjb25zdCB7IGlzTG9jYWwsIGlzVGVzdCwgaXNIb3RSZWxvYWRTZXJ2ZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIik7XG4gICAgaWYgKGlzTG9jYWwoKSAmJiAhaXNUZXN0KCkgJiYgaXNIb3RSZWxvYWRTZXJ2ZXIoKSAmJiBlbmFibGVTeW5jKSB7XG4gICAgICBhd2FpdCB0aGlzLnN5bmNlci5zeW5jKCk7XG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0V2F0Y2hlcigpO1xuICAgIH1cblxuICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgdGhpcy5faW5pdEVsYXBzZWQgPSBwZXJmb3JtYW5jZS5ub3coKSAtIGluaXRTdGFydDtcbiAgICB0aGlzLl9jb25maWdFbGFwc2VkID0gY29uZmlnVGltZTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRFbGFwc2VkID0gMDtcbiAgcHJpdmF0ZSBfY29uZmlnRWxhcHNlZCA9IDA7XG5cbiAgYXN5bmMgY3JlYXRlU2VydmVyKGluaXRPcHRpb25zPzogeyBlbmFibGVTeW5jPzogYm9vbGVhbjsgZG9TaWxlbnQ/OiBib29sZWFuIH0pIHtcbiAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXplZCkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0KGluaXRPcHRpb25zPy5kb1NpbGVudCwgaW5pdE9wdGlvbnM/LmVuYWJsZVN5bmMpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmNvbmZpZy5zZXJ2ZXI7XG4gICAgY29uc3QgeyBkZWZhdWx0OiBmYXN0aWZ5IH0gPSBhd2FpdCBpbXBvcnQoXCJmYXN0aWZ5XCIpO1xuICAgIGNvbnN0IHsgZ2V0TG9nVGFwZUZhc3RpZnlMb2dnZXIgfSA9IGF3YWl0IGltcG9ydChcIkBsb2d0YXBlL2Zhc3RpZnlcIik7XG4gICAgY29uc3Qgc2VydmVyID0gZmFzdGlmeSh7XG4gICAgICAuLi5vcHRpb25zLmZhc3RpZnksXG4gICAgICBsb2dnZXI6XG4gICAgICAgIHRoaXMuY29uZmlnLmxvZ2dpbmcgIT09IGZhbHNlXG4gICAgICAgICAgPyBnZXRMb2dUYXBlRmFzdGlmeUxvZ2dlcih7XG4gICAgICAgICAgICAgIGNhdGVnb3J5OiB0aGlzLmNvbmZpZy5sb2dnaW5nPy5mYXN0aWZ5Q2F0ZWdvcnkgPz8gW1wiZmFzdGlmeVwiXSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gICAgdGhpcy53ZWJzb2NrZXRSdW50aW1lID0gbmV3IFdlYlNvY2tldFJ1bnRpbWUob3B0aW9ucy53ZWJzb2NrZXQpO1xuXG4gICAgLy8gU3RvcmFnZSDshKTsoJUg4oaSIFN0b3JhZ2VNYW5hZ2VyIOyDneyEsVxuICAgIGlmIChvcHRpb25zLnN0b3JhZ2UpIHtcbiAgICAgIGNvbnN0IHsgU3RvcmFnZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N0b3JhZ2Uvc3RvcmFnZS1tYW5hZ2VyXCIpO1xuICAgICAgdGhpcy5fc3RvcmFnZSA9IG5ldyBTdG9yYWdlTWFuYWdlcihvcHRpb25zLnN0b3JhZ2UpO1xuICAgIH1cblxuICAgIC8vIO2UjOufrOq3uOyduCDrk7HroZ1cbiAgICBpZiAob3B0aW9ucy5wbHVnaW5zKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlZ2lzdGVyUGx1Z2lucyhzZXJ2ZXIsIG9wdGlvbnMucGx1Z2lucyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuYXV0aCkge1xuICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlckJldHRlckF1dGgoc2VydmVyLCBvcHRpb25zLmF1dGgpO1xuICAgIH1cblxuICAgIC8vIEFQSSDrnbzsmrDtjIUg7ISk7KCVXG4gICAgYXdhaXQgdGhpcy53aXRoRmFzdGlmeShzZXJ2ZXIsIG9wdGlvbnMuYXBpQ29uZmlnLCB7XG4gICAgICBlbmFibGVTeW5jOiBpbml0T3B0aW9ucz8uZW5hYmxlU3luYyxcbiAgICAgIGRvU2lsZW50OiBpbml0T3B0aW9ucz8uZG9TaWxlbnQsXG4gICAgfSk7XG5cbiAgICAvLyDshJzrsoQg7Iuc7J6RXG4gICAgYXdhaXQgdGhpcy5ib290KHNlcnZlciwgb3B0aW9ucyk7XG5cbiAgICBpZiAoIWluaXRPcHRpb25zPy5kb1NpbGVudCkge1xuICAgICAgdGhpcy5wcmludFN0YXJ0dXBTdW1tYXJ5KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlcnZlcjtcbiAgfVxuXG4gIGFzeW5jIHdpdGhGYXN0aWZ5KFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBlbmFibGVTeW5jPzogYm9vbGVhbjtcbiAgICAgIGRvU2lsZW50PzogYm9vbGVhbjtcbiAgICB9LFxuICApIHtcbiAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXplZCkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0KG9wdGlvbnM/LmRvU2lsZW50LCBvcHRpb25zPy5lbmFibGVTeW5jKTtcbiAgICB9XG5cbiAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjtcbiAgICB0aGlzLndlYnNvY2tldFJ1bnRpbWUgPz89IG5ldyBXZWJTb2NrZXRSdW50aW1lKHRoaXMuY29uZmlnLnNlcnZlci53ZWJzb2NrZXQpO1xuXG4gICAgLy8gdGltZXpvbmUg7ISk7KCVXG4gICAgY29uc3QgdGltZXpvbmUgPSB0aGlzLmNvbmZpZy5hcGkudGltZXpvbmU7XG4gICAgaWYgKHRpbWV6b25lKSB7XG4gICAgICAvLyDtg4DsnoTsobTsl5Ag66ee6rKMIOydkeuLtSDrgqDsp5wg7Iqk7Yq466eB7J2EIOuzgO2ZmO2VtOyjvOyWtOyVvCDtlanri4jri6QuXG4gICAgICAvLyDqsIDroLkgdGltZXpvbmXsnbQgXCJBc2lhL1Nlb3VsXCIg7J2066m0XG4gICAgICAvLyBcIjIwMjUtMTEtMjFUMDA6MDA6MDAuMDAwWlwiIOulvCBcIjIwMjUtMTEtMjFUMDk6MDA6MDArMDk6MDBcIiDsnLzroZwg67OA7ZmY7ZW07KO87Ja07JW8IO2VqeuLiOuLpC5cbiAgICAgIGNvbnN0IHsgZm9ybWF0SW5UaW1lWm9uZSB9ID0gYXdhaXQgaW1wb3J0KFwiZGF0ZS1mbnMtdHpcIik7XG5cbiAgICAgIC8vIElTTyA4NjAxIOuCoOynnCDtmJXsi50g7KCV6rec7IudICjsmIg6IDIwMjQtMDEtMTVUMDk6MzA6MDAuMDAwWilcbiAgICAgIGNvbnN0IElTT19EQVRFX1JFR0VYID0gL15cXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfShcXC5cXGR7M30pP1okLztcblxuICAgICAgLy8gVOulvCDrkZjrn6zsi7wg7J6R7J2A65Sw7Ji07ZGc6rCAIOyXhuuLpOuptCBcIjIwMjUtMTEtMTkxNzYzNTQ2MTg5MDAwMTg6NTY6MjkrMDk6MDBcIuyZgCDqsJnsnYAg6rKw6rO86rCAIOuCmOyYteuLiOuLpC5cbiAgICAgIC8vIOydtOuKlCBkYXRlLWZucyDtirnsnoXri4jri6QuXG4gICAgICAvLyDsnbTroIfqsowg7ZW064+EIOq0nOywruyKteuLiOuLpC4gXCIyMDI1LTExLTE5VDE4OjU2OjI5KzA5OjAwXCIg66qo7JaR7Jy866GcIOyemCDrgpjsmLXri4jri6QuXG4gICAgICBjb25zdCBEQVRFX0ZPUk1BVCA9IFwieXl5eS1NTS1kZCdUJ0hIOm1tOnNzWFhYXCI7XG5cbiAgICAgIHNlcnZlci5zZXRSZXBseVNlcmlhbGl6ZXIoKHBheWxvYWQpID0+IHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBheWxvYWQsIChfa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgSVNPX0RBVEVfUkVHRVgudGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXRJblRpbWVab25lKFxuICAgICAgICAgICAgICBuZXcgRGF0ZSh2YWx1ZSksXG4gICAgICAgICAgICAgIHRpbWV6b25lIGFzIGAke3N0cmluZ30vJHtzdHJpbmd9YCxcbiAgICAgICAgICAgICAgREFURV9GT1JNQVQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICAvLyBUaW1lem9uZSDroZzqt7jripQgcHJpbnRTdGFydHVwU3VtbWFyeeyXkOyEnCDthrXtlakg7Lac66ClXG4gICAgfVxuXG4gICAgLy8g7KCE7LK0IOudvOyasO2MhSDrpqzsiqTtirhcbiAgICBzZXJ2ZXIuZ2V0KFxuICAgICAgYCR7dGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeH0vcm91dGVzYCxcbiAgICAgIGFzeW5jIChfcmVxdWVzdCwgX3JlcGx5KTogUHJvbWlzZTx0eXBlb2YgdGhpcy5zeW5jZXIuYXBpcz4gPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW5jZXIuYXBpcztcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIEhlYWx0aGNoZWNrIEFQSVxuICAgIHNlcnZlci5nZXQoXG4gICAgICBgJHt0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4fS9oZWFsdGhjaGVja2AsXG4gICAgICBhc3luYyAoX3JlcXVlc3QsIF9yZXBseSk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgICAgIHJldHVybiBcIm9rXCI7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBTb25hbXUgVUkgQVBJICjroZzsu6wg7ZmY6rK97JeQ7ISc66eMKVxuICAgIGNvbnN0IHsgaXNMb2NhbCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvY29udHJvbGxlclwiKTtcbiAgICBpZiAoaXNMb2NhbCgpKSB7XG4gICAgICBjb25zdCB7IHNvbmFtdVVJQXBpUGx1Z2luIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91aS9hcGlcIik7XG4gICAgICBzZXJ2ZXIucmVnaXN0ZXIoc29uYW11VUlBcGlQbHVnaW4pO1xuICAgIH1cblxuICAgIC8vIERldlJ1bm5lciDthYzsiqTtirgg7JeU65Oc7Y+s7J247Yq4ICjroZzsu6wg7ZmY6rK9ICsgZGV2UnVubmVyIO2ZnOyEse2ZlCDsi5wpXG4gICAgaWYgKGlzTG9jYWwoKSAmJiB0aGlzLmNvbmZpZy50ZXN0Py5kZXZSdW5uZXI/LmVuYWJsZWQpIHtcbiAgICAgIGNvbnN0IHsgcmVnaXN0ZXJEZXZUZXN0Um91dGVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi90ZXN0aW5nL2Rldi10ZXN0LXJvdXRlc1wiKTtcbiAgICAgIGF3YWl0IHJlZ2lzdGVyRGV2VGVzdFJvdXRlcyhzZXJ2ZXIsIHRoaXMuY29uZmlnLnRlc3QuZGV2UnVubmVyKTtcbiAgICB9XG5cbiAgICBjb25zdCB3ZWJQYXRoID0gcGF0aC5qb2luKHRoaXMuYXBwUm9vdFBhdGgsIFwid2ViXCIpO1xuICAgIGNvbnN0IGhhc1dlYiA9IGF3YWl0IGV4aXN0cyh3ZWJQYXRoKTtcblxuICAgIC8vIOyghOyXrSBjb21wcmVzcyDsmLXshZgg6rOE7IKwIChyb3V0ZS5jb21wcmVzczogdHJ1ZeydvCDrlYwg7IKs7JqpKVxuICAgIGNvbnN0IHBsdWdpbkNvbXByZXNzID0gdGhpcy5jb25maWcuc2VydmVyLnBsdWdpbnM/LmNvbXByZXNzO1xuICAgIGNvbnN0IGdsb2JhbENvbXByZXNzT3B0aW9uczogQ29tcHJlc3NPcHRpb25zIHwgdW5kZWZpbmVkID0gcGx1Z2luQ29tcHJlc3NcbiAgICAgID8gcGx1Z2luQ29tcHJlc3MgPT09IHRydWVcbiAgICAgICAgPyB7IHRocmVzaG9sZDogMTAyNCwgZW5jb2RpbmdzOiBbXCJiclwiLCBcImd6aXBcIiwgXCJkZWZsYXRlXCJdIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICB0aHJlc2hvbGQ6IHBsdWdpbkNvbXByZXNzLnRocmVzaG9sZCxcbiAgICAgICAgICAgIGVuY29kaW5nczogcGx1Z2luQ29tcHJlc3MuZW5jb2RpbmdzLFxuICAgICAgICAgICAgY3VzdG9tVHlwZXM6IHBsdWdpbkNvbXByZXNzLmN1c3RvbVR5cGVzLFxuICAgICAgICAgIH1cbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKGlzTG9jYWwoKSkge1xuICAgICAgLy8g66Gc7LusIOqwnOuwnCDtmZjqsr06IGNhdGNoLWFsbOuhnCBBUEnrpbwg64+Z7KCBIOunpOy5re2VmOyXrCBITVLsnYQg7KeA7JuQ7ZWp64uI64ukLlxuICAgICAgLy8gU09OQU1VX0RJU0FCTEVfSU5URUdSQVRFRF9XRUI9eWVz66GcIOyEpOygle2VmOuptCBkZXZfYXBpIOuqqOuTnOyXkOyEnCBWaXRlIO2Gte2VqeydhCDruYTtmZzshLHtmZTtlaAg7IiYIOyeiOyKteuLiOuLpC5cbiAgICAgIGNvbnN0IGRpc2FibGVJbnRlZ3JhdGVkV2ViID0gcHJvY2Vzcy5lbnYuU09OQU1VX0RJU0FCTEVfSU5URUdSQVRFRF9XRUIgPT09IFwieWVzXCI7XG4gICAgICBpZiAoaGFzV2ViICYmICFkaXNhYmxlSW50ZWdyYXRlZFdlYikge1xuICAgICAgICBhd2FpdCB0aGlzLnNldHVwRGV2U2VydmVyV2l0aFZpdGUoc2VydmVyLCB3ZWJQYXRoLCBjb25maWcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXR1cERldlNlcnZlcihzZXJ2ZXIsIGNvbmZpZyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIO2UhOuhnOuNleyFmCDtmZjqsr06IOqwnOuzhCBBUEkg65287Jqw7Yq4ICsg7KCV7KCBIO2MjOydvCDshJzruZlcbiAgICAgIGZvciAoY29uc3QgYXBpIG9mIHRoaXMuc3luY2VyLmFwaXMpIHtcbiAgICAgICAgaWYgKHRoaXMuc3luY2VyLm1vZGVsc1thcGkubW9kZWxOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsoJXsnZjrkJjsp4Ag7JWK7J2AIOuqqOuNuOyXkCDsoJHqt7wgJHthcGkubW9kZWxOYW1lfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQHdlYnNvY2tldCByb3V0ZeuKlCB3c0hhbmRsZXLroZwg65Ox66Gd7ZWY6rOgLCDqsJnsnYAgcGF0aOydmCDsnbzrsJggSFRUUCBHRVTsnYAgNDI2IOydkeuLteycvOuhnCB1cGdyYWRl66W8IOqwleygnO2VqFxuICAgICAgICBpZiAoYXBpLndlYnNvY2tldE9wdGlvbnMpIHtcbiAgICAgICAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgdXJsOiB0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4ICsgYXBpLnBhdGgsXG4gICAgICAgICAgICBoYW5kbGVyOiB0aGlzLmNyZWF0ZVdlYlNvY2tldFVwZ3JhZGVSZXF1aXJlZEhhbmRsZXIoKSxcbiAgICAgICAgICAgIHdzSGFuZGxlcjogdGhpcy5jcmVhdGVXZWJTb2NrZXRIYW5kbGVyKGFwaSwgY29uZmlnKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICAgICAgbWV0aG9kOiBhcGkub3B0aW9ucy5odHRwTWV0aG9kID8/IFwiR0VUXCIsXG4gICAgICAgICAgdXJsOiB0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4ICsgYXBpLnBhdGgsXG4gICAgICAgICAgaGFuZGxlcjogdGhpcy5jcmVhdGVBcGlIYW5kbGVyKGFwaSwgY29uZmlnKSxcbiAgICAgICAgICBjb21wcmVzczogdG9GYXN0aWZ5Q29tcHJlc3NPcHRpb24oYXBpLm9wdGlvbnMuY29tcHJlc3MsIGdsb2JhbENvbXByZXNzT3B0aW9ucyksXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyDtlITroZzrjZXshZjsl5DshJzripQgd2ViIOyGjOyKpChhcHBSb290L3dlYikg7Jyg66y07JmAIOustOq0gO2VmOqyjCxcbiAgICAgIC8vIGFwaS93ZWItZGlzdCDsobTsnqwg7Jes67aA66W8IHNldHVwU3RhdGljV2ViU2VydmVyIOuCtOu2gOyXkOyEnCDtjJDri6jtlanri4jri6QuXG4gICAgICBhd2FpdCB0aGlzLnNldHVwU3RhdGljV2ViU2VydmVyKHNlcnZlciwgY29uZmlnLCBnbG9iYWxDb21wcmVzc09wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBkZXYg66qo65OcIOqzte2GtTogY2F0Y2gtYWxs7JeQ7IScIHN5bmNlci5hcGlz66W8IOuPmeyggeycvOuhnCDtg5Dsg4ntlZjsl6wgQVBJIOyalOyyreydhCDsspjrpqztlanri4jri6QuXG4gICAqIHNlcnZlci5yb3V0ZSgp66GcIOqwnOuzhCDrk7HroZ3tlZjrqbQgaGFuZGxlcuqwgCDqs6DsoJXrkJjslrQgSE1S7J20IOuPmeyeke2VmOyngCDslYrsnLzrr4DroZwsXG4gICAqIOunpCDsmpTssq3rp4jri6Qgc3luY2VyLmFwaXPrpbwg7KGw7ZqM7ZWY64qUIOydtCDrsKnsi53snYQg7IKs7Jqp7ZWp64uI64ukLlxuICAgKlxuICAgKiDsmpTssq3snbQgL2FwaSjsoJXtmZXtnojripQgdGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeCnroZwg7Iuc7J6R7ZWY7KeAIOyViuuKlCDqsr3smrDrnbzrqbQgbnVsbOydhCDrsJjtmZjtlZjrqbAg64Gd64OF64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVEZXZBcGlSZXF1ZXN0KFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKTogKChyZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCwgcmVwbHk6IEZhc3RpZnlSZXBseSkgPT4gUHJvbWlzZTx1bmtub3duPikgfCBudWxsIHtcbiAgICBjb25zdCBtYXRjaGVkQXBpID0gdGhpcy5maW5kTWF0Y2hlZEFwaShyZXF1ZXN0KTtcblxuICAgIGlmICghbWF0Y2hlZEFwaSkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFNEKFwiZXJyb3IuYXBpLm5vdEZvdW5kXCIpKTtcbiAgICB9XG5cbiAgICAvLyB3ZWJzb2NrZXQgcm91dGXrpbwg7J2867CYIEhUVFDroZwg7KeB7KCRIO2YuOy2nO2VnCDqsr3smrAgNDI27J2EIOuPjOugpOykmCB1cGdyYWRlIOyXhuydtCDsoJHqt7ztlZjripQg6rKD7J2EIOywqOuLqO2VqFxuICAgIGlmIChtYXRjaGVkQXBpLndlYnNvY2tldE9wdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVdlYlNvY2tldFVwZ3JhZGVSZXF1aXJlZEhhbmRsZXIoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jcmVhdGVBcGlIYW5kbGVyKG1hdGNoZWRBcGksIGNvbmZpZyk7XG4gIH1cblxuICBwcml2YXRlIGZpbmRNYXRjaGVkQXBpKHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0KTogRXh0ZW5kZWRBcGkgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0UGF0aG5hbWVGcm9tVXJsKHJlcXVlc3QudXJsKTtcbiAgICBjb25zdCBtZXRob2QgPSByZXF1ZXN0Lm1ldGhvZDtcblxuICAgIGlmICghdXJsLnN0YXJ0c1dpdGgodGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeCkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3luY2VyLmFwaXMuZmluZCgoYXBpKSA9PiB7XG4gICAgICBpZiAodGhpcy5zeW5jZXIubW9kZWxzW2FwaS5tb2RlbE5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgYXBpTWV0aG9kID0gYXBpLm9wdGlvbnMuaHR0cE1ldGhvZCA/PyBcIkdFVFwiO1xuICAgICAgaWYgKGFwaU1ldGhvZCAhPT0gbWV0aG9kKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gdGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeCArIGFwaS5wYXRoO1xuICAgICAgcmV0dXJuIHRoaXMuaXNQYXRoUGF0dGVybk1hdGNoKGZ1bGxQYXRoLCB1cmwpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGRldiBhcGkg66qo65OcOiBWaXRlIOyXhuydtCBBUEkg64+Z7KCBIOudvOyasO2MheunjCDsoJzqs7Xtlanri4jri6QuXG4gICAqIEhNUuydhCDsnITtlbQgY2F0Y2gtYWxs7JeQ7IScIOunpCDsmpTssq3rp4jri6Qgc3luY2VyLmFwaXPrpbwg7KGw7ZqM7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBzZXR1cERldlNlcnZlcihcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKTogdm9pZCB7XG4gICAgLy8gdXBncmFkZeuKlCDsi6Tsp4jsoIHsnLzroZwgR0VU7JeQ7ISc66eMIOyEseumve2VmOuvgOuhnCBHRVQgKyB3c0hhbmRsZXIg7JmAIOq3uCDsmbggbWV0aG9k66W8IOuzhOuPhCByb3V0ZeuhnCDrtoTrpqztlahcbiAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgdXJsOiBgJHt0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4fS8qYCxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVEZXZBcGlSZXF1ZXN0KHJlcXVlc3QsIGNvbmZpZyk7XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgcmV0dXJuIGhhbmRsZXIocmVxdWVzdCwgcmVwbHkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIOuTseuhneuQnCBBUEnsmYAg7J287LmY7ZWY7KeAIOyViuuKlCDsmpTssq3sl5Ag64yA7ZWcIGZhbGxiYWNr7J6F64uI64ukLlxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oU0QoXCJlcnJvci5hcGkubm90Rm91bmRcIikpO1xuICAgICAgfSxcbiAgICAgIHdzSGFuZGxlcjogYXN5bmMgKGNvbm5lY3Rpb24sIHJlcXVlc3QpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVEZXZXZWJTb2NrZXRSZXF1ZXN0KGNvbm5lY3Rpb24uc29ja2V0LCByZXF1ZXN0LCBjb25maWcpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFtcIkhFQURcIiwgXCJQT1NUXCIsIFwiUFVUXCIsIFwiREVMRVRFXCIsIFwiUEFUQ0hcIl0sXG4gICAgICB1cmw6IGAke3RoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9LypgLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZURldkFwaVJlcXVlc3QocmVxdWVzdCwgY29uZmlnKTtcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm4gaGFuZGxlcihyZXF1ZXN0LCByZXBseSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFNEKFwiZXJyb3IuYXBpLm5vdEZvdW5kXCIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHZpdGVTZXJ2ZXI6IGFueSA9IG51bGw7XG5cbiAgLyoqXG4gICAqIGRldiBhbGwg66qo65OcOiBWaXRlIERldiBTZXJ2ZXLrpbwg7Ya17ZWp7ZWY7JesIEFQSSArIFNTUiArIENTUuydhCDrqqjrkZAg7KCc6rO17ZWp64uI64ukLlxuICAgKiBBUEkg64+Z7KCBIOunpOy5reydgCBoYW5kbGVEZXZBcGlSZXF1ZXN066W8IOqzteycoO2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2V0dXBEZXZTZXJ2ZXJXaXRoVml0ZShcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+LFxuICAgIHdlYlBhdGg6IHN0cmluZyxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEBmYXN0aWZ5L21pZGRpZSDrk7HroZ0gKENvbm5lY3Qtc3R5bGUgbWlkZGxld2FyZSDsp4Dsm5ApXG4gICAgYXdhaXQgc2VydmVyLnJlZ2lzdGVyKChhd2FpdCBpbXBvcnQoXCJAZmFzdGlmeS9taWRkaWVcIikpLmRlZmF1bHQpO1xuXG4gICAgY29uc3Qgdml0ZSA9IGF3YWl0IGltcG9ydChcInZpdGVcIik7XG4gICAgLy8gQGZhc3RpZnkvd2Vic29ja2V0IO2UjOufrOq3uOyduOydtCDtmZzshLHtmZTrkJjrqbQgSE1SIHdlYnNvY2tldOqzvCBzZXJ2ZXIgc29ja2V07J20IOy2qeuPjO2VmOuvgOuhnCBkZWRpY2F0ZWQg7Y+s7Yq466GcIOu2hOumrO2VqFxuICAgIGNvbnN0IHJlcXVpcmVzRGVkaWNhdGVkSG1yU2VydmVyID0gQm9vbGVhbih0aGlzLmNvbmZpZy5zZXJ2ZXIucGx1Z2lucz8ud3MpO1xuICAgIGNvbnN0IGhtciA9IHJlc29sdmVJbnRlZ3JhdGVkVml0ZUhtck9wdGlvbnMoe1xuICAgICAgaHR0cFNlcnZlcjogc2VydmVyLnNlcnZlcixcbiAgICAgIHJlcXVpcmVzRGVkaWNhdGVkV2ViU29ja2V0U2VydmVyOiByZXF1aXJlc0RlZGljYXRlZEhtclNlcnZlcixcbiAgICB9KTtcblxuICAgIHRoaXMudml0ZVNlcnZlciA9IGF3YWl0IHZpdGUuY3JlYXRlU2VydmVyKHtcbiAgICAgIHJvb3Q6IHdlYlBhdGgsXG4gICAgICBzZXJ2ZXI6IHtcbiAgICAgICAgbWlkZGxld2FyZU1vZGU6IHRydWUsXG4gICAgICAgIGhtcixcbiAgICAgIH0sXG4gICAgICBhcHBUeXBlOiBcImN1c3RvbVwiLFxuICAgIH0pO1xuXG4gICAgLy8gVml0ZSBtaWRkbGV3YXJlIOuTseuhnSAoVml0ZSDsl5DshYsg7LKY66asKVxuICAgIHNlcnZlci51c2UoKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgICAvLyBBUEnsmYAgU29uYW11IFVJ64qUIEZhc3RpZnkg65287Jqw7Yq46rCAIOyymOumrO2VmOuPhOuhnSBza2lwXG4gICAgICBpZiAocmVxLnVybD8uc3RhcnRzV2l0aCh0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4KSB8fCByZXEudXJsPy5zdGFydHNXaXRoKFwiL3NvbmFtdS11aVwiKSkge1xuICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgICAgfVxuICAgICAgLy8g64KY66i47KeA64qUIFZpdGUgbWlkZGxld2FyZeuhnCDsoITri6xcbiAgICAgIHJldHVybiB0aGlzLnZpdGVTZXJ2ZXIubWlkZGxld2FyZXMocmVxLCByZXMsIG5leHQpO1xuICAgIH0pO1xuXG4gICAgLy8gV1MgdXBncmFkZSDqsr3roZwoR0VUKeyZgCDsnbzrsJggSFRUUCDrqZTshJzrk5zrpbwg67OE64+EIHJvdXRl66GcIOu2hOumrO2VtCB3ZWJzb2NrZXQgcm91dGXqsIAgSFRNTCBmYWxsYmFja+yXkCDrqLntnojsp4Ag7JWK64+E66GdIO2VqFxuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICB1cmw6IGAke3RoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9LypgLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuaGFuZGxlRGV2QXBpUmVxdWVzdChyZXF1ZXN0LCBjb25maWcpO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdChyZXF1ZXN0LCByZXBseSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFNEKFwiZXJyb3IuYXBpLm5vdEZvdW5kXCIpKTtcbiAgICAgIH0sXG4gICAgICB3c0hhbmRsZXI6IGFzeW5jIChjb25uZWN0aW9uLCByZXF1ZXN0KSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRGV2V2ViU29ja2V0UmVxdWVzdChjb25uZWN0aW9uLnNvY2tldCwgcmVxdWVzdCwgY29uZmlnKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgbWV0aG9kOiBbXCJIRUFEXCIsIFwiUE9TVFwiLCBcIlBVVFwiLCBcIkRFTEVURVwiLCBcIlBBVENIXCJdLFxuICAgICAgdXJsOiBgJHt0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4fS8qYCxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmhhbmRsZURldkFwaVJlcXVlc3QocmVxdWVzdCwgY29uZmlnKTtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQocmVxdWVzdCwgcmVwbHkpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihTRChcImVycm9yLmFwaS5ub3RGb3VuZFwiKSk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gY2F0Y2gtYWxsIOudvOyasO2KuOyXkOyEnCBTU1IvQ1NSIOyymOumrFxuICAgIC8vIOqwnOuwnCDtmZjqsr3sl5DshJzripQg65287Jqw7Yq467OEIGNvbXByZXNzIOyYteyFmOydhCDtj6zquLDtlZjqs6AgSE1SIOydtOygkOydhCDst6jtlanri4jri6QuXG4gICAgc2VydmVyLnJvdXRlKHtcbiAgICAgIG1ldGhvZDogW1wiR0VUXCIsIFwiSEVBRFwiXSxcbiAgICAgIHVybDogXCIvKlwiLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IHVybCA9IHJlcXVlc3QudXJsO1xuXG4gICAgICAgIC8vIDEuIFNTUiDrnbzsmrDtirgg7LKY66asXG4gICAgICAgIGNvbnN0IHsgbWF0Y2hTU1JSb3V0ZSwgcmVuZGVyU1NSIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zc3JcIik7XG4gICAgICAgIGNvbnN0IHNzck1hdGNoID0gbWF0Y2hTU1JSb3V0ZSh1cmwpO1xuICAgICAgICBpZiAoc3NyTWF0Y2gpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgW1NTUl0gTWF0Y2hlZCByb3V0ZTogJHtzc3JNYXRjaC5yb3V0ZS5wYXRofWApO1xuICAgICAgICAgIGNvbnN0IGh0bWwgPSBhd2FpdCByZW5kZXJTU1IoXG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICBzc3JNYXRjaC5yb3V0ZSxcbiAgICAgICAgICAgIHNzck1hdGNoLnBhcmFtcyxcbiAgICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgICByZXBseSxcbiAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgIHRoaXMudml0ZVNlcnZlcixcbiAgICAgICAgICApO1xuICAgICAgICAgIHJlcGx5LnR5cGUoXCJ0ZXh0L2h0bWxcIik7XG4gICAgICAgICAgcmV0dXJuIGh0bWw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyLiBDU1IgZmFsbGJhY2tcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBmcyA9IGF3YWl0IGltcG9ydChcIm5vZGU6ZnMvcHJvbWlzZXNcIik7XG4gICAgICAgICAgbGV0IHRlbXBsYXRlID0gYXdhaXQgZnMucmVhZEZpbGUoXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy52aXRlU2VydmVyLmNvbmZpZy5yb290LCBcImluZGV4Lmh0bWxcIiksXG4gICAgICAgICAgICBcInV0Zi04XCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0ZW1wbGF0ZSA9IGF3YWl0IHRoaXMudml0ZVNlcnZlci50cmFuc2Zvcm1JbmRleEh0bWwodXJsLCB0ZW1wbGF0ZSk7XG5cbiAgICAgICAgICByZXBseS50eXBlKFwidGV4dC9odG1sXCIpO1xuICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRoaXMudml0ZVNlcnZlci5zc3JGaXhTdGFja3RyYWNlKGUgYXMgRXJyb3IpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgcmVwbHkuc3RhdHVzKDUwMCk7XG4gICAgICAgICAgcmV0dXJuIChlIGFzIEVycm9yKS5tZXNzYWdlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8g7ISc67KEIOyiheujjCDsi5wgVml0ZeuPhCDsooXro4xcbiAgICBzZXJ2ZXIuYWRkSG9vayhcIm9uQ2xvc2VcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy52aXRlU2VydmVyLmNsb3NlKCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICBpZiAoXCJwb3J0XCIgaW4gaG1yKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsuZGltKFxuICAgICAgICAgIGDinJMgVml0ZSBITVIgdXNpbmcgZGVkaWNhdGVkIHdlYnNvY2tldCBwb3J0ICR7aG1yLnBvcnR9IHRvIGF2b2lkIEZhc3RpZnkgd2Vic29ja2V0IGNvbmZsaWN0c2AsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oXCLinJMgVml0ZSBkZXYgc2VydmVyIGludGVncmF0ZWRcIikpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXR1cFN0YXRpY1dlYlNlcnZlcihcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICBnbG9iYWxDb21wcmVzc09wdGlvbnM6IENvbXByZXNzT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g6rK966GcIOuqhe2Zle2ZlDogYXBpL3dlYi1kaXN0L2NsaWVudCAo7KCV7KCBIO2MjOydvCksIGFwaS93ZWItZGlzdC9zZXJ2ZXIgKFNTUiBlbnRyeSksIGFwaS9kaXN0L3NzciAoU1NSIHJvdXRlcyAtIEFQSSDshozsnKApXG4gICAgY29uc3Qgd2ViRGlzdFBhdGggPSBwYXRoLmpvaW4odGhpcy5hcGlSb290UGF0aCwgXCJ3ZWItZGlzdFwiLCBcImNsaWVudFwiKTtcbiAgICBjb25zdCBzc3JQYXRoID0gcGF0aC5qb2luKHRoaXMuYXBpUm9vdFBhdGgsIFwid2ViLWRpc3RcIiwgXCJzZXJ2ZXJcIik7XG4gICAgY29uc3Qgc3NyRW50cnlQYXRoID0gcGF0aC5qb2luKHNzclBhdGgsIFwiZW50cnktc2VydmVyLmdlbmVyYXRlZC5qc1wiKTtcbiAgICBjb25zdCBzc3JSb3V0ZXNQYXRoID0gcGF0aC5qb2luKHRoaXMuYXBpUm9vdFBhdGgsIFwiZGlzdFwiLCBcInNzclwiLCBcInJvdXRlcy5qc1wiKTtcblxuICAgIGlmICghKGF3YWl0IGV4aXN0cyh3ZWJEaXN0UGF0aCkpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYOKaoCBXZWIgZGlzdCBub3QgZm91bmQ6ICR7d2ViRGlzdFBhdGh9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU1NSIGVudHJ5IOyhtOyerCDsl6zrtoAg7ZmV7J24XG4gICAgY29uc3Qgc3NyQXZhaWxhYmxlID0gYXdhaXQgZXhpc3RzKHNzckVudHJ5UGF0aCk7XG5cbiAgICBpZiAoIXNzckF2YWlsYWJsZSkge1xuICAgICAgY29uc29sZS53YXJuKGDimqAgU1NSIGVudHJ5IG5vdCBmb3VuZDogJHtzc3JFbnRyeVBhdGh9YCk7XG4gICAgICBjb25zb2xlLndhcm4oXCIgIFNTUiB3aWxsIGJlIGRpc2FibGVkLiBPbmx5IENTUiB3aWxsIHdvcmsuXCIpO1xuICAgIH1cblxuICAgIC8vIFNTUiDrnbzsmrDtirgg66Gc65OcIChwcm9kdWN0aW9u7JeQ7ISc66eMLCDsgqzsmqnsnpAg7ZSE66Gc7KCd7Yq47J2YIHNzci9yb3V0ZXMudHMpXG4gICAgaWYgKHNzckF2YWlsYWJsZSkge1xuICAgICAgaWYgKGF3YWl0IGV4aXN0cyhzc3JSb3V0ZXNQYXRoKSkge1xuICAgICAgICAvLyB0cy1sb2FkZXLrnbzrqbQgXCJmaWxlOi8vXCLroZwg7Iuc7J6R7ZWY64qUIGZ1bGx5LXJlc29sdmVkIHBhdGjrp4wg67Cb6riw7JeQIOydtOulvCDsspjrpqztlbTso7zripQgaW1wb3J0TWVtYmVyc+ulvCDsgqzsmqntlbTslbwg7ZaI6rKg7KeA66eMLFxuICAgICAgICAvLyDsl6zquLDripQg7ZSE66Gc642V7IWYIO2ZmOqyveyXkOyEnCBsb2FkZXIg7JeG7J20IOuPjOyVhOqwgOq4sCDrlYzrrLjsl5AgXCLsp4Tsp5wganMg7YyM7J28XCLsnZggXCLqt7jrg6VcIiDsoIjrjIDqsr3roZzrpbwg67CU66GcIGltcG9ydO2VtOuPhCDrkKnri4jri6QuXG4gICAgICAgIC8vIOydtCDrgrTsmqnsnYAg7J20IO2VqOyImCDrgrTsl5DshJwg7JWE656Y7JeQIOuCmOyYrCDri6TrpbggaW1wb3J0IO2YuOy2nOyXkOuPhCDrj5nsnbztlZjqsowg7KCB7Jqp65Cp64uI64ukLlxuICAgICAgICBhd2FpdCBpbXBvcnQoc3NyUm91dGVzUGF0aCk7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi4pyTIFNTUiByb3V0ZXMgbG9hZGVkXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGDimqAgU1NSIHJvdXRlcyBub3QgZm91bmQ6ICR7c3NyUm91dGVzUGF0aH1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDroaTrp4Eg7JeF642w7J207Yq4IOuMgOydkTogYXNzZXQgaGFzaCDrtojsnbzsuZgg7IucIO2YhOyerCDrsoTsoIQg7KeB7KCRIOyEnOu5mVxuICAgIHNlcnZlci5nZXQoXCIvYXNzZXRzLzpmaWxlbmFtZVwiLCBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3RlZEZpbGUgPSAocmVxdWVzdC5wYXJhbXMgYXMgeyBmaWxlbmFtZTogc3RyaW5nIH0pLmZpbGVuYW1lO1xuICAgICAgY29uc3QgYXNzZXRzRGlyID0gcGF0aC5qb2luKHdlYkRpc3RQYXRoLCBcImFzc2V0c1wiKTtcbiAgICAgIGNvbnN0IHNhZmVGaWxlUGF0aCA9IHRoaXMucmVzb2x2ZVBhdGhXaXRoaW5CYXNlRGlyKGFzc2V0c0RpciwgcmVxdWVzdGVkRmlsZSk7XG4gICAgICBpZiAoc2FmZUZpbGVQYXRoID09PSBudWxsKSB7XG4gICAgICAgIHJlcGx5LnN0YXR1cyg0MDMpLnNlbmQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgbm9ybWFsaXplZFJlcXVlc3RlZEZpbGUgPSBwYXRoLnJlbGF0aXZlKGFzc2V0c0Rpciwgc2FmZUZpbGVQYXRoKS5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKTtcblxuICAgICAgY29uc3QgYXNzZXRQYXRoID0gYC9hc3NldHMvJHtub3JtYWxpemVkUmVxdWVzdGVkRmlsZX1gO1xuXG4gICAgICAvLyBDYWNoZS1Db250cm9sIO2XpOuNlCDqsrDsoJVcbiAgICAgIGNvbnN0IGdldENhY2hlQ29udHJvbEZvckFzc2V0ID0gKCk6IENhY2hlQ29udHJvbENvbmZpZyA9PiB7XG4gICAgICAgIGNvbnN0IGNhY2hlUmVxOiBDYWNoZUNvbnRyb2xSZXF1ZXN0ID0ge1xuICAgICAgICAgIHR5cGU6IFwiYXNzZXRzXCIsXG4gICAgICAgICAgdXJsOiByZXF1ZXN0LnVybCxcbiAgICAgICAgICBwYXRoOiBhc3NldFBhdGgsXG4gICAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyDsgqzsmqnsnpAg7KCV7J2YIO2VuOuTpOufrCDsmrDshKBcbiAgICAgICAgaWYgKGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIoY2FjaGVSZXEpO1xuICAgICAgICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDquLDrs7jqsJI6IGltbXV0YWJsZVxuICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLmltbXV0YWJsZTtcbiAgICAgIH07XG5cbiAgICAgIC8vIGluZGV4LSouanMg65iQ64qUIGluZGV4LSouY3NzIOyalOyyreyduCDqsr3smrBcbiAgICAgIGlmICgvXmluZGV4LVthLWYwLTldK1xcLihqc3xjc3MpJC8udGVzdChub3JtYWxpemVkUmVxdWVzdGVkRmlsZSkpIHtcbiAgICAgICAgY29uc3QgZXh0ID0gbm9ybWFsaXplZFJlcXVlc3RlZEZpbGUuc3BsaXQoXCIuXCIpLnBvcCgpO1xuICAgICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzLnJlYWRkaXIoYXNzZXRzRGlyKTtcbiAgICAgICAgY29uc3QgY3VycmVudEZpbGUgPSBmaWxlcy5maW5kKChmKSA9PiBmLnN0YXJ0c1dpdGgoXCJpbmRleC1cIikgJiYgZi5lbmRzV2l0aChgLiR7ZXh0fWApKTtcblxuICAgICAgICBpZiAoY3VycmVudEZpbGUpIHtcbiAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihhc3NldHNEaXIsIGN1cnJlbnRGaWxlKTtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgpO1xuICAgICAgICAgIHJlcGx5LnR5cGUoZXh0ID09PSBcImpzXCIgPyBcImFwcGxpY2F0aW9uL2phdmFzY3JpcHRcIiA6IFwidGV4dC9jc3NcIik7XG4gICAgICAgICAgYXBwbHlDYWNoZUhlYWRlcnMocmVwbHksIGdldENhY2hlQ29udHJvbEZvckFzc2V0KCkpO1xuICAgICAgICAgIHJldHVybiByZXBseS5zZW5kKGNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIOydvOuwmCDtjIzsnbwg7ISc67mZXG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHNhZmVGaWxlUGF0aDtcbiAgICAgIGlmIChhd2FpdCBleGlzdHMoZmlsZVBhdGgpKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCk7XG4gICAgICAgIGNvbnN0IGV4dCA9IG5vcm1hbGl6ZWRSZXF1ZXN0ZWRGaWxlLnNwbGl0KFwiLlwiKS5wb3AoKTtcbiAgICAgICAgcmVwbHkudHlwZShleHQgPT09IFwianNcIiA/IFwiYXBwbGljYXRpb24vamF2YXNjcmlwdFwiIDogZXh0ID09PSBcImNzc1wiID8gXCJ0ZXh0L2Nzc1wiIDogXCJcIik7XG4gICAgICAgIGlmIChub3JtYWxpemVkUmVxdWVzdGVkRmlsZS5pbmNsdWRlcyhcIi1cIikpIHtcbiAgICAgICAgICBhcHBseUNhY2hlSGVhZGVycyhyZXBseSwgZ2V0Q2FjaGVDb250cm9sRm9yQXNzZXQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcGx5LnNlbmQoY29udGVudCk7XG4gICAgICB9XG5cbiAgICAgIHJlcGx5LnN0YXR1cyg0MDQpLnNlbmQoKTtcbiAgICB9KTtcblxuICAgIC8vIFNTUiDrnbzsmrDtirgg6rCc67OEIOuTseuhnSAoY29tcHJlc3Mg7Ji17IWY7J20IOudvOyasO2KuOuzhOuhnCDsoIHsmqnrkJjrj4TroZ0pXG4gICAgaWYgKHNzckF2YWlsYWJsZSkge1xuICAgICAgY29uc3QgeyBnZXRTU1JSb3V0ZXMgfSA9IGF3YWl0IGltcG9ydChcIi4uL3NzclwiKTtcbiAgICAgIGNvbnN0IHsgcmVuZGVyU1NSIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zc3IvcmVuZGVyZXJcIik7XG4gICAgICBjb25zdCBzc3JSb3V0ZXMgPSBnZXRTU1JSb3V0ZXMoKTtcblxuICAgICAgZm9yIChjb25zdCByb3V0ZSBvZiBzc3JSb3V0ZXMpIHtcbiAgICAgICAgc2VydmVyLnJvdXRlKHtcbiAgICAgICAgICBtZXRob2Q6IFtcIkdFVFwiLCBcIkhFQURcIl0sXG4gICAgICAgICAgdXJsOiByb3V0ZS5wYXRoLFxuICAgICAgICAgIGNvbXByZXNzOiB0b0Zhc3RpZnlDb21wcmVzc09wdGlvbihyb3V0ZS5jb21wcmVzcyA/PyB0cnVlLCBnbG9iYWxDb21wcmVzc09wdGlvbnMpLFxuICAgICAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdXJsID0gcmVxdWVzdC51cmw7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgW1NTUl0gTWF0Y2hlZCByb3V0ZTogJHtyb3V0ZS5wYXRofWApO1xuXG4gICAgICAgICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmV4dHJhY3RQYXRoUGFyYW1zKHJvdXRlLnBhdGgsIHVybCk7XG4gICAgICAgICAgICBjb25zdCBodG1sID0gYXdhaXQgcmVuZGVyU1NSKHVybCwgcm91dGUsIHBhcmFtcywgcmVxdWVzdCwgcmVwbHksIGNvbmZpZyk7XG5cbiAgICAgICAgICAgIHJlcGx5LnR5cGUoXCJ0ZXh0L2h0bWxcIik7XG4gICAgICAgICAgICByZXR1cm4gaHRtbDtcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDU1Igb3IgU3RhdGljIEZpbGUgRmFsbGJhY2sgKFNTUiDrnbzsmrDtirjsl5Ag66ek7Lmt65CY7KeAIOyViuuKlCDrqqjrk6Ag7JqU7LKtKVxuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFtcIkdFVFwiLCBcIkhFQURcIl0sXG4gICAgICB1cmw6IFwiKlwiLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIC8vIC9hcGksIC9zb25hbXUtdWnripQgNDA0IOq3uOuMgOuhnFxuICAgICAgICBpZiAocmVxdWVzdC51cmwuc3RhcnRzV2l0aChcIi9hcGlcIikgfHwgcmVxdWVzdC51cmwuc3RhcnRzV2l0aChcIi9zb25hbXUtdWlcIikpIHtcbiAgICAgICAgICByZXBseS5zdGF0dXMoNDA0KS5zZW5kKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ1NS7JqpIENhY2hlLUNvbnRyb2wg7Zek642UIOyEpOyglVxuICAgICAgICBpZiAoY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIpIHtcbiAgICAgICAgICBjb25zdCBjc3JDYWNoZVJlcTogQ2FjaGVDb250cm9sUmVxdWVzdCA9IHtcbiAgICAgICAgICAgIHR5cGU6IFwiY3NyXCIsXG4gICAgICAgICAgICB1cmw6IHJlcXVlc3QudXJsLFxuICAgICAgICAgICAgcGF0aDogcmVxdWVzdC51cmwuc3BsaXQoXCI/XCIpWzBdLFxuICAgICAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IGNzckNhY2hlQ29uZmlnID0gY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIoY3NyQ2FjaGVSZXEpO1xuXG4gICAgICAgICAgaWYgKGNzckNhY2hlQ29uZmlnKSB7XG4gICAgICAgICAgICBhcHBseUNhY2hlSGVhZGVycyhyZXBseSwgY3NyQ2FjaGVDb25maWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOygleyggSDtjIzsnbzsnbQg7KG07J6s7ZWgIOqyveyasCwg7KCV7KCBIO2MjOydvOydhCDrqLzsoIAg7ISc67mZ7ZW07JW87ZWoXG4gICAgICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gdGhpcy5nZXRQYXRobmFtZUZyb21VcmwocmVxdWVzdC51cmwpO1xuICAgICAgICBjb25zdCBzYWZlRmlsZVBhdGggPSB0aGlzLnJlc29sdmVQYXRoV2l0aGluQmFzZURpcih3ZWJEaXN0UGF0aCwgcmVxdWVzdFBhdGgpO1xuICAgICAgICBpZiAoc2FmZUZpbGVQYXRoID09PSBudWxsKSB7XG4gICAgICAgICAgcmVwbHkuc3RhdHVzKDQwMykuc2VuZCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXdhaXQgZmlsZUV4aXN0cyhzYWZlRmlsZVBhdGgpKSB7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHNhZmVGaWxlUGF0aCk7XG4gICAgICAgICAgcmV0dXJuIHJlcGx5LnR5cGUobWltZUxvb2t1cChzYWZlRmlsZVBhdGgpIHx8IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCIpLnNlbmQoY29udGVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDU1IgZmFsbGJhY2s6IGluZGV4Lmh0bWwg7ISc67mZXG4gICAgICAgIGNvbnN0IGluZGV4UGF0aCA9IHBhdGguam9pbih3ZWJEaXN0UGF0aCwgXCJpbmRleC5odG1sXCIpO1xuICAgICAgICByZXR1cm4gcmVwbHkudHlwZShcInRleHQvaHRtbFwiKS5zZW5kKGF3YWl0IGZzLnJlYWRGaWxlKGluZGV4UGF0aCwgXCJ1dGYtOFwiKSk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc29sZS5sb2coYOKckyBTdGF0aWMgd2ViIHNlcnZlciBjb25maWd1cmVkIHdpdGggJHtzc3JBdmFpbGFibGUgPyBcIlNTUlwiIDogXCJDU1Igb25seVwifSBzdXBwb3J0YCk7XG4gIH1cblxuICBjcmVhdGVBcGlIYW5kbGVyKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICApOiAocmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpID0+IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiBhc3luYyAocmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpOiBQcm9taXNlPHVua25vd24+ID0+IHtcbiAgICAgIC8vIENvbnRleHQg7IOd7ISxXG4gICAgICBjb25zdCBjb250ZXh0OiBDb250ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVDb250ZXh0KGNvbmZpZywgcmVxdWVzdCwgcmVwbHkpO1xuXG4gICAgICByZXR1cm4gdGhpcy5hc3luY0xvY2FsU3RvcmFnZS5ydW4oeyBjb250ZXh0IH0sIGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gZ3VhcmRzIOyymOumrFxuICAgICAgICBydW5HdWFyZHMoe1xuICAgICAgICAgIGd1YXJkczogYXBpLm9wdGlvbnMuZ3VhcmRzLFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIGFwaSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8g7YyM652866+47YSwIOygleuztOuhnCB6b2Qg7Iqk7YKk66eIIOu5jOuTnFxuICAgICAgICBjb25zdCB7IGdldFpvZE9iamVjdEZyb21BcGkgfSA9IGF3YWl0IGltcG9ydChcIi4vY29kZS1jb252ZXJ0ZXJzXCIpO1xuICAgICAgICBjb25zdCBSZXFUeXBlID0gZ2V0Wm9kT2JqZWN0RnJvbUFwaShhcGksIHRoaXMuc3luY2VyLnR5cGVzKTtcblxuICAgICAgICAvLyByZXF1ZXN0IO2MjOyLsVxuICAgICAgICBjb25zdCB3aGljaCA9IGFwaS5vcHRpb25zLmh0dHBNZXRob2QgPT09IFwiR0VUXCIgPyBcInF1ZXJ5XCIgOiBcImJvZHlcIjtcbiAgICAgICAgbGV0IHJlcUJvZHk6IHtcbiAgICAgICAgICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xuICAgICAgICB9O1xuICAgICAgICAvLyDtjIzsnbwg7JeF66Gc65OcIOyeiOuKlCDqsr3smrAg7J6E7IucIOuNsOydtO2EsFxuICAgICAgICBjb25zdCBmaWxlczoge1xuICAgICAgICAgIGJ1ZmZlcmVkRmlsZXM6IEJ1ZmZlcmVkRmlsZVtdO1xuICAgICAgICAgIHVwbG9hZGVkRmlsZXM6IFVwbG9hZGVkRmlsZVtdO1xuICAgICAgICB9ID0ge1xuICAgICAgICAgIGJ1ZmZlcmVkRmlsZXM6IFtdLFxuICAgICAgICAgIHVwbG9hZGVkRmlsZXM6IFtdLFxuICAgICAgICB9O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYm9keSA9IChyZXF1ZXN0W3doaWNoXSA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgICAgaWYgKGFwaS51cGxvYWRPcHRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IHJlcXVlc3QucGFydHMoe1xuICAgICAgICAgICAgICBsaW1pdHM6IGFwaS51cGxvYWRPcHRpb25zLmxpbWl0cyxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBGb3JtRGF0YeydmCBmaWVsZOuTpOydhCDsnoTsi5zroZwg7KCA7J6lXG4gICAgICAgICAgICBjb25zdCBmaWVsZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgICAgICAgICAgaWYgKGFwaS51cGxvYWRPcHRpb25zLmNvbnN1bWUgPT09IFwiYnVmZmVyXCIgfHwgIWFwaS51cGxvYWRPcHRpb25zLmNvbnN1bWUpIHtcbiAgICAgICAgICAgICAgLy8gQnVmZmVyIOuqqOuTnDog66mU66qo66as7JeQIOuhnOuTnFxuICAgICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFydC50eXBlID09PSBcImZpbGVcIikge1xuICAgICAgICAgICAgICAgICAgLy8gQ1JJVElDQUw6IO2MjOydvCDsiqTtirjrprzsnYQg7KaJ7IucIGNvbnN1bWXtlbTslbwg64uk7J2MIHBhcnTroZwg64SY7Ja06rCIIOyImCDsnojsnYxcbiAgICAgICAgICAgICAgICAgIC8vIOydtCDtmLjstpzsnbQg7JeG7Jy866m0IOyiheyihSBtdWx0aXBhcnQg7YyM7Iux7J20IHBlbmRpbmcg7IOB7YOc66GcIO2DgOyehOyVhOybgyDrsJzsg51cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IHBhcnQudG9CdWZmZXIoKTtcbiAgICAgICAgICAgICAgICAgIGZpbGVzLmJ1ZmZlcmVkRmlsZXMucHVzaChuZXcgQnVmZmVyZWRGaWxlKHBhcnQsIGJ1ZmZlcikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC50eXBlID09PSBcImZpZWxkXCIpIHtcbiAgICAgICAgICAgICAgICAgIGZpZWxkc1twYXJ0LmZpZWxkbmFtZV0gPSBTdHJpbmcocGFydC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFwaS51cGxvYWRPcHRpb25zLmNvbnN1bWUgPT09IFwic3RyZWFtXCIpIHtcbiAgICAgICAgICAgICAgLy8gU3RyZWFtIOuqqOuTnDog7KaJ7IucIOyggOyepeyGjOuhnCDsiqTtirjrpqzrsI1cbiAgICAgICAgICAgICAgY29uc3QgZGlza05hbWUgPSBhcGkudXBsb2FkT3B0aW9ucy5kZXN0aW5hdGlvbjtcbiAgICAgICAgICAgICAgY29uc3QgZGlzayA9IHRoaXMuc3RvcmFnZS51c2UoZGlza05hbWUpO1xuXG4gICAgICAgICAgICAgIC8vIOyasOyEoOyInOychDog642w7L2U66CI7J207YSwID4g7KCE7JetIOyEpOyglSA+IOq4sOuzuOqwklxuICAgICAgICAgICAgICBjb25zdCBrZXlHZW5lcmF0b3I6IEtleUdlbmVyYXRvciA9XG4gICAgICAgICAgICAgICAgYXBpLnVwbG9hZE9wdGlvbnMua2V5R2VuZXJhdG9yID8/XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc2VydmVyLnN0b3JhZ2U/LmtleUdlbmVyYXRvciA/P1xuICAgICAgICAgICAgICAgIGRlZmF1bHRLZXlHZW5lcmF0b3I7XG5cbiAgICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gXCJmaWxlXCIpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IGtleUdlbmVyYXRvcih7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBwYXJ0LmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgICBtaW1ldHlwZTogcGFydC5taW1ldHlwZSxcbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICBhd2FpdCBkaXNrLnB1dFN0cmVhbShrZXksIHBhcnQuZmlsZSwge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogcGFydC5taW1ldHlwZSxcbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSBhd2FpdCBkaXNrLmdldFVybChrZXkpO1xuICAgICAgICAgICAgICAgICAgY29uc3Qgc2lnbmVkVXJsID0gYXdhaXQgZGlzay5nZXRTaWduZWRVcmwoa2V5KTtcblxuICAgICAgICAgICAgICAgICAgZmlsZXMudXBsb2FkZWRGaWxlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBuZXcgVXBsb2FkZWRGaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogcGFydC5maWxlbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBtaW1ldHlwZTogcGFydC5taW1ldHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICBzaXplOiBwYXJ0LmZpbGUuYnl0ZXNSZWFkLFxuICAgICAgICAgICAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgICAgICAgICAgICBzaWduZWRVcmwsXG4gICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgIGRpc2tOYW1lLFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0LnR5cGUgPT09IFwiZmllbGRcIikge1xuICAgICAgICAgICAgICAgICAgZmllbGRzW3BhcnQuZmllbGRuYW1lXSA9IFN0cmluZyhwYXJ0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gcXProZwg7KSR7LKpIOq1rOyhsCDtjIzsi7E6IHBhcmFtc1tjYXRlZ29yeV0g4oaSIHsgcGFyYW1zOiB7IGNhdGVnb3J5OiBcInRlc3RcIiB9IH1cbiAgICAgICAgICAgIGNvbnN0IHFzID0gYXdhaXQgaW1wb3J0KFwicXNcIik7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBxcy5kZWZhdWx0LnBhcnNlKGZpZWxkcyk7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGJvZHksIHBhcnNlZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgeyBmYXN0aWZ5Q2FzdGVyIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2Nhc3RlclwiKTtcbiAgICAgICAgICByZXFCb2R5ID0gZmFzdGlmeUNhc3RlcihSZXFUeXBlKS5wYXJzZShib2R5KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnN0IHsgWm9kRXJyb3IgfSA9IGF3YWl0IGltcG9ydChcInpvZFwiKTtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFpvZEVycm9yKSB7XG4gICAgICAgICAgICBjb25zdCB7IGh1bWFuaXplWm9kRXJyb3IgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL3pvZC1lcnJvclwiKTtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gaHVtYW5pemVab2RFcnJvcihlKVxuICAgICAgICAgICAgICAubWFwKChpc3N1ZSkgPT4gaXNzdWUubWVzc2FnZSlcbiAgICAgICAgICAgICAgLmpvaW4oXCIgXCIpO1xuICAgICAgICAgICAgY29uc3QgeyBCYWRSZXF1ZXN0RXhjZXB0aW9uIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9leGNlcHRpb25zL3NvLWV4Y2VwdGlvbnNcIik7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihtZXNzYWdlcyBhcyBMb2NhbGl6ZWRTdHJpbmcsIHtcbiAgICAgICAgICAgICAgem9kRXJyb3I6IGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb250ZW50LVR5cGVcbiAgICAgICAgcmVwbHkudHlwZShhcGkub3B0aW9ucy5jb250ZW50VHlwZSA/PyBcImFwcGxpY2F0aW9uL2pzb25cIik7XG5cbiAgICAgICAgLy8gQ2FjaGUtQ29udHJvbCDtl6TrjZQg7ISk7KCVXG4gICAgICAgIGNvbnN0IGFwaUNhY2hlQ29uZmlnID0gdGhpcy5nZXRBcGlDYWNoZUNvbnRyb2woYXBpLCByZXF1ZXN0LCBjb25maWcpO1xuICAgICAgICBpZiAoYXBpQ2FjaGVDb25maWcpIHtcbiAgICAgICAgICBhcHBseUNhY2hlSGVhZGVycyhyZXBseSwgYXBpQ2FjaGVDb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g7JeF66Gc65OcIOyYteyFmOydtCDsnojripQg6rK97JqwIO2MjOydvCDrjbDsnbTthLDrpbwgQ29udGV4dOyXkCDstpTqsIBcbiAgICAgICAgaWYgKGFwaS51cGxvYWRPcHRpb25zKSB7XG4gICAgICAgICAgY29uc3QgY29uc3VtZSA9IGFwaS51cGxvYWRPcHRpb25zLmNvbnN1bWUgPz8gXCJidWZmZXJcIjtcbiAgICAgICAgICBpZiAoY29uc3VtZSA9PT0gXCJidWZmZXJcIikge1xuICAgICAgICAgICAgY29udGV4dC5idWZmZXJlZEZpbGVzID0gZmlsZXMuYnVmZmVyZWRGaWxlcztcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbnN1bWUgPT09IFwic3RyZWFtXCIpIHtcbiAgICAgICAgICAgIGNvbnRleHQudXBsb2FkZWRGaWxlcyA9IGZpbGVzLnVwbG9hZGVkRmlsZXM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8g66qo6424IOuplOyGjOuTnCBhcmdzIOyDneyEse2VmOyXrCDtmLjstpxcbiAgICAgICAgY29uc3QgeyBBcGlQYXJhbVR5cGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL3R5cGVzL3R5cGVzXCIpO1xuICAgICAgICBjb25zdCBhcmdzID0gYXBpLnBhcmFtZXRlcnMubWFwKChwYXJhbSkgPT4ge1xuICAgICAgICAgIC8vIENvbnRleHQg7J247KCd7IWYXG4gICAgICAgICAgaWYgKEFwaVBhcmFtVHlwZS5pc0NvbnRleHQocGFyYW0udHlwZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmVxQm9keVtwYXJhbS5uYW1lXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmludm9rZU1vZGVsTWV0aG9kKGFwaSwgYXJncywgcmVwbHkpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIFdTIHBhdGjrpbwg7J2867CYIEhUVFAgR0VU7Jy866GcIO2YuOy2nO2VnCDqsr3smrAgNDI2ICsgVXBncmFkZSDtl6TrjZTroZwg66qF7Iuc7KCB7Jy866GcIHdlYnNvY2tldCDsoJHsho3snYQg7Jyg64+E7ZWoXG4gIHByaXZhdGUgY3JlYXRlV2ViU29ja2V0VXBncmFkZVJlcXVpcmVkSGFuZGxlcigpIHtcbiAgICByZXR1cm4gYXN5bmMgKF9yZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCwgcmVwbHk6IEZhc3RpZnlSZXBseSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgcmVwbHkuaGVhZGVyKFwiY29ubmVjdGlvblwiLCBcIlVwZ3JhZGVcIikuaGVhZGVyKFwidXBncmFkZVwiLCBcIndlYnNvY2tldFwiKS5zdGF0dXMoNDI2KS5zZW5kKHtcbiAgICAgICAgbWVzc2FnZTogXCJXZWJTb2NrZXQgdXBncmFkZSByZXF1aXJlZFwiLFxuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIGRldiDrqqjrk5zsnZggY2F0Y2gtYWxsIHdzSGFuZGxlcuyXkOyEnCDsi6TsoJwgV1MgQVBJ66GcIOuUlOyKpO2MqOy5mO2VqC4g66ek7Lmt65CY64qUIHJvdXRl6rCAIOyXhuycvOuptCAxMDA466GcIOuLq+ydjFxuICBwcml2YXRlIGFzeW5jIGhhbmRsZURldldlYlNvY2tldFJlcXVlc3QoXG4gICAgc29ja2V0OiBXZWJTb2NrZXQsXG4gICAgcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtYXRjaGVkQXBpID0gdGhpcy5maW5kTWF0Y2hlZEFwaShyZXF1ZXN0KTtcbiAgICBpZiAoIW1hdGNoZWRBcGk/LndlYnNvY2tldE9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHRyYWNlQ29udGV4dCA9IHRoaXMud2Vic29ja2V0UnVudGltZS50ZWxlbWV0cnlDb250cm9sbGVyLmNyZWF0ZUNvbm5lY3Rpb25Db250ZXh0KHtcbiAgICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgfSk7XG4gICAgICB0aGlzLndlYnNvY2tldFJ1bnRpbWUudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgbmFtZTogXCJ3cy5jb25uZWN0aW9uLnJlamVjdGVkXCIsXG4gICAgICAgIGxldmVsOiBcIndhcm5cIixcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgcmVhc29uOiBcInJvdXRlTm90Rm91bmRcIixcbiAgICAgICAgICBwYXRoOiByZXF1ZXN0LnVybCxcbiAgICAgICAgfSxcbiAgICAgICAgdHJhY2VJZDogdHJhY2VDb250ZXh0LnRyYWNlSWQsXG4gICAgICAgIHNwYW5JZDogdHJhY2VDb250ZXh0LnNwYW5JZCxcbiAgICAgICAgcGFyZW50U3BhbklkOiB0cmFjZUNvbnRleHQucGFyZW50U3BhbklkLFxuICAgICAgICBzYW1wbGVkOiB0cmFjZUNvbnRleHQuc2FtcGxlZCxcbiAgICAgIH0pO1xuICAgICAgc29ja2V0LmNsb3NlKDEwMDgsIFwiV2ViU29ja2V0IHJvdXRlIG5vdCBmb3VuZFwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5jcmVhdGVXZWJTb2NrZXRIYW5kbGVyKG1hdGNoZWRBcGksIGNvbmZpZyk7XG4gICAgYXdhaXQgaGFuZGxlcih7IHNvY2tldCB9LCByZXF1ZXN0KTtcbiAgfVxuXG4gIC8vIFdTIHJvdXRlIO2VuOuTpOufrOydmCDsi6Ttlokg7Iic7ISc66W8IOqzoOygle2VqDpcbiAgLy8gMSkgZ3VhcmTrpbwgY29ubmVjdGlvbiDrk7HroZ0g7J207KCE7JeQIOuPjOugpCDsnbjspp0g7Iuk7YyoIOyLnCDrtoDrtoQg65Ox66GdIOyDge2DnOulvCDrgqjquLDsp4Ag7JWK7J2MXG4gIC8vIDIpIHF1ZXJ5IHBhcmFtIO2MjOyLseuPhCBhY3RpdmF0aW9uIOyghOyXkCDrgZ3rgrQgaGFuZHNoYWtlIOyLpO2MqOqwgCByZWdpc3RyeeyXkCDrhbjstpzrkJjsp4Ag7JWK6rKMIO2VqFxuICAvLyAzKSBgYWN0aXZlOiBmYWxzZWDroZwg66i87KCAIOuTseuhne2VmOqzoCwgY29udGV4dCDspIDruYTqsIAg64Gd64KcIOuSpCBgYWN0aXZhdGUoKWDtlbQg67iM66Gc65Oc7LqQ7Iqk7Yq46rCAIOy0iOq4sO2ZlCDspJHqsIQg7IOB7YOc66W8IOuztOyngCDrqrvtlZjqsowg7ZWoXG4gIC8vIOyXkOufrCDrsJzsg50g7Iuc7JeQ64qUIHJlc29sdmVXZWJTb2NrZXRDbG9zZURlc2NyaXB0b3Ig7KCV7LGF7JeQIOuUsOudvCBjbG9zZSBjb2Rl66W8IOunpO2Vke2VqFxuICBwcml2YXRlIGNyZWF0ZVdlYlNvY2tldEhhbmRsZXIoYXBpOiBFeHRlbmRlZEFwaSwgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnKSB7XG4gICAgcmV0dXJuIGFzeW5jIChcbiAgICAgIGNvbm5lY3Rpb246IHtcbiAgICAgICAgc29ja2V0OiBXZWJTb2NrZXQ7XG4gICAgICB9LFxuICAgICAgcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gICAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBjb25zdCBzb2NrZXQgPSBjb25uZWN0aW9uLnNvY2tldDtcbiAgICAgIGxldCB3c0NvbnRleHQ6IFdlYlNvY2tldENvbnRleHQgfCBudWxsID0gbnVsbDtcbiAgICAgIGxldCByYXdXczogUmV0dXJuVHlwZTxXZWJTb2NrZXRSdW50aW1lW1wicmVnaXN0ZXJDb25uZWN0aW9uXCJdPiB8IG51bGwgPSBudWxsO1xuICAgICAgbGV0IHByZVJlZ2lzdGVyUGhhc2U6IFwiZ3VhcmRcIiB8IFwicXVlcnlcIiB8IFwicmVnaXN0ZXJcIiB8IFwiaGFuZGxlclwiID0gXCJndWFyZFwiO1xuICAgICAgbGV0IHRyYWNlQ29udGV4dDogV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvbkNvbnRleHQgPSB7fTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgdHJhY2VDb250ZXh0ID0gdGhpcy53ZWJzb2NrZXRSdW50aW1lLnRlbGVtZXRyeUNvbnRyb2xsZXIuY3JlYXRlQ29ubmVjdGlvbkNvbnRleHQoe1xuICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJ1bkd1YXJkcyh7XG4gICAgICAgICAgZ3VhcmRzOiBhcGkub3B0aW9ucy5ndWFyZHMsXG4gICAgICAgICAgY29uZmlnLFxuICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgYXBpLFxuICAgICAgICB9KTtcblxuICAgICAgICBwcmVSZWdpc3RlclBoYXNlID0gXCJxdWVyeVwiO1xuICAgICAgICBjb25zdCByZXFCb2R5ID0gYXdhaXQgdGhpcy5wYXJzZVdlYlNvY2tldFJlcXVlc3RQYXJhbXMoYXBpLCByZXF1ZXN0KTtcbiAgICAgICAgcHJlUmVnaXN0ZXJQaGFzZSA9IFwicmVnaXN0ZXJcIjtcbiAgICAgICAgcmF3V3MgPSB0aGlzLndlYnNvY2tldFJ1bnRpbWUucmVnaXN0ZXJDb25uZWN0aW9uKHNvY2tldCwge1xuICAgICAgICAgIG91dEV2ZW50czogYXBpLndlYnNvY2tldE9wdGlvbnMhLm91dEV2ZW50cyxcbiAgICAgICAgICBpbkV2ZW50czogYXBpLndlYnNvY2tldE9wdGlvbnMhLmluRXZlbnRzLFxuICAgICAgICAgIG5hbWVzcGFjZTogYXBpLndlYnNvY2tldE9wdGlvbnMhLm5hbWVzcGFjZSxcbiAgICAgICAgICBoZWFydGJlYXQ6IGFwaS53ZWJzb2NrZXRPcHRpb25zIS5oZWFydGJlYXQsXG4gICAgICAgICAgYWN0aXZlOiBmYWxzZSxcbiAgICAgICAgICB0cmFjZUlkOiB0cmFjZUNvbnRleHQudHJhY2VJZCxcbiAgICAgICAgICBzcGFuSWQ6IHRyYWNlQ29udGV4dC5zcGFuSWQsXG4gICAgICAgICAgcGFyZW50U3BhbklkOiB0cmFjZUNvbnRleHQucGFyZW50U3BhbklkLFxuICAgICAgICAgIHNhbXBsZWQ6IHRyYWNlQ29udGV4dC5zYW1wbGVkLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBzY29wZWRXcyA9IHRoaXMuY3JlYXRlU2NvcGVkV2ViU29ja2V0Q29ubmVjdGlvbihyYXdXcywgKCkgPT4gd3NDb250ZXh0KTtcbiAgICAgICAgd3NDb250ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVXZWJTb2NrZXRDb250ZXh0KGNvbmZpZywgcmVxdWVzdCwgc2NvcGVkV3MpO1xuICAgICAgICB0aGlzLndlYnNvY2tldFJ1bnRpbWUuYWN0aXZhdGVDb25uZWN0aW9uKHJhd1dzLmlkKTtcbiAgICAgICAgcHJlUmVnaXN0ZXJQaGFzZSA9IFwiaGFuZGxlclwiO1xuXG4gICAgICAgIGNvbnN0IHsgQXBpUGFyYW1UeXBlIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi90eXBlcy90eXBlc1wiKTtcbiAgICAgICAgY29uc3QgYXJncyA9IGFwaS5wYXJhbWV0ZXJzLm1hcCgocGFyYW0pID0+IHtcbiAgICAgICAgICBpZiAoQXBpUGFyYW1UeXBlLmlzQ29udGV4dChwYXJhbS50eXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHdzQ29udGV4dDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gcmVxQm9keVtwYXJhbS5uYW1lXTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5hc3luY0xvY2FsU3RvcmFnZS5ydW4oeyBjb250ZXh0OiB3c0NvbnRleHQgfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IHRoaXMuaW52b2tlTW9kZWxNZXRob2QoYXBpLCBhcmdzKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBjbG9zZURlc2NyaXB0b3IgPSByZXNvbHZlV2ViU29ja2V0Q2xvc2VEZXNjcmlwdG9yKGVycm9yKTtcbiAgICAgICAgaWYgKCFyYXdXcykge1xuICAgICAgICAgIHRoaXMud2Vic29ja2V0UnVudGltZS50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICAgICAgbmFtZTogXCJ3cy5jb25uZWN0aW9uLnJlamVjdGVkXCIsXG4gICAgICAgICAgICBsZXZlbDogY2xvc2VEZXNjcmlwdG9yLmxvZ0xldmVsID09PSBcIndhcm5cIiA/IFwid2FyblwiIDogXCJlcnJvclwiLFxuICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgIHJlYXNvbjogcHJlUmVnaXN0ZXJQaGFzZSxcbiAgICAgICAgICAgICAgY29kZTogY2xvc2VEZXNjcmlwdG9yLmNvZGUsXG4gICAgICAgICAgICAgIHBhdGg6IGFwaS5wYXRoLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRyYWNlSWQ6IHRyYWNlQ29udGV4dC50cmFjZUlkLFxuICAgICAgICAgICAgc3BhbklkOiB0cmFjZUNvbnRleHQuc3BhbklkLFxuICAgICAgICAgICAgcGFyZW50U3BhbklkOiB0cmFjZUNvbnRleHQucGFyZW50U3BhbklkLFxuICAgICAgICAgICAgc2FtcGxlZDogdHJhY2VDb250ZXh0LnNhbXBsZWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmF3V3MpIHtcbiAgICAgICAgICByYXdXcy5jbG9zZShjbG9zZURlc2NyaXB0b3IuY29kZSwgY2xvc2VEZXNjcmlwdG9yLnJlYXNvbik7XG4gICAgICAgIH0gZWxzZSBpZiAoc29ja2V0LnJlYWR5U3RhdGUgPCAyKSB7XG4gICAgICAgICAgc29ja2V0LmNsb3NlKGNsb3NlRGVzY3JpcHRvci5jb2RlLCBjbG9zZURlc2NyaXB0b3IucmVhc29uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNlcnZlcj8ubG9nKSB7XG4gICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgIGVycjogZXJyb3IsXG4gICAgICAgICAgICBtb2RlbE5hbWU6IGFwaS5tb2RlbE5hbWUsXG4gICAgICAgICAgICBtZXRob2ROYW1lOiBhcGkubWV0aG9kTmFtZSxcbiAgICAgICAgICAgIHBhdGg6IGFwaS5wYXRoLFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGNsb3NlRGVzY3JpcHRvci5sb2dMZXZlbCA9PT0gXCJ3YXJuXCIpIHtcbiAgICAgICAgICAgIHRoaXMuc2VydmVyLmxvZy53YXJuKHBheWxvYWQsIGNsb3NlRGVzY3JpcHRvci5yZWFzb24pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlcnZlci5sb2cuZXJyb3IocGF5bG9hZCwgY2xvc2VEZXNjcmlwdG9yLnJlYXNvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChjbG9zZURlc2NyaXB0b3IubG9nTGV2ZWwgPT09IFwid2FyblwiKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oY2xvc2VEZXNjcmlwdG9yLnJlYXNvbiwgZXJyb3IpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGNsb3NlRGVzY3JpcHRvci5yZWFzb24sIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gb25NZXNzYWdlL29uQ2xvc2Xsspjrn7wg64uk66W4IHRpY2vsl5DshJwg7Iuk7ZaJ65CY64qUIGNhbGxiYWNr7J2AIEFMUyBjb250ZXh06rCAIOuBiuq4sOuvgOuhnCB3cmFwcGVy7JeQ7IScIGBhc3luY0xvY2FsU3RvcmFnZS5ydW5g7Jy866GcIOuLpOyLnCDqsJDsi7gg67O17JuQ7ZWoXG4gIC8vIHB1Ymxpc2gvam9pbi9sZWF2ZS9zZXRVc2VySWQg6rCZ7J2AIOymieyLnCDsi6TtlokgQVBJ64qUIOuLqOyInCDsnITsnoTrp4wg7ZWY6rOgLCBkZWZlcnJlZCBjYWxsYmFja+yXkOunjCBjb250ZXh0IOuzteybkOydhCDsoIHsmqntlahcbiAgcHJpdmF0ZSBjcmVhdGVTY29wZWRXZWJTb2NrZXRDb25uZWN0aW9uPFxuICAgIFRPdXQgZXh0ZW5kcyBXZWJTb2NrZXRFdmVudE1hcCxcbiAgICBUSW4gZXh0ZW5kcyBXZWJTb2NrZXRFdmVudE1hcCxcbiAgPihcbiAgICB3czogV2ViU29ja2V0Q29ubmVjdGlvbjxUT3V0LCBUSW4+LFxuICAgIGdldENvbnRleHQ6ICgpID0+IFdlYlNvY2tldENvbnRleHQgfCBudWxsLFxuICApOiBXZWJTb2NrZXRDb25uZWN0aW9uPFRPdXQsIFRJbj4ge1xuICAgIGNvbnN0IHRlbGVtZXRyeUNvbnRyb2xsZXIgPSB0aGlzLl93ZWJzb2NrZXRSdW50aW1lPy50ZWxlbWV0cnlDb250cm9sbGVyO1xuICAgIGNvbnN0IHJ1bkluQ29udGV4dCA9IDxUPihjYWxsYmFjazogKCkgPT4gVCk6IFQgPT4ge1xuICAgICAgY29uc3QgY29udGV4dCA9IGdldENvbnRleHQoKTtcbiAgICAgIGlmICghY29udGV4dCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UucnVuKHsgY29udGV4dCB9LCBjYWxsYmFjayk7XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB3cy5pZDtcbiAgICAgIH0sXG4gICAgICBnZXQgbmFtZXNwYWNlKCkge1xuICAgICAgICByZXR1cm4gd3MubmFtZXNwYWNlO1xuICAgICAgfSxcbiAgICAgIGdldCBjbG9zZWQoKSB7XG4gICAgICAgIHJldHVybiB3cy5jbG9zZWQ7XG4gICAgICB9LFxuICAgICAgZ2V0IHVzZXJJZCgpIHtcbiAgICAgICAgcmV0dXJuIHdzLnVzZXJJZDtcbiAgICAgIH0sXG4gICAgICB0cmFuc3BvcnQ6IFwid3NcIixcbiAgICAgIHB1Ymxpc2hVbnR5cGVkKGV2ZW50LCBkYXRhKSB7XG4gICAgICAgIHdzLnB1Ymxpc2hVbnR5cGVkKGV2ZW50LCBkYXRhKTtcbiAgICAgIH0sXG4gICAgICBjbG9zZShjb2RlLCByZWFzb24pIHtcbiAgICAgICAgd3MuY2xvc2UoY29kZSwgcmVhc29uKTtcbiAgICAgIH0sXG4gICAgICBvbkNsb3NlKGNhbGxiYWNrKSB7XG4gICAgICAgIHdzLm9uQ2xvc2UoKCkgPT4gcnVuSW5Db250ZXh0KGNhbGxiYWNrKSk7XG4gICAgICB9LFxuICAgICAgb25NZXNzYWdlKGV2ZW50LCBoYW5kbGVyKSB7XG4gICAgICAgIHdzLm9uTWVzc2FnZShldmVudCwgKGRhdGEsIG1lc3NhZ2VUcmFjZUNvbnRleHQpID0+XG4gICAgICAgICAgcnVuSW5Db250ZXh0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IFN0cmluZyhldmVudCk7XG4gICAgICAgICAgICBjb25zdCB0cmFjZUNvbnRleHQgPSBtZXNzYWdlVHJhY2VDb250ZXh0ID8/IGdldFdlYlNvY2tldFRlbGVtZXRyeUNvbnRleHQod3MpO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRlZEF0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cbiAgICAgICAgICAgIHRlbGVtZXRyeUNvbnRyb2xsZXI/LmVtaXQoe1xuICAgICAgICAgICAgICBuYW1lOiBcIndzLmhhbmRsZXIuc3RhcnRlZFwiLFxuICAgICAgICAgICAgICBsZXZlbDogXCJkZWJ1Z1wiLFxuICAgICAgICAgICAgICBjb25uZWN0aW9uSWQ6IHdzLmlkLFxuICAgICAgICAgICAgICBuYW1lc3BhY2U6IHdzLm5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgdXNlcklkOiB3cy51c2VySWQsXG4gICAgICAgICAgICAgIGRldGFpbDogeyBldmVudDogZXZlbnROYW1lIH0sXG4gICAgICAgICAgICAgIC4uLnRyYWNlQ29udGV4dCxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyKGRhdGEsIG1lc3NhZ2VUcmFjZUNvbnRleHQpO1xuICAgICAgICAgICAgICBjb25zdCBkdXJhdGlvbk1zID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydGVkQXQ7XG4gICAgICAgICAgICAgIHRlbGVtZXRyeUNvbnRyb2xsZXI/LmVtaXQoe1xuICAgICAgICAgICAgICAgIG5hbWU6IFwid3MuaGFuZGxlci5jb21wbGV0ZWRcIixcbiAgICAgICAgICAgICAgICBsZXZlbDogXCJkZWJ1Z1wiLFxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25JZDogd3MuaWQsXG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlOiB3cy5uYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgdXNlcklkOiB3cy51c2VySWQsXG4gICAgICAgICAgICAgICAgZGV0YWlsOiB7IGV2ZW50OiBldmVudE5hbWUgfSxcbiAgICAgICAgICAgICAgICAuLi50cmFjZUNvbnRleHQsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0ZWxlbWV0cnlDb250cm9sbGVyPy5yZWNvcmRTcGFuKHtcbiAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lOiBcIndzLm1lc3NhZ2UucHJvY2Vzc1wiLFxuICAgICAgICAgICAgICAgIGtpbmQ6IFwiaW50ZXJuYWxcIixcbiAgICAgICAgICAgICAgICBkdXJhdGlvbk1zLFxuICAgICAgICAgICAgICAgIHN0YXR1czogXCJ1bnNldFwiLFxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25JZDogd3MuaWQsXG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlOiB3cy5uYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgdXNlcklkOiB3cy51c2VySWQsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogeyBldmVudDogZXZlbnROYW1lIH0sXG4gICAgICAgICAgICAgICAgLi4udHJhY2VDb250ZXh0LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0ZWRBdDtcbiAgICAgICAgICAgICAgdGVsZW1ldHJ5Q29udHJvbGxlcj8uZW1pdCh7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJ3cy5oYW5kbGVyLmZhaWxlZFwiLFxuICAgICAgICAgICAgICAgIGxldmVsOiBcImVycm9yXCIsXG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbklkOiB3cy5pZCxcbiAgICAgICAgICAgICAgICBuYW1lc3BhY2U6IHdzLm5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgICB1c2VySWQ6IHdzLnVzZXJJZCxcbiAgICAgICAgICAgICAgICBkZXRhaWw6IHsgZXZlbnQ6IGV2ZW50TmFtZSB9LFxuICAgICAgICAgICAgICAgIC4uLnRyYWNlQ29udGV4dCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRlbGVtZXRyeUNvbnRyb2xsZXI/LnJlY29yZFNwYW4oe1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWU6IFwid3MubWVzc2FnZS5wcm9jZXNzXCIsXG4gICAgICAgICAgICAgICAga2luZDogXCJpbnRlcm5hbFwiLFxuICAgICAgICAgICAgICAgIGR1cmF0aW9uTXMsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBcImVycm9yXCIsXG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbklkOiB3cy5pZCxcbiAgICAgICAgICAgICAgICBuYW1lc3BhY2U6IHdzLm5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgICB1c2VySWQ6IHdzLnVzZXJJZCxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7IGV2ZW50OiBldmVudE5hbWUgfSxcbiAgICAgICAgICAgICAgICBlcnJvclR5cGU6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5uYW1lIDogdHlwZW9mIGVycm9yLFxuICAgICAgICAgICAgICAgIC4uLnRyYWNlQ29udGV4dCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIHB1Ymxpc2goZXZlbnQsIGRhdGEpIHtcbiAgICAgICAgd3MucHVibGlzaChldmVudCwgZGF0YSk7XG4gICAgICB9LFxuICAgICAgd2FpdEZvckNsb3NlKCkge1xuICAgICAgICByZXR1cm4gd3Mud2FpdEZvckNsb3NlKCk7XG4gICAgICB9LFxuICAgICAgam9pbihyb29tSWQpIHtcbiAgICAgICAgd3Muam9pbihyb29tSWQpO1xuICAgICAgfSxcbiAgICAgIGxlYXZlKHJvb21JZCkge1xuICAgICAgICB3cy5sZWF2ZShyb29tSWQpO1xuICAgICAgfSxcbiAgICAgIHNldFVzZXJJZCh1c2VySWQpIHtcbiAgICAgICAgd3Muc2V0VXNlcklkKHVzZXJJZCk7XG4gICAgICB9LFxuICAgICAgY2xlYXJVc2VySWQoKSB7XG4gICAgICAgIHdzLmNsZWFyVXNlcklkKCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHBhcnNlV2ViU29ja2V0UmVxdWVzdFBhcmFtcyhcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gICAgY29uc3QgeyBnZXRab2RPYmplY3RGcm9tQXBpIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2NvZGUtY29udmVydGVyc1wiKTtcbiAgICBjb25zdCBSZXFUeXBlID0gZ2V0Wm9kT2JqZWN0RnJvbUFwaShhcGksIHRoaXMuc3luY2VyLnR5cGVzKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGZhc3RpZnlDYXN0ZXIgfSA9IGF3YWl0IGltcG9ydChcIi4vY2FzdGVyXCIpO1xuICAgICAgcmV0dXJuIGZhc3RpZnlDYXN0ZXIoUmVxVHlwZSkucGFyc2UoKHJlcXVlc3QucXVlcnkgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zdCB7IFpvZEVycm9yIH0gPSBhd2FpdCBpbXBvcnQoXCJ6b2RcIik7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIFpvZEVycm9yKSB7XG4gICAgICAgIGNvbnN0IHsgaHVtYW5pemVab2RFcnJvciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvem9kLWVycm9yXCIpO1xuICAgICAgICBjb25zdCBtZXNzYWdlcyA9IGh1bWFuaXplWm9kRXJyb3IoZSlcbiAgICAgICAgICAubWFwKChpc3N1ZSkgPT4gaXNzdWUubWVzc2FnZSlcbiAgICAgICAgICAuam9pbihcIiBcIik7XG4gICAgICAgIGNvbnN0IHsgQmFkUmVxdWVzdEV4Y2VwdGlvbiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCIpO1xuICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihtZXNzYWdlcyBhcyBMb2NhbGl6ZWRTdHJpbmcsIHtcbiAgICAgICAgICB6b2RFcnJvcjogZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVSTOyXkOyEnCBwYXRoIHBhcmFtc+ulvCDstpTstpztlanri4jri6QuXG4gICAqIOyYiDogcGF0dGVybj1cIi9hZG1pbi9jb21wYW5pZXMvOmNvbXBhbnlJZFwiLCB1cmw9XCIvYWRtaW4vY29tcGFuaWVzLzEyM1wiIOKGkiB7IGNvbXBhbnlJZDogXCIxMjNcIiB9XG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3RQYXRoUGFyYW1zKHBhdHRlcm46IHN0cmluZywgdXJsOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCBwYXR0ZXJuUGFydHMgPSBwYXR0ZXJuLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3QgdXJsUGFydHMgPSB0aGlzLmdldFBhdGhuYW1lRnJvbVVybCh1cmwpLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3QgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdHRlcm5QYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHBhdHRlcm5QYXJ0c1tpXS5zdGFydHNXaXRoKFwiOlwiKSkge1xuICAgICAgICBwYXJhbXNbcGF0dGVyblBhcnRzW2ldLnNsaWNlKDEpXSA9IHVybFBhcnRzW2ldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1BhdGhQYXR0ZXJuTWF0Y2gocGF0dGVybjogc3RyaW5nLCB1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhdHRlcm5QYXJ0cyA9IHBhdHRlcm4uc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCB1cmxQYXJ0cyA9IHRoaXMuZ2V0UGF0aG5hbWVGcm9tVXJsKHVybCkuc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcblxuICAgIGlmIChwYXR0ZXJuUGFydHMubGVuZ3RoICE9PSB1cmxQYXJ0cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdHRlcm5QYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcGF0dGVyblBhcnQgPSBwYXR0ZXJuUGFydHNbaV07XG4gICAgICBjb25zdCB1cmxQYXJ0ID0gdXJsUGFydHNbaV07XG4gICAgICBpZiAocGF0dGVyblBhcnQuc3RhcnRzV2l0aChcIjpcIikpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAocGF0dGVyblBhcnQgIT09IHVybFBhcnQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQYXRobmFtZUZyb21VcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB1cmwuc3BsaXQoXCI/XCIpWzBdO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlUGF0aFdpdGhpbkJhc2VEaXIoYmFzZURpcjogc3RyaW5nLCBpbnB1dFBhdGg6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlVVJJQ29tcG9uZW50KGlucHV0UGF0aCkucmVwbGFjZSgvXFxcXC9nLCBcIi9cIik7XG4gICAgICBpZiAoZGVjb2RlZC5pbmNsdWRlcyhcIlxcMFwiKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IGRlY29kZWQucmVwbGFjZSgvXlxcLysvLCBcIlwiKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IHBhdGgucmVzb2x2ZShiYXNlRGlyLCByZWxhdGl2ZVBhdGgpO1xuICAgICAgY29uc3QgcmVsYXRpdmVGcm9tQmFzZSA9IHBhdGgucmVsYXRpdmUoYmFzZURpciwgcmVzb2x2ZWRQYXRoKTtcbiAgICAgIGlmIChyZWxhdGl2ZUZyb21CYXNlLnN0YXJ0c1dpdGgoXCIuLlwiKSB8fCBwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVGcm9tQmFzZSkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzb2x2ZWRQYXRoO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFQSSDsnZHri7Xsl5Ag7KCB7Jqp7ZWgIENhY2hlLUNvbnRyb2wg7ISk7KCV7J2EIOqysOygle2VqeuLiOuLpC5cbiAgICog7Jqw7ISg7Iic7JyEOiDqsJzrs4Qg7KeA7KCVID4gY2FjaGVDb250cm9sSGFuZGxlclxuICAgKi9cbiAgcHJpdmF0ZSBnZXRBcGlDYWNoZUNvbnRyb2woXG4gICAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICkge1xuICAgIC8vIOuNsOy9lOugiOydtO2EsCDshKTsoJUg7Jqw7ISgXG4gICAgaWYgKGFwaS5vcHRpb25zLmNhY2hlQ29udHJvbCkge1xuICAgICAgcmV0dXJuIGFwaS5vcHRpb25zLmNhY2hlQ29udHJvbDtcbiAgICB9XG5cbiAgICAvLyDsoITsl60g7ZW465Ok65+sXG4gICAgaWYgKGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKSB7XG4gICAgICBjb25zdCBjYWNoZVJlcTogQ2FjaGVDb250cm9sUmVxdWVzdCA9IHtcbiAgICAgICAgdHlwZTogXCJhcGlcIixcbiAgICAgICAgdXJsOiByZXF1ZXN0LnVybCxcbiAgICAgICAgcGF0aDogcmVxdWVzdC5yb3V0ZU9wdGlvbnM/LnVybCA/PyByZXF1ZXN0LnVybC5zcGxpdChcIj9cIilbMF0sXG4gICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgIGFwaSxcbiAgICAgIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcihjYWNoZVJlcSk7XG4gICAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNTUuyaqSBBUEkg7Zi47LacIChIVFRQIOyYpOuyhO2XpOuTnCDsl4bsnbQg7KeB7KCRIO2YuOy2nClcbiAgICogY3JlYXRlQXBpSGFuZGxlcuydmCDroZzsp4HsnYQg7J6s7IKs7Jqp7ZWY65CYLCByZXF1ZXN0IO2MjOyLsSDrjIDsi6AgcGFyYW1zIOyngeygkSDsgqzsmqlcbiAgICovXG4gIGFzeW5jIGludm9rZUFwaUZvclNTUihcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIHBhcmFtczogYW55W10sXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIHJlcGx5OiBGYXN0aWZ5UmVwbHksXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIC8vIENvbnRleHQg7IOd7ISxICjquLDsobQg66mU7IaM65OcIOyerOyCrOyaqSlcbiAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVDb250ZXh0KGNvbmZpZywgcmVxdWVzdCwgcmVwbHkpO1xuXG4gICAgcmV0dXJuIHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UucnVuKHsgY29udGV4dCB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBhcmdzIOyDneyEsTogQ29udGV4dCDtjIzrnbzrr7jthLDripQg7KO87J6FLCDrgpjrqLjsp4DripQgcGFyYW1z7JeQ7IScIOqwgOyguOyYpOq4sFxuICAgICAgY29uc3QgeyBBcGlQYXJhbVR5cGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL3R5cGVzL3R5cGVzXCIpO1xuICAgICAgbGV0IHBhcmFtc0luZGV4ID0gMDtcbiAgICAgIGNvbnN0IGFyZ3MgPSBhcGkucGFyYW1ldGVycy5tYXAoKHBhcmFtKSA9PiB7XG4gICAgICAgIGlmIChBcGlQYXJhbVR5cGUuaXNDb250ZXh0KHBhcmFtLnR5cGUpKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcmFtc1twYXJhbXNJbmRleCsrXTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyDrqqjrjbgg66mU7ISc65OcIO2YuOy2nCAo6riw7KG0IOuplOyEnOuTnCDsnqzsgqzsmqkpXG4gICAgICByZXR1cm4gdGhpcy5pbnZva2VNb2RlbE1ldGhvZChhcGksIGFyZ3MsIHJlcGx5KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFdTIOqyveuhnOyXkOyEnOuKlCBIVFRQIHJlcGx56rCAIOyXhuycvOuvgOuhnCByZXBseeulvCBvcHRpb25hbOuhnCDrsJvslYQg6rO17Ya1IO2YuOy2nCDqsr3roZzrpbwg7Jyg7KeA7ZWoXG4gIGFzeW5jIGludm9rZU1vZGVsTWV0aG9kKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgYXJnczogdW5rbm93bltdLFxuICAgIHJlcGx5PzogRmFzdGlmeVJlcGx5LFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBtb2RlbCA9IHRoaXMuc3luY2VyLm1vZGVsc1thcGkubW9kZWxOYW1lXTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCAobW9kZWwgYXMgYW55KVthcGkubWV0aG9kTmFtZV0uYXBwbHkobW9kZWwsIGFyZ3MpO1xuICAgIHJlcGx5Py50eXBlKGFwaS5vcHRpb25zLmNvbnRlbnRUeXBlID8/IFwiYXBwbGljYXRpb24vanNvblwiKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBhc3luYyBjcmVhdGVDb250ZXh0KFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICByZXBseTogRmFzdGlmeVJlcGx5LFxuICApOiBQcm9taXNlPENvbnRleHQ+IHtcbiAgICAvLyBjcmVhdGVTU0VGYWN0b3J5IO2VqOyImOyXkCDrr7jrpqwgcmVxdWVzdOydmCBzb2NrZXTqs7wgcmVwbHnrpbwg67CU7J2465SpLlxuICAgIGNvbnN0IHsgY3JlYXRlU1NFRmFjdG9yeSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3RyZWFtL3NzZVwiKTtcbiAgICBjb25zdCBjcmVhdGVTU0UgPSAoPFQgZXh0ZW5kcyBab2RPYmplY3Q+KFxuICAgICAgX3JlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgICAgX3JlcGx5OiBGYXN0aWZ5UmVwbHksXG4gICAgICBfZXZlbnRzOiBULFxuICAgICkgPT4gY3JlYXRlU1NFRmFjdG9yeShfcmVxdWVzdC5zb2NrZXQsIF9yZXBseSwgX2V2ZW50cykpLmJpbmQobnVsbCwgcmVxdWVzdCwgcmVwbHkpO1xuXG4gICAgLy8gbG9jYWxlIOqwkOyngFxuICAgIGNvbnN0IGxvY2FsZSA9XG4gICAgICB0aGlzLmRldGVjdExvY2FsZShyZXF1ZXN0LmhlYWRlcnNbXCJhY2NlcHQtbGFuZ3VhZ2VcIl0sIHRoaXMuY29uZmlnLmkxOG4uc3VwcG9ydGVkTG9jYWxlcykgPz9cbiAgICAgIHRoaXMuY29uZmlnLmkxOG4uZGVmYXVsdExvY2FsZTtcblxuICAgIC8vIGF1dGggY29udGV4dCDstpTqsIBcbiAgICBjb25zdCBoZWFkZXJzID0gY29udmVydEZhc3RpZnlIZWFkZXJzVG9TdGFuZGFyZChyZXF1ZXN0LmhlYWRlcnMpO1xuICAgIGNvbnN0IHNlc3Npb24gPSAoYXdhaXQgdGhpcy5fYXV0aD8uYXBpLmdldFNlc3Npb24oeyBoZWFkZXJzIH0pKSA/PyBudWxsO1xuXG4gICAgY29uc3QgY29udGV4dDogQ29udGV4dCA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShcbiAgICAgIGNvbmZpZy5jb250ZXh0UHJvdmlkZXIoXG4gICAgICAgIHtcbiAgICAgICAgICB0cmFuc3BvcnQ6IFwiaHR0cFwiLFxuICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgcmVwbHksXG4gICAgICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgICAgIGNyZWF0ZVNTRSxcbiAgICAgICAgICBuYWl0ZVN0b3JlOiBuZXcgTWFwKCksXG4gICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgIC8vIGF1dGhcbiAgICAgICAgICB1c2VyOiBzZXNzaW9uPy51c2VyID8/IG51bGwsXG4gICAgICAgICAgc2Vzc2lvbjogc2Vzc2lvbj8uc2Vzc2lvbiA/PyBudWxsLFxuICAgICAgICB9LFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICByZXBseSxcbiAgICAgICksXG4gICAgKTtcbiAgICByZXR1cm4gY29udGV4dDtcbiAgfVxuXG4gIC8vIHNlc3Npb24vbG9jYWxlL3N0b3JlIOqwmeydgCDqs7XthrUgc3RhdGXripQgSFRUUCBjb250ZXh07JmAIOqzteycoO2VmOuQmCwgcmVwbHkvY3JlYXRlU1NFIOqwmeydgCBIVFRQIOyghOyaqSBoZWxwZXLripQg64W47Lac7ZWY7KeAIOyViuydjFxuICAvLyDsgqzsmqnsnpDqsIAgd2Vic29ja2V0Q29udGV4dFByb3ZpZGVy66W8IOyjvOuptCDqt7jrjIDroZwg7JyE7J6E7ZWY6rOgLCDsl4bsnLzrqbQg6riw7KG0IGNvbnRleHRQcm92aWRlcuulvCByZXBseS9TU0Ugc3R1YuqzvCDtlajqu5gg7J6s7Zmc7Jqp7ZWoXG4gIGFzeW5jIGNyZWF0ZVdlYlNvY2tldENvbnRleHQoXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIHdzOiBXZWJTb2NrZXRDb250ZXh0W1wid3NcIl0sXG4gICk6IFByb21pc2U8V2ViU29ja2V0Q29udGV4dD4ge1xuICAgIGNvbnN0IGxvY2FsZSA9XG4gICAgICB0aGlzLmRldGVjdExvY2FsZShyZXF1ZXN0LmhlYWRlcnNbXCJhY2NlcHQtbGFuZ3VhZ2VcIl0sIHRoaXMuY29uZmlnLmkxOG4uc3VwcG9ydGVkTG9jYWxlcykgPz9cbiAgICAgIHRoaXMuY29uZmlnLmkxOG4uZGVmYXVsdExvY2FsZTtcblxuICAgIGNvbnN0IGhlYWRlcnMgPSBjb252ZXJ0RmFzdGlmeUhlYWRlcnNUb1N0YW5kYXJkKHJlcXVlc3QuaGVhZGVycyk7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IChhd2FpdCB0aGlzLl9hdXRoPy5hcGkuZ2V0U2Vzc2lvbih7IGhlYWRlcnMgfSkpID8/IG51bGw7XG5cbiAgICBjb25zdCBkZWZhdWx0Q29udGV4dCA9IHtcbiAgICAgIHRyYW5zcG9ydDogXCJ3c1wiIGFzIGNvbnN0LFxuICAgICAgcmVxdWVzdCxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgIHdzLFxuICAgICAgbmFpdGVTdG9yZTogbmV3IE1hcCgpLFxuICAgICAgbG9jYWxlLFxuICAgICAgdXNlcjogc2Vzc2lvbj8udXNlciA/PyBudWxsLFxuICAgICAgc2Vzc2lvbjogc2Vzc2lvbj8uc2Vzc2lvbiA/PyBudWxsLFxuICAgIH07XG5cbiAgICBpZiAoY29uZmlnLndlYnNvY2tldENvbnRleHRQcm92aWRlcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uKGF3YWl0IFByb21pc2UucmVzb2x2ZShjb25maWcud2Vic29ja2V0Q29udGV4dFByb3ZpZGVyKGRlZmF1bHRDb250ZXh0LCByZXF1ZXN0KSkpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyByZXBseS9jcmVhdGVTU0Xsl5Ag7J2Y7KG07ZWY64qUIGNvbnRleHRQcm92aWRlcuqwgCDsnojsnLzrqbQg7KaJ7IucIOyXkOufrOulvCDrjZjsoLggdHJhbnNwb3J0IG1pc3VzZeulvCDruajrpqwg65Oc65+s64OEXG4gICAgY29uc3QgcmVwbHlTdHViID0gY3JlYXRlV2ViU29ja2V0UmVwbHlTdHViKCk7XG4gICAgY29uc3QgY3JlYXRlU1NFID0gPFQgZXh0ZW5kcyBab2RPYmplY3Q+KF9ldmVudHM6IFQpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJjcmVhdGVTU0UgaXMgbm90IGF2YWlsYWJsZSBpbiB3ZWJzb2NrZXQgY29udGV4dC4gRGVmaW5lIHdlYnNvY2tldENvbnRleHRQcm92aWRlciBpZiB5b3VyIGNvbnRleHQgc2V0dXAgZGVwZW5kcyBvbiBTU0UgaGVscGVycy5cIixcbiAgICAgICk7XG4gICAgfTtcbiAgICBjb25zdCBodHRwTGlrZUNvbnRleHQgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUoXG4gICAgICBjb25maWcuY29udGV4dFByb3ZpZGVyKFxuICAgICAgICB7XG4gICAgICAgICAgdHJhbnNwb3J0OiBcImh0dHBcIixcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIHJlcGx5OiByZXBseVN0dWIsXG4gICAgICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgICAgIGNyZWF0ZVNTRSxcbiAgICAgICAgICBuYWl0ZVN0b3JlOiBkZWZhdWx0Q29udGV4dC5uYWl0ZVN0b3JlLFxuICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICB1c2VyOiBkZWZhdWx0Q29udGV4dC51c2VyLFxuICAgICAgICAgIHNlc3Npb246IGRlZmF1bHRDb250ZXh0LnNlc3Npb24sXG4gICAgICAgIH0sXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIHJlcGx5U3R1YixcbiAgICAgICksXG4gICAgKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIHRyYW5zcG9ydDogX3RyYW5zcG9ydCxcbiAgICAgIHJlcGx5OiBfcmVwbHksXG4gICAgICBjcmVhdGVTU0U6IF9jcmVhdGVTU0UsXG4gICAgICBidWZmZXJlZEZpbGVzOiBfYnVmZmVyZWRGaWxlcyxcbiAgICAgIHVwbG9hZGVkRmlsZXM6IF91cGxvYWRlZEZpbGVzLFxuICAgICAgLi4ucmVzdFxuICAgIH0gPSBodHRwTGlrZUNvbnRleHQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ucmVzdCxcbiAgICAgIHRyYW5zcG9ydDogXCJ3c1wiLFxuICAgICAgcmVxdWVzdCxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgIHdzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQWNjZXB0LUxhbmd1YWdlIO2XpOuNlOyXkOyEnCDsp4Dsm5DtlZjripQgbG9jYWxl7J2EIOywvuyKteuLiOuLpC5cbiAgICogQGV4YW1wbGUgXCJrby1LUixrbztxPTAuOSxlbjtxPTAuOFwiIOKGkiBcImtvXCJcbiAgICovXG4gIHByaXZhdGUgZGV0ZWN0TG9jYWxlKFxuICAgIGFjY2VwdExhbmd1YWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc3VwcG9ydGVkOiBzdHJpbmdbXSxcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWFjY2VwdExhbmd1YWdlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgLy8gQWNjZXB0LUxhbmd1YWdlOiBrby1LUixrbztxPTAuOSxlbjtxPTAuOFxuICAgIGNvbnN0IGxhbmdzID0gYWNjZXB0TGFuZ3VhZ2Uuc3BsaXQoXCIsXCIpLm1hcCgobGFuZykgPT4ge1xuICAgICAgY29uc3QgW2NvZGVdID0gbGFuZy5zcGxpdChcIjtcIik7XG4gICAgICByZXR1cm4gY29kZS50cmltKCkuc3BsaXQoXCItXCIpWzBdOyAvLyBrby1LUiDihpIga29cbiAgICB9KTtcblxuICAgIHJldHVybiBsYW5ncy5maW5kKChsYW5nKSA9PiBzdXBwb3J0ZWQuaW5jbHVkZXMobGFuZykpO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRXYXRjaGVyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIHdhdGNoZXIg66qo65OI7J2AIGZpbGUtcGF0dGVybnMg4oaSIFNvbmFtdSDsiJztmZjsnYQg7ZS87ZWY6riwIOychO2VtCBkeW5hbWljIGltcG9ydCDtlanri4jri6QuXG4gICAgY29uc3QgeyBzZXR1cFdhdGNoZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N5bmNlci93YXRjaGVyXCIpO1xuICAgIHRoaXMud2F0Y2hlciA9IGF3YWl0IHNldHVwV2F0Y2hlcigoZmlsZUV2ZW50cykgPT4gdGhpcy5ydW5IbXJTeW5jQ3ljbGUoZmlsZUV2ZW50cykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhdGNoZXLqsIAgMTAwbXMgYmF0Y2jroZwg66qo7J2AIGZpbGVFdmVudHMg7ZWY64KY7JeQIOuMgO2VtCDtlZwg67KI7J2YIEhNUi9zeW5jIOyCrOydtO2BtOydhCDrj5Xri4jri6QuXG4gICAqIGJhdGNoIO2BkOyeiSDrjZXsl5Ag7ZWcIOyLnOygkOyXkCDtlZjrgpjrp4wg7Iuk7ZaJ65Co7J20IOuztOyepeuQqeuLiOuLpCAoZXZlbnQtYmF0Y2hlcuqwgCDsp4HroKztmZQpLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBydW5IbXJTeW5jQ3ljbGUoZmlsZUV2ZW50czogTWFwPEFic29sdXRlUGF0aCwgXCJjaGFuZ2VcIiB8IFwiYWRkXCI+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcblxuICAgIGZvciAoY29uc3QgW2ZpbGVQYXRoLCBldmVudF0gb2YgZmlsZUV2ZW50cykge1xuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZSh0aGlzLmFwcFJvb3RQYXRoLCBmaWxlUGF0aCk7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKGBEZXRlY3RlZCgke2V2ZW50fSk6ICR7Y2hhbGsuYmx1ZShyZWxhdGl2ZVBhdGgpfWApKTtcbiAgICB9XG5cbiAgICAvLyDrs7jssrQ6IOuzgOqyvSDtnaHsiJggKyDssrTtgazshKwg6rCx7IugLlxuICAgIGF3YWl0IHRoaXMuc3luY2VyLmhtckFuZFN5bmMoZmlsZUV2ZW50cyk7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIucmVuZXdDaGVja3N1bXMoKTtcblxuICAgIGNvbnN0IHRvdGFsVGltZSA9IERhdGUubm93KCkgLSBzdGFydGVkQXQ7XG4gICAgY29uc3QgbXNnID0gYEhNUiBEb25lISAke2NoYWxrLmJvbGQud2hpdGUoYCR7dG90YWxUaW1lfW1zYCl9YDtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ibGFjay5iZ0dyZWVuKGNlbnRlclRleHQobXNnKSkpO1xuICB9XG5cbiAgLypcbiAgICAgQSBmdW5jdGlvbiB0aGF0IGF1dG9tYXRpY2FsbHkgaGFuZGxlcyBpbml0IGFuZCBkZXN0cm95IHdoZW4gdXNpbmcgU29uYW11IHZpYSBzY3JpcHRzLlxuICAqL1xuICBhc3luYyBydW5TY3JpcHQoZm46ICgpID0+IFByb21pc2U8dm9pZD4pIHtcbiAgICBhd2FpdCB0aGlzLmluaXQodHJ1ZSwgZmFsc2UsIHVuZGVmaW5lZCwgZmFsc2UpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmbigpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0aGlzLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlZ2lzdGVyUGx1Z2lucyhzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSwgcGx1Z2luczogU29uYW11U2VydmVyT3B0aW9uc1tcInBsdWdpbnNcIl0pIHtcbiAgICBpZiAoIXBsdWdpbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBjb21wcmVzcyDtlIzrn6zqt7jsnbjsnYAg64uk66W4IO2UjOufrOq3uOyduOuztOuLpCDrqLzsoIAg65Ox66Gd65CY7Ja07JW8IO2VqeuLiOuLpC5cbiAgICBpZiAocGx1Z2lucy5jb21wcmVzcykge1xuICAgICAgY29uc3QgY29tcHJlc3NQbHVnaW4gPSAoYXdhaXQgaW1wb3J0KFwiQGZhc3RpZnkvY29tcHJlc3NcIikpLmRlZmF1bHQ7XG4gICAgICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICAgICAgdGhyZXNob2xkOiAxMDI0LFxuICAgICAgICBlbmNvZGluZ3M6IFtcImJyXCIsIFwiZ3ppcFwiLCBcImRlZmxhdGVcIl0gYXMgKFwiYnJcIiB8IFwiZ3ppcFwiIHwgXCJkZWZsYXRlXCIpW10sXG4gICAgICB9O1xuXG4gICAgICBpZiAocGx1Z2lucy5jb21wcmVzcyA9PT0gdHJ1ZSkge1xuICAgICAgICBzZXJ2ZXIucmVnaXN0ZXIoY29tcHJlc3NQbHVnaW4sIGRlZmF1bHRPcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlcnZlci5yZWdpc3Rlcihjb21wcmVzc1BsdWdpbiwge1xuICAgICAgICAgIC4uLmRlZmF1bHRPcHRpb25zLFxuICAgICAgICAgIC4uLnBsdWdpbnMuY29tcHJlc3MsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBsdWdpbnNNb2R1bGVzID0ge1xuICAgICAgY29yczogXCJAZmFzdGlmeS9jb3JzXCIsXG4gICAgICBmb3JtYm9keTogXCJAZmFzdGlmeS9mb3JtYm9keVwiLFxuICAgICAgbXVsdGlwYXJ0OiBcIkBmYXN0aWZ5L211bHRpcGFydFwiLFxuICAgICAgcXM6IFwiZmFzdGlmeS1xc1wiLFxuICAgICAgc3NlOiBcImZhc3RpZnktc3NlLXYyXCIsXG4gICAgICBzdGF0aWM6IFwiQGZhc3RpZnkvc3RhdGljXCIsXG4gICAgfSBhcyBjb25zdDtcblxuICAgIGNvbnN0IHJlZ2lzdGVyUGx1Z2luID0gYXN5bmMgPEsgZXh0ZW5kcyBrZXlvZiBOb25OdWxsYWJsZTx0eXBlb2YgcGx1Z2lucz4+KFxuICAgICAga2V5OiBLLFxuICAgICAgcGx1Z2luTmFtZTogc3RyaW5nLFxuICAgICkgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9uID0gcGx1Z2luc1trZXldO1xuICAgICAgaWYgKCFvcHRpb24pIHJldHVybjtcblxuICAgICAgaWYgKG9wdGlvbiA9PT0gdHJ1ZSkge1xuICAgICAgICBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChwbHVnaW5OYW1lKSkuZGVmYXVsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChwbHVnaW5OYW1lKSkuZGVmYXVsdCwgb3B0aW9uKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBba2V5LCBwbHVnaW5OYW1lXSBvZiBPYmplY3QuZW50cmllcyhwbHVnaW5zTW9kdWxlcykpIHtcbiAgICAgIGF3YWl0IHJlZ2lzdGVyUGx1Z2luKGtleSBhcyBrZXlvZiB0eXBlb2YgcGx1Z2lucywgcGx1Z2luTmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHBsdWdpbnMud3MpIHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlV2ViU29ja2V0UGx1Z2luKHNlcnZlcik7XG4gICAgfVxuXG4gICAgaWYgKHBsdWdpbnMuY3VzdG9tKSB7XG4gICAgICBwbHVnaW5zLmN1c3RvbShzZXJ2ZXIpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEBmYXN0aWZ5L3dlYnNvY2tldOydgCBwbHVnaW5zLndz6rCAIOyEpOygleuQnCDqsr3smrDsl5Drp4wg65Ox66Gd7ZWY6rOgLCDqsJnsnYAgc2VydmVy7JeQIOykkeuztSDrk7HroZ3rkJjsp4Ag7JWK64+E66GdIFdlYWtTZXTsnLzroZwg6riw66Gd7ZWoXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlV2ViU29ja2V0UGx1Z2luKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLndlYnNvY2tldFBsdWdpblNlcnZlcnMuaGFzKHNlcnZlcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwbHVnaW5PcHRpb24gPSB0aGlzLmNvbmZpZy5zZXJ2ZXIucGx1Z2lucz8ud3M7XG4gICAgaWYgKCFwbHVnaW5PcHRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3ZWJzb2NrZXRQbHVnaW4gPSAoYXdhaXQgaW1wb3J0KFwiQGZhc3RpZnkvd2Vic29ja2V0XCIpKS5kZWZhdWx0O1xuICAgIGNvbnN0IHJlc29sdmVkUGx1Z2luT3B0aW9ucyA9IHJlc29sdmVXZWJTb2NrZXRQbHVnaW5PcHRpb25zKHtcbiAgICAgIHJhd1BsdWdpbk9wdGlvbjogcGx1Z2luT3B0aW9uLFxuICAgIH0pO1xuICAgIGlmIChyZXNvbHZlZFBsdWdpbk9wdGlvbnMpIHtcbiAgICAgIGF3YWl0IHNlcnZlci5yZWdpc3Rlcih3ZWJzb2NrZXRQbHVnaW4sIHJlc29sdmVkUGx1Z2luT3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHNlcnZlci5yZWdpc3Rlcih3ZWJzb2NrZXRQbHVnaW4pO1xuICAgIH1cblxuICAgIHRoaXMud2Vic29ja2V0UGx1Z2luU2VydmVycy5hZGQoc2VydmVyKTtcbiAgICB0aGlzLndhcm5PblBvdGVudGlhbFdlYlNvY2tldFRpbWVvdXRDb25mbGljdHMoc2VydmVyKTtcbiAgfVxuXG4gIC8vIGhlYXJ0YmVhdCBpbnRlcnZhbOydtCBGYXN0aWZ5IGtlZXBBbGl2ZVRpbWVvdXQg7J207IOB7J2066m0IOyduO2UhOudvOqwgCDrqLzsoIAgaWRsZSDsl7DqsrDsnYQg64GK7J2EIOyImCDsnojslrQg6rK96rOg66eMIOuCqOq4sOqzoCDrhJjslrTqsJBcbiAgcHJpdmF0ZSB3YXJuT25Qb3RlbnRpYWxXZWJTb2NrZXRUaW1lb3V0Q29uZmxpY3RzKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGhlYXJ0YmVhdHMgPSB0aGlzLnN5bmNlci5hcGlzXG4gICAgICAubWFwKChhcGkpID0+IGFwaS53ZWJzb2NrZXRPcHRpb25zPy5oZWFydGJlYXQgPz8gMzAwMDApXG4gICAgICAuZmlsdGVyKChoZWFydGJlYXQpID0+IGhlYXJ0YmVhdCA+IDApO1xuXG4gICAgaWYgKGhlYXJ0YmVhdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qga2VlcEFsaXZlVGltZW91dCA9IHRoaXMuY29uZmlnLnNlcnZlci5mYXN0aWZ5Py5rZWVwQWxpdmVUaW1lb3V0O1xuICAgIGlmICgha2VlcEFsaXZlVGltZW91dCB8fCBrZWVwQWxpdmVUaW1lb3V0IDw9IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsYXJnZXN0SGVhcnRiZWF0ID0gTWF0aC5tYXgoLi4uaGVhcnRiZWF0cyk7XG4gICAgaWYgKGxhcmdlc3RIZWFydGJlYXQgPj0ga2VlcEFsaXZlVGltZW91dCkge1xuICAgICAgc2VydmVyLmxvZy53YXJuKFxuICAgICAgICB7XG4gICAgICAgICAga2VlcEFsaXZlVGltZW91dCxcbiAgICAgICAgICBsYXJnZXN0SGVhcnRiZWF0LFxuICAgICAgICB9LFxuICAgICAgICBcIldlYlNvY2tldCBoZWFydGJlYXQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGtlZXBBbGl2ZVRpbWVvdXQ7IGFsaWduIGluZnJhc3RydWN0dXJlIGlkbGUgdGltZW91dHMgdG8gYXZvaWQgdW5leHBlY3RlZCBkaXNjb25uZWN0cy5cIixcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGJldHRlci1hdXRoIOudvOyasO2KuOulvCDrk7HroZ3tlanri4jri6QuXG4gICAqIC9hcGkvYXV0aC8qIOqyveuhnOuhnCDsnbjspp0gQVBJ6rCAIOyekOuPmSDrk7HroZ3rkKnri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlZ2lzdGVyQmV0dGVyQXV0aChcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSxcbiAgICBvcHRpb25zOiBOb25OdWxsYWJsZTxTb25hbXVTZXJ2ZXJPcHRpb25zW1wiYXV0aFwiXT4sXG4gICkge1xuICAgIGlmICghb3B0aW9ucykgcmV0dXJuO1xuXG4gICAgY29uc3QgYmFzZVBhdGggPSBvcHRpb25zLmJhc2VQYXRoID8/IFwiL2FwaS9hdXRoXCI7XG5cbiAgICAvLyBiZXR0ZXItYXV0aCDrnbzsmrDtirgg65Ox66GdXG4gICAgc2VydmVyLnJvdXRlKHtcbiAgICAgIG1ldGhvZDogW1wiR0VUXCIsIFwiUE9TVFwiXSxcbiAgICAgIHVybDogYCR7YmFzZVBhdGh9LypgLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxdWVzdC51cmwsIGBodHRwOi8vJHtyZXF1ZXN0LmhlYWRlcnMuaG9zdH1gKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IGNvbnZlcnRGYXN0aWZ5SGVhZGVyc1RvU3RhbmRhcmQocmVxdWVzdC5oZWFkZXJzKTtcblxuICAgICAgICAvLyBJUCDtl6TrjZQgZmFsbGJhY2s6IO2UhOuhneyLnOqwgCDtkZzspIAgSVAg7Zek642U66W8IOyjvOyehe2VmOyngCDslYrripQg7ZmY6rK97JeQ7ISc64+EXG4gICAgICAgIC8vIGJldHRlci1hdXRoL2luZnJh7J2YIGdldENsaWVudElwRnJvbVJlcXVlc3QoKeqwgCBJUOulvCDsnbjsi53tlaAg7IiYIOyeiOuPhOuhnVxuICAgICAgICAvLyBGYXN0aWZ56rCAIHJlc29sdmXtlZwgcmVxdWVzdC5pcOulvCB4LXJlYWwtaXDroZwg7KO87J6F7ZWc64ukLlxuICAgICAgICBjb25zdCBJUF9IRUFERVJTID0gW1xuICAgICAgICAgIFwiY2YtY29ubmVjdGluZy1pcFwiLFxuICAgICAgICAgIFwieC1mb3J3YXJkZWQtZm9yXCIsXG4gICAgICAgICAgXCJ4LXJlYWwtaXBcIixcbiAgICAgICAgICBcIngtdmVyY2VsLWZvcndhcmRlZC1mb3JcIixcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKHJlcXVlc3QuaXAgJiYgIUlQX0hFQURFUlMuc29tZSgoaCkgPT4gaGVhZGVycy5oYXMoaCkpKSB7XG4gICAgICAgICAgaGVhZGVycy5zZXQoXCJ4LXJlYWwtaXBcIiwgcmVxdWVzdC5pcCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXEgPSBuZXcgUmVxdWVzdCh1cmwudG9TdHJpbmcoKSwge1xuICAgICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAuLi4ocmVxdWVzdC5ib2R5ID8geyBib2R5OiBKU09OLnN0cmluZ2lmeShyZXF1ZXN0LmJvZHkpIH0gOiB7fSksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hdXRoLmhhbmRsZXIocmVxKTtcblxuICAgICAgICByZXBseS5zdGF0dXMocmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgcmVzcG9uc2UuaGVhZGVycy5mb3JFYWNoKCh2YWx1ZTogc3RyaW5nLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICAgIHJlcGx5LmhlYWRlcihrZXksIHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXBseS5zZW5kKHJlc3BvbnNlLmJvZHkgPyBhd2FpdCByZXNwb25zZS50ZXh0KCkgOiBudWxsKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByaW50U3RhcnR1cFN1bW1hcnkoKSB7XG4gICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgY29uc3QgZW52ID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPz8gXCJkZXZlbG9wbWVudFwiO1xuICAgIGNvbnN0IGFjdGl2ZVByZXNldCA9IGVudiA9PT0gXCJwcm9kdWN0aW9uXCIgPyBcInByb2R1Y3Rpb25fbWFzdGVyXCIgOiBcImRldmVsb3BtZW50X21hc3RlclwiO1xuXG4gICAgY29uc3QgZGltID0gKG1zZzogc3RyaW5nKSA9PiBjb25zb2xlLmxvZyhjaGFsay5kaW0oYOKckyAke21zZ31gKSk7XG4gICAgY29uc3QgZ3JlZW4gPSAobXNnOiBzdHJpbmcpID0+IGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinJMgJHttc2d9YCkpO1xuXG4gICAgZGltKGBDb25maWcgbG9hZGVkJHtmb3JtYXRUaW1lKHRoaXMuX2NvbmZpZ0VsYXBzZWQpfWApO1xuXG4gICAgLy8gREIgcHJlc2V0IOuqqeuhnVxuICAgIGdyZWVuKFwiREJcIik7XG4gICAgY29uc3QgeyBpc0xvY2FsIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9jb250cm9sbGVyXCIpO1xuICAgIGNvbnN0IHByZXNldE5hbWVzID0gT2JqZWN0LmtleXModGhpcy5kYkNvbmZpZykgYXMgKGtleW9mIFNvbmFtdURCQ29uZmlnKVtdO1xuICAgIGNvbnN0IG1heExlbiA9IE1hdGgubWF4KC4uLnByZXNldE5hbWVzLm1hcCgobikgPT4gbi5sZW5ndGgpKTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgcHJlc2V0TmFtZXMpIHtcbiAgICAgIGNvbnN0IGNvbm4gPSB0aGlzLmRiQ29uZmlnW25hbWVdLmNvbm5lY3Rpb24gYXNcbiAgICAgICAgfCB7IGhvc3Q/OiBzdHJpbmc7IHBvcnQ/OiBudW1iZXI7IGRhdGFiYXNlPzogc3RyaW5nIH1cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBob3N0ID0gY29ubj8uaG9zdCA/PyBcImxvY2FsaG9zdFwiO1xuICAgICAgY29uc3QgYWRkciA9IGBAICR7aG9zdH06JHtjb25uPy5wb3J0ID8/IDU0MzJ9LyR7Y29ubj8uZGF0YWJhc2UgPz8gdGhpcy5jb25maWcuZGF0YWJhc2UubmFtZX1gO1xuICAgICAgY29uc3QgcGFkZGVkID0gbmFtZS5wYWRFbmQobWF4TGVuKTtcbiAgICAgIGNvbnN0IHJlbW90ZVRhZyA9IGlzTG9jYWwoKSAmJiAhaXNMb2NhbEhvc3QoaG9zdCkgPyBjaGFsay55ZWxsb3coYCBcXHUyNmEwIHJlbW90ZWApIDogXCJcIjtcblxuICAgICAgaWYgKG5hbWUgPT09IGFjdGl2ZVByZXNldCkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihgICBcXHUyNWI4ICR7cGFkZGVkfSAke2FkZHJ9YCkgKyByZW1vdGVUYWcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKGAgICAgJHtwYWRkZWR9ICR7YWRkcn1gKSArIHJlbW90ZVRhZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLnNlcnZlci5hdXRoKSB7XG4gICAgICBjb25zdCBiYXNlUGF0aCA9IHRoaXMuY29uZmlnLnNlcnZlci5hdXRoLmJhc2VQYXRoID8/IFwiL2FwaS9hdXRoXCI7XG4gICAgICBkaW0oYEF1dGg6IGJldHRlci1hdXRoIGF0ICR7YmFzZVBhdGh9LypgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29uZmlnLmFwaS50aW1lem9uZSkge1xuICAgICAgZGltKGBUaW1lem9uZTogJHt0aGlzLmNvbmZpZy5hcGkudGltZXpvbmV9YCk7XG4gICAgfVxuICAgIGdyZWVuKGBTb25hbXUgcmVhZHkke2Zvcm1hdFRpbWUodGhpcy5faW5pdEVsYXBzZWQpfWApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplQ2FjaGUoY29uZmlnOiBDYWNoZUNvbmZpZyB8IHVuZGVmaW5lZCwgZm9yVGVzdGluZzogYm9vbGVhbikge1xuICAgIGNvbnN0IHsgc2V0Q2FjaGVNYW5hZ2VyUmVmIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9jYWNoZS9kZWNvcmF0b3JcIik7XG5cbiAgICAvLyDthYzsiqTtirgg7ZmY6rK97JeQ7IScIOuplOuqqOumrCDrk5zrnbzsnbTrsoQg7J6Q64+ZIOyCrOyaqVxuICAgIGlmIChmb3JUZXN0aW5nKSB7XG4gICAgICBjb25zdCB7IGNyZWF0ZVRlc3RDYWNoZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2NhY2hlL2NhY2hlLW1hbmFnZXJcIik7XG4gICAgICB0aGlzLl9jYWNoZSA9IGNyZWF0ZVRlc3RDYWNoZU1hbmFnZXIoKTtcbiAgICAgIHNldENhY2hlTWFuYWdlclJlZih0aGlzLl9jYWNoZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g7ISk7KCV7J20IOyXhuycvOuptCDsupDsi5wg67mE7Zmc7ISx7ZmUXG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIHNldENhY2hlTWFuYWdlclJlZihudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDshKTsoJXsl5Ag65Sw6528IENhY2hlTWFuYWdlciDsg53shLFcbiAgICBjb25zdCB7IGNyZWF0ZUNhY2hlTWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vY2FjaGUvY2FjaGUtbWFuYWdlclwiKTtcbiAgICB0aGlzLl9jYWNoZSA9IGNyZWF0ZUNhY2hlTWFuYWdlcihjb25maWcpO1xuICAgIHNldENhY2hlTWFuYWdlclJlZih0aGlzLl9jYWNoZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemVXb3JrZmxvd3Mob3B0aW9uczogU29uYW11VGFza09wdGlvbnMgfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCB7IFdvcmtmbG93TWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdGFza3Mvd29ya2Zsb3ctbWFuYWdlclwiKTtcbiAgICAvLyBOT1RFOiBAc29uYW11LWtpdC90YXNrcyDslYjsl5DshKAga25leCBjb25maWfrpbwg7IiY7KCV7ZWY6riwIOuVjOusuOyXkCBjb25uZWN0aW9u7J20IOyVhOuLjCBjb25maWcg7Ke466GcIOuztOuDheuLiOuLpC5cbiAgICB0aGlzLl93b3JrZmxvd3MgPSBuZXcgV29ya2Zsb3dNYW5hZ2VyKERCLmdldERCQ29uZmlnKFwid1wiKSk7XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZW5hYmxlV29ya2VyID0gb3B0aW9ucy5lbmFibGVXb3JrZXIgPz8gaXNEYWVtb25TZXJ2ZXIoKTtcbiAgICBjb25zdCBkZWZhdWx0V29ya2VyT3B0aW9ucyA9IHtcbiAgICAgIGNvbmN1cnJlbmN5OiBvcy5jcHVzKCkubGVuZ3RoIC0gMSxcbiAgICAgIHVzZVB1YlN1YjogdHJ1ZSxcbiAgICAgIGxpc3RlbkRlbGF5OiA1MDAsXG4gICAgfTtcblxuICAgIGlmIChlbmFibGVXb3JrZXIpIHtcbiAgICAgIHRoaXMud29ya2Zsb3dzLnNldHVwV29ya2VyKHtcbiAgICAgICAgLi4uZGVmYXVsdFdvcmtlck9wdGlvbnMsXG4gICAgICAgIC4uLm9wdGlvbnMud29ya2VyT3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYm9vdChzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSwgb3B0aW9uczogU29uYW11U2VydmVyT3B0aW9ucykge1xuICAgIGNvbnN0IHBvcnQgPSBvcHRpb25zLmxpc3Rlbj8ucG9ydCA/PyAzMDAwO1xuICAgIGNvbnN0IGhvc3QgPSBvcHRpb25zLmxpc3Rlbj8uaG9zdCA/PyBcImxvY2FsaG9zdFwiO1xuXG4gICAgc2VydmVyLmFkZEhvb2soXCJvbkNsb3NlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IG9wdGlvbnMubGlmZWN5Y2xlPy5vblNodXRkb3duPy4oc2VydmVyKTtcbiAgICAgIGF3YWl0IHRoaXMud29ya2Zsb3dzLmRlc3Ryb3koKTtcbiAgICAgIGF3YWl0IHRoaXMuZGVzdHJveSgpO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc2h1dGRvd24gPSBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzZXJ2ZXIuY2xvc2UoKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBkdXJpbmcgc2h1dGRvd246XCIsIGVycik7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJvY2Vzcy5vbihcIlNJR0lOVFwiLCBzaHV0ZG93bik7XG4gICAgcHJvY2Vzcy5vbihcIlNJR1RFUk1cIiwgc2h1dGRvd24pO1xuXG4gICAgaWYgKG9wdGlvbnMubGlmZWN5Y2xlPy5vbkVycm9yKSB7XG4gICAgICBzZXJ2ZXIuc2V0RXJyb3JIYW5kbGVyKG9wdGlvbnMubGlmZWN5Y2xlPy5vbkVycm9yKTtcbiAgICB9XG5cbiAgICBzZXJ2ZXJcbiAgICAgIC5saXN0ZW4oeyBwb3J0LCBob3N0IH0pXG4gICAgICAudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMud29ya2Zsb3dzLnN0YXJ0V29ya2VyKCk7XG4gICAgICAgIGF3YWl0IG9wdGlvbnMubGlmZWN5Y2xlPy5vblN0YXJ0Py4oc2VydmVyKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goYXN5bmMgKGVycikgPT4ge1xuICAgICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoXCJGYWlsZWQgdG8gc3RhcnQgc2VydmVyOlwiLCBlcnIpKTtcbiAgICAgICAgYXdhaXQgc2h1dGRvd24oKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZGVzdHJveSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IEJhc2VNb2RlbCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZGF0YWJhc2UvYmFzZS1tb2RlbFwiKTtcbiAgICAvLyDrqLzsoIAg7LKY66as7ZW07JW87ZWoLlxuICAgIGF3YWl0IEJhc2VNb2RlbC5kZXN0cm95KCk7XG4gICAgLy8gV2ViU29ja2V0IHNodXRkb3duIGZpcnN0IHRvIGZsdXNoIHRlbGVtZXRyeVxuICAgIGlmICh0aGlzLl93ZWJzb2NrZXRSdW50aW1lKSB7XG4gICAgICBhd2FpdCB0aGlzLl93ZWJzb2NrZXRSdW50aW1lLnNodXRkb3duKCk7XG4gICAgfVxuICAgIHRoaXMuX3dlYnNvY2tldFJ1bnRpbWUgPSBudWxsO1xuICAgIC8vIFRoZW4gc2h1dCBkb3duIHJlbWFpbmluZyByZXNvdXJjZXMgaW4gcGFyYWxsZWxcbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW1xuICAgICAgdGhpcy5fd29ya2Zsb3dzPy5kZXN0cm95KCkgPz8gUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgICB0aGlzLl9jYWNoZT8uZGlzY29ubmVjdCgpID8/IFByb21pc2UucmVzb2x2ZSgpLFxuICAgICAgdGhpcy5fZGV2Vml0ZXN0TWFuYWdlcj8uc2h1dGRvd24oKSA/PyBQcm9taXNlLnJlc29sdmUoKSxcbiAgICAgIHRoaXMud2F0Y2hlcj8uY2xvc2UoKSA/PyBQcm9taXNlLnJlc29sdmUoKSxcbiAgICBdKTtcbiAgICAvLyBMb2dUYXBlIGRpc3Bvc2UgYWZ0ZXIgV1Mgc2h1dGRvd24gc28gdGVsZW1ldHJ5IHJlY29yZHMgYXJlIGZsdXNoZWQgZmlyc3RcbiAgICBhd2FpdCBsb2d0YXBlRGlzcG9zZSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFdlYlNvY2tldFRlbGVtZXRyeUNvbnRleHQoXG4gIHdzOiBXZWJTb2NrZXRDb25uZWN0aW9uPFdlYlNvY2tldEV2ZW50TWFwLCBXZWJTb2NrZXRFdmVudE1hcD4sXG4pOiBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uQ29udGV4dCB7XG4gIGlmICghaXNUZWxlbWV0cnlDb250ZXh0UHJvdmlkZXIod3MpKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcmV0dXJuIHdzLmdldFRlbGVtZXRyeUNvbnRleHQoKTtcbn1cblxuZnVuY3Rpb24gaXNUZWxlbWV0cnlDb250ZXh0UHJvdmlkZXIoXG4gIHdzOiBXZWJTb2NrZXRDb25uZWN0aW9uPFdlYlNvY2tldEV2ZW50TWFwLCBXZWJTb2NrZXRFdmVudE1hcD4sXG4pOiB3cyBpcyBXZWJTb2NrZXRDb25uZWN0aW9uPFdlYlNvY2tldEV2ZW50TWFwLCBXZWJTb2NrZXRFdmVudE1hcD4gJiBUZWxlbWV0cnlDb250ZXh0UHJvdmlkZXIge1xuICByZXR1cm4gXCJnZXRUZWxlbWV0cnlDb250ZXh0XCIgaW4gd3MgJiYgdHlwZW9mIHdzLmdldFRlbGVtZXRyeUNvbnRleHQgPT09IFwiZnVuY3Rpb25cIjtcbn1cblxuZXhwb3J0IGNvbnN0IFNvbmFtdSA9IG5ldyBTb25hbXVDbGFzcygpO1xuXG4vKipcbiAqIHN0cmVhbSDrqqjrk5zsl5DshJwg7YKkIOyDneyEsSDtlajsiJjqsIAg7KeA7KCV65CY7KeAIOyViuyVmOydhCDrlYwg7IKs7Jqp7ZWY64qUIOq4sOuzuCDtlajsiJjsnoXri4jri6QuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRLZXlHZW5lcmF0b3IoZmlsZTogeyBmaWxlbmFtZTogc3RyaW5nOyBtaW1ldHlwZTogc3RyaW5nIH0pOiBzdHJpbmcge1xuICBjb25zdCBleHQgPSBtaW1lLmV4dGVuc2lvbihmaWxlLm1pbWV0eXBlKSB8fCBcImJpblwiO1xuICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICBjb25zdCByYW5kb20gPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCA4KTtcbiAgcmV0dXJuIGB1cGxvYWRzLyR7dGltZXN0YW1wfS0ke3JhbmRvbX0uJHtleHR9YDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VGltZShtczogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgZm9ybWF0dGVkID0gbXMgPj0gMTAwMCA/IGAkeyhtcyAvIDEwMDApLnRvRml4ZWQoMil9c2AgOiBgJHtNYXRoLnJvdW5kKG1zKX1tc2A7XG4gIHJldHVybiBgICgke2Zvcm1hdHRlZH0pYDtcbn1cblxuY29uc3QgTE9DQUxfSE9TVFMgPSBuZXcgU2V0KFtcImxvY2FsaG9zdFwiLCBcIjEyNy4wLjAuMVwiLCBcIjAuMC4wLjBcIiwgXCI6OjFcIl0pO1xuZnVuY3Rpb24gaXNMb2NhbEhvc3QoaG9zdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBMT0NBTF9IT1NUUy5oYXMoaG9zdCk7XG59XG5cbi8vIGAuZXZlcnkoKWDqsIAg7LKrIGd1YXJkIOydtO2bhCDsiJztmozrpbwg66mI7LaU64qUIOusuOygnOqwgCDsnojslrQgYGZvci4uLm9mYOuhnCDrqqjrk6AgZ3VhcmTrpbwg7Iic7ISc64yA66GcIOyLpO2Wie2VmOuPhOuhnSDqs6DsoJXtlahcbmZ1bmN0aW9uIHJ1bkd1YXJkcyh7XG4gIGd1YXJkcyxcbiAgY29uZmlnLFxuICByZXF1ZXN0LFxuICBhcGksXG59OiB7XG4gIGd1YXJkczogRXh0ZW5kZWRBcGlbXCJvcHRpb25zXCJdW1wiZ3VhcmRzXCJdIHwgdW5kZWZpbmVkO1xuICBjb25maWc6IFBpY2s8U29uYW11RmFzdGlmeUNvbmZpZywgXCJndWFyZEhhbmRsZXJcIj47XG4gIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0O1xuICBhcGk6IEV4dGVuZGVkQXBpO1xufSk6IHZvaWQge1xuICBmb3IgKGNvbnN0IGd1YXJkIG9mIGd1YXJkcyA/PyBbXSkge1xuICAgIGNvbmZpZy5ndWFyZEhhbmRsZXIoZ3VhcmQsIHJlcXVlc3QsIGFwaSk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxN0RBLFNBQVMsNkJBQ1AsSUFDcUM7QUFDckMsS0FBSSxDQUFDLDJCQUEyQixHQUFHLEVBQUU7QUFDbkMsU0FBTyxFQUFFOztBQUdYLFFBQU8sR0FBRyxxQkFBcUI7O0FBR2pDLFNBQVMsMkJBQ1AsSUFDNEY7QUFDNUYsUUFBTyx5QkFBeUIsTUFBTSxPQUFPLEdBQUcsd0JBQXdCOzs7OztBQVExRSxTQUFTLG9CQUFvQixNQUFzRDtDQUNqRixNQUFNLE1BQU0sS0FBSyxVQUFVLEtBQUssU0FBUyxJQUFJO0NBQzdDLE1BQU0sWUFBWSxLQUFLLEtBQUs7Q0FDNUIsTUFBTSxTQUFTLEtBQUssUUFBUSxDQUFDLFNBQVMsR0FBRyxDQUFDLE1BQU0sR0FBRyxFQUFFO0FBQ3JELFFBQU8sV0FBVyxVQUFVLEdBQUcsT0FBTyxHQUFHOztBQUczQyxTQUFTLFdBQVcsSUFBb0I7Q0FDdEMsTUFBTSxZQUFZLE1BQU0sTUFBTyxJQUFJLEtBQUssS0FBTSxRQUFRLEVBQUUsQ0FBQyxLQUFLLEdBQUcsS0FBSyxNQUFNLEdBQUcsQ0FBQztBQUNoRixRQUFPLEtBQUssVUFBVTs7QUFJeEIsU0FBUyxZQUFZLE1BQXVCO0FBQzFDLFFBQU8sWUFBWSxJQUFJLEtBQUs7O0FBSTlCLFNBQVMsVUFBVSxFQUNqQixRQUNBLFFBQ0EsU0FDQSxPQU1PO0FBQ1AsTUFBSyxNQUFN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