sonamu 0.11.16 → 0.12.0

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 (65) hide show
  1. package/dist/api/sonamu.d.ts.map +1 -1
  2. package/dist/api/sonamu.js +12 -7
  3. package/dist/index.d.ts +1 -0
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +4 -2
  6. package/dist/stream/__tests__/ws-test-helpers.d.ts +108 -0
  7. package/dist/stream/__tests__/ws-test-helpers.d.ts.map +1 -0
  8. package/dist/stream/__tests__/ws-test-helpers.js +260 -0
  9. package/dist/stream/index.d.ts +1 -0
  10. package/dist/stream/index.d.ts.map +1 -1
  11. package/dist/stream/index.js +4 -2
  12. package/dist/stream/ws-audience-resolver.d.ts +8 -5
  13. package/dist/stream/ws-audience-resolver.d.ts.map +1 -1
  14. package/dist/stream/ws-audience-resolver.js +16 -13
  15. package/dist/stream/ws-cluster-bus.d.ts +9 -4
  16. package/dist/stream/ws-cluster-bus.d.ts.map +1 -1
  17. package/dist/stream/ws-cluster-bus.js +1 -1
  18. package/dist/stream/ws-core.d.ts +10 -0
  19. package/dist/stream/ws-core.d.ts.map +1 -1
  20. package/dist/stream/ws-delivery.d.ts +30 -4
  21. package/dist/stream/ws-delivery.d.ts.map +1 -1
  22. package/dist/stream/ws-delivery.js +199 -52
  23. package/dist/stream/ws-frame.d.ts +15 -0
  24. package/dist/stream/ws-frame.d.ts.map +1 -0
  25. package/dist/stream/ws-frame.js +29 -0
  26. package/dist/stream/ws-local-connection-store.d.ts +4 -4
  27. package/dist/stream/ws-local-connection-store.d.ts.map +1 -1
  28. package/dist/stream/ws-local-connection-store.js +2 -2
  29. package/dist/stream/ws-presence-index.d.ts +36 -0
  30. package/dist/stream/ws-presence-index.d.ts.map +1 -0
  31. package/dist/stream/ws-presence-index.js +177 -0
  32. package/dist/stream/ws-presence-store.d.ts +39 -39
  33. package/dist/stream/ws-presence-store.d.ts.map +1 -1
  34. package/dist/stream/ws-presence-store.js +22 -152
  35. package/dist/stream/ws-registry.d.ts +45 -17
  36. package/dist/stream/ws-registry.d.ts.map +1 -1
  37. package/dist/stream/ws-registry.js +169 -60
  38. package/dist/stream/ws-session-id.d.ts +14 -0
  39. package/dist/stream/ws-session-id.d.ts.map +1 -0
  40. package/dist/stream/ws-session-id.js +37 -0
  41. package/dist/stream/ws.d.ts +20 -10
  42. package/dist/stream/ws.d.ts.map +1 -1
  43. package/dist/stream/ws.js +59 -36
  44. package/package.json +1 -1
  45. package/src/api/__tests__/sonamu.websocket-routes.test.ts +234 -0
  46. package/src/api/__tests__/sonamu.websocket.test.ts +241 -20
  47. package/src/api/sonamu.ts +20 -7
  48. package/src/index.ts +1 -0
  49. package/src/stream/__tests__/ws-contracts.test.ts +483 -265
  50. package/src/stream/__tests__/ws-multinode.test.ts +326 -0
  51. package/src/stream/__tests__/ws-registry-async.test.ts +855 -0
  52. package/src/stream/__tests__/ws-test-helpers.ts +360 -0
  53. package/src/stream/__tests__/ws.test.ts +342 -145
  54. package/src/stream/index.ts +1 -0
  55. package/src/stream/ws-audience-resolver.ts +21 -19
  56. package/src/stream/ws-cluster-bus.ts +12 -4
  57. package/src/stream/ws-core.ts +14 -0
  58. package/src/stream/ws-delivery.ts +321 -97
  59. package/src/stream/ws-frame.ts +39 -0
  60. package/src/stream/ws-local-connection-store.ts +10 -9
  61. package/src/stream/ws-presence-index.ts +273 -0
  62. package/src/stream/ws-presence-store.ts +64 -284
  63. package/src/stream/ws-registry.ts +272 -85
  64. package/src/stream/ws-session-id.ts +39 -0
  65. package/src/stream/ws.ts +91 -50
@@ -804,6 +804,10 @@ var init_sonamu = __esmMin((() => {
804
804
  this.aotHttpValidatorRegistry = nextAotRegistry;
805
805
  this.preparedApis = nextApis;
806
806
  this.preparedModels = nextModels;
807
+ this.websocketRuntimeValue?.replaceRoutes(nextApis.flatMap((api) => api.websocketOptions ? [{
808
+ routeKey: api.path,
809
+ outEvents: api.websocketOptions.outEvents
810
+ }] : []));
807
811
  }
808
812
  createWebSocketUpgradeRequiredHandler() {
809
813
  return async (_request, reply) => {
@@ -846,7 +850,8 @@ var init_sonamu = __esmMin((() => {
846
850
  preRegisterPhase = "query";
847
851
  const reqBody = await this.parseWebSocketRequestParams(api, request);
848
852
  preRegisterPhase = "register";
849
- rawWs = this.websocketRuntime.registerConnection(socket, {
853
+ rawWs = await this.websocketRuntime.registerConnection(socket, {
854
+ routeKey: api.path,
850
855
  outEvents: api.websocketOptions.outEvents,
851
856
  inEvents: api.websocketOptions.inEvents,
852
857
  namespace: api.websocketOptions.namespace,
@@ -867,7 +872,7 @@ var init_sonamu = __esmMin((() => {
867
872
  api
868
873
  });
869
874
  });
870
- this.websocketRuntime.activateConnection(rawWs.id);
875
+ await this.websocketRuntime.activateConnection(rawWs.id);
871
876
  preRegisterPhase = "handler";
872
877
  const { ApiParamType } = await import("../types/types.js");
873
878
  const args = api.parameters.map((param) => {
@@ -1010,16 +1015,16 @@ var init_sonamu = __esmMin((() => {
1010
1015
  return ws.waitForClose();
1011
1016
  },
1012
1017
  join(roomId) {
1013
- ws.join(roomId);
1018
+ return ws.join(roomId);
1014
1019
  },
1015
1020
  leave(roomId) {
1016
- ws.leave(roomId);
1021
+ return ws.leave(roomId);
1017
1022
  },
1018
1023
  setUserId(userId) {
1019
- ws.setUserId(userId);
1024
+ return ws.setUserId(userId);
1020
1025
  },
1021
1026
  clearUserId() {
1022
- ws.clearUserId();
1027
+ return ws.clearUserId();
1023
1028
  }
1024
1029
  };
1025
1030
  }
@@ -1408,4 +1413,4 @@ var init_sonamu = __esmMin((() => {
1408
1413
  init_sonamu();
1409
1414
  export { Sonamu, createWebSocketReplyStub, defaultSonamuHttpValidatorDependencies, init_sonamu, resolveWebSocketCloseDescriptor, resolveWebSocketPluginOptions };
1410
1415
 
1411
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LmpzIiwibmFtZXMiOlsibWltZUxvb2t1cCIsImxvZ3RhcGVEaXNwb3NlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9zb25hbXUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiYXN5bmNfaG9va3NcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IHR5cGUgSW5jb21pbmdNZXNzYWdlLCB0eXBlIFNlcnZlciwgdHlwZSBTZXJ2ZXJSZXNwb25zZSB9IGZyb20gXCJodHRwXCI7XG5pbXBvcnQgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgXCJAZmFzdGlmeS93ZWJzb2NrZXRcIjtcbmltcG9ydCB7IGRpc3Bvc2UgYXMgbG9ndGFwZURpc3Bvc2UgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHsgdHlwZSBBdXRoLCB0eXBlIEJldHRlckF1dGhPcHRpb25zIH0gZnJvbSBcImJldHRlci1hdXRoXCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyB0eXBlIEZTV2F0Y2hlciB9IGZyb20gXCJjaG9raWRhclwiO1xuaW1wb3J0IHsgdHlwZSBGYXN0aWZ5SW5zdGFuY2UsIHR5cGUgRmFzdGlmeVJlcGx5LCB0eXBlIEZhc3RpZnlSZXF1ZXN0IH0gZnJvbSBcImZhc3RpZnlcIjtcbmltcG9ydCBtaW1lLCB7IGxvb2t1cCBhcyBtaW1lTG9va3VwIH0gZnJvbSBcIm1pbWUtdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgV2ViU29ja2V0IH0gZnJvbSBcIndzXCI7XG5pbXBvcnQgeyB0eXBlIFpvZE9iamVjdCB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgQkFTRV9GSUVMRF9NQVBQSU5HUyB9IGZyb20gXCIuLi9hdXRoL2JldHRlci1hdXRoLWVudGl0aWVzXCI7XG5pbXBvcnQgeyBjcmVhdGVCZXR0ZXJBdXRoUmVxdWVzdCB9IGZyb20gXCIuLi9hdXRoL2JldHRlci1hdXRoLXJlcXVlc3RcIjtcbmltcG9ydCB7IGFwcGx5Q2FjaGVIZWFkZXJzLCBDYWNoZVByZXNldHMgfSBmcm9tIFwiLi4vY2FjaGUtY29udHJvbC9jYWNoZS1jb250cm9sXCI7XG5pbXBvcnQgeyB0eXBlIENhY2hlQ29udHJvbENvbmZpZywgdHlwZSBDYWNoZUNvbnRyb2xSZXF1ZXN0IH0gZnJvbSBcIi4uL2NhY2hlLWNvbnRyb2wvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgQ2FjaGVDb25maWcsIHR5cGUgQ2FjaGVNYW5hZ2VyIH0gZnJvbSBcIi4uL2NhY2hlL3R5cGVzXCI7XG5pbXBvcnQgeyB0b0Zhc3RpZnlDb21wcmVzc09wdGlvbiB9IGZyb20gXCIuLi9jb21wcmVzcy9jb21wcmVzc1wiO1xuaW1wb3J0IHsgdHlwZSBDb21wcmVzc09wdGlvbnMgfSBmcm9tIFwiLi4vY29tcHJlc3MvdHlwZXNcIjtcbmltcG9ydCB7IERCIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyB0eXBlIFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBTRCwgc2V0U0RDb25maWcgfSBmcm9tIFwiLi4vZGljdC9zZFwiO1xuaW1wb3J0IHsgdHlwZSBMb2NhbGl6ZWRTdHJpbmcgfSBmcm9tIFwiLi4vZGljdC90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0U29uYW11RW52aXJvbm1lbnQsIHJlYWRBbGxFbnZpcm9ubWVudFNuYXBzaG90cyB9IGZyb20gXCIuLi9lbnZcIjtcbmltcG9ydCB7IE5vdEZvdW5kRXhjZXB0aW9uIH0gZnJvbSBcIi4uL2V4Y2VwdGlvbnMvc28tZXhjZXB0aW9uc1wiO1xuaW1wb3J0IHsgcnVudGltZVR5cGVPZiB9IGZyb20gXCIuLi9ydW50aW1lLXR5cGVcIjtcbmltcG9ydCB7IEJ1ZmZlcmVkRmlsZSB9IGZyb20gXCIuLi9zdG9yYWdlL2J1ZmZlcmVkLWZpbGVcIjtcbmltcG9ydCB7IHR5cGUgU3RvcmFnZU1hbmFnZXIgfSBmcm9tIFwiLi4vc3RvcmFnZS9zdG9yYWdlLW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgS2V5R2VuZXJhdG9yIH0gZnJvbSBcIi4uL3N0b3JhZ2UvdHlwZXNcIjtcbmltcG9ydCB7IFVwbG9hZGVkRmlsZSB9IGZyb20gXCIuLi9zdG9yYWdlL3VwbG9hZGVkLWZpbGVcIjtcbmltcG9ydCB7IGNyZWF0ZU1vY2tTU0VGYWN0b3J5IH0gZnJvbSBcIi4uL3N0cmVhbS9zc2VcIjtcbmltcG9ydCB7XG4gIHR5cGUgQW55V2ViU29ja2V0Q29ubmVjdGlvbixcbiAgV2ViU29ja2V0UnVudGltZSxcbiAgdHlwZSBXZWJTb2NrZXRDb25uZWN0aW9uLFxufSBmcm9tIFwiLi4vc3RyZWFtL3dzXCI7XG5pbXBvcnQge1xuICB0eXBlIFRlbGVtZXRyeUNvbnRleHRQcm92aWRlcixcbiAgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uQ29udGV4dCxcbn0gZnJvbSBcIi4uL3N0cmVhbS93cy10ZWxlbWV0cnlcIjtcbmltcG9ydCB7IHR5cGUgTG9hZGVkTW9kZWxzIH0gZnJvbSBcIi4uL3N5bmNlci9tb2R1bGUtbG9hZGVyXCI7XG5pbXBvcnQgeyB0eXBlIFN5bmNlciB9IGZyb20gXCIuLi9zeW5jZXIvc3luY2VyXCI7XG5pbXBvcnQgeyB0eXBlIFdvcmtmbG93TWFuYWdlciB9IGZyb20gXCIuLi90YXNrcy93b3JrZmxvdy1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIERldlZpdGVzdE1hbmFnZXIgfSBmcm9tIFwiLi4vdGVzdGluZy9kZXYtdml0ZXN0LW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgU29uYW11RmFzdGlmeUNvbmZpZyB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgY2VudGVyVGV4dCB9IGZyb20gXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIjtcbmltcG9ydCB7IGlzRGFlbW9uU2VydmVyIH0gZnJvbSBcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIjtcbmltcG9ydCB7IGV4aXN0cywgZmlsZUV4aXN0cyB9IGZyb20gXCIuLi91dGlscy9mcy11dGlsc1wiO1xuaW1wb3J0IHsgdHlwZSBBYnNvbHV0ZVBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiO1xuaW1wb3J0IHtcbiAgaXNCaWdJbnRWYWx1ZSxcbiAgaXNGdW5jdGlvblZhbHVlLFxuICBpc051bWJlclZhbHVlLFxuICBpc09iamVjdFZhbHVlLFxuICBpc1N0cmluZ1ZhbHVlLFxuICBpc1N5bWJvbFZhbHVlLFxufSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuaW1wb3J0IHsgY29udmVydEZhc3RpZnlIZWFkZXJzVG9TdGFuZGFyZCwgbWVyZ2UgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZVpvZENvbXBpbGVyUG9saWN5LFxuICB0eXBlIFNvbmFtdUNvbmZpZyxcbiAgdHlwZSBTb25hbXVTZXJ2ZXJPcHRpb25zLFxuICB0eXBlIFNvbmFtdVRhc2tPcHRpb25zLFxufSBmcm9tIFwiLi9jb25maWdcIjtcbmltcG9ydCB7IHR5cGUgQ29udGV4dCwgdHlwZSBSdW50aW1lQ29udGV4dCwgdHlwZSBXZWJTb2NrZXRDb250ZXh0IH0gZnJvbSBcIi4vY29udGV4dFwiO1xuaW1wb3J0IHsgdHlwZSBFeHRlbmRlZEFwaSB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7XG4gIGFzc2VydEh0dHBWYWxpZGF0b3JSZWdpc3RyeSxcbiAgY3JlYXRlSHR0cFZhbGlkYXRvcixcbiAgZ2V0SHR0cFZhbGlkYXRvclJvdXRlS2V5LFxuICB0eXBlIEh0dHBWYWxpZGF0b3IsXG4gIHR5cGUgSHR0cFZhbGlkYXRvclJlZ2lzdHJ5LFxufSBmcm9tIFwiLi9odHRwLXZhbGlkYXRvclwiO1xuaW1wb3J0IHsgZ2V0U2VjcmV0cyB9IGZyb20gXCIuL3NlY3JldFwiO1xuaW1wb3J0IHsgdHlwZSBTb25hbXVTZWNyZXRzIH0gZnJvbSBcIi4vc2VjcmV0XCI7XG5pbXBvcnQge1xuICBjcmVhdGVXZWJTb2NrZXRSZXBseVN0dWIsXG4gIHJlc29sdmVXZWJTb2NrZXRDbG9zZURlc2NyaXB0b3IsXG4gIHJlc29sdmVXZWJTb2NrZXRQbHVnaW5PcHRpb25zLFxuICByZXNvbHZlSW50ZWdyYXRlZFZpdGVIbXJPcHRpb25zLFxufSBmcm9tIFwiLi93ZWJzb2NrZXQtaGVscGVyc1wiO1xuXG5leHBvcnQge1xuICBjcmVhdGVXZWJTb2NrZXRSZXBseVN0dWIsXG4gIHJlc29sdmVXZWJTb2NrZXRDbG9zZURlc2NyaXB0b3IsXG4gIHJlc29sdmVXZWJTb2NrZXRQbHVnaW5PcHRpb25zLFxufSBmcm9tIFwiLi93ZWJzb2NrZXQtaGVscGVyc1wiO1xuXG5pbnRlcmZhY2UgVXBsb2FkZWRSZXF1ZXN0RmlsZXMge1xuICBidWZmZXJlZEZpbGVzOiBCdWZmZXJlZEZpbGVbXTtcbiAgdXBsb2FkZWRGaWxlczogVXBsb2FkZWRGaWxlW107XG59XG5cbnR5cGUgQXBpQXJndW1lbnQgPVxuICB8IHN0cmluZ1xuICB8IG51bWJlclxuICB8IGJvb2xlYW5cbiAgfCBiaWdpbnRcbiAgfCBzeW1ib2xcbiAgfCBDYWxsYWJsZUZ1bmN0aW9uXG4gIHwgb2JqZWN0XG4gIHwgbnVsbFxuICB8IHVuZGVmaW5lZDtcbnR5cGUgQXBpTWV0aG9kUmVzdWx0ID0gQXBpQXJndW1lbnQgfCB2b2lkO1xuXG5mdW5jdGlvbiB0b0FwaUFyZ3VtZW50PFZhbHVlPih2YWx1ZTogVmFsdWUpOiBBcGlBcmd1bWVudCB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodmFsdWUgPT09IHRydWUpIHJldHVybiB0cnVlO1xuICBpZiAodmFsdWUgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gIGlmIChpc1N0cmluZ1ZhbHVlKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICBpZiAoaXNOdW1iZXJWYWx1ZSh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgaWYgKGlzQmlnSW50VmFsdWUodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gIGlmIChpc1N5bWJvbFZhbHVlKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICBpZiAoaXNGdW5jdGlvblZhbHVlKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICBpZiAoaXNPYmplY3RWYWx1ZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFwi7KeA7JuQ7ZWY7KeAIOyViuuKlCBBUEkg7J247IiYIO2DgOyeheyeheuLiOuLpC5cIik7XG59XG5cbmZ1bmN0aW9uIHRvQXBpQXJndW1lbnRNYXA8VmFsdWUgZXh0ZW5kcyBvYmplY3Q+KHZhbHVlOiBWYWx1ZSk6IE1hcDxzdHJpbmcsIEFwaUFyZ3VtZW50PiB7XG4gIHJldHVybiBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKHZhbHVlKS5tYXAoKFtrZXksIGl0ZW1dKSA9PiBba2V5LCB0b0FwaUFyZ3VtZW50KGl0ZW0pXSkpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVVbmF2YWlsYWJsZVNTRTxUIGV4dGVuZHMgWm9kT2JqZWN0PihfZXZlbnRzOiBUKTogbmV2ZXIge1xuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgXCJjcmVhdGVTU0UgaXMgbm90IGF2YWlsYWJsZSBpbiB3ZWJzb2NrZXQgY29udGV4dC4gRGVmaW5lIHdlYnNvY2tldENvbnRleHRQcm92aWRlciBpZiB5b3VyIGNvbnRleHQgc2V0dXAgZGVwZW5kcyBvbiBTU0UgaGVscGVycy5cIixcbiAgKTtcbn1cblxuZnVuY3Rpb24gcHJpbnREaW1TdW1tYXJ5KG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICBjb25zb2xlLmxvZyhjaGFsay5kaW0oYOKckyAke21lc3NhZ2V9YCkpO1xufVxuXG5mdW5jdGlvbiBwcmludEdyZWVuU3VtbWFyeShtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyAke21lc3NhZ2V9YCkpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvbmFtdVRlc3RpbmdTbmFwc2hvdCB7XG4gIGFwaVJvb3RQYXRoOiBBYnNvbHV0ZVBhdGggfCBudWxsO1xuICBjb25maWc6IFNvbmFtdUNvbmZpZyB8IG51bGw7XG4gIHN5bmNlcjogU3luY2VyIHwgbnVsbDtcbiAgaHR0cFZhbGlkYXRvcnM6IFdlYWtNYXA8RXh0ZW5kZWRBcGksIEh0dHBWYWxpZGF0b3I+O1xuICBwZW5kaW5nSHR0cFZhbGlkYXRvcnM6IFdlYWtNYXA8RXh0ZW5kZWRBcGksIFByb21pc2U8SHR0cFZhbGlkYXRvcj4+O1xuICBhb3RIdHRwVmFsaWRhdG9yUmVnaXN0cnk6IEh0dHBWYWxpZGF0b3JSZWdpc3RyeSB8IHVuZGVmaW5lZDtcbiAgcHJlcGFyZWRBcGlzOiByZWFkb25seSBFeHRlbmRlZEFwaVtdO1xuICBwcmVwYXJlZE1vZGVsczogTG9hZGVkTW9kZWxzO1xuICB3ZWJzb2NrZXRSdW50aW1lOiBXZWJTb2NrZXRSdW50aW1lIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTb25hbXVIdHRwVmFsaWRhdG9yRGVwZW5kZW5jaWVzIHtcbiAgY3JlYXRlVmFsaWRhdG9yOiB0eXBlb2YgY3JlYXRlSHR0cFZhbGlkYXRvcjtcbiAgYXNzZXJ0UmVnaXN0cnk6IHR5cGVvZiBhc3NlcnRIdHRwVmFsaWRhdG9yUmVnaXN0cnk7XG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0U29uYW11SHR0cFZhbGlkYXRvckRlcGVuZGVuY2llczogU29uYW11SHR0cFZhbGlkYXRvckRlcGVuZGVuY2llcyA9IHtcbiAgY3JlYXRlVmFsaWRhdG9yOiBjcmVhdGVIdHRwVmFsaWRhdG9yLFxuICBhc3NlcnRSZWdpc3RyeTogYXNzZXJ0SHR0cFZhbGlkYXRvclJlZ2lzdHJ5LFxufTtcblxuY2xhc3MgU29uYW11Q2xhc3Mge1xuICBwdWJsaWMgaXNJbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgZm9yVGVzdGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgYXN5bmNMb2NhbFN0b3JhZ2U6IEFzeW5jTG9jYWxTdG9yYWdlPHtcbiAgICBjb250ZXh0OiBSdW50aW1lQ29udGV4dDtcbiAgfT4gPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2UoKTtcbiAgcHJpdmF0ZSBodHRwVmFsaWRhdG9yczogV2Vha01hcDxFeHRlbmRlZEFwaSwgSHR0cFZhbGlkYXRvcj4gPSBuZXcgV2Vha01hcCgpO1xuICBwcml2YXRlIHBlbmRpbmdIdHRwVmFsaWRhdG9yczogV2Vha01hcDxFeHRlbmRlZEFwaSwgUHJvbWlzZTxIdHRwVmFsaWRhdG9yPj4gPSBuZXcgV2Vha01hcCgpO1xuICBwcml2YXRlIGFvdEh0dHBWYWxpZGF0b3JSZWdpc3RyeTogSHR0cFZhbGlkYXRvclJlZ2lzdHJ5IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHByZXBhcmVkQXBpczogcmVhZG9ubHkgRXh0ZW5kZWRBcGlbXSA9IFtdO1xuICBwcml2YXRlIHByZXBhcmVkTW9kZWxzOiBMb2FkZWRNb2RlbHMgPSB7fTtcblxuICBwdWJsaWMgZ2V0Q29udGV4dDxUIGV4dGVuZHMgUnVudGltZUNvbnRleHQgPSBDb250ZXh0PigpOiBUIHtcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgICBpZiAoc3RvcmU/LmNvbnRleHQpIHtcbiAgICAgIHJldHVybiAvKiBTQUZFVFk6IEFQSSDrjbDsvZTroIjsnbTthLDsmYAgWm9kIOqygOymneq4sCDrk7HroZ0g6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gc3RvcmUuY29udGV4dCBhcyBUO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJ0ZXN0XCIpIHtcbiAgICAgIC8vIO2FjOyKpO2MhSDtmZjqsr3sl5DshJwg7Luo7YWN7Iqk7Yq46rCAIOyjvOyeheuQmOyngCDslYrsnYAg6rK97JqwIOu5iCDsu6jthY3siqTtirgg66as7YS0XG4gICAgICBjb25zdCBtb2NrQ29udGV4dCA9IHtcbiAgICAgICAgdHJhbnNwb3J0OiBcImh0dHBcIixcbiAgICAgICAgcmVxdWVzdDogbnVsbCxcbiAgICAgICAgcmVwbHk6IG51bGwsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBjcmVhdGVTU0U6IChzY2hlbWE6IFpvZE9iamVjdCkgPT4gY3JlYXRlTW9ja1NTRUZhY3Rvcnkoc2NoZW1hKSxcbiAgICAgICAgbG9jYWxlOiBcIlwiLFxuICAgICAgICB1c2VyOiBudWxsLFxuICAgICAgICBzZXNzaW9uOiBudWxsLFxuICAgICAgICBuYWl0ZVN0b3JlOiBuZXcgTWFwPHN0cmluZywgYW55PigpLFxuICAgICAgfTtcbiAgICAgIC8vIFNBRkVUWTog7YWM7Iqk7Yq4IOq4sOuzuCDsu6jthY3siqTtirjripQgSFRUUCBDb250ZXh07J2066mwIOq4sOuzuCDsoJzrhKTrpq3qs7wg7J287LmY7ZWc64ukLlxuICAgICAgcmV0dXJuIC8qIFNBRkVUWTog7YWM7Iqk7Yq4IOq4sOuzuCDsu6jthY3siqTtirjripQg7JqU7LKtIOuylOychOqwgCDsl4bripQgSFRUUCDsu6jthY3siqTtirgg64yA7LK06rCS7J6F64uI64ukLiAqLyBtb2NrQ29udGV4dCBhcyBUICZcbiAgICAgICAgdHlwZW9mIG1vY2tDb250ZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgY2Fubm90IGZpbmQgY29udGV4dFwiKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwaVJvb3RQYXRoVmFsdWU6IEFic29sdXRlUGF0aCB8IG51bGwgPSBudWxsO1xuICBzZXQgYXBpUm9vdFBhdGgoYXBpUm9vdFBhdGg6IEFic29sdXRlUGF0aCkge1xuICAgIHRoaXMuYXBpUm9vdFBhdGhWYWx1ZSA9IGFwaVJvb3RQYXRoO1xuICB9XG4gIGdldCBhcGlSb290UGF0aCgpOiBBYnNvbHV0ZVBhdGgge1xuICAgIGlmICh0aGlzLmFwaVJvb3RQYXRoVmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFwaVJvb3RQYXRoVmFsdWU7XG4gIH1cbiAgZ2V0IGFwcFJvb3RQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYXBpUm9vdFBhdGguc3BsaXQocGF0aC5zZXApLnNsaWNlKDAsIC0xKS5qb2luKHBhdGguc2VwKTtcbiAgfVxuXG4gIHByaXZhdGUgZGJDb25maWdWYWx1ZTogU29uYW11REJDb25maWcgfCBudWxsID0gbnVsbDtcbiAgc2V0IGRiQ29uZmlnKGRiQ29uZmlnOiBTb25hbXVEQkNvbmZpZykge1xuICAgIHRoaXMuZGJDb25maWdWYWx1ZSA9IGRiQ29uZmlnO1xuICB9XG4gIGdldCBkYkNvbmZpZygpOiBTb25hbXVEQkNvbmZpZyB7XG4gICAgaWYgKHRoaXMuZGJDb25maWdWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZGJDb25maWdWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3luY2VyVmFsdWU6IFN5bmNlciB8IG51bGwgPSBudWxsO1xuICBzZXQgc3luY2VyKHN5bmNlcjogU3luY2VyKSB7XG4gICAgdGhpcy5zeW5jZXJWYWx1ZSA9IHN5bmNlcjtcbiAgfVxuICBnZXQgc3luY2VyKCk6IFN5bmNlciB7XG4gICAgaWYgKHRoaXMuc3luY2VyVmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN5bmNlclZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25maWdWYWx1ZTogU29uYW11Q29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIHNldCBjb25maWcoY29uZmlnOiBTb25hbXVDb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZ1ZhbHVlID0gY29uZmlnO1xuICB9XG4gIGdldCBjb25maWcoKTogU29uYW11Q29uZmlnIHtcbiAgICBpZiAodGhpcy5jb25maWdWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnVmFsdWU7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgc2VjcmV0czogU29uYW11U2VjcmV0cyA9IGdldFNlY3JldHMoKTtcblxuICBwcml2YXRlIHN0b3JhZ2VWYWx1ZTogU3RvcmFnZU1hbmFnZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIFN0b3JhZ2VNYW5hZ2VyIOyduOyKpO2EtOyKpFxuICAgKi9cbiAgZ2V0IHN0b3JhZ2UoKTogU3RvcmFnZU1hbmFnZXIge1xuICAgIGlmICghdGhpcy5zdG9yYWdlVmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlN0b3JhZ2UgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLiBDaGVjayBzdG9yYWdlIGNvbmZpZy5cIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0b3JhZ2VWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgY2FjaGVWYWx1ZTogQ2FjaGVNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIC8qKlxuICAgKiBDYWNoZU1hbmFnZXIg7J247Iqk7YS07IqkIChCZW50b0NhY2hlKVxuICAgKi9cbiAgZ2V0IGNhY2hlKCk6IENhY2hlTWFuYWdlciB7XG4gICAgaWYgKCF0aGlzLmNhY2hlVmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhY2hlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4gQ2hlY2sgY2FjaGUgY29uZmlnIGluIHNvbmFtdS5jb25maWcudHMuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jYWNoZVZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSB3b3JrZmxvd3NWYWx1ZTogV29ya2Zsb3dNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIGdldCB3b3JrZmxvd3MoKTogV29ya2Zsb3dNYW5hZ2VyIHtcbiAgICBpZiAodGhpcy53b3JrZmxvd3NWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy53b3JrZmxvd3NWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgYXV0aFZhbHVlOiBBdXRoPEJldHRlckF1dGhPcHRpb25zPiB8IG51bGwgPSBudWxsO1xuICBnZXQgYXV0aCgpOiBBdXRoPEJldHRlckF1dGhPcHRpb25zPiB7XG4gICAgaWYgKCF0aGlzLmF1dGhWYWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXV0aCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuIENoZWNrIGF1dGggY29uZmlnIGluIHNvbmFtdS5jb25maWcudHMuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hdXRoVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGRldlZpdGVzdE1hbmFnZXJWYWx1ZTogRGV2Vml0ZXN0TWFuYWdlciB8IG51bGwgPSBudWxsO1xuICBnZXQgZGV2Vml0ZXN0TWFuYWdlcigpOiBEZXZWaXRlc3RNYW5hZ2VyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZGV2Vml0ZXN0TWFuYWdlclZhbHVlO1xuICB9XG4gIHNldCBkZXZWaXRlc3RNYW5hZ2VyKG1hbmFnZXI6IERldlZpdGVzdE1hbmFnZXIgfCBudWxsKSB7XG4gICAgdGhpcy5kZXZWaXRlc3RNYW5hZ2VyVmFsdWUgPSBtYW5hZ2VyO1xuICB9XG5cbiAgLy8gU29uYW116rCAIHJ1bnRpbWXsnYQg7KeB7KCRIOyGjOycoO2VtCByZWdpc3RyeS9jb25uZWN0aW9uIGxpZmVjeWNsZeydhCDslaDtlIzrpqzsvIDsnbTshZgg7IiY66qF7KO86riw7JmAIOuPmeq4sO2ZlO2VqFxuICBwcml2YXRlIHdlYnNvY2tldFJ1bnRpbWVWYWx1ZTogV2ViU29ja2V0UnVudGltZSB8IG51bGwgPSBudWxsO1xuICAvLyDqsJnsnYAgRmFzdGlmeSDsnbjsiqTthLTsiqTsl5AgQGZhc3RpZnkvd2Vic29ja2V07J2EIOykkeuztSDrk7HroZ3tlZjripQg6rKD7J2EIFdlYWtTZXTsnLzroZwg7LCo64uo7ZWoXG4gIHByaXZhdGUgcmVhZG9ubHkgd2Vic29ja2V0UGx1Z2luU2VydmVycyA9IG5ldyBXZWFrU2V0PFxuICAgIEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+XG4gID4oKTtcbiAgZ2V0IHdlYnNvY2tldFJ1bnRpbWUoKTogV2ViU29ja2V0UnVudGltZSB7XG4gICAgaWYgKCF0aGlzLndlYnNvY2tldFJ1bnRpbWVWYWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV2ViU29ja2V0IHJ1bnRpbWUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMud2Vic29ja2V0UnVudGltZVZhbHVlO1xuICB9XG4gIHNldCB3ZWJzb2NrZXRSdW50aW1lKHJ1bnRpbWU6IFdlYlNvY2tldFJ1bnRpbWUgfCBudWxsKSB7XG4gICAgdGhpcy53ZWJzb2NrZXRSdW50aW1lVmFsdWUgPSBydW50aW1lO1xuICB9XG5cbiAgY2FwdHVyZVRlc3RpbmdTbmFwc2hvdCgpOiBTb25hbXVUZXN0aW5nU25hcHNob3Qge1xuICAgIHJldHVybiB7XG4gICAgICBhcGlSb290UGF0aDogdGhpcy5hcGlSb290UGF0aFZhbHVlLFxuICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZ1ZhbHVlLFxuICAgICAgc3luY2VyOiB0aGlzLnN5bmNlclZhbHVlLFxuICAgICAgaHR0cFZhbGlkYXRvcnM6IHRoaXMuaHR0cFZhbGlkYXRvcnMsXG4gICAgICBwZW5kaW5nSHR0cFZhbGlkYXRvcnM6IHRoaXMucGVuZGluZ0h0dHBWYWxpZGF0b3JzLFxuICAgICAgYW90SHR0cFZhbGlkYXRvclJlZ2lzdHJ5OiB0aGlzLmFvdEh0dHBWYWxpZGF0b3JSZWdpc3RyeSxcbiAgICAgIHByZXBhcmVkQXBpczogdGhpcy5wcmVwYXJlZEFwaXMsXG4gICAgICBwcmVwYXJlZE1vZGVsczogdGhpcy5wcmVwYXJlZE1vZGVscyxcbiAgICAgIHdlYnNvY2tldFJ1bnRpbWU6IHRoaXMud2Vic29ja2V0UnVudGltZVZhbHVlLFxuICAgIH07XG4gIH1cblxuICByZXN0b3JlVGVzdGluZ1NuYXBzaG90KHNuYXBzaG90OiBTb25hbXVUZXN0aW5nU25hcHNob3QpOiB2b2lkIHtcbiAgICB0aGlzLmFwaVJvb3RQYXRoVmFsdWUgPSBzbmFwc2hvdC5hcGlSb290UGF0aDtcbiAgICB0aGlzLmNvbmZpZ1ZhbHVlID0gc25hcHNob3QuY29uZmlnO1xuICAgIHRoaXMuc3luY2VyVmFsdWUgPSBzbmFwc2hvdC5zeW5jZXI7XG4gICAgdGhpcy5odHRwVmFsaWRhdG9ycyA9IHNuYXBzaG90Lmh0dHBWYWxpZGF0b3JzO1xuICAgIHRoaXMucGVuZGluZ0h0dHBWYWxpZGF0b3JzID0gc25hcHNob3QucGVuZGluZ0h0dHBWYWxpZGF0b3JzO1xuICAgIHRoaXMuYW90SHR0cFZhbGlkYXRvclJlZ2lzdHJ5ID0gc25hcHNob3QuYW90SHR0cFZhbGlkYXRvclJlZ2lzdHJ5O1xuICAgIHRoaXMucHJlcGFyZWRBcGlzID0gc25hcHNob3QucHJlcGFyZWRBcGlzO1xuICAgIHRoaXMucHJlcGFyZWRNb2RlbHMgPSBzbmFwc2hvdC5wcmVwYXJlZE1vZGVscztcbiAgICB0aGlzLndlYnNvY2tldFJ1bnRpbWVWYWx1ZSA9IHNuYXBzaG90LndlYnNvY2tldFJ1bnRpbWU7XG4gIH1cblxuICAvLyBITVIg7LKY66asOiDtjIzsnbwg7Iuc7Iqk7YWcIOqwkOyLnCArIEhNUi9zeW5jIOyCrOydtO2BtCDsi6TtlonsnYAgd2F0Y2hlciDrqqjrk4jroZwg7JyE7J6E7ZWp64uI64ukLlxuICBwdWJsaWMgd2F0Y2hlcjogRlNXYXRjaGVyIHwgbnVsbCA9IG51bGw7XG5cbiAgcHVibGljIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlIHwgbnVsbCA9IG51bGw7XG5cbiAgYXN5bmMgaW5pdEZvclRlc3RpbmcoKSB7XG4gICAgYXdhaXQgdGhpcy5pbml0KHRydWUsIGZhbHNlLCB1bmRlZmluZWQsIHRydWUpO1xuICB9XG5cbiAgYXN5bmMgaW5pdChcbiAgICBkb1NpbGVudDogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGVuYWJsZVN5bmM6IGJvb2xlYW4gPSB0cnVlLFxuICAgIGFwaVJvb3RQYXRoPzogQWJzb2x1dGVQYXRoLFxuICAgIGZvclRlc3Rpbmc6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKSB7XG4gICAgdGhpcy5mb3JUZXN0aW5nID0gZm9yVGVzdGluZztcblxuICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpbml0U3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcblxuICAgIC8vIEFQSSDro6jtirgg7Yyo7IqkXG4gICAgY29uc3QgeyBmaW5kQXBpUm9vdFBhdGggfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL3V0aWxzXCIpO1xuICAgIHRoaXMuYXBpUm9vdFBhdGggPSBhcGlSb290UGF0aCA/PyBmaW5kQXBpUm9vdFBhdGgoKTtcbiAgICBjb25zdCBiYXNlRW52QmVmb3JlQ29uZmlnTG9hZCA9IHsgLi4ucHJvY2Vzcy5lbnYgfTtcblxuICAgIC8vIOyEpOygleydhCDroZzrlKntlZjripQg6rKD67aA7YSwIOyLnOyekVxuICAgIGNvbnN0IGNvbmZpZ1N0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgY29uc3QgeyBsb2FkQ29uZmlnIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2NvbmZpZ1wiKTtcbiAgICB0aGlzLmNvbmZpZyA9IGF3YWl0IGxvYWRDb25maWcodGhpcy5hcGlSb290UGF0aCk7XG4gICAgY29uc3QgY29uZmlnVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpIC0gY29uZmlnU3RhcnQ7XG4gICAgc2V0U0RDb25maWcodGhpcy5jb25maWcuaTE4bik7XG4gICAgLy8gc29uYW11LmNvbmZpZy50cyDquLDrs7jqsJIg7ISk7KCVXG4gICAgdGhpcy5jb25maWcuZGF0YWJhc2UuZGF0YWJhc2UgPSB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kYXRhYmFzZSA/PyBcInBnXCI7XG4gICAgdGhpcy5jb25maWcuZGF0YWJhc2UuZGVmYXVsdE9wdGlvbnMgPSB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kZWZhdWx0T3B0aW9ucyA/PyB7fTtcbiAgICB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kZWZhdWx0T3B0aW9ucy5jbGllbnQgPSB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kYXRhYmFzZSA/PyBcInBnXCI7XG5cbiAgICAvLyDroZzquYUg7ISk7KCVXG4gICAgY29uc3QgeyBjb25maWd1cmVMb2dUYXBlIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9sb2dnZXIvY29uZmlndXJlXCIpO1xuICAgIGlmICh0aGlzLmNvbmZpZy5sb2dnaW5nICE9PSBmYWxzZSkge1xuICAgICAgYXdhaXQgY29uZmlndXJlTG9nVGFwZSh7XG4gICAgICAgIC4uLnRoaXMuY29uZmlnLmxvZ2dpbmcsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBEQiDroZzrk5xcbiAgICBjb25zdCB7IERCOiBSdW50aW1lREIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2RhdGFiYXNlL2RiXCIpO1xuICAgIGNvbnN0IHsgaXNMb2NhbDogaXNMb2NhbEVudmlyb25tZW50IH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9jb250cm9sbGVyXCIpO1xuICAgIGNvbnN0IGVudmlyb25tZW50U25hcHNob3RzID0gaXNMb2NhbEVudmlyb25tZW50KClcbiAgICAgID8gcmVhZEFsbEVudmlyb25tZW50U25hcHNob3RzKHRoaXMuYXBpUm9vdFBhdGgsIGJhc2VFbnZCZWZvcmVDb25maWdMb2FkKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5kYkNvbmZpZyA9IFJ1bnRpbWVEQi5nZW5lcmF0ZURCQ29uZmlnKFxuICAgICAgdGhpcy5jb25maWcuZGF0YWJhc2UsXG4gICAgICB0aGlzLmNvbmZpZy5wcm9qZWN0TmFtZSxcbiAgICAgIGVudmlyb25tZW50U25hcHNob3RzLFxuICAgICk7XG4gICAgUnVudGltZURCLnNldENvbmZpZyh0aGlzLmRiQ29uZmlnKTtcblxuICAgIC8vIEVudGl0eSDroZzrk5xcbiAgICAvLyDthYzsiqTtirjsl5DshJzrj4QgRW50aXR5IOygleuztOuKlCDtlYTsmpTtlanri4jri6QuXG4gICAgLy8gdXBzZXJ06rCAIOygnOuMgOuhnCDsnpHrj5ntlZjroKTrqbQgZW50aXR57J2YIHVuaXF1ZSBpbmRleCDsoJXrs7TqsIAg7ZWE7JqU7ZWY6riwIOuVjOusuOyeheuLiOuLpC5cbiAgICBjb25zdCB7IEVudGl0eU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiKTtcbiAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLmF1dG9sb2FkKGRvU2lsZW50KTtcblxuICAgIC8vIENhY2hlIOy0iOq4sO2ZlFxuICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZUNhY2hlKHRoaXMuY29uZmlnLnNlcnZlci5jYWNoZSwgZm9yVGVzdGluZyk7XG5cbiAgICAvLyBCZXR0ZXJBdXRoIOy0iOq4sO2ZlFxuICAgIGNvbnN0IGF1dGhDb25maWcgPSB0aGlzLmNvbmZpZy5zZXJ2ZXIuYXV0aDtcbiAgICBpZiAoYXV0aENvbmZpZykge1xuICAgICAgLy8g7IKs7Jqp7J6QIOyEpOygleqzvCDquLDrs7jqsJLsnYQgbWVyZ2VcbiAgICAgIGNvbnN0IG1lcmdlZEZpZWxkTWFwcGluZ3MgPSBtZXJnZShCQVNFX0ZJRUxEX01BUFBJTkdTLCBhdXRoQ29uZmlnKTtcblxuICAgICAgLy8gYmV0dGVyLWF1dGgg7J247Iqk7YS07IqkIOyDneyEsVxuICAgICAgY29uc3QgeyBiZXR0ZXJBdXRoIH0gPSBhd2FpdCBpbXBvcnQoXCJiZXR0ZXItYXV0aFwiKTtcbiAgICAgIGNvbnN0IHsgc29uYW11S25leEFkYXB0ZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2F1dGgva25leC1hZGFwdGVyXCIpO1xuXG4gICAgICBjb25zdCBhdXRoT3B0aW9uczogQmV0dGVyQXV0aE9wdGlvbnMgPSB7XG4gICAgICAgIGRhdGFiYXNlOiBzb25hbXVLbmV4QWRhcHRlcigpLFxuICAgICAgICAuLi5tZXJnZWRGaWVsZE1hcHBpbmdzLFxuICAgICAgfTtcbiAgICAgIHRoaXMuYXV0aFZhbHVlID0gYmV0dGVyQXV0aChhdXRoT3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLy8g7YWM7Iqk7YyF7J24IOqyveyasCDsi7Htgawg7JeG7J20IOykkeuLqFxuICAgIGlmIChmb3JUZXN0aW5nKSB7XG4gICAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRhc2sg65Ox66GdXG4gICAgYXdhaXQgdGhpcy5pbml0aWFsaXplV29ya2Zsb3dzKHRoaXMuY29uZmlnLnRhc2tzKTtcblxuICAgIC8vIFN5bmNlclxuICAgIGNvbnN0IHsgU3luY2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zeW5jZXIvc3luY2VyXCIpO1xuICAgIHRoaXMuc3luY2VyID0gbmV3IFN5bmNlcigpO1xuXG4gICAgLy8gQXV0b2xvYWQ6IE1vZGVscyAvIFR5cGVzIC8gQVBJcyAvIFdvcmtmbG93cyAvIFRlbXBsYXRlcyAvIFNTUiBSb3V0ZXNcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZFR5cGVzKCk7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuYXV0b2xvYWRNb2RlbHMoKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZEFwaXMoKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZFdvcmtmbG93cygpO1xuICAgIGNvbnN0IHsgVGVtcGxhdGVNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi90ZW1wbGF0ZVwiKTtcbiAgICBhd2FpdCBUZW1wbGF0ZU1hbmFnZXIuYXV0b2xvYWQoKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZFNzclJvdXRlcygpO1xuXG4gICAgY29uc3QgeyBpc0xvY2FsLCBpc1Rlc3QsIGlzSG90UmVsb2FkU2VydmVyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9jb250cm9sbGVyXCIpO1xuICAgIGlmIChpc0xvY2FsKCkgJiYgIWlzVGVzdCgpICYmIGlzSG90UmVsb2FkU2VydmVyKCkgJiYgZW5hYmxlU3luYykge1xuICAgICAgYXdhaXQgdGhpcy5zeW5jZXIuc3luYygpO1xuICAgICAgYXdhaXQgdGhpcy5zdGFydFdhdGNoZXIoKTtcbiAgICB9XG5cbiAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIHRoaXMuaW5pdEVsYXBzZWQgPSBwZXJmb3JtYW5jZS5ub3coKSAtIGluaXRTdGFydDtcbiAgICB0aGlzLmNvbmZpZ0VsYXBzZWQgPSBjb25maWdUaW1lO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0RWxhcHNlZCA9IDA7XG4gIHByaXZhdGUgY29uZmlnRWxhcHNlZCA9IDA7XG5cbiAgYXN5bmMgY3JlYXRlU2VydmVyKGluaXRPcHRpb25zPzogeyBlbmFibGVTeW5jPzogYm9vbGVhbjsgZG9TaWxlbnQ/OiBib29sZWFuIH0pIHtcbiAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXplZCkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0KGluaXRPcHRpb25zPy5kb1NpbGVudCwgaW5pdE9wdGlvbnM/LmVuYWJsZVN5bmMpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmNvbmZpZy5zZXJ2ZXI7XG4gICAgY29uc3QgeyBkZWZhdWx0OiBmYXN0aWZ5IH0gPSBhd2FpdCBpbXBvcnQoXCJmYXN0aWZ5XCIpO1xuICAgIGNvbnN0IHsgZ2V0TG9nVGFwZUZhc3RpZnlMb2dnZXIgfSA9IGF3YWl0IGltcG9ydChcIkBsb2d0YXBlL2Zhc3RpZnlcIik7XG4gICAgY29uc3Qgc2VydmVyID0gZmFzdGlmeSh7XG4gICAgICAuLi5vcHRpb25zLmZhc3RpZnksXG4gICAgICBsb2dnZXI6XG4gICAgICAgIHRoaXMuY29uZmlnLmxvZ2dpbmcgIT09IGZhbHNlXG4gICAgICAgICAgPyBnZXRMb2dUYXBlRmFzdGlmeUxvZ2dlcih7XG4gICAgICAgICAgICAgIGNhdGVnb3J5OiB0aGlzLmNvbmZpZy5sb2dnaW5nPy5mYXN0aWZ5Q2F0ZWdvcnkgPz8gW1wiZmFzdGlmeVwiXSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gICAgdGhpcy53ZWJzb2NrZXRSdW50aW1lID0gbmV3IFdlYlNvY2tldFJ1bnRpbWUob3B0aW9ucy53ZWJzb2NrZXQpO1xuXG4gICAgLy8gU3RvcmFnZSDshKTsoJUg4oaSIFN0b3JhZ2VNYW5hZ2VyIOyDneyEsVxuICAgIGlmIChvcHRpb25zLnN0b3JhZ2UpIHtcbiAgICAgIGNvbnN0IHsgU3RvcmFnZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N0b3JhZ2Uvc3RvcmFnZS1tYW5hZ2VyXCIpO1xuICAgICAgdGhpcy5zdG9yYWdlVmFsdWUgPSBuZXcgU3RvcmFnZU1hbmFnZXIob3B0aW9ucy5zdG9yYWdlKTtcbiAgICB9XG5cbiAgICAvLyDtlIzrn6zqt7jsnbgg65Ox66GdXG4gICAgaWYgKG9wdGlvbnMucGx1Z2lucykge1xuICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlclBsdWdpbnMoc2VydmVyLCBvcHRpb25zLnBsdWdpbnMpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmF1dGgpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJCZXR0ZXJBdXRoKHNlcnZlciwgb3B0aW9ucy5hdXRoKTtcbiAgICB9XG5cbiAgICAvLyBBUEkg65287Jqw7YyFIOyEpOyglVxuICAgIGF3YWl0IHRoaXMud2l0aEZhc3RpZnkoc2VydmVyLCBvcHRpb25zLmFwaUNvbmZpZywge1xuICAgICAgZW5hYmxlU3luYzogaW5pdE9wdGlvbnM/LmVuYWJsZVN5bmMsXG4gICAgICBkb1NpbGVudDogaW5pdE9wdGlvbnM/LmRvU2lsZW50LFxuICAgIH0pO1xuXG4gICAgLy8g7ISc67KEIOyLnOyekVxuICAgIGF3YWl0IHRoaXMuYm9vdChzZXJ2ZXIsIG9wdGlvbnMpO1xuXG4gICAgaWYgKCFpbml0T3B0aW9ucz8uZG9TaWxlbnQpIHtcbiAgICAgIHRoaXMucHJpbnRTdGFydHVwU3VtbWFyeSgpO1xuICAgIH1cblxuICAgIHJldHVybiBzZXJ2ZXI7XG4gIH1cblxuICBhc3luYyB3aXRoRmFzdGlmeShcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICBvcHRpb25zPzoge1xuICAgICAgZW5hYmxlU3luYz86IGJvb2xlYW47XG4gICAgICBkb1NpbGVudD86IGJvb2xlYW47XG4gICAgfSxcbiAgKSB7XG4gICAgaWYgKCF0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW5pdChvcHRpb25zPy5kb1NpbGVudCwgb3B0aW9ucz8uZW5hYmxlU3luYyk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gICAgdGhpcy53ZWJzb2NrZXRSdW50aW1lID8/PSBuZXcgV2ViU29ja2V0UnVudGltZSh0aGlzLmNvbmZpZy5zZXJ2ZXIud2Vic29ja2V0KTtcbiAgICBhd2FpdCB0aGlzLnJlZnJlc2hIdHRwVmFsaWRhdG9ycygpO1xuXG4gICAgLy8gdGltZXpvbmUg7ISk7KCVXG4gICAgY29uc3QgdGltZXpvbmUgPSB0aGlzLmNvbmZpZy5hcGkudGltZXpvbmU7XG4gICAgaWYgKHRpbWV6b25lKSB7XG4gICAgICAvLyDtg4DsnoTsobTsl5Ag66ee6rKMIOydkeuLtSDrgqDsp5wg7Iqk7Yq466eB7J2EIOuzgO2ZmO2VtOyjvOyWtOyVvCDtlanri4jri6QuXG4gICAgICAvLyDqsIDroLkgdGltZXpvbmXsnbQgXCJBc2lhL1Nlb3VsXCIg7J2066m0XG4gICAgICAvLyBcIjIwMjUtMTEtMjFUMDA6MDA6MDAuMDAwWlwiIOulvCBcIjIwMjUtMTEtMjFUMDk6MDA6MDArMDk6MDBcIiDsnLzroZwg67OA7ZmY7ZW07KO87Ja07JW8IO2VqeuLiOuLpC5cbiAgICAgIGNvbnN0IHsgZm9ybWF0SW5UaW1lWm9uZSB9ID0gYXdhaXQgaW1wb3J0KFwiZGF0ZS1mbnMtdHpcIik7XG5cbiAgICAgIC8vIElTTyA4NjAxIOuCoOynnCDtmJXsi50g7KCV6rec7IudICjsmIg6IDIwMjQtMDEtMTVUMDk6MzA6MDAuMDAwWilcbiAgICAgIGNvbnN0IElTT19EQVRFX1JFR0VYID0gL15cXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfShcXC5cXGR7M30pP1okLztcblxuICAgICAgLy8gVOulvCDrkZjrn6zsi7wg7J6R7J2A65Sw7Ji07ZGc6rCAIOyXhuuLpOuptCBcIjIwMjUtMTEtMTkxNzYzNTQ2MTg5MDAwMTg6NTY6MjkrMDk6MDBcIuyZgCDqsJnsnYAg6rKw6rO86rCAIOuCmOyYteuLiOuLpC5cbiAgICAgIC8vIOydtOuKlCBkYXRlLWZucyDtirnsnoXri4jri6QuXG4gICAgICAvLyDsnbTroIfqsowg7ZW064+EIOq0nOywruyKteuLiOuLpC4gXCIyMDI1LTExLTE5VDE4OjU2OjI5KzA5OjAwXCIg66qo7JaR7Jy866GcIOyemCDrgpjsmLXri4jri6QuXG4gICAgICBjb25zdCBEQVRFX0ZPUk1BVCA9IFwieXl5eS1NTS1kZCdUJ0hIOm1tOnNzWFhYXCI7XG5cbiAgICAgIHNlcnZlci5zZXRSZXBseVNlcmlhbGl6ZXIoKHBheWxvYWQpID0+IHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBheWxvYWQsIChfa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKHZhbHVlKSAmJiBJU09fREFURV9SRUdFWC50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdEluVGltZVpvbmUoXG4gICAgICAgICAgICAgIG5ldyBEYXRlKHZhbHVlKSxcbiAgICAgICAgICAgICAgLyogU0FGRVRZOiBBUEkg642w7L2U66CI7J207YSw7JmAIFpvZCDqsoDspp3quLAg65Ox66GdIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHRpbWV6b25lIGFzIGAke3N0cmluZ30vJHtzdHJpbmd9YCxcbiAgICAgICAgICAgICAgREFURV9GT1JNQVQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICAvLyBUaW1lem9uZSDroZzqt7jripQgcHJpbnRTdGFydHVwU3VtbWFyeeyXkOyEnCDthrXtlakg7Lac66ClXG4gICAgfVxuXG4gICAgLy8g7KCE7LK0IOudvOyasO2MhSDrpqzsiqTtirhcbiAgICBzZXJ2ZXIuZ2V0KFxuICAgICAgYCR7dGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeH0vcm91dGVzYCxcbiAgICAgIGFzeW5jIChfcmVxdWVzdCwgX3JlcGx5KTogUHJvbWlzZTx0eXBlb2YgdGhpcy5zeW5jZXIuYXBpcz4gPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW5jZXIuYXBpcztcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIEhlYWx0aGNoZWNrIEFQSVxuICAgIHNlcnZlci5nZXQoXG4gICAgICBgJHt0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4fS9oZWFsdGhjaGVja2AsXG4gICAgICBhc3luYyAoX3JlcXVlc3QsIF9yZXBseSk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgICAgIHJldHVybiBcIm9rXCI7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBTb25hbXUgVUkgQVBJICjroZzsu6wg7ZmY6rK97JeQ7ISc66eMKVxuICAgIGNvbnN0IHsgaXNMb2NhbCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvY29udHJvbGxlclwiKTtcbiAgICBpZiAoaXNMb2NhbCgpKSB7XG4gICAgICBjb25zdCB7IHNvbmFtdVVJQXBpUGx1Z2luIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91aS9hcGlcIik7XG4gICAgICBzZXJ2ZXIucmVnaXN0ZXIoc29uYW11VUlBcGlQbHVnaW4pO1xuICAgIH1cblxuICAgIC8vIERldlJ1bm5lciDthYzsiqTtirgg7JeU65Oc7Y+s7J247Yq4ICjroZzsu6wg7ZmY6rK9ICsgZGV2UnVubmVyIO2ZnOyEse2ZlCDsi5wpXG4gICAgaWYgKGlzTG9jYWwoKSAmJiB0aGlzLmNvbmZpZy50ZXN0Py5kZXZSdW5uZXI/LmVuYWJsZWQpIHtcbiAgICAgIGNvbnN0IHsgcmVnaXN0ZXJEZXZUZXN0Um91dGVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi90ZXN0aW5nL2Rldi10ZXN0LXJvdXRlc1wiKTtcbiAgICAgIGF3YWl0IHJlZ2lzdGVyRGV2VGVzdFJvdXRlcyhzZXJ2ZXIsIHRoaXMuY29uZmlnLnRlc3QuZGV2UnVubmVyKTtcbiAgICB9XG5cbiAgICBjb25zdCB3ZWJQYXRoID0gcGF0aC5qb2luKHRoaXMuYXBwUm9vdFBhdGgsIFwid2ViXCIpO1xuICAgIGNvbnN0IGhhc1dlYiA9IGF3YWl0IGV4aXN0cyh3ZWJQYXRoKTtcblxuICAgIC8vIOyghOyXrSBjb21wcmVzcyDsmLXshZgg6rOE7IKwIChyb3V0ZS5jb21wcmVzczogdHJ1ZeydvCDrlYwg7IKs7JqpKVxuICAgIGNvbnN0IHBsdWdpbkNvbXByZXNzID0gdGhpcy5jb25maWcuc2VydmVyLnBsdWdpbnM/LmNvbXByZXNzO1xuICAgIGNvbnN0IGdsb2JhbENvbXByZXNzT3B0aW9uczogQ29tcHJlc3NPcHRpb25zIHwgdW5kZWZpbmVkID0gcGx1Z2luQ29tcHJlc3NcbiAgICAgID8gcGx1Z2luQ29tcHJlc3MgPT09IHRydWVcbiAgICAgICAgPyB7IHRocmVzaG9sZDogMTAyNCwgZW5jb2RpbmdzOiBbXCJiclwiLCBcImd6aXBcIiwgXCJkZWZsYXRlXCJdIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICB0aHJlc2hvbGQ6IHBsdWdpbkNvbXByZXNzLnRocmVzaG9sZCxcbiAgICAgICAgICAgIGVuY29kaW5nczogcGx1Z2luQ29tcHJlc3MuZW5jb2RpbmdzLFxuICAgICAgICAgICAgY3VzdG9tVHlwZXM6IHBsdWdpbkNvbXByZXNzLmN1c3RvbVR5cGVzLFxuICAgICAgICAgIH1cbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKGlzTG9jYWwoKSkge1xuICAgICAgLy8g66Gc7LusIOqwnOuwnCDtmZjqsr06IGNhdGNoLWFsbOuhnCBBUEnrpbwg64+Z7KCBIOunpOy5re2VmOyXrCBITVLsnYQg7KeA7JuQ7ZWp64uI64ukLlxuICAgICAgLy8gU09OQU1VX0RJU0FCTEVfSU5URUdSQVRFRF9XRUI9eWVz66GcIOyEpOygle2VmOuptCBkZXZfYXBpIOuqqOuTnOyXkOyEnCBWaXRlIO2Gte2VqeydhCDruYTtmZzshLHtmZTtlaAg7IiYIOyeiOyKteuLiOuLpC5cbiAgICAgIGNvbnN0IGRpc2FibGVJbnRlZ3JhdGVkV2ViID0gcHJvY2Vzcy5lbnYuU09OQU1VX0RJU0FCTEVfSU5URUdSQVRFRF9XRUIgPT09IFwieWVzXCI7XG4gICAgICBpZiAoaGFzV2ViICYmICFkaXNhYmxlSW50ZWdyYXRlZFdlYikge1xuICAgICAgICBhd2FpdCB0aGlzLnNldHVwRGV2U2VydmVyV2l0aFZpdGUoc2VydmVyLCB3ZWJQYXRoLCBjb25maWcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXR1cERldlNlcnZlcihzZXJ2ZXIsIGNvbmZpZyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIO2UhOuhnOuNleyFmCDtmZjqsr06IOqwnOuzhCBBUEkg65287Jqw7Yq4ICsg7KCV7KCBIO2MjOydvCDshJzruZlcbiAgICAgIGZvciAoY29uc3QgYXBpIG9mIHRoaXMuc3luY2VyLmFwaXMpIHtcbiAgICAgICAgaWYgKHRoaXMuc3luY2VyLm1vZGVsc1thcGkubW9kZWxOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsoJXsnZjrkJjsp4Ag7JWK7J2AIOuqqOuNuOyXkCDsoJHqt7wgJHthcGkubW9kZWxOYW1lfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQHdlYnNvY2tldCByb3V0ZeuKlCB3c0hhbmRsZXLroZwg65Ox66Gd7ZWY6rOgLCDqsJnsnYAgcGF0aOydmCDsnbzrsJggSFRUUCBHRVTsnYAgNDI2IOydkeuLteycvOuhnCB1cGdyYWRl66W8IOqwleygnO2VqFxuICAgICAgICBpZiAoYXBpLndlYnNvY2tldE9wdGlvbnMpIHtcbiAgICAgICAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgdXJsOiB0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4ICsgYXBpLnBhdGgsXG4gICAgICAgICAgICBoYW5kbGVyOiB0aGlzLmNyZWF0ZVdlYlNvY2tldFVwZ3JhZGVSZXF1aXJlZEhhbmRsZXIoKSxcbiAgICAgICAgICAgIHdzSGFuZGxlcjogdGhpcy5jcmVhdGVXZWJTb2NrZXRIYW5kbGVyKGFwaSwgY29uZmlnKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICAgICAgbWV0aG9kOiBhcGkub3B0aW9ucy5odHRwTWV0aG9kID8/IFwiR0VUXCIsXG4gICAgICAgICAgdXJsOiB0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4ICsgYXBpLnBhdGgsXG4gICAgICAgICAgaGFuZGxlcjogYXdhaXQgdGhpcy5jcmVhdGVBcGlIYW5kbGVyKGFwaSwgY29uZmlnKSxcbiAgICAgICAgICBjb21wcmVzczogdG9GYXN0aWZ5Q29tcHJlc3NPcHRpb24oYXBpLm9wdGlvbnMuY29tcHJlc3MsIGdsb2JhbENvbXByZXNzT3B0aW9ucyksXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyDtlITroZzrjZXshZjsl5DshJzripQgd2ViIOyGjOyKpChhcHBSb290L3dlYikg7Jyg66y07JmAIOustOq0gO2VmOqyjCxcbiAgICAgIC8vIGFwaS93ZWItZGlzdCDsobTsnqwg7Jes67aA66W8IHNldHVwU3RhdGljV2ViU2VydmVyIOuCtOu2gOyXkOyEnCDtjJDri6jtlanri4jri6QuXG4gICAgICBhd2FpdCB0aGlzLnNldHVwU3RhdGljV2ViU2VydmVyKHNlcnZlciwgY29uZmlnLCBnbG9iYWxDb21wcmVzc09wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBkZXYg66qo65OcIOqzte2GtTogY2F0Y2gtYWxs7JeQ7IScIOuniOyngOuniSDspIDruYQg7JmE66OMIEFQSSBzbmFwc2hvdOydhCDtg5Dsg4ntlZjsl6wg7JqU7LKt7J2EIOyymOumrO2VqeuLiOuLpC5cbiAgICogc2VydmVyLnJvdXRlKCnroZwg6rCc67OEIOuTseuhne2VmOuptCBoYW5kbGVy6rCAIOqzoOygleuQmOyWtCBITVLsnbQg64+Z7J6R7ZWY7KeAIOyViuycvOuvgOuhnCxcbiAgICogcmVmcmVzaCDshLHqs7Ug7IucIOq1kOyytOuQmOuKlCBzbmFwc2hvdOydhCDrp6Qg7JqU7LKtIOyhsO2ajO2VqeuLiOuLpC5cbiAgICpcbiAgICog7JqU7LKt7J20IC9hcGko7KCV7ZmV7Z6I64qUIHRoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXgp66GcIOyLnOyeke2VmOyngCDslYrripQg6rK97Jqw652866m0IG51bGzsnYQg67CY7ZmY7ZWY66mwIOuBneuDheuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlRGV2QXBpUmVxdWVzdChcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICk6IFByb21pc2U8KChyZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCwgcmVwbHk6IEZhc3RpZnlSZXBseSkgPT4gUHJvbWlzZTxBcGlNZXRob2RSZXN1bHQ+KSB8IG51bGw+IHtcbiAgICBjb25zdCBtYXRjaGVkQXBpID0gdGhpcy5maW5kTWF0Y2hlZEFwaShyZXF1ZXN0LCB0aGlzLnByZXBhcmVkQXBpcywgdGhpcy5wcmVwYXJlZE1vZGVscyk7XG5cbiAgICBpZiAoIW1hdGNoZWRBcGkpIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihTRChcImVycm9yLmFwaS5ub3RGb3VuZFwiKSk7XG4gICAgfVxuXG4gICAgLy8gd2Vic29ja2V0IHJvdXRl66W8IOydvOuwmCBIVFRQ66GcIOyngeygkSDtmLjstpztlZwg6rK97JqwIDQyNuydhCDrj4zroKTspJggdXBncmFkZSDsl4bsnbQg7KCR6re87ZWY64qUIOqyg+ydhCDssKjri6jtlahcbiAgICBpZiAobWF0Y2hlZEFwaS53ZWJzb2NrZXRPcHRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVXZWJTb2NrZXRVcGdyYWRlUmVxdWlyZWRIYW5kbGVyKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY3JlYXRlQXBpSGFuZGxlcihtYXRjaGVkQXBpLCBjb25maWcsIHRoaXMucHJlcGFyZWRNb2RlbHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kTWF0Y2hlZEFwaShcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICBhcGlzOiByZWFkb25seSBFeHRlbmRlZEFwaVtdLFxuICAgIG1vZGVsczogTG9hZGVkTW9kZWxzLFxuICApOiBFeHRlbmRlZEFwaSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgdXJsID0gdGhpcy5nZXRQYXRobmFtZUZyb21VcmwocmVxdWVzdC51cmwpO1xuICAgIGNvbnN0IG1ldGhvZCA9IHJlcXVlc3QubWV0aG9kO1xuXG4gICAgaWYgKCF1cmwuc3RhcnRzV2l0aCh0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4KSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gYXBpcy5maW5kKChhcGkpID0+IHtcbiAgICAgIGlmIChtb2RlbHNbYXBpLm1vZGVsTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBhcGlNZXRob2QgPSBhcGkub3B0aW9ucy5odHRwTWV0aG9kID8/IFwiR0VUXCI7XG4gICAgICBpZiAoYXBpTWV0aG9kICE9PSBtZXRob2QpIHJldHVybiBmYWxzZTtcblxuICAgICAgY29uc3QgZnVsbFBhdGggPSB0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4ICsgYXBpLnBhdGg7XG4gICAgICByZXR1cm4gdGhpcy5pc1BhdGhQYXR0ZXJuTWF0Y2goZnVsbFBhdGgsIHVybCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogZGV2IGFwaSDrqqjrk5w6IFZpdGUg7JeG7J20IEFQSSDrj5nsoIEg65287Jqw7YyF66eMIOygnOqzte2VqeuLiOuLpC5cbiAgICogSE1S7J2EIOychO2VtCBjYXRjaC1hbGzsl5DshJwg66ekIOyalOyyreuniOuLpCDspIDruYQg7JmE66OMIEFQSSBzbmFwc2hvdOydhCDsobDtmoztlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIHNldHVwRGV2U2VydmVyKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICApOiB2b2lkIHtcbiAgICAvLyB1cGdyYWRl64qUIOyLpOyniOyggeycvOuhnCBHRVTsl5DshJzrp4wg7ISx66a97ZWY66+A66GcIEdFVCArIHdzSGFuZGxlciDsmYAg6re4IOyZuCBtZXRob2Trpbwg67OE64+EIHJvdXRl66GcIOu2hOumrO2VqFxuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICB1cmw6IGAke3RoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9LypgLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBhd2FpdCB0aGlzLmhhbmRsZURldkFwaVJlcXVlc3QocmVxdWVzdCwgY29uZmlnKTtcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm4gaGFuZGxlcihyZXF1ZXN0LCByZXBseSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8g65Ox66Gd65CcIEFQSeyZgCDsnbzsuZjtlZjsp4Ag7JWK64qUIOyalOyyreyXkCDrjIDtlZwgZmFsbGJhY2vsnoXri4jri6QuXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihTRChcImVycm9yLmFwaS5ub3RGb3VuZFwiKSk7XG4gICAgICB9LFxuICAgICAgd3NIYW5kbGVyOiBhc3luYyAoY29ubmVjdGlvbiwgcmVxdWVzdCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZURldldlYlNvY2tldFJlcXVlc3QoY29ubmVjdGlvbi5zb2NrZXQsIHJlcXVlc3QsIGNvbmZpZyk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgc2VydmVyLnJvdXRlKHtcbiAgICAgIG1ldGhvZDogW1wiSEVBRFwiLCBcIlBPU1RcIiwgXCJQVVRcIiwgXCJERUxFVEVcIiwgXCJQQVRDSFwiXSxcbiAgICAgIHVybDogYCR7dGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeH0vKmAsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IGF3YWl0IHRoaXMuaGFuZGxlRGV2QXBpUmVxdWVzdChyZXF1ZXN0LCBjb25maWcpO1xuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgIHJldHVybiBoYW5kbGVyKHJlcXVlc3QsIHJlcGx5KTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oU0QoXCJlcnJvci5hcGkubm90Rm91bmRcIikpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdml0ZVNlcnZlcjogYW55ID0gbnVsbDtcblxuICAvKipcbiAgICogZGV2IGFsbCDrqqjrk5w6IFZpdGUgRGV2IFNlcnZlcuulvCDthrXtlantlZjsl6wgQVBJICsgU1NSICsgQ1NS7J2EIOuqqOuRkCDsoJzqs7Xtlanri4jri6QuXG4gICAqIEFQSSDrj5nsoIEg66ek7Lmt7J2AIGhhbmRsZURldkFwaVJlcXVlc3Trpbwg6rO17Jyg7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZXR1cERldlNlcnZlcldpdGhWaXRlKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICAgd2ViUGF0aDogc3RyaW5nLFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQGZhc3RpZnkvbWlkZGllIOuTseuhnSAoQ29ubmVjdC1zdHlsZSBtaWRkbGV3YXJlIOyngOybkClcbiAgICBhd2FpdCBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChcIkBmYXN0aWZ5L21pZGRpZVwiKSkuZGVmYXVsdCk7XG5cbiAgICBjb25zdCB2aXRlID0gYXdhaXQgaW1wb3J0KFwidml0ZVwiKTtcbiAgICAvLyBAZmFzdGlmeS93ZWJzb2NrZXQg7ZSM65+s6re47J247J20IO2ZnOyEse2ZlOuQmOuptCBITVIgd2Vic29ja2V06rO8IHNlcnZlciBzb2NrZXTsnbQg7Lap64+M7ZWY66+A66GcIGRlZGljYXRlZCDtj6ztirjroZwg67aE66as7ZWoXG4gICAgY29uc3QgcmVxdWlyZXNEZWRpY2F0ZWRIbXJTZXJ2ZXIgPSBCb29sZWFuKHRoaXMuY29uZmlnLnNlcnZlci5wbHVnaW5zPy53cyk7XG4gICAgY29uc3QgaG1yID0gcmVzb2x2ZUludGVncmF0ZWRWaXRlSG1yT3B0aW9ucyh7XG4gICAgICBodHRwU2VydmVyOiBzZXJ2ZXIuc2VydmVyLFxuICAgICAgcmVxdWlyZXNEZWRpY2F0ZWRXZWJTb2NrZXRTZXJ2ZXI6IHJlcXVpcmVzRGVkaWNhdGVkSG1yU2VydmVyLFxuICAgIH0pO1xuXG4gICAgdGhpcy52aXRlU2VydmVyID0gYXdhaXQgdml0ZS5jcmVhdGVTZXJ2ZXIoe1xuICAgICAgcm9vdDogd2ViUGF0aCxcbiAgICAgIHNlcnZlcjoge1xuICAgICAgICBtaWRkbGV3YXJlTW9kZTogdHJ1ZSxcbiAgICAgICAgaG1yLFxuICAgICAgfSxcbiAgICAgIGFwcFR5cGU6IFwiY3VzdG9tXCIsXG4gICAgfSk7XG5cbiAgICAvLyBWaXRlIG1pZGRsZXdhcmUg65Ox66GdIChWaXRlIOyXkOyFiyDsspjrpqwpXG4gICAgc2VydmVyLnVzZSgocmVxLCByZXMsIG5leHQpID0+IHtcbiAgICAgIC8vIEFQSeyZgCBTb25hbXUgVUnripQgRmFzdGlmeSDrnbzsmrDtirjqsIAg7LKY66as7ZWY64+E66GdIHNraXBcbiAgICAgIGlmIChyZXEudXJsPy5zdGFydHNXaXRoKHRoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXgpIHx8IHJlcS51cmw/LnN0YXJ0c1dpdGgoXCIvc29uYW11LXVpXCIpKSB7XG4gICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgICB9XG4gICAgICAvLyDrgpjrqLjsp4DripQgVml0ZSBtaWRkbGV3YXJl66GcIOyghOuLrFxuICAgICAgcmV0dXJuIHRoaXMudml0ZVNlcnZlci5taWRkbGV3YXJlcyhyZXEsIHJlcywgbmV4dCk7XG4gICAgfSk7XG5cbiAgICAvLyBXUyB1cGdyYWRlIOqyveuhnChHRVQp7JmAIOydvOuwmCBIVFRQIOuplOyEnOuTnOulvCDrs4Trj4Qgcm91dGXroZwg67aE66as7ZW0IHdlYnNvY2tldCByb3V0ZeqwgCBIVE1MIGZhbGxiYWNr7JeQIOuoue2eiOyngCDslYrrj4TroZ0g7ZWoXG4gICAgc2VydmVyLnJvdXRlKHtcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIHVybDogYCR7dGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeH0vKmAsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5oYW5kbGVEZXZBcGlSZXF1ZXN0KHJlcXVlc3QsIGNvbmZpZyk7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0KHJlcXVlc3QsIHJlcGx5KTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oU0QoXCJlcnJvci5hcGkubm90Rm91bmRcIikpO1xuICAgICAgfSxcbiAgICAgIHdzSGFuZGxlcjogYXN5bmMgKGNvbm5lY3Rpb24sIHJlcXVlc3QpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVEZXZXZWJTb2NrZXRSZXF1ZXN0KGNvbm5lY3Rpb24uc29ja2V0LCByZXF1ZXN0LCBjb25maWcpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFtcIkhFQURcIiwgXCJQT1NUXCIsIFwiUFVUXCIsIFwiREVMRVRFXCIsIFwiUEFUQ0hcIl0sXG4gICAgICB1cmw6IGAke3RoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9LypgLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuaGFuZGxlRGV2QXBpUmVxdWVzdChyZXF1ZXN0LCBjb25maWcpO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdChyZXF1ZXN0LCByZXBseSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFNEKFwiZXJyb3IuYXBpLm5vdEZvdW5kXCIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBjYXRjaC1hbGwg65287Jqw7Yq47JeQ7IScIFNTUi9DU1Ig7LKY66asXG4gICAgLy8g6rCc67CcIO2ZmOqyveyXkOyEnOuKlCDrnbzsmrDtirjrs4QgY29tcHJlc3Mg7Ji17IWY7J2EIO2PrOq4sO2VmOqzoCBITVIg7J207KCQ7J2EIOy3qO2VqeuLiOuLpC5cbiAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgbWV0aG9kOiBbXCJHRVRcIiwgXCJIRUFEXCJdLFxuICAgICAgdXJsOiBcIi8qXCIsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgdXJsID0gcmVxdWVzdC51cmw7XG5cbiAgICAgICAgLy8gMS4gU1NSIOudvOyasO2KuCDsspjrpqxcbiAgICAgICAgY29uc3QgeyBtYXRjaFNTUlJvdXRlLCByZW5kZXJTU1IgfSA9IGF3YWl0IGltcG9ydChcIi4uL3NzclwiKTtcbiAgICAgICAgY29uc3Qgc3NyTWF0Y2ggPSBtYXRjaFNTUlJvdXRlKHVybCk7XG4gICAgICAgIGlmIChzc3JNYXRjaCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBbU1NSXSBNYXRjaGVkIHJvdXRlOiAke3Nzck1hdGNoLnJvdXRlLnBhdGh9YCk7XG4gICAgICAgICAgY29uc3QgaHRtbCA9IGF3YWl0IHJlbmRlclNTUihcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgIHNzck1hdGNoLnJvdXRlLFxuICAgICAgICAgICAgc3NyTWF0Y2gucGFyYW1zLFxuICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgIHJlcGx5LFxuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgdGhpcy52aXRlU2VydmVyLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmVwbHkudHlwZShcInRleHQvaHRtbFwiKTtcbiAgICAgICAgICByZXR1cm4gaHRtbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDIuIENTUiBmYWxsYmFja1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxldCB0ZW1wbGF0ZSA9IGF3YWl0IGZzLnJlYWRGaWxlKFxuICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMudml0ZVNlcnZlci5jb25maWcucm9vdCwgXCJpbmRleC5odG1sXCIpLFxuICAgICAgICAgICAgXCJ1dGYtOFwiLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGVtcGxhdGUgPSBhd2FpdCB0aGlzLnZpdGVTZXJ2ZXIudHJhbnNmb3JtSW5kZXhIdG1sKHVybCwgdGVtcGxhdGUpO1xuXG4gICAgICAgICAgLy8gP2htcj1mYWxzZeuhnCDsl7Ag7Y6Y7J207KeA64qUIEhNUiDsm7nshozsvJPrp4wg64GK7Ja0IOyDiOuhnOqzoOy5qOuQmOyngCDslYrqsowg7ZWc64ukLlxuICAgICAgICAgIGNvbnN0IHsgSE1SX09QVF9PVVRfU0NSSVBULCBpc0htckRpc2FibGVkQnlRdWVyeSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3NyL2htci1vcHQtb3V0XCIpO1xuICAgICAgICAgIGlmIChpc0htckRpc2FibGVkQnlRdWVyeSh1cmwpKSB7XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLnJlcGxhY2UoXCI8aGVhZD5cIiwgYDxoZWFkPlxcbiR7SE1SX09QVF9PVVRfU0NSSVBUfWApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlcGx5LnR5cGUoXCJ0ZXh0L2h0bWxcIik7XG4gICAgICAgICAgcmV0dXJuIHRlbXBsYXRlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdGhpcy52aXRlU2VydmVyLnNzckZpeFN0YWNrdHJhY2UoXG4gICAgICAgICAgICAvKiBTQUZFVFk6IEFQSSDrjbDsvZTroIjsnbTthLDsmYAgWm9kIOqygOymneq4sCDrk7HroZ0g6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gZSBhcyBFcnJvcixcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgcmVwbHkuc3RhdHVzKDUwMCk7XG4gICAgICAgICAgcmV0dXJuIC8qIFNBRkVUWTogQVBJIOuNsOy9lOugiOydtO2EsOyZgCBab2Qg6rKA7Kad6riwIOuTseuhnSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgICBlIGFzIEVycm9yXG4gICAgICAgICAgKS5tZXNzYWdlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8g7ISc67KEIOyiheujjCDsi5wgVml0ZeuPhCDsooXro4xcbiAgICBzZXJ2ZXIuYWRkSG9vayhcIm9uQ2xvc2VcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy52aXRlU2VydmVyLmNsb3NlKCk7XG4gICAgfSk7XG5cbiAgICBpZiAoXCJwb3J0XCIgaW4gaG1yKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsuZGltKFxuICAgICAgICAgIGDinJMgVml0ZSBITVIgdXNpbmcgZGVkaWNhdGVkIHdlYnNvY2tldCBwb3J0ICR7aG1yLnBvcnR9IHRvIGF2b2lkIEZhc3RpZnkgd2Vic29ja2V0IGNvbmZsaWN0c2AsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oXCLinJMgVml0ZSBkZXYgc2VydmVyIGludGVncmF0ZWRcIikpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXR1cFN0YXRpY1dlYlNlcnZlcihcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICBnbG9iYWxDb21wcmVzc09wdGlvbnM6IENvbXByZXNzT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g6rK966GcIOuqhe2Zle2ZlDogYXBpL3dlYi1kaXN0L2NsaWVudCAo7KCV7KCBIO2MjOydvCksIGFwaS93ZWItZGlzdC9zZXJ2ZXIgKFNTUiBlbnRyeSksIGFwaS9kaXN0L3NzciAoU1NSIHJvdXRlcyAtIEFQSSDshozsnKApXG4gICAgY29uc3Qgd2ViRGlzdFBhdGggPSBwYXRoLmpvaW4odGhpcy5hcGlSb290UGF0aCwgXCJ3ZWItZGlzdFwiLCBcImNsaWVudFwiKTtcbiAgICBjb25zdCBzc3JQYXRoID0gcGF0aC5qb2luKHRoaXMuYXBpUm9vdFBhdGgsIFwid2ViLWRpc3RcIiwgXCJzZXJ2ZXJcIik7XG4gICAgY29uc3Qgc3NyRW50cnlQYXRoID0gcGF0aC5qb2luKHNzclBhdGgsIFwiZW50cnktc2VydmVyLmdlbmVyYXRlZC5qc1wiKTtcbiAgICBjb25zdCBzc3JSb3V0ZXNQYXRoID0gcGF0aC5qb2luKHRoaXMuYXBpUm9vdFBhdGgsIFwiZGlzdFwiLCBcInNzclwiLCBcInJvdXRlcy5qc1wiKTtcblxuICAgIGlmICghKGF3YWl0IGV4aXN0cyh3ZWJEaXN0UGF0aCkpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYOKaoCBXZWIgZGlzdCBub3QgZm91bmQ6ICR7d2ViRGlzdFBhdGh9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU1NSIGVudHJ5IOyhtOyerCDsl6zrtoAg7ZmV7J24XG4gICAgY29uc3Qgc3NyQXZhaWxhYmxlID0gYXdhaXQgZXhpc3RzKHNzckVudHJ5UGF0aCk7XG5cbiAgICBpZiAoIXNzckF2YWlsYWJsZSkge1xuICAgICAgY29uc29sZS53YXJuKGDimqAgU1NSIGVudHJ5IG5vdCBmb3VuZDogJHtzc3JFbnRyeVBhdGh9YCk7XG4gICAgICBjb25zb2xlLndhcm4oXCIgIFNTUiB3aWxsIGJlIGRpc2FibGVkLiBPbmx5IENTUiB3aWxsIHdvcmsuXCIpO1xuICAgIH1cblxuICAgIC8vIFNTUiDrnbzsmrDtirgg66Gc65OcIChwcm9kdWN0aW9u7JeQ7ISc66eMLCDsgqzsmqnsnpAg7ZSE66Gc7KCd7Yq47J2YIHNzci9yb3V0ZXMudHMpXG4gICAgaWYgKHNzckF2YWlsYWJsZSkge1xuICAgICAgaWYgKGF3YWl0IGV4aXN0cyhzc3JSb3V0ZXNQYXRoKSkge1xuICAgICAgICAvLyB0cy1sb2FkZXLrnbzrqbQgXCJmaWxlOi8vXCLroZwg7Iuc7J6R7ZWY64qUIGZ1bGx5LXJlc29sdmVkIHBhdGjrp4wg67Cb6riw7JeQIOydtOulvCDsspjrpqztlbTso7zripQgaW1wb3J0TWVtYmVyc+ulvCDsgqzsmqntlbTslbwg7ZaI6rKg7KeA66eMLFxuICAgICAgICAvLyDsl6zquLDripQg7ZSE66Gc642V7IWYIO2ZmOqyveyXkOyEnCBsb2FkZXIg7JeG7J20IOuPjOyVhOqwgOq4sCDrlYzrrLjsl5AgXCLsp4Tsp5wganMg7YyM7J28XCLsnZggXCLqt7jrg6VcIiDsoIjrjIDqsr3roZzrpbwg67CU66GcIGltcG9ydO2VtOuPhCDrkKnri4jri6QuXG4gICAgICAgIC8vIOydtCDrgrTsmqnsnYAg7J20IO2VqOyImCDrgrTsl5DshJwg7JWE656Y7JeQIOuCmOyYrCDri6TrpbggaW1wb3J0IO2YuOy2nOyXkOuPhCDrj5nsnbztlZjqsowg7KCB7Jqp65Cp64uI64ukLlxuICAgICAgICBhd2FpdCBpbXBvcnQoc3NyUm91dGVzUGF0aCk7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi4pyTIFNTUiByb3V0ZXMgbG9hZGVkXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGDimqAgU1NSIHJvdXRlcyBub3QgZm91bmQ6ICR7c3NyUm91dGVzUGF0aH1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDroaTrp4Eg7JeF642w7J207Yq4IOuMgOydkTogYXNzZXQgaGFzaCDrtojsnbzsuZgg7IucIO2YhOyerCDrsoTsoIQg7KeB7KCRIOyEnOu5mVxuICAgIHNlcnZlci5nZXQoXCIvYXNzZXRzLzpmaWxlbmFtZVwiLCBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3RlZEZpbGUgPVxuICAgICAgICAvKiBTQUZFVFk6IEFQSSDrjbDsvZTroIjsnbTthLDsmYAgWm9kIOqygOymneq4sCDrk7HroZ0g6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHJlcXVlc3QucGFyYW1zIGFzIHsgZmlsZW5hbWU6IHN0cmluZyB9XG4gICAgICAgICkuZmlsZW5hbWU7XG4gICAgICBjb25zdCBhc3NldHNEaXIgPSBwYXRoLmpvaW4od2ViRGlzdFBhdGgsIFwiYXNzZXRzXCIpO1xuICAgICAgY29uc3Qgc2FmZUZpbGVQYXRoID0gdGhpcy5yZXNvbHZlUGF0aFdpdGhpbkJhc2VEaXIoYXNzZXRzRGlyLCByZXF1ZXN0ZWRGaWxlKTtcbiAgICAgIGlmIChzYWZlRmlsZVBhdGggPT09IG51bGwpIHtcbiAgICAgICAgcmVwbHkuc3RhdHVzKDQwMykuc2VuZCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBub3JtYWxpemVkUmVxdWVzdGVkRmlsZSA9IHBhdGgucmVsYXRpdmUoYXNzZXRzRGlyLCBzYWZlRmlsZVBhdGgpLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpO1xuXG4gICAgICBjb25zdCBhc3NldFBhdGggPSBgL2Fzc2V0cy8ke25vcm1hbGl6ZWRSZXF1ZXN0ZWRGaWxlfWA7XG5cbiAgICAgIC8vIENhY2hlLUNvbnRyb2wg7Zek642UIOqysOyglVxuICAgICAgY29uc3QgZ2V0Q2FjaGVDb250cm9sRm9yQXNzZXQgPSAoKTogQ2FjaGVDb250cm9sQ29uZmlnID0+IHtcbiAgICAgICAgY29uc3QgY2FjaGVSZXE6IENhY2hlQ29udHJvbFJlcXVlc3QgPSB7XG4gICAgICAgICAgdHlwZTogXCJhc3NldHNcIixcbiAgICAgICAgICB1cmw6IHJlcXVlc3QudXJsLFxuICAgICAgICAgIHBhdGg6IGFzc2V0UGF0aCxcbiAgICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIOyCrOyaqeyekCDsoJXsnZgg7ZW465Ok65+sIOyasOyEoFxuICAgICAgICBpZiAoY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcihjYWNoZVJlcSk7XG4gICAgICAgICAgaWYgKHJlc3VsdCkgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOq4sOuzuOqwkjogaW1tdXRhYmxlXG4gICAgICAgIHJldHVybiBDYWNoZVByZXNldHMuaW1tdXRhYmxlO1xuICAgICAgfTtcblxuICAgICAgLy8gaW5kZXgtKi5qcyDrmJDripQgaW5kZXgtKi5jc3Mg7JqU7LKt7J24IOqyveyasFxuICAgICAgaWYgKC9eaW5kZXgtW2EtZjAtOV0rXFwuKGpzfGNzcykkLy50ZXN0KG5vcm1hbGl6ZWRSZXF1ZXN0ZWRGaWxlKSkge1xuICAgICAgICBjb25zdCBleHQgPSBub3JtYWxpemVkUmVxdWVzdGVkRmlsZS5zcGxpdChcIi5cIikucG9wKCk7XG4gICAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcihhc3NldHNEaXIpO1xuICAgICAgICBjb25zdCBjdXJyZW50RmlsZSA9IGZpbGVzLmZpbmQoKGYpID0+IGYuc3RhcnRzV2l0aChcImluZGV4LVwiKSAmJiBmLmVuZHNXaXRoKGAuJHtleHR9YCkpO1xuXG4gICAgICAgIGlmIChjdXJyZW50RmlsZSkge1xuICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGFzc2V0c0RpciwgY3VycmVudEZpbGUpO1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCk7XG4gICAgICAgICAgcmVwbHkudHlwZShleHQgPT09IFwianNcIiA/IFwiYXBwbGljYXRpb24vamF2YXNjcmlwdFwiIDogXCJ0ZXh0L2Nzc1wiKTtcbiAgICAgICAgICBhcHBseUNhY2hlSGVhZGVycyhyZXBseSwgZ2V0Q2FjaGVDb250cm9sRm9yQXNzZXQoKSk7XG4gICAgICAgICAgcmV0dXJuIHJlcGx5LnNlbmQoY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g7J2867CYIO2MjOydvCDshJzruZlcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gc2FmZUZpbGVQYXRoO1xuICAgICAgaWYgKGF3YWl0IGV4aXN0cyhmaWxlUGF0aCkpIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoKTtcbiAgICAgICAgY29uc3QgZXh0ID0gbm9ybWFsaXplZFJlcXVlc3RlZEZpbGUuc3BsaXQoXCIuXCIpLnBvcCgpO1xuICAgICAgICByZXBseS50eXBlKGV4dCA9PT0gXCJqc1wiID8gXCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0XCIgOiBleHQgPT09IFwiY3NzXCIgPyBcInRleHQvY3NzXCIgOiBcIlwiKTtcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRSZXF1ZXN0ZWRGaWxlLmluY2x1ZGVzKFwiLVwiKSkge1xuICAgICAgICAgIGFwcGx5Q2FjaGVIZWFkZXJzKHJlcGx5LCBnZXRDYWNoZUNvbnRyb2xGb3JBc3NldCgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVwbHkuc2VuZChjb250ZW50KTtcbiAgICAgIH1cblxuICAgICAgcmVwbHkuc3RhdHVzKDQwNCkuc2VuZCgpO1xuICAgIH0pO1xuXG4gICAgLy8gU1NSIOudvOyasO2KuCDqsJzrs4Qg65Ox66GdIChjb21wcmVzcyDsmLXshZjsnbQg65287Jqw7Yq467OE66GcIOyggeyaqeuQmOuPhOuhnSlcbiAgICBpZiAoc3NyQXZhaWxhYmxlKSB7XG4gICAgICBjb25zdCB7IGdldFNTUlJvdXRlcyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3NyXCIpO1xuICAgICAgY29uc3QgeyByZW5kZXJTU1IgfSA9IGF3YWl0IGltcG9ydChcIi4uL3Nzci9yZW5kZXJlclwiKTtcbiAgICAgIGNvbnN0IHNzclJvdXRlcyA9IGdldFNTUlJvdXRlcygpO1xuXG4gICAgICBmb3IgKGNvbnN0IHJvdXRlIG9mIHNzclJvdXRlcykge1xuICAgICAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgICAgIG1ldGhvZDogW1wiR0VUXCIsIFwiSEVBRFwiXSxcbiAgICAgICAgICB1cmw6IHJvdXRlLnBhdGgsXG4gICAgICAgICAgY29tcHJlc3M6IHRvRmFzdGlmeUNvbXByZXNzT3B0aW9uKHJvdXRlLmNvbXByZXNzID8/IHRydWUsIGdsb2JhbENvbXByZXNzT3B0aW9ucyksXG4gICAgICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSByZXF1ZXN0LnVybDtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBbU1NSXSBNYXRjaGVkIHJvdXRlOiAke3JvdXRlLnBhdGh9YCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuZXh0cmFjdFBhdGhQYXJhbXMocm91dGUucGF0aCwgdXJsKTtcbiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSBhd2FpdCByZW5kZXJTU1IodXJsLCByb3V0ZSwgcGFyYW1zLCByZXF1ZXN0LCByZXBseSwgY29uZmlnKTtcblxuICAgICAgICAgICAgcmVwbHkudHlwZShcInRleHQvaHRtbFwiKTtcbiAgICAgICAgICAgIHJldHVybiBodG1sO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENTUiBvciBTdGF0aWMgRmlsZSBGYWxsYmFjayAoU1NSIOudvOyasO2KuOyXkCDrp6Tsua3rkJjsp4Ag7JWK64qUIOuqqOuToCDsmpTssq0pXG4gICAgc2VydmVyLnJvdXRlKHtcbiAgICAgIG1ldGhvZDogW1wiR0VUXCIsIFwiSEVBRFwiXSxcbiAgICAgIHVybDogXCIqXCIsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgLy8gL2FwaSwgL3NvbmFtdS11aeuKlCA0MDQg6re464yA66GcXG4gICAgICAgIGlmIChyZXF1ZXN0LnVybC5zdGFydHNXaXRoKFwiL2FwaVwiKSB8fCByZXF1ZXN0LnVybC5zdGFydHNXaXRoKFwiL3NvbmFtdS11aVwiKSkge1xuICAgICAgICAgIHJlcGx5LnN0YXR1cyg0MDQpLnNlbmQoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDU1LsmqkgQ2FjaGUtQ29udHJvbCDtl6TrjZQg7ISk7KCVXG4gICAgICAgIGlmIChjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcikge1xuICAgICAgICAgIGNvbnN0IGNzckNhY2hlUmVxOiBDYWNoZUNvbnRyb2xSZXF1ZXN0ID0ge1xuICAgICAgICAgICAgdHlwZTogXCJjc3JcIixcbiAgICAgICAgICAgIHVybDogcmVxdWVzdC51cmwsXG4gICAgICAgICAgICBwYXRoOiByZXF1ZXN0LnVybC5zcGxpdChcIj9cIilbMF0sXG4gICAgICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgY3NyQ2FjaGVDb25maWcgPSBjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcihjc3JDYWNoZVJlcSk7XG5cbiAgICAgICAgICBpZiAoY3NyQ2FjaGVDb25maWcpIHtcbiAgICAgICAgICAgIGFwcGx5Q2FjaGVIZWFkZXJzKHJlcGx5LCBjc3JDYWNoZUNvbmZpZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8g7KCV7KCBIO2MjOydvOydtCDsobTsnqztlaAg6rK97JqwLCDsoJXsoIEg7YyM7J287J2EIOuovOyggCDshJzruZntlbTslbztlahcbiAgICAgICAgY29uc3QgcmVxdWVzdFBhdGggPSB0aGlzLmdldFBhdGhuYW1lRnJvbVVybChyZXF1ZXN0LnVybCk7XG4gICAgICAgIGNvbnN0IHNhZmVGaWxlUGF0aCA9IHRoaXMucmVzb2x2ZVBhdGhXaXRoaW5CYXNlRGlyKHdlYkRpc3RQYXRoLCByZXF1ZXN0UGF0aCk7XG4gICAgICAgIGlmIChzYWZlRmlsZVBhdGggPT09IG51bGwpIHtcbiAgICAgICAgICByZXBseS5zdGF0dXMoNDAzKS5zZW5kKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhd2FpdCBmaWxlRXhpc3RzKHNhZmVGaWxlUGF0aCkpIHtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoc2FmZUZpbGVQYXRoKTtcbiAgICAgICAgICByZXR1cm4gcmVwbHkudHlwZShtaW1lTG9va3VwKHNhZmVGaWxlUGF0aCkgfHwgXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIikuc2VuZChjb250ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENTUiBmYWxsYmFjazogaW5kZXguaHRtbCDshJzruZlcbiAgICAgICAgY29uc3QgaW5kZXhQYXRoID0gcGF0aC5qb2luKHdlYkRpc3RQYXRoLCBcImluZGV4Lmh0bWxcIik7XG4gICAgICAgIHJldHVybiByZXBseS50eXBlKFwidGV4dC9odG1sXCIpLnNlbmQoYXdhaXQgZnMucmVhZEZpbGUoaW5kZXhQYXRoLCBcInV0Zi04XCIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZyhg4pyTIFN0YXRpYyB3ZWIgc2VydmVyIGNvbmZpZ3VyZWQgd2l0aCAke3NzckF2YWlsYWJsZSA/IFwiU1NSXCIgOiBcIkNTUiBvbmx5XCJ9IHN1cHBvcnRgKTtcbiAgfVxuXG4gIGNyZWF0ZUFwaUhhbmRsZXIoXG4gICAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICAgbW9kZWxzOiBMb2FkZWRNb2RlbHMgPSB0aGlzLnN5bmNlci5tb2RlbHMsXG4gICAgZGVwZW5kZW5jaWVzOiBTb25hbXVIdHRwVmFsaWRhdG9yRGVwZW5kZW5jaWVzID0gZGVmYXVsdFNvbmFtdUh0dHBWYWxpZGF0b3JEZXBlbmRlbmNpZXMsXG4gICk6IChyZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCwgcmVwbHk6IEZhc3RpZnlSZXBseSkgPT4gUHJvbWlzZTxBcGlNZXRob2RSZXN1bHQ+IHtcbiAgICBjb25zdCBwcmVwYXJlZFZhbGlkYXRvciA9IHRoaXMuZ2V0T3JDcmVhdGVIdHRwVmFsaWRhdG9yKGFwaSwgZGVwZW5kZW5jaWVzKTtcblxuICAgIHJldHVybiBhc3luYyAocmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpOiBQcm9taXNlPEFwaU1ldGhvZFJlc3VsdD4gPT4ge1xuICAgICAgY29uc3QgdmFsaWRhdG9yID1cbiAgICAgICAgcHJlcGFyZWRWYWxpZGF0b3IgaW5zdGFuY2VvZiBQcm9taXNlID8gYXdhaXQgcHJlcGFyZWRWYWxpZGF0b3IgOiBwcmVwYXJlZFZhbGlkYXRvcjtcbiAgICAgIC8vIENvbnRleHQg7IOd7ISxXG4gICAgICBjb25zdCBjb250ZXh0OiBDb250ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVDb250ZXh0KGNvbmZpZywgcmVxdWVzdCwgcmVwbHkpO1xuXG4gICAgICByZXR1cm4gdGhpcy5hc3luY0xvY2FsU3RvcmFnZS5ydW4oeyBjb250ZXh0IH0sIGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gZ3VhcmRzIOyymOumrFxuICAgICAgICBydW5HdWFyZHMoe1xuICAgICAgICAgIGd1YXJkczogYXBpLm9wdGlvbnMuZ3VhcmRzLFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIGFwaSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gcmVxdWVzdCDtjIzsi7FcbiAgICAgICAgY29uc3Qgd2hpY2ggPSBhcGkub3B0aW9ucy5odHRwTWV0aG9kID09PSBcIkdFVFwiID8gXCJxdWVyeVwiIDogXCJib2R5XCI7XG4gICAgICAgIGxldCByZXFCb2R5ID0gbmV3IE1hcDxzdHJpbmcsIEFwaUFyZ3VtZW50PigpO1xuICAgICAgICAvLyDtjIzsnbwg7JeF66Gc65OcIOyeiOuKlCDqsr3smrAg7J6E7IucIOuNsOydtO2EsFxuICAgICAgICBjb25zdCBmaWxlczogVXBsb2FkZWRSZXF1ZXN0RmlsZXMgPSB7XG4gICAgICAgICAgYnVmZmVyZWRGaWxlczogW10sXG4gICAgICAgICAgdXBsb2FkZWRGaWxlczogW10sXG4gICAgICAgIH07XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBib2R5ID0gcmVxdWVzdFt3aGljaF0gPz8ge307XG4gICAgICAgICAgaWYgKGFwaS51cGxvYWRPcHRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IHJlcXVlc3QucGFydHMoe1xuICAgICAgICAgICAgICBsaW1pdHM6IGFwaS51cGxvYWRPcHRpb25zLmxpbWl0cyxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBGb3JtRGF0YeydmCBmaWVsZOuTpOydhCDsnoTsi5zroZwg7KCA7J6lXG4gICAgICAgICAgICBjb25zdCBmaWVsZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgICAgICAgICAgaWYgKGFwaS51cGxvYWRPcHRpb25zLmNvbnN1bWUgPT09IFwiYnVmZmVyXCIgfHwgIWFwaS51cGxvYWRPcHRpb25zLmNvbnN1bWUpIHtcbiAgICAgICAgICAgICAgLy8gQnVmZmVyIOuqqOuTnDog66mU66qo66as7JeQIOuhnOuTnFxuICAgICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFydC50eXBlID09PSBcImZpbGVcIikge1xuICAgICAgICAgICAgICAgICAgLy8gQ1JJVElDQUw6IO2MjOydvCDsiqTtirjrprzsnYQg7KaJ7IucIGNvbnN1bWXtlbTslbwg64uk7J2MIHBhcnTroZwg64SY7Ja06rCIIOyImCDsnojsnYxcbiAgICAgICAgICAgICAgICAgIC8vIOydtCDtmLjstpzsnbQg7JeG7Jy866m0IOyiheyihSBtdWx0aXBhcnQg7YyM7Iux7J20IHBlbmRpbmcg7IOB7YOc66GcIO2DgOyehOyVhOybgyDrsJzsg51cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IHBhcnQudG9CdWZmZXIoKTtcbiAgICAgICAgICAgICAgICAgIGZpbGVzLmJ1ZmZlcmVkRmlsZXMucHVzaChuZXcgQnVmZmVyZWRGaWxlKHBhcnQsIGJ1ZmZlcikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC50eXBlID09PSBcImZpZWxkXCIpIHtcbiAgICAgICAgICAgICAgICAgIGZpZWxkc1twYXJ0LmZpZWxkbmFtZV0gPSBTdHJpbmcocGFydC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFwaS51cGxvYWRPcHRpb25zLmNvbnN1bWUgPT09IFwic3RyZWFtXCIpIHtcbiAgICAgICAgICAgICAgLy8gU3RyZWFtIOuqqOuTnDog7KaJ7IucIOyggOyepeyGjOuhnCDsiqTtirjrpqzrsI1cbiAgICAgICAgICAgICAgY29uc3QgZGlza05hbWUgPSBhcGkudXBsb2FkT3B0aW9ucy5kZXN0aW5hdGlvbjtcbiAgICAgICAgICAgICAgY29uc3QgZGlzayA9IHRoaXMuc3RvcmFnZS51c2UoZGlza05hbWUpO1xuXG4gICAgICAgICAgICAgIC8vIOyasOyEoOyInOychDog642w7L2U66CI7J207YSwID4g7KCE7JetIOyEpOyglSA+IOq4sOuzuOqwklxuICAgICAgICAgICAgICBjb25zdCBrZXlHZW5lcmF0b3I6IEtleUdlbmVyYXRvciA9XG4gICAgICAgICAgICAgICAgYXBpLnVwbG9hZE9wdGlvbnMua2V5R2VuZXJhdG9yID8/XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc2VydmVyLnN0b3JhZ2U/LmtleUdlbmVyYXRvciA/P1xuICAgICAgICAgICAgICAgIGRlZmF1bHRLZXlHZW5lcmF0b3I7XG5cbiAgICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gXCJmaWxlXCIpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IGtleUdlbmVyYXRvcih7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBwYXJ0LmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgICBtaW1ldHlwZTogcGFydC5taW1ldHlwZSxcbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICBhd2FpdCBkaXNrLnB1dFN0cmVhbShrZXksIHBhcnQuZmlsZSwge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogcGFydC5taW1ldHlwZSxcbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSBhd2FpdCBkaXNrLmdldFVybChrZXkpO1xuICAgICAgICAgICAgICAgICAgY29uc3Qgc2lnbmVkVXJsID0gYXdhaXQgZGlzay5nZXRTaWduZWRVcmwoa2V5KTtcblxuICAgICAgICAgICAgICAgICAgZmlsZXMudXBsb2FkZWRGaWxlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBuZXcgVXBsb2FkZWRGaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogcGFydC5maWxlbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBtaW1ldHlwZTogcGFydC5taW1ldHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICBzaXplOiBwYXJ0LmZpbGUuYnl0ZXNSZWFkLFxuICAgICAgICAgICAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgICAgICAgICAgICBzaWduZWRVcmwsXG4gICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgIGRpc2tOYW1lLFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0LnR5cGUgPT09IFwiZmllbGRcIikge1xuICAgICAgICAgICAgICAgICAgZmllbGRzW3BhcnQuZmllbGRuYW1lXSA9IFN0cmluZyhwYXJ0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gcXProZwg7KSR7LKpIOq1rOyhsCDtjIzsi7E6IHBhcmFtc1tjYXRlZ29yeV0g4oaSIHsgcGFyYW1zOiB7IGNhdGVnb3J5OiBcInRlc3RcIiB9IH1cbiAgICAgICAgICAgIGNvbnN0IHFzID0gYXdhaXQgaW1wb3J0KFwicXNcIik7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBxcy5kZWZhdWx0LnBhcnNlKGZpZWxkcyk7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGJvZHksIHBhcnNlZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVxQm9keSA9IHRvQXBpQXJndW1lbnRNYXAodmFsaWRhdG9yLnBhcnNlKGJvZHkpKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnN0IHsgWm9kRXJyb3IgfSA9IGF3YWl0IGltcG9ydChcInpvZFwiKTtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFpvZEVycm9yKSB7XG4gICAgICAgICAgICBjb25zdCB7IGh1bWFuaXplWm9kRXJyb3IgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL3pvZC1lcnJvclwiKTtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gaHVtYW5pemVab2RFcnJvcihlKVxuICAgICAgICAgICAgICAubWFwKChpc3N1ZSkgPT4gaXNzdWUubWVzc2FnZSlcbiAgICAgICAgICAgICAgLmpvaW4oXCIgXCIpO1xuICAgICAgICAgICAgY29uc3QgeyBCYWRSZXF1ZXN0RXhjZXB0aW9uIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9leGNlcHRpb25zL3NvLWV4Y2VwdGlvbnNcIik7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcbiAgICAgICAgICAgICAgLyogU0FGRVRZOiBBUEkg642w7L2U66CI7J207YSw7JmAIFpvZCDqsoDspp3quLAg65Ox66GdIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIG1lc3NhZ2VzIGFzIExvY2FsaXplZFN0cmluZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHpvZEVycm9yOiBlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb250ZW50LVR5cGVcbiAgICAgICAgcmVwbHkudHlwZShhcGkub3B0aW9ucy5jb250ZW50VHlwZSA/PyBcImFwcGxpY2F0aW9uL2pzb25cIik7XG5cbiAgICAgICAgLy8gQ2FjaGUtQ29udHJvbCDtl6TrjZQg7ISk7KCVXG4gICAgICAgIGNvbnN0IGFwaUNhY2hlQ29uZmlnID0gdGhpcy5nZXRBcGlDYWNoZUNvbnRyb2woYXBpLCByZXF1ZXN0LCBjb25maWcpO1xuICAgICAgICBpZiAoYXBpQ2FjaGVDb25maWcpIHtcbiAgICAgICAgICBhcHBseUNhY2hlSGVhZGVycyhyZXBseSwgYXBpQ2FjaGVDb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g7JeF66Gc65OcIOyYteyFmOydtCDsnojripQg6rK97JqwIO2MjOydvCDrjbDsnbTthLDrpbwgQ29udGV4dOyXkCDstpTqsIBcbiAgICAgICAgaWYgKGFwaS51cGxvYWRPcHRpb25zKSB7XG4gICAgICAgICAgY29uc3QgY29uc3VtZSA9IGFwaS51cGxvYWRPcHRpb25zLmNvbnN1bWUgPz8gXCJidWZmZXJcIjtcbiAgICAgICAgICBpZiAoY29uc3VtZSA9PT0gXCJidWZmZXJcIikge1xuICAgICAgICAgICAgY29udGV4dC5idWZmZXJlZEZpbGVzID0gZmlsZXMuYnVmZmVyZWRGaWxlcztcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbnN1bWUgPT09IFwic3RyZWFtXCIpIHtcbiAgICAgICAgICAgIGNvbnRleHQudXBsb2FkZWRGaWxlcyA9IGZpbGVzLnVwbG9hZGVkRmlsZXM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8g66qo6424IOuplOyGjOuTnCBhcmdzIOyDneyEse2VmOyXrCDtmLjstpxcbiAgICAgICAgY29uc3QgeyBBcGlQYXJhbVR5cGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL3R5cGVzL3R5cGVzXCIpO1xuICAgICAgICBjb25zdCBhcmdzID0gYXBpLnBhcmFtZXRlcnMubWFwKChwYXJhbSkgPT4ge1xuICAgICAgICAgIC8vIENvbnRleHQg7J247KCd7IWYXG4gICAgICAgICAgaWYgKEFwaVBhcmFtVHlwZS5pc0NvbnRleHQocGFyYW0udHlwZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmVxQm9keS5nZXQocGFyYW0ubmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5pbnZva2VNb2RlbE1ldGhvZChhcGksIGFyZ3MsIHJlcGx5LCBtb2RlbHMpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3JDcmVhdGVIdHRwVmFsaWRhdG9yKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgZGVwZW5kZW5jaWVzOiBTb25hbXVIdHRwVmFsaWRhdG9yRGVwZW5kZW5jaWVzLFxuICApOiBIdHRwVmFsaWRhdG9yIHwgUHJvbWlzZTxIdHRwVmFsaWRhdG9yPiB7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5odHRwVmFsaWRhdG9ycy5nZXQoYXBpKTtcbiAgICBpZiAoY2FjaGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5wZW5kaW5nSHR0cFZhbGlkYXRvcnMuZ2V0KGFwaSk7XG4gICAgaWYgKGV4aXN0aW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gICAgY29uc3QgcGVuZGluZyA9IHRoaXMuYnVpbGRIdHRwVmFsaWRhdG9yKGFwaSwgZGVwZW5kZW5jaWVzKTtcbiAgICB0aGlzLnBlbmRpbmdIdHRwVmFsaWRhdG9ycy5zZXQoYXBpLCBwZW5kaW5nKTtcbiAgICB2b2lkIHBlbmRpbmcudGhlbihcbiAgICAgICh2YWxpZGF0b3IpID0+IHtcbiAgICAgICAgdGhpcy5odHRwVmFsaWRhdG9ycy5zZXQoYXBpLCB2YWxpZGF0b3IpO1xuICAgICAgICB0aGlzLnBlbmRpbmdIdHRwVmFsaWRhdG9ycy5kZWxldGUoYXBpKTtcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMucGVuZGluZ0h0dHBWYWxpZGF0b3JzLmRlbGV0ZShhcGkpO1xuICAgICAgfSxcbiAgICApO1xuICAgIHJldHVybiBwZW5kaW5nO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBidWlsZEh0dHBWYWxpZGF0b3IoXG4gICAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgICBkZXBlbmRlbmNpZXM6IFNvbmFtdUh0dHBWYWxpZGF0b3JEZXBlbmRlbmNpZXMsXG4gICk6IFByb21pc2U8SHR0cFZhbGlkYXRvcj4ge1xuICAgIGNvbnN0IHBvbGljeSA9IG5vcm1hbGl6ZVpvZENvbXBpbGVyUG9saWN5KHRoaXMuY29uZmlnLnZhbGlkYXRpb24/LnpvZENvbXBpbGVyKTtcbiAgICBjb25zdCBzb3VyY2VBb3QgPSBwcm9jZXNzLmVudi5IT1QgPT09IFwieWVzXCIgfHwgcHJvY2Vzcy5lbnYuVklURVNUID09PSBcInRydWVcIjtcbiAgICBpZiAocG9saWN5LmFwaSA9PT0gXCJhb3RcIiAmJiAhc291cmNlQW90KSB7XG4gICAgICBjb25zdCByZWdpc3RyeSA9IHRoaXMuYW90SHR0cFZhbGlkYXRvclJlZ2lzdHJ5ID8/IChhd2FpdCB0aGlzLmxvYWRBb3RIdHRwVmFsaWRhdG9yUmVnaXN0cnkoKSk7XG4gICAgICByZXR1cm4gdGhpcy5nZXRBb3RIdHRwVmFsaWRhdG9yKGFwaSwgcmVnaXN0cnkpO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBkZXBlbmRlbmNpZXMuY3JlYXRlVmFsaWRhdG9yKHtcbiAgICAgIGFwaSxcbiAgICAgIHBvbGljeSxcbiAgICAgIHR5cGVzOiB0aGlzLnN5bmNlci50eXBlcyxcbiAgICAgIGFsbG93QW90U291cmNlRmFsbGJhY2s6IHNvdXJjZUFvdCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QW90SHR0cFZhbGlkYXRvcihhcGk6IEV4dGVuZGVkQXBpLCByZWdpc3RyeTogSHR0cFZhbGlkYXRvclJlZ2lzdHJ5KTogSHR0cFZhbGlkYXRvciB7XG4gICAgY29uc3Qgcm91dGVLZXkgPSBnZXRIdHRwVmFsaWRhdG9yUm91dGVLZXkoYXBpKTtcbiAgICBjb25zdCB2YWxpZGF0b3IgPSByZWdpc3RyeS52YWxpZGF0b3JzLmdldChyb3V0ZUtleSk7XG4gICAgaWYgKHZhbGlkYXRvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgdmFsaWRhdG9yIHJlZ2lzdHJ5IGlzIG1pc3NpbmcgJHtyb3V0ZUtleX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkYXRvcjtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZEFvdEh0dHBWYWxpZGF0b3JSZWdpc3RyeShcbiAgICBhcGlzOiByZWFkb25seSBFeHRlbmRlZEFwaVtdID0gdGhpcy5zeW5jZXIuYXBpcyxcbiAgICBkZXBlbmRlbmNpZXM6IFNvbmFtdUh0dHBWYWxpZGF0b3JEZXBlbmRlbmNpZXMgPSBkZWZhdWx0U29uYW11SHR0cFZhbGlkYXRvckRlcGVuZGVuY2llcyxcbiAgKTogUHJvbWlzZTxIdHRwVmFsaWRhdG9yUmVnaXN0cnk+IHtcbiAgICBjb25zdCB7IHBhdGhUb0ZpbGVVUkwgfSA9IGF3YWl0IGltcG9ydChcIm5vZGU6dXJsXCIpO1xuICAgIGNvbnN0IHJlZ2lzdHJ5UGF0aCA9IHBhdGguam9pbihcbiAgICAgIHRoaXMuYXBpUm9vdFBhdGgsXG4gICAgICBcImRpc3QvYXBwbGljYXRpb24vc29uYW11LnZhbGlkYXRvcnMuZ2VuZXJhdGVkLmpzXCIsXG4gICAgKTtcbiAgICBpZiAoIShhd2FpdCBleGlzdHMocmVnaXN0cnlQYXRoKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgR2VuZXJhdGVkIEhUVFAgdmFsaWRhdG9yIHJlZ2lzdHJ5IG5vdCBmb3VuZDogJHtyZWdpc3RyeVBhdGh9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgaW1wb3J0ZWQgPVxuICAgICAgLyogU0FGRVRZOiBBUEkg642w7L2U66CI7J207YSw7JmAIFpvZCDqsoDspp3quLAg65Ox66GdIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChhd2FpdCBpbXBvcnQoXG4gICAgICAgIHBhdGhUb0ZpbGVVUkwocmVnaXN0cnlQYXRoKS5ocmVmXG4gICAgICApKSBhcyB7XG4gICAgICAgIGZpbmdlcnByaW50PzogdW5rbm93bjtcbiAgICAgICAgdmFsaWRhdG9ycz86IHVua25vd247XG4gICAgICB9O1xuICAgIGlmICghaXNTdHJpbmdWYWx1ZShpbXBvcnRlZC5maW5nZXJwcmludCkgfHwgIShpbXBvcnRlZC52YWxpZGF0b3JzIGluc3RhbmNlb2YgTWFwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGdlbmVyYXRlZCBIVFRQIHZhbGlkYXRvciByZWdpc3RyeTogJHtyZWdpc3RyeVBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsaWRhdG9yXSBvZiBpbXBvcnRlZC52YWxpZGF0b3JzKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFpc1N0cmluZ1ZhbHVlKGtleSkgfHxcbiAgICAgICAgIWlzT2JqZWN0VmFsdWUodmFsaWRhdG9yKSB8fFxuICAgICAgICB2YWxpZGF0b3IgPT09IG51bGwgfHxcbiAgICAgICAgIShcInBhcnNlXCIgaW4gdmFsaWRhdG9yKSB8fFxuICAgICAgICAhaXNGdW5jdGlvblZhbHVlKHZhbGlkYXRvci5wYXJzZSlcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgSFRUUCB2YWxpZGF0b3IgcmVnaXN0cnkgZW50cnk6ICR7U3RyaW5nKGtleSl9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVnaXN0cnk6IEh0dHBWYWxpZGF0b3JSZWdpc3RyeSA9IHtcbiAgICAgIGZpbmdlcnByaW50OiBpbXBvcnRlZC5maW5nZXJwcmludCxcbiAgICAgIHZhbGlkYXRvcnM6IGltcG9ydGVkLnZhbGlkYXRvcnMsXG4gICAgfTtcbiAgICBkZXBlbmRlbmNpZXMuYXNzZXJ0UmVnaXN0cnkoYXBpcywgcmVnaXN0cnkpO1xuICAgIHJldHVybiByZWdpc3RyeTtcbiAgfVxuXG4gIGFzeW5jIHJlZnJlc2hIdHRwVmFsaWRhdG9ycyhcbiAgICBkZXBlbmRlbmNpZXM6IFNvbmFtdUh0dHBWYWxpZGF0b3JEZXBlbmRlbmNpZXMgPSBkZWZhdWx0U29uYW11SHR0cFZhbGlkYXRvckRlcGVuZGVuY2llcyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcG9saWN5ID0gbm9ybWFsaXplWm9kQ29tcGlsZXJQb2xpY3kodGhpcy5jb25maWcudmFsaWRhdGlvbj8uem9kQ29tcGlsZXIpO1xuICAgIGNvbnN0IHNvdXJjZUFvdCA9IHByb2Nlc3MuZW52LkhPVCA9PT0gXCJ5ZXNcIiB8fCBwcm9jZXNzLmVudi5WSVRFU1QgPT09IFwidHJ1ZVwiO1xuICAgIGNvbnN0IG5leHRBcGlzID0gWy4uLnRoaXMuc3luY2VyLmFwaXNdO1xuICAgIGNvbnN0IG5leHRNb2RlbHMgPSB7IC4uLnRoaXMuc3luY2VyLm1vZGVscyB9O1xuICAgIGNvbnN0IHJlc3RBcGlzID0gbmV4dEFwaXMuZmlsdGVyKChhcGkpID0+IGFwaS53ZWJzb2NrZXRPcHRpb25zID09PSB1bmRlZmluZWQpO1xuICAgIGNvbnN0IG5leHQgPSBuZXcgV2Vha01hcDxFeHRlbmRlZEFwaSwgSHR0cFZhbGlkYXRvcj4oKTtcbiAgICBsZXQgbmV4dEFvdFJlZ2lzdHJ5OiBIdHRwVmFsaWRhdG9yUmVnaXN0cnkgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAocG9saWN5LmFwaSA9PT0gXCJhb3RcIiAmJiAhc291cmNlQW90KSB7XG4gICAgICBjb25zdCByZWdpc3RyeSA9IGF3YWl0IHRoaXMubG9hZEFvdEh0dHBWYWxpZGF0b3JSZWdpc3RyeShuZXh0QXBpcywgZGVwZW5kZW5jaWVzKTtcbiAgICAgIGZvciAoY29uc3QgYXBpIG9mIHJlc3RBcGlzKSB7XG4gICAgICAgIG5leHQuc2V0KGFwaSwgdGhpcy5nZXRBb3RIdHRwVmFsaWRhdG9yKGFwaSwgcmVnaXN0cnkpKTtcbiAgICAgIH1cbiAgICAgIG5leHRBb3RSZWdpc3RyeSA9IHJlZ2lzdHJ5O1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgcmVzdEFwaXMubWFwKGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWxpZGF0b3IgPSBhd2FpdCB0aGlzLmJ1aWxkSHR0cFZhbGlkYXRvcihhcGksIGRlcGVuZGVuY2llcyk7XG4gICAgICAgICAgbmV4dC5zZXQoYXBpLCB2YWxpZGF0b3IpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gdmFsaWRhdG9y7JmAIOqwmeydgCByZXZpc2lvbuydmCBBUEkvbW9kZWwgc25hcHNob3TsnYQg7ZWo6ruYIOqzteqwnO2VtCBITVIg7KSR6rCEIOyDge2DnOulvCDsiKjquYHri4jri6QuXG4gICAgdGhpcy5odHRwVmFsaWRhdG9ycyA9IG5leHQ7XG4gICAgdGhpcy5wZW5kaW5nSHR0cFZhbGlkYXRvcnMgPSBuZXcgV2Vha01hcCgpO1xuICAgIHRoaXMuYW90SHR0cFZhbGlkYXRvclJlZ2lzdHJ5ID0gbmV4dEFvdFJlZ2lzdHJ5O1xuICAgIHRoaXMucHJlcGFyZWRBcGlzID0gbmV4dEFwaXM7XG4gICAgdGhpcy5wcmVwYXJlZE1vZGVscyA9IG5leHRNb2RlbHM7XG4gIH1cblxuICAvLyBXUyBwYXRo66W8IOydvOuwmCBIVFRQIEdFVOycvOuhnCDtmLjstpztlZwg6rK97JqwIDQyNiArIFVwZ3JhZGUg7Zek642U66GcIOuqheyLnOyggeycvOuhnCB3ZWJzb2NrZXQg7KCR7IaN7J2EIOycoOuPhO2VqFxuICBwcml2YXRlIGNyZWF0ZVdlYlNvY2tldFVwZ3JhZGVSZXF1aXJlZEhhbmRsZXIoKSB7XG4gICAgcmV0dXJuIGFzeW5jIChfcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIHJlcGx5LmhlYWRlcihcImNvbm5lY3Rpb25cIiwgXCJVcGdyYWRlXCIpLmhlYWRlcihcInVwZ3JhZGVcIiwgXCJ3ZWJzb2NrZXRcIikuc3RhdHVzKDQyNikuc2VuZCh7XG4gICAgICAgIG1lc3NhZ2U6IFwiV2ViU29ja2V0IHVwZ3JhZGUgcmVxdWlyZWRcIixcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICAvLyBkZXYg66qo65Oc7J2YIGNhdGNoLWFsbCB3c0hhbmRsZXLsl5DshJwg7Iuk7KCcIFdTIEFQSeuhnCDrlJTsiqTtjKjsuZjtlaguIOunpOy5reuQmOuKlCByb3V0ZeqwgCDsl4bsnLzrqbQgMTAwOOuhnCDri6vsnYxcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVEZXZXZWJTb2NrZXRSZXF1ZXN0KFxuICAgIHNvY2tldDogV2ViU29ja2V0LFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbWF0Y2hlZEFwaSA9IHRoaXMuZmluZE1hdGNoZWRBcGkocmVxdWVzdCwgdGhpcy5zeW5jZXIuYXBpcywgdGhpcy5zeW5jZXIubW9kZWxzKTtcbiAgICBpZiAoIW1hdGNoZWRBcGk/LndlYnNvY2tldE9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHRyYWNlQ29udGV4dCA9IHRoaXMud2Vic29ja2V0UnVudGltZS50ZWxlbWV0cnlDb250cm9sbGVyLmNyZWF0ZUNvbm5lY3Rpb25Db250ZXh0KHtcbiAgICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgfSk7XG4gICAgICB0aGlzLndlYnNvY2tldFJ1bnRpbWUudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgbmFtZTogXCJ3cy5jb25uZWN0aW9uLnJlamVjdGVkXCIsXG4gICAgICAgIGxldmVsOiBcIndhcm5cIixcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgcmVhc29uOiBcInJvdXRlTm90Rm91bmRcIixcbiAgICAgICAgICBwYXRoOiByZXF1ZXN0LnVybCxcbiAgICAgICAgfSxcbiAgICAgICAgdHJhY2VJZDogdHJhY2VDb250ZXh0LnRyYWNlSWQsXG4gICAgICAgIHNwYW5JZDogdHJhY2VDb250ZXh0LnNwYW5JZCxcbiAgICAgICAgcGFyZW50U3BhbklkOiB0cmFjZUNvbnRleHQucGFyZW50U3BhbklkLFxuICAgICAgICBzYW1wbGVkOiB0cmFjZUNvbnRleHQuc2FtcGxlZCxcbiAgICAgIH0pO1xuICAgICAgc29ja2V0LmNsb3NlKDEwMDgsIFwiV2ViU29ja2V0IHJvdXRlIG5vdCBmb3VuZFwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5jcmVhdGVXZWJTb2NrZXRIYW5kbGVyKG1hdGNoZWRBcGksIGNvbmZpZyk7XG4gICAgYXdhaXQgaGFuZGxlcih7IHNvY2tldCB9LCByZXF1ZXN0KTtcbiAgfVxuXG4gIC8vIFdTIHJvdXRlIO2VuOuTpOufrOydmCDsi6Ttlokg7Iic7ISc66W8IOqzoOygle2VqDpcbiAgLy8gMSkgcXVlcnkgcGFyYW0g7YyM7Iux7J2EIGFjdGl2YXRpb24g7KCE7JeQIOuBneuCtCBoYW5kc2hha2Ug7Iuk7Yyo6rCAIHJlZ2lzdHJ57JeQIOuFuOy2nOuQmOyngCDslYrqsowg7ZWoXG4gIC8vIDIpIGBhY3RpdmU6IGZhbHNlYOuhnCDrqLzsoIAg65Ox66Gd7ZWcIOuSpCBjb250ZXh0IOyViOyXkOyEnCBndWFyZOulvCDsi6TtlontlbQg7J247KadIOygleuztOulvCDssLjsobDtlaAg7IiYIOyeiOqyjCDtlahcbiAgLy8gMykgY29udGV4dC9ndWFyZCDspIDruYTqsIAg64Gd64KcIOuSpCBgYWN0aXZhdGUoKWDtlbQg67iM66Gc65Oc7LqQ7Iqk7Yq46rCAIOy0iOq4sO2ZlCDspJHqsIQg7IOB7YOc66W8IOuztOyngCDrqrvtlZjqsowg7ZWoXG4gIC8vIOyXkOufrCDrsJzsg50g7Iuc7JeQ64qUIHJlc29sdmVXZWJTb2NrZXRDbG9zZURlc2NyaXB0b3Ig7KCV7LGF7JeQIOuUsOudvCBjbG9zZSBjb2Rl66W8IOunpO2Vke2VqFxuICBjcmVhdGVXZWJTb2NrZXRIYW5kbGVyRm9yVGVzdGluZyhhcGk6IEV4dGVuZGVkQXBpLCBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVXZWJTb2NrZXRIYW5kbGVyKGFwaSwgY29uZmlnKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlV2ViU29ja2V0SGFuZGxlcihhcGk6IEV4dGVuZGVkQXBpLCBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcpIHtcbiAgICByZXR1cm4gYXN5bmMgKFxuICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICBzb2NrZXQ6IFdlYlNvY2tldDtcbiAgICAgIH0sXG4gICAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGNvbnN0IHNvY2tldCA9IGNvbm5lY3Rpb24uc29ja2V0O1xuICAgICAgbGV0IHdzQ29udGV4dDogV2ViU29ja2V0Q29udGV4dDxvYmplY3QsIG9iamVjdD4gfCBudWxsID0gbnVsbDtcbiAgICAgIGxldCByYXdXczogUmV0dXJuVHlwZTxXZWJTb2NrZXRSdW50aW1lW1wicmVnaXN0ZXJDb25uZWN0aW9uXCJdPiB8IG51bGwgPSBudWxsO1xuICAgICAgbGV0IHByZVJlZ2lzdGVyUGhhc2U6IFwiZ3VhcmRcIiB8IFwicXVlcnlcIiB8IFwicmVnaXN0ZXJcIiB8IFwiaGFuZGxlclwiID0gXCJndWFyZFwiO1xuICAgICAgbGV0IHRyYWNlQ29udGV4dDogV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvbkNvbnRleHQgPSB7fTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgdHJhY2VDb250ZXh0ID0gdGhpcy53ZWJzb2NrZXRSdW50aW1lLnRlbGVtZXRyeUNvbnRyb2xsZXIuY3JlYXRlQ29ubmVjdGlvbkNvbnRleHQoe1xuICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcHJlUmVnaXN0ZXJQaGFzZSA9IFwicXVlcnlcIjtcbiAgICAgICAgY29uc3QgcmVxQm9keSA9IGF3YWl0IHRoaXMucGFyc2VXZWJTb2NrZXRSZXF1ZXN0UGFyYW1zKGFwaSwgcmVxdWVzdCk7XG4gICAgICAgIHByZVJlZ2lzdGVyUGhhc2UgPSBcInJlZ2lzdGVyXCI7XG4gICAgICAgIHJhd1dzID0gdGhpcy53ZWJzb2NrZXRSdW50aW1lLnJlZ2lzdGVyQ29ubmVjdGlvbihzb2NrZXQsIHtcbiAgICAgICAgICBvdXRFdmVudHM6IGFwaS53ZWJzb2NrZXRPcHRpb25zIS5vdXRFdmVudHMsXG4gICAgICAgICAgaW5FdmVudHM6IGFwaS53ZWJzb2NrZXRPcHRpb25zIS5pbkV2ZW50cyxcbiAgICAgICAgICBuYW1lc3BhY2U6IGFwaS53ZWJzb2NrZXRPcHRpb25zIS5uYW1lc3BhY2UsXG4gICAgICAgICAgaGVhcnRiZWF0OiBhcGkud2Vic29ja2V0T3B0aW9ucyEuaGVhcnRiZWF0LFxuICAgICAgICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgICAgICAgdHJhY2VJZDogdHJhY2VDb250ZXh0LnRyYWNlSWQsXG4gICAgICAgICAgc3BhbklkOiB0cmFjZUNvbnRleHQuc3BhbklkLFxuICAgICAgICAgIHBhcmVudFNwYW5JZDogdHJhY2VDb250ZXh0LnBhcmVudFNwYW5JZCxcbiAgICAgICAgICBzYW1wbGVkOiB0cmFjZUNvbnRleHQuc2FtcGxlZCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgc2NvcGVkV3MgPSB0aGlzLmNyZWF0ZVNjb3BlZFdlYlNvY2tldENvbm5lY3Rpb24ocmF3V3MsICgpID0+IHdzQ29udGV4dCk7XG4gICAgICAgIHdzQ29udGV4dCA9IGF3YWl0IHRoaXMuY3JlYXRlV2ViU29ja2V0Q29udGV4dChjb25maWcsIHJlcXVlc3QsIHNjb3BlZFdzKTtcblxuICAgICAgICBhd2FpdCB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7IGNvbnRleHQ6IHdzQ29udGV4dCB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgcnVuR3VhcmRzKHtcbiAgICAgICAgICAgIGd1YXJkczogYXBpLm9wdGlvbnMuZ3VhcmRzLFxuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgIGFwaSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy53ZWJzb2NrZXRSdW50aW1lLmFjdGl2YXRlQ29ubmVjdGlvbihyYXdXcy5pZCk7XG4gICAgICAgIHByZVJlZ2lzdGVyUGhhc2UgPSBcImhhbmRsZXJcIjtcblxuICAgICAgICBjb25zdCB7IEFwaVBhcmFtVHlwZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdHlwZXMvdHlwZXNcIik7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBhcGkucGFyYW1ldGVycy5tYXAoKHBhcmFtKSA9PiB7XG4gICAgICAgICAgaWYgKEFwaVBhcmFtVHlwZS5pc0NvbnRleHQocGFyYW0udHlwZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB3c0NvbnRleHQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHJlcUJvZHkuZ2V0KHBhcmFtLm5hbWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7IGNvbnRleHQ6IHdzQ29udGV4dCB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5pbnZva2VNb2RlbE1ldGhvZChhcGksIGFyZ3MpO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGNsb3NlRGVzY3JpcHRvciA9IHJlc29sdmVXZWJTb2NrZXRDbG9zZURlc2NyaXB0b3IoZXJyb3IpO1xuICAgICAgICBpZiAoIXJhd1dzKSB7XG4gICAgICAgICAgdGhpcy53ZWJzb2NrZXRSdW50aW1lLnRlbGVtZXRyeUNvbnRyb2xsZXIuZW1pdCh7XG4gICAgICAgICAgICBuYW1lOiBcIndzLmNvbm5lY3Rpb24ucmVqZWN0ZWRcIixcbiAgICAgICAgICAgIGxldmVsOiBjbG9zZURlc2NyaXB0b3IubG9nTGV2ZWwgPT09IFwid2FyblwiID8gXCJ3YXJuXCIgOiBcImVycm9yXCIsXG4gICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgcmVhc29uOiBwcmVSZWdpc3RlclBoYXNlLFxuICAgICAgICAgICAgICBjb2RlOiBjbG9zZURlc2NyaXB0b3IuY29kZSxcbiAgICAgICAgICAgICAgcGF0aDogYXBpLnBhdGgsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHJhY2VJZDogdHJhY2VDb250ZXh0LnRyYWNlSWQsXG4gICAgICAgICAgICBzcGFuSWQ6IHRyYWNlQ29udGV4dC5zcGFuSWQsXG4gICAgICAgICAgICBwYXJlbnRTcGFuSWQ6IHRyYWNlQ29udGV4dC5wYXJlbnRTcGFuSWQsXG4gICAgICAgICAgICBzYW1wbGVkOiB0cmFjZUNvbnRleHQuc2FtcGxlZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyYXdXcykge1xuICAgICAgICAgIHJhd1dzLmNsb3NlKGNsb3NlRGVzY3JpcHRvci5jb2RlLCBjbG9zZURlc2NyaXB0b3IucmVhc29uKTtcbiAgICAgICAgfSBlbHNlIGlmIChzb2NrZXQucmVhZHlTdGF0ZSA8IDIpIHtcbiAgICAgICAgICBzb2NrZXQuY2xvc2UoY2xvc2VEZXNjcmlwdG9yLmNvZGUsIGNsb3NlRGVzY3JpcHRvci5yZWFzb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2VydmVyPy5sb2cpIHtcbiAgICAgICAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICAgICAgZXJyOiBlcnJvcixcbiAgICAgICAgICAgIG1vZGVsTmFtZTogYXBpLm1vZGVsTmFtZSxcbiAgICAgICAgICAgIG1ldGhvZE5hbWU6IGFwaS5tZXRob2ROYW1lLFxuICAgICAgICAgICAgcGF0aDogYXBpLnBhdGgsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoY2xvc2VEZXNjcmlwdG9yLmxvZ0xldmVsID09PSBcIndhcm5cIikge1xuICAgICAgICAgICAgdGhpcy5zZXJ2ZXIubG9nLndhcm4ocGF5bG9hZCwgY2xvc2VEZXNjcmlwdG9yLnJlYXNvbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VydmVyLmxvZy5lcnJvcihwYXlsb2FkLCBjbG9zZURlc2NyaXB0b3IucmVhc29uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGNsb3NlRGVzY3JpcHRvci5sb2dMZXZlbCA9PT0gXCJ3YXJuXCIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihjbG9zZURlc2NyaXB0b3IucmVhc29uLCBlcnJvcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY2xvc2VEZXNjcmlwdG9yLnJlYXNvbiwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBvbk1lc3NhZ2Uvb25DbG9zZeyymOufvCDri6TrpbggdGlja+yXkOyEnCDsi6TtlonrkJjripQgY2FsbGJhY2vsnYAgQUxTIGNvbnRleHTqsIAg64GK6riw66+A66GcIHdyYXBwZXLsl5DshJwgYGFzeW5jTG9jYWxTdG9yYWdlLnJ1bmDsnLzroZwg64uk7IucIOqwkOyLuCDrs7Xsm5DtlahcbiAgLy8gcHVibGlzaC9qb2luL2xlYXZlL3NldFVzZXJJZCDqsJnsnYAg7KaJ7IucIOyLpO2WiSBBUEnripQg64uo7IicIOychOyehOunjCDtlZjqs6AsIGRlZmVycmVkIGNhbGxiYWNr7JeQ66eMIGNvbnRleHQg67O17JuQ7J2EIOyggeyaqe2VqFxuICBwcml2YXRlIGNyZWF0ZVNjb3BlZFdlYlNvY2tldENvbm5lY3Rpb248VE91dCBleHRlbmRzIG9iamVjdCwgVEluIGV4dGVuZHMgb2JqZWN0PihcbiAgICB3czogV2ViU29ja2V0Q29ubmVjdGlvbjxUT3V0LCBUSW4+LFxuICAgIGdldENvbnRleHQ6ICgpID0+IFdlYlNvY2tldENvbnRleHQgfCBudWxsLFxuICApOiBXZWJTb2NrZXRDb25uZWN0aW9uPFRPdXQsIFRJbj4ge1xuICAgIGNvbnN0IHRlbGVtZXRyeUNvbnRyb2xsZXIgPSB0aGlzLndlYnNvY2tldFJ1bnRpbWVWYWx1ZT8udGVsZW1ldHJ5Q29udHJvbGxlcjtcbiAgICBjb25zdCBydW5JbkNvbnRleHQgPSA8VD4oY2FsbGJhY2s6ICgpID0+IFQpOiBUID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBnZXRDb250ZXh0KCk7XG4gICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7IGNvbnRleHQgfSwgY2FsbGJhY2spO1xuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgZ2V0IGlkKCkge1xuICAgICAgICByZXR1cm4gd3MuaWQ7XG4gICAgICB9LFxuICAgICAgZ2V0IG5hbWVzcGFjZSgpIHtcbiAgICAgICAgcmV0dXJuIHdzLm5hbWVzcGFjZTtcbiAgICAgIH0sXG4gICAgICBnZXQgY2xvc2VkKCkge1xuICAgICAgICByZXR1cm4gd3MuY2xvc2VkO1xuICAgICAgfSxcbiAgICAgIGdldCB1c2VySWQoKSB7XG4gICAgICAgIHJldHVybiB3cy51c2VySWQ7XG4gICAgICB9LFxuICAgICAgdHJhbnNwb3J0OiBcIndzXCIsXG4gICAgICBwdWJsaXNoVW50eXBlZChldmVudCwgZGF0YSkge1xuICAgICAgICB3cy5wdWJsaXNoVW50eXBlZChldmVudCwgZGF0YSk7XG4gICAgICB9LFxuICAgICAgY2xvc2UoY29kZSwgcmVhc29uKSB7XG4gICAgICAgIHdzLmNsb3NlKGNvZGUsIHJlYXNvbik7XG4gICAgICB9LFxuICAgICAgb25DbG9zZShjYWxsYmFjaykge1xuICAgICAgICB3cy5vbkNsb3NlKCgpID0+IHJ1bkluQ29udGV4dChjYWxsYmFjaykpO1xuICAgICAgfSxcbiAgICAgIG9uTWVzc2FnZShldmVudCwgaGFuZGxlcikge1xuICAgICAgICB3cy5vbk1lc3NhZ2UoZXZlbnQsIChkYXRhLCBtZXNzYWdlVHJhY2VDb250ZXh0KSA9PlxuICAgICAgICAgIHJ1bkluQ29udGV4dChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBldmVudE5hbWUgPSBTdHJpbmcoZXZlbnQpO1xuICAgICAgICAgICAgY29uc3QgdHJhY2VDb250ZXh0ID0gbWVzc2FnZVRyYWNlQ29udGV4dCA/PyBnZXRXZWJTb2NrZXRUZWxlbWV0cnlDb250ZXh0KHdzKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG4gICAgICAgICAgICB0ZWxlbWV0cnlDb250cm9sbGVyPy5lbWl0KHtcbiAgICAgICAgICAgICAgbmFtZTogXCJ3cy5oYW5kbGVyLnN0YXJ0ZWRcIixcbiAgICAgICAgICAgICAgbGV2ZWw6IFwiZGVidWdcIixcbiAgICAgICAgICAgICAgY29ubmVjdGlvbklkOiB3cy5pZCxcbiAgICAgICAgICAgICAgbmFtZXNwYWNlOiB3cy5uYW1lc3BhY2UsXG4gICAgICAgICAgICAgIHVzZXJJZDogd3MudXNlcklkLFxuICAgICAgICAgICAgICBkZXRhaWw6IHsgZXZlbnQ6IGV2ZW50TmFtZSB9LFxuICAgICAgICAgICAgICAuLi50cmFjZUNvbnRleHQsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlcihkYXRhLCBtZXNzYWdlVHJhY2VDb250ZXh0KTtcbiAgICAgICAgICAgICAgY29uc3QgZHVyYXRpb25NcyA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRlZEF0O1xuICAgICAgICAgICAgICB0ZWxlbWV0cnlDb250cm9sbGVyPy5lbWl0KHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcIndzLmhhbmRsZXIuY29tcGxldGVkXCIsXG4gICAgICAgICAgICAgICAgbGV2ZWw6IFwiZGVidWdcIixcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uSWQ6IHdzLmlkLFxuICAgICAgICAgICAgICAgIG5hbWVzcGFjZTogd3MubmFtZXNwYWNlLFxuICAgICAgICAgICAgICAgIHVzZXJJZDogd3MudXNlcklkLFxuICAgICAgICAgICAgICAgIGRldGFpbDogeyBldmVudDogZXZlbnROYW1lIH0sXG4gICAgICAgICAgICAgICAgLi4udHJhY2VDb250ZXh0LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgdGVsZW1ldHJ5Q29udHJvbGxlcj8ucmVjb3JkU3Bhbih7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZTogXCJ3cy5tZXNzYWdlLnByb2Nlc3NcIixcbiAgICAgICAgICAgICAgICBraW5kOiBcImludGVybmFsXCIsXG4gICAgICAgICAgICAgICAgZHVyYXRpb25NcyxcbiAgICAgICAgICAgICAgICBzdGF0dXM6IFwidW5zZXRcIixcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uSWQ6IHdzLmlkLFxuICAgICAgICAgICAgICAgIG5hbWVzcGFjZTogd3MubmFtZXNwYWNlLFxuICAgICAgICAgICAgICAgIHVzZXJJZDogd3MudXNlcklkLFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHsgZXZlbnQ6IGV2ZW50TmFtZSB9LFxuICAgICAgICAgICAgICAgIC4uLnRyYWNlQ29udGV4dCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjb25zdCBkdXJhdGlvbk1zID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydGVkQXQ7XG4gICAgICAgICAgICAgIHRlbGVtZXRyeUNvbnRyb2xsZXI/LmVtaXQoe1xuICAgICAgICAgICAgICAgIG5hbWU6IFwid3MuaGFuZGxlci5mYWlsZWRcIixcbiAgICAgICAgICAgICAgICBsZXZlbDogXCJlcnJvclwiLFxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25JZDogd3MuaWQsXG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlOiB3cy5uYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgdXNlcklkOiB3cy51c2VySWQsXG4gICAgICAgICAgICAgICAgZGV0YWlsOiB7IGV2ZW50OiBldmVudE5hbWUgfSxcbiAgICAgICAgICAgICAgICAuLi50cmFjZUNvbnRleHQsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0ZWxlbWV0cnlDb250cm9sbGVyPy5yZWNvcmRTcGFuKHtcbiAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lOiBcIndzLm1lc3NhZ2UucHJvY2Vzc1wiLFxuICAgICAgICAgICAgICAgIGtpbmQ6IFwiaW50ZXJuYWxcIixcbiAgICAgICAgICAgICAgICBkdXJhdGlvbk1zLFxuICAgICAgICAgICAgICAgIHN0YXR1czogXCJlcnJvclwiLFxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25JZDogd3MuaWQsXG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlOiB3cy5uYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgdXNlcklkOiB3cy51c2VySWQsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogeyBldmVudDogZXZlbnROYW1lIH0sXG4gICAgICAgICAgICAgICAgZXJyb3JUeXBlOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubmFtZSA6IHJ1bnRpbWVUeXBlT2YoZXJyb3IpLFxuICAgICAgICAgICAgICAgIC4uLnRyYWNlQ29udGV4dCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIHB1Ymxpc2goZXZlbnQsIGRhdGEpIHtcbiAgICAgICAgd3MucHVibGlzaChldmVudCwgZGF0YSk7XG4gICAgICB9LFxuICAgICAgd2FpdEZvckNsb3NlKCkge1xuICAgICAgICByZXR1cm4gd3Mud2FpdEZvckNsb3NlKCk7XG4gICAgICB9LFxuICAgICAgam9pbihyb29tSWQpIHtcbiAgICAgICAgd3Muam9pbihyb29tSWQpO1xuICAgICAgfSxcbiAgICAgIGxlYXZlKHJvb21JZCkge1xuICAgICAgICB3cy5sZWF2ZShyb29tSWQpO1xuICAgICAgfSxcbiAgICAgIHNldFVzZXJJZCh1c2VySWQpIHtcbiAgICAgICAgd3Muc2V0VXNlcklkKHVzZXJJZCk7XG4gICAgICB9LFxuICAgICAgY2xlYXJVc2VySWQoKSB7XG4gICAgICAgIHdzLmNsZWFyVXNlcklkKCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBjcmVhdGVTY29wZWRXZWJTb2NrZXRDb25uZWN0aW9uRm9yVGVzdGluZzxUT3V0IGV4dGVuZHMgb2JqZWN0LCBUSW4gZXh0ZW5kcyBvYmplY3Q+KFxuICAgIHdzOiBXZWJTb2NrZXRDb25uZWN0aW9uPFRPdXQsIFRJbj4sXG4gICAgZ2V0Q29udGV4dDogKCkgPT4gV2ViU29ja2V0Q29udGV4dCB8IG51bGwsXG4gICk6IFdlYlNvY2tldENvbm5lY3Rpb248VE91dCwgVEluPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlU2NvcGVkV2ViU29ja2V0Q29ubmVjdGlvbih3cywgZ2V0Q29udGV4dCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHBhcnNlV2ViU29ja2V0UmVxdWVzdFBhcmFtcyhcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICApOiBQcm9taXNlPE1hcDxzdHJpbmcsIEFwaUFyZ3VtZW50Pj4ge1xuICAgIGNvbnN0IHsgZ2V0Wm9kT2JqZWN0RnJvbUFwaSB9ID0gYXdhaXQgaW1wb3J0KFwiLi9jb2RlLWNvbnZlcnRlcnNcIik7XG4gICAgY29uc3QgUmVxVHlwZSA9IGdldFpvZE9iamVjdEZyb21BcGkoYXBpLCB0aGlzLnN5bmNlci50eXBlcyk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBmYXN0aWZ5Q2FzdGVyIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2Nhc3RlclwiKTtcbiAgICAgIHJldHVybiB0b0FwaUFyZ3VtZW50TWFwKGZhc3RpZnlDYXN0ZXIoUmVxVHlwZSkucGFyc2UocmVxdWVzdC5xdWVyeSA/PyB7fSkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnN0IHsgWm9kRXJyb3IgfSA9IGF3YWl0IGltcG9ydChcInpvZFwiKTtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgWm9kRXJyb3IpIHtcbiAgICAgICAgY29uc3QgeyBodW1hbml6ZVpvZEVycm9yIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy96b2QtZXJyb3JcIik7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gaHVtYW5pemVab2RFcnJvcihlKVxuICAgICAgICAgIC5tYXAoKGlzc3VlKSA9PiBpc3N1ZS5tZXNzYWdlKVxuICAgICAgICAgIC5qb2luKFwiIFwiKTtcbiAgICAgICAgY29uc3QgeyBCYWRSZXF1ZXN0RXhjZXB0aW9uIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9leGNlcHRpb25zL3NvLWV4Y2VwdGlvbnNcIik7XG4gICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICAgIC8qIFNBRkVUWTogQVBJIOuNsOy9lOugiOydtO2EsOyZgCBab2Qg6rKA7Kad6riwIOuTseuhnSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBtZXNzYWdlcyBhcyBMb2NhbGl6ZWRTdHJpbmcsXG4gICAgICAgICAge1xuICAgICAgICAgICAgem9kRXJyb3I6IGUsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVVJM7JeQ7IScIHBhdGggcGFyYW1z66W8IOy2lOy2nO2VqeuLiOuLpC5cbiAgICog7JiIOiBwYXR0ZXJuPVwiL2FkbWluL2NvbXBhbmllcy86Y29tcGFueUlkXCIsIHVybD1cIi9hZG1pbi9jb21wYW5pZXMvMTIzXCIg4oaSIHsgY29tcGFueUlkOiBcIjEyM1wiIH1cbiAgICovXG4gIHByaXZhdGUgZXh0cmFjdFBhdGhQYXJhbXMocGF0dGVybjogc3RyaW5nLCB1cmw6IHN0cmluZykge1xuICAgIGNvbnN0IHBhdHRlcm5QYXJ0cyA9IHBhdHRlcm4uc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCB1cmxQYXJ0cyA9IHRoaXMuZ2V0UGF0aG5hbWVGcm9tVXJsKHVybCkuc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVyblBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocGF0dGVyblBhcnRzW2ldLnN0YXJ0c1dpdGgoXCI6XCIpKSB7XG4gICAgICAgIHBhcmFtc1twYXR0ZXJuUGFydHNbaV0uc2xpY2UoMSldID0gdXJsUGFydHNbaV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBwcml2YXRlIGlzUGF0aFBhdHRlcm5NYXRjaChwYXR0ZXJuOiBzdHJpbmcsIHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGF0dGVyblBhcnRzID0gcGF0dGVybi5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGNvbnN0IHVybFBhcnRzID0gdGhpcy5nZXRQYXRobmFtZUZyb21VcmwodXJsKS5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgaWYgKHBhdHRlcm5QYXJ0cy5sZW5ndGggIT09IHVybFBhcnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVyblBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwYXR0ZXJuUGFydCA9IHBhdHRlcm5QYXJ0c1tpXTtcbiAgICAgIGNvbnN0IHVybFBhcnQgPSB1cmxQYXJ0c1tpXTtcbiAgICAgIGlmIChwYXR0ZXJuUGFydC5zdGFydHNXaXRoKFwiOlwiKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXR0ZXJuUGFydCAhPT0gdXJsUGFydCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIGdldFBhdGhuYW1lRnJvbVVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHVybC5zcGxpdChcIj9cIilbMF07XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVQYXRoV2l0aGluQmFzZURpcihiYXNlRGlyOiBzdHJpbmcsIGlucHV0UGF0aDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVVUklDb21wb25lbnQoaW5wdXRQYXRoKS5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKTtcbiAgICAgIGlmIChkZWNvZGVkLmluY2x1ZGVzKFwiXFwwXCIpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gZGVjb2RlZC5yZXBsYWNlKC9eXFwvKy8sIFwiXCIpO1xuICAgICAgY29uc3QgcmVzb2x2ZWRQYXRoID0gcGF0aC5yZXNvbHZlKGJhc2VEaXIsIHJlbGF0aXZlUGF0aCk7XG4gICAgICBjb25zdCByZWxhdGl2ZUZyb21CYXNlID0gcGF0aC5yZWxhdGl2ZShiYXNlRGlyLCByZXNvbHZlZFBhdGgpO1xuICAgICAgaWYgKHJlbGF0aXZlRnJvbUJhc2Uuc3RhcnRzV2l0aChcIi4uXCIpIHx8IHBhdGguaXNBYnNvbHV0ZShyZWxhdGl2ZUZyb21CYXNlKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNvbHZlZFBhdGg7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQVBJIOydkeuLteyXkCDsoIHsmqntlaAgQ2FjaGUtQ29udHJvbCDshKTsoJXsnYQg6rKw7KCV7ZWp64uI64ukLlxuICAgKiDsmrDshKDsiJzsnIQ6IOqwnOuzhCDsp4DsoJUgPiBjYWNoZUNvbnRyb2xIYW5kbGVyXG4gICAqL1xuICBwcml2YXRlIGdldEFwaUNhY2hlQ29udHJvbChcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKSB7XG4gICAgLy8g642w7L2U66CI7J207YSwIOyEpOyglSDsmrDshKBcbiAgICBpZiAoYXBpLm9wdGlvbnMuY2FjaGVDb250cm9sKSB7XG4gICAgICByZXR1cm4gYXBpLm9wdGlvbnMuY2FjaGVDb250cm9sO1xuICAgIH1cblxuICAgIC8vIOyghOyXrSDtlbjrk6Trn6xcbiAgICBpZiAoY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIpIHtcbiAgICAgIGNvbnN0IGNhY2hlUmVxOiBDYWNoZUNvbnRyb2xSZXF1ZXN0ID0ge1xuICAgICAgICB0eXBlOiBcImFwaVwiLFxuICAgICAgICB1cmw6IHJlcXVlc3QudXJsLFxuICAgICAgICBwYXRoOiByZXF1ZXN0LnJvdXRlT3B0aW9ucz8udXJsID8/IHJlcXVlc3QudXJsLnNwbGl0KFwiP1wiKVswXSxcbiAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgYXBpLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKGNhY2hlUmVxKTtcbiAgICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU1NS7JqpIEFQSSDtmLjstpwgKEhUVFAg7Jik67KE7Zek65OcIOyXhuydtCDsp4HsoJEg7Zi47LacKVxuICAgKiBjcmVhdGVBcGlIYW5kbGVy7J2YIOuhnOyngeydhCDsnqzsgqzsmqntlZjrkJgsIHJlcXVlc3Qg7YyM7IuxIOuMgOyLoCBwYXJhbXMg7KeB7KCRIOyCrOyaqVxuICAgKi9cbiAgYXN5bmMgaW52b2tlQXBpRm9yU1NSKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgcGFyYW1zOiBhbnlbXSxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICAgcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gICAgcmVwbHk6IEZhc3RpZnlSZXBseSxcbiAgKTogUHJvbWlzZTxBcGlNZXRob2RSZXN1bHQ+IHtcbiAgICAvLyBDb250ZXh0IOyDneyEsSAo6riw7KG0IOuplOyGjOuTnCDsnqzsgqzsmqkpXG4gICAgY29uc3QgY29udGV4dCA9IGF3YWl0IHRoaXMuY3JlYXRlQ29udGV4dChjb25maWcsIHJlcXVlc3QsIHJlcGx5KTtcblxuICAgIHJldHVybiB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7IGNvbnRleHQgfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gYXJncyDsg53shLE6IENvbnRleHQg7YyM652866+47YSw64qUIOyjvOyehSwg64KY66i47KeA64qUIHBhcmFtc+yXkOyEnCDqsIDsoLjsmKTquLBcbiAgICAgIGNvbnN0IHsgQXBpUGFyYW1UeXBlIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi90eXBlcy90eXBlc1wiKTtcbiAgICAgIGxldCBwYXJhbXNJbmRleCA9IDA7XG4gICAgICBjb25zdCBhcmdzID0gYXBpLnBhcmFtZXRlcnMubWFwKChwYXJhbSkgPT4ge1xuICAgICAgICBpZiAoQXBpUGFyYW1UeXBlLmlzQ29udGV4dChwYXJhbS50eXBlKSkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJhbXNbcGFyYW1zSW5kZXgrK107XG4gICAgICB9KTtcblxuICAgICAgLy8g66qo6424IOuplOyEnOuTnCDtmLjstpwgKOq4sOyhtCDrqZTshJzrk5wg7J6s7IKs7JqpKVxuICAgICAgcmV0dXJuIHRoaXMuaW52b2tlTW9kZWxNZXRob2QoYXBpLCBhcmdzLCByZXBseSk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBoYW5kbGVEZXZBcGlSZXF1ZXN0Rm9yVGVzdGluZyhyZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCwgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlRGV2QXBpUmVxdWVzdChyZXF1ZXN0LCBjb25maWcpO1xuICB9XG5cbiAgLy8gV1Mg6rK966Gc7JeQ7ISc64qUIEhUVFAgcmVwbHnqsIAg7JeG7Jy866+A66GcIHJlcGx566W8IG9wdGlvbmFs66GcIOuwm+yVhCDqs7XthrUg7Zi47LacIOqyveuhnOulvCDsnKDsp4DtlahcbiAgYXN5bmMgaW52b2tlTW9kZWxNZXRob2QoXG4gICAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgICBhcmdzOiB1bmtub3duW10sXG4gICAgcmVwbHk/OiBGYXN0aWZ5UmVwbHksXG4gICAgbW9kZWxzOiBMb2FkZWRNb2RlbHMgPSB0aGlzLnN5bmNlci5tb2RlbHMsXG4gICk6IFByb21pc2U8QXBpTWV0aG9kUmVzdWx0PiB7XG4gICAgY29uc3QgbW9kZWwgPSBtb2RlbHNbYXBpLm1vZGVsTmFtZV07XG4gICAgaWYgKG1vZGVsID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTW9kZWwgbm90IGZvdW5kOiAke2FwaS5tb2RlbE5hbWV9YCk7XG4gICAgfVxuICAgIGNvbnN0IG1ldGhvZCA9XG4gICAgICBtb2RlbFtcbiAgICAgICAgLyogU0FGRVRZOiDrj5nquLDtmZTquLDqsIAg66qo6424IO2BtOuemOyKpOyXkOyEnCDsiJjsp5HtlZwgQVBJIOuplOyEnOuTnCDsnbTrpoTrp4wg7KCE64us7ZWc64ukLiAqLyBhcGkubWV0aG9kTmFtZSBhcyBrZXlvZiB0eXBlb2YgbW9kZWxcbiAgICAgIF07XG4gICAgaWYgKCFpc0Z1bmN0aW9uVmFsdWUobWV0aG9kKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb2RlbCBtZXRob2Qgbm90IGZvdW5kOiAke2FwaS5tb2RlbE5hbWV9LiR7YXBpLm1ldGhvZE5hbWV9YCk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKG1ldGhvZCwgbW9kZWwsIGFyZ3MpO1xuICAgIHJlcGx5Py50eXBlKGFwaS5vcHRpb25zLmNvbnRlbnRUeXBlID8/IFwiYXBwbGljYXRpb24vanNvblwiKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBhc3luYyBjcmVhdGVDb250ZXh0KFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICByZXBseTogRmFzdGlmeVJlcGx5LFxuICApOiBQcm9taXNlPENvbnRleHQ+IHtcbiAgICAvLyBjcmVhdGVTU0VGYWN0b3J5IO2VqOyImOyXkCDrr7jrpqwgcmVxdWVzdOydmCBzb2NrZXTqs7wgcmVwbHnrpbwg67CU7J2465SpLlxuICAgIGNvbnN0IHsgY3JlYXRlU1NFRmFjdG9yeSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3RyZWFtL3NzZVwiKTtcbiAgICBjb25zdCBjcmVhdGVTU0UgPSAoPFQgZXh0ZW5kcyBab2RPYmplY3Q+KFxuICAgICAgX3JlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgICAgX3JlcGx5OiBGYXN0aWZ5UmVwbHksXG4gICAgICBfZXZlbnRzOiBULFxuICAgICkgPT4gY3JlYXRlU1NFRmFjdG9yeShfcmVxdWVzdC5zb2NrZXQsIF9yZXBseSwgX2V2ZW50cykpLmJpbmQobnVsbCwgcmVxdWVzdCwgcmVwbHkpO1xuXG4gICAgLy8gbG9jYWxlIOqwkOyngFxuICAgIGNvbnN0IGxvY2FsZSA9XG4gICAgICB0aGlzLmRldGVjdExvY2FsZShyZXF1ZXN0LmhlYWRlcnNbXCJhY2NlcHQtbGFuZ3VhZ2VcIl0sIHRoaXMuY29uZmlnLmkxOG4uc3VwcG9ydGVkTG9jYWxlcykgPz9cbiAgICAgIHRoaXMuY29uZmlnLmkxOG4uZGVmYXVsdExvY2FsZTtcblxuICAgIC8vIGF1dGggY29udGV4dCDstpTqsIBcbiAgICBjb25zdCBoZWFkZXJzID0gY29udmVydEZhc3RpZnlIZWFkZXJzVG9TdGFuZGFyZChyZXF1ZXN0LmhlYWRlcnMpO1xuICAgIGNvbnN0IHNlc3Npb24gPSAoYXdhaXQgdGhpcy5hdXRoVmFsdWU/LmFwaS5nZXRTZXNzaW9uKHsgaGVhZGVycyB9KSkgPz8gbnVsbDtcblxuICAgIGNvbnN0IGNvbnRleHQ6IENvbnRleHQgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUoXG4gICAgICBjb25maWcuY29udGV4dFByb3ZpZGVyKFxuICAgICAgICB7XG4gICAgICAgICAgdHJhbnNwb3J0OiBcImh0dHBcIixcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIHJlcGx5LFxuICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgICBjcmVhdGVTU0UsXG4gICAgICAgICAgbmFpdGVTdG9yZTogbmV3IE1hcCgpLFxuICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICAvLyBhdXRoXG4gICAgICAgICAgdXNlcjogc2Vzc2lvbj8udXNlciA/PyBudWxsLFxuICAgICAgICAgIHNlc3Npb246IHNlc3Npb24/LnNlc3Npb24gPz8gbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgcmVwbHksXG4gICAgICApLFxuICAgICk7XG4gICAgcmV0dXJuIGNvbnRleHQ7XG4gIH1cblxuICAvLyBzZXNzaW9uL2xvY2FsZS9zdG9yZSDqsJnsnYAg6rO17Ya1IHN0YXRl64qUIEhUVFAgY29udGV4dOyZgCDqs7XsnKDtlZjrkJgsIHJlcGx5L2NyZWF0ZVNTRSDqsJnsnYAgSFRUUCDsoITsmqkgaGVscGVy64qUIOuFuOy2nO2VmOyngCDslYrsnYxcbiAgLy8g7IKs7Jqp7J6Q6rCAIHdlYnNvY2tldENvbnRleHRQcm92aWRlcuulvCDso7zrqbQg6re464yA66GcIOychOyehO2VmOqzoCwg7JeG7Jy866m0IOq4sOyhtCBjb250ZXh0UHJvdmlkZXLrpbwgcmVwbHkvU1NFIHN0dWLqs7wg7ZWo6ruYIOyerO2ZnOyaqe2VqFxuICBhc3luYyBjcmVhdGVXZWJTb2NrZXRDb250ZXh0KFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICB3czogQW55V2ViU29ja2V0Q29ubmVjdGlvbixcbiAgKTogUHJvbWlzZTxXZWJTb2NrZXRDb250ZXh0PiB7XG4gICAgY29uc3QgbG9jYWxlID1cbiAgICAgIHRoaXMuZGV0ZWN0TG9jYWxlKHJlcXVlc3QuaGVhZGVyc1tcImFjY2VwdC1sYW5ndWFnZVwiXSwgdGhpcy5jb25maWcuaTE4bi5zdXBwb3J0ZWRMb2NhbGVzKSA/P1xuICAgICAgdGhpcy5jb25maWcuaTE4bi5kZWZhdWx0TG9jYWxlO1xuXG4gICAgY29uc3QgaGVhZGVycyA9IGNvbnZlcnRGYXN0aWZ5SGVhZGVyc1RvU3RhbmRhcmQocmVxdWVzdC5oZWFkZXJzKTtcbiAgICBjb25zdCBzZXNzaW9uID0gKGF3YWl0IHRoaXMuYXV0aFZhbHVlPy5hcGkuZ2V0U2Vzc2lvbih7IGhlYWRlcnMgfSkpID8/IG51bGw7XG5cbiAgICBjb25zdCBkZWZhdWx0Q29udGV4dCA9IHtcbiAgICAgIHRyYW5zcG9ydDogXCJ3c1wiIGFzIGNvbnN0LFxuICAgICAgcmVxdWVzdCxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgIHdzLFxuICAgICAgbmFpdGVTdG9yZTogbmV3IE1hcCgpLFxuICAgICAgbG9jYWxlLFxuICAgICAgdXNlcjogc2Vzc2lvbj8udXNlciA/PyBudWxsLFxuICAgICAgc2Vzc2lvbjogc2Vzc2lvbj8uc2Vzc2lvbiA/PyBudWxsLFxuICAgIH07XG5cbiAgICBpZiAoY29uZmlnLndlYnNvY2tldENvbnRleHRQcm92aWRlcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uKGF3YWl0IFByb21pc2UucmVzb2x2ZShjb25maWcud2Vic29ja2V0Q29udGV4dFByb3ZpZGVyKGRlZmF1bHRDb250ZXh0LCByZXF1ZXN0KSkpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyByZXBseS9jcmVhdGVTU0Xsl5Ag7J2Y7KG07ZWY64qUIGNvbnRleHRQcm92aWRlcuqwgCDsnojsnLzrqbQg7KaJ7IucIOyXkOufrOulvCDrjZjsoLggdHJhbnNwb3J0IG1pc3VzZeulvCDruajrpqwg65Oc65+s64OEXG4gICAgY29uc3QgcmVwbHlTdHViID0gY3JlYXRlV2ViU29ja2V0UmVwbHlTdHViKCk7XG4gICAgY29uc3QgaHR0cExpa2VDb250ZXh0ID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgY29uZmlnLmNvbnRleHRQcm92aWRlcihcbiAgICAgICAge1xuICAgICAgICAgIHRyYW5zcG9ydDogXCJodHRwXCIsXG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICByZXBseTogcmVwbHlTdHViLFxuICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgICBjcmVhdGVTU0U6IGNyZWF0ZVVuYXZhaWxhYmxlU1NFLFxuICAgICAgICAgIG5haXRlU3RvcmU6IGRlZmF1bHRDb250ZXh0Lm5haXRlU3RvcmUsXG4gICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgIHVzZXI6IGRlZmF1bHRDb250ZXh0LnVzZXIsXG4gICAgICAgICAgc2Vzc2lvbjogZGVmYXVsdENvbnRleHQuc2Vzc2lvbixcbiAgICAgICAgfSxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgcmVwbHlTdHViLFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgY29uc3Qge1xuICAgICAgdHJhbnNwb3J0OiBfdHJhbnNwb3J0LFxuICAgICAgcmVwbHk6IF9yZXBseSxcbiAgICAgIGNyZWF0ZVNTRTogX2NyZWF0ZVNTRSxcbiAgICAgIGJ1ZmZlcmVkRmlsZXM6IF9idWZmZXJlZEZpbGVzLFxuICAgICAgdXBsb2FkZWRGaWxlczogX3VwbG9hZGVkRmlsZXMsXG4gICAgICAuLi5yZXN0XG4gICAgfSA9IGh0dHBMaWtlQ29udGV4dDtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5yZXN0LFxuICAgICAgdHJhbnNwb3J0OiBcIndzXCIsXG4gICAgICByZXF1ZXN0LFxuICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgd3MsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2NlcHQtTGFuZ3VhZ2Ug7Zek642U7JeQ7IScIOyngOybkO2VmOuKlCBsb2NhbGXsnYQg7LC+7Iq164uI64ukLlxuICAgKiBAZXhhbXBsZSBcImtvLUtSLGtvO3E9MC45LGVuO3E9MC44XCIg4oaSIFwia29cIlxuICAgKi9cbiAgcHJpdmF0ZSBkZXRlY3RMb2NhbGUoXG4gICAgYWNjZXB0TGFuZ3VhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBzdXBwb3J0ZWQ6IHN0cmluZ1tdLFxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghYWNjZXB0TGFuZ3VhZ2UpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAvLyBBY2NlcHQtTGFuZ3VhZ2U6IGtvLUtSLGtvO3E9MC45LGVuO3E9MC44XG4gICAgY29uc3QgbGFuZ3MgPSBhY2NlcHRMYW5ndWFnZS5zcGxpdChcIixcIikubWFwKChsYW5nKSA9PiB7XG4gICAgICBjb25zdCBbY29kZV0gPSBsYW5nLnNwbGl0KFwiO1wiKTtcbiAgICAgIHJldHVybiBjb2RlLnRyaW0oKS5zcGxpdChcIi1cIilbMF07IC8vIGtvLUtSIOKGkiBrb1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxhbmdzLmZpbmQoKGxhbmcpID0+IHN1cHBvcnRlZC5pbmNsdWRlcyhsYW5nKSk7XG4gIH1cblxuICBhc3luYyBzdGFydFdhdGNoZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gd2F0Y2hlciDrqqjrk4jsnYAgZmlsZS1wYXR0ZXJucyDihpIgU29uYW11IOyInO2ZmOydhCDtlLztlZjquLAg7JyE7ZW0IGR5bmFtaWMgaW1wb3J0IO2VqeuLiOuLpC5cbiAgICBjb25zdCB7IHNldHVwV2F0Y2hlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3luY2VyL3dhdGNoZXJcIik7XG4gICAgdGhpcy53YXRjaGVyID0gYXdhaXQgc2V0dXBXYXRjaGVyKChmaWxlRXZlbnRzKSA9PiB0aGlzLnJ1bkhtclN5bmNDeWNsZShmaWxlRXZlbnRzKSk7XG4gIH1cblxuICAvKipcbiAgICogV2F0Y2hlcuqwgCAxMDBtcyBiYXRjaOuhnCDrqqjsnYAgZmlsZUV2ZW50cyDtlZjrgpjsl5Ag64yA7ZW0IO2VnCDrsojsnZggSE1SL3N5bmMg7IKs7J207YG07J2EIOuPleuLiOuLpC5cbiAgICogYmF0Y2gg7YGQ7J6JIOuNleyXkCDtlZwg7Iuc7KCQ7JeQIO2VmOuCmOunjCDsi6TtlonrkKjsnbQg67O07J6l65Cp64uI64ukIChldmVudC1iYXRjaGVy6rCAIOyngeugrO2ZlCkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJ1bkhtclN5bmNDeWNsZShmaWxlRXZlbnRzOiBNYXA8QWJzb2x1dGVQYXRoLCBcImNoYW5nZVwiIHwgXCJhZGRcIj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuXG4gICAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGV2ZW50XSBvZiBmaWxlRXZlbnRzKSB7XG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHRoaXMuYXBwUm9vdFBhdGgsIGZpbGVQYXRoKTtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoYERldGVjdGVkKCR7ZXZlbnR9KTogJHtjaGFsay5ibHVlKHJlbGF0aXZlUGF0aCl9YCkpO1xuICAgIH1cblxuICAgIC8vIOuzuOyytDog67OA6rK9IO2doeyImCArIOyytO2BrOyErCDqsLHsi6AuXG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuaG1yQW5kU3luYyhmaWxlRXZlbnRzKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5yZW5ld0NoZWNrc3VtcygpO1xuXG4gICAgY29uc3QgdG90YWxUaW1lID0gRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdDtcbiAgICBjb25zdCBtc2cgPSBgSE1SIERvbmUhICR7Y2hhbGsuYm9sZC53aGl0ZShgJHt0b3RhbFRpbWV9bXNgKX1gO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsYWNrLmJnR3JlZW4oY2VudGVyVGV4dChtc2cpKSk7XG4gIH1cblxuICAvKlxuICAgICBBIGZ1bmN0aW9uIHRoYXQgYXV0b21hdGljYWxseSBoYW5kbGVzIGluaXQgYW5kIGRlc3Ryb3kgd2hlbiB1c2luZyBTb25hbXUgdmlhIHNjcmlwdHMuXG4gICovXG4gIGFzeW5jIHJ1blNjcmlwdChmbjogKCkgPT4gUHJvbWlzZTx2b2lkPikge1xuICAgIGF3YWl0IHRoaXMuaW5pdCh0cnVlLCBmYWxzZSwgdW5kZWZpbmVkLCBmYWxzZSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZuKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRoaXMuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJQbHVnaW5zKHNlcnZlcjogRmFzdGlmeUluc3RhbmNlLCBwbHVnaW5zOiBTb25hbXVTZXJ2ZXJPcHRpb25zW1wicGx1Z2luc1wiXSkge1xuICAgIGlmICghcGx1Z2lucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHJvdXRlKCkg7Iuc7KCQ7JeQIOyLpO2WieuQmOuKlCBvblJvdXRlIO2bheydtCDshKTsuZjrkJjrj4TroZ0g7ZSM65+s6re47J24IOuTseuhnSDsmYTro4zrpbwg6riw64uk66a964uI64ukLlxuICAgIC8vIGNvbXByZXNzIO2UjOufrOq3uOyduOydgCDri6Trpbgg7ZSM65+s6re47J2467O064ukIOuovOyggCDrk7HroZ3rkJjslrTslbwg7ZWp64uI64ukLlxuICAgIGlmIChwbHVnaW5zLmNvbXByZXNzKSB7XG4gICAgICBjb25zdCBjb21wcmVzc1BsdWdpbiA9IChhd2FpdCBpbXBvcnQoXCJAZmFzdGlmeS9jb21wcmVzc1wiKSkuZGVmYXVsdDtcbiAgICAgIGNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgICAgICB0aHJlc2hvbGQ6IDEwMjQsXG4gICAgICAgIGVuY29kaW5nczogLyogU0FGRVRZOiBBUEkg642w7L2U66CI7J207YSw7JmAIFpvZCDqsoDspp3quLAg65Ox66GdIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIFtcbiAgICAgICAgICBcImJyXCIsXG4gICAgICAgICAgXCJnemlwXCIsXG4gICAgICAgICAgXCJkZWZsYXRlXCIsXG4gICAgICAgIF0gYXMgKFwiYnJcIiB8IFwiZ3ppcFwiIHwgXCJkZWZsYXRlXCIpW10sXG4gICAgICB9O1xuXG4gICAgICBpZiAocGx1Z2lucy5jb21wcmVzcyA9PT0gdHJ1ZSkge1xuICAgICAgICBhd2FpdCBzZXJ2ZXIucmVnaXN0ZXIoY29tcHJlc3NQbHVnaW4sIGRlZmF1bHRPcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHNlcnZlci5yZWdpc3Rlcihjb21wcmVzc1BsdWdpbiwge1xuICAgICAgICAgIC4uLmRlZmF1bHRPcHRpb25zLFxuICAgICAgICAgIC4uLnBsdWdpbnMuY29tcHJlc3MsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBsdWdpbnNNb2R1bGVzID0ge1xuICAgICAgY29yczogXCJAZmFzdGlmeS9jb3JzXCIsXG4gICAgICBmb3JtYm9keTogXCJAZmFzdGlmeS9mb3JtYm9keVwiLFxuICAgICAgbXVsdGlwYXJ0OiBcIkBmYXN0aWZ5L211bHRpcGFydFwiLFxuICAgICAgcXM6IFwiZmFzdGlmeS1xc1wiLFxuICAgICAgc3NlOiBcImZhc3RpZnktc3NlLXYyXCIsXG4gICAgICBzdGF0aWM6IFwiQGZhc3RpZnkvc3RhdGljXCIsXG4gICAgfSBhcyBjb25zdDtcblxuICAgIGNvbnN0IHJlZ2lzdGVyUGx1Z2luID0gYXN5bmMgPEsgZXh0ZW5kcyBrZXlvZiBOb25OdWxsYWJsZTx0eXBlb2YgcGx1Z2lucz4+KFxuICAgICAga2V5OiBLLFxuICAgICAgcGx1Z2luTmFtZTogc3RyaW5nLFxuICAgICkgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9uID0gcGx1Z2luc1trZXldO1xuICAgICAgaWYgKCFvcHRpb24pIHJldHVybjtcblxuICAgICAgaWYgKG9wdGlvbiA9PT0gdHJ1ZSkge1xuICAgICAgICBhd2FpdCBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChwbHVnaW5OYW1lKSkuZGVmYXVsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChwbHVnaW5OYW1lKSkuZGVmYXVsdCwgb3B0aW9uKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBba2V5LCBwbHVnaW5OYW1lXSBvZiBPYmplY3QuZW50cmllcyhwbHVnaW5zTW9kdWxlcykpIHtcbiAgICAgIGF3YWl0IHJlZ2lzdGVyUGx1Z2luKFxuICAgICAgICAvKiBTQUZFVFk6IEFQSSDrjbDsvZTroIjsnbTthLDsmYAgWm9kIOqygOymneq4sCDrk7HroZ0g6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8ga2V5IGFzIGtleW9mIHR5cGVvZiBwbHVnaW5zLFxuICAgICAgICBwbHVnaW5OYW1lLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAocGx1Z2lucy53cykge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVXZWJTb2NrZXRQbHVnaW4oc2VydmVyKTtcbiAgICB9XG5cbiAgICBpZiAocGx1Z2lucy5jdXN0b20pIHtcbiAgICAgIHBsdWdpbnMuY3VzdG9tKHNlcnZlcik7XG4gICAgfVxuICB9XG5cbiAgLy8gQGZhc3RpZnkvd2Vic29ja2V07J2AIHBsdWdpbnMud3PqsIAg7ISk7KCV65CcIOqyveyasOyXkOunjCDrk7HroZ3tlZjqs6AsIOqwmeydgCBzZXJ2ZXLsl5Ag7KSR67O1IOuTseuhneuQmOyngCDslYrrj4TroZ0gV2Vha1NldOycvOuhnCDquLDroZ3tlahcbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVXZWJTb2NrZXRQbHVnaW4oXG4gICAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2U8U2VydmVyLCBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlPixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMud2Vic29ja2V0UGx1Z2luU2VydmVycy5oYXMoc2VydmVyKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBsdWdpbk9wdGlvbiA9IHRoaXMuY29uZmlnLnNlcnZlci5wbHVnaW5zPy53cztcbiAgICBpZiAoIXBsdWdpbk9wdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHdlYnNvY2tldFBsdWdpbiA9IChhd2FpdCBpbXBvcnQoXCJAZmFzdGlmeS93ZWJzb2NrZXRcIikpLmRlZmF1bHQ7XG4gICAgY29uc3QgcmVzb2x2ZWRQbHVnaW5PcHRpb25zID0gcmVzb2x2ZVdlYlNvY2tldFBsdWdpbk9wdGlvbnMoe1xuICAgICAgcmF3UGx1Z2luT3B0aW9uOiBwbHVnaW5PcHRpb24sXG4gICAgfSk7XG4gICAgaWYgKHJlc29sdmVkUGx1Z2luT3B0aW9ucykge1xuICAgICAgYXdhaXQgc2VydmVyLnJlZ2lzdGVyKHdlYnNvY2tldFBsdWdpbiwgcmVzb2x2ZWRQbHVnaW5PcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgc2VydmVyLnJlZ2lzdGVyKHdlYnNvY2tldFBsdWdpbik7XG4gICAgfVxuXG4gICAgdGhpcy53ZWJzb2NrZXRQbHVnaW5TZXJ2ZXJzLmFkZChzZXJ2ZXIpO1xuICAgIHRoaXMud2Fybk9uUG90ZW50aWFsV2ViU29ja2V0VGltZW91dENvbmZsaWN0cyhzZXJ2ZXIpO1xuICB9XG5cbiAgLy8gaGVhcnRiZWF0IGludGVydmFs7J20IEZhc3RpZnkga2VlcEFsaXZlVGltZW91dCDsnbTsg4HsnbTrqbQg7J247ZSE65286rCAIOuovOyggCBpZGxlIOyXsOqysOydhCDrgYrsnYQg7IiYIOyeiOyWtCDqsr3qs6Drp4wg64Ko6riw6rOgIOuEmOyWtOqwkFxuICBwcml2YXRlIHdhcm5PblBvdGVudGlhbFdlYlNvY2tldFRpbWVvdXRDb25mbGljdHMoXG4gICAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2U8U2VydmVyLCBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlPixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgaGVhcnRiZWF0cyA9IHRoaXMuc3luY2VyLmFwaXNcbiAgICAgIC5tYXAoKGFwaSkgPT4gYXBpLndlYnNvY2tldE9wdGlvbnM/LmhlYXJ0YmVhdCA/PyAzMDAwMClcbiAgICAgIC5maWx0ZXIoKGhlYXJ0YmVhdCkgPT4gaGVhcnRiZWF0ID4gMCk7XG5cbiAgICBpZiAoaGVhcnRiZWF0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBrZWVwQWxpdmVUaW1lb3V0ID0gdGhpcy5jb25maWcuc2VydmVyLmZhc3RpZnk/LmtlZXBBbGl2ZVRpbWVvdXQ7XG4gICAgaWYgKCFrZWVwQWxpdmVUaW1lb3V0IHx8IGtlZXBBbGl2ZVRpbWVvdXQgPD0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxhcmdlc3RIZWFydGJlYXQgPSBNYXRoLm1heCguLi5oZWFydGJlYXRzKTtcbiAgICBpZiAobGFyZ2VzdEhlYXJ0YmVhdCA+PSBrZWVwQWxpdmVUaW1lb3V0KSB7XG4gICAgICBzZXJ2ZXIubG9nLndhcm4oXG4gICAgICAgIHtcbiAgICAgICAgICBrZWVwQWxpdmVUaW1lb3V0LFxuICAgICAgICAgIGxhcmdlc3RIZWFydGJlYXQsXG4gICAgICAgIH0sXG4gICAgICAgIFwiV2ViU29ja2V0IGhlYXJ0YmVhdCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8ga2VlcEFsaXZlVGltZW91dDsgYWxpZ24gaW5mcmFzdHJ1Y3R1cmUgaWRsZSB0aW1lb3V0cyB0byBhdm9pZCB1bmV4cGVjdGVkIGRpc2Nvbm5lY3RzLlwiLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYmV0dGVyLWF1dGgg65287Jqw7Yq466W8IOuTseuhne2VqeuLiOuLpC5cbiAgICogL2FwaS9hdXRoLyog6rK966Gc66GcIOyduOymnSBBUEnqsIAg7J6Q64+ZIOuTseuhneuQqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJCZXR0ZXJBdXRoKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlLFxuICAgIG9wdGlvbnM6IE5vbk51bGxhYmxlPFNvbmFtdVNlcnZlck9wdGlvbnNbXCJhdXRoXCJdPixcbiAgKSB7XG4gICAgaWYgKCFvcHRpb25zKSByZXR1cm47XG5cbiAgICBjb25zdCBiYXNlUGF0aCA9IG9wdGlvbnMuYmFzZVBhdGggPz8gXCIvYXBpL2F1dGhcIjtcblxuICAgIC8vIGJldHRlci1hdXRoIOudvOyasO2KuCDrk7HroZ1cbiAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgbWV0aG9kOiBbXCJHRVRcIiwgXCJQT1NUXCJdLFxuICAgICAgdXJsOiBgJHtiYXNlUGF0aH0vKmAsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF1dGguaGFuZGxlcihcbiAgICAgICAgICBjcmVhdGVCZXR0ZXJBdXRoUmVxdWVzdChyZXF1ZXN0LCBvcHRpb25zLmFkdmFuY2VkPy5pcEFkZHJlc3M/LmlwQWRkcmVzc0hlYWRlcnMpLFxuICAgICAgICApO1xuXG4gICAgICAgIHJlcGx5LnN0YXR1cyhyZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICByZXNwb25zZS5oZWFkZXJzLmZvckVhY2goKHZhbHVlOiBzdHJpbmcsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgcmVwbHkuaGVhZGVyKGtleSwgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlcGx5LnNlbmQocmVzcG9uc2UuYm9keSA/IGF3YWl0IHJlc3BvbnNlLnRleHQoKSA6IG51bGwpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJpbnRTdGFydHVwU3VtbWFyeSgpIHtcbiAgICBjb25zdCBhY3RpdmVQcmVzZXQgPSBnZXRTb25hbXVFbnZpcm9ubWVudCgpO1xuXG4gICAgcHJpbnREaW1TdW1tYXJ5KGBDb25maWcgbG9hZGVkJHtmb3JtYXRUaW1lKHRoaXMuY29uZmlnRWxhcHNlZCl9YCk7XG5cbiAgICAvLyBEQiBwcmVzZXQg66qp66GdXG4gICAgcHJpbnRHcmVlblN1bW1hcnkoXCJEQlwiKTtcbiAgICBjb25zdCB7IGlzTG9jYWwgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIik7XG4gICAgY29uc3QgcHJlc2V0TmFtZXMgPVxuICAgICAgLyogU0FGRVRZOiBBUEkg642w7L2U66CI7J207YSw7JmAIFpvZCDqsoDspp3quLAg65Ox66GdIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIE9iamVjdC5rZXlzKFxuICAgICAgICB0aGlzLmRiQ29uZmlnLFxuICAgICAgKSBhcyAoa2V5b2YgU29uYW11REJDb25maWcpW107XG4gICAgY29uc3QgbWF4TGVuID0gTWF0aC5tYXgoLi4ucHJlc2V0TmFtZXMubWFwKChuKSA9PiBuLmxlbmd0aCkpO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBwcmVzZXROYW1lcykge1xuICAgICAgY29uc3QgY29ubiA9XG4gICAgICAgIC8qIFNBRkVUWTogQVBJIOuNsOy9lOugiOydtO2EsOyZgCBab2Qg6rKA7Kad6riwIOuTseuhnSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyB0aGlzXG4gICAgICAgICAgLmRiQ29uZmlnW25hbWVdLmNvbm5lY3Rpb24gYXNcbiAgICAgICAgICB8IHsgaG9zdD86IHN0cmluZzsgcG9ydD86IG51bWJlcjsgZGF0YWJhc2U/OiBzdHJpbmcgfVxuICAgICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaG9zdCA9IGNvbm4/Lmhvc3QgPz8gXCJsb2NhbGhvc3RcIjtcbiAgICAgIGNvbnN0IGFkZHIgPSBgQCAke2hvc3R9OiR7Y29ubj8ucG9ydCA/PyA1NDMyfS8ke2Nvbm4/LmRhdGFiYXNlID8/IFwiKHVua25vd24pXCJ9YDtcbiAgICAgIGNvbnN0IHBhZGRlZCA9IG5hbWUucGFkRW5kKG1heExlbik7XG4gICAgICBjb25zdCByZW1vdGVUYWcgPSBpc0xvY2FsKCkgJiYgIWlzTG9jYWxIb3N0KGhvc3QpID8gY2hhbGsueWVsbG93KGAgXFx1MjZhMCByZW1vdGVgKSA6IFwiXCI7XG5cbiAgICAgIGlmIChuYW1lID09PSBhY3RpdmVQcmVzZXQpIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYCAgXFx1MjViOCAke3BhZGRlZH0gJHthZGRyfWApICsgcmVtb3RlVGFnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgICAgICR7cGFkZGVkfSAke2FkZHJ9YCkgKyByZW1vdGVUYWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5zZXJ2ZXIuYXV0aCkge1xuICAgICAgY29uc3QgYmFzZVBhdGggPSB0aGlzLmNvbmZpZy5zZXJ2ZXIuYXV0aC5iYXNlUGF0aCA/PyBcIi9hcGkvYXV0aFwiO1xuICAgICAgcHJpbnREaW1TdW1tYXJ5KGBBdXRoOiBiZXR0ZXItYXV0aCBhdCAke2Jhc2VQYXRofS8qYCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbmZpZy5hcGkudGltZXpvbmUpIHtcbiAgICAgIHByaW50RGltU3VtbWFyeShgVGltZXpvbmU6ICR7dGhpcy5jb25maWcuYXBpLnRpbWV6b25lfWApO1xuICAgIH1cbiAgICBwcmludEdyZWVuU3VtbWFyeShgU29uYW11IHJlYWR5JHtmb3JtYXRUaW1lKHRoaXMuaW5pdEVsYXBzZWQpfWApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplQ2FjaGUoY29uZmlnOiBDYWNoZUNvbmZpZyB8IHVuZGVmaW5lZCwgZm9yVGVzdGluZzogYm9vbGVhbikge1xuICAgIGNvbnN0IHsgc2V0Q2FjaGVNYW5hZ2VyUmVmIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9jYWNoZS9kZWNvcmF0b3JcIik7XG5cbiAgICAvLyDthYzsiqTtirgg7ZmY6rK97JeQ7IScIOuplOuqqOumrCDrk5zrnbzsnbTrsoQg7J6Q64+ZIOyCrOyaqVxuICAgIGlmIChmb3JUZXN0aW5nKSB7XG4gICAgICBjb25zdCB7IGNyZWF0ZVRlc3RDYWNoZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2NhY2hlL2NhY2hlLW1hbmFnZXJcIik7XG4gICAgICB0aGlzLmNhY2hlVmFsdWUgPSBjcmVhdGVUZXN0Q2FjaGVNYW5hZ2VyKCk7XG4gICAgICBzZXRDYWNoZU1hbmFnZXJSZWYodGhpcy5jYWNoZVZhbHVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDshKTsoJXsnbQg7JeG7Jy866m0IOy6kOyLnCDruYTtmZzshLHtmZRcbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgc2V0Q2FjaGVNYW5hZ2VyUmVmKG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOyEpOygleyXkCDrlLDrnbwgQ2FjaGVNYW5hZ2VyIOyDneyEsVxuICAgIGNvbnN0IHsgY3JlYXRlQ2FjaGVNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9jYWNoZS9jYWNoZS1tYW5hZ2VyXCIpO1xuICAgIHRoaXMuY2FjaGVWYWx1ZSA9IGNyZWF0ZUNhY2hlTWFuYWdlcihjb25maWcpO1xuICAgIHNldENhY2hlTWFuYWdlclJlZih0aGlzLmNhY2hlVmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplV29ya2Zsb3dzKG9wdGlvbnM6IFNvbmFtdVRhc2tPcHRpb25zIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgeyBXb3JrZmxvd01hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3Rhc2tzL3dvcmtmbG93LW1hbmFnZXJcIik7XG4gICAgLy8gTk9URTogQHNvbmFtdS1raXQvdGFza3Mg7JWI7JeQ7ISgIGtuZXggY29uZmln66W8IOyImOygle2VmOq4sCDrlYzrrLjsl5AgY29ubmVjdGlvbuydtCDslYTri4wgY29uZmlnIOynuOuhnCDrs7Trg4Xri4jri6QuXG4gICAgdGhpcy53b3JrZmxvd3NWYWx1ZSA9IG5ldyBXb3JrZmxvd01hbmFnZXIoREIuZ2V0REJDb25maWcoXCJ3XCIpKTtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBlbmFibGVXb3JrZXIgPSBvcHRpb25zLmVuYWJsZVdvcmtlciA/PyBpc0RhZW1vblNlcnZlcigpO1xuICAgIGNvbnN0IGRlZmF1bHRXb3JrZXJPcHRpb25zID0ge1xuICAgICAgY29uY3VycmVuY3k6IG9zLmNwdXMoKS5sZW5ndGggLSAxLFxuICAgICAgdXNlUHViU3ViOiB0cnVlLFxuICAgICAgbGlzdGVuRGVsYXk6IDUwMCxcbiAgICB9O1xuXG4gICAgaWYgKGVuYWJsZVdvcmtlcikge1xuICAgICAgdGhpcy53b3JrZmxvd3Muc2V0dXBXb3JrZXIoe1xuICAgICAgICAuLi5kZWZhdWx0V29ya2VyT3B0aW9ucyxcbiAgICAgICAgLi4ub3B0aW9ucy53b3JrZXJPcHRpb25zLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBib290KHNlcnZlcjogRmFzdGlmeUluc3RhbmNlLCBvcHRpb25zOiBTb25hbXVTZXJ2ZXJPcHRpb25zKSB7XG4gICAgY29uc3QgcG9ydCA9IG9wdGlvbnMubGlzdGVuPy5wb3J0ID8/IDMwMDA7XG4gICAgY29uc3QgaG9zdCA9IG9wdGlvbnMubGlzdGVuPy5ob3N0ID8/IFwibG9jYWxob3N0XCI7XG5cbiAgICBzZXJ2ZXIuYWRkSG9vayhcIm9uQ2xvc2VcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgb3B0aW9ucy5saWZlY3ljbGU/Lm9uU2h1dGRvd24/LihzZXJ2ZXIpO1xuICAgICAgYXdhaXQgdGhpcy53b3JrZmxvd3MuZGVzdHJveSgpO1xuICAgICAgYXdhaXQgdGhpcy5kZXN0cm95KCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBzaHV0ZG93biA9IGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHNlcnZlci5jbG9zZSgpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGR1cmluZyBzaHV0ZG93bjpcIiwgZXJyKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBwcm9jZXNzLm9uKFwiU0lHSU5UXCIsIHNodXRkb3duKTtcbiAgICBwcm9jZXNzLm9uKFwiU0lHVEVSTVwiLCBzaHV0ZG93bik7XG5cbiAgICBpZiAob3B0aW9ucy5saWZlY3ljbGU/Lm9uRXJyb3IpIHtcbiAgICAgIHNlcnZlci5zZXRFcnJvckhhbmRsZXIob3B0aW9ucy5saWZlY3ljbGU/Lm9uRXJyb3IpO1xuICAgIH1cblxuICAgIHNlcnZlclxuICAgICAgLmxpc3Rlbih7IHBvcnQsIGhvc3QgfSlcbiAgICAgIC50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy53b3JrZmxvd3Muc3RhcnRXb3JrZXIoKTtcbiAgICAgICAgYXdhaXQgb3B0aW9ucy5saWZlY3ljbGU/Lm9uU3RhcnQ/LihzZXJ2ZXIpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChhc3luYyAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFwiRmFpbGVkIHRvIHN0YXJ0IHNlcnZlcjpcIiwgZXJyKSk7XG4gICAgICAgIGF3YWl0IHNodXRkb3duKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBoYXNFeHRlcm5hbExvZ1RhcGVDb25maWd1cmF0aW9uIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9sb2dnZXIvY29uZmlndXJlXCIpO1xuICAgIGNvbnN0IHsgQmFzZU1vZGVsIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9kYXRhYmFzZS9iYXNlLW1vZGVsXCIpO1xuICAgIC8vIOuovOyggCDsspjrpqztlbTslbztlaguXG4gICAgYXdhaXQgQmFzZU1vZGVsLmRlc3Ryb3koKTtcbiAgICAvLyBXZWJTb2NrZXQgc2h1dGRvd24gZmlyc3QgdG8gZmx1c2ggdGVsZW1ldHJ5XG4gICAgaWYgKHRoaXMud2Vic29ja2V0UnVudGltZVZhbHVlKSB7XG4gICAgICBhd2FpdCB0aGlzLndlYnNvY2tldFJ1bnRpbWVWYWx1ZS5zaHV0ZG93bigpO1xuICAgIH1cbiAgICB0aGlzLndlYnNvY2tldFJ1bnRpbWVWYWx1ZSA9IG51bGw7XG4gICAgLy8gVGhlbiBzaHV0IGRvd24gcmVtYWluaW5nIHJlc291cmNlcyBpbiBwYXJhbGxlbFxuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICB0aGlzLndvcmtmbG93c1ZhbHVlPy5kZXN0cm95KCkgPz8gUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgICB0aGlzLmNhY2hlVmFsdWU/LmRpc2Nvbm5lY3QoKSA/PyBQcm9taXNlLnJlc29sdmUoKSxcbiAgICAgIHRoaXMuZGV2Vml0ZXN0TWFuYWdlclZhbHVlPy5zaHV0ZG93bigpID8/IFByb21pc2UucmVzb2x2ZSgpLFxuICAgICAgdGhpcy53YXRjaGVyPy5jbG9zZSgpID8/IFByb21pc2UucmVzb2x2ZSgpLFxuICAgIF0pO1xuICAgIC8vIExvZ1RhcGUgZGlzcG9zZSBhZnRlciBXUyBzaHV0ZG93biBzbyB0ZWxlbWV0cnkgcmVjb3JkcyBhcmUgZmx1c2hlZCBmaXJzdFxuICAgIGlmICghaGFzRXh0ZXJuYWxMb2dUYXBlQ29uZmlndXJhdGlvbigpKSBhd2FpdCBsb2d0YXBlRGlzcG9zZSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFdlYlNvY2tldFRlbGVtZXRyeUNvbnRleHQoXG4gIHdzOiBBbnlXZWJTb2NrZXRDb25uZWN0aW9uLFxuKTogV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvbkNvbnRleHQge1xuICBpZiAoIWlzVGVsZW1ldHJ5Q29udGV4dFByb3ZpZGVyKHdzKSkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHJldHVybiB3cy5nZXRUZWxlbWV0cnlDb250ZXh0KCk7XG59XG5cbmZ1bmN0aW9uIGlzVGVsZW1ldHJ5Q29udGV4dFByb3ZpZGVyKFxuICB3czogQW55V2ViU29ja2V0Q29ubmVjdGlvbixcbik6IHdzIGlzIEFueVdlYlNvY2tldENvbm5lY3Rpb24gJiBUZWxlbWV0cnlDb250ZXh0UHJvdmlkZXIge1xuICByZXR1cm4gXCJnZXRUZWxlbWV0cnlDb250ZXh0XCIgaW4gd3MgJiYgaXNGdW5jdGlvblZhbHVlKHdzLmdldFRlbGVtZXRyeUNvbnRleHQpO1xufVxuXG5leHBvcnQgY29uc3QgU29uYW11ID0gbmV3IFNvbmFtdUNsYXNzKCk7XG5cbi8qKlxuICogc3RyZWFtIOuqqOuTnOyXkOyEnCDtgqQg7IOd7ISxIO2VqOyImOqwgCDsp4DsoJXrkJjsp4Ag7JWK7JWY7J2EIOuVjCDsgqzsmqntlZjripQg6riw67O4IO2VqOyImOyeheuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdEtleUdlbmVyYXRvcihmaWxlOiB7IGZpbGVuYW1lOiBzdHJpbmc7IG1pbWV0eXBlOiBzdHJpbmcgfSk6IHN0cmluZyB7XG4gIGNvbnN0IGV4dCA9IG1pbWUuZXh0ZW5zaW9uKGZpbGUubWltZXR5cGUpIHx8IFwiYmluXCI7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gIGNvbnN0IHJhbmRvbSA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDgpO1xuICByZXR1cm4gYHVwbG9hZHMvJHt0aW1lc3RhbXB9LSR7cmFuZG9tfS4ke2V4dH1gO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRUaW1lKG1zOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBmb3JtYXR0ZWQgPSBtcyA+PSAxMDAwID8gYCR7KG1zIC8gMTAwMCkudG9GaXhlZCgyKX1zYCA6IGAke01hdGgucm91bmQobXMpfW1zYDtcbiAgcmV0dXJuIGAgKCR7Zm9ybWF0dGVkfSlgO1xufVxuXG5jb25zdCBMT0NBTF9IT1NUUyA9IG5ldyBTZXQoW1wibG9jYWxob3N0XCIsIFwiMTI3LjAuMC4xXCIsIFwiMC4wLjAuMFwiLCBcIjo6MVwiXSk7XG5mdW5jdGlvbiBpc0xvY2FsSG9zdChob3N0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIExPQ0FMX0hPU1RTLmhhcyhob3N0KSB8fCBob3N0LmVuZHNXaXRoKFwiLmxvY2FsXCIpO1xufVxuXG4vLyBgLmV2ZXJ5KClg6rCAIOyyqyBndWFyZCDsnbTtm4Qg7Iic7ZqM66W8IOupiOy2lOuKlCDrrLjsoJzqsIAg7J6I7Ja0IGBmb3IuLi5vZmDroZwg66qo65OgIGd1YXJk66W8IOyInOyEnOuMgOuhnCDsi6TtlontlZjrj4TroZ0g6rOg7KCV7ZWoXG5mdW5jdGlvbiBydW5HdWFyZHMoe1xuICBndWFyZHMsXG4gIGNvbmZpZyxcbiAgcmVxdWVzdCxcbiAgYXBpLFxufToge1xuICBndWFyZHM6IEV4dGVuZGVkQXBpW1wib3B0aW9uc1wiXVtcImd1YXJkc1wiXSB8IHVuZGVmaW5lZDtcbiAgY29uZmlnOiBQaWNrPFNvbmFtdUZhc3RpZnlDb25maWcsIFwiZ3VhcmRIYW5kbGVyXCI+O1xuICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdDtcbiAgYXBpOiBFeHRlbmRlZEFwaTtcbn0pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBndWFyZCBvZiBndWFyZHMgPz8gW10pIHtcbiAgICBjb25maWcuZ3VhcmRIYW5kbGVyKGd1YXJkLCByZXF1ZXN0LCBhcGkpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkdBLFNBQVMsY0FBcUIsT0FBMkI7Q0FDdkQsSUFB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
1416
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LmpzIiwibmFtZXMiOlsibWltZUxvb2t1cCIsImxvZ3RhcGVEaXNwb3NlIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9zb25hbXUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiYXN5bmNfaG9va3NcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IHR5cGUgSW5jb21pbmdNZXNzYWdlLCB0eXBlIFNlcnZlciwgdHlwZSBTZXJ2ZXJSZXNwb25zZSB9IGZyb20gXCJodHRwXCI7XG5pbXBvcnQgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgXCJAZmFzdGlmeS93ZWJzb2NrZXRcIjtcbmltcG9ydCB7IGRpc3Bvc2UgYXMgbG9ndGFwZURpc3Bvc2UgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IHsgdHlwZSBBdXRoLCB0eXBlIEJldHRlckF1dGhPcHRpb25zIH0gZnJvbSBcImJldHRlci1hdXRoXCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyB0eXBlIEZTV2F0Y2hlciB9IGZyb20gXCJjaG9raWRhclwiO1xuaW1wb3J0IHsgdHlwZSBGYXN0aWZ5SW5zdGFuY2UsIHR5cGUgRmFzdGlmeVJlcGx5LCB0eXBlIEZhc3RpZnlSZXF1ZXN0IH0gZnJvbSBcImZhc3RpZnlcIjtcbmltcG9ydCBtaW1lLCB7IGxvb2t1cCBhcyBtaW1lTG9va3VwIH0gZnJvbSBcIm1pbWUtdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgV2ViU29ja2V0IH0gZnJvbSBcIndzXCI7XG5pbXBvcnQgeyB0eXBlIFpvZE9iamVjdCB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgQkFTRV9GSUVMRF9NQVBQSU5HUyB9IGZyb20gXCIuLi9hdXRoL2JldHRlci1hdXRoLWVudGl0aWVzXCI7XG5pbXBvcnQgeyBjcmVhdGVCZXR0ZXJBdXRoUmVxdWVzdCB9IGZyb20gXCIuLi9hdXRoL2JldHRlci1hdXRoLXJlcXVlc3RcIjtcbmltcG9ydCB7IGFwcGx5Q2FjaGVIZWFkZXJzLCBDYWNoZVByZXNldHMgfSBmcm9tIFwiLi4vY2FjaGUtY29udHJvbC9jYWNoZS1jb250cm9sXCI7XG5pbXBvcnQgeyB0eXBlIENhY2hlQ29udHJvbENvbmZpZywgdHlwZSBDYWNoZUNvbnRyb2xSZXF1ZXN0IH0gZnJvbSBcIi4uL2NhY2hlLWNvbnRyb2wvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgQ2FjaGVDb25maWcsIHR5cGUgQ2FjaGVNYW5hZ2VyIH0gZnJvbSBcIi4uL2NhY2hlL3R5cGVzXCI7XG5pbXBvcnQgeyB0b0Zhc3RpZnlDb21wcmVzc09wdGlvbiB9IGZyb20gXCIuLi9jb21wcmVzcy9jb21wcmVzc1wiO1xuaW1wb3J0IHsgdHlwZSBDb21wcmVzc09wdGlvbnMgfSBmcm9tIFwiLi4vY29tcHJlc3MvdHlwZXNcIjtcbmltcG9ydCB7IERCIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyB0eXBlIFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBTRCwgc2V0U0RDb25maWcgfSBmcm9tIFwiLi4vZGljdC9zZFwiO1xuaW1wb3J0IHsgdHlwZSBMb2NhbGl6ZWRTdHJpbmcgfSBmcm9tIFwiLi4vZGljdC90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0U29uYW11RW52aXJvbm1lbnQsIHJlYWRBbGxFbnZpcm9ubWVudFNuYXBzaG90cyB9IGZyb20gXCIuLi9lbnZcIjtcbmltcG9ydCB7IE5vdEZvdW5kRXhjZXB0aW9uIH0gZnJvbSBcIi4uL2V4Y2VwdGlvbnMvc28tZXhjZXB0aW9uc1wiO1xuaW1wb3J0IHsgcnVudGltZVR5cGVPZiB9IGZyb20gXCIuLi9ydW50aW1lLXR5cGVcIjtcbmltcG9ydCB7IEJ1ZmZlcmVkRmlsZSB9IGZyb20gXCIuLi9zdG9yYWdlL2J1ZmZlcmVkLWZpbGVcIjtcbmltcG9ydCB7IHR5cGUgU3RvcmFnZU1hbmFnZXIgfSBmcm9tIFwiLi4vc3RvcmFnZS9zdG9yYWdlLW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgS2V5R2VuZXJhdG9yIH0gZnJvbSBcIi4uL3N0b3JhZ2UvdHlwZXNcIjtcbmltcG9ydCB7IFVwbG9hZGVkRmlsZSB9IGZyb20gXCIuLi9zdG9yYWdlL3VwbG9hZGVkLWZpbGVcIjtcbmltcG9ydCB7IGNyZWF0ZU1vY2tTU0VGYWN0b3J5IH0gZnJvbSBcIi4uL3N0cmVhbS9zc2VcIjtcbmltcG9ydCB7XG4gIHR5cGUgQW55V2ViU29ja2V0Q29ubmVjdGlvbixcbiAgV2ViU29ja2V0UnVudGltZSxcbiAgdHlwZSBXZWJTb2NrZXRDb25uZWN0aW9uLFxufSBmcm9tIFwiLi4vc3RyZWFtL3dzXCI7XG5pbXBvcnQge1xuICB0eXBlIFRlbGVtZXRyeUNvbnRleHRQcm92aWRlcixcbiAgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uQ29udGV4dCxcbn0gZnJvbSBcIi4uL3N0cmVhbS93cy10ZWxlbWV0cnlcIjtcbmltcG9ydCB7IHR5cGUgTG9hZGVkTW9kZWxzIH0gZnJvbSBcIi4uL3N5bmNlci9tb2R1bGUtbG9hZGVyXCI7XG5pbXBvcnQgeyB0eXBlIFN5bmNlciB9IGZyb20gXCIuLi9zeW5jZXIvc3luY2VyXCI7XG5pbXBvcnQgeyB0eXBlIFdvcmtmbG93TWFuYWdlciB9IGZyb20gXCIuLi90YXNrcy93b3JrZmxvdy1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIERldlZpdGVzdE1hbmFnZXIgfSBmcm9tIFwiLi4vdGVzdGluZy9kZXYtdml0ZXN0LW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgU29uYW11RmFzdGlmeUNvbmZpZyB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgY2VudGVyVGV4dCB9IGZyb20gXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIjtcbmltcG9ydCB7IGlzRGFlbW9uU2VydmVyIH0gZnJvbSBcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIjtcbmltcG9ydCB7IGV4aXN0cywgZmlsZUV4aXN0cyB9IGZyb20gXCIuLi91dGlscy9mcy11dGlsc1wiO1xuaW1wb3J0IHsgdHlwZSBBYnNvbHV0ZVBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiO1xuaW1wb3J0IHtcbiAgaXNCaWdJbnRWYWx1ZSxcbiAgaXNGdW5jdGlvblZhbHVlLFxuICBpc051bWJlclZhbHVlLFxuICBpc09iamVjdFZhbHVlLFxuICBpc1N0cmluZ1ZhbHVlLFxuICBpc1N5bWJvbFZhbHVlLFxufSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuaW1wb3J0IHsgY29udmVydEZhc3RpZnlIZWFkZXJzVG9TdGFuZGFyZCwgbWVyZ2UgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZVpvZENvbXBpbGVyUG9saWN5LFxuICB0eXBlIFNvbmFtdUNvbmZpZyxcbiAgdHlwZSBTb25hbXVTZXJ2ZXJPcHRpb25zLFxuICB0eXBlIFNvbmFtdVRhc2tPcHRpb25zLFxufSBmcm9tIFwiLi9jb25maWdcIjtcbmltcG9ydCB7IHR5cGUgQ29udGV4dCwgdHlwZSBSdW50aW1lQ29udGV4dCwgdHlwZSBXZWJTb2NrZXRDb250ZXh0IH0gZnJvbSBcIi4vY29udGV4dFwiO1xuaW1wb3J0IHsgdHlwZSBFeHRlbmRlZEFwaSB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7XG4gIGFzc2VydEh0dHBWYWxpZGF0b3JSZWdpc3RyeSxcbiAgY3JlYXRlSHR0cFZhbGlkYXRvcixcbiAgZ2V0SHR0cFZhbGlkYXRvclJvdXRlS2V5LFxuICB0eXBlIEh0dHBWYWxpZGF0b3IsXG4gIHR5cGUgSHR0cFZhbGlkYXRvclJlZ2lzdHJ5LFxufSBmcm9tIFwiLi9odHRwLXZhbGlkYXRvclwiO1xuaW1wb3J0IHsgZ2V0U2VjcmV0cyB9IGZyb20gXCIuL3NlY3JldFwiO1xuaW1wb3J0IHsgdHlwZSBTb25hbXVTZWNyZXRzIH0gZnJvbSBcIi4vc2VjcmV0XCI7XG5pbXBvcnQge1xuICBjcmVhdGVXZWJTb2NrZXRSZXBseVN0dWIsXG4gIHJlc29sdmVXZWJTb2NrZXRDbG9zZURlc2NyaXB0b3IsXG4gIHJlc29sdmVXZWJTb2NrZXRQbHVnaW5PcHRpb25zLFxuICByZXNvbHZlSW50ZWdyYXRlZFZpdGVIbXJPcHRpb25zLFxufSBmcm9tIFwiLi93ZWJzb2NrZXQtaGVscGVyc1wiO1xuXG5leHBvcnQge1xuICBjcmVhdGVXZWJTb2NrZXRSZXBseVN0dWIsXG4gIHJlc29sdmVXZWJTb2NrZXRDbG9zZURlc2NyaXB0b3IsXG4gIHJlc29sdmVXZWJTb2NrZXRQbHVnaW5PcHRpb25zLFxufSBmcm9tIFwiLi93ZWJzb2NrZXQtaGVscGVyc1wiO1xuXG5pbnRlcmZhY2UgVXBsb2FkZWRSZXF1ZXN0RmlsZXMge1xuICBidWZmZXJlZEZpbGVzOiBCdWZmZXJlZEZpbGVbXTtcbiAgdXBsb2FkZWRGaWxlczogVXBsb2FkZWRGaWxlW107XG59XG5cbnR5cGUgQXBpQXJndW1lbnQgPVxuICB8IHN0cmluZ1xuICB8IG51bWJlclxuICB8IGJvb2xlYW5cbiAgfCBiaWdpbnRcbiAgfCBzeW1ib2xcbiAgfCBDYWxsYWJsZUZ1bmN0aW9uXG4gIHwgb2JqZWN0XG4gIHwgbnVsbFxuICB8IHVuZGVmaW5lZDtcbnR5cGUgQXBpTWV0aG9kUmVzdWx0ID0gQXBpQXJndW1lbnQgfCB2b2lkO1xuXG5mdW5jdGlvbiB0b0FwaUFyZ3VtZW50PFZhbHVlPih2YWx1ZTogVmFsdWUpOiBBcGlBcmd1bWVudCB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodmFsdWUgPT09IHRydWUpIHJldHVybiB0cnVlO1xuICBpZiAodmFsdWUgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gIGlmIChpc1N0cmluZ1ZhbHVlKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICBpZiAoaXNOdW1iZXJWYWx1ZSh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgaWYgKGlzQmlnSW50VmFsdWUodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gIGlmIChpc1N5bWJvbFZhbHVlKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICBpZiAoaXNGdW5jdGlvblZhbHVlKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICBpZiAoaXNPYmplY3RWYWx1ZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFwi7KeA7JuQ7ZWY7KeAIOyViuuKlCBBUEkg7J247IiYIO2DgOyeheyeheuLiOuLpC5cIik7XG59XG5cbmZ1bmN0aW9uIHRvQXBpQXJndW1lbnRNYXA8VmFsdWUgZXh0ZW5kcyBvYmplY3Q+KHZhbHVlOiBWYWx1ZSk6IE1hcDxzdHJpbmcsIEFwaUFyZ3VtZW50PiB7XG4gIHJldHVybiBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKHZhbHVlKS5tYXAoKFtrZXksIGl0ZW1dKSA9PiBba2V5LCB0b0FwaUFyZ3VtZW50KGl0ZW0pXSkpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVVbmF2YWlsYWJsZVNTRTxUIGV4dGVuZHMgWm9kT2JqZWN0PihfZXZlbnRzOiBUKTogbmV2ZXIge1xuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgXCJjcmVhdGVTU0UgaXMgbm90IGF2YWlsYWJsZSBpbiB3ZWJzb2NrZXQgY29udGV4dC4gRGVmaW5lIHdlYnNvY2tldENvbnRleHRQcm92aWRlciBpZiB5b3VyIGNvbnRleHQgc2V0dXAgZGVwZW5kcyBvbiBTU0UgaGVscGVycy5cIixcbiAgKTtcbn1cblxuZnVuY3Rpb24gcHJpbnREaW1TdW1tYXJ5KG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICBjb25zb2xlLmxvZyhjaGFsay5kaW0oYOKckyAke21lc3NhZ2V9YCkpO1xufVxuXG5mdW5jdGlvbiBwcmludEdyZWVuU3VtbWFyeShtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyAke21lc3NhZ2V9YCkpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvbmFtdVRlc3RpbmdTbmFwc2hvdCB7XG4gIGFwaVJvb3RQYXRoOiBBYnNvbHV0ZVBhdGggfCBudWxsO1xuICBjb25maWc6IFNvbmFtdUNvbmZpZyB8IG51bGw7XG4gIHN5bmNlcjogU3luY2VyIHwgbnVsbDtcbiAgaHR0cFZhbGlkYXRvcnM6IFdlYWtNYXA8RXh0ZW5kZWRBcGksIEh0dHBWYWxpZGF0b3I+O1xuICBwZW5kaW5nSHR0cFZhbGlkYXRvcnM6IFdlYWtNYXA8RXh0ZW5kZWRBcGksIFByb21pc2U8SHR0cFZhbGlkYXRvcj4+O1xuICBhb3RIdHRwVmFsaWRhdG9yUmVnaXN0cnk6IEh0dHBWYWxpZGF0b3JSZWdpc3RyeSB8IHVuZGVmaW5lZDtcbiAgcHJlcGFyZWRBcGlzOiByZWFkb25seSBFeHRlbmRlZEFwaVtdO1xuICBwcmVwYXJlZE1vZGVsczogTG9hZGVkTW9kZWxzO1xuICB3ZWJzb2NrZXRSdW50aW1lOiBXZWJTb2NrZXRSdW50aW1lIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTb25hbXVIdHRwVmFsaWRhdG9yRGVwZW5kZW5jaWVzIHtcbiAgY3JlYXRlVmFsaWRhdG9yOiB0eXBlb2YgY3JlYXRlSHR0cFZhbGlkYXRvcjtcbiAgYXNzZXJ0UmVnaXN0cnk6IHR5cGVvZiBhc3NlcnRIdHRwVmFsaWRhdG9yUmVnaXN0cnk7XG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0U29uYW11SHR0cFZhbGlkYXRvckRlcGVuZGVuY2llczogU29uYW11SHR0cFZhbGlkYXRvckRlcGVuZGVuY2llcyA9IHtcbiAgY3JlYXRlVmFsaWRhdG9yOiBjcmVhdGVIdHRwVmFsaWRhdG9yLFxuICBhc3NlcnRSZWdpc3RyeTogYXNzZXJ0SHR0cFZhbGlkYXRvclJlZ2lzdHJ5LFxufTtcblxuY2xhc3MgU29uYW11Q2xhc3Mge1xuICBwdWJsaWMgaXNJbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgZm9yVGVzdGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgYXN5bmNMb2NhbFN0b3JhZ2U6IEFzeW5jTG9jYWxTdG9yYWdlPHtcbiAgICBjb250ZXh0OiBSdW50aW1lQ29udGV4dDtcbiAgfT4gPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2UoKTtcbiAgcHJpdmF0ZSBodHRwVmFsaWRhdG9yczogV2Vha01hcDxFeHRlbmRlZEFwaSwgSHR0cFZhbGlkYXRvcj4gPSBuZXcgV2Vha01hcCgpO1xuICBwcml2YXRlIHBlbmRpbmdIdHRwVmFsaWRhdG9yczogV2Vha01hcDxFeHRlbmRlZEFwaSwgUHJvbWlzZTxIdHRwVmFsaWRhdG9yPj4gPSBuZXcgV2Vha01hcCgpO1xuICBwcml2YXRlIGFvdEh0dHBWYWxpZGF0b3JSZWdpc3RyeTogSHR0cFZhbGlkYXRvclJlZ2lzdHJ5IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHByZXBhcmVkQXBpczogcmVhZG9ubHkgRXh0ZW5kZWRBcGlbXSA9IFtdO1xuICBwcml2YXRlIHByZXBhcmVkTW9kZWxzOiBMb2FkZWRNb2RlbHMgPSB7fTtcblxuICBwdWJsaWMgZ2V0Q29udGV4dDxUIGV4dGVuZHMgUnVudGltZUNvbnRleHQgPSBDb250ZXh0PigpOiBUIHtcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgICBpZiAoc3RvcmU/LmNvbnRleHQpIHtcbiAgICAgIHJldHVybiAvKiBTQUZFVFk6IEFQSSDrjbDsvZTroIjsnbTthLDsmYAgWm9kIOqygOymneq4sCDrk7HroZ0g6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gc3RvcmUuY29udGV4dCBhcyBUO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJ0ZXN0XCIpIHtcbiAgICAgIC8vIO2FjOyKpO2MhSDtmZjqsr3sl5DshJwg7Luo7YWN7Iqk7Yq46rCAIOyjvOyeheuQmOyngCDslYrsnYAg6rK97JqwIOu5iCDsu6jthY3siqTtirgg66as7YS0XG4gICAgICBjb25zdCBtb2NrQ29udGV4dCA9IHtcbiAgICAgICAgdHJhbnNwb3J0OiBcImh0dHBcIixcbiAgICAgICAgcmVxdWVzdDogbnVsbCxcbiAgICAgICAgcmVwbHk6IG51bGwsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBjcmVhdGVTU0U6IChzY2hlbWE6IFpvZE9iamVjdCkgPT4gY3JlYXRlTW9ja1NTRUZhY3Rvcnkoc2NoZW1hKSxcbiAgICAgICAgbG9jYWxlOiBcIlwiLFxuICAgICAgICB1c2VyOiBudWxsLFxuICAgICAgICBzZXNzaW9uOiBudWxsLFxuICAgICAgICBuYWl0ZVN0b3JlOiBuZXcgTWFwPHN0cmluZywgYW55PigpLFxuICAgICAgfTtcbiAgICAgIC8vIFNBRkVUWTog7YWM7Iqk7Yq4IOq4sOuzuCDsu6jthY3siqTtirjripQgSFRUUCBDb250ZXh07J2066mwIOq4sOuzuCDsoJzrhKTrpq3qs7wg7J287LmY7ZWc64ukLlxuICAgICAgcmV0dXJuIC8qIFNBRkVUWTog7YWM7Iqk7Yq4IOq4sOuzuCDsu6jthY3siqTtirjripQg7JqU7LKtIOuylOychOqwgCDsl4bripQgSFRUUCDsu6jthY3siqTtirgg64yA7LK06rCS7J6F64uI64ukLiAqLyBtb2NrQ29udGV4dCBhcyBUICZcbiAgICAgICAgdHlwZW9mIG1vY2tDb250ZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgY2Fubm90IGZpbmQgY29udGV4dFwiKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwaVJvb3RQYXRoVmFsdWU6IEFic29sdXRlUGF0aCB8IG51bGwgPSBudWxsO1xuICBzZXQgYXBpUm9vdFBhdGgoYXBpUm9vdFBhdGg6IEFic29sdXRlUGF0aCkge1xuICAgIHRoaXMuYXBpUm9vdFBhdGhWYWx1ZSA9IGFwaVJvb3RQYXRoO1xuICB9XG4gIGdldCBhcGlSb290UGF0aCgpOiBBYnNvbHV0ZVBhdGgge1xuICAgIGlmICh0aGlzLmFwaVJvb3RQYXRoVmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFwaVJvb3RQYXRoVmFsdWU7XG4gIH1cbiAgZ2V0IGFwcFJvb3RQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYXBpUm9vdFBhdGguc3BsaXQocGF0aC5zZXApLnNsaWNlKDAsIC0xKS5qb2luKHBhdGguc2VwKTtcbiAgfVxuXG4gIHByaXZhdGUgZGJDb25maWdWYWx1ZTogU29uYW11REJDb25maWcgfCBudWxsID0gbnVsbDtcbiAgc2V0IGRiQ29uZmlnKGRiQ29uZmlnOiBTb25hbXVEQkNvbmZpZykge1xuICAgIHRoaXMuZGJDb25maWdWYWx1ZSA9IGRiQ29uZmlnO1xuICB9XG4gIGdldCBkYkNvbmZpZygpOiBTb25hbXVEQkNvbmZpZyB7XG4gICAgaWYgKHRoaXMuZGJDb25maWdWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZGJDb25maWdWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3luY2VyVmFsdWU6IFN5bmNlciB8IG51bGwgPSBudWxsO1xuICBzZXQgc3luY2VyKHN5bmNlcjogU3luY2VyKSB7XG4gICAgdGhpcy5zeW5jZXJWYWx1ZSA9IHN5bmNlcjtcbiAgfVxuICBnZXQgc3luY2VyKCk6IFN5bmNlciB7XG4gICAgaWYgKHRoaXMuc3luY2VyVmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN5bmNlclZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25maWdWYWx1ZTogU29uYW11Q29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIHNldCBjb25maWcoY29uZmlnOiBTb25hbXVDb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZ1ZhbHVlID0gY29uZmlnO1xuICB9XG4gIGdldCBjb25maWcoKTogU29uYW11Q29uZmlnIHtcbiAgICBpZiAodGhpcy5jb25maWdWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnVmFsdWU7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgc2VjcmV0czogU29uYW11U2VjcmV0cyA9IGdldFNlY3JldHMoKTtcblxuICBwcml2YXRlIHN0b3JhZ2VWYWx1ZTogU3RvcmFnZU1hbmFnZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIFN0b3JhZ2VNYW5hZ2VyIOyduOyKpO2EtOyKpFxuICAgKi9cbiAgZ2V0IHN0b3JhZ2UoKTogU3RvcmFnZU1hbmFnZXIge1xuICAgIGlmICghdGhpcy5zdG9yYWdlVmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlN0b3JhZ2UgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLiBDaGVjayBzdG9yYWdlIGNvbmZpZy5cIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0b3JhZ2VWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgY2FjaGVWYWx1ZTogQ2FjaGVNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIC8qKlxuICAgKiBDYWNoZU1hbmFnZXIg7J247Iqk7YS07IqkIChCZW50b0NhY2hlKVxuICAgKi9cbiAgZ2V0IGNhY2hlKCk6IENhY2hlTWFuYWdlciB7XG4gICAgaWYgKCF0aGlzLmNhY2hlVmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhY2hlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4gQ2hlY2sgY2FjaGUgY29uZmlnIGluIHNvbmFtdS5jb25maWcudHMuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jYWNoZVZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSB3b3JrZmxvd3NWYWx1ZTogV29ya2Zsb3dNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIGdldCB3b3JrZmxvd3MoKTogV29ya2Zsb3dNYW5hZ2VyIHtcbiAgICBpZiAodGhpcy53b3JrZmxvd3NWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy53b3JrZmxvd3NWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgYXV0aFZhbHVlOiBBdXRoPEJldHRlckF1dGhPcHRpb25zPiB8IG51bGwgPSBudWxsO1xuICBnZXQgYXV0aCgpOiBBdXRoPEJldHRlckF1dGhPcHRpb25zPiB7XG4gICAgaWYgKCF0aGlzLmF1dGhWYWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXV0aCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuIENoZWNrIGF1dGggY29uZmlnIGluIHNvbmFtdS5jb25maWcudHMuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hdXRoVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGRldlZpdGVzdE1hbmFnZXJWYWx1ZTogRGV2Vml0ZXN0TWFuYWdlciB8IG51bGwgPSBudWxsO1xuICBnZXQgZGV2Vml0ZXN0TWFuYWdlcigpOiBEZXZWaXRlc3RNYW5hZ2VyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZGV2Vml0ZXN0TWFuYWdlclZhbHVlO1xuICB9XG4gIHNldCBkZXZWaXRlc3RNYW5hZ2VyKG1hbmFnZXI6IERldlZpdGVzdE1hbmFnZXIgfCBudWxsKSB7XG4gICAgdGhpcy5kZXZWaXRlc3RNYW5hZ2VyVmFsdWUgPSBtYW5hZ2VyO1xuICB9XG5cbiAgLy8gU29uYW116rCAIHJ1bnRpbWXsnYQg7KeB7KCRIOyGjOycoO2VtCByZWdpc3RyeS9jb25uZWN0aW9uIGxpZmVjeWNsZeydhCDslaDtlIzrpqzsvIDsnbTshZgg7IiY66qF7KO86riw7JmAIOuPmeq4sO2ZlO2VqFxuICBwcml2YXRlIHdlYnNvY2tldFJ1bnRpbWVWYWx1ZTogV2ViU29ja2V0UnVudGltZSB8IG51bGwgPSBudWxsO1xuICAvLyDqsJnsnYAgRmFzdGlmeSDsnbjsiqTthLTsiqTsl5AgQGZhc3RpZnkvd2Vic29ja2V07J2EIOykkeuztSDrk7HroZ3tlZjripQg6rKD7J2EIFdlYWtTZXTsnLzroZwg7LCo64uo7ZWoXG4gIHByaXZhdGUgcmVhZG9ubHkgd2Vic29ja2V0UGx1Z2luU2VydmVycyA9IG5ldyBXZWFrU2V0PFxuICAgIEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+XG4gID4oKTtcbiAgZ2V0IHdlYnNvY2tldFJ1bnRpbWUoKTogV2ViU29ja2V0UnVudGltZSB7XG4gICAgaWYgKCF0aGlzLndlYnNvY2tldFJ1bnRpbWVWYWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV2ViU29ja2V0IHJ1bnRpbWUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMud2Vic29ja2V0UnVudGltZVZhbHVlO1xuICB9XG4gIHNldCB3ZWJzb2NrZXRSdW50aW1lKHJ1bnRpbWU6IFdlYlNvY2tldFJ1bnRpbWUgfCBudWxsKSB7XG4gICAgdGhpcy53ZWJzb2NrZXRSdW50aW1lVmFsdWUgPSBydW50aW1lO1xuICB9XG5cbiAgY2FwdHVyZVRlc3RpbmdTbmFwc2hvdCgpOiBTb25hbXVUZXN0aW5nU25hcHNob3Qge1xuICAgIHJldHVybiB7XG4gICAgICBhcGlSb290UGF0aDogdGhpcy5hcGlSb290UGF0aFZhbHVlLFxuICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZ1ZhbHVlLFxuICAgICAgc3luY2VyOiB0aGlzLnN5bmNlclZhbHVlLFxuICAgICAgaHR0cFZhbGlkYXRvcnM6IHRoaXMuaHR0cFZhbGlkYXRvcnMsXG4gICAgICBwZW5kaW5nSHR0cFZhbGlkYXRvcnM6IHRoaXMucGVuZGluZ0h0dHBWYWxpZGF0b3JzLFxuICAgICAgYW90SHR0cFZhbGlkYXRvclJlZ2lzdHJ5OiB0aGlzLmFvdEh0dHBWYWxpZGF0b3JSZWdpc3RyeSxcbiAgICAgIHByZXBhcmVkQXBpczogdGhpcy5wcmVwYXJlZEFwaXMsXG4gICAgICBwcmVwYXJlZE1vZGVsczogdGhpcy5wcmVwYXJlZE1vZGVscyxcbiAgICAgIHdlYnNvY2tldFJ1bnRpbWU6IHRoaXMud2Vic29ja2V0UnVudGltZVZhbHVlLFxuICAgIH07XG4gIH1cblxuICByZXN0b3JlVGVzdGluZ1NuYXBzaG90KHNuYXBzaG90OiBTb25hbXVUZXN0aW5nU25hcHNob3QpOiB2b2lkIHtcbiAgICB0aGlzLmFwaVJvb3RQYXRoVmFsdWUgPSBzbmFwc2hvdC5hcGlSb290UGF0aDtcbiAgICB0aGlzLmNvbmZpZ1ZhbHVlID0gc25hcHNob3QuY29uZmlnO1xuICAgIHRoaXMuc3luY2VyVmFsdWUgPSBzbmFwc2hvdC5zeW5jZXI7XG4gICAgdGhpcy5odHRwVmFsaWRhdG9ycyA9IHNuYXBzaG90Lmh0dHBWYWxpZGF0b3JzO1xuICAgIHRoaXMucGVuZGluZ0h0dHBWYWxpZGF0b3JzID0gc25hcHNob3QucGVuZGluZ0h0dHBWYWxpZGF0b3JzO1xuICAgIHRoaXMuYW90SHR0cFZhbGlkYXRvclJlZ2lzdHJ5ID0gc25hcHNob3QuYW90SHR0cFZhbGlkYXRvclJlZ2lzdHJ5O1xuICAgIHRoaXMucHJlcGFyZWRBcGlzID0gc25hcHNob3QucHJlcGFyZWRBcGlzO1xuICAgIHRoaXMucHJlcGFyZWRNb2RlbHMgPSBzbmFwc2hvdC5wcmVwYXJlZE1vZGVscztcbiAgICB0aGlzLndlYnNvY2tldFJ1bnRpbWVWYWx1ZSA9IHNuYXBzaG90LndlYnNvY2tldFJ1bnRpbWU7XG4gIH1cblxuICAvLyBITVIg7LKY66asOiDtjIzsnbwg7Iuc7Iqk7YWcIOqwkOyLnCArIEhNUi9zeW5jIOyCrOydtO2BtCDsi6TtlonsnYAgd2F0Y2hlciDrqqjrk4jroZwg7JyE7J6E7ZWp64uI64ukLlxuICBwdWJsaWMgd2F0Y2hlcjogRlNXYXRjaGVyIHwgbnVsbCA9IG51bGw7XG5cbiAgcHVibGljIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlIHwgbnVsbCA9IG51bGw7XG5cbiAgYXN5bmMgaW5pdEZvclRlc3RpbmcoKSB7XG4gICAgYXdhaXQgdGhpcy5pbml0KHRydWUsIGZhbHNlLCB1bmRlZmluZWQsIHRydWUpO1xuICB9XG5cbiAgYXN5bmMgaW5pdChcbiAgICBkb1NpbGVudDogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGVuYWJsZVN5bmM6IGJvb2xlYW4gPSB0cnVlLFxuICAgIGFwaVJvb3RQYXRoPzogQWJzb2x1dGVQYXRoLFxuICAgIGZvclRlc3Rpbmc6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKSB7XG4gICAgdGhpcy5mb3JUZXN0aW5nID0gZm9yVGVzdGluZztcblxuICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpbml0U3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcblxuICAgIC8vIEFQSSDro6jtirgg7Yyo7IqkXG4gICAgY29uc3QgeyBmaW5kQXBpUm9vdFBhdGggfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL3V0aWxzXCIpO1xuICAgIHRoaXMuYXBpUm9vdFBhdGggPSBhcGlSb290UGF0aCA/PyBmaW5kQXBpUm9vdFBhdGgoKTtcbiAgICBjb25zdCBiYXNlRW52QmVmb3JlQ29uZmlnTG9hZCA9IHsgLi4ucHJvY2Vzcy5lbnYgfTtcblxuICAgIC8vIOyEpOygleydhCDroZzrlKntlZjripQg6rKD67aA7YSwIOyLnOyekVxuICAgIGNvbnN0IGNvbmZpZ1N0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgY29uc3QgeyBsb2FkQ29uZmlnIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2NvbmZpZ1wiKTtcbiAgICB0aGlzLmNvbmZpZyA9IGF3YWl0IGxvYWRDb25maWcodGhpcy5hcGlSb290UGF0aCk7XG4gICAgY29uc3QgY29uZmlnVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpIC0gY29uZmlnU3RhcnQ7XG4gICAgc2V0U0RDb25maWcodGhpcy5jb25maWcuaTE4bik7XG4gICAgLy8gc29uYW11LmNvbmZpZy50cyDquLDrs7jqsJIg7ISk7KCVXG4gICAgdGhpcy5jb25maWcuZGF0YWJhc2UuZGF0YWJhc2UgPSB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kYXRhYmFzZSA/PyBcInBnXCI7XG4gICAgdGhpcy5jb25maWcuZGF0YWJhc2UuZGVmYXVsdE9wdGlvbnMgPSB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kZWZhdWx0T3B0aW9ucyA/PyB7fTtcbiAgICB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kZWZhdWx0T3B0aW9ucy5jbGllbnQgPSB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kYXRhYmFzZSA/PyBcInBnXCI7XG5cbiAgICAvLyDroZzquYUg7ISk7KCVXG4gICAgY29uc3QgeyBjb25maWd1cmVMb2dUYXBlIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9sb2dnZXIvY29uZmlndXJlXCIpO1xuICAgIGlmICh0aGlzLmNvbmZpZy5sb2dnaW5nICE9PSBmYWxzZSkge1xuICAgICAgYXdhaXQgY29uZmlndXJlTG9nVGFwZSh7XG4gICAgICAgIC4uLnRoaXMuY29uZmlnLmxvZ2dpbmcsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBEQiDroZzrk5xcbiAgICBjb25zdCB7IERCOiBSdW50aW1lREIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2RhdGFiYXNlL2RiXCIpO1xuICAgIGNvbnN0IHsgaXNMb2NhbDogaXNMb2NhbEVudmlyb25tZW50IH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9jb250cm9sbGVyXCIpO1xuICAgIGNvbnN0IGVudmlyb25tZW50U25hcHNob3RzID0gaXNMb2NhbEVudmlyb25tZW50KClcbiAgICAgID8gcmVhZEFsbEVudmlyb25tZW50U25hcHNob3RzKHRoaXMuYXBpUm9vdFBhdGgsIGJhc2VFbnZCZWZvcmVDb25maWdMb2FkKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5kYkNvbmZpZyA9IFJ1bnRpbWVEQi5nZW5lcmF0ZURCQ29uZmlnKFxuICAgICAgdGhpcy5jb25maWcuZGF0YWJhc2UsXG4gICAgICB0aGlzLmNvbmZpZy5wcm9qZWN0TmFtZSxcbiAgICAgIGVudmlyb25tZW50U25hcHNob3RzLFxuICAgICk7XG4gICAgUnVudGltZURCLnNldENvbmZpZyh0aGlzLmRiQ29uZmlnKTtcblxuICAgIC8vIEVudGl0eSDroZzrk5xcbiAgICAvLyDthYzsiqTtirjsl5DshJzrj4QgRW50aXR5IOygleuztOuKlCDtlYTsmpTtlanri4jri6QuXG4gICAgLy8gdXBzZXJ06rCAIOygnOuMgOuhnCDsnpHrj5ntlZjroKTrqbQgZW50aXR57J2YIHVuaXF1ZSBpbmRleCDsoJXrs7TqsIAg7ZWE7JqU7ZWY6riwIOuVjOusuOyeheuLiOuLpC5cbiAgICBjb25zdCB7IEVudGl0eU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiKTtcbiAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLmF1dG9sb2FkKGRvU2lsZW50KTtcblxuICAgIC8vIENhY2hlIOy0iOq4sO2ZlFxuICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZUNhY2hlKHRoaXMuY29uZmlnLnNlcnZlci5jYWNoZSwgZm9yVGVzdGluZyk7XG5cbiAgICAvLyBCZXR0ZXJBdXRoIOy0iOq4sO2ZlFxuICAgIGNvbnN0IGF1dGhDb25maWcgPSB0aGlzLmNvbmZpZy5zZXJ2ZXIuYXV0aDtcbiAgICBpZiAoYXV0aENvbmZpZykge1xuICAgICAgLy8g7IKs7Jqp7J6QIOyEpOygleqzvCDquLDrs7jqsJLsnYQgbWVyZ2VcbiAgICAgIGNvbnN0IG1lcmdlZEZpZWxkTWFwcGluZ3MgPSBtZXJnZShCQVNFX0ZJRUxEX01BUFBJTkdTLCBhdXRoQ29uZmlnKTtcblxuICAgICAgLy8gYmV0dGVyLWF1dGgg7J247Iqk7YS07IqkIOyDneyEsVxuICAgICAgY29uc3QgeyBiZXR0ZXJBdXRoIH0gPSBhd2FpdCBpbXBvcnQoXCJiZXR0ZXItYXV0aFwiKTtcbiAgICAgIGNvbnN0IHsgc29uYW11S25leEFkYXB0ZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2F1dGgva25leC1hZGFwdGVyXCIpO1xuXG4gICAgICBjb25zdCBhdXRoT3B0aW9uczogQmV0dGVyQXV0aE9wdGlvbnMgPSB7XG4gICAgICAgIGRhdGFiYXNlOiBzb25hbXVLbmV4QWRhcHRlcigpLFxuICAgICAgICAuLi5tZXJnZWRGaWVsZE1hcHBpbmdzLFxuICAgICAgfTtcbiAgICAgIHRoaXMuYXV0aFZhbHVlID0gYmV0dGVyQXV0aChhdXRoT3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLy8g7YWM7Iqk7YyF7J24IOqyveyasCDsi7Htgawg7JeG7J20IOykkeuLqFxuICAgIGlmIChmb3JUZXN0aW5nKSB7XG4gICAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRhc2sg65Ox66GdXG4gICAgYXdhaXQgdGhpcy5pbml0aWFsaXplV29ya2Zsb3dzKHRoaXMuY29uZmlnLnRhc2tzKTtcblxuICAgIC8vIFN5bmNlclxuICAgIGNvbnN0IHsgU3luY2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zeW5jZXIvc3luY2VyXCIpO1xuICAgIHRoaXMuc3luY2VyID0gbmV3IFN5bmNlcigpO1xuXG4gICAgLy8gQXV0b2xvYWQ6IE1vZGVscyAvIFR5cGVzIC8gQVBJcyAvIFdvcmtmbG93cyAvIFRlbXBsYXRlcyAvIFNTUiBSb3V0ZXNcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZFR5cGVzKCk7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuYXV0b2xvYWRNb2RlbHMoKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZEFwaXMoKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZFdvcmtmbG93cygpO1xuICAgIGNvbnN0IHsgVGVtcGxhdGVNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi90ZW1wbGF0ZVwiKTtcbiAgICBhd2FpdCBUZW1wbGF0ZU1hbmFnZXIuYXV0b2xvYWQoKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZFNzclJvdXRlcygpO1xuXG4gICAgY29uc3QgeyBpc0xvY2FsLCBpc1Rlc3QsIGlzSG90UmVsb2FkU2VydmVyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9jb250cm9sbGVyXCIpO1xuICAgIGlmIChpc0xvY2FsKCkgJiYgIWlzVGVzdCgpICYmIGlzSG90UmVsb2FkU2VydmVyKCkgJiYgZW5hYmxlU3luYykge1xuICAgICAgYXdhaXQgdGhpcy5zeW5jZXIuc3luYygpO1xuICAgICAgYXdhaXQgdGhpcy5zdGFydFdhdGNoZXIoKTtcbiAgICB9XG5cbiAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIHRoaXMuaW5pdEVsYXBzZWQgPSBwZXJmb3JtYW5jZS5ub3coKSAtIGluaXRTdGFydDtcbiAgICB0aGlzLmNvbmZpZ0VsYXBzZWQgPSBjb25maWdUaW1lO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0RWxhcHNlZCA9IDA7XG4gIHByaXZhdGUgY29uZmlnRWxhcHNlZCA9IDA7XG5cbiAgYXN5bmMgY3JlYXRlU2VydmVyKGluaXRPcHRpb25zPzogeyBlbmFibGVTeW5jPzogYm9vbGVhbjsgZG9TaWxlbnQ/OiBib29sZWFuIH0pIHtcbiAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXplZCkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0KGluaXRPcHRpb25zPy5kb1NpbGVudCwgaW5pdE9wdGlvbnM/LmVuYWJsZVN5bmMpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmNvbmZpZy5zZXJ2ZXI7XG4gICAgY29uc3QgeyBkZWZhdWx0OiBmYXN0aWZ5IH0gPSBhd2FpdCBpbXBvcnQoXCJmYXN0aWZ5XCIpO1xuICAgIGNvbnN0IHsgZ2V0TG9nVGFwZUZhc3RpZnlMb2dnZXIgfSA9IGF3YWl0IGltcG9ydChcIkBsb2d0YXBlL2Zhc3RpZnlcIik7XG4gICAgY29uc3Qgc2VydmVyID0gZmFzdGlmeSh7XG4gICAgICAuLi5vcHRpb25zLmZhc3RpZnksXG4gICAgICBsb2dnZXI6XG4gICAgICAgIHRoaXMuY29uZmlnLmxvZ2dpbmcgIT09IGZhbHNlXG4gICAgICAgICAgPyBnZXRMb2dUYXBlRmFzdGlmeUxvZ2dlcih7XG4gICAgICAgICAgICAgIGNhdGVnb3J5OiB0aGlzLmNvbmZpZy5sb2dnaW5nPy5mYXN0aWZ5Q2F0ZWdvcnkgPz8gW1wiZmFzdGlmeVwiXSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gICAgdGhpcy53ZWJzb2NrZXRSdW50aW1lID0gbmV3IFdlYlNvY2tldFJ1bnRpbWUob3B0aW9ucy53ZWJzb2NrZXQpO1xuXG4gICAgLy8gU3RvcmFnZSDshKTsoJUg4oaSIFN0b3JhZ2VNYW5hZ2VyIOyDneyEsVxuICAgIGlmIChvcHRpb25zLnN0b3JhZ2UpIHtcbiAgICAgIGNvbnN0IHsgU3RvcmFnZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N0b3JhZ2Uvc3RvcmFnZS1tYW5hZ2VyXCIpO1xuICAgICAgdGhpcy5zdG9yYWdlVmFsdWUgPSBuZXcgU3RvcmFnZU1hbmFnZXIob3B0aW9ucy5zdG9yYWdlKTtcbiAgICB9XG5cbiAgICAvLyDtlIzrn6zqt7jsnbgg65Ox66GdXG4gICAgaWYgKG9wdGlvbnMucGx1Z2lucykge1xuICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlclBsdWdpbnMoc2VydmVyLCBvcHRpb25zLnBsdWdpbnMpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmF1dGgpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJCZXR0ZXJBdXRoKHNlcnZlciwgb3B0aW9ucy5hdXRoKTtcbiAgICB9XG5cbiAgICAvLyBBUEkg65287Jqw7YyFIOyEpOyglVxuICAgIGF3YWl0IHRoaXMud2l0aEZhc3RpZnkoc2VydmVyLCBvcHRpb25zLmFwaUNvbmZpZywge1xuICAgICAgZW5hYmxlU3luYzogaW5pdE9wdGlvbnM/LmVuYWJsZVN5bmMsXG4gICAgICBkb1NpbGVudDogaW5pdE9wdGlvbnM/LmRvU2lsZW50LFxuICAgIH0pO1xuXG4gICAgLy8g7ISc67KEIOyLnOyekVxuICAgIGF3YWl0IHRoaXMuYm9vdChzZXJ2ZXIsIG9wdGlvbnMpO1xuXG4gICAgaWYgKCFpbml0T3B0aW9ucz8uZG9TaWxlbnQpIHtcbiAgICAgIHRoaXMucHJpbnRTdGFydHVwU3VtbWFyeSgpO1xuICAgIH1cblxuICAgIHJldHVybiBzZXJ2ZXI7XG4gIH1cblxuICBhc3luYyB3aXRoRmFzdGlmeShcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICBvcHRpb25zPzoge1xuICAgICAgZW5hYmxlU3luYz86IGJvb2xlYW47XG4gICAgICBkb1NpbGVudD86IGJvb2xlYW47XG4gICAgfSxcbiAgKSB7XG4gICAgaWYgKCF0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW5pdChvcHRpb25zPy5kb1NpbGVudCwgb3B0aW9ucz8uZW5hYmxlU3luYyk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gICAgdGhpcy53ZWJzb2NrZXRSdW50aW1lID8/PSBuZXcgV2ViU29ja2V0UnVudGltZSh0aGlzLmNvbmZpZy5zZXJ2ZXIud2Vic29ja2V0KTtcbiAgICBhd2FpdCB0aGlzLnJlZnJlc2hIdHRwVmFsaWRhdG9ycygpO1xuXG4gICAgLy8gdGltZXpvbmUg7ISk7KCVXG4gICAgY29uc3QgdGltZXpvbmUgPSB0aGlzLmNvbmZpZy5hcGkudGltZXpvbmU7XG4gICAgaWYgKHRpbWV6b25lKSB7XG4gICAgICAvLyDtg4DsnoTsobTsl5Ag66ee6rKMIOydkeuLtSDrgqDsp5wg7Iqk7Yq466eB7J2EIOuzgO2ZmO2VtOyjvOyWtOyVvCDtlanri4jri6QuXG4gICAgICAvLyDqsIDroLkgdGltZXpvbmXsnbQgXCJBc2lhL1Nlb3VsXCIg7J2066m0XG4gICAgICAvLyBcIjIwMjUtMTEtMjFUMDA6MDA6MDAuMDAwWlwiIOulvCBcIjIwMjUtMTEtMjFUMDk6MDA6MDArMDk6MDBcIiDsnLzroZwg67OA7ZmY7ZW07KO87Ja07JW8IO2VqeuLiOuLpC5cbiAgICAgIGNvbnN0IHsgZm9ybWF0SW5UaW1lWm9uZSB9ID0gYXdhaXQgaW1wb3J0KFwiZGF0ZS1mbnMtdHpcIik7XG5cbiAgICAgIC8vIElTTyA4NjAxIOuCoOynnCDtmJXsi50g7KCV6rec7IudICjsmIg6IDIwMjQtMDEtMTVUMDk6MzA6MDAuMDAwWilcbiAgICAgIGNvbnN0IElTT19EQVRFX1JFR0VYID0gL15cXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfShcXC5cXGR7M30pP1okLztcblxuICAgICAgLy8gVOulvCDrkZjrn6zsi7wg7J6R7J2A65Sw7Ji07ZGc6rCAIOyXhuuLpOuptCBcIjIwMjUtMTEtMTkxNzYzNTQ2MTg5MDAwMTg6NTY6MjkrMDk6MDBcIuyZgCDqsJnsnYAg6rKw6rO86rCAIOuCmOyYteuLiOuLpC5cbiAgICAgIC8vIOydtOuKlCBkYXRlLWZucyDtirnsnoXri4jri6QuXG4gICAgICAvLyDsnbTroIfqsowg7ZW064+EIOq0nOywruyKteuLiOuLpC4gXCIyMDI1LTExLTE5VDE4OjU2OjI5KzA5OjAwXCIg66qo7JaR7Jy866GcIOyemCDrgpjsmLXri4jri6QuXG4gICAgICBjb25zdCBEQVRFX0ZPUk1BVCA9IFwieXl5eS1NTS1kZCdUJ0hIOm1tOnNzWFhYXCI7XG5cbiAgICAgIHNlcnZlci5zZXRSZXBseVNlcmlhbGl6ZXIoKHBheWxvYWQpID0+IHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBheWxvYWQsIChfa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKHZhbHVlKSAmJiBJU09fREFURV9SRUdFWC50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdEluVGltZVpvbmUoXG4gICAgICAgICAgICAgIG5ldyBEYXRlKHZhbHVlKSxcbiAgICAgICAgICAgICAgLyogU0FGRVRZOiBBUEkg642w7L2U66CI7J207YSw7JmAIFpvZCDqsoDspp3quLAg65Ox66GdIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHRpbWV6b25lIGFzIGAke3N0cmluZ30vJHtzdHJpbmd9YCxcbiAgICAgICAgICAgICAgREFURV9GT1JNQVQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICAvLyBUaW1lem9uZSDroZzqt7jripQgcHJpbnRTdGFydHVwU3VtbWFyeeyXkOyEnCDthrXtlakg7Lac66ClXG4gICAgfVxuXG4gICAgLy8g7KCE7LK0IOudvOyasO2MhSDrpqzsiqTtirhcbiAgICBzZXJ2ZXIuZ2V0KFxuICAgICAgYCR7dGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeH0vcm91dGVzYCxcbiAgICAgIGFzeW5jIChfcmVxdWVzdCwgX3JlcGx5KTogUHJvbWlzZTx0eXBlb2YgdGhpcy5zeW5jZXIuYXBpcz4gPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW5jZXIuYXBpcztcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIEhlYWx0aGNoZWNrIEFQSVxuICAgIHNlcnZlci5nZXQoXG4gICAgICBgJHt0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4fS9oZWFsdGhjaGVja2AsXG4gICAgICBhc3luYyAoX3JlcXVlc3QsIF9yZXBseSk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgICAgIHJldHVybiBcIm9rXCI7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBTb25hbXUgVUkgQVBJICjroZzsu6wg7ZmY6rK97JeQ7ISc66eMKVxuICAgIGNvbnN0IHsgaXNMb2NhbCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvY29udHJvbGxlclwiKTtcbiAgICBpZiAoaXNMb2NhbCgpKSB7XG4gICAgICBjb25zdCB7IHNvbmFtdVVJQXBpUGx1Z2luIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91aS9hcGlcIik7XG4gICAgICBzZXJ2ZXIucmVnaXN0ZXIoc29uYW11VUlBcGlQbHVnaW4pO1xuICAgIH1cblxuICAgIC8vIERldlJ1bm5lciDthYzsiqTtirgg7JeU65Oc7Y+s7J247Yq4ICjroZzsu6wg7ZmY6rK9ICsgZGV2UnVubmVyIO2ZnOyEse2ZlCDsi5wpXG4gICAgaWYgKGlzTG9jYWwoKSAmJiB0aGlzLmNvbmZpZy50ZXN0Py5kZXZSdW5uZXI/LmVuYWJsZWQpIHtcbiAgICAgIGNvbnN0IHsgcmVnaXN0ZXJEZXZUZXN0Um91dGVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi90ZXN0aW5nL2Rldi10ZXN0LXJvdXRlc1wiKTtcbiAgICAgIGF3YWl0IHJlZ2lzdGVyRGV2VGVzdFJvdXRlcyhzZXJ2ZXIsIHRoaXMuY29uZmlnLnRlc3QuZGV2UnVubmVyKTtcbiAgICB9XG5cbiAgICBjb25zdCB3ZWJQYXRoID0gcGF0aC5qb2luKHRoaXMuYXBwUm9vdFBhdGgsIFwid2ViXCIpO1xuICAgIGNvbnN0IGhhc1dlYiA9IGF3YWl0IGV4aXN0cyh3ZWJQYXRoKTtcblxuICAgIC8vIOyghOyXrSBjb21wcmVzcyDsmLXshZgg6rOE7IKwIChyb3V0ZS5jb21wcmVzczogdHJ1ZeydvCDrlYwg7IKs7JqpKVxuICAgIGNvbnN0IHBsdWdpbkNvbXByZXNzID0gdGhpcy5jb25maWcuc2VydmVyLnBsdWdpbnM/LmNvbXByZXNzO1xuICAgIGNvbnN0IGdsb2JhbENvbXByZXNzT3B0aW9uczogQ29tcHJlc3NPcHRpb25zIHwgdW5kZWZpbmVkID0gcGx1Z2luQ29tcHJlc3NcbiAgICAgID8gcGx1Z2luQ29tcHJlc3MgPT09IHRydWVcbiAgICAgICAgPyB7IHRocmVzaG9sZDogMTAyNCwgZW5jb2RpbmdzOiBbXCJiclwiLCBcImd6aXBcIiwgXCJkZWZsYXRlXCJdIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICB0aHJlc2hvbGQ6IHBsdWdpbkNvbXByZXNzLnRocmVzaG9sZCxcbiAgICAgICAgICAgIGVuY29kaW5nczogcGx1Z2luQ29tcHJlc3MuZW5jb2RpbmdzLFxuICAgICAgICAgICAgY3VzdG9tVHlwZXM6IHBsdWdpbkNvbXByZXNzLmN1c3RvbVR5cGVzLFxuICAgICAgICAgIH1cbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKGlzTG9jYWwoKSkge1xuICAgICAgLy8g66Gc7LusIOqwnOuwnCDtmZjqsr06IGNhdGNoLWFsbOuhnCBBUEnrpbwg64+Z7KCBIOunpOy5re2VmOyXrCBITVLsnYQg7KeA7JuQ7ZWp64uI64ukLlxuICAgICAgLy8gU09OQU1VX0RJU0FCTEVfSU5URUdSQVRFRF9XRUI9eWVz66GcIOyEpOygle2VmOuptCBkZXZfYXBpIOuqqOuTnOyXkOyEnCBWaXRlIO2Gte2VqeydhCDruYTtmZzshLHtmZTtlaAg7IiYIOyeiOyKteuLiOuLpC5cbiAgICAgIGNvbnN0IGRpc2FibGVJbnRlZ3JhdGVkV2ViID0gcHJvY2Vzcy5lbnYuU09OQU1VX0RJU0FCTEVfSU5URUdSQVRFRF9XRUIgPT09IFwieWVzXCI7XG4gICAgICBpZiAoaGFzV2ViICYmICFkaXNhYmxlSW50ZWdyYXRlZFdlYikge1xuICAgICAgICBhd2FpdCB0aGlzLnNldHVwRGV2U2VydmVyV2l0aFZpdGUoc2VydmVyLCB3ZWJQYXRoLCBjb25maWcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXR1cERldlNlcnZlcihzZXJ2ZXIsIGNvbmZpZyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIO2UhOuhnOuNleyFmCDtmZjqsr06IOqwnOuzhCBBUEkg65287Jqw7Yq4ICsg7KCV7KCBIO2MjOydvCDshJzruZlcbiAgICAgIGZvciAoY29uc3QgYXBpIG9mIHRoaXMuc3luY2VyLmFwaXMpIHtcbiAgICAgICAgaWYgKHRoaXMuc3luY2VyLm1vZGVsc1thcGkubW9kZWxOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsoJXsnZjrkJjsp4Ag7JWK7J2AIOuqqOuNuOyXkCDsoJHqt7wgJHthcGkubW9kZWxOYW1lfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQHdlYnNvY2tldCByb3V0ZeuKlCB3c0hhbmRsZXLroZwg65Ox66Gd7ZWY6rOgLCDqsJnsnYAgcGF0aOydmCDsnbzrsJggSFRUUCBHRVTsnYAgNDI2IOydkeuLteycvOuhnCB1cGdyYWRl66W8IOqwleygnO2VqFxuICAgICAgICBpZiAoYXBpLndlYnNvY2tldE9wdGlvbnMpIHtcbiAgICAgICAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgdXJsOiB0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4ICsgYXBpLnBhdGgsXG4gICAgICAgICAgICBoYW5kbGVyOiB0aGlzLmNyZWF0ZVdlYlNvY2tldFVwZ3JhZGVSZXF1aXJlZEhhbmRsZXIoKSxcbiAgICAgICAgICAgIHdzSGFuZGxlcjogdGhpcy5jcmVhdGVXZWJTb2NrZXRIYW5kbGVyKGFwaSwgY29uZmlnKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICAgICAgbWV0aG9kOiBhcGkub3B0aW9ucy5odHRwTWV0aG9kID8/IFwiR0VUXCIsXG4gICAgICAgICAgdXJsOiB0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4ICsgYXBpLnBhdGgsXG4gICAgICAgICAgaGFuZGxlcjogYXdhaXQgdGhpcy5jcmVhdGVBcGlIYW5kbGVyKGFwaSwgY29uZmlnKSxcbiAgICAgICAgICBjb21wcmVzczogdG9GYXN0aWZ5Q29tcHJlc3NPcHRpb24oYXBpLm9wdGlvbnMuY29tcHJlc3MsIGdsb2JhbENvbXByZXNzT3B0aW9ucyksXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyDtlITroZzrjZXshZjsl5DshJzripQgd2ViIOyGjOyKpChhcHBSb290L3dlYikg7Jyg66y07JmAIOustOq0gO2VmOqyjCxcbiAgICAgIC8vIGFwaS93ZWItZGlzdCDsobTsnqwg7Jes67aA66W8IHNldHVwU3RhdGljV2ViU2VydmVyIOuCtOu2gOyXkOyEnCDtjJDri6jtlanri4jri6QuXG4gICAgICBhd2FpdCB0aGlzLnNldHVwU3RhdGljV2ViU2VydmVyKHNlcnZlciwgY29uZmlnLCBnbG9iYWxDb21wcmVzc09wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBkZXYg66qo65OcIOqzte2GtTogY2F0Y2gtYWxs7JeQ7IScIOuniOyngOuniSDspIDruYQg7JmE66OMIEFQSSBzbmFwc2hvdOydhCDtg5Dsg4ntlZjsl6wg7JqU7LKt7J2EIOyymOumrO2VqeuLiOuLpC5cbiAgICogc2VydmVyLnJvdXRlKCnroZwg6rCc67OEIOuTseuhne2VmOuptCBoYW5kbGVy6rCAIOqzoOygleuQmOyWtCBITVLsnbQg64+Z7J6R7ZWY7KeAIOyViuycvOuvgOuhnCxcbiAgICogcmVmcmVzaCDshLHqs7Ug7IucIOq1kOyytOuQmOuKlCBzbmFwc2hvdOydhCDrp6Qg7JqU7LKtIOyhsO2ajO2VqeuLiOuLpC5cbiAgICpcbiAgICog7JqU7LKt7J20IC9hcGko7KCV7ZmV7Z6I64qUIHRoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXgp66GcIOyLnOyeke2VmOyngCDslYrripQg6rK97Jqw652866m0IG51bGzsnYQg67CY7ZmY7ZWY66mwIOuBneuDheuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlRGV2QXBpUmVxdWVzdChcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICk6IFByb21pc2U8KChyZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCwgcmVwbHk6IEZhc3RpZnlSZXBseSkgPT4gUHJvbWlzZTxBcGlNZXRob2RSZXN1bHQ+KSB8IG51bGw+IHtcbiAgICBjb25zdCBtYXRjaGVkQXBpID0gdGhpcy5maW5kTWF0Y2hlZEFwaShyZXF1ZXN0LCB0aGlzLnByZXBhcmVkQXBpcywgdGhpcy5wcmVwYXJlZE1vZGVscyk7XG5cbiAgICBpZiAoIW1hdGNoZWRBcGkpIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihTRChcImVycm9yLmFwaS5ub3RGb3VuZFwiKSk7XG4gICAgfVxuXG4gICAgLy8gd2Vic29ja2V0IHJvdXRl66W8IOydvOuwmCBIVFRQ66GcIOyngeygkSDtmLjstpztlZwg6rK97JqwIDQyNuydhCDrj4zroKTspJggdXBncmFkZSDsl4bsnbQg7KCR6re87ZWY64qUIOqyg+ydhCDssKjri6jtlahcbiAgICBpZiAobWF0Y2hlZEFwaS53ZWJzb2NrZXRPcHRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVXZWJTb2NrZXRVcGdyYWRlUmVxdWlyZWRIYW5kbGVyKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY3JlYXRlQXBpSGFuZGxlcihtYXRjaGVkQXBpLCBjb25maWcsIHRoaXMucHJlcGFyZWRNb2RlbHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kTWF0Y2hlZEFwaShcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICBhcGlzOiByZWFkb25seSBFeHRlbmRlZEFwaVtdLFxuICAgIG1vZGVsczogTG9hZGVkTW9kZWxzLFxuICApOiBFeHRlbmRlZEFwaSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgdXJsID0gdGhpcy5nZXRQYXRobmFtZUZyb21VcmwocmVxdWVzdC51cmwpO1xuICAgIGNvbnN0IG1ldGhvZCA9IHJlcXVlc3QubWV0aG9kO1xuXG4gICAgaWYgKCF1cmwuc3RhcnRzV2l0aCh0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4KSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gYXBpcy5maW5kKChhcGkpID0+IHtcbiAgICAgIGlmIChtb2RlbHNbYXBpLm1vZGVsTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBhcGlNZXRob2QgPSBhcGkub3B0aW9ucy5odHRwTWV0aG9kID8/IFwiR0VUXCI7XG4gICAgICBpZiAoYXBpTWV0aG9kICE9PSBtZXRob2QpIHJldHVybiBmYWxzZTtcblxuICAgICAgY29uc3QgZnVsbFBhdGggPSB0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4ICsgYXBpLnBhdGg7XG4gICAgICByZXR1cm4gdGhpcy5pc1BhdGhQYXR0ZXJuTWF0Y2goZnVsbFBhdGgsIHVybCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogZGV2IGFwaSDrqqjrk5w6IFZpdGUg7JeG7J20IEFQSSDrj5nsoIEg65287Jqw7YyF66eMIOygnOqzte2VqeuLiOuLpC5cbiAgICogSE1S7J2EIOychO2VtCBjYXRjaC1hbGzsl5DshJwg66ekIOyalOyyreuniOuLpCDspIDruYQg7JmE66OMIEFQSSBzbmFwc2hvdOydhCDsobDtmoztlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIHNldHVwRGV2U2VydmVyKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICApOiB2b2lkIHtcbiAgICAvLyB1cGdyYWRl64qUIOyLpOyniOyggeycvOuhnCBHRVTsl5DshJzrp4wg7ISx66a97ZWY66+A66GcIEdFVCArIHdzSGFuZGxlciDsmYAg6re4IOyZuCBtZXRob2Trpbwg67OE64+EIHJvdXRl66GcIOu2hOumrO2VqFxuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICB1cmw6IGAke3RoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9LypgLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBhd2FpdCB0aGlzLmhhbmRsZURldkFwaVJlcXVlc3QocmVxdWVzdCwgY29uZmlnKTtcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm4gaGFuZGxlcihyZXF1ZXN0LCByZXBseSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8g65Ox66Gd65CcIEFQSeyZgCDsnbzsuZjtlZjsp4Ag7JWK64qUIOyalOyyreyXkCDrjIDtlZwgZmFsbGJhY2vsnoXri4jri6QuXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihTRChcImVycm9yLmFwaS5ub3RGb3VuZFwiKSk7XG4gICAgICB9LFxuICAgICAgd3NIYW5kbGVyOiBhc3luYyAoY29ubmVjdGlvbiwgcmVxdWVzdCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZURldldlYlNvY2tldFJlcXVlc3QoY29ubmVjdGlvbi5zb2NrZXQsIHJlcXVlc3QsIGNvbmZpZyk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgc2VydmVyLnJvdXRlKHtcbiAgICAgIG1ldGhvZDogW1wiSEVBRFwiLCBcIlBPU1RcIiwgXCJQVVRcIiwgXCJERUxFVEVcIiwgXCJQQVRDSFwiXSxcbiAgICAgIHVybDogYCR7dGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeH0vKmAsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IGF3YWl0IHRoaXMuaGFuZGxlRGV2QXBpUmVxdWVzdChyZXF1ZXN0LCBjb25maWcpO1xuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgIHJldHVybiBoYW5kbGVyKHJlcXVlc3QsIHJlcGx5KTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oU0QoXCJlcnJvci5hcGkubm90Rm91bmRcIikpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdml0ZVNlcnZlcjogYW55ID0gbnVsbDtcblxuICAvKipcbiAgICogZGV2IGFsbCDrqqjrk5w6IFZpdGUgRGV2IFNlcnZlcuulvCDthrXtlantlZjsl6wgQVBJICsgU1NSICsgQ1NS7J2EIOuqqOuRkCDsoJzqs7Xtlanri4jri6QuXG4gICAqIEFQSSDrj5nsoIEg66ek7Lmt7J2AIGhhbmRsZURldkFwaVJlcXVlc3Trpbwg6rO17Jyg7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZXR1cERldlNlcnZlcldpdGhWaXRlKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICAgd2ViUGF0aDogc3RyaW5nLFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQGZhc3RpZnkvbWlkZGllIOuTseuhnSAoQ29ubmVjdC1zdHlsZSBtaWRkbGV3YXJlIOyngOybkClcbiAgICBhd2FpdCBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChcIkBmYXN0aWZ5L21pZGRpZVwiKSkuZGVmYXVsdCk7XG5cbiAgICBjb25zdCB2aXRlID0gYXdhaXQgaW1wb3J0KFwidml0ZVwiKTtcbiAgICAvLyBAZmFzdGlmeS93ZWJzb2NrZXQg7ZSM65+s6re47J247J20IO2ZnOyEse2ZlOuQmOuptCBITVIgd2Vic29ja2V06rO8IHNlcnZlciBzb2NrZXTsnbQg7Lap64+M7ZWY66+A66GcIGRlZGljYXRlZCDtj6ztirjroZwg67aE66as7ZWoXG4gICAgY29uc3QgcmVxdWlyZXNEZWRpY2F0ZWRIbXJTZXJ2ZXIgPSBCb29sZWFuKHRoaXMuY29uZmlnLnNlcnZlci5wbHVnaW5zPy53cyk7XG4gICAgY29uc3QgaG1yID0gcmVzb2x2ZUludGVncmF0ZWRWaXRlSG1yT3B0aW9ucyh7XG4gICAgICBodHRwU2VydmVyOiBzZXJ2ZXIuc2VydmVyLFxuICAgICAgcmVxdWlyZXNEZWRpY2F0ZWRXZWJTb2NrZXRTZXJ2ZXI6IHJlcXVpcmVzRGVkaWNhdGVkSG1yU2VydmVyLFxuICAgIH0pO1xuXG4gICAgdGhpcy52aXRlU2VydmVyID0gYXdhaXQgdml0ZS5jcmVhdGVTZXJ2ZXIoe1xuICAgICAgcm9vdDogd2ViUGF0aCxcbiAgICAgIHNlcnZlcjoge1xuICAgICAgICBtaWRkbGV3YXJlTW9kZTogdHJ1ZSxcbiAgICAgICAgaG1yLFxuICAgICAgfSxcbiAgICAgIGFwcFR5cGU6IFwiY3VzdG9tXCIsXG4gICAgfSk7XG5cbiAgICAvLyBWaXRlIG1pZGRsZXdhcmUg65Ox66GdIChWaXRlIOyXkOyFiyDsspjrpqwpXG4gICAgc2VydmVyLnVzZSgocmVxLCByZXMsIG5leHQpID0+IHtcbiAgICAgIC8vIEFQSeyZgCBTb25hbXUgVUnripQgRmFzdGlmeSDrnbzsmrDtirjqsIAg7LKY66as7ZWY64+E66GdIHNraXBcbiAgICAgIGlmIChyZXEudXJsPy5zdGFydHNXaXRoKHRoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXgpIHx8IHJlcS51cmw/LnN0YXJ0c1dpdGgoXCIvc29uYW11LXVpXCIpKSB7XG4gICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgICB9XG4gICAgICAvLyDrgpjrqLjsp4DripQgVml0ZSBtaWRkbGV3YXJl66GcIOyghOuLrFxuICAgICAgcmV0dXJuIHRoaXMudml0ZVNlcnZlci5taWRkbGV3YXJlcyhyZXEsIHJlcywgbmV4dCk7XG4gICAgfSk7XG5cbiAgICAvLyBXUyB1cGdyYWRlIOqyveuhnChHRVQp7JmAIOydvOuwmCBIVFRQIOuplOyEnOuTnOulvCDrs4Trj4Qgcm91dGXroZwg67aE66as7ZW0IHdlYnNvY2tldCByb3V0ZeqwgCBIVE1MIGZhbGxiYWNr7JeQIOuoue2eiOyngCDslYrrj4TroZ0g7ZWoXG4gICAgc2VydmVyLnJvdXRlKHtcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIHVybDogYCR7dGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeH0vKmAsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5oYW5kbGVEZXZBcGlSZXF1ZXN0KHJlcXVlc3QsIGNvbmZpZyk7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0KHJlcXVlc3QsIHJlcGx5KTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oU0QoXCJlcnJvci5hcGkubm90Rm91bmRcIikpO1xuICAgICAgfSxcbiAgICAgIHdzSGFuZGxlcjogYXN5bmMgKGNvbm5lY3Rpb24sIHJlcXVlc3QpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVEZXZXZWJTb2NrZXRSZXF1ZXN0KGNvbm5lY3Rpb24uc29ja2V0LCByZXF1ZXN0LCBjb25maWcpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFtcIkhFQURcIiwgXCJQT1NUXCIsIFwiUFVUXCIsIFwiREVMRVRFXCIsIFwiUEFUQ0hcIl0sXG4gICAgICB1cmw6IGAke3RoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9LypgLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuaGFuZGxlRGV2QXBpUmVxdWVzdChyZXF1ZXN0LCBjb25maWcpO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdChyZXF1ZXN0LCByZXBseSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFNEKFwiZXJyb3IuYXBpLm5vdEZvdW5kXCIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBjYXRjaC1hbGwg65287Jqw7Yq47JeQ7IScIFNTUi9DU1Ig7LKY66asXG4gICAgLy8g6rCc67CcIO2ZmOqyveyXkOyEnOuKlCDrnbzsmrDtirjrs4QgY29tcHJlc3Mg7Ji17IWY7J2EIO2PrOq4sO2VmOqzoCBITVIg7J207KCQ7J2EIOy3qO2VqeuLiOuLpC5cbiAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgbWV0aG9kOiBbXCJHRVRcIiwgXCJIRUFEXCJdLFxuICAgICAgdXJsOiBcIi8qXCIsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgdXJsID0gcmVxdWVzdC51cmw7XG5cbiAgICAgICAgLy8gMS4gU1NSIOudvOyasO2KuCDsspjrpqxcbiAgICAgICAgY29uc3QgeyBtYXRjaFNTUlJvdXRlLCByZW5kZXJTU1IgfSA9IGF3YWl0IGltcG9ydChcIi4uL3NzclwiKTtcbiAgICAgICAgY29uc3Qgc3NyTWF0Y2ggPSBtYXRjaFNTUlJvdXRlKHVybCk7XG4gICAgICAgIGlmIChzc3JNYXRjaCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBbU1NSXSBNYXRjaGVkIHJvdXRlOiAke3Nzck1hdGNoLnJvdXRlLnBhdGh9YCk7XG4gICAgICAgICAgY29uc3QgaHRtbCA9IGF3YWl0IHJlbmRlclNTUihcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgIHNzck1hdGNoLnJvdXRlLFxuICAgICAgICAgICAgc3NyTWF0Y2gucGFyYW1zLFxuICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgIHJlcGx5LFxuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgdGhpcy52aXRlU2VydmVyLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmVwbHkudHlwZShcInRleHQvaHRtbFwiKTtcbiAgICAgICAgICByZXR1cm4gaHRtbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDIuIENTUiBmYWxsYmFja1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxldCB0ZW1wbGF0ZSA9IGF3YWl0IGZzLnJlYWRGaWxlKFxuICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMudml0ZVNlcnZlci5jb25maWcucm9vdCwgXCJpbmRleC5odG1sXCIpLFxuICAgICAgICAgICAgXCJ1dGYtOFwiLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGVtcGxhdGUgPSBhd2FpdCB0aGlzLnZpdGVTZXJ2ZXIudHJhbnNmb3JtSW5kZXhIdG1sKHVybCwgdGVtcGxhdGUpO1xuXG4gICAgICAgICAgLy8gP2htcj1mYWxzZeuhnCDsl7Ag7Y6Y7J207KeA64qUIEhNUiDsm7nshozsvJPrp4wg64GK7Ja0IOyDiOuhnOqzoOy5qOuQmOyngCDslYrqsowg7ZWc64ukLlxuICAgICAgICAgIGNvbnN0IHsgSE1SX09QVF9PVVRfU0NSSVBULCBpc0htckRpc2FibGVkQnlRdWVyeSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3NyL2htci1vcHQtb3V0XCIpO1xuICAgICAgICAgIGlmIChpc0htckRpc2FibGVkQnlRdWVyeSh1cmwpKSB7XG4gICAgICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLnJlcGxhY2UoXCI8aGVhZD5cIiwgYDxoZWFkPlxcbiR7SE1SX09QVF9PVVRfU0NSSVBUfWApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlcGx5LnR5cGUoXCJ0ZXh0L2h0bWxcIik7XG4gICAgICAgICAgcmV0dXJuIHRlbXBsYXRlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdGhpcy52aXRlU2VydmVyLnNzckZpeFN0YWNrdHJhY2UoXG4gICAgICAgICAgICAvKiBTQUZFVFk6IEFQSSDrjbDsvZTroIjsnbTthLDsmYAgWm9kIOqygOymneq4sCDrk7HroZ0g6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gZSBhcyBFcnJvcixcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgcmVwbHkuc3RhdHVzKDUwMCk7XG4gICAgICAgICAgcmV0dXJuIC8qIFNBRkVUWTogQVBJIOuNsOy9lOugiOydtO2EsOyZgCBab2Qg6rKA7Kad6riwIOuTseuhnSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgICBlIGFzIEVycm9yXG4gICAgICAgICAgKS5tZXNzYWdlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8g7ISc67KEIOyiheujjCDsi5wgVml0ZeuPhCDsooXro4xcbiAgICBzZXJ2ZXIuYWRkSG9vayhcIm9uQ2xvc2VcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy52aXRlU2VydmVyLmNsb3NlKCk7XG4gICAgfSk7XG5cbiAgICBpZiAoXCJwb3J0XCIgaW4gaG1yKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsuZGltKFxuICAgICAgICAgIGDinJMgVml0ZSBITVIgdXNpbmcgZGVkaWNhdGVkIHdlYnNvY2tldCBwb3J0ICR7aG1yLnBvcnR9IHRvIGF2b2lkIEZhc3RpZnkgd2Vic29ja2V0IGNvbmZsaWN0c2AsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oXCLinJMgVml0ZSBkZXYgc2VydmVyIGludGVncmF0ZWRcIikpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXR1cFN0YXRpY1dlYlNlcnZlcihcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICBnbG9iYWxDb21wcmVzc09wdGlvbnM6IENvbXByZXNzT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g6rK966GcIOuqhe2Zle2ZlDogYXBpL3dlYi1kaXN0L2NsaWVudCAo7KCV7KCBIO2MjOydvCksIGFwaS93ZWItZGlzdC9zZXJ2ZXIgKFNTUiBlbnRyeSksIGFwaS9kaXN0L3NzciAoU1NSIHJvdXRlcyAtIEFQSSDshozsnKApXG4gICAgY29uc3Qgd2ViRGlzdFBhdGggPSBwYXRoLmpvaW4odGhpcy5hcGlSb290UGF0aCwgXCJ3ZWItZGlzdFwiLCBcImNsaWVudFwiKTtcbiAgICBjb25zdCBzc3JQYXRoID0gcGF0aC5qb2luKHRoaXMuYXBpUm9vdFBhdGgsIFwid2ViLWRpc3RcIiwgXCJzZXJ2ZXJcIik7XG4gICAgY29uc3Qgc3NyRW50cnlQYXRoID0gcGF0aC5qb2luKHNzclBhdGgsIFwiZW50cnktc2VydmVyLmdlbmVyYXRlZC5qc1wiKTtcbiAgICBjb25zdCBzc3JSb3V0ZXNQYXRoID0gcGF0aC5qb2luKHRoaXMuYXBpUm9vdFBhdGgsIFwiZGlzdFwiLCBcInNzclwiLCBcInJvdXRlcy5qc1wiKTtcblxuICAgIGlmICghKGF3YWl0IGV4aXN0cyh3ZWJEaXN0UGF0aCkpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYOKaoCBXZWIgZGlzdCBub3QgZm91bmQ6ICR7d2ViRGlzdFBhdGh9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU1NSIGVudHJ5IOyhtOyerCDsl6zrtoAg7ZmV7J24XG4gICAgY29uc3Qgc3NyQXZhaWxhYmxlID0gYXdhaXQgZXhpc3RzKHNzckVudHJ5UGF0aCk7XG5cbiAgICBpZiAoIXNzckF2YWlsYWJsZSkge1xuICAgICAgY29uc29sZS53YXJuKGDimqAgU1NSIGVudHJ5IG5vdCBmb3VuZDogJHtzc3JFbnRyeVBhdGh9YCk7XG4gICAgICBjb25zb2xlLndhcm4oXCIgIFNTUiB3aWxsIGJlIGRpc2FibGVkLiBPbmx5IENTUiB3aWxsIHdvcmsuXCIpO1xuICAgIH1cblxuICAgIC8vIFNTUiDrnbzsmrDtirgg66Gc65OcIChwcm9kdWN0aW9u7JeQ7ISc66eMLCDsgqzsmqnsnpAg7ZSE66Gc7KCd7Yq47J2YIHNzci9yb3V0ZXMudHMpXG4gICAgaWYgKHNzckF2YWlsYWJsZSkge1xuICAgICAgaWYgKGF3YWl0IGV4aXN0cyhzc3JSb3V0ZXNQYXRoKSkge1xuICAgICAgICAvLyB0cy1sb2FkZXLrnbzrqbQgXCJmaWxlOi8vXCLroZwg7Iuc7J6R7ZWY64qUIGZ1bGx5LXJlc29sdmVkIHBhdGjrp4wg67Cb6riw7JeQIOydtOulvCDsspjrpqztlbTso7zripQgaW1wb3J0TWVtYmVyc+ulvCDsgqzsmqntlbTslbwg7ZaI6rKg7KeA66eMLFxuICAgICAgICAvLyDsl6zquLDripQg7ZSE66Gc642V7IWYIO2ZmOqyveyXkOyEnCBsb2FkZXIg7JeG7J20IOuPjOyVhOqwgOq4sCDrlYzrrLjsl5AgXCLsp4Tsp5wganMg7YyM7J28XCLsnZggXCLqt7jrg6VcIiDsoIjrjIDqsr3roZzrpbwg67CU66GcIGltcG9ydO2VtOuPhCDrkKnri4jri6QuXG4gICAgICAgIC8vIOydtCDrgrTsmqnsnYAg7J20IO2VqOyImCDrgrTsl5DshJwg7JWE656Y7JeQIOuCmOyYrCDri6TrpbggaW1wb3J0IO2YuOy2nOyXkOuPhCDrj5nsnbztlZjqsowg7KCB7Jqp65Cp64uI64ukLlxuICAgICAgICBhd2FpdCBpbXBvcnQoc3NyUm91dGVzUGF0aCk7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi4pyTIFNTUiByb3V0ZXMgbG9hZGVkXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGDimqAgU1NSIHJvdXRlcyBub3QgZm91bmQ6ICR7c3NyUm91dGVzUGF0aH1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDroaTrp4Eg7JeF642w7J207Yq4IOuMgOydkTogYXNzZXQgaGFzaCDrtojsnbzsuZgg7IucIO2YhOyerCDrsoTsoIQg7KeB7KCRIOyEnOu5mVxuICAgIHNlcnZlci5nZXQoXCIvYXNzZXRzLzpmaWxlbmFtZVwiLCBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3RlZEZpbGUgPVxuICAgICAgICAvKiBTQUZFVFk6IEFQSSDrjbDsvZTroIjsnbTthLDsmYAgWm9kIOqygOymneq4sCDrk7HroZ0g6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHJlcXVlc3QucGFyYW1zIGFzIHsgZmlsZW5hbWU6IHN0cmluZyB9XG4gICAgICAgICkuZmlsZW5hbWU7XG4gICAgICBjb25zdCBhc3NldHNEaXIgPSBwYXRoLmpvaW4od2ViRGlzdFBhdGgsIFwiYXNzZXRzXCIpO1xuICAgICAgY29uc3Qgc2FmZUZpbGVQYXRoID0gdGhpcy5yZXNvbHZlUGF0aFdpdGhpbkJhc2VEaXIoYXNzZXRzRGlyLCByZXF1ZXN0ZWRGaWxlKTtcbiAgICAgIGlmIChzYWZlRmlsZVBhdGggPT09IG51bGwpIHtcbiAgICAgICAgcmVwbHkuc3RhdHVzKDQwMykuc2VuZCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBub3JtYWxpemVkUmVxdWVzdGVkRmlsZSA9IHBhdGgucmVsYXRpdmUoYXNzZXRzRGlyLCBzYWZlRmlsZVBhdGgpLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpO1xuXG4gICAgICBjb25zdCBhc3NldFBhdGggPSBgL2Fzc2V0cy8ke25vcm1hbGl6ZWRSZXF1ZXN0ZWRGaWxlfWA7XG5cbiAgICAgIC8vIENhY2hlLUNvbnRyb2wg7Zek642UIOqysOyglVxuICAgICAgY29uc3QgZ2V0Q2FjaGVDb250cm9sRm9yQXNzZXQgPSAoKTogQ2FjaGVDb250cm9sQ29uZmlnID0+IHtcbiAgICAgICAgY29uc3QgY2FjaGVSZXE6IENhY2hlQ29udHJvbFJlcXVlc3QgPSB7XG4gICAgICAgICAgdHlwZTogXCJhc3NldHNcIixcbiAgICAgICAgICB1cmw6IHJlcXVlc3QudXJsLFxuICAgICAgICAgIHBhdGg6IGFzc2V0UGF0aCxcbiAgICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIOyCrOyaqeyekCDsoJXsnZgg7ZW465Ok65+sIOyasOyEoFxuICAgICAgICBpZiAoY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcihjYWNoZVJlcSk7XG4gICAgICAgICAgaWYgKHJlc3VsdCkgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOq4sOuzuOqwkjogaW1tdXRhYmxlXG4gICAgICAgIHJldHVybiBDYWNoZVByZXNldHMuaW1tdXRhYmxlO1xuICAgICAgfTtcblxuICAgICAgLy8gaW5kZXgtKi5qcyDrmJDripQgaW5kZXgtKi5jc3Mg7JqU7LKt7J24IOqyveyasFxuICAgICAgaWYgKC9eaW5kZXgtW2EtZjAtOV0rXFwuKGpzfGNzcykkLy50ZXN0KG5vcm1hbGl6ZWRSZXF1ZXN0ZWRGaWxlKSkge1xuICAgICAgICBjb25zdCBleHQgPSBub3JtYWxpemVkUmVxdWVzdGVkRmlsZS5zcGxpdChcIi5cIikucG9wKCk7XG4gICAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcihhc3NldHNEaXIpO1xuICAgICAgICBjb25zdCBjdXJyZW50RmlsZSA9IGZpbGVzLmZpbmQoKGYpID0+IGYuc3RhcnRzV2l0aChcImluZGV4LVwiKSAmJiBmLmVuZHNXaXRoKGAuJHtleHR9YCkpO1xuXG4gICAgICAgIGlmIChjdXJyZW50RmlsZSkge1xuICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGFzc2V0c0RpciwgY3VycmVudEZpbGUpO1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCk7XG4gICAgICAgICAgcmVwbHkudHlwZShleHQgPT09IFwianNcIiA/IFwiYXBwbGljYXRpb24vamF2YXNjcmlwdFwiIDogXCJ0ZXh0L2Nzc1wiKTtcbiAgICAgICAgICBhcHBseUNhY2hlSGVhZGVycyhyZXBseSwgZ2V0Q2FjaGVDb250cm9sRm9yQXNzZXQoKSk7XG4gICAgICAgICAgcmV0dXJuIHJlcGx5LnNlbmQoY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g7J2867CYIO2MjOydvCDshJzruZlcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gc2FmZUZpbGVQYXRoO1xuICAgICAgaWYgKGF3YWl0IGV4aXN0cyhmaWxlUGF0aCkpIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoKTtcbiAgICAgICAgY29uc3QgZXh0ID0gbm9ybWFsaXplZFJlcXVlc3RlZEZpbGUuc3BsaXQoXCIuXCIpLnBvcCgpO1xuICAgICAgICByZXBseS50eXBlKGV4dCA9PT0gXCJqc1wiID8gXCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0XCIgOiBleHQgPT09IFwiY3NzXCIgPyBcInRleHQvY3NzXCIgOiBcIlwiKTtcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRSZXF1ZXN0ZWRGaWxlLmluY2x1ZGVzKFwiLVwiKSkge1xuICAgICAgICAgIGFwcGx5Q2FjaGVIZWFkZXJzKHJlcGx5LCBnZXRDYWNoZUNvbnRyb2xGb3JBc3NldCgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVwbHkuc2VuZChjb250ZW50KTtcbiAgICAgIH1cblxuICAgICAgcmVwbHkuc3RhdHVzKDQwNCkuc2VuZCgpO1xuICAgIH0pO1xuXG4gICAgLy8gU1NSIOudvOyasO2KuCDqsJzrs4Qg65Ox66GdIChjb21wcmVzcyDsmLXshZjsnbQg65287Jqw7Yq467OE66GcIOyggeyaqeuQmOuPhOuhnSlcbiAgICBpZiAoc3NyQXZhaWxhYmxlKSB7XG4gICAgICBjb25zdCB7IGdldFNTUlJvdXRlcyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3NyXCIpO1xuICAgICAgY29uc3QgeyByZW5kZXJTU1IgfSA9IGF3YWl0IGltcG9ydChcIi4uL3Nzci9yZW5kZXJlclwiKTtcbiAgICAgIGNvbnN0IHNzclJvdXRlcyA9IGdldFNTUlJvdXRlcygpO1xuXG4gICAgICBmb3IgKGNvbnN0IHJvdXRlIG9mIHNzclJvdXRlcykge1xuICAgICAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgICAgIG1ldGhvZDogW1wiR0VUXCIsIFwiSEVBRFwiXSxcbiAgICAgICAgICB1cmw6IHJvdXRlLnBhdGgsXG4gICAgICAgICAgY29tcHJlc3M6IHRvRmFzdGlmeUNvbXByZXNzT3B0aW9uKHJvdXRlLmNvbXByZXNzID8/IHRydWUsIGdsb2JhbENvbXByZXNzT3B0aW9ucyksXG4gICAgICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSByZXF1ZXN0LnVybDtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBbU1NSXSBNYXRjaGVkIHJvdXRlOiAke3JvdXRlLnBhdGh9YCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuZXh0cmFjdFBhdGhQYXJhbXMocm91dGUucGF0aCwgdXJsKTtcbiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSBhd2FpdCByZW5kZXJTU1IodXJsLCByb3V0ZSwgcGFyYW1zLCByZXF1ZXN0LCByZXBseSwgY29uZmlnKTtcblxuICAgICAgICAgICAgcmVwbHkudHlwZShcInRleHQvaHRtbFwiKTtcbiAgICAgICAgICAgIHJldHVybiBodG1sO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENTUiBvciBTdGF0aWMgRmlsZSBGYWxsYmFjayAoU1NSIOudvOyasO2KuOyXkCDrp6Tsua3rkJjsp4Ag7JWK64qUIOuqqOuToCDsmpTssq0pXG4gICAgc2VydmVyLnJvdXRlKHtcbiAgICAgIG1ldGhvZDogW1wiR0VUXCIsIFwiSEVBRFwiXSxcbiAgICAgIHVybDogXCIqXCIsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgLy8gL2FwaSwgL3NvbmFtdS11aeuKlCA0MDQg6re464yA66GcXG4gICAgICAgIGlmIChyZXF1ZXN0LnVybC5zdGFydHNXaXRoKFwiL2FwaVwiKSB8fCByZXF1ZXN0LnVybC5zdGFydHNXaXRoKFwiL3NvbmFtdS11aVwiKSkge1xuICAgICAgICAgIHJlcGx5LnN0YXR1cyg0MDQpLnNlbmQoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDU1LsmqkgQ2FjaGUtQ29udHJvbCDtl6TrjZQg7ISk7KCVXG4gICAgICAgIGlmIChjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcikge1xuICAgICAgICAgIGNvbnN0IGNzckNhY2hlUmVxOiBDYWNoZUNvbnRyb2xSZXF1ZXN0ID0ge1xuICAgICAgICAgICAgdHlwZTogXCJjc3JcIixcbiAgICAgICAgICAgIHVybDogcmVxdWVzdC51cmwsXG4gICAgICAgICAgICBwYXRoOiByZXF1ZXN0LnVybC5zcGxpdChcIj9cIilbMF0sXG4gICAgICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgY3NyQ2FjaGVDb25maWcgPSBjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcihjc3JDYWNoZVJlcSk7XG5cbiAgICAgICAgICBpZiAoY3NyQ2FjaGVDb25maWcpIHtcbiAgICAgICAgICAgIGFwcGx5Q2FjaGVIZWFkZXJzKHJlcGx5LCBjc3JDYWNoZUNvbmZpZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8g7KCV7KCBIO2MjOydvOydtCDsobTsnqztlaAg6rK97JqwLCDsoJXsoIEg7YyM7J287J2EIOuovOyggCDshJzruZntlbTslbztlahcbiAgICAgICAgY29uc3QgcmVxdWVzdFBhdGggPSB0aGlzLmdldFBhdGhuYW1lRnJvbVVybChyZXF1ZXN0LnVybCk7XG4gICAgICAgIGNvbnN0IHNhZmVGaWxlUGF0aCA9IHRoaXMucmVzb2x2ZVBhdGhXaXRoaW5CYXNlRGlyKHdlYkRpc3RQYXRoLCByZXF1ZXN0UGF0aCk7XG4gICAgICAgIGlmIChzYWZlRmlsZVBhdGggPT09IG51bGwpIHtcbiAgICAgICAgICByZXBseS5zdGF0dXMoNDAzKS5zZW5kKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhd2FpdCBmaWxlRXhpc3RzKHNhZmVGaWxlUGF0aCkpIHtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoc2FmZUZpbGVQYXRoKTtcbiAgICAgICAgICByZXR1cm4gcmVwbHkudHlwZShtaW1lTG9va3VwKHNhZmVGaWxlUGF0aCkgfHwgXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIikuc2VuZChjb250ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENTUiBmYWxsYmFjazogaW5kZXguaHRtbCDshJzruZlcbiAgICAgICAgY29uc3QgaW5kZXhQYXRoID0gcGF0aC5qb2luKHdlYkRpc3RQYXRoLCBcImluZGV4Lmh0bWxcIik7XG4gICAgICAgIHJldHVybiByZXBseS50eXBlKFwidGV4dC9odG1sXCIpLnNlbmQoYXdhaXQgZnMucmVhZEZpbGUoaW5kZXhQYXRoLCBcInV0Zi04XCIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZyhg4pyTIFN0YXRpYyB3ZWIgc2VydmVyIGNvbmZpZ3VyZWQgd2l0aCAke3NzckF2YWlsYWJsZSA/IFwiU1NSXCIgOiBcIkNTUiBvbmx5XCJ9IHN1cHBvcnRgKTtcbiAgfVxuXG4gIGNyZWF0ZUFwaUhhbmRsZXIoXG4gICAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICAgbW9kZWxzOiBMb2FkZWRNb2RlbHMgPSB0aGlzLnN5bmNlci5tb2RlbHMsXG4gICAgZGVwZW5kZW5jaWVzOiBTb25hbXVIdHRwVmFsaWRhdG9yRGVwZW5kZW5jaWVzID0gZGVmYXVsdFNvbmFtdUh0dHBWYWxpZGF0b3JEZXBlbmRlbmNpZXMsXG4gICk6IChyZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCwgcmVwbHk6IEZhc3RpZnlSZXBseSkgPT4gUHJvbWlzZTxBcGlNZXRob2RSZXN1bHQ+IHtcbiAgICBjb25zdCBwcmVwYXJlZFZhbGlkYXRvciA9IHRoaXMuZ2V0T3JDcmVhdGVIdHRwVmFsaWRhdG9yKGFwaSwgZGVwZW5kZW5jaWVzKTtcblxuICAgIHJldHVybiBhc3luYyAocmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpOiBQcm9taXNlPEFwaU1ldGhvZFJlc3VsdD4gPT4ge1xuICAgICAgY29uc3QgdmFsaWRhdG9yID1cbiAgICAgICAgcHJlcGFyZWRWYWxpZGF0b3IgaW5zdGFuY2VvZiBQcm9taXNlID8gYXdhaXQgcHJlcGFyZWRWYWxpZGF0b3IgOiBwcmVwYXJlZFZhbGlkYXRvcjtcbiAgICAgIC8vIENvbnRleHQg7IOd7ISxXG4gICAgICBjb25zdCBjb250ZXh0OiBDb250ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVDb250ZXh0KGNvbmZpZywgcmVxdWVzdCwgcmVwbHkpO1xuXG4gICAgICByZXR1cm4gdGhpcy5hc3luY0xvY2FsU3RvcmFnZS5ydW4oeyBjb250ZXh0IH0sIGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gZ3VhcmRzIOyymOumrFxuICAgICAgICBydW5HdWFyZHMoe1xuICAgICAgICAgIGd1YXJkczogYXBpLm9wdGlvbnMuZ3VhcmRzLFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIGFwaSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gcmVxdWVzdCDtjIzsi7FcbiAgICAgICAgY29uc3Qgd2hpY2ggPSBhcGkub3B0aW9ucy5odHRwTWV0aG9kID09PSBcIkdFVFwiID8gXCJxdWVyeVwiIDogXCJib2R5XCI7XG4gICAgICAgIGxldCByZXFCb2R5ID0gbmV3IE1hcDxzdHJpbmcsIEFwaUFyZ3VtZW50PigpO1xuICAgICAgICAvLyDtjIzsnbwg7JeF66Gc65OcIOyeiOuKlCDqsr3smrAg7J6E7IucIOuNsOydtO2EsFxuICAgICAgICBjb25zdCBmaWxlczogVXBsb2FkZWRSZXF1ZXN0RmlsZXMgPSB7XG4gICAgICAgICAgYnVmZmVyZWRGaWxlczogW10sXG4gICAgICAgICAgdXBsb2FkZWRGaWxlczogW10sXG4gICAgICAgIH07XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBib2R5ID0gcmVxdWVzdFt3aGljaF0gPz8ge307XG4gICAgICAgICAgaWYgKGFwaS51cGxvYWRPcHRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IHJlcXVlc3QucGFydHMoe1xuICAgICAgICAgICAgICBsaW1pdHM6IGFwaS51cGxvYWRPcHRpb25zLmxpbWl0cyxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBGb3JtRGF0YeydmCBmaWVsZOuTpOydhCDsnoTsi5zroZwg7KCA7J6lXG4gICAgICAgICAgICBjb25zdCBmaWVsZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgICAgICAgICAgaWYgKGFwaS51cGxvYWRPcHRpb25zLmNvbnN1bWUgPT09IFwiYnVmZmVyXCIgfHwgIWFwaS51cGxvYWRPcHRpb25zLmNvbnN1bWUpIHtcbiAgICAgICAgICAgICAgLy8gQnVmZmVyIOuqqOuTnDog66mU66qo66as7JeQIOuhnOuTnFxuICAgICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFydC50eXBlID09PSBcImZpbGVcIikge1xuICAgICAgICAgICAgICAgICAgLy8gQ1JJVElDQUw6IO2MjOydvCDsiqTtirjrprzsnYQg7KaJ7IucIGNvbnN1bWXtlbTslbwg64uk7J2MIHBhcnTroZwg64SY7Ja06rCIIOyImCDsnojsnYxcbiAgICAgICAgICAgICAgICAgIC8vIOydtCDtmLjstpzsnbQg7JeG7Jy866m0IOyiheyihSBtdWx0aXBhcnQg7YyM7Iux7J20IHBlbmRpbmcg7IOB7YOc66GcIO2DgOyehOyVhOybgyDrsJzsg51cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IHBhcnQudG9CdWZmZXIoKTtcbiAgICAgICAgICAgICAgICAgIGZpbGVzLmJ1ZmZlcmVkRmlsZXMucHVzaChuZXcgQnVmZmVyZWRGaWxlKHBhcnQsIGJ1ZmZlcikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC50eXBlID09PSBcImZpZWxkXCIpIHtcbiAgICAgICAgICAgICAgICAgIGZpZWxkc1twYXJ0LmZpZWxkbmFtZV0gPSBTdHJpbmcocGFydC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFwaS51cGxvYWRPcHRpb25zLmNvbnN1bWUgPT09IFwic3RyZWFtXCIpIHtcbiAgICAgICAgICAgICAgLy8gU3RyZWFtIOuqqOuTnDog7KaJ7IucIOyggOyepeyGjOuhnCDsiqTtirjrpqzrsI1cbiAgICAgICAgICAgICAgY29uc3QgZGlza05hbWUgPSBhcGkudXBsb2FkT3B0aW9ucy5kZXN0aW5hdGlvbjtcbiAgICAgICAgICAgICAgY29uc3QgZGlzayA9IHRoaXMuc3RvcmFnZS51c2UoZGlza05hbWUpO1xuXG4gICAgICAgICAgICAgIC8vIOyasOyEoOyInOychDog642w7L2U66CI7J207YSwID4g7KCE7JetIOyEpOyglSA+IOq4sOuzuOqwklxuICAgICAgICAgICAgICBjb25zdCBrZXlHZW5lcmF0b3I6IEtleUdlbmVyYXRvciA9XG4gICAgICAgICAgICAgICAgYXBpLnVwbG9hZE9wdGlvbnMua2V5R2VuZXJhdG9yID8/XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc2VydmVyLnN0b3JhZ2U/LmtleUdlbmVyYXRvciA/P1xuICAgICAgICAgICAgICAgIGRlZmF1bHRLZXlHZW5lcmF0b3I7XG5cbiAgICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gXCJmaWxlXCIpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IGtleUdlbmVyYXRvcih7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBwYXJ0LmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgICBtaW1ldHlwZTogcGFydC5taW1ldHlwZSxcbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICBhd2FpdCBkaXNrLnB1dFN0cmVhbShrZXksIHBhcnQuZmlsZSwge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogcGFydC5taW1ldHlwZSxcbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSBhd2FpdCBkaXNrLmdldFVybChrZXkpO1xuICAgICAgICAgICAgICAgICAgY29uc3Qgc2lnbmVkVXJsID0gYXdhaXQgZGlzay5nZXRTaWduZWRVcmwoa2V5KTtcblxuICAgICAgICAgICAgICAgICAgZmlsZXMudXBsb2FkZWRGaWxlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBuZXcgVXBsb2FkZWRGaWxlKHtcbiAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogcGFydC5maWxlbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBtaW1ldHlwZTogcGFydC5taW1ldHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICBzaXplOiBwYXJ0LmZpbGUuYnl0ZXNSZWFkLFxuICAgICAgICAgICAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgICAgICAgICAgICBzaWduZWRVcmwsXG4gICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgIGRpc2tOYW1lLFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0LnR5cGUgPT09IFwiZmllbGRcIikge1xuICAgICAgICAgICAgICAgICAgZmllbGRzW3BhcnQuZmllbGRuYW1lXSA9IFN0cmluZyhwYXJ0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gcXProZwg7KSR7LKpIOq1rOyhsCDtjIzsi7E6IHBhcmFtc1tjYXRlZ29yeV0g4oaSIHsgcGFyYW1zOiB7IGNhdGVnb3J5OiBcInRlc3RcIiB9IH1cbiAgICAgICAgICAgIGNvbnN0IHFzID0gYXdhaXQgaW1wb3J0KFwicXNcIik7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBxcy5kZWZhdWx0LnBhcnNlKGZpZWxkcyk7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGJvZHksIHBhcnNlZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVxQm9keSA9IHRvQXBpQXJndW1lbnRNYXAodmFsaWRhdG9yLnBhcnNlKGJvZHkpKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnN0IHsgWm9kRXJyb3IgfSA9IGF3YWl0IGltcG9ydChcInpvZFwiKTtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFpvZEVycm9yKSB7XG4gICAgICAgICAgICBjb25zdCB7IGh1bWFuaXplWm9kRXJyb3IgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL3pvZC1lcnJvclwiKTtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gaHVtYW5pemVab2RFcnJvcihlKVxuICAgICAgICAgICAgICAubWFwKChpc3N1ZSkgPT4gaXNzdWUubWVzc2FnZSlcbiAgICAgICAgICAgICAgLmpvaW4oXCIgXCIpO1xuICAgICAgICAgICAgY29uc3QgeyBCYWRSZXF1ZXN0RXhjZXB0aW9uIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9leGNlcHRpb25zL3NvLWV4Y2VwdGlvbnNcIik7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcbiAgICAgICAgICAgICAgLyogU0FGRVRZOiBBUEkg642w7L2U66CI7J207YSw7JmAIFpvZCDqsoDspp3quLAg65Ox66GdIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIG1lc3NhZ2VzIGFzIExvY2FsaXplZFN0cmluZyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHpvZEVycm9yOiBlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb250ZW50LVR5cGVcbiAgICAgICAgcmVwbHkudHlwZShhcGkub3B0aW9ucy5jb250ZW50VHlwZSA/PyBcImFwcGxpY2F0aW9uL2pzb25cIik7XG5cbiAgICAgICAgLy8gQ2FjaGUtQ29udHJvbCDtl6TrjZQg7ISk7KCVXG4gICAgICAgIGNvbnN0IGFwaUNhY2hlQ29uZmlnID0gdGhpcy5nZXRBcGlDYWNoZUNvbnRyb2woYXBpLCByZXF1ZXN0LCBjb25maWcpO1xuICAgICAgICBpZiAoYXBpQ2FjaGVDb25maWcpIHtcbiAgICAgICAgICBhcHBseUNhY2hlSGVhZGVycyhyZXBseSwgYXBpQ2FjaGVDb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g7JeF66Gc65OcIOyYteyFmOydtCDsnojripQg6rK97JqwIO2MjOydvCDrjbDsnbTthLDrpbwgQ29udGV4dOyXkCDstpTqsIBcbiAgICAgICAgaWYgKGFwaS51cGxvYWRPcHRpb25zKSB7XG4gICAgICAgICAgY29uc3QgY29uc3VtZSA9IGFwaS51cGxvYWRPcHRpb25zLmNvbnN1bWUgPz8gXCJidWZmZXJcIjtcbiAgICAgICAgICBpZiAoY29uc3VtZSA9PT0gXCJidWZmZXJcIikge1xuICAgICAgICAgICAgY29udGV4dC5idWZmZXJlZEZpbGVzID0gZmlsZXMuYnVmZmVyZWRGaWxlcztcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbnN1bWUgPT09IFwic3RyZWFtXCIpIHtcbiAgICAgICAgICAgIGNvbnRleHQudXBsb2FkZWRGaWxlcyA9IGZpbGVzLnVwbG9hZGVkRmlsZXM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8g66qo6424IOuplOyGjOuTnCBhcmdzIOyDneyEse2VmOyXrCDtmLjstpxcbiAgICAgICAgY29uc3QgeyBBcGlQYXJhbVR5cGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL3R5cGVzL3R5cGVzXCIpO1xuICAgICAgICBjb25zdCBhcmdzID0gYXBpLnBhcmFtZXRlcnMubWFwKChwYXJhbSkgPT4ge1xuICAgICAgICAgIC8vIENvbnRleHQg7J247KCd7IWYXG4gICAgICAgICAgaWYgKEFwaVBhcmFtVHlwZS5pc0NvbnRleHQocGFyYW0udHlwZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcmVxQm9keS5nZXQocGFyYW0ubmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5pbnZva2VNb2RlbE1ldGhvZChhcGksIGFyZ3MsIHJlcGx5LCBtb2RlbHMpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3JDcmVhdGVIdHRwVmFsaWRhdG9yKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgZGVwZW5kZW5jaWVzOiBTb25hbXVIdHRwVmFsaWRhdG9yRGVwZW5kZW5jaWVzLFxuICApOiBIdHRwVmFsaWRhdG9yIHwgUHJvbWlzZTxIdHRwVmFsaWRhdG9yPiB7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5odHRwVmFsaWRhdG9ycy5nZXQoYXBpKTtcbiAgICBpZiAoY2FjaGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5wZW5kaW5nSHR0cFZhbGlkYXRvcnMuZ2V0KGFwaSk7XG4gICAgaWYgKGV4aXN0aW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gICAgY29uc3QgcGVuZGluZyA9IHRoaXMuYnVpbGRIdHRwVmFsaWRhdG9yKGFwaSwgZGVwZW5kZW5jaWVzKTtcbiAgICB0aGlzLnBlbmRpbmdIdHRwVmFsaWRhdG9ycy5zZXQoYXBpLCBwZW5kaW5nKTtcbiAgICB2b2lkIHBlbmRpbmcudGhlbihcbiAgICAgICh2YWxpZGF0b3IpID0+IHtcbiAgICAgICAgdGhpcy5odHRwVmFsaWRhdG9ycy5zZXQoYXBpLCB2YWxpZGF0b3IpO1xuICAgICAgICB0aGlzLnBlbmRpbmdIdHRwVmFsaWRhdG9ycy5kZWxldGUoYXBpKTtcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMucGVuZGluZ0h0dHBWYWxpZGF0b3JzLmRlbGV0ZShhcGkpO1xuICAgICAgfSxcbiAgICApO1xuICAgIHJldHVybiBwZW5kaW5nO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBidWlsZEh0dHBWYWxpZGF0b3IoXG4gICAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgICBkZXBlbmRlbmNpZXM6IFNvbmFtdUh0dHBWYWxpZGF0b3JEZXBlbmRlbmNpZXMsXG4gICk6IFByb21pc2U8SHR0cFZhbGlkYXRvcj4ge1xuICAgIGNvbnN0IHBvbGljeSA9IG5vcm1hbGl6ZVpvZENvbXBpbGVyUG9saWN5KHRoaXMuY29uZmlnLnZhbGlkYXRpb24/LnpvZENvbXBpbGVyKTtcbiAgICBjb25zdCBzb3VyY2VBb3QgPSBwcm9jZXNzLmVudi5IT1QgPT09IFwieWVzXCIgfHwgcHJvY2Vzcy5lbnYuVklURVNUID09PSBcInRydWVcIjtcbiAgICBpZiAocG9saWN5LmFwaSA9PT0gXCJhb3RcIiAmJiAhc291cmNlQW90KSB7XG4gICAgICBjb25zdCByZWdpc3RyeSA9IHRoaXMuYW90SHR0cFZhbGlkYXRvclJlZ2lzdHJ5ID8/IChhd2FpdCB0aGlzLmxvYWRBb3RIdHRwVmFsaWRhdG9yUmVnaXN0cnkoKSk7XG4gICAgICByZXR1cm4gdGhpcy5nZXRBb3RIdHRwVmFsaWRhdG9yKGFwaSwgcmVnaXN0cnkpO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBkZXBlbmRlbmNpZXMuY3JlYXRlVmFsaWRhdG9yKHtcbiAgICAgIGFwaSxcbiAgICAgIHBvbGljeSxcbiAgICAgIHR5cGVzOiB0aGlzLnN5bmNlci50eXBlcyxcbiAgICAgIGFsbG93QW90U291cmNlRmFsbGJhY2s6IHNvdXJjZUFvdCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QW90SHR0cFZhbGlkYXRvcihhcGk6IEV4dGVuZGVkQXBpLCByZWdpc3RyeTogSHR0cFZhbGlkYXRvclJlZ2lzdHJ5KTogSHR0cFZhbGlkYXRvciB7XG4gICAgY29uc3Qgcm91dGVLZXkgPSBnZXRIdHRwVmFsaWRhdG9yUm91dGVLZXkoYXBpKTtcbiAgICBjb25zdCB2YWxpZGF0b3IgPSByZWdpc3RyeS52YWxpZGF0b3JzLmdldChyb3V0ZUtleSk7XG4gICAgaWYgKHZhbGlkYXRvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgdmFsaWRhdG9yIHJlZ2lzdHJ5IGlzIG1pc3NpbmcgJHtyb3V0ZUtleX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkYXRvcjtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZEFvdEh0dHBWYWxpZGF0b3JSZWdpc3RyeShcbiAgICBhcGlzOiByZWFkb25seSBFeHRlbmRlZEFwaVtdID0gdGhpcy5zeW5jZXIuYXBpcyxcbiAgICBkZXBlbmRlbmNpZXM6IFNvbmFtdUh0dHBWYWxpZGF0b3JEZXBlbmRlbmNpZXMgPSBkZWZhdWx0U29uYW11SHR0cFZhbGlkYXRvckRlcGVuZGVuY2llcyxcbiAgKTogUHJvbWlzZTxIdHRwVmFsaWRhdG9yUmVnaXN0cnk+IHtcbiAgICBjb25zdCB7IHBhdGhUb0ZpbGVVUkwgfSA9IGF3YWl0IGltcG9ydChcIm5vZGU6dXJsXCIpO1xuICAgIGNvbnN0IHJlZ2lzdHJ5UGF0aCA9IHBhdGguam9pbihcbiAgICAgIHRoaXMuYXBpUm9vdFBhdGgsXG4gICAgICBcImRpc3QvYXBwbGljYXRpb24vc29uYW11LnZhbGlkYXRvcnMuZ2VuZXJhdGVkLmpzXCIsXG4gICAgKTtcbiAgICBpZiAoIShhd2FpdCBleGlzdHMocmVnaXN0cnlQYXRoKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgR2VuZXJhdGVkIEhUVFAgdmFsaWRhdG9yIHJlZ2lzdHJ5IG5vdCBmb3VuZDogJHtyZWdpc3RyeVBhdGh9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgaW1wb3J0ZWQgPVxuICAgICAgLyogU0FGRVRZOiBBUEkg642w7L2U66CI7J207YSw7JmAIFpvZCDqsoDspp3quLAg65Ox66GdIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChhd2FpdCBpbXBvcnQoXG4gICAgICAgIHBhdGhUb0ZpbGVVUkwocmVnaXN0cnlQYXRoKS5ocmVmXG4gICAgICApKSBhcyB7XG4gICAgICAgIGZpbmdlcnByaW50PzogdW5rbm93bjtcbiAgICAgICAgdmFsaWRhdG9ycz86IHVua25vd247XG4gICAgICB9O1xuICAgIGlmICghaXNTdHJpbmdWYWx1ZShpbXBvcnRlZC5maW5nZXJwcmludCkgfHwgIShpbXBvcnRlZC52YWxpZGF0b3JzIGluc3RhbmNlb2YgTWFwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGdlbmVyYXRlZCBIVFRQIHZhbGlkYXRvciByZWdpc3RyeTogJHtyZWdpc3RyeVBhdGh9YCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsaWRhdG9yXSBvZiBpbXBvcnRlZC52YWxpZGF0b3JzKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFpc1N0cmluZ1ZhbHVlKGtleSkgfHxcbiAgICAgICAgIWlzT2JqZWN0VmFsdWUodmFsaWRhdG9yKSB8fFxuICAgICAgICB2YWxpZGF0b3IgPT09IG51bGwgfHxcbiAgICAgICAgIShcInBhcnNlXCIgaW4gdmFsaWRhdG9yKSB8fFxuICAgICAgICAhaXNGdW5jdGlvblZhbHVlKHZhbGlkYXRvci5wYXJzZSlcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgSFRUUCB2YWxpZGF0b3IgcmVnaXN0cnkgZW50cnk6ICR7U3RyaW5nKGtleSl9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVnaXN0cnk6IEh0dHBWYWxpZGF0b3JSZWdpc3RyeSA9IHtcbiAgICAgIGZpbmdlcnByaW50OiBpbXBvcnRlZC5maW5nZXJwcmludCxcbiAgICAgIHZhbGlkYXRvcnM6IGltcG9ydGVkLnZhbGlkYXRvcnMsXG4gICAgfTtcbiAgICBkZXBlbmRlbmNpZXMuYXNzZXJ0UmVnaXN0cnkoYXBpcywgcmVnaXN0cnkpO1xuICAgIHJldHVybiByZWdpc3RyeTtcbiAgfVxuXG4gIGFzeW5jIHJlZnJlc2hIdHRwVmFsaWRhdG9ycyhcbiAgICBkZXBlbmRlbmNpZXM6IFNvbmFtdUh0dHBWYWxpZGF0b3JEZXBlbmRlbmNpZXMgPSBkZWZhdWx0U29uYW11SHR0cFZhbGlkYXRvckRlcGVuZGVuY2llcyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcG9saWN5ID0gbm9ybWFsaXplWm9kQ29tcGlsZXJQb2xpY3kodGhpcy5jb25maWcudmFsaWRhdGlvbj8uem9kQ29tcGlsZXIpO1xuICAgIGNvbnN0IHNvdXJjZUFvdCA9IHByb2Nlc3MuZW52LkhPVCA9PT0gXCJ5ZXNcIiB8fCBwcm9jZXNzLmVudi5WSVRFU1QgPT09IFwidHJ1ZVwiO1xuICAgIGNvbnN0IG5leHRBcGlzID0gWy4uLnRoaXMuc3luY2VyLmFwaXNdO1xuICAgIGNvbnN0IG5leHRNb2RlbHMgPSB7IC4uLnRoaXMuc3luY2VyLm1vZGVscyB9O1xuICAgIGNvbnN0IHJlc3RBcGlzID0gbmV4dEFwaXMuZmlsdGVyKChhcGkpID0+IGFwaS53ZWJzb2NrZXRPcHRpb25zID09PSB1bmRlZmluZWQpO1xuICAgIGNvbnN0IG5leHQgPSBuZXcgV2Vha01hcDxFeHRlbmRlZEFwaSwgSHR0cFZhbGlkYXRvcj4oKTtcbiAgICBsZXQgbmV4dEFvdFJlZ2lzdHJ5OiBIdHRwVmFsaWRhdG9yUmVnaXN0cnkgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAocG9saWN5LmFwaSA9PT0gXCJhb3RcIiAmJiAhc291cmNlQW90KSB7XG4gICAgICBjb25zdCByZWdpc3RyeSA9IGF3YWl0IHRoaXMubG9hZEFvdEh0dHBWYWxpZGF0b3JSZWdpc3RyeShuZXh0QXBpcywgZGVwZW5kZW5jaWVzKTtcbiAgICAgIGZvciAoY29uc3QgYXBpIG9mIHJlc3RBcGlzKSB7XG4gICAgICAgIG5leHQuc2V0KGFwaSwgdGhpcy5nZXRBb3RIdHRwVmFsaWRhdG9yKGFwaSwgcmVnaXN0cnkpKTtcbiAgICAgIH1cbiAgICAgIG5leHRBb3RSZWdpc3RyeSA9IHJlZ2lzdHJ5O1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgcmVzdEFwaXMubWFwKGFzeW5jIChhcGkpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWxpZGF0b3IgPSBhd2FpdCB0aGlzLmJ1aWxkSHR0cFZhbGlkYXRvcihhcGksIGRlcGVuZGVuY2llcyk7XG4gICAgICAgICAgbmV4dC5zZXQoYXBpLCB2YWxpZGF0b3IpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gdmFsaWRhdG9y7JmAIOqwmeydgCByZXZpc2lvbuydmCBBUEkvbW9kZWwgc25hcHNob3TsnYQg7ZWo6ruYIOqzteqwnO2VtCBITVIg7KSR6rCEIOyDge2DnOulvCDsiKjquYHri4jri6QuXG4gICAgdGhpcy5odHRwVmFsaWRhdG9ycyA9IG5leHQ7XG4gICAgdGhpcy5wZW5kaW5nSHR0cFZhbGlkYXRvcnMgPSBuZXcgV2Vha01hcCgpO1xuICAgIHRoaXMuYW90SHR0cFZhbGlkYXRvclJlZ2lzdHJ5ID0gbmV4dEFvdFJlZ2lzdHJ5O1xuICAgIHRoaXMucHJlcGFyZWRBcGlzID0gbmV4dEFwaXM7XG4gICAgdGhpcy5wcmVwYXJlZE1vZGVscyA9IG5leHRNb2RlbHM7XG5cbiAgICAvLyBAd2Vic29ja2V0IHJvdXRl7J2YIG91dEV2ZW50c+ulvCBhcGkucGF0aCDtgqTroZwgcm91dGUgdGFibGXsl5Ag67CY7JiB7ZWc64ukLlxuICAgIC8vIOuwnO2WiSDrhbjrk5zqsIAgcm91dGXrs4TroZwg7ZWcIOuyiCDsnbjsvZTrlKntlZwgZnJhbWXsnYQg7JuQ6rKpIOuFuOuTnOqwgCDqt7jrjIDroZwg67O064K066+A66GcLCBITVIg65Kk7JeQ64+EIOy1nOyLoCDsiqTtgqTrp4jrpbwg7I2o7JW8IO2VnOuLpFxuICAgIHRoaXMud2Vic29ja2V0UnVudGltZVZhbHVlPy5yZXBsYWNlUm91dGVzKFxuICAgICAgbmV4dEFwaXMuZmxhdE1hcCgoYXBpKSA9PlxuICAgICAgICBhcGkud2Vic29ja2V0T3B0aW9uc1xuICAgICAgICAgID8gW3sgcm91dGVLZXk6IGFwaS5wYXRoLCBvdXRFdmVudHM6IGFwaS53ZWJzb2NrZXRPcHRpb25zLm91dEV2ZW50cyB9XVxuICAgICAgICAgIDogW10sXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICAvLyBXUyBwYXRo66W8IOydvOuwmCBIVFRQIEdFVOycvOuhnCDtmLjstpztlZwg6rK97JqwIDQyNiArIFVwZ3JhZGUg7Zek642U66GcIOuqheyLnOyggeycvOuhnCB3ZWJzb2NrZXQg7KCR7IaN7J2EIOycoOuPhO2VqFxuICBwcml2YXRlIGNyZWF0ZVdlYlNvY2tldFVwZ3JhZGVSZXF1aXJlZEhhbmRsZXIoKSB7XG4gICAgcmV0dXJuIGFzeW5jIChfcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIHJlcGx5LmhlYWRlcihcImNvbm5lY3Rpb25cIiwgXCJVcGdyYWRlXCIpLmhlYWRlcihcInVwZ3JhZGVcIiwgXCJ3ZWJzb2NrZXRcIikuc3RhdHVzKDQyNikuc2VuZCh7XG4gICAgICAgIG1lc3NhZ2U6IFwiV2ViU29ja2V0IHVwZ3JhZGUgcmVxdWlyZWRcIixcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICAvLyBkZXYg66qo65Oc7J2YIGNhdGNoLWFsbCB3c0hhbmRsZXLsl5DshJwg7Iuk7KCcIFdTIEFQSeuhnCDrlJTsiqTtjKjsuZjtlaguIOunpOy5reuQmOuKlCByb3V0ZeqwgCDsl4bsnLzrqbQgMTAwOOuhnCDri6vsnYxcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVEZXZXZWJTb2NrZXRSZXF1ZXN0KFxuICAgIHNvY2tldDogV2ViU29ja2V0LFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbWF0Y2hlZEFwaSA9IHRoaXMuZmluZE1hdGNoZWRBcGkocmVxdWVzdCwgdGhpcy5zeW5jZXIuYXBpcywgdGhpcy5zeW5jZXIubW9kZWxzKTtcbiAgICBpZiAoIW1hdGNoZWRBcGk/LndlYnNvY2tldE9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHRyYWNlQ29udGV4dCA9IHRoaXMud2Vic29ja2V0UnVudGltZS50ZWxlbWV0cnlDb250cm9sbGVyLmNyZWF0ZUNvbm5lY3Rpb25Db250ZXh0KHtcbiAgICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgfSk7XG4gICAgICB0aGlzLndlYnNvY2tldFJ1bnRpbWUudGVsZW1ldHJ5Q29udHJvbGxlci5lbWl0KHtcbiAgICAgICAgbmFtZTogXCJ3cy5jb25uZWN0aW9uLnJlamVjdGVkXCIsXG4gICAgICAgIGxldmVsOiBcIndhcm5cIixcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgcmVhc29uOiBcInJvdXRlTm90Rm91bmRcIixcbiAgICAgICAgICBwYXRoOiByZXF1ZXN0LnVybCxcbiAgICAgICAgfSxcbiAgICAgICAgdHJhY2VJZDogdHJhY2VDb250ZXh0LnRyYWNlSWQsXG4gICAgICAgIHNwYW5JZDogdHJhY2VDb250ZXh0LnNwYW5JZCxcbiAgICAgICAgcGFyZW50U3BhbklkOiB0cmFjZUNvbnRleHQucGFyZW50U3BhbklkLFxuICAgICAgICBzYW1wbGVkOiB0cmFjZUNvbnRleHQuc2FtcGxlZCxcbiAgICAgIH0pO1xuICAgICAgc29ja2V0LmNsb3NlKDEwMDgsIFwiV2ViU29ja2V0IHJvdXRlIG5vdCBmb3VuZFwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5jcmVhdGVXZWJTb2NrZXRIYW5kbGVyKG1hdGNoZWRBcGksIGNvbmZpZyk7XG4gICAgYXdhaXQgaGFuZGxlcih7IHNvY2tldCB9LCByZXF1ZXN0KTtcbiAgfVxuXG4gIC8vIFdTIHJvdXRlIO2VuOuTpOufrOydmCDsi6Ttlokg7Iic7ISc66W8IOqzoOygle2VqDpcbiAgLy8gMSkgcXVlcnkgcGFyYW0g7YyM7Iux7J2EIGFjdGl2YXRpb24g7KCE7JeQIOuBneuCtCBoYW5kc2hha2Ug7Iuk7Yyo6rCAIHJlZ2lzdHJ57JeQIOuFuOy2nOuQmOyngCDslYrqsowg7ZWoXG4gIC8vIDIpIGBhY3RpdmU6IGZhbHNlYOuhnCDrqLzsoIAg65Ox66Gd7ZWcIOuSpCBjb250ZXh0IOyViOyXkOyEnCBndWFyZOulvCDsi6TtlontlbQg7J247KadIOygleuztOulvCDssLjsobDtlaAg7IiYIOyeiOqyjCDtlahcbiAgLy8gMykgY29udGV4dC9ndWFyZCDspIDruYTqsIAg64Gd64KcIOuSpCBgYWN0aXZhdGUoKWDtlbQg67iM66Gc65Oc7LqQ7Iqk7Yq46rCAIOy0iOq4sO2ZlCDspJHqsIQg7IOB7YOc66W8IOuztOyngCDrqrvtlZjqsowg7ZWoXG4gIC8vIOyXkOufrCDrsJzsg50g7Iuc7JeQ64qUIHJlc29sdmVXZWJTb2NrZXRDbG9zZURlc2NyaXB0b3Ig7KCV7LGF7JeQIOuUsOudvCBjbG9zZSBjb2Rl66W8IOunpO2Vke2VqFxuICBjcmVhdGVXZWJTb2NrZXRIYW5kbGVyRm9yVGVzdGluZyhhcGk6IEV4dGVuZGVkQXBpLCBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVXZWJTb2NrZXRIYW5kbGVyKGFwaSwgY29uZmlnKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlV2ViU29ja2V0SGFuZGxlcihhcGk6IEV4dGVuZGVkQXBpLCBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcpIHtcbiAgICByZXR1cm4gYXN5bmMgKFxuICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICBzb2NrZXQ6IFdlYlNvY2tldDtcbiAgICAgIH0sXG4gICAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGNvbnN0IHNvY2tldCA9IGNvbm5lY3Rpb24uc29ja2V0O1xuICAgICAgbGV0IHdzQ29udGV4dDogV2ViU29ja2V0Q29udGV4dDxvYmplY3QsIG9iamVjdD4gfCBudWxsID0gbnVsbDtcbiAgICAgIGxldCByYXdXczogQXdhaXRlZDxSZXR1cm5UeXBlPFdlYlNvY2tldFJ1bnRpbWVbXCJyZWdpc3RlckNvbm5lY3Rpb25cIl0+PiB8IG51bGwgPSBudWxsO1xuICAgICAgbGV0IHByZVJlZ2lzdGVyUGhhc2U6IFwiZ3VhcmRcIiB8IFwicXVlcnlcIiB8IFwicmVnaXN0ZXJcIiB8IFwiaGFuZGxlclwiID0gXCJndWFyZFwiO1xuICAgICAgbGV0IHRyYWNlQ29udGV4dDogV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvbkNvbnRleHQgPSB7fTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgdHJhY2VDb250ZXh0ID0gdGhpcy53ZWJzb2NrZXRSdW50aW1lLnRlbGVtZXRyeUNvbnRyb2xsZXIuY3JlYXRlQ29ubmVjdGlvbkNvbnRleHQoe1xuICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcHJlUmVnaXN0ZXJQaGFzZSA9IFwicXVlcnlcIjtcbiAgICAgICAgY29uc3QgcmVxQm9keSA9IGF3YWl0IHRoaXMucGFyc2VXZWJTb2NrZXRSZXF1ZXN0UGFyYW1zKGFwaSwgcmVxdWVzdCk7XG4gICAgICAgIHByZVJlZ2lzdGVyUGhhc2UgPSBcInJlZ2lzdGVyXCI7XG4gICAgICAgIC8vIOuTseuhnShzdG9yZSDrsJjsmIEg7Y+s7ZWoKeydtCDrgZ3rgpwg65Kk7JeQIGNvbnRleHQvZ3VhcmTrpbwg7KeE7ZaJ7ZWc64ukLiDrpqzsiqTrhIjripQg65Ox66GdIOykkeyXkOuPhCDrtpnslrQg7J6I7Ja0IGNsb3Nl66W8IOuGk+y5mOyngCDslYrripTri6RcbiAgICAgICAgcmF3V3MgPSBhd2FpdCB0aGlzLndlYnNvY2tldFJ1bnRpbWUucmVnaXN0ZXJDb25uZWN0aW9uKHNvY2tldCwge1xuICAgICAgICAgIHJvdXRlS2V5OiBhcGkucGF0aCxcbiAgICAgICAgICBvdXRFdmVudHM6IGFwaS53ZWJzb2NrZXRPcHRpb25zIS5vdXRFdmVudHMsXG4gICAgICAgICAgaW5FdmVudHM6IGFwaS53ZWJzb2NrZXRPcHRpb25zIS5pbkV2ZW50cyxcbiAgICAgICAgICBuYW1lc3BhY2U6IGFwaS53ZWJzb2NrZXRPcHRpb25zIS5uYW1lc3BhY2UsXG4gICAgICAgICAgaGVhcnRiZWF0OiBhcGkud2Vic29ja2V0T3B0aW9ucyEuaGVhcnRiZWF0LFxuICAgICAgICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgICAgICAgdHJhY2VJZDogdHJhY2VDb250ZXh0LnRyYWNlSWQsXG4gICAgICAgICAgc3BhbklkOiB0cmFjZUNvbnRleHQuc3BhbklkLFxuICAgICAgICAgIHBhcmVudFNwYW5JZDogdHJhY2VDb250ZXh0LnBhcmVudFNwYW5JZCxcbiAgICAgICAgICBzYW1wbGVkOiB0cmFjZUNvbnRleHQuc2FtcGxlZCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgc2NvcGVkV3MgPSB0aGlzLmNyZWF0ZVNjb3BlZFdlYlNvY2tldENvbm5lY3Rpb24ocmF3V3MsICgpID0+IHdzQ29udGV4dCk7XG4gICAgICAgIHdzQ29udGV4dCA9IGF3YWl0IHRoaXMuY3JlYXRlV2ViU29ja2V0Q29udGV4dChjb25maWcsIHJlcXVlc3QsIHNjb3BlZFdzKTtcblxuICAgICAgICBhd2FpdCB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7IGNvbnRleHQ6IHdzQ29udGV4dCB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgcnVuR3VhcmRzKHtcbiAgICAgICAgICAgIGd1YXJkczogYXBpLm9wdGlvbnMuZ3VhcmRzLFxuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgIGFwaSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8g7Zmc7ISx7ZmU6rCAIHN0b3Jl7JeQIOuwmOyYgeuQnCDrkqQgaGFuZGxlcuulvCDsi6TtlontlbQgaGFuZGxlciDslYjsnZggcHVibGlzaOqwgCDsnbQg7Jew6rKw7J2EIOuMgOyDgeycvOuhnCDsnqHqsowg7ZWc64ukXG4gICAgICAgIGF3YWl0IHRoaXMud2Vic29ja2V0UnVudGltZS5hY3RpdmF0ZUNvbm5lY3Rpb24ocmF3V3MuaWQpO1xuICAgICAgICBwcmVSZWdpc3RlclBoYXNlID0gXCJoYW5kbGVyXCI7XG5cbiAgICAgICAgY29uc3QgeyBBcGlQYXJhbVR5cGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL3R5cGVzL3R5cGVzXCIpO1xuICAgICAgICBjb25zdCBhcmdzID0gYXBpLnBhcmFtZXRlcnMubWFwKChwYXJhbSkgPT4ge1xuICAgICAgICAgIGlmIChBcGlQYXJhbVR5cGUuaXNDb250ZXh0KHBhcmFtLnR5cGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gd3NDb250ZXh0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiByZXFCb2R5LmdldChwYXJhbS5uYW1lKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5hc3luY0xvY2FsU3RvcmFnZS5ydW4oeyBjb250ZXh0OiB3c0NvbnRleHQgfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IHRoaXMuaW52b2tlTW9kZWxNZXRob2QoYXBpLCBhcmdzKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBjbG9zZURlc2NyaXB0b3IgPSByZXNvbHZlV2ViU29ja2V0Q2xvc2VEZXNjcmlwdG9yKGVycm9yKTtcbiAgICAgICAgaWYgKCFyYXdXcykge1xuICAgICAgICAgIHRoaXMud2Vic29ja2V0UnVudGltZS50ZWxlbWV0cnlDb250cm9sbGVyLmVtaXQoe1xuICAgICAgICAgICAgbmFtZTogXCJ3cy5jb25uZWN0aW9uLnJlamVjdGVkXCIsXG4gICAgICAgICAgICBsZXZlbDogY2xvc2VEZXNjcmlwdG9yLmxvZ0xldmVsID09PSBcIndhcm5cIiA/IFwid2FyblwiIDogXCJlcnJvclwiLFxuICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgIHJlYXNvbjogcHJlUmVnaXN0ZXJQaGFzZSxcbiAgICAgICAgICAgICAgY29kZTogY2xvc2VEZXNjcmlwdG9yLmNvZGUsXG4gICAgICAgICAgICAgIHBhdGg6IGFwaS5wYXRoLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRyYWNlSWQ6IHRyYWNlQ29udGV4dC50cmFjZUlkLFxuICAgICAgICAgICAgc3BhbklkOiB0cmFjZUNvbnRleHQuc3BhbklkLFxuICAgICAgICAgICAgcGFyZW50U3BhbklkOiB0cmFjZUNvbnRleHQucGFyZW50U3BhbklkLFxuICAgICAgICAgICAgc2FtcGxlZDogdHJhY2VDb250ZXh0LnNhbXBsZWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmF3V3MpIHtcbiAgICAgICAgICByYXdXcy5jbG9zZShjbG9zZURlc2NyaXB0b3IuY29kZSwgY2xvc2VEZXNjcmlwdG9yLnJlYXNvbik7XG4gICAgICAgIH0gZWxzZSBpZiAoc29ja2V0LnJlYWR5U3RhdGUgPCAyKSB7XG4gICAgICAgICAgc29ja2V0LmNsb3NlKGNsb3NlRGVzY3JpcHRvci5jb2RlLCBjbG9zZURlc2NyaXB0b3IucmVhc29uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNlcnZlcj8ubG9nKSB7XG4gICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgIGVycjogZXJyb3IsXG4gICAgICAgICAgICBtb2RlbE5hbWU6IGFwaS5tb2RlbE5hbWUsXG4gICAgICAgICAgICBtZXRob2ROYW1lOiBhcGkubWV0aG9kTmFtZSxcbiAgICAgICAgICAgIHBhdGg6IGFwaS5wYXRoLFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGNsb3NlRGVzY3JpcHRvci5sb2dMZXZlbCA9PT0gXCJ3YXJuXCIpIHtcbiAgICAgICAgICAgIHRoaXMuc2VydmVyLmxvZy53YXJuKHBheWxvYWQsIGNsb3NlRGVzY3JpcHRvci5yZWFzb24pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlcnZlci5sb2cuZXJyb3IocGF5bG9hZCwgY2xvc2VEZXNjcmlwdG9yLnJlYXNvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChjbG9zZURlc2NyaXB0b3IubG9nTGV2ZWwgPT09IFwid2FyblwiKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oY2xvc2VEZXNjcmlwdG9yLnJlYXNvbiwgZXJyb3IpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGNsb3NlRGVzY3JpcHRvci5yZWFzb24sIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gb25NZXNzYWdlL29uQ2xvc2Xsspjrn7wg64uk66W4IHRpY2vsl5DshJwg7Iuk7ZaJ65CY64qUIGNhbGxiYWNr7J2AIEFMUyBjb250ZXh06rCAIOuBiuq4sOuvgOuhnCB3cmFwcGVy7JeQ7IScIGBhc3luY0xvY2FsU3RvcmFnZS5ydW5g7Jy866GcIOuLpOyLnCDqsJDsi7gg67O17JuQ7ZWoXG4gIC8vIHB1Ymxpc2gvam9pbi9sZWF2ZS9zZXRVc2VySWQg6rCZ7J2AIOymieyLnCDsi6TtlokgQVBJ64qUIOuLqOyInCDsnITsnoTrp4wg7ZWY6rOgLCBkZWZlcnJlZCBjYWxsYmFja+yXkOunjCBjb250ZXh0IOuzteybkOydhCDsoIHsmqntlahcbiAgcHJpdmF0ZSBjcmVhdGVTY29wZWRXZWJTb2NrZXRDb25uZWN0aW9uPFRPdXQgZXh0ZW5kcyBvYmplY3QsIFRJbiBleHRlbmRzIG9iamVjdD4oXG4gICAgd3M6IFdlYlNvY2tldENvbm5lY3Rpb248VE91dCwgVEluPixcbiAgICBnZXRDb250ZXh0OiAoKSA9PiBXZWJTb2NrZXRDb250ZXh0IHwgbnVsbCxcbiAgKTogV2ViU29ja2V0Q29ubmVjdGlvbjxUT3V0LCBUSW4+IHtcbiAgICBjb25zdCB0ZWxlbWV0cnlDb250cm9sbGVyID0gdGhpcy53ZWJzb2NrZXRSdW50aW1lVmFsdWU/LnRlbGVtZXRyeUNvbnRyb2xsZXI7XG4gICAgY29uc3QgcnVuSW5Db250ZXh0ID0gPFQ+KGNhbGxiYWNrOiAoKSA9PiBUKTogVCA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0ID0gZ2V0Q29udGV4dCgpO1xuICAgICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5hc3luY0xvY2FsU3RvcmFnZS5ydW4oeyBjb250ZXh0IH0sIGNhbGxiYWNrKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGdldCBpZCgpIHtcbiAgICAgICAgcmV0dXJuIHdzLmlkO1xuICAgICAgfSxcbiAgICAgIGdldCBuYW1lc3BhY2UoKSB7XG4gICAgICAgIHJldHVybiB3cy5uYW1lc3BhY2U7XG4gICAgICB9LFxuICAgICAgZ2V0IGNsb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHdzLmNsb3NlZDtcbiAgICAgIH0sXG4gICAgICBnZXQgdXNlcklkKCkge1xuICAgICAgICByZXR1cm4gd3MudXNlcklkO1xuICAgICAgfSxcbiAgICAgIHRyYW5zcG9ydDogXCJ3c1wiLFxuICAgICAgcHVibGlzaFVudHlwZWQoZXZlbnQsIGRhdGEpIHtcbiAgICAgICAgd3MucHVibGlzaFVudHlwZWQoZXZlbnQsIGRhdGEpO1xuICAgICAgfSxcbiAgICAgIGNsb3NlKGNvZGUsIHJlYXNvbikge1xuICAgICAgICB3cy5jbG9zZShjb2RlLCByZWFzb24pO1xuICAgICAgfSxcbiAgICAgIG9uQ2xvc2UoY2FsbGJhY2spIHtcbiAgICAgICAgd3Mub25DbG9zZSgoKSA9PiBydW5JbkNvbnRleHQoY2FsbGJhY2spKTtcbiAgICAgIH0sXG4gICAgICBvbk1lc3NhZ2UoZXZlbnQsIGhhbmRsZXIpIHtcbiAgICAgICAgd3Mub25NZXNzYWdlKGV2ZW50LCAoZGF0YSwgbWVzc2FnZVRyYWNlQ29udGV4dCkgPT5cbiAgICAgICAgICBydW5JbkNvbnRleHQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXZlbnROYW1lID0gU3RyaW5nKGV2ZW50KTtcbiAgICAgICAgICAgIGNvbnN0IHRyYWNlQ29udGV4dCA9IG1lc3NhZ2VUcmFjZUNvbnRleHQgPz8gZ2V0V2ViU29ja2V0VGVsZW1ldHJ5Q29udGV4dCh3cyk7XG4gICAgICAgICAgICBjb25zdCBzdGFydGVkQXQgPSBwZXJmb3JtYW5jZS5ub3coKTtcblxuICAgICAgICAgICAgdGVsZW1ldHJ5Q29udHJvbGxlcj8uZW1pdCh7XG4gICAgICAgICAgICAgIG5hbWU6IFwid3MuaGFuZGxlci5zdGFydGVkXCIsXG4gICAgICAgICAgICAgIGxldmVsOiBcImRlYnVnXCIsXG4gICAgICAgICAgICAgIGNvbm5lY3Rpb25JZDogd3MuaWQsXG4gICAgICAgICAgICAgIG5hbWVzcGFjZTogd3MubmFtZXNwYWNlLFxuICAgICAgICAgICAgICB1c2VySWQ6IHdzLnVzZXJJZCxcbiAgICAgICAgICAgICAgZGV0YWlsOiB7IGV2ZW50OiBldmVudE5hbWUgfSxcbiAgICAgICAgICAgICAgLi4udHJhY2VDb250ZXh0LFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIoZGF0YSwgbWVzc2FnZVRyYWNlQ29udGV4dCk7XG4gICAgICAgICAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0ZWRBdDtcbiAgICAgICAgICAgICAgdGVsZW1ldHJ5Q29udHJvbGxlcj8uZW1pdCh7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJ3cy5oYW5kbGVyLmNvbXBsZXRlZFwiLFxuICAgICAgICAgICAgICAgIGxldmVsOiBcImRlYnVnXCIsXG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbklkOiB3cy5pZCxcbiAgICAgICAgICAgICAgICBuYW1lc3BhY2U6IHdzLm5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgICB1c2VySWQ6IHdzLnVzZXJJZCxcbiAgICAgICAgICAgICAgICBkZXRhaWw6IHsgZXZlbnQ6IGV2ZW50TmFtZSB9LFxuICAgICAgICAgICAgICAgIC4uLnRyYWNlQ29udGV4dCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRlbGVtZXRyeUNvbnRyb2xsZXI/LnJlY29yZFNwYW4oe1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvbk5hbWU6IFwid3MubWVzc2FnZS5wcm9jZXNzXCIsXG4gICAgICAgICAgICAgICAga2luZDogXCJpbnRlcm5hbFwiLFxuICAgICAgICAgICAgICAgIGR1cmF0aW9uTXMsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBcInVuc2V0XCIsXG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbklkOiB3cy5pZCxcbiAgICAgICAgICAgICAgICBuYW1lc3BhY2U6IHdzLm5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgICB1c2VySWQ6IHdzLnVzZXJJZCxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7IGV2ZW50OiBldmVudE5hbWUgfSxcbiAgICAgICAgICAgICAgICAuLi50cmFjZUNvbnRleHQsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY29uc3QgZHVyYXRpb25NcyA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRlZEF0O1xuICAgICAgICAgICAgICB0ZWxlbWV0cnlDb250cm9sbGVyPy5lbWl0KHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcIndzLmhhbmRsZXIuZmFpbGVkXCIsXG4gICAgICAgICAgICAgICAgbGV2ZWw6IFwiZXJyb3JcIixcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uSWQ6IHdzLmlkLFxuICAgICAgICAgICAgICAgIG5hbWVzcGFjZTogd3MubmFtZXNwYWNlLFxuICAgICAgICAgICAgICAgIHVzZXJJZDogd3MudXNlcklkLFxuICAgICAgICAgICAgICAgIGRldGFpbDogeyBldmVudDogZXZlbnROYW1lIH0sXG4gICAgICAgICAgICAgICAgLi4udHJhY2VDb250ZXh0LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgdGVsZW1ldHJ5Q29udHJvbGxlcj8ucmVjb3JkU3Bhbih7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uTmFtZTogXCJ3cy5tZXNzYWdlLnByb2Nlc3NcIixcbiAgICAgICAgICAgICAgICBraW5kOiBcImludGVybmFsXCIsXG4gICAgICAgICAgICAgICAgZHVyYXRpb25NcyxcbiAgICAgICAgICAgICAgICBzdGF0dXM6IFwiZXJyb3JcIixcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uSWQ6IHdzLmlkLFxuICAgICAgICAgICAgICAgIG5hbWVzcGFjZTogd3MubmFtZXNwYWNlLFxuICAgICAgICAgICAgICAgIHVzZXJJZDogd3MudXNlcklkLFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHsgZXZlbnQ6IGV2ZW50TmFtZSB9LFxuICAgICAgICAgICAgICAgIGVycm9yVHlwZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm5hbWUgOiBydW50aW1lVHlwZU9mKGVycm9yKSxcbiAgICAgICAgICAgICAgICAuLi50cmFjZUNvbnRleHQsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBwdWJsaXNoKGV2ZW50LCBkYXRhKSB7XG4gICAgICAgIHdzLnB1Ymxpc2goZXZlbnQsIGRhdGEpO1xuICAgICAgfSxcbiAgICAgIHdhaXRGb3JDbG9zZSgpIHtcbiAgICAgICAgcmV0dXJuIHdzLndhaXRGb3JDbG9zZSgpO1xuICAgICAgfSxcbiAgICAgIGpvaW4ocm9vbUlkKSB7XG4gICAgICAgIHJldHVybiB3cy5qb2luKHJvb21JZCk7XG4gICAgICB9LFxuICAgICAgbGVhdmUocm9vbUlkKSB7XG4gICAgICAgIHJldHVybiB3cy5sZWF2ZShyb29tSWQpO1xuICAgICAgfSxcbiAgICAgIHNldFVzZXJJZCh1c2VySWQpIHtcbiAgICAgICAgcmV0dXJuIHdzLnNldFVzZXJJZCh1c2VySWQpO1xuICAgICAgfSxcbiAgICAgIGNsZWFyVXNlcklkKCkge1xuICAgICAgICByZXR1cm4gd3MuY2xlYXJVc2VySWQoKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGNyZWF0ZVNjb3BlZFdlYlNvY2tldENvbm5lY3Rpb25Gb3JUZXN0aW5nPFRPdXQgZXh0ZW5kcyBvYmplY3QsIFRJbiBleHRlbmRzIG9iamVjdD4oXG4gICAgd3M6IFdlYlNvY2tldENvbm5lY3Rpb248VE91dCwgVEluPixcbiAgICBnZXRDb250ZXh0OiAoKSA9PiBXZWJTb2NrZXRDb250ZXh0IHwgbnVsbCxcbiAgKTogV2ViU29ja2V0Q29ubmVjdGlvbjxUT3V0LCBUSW4+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVTY29wZWRXZWJTb2NrZXRDb25uZWN0aW9uKHdzLCBnZXRDb250ZXh0KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcGFyc2VXZWJTb2NrZXRSZXF1ZXN0UGFyYW1zKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gICk6IFByb21pc2U8TWFwPHN0cmluZywgQXBpQXJndW1lbnQ+PiB7XG4gICAgY29uc3QgeyBnZXRab2RPYmplY3RGcm9tQXBpIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2NvZGUtY29udmVydGVyc1wiKTtcbiAgICBjb25zdCBSZXFUeXBlID0gZ2V0Wm9kT2JqZWN0RnJvbUFwaShhcGksIHRoaXMuc3luY2VyLnR5cGVzKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGZhc3RpZnlDYXN0ZXIgfSA9IGF3YWl0IGltcG9ydChcIi4vY2FzdGVyXCIpO1xuICAgICAgcmV0dXJuIHRvQXBpQXJndW1lbnRNYXAoZmFzdGlmeUNhc3RlcihSZXFUeXBlKS5wYXJzZShyZXF1ZXN0LnF1ZXJ5ID8/IHt9KSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgeyBab2RFcnJvciB9ID0gYXdhaXQgaW1wb3J0KFwiem9kXCIpO1xuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBab2RFcnJvcikge1xuICAgICAgICBjb25zdCB7IGh1bWFuaXplWm9kRXJyb3IgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL3pvZC1lcnJvclwiKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZXMgPSBodW1hbml6ZVpvZEVycm9yKGUpXG4gICAgICAgICAgLm1hcCgoaXNzdWUpID0+IGlzc3VlLm1lc3NhZ2UpXG4gICAgICAgICAgLmpvaW4oXCIgXCIpO1xuICAgICAgICBjb25zdCB7IEJhZFJlcXVlc3RFeGNlcHRpb24gfSA9IGF3YWl0IGltcG9ydChcIi4uL2V4Y2VwdGlvbnMvc28tZXhjZXB0aW9uc1wiKTtcbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgICAgLyogU0FGRVRZOiBBUEkg642w7L2U66CI7J207YSw7JmAIFpvZCDqsoDspp3quLAg65Ox66GdIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIG1lc3NhZ2VzIGFzIExvY2FsaXplZFN0cmluZyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB6b2RFcnJvcjogZSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVUkzsl5DshJwgcGF0aCBwYXJhbXPrpbwg7LaU7Lac7ZWp64uI64ukLlxuICAgKiDsmIg6IHBhdHRlcm49XCIvYWRtaW4vY29tcGFuaWVzLzpjb21wYW55SWRcIiwgdXJsPVwiL2FkbWluL2NvbXBhbmllcy8xMjNcIiDihpIgeyBjb21wYW55SWQ6IFwiMTIzXCIgfVxuICAgKi9cbiAgcHJpdmF0ZSBleHRyYWN0UGF0aFBhcmFtcyhwYXR0ZXJuOiBzdHJpbmcsIHVybDogc3RyaW5nKSB7XG4gICAgY29uc3QgcGF0dGVyblBhcnRzID0gcGF0dGVybi5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGNvbnN0IHVybFBhcnRzID0gdGhpcy5nZXRQYXRobmFtZUZyb21VcmwodXJsKS5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGNvbnN0IHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXR0ZXJuUGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChwYXR0ZXJuUGFydHNbaV0uc3RhcnRzV2l0aChcIjpcIikpIHtcbiAgICAgICAgcGFyYW1zW3BhdHRlcm5QYXJ0c1tpXS5zbGljZSgxKV0gPSB1cmxQYXJ0c1tpXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIHByaXZhdGUgaXNQYXRoUGF0dGVybk1hdGNoKHBhdHRlcm46IHN0cmluZywgdXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBwYXR0ZXJuUGFydHMgPSBwYXR0ZXJuLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3QgdXJsUGFydHMgPSB0aGlzLmdldFBhdGhuYW1lRnJvbVVybCh1cmwpLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICBpZiAocGF0dGVyblBhcnRzLmxlbmd0aCAhPT0gdXJsUGFydHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXR0ZXJuUGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBhdHRlcm5QYXJ0ID0gcGF0dGVyblBhcnRzW2ldO1xuICAgICAgY29uc3QgdXJsUGFydCA9IHVybFBhcnRzW2ldO1xuICAgICAgaWYgKHBhdHRlcm5QYXJ0LnN0YXJ0c1dpdGgoXCI6XCIpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHBhdHRlcm5QYXJ0ICE9PSB1cmxQYXJ0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGF0aG5hbWVGcm9tVXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdXJsLnNwbGl0KFwiP1wiKVswXTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVBhdGhXaXRoaW5CYXNlRGlyKGJhc2VEaXI6IHN0cmluZywgaW5wdXRQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZVVSSUNvbXBvbmVudChpbnB1dFBhdGgpLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpO1xuICAgICAgaWYgKGRlY29kZWQuaW5jbHVkZXMoXCJcXDBcIikpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBkZWNvZGVkLnJlcGxhY2UoL15cXC8rLywgXCJcIik7XG4gICAgICBjb25zdCByZXNvbHZlZFBhdGggPSBwYXRoLnJlc29sdmUoYmFzZURpciwgcmVsYXRpdmVQYXRoKTtcbiAgICAgIGNvbnN0IHJlbGF0aXZlRnJvbUJhc2UgPSBwYXRoLnJlbGF0aXZlKGJhc2VEaXIsIHJlc29sdmVkUGF0aCk7XG4gICAgICBpZiAocmVsYXRpdmVGcm9tQmFzZS5zdGFydHNXaXRoKFwiLi5cIikgfHwgcGF0aC5pc0Fic29sdXRlKHJlbGF0aXZlRnJvbUJhc2UpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc29sdmVkUGF0aDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBUEkg7J2R64u17JeQIOyggeyaqe2VoCBDYWNoZS1Db250cm9sIOyEpOygleydhCDqsrDsoJXtlanri4jri6QuXG4gICAqIOyasOyEoOyInOychDog6rCc67OEIOyngOyglSA+IGNhY2hlQ29udHJvbEhhbmRsZXJcbiAgICovXG4gIHByaXZhdGUgZ2V0QXBpQ2FjaGVDb250cm9sKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICApIHtcbiAgICAvLyDrjbDsvZTroIjsnbTthLAg7ISk7KCVIOyasOyEoFxuICAgIGlmIChhcGkub3B0aW9ucy5jYWNoZUNvbnRyb2wpIHtcbiAgICAgIHJldHVybiBhcGkub3B0aW9ucy5jYWNoZUNvbnRyb2w7XG4gICAgfVxuXG4gICAgLy8g7KCE7JetIO2VuOuTpOufrFxuICAgIGlmIChjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcikge1xuICAgICAgY29uc3QgY2FjaGVSZXE6IENhY2hlQ29udHJvbFJlcXVlc3QgPSB7XG4gICAgICAgIHR5cGU6IFwiYXBpXCIsXG4gICAgICAgIHVybDogcmVxdWVzdC51cmwsXG4gICAgICAgIHBhdGg6IHJlcXVlc3Qucm91dGVPcHRpb25zPy51cmwgPz8gcmVxdWVzdC51cmwuc3BsaXQoXCI/XCIpWzBdLFxuICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICBhcGksXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIoY2FjaGVSZXEpO1xuICAgICAgaWYgKHJlc3VsdCkgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTU1LsmqkgQVBJIO2YuOy2nCAoSFRUUCDsmKTrsoTtl6Trk5wg7JeG7J20IOyngeygkSDtmLjstpwpXG4gICAqIGNyZWF0ZUFwaUhhbmRsZXLsnZgg66Gc7KeB7J2EIOyerOyCrOyaqe2VmOuQmCwgcmVxdWVzdCDtjIzsi7Eg64yA7IugIHBhcmFtcyDsp4HsoJEg7IKs7JqpXG4gICAqL1xuICBhc3luYyBpbnZva2VBcGlGb3JTU1IoXG4gICAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgICBwYXJhbXM6IGFueVtdLFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICByZXBseTogRmFzdGlmeVJlcGx5LFxuICApOiBQcm9taXNlPEFwaU1ldGhvZFJlc3VsdD4ge1xuICAgIC8vIENvbnRleHQg7IOd7ISxICjquLDsobQg66mU7IaM65OcIOyerOyCrOyaqSlcbiAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVDb250ZXh0KGNvbmZpZywgcmVxdWVzdCwgcmVwbHkpO1xuXG4gICAgcmV0dXJuIHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UucnVuKHsgY29udGV4dCB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBhcmdzIOyDneyEsTogQ29udGV4dCDtjIzrnbzrr7jthLDripQg7KO87J6FLCDrgpjrqLjsp4DripQgcGFyYW1z7JeQ7IScIOqwgOyguOyYpOq4sFxuICAgICAgY29uc3QgeyBBcGlQYXJhbVR5cGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL3R5cGVzL3R5cGVzXCIpO1xuICAgICAgbGV0IHBhcmFtc0luZGV4ID0gMDtcbiAgICAgIGNvbnN0IGFyZ3MgPSBhcGkucGFyYW1ldGVycy5tYXAoKHBhcmFtKSA9PiB7XG4gICAgICAgIGlmIChBcGlQYXJhbVR5cGUuaXNDb250ZXh0KHBhcmFtLnR5cGUpKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcmFtc1twYXJhbXNJbmRleCsrXTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyDrqqjrjbgg66mU7ISc65OcIO2YuOy2nCAo6riw7KG0IOuplOyEnOuTnCDsnqzsgqzsmqkpXG4gICAgICByZXR1cm4gdGhpcy5pbnZva2VNb2RlbE1ldGhvZChhcGksIGFyZ3MsIHJlcGx5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZURldkFwaVJlcXVlc3RGb3JUZXN0aW5nKHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LCBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGVEZXZBcGlSZXF1ZXN0KHJlcXVlc3QsIGNvbmZpZyk7XG4gIH1cblxuICAvLyBXUyDqsr3roZzsl5DshJzripQgSFRUUCByZXBseeqwgCDsl4bsnLzrr4DroZwgcmVwbHnrpbwgb3B0aW9uYWzroZwg67Cb7JWEIOqzte2GtSDtmLjstpwg6rK966Gc66W8IOycoOyngO2VqFxuICBhc3luYyBpbnZva2VNb2RlbE1ldGhvZChcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIGFyZ3M6IHVua25vd25bXSxcbiAgICByZXBseT86IEZhc3RpZnlSZXBseSxcbiAgICBtb2RlbHM6IExvYWRlZE1vZGVscyA9IHRoaXMuc3luY2VyLm1vZGVscyxcbiAgKTogUHJvbWlzZTxBcGlNZXRob2RSZXN1bHQ+IHtcbiAgICBjb25zdCBtb2RlbCA9IG1vZGVsc1thcGkubW9kZWxOYW1lXTtcbiAgICBpZiAobW9kZWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb2RlbCBub3QgZm91bmQ6ICR7YXBpLm1vZGVsTmFtZX1gKTtcbiAgICB9XG4gICAgY29uc3QgbWV0aG9kID1cbiAgICAgIG1vZGVsW1xuICAgICAgICAvKiBTQUZFVFk6IOuPmeq4sO2ZlOq4sOqwgCDrqqjrjbgg7YG0656Y7Iqk7JeQ7IScIOyImOynke2VnCBBUEkg66mU7ISc65OcIOydtOumhOunjCDsoITri6ztlZzri6QuICovIGFwaS5tZXRob2ROYW1lIGFzIGtleW9mIHR5cGVvZiBtb2RlbFxuICAgICAgXTtcbiAgICBpZiAoIWlzRnVuY3Rpb25WYWx1ZShtZXRob2QpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vZGVsIG1ldGhvZCBub3QgZm91bmQ6ICR7YXBpLm1vZGVsTmFtZX0uJHthcGkubWV0aG9kTmFtZX1gKTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwobWV0aG9kLCBtb2RlbCwgYXJncyk7XG4gICAgcmVwbHk/LnR5cGUoYXBpLm9wdGlvbnMuY29udGVudFR5cGUgPz8gXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUNvbnRleHQoXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIHJlcGx5OiBGYXN0aWZ5UmVwbHksXG4gICk6IFByb21pc2U8Q29udGV4dD4ge1xuICAgIC8vIGNyZWF0ZVNTRUZhY3Rvcnkg7ZWo7IiY7JeQIOuvuOumrCByZXF1ZXN07J2YIHNvY2tldOqzvCByZXBseeulvCDrsJTsnbjrlKkuXG4gICAgY29uc3QgeyBjcmVhdGVTU0VGYWN0b3J5IH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zdHJlYW0vc3NlXCIpO1xuICAgIGNvbnN0IGNyZWF0ZVNTRSA9ICg8VCBleHRlbmRzIFpvZE9iamVjdD4oXG4gICAgICBfcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gICAgICBfcmVwbHk6IEZhc3RpZnlSZXBseSxcbiAgICAgIF9ldmVudHM6IFQsXG4gICAgKSA9PiBjcmVhdGVTU0VGYWN0b3J5KF9yZXF1ZXN0LnNvY2tldCwgX3JlcGx5LCBfZXZlbnRzKSkuYmluZChudWxsLCByZXF1ZXN0LCByZXBseSk7XG5cbiAgICAvLyBsb2NhbGUg6rCQ7KeAXG4gICAgY29uc3QgbG9jYWxlID1cbiAgICAgIHRoaXMuZGV0ZWN0TG9jYWxlKHJlcXVlc3QuaGVhZGVyc1tcImFjY2VwdC1sYW5ndWFnZVwiXSwgdGhpcy5jb25maWcuaTE4bi5zdXBwb3J0ZWRMb2NhbGVzKSA/P1xuICAgICAgdGhpcy5jb25maWcuaTE4bi5kZWZhdWx0TG9jYWxlO1xuXG4gICAgLy8gYXV0aCBjb250ZXh0IOy2lOqwgFxuICAgIGNvbnN0IGhlYWRlcnMgPSBjb252ZXJ0RmFzdGlmeUhlYWRlcnNUb1N0YW5kYXJkKHJlcXVlc3QuaGVhZGVycyk7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IChhd2FpdCB0aGlzLmF1dGhWYWx1ZT8uYXBpLmdldFNlc3Npb24oeyBoZWFkZXJzIH0pKSA/PyBudWxsO1xuXG4gICAgY29uc3QgY29udGV4dDogQ29udGV4dCA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShcbiAgICAgIGNvbmZpZy5jb250ZXh0UHJvdmlkZXIoXG4gICAgICAgIHtcbiAgICAgICAgICB0cmFuc3BvcnQ6IFwiaHR0cFwiLFxuICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgcmVwbHksXG4gICAgICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgICAgIGNyZWF0ZVNTRSxcbiAgICAgICAgICBuYWl0ZVN0b3JlOiBuZXcgTWFwKCksXG4gICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgIC8vIGF1dGhcbiAgICAgICAgICB1c2VyOiBzZXNzaW9uPy51c2VyID8/IG51bGwsXG4gICAgICAgICAgc2Vzc2lvbjogc2Vzc2lvbj8uc2Vzc2lvbiA/PyBudWxsLFxuICAgICAgICB9LFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICByZXBseSxcbiAgICAgICksXG4gICAgKTtcbiAgICByZXR1cm4gY29udGV4dDtcbiAgfVxuXG4gIC8vIHNlc3Npb24vbG9jYWxlL3N0b3JlIOqwmeydgCDqs7XthrUgc3RhdGXripQgSFRUUCBjb250ZXh07JmAIOqzteycoO2VmOuQmCwgcmVwbHkvY3JlYXRlU1NFIOqwmeydgCBIVFRQIOyghOyaqSBoZWxwZXLripQg64W47Lac7ZWY7KeAIOyViuydjFxuICAvLyDsgqzsmqnsnpDqsIAgd2Vic29ja2V0Q29udGV4dFByb3ZpZGVy66W8IOyjvOuptCDqt7jrjIDroZwg7JyE7J6E7ZWY6rOgLCDsl4bsnLzrqbQg6riw7KG0IGNvbnRleHRQcm92aWRlcuulvCByZXBseS9TU0Ugc3R1YuqzvCDtlajqu5gg7J6s7Zmc7Jqp7ZWoXG4gIGFzeW5jIGNyZWF0ZVdlYlNvY2tldENvbnRleHQoXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIHdzOiBBbnlXZWJTb2NrZXRDb25uZWN0aW9uLFxuICApOiBQcm9taXNlPFdlYlNvY2tldENvbnRleHQ+IHtcbiAgICBjb25zdCBsb2NhbGUgPVxuICAgICAgdGhpcy5kZXRlY3RMb2NhbGUocmVxdWVzdC5oZWFkZXJzW1wiYWNjZXB0LWxhbmd1YWdlXCJdLCB0aGlzLmNvbmZpZy5pMThuLnN1cHBvcnRlZExvY2FsZXMpID8/XG4gICAgICB0aGlzLmNvbmZpZy5pMThuLmRlZmF1bHRMb2NhbGU7XG5cbiAgICBjb25zdCBoZWFkZXJzID0gY29udmVydEZhc3RpZnlIZWFkZXJzVG9TdGFuZGFyZChyZXF1ZXN0LmhlYWRlcnMpO1xuICAgIGNvbnN0IHNlc3Npb24gPSAoYXdhaXQgdGhpcy5hdXRoVmFsdWU/LmFwaS5nZXRTZXNzaW9uKHsgaGVhZGVycyB9KSkgPz8gbnVsbDtcblxuICAgIGNvbnN0IGRlZmF1bHRDb250ZXh0ID0ge1xuICAgICAgdHJhbnNwb3J0OiBcIndzXCIgYXMgY29uc3QsXG4gICAgICByZXF1ZXN0LFxuICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgd3MsXG4gICAgICBuYWl0ZVN0b3JlOiBuZXcgTWFwKCksXG4gICAgICBsb2NhbGUsXG4gICAgICB1c2VyOiBzZXNzaW9uPy51c2VyID8/IG51bGwsXG4gICAgICBzZXNzaW9uOiBzZXNzaW9uPy5zZXNzaW9uID8/IG51bGwsXG4gICAgfTtcblxuICAgIGlmIChjb25maWcud2Vic29ja2V0Q29udGV4dFByb3ZpZGVyKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi4oYXdhaXQgUHJvbWlzZS5yZXNvbHZlKGNvbmZpZy53ZWJzb2NrZXRDb250ZXh0UHJvdmlkZXIoZGVmYXVsdENvbnRleHQsIHJlcXVlc3QpKSksXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIHJlcGx5L2NyZWF0ZVNTReyXkCDsnZjsobTtlZjripQgY29udGV4dFByb3ZpZGVy6rCAIOyeiOycvOuptCDsponsi5wg7JeQ65+s66W8IOuNmOyguCB0cmFuc3BvcnQgbWlzdXNl66W8IOu5qOumrCDrk5zrn6zrg4RcbiAgICBjb25zdCByZXBseVN0dWIgPSBjcmVhdGVXZWJTb2NrZXRSZXBseVN0dWIoKTtcbiAgICBjb25zdCBodHRwTGlrZUNvbnRleHQgPSBhd2FpdCBQcm9taXNlLnJlc29sdmUoXG4gICAgICBjb25maWcuY29udGV4dFByb3ZpZGVyKFxuICAgICAgICB7XG4gICAgICAgICAgdHJhbnNwb3J0OiBcImh0dHBcIixcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIHJlcGx5OiByZXBseVN0dWIsXG4gICAgICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgICAgIGNyZWF0ZVNTRTogY3JlYXRlVW5hdmFpbGFibGVTU0UsXG4gICAgICAgICAgbmFpdGVTdG9yZTogZGVmYXVsdENvbnRleHQubmFpdGVTdG9yZSxcbiAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgdXNlcjogZGVmYXVsdENvbnRleHQudXNlcixcbiAgICAgICAgICBzZXNzaW9uOiBkZWZhdWx0Q29udGV4dC5zZXNzaW9uLFxuICAgICAgICB9LFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICByZXBseVN0dWIsXG4gICAgICApLFxuICAgICk7XG5cbiAgICBjb25zdCB7XG4gICAgICB0cmFuc3BvcnQ6IF90cmFuc3BvcnQsXG4gICAgICByZXBseTogX3JlcGx5LFxuICAgICAgY3JlYXRlU1NFOiBfY3JlYXRlU1NFLFxuICAgICAgYnVmZmVyZWRGaWxlczogX2J1ZmZlcmVkRmlsZXMsXG4gICAgICB1cGxvYWRlZEZpbGVzOiBfdXBsb2FkZWRGaWxlcyxcbiAgICAgIC4uLnJlc3RcbiAgICB9ID0gaHR0cExpa2VDb250ZXh0O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnJlc3QsXG4gICAgICB0cmFuc3BvcnQ6IFwid3NcIixcbiAgICAgIHJlcXVlc3QsXG4gICAgICBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnMsXG4gICAgICB3cyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFjY2VwdC1MYW5ndWFnZSDtl6TrjZTsl5DshJwg7KeA7JuQ7ZWY64qUIGxvY2FsZeydhCDssL7sirXri4jri6QuXG4gICAqIEBleGFtcGxlIFwia28tS1Isa287cT0wLjksZW47cT0wLjhcIiDihpIgXCJrb1wiXG4gICAqL1xuICBwcml2YXRlIGRldGVjdExvY2FsZShcbiAgICBhY2NlcHRMYW5ndWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHN1cHBvcnRlZDogc3RyaW5nW10sXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFhY2NlcHRMYW5ndWFnZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIC8vIEFjY2VwdC1MYW5ndWFnZToga28tS1Isa287cT0wLjksZW47cT0wLjhcbiAgICBjb25zdCBsYW5ncyA9IGFjY2VwdExhbmd1YWdlLnNwbGl0KFwiLFwiKS5tYXAoKGxhbmcpID0+IHtcbiAgICAgIGNvbnN0IFtjb2RlXSA9IGxhbmcuc3BsaXQoXCI7XCIpO1xuICAgICAgcmV0dXJuIGNvZGUudHJpbSgpLnNwbGl0KFwiLVwiKVswXTsgLy8ga28tS1Ig4oaSIGtvXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbGFuZ3MuZmluZCgobGFuZykgPT4gc3VwcG9ydGVkLmluY2x1ZGVzKGxhbmcpKTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0V2F0Y2hlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyB3YXRjaGVyIOuqqOuTiOydgCBmaWxlLXBhdHRlcm5zIOKGkiBTb25hbXUg7Iic7ZmY7J2EIO2UvO2VmOq4sCDsnITtlbQgZHluYW1pYyBpbXBvcnQg7ZWp64uI64ukLlxuICAgIGNvbnN0IHsgc2V0dXBXYXRjaGVyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zeW5jZXIvd2F0Y2hlclwiKTtcbiAgICB0aGlzLndhdGNoZXIgPSBhd2FpdCBzZXR1cFdhdGNoZXIoKGZpbGVFdmVudHMpID0+IHRoaXMucnVuSG1yU3luY0N5Y2xlKGZpbGVFdmVudHMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYXRjaGVy6rCAIDEwMG1zIGJhdGNo66GcIOuqqOydgCBmaWxlRXZlbnRzIO2VmOuCmOyXkCDrjIDtlbQg7ZWcIOuyiOydmCBITVIvc3luYyDsgqzsnbTtgbTsnYQg64+V64uI64ukLlxuICAgKiBiYXRjaCDtgZDsnokg642V7JeQIO2VnCDsi5zsoJDsl5Ag7ZWY64KY66eMIOyLpO2WieuQqOydtCDrs7TsnqXrkKnri4jri6QgKGV2ZW50LWJhdGNoZXLqsIAg7KeB66Cs7ZmUKS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcnVuSG1yU3luY0N5Y2xlKGZpbGVFdmVudHM6IE1hcDxBYnNvbHV0ZVBhdGgsIFwiY2hhbmdlXCIgfCBcImFkZFwiPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgZXZlbnRdIG9mIGZpbGVFdmVudHMpIHtcbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUodGhpcy5hcHBSb290UGF0aCwgZmlsZVBhdGgpO1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChgRGV0ZWN0ZWQoJHtldmVudH0pOiAke2NoYWxrLmJsdWUocmVsYXRpdmVQYXRoKX1gKSk7XG4gICAgfVxuXG4gICAgLy8g67O47LK0OiDrs4Dqsr0g7Z2h7IiYICsg7LK07YGs7ISsIOqwseyLoC5cbiAgICBhd2FpdCB0aGlzLnN5bmNlci5obXJBbmRTeW5jKGZpbGVFdmVudHMpO1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLnJlbmV3Q2hlY2tzdW1zKCk7XG5cbiAgICBjb25zdCB0b3RhbFRpbWUgPSBEYXRlLm5vdygpIC0gc3RhcnRlZEF0O1xuICAgIGNvbnN0IG1zZyA9IGBITVIgRG9uZSEgJHtjaGFsay5ib2xkLndoaXRlKGAke3RvdGFsVGltZX1tc2ApfWA7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYmxhY2suYmdHcmVlbihjZW50ZXJUZXh0KG1zZykpKTtcbiAgfVxuXG4gIC8qXG4gICAgIEEgZnVuY3Rpb24gdGhhdCBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgaW5pdCBhbmQgZGVzdHJveSB3aGVuIHVzaW5nIFNvbmFtdSB2aWEgc2NyaXB0cy5cbiAgKi9cbiAgYXN5bmMgcnVuU2NyaXB0KGZuOiAoKSA9PiBQcm9taXNlPHZvaWQ+KSB7XG4gICAgYXdhaXQgdGhpcy5pbml0KHRydWUsIGZhbHNlLCB1bmRlZmluZWQsIGZhbHNlKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZm4oKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGhpcy5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWdpc3RlclBsdWdpbnMoc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UsIHBsdWdpbnM6IFNvbmFtdVNlcnZlck9wdGlvbnNbXCJwbHVnaW5zXCJdKSB7XG4gICAgaWYgKCFwbHVnaW5zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gcm91dGUoKSDsi5zsoJDsl5Ag7Iuk7ZaJ65CY64qUIG9uUm91dGUg7ZuF7J20IOyEpOy5mOuQmOuPhOuhnSDtlIzrn6zqt7jsnbgg65Ox66GdIOyZhOujjOulvCDquLDri6Trpr3ri4jri6QuXG4gICAgLy8gY29tcHJlc3Mg7ZSM65+s6re47J247J2AIOuLpOuluCDtlIzrn6zqt7jsnbjrs7Tri6Qg66i87KCAIOuTseuhneuQmOyWtOyVvCDtlanri4jri6QuXG4gICAgaWYgKHBsdWdpbnMuY29tcHJlc3MpIHtcbiAgICAgIGNvbnN0IGNvbXByZXNzUGx1Z2luID0gKGF3YWl0IGltcG9ydChcIkBmYXN0aWZ5L2NvbXByZXNzXCIpKS5kZWZhdWx0O1xuICAgICAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgICAgIHRocmVzaG9sZDogMTAyNCxcbiAgICAgICAgZW5jb2RpbmdzOiAvKiBTQUZFVFk6IEFQSSDrjbDsvZTroIjsnbTthLDsmYAgWm9kIOqygOymneq4sCDrk7HroZ0g6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gW1xuICAgICAgICAgIFwiYnJcIixcbiAgICAgICAgICBcImd6aXBcIixcbiAgICAgICAgICBcImRlZmxhdGVcIixcbiAgICAgICAgXSBhcyAoXCJiclwiIHwgXCJnemlwXCIgfCBcImRlZmxhdGVcIilbXSxcbiAgICAgIH07XG5cbiAgICAgIGlmIChwbHVnaW5zLmNvbXByZXNzID09PSB0cnVlKSB7XG4gICAgICAgIGF3YWl0IHNlcnZlci5yZWdpc3Rlcihjb21wcmVzc1BsdWdpbiwgZGVmYXVsdE9wdGlvbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgc2VydmVyLnJlZ2lzdGVyKGNvbXByZXNzUGx1Z2luLCB7XG4gICAgICAgICAgLi4uZGVmYXVsdE9wdGlvbnMsXG4gICAgICAgICAgLi4ucGx1Z2lucy5jb21wcmVzcyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcGx1Z2luc01vZHVsZXMgPSB7XG4gICAgICBjb3JzOiBcIkBmYXN0aWZ5L2NvcnNcIixcbiAgICAgIGZvcm1ib2R5OiBcIkBmYXN0aWZ5L2Zvcm1ib2R5XCIsXG4gICAgICBtdWx0aXBhcnQ6IFwiQGZhc3RpZnkvbXVsdGlwYXJ0XCIsXG4gICAgICBxczogXCJmYXN0aWZ5LXFzXCIsXG4gICAgICBzc2U6IFwiZmFzdGlmeS1zc2UtdjJcIixcbiAgICAgIHN0YXRpYzogXCJAZmFzdGlmeS9zdGF0aWNcIixcbiAgICB9IGFzIGNvbnN0O1xuXG4gICAgY29uc3QgcmVnaXN0ZXJQbHVnaW4gPSBhc3luYyA8SyBleHRlbmRzIGtleW9mIE5vbk51bGxhYmxlPHR5cGVvZiBwbHVnaW5zPj4oXG4gICAgICBrZXk6IEssXG4gICAgICBwbHVnaW5OYW1lOiBzdHJpbmcsXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBvcHRpb24gPSBwbHVnaW5zW2tleV07XG4gICAgICBpZiAoIW9wdGlvbikgcmV0dXJuO1xuXG4gICAgICBpZiAob3B0aW9uID09PSB0cnVlKSB7XG4gICAgICAgIGF3YWl0IHNlcnZlci5yZWdpc3RlcigoYXdhaXQgaW1wb3J0KHBsdWdpbk5hbWUpKS5kZWZhdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHNlcnZlci5yZWdpc3RlcigoYXdhaXQgaW1wb3J0KHBsdWdpbk5hbWUpKS5kZWZhdWx0LCBvcHRpb24pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHBsdWdpbk5hbWVdIG9mIE9iamVjdC5lbnRyaWVzKHBsdWdpbnNNb2R1bGVzKSkge1xuICAgICAgYXdhaXQgcmVnaXN0ZXJQbHVnaW4oXG4gICAgICAgIC8qIFNBRkVUWTogQVBJIOuNsOy9lOugiOydtO2EsOyZgCBab2Qg6rKA7Kad6riwIOuTseuhnSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBrZXkgYXMga2V5b2YgdHlwZW9mIHBsdWdpbnMsXG4gICAgICAgIHBsdWdpbk5hbWUsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChwbHVnaW5zLndzKSB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZVdlYlNvY2tldFBsdWdpbihzZXJ2ZXIpO1xuICAgIH1cblxuICAgIGlmIChwbHVnaW5zLmN1c3RvbSkge1xuICAgICAgcGx1Z2lucy5jdXN0b20oc2VydmVyKTtcbiAgICB9XG4gIH1cblxuICAvLyBAZmFzdGlmeS93ZWJzb2NrZXTsnYAgcGx1Z2lucy53c+qwgCDshKTsoJXrkJwg6rK97Jqw7JeQ66eMIOuTseuhne2VmOqzoCwg6rCZ7J2AIHNlcnZlcuyXkCDspJHrs7Ug65Ox66Gd65CY7KeAIOyViuuPhOuhnSBXZWFrU2V07Jy866GcIOq4sOuhne2VqFxuICBwcml2YXRlIGFzeW5jIGVuc3VyZVdlYlNvY2tldFBsdWdpbihcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy53ZWJzb2NrZXRQbHVnaW5TZXJ2ZXJzLmhhcyhzZXJ2ZXIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGx1Z2luT3B0aW9uID0gdGhpcy5jb25maWcuc2VydmVyLnBsdWdpbnM/LndzO1xuICAgIGlmICghcGx1Z2luT3B0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd2Vic29ja2V0UGx1Z2luID0gKGF3YWl0IGltcG9ydChcIkBmYXN0aWZ5L3dlYnNvY2tldFwiKSkuZGVmYXVsdDtcbiAgICBjb25zdCByZXNvbHZlZFBsdWdpbk9wdGlvbnMgPSByZXNvbHZlV2ViU29ja2V0UGx1Z2luT3B0aW9ucyh7XG4gICAgICByYXdQbHVnaW5PcHRpb246IHBsdWdpbk9wdGlvbixcbiAgICB9KTtcbiAgICBpZiAocmVzb2x2ZWRQbHVnaW5PcHRpb25zKSB7XG4gICAgICBhd2FpdCBzZXJ2ZXIucmVnaXN0ZXIod2Vic29ja2V0UGx1Z2luLCByZXNvbHZlZFBsdWdpbk9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBzZXJ2ZXIucmVnaXN0ZXIod2Vic29ja2V0UGx1Z2luKTtcbiAgICB9XG5cbiAgICB0aGlzLndlYnNvY2tldFBsdWdpblNlcnZlcnMuYWRkKHNlcnZlcik7XG4gICAgdGhpcy53YXJuT25Qb3RlbnRpYWxXZWJTb2NrZXRUaW1lb3V0Q29uZmxpY3RzKHNlcnZlcik7XG4gIH1cblxuICAvLyBoZWFydGJlYXQgaW50ZXJ2YWzsnbQgRmFzdGlmeSBrZWVwQWxpdmVUaW1lb3V0IOydtOyDgeydtOuptCDsnbjtlITrnbzqsIAg66i87KCAIGlkbGUg7Jew6rKw7J2EIOuBiuydhCDsiJgg7J6I7Ja0IOqyveqzoOunjCDrgqjquLDqs6Ag64SY7Ja06rCQXG4gIHByaXZhdGUgd2Fybk9uUG90ZW50aWFsV2ViU29ja2V0VGltZW91dENvbmZsaWN0cyhcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+LFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBoZWFydGJlYXRzID0gdGhpcy5zeW5jZXIuYXBpc1xuICAgICAgLm1hcCgoYXBpKSA9PiBhcGkud2Vic29ja2V0T3B0aW9ucz8uaGVhcnRiZWF0ID8/IDMwMDAwKVxuICAgICAgLmZpbHRlcigoaGVhcnRiZWF0KSA9PiBoZWFydGJlYXQgPiAwKTtcblxuICAgIGlmIChoZWFydGJlYXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGtlZXBBbGl2ZVRpbWVvdXQgPSB0aGlzLmNvbmZpZy5zZXJ2ZXIuZmFzdGlmeT8ua2VlcEFsaXZlVGltZW91dDtcbiAgICBpZiAoIWtlZXBBbGl2ZVRpbWVvdXQgfHwga2VlcEFsaXZlVGltZW91dCA8PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbGFyZ2VzdEhlYXJ0YmVhdCA9IE1hdGgubWF4KC4uLmhlYXJ0YmVhdHMpO1xuICAgIGlmIChsYXJnZXN0SGVhcnRiZWF0ID49IGtlZXBBbGl2ZVRpbWVvdXQpIHtcbiAgICAgIHNlcnZlci5sb2cud2FybihcbiAgICAgICAge1xuICAgICAgICAgIGtlZXBBbGl2ZVRpbWVvdXQsXG4gICAgICAgICAgbGFyZ2VzdEhlYXJ0YmVhdCxcbiAgICAgICAgfSxcbiAgICAgICAgXCJXZWJTb2NrZXQgaGVhcnRiZWF0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBrZWVwQWxpdmVUaW1lb3V0OyBhbGlnbiBpbmZyYXN0cnVjdHVyZSBpZGxlIHRpbWVvdXRzIHRvIGF2b2lkIHVuZXhwZWN0ZWQgZGlzY29ubmVjdHMuXCIsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBiZXR0ZXItYXV0aCDrnbzsmrDtirjrpbwg65Ox66Gd7ZWp64uI64ukLlxuICAgKiAvYXBpL2F1dGgvKiDqsr3roZzroZwg7J247KadIEFQSeqwgCDsnpDrj5kg65Ox66Gd65Cp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWdpc3RlckJldHRlckF1dGgoXG4gICAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UsXG4gICAgb3B0aW9uczogTm9uTnVsbGFibGU8U29uYW11U2VydmVyT3B0aW9uc1tcImF1dGhcIl0+LFxuICApIHtcbiAgICBpZiAoIW9wdGlvbnMpIHJldHVybjtcblxuICAgIGNvbnN0IGJhc2VQYXRoID0gb3B0aW9ucy5iYXNlUGF0aCA/PyBcIi9hcGkvYXV0aFwiO1xuXG4gICAgLy8gYmV0dGVyLWF1dGgg65287Jqw7Yq4IOuTseuhnVxuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFtcIkdFVFwiLCBcIlBPU1RcIl0sXG4gICAgICB1cmw6IGAke2Jhc2VQYXRofS8qYCxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXV0aC5oYW5kbGVyKFxuICAgICAgICAgIGNyZWF0ZUJldHRlckF1dGhSZXF1ZXN0KHJlcXVlc3QsIG9wdGlvbnMuYWR2YW5jZWQ/LmlwQWRkcmVzcz8uaXBBZGRyZXNzSGVhZGVycyksXG4gICAgICAgICk7XG5cbiAgICAgICAgcmVwbHkuc3RhdHVzKHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgIHJlc3BvbnNlLmhlYWRlcnMuZm9yRWFjaCgodmFsdWU6IHN0cmluZywga2V5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICByZXBseS5oZWFkZXIoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVwbHkuc2VuZChyZXNwb25zZS5ib2R5ID8gYXdhaXQgcmVzcG9uc2UudGV4dCgpIDogbnVsbCk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcmludFN0YXJ0dXBTdW1tYXJ5KCkge1xuICAgIGNvbnN0IGFjdGl2ZVByZXNldCA9IGdldFNvbmFtdUVudmlyb25tZW50KCk7XG5cbiAgICBwcmludERpbVN1bW1hcnkoYENvbmZpZyBsb2FkZWQke2Zvcm1hdFRpbWUodGhpcy5jb25maWdFbGFwc2VkKX1gKTtcblxuICAgIC8vIERCIHByZXNldCDrqqnroZ1cbiAgICBwcmludEdyZWVuU3VtbWFyeShcIkRCXCIpO1xuICAgIGNvbnN0IHsgaXNMb2NhbCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvY29udHJvbGxlclwiKTtcbiAgICBjb25zdCBwcmVzZXROYW1lcyA9XG4gICAgICAvKiBTQUZFVFk6IEFQSSDrjbDsvZTroIjsnbTthLDsmYAgWm9kIOqygOymneq4sCDrk7HroZ0g6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gT2JqZWN0LmtleXMoXG4gICAgICAgIHRoaXMuZGJDb25maWcsXG4gICAgICApIGFzIChrZXlvZiBTb25hbXVEQkNvbmZpZylbXTtcbiAgICBjb25zdCBtYXhMZW4gPSBNYXRoLm1heCguLi5wcmVzZXROYW1lcy5tYXAoKG4pID0+IG4ubGVuZ3RoKSk7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHByZXNldE5hbWVzKSB7XG4gICAgICBjb25zdCBjb25uID1cbiAgICAgICAgLyogU0FGRVRZOiBBUEkg642w7L2U66CI7J207YSw7JmAIFpvZCDqsoDspp3quLAg65Ox66GdIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHRoaXNcbiAgICAgICAgICAuZGJDb25maWdbbmFtZV0uY29ubmVjdGlvbiBhc1xuICAgICAgICAgIHwgeyBob3N0Pzogc3RyaW5nOyBwb3J0PzogbnVtYmVyOyBkYXRhYmFzZT86IHN0cmluZyB9XG4gICAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBob3N0ID0gY29ubj8uaG9zdCA/PyBcImxvY2FsaG9zdFwiO1xuICAgICAgY29uc3QgYWRkciA9IGBAICR7aG9zdH06JHtjb25uPy5wb3J0ID8/IDU0MzJ9LyR7Y29ubj8uZGF0YWJhc2UgPz8gXCIodW5rbm93bilcIn1gO1xuICAgICAgY29uc3QgcGFkZGVkID0gbmFtZS5wYWRFbmQobWF4TGVuKTtcbiAgICAgIGNvbnN0IHJlbW90ZVRhZyA9IGlzTG9jYWwoKSAmJiAhaXNMb2NhbEhvc3QoaG9zdCkgPyBjaGFsay55ZWxsb3coYCBcXHUyNmEwIHJlbW90ZWApIDogXCJcIjtcblxuICAgICAgaWYgKG5hbWUgPT09IGFjdGl2ZVByZXNldCkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihgICBcXHUyNWI4ICR7cGFkZGVkfSAke2FkZHJ9YCkgKyByZW1vdGVUYWcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKGAgICAgJHtwYWRkZWR9ICR7YWRkcn1gKSArIHJlbW90ZVRhZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLnNlcnZlci5hdXRoKSB7XG4gICAgICBjb25zdCBiYXNlUGF0aCA9IHRoaXMuY29uZmlnLnNlcnZlci5hdXRoLmJhc2VQYXRoID8/IFwiL2FwaS9hdXRoXCI7XG4gICAgICBwcmludERpbVN1bW1hcnkoYEF1dGg6IGJldHRlci1hdXRoIGF0ICR7YmFzZVBhdGh9LypgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29uZmlnLmFwaS50aW1lem9uZSkge1xuICAgICAgcHJpbnREaW1TdW1tYXJ5KGBUaW1lem9uZTogJHt0aGlzLmNvbmZpZy5hcGkudGltZXpvbmV9YCk7XG4gICAgfVxuICAgIHByaW50R3JlZW5TdW1tYXJ5KGBTb25hbXUgcmVhZHkke2Zvcm1hdFRpbWUodGhpcy5pbml0RWxhcHNlZCl9YCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemVDYWNoZShjb25maWc6IENhY2hlQ29uZmlnIHwgdW5kZWZpbmVkLCBmb3JUZXN0aW5nOiBib29sZWFuKSB7XG4gICAgY29uc3QgeyBzZXRDYWNoZU1hbmFnZXJSZWYgfSA9IGF3YWl0IGltcG9ydChcIi4uL2NhY2hlL2RlY29yYXRvclwiKTtcblxuICAgIC8vIO2FjOyKpO2KuCDtmZjqsr3sl5DshJwg66mU66qo66asIOuTnOudvOydtOuyhCDsnpDrj5kg7IKs7JqpXG4gICAgaWYgKGZvclRlc3RpbmcpIHtcbiAgICAgIGNvbnN0IHsgY3JlYXRlVGVzdENhY2hlTWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vY2FjaGUvY2FjaGUtbWFuYWdlclwiKTtcbiAgICAgIHRoaXMuY2FjaGVWYWx1ZSA9IGNyZWF0ZVRlc3RDYWNoZU1hbmFnZXIoKTtcbiAgICAgIHNldENhY2hlTWFuYWdlclJlZih0aGlzLmNhY2hlVmFsdWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOyEpOygleydtCDsl4bsnLzrqbQg7LqQ7IucIOu5hO2ZnOyEse2ZlFxuICAgIGlmICghY29uZmlnKSB7XG4gICAgICBzZXRDYWNoZU1hbmFnZXJSZWYobnVsbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g7ISk7KCV7JeQIOuUsOudvCBDYWNoZU1hbmFnZXIg7IOd7ISxXG4gICAgY29uc3QgeyBjcmVhdGVDYWNoZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2NhY2hlL2NhY2hlLW1hbmFnZXJcIik7XG4gICAgdGhpcy5jYWNoZVZhbHVlID0gY3JlYXRlQ2FjaGVNYW5hZ2VyKGNvbmZpZyk7XG4gICAgc2V0Q2FjaGVNYW5hZ2VyUmVmKHRoaXMuY2FjaGVWYWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemVXb3JrZmxvd3Mob3B0aW9uczogU29uYW11VGFza09wdGlvbnMgfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCB7IFdvcmtmbG93TWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdGFza3Mvd29ya2Zsb3ctbWFuYWdlclwiKTtcbiAgICAvLyBOT1RFOiBAc29uYW11LWtpdC90YXNrcyDslYjsl5DshKAga25leCBjb25maWfrpbwg7IiY7KCV7ZWY6riwIOuVjOusuOyXkCBjb25uZWN0aW9u7J20IOyVhOuLjCBjb25maWcg7Ke466GcIOuztOuDheuLiOuLpC5cbiAgICB0aGlzLndvcmtmbG93c1ZhbHVlID0gbmV3IFdvcmtmbG93TWFuYWdlcihEQi5nZXREQkNvbmZpZyhcIndcIikpO1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVuYWJsZVdvcmtlciA9IG9wdGlvbnMuZW5hYmxlV29ya2VyID8/IGlzRGFlbW9uU2VydmVyKCk7XG4gICAgY29uc3QgZGVmYXVsdFdvcmtlck9wdGlvbnMgPSB7XG4gICAgICBjb25jdXJyZW5jeTogb3MuY3B1cygpLmxlbmd0aCAtIDEsXG4gICAgICB1c2VQdWJTdWI6IHRydWUsXG4gICAgICBsaXN0ZW5EZWxheTogNTAwLFxuICAgIH07XG5cbiAgICBpZiAoZW5hYmxlV29ya2VyKSB7XG4gICAgICB0aGlzLndvcmtmbG93cy5zZXR1cFdvcmtlcih7XG4gICAgICAgIC4uLmRlZmF1bHRXb3JrZXJPcHRpb25zLFxuICAgICAgICAuLi5vcHRpb25zLndvcmtlck9wdGlvbnMsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJvb3Qoc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UsIG9wdGlvbnM6IFNvbmFtdVNlcnZlck9wdGlvbnMpIHtcbiAgICBjb25zdCBwb3J0ID0gb3B0aW9ucy5saXN0ZW4/LnBvcnQgPz8gMzAwMDtcbiAgICBjb25zdCBob3N0ID0gb3B0aW9ucy5saXN0ZW4/Lmhvc3QgPz8gXCJsb2NhbGhvc3RcIjtcblxuICAgIHNlcnZlci5hZGRIb29rKFwib25DbG9zZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBvcHRpb25zLmxpZmVjeWNsZT8ub25TaHV0ZG93bj8uKHNlcnZlcik7XG4gICAgICBhd2FpdCB0aGlzLndvcmtmbG93cy5kZXN0cm95KCk7XG4gICAgICBhd2FpdCB0aGlzLmRlc3Ryb3koKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHNodXRkb3duID0gYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc2VydmVyLmNsb3NlKCk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZHVyaW5nIHNodXRkb3duOlwiLCBlcnIpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgc2h1dGRvd24pO1xuICAgIHByb2Nlc3Mub24oXCJTSUdURVJNXCIsIHNodXRkb3duKTtcblxuICAgIGlmIChvcHRpb25zLmxpZmVjeWNsZT8ub25FcnJvcikge1xuICAgICAgc2VydmVyLnNldEVycm9ySGFuZGxlcihvcHRpb25zLmxpZmVjeWNsZT8ub25FcnJvcik7XG4gICAgfVxuXG4gICAgc2VydmVyXG4gICAgICAubGlzdGVuKHsgcG9ydCwgaG9zdCB9KVxuICAgICAgLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLndvcmtmbG93cy5zdGFydFdvcmtlcigpO1xuICAgICAgICBhd2FpdCBvcHRpb25zLmxpZmVjeWNsZT8ub25TdGFydD8uKHNlcnZlcik7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGFzeW5jIChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoXCJGYWlsZWQgdG8gc3RhcnQgc2VydmVyOlwiLCBlcnIpKTtcbiAgICAgICAgYXdhaXQgc2h1dGRvd24oKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZGVzdHJveSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGhhc0V4dGVybmFsTG9nVGFwZUNvbmZpZ3VyYXRpb24gfSA9IGF3YWl0IGltcG9ydChcIi4uL2xvZ2dlci9jb25maWd1cmVcIik7XG4gICAgY29uc3QgeyBCYXNlTW9kZWwgfSA9IGF3YWl0IGltcG9ydChcIi4uL2RhdGFiYXNlL2Jhc2UtbW9kZWxcIik7XG4gICAgLy8g66i87KCAIOyymOumrO2VtOyVvO2VqC5cbiAgICBhd2FpdCBCYXNlTW9kZWwuZGVzdHJveSgpO1xuICAgIC8vIFdlYlNvY2tldCBzaHV0ZG93biBmaXJzdCB0byBmbHVzaCB0ZWxlbWV0cnlcbiAgICBpZiAodGhpcy53ZWJzb2NrZXRSdW50aW1lVmFsdWUpIHtcbiAgICAgIGF3YWl0IHRoaXMud2Vic29ja2V0UnVudGltZVZhbHVlLnNodXRkb3duKCk7XG4gICAgfVxuICAgIHRoaXMud2Vic29ja2V0UnVudGltZVZhbHVlID0gbnVsbDtcbiAgICAvLyBUaGVuIHNodXQgZG93biByZW1haW5pbmcgcmVzb3VyY2VzIGluIHBhcmFsbGVsXG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtcbiAgICAgIHRoaXMud29ya2Zsb3dzVmFsdWU/LmRlc3Ryb3koKSA/PyBQcm9taXNlLnJlc29sdmUoKSxcbiAgICAgIHRoaXMuY2FjaGVWYWx1ZT8uZGlzY29ubmVjdCgpID8/IFByb21pc2UucmVzb2x2ZSgpLFxuICAgICAgdGhpcy5kZXZWaXRlc3RNYW5hZ2VyVmFsdWU/LnNodXRkb3duKCkgPz8gUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgICB0aGlzLndhdGNoZXI/LmNsb3NlKCkgPz8gUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgXSk7XG4gICAgLy8gTG9nVGFwZSBkaXNwb3NlIGFmdGVyIFdTIHNodXRkb3duIHNvIHRlbGVtZXRyeSByZWNvcmRzIGFyZSBmbHVzaGVkIGZpcnN0XG4gICAgaWYgKCFoYXNFeHRlcm5hbExvZ1RhcGVDb25maWd1cmF0aW9uKCkpIGF3YWl0IGxvZ3RhcGVEaXNwb3NlKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0V2ViU29ja2V0VGVsZW1ldHJ5Q29udGV4dChcbiAgd3M6IEFueVdlYlNvY2tldENvbm5lY3Rpb24sXG4pOiBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uQ29udGV4dCB7XG4gIGlmICghaXNUZWxlbWV0cnlDb250ZXh0UHJvdmlkZXIod3MpKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcmV0dXJuIHdzLmdldFRlbGVtZXRyeUNvbnRleHQoKTtcbn1cblxuZnVuY3Rpb24gaXNUZWxlbWV0cnlDb250ZXh0UHJvdmlkZXIoXG4gIHdzOiBBbnlXZWJTb2NrZXRDb25uZWN0aW9uLFxuKTogd3MgaXMgQW55V2ViU29ja2V0Q29ubmVjdGlvbiAmIFRlbGVtZXRyeUNvbnRleHRQcm92aWRlciB7XG4gIHJldHVybiBcImdldFRlbGVtZXRyeUNvbnRleHRcIiBpbiB3cyAmJiBpc0Z1bmN0aW9uVmFsdWUod3MuZ2V0VGVsZW1ldHJ5Q29udGV4dCk7XG59XG5cbmV4cG9ydCBjb25zdCBTb25hbXUgPSBuZXcgU29uYW11Q2xhc3MoKTtcblxuLyoqXG4gKiBzdHJlYW0g66qo65Oc7JeQ7IScIO2CpCDsg53shLEg7ZWo7IiY6rCAIOyngOygleuQmOyngCDslYrslZjsnYQg65WMIOyCrOyaqe2VmOuKlCDquLDrs7gg7ZWo7IiY7J6F64uI64ukLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0S2V5R2VuZXJhdG9yKGZpbGU6IHsgZmlsZW5hbWU6IHN0cmluZzsgbWltZXR5cGU6IHN0cmluZyB9KTogc3RyaW5nIHtcbiAgY29uc3QgZXh0ID0gbWltZS5leHRlbnNpb24oZmlsZS5taW1ldHlwZSkgfHwgXCJiaW5cIjtcbiAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgcmFuZG9tID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOCk7XG4gIHJldHVybiBgdXBsb2Fkcy8ke3RpbWVzdGFtcH0tJHtyYW5kb219LiR7ZXh0fWA7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFRpbWUobXM6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IGZvcm1hdHRlZCA9IG1zID49IDEwMDAgPyBgJHsobXMgLyAxMDAwKS50b0ZpeGVkKDIpfXNgIDogYCR7TWF0aC5yb3VuZChtcyl9bXNgO1xuICByZXR1cm4gYCAoJHtmb3JtYXR0ZWR9KWA7XG59XG5cbmNvbnN0IExPQ0FMX0hPU1RTID0gbmV3IFNldChbXCJsb2NhbGhvc3RcIiwgXCIxMjcuMC4wLjFcIiwgXCIwLjAuMC4wXCIsIFwiOjoxXCJdKTtcbmZ1bmN0aW9uIGlzTG9jYWxIb3N0KGhvc3Q6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gTE9DQUxfSE9TVFMuaGFzKGhvc3QpIHx8IGhvc3QuZW5kc1dpdGgoXCIubG9jYWxcIik7XG59XG5cbi8vIGAuZXZlcnkoKWDqsIAg7LKrIGd1YXJkIOydtO2bhCDsiJztmozrpbwg66mI7LaU64qUIOusuOygnOqwgCDsnojslrQgYGZvci4uLm9mYOuhnCDrqqjrk6AgZ3VhcmTrpbwg7Iic7ISc64yA66GcIOyLpO2Wie2VmOuPhOuhnSDqs6DsoJXtlahcbmZ1bmN0aW9uIHJ1bkd1YXJkcyh7XG4gIGd1YXJkcyxcbiAgY29uZmlnLFxuICByZXF1ZXN0LFxuICBhcGksXG59OiB7XG4gIGd1YXJkczogRXh0ZW5kZWRBcGlbXCJvcHRpb25zXCJdW1wiZ3VhcmRzXCJdIHwgdW5kZWZpbmVkO1xuICBjb25maWc6IFBpY2s8U29uYW11RmFzdGlmeUNvbmZpZywgXCJndWFyZEhhbmRsZXJcIj47XG4gIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0O1xuICBhcGk6IEV4dGVuZGVkQXBpO1xufSk6IHZvaWQge1xuICBmb3IgKGNvbnN0IGd1YXJkIG9mIGd1YXJkcyA/PyBbXSkge1xuICAgIGNvbmZpZy5ndWFyZEhhbmRsZXIoZ3VhcmQsIHJlcXVlc3QsIGFwaSk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE2R0EsU0FBUyxjQUFxQixPQUEyQjtDQUN2RCxJQUFJLFVBQVUsTUFBTSxPQUFPO0NBQzNCLElBQUksVUFBVSxRQUFXLE9BQU87Q0FDaEMsSUFB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