@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,180 @@
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 editor_mode_extension_exports = {};
116
+ __export(editor_mode_extension_exports, {
117
+ createLivePreviewOnlyExtension: () => createLivePreviewOnlyExtension,
118
+ createSourceModeOnlyExtension: () => createSourceModeOnlyExtension,
119
+ isLivePreview: () => isLivePreview
120
+ });
121
+ module.exports = __toCommonJS(editor_mode_extension_exports);
122
+ var import_state = require('@codemirror/state');
123
+ var import_view = require('@codemirror/view');
124
+ var import_object_utils = require('@mnaoumov/typescript-lib/object-utils');
125
+ var import_obsidian = require('obsidian');
126
+ const editorLivePreviewStateField = (0, import_object_utils.castTo)(import_obsidian.editorLivePreviewField);
127
+ function createLivePreviewOnlyExtension(extension) {
128
+ return createModeScopedExtension(extension, true);
129
+ }
130
+ function createSourceModeOnlyExtension(extension) {
131
+ return createModeScopedExtension(extension, false);
132
+ }
133
+ function isLivePreview(state) {
134
+ return state.field(editorLivePreviewStateField, false) ?? true;
135
+ }
136
+ function createModeScopedExtension(extension, isActiveInLivePreview) {
137
+ const compartment = new import_state.Compartment();
138
+ const emptyExtension = [];
139
+ return [
140
+ compartment.of(isActiveInLivePreview ? extension : emptyExtension),
141
+ import_state.EditorState.transactionExtender.of((transaction) => {
142
+ if (transaction.effects.length === 0) {
143
+ return null;
144
+ }
145
+ const content = getChangedContent(transaction.state);
146
+ return content === null ? null : { effects: compartment.reconfigure(content) };
147
+ }),
148
+ import_view.ViewPlugin.define((view) => createInitialContentCorrector(view))
149
+ ];
150
+ function getChangedContent(state) {
151
+ const content = isLivePreview(state) === isActiveInLivePreview ? extension : emptyExtension;
152
+ return compartment.get(state) === content ? null : content;
153
+ }
154
+ function createInitialContentCorrector(view) {
155
+ let isDestroyed = false;
156
+ if (getChangedContent(view.state) !== null) {
157
+ queueMicrotask(() => {
158
+ if (isDestroyed) {
159
+ return;
160
+ }
161
+ const content = getChangedContent(view.state);
162
+ if (content !== null) {
163
+ view.dispatch({ effects: compartment.reconfigure(content) });
164
+ }
165
+ });
166
+ }
167
+ return {
168
+ destroy() {
169
+ isDestroyed = true;
170
+ }
171
+ };
172
+ }
173
+ }
174
+ // Annotate the CommonJS export names for ESM import in node:
175
+ 0 && (module.exports = {
176
+ createLivePreviewOnlyExtension,
177
+ createSourceModeOnlyExtension,
178
+ isLivePreview
179
+ });
180
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb2RlbWlycm9yL2VkaXRvci1tb2RlLWV4dGVuc2lvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogU2NvcGVzIGFuIGVkaXRvciBleHRlbnNpb24gdG8gb25lIGVkaXRvciBtb2RlOiB7QGxpbmsgY3JlYXRlTGl2ZVByZXZpZXdPbmx5RXh0ZW5zaW9ufSBrZWVwcyBpdCBpbiBMaXZlIFByZXZpZXcgb25seSxcbiAqIGFuZCB7QGxpbmsgY3JlYXRlU291cmNlTW9kZU9ubHlFeHRlbnNpb259IGluIFNvdXJjZSBtb2RlIG9ubHkuIFRoZSBleHRlbnNpb24gaXMgc3dpdGNoZWQgb24gYW5kIG9mZiBhcyBhIHdob2xlLCBzbyBpdHNcbiAqIGRlY29yYXRpb25zLCB2aWV3IHBsdWdpbnMgYW5kIHN0YXRlIGZpZWxkcyBuZWVkIG5vIG1vZGUgY2hlY2sgb2YgdGhlaXIgb3duLlxuICpcbiAqIFRoZSBtb2RlIGlzIE9ic2lkaWFuJ3MgYGVkaXRvckxpdmVQcmV2aWV3RmllbGRgLiBSZWFkIGZyb20gT2JzaWRpYW4gYDEuMTUuMWAsIGEgTWFya2Rvd24gZWRpdG9yIGdldHMgdGhlIGZpZWxkIGZyb21cbiAqIGBlZGl0b3JMaXZlUHJldmlld0ZpZWxkLmluaXQoKWAgd2hlbmV2ZXIgaXRzIHN0YXRlIGlzIGJ1aWx0LCBhbmQgYSBtb2RlIHN3aXRjaCBkaXNwYXRjaGVzIG9uZSB0cmFuc2FjdGlvbiBjYXJyeWluZyBhXG4gKiBwcml2YXRlIGVmZmVjdCB0aGF0IHNldHMgdGhlIGZpZWxkLCBiZXNpZGUgdGhlIHJlY29uZmlndXJlIG9mIGl0cyBkeW5hbWljIGV4dGVuc2lvbnMuIFNvIHRoZSBmaWVsZCBjaGFuZ2VzIG9ubHkgaW4gYVxuICogdHJhbnNhY3Rpb24gd2l0aCBlZmZlY3RzLCBvciB3aXRoIGEgbmV3IHN0YXRlLlxuICpcbiAqIEVhY2ggY2FsbCB3cmFwcyB0aGUgZXh0ZW5zaW9uIGluIGEge0BsaW5rIENvbXBhcnRtZW50fSBvZiBpdHMgb3duLCB3aGljaCBob2xkcyB0aGUgZXh0ZW5zaW9uIG9yIG5vdGhpbmcgaW4gZXZlcnlcbiAqIGVkaXRvciBzZXBhcmF0ZWx5LiBBIHRyYW5zYWN0aW9uIGV4dGVuZGVyIHJlY29uZmlndXJlcyBpdCBpbiB0aGUgc2FtZSB0cmFuc2FjdGlvbiB0aGF0IGNoYW5nZXMgdGhlIG1vZGUsIHNvIG5vIHVwZGF0ZVxuICogZXZlciByZW5kZXJzIHdpdGggdGhlIHdyb25nIGNvbnRlbnQuIEEgbmV3IHN0YXRlIGNhbm5vdCBiZSByZWFkIGJlZm9yZSBpdCBleGlzdHMsIHNvIGl0IHN0YXJ0cyB3aXRoIHRoZSBjb250ZW50IHRoZVxuICogTGl2ZSBQcmV2aWV3IGRlZmF1bHQgY2FsbHMgZm9yLCBhbmQgYSB2aWV3IHBsdWdpbiBjb3JyZWN0cyBpdCBpbiBhIG1pY3JvdGFzaywgd2hpY2ggcnVucyBiZWZvcmUgdGhlIGJyb3dzZXIgcGFpbnRzLlxuICpcbiAqIE91dHNpZGUgYW4gT2JzaWRpYW4gTWFya2Rvd24gZWRpdG9yIHRoZXJlIGlzIG5vIGBlZGl0b3JMaXZlUHJldmlld0ZpZWxkYCwgYW5kIHRoZSBlZGl0b3IgY291bnRzIGFzIExpdmUgUHJldmlldy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEV4dGVuc2lvbixcbiAgU3RhdGVGaWVsZFxufSBmcm9tICdAY29kZW1pcnJvci9zdGF0ZSc7XG5pbXBvcnQgdHlwZSB7XG4gIEVkaXRvclZpZXcsXG4gIFBsdWdpblZhbHVlXG59IGZyb20gJ0Bjb2RlbWlycm9yL3ZpZXcnO1xuXG5pbXBvcnQge1xuICBDb21wYXJ0bWVudCxcbiAgRWRpdG9yU3RhdGVcbn0gZnJvbSAnQGNvZGVtaXJyb3Ivc3RhdGUnO1xuaW1wb3J0IHsgVmlld1BsdWdpbiB9IGZyb20gJ0Bjb2RlbWlycm9yL3ZpZXcnO1xuaW1wb3J0IHsgY2FzdFRvIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQgeyBlZGl0b3JMaXZlUHJldmlld0ZpZWxkIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG4vLyBPYnNpZGlhbi5kLnRzIHJlYWNoZXMgQGNvZGVtaXJyb3Ivc3RhdGUgdGhyb3VnaCBpdHMgQ29tbW9uSlMgZGVjbGFyYXRpb25zIGFuZCB0aGlzIG1vZHVsZSB0aHJvdWdoIHRoZSBFUyBvbmVzLCBhbmRcbi8vIFN0YXRlRmllbGQgaGFzIHByaXZhdGUgbWVtYmVycywgc28gdGhlIHR3byBkZWNsYXJhdGlvbnMgb2Ygb25lIHJ1bnRpbWUgY2xhc3MgZG8gbm90IHR5cGUtY2hlY2sgYWdhaW5zdCBlYWNoIG90aGVyLlxuY29uc3QgZWRpdG9yTGl2ZVByZXZpZXdTdGF0ZUZpZWxkID0gY2FzdFRvPFN0YXRlRmllbGQ8Ym9vbGVhbj4+KGVkaXRvckxpdmVQcmV2aWV3RmllbGQpO1xuXG4vKipcbiAqIFdyYXBzIGFuIGV4dGVuc2lvbiBzbyBpdCBpcyBhY3RpdmUgb25seSB3aGlsZSB0aGUgZWRpdG9yIGlzIGluIExpdmUgUHJldmlldywgYW5kIHN3aXRjaGVkIG9mZiBpbiBTb3VyY2UgbW9kZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIHRoaXMucmVnaXN0ZXJFZGl0b3JFeHRlbnNpb24oY3JlYXRlTGl2ZVByZXZpZXdPbmx5RXh0ZW5zaW9uKG15RGVjb3JhdGlvbnNQbHVnaW4pKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBleHRlbnNpb24gLSBUaGUgZXh0ZW5zaW9uIHRvIHNjb3BlLlxuICogQHJldHVybnMgVGhlIHNjb3BlZCBleHRlbnNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMaXZlUHJldmlld09ubHlFeHRlbnNpb24oZXh0ZW5zaW9uOiBFeHRlbnNpb24pOiBFeHRlbnNpb24ge1xuICByZXR1cm4gY3JlYXRlTW9kZVNjb3BlZEV4dGVuc2lvbihleHRlbnNpb24sIHRydWUpO1xufVxuXG4vKipcbiAqIFdyYXBzIGFuIGV4dGVuc2lvbiBzbyBpdCBpcyBhY3RpdmUgb25seSB3aGlsZSB0aGUgZWRpdG9yIGlzIGluIFNvdXJjZSBtb2RlLCBhbmQgc3dpdGNoZWQgb2ZmIGluIExpdmUgUHJldmlldy5cbiAqXG4gKiBPdXRzaWRlIGFuIE9ic2lkaWFuIE1hcmtkb3duIGVkaXRvciB0aGUgZWRpdG9yIGNvdW50cyBhcyBMaXZlIFByZXZpZXcsIHNvIHRoZSBleHRlbnNpb24gc3RheXMgb2ZmIHRoZXJlLlxuICpcbiAqIEBwYXJhbSBleHRlbnNpb24gLSBUaGUgZXh0ZW5zaW9uIHRvIHNjb3BlLlxuICogQHJldHVybnMgVGhlIHNjb3BlZCBleHRlbnNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTb3VyY2VNb2RlT25seUV4dGVuc2lvbihleHRlbnNpb246IEV4dGVuc2lvbik6IEV4dGVuc2lvbiB7XG4gIHJldHVybiBjcmVhdGVNb2RlU2NvcGVkRXh0ZW5zaW9uKGV4dGVuc2lvbiwgZmFsc2UpO1xufVxuXG4vKipcbiAqIFRlbGxzIHdoZXRoZXIgYW4gZWRpdG9yIHN0YXRlIGlzIGluIExpdmUgUHJldmlldy5cbiAqXG4gKiBAcGFyYW0gc3RhdGUgLSBUaGUgZWRpdG9yIHN0YXRlLlxuICogQHJldHVybnMgYHRydWVgIGluIExpdmUgUHJldmlldyBhbmQgb3V0c2lkZSBhbiBPYnNpZGlhbiBNYXJrZG93biBlZGl0b3IsIGBmYWxzZWAgaW4gU291cmNlIG1vZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0xpdmVQcmV2aWV3KHN0YXRlOiBFZGl0b3JTdGF0ZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gc3RhdGUuZmllbGQoZWRpdG9yTGl2ZVByZXZpZXdTdGF0ZUZpZWxkLCBmYWxzZSkgPz8gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTW9kZVNjb3BlZEV4dGVuc2lvbihleHRlbnNpb246IEV4dGVuc2lvbiwgaXNBY3RpdmVJbkxpdmVQcmV2aWV3OiBib29sZWFuKTogRXh0ZW5zaW9uIHtcbiAgY29uc3QgY29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnQoKTtcbiAgY29uc3QgZW1wdHlFeHRlbnNpb246IEV4dGVuc2lvbiA9IFtdO1xuXG4gIHJldHVybiBbXG4gICAgY29tcGFydG1lbnQub2YoaXNBY3RpdmVJbkxpdmVQcmV2aWV3ID8gZXh0ZW5zaW9uIDogZW1wdHlFeHRlbnNpb24pLFxuICAgIEVkaXRvclN0YXRlLnRyYW5zYWN0aW9uRXh0ZW5kZXIub2YoKHRyYW5zYWN0aW9uKSA9PiB7XG4gICAgICBpZiAodHJhbnNhY3Rpb24uZWZmZWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCBjb250ZW50ID0gZ2V0Q2hhbmdlZENvbnRlbnQodHJhbnNhY3Rpb24uc3RhdGUpO1xuICAgICAgcmV0dXJuIGNvbnRlbnQgPT09IG51bGwgPyBudWxsIDogeyBlZmZlY3RzOiBjb21wYXJ0bWVudC5yZWNvbmZpZ3VyZShjb250ZW50KSB9O1xuICAgIH0pLFxuICAgIFZpZXdQbHVnaW4uZGVmaW5lKCh2aWV3KSA9PiBjcmVhdGVJbml0aWFsQ29udGVudENvcnJlY3Rvcih2aWV3KSlcbiAgXTtcblxuICBmdW5jdGlvbiBnZXRDaGFuZ2VkQ29udGVudChzdGF0ZTogRWRpdG9yU3RhdGUpOiBFeHRlbnNpb24gfCBudWxsIHtcbiAgICBjb25zdCBjb250ZW50ID0gaXNMaXZlUHJldmlldyhzdGF0ZSkgPT09IGlzQWN0aXZlSW5MaXZlUHJldmlldyA/IGV4dGVuc2lvbiA6IGVtcHR5RXh0ZW5zaW9uO1xuICAgIHJldHVybiBjb21wYXJ0bWVudC5nZXQoc3RhdGUpID09PSBjb250ZW50ID8gbnVsbCA6IGNvbnRlbnQ7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVJbml0aWFsQ29udGVudENvcnJlY3Rvcih2aWV3OiBFZGl0b3JWaWV3KTogUGx1Z2luVmFsdWUge1xuICAgIGxldCBpc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICAgIGlmIChnZXRDaGFuZ2VkQ29udGVudCh2aWV3LnN0YXRlKSAhPT0gbnVsbCkge1xuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICBpZiAoaXNEZXN0cm95ZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29udGVudCA9IGdldENoYW5nZWRDb250ZW50KHZpZXcuc3RhdGUpO1xuICAgICAgICBpZiAoY29udGVudCAhPT0gbnVsbCkge1xuICAgICAgICAgIHZpZXcuZGlzcGF0Y2goeyBlZmZlY3RzOiBjb21wYXJ0bWVudC5yZWNvbmZpZ3VyZShjb250ZW50KSB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgICBpc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTZCQSxtQkFHTztBQUNQLGtCQUEyQjtBQUMzQiwwQkFBdUI7QUFDdkIsc0JBQXVDO0FBSXZDLE1BQU0sa0NBQThCLDRCQUE0QixzQ0FBc0I7QUFhL0UsU0FBUywrQkFBK0IsV0FBaUM7QUFDOUUsU0FBTywwQkFBMEIsV0FBVyxJQUFJO0FBQ2xEO0FBVU8sU0FBUyw4QkFBOEIsV0FBaUM7QUFDN0UsU0FBTywwQkFBMEIsV0FBVyxLQUFLO0FBQ25EO0FBUU8sU0FBUyxjQUFjLE9BQTZCO0FBQ3pELFNBQU8sTUFBTSxNQUFNLDZCQUE2QixLQUFLLEtBQUs7QUFDNUQ7QUFFQSxTQUFTLDBCQUEwQixXQUFzQix1QkFBMkM7QUFDbEcsUUFBTSxjQUFjLElBQUkseUJBQVk7QUFDcEMsUUFBTSxpQkFBNEIsQ0FBQztBQUVuQyxTQUFPO0FBQUEsSUFDTCxZQUFZLEdBQUcsd0JBQXdCLFlBQVksY0FBYztBQUFBLElBQ2pFLHlCQUFZLG9CQUFvQixHQUFHLENBQUMsZ0JBQWdCO0FBQ2xELFVBQUksWUFBWSxRQUFRLFdBQVcsR0FBRztBQUNwQyxlQUFPO0FBQUEsTUFDVDtBQUNBLFlBQU0sVUFBVSxrQkFBa0IsWUFBWSxLQUFLO0FBQ25ELGFBQU8sWUFBWSxPQUFPLE9BQU8sRUFBRSxTQUFTLFlBQVksWUFBWSxPQUFPLEVBQUU7QUFBQSxJQUMvRSxDQUFDO0FBQUEsSUFDRCx1QkFBVyxPQUFPLENBQUMsU0FBUyw4QkFBOEIsSUFBSSxDQUFDO0FBQUEsRUFDakU7QUFFQSxXQUFTLGtCQUFrQixPQUFzQztBQUMvRCxVQUFNLFVBQVUsY0FBYyxLQUFLLE1BQU0sd0JBQXdCLFlBQVk7QUFDN0UsV0FBTyxZQUFZLElBQUksS0FBSyxNQUFNLFVBQVUsT0FBTztBQUFBLEVBQ3JEO0FBRUEsV0FBUyw4QkFBOEIsTUFBK0I7QUFDcEUsUUFBSSxjQUFjO0FBQ2xCLFFBQUksa0JBQWtCLEtBQUssS0FBSyxNQUFNLE1BQU07QUFDMUMscUJBQWUsTUFBTTtBQUNuQixZQUFJLGFBQWE7QUFDZjtBQUFBLFFBQ0Y7QUFDQSxjQUFNLFVBQVUsa0JBQWtCLEtBQUssS0FBSztBQUM1QyxZQUFJLFlBQVksTUFBTTtBQUNwQixlQUFLLFNBQVMsRUFBRSxTQUFTLFlBQVksWUFBWSxPQUFPLEVBQUUsQ0FBQztBQUFBLFFBQzdEO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDSDtBQUNBLFdBQU87QUFBQSxNQUNMLFVBQWdCO0FBQ2Qsc0JBQWM7QUFBQSxNQUNoQjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7IiwibmFtZXMiOltdfQ==
@@ -0,0 +1,50 @@
1
+ /// <reference path="../library-references.d.cts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Scopes an editor extension to one editor mode: {@link createLivePreviewOnlyExtension} keeps it in Live Preview only,
6
+ * and {@link createSourceModeOnlyExtension} in Source mode only. The extension is switched on and off as a whole, so its
7
+ * decorations, view plugins and state fields need no mode check of their own.
8
+ *
9
+ * The mode is Obsidian's `editorLivePreviewField`. Read from Obsidian `1.15.1`, a Markdown editor gets the field from
10
+ * `editorLivePreviewField.init()` whenever its state is built, and a mode switch dispatches one transaction carrying a
11
+ * private effect that sets the field, beside the reconfigure of its dynamic extensions. So the field changes only in a
12
+ * transaction with effects, or with a new state.
13
+ *
14
+ * Each call wraps the extension in a {@link Compartment} of its own, which holds the extension or nothing in every
15
+ * editor separately. A transaction extender reconfigures it in the same transaction that changes the mode, so no update
16
+ * ever renders with the wrong content. A new state cannot be read before it exists, so it starts with the content the
17
+ * Live Preview default calls for, and a view plugin corrects it in a microtask, which runs before the browser paints.
18
+ *
19
+ * Outside an Obsidian Markdown editor there is no `editorLivePreviewField`, and the editor counts as Live Preview.
20
+ */
21
+ import type { Extension } from '@codemirror/state' with { 'resolution-mode': 'import' };
22
+ import { EditorState } from '@codemirror/state';
23
+ /**
24
+ * Wraps an extension so it is active only while the editor is in Live Preview, and switched off in Source mode.
25
+ *
26
+ * @example
27
+ * ```ts
28
+ * this.registerEditorExtension(createLivePreviewOnlyExtension(myDecorationsPlugin));
29
+ * ```
30
+ *
31
+ * @param extension - The extension to scope.
32
+ * @returns The scoped extension.
33
+ */
34
+ export declare function createLivePreviewOnlyExtension(extension: Extension): Extension;
35
+ /**
36
+ * Wraps an extension so it is active only while the editor is in Source mode, and switched off in Live Preview.
37
+ *
38
+ * Outside an Obsidian Markdown editor the editor counts as Live Preview, so the extension stays off there.
39
+ *
40
+ * @param extension - The extension to scope.
41
+ * @returns The scoped extension.
42
+ */
43
+ export declare function createSourceModeOnlyExtension(extension: Extension): Extension;
44
+ /**
45
+ * Tells whether an editor state is in Live Preview.
46
+ *
47
+ * @param state - The editor state.
48
+ * @returns `true` in Live Preview and outside an Obsidian Markdown editor, `false` in Source mode.
49
+ */
50
+ export declare function isLivePreview(state: EditorState): boolean;
@@ -97,6 +97,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
97
97
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
98
98
  var codemirror_exports = {};
99
99
  __export(codemirror_exports, {
100
+ "editor-mode-extension": () => editor_mode_extension,
100
101
  "incremental-parse-state-field": () => incremental_parse_state_field,
101
102
  "inline-token-widgets": () => inline_token_widgets,
102
103
  "markdown-editor-views": () => markdown_editor_views,
@@ -105,6 +106,7 @@ __export(codemirror_exports, {
105
106
  "state-field-spec": () => state_field_spec
106
107
  });
107
108
  module.exports = __toCommonJS(codemirror_exports);
109
+ var editor_mode_extension = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./editor-mode-extension.cjs')), 1);
108
110
  var incremental_parse_state_field = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./incremental-parse-state-field.cjs')), 1);
109
111
  var inline_token_widgets = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./inline-token-widgets.cjs')), 1);
110
112
  var markdown_editor_views = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./markdown-editor-views.cjs')), 1);
@@ -113,6 +115,7 @@ var settings_facet = __toESM(((module) => module && module.__esModule && 'defaul
113
115
  var state_field_spec = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./state-field-spec.cjs')), 1);
114
116
  // Annotate the CommonJS export names for ESM import in node:
115
117
  0 && (module.exports = {
118
+ "editor-mode-extension": null,
116
119
  "incremental-parse-state-field": null,
117
120
  "inline-token-widgets": null,
118
121
  "markdown-editor-views": null,
@@ -120,4 +123,4 @@ var state_field_spec = __toESM(((module) => module && module.__esModule && 'defa
120
123
  "settings-facet": null,
121
124
  "state-field-spec": null
122
125
  });
123
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb2RlbWlycm9yL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIFRISVMgSVMgQSBHRU5FUkFURUQvQlVORExFRCBGSUxFIEJZIEJVSUxEIFNDUklQVCAqL1xuXG5leHBvcnQgKiBhcyAnaW5jcmVtZW50YWwtcGFyc2Utc3RhdGUtZmllbGQnIGZyb20gJy4vaW5jcmVtZW50YWwtcGFyc2Utc3RhdGUtZmllbGQudHMnO1xuZXhwb3J0ICogYXMgJ2lubGluZS10b2tlbi13aWRnZXRzJyBmcm9tICcuL2lubGluZS10b2tlbi13aWRnZXRzLnRzJztcbmV4cG9ydCAqIGFzICdtYXJrZG93bi1lZGl0b3Itdmlld3MnIGZyb20gJy4vbWFya2Rvd24tZWRpdG9yLXZpZXdzLnRzJztcbmV4cG9ydCAqIGFzICdyYW5nZS1zZXQnIGZyb20gJy4vcmFuZ2Utc2V0LnRzJztcbmV4cG9ydCAqIGFzICdzZXR0aW5ncy1mYWNldCcgZnJvbSAnLi9zZXR0aW5ncy1mYWNldC50cyc7XG5leHBvcnQgKiBhcyAnc3RhdGUtZmllbGQtc3BlYycgZnJvbSAnLi9zdGF0ZS1maWVsZC1zcGVjLnRzJztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQSx5Q0FBQUE7QUFBQSxFQUFBLDhCQUFBQztBQUFBLEVBQUEsK0JBQUFDO0FBQUEsRUFBQSxtQkFBQUM7QUFBQSxFQUFBLHdCQUFBQztBQUFBLEVBQUEsMEJBQUFDO0FBQUE7QUFBQTtBQUVBLElBQUFMLGdDQUFpRDtBQUNqRCxJQUFBQyx1QkFBd0M7QUFDeEMsSUFBQUMsd0JBQXlDO0FBQ3pDLElBQUFDLFlBQTZCO0FBQzdCLElBQUFDLGlCQUFrQztBQUNsQyxJQUFBQyxtQkFBb0M7IiwibmFtZXMiOlsiaW5jcmVtZW50YWwtcGFyc2Utc3RhdGUtZmllbGQiLCJpbmxpbmUtdG9rZW4td2lkZ2V0cyIsIm1hcmtkb3duLWVkaXRvci12aWV3cyIsInJhbmdlLXNldCIsInNldHRpbmdzLWZhY2V0Iiwic3RhdGUtZmllbGQtc3BlYyJdfQ==
126
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb2RlbWlycm9yL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIFRISVMgSVMgQSBHRU5FUkFURUQvQlVORExFRCBGSUxFIEJZIEJVSUxEIFNDUklQVCAqL1xuXG5leHBvcnQgKiBhcyAnZWRpdG9yLW1vZGUtZXh0ZW5zaW9uJyBmcm9tICcuL2VkaXRvci1tb2RlLWV4dGVuc2lvbi50cyc7XG5leHBvcnQgKiBhcyAnaW5jcmVtZW50YWwtcGFyc2Utc3RhdGUtZmllbGQnIGZyb20gJy4vaW5jcmVtZW50YWwtcGFyc2Utc3RhdGUtZmllbGQudHMnO1xuZXhwb3J0ICogYXMgJ2lubGluZS10b2tlbi13aWRnZXRzJyBmcm9tICcuL2lubGluZS10b2tlbi13aWRnZXRzLnRzJztcbmV4cG9ydCAqIGFzICdtYXJrZG93bi1lZGl0b3Itdmlld3MnIGZyb20gJy4vbWFya2Rvd24tZWRpdG9yLXZpZXdzLnRzJztcbmV4cG9ydCAqIGFzICdyYW5nZS1zZXQnIGZyb20gJy4vcmFuZ2Utc2V0LnRzJztcbmV4cG9ydCAqIGFzICdzZXR0aW5ncy1mYWNldCcgZnJvbSAnLi9zZXR0aW5ncy1mYWNldC50cyc7XG5leHBvcnQgKiBhcyAnc3RhdGUtZmllbGQtc3BlYycgZnJvbSAnLi9zdGF0ZS1maWVsZC1zcGVjLnRzJztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQSxpQ0FBQUE7QUFBQSxFQUFBLHVDQUFBQztBQUFBLEVBQUEsOEJBQUFDO0FBQUEsRUFBQSwrQkFBQUM7QUFBQSxFQUFBLG1CQUFBQztBQUFBLEVBQUEsd0JBQUFDO0FBQUEsRUFBQSwwQkFBQUM7QUFBQTtBQUFBO0FBRUEsSUFBQU4sd0JBQXlDO0FBQ3pDLElBQUFDLGdDQUFpRDtBQUNqRCxJQUFBQyx1QkFBd0M7QUFDeEMsSUFBQUMsd0JBQXlDO0FBQ3pDLElBQUFDLFlBQTZCO0FBQzdCLElBQUFDLGlCQUFrQztBQUNsQyxJQUFBQyxtQkFBb0M7IiwibmFtZXMiOlsiZWRpdG9yLW1vZGUtZXh0ZW5zaW9uIiwiaW5jcmVtZW50YWwtcGFyc2Utc3RhdGUtZmllbGQiLCJpbmxpbmUtdG9rZW4td2lkZ2V0cyIsIm1hcmtkb3duLWVkaXRvci12aWV3cyIsInJhbmdlLXNldCIsInNldHRpbmdzLWZhY2V0Iiwic3RhdGUtZmllbGQtc3BlYyJdfQ==
@@ -1,4 +1,5 @@
1
1
  /// <reference path="../library-references.d.cts" />
2
+ export * as 'editor-mode-extension' from './editor-mode-extension.cjs';
2
3
  export * as 'incremental-parse-state-field' from './incremental-parse-state-field.cjs';
3
4
  export * as 'inline-token-widgets' from './inline-token-widgets.cjs';
4
5
  export * as 'markdown-editor-views' from './markdown-editor-views.cjs';
@@ -123,8 +123,8 @@ var import_view = require('@codemirror/view');
123
123
  var import_object_utils = require('@mnaoumov/typescript-lib/object-utils');
124
124
  var import_obsidian = require('obsidian');
125
125
  var import_css_class = require('../css-class.cjs');
126
+ var import_editor_mode_extension = require('./editor-mode-extension.cjs');
126
127
  const editorInfoStateField = (0, import_object_utils.castTo)(import_obsidian.editorInfoField);
127
- const editorLivePreviewStateField = (0, import_object_utils.castTo)(import_obsidian.editorLivePreviewField);
128
128
  class InlineTokenWidget extends import_view.WidgetType {
129
129
  configVersion;
130
130
  match;
@@ -178,13 +178,13 @@ function createInlineTokenWidgetsExtension(params) {
178
178
  if (isReconfigured) {
179
179
  this.configVersion++;
180
180
  }
181
- if (update.docChanged || update.viewportChanged || update.selectionSet || isReconfigured || isLivePreview(update.startState) !== isLivePreview(update.state)) {
181
+ if (update.docChanged || update.viewportChanged || update.selectionSet || isReconfigured || (0, import_editor_mode_extension.isLivePreview)(update.startState) !== (0, import_editor_mode_extension.isLivePreview)(update.state)) {
182
182
  this.decorations = this.buildDecorations(update.view);
183
183
  }
184
184
  }
185
185
  buildDecorations(view) {
186
186
  const state = view.state;
187
- if (!isLivePreview(state)) {
187
+ if (!(0, import_editor_mode_extension.isLivePreview)(state)) {
188
188
  return import_view.Decoration.none;
189
189
  }
190
190
  const sourcePath = state.field(editorInfoStateField, false)?.file?.path ?? "";
@@ -238,13 +238,10 @@ function toGlobalRegExp(regExp) {
238
238
  function areMatchesEqual(a, b) {
239
239
  return a.length === b.length && a.every((value, index) => value === b[index]);
240
240
  }
241
- function isLivePreview(state) {
242
- return state.field(editorLivePreviewStateField, false) ?? true;
243
- }
244
241
  // Annotate the CommonJS export names for ESM import in node:
245
242
  0 && (module.exports = {
246
243
  createInlineTokenWidgetsExtension,
247
244
  execAll,
248
245
  toGlobalRegExp
249
246
  });
250
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb2RlbWlycm9yL2lubGluZS10b2tlbi13aWRnZXRzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDcmVhdGVzIGFuIGVkaXRvciBleHRlbnNpb24gdGhhdCByZXBsYWNlcyBldmVyeSBtYXRjaCBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoIGEgd2lkZ2V0IGluIExpdmUgUHJldmlldywgYW5kXG4gKiBzaG93cyB0aGUgc291cmNlIGFnYWluIHdoaWxlIGEgc2VsZWN0aW9uIHRvdWNoZXMgaXQsIHRoZSB3YXkgT2JzaWRpYW4gdHJlYXRzIGl0cyBvd24gbGlua3MgYW5kIGZvcm1hdHRpbmcuXG4gKlxuICogT25seSB0aGUgdmlzaWJsZSByYW5nZXMgYXJlIG1hdGNoZWQsIGxpbmUgYnkgbGluZSwgc28gYSB0b2tlbiBuZXZlciBzcGFucyB0d28gbGluZXMuIFRoZSBkZWNvcmF0aW9ucyBhcmUgcmVidWlsdFxuICogd2hlbiB0aGUgZG9jdW1lbnQsIHRoZSB2aWV3cG9ydCwgdGhlIHNlbGVjdGlvbiwgdGhlIExpdmUgUHJldmlldyBtb2RlIG9yIHRoZSBjb25maWd1cmF0aW9uIGNoYW5nZXM7IGFcbiAqIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGlzIHdoYXQgYSBgU2V0dGluZ3NGYWNldENvbXBvbmVudGAgZGlzcGF0Y2hlcywgc28gYSByZW5kZXIgdGhhdCByZWFkcyBhIHNldHRpbmdzIGZhY2V0XG4gKiByZS1ydW5zIHdoZW4gdGhlIHNldHRpbmdzIGRvLlxuICpcbiAqIE91dHNpZGUgYW4gT2JzaWRpYW4gTWFya2Rvd24gZWRpdG9yIHRoZXJlIGlzIG5vIGBlZGl0b3JMaXZlUHJldmlld0ZpZWxkYCwgYW5kIHRoZSB3aWRnZXRzIGFyZSBzaG93bi5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEVkaXRvclN0YXRlLFxuICBFeHRlbnNpb24sXG4gIFJhbmdlLFxuICBTdGF0ZUZpZWxkXG59IGZyb20gJ0Bjb2RlbWlycm9yL3N0YXRlJztcbmltcG9ydCB0eXBlIHtcbiAgRGVjb3JhdGlvblNldCxcbiAgRWRpdG9yVmlldyxcbiAgUGx1Z2luVmFsdWUsXG4gIFZpZXdVcGRhdGVcbn0gZnJvbSAnQGNvZGVtaXJyb3Ivdmlldyc7XG5pbXBvcnQgdHlwZSB7IE1hcmtkb3duRmlsZUluZm8gfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7XG4gIERlY29yYXRpb24sXG4gIFZpZXdQbHVnaW4sXG4gIFdpZGdldFR5cGVcbn0gZnJvbSAnQGNvZGVtaXJyb3Ivdmlldyc7XG5pbXBvcnQgeyBjYXN0VG8gfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvb2JqZWN0LXV0aWxzJztcbmltcG9ydCB7XG4gIGVkaXRvckluZm9GaWVsZCxcbiAgZWRpdG9yTGl2ZVByZXZpZXdGaWVsZFxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi4vY3NzLWNsYXNzLnRzJztcblxuLy8gT2JzaWRpYW4uZC50cyByZWFjaGVzIEBjb2RlbWlycm9yL3N0YXRlIHRocm91Z2ggaXRzIENvbW1vbkpTIGRlY2xhcmF0aW9ucyBhbmQgdGhpcyBtb2R1bGUgdGhyb3VnaCB0aGUgRVMgb25lcywgYW5kXG4vLyBTdGF0ZUZpZWxkIGhhcyBwcml2YXRlIG1lbWJlcnMsIHNvIHRoZSB0d28gZGVjbGFyYXRpb25zIG9mIG9uZSBydW50aW1lIGNsYXNzIGRvIG5vdCB0eXBlLWNoZWNrIGFnYWluc3QgZWFjaCBvdGhlci5cbmNvbnN0IGVkaXRvckluZm9TdGF0ZUZpZWxkID0gY2FzdFRvPFN0YXRlRmllbGQ8TWFya2Rvd25GaWxlSW5mbz4+KGVkaXRvckluZm9GaWVsZCk7XG5jb25zdCBlZGl0b3JMaXZlUHJldmlld1N0YXRlRmllbGQgPSBjYXN0VG88U3RhdGVGaWVsZDxib29sZWFuPj4oZWRpdG9yTGl2ZVByZXZpZXdGaWVsZCk7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNyZWF0ZUlubGluZVRva2VuV2lkZ2V0c0V4dGVuc2lvbn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlSW5saW5lVG9rZW5XaWRnZXRzRXh0ZW5zaW9uUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gYSB0b2tlbiBtYXRjaGVzLiBUaGUgYGdgIGZsYWcgaXMgYWRkZWQgd2hlbiBtaXNzaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVnRXhwOiBSZWdFeHA7XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgYSB0b2tlbiBpbnRvIHRoZSB3aWRnZXQncyBlbGVtZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgcmVuZGVyOiBJbmxpbmVUb2tlblJlbmRlckZ1bmN0aW9uO1xuXG4gIC8qKlxuICAgKiBEZWNpZGVzIHdoZXRoZXIgYSBtYXRjaCBiZWNvbWVzIGEgd2lkZ2V0LCBzdWNoIGFzIHRvIHNraXAgYSBtYXRjaCBpbnNpZGUgY29kZS4gRXZlcnkgbWF0Y2ggZG9lcyBieSBkZWZhdWx0LlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRGVjb3JhdGU/OiAocGFyYW1zOiBJbmxpbmVUb2tlblNob3VsZERlY29yYXRlUGFyYW1zKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgdG9rZW4gc2hvd3MgaXRzIHNvdXJjZSB3aGlsZSBhIHNlbGVjdGlvbiwgdGhlIGN1cnNvciBpbmNsdWRlZCwgdG91Y2hlcyBpdC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZXZlYWxPblNlbGVjdGlvbj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUmVuZGVycyBhbiBpbmxpbmUgdG9rZW4gaW50byBpdHMgY29udGFpbmVyIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSByZW5kZXIgcGFyYW1ldGVycy5cbiAqL1xuZXhwb3J0IHR5cGUgSW5saW5lVG9rZW5SZW5kZXJGdW5jdGlvbiA9IChwYXJhbXM6IElubGluZVRva2VuUmVuZGVyUGFyYW1zKSA9PiB2b2lkO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgaGFuZGVkIHRvIGFuIGlubGluZSB0b2tlbiByZW5kZXIgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5saW5lVG9rZW5SZW5kZXJQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGVsZW1lbnQgdG8gcmVuZGVyIHRoZSB0b2tlbiBpbnRvLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGFpbmVyRWw6IEhUTUxFbGVtZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgbWF0Y2ggb2YgdGhlIHRva2VuJ3MgcmVndWxhciBleHByZXNzaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheTtcblxuICAvKipcbiAgICogVGhlIHBhdGggb2YgdGhlIG5vdGUgdGhlIHRva2VuIGlzIGluLCBvciBhbiBlbXB0eSBzdHJpbmcgd2hlbiBpdCBpcyBub3Qga25vd24uXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBlZGl0b3Igc3RhdGUsIHdoZW4gdGhlIHRva2VuIHJlbmRlcnMgaW4gYW4gZWRpdG9yLiBBYnNlbnQgaW4gUmVhZGluZyB2aWV3LlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGU/OiBFZGl0b3JTdGF0ZTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGhhbmRlZCB0byB7QGxpbmsgQ3JlYXRlSW5saW5lVG9rZW5XaWRnZXRzRXh0ZW5zaW9uUGFyYW1zLnNob3VsZERlY29yYXRlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmxpbmVUb2tlblNob3VsZERlY29yYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBkb2N1bWVudCBwb3NpdGlvbiB0aGUgbWF0Y2ggc3RhcnRzIGF0LlxuICAgKi9cbiAgcmVhZG9ubHkgZnJvbTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF0Y2ggb2YgdGhlIHRva2VuJ3MgcmVndWxhciBleHByZXNzaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheTtcblxuICAvKipcbiAgICogVGhlIGVkaXRvciBzdGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXRlOiBFZGl0b3JTdGF0ZTtcblxuICAvKipcbiAgICogVGhlIGRvY3VtZW50IHBvc2l0aW9uIHRoZSBtYXRjaCBlbmRzIGF0LlxuICAgKi9cbiAgcmVhZG9ubHkgdG86IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIElubGluZVRva2VuV2lkZ2V0UGFyYW1zIHtcbiAgcmVhZG9ubHkgY29uZmlnVmVyc2lvbjogbnVtYmVyO1xuICByZWFkb25seSBtYXRjaDogUmVnRXhwRXhlY0FycmF5O1xuICByZWFkb25seSByZW5kZXI6IElubGluZVRva2VuUmVuZGVyRnVuY3Rpb247XG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgc3RhdGU6IEVkaXRvclN0YXRlO1xufVxuXG5jbGFzcyBJbmxpbmVUb2tlbldpZGdldCBleHRlbmRzIFdpZGdldFR5cGUge1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZ1ZlcnNpb246IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXRjaDogUmVnRXhwRXhlY0FycmF5O1xuICBwcml2YXRlIHJlYWRvbmx5IHJlbmRlcjogSW5saW5lVG9rZW5SZW5kZXJGdW5jdGlvbjtcbiAgcHJpdmF0ZSByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhdGU6IEVkaXRvclN0YXRlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IElubGluZVRva2VuV2lkZ2V0UGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNvbmZpZ1ZlcnNpb24gPSBwYXJhbXMuY29uZmlnVmVyc2lvbjtcbiAgICB0aGlzLm1hdGNoID0gcGFyYW1zLm1hdGNoO1xuICAgIHRoaXMucmVuZGVyID0gcGFyYW1zLnJlbmRlcjtcbiAgICB0aGlzLnNvdXJjZVBhdGggPSBwYXJhbXMuc291cmNlUGF0aDtcbiAgICB0aGlzLnN0YXRlID0gcGFyYW1zLnN0YXRlO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGVxKG90aGVyOiBXaWRnZXRUeXBlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG90aGVyIGluc3RhbmNlb2YgSW5saW5lVG9rZW5XaWRnZXRcbiAgICAgICYmIG90aGVyLmNvbmZpZ1ZlcnNpb24gPT09IHRoaXMuY29uZmlnVmVyc2lvblxuICAgICAgJiYgb3RoZXIucmVuZGVyID09PSB0aGlzLnJlbmRlclxuICAgICAgJiYgb3RoZXIuc291cmNlUGF0aCA9PT0gdGhpcy5zb3VyY2VQYXRoXG4gICAgICAmJiBhcmVNYXRjaGVzRXF1YWwob3RoZXIubWF0Y2gsIHRoaXMubWF0Y2gpO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIHRvRE9NKHZpZXc6IEVkaXRvclZpZXcpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgY29udGFpbmVyRWwgPSB2aWV3LmRvbS5vd25lckRvY3VtZW50Lndpbi5jcmVhdGVTcGFuKCk7XG4gICAgY29udGFpbmVyRWwuY2xhc3NMaXN0LmFkZChDc3NDbGFzcy5MaWJyYXJ5TmFtZSwgQ3NzQ2xhc3MuSW5saW5lVG9rZW4pO1xuICAgIHRoaXMucmVuZGVyKHtcbiAgICAgIGNvbnRhaW5lckVsLFxuICAgICAgbWF0Y2g6IHRoaXMubWF0Y2gsXG4gICAgICBzb3VyY2VQYXRoOiB0aGlzLnNvdXJjZVBhdGgsXG4gICAgICBzdGF0ZTogdGhpcy5zdGF0ZVxuICAgIH0pO1xuICAgIHJldHVybiBjb250YWluZXJFbDtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gZWRpdG9yIGV4dGVuc2lvbiB0aGF0IHJlcGxhY2VzIGV2ZXJ5IG1hdGNoIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHdpdGggYSB3aWRnZXQgaW4gTGl2ZSBQcmV2aWV3LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZXh0ZW5zaW9uIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgZWRpdG9yIGV4dGVuc2lvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUlubGluZVRva2VuV2lkZ2V0c0V4dGVuc2lvbihwYXJhbXM6IENyZWF0ZUlubGluZVRva2VuV2lkZ2V0c0V4dGVuc2lvblBhcmFtcyk6IEV4dGVuc2lvbiB7XG4gIGNvbnN0IHJlZ0V4cCA9IHRvR2xvYmFsUmVnRXhwKHBhcmFtcy5yZWdFeHApO1xuICBjb25zdCBzaG91bGRSZXZlYWxPblNlbGVjdGlvbiA9IHBhcmFtcy5zaG91bGRSZXZlYWxPblNlbGVjdGlvbiA/PyB0cnVlO1xuXG4gIGNsYXNzIElubGluZVRva2VuV2lkZ2V0c1BsdWdpblZhbHVlIGltcGxlbWVudHMgUGx1Z2luVmFsdWUge1xuICAgIHB1YmxpYyBkZWNvcmF0aW9uczogRGVjb3JhdGlvblNldDtcbiAgICBwcml2YXRlIGNvbmZpZ1ZlcnNpb24gPSAwO1xuXG4gICAgLyoqXG4gICAgICogQnVpbGRzIHRoZSBkZWNvcmF0aW9ucyBvZiBhIG5ldyBlZGl0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmlldyAtIFRoZSBlZGl0b3Igdmlldy5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IodmlldzogRWRpdG9yVmlldykge1xuICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuYnVpbGREZWNvcmF0aW9ucyh2aWV3KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWJ1aWxkcyB0aGUgZGVjb3JhdGlvbnMgd2hlbiB3aGF0IHRoZXkgZGVwZW5kIG9uIGNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdXBkYXRlIC0gVGhlIHZpZXcgdXBkYXRlLlxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGUodXBkYXRlOiBWaWV3VXBkYXRlKTogdm9pZCB7XG4gICAgICBjb25zdCBpc1JlY29uZmlndXJlZCA9IHVwZGF0ZS50cmFuc2FjdGlvbnMuc29tZSgodHJhbnNhY3Rpb24pID0+IHRyYW5zYWN0aW9uLnJlY29uZmlndXJlZCk7XG4gICAgICBpZiAoaXNSZWNvbmZpZ3VyZWQpIHtcbiAgICAgICAgdGhpcy5jb25maWdWZXJzaW9uKys7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHVwZGF0ZS5kb2NDaGFuZ2VkXG4gICAgICAgIHx8IHVwZGF0ZS52aWV3cG9ydENoYW5nZWRcbiAgICAgICAgfHwgdXBkYXRlLnNlbGVjdGlvblNldFxuICAgICAgICB8fCBpc1JlY29uZmlndXJlZFxuICAgICAgICB8fCBpc0xpdmVQcmV2aWV3KHVwZGF0ZS5zdGFydFN0YXRlKSAhPT0gaXNMaXZlUHJldmlldyh1cGRhdGUuc3RhdGUpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuYnVpbGREZWNvcmF0aW9ucyh1cGRhdGUudmlldyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBidWlsZERlY29yYXRpb25zKHZpZXc6IEVkaXRvclZpZXcpOiBEZWNvcmF0aW9uU2V0IHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdmlldy5zdGF0ZTtcbiAgICAgIGlmICghaXNMaXZlUHJldmlldyhzdGF0ZSkpIHtcbiAgICAgICAgcmV0dXJuIERlY29yYXRpb24ubm9uZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc291cmNlUGF0aCA9IHN0YXRlLmZpZWxkKGVkaXRvckluZm9TdGF0ZUZpZWxkLCBmYWxzZSk/LmZpbGU/LnBhdGggPz8gJyc7XG4gICAgICBjb25zdCByYW5nZXM6IFJhbmdlPERlY29yYXRpb24+W10gPSBbXTtcbiAgICAgIGxldCBsYXN0TGluZU51bWJlciA9IDA7XG5cbiAgICAgIGZvciAoY29uc3QgdmlzaWJsZVJhbmdlIG9mIHZpZXcudmlzaWJsZVJhbmdlcykge1xuICAgICAgICBjb25zdCBmaXJzdExpbmVOdW1iZXIgPSBNYXRoLm1heChzdGF0ZS5kb2MubGluZUF0KHZpc2libGVSYW5nZS5mcm9tKS5udW1iZXIsIGxhc3RMaW5lTnVtYmVyICsgMSk7XG4gICAgICAgIGNvbnN0IGVuZExpbmVOdW1iZXIgPSBzdGF0ZS5kb2MubGluZUF0KHZpc2libGVSYW5nZS50bykubnVtYmVyO1xuICAgICAgICBmb3IgKGxldCBsaW5lTnVtYmVyID0gZmlyc3RMaW5lTnVtYmVyOyBsaW5lTnVtYmVyIDw9IGVuZExpbmVOdW1iZXI7IGxpbmVOdW1iZXIrKykge1xuICAgICAgICAgIGNvbnN0IGxpbmUgPSBzdGF0ZS5kb2MubGluZShsaW5lTnVtYmVyKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIGV4ZWNBbGwocmVnRXhwLCBsaW5lLnRleHQpKSB7XG4gICAgICAgICAgICBjb25zdCBmcm9tID0gbGluZS5mcm9tICsgbWF0Y2guaW5kZXg7XG4gICAgICAgICAgICBjb25zdCB0byA9IGZyb20gKyBtYXRjaFswXS5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoc2hvdWxkUmV2ZWFsT25TZWxlY3Rpb24gJiYgc3RhdGUuc2VsZWN0aW9uLnJhbmdlcy5zb21lKChyYW5nZSkgPT4gcmFuZ2UuZnJvbSA8PSB0byAmJiByYW5nZS50byA+PSBmcm9tKSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXJhbXMuc2hvdWxkRGVjb3JhdGUgJiYgIXBhcmFtcy5zaG91bGREZWNvcmF0ZSh7IGZyb20sIG1hdGNoLCBzdGF0ZSwgdG8gfSkpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByYW5nZXMucHVzaChcbiAgICAgICAgICAgICAgRGVjb3JhdGlvbi5yZXBsYWNlKHtcbiAgICAgICAgICAgICAgICB3aWRnZXQ6IG5ldyBJbmxpbmVUb2tlbldpZGdldCh7IGNvbmZpZ1ZlcnNpb246IHRoaXMuY29uZmlnVmVyc2lvbiwgbWF0Y2gsIHJlbmRlcjogcGFyYW1zLnJlbmRlciwgc291cmNlUGF0aCwgc3RhdGUgfSlcbiAgICAgICAgICAgICAgfSkucmFuZ2UoZnJvbSwgdG8pXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsYXN0TGluZU51bWJlciA9IGVuZExpbmVOdW1iZXI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBEZWNvcmF0aW9uLnNldChyYW5nZXMpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBWaWV3UGx1Z2luLmZyb21DbGFzcyhJbmxpbmVUb2tlbldpZGdldHNQbHVnaW5WYWx1ZSwge1xuICAgIGRlY29yYXRpb25zOiAodmFsdWUpID0+IHZhbHVlLmRlY29yYXRpb25zXG4gIH0pO1xufVxuXG4vKipcbiAqIExpc3RzIGV2ZXJ5IG5vbi1lbXB0eSBtYXRjaCBvZiBhIGdsb2JhbCByZWd1bGFyIGV4cHJlc3Npb24gaW4gYSB0ZXh0LlxuICpcbiAqIEBwYXJhbSByZWdFeHAgLSBUaGUgZ2xvYmFsIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIHRleHQgdG8gbWF0Y2guXG4gKiBAcmV0dXJucyBUaGUgbWF0Y2hlcywgaW4gb3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGVjQWxsKHJlZ0V4cDogUmVnRXhwLCB0ZXh0OiBzdHJpbmcpOiBSZWdFeHBFeGVjQXJyYXlbXSB7XG4gIGNvbnN0IG1hdGNoZXM6IFJlZ0V4cEV4ZWNBcnJheVtdID0gW107XG4gIHJlZ0V4cC5sYXN0SW5kZXggPSAwO1xuICBmb3IgKGxldCBtYXRjaCA9IHJlZ0V4cC5leGVjKHRleHQpOyBtYXRjaCAhPT0gbnVsbDsgbWF0Y2ggPSByZWdFeHAuZXhlYyh0ZXh0KSkge1xuICAgIGlmIChtYXRjaFswXSA9PT0gJycpIHtcbiAgICAgIHJlZ0V4cC5sYXN0SW5kZXgrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBtYXRjaGVzLnB1c2gobWF0Y2gpO1xuICB9XG4gIHJldHVybiBtYXRjaGVzO1xufVxuXG4vKipcbiAqIENvcGllcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoIHRoZSBgZ2AgZmxhZyBzZXQsIHNvIG1hdGNoaW5nIG5ldmVyIG1vdmVzIHRoZSBjYWxsZXIncyBgbGFzdEluZGV4YC5cbiAqXG4gKiBAcGFyYW0gcmVnRXhwIC0gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAqIEByZXR1cm5zIEEgZ2xvYmFsIGNvcHkgb2YgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvR2xvYmFsUmVnRXhwKHJlZ0V4cDogUmVnRXhwKTogUmVnRXhwIHtcbiAgcmV0dXJuIG5ldyBSZWdFeHAocmVnRXhwLnNvdXJjZSwgcmVnRXhwLmdsb2JhbCA/IHJlZ0V4cC5mbGFncyA6IGAke3JlZ0V4cC5mbGFnc31nYCk7XG59XG5cbmZ1bmN0aW9uIGFyZU1hdGNoZXNFcXVhbChhOiBSZWdFeHBFeGVjQXJyYXksIGI6IFJlZ0V4cEV4ZWNBcnJheSk6IGJvb2xlYW4ge1xuICByZXR1cm4gYS5sZW5ndGggPT09IGIubGVuZ3RoICYmIGEuZXZlcnkoKHZhbHVlLCBpbmRleCkgPT4gdmFsdWUgPT09IGJbaW5kZXhdKTtcbn1cblxuZnVuY3Rpb24gaXNMaXZlUHJldmlldyhzdGF0ZTogRWRpdG9yU3RhdGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIHN0YXRlLmZpZWxkKGVkaXRvckxpdmVQcmV2aWV3U3RhdGVGaWVsZCwgZmFsc2UpID8/IHRydWU7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBNEJBLGtCQUlPO0FBQ1AsMEJBQXVCO0FBQ3ZCLHNCQUdPO0FBRVAsdUJBQXlCO0FBSXpCLE1BQU0sMkJBQXVCLDRCQUFxQywrQkFBZTtBQUNqRixNQUFNLGtDQUE4Qiw0QkFBNEIs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
247
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb2RlbWlycm9yL2lubGluZS10b2tlbi13aWRnZXRzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDcmVhdGVzIGFuIGVkaXRvciBleHRlbnNpb24gdGhhdCByZXBsYWNlcyBldmVyeSBtYXRjaCBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoIGEgd2lkZ2V0IGluIExpdmUgUHJldmlldywgYW5kXG4gKiBzaG93cyB0aGUgc291cmNlIGFnYWluIHdoaWxlIGEgc2VsZWN0aW9uIHRvdWNoZXMgaXQsIHRoZSB3YXkgT2JzaWRpYW4gdHJlYXRzIGl0cyBvd24gbGlua3MgYW5kIGZvcm1hdHRpbmcuXG4gKlxuICogT25seSB0aGUgdmlzaWJsZSByYW5nZXMgYXJlIG1hdGNoZWQsIGxpbmUgYnkgbGluZSwgc28gYSB0b2tlbiBuZXZlciBzcGFucyB0d28gbGluZXMuIFRoZSBkZWNvcmF0aW9ucyBhcmUgcmVidWlsdFxuICogd2hlbiB0aGUgZG9jdW1lbnQsIHRoZSB2aWV3cG9ydCwgdGhlIHNlbGVjdGlvbiwgdGhlIExpdmUgUHJldmlldyBtb2RlIG9yIHRoZSBjb25maWd1cmF0aW9uIGNoYW5nZXM7IGFcbiAqIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGlzIHdoYXQgYSBgU2V0dGluZ3NGYWNldENvbXBvbmVudGAgZGlzcGF0Y2hlcywgc28gYSByZW5kZXIgdGhhdCByZWFkcyBhIHNldHRpbmdzIGZhY2V0XG4gKiByZS1ydW5zIHdoZW4gdGhlIHNldHRpbmdzIGRvLlxuICpcbiAqIE91dHNpZGUgYW4gT2JzaWRpYW4gTWFya2Rvd24gZWRpdG9yIHRoZXJlIGlzIG5vIGBlZGl0b3JMaXZlUHJldmlld0ZpZWxkYCwgYW5kIHRoZSB3aWRnZXRzIGFyZSBzaG93bi5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEVkaXRvclN0YXRlLFxuICBFeHRlbnNpb24sXG4gIFJhbmdlLFxuICBTdGF0ZUZpZWxkXG59IGZyb20gJ0Bjb2RlbWlycm9yL3N0YXRlJztcbmltcG9ydCB0eXBlIHtcbiAgRGVjb3JhdGlvblNldCxcbiAgRWRpdG9yVmlldyxcbiAgUGx1Z2luVmFsdWUsXG4gIFZpZXdVcGRhdGVcbn0gZnJvbSAnQGNvZGVtaXJyb3Ivdmlldyc7XG5pbXBvcnQgdHlwZSB7IE1hcmtkb3duRmlsZUluZm8gfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7XG4gIERlY29yYXRpb24sXG4gIFZpZXdQbHVnaW4sXG4gIFdpZGdldFR5cGVcbn0gZnJvbSAnQGNvZGVtaXJyb3Ivdmlldyc7XG5pbXBvcnQgeyBjYXN0VG8gfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvb2JqZWN0LXV0aWxzJztcbmltcG9ydCB7IGVkaXRvckluZm9GaWVsZCB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgQ3NzQ2xhc3MgfSBmcm9tICcuLi9jc3MtY2xhc3MudHMnO1xuaW1wb3J0IHsgaXNMaXZlUHJldmlldyB9IGZyb20gJy4vZWRpdG9yLW1vZGUtZXh0ZW5zaW9uLnRzJztcblxuLy8gT2JzaWRpYW4uZC50cyByZWFjaGVzIEBjb2RlbWlycm9yL3N0YXRlIHRocm91Z2ggaXRzIENvbW1vbkpTIGRlY2xhcmF0aW9ucyBhbmQgdGhpcyBtb2R1bGUgdGhyb3VnaCB0aGUgRVMgb25lcywgYW5kXG4vLyBTdGF0ZUZpZWxkIGhhcyBwcml2YXRlIG1lbWJlcnMsIHNvIHRoZSB0d28gZGVjbGFyYXRpb25zIG9mIG9uZSBydW50aW1lIGNsYXNzIGRvIG5vdCB0eXBlLWNoZWNrIGFnYWluc3QgZWFjaCBvdGhlci5cbmNvbnN0IGVkaXRvckluZm9TdGF0ZUZpZWxkID0gY2FzdFRvPFN0YXRlRmllbGQ8TWFya2Rvd25GaWxlSW5mbz4+KGVkaXRvckluZm9GaWVsZCk7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNyZWF0ZUlubGluZVRva2VuV2lkZ2V0c0V4dGVuc2lvbn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlSW5saW5lVG9rZW5XaWRnZXRzRXh0ZW5zaW9uUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gYSB0b2tlbiBtYXRjaGVzLiBUaGUgYGdgIGZsYWcgaXMgYWRkZWQgd2hlbiBtaXNzaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVnRXhwOiBSZWdFeHA7XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgYSB0b2tlbiBpbnRvIHRoZSB3aWRnZXQncyBlbGVtZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgcmVuZGVyOiBJbmxpbmVUb2tlblJlbmRlckZ1bmN0aW9uO1xuXG4gIC8qKlxuICAgKiBEZWNpZGVzIHdoZXRoZXIgYSBtYXRjaCBiZWNvbWVzIGEgd2lkZ2V0LCBzdWNoIGFzIHRvIHNraXAgYSBtYXRjaCBpbnNpZGUgY29kZS4gRXZlcnkgbWF0Y2ggZG9lcyBieSBkZWZhdWx0LlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRGVjb3JhdGU/OiAocGFyYW1zOiBJbmxpbmVUb2tlblNob3VsZERlY29yYXRlUGFyYW1zKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgdG9rZW4gc2hvd3MgaXRzIHNvdXJjZSB3aGlsZSBhIHNlbGVjdGlvbiwgdGhlIGN1cnNvciBpbmNsdWRlZCwgdG91Y2hlcyBpdC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZXZlYWxPblNlbGVjdGlvbj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUmVuZGVycyBhbiBpbmxpbmUgdG9rZW4gaW50byBpdHMgY29udGFpbmVyIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSByZW5kZXIgcGFyYW1ldGVycy5cbiAqL1xuZXhwb3J0IHR5cGUgSW5saW5lVG9rZW5SZW5kZXJGdW5jdGlvbiA9IChwYXJhbXM6IElubGluZVRva2VuUmVuZGVyUGFyYW1zKSA9PiB2b2lkO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgaGFuZGVkIHRvIGFuIGlubGluZSB0b2tlbiByZW5kZXIgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5saW5lVG9rZW5SZW5kZXJQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGVsZW1lbnQgdG8gcmVuZGVyIHRoZSB0b2tlbiBpbnRvLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGFpbmVyRWw6IEhUTUxFbGVtZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgbWF0Y2ggb2YgdGhlIHRva2VuJ3MgcmVndWxhciBleHByZXNzaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheTtcblxuICAvKipcbiAgICogVGhlIHBhdGggb2YgdGhlIG5vdGUgdGhlIHRva2VuIGlzIGluLCBvciBhbiBlbXB0eSBzdHJpbmcgd2hlbiBpdCBpcyBub3Qga25vd24uXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBlZGl0b3Igc3RhdGUsIHdoZW4gdGhlIHRva2VuIHJlbmRlcnMgaW4gYW4gZWRpdG9yLiBBYnNlbnQgaW4gUmVhZGluZyB2aWV3LlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGU/OiBFZGl0b3JTdGF0ZTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGhhbmRlZCB0byB7QGxpbmsgQ3JlYXRlSW5saW5lVG9rZW5XaWRnZXRzRXh0ZW5zaW9uUGFyYW1zLnNob3VsZERlY29yYXRlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmxpbmVUb2tlblNob3VsZERlY29yYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBkb2N1bWVudCBwb3NpdGlvbiB0aGUgbWF0Y2ggc3RhcnRzIGF0LlxuICAgKi9cbiAgcmVhZG9ubHkgZnJvbTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF0Y2ggb2YgdGhlIHRva2VuJ3MgcmVndWxhciBleHByZXNzaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheTtcblxuICAvKipcbiAgICogVGhlIGVkaXRvciBzdGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXRlOiBFZGl0b3JTdGF0ZTtcblxuICAvKipcbiAgICogVGhlIGRvY3VtZW50IHBvc2l0aW9uIHRoZSBtYXRjaCBlbmRzIGF0LlxuICAgKi9cbiAgcmVhZG9ubHkgdG86IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIElubGluZVRva2VuV2lkZ2V0UGFyYW1zIHtcbiAgcmVhZG9ubHkgY29uZmlnVmVyc2lvbjogbnVtYmVyO1xuICByZWFkb25seSBtYXRjaDogUmVnRXhwRXhlY0FycmF5O1xuICByZWFkb25seSByZW5kZXI6IElubGluZVRva2VuUmVuZGVyRnVuY3Rpb247XG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgc3RhdGU6IEVkaXRvclN0YXRlO1xufVxuXG5jbGFzcyBJbmxpbmVUb2tlbldpZGdldCBleHRlbmRzIFdpZGdldFR5cGUge1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZ1ZlcnNpb246IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXRjaDogUmVnRXhwRXhlY0FycmF5O1xuICBwcml2YXRlIHJlYWRvbmx5IHJlbmRlcjogSW5saW5lVG9rZW5SZW5kZXJGdW5jdGlvbjtcbiAgcHJpdmF0ZSByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhdGU6IEVkaXRvclN0YXRlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IElubGluZVRva2VuV2lkZ2V0UGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNvbmZpZ1ZlcnNpb24gPSBwYXJhbXMuY29uZmlnVmVyc2lvbjtcbiAgICB0aGlzLm1hdGNoID0gcGFyYW1zLm1hdGNoO1xuICAgIHRoaXMucmVuZGVyID0gcGFyYW1zLnJlbmRlcjtcbiAgICB0aGlzLnNvdXJjZVBhdGggPSBwYXJhbXMuc291cmNlUGF0aDtcbiAgICB0aGlzLnN0YXRlID0gcGFyYW1zLnN0YXRlO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGVxKG90aGVyOiBXaWRnZXRUeXBlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG90aGVyIGluc3RhbmNlb2YgSW5saW5lVG9rZW5XaWRnZXRcbiAgICAgICYmIG90aGVyLmNvbmZpZ1ZlcnNpb24gPT09IHRoaXMuY29uZmlnVmVyc2lvblxuICAgICAgJiYgb3RoZXIucmVuZGVyID09PSB0aGlzLnJlbmRlclxuICAgICAgJiYgb3RoZXIuc291cmNlUGF0aCA9PT0gdGhpcy5zb3VyY2VQYXRoXG4gICAgICAmJiBhcmVNYXRjaGVzRXF1YWwob3RoZXIubWF0Y2gsIHRoaXMubWF0Y2gpO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIHRvRE9NKHZpZXc6IEVkaXRvclZpZXcpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgY29udGFpbmVyRWwgPSB2aWV3LmRvbS5vd25lckRvY3VtZW50Lndpbi5jcmVhdGVTcGFuKCk7XG4gICAgY29udGFpbmVyRWwuY2xhc3NMaXN0LmFkZChDc3NDbGFzcy5MaWJyYXJ5TmFtZSwgQ3NzQ2xhc3MuSW5saW5lVG9rZW4pO1xuICAgIHRoaXMucmVuZGVyKHtcbiAgICAgIGNvbnRhaW5lckVsLFxuICAgICAgbWF0Y2g6IHRoaXMubWF0Y2gsXG4gICAgICBzb3VyY2VQYXRoOiB0aGlzLnNvdXJjZVBhdGgsXG4gICAgICBzdGF0ZTogdGhpcy5zdGF0ZVxuICAgIH0pO1xuICAgIHJldHVybiBjb250YWluZXJFbDtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gZWRpdG9yIGV4dGVuc2lvbiB0aGF0IHJlcGxhY2VzIGV2ZXJ5IG1hdGNoIG9mIGEgcmVndWxhciBleHByZXNzaW9uIHdpdGggYSB3aWRnZXQgaW4gTGl2ZSBQcmV2aWV3LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZXh0ZW5zaW9uIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgZWRpdG9yIGV4dGVuc2lvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUlubGluZVRva2VuV2lkZ2V0c0V4dGVuc2lvbihwYXJhbXM6IENyZWF0ZUlubGluZVRva2VuV2lkZ2V0c0V4dGVuc2lvblBhcmFtcyk6IEV4dGVuc2lvbiB7XG4gIGNvbnN0IHJlZ0V4cCA9IHRvR2xvYmFsUmVnRXhwKHBhcmFtcy5yZWdFeHApO1xuICBjb25zdCBzaG91bGRSZXZlYWxPblNlbGVjdGlvbiA9IHBhcmFtcy5zaG91bGRSZXZlYWxPblNlbGVjdGlvbiA/PyB0cnVlO1xuXG4gIGNsYXNzIElubGluZVRva2VuV2lkZ2V0c1BsdWdpblZhbHVlIGltcGxlbWVudHMgUGx1Z2luVmFsdWUge1xuICAgIHB1YmxpYyBkZWNvcmF0aW9uczogRGVjb3JhdGlvblNldDtcbiAgICBwcml2YXRlIGNvbmZpZ1ZlcnNpb24gPSAwO1xuXG4gICAgLyoqXG4gICAgICogQnVpbGRzIHRoZSBkZWNvcmF0aW9ucyBvZiBhIG5ldyBlZGl0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmlldyAtIFRoZSBlZGl0b3Igdmlldy5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IodmlldzogRWRpdG9yVmlldykge1xuICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuYnVpbGREZWNvcmF0aW9ucyh2aWV3KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWJ1aWxkcyB0aGUgZGVjb3JhdGlvbnMgd2hlbiB3aGF0IHRoZXkgZGVwZW5kIG9uIGNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdXBkYXRlIC0gVGhlIHZpZXcgdXBkYXRlLlxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGUodXBkYXRlOiBWaWV3VXBkYXRlKTogdm9pZCB7XG4gICAgICBjb25zdCBpc1JlY29uZmlndXJlZCA9IHVwZGF0ZS50cmFuc2FjdGlvbnMuc29tZSgodHJhbnNhY3Rpb24pID0+IHRyYW5zYWN0aW9uLnJlY29uZmlndXJlZCk7XG4gICAgICBpZiAoaXNSZWNvbmZpZ3VyZWQpIHtcbiAgICAgICAgdGhpcy5jb25maWdWZXJzaW9uKys7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHVwZGF0ZS5kb2NDaGFuZ2VkXG4gICAgICAgIHx8IHVwZGF0ZS52aWV3cG9ydENoYW5nZWRcbiAgICAgICAgfHwgdXBkYXRlLnNlbGVjdGlvblNldFxuICAgICAgICB8fCBpc1JlY29uZmlndXJlZFxuICAgICAgICB8fCBpc0xpdmVQcmV2aWV3KHVwZGF0ZS5zdGFydFN0YXRlKSAhPT0gaXNMaXZlUHJldmlldyh1cGRhdGUuc3RhdGUpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IHRoaXMuYnVpbGREZWNvcmF0aW9ucyh1cGRhdGUudmlldyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBidWlsZERlY29yYXRpb25zKHZpZXc6IEVkaXRvclZpZXcpOiBEZWNvcmF0aW9uU2V0IHtcbiAgICAgIGNvbnN0IHN0YXRlID0gdmlldy5zdGF0ZTtcbiAgICAgIGlmICghaXNMaXZlUHJldmlldyhzdGF0ZSkpIHtcbiAgICAgICAgcmV0dXJuIERlY29yYXRpb24ubm9uZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc291cmNlUGF0aCA9IHN0YXRlLmZpZWxkKGVkaXRvckluZm9TdGF0ZUZpZWxkLCBmYWxzZSk/LmZpbGU/LnBhdGggPz8gJyc7XG4gICAgICBjb25zdCByYW5nZXM6IFJhbmdlPERlY29yYXRpb24+W10gPSBbXTtcbiAgICAgIGxldCBsYXN0TGluZU51bWJlciA9IDA7XG5cbiAgICAgIGZvciAoY29uc3QgdmlzaWJsZVJhbmdlIG9mIHZpZXcudmlzaWJsZVJhbmdlcykge1xuICAgICAgICBjb25zdCBmaXJzdExpbmVOdW1iZXIgPSBNYXRoLm1heChzdGF0ZS5kb2MubGluZUF0KHZpc2libGVSYW5nZS5mcm9tKS5udW1iZXIsIGxhc3RMaW5lTnVtYmVyICsgMSk7XG4gICAgICAgIGNvbnN0IGVuZExpbmVOdW1iZXIgPSBzdGF0ZS5kb2MubGluZUF0KHZpc2libGVSYW5nZS50bykubnVtYmVyO1xuICAgICAgICBmb3IgKGxldCBsaW5lTnVtYmVyID0gZmlyc3RMaW5lTnVtYmVyOyBsaW5lTnVtYmVyIDw9IGVuZExpbmVOdW1iZXI7IGxpbmVOdW1iZXIrKykge1xuICAgICAgICAgIGNvbnN0IGxpbmUgPSBzdGF0ZS5kb2MubGluZShsaW5lTnVtYmVyKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIGV4ZWNBbGwocmVnRXhwLCBsaW5lLnRleHQpKSB7XG4gICAgICAgICAgICBjb25zdCBmcm9tID0gbGluZS5mcm9tICsgbWF0Y2guaW5kZXg7XG4gICAgICAgICAgICBjb25zdCB0byA9IGZyb20gKyBtYXRjaFswXS5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoc2hvdWxkUmV2ZWFsT25TZWxlY3Rpb24gJiYgc3RhdGUuc2VsZWN0aW9uLnJhbmdlcy5zb21lKChyYW5nZSkgPT4gcmFuZ2UuZnJvbSA8PSB0byAmJiByYW5nZS50byA+PSBmcm9tKSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXJhbXMuc2hvdWxkRGVjb3JhdGUgJiYgIXBhcmFtcy5zaG91bGREZWNvcmF0ZSh7IGZyb20sIG1hdGNoLCBzdGF0ZSwgdG8gfSkpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByYW5nZXMucHVzaChcbiAgICAgICAgICAgICAgRGVjb3JhdGlvbi5yZXBsYWNlKHtcbiAgICAgICAgICAgICAgICB3aWRnZXQ6IG5ldyBJbmxpbmVUb2tlbldpZGdldCh7IGNvbmZpZ1ZlcnNpb246IHRoaXMuY29uZmlnVmVyc2lvbiwgbWF0Y2gsIHJlbmRlcjogcGFyYW1zLnJlbmRlciwgc291cmNlUGF0aCwgc3RhdGUgfSlcbiAgICAgICAgICAgICAgfSkucmFuZ2UoZnJvbSwgdG8pXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsYXN0TGluZU51bWJlciA9IGVuZExpbmVOdW1iZXI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBEZWNvcmF0aW9uLnNldChyYW5nZXMpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBWaWV3UGx1Z2luLmZyb21DbGFzcyhJbmxpbmVUb2tlbldpZGdldHNQbHVnaW5WYWx1ZSwge1xuICAgIGRlY29yYXRpb25zOiAodmFsdWUpID0+IHZhbHVlLmRlY29yYXRpb25zXG4gIH0pO1xufVxuXG4vKipcbiAqIExpc3RzIGV2ZXJ5IG5vbi1lbXB0eSBtYXRjaCBvZiBhIGdsb2JhbCByZWd1bGFyIGV4cHJlc3Npb24gaW4gYSB0ZXh0LlxuICpcbiAqIEBwYXJhbSByZWdFeHAgLSBUaGUgZ2xvYmFsIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIHRleHQgdG8gbWF0Y2guXG4gKiBAcmV0dXJucyBUaGUgbWF0Y2hlcywgaW4gb3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGVjQWxsKHJlZ0V4cDogUmVnRXhwLCB0ZXh0OiBzdHJpbmcpOiBSZWdFeHBFeGVjQXJyYXlbXSB7XG4gIGNvbnN0IG1hdGNoZXM6IFJlZ0V4cEV4ZWNBcnJheVtdID0gW107XG4gIHJlZ0V4cC5sYXN0SW5kZXggPSAwO1xuICBmb3IgKGxldCBtYXRjaCA9IHJlZ0V4cC5leGVjKHRleHQpOyBtYXRjaCAhPT0gbnVsbDsgbWF0Y2ggPSByZWdFeHAuZXhlYyh0ZXh0KSkge1xuICAgIGlmIChtYXRjaFswXSA9PT0gJycpIHtcbiAgICAgIHJlZ0V4cC5sYXN0SW5kZXgrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBtYXRjaGVzLnB1c2gobWF0Y2gpO1xuICB9XG4gIHJldHVybiBtYXRjaGVzO1xufVxuXG4vKipcbiAqIENvcGllcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoIHRoZSBgZ2AgZmxhZyBzZXQsIHNvIG1hdGNoaW5nIG5ldmVyIG1vdmVzIHRoZSBjYWxsZXIncyBgbGFzdEluZGV4YC5cbiAqXG4gKiBAcGFyYW0gcmVnRXhwIC0gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAqIEByZXR1cm5zIEEgZ2xvYmFsIGNvcHkgb2YgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvR2xvYmFsUmVnRXhwKHJlZ0V4cDogUmVnRXhwKTogUmVnRXhwIHtcbiAgcmV0dXJuIG5ldyBSZWdFeHAocmVnRXhwLnNvdXJjZSwgcmVnRXhwLmdsb2JhbCA/IHJlZ0V4cC5mbGFncyA6IGAke3JlZ0V4cC5mbGFnc31nYCk7XG59XG5cbmZ1bmN0aW9uIGFyZU1hdGNoZXNFcXVhbChhOiBSZWdFeHBFeGVjQXJyYXksIGI6IFJlZ0V4cEV4ZWNBcnJheSk6IGJvb2xlYW4ge1xuICByZXR1cm4gYS5sZW5ndGggPT09IGIubGVuZ3RoICYmIGEuZXZlcnkoKHZhbHVlLCBpbmRleCkgPT4gdmFsdWUgPT09IGJbaW5kZXhdKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUE0QkEsa0JBSU87QUFDUCwwQkFBdUI7QUFDdkIsc0JBQWdDO0FBRWhDLHVCQUF5QjtBQUN6QixtQ0FBOEI7QUFJOUIsTUFBTSwyQkFBdUIsNEJBQXFDLCtCQUFlO0FBOEZqRixNQUFNLDBCQUEwQix1QkFBVztBQUFBLEVBQ3hCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBRVYsWUFBWSxRQUFpQztBQUNsRCxVQUFNO0FBQ04sU0FBSyxnQkFBZ0IsT0FBTztBQUM1QixTQUFLLFFBQVEsT0FBTztBQUNwQixTQUFLLFNBQVMsT0FBTztBQUNyQixTQUFLLGFBQWEsT0FBTztBQUN6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