@mnaoumov/obsidian-lib 10.5.1 → 10.7.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 (189) hide show
  1. package/codemirror/inline-token-widgets/package.json +6 -0
  2. package/codemirror/settings-facet/package.json +6 -0
  3. package/command-handlers/open-discussion-command-handler/package.json +6 -0
  4. package/command-handlers/open-feature-request-command-handler/package.json +6 -0
  5. package/command-handlers/open-git-hub-command-handler/package.json +6 -0
  6. package/components/settings-facet-component/package.json +6 -0
  7. package/components/style-sheet-component/package.json +6 -0
  8. package/dist/lib/cjs/__merged.cjs +137 -1
  9. package/dist/lib/cjs/__merged.d.cts +26 -0
  10. package/dist/lib/cjs/anchored-suggest.cjs +232 -0
  11. package/dist/lib/cjs/anchored-suggest.d.cts +116 -0
  12. package/dist/lib/cjs/broken-link-candidates.cjs +366 -0
  13. package/dist/lib/cjs/broken-link-candidates.d.cts +181 -0
  14. package/dist/lib/cjs/bug-report.cjs +4 -2
  15. package/dist/lib/cjs/bug-report.d.cts +1 -1
  16. package/dist/lib/cjs/code-block-render-handoff.cjs +272 -0
  17. package/dist/lib/cjs/code-block-render-handoff.d.cts +131 -0
  18. package/dist/lib/cjs/codemirror/index.cjs +7 -1
  19. package/dist/lib/cjs/codemirror/index.d.cts +2 -0
  20. package/dist/lib/cjs/codemirror/inline-token-widgets.cjs +250 -0
  21. package/dist/lib/cjs/codemirror/inline-token-widgets.d.cts +109 -0
  22. package/dist/lib/cjs/codemirror/settings-facet.cjs +132 -0
  23. package/dist/lib/cjs/codemirror/settings-facet.d.cts +19 -0
  24. package/dist/lib/cjs/command-handlers/index.cjs +10 -1
  25. package/dist/lib/cjs/command-handlers/index.d.cts +3 -0
  26. package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.cjs +9 -12
  27. package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.d.cts +6 -8
  28. package/dist/lib/cjs/command-handlers/open-discussion-command-handler.cjs +127 -0
  29. package/dist/lib/cjs/command-handlers/open-discussion-command-handler.d.cts +45 -0
  30. package/dist/lib/cjs/command-handlers/open-feature-request-command-handler.cjs +119 -0
  31. package/dist/lib/cjs/command-handlers/open-feature-request-command-handler.d.cts +33 -0
  32. package/dist/lib/cjs/command-handlers/open-git-hub-command-handler.cjs +121 -0
  33. package/dist/lib/cjs/command-handlers/open-git-hub-command-handler.d.cts +43 -0
  34. package/dist/lib/cjs/components/index.cjs +7 -1
  35. package/dist/lib/cjs/components/index.d.cts +2 -0
  36. package/dist/lib/cjs/components/settings-facet-component.cjs +136 -0
  37. package/dist/lib/cjs/components/settings-facet-component.d.cts +68 -0
  38. package/dist/lib/cjs/components/style-sheet-component.cjs +198 -0
  39. package/dist/lib/cjs/components/style-sheet-component.d.cts +79 -0
  40. package/dist/lib/cjs/css-class.cjs +8 -1
  41. package/dist/lib/cjs/css-class.d.cts +28 -0
  42. package/dist/lib/cjs/data-stores/data-store-transport.cjs +7 -4
  43. package/dist/lib/cjs/data-stores/data-store-transport.d.cts +1 -1
  44. package/dist/lib/cjs/data-stores/shared-data-store.cjs +1 -1
  45. package/dist/lib/cjs/data-stores/shared-data-store.d.cts +1 -1
  46. package/dist/lib/cjs/desktop-git-runner.cjs +117 -0
  47. package/dist/lib/cjs/desktop-git-runner.d.cts +17 -0
  48. package/dist/lib/cjs/desktop-request-url-stream.cjs +258 -0
  49. package/dist/lib/cjs/desktop-request-url-stream.d.cts +22 -0
  50. package/dist/lib/cjs/editor-suggest-registrar.cjs +8 -2
  51. package/dist/lib/cjs/editor-suggest-registrar.d.cts +14 -2
  52. package/dist/lib/cjs/editor-suggest.cjs +197 -0
  53. package/dist/lib/cjs/editor-suggest.d.cts +103 -0
  54. package/dist/lib/cjs/feature-request.cjs +115 -0
  55. package/dist/lib/cjs/feature-request.d.cts +54 -0
  56. package/dist/lib/cjs/generated-during-build.cjs +2 -2
  57. package/dist/lib/cjs/git-hub-discussion.cjs +101 -0
  58. package/dist/lib/cjs/git-hub-discussion.d.cts +28 -0
  59. package/dist/lib/cjs/git-rename-history.cjs +148 -0
  60. package/dist/lib/cjs/git-rename-history.d.cts +43 -0
  61. package/dist/lib/cjs/hotkey.cjs +185 -0
  62. package/dist/lib/cjs/hotkey.d.cts +59 -0
  63. package/dist/lib/cjs/i18n/locales/en.cjs +13 -1
  64. package/dist/lib/cjs/i18n/locales/en.d.cts +12 -0
  65. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +12 -0
  66. package/dist/lib/cjs/index.cjs +46 -1
  67. package/dist/lib/cjs/index.d.cts +15 -0
  68. package/dist/lib/cjs/inline-token-renderer.cjs +145 -0
  69. package/dist/lib/cjs/inline-token-renderer.d.cts +88 -0
  70. package/dist/lib/cjs/link-and-tag-input-suggest.cjs +325 -0
  71. package/dist/lib/cjs/link-and-tag-input-suggest.d.cts +229 -0
  72. package/dist/lib/cjs/markdown-code-block-processor.cjs +13 -1
  73. package/dist/lib/cjs/markdown-code-block-processor.d.cts +18 -0
  74. package/dist/lib/cjs/markdown.cjs +6 -1
  75. package/dist/lib/cjs/markdown.d.cts +10 -1
  76. package/dist/lib/cjs/rendered-markdown.cjs +306 -0
  77. package/dist/lib/cjs/rendered-markdown.d.cts +77 -0
  78. package/dist/lib/cjs/request-url.cjs +523 -0
  79. package/dist/lib/cjs/request-url.d.cts +233 -0
  80. package/dist/lib/cjs/setting-components/folder-list-component.cjs +216 -0
  81. package/dist/lib/cjs/setting-components/folder-list-component.d.cts +73 -0
  82. package/dist/lib/cjs/setting-components/hotkey-component.cjs +260 -0
  83. package/dist/lib/cjs/setting-components/hotkey-component.d.cts +85 -0
  84. package/dist/lib/cjs/setting-components/index.cjs +13 -1
  85. package/dist/lib/cjs/setting-components/index.d.cts +4 -0
  86. package/dist/lib/cjs/setting-components/list-component.cjs +291 -0
  87. package/dist/lib/cjs/setting-components/list-component.d.cts +106 -0
  88. package/dist/lib/cjs/setting-components/tag-list-component.cjs +220 -0
  89. package/dist/lib/cjs/setting-components/tag-list-component.d.cts +82 -0
  90. package/dist/lib/cjs/setting-ex.cjs +51 -1
  91. package/dist/lib/cjs/setting-ex.d.cts +35 -1
  92. package/dist/lib/cjs/settings-tabs.cjs +258 -0
  93. package/dist/lib/cjs/settings-tabs.d.cts +101 -0
  94. package/dist/lib/cjs/vault.cjs +2 -2
  95. package/dist/lib/cjs/vault.d.cts +3 -1
  96. package/dist/lib/esm/__merged.d.mts +26 -0
  97. package/dist/lib/esm/__merged.mjs +139 -1
  98. package/dist/lib/esm/anchored-suggest.d.mts +116 -0
  99. package/dist/lib/esm/anchored-suggest.mjs +144 -0
  100. package/dist/lib/esm/broken-link-candidates.d.mts +181 -0
  101. package/dist/lib/esm/broken-link-candidates.mjs +275 -0
  102. package/dist/lib/esm/bug-report.d.mts +1 -1
  103. package/dist/lib/esm/bug-report.mjs +4 -2
  104. package/dist/lib/esm/code-block-render-handoff.d.mts +131 -0
  105. package/dist/lib/esm/code-block-render-handoff.mjs +183 -0
  106. package/dist/lib/esm/codemirror/index.d.mts +2 -0
  107. package/dist/lib/esm/codemirror/index.mjs +5 -1
  108. package/dist/lib/esm/codemirror/inline-token-widgets.d.mts +109 -0
  109. package/dist/lib/esm/codemirror/inline-token-widgets.mjs +167 -0
  110. package/dist/lib/esm/codemirror/settings-facet.d.mts +19 -0
  111. package/dist/lib/esm/codemirror/settings-facet.mjs +44 -0
  112. package/dist/lib/esm/command-handlers/index.d.mts +3 -0
  113. package/dist/lib/esm/command-handlers/index.mjs +7 -1
  114. package/dist/lib/esm/command-handlers/open-bug-report-command-handler.d.mts +6 -8
  115. package/dist/lib/esm/command-handlers/open-bug-report-command-handler.mjs +9 -12
  116. package/dist/lib/esm/command-handlers/open-discussion-command-handler.d.mts +45 -0
  117. package/dist/lib/esm/command-handlers/open-discussion-command-handler.mjs +39 -0
  118. package/dist/lib/esm/command-handlers/open-feature-request-command-handler.d.mts +33 -0
  119. package/dist/lib/esm/command-handlers/open-feature-request-command-handler.mjs +31 -0
  120. package/dist/lib/esm/command-handlers/open-git-hub-command-handler.d.mts +43 -0
  121. package/dist/lib/esm/command-handlers/open-git-hub-command-handler.mjs +33 -0
  122. package/dist/lib/esm/components/index.d.mts +2 -0
  123. package/dist/lib/esm/components/index.mjs +5 -1
  124. package/dist/lib/esm/components/settings-facet-component.d.mts +68 -0
  125. package/dist/lib/esm/components/settings-facet-component.mjs +48 -0
  126. package/dist/lib/esm/components/style-sheet-component.d.mts +79 -0
  127. package/dist/lib/esm/components/style-sheet-component.mjs +109 -0
  128. package/dist/lib/esm/css-class.d.mts +28 -0
  129. package/dist/lib/esm/css-class.mjs +8 -1
  130. package/dist/lib/esm/data-stores/data-store-transport.d.mts +1 -1
  131. package/dist/lib/esm/data-stores/data-store-transport.mjs +7 -4
  132. package/dist/lib/esm/data-stores/shared-data-store.d.mts +1 -1
  133. package/dist/lib/esm/data-stores/shared-data-store.mjs +1 -1
  134. package/dist/lib/esm/desktop-git-runner.d.mts +17 -0
  135. package/dist/lib/esm/desktop-git-runner.mjs +19 -0
  136. package/dist/lib/esm/desktop-request-url-stream.d.mts +22 -0
  137. package/dist/lib/esm/desktop-request-url-stream.mjs +170 -0
  138. package/dist/lib/esm/editor-suggest-registrar.d.mts +14 -2
  139. package/dist/lib/esm/editor-suggest-registrar.mjs +8 -2
  140. package/dist/lib/esm/editor-suggest.d.mts +103 -0
  141. package/dist/lib/esm/editor-suggest.mjs +108 -0
  142. package/dist/lib/esm/feature-request.d.mts +54 -0
  143. package/dist/lib/esm/feature-request.mjs +25 -0
  144. package/dist/lib/esm/generated-during-build.mjs +2 -2
  145. package/dist/lib/esm/git-hub-discussion.d.mts +28 -0
  146. package/dist/lib/esm/git-hub-discussion.mjs +13 -0
  147. package/dist/lib/esm/git-rename-history.d.mts +43 -0
  148. package/dist/lib/esm/git-rename-history.mjs +59 -0
  149. package/dist/lib/esm/hotkey.d.mts +59 -0
  150. package/dist/lib/esm/hotkey.mjs +95 -0
  151. package/dist/lib/esm/i18n/locales/en.d.mts +12 -0
  152. package/dist/lib/esm/i18n/locales/en.mjs +13 -1
  153. package/dist/lib/esm/i18n/locales/translations-map.d.mts +12 -0
  154. package/dist/lib/esm/index.d.mts +15 -0
  155. package/dist/lib/esm/index.mjs +31 -1
  156. package/dist/lib/esm/inline-token-renderer.d.mts +88 -0
  157. package/dist/lib/esm/inline-token-renderer.mjs +59 -0
  158. package/dist/lib/esm/link-and-tag-input-suggest.d.mts +229 -0
  159. package/dist/lib/esm/link-and-tag-input-suggest.mjs +239 -0
  160. package/dist/lib/esm/markdown-code-block-processor.d.mts +18 -0
  161. package/dist/lib/esm/markdown-code-block-processor.mjs +16 -1
  162. package/dist/lib/esm/markdown.d.mts +10 -1
  163. package/dist/lib/esm/markdown.mjs +9 -1
  164. package/dist/lib/esm/rendered-markdown.d.mts +77 -0
  165. package/dist/lib/esm/rendered-markdown.mjs +219 -0
  166. package/dist/lib/esm/request-url.d.mts +233 -0
  167. package/dist/lib/esm/request-url.mjs +428 -0
  168. package/dist/lib/esm/setting-components/folder-list-component.d.mts +73 -0
  169. package/dist/lib/esm/setting-components/folder-list-component.mjs +131 -0
  170. package/dist/lib/esm/setting-components/hotkey-component.d.mts +85 -0
  171. package/dist/lib/esm/setting-components/hotkey-component.mjs +178 -0
  172. package/dist/lib/esm/setting-components/index.d.mts +4 -0
  173. package/dist/lib/esm/setting-components/index.mjs +9 -1
  174. package/dist/lib/esm/setting-components/list-component.d.mts +106 -0
  175. package/dist/lib/esm/setting-components/list-component.mjs +206 -0
  176. package/dist/lib/esm/setting-components/tag-list-component.d.mts +82 -0
  177. package/dist/lib/esm/setting-components/tag-list-component.mjs +131 -0
  178. package/dist/lib/esm/setting-ex.d.mts +35 -1
  179. package/dist/lib/esm/setting-ex.mjs +51 -1
  180. package/dist/lib/esm/settings-tabs.d.mts +101 -0
  181. package/dist/lib/esm/settings-tabs.mjs +170 -0
  182. package/dist/lib/esm/vault.d.mts +3 -1
  183. package/dist/lib/esm/vault.mjs +2 -2
  184. package/dist/styles.css +83 -1
  185. package/package.json +2 -2
  186. package/setting-components/folder-list-component/package.json +6 -0
  187. package/setting-components/hotkey-component/package.json +6 -0
  188. package/setting-components/list-component/package.json +6 -0
  189. package/setting-components/tag-list-component/package.json +6 -0
@@ -0,0 +1,275 @@
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
+ (function () {
6
+ function ensureBrowserProcess() {
7
+ const browserProcess = {
8
+ browser: true,
9
+ cwd() {
10
+ return "/";
11
+ },
12
+ env: {},
13
+ platform: "android"
14
+ };
15
+ const existingProcess = globalThis.process;
16
+ if (!existingProcess) {
17
+ globalThis.process = browserProcess;
18
+ return;
19
+ }
20
+ if (existingProcess.versions?.node) {
21
+ return;
22
+ }
23
+ const existingProcessRecord = existingProcess;
24
+ for (const [key, value] of Object.entries(browserProcess)) {
25
+ existingProcessRecord[key] ??= value;
26
+ }
27
+ existingProcessRecord["browser"] = true;
28
+ }
29
+
30
+ ensureBrowserProcess();
31
+ })();
32
+
33
+ import { ensureNonNullable } from "@mnaoumov/typescript-lib/type-guards";
34
+ var BrokenLinkEvidenceKind = /* @__PURE__ */ ((BrokenLinkEvidenceKind2) => {
35
+ BrokenLinkEvidenceKind2["Alias"] = "Alias";
36
+ BrokenLinkEvidenceKind2["CaseChange"] = "CaseChange";
37
+ BrokenLinkEvidenceKind2["GitRename"] = "GitRename";
38
+ BrokenLinkEvidenceKind2["RenamedFolder"] = "RenamedFolder";
39
+ BrokenLinkEvidenceKind2["SameName"] = "SameName";
40
+ BrokenLinkEvidenceKind2["Title"] = "Title";
41
+ return BrokenLinkEvidenceKind2;
42
+ })(BrokenLinkEvidenceKind || {});
43
+ const FOLDER_NOTE_MIN_SUFFIX_LENGTH = 2;
44
+ const EVIDENCE_KIND_ORDER = [
45
+ "GitRename" /* GitRename */,
46
+ "CaseChange" /* CaseChange */,
47
+ "Alias" /* Alias */,
48
+ "Title" /* Title */,
49
+ "RenamedFolder" /* RenamedFolder */,
50
+ "SameName" /* SameName */
51
+ ];
52
+ class BrokenLinkCandidateFinder {
53
+ aliasesByPath;
54
+ childFoldersByFolder = /* @__PURE__ */ new Map();
55
+ filePathSet;
56
+ filesByLowerCasePath = /* @__PURE__ */ new Map();
57
+ filesByName = /* @__PURE__ */ new Map();
58
+ folderNoteFileNames;
59
+ folderPaths = /* @__PURE__ */ new Set([""]);
60
+ gitRenames;
61
+ titlesByPath;
62
+ /**
63
+ * Indexes the vault snapshot.
64
+ *
65
+ * @param params - The snapshot.
66
+ */
67
+ constructor(params) {
68
+ this.aliasesByPath = params.aliasesByPath;
69
+ this.filePathSet = new Set(params.filePaths);
70
+ this.folderNoteFileNames = new Set(params.folderNoteFileNames);
71
+ this.gitRenames = params.gitRenames;
72
+ this.titlesByPath = params.titlesByPath;
73
+ for (const filePath of params.filePaths) {
74
+ addToMultiMap(this.filesByName, getName(filePath), filePath);
75
+ addToMultiMap(this.filesByLowerCasePath, filePath.toLowerCase(), filePath);
76
+ let folder = getParentPath(filePath);
77
+ while (!this.folderPaths.has(folder)) {
78
+ this.folderPaths.add(folder);
79
+ addToMultiMap(this.childFoldersByFolder, getParentPath(folder), folder);
80
+ folder = getParentPath(folder);
81
+ }
82
+ }
83
+ }
84
+ /**
85
+ * Finds the candidates for every missing path at once.
86
+ *
87
+ * All at once because one kind of evidence is collective: a renamed folder is recognized by every missing
88
+ * target that was under it turning up together under one sibling folder.
89
+ *
90
+ * @param missingPaths - The vault paths that links lead to and no file holds.
91
+ * @returns The candidates for each missing path, strongest first; an empty list when nothing is known.
92
+ */
93
+ findAll(missingPaths) {
94
+ const uniqueMissingPaths = new Set(missingPaths);
95
+ const missingSubtrees = this.getMissingSubtrees(uniqueMissingPaths);
96
+ const result = /* @__PURE__ */ new Map();
97
+ for (const missingPath of uniqueMissingPaths) {
98
+ let add2 = function(path, kind, description) {
99
+ addToMultiMap(evidenceByPath, path, { description, kind });
100
+ };
101
+ var add = add2;
102
+ const evidenceByPath = /* @__PURE__ */ new Map();
103
+ this.addGitRenameCandidate(missingPath, add2);
104
+ this.addCaseChangeCandidates(missingPath, add2);
105
+ this.addAliasAndTitleCandidates(missingPath, add2);
106
+ this.addRenamedFolderCandidates(missingPath, missingSubtrees, add2);
107
+ this.addSameNameCandidates(missingPath, add2);
108
+ result.set(missingPath, sortCandidates(evidenceByPath));
109
+ }
110
+ return result;
111
+ }
112
+ addAliasAndTitleCandidates(missingPath, add) {
113
+ const name = getName(missingPath);
114
+ const isFolderNote = this.folderNoteFileNames.has(name);
115
+ let oldName;
116
+ if (isFolderNote) {
117
+ oldName = getName(getParentPath(missingPath));
118
+ if (!oldName) {
119
+ return;
120
+ }
121
+ } else if (name.toLowerCase().endsWith(".md")) {
122
+ oldName = name.slice(0, -".md".length);
123
+ } else {
124
+ return;
125
+ }
126
+ const lowerCaseOldName = oldName.toLowerCase();
127
+ const isEligible = (path) => this.filePathSet.has(path) && (!isFolderNote || getName(path) === name);
128
+ for (const [path, aliases] of this.aliasesByPath) {
129
+ if (isEligible(path) && aliases.some((alias) => alias.toLowerCase() === lowerCaseOldName)) {
130
+ add(path, "Alias" /* Alias */, `Its aliases hold the old name "${oldName}".`);
131
+ }
132
+ }
133
+ for (const [path, title] of this.titlesByPath) {
134
+ if (isEligible(path) && title.toLowerCase() === lowerCaseOldName) {
135
+ add(path, "Title" /* Title */, `Its title is the old name "${oldName}".`);
136
+ }
137
+ }
138
+ }
139
+ addCaseChangeCandidates(missingPath, add) {
140
+ for (const path of this.filesByLowerCasePath.get(missingPath.toLowerCase()) ?? []) {
141
+ add(path, "CaseChange" /* CaseChange */, "Only the letter case of its path differs.");
142
+ }
143
+ }
144
+ addGitRenameCandidate(missingPath, add) {
145
+ const gitRename = this.gitRenames.get(missingPath);
146
+ if (gitRename && this.filePathSet.has(gitRename.newPath)) {
147
+ add(gitRename.newPath, "GitRename" /* GitRename */, `Git history records the rename, in commit ${gitRename.commit}.`);
148
+ }
149
+ }
150
+ addRenamedFolderCandidates(missingPath, missingSubtrees, add) {
151
+ const missingSubtree = missingSubtrees.get(missingPath);
152
+ if (!missingSubtree) {
153
+ return;
154
+ }
155
+ const parentPath = getParentPath(missingSubtree.root);
156
+ const remainder = getRelativePath(missingSubtree.root, missingPath);
157
+ for (const siblingFolder of this.childFoldersByFolder.get(parentPath) ?? []) {
158
+ const isSubtreeIntact = [...missingSubtree.remainders].every((path) => this.filePathSet.has(joinPath(siblingFolder, path)));
159
+ if (!isSubtreeIntact) {
160
+ continue;
161
+ }
162
+ const fileCount = missingSubtree.remainders.size;
163
+ add(
164
+ joinPath(siblingFolder, remainder),
165
+ "RenamedFolder" /* RenamedFolder */,
166
+ `The folder "${missingSubtree.root}" is gone, and its sibling "${siblingFolder}" holds ${fileCount === 1 ? "the missing file that was" : `all ${String(fileCount)} missing files that were`} under it.`
167
+ );
168
+ }
169
+ }
170
+ addSameNameCandidates(missingPath, add) {
171
+ const name = getName(missingPath);
172
+ const minSuffixLength = this.folderNoteFileNames.has(name) ? FOLDER_NOTE_MIN_SUFFIX_LENGTH : 1;
173
+ const missingSegments = missingPath.split("/");
174
+ let bestSuffixLength = minSuffixLength;
175
+ let bestPaths = [];
176
+ for (const path of this.filesByName.get(name) ?? []) {
177
+ const suffixLength = getCommonSuffixLength(missingSegments, path.split("/"));
178
+ if (suffixLength > bestSuffixLength) {
179
+ bestSuffixLength = suffixLength;
180
+ bestPaths = [path];
181
+ } else if (suffixLength === bestSuffixLength) {
182
+ bestPaths.push(path);
183
+ }
184
+ }
185
+ const suffix = missingSegments.slice(-bestSuffixLength).join("/");
186
+ for (const path of bestPaths) {
187
+ add(path, "SameName" /* SameName */, `It has the same name, "${suffix}", in another folder.`);
188
+ }
189
+ }
190
+ /**
191
+ * Groups the missing paths by the highest missing folder above each, the root of a subtree that may have been
192
+ * renamed as a whole.
193
+ *
194
+ * @param missingPaths - The missing paths.
195
+ * @returns Each missing path's subtree; a path whose own folder exists has none.
196
+ */
197
+ getMissingSubtrees(missingPaths) {
198
+ const subtreesByRoot = /* @__PURE__ */ new Map();
199
+ const result = /* @__PURE__ */ new Map();
200
+ for (const missingPath of missingPaths) {
201
+ let root = getParentPath(missingPath);
202
+ if (this.folderPaths.has(root)) {
203
+ continue;
204
+ }
205
+ while (!this.folderPaths.has(getParentPath(root))) {
206
+ root = getParentPath(root);
207
+ }
208
+ let missingSubtree = subtreesByRoot.get(root);
209
+ if (!missingSubtree) {
210
+ missingSubtree = { remainders: /* @__PURE__ */ new Set(), root };
211
+ subtreesByRoot.set(root, missingSubtree);
212
+ }
213
+ missingSubtree.remainders.add(getRelativePath(root, missingPath));
214
+ result.set(missingPath, missingSubtree);
215
+ }
216
+ return result;
217
+ }
218
+ }
219
+ function getParentPath(path) {
220
+ const index = path.lastIndexOf("/");
221
+ return index === -1 ? "" : path.slice(0, index);
222
+ }
223
+ function getPathMapping(oldPath, newPath) {
224
+ const oldSegments = oldPath.split("/");
225
+ const newSegments = newPath.split("/");
226
+ const suffixLength = getCommonSuffixLength(oldSegments, newSegments);
227
+ return {
228
+ newPrefix: newSegments.slice(0, newSegments.length - suffixLength).join("/"),
229
+ oldPrefix: oldSegments.slice(0, oldSegments.length - suffixLength).join("/")
230
+ };
231
+ }
232
+ function addToMultiMap(map, key, value) {
233
+ let values = map.get(key);
234
+ if (!values) {
235
+ values = [];
236
+ map.set(key, values);
237
+ }
238
+ values.push(value);
239
+ }
240
+ function getCommonSuffixLength(segments1, segments2) {
241
+ let length = 0;
242
+ while (length < segments1.length && length < segments2.length && segments1.at(-length - 1) === segments2.at(-length - 1)) {
243
+ length++;
244
+ }
245
+ return length;
246
+ }
247
+ function getEvidenceRank(evidence) {
248
+ return EVIDENCE_KIND_ORDER.indexOf(evidence.kind);
249
+ }
250
+ function getName(path) {
251
+ return path.slice(path.lastIndexOf("/") + 1);
252
+ }
253
+ function getRelativePath(folder, path) {
254
+ return path.slice(folder.length + 1);
255
+ }
256
+ function joinPath(folder, path) {
257
+ return `${folder}/${path}`;
258
+ }
259
+ function sortCandidates(evidenceByPath) {
260
+ const candidates = [...evidenceByPath].map(([path, evidence]) => ({
261
+ evidence: evidence.sort((evidence1, evidence2) => getEvidenceRank(evidence1) - getEvidenceRank(evidence2)),
262
+ path
263
+ }));
264
+ return candidates.sort((candidate1, candidate2) => {
265
+ const rankDifference = getEvidenceRank(ensureNonNullable(candidate1.evidence[0])) - getEvidenceRank(ensureNonNullable(candidate2.evidence[0]));
266
+ return rankDifference || candidate1.path.localeCompare(candidate2.path);
267
+ });
268
+ }
269
+ export {
270
+ BrokenLinkCandidateFinder,
271
+ BrokenLinkEvidenceKind,
272
+ getParentPath,
273
+ getPathMapping
274
+ };
275
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9icm9rZW4tbGluay1jYW5kaWRhdGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBXaGVyZSBkaWQgYSBtaXNzaW5nIGxpbmsgdGFyZ2V0IGdvPyBQdXJlLCBubyBgQXBwYDogZXZlcnkgcXVlc3Rpb24gYWJvdXQgd2hpY2ggZmlsZSBhIGJyb2tlbiBsaW5rIG1vc3QgbGlrZWx5XG4gKiBtZWFudCBpcyBhbnN3ZXJhYmxlIGZyb20gYSBsaXN0IG9mIHBhdGhzLCB0aGUgbm90ZXMnIGFsaWFzZXMgYW5kIHRpdGxlcywgYW5kIHRoZSB2YXVsdCdzIGdpdCByZW5hbWVzLlxuICpcbiAqIEEgcmVuYW1lIGlzIG5vdCByZWNvdmVyYWJsZSBmcm9tIHRoZSBsaW5rIGFsb25lOiBhIGxpbmsgdG8gYGFscGhhL2JyYXZvL2NoYXJsaWUvIS5tZGAgc2F5cyBub3RoaW5nIGFib3V0XG4gKiBgY2hhcmxpZWAgaGF2aW5nIGJlY29tZSBgZGVsdGFgLiBTbyBldmVyeSBjYW5kaWRhdGUgY2FycmllcyB0aGUgZXZpZGVuY2UgdGhhdCBwcm9kdWNlZCBpdCwgZnJvbSBvdXRzaWRlIHRoZVxuICogbGluaywgYW5kIHRoZSBmaW5kZXIgbmV2ZXIgcGlja3Mgb25lIG9mIHNldmVyYWw6IGEgY2FsbGVyIG9mZmVycyBhIG9uZS1jbGljayBmaXggb25seSB3aGVuIGV4YWN0bHkgb25lXG4gKiBjYW5kaWRhdGUgZXhpc3RzLlxuICovXG5cbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcblxuLyoqXG4gKiBUaGUga2luZCBvZiBldmlkZW5jZSB0aGF0IG1ha2VzIGEgZmlsZSBhIGNhbmRpZGF0ZSBmb3IgYSBtaXNzaW5nIGxpbmsgdGFyZ2V0LlxuICpcbiAqIENhbmRpZGF0ZXMgbGlzdCBldmlkZW5jZSBzdHJvbmdlc3QgZmlyc3QsIGluIEVWSURFTkNFX0tJTkRfT1JERVIgYmVsb3cuXG4gKi9cbmV4cG9ydCBlbnVtIEJyb2tlbkxpbmtFdmlkZW5jZUtpbmQge1xuICAvKipcbiAgICogVGhlIGNhbmRpZGF0ZSdzIGBhbGlhc2VzYCBob2xkIHRoZSBtaXNzaW5nIHRhcmdldCdzIG9sZCBuYW1lLlxuICAgKi9cbiAgQWxpYXMgPSAnQWxpYXMnLFxuXG4gIC8qKlxuICAgKiBUaGUgY2FuZGlkYXRlJ3MgcGF0aCBkaWZmZXJzIGZyb20gdGhlIG1pc3Npbmcgb25lIG9ubHkgaW4gbGV0dGVyIGNhc2UuXG4gICAqL1xuICBDYXNlQ2hhbmdlID0gJ0Nhc2VDaGFuZ2UnLFxuXG4gIC8qKlxuICAgKiBUaGUgdmF1bHQncyBnaXQgaGlzdG9yeSByZWNvcmRzIHRoZSBtaXNzaW5nIHBhdGggYmVpbmcgcmVuYW1lZCB0byB0aGUgY2FuZGlkYXRlLlxuICAgKi9cbiAgR2l0UmVuYW1lID0gJ0dpdFJlbmFtZScsXG5cbiAgLyoqXG4gICAqIFRoZSBtaXNzaW5nIHRhcmdldCdzIGZvbGRlciBpcyBnb25lLCBhbmQgYSBzaWJsaW5nIGZvbGRlciBob2xkcyBldmVyeSBtaXNzaW5nIHRhcmdldCB0aGF0IHdhcyB1bmRlciBpdC5cbiAgICovXG4gIFJlbmFtZWRGb2xkZXIgPSAnUmVuYW1lZEZvbGRlcicsXG5cbiAgLyoqXG4gICAqIEEgZmlsZSB3aXRoIHRoZSBzYW1lIG5hbWUsIGFuZCB0aGUgbG9uZ2VzdCBydW4gb2YgdGhlIHNhbWUgcGFyZW50IGZvbGRlcnMsIHNpdHMgZWxzZXdoZXJlLlxuICAgKi9cbiAgU2FtZU5hbWUgPSAnU2FtZU5hbWUnLFxuXG4gIC8qKlxuICAgKiBUaGUgY2FuZGlkYXRlJ3MgYHRpdGxlYCBpcyB0aGUgbWlzc2luZyB0YXJnZXQncyBvbGQgbmFtZS5cbiAgICovXG4gIFRpdGxlID0gJ1RpdGxlJ1xufVxuXG4vKipcbiAqIEEgZm9sZGVyIG5vdGUncyBvd24gbmFtZSBpZGVudGlmaWVzIG5vdGhpbmcsIHNvIGEgc2FtZS1uYW1lIGNhbmRpZGF0ZSBtdXN0IHNoYXJlIGl0cyBmb2xkZXIncyBuYW1lIHRvby5cbiAqL1xuY29uc3QgRk9MREVSX05PVEVfTUlOX1NVRkZJWF9MRU5HVEggPSAyO1xuXG5jb25zdCBFVklERU5DRV9LSU5EX09SREVSOiByZWFkb25seSBCcm9rZW5MaW5rRXZpZGVuY2VLaW5kW10gPSBbXG4gIEJyb2tlbkxpbmtFdmlkZW5jZUtpbmQuR2l0UmVuYW1lLFxuICBCcm9rZW5MaW5rRXZpZGVuY2VLaW5kLkNhc2VDaGFuZ2UsXG4gIEJyb2tlbkxpbmtFdmlkZW5jZUtpbmQuQWxpYXMsXG4gIEJyb2tlbkxpbmtFdmlkZW5jZUtpbmQuVGl0bGUsXG4gIEJyb2tlbkxpbmtFdmlkZW5jZUtpbmQuUmVuYW1lZEZvbGRlcixcbiAgQnJva2VuTGlua0V2aWRlbmNlS2luZC5TYW1lTmFtZVxuXTtcblxuLyoqXG4gKiBPbmUgZmlsZSB0aGF0IGEgbWlzc2luZyBsaW5rIHRhcmdldCBtYXkgaGF2ZSBiZWNvbWUsIGFuZCB3aHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnJva2VuTGlua0NhbmRpZGF0ZSB7XG4gIC8qKlxuICAgKiBFdmVyeSByZWFzb24gdGhpcyBmaWxlIGlzIGEgY2FuZGlkYXRlLCBzdHJvbmdlc3QgZmlyc3QuXG4gICAqL1xuICByZWFkb25seSBldmlkZW5jZTogcmVhZG9ubHkgQnJva2VuTGlua0V2aWRlbmNlW107XG5cbiAgLyoqXG4gICAqIFRoZSBjYW5kaWRhdGUncyB2YXVsdCBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgQnJva2VuTGlua0NhbmRpZGF0ZUZpbmRlcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnJva2VuTGlua0NhbmRpZGF0ZUZpbmRlckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIEVhY2ggbm90ZSdzIGBhbGlhc2VzYCwgYnkgbm90ZSBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXNlc0J5UGF0aDogUmVhZG9ubHlNYXA8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT47XG5cbiAgLyoqXG4gICAqIEV2ZXJ5IGZpbGUgaW4gdGhlIHZhdWx0LlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZVBhdGhzOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGZpbGUgbmFtZXMgYSBmb2xkZXIgbm90ZSBpcyBzdG9yZWQgdW5kZXIsIHN1Y2ggYXMgYGluZGV4Lm1kYC4gU3VjaCBhIG5hbWUgc2F5cyBub3RoaW5nIGFib3V0IHdoaWNoXG4gICAqIG5vdGUgaXQgaXMsIHNvIGEgc2FtZS1uYW1lIGNhbmRpZGF0ZSBtdXN0IHNoYXJlIGl0cyBmb2xkZXIncyBuYW1lIHRvbywgYW5kIHRoZSBvbGQgbmFtZSBhbiBhbGlhcyBpc1xuICAgKiBtYXRjaGVkIGFnYWluc3QgaXMgdGhlIGZvbGRlcidzLlxuICAgKi9cbiAgcmVhZG9ubHkgZm9sZGVyTm90ZUZpbGVOYW1lczogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSB2YXVsdCdzIGdpdCByZW5hbWVzOiBlYWNoIG9sZCB2YXVsdCBwYXRoIHRvIHRoZSBwYXRoIGl0IHdhcyByZW5hbWVkIHRvLCBjaGFpbnMgYWxyZWFkeSBmb2xsb3dlZC5cbiAgICovXG4gIHJlYWRvbmx5IGdpdFJlbmFtZXM6IFJlYWRvbmx5TWFwPHN0cmluZywgR2l0UmVuYW1lPjtcblxuICAvKipcbiAgICogRWFjaCBub3RlJ3MgYHRpdGxlYCwgYnkgbm90ZSBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgdGl0bGVzQnlQYXRoOiBSZWFkb25seU1hcDxzdHJpbmcsIHN0cmluZz47XG59XG5cbi8qKlxuICogT25lIHJlYXNvbiBhIGZpbGUgaXMgYSBjYW5kaWRhdGUgZm9yIGEgbWlzc2luZyBsaW5rIHRhcmdldC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCcm9rZW5MaW5rRXZpZGVuY2Uge1xuICAvKipcbiAgICogQSBzZW50ZW5jZSBuYW1pbmcgdGhlIGV2aWRlbmNlLCBmb3IgdGhlIHVzZXIgdG8ganVkZ2UgaXQgYnkuXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUga2luZCBvZiBldmlkZW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGtpbmQ6IEJyb2tlbkxpbmtFdmlkZW5jZUtpbmQ7XG59XG5cbi8qKlxuICogQSByZW5hbWUgcmVjb3JkZWQgaW4gdGhlIHZhdWx0J3MgZ2l0IGhpc3RvcnkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2l0UmVuYW1lIHtcbiAgLyoqXG4gICAqIFRoZSBhYmJyZXZpYXRlZCBoYXNoIG9mIHRoZSBjb21taXQgdGhhdCBtYWRlIHRoZSBsYXN0IHJlbmFtZSBvZiB0aGUgY2hhaW4uXG4gICAqL1xuICByZWFkb25seSBjb21taXQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZhdWx0IHBhdGggdGhlIGZpbGUgd2FzIGxhc3QgcmVuYW1lZCB0by5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1BhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcGFydCBvZiBhIG1pc3NpbmcgcGF0aCB0aGF0IGEgY2FuZGlkYXRlIHJlcGxhY2VkOiB3aGF0IGEgXCJmaXggYWxsIGxpa2UgdGhpc1wiIGFwcGxpZXMgdG8gZXZlcnkgb3RoZXIgbGluay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXRoTWFwcGluZyB7XG4gIC8qKlxuICAgKiBUaGUgcGFydCBvZiB0aGUgY2FuZGlkYXRlIHBhdGggdGhhdCByZXBsYWNlZCB7QGxpbmsgb2xkUHJlZml4fTsgYCcnYCBmb3IgdGhlIHZhdWx0IHJvb3QuXG4gICAqL1xuICByZWFkb25seSBuZXdQcmVmaXg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxlYWRpbmcgcGFydCBvZiB0aGUgbWlzc2luZyBwYXRoIHRoYXQgbm8gbG9uZ2VyIGV4aXN0czsgYCcnYCBmb3IgdGhlIHZhdWx0IHJvb3QuXG4gICAqL1xuICByZWFkb25seSBvbGRQcmVmaXg6IHN0cmluZztcbn1cblxudHlwZSBFdmlkZW5jZUFkZGVyID0gKHBhdGg6IHN0cmluZywga2luZDogQnJva2VuTGlua0V2aWRlbmNlS2luZCwgZGVzY3JpcHRpb246IHN0cmluZykgPT4gdm9pZDtcblxuaW50ZXJmYWNlIE1pc3NpbmdTdWJ0cmVlIHtcbiAgLyoqXG4gICAqIEVhY2ggbWlzc2luZyBwYXRoIHVuZGVyIHRoZSBzdWJ0cmVlJ3Mgcm9vdCwgcmVsYXRpdmUgdG8gaXQuXG4gICAqL1xuICByZWFkb25seSByZW1haW5kZXJzOiBTZXQ8c3RyaW5nPjtcblxuICByZWFkb25seSByb290OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIGNhbmRpZGF0ZXMgZm9yIG1pc3NpbmcgbGluayB0YXJnZXRzLCBmcm9tIG9uZSBzbmFwc2hvdCBvZiB0aGUgdmF1bHQuXG4gKi9cbmV4cG9ydCBjbGFzcyBCcm9rZW5MaW5rQ2FuZGlkYXRlRmluZGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhbGlhc2VzQnlQYXRoOiBSZWFkb25seU1hcDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPjtcbiAgcHJpdmF0ZSByZWFkb25seSBjaGlsZEZvbGRlcnNCeUZvbGRlciA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBmaWxlUGF0aFNldDogUmVhZG9ubHlTZXQ8c3RyaW5nPjtcbiAgcHJpdmF0ZSByZWFkb25seSBmaWxlc0J5TG93ZXJDYXNlUGF0aCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBmaWxlc0J5TmFtZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBmb2xkZXJOb3RlRmlsZU5hbWVzOiBSZWFkb25seVNldDxzdHJpbmc+O1xuICBwcml2YXRlIHJlYWRvbmx5IGZvbGRlclBhdGhzID0gbmV3IFNldDxzdHJpbmc+KFsnJ10pO1xuICBwcml2YXRlIHJlYWRvbmx5IGdpdFJlbmFtZXM6IFJlYWRvbmx5TWFwPHN0cmluZywgR2l0UmVuYW1lPjtcbiAgcHJpdmF0ZSByZWFkb25seSB0aXRsZXNCeVBhdGg6IFJlYWRvbmx5TWFwPHN0cmluZywgc3RyaW5nPjtcblxuICAvKipcbiAgICogSW5kZXhlcyB0aGUgdmF1bHQgc25hcHNob3QuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgc25hcHNob3QuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBCcm9rZW5MaW5rQ2FuZGlkYXRlRmluZGVyQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmFsaWFzZXNCeVBhdGggPSBwYXJhbXMuYWxpYXNlc0J5UGF0aDtcbiAgICB0aGlzLmZpbGVQYXRoU2V0ID0gbmV3IFNldChwYXJhbXMuZmlsZVBhdGhzKTtcbiAgICB0aGlzLmZvbGRlck5vdGVGaWxlTmFtZXMgPSBuZXcgU2V0KHBhcmFtcy5mb2xkZXJOb3RlRmlsZU5hbWVzKTtcbiAgICB0aGlzLmdpdFJlbmFtZXMgPSBwYXJhbXMuZ2l0UmVuYW1lcztcbiAgICB0aGlzLnRpdGxlc0J5UGF0aCA9IHBhcmFtcy50aXRsZXNCeVBhdGg7XG5cbiAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIHBhcmFtcy5maWxlUGF0aHMpIHtcbiAgICAgIGFkZFRvTXVsdGlNYXAodGhpcy5maWxlc0J5TmFtZSwgZ2V0TmFtZShmaWxlUGF0aCksIGZpbGVQYXRoKTtcbiAgICAgIGFkZFRvTXVsdGlNYXAodGhpcy5maWxlc0J5TG93ZXJDYXNlUGF0aCwgZmlsZVBhdGgudG9Mb3dlckNhc2UoKSwgZmlsZVBhdGgpO1xuXG4gICAgICBsZXQgZm9sZGVyID0gZ2V0UGFyZW50UGF0aChmaWxlUGF0aCk7XG4gICAgICB3aGlsZSAoIXRoaXMuZm9sZGVyUGF0aHMuaGFzKGZvbGRlcikpIHtcbiAgICAgICAgdGhpcy5mb2xkZXJQYXRocy5hZGQoZm9sZGVyKTtcbiAgICAgICAgYWRkVG9NdWx0aU1hcCh0aGlzLmNoaWxkRm9sZGVyc0J5Rm9sZGVyLCBnZXRQYXJlbnRQYXRoKGZvbGRlciksIGZvbGRlcik7XG4gICAgICAgIGZvbGRlciA9IGdldFBhcmVudFBhdGgoZm9sZGVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIGNhbmRpZGF0ZXMgZm9yIGV2ZXJ5IG1pc3NpbmcgcGF0aCBhdCBvbmNlLlxuICAgKlxuICAgKiBBbGwgYXQgb25jZSBiZWNhdXNlIG9uZSBraW5kIG9mIGV2aWRlbmNlIGlzIGNvbGxlY3RpdmU6IGEgcmVuYW1lZCBmb2xkZXIgaXMgcmVjb2duaXplZCBieSBldmVyeSBtaXNzaW5nXG4gICAqIHRhcmdldCB0aGF0IHdhcyB1bmRlciBpdCB0dXJuaW5nIHVwIHRvZ2V0aGVyIHVuZGVyIG9uZSBzaWJsaW5nIGZvbGRlci5cbiAgICpcbiAgICogQHBhcmFtIG1pc3NpbmdQYXRocyAtIFRoZSB2YXVsdCBwYXRocyB0aGF0IGxpbmtzIGxlYWQgdG8gYW5kIG5vIGZpbGUgaG9sZHMuXG4gICAqIEByZXR1cm5zIFRoZSBjYW5kaWRhdGVzIGZvciBlYWNoIG1pc3NpbmcgcGF0aCwgc3Ryb25nZXN0IGZpcnN0OyBhbiBlbXB0eSBsaXN0IHdoZW4gbm90aGluZyBpcyBrbm93bi5cbiAgICovXG4gIHB1YmxpYyBmaW5kQWxsKG1pc3NpbmdQYXRoczogSXRlcmFibGU8c3RyaW5nPik6IE1hcDxzdHJpbmcsIEJyb2tlbkxpbmtDYW5kaWRhdGVbXT4ge1xuICAgIGNvbnN0IHVuaXF1ZU1pc3NpbmdQYXRocyA9IG5ldyBTZXQobWlzc2luZ1BhdGhzKTtcbiAgICBjb25zdCBtaXNzaW5nU3VidHJlZXMgPSB0aGlzLmdldE1pc3NpbmdTdWJ0cmVlcyh1bmlxdWVNaXNzaW5nUGF0aHMpO1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNYXA8c3RyaW5nLCBCcm9rZW5MaW5rQ2FuZGlkYXRlW10+KCk7XG5cbiAgICBmb3IgKGNvbnN0IG1pc3NpbmdQYXRoIG9mIHVuaXF1ZU1pc3NpbmdQYXRocykge1xuICAgICAgY29uc3QgZXZpZGVuY2VCeVBhdGggPSBuZXcgTWFwPHN0cmluZywgQnJva2VuTGlua0V2aWRlbmNlW10+KCk7XG4gICAgICBmdW5jdGlvbiBhZGQocGF0aDogc3RyaW5nLCBraW5kOiBCcm9rZW5MaW5rRXZpZGVuY2VLaW5kLCBkZXNjcmlwdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGFkZFRvTXVsdGlNYXAoZXZpZGVuY2VCeVBhdGgsIHBhdGgsIHsgZGVzY3JpcHRpb24sIGtpbmQgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYWRkR2l0UmVuYW1lQ2FuZGlkYXRlKG1pc3NpbmdQYXRoLCBhZGQpO1xuICAgICAgdGhpcy5hZGRDYXNlQ2hhbmdlQ2FuZGlkYXRlcyhtaXNzaW5nUGF0aCwgYWRkKTtcbiAgICAgIHRoaXMuYWRkQWxpYXNBbmRUaXRsZUNhbmRpZGF0ZXMobWlzc2luZ1BhdGgsIGFkZCk7XG4gICAgICB0aGlzLmFkZFJlbmFtZWRGb2xkZXJDYW5kaWRhdGVzKG1pc3NpbmdQYXRoLCBtaXNzaW5nU3VidHJlZXMsIGFkZCk7XG4gICAgICB0aGlzLmFkZFNhbWVOYW1lQ2FuZGlkYXRlcyhtaXNzaW5nUGF0aCwgYWRkKTtcblxuICAgICAgcmVzdWx0LnNldChtaXNzaW5nUGF0aCwgc29ydENhbmRpZGF0ZXMoZXZpZGVuY2VCeVBhdGgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRBbGlhc0FuZFRpdGxlQ2FuZGlkYXRlcyhtaXNzaW5nUGF0aDogc3RyaW5nLCBhZGQ6IEV2aWRlbmNlQWRkZXIpOiB2b2lkIHtcbiAgICBjb25zdCBuYW1lID0gZ2V0TmFtZShtaXNzaW5nUGF0aCk7XG4gICAgY29uc3QgaXNGb2xkZXJOb3RlID0gdGhpcy5mb2xkZXJOb3RlRmlsZU5hbWVzLmhhcyhuYW1lKTtcbiAgICBsZXQgb2xkTmFtZTogc3RyaW5nO1xuXG4gICAgaWYgKGlzRm9sZGVyTm90ZSkge1xuICAgICAgb2xkTmFtZSA9IGdldE5hbWUoZ2V0UGFyZW50UGF0aChtaXNzaW5nUGF0aCkpO1xuICAgICAgaWYgKCFvbGROYW1lKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgIG9sZE5hbWUgPSBuYW1lLnNsaWNlKDAsIC0nLm1kJy5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbG93ZXJDYXNlT2xkTmFtZSA9IG9sZE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBpc0VsaWdpYmxlID0gKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4gdGhpcy5maWxlUGF0aFNldC5oYXMocGF0aCkgJiYgKCFpc0ZvbGRlck5vdGUgfHwgZ2V0TmFtZShwYXRoKSA9PT0gbmFtZSk7XG5cbiAgICBmb3IgKGNvbnN0IFtwYXRoLCBhbGlhc2VzXSBvZiB0aGlzLmFsaWFzZXNCeVBhdGgpIHtcbiAgICAgIGlmIChpc0VsaWdpYmxlKHBhdGgpICYmIGFsaWFzZXMuc29tZSgoYWxpYXMpID0+IGFsaWFzLnRvTG93ZXJDYXNlKCkgPT09IGxvd2VyQ2FzZU9sZE5hbWUpKSB7XG4gICAgICAgIGFkZChwYXRoLCBCcm9rZW5MaW5rRXZpZGVuY2VLaW5kLkFsaWFzLCBgSXRzIGFsaWFzZXMgaG9sZCB0aGUgb2xkIG5hbWUgXCIke29sZE5hbWV9XCIuYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbcGF0aCwgdGl0bGVdIG9mIHRoaXMudGl0bGVzQnlQYXRoKSB7XG4gICAgICBpZiAoaXNFbGlnaWJsZShwYXRoKSAmJiB0aXRsZS50b0xvd2VyQ2FzZSgpID09PSBsb3dlckNhc2VPbGROYW1lKSB7XG4gICAgICAgIGFkZChwYXRoLCBCcm9rZW5MaW5rRXZpZGVuY2VLaW5kLlRpdGxlLCBgSXRzIHRpdGxlIGlzIHRoZSBvbGQgbmFtZSBcIiR7b2xkTmFtZX1cIi5gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZENhc2VDaGFuZ2VDYW5kaWRhdGVzKG1pc3NpbmdQYXRoOiBzdHJpbmcsIGFkZDogRXZpZGVuY2VBZGRlcik6IHZvaWQge1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiB0aGlzLmZpbGVzQnlMb3dlckNhc2VQYXRoLmdldChtaXNzaW5nUGF0aC50b0xvd2VyQ2FzZSgpKSA/PyBbXSkge1xuICAgICAgYWRkKHBhdGgsIEJyb2tlbkxpbmtFdmlkZW5jZUtpbmQuQ2FzZUNoYW5nZSwgJ09ubHkgdGhlIGxldHRlciBjYXNlIG9mIGl0cyBwYXRoIGRpZmZlcnMuJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRHaXRSZW5hbWVDYW5kaWRhdGUobWlzc2luZ1BhdGg6IHN0cmluZywgYWRkOiBFdmlkZW5jZUFkZGVyKTogdm9pZCB7XG4gICAgY29uc3QgZ2l0UmVuYW1lID0gdGhpcy5naXRSZW5hbWVzLmdldChtaXNzaW5nUGF0aCk7XG4gICAgaWYgKGdpdFJlbmFtZSAmJiB0aGlzLmZpbGVQYXRoU2V0LmhhcyhnaXRSZW5hbWUubmV3UGF0aCkpIHtcbiAgICAgIGFkZChnaXRSZW5hbWUubmV3UGF0aCwgQnJva2VuTGlua0V2aWRlbmNlS2luZC5HaXRSZW5hbWUsIGBHaXQgaGlzdG9yeSByZWNvcmRzIHRoZSByZW5hbWUsIGluIGNvbW1pdCAke2dpdFJlbmFtZS5jb21taXR9LmApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkUmVuYW1lZEZvbGRlckNhbmRpZGF0ZXMobWlzc2luZ1BhdGg6IHN0cmluZywgbWlzc2luZ1N1YnRyZWVzOiBSZWFkb25seU1hcDxzdHJpbmcsIE1pc3NpbmdTdWJ0cmVlPiwgYWRkOiBFdmlkZW5jZUFkZGVyKTogdm9pZCB7XG4gICAgY29uc3QgbWlzc2luZ1N1YnRyZWUgPSBtaXNzaW5nU3VidHJlZXMuZ2V0KG1pc3NpbmdQYXRoKTtcbiAgICBpZiAoIW1pc3NpbmdTdWJ0cmVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFyZW50UGF0aCA9IGdldFBhcmVudFBhdGgobWlzc2luZ1N1YnRyZWUucm9vdCk7XG4gICAgY29uc3QgcmVtYWluZGVyID0gZ2V0UmVsYXRpdmVQYXRoKG1pc3NpbmdTdWJ0cmVlLnJvb3QsIG1pc3NpbmdQYXRoKTtcblxuICAgIGZvciAoY29uc3Qgc2libGluZ0ZvbGRlciBvZiB0aGlzLmNoaWxkRm9sZGVyc0J5Rm9sZGVyLmdldChwYXJlbnRQYXRoKSA/PyBbXSkge1xuICAgICAgY29uc3QgaXNTdWJ0cmVlSW50YWN0ID0gWy4uLm1pc3NpbmdTdWJ0cmVlLnJlbWFpbmRlcnNdLmV2ZXJ5KChwYXRoKSA9PiB0aGlzLmZpbGVQYXRoU2V0Lmhhcyhqb2luUGF0aChzaWJsaW5nRm9sZGVyLCBwYXRoKSkpO1xuICAgICAgaWYgKCFpc1N1YnRyZWVJbnRhY3QpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpbGVDb3VudCA9IG1pc3NpbmdTdWJ0cmVlLnJlbWFpbmRlcnMuc2l6ZTtcbiAgICAgIGFkZChcbiAgICAgICAgam9pblBhdGgoc2libGluZ0ZvbGRlciwgcmVtYWluZGVyKSxcbiAgICAgICAgQnJva2VuTGlua0V2aWRlbmNlS2luZC5SZW5hbWVkRm9sZGVyLFxuICAgICAgICBgVGhlIGZvbGRlciBcIiR7bWlzc2luZ1N1YnRyZWUucm9vdH1cIiBpcyBnb25lLCBhbmQgaXRzIHNpYmxpbmcgXCIke3NpYmxpbmdGb2xkZXJ9XCIgaG9sZHMgJHtmaWxlQ291bnQgPT09IDEgPyAndGhlIG1pc3NpbmcgZmlsZSB0aGF0IHdhcycgOiBgYWxsICR7U3RyaW5nKGZpbGVDb3VudCl9IG1pc3NpbmcgZmlsZXMgdGhhdCB3ZXJlYH0gdW5kZXIgaXQuYFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZFNhbWVOYW1lQ2FuZGlkYXRlcyhtaXNzaW5nUGF0aDogc3RyaW5nLCBhZGQ6IEV2aWRlbmNlQWRkZXIpOiB2b2lkIHtcbiAgICBjb25zdCBuYW1lID0gZ2V0TmFtZShtaXNzaW5nUGF0aCk7XG4gICAgY29uc3QgbWluU3VmZml4TGVuZ3RoID0gdGhpcy5mb2xkZXJOb3RlRmlsZU5hbWVzLmhhcyhuYW1lKSA/IEZPTERFUl9OT1RFX01JTl9TVUZGSVhfTEVOR1RIIDogMTtcbiAgICBjb25zdCBtaXNzaW5nU2VnbWVudHMgPSBtaXNzaW5nUGF0aC5zcGxpdCgnLycpO1xuICAgIGxldCBiZXN0U3VmZml4TGVuZ3RoID0gbWluU3VmZml4TGVuZ3RoO1xuICAgIGxldCBiZXN0UGF0aHM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgdGhpcy5maWxlc0J5TmFtZS5nZXQobmFtZSkgPz8gW10pIHtcbiAgICAgIGNvbnN0IHN1ZmZpeExlbmd0aCA9IGdldENvbW1vblN1ZmZpeExlbmd0aChtaXNzaW5nU2VnbWVudHMsIHBhdGguc3BsaXQoJy8nKSk7XG4gICAgICBpZiAoc3VmZml4TGVuZ3RoID4gYmVzdFN1ZmZpeExlbmd0aCkge1xuICAgICAgICBiZXN0U3VmZml4TGVuZ3RoID0gc3VmZml4TGVuZ3RoO1xuICAgICAgICBiZXN0UGF0aHMgPSBbcGF0aF07XG4gICAgICB9IGVsc2UgaWYgKHN1ZmZpeExlbmd0aCA9PT0gYmVzdFN1ZmZpeExlbmd0aCkge1xuICAgICAgICBiZXN0UGF0aHMucHVzaChwYXRoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzdWZmaXggPSBtaXNzaW5nU2VnbWVudHMuc2xpY2UoLWJlc3RTdWZmaXhMZW5ndGgpLmpvaW4oJy8nKTtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgYmVzdFBhdGhzKSB7XG4gICAgICBhZGQocGF0aCwgQnJva2VuTGlua0V2aWRlbmNlS2luZC5TYW1lTmFtZSwgYEl0IGhhcyB0aGUgc2FtZSBuYW1lLCBcIiR7c3VmZml4fVwiLCBpbiBhbm90aGVyIGZvbGRlci5gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR3JvdXBzIHRoZSBtaXNzaW5nIHBhdGhzIGJ5IHRoZSBoaWdoZXN0IG1pc3NpbmcgZm9sZGVyIGFib3ZlIGVhY2gsIHRoZSByb290IG9mIGEgc3VidHJlZSB0aGF0IG1heSBoYXZlIGJlZW5cbiAgICogcmVuYW1lZCBhcyBhIHdob2xlLlxuICAgKlxuICAgKiBAcGFyYW0gbWlzc2luZ1BhdGhzIC0gVGhlIG1pc3NpbmcgcGF0aHMuXG4gICAqIEByZXR1cm5zIEVhY2ggbWlzc2luZyBwYXRoJ3Mgc3VidHJlZTsgYSBwYXRoIHdob3NlIG93biBmb2xkZXIgZXhpc3RzIGhhcyBub25lLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRNaXNzaW5nU3VidHJlZXMobWlzc2luZ1BhdGhzOiBSZWFkb25seVNldDxzdHJpbmc+KTogTWFwPHN0cmluZywgTWlzc2luZ1N1YnRyZWU+IHtcbiAgICBjb25zdCBzdWJ0cmVlc0J5Um9vdCA9IG5ldyBNYXA8c3RyaW5nLCBNaXNzaW5nU3VidHJlZT4oKTtcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPHN0cmluZywgTWlzc2luZ1N1YnRyZWU+KCk7XG5cbiAgICBmb3IgKGNvbnN0IG1pc3NpbmdQYXRoIG9mIG1pc3NpbmdQYXRocykge1xuICAgICAgbGV0IHJvb3QgPSBnZXRQYXJlbnRQYXRoKG1pc3NpbmdQYXRoKTtcbiAgICAgIGlmICh0aGlzLmZvbGRlclBhdGhzLmhhcyhyb290KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKCF0aGlzLmZvbGRlclBhdGhzLmhhcyhnZXRQYXJlbnRQYXRoKHJvb3QpKSkge1xuICAgICAgICByb290ID0gZ2V0UGFyZW50UGF0aChyb290KTtcbiAgICAgIH1cblxuICAgICAgbGV0IG1pc3NpbmdTdWJ0cmVlID0gc3VidHJlZXNCeVJvb3QuZ2V0KHJvb3QpO1xuICAgICAgaWYgKCFtaXNzaW5nU3VidHJlZSkge1xuICAgICAgICBtaXNzaW5nU3VidHJlZSA9IHsgcmVtYWluZGVyczogbmV3IFNldCgpLCByb290IH07XG4gICAgICAgIHN1YnRyZWVzQnlSb290LnNldChyb290LCBtaXNzaW5nU3VidHJlZSk7XG4gICAgICB9XG5cbiAgICAgIG1pc3NpbmdTdWJ0cmVlLnJlbWFpbmRlcnMuYWRkKGdldFJlbGF0aXZlUGF0aChyb290LCBtaXNzaW5nUGF0aCkpO1xuICAgICAgcmVzdWx0LnNldChtaXNzaW5nUGF0aCwgbWlzc2luZ1N1YnRyZWUpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgcGFyZW50IGZvbGRlciBvZiBhIHZhdWx0IHBhdGguXG4gKlxuICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aC5cbiAqIEByZXR1cm5zIFRoZSBwYXJlbnQgZm9sZGVyOyBgJydgIGZvciB0aGUgdmF1bHQgcm9vdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmVudFBhdGgocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgaW5kZXggPSBwYXRoLmxhc3RJbmRleE9mKCcvJyk7XG4gIHJldHVybiBpbmRleCA9PT0gLTEgPyAnJyA6IHBhdGguc2xpY2UoMCwgaW5kZXgpO1xufVxuXG4vKipcbiAqIFRoZSBwYXJ0IG9mIGEgbWlzc2luZyBwYXRoIHRoYXQgYSBjYW5kaWRhdGUgcGF0aCByZXBsYWNlZCwgZm91bmQgYnkgZHJvcHBpbmcgdGhlIHBhdGggc2VnbWVudHMgdGhleSBlbmQgd2l0aFxuICogaW4gY29tbW9uLlxuICpcbiAqIEBwYXJhbSBvbGRQYXRoIC0gVGhlIG1pc3NpbmcgcGF0aC5cbiAqIEBwYXJhbSBuZXdQYXRoIC0gVGhlIGNhbmRpZGF0ZSBwYXRoLlxuICogQHJldHVybnMgVGhlIHByZWZpeGVzIHRoYXQgZGlmZmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGF0aE1hcHBpbmcob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBQYXRoTWFwcGluZyB7XG4gIGNvbnN0IG9sZFNlZ21lbnRzID0gb2xkUGF0aC5zcGxpdCgnLycpO1xuICBjb25zdCBuZXdTZWdtZW50cyA9IG5ld1BhdGguc3BsaXQoJy8nKTtcbiAgY29uc3Qgc3VmZml4TGVuZ3RoID0gZ2V0Q29tbW9uU3VmZml4TGVuZ3RoKG9sZFNlZ21lbnRzLCBuZXdTZWdtZW50cyk7XG4gIHJldHVybiB7XG4gICAgbmV3UHJlZml4OiBuZXdTZWdtZW50cy5zbGljZSgwLCBuZXdTZWdtZW50cy5sZW5ndGggLSBzdWZmaXhMZW5ndGgpLmpvaW4oJy8nKSxcbiAgICBvbGRQcmVmaXg6IG9sZFNlZ21lbnRzLnNsaWNlKDAsIG9sZFNlZ21lbnRzLmxlbmd0aCAtIHN1ZmZpeExlbmd0aCkuam9pbignLycpXG4gIH07XG59XG5cbmZ1bmN0aW9uIGFkZFRvTXVsdGlNYXA8S2V5LCBWYWx1ZT4obWFwOiBNYXA8S2V5LCBWYWx1ZVtdPiwga2V5OiBLZXksIHZhbHVlOiBWYWx1ZSk6IHZvaWQge1xuICBsZXQgdmFsdWVzID0gbWFwLmdldChrZXkpO1xuICBpZiAoIXZhbHVlcykge1xuICAgIHZhbHVlcyA9IFtdO1xuICAgIG1hcC5zZXQoa2V5LCB2YWx1ZXMpO1xuICB9XG4gIHZhbHVlcy5wdXNoKHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29tbW9uU3VmZml4TGVuZ3RoKHNlZ21lbnRzMTogcmVhZG9ubHkgc3RyaW5nW10sIHNlZ21lbnRzMjogcmVhZG9ubHkgc3RyaW5nW10pOiBudW1iZXIge1xuICBsZXQgbGVuZ3RoID0gMDtcbiAgd2hpbGUgKGxlbmd0aCA8IHNlZ21lbnRzMS5sZW5ndGggJiYgbGVuZ3RoIDwgc2VnbWVudHMyLmxlbmd0aCAmJiBzZWdtZW50czEuYXQoLWxlbmd0aCAtIDEpID09PSBzZWdtZW50czIuYXQoLWxlbmd0aCAtIDEpKSB7XG4gICAgbGVuZ3RoKys7XG4gIH1cbiAgcmV0dXJuIGxlbmd0aDtcbn1cblxuZnVuY3Rpb24gZ2V0RXZpZGVuY2VSYW5rKGV2aWRlbmNlOiBCcm9rZW5MaW5rRXZpZGVuY2UpOiBudW1iZXIge1xuICByZXR1cm4gRVZJREVOQ0VfS0lORF9PUkRFUi5pbmRleE9mKGV2aWRlbmNlLmtpbmQpO1xufVxuXG5mdW5jdGlvbiBnZXROYW1lKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLnNsaWNlKHBhdGgubGFzdEluZGV4T2YoJy8nKSArIDEpO1xufVxuXG4vLyBUaGUgZm9sZGVyIGlzIG5ldmVyIHRoZSB2YXVsdCByb290IGhlcmU6IGEgbWlzc2luZyBzdWJ0cmVlJ3Mgcm9vdCBpcyBhIG1pc3NpbmcgZm9sZGVyLCBhbmQgaXRzIHNpYmxpbmdzIGFyZVxuLy8gZm9sZGVycyB0b28uXG5mdW5jdGlvbiBnZXRSZWxhdGl2ZVBhdGgoZm9sZGVyOiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLnNsaWNlKGZvbGRlci5sZW5ndGggKyAxKTtcbn1cblxuZnVuY3Rpb24gam9pblBhdGgoZm9sZGVyOiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtmb2xkZXJ9LyR7cGF0aH1gO1xufVxuXG5mdW5jdGlvbiBzb3J0Q2FuZGlkYXRlcyhldmlkZW5jZUJ5UGF0aDogUmVhZG9ubHlNYXA8c3RyaW5nLCBCcm9rZW5MaW5rRXZpZGVuY2VbXT4pOiBCcm9rZW5MaW5rQ2FuZGlkYXRlW10ge1xuICBjb25zdCBjYW5kaWRhdGVzID0gWy4uLmV2aWRlbmNlQnlQYXRoXS5tYXAoKFtwYXRoLCBldmlkZW5jZV0pID0+ICh7XG4gICAgZXZpZGVuY2U6IGV2aWRlbmNlLnNvcnQoKGV2aWRlbmNlMSwgZXZpZGVuY2UyKSA9PiBnZXRFdmlkZW5jZVJhbmsoZXZpZGVuY2UxKSAtIGdldEV2aWRlbmNlUmFuayhldmlkZW5jZTIpKSxcbiAgICBwYXRoXG4gIH0pKTtcblxuICByZXR1cm4gY2FuZGlkYXRlcy5zb3J0KChjYW5kaWRhdGUxLCBjYW5kaWRhdGUyKSA9PiB7XG4gICAgY29uc3QgcmFua0RpZmZlcmVuY2UgPSBnZXRFdmlkZW5jZVJhbmsoZW5zdXJlTm9uTnVsbGFibGUoY2FuZGlkYXRlMS5ldmlkZW5jZVswXSkpIC0gZ2V0RXZpZGVuY2VSYW5rKGVuc3VyZU5vbk51bGxhYmxlKGNhbmRpZGF0ZTIuZXZpZGVuY2VbMF0pKTtcbiAgICByZXR1cm4gcmFua0RpZmZlcmVuY2UgfHwgY2FuZGlkYXRlMS5wYXRoLmxvY2FsZUNvbXBhcmUoY2FuZGlkYXRlMi5wYXRoKTtcbiAgfSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBWUEsU0FBUyx5QkFBeUI7QUFPM0IsSUFBSyx5QkFBTCxrQkFBS0EsNEJBQUw7QUFJTCxFQUFBQSx3QkFBQSxXQUFRO0FBS1IsRUFBQUEsd0JBQUEsZ0JBQWE7QUFLYixFQUFBQSx3QkFBQSxlQUFZO0FBS1osRUFBQUEsd0JBQUEsbUJBQWdCO0FBS2hCLEVBQUFBLHdCQUFBLGNBQVc7QUFLWCxFQUFBQSx3QkFBQSxXQUFRO0FBN0JFLFNBQUFBO0FBQUEsR0FBQTtBQW1DWixNQUFNLGdDQUFnQztBQUV0QyxNQUFNLHNCQUF5RDtBQUFBLEVBQzdEO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRjtBQTRHTyxNQUFNLDBCQUEwQjtBQUFBLEVBQ3BCO0FBQUEsRUFDQSx1QkFBdUIsb0JBQUksSUFBc0I7QUFBQSxFQUNqRDtBQUFBLEVBQ0EsdUJBQXVCLG9CQUFJLElBQXNCO0FBQUEsRUFDakQsY0FBYyxvQkFBSSxJQUFzQjtBQUFBLEVBQ3hDO0FBQUEsRUFDQSxjQUFjLG9CQUFJLElBQVksQ0FBQyxFQUFFLENBQUM7QUFBQSxFQUNsQztBQUFBLEVBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPVixZQUFZLFFBQW9EO0FBQ3JFLFNBQUssZ0JBQWdCLE9BQU87QUFDNUIsU0FBSyxjQUFjLElBQUksSUFBSSxPQUFPLFNBQVM7QUFDM0MsU0FBSyxzQkFBc0IsSUFBSSxJ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
@@ -45,7 +45,7 @@ export declare const BUG_REPORT_ISSUE_FORM_TEMPLATE = "bug_report.yml";
45
45
  */
46
46
  export interface BugReportEnvironment {
47
47
  /**
48
- * The other enabled plugins, sorted by id.
48
+ * The other loaded plugins, sorted by id.
49
49
  */
50
50
  readonly enabledPlugins: readonly BugReportPluginInfo[];
51
51
  /**
@@ -56,7 +56,9 @@ async function getBugReportEnvironment(params) {
56
56
  const { app, pluginId } = params;
57
57
  const { installerVersion, operatingSystem } = await getAppAndOperatingSystem();
58
58
  return {
59
- enabledPlugins: [...app.plugins.enabledPlugins].filter((id) => id !== pluginId).sort().map((id) => getPluginInfo(app, id)),
59
+ // The loaded plugins, as Obsidian's Show debug info lists them: `enabledPlugins` also holds an id
60
+ // whose folder was deleted, or whose load failed.
61
+ enabledPlugins: Object.keys(app.plugins.plugins).filter((id) => id !== pluginId).sort().map((id) => getPluginInfo(app, id)),
60
62
  installerVersion,
61
63
  obsidianVersion: apiVersion,
62
64
  operatingSystem,
@@ -138,4 +140,4 @@ export {
138
140
  getBugReportIssueFormUrl,
139
141
  getGitHubIssueFormUrl
140
142
  };
141
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9idWctcmVwb3J0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBIZWxwZXJzIGZvciBhIHBsdWdpbidzIGJ1ZyByZXBvcnRzOiB0aGUgZW52aXJvbm1lbnQgYSByZXBvcnQgbmVlZHMsIGFuZCBhIGxpbmsgdG8gYSBHaXRIdWIgaXNzdWUgZm9ybVxuICogcHJlZmlsbGVkIHdpdGggaXQuXG4gKlxuICogQ3Jvc3MtcGxhdGZvcm0tbG9hZGFibGU6IHRoZSBkZXNrdG9wIG9wZXJhdGluZy1zeXN0ZW0gbG9va3VwIHJlYWRzIGBub2RlOm9zYCwgc28gaXQgaXMgaW1wb3J0ZWRcbiAqIGR5bmFtaWNhbGx5LCBvbiBkZXNrdG9wIG9ubHkuXG4gKlxuICogVGhlIGRlc2t0b3AgaW5zdGFsbGVyIHZlcnNpb24gaXMgYFBsYXRmb3JtLmJ1aWxkYCwgd2hpY2ggbm8gcHVibGljIHR5cGluZyBkZWNsYXJlczogT2JzaWRpYW4ncyBkZXNrdG9wXG4gKiBzdGFydHVwIHNldHMgaXQgZnJvbSBFbGVjdHJvbidzIGBhcHAuZ2V0VmVyc2lvbigpYCAocmVhZCBmcm9tIE9ic2lkaWFuIGAxLjE1LjBgKSwgc28gaXQgaXMgcmVhZFxuICogc3RydWN0dXJhbGx5IGhlcmUsIGFuZCByZWFkcyBhcyBgdW5rbm93bmAgaWYgYSBsYXRlciB2ZXJzaW9uIGRyb3BzIGl0LlxuICovXG5cbmltcG9ydCB0eXBlIHsgQXBwIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBhcGlWZXJzaW9uLFxuICBQbGF0Zm9ybVxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGdldE1vYmlsZUFwcEluZm8gfSBmcm9tICcuL21vYmlsZS1hcHAtaW5mby50cyc7XG5cbi8qKlxuICogVGhlIGlkcyBvZiB0aGUgYnVnLXJlcG9ydCBpc3N1ZSBmb3JtJ3MgZmllbGRzIHRoYXQge0BsaW5rIGdldEJ1Z1JlcG9ydElzc3VlRm9ybVVybH0gcHJlZmlsbHMuIEdpdEh1YlxuICogcHJlZmlsbHMgYSBmaWVsZCBmcm9tIGEgcXVlcnkgcGFyYW1ldGVyIG5hbWVkIGFmdGVyIHRoZSBmaWVsZCdzIGBpZGAsIHNvIGEgZm9ybSBtdXN0IGdpdmUgaXRzIGZpZWxkc1xuICogdGhlc2UgaWRzIGZvciB0aGVtIHRvIGJlIGZpbGxlZC5cbiAqL1xuZXhwb3J0IGVudW0gQnVnUmVwb3J0SXNzdWVGb3JtRmllbGRJZCB7XG4gIC8qKlxuICAgKiBUaGUgd2hvbGUgZW52aXJvbm1lbnQsIGFzIHtAbGluayBmb3JtYXRCdWdSZXBvcnRFbnZpcm9ubWVudH0gcmVuZGVycyBpdC5cbiAgICovXG4gIEVudmlyb25tZW50ID0gJ2Vudmlyb25tZW50JyxcblxuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIHZlcnNpb24uXG4gICAqL1xuICBPYnNpZGlhblZlcnNpb24gPSAnb2JzaWRpYW4tdmVyc2lvbicsXG5cbiAgLyoqXG4gICAqIFRoZSBvcGVyYXRpbmcgc3lzdGVtLlxuICAgKi9cbiAgT3BlcmF0aW5nU3lzdGVtID0gJ29wZXJhdGluZy1zeXN0ZW0nLFxuXG4gIC8qKlxuICAgKiBUaGUgcmVwb3J0aW5nIHBsdWdpbidzIHZlcnNpb24uXG4gICAqL1xuICBQbHVnaW5WZXJzaW9uID0gJ3BsdWdpbi12ZXJzaW9uJ1xufVxuXG4vKipcbiAqIFRoZSBmaWxlIG5hbWUgb2YgdGhlIGJ1Zy1yZXBvcnQgaXNzdWUgZm9ybSwgdW5kZXIgYC5naXRodWIvSVNTVUVfVEVNUExBVEVgLlxuICovXG5leHBvcnQgY29uc3QgQlVHX1JFUE9SVF9JU1NVRV9GT1JNX1RFTVBMQVRFID0gJ2J1Z19yZXBvcnQueW1sJztcblxuLyoqXG4gKiBUaGUgZW52aXJvbm1lbnQgYSBidWcgcmVwb3J0IG5lZWRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Z1JlcG9ydEVudmlyb25tZW50IHtcbiAgLyoqXG4gICAqIFRoZSBvdGhlciBlbmFibGVkIHBsdWdpbnMsIHNvcnRlZCBieSBpZC5cbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWRQbHVnaW5zOiByZWFkb25seSBCdWdSZXBvcnRQbHVnaW5JbmZvW107XG5cbiAgLyoqXG4gICAqIFRoZSBpbnN0YWxsZWQgYXBwJ3MgdmVyc2lvbiwgd2hpY2ggY2FuIGxhZyBiZWhpbmQge0BsaW5rIG9ic2lkaWFuVmVyc2lvbn0uXG4gICAqL1xuICByZWFkb25seSBpbnN0YWxsZXJWZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiB2ZXJzaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgb2JzaWRpYW5WZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvcGVyYXRpbmcgc3lzdGVtJ3MgbmFtZSBhbmQgdmVyc2lvbi5cbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdGluZ1N5c3RlbTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGxhdGZvcm06IGBBbmRyb2lkYCwgYGlPU2AsIGBtYWNPU2AsIGBXaW5kb3dzYCwgYExpbnV4YCBvciBgdW5rbm93bmAuXG4gICAqL1xuICByZWFkb25seSBwbGF0Zm9ybTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVwb3J0aW5nIHBsdWdpbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbjogQnVnUmVwb3J0UGx1Z2luSW5mbztcbn1cblxuLyoqXG4gKiBBIHBsdWdpbiwgYXMgYSBidWcgcmVwb3J0IG5hbWVzIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Z1JlcG9ydFBsdWdpbkluZm8ge1xuICAvKipcbiAgICogVGhlIHBsdWdpbidzIGlkLlxuICAgKi9cbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBsdWdpbidzIGluc3RhbGxlZCB2ZXJzaW9uLCBvciBgbnVsbGAgd2hlbiBpdHMgbWFuaWZlc3QgaXMgbm90IGtub3duLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbjogbnVsbCB8IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0QnVnUmVwb3J0RW52aXJvbm1lbnR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEJ1Z1JlcG9ydEVudmlyb25tZW50UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSByZXBvcnRpbmcgcGx1Z2luLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0QnVnUmVwb3J0SXNzdWVGb3JtVXJsfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRCdWdSZXBvcnRJc3N1ZUZvcm1VcmxQYXJhbXMgZXh0ZW5kcyBHZXRCdWdSZXBvcnRFbnZpcm9ubWVudFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luJ3MgR2l0SHViIHJlcG9zaXRvcnksIGFzIGBvd25lci9uYW1lYC5cbiAgICovXG4gIHJlYWRvbmx5IGdpdEh1YlJlcG86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGlzc3VlJ3MgdGl0bGUuIExlYXZlIGl0IG91dCB0byBrZWVwIHRoZSBmb3JtJ3Mgb3duIGRlZmF1bHQgdGl0bGUuXG4gICAqL1xuICByZWFkb25seSB0aXRsZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0R2l0SHViSXNzdWVGb3JtVXJsfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRHaXRIdWJJc3N1ZUZvcm1VcmxQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHZhbHVlcyB0byBwcmVmaWxsLCBrZXllZCBieSBmaWVsZCBgaWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgZmllbGRzPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG5cbiAgLyoqXG4gICAqIFRoZSBHaXRIdWIgcmVwb3NpdG9yeSwgYXMgYG93bmVyL25hbWVgLlxuICAgKi9cbiAgcmVhZG9ubHkgZ2l0SHViUmVwbzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9ybSdzIGZpbGUgbmFtZSwgdW5kZXIgYC5naXRodWIvSVNTVUVfVEVNUExBVEVgLlxuICAgKi9cbiAgcmVhZG9ubHkgdGVtcGxhdGU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGlzc3VlJ3MgdGl0bGUuIExlYXZlIGl0IG91dCB0byBrZWVwIHRoZSBmb3JtJ3Mgb3duIGRlZmF1bHQgdGl0bGUuXG4gICAqL1xuICByZWFkb25seSB0aXRsZT86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEFwcEFuZE9wZXJhdGluZ1N5c3RlbSB7XG4gIHJlYWRvbmx5IGluc3RhbGxlclZlcnNpb246IHN0cmluZztcbiAgcmVhZG9ubHkgb3BlcmF0aW5nU3lzdGVtOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBQbGF0Zm9ybVdpdGhCdWlsZCB7XG4gIHJlYWRvbmx5IGJ1aWxkPzogdW5rbm93bjtcbn1cblxuY29uc3QgVU5LTk9XTiA9ICd1bmtub3duJztcblxuLyoqXG4gKiBSZW5kZXJzIGEgYnVnIHJlcG9ydCdzIGVudmlyb25tZW50IGFzIGEgTWFya2Rvd24gbGlzdC5cbiAqXG4gKiBAcGFyYW0gZW52aXJvbm1lbnQgLSBUaGUgZW52aXJvbm1lbnQuXG4gKiBAcmV0dXJucyBUaGUgTWFya2Rvd24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRCdWdSZXBvcnRFbnZpcm9ubWVudChlbnZpcm9ubWVudDogQnVnUmVwb3J0RW52aXJvbm1lbnQpOiBzdHJpbmcge1xuICBjb25zdCBlbmFibGVkUGx1Z2lucyA9IGVudmlyb25tZW50LmVuYWJsZWRQbHVnaW5zLmxlbmd0aCA9PT0gMFxuICAgID8gJ25vbmUnXG4gICAgOiBlbnZpcm9ubWVudC5lbmFibGVkUGx1Z2lucy5tYXAoKHBsdWdpbkluZm8pID0+IGZvcm1hdFBsdWdpbkluZm8ocGx1Z2luSW5mbykpLmpvaW4oJywgJyk7XG5cbiAgcmV0dXJuIGAtIFBsdWdpbjogJHtmb3JtYXRQbHVnaW5JbmZvKGVudmlyb25tZW50LnBsdWdpbil9XFxuYFxuICAgICsgYC0gT2JzaWRpYW46ICR7ZW52aXJvbm1lbnQub2JzaWRpYW5WZXJzaW9ufSAoaW5zdGFsbGVyICR7ZW52aXJvbm1lbnQuaW5zdGFsbGVyVmVyc2lvbn0pXFxuYFxuICAgICsgYC0gUGxhdGZvcm06ICR7ZW52aXJvbm1lbnQucGxhdGZvcm19XFxuYFxuICAgICsgYC0gT3BlcmF0aW5nIHN5c3RlbTogJHtlbnZpcm9ubWVudC5vcGVyYXRpbmdTeXN0ZW19XFxuYFxuICAgICsgYC0gT3RoZXIgZW5hYmxlZCBwbHVnaW5zOiAke2VuYWJsZWRQbHVnaW5zfWA7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgZW52aXJvbm1lbnQgYSBidWcgcmVwb3J0IG5lZWRzOiB0aGUgcGx1Z2luJ3MgdmVyc2lvbiwgdGhlIG90aGVyIGVuYWJsZWQgcGx1Z2lucywgdGhlXG4gKiBPYnNpZGlhbiBhbmQgaW5zdGFsbGVyIHZlcnNpb25zLCB0aGUgcGxhdGZvcm0gYW5kIHRoZSBvcGVyYXRpbmcgc3lzdGVtLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIFRoZSBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJ1Z1JlcG9ydEVudmlyb25tZW50KHBhcmFtczogR2V0QnVnUmVwb3J0RW52aXJvbm1lbnRQYXJhbXMpOiBQcm9taXNlPEJ1Z1JlcG9ydEVudmlyb25tZW50PiB7XG4gIGNvbnN0IHsgYXBwLCBwbHVnaW5JZCB9ID0gcGFyYW1zO1xuICBjb25zdCB7IGluc3RhbGxlclZlcnNpb24sIG9wZXJhdGluZ1N5c3RlbSB9ID0gYXdhaXQgZ2V0QXBwQW5kT3BlcmF0aW5nU3lzdGVtKCk7XG5cbiAgcmV0dXJuIHtcbiAgICBlbmFibGVkUGx1Z2luczogWy4uLmFwcC5wbHVnaW5zLmVuYWJsZWRQbHVnaW5zXVxuICAgICAgLmZpbHRlcigoaWQpID0+IGlkICE9PSBwbHVnaW5JZClcbiAgICAgIC5zb3J0KClcbiAgICAgIC5tYXAoKGlkKSA9PiBnZXRQbHVnaW5JbmZvKGFwcCwgaWQpKSxcbiAgICBpbnN0YWxsZXJWZXJzaW9uLFxuICAgIG9ic2lkaWFuVmVyc2lvbjogYXBpVmVyc2lvbixcbiAgICBvcGVyYXRpbmdTeXN0ZW0sXG4gICAgcGxhdGZvcm06IGdldFBsYXRmb3JtTmFtZSgpLFxuICAgIHBsdWdpbjogZ2V0UGx1Z2luSW5mbyhhcHAsIHBsdWdpbklkKVxuICB9O1xufVxuXG4vKipcbiAqIEdldHMgYSBsaW5rIHRvIGEgcGx1Z2luJ3MgYnVnLXJlcG9ydCBpc3N1ZSBmb3JtICh7QGxpbmsgQlVHX1JFUE9SVF9JU1NVRV9GT1JNX1RFTVBMQVRFfSksIHByZWZpbGxlZCB3aXRoXG4gKiB0aGUgZW52aXJvbm1lbnQsIGluIHRoZSBmaWVsZHMge0BsaW5rIEJ1Z1JlcG9ydElzc3VlRm9ybUZpZWxkSWR9IG5hbWVzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIFRoZSBsaW5rLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QnVnUmVwb3J0SXNzdWVGb3JtVXJsKHBhcmFtczogR2V0QnVnUmVwb3J0SXNzdWVGb3JtVXJsUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZW52aXJvbm1lbnQgPSBhd2FpdCBnZXRCdWdSZXBvcnRFbnZpcm9ubWVudChwYXJhbXMpO1xuXG4gIHJldHVybiBnZXRHaXRIdWJJc3N1ZUZvcm1Vcmwoe1xuICAgIGZpZWxkczoge1xuICAgICAgW0J1Z1JlcG9ydElzc3VlRm9ybUZpZWxkSWQuRW52aXJvbm1lbnRdOiBmb3JtYXRCdWdSZXBvcnRFbnZpcm9ubWVudChlbnZpcm9ubWVudCksXG4gICAgICBbQnVnUmVwb3J0SXNzdWVGb3JtRmllbGRJZC5PYnNpZGlhblZlcnNpb25dOiBlbnZpcm9ubWVudC5vYnNpZGlhblZlcnNpb24sXG4gICAgICBbQnVnUmVwb3J0SXNzdWVGb3JtRmllbGRJZC5PcGVyYXRpbmdTeXN0ZW1dOiBlbnZpcm9ubWVudC5vcGVyYXRpbmdTeXN0ZW0sXG4gICAgICBbQnVnUmVwb3J0SXNzdWVGb3JtRmllbGRJZC5QbHVnaW5WZXJzaW9uXTogZW52aXJvbm1lbnQucGx1Z2luLnZlcnNpb24gPz8gVU5LTk9XTlxuICAgIH0sXG4gICAgZ2l0SHViUmVwbzogcGFyYW1zLmdpdEh1YlJlcG8sXG4gICAgdGVtcGxhdGU6IEJVR19SRVBPUlRfSVNTVUVfRk9STV9URU1QTEFURSxcbiAgICAuLi5wYXJhbXMudGl0bGUgIT09IHVuZGVmaW5lZCAmJiB7IHRpdGxlOiBwYXJhbXMudGl0bGUgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBHZXRzIGEgbGluayB0aGF0IG9wZW5zIGEgR2l0SHViIGlzc3VlIGZvcm0gd2l0aCBmaWVsZHMgcHJlZmlsbGVkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIFRoZSBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2l0SHViSXNzdWVGb3JtVXJsKHBhcmFtczogR2V0R2l0SHViSXNzdWVGb3JtVXJsUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3Qgc2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7IHRlbXBsYXRlOiBwYXJhbXMudGVtcGxhdGUgfSk7XG4gIGlmIChwYXJhbXMudGl0bGUgIT09IHVuZGVmaW5lZCkge1xuICAgIHNlYXJjaFBhcmFtcy5zZXQoJ3RpdGxlJywgcGFyYW1zLnRpdGxlKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgW2ZpZWxkSWQsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwYXJhbXMuZmllbGRzID8/IHt9KSkge1xuICAgIHNlYXJjaFBhcmFtcy5zZXQoZmllbGRJZCwgdmFsdWUpO1xuICB9XG5cbiAgcmV0dXJuIGBodHRwczovL2dpdGh1Yi5jb20vJHtwYXJhbXMuZ2l0SHViUmVwb30vaXNzdWVzL25ldz8ke3NlYXJjaFBhcmFtcy50b1N0cmluZygpfWA7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFBsdWdpbkluZm8ocGx1Z2luSW5mbzogQnVnUmVwb3J0UGx1Z2luSW5mbyk6IHN0cmluZyB7XG4gIHJldHVybiBgXFxgJHtwbHVnaW5JbmZvLmlkfVxcYCAke3BsdWdpbkluZm8udmVyc2lvbiA/PyBVTktOT1dOfWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEFwcEFuZE9wZXJhdGluZ1N5c3RlbSgpOiBQcm9taXNlPEFwcEFuZE9wZXJhdGluZ1N5c3RlbT4ge1xuICBpZiAoUGxhdGZvcm0uaXNNb2JpbGVBcHApIHtcbiAgICBjb25zdCBtb2JpbGVBcHBJbmZvID0gYXdhaXQgZ2V0TW9iaWxlQXBwSW5mbygpO1xuICAgIHJldHVybiB7XG4gICAgICBpbnN0YWxsZXJWZXJzaW9uOiBtb2JpbGVBcHBJbmZvPy5pbnN0YWxsZXJWZXJzaW9uID8/IFVOS05PV04sXG4gICAgICBvcGVyYXRpbmdTeXN0ZW06IG1vYmlsZUFwcEluZm8/Lm9wZXJhdGluZ1N5c3RlbSA/PyBVTktOT1dOXG4gICAgfTtcbiAgfVxuXG4gIGlmICghUGxhdGZvcm0uaXNEZXNrdG9wQXBwKSB7XG4gICAgcmV0dXJuIHsgaW5zdGFsbGVyVmVyc2lvbjogVU5LTk9XTiwgb3BlcmF0aW5nU3lzdGVtOiBVTktOT1dOIH07XG4gIH1cblxuICAvLyBDb25kaXRpb25hbCBpbXBvcnQgb2YgdGhlIGRlc2t0b3Atb25seSBsb29rdXAsIHdoaWNoIHJlYWRzIGBub2RlOm9zYDsgdGhpcyBicmFuY2ggcnVucyBvbmx5IG9uIGRlc2t0b3AuXG4gIGNvbnN0IHsgZ2V0RGVza3RvcE9wZXJhdGluZ1N5c3RlbSB9ID0gYXdhaXQgaW1wb3J0KCcuL2Rlc2t0b3Atb3BlcmF0aW5nLXN5c3RlbS50cycpO1xuICBjb25zdCBidWlsZCA9IChQbGF0Zm9ybSBhcyBQbGF0Zm9ybVdpdGhCdWlsZCkuYnVpbGQ7XG4gIHJldHVybiB7XG4gICAgaW5zdGFsbGVyVmVyc2lvbjogdHlwZW9mIGJ1aWxkID09PSAnc3RyaW5nJyA/IGJ1aWxkIDogVU5LTk9XTixcbiAgICBvcGVyYXRpbmdTeXN0ZW06IGdldERlc2t0b3BPcGVyYXRpbmdTeXN0ZW0oKVxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRQbGF0Zm9ybU5hbWUoKTogc3RyaW5nIHtcbiAgaWYgKFBsYXRmb3JtLmlzQW5kcm9pZEFwcCkge1xuICAgIHJldHVybiAnQW5kcm9pZCc7XG4gIH1cbiAgaWYgKFBsYXRmb3JtLmlzSW9zQXBwKSB7XG4gICAgcmV0dXJuICdpT1MnO1xuICB9XG4gIGlmIChQbGF0Zm9ybS5pc01hY09TKSB7XG4gICAgcmV0dXJuICdtYWNPUyc7XG4gIH1cbiAgaWYgKFBsYXRmb3JtLmlzV2luKSB7XG4gICAgcmV0dXJuICdXaW5kb3dzJztcbiAgfVxuICByZXR1cm4gUGxhdGZvcm0uaXNMaW51eCA/ICdMaW51eCcgOiBVTktOT1dOO1xufVxuXG5mdW5jdGlvbiBnZXRQbHVnaW5JbmZvKGFwcDogQXBwLCBwbHVnaW5JZDogc3RyaW5nKTogQnVnUmVwb3J0UGx1Z2luSW5mbyB7XG4gIHJldHVybiB7XG4gICAgaWQ6IHBsdWdpbklkLFxuICAgIHZlcnNpb246IGFwcC5wbHVnaW5zLm1hbmlmZXN0c1twbHVnaW5JZF0/LnZlcnNpb24gPz8gbnVsbFxuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWdCQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQLFNBQVMsd0JBQXdCO0FBTzFCLElBQUssNEJBQUwsa0JBQUtBLCtCQUFMO0FBSUwsRUFBQUEsMkJBQUEsaUJBQWM7QUFLZCxFQUFBQSwyQkFBQSxxQkFBa0I7QUFLbEIsRUFBQUEsMkJBQUEscUJBQWtCO0FBS2xCLEVBQUFBLDJCQUFBLG1CQUFnQjtBQW5CTixTQUFBQTtBQUFBLEdBQUE7QUF5QkwsTUFBTSxpQ0FBaUM7QUFvSDlDLE1BQU0sVUFBVTtBQVFULFNBQVMsMkJBQTJCLGFBQTJDO0FBQ3BGLFFBQU0saUJBQWlCLFlBQVksZUFBZSxXQUFXLElBQ3pELFNBQ0EsWUFBWSxlQUFlLElBQUksQ0FBQyxlQUFlLGlCQUFpQixVQUFVLENBQUMsRUFBRSxLQUFLLElBQUk7QUFFMUYsU0FBTyxhQUFhLGlCQUFpQixZQUFZLE1BQU0sQ0FBQztBQUFBLGNBQ3JDLFlBQVksZUFBZSxlQUFlLFlBQVksZ0JBQWdCO0FBQUEsY0FDdEUsWUFBWSxRQUFRO0FBQUEsc0JBQ1osWUFBWSxlQUFlO0FBQUEsMkJBQ3RCLGNBQWM7QUFDaEQ7QUFTQSxlQUFzQix3QkFBd0IsUUFBc0U7QUFDbEgsUUFBTSxFQUFFLEtBQUssU0FBUyxJQUFJO0FBQzFCLFFBQU0sRUFBRSxrQkFBa0IsZ0JBQWdCLElBQUksTUFBTSx5QkFBeUI7QUFFN0UsU0FBTztBQUFBLElBQ0wsZ0JBQWdCLENBQUMsR0FBRyxJQUFJLFFBQVEsY0FBYyxFQUMzQyxPQUFPLENBQUMsT0FBTyxPQUFPLFFBQVEsRUFDOUIsS0FBSyxFQUNMLElBQUksQ0FBQyxPQUFPLGNBQWMsS0FBSyxFQUFFLENBQUM7QUFBQSxJQUNyQztBQUFBLElBQ0EsaUJBQWlCO0FBQUEsSUFDakI7QUFBQSxJQUNBLFVBQVUsZ0JBQWdCO0FBQUEsSUFDMUIsUUFBUSxjQUFjLEtBQUssUUFBUTtBQUFBLEVBQ3JDO0FBQ0Y7QUFTQSxlQUFzQix5QkFBeUIsUUFBeUQ7QUFDdEcsUUFBTSxjQUFjLE1BQU0sd0JBQXdCLE1BQU07QUFFeEQsU0FBTyxzQkFBc0I7QUFBQSxJQUMzQixRQUFRO0FBQUEsTUFDTixDQUFDLCtCQUFxQyxHQUFHLDJCQUEyQixXQUFXO0FBQUEsTUFDL0UsQ0FBQyx3Q0FBeUMsR0FBRyxZQUFZO0FBQUEsTUFDekQsQ0FBQyx3Q0FBeUMsR0FBRyxZQUFZO0FBQUEsTUFDekQsQ0FBQyxvQ0FBdUMsR0FBRyxZQUFZLE9BQU8sV0FBVztBQUFBLElBQzNFO0FBQUEsSUFDQSxZQUFZLE9BQU87QUFBQSxJQUNuQixVQUFVO0FBQUEsSUFDVixHQUFHLE9BQU8sVUFBVSxVQUFhLEVBQUUsT0FBTyxPQUFPLE1BQU07QUFBQSxFQUN6RCxDQUFDO0FBQ0g7QUFRTyxTQUFTLHNCQUFzQixRQUE2QztBQUNqRixRQUFNLGVBQWUsSUFBSSxnQkFBZ0IsRUFBRSxVQUFVLE9BQU8sU0FBUyxDQUFDO0FBQ3RFLE1BQUksT0FBTyxVQUFVLFFBQVc7QUFDOUIsaUJBQWEsSUFBSSxTQUFTLE9BQU8sS0FBSztBQUFBLEVBQ3hDO0FBRUEsYUFBVyxDQUFDLFNBQVMsS0FBSyxLQUFLLE9BQU8sUUFBUSxPQUFPLFVBQVUsQ0FBQyxDQUFDLEdBQUc7QUFDbEUsaUJBQWEsSUFBSSxTQUFTLEtBQUs7QUFBQSxFQUNqQztBQUVBLFNBQU8sc0JBQXNCLE9BQU8sVUFBVSxlQUFlLGFBQWEsU0FBUyxDQUFDO0FBQ3RGO0FBRUEsU0FBUyxpQkFBaUIsWUFBeUM7QUFDakUsU0FBTyxLQUFLLFdBQVcsRUFBRSxNQUFNLFdBQVcsV0FBVyxPQUFPO0FBQzlEO0FBRUEsZUFBZSwyQkFBMkQ7QUFDeEUsTUFBSSxTQUFTLGFBQWE7QUFDeEIsVUFBTSxnQkFBZ0IsTUFBTSxpQkFBaUI7QUFDN0MsV0FBTztBQUFBLE1BQ0wsa0JBQWtCLGVBQWUsb0JBQW9CO0FBQUEsTUFDckQsaUJBQWlCLGVBQWUsbUJBQW1CO0FBQUEsSUFDckQ7QUFBQSxFQUNGO0FBRUEsTUFBSSxDQUFDLFNBQVMsY0FBYztBQUMxQixXQUFPLEVBQUUsa0JBQWtCLFNBQVMsaUJBQWlCLFFBQVE7QUFBQSxFQUMvRDtBQUdBLFFBQU0sRUFBRSwwQkFBMEIsSUFBSSxNQUFNLE9BQU8sK0JBQStCO0FBQ2xGLFFBQU0sUUFBUyxTQUErQjtBQUM5QyxTQUFPO0FBQUEsSUFDTCxrQkFBa0IsT0FBTyxVQUFVLFdBQVcsUUFBUTtBQUFBLElBQ3RELGlCQUFpQiwwQkFBMEI7QUFBQSxFQUM3QztBQUNGO0FBRUEsU0FBUyxrQkFBMEI7QUFDakMsTUFBSSxTQUFTLGNBQWM7QUFDekIsV0FBTztBQUFBLEVBQ1Q7QUFDQSxNQUFJLFNBQVMsVUFBVTtBQUNyQixXQUFPO0FBQUEsRUFDVDtBQUNBLE1BQUksU0FBUyxTQUFTO0FBQ3BCLFdBQU87QUFBQSxFQUNUO0FBQ0EsTUFBSSxTQUFTLE9BQU87QUFDbEIsV0FBTztBQUFBLEVBQ1Q7QUFDQSxTQUFPLFNBQVMsVUFBVSxVQUFVO0FBQ3RDO0FBRUEsU0FBUyxjQUFjLEtBQVUsVUFBdUM7QUFDdEUsU0FBTztBQUFBLElBQ0wsSUFBSTtBQUFBLElBQ0osU0FBUyxJQUFJLFFBQVEsVUFBVSxRQUFRLEdBQUcsV0FBVztBQUFBLEVBQ3ZEO0FBQ0Y7IiwibmFtZXMiOlsiQnVnUmVwb3J0SXNzdWVGb3JtRmllbGRJZCJdfQ==
143
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9idWctcmVwb3J0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBIZWxwZXJzIGZvciBhIHBsdWdpbidzIGJ1ZyByZXBvcnRzOiB0aGUgZW52aXJvbm1lbnQgYSByZXBvcnQgbmVlZHMsIGFuZCBhIGxpbmsgdG8gYSBHaXRIdWIgaXNzdWUgZm9ybVxuICogcHJlZmlsbGVkIHdpdGggaXQuXG4gKlxuICogQ3Jvc3MtcGxhdGZvcm0tbG9hZGFibGU6IHRoZSBkZXNrdG9wIG9wZXJhdGluZy1zeXN0ZW0gbG9va3VwIHJlYWRzIGBub2RlOm9zYCwgc28gaXQgaXMgaW1wb3J0ZWRcbiAqIGR5bmFtaWNhbGx5LCBvbiBkZXNrdG9wIG9ubHkuXG4gKlxuICogVGhlIGRlc2t0b3AgaW5zdGFsbGVyIHZlcnNpb24gaXMgYFBsYXRmb3JtLmJ1aWxkYCwgd2hpY2ggbm8gcHVibGljIHR5cGluZyBkZWNsYXJlczogT2JzaWRpYW4ncyBkZXNrdG9wXG4gKiBzdGFydHVwIHNldHMgaXQgZnJvbSBFbGVjdHJvbidzIGBhcHAuZ2V0VmVyc2lvbigpYCAocmVhZCBmcm9tIE9ic2lkaWFuIGAxLjE1LjBgKSwgc28gaXQgaXMgcmVhZFxuICogc3RydWN0dXJhbGx5IGhlcmUsIGFuZCByZWFkcyBhcyBgdW5rbm93bmAgaWYgYSBsYXRlciB2ZXJzaW9uIGRyb3BzIGl0LlxuICovXG5cbmltcG9ydCB0eXBlIHsgQXBwIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBhcGlWZXJzaW9uLFxuICBQbGF0Zm9ybVxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGdldE1vYmlsZUFwcEluZm8gfSBmcm9tICcuL21vYmlsZS1hcHAtaW5mby50cyc7XG5cbi8qKlxuICogVGhlIGlkcyBvZiB0aGUgYnVnLXJlcG9ydCBpc3N1ZSBmb3JtJ3MgZmllbGRzIHRoYXQge0BsaW5rIGdldEJ1Z1JlcG9ydElzc3VlRm9ybVVybH0gcHJlZmlsbHMuIEdpdEh1YlxuICogcHJlZmlsbHMgYSBmaWVsZCBmcm9tIGEgcXVlcnkgcGFyYW1ldGVyIG5hbWVkIGFmdGVyIHRoZSBmaWVsZCdzIGBpZGAsIHNvIGEgZm9ybSBtdXN0IGdpdmUgaXRzIGZpZWxkc1xuICogdGhlc2UgaWRzIGZvciB0aGVtIHRvIGJlIGZpbGxlZC5cbiAqL1xuZXhwb3J0IGVudW0gQnVnUmVwb3J0SXNzdWVGb3JtRmllbGRJZCB7XG4gIC8qKlxuICAgKiBUaGUgd2hvbGUgZW52aXJvbm1lbnQsIGFzIHtAbGluayBmb3JtYXRCdWdSZXBvcnRFbnZpcm9ubWVudH0gcmVuZGVycyBpdC5cbiAgICovXG4gIEVudmlyb25tZW50ID0gJ2Vudmlyb25tZW50JyxcblxuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIHZlcnNpb24uXG4gICAqL1xuICBPYnNpZGlhblZlcnNpb24gPSAnb2JzaWRpYW4tdmVyc2lvbicsXG5cbiAgLyoqXG4gICAqIFRoZSBvcGVyYXRpbmcgc3lzdGVtLlxuICAgKi9cbiAgT3BlcmF0aW5nU3lzdGVtID0gJ29wZXJhdGluZy1zeXN0ZW0nLFxuXG4gIC8qKlxuICAgKiBUaGUgcmVwb3J0aW5nIHBsdWdpbidzIHZlcnNpb24uXG4gICAqL1xuICBQbHVnaW5WZXJzaW9uID0gJ3BsdWdpbi12ZXJzaW9uJ1xufVxuXG4vKipcbiAqIFRoZSBmaWxlIG5hbWUgb2YgdGhlIGJ1Zy1yZXBvcnQgaXNzdWUgZm9ybSwgdW5kZXIgYC5naXRodWIvSVNTVUVfVEVNUExBVEVgLlxuICovXG5leHBvcnQgY29uc3QgQlVHX1JFUE9SVF9JU1NVRV9GT1JNX1RFTVBMQVRFID0gJ2J1Z19yZXBvcnQueW1sJztcblxuLyoqXG4gKiBUaGUgZW52aXJvbm1lbnQgYSBidWcgcmVwb3J0IG5lZWRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1Z1JlcG9ydEVudmlyb25tZW50IHtcbiAgLyoqXG4gICAqIFRoZSBvdGhlciBsb2FkZWQgcGx1Z2lucywgc29ydGVkIGJ5IGlkLlxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZFBsdWdpbnM6IHJlYWRvbmx5IEJ1Z1JlcG9ydFBsdWdpbkluZm9bXTtcblxuICAvKipcbiAgICogVGhlIGluc3RhbGxlZCBhcHAncyB2ZXJzaW9uLCB3aGljaCBjYW4gbGFnIGJlaGluZCB7QGxpbmsgb2JzaWRpYW5WZXJzaW9ufS5cbiAgICovXG4gIHJlYWRvbmx5IGluc3RhbGxlclZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIHZlcnNpb24uXG4gICAqL1xuICByZWFkb25seSBvYnNpZGlhblZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9wZXJhdGluZyBzeXN0ZW0ncyBuYW1lIGFuZCB2ZXJzaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0aW5nU3lzdGVtOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwbGF0Zm9ybTogYEFuZHJvaWRgLCBgaU9TYCwgYG1hY09TYCwgYFdpbmRvd3NgLCBgTGludXhgIG9yIGB1bmtub3duYC5cbiAgICovXG4gIHJlYWRvbmx5IHBsYXRmb3JtOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZXBvcnRpbmcgcGx1Z2luLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luOiBCdWdSZXBvcnRQbHVnaW5JbmZvO1xufVxuXG4vKipcbiAqIEEgcGx1Z2luLCBhcyBhIGJ1ZyByZXBvcnQgbmFtZXMgaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVnUmVwb3J0UGx1Z2luSW5mbyB7XG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luJ3MgaWQuXG4gICAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luJ3MgaW5zdGFsbGVkIHZlcnNpb24sIG9yIGBudWxsYCB3aGVuIGl0cyBtYW5pZmVzdCBpcyBub3Qga25vd24uXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uOiBudWxsIHwgc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRCdWdSZXBvcnRFbnZpcm9ubWVudH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QnVnUmVwb3J0RW52aXJvbm1lbnRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIHJlcG9ydGluZyBwbHVnaW4uXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRCdWdSZXBvcnRJc3N1ZUZvcm1Vcmx9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEJ1Z1JlcG9ydElzc3VlRm9ybVVybFBhcmFtcyBleHRlbmRzIEdldEJ1Z1JlcG9ydEVudmlyb25tZW50UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4ncyBHaXRIdWIgcmVwb3NpdG9yeSwgYXMgYG93bmVyL25hbWVgLlxuICAgKi9cbiAgcmVhZG9ubHkgZ2l0SHViUmVwbzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaXNzdWUncyB0aXRsZS4gTGVhdmUgaXQgb3V0IHRvIGtlZXAgdGhlIGZvcm0ncyBvd24gZGVmYXVsdCB0aXRsZS5cbiAgICovXG4gIHJlYWRvbmx5IHRpdGxlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRHaXRIdWJJc3N1ZUZvcm1Vcmx9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEdpdEh1Yklzc3VlRm9ybVVybFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgdmFsdWVzIHRvIHByZWZpbGwsIGtleWVkIGJ5IGZpZWxkIGBpZGAuXG4gICAqL1xuICByZWFkb25seSBmaWVsZHM/OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcblxuICAvKipcbiAgICogVGhlIEdpdEh1YiByZXBvc2l0b3J5LCBhcyBgb3duZXIvbmFtZWAuXG4gICAqL1xuICByZWFkb25seSBnaXRIdWJSZXBvOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmb3JtJ3MgZmlsZSBuYW1lLCB1bmRlciBgLmdpdGh1Yi9JU1NVRV9URU1QTEFURWAuXG4gICAqL1xuICByZWFkb25seSB0ZW1wbGF0ZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaXNzdWUncyB0aXRsZS4gTGVhdmUgaXQgb3V0IHRvIGtlZXAgdGhlIGZvcm0ncyBvd24gZGVmYXVsdCB0aXRsZS5cbiAgICovXG4gIHJlYWRvbmx5IHRpdGxlPzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQXBwQW5kT3BlcmF0aW5nU3lzdGVtIHtcbiAgcmVhZG9ubHkgaW5zdGFsbGVyVmVyc2lvbjogc3RyaW5nO1xuICByZWFkb25seSBvcGVyYXRpbmdTeXN0ZW06IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFBsYXRmb3JtV2l0aEJ1aWxkIHtcbiAgcmVhZG9ubHkgYnVpbGQ/OiB1bmtub3duO1xufVxuXG5jb25zdCBVTktOT1dOID0gJ3Vua25vd24nO1xuXG4vKipcbiAqIFJlbmRlcnMgYSBidWcgcmVwb3J0J3MgZW52aXJvbm1lbnQgYXMgYSBNYXJrZG93biBsaXN0LlxuICpcbiAqIEBwYXJhbSBlbnZpcm9ubWVudCAtIFRoZSBlbnZpcm9ubWVudC5cbiAqIEByZXR1cm5zIFRoZSBNYXJrZG93bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEJ1Z1JlcG9ydEVudmlyb25tZW50KGVudmlyb25tZW50OiBCdWdSZXBvcnRFbnZpcm9ubWVudCk6IHN0cmluZyB7XG4gIGNvbnN0IGVuYWJsZWRQbHVnaW5zID0gZW52aXJvbm1lbnQuZW5hYmxlZFBsdWdpbnMubGVuZ3RoID09PSAwXG4gICAgPyAnbm9uZSdcbiAgICA6IGVudmlyb25tZW50LmVuYWJsZWRQbHVnaW5zLm1hcCgocGx1Z2luSW5mbykgPT4gZm9ybWF0UGx1Z2luSW5mbyhwbHVnaW5JbmZvKSkuam9pbignLCAnKTtcblxuICByZXR1cm4gYC0gUGx1Z2luOiAke2Zvcm1hdFBsdWdpbkluZm8oZW52aXJvbm1lbnQucGx1Z2luKX1cXG5gXG4gICAgKyBgLSBPYnNpZGlhbjogJHtlbnZpcm9ubWVudC5vYnNpZGlhblZlcnNpb259IChpbnN0YWxsZXIgJHtlbnZpcm9ubWVudC5pbnN0YWxsZXJWZXJzaW9ufSlcXG5gXG4gICAgKyBgLSBQbGF0Zm9ybTogJHtlbnZpcm9ubWVudC5wbGF0Zm9ybX1cXG5gXG4gICAgKyBgLSBPcGVyYXRpbmcgc3lzdGVtOiAke2Vudmlyb25tZW50Lm9wZXJhdGluZ1N5c3RlbX1cXG5gXG4gICAgKyBgLSBPdGhlciBlbmFibGVkIHBsdWdpbnM6ICR7ZW5hYmxlZFBsdWdpbnN9YDtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBlbnZpcm9ubWVudCBhIGJ1ZyByZXBvcnQgbmVlZHM6IHRoZSBwbHVnaW4ncyB2ZXJzaW9uLCB0aGUgb3RoZXIgZW5hYmxlZCBwbHVnaW5zLCB0aGVcbiAqIE9ic2lkaWFuIGFuZCBpbnN0YWxsZXIgdmVyc2lvbnMsIHRoZSBwbGF0Zm9ybSBhbmQgdGhlIG9wZXJhdGluZyBzeXN0ZW0uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgVGhlIGVudmlyb25tZW50LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QnVnUmVwb3J0RW52aXJvbm1lbnQocGFyYW1zOiBHZXRCdWdSZXBvcnRFbnZpcm9ubWVudFBhcmFtcyk6IFByb21pc2U8QnVnUmVwb3J0RW52aXJvbm1lbnQ+IHtcbiAgY29uc3QgeyBhcHAsIHBsdWdpbklkIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHsgaW5zdGFsbGVyVmVyc2lvbiwgb3BlcmF0aW5nU3lzdGVtIH0gPSBhd2FpdCBnZXRBcHBBbmRPcGVyYXRpbmdTeXN0ZW0oKTtcblxuICByZXR1cm4ge1xuICAgIC8vIFRoZSBsb2FkZWQgcGx1Z2lucywgYXMgT2JzaWRpYW4ncyBTaG93IGRlYnVnIGluZm8gbGlzdHMgdGhlbTogYGVuYWJsZWRQbHVnaW5zYCBhbHNvIGhvbGRzIGFuIGlkXG4gICAgLy8gd2hvc2UgZm9sZGVyIHdhcyBkZWxldGVkLCBvciB3aG9zZSBsb2FkIGZhaWxlZC5cbiAgICBlbmFibGVkUGx1Z2luczogT2JqZWN0LmtleXMoYXBwLnBsdWdpbnMucGx1Z2lucylcbiAgICAgIC5maWx0ZXIoKGlkKSA9PiBpZCAhPT0gcGx1Z2luSWQpXG4gICAgICAuc29ydCgpXG4gICAgICAubWFwKChpZCkgPT4gZ2V0UGx1Z2luSW5mbyhhcHAsIGlkKSksXG4gICAgaW5zdGFsbGVyVmVyc2lvbixcbiAgICBvYnNpZGlhblZlcnNpb246IGFwaVZlcnNpb24sXG4gICAgb3BlcmF0aW5nU3lzdGVtLFxuICAgIHBsYXRmb3JtOiBnZXRQbGF0Zm9ybU5hbWUoKSxcbiAgICBwbHVnaW46IGdldFBsdWdpbkluZm8oYXBwLCBwbHVnaW5JZClcbiAgfTtcbn1cblxuLyoqXG4gKiBHZXRzIGEgbGluayB0byBhIHBsdWdpbidzIGJ1Zy1yZXBvcnQgaXNzdWUgZm9ybSAoe0BsaW5rIEJVR19SRVBPUlRfSVNTVUVfRk9STV9URU1QTEFURX0pLCBwcmVmaWxsZWQgd2l0aFxuICogdGhlIGVudmlyb25tZW50LCBpbiB0aGUgZmllbGRzIHtAbGluayBCdWdSZXBvcnRJc3N1ZUZvcm1GaWVsZElkfSBuYW1lcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgbGluay5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJ1Z1JlcG9ydElzc3VlRm9ybVVybChwYXJhbXM6IEdldEJ1Z1JlcG9ydElzc3VlRm9ybVVybFBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGVudmlyb25tZW50ID0gYXdhaXQgZ2V0QnVnUmVwb3J0RW52aXJvbm1lbnQocGFyYW1zKTtcblxuICByZXR1cm4gZ2V0R2l0SHViSXNzdWVGb3JtVXJsKHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIFtCdWdSZXBvcnRJc3N1ZUZvcm1GaWVsZElkLkVudmlyb25tZW50XTogZm9ybWF0QnVnUmVwb3J0RW52aXJvbm1lbnQoZW52aXJvbm1lbnQpLFxuICAgICAgW0J1Z1JlcG9ydElzc3VlRm9ybUZpZWxkSWQuT2JzaWRpYW5WZXJzaW9uXTogZW52aXJvbm1lbnQub2JzaWRpYW5WZXJzaW9uLFxuICAgICAgW0J1Z1JlcG9ydElzc3VlRm9ybUZpZWxkSWQuT3BlcmF0aW5nU3lzdGVtXTogZW52aXJvbm1lbnQub3BlcmF0aW5nU3lzdGVtLFxuICAgICAgW0J1Z1JlcG9ydElzc3VlRm9ybUZpZWxkSWQuUGx1Z2luVmVyc2lvbl06IGVudmlyb25tZW50LnBsdWdpbi52ZXJzaW9uID8/IFVOS05PV05cbiAgICB9LFxuICAgIGdpdEh1YlJlcG86IHBhcmFtcy5naXRIdWJSZXBvLFxuICAgIHRlbXBsYXRlOiBCVUdfUkVQT1JUX0lTU1VFX0ZPUk1fVEVNUExBVEUsXG4gICAgLi4ucGFyYW1zLnRpdGxlICE9PSB1bmRlZmluZWQgJiYgeyB0aXRsZTogcGFyYW1zLnRpdGxlIH1cbiAgfSk7XG59XG5cbi8qKlxuICogR2V0cyBhIGxpbmsgdGhhdCBvcGVucyBhIEdpdEh1YiBpc3N1ZSBmb3JtIHdpdGggZmllbGRzIHByZWZpbGxlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEdpdEh1Yklzc3VlRm9ybVVybChwYXJhbXM6IEdldEdpdEh1Yklzc3VlRm9ybVVybFBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoeyB0ZW1wbGF0ZTogcGFyYW1zLnRlbXBsYXRlIH0pO1xuICBpZiAocGFyYW1zLnRpdGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICBzZWFyY2hQYXJhbXMuc2V0KCd0aXRsZScsIHBhcmFtcy50aXRsZSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IFtmaWVsZElkLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFyYW1zLmZpZWxkcyA/PyB7fSkpIHtcbiAgICBzZWFyY2hQYXJhbXMuc2V0KGZpZWxkSWQsIHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiBgaHR0cHM6Ly9naXRodWIuY29tLyR7cGFyYW1zLmdpdEh1YlJlcG99L2lzc3Vlcy9uZXc/JHtzZWFyY2hQYXJhbXMudG9TdHJpbmcoKX1gO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRQbHVnaW5JbmZvKHBsdWdpbkluZm86IEJ1Z1JlcG9ydFBsdWdpbkluZm8pOiBzdHJpbmcge1xuICByZXR1cm4gYFxcYCR7cGx1Z2luSW5mby5pZH1cXGAgJHtwbHVnaW5JbmZvLnZlcnNpb24gPz8gVU5LTk9XTn1gO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBcHBBbmRPcGVyYXRpbmdTeXN0ZW0oKTogUHJvbWlzZTxBcHBBbmRPcGVyYXRpbmdTeXN0ZW0+IHtcbiAgaWYgKFBsYXRmb3JtLmlzTW9iaWxlQXBwKSB7XG4gICAgY29uc3QgbW9iaWxlQXBwSW5mbyA9IGF3YWl0IGdldE1vYmlsZUFwcEluZm8oKTtcbiAgICByZXR1cm4ge1xuICAgICAgaW5zdGFsbGVyVmVyc2lvbjogbW9iaWxlQXBwSW5mbz8uaW5zdGFsbGVyVmVyc2lvbiA/PyBVTktOT1dOLFxuICAgICAgb3BlcmF0aW5nU3lzdGVtOiBtb2JpbGVBcHBJbmZvPy5vcGVyYXRpbmdTeXN0ZW0gPz8gVU5LTk9XTlxuICAgIH07XG4gIH1cblxuICBpZiAoIVBsYXRmb3JtLmlzRGVza3RvcEFwcCkge1xuICAgIHJldHVybiB7IGluc3RhbGxlclZlcnNpb246IFVOS05PV04sIG9wZXJhdGluZ1N5c3RlbTogVU5LTk9XTiB9O1xuICB9XG5cbiAgLy8gQ29uZGl0aW9uYWwgaW1wb3J0IG9mIHRoZSBkZXNrdG9wLW9ubHkgbG9va3VwLCB3aGljaCByZWFkcyBgbm9kZTpvc2A7IHRoaXMgYnJhbmNoIHJ1bnMgb25seSBvbiBkZXNrdG9wLlxuICBjb25zdCB7IGdldERlc2t0b3BPcGVyYXRpbmdTeXN0ZW0gfSA9IGF3YWl0IGltcG9ydCgnLi9kZXNrdG9wLW9wZXJhdGluZy1zeXN0ZW0udHMnKTtcbiAgY29uc3QgYnVpbGQgPSAoUGxhdGZvcm0gYXMgUGxhdGZvcm1XaXRoQnVpbGQpLmJ1aWxkO1xuICByZXR1cm4ge1xuICAgIGluc3RhbGxlclZlcnNpb246IHR5cGVvZiBidWlsZCA9PT0gJ3N0cmluZycgPyBidWlsZCA6IFVOS05PV04sXG4gICAgb3BlcmF0aW5nU3lzdGVtOiBnZXREZXNrdG9wT3BlcmF0aW5nU3lzdGVtKClcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0UGxhdGZvcm1OYW1lKCk6IHN0cmluZyB7XG4gIGlmIChQbGF0Zm9ybS5pc0FuZHJvaWRBcHApIHtcbiAgICByZXR1cm4gJ0FuZHJvaWQnO1xuICB9XG4gIGlmIChQbGF0Zm9ybS5pc0lvc0FwcCkge1xuICAgIHJldHVybiAnaU9TJztcbiAgfVxuICBpZiAoUGxhdGZvcm0uaXNNYWNPUykge1xuICAgIHJldHVybiAnbWFjT1MnO1xuICB9XG4gIGlmIChQbGF0Zm9ybS5pc1dpbikge1xuICAgIHJldHVybiAnV2luZG93cyc7XG4gIH1cbiAgcmV0dXJuIFBsYXRmb3JtLmlzTGludXggPyAnTGludXgnIDogVU5LTk9XTjtcbn1cblxuZnVuY3Rpb24gZ2V0UGx1Z2luSW5mbyhhcHA6IEFwcCwgcGx1Z2luSWQ6IHN0cmluZyk6IEJ1Z1JlcG9ydFBsdWdpbkluZm8ge1xuICByZXR1cm4ge1xuICAgIGlkOiBwbHVnaW5JZCxcbiAgICB2ZXJzaW9uOiBhcHAucGx1Z2lucy5tYW5pZmVzdHNbcGx1Z2luSWRdPy52ZXJzaW9uID8/IG51bGxcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQkE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUCxTQUFTLHdCQUF3QjtBQU8xQixJQUFLLDRCQUFMLGtCQUFL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UUFBTSxRQUFTLFNBQStCO0FBQzlDLFNBQU87QUFBQSxJQUNMLGtCQUFrQixPQUFPLFVBQVUsV0FBVyxRQUFRO0FBQUEsSUFDdEQsaUJBQWlCLDBCQUEwQjtBQUFBLEVBQzdDO0FBQ0Y7QUFFQSxTQUFTLGtCQUEwQjtBQUNqQyxNQUFJLFNBQVMsY0FBYztBQUN6QixXQUFPO0FBQUEsRUFDVDtBQUNBLE1BQUksU0FBUyxVQUFVO0FBQ3JCLFdBQU87QUFBQSxFQUNUO0FBQ0EsTUFBSSxTQUFTLFNBQVM7QUFDcEIsV0FBTztBQUFBLEVBQ1Q7QUFDQSxNQUFJLFNBQVMsT0FBTztBQUNsQixXQUFPO0FBQUEsRUFDVDtBQUNBLFNBQU8sU0FBUyxVQUFVLFVBQVU7QUFDdEM7QUFFQSxTQUFTLGNBQWMsS0FBVSxVQUF1QztBQUN0RSxTQUFPO0FBQUEsSUFDTCxJQUFJO0FBQUEsSUFDSixTQUFTLElBQUksUUFBUSxVQUFVLFFBQVEsR0FBRyxXQUFXO0FBQUEsRUFDdkQ7QUFDRjsiLCJuYW1lcyI6WyJCdWdSZXBvcnRJc3N1ZUZvcm1GaWVsZElkIl19
@@ -0,0 +1,131 @@
1
+ /// <reference path="./library-references.d.mts" />
2
+ /// <reference lib="dom" />
3
+ /**
4
+ * @file
5
+ *
6
+ * Carries focus and plugin state from a code block to its next render.
7
+ *
8
+ * Obsidian renders a code block again whenever its source text changes: Reading view re-renders the section and Live
9
+ * Preview replaces the widget. So a block that edits its own source (a counter, a checkbox, a settings form) loses the
10
+ * element the user was interacting with, its focus and whatever the plugin kept on it. The element itself cannot be
11
+ * kept without patching Obsidian's renderers, so the write records a handoff instead, and the processor rendering the
12
+ * new source claims it: it gets back the state the write passed and can put the focus back on the same element.
13
+ *
14
+ * The handoff is matched by source path, language and the new block content, and it lives for
15
+ * {@link CODE_BLOCK_RENDER_HANDOFF_LIFETIME_IN_MILLISECONDS}. The first render to claim it consumes it, so when the
16
+ * note is open in two panes only one of the new renders gets it.
17
+ */
18
+ import type { MarkdownPostProcessorContext } from 'obsidian';
19
+ /**
20
+ * How long a recorded handoff waits for the render that claims it.
21
+ */
22
+ export declare const CODE_BLOCK_RENDER_HANDOFF_LIFETIME_IN_MILLISECONDS = 10000;
23
+ /**
24
+ * Options for {@link claimCodeBlockRenderHandoff}.
25
+ */
26
+ export interface ClaimCodeBlockRenderHandoffParams {
27
+ /**
28
+ * The {@link MarkdownPostProcessorContext} the processor received.
29
+ */
30
+ readonly context: MarkdownPostProcessorContext;
31
+ /**
32
+ * The element the processor renders into.
33
+ */
34
+ readonly el: HTMLElement;
35
+ /**
36
+ * The source the processor received.
37
+ */
38
+ readonly source: string;
39
+ }
40
+ /**
41
+ * Where the focus was inside a rendered code block.
42
+ */
43
+ export interface CodeBlockFocusSnapshot {
44
+ /**
45
+ * The child indices leading from the code block element to the focused element.
46
+ */
47
+ readonly childIndexPath: readonly number[];
48
+ /**
49
+ * The text selection of a focused input or text area.
50
+ */
51
+ readonly selection: null | TextSelection;
52
+ }
53
+ /**
54
+ * A handoff claimed by the render of a code block whose source a write just changed.
55
+ */
56
+ export interface CodeBlockRenderHandoff {
57
+ /**
58
+ * Whether the write recorded a focused element to restore.
59
+ */
60
+ readonly hasFocus: boolean;
61
+ /**
62
+ * Puts the focus back on the element at the same position inside the new render, with the same text selection.
63
+ *
64
+ * Call it once the processor has rendered the block. It waits for the element to be attached to a document.
65
+ *
66
+ * @returns Whether an element was focused.
67
+ */
68
+ readonly restoreFocus: () => Promise<boolean>;
69
+ /**
70
+ * The state passed to the write, or `undefined` when none was.
71
+ */
72
+ readonly state: unknown;
73
+ }
74
+ /**
75
+ * Options for {@link recordCodeBlockRenderHandoff}.
76
+ */
77
+ export interface RecordCodeBlockRenderHandoffParams {
78
+ /**
79
+ * The focus captured from the old render with {@link captureCodeBlockFocus}.
80
+ */
81
+ readonly focus: CodeBlockFocusSnapshot | null;
82
+ /**
83
+ * The code block written to the note, fences included.
84
+ */
85
+ readonly newCodeBlock: string;
86
+ /**
87
+ * The path of the note the code block is in.
88
+ */
89
+ readonly sourcePath: string;
90
+ /**
91
+ * The state to pass to the next render.
92
+ */
93
+ readonly state: unknown;
94
+ }
95
+ interface TextSelection {
96
+ readonly direction: 'backward' | 'forward' | 'none';
97
+ readonly end: number;
98
+ readonly start: number;
99
+ }
100
+ /**
101
+ * Captures where the focus is inside a rendered code block.
102
+ *
103
+ * @param el - The code block element.
104
+ * @returns The snapshot, or `null` when the focus is not inside the element.
105
+ */
106
+ export declare function captureCodeBlockFocus(el: HTMLElement): CodeBlockFocusSnapshot | null;
107
+ /**
108
+ * Claims the handoff a write recorded for the code block being rendered.
109
+ *
110
+ * Call it from a code block processor. It returns `null` when no write is waiting for this render.
111
+ *
112
+ * @param params - The parameters for the function.
113
+ * @returns The handoff, or `null`.
114
+ */
115
+ export declare function claimCodeBlockRenderHandoff(params: ClaimCodeBlockRenderHandoffParams): CodeBlockRenderHandoff | null;
116
+ /**
117
+ * Records a handoff for the next render of a code block a write is about to change.
118
+ *
119
+ * @param params - The parameters for the function.
120
+ * @returns Whether a handoff was recorded: `false` when the new text is not exactly one code block.
121
+ */
122
+ export declare function recordCodeBlockRenderHandoff(params: RecordCodeBlockRenderHandoffParams): boolean;
123
+ /**
124
+ * Puts the focus back on the element a {@link CodeBlockFocusSnapshot} describes.
125
+ *
126
+ * @param el - The new code block element.
127
+ * @param focus - The snapshot captured from the old render.
128
+ * @returns Whether an element was focused.
129
+ */
130
+ export declare function restoreCodeBlockFocus(el: HTMLElement, focus: CodeBlockFocusSnapshot): Promise<boolean>;
131
+ export {};