@decohere/create 0.0.1-dev.43 → 0.0.1-dev.45

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 (47) hide show
  1. package/commonjs/src/models/config-yaml.model.js +58 -4
  2. package/commonjs/src/models/env-file.model.js +14 -1
  3. package/commonjs/src/models/launch-json.model.js +49 -27
  4. package/commonjs/src/models/package-json.model.js +64 -7
  5. package/commonjs/src/models/project.model.js +4 -1
  6. package/commonjs/src/program.js +52 -21
  7. package/commonjs/src/runner.js +13 -2
  8. package/commonjs/src/webapi/api-name.js +95 -0
  9. package/commonjs/src/webapi/const.js +32 -4
  10. package/commonjs/src/webapi/create-api.js +62 -18
  11. package/commonjs/src/webapi/features/auth.feature.js +56 -51
  12. package/commonjs/src/webapi/features/biome-format.js +6 -4
  13. package/commonjs/src/webapi/features/database.feature.js +125 -98
  14. package/commonjs/src/webapi/features/finalize.feature.js +19 -7
  15. package/commonjs/src/webapi/models/api-package-json.model.js +7 -5
  16. package/commonjs/src/webapi/models/main-source-file.model.js +12 -3
  17. package/commonjs/src/webapi/models/production-dockerfile.model.js +76 -36
  18. package/es6/src/models/config-yaml.model.js +47 -1
  19. package/es6/src/models/env-file.model.js +14 -1
  20. package/es6/src/models/launch-json.model.js +49 -27
  21. package/es6/src/models/package-json.model.js +62 -5
  22. package/es6/src/models/project.model.js +4 -1
  23. package/es6/src/program.js +52 -21
  24. package/es6/src/runner.js +13 -2
  25. package/es6/src/webapi/api-name.js +59 -0
  26. package/es6/src/webapi/const.js +18 -5
  27. package/es6/src/webapi/create-api.js +64 -20
  28. package/es6/src/webapi/features/auth.feature.js +56 -51
  29. package/es6/src/webapi/features/biome-format.js +6 -4
  30. package/es6/src/webapi/features/database.feature.js +125 -98
  31. package/es6/src/webapi/features/finalize.feature.js +19 -7
  32. package/es6/src/webapi/models/api-package-json.model.js +8 -6
  33. package/es6/src/webapi/models/main-source-file.model.js +12 -3
  34. package/es6/src/webapi/models/production-dockerfile.model.js +71 -36
  35. package/package.json +2 -2
  36. package/types/src/models/config-yaml.model.d.ts +11 -0
  37. package/types/src/models/env-file.model.d.ts +1 -0
  38. package/types/src/models/launch-json.model.d.ts +2 -0
  39. package/types/src/models/package-json.model.d.ts +16 -6
  40. package/types/src/models/project.model.d.ts +3 -0
  41. package/types/src/webapi/api-name.d.ts +14 -0
  42. package/types/src/webapi/const.d.ts +15 -5
  43. package/types/src/webapi/create-api.d.ts +4 -0
  44. package/types/src/webapi/features/biome-format.d.ts +1 -1
  45. package/types/src/webapi/models/api-package-json.model.d.ts +4 -3
  46. package/types/src/webapi/models/main-source-file.model.d.ts +6 -0
  47. package/types/src/webapi/models/production-dockerfile.model.d.ts +13 -2
@@ -1,4 +1,5 @@
1
- import { basename, resolve } from "node:path";
1
+ import { existsSync } from "node:fs";
2
+ import { basename, join, resolve } from "node:path";
2
3
  import { DockerCompose } from "../models/compose.model.js";
3
4
  import { ConfigYaml } from "../models/config-yaml.model.js";
4
5
  import { WELL_KNOWN_FILES } from "../models/const.js";
@@ -11,7 +12,8 @@ import { MonoRepoScaffold, ProjectScaffold } from "../models/project.model.js";
11
12
  import { TsConfig } from "../models/tsconfig.model.js";
12
13
  import { VSCodeSettings } from "../models/vscode-settings.model.js";
13
14
  import { ScaffoldService } from "../services/scaffold.service.js";
14
- import { WEBAPI_PROJECT_DIR, WEBAPI_RELEASE_ENTRY } from "./const.js";
15
+ import { CreateCliError, isDecohereWorkspace, listExistingApiNames, parseApiNames } from "./api-name.js";
16
+ import { DEFAULT_WEBAPI_NAME, webapiPackageName, webapiPort, webapiProjectDir, webapiReleaseEntry } from "./const.js";
15
17
  import { AuthFeature } from "./features/auth.feature.js";
16
18
  import { DatabaseFeature } from "./features/database.feature.js";
17
19
  import { FinalizeFeature } from "./features/finalize.feature.js";
@@ -33,10 +35,14 @@ const features = [
33
35
  export async function scaffoldApi(cliOptions) {
34
36
  const targetDir = resolve(cliOptions.d ?? ".");
35
37
  const projectName = cliOptions.projectName?.trim() || process.env.DECOHERE_PROJECT_NAME?.trim() || basename(targetDir);
36
- const workspace = createWorkspace(targetDir, projectName);
37
- await ScaffoldService.scaffold(workspace, cliOptions, features);
38
+ const names = parseApiNames(cliOptions.names);
39
+ const workspace = cliOptions.add ? createAddWorkspace(targetDir, projectName, names) : createWorkspace(targetDir, projectName, names);
40
+ await ScaffoldService.scaffold(workspace, {
41
+ ...cliOptions,
42
+ names
43
+ }, features);
38
44
  }
39
- function createWorkspace(targetDir, projectName) {
45
+ function createWorkspace(targetDir, projectName, apiNames) {
40
46
  const monoRepo = new MonoRepoScaffold();
41
47
  monoRepo.targetDir = targetDir;
42
48
  monoRepo.setName(projectName);
@@ -59,21 +65,27 @@ function createWorkspace(targetDir, projectName) {
59
65
  name
60
66
  ]
61
67
  }).addVolume("webapi-node-modules");
62
- const devContainer = new DevContainer().addExtension("biomejs.biome", "vitest.explorer").forwardPort(3000).setPortAttributes(3000, {
63
- label: "API",
64
- requireLocalPort: true
65
- }).setInitializeCommand("bash .devcontainer/initialize.sh").setPostStartCommand("bash .devcontainer/post-start.sh").useCompose();
68
+ const devContainer = new DevContainer().addExtension("biomejs.biome", "vitest.explorer").setInitializeCommand("bash .devcontainer/initialize.sh").setPostStartCommand("bash .devcontainer/post-start.sh").useCompose();
69
+ for (const [index, apiName] of apiNames.entries()){
70
+ const port = webapiPort(index);
71
+ devContainer.forwardPort(port);
72
+ devContainer.setPortAttributes(port, {
73
+ label: apiName === DEFAULT_WEBAPI_NAME ? "API" : apiName,
74
+ requireLocalPort: true
75
+ });
76
+ }
66
77
  // Workspace-level models (repo root)
67
78
  monoRepo.addModel(compose);
68
79
  monoRepo.addModel(devContainer);
69
80
  monoRepo.addModel(new WebapiDevContainer());
70
- monoRepo.addModel(new WebapiProductionDockerfile());
81
+ monoRepo.addModel(new WebapiProductionDockerfile(apiNames));
71
82
  monoRepo.addModel(new GithubCiWorkflows());
72
83
  monoRepo.addModel(new VSCodeSettings(name));
73
- monoRepo.addModel(new LaunchJson());
84
+ monoRepo.addModel(new LaunchJson(apiNames));
74
85
  monoRepo.addModel(new TsConfig());
75
86
  monoRepo.addModel(new PackageJson(`${name}.api`, {
76
- startEntry: WEBAPI_RELEASE_ENTRY
87
+ apiNames,
88
+ workspaceName: name
77
89
  }));
78
90
  monoRepo.addModel(new ConfigYaml(WELL_KNOWN_FILES.CONFIG_YAML, "config/config.yaml", ""));
79
91
  monoRepo.addModel(new ConfigYaml(WELL_KNOWN_FILES.CONFIG_DEV_YAML, "config/config.dev.yaml", ""));
@@ -205,17 +217,49 @@ function createWorkspace(targetDir, projectName) {
205
217
  }
206
218
  ]
207
219
  });
208
- // Project-level models (paths relative to projects/api)
209
- const apiProject = new ProjectScaffold(WEBAPI_PROJECT_DIR);
210
- apiProject.addModel(new ApiPackageJson(name));
211
- apiProject.addModel(new MainSourceFile(`${name}.api`));
220
+ for (const apiName of apiNames){
221
+ addApiProject(monoRepo, name, apiName);
222
+ }
223
+ return monoRepo;
224
+ }
225
+ function createAddWorkspace(targetDir, projectName, apiNames) {
226
+ if (!isDecohereWorkspace(targetDir)) {
227
+ throw new CreateCliError(`Not a Decohere workspace: ${targetDir}. Scaffold one first with \`npx @decohere/create webapi\`.`);
228
+ }
229
+ const existing = listExistingApiNames(targetDir);
230
+ for (const apiName of apiNames){
231
+ if (existing.includes(apiName)) {
232
+ throw new CreateCliError(`API "${apiName}" already exists at ${webapiProjectDir(apiName)}.`);
233
+ }
234
+ }
235
+ const monoRepo = new MonoRepoScaffold();
236
+ monoRepo.targetDir = targetDir;
237
+ monoRepo.setName(projectName);
238
+ const name = monoRepo.name;
239
+ const pkg = PackageJson.fromFile(join(targetDir, "package.json"));
240
+ monoRepo.addModel(pkg);
241
+ monoRepo.addModel(existsSync(join(targetDir, ".env")) ? EnvFile.fromFile(join(targetDir, ".env")) : new EnvFile());
242
+ monoRepo.addModel(existsSync(join(targetDir, "config/config.yaml")) ? ConfigYaml.fromFile(WELL_KNOWN_FILES.CONFIG_YAML, "config/config.yaml", join(targetDir, "config/config.yaml")) : new ConfigYaml(WELL_KNOWN_FILES.CONFIG_YAML, "config/config.yaml", ""));
243
+ monoRepo.addModel(existsSync(join(targetDir, "config/config.dev.yaml")) ? ConfigYaml.fromFile(WELL_KNOWN_FILES.CONFIG_DEV_YAML, "config/config.dev.yaml", join(targetDir, "config/config.dev.yaml")) : new ConfigYaml(WELL_KNOWN_FILES.CONFIG_DEV_YAML, "config/config.dev.yaml", ""));
244
+ for (const [offset, apiName] of apiNames.entries()){
245
+ const port = webapiPort(existing.length + offset);
246
+ pkg.addScript(`start:${apiName}`, `node ${webapiReleaseEntry(apiName)}`);
247
+ pkg.addScript(`dev:${apiName}`, `PORT=${port} flux serve --project ${webapiPackageName(name, apiName)}`);
248
+ addApiProject(monoRepo, name, apiName);
249
+ }
250
+ monoRepo.addModel(new WebapiProductionDockerfile(apiNames, {
251
+ namedOnly: true
252
+ }));
253
+ return monoRepo;
254
+ }
255
+ function addApiProject(monoRepo, workspaceName, apiName) {
256
+ const apiProject = new ProjectScaffold(webapiProjectDir(apiName));
257
+ apiProject.addModel(new ApiPackageJson(workspaceName, apiName));
258
+ apiProject.addModel(new MainSourceFile(`${workspaceName}.${apiName}`));
212
259
  apiProject.addModel(new ControllerSourceFile());
213
- // SampleService + SampleConfig are part of the core scaffold — HelloController
214
- // injects SampleService to demonstrate config-driven behaviour out of the box.
215
260
  apiProject.addFile(new SampleConfigModel());
216
261
  apiProject.addFile(new SampleServiceModel());
217
262
  monoRepo.addProject(apiProject);
218
- return monoRepo;
219
263
  }
220
264
 
221
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL2NyZWF0ZS1hcGkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYmFzZW5hbWUsIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBEb2NrZXJDb21wb3NlIH0gZnJvbSBcIi4uL21vZGVscy9jb21wb3NlLm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBDb25maWdZYW1sIH0gZnJvbSBcIi4uL21vZGVscy9jb25maWcteWFtbC5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgV0VMTF9LTk9XTl9GSUxFUyB9IGZyb20gXCIuLi9tb2RlbHMvY29uc3QuanNcIjtcbmltcG9ydCB7IERldkNvbnRhaW5lciB9IGZyb20gXCIuLi9tb2RlbHMvZGV2LWNvbnRhaW5lci5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgRW52RmlsZSB9IGZyb20gXCIuLi9tb2RlbHMvZW52LWZpbGUubW9kZWwuanNcIjtcbmltcG9ydCB7IEdpdGlnbm9yZSB9IGZyb20gXCIuLi9tb2RlbHMvZ2l0aWdub3JlLm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBMYXVuY2hKc29uIH0gZnJvbSBcIi4uL21vZGVscy9sYXVuY2gtanNvbi5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgUGFja2FnZUpzb24gfSBmcm9tIFwiLi4vbW9kZWxzL3BhY2thZ2UtanNvbi5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgTW9ub1JlcG9TY2FmZm9sZCwgUHJvamVjdFNjYWZmb2xkIH0gZnJvbSBcIi4uL21vZGVscy9wcm9qZWN0Lm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBUc0NvbmZpZyB9IGZyb20gXCIuLi9tb2RlbHMvdHNjb25maWcubW9kZWwuanNcIjtcbmltcG9ydCB7IFZTQ29kZVNldHRpbmdzIH0gZnJvbSBcIi4uL21vZGVscy92c2NvZGUtc2V0dGluZ3MubW9kZWwuanNcIjtcbmltcG9ydCB7IFNjYWZmb2xkU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9zY2FmZm9sZC5zZXJ2aWNlLmpzXCI7XG5pbXBvcnQgeyBXRUJBUElfUFJPSkVDVF9ESVIsIFdFQkFQSV9SRUxFQVNFX0VOVFJZIH0gZnJvbSBcIi4vY29uc3QuanNcIjtcbmltcG9ydCB7IEF1dGhGZWF0dXJlIH0gZnJvbSBcIi4vZmVhdHVyZXMvYXV0aC5mZWF0dXJlLmpzXCI7XG5pbXBvcnQgeyBEYXRhYmFzZUZlYXR1cmUgfSBmcm9tIFwiLi9mZWF0dXJlcy9kYXRhYmFzZS5mZWF0dXJlLmpzXCI7XG5pbXBvcnQgeyBGaW5hbGl6ZUZlYXR1cmUgfSBmcm9tIFwiLi9mZWF0dXJlcy9maW5hbGl6ZS5mZWF0dXJlLmpzXCI7XG5pbXBvcnQgeyBQb3N0bWFuRmVhdHVyZSB9IGZyb20gXCIuL2ZlYXR1cmVzL3Bvc3RtYW4uZmVhdHVyZS5qc1wiO1xuaW1wb3J0IHsgQXBpUGFja2FnZUpzb24gfSBmcm9tIFwiLi9tb2RlbHMvYXBpLXBhY2thZ2UtanNvbi5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgQ29udHJvbGxlclNvdXJjZUZpbGUgfSBmcm9tIFwiLi9tb2RlbHMvY29udHJvbGxlci1zb3VyY2UtZmlsZS5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgR2l0aHViQ2lXb3JrZmxvd3MgfSBmcm9tIFwiLi9tb2RlbHMvZ2l0aHViLWNpLm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBNYWluU291cmNlRmlsZSB9IGZyb20gXCIuL21vZGVscy9tYWluLXNvdXJjZS1maWxlLm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBXZWJhcGlQcm9kdWN0aW9uRG9ja2VyZmlsZSB9IGZyb20gXCIuL21vZGVscy9wcm9kdWN0aW9uLWRvY2tlcmZpbGUubW9kZWwuanNcIjtcbmltcG9ydCB7IFNhbXBsZUNvbmZpZ01vZGVsLCBTYW1wbGVTZXJ2aWNlTW9kZWwgfSBmcm9tIFwiLi9tb2RlbHMvc2FtcGxlLWZpbGVzLm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBXZWJhcGlEZXZDb250YWluZXIgfSBmcm9tIFwiLi9tb2RlbHMvd2ViYXBpLWltYWdlLm1vZGVsLmpzXCI7XG5cbmV4cG9ydCB7IFdFQkFQSV9QUk9KRUNUX0RJUiwgV0VCQVBJX1JFTEVBU0VfRU5UUlkgfSBmcm9tIFwiLi9jb25zdC5qc1wiO1xuXG5leHBvcnQgdHlwZSBBcGlPcHRpb25zID0ge1xuXHRkPzogc3RyaW5nO1xuXHQvKiogSG9zdCBwcm9qZWN0IG5hbWUgKGRpcmVjdG9yeSBiYXNlbmFtZSkuIFJlcXVpcmVkIHdoZW4gc2NhZmZvbGRpbmcgaW50byBgL3dvcmtzcGFjZWAuICovXG5cdHByb2plY3ROYW1lPzogc3RyaW5nO1xuXHRhdXRoUHJvdmlkZXI/OiBcImF1dGgwXCIgfCBcIm5vbmVcIjtcblx0ZGF0YWJhc2VQcm92aWRlcj86IFwibm9uZVwiIHwgXCJwb3N0Z3Jlcy90eXBlb3JtXCI7XG5cdHBvc3RtYW5Qcm92aWRlcj86IFwiYXBpXCIgfCBcImxvY2FsXCIgfCBcIm5vbmVcIjtcblx0aW5zdGFsbERlcGVuZGVuY2llcz86IFwieWVzXCIgfCBcIm5vXCI7XG59O1xuXG5jb25zdCBmZWF0dXJlcyA9IFtEYXRhYmFzZUZlYXR1cmUsIEF1dGhGZWF0dXJlLCBQb3N0bWFuRmVhdHVyZSwgRmluYWxpemVGZWF0dXJlXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNjYWZmb2xkQXBpKGNsaU9wdGlvbnM6IEFwaU9wdGlvbnMpIHtcblx0Y29uc3QgdGFyZ2V0RGlyID0gcmVzb2x2ZShjbGlPcHRpb25zLmQgPz8gXCIuXCIpO1xuXHRjb25zdCBwcm9qZWN0TmFtZSA9XG5cdFx0Y2xpT3B0aW9ucy5wcm9qZWN0TmFtZT8udHJpbSgpIHx8XG5cdFx0cHJvY2Vzcy5lbnYuREVDT0hFUkVfUFJPSkVDVF9OQU1FPy50cmltKCkgfHxcblx0XHRiYXNlbmFtZSh0YXJnZXREaXIpO1xuXHRjb25zdCB3b3Jrc3BhY2UgPSBjcmVhdGVXb3Jrc3BhY2UodGFyZ2V0RGlyLCBwcm9qZWN0TmFtZSk7XG5cdGF3YWl0IFNjYWZmb2xkU2VydmljZS5zY2FmZm9sZCh3b3Jrc3BhY2UsIGNsaU9wdGlvbnMsIGZlYXR1cmVzKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlV29ya3NwYWNlKHRhcmdldERpcjogc3RyaW5nLCBwcm9qZWN0TmFtZTogc3RyaW5nKTogTW9ub1JlcG9TY2FmZm9sZCB7XG5cdGNvbnN0IG1vbm9SZXBvID0gbmV3IE1vbm9SZXBvU2NhZmZvbGQoKTtcblx0bW9ub1JlcG8udGFyZ2V0RGlyID0gdGFyZ2V0RGlyO1xuXHRtb25vUmVwby5zZXROYW1lKHByb2plY3ROYW1lKTtcblx0Y29uc3QgbmFtZSA9IG1vbm9SZXBvLm5hbWU7XG5cblx0Y29uc3QgY29tcG9zZSA9IG5ldyBEb2NrZXJDb21wb3NlKClcblx0XHQuc2V0UHJvamVjdE5hbWUobmFtZSlcblx0XHQuYWRkTmV0d29yayhuYW1lLCB7IG5hbWU6IGBzYW1wbGVzLSR7bmFtZX1gIH0pXG5cdFx0LmFkZFNlcnZpY2UoXCJkZXZjb250YWluZXJcIiwge1xuXHRcdFx0YnVpbGQ6IFwiLlwiLFxuXHRcdFx0dm9sdW1lczogW1xuXHRcdFx0XHQvLyBXb3Jrc3BhY2UtbG9jYWwgKGNyZWF0ZWQgYnkgaW5pdGlhbGl6ZS5zaCBhcyB0aGUgaG9zdCB1c2VyKS5cblx0XHRcdFx0Ly8gRG8gTk9UIGJpbmQgJHtIT01FfS8ubnBtLy4uLiDigJQgRG9ja2VyIGNyZWF0ZXMgbWlzc2luZyBob3N0IHBhdGhzIGFzIHJvb3QuXG5cdFx0XHRcdFwiLi9ucG0tYXV0aDovaG9tZS9ub2RlLy5ucG0tY29uZmlnXCIsXG5cdFx0XHRcdFwid2ViYXBpLW5vZGUtbW9kdWxlczovd29ya3NwYWNlL25vZGVfbW9kdWxlc1wiLFxuXHRcdFx0XSxcblx0XHRcdGVudmlyb25tZW50OiB7IE5QTV9DT05GSUdfVVNFUkNPTkZJRzogXCIvaG9tZS9ub2RlLy5ucG0tY29uZmlnLy5ucG1yY1wiIH0sXG5cdFx0XHRjb21tYW5kOiBcInNsZWVwIGluZmluaXR5XCIsXG5cdFx0XHRuZXR3b3JrczogW25hbWVdLFxuXHRcdH0pXG5cdFx0LmFkZFZvbHVtZShcIndlYmFwaS1ub2RlLW1vZHVsZXNcIik7XG5cblx0Y29uc3QgZGV2Q29udGFpbmVyID0gbmV3IERldkNvbnRhaW5lcigpXG5cdFx0LmFkZEV4dGVuc2lvbihcImJpb21lanMuYmlvbWVcIiwgXCJ2aXRlc3QuZXhwbG9yZXJcIilcblx0XHQuZm9yd2FyZFBvcnQoMzAwMClcblx0XHQuc2V0UG9ydEF0dHJpYnV0ZXMoMzAwMCwgeyBsYWJlbDogXCJBUElcIiwgcmVxdWlyZUxvY2FsUG9ydDogdHJ1ZSB9KVxuXHRcdC5zZXRJbml0aWFsaXplQ29tbWFuZChcImJhc2ggLmRldmNvbnRhaW5lci9pbml0aWFsaXplLnNoXCIpXG5cdFx0LnNldFBvc3RTdGFydENvbW1hbmQoXCJiYXNoIC5kZXZjb250YWluZXIvcG9zdC1zdGFydC5zaFwiKVxuXHRcdC51c2VDb21wb3NlKCk7XG5cblx0Ly8gV29ya3NwYWNlLWxldmVsIG1vZGVscyAocmVwbyByb290KVxuXHRtb25vUmVwby5hZGRNb2RlbChjb21wb3NlKTtcblx0bW9ub1JlcG8uYWRkTW9kZWwoZGV2Q29udGFpbmVyKTtcblx0bW9ub1JlcG8uYWRkTW9kZWwobmV3IFdlYmFwaURldkNvbnRhaW5lcigpKTtcblx0bW9ub1JlcG8uYWRkTW9kZWwobmV3IFdlYmFwaVByb2R1Y3Rpb25Eb2NrZXJmaWxlKCkpO1xuXHRtb25vUmVwby5hZGRNb2RlbChuZXcgR2l0aHViQ2lXb3JrZmxvd3MoKSk7XG5cdG1vbm9SZXBvLmFkZE1vZGVsKG5ldyBWU0NvZGVTZXR0aW5ncyhuYW1lKSk7XG5cdG1vbm9SZXBvLmFkZE1vZGVsKG5ldyBMYXVuY2hKc29uKCkpO1xuXHRtb25vUmVwby5hZGRNb2RlbChuZXcgVHNDb25maWcoKSk7XG5cdG1vbm9SZXBvLmFkZE1vZGVsKG5ldyBQYWNrYWdlSnNvbihgJHtuYW1lfS5hcGlgLCB7IHN0YXJ0RW50cnk6IFdFQkFQSV9SRUxFQVNFX0VOVFJZIH0pKTtcblx0bW9ub1JlcG8uYWRkTW9kZWwobmV3IENvbmZpZ1lhbWwoV0VMTF9LTk9XTl9GSUxFUy5DT05GSUdfWUFNTCwgXCJjb25maWcvY29uZmlnLnlhbWxcIiwgXCJcIikpO1xuXHRtb25vUmVwby5hZGRNb2RlbChcblx0XHRuZXcgQ29uZmlnWWFtbChXRUxMX0tOT1dOX0ZJTEVTLkNPTkZJR19ERVZfWUFNTCwgXCJjb25maWcvY29uZmlnLmRldi55YW1sXCIsIFwiXCIpLFxuXHQpO1xuXHRtb25vUmVwby5hZGRNb2RlbChuZXcgR2l0aWdub3JlKCkpO1xuXHRtb25vUmVwby5hZGRNb2RlbChuZXcgRW52RmlsZSgpKTtcblxuXHQvLyBCaW9tZSBmb3JtYXR0ZXIvbGludGVyIGNvbmZpZ1xuXHRtb25vUmVwby5hZGRGaWxlKHtcblx0XHRmaWxlczogKCkgPT4gW1xuXHRcdFx0e1xuXHRcdFx0XHRmaWxlUGF0aDogXCJiaW9tZS5qc29uXCIsXG5cdFx0XHRcdGNvbnRlbnQ6IEpTT04uc3RyaW5naWZ5KFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdCRzY2hlbWE6IFwiaHR0cHM6Ly9iaW9tZWpzLmRldi9zY2hlbWFzLzIuMC4wL3NjaGVtYS5qc29uXCIsXG5cdFx0XHRcdFx0XHRmaWxlczoge1xuXHRcdFx0XHRcdFx0XHRpbmNsdWRlczogW1wiKiovKi50c1wiLCBcIioqLyouanNcIiwgXCIqKi8qLmpzb25cIiwgXCIqKi8qLnltbFwiLCBcIioqLyoueWFtbFwiXSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRhc3Npc3Q6IHsgYWN0aW9uczogeyBzb3VyY2U6IHsgb3JnYW5pemVJbXBvcnRzOiBcIm9uXCIgfSB9IH0sXG5cdFx0XHRcdFx0XHR2Y3M6IHsgZW5hYmxlZDogdHJ1ZSwgY2xpZW50S2luZDogXCJnaXRcIiwgdXNlSWdub3JlRmlsZTogdHJ1ZSB9LFxuXHRcdFx0XHRcdFx0Zm9ybWF0dGVyOiB7XG5cdFx0XHRcdFx0XHRcdGVuYWJsZWQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGZvcm1hdFdpdGhFcnJvcnM6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGluZGVudFN0eWxlOiBcInRhYlwiLFxuXHRcdFx0XHRcdFx0XHRsaW5lV2lkdGg6IDk1LFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGphdmFzY3JpcHQ6IHsgcGFyc2VyOiB7IHVuc2FmZVBhcmFtZXRlckRlY29yYXRvcnNFbmFibGVkOiB0cnVlIH0gfSxcblx0XHRcdFx0XHRcdGxpbnRlcjoge1xuXHRcdFx0XHRcdFx0XHRydWxlczoge1xuXHRcdFx0XHRcdFx0XHRcdHN0eWxlOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHR1c2VDb25zaXN0ZW50TWVtYmVyQWNjZXNzaWJpbGl0eToge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXZlbDogXCJlcnJvclwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvcHRpb25zOiB7IGFjY2Vzc2liaWxpdHk6IFwiZXhwbGljaXRcIiB9LFxuXHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdG92ZXJyaWRlczogW1xuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0aW5jbHVkZXM6IFtcIioqLyouanNvblwiXSxcblx0XHRcdFx0XHRcdFx0XHRmb3JtYXR0ZXI6IHsgaW5kZW50U3R5bGU6IFwic3BhY2VcIiwgaW5kZW50V2lkdGg6IDIgfSxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdDIsXG5cdFx0XHRcdCksXG5cdFx0XHR9LFxuXHRcdF0sXG5cdH0pO1xuXG5cdG1vbm9SZXBvLmFkZEZpbGUoe1xuXHRcdGZpbGVzOiAoKSA9PiBbXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBcIi5kZXZjb250YWluZXIvaW5pdGlhbGl6ZS5zaFwiLFxuXHRcdFx0XHRjb250ZW50OiBbXG5cdFx0XHRcdFx0XCIjIS91c3IvYmluL2VudiBiYXNoXCIsXG5cdFx0XHRcdFx0XCIjIFJ1bnMgb24gdGhlIGhvc3QgYmVmb3JlIHRoZSBjb250YWluZXIgaXMgY3JlYXRlZCAoZGV2Y29udGFpbmVyIGluaXRpYWxpemVDb21tYW5kKS5cIixcblx0XHRcdFx0XHRcIiMgQ3JlYXRlcyBucG0tYXV0aCBhcyB0aGUgaG9zdCB1c2VyIHNvIHRoZSBiaW5kIG1vdW50IGlzIG5vdCByb290LW93bmVkLlwiLFxuXHRcdFx0XHRcdFwiIyBEbyBub3Qgc2NhZmZvbGQgbnBtLWF1dGgvIGZyb20gdGhlIGJ1aWxkZXIgKHRoYXQgcnVucyBhcyByb290KS5cIixcblx0XHRcdFx0XHRcInNldCAtZXVvIHBpcGVmYWlsXCIsXG5cdFx0XHRcdFx0XCJcIixcblx0XHRcdFx0XHQncm9vdD1cIiQoY2QgXCIkKGRpcm5hbWUgXCIke0JBU0hfU09VUkNFWzBdfVwiKS8uLlwiICYmIHB3ZClcIicsXG5cdFx0XHRcdFx0J25wbV9kaXI9XCIkcm9vdC8uZGV2Y29udGFpbmVyL25wbS1hdXRoXCInLFxuXHRcdFx0XHRcdCdpZiAhIG1rZGlyIC1wIFwiJG5wbV9kaXJcIiAyPi9kZXYvbnVsbDsgdGhlbicsXG5cdFx0XHRcdFx0J1xcdGVjaG8gXCJDYW5ub3QgY3JlYXRlICRucG1fZGlyIChwZXJtaXNzaW9uIGRlbmllZCkuXCIgPiYyJyxcblx0XHRcdFx0XHQnXFx0ZWNobyBcIlRoZSBzY2FmZm9sZCBjb250YWluZXIgbGlrZWx5IGxlZnQgLmRldmNvbnRhaW5lciByb290LW93bmVkLiBGaXggd2l0aDpcIiA+JjInLFxuXHRcdFx0XHRcdCdcXHRlY2hvIFwiICBzdWRvIGNob3duIC1SIFxcXFxcIiRVU0VSOiRVU0VSXFxcXFwiIFxcXFxcIiRyb290XFxcXFwiXCIgPiYyJyxcblx0XHRcdFx0XHRcIlxcdGV4aXQgMVwiLFxuXHRcdFx0XHRcdFwiZmlcIixcblx0XHRcdFx0XHRcIntcIixcblx0XHRcdFx0XHQnXFx0ZWNobyBcIipcIicsXG5cdFx0XHRcdFx0J1xcdGVjaG8gXCIhLmdpdGlnbm9yZVwiJyxcblx0XHRcdFx0XHQnfSA+XCIkbnBtX2Rpci8uZ2l0aWdub3JlXCInLFxuXHRcdFx0XHRcdFwiXCIsXG5cdFx0XHRcdFx0J2lmIFtbICEgLWYgXCIkbnBtX2Rpci8ubnBtcmNcIiBdXTsgdGhlbicsXG5cdFx0XHRcdFx0J1xcdGlmIFtbIC1mIFwiJHtIT01FfS8ubnBtcmNcIiBdXTsgdGhlbicsXG5cdFx0XHRcdFx0J1xcdFxcdGNwIC1hIFwiJHtIT01FfS8ubnBtcmNcIiBcIiRucG1fZGlyLy5ucG1yY1wiJyxcblx0XHRcdFx0XHRcIlxcdGZpXCIsXG5cdFx0XHRcdFx0XCJmaVwiLFxuXHRcdFx0XHRcdFwiXCIsXG5cdFx0XHRcdF0uam9pbihcIlxcblwiKSxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBcIi5kZXZjb250YWluZXIvcG9zdC1zdGFydC5zaFwiLFxuXHRcdFx0XHRjb250ZW50OiBbXG5cdFx0XHRcdFx0XCIjIS91c3IvYmluL2VudiBiYXNoXCIsXG5cdFx0XHRcdFx0XCIjIFJ1bnMgb24gZXZlcnkgY29udGFpbmVyIHN0YXJ0IChkZXZjb250YWluZXIgcG9zdFN0YXJ0Q29tbWFuZCkuXCIsXG5cdFx0XHRcdFx0XCJzZXQgLWV1byBwaXBlZmFpbFwiLFxuXHRcdFx0XHRcdFwiXCIsXG5cdFx0XHRcdFx0J0FVVEhfUkVHSVNUUlk9XCJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZ1wiJyxcblx0XHRcdFx0XHRcIlwiLFxuXHRcdFx0XHRcdCdpZiBucG0gd2hvYW1pIC0tcmVnaXN0cnkgXCIkQVVUSF9SRUdJU1RSWVwiID4vZGV2L251bGwgMj4mMTsgdGhlbicsXG5cdFx0XHRcdFx0J1xcdGVjaG8gXCJucG06IGxvZ2dlZCBpbiBhcyAkKG5wbSB3aG9hbWkgLS1yZWdpc3RyeSBcIiRBVVRIX1JFR0lTVFJZXCIpXCInLFxuXHRcdFx0XHRcdFwiXFx0ZXhpdCAwXCIsXG5cdFx0XHRcdFx0XCJmaVwiLFxuXHRcdFx0XHRcdFwiXCIsXG5cdFx0XHRcdFx0XCJpZiBbWyAtdCAwICYmIC10IDEgXV07IHRoZW5cIixcblx0XHRcdFx0XHQnXFx0ZWNobyBcIm5wbTogbm90IGF1dGhlbnRpY2F0ZWQg4oCUIHN0YXJ0aW5nIGxvZ2luLi4uXCInLFxuXHRcdFx0XHRcdCdcXHRucG0gbG9naW4gLS1yZWdpc3RyeSBcIiRBVVRIX1JFR0lTVFJZXCInLFxuXHRcdFx0XHRcdFwiXFx0ZXhpdCAwXCIsXG5cdFx0XHRcdFx0XCJmaVwiLFxuXHRcdFx0XHRcdFwiXCIsXG5cdFx0XHRcdFx0J2VjaG8gXCJucG06IG5vdCBhdXRoZW50aWNhdGVkLiBPcGVuIGEgdGVybWluYWwgYW5kIHJ1bjogbnBtIGxvZ2luXCIgPiYyJyxcblx0XHRcdFx0XHQnZWNobyBcIiAgICAoY3JlZHMgcGVyc2lzdCBpbiAuZGV2Y29udGFpbmVyL25wbS1hdXRoLylcIiA+JjInLFxuXHRcdFx0XHRcdFwiZXhpdCAxXCIsXG5cdFx0XHRcdFx0XCJcIixcblx0XHRcdFx0XS5qb2luKFwiXFxuXCIpLFxuXHRcdFx0fSxcblx0XHRdLFxuXHR9KTtcblxuXHQvLyBQcm9qZWN0LWxldmVsIG1vZGVscyAocGF0aHMgcmVsYXRpdmUgdG8gcHJvamVjdHMvYXBpKVxuXHRjb25zdCBhcGlQcm9qZWN0ID0gbmV3IFByb2plY3RTY2FmZm9sZChXRUJBUElfUFJPSkVDVF9ESVIpO1xuXHRhcGlQcm9qZWN0LmFkZE1vZGVsKG5ldyBBcGlQYWNrYWdlSnNvbihuYW1lKSk7XG5cdGFwaVByb2plY3QuYWRkTW9kZWwobmV3IE1haW5Tb3VyY2VGaWxlKGAke25hbWV9LmFwaWApKTtcblx0YXBpUHJvamVjdC5hZGRNb2RlbChuZXcgQ29udHJvbGxlclNvdXJjZUZpbGUoKSk7XG5cblx0Ly8gU2FtcGxlU2VydmljZSArIFNhbXBsZUNvbmZpZyBhcmUgcGFydCBvZiB0aGUgY29yZSBzY2FmZm9sZCDigJQgSGVsbG9Db250cm9sbGVyXG5cdC8vIGluamVjdHMgU2FtcGxlU2VydmljZSB0byBkZW1vbnN0cmF0ZSBjb25maWctZHJpdmVuIGJlaGF2aW91ciBvdXQgb2YgdGhlIGJveC5cblx0YXBpUHJvamVjdC5hZGRGaWxlKG5ldyBTYW1wbGVDb25maWdNb2RlbCgpKTtcblx0YXBpUHJvamVjdC5hZGRGaWxlKG5ldyBTYW1wbGVTZXJ2aWNlTW9kZWwoKSk7XG5cblx0bW9ub1JlcG8uYWRkUHJvamVjdChhcGlQcm9qZWN0KTtcblxuXHRyZXR1cm4gbW9ub1JlcG87XG59XG4iXSwibmFtZXMiOlsiYmFzZW5hbWUiLCJyZXNvbHZlIiwiRG9ja2VyQ29tcG9zZSIsIkNvbmZpZ1lhbWwiLCJXRUxMX0tOT1dOX0ZJTEVTIiwiRGV2Q29udGFpbmVyIiwiRW52RmlsZSIsIkdpdGlnbm9yZSIsIkxhdW5jaEpzb24iLCJQYWNrYWdlSnNvbiIsIk1vbm9SZXBvU2NhZmZvbGQiLCJQcm9qZWN0U2NhZmZvbGQiLCJUc0NvbmZpZyIsIlZTQ29kZVNldHRpbmdzIiwiU2NhZmZvbGRTZXJ2aWNlIiwiV0VCQVBJX1BST0pFQ1RfRElSIiwiV0VCQVBJX1JFTEVBU0VfRU5UUlkiLCJBdXRoRmVhdHVyZSIsIkRhdGFiYXNlRmVhdHVyZSIsIkZpbmFsaXplRmVhdHVyZSIsIlBvc3RtYW5GZWF0dXJlIiwiQXBpUGFja2FnZUpzb24iLCJDb250cm9sbGVyU291cmNlRmlsZSIsIkdpdGh1YkNpV29ya2Zsb3dzIiwiTWFpblNvdXJjZUZpbGUiLCJXZWJhcGlQcm9kdWN0aW9uRG9ja2VyZmlsZSIsIlNhbXBsZUNvbmZpZ01vZGVsIiwiU2FtcGxlU2VydmljZU1vZGVsIiwiV2ViYXBpRGV2Q29udGFpbmVyIiwiZmVhdHVyZXMiLCJzY2FmZm9sZEFwaSIsImNsaU9wdGlvbnMiLCJ0YXJnZXREaXIiLCJkIiwicHJvamVjdE5hbWUiLCJ0cmltIiwicHJvY2VzcyIsImVudiIsIkRFQ09IRVJFX1BST0pFQ1RfTkFNRSIsIndvcmtzcGFjZSIsImNyZWF0ZVdvcmtzcGFjZSIsInNjYWZmb2xkIiwibW9ub1JlcG8iLCJzZXROYW1lIiwibmFtZSIsImNvbXBvc2UiLCJzZXRQcm9qZWN0TmFtZSIsImFkZE5ldHdvcmsiLCJhZGRTZXJ2aWNlIiwiYnVpbGQiLCJ2b2x1bWVzIiwiZW52aXJvbm1lbnQiLCJOUE1fQ09ORklHX1VTRVJDT05GSUciLCJjb21tYW5kIiwibmV0d29ya3MiLCJhZGRWb2x1bWUiLCJkZXZDb250YWluZXIiLCJhZGRFeHRlbnNpb24iLCJmb3J3YXJkUG9ydCIsInNldFBvcnRBdHRyaWJ1dGVzIiwibGFiZWwiLCJyZXF1aXJlTG9jYWxQb3J0Iiwic2V0SW5pdGlhbGl6ZUNvbW1hbmQiLCJzZXRQb3N0U3RhcnRDb21tYW5kIiwidXNlQ29tcG9zZSIsImFkZE1vZGVsIiwic3RhcnRFbnRyeSIsIkNPTkZJR19ZQU1MIiwiQ09ORklHX0RFVl9ZQU1MIiwiYWRkRmlsZSIsImZpbGVzIiwiZmlsZVBhdGgiLCJjb250ZW50IiwiSlNPTiIsInN0cmluZ2lmeSIsIiRzY2hlbWEiLCJpbmNsdWRlcyIsImFzc2lzdCIsImFjdGlvbnMiLCJzb3VyY2UiLCJvcmdhbml6ZUltcG9ydHMiLCJ2Y3MiLCJlbmFibGVkIiwiY2xpZW50S2luZCIsInVzZUlnbm9yZUZpbGUiLCJmb3JtYXR0ZXIiLCJmb3JtYXRXaXRoRXJyb3JzIiwiaW5kZW50U3R5bGUiLCJsaW5lV2lkdGgiLCJqYXZhc2NyaXB0IiwicGFyc2VyIiwidW5zYWZlUGFyYW1ldGVyRGVjb3JhdG9yc0VuYWJsZWQiLCJsaW50ZXIiLCJydWxlcyIsInN0eWxlIiwidXNlQ29uc2lzdGVudE1lbWJlckFjY2Vzc2liaWxpdHkiLCJsZXZlbCIsIm9wdGlvbnMiLCJhY2Nlc3NpYmlsaXR5Iiwib3ZlcnJpZGVzIiwiaW5kZW50V2lkdGgiLCJqb2luIiwiYXBpUHJvamVjdCIsImFkZFByb2plY3QiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFFBQVEsRUFBRUMsT0FBTyxRQUFRLFlBQVk7QUFDOUMsU0FBU0MsYUFBYSxRQUFRLDZCQUE2QjtBQUMzRCxTQUFTQyxVQUFVLFFBQVEsaUNBQWlDO0FBQzVELFNBQVNDLGdCQUFnQixRQUFR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
265
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL2NyZWF0ZS1hcGkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBiYXNlbmFtZSwgam9pbiwgcmVzb2x2ZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IERvY2tlckNvbXBvc2UgfSBmcm9tIFwiLi4vbW9kZWxzL2NvbXBvc2UubW9kZWwuanNcIjtcbmltcG9ydCB7IENvbmZpZ1lhbWwgfSBmcm9tIFwiLi4vbW9kZWxzL2NvbmZpZy15YW1sLm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBXRUxMX0tOT1dOX0ZJTEVTIH0gZnJvbSBcIi4uL21vZGVscy9jb25zdC5qc1wiO1xuaW1wb3J0IHsgRGV2Q29udGFpbmVyIH0gZnJvbSBcIi4uL21vZGVscy9kZXYtY29udGFpbmVyLm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBFbnZGaWxlIH0gZnJvbSBcIi4uL21vZGVscy9lbnYtZmlsZS5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgR2l0aWdub3JlIH0gZnJvbSBcIi4uL21vZGVscy9naXRpZ25vcmUubW9kZWwuanNcIjtcbmltcG9ydCB7IExhdW5jaEpzb24gfSBmcm9tIFwiLi4vbW9kZWxzL2xhdW5jaC1qc29uLm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBQYWNrYWdlSnNvbiB9IGZyb20gXCIuLi9tb2RlbHMvcGFja2FnZS1qc29uLm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBNb25vUmVwb1NjYWZmb2xkLCBQcm9qZWN0U2NhZmZvbGQgfSBmcm9tIFwiLi4vbW9kZWxzL3Byb2plY3QubW9kZWwuanNcIjtcbmltcG9ydCB7IFRzQ29uZmlnIH0gZnJvbSBcIi4uL21vZGVscy90c2NvbmZpZy5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgVlNDb2RlU2V0dGluZ3MgfSBmcm9tIFwiLi4vbW9kZWxzL3ZzY29kZS1zZXR0aW5ncy5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgU2NhZmZvbGRTZXJ2aWNlIH0gZnJvbSBcIi4uL3NlcnZpY2VzL3NjYWZmb2xkLnNlcnZpY2UuanNcIjtcbmltcG9ydCB7XG5cdENyZWF0ZUNsaUVycm9yLFxuXHRpc0RlY29oZXJlV29ya3NwYWNlLFxuXHRsaXN0RXhpc3RpbmdBcGlOYW1lcyxcblx0cGFyc2VBcGlOYW1lcyxcbn0gZnJvbSBcIi4vYXBpLW5hbWUuanNcIjtcbmltcG9ydCB7XG5cdERFRkFVTFRfV0VCQVBJX05BTUUsXG5cdHdlYmFwaVBhY2thZ2VOYW1lLFxuXHR3ZWJhcGlQb3J0LFxuXHR3ZWJhcGlQcm9qZWN0RGlyLFxuXHR3ZWJhcGlSZWxlYXNlRW50cnksXG59IGZyb20gXCIuL2NvbnN0LmpzXCI7XG5pbXBvcnQgeyBBdXRoRmVhdHVyZSB9IGZyb20gXCIuL2ZlYXR1cmVzL2F1dGguZmVhdHVyZS5qc1wiO1xuaW1wb3J0IHsgRGF0YWJhc2VGZWF0dXJlIH0gZnJvbSBcIi4vZmVhdHVyZXMvZGF0YWJhc2UuZmVhdHVyZS5qc1wiO1xuaW1wb3J0IHsgRmluYWxpemVGZWF0dXJlIH0gZnJvbSBcIi4vZmVhdHVyZXMvZmluYWxpemUuZmVhdHVyZS5qc1wiO1xuaW1wb3J0IHsgUG9zdG1hbkZlYXR1cmUgfSBmcm9tIFwiLi9mZWF0dXJlcy9wb3N0bWFuLmZlYXR1cmUuanNcIjtcbmltcG9ydCB7IEFwaVBhY2thZ2VKc29uIH0gZnJvbSBcIi4vbW9kZWxzL2FwaS1wYWNrYWdlLWpzb24ubW9kZWwuanNcIjtcbmltcG9ydCB7IENvbnRyb2xsZXJTb3VyY2VGaWxlIH0gZnJvbSBcIi4vbW9kZWxzL2NvbnRyb2xsZXItc291cmNlLWZpbGUubW9kZWwuanNcIjtcbmltcG9ydCB7IEdpdGh1YkNpV29ya2Zsb3dzIH0gZnJvbSBcIi4vbW9kZWxzL2dpdGh1Yi1jaS5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgTWFpblNvdXJjZUZpbGUgfSBmcm9tIFwiLi9tb2RlbHMvbWFpbi1zb3VyY2UtZmlsZS5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgV2ViYXBpUHJvZHVjdGlvbkRvY2tlcmZpbGUgfSBmcm9tIFwiLi9tb2RlbHMvcHJvZHVjdGlvbi1kb2NrZXJmaWxlLm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBTYW1wbGVDb25maWdNb2RlbCwgU2FtcGxlU2VydmljZU1vZGVsIH0gZnJvbSBcIi4vbW9kZWxzL3NhbXBsZS1maWxlcy5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgV2ViYXBpRGV2Q29udGFpbmVyIH0gZnJvbSBcIi4vbW9kZWxzL3dlYmFwaS1pbWFnZS5tb2RlbC5qc1wiO1xuXG5leHBvcnQgeyBXRUJBUElfUFJPSkVDVF9ESVIsIFdFQkFQSV9SRUxFQVNFX0VOVFJZIH0gZnJvbSBcIi4vY29uc3QuanNcIjtcblxuZXhwb3J0IHR5cGUgQXBpT3B0aW9ucyA9IHtcblx0ZD86IHN0cmluZztcblx0LyoqIEhvc3QgcHJvamVjdCBuYW1lIChkaXJlY3RvcnkgYmFzZW5hbWUpLiBSZXF1aXJlZCB3aGVuIHNjYWZmb2xkaW5nIGludG8gYC93b3Jrc3BhY2VgLiAqL1xuXHRwcm9qZWN0TmFtZT86IHN0cmluZztcblx0LyoqIEFQSSBzbHVncyB1bmRlciBgcHJvamVjdHMvYC4gRGVmYXVsdCBgW1wiYXBpXCJdYC4gUmVwZWF0YWJsZSBgLS1uYW1lYC4gKi9cblx0bmFtZXM/OiBzdHJpbmdbXTtcblx0LyoqIEFkZCBBUElzIHRvIGFuIGV4aXN0aW5nIERlY29oZXJlIHdvcmtzcGFjZSBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZS4gKi9cblx0YWRkPzogYm9vbGVhbjtcblx0YXV0aFByb3ZpZGVyPzogXCJhdXRoMFwiIHwgXCJub25lXCI7XG5cdGRhdGFiYXNlUHJvdmlkZXI/OiBcIm5vbmVcIiB8IFwicG9zdGdyZXMvdHlwZW9ybVwiO1xuXHRwb3N0bWFuUHJvdmlkZXI/OiBcImFwaVwiIHwgXCJsb2NhbFwiIHwgXCJub25lXCI7XG5cdGluc3RhbGxEZXBlbmRlbmNpZXM/OiBcInllc1wiIHwgXCJub1wiO1xufTtcblxuY29uc3QgZmVhdHVyZXMgPSBbRGF0YWJhc2VGZWF0dXJlLCBBdXRoRmVhdHVyZSwgUG9zdG1hbkZlYXR1cmUsIEZpbmFsaXplRmVhdHVyZV07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzY2FmZm9sZEFwaShjbGlPcHRpb25zOiBBcGlPcHRpb25zKSB7XG5cdGNvbnN0IHRhcmdldERpciA9IHJlc29sdmUoY2xpT3B0aW9ucy5kID8/IFwiLlwiKTtcblx0Y29uc3QgcHJvamVjdE5hbWUgPVxuXHRcdGNsaU9wdGlvbnMucHJvamVjdE5hbWU/LnRyaW0oKSB8fFxuXHRcdHByb2Nlc3MuZW52LkRFQ09IRVJFX1BST0pFQ1RfTkFNRT8udHJpbSgpIHx8XG5cdFx0YmFzZW5hbWUodGFyZ2V0RGlyKTtcblx0Y29uc3QgbmFtZXMgPSBwYXJzZUFwaU5hbWVzKGNsaU9wdGlvbnMubmFtZXMpO1xuXHRjb25zdCB3b3Jrc3BhY2UgPSBjbGlPcHRpb25zLmFkZFxuXHRcdD8gY3JlYXRlQWRkV29ya3NwYWNlKHRhcmdldERpciwgcHJvamVjdE5hbWUsIG5hbWVzKVxuXHRcdDogY3JlYXRlV29ya3NwYWNlKHRhcmdldERpciwgcHJvamVjdE5hbWUsIG5hbWVzKTtcblx0YXdhaXQgU2NhZmZvbGRTZXJ2aWNlLnNjYWZmb2xkKHdvcmtzcGFjZSwgeyAuLi5jbGlPcHRpb25zLCBuYW1lcyB9LCBmZWF0dXJlcyk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVdvcmtzcGFjZShcblx0dGFyZ2V0RGlyOiBzdHJpbmcsXG5cdHByb2plY3ROYW1lOiBzdHJpbmcsXG5cdGFwaU5hbWVzOiByZWFkb25seSBzdHJpbmdbXSxcbik6IE1vbm9SZXBvU2NhZmZvbGQge1xuXHRjb25zdCBtb25vUmVwbyA9IG5ldyBNb25vUmVwb1NjYWZmb2xkKCk7XG5cdG1vbm9SZXBvLnRhcmdldERpciA9IHRhcmdldERpcjtcblx0bW9ub1JlcG8uc2V0TmFtZShwcm9qZWN0TmFtZSk7XG5cdGNvbnN0IG5hbWUgPSBtb25vUmVwby5uYW1lO1xuXG5cdGNvbnN0IGNvbXBvc2UgPSBuZXcgRG9ja2VyQ29tcG9zZSgpXG5cdFx0LnNldFByb2plY3ROYW1lKG5hbWUpXG5cdFx0LmFkZE5ldHdvcmsobmFtZSwgeyBuYW1lOiBgc2FtcGxlcy0ke25hbWV9YCB9KVxuXHRcdC5hZGRTZXJ2aWNlKFwiZGV2Y29udGFpbmVyXCIsIHtcblx0XHRcdGJ1aWxkOiBcIi5cIixcblx0XHRcdHZvbHVtZXM6IFtcblx0XHRcdFx0Ly8gV29ya3NwYWNlLWxvY2FsIChjcmVhdGVkIGJ5IGluaXRpYWxpemUuc2ggYXMgdGhlIGhvc3QgdXNlcikuXG5cdFx0XHRcdC8vIERvIE5PVCBiaW5kICR7SE9NRX0vLm5wbS8uLi4g4oCUIERvY2tlciBjcmVhdGVzIG1pc3NpbmcgaG9zdCBwYXRocyBhcyByb290LlxuXHRcdFx0XHRcIi4vbnBtLWF1dGg6L2hvbWUvbm9kZS8ubnBtLWNvbmZpZ1wiLFxuXHRcdFx0XHRcIndlYmFwaS1ub2RlLW1vZHVsZXM6L3dvcmtzcGFjZS9ub2RlX21vZHVsZXNcIixcblx0XHRcdF0sXG5cdFx0XHRlbnZpcm9ubWVudDogeyBOUE1fQ09ORklHX1VTRVJDT05GSUc6IFwiL2hvbWUvbm9kZS8ubnBtLWNvbmZpZy8ubnBtcmNcIiB9LFxuXHRcdFx0Y29tbWFuZDogXCJzbGVlcCBpbmZpbml0eVwiLFxuXHRcdFx0bmV0d29ya3M6IFtuYW1lXSxcblx0XHR9KVxuXHRcdC5hZGRWb2x1bWUoXCJ3ZWJhcGktbm9kZS1tb2R1bGVzXCIpO1xuXG5cdGNvbnN0IGRldkNvbnRhaW5lciA9IG5ldyBEZXZDb250YWluZXIoKVxuXHRcdC5hZGRFeHRlbnNpb24oXCJiaW9tZWpzLmJpb21lXCIsIFwidml0ZXN0LmV4cGxvcmVyXCIpXG5cdFx0LnNldEluaXRpYWxpemVDb21tYW5kKFwiYmFzaCAuZGV2Y29udGFpbmVyL2luaXRpYWxpemUuc2hcIilcblx0XHQuc2V0UG9zdFN0YXJ0Q29tbWFuZChcImJhc2ggLmRldmNvbnRhaW5lci9wb3N0LXN0YXJ0LnNoXCIpXG5cdFx0LnVzZUNvbXBvc2UoKTtcblxuXHRmb3IgKGNvbnN0IFtpbmRleCwgYXBpTmFtZV0gb2YgYXBpTmFtZXMuZW50cmllcygpKSB7XG5cdFx0Y29uc3QgcG9ydCA9IHdlYmFwaVBvcnQoaW5kZXgpO1xuXHRcdGRldkNvbnRhaW5lci5mb3J3YXJkUG9ydChwb3J0KTtcblx0XHRkZXZDb250YWluZXIuc2V0UG9ydEF0dHJpYnV0ZXMocG9ydCwge1xuXHRcdFx0bGFiZWw6IGFwaU5hbWUgPT09IERFRkFVTFRfV0VCQVBJX05BTUUgPyBcIkFQSVwiIDogYXBpTmFtZSxcblx0XHRcdHJlcXVpcmVMb2NhbFBvcnQ6IHRydWUsXG5cdFx0fSk7XG5cdH1cblxuXHQvLyBXb3Jrc3BhY2UtbGV2ZWwgbW9kZWxzIChyZXBvIHJvb3QpXG5cdG1vbm9SZXBvLmFkZE1vZGVsKGNvbXBvc2UpO1xuXHRtb25vUmVwby5hZGRNb2RlbChkZXZDb250YWluZXIpO1xuXHRtb25vUmVwby5hZGRNb2RlbChuZXcgV2ViYXBpRGV2Q29udGFpbmVyKCkpO1xuXHRtb25vUmVwby5hZGRNb2RlbChuZXcgV2ViYXBpUHJvZHVjdGlvbkRvY2tlcmZpbGUoYXBpTmFtZXMpKTtcblx0bW9ub1JlcG8uYWRkTW9kZWwobmV3IEdpdGh1YkNpV29ya2Zsb3dzKCkpO1xuXHRtb25vUmVwby5hZGRNb2RlbChuZXcgVlNDb2RlU2V0dGluZ3MobmFtZSkpO1xuXHRtb25vUmVwby5hZGRNb2RlbChuZXcgTGF1bmNoSnNvbihhcGlOYW1lcykpO1xuXHRtb25vUmVwby5hZGRNb2RlbChuZXcgVHNDb25maWcoKSk7XG5cdG1vbm9SZXBvLmFkZE1vZGVsKG5ldyBQYWNrYWdlSnNvbihgJHtuYW1lfS5hcGlgLCB7IGFwaU5hbWVzLCB3b3Jrc3BhY2VOYW1lOiBuYW1lIH0pKTtcblx0bW9ub1JlcG8uYWRkTW9kZWwobmV3IENvbmZpZ1lhbWwoV0VMTF9LTk9XTl9GSUxFUy5DT05GSUdfWUFNTCwgXCJjb25maWcvY29uZmlnLnlhbWxcIiwgXCJcIikpO1xuXHRtb25vUmVwby5hZGRNb2RlbChcblx0XHRuZXcgQ29uZmlnWWFtbChXRUxMX0tOT1dOX0ZJTEVTLkNPTkZJR19ERVZfWUFNTCwgXCJjb25maWcvY29uZmlnLmRldi55YW1sXCIsIFwiXCIpLFxuXHQpO1xuXHRtb25vUmVwby5hZGRNb2RlbChuZXcgR2l0aWdub3JlKCkpO1xuXHRtb25vUmVwby5hZGRNb2RlbChuZXcgRW52RmlsZSgpKTtcblxuXHQvLyBCaW9tZSBmb3JtYXR0ZXIvbGludGVyIGNvbmZpZ1xuXHRtb25vUmVwby5hZGRGaWxlKHtcblx0XHRmaWxlczogKCkgPT4gW1xuXHRcdFx0e1xuXHRcdFx0XHRmaWxlUGF0aDogXCJiaW9tZS5qc29uXCIsXG5cdFx0XHRcdGNvbnRlbnQ6IEpTT04uc3RyaW5naWZ5KFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdCRzY2hlbWE6IFwiaHR0cHM6Ly9iaW9tZWpzLmRldi9zY2hlbWFzLzIuMC4wL3NjaGVtYS5qc29uXCIsXG5cdFx0XHRcdFx0XHRmaWxlczoge1xuXHRcdFx0XHRcdFx0XHRpbmNsdWRlczogW1wiKiovKi50c1wiLCBcIioqLyouanNcIiwgXCIqKi8qLmpzb25cIiwgXCIqKi8qLnltbFwiLCBcIioqLyoueWFtbFwiXSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRhc3Npc3Q6IHsgYWN0aW9uczogeyBzb3VyY2U6IHsgb3JnYW5pemVJbXBvcnRzOiBcIm9uXCIgfSB9IH0sXG5cdFx0XHRcdFx0XHR2Y3M6IHsgZW5hYmxlZDogdHJ1ZSwgY2xpZW50S2luZDogXCJnaXRcIiwgdXNlSWdub3JlRmlsZTogdHJ1ZSB9LFxuXHRcdFx0XHRcdFx0Zm9ybWF0dGVyOiB7XG5cdFx0XHRcdFx0XHRcdGVuYWJsZWQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGZvcm1hdFdpdGhFcnJvcnM6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGluZGVudFN0eWxlOiBcInRhYlwiLFxuXHRcdFx0XHRcdFx0XHRsaW5lV2lkdGg6IDk1LFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGphdmFzY3JpcHQ6IHsgcGFyc2VyOiB7IHVuc2FmZVBhcmFtZXRlckRlY29yYXRvcnNFbmFibGVkOiB0cnVlIH0gfSxcblx0XHRcdFx0XHRcdGxpbnRlcjoge1xuXHRcdFx0XHRcdFx0XHRydWxlczoge1xuXHRcdFx0XHRcdFx0XHRcdHN0eWxlOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHR1c2VDb25zaXN0ZW50TWVtYmVyQWNjZXNzaWJpbGl0eToge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXZlbDogXCJlcnJvclwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvcHRpb25zOiB7IGFjY2Vzc2liaWxpdHk6IFwiZXhwbGljaXRcIiB9LFxuXHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdG92ZXJyaWRlczogW1xuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0aW5jbHVkZXM6IFtcIioqLyouanNvblwiXSxcblx0XHRcdFx0XHRcdFx0XHRmb3JtYXR0ZXI6IHsgaW5kZW50U3R5bGU6IFwic3BhY2VcIiwgaW5kZW50V2lkdGg6IDIgfSxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdDIsXG5cdFx0XHRcdCksXG5cdFx0XHR9LFxuXHRcdF0sXG5cdH0pO1xuXG5cdG1vbm9SZXBvLmFkZEZpbGUoe1xuXHRcdGZpbGVzOiAoKSA9PiBbXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBcIi5kZXZjb250YWluZXIvaW5pdGlhbGl6ZS5zaFwiLFxuXHRcdFx0XHRjb250ZW50OiBbXG5cdFx0XHRcdFx0XCIjIS91c3IvYmluL2VudiBiYXNoXCIsXG5cdFx0XHRcdFx0XCIjIFJ1bnMgb24gdGhlIGhvc3QgYmVmb3JlIHRoZSBjb250YWluZXIgaXMgY3JlYXRlZCAoZGV2Y29udGFpbmVyIGluaXRpYWxpemVDb21tYW5kKS5cIixcblx0XHRcdFx0XHRcIiMgQ3JlYXRlcyBucG0tYXV0aCBhcyB0aGUgaG9zdCB1c2VyIHNvIHRoZSBiaW5kIG1vdW50IGlzIG5vdCByb290LW93bmVkLlwiLFxuXHRcdFx0XHRcdFwiIyBEbyBub3Qgc2NhZmZvbGQgbnBtLWF1dGgvIGZyb20gdGhlIGJ1aWxkZXIgKHRoYXQgcnVucyBhcyByb290KS5cIixcblx0XHRcdFx0XHRcInNldCAtZXVvIHBpcGVmYWlsXCIsXG5cdFx0XHRcdFx0XCJcIixcblx0XHRcdFx0XHQncm9vdD1cIiQoY2QgXCIkKGRpcm5hbWUgXCIke0JBU0hfU09VUkNFWzBdfVwiKS8uLlwiICYmIHB3ZClcIicsXG5cdFx0XHRcdFx0J25wbV9kaXI9XCIkcm9vdC8uZGV2Y29udGFpbmVyL25wbS1hdXRoXCInLFxuXHRcdFx0XHRcdCdpZiAhIG1rZGlyIC1wIFwiJG5wbV9kaXJcIiAyPi9kZXYvbnVsbDsgdGhlbicsXG5cdFx0XHRcdFx0J1xcdGVjaG8gXCJDYW5ub3QgY3JlYXRlICRucG1fZGlyIChwZXJtaXNzaW9uIGRlbmllZCkuXCIgPiYyJyxcblx0XHRcdFx0XHQnXFx0ZWNobyBcIlRoZSBzY2FmZm9sZCBjb250YWluZXIgbGlrZWx5IGxlZnQgLmRldmNvbnRhaW5lciByb290LW93bmVkLiBGaXggd2l0aDpcIiA+JjInLFxuXHRcdFx0XHRcdCdcXHRlY2hvIFwiICBzdWRvIGNob3duIC1SIFxcXFxcIiRVU0VSOiRVU0VSXFxcXFwiIFxcXFxcIiRyb290XFxcXFwiXCIgPiYyJyxcblx0XHRcdFx0XHRcIlxcdGV4aXQgMVwiLFxuXHRcdFx0XHRcdFwiZmlcIixcblx0XHRcdFx0XHRcIntcIixcblx0XHRcdFx0XHQnXFx0ZWNobyBcIipcIicsXG5cdFx0XHRcdFx0J1xcdGVjaG8gXCIhLmdpdGlnbm9yZVwiJyxcblx0XHRcdFx0XHQnfSA+XCIkbnBtX2Rpci8uZ2l0aWdub3JlXCInLFxuXHRcdFx0XHRcdFwiXCIsXG5cdFx0XHRcdFx0J2lmIFtbICEgLWYgXCIkbnBtX2Rpci8ubnBtcmNcIiBdXTsgdGhlbicsXG5cdFx0XHRcdFx0J1xcdGlmIFtbIC1mIFwiJHtIT01FfS8ubnBtcmNcIiBdXTsgdGhlbicsXG5cdFx0XHRcdFx0J1xcdFxcdGNwIC1hIFwiJHtIT01FfS8ubnBtcmNcIiBcIiRucG1fZGlyLy5ucG1yY1wiJyxcblx0XHRcdFx0XHRcIlxcdGZpXCIsXG5cdFx0XHRcdFx0XCJmaVwiLFxuXHRcdFx0XHRcdFwiXCIsXG5cdFx0XHRcdF0uam9pbihcIlxcblwiKSxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBcIi5kZXZjb250YWluZXIvcG9zdC1zdGFydC5zaFwiLFxuXHRcdFx0XHRjb250ZW50OiBbXG5cdFx0XHRcdFx0XCIjIS91c3IvYmluL2VudiBiYXNoXCIsXG5cdFx0XHRcdFx0XCIjIFJ1bnMgb24gZXZlcnkgY29udGFpbmVyIHN0YXJ0IChkZXZjb250YWluZXIgcG9zdFN0YXJ0Q29tbWFuZCkuXCIsXG5cdFx0XHRcdFx0XCJzZXQgLWV1byBwaXBlZmFpbFwiLFxuXHRcdFx0XHRcdFwiXCIsXG5cdFx0XHRcdFx0J0FVVEhfUkVHSVNUUlk9XCJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZ1wiJyxcblx0XHRcdFx0XHRcIlwiLFxuXHRcdFx0XHRcdCdpZiBucG0gd2hvYW1pIC0tcmVnaXN0cnkgXCIkQVVUSF9SRUdJU1RSWVwiID4vZGV2L251bGwgMj4mMTsgdGhlbicsXG5cdFx0XHRcdFx0J1xcdGVjaG8gXCJucG06IGxvZ2dlZCBpbiBhcyAkKG5wbSB3aG9hbWkgLS1yZWdpc3RyeSBcIiRBVVRIX1JFR0lTVFJZXCIpXCInLFxuXHRcdFx0XHRcdFwiXFx0ZXhpdCAwXCIsXG5cdFx0XHRcdFx0XCJmaVwiLFxuXHRcdFx0XHRcdFwiXCIsXG5cdFx0XHRcdFx0XCJpZiBbWyAtdCAwICYmIC10IDEgXV07IHRoZW5cIixcblx0XHRcdFx0XHQnXFx0ZWNobyBcIm5wbTogbm90IGF1dGhlbnRpY2F0ZWQg4oCUIHN0YXJ0aW5nIGxvZ2luLi4uXCInLFxuXHRcdFx0XHRcdCdcXHRucG0gbG9naW4gLS1yZWdpc3RyeSBcIiRBVVRIX1JFR0lTVFJZXCInLFxuXHRcdFx0XHRcdFwiXFx0ZXhpdCAwXCIsXG5cdFx0XHRcdFx0XCJmaVwiLFxuXHRcdFx0XHRcdFwiXCIsXG5cdFx0XHRcdFx0J2VjaG8gXCJucG06IG5vdCBhdXRoZW50aWNhdGVkLiBPcGVuIGEgdGVybWluYWwgYW5kIHJ1bjogbnBtIGxvZ2luXCIgPiYyJyxcblx0XHRcdFx0XHQnZWNobyBcIiAgICAoY3JlZHMgcGVyc2lzdCBpbiAuZGV2Y29udGFpbmVyL25wbS1hdXRoLylcIiA+JjInLFxuXHRcdFx0XHRcdFwiZXhpdCAxXCIsXG5cdFx0XHRcdFx0XCJcIixcblx0XHRcdFx0XS5qb2luKFwiXFxuXCIpLFxuXHRcdFx0fSxcblx0XHRdLFxuXHR9KTtcblxuXHRmb3IgKGNvbnN0IGFwaU5hbWUgb2YgYXBpTmFtZXMpIHtcblx0XHRhZGRBcGlQcm9qZWN0KG1vbm9SZXBvLCBuYW1lLCBhcGlOYW1lKTtcblx0fVxuXG5cdHJldHVybiBtb25vUmVwbztcbn1cblxuZnVuY3Rpb24gY3JlYXRlQWRkV29ya3NwYWNlKFxuXHR0YXJnZXREaXI6IHN0cmluZyxcblx0cHJvamVjdE5hbWU6IHN0cmluZyxcblx0YXBpTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogTW9ub1JlcG9TY2FmZm9sZCB7XG5cdGlmICghaXNEZWNvaGVyZVdvcmtzcGFjZSh0YXJnZXREaXIpKSB7XG5cdFx0dGhyb3cgbmV3IENyZWF0ZUNsaUVycm9yKFxuXHRcdFx0YE5vdCBhIERlY29oZXJlIHdvcmtzcGFjZTogJHt0YXJnZXREaXJ9LiBTY2FmZm9sZCBvbmUgZmlyc3Qgd2l0aCBcXGBucHggQGRlY29oZXJlL2NyZWF0ZSB3ZWJhcGlcXGAuYCxcblx0XHQpO1xuXHR9XG5cblx0Y29uc3QgZXhpc3RpbmcgPSBsaXN0RXhpc3RpbmdBcGlOYW1lcyh0YXJnZXREaXIpO1xuXHRmb3IgKGNvbnN0IGFwaU5hbWUgb2YgYXBpTmFtZXMpIHtcblx0XHRpZiAoZXhpc3RpbmcuaW5jbHVkZXMoYXBpTmFtZSkpIHtcblx0XHRcdHRocm93IG5ldyBDcmVhdGVDbGlFcnJvcihcblx0XHRcdFx0YEFQSSBcIiR7YXBpTmFtZX1cIiBhbHJlYWR5IGV4aXN0cyBhdCAke3dlYmFwaVByb2plY3REaXIoYXBpTmFtZSl9LmAsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdGNvbnN0IG1vbm9SZXBvID0gbmV3IE1vbm9SZXBvU2NhZmZvbGQoKTtcblx0bW9ub1JlcG8udGFyZ2V0RGlyID0gdGFyZ2V0RGlyO1xuXHRtb25vUmVwby5zZXROYW1lKHByb2plY3ROYW1lKTtcblx0Y29uc3QgbmFtZSA9IG1vbm9SZXBvLm5hbWU7XG5cblx0Y29uc3QgcGtnID0gUGFja2FnZUpzb24uZnJvbUZpbGUoam9pbih0YXJnZXREaXIsIFwicGFja2FnZS5qc29uXCIpKTtcblx0bW9ub1JlcG8uYWRkTW9kZWwocGtnKTtcblx0bW9ub1JlcG8uYWRkTW9kZWwoXG5cdFx0ZXhpc3RzU3luYyhqb2luKHRhcmdldERpciwgXCIuZW52XCIpKVxuXHRcdFx0PyBFbnZGaWxlLmZyb21GaWxlKGpvaW4odGFyZ2V0RGlyLCBcIi5lbnZcIikpXG5cdFx0XHQ6IG5ldyBFbnZGaWxlKCksXG5cdCk7XG5cdG1vbm9SZXBvLmFkZE1vZGVsKFxuXHRcdGV4aXN0c1N5bmMoam9pbih0YXJnZXREaXIsIFwiY29uZmlnL2NvbmZpZy55YW1sXCIpKVxuXHRcdFx0PyBDb25maWdZYW1sLmZyb21GaWxlKFxuXHRcdFx0XHRcdFdFTExfS05PV05fRklMRVMuQ09ORklHX1lBTUwsXG5cdFx0XHRcdFx0XCJjb25maWcvY29uZmlnLnlhbWxcIixcblx0XHRcdFx0XHRqb2luKHRhcmdldERpciwgXCJjb25maWcvY29uZmlnLnlhbWxcIiksXG5cdFx0XHRcdClcblx0XHRcdDogbmV3IENvbmZpZ1lhbWwoV0VMTF9LTk9XTl9GSUxFUy5DT05GSUdfWUFNTCwgXCJjb25maWcvY29uZmlnLnlhbWxcIiwgXCJcIiksXG5cdCk7XG5cdG1vbm9SZXBvLmFkZE1vZGVsKFxuXHRcdGV4aXN0c1N5bmMoam9pbih0YXJnZXREaXIsIFwiY29uZmlnL2NvbmZpZy5kZXYueWFtbFwiKSlcblx0XHRcdD8gQ29uZmlnWWFtbC5mcm9tRmlsZShcblx0XHRcdFx0XHRXRUxMX0tOT1dOX0ZJTEVTLkNPTkZJR19ERVZfWUFNTCxcblx0XHRcdFx0XHRcImNvbmZpZy9jb25maWcuZGV2LnlhbWxcIixcblx0XHRcdFx0XHRqb2luKHRhcmdldERpciwgXCJjb25maWcvY29uZmlnLmRldi55YW1sXCIpLFxuXHRcdFx0XHQpXG5cdFx0XHQ6IG5ldyBDb25maWdZYW1sKFdFTExfS05PV05fRklMRVMuQ09ORklHX0RFVl9ZQU1MLCBcImNvbmZpZy9jb25maWcuZGV2LnlhbWxcIiwgXCJcIiksXG5cdCk7XG5cblx0Zm9yIChjb25zdCBbb2Zmc2V0LCBhcGlOYW1lXSBvZiBhcGlOYW1lcy5lbnRyaWVzKCkpIHtcblx0XHRjb25zdCBwb3J0ID0gd2ViYXBpUG9ydChleGlzdGluZy5sZW5ndGggKyBvZmZzZXQpO1xuXHRcdHBrZy5hZGRTY3JpcHQoYHN0YXJ0OiR7YXBpTmFtZX1gLCBgbm9kZSAke3dlYmFwaVJlbGVhc2VFbnRyeShhcGlOYW1lKX1gKTtcblx0XHRwa2cuYWRkU2NyaXB0KFxuXHRcdFx0YGRldjoke2FwaU5hbWV9YCxcblx0XHRcdGBQT1JUPSR7cG9ydH0gZmx1eCBzZXJ2ZSAtLXByb2plY3QgJHt3ZWJhcGlQYWNrYWdlTmFtZShuYW1lLCBhcGlOYW1lKX1gLFxuXHRcdCk7XG5cdFx0YWRkQXBpUHJvamVjdChtb25vUmVwbywgbmFtZSwgYXBpTmFtZSk7XG5cdH1cblx0bW9ub1JlcG8uYWRkTW9kZWwobmV3IFdlYmFwaVByb2R1Y3Rpb25Eb2NrZXJmaWxlKGFwaU5hbWVzLCB7IG5hbWVkT25seTogdHJ1ZSB9KSk7XG5cblx0cmV0dXJuIG1vbm9SZXBvO1xufVxuXG5mdW5jdGlvbiBhZGRBcGlQcm9qZWN0KFxuXHRtb25vUmVwbzogTW9ub1JlcG9TY2FmZm9sZCxcblx0d29ya3NwYWNlTmFtZTogc3RyaW5nLFxuXHRhcGlOYW1lOiBzdHJpbmcsXG4pOiB2b2lkIHtcblx0Y29uc3QgYXBpUHJvamVjdCA9IG5ldyBQcm9qZWN0U2NhZmZvbGQod2ViYXBpUHJvamVjdERpcihhcGlOYW1lKSk7XG5cdGFwaVByb2plY3QuYWRkTW9kZWwobmV3IEFwaVBhY2thZ2VKc29uKHdvcmtzcGFjZU5hbWUsIGFwaU5hbWUpKTtcblx0YXBpUHJvamVjdC5hZGRNb2RlbChuZXcgTWFpblNvdXJjZUZpbGUoYCR7d29ya3NwYWNlTmFtZX0uJHthcGlOYW1lfWApKTtcblx0YXBpUHJvamVjdC5hZGRNb2RlbChuZXcgQ29udHJvbGxlclNvdXJjZUZpbGUoKSk7XG5cdGFwaVByb2plY3QuYWRkRmlsZShuZXcgU2FtcGxlQ29uZmlnTW9kZWwoKSk7XG5cdGFwaVByb2plY3QuYWRkRmlsZShuZXcgU2FtcGxlU2VydmljZU1vZGVsKCkpO1xuXHRtb25vUmVwby5hZGRQcm9qZWN0KGFwaVByb2plY3QpO1xufVxuIl0sIm5hbWVzIjpbImV4aXN0c1N5bmMiLCJiYXNlbmFtZSIsImpvaW4iLCJyZXNvbHZlIiwiRG9ja2VyQ29tcG9zZSIsIkNvbmZpZ1lhbWwiLCJXRUxMX0tOT1dOX0ZJTEVTIiwiRGV2Q29udGFpbmVyIiwiRW52RmlsZSIsIkdpdGlnbm9yZSIsIkxhdW5jaEpzb24iLCJQYWNrYWdlSnNvbiIsIk1vbm9SZXBvU2NhZmZvbGQiLCJQcm9qZWN0U2NhZmZvbGQiLCJUc0NvbmZpZyIsIlZTQ29kZVNldHRpbmdzIiwiU2NhZmZvbGRTZXJ2aWNlIiwiQ3JlYXRlQ2xpRXJyb3IiLCJpc0RlY29oZXJlV29ya3NwYWNlIiwibGlzdEV4aXN0aW5nQXBpTmFtZXMiLCJwYXJzZUFwaU5hbWVzIiwiREVGQVVMVF9XRUJBUElfTkFNRSIsIndlYmFwaVBhY2thZ2VOYW1lIiwid2ViYXBpUG9ydCIsIndlYmFwaVByb2plY3REaXIiLCJ3ZWJhcGlSZWxlYXNlRW50cnkiLCJBdXRoRmVhdHVyZSIsIkRhdGFiYXNlRmVhdHVyZSIsIkZpbmFsaXplRmVhdHVyZSIsIlBvc3RtYW5GZWF0dXJlIiwiQXBpUGFja2FnZUpzb24iLCJDb250cm9sbGVyU291cmNlRmlsZSIsIkdpdGh1YkNpV29ya2Zsb3dzIiwiTWFpblNvdXJjZUZpbGUiLCJXZWJhcGlQcm9kdWN0aW9uRG9ja2VyZmlsZSIsIlNhbXBsZUNvbmZpZ01vZGVsIiwiU2FtcGxlU2VydmljZU1vZGVsIiwiV2ViYXBpRGV2Q29udGFpbmVyIiwiV0VCQVBJX1BST0pFQ1RfRElSIiwiV0VCQVBJX1JFTEVBU0VfRU5UUlkiLCJmZWF0dXJlcyIsInNjYWZmb2xkQXBpIiwiY2xpT3B0aW9ucyIsInRhcmdldERpciIsImQiLCJwcm9qZWN0TmFtZSIsInRyaW0iLCJwcm9jZXNzIiwiZW52IiwiREVDT0hFUkVfUFJPSkVDVF9OQU1FIiwibmFtZXMiLCJ3b3Jrc3BhY2UiLCJhZGQiLCJjcmVhdGVBZGRXb3Jrc3BhY2UiLCJjcmVhdGVXb3Jrc3BhY2UiLCJzY2FmZm9sZCIsImFwaU5hbWVzIiwibW9ub1JlcG8iLCJzZXROYW1lIiwibmFtZSIsImNvbXBvc2UiLCJzZXRQcm9qZWN0TmFtZSIsImFkZE5ldHdvcmsiLCJhZGRTZXJ2aWNlIiwiYnVpbGQiLCJ2b2x1bWVzIiwiZW52aXJvbm1lbnQiLCJOUE1fQ09ORklHX1VTRVJDT05GSUciLCJjb21tYW5kIiwibmV0d29ya3MiLCJhZGRWb2x1bWUiLCJkZXZDb250YWluZXIiLCJhZGRFeHRlbnNpb24iLCJzZXRJbml0aWFsaXplQ29tbWFuZCIsInNldFBvc3RTdGFydENvbW1hbmQiLCJ1c2VDb21wb3NlIiwiaW5kZXgiLCJhcGlOYW1lIiwiZW50cmllcyIsInBvcnQiLCJmb3J3YXJkUG9ydCIsInNldFBvcnRBdHRyaWJ1dGVzIiwibGFiZWwiLCJyZXF1aXJlTG9jYWxQb3J0IiwiYWRkTW9kZWwiLCJ3b3Jrc3BhY2VOYW1lIiwiQ09ORklHX1lBTUwiLCJDT05GSUdfREVWX1lBTUwiLCJhZGRGaWxlIiwiZmlsZXMiLCJmaWxlUGF0aCIsImNvbnRlbnQiLCJKU09OIiwic3RyaW5naWZ5IiwiJHNjaGVtYSIsImluY2x1ZGVzIiwiYXNzaXN0IiwiYWN0aW9ucyIsInNvdXJjZSIsIm9yZ2FuaXplSW1wb3J0cyIsInZjcyIsImVuYWJsZWQiLCJjbGllbnRLaW5kIiwidXNlSWdub3JlRmlsZSIsImZvcm1hdHRlciIsImZvcm1hdFdpdGhFcnJvcnMiLCJpbmRlbnRTdHlsZSIsImxpbmVXaWR0aCIsImphdmFzY3JpcHQiLCJwYXJzZXIiLCJ1bnNhZmVQYXJhbWV0ZXJEZWNvcmF0b3JzRW5hYmxlZCIsImxpbnRlciIsInJ1bGVzIiwic3R5bGUiLCJ1c2VDb25zaXN0ZW50TWVtYmVyQWNjZXNzaWJpbGl0eSIsImxldmVsIiwib3B0aW9ucyIsImFjY2Vzc2liaWxpdHkiLCJvdmVycmlkZXMiLCJpbmRlbnRXaWR0aCIsImFkZEFwaVByb2plY3QiLCJleGlzdGluZyIsInBrZyIsImZyb21GaWxlIiwib2Zmc2V0IiwibGVuZ3RoIiwiYWRkU2NyaXB0IiwibmFtZWRPbmx5IiwiYXBpUHJvamVjdCIsImFkZFByb2plY3QiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFVBQVUsUUFBUSxVQUFVO0FBQ3JDLFNBQVNDLFFBQVEsRUFBRUMsSUFBSSxFQUFFQyxPQUFPLFFBQVEsWUFBWTtBQUNwRCxTQUFTQyxhQUFhLFFBQVEsNkJBQTZCO0FBQzNELFNBQVNDLFVBQVUsUUFBUSxpQ0FBaUM7QUFDNUQsU0FBU0MsZ0JBQWdCLFFBQVEscUJBQXFCO0FBQ3RELFNBQVNDLFlBQVksUUFBUSxtQ0FBbUM7QUFDaEUsU0FBU0MsT0FBTyxRQUFRLDhCQUE4QjtBQUN0RCxTQUFTQyxTQUFTLFFBQVEsK0JBQStCO0FBQ3pELFNBQVNDLFVBQVUsUUFBUSxpQ0FBaUM7QUFDNUQsU0FBU0MsV0FBVyxRQUFRLGtDQUFrQztBQUM5RCxTQUFTQyxnQkFBZ0IsRUFBRUMsZUFB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
@@ -1,6 +1,5 @@
1
1
  import { ask, pick } from "../../domain/prompt.js";
2
2
  import { WELL_KNOWN_FILES } from "../../models/const.js";
3
- import { WEBAPI_PROJECT_DIR } from "../const.js";
4
3
  import { AuthConfigModel } from "../models/auth-config.model.js";
5
4
  import { ControllerSourceFile } from "../models/controller-source-file.model.js";
6
5
  import * as auth0Cli from "./auth0-cli.js";
@@ -296,51 +295,52 @@ function createAuth0AdminUser(workspace, options, authConfig) {
296
295
  }
297
296
  function scaffoldLocalUserProfile(workspace) {
298
297
  workspace.getModel(WELL_KNOWN_FILES.PACKAGE_JSON)?.addDependency("@casl/ability", "^6.8.1");
299
- workspace.getModel(WELL_KNOWN_FILES.API_PACKAGE_JSON)?.addDependency("@casl/ability", "^6.8.1");
300
- const main = workspace.getModel(WELL_KNOWN_FILES.MAIN_TS);
301
- main?.addEntity({
302
- className: "UserEntity",
303
- importPath: "./entities/user.entity.js"
304
- }).addRepository({
305
- className: "UserEntityRepository",
306
- importPath: "./repositories/user.repository.js"
307
- }).addService({
308
- className: "UserService",
309
- importPath: "./services/user.service.js",
310
- scope: "request"
311
- }).addImport("createAbilityFactory", "./auth/ability.factory.js").addImport("mapPrincipal", "./auth/ability.factory.js").setTypeOrmSeed([
312
- "const sub = process.env.AUTH0_ADMIN_USER_SUB;",
313
- "if (!sub) return;",
314
- "const repo = dataSource.getRepository(UserEntity);",
315
- "const existing = await repo.findOne({ where: { sub } });",
316
- "if (existing) return;",
317
- "await repo.save(repo.create({",
318
- " sub,",
319
- " email: process.env.AUTH0_ADMIN_USER_EMAIL ?? null,",
320
- ' displayName: process.env.AUTH0_ADMIN_USERNAME ?? "admin",',
321
- ' roles: ["admin"],',
322
- "}));"
323
- ].join(" "));
324
- workspace.getProject(WEBAPI_PROJECT_DIR)?.addFile({
325
- files: ()=>[
326
- {
327
- filePath: "src/entities/user.entity.ts",
328
- content: USER_ENTITY_TS
329
- },
330
- {
331
- filePath: "src/repositories/user.repository.ts",
332
- content: USER_REPOSITORY_TS
333
- },
334
- {
335
- filePath: "src/services/user.service.ts",
336
- content: USER_SERVICE_TS
337
- },
338
- {
339
- filePath: "src/auth/ability.factory.ts",
340
- content: ABILITY_FACTORY_TS
341
- }
342
- ]
343
- });
298
+ for (const project of workspace.getProjects()){
299
+ project.getModel(WELL_KNOWN_FILES.API_PACKAGE_JSON)?.addDependency("@casl/ability", "^6.8.1");
300
+ project.getModel(WELL_KNOWN_FILES.MAIN_TS)?.addEntity({
301
+ className: "UserEntity",
302
+ importPath: "./entities/user.entity.js"
303
+ }).addRepository({
304
+ className: "UserEntityRepository",
305
+ importPath: "./repositories/user.repository.js"
306
+ }).addService({
307
+ className: "UserService",
308
+ importPath: "./services/user.service.js",
309
+ scope: "request"
310
+ }).addImport("createAbilityFactory", "./auth/ability.factory.js").addImport("mapPrincipal", "./auth/ability.factory.js").setTypeOrmSeed([
311
+ "const sub = process.env.AUTH0_ADMIN_USER_SUB;",
312
+ "if (!sub) return;",
313
+ "const repo = dataSource.getRepository(UserEntity);",
314
+ "const existing = await repo.findOne({ where: { sub } });",
315
+ "if (existing) return;",
316
+ "await repo.save(repo.create({",
317
+ " sub,",
318
+ " email: process.env.AUTH0_ADMIN_USER_EMAIL ?? null,",
319
+ ' displayName: process.env.AUTH0_ADMIN_USERNAME ?? "admin",',
320
+ ' roles: ["admin"],',
321
+ "}));"
322
+ ].join(" "));
323
+ project.addFile({
324
+ files: ()=>[
325
+ {
326
+ filePath: "src/entities/user.entity.ts",
327
+ content: USER_ENTITY_TS
328
+ },
329
+ {
330
+ filePath: "src/repositories/user.repository.ts",
331
+ content: USER_REPOSITORY_TS
332
+ },
333
+ {
334
+ filePath: "src/services/user.service.ts",
335
+ content: USER_SERVICE_TS
336
+ },
337
+ {
338
+ filePath: "src/auth/ability.factory.ts",
339
+ content: ABILITY_FACTORY_TS
340
+ }
341
+ ]
342
+ });
343
+ }
344
344
  for (const controller of workspace.getModels(ControllerSourceFile)){
345
345
  controller.addImport("UserService", "../services/user.service.js").addConstructorParam("private readonly users: UserService");
346
346
  controller.getMethod("getOne").setAsync(true).setBody([
@@ -375,13 +375,18 @@ function scaffold(workspace, options) {
375
375
  controller.getMethod("update").addDecorator(`@Authorize("update", "${resource}")`);
376
376
  controller.getMethod("remove").addDecorator(`@Authorize("delete", "${resource}")`);
377
377
  }
378
- const main = workspace.getModel(WELL_KNOWN_FILES.MAIN_TS);
379
- main?.addSideEffectImport("@decohere/cortex/auth");
378
+ for (const project of workspace.getProjects()){
379
+ project.getModel(WELL_KNOWN_FILES.MAIN_TS)?.addSideEffectImport("@decohere/cortex/auth");
380
+ }
380
381
  if (withLocalUsers) {
381
382
  scaffoldLocalUserProfile(workspace);
382
- main?.addBuilderCall(".withAuth(createAbilityFactory, { principalMapper: mapPrincipal })");
383
+ for (const project of workspace.getProjects()){
384
+ project.getModel(WELL_KNOWN_FILES.MAIN_TS)?.addBuilderCall(".withAuth(createAbilityFactory, { principalMapper: mapPrincipal })");
385
+ }
383
386
  } else {
384
- main?.addBuilderCall(".withAuth()");
387
+ for (const project of workspace.getProjects()){
388
+ project.getModel(WELL_KNOWN_FILES.MAIN_TS)?.addBuilderCall(".withAuth()");
389
+ }
385
390
  }
386
391
  // biome-ignore lint/suspicious/noTemplateCurlyInString: intentional YAML env-var placeholders
387
392
  const issuerPlaceholder = "${AUTH0_ISSUER_BASE_URL}";
@@ -404,4 +409,4 @@ export const AuthFeature = {
404
409
  scaffold
405
410
  };
406
411
 
407
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL2ZlYXR1cmVzL2F1dGguZmVhdHVyZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhc2ssIHBpY2sgfSBmcm9tIFwiLi4vLi4vZG9tYWluL3Byb21wdC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBDb25maWdZYW1sIH0gZnJvbSBcIi4uLy4uL21vZGVscy9jb25maWcteWFtbC5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgV0VMTF9LTk9XTl9GSUxFUyB9IGZyb20gXCIuLi8uLi9tb2RlbHMvY29uc3QuanNcIjtcbmltcG9ydCB0eXBlIHsgRW52RmlsZSB9IGZyb20gXCIuLi8uLi9tb2RlbHMvZW52LWZpbGUubW9kZWwuanNcIjtcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3BhY2thZ2UtanNvbi5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2VTY2FmZm9sZCB9IGZyb20gXCIuLi8uLi9tb2RlbHMvcHJvamVjdC5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBGZWF0dXJlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3NjYWZmb2xkLnNlcnZpY2UuanNcIjtcbmltcG9ydCB7IFdFQkFQSV9QUk9KRUNUX0RJUiB9IGZyb20gXCIuLi9jb25zdC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBBcGlQYWNrYWdlSnNvbiB9IGZyb20gXCIuLi9tb2RlbHMvYXBpLXBhY2thZ2UtanNvbi5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgQXV0aENvbmZpZ01vZGVsIH0gZnJvbSBcIi4uL21vZGVscy9hdXRoLWNvbmZpZy5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgQ29udHJvbGxlclNvdXJjZUZpbGUgfSBmcm9tIFwiLi4vbW9kZWxzL2NvbnRyb2xsZXItc291cmNlLWZpbGUubW9kZWwuanNcIjtcbmltcG9ydCB0eXBlIHsgTWFpblNvdXJjZUZpbGUgfSBmcm9tIFwiLi4vbW9kZWxzL21haW4tc291cmNlLWZpbGUubW9kZWwuanNcIjtcbmltcG9ydCAqIGFzIGF1dGgwQ2xpIGZyb20gXCIuL2F1dGgwLWNsaS5qc1wiO1xuXG5leHBvcnQgdHlwZSBBdXRoT3B0aW9ucyA9IHtcblx0YXV0aFByb3ZpZGVyPzogXCJhdXRoMFwiIHwgXCJub25lXCI7XG5cdGlzc3VlckJhc2VVcmw/OiBzdHJpbmc7XG5cdGF1ZGllbmNlPzogc3RyaW5nO1xuXHRkYXRhYmFzZVByb3ZpZGVyPzogXCJub25lXCIgfCBcInBvc3RncmVzL3R5cGVvcm1cIjtcblx0YWRtaW5Vc2VybmFtZT86IHN0cmluZztcblx0YWRtaW5QYXNzd29yZD86IHN0cmluZztcbn07XG5cbmNvbnN0IEFETUlOX1JPTEUgPSBcImFkbWluXCI7XG5cbmNvbnN0IFVTRVJfRU5USVRZX1RTID0gYGltcG9ydCB7IENvbHVtbiwgRW50aXR5LCBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uIH0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5IGFzIElFbnRpdHkgfSBmcm9tIFwiQGRlY29oZXJlL2NvZGV4XCI7XG5cbkBFbnRpdHkoKVxuZXhwb3J0IGNsYXNzIFVzZXJFbnRpdHkgaW1wbGVtZW50cyBJRW50aXR5IHtcblxcdEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKClcblxcdHB1YmxpYyBpZCE6IG51bWJlcjtcblxuXFx0QENvbHVtbih7IHVuaXF1ZTogdHJ1ZSB9KVxuXFx0cHVibGljIHN1YiE6IHN0cmluZztcblxuXFx0QENvbHVtbih7IHR5cGU6IFwidmFyY2hhclwiLCBudWxsYWJsZTogdHJ1ZSB9KVxuXFx0cHVibGljIGVtYWlsITogc3RyaW5nIHwgbnVsbDtcblxuXFx0QENvbHVtbigpXG5cXHRwdWJsaWMgZGlzcGxheU5hbWUhOiBzdHJpbmc7XG5cblxcdC8qKiBBcHAtb3duZWQgcm9sZXMuIFRoZSBcXGBhZG1pblxcYCByb2xlIGdyYW50cyBDQVNMIFxcYG1hbmFnZVxcYC9cXGBhbGxcXGAgKHdpbGRjYXJkKS4gKi9cblxcdEBDb2x1bW4oeyB0eXBlOiBcInNpbXBsZS1qc29uXCIsIGRlZmF1bHQ6IFwiW11cIiB9KVxuXFx0cHVibGljIHJvbGVzITogc3RyaW5nW107XG59XG5gO1xuXG5jb25zdCBVU0VSX1JFUE9TSVRPUllfVFMgPSBgaW1wb3J0IHsgaW5qZWN0YWJsZSB9IGZyb20gXCJAZGVjb2hlcmUvY3J1Y2libGUvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgaW5qZWN0VW5pdE9mV29yayB9IGZyb20gXCJAZGVjb2hlcmUvY29kZXhcIjtcbmltcG9ydCB7IFR5cGVPcm1SZXBvc2l0b3J5LCBUeXBlT3JtVW5pdE9mV29yayB9IGZyb20gXCJAZGVjb2hlcmUvY29kZXgtdHlwZW9ybVwiO1xuaW1wb3J0IHsgVXNlckVudGl0eSB9IGZyb20gXCIuLi9lbnRpdGllcy91c2VyLmVudGl0eS5qc1wiO1xuXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVXNlckVudGl0eVJlcG9zaXRvcnkgZXh0ZW5kcyBUeXBlT3JtUmVwb3NpdG9yeTxVc2VyRW50aXR5PiB7XG5cXHRwdWJsaWMgY29uc3RydWN0b3IoQGluamVjdFVuaXRPZldvcmsoKSB1bml0T2ZXb3JrOiBUeXBlT3JtVW5pdE9mV29yaykge1xuXFx0XFx0c3VwZXIodW5pdE9mV29yaywgVXNlckVudGl0eSk7XG5cXHR9XG5cblxcdHB1YmxpYyBmaW5kQnlTdWIoc3ViOiBzdHJpbmcpOiBQcm9taXNlPFVzZXJFbnRpdHkgfCBudWxsPiB7XG5cXHRcXHRyZXR1cm4gdGhpcy5maXJzdE9yRGVmYXVsdCh7IHdoZXJlOiB7IHN1YiB9IH0pO1xuXFx0fVxufVxuYDtcblxuY29uc3QgVVNFUl9TRVJWSUNFX1RTID0gYGltcG9ydCB7IGluamVjdGFibGUgfSBmcm9tIFwiQGRlY29oZXJlL2NydWNpYmxlL2RlY29yYXRvcnNcIjtcbmltcG9ydCB0eXBlIHsgUHJpbmNpcGFsIH0gZnJvbSBcIkBkZWNvaGVyZS9jb3J0ZXhcIjtcbmltcG9ydCB7IFVzZXJFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXRpZXMvdXNlci5lbnRpdHkuanNcIjtcbmltcG9ydCB7IFVzZXJFbnRpdHlSZXBvc2l0b3J5IH0gZnJvbSBcIi4uL3JlcG9zaXRvcmllcy91c2VyLnJlcG9zaXRvcnkuanNcIjtcblxuZnVuY3Rpb24gY2xhaW1TdHJpbmcocHJpbmNpcGFsOiBQcmluY2lwYWwgfCB1bmRlZmluZWQsIGtleTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblxcdGNvbnN0IHZhbHVlID0gcHJpbmNpcGFsPy5ba2V5XTtcblxcdHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUubGVuZ3RoID4gMCA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVXNlclNlcnZpY2Uge1xuXFx0cHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgdXNlcnM6IFVzZXJFbnRpdHlSZXBvc2l0b3J5KSB7fVxuXG5cXHQvKipcblxcdCAqIFVwc2VydCBhIGxvY2FsIHByb2ZpbGUga2V5ZWQgYnkgSldUIFxcYHN1YlxcYC5cblxcdCAqIFByb2ZpbGUgZmllbGRzIGZyb20gdGhlIHRva2VuIGZpbGwgZ2Fwczsgc2VlZGVkIHJvd3Mga2VlcCBkaXNwbGF5TmFtZS9lbWFpbC9yb2xlcy5cblxcdCAqL1xuXFx0cHVibGljIGFzeW5jIGVuc3VyZUZyb21QcmluY2lwYWwocHJpbmNpcGFsOiBQcmluY2lwYWwgfCB1bmRlZmluZWQpOiBQcm9taXNlPFVzZXJFbnRpdHk+IHtcblxcdFxcdGNvbnN0IHN1YiA9IHByaW5jaXBhbD8uc3ViO1xuXFx0XFx0aWYgKCFzdWIpIHtcblxcdFxcdFxcdHRocm93IG5ldyBFcnJvcihcIkF1dGhlbnRpY2F0ZWQgcmVxdWVzdCBpcyBtaXNzaW5nIHByaW5jaXBhbC5zdWJcIik7XG5cXHRcXHR9XG5cblxcdFxcdGNvbnN0IGVtYWlsID1cblxcdFxcdFxcdGNsYWltU3RyaW5nKHByaW5jaXBhbCwgXCJlbWFpbFwiKSA/PyBjbGFpbVN0cmluZyhwcmluY2lwYWwsIFwicHJlZmVycmVkX3VzZXJuYW1lXCIpO1xuXFx0XFx0Y29uc3QgZGlzcGxheUZyb21Ub2tlbiA9XG5cXHRcXHRcXHRjbGFpbVN0cmluZyhwcmluY2lwYWwsIFwibmFtZVwiKSA/P1xuXFx0XFx0XFx0Y2xhaW1TdHJpbmcocHJpbmNpcGFsLCBcIm5pY2tuYW1lXCIpID8/XG5cXHRcXHRcXHRlbWFpbDtcblxuXFx0XFx0Y29uc3QgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLnVzZXJzLmZpbmRCeVN1YihzdWIpO1xuXFx0XFx0aWYgKGV4aXN0aW5nKSB7XG5cXHRcXHRcXHRsZXQgZGlydHkgPSBmYWxzZTtcblxcdFxcdFxcdGlmICghZXhpc3RpbmcuZW1haWwgJiYgZW1haWwpIHtcblxcdFxcdFxcdFxcdGV4aXN0aW5nLmVtYWlsID0gZW1haWw7XG5cXHRcXHRcXHRcXHRkaXJ0eSA9IHRydWU7XG5cXHRcXHRcXHR9XG5cXHRcXHRcXHRpZiAoZXhpc3RpbmcuZGlzcGxheU5hbWUgPT09IGV4aXN0aW5nLnN1YiAmJiBkaXNwbGF5RnJvbVRva2VuKSB7XG5cXHRcXHRcXHRcXHRleGlzdGluZy5kaXNwbGF5TmFtZSA9IGRpc3BsYXlGcm9tVG9rZW47XG5cXHRcXHRcXHRcXHRkaXJ0eSA9IHRydWU7XG5cXHRcXHRcXHR9XG5cXHRcXHRcXHRyZXR1cm4gZGlydHkgPyB0aGlzLnVzZXJzLnNhdmUoZXhpc3RpbmcpIDogZXhpc3Rpbmc7XG5cXHRcXHR9XG5cblxcdFxcdGNvbnN0IGNyZWF0ZWQgPSBuZXcgVXNlckVudGl0eSgpO1xuXFx0XFx0Y3JlYXRlZC5zdWIgPSBzdWI7XG5cXHRcXHRjcmVhdGVkLmVtYWlsID0gZW1haWwgPz8gbnVsbDtcblxcdFxcdGNyZWF0ZWQuZGlzcGxheU5hbWUgPSBkaXNwbGF5RnJvbVRva2VuID8/IHN1YjtcblxcdFxcdGNyZWF0ZWQucm9sZXMgPSBBcnJheS5pc0FycmF5KHByaW5jaXBhbC5yb2xlcylcblxcdFxcdFxcdD8gcHJpbmNpcGFsLnJvbGVzLmZpbHRlcigocik6IHIgaXMgc3RyaW5nID0+IHR5cGVvZiByID09PSBcInN0cmluZ1wiKVxuXFx0XFx0XFx0OiBbXTtcblxcdFxcdHJldHVybiB0aGlzLnVzZXJzLnNhdmUoY3JlYXRlZCk7XG5cXHR9XG59XG5gO1xuXG5jb25zdCBBQklMSVRZX0ZBQ1RPUllfVFMgPSBgaW1wb3J0IHsgQWJpbGl0eUJ1aWxkZXIsIGNyZWF0ZU1vbmdvQWJpbGl0eSB9IGZyb20gXCJAY2FzbC9hYmlsaXR5XCI7XG5pbXBvcnQgdHlwZSB7IFByaW5jaXBhbCB9IGZyb20gXCJAZGVjb2hlcmUvY29ydGV4XCI7XG5cbi8qKiBSb290IHJvbGUg4oCUIGV4cGFuZHMgdG8gQ0FTTCBcXGBtYW5hZ2VcXGAvXFxgYWxsXFxgIChjb3ZlcnMgZXZlcnkgZnV0dXJlIGFiaWxpdHkpLiAqL1xuZXhwb3J0IGNvbnN0IEFETUlOX1JPTEUgPSBcImFkbWluXCI7XG5cbi8qKlxuICogUm9sZXMgYXJlIGNvbGxlY3Rpb25zIG9mIGFiaWxpdGllcy4gQWRtaW4gaXMgYSB3aWxkY2FyZCwgbm90IGFuIGVudW1lcmF0ZWQgbGlzdC5cbiAqIE5vbi1hZG1pbiBwcmluY2lwYWxzIGtlZXAgQXV0aDAgc2NvcGUgLyBwZXJtaXNzaW9uIOKGkiBhYmlsaXR5IG1hcHBpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBYmlsaXR5RmFjdG9yeShwcmluY2lwYWw6IFByaW5jaXBhbCkge1xuXFx0Y29uc3QgeyBjYW4sIGJ1aWxkIH0gPSBuZXcgQWJpbGl0eUJ1aWxkZXIoY3JlYXRlTW9uZ29BYmlsaXR5KTtcblxcdGlmIChwcmluY2lwYWwucm9sZXM/LmluY2x1ZGVzKEFETUlOX1JPTEUpKSB7XG5cXHRcXHRjYW4oXCJtYW5hZ2VcIiwgXCJhbGxcIik7XG5cXHRcXHRyZXR1cm4gYnVpbGQoKTtcblxcdH1cblxcdGZvciAoY29uc3Qgc2NvcGUgb2YgcHJpbmNpcGFsLnNjb3BlcyA/PyBbXSkge1xuXFx0XFx0Y29uc3QgW2FjdGlvbiwgc3ViamVjdF0gPSBzY29wZS5zcGxpdChcIjpcIik7XG5cXHRcXHRpZiAoYWN0aW9uICYmIHN1YmplY3QpIGNhbihhY3Rpb24sIHN1YmplY3QpO1xuXFx0fVxuXFx0cmV0dXJuIGJ1aWxkKCk7XG59XG5cbi8qKlxuICogTWFwIEpXVCBwYXlsb2FkIOKGkiBQcmluY2lwYWwuXG4gKlxuICogLSBcXGByb2xlc1xcYCBjb21lIGZyb20gdGhlIElkUCAoQXV0aDAgUkJBQyAvIEFjdGlvbiBmcm9tIGFwcF9tZXRhZGF0YSkuIEFkbWlucyBhcmVcbiAqICAgYXNzaWduZWQgaW4gQXV0aDAg4oCUIG5vIHNlcnZlciBlbnYgY2hhbmdlIHJlcXVpcmVkIGZvciBhZGRpdGlvbmFsIGFkbWlucy5cbiAqIC0gXFxgQVVUSDBfQURNSU5fVVNFUl9TVUJcXGAgaXMgYW4gb3B0aW9uYWwgYm9vdHN0cmFwIHNvIHRoZSBzZWVkZWQgYWRtaW4gd29ya3NcbiAqICAgYmVmb3JlL3dpdGhvdXQgcm9sZXMgb24gdGhlIGFjY2VzcyB0b2tlbi5cbiAqIC0gQVBJIHBlcm1pc3Npb25zIGFyZSB0YWtlbiBmcm9tIFxcYHNjb3BlXFxgIGFuZCBmcm9tIEF1dGgwJ3MgXFxgcGVybWlzc2lvbnNcXGAgY2xhaW0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBQcmluY2lwYWwocGF5bG9hZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcmluY2lwYWwge1xuXFx0Y29uc3Qgc3ViID0gdHlwZW9mIHBheWxvYWQuc3ViID09PSBcInN0cmluZ1wiID8gcGF5bG9hZC5zdWIgOiBcIlwiO1xuXFx0Y29uc3QgZnJvbVNjb3BlQ2xhaW0gPVxuXFx0XFx0dHlwZW9mIHBheWxvYWQuc2NvcGUgPT09IFwic3RyaW5nXCJcblxcdFxcdFxcdD8gcGF5bG9hZC5zY29wZS5zcGxpdChcIiBcIikuZmlsdGVyKEJvb2xlYW4pXG5cXHRcXHRcXHQ6IEFycmF5LmlzQXJyYXkocGF5bG9hZC5zY29wZXMpXG5cXHRcXHRcXHRcXHQ/IChwYXlsb2FkLnNjb3BlcyBhcyB1bmtub3duW10pLmZpbHRlcigocyk6IHMgaXMgc3RyaW5nID0+IHR5cGVvZiBzID09PSBcInN0cmluZ1wiKVxuXFx0XFx0XFx0XFx0OiBbXTtcblxcdGNvbnN0IGZyb21QZXJtaXNzaW9ucyA9IEFycmF5LmlzQXJyYXkocGF5bG9hZC5wZXJtaXNzaW9ucylcblxcdFxcdD8gKHBheWxvYWQucGVybWlzc2lvbnMgYXMgdW5rbm93bltdKS5maWx0ZXIoKHMpOiBzIGlzIHN0cmluZyA9PiB0eXBlb2YgcyA9PT0gXCJzdHJpbmdcIilcblxcdFxcdDogW107XG5cXHRjb25zdCBtZXJnZWQgPSBbLi4ubmV3IFNldChbLi4uZnJvbVNjb3BlQ2xhaW0sIC4uLmZyb21QZXJtaXNzaW9uc10pXTtcblxcdGNvbnN0IHNjb3BlcyA9IG1lcmdlZC5sZW5ndGggPiAwID8gbWVyZ2VkIDogdW5kZWZpbmVkO1xuXFx0Y29uc3QgZnJvbVRva2VuID0gQXJyYXkuaXNBcnJheShwYXlsb2FkLnJvbGVzKVxuXFx0XFx0PyAocGF5bG9hZC5yb2xlcyBhcyB1bmtub3duW10pLmZpbHRlcigocik6IHIgaXMgc3RyaW5nID0+IHR5cGVvZiByID09PSBcInN0cmluZ1wiKVxuXFx0XFx0OiBbXTtcblxcdGNvbnN0IHJvbGVzID1cblxcdFxcdHN1YiAmJiBzdWIgPT09IHByb2Nlc3MuZW52LkFVVEgwX0FETUlOX1VTRVJfU1VCXG5cXHRcXHRcXHQ/IFsuLi5uZXcgU2V0KFtBRE1JTl9ST0xFLCAuLi5mcm9tVG9rZW5dKV1cblxcdFxcdFxcdDogZnJvbVRva2VuLmxlbmd0aCA+IDBcblxcdFxcdFxcdFxcdD8gZnJvbVRva2VuXG5cXHRcXHRcXHRcXHQ6IHVuZGVmaW5lZDtcblxcdHJldHVybiB7IC4uLnBheWxvYWQsIHN1Yiwgcm9sZXMsIHNjb3BlcyB9O1xufVxuYDtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0T3B0aW9ucyhcblx0d29ya3NwYWNlOiBXb3Jrc3BhY2VTY2FmZm9sZCxcblx0Y2xpT3B0aW9uczogUGFydGlhbDxBdXRoT3B0aW9ucz4sXG4pOiBQcm9taXNlPFBhcnRpYWw8QXV0aE9wdGlvbnM+PiB7XG5cdGlmIChjbGlPcHRpb25zLmF1dGhQcm92aWRlciA9PT0gXCJhdXRoMFwiICYmICFjbGlPcHRpb25zLmlzc3VlckJhc2VVcmwpIHtcblx0XHRyZXR1cm4gZ2V0QXV0aDBPcHRpb25zKHdvcmtzcGFjZSwgY2xpT3B0aW9ucyk7XG5cdH1cblx0aWYgKGNsaU9wdGlvbnMuYXV0aFByb3ZpZGVyICE9IG51bGwpIHJldHVybiB7fTtcblxuXHRjb25zdCBjaG9pY2VzID0gW3sgbGFiZWw6IFwibm9uZVwiIGFzIGNvbnN0IH0sIHsgbGFiZWw6IFwiYXV0aDBcIiBhcyBjb25zdCB9XTtcblx0Y29uc3Qgc2VsZWN0ZWQgPSBhd2FpdCBwaWNrKFwiXFxuICBBdXRoIHByb3ZpZGVyOiBcIiwgY2hvaWNlcywgKGMpID0+IGMubGFiZWwpO1xuXHRjb25zdCBwcm92aWRlciA9IHNlbGVjdGVkPy5sYWJlbCA/PyBcIm5vbmVcIjtcblxuXHRpZiAocHJvdmlkZXIgIT09IFwiYXV0aDBcIikgcmV0dXJuIHsgYXV0aFByb3ZpZGVyOiBcIm5vbmVcIiB9O1xuXG5cdHJldHVybiBnZXRBdXRoME9wdGlvbnMod29ya3NwYWNlLCBjbGlPcHRpb25zKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QXV0aDBPcHRpb25zKFxuXHR3b3Jrc3BhY2U6IFdvcmtzcGFjZVNjYWZmb2xkLFxuXHRjbGlPcHRpb25zOiBQYXJ0aWFsPEF1dGhPcHRpb25zPixcbik6IFByb21pc2U8UGFydGlhbDxBdXRoT3B0aW9ucz4+IHtcblx0aWYgKCFhdXRoMENsaS5pc0luc3RhbGxlZCgpKSB7XG5cdFx0Y29uc29sZS5lcnJvcihcblx0XHRcdFwiXFxuICBUaGUgQXV0aDAgQ0xJIGlzIHJlcXVpcmVkIGZvciBhdXRvbWF0ZWQgc2V0dXAuXFxuXCIgK1xuXHRcdFx0XHRcIiAgSW5zdGFsbDogYnJldyBpbnN0YWxsIGF1dGgwL2F1dGgwLWNsaS9hdXRoMFxcblwiICtcblx0XHRcdFx0XCIgIE9yIHZpc2l0OiBodHRwczovL2dpdGh1Yi5jb20vYXV0aDAvYXV0aDAtY2xpXFxuXCIsXG5cdFx0KTtcblx0XHRwcm9jZXNzLmV4aXQoMSk7XG5cdH1cblxuXHRwcm9jZXNzLnN0ZG91dC53cml0ZShcIlxcbiAgQ2hlY2tpbmcgQXV0aDAgY3JlZGVudGlhbHMuLi5cIik7XG5cdGxldCB0ZW5hbnRzID0gYXV0aDBDbGkubGlzdFRlbmFudHMoKTtcblx0aWYgKHRlbmFudHMubGVuZ3RoID09PSAwKSB7XG5cdFx0cHJvY2Vzcy5zdGRvdXQud3JpdGUoXCIgbm90IGxvZ2dlZCBpbi5cXG5cIik7XG5cdFx0Y29uc29sZS5sb2coXCIgIExvZ2dpbmcgaW4gdG8gQXV0aDAgKHlvdXIgYnJvd3NlciB3aWxsIG9wZW4pLi4uXCIpO1xuXHRcdGlmICghYXV0aDBDbGkubG9naW4oKSkge1xuXHRcdFx0Y29uc29sZS5lcnJvcihcIlxcbiAgQXV0aDAgbG9naW4gZmFpbGVkLlwiKTtcblx0XHRcdHByb2Nlc3MuZXhpdCgxKTtcblx0XHR9XG5cdFx0dGVuYW50cyA9IGF1dGgwQ2xpLmxpc3RUZW5hbnRzKCk7XG5cdH1cblxuXHR0cnkge1xuXHRcdGF1dGgwQ2xpLmxpc3RBcGlzKCk7XG5cdFx0cHJvY2Vzcy5zdGRvdXQud3JpdGUoXCIgb2suXFxuXCIpO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHRpZiAoZXJyIGluc3RhbmNlb2YgYXV0aDBDbGkuQXV0aDBBdXRoRXJyb3IpIHtcblx0XHRcdHByb2Nlc3Muc3Rkb3V0LndyaXRlKFwiIHRva2VuIGV4cGlyZWQuXFxuXCIpO1xuXHRcdFx0Y29uc29sZS5sb2coXCIgIFJlLWF1dGhlbnRpY2F0aW5nICh5b3VyIGJyb3dzZXIgd2lsbCBvcGVuKS4uLlwiKTtcblx0XHRcdGlmICghYXV0aDBDbGkubG9naW4oKSkge1xuXHRcdFx0XHRjb25zb2xlLmVycm9yKFwiXFxuICBBdXRoMCBsb2dpbiBmYWlsZWQuXCIpO1xuXHRcdFx0XHRwcm9jZXNzLmV4aXQoMSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Y29uc3QgYWN0aXZlID0gdGVuYW50cy5maW5kKCh0KSA9PiB0LmFjdGl2ZSkgPz8gdGVuYW50c1swXTtcblx0Y29uc3QgaXNzdWVyQmFzZVVybCA9IGBodHRwczovLyR7YWN0aXZlLm5hbWV9YDtcblx0Y29uc29sZS5sb2coYFxcbiAg4pyTIEF1dGgwIHRlbmFudDogJHtpc3N1ZXJCYXNlVXJsfWApO1xuXG5cdHByb2Nlc3Muc3Rkb3V0LndyaXRlKFwiXFxuICBGZXRjaGluZyBBdXRoMCBBUElzLi4uXCIpO1xuXHRjb25zdCB1c2VyQXBpcyA9IGF1dGgwQ2xpLmxpc3RBcGlzKCkuZmlsdGVyKChhKSA9PiAhYS5uYW1lLmluY2x1ZGVzKFwiTWFuYWdlbWVudCBBUElcIikpO1xuXHRwcm9jZXNzLnN0ZG91dC53cml0ZShgIGZvdW5kICR7dXNlckFwaXMubGVuZ3RofS5cXG5gKTtcblxuXHR0eXBlIEFwaUNob2ljZSA9IHsgbGFiZWw6IHN0cmluZzsgZXhpc3Rpbmc6IHN0cmluZyB8IG51bGwgfTtcblx0Y29uc3QgcHJvamVjdE5hbWUgPSB3b3Jrc3BhY2UubmFtZTtcblx0Y29uc3QgYXBpQ2hvaWNlczogQXBpQ2hvaWNlW10gPSBbXG5cdFx0eyBsYWJlbDogYDxuZXc+IGh0dHBzOi8vYXBpLiR7cHJvamVjdE5hbWV9YCwgZXhpc3Rpbmc6IG51bGwgfSxcblx0XHQuLi51c2VyQXBpcy5tYXAoKGEpID0+ICh7IGxhYmVsOiBgJHthLm5hbWV9IOKAlCAke2EuaWRlbnRpZmllcn1gLCBleGlzdGluZzogYS5pZGVudGlmaWVyIH0pKSxcblx0XTtcblxuXHRjb25zdCBhcGlTZWxlY3RlZCA9IGF3YWl0IHBpY2soXCJcXG4gIFNlbGVjdCBBdXRoMCBBUEk6IFwiLCBhcGlDaG9pY2VzLCAoYykgPT4gYy5sYWJlbCk7XG5cblx0bGV0IGF1ZGllbmNlOiBzdHJpbmc7XG5cdGlmICghYXBpU2VsZWN0ZWQgfHwgYXBpU2VsZWN0ZWQuZXhpc3RpbmcgPT09IG51bGwpIHtcblx0XHRjb25zdCBkZWZhdWx0SWQgPSBgaHR0cHM6Ly9hcGkuJHtwcm9qZWN0TmFtZX1gO1xuXHRcdGF1ZGllbmNlID0gYXdhaXQgYXNrKGAgIEFQSSBJZGVudGlmaWVyIFske2RlZmF1bHRJZH1dOiBgLCBkZWZhdWx0SWQpO1xuXHRcdGNvbnNvbGUubG9nKFwiXFxuICBDcmVhdGluZyBBdXRoMCBBUEkuLi5cIik7XG5cdFx0YXVkaWVuY2UgPSBhdXRoMENsaS5jcmVhdGVBcGkoYCR7cHJvamVjdE5hbWV9IEFQSWAsIGF1ZGllbmNlKS5pZGVudGlmaWVyO1xuXHRcdGNvbnNvbGUubG9nKGAgIFxcdTI3MTMgQVBJIGNyZWF0ZWQ6ICR7YXVkaWVuY2V9YCk7XG5cdH0gZWxzZSB7XG5cdFx0YXVkaWVuY2UgPSBhcGlTZWxlY3RlZC5leGlzdGluZztcblx0XHRjb25zb2xlLmxvZyhgICBcXHUyNzEzIFNlbGVjdGVkOiAke2F1ZGllbmNlfWApO1xuXHRcdHRyeSB7XG5cdFx0XHRhdXRoMENsaS51cGRhdGVBcGlTY29wZXMoYXVkaWVuY2UpO1xuXHRcdFx0Y29uc29sZS5sb2coYCAgXFx1MjcxMyBBUEkgc2NvcGVzIGVuc3VyZWQgKCR7YXV0aDBDbGkuSEVMTE9fQVBJX1NDT1BFUy5qb2luKFwiLCBcIil9KWApO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0Y29uc29sZS5lcnJvcihcblx0XHRcdFx0XCIgIOKclyBGYWlsZWQgdG8gdXBkYXRlIEFQSSBzY29wZXMg4oCUIGFkZCBIZWxsbyBzY29wZXMgaW4gdGhlIEF1dGgwIGRhc2hib2FyZC5cIixcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0Y29uc3Qgd2l0aExvY2FsVXNlcnMgPSBjbGlPcHRpb25zLmRhdGFiYXNlUHJvdmlkZXIgPT09IFwicG9zdGdyZXMvdHlwZW9ybVwiO1xuXHRsZXQgYWRtaW5Vc2VybmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRsZXQgYWRtaW5QYXNzd29yZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRpZiAod2l0aExvY2FsVXNlcnMpIHtcblx0XHRhZG1pblVzZXJuYW1lID1cblx0XHRcdGNsaU9wdGlvbnMuYWRtaW5Vc2VybmFtZSA/PyAoYXdhaXQgYXNrKFwiXFxuICBBZG1pbiB1c2VybmFtZSBbYWRtaW5dOiBcIiwgXCJhZG1pblwiKSk7XG5cdFx0YWRtaW5QYXNzd29yZCA9IGNsaU9wdGlvbnMuYWRtaW5QYXNzd29yZDtcblx0XHRpZiAoYWRtaW5QYXNzd29yZCA9PSBudWxsKSB7XG5cdFx0XHRhZG1pblBhc3N3b3JkID0gYXdhaXQgYXNrKFwiICBBZG1pbiBwYXNzd29yZCAobGVhdmUgYmxhbmsgdG8gZ2VuZXJhdGUpOiBcIik7XG5cdFx0XHRpZiAoIWFkbWluUGFzc3dvcmQpIHtcblx0XHRcdFx0YWRtaW5QYXNzd29yZCA9IGF1dGgwQ2xpLmdlbmVyYXRlQWRtaW5QYXNzd29yZCgpO1xuXHRcdFx0XHRjb25zb2xlLmxvZyhgICDinJMgR2VuZXJhdGVkIGFkbWluIHBhc3N3b3JkICh3cml0dGVuIHRvIC5lbnYpOiAke2FkbWluUGFzc3dvcmR9YCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRhdXRoUHJvdmlkZXI6IFwiYXV0aDBcIixcblx0XHRpc3N1ZXJCYXNlVXJsLFxuXHRcdGF1ZGllbmNlLFxuXHRcdC4uLih3aXRoTG9jYWxVc2VycyA/IHsgYWRtaW5Vc2VybmFtZSwgYWRtaW5QYXNzd29yZCB9IDoge30pLFxuXHR9O1xufVxuXG5mdW5jdGlvbiBhZG1pbkVtYWlsKHdvcmtzcGFjZU5hbWU6IHN0cmluZywgdXNlcm5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG5cdGlmICh1c2VybmFtZS5pbmNsdWRlcyhcIkBcIikpIHJldHVybiB1c2VybmFtZTtcblx0Y29uc3Qgc2x1ZyA9IHdvcmtzcGFjZU5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOS1dL2csIFwiLVwiKTtcblx0cmV0dXJuIGAke3VzZXJuYW1lfUAke3NsdWd9LmV4YW1wbGUuY29tYDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQXV0aDBBZG1pblVzZXIoXG5cdHdvcmtzcGFjZTogV29ya3NwYWNlU2NhZmZvbGQsXG5cdG9wdGlvbnM6IEF1dGhPcHRpb25zLFxuXHRhdXRoQ29uZmlnOiBBdXRoQ29uZmlnTW9kZWwsXG4pOiB2b2lkIHtcblx0Y29uc3QgdXNlcm5hbWUgPSBvcHRpb25zLmFkbWluVXNlcm5hbWUgPz8gXCJhZG1pblwiO1xuXHRjb25zdCBwYXNzd29yZCA9IG9wdGlvbnMuYWRtaW5QYXNzd29yZDtcblx0aWYgKCFwYXNzd29yZCkgcmV0dXJuO1xuXG5cdGNvbnN0IGVtYWlsID0gYWRtaW5FbWFpbCh3b3Jrc3BhY2UubmFtZSwgdXNlcm5hbWUpO1xuXHR0cnkge1xuXHRcdGNvbnN0IGFkbWluID0gYXV0aDBDbGkuY3JlYXRlQWRtaW5EYXRhYmFzZVVzZXIoeyBlbWFpbCwgcGFzc3dvcmQsIHVzZXJuYW1lIH0pO1xuXHRcdGF1dGhDb25maWcuc2V0QWRtaW5Vc2VyKHtcblx0XHRcdHN1YjogYWRtaW4udXNlcl9pZCxcblx0XHRcdGVtYWlsOiBhZG1pbi5lbWFpbCxcblx0XHRcdHBhc3N3b3JkOiBhZG1pbi5wYXNzd29yZCxcblx0XHRcdHVzZXJuYW1lOiBhZG1pbi51c2VybmFtZSxcblx0XHR9KTtcblx0XHR3b3Jrc3BhY2Vcblx0XHRcdC5nZXRNb2RlbDxFbnZGaWxlPihXRUxMX0tOT1dOX0ZJTEVTLkVOVl9GSUxFKVxuXHRcdFx0Py5hZGRFbnRyeShcIkFVVEgwX0FETUlOX1VTRVJfU1VCXCIsIGFkbWluLnVzZXJfaWQpXG5cdFx0XHQuYWRkRW50cnkoXCJBVVRIMF9BRE1JTl9VU0VSX0VNQUlMXCIsIGFkbWluLmVtYWlsKVxuXHRcdFx0LmFkZEVudHJ5KFwiQVVUSDBfQURNSU5fVVNFUl9QQVNTV09SRFwiLCBhZG1pbi5wYXNzd29yZClcblx0XHRcdC5hZGRFbnRyeShcIkFVVEgwX0FETUlOX1VTRVJOQU1FXCIsIGFkbWluLnVzZXJuYW1lKTtcblx0XHRjb25zb2xlLmxvZyhgICDinJMgQXV0aDAgYWRtaW4gdXNlciByZWFkeTogJHthZG1pbi5lbWFpbH0gKHJvbGU6ICR7QURNSU5fUk9MRX0pYCk7XG5cdFx0Y29uc29sZS5sb2coYCAgICBMb2dpbiB3aXRoIEVNQUlMIChub3QgdXNlcm5hbWUpOiAke2FkbWluLmVtYWlsfWApO1xuXHRcdGNvbnNvbGUubG9nKGAgICAgUGFzc3dvcmQ6IHNlZSBBVVRIMF9BRE1JTl9VU0VSX1BBU1NXT1JEIGluIC5lbnZgKTtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0Y29uc29sZS5lcnJvcihcblx0XHRcdGAgIOKclyBGYWlsZWQgdG8gZW5zdXJlIEF1dGgwIGFkbWluIHVzZXIgKCR7ZW1haWx9KTogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogZXJyfWAsXG5cdFx0KTtcblx0fVxufVxuXG5mdW5jdGlvbiBzY2FmZm9sZExvY2FsVXNlclByb2ZpbGUod29ya3NwYWNlOiBXb3Jrc3BhY2VTY2FmZm9sZCk6IHZvaWQge1xuXHR3b3Jrc3BhY2Vcblx0XHQuZ2V0TW9kZWw8UGFja2FnZUpzb24+KFdFTExfS05PV05fRklMRVMuUEFDS0FHRV9KU09OKVxuXHRcdD8uYWRkRGVwZW5kZW5jeShcIkBjYXNsL2FiaWxpdHlcIiwgXCJeNi44LjFcIik7XG5cdHdvcmtzcGFjZVxuXHRcdC5nZXRNb2RlbDxBcGlQYWNrYWdlSnNvbj4oV0VMTF9LTk9XTl9GSUxFUy5BUElfUEFDS0FHRV9KU09OKVxuXHRcdD8uYWRkRGVwZW5kZW5jeShcIkBjYXNsL2FiaWxpdHlcIiwgXCJeNi44LjFcIik7XG5cblx0Y29uc3QgbWFpbiA9IHdvcmtzcGFjZS5nZXRNb2RlbDxNYWluU291cmNlRmlsZT4oV0VMTF9LTk9XTl9GSUxFUy5NQUlOX1RTKTtcblx0bWFpblxuXHRcdD8uYWRkRW50aXR5KHsgY2xhc3NOYW1lOiBcIlVzZXJFbnRpdHlcIiwgaW1wb3J0UGF0aDogXCIuL2VudGl0aWVzL3VzZXIuZW50aXR5LmpzXCIgfSlcblx0XHQuYWRkUmVwb3NpdG9yeSh7XG5cdFx0XHRjbGFzc05hbWU6IFwiVXNlckVudGl0eVJlcG9zaXRvcnlcIixcblx0XHRcdGltcG9ydFBhdGg6IFwiLi9yZXBvc2l0b3JpZXMvdXNlci5yZXBvc2l0b3J5LmpzXCIsXG5cdFx0fSlcblx0XHQuYWRkU2VydmljZSh7XG5cdFx0XHRjbGFzc05hbWU6IFwiVXNlclNlcnZpY2VcIixcblx0XHRcdGltcG9ydFBhdGg6IFwiLi9zZXJ2aWNlcy91c2VyLnNlcnZpY2UuanNcIixcblx0XHRcdHNjb3BlOiBcInJlcXVlc3RcIixcblx0XHR9KVxuXHRcdC5hZGRJbXBvcnQoXCJjcmVhdGVBYmlsaXR5RmFjdG9yeVwiLCBcIi4vYXV0aC9hYmlsaXR5LmZhY3RvcnkuanNcIilcblx0XHQuYWRkSW1wb3J0KFwibWFwUHJpbmNpcGFsXCIsIFwiLi9hdXRoL2FiaWxpdHkuZmFjdG9yeS5qc1wiKVxuXHRcdC5zZXRUeXBlT3JtU2VlZChcblx0XHRcdFtcblx0XHRcdFx0XCJjb25zdCBzdWIgPSBwcm9jZXNzLmVudi5BVVRIMF9BRE1JTl9VU0VSX1NVQjtcIixcblx0XHRcdFx0XCJpZiAoIXN1YikgcmV0dXJuO1wiLFxuXHRcdFx0XHRcImNvbnN0IHJlcG8gPSBkYXRhU291cmNlLmdldFJlcG9zaXRvcnkoVXNlckVudGl0eSk7XCIsXG5cdFx0XHRcdFwiY29uc3QgZXhpc3RpbmcgPSBhd2FpdCByZXBvLmZpbmRPbmUoeyB3aGVyZTogeyBzdWIgfSB9KTtcIixcblx0XHRcdFx0XCJpZiAoZXhpc3RpbmcpIHJldHVybjtcIixcblx0XHRcdFx0XCJhd2FpdCByZXBvLnNhdmUocmVwby5jcmVhdGUoe1wiLFxuXHRcdFx0XHRcIiAgc3ViLFwiLFxuXHRcdFx0XHRcIiAgZW1haWw6IHByb2Nlc3MuZW52LkFVVEgwX0FETUlOX1VTRVJfRU1BSUwgPz8gbnVsbCxcIixcblx0XHRcdFx0JyAgZGlzcGxheU5hbWU6IHByb2Nlc3MuZW52LkFVVEgwX0FETUlOX1VTRVJOQU1FID8/IFwiYWRtaW5cIiwnLFxuXHRcdFx0XHQnICByb2xlczogW1wiYWRtaW5cIl0sJyxcblx0XHRcdFx0XCJ9KSk7XCIsXG5cdFx0XHRdLmpvaW4oXCIgXCIpLFxuXHRcdCk7XG5cblx0d29ya3NwYWNlLmdldFByb2plY3QoV0VCQVBJX1BST0pFQ1RfRElSKT8uYWRkRmlsZSh7XG5cdFx0ZmlsZXM6ICgpID0+IFtcblx0XHRcdHsgZmlsZVBhdGg6IFwic3JjL2VudGl0aWVzL3VzZXIuZW50aXR5LnRzXCIsIGNvbnRlbnQ6IFVTRVJfRU5USVRZX1RTIH0sXG5cdFx0XHR7IGZpbGVQYXRoOiBcInNyYy9yZXBvc2l0b3JpZXMvdXNlci5yZXBvc2l0b3J5LnRzXCIsIGNvbnRlbnQ6IFVTRVJfUkVQT1NJVE9SWV9UUyB9LFxuXHRcdFx0eyBmaWxlUGF0aDogXCJzcmMvc2VydmljZXMvdXNlci5zZXJ2aWNlLnRzXCIsIGNvbnRlbnQ6IFVTRVJfU0VSVklDRV9UUyB9LFxuXHRcdFx0eyBmaWxlUGF0aDogXCJzcmMvYXV0aC9hYmlsaXR5LmZhY3RvcnkudHNcIiwgY29udGVudDogQUJJTElUWV9GQUNUT1JZX1RTIH0sXG5cdFx0XSxcblx0fSk7XG5cblx0Zm9yIChjb25zdCBjb250cm9sbGVyIG9mIHdvcmtzcGFjZS5nZXRNb2RlbHMoQ29udHJvbGxlclNvdXJjZUZpbGUpKSB7XG5cdFx0Y29udHJvbGxlclxuXHRcdFx0LmFkZEltcG9ydChcIlVzZXJTZXJ2aWNlXCIsIFwiLi4vc2VydmljZXMvdXNlci5zZXJ2aWNlLmpzXCIpXG5cdFx0XHQuYWRkQ29uc3RydWN0b3JQYXJhbShcInByaXZhdGUgcmVhZG9ubHkgdXNlcnM6IFVzZXJTZXJ2aWNlXCIpO1xuXHRcdGNvbnRyb2xsZXIuZ2V0TWV0aG9kKFwiZ2V0T25lXCIpLnNldEFzeW5jKHRydWUpLnNldEJvZHkoW1xuXHRcdFx0XCJjb25zdCB1c2VyID0gYXdhaXQgdGhpcy51c2Vycy5lbnN1cmVGcm9tUHJpbmNpcGFsKHRoaXMucHJpbmNpcGFsUHJvdmlkZXIuY3VycmVudFByaW5jaXBhbCk7XCIsXG5cdFx0XHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vVGVtcGxhdGVDdXJseUluU3RyaW5nOiB0ZW1wbGF0ZSBsaXRlcmFsIGluIGdlbmVyYXRlZCBjb2RlXG5cdFx0XHRcInJldHVybiB7IGlkLCBtZXNzYWdlOiBgSGVsbG8gJHt1c2VyLmRpc3BsYXlOYW1lfSFgLCB1c2VybmFtZTogdXNlci5kaXNwbGF5TmFtZSB9O1wiLFxuXHRcdF0pO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHNjYWZmb2xkKHdvcmtzcGFjZTogV29ya3NwYWNlU2NhZmZvbGQsIG9wdGlvbnM6IEF1dGhPcHRpb25zKTogdm9pZCB7XG5cdGlmIChvcHRpb25zLmF1dGhQcm92aWRlciAhPT0gXCJhdXRoMFwiKSByZXR1cm47XG5cblx0Y29uc3QgcmVzb3VyY2UgPSBcIkhlbGxvXCI7XG5cdGNvbnN0IHdpdGhMb2NhbFVzZXJzID0gb3B0aW9ucy5kYXRhYmFzZVByb3ZpZGVyID09PSBcInBvc3RncmVzL3R5cGVvcm1cIjtcblxuXHRmb3IgKGNvbnN0IGNvbnRyb2xsZXIgb2Ygd29ya3NwYWNlLmdldE1vZGVscyhDb250cm9sbGVyU291cmNlRmlsZSkpIHtcblx0XHRjb250cm9sbGVyXG5cdFx0XHQuYWRkRGVjb3JhdG9yKGBAQXV0aG9yaXplKFwicmVhZFwiLCBcIiR7cmVzb3VyY2V9XCIpYClcblx0XHRcdC5hZGRDb3J0ZXhJbXBvcnQoXCJBbGxvd0Fub255bW91c1wiKVxuXHRcdFx0LmFkZENvcnRleEltcG9ydChcIkF1dGhvcml6ZVwiKVxuXHRcdFx0LmFkZENvcnRleEltcG9ydChcIklQcmluY2lwYWxQcm92aWRlclRva2VuXCIpXG5cdFx0XHQuYWRkQ29ydGV4SW1wb3J0KFwiSVByaW5jaXBhbFByb3ZpZGVyXCIsIHRydWUpXG5cdFx0XHQuYWRkSW1wb3J0KFwiaW5qZWN0XCIsIFwiQGRlY29oZXJlL2NydWNpYmxlL2RlY29yYXRvcnNcIilcblx0XHRcdC5hZGRDb25zdHJ1Y3RvclBhcmFtKFxuXHRcdFx0XHRgQGluamVjdChJUHJpbmNpcGFsUHJvdmlkZXJUb2tlbikgcHJpdmF0ZSByZWFkb25seSBwcmluY2lwYWxQcm92aWRlcjogSVByaW5jaXBhbFByb3ZpZGVyYCxcblx0XHRcdCk7XG5cdFx0Y29udHJvbGxlci5nZXRNZXRob2QoXCJnZXRBbGxcIikuYWRkRGVjb3JhdG9yKFwiQEFsbG93QW5vbnltb3VzKClcIik7XG5cdFx0aWYgKCF3aXRoTG9jYWxVc2Vycykge1xuXHRcdFx0Y29udHJvbGxlci5nZXRNZXRob2QoXCJnZXRPbmVcIikuc2V0Qm9keShbXG5cdFx0XHRcdFwiY29uc3QgcHJpbmNpcGFsID0gdGhpcy5wcmluY2lwYWxQcm92aWRlci5jdXJyZW50UHJpbmNpcGFsO1wiLFxuXHRcdFx0XHRcImNvbnN0IHVzZXJuYW1lID1cIixcblx0XHRcdFx0J1xcdCh0eXBlb2YgcHJpbmNpcGFsPy5uYW1lID09PSBcInN0cmluZ1wiICYmIHByaW5jaXBhbC5uYW1lKSB8fCcsXG5cdFx0XHRcdCdcXHQodHlwZW9mIHByaW5jaXBhbD8ubmlja25hbWUgPT09IFwic3RyaW5nXCIgJiYgcHJpbmNpcGFsLm5pY2tuYW1lKSB8fCcsXG5cdFx0XHRcdCdcXHQodHlwZW9mIHByaW5jaXBhbD8uZW1haWwgPT09IFwic3RyaW5nXCIgJiYgcHJpbmNpcGFsLmVtYWlsKSB8fCcsXG5cdFx0XHRcdCdcXHQodHlwZW9mIHByaW5jaXBhbD8ucHJlZmVycmVkX3VzZXJuYW1lID09PSBcInN0cmluZ1wiICYmIHByaW5jaXBhbC5wcmVmZXJyZWRfdXNlcm5hbWUpIHx8Jyxcblx0XHRcdFx0XCJcXHRwcmluY2lwYWw/LnN1YiB8fFwiLFxuXHRcdFx0XHQnXFx0XCJ1bmtub3duXCI7Jyxcblx0XHRcdFx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub1RlbXBsYXRlQ3VybHlJblN0cmluZzogdGVtcGxhdGUgbGl0ZXJhbCBpbiBnZW5lcmF0ZWQgY29kZVxuXHRcdFx0XHRcInJldHVybiB7IGlkLCBtZXNzYWdlOiBgSGVsbG8gJHt1c2VybmFtZX0hYCwgdXNlcm5hbWUgfTtcIixcblx0XHRcdF0pO1xuXHRcdH1cblx0XHRjb250cm9sbGVyLmdldE1ldGhvZChcImNyZWF0ZVwiKS5hZGREZWNvcmF0b3IoYEBBdXRob3JpemUoXCJjcmVhdGVcIiwgXCIke3Jlc291cmNlfVwiKWApO1xuXHRcdGNvbnRyb2xsZXIuZ2V0TWV0aG9kKFwidXBkYXRlXCIpLmFkZERlY29yYXRvcihgQEF1dGhvcml6ZShcInVwZGF0ZVwiLCBcIiR7cmVzb3VyY2V9XCIpYCk7XG5cdFx0Y29udHJvbGxlci5nZXRNZXRob2QoXCJyZW1vdmVcIikuYWRkRGVjb3JhdG9yKGBAQXV0aG9yaXplKFwiZGVsZXRlXCIsIFwiJHtyZXNvdXJjZX1cIilgKTtcblx0fVxuXG5cdGNvbnN0IG1haW4gPSB3b3Jrc3BhY2UuZ2V0TW9kZWw8TWFpblNvdXJjZUZpbGU+KFdFTExfS05PV05fRklMRVMuTUFJTl9UUyk7XG5cdG1haW4/LmFkZFNpZGVFZmZlY3RJbXBvcnQoXCJAZGVjb2hlcmUvY29ydGV4L2F1dGhcIik7XG5cblx0aWYgKHdpdGhMb2NhbFVzZXJzKSB7XG5cdFx0c2NhZmZvbGRMb2NhbFVzZXJQcm9maWxlKHdvcmtzcGFjZSk7XG5cdFx0bWFpbj8uYWRkQnVpbGRlckNhbGwoXCIud2l0aEF1dGgoY3JlYXRlQWJpbGl0eUZhY3RvcnksIHsgcHJpbmNpcGFsTWFwcGVyOiBtYXBQcmluY2lwYWwgfSlcIik7XG5cdH0gZWxzZSB7XG5cdFx0bWFpbj8uYWRkQnVpbGRlckNhbGwoXCIud2l0aEF1dGgoKVwiKTtcblx0fVxuXG5cdC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9UZW1wbGF0ZUN1cmx5SW5TdHJpbmc6IGludGVudGlvbmFsIFlBTUwgZW52LXZhciBwbGFjZWhvbGRlcnNcblx0Y29uc3QgaXNzdWVyUGxhY2Vob2xkZXIgPSBcIiR7QVVUSDBfSVNTVUVSX0JBU0VfVVJMfVwiO1xuXHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vVGVtcGxhdGVDdXJseUluU3RyaW5nOiBpbnRlbnRpb25hbCBZQU1MIGVudi12YXIgcGxhY2Vob2xkZXJzXG5cdGNvbnN0IGF1ZFBsYWNlaG9sZGVyID0gXCIke0FVVEgwX0FVRElFTkNFfVwiO1xuXG5cdGNvbnN0IGNvbmZpZ1NlY3Rpb24gPSBgYXV0aDpcXG4gIGRpc2NvdmVyeVVybDogJHtpc3N1ZXJQbGFjZWhvbGRlcn1cXG4gIGF1ZGllbmNlOiAke2F1ZFBsYWNlaG9sZGVyfVxcbmA7XG5cblx0d29ya3NwYWNlLmdldE1vZGVsPENvbmZpZ1lhbWw+KFdFTExfS05PV05fRklMRVMuQ09ORklHX1lBTUwpPy5hZGRTZWN0aW9uKGNvbmZpZ1NlY3Rpb24pO1xuXG5cdHdvcmtzcGFjZVxuXHRcdC5nZXRNb2RlbDxFbnZGaWxlPihXRUxMX0tOT1dOX0ZJTEVTLkVOVl9GSUxFKVxuXHRcdD8uYWRkRW50cnkoXCJBVVRIMF9JU1NVRVJfQkFTRV9VUkxcIiwgb3B0aW9ucy5pc3N1ZXJCYXNlVXJsID8/IFwiXCIpXG5cdFx0LmFkZEVudHJ5KFwiQVVUSDBfQVVESUVOQ0VcIiwgb3B0aW9ucy5hdWRpZW5jZSA/PyBcIlwiKTtcblxuXHRjb25zdCBhdXRoQ29uZmlnID0gbmV3IEF1dGhDb25maWdNb2RlbCh7XG5cdFx0aXNzdWVyQmFzZVVybDogb3B0aW9ucy5pc3N1ZXJCYXNlVXJsID8/IFwiXCIsXG5cdFx0YXVkaWVuY2U6IG9wdGlvbnMuYXVkaWVuY2UgPz8gXCJcIixcblx0fSk7XG5cdHdvcmtzcGFjZS5hZGRNb2RlbChhdXRoQ29uZmlnKTtcblxuXHRpZiAod2l0aExvY2FsVXNlcnMgJiYgb3B0aW9ucy5hZG1pblBhc3N3b3JkKSB7XG5cdFx0Y3JlYXRlQXV0aDBBZG1pblVzZXIod29ya3NwYWNlLCBvcHRpb25zLCBhdXRoQ29uZmlnKTtcblx0fVxufVxuXG5leHBvcnQgY29uc3QgQXV0aEZlYXR1cmU6IEZlYXR1cmU8QXV0aE9wdGlvbnM+ID0geyBnZXRPcHRpb25zLCBzY2FmZm9sZCB9O1xuIl0sIm5hbWVzIjpbImFzayIsInBpY2siLCJXRUxMX0tOT1dOX0ZJTEVTIiwiV0VCQVBJX1BST0pFQ1RfRElSIiwiQXV0aENvbmZpZ01vZGVsIiwiQ29udHJvbGxlclNvdXJjZUZpbGUiLCJhdXRoMENsaSIsIkFETUlOX1JPTEUiLCJVU0VSX0VOVElUWV9UUyIsIlVTRVJfUkVQT1NJVE9SWV9UUyIsIlVTRVJfU0VSVklDRV9UUyIsIkFCSUxJVFlfRkFDVE9SWV9UUyIsImdldE9wdGlvbnMiLCJ3b3Jrc3BhY2UiLCJjbGlPcHRpb25zIiwiYXV0aFByb3ZpZGVyIiwiaXNzdWVyQmFzZVVybCIsImdldEF1dGgwT3B0aW9ucyIsImNob2ljZXMiLCJsYWJlbCIsInNlbGVjdGVkIiwiYyIsInByb3ZpZGVyIiwiaXNJbnN0YWxsZWQiLCJjb25zb2xlIiwiZXJyb3IiLCJwcm9jZXNzIiwiZXhpdCIsInN0ZG91dCIsIndyaXRlIiwidGVuYW50cyIsImxpc3RUZW5hbnRzIiwibGVuZ3RoIiwibG9nIiwibG9naW4iLCJsaXN0QXBpcyIsImVyciIsIkF1dGgwQXV0aEVycm9yIiwiYWN0aXZlIiwiZmluZCIsInQiLCJuYW1lIiwidXNlckFwaXMiLCJmaWx0ZXIiLCJhIiwiaW5jbHVkZXMiLCJwcm9qZWN0TmFtZSIsImFwaUNob2ljZXMiLCJleGlzdGluZyIsIm1hcCIsImlkZW50aWZpZXIiLCJhcGlTZWxlY3RlZCIsImF1ZGllbmNlIiwiZGVmYXVsdElkIiwiY3JlYXRlQXBpIiwidXBkYXRlQXBpU2NvcGVzIiwiSEVMTE9fQVBJX1NDT1BFUyIsImpvaW4iLCJ3aXRoTG9jYWxVc2VycyIsImRhdGFiYXNlUHJvdmlkZXIiLCJhZG1pblVzZXJuYW1lIiwiYWRtaW5QYXNzd29yZCIsImdlbmVyYXRlQWRtaW5QYXNzd29yZCIsImFkbWluRW1haWwiLCJ3b3Jrc3BhY2VOYW1lIiwidXNlcm5hbWUiLCJzbHVnIiwidG9Mb3dlckNhc2UiLCJyZXBsYWNlIiwiY3JlYXRlQXV0aDBBZG1pblVzZXIiLCJvcHRpb25zIiwiYXV0aENvbmZpZyIsInBhc3N3b3JkIiwiZW1haWwiLCJhZG1pbiIsImNyZWF0ZUFkbWluRGF0YWJhc2VVc2VyIiwic2V0QWRtaW5Vc2VyIiwic3ViIiwidXNlcl9pZCIsImdldE1vZGVsIiwiRU5WX0ZJTEUiLCJhZGRFbnRyeSIsIkVycm9yIiwibWVzc2FnZSIsInNjYWZmb2xkTG9jYWxVc2VyUHJvZmlsZSIsIlBBQ0tBR0VfSlNPTiIsImFkZERlcGVuZGVuY3kiLCJBUElfUEFDS0FHRV9KU09OIiwibWFpbiIsIk1BSU5fVFMiLCJhZGRFbnRpdHkiLCJjbGFzc05hbWUiLCJpbXBvcnRQYXRoIiwiYWRkUmVwb3NpdG9yeSIsImFkZFNlcnZpY2UiLCJzY29wZSIsImFkZEltcG9ydCIsInNldFR5cGVPcm1TZWVkIiwiZ2V0UHJvamVjdCIsImFkZEZpbGUiLCJmaWxlcyIsImZpbGVQYXRoIiwiY29udGVudCIsImNvbnRyb2xsZXIiLCJnZXRNb2RlbHMiLCJhZGRDb25zdHJ1Y3RvclBhcmFtIiwiZ2V0TWV0aG9kIiwic2V0QXN5bmMiLCJzZXRCb2R5Iiwic2NhZmZvbGQiLCJyZXNvdXJjZSIsImFkZERlY29yYXRvciIsImFkZENvcnRleEltcG9ydCIsImFkZFNpZGVFZmZlY3RJbXBvcnQiLCJhZGRCdWlsZGVyQ2FsbCIsImlzc3VlclBsYWNlaG9sZGVyIiwiYXVkUGxhY2Vob2xkZXIiLCJjb25maWdTZWN0aW9uIiwiQ09ORklHX1lBTUwiLCJhZGRTZWN0aW9uIiwiYWRkTW9kZWwiLCJBdXRoRmVhdHVyZSJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsR0FBRyxFQUFFQyxJQUFJLFFBQVEseUJBQXlCO0FBRW5ELFNBQVNDLGdCQUFnQixRQUFRLHdCQUF3QjtBQUt6RCxTQUFTQyxrQkFBa0IsUUFBUSxjQUFjO0FBRWpELFNBQVNDLGVBQWUsUUFBUSxpQ0FBaUM7QUFDakUsU0FBU0Msb0JBQW9CLFFBQVEsNENBQTRDO0FBRWpGLFlBQVlDLGNBQWMsaUJBQWlC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
412
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL2ZlYXR1cmVzL2F1dGguZmVhdHVyZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhc2ssIHBpY2sgfSBmcm9tIFwiLi4vLi4vZG9tYWluL3Byb21wdC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBDb25maWdZYW1sIH0gZnJvbSBcIi4uLy4uL21vZGVscy9jb25maWcteWFtbC5tb2RlbC5qc1wiO1xuaW1wb3J0IHsgV0VMTF9LTk9XTl9GSUxFUyB9IGZyb20gXCIuLi8uLi9tb2RlbHMvY29uc3QuanNcIjtcbmltcG9ydCB0eXBlIHsgRW52RmlsZSB9IGZyb20gXCIuLi8uLi9tb2RlbHMvZW52LWZpbGUubW9kZWwuanNcIjtcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3BhY2thZ2UtanNvbi5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2VTY2FmZm9sZCB9IGZyb20gXCIuLi8uLi9tb2RlbHMvcHJvamVjdC5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBGZWF0dXJlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3NjYWZmb2xkLnNlcnZpY2UuanNcIjtcbmltcG9ydCB0eXBlIHsgQXBpUGFja2FnZUpzb24gfSBmcm9tIFwiLi4vbW9kZWxzL2FwaS1wYWNrYWdlLWpzb24ubW9kZWwuanNcIjtcbmltcG9ydCB7IEF1dGhDb25maWdNb2RlbCB9IGZyb20gXCIuLi9tb2RlbHMvYXV0aC1jb25maWcubW9kZWwuanNcIjtcbmltcG9ydCB7IENvbnRyb2xsZXJTb3VyY2VGaWxlIH0gZnJvbSBcIi4uL21vZGVscy9jb250cm9sbGVyLXNvdXJjZS1maWxlLm1vZGVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IE1haW5Tb3VyY2VGaWxlIH0gZnJvbSBcIi4uL21vZGVscy9tYWluLXNvdXJjZS1maWxlLm1vZGVsLmpzXCI7XG5pbXBvcnQgKiBhcyBhdXRoMENsaSBmcm9tIFwiLi9hdXRoMC1jbGkuanNcIjtcblxuZXhwb3J0IHR5cGUgQXV0aE9wdGlvbnMgPSB7XG5cdGF1dGhQcm92aWRlcj86IFwiYXV0aDBcIiB8IFwibm9uZVwiO1xuXHRpc3N1ZXJCYXNlVXJsPzogc3RyaW5nO1xuXHRhdWRpZW5jZT86IHN0cmluZztcblx0ZGF0YWJhc2VQcm92aWRlcj86IFwibm9uZVwiIHwgXCJwb3N0Z3Jlcy90eXBlb3JtXCI7XG5cdGFkbWluVXNlcm5hbWU/OiBzdHJpbmc7XG5cdGFkbWluUGFzc3dvcmQ/OiBzdHJpbmc7XG59O1xuXG5jb25zdCBBRE1JTl9ST0xFID0gXCJhZG1pblwiO1xuXG5jb25zdCBVU0VSX0VOVElUWV9UUyA9IGBpbXBvcnQgeyBDb2x1bW4sIEVudGl0eSwgUHJpbWFyeUdlbmVyYXRlZENvbHVtbiB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgdHlwZSB7IEVudGl0eSBhcyBJRW50aXR5IH0gZnJvbSBcIkBkZWNvaGVyZS9jb2RleFwiO1xuXG5ARW50aXR5KClcbmV4cG9ydCBjbGFzcyBVc2VyRW50aXR5IGltcGxlbWVudHMgSUVudGl0eSB7XG5cXHRAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG5cXHRwdWJsaWMgaWQhOiBudW1iZXI7XG5cblxcdEBDb2x1bW4oeyB1bmlxdWU6IHRydWUgfSlcblxcdHB1YmxpYyBzdWIhOiBzdHJpbmc7XG5cblxcdEBDb2x1bW4oeyB0eXBlOiBcInZhcmNoYXJcIiwgbnVsbGFibGU6IHRydWUgfSlcblxcdHB1YmxpYyBlbWFpbCE6IHN0cmluZyB8IG51bGw7XG5cblxcdEBDb2x1bW4oKVxuXFx0cHVibGljIGRpc3BsYXlOYW1lITogc3RyaW5nO1xuXG5cXHQvKiogQXBwLW93bmVkIHJvbGVzLiBUaGUgXFxgYWRtaW5cXGAgcm9sZSBncmFudHMgQ0FTTCBcXGBtYW5hZ2VcXGAvXFxgYWxsXFxgICh3aWxkY2FyZCkuICovXG5cXHRAQ29sdW1uKHsgdHlwZTogXCJzaW1wbGUtanNvblwiLCBkZWZhdWx0OiBcIltdXCIgfSlcblxcdHB1YmxpYyByb2xlcyE6IHN0cmluZ1tdO1xufVxuYDtcblxuY29uc3QgVVNFUl9SRVBPU0lUT1JZX1RTID0gYGltcG9ydCB7IGluamVjdGFibGUgfSBmcm9tIFwiQGRlY29oZXJlL2NydWNpYmxlL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IGluamVjdFVuaXRPZldvcmsgfSBmcm9tIFwiQGRlY29oZXJlL2NvZGV4XCI7XG5pbXBvcnQgeyBUeXBlT3JtUmVwb3NpdG9yeSwgVHlwZU9ybVVuaXRPZldvcmsgfSBmcm9tIFwiQGRlY29oZXJlL2NvZGV4LXR5cGVvcm1cIjtcbmltcG9ydCB7IFVzZXJFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXRpZXMvdXNlci5lbnRpdHkuanNcIjtcblxuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFVzZXJFbnRpdHlSZXBvc2l0b3J5IGV4dGVuZHMgVHlwZU9ybVJlcG9zaXRvcnk8VXNlckVudGl0eT4ge1xuXFx0cHVibGljIGNvbnN0cnVjdG9yKEBpbmplY3RVbml0T2ZXb3JrKCkgdW5pdE9mV29yazogVHlwZU9ybVVuaXRPZldvcmspIHtcblxcdFxcdHN1cGVyKHVuaXRPZldvcmssIFVzZXJFbnRpdHkpO1xuXFx0fVxuXG5cXHRwdWJsaWMgZmluZEJ5U3ViKHN1Yjogc3RyaW5nKTogUHJvbWlzZTxVc2VyRW50aXR5IHwgbnVsbD4ge1xuXFx0XFx0cmV0dXJuIHRoaXMuZmlyc3RPckRlZmF1bHQoeyB3aGVyZTogeyBzdWIgfSB9KTtcblxcdH1cbn1cbmA7XG5cbmNvbnN0IFVTRVJfU0VSVklDRV9UUyA9IGBpbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSBcIkBkZWNvaGVyZS9jcnVjaWJsZS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgdHlwZSB7IFByaW5jaXBhbCB9IGZyb20gXCJAZGVjb2hlcmUvY29ydGV4XCI7XG5pbXBvcnQgeyBVc2VyRW50aXR5IH0gZnJvbSBcIi4uL2VudGl0aWVzL3VzZXIuZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBVc2VyRW50aXR5UmVwb3NpdG9yeSB9IGZyb20gXCIuLi9yZXBvc2l0b3JpZXMvdXNlci5yZXBvc2l0b3J5LmpzXCI7XG5cbmZ1bmN0aW9uIGNsYWltU3RyaW5nKHByaW5jaXBhbDogUHJpbmNpcGFsIHwgdW5kZWZpbmVkLCBrZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cXHRjb25zdCB2YWx1ZSA9IHByaW5jaXBhbD8uW2tleV07XG5cXHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlLmxlbmd0aCA+IDAgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFVzZXJTZXJ2aWNlIHtcblxcdHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHVzZXJzOiBVc2VyRW50aXR5UmVwb3NpdG9yeSkge31cblxuXFx0LyoqXG5cXHQgKiBVcHNlcnQgYSBsb2NhbCBwcm9maWxlIGtleWVkIGJ5IEpXVCBcXGBzdWJcXGAuXG5cXHQgKiBQcm9maWxlIGZpZWxkcyBmcm9tIHRoZSB0b2tlbiBmaWxsIGdhcHM7IHNlZWRlZCByb3dzIGtlZXAgZGlzcGxheU5hbWUvZW1haWwvcm9sZXMuXG5cXHQgKi9cblxcdHB1YmxpYyBhc3luYyBlbnN1cmVGcm9tUHJpbmNpcGFsKHByaW5jaXBhbDogUHJpbmNpcGFsIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxVc2VyRW50aXR5PiB7XG5cXHRcXHRjb25zdCBzdWIgPSBwcmluY2lwYWw/LnN1YjtcblxcdFxcdGlmICghc3ViKSB7XG5cXHRcXHRcXHR0aHJvdyBuZXcgRXJyb3IoXCJBdXRoZW50aWNhdGVkIHJlcXVlc3QgaXMgbWlzc2luZyBwcmluY2lwYWwuc3ViXCIpO1xuXFx0XFx0fVxuXG5cXHRcXHRjb25zdCBlbWFpbCA9XG5cXHRcXHRcXHRjbGFpbVN0cmluZyhwcmluY2lwYWwsIFwiZW1haWxcIikgPz8gY2xhaW1TdHJpbmcocHJpbmNpcGFsLCBcInByZWZlcnJlZF91c2VybmFtZVwiKTtcblxcdFxcdGNvbnN0IGRpc3BsYXlGcm9tVG9rZW4gPVxuXFx0XFx0XFx0Y2xhaW1TdHJpbmcocHJpbmNpcGFsLCBcIm5hbWVcIikgPz9cblxcdFxcdFxcdGNsYWltU3RyaW5nKHByaW5jaXBhbCwgXCJuaWNrbmFtZVwiKSA/P1xuXFx0XFx0XFx0ZW1haWw7XG5cblxcdFxcdGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy51c2Vycy5maW5kQnlTdWIoc3ViKTtcblxcdFxcdGlmIChleGlzdGluZykge1xuXFx0XFx0XFx0bGV0IGRpcnR5ID0gZmFsc2U7XG5cXHRcXHRcXHRpZiAoIWV4aXN0aW5nLmVtYWlsICYmIGVtYWlsKSB7XG5cXHRcXHRcXHRcXHRleGlzdGluZy5lbWFpbCA9IGVtYWlsO1xuXFx0XFx0XFx0XFx0ZGlydHkgPSB0cnVlO1xuXFx0XFx0XFx0fVxuXFx0XFx0XFx0aWYgKGV4aXN0aW5nLmRpc3BsYXlOYW1lID09PSBleGlzdGluZy5zdWIgJiYgZGlzcGxheUZyb21Ub2tlbikge1xuXFx0XFx0XFx0XFx0ZXhpc3RpbmcuZGlzcGxheU5hbWUgPSBkaXNwbGF5RnJvbVRva2VuO1xuXFx0XFx0XFx0XFx0ZGlydHkgPSB0cnVlO1xuXFx0XFx0XFx0fVxuXFx0XFx0XFx0cmV0dXJuIGRpcnR5ID8gdGhpcy51c2Vycy5zYXZlKGV4aXN0aW5nKSA6IGV4aXN0aW5nO1xuXFx0XFx0fVxuXG5cXHRcXHRjb25zdCBjcmVhdGVkID0gbmV3IFVzZXJFbnRpdHkoKTtcblxcdFxcdGNyZWF0ZWQuc3ViID0gc3ViO1xuXFx0XFx0Y3JlYXRlZC5lbWFpbCA9IGVtYWlsID8/IG51bGw7XG5cXHRcXHRjcmVhdGVkLmRpc3BsYXlOYW1lID0gZGlzcGxheUZyb21Ub2tlbiA/PyBzdWI7XG5cXHRcXHRjcmVhdGVkLnJvbGVzID0gQXJyYXkuaXNBcnJheShwcmluY2lwYWwucm9sZXMpXG5cXHRcXHRcXHQ/IHByaW5jaXBhbC5yb2xlcy5maWx0ZXIoKHIpOiByIGlzIHN0cmluZyA9PiB0eXBlb2YgciA9PT0gXCJzdHJpbmdcIilcblxcdFxcdFxcdDogW107XG5cXHRcXHRyZXR1cm4gdGhpcy51c2Vycy5zYXZlKGNyZWF0ZWQpO1xuXFx0fVxufVxuYDtcblxuY29uc3QgQUJJTElUWV9GQUNUT1JZX1RTID0gYGltcG9ydCB7IEFiaWxpdHlCdWlsZGVyLCBjcmVhdGVNb25nb0FiaWxpdHkgfSBmcm9tIFwiQGNhc2wvYWJpbGl0eVwiO1xuaW1wb3J0IHR5cGUgeyBQcmluY2lwYWwgfSBmcm9tIFwiQGRlY29oZXJlL2NvcnRleFwiO1xuXG4vKiogUm9vdCByb2xlIOKAlCBleHBhbmRzIHRvIENBU0wgXFxgbWFuYWdlXFxgL1xcYGFsbFxcYCAoY292ZXJzIGV2ZXJ5IGZ1dHVyZSBhYmlsaXR5KS4gKi9cbmV4cG9ydCBjb25zdCBBRE1JTl9ST0xFID0gXCJhZG1pblwiO1xuXG4vKipcbiAqIFJvbGVzIGFyZSBjb2xsZWN0aW9ucyBvZiBhYmlsaXRpZXMuIEFkbWluIGlzIGEgd2lsZGNhcmQsIG5vdCBhbiBlbnVtZXJhdGVkIGxpc3QuXG4gKiBOb24tYWRtaW4gcHJpbmNpcGFscyBrZWVwIEF1dGgwIHNjb3BlIC8gcGVybWlzc2lvbiDihpIgYWJpbGl0eSBtYXBwaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQWJpbGl0eUZhY3RvcnkocHJpbmNpcGFsOiBQcmluY2lwYWwpIHtcblxcdGNvbnN0IHsgY2FuLCBidWlsZCB9ID0gbmV3IEFiaWxpdHlCdWlsZGVyKGNyZWF0ZU1vbmdvQWJpbGl0eSk7XG5cXHRpZiAocHJpbmNpcGFsLnJvbGVzPy5pbmNsdWRlcyhBRE1JTl9ST0xFKSkge1xuXFx0XFx0Y2FuKFwibWFuYWdlXCIsIFwiYWxsXCIpO1xuXFx0XFx0cmV0dXJuIGJ1aWxkKCk7XG5cXHR9XG5cXHRmb3IgKGNvbnN0IHNjb3BlIG9mIHByaW5jaXBhbC5zY29wZXMgPz8gW10pIHtcblxcdFxcdGNvbnN0IFthY3Rpb24sIHN1YmplY3RdID0gc2NvcGUuc3BsaXQoXCI6XCIpO1xuXFx0XFx0aWYgKGFjdGlvbiAmJiBzdWJqZWN0KSBjYW4oYWN0aW9uLCBzdWJqZWN0KTtcblxcdH1cblxcdHJldHVybiBidWlsZCgpO1xufVxuXG4vKipcbiAqIE1hcCBKV1QgcGF5bG9hZCDihpIgUHJpbmNpcGFsLlxuICpcbiAqIC0gXFxgcm9sZXNcXGAgY29tZSBmcm9tIHRoZSBJZFAgKEF1dGgwIFJCQUMgLyBBY3Rpb24gZnJvbSBhcHBfbWV0YWRhdGEpLiBBZG1pbnMgYXJlXG4gKiAgIGFzc2lnbmVkIGluIEF1dGgwIOKAlCBubyBzZXJ2ZXIgZW52IGNoYW5nZSByZXF1aXJlZCBmb3IgYWRkaXRpb25hbCBhZG1pbnMuXG4gKiAtIFxcYEFVVEgwX0FETUlOX1VTRVJfU1VCXFxgIGlzIGFuIG9wdGlvbmFsIGJvb3RzdHJhcCBzbyB0aGUgc2VlZGVkIGFkbWluIHdvcmtzXG4gKiAgIGJlZm9yZS93aXRob3V0IHJvbGVzIG9uIHRoZSBhY2Nlc3MgdG9rZW4uXG4gKiAtIEFQSSBwZXJtaXNzaW9ucyBhcmUgdGFrZW4gZnJvbSBcXGBzY29wZVxcYCBhbmQgZnJvbSBBdXRoMCdzIFxcYHBlcm1pc3Npb25zXFxgIGNsYWltLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFwUHJpbmNpcGFsKHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUHJpbmNpcGFsIHtcblxcdGNvbnN0IHN1YiA9IHR5cGVvZiBwYXlsb2FkLnN1YiA9PT0gXCJzdHJpbmdcIiA/IHBheWxvYWQuc3ViIDogXCJcIjtcblxcdGNvbnN0IGZyb21TY29wZUNsYWltID1cblxcdFxcdHR5cGVvZiBwYXlsb2FkLnNjb3BlID09PSBcInN0cmluZ1wiXG5cXHRcXHRcXHQ/IHBheWxvYWQuc2NvcGUuc3BsaXQoXCIgXCIpLmZpbHRlcihCb29sZWFuKVxuXFx0XFx0XFx0OiBBcnJheS5pc0FycmF5KHBheWxvYWQuc2NvcGVzKVxuXFx0XFx0XFx0XFx0PyAocGF5bG9hZC5zY29wZXMgYXMgdW5rbm93bltdKS5maWx0ZXIoKHMpOiBzIGlzIHN0cmluZyA9PiB0eXBlb2YgcyA9PT0gXCJzdHJpbmdcIilcblxcdFxcdFxcdFxcdDogW107XG5cXHRjb25zdCBmcm9tUGVybWlzc2lvbnMgPSBBcnJheS5pc0FycmF5KHBheWxvYWQucGVybWlzc2lvbnMpXG5cXHRcXHQ/IChwYXlsb2FkLnBlcm1pc3Npb25zIGFzIHVua25vd25bXSkuZmlsdGVyKChzKTogcyBpcyBzdHJpbmcgPT4gdHlwZW9mIHMgPT09IFwic3RyaW5nXCIpXG5cXHRcXHQ6IFtdO1xuXFx0Y29uc3QgbWVyZ2VkID0gWy4uLm5ldyBTZXQoWy4uLmZyb21TY29wZUNsYWltLCAuLi5mcm9tUGVybWlzc2lvbnNdKV07XG5cXHRjb25zdCBzY29wZXMgPSBtZXJnZWQubGVuZ3RoID4gMCA/IG1lcmdlZCA6IHVuZGVmaW5lZDtcblxcdGNvbnN0IGZyb21Ub2tlbiA9IEFycmF5LmlzQXJyYXkocGF5bG9hZC5yb2xlcylcblxcdFxcdD8gKHBheWxvYWQucm9sZXMgYXMgdW5rbm93bltdKS5maWx0ZXIoKHIpOiByIGlzIHN0cmluZyA9PiB0eXBlb2YgciA9PT0gXCJzdHJpbmdcIilcblxcdFxcdDogW107XG5cXHRjb25zdCByb2xlcyA9XG5cXHRcXHRzdWIgJiYgc3ViID09PSBwcm9jZXNzLmVudi5BVVRIMF9BRE1JTl9VU0VSX1NVQlxuXFx0XFx0XFx0PyBbLi4ubmV3IFNldChbQURNSU5fUk9MRSwgLi4uZnJvbVRva2VuXSldXG5cXHRcXHRcXHQ6IGZyb21Ub2tlbi5sZW5ndGggPiAwXG5cXHRcXHRcXHRcXHQ/IGZyb21Ub2tlblxuXFx0XFx0XFx0XFx0OiB1bmRlZmluZWQ7XG5cXHRyZXR1cm4geyAuLi5wYXlsb2FkLCBzdWIsIHJvbGVzLCBzY29wZXMgfTtcbn1cbmA7XG5cbmFzeW5jIGZ1bmN0aW9uIGdldE9wdGlvbnMoXG5cdHdvcmtzcGFjZTogV29ya3NwYWNlU2NhZmZvbGQsXG5cdGNsaU9wdGlvbnM6IFBhcnRpYWw8QXV0aE9wdGlvbnM+LFxuKTogUHJvbWlzZTxQYXJ0aWFsPEF1dGhPcHRpb25zPj4ge1xuXHRpZiAoY2xpT3B0aW9ucy5hdXRoUHJvdmlkZXIgPT09IFwiYXV0aDBcIiAmJiAhY2xpT3B0aW9ucy5pc3N1ZXJCYXNlVXJsKSB7XG5cdFx0cmV0dXJuIGdldEF1dGgwT3B0aW9ucyh3b3Jrc3BhY2UsIGNsaU9wdGlvbnMpO1xuXHR9XG5cdGlmIChjbGlPcHRpb25zLmF1dGhQcm92aWRlciAhPSBudWxsKSByZXR1cm4ge307XG5cblx0Y29uc3QgY2hvaWNlcyA9IFt7IGxhYmVsOiBcIm5vbmVcIiBhcyBjb25zdCB9LCB7IGxhYmVsOiBcImF1dGgwXCIgYXMgY29uc3QgfV07XG5cdGNvbnN0IHNlbGVjdGVkID0gYXdhaXQgcGljayhcIlxcbiAgQXV0aCBwcm92aWRlcjogXCIsIGNob2ljZXMsIChjKSA9PiBjLmxhYmVsKTtcblx0Y29uc3QgcHJvdmlkZXIgPSBzZWxlY3RlZD8ubGFiZWwgPz8gXCJub25lXCI7XG5cblx0aWYgKHByb3ZpZGVyICE9PSBcImF1dGgwXCIpIHJldHVybiB7IGF1dGhQcm92aWRlcjogXCJub25lXCIgfTtcblxuXHRyZXR1cm4gZ2V0QXV0aDBPcHRpb25zKHdvcmtzcGFjZSwgY2xpT3B0aW9ucyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEF1dGgwT3B0aW9ucyhcblx0d29ya3NwYWNlOiBXb3Jrc3BhY2VTY2FmZm9sZCxcblx0Y2xpT3B0aW9uczogUGFydGlhbDxBdXRoT3B0aW9ucz4sXG4pOiBQcm9taXNlPFBhcnRpYWw8QXV0aE9wdGlvbnM+PiB7XG5cdGlmICghYXV0aDBDbGkuaXNJbnN0YWxsZWQoKSkge1xuXHRcdGNvbnNvbGUuZXJyb3IoXG5cdFx0XHRcIlxcbiAgVGhlIEF1dGgwIENMSSBpcyByZXF1aXJlZCBmb3IgYXV0b21hdGVkIHNldHVwLlxcblwiICtcblx0XHRcdFx0XCIgIEluc3RhbGw6IGJyZXcgaW5zdGFsbCBhdXRoMC9hdXRoMC1jbGkvYXV0aDBcXG5cIiArXG5cdFx0XHRcdFwiICBPciB2aXNpdDogaHR0cHM6Ly9naXRodWIuY29tL2F1dGgwL2F1dGgwLWNsaVxcblwiLFxuXHRcdCk7XG5cdFx0cHJvY2Vzcy5leGl0KDEpO1xuXHR9XG5cblx0cHJvY2Vzcy5zdGRvdXQud3JpdGUoXCJcXG4gIENoZWNraW5nIEF1dGgwIGNyZWRlbnRpYWxzLi4uXCIpO1xuXHRsZXQgdGVuYW50cyA9IGF1dGgwQ2xpLmxpc3RUZW5hbnRzKCk7XG5cdGlmICh0ZW5hbnRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdHByb2Nlc3Muc3Rkb3V0LndyaXRlKFwiIG5vdCBsb2dnZWQgaW4uXFxuXCIpO1xuXHRcdGNvbnNvbGUubG9nKFwiICBMb2dnaW5nIGluIHRvIEF1dGgwICh5b3VyIGJyb3dzZXIgd2lsbCBvcGVuKS4uLlwiKTtcblx0XHRpZiAoIWF1dGgwQ2xpLmxvZ2luKCkpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoXCJcXG4gIEF1dGgwIGxvZ2luIGZhaWxlZC5cIik7XG5cdFx0XHRwcm9jZXNzLmV4aXQoMSk7XG5cdFx0fVxuXHRcdHRlbmFudHMgPSBhdXRoMENsaS5saXN0VGVuYW50cygpO1xuXHR9XG5cblx0dHJ5IHtcblx0XHRhdXRoMENsaS5saXN0QXBpcygpO1xuXHRcdHByb2Nlc3Muc3Rkb3V0LndyaXRlKFwiIG9rLlxcblwiKTtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0aWYgKGVyciBpbnN0YW5jZW9mIGF1dGgwQ2xpLkF1dGgwQXV0aEVycm9yKSB7XG5cdFx0XHRwcm9jZXNzLnN0ZG91dC53cml0ZShcIiB0b2tlbiBleHBpcmVkLlxcblwiKTtcblx0XHRcdGNvbnNvbGUubG9nKFwiICBSZS1hdXRoZW50aWNhdGluZyAoeW91ciBicm93c2VyIHdpbGwgb3BlbikuLi5cIik7XG5cdFx0XHRpZiAoIWF1dGgwQ2xpLmxvZ2luKCkpIHtcblx0XHRcdFx0Y29uc29sZS5lcnJvcihcIlxcbiAgQXV0aDAgbG9naW4gZmFpbGVkLlwiKTtcblx0XHRcdFx0cHJvY2Vzcy5leGl0KDEpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGNvbnN0IGFjdGl2ZSA9IHRlbmFudHMuZmluZCgodCkgPT4gdC5hY3RpdmUpID8/IHRlbmFudHNbMF07XG5cdGNvbnN0IGlzc3VlckJhc2VVcmwgPSBgaHR0cHM6Ly8ke2FjdGl2ZS5uYW1lfWA7XG5cdGNvbnNvbGUubG9nKGBcXG4gIOKckyBBdXRoMCB0ZW5hbnQ6ICR7aXNzdWVyQmFzZVVybH1gKTtcblxuXHRwcm9jZXNzLnN0ZG91dC53cml0ZShcIlxcbiAgRmV0Y2hpbmcgQXV0aDAgQVBJcy4uLlwiKTtcblx0Y29uc3QgdXNlckFwaXMgPSBhdXRoMENsaS5saXN0QXBpcygpLmZpbHRlcigoYSkgPT4gIWEubmFtZS5pbmNsdWRlcyhcIk1hbmFnZW1lbnQgQVBJXCIpKTtcblx0cHJvY2Vzcy5zdGRvdXQud3JpdGUoYCBmb3VuZCAke3VzZXJBcGlzLmxlbmd0aH0uXFxuYCk7XG5cblx0dHlwZSBBcGlDaG9pY2UgPSB7IGxhYmVsOiBzdHJpbmc7IGV4aXN0aW5nOiBzdHJpbmcgfCBudWxsIH07XG5cdGNvbnN0IHByb2plY3ROYW1lID0gd29ya3NwYWNlLm5hbWU7XG5cdGNvbnN0IGFwaUNob2ljZXM6IEFwaUNob2ljZVtdID0gW1xuXHRcdHsgbGFiZWw6IGA8bmV3PiBodHRwczovL2FwaS4ke3Byb2plY3ROYW1lfWAsIGV4aXN0aW5nOiBudWxsIH0sXG5cdFx0Li4udXNlckFwaXMubWFwKChhKSA9PiAoeyBsYWJlbDogYCR7YS5uYW1lfSDigJQgJHthLmlkZW50aWZpZXJ9YCwgZXhpc3Rpbmc6IGEuaWRlbnRpZmllciB9KSksXG5cdF07XG5cblx0Y29uc3QgYXBpU2VsZWN0ZWQgPSBhd2FpdCBwaWNrKFwiXFxuICBTZWxlY3QgQXV0aDAgQVBJOiBcIiwgYXBpQ2hvaWNlcywgKGMpID0+IGMubGFiZWwpO1xuXG5cdGxldCBhdWRpZW5jZTogc3RyaW5nO1xuXHRpZiAoIWFwaVNlbGVjdGVkIHx8IGFwaVNlbGVjdGVkLmV4aXN0aW5nID09PSBudWxsKSB7XG5cdFx0Y29uc3QgZGVmYXVsdElkID0gYGh0dHBzOi8vYXBpLiR7cHJvamVjdE5hbWV9YDtcblx0XHRhdWRpZW5jZSA9IGF3YWl0IGFzayhgICBBUEkgSWRlbnRpZmllciBbJHtkZWZhdWx0SWR9XTogYCwgZGVmYXVsdElkKTtcblx0XHRjb25zb2xlLmxvZyhcIlxcbiAgQ3JlYXRpbmcgQXV0aDAgQVBJLi4uXCIpO1xuXHRcdGF1ZGllbmNlID0gYXV0aDBDbGkuY3JlYXRlQXBpKGAke3Byb2plY3ROYW1lfSBBUElgLCBhdWRpZW5jZSkuaWRlbnRpZmllcjtcblx0XHRjb25zb2xlLmxvZyhgICBcXHUyNzEzIEFQSSBjcmVhdGVkOiAke2F1ZGllbmNlfWApO1xuXHR9IGVsc2Uge1xuXHRcdGF1ZGllbmNlID0gYXBpU2VsZWN0ZWQuZXhpc3Rpbmc7XG5cdFx0Y29uc29sZS5sb2coYCAgXFx1MjcxMyBTZWxlY3RlZDogJHthdWRpZW5jZX1gKTtcblx0XHR0cnkge1xuXHRcdFx0YXV0aDBDbGkudXBkYXRlQXBpU2NvcGVzKGF1ZGllbmNlKTtcblx0XHRcdGNvbnNvbGUubG9nKGAgIFxcdTI3MTMgQVBJIHNjb3BlcyBlbnN1cmVkICgke2F1dGgwQ2xpLkhFTExPX0FQSV9TQ09QRVMuam9pbihcIiwgXCIpfSlgKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoXG5cdFx0XHRcdFwiICDinJcgRmFpbGVkIHRvIHVwZGF0ZSBBUEkgc2NvcGVzIOKAlCBhZGQgSGVsbG8gc2NvcGVzIGluIHRoZSBBdXRoMCBkYXNoYm9hcmQuXCIsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdGNvbnN0IHdpdGhMb2NhbFVzZXJzID0gY2xpT3B0aW9ucy5kYXRhYmFzZVByb3ZpZGVyID09PSBcInBvc3RncmVzL3R5cGVvcm1cIjtcblx0bGV0IGFkbWluVXNlcm5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0bGV0IGFkbWluUGFzc3dvcmQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0aWYgKHdpdGhMb2NhbFVzZXJzKSB7XG5cdFx0YWRtaW5Vc2VybmFtZSA9XG5cdFx0XHRjbGlPcHRpb25zLmFkbWluVXNlcm5hbWUgPz8gKGF3YWl0IGFzayhcIlxcbiAgQWRtaW4gdXNlcm5hbWUgW2FkbWluXTogXCIsIFwiYWRtaW5cIikpO1xuXHRcdGFkbWluUGFzc3dvcmQgPSBjbGlPcHRpb25zLmFkbWluUGFzc3dvcmQ7XG5cdFx0aWYgKGFkbWluUGFzc3dvcmQgPT0gbnVsbCkge1xuXHRcdFx0YWRtaW5QYXNzd29yZCA9IGF3YWl0IGFzayhcIiAgQWRtaW4gcGFzc3dvcmQgKGxlYXZlIGJsYW5rIHRvIGdlbmVyYXRlKTogXCIpO1xuXHRcdFx0aWYgKCFhZG1pblBhc3N3b3JkKSB7XG5cdFx0XHRcdGFkbWluUGFzc3dvcmQgPSBhdXRoMENsaS5nZW5lcmF0ZUFkbWluUGFzc3dvcmQoKTtcblx0XHRcdFx0Y29uc29sZS5sb2coYCAg4pyTIEdlbmVyYXRlZCBhZG1pbiBwYXNzd29yZCAod3JpdHRlbiB0byAuZW52KTogJHthZG1pblBhc3N3b3JkfWApO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0YXV0aFByb3ZpZGVyOiBcImF1dGgwXCIsXG5cdFx0aXNzdWVyQmFzZVVybCxcblx0XHRhdWRpZW5jZSxcblx0XHQuLi4od2l0aExvY2FsVXNlcnMgPyB7IGFkbWluVXNlcm5hbWUsIGFkbWluUGFzc3dvcmQgfSA6IHt9KSxcblx0fTtcbn1cblxuZnVuY3Rpb24gYWRtaW5FbWFpbCh3b3Jrc3BhY2VOYW1lOiBzdHJpbmcsIHVzZXJuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRpZiAodXNlcm5hbWUuaW5jbHVkZXMoXCJAXCIpKSByZXR1cm4gdXNlcm5hbWU7XG5cdGNvbnN0IHNsdWcgPSB3b3Jrc3BhY2VOYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXowLTktXS9nLCBcIi1cIik7XG5cdHJldHVybiBgJHt1c2VybmFtZX1AJHtzbHVnfS5leGFtcGxlLmNvbWA7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUF1dGgwQWRtaW5Vc2VyKFxuXHR3b3Jrc3BhY2U6IFdvcmtzcGFjZVNjYWZmb2xkLFxuXHRvcHRpb25zOiBBdXRoT3B0aW9ucyxcblx0YXV0aENvbmZpZzogQXV0aENvbmZpZ01vZGVsLFxuKTogdm9pZCB7XG5cdGNvbnN0IHVzZXJuYW1lID0gb3B0aW9ucy5hZG1pblVzZXJuYW1lID8/IFwiYWRtaW5cIjtcblx0Y29uc3QgcGFzc3dvcmQgPSBvcHRpb25zLmFkbWluUGFzc3dvcmQ7XG5cdGlmICghcGFzc3dvcmQpIHJldHVybjtcblxuXHRjb25zdCBlbWFpbCA9IGFkbWluRW1haWwod29ya3NwYWNlLm5hbWUsIHVzZXJuYW1lKTtcblx0dHJ5IHtcblx0XHRjb25zdCBhZG1pbiA9IGF1dGgwQ2xpLmNyZWF0ZUFkbWluRGF0YWJhc2VVc2VyKHsgZW1haWwsIHBhc3N3b3JkLCB1c2VybmFtZSB9KTtcblx0XHRhdXRoQ29uZmlnLnNldEFkbWluVXNlcih7XG5cdFx0XHRzdWI6IGFkbWluLnVzZXJfaWQsXG5cdFx0XHRlbWFpbDogYWRtaW4uZW1haWwsXG5cdFx0XHRwYXNzd29yZDogYWRtaW4ucGFzc3dvcmQsXG5cdFx0XHR1c2VybmFtZTogYWRtaW4udXNlcm5hbWUsXG5cdFx0fSk7XG5cdFx0d29ya3NwYWNlXG5cdFx0XHQuZ2V0TW9kZWw8RW52RmlsZT4oV0VMTF9LTk9XTl9GSUxFUy5FTlZfRklMRSlcblx0XHRcdD8uYWRkRW50cnkoXCJBVVRIMF9BRE1JTl9VU0VSX1NVQlwiLCBhZG1pbi51c2VyX2lkKVxuXHRcdFx0LmFkZEVudHJ5KFwiQVVUSDBfQURNSU5fVVNFUl9FTUFJTFwiLCBhZG1pbi5lbWFpbClcblx0XHRcdC5hZGRFbnRyeShcIkFVVEgwX0FETUlOX1VTRVJfUEFTU1dPUkRcIiwgYWRtaW4ucGFzc3dvcmQpXG5cdFx0XHQuYWRkRW50cnkoXCJBVVRIMF9BRE1JTl9VU0VSTkFNRVwiLCBhZG1pbi51c2VybmFtZSk7XG5cdFx0Y29uc29sZS5sb2coYCAg4pyTIEF1dGgwIGFkbWluIHVzZXIgcmVhZHk6ICR7YWRtaW4uZW1haWx9IChyb2xlOiAke0FETUlOX1JPTEV9KWApO1xuXHRcdGNvbnNvbGUubG9nKGAgICAgTG9naW4gd2l0aCBFTUFJTCAobm90IHVzZXJuYW1lKTogJHthZG1pbi5lbWFpbH1gKTtcblx0XHRjb25zb2xlLmxvZyhgICAgIFBhc3N3b3JkOiBzZWUgQVVUSDBfQURNSU5fVVNFUl9QQVNTV09SRCBpbiAuZW52YCk7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdGNvbnNvbGUuZXJyb3IoXG5cdFx0XHRgICDinJcgRmFpbGVkIHRvIGVuc3VyZSBBdXRoMCBhZG1pbiB1c2VyICgke2VtYWlsfSk6ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IGVycn1gLFxuXHRcdCk7XG5cdH1cbn1cblxuZnVuY3Rpb24gc2NhZmZvbGRMb2NhbFVzZXJQcm9maWxlKHdvcmtzcGFjZTogV29ya3NwYWNlU2NhZmZvbGQpOiB2b2lkIHtcblx0d29ya3NwYWNlXG5cdFx0LmdldE1vZGVsPFBhY2thZ2VKc29uPihXRUxMX0tOT1dOX0ZJTEVTLlBBQ0tBR0VfSlNPTilcblx0XHQ/LmFkZERlcGVuZGVuY3koXCJAY2FzbC9hYmlsaXR5XCIsIFwiXjYuOC4xXCIpO1xuXG5cdGZvciAoY29uc3QgcHJvamVjdCBvZiB3b3Jrc3BhY2UuZ2V0UHJvamVjdHMoKSkge1xuXHRcdHByb2plY3Rcblx0XHRcdC5nZXRNb2RlbDxBcGlQYWNrYWdlSnNvbj4oV0VMTF9LTk9XTl9GSUxFUy5BUElfUEFDS0FHRV9KU09OKVxuXHRcdFx0Py5hZGREZXBlbmRlbmN5KFwiQGNhc2wvYWJpbGl0eVwiLCBcIl42LjguMVwiKTtcblxuXHRcdHByb2plY3Rcblx0XHRcdC5nZXRNb2RlbDxNYWluU291cmNlRmlsZT4oV0VMTF9LTk9XTl9GSUxFUy5NQUlOX1RTKVxuXHRcdFx0Py5hZGRFbnRpdHkoeyBjbGFzc05hbWU6IFwiVXNlckVudGl0eVwiLCBpbXBvcnRQYXRoOiBcIi4vZW50aXRpZXMvdXNlci5lbnRpdHkuanNcIiB9KVxuXHRcdFx0LmFkZFJlcG9zaXRvcnkoe1xuXHRcdFx0XHRjbGFzc05hbWU6IFwiVXNlckVudGl0eVJlcG9zaXRvcnlcIixcblx0XHRcdFx0aW1wb3J0UGF0aDogXCIuL3JlcG9zaXRvcmllcy91c2VyLnJlcG9zaXRvcnkuanNcIixcblx0XHRcdH0pXG5cdFx0XHQuYWRkU2VydmljZSh7XG5cdFx0XHRcdGNsYXNzTmFtZTogXCJVc2VyU2VydmljZVwiLFxuXHRcdFx0XHRpbXBvcnRQYXRoOiBcIi4vc2VydmljZXMvdXNlci5zZXJ2aWNlLmpzXCIsXG5cdFx0XHRcdHNjb3BlOiBcInJlcXVlc3RcIixcblx0XHRcdH0pXG5cdFx0XHQuYWRkSW1wb3J0KFwiY3JlYXRlQWJpbGl0eUZhY3RvcnlcIiwgXCIuL2F1dGgvYWJpbGl0eS5mYWN0b3J5LmpzXCIpXG5cdFx0XHQuYWRkSW1wb3J0KFwibWFwUHJpbmNpcGFsXCIsIFwiLi9hdXRoL2FiaWxpdHkuZmFjdG9yeS5qc1wiKVxuXHRcdFx0LnNldFR5cGVPcm1TZWVkKFxuXHRcdFx0XHRbXG5cdFx0XHRcdFx0XCJjb25zdCBzdWIgPSBwcm9jZXNzLmVudi5BVVRIMF9BRE1JTl9VU0VSX1NVQjtcIixcblx0XHRcdFx0XHRcImlmICghc3ViKSByZXR1cm47XCIsXG5cdFx0XHRcdFx0XCJjb25zdCByZXBvID0gZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KFVzZXJFbnRpdHkpO1wiLFxuXHRcdFx0XHRcdFwiY29uc3QgZXhpc3RpbmcgPSBhd2FpdCByZXBvLmZpbmRPbmUoeyB3aGVyZTogeyBzdWIgfSB9KTtcIixcblx0XHRcdFx0XHRcImlmIChleGlzdGluZykgcmV0dXJuO1wiLFxuXHRcdFx0XHRcdFwiYXdhaXQgcmVwby5zYXZlKHJlcG8uY3JlYXRlKHtcIixcblx0XHRcdFx0XHRcIiAgc3ViLFwiLFxuXHRcdFx0XHRcdFwiICBlbWFpbDogcHJvY2Vzcy5lbnYuQVVUSDBfQURNSU5fVVNFUl9FTUFJTCA/PyBudWxsLFwiLFxuXHRcdFx0XHRcdCcgIGRpc3BsYXlOYW1lOiBwcm9jZXNzLmVudi5BVVRIMF9BRE1JTl9VU0VSTkFNRSA/PyBcImFkbWluXCIsJyxcblx0XHRcdFx0XHQnICByb2xlczogW1wiYWRtaW5cIl0sJyxcblx0XHRcdFx0XHRcIn0pKTtcIixcblx0XHRcdFx0XS5qb2luKFwiIFwiKSxcblx0XHRcdCk7XG5cblx0XHRwcm9qZWN0LmFkZEZpbGUoe1xuXHRcdFx0ZmlsZXM6ICgpID0+IFtcblx0XHRcdFx0eyBmaWxlUGF0aDogXCJzcmMvZW50aXRpZXMvdXNlci5lbnRpdHkudHNcIiwgY29udGVudDogVVNFUl9FTlRJVFlfVFMgfSxcblx0XHRcdFx0eyBmaWxlUGF0aDogXCJzcmMvcmVwb3NpdG9yaWVzL3VzZXIucmVwb3NpdG9yeS50c1wiLCBjb250ZW50OiBVU0VSX1JFUE9TSVRPUllfVFMgfSxcblx0XHRcdFx0eyBmaWxlUGF0aDogXCJzcmMvc2VydmljZXMvdXNlci5zZXJ2aWNlLnRzXCIsIGNvbnRlbnQ6IFVTRVJfU0VSVklDRV9UUyB9LFxuXHRcdFx0XHR7IGZpbGVQYXRoOiBcInNyYy9hdXRoL2FiaWxpdHkuZmFjdG9yeS50c1wiLCBjb250ZW50OiBBQklMSVRZX0ZBQ1RPUllfVFMgfSxcblx0XHRcdF0sXG5cdFx0fSk7XG5cdH1cblxuXHRmb3IgKGNvbnN0IGNvbnRyb2xsZXIgb2Ygd29ya3NwYWNlLmdldE1vZGVscyhDb250cm9sbGVyU291cmNlRmlsZSkpIHtcblx0XHRjb250cm9sbGVyXG5cdFx0XHQuYWRkSW1wb3J0KFwiVXNlclNlcnZpY2VcIiwgXCIuLi9zZXJ2aWNlcy91c2VyLnNlcnZpY2UuanNcIilcblx0XHRcdC5hZGRDb25zdHJ1Y3RvclBhcmFtKFwicHJpdmF0ZSByZWFkb25seSB1c2VyczogVXNlclNlcnZpY2VcIik7XG5cdFx0Y29udHJvbGxlci5nZXRNZXRob2QoXCJnZXRPbmVcIikuc2V0QXN5bmModHJ1ZSkuc2V0Qm9keShbXG5cdFx0XHRcImNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLnVzZXJzLmVuc3VyZUZyb21QcmluY2lwYWwodGhpcy5wcmluY2lwYWxQcm92aWRlci5jdXJyZW50UHJpbmNpcGFsKTtcIixcblx0XHRcdC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9UZW1wbGF0ZUN1cmx5SW5TdHJpbmc6IHRlbXBsYXRlIGxpdGVyYWwgaW4gZ2VuZXJhdGVkIGNvZGVcblx0XHRcdFwicmV0dXJuIHsgaWQsIG1lc3NhZ2U6IGBIZWxsbyAke3VzZXIuZGlzcGxheU5hbWV9IWAsIHVzZXJuYW1lOiB1c2VyLmRpc3BsYXlOYW1lIH07XCIsXG5cdFx0XSk7XG5cdH1cbn1cblxuZnVuY3Rpb24gc2NhZmZvbGQod29ya3NwYWNlOiBXb3Jrc3BhY2VTY2FmZm9sZCwgb3B0aW9uczogQXV0aE9wdGlvbnMpOiB2b2lkIHtcblx0aWYgKG9wdGlvbnMuYXV0aFByb3ZpZGVyICE9PSBcImF1dGgwXCIpIHJldHVybjtcblxuXHRjb25zdCByZXNvdXJjZSA9IFwiSGVsbG9cIjtcblx0Y29uc3Qgd2l0aExvY2FsVXNlcnMgPSBvcHRpb25zLmRhdGFiYXNlUHJvdmlkZXIgPT09IFwicG9zdGdyZXMvdHlwZW9ybVwiO1xuXG5cdGZvciAoY29uc3QgY29udHJvbGxlciBvZiB3b3Jrc3BhY2UuZ2V0TW9kZWxzKENvbnRyb2xsZXJTb3VyY2VGaWxlKSkge1xuXHRcdGNvbnRyb2xsZXJcblx0XHRcdC5hZGREZWNvcmF0b3IoYEBBdXRob3JpemUoXCJyZWFkXCIsIFwiJHtyZXNvdXJjZX1cIilgKVxuXHRcdFx0LmFkZENvcnRleEltcG9ydChcIkFsbG93QW5vbnltb3VzXCIpXG5cdFx0XHQuYWRkQ29ydGV4SW1wb3J0KFwiQXV0aG9yaXplXCIpXG5cdFx0XHQuYWRkQ29ydGV4SW1wb3J0KFwiSVByaW5jaXBhbFByb3ZpZGVyVG9rZW5cIilcblx0XHRcdC5hZGRDb3J0ZXhJbXBvcnQoXCJJUHJpbmNpcGFsUHJvdmlkZXJcIiwgdHJ1ZSlcblx0XHRcdC5hZGRJbXBvcnQoXCJpbmplY3RcIiwgXCJAZGVjb2hlcmUvY3J1Y2libGUvZGVjb3JhdG9yc1wiKVxuXHRcdFx0LmFkZENvbnN0cnVjdG9yUGFyYW0oXG5cdFx0XHRcdGBAaW5qZWN0KElQcmluY2lwYWxQcm92aWRlclRva2VuKSBwcml2YXRlIHJlYWRvbmx5IHByaW5jaXBhbFByb3ZpZGVyOiBJUHJpbmNpcGFsUHJvdmlkZXJgLFxuXHRcdFx0KTtcblx0XHRjb250cm9sbGVyLmdldE1ldGhvZChcImdldEFsbFwiKS5hZGREZWNvcmF0b3IoXCJAQWxsb3dBbm9ueW1vdXMoKVwiKTtcblx0XHRpZiAoIXdpdGhMb2NhbFVzZXJzKSB7XG5cdFx0XHRjb250cm9sbGVyLmdldE1ldGhvZChcImdldE9uZVwiKS5zZXRCb2R5KFtcblx0XHRcdFx0XCJjb25zdCBwcmluY2lwYWwgPSB0aGlzLnByaW5jaXBhbFByb3ZpZGVyLmN1cnJlbnRQcmluY2lwYWw7XCIsXG5cdFx0XHRcdFwiY29uc3QgdXNlcm5hbWUgPVwiLFxuXHRcdFx0XHQnXFx0KHR5cGVvZiBwcmluY2lwYWw/Lm5hbWUgPT09IFwic3RyaW5nXCIgJiYgcHJpbmNpcGFsLm5hbWUpIHx8Jyxcblx0XHRcdFx0J1xcdCh0eXBlb2YgcHJpbmNpcGFsPy5uaWNrbmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBwcmluY2lwYWwubmlja25hbWUpIHx8Jyxcblx0XHRcdFx0J1xcdCh0eXBlb2YgcHJpbmNpcGFsPy5lbWFpbCA9PT0gXCJzdHJpbmdcIiAmJiBwcmluY2lwYWwuZW1haWwpIHx8Jyxcblx0XHRcdFx0J1xcdCh0eXBlb2YgcHJpbmNpcGFsPy5wcmVmZXJyZWRfdXNlcm5hbWUgPT09IFwic3RyaW5nXCIgJiYgcHJpbmNpcGFsLnByZWZlcnJlZF91c2VybmFtZSkgfHwnLFxuXHRcdFx0XHRcIlxcdHByaW5jaXBhbD8uc3ViIHx8XCIsXG5cdFx0XHRcdCdcXHRcInVua25vd25cIjsnLFxuXHRcdFx0XHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vVGVtcGxhdGVDdXJseUluU3RyaW5nOiB0ZW1wbGF0ZSBsaXRlcmFsIGluIGdlbmVyYXRlZCBjb2RlXG5cdFx0XHRcdFwicmV0dXJuIHsgaWQsIG1lc3NhZ2U6IGBIZWxsbyAke3VzZXJuYW1lfSFgLCB1c2VybmFtZSB9O1wiLFxuXHRcdFx0XSk7XG5cdFx0fVxuXHRcdGNvbnRyb2xsZXIuZ2V0TWV0aG9kKFwiY3JlYXRlXCIpLmFkZERlY29yYXRvcihgQEF1dGhvcml6ZShcImNyZWF0ZVwiLCBcIiR7cmVzb3VyY2V9XCIpYCk7XG5cdFx0Y29udHJvbGxlci5nZXRNZXRob2QoXCJ1cGRhdGVcIikuYWRkRGVjb3JhdG9yKGBAQXV0aG9yaXplKFwidXBkYXRlXCIsIFwiJHtyZXNvdXJjZX1cIilgKTtcblx0XHRjb250cm9sbGVyLmdldE1ldGhvZChcInJlbW92ZVwiKS5hZGREZWNvcmF0b3IoYEBBdXRob3JpemUoXCJkZWxldGVcIiwgXCIke3Jlc291cmNlfVwiKWApO1xuXHR9XG5cblx0Zm9yIChjb25zdCBwcm9qZWN0IG9mIHdvcmtzcGFjZS5nZXRQcm9qZWN0cygpKSB7XG5cdFx0cHJvamVjdFxuXHRcdFx0LmdldE1vZGVsPE1haW5Tb3VyY2VGaWxlPihXRUxMX0tOT1dOX0ZJTEVTLk1BSU5fVFMpXG5cdFx0XHQ/LmFkZFNpZGVFZmZlY3RJbXBvcnQoXCJAZGVjb2hlcmUvY29ydGV4L2F1dGhcIik7XG5cdH1cblxuXHRpZiAod2l0aExvY2FsVXNlcnMpIHtcblx0XHRzY2FmZm9sZExvY2FsVXNlclByb2ZpbGUod29ya3NwYWNlKTtcblx0XHRmb3IgKGNvbnN0IHByb2plY3Qgb2Ygd29ya3NwYWNlLmdldFByb2plY3RzKCkpIHtcblx0XHRcdHByb2plY3Rcblx0XHRcdFx0LmdldE1vZGVsPE1haW5Tb3VyY2VGaWxlPihXRUxMX0tOT1dOX0ZJTEVTLk1BSU5fVFMpXG5cdFx0XHRcdD8uYWRkQnVpbGRlckNhbGwoXCIud2l0aEF1dGgoY3JlYXRlQWJpbGl0eUZhY3RvcnksIHsgcHJpbmNpcGFsTWFwcGVyOiBtYXBQcmluY2lwYWwgfSlcIik7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdGZvciAoY29uc3QgcHJvamVjdCBvZiB3b3Jrc3BhY2UuZ2V0UHJvamVjdHMoKSkge1xuXHRcdFx0cHJvamVjdFxuXHRcdFx0XHQuZ2V0TW9kZWw8TWFpblNvdXJjZUZpbGU+KFdFTExfS05PV05fRklMRVMuTUFJTl9UUylcblx0XHRcdFx0Py5hZGRCdWlsZGVyQ2FsbChcIi53aXRoQXV0aCgpXCIpO1xuXHRcdH1cblx0fVxuXG5cdC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9UZW1wbGF0ZUN1cmx5SW5TdHJpbmc6IGludGVudGlvbmFsIFlBTUwgZW52LXZhciBwbGFjZWhvbGRlcnNcblx0Y29uc3QgaXNzdWVyUGxhY2Vob2xkZXIgPSBcIiR7QVVUSDBfSVNTVUVSX0JBU0VfVVJMfVwiO1xuXHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vVGVtcGxhdGVDdXJseUluU3RyaW5nOiBpbnRlbnRpb25hbCBZQU1MIGVudi12YXIgcGxhY2Vob2xkZXJzXG5cdGNvbnN0IGF1ZFBsYWNlaG9sZGVyID0gXCIke0FVVEgwX0FVRElFTkNFfVwiO1xuXG5cdGNvbnN0IGNvbmZpZ1NlY3Rpb24gPSBgYXV0aDpcXG4gIGRpc2NvdmVyeVVybDogJHtpc3N1ZXJQbGFjZWhvbGRlcn1cXG4gIGF1ZGllbmNlOiAke2F1ZFBsYWNlaG9sZGVyfVxcbmA7XG5cblx0d29ya3NwYWNlLmdldE1vZGVsPENvbmZpZ1lhbWw+KFdFTExfS05PV05fRklMRVMuQ09ORklHX1lBTUwpPy5hZGRTZWN0aW9uKGNvbmZpZ1NlY3Rpb24pO1xuXG5cdHdvcmtzcGFjZVxuXHRcdC5nZXRNb2RlbDxFbnZGaWxlPihXRUxMX0tOT1dOX0ZJTEVTLkVOVl9GSUxFKVxuXHRcdD8uYWRkRW50cnkoXCJBVVRIMF9JU1NVRVJfQkFTRV9VUkxcIiwgb3B0aW9ucy5pc3N1ZXJCYXNlVXJsID8/IFwiXCIpXG5cdFx0LmFkZEVudHJ5KFwiQVVUSDBfQVVESUVOQ0VcIiwgb3B0aW9ucy5hdWRpZW5jZSA/PyBcIlwiKTtcblxuXHRjb25zdCBhdXRoQ29uZmlnID0gbmV3IEF1dGhDb25maWdNb2RlbCh7XG5cdFx0aXNzdWVyQmFzZVVybDogb3B0aW9ucy5pc3N1ZXJCYXNlVXJsID8/IFwiXCIsXG5cdFx0YXVkaWVuY2U6IG9wdGlvbnMuYXVkaWVuY2UgPz8gXCJcIixcblx0fSk7XG5cdHdvcmtzcGFjZS5hZGRNb2RlbChhdXRoQ29uZmlnKTtcblxuXHRpZiAod2l0aExvY2FsVXNlcnMgJiYgb3B0aW9ucy5hZG1pblBhc3N3b3JkKSB7XG5cdFx0Y3JlYXRlQXV0aDBBZG1pblVzZXIod29ya3NwYWNlLCBvcHRpb25zLCBhdXRoQ29uZmlnKTtcblx0fVxufVxuXG5leHBvcnQgY29uc3QgQXV0aEZlYXR1cmU6IEZlYXR1cmU8QXV0aE9wdGlvbnM+ID0geyBnZXRPcHRpb25zLCBzY2FmZm9sZCB9O1xuIl0sIm5hbWVzIjpbImFzayIsInBpY2siLCJXRUxMX0tOT1dOX0ZJTEVTIiwiQXV0aENvbmZpZ01vZGVsIiwiQ29udHJvbGxlclNvdXJjZUZpbGUiLCJhdXRoMENsaSIsIkFETUlOX1JPTEUiLCJVU0VSX0VOVElUWV9UUyIsIlVTRVJfUkVQT1NJVE9SWV9UUyIsIlVTRVJfU0VSVklDRV9UUyIsIkFCSUxJVFlfRkFDVE9SWV9UUyIsImdldE9wdGlvbnMiLCJ3b3Jrc3BhY2UiLCJjbGlPcHRpb25zIiwiYXV0aFByb3ZpZGVyIiwiaXNzdWVyQmFzZVVybCIsImdldEF1dGgwT3B0aW9ucyIsImNob2ljZXMiLCJsYWJlbCIsInNlbGVjdGVkIiwiYyIsInByb3ZpZGVyIiwiaXNJbnN0YWxsZWQiLCJjb25zb2xlIiwiZXJyb3IiLCJwcm9jZXNzIiwiZXhpdCIsInN0ZG91dCIsIndyaXRlIiwidGVuYW50cyIsImxpc3RUZW5hbnRzIiwibGVuZ3RoIiwibG9nIiwibG9naW4iLCJsaXN0QXBpcyIsImVyciIsIkF1dGgwQXV0aEVycm9yIiwiYWN0aXZlIiwiZmluZCIsInQiLCJuYW1lIiwidXNlckFwaXMiLCJmaWx0ZXIiLCJhIiwiaW5jbHVkZXMiLCJwcm9qZWN0TmFtZSIsImFwaUNob2ljZXMiLCJleGlzdGluZyIsIm1hcCIsImlkZW50aWZpZXIiLCJhcGlTZWxlY3RlZCIsImF1ZGllbmNlIiwiZGVmYXVsdElkIiwiY3JlYXRlQXBpIiwidXBkYXRlQXBpU2NvcGVzIiwiSEVMTE9fQVBJX1NDT1BFUyIsImpvaW4iLCJ3aXRoTG9jYWxVc2VycyIsImRhdGFiYXNlUHJvdmlkZXIiLCJhZG1pblVzZXJuYW1lIiwiYWRtaW5QYXNzd29yZCIsImdlbmVyYXRlQWRtaW5QYXNzd29yZCIsImFkbWluRW1haWwiLCJ3b3Jrc3BhY2VOYW1lIiwidXNlcm5hbWUiLCJzbHVnIiwidG9Mb3dlckNhc2UiLCJyZXBsYWNlIiwiY3JlYXRlQXV0aDBBZG1pblVzZXIiLCJvcHRpb25zIiwiYXV0aENvbmZpZyIsInBhc3N3b3JkIiwiZW1haWwiLCJhZG1pbiIsImNyZWF0ZUFkbWluRGF0YWJhc2VVc2VyIiwic2V0QWRtaW5Vc2VyIiwic3ViIiwidXNlcl9pZCIsImdldE1vZGVsIiwiRU5WX0ZJTEUiLCJhZGRFbnRyeSIsIkVycm9yIiwibWVzc2FnZSIsInNjYWZmb2xkTG9jYWxVc2VyUHJvZmlsZSIsIlBBQ0tBR0VfSlNPTiIsImFkZERlcGVuZGVuY3kiLCJwcm9qZWN0IiwiZ2V0UHJvamVjdHMiLCJBUElfUEFDS0FHRV9KU09OIiwiTUFJTl9UUyIsImFkZEVudGl0eSIsImNsYXNzTmFtZSIsImltcG9ydFBhdGgiLCJhZGRSZXBvc2l0b3J5IiwiYWRkU2VydmljZSIsInNjb3BlIiwiYWRkSW1wb3J0Iiwic2V0VHlwZU9ybVNlZWQiLCJhZGRGaWxlIiwiZmlsZXMiLCJmaWxlUGF0aCIsImNvbnRlbnQiLCJjb250cm9sbGVyIiwiZ2V0TW9kZWxzIiwiYWRkQ29uc3RydWN0b3JQYXJhbSIsImdldE1ldGhvZCIsInNldEFzeW5jIiwic2V0Qm9keSIsInNjYWZmb2xkIiwicmVzb3VyY2UiLCJhZGREZWNvcmF0b3IiLCJhZGRDb3J0ZXhJbXBvcnQiLCJhZGRTaWRlRWZmZWN0SW1wb3J0IiwiYWRkQnVpbGRlckNhbGwiLCJpc3N1ZXJQbGFjZWhvbGRlciIsImF1ZFBsYWNlaG9sZGVyIiwiY29uZmlnU2VjdGlvbiIsIkNPTkZJR19ZQU1MIiwiYWRkU2VjdGlvbiIsImFkZE1vZGVsIiwiQXV0aEZlYXR1cmUiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLEdBQUcsRUFBRUMsSUFBSSxRQUFRLHlCQUF5QjtBQUVuRCxTQUFTQyxnQkFBZ0IsUUFBUSx3QkFBd0I7QUFNekQsU0FBU0MsZUFBZSxRQUFRLGlDQUFpQztBQUNqRSxTQUFTQyxvQkFBb0IsUUFBUSw0Q0FBNEM7QUFFakYsWUFBWUMsY0FBYyxpQkFBaUI7QUFXM0MsTUFBTUMsYUFBYTtBQUVuQixNQUFNQyxpQkFBaUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUJ4QixDQUFDO0FBRUQsTUFBTUMscUJBQXFCLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQWU1QixDQUFDO0FBRUQsTUFBTUMsa0JBQWtCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1RHpCLENBQUM7QUFFRCxNQUFNQyxxQkFBcUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF3RDVCLENBQUM7QUFFRCxlQUFlQyxXQUNkQyxTQUE0QixFQUM1QkMsVUFBZ0M7SUFFaEMsSUFBSUEsV0FBV0MsWUFBWSxLQUFLLFdBQVcsQ0FBQ0QsV0FBV0UsYUFBYSxFQUFFO1FBQ3JFLE9BQU9DLGdCQUFnQkosV0FBV0M7SUFDbkM7SUFDQSxJQUFJQSxXQUFXQyxZQUFZLElBQUksTUFBTSxPQUFPLENBQUM7SUFFN0MsTUFBTUcsVUFBVTtRQUFDO1lBQUVDLE9BQU87UUFBZ0I7UUFBRztZQUFFQSxPQUFPO1FBQWlCO0tBQUU7SUFDekUsTUFBTUMsV0FBVyxNQUFNbEIsS0FBSyx1QkFBdUJnQixTQUFTLENBQUNHLElBQU1BLEVB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
@@ -2,12 +2,14 @@ import { spawnSync } from "node:child_process";
2
2
  /**
3
3
  * Format/lint-fix all files in the scaffolded workspace with Biome.
4
4
  * Prefer a global `biome` binary (builder image); fall back to `npx`.
5
- */ export function formatScaffoldedFiles(targetDir) {
5
+ */ export function formatScaffoldedFiles(targetDir, paths = [
6
+ "."
7
+ ]) {
6
8
  process.stdout.write("\n Formatting scaffolded files with Biome...");
7
9
  let result = spawnSync("biome", [
8
10
  "check",
9
11
  "--write",
10
- "."
12
+ ...paths
11
13
  ], {
12
14
  cwd: targetDir,
13
15
  encoding: "utf8",
@@ -19,7 +21,7 @@ import { spawnSync } from "node:child_process";
19
21
  "@biomejs/biome",
20
22
  "check",
21
23
  "--write",
22
- "."
24
+ ...paths
23
25
  ], {
24
26
  cwd: targetDir,
25
27
  encoding: "utf8",
@@ -37,4 +39,4 @@ import { spawnSync } from "node:child_process";
37
39
  }
38
40
  }
39
41
 
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL2ZlYXR1cmVzL2Jpb21lLWZvcm1hdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5cbi8qKlxuICogRm9ybWF0L2xpbnQtZml4IGFsbCBmaWxlcyBpbiB0aGUgc2NhZmZvbGRlZCB3b3Jrc3BhY2Ugd2l0aCBCaW9tZS5cbiAqIFByZWZlciBhIGdsb2JhbCBgYmlvbWVgIGJpbmFyeSAoYnVpbGRlciBpbWFnZSk7IGZhbGwgYmFjayB0byBgbnB4YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFNjYWZmb2xkZWRGaWxlcyh0YXJnZXREaXI6IHN0cmluZyk6IHZvaWQge1xuXHRwcm9jZXNzLnN0ZG91dC53cml0ZShcIlxcbiAgRm9ybWF0dGluZyBzY2FmZm9sZGVkIGZpbGVzIHdpdGggQmlvbWUuLi5cIik7XG5cblx0bGV0IHJlc3VsdCA9IHNwYXduU3luYyhcImJpb21lXCIsIFtcImNoZWNrXCIsIFwiLS13cml0ZVwiLCBcIi5cIl0sIHtcblx0XHRjd2Q6IHRhcmdldERpcixcblx0XHRlbmNvZGluZzogXCJ1dGY4XCIsXG5cdFx0c3RkaW86IFwicGlwZVwiLFxuXHR9KTtcblxuXHRpZiAocmVzdWx0LmVycm9yICYmIChyZXN1bHQuZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSBcIkVOT0VOVFwiKSB7XG5cdFx0cmVzdWx0ID0gc3Bhd25TeW5jKFwibnB4XCIsIFtcIi0teWVzXCIsIFwiQGJpb21lanMvYmlvbWVcIiwgXCJjaGVja1wiLCBcIi0td3JpdGVcIiwgXCIuXCJdLCB7XG5cdFx0XHRjd2Q6IHRhcmdldERpcixcblx0XHRcdGVuY29kaW5nOiBcInV0ZjhcIixcblx0XHRcdHN0ZGlvOiBcInBpcGVcIixcblx0XHR9KTtcblx0fVxuXG5cdGlmIChyZXN1bHQuc3RhdHVzID09PSAwKSB7XG5cdFx0cHJvY2Vzcy5zdGRvdXQud3JpdGUoXCIgZG9uZS5cXG5cIik7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgZGV0YWlsID0gKHJlc3VsdC5zdGRlcnIgfHwgcmVzdWx0LnN0ZG91dCB8fCByZXN1bHQuZXJyb3I/Lm1lc3NhZ2UgfHwgXCJcIikudHJpbSgpO1xuXHRwcm9jZXNzLnN0ZG91dC53cml0ZShcIiBmYWlsZWQuXFxuXCIpO1xuXHRpZiAoZGV0YWlsKSB7XG5cdFx0Y29uc29sZS5lcnJvcihgICDinJcgQmlvbWU6ICR7ZGV0YWlsLnNsaWNlKDAsIDQwMCl9YCk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJzcGF3blN5bmMiLCJmb3JtYXRTY2FmZm9sZGVkRmlsZXMiLCJ0YXJnZXREaXIiLCJwcm9jZXNzIiwic3Rkb3V0Iiwid3JpdGUiLCJyZXN1bHQiLCJjd2QiLCJlbmNvZGluZyIsInN0ZGlvIiwiZXJyb3IiLCJjb2RlIiwic3RhdHVzIiwiZGV0YWlsIiwic3RkZXJyIiwibWVzc2FnZSIsInRyaW0iLCJjb25zb2xlIiwic2xpY2UiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFNBQVMsUUFBUSxxQkFBcUI7QUFFL0M7OztDQUdDLEdBQ0QsT0FBTyxTQUFTQyxzQkFBc0JDLFNBQWlCO0lBQ3REQyxRQUFRQyxNQUFNLENBQUNDLEtBQUssQ0FBQztJQUVyQixJQUFJQyxTQUFTTixVQUFVLFNBQVM7UUFBQztRQUFTO1FBQVc7S0FBSSxFQUFFO1FBQzFETyxLQUFLTDtRQUNMTSxVQUFVO1FBQ1ZDLE9BQU87SUFDUjtJQUVBLElBQUlILE9BQU9JLEtBQUssSUFBSSxBQUFDSixPQUFPSSxLQUFLLENBQTJCQyxJQUFJLEtBQUssVUFBVTtRQUM5RUwsU0FBU04sVUFBVSxPQUFPO1lBQUM7WUFBUztZQUFrQjtZQUFTO1lBQVc7U0FBSSxFQUFFO1lBQy9FTyxLQUFLTDtZQUNMTSxVQUFVO1lBQ1ZDLE9BQU87UUFDUjtJQUNEO0lBRUEsSUFBSUgsT0FBT00sTUFBTSxLQUFLLEdBQUc7UUFDeEJULFFBQVFDLE1BQU0sQ0FBQ0MsS0FBSyxDQUFDO1FBQ3JCO0lBQ0Q7SUFFQSxNQUFNUSxTQUFTLEFBQUNQLENBQUFBLE9BQU9RLE1BQU0sSUFBSVIsT0FBT0YsTUFBTSxJQUFJRSxPQUFPSSxLQUFLLEVBQUVLLFdBQVcsRUFBQyxFQUFHQyxJQUFJO0lBQ25GYixRQUFRQyxNQUFNLENBQUNDLEtBQUssQ0FBQztJQUNyQixJQUFJUSxRQUFRO1FBQ1hJLFFBQVFQLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRUcsT0FBT0ssS0FBSyxDQUFDLEdBQUcsTUFBTTtJQUNuRDtBQUNEIn0=
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL2ZlYXR1cmVzL2Jpb21lLWZvcm1hdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5cbi8qKlxuICogRm9ybWF0L2xpbnQtZml4IGFsbCBmaWxlcyBpbiB0aGUgc2NhZmZvbGRlZCB3b3Jrc3BhY2Ugd2l0aCBCaW9tZS5cbiAqIFByZWZlciBhIGdsb2JhbCBgYmlvbWVgIGJpbmFyeSAoYnVpbGRlciBpbWFnZSk7IGZhbGwgYmFjayB0byBgbnB4YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFNjYWZmb2xkZWRGaWxlcyh0YXJnZXREaXI6IHN0cmluZywgcGF0aHM6IHN0cmluZ1tdID0gW1wiLlwiXSk6IHZvaWQge1xuXHRwcm9jZXNzLnN0ZG91dC53cml0ZShcIlxcbiAgRm9ybWF0dGluZyBzY2FmZm9sZGVkIGZpbGVzIHdpdGggQmlvbWUuLi5cIik7XG5cblx0bGV0IHJlc3VsdCA9IHNwYXduU3luYyhcImJpb21lXCIsIFtcImNoZWNrXCIsIFwiLS13cml0ZVwiLCAuLi5wYXRoc10sIHtcblx0XHRjd2Q6IHRhcmdldERpcixcblx0XHRlbmNvZGluZzogXCJ1dGY4XCIsXG5cdFx0c3RkaW86IFwicGlwZVwiLFxuXHR9KTtcblxuXHRpZiAocmVzdWx0LmVycm9yICYmIChyZXN1bHQuZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSBcIkVOT0VOVFwiKSB7XG5cdFx0cmVzdWx0ID0gc3Bhd25TeW5jKFwibnB4XCIsIFtcIi0teWVzXCIsIFwiQGJpb21lanMvYmlvbWVcIiwgXCJjaGVja1wiLCBcIi0td3JpdGVcIiwgLi4ucGF0aHNdLCB7XG5cdFx0XHRjd2Q6IHRhcmdldERpcixcblx0XHRcdGVuY29kaW5nOiBcInV0ZjhcIixcblx0XHRcdHN0ZGlvOiBcInBpcGVcIixcblx0XHR9KTtcblx0fVxuXG5cdGlmIChyZXN1bHQuc3RhdHVzID09PSAwKSB7XG5cdFx0cHJvY2Vzcy5zdGRvdXQud3JpdGUoXCIgZG9uZS5cXG5cIik7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgZGV0YWlsID0gKHJlc3VsdC5zdGRlcnIgfHwgcmVzdWx0LnN0ZG91dCB8fCByZXN1bHQuZXJyb3I/Lm1lc3NhZ2UgfHwgXCJcIikudHJpbSgpO1xuXHRwcm9jZXNzLnN0ZG91dC53cml0ZShcIiBmYWlsZWQuXFxuXCIpO1xuXHRpZiAoZGV0YWlsKSB7XG5cdFx0Y29uc29sZS5lcnJvcihgICDinJcgQmlvbWU6ICR7ZGV0YWlsLnNsaWNlKDAsIDQwMCl9YCk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJzcGF3blN5bmMiLCJmb3JtYXRTY2FmZm9sZGVkRmlsZXMiLCJ0YXJnZXREaXIiLCJwYXRocyIsInByb2Nlc3MiLCJzdGRvdXQiLCJ3cml0ZSIsInJlc3VsdCIsImN3ZCIsImVuY29kaW5nIiwic3RkaW8iLCJlcnJvciIsImNvZGUiLCJzdGF0dXMiLCJkZXRhaWwiLCJzdGRlcnIiLCJtZXNzYWdlIiwidHJpbSIsImNvbnNvbGUiLCJzbGljZSJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsU0FBUyxRQUFRLHFCQUFxQjtBQUUvQzs7O0NBR0MsR0FDRCxPQUFPLFNBQVNDLHNCQUFzQkMsU0FBaUIsRUFBRUMsUUFBa0I7SUFBQztDQUFJO0lBQy9FQyxRQUFRQyxNQUFNLENBQUNDLEtBQUssQ0FBQztJQUVyQixJQUFJQyxTQUFTUCxVQUFVLFNBQVM7UUFBQztRQUFTO1dBQWNHO0tBQU0sRUFBRTtRQUMvREssS0FBS047UUFDTE8sVUFBVTtRQUNWQyxPQUFPO0lBQ1I7SUFFQSxJQUFJSCxPQUFPSSxLQUFLLElBQUksQUFBQ0osT0FBT0ksS0FBSyxDQUEyQkMsSUFBSSxLQUFLLFVBQVU7UUFDOUVMLFNBQVNQLFVBQVUsT0FBTztZQUFDO1lBQVM7WUFBa0I7WUFBUztlQUFjRztTQUFNLEVBQUU7WUFDcEZLLEtBQUtOO1lBQ0xPLFVBQVU7WUFDVkMsT0FBTztRQUNSO0lBQ0Q7SUFFQSxJQUFJSCxPQUFPTSxNQUFNLEtBQUssR0FBRztRQUN4QlQsUUFBUUMsTUFBTSxDQUFDQyxLQUFLLENBQUM7UUFDckI7SUFDRDtJQUVBLE1BQU1RLFNBQVMsQUFBQ1AsQ0FBQUEsT0FBT1EsTUFBTSxJQUFJUixPQUFPRixNQUFNLElBQUlFLE9BQU9JLEtBQUssRUFBRUssV0FBVyxFQUFDLEVBQUdDLElBQUk7SUFDbkZiLFFBQVFDLE1BQU0sQ0FBQ0MsS0FBSyxDQUFDO0lBQ3JCLElBQUlRLFFBQVE7UUFDWEksUUFBUVAsS0FBSyxDQUFDLENBQUMsV0FBVyxFQUFFRyxPQUFPSyxLQUFLLENBQUMsR0FBRyxNQUFNO0lBQ25EO0FBQ0QifQ==