@mnaoumov/obsidian-lib 10.10.0 → 10.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -0
- package/components/all-windows-status-bar-item-component/package.json +6 -0
- package/components/shared-component-pool-component/package.json +6 -0
- package/components/workspace-layout-state-component/package.json +6 -0
- package/dist/lib/cjs/__merged.cjs +90 -1
- package/dist/lib/cjs/__merged.d.cts +13 -4
- package/dist/lib/cjs/bug-report-diagnostics.cjs +222 -0
- package/dist/lib/cjs/bug-report-diagnostics.d.cts +186 -0
- package/dist/lib/cjs/bug-report.cjs +36 -10
- package/dist/lib/cjs/bug-report.d.cts +65 -0
- package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.cjs +93 -2
- package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.d.cts +34 -2
- package/dist/lib/cjs/components/all-windows-status-bar-item-component.cjs +245 -0
- package/dist/lib/cjs/components/all-windows-status-bar-item-component.d.cts +146 -0
- package/dist/lib/cjs/components/embed-extensions-component.cjs +20 -3
- package/dist/lib/cjs/components/embed-extensions-component.d.cts +8 -0
- package/dist/lib/cjs/components/embeddable-markdown-editor-component.cjs +16 -2
- package/dist/lib/cjs/components/embeddable-markdown-editor-component.d.cts +9 -0
- package/dist/lib/cjs/components/index.cjs +12 -3
- package/dist/lib/cjs/components/index.d.cts +3 -0
- package/dist/lib/cjs/components/plugin-gate-component.cjs +2 -9
- package/dist/lib/cjs/components/plugin-settings-component.cjs +7 -2
- package/dist/lib/cjs/components/shared-component-pool-component.cjs +368 -0
- package/dist/lib/cjs/components/shared-component-pool-component.d.cts +129 -0
- package/dist/lib/cjs/components/workspace-layout-state-component.cjs +495 -0
- package/dist/lib/cjs/components/workspace-layout-state-component.d.cts +239 -0
- package/dist/lib/cjs/css-class.cjs +5 -1
- package/dist/lib/cjs/css-class.d.cts +16 -0
- package/dist/lib/cjs/data-handler.cjs +156 -5
- package/dist/lib/cjs/data-handler.d.cts +128 -2
- package/dist/lib/cjs/desktop-git-runner.cjs +4 -14
- package/dist/lib/cjs/desktop-git-runner.d.cts +8 -2
- package/dist/lib/cjs/generated-during-build.cjs +2 -2
- package/dist/lib/cjs/git-rename-history.cjs +1 -1
- package/dist/lib/cjs/git-rename-history.d.cts +2 -2
- package/dist/lib/cjs/i18n/locales/en.cjs +29 -1
- package/dist/lib/cjs/i18n/locales/en.d.cts +28 -0
- package/dist/lib/cjs/i18n/locales/translations-map.d.cts +28 -0
- package/dist/lib/cjs/index.cjs +10 -1
- package/dist/lib/cjs/index.d.cts +3 -0
- package/dist/lib/cjs/link.cjs +40 -1
- package/dist/lib/cjs/link.d.cts +37 -1
- package/dist/lib/cjs/markdown-view.cjs +191 -3
- package/dist/lib/cjs/markdown-view.d.cts +48 -1
- package/dist/lib/cjs/modals/copy-text-manually.cjs +181 -0
- package/dist/lib/cjs/modals/copy-text-manually.d.cts +38 -0
- package/dist/lib/cjs/modals/index.cjs +7 -1
- package/dist/lib/cjs/modals/index.d.cts +2 -0
- package/dist/lib/cjs/modals/review-bug-report-diagnostics.cjs +202 -0
- package/dist/lib/cjs/modals/review-bug-report-diagnostics.d.cts +30 -0
- package/dist/lib/cjs/plugin/index.cjs +4 -1
- package/dist/lib/cjs/plugin/index.d.cts +1 -0
- package/dist/lib/cjs/plugin/plugin-api.cjs +13 -4
- package/dist/lib/cjs/plugin/plugin-api.d.cts +5 -1
- package/dist/lib/cjs/plugin/plugin-install-state.cjs +46 -1
- package/dist/lib/cjs/plugin/plugin-install-state.d.cts +30 -0
- package/dist/lib/cjs/plugin/plugin-instance.cjs +448 -0
- package/dist/lib/cjs/plugin/plugin-instance.d.cts +251 -0
- package/dist/lib/cjs/plugin/plugin.cjs +16 -1
- package/dist/lib/cjs/plugin/plugin.d.cts +7 -0
- package/dist/lib/cjs/reference-definition.cjs +234 -0
- package/dist/lib/cjs/reference-definition.d.cts +47 -0
- package/dist/lib/cjs/release-asset.cjs +279 -0
- package/dist/lib/cjs/release-asset.d.cts +190 -0
- package/dist/lib/cjs/workspace.cjs +3 -2
- package/dist/lib/cjs/workspace.d.cts +6 -0
- package/dist/lib/esm/__merged.d.mts +13 -4
- package/dist/lib/esm/__merged.mjs +97 -3
- package/dist/lib/esm/bug-report-diagnostics.d.mts +186 -0
- package/dist/lib/esm/bug-report-diagnostics.mjs +127 -0
- package/dist/lib/esm/bug-report.d.mts +65 -0
- package/dist/lib/esm/bug-report.mjs +33 -10
- package/dist/lib/esm/command-handlers/open-bug-report-command-handler.d.mts +34 -2
- package/dist/lib/esm/command-handlers/open-bug-report-command-handler.mjs +99 -3
- package/dist/lib/esm/components/all-windows-status-bar-item-component.d.mts +146 -0
- package/dist/lib/esm/components/all-windows-status-bar-item-component.mjs +154 -0
- package/dist/lib/esm/components/embed-extensions-component.d.mts +8 -0
- package/dist/lib/esm/components/embed-extensions-component.mjs +20 -3
- package/dist/lib/esm/components/embeddable-markdown-editor-component.d.mts +9 -0
- package/dist/lib/esm/components/embeddable-markdown-editor-component.mjs +16 -2
- package/dist/lib/esm/components/index.d.mts +3 -0
- package/dist/lib/esm/components/index.mjs +8 -2
- package/dist/lib/esm/components/plugin-gate-component.mjs +5 -13
- package/dist/lib/esm/components/plugin-settings-component.mjs +7 -2
- package/dist/lib/esm/components/shared-component-pool-component.d.mts +129 -0
- package/dist/lib/esm/components/shared-component-pool-component.mjs +280 -0
- package/dist/lib/esm/components/workspace-layout-state-component.d.mts +239 -0
- package/dist/lib/esm/components/workspace-layout-state-component.mjs +404 -0
- package/dist/lib/esm/css-class.d.mts +16 -0
- package/dist/lib/esm/css-class.mjs +5 -1
- package/dist/lib/esm/data-handler.d.mts +128 -2
- package/dist/lib/esm/data-handler.mjs +152 -4
- package/dist/lib/esm/desktop-git-runner.d.mts +8 -2
- package/dist/lib/esm/desktop-git-runner.mjs +3 -3
- package/dist/lib/esm/generated-during-build.mjs +2 -2
- package/dist/lib/esm/git-rename-history.d.mts +2 -2
- package/dist/lib/esm/git-rename-history.mjs +1 -1
- package/dist/lib/esm/i18n/locales/en.d.mts +28 -0
- package/dist/lib/esm/i18n/locales/en.mjs +29 -1
- package/dist/lib/esm/i18n/locales/translations-map.d.mts +28 -0
- package/dist/lib/esm/index.d.mts +3 -0
- package/dist/lib/esm/index.mjs +7 -1
- package/dist/lib/esm/link.d.mts +37 -1
- package/dist/lib/esm/link.mjs +40 -1
- package/dist/lib/esm/markdown-view.d.mts +48 -1
- package/dist/lib/esm/markdown-view.mjs +192 -2
- package/dist/lib/esm/modals/copy-text-manually.d.mts +38 -0
- package/dist/lib/esm/modals/copy-text-manually.mjs +99 -0
- package/dist/lib/esm/modals/index.d.mts +2 -0
- package/dist/lib/esm/modals/index.mjs +5 -1
- package/dist/lib/esm/modals/review-bug-report-diagnostics.d.mts +30 -0
- package/dist/lib/esm/modals/review-bug-report-diagnostics.mjs +120 -0
- package/dist/lib/esm/plugin/index.d.mts +1 -0
- package/dist/lib/esm/plugin/index.mjs +3 -1
- package/dist/lib/esm/plugin/plugin-api.d.mts +5 -1
- package/dist/lib/esm/plugin/plugin-api.mjs +13 -4
- package/dist/lib/esm/plugin/plugin-install-state.d.mts +30 -0
- package/dist/lib/esm/plugin/plugin-install-state.mjs +44 -1
- package/dist/lib/esm/plugin/plugin-instance.d.mts +251 -0
- package/dist/lib/esm/plugin/plugin-instance.mjs +366 -0
- package/dist/lib/esm/plugin/plugin.d.mts +7 -0
- package/dist/lib/esm/plugin/plugin.mjs +16 -1
- package/dist/lib/esm/reference-definition.d.mts +47 -0
- package/dist/lib/esm/reference-definition.mjs +146 -0
- package/dist/lib/esm/release-asset.d.mts +190 -0
- package/dist/lib/esm/release-asset.mjs +187 -0
- package/dist/lib/esm/workspace.d.mts +6 -0
- package/dist/lib/esm/workspace.mjs +3 -2
- package/dist/styles.css +16 -1
- package/modals/copy-text-manually/package.json +6 -0
- package/modals/review-bug-report-diagnostics/package.json +6 -0
- package/package.json +2 -1
- package/plugin/plugin-instance/package.json +6 -0
|
@@ -0,0 +1,234 @@
|
|
|
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 patchObsidianRequire() {
|
|
6
|
+
const originalRequire = require;
|
|
7
|
+
if (!originalRequire || originalRequire.__isPatched) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
require = Object.assign(
|
|
11
|
+
(id) => requirePatched(id),
|
|
12
|
+
originalRequire,
|
|
13
|
+
{
|
|
14
|
+
__isPatched: true
|
|
15
|
+
}
|
|
16
|
+
);
|
|
17
|
+
function extractDefault($module) {
|
|
18
|
+
return $module && $module.__esModule && "default" in $module ? $module.default : $module;
|
|
19
|
+
}
|
|
20
|
+
const OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
|
|
21
|
+
"@codemirror/autocomplete",
|
|
22
|
+
"@codemirror/collab",
|
|
23
|
+
"@codemirror/commands",
|
|
24
|
+
"@codemirror/language",
|
|
25
|
+
"@codemirror/lint",
|
|
26
|
+
"@codemirror/search",
|
|
27
|
+
"@codemirror/state",
|
|
28
|
+
"@codemirror/text",
|
|
29
|
+
"@codemirror/view",
|
|
30
|
+
"@lezer/common",
|
|
31
|
+
"@lezer/highlight",
|
|
32
|
+
"@lezer/lr",
|
|
33
|
+
"obsidian"
|
|
34
|
+
]);
|
|
35
|
+
const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
|
|
36
|
+
"@codemirror/closebrackets",
|
|
37
|
+
"@codemirror/comment",
|
|
38
|
+
"@codemirror/fold",
|
|
39
|
+
"@codemirror/gutter",
|
|
40
|
+
"@codemirror/highlight",
|
|
41
|
+
"@codemirror/history",
|
|
42
|
+
"@codemirror/matchbrackets",
|
|
43
|
+
"@codemirror/panel",
|
|
44
|
+
"@codemirror/rangeset",
|
|
45
|
+
"@codemirror/rectangular-selection",
|
|
46
|
+
"@codemirror/stream-parser",
|
|
47
|
+
"@codemirror/tooltip"
|
|
48
|
+
]);
|
|
49
|
+
function requirePatched(id) {
|
|
50
|
+
if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
|
|
51
|
+
return originalRequire?.(id);
|
|
52
|
+
}
|
|
53
|
+
const app = globalThis.app;
|
|
54
|
+
if (app?.isMobile) {
|
|
55
|
+
if (id === "process" || id === "node:process") {
|
|
56
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
|
|
57
|
+
return process;
|
|
58
|
+
}
|
|
59
|
+
} else {
|
|
60
|
+
const $module = originalRequire?.(id);
|
|
61
|
+
if ($module) {
|
|
62
|
+
return extractDefault($module);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
|
|
66
|
+
return {};
|
|
67
|
+
}
|
|
68
|
+
})();
|
|
69
|
+
|
|
70
|
+
"use strict";
|
|
71
|
+
var __defProp = Object.defineProperty;
|
|
72
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
73
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
74
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
75
|
+
var __export = (target, all) => {
|
|
76
|
+
for (var name in all)
|
|
77
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
78
|
+
};
|
|
79
|
+
var __copyProps = (to, from, except, desc) => {
|
|
80
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
81
|
+
for (let key of __getOwnPropNames(from))
|
|
82
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
83
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
84
|
+
}
|
|
85
|
+
return to;
|
|
86
|
+
};
|
|
87
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
88
|
+
var reference_definition_exports = {};
|
|
89
|
+
__export(reference_definition_exports, {
|
|
90
|
+
referenceDefinitionToFileChange: () => referenceDefinitionToFileChange
|
|
91
|
+
});
|
|
92
|
+
module.exports = __toCommonJS(reference_definition_exports);
|
|
93
|
+
var import_debug = require('./debug.cjs');
|
|
94
|
+
const ASCII_PUNCTUATION_REG_EXP = /[!-/:-@[-`{-~]/;
|
|
95
|
+
const BARE_DESTINATION_FORBIDDEN_CHARACTER_REG_EXP = /[\s\p{Cc}]/u;
|
|
96
|
+
const DEFINITION_PREFIX_REG_EXP = /^[ \t]*\[(?:\\[\s\S]|[^\\\]])+\]:[ \t]*(?:\r?\n(?:[ \t]*>)*[ \t]*)?/;
|
|
97
|
+
const LINE_BREAK_REG_EXP = /[\r\n]/;
|
|
98
|
+
const WHITESPACE_REG_EXP = /\s/;
|
|
99
|
+
function referenceDefinitionToFileChange(params) {
|
|
100
|
+
const { content, definition, newDestination } = params;
|
|
101
|
+
const referenceDefinitionDebugger = (0, import_debug.getObsidianLibDebugger)("ReferenceDefinition:referenceDefinitionToFileChange");
|
|
102
|
+
const token = findDestinationToken(content, definition);
|
|
103
|
+
if (!token) {
|
|
104
|
+
referenceDefinitionDebugger("Skipping a definition whose content does not match its metadata", { definition });
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
const newRaw = encodeDestination(newDestination, token.isAngle);
|
|
108
|
+
if (newRaw === null) {
|
|
109
|
+
referenceDefinitionDebugger("Skipping a destination that holds a line break", { definition, newDestination });
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
const reference = {
|
|
113
|
+
link: definition.link,
|
|
114
|
+
original: token.raw,
|
|
115
|
+
position: {
|
|
116
|
+
end: getLoc(content, definition, token.end),
|
|
117
|
+
start: getLoc(content, definition, token.start)
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
return {
|
|
121
|
+
newContent: newRaw,
|
|
122
|
+
oldContent: token.raw,
|
|
123
|
+
reference
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
function canBeBare(destination) {
|
|
127
|
+
if (destination === "" || destination.startsWith("<") || BARE_DESTINATION_FORBIDDEN_CHARACTER_REG_EXP.test(destination)) {
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
let depth = 0;
|
|
131
|
+
for (const character of destination) {
|
|
132
|
+
if (character === "(") {
|
|
133
|
+
depth++;
|
|
134
|
+
} else if (character === ")") {
|
|
135
|
+
depth--;
|
|
136
|
+
if (depth < 0) {
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return depth === 0;
|
|
142
|
+
}
|
|
143
|
+
function encodeDestination(destination, isAngle) {
|
|
144
|
+
if (LINE_BREAK_REG_EXP.test(destination)) {
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
const shouldUseAngle = isAngle || !canBeBare(destination);
|
|
148
|
+
let encoded = "";
|
|
149
|
+
for (let index = 0; index < destination.length; index++) {
|
|
150
|
+
const character = destination.charAt(index);
|
|
151
|
+
const nextCharacter = destination.charAt(index + 1);
|
|
152
|
+
const isEscapeNeeded = shouldUseAngle ? character === "<" || character === ">" || character === "\\" && (nextCharacter === "" || ASCII_PUNCTUATION_REG_EXP.test(nextCharacter)) : character === "\\" && ASCII_PUNCTUATION_REG_EXP.test(nextCharacter);
|
|
153
|
+
encoded += isEscapeNeeded ? `\\${character}` : character;
|
|
154
|
+
}
|
|
155
|
+
return shouldUseAngle ? `<${encoded}>` : encoded;
|
|
156
|
+
}
|
|
157
|
+
function findDestinationToken(content, definition) {
|
|
158
|
+
const definitionStart = definition.position.start.offset;
|
|
159
|
+
const definitionEnd = definition.position.end.offset;
|
|
160
|
+
if (definitionStart < 0 || definitionEnd > content.length || definitionEnd < definitionStart) {
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
const definitionText = content.slice(definitionStart, definitionEnd);
|
|
164
|
+
const prefix = DEFINITION_PREFIX_REG_EXP.exec(definitionText);
|
|
165
|
+
if (!prefix) {
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
const tokenStart = prefix[0].length;
|
|
169
|
+
const isAngle = definitionText.charAt(tokenStart) === "<";
|
|
170
|
+
let tokenEnd = isAngle ? tokenStart + 1 : tokenStart;
|
|
171
|
+
for (; tokenEnd < definitionText.length; tokenEnd++) {
|
|
172
|
+
const character = definitionText.charAt(tokenEnd);
|
|
173
|
+
if (isAngle ? character === ">" || LINE_BREAK_REG_EXP.test(character) : WHITESPACE_REG_EXP.test(character)) {
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
if (character === "\\" && ASCII_PUNCTUATION_REG_EXP.test(definitionText.charAt(tokenEnd + 1))) {
|
|
177
|
+
tokenEnd++;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
if (isAngle) {
|
|
181
|
+
if (definitionText.charAt(tokenEnd) !== ">") {
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
tokenEnd++;
|
|
185
|
+
}
|
|
186
|
+
const boundary = definitionText.charAt(tokenEnd);
|
|
187
|
+
if (boundary !== "" && !WHITESPACE_REG_EXP.test(boundary)) {
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
const raw = definitionText.slice(tokenStart, tokenEnd);
|
|
191
|
+
const value = isAngle ? raw.slice(1, -1) : raw;
|
|
192
|
+
if (tokenEnd === tokenStart || unescapeDestination(value) !== definition.link) {
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
return {
|
|
196
|
+
end: definitionStart + tokenEnd,
|
|
197
|
+
isAngle,
|
|
198
|
+
raw,
|
|
199
|
+
start: definitionStart + tokenStart
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
function getLoc(content, definition, offset) {
|
|
203
|
+
const definitionStart = definition.position.start.offset;
|
|
204
|
+
let line = definition.position.start.line;
|
|
205
|
+
for (let index = definitionStart; index < offset; index++) {
|
|
206
|
+
if (content.charAt(index) === "\n") {
|
|
207
|
+
line++;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return {
|
|
211
|
+
col: offset - (content.lastIndexOf("\n", offset - 1) + 1),
|
|
212
|
+
line,
|
|
213
|
+
offset
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
function unescapeDestination(value) {
|
|
217
|
+
let result = "";
|
|
218
|
+
for (let index = 0; index < value.length; index++) {
|
|
219
|
+
const character = value.charAt(index);
|
|
220
|
+
const nextCharacter = value.charAt(index + 1);
|
|
221
|
+
if (character === "\\" && ASCII_PUNCTUATION_REG_EXP.test(nextCharacter)) {
|
|
222
|
+
result += nextCharacter;
|
|
223
|
+
index++;
|
|
224
|
+
} else {
|
|
225
|
+
result += character;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return result;
|
|
229
|
+
}
|
|
230
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
231
|
+
0 && (module.exports = {
|
|
232
|
+
referenceDefinitionToFileChange
|
|
233
|
+
});
|
|
234
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZWZlcmVuY2UtZGVmaW5pdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogRWRpdHMgdGhlIGRlc3RpbmF0aW9uIG9mIGEgcmVmZXJlbmNlLXN0eWxlIGxpbmsgZGVmaW5pdGlvbiAoYFtpZF06IGRlc3RpbmF0aW9uIFwidGl0bGVcImApIHRoYXQgT2JzaWRpYW4gcmVwb3J0c1xuICogaW4gYENhY2hlZE1ldGFkYXRhLnJlZmVyZW5jZUxpbmtzYC5cbiAqXG4gKiBSZWFkIGZyb20gT2JzaWRpYW4gYDEuMTUuMWA6IGEgZGVmaW5pdGlvbidzIGBwb3NpdGlvbmAgc3BhbnMgdGhlIHdob2xlIGRlZmluaXRpb24sIGl0cyBsZWFkaW5nIGluZGVudGF0aW9uXG4gKiBpbmNsdWRlZCBhbmQgYW55IGJsb2NrcXVvdGUgb3IgbGlzdCBtYXJrZXIgZXhjbHVkZWQsIGFuZCBpdHMgYGxpbmtgIGlzIHRoZSBkZXN0aW5hdGlvbiB3aXRoIHRoZSBhbmdsZSBicmFja2V0c1xuICogcmVtb3ZlZCBhbmQgZXZlcnkgYmFja3NsYXNoIGVzY2FwZSByZXNvbHZlZCAoYFRhcmdldFxcI0VzY2FwZWQubWRgIHJlcG9ydHMgYFRhcmdldCNFc2NhcGVkLm1kYCkuIFRoZSB1c2VzIG9mIGFcbiAqIGRlZmluaXRpb24gKGBbdGV4dF1baWRdYCwgYFtpZF1bXWAsIGBbaWRdYCkgYXJlIG5vdCByZXBvcnRlZCBpbiBgbGlua3NgIGFuZCBuYW1lIHRoZSBkZWZpbml0aW9uIGJ5IGl0cyBpZCwgc29cbiAqIHJld3JpdGluZyBvbmx5IHRoZSBkZXN0aW5hdGlvbiBrZWVwcyBldmVyeSBvbmUgb2YgdGhlbSBwb2ludGluZyBhdCB0aGUgbmV3IHRhcmdldC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIExvYyxcbiAgUmVmZXJlbmNlQ2FjaGUsXG4gIFJlZmVyZW5jZUxpbmtDYWNoZVxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgRmlsZUNoYW5nZSB9IGZyb20gJy4vZmlsZS1jaGFuZ2UudHMnO1xuXG5pbXBvcnQgeyBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyIH0gZnJvbSAnLi9kZWJ1Zy50cyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlZmVyZW5jZURlZmluaXRpb25Ub0ZpbGVDaGFuZ2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZmVyZW5jZURlZmluaXRpb25Ub0ZpbGVDaGFuZ2VQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNvbnRlbnQgdGhlIGRlZmluaXRpb24ncyBwb3NpdGlvbiByZWZlcnMgdG8uXG4gICAqL1xuICByZWFkb25seSBjb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZWZpbml0aW9uLCBhcyBPYnNpZGlhbiByZXBvcnRzIGl0IGluIGBDYWNoZWRNZXRhZGF0YS5yZWZlcmVuY2VMaW5rc2AuXG4gICAqL1xuICByZWFkb25seSBkZWZpbml0aW9uOiBSZWZlcmVuY2VMaW5rQ2FjaGU7XG5cbiAgLyoqXG4gICAqIFRoZSBuZXcgZGVzdGluYXRpb24sIHVuZXNjYXBlZCwgaW4gdGhlIHNhbWUgZm9ybSBhcyB7QGxpbmsgUmVmZXJlbmNlTGlua0NhY2hlLmxpbmt9LlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3RGVzdGluYXRpb246IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIERlc3RpbmF0aW9uVG9rZW4ge1xuICByZWFkb25seSBlbmQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgaXNBbmdsZTogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcmF3OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN0YXJ0OiBudW1iZXI7XG59XG5cbmNvbnN0IEFTQ0lJX1BVTkNUVUFUSU9OX1JFR19FWFAgPSAvWyEtLzotQFstYHstfl0vO1xuY29uc3QgQkFSRV9ERVNUSU5BVElPTl9GT1JCSURERU5fQ0hBUkFDVEVSX1JFR19FWFAgPSAvW1xcc1xccHtDY31dL3U7XG5jb25zdCBERUZJTklUSU9OX1BSRUZJWF9SRUdfRVhQID0gL15bIFxcdF0qXFxbKD86XFxcXFtcXHNcXFNdfFteXFxcXFxcXV0pK1xcXTpbIFxcdF0qKD86XFxyP1xcbig/OlsgXFx0XSo+KSpbIFxcdF0qKT8vO1xuY29uc3QgTElORV9CUkVBS19SRUdfRVhQID0gL1tcXHJcXG5dLztcbmNvbnN0IFdISVRFU1BBQ0VfUkVHX0VYUCA9IC9cXHMvO1xuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZmlsZSBjaGFuZ2UgdGhhdCByZXBsYWNlcyB0aGUgZGVzdGluYXRpb24gb2YgYSByZWZlcmVuY2Utc3R5bGUgbGluayBkZWZpbml0aW9uLCBsZWF2aW5nIGl0cyBpZCwgaXRzXG4gKiB0aXRsZSBhbmQgdGhlIHJlc3Qgb2YgdGhlIG5vdGUgdW5jaGFuZ2VkLlxuICpcbiAqIFRoZSBkZXN0aW5hdGlvbiBrZWVwcyBpdHMgZm9ybTogb25lIHdyaXR0ZW4gaW4gYW5nbGUgYnJhY2tldHMgc3RheXMgaW4gdGhlbSwgYW5kIGEgYmFyZSBvbmUgc3RheXMgYmFyZSB1bmxlc3NcbiAqIHRoZSBuZXcgZGVzdGluYXRpb24gY2Fubm90IGJlIHdyaXR0ZW4gYmFyZSAoaXQgaXMgZW1wdHksIGhvbGRzIHdoaXRlc3BhY2Ugb3IgYSBjb250cm9sIGNoYXJhY3Rlciwgc3RhcnRzIHdpdGhcbiAqIGA8YCwgb3IgaGFzIHVuYmFsYW5jZWQgcGFyZW50aGVzZXMpLCBpbiB3aGljaCBjYXNlIGl0IGlzIHdyaXR0ZW4gaW4gYW5nbGUgYnJhY2tldHMuIENoYXJhY3RlcnMgdGhhdCB3b3VsZCBlbmRcbiAqIG9yIGNoYW5nZSB0aGUgZGVzdGluYXRpb24gYXJlIGVzY2FwZWQgd2l0aCBhIGJhY2tzbGFzaC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGJ1aWxkaW5nIHRoZSBmaWxlIGNoYW5nZS5cbiAqIEByZXR1cm5zIFRoZSBmaWxlIGNoYW5nZSwgb3IgYG51bGxgIHdoZW4gdGhlIGNvbnRlbnQgYXQgdGhlIGRlZmluaXRpb24ncyBwb3NpdGlvbiBubyBsb25nZXIgaG9sZHMgYSBkZWZpbml0aW9uXG4gKiB3aG9zZSBkZXN0aW5hdGlvbiByZWFkcyBhcyB7QGxpbmsgUmVmZXJlbmNlTGlua0NhY2hlLmxpbmt9LCBvciB3aGVuIHRoZSBuZXcgZGVzdGluYXRpb24gaG9sZHMgYSBsaW5lIGJyZWFrLFxuICogd2hpY2ggbm8gZGVzdGluYXRpb24gY2FuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVmZXJlbmNlRGVmaW5pdGlvblRvRmlsZUNoYW5nZShwYXJhbXM6IFJlZmVyZW5jZURlZmluaXRpb25Ub0ZpbGVDaGFuZ2VQYXJhbXMpOiBGaWxlQ2hhbmdlIHwgbnVsbCB7XG4gIGNvbnN0IHsgY29udGVudCwgZGVmaW5pdGlvbiwgbmV3RGVzdGluYXRpb24gfSA9IHBhcmFtcztcbiAgY29uc3QgcmVmZXJlbmNlRGVmaW5pdGlvbkRlYnVnZ2VyID0gZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignUmVmZXJlbmNlRGVmaW5pdGlvbjpyZWZlcmVuY2VEZWZpbml0aW9uVG9GaWxlQ2hhbmdlJyk7XG5cbiAgY29uc3QgdG9rZW4gPSBmaW5kRGVzdGluYXRpb25Ub2tlbihjb250ZW50LCBkZWZpbml0aW9uKTtcbiAgaWYgKCF0b2tlbikge1xuICAgIHJlZmVyZW5jZURlZmluaXRpb25EZWJ1Z2dlcignU2tpcHBpbmcgYSBkZWZpbml0aW9uIHdob3NlIGNvbnRlbnQgZG9lcyBub3QgbWF0Y2ggaXRzIG1ldGFkYXRhJywgeyBkZWZpbml0aW9uIH0pO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgbmV3UmF3ID0gZW5jb2RlRGVzdGluYXRpb24obmV3RGVzdGluYXRpb24sIHRva2VuLmlzQW5nbGUpO1xuICBpZiAobmV3UmF3ID09PSBudWxsKSB7XG4gICAgcmVmZXJlbmNlRGVmaW5pdGlvbkRlYnVnZ2VyKCdTa2lwcGluZyBhIGRlc3RpbmF0aW9uIHRoYXQgaG9sZHMgYSBsaW5lIGJyZWFrJywgeyBkZWZpbml0aW9uLCBuZXdEZXN0aW5hdGlvbiB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHJlZmVyZW5jZTogUmVmZXJlbmNlQ2FjaGUgPSB7XG4gICAgbGluazogZGVmaW5pdGlvbi5saW5rLFxuICAgIG9yaWdpbmFsOiB0b2tlbi5yYXcsXG4gICAgcG9zaXRpb246IHtcbiAgICAgIGVuZDogZ2V0TG9jKGNvbnRlbnQsIGRlZmluaXRpb24sIHRva2VuLmVuZCksXG4gICAgICBzdGFydDogZ2V0TG9jKGNvbnRlbnQsIGRlZmluaXRpb24sIHRva2VuLnN0YXJ0KVxuICAgIH1cbiAgfTtcblxuICByZXR1cm4ge1xuICAgIG5ld0NvbnRlbnQ6IG5ld1JhdyxcbiAgICBvbGRDb250ZW50OiB0b2tlbi5yYXcsXG4gICAgcmVmZXJlbmNlXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNhbkJlQmFyZShkZXN0aW5hdGlvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChkZXN0aW5hdGlvbiA9PT0gJycgfHwgZGVzdGluYXRpb24uc3RhcnRzV2l0aCgnPCcpIHx8IEJBUkVfREVTVElOQVRJT05fRk9SQklEREVOX0NIQVJBQ1RFUl9SRUdfRVhQLnRlc3QoZGVzdGluYXRpb24pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbGV0IGRlcHRoID0gMDtcbiAgZm9yIChjb25zdCBjaGFyYWN0ZXIgb2YgZGVzdGluYXRpb24pIHtcbiAgICBpZiAoY2hhcmFjdGVyID09PSAnKCcpIHtcbiAgICAgIGRlcHRoKys7XG4gICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09ICcpJykge1xuICAgICAgZGVwdGgtLTtcbiAgICAgIGlmIChkZXB0aCA8IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkZXB0aCA9PT0gMDtcbn1cblxuZnVuY3Rpb24gZW5jb2RlRGVzdGluYXRpb24oZGVzdGluYXRpb246IHN0cmluZywgaXNBbmdsZTogYm9vbGVhbik6IG51bGwgfCBzdHJpbmcge1xuICBpZiAoTElORV9CUkVBS19SRUdfRVhQLnRlc3QoZGVzdGluYXRpb24pKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBzaG91bGRVc2VBbmdsZSA9IGlzQW5nbGUgfHwgIWNhbkJlQmFyZShkZXN0aW5hdGlvbik7XG4gIGxldCBlbmNvZGVkID0gJyc7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBkZXN0aW5hdGlvbi5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBjaGFyYWN0ZXIgPSBkZXN0aW5hdGlvbi5jaGFyQXQoaW5kZXgpO1xuICAgIGNvbnN0IG5leHRDaGFyYWN0ZXIgPSBkZXN0aW5hdGlvbi5jaGFyQXQoaW5kZXggKyAxKTtcbiAgICBjb25zdCBpc0VzY2FwZU5lZWRlZCA9IHNob3VsZFVzZUFuZ2xlXG4gICAgICA/IGNoYXJhY3RlciA9PT0gJzwnIHx8IGNoYXJhY3RlciA9PT0gJz4nIHx8IChjaGFyYWN0ZXIgPT09ICdcXFxcJyAmJiAobmV4dENoYXJhY3RlciA9PT0gJycgfHwgQVNDSUlfUFVOQ1RVQVRJT05fUkVHX0VYUC50ZXN0KG5leHRDaGFyYWN0ZXIpKSlcbiAgICAgIDogY2hhcmFjdGVyID09PSAnXFxcXCcgJiYgQVNDSUlfUFVOQ1RVQVRJT05fUkVHX0VYUC50ZXN0KG5leHRDaGFyYWN0ZXIpO1xuICAgIGVuY29kZWQgKz0gaXNFc2NhcGVOZWVkZWQgPyBgXFxcXCR7Y2hhcmFjdGVyfWAgOiBjaGFyYWN0ZXI7XG4gIH1cblxuICByZXR1cm4gc2hvdWxkVXNlQW5nbGUgPyBgPCR7ZW5jb2RlZH0+YCA6IGVuY29kZWQ7XG59XG5cbmZ1bmN0aW9uIGZpbmREZXN0aW5hdGlvblRva2VuKGNvbnRlbnQ6IHN0cmluZywgZGVmaW5pdGlvbjogUmVmZXJlbmNlTGlua0NhY2hlKTogRGVzdGluYXRpb25Ub2tlbiB8IG51bGwge1xuICBjb25zdCBkZWZpbml0aW9uU3RhcnQgPSBkZWZpbml0aW9uLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldDtcbiAgY29uc3QgZGVmaW5pdGlvbkVuZCA9IGRlZmluaXRpb24ucG9zaXRpb24uZW5kLm9mZnNldDtcbiAgaWYgKGRlZmluaXRpb25TdGFydCA8IDAgfHwgZGVmaW5pdGlvbkVuZCA+IGNvbnRlbnQubGVuZ3RoIHx8IGRlZmluaXRpb25FbmQgPCBkZWZpbml0aW9uU3RhcnQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGRlZmluaXRpb25UZXh0ID0gY29udGVudC5zbGljZShkZWZpbml0aW9uU3RhcnQsIGRlZmluaXRpb25FbmQpO1xuICBjb25zdCBwcmVmaXggPSBERUZJTklUSU9OX1BSRUZJWF9SRUdfRVhQLmV4ZWMoZGVmaW5pdGlvblRleHQpO1xuICBpZiAoIXByZWZpeCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgdG9rZW5TdGFydCA9IHByZWZpeFswXS5sZW5ndGg7XG4gIGNvbnN0IGlzQW5nbGUgPSBkZWZpbml0aW9uVGV4dC5jaGFyQXQodG9rZW5TdGFydCkgPT09ICc8JztcbiAgbGV0IHRva2VuRW5kID0gaXNBbmdsZSA/IHRva2VuU3RhcnQgKyAxIDogdG9rZW5TdGFydDtcbiAgZm9yICg7IHRva2VuRW5kIDwgZGVmaW5pdGlvblRleHQubGVuZ3RoOyB0b2tlbkVuZCsrKSB7XG4gICAgY29uc3QgY2hhcmFjdGVyID0gZGVmaW5pdGlvblRleHQuY2hhckF0KHRva2VuRW5kKTtcbiAgICBpZiAoaXNBbmdsZSA/IGNoYXJhY3RlciA9PT0gJz4nIHx8IExJTkVfQlJFQUtfUkVHX0VYUC50ZXN0KGNoYXJhY3RlcikgOiBXSElURVNQQUNFX1JFR19FWFAudGVzdChjaGFyYWN0ZXIpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgaWYgKGNoYXJhY3RlciA9PT0gJ1xcXFwnICYmIEFTQ0lJX1BVTkNUVUFUSU9OX1JFR19FWFAudGVzdChkZWZpbml0aW9uVGV4dC5jaGFyQXQodG9rZW5FbmQgKyAxKSkpIHtcbiAgICAgIHRva2VuRW5kKys7XG4gICAgfVxuICB9XG5cbiAgaWYgKGlzQW5nbGUpIHtcbiAgICBpZiAoZGVmaW5pdGlvblRleHQuY2hhckF0KHRva2VuRW5kKSAhPT0gJz4nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdG9rZW5FbmQrKztcbiAgfVxuXG4gIGNvbnN0IGJvdW5kYXJ5ID0gZGVmaW5pdGlvblRleHQuY2hhckF0KHRva2VuRW5kKTtcbiAgaWYgKGJvdW5kYXJ5ICE9PSAnJyAmJiAhV0hJVEVTUEFDRV9SRUdfRVhQLnRlc3QoYm91bmRhcnkpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCByYXcgPSBkZWZpbml0aW9uVGV4dC5zbGljZSh0b2tlblN0YXJ0LCB0b2tlbkVuZCk7XG4gIGNvbnN0IHZhbHVlID0gaXNBbmdsZSA/IHJhdy5zbGljZSgxLCAtMSkgOiByYXc7XG4gIGlmICh0b2tlbkVuZCA9PT0gdG9rZW5TdGFydCB8fCB1bmVzY2FwZURlc3RpbmF0aW9uKHZhbHVlKSAhPT0gZGVmaW5pdGlvbi5saW5rKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGVuZDogZGVmaW5pdGlvblN0YXJ0ICsgdG9rZW5FbmQsXG4gICAgaXNBbmdsZSxcbiAgICByYXcsXG4gICAgc3RhcnQ6IGRlZmluaXRpb25TdGFydCArIHRva2VuU3RhcnRcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0TG9jKGNvbnRlbnQ6IHN0cmluZywgZGVmaW5pdGlvbjogUmVmZXJlbmNlTGlua0NhY2hlLCBvZmZzZXQ6IG51bWJlcik6IExvYyB7XG4gIGNvbnN0IGRlZmluaXRpb25TdGFydCA9IGRlZmluaXRpb24ucG9zaXRpb24uc3RhcnQub2Zmc2V0O1xuICBsZXQgbGluZSA9IGRlZmluaXRpb24ucG9zaXRpb24uc3RhcnQubGluZTtcbiAgZm9yIChsZXQgaW5kZXggPSBkZWZpbml0aW9uU3RhcnQ7IGluZGV4IDwgb2Zmc2V0OyBpbmRleCsrKSB7XG4gICAgaWYgKGNvbnRlbnQuY2hhckF0KGluZGV4KSA9PT0gJ1xcbicpIHtcbiAgICAgIGxpbmUrKztcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNvbDogb2Zmc2V0IC0gKGNvbnRlbnQubGFzdEluZGV4T2YoJ1xcbicsIG9mZnNldCAtIDEpICsgMSksXG4gICAgbGluZSxcbiAgICBvZmZzZXRcbiAgfTtcbn1cblxuZnVuY3Rpb24gdW5lc2NhcGVEZXN0aW5hdGlvbih2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdmFsdWUubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcbiAgICBjb25zdCBuZXh0Q2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4ICsgMSk7XG4gICAgaWYgKGNoYXJhY3RlciA9PT0gJ1xcXFwnICYmIEFTQ0lJX1BVTkNUVUFUSU9OX1JFR19FWFAudGVzdChuZXh0Q2hhcmFjdGVyKSkge1xuICAgICAgcmVzdWx0ICs9IG5leHRDaGFyYWN0ZXI7XG4gICAgICBpbmRleCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgKz0gY2hhcmFjdGVyO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFxQkEsbUJBQXVDO0FBNkJ2QyxNQUFNLDRCQUE0QjtBQUNsQyxNQUFNLCtDQUErQztBQUNyRCxNQUFNLDRCQUE0QjtBQUNsQyxNQUFNLHFCQUFxQjtBQUMzQixNQUFNLHFCQUFxQjtBQWdCcEIsU0FBUyxnQ0FBZ0MsUUFBa0U7QUFDaEgsUUFBTSxFQUFFLFNBQVMsWUFBWSxlQUFlLElBQUk7QUFDaEQsUUFB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
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/// <reference path="./library-references.d.cts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* Edits the destination of a reference-style link definition (`[id]: destination "title"`) that Obsidian reports
|
|
6
|
+
* in `CachedMetadata.referenceLinks`.
|
|
7
|
+
*
|
|
8
|
+
* Read from Obsidian `1.15.1`: a definition's `position` spans the whole definition, its leading indentation
|
|
9
|
+
* included and any blockquote or list marker excluded, and its `link` is the destination with the angle brackets
|
|
10
|
+
* removed and every backslash escape resolved (`Target\#Escaped.md` reports `Target#Escaped.md`). The uses of a
|
|
11
|
+
* definition (`[text][id]`, `[id][]`, `[id]`) are not reported in `links` and name the definition by its id, so
|
|
12
|
+
* rewriting only the destination keeps every one of them pointing at the new target.
|
|
13
|
+
*/
|
|
14
|
+
import type { ReferenceLinkCache } from 'obsidian' with { 'resolution-mode': 'import' };
|
|
15
|
+
import type { FileChange } from './file-change.cjs';
|
|
16
|
+
/**
|
|
17
|
+
* Parameters for {@link referenceDefinitionToFileChange}.
|
|
18
|
+
*/
|
|
19
|
+
export interface ReferenceDefinitionToFileChangeParams {
|
|
20
|
+
/**
|
|
21
|
+
* The content the definition's position refers to.
|
|
22
|
+
*/
|
|
23
|
+
readonly content: string;
|
|
24
|
+
/**
|
|
25
|
+
* The definition, as Obsidian reports it in `CachedMetadata.referenceLinks`.
|
|
26
|
+
*/
|
|
27
|
+
readonly definition: ReferenceLinkCache;
|
|
28
|
+
/**
|
|
29
|
+
* The new destination, unescaped, in the same form as {@link ReferenceLinkCache.link}.
|
|
30
|
+
*/
|
|
31
|
+
readonly newDestination: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Builds the file change that replaces the destination of a reference-style link definition, leaving its id, its
|
|
35
|
+
* title and the rest of the note unchanged.
|
|
36
|
+
*
|
|
37
|
+
* The destination keeps its form: one written in angle brackets stays in them, and a bare one stays bare unless
|
|
38
|
+
* the new destination cannot be written bare (it is empty, holds whitespace or a control character, starts with
|
|
39
|
+
* `<`, or has unbalanced parentheses), in which case it is written in angle brackets. Characters that would end
|
|
40
|
+
* or change the destination are escaped with a backslash.
|
|
41
|
+
*
|
|
42
|
+
* @param params - The parameters for building the file change.
|
|
43
|
+
* @returns The file change, or `null` when the content at the definition's position no longer holds a definition
|
|
44
|
+
* whose destination reads as {@link ReferenceLinkCache.link}, or when the new destination holds a line break,
|
|
45
|
+
* which no destination can.
|
|
46
|
+
*/
|
|
47
|
+
export declare function referenceDefinitionToFileChange(params: ReferenceDefinitionToFileChangeParams): FileChange | null;
|
|
@@ -0,0 +1,279 @@
|
|
|
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
|
+
(function patchObsidianRequire() {
|
|
33
|
+
const originalRequire = require;
|
|
34
|
+
if (!originalRequire || originalRequire.__isPatched) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
require = Object.assign(
|
|
38
|
+
(id) => requirePatched(id),
|
|
39
|
+
originalRequire,
|
|
40
|
+
{
|
|
41
|
+
__isPatched: true
|
|
42
|
+
}
|
|
43
|
+
);
|
|
44
|
+
function extractDefault($module) {
|
|
45
|
+
return $module && $module.__esModule && "default" in $module ? $module.default : $module;
|
|
46
|
+
}
|
|
47
|
+
const OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
|
|
48
|
+
"@codemirror/autocomplete",
|
|
49
|
+
"@codemirror/collab",
|
|
50
|
+
"@codemirror/commands",
|
|
51
|
+
"@codemirror/language",
|
|
52
|
+
"@codemirror/lint",
|
|
53
|
+
"@codemirror/search",
|
|
54
|
+
"@codemirror/state",
|
|
55
|
+
"@codemirror/text",
|
|
56
|
+
"@codemirror/view",
|
|
57
|
+
"@lezer/common",
|
|
58
|
+
"@lezer/highlight",
|
|
59
|
+
"@lezer/lr",
|
|
60
|
+
"obsidian"
|
|
61
|
+
]);
|
|
62
|
+
const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
|
|
63
|
+
"@codemirror/closebrackets",
|
|
64
|
+
"@codemirror/comment",
|
|
65
|
+
"@codemirror/fold",
|
|
66
|
+
"@codemirror/gutter",
|
|
67
|
+
"@codemirror/highlight",
|
|
68
|
+
"@codemirror/history",
|
|
69
|
+
"@codemirror/matchbrackets",
|
|
70
|
+
"@codemirror/panel",
|
|
71
|
+
"@codemirror/rangeset",
|
|
72
|
+
"@codemirror/rectangular-selection",
|
|
73
|
+
"@codemirror/stream-parser",
|
|
74
|
+
"@codemirror/tooltip"
|
|
75
|
+
]);
|
|
76
|
+
function requirePatched(id) {
|
|
77
|
+
if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
|
|
78
|
+
return originalRequire?.(id);
|
|
79
|
+
}
|
|
80
|
+
const app = globalThis.app;
|
|
81
|
+
if (app?.isMobile) {
|
|
82
|
+
if (id === "process" || id === "node:process") {
|
|
83
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
|
|
84
|
+
return process;
|
|
85
|
+
}
|
|
86
|
+
} else {
|
|
87
|
+
const $module = originalRequire?.(id);
|
|
88
|
+
if ($module) {
|
|
89
|
+
return extractDefault($module);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
|
|
93
|
+
return {};
|
|
94
|
+
}
|
|
95
|
+
})();
|
|
96
|
+
|
|
97
|
+
"use strict";
|
|
98
|
+
var __defProp = Object.defineProperty;
|
|
99
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
100
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
101
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
102
|
+
var __export = (target, all) => {
|
|
103
|
+
for (var name in all)
|
|
104
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
105
|
+
};
|
|
106
|
+
var __copyProps = (to, from, except, desc) => {
|
|
107
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
108
|
+
for (let key of __getOwnPropNames(from))
|
|
109
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
110
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
111
|
+
}
|
|
112
|
+
return to;
|
|
113
|
+
};
|
|
114
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
115
|
+
var release_asset_exports = {};
|
|
116
|
+
__export(release_asset_exports, {
|
|
117
|
+
ReleaseAssetChecksumError: () => ReleaseAssetChecksumError,
|
|
118
|
+
computeSha256: () => computeSha256,
|
|
119
|
+
ensureReleaseAsset: () => ensureReleaseAsset,
|
|
120
|
+
formatByteSize: () => formatByteSize,
|
|
121
|
+
getGitHubReleaseAssetUrl: () => getGitHubReleaseAssetUrl
|
|
122
|
+
});
|
|
123
|
+
module.exports = __toCommonJS(release_asset_exports);
|
|
124
|
+
var import_path = require('@mnaoumov/typescript-lib/path');
|
|
125
|
+
var import_i18n = require('./i18n/i18n.cjs');
|
|
126
|
+
var import_confirm = require('./modals/confirm.cjs');
|
|
127
|
+
var import_request_url = require('./request-url.cjs');
|
|
128
|
+
const BYTES_IN_KILOBYTE = 1024;
|
|
129
|
+
const HEX_BYTE_LENGTH = 2;
|
|
130
|
+
const HEX_RADIX = 16;
|
|
131
|
+
const SHA_256_HEX_REG_EXP = /^[0-9a-f]{64}$/i;
|
|
132
|
+
const TEMPORARY_FILE_SUFFIX = ".download";
|
|
133
|
+
class ReleaseAssetChecksumError extends Error {
|
|
134
|
+
/**
|
|
135
|
+
* The SHA-256 of the downloaded bytes.
|
|
136
|
+
*/
|
|
137
|
+
actualSha256;
|
|
138
|
+
/**
|
|
139
|
+
* The expected SHA-256.
|
|
140
|
+
*/
|
|
141
|
+
expectedSha256;
|
|
142
|
+
/**
|
|
143
|
+
* The URL the asset was downloaded from.
|
|
144
|
+
*/
|
|
145
|
+
url;
|
|
146
|
+
/**
|
|
147
|
+
* Creates the error.
|
|
148
|
+
*
|
|
149
|
+
* @param params - The parameters.
|
|
150
|
+
*/
|
|
151
|
+
constructor(params) {
|
|
152
|
+
super(`The asset downloaded from ${params.url} has SHA-256 ${params.actualSha256}, expected ${params.expectedSha256}.`);
|
|
153
|
+
this.name = "ReleaseAssetChecksumError";
|
|
154
|
+
this.actualSha256 = params.actualSha256;
|
|
155
|
+
this.expectedSha256 = params.expectedSha256;
|
|
156
|
+
this.url = params.url;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
const inFlightOperations = /* @__PURE__ */ new Map();
|
|
160
|
+
async function computeSha256(data) {
|
|
161
|
+
const hash = await window.crypto.subtle.digest("SHA-256", data);
|
|
162
|
+
return [...new Uint8Array(hash)].map((byte) => byte.toString(HEX_RADIX).padStart(HEX_BYTE_LENGTH, "0")).join("");
|
|
163
|
+
}
|
|
164
|
+
async function ensureReleaseAsset(params) {
|
|
165
|
+
if (!SHA_256_HEX_REG_EXP.test(params.sha256)) {
|
|
166
|
+
throw new Error(`Invalid SHA-256: ${params.sha256}`);
|
|
167
|
+
}
|
|
168
|
+
if (!params.fileName || /[/\\]/.test(params.fileName) || params.fileName === "." || params.fileName === "..") {
|
|
169
|
+
throw new Error(`Invalid asset file name: ${params.fileName}`);
|
|
170
|
+
}
|
|
171
|
+
const path = (0, import_path.join)(params.cacheFolderPath, params.fileName);
|
|
172
|
+
const inFlightOperation = inFlightOperations.get(path);
|
|
173
|
+
if (inFlightOperation) {
|
|
174
|
+
return await inFlightOperation;
|
|
175
|
+
}
|
|
176
|
+
const operation = ensureReleaseAssetImpl(params, path);
|
|
177
|
+
inFlightOperations.set(path, operation);
|
|
178
|
+
try {
|
|
179
|
+
return await operation;
|
|
180
|
+
} finally {
|
|
181
|
+
inFlightOperations.delete(path);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
function formatByteSize(sizeInBytes) {
|
|
185
|
+
if (sizeInBytes < BYTES_IN_KILOBYTE) {
|
|
186
|
+
return `${String(sizeInBytes)} B`;
|
|
187
|
+
}
|
|
188
|
+
let size = sizeInBytes / BYTES_IN_KILOBYTE;
|
|
189
|
+
let unit = "KB";
|
|
190
|
+
for (const largerUnit of ["MB", "GB"]) {
|
|
191
|
+
if (size < BYTES_IN_KILOBYTE) {
|
|
192
|
+
break;
|
|
193
|
+
}
|
|
194
|
+
size /= BYTES_IN_KILOBYTE;
|
|
195
|
+
unit = largerUnit;
|
|
196
|
+
}
|
|
197
|
+
return `${size.toFixed(1)} ${unit}`;
|
|
198
|
+
}
|
|
199
|
+
function getGitHubReleaseAssetUrl(params) {
|
|
200
|
+
return `https://github.com/${params.repository}/releases/download/${encodeURIComponent(params.tag)}/${encodeURIComponent(params.fileName)}`;
|
|
201
|
+
}
|
|
202
|
+
async function ensureReleaseAssetImpl(params, path) {
|
|
203
|
+
const { abortSignal, app } = params;
|
|
204
|
+
const adapter = app.vault.adapter;
|
|
205
|
+
const expectedSha256 = params.sha256.toLowerCase();
|
|
206
|
+
abortSignal?.throwIfAborted();
|
|
207
|
+
if (await adapter.exists(path)) {
|
|
208
|
+
const cachedBytes = await adapter.readBinary(path);
|
|
209
|
+
if (await computeSha256(cachedBytes) === expectedSha256) {
|
|
210
|
+
return {
|
|
211
|
+
path,
|
|
212
|
+
resourceUrl: adapter.getResourcePath(path),
|
|
213
|
+
wasCached: true
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
await adapter.remove(path);
|
|
217
|
+
}
|
|
218
|
+
const consentRequest = {
|
|
219
|
+
fileName: params.fileName,
|
|
220
|
+
sizeInBytes: params.sizeInBytes,
|
|
221
|
+
url: params.url
|
|
222
|
+
};
|
|
223
|
+
const isDownloadAllowed = params.shouldDownload ? await params.shouldDownload(consentRequest) : await shouldDownloadWithModal(app, consentRequest);
|
|
224
|
+
if (!isDownloadAllowed) {
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
abortSignal?.throwIfAborted();
|
|
228
|
+
const response = await (0, import_request_url.requestUrlEx)({
|
|
229
|
+
abortSignal,
|
|
230
|
+
timeoutInMilliseconds: params.timeoutInMilliseconds,
|
|
231
|
+
url: params.url
|
|
232
|
+
});
|
|
233
|
+
const bytes = response.arrayBuffer;
|
|
234
|
+
const actualSha256 = await computeSha256(bytes);
|
|
235
|
+
if (actualSha256 !== expectedSha256) {
|
|
236
|
+
throw new ReleaseAssetChecksumError({ actualSha256, expectedSha256, url: params.url });
|
|
237
|
+
}
|
|
238
|
+
abortSignal?.throwIfAborted();
|
|
239
|
+
if (!await adapter.exists(params.cacheFolderPath)) {
|
|
240
|
+
await adapter.mkdir(params.cacheFolderPath);
|
|
241
|
+
}
|
|
242
|
+
const temporaryPath = `${path}${TEMPORARY_FILE_SUFFIX}`;
|
|
243
|
+
try {
|
|
244
|
+
await adapter.writeBinary(temporaryPath, bytes);
|
|
245
|
+
if (await adapter.exists(path)) {
|
|
246
|
+
await adapter.remove(path);
|
|
247
|
+
}
|
|
248
|
+
await adapter.rename(temporaryPath, path);
|
|
249
|
+
} catch (error) {
|
|
250
|
+
if (await adapter.exists(temporaryPath)) {
|
|
251
|
+
await adapter.remove(temporaryPath);
|
|
252
|
+
}
|
|
253
|
+
throw error;
|
|
254
|
+
}
|
|
255
|
+
return {
|
|
256
|
+
path,
|
|
257
|
+
resourceUrl: adapter.getResourcePath(path),
|
|
258
|
+
wasCached: false
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
async function shouldDownloadWithModal(app, request) {
|
|
262
|
+
const host = new URL(request.url).host;
|
|
263
|
+
const message = request.sizeInBytes === void 0 ? (0, import_i18n.t)(($) => $.obsidianLib.releaseAsset.consentMessageUnknownSize, { fileName: request.fileName, host }) : (0, import_i18n.t)(($) => $.obsidianLib.releaseAsset.consentMessage, { fileName: request.fileName, host, size: formatByteSize(request.sizeInBytes) });
|
|
264
|
+
return await (0, import_confirm.confirm)({
|
|
265
|
+
app,
|
|
266
|
+
message,
|
|
267
|
+
okButtonText: (0, import_i18n.t)(($) => $.obsidianLib.releaseAsset.download),
|
|
268
|
+
title: (0, import_i18n.t)(($) => $.obsidianLib.releaseAsset.consentTitle, { fileName: request.fileName })
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
272
|
+
0 && (module.exports = {
|
|
273
|
+
ReleaseAssetChecksumError,
|
|
274
|
+
computeSha256,
|
|
275
|
+
ensureReleaseAsset,
|
|
276
|
+
formatByteSize,
|
|
277
|
+
getGitHubReleaseAssetUrl
|
|
278
|
+
});
|
|
279
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZWxlYXNlLWFzc2V0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBEb3dubG9hZHMgYW4gb3B0aW9uYWwgZGF0YSBhc3NldCBvZiBhIHBsdWdpbiByZWxlYXNlIG9uIGRlbWFuZDogaXQgYXNrcyB0aGUgdXNlciBmaXJzdCwgdmVyaWZpZXMgYW4gZXhwZWN0ZWQgU0hBLTI1NlxuICogYmVmb3JlIGFueXRoaW5nIGlzIHdyaXR0ZW4gb3IgZXhwb3NlZCwga2VlcHMgdGhlIHZlcmlmaWVkIGZpbGUgaW4gYSBsb2NhbCBjYWNoZSBmb2xkZXIgYW5kIGhhbmRzIGJhY2sgdGhlIGFkYXB0ZXJcbiAqIHJlc291cmNlIFVSTC5cbiAqXG4gKiBJdCB1c2VzIG9ubHkgY3Jvc3MtcGxhdGZvcm0gQVBJcyAoe0BsaW5rIHJlcXVlc3RVcmxFeH0sIHRoZSB2YXVsdCBhZGFwdGVyIGFuZCBgY3J5cHRvLnN1YnRsZWApLCBzbyBpdCB3b3JrcyBvbiBkZXNrdG9wXG4gKiBhbmQgbW9iaWxlIGFsaWtlLlxuICpcbiAqIEJlaGF2aW9yIHRoYXQgaXMgcGFydCBvZiB0aGUgY29udHJhY3Q6XG4gKlxuICogLSBBIGNhY2hlZCBmaWxlIGlzIGhhc2hlZCBvbiBldmVyeSBjYWxsLiBXaGVuIGl0cyBoYXNoIG1hdGNoZXMsIGl0IGlzIHJldXNlZCB3aXRob3V0IGFza2luZyBvciBkb3dubG9hZGluZy4gV2hlbiBpdFxuICogICBkb2VzIG5vdCwgaXQgaXMgcmVtb3ZlZCBhbmQgdHJlYXRlZCBhcyBtaXNzaW5nLCBzbyBhIGNvcnJ1cHQgb3IgdHJ1bmNhdGVkIGNhY2hlIHJlY292ZXJzIGJ5IGl0c2VsZi5cbiAqIC0gVGhlIHVzZXIgaXMgYXNrZWQgb25seSB3aGVuIGEgZG93bmxvYWQgaXMgbmVlZGVkLiBEZWNsaW5pbmcgcmVzb2x2ZXMgd2l0aCBgbnVsbGAgYW5kIHdyaXRlcyBub3RoaW5nLlxuICogLSBEb3dubG9hZGVkIGJ5dGVzIGFyZSB2ZXJpZmllZCBiZWZvcmUgdGhleSBhcmUgd3JpdHRlbi4gQSBtaXNtYXRjaCB0aHJvd3Mge0BsaW5rIFJlbGVhc2VBc3NldENoZWNrc3VtRXJyb3J9IGFuZFxuICogICB3cml0ZXMgbm90aGluZy5cbiAqIC0gVGhlIGZpbGUgaXMgd3JpdHRlbiB0byBhIHRlbXBvcmFyeSBzaWJsaW5nIGFuZCB0aGVuIHJlbmFtZWQgaW50byBwbGFjZSwgc28gYW4gaW50ZXJydXB0ZWQgd3JpdGUgbmV2ZXIgbGVhdmVzIGFcbiAqICAgcGFydGlhbCBmaWxlIHVuZGVyIHRoZSBjYWNoZWQgbmFtZS5cbiAqIC0gQW4gYWJvcnQgKHBhc3MgdGhlIHBsdWdpbidzIGFib3J0IHNpZ25hbCwgc28gYSBwbHVnaW4gdW5sb2FkIGNvdW50cykgcmVqZWN0cyB3aXRoIHRoZSBzaWduYWwncyByZWFzb24uIE9uY2UgdGhlXG4gKiAgIGRvd25sb2FkIGhhcyBmaW5pc2hlZCwgdGhlIHNpZ25hbCBpcyBjaGVja2VkIGFnYWluIGJlZm9yZSB3cml0aW5nLCBzbyBub3RoaW5nIGlzIHdyaXR0ZW4gYWZ0ZXIgYW4gdW5sb2FkLlxuICogLSBDb25jdXJyZW50IGNhbGxzIGZvciB0aGUgc2FtZSBjYWNoZSBwYXRoIHNoYXJlIG9uZSBvcGVyYXRpb24sIHNvIHRoZSB1c2VyIGlzIGFza2VkIG9uY2UuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGpvaW4gfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcGF0aCc7XG5cbmltcG9ydCB7IHQgfSBmcm9tICcuL2kxOG4vaTE4bi50cyc7XG5pbXBvcnQgeyBjb25maXJtIH0gZnJvbSAnLi9tb2RhbHMvY29uZmlybS50cyc7XG5pbXBvcnQgeyByZXF1ZXN0VXJsRXggfSBmcm9tICcuL3JlcXVlc3QtdXJsLnRzJztcblxuY29uc3QgQllURVNfSU5fS0lMT0JZVEUgPSAxMDI0O1xuY29uc3QgSEVYX0JZVEVfTEVOR1RIID0gMjtcbmNvbnN0IEhFWF9SQURJWCA9IDE2O1xuY29uc3QgU0hBXzI1Nl9IRVhfUkVHX0VYUCA9IC9eWzAtOWEtZl17NjR9JC9pO1xuY29uc3QgVEVNUE9SQVJZX0ZJTEVfU1VGRklYID0gJy5kb3dubG9hZCc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGVuc3VyZVJlbGVhc2VBc3NldH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW5zdXJlUmVsZWFzZUFzc2V0UGFyYW1zIHtcbiAgLyoqXG4gICAqIEFib3J0cyB0aGUgb3BlcmF0aW9uLiBQYXNzIHRoZSBwbHVnaW4ncyBhYm9ydCBzaWduYWwsIHNvIGFuIHVubG9hZCBzdG9wcyBpdC5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgdmF1bHQtcmVsYXRpdmUgZm9sZGVyIHRoYXQgaG9sZHMgdGhlIGNhY2hlZCBmaWxlLCB0eXBpY2FsbHkgYCR7cGx1Z2luLm1hbmlmZXN0LmRpcn0vYXNzZXRzYC5cbiAgICpcbiAgICogQSBmb2xkZXIgaW5zaWRlIHRoZSBjb25maWcgZm9sZGVyIGlzIG5vdCBzeW5jZWQsIHNvIGVhY2ggZGV2aWNlIGRvd25sb2FkcyB0aGUgYXNzZXQgb25jZS5cbiAgICovXG4gIHJlYWRvbmx5IGNhY2hlRm9sZGVyUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgY2FjaGVkIGZpbGUuIEl0IG11c3Qgbm90IGNvbnRhaW4gYSBwYXRoIHNlcGFyYXRvci5cbiAgICovXG4gIHJlYWRvbmx5IGZpbGVOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBleHBlY3RlZCBTSEEtMjU2IG9mIHRoZSBhc3NldCwgYXMgNjQgaGV4YWRlY2ltYWwgZGlnaXRzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hhMjU2OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFza3MgdGhlIHVzZXIgd2hldGhlciB0byBkb3dubG9hZCB0aGUgYXNzZXQuIERlZmF1bHRzIHRvIGEgY29uZmlybWF0aW9uIG1vZGFsLlxuICAgKlxuICAgKiBQYXNzIGAoKSA9PiBQcm9taXNlLnJlc29sdmUodHJ1ZSlgIHdoZW4gdGhlIHVzZXIgaGFzIGFscmVhZHkgYWdyZWVkLCBmb3IgZXhhbXBsZSB0aHJvdWdoIGEgc2V0dGluZy5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZERvd25sb2FkPzogKChyZXF1ZXN0OiBSZWxlYXNlQXNzZXRDb25zZW50UmVxdWVzdCkgPT4gUHJvbWlzZTxib29sZWFuPikgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBzaXplIG9mIHRoZSBhc3NldCBpbiBieXRlcywgc2hvd24gdG8gdGhlIHVzZXIgd2hlbiBhc2tpbmcuXG4gICAqL1xuICByZWFkb25seSBzaXplSW5CeXRlcz86IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIGRvd25sb2FkIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgVVJMIHRvIGRvd25sb2FkIHRoZSBhc3NldCBmcm9tLiBPbmx5IGBodHRwOmAgYW5kIGBodHRwczpgIFVSTHMgYXJlIGFjY2VwdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldEdpdEh1YlJlbGVhc2VBc3NldFVybH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0R2l0SHViUmVsZWFzZUFzc2V0VXJsUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSByZWxlYXNlIGFzc2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJlcG9zaXRvcnksIGFzIGA8b3duZXI+LzxuYW1lPmAuXG4gICAqL1xuICByZWFkb25seSByZXBvc2l0b3J5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZWxlYXNlIHRhZywgdHlwaWNhbGx5IHRoZSBwbHVnaW4gdmVyc2lvbi5cbiAgICovXG4gIHJlYWRvbmx5IHRhZzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgdmVyaWZpZWQgcmVsZWFzZSBhc3NldC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWxlYXNlQXNzZXQge1xuICAvKipcbiAgICogVGhlIHZhdWx0LXJlbGF0aXZlIHBhdGggb2YgdGhlIGNhY2hlZCBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgVVJMIG9mIHRoZSBjYWNoZWQgZmlsZSwgZnJvbSB0aGUgYWRhcHRlcidzIGBnZXRSZXNvdXJjZVBhdGhgLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VVcmw6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgZmlsZSB3YXMgYWxyZWFkeSBjYWNoZWQsIHNvIG5vdGhpbmcgd2FzIGRvd25sb2FkZWQuXG4gICAqL1xuICByZWFkb25seSB3YXNDYWNoZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIFJlbGVhc2VBc3NldENoZWNrc3VtRXJyb3J9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbGVhc2VBc3NldENoZWNrc3VtRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgU0hBLTI1NiBvZiB0aGUgZG93bmxvYWRlZCBieXRlcy5cbiAgICovXG4gIHJlYWRvbmx5IGFjdHVhbFNoYTI1Njogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZXhwZWN0ZWQgU0hBLTI1Ni5cbiAgICovXG4gIHJlYWRvbmx5IGV4cGVjdGVkU2hhMjU2OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBVUkwgdGhlIGFzc2V0IHdhcyBkb3dubG9hZGVkIGZyb20uXG4gICAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGF0IHRoZSB1c2VyIGlzIGFza2VkIHRvIGFncmVlIHRvLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbGVhc2VBc3NldENvbnNlbnRSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBhc3NldC5cbiAgICovXG4gIHJlYWRvbmx5IGZpbGVOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzaXplIG9mIHRoZSBhc3NldCBpbiBieXRlcywgd2hlbiBrbm93bi5cbiAgICovXG4gIHJlYWRvbmx5IHNpemVJbkJ5dGVzPzogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgVVJMIHRoZSBhc3NldCBpcyBkb3dubG9hZGVkIGZyb20uXG4gICAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBkb3dubG9hZGVkIGJ5dGVzIGRvIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWQgU0hBLTI1Ni4gTm90aGluZyB3YXMgd3JpdHRlbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlbGVhc2VBc3NldENoZWNrc3VtRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBUaGUgU0hBLTI1NiBvZiB0aGUgZG93bmxvYWRlZCBieXRlcy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhY3R1YWxTaGEyNTY6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGV4cGVjdGVkIFNIQS0yNTYuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZXhwZWN0ZWRTaGEyNTY6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFVSTCB0aGUgYXNzZXQgd2FzIGRvd25sb2FkZWQgZnJvbS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB1cmw6IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgZXJyb3IuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFJlbGVhc2VBc3NldENoZWNrc3VtRXJyb3JDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKGBUaGUgYXNzZXQgZG93bmxvYWRlZCBmcm9tICR7cGFyYW1zLnVybH0gaGFzIFNIQS0yNTYgJHtwYXJhbXMuYWN0dWFsU2hhMjU2fSwgZXhwZWN0ZWQgJHtwYXJhbXMuZXhwZWN0ZWRTaGEyNTZ9LmApO1xuICAgIHRoaXMubmFtZSA9ICdSZWxlYXNlQXNzZXRDaGVja3N1bUVycm9yJztcbiAgICB0aGlzLmFjdHVhbFNoYTI1NiA9IHBhcmFtcy5hY3R1YWxTaGEyNTY7XG4gICAgdGhpcy5leHBlY3RlZFNoYTI1NiA9IHBhcmFtcy5leHBlY3RlZFNoYTI1NjtcbiAgICB0aGlzLnVybCA9IHBhcmFtcy51cmw7XG4gIH1cbn1cblxuY29uc3QgaW5GbGlnaHRPcGVyYXRpb25zID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8bnVsbCB8IFJlbGVhc2VBc3NldD4+KCk7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIFNIQS0yNTYgb2YgdGhlIGdpdmVuIGJ5dGVzLlxuICpcbiAqIEBwYXJhbSBkYXRhIC0gVGhlIGJ5dGVzLlxuICogQHJldHVybnMgVGhlIFNIQS0yNTYgYXMgNjQgbG93ZXJjYXNlIGhleGFkZWNpbWFsIGRpZ2l0cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbXB1dGVTaGEyNTYoZGF0YTogQXJyYXlCdWZmZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbi9uby11bnN1cHBvcnRlZC1mZWF0dXJlcy9ub2RlLWJ1aWx0aW5zIC0tIFRoaXMgaXMgdGhlIE9ic2lkaWFuIHJlbmRlcmVyIFdlYiBBUEksIG5vdCBhIE5vZGUgYnVpbHRpbi5cbiAgY29uc3QgaGFzaCA9IGF3YWl0IHdpbmRvdy5jcnlwdG8uc3VidGxlLmRpZ2VzdCgnU0hBLTI1NicsIGRhdGEpO1xuICByZXR1cm4gWy4uLm5ldyBVaW50OEFycmF5KGhhc2gpXS5tYXAoKGJ5dGUpID0+IGJ5dGUudG9TdHJpbmcoSEVYX1JBRElYKS5wYWRTdGFydChIRVhfQllURV9MRU5HVEgsICcwJykpLmpvaW4oJycpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGNhY2hlZCwgdmVyaWZpZWQgYXNzZXQsIGRvd25sb2FkaW5nIGl0IGZpcnN0LCB3aXRoIHRoZSB1c2VyJ3MgY29uc2VudCwgd2hlbiBpdCBpcyBtaXNzaW5nIG9yIGNvcnJ1cHQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgVGhlIHZlcmlmaWVkIGFzc2V0LCBvciBgbnVsbGAgd2hlbiB0aGUgdXNlciBkZWNsaW5lZCB0aGUgZG93bmxvYWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVSZWxlYXNlQXNzZXQocGFyYW1zOiBFbnN1cmVSZWxlYXNlQXNzZXRQYXJhbXMpOiBQcm9taXNlPG51bGwgfCBSZWxlYXNlQXNzZXQ+IHtcbiAgaWYgKCFTSEFfMjU2X0hFWF9SRUdfRVhQLnRlc3QocGFyYW1zLnNoYTI1NikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgU0hBLTI1NjogJHtwYXJhbXMuc2hhMjU2fWApO1xuICB9XG5cbiAgaWYgKCFwYXJhbXMuZmlsZU5hbWUgfHwgL1svXFxcXF0vLnRlc3QocGFyYW1zLmZpbGVOYW1lKSB8fCBwYXJhbXMuZmlsZU5hbWUgPT09ICcuJyB8fCBwYXJhbXMuZmlsZU5hbWUgPT09ICcuLicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYXNzZXQgZmlsZSBuYW1lOiAke3BhcmFtcy5maWxlTmFtZX1gKTtcbiAgfVxuXG4gIGNvbnN0IHBhdGggPSBqb2luKHBhcmFtcy5jYWNoZUZvbGRlclBhdGgsIHBhcmFtcy5maWxlTmFtZSk7XG4gIGNvbnN0IGluRmxpZ2h0T3BlcmF0aW9uID0gaW5GbGlnaHRPcGVyYXRpb25zLmdldChwYXRoKTtcbiAgaWYgKGluRmxpZ2h0T3BlcmF0aW9uKSB7XG4gICAgcmV0dXJuIGF3YWl0IGluRmxpZ2h0T3BlcmF0aW9uO1xuICB9XG5cbiAgY29uc3Qgb3BlcmF0aW9uID0gZW5zdXJlUmVsZWFzZUFzc2V0SW1wbChwYXJhbXMsIHBhdGgpO1xuICBpbkZsaWdodE9wZXJhdGlvbnMuc2V0KHBhdGgsIG9wZXJhdGlvbik7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IG9wZXJhdGlvbjtcbiAgfSBmaW5hbGx5IHtcbiAgICBpbkZsaWdodE9wZXJhdGlvbnMuZGVsZXRlKHBhdGgpO1xuICB9XG59XG5cbi8qKlxuICogRm9ybWF0cyBhIGJ5dGUgc2l6ZSBmb3IgYSBwZXJzb24gdG8gcmVhZC5cbiAqXG4gKiBAcGFyYW0gc2l6ZUluQnl0ZXMgLSBUaGUgc2l6ZSBpbiBieXRlcy5cbiAqIEByZXR1cm5zIFRoZSBmb3JtYXR0ZWQgc2l6ZSwgc3VjaCBhcyBgMTIuMyBNQmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRCeXRlU2l6ZShzaXplSW5CeXRlczogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKHNpemVJbkJ5dGVzIDwgQllURVNfSU5fS0lMT0JZVEUpIHtcbiAgICByZXR1cm4gYCR7U3RyaW5nKHNpemVJbkJ5dGVzKX0gQmA7XG4gIH1cbiAgbGV0IHNpemUgPSBzaXplSW5CeXRlcyAvIEJZVEVTX0lOX0tJTE9CWVRFO1xuICBsZXQgdW5pdCA9ICdLQic7XG4gIGZvciAoY29uc3QgbGFyZ2VyVW5pdCBvZiBbJ01CJywgJ0dCJ10pIHtcbiAgICBpZiAoc2l6ZSA8IEJZVEVTX0lOX0tJTE9CWVRFKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgc2l6ZSAvPSBCWVRFU19JTl9LSUxPQllURTtcbiAgICB1bml0ID0gbGFyZ2VyVW5pdDtcbiAgfVxuICByZXR1cm4gYCR7c2l6ZS50b0ZpeGVkKDEpfSAke3VuaXR9YDtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGRvd25sb2FkIFVSTCBvZiBhIEdpdEh1YiByZWxlYXNlIGFzc2V0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIFRoZSBVUkwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRHaXRIdWJSZWxlYXNlQXNzZXRVcmwocGFyYW1zOiBHZXRHaXRIdWJSZWxlYXNlQXNzZXRVcmxQYXJhbXMpOiBzdHJpbmcge1xuICByZXR1cm4gYGh0dHBzOi8vZ2l0aHViLmNvbS8ke3BhcmFtcy5yZXBvc2l0b3J5fS9yZWxlYXNlcy9kb3dubG9hZC8ke2VuY29kZVVSSUNvbXBvbmVudChwYXJhbXMudGFnKX0vJHtlbmNvZGVVUklDb21wb25lbnQocGFyYW1zLmZpbGVOYW1lKX1gO1xufVxuXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVSZWxlYXNlQXNzZXRJbXBsKHBhcmFtczogRW5zdXJlUmVsZWFzZUFzc2V0UGFyYW1zLCBwYXRoOiBzdHJpbmcpOiBQcm9taXNlPG51bGwgfCBSZWxlYXNlQXNzZXQ+IHtcbiAgY29uc3QgeyBhYm9ydFNpZ25hbCwgYXBwIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGFkYXB0ZXIgPSBhcHAudmF1bHQuYWRhcHRlcjtcbiAgY29uc3QgZXhwZWN0ZWRTaGEyNTYgPSBwYXJhbXMuc2hhMjU2LnRvTG93ZXJDYXNlKCk7XG4gIGFib3J0U2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuXG4gIGlmIChhd2FpdCBhZGFwdGVyLmV4aXN0cyhwYXRoKSkge1xuICAgIGNvbnN0IGNhY2hlZEJ5dGVzID0gYXdhaXQgYWRhcHRlci5yZWFkQmluYXJ5KHBhdGgpO1xuICAgIGlmIChhd2FpdCBjb21wdXRlU2hhMjU2KGNhY2hlZEJ5dGVzKSA9PT0gZXhwZWN0ZWRTaGEyNTYpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhdGgsXG4gICAgICAgIHJlc291cmNlVXJsOiBhZGFwdGVyLmdldFJlc291cmNlUGF0aChwYXRoKSxcbiAgICAgICAgd2FzQ2FjaGVkOiB0cnVlXG4gICAgICB9O1xuICAgIH1cbiAgICBhd2FpdCBhZGFwdGVyLnJlbW92ZShwYXRoKTtcbiAgfVxuXG4gIGNvbnN0IGNvbnNlbnRSZXF1ZXN0OiBSZWxlYXNlQXNzZXRDb25zZW50UmVxdWVzdCA9IHtcbiAgICBmaWxlTmFtZTogcGFyYW1zLmZpbGVOYW1lLFxuICAgIHNpemVJbkJ5dGVzOiBwYXJhbXMuc2l6ZUluQnl0ZXMsXG4gICAgdXJsOiBwYXJhbXMudXJsXG4gIH07XG4gIGNvbnN0IGlzRG93bmxvYWRBbGxvd2VkID0gcGFyYW1zLnNob3VsZERvd25sb2FkID8gYXdhaXQgcGFyYW1zLnNob3VsZERvd25sb2FkKGNvbnNlbnRSZXF1ZXN0KSA6IGF3YWl0IHNob3VsZERvd25sb2FkV2l0aE1vZGFsKGFwcCwgY29uc2VudFJlcXVlc3QpO1xuICBpZiAoIWlzRG93bmxvYWRBbGxvd2VkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgYWJvcnRTaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0VXJsRXgoe1xuICAgIGFib3J0U2lnbmFsLFxuICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogcGFyYW1zLnRpbWVvdXRJbk1pbGxpc2Vjb25kcyxcbiAgICB1cmw6IHBhcmFtcy51cmxcbiAgfSk7XG4gIGNvbnN0IGJ5dGVzID0gcmVzcG9uc2UuYXJyYXlCdWZmZXI7XG4gIGNvbnN0IGFjdHVhbFNoYTI1NiA9IGF3YWl0IGNvbXB1dGVTaGEyNTYoYnl0ZXMpO1xuICBpZiAoYWN0dWFsU2hhMjU2ICE9PSBleHBlY3RlZFNoYTI1Nikge1xuICAgIHRocm93IG5ldyBSZWxlYXNlQXNzZXRDaGVja3N1bUVycm9yKHsgYWN0dWFsU2hhMjU2LCBleHBlY3RlZFNoYTI1NiwgdXJsOiBwYXJhbXMudXJsIH0pO1xuICB9XG4gIGFib3J0U2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuXG4gIGlmICghYXdhaXQgYWRhcHRlci5leGlzdHMocGFyYW1zLmNhY2hlRm9sZGVyUGF0aCkpIHtcbiAgICBhd2FpdCBhZGFwdGVyLm1rZGlyKHBhcmFtcy5jYWNoZUZvbGRlclBhdGgpO1xuICB9XG5cbiAgY29uc3QgdGVtcG9yYXJ5UGF0aCA9IGAke3BhdGh9JHtURU1QT1JBUllfRklMRV9TVUZGSVh9YDtcbiAgdHJ5IHtcbiAgICBhd2FpdCBhZGFwdGVyLndyaXRlQmluYXJ5KHRlbXBvcmFyeVBhdGgsIGJ5dGVzKTtcbiAgICBpZiAoYXdhaXQgYWRhcHRlci5leGlzdHMocGF0aCkpIHtcbiAgICAgIGF3YWl0IGFkYXB0ZXIucmVtb3ZlKHBhdGgpO1xuICAgIH1cbiAgICBhd2FpdCBhZGFwdGVyLnJlbmFtZSh0ZW1wb3JhcnlQYXRoLCBwYXRoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoYXdhaXQgYWRhcHRlci5leGlzdHModGVtcG9yYXJ5UGF0aCkpIHtcbiAgICAgIGF3YWl0IGFkYXB0ZXIucmVtb3ZlKHRlbXBvcmFyeVBhdGgpO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGF0aCxcbiAgICByZXNvdXJjZVVybDogYWRhcHRlci5nZXRSZXNvdXJjZVBhdGgocGF0aCksXG4gICAgd2FzQ2FjaGVkOiBmYWxzZVxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBzaG91bGREb3dubG9hZFdpdGhNb2RhbChhcHA6IEFwcCwgcmVxdWVzdDogUmVsZWFzZUFzc2V0Q29uc2VudFJlcXVlc3QpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgaG9zdCA9IG5ldyBVUkwocmVxdWVzdC51cmwpLmhvc3Q7XG4gIGNvbnN0IG1lc3NhZ2UgPSByZXF1ZXN0LnNpemVJbkJ5dGVzID09PSB1bmRlZmluZWRcbiAgICA/IHQoKCQpID0+ICQub2JzaWRpYW5MaWIucmVsZWFzZUFzc2V0LmNvbnNlbnRNZXNzYWdlVW5rbm93blNpemUsIHsgZmlsZU5hbWU6IHJlcXVlc3QuZmlsZU5hbWUsIGhvc3QgfSlcbiAgICA6IHQoKCQpID0+ICQub2JzaWRpYW5MaWIucmVsZWFzZUFzc2V0LmNvbnNlbnRNZXNzYWdlLCB7IGZpbGVOYW1lOiByZXF1ZXN0LmZpbGVOYW1lLCBob3N0LCBzaXplOiBmb3JtYXRCeXRlU2l6ZShyZXF1ZXN0LnNpemVJbkJ5dGVzKSB9KTtcbiAgcmV0dXJuIGF3YWl0IGNvbmZpcm0oe1xuICAgIGFwcCxcbiAgICBtZXNzYWdlLFxuICAgIG9rQnV0dG9uVGV4dDogdCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5yZWxlYXNlQXNzZXQuZG93bmxvYWQpLFxuICAgIHRpdGxlOiB0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnJlbGVhc2VBc3NldC5jb25zZW50VGl0bGUsIHsgZmlsZU5hbWU6IHJlcXVlc3QuZmlsZU5hbWUgfSlcbiAgfSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTBCQSxrQkFBcUI7QUFFckIsa0JBQWtCO0FBQ2xCLHFCQUF3QjtBQUN4Qix5QkFBNkI7QUFFN0IsTUFBTSxvQkFBb0I7QUFDMUIsTUFBTSxrQkFBa0I7QUFDeEIsTUFBTSxZQUFZO0FBQ2xCLE1BQU0sc0JBQXNCO0FBQzVCLE1BQU0sd0JBQXdCO0FBMkl2QixNQUFNLGtDQUFrQyxNQUFNO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbkM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9ULFlBQVksUUFB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
|