@mnaoumov/obsidian-lib 10.9.0 → 10.11.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 (79) hide show
  1. package/codemirror/editor-mode-extension/package.json +6 -0
  2. package/dist/lib/cjs/__merged.cjs +42 -1
  3. package/dist/lib/cjs/__merged.d.cts +6 -1
  4. package/dist/lib/cjs/codemirror/editor-mode-extension.cjs +180 -0
  5. package/dist/lib/cjs/codemirror/editor-mode-extension.d.cts +50 -0
  6. package/dist/lib/cjs/codemirror/index.cjs +4 -1
  7. package/dist/lib/cjs/codemirror/index.d.cts +1 -0
  8. package/dist/lib/cjs/codemirror/inline-token-widgets.cjs +4 -7
  9. package/dist/lib/cjs/components/plugin-settings-component.cjs +4 -3
  10. package/dist/lib/cjs/components/plugin-settings-component.d.cts +2 -1
  11. package/dist/lib/cjs/css-class.cjs +7 -1
  12. package/dist/lib/cjs/css-class.d.cts +24 -0
  13. package/dist/lib/cjs/generated-during-build.cjs +2 -2
  14. package/dist/lib/cjs/i18n/i18n.cjs +38 -10
  15. package/dist/lib/cjs/i18n/i18n.d.cts +29 -2
  16. package/dist/lib/cjs/i18n/locales/en.cjs +19 -1
  17. package/dist/lib/cjs/i18n/locales/en.d.cts +18 -0
  18. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +18 -0
  19. package/dist/lib/cjs/index.cjs +7 -1
  20. package/dist/lib/cjs/index.d.cts +2 -0
  21. package/dist/lib/cjs/link.cjs +40 -1
  22. package/dist/lib/cjs/link.d.cts +37 -1
  23. package/dist/lib/cjs/modals/code-block-builder.cjs +486 -0
  24. package/dist/lib/cjs/modals/code-block-builder.d.cts +321 -0
  25. package/dist/lib/cjs/modals/index.cjs +4 -1
  26. package/dist/lib/cjs/modals/index.d.cts +1 -0
  27. package/dist/lib/cjs/plugin/index.cjs +4 -1
  28. package/dist/lib/cjs/plugin/index.d.cts +1 -0
  29. package/dist/lib/cjs/plugin/plugin-async-cleanup.cjs +189 -0
  30. package/dist/lib/cjs/plugin/plugin-async-cleanup.d.cts +111 -0
  31. package/dist/lib/cjs/plugin/plugin.cjs +47 -2
  32. package/dist/lib/cjs/plugin/plugin.d.cts +25 -1
  33. package/dist/lib/cjs/reference-definition.cjs +234 -0
  34. package/dist/lib/cjs/reference-definition.d.cts +47 -0
  35. package/dist/lib/cjs/release-asset.cjs +279 -0
  36. package/dist/lib/cjs/release-asset.d.cts +190 -0
  37. package/dist/lib/cjs/workspace.cjs +3 -2
  38. package/dist/lib/cjs/workspace.d.cts +6 -0
  39. package/dist/lib/esm/__merged.d.mts +6 -1
  40. package/dist/lib/esm/__merged.mjs +45 -1
  41. package/dist/lib/esm/codemirror/editor-mode-extension.d.mts +50 -0
  42. package/dist/lib/esm/codemirror/editor-mode-extension.mjs +93 -0
  43. package/dist/lib/esm/codemirror/index.d.mts +1 -0
  44. package/dist/lib/esm/codemirror/index.mjs +3 -1
  45. package/dist/lib/esm/codemirror/inline-token-widgets.mjs +3 -9
  46. package/dist/lib/esm/components/plugin-settings-component.d.mts +2 -1
  47. package/dist/lib/esm/components/plugin-settings-component.mjs +4 -3
  48. package/dist/lib/esm/css-class.d.mts +24 -0
  49. package/dist/lib/esm/css-class.mjs +7 -1
  50. package/dist/lib/esm/generated-during-build.mjs +2 -2
  51. package/dist/lib/esm/i18n/i18n.d.mts +29 -2
  52. package/dist/lib/esm/i18n/i18n.mjs +40 -10
  53. package/dist/lib/esm/i18n/locales/en.d.mts +18 -0
  54. package/dist/lib/esm/i18n/locales/en.mjs +19 -1
  55. package/dist/lib/esm/i18n/locales/translations-map.d.mts +18 -0
  56. package/dist/lib/esm/index.d.mts +2 -0
  57. package/dist/lib/esm/index.mjs +5 -1
  58. package/dist/lib/esm/link.d.mts +37 -1
  59. package/dist/lib/esm/link.mjs +40 -1
  60. package/dist/lib/esm/modals/code-block-builder.d.mts +321 -0
  61. package/dist/lib/esm/modals/code-block-builder.mjs +408 -0
  62. package/dist/lib/esm/modals/index.d.mts +1 -0
  63. package/dist/lib/esm/modals/index.mjs +3 -1
  64. package/dist/lib/esm/plugin/index.d.mts +1 -0
  65. package/dist/lib/esm/plugin/index.mjs +3 -1
  66. package/dist/lib/esm/plugin/plugin-async-cleanup.d.mts +111 -0
  67. package/dist/lib/esm/plugin/plugin-async-cleanup.mjs +96 -0
  68. package/dist/lib/esm/plugin/plugin.d.mts +25 -1
  69. package/dist/lib/esm/plugin/plugin.mjs +52 -2
  70. package/dist/lib/esm/reference-definition.d.mts +47 -0
  71. package/dist/lib/esm/reference-definition.mjs +146 -0
  72. package/dist/lib/esm/release-asset.d.mts +190 -0
  73. package/dist/lib/esm/release-asset.mjs +187 -0
  74. package/dist/lib/esm/workspace.d.mts +6 -0
  75. package/dist/lib/esm/workspace.mjs +3 -2
  76. package/dist/styles.css +31 -1
  77. package/modals/code-block-builder/package.json +6 -0
  78. package/package.json +1 -1
  79. package/plugin/plugin-async-cleanup/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/IHJhdy5zbGljZSgxLCAtMSkgOiByYXc7XG4gIGlmICh0b2tlbkVuZCA9PT0gdG9rZW5TdGFydCB8fCB1bmVzY2FwZURlc3RpbmF0aW9uKHZhbHVlKSAhPT0gZGVmaW5pdGlvbi5saW5rKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGVuZDogZGVmaW5pdGlvblN0YXJ0ICsgdG9rZW5FbmQsXG4gICAgaXNBbmdsZSxcbiAgICByYXcsXG4gICAgc3RhcnQ6IGRlZmluaXRpb25TdGFydCArIHRva2VuU3RhcnRcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0TG9jKGNvbnRlbnQ6IHN0cmluZywgZGVmaW5pdGlvbjogUmVmZXJlbmNlTGlua0NhY2hlLCBvZmZzZXQ6IG51bWJlcik6IExvYyB7XG4gIGNvbnN0IGRlZmluaXRpb25TdGFydCA9IGRlZmluaXRpb24ucG9zaXRpb24uc3RhcnQub2Zmc2V0O1xuICBsZXQgbGluZSA9IGRlZmluaXRpb24ucG9zaXRpb24uc3RhcnQubGluZTtcbiAgZm9yIChsZXQgaW5kZXggPSBkZWZpbml0aW9uU3RhcnQ7IGluZGV4IDwgb2Zmc2V0OyBpbmRleCsrKSB7XG4gICAgaWYgKGNvbnRlbnQuY2hhckF0KGluZGV4KSA9PT0gJ1xcbicpIHtcbiAgICAgIGxpbmUrKztcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNvbDogb2Zmc2V0IC0gKGNvbnRlbnQubGFzdEluZGV4T2YoJ1xcbicsIG9mZnNldCAtIDEpICsgMSksXG4gICAgbGluZSxcbiAgICBvZmZzZXRcbiAgfTtcbn1cblxuZnVuY3Rpb24gdW5lc2NhcGVEZXN0aW5hdGlvbih2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdmFsdWUubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgY29uc3QgY2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4KTtcbiAgICBjb25zdCBuZXh0Q2hhcmFjdGVyID0gdmFsdWUuY2hhckF0KGluZGV4ICsgMSk7XG4gICAgaWYgKGNoYXJhY3RlciA9PT0gJ1xcXFwnICYmIEFTQ0lJX1BVTkNUVUFUSU9OX1JFR19FWFAudGVzdChuZXh0Q2hhcmFjdGVyKSkge1xuICAgICAgcmVzdWx0ICs9IG5leHRDaGFyYWN0ZXI7XG4gICAgICBpbmRleCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgKz0gY2hhcmFjdGVyO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFxQkEsbUJBQXVDO0FBNkJ2QyxNQUFNLDRCQUE0QjtBQUNsQyxNQUFNLCtDQUErQztBQUNyRCxNQUFNLDRCQUE0QjtBQUNsQyxNQUFNLHFCQUFxQjtBQUMzQixNQUFNLHFCQUFxQjtBQWdCcEIsU0FBUyxnQ0FBZ0MsUUFBa0U7QUFDaEgsUUFBTSxFQUFFLFNBQVMsWUFBWSxlQUFlLElBQUk7QUFDaEQsUUFBTSxrQ0FBOEIscUNBQXVCLHFEQUFxRDtBQUVoSCxRQUFNLFFBQVEscUJBQXFCLFNBQVMsVUFBVTtBQUN0RCxNQUFJLENBQUMsT0FBTztBQUNWLGdDQUE0QixtRUFBbUUsRUFBRSxXQUFXLENBQUM7QUFDN0csV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLFNBQVMsa0JBQWtCLGdCQUFnQixNQUFNLE9BQU87QUFDOUQsTUFBSSxXQUFXLE1BQU07QUFDbkIsZ0NBQTRCLGtEQUFrRCxFQUFFLFlBQVksZUFBZSxDQUFDO0FBQzVHLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxZQUE0QjtBQUFBLElBQ2hDLE1BQU0sV0FBVztBQUFBLElBQ2pCLFVBQVUsTUFBTTtBQUFBLElBQ2hCLFVBQVU7QUFBQSxNQUNSLEtBQUssT0FBTyxTQUFTLFlBQVksTUFBTSxHQUFHO0FBQUEsTUFDMUMsT0FBTyxPQUFPLFNBQVMsWUFBWSxNQUFNLEtBQUs7QUFBQSxJQUNoRDtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQUEsSUFDTCxZQUFZO0FBQUEsSUFDWixZQUFZLE1BQU07QUFBQSxJQUNsQjtBQUFBLEVBQ0Y7QUFDRjtBQUVBLFNBQVMsVUFBVSxhQUE4QjtBQUMvQyxNQUFJLGdCQUFnQixNQUFNLFlBQVksV0FBVyxHQUFHLEtBQUssNkNBQTZDLEtBQUssV0FBVyxHQUFHO0FBQ3ZILFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSSxRQUFRO0FBQ1osYUFBVyxhQUFhLGFBQWE7QUFDbkMsUUFBSSxjQUFjLEtBQUs7QUFDckI7QUFBQSxJQUNGLFdBQVcsY0FBYyxLQUFLO0FBQzVCO0FBQ0EsVUFBSSxRQUFRLEdBQUc7QUFDYixlQUFPO0FBQUEsTUFDVDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsU0FBTyxVQUFVO0FBQ25CO0FBRUEsU0FBUyxrQkFBa0IsYUFBcUIsU0FBaUM7QUFDL0UsTUFBSSxtQkFBbUIsS0FBSyxXQUFXLEdBQUc7QUFDeEMsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLGlCQUFpQixXQUFXLENBQUMsVUFBVSxXQUFXO0FBQ3hELE1BQUksVUFBVTtBQUNkLFdBQVMsUUFBUSxHQUFHLFFBQVEsWUFBWSxRQUFRLFNBQVM7QUFDdkQsVUFBTSxZQUFZLFlBQVksT0FBTyxLQUFLO0FBQzFDLFVBQU0sZ0JBQWdCLFlBQVksT0FBTyxRQUFRLENBQUM7QUFDbEQsVUFBTSxpQkFBaUIsaUJBQ25CLGNBQWMsT0FBTyxjQUFjLE9BQVEsY0FBYyxTQUFTLGtCQUFrQixNQUFNLDBCQUEwQixLQUFLLGFBQWEsS0FDdEksY0FBYyxRQUFRLDBCQUEwQixLQUFLLGFBQWE7QUFDdEUsZUFBVyxpQkFBaUIsS0FBSyxTQUFTLEtBQUs7QUFBQSxFQUNqRDtBQUVBLFNBQU8saUJBQWlCLElBQUksT0FBTyxNQUFNO0FBQzNDO0FBRUEsU0FBUyxxQkFBcUIsU0FBaUIsWUFBeUQ7QUFDdEcsUUFBTSxrQkFBa0IsV0FBVyxTQUFTLE1BQU07QUFDbEQsUUFBTSxnQkFBZ0IsV0FBVyxTQUFTLElBQUk7QUFDOUMsTUFBSSxrQkFBa0IsS0FBSyxnQkFBZ0IsUUFBUSxVQUFVLGdCQUFnQixpQkFBaUI7QUFDNUYsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLGlCQUFpQixRQUFRLE1BQU0saUJBQWlCLGFBQWE7QUFDbkUsUUFBTSxTQUFTLDBCQUEwQixLQUFLLGNBQWM7QUFDNUQsTUFBSSxDQUFDLFFBQVE7QUFDWCxXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sYUFBYSxPQUFPLENBQUMsRUFBRTtBQUM3QixRQUFNLFVBQVUsZUFBZSxPQUFPLFVBQVUsTUFBTTtBQUN0RCxNQUFJLFdBQVcsVUFBVSxhQUFhLElBQUk7QUFDMUMsU0FBTyxXQUFXLGVBQWUsUUFBUSxZQUFZO0FBQ25ELFVBQU0sWUFBWSxlQUFlLE9BQU8sUUFBUTtBQUNoRCxRQUFJLFVBQVUsY0FBYyxPQUFPLG1CQUFtQixLQUFLLFNBQVMsSUFBSSxtQkFBbUIsS0FBSyxTQUFTLEdBQUc7QUFDMUc7QUFBQSxJQUNGO0FBQ0EsUUFBSSxjQUFjLFFBQVEsMEJBQTBCLEtBQUssZUFBZSxPQUFPLFdBQVcsQ0FBQyxDQUFDLEdBQUc7QUFDN0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLE1BQUksU0FBUztBQUNYLFFBQUksZUFBZSxPQUFPLFFBQVEsTUFBTSxLQUFLO0FBQzNDLGFBQU87QUFBQSxJQUNUO0FBQ0E7QUFBQSxFQUNGO0FBRUEsUUFBTSxXQUFXLGVBQWUsT0FBTyxRQUFRO0FBQy9DLE1BQUksYUFBYSxNQUFNLENBQUMsbUJBQW1CLEtBQUssUUFBUSxHQUFHO0FBQ3pELFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxNQUFNLGVBQWUsTUFBTSxZQUFZLFFBQVE7QUFDckQsUUFBTSxRQUFRLFVBQVUsSUFBSSxNQUFNLEdBQUcsRUFBRSxJQUFJO0FBQzNDLE1BQUksYUFBYSxjQUFjLG9CQUFvQixLQUFLLE1BQU0sV0FBVyxNQUFNO0FBQzdFLFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTztBQUFBLElBQ0wsS0FBSyxrQkFBa0I7QUFBQSxJQUN2QjtBQUFBLElBQ0E7QUFBQSxJQUNBLE9BQU8sa0JBQWtCO0FBQUEsRUFDM0I7QUFDRjtBQUVBLFNBQVMsT0FBTyxTQUFpQixZQUFnQyxRQUFxQjtBQUNwRixRQUFNLGtCQUFrQixXQUFXLFNBQVMsTUFBTTtBQUNsRCxNQUFJLE9BQU8sV0FBVyxTQUFTLE1BQU07QUFDckMsV0FBUyxRQUFRLGlCQUFpQixRQUFRLFFBQVEsU0FBUztBQUN6RCxRQUFJLFFBQVEsT0FBTyxLQUFLLE1BQU0sTUFBTTtBQUNsQztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUFBLElBQ0wsS0FBSyxVQUFVLFFBQVEsWUFBWSxNQUFNLFNBQVMsQ0FBQyxJQUFJO0FBQUEsSUFDdkQ7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUNGO0FBRUEsU0FBUyxvQkFBb0IsT0FBdUI7QUFDbEQsTUFBSSxTQUFTO0FBQ2IsV0FBUyxRQUFRLEdBQUcsUUFBUSxNQUFNLFFBQVEsU0FBUztBQUNqRCxVQUFNLFlBQVksTUFBTSxPQUFPLEtBQUs7QUFDcEMsVUFBTSxnQkFBZ0IsTUFBTSxPQUFPLFFBQVEsQ0FBQztBQUM1QyxRQUFJLGNBQWMsUUFBUSwwQkFBMEIsS0FBSyxhQUFhLEdBQUc7QUFDdkUsZ0JBQVU7QUFDVjtBQUFBLElBQ0YsT0FBTztBQUNMLGdCQUFVO0FBQUEsSUFDWjtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7IiwibmFtZXMiOltdfQ==
@@ -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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