obsidian-dev-utils 84.5.4 → 84.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/dev/main.js +32059 -0
- package/dist/dev/manifest.json +9 -0
- package/dist/lib/cjs/beeper.cjs +170 -0
- package/dist/lib/cjs/beeper.d.cts +21 -0
- package/dist/lib/cjs/generated-during-build.cjs +2 -2
- package/dist/lib/cjs/index.cjs +4 -1
- package/dist/lib/cjs/index.d.cts +1 -0
- package/dist/lib/cjs/obsidian/css-class.cjs +2 -1
- package/dist/lib/cjs/obsidian/css-class.d.cts +5 -0
- package/dist/lib/cjs/obsidian/editor.cjs +19 -2
- package/dist/lib/cjs/obsidian/editor.d.cts +2 -1
- package/dist/lib/cjs/obsidian/modals/minimizable-modal.cjs +133 -5
- package/dist/lib/cjs/obsidian/modals/minimizable-modal.d.cts +32 -15
- package/dist/lib/cjs/obsidian/resource-lock.cjs +4 -30
- package/dist/lib/esm/beeper.d.mts +21 -0
- package/dist/lib/esm/beeper.mjs +62 -0
- package/dist/lib/esm/generated-during-build.mjs +2 -2
- package/dist/lib/esm/index.d.mts +1 -0
- package/dist/lib/esm/index.mjs +3 -1
- package/dist/lib/esm/obsidian/css-class.d.mts +5 -0
- package/dist/lib/esm/obsidian/css-class.mjs +2 -1
- package/dist/lib/esm/obsidian/editor.d.mts +2 -1
- package/dist/lib/esm/obsidian/editor.mjs +20 -2
- package/dist/lib/esm/obsidian/modals/minimizable-modal.d.mts +32 -15
- package/dist/lib/esm/obsidian/modals/minimizable-modal.mjs +137 -6
- package/dist/lib/esm/obsidian/resource-lock.mjs +4 -30
- package/dist/styles.css +15 -1
- package/package.json +3 -3
|
@@ -22,11 +22,36 @@ if you want to view the source, please visit the github repository of this plugi
|
|
|
22
22
|
})();
|
|
23
23
|
|
|
24
24
|
import { around } from "monkey-around";
|
|
25
|
-
import {
|
|
25
|
+
import {
|
|
26
|
+
Modal,
|
|
27
|
+
setIcon
|
|
28
|
+
} from "obsidian";
|
|
29
|
+
import { Beeper } from "../../beeper.mjs";
|
|
30
|
+
import { ensureNonNullable } from "../../type-guards.mjs";
|
|
26
31
|
import { CssClass } from "../css-class.mjs";
|
|
27
32
|
import { addPluginCssClasses } from "../plugin/plugin-context.mjs";
|
|
28
33
|
const MINIMIZE_ICON_ID = "minus";
|
|
29
34
|
const RESTORE_ICON_ID = "maximize-2";
|
|
35
|
+
const NAVIGATION_KEYS = /* @__PURE__ */ new Set([
|
|
36
|
+
"ArrowDown",
|
|
37
|
+
"ArrowLeft",
|
|
38
|
+
"ArrowRight",
|
|
39
|
+
"ArrowUp",
|
|
40
|
+
"End",
|
|
41
|
+
"Home",
|
|
42
|
+
"PageDown",
|
|
43
|
+
"PageUp"
|
|
44
|
+
]);
|
|
45
|
+
const MODIFIER_KEYS = /* @__PURE__ */ new Set([
|
|
46
|
+
"Alt",
|
|
47
|
+
"Control",
|
|
48
|
+
"Meta",
|
|
49
|
+
"Shift"
|
|
50
|
+
]);
|
|
51
|
+
const peekLockEntries = /* @__PURE__ */ new Set();
|
|
52
|
+
const documentsWithInputSuppressors = /* @__PURE__ */ new WeakSet();
|
|
53
|
+
const beeper = new Beeper();
|
|
54
|
+
let isModalOpenGuardInstalled = false;
|
|
30
55
|
class MinimizableModal {
|
|
31
56
|
/**
|
|
32
57
|
* The wrapped modal. Open, close, and populate it as usual (e.g. `minimizable.modal.open()`).
|
|
@@ -43,6 +68,7 @@ class MinimizableModal {
|
|
|
43
68
|
isMinimizedValue = false;
|
|
44
69
|
minimizeButtonEl;
|
|
45
70
|
minimizedBarEl = null;
|
|
71
|
+
peekLockEntry = null;
|
|
46
72
|
/**
|
|
47
73
|
* Wraps the given modal, adding a minimize button and wiring up cleanup on close.
|
|
48
74
|
*
|
|
@@ -55,8 +81,8 @@ class MinimizableModal {
|
|
|
55
81
|
this.patchOnClose(modal);
|
|
56
82
|
}
|
|
57
83
|
/**
|
|
58
|
-
* Minimizes the modal: hides the modal and its backdrop
|
|
59
|
-
*
|
|
84
|
+
* Minimizes the modal: hides the modal and its backdrop, shows a floating bar with a restore button,
|
|
85
|
+
* and puts the app into the peek-only lock. A no-op if the modal is already minimized.
|
|
60
86
|
*/
|
|
61
87
|
minimize() {
|
|
62
88
|
if (this.isMinimizedValue) {
|
|
@@ -67,16 +93,18 @@ class MinimizableModal {
|
|
|
67
93
|
this.modal.containerEl.hide();
|
|
68
94
|
this.modal.app.keymap.popScope(this.modal.scope);
|
|
69
95
|
this.minimizedBarEl = this.createMinimizedBar();
|
|
96
|
+
this.enablePeekLock(this.minimizedBarEl);
|
|
70
97
|
}
|
|
71
98
|
/**
|
|
72
|
-
* Restores the modal from the minimized state, removing the floating bar
|
|
73
|
-
* not minimized.
|
|
99
|
+
* Restores the modal from the minimized state, removing the floating bar and lifting the peek-only
|
|
100
|
+
* lock. A no-op if the modal is not minimized.
|
|
74
101
|
*/
|
|
75
102
|
restore() {
|
|
76
103
|
if (!this.isMinimizedValue) {
|
|
77
104
|
return;
|
|
78
105
|
}
|
|
79
106
|
this.isMinimizedValue = false;
|
|
107
|
+
this.disablePeekLock();
|
|
80
108
|
this.removeMinimizedBar();
|
|
81
109
|
this.modal.app.keymap.pushScope(this.modal.scope);
|
|
82
110
|
this.modal.containerEl.show();
|
|
@@ -102,9 +130,37 @@ class MinimizableModal {
|
|
|
102
130
|
barEl.addEventListener("click", () => {
|
|
103
131
|
this.restore();
|
|
104
132
|
});
|
|
133
|
+
barEl.addEventListener("animationend", () => {
|
|
134
|
+
barEl.removeClass(CssClass.MinimizedModalBarAttention);
|
|
135
|
+
});
|
|
105
136
|
return barEl;
|
|
106
137
|
}
|
|
138
|
+
disablePeekLock() {
|
|
139
|
+
if (!this.peekLockEntry) {
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
peekLockEntries.delete(this.peekLockEntry);
|
|
143
|
+
this.peekLockEntry = null;
|
|
144
|
+
}
|
|
145
|
+
enablePeekLock(barEl) {
|
|
146
|
+
this.peekLockEntry = {
|
|
147
|
+
barEl,
|
|
148
|
+
flash: () => {
|
|
149
|
+
this.flashBar(barEl);
|
|
150
|
+
},
|
|
151
|
+
innerModal: this.modal
|
|
152
|
+
};
|
|
153
|
+
peekLockEntries.add(this.peekLockEntry);
|
|
154
|
+
installModalOpenGuardOnce();
|
|
155
|
+
installInputSuppressorsOnce(this.modal.containerEl.ownerDocument);
|
|
156
|
+
}
|
|
157
|
+
flashBar(barEl) {
|
|
158
|
+
barEl.removeClass(CssClass.MinimizedModalBarAttention);
|
|
159
|
+
barEl.getBoundingClientRect();
|
|
160
|
+
barEl.addClass(CssClass.MinimizedModalBarAttention);
|
|
161
|
+
}
|
|
107
162
|
handleClose() {
|
|
163
|
+
this.disablePeekLock();
|
|
108
164
|
this.removeMinimizedBar();
|
|
109
165
|
this.isMinimizedValue = false;
|
|
110
166
|
}
|
|
@@ -123,7 +179,82 @@ class MinimizableModal {
|
|
|
123
179
|
this.minimizedBarEl = null;
|
|
124
180
|
}
|
|
125
181
|
}
|
|
182
|
+
function blockEvent(evt) {
|
|
183
|
+
evt.preventDefault();
|
|
184
|
+
evt.stopImmediatePropagation();
|
|
185
|
+
signalBlockedAttempt();
|
|
186
|
+
}
|
|
187
|
+
function flashMinimizedBars() {
|
|
188
|
+
for (const entry of peekLockEntries) {
|
|
189
|
+
entry.flash();
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
function installInputSuppressorsOnce(doc) {
|
|
193
|
+
if (documentsWithInputSuppressors.has(doc)) {
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
documentsWithInputSuppressors.add(doc);
|
|
197
|
+
const win = ensureNonNullable(doc.defaultView);
|
|
198
|
+
win.addEventListener("keydown", suppressKeydownWhilePeekLocked, { capture: true });
|
|
199
|
+
win.addEventListener("beforeinput", suppressWhilePeekLocked, { capture: true });
|
|
200
|
+
win.addEventListener("contextmenu", suppressWhilePeekLocked, { capture: true });
|
|
201
|
+
}
|
|
202
|
+
function installModalOpenGuardOnce() {
|
|
203
|
+
if (isModalOpenGuardInstalled) {
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
isModalOpenGuardInstalled = true;
|
|
207
|
+
around(Modal.prototype, {
|
|
208
|
+
open: (next) => {
|
|
209
|
+
return function open() {
|
|
210
|
+
if (isPeekLocked() && !isMinimizedInnerModal(this)) {
|
|
211
|
+
signalBlockedAttempt();
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
next.call(this);
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
function isMinimizedInnerModal(modal) {
|
|
220
|
+
for (const entry of peekLockEntries) {
|
|
221
|
+
if (entry.innerModal === modal) {
|
|
222
|
+
return true;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return false;
|
|
226
|
+
}
|
|
227
|
+
function isPeekAllowedKey(evt) {
|
|
228
|
+
if (NAVIGATION_KEYS.has(evt.key)) {
|
|
229
|
+
return !evt.shiftKey;
|
|
230
|
+
}
|
|
231
|
+
return MODIFIER_KEYS.has(evt.key);
|
|
232
|
+
}
|
|
233
|
+
function isPeekLocked() {
|
|
234
|
+
for (const entry of peekLockEntries) {
|
|
235
|
+
if (!entry.barEl.isConnected) {
|
|
236
|
+
peekLockEntries.delete(entry);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
return peekLockEntries.size > 0;
|
|
240
|
+
}
|
|
241
|
+
function signalBlockedAttempt() {
|
|
242
|
+
flashMinimizedBars();
|
|
243
|
+
beeper.beep();
|
|
244
|
+
}
|
|
245
|
+
function suppressKeydownWhilePeekLocked(evt) {
|
|
246
|
+
if (!isPeekLocked() || isPeekAllowedKey(evt)) {
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
blockEvent(evt);
|
|
250
|
+
}
|
|
251
|
+
function suppressWhilePeekLocked(evt) {
|
|
252
|
+
if (!isPeekLocked()) {
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
blockEvent(evt);
|
|
256
|
+
}
|
|
126
257
|
export {
|
|
127
258
|
MinimizableModal
|
|
128
259
|
};
|
|
129
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL21vZGFscy9taW5pbWl6YWJsZS1tb2RhbC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEEgd3JhcHBlciB0aGF0IG1ha2VzIGFueSBPYnNpZGlhbiB7QGxpbmsgTW9kYWx9IG1pbmltaXphYmxlLlxuICpcbiAqIE9ic2lkaWFuJ3Mge0BsaW5rIE1vZGFsfSBpcyBibG9ja2luZyBcdTIwMTQgd2hpbGUgaXQgaXMgb3BlbiB0aGUgcmVzdCBvZiB0aGUgYXBwIGlzIGRpbW1lZCBhbmRcbiAqIGluZXJ0IFx1MjAxNCBhbmQgaXQgY2Fubm90IGJlIG1pbmltaXplZC4ge0BsaW5rIE1pbmltaXphYmxlTW9kYWx9IHdyYXBzIGFueSBtb2RhbCBpbnN0YW5jZSAocGxhaW5cbiAqIGBNb2RhbGAsIGBGdXp6eVN1Z2dlc3RNb2RhbGAsIHRoZSBsaWJyYXJ5J3MgYE1vZGFsQmFzZWAsIHlvdXIgb3duIHN1YmNsYXNzLCBcdTIwMjYgXHUyMDE0IGluY2x1ZGluZyBtb2RhbHNcbiAqIHlvdSBkbyBub3Qgb3duKSBhbmQgYWRkcyBhIG1pbmltaXplIGJ1dHRvbjogd2hlbiBtaW5pbWl6ZWQsIHRoZSBtb2RhbCAoYW5kIGl0cyBibG9ja2luZyBiYWNrZHJvcClcbiAqIGlzIGhpZGRlbiBhbmQgYSBzbWFsbCBmbG9hdGluZyBiYXIgd2l0aCBhIHJlc3RvcmUgYnV0dG9uIGlzIHNob3duIGluc3RlYWQsIHNvIHRoZSBhcHAgc3RheXMgZnVsbHlcbiAqIHVzYWJsZSB3aGlsZSBhIGxvbmctcnVubmluZyBvcGVyYXRpb24gY29udGludWVzIGluIHRoZSBiYWNrZ3JvdW5kLlxuICpcbiAqIFRoZSB3cmFwcGVyIHJldXNlcyB0aGUgbW9kYWwncyBvd24gdGl0bGUgKGB0aXRsZUVsYCkgYXMgdGhlIG1pbmltaXplZCBiYXIgbGFiZWwsIHNvIHNldCB0aGUgdGl0bGVcbiAqIHRoZSB1c3VhbCB3YXkgKGBtb2RhbC5zZXRUaXRsZSguLi4pYCkuIFJlbmRlciBhcmJpdHJhcnkgY29udGVudCBpbnRvIHtAbGluayBNb2RhbC5jb250ZW50RWx9LFxuICogaW5jbHVkaW5nIGNsaWNrYWJsZSBub3RlIGxpbmtzIHByb2R1Y2VkIGJ5IGByZW5kZXJJbnRlcm5hbExpbmtgIGZyb21cbiAqIGBvYnNpZGlhbi1kZXYtdXRpbHMvb2JzaWRpYW4vbWFya2Rvd25gOlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBtb2RhbCA9IG5ldyBNeU1vZGFsKGFwcCk7XG4gKiBtb2RhbC5zZXRUaXRsZSgnTWVyZ2luZyBub3RlcycpO1xuICogbW9kYWwuY29udGVudEVsLmFwcGVuZENoaWxkKGF3YWl0IHJlbmRlckludGVybmFsTGluayh7IGFwcCwgcGF0aE9yQWJzdHJhY3RGaWxlOiBmaWxlIH0pKTtcbiAqXG4gKiBjb25zdCBtaW5pbWl6YWJsZSA9IG5ldyBNaW5pbWl6YWJsZU1vZGFsKG1vZGFsKTtcbiAqIG1pbmltaXphYmxlLm1vZGFsLm9wZW4oKTtcbiAqIG1pbmltaXphYmxlLm1pbmltaXplKCk7IC8vIGFwcCBpcyB1c2FibGUgYWdhaW47IGEgZmxvYXRpbmcgYmFyIG9mZmVycyBcInJlc3RvcmVcIlxuICogYGBgXG4gKlxuICogVGhlIHdyYXBwZWQgbW9kYWwgY2FuIHN0aWxsIGJlIGNsb3NlZCBub3JtYWxseTsgdGhlIGZsb2F0aW5nIGJhciBpcyBjbGVhbmVkIHVwIGF1dG9tYXRpY2FsbHkgd2hlblxuICogdGhlIG1vZGFsIGNsb3NlcyAoZXZlbiBpZiBpdCBpcyBjbG9zZWQgd2hpbGUgbWluaW1pemVkKS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE1vZGFsIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBhcm91bmQgfSBmcm9tICdtb25rZXktYXJvdW5kJztcbmltcG9ydCB7IHNldEljb24gfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi4vY3NzLWNsYXNzLnRzJztcbmltcG9ydCB7IGFkZFBsdWdpbkNzc0NsYXNzZXMgfSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWNvbnRleHQudHMnO1xuXG5jb25zdCBNSU5JTUlaRV9JQ09OX0lEID0gJ21pbnVzJztcbmNvbnN0IFJFU1RPUkVfSUNPTl9JRCA9ICdtYXhpbWl6ZS0yJztcblxuLyoqXG4gKiBXcmFwcyBhIHtAbGluayBNb2RhbH0gaW5zdGFuY2UgdG8gbWFrZSBpdCBtaW5pbWl6YWJsZSB0byBhIHNtYWxsIGZsb2F0aW5nIGJhciBhbmQgcmVzdG9yYWJsZSxcbiAqIGtlZXBpbmcgdGhlIGFwcCB1c2FibGUgd2hpbGUgbWluaW1pemVkLlxuICpcbiAqIEB0eXBlUGFyYW0gVE1vZGFsIC0gVGhlIHR5cGUgb2YgdGhlIHdyYXBwZWQgbW9kYWwuXG4gKi9cbmV4cG9ydCBjbGFzcyBNaW5pbWl6YWJsZU1vZGFsPFRNb2RhbCBleHRlbmRzIE1vZGFsPiB7XG4gIC8qKlxuICAgKiBUaGUgd3JhcHBlZCBtb2RhbC4gT3BlbiwgY2xvc2UsIGFuZCBwb3B1bGF0ZSBpdCBhcyB1c3VhbCAoZS5nLiBgbWluaW1pemFibGUubW9kYWwub3BlbigpYCkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbW9kYWw6IFRNb2RhbDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbW9kYWwgaXMgY3VycmVudGx5IG1pbmltaXplZC5cbiAgICpcbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBtb2RhbCBpcyBjdXJyZW50bHkgbWluaW1pemVkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNNaW5pbWl6ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNNaW5pbWl6ZWRWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgaXNNaW5pbWl6ZWRWYWx1ZSA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IG1pbmltaXplQnV0dG9uRWw6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIG1pbmltaXplZEJhckVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBXcmFwcyB0aGUgZ2l2ZW4gbW9kYWwsIGFkZGluZyBhIG1pbmltaXplIGJ1dHRvbiBhbmQgd2lyaW5nIHVwIGNsZWFudXAgb24gY2xvc2UuXG4gICAqXG4gICAqIEBwYXJhbSBtb2RhbCAtIFRoZSBtb2RhbCBpbnN0YW5jZSB0byBtYWtlIG1pbmltaXphYmxlLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKG1vZGFsOiBUTW9kYWwpIHtcbiAgICB0aGlzLm1vZGFsID0gbW9kYWw7XG4gICAgYWRkUGx1Z2luQ3NzQ2xhc3Nlcyhtb2RhbC5jb250YWluZXJFbCwgW0Nzc0NsYXNzLk1pbmltaXphYmxlTW9kYWxdKTtcbiAgICB0aGlzLm1pbmltaXplQnV0dG9uRWwgPSB0aGlzLmNyZWF0ZU1pbmltaXplQnV0dG9uKCk7XG4gICAgdGhpcy5wYXRjaE9uQ2xvc2UobW9kYWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1pbmltaXplcyB0aGUgbW9kYWw6IGhpZGVzIHRoZSBtb2RhbCBhbmQgaXRzIGJhY2tkcm9wIGFuZCBzaG93cyBhIGZsb2F0aW5nIGJhciB3aXRoIGEgcmVzdG9yZVxuICAgKiBidXR0b24uIEEgbm8tb3AgaWYgdGhlIG1vZGFsIGlzIGFscmVhZHkgbWluaW1pemVkLlxuICAgKi9cbiAgcHVibGljIG1pbmltaXplKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzTWluaW1pemVkVmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzTWluaW1pemVkVmFsdWUgPSB0cnVlO1xuICAgIHRoaXMubWluaW1pemVCdXR0b25FbC5oaWRlKCk7XG4gICAgdGhpcy5tb2RhbC5jb250YWluZXJFbC5oaWRlKCk7XG4gICAgLy8gVGhlIG1vZGFsIHN0YXlzIG9wZW4gd2hpbGUgbWluaW1pemVkLCBzbyBpdHMga2V5bWFwIHNjb3BlIHdvdWxkIG90aGVyd2lzZSBzdGF5IGFjdGl2ZS5cbiAgICAvLyBPYnNpZGlhbidzIGZvY3VzIHRyYXAgdGhlbiBzdGVhbHMgZm9jdXMgYmFjayB0byB0aGUgaGlkZGVuIG1vZGFsLCBzbyB0aGUgZWRpdG9yIGNhbm5vdCB0eXBlLlxuICAgIC8vIFBvcHBpbmcgdGhlIHNjb3BlIHJlbGVhc2VzIHRoZSB0cmFwIGFuZCB0aGUgYEVzY2FwZWAgY2FwdHVyZTsgYHJlc3RvcmUoKWAgcmUtcHVzaGVzIGl0LlxuICAgIHRoaXMubW9kYWwuYXBwLmtleW1hcC5wb3BTY29wZSh0aGlzLm1vZGFsLnNjb3BlKTtcbiAgICB0aGlzLm1pbmltaXplZEJhckVsID0gdGhpcy5jcmVhdGVNaW5pbWl6ZWRCYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlcyB0aGUgbW9kYWwgZnJvbSB0aGUgbWluaW1pemVkIHN0YXRlLCByZW1vdmluZyB0aGUgZmxvYXRpbmcgYmFyLiBBIG5vLW9wIGlmIHRoZSBtb2RhbCBpc1xuICAgKiBub3QgbWluaW1pemVkLlxuICAgKi9cbiAgcHVibGljIHJlc3RvcmUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzTWluaW1pemVkVmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzTWluaW1pemVkVmFsdWUgPSBmYWxzZTtcbiAgICB0aGlzLnJlbW92ZU1pbmltaXplZEJhcigpO1xuICAgIC8vIFJlLXB1c2ggdGhlIHNjb3BlIHBvcHBlZCBpbiBtaW5pbWl6ZSgpIHNvIHRoZSByZXN0b3JlZCBtb2RhbCBibG9ja3MgdGhlIGFwcCBhZ2FpbiAoZm9jdXMgdHJhcFxuICAgIC8vICsgRXNjYXBlIGNhcHR1cmUpLlxuICAgIHRoaXMubW9kYWwuYXBwLmtleW1hcC5wdXNoU2NvcGUodGhpcy5tb2RhbC5zY29wZSk7XG4gICAgdGhpcy5tb2RhbC5jb250YWluZXJFbC5zaG93KCk7XG4gICAgdGhpcy5taW5pbWl6ZUJ1dHRvbkVsLnNob3coKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTWluaW1pemVCdXR0b24oKTogSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0IGJ1dHRvbkVsID0gdGhpcy5tb2RhbC5tb2RhbEVsLmNyZWF0ZUVsKCdidXR0b24nLCB7IGNsczogQ3NzQ2xhc3MuTWluaW1pemVCdXR0b24gfSk7XG4gICAgc2V0SWNvbihidXR0b25FbCwgTUlOSU1JWkVfSUNPTl9JRCk7XG4gICAgYnV0dG9uRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICB0aGlzLm1pbmltaXplKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGJ1dHRvbkVsO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVNaW5pbWl6ZWRCYXIoKTogSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0IGJhckVsID0gdGhpcy5tb2RhbC5jb250YWluZXJFbC5vd25lckRvY3VtZW50LmJvZHkuY3JlYXRlRGl2KCk7XG4gICAgYWRkUGx1Z2luQ3NzQ2xhc3NlcyhiYXJFbCwgW0Nzc0NsYXNzLk1pbmltaXplZE1vZGFsQmFyXSk7XG4gICAgYmFyRWwuY3JlYXRlU3Bhbih7XG4gICAgICBjbHM6IENzc0NsYXNzLk1pbmltaXplZE1vZGFsQmFyVGl0bGUsXG4gICAgICB0ZXh0OiB0aGlzLm1vZGFsLnRpdGxlRWwudGV4dENvbnRlbnRcbiAgICB9KTtcbiAgICBjb25zdCByZXN0b3JlQnV0dG9uRWwgPSBiYXJFbC5jcmVhdGVFbCgnYnV0dG9uJywgeyBjbHM6IENzc0NsYXNzLlJlc3RvcmVCdXR0b24gfSk7XG4gICAgc2V0SWNvbihyZXN0b3JlQnV0dG9uRWwsIFJFU1RPUkVfSUNPTl9JRCk7XG4gICAgLy8gVGhlIHdob2xlIGJhciByZXN0b3JlcyBvbiBjbGljaywgbm90IGp1c3QgdGhlIHJlc3RvcmUgYnV0dG9uIFx1MjAxNCBhIGxhcmdlciwgZWFzaWVyIGNsaWNrIHRhcmdldC5cbiAgICAvLyBgcmVzdG9yZSgpYCBndWFyZHMgYWdhaW5zdCBhIGRvdWJsZSBpbnZvY2F0aW9uLCBzbyB0aGUgcmVzdG9yZSBidXR0b24ncyBvd24gY2xpY2sgYnViYmxpbmcgdXBcbiAgICAvLyBIZXJlIGlzIGEgbm8tb3AuIFRoZSByZXN0b3JlIGJ1dHRvbiBzdGF5cyBwdXJlbHkgYXMgYSB2aXN1YWwgYWZmb3JkYW5jZSBmb3IgdGhlIGNsaWNrIHRhcmdldC5cbiAgICBiYXJFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHRoaXMucmVzdG9yZSgpO1xuICAgIH0pO1xuICAgIHJldHVybiBiYXJFbDtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVNaW5pbWl6ZWRCYXIoKTtcbiAgICB0aGlzLmlzTWluaW1pemVkVmFsdWUgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgcGF0Y2hPbkNsb3NlKG1vZGFsOiBNb2RhbCk6IHZvaWQge1xuICAgIGFyb3VuZChtb2RhbCwge1xuICAgICAgb25DbG9zZTogKG5leHQ6ICgpID0+IHZvaWQpOiAoKSA9PiB2b2lkID0+IHtcbiAgICAgICAgcmV0dXJuICgpOiB2b2lkID0+IHtcbiAgICAgICAgICBuZXh0LmNhbGwobW9kYWwpO1xuICAgICAgICAgIHRoaXMuaGFuZGxlQ2xvc2UoKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlTWluaW1pemVkQmFyKCk6IHZvaWQge1xuICAgIHRoaXMubWluaW1pemVkQmFyRWw/LnJlbW92ZSgpO1xuICAgIHRoaXMubWluaW1pemVkQmFyRWwgPSBudWxsO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWlDQSxTQUFTLGNBQWM7QUFDdkIsU0FBUyxlQUFlO0FBRXhCLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsMkJBQTJCO0FBRXBDLE1BQU0sbUJBQW1CO0FBQ3pCLE1BQU0sa0JBQWtCO0FBUWpCLE1BQU0saUJBQXVDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbEM7QUFBQTtBQUFBO0FBQUE7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
|
|
260
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL21vZGFscy9taW5pbWl6YWJsZS1tb2RhbC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEEgd3JhcHBlciB0aGF0IG1ha2VzIGFueSBPYnNpZGlhbiB7QGxpbmsgTW9kYWx9IG1pbmltaXphYmxlIHRvIGEgZmxvYXRpbmcgYmFyIFx1MjAxNCB3aXRob3V0IGJyZWFraW5nIHRoZVxuICogbW9kYWwncyBibG9ja2luZyBjb250cmFjdC5cbiAqXG4gKiBPYnNpZGlhbidzIHtAbGluayBNb2RhbH0gaXMgYmxvY2tpbmc6IHdoaWxlIGl0IGlzIG9wZW4gdGhlIHJlc3Qgb2YgdGhlIGFwcCBpcyBtZWFudCB0byBiZSBpbmVydCB1bnRpbFxuICogdGhlIG1vZGFsIGlzIGRpc21pc3NlZC4ge0BsaW5rIE1pbmltaXphYmxlTW9kYWx9IHdyYXBzIGFueSBtb2RhbCBpbnN0YW5jZSAocGxhaW4gYE1vZGFsYCxcbiAqIGBGdXp6eVN1Z2dlc3RNb2RhbGAsIHRoZSBsaWJyYXJ5J3MgYE1vZGFsQmFzZWAsIHlvdXIgb3duIHN1YmNsYXNzLCBcdTIwMjYgXHUyMDE0IGluY2x1ZGluZyBtb2RhbHMgeW91IGRvIG5vdFxuICogb3duKSBhbmQgYWRkcyBhIG1pbmltaXplIGJ1dHRvbi4gTWluaW1pemluZyBoaWRlcyB0aGUgbW9kYWwgYW5kIGl0cyBibG9ja2luZyBiYWNrZHJvcCBhbmQgc2hvd3MgYVxuICogc21hbGwgZmxvYXRpbmcgYmFyIHdpdGggYSByZXN0b3JlIGJ1dHRvbiwgc28gdGhlIHVzZXIgY2FuIHBlZWsgYXQgdGhlIG5vdGVzL2ZvbGRlcnMgdGhlIG9wZXJhdGlvblxuICogaW52b2x2ZXMgXHUyMDE0IGJ1dCB0aGUgbW9kYWwgaXMgTk9UIGRpc21pc3NlZCwgc28gaXRzIGJsb2NraW5nIGNvbnRyYWN0IG11c3QgYmUgcHJlc2VydmVkLlxuICpcbiAqIFRvIGtlZXAgdGhhdCBjb250cmFjdCB3aGlsZSBtaW5pbWl6ZWQsIHRoZSB3cmFwcGVyIHB1dHMgdGhlIGFwcCBpbnRvIGEgKipwZWVrLW9ubHkgbG9jayoqOiB0aGUgdXNlclxuICogbWF5IG1vdXNlLWNsaWNrIGFuZCBzY3JvbGwgdG8gaW5zcGVjdCBjb250ZW50LCBidXQgY2Fubm90IHN0YXJ0IGFueXRoaW5nIG5ldy4gV2hpbGUgYW55IG1vZGFsIGlzXG4gKiBtaW5pbWl6ZWQgdGhlIHdyYXBwZXI6XG4gKiAtIGJsb2NrcyB0aGUga2V5Ym9hcmQgKHR5cGluZywgaG90a2V5cywgdGhlIGNvbW1hbmQtcGFsZXR0ZSBzaG9ydGN1dCksXG4gKiAtIGJsb2NrcyB0aGUgcmlnaHQtY2xpY2sgY29udGV4dCBtZW51LCBhbmRcbiAqIC0gYmxvY2tzIG9wZW5pbmcgYW55IG90aGVyIG1vZGFsIChhIHJlLWZpcmVkIGNvbW1hbmQsIHRoZSBjb21tYW5kIHBhbGV0dGUsIHNldHRpbmdzLCBcdTIwMjYpLlxuICpcbiAqIEEgYmxvY2tlZCBhdHRlbXB0IGZsYXNoZXMgdGhlIGZsb2F0aW5nIGJhciBhbmQgYmVlcHMgc28gdGhlIHVzZXIgc2VlcyAoYW5kIGhlYXJzKSB3aHkgbm90aGluZ1xuICogaGFwcGVuZWQuIFJlc3RvcmluZyAob3IgdGhlIG1vZGFsIGNsb3NpbmcpIGxpZnRzIHRoZSBsb2NrLiBUaGlzIHByZXZlbnRzLCBmb3IgZXhhbXBsZSwgbWluaW1pemluZyBhXG4gKiBcIm1lcmdlIGZvbGRlclwiIHBpY2tlciBhbmQgdGhlbiBmaXJpbmcgdGhlIHNhbWUgY29tbWFuZCBhZ2FpbiB0byBzdGFjayBzZXZlcmFsIGNvbmN1cnJlbnQgbWVyZ2VzLlxuICpcbiAqIFRoZSB3cmFwcGVyIHJldXNlcyB0aGUgbW9kYWwncyBvd24gdGl0bGUgKGB0aXRsZUVsYCkgYXMgdGhlIG1pbmltaXplZCBiYXIgbGFiZWwsIHNvIHNldCB0aGUgdGl0bGVcbiAqIHRoZSB1c3VhbCB3YXkgKGBtb2RhbC5zZXRUaXRsZSguLi4pYCkuIFJlbmRlciBhcmJpdHJhcnkgY29udGVudCBpbnRvIHtAbGluayBNb2RhbC5jb250ZW50RWx9LFxuICogaW5jbHVkaW5nIGNsaWNrYWJsZSBub3RlIGxpbmtzIHByb2R1Y2VkIGJ5IGByZW5kZXJJbnRlcm5hbExpbmtgIGZyb21cbiAqIGBvYnNpZGlhbi1kZXYtdXRpbHMvb2JzaWRpYW4vbWFya2Rvd25gOlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBtb2RhbCA9IG5ldyBNeU1vZGFsKGFwcCk7XG4gKiBtb2RhbC5zZXRUaXRsZSgnTWVyZ2luZyBub3RlcycpO1xuICogbW9kYWwuY29udGVudEVsLmFwcGVuZENoaWxkKGF3YWl0IHJlbmRlckludGVybmFsTGluayh7IGFwcCwgcGF0aE9yQWJzdHJhY3RGaWxlOiBmaWxlIH0pKTtcbiAqXG4gKiBjb25zdCBtaW5pbWl6YWJsZSA9IG5ldyBNaW5pbWl6YWJsZU1vZGFsKG1vZGFsKTtcbiAqIG1pbmltaXphYmxlLm1vZGFsLm9wZW4oKTtcbiAqIG1pbmltaXphYmxlLm1pbmltaXplKCk7IC8vIGEgZmxvYXRpbmcgYmFyIG9mZmVycyBcInJlc3RvcmVcIjsgdGhlIGFwcCBpcyBwZWVrLW9ubHkgdW50aWwgcmVzdG9yZWRcbiAqIGBgYFxuICpcbiAqIFRoZSB3cmFwcGVkIG1vZGFsIGNhbiBzdGlsbCBiZSBjbG9zZWQgbm9ybWFsbHk7IHRoZSBmbG9hdGluZyBiYXIgaXMgY2xlYW5lZCB1cCBhdXRvbWF0aWNhbGx5IHdoZW5cbiAqIHRoZSBtb2RhbCBjbG9zZXMgKGV2ZW4gaWYgaXQgaXMgY2xvc2VkIHdoaWxlIG1pbmltaXplZCkuXG4gKi9cblxuaW1wb3J0IHsgYXJvdW5kIH0gZnJvbSAnbW9ua2V5LWFyb3VuZCc7XG5pbXBvcnQge1xuICBNb2RhbCxcbiAgc2V0SWNvblxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IEJlZXBlciB9IGZyb20gJy4uLy4uL2JlZXBlci50cyc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJy4uLy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi4vY3NzLWNsYXNzLnRzJztcbmltcG9ydCB7IGFkZFBsdWdpbkNzc0NsYXNzZXMgfSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWNvbnRleHQudHMnO1xuXG5jb25zdCBNSU5JTUlaRV9JQ09OX0lEID0gJ21pbnVzJztcbmNvbnN0IFJFU1RPUkVfSUNPTl9JRCA9ICdtYXhpbWl6ZS0yJztcblxuLy8gTmF2aWdhdGlvbiBrZXlzIHBhc3MgdGhyb3VnaCB3aGlsZSBtaW5pbWl6ZWQgc28gdGhlIHVzZXIgY2FuIG1vdmUgdGhlIGN1cnNvciBhbmQgc2Nyb2xsIHRvIHJlYWQuXG4vLyBOb25lIG9mIHRoZW0gbXV0YXRlIHRoZSBkb2N1bWVudCBcdTIwMTQgdGV4dCBjaGFuZ2VzIGFyZSBjYXVnaHQgc2VwYXJhdGVseSBieSB0aGUgYGJlZm9yZWlucHV0YCBndWFyZC5cbi8vIFNoaWZ0K25hdmlnYXRpb24gaXMgYmxvY2tlZCwgdGhvdWdoLCBzaW5jZSBpdCBleHRlbmRzIHRoZSBzZWxlY3Rpb24gdGhhdCBpbnNwZWN0aW9uIGRvZXMgbm90IG5lZWQuXG5jb25zdCBOQVZJR0FUSU9OX0tFWVMgPSBuZXcgU2V0PHN0cmluZz4oW1xuICAnQXJyb3dEb3duJyxcbiAgJ0Fycm93TGVmdCcsXG4gICdBcnJvd1JpZ2h0JyxcbiAgJ0Fycm93VXAnLFxuICAnRW5kJyxcbiAgJ0hvbWUnLFxuICAnUGFnZURvd24nLFxuICAnUGFnZVVwJ1xuXSk7XG5cbi8vIEEgYmFyZSBtb2RpZmllciBwcmVzcyBkb2VzIG5vdGhpbmcgb24gaXRzIG93biwgc28gaXQgcGFzc2VzIHRocm91Z2ggdGhlIGxvY2suXG4vLyBUaGlzIGF2b2lkcyBhIHNwdXJpb3VzIGZsYXNoL2JlZXAgd2hpbGUgY29tcG9zaW5nIGEgc2hvcnRjdXQ7IHRoZSBzaG9ydGN1dCdzIGNvbW1hbmQga2V5IGlzIGJsb2NrZWQuXG5jb25zdCBNT0RJRklFUl9LRVlTID0gbmV3IFNldDxzdHJpbmc+KFtcbiAgJ0FsdCcsXG4gICdDb250cm9sJyxcbiAgJ01ldGEnLFxuICAnU2hpZnQnXG5dKTtcblxuLyoqXG4gKiBBIHJlZ2lzdGVyZWQgZW50cnkgZm9yIGEgY3VycmVudGx5LW1pbmltaXplZCBtb2RhbC4gVGhlIHNoYXJlZCBwZWVrLW9ubHkgbG9jayB1c2VzIGl0IHRvIGtub3cgYVxuICogbW9kYWwgaXMgbWluaW1pemVkLCB0byBsZWF2ZSB0aGF0IG1vZGFsJ3Mgb3duIHJlLW9wZW5zIGFsb25lLCBhbmQgdG8gZmxhc2ggaXRzIGJhciBvbiBhIGJsb2NrZWRcbiAqIGF0dGVtcHQuXG4gKi9cbmludGVyZmFjZSBQZWVrTG9ja0VudHJ5IHtcbiAgLyoqXG4gICAqIFRoZSBmbG9hdGluZyBiYXIgZWxlbWVudC4gVXNlZCB0byBkZXRlY3QgYSBzdGFsZSBlbnRyeSAoaXRzIGJhciBoYXMgbGVmdCB0aGUgRE9NKSBzbyBpdCBjYW4gYmVcbiAgICogcHJ1bmVkIGFuZCBuZXZlciBrZWVwIHRoZSBhcHAgbG9ja2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFyRWw6IEhUTUxFbGVtZW50O1xuXG4gIC8qKlxuICAgKiBGbGFzaGVzIHRoZSBmbG9hdGluZyBiYXIgdG8gc2lnbmFsIGEgYmxvY2tlZCBhdHRlbXB0LlxuICAgKi9cbiAgZmxhc2goKTogdm9pZDtcblxuICAvKipcbiAgICogVGhlIHdyYXBwZWQgbW9kYWwgaW5zdGFuY2UsIHNvIGl0cyBvd24gYG9wZW4oKWAgaXMgbmV2ZXIgYmxvY2tlZCBieSB0aGUgbG9jay5cbiAgICovXG4gIHJlYWRvbmx5IGlubmVyTW9kYWw6IE1vZGFsO1xufVxuXG5jb25zdCBwZWVrTG9ja0VudHJpZXMgPSBuZXcgU2V0PFBlZWtMb2NrRW50cnk+KCk7XG5jb25zdCBkb2N1bWVudHNXaXRoSW5wdXRTdXBwcmVzc29ycyA9IG5ldyBXZWFrU2V0PERvY3VtZW50PigpO1xuY29uc3QgYmVlcGVyID0gbmV3IEJlZXBlcigpO1xubGV0IGlzTW9kYWxPcGVuR3VhcmRJbnN0YWxsZWQgPSBmYWxzZTtcblxuLyoqXG4gKiBXcmFwcyBhIHtAbGluayBNb2RhbH0gaW5zdGFuY2UgdG8gbWFrZSBpdCBtaW5pbWl6YWJsZSB0byBhIHNtYWxsIGZsb2F0aW5nIGJhciBhbmQgcmVzdG9yYWJsZS4gV2hpbGVcbiAqIG1pbmltaXplZCB0aGUgYXBwIGlzIHB1dCBpbnRvIGEgcGVlay1vbmx5IGxvY2sgKGtleWJvYXJkLCBjb250ZXh0IG1lbnUsIGFuZCBvcGVuaW5nIG90aGVyIG1vZGFscyBhcmVcbiAqIGJsb2NrZWQpIHNvIHRoZSBtb2RhbCdzIGJsb2NraW5nIGNvbnRyYWN0IGlzIHByZXNlcnZlZC5cbiAqXG4gKiBAdHlwZVBhcmFtIFRNb2RhbCAtIFRoZSB0eXBlIG9mIHRoZSB3cmFwcGVkIG1vZGFsLlxuICovXG5leHBvcnQgY2xhc3MgTWluaW1pemFibGVNb2RhbDxUTW9kYWwgZXh0ZW5kcyBNb2RhbD4ge1xuICAvKipcbiAgICogVGhlIHdyYXBwZWQgbW9kYWwuIE9wZW4sIGNsb3NlLCBhbmQgcG9wdWxhdGUgaXQgYXMgdXN1YWwgKGUuZy4gYG1pbmltaXphYmxlLm1vZGFsLm9wZW4oKWApLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1vZGFsOiBUTW9kYWw7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG1vZGFsIGlzIGN1cnJlbnRseSBtaW5pbWl6ZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbW9kYWwgaXMgY3VycmVudGx5IG1pbmltaXplZCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzTWluaW1pemVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTWluaW1pemVkVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGlzTWluaW1pemVkVmFsdWUgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBtaW5pbWl6ZUJ1dHRvbkVsOiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBtaW5pbWl6ZWRCYXJFbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwZWVrTG9ja0VudHJ5OiBudWxsIHwgUGVla0xvY2tFbnRyeSA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFdyYXBzIHRoZSBnaXZlbiBtb2RhbCwgYWRkaW5nIGEgbWluaW1pemUgYnV0dG9uIGFuZCB3aXJpbmcgdXAgY2xlYW51cCBvbiBjbG9zZS5cbiAgICpcbiAgICogQHBhcmFtIG1vZGFsIC0gVGhlIG1vZGFsIGluc3RhbmNlIHRvIG1ha2UgbWluaW1pemFibGUuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IobW9kYWw6IFRNb2RhbCkge1xuICAgIHRoaXMubW9kYWwgPSBtb2RhbDtcbiAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKG1vZGFsLmNvbnRhaW5lckVsLCBbQ3NzQ2xhc3MuTWluaW1pemFibGVNb2RhbF0pO1xuICAgIHRoaXMubWluaW1pemVCdXR0b25FbCA9IHRoaXMuY3JlYXRlTWluaW1pemVCdXR0b24oKTtcbiAgICB0aGlzLnBhdGNoT25DbG9zZShtb2RhbCk7XG4gIH1cblxuICAvKipcbiAgICogTWluaW1pemVzIHRoZSBtb2RhbDogaGlkZXMgdGhlIG1vZGFsIGFuZCBpdHMgYmFja2Ryb3AsIHNob3dzIGEgZmxvYXRpbmcgYmFyIHdpdGggYSByZXN0b3JlIGJ1dHRvbixcbiAgICogYW5kIHB1dHMgdGhlIGFwcCBpbnRvIHRoZSBwZWVrLW9ubHkgbG9jay4gQSBuby1vcCBpZiB0aGUgbW9kYWwgaXMgYWxyZWFkeSBtaW5pbWl6ZWQuXG4gICAqL1xuICBwdWJsaWMgbWluaW1pemUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNNaW5pbWl6ZWRWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNNaW5pbWl6ZWRWYWx1ZSA9IHRydWU7XG4gICAgdGhpcy5taW5pbWl6ZUJ1dHRvbkVsLmhpZGUoKTtcbiAgICB0aGlzLm1vZGFsLmNvbnRhaW5lckVsLmhpZGUoKTtcbiAgICAvLyBUaGUgbW9kYWwgc3RheXMgb3BlbiB3aGlsZSBtaW5pbWl6ZWQsIHNvIGl0cyBrZXltYXAgc2NvcGUgaXMgcG9wcGVkIHRvIHJlbGVhc2UgdGhlIGZvY3VzIHRyYXAuXG4gICAgLy8gUmVzdG9yaW5nIHJlLXB1c2hlcyBpdC4gQW4gYWN0aXZlIHRyYXAgd291bGQgc3RlYWwgZm9jdXMgYmFjayB0byB0aGUgaGlkZGVuIG1vZGFsLCBibG9ja2luZyB0aGVcbiAgICAvLyBNb3VzZS1kcml2ZW4gaW5zcGVjdGlvbiAoY2xpY2tpbmcgbm90ZXMsIHNjcm9sbGluZykgdGhhdCBtaW5pbWl6ZSBleGlzdHMgdG8gYWxsb3cuXG4gICAgLy8gS2V5Ym9hcmQgaW5wdXQgcmVtYWlucyBibG9ja2VkIGJ5IHRoZSBwZWVrLW9ubHkgbG9jaywgc28gcmVsZWFzaW5nIHRoZSB0cmFwIGtlZXBzIHRoZSBhcHAgaW5lcnQuXG4gICAgdGhpcy5tb2RhbC5hcHAua2V5bWFwLnBvcFNjb3BlKHRoaXMubW9kYWwuc2NvcGUpO1xuICAgIHRoaXMubWluaW1pemVkQmFyRWwgPSB0aGlzLmNyZWF0ZU1pbmltaXplZEJhcigpO1xuICAgIHRoaXMuZW5hYmxlUGVla0xvY2sodGhpcy5taW5pbWl6ZWRCYXJFbCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZXMgdGhlIG1vZGFsIGZyb20gdGhlIG1pbmltaXplZCBzdGF0ZSwgcmVtb3ZpbmcgdGhlIGZsb2F0aW5nIGJhciBhbmQgbGlmdGluZyB0aGUgcGVlay1vbmx5XG4gICAqIGxvY2suIEEgbm8tb3AgaWYgdGhlIG1vZGFsIGlzIG5vdCBtaW5pbWl6ZWQuXG4gICAqL1xuICBwdWJsaWMgcmVzdG9yZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNNaW5pbWl6ZWRWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNNaW5pbWl6ZWRWYWx1ZSA9IGZhbHNlO1xuICAgIHRoaXMuZGlzYWJsZVBlZWtMb2NrKCk7XG4gICAgdGhpcy5yZW1vdmVNaW5pbWl6ZWRCYXIoKTtcbiAgICAvLyBSZS1wdXNoIHRoZSBzY29wZSBwb3BwZWQgaW4gbWluaW1pemUoKSBzbyB0aGUgcmVzdG9yZWQgbW9kYWwgYmxvY2tzIHRoZSBhcHAgYWdhaW4gKGZvY3VzIHRyYXBcbiAgICAvLyArIEVzY2FwZSBjYXB0dXJlKS5cbiAgICB0aGlzLm1vZGFsLmFwcC5rZXltYXAucHVzaFNjb3BlKHRoaXMubW9kYWwuc2NvcGUpO1xuICAgIHRoaXMubW9kYWwuY29udGFpbmVyRWwuc2hvdygpO1xuICAgIHRoaXMubWluaW1pemVCdXR0b25FbC5zaG93KCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU1pbmltaXplQnV0dG9uKCk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBidXR0b25FbCA9IHRoaXMubW9kYWwubW9kYWxFbC5jcmVhdGVFbCgnYnV0dG9uJywgeyBjbHM6IENzc0NsYXNzLk1pbmltaXplQnV0dG9uIH0pO1xuICAgIHNldEljb24oYnV0dG9uRWwsIE1JTklNSVpFX0lDT05fSUQpO1xuICAgIGJ1dHRvbkVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgdGhpcy5taW5pbWl6ZSgpO1xuICAgIH0pO1xuICAgIHJldHVybiBidXR0b25FbDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTWluaW1pemVkQmFyKCk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBiYXJFbCA9IHRoaXMubW9kYWwuY29udGFpbmVyRWwub3duZXJEb2N1bWVudC5ib2R5LmNyZWF0ZURpdigpO1xuICAgIGFkZFBsdWdpbkNzc0NsYXNzZXMoYmFyRWwsIFtDc3NDbGFzcy5NaW5pbWl6ZWRNb2RhbEJhcl0pO1xuICAgIGJhckVsLmNyZWF0ZVNwYW4oe1xuICAgICAgY2xzOiBDc3NDbGFzcy5NaW5pbWl6ZWRNb2RhbEJhclRpdGxlLFxuICAgICAgdGV4dDogdGhpcy5tb2RhbC50aXRsZUVsLnRleHRDb250ZW50XG4gICAgfSk7XG4gICAgY29uc3QgcmVzdG9yZUJ1dHRvbkVsID0gYmFyRWwuY3JlYXRlRWwoJ2J1dHRvbicsIHsgY2xzOiBDc3NDbGFzcy5SZXN0b3JlQnV0dG9uIH0pO1xuICAgIHNldEljb24ocmVzdG9yZUJ1dHRvbkVsLCBSRVNUT1JFX0lDT05fSUQpO1xuICAgIC8vIFRoZSB3aG9sZSBiYXIgcmVzdG9yZXMgb24gY2xpY2ssIG5vdCBqdXN0IHRoZSByZXN0b3JlIGJ1dHRvbiBcdTIwMTQgYSBsYXJnZXIsIGVhc2llciBjbGljayB0YXJnZXQuXG4gICAgLy8gYHJlc3RvcmUoKWAgZ3VhcmRzIGFnYWluc3QgYSBkb3VibGUgaW52b2NhdGlvbiwgc28gdGhlIHJlc3RvcmUgYnV0dG9uJ3Mgb3duIGNsaWNrIGJ1YmJsaW5nIHVwXG4gICAgLy8gSGVyZSBpcyBhIG5vLW9wLiBUaGUgcmVzdG9yZSBidXR0b24gc3RheXMgcHVyZWx5IGFzIGEgdmlzdWFsIGFmZm9yZGFuY2UgZm9yIHRoZSBjbGljayB0YXJnZXQuXG4gICAgYmFyRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICB0aGlzLnJlc3RvcmUoKTtcbiAgICB9KTtcbiAgICAvLyBEcm9wIHRoZSBvbmUtc2hvdCBhdHRlbnRpb24gZmxhc2ggb25jZSBpdCBmaW5pc2hlcyBzbyB0aGUgYmFyIHJldHVybnMgdG8gaXRzIGdlbnRsZSBpZGxlIHB1bHNlLlxuICAgIC8vIFRoZSBpZGxlIHB1bHNlIGlzIGFuIGluZmluaXRlIGFuaW1hdGlvbiwgd2hpY2ggbmV2ZXIgZmlyZXMgYGFuaW1hdGlvbmVuZGAuXG4gICAgYmFyRWwuYWRkRXZlbnRMaXN0ZW5lcignYW5pbWF0aW9uZW5kJywgKCkgPT4ge1xuICAgICAgYmFyRWwucmVtb3ZlQ2xhc3MoQ3NzQ2xhc3MuTWluaW1pemVkTW9kYWxCYXJBdHRlbnRpb24pO1xuICAgIH0pO1xuICAgIHJldHVybiBiYXJFbDtcbiAgfVxuXG4gIHByaXZhdGUgZGlzYWJsZVBlZWtMb2NrKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wZWVrTG9ja0VudHJ5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcGVla0xvY2tFbnRyaWVzLmRlbGV0ZSh0aGlzLnBlZWtMb2NrRW50cnkpO1xuICAgIHRoaXMucGVla0xvY2tFbnRyeSA9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGVuYWJsZVBlZWtMb2NrKGJhckVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIHRoaXMucGVla0xvY2tFbnRyeSA9IHtcbiAgICAgIGJhckVsLFxuICAgICAgZmxhc2g6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5mbGFzaEJhcihiYXJFbCk7XG4gICAgICB9LFxuICAgICAgaW5uZXJNb2RhbDogdGhpcy5tb2RhbFxuICAgIH07XG4gICAgcGVla0xvY2tFbnRyaWVzLmFkZCh0aGlzLnBlZWtMb2NrRW50cnkpO1xuICAgIGluc3RhbGxNb2RhbE9wZW5HdWFyZE9uY2UoKTtcbiAgICBpbnN0YWxsSW5wdXRTdXBwcmVzc29yc09uY2UodGhpcy5tb2RhbC5jb250YWluZXJFbC5vd25lckRvY3VtZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgZmxhc2hCYXIoYmFyRWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgYmFyRWwucmVtb3ZlQ2xhc3MoQ3NzQ2xhc3MuTWluaW1pemVkTW9kYWxCYXJBdHRlbnRpb24pO1xuICAgIC8vIEZvcmNlIGEgcmVmbG93IHNvIHJlLWFkZGluZyB0aGUgY2xhc3MgcmVzdGFydHMgdGhlIG9uZS1zaG90IGZsYXNoIG9uIHJhcGlkIHJlcGVhdGVkIGJsb2Nrcy5cbiAgICBiYXJFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBiYXJFbC5hZGRDbGFzcyhDc3NDbGFzcy5NaW5pbWl6ZWRNb2RhbEJhckF0dGVudGlvbik7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZVBlZWtMb2NrKCk7XG4gICAgdGhpcy5yZW1vdmVNaW5pbWl6ZWRCYXIoKTtcbiAgICB0aGlzLmlzTWluaW1pemVkVmFsdWUgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgcGF0Y2hPbkNsb3NlKG1vZGFsOiBNb2RhbCk6IHZvaWQge1xuICAgIGFyb3VuZChtb2RhbCwge1xuICAgICAgb25DbG9zZTogKG5leHQ6ICgpID0+IHZvaWQpOiAoKSA9PiB2b2lkID0+IHtcbiAgICAgICAgcmV0dXJuICgpOiB2b2lkID0+IHtcbiAgICAgICAgICBuZXh0LmNhbGwobW9kYWwpO1xuICAgICAgICAgIHRoaXMuaGFuZGxlQ2xvc2UoKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlTWluaW1pemVkQmFyKCk6IHZvaWQge1xuICAgIHRoaXMubWluaW1pemVkQmFyRWw/LnJlbW92ZSgpO1xuICAgIHRoaXMubWluaW1pemVkQmFyRWwgPSBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJsb2NrRXZlbnQoZXZ0OiBFdmVudCk6IHZvaWQge1xuICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgZXZ0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICBzaWduYWxCbG9ja2VkQXR0ZW1wdCgpO1xufVxuXG5mdW5jdGlvbiBmbGFzaE1pbmltaXplZEJhcnMoKTogdm9pZCB7XG4gIGZvciAoY29uc3QgZW50cnkgb2YgcGVla0xvY2tFbnRyaWVzKSB7XG4gICAgZW50cnkuZmxhc2goKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnN0YWxsSW5wdXRTdXBwcmVzc29yc09uY2UoZG9jOiBEb2N1bWVudCk6IHZvaWQge1xuICBpZiAoZG9jdW1lbnRzV2l0aElucHV0U3VwcHJlc3NvcnMuaGFzKGRvYykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBkb2N1bWVudHNXaXRoSW5wdXRTdXBwcmVzc29ycy5hZGQoZG9jKTtcbiAgY29uc3Qgd2luID0gZW5zdXJlTm9uTnVsbGFibGUoZG9jLmRlZmF1bHRWaWV3KTtcbiAgLy8gQ2FwdHVyZS1waGFzZSB3aW5kb3cgbGlzdGVuZXJzIHJ1biBiZWZvcmUgT2JzaWRpYW4ncyBvd24gZG9jdW1lbnQvZWxlbWVudCBoYW5kbGVycyAoaW5jbHVkaW5nXG4gIC8vIENvZGVNaXJyb3IncykuIGBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKWAgdGhlbiBwcmV2ZW50cyB0aG9zZSBoYW5kbGVycyBmcm9tIGV2ZXIgc2VlaW5nIGFcbiAgLy8gQmxvY2tlZCBldmVudC4gVGhlIGxpc3RlbmVycyBhcmUgcGVybWFuZW50IGJ1dCBpbmVydCB3aGVuZXZlciBub3RoaW5nIGlzIG1pbmltaXplZC5cbiAgLy8gYGtleWRvd25gIGxldHMgbmF2aWdhdGlvbiBrZXlzIHRocm91Z2ggKHNlZSBpc1BlZWtBbGxvd2VkS2V5KSBidXQgYmxvY2tzIGNvbW1hbmQgaG90a2V5cztcbiAgLy8gYGJlZm9yZWlucHV0YCBibG9ja3MgYWxsIGVkaXRvciBtdXRhdGlvbjsgYGNvbnRleHRtZW51YCBibG9ja3MgdGhlIHJpZ2h0LWNsaWNrIG1lbnUuXG4gIHdpbi5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgc3VwcHJlc3NLZXlkb3duV2hpbGVQZWVrTG9ja2VkLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gIHdpbi5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmVpbnB1dCcsIHN1cHByZXNzV2hpbGVQZWVrTG9ja2VkLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gIHdpbi5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIHN1cHByZXNzV2hpbGVQZWVrTG9ja2VkLCB7IGNhcHR1cmU6IHRydWUgfSk7XG59XG5cbmZ1bmN0aW9uIGluc3RhbGxNb2RhbE9wZW5HdWFyZE9uY2UoKTogdm9pZCB7XG4gIGlmIChpc01vZGFsT3Blbkd1YXJkSW5zdGFsbGVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaXNNb2RhbE9wZW5HdWFyZEluc3RhbGxlZCA9IHRydWU7XG4gIC8vIE5ldmVyIHVuaW5zdGFsbGVkOiB0aGUgZ3VhcmQgaXMgaW5lcnQgd2hlbmV2ZXIgbm90aGluZyBpcyBtaW5pbWl6ZWQgKGBpc1BlZWtMb2NrZWQoKWAgaXMgZmFsc2UpLlxuICAvLyBPbmUgcGVybWFuZW50IHBhdGNoIGlzIGNoZWFwZXIgYW5kIGxlYWstZnJlZSB2ZXJzdXMgaW5zdGFsbGluZyBhbmQgdW5pbnN0YWxsaW5nIGl0IHBlciBtaW5pbWl6ZS5cbiAgYXJvdW5kKE1vZGFsLnByb3RvdHlwZSwge1xuICAgIG9wZW46IChuZXh0OiAoKSA9PiB2b2lkKTogKHRoaXM6IE1vZGFsKSA9PiB2b2lkID0+IHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiBvcGVuKHRoaXM6IE1vZGFsKTogdm9pZCB7XG4gICAgICAgIGlmIChpc1BlZWtMb2NrZWQoKSAmJiAhaXNNaW5pbWl6ZWRJbm5lck1vZGFsKHRoaXMpKSB7XG4gICAgICAgICAgc2lnbmFsQmxvY2tlZEF0dGVtcHQoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBuZXh0LmNhbGwodGhpcyk7XG4gICAgICB9O1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzTWluaW1pemVkSW5uZXJNb2RhbChtb2RhbDogTW9kYWwpOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBwZWVrTG9ja0VudHJpZXMpIHtcbiAgICBpZiAoZW50cnkuaW5uZXJNb2RhbCA9PT0gbW9kYWwpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNQZWVrQWxsb3dlZEtleShldnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgLy8gTmF2aWdhdGlvbiBtb3ZlcyB0aGUgY3Vyc29yL3Njcm9sbHMgKGFsbG93ZWQpLCBidXQgU2hpZnQrbmF2aWdhdGlvbiBleHRlbmRzIHRoZSBzZWxlY3Rpb24gKG5vdFxuICAvLyBOZWVkZWQgZm9yIGluc3BlY3Rpb24pLCBzbyBpdCBpcyBibG9ja2VkLiBCYXJlIG1vZGlmaWVyIHByZXNzZXMgcGFzcyB0aHJvdWdoIG9uIHRoZWlyIG93bi5cbiAgaWYgKE5BVklHQVRJT05fS0VZUy5oYXMoZXZ0LmtleSkpIHtcbiAgICByZXR1cm4gIWV2dC5zaGlmdEtleTtcbiAgfVxuXG4gIHJldHVybiBNT0RJRklFUl9LRVlTLmhhcyhldnQua2V5KTtcbn1cblxuZnVuY3Rpb24gaXNQZWVrTG9ja2VkKCk6IGJvb2xlYW4ge1xuICAvLyBEcm9wIGVudHJpZXMgd2hvc2UgYmFyIGhhcyBsZWZ0IHRoZSBET00gd2l0aG91dCBhIHJlc3RvcmUoKSBvciBjbG9zZSgpLlxuICAvLyBBIHRlc3QgdGVhcmRvd24gdGhhdCBlbXB0aWVzIHRoZSBib2R5IGlzIHRoZSB0eXBpY2FsIGNhdXNlOyB0aGlzIGtlZXBzIGEgc3RhbGUgZW50cnkgZnJvbSBsb2NraW5nLlxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIHBlZWtMb2NrRW50cmllcykge1xuICAgIGlmICghZW50cnkuYmFyRWwuaXNDb25uZWN0ZWQpIHtcbiAgICAgIHBlZWtMb2NrRW50cmllcy5kZWxldGUoZW50cnkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwZWVrTG9ja0VudHJpZXMuc2l6ZSA+IDA7XG59XG5cbmZ1bmN0aW9uIHNpZ25hbEJsb2NrZWRBdHRlbXB0KCk6IHZvaWQge1xuICBmbGFzaE1pbmltaXplZEJhcnMoKTtcbiAgYmVlcGVyLmJlZXAoKTtcbn1cblxuZnVuY3Rpb24gc3VwcHJlc3NLZXlkb3duV2hpbGVQZWVrTG9ja2VkKGV2dDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICBpZiAoIWlzUGVla0xvY2tlZCgpIHx8IGlzUGVla0FsbG93ZWRLZXkoZXZ0KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGJsb2NrRXZlbnQoZXZ0KTtcbn1cblxuZnVuY3Rpb24gc3VwcHJlc3NXaGlsZVBlZWtMb2NrZWQoZXZ0OiBFdmVudCk6IHZvaWQge1xuICBpZiAoIWlzUGVla0xvY2tlZCgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYmxvY2tFdmVudChldnQpO1xufVxu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
|