obsidian-dev-utils 2.27.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/lib/@types/compare-versions.d.ts +2 -2
  3. package/dist/lib/@types.cjs +11 -2
  4. package/dist/lib/Async.cjs +18 -7
  5. package/dist/lib/Async.d.ts +2 -2
  6. package/dist/lib/Blob.cjs +21 -6
  7. package/dist/lib/DocumentFragment.cjs +11 -2
  8. package/dist/lib/Error.cjs +20 -6
  9. package/dist/lib/Error.d.ts +7 -0
  10. package/dist/lib/Object.cjs +38 -5
  11. package/dist/lib/Object.d.ts +21 -0
  12. package/dist/lib/Path.cjs +14 -6
  13. package/dist/lib/Path.d.ts +1 -1
  14. package/dist/lib/RegExp.cjs +11 -2
  15. package/dist/lib/String.cjs +14 -4
  16. package/dist/lib/String.d.ts +4 -1
  17. package/dist/lib/ValueProvider.cjs +11 -2
  18. package/dist/lib/ValueProvider.d.ts +1 -1
  19. package/dist/lib/_dependencies.cjs +7734 -1266
  20. package/dist/lib/_dependencies.d.ts +4 -6
  21. package/dist/lib/index.cjs +14 -23
  22. package/dist/lib/index.d.ts +13 -19
  23. package/dist/lib/obsidian/App.cjs +13 -3
  24. package/dist/lib/obsidian/App.d.ts +1 -1
  25. package/dist/lib/obsidian/AttachmentPath.cjs +13 -4
  26. package/dist/lib/obsidian/AttachmentPath.d.ts +2 -2
  27. package/dist/lib/obsidian/Backlink.cjs +16 -6
  28. package/dist/lib/obsidian/Backlink.d.ts +7 -7
  29. package/dist/lib/obsidian/Callout.cjs +14 -4
  30. package/dist/lib/obsidian/Callout.d.ts +4 -4
  31. package/dist/lib/obsidian/Dataview.cjs +20 -9
  32. package/dist/lib/obsidian/Dataview.d.ts +22 -16
  33. package/dist/lib/obsidian/DataviewLink.cjs +12 -4
  34. package/dist/lib/obsidian/DataviewLink.d.ts +2 -2
  35. package/dist/lib/obsidian/FrontMatter.cjs +17 -7
  36. package/dist/lib/obsidian/FrontMatter.d.ts +31 -7
  37. package/dist/lib/obsidian/Link.cjs +19 -10
  38. package/dist/lib/obsidian/Link.d.ts +25 -13
  39. package/dist/lib/obsidian/MarkdownCodeBlockProcessor.cjs +14 -4
  40. package/dist/lib/obsidian/MarkdownCodeBlockProcessor.d.ts +1 -1
  41. package/dist/lib/obsidian/MetadataCache.cjs +16 -5
  42. package/dist/lib/obsidian/MetadataCache.d.ts +5 -5
  43. package/dist/lib/obsidian/Modal/Alert.cjs +14 -3
  44. package/dist/lib/obsidian/Modal/Alert.d.ts +1 -1
  45. package/dist/lib/obsidian/Modal/Prompt.cjs +14 -3
  46. package/dist/lib/obsidian/Modal/Prompt.d.ts +3 -3
  47. package/dist/lib/obsidian/Modal/SelectItem.cjs +11 -2
  48. package/dist/lib/obsidian/Modal/SelectItem.d.ts +4 -4
  49. package/dist/lib/obsidian/Modal/index.cjs +11 -2
  50. package/dist/lib/obsidian/Modal/index.d.ts +3 -3
  51. package/dist/lib/obsidian/ObsidianSettings.cjs +11 -2
  52. package/dist/lib/obsidian/ObsidianSettings.d.ts +1 -1
  53. package/dist/lib/obsidian/Plugin/ObsidianPluginRepoPaths.cjs +11 -2
  54. package/dist/lib/obsidian/Plugin/Plugin.cjs +11 -2
  55. package/dist/lib/obsidian/Plugin/Plugin.d.ts +1 -1
  56. package/dist/lib/obsidian/Plugin/PluginBase.cjs +37 -23
  57. package/dist/lib/obsidian/Plugin/PluginBase.d.ts +8 -9
  58. package/dist/lib/obsidian/Plugin/PluginSettings.cjs +11 -2
  59. package/dist/lib/obsidian/Plugin/PluginSettingsTabBase.cjs +11 -2
  60. package/dist/lib/obsidian/Plugin/PluginSettingsTabBase.d.ts +2 -2
  61. package/dist/lib/obsidian/Plugin/UIComponent.cjs +11 -2
  62. package/dist/lib/obsidian/Plugin/UIComponent.d.ts +2 -2
  63. package/dist/lib/obsidian/Plugin/index.cjs +11 -2
  64. package/dist/lib/obsidian/Plugin/index.d.ts +6 -6
  65. package/dist/lib/obsidian/ResourceUrl.cjs +11 -2
  66. package/dist/lib/obsidian/ResourceUrl.d.ts +1 -1
  67. package/dist/lib/obsidian/TAbstractFile.cjs +12 -3
  68. package/dist/lib/obsidian/TAbstractFile.d.ts +1 -1
  69. package/dist/lib/obsidian/TFile.cjs +11 -2
  70. package/dist/lib/obsidian/TFile.d.ts +1 -1
  71. package/dist/lib/obsidian/TFolder.cjs +11 -2
  72. package/dist/lib/obsidian/TFolder.d.ts +2 -1
  73. package/dist/lib/obsidian/Vault.cjs +23 -15
  74. package/dist/lib/obsidian/Vault.d.ts +21 -7
  75. package/dist/lib/obsidian/index.cjs +11 -2
  76. package/dist/lib/obsidian/index.d.ts +18 -18
  77. package/dist/lib/scripts/CliUtils.cjs +170 -0
  78. package/dist/lib/{cli.d.ts → scripts/CliUtils.d.ts} +1 -1
  79. package/dist/lib/scripts/CodeGenerator.cjs +56 -0
  80. package/dist/lib/{bin → scripts}/ESLint/@types/@guardian__eslint-plugin-tsdoc-required.d.ts +3 -2
  81. package/dist/lib/{bin → scripts}/ESLint/@types/eslint-plugin-modules-newlines.d.ts +3 -2
  82. package/dist/lib/{bin → scripts}/ESLint/@types/eslint-plugin-verify-tsdoc.d.ts +3 -2
  83. package/dist/lib/scripts/ESLint/ESLint.cjs +92 -0
  84. package/dist/lib/{bin → scripts}/ESLint/ESLint.d.ts +2 -2
  85. package/dist/lib/scripts/ESLint/eslint.config.cjs +170 -0
  86. package/dist/lib/scripts/ESLint/eslint.config.d.ts +16 -0
  87. package/dist/lib/scripts/ESLint/index.cjs +62 -0
  88. package/dist/lib/scripts/ESLint/index.d.ts +2 -0
  89. package/dist/lib/scripts/Fs.cjs +98 -0
  90. package/dist/lib/{Fs.d.ts → scripts/Fs.d.ts} +3 -3
  91. package/dist/lib/scripts/JSON.cjs +71 -0
  92. package/dist/lib/{JSON.d.ts → scripts/JSON.d.ts} +3 -24
  93. package/dist/lib/scripts/NodeModules.cjs +87 -0
  94. package/dist/lib/scripts/NodeModules.d.ts +9 -0
  95. package/dist/lib/scripts/Npm.cjs +97 -0
  96. package/dist/lib/{Npm.d.ts → scripts/Npm.d.ts} +3 -3
  97. package/dist/lib/scripts/ObsidianDevUtilsRepoPaths.cjs +76 -0
  98. package/dist/lib/{bin → scripts}/ObsidianDevUtilsRepoPaths.d.ts +4 -0
  99. package/dist/lib/scripts/Root.cjs +142 -0
  100. package/dist/lib/{Root.d.ts → scripts/Root.d.ts} +4 -4
  101. package/dist/lib/scripts/build.cjs +67 -0
  102. package/dist/lib/scripts/cli.cjs +80 -0
  103. package/dist/lib/scripts/esbuild/Dependency.cjs +135 -0
  104. package/dist/lib/scripts/esbuild/ObsidianPluginBuilder.cjs +167 -0
  105. package/dist/lib/{bin → scripts}/esbuild/ObsidianPluginBuilder.d.ts +5 -5
  106. package/dist/lib/scripts/esbuild/copyToObsidianPluginsFolderPlugin.cjs +67 -0
  107. package/dist/lib/{bin → scripts}/esbuild/copyToObsidianPluginsFolderPlugin.d.ts +1 -1
  108. package/dist/lib/scripts/esbuild/fixSourceMapsPlugin.cjs +83 -0
  109. package/dist/lib/{bin → scripts}/esbuild/fixSourceMapsPlugin.d.ts +1 -1
  110. package/dist/lib/{bin → scripts}/esbuild/index.cjs +11 -2
  111. package/dist/lib/scripts/esbuild/index.d.ts +7 -0
  112. package/dist/lib/scripts/esbuild/lintPlugin.cjs +64 -0
  113. package/dist/lib/{bin → scripts}/esbuild/lintPlugin.d.ts +1 -1
  114. package/dist/lib/scripts/esbuild/preprocessPlugin.cjs +95 -0
  115. package/dist/lib/{bin → scripts}/esbuild/preprocessPlugin.d.ts +1 -1
  116. package/dist/lib/scripts/esbuild/renameToCjsPlugin.cjs +85 -0
  117. package/dist/lib/{bin → scripts}/esbuild/renameToCjsPlugin.d.ts +1 -1
  118. package/dist/lib/scripts/index.cjs +98 -0
  119. package/dist/lib/scripts/index.d.ts +14 -0
  120. package/dist/lib/scripts/spellcheck.cjs +67 -0
  121. package/dist/lib/{bin → scripts}/spellcheck.d.ts +1 -1
  122. package/dist/lib/scripts/version.cjs +349 -0
  123. package/dist/lib/{bin → scripts}/version.d.ts +7 -8
  124. package/dist/lib/url.cjs +11 -2
  125. package/package.json +136 -131
  126. package/dist/lib/CodeGenerator.cjs +0 -47
  127. package/dist/lib/Fs.cjs +0 -89
  128. package/dist/lib/JSON.cjs +0 -85
  129. package/dist/lib/Npm.cjs +0 -88
  130. package/dist/lib/Root.cjs +0 -145
  131. package/dist/lib/bin/ESLint/@types/@stylistic__eslint-plugin.d.ts +0 -10
  132. package/dist/lib/bin/ESLint/@types/@typescript-eslint__eslint-plugin.d.ts +0 -21
  133. package/dist/lib/bin/ESLint/@types/@typescript-eslint__parser.d.ts +0 -10
  134. package/dist/lib/bin/ESLint/@types/eslint-plugin-deprecation.d.ts +0 -11
  135. package/dist/lib/bin/ESLint/@types/eslint-plugin-import.d.ts +0 -10
  136. package/dist/lib/bin/ESLint/@types/globals.d.ts +0 -16
  137. package/dist/lib/bin/ESLint/ESLint.cjs +0 -84
  138. package/dist/lib/bin/ESLint/eslint.config.cjs +0 -114
  139. package/dist/lib/bin/ESLint/eslint.config.d.ts +0 -20
  140. package/dist/lib/bin/ESLint/index.cjs +0 -53
  141. package/dist/lib/bin/ESLint/index.d.ts +0 -2
  142. package/dist/lib/bin/ObsidianDevUtilsRepoPaths.cjs +0 -66
  143. package/dist/lib/bin/build.cjs +0 -58
  144. package/dist/lib/bin/cli.cjs +0 -81
  145. package/dist/lib/bin/esbuild/Dependency.cjs +0 -125
  146. package/dist/lib/bin/esbuild/ObsidianPluginBuilder.cjs +0 -160
  147. package/dist/lib/bin/esbuild/copyToObsidianPluginsFolderPlugin.cjs +0 -59
  148. package/dist/lib/bin/esbuild/fixSourceMapsPlugin.cjs +0 -74
  149. package/dist/lib/bin/esbuild/index.d.ts +0 -7
  150. package/dist/lib/bin/esbuild/lintPlugin.cjs +0 -55
  151. package/dist/lib/bin/esbuild/preprocessPlugin.cjs +0 -89
  152. package/dist/lib/bin/esbuild/renameToCjsPlugin.cjs +0 -75
  153. package/dist/lib/bin/index.cjs +0 -68
  154. package/dist/lib/bin/index.d.ts +0 -7
  155. package/dist/lib/bin/spellcheck.cjs +0 -58
  156. package/dist/lib/bin/version.cjs +0 -352
  157. package/dist/lib/cli.cjs +0 -170
  158. /package/dist/lib/{CodeGenerator.d.ts → scripts/CodeGenerator.d.ts} +0 -0
  159. /package/dist/lib/{bin → scripts}/build.d.ts +0 -0
  160. /package/dist/lib/{bin → scripts}/cli.d.ts +0 -0
  161. /package/dist/lib/{bin → scripts}/esbuild/Dependency.d.ts +0 -0
@@ -1,68 +0,0 @@
1
- /*
2
- THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
- if you want to view the source, please visit the github repository of this plugin
4
- */
5
-
6
- "use strict";
7
- var __create = Object.create;
8
- var __defProp = Object.defineProperty;
9
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
10
- var __getOwnPropNames = Object.getOwnPropertyNames;
11
- var __getProtoOf = Object.getPrototypeOf;
12
- var __hasOwnProp = Object.prototype.hasOwnProperty;
13
- var __export = (target, all) => {
14
- for (var name in all)
15
- __defProp(target, name, { get: all[name], enumerable: true });
16
- };
17
- var __copyProps = (to, from, except, desc) => {
18
- if (from && typeof from === "object" || typeof from === "function") {
19
- for (let key of __getOwnPropNames(from))
20
- if (!__hasOwnProp.call(to, key) && key !== except)
21
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
22
- }
23
- return to;
24
- };
25
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
26
- // If the importer is in node compatibility mode or this is not an ESM
27
- // file that has been converted to a CommonJS file using a Babel-
28
- // compatible transform (i.e. "__esModule" has not been set), then set
29
- // "default" to the CommonJS "module.exports" for node compatibility.
30
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
31
- mod
32
- ));
33
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
34
- var bin_exports = {};
35
- __export(bin_exports, {
36
- ESLint: () => ESLint,
37
- ObsidianDevUtilsRepoPaths: () => ObsidianDevUtilsRepoPaths,
38
- build: () => build,
39
- cli: () => cli,
40
- esbuild: () => esbuild,
41
- spellcheck: () => spellcheck,
42
- version: () => version
43
- });
44
- module.exports = __toCommonJS(bin_exports);
45
- var build = __toESM(require("./build.cjs"), 1);
46
- var cli = __toESM(require("./cli.cjs"), 1);
47
- var esbuild = __toESM(require("./esbuild/index.cjs"), 1);
48
- var ESLint = __toESM(require("./ESLint/index.cjs"), 1);
49
- var ObsidianDevUtilsRepoPaths = __toESM(require("./ObsidianDevUtilsRepoPaths.cjs"), 1);
50
- var spellcheck = __toESM(require("./spellcheck.cjs"), 1);
51
- var version = __toESM(require("./version.cjs"), 1);
52
- var __import_meta_url = globalThis["import.meta.url"] ?? (() => require("node:url").pathToFileURL(__filename))();
53
- var __process = globalThis["process"] ?? {
54
- "cwd": () => "/",
55
- "env": {},
56
- "platform": "android"
57
- };
58
- // Annotate the CommonJS export names for ESM import in node:
59
- 0 && (module.exports = {
60
- ESLint,
61
- ObsidianDevUtilsRepoPaths,
62
- build,
63
- cli,
64
- esbuild,
65
- spellcheck,
66
- version
67
- });
68
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2Jpbi9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsidmFyIF9faW1wb3J0X21ldGFfdXJsID0gZ2xvYmFsVGhpc1tcImltcG9ydC5tZXRhLnVybFwiXSA/PyAoKCk9PnJlcXVpcmUoXCJub2RlOnVybFwiKS5wYXRoVG9GaWxlVVJMKF9fZmlsZW5hbWUpKSgpO1xudmFyIF9fcHJvY2VzcyA9IGdsb2JhbFRoaXNbXCJwcm9jZXNzXCJdID8/IHtcbiAgXCJjd2RcIjogKCk9PlwiL1wiLFxuICBcImVudlwiOiB7fSxcbiAgXCJwbGF0Zm9ybVwiOiBcImFuZHJvaWRcIlxufTtcbi8qIFRISVMgSVMgQSBHRU5FUkFURUQvQlVORExFRCBGSUxFIEJZIEJVSUxEIFNDUklQVCAqL1xuXG5leHBvcnQgKiBhcyBidWlsZCBmcm9tIFwiLi9idWlsZC50c1wiO1xuZXhwb3J0ICogYXMgY2xpIGZyb20gXCIuL2NsaS50c1wiO1xuZXhwb3J0ICogYXMgZXNidWlsZCBmcm9tIFwiLi9lc2J1aWxkL2luZGV4LnRzXCI7XG5leHBvcnQgKiBhcyBFU0xpbnQgZnJvbSBcIi4vRVNMaW50L2luZGV4LnRzXCI7XG5leHBvcnQgKiBhcyBPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzIGZyb20gXCIuL09ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMudHNcIjtcbmV4cG9ydCAqIGFzIHNwZWxsY2hlY2sgZnJvbSBcIi4vc3BlbGxjaGVjay50c1wiO1xuZXhwb3J0ICogYXMgdmVyc2lvbiBmcm9tIFwiLi92ZXJzaW9uLnRzXCI7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBUUEsWUFBdUI7QUFDdkIsVUFBcUI7QUFDckIsY0FBeUI7QUFDekIsYUFBd0I7QUFDeEIsZ0NBQTJDO0FBQzNDLGlCQUE0QjtBQUM1QixjQUF5QjtBQWR6QixJQUFJLG9CQUFvQixXQUFXLGlCQUFpQixNQUFNLE1BQUksUUFBUSxVQUFVLEVBQUUsY0FBYyxVQUFVLEdBQUc7QUFDN0csSUFBSSxZQUFZLFdBQVcsU0FBUyxLQUFLO0FBQUEsRUFDdkMsT0FBTyxNQUFJO0FBQUEsRUFDWCxPQUFPLENBQUM7QUFBQSxFQUNSLFlBQVk7QUFDZDsiLAogICJuYW1lcyI6IFtdCn0K
@@ -1,7 +0,0 @@
1
- export * as build from "./build.ts";
2
- export * as cli from "./cli.ts";
3
- export * as esbuild from "./esbuild/index.ts";
4
- export * as ESLint from "./ESLint/index.ts";
5
- export * as ObsidianDevUtilsRepoPaths from "./ObsidianDevUtilsRepoPaths.ts";
6
- export * as spellcheck from "./spellcheck.ts";
7
- export * as version from "./version.ts";
@@ -1,58 +0,0 @@
1
- /*
2
- THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
- if you want to view the source, please visit the github repository of this plugin
4
- */
5
-
6
- "use strict";
7
- var __defProp = Object.defineProperty;
8
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
9
- var __getOwnPropNames = Object.getOwnPropertyNames;
10
- var __hasOwnProp = Object.prototype.hasOwnProperty;
11
- var __export = (target, all) => {
12
- for (var name in all)
13
- __defProp(target, name, { get: all[name], enumerable: true });
14
- };
15
- var __copyProps = (to, from, except, desc) => {
16
- if (from && typeof from === "object" || typeof from === "function") {
17
- for (let key of __getOwnPropNames(from))
18
- if (!__hasOwnProp.call(to, key) && key !== except)
19
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
20
- }
21
- return to;
22
- };
23
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
24
- var spellcheck_exports = {};
25
- __export(spellcheck_exports, {
26
- spellcheck: () => spellcheck
27
- });
28
- module.exports = __toCommonJS(spellcheck_exports);
29
- var import_cspell = require("./../_dependencies.cjs").cspell.default ?? require("./../_dependencies.cjs").cspell;
30
- var import_Root = require("../Root.cjs");
31
- var import_node_url = require("node:url");
32
- var import_cli = require("../cli.cjs");
33
- var __import_meta_url = globalThis["import.meta.url"] ?? (() => require("node:url").pathToFileURL(__filename))();
34
- var __process = globalThis["process"] ?? {
35
- "cwd": () => "/",
36
- "env": {},
37
- "platform": "android"
38
- };
39
- async function spellcheck() {
40
- let isSuccess = true;
41
- await (0, import_cspell.lint)(["."], {}, {
42
- issue: (issue) => {
43
- if (!issue.uri) {
44
- return;
45
- }
46
- const path = (0, import_node_url.fileURLToPath)(issue.uri);
47
- const relativePath = (0, import_Root.toRelativeFromRoot)(path);
48
- console.log(`${relativePath}:${issue.row}:${issue.col} - ${issue.text}`);
49
- isSuccess = false;
50
- }
51
- });
52
- return import_cli.CliTaskResult.Success(isSuccess);
53
- }
54
- // Annotate the CommonJS export names for ESM import in node:
55
- 0 && (module.exports = {
56
- spellcheck
57
- });
58
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2Jpbi9zcGVsbGNoZWNrLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJ2YXIgX19pbXBvcnRfbWV0YV91cmwgPSBnbG9iYWxUaGlzW1wiaW1wb3J0Lm1ldGEudXJsXCJdID8/ICgoKT0+cmVxdWlyZShcIm5vZGU6dXJsXCIpLnBhdGhUb0ZpbGVVUkwoX19maWxlbmFtZSkpKCk7XG52YXIgX19wcm9jZXNzID0gZ2xvYmFsVGhpc1tcInByb2Nlc3NcIl0gPz8ge1xuICBcImN3ZFwiOiAoKT0+XCIvXCIsXG4gIFwiZW52XCI6IHt9LFxuICBcInBsYXRmb3JtXCI6IFwiYW5kcm9pZFwiXG59O1xuLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb24gc3BlbGxjaGVja1xuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBmdW5jdGlvbiBmb3IgcnVubmluZyBhIHNwZWxsY2hlY2sgb24gdGhlIGNvZGViYXNlIHVzaW5nIHRoZSBgY3NwZWxsYCBsaWJyYXJ5LlxuICogSXQgcmVwb3J0cyBhbnkgc3BlbGxpbmcgaXNzdWVzIGZvdW5kIGluIHRoZSBjb2RlIGFuZCByZXR1cm5zIGEgYFRhc2tSZXN1bHRgIGluZGljYXRpbmcgd2hldGhlciB0aGUgc3BlbGxjaGVjayB3YXMgc3VjY2Vzc2Z1bC5cbiAqL1xuXG5pbXBvcnQgeyBsaW50IH0gZnJvbSBcImNzcGVsbFwiO1xuaW1wb3J0IHsgdG9SZWxhdGl2ZUZyb21Sb290IH0gZnJvbSBcIi4uL1Jvb3QudHNcIjtcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tIFwibm9kZTp1cmxcIjtcbmltcG9ydCB7IENsaVRhc2tSZXN1bHQgfSBmcm9tIFwiLi4vY2xpLnRzXCI7XG5cbi8qKlxuICogUnVucyBhIHNwZWxsY2hlY2sgb24gdGhlIGVudGlyZSBjb2RlYmFzZSB1c2luZyBgY3NwZWxsYC5cbiAqXG4gKiBUaGUgZnVuY3Rpb24gY2hlY2tzIGFsbCBmaWxlcyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgYW5kIGl0cyBzdWJkaXJlY3RvcmllcyBmb3Igc3BlbGxpbmcgaXNzdWVzLlxuICogSWYgaXNzdWVzIGFyZSBmb3VuZCwgdGhleSBhcmUgbG9nZ2VkIHRvIHRoZSBjb25zb2xlIHdpdGggdGhlaXIgZmlsZSBwYXRoLCBsaW5lLCBhbmQgY29sdW1uIG51bWJlci5cbiAqXG4gKiBAcmV0dXJucyBBIGBQcm9taXNlYCB0aGF0IHJlc29sdmVzIHRvIGEgYFRhc2tSZXN1bHRgLCBpbmRpY2F0aW5nIHRoZSBzdWNjZXNzIG9yIGZhaWx1cmUgb2YgdGhlIHNwZWxsY2hlY2suXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzcGVsbGNoZWNrKCk6IFByb21pc2U8Q2xpVGFza1Jlc3VsdD4ge1xuICBsZXQgaXNTdWNjZXNzID0gdHJ1ZTtcblxuICBhd2FpdCBsaW50KFtcIi5cIl0sIHt9LCB7XG4gICAgaXNzdWU6IChpc3N1ZSkgPT4ge1xuICAgICAgaWYgKCFpc3N1ZS51cmkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXRoID0gZmlsZVVSTFRvUGF0aChpc3N1ZS51cmkpO1xuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gdG9SZWxhdGl2ZUZyb21Sb290KHBhdGgpO1xuICAgICAgY29uc29sZS5sb2coYCR7cmVsYXRpdmVQYXRofToke2lzc3VlLnJvd306JHtpc3N1ZS5jb2x9IC0gJHtpc3N1ZS50ZXh0fWApO1xuICAgICAgaXNTdWNjZXNzID0gZmFsc2U7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gQ2xpVGFza1Jlc3VsdC5TdWNjZXNzKGlzU3VjY2Vzcyk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFZQSxvQkFBcUI7QUFDckIsa0JBQW1DO0FBQ25DLHNCQUE4QjtBQUM5QixpQkFBOEI7QUFmOUIsSUFBSSxvQkFBb0IsV0FBVyxpQkFBaUIsTUFBTSxNQUFJLFFBQVEsVUFBVSxFQUFFLGNBQWMsVUFBVSxHQUFHO0FBQzdHLElBQUksWUFBWSxXQUFXLFNBQVMsS0FBSztBQUFBLEVBQ3ZDLE9BQU8sTUFBSTtBQUFBLEVBQ1gsT0FBTyxDQUFDO0FBQUEsRUFDUixZQUFZO0FBQ2Q7QUFvQkEsZUFBc0IsYUFBcUM7QUFDekQsTUFBSSxZQUFZO0FBRWhCLFlBQU0sb0JBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHO0FBQUEsSUFDcEIsT0FBTyxDQUFDLFVBQVU7QUFDaEIsVUFBSSxDQUFDLE1BQU0sS0FBSztBQUNkO0FBQUEsTUFDRjtBQUVBLFlBQU0sV0FBTywrQkFBYyxNQUFNLEdBQUc7QUFDcEMsWUFBTSxtQkFBZSxnQ0FBbUIsSUFBSTtBQUM1QyxjQUFRLElBQUksR0FBRyxZQUFZLElBQUksTUFBTSxHQUFHLElBQUksTUFBTSxHQUFHLE1BQU0sTUFBTSxJQUFJLEVBQUU7QUFDdkUsa0JBQVk7QUFBQSxJQUNkO0FBQUEsRUFDRixDQUFDO0FBRUQsU0FBTyx5QkFBYyxRQUFRLFNBQVM7QUFDeEM7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -1,352 +0,0 @@
1
- /*
2
- THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
- if you want to view the source, please visit the github repository of this plugin
4
- */
5
-
6
- "use strict";
7
- var __create = Object.create;
8
- var __defProp = Object.defineProperty;
9
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
10
- var __getOwnPropNames = Object.getOwnPropertyNames;
11
- var __getProtoOf = Object.getPrototypeOf;
12
- var __hasOwnProp = Object.prototype.hasOwnProperty;
13
- var __export = (target, all) => {
14
- for (var name in all)
15
- __defProp(target, name, { get: all[name], enumerable: true });
16
- };
17
- var __copyProps = (to, from, except, desc) => {
18
- if (from && typeof from === "object" || typeof from === "function") {
19
- for (let key of __getOwnPropNames(from))
20
- if (!__hasOwnProp.call(to, key) && key !== except)
21
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
22
- }
23
- return to;
24
- };
25
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
26
- // If the importer is in node compatibility mode or this is not an ESM
27
- // file that has been converted to a CommonJS file using a Babel-
28
- // compatible transform (i.e. "__esModule" has not been set), then set
29
- // "default" to the CommonJS "module.exports" for node compatibility.
30
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
31
- mod
32
- ));
33
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
34
- var version_exports = {};
35
- __export(version_exports, {
36
- VersionUpdateType: () => VersionUpdateType,
37
- addGitTag: () => addGitTag,
38
- addUpdatedFilesToGit: () => addUpdatedFilesToGit,
39
- checkGitHubCliInstalled: () => checkGitHubCliInstalled,
40
- checkGitInstalled: () => checkGitInstalled,
41
- checkGitRepoClean: () => checkGitRepoClean,
42
- copyUpdatedManifest: () => copyUpdatedManifest,
43
- getNewVersion: () => getNewVersion,
44
- getReleaseNotes: () => getReleaseNotes,
45
- getVersionUpdateType: () => getVersionUpdateType,
46
- gitPush: () => gitPush,
47
- publishGitHubRelease: () => publishGitHubRelease,
48
- updateChangelog: () => updateChangelog,
49
- updateVersion: () => updateVersion,
50
- updateVersionInFiles: () => updateVersionInFiles,
51
- validate: () => validate
52
- });
53
- module.exports = __toCommonJS(version_exports);
54
- var import_cli = require("../cli.cjs");
55
- var import_Root = require("../Root.cjs");
56
- var import_spellcheck = require("./spellcheck.cjs");
57
- var import_ESLint = require("./ESLint/ESLint.cjs");
58
- var import_Npm = require("../Npm.cjs");
59
- var import_JSON = require("../JSON.cjs");
60
- var import_node_fs = require("node:fs");
61
- var import_promises = require("node:fs/promises");
62
- var import_promises2 = require("node:readline/promises");
63
- var import_Fs = require("../Fs.cjs");
64
- var import_Path = require("../Path.cjs");
65
- var import_ObsidianPluginRepoPaths = require("../obsidian/Plugin/ObsidianPluginRepoPaths.cjs");
66
- var import_ObsidianDevUtilsRepoPaths = require("./ObsidianDevUtilsRepoPaths.cjs");
67
- var import_adm_zip = __toESM(require("adm-zip"), 1);
68
- var __import_meta_url = globalThis["import.meta.url"] ?? (() => require("node:url").pathToFileURL(__filename))();
69
- var __process = globalThis["process"] ?? {
70
- "cwd": () => "/",
71
- "env": {},
72
- "platform": "android"
73
- };
74
- var VersionUpdateType = /* @__PURE__ */ ((VersionUpdateType2) => {
75
- VersionUpdateType2["Major"] = "major";
76
- VersionUpdateType2["Minor"] = "minor";
77
- VersionUpdateType2["Patch"] = "patch";
78
- VersionUpdateType2["Beta"] = "beta";
79
- VersionUpdateType2["Manual"] = "manual";
80
- VersionUpdateType2["Invalid"] = "invalid";
81
- return VersionUpdateType2;
82
- })(VersionUpdateType || {});
83
- async function updateVersion(versionUpdateType) {
84
- if (!versionUpdateType) {
85
- const npmOldVersion = __process.env["npm_old_version"];
86
- const npmNewVersion = __process.env["npm_new_version"];
87
- if (npmOldVersion && npmNewVersion) {
88
- await updateVersionInFiles(npmOldVersion, false);
89
- return updateVersion(npmNewVersion);
90
- }
91
- }
92
- const isObsidianPlugin = (0, import_node_fs.existsSync)((0, import_Root.resolvePathFromRoot)(import_ObsidianPluginRepoPaths.ObsidianPluginRepoPaths.ManifestJson));
93
- return await import_cli.CliTaskResult.chain([
94
- async () => {
95
- validate(versionUpdateType);
96
- await checkGitInstalled();
97
- await checkGitRepoClean();
98
- await checkGitHubCliInstalled();
99
- },
100
- () => (0, import_spellcheck.spellcheck)(),
101
- async () => {
102
- await (0, import_Root.execFromRoot)("npm run build");
103
- },
104
- () => (0, import_ESLint.lint)(),
105
- async () => {
106
- const newVersion = await getNewVersion(versionUpdateType);
107
- await updateVersionInFiles(newVersion, isObsidianPlugin);
108
- await updateChangelog(newVersion);
109
- await addUpdatedFilesToGit(newVersion);
110
- await addGitTag(newVersion);
111
- await gitPush();
112
- if (isObsidianPlugin) {
113
- await copyUpdatedManifest();
114
- }
115
- await publishGitHubRelease(newVersion, isObsidianPlugin);
116
- }
117
- ]);
118
- }
119
- function validate(versionUpdateType) {
120
- if (getVersionUpdateType(versionUpdateType) === "invalid" /* Invalid */) {
121
- throw new Error("Invalid version update type. Please use 'major', 'minor', 'patch', or 'x.y.z[-suffix]' format.");
122
- }
123
- }
124
- async function checkGitInstalled() {
125
- try {
126
- await (0, import_Root.execFromRoot)("git --version", { quiet: true });
127
- } catch {
128
- throw new Error("Git is not installed. Please install it from https://git-scm.com/");
129
- }
130
- }
131
- async function checkGitHubCliInstalled() {
132
- try {
133
- await (0, import_Root.execFromRoot)("gh --version", { quiet: true });
134
- } catch {
135
- throw new Error("GitHub CLI is not installed. Please install it from https://cli.github.com/");
136
- }
137
- }
138
- async function checkGitRepoClean() {
139
- try {
140
- const stdout = await (0, import_Root.execFromRoot)("git status --porcelain --untracked-files=all", { quiet: true });
141
- if (stdout) {
142
- throw new Error();
143
- }
144
- } catch {
145
- throw new Error("Git repository is not clean. Please commit or stash your changes before releasing a new version.");
146
- }
147
- }
148
- function getVersionUpdateType(versionUpdateType) {
149
- const versionUpdateTypeEnum = versionUpdateType;
150
- switch (versionUpdateTypeEnum) {
151
- case "major" /* Major */:
152
- case "minor" /* Minor */:
153
- case "patch" /* Patch */:
154
- case "beta" /* Beta */:
155
- return versionUpdateTypeEnum;
156
- default:
157
- if (/^\d+\.\d+\.\d+(-[\w\d.-]+)?$/.test(versionUpdateType)) {
158
- return "manual" /* Manual */;
159
- }
160
- return "invalid" /* Invalid */;
161
- }
162
- }
163
- async function updateVersionInFiles(newVersion, isObsidianPlugin) {
164
- await (0, import_Npm.editNpmPackage)((npmPackage) => {
165
- npmPackage.version = newVersion;
166
- });
167
- await (0, import_Npm.editNpmPackageLock)((npmPackageLock) => {
168
- npmPackageLock.version = newVersion;
169
- const defaultPackage = npmPackageLock.packages?.[""];
170
- if (defaultPackage) {
171
- defaultPackage.version = newVersion;
172
- }
173
- }, { skipIfMissing: true });
174
- if (isObsidianPlugin) {
175
- const latestObsidianVersion = await getLatestObsidianVersion();
176
- await (0, import_JSON.editJson)(import_ObsidianPluginRepoPaths.ObsidianPluginRepoPaths.ManifestJson, (manifest) => {
177
- manifest.minAppVersion = latestObsidianVersion;
178
- manifest.version = newVersion;
179
- });
180
- await (0, import_JSON.editJson)(import_ObsidianPluginRepoPaths.ObsidianPluginRepoPaths.VersionsJson, (versions) => {
181
- versions[newVersion] = latestObsidianVersion;
182
- });
183
- }
184
- }
185
- async function getNewVersion(versionUpdateType) {
186
- const versionType = getVersionUpdateType(versionUpdateType);
187
- if (versionType === "manual" /* Manual */) {
188
- return versionUpdateType;
189
- }
190
- const npmPackage = await (0, import_Npm.readNpmPackage)();
191
- const currentVersion = npmPackage.version;
192
- const match = currentVersion.match(/^(\d+)\.(\d+)\.(\d+)(-beta.(\d+))?/);
193
- if (!match) {
194
- throw new Error(`Invalid current version format: ${currentVersion}`);
195
- }
196
- let major = Number(match[1]);
197
- let minor = Number(match[2]);
198
- let patch = Number(match[3]);
199
- let beta = match[5] ? Number(match[5]) : 0;
200
- switch (versionType) {
201
- case "major" /* Major */:
202
- major++;
203
- minor = 0;
204
- patch = 0;
205
- beta = 0;
206
- break;
207
- case "minor" /* Minor */:
208
- minor++;
209
- patch = 0;
210
- beta = 0;
211
- break;
212
- case "patch" /* Patch */:
213
- patch++;
214
- beta = 0;
215
- break;
216
- case "beta" /* Beta */:
217
- beta++;
218
- break;
219
- }
220
- return `${major}.${minor}.${patch}${beta > 0 ? `-beta.${beta}` : ""}`;
221
- }
222
- async function getLatestObsidianVersion() {
223
- const response = await fetch("https://api.github.com/repos/obsidianmd/obsidian-releases/releases/latest");
224
- const obsidianReleasesJson = await response.json();
225
- return obsidianReleasesJson.name;
226
- }
227
- async function updateChangelog(newVersion) {
228
- const changelogPath = (0, import_Root.resolvePathFromRoot)(import_ObsidianPluginRepoPaths.ObsidianPluginRepoPaths.ChangelogMd);
229
- let previousChangelogLines;
230
- if (!(0, import_node_fs.existsSync)(changelogPath)) {
231
- previousChangelogLines = [];
232
- } else {
233
- const content = await (0, import_promises.readFile)(changelogPath, "utf-8");
234
- previousChangelogLines = content.split("\n").slice(2);
235
- if (previousChangelogLines.at(-1) === "") {
236
- previousChangelogLines.pop();
237
- }
238
- }
239
- const lastTag = previousChangelogLines[0]?.replace("## ", "");
240
- const commitRange = lastTag ? `${lastTag}..HEAD` : "HEAD";
241
- const commitMessages = (await (0, import_Root.execFromRoot)(`git log ${commitRange} --format=%s --first-parent`, { quiet: true })).split(/\r?\n/);
242
- let newChangeLog = `# CHANGELOG
243
-
244
- ## ${newVersion}
245
-
246
- `;
247
- for (const message of commitMessages) {
248
- newChangeLog += `- ${message}
249
- `;
250
- }
251
- if (previousChangelogLines.length > 0) {
252
- newChangeLog += "\n";
253
- for (const line of previousChangelogLines) {
254
- newChangeLog += `${line}
255
- `;
256
- }
257
- }
258
- await (0, import_promises.writeFile)(changelogPath, newChangeLog, "utf-8");
259
- await (0, import_promises2.createInterface)(__process.stdin, __process.stdout).question(`Please update the ${import_ObsidianPluginRepoPaths.ObsidianPluginRepoPaths.ChangelogMd} file. Press Enter when you are done...`);
260
- }
261
- async function addUpdatedFilesToGit(newVersion) {
262
- const files = [
263
- import_ObsidianPluginRepoPaths.ObsidianPluginRepoPaths.ManifestJson,
264
- import_ObsidianPluginRepoPaths.ObsidianPluginRepoPaths.PackageJson,
265
- import_ObsidianPluginRepoPaths.ObsidianPluginRepoPaths.PackageLockJson,
266
- import_ObsidianPluginRepoPaths.ObsidianPluginRepoPaths.VersionsJson,
267
- import_ObsidianPluginRepoPaths.ObsidianPluginRepoPaths.ChangelogMd
268
- ].filter((file) => (0, import_node_fs.existsSync)((0, import_Root.resolvePathFromRoot)(file)));
269
- await (0, import_Root.execFromRoot)(["git", "add", ...files], { quiet: true });
270
- await (0, import_Root.execFromRoot)(`git commit -m ${newVersion}`, { quiet: true });
271
- }
272
- async function addGitTag(newVersion) {
273
- await (0, import_Root.execFromRoot)(`git tag -a ${newVersion} -m ${newVersion}`, { quiet: true });
274
- }
275
- async function gitPush() {
276
- await (0, import_Root.execFromRoot)("git push --follow-tags", { quiet: true });
277
- }
278
- async function copyUpdatedManifest() {
279
- await (0, import_promises.cp)((0, import_Root.resolvePathFromRoot)(import_ObsidianPluginRepoPaths.ObsidianPluginRepoPaths.ManifestJson), (0, import_Root.resolvePathFromRoot)((0, import_Path.join)(import_ObsidianPluginRepoPaths.ObsidianPluginRepoPaths.DistBuild, import_ObsidianPluginRepoPaths.ObsidianPluginRepoPaths.ManifestJson)), { force: true });
280
- }
281
- async function getReleaseNotes(newVersion) {
282
- const changelogPath = (0, import_Root.resolvePathFromRoot)(import_ObsidianPluginRepoPaths.ObsidianPluginRepoPaths.ChangelogMd);
283
- const content = await (0, import_promises.readFile)(changelogPath, "utf-8");
284
- const newVersionEscaped = newVersion.replaceAll(".", "\\.");
285
- const match = content.match(new RegExp(`
286
- ## ${newVersionEscaped}
287
-
288
- ((.|
289
- )+?)
290
-
291
- ##`));
292
- let releaseNotes = match ? match[1] + "\n\n" : "";
293
- const tags = (await (0, import_Root.execFromRoot)("git tag --sort=-creatordate", { quiet: true })).split(/\r?\n/);
294
- const previousVersion = tags[1];
295
- let changesUrl = "";
296
- const repoUrl = await (0, import_Root.execFromRoot)("gh repo view --json url -q .url", { quiet: true });
297
- if (previousVersion) {
298
- changesUrl = `${repoUrl}/compare/${previousVersion}...${newVersion}`;
299
- } else {
300
- changesUrl = `${repoUrl}/commits/${newVersion}`;
301
- }
302
- releaseNotes += `**Full Changelog**: ${changesUrl}`;
303
- return releaseNotes;
304
- }
305
- async function publishGitHubRelease(newVersion, isObsidianPlugin) {
306
- let filePaths;
307
- if (isObsidianPlugin) {
308
- const buildDir = (0, import_Root.resolvePathFromRoot)(import_ObsidianPluginRepoPaths.ObsidianPluginRepoPaths.DistBuild);
309
- const fileNames = await (0, import_Fs.readdirPosix)(buildDir);
310
- filePaths = fileNames.map((fileName) => (0, import_Path.join)(buildDir, fileName));
311
- } else {
312
- const zip = new import_adm_zip.default();
313
- zip.addLocalFolder((0, import_Root.resolvePathFromRoot)(import_ObsidianDevUtilsRepoPaths.ObsidianDevUtilsRepoPaths.Dist), import_ObsidianDevUtilsRepoPaths.ObsidianDevUtilsRepoPaths.Dist, (filename) => !filename.endsWith(".zip"));
314
- const files = [
315
- import_ObsidianDevUtilsRepoPaths.ObsidianDevUtilsRepoPaths.ChangelogMd,
316
- import_ObsidianDevUtilsRepoPaths.ObsidianDevUtilsRepoPaths.License,
317
- import_ObsidianDevUtilsRepoPaths.ObsidianDevUtilsRepoPaths.ReadmeMd,
318
- import_ObsidianDevUtilsRepoPaths.ObsidianDevUtilsRepoPaths.PackageJson
319
- ];
320
- for (const file of files) {
321
- zip.addLocalFile((0, import_Root.resolvePathFromRoot)(file));
322
- }
323
- const npmPackage = await (0, import_Npm.readNpmPackage)();
324
- const distZipPath = (0, import_Root.resolvePathFromRoot)((0, import_Path.join)(import_ObsidianDevUtilsRepoPaths.ObsidianDevUtilsRepoPaths.Dist, `${npmPackage.name}-${newVersion}.zip`));
325
- zip.writeZip(distZipPath);
326
- filePaths = [distZipPath];
327
- }
328
- await (0, import_Root.execFromRoot)(["gh", "release", "create", newVersion, ...filePaths, "--title", `v${newVersion}`, "--notes-file", "-"], {
329
- quiet: true,
330
- stdin: await getReleaseNotes(newVersion)
331
- });
332
- }
333
- // Annotate the CommonJS export names for ESM import in node:
334
- 0 && (module.exports = {
335
- VersionUpdateType,
336
- addGitTag,
337
- addUpdatedFilesToGit,
338
- checkGitHubCliInstalled,
339
- checkGitInstalled,
340
- checkGitRepoClean,
341
- copyUpdatedManifest,
342
- getNewVersion,
343
- getReleaseNotes,
344
- getVersionUpdateType,
345
- gitPush,
346
- publishGitHubRelease,
347
- updateChangelog,
348
- updateVersion,
349
- updateVersionInFiles,
350
- validate
351
- });
352
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2Jpbi92ZXJzaW9uLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJ2YXIgX19pbXBvcnRfbWV0YV91cmwgPSBnbG9iYWxUaGlzW1wiaW1wb3J0Lm1ldGEudXJsXCJdID8/ICgoKT0+cmVxdWlyZShcIm5vZGU6dXJsXCIpLnBhdGhUb0ZpbGVVUkwoX19maWxlbmFtZSkpKCk7XG52YXIgX19wcm9jZXNzID0gZ2xvYmFsVGhpc1tcInByb2Nlc3NcIl0gPz8ge1xuICBcImN3ZFwiOiAoKT0+XCIvXCIsXG4gIFwiZW52XCI6IHt9LFxuICBcInBsYXRmb3JtXCI6IFwiYW5kcm9pZFwiXG59O1xuLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb24gdmVyc2lvblxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgZnVuY3Rpb25zIGZvciBtYW5hZ2luZyB2ZXJzaW9uIHVwZGF0ZXMgaW4gYSBwcm9qZWN0LlxuICogSXQgaW5jbHVkZXMgdGFza3Mgc3VjaCBhcyB2YWxpZGF0aW5nIHZlcnNpb24gdXBkYXRlIHR5cGVzLCBjaGVja2luZyB0aGUgc3RhdGVcbiAqIG9mIEdpdCBhbmQgR2l0SHViIENMSSwgdXBkYXRpbmcgdmVyc2lvbiBudW1iZXJzIGluIGZpbGVzLCBhbmQgcGVyZm9ybWluZ1xuICogR2l0IG9wZXJhdGlvbnMgc3VjaCBhcyB0YWdnaW5nIGFuZCBwdXNoaW5nLlxuICpcbiAqIFRoZSBtYWluIGZ1bmN0aW9uLCBgdXBkYXRlVmVyc2lvbmAsIGNvb3JkaW5hdGVzIHRoZXNlIHRhc2tzIHRvIGVuc3VyZSB0aGF0XG4gKiB2ZXJzaW9uIHVwZGF0ZXMgYXJlIGhhbmRsZWQgY29uc2lzdGVudGx5IGFuZCBjb3JyZWN0bHkuIEl0IGFsc28gaW50ZWdyYXRlc1xuICogd2l0aCBPYnNpZGlhbiBwbHVnaW5zLCBpZiBhcHBsaWNhYmxlLCBieSB1cGRhdGluZyByZWxldmFudCBmaWxlcyBhbmQgcmVsZWFzaW5nXG4gKiBuZXcgdmVyc2lvbnMgb24gR2l0SHViLlxuICovXG5cbmltcG9ydCB7IENsaVRhc2tSZXN1bHQgfSBmcm9tIFwiLi4vY2xpLnRzXCI7XG5pbXBvcnQge1xuICBleGVjRnJvbVJvb3QsXG4gIHJlc29sdmVQYXRoRnJvbVJvb3Rcbn0gZnJvbSBcIi4uL1Jvb3QudHNcIjtcbmltcG9ydCB7IHNwZWxsY2hlY2sgfSBmcm9tIFwiLi9zcGVsbGNoZWNrLnRzXCI7XG5pbXBvcnQgeyBsaW50IH0gZnJvbSBcIi4vRVNMaW50L0VTTGludC50c1wiO1xuaW1wb3J0IHtcbiAgZWRpdE5wbVBhY2thZ2UsXG4gIGVkaXROcG1QYWNrYWdlTG9jayxcbiAgcmVhZE5wbVBhY2thZ2Vcbn0gZnJvbSBcIi4uL05wbS50c1wiO1xuaW1wb3J0IHsgZWRpdEpzb24gfSBmcm9tIFwiLi4vSlNPTi50c1wiO1xuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQge1xuICBjcCxcbiAgcmVhZEZpbGUsXG4gIHdyaXRlRmlsZVxufSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgY3JlYXRlSW50ZXJmYWNlIH0gZnJvbSBcIm5vZGU6cmVhZGxpbmUvcHJvbWlzZXNcIjtcbmltcG9ydCB7IHJlYWRkaXJQb3NpeCB9IGZyb20gXCIuLi9Gcy50c1wiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCIuLi9QYXRoLnRzXCI7XG5pbXBvcnQgeyBPYnNpZGlhblBsdWdpblJlcG9QYXRocyB9IGZyb20gXCIuLi9vYnNpZGlhbi9QbHVnaW4vT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMudHNcIjtcbmltcG9ydCB7IE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMgfSBmcm9tIFwiLi9PYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzLnRzXCI7XG5pbXBvcnQgQWRtWmlwIGZyb20gXCJhZG0temlwXCI7XG5cbi8qKlxuICogRW51bSByZXByZXNlbnRpbmcgZGlmZmVyZW50IHR5cGVzIG9mIHZlcnNpb24gdXBkYXRlcy5cbiAqL1xuZXhwb3J0IGVudW0gVmVyc2lvblVwZGF0ZVR5cGUge1xuICBNYWpvciA9IFwibWFqb3JcIixcbiAgTWlub3IgPSBcIm1pbm9yXCIsXG4gIFBhdGNoID0gXCJwYXRjaFwiLFxuICBCZXRhID0gXCJiZXRhXCIsXG4gIE1hbnVhbCA9IFwibWFudWFsXCIsXG4gIEludmFsaWQgPSBcImludmFsaWRcIlxufVxuXG4vKipcbiAqIFR5cGUgcmVwcmVzZW50aW5nIHRoZSBtYW5pZmVzdCBmaWxlIGZvcm1hdCBmb3IgT2JzaWRpYW4gcGx1Z2lucy5cbiAqL1xuZXhwb3J0IHR5cGUgTWFuaWZlc3QgPSB7XG4gIC8qKlxuICAgKiBUaGUgbWluaW11bSBPYnNpZGlhbiB2ZXJzaW9uIHJlcXVpcmVkIGZvciB0aGUgcGx1Z2luLlxuICAgKi9cbiAgbWluQXBwVmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgdmVyc2lvbjogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBUeXBlIHJlcHJlc2VudGluZyB0aGUgc3RydWN0dXJlIG9mIE9ic2lkaWFuIHJlbGVhc2VzIEpTT04uXG4gKi9cbmV4cG9ydCB0eXBlIE9ic2lkaWFuUmVsZWFzZXNKc29uID0ge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIE9ic2lkaWFuIHJlbGVhc2UuXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIHZlcnNpb24gb2YgdGhlIHByb2plY3QgYmFzZWQgb24gdGhlIHNwZWNpZmllZCB1cGRhdGUgdHlwZS5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgc2VyaWVzIG9mIHRhc2tzIHRvIGhhbmRsZSB2ZXJzaW9uIHVwZGF0ZXM6XG4gKiAxLiBWYWxpZGF0ZXMgdGhlIHZlcnNpb24gdXBkYXRlIHR5cGUuXG4gKiAyLiBDaGVja3MgaWYgR2l0IGFuZCBHaXRIdWIgQ0xJIGFyZSBpbnN0YWxsZWQuXG4gKiAzLiBWZXJpZmllcyB0aGF0IHRoZSBHaXQgcmVwb3NpdG9yeSBpcyBjbGVhbi5cbiAqIDQuIFJ1bnMgc3BlbGxjaGVjayBhbmQgbGludGluZy5cbiAqIDUuIEJ1aWxkcyB0aGUgcHJvamVjdC5cbiAqIDYuIFVwZGF0ZXMgdmVyc2lvbiBpbiBmaWxlcyBhbmQgY2hhbmdlbG9nLlxuICogNy4gQWRkcyB1cGRhdGVkIGZpbGVzIHRvIEdpdCwgdGFncyB0aGUgY29tbWl0LCBhbmQgcHVzaGVzIHRvIHRoZSByZXBvc2l0b3J5LlxuICogOC4gSWYgYW4gT2JzaWRpYW4gcGx1Z2luLCBjb3BpZXMgdGhlIHVwZGF0ZWQgbWFuaWZlc3QgYW5kIHB1Ymxpc2hlcyBhIEdpdEh1YiByZWxlYXNlLlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uVXBkYXRlVHlwZSAtIFRoZSB0eXBlIG9mIHZlcnNpb24gdXBkYXRlIHRvIHBlcmZvcm0gKG1ham9yLCBtaW5vciwgcGF0Y2gsIGJldGEsIG9yIG1hbnVhbCkuXG4gKiBAcmV0dXJucyBBIGBQcm9taXNlYCB0aGF0IHJlc29sdmVzIHRvIGEgYFRhc2tSZXN1bHRgIGluZGljYXRpbmcgdGhlIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBvZiB0aGUgdmVyc2lvbiB1cGRhdGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVWZXJzaW9uKHZlcnNpb25VcGRhdGVUeXBlOiBzdHJpbmcpOiBQcm9taXNlPENsaVRhc2tSZXN1bHQgfCB2b2lkPiB7XG4gIGlmICghdmVyc2lvblVwZGF0ZVR5cGUpIHtcbiAgICBjb25zdCBucG1PbGRWZXJzaW9uID0gcHJvY2Vzcy5lbnZbXCJucG1fb2xkX3ZlcnNpb25cIl07XG4gICAgY29uc3QgbnBtTmV3VmVyc2lvbiA9IHByb2Nlc3MuZW52W1wibnBtX25ld192ZXJzaW9uXCJdO1xuXG4gICAgaWYgKG5wbU9sZFZlcnNpb24gJiYgbnBtTmV3VmVyc2lvbikge1xuICAgICAgYXdhaXQgdXBkYXRlVmVyc2lvbkluRmlsZXMobnBtT2xkVmVyc2lvbiwgZmFsc2UpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVZlcnNpb24obnBtTmV3VmVyc2lvbik7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgaXNPYnNpZGlhblBsdWdpbiA9IGV4aXN0c1N5bmMocmVzb2x2ZVBhdGhGcm9tUm9vdChPYnNpZGlhblBsdWdpblJlcG9QYXRocy5NYW5pZmVzdEpzb24pKTtcbiAgcmV0dXJuIGF3YWl0IENsaVRhc2tSZXN1bHQuY2hhaW4oW1xuICAgIGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIHZhbGlkYXRlKHZlcnNpb25VcGRhdGVUeXBlKTtcbiAgICAgIGF3YWl0IGNoZWNrR2l0SW5zdGFsbGVkKCk7XG4gICAgICBhd2FpdCBjaGVja0dpdFJlcG9DbGVhbigpO1xuICAgICAgYXdhaXQgY2hlY2tHaXRIdWJDbGlJbnN0YWxsZWQoKTtcbiAgICB9LFxuICAgICgpOiBQcm9taXNlPENsaVRhc2tSZXN1bHQ+ID0+IHNwZWxsY2hlY2soKSxcbiAgICBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBhd2FpdCBleGVjRnJvbVJvb3QoXCJucG0gcnVuIGJ1aWxkXCIpO1xuICAgIH0sXG4gICAgKCk6IFByb21pc2U8Q2xpVGFza1Jlc3VsdD4gPT4gbGludCgpLFxuICAgIGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGNvbnN0IG5ld1ZlcnNpb24gPSBhd2FpdCBnZXROZXdWZXJzaW9uKHZlcnNpb25VcGRhdGVUeXBlKTtcbiAgICAgIGF3YWl0IHVwZGF0ZVZlcnNpb25JbkZpbGVzKG5ld1ZlcnNpb24sIGlzT2JzaWRpYW5QbHVnaW4pO1xuICAgICAgYXdhaXQgdXBkYXRlQ2hhbmdlbG9nKG5ld1ZlcnNpb24pO1xuICAgICAgYXdhaXQgYWRkVXBkYXRlZEZpbGVzVG9HaXQobmV3VmVyc2lvbik7XG4gICAgICBhd2FpdCBhZGRHaXRUYWcobmV3VmVyc2lvbik7XG4gICAgICBhd2FpdCBnaXRQdXNoKCk7XG4gICAgICBpZiAoaXNPYnNpZGlhblBsdWdpbikge1xuICAgICAgICBhd2FpdCBjb3B5VXBkYXRlZE1hbmlmZXN0KCk7XG4gICAgICB9XG4gICAgICBhd2FpdCBwdWJsaXNoR2l0SHViUmVsZWFzZShuZXdWZXJzaW9uLCBpc09ic2lkaWFuUGx1Z2luKTtcbiAgICB9XG4gIF0pO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGUgdmVyc2lvbiB1cGRhdGUgdHlwZSB0byBlbnN1cmUgaXQgaXMgZWl0aGVyIGEgcmVjb2duaXplZCB0eXBlXG4gKiBvciBhIHZhbGlkIG1hbnVhbCB2ZXJzaW9uIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvblVwZGF0ZVR5cGUgLSBUaGUgdmVyc2lvbiB1cGRhdGUgdHlwZSB0byB2YWxpZGF0ZS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIHZlcnNpb24gdXBkYXRlIHR5cGUgaXMgaW52YWxpZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlKHZlcnNpb25VcGRhdGVUeXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGdldFZlcnNpb25VcGRhdGVUeXBlKHZlcnNpb25VcGRhdGVUeXBlKSA9PT0gVmVyc2lvblVwZGF0ZVR5cGUuSW52YWxpZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgdmVyc2lvbiB1cGRhdGUgdHlwZS4gUGxlYXNlIHVzZSAnbWFqb3InLCAnbWlub3InLCAncGF0Y2gnLCBvciAneC55LnpbLXN1ZmZpeF0nIGZvcm1hdC5cIik7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgR2l0IGlzIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtLlxuICpcbiAqIFRocm93cyBhbiBlcnJvciBpZiBHaXQgaXMgbm90IGluc3RhbGxlZC5cbiAqXG4gKiBAdGhyb3dzIEVycm9yIGlmIEdpdCBpcyBub3QgaW5zdGFsbGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tHaXRJbnN0YWxsZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZXhlY0Zyb21Sb290KFwiZ2l0IC0tdmVyc2lvblwiLCB7IHF1aWV0OiB0cnVlIH0pO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJHaXQgaXMgbm90IGluc3RhbGxlZC4gUGxlYXNlIGluc3RhbGwgaXQgZnJvbSBodHRwczovL2dpdC1zY20uY29tL1wiKTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgR2l0SHViIENMSSBpcyBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbS5cbiAqXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIEdpdEh1YiBDTEkgaXMgbm90IGluc3RhbGxlZC5cbiAqXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBHaXRIdWIgQ0xJIGlzIG5vdCBpbnN0YWxsZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaGVja0dpdEh1YkNsaUluc3RhbGxlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBleGVjRnJvbVJvb3QoXCJnaCAtLXZlcnNpb25cIiwgeyBxdWlldDogdHJ1ZSB9KTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiR2l0SHViIENMSSBpcyBub3QgaW5zdGFsbGVkLiBQbGVhc2UgaW5zdGFsbCBpdCBmcm9tIGh0dHBzOi8vY2xpLmdpdGh1Yi5jb20vXCIpO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBHaXQgcmVwb3NpdG9yeSBpcyBjbGVhbiwgbWVhbmluZyB0aGVyZSBhcmUgbm8gdW5jb21taXR0ZWQgY2hhbmdlcy5cbiAqXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIEdpdCByZXBvc2l0b3J5IGlzIG5vdCBjbGVhbi5cbiAqXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBHaXQgcmVwb3NpdG9yeSBpcyBub3QgY2xlYW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaGVja0dpdFJlcG9DbGVhbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGRvdXQgPSBhd2FpdCBleGVjRnJvbVJvb3QoXCJnaXQgc3RhdHVzIC0tcG9yY2VsYWluIC0tdW50cmFja2VkLWZpbGVzPWFsbFwiLCB7IHF1aWV0OiB0cnVlIH0pO1xuICAgIGlmIChzdGRvdXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiR2l0IHJlcG9zaXRvcnkgaXMgbm90IGNsZWFuLiBQbGVhc2UgY29tbWl0IG9yIHN0YXNoIHlvdXIgY2hhbmdlcyBiZWZvcmUgcmVsZWFzaW5nIGEgbmV3IHZlcnNpb24uXCIpO1xuICB9XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB0aGUgdHlwZSBvZiB2ZXJzaW9uIHVwZGF0ZSBiYXNlZCBvbiB0aGUgaW5wdXQgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uVXBkYXRlVHlwZSAtIFRoZSBpbnB1dCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlLlxuICogQHJldHVybnMgVGhlIGNvcnJlc3BvbmRpbmcgYFZlcnNpb25VcGRhdGVUeXBlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZlcnNpb25VcGRhdGVUeXBlKHZlcnNpb25VcGRhdGVUeXBlOiBzdHJpbmcpOiBWZXJzaW9uVXBkYXRlVHlwZSB7XG4gIGNvbnN0IHZlcnNpb25VcGRhdGVUeXBlRW51bSA9IHZlcnNpb25VcGRhdGVUeXBlIGFzIFZlcnNpb25VcGRhdGVUeXBlO1xuICBzd2l0Y2ggKHZlcnNpb25VcGRhdGVUeXBlRW51bSkge1xuICAgIGNhc2UgVmVyc2lvblVwZGF0ZVR5cGUuTWFqb3I6XG4gICAgY2FzZSBWZXJzaW9uVXBkYXRlVHlwZS5NaW5vcjpcbiAgICBjYXNlIFZlcnNpb25VcGRhdGVUeXBlLlBhdGNoOlxuICAgIGNhc2UgVmVyc2lvblVwZGF0ZVR5cGUuQmV0YTpcbiAgICAgIHJldHVybiB2ZXJzaW9uVXBkYXRlVHlwZUVudW07XG5cbiAgICBkZWZhdWx0OlxuICAgICAgaWYgKC9eXFxkK1xcLlxcZCtcXC5cXGQrKC1bXFx3XFxkLi1dKyk/JC8udGVzdCh2ZXJzaW9uVXBkYXRlVHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIFZlcnNpb25VcGRhdGVUeXBlLk1hbnVhbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFZlcnNpb25VcGRhdGVUeXBlLkludmFsaWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSB2ZXJzaW9uIGluIHZhcmlvdXMgZmlsZXMsIGluY2x1ZGluZyBgcGFja2FnZS5qc29uYCwgYHBhY2thZ2UtbG9jay5qc29uYCxcbiAqIGFuZCBPYnNpZGlhbiBwbHVnaW4gbWFuaWZlc3RzIGlmIGFwcGxpY2FibGUuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gc3RyaW5nIHRvIHVwZGF0ZSBpbiB0aGUgZmlsZXMuXG4gKiBAcGFyYW0gaXNPYnNpZGlhblBsdWdpbiAtIFdoZXRoZXIgdGhlIHByb2plY3QgaXMgYW4gT2JzaWRpYW4gcGx1Z2luLlxuICogQHJldHVybnMgQSBgUHJvbWlzZWAgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB1cGRhdGUgaXMgY29tcGxldGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVWZXJzaW9uSW5GaWxlcyhuZXdWZXJzaW9uOiBzdHJpbmcsIGlzT2JzaWRpYW5QbHVnaW46IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZWRpdE5wbVBhY2thZ2UoKG5wbVBhY2thZ2UpID0+IHtcbiAgICBucG1QYWNrYWdlLnZlcnNpb24gPSBuZXdWZXJzaW9uO1xuICB9KTtcblxuICBhd2FpdCBlZGl0TnBtUGFja2FnZUxvY2soKG5wbVBhY2thZ2VMb2NrKSA9PiB7XG4gICAgbnBtUGFja2FnZUxvY2sudmVyc2lvbiA9IG5ld1ZlcnNpb247XG4gICAgY29uc3QgZGVmYXVsdFBhY2thZ2UgPSBucG1QYWNrYWdlTG9jay5wYWNrYWdlcz8uW1wiXCJdO1xuICAgIGlmIChkZWZhdWx0UGFja2FnZSkge1xuICAgICAgZGVmYXVsdFBhY2thZ2UudmVyc2lvbiA9IG5ld1ZlcnNpb247XG4gICAgfVxuICB9LCB7IHNraXBJZk1pc3Npbmc6IHRydWUgfSk7XG5cbiAgaWYgKGlzT2JzaWRpYW5QbHVnaW4pIHtcbiAgICBjb25zdCBsYXRlc3RPYnNpZGlhblZlcnNpb24gPSBhd2FpdCBnZXRMYXRlc3RPYnNpZGlhblZlcnNpb24oKTtcblxuICAgIGF3YWl0IGVkaXRKc29uPE1hbmlmZXN0PihPYnNpZGlhblBsdWdpblJlcG9QYXRocy5NYW5pZmVzdEpzb24sIChtYW5pZmVzdCkgPT4ge1xuICAgICAgbWFuaWZlc3QubWluQXBwVmVyc2lvbiA9IGxhdGVzdE9ic2lkaWFuVmVyc2lvbjtcbiAgICAgIG1hbmlmZXN0LnZlcnNpb24gPSBuZXdWZXJzaW9uO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgZWRpdEpzb248UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuVmVyc2lvbnNKc29uLCAodmVyc2lvbnMpID0+IHtcbiAgICAgIHZlcnNpb25zW25ld1ZlcnNpb25dID0gbGF0ZXN0T2JzaWRpYW5WZXJzaW9uO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgbmV3IHZlcnNpb24gc3RyaW5nIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZlcnNpb24gYW5kIHRoZSBzcGVjaWZpZWQgdXBkYXRlIHR5cGUuXG4gKlxuICogQHBhcmFtIHZlcnNpb25VcGRhdGVUeXBlIC0gVGhlIHR5cGUgb2YgdmVyc2lvbiB1cGRhdGUgKG1ham9yLCBtaW5vciwgcGF0Y2gsIGJldGEsIG9yIG1hbnVhbCkuXG4gKiBAcmV0dXJucyBBIGBQcm9taXNlYCB0aGF0IHJlc29sdmVzIHRvIHRoZSBuZXcgdmVyc2lvbiBzdHJpbmcuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBjdXJyZW50IHZlcnNpb24gZm9ybWF0IGlzIGludmFsaWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXROZXdWZXJzaW9uKHZlcnNpb25VcGRhdGVUeXBlOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB2ZXJzaW9uVHlwZSA9IGdldFZlcnNpb25VcGRhdGVUeXBlKHZlcnNpb25VcGRhdGVUeXBlKTtcbiAgaWYgKHZlcnNpb25UeXBlID09PSBWZXJzaW9uVXBkYXRlVHlwZS5NYW51YWwpIHtcbiAgICByZXR1cm4gdmVyc2lvblVwZGF0ZVR5cGU7XG4gIH1cblxuICBjb25zdCBucG1QYWNrYWdlID0gYXdhaXQgcmVhZE5wbVBhY2thZ2UoKTtcbiAgY29uc3QgY3VycmVudFZlcnNpb24gPSBucG1QYWNrYWdlLnZlcnNpb247XG5cbiAgY29uc3QgbWF0Y2ggPSBjdXJyZW50VmVyc2lvbi5tYXRjaCgvXihcXGQrKVxcLihcXGQrKVxcLihcXGQrKSgtYmV0YS4oXFxkKykpPy8pO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGN1cnJlbnQgdmVyc2lvbiBmb3JtYXQ6ICR7Y3VycmVudFZlcnNpb259YCk7XG4gIH1cblxuICBsZXQgbWFqb3IgPSBOdW1iZXIobWF0Y2hbMV0pO1xuICBsZXQgbWlub3IgPSBOdW1iZXIobWF0Y2hbMl0pO1xuICBsZXQgcGF0Y2ggPSBOdW1iZXIobWF0Y2hbM10pO1xuICBsZXQgYmV0YSA9IG1hdGNoWzVdID8gTnVtYmVyKG1hdGNoWzVdKSA6IDA7XG5cbiAgc3dpdGNoICh2ZXJzaW9uVHlwZSkge1xuICAgIGNhc2UgVmVyc2lvblVwZGF0ZVR5cGUuTWFqb3I6XG4gICAgICBtYWpvcisrO1xuICAgICAgbWlub3IgPSAwO1xuICAgICAgcGF0Y2ggPSAwO1xuICAgICAgYmV0YSA9IDA7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFZlcnNpb25VcGRhdGVUeXBlLk1pbm9yOlxuICAgICAgbWlub3IrKztcbiAgICAgIHBhdGNoID0gMDtcbiAgICAgIGJldGEgPSAwO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBWZXJzaW9uVXBkYXRlVHlwZS5QYXRjaDpcbiAgICAgIHBhdGNoKys7XG4gICAgICBiZXRhID0gMDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgVmVyc2lvblVwZGF0ZVR5cGUuQmV0YTpcbiAgICAgIGJldGErKztcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIGAke21ham9yfS4ke21pbm9yfS4ke3BhdGNofSR7YmV0YSA+IDAgPyBgLWJldGEuJHtiZXRhfWAgOiBcIlwifWA7XG59XG5cbi8qKlxuICogRmV0Y2hlcyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgT2JzaWRpYW4gZnJvbSB0aGUgR2l0SHViIHJlbGVhc2VzIEFQSS5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgT2JzaWRpYW4uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdE9ic2lkaWFuVmVyc2lvbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFwiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9vYnNpZGlhbm1kL29ic2lkaWFuLXJlbGVhc2VzL3JlbGVhc2VzL2xhdGVzdFwiKTtcbiAgY29uc3Qgb2JzaWRpYW5SZWxlYXNlc0pzb24gPSBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgT2JzaWRpYW5SZWxlYXNlc0pzb247XG4gIHJldHVybiBvYnNpZGlhblJlbGVhc2VzSnNvbi5uYW1lO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIGNoYW5nZWxvZyBmaWxlIHdpdGggbmV3IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGNvbW1pdCBtZXNzYWdlcy5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBjdXJyZW50IGNoYW5nZWxvZywgYXBwZW5kcyBuZXcgZW50cmllcyBmb3IgdGhlIGxhdGVzdCB2ZXJzaW9uLFxuICogYW5kIHByb21wdHMgdGhlIHVzZXIgdG8gcmV2aWV3IHRoZSBjaGFuZ2VzLlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIG51bWJlciB0byBiZSBhZGRlZCB0byB0aGUgY2hhbmdlbG9nLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY2hhbmdlbG9nIHVwZGF0ZSBpcyBjb21wbGV0ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUNoYW5nZWxvZyhuZXdWZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY2hhbmdlbG9nUGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3QoT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuQ2hhbmdlbG9nTWQpO1xuICBsZXQgcHJldmlvdXNDaGFuZ2Vsb2dMaW5lczogc3RyaW5nW107XG4gIGlmICghZXhpc3RzU3luYyhjaGFuZ2Vsb2dQYXRoKSkge1xuICAgIHByZXZpb3VzQ2hhbmdlbG9nTGluZXMgPSBbXTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUoY2hhbmdlbG9nUGF0aCwgXCJ1dGYtOFwiKTtcbiAgICBwcmV2aW91c0NoYW5nZWxvZ0xpbmVzID0gY29udGVudC5zcGxpdChcIlxcblwiKS5zbGljZSgyKTtcbiAgICBpZiAocHJldmlvdXNDaGFuZ2Vsb2dMaW5lcy5hdCgtMSkgPT09IFwiXCIpIHtcbiAgICAgIHByZXZpb3VzQ2hhbmdlbG9nTGluZXMucG9wKCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbGFzdFRhZyA9IHByZXZpb3VzQ2hhbmdlbG9nTGluZXNbMF0/LnJlcGxhY2UoXCIjIyBcIiwgXCJcIik7XG4gIGNvbnN0IGNvbW1pdFJhbmdlID0gbGFzdFRhZyA/IGAke2xhc3RUYWd9Li5IRUFEYCA6IFwiSEVBRFwiO1xuICBjb25zdCBjb21taXRNZXNzYWdlcyA9IChhd2FpdCBleGVjRnJvbVJvb3QoYGdpdCBsb2cgJHtjb21taXRSYW5nZX0gLS1mb3JtYXQ9JXMgLS1maXJzdC1wYXJlbnRgLCB7IHF1aWV0OiB0cnVlIH0pKS5zcGxpdCgvXFxyP1xcbi8pO1xuXG4gIGxldCBuZXdDaGFuZ2VMb2cgPSBgIyBDSEFOR0VMT0dcXG5cXG4jIyAke25ld1ZlcnNpb259XFxuXFxuYDtcblxuICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgY29tbWl0TWVzc2FnZXMpIHtcbiAgICBuZXdDaGFuZ2VMb2cgKz0gYC0gJHttZXNzYWdlfVxcbmA7XG4gIH1cblxuICBpZiAocHJldmlvdXNDaGFuZ2Vsb2dMaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgbmV3Q2hhbmdlTG9nICs9IFwiXFxuXCI7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIHByZXZpb3VzQ2hhbmdlbG9nTGluZXMpIHtcbiAgICAgIG5ld0NoYW5nZUxvZyArPSBgJHtsaW5lfVxcbmA7XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgd3JpdGVGaWxlKGNoYW5nZWxvZ1BhdGgsIG5ld0NoYW5nZUxvZywgXCJ1dGYtOFwiKTtcblxuICBhd2FpdCBjcmVhdGVJbnRlcmZhY2UocHJvY2Vzcy5zdGRpbiwgcHJvY2Vzcy5zdGRvdXQpLnF1ZXN0aW9uKGBQbGVhc2UgdXBkYXRlIHRoZSAke09ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkNoYW5nZWxvZ01kfSBmaWxlLiBQcmVzcyBFbnRlciB3aGVuIHlvdSBhcmUgZG9uZS4uLmApO1xufVxuXG4vKipcbiAqIEFkZHMgdXBkYXRlZCBmaWxlcyB0byB0aGUgR2l0IHN0YWdpbmcgYXJlYSBhbmQgY29tbWl0cyB0aGVtIHdpdGggdGhlIG5ldyB2ZXJzaW9uIG1lc3NhZ2UuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIHVzZWQgYXMgdGhlIGNvbW1pdCBtZXNzYWdlLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZmlsZXMgaGF2ZSBiZWVuIGFkZGVkIGFuZCBjb21taXR0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRVcGRhdGVkRmlsZXNUb0dpdChuZXdWZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZXMgPSBbXG4gICAgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuTWFuaWZlc3RKc29uLFxuICAgIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLlBhY2thZ2VKc29uLFxuICAgIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLlBhY2thZ2VMb2NrSnNvbixcbiAgICBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5WZXJzaW9uc0pzb24sXG4gICAgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuQ2hhbmdlbG9nTWRcbiAgXS5maWx0ZXIoKGZpbGUpID0+IGV4aXN0c1N5bmMocmVzb2x2ZVBhdGhGcm9tUm9vdChmaWxlKSkpO1xuICBhd2FpdCBleGVjRnJvbVJvb3QoW1wiZ2l0XCIsIFwiYWRkXCIsIC4uLmZpbGVzXSwgeyBxdWlldDogdHJ1ZSB9KTtcbiAgYXdhaXQgZXhlY0Zyb21Sb290KGBnaXQgY29tbWl0IC1tICR7bmV3VmVyc2lvbn1gLCB7IHF1aWV0OiB0cnVlIH0pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBHaXQgdGFnIGZvciB0aGUgbmV3IHZlcnNpb24uXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIHRvIHVzZSBmb3IgdGhlIHRhZy5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHRhZyBoYXMgYmVlbiBjcmVhdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkR2l0VGFnKG5ld1ZlcnNpb246IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBleGVjRnJvbVJvb3QoYGdpdCB0YWcgLWEgJHtuZXdWZXJzaW9ufSAtbSAke25ld1ZlcnNpb259YCwgeyBxdWlldDogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBQdXNoZXMgY29tbWl0cyBhbmQgdGFncyB0byB0aGUgcmVtb3RlIEdpdCByZXBvc2l0b3J5LlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHB1c2ggb3BlcmF0aW9uIGlzIGNvbXBsZXRlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2l0UHVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZXhlY0Zyb21Sb290KFwiZ2l0IHB1c2ggLS1mb2xsb3ctdGFnc1wiLCB7IHF1aWV0OiB0cnVlIH0pO1xufVxuXG4vKipcbiAqIENvcGllcyB0aGUgdXBkYXRlZCBtYW5pZmVzdCBmaWxlIHRvIHRoZSBkaXN0cmlidXRpb24gYnVpbGQgZGlyZWN0b3J5LlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvcHkgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29weVVwZGF0ZWRNYW5pZmVzdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgY3AocmVzb2x2ZVBhdGhGcm9tUm9vdChPYnNpZGlhblBsdWdpblJlcG9QYXRocy5NYW5pZmVzdEpzb24pLCByZXNvbHZlUGF0aEZyb21Sb290KGpvaW4oT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGlzdEJ1aWxkLCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5NYW5pZmVzdEpzb24pKSwgeyBmb3JjZTogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHJlbGVhc2Ugbm90ZXMgZm9yIGEgc3BlY2lmaWMgdmVyc2lvbiBmcm9tIHRoZSBjaGFuZ2Vsb2cuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIGZvciB3aGljaCB0byBnZXQgdGhlIHJlbGVhc2Ugbm90ZXMuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcmVsZWFzZSBub3RlcyBmb3IgdGhlIHNwZWNpZmllZCB2ZXJzaW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UmVsZWFzZU5vdGVzKG5ld1ZlcnNpb246IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGNoYW5nZWxvZ1BhdGggPSByZXNvbHZlUGF0aEZyb21Sb290KE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkNoYW5nZWxvZ01kKTtcbiAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKGNoYW5nZWxvZ1BhdGgsIFwidXRmLThcIik7XG4gIGNvbnN0IG5ld1ZlcnNpb25Fc2NhcGVkID0gbmV3VmVyc2lvbi5yZXBsYWNlQWxsKFwiLlwiLCBcIlxcXFwuXCIpO1xuICBjb25zdCBtYXRjaCA9IGNvbnRlbnQubWF0Y2gobmV3IFJlZ0V4cChgXFxuIyMgJHtuZXdWZXJzaW9uRXNjYXBlZH1cXG5cXG4oKC58XFxuKSs/KVxcblxcbiMjYCkpO1xuICBsZXQgcmVsZWFzZU5vdGVzID0gbWF0Y2ggPyBtYXRjaFsxXSArIFwiXFxuXFxuXCIgOiBcIlwiO1xuXG4gIGNvbnN0IHRhZ3MgPSAoYXdhaXQgZXhlY0Zyb21Sb290KFwiZ2l0IHRhZyAtLXNvcnQ9LWNyZWF0b3JkYXRlXCIsIHsgcXVpZXQ6IHRydWUgfSkpLnNwbGl0KC9cXHI/XFxuLyk7XG4gIGNvbnN0IHByZXZpb3VzVmVyc2lvbiA9IHRhZ3NbMV07XG4gIGxldCBjaGFuZ2VzVXJsID0gXCJcIjtcblxuICBjb25zdCByZXBvVXJsID0gYXdhaXQgZXhlY0Zyb21Sb290KFwiZ2ggcmVwbyB2aWV3IC0tanNvbiB1cmwgLXEgLnVybFwiLCB7IHF1aWV0OiB0cnVlIH0pO1xuXG4gIGlmIChwcmV2aW91c1ZlcnNpb24pIHtcbiAgICBjaGFuZ2VzVXJsID0gYCR7cmVwb1VybH0vY29tcGFyZS8ke3ByZXZpb3VzVmVyc2lvbn0uLi4ke25ld1ZlcnNpb259YDtcbiAgfSBlbHNlIHtcbiAgICBjaGFuZ2VzVXJsID0gYCR7cmVwb1VybH0vY29tbWl0cy8ke25ld1ZlcnNpb259YDtcbiAgfVxuXG4gIHJlbGVhc2VOb3RlcyArPSBgKipGdWxsIENoYW5nZWxvZyoqOiAke2NoYW5nZXNVcmx9YDtcbiAgcmV0dXJuIHJlbGVhc2VOb3Rlcztcbn1cblxuLyoqXG4gKiBQdWJsaXNoZXMgYSBHaXRIdWIgcmVsZWFzZSBmb3IgdGhlIG5ldyB2ZXJzaW9uLlxuICpcbiAqIEhhbmRsZXMgdGhlIGNyZWF0aW9uIG9mIGEgcmVsZWFzZSBhbmQgdXBsb2FkaW5nIGZpbGVzIGZvciBlaXRoZXIgYW4gT2JzaWRpYW4gcGx1Z2luIG9yIGFub3RoZXIgcHJvamVjdC5cbiAqXG4gKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSBuZXcgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSByZWxlYXNlLlxuICogQHBhcmFtIGlzT2JzaWRpYW5QbHVnaW4gLSBBIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgcHJvamVjdCBpcyBhbiBPYnNpZGlhbiBwbHVnaW4uXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSByZWxlYXNlIGhhcyBiZWVuIHB1Ymxpc2hlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHB1Ymxpc2hHaXRIdWJSZWxlYXNlKG5ld1ZlcnNpb246IHN0cmluZywgaXNPYnNpZGlhblBsdWdpbjogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICBsZXQgZmlsZVBhdGhzOiBzdHJpbmdbXTtcblxuICBpZiAoaXNPYnNpZGlhblBsdWdpbikge1xuICAgIGNvbnN0IGJ1aWxkRGlyID0gcmVzb2x2ZVBhdGhGcm9tUm9vdChPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EaXN0QnVpbGQpO1xuICAgIGNvbnN0IGZpbGVOYW1lcyA9IGF3YWl0IHJlYWRkaXJQb3NpeChidWlsZERpcik7XG4gICAgZmlsZVBhdGhzID0gZmlsZU5hbWVzLm1hcCgoZmlsZU5hbWUpID0+IGpvaW4oYnVpbGREaXIsIGZpbGVOYW1lKSk7XG4gIH0gZWxzZSB7XG5cbiAgICBjb25zdCB6aXAgPSBuZXcgQWRtWmlwKCk7XG4gICAgemlwLmFkZExvY2FsRm9sZGVyKHJlc29sdmVQYXRoRnJvbVJvb3QoT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5EaXN0KSwgT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5EaXN0LCAoZmlsZW5hbWUpID0+ICFmaWxlbmFtZS5lbmRzV2l0aChcIi56aXBcIikpO1xuXG4gICAgY29uc3QgZmlsZXMgPSBbXG4gICAgICBPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzLkNoYW5nZWxvZ01kLFxuICAgICAgT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5MaWNlbnNlLFxuICAgICAgT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5SZWFkbWVNZCxcbiAgICAgIE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuUGFja2FnZUpzb25cbiAgICBdO1xuXG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICB6aXAuYWRkTG9jYWxGaWxlKHJlc29sdmVQYXRoRnJvbVJvb3QoZmlsZSkpO1xuICAgIH1cblxuICAgIGNvbnN0IG5wbVBhY2thZ2UgPSBhd2FpdCByZWFkTnBtUGFja2FnZSgpO1xuICAgIGNvbnN0IGRpc3RaaXBQYXRoID0gcmVzb2x2ZVBhdGhGcm9tUm9vdChqb2luKE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuRGlzdCwgYCR7bnBtUGFja2FnZS5uYW1lfS0ke25ld1ZlcnNpb259LnppcGApKTtcbiAgICB6aXAud3JpdGVaaXAoZGlzdFppcFBhdGgpO1xuICAgIGZpbGVQYXRocyA9IFtkaXN0WmlwUGF0aF07XG4gIH1cblxuICBhd2FpdCBleGVjRnJvbVJvb3QoW1wiZ2hcIiwgXCJyZWxlYXNlXCIsIFwiY3JlYXRlXCIsIG5ld1ZlcnNpb24sIC4uLmZpbGVQYXRocywgXCItLXRpdGxlXCIsIGB2JHtuZXdWZXJzaW9ufWAsIFwiLS1ub3Rlcy1maWxlXCIsIFwiLVwiXSwge1xuICAgIHF1aWV0OiB0cnVlLFxuICAgIHN0ZGluOiBhd2FpdCBnZXRSZWxl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