obsidian-dev-utils 84.5.4 → 84.6.1
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 +13 -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 +177 -12
- package/dist/lib/cjs/obsidian/modals/minimizable-modal.d.cts +34 -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 +34 -15
- package/dist/lib/esm/obsidian/modals/minimizable-modal.mjs +181 -13
- package/dist/lib/esm/obsidian/resource-lock.mjs +4 -30
- package/dist/styles.css +15 -1
- package/package.json +3 -3
|
@@ -128,12 +128,80 @@ __export(minimizable_modal_exports, {
|
|
|
128
128
|
MinimizableModal: () => MinimizableModal
|
|
129
129
|
});
|
|
130
130
|
module.exports = __toCommonJS(minimizable_modal_exports);
|
|
131
|
-
var import_monkey_around = require('monkey-around');
|
|
132
131
|
var import_obsidian = require('obsidian');
|
|
132
|
+
var import_beeper = require('../../beeper.cjs');
|
|
133
|
+
var import_all_windows_event_component = require('../components/all-windows-event-component.cjs');
|
|
134
|
+
var import_monkey_around_component = require('../components/monkey-around-component.cjs');
|
|
133
135
|
var import_css_class = require('../css-class.cjs');
|
|
134
136
|
var import_plugin_context = require('../plugin/plugin-context.cjs');
|
|
135
137
|
const MINIMIZE_ICON_ID = "minus";
|
|
136
138
|
const RESTORE_ICON_ID = "maximize-2";
|
|
139
|
+
const NAVIGATION_KEYS = /* @__PURE__ */ new Set([
|
|
140
|
+
"ArrowDown",
|
|
141
|
+
"ArrowLeft",
|
|
142
|
+
"ArrowRight",
|
|
143
|
+
"ArrowUp",
|
|
144
|
+
"End",
|
|
145
|
+
"Home",
|
|
146
|
+
"PageDown",
|
|
147
|
+
"PageUp"
|
|
148
|
+
]);
|
|
149
|
+
const MODIFIER_KEYS = /* @__PURE__ */ new Set([
|
|
150
|
+
"Alt",
|
|
151
|
+
"Control",
|
|
152
|
+
"Meta",
|
|
153
|
+
"Shift"
|
|
154
|
+
]);
|
|
155
|
+
const peekLockEntries = /* @__PURE__ */ new Set();
|
|
156
|
+
const beeper = new import_beeper.Beeper();
|
|
157
|
+
class PeekLockComponent extends import_monkey_around_component.MonkeyAroundComponent {
|
|
158
|
+
/**
|
|
159
|
+
* Constructs a new instance.
|
|
160
|
+
*
|
|
161
|
+
* @param app - The app whose settings modal is guarded and whose windows suppress input while locked.
|
|
162
|
+
*/
|
|
163
|
+
constructor(app) {
|
|
164
|
+
super();
|
|
165
|
+
this.app = app;
|
|
166
|
+
}
|
|
167
|
+
app;
|
|
168
|
+
/**
|
|
169
|
+
* Registers the `open` patches and the input suppressors.
|
|
170
|
+
*/
|
|
171
|
+
onload() {
|
|
172
|
+
super.onload();
|
|
173
|
+
this.registerMethodPatch({
|
|
174
|
+
methodName: "open",
|
|
175
|
+
obj: import_obsidian.Modal.prototype,
|
|
176
|
+
patchHandler: ({ fallback, originalThis }) => {
|
|
177
|
+
blockOrFallback(originalThis, fallback);
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
this.registerMethodPatch({
|
|
181
|
+
methodName: "open",
|
|
182
|
+
obj: this.app.setting,
|
|
183
|
+
patchHandler: ({ fallback, originalThis }) => {
|
|
184
|
+
blockOrFallback(originalThis, fallback);
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
const allWindowsEventComponent = this.addChild(new import_all_windows_event_component.AllWindowsEventComponent(this.app));
|
|
188
|
+
allWindowsEventComponent.registerAllWindowsDomEvent({
|
|
189
|
+
callback: suppressKeydownWhilePeekLocked,
|
|
190
|
+
options: { capture: true },
|
|
191
|
+
type: "keydown"
|
|
192
|
+
});
|
|
193
|
+
allWindowsEventComponent.registerAllWindowsDomEvent({
|
|
194
|
+
callback: suppressWhilePeekLocked,
|
|
195
|
+
options: { capture: true },
|
|
196
|
+
type: "beforeinput"
|
|
197
|
+
});
|
|
198
|
+
allWindowsEventComponent.registerAllWindowsDomEvent({
|
|
199
|
+
callback: suppressWhilePeekLocked,
|
|
200
|
+
options: { capture: true },
|
|
201
|
+
type: "contextmenu"
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
}
|
|
137
205
|
class MinimizableModal {
|
|
138
206
|
/**
|
|
139
207
|
* The wrapped modal. Open, close, and populate it as usual (e.g. `minimizable.modal.open()`).
|
|
@@ -147,9 +215,15 @@ class MinimizableModal {
|
|
|
147
215
|
get isMinimized() {
|
|
148
216
|
return this.isMinimizedValue;
|
|
149
217
|
}
|
|
218
|
+
// Patches the wrapped modal's `onClose` to run cleanup. Persists for the wrapper's whole life (a
|
|
219
|
+
// Modal can be reopened, so the patch must survive each close), hence a dedicated component that is
|
|
220
|
+
// Never unloaded — distinct from `peekLockComponent`, whose patches live only while minimized.
|
|
221
|
+
closePatchComponent = new import_monkey_around_component.MonkeyAroundComponent();
|
|
150
222
|
isMinimizedValue = false;
|
|
151
223
|
minimizeButtonEl;
|
|
152
224
|
minimizedBarEl = null;
|
|
225
|
+
peekLockComponent = null;
|
|
226
|
+
peekLockEntry = null;
|
|
153
227
|
/**
|
|
154
228
|
* Wraps the given modal, adding a minimize button and wiring up cleanup on close.
|
|
155
229
|
*
|
|
@@ -159,11 +233,12 @@ class MinimizableModal {
|
|
|
159
233
|
this.modal = modal;
|
|
160
234
|
(0, import_plugin_context.addPluginCssClasses)(modal.containerEl, [import_css_class.CssClass.MinimizableModal]);
|
|
161
235
|
this.minimizeButtonEl = this.createMinimizeButton();
|
|
236
|
+
this.closePatchComponent.load();
|
|
162
237
|
this.patchOnClose(modal);
|
|
163
238
|
}
|
|
164
239
|
/**
|
|
165
|
-
* Minimizes the modal: hides the modal and its backdrop
|
|
166
|
-
*
|
|
240
|
+
* Minimizes the modal: hides the modal and its backdrop, shows a floating bar with a restore button,
|
|
241
|
+
* and puts the app into the peek-only lock. A no-op if the modal is already minimized.
|
|
167
242
|
*/
|
|
168
243
|
minimize() {
|
|
169
244
|
if (this.isMinimizedValue) {
|
|
@@ -174,16 +249,18 @@ class MinimizableModal {
|
|
|
174
249
|
this.modal.containerEl.hide();
|
|
175
250
|
this.modal.app.keymap.popScope(this.modal.scope);
|
|
176
251
|
this.minimizedBarEl = this.createMinimizedBar();
|
|
252
|
+
this.enablePeekLock(this.minimizedBarEl);
|
|
177
253
|
}
|
|
178
254
|
/**
|
|
179
|
-
* Restores the modal from the minimized state, removing the floating bar
|
|
180
|
-
* not minimized.
|
|
255
|
+
* Restores the modal from the minimized state, removing the floating bar and lifting the peek-only
|
|
256
|
+
* lock. A no-op if the modal is not minimized.
|
|
181
257
|
*/
|
|
182
258
|
restore() {
|
|
183
259
|
if (!this.isMinimizedValue) {
|
|
184
260
|
return;
|
|
185
261
|
}
|
|
186
262
|
this.isMinimizedValue = false;
|
|
263
|
+
this.disablePeekLock();
|
|
187
264
|
this.removeMinimizedBar();
|
|
188
265
|
this.modal.app.keymap.pushScope(this.modal.scope);
|
|
189
266
|
this.modal.containerEl.show();
|
|
@@ -209,19 +286,49 @@ class MinimizableModal {
|
|
|
209
286
|
barEl.addEventListener("click", () => {
|
|
210
287
|
this.restore();
|
|
211
288
|
});
|
|
289
|
+
barEl.addEventListener("animationend", () => {
|
|
290
|
+
barEl.removeClass(import_css_class.CssClass.MinimizedModalBarAttention);
|
|
291
|
+
});
|
|
212
292
|
return barEl;
|
|
213
293
|
}
|
|
294
|
+
disablePeekLock() {
|
|
295
|
+
if (!this.peekLockEntry) {
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
peekLockEntries.delete(this.peekLockEntry);
|
|
299
|
+
this.peekLockEntry = null;
|
|
300
|
+
this.peekLockComponent?.unload();
|
|
301
|
+
this.peekLockComponent = null;
|
|
302
|
+
}
|
|
303
|
+
enablePeekLock(barEl) {
|
|
304
|
+
this.peekLockEntry = {
|
|
305
|
+
barEl,
|
|
306
|
+
flash: () => {
|
|
307
|
+
this.flashBar(barEl);
|
|
308
|
+
},
|
|
309
|
+
innerModal: this.modal
|
|
310
|
+
};
|
|
311
|
+
peekLockEntries.add(this.peekLockEntry);
|
|
312
|
+
this.peekLockComponent = new PeekLockComponent(this.modal.app);
|
|
313
|
+
this.peekLockComponent.load();
|
|
314
|
+
}
|
|
315
|
+
flashBar(barEl) {
|
|
316
|
+
barEl.removeClass(import_css_class.CssClass.MinimizedModalBarAttention);
|
|
317
|
+
barEl.getBoundingClientRect();
|
|
318
|
+
barEl.addClass(import_css_class.CssClass.MinimizedModalBarAttention);
|
|
319
|
+
}
|
|
214
320
|
handleClose() {
|
|
321
|
+
this.disablePeekLock();
|
|
215
322
|
this.removeMinimizedBar();
|
|
216
323
|
this.isMinimizedValue = false;
|
|
217
324
|
}
|
|
218
325
|
patchOnClose(modal) {
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
326
|
+
this.closePatchComponent.registerMethodPatch({
|
|
327
|
+
methodName: "onClose",
|
|
328
|
+
obj: modal,
|
|
329
|
+
patchHandler: ({ fallback }) => {
|
|
330
|
+
fallback();
|
|
331
|
+
this.handleClose();
|
|
225
332
|
}
|
|
226
333
|
});
|
|
227
334
|
}
|
|
@@ -230,8 +337,66 @@ class MinimizableModal {
|
|
|
230
337
|
this.minimizedBarEl = null;
|
|
231
338
|
}
|
|
232
339
|
}
|
|
340
|
+
function blockEvent(evt) {
|
|
341
|
+
evt.preventDefault();
|
|
342
|
+
evt.stopImmediatePropagation();
|
|
343
|
+
signalBlockedAttempt();
|
|
344
|
+
}
|
|
345
|
+
function blockOrFallback(modal, fallback) {
|
|
346
|
+
if (shouldBlockOpen(modal)) {
|
|
347
|
+
signalBlockedAttempt();
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
fallback();
|
|
351
|
+
}
|
|
352
|
+
function flashMinimizedBars() {
|
|
353
|
+
for (const entry of peekLockEntries) {
|
|
354
|
+
entry.flash();
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
function isMinimizedInnerModal(modal) {
|
|
358
|
+
for (const entry of peekLockEntries) {
|
|
359
|
+
if (entry.innerModal === modal) {
|
|
360
|
+
return true;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
return false;
|
|
364
|
+
}
|
|
365
|
+
function isPeekAllowedKey(evt) {
|
|
366
|
+
if (NAVIGATION_KEYS.has(evt.key)) {
|
|
367
|
+
return !evt.shiftKey;
|
|
368
|
+
}
|
|
369
|
+
return MODIFIER_KEYS.has(evt.key);
|
|
370
|
+
}
|
|
371
|
+
function isPeekLocked() {
|
|
372
|
+
for (const entry of peekLockEntries) {
|
|
373
|
+
if (!entry.barEl.isConnected) {
|
|
374
|
+
peekLockEntries.delete(entry);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
return peekLockEntries.size > 0;
|
|
378
|
+
}
|
|
379
|
+
function shouldBlockOpen(modal) {
|
|
380
|
+
return isPeekLocked() && !isMinimizedInnerModal(modal);
|
|
381
|
+
}
|
|
382
|
+
function signalBlockedAttempt() {
|
|
383
|
+
flashMinimizedBars();
|
|
384
|
+
beeper.beep();
|
|
385
|
+
}
|
|
386
|
+
function suppressKeydownWhilePeekLocked(evt) {
|
|
387
|
+
if (!isPeekLocked() || isPeekAllowedKey(evt)) {
|
|
388
|
+
return;
|
|
389
|
+
}
|
|
390
|
+
blockEvent(evt);
|
|
391
|
+
}
|
|
392
|
+
function suppressWhilePeekLocked(evt) {
|
|
393
|
+
if (!isPeekLocked()) {
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
396
|
+
blockEvent(evt);
|
|
397
|
+
}
|
|
233
398
|
// Annotate the CommonJS export names for ESM import in node:
|
|
234
399
|
0 && (module.exports = {
|
|
235
400
|
MinimizableModal
|
|
236
401
|
});
|
|
237
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL21vZGFscy9taW5pbWl6YWJsZS1tb2RhbC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEEgd3JhcHBlciB0aGF0IG1ha2VzIGFueSBPYnNpZGlhbiB7QGxpbmsgTW9kYWx9IG1pbmltaXphYmxlLlxuICpcbiAqIE9ic2lkaWFuJ3Mge0BsaW5rIE1vZGFsfSBpcyBibG9ja2luZyBcdTIwMTQgd2hpbGUgaXQgaXMgb3BlbiB0aGUgcmVzdCBvZiB0aGUgYXBwIGlzIGRpbW1lZCBhbmRcbiAqIGluZXJ0IFx1MjAxNCBhbmQgaXQgY2Fubm90IGJlIG1pbmltaXplZC4ge0BsaW5rIE1pbmltaXphYmxlTW9kYWx9IHdyYXBzIGFueSBtb2RhbCBpbnN0YW5jZSAocGxhaW5cbiAqIGBNb2RhbGAsIGBGdXp6eVN1Z2dlc3RNb2RhbGAsIHRoZSBsaWJyYXJ5J3MgYE1vZGFsQmFzZWAsIHlvdXIgb3duIHN1YmNsYXNzLCBcdTIwMjYgXHUyMDE0IGluY2x1ZGluZyBtb2RhbHNcbiAqIHlvdSBkbyBub3Qgb3duKSBhbmQgYWRkcyBhIG1pbmltaXplIGJ1dHRvbjogd2hlbiBtaW5pbWl6ZWQsIHRoZSBtb2RhbCAoYW5kIGl0cyBibG9ja2luZyBiYWNrZHJvcClcbiAqIGlzIGhpZGRlbiBhbmQgYSBzbWFsbCBmbG9hdGluZyBiYXIgd2l0aCBhIHJlc3RvcmUgYnV0dG9uIGlzIHNob3duIGluc3RlYWQsIHNvIHRoZSBhcHAgc3RheXMgZnVsbHlcbiAqIHVzYWJsZSB3aGlsZSBhIGxvbmctcnVubmluZyBvcGVyYXRpb24gY29udGludWVzIGluIHRoZSBiYWNrZ3JvdW5kLlxuICpcbiAqIFRoZSB3cmFwcGVyIHJldXNlcyB0aGUgbW9kYWwncyBvd24gdGl0bGUgKGB0aXRsZUVsYCkgYXMgdGhlIG1pbmltaXplZCBiYXIgbGFiZWwsIHNvIHNldCB0aGUgdGl0bGVcbiAqIHRoZSB1c3VhbCB3YXkgKGBtb2RhbC5zZXRUaXRsZSguLi4pYCkuIFJlbmRlciBhcmJpdHJhcnkgY29udGVudCBpbnRvIHtAbGluayBNb2RhbC5jb250ZW50RWx9LFxuICogaW5jbHVkaW5nIGNsaWNrYWJsZSBub3RlIGxpbmtzIHByb2R1Y2VkIGJ5IGByZW5kZXJJbnRlcm5hbExpbmtgIGZyb21cbiAqIGBvYnNpZGlhbi1kZXYtdXRpbHMvb2JzaWRpYW4vbWFya2Rvd25gOlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBtb2RhbCA9IG5ldyBNeU1vZGFsKGFwcCk7XG4gKiBtb2RhbC5zZXRUaXRsZSgnTWVyZ2luZyBub3RlcycpO1xuICogbW9kYWwuY29udGVudEVsLmFwcGVuZENoaWxkKGF3YWl0IHJlbmRlckludGVybmFsTGluayh7IGFwcCwgcGF0aE9yQWJzdHJhY3RGaWxlOiBmaWxlIH0pKTtcbiAqXG4gKiBjb25zdCBtaW5pbWl6YWJsZSA9IG5ldyBNaW5pbWl6YWJsZU1vZGFsKG1vZGFsKTtcbiAqIG1pbmltaXphYmxlLm1vZGFsLm9wZW4oKTtcbiAqIG1pbmltaXphYmxlLm1pbmltaXplKCk7IC8vIGFwcCBpcyB1c2FibGUgYWdhaW47IGEgZmxvYXRpbmcgYmFyIG9mZmVycyBcInJlc3RvcmVcIlxuICogYGBgXG4gKlxuICogVGhlIHdyYXBwZWQgbW9kYWwgY2FuIHN0aWxsIGJlIGNsb3NlZCBub3JtYWxseTsgdGhlIGZsb2F0aW5nIGJhciBpcyBjbGVhbmVkIHVwIGF1dG9tYXRpY2FsbHkgd2hlblxuICogdGhlIG1vZGFsIGNsb3NlcyAoZXZlbiBpZiBpdCBpcyBjbG9zZWQgd2hpbGUgbWluaW1pemVkKS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE1vZGFsIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBhcm91bmQgfSBmcm9tICdtb25rZXktYXJvdW5kJztcbmltcG9ydCB7IHNldEljb24gfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi4vY3NzLWNsYXNzLnRzJztcbmltcG9ydCB7IGFkZFBsdWdpbkNzc0NsYXNzZXMgfSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWNvbnRleHQudHMnO1xuXG5jb25zdCBNSU5JTUlaRV9JQ09OX0lEID0gJ21pbnVzJztcbmNvbnN0IFJFU1RPUkVfSUNPTl9JRCA9ICdtYXhpbWl6ZS0yJztcblxuLyoqXG4gKiBXcmFwcyBhIHtAbGluayBNb2RhbH0gaW5zdGFuY2UgdG8gbWFrZSBpdCBtaW5pbWl6YWJsZSB0byBhIHNtYWxsIGZsb2F0aW5nIGJhciBhbmQgcmVzdG9yYWJsZSxcbiAqIGtlZXBpbmcgdGhlIGFwcCB1c2FibGUgd2hpbGUgbWluaW1pemVkLlxuICpcbiAqIEB0eXBlUGFyYW0gVE1vZGFsIC0gVGhlIHR5cGUgb2YgdGhlIHdyYXBwZWQgbW9kYWwuXG4gKi9cbmV4cG9ydCBjbGFzcyBNaW5pbWl6YWJsZU1vZGFsPFRNb2RhbCBleHRlbmRzIE1vZGFsPiB7XG4gIC8qKlxuICAgKiBUaGUgd3JhcHBlZCBtb2RhbC4gT3BlbiwgY2xvc2UsIGFuZCBwb3B1bGF0ZSBpdCBhcyB1c3VhbCAoZS5nLiBgbWluaW1pemFibGUubW9kYWwub3BlbigpYCkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbW9kYWw6IFRNb2RhbDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbW9kYWwgaXMgY3VycmVudGx5IG1pbmltaXplZC5cbiAgICpcbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBtb2RhbCBpcyBjdXJyZW50bHkgbWluaW1pemVkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNNaW5pbWl6ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNNaW5pbWl6ZWRWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgaXNNaW5pbWl6ZWRWYWx1ZSA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IG1pbmltaXplQnV0dG9uRWw6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIG1pbmltaXplZEJhckVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBXcmFwcyB0aGUgZ2l2ZW4gbW9kYWwsIGFkZGluZyBhIG1pbmltaXplIGJ1dHRvbiBhbmQgd2lyaW5nIHVwIGNsZWFudXAgb24gY2xvc2UuXG4gICAqXG4gICAqIEBwYXJhbSBtb2RhbCAtIFRoZSBtb2RhbCBpbnN0YW5jZSB0byBtYWtlIG1pbmltaXphYmxlLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKG1vZGFsOiBUTW9kYWwpIHtcbiAgICB0aGlzLm1vZGFsID0gbW9kYWw7XG4gICAgYWRkUGx1Z2luQ3NzQ2xhc3Nlcyhtb2RhbC5jb250YWluZXJFbCwgW0Nzc0NsYXNzLk1pbmltaXphYmxlTW9kYWxdKTtcbiAgICB0aGlzLm1pbmltaXplQnV0dG9uRWwgPSB0aGlzLmNyZWF0ZU1pbmltaXplQnV0dG9uKCk7XG4gICAgdGhpcy5wYXRjaE9uQ2xvc2UobW9kYWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1pbmltaXplcyB0aGUgbW9kYWw6IGhpZGVzIHRoZSBtb2RhbCBhbmQgaXRzIGJhY2tkcm9wIGFuZCBzaG93cyBhIGZsb2F0aW5nIGJhciB3aXRoIGEgcmVzdG9yZVxuICAgKiBidXR0b24uIEEgbm8tb3AgaWYgdGhlIG1vZGFsIGlzIGFscmVhZHkgbWluaW1pemVkLlxuICAgKi9cbiAgcHVibGljIG1pbmltaXplKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzTWluaW1pemVkVmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzTWluaW1pemVkVmFsdWUgPSB0cnVlO1xuICAgIHRoaXMubWluaW1pemVCdXR0b25FbC5oaWRlKCk7XG4gICAgdGhpcy5tb2RhbC5jb250YWluZXJFbC5oaWRlKCk7XG4gICAgLy8gVGhlIG1vZGFsIHN0YXlzIG9wZW4gd2hpbGUgbWluaW1pemVkLCBzbyBpdHMga2V5bWFwIHNjb3BlIHdvdWxkIG90aGVyd2lzZSBzdGF5IGFjdGl2ZS5cbiAgICAvLyBPYnNpZGlhbidzIGZvY3VzIHRyYXAgdGhlbiBzdGVhbHMgZm9jdXMgYmFjayB0byB0aGUgaGlkZGVuIG1vZGFsLCBzbyB0aGUgZWRpdG9yIGNhbm5vdCB0eXBlLlxuICAgIC8vIFBvcHBpbmcgdGhlIHNjb3BlIHJlbGVhc2VzIHRoZSB0cmFwIGFuZCB0aGUgYEVzY2FwZWAgY2FwdHVyZTsgYHJlc3RvcmUoKWAgcmUtcHVzaGVzIGl0LlxuICAgIHRoaXMubW9kYWwuYXBwLmtleW1hcC5wb3BTY29wZSh0aGlzLm1vZGFsLnNjb3BlKTtcbiAgICB0aGlzLm1pbmltaXplZEJhckVsID0gdGhpcy5jcmVhdGVNaW5pbWl6ZWRCYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlcyB0aGUgbW9kYWwgZnJvbSB0aGUgbWluaW1pemVkIHN0YXRlLCByZW1vdmluZyB0aGUgZmxvYXRpbmcgYmFyLiBBIG5vLW9wIGlmIHRoZSBtb2RhbCBpc1xuICAgKiBub3QgbWluaW1pemVkLlxuICAgKi9cbiAgcHVibGljIHJlc3RvcmUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzTWluaW1pemVkVmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzTWluaW1pemVkVmFsdWUgPSBmYWxzZTtcbiAgICB0aGlzLnJlbW92ZU1pbmltaXplZEJhcigpO1xuICAgIC8vIFJlLXB1c2ggdGhlIHNjb3BlIHBvcHBlZCBpbiBtaW5pbWl6ZSgpIHNvIHRoZSByZXN0b3JlZCBtb2RhbCBibG9ja3MgdGhlIGFwcCBhZ2FpbiAoZm9jdXMgdHJhcFxuICAgIC8vICsgRXNjYXBlIGNhcHR1cmUpLlxuICAgIHRoaXMubW9kYWwuYXBwLmtleW1hcC5wdXNoU2NvcGUodGhpcy5tb2RhbC5zY29wZSk7XG4gICAgdGhpcy5tb2RhbC5jb250YWluZXJFbC5zaG93KCk7XG4gICAgdGhpcy5taW5pbWl6ZUJ1dHRvbkVsLnNob3coKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTWluaW1pemVCdXR0b24oKTogSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0IGJ1dHRvbkVsID0gdGhpcy5tb2RhbC5tb2RhbEVsLmNyZWF0ZUVsKCdidXR0b24nLCB7IGNsczogQ3NzQ2xhc3MuTWluaW1pemVCdXR0b24gfSk7XG4gICAgc2V0SWNvbihidXR0b25FbCwgTUlOSU1JWkVfSUNPTl9JRCk7XG4gICAgYnV0dG9uRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICB0aGlzLm1pbmltaXplKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGJ1dHRvbkVsO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVNaW5pbWl6ZWRCYXIoKTogSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0IGJhckVsID0gdGhpcy5tb2RhbC5jb250YWluZXJFbC5vd25lckRvY3VtZW50LmJvZHkuY3JlYXRlRGl2KCk7XG4gICAgYWRkUGx1Z2luQ3NzQ2xhc3NlcyhiYXJFbCwgW0Nzc0NsYXNzLk1pbmltaXplZE1vZGFsQmFyXSk7XG4gICAgYmFyRWwuY3JlYXRlU3Bhbih7XG4gICAgICBjbHM6IENzc0NsYXNzLk1pbmltaXplZE1vZGFsQmFyVGl0bGUsXG4gICAgICB0ZXh0OiB0aGlzLm1vZGFsLnRpdGxlRWwudGV4dENvbnRlbnRcbiAgICB9KTtcbiAgICBjb25zdCByZXN0b3JlQnV0dG9uRWwgPSBiYXJFbC5jcmVhdGVFbCgnYnV0dG9uJywgeyBjbHM6IENzc0NsYXNzLlJlc3RvcmVCdXR0b24gfSk7XG4gICAgc2V0SWNvbihyZXN0b3JlQnV0dG9uRWwsIFJFU1RPUkVfSUNPTl9JRCk7XG4gICAgLy8gVGhlIHdob2xlIGJhciByZXN0b3JlcyBvbiBjbGljaywgbm90IGp1c3QgdGhlIHJlc3RvcmUgYnV0dG9uIFx1MjAxNCBhIGxhcmdlciwgZWFzaWVyIGNsaWNrIHRhcmdldC5cbiAgICAvLyBgcmVzdG9yZSgpYCBndWFyZHMgYWdhaW5zdCBhIGRvdWJsZSBpbnZvY2F0aW9uLCBzbyB0aGUgcmVzdG9yZSBidXR0b24ncyBvd24gY2xpY2sgYnViYmxpbmcgdXBcbiAgICAvLyBIZXJlIGlzIGEgbm8tb3AuIFRoZSByZXN0b3JlIGJ1dHRvbiBzdGF5cyBwdXJlbHkgYXMgYSB2aXN1YWwgYWZmb3JkYW5jZSBmb3IgdGhlIGNsaWNrIHRhcmdldC5cbiAgICBiYXJFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHRoaXMucmVzdG9yZSgpO1xuICAgIH0pO1xuICAgIHJldHVybiBiYXJFbDtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVNaW5pbWl6ZWRCYXIoKTtcbiAgICB0aGlzLmlzTWluaW1pemVkVmFsdWUgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgcGF0Y2hPbkNsb3NlKG1vZGFsOiBNb2RhbCk6IHZvaWQge1xuICAgIGFyb3VuZChtb2RhbCwge1xuICAgICAgb25DbG9zZTogKG5leHQ6ICgpID0+IHZvaWQpOiAoKSA9PiB2b2lkID0+IHtcbiAgICAgICAgcmV0dXJuICgpOiB2b2lkID0+IHtcbiAgICAgICAgICBuZXh0LmNhbGwobW9kYWwpO1xuICAgICAgICAgIHRoaXMuaGFuZGxlQ2xvc2UoKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlTWluaW1pemVkQmFyKCk6IHZvaWQge1xuICAgIHRoaXMubWluaW1pemVkQmFyRWw/LnJlbW92ZSgpO1xuICAgIHRoaXMubWluaW1pemVkQmFyRWwgPSBudWxsO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFpQ0EsMkJBQXVCO0FBQ3ZCLHNCQUF3QjtBQUV4Qix1QkFBeUI7QUFDekIsNEJBQW9DO0FBRXBDLE1BQU0sbUJBQW1CO0FBQ3pCLE1BQU0sa0JBQWtCO0FBUWpCLE1BQU0saUJBQXVDO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPaEIsSUFBVyxjQUF1QjtBQUNoQyxXQUFPLEtBQUs7QUFBQSxFQUNkO0FBQUEsRUFFUSxtQkFBbUI7QUFBQSxFQUNWO0FBQUEsRUFDVCxpQkFBcUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPdEMsWUFBWSxPQUFlO0FBQ2hDLFNBQUssUUFBUTtBQUNiLG1EQUFvQixNQUFNLGFBQWEsQ0FBQywwQkFBUyxnQkFBZ0IsQ0FBQztBQUNsRSxTQUFLLG1CQUFtQixLQUFLLHFCQUFxQjtBQUNsRCxTQUFLLGFBQWEsS0FBSztBQUFBLEVBQ3pCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLFdBQWlCO0FBQ3RCLFFBQUksS0FBSyxrQkFBa0I7QUFDekI7QUFBQSxJQUNGO0FBRUEsU0FBSyxtQkFBbUI7QUFDeEIsU0FBSyxpQkFBaUIsS0FBSztBQUMzQixTQUFLLE1BQU0sWUFBWSxLQUFLO0FBSTVCLFNBQUssTUFBTSxJQUFJLE9BQU8sU0FBUyxLQUFLLE1BQU0sS0FBSztBQUMvQyxTQUFLLGlCQUFpQixLQUFLLG1CQUFtQjtBQUFBLEVBQ2hEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLFVBQWdCO0FBQ3JCLFFBQUksQ0FBQyxLQUFLLGtCQUFrQjtBQUMxQjtBQUFBLElBQ0Y7QUFFQSxTQUFLLG1CQUFtQjtBQUN4QixTQUFLLG1CQUFtQjtBQUd4QixTQUFLLE1BQU0sSUFBSSxPQUFPLFVBQVUsS0FBSyxNQUFNLEtBQUs7QUFDaEQsU0FBSyxNQUFNLFlBQVksS0FBSztBQUM1QixTQUFLLGlCQUFpQixLQUFLO0FBQUEsRUFDN0I7QUFBQSxFQUVRLHVCQUFvQztBQUMxQyxVQUFNLFdBQVcsS0FBSyxNQUFNLFFBQVEsU0FBUyxVQUFVLEVBQUUsS0FBSywwQkFBUyxlQUFlLENBQUM7QUFDdkYsaUNBQVEsVUFBVSxnQkFBZ0I7QUFDbEMsYUFBUyxpQkFBaUIsU0FBUyxNQUFNO0FBQ3ZDLFdBQUssU0FBUztBQUFBLElBQ2hCLENBQUM7QUFDRCxXQUFPO0FBQUEsRUFDVDtBQUFBLEVBRVEscUJBQWtDO0FBQ3hDLFVBQU0sUUFBUSxLQUFLLE1BQU0sWUFBWSxjQUFjLEtBQUssVUFBVTtBQUNsRSxtREFBb0IsT0FBTyxDQUFDLDBCQUFTLGlCQUFpQixDQUFDO0FBQ3ZELFVBQU0sV0FBVztBQUFBLE1BQ2YsS0FBSywwQkFBUztBQUFBLE1BQ2QsTUFBTSxLQUFLLE1BQU0sUUFBUTtBQUFBLElBQzNCLENBQUM7QUFDRCxVQUFNLGtCQUFrQixNQUFNLFNBQVMsVUFBVSxFQUFFLEtBQUssMEJBQVMsY0FBYyxDQUFDO0FBQ2hGLGlDQUFRLGlCQUFpQixlQUFlO0FBSXhDLFVBQU0saUJBQWlCLFNBQVMsTUFBTTtBQUNwQyxXQUFLLFFBQVE7QUFBQSxJQUNmLENBQUM7QUFDRCxXQUFPO0FBQUEsRUFDVDtBQUFBLEVBRVEsY0FBb0I7QUFDMUIsU0FBSyxtQkFBbUI7QUFDeEIsU0FBSyxtQkFBbUI7QUFBQSxFQUMxQjtBQUFBLEVBRVEsYUFBYSxPQUFvQjtBQUN2QyxxQ0FBTyxPQUFPO0FBQUEsTUFDWixTQUFTLENBQUMsU0FBaUM7QUFDekMsZUFBTyxNQUFZO0FBQ2pCLGVBQUssS0FBSyxLQUFLO0FBQ2YsZUFBSyxZQUFZO0FBQUEsUUFDbkI7QUFBQSxNQUNGO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSDtBQUFBLEVBRVEscUJBQTJCO0FBQ2pDLFNBQUssZ0JBQWdCLE9BQU87QUFDNUIsU0FBSyxpQkFBaUI7QUFBQSxFQUN4QjtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
402
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL21vZGFscy9taW5pbWl6YWJsZS1tb2RhbC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEEgd3JhcHBlciB0aGF0IG1ha2VzIGFueSBPYnNpZGlhbiB7QGxpbmsgTW9kYWx9IG1pbmltaXphYmxlIHRvIGEgZmxvYXRpbmcgYmFyIFx1MjAxNCB3aXRob3V0IGJyZWFraW5nIHRoZVxuICogbW9kYWwncyBibG9ja2luZyBjb250cmFjdC5cbiAqXG4gKiBPYnNpZGlhbidzIHtAbGluayBNb2RhbH0gaXMgYmxvY2tpbmc6IHdoaWxlIGl0IGlzIG9wZW4gdGhlIHJlc3Qgb2YgdGhlIGFwcCBpcyBtZWFudCB0byBiZSBpbmVydCB1bnRpbFxuICogdGhlIG1vZGFsIGlzIGRpc21pc3NlZC4ge0BsaW5rIE1pbmltaXphYmxlTW9kYWx9IHdyYXBzIGFueSBtb2RhbCBpbnN0YW5jZSAocGxhaW4gYE1vZGFsYCxcbiAqIGBGdXp6eVN1Z2dlc3RNb2RhbGAsIHRoZSBsaWJyYXJ5J3MgYE1vZGFsQmFzZWAsIHlvdXIgb3duIHN1YmNsYXNzLCBcdTIwMjYgXHUyMDE0IGluY2x1ZGluZyBtb2RhbHMgeW91IGRvIG5vdFxuICogb3duKSBhbmQgYWRkcyBhIG1pbmltaXplIGJ1dHRvbi4gTWluaW1pemluZyBoaWRlcyB0aGUgbW9kYWwgYW5kIGl0cyBibG9ja2luZyBiYWNrZHJvcCBhbmQgc2hvd3MgYVxuICogc21hbGwgZmxvYXRpbmcgYmFyIHdpdGggYSByZXN0b3JlIGJ1dHRvbiwgc28gdGhlIHVzZXIgY2FuIHBlZWsgYXQgdGhlIG5vdGVzL2ZvbGRlcnMgdGhlIG9wZXJhdGlvblxuICogaW52b2x2ZXMgXHUyMDE0IGJ1dCB0aGUgbW9kYWwgaXMgTk9UIGRpc21pc3NlZCwgc28gaXRzIGJsb2NraW5nIGNvbnRyYWN0IG11c3QgYmUgcHJlc2VydmVkLlxuICpcbiAqIFRvIGtlZXAgdGhhdCBjb250cmFjdCB3aGlsZSBtaW5pbWl6ZWQsIHRoZSB3cmFwcGVyIHB1dHMgdGhlIGFwcCBpbnRvIGEgKipwZWVrLW9ubHkgbG9jayoqOiB0aGUgdXNlclxuICogbWF5IG1vdXNlLWNsaWNrIGFuZCBzY3JvbGwgdG8gaW5zcGVjdCBjb250ZW50LCBidXQgY2Fubm90IHN0YXJ0IGFueXRoaW5nIG5ldy4gV2hpbGUgYW55IG1vZGFsIGlzXG4gKiBtaW5pbWl6ZWQgdGhlIHdyYXBwZXI6XG4gKiAtIGJsb2NrcyB0aGUga2V5Ym9hcmQgKHR5cGluZywgaG90a2V5cywgdGhlIGNvbW1hbmQtcGFsZXR0ZSBzaG9ydGN1dCksXG4gKiAtIGJsb2NrcyB0aGUgcmlnaHQtY2xpY2sgY29udGV4dCBtZW51LCBhbmRcbiAqIC0gYmxvY2tzIG9wZW5pbmcgYW55IG90aGVyIG1vZGFsIChhIHJlLWZpcmVkIGNvbW1hbmQsIHRoZSBjb21tYW5kIHBhbGV0dGUsIHNldHRpbmdzLCBcdTIwMjYpLlxuICpcbiAqIEEgYmxvY2tlZCBhdHRlbXB0IGZsYXNoZXMgdGhlIGZsb2F0aW5nIGJhciBhbmQgYmVlcHMgc28gdGhlIHVzZXIgc2VlcyAoYW5kIGhlYXJzKSB3aHkgbm90aGluZ1xuICogaGFwcGVuZWQuIFJlc3RvcmluZyAob3IgdGhlIG1vZGFsIGNsb3NpbmcpIGxpZnRzIHRoZSBsb2NrLiBUaGlzIHByZXZlbnRzLCBmb3IgZXhhbXBsZSwgbWluaW1pemluZyBhXG4gKiBcIm1lcmdlIGZvbGRlclwiIHBpY2tlciBhbmQgdGhlbiBmaXJpbmcgdGhlIHNhbWUgY29tbWFuZCBhZ2FpbiB0byBzdGFjayBzZXZlcmFsIGNvbmN1cnJlbnQgbWVyZ2VzLlxuICpcbiAqIFRoZSB3cmFwcGVyIHJldXNlcyB0aGUgbW9kYWwncyBvd24gdGl0bGUgKGB0aXRsZUVsYCkgYXMgdGhlIG1pbmltaXplZCBiYXIgbGFiZWwsIHNvIHNldCB0aGUgdGl0bGVcbiAqIHRoZSB1c3VhbCB3YXkgKGBtb2RhbC5zZXRUaXRsZSguLi4pYCkuIFJlbmRlciBhcmJpdHJhcnkgY29udGVudCBpbnRvIHtAbGluayBNb2RhbC5jb250ZW50RWx9LFxuICogaW5jbHVkaW5nIGNsaWNrYWJsZSBub3RlIGxpbmtzIHByb2R1Y2VkIGJ5IGByZW5kZXJJbnRlcm5hbExpbmtgIGZyb21cbiAqIGBvYnNpZGlhbi1kZXYtdXRpbHMvb2JzaWRpYW4vbWFya2Rvd25gOlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBtb2RhbCA9IG5ldyBNeU1vZGFsKGFwcCk7XG4gKiBtb2RhbC5zZXRUaXRsZSgnTWVyZ2luZyBub3RlcycpO1xuICogbW9kYWwuY29udGVudEVsLmFwcGVuZENoaWxkKGF3YWl0IHJlbmRlckludGVybmFsTGluayh7IGFwcCwgcGF0aE9yQWJzdHJhY3RGaWxlOiBmaWxlIH0pKTtcbiAqXG4gKiBjb25zdCBtaW5pbWl6YWJsZSA9IG5ldyBNaW5pbWl6YWJsZU1vZGFsKG1vZGFsKTtcbiAqIG1pbmltaXphYmxlLm1vZGFsLm9wZW4oKTtcbiAqIG1pbmltaXphYmxlLm1pbmltaXplKCk7IC8vIGEgZmxvYXRpbmcgYmFyIG9mZmVycyBcInJlc3RvcmVcIjsgdGhlIGFwcCBpcyBwZWVrLW9ubHkgdW50aWwgcmVzdG9yZWRcbiAqIGBgYFxuICpcbiAqIFRoZSB3cmFwcGVkIG1vZGFsIGNhbiBzdGlsbCBiZSBjbG9zZWQgbm9ybWFsbHk7IHRoZSBmbG9hdGluZyBiYXIgaXMgY2xlYW5lZCB1cCBhdXRvbWF0aWNhbGx5IHdoZW5cbiAqIHRoZSBtb2RhbCBjbG9zZXMgKGV2ZW4gaWYgaXQgaXMgY2xvc2VkIHdoaWxlIG1pbmltaXplZCkuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7XG4gIE1vZGFsLFxuICBzZXRJY29uXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgQmVlcGVyIH0gZnJvbSAnLi4vLi4vYmVlcGVyLnRzJztcbmltcG9ydCB7IEFsbFdpbmRvd3NFdmVudENvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvYWxsLXdpbmRvd3MtZXZlbnQtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IE1vbmtleUFyb3VuZENvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvbW9ua2V5LWFyb3VuZC1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgQ3NzQ2xhc3MgfSBmcm9tICcuLi9jc3MtY2xhc3MudHMnO1xuaW1wb3J0IHsgYWRkUGx1Z2luQ3NzQ2xhc3NlcyB9IGZyb20gJy4uL3BsdWdpbi9wbHVnaW4tY29udGV4dC50cyc7XG5cbmNvbnN0IE1JTklNSVpFX0lDT05fSUQgPSAnbWludXMnO1xuY29uc3QgUkVTVE9SRV9JQ09OX0lEID0gJ21heGltaXplLTInO1xuXG4vLyBOYXZpZ2F0aW9uIGtleXMgcGFzcyB0aHJvdWdoIHdoaWxlIG1pbmltaXplZCBzbyB0aGUgdXNlciBjYW4gbW92ZSB0aGUgY3Vyc29yIGFuZCBzY3JvbGwgdG8gcmVhZC5cbi8vIE5vbmUgb2YgdGhlbSBtdXRhdGUgdGhlIGRvY3VtZW50IFx1MjAxNCB0ZXh0IGNoYW5nZXMgYXJlIGNhdWdodCBzZXBhcmF0ZWx5IGJ5IHRoZSBgYmVmb3JlaW5wdXRgIGd1YXJkLlxuLy8gU2hpZnQrbmF2aWdhdGlvbiBpcyBibG9ja2VkLCB0aG91Z2gsIHNpbmNlIGl0IGV4dGVuZHMgdGhlIHNlbGVjdGlvbiB0aGF0IGluc3BlY3Rpb24gZG9lcyBub3QgbmVlZC5cbmNvbnN0IE5BVklHQVRJT05fS0VZUyA9IG5ldyBTZXQ8c3RyaW5nPihbXG4gICdBcnJvd0Rvd24nLFxuICAnQXJyb3dMZWZ0JyxcbiAgJ0Fycm93UmlnaHQnLFxuICAnQXJyb3dVcCcsXG4gICdFbmQnLFxuICAnSG9tZScsXG4gICdQYWdlRG93bicsXG4gICdQYWdlVXAnXG5dKTtcblxuLy8gQSBiYXJlIG1vZGlmaWVyIHByZXNzIGRvZXMgbm90aGluZyBvbiBpdHMgb3duLCBzbyBpdCBwYXNzZXMgdGhyb3VnaCB0aGUgbG9jay5cbi8vIFRoaXMgYXZvaWRzIGEgc3B1cmlvdXMgZmxhc2gvYmVlcCB3aGlsZSBjb21wb3NpbmcgYSBzaG9ydGN1dDsgdGhlIHNob3J0Y3V0J3MgY29tbWFuZCBrZXkgaXMgYmxvY2tlZC5cbmNvbnN0IE1PRElGSUVSX0tFWVMgPSBuZXcgU2V0PHN0cmluZz4oW1xuICAnQWx0JyxcbiAgJ0NvbnRyb2wnLFxuICAnTWV0YScsXG4gICdTaGlmdCdcbl0pO1xuXG4vKipcbiAqIEEgcmVnaXN0ZXJlZCBlbnRyeSBmb3IgYSBjdXJyZW50bHktbWluaW1pemVkIG1vZGFsLiBUaGUgc2hhcmVkIHBlZWstb25seSBsb2NrIHVzZXMgaXQgdG8ga25vdyBhXG4gKiBtb2RhbCBpcyBtaW5pbWl6ZWQsIHRvIGxlYXZlIHRoYXQgbW9kYWwncyBvd24gcmUtb3BlbnMgYWxvbmUsIGFuZCB0byBmbGFzaCBpdHMgYmFyIG9uIGEgYmxvY2tlZFxuICogYXR0ZW1wdC5cbiAqL1xuaW50ZXJmYWNlIFBlZWtMb2NrRW50cnkge1xuICAvKipcbiAgICogVGhlIGZsb2F0aW5nIGJhciBlbGVtZW50LiBVc2VkIHRvIGRldGVjdCBhIHN0YWxlIGVudHJ5IChpdHMgYmFyIGhhcyBsZWZ0IHRoZSBET00pIHNvIGl0IGNhbiBiZVxuICAgKiBwcnVuZWQgYW5kIG5ldmVyIGtlZXAgdGhlIGFwcCBsb2NrZWQuXG4gICAqL1xuICByZWFkb25seSBiYXJFbDogSFRNTEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIEZsYXNoZXMgdGhlIGZsb2F0aW5nIGJhciB0byBzaWduYWwgYSBibG9ja2VkIGF0dGVtcHQuXG4gICAqL1xuICBmbGFzaCgpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUaGUgd3JhcHBlZCBtb2RhbCBpbnN0YW5jZSwgc28gaXRzIG93biBgb3BlbigpYCBpcyBuZXZlciBibG9ja2VkIGJ5IHRoZSBsb2NrLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5uZXJNb2RhbDogTW9kYWw7XG59XG5cbmNvbnN0IHBlZWtMb2NrRW50cmllcyA9IG5ldyBTZXQ8UGVla0xvY2tFbnRyeT4oKTtcbmNvbnN0IGJlZXBlciA9IG5ldyBCZWVwZXIoKTtcblxuLyoqXG4gKiBJbnN0YWxscyB0aGUgcGVlay1vbmx5IGxvY2sncyBgb3BlbmAgcGF0Y2hlcyB3aGlsZSBhdCBsZWFzdCBvbmUgbW9kYWwgaXMgbWluaW1pemVkLiBCZWluZyBhXG4gKiB7QGxpbmsgTW9ua2V5QXJvdW5kQ29tcG9uZW50fSwgYm90aCBwYXRjaGVzIGFyZSB0b3JuIGRvd24gYXV0b21hdGljYWxseSBvbiBgdW5sb2FkYCwgc28gdGhleSBleGlzdFxuICogb25seSB3aGlsZSB0aGUgbG9jayBpcyBhY3RpdmUuIEEgbWluaW1pemVkIG1vZGFsJ3Mgb3duIHJlLW9wZW4gaXMgYWx3YXlzIGFsbG93ZWQgKHNlZVxuICoge0BsaW5rIHNob3VsZEJsb2NrT3Blbn0pOyBldmVyeSBvdGhlciBtb2RhbCBvcGVuIGlzIGJsb2NrZWQgYW5kIHNpZ25hbHMgYSBmbGFzaCArIGJlZXAuXG4gKi9cbmNsYXNzIFBlZWtMb2NrQ29tcG9uZW50IGV4dGVuZHMgTW9ua2V5QXJvdW5kQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwIHdob3NlIHNldHRpbmdzIG1vZGFsIGlzIGd1YXJkZWQgYW5kIHdob3NlIHdpbmRvd3Mgc3VwcHJlc3MgaW5wdXQgd2hpbGUgbG9ja2VkLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyB0aGUgYG9wZW5gIHBhdGNoZXMgYW5kIHRoZSBpbnB1dCBzdXBwcmVzc29ycy5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgc3VwZXIub25sb2FkKCk7XG5cbiAgICAvLyBCbG9jayBvcGVuaW5nIGFueSBPVEhFUiBtb2RhbCB3aGlsZSBhIG1vZGFsIGlzIG1pbmltaXplZCAodGhlIGNvbW1hbmQgcGFsZXR0ZSwgYSByZS1maXJlZFxuICAgIC8vIENvbW1hbmQsIGFub3RoZXIgcGx1Z2luIG1vZGFsLCBcdTIwMjYpLlxuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxNb2RhbCwgJ29wZW4nPih7XG4gICAgICBtZXRob2ROYW1lOiAnb3BlbicsXG4gICAgICBvYmo6IE1vZGFsLnByb3RvdHlwZSxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsVGhpcyB9KTogdm9pZCA9PiB7XG4gICAgICAgIGJsb2NrT3JGYWxsYmFjayhvcmlnaW5hbFRoaXMsIGZhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIE9ic2lkaWFuJ3MgU2V0dGluZ3MgaXMgYSAqcG9wb3V0KiBtb2RhbDogb24gZGVza3RvcCBpdHMgb3duIGBvcGVuKClgIGZpcnN0IGNyZWF0ZXMgYSBzZXBhcmF0ZSBPU1xuICAgIC8vIFdpbmRvdyAodmlhIGBzaG91bGRVc2VQb3BvdXQoKWAvYGdldFBvcG91dE9wdGlvbnMoKWApIGFuZCBvbmx5IFRIRU4gZGVsZWdhdGVzIHRvXG4gICAgLy8gYE1vZGFsLnByb3RvdHlwZS5vcGVuYCB0byByZW5kZXIgdGhlIGFjdGl2ZSB0YWIgaW50byBpdC4gR3VhcmRpbmcgb25seSBgTW9kYWwucHJvdG90eXBlLm9wZW5gXG4gICAgLy8gVGhlcmVmb3JlIGJsb2NrcyB0aGUgcmVuZGVyIGJ1dCBsZWF2ZXMgYW4gZW1wdHkgc2V0dGluZ3Mgd2luZG93IGJlaGluZCBcdTIwMTQgdGhlIHJlcG9ydGVkIGJhZCBVWC5cbiAgICAvLyBHdWFyZGluZyB0aGUgc2V0dGluZ3MgbW9kYWwncyBvd24gYG9wZW4oKWAgYmxvY2tzIGl0ICpiZWZvcmUqIHRoZSB3aW5kb3cgaXMgY3JlYXRlZC5cbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8QXBwWydzZXR0aW5nJ10sICdvcGVuJz4oe1xuICAgICAgbWV0aG9kTmFtZTogJ29wZW4nLFxuICAgICAgb2JqOiB0aGlzLmFwcC5zZXR0aW5nLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxUaGlzIH0pOiB2b2lkID0+IHtcbiAgICAgICAgYmxvY2tPckZhbGxiYWNrKG9yaWdpbmFsVGhpcywgZmFsbGJhY2spO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gU3VwcHJlc3MgdGhlIGtleWJvYXJkLCBlZGl0b3IgbXV0YXRpb24sIGFuZCB0aGUgY29udGV4dCBtZW51IGFjcm9zcyBBTEwgd2luZG93cyBcdTIwMTQgdGhlIG1haW4gd2luZG93XG4gICAgLy8gQW5kIGV2ZXJ5IGV4aXN0aW5nL2Z1dHVyZSBwb3BvdXQgXHUyMDE0IHNvIHRoZSBsb2NrIGhvbGRzIHdoZXJldmVyIHRoZSB1c2VyJ3MgZm9jdXMgaXMsIG5vdCBvbmx5IGluXG4gICAgLy8gVGhlIHdpbmRvdyB0aGF0IG93bnMgdGhlIG1pbmltaXplZCBtb2RhbC4gQ2FwdHVyZS1waGFzZSBsaXN0ZW5lcnMgcnVuIGJlZm9yZSBPYnNpZGlhbidzIG93blxuICAgIC8vIERvY3VtZW50L2VsZW1lbnQgaGFuZGxlcnMgKGluY2x1ZGluZyBDb2RlTWlycm9yJ3MpLCBzbyBgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClgIGluIHRoZVxuICAgIC8vIFN1cHByZXNzb3JzIGtlZXBzIGEgYmxvY2tlZCBldmVudCBmcm9tIGV2ZXIgcmVhY2hpbmcgdGhlbS4gYGtleWRvd25gIGxldHMgbmF2aWdhdGlvbiBrZXlzIHRocm91Z2hcbiAgICAvLyAoc2VlIGBpc1BlZWtBbGxvd2VkS2V5YCkgYnV0IGJsb2NrcyBjb21tYW5kIGhvdGtleXM7IGBiZWZvcmVpbnB1dGAgYmxvY2tzIGFsbCBlZGl0b3IgbXV0YXRpb247XG4gICAgLy8gYGNvbnRleHRtZW51YCBibG9ja3MgdGhlIHJpZ2h0LWNsaWNrIG1lbnUuXG4gICAgY29uc3QgYWxsV2luZG93c0V2ZW50Q29tcG9uZW50ID0gdGhpcy5hZGRDaGlsZChuZXcgQWxsV2luZG93c0V2ZW50Q29tcG9uZW50KHRoaXMuYXBwKSk7XG4gICAgYWxsV2luZG93c0V2ZW50Q29tcG9uZW50LnJlZ2lzdGVyQWxsV2luZG93c0RvbUV2ZW50KHtcbiAgICAgIGNhbGxiYWNrOiBzdXBwcmVzc0tleWRvd25XaGlsZVBlZWtMb2NrZWQsXG4gICAgICBvcHRpb25zOiB7IGNhcHR1cmU6IHRydWUgfSxcbiAgICAgIHR5cGU6ICdrZXlkb3duJ1xuICAgIH0pO1xuICAgIGFsbFdpbmRvd3NFdmVudENvbXBvbmVudC5yZWdpc3RlckFsbFdpbmRvd3NEb21FdmVudCh7XG4gICAgICBjYWxsYmFjazogc3VwcHJlc3NXaGlsZVBlZWtMb2NrZWQsXG4gICAgICBvcHRpb25zOiB7IGNhcHR1cmU6IHRydWUgfSxcbiAgICAgIHR5cGU6ICdiZWZvcmVpbnB1dCdcbiAgICB9KTtcbiAgICBhbGxXaW5kb3dzRXZlbnRDb21wb25lbnQucmVnaXN0ZXJBbGxXaW5kb3dzRG9tRXZlbnQoe1xuICAgICAgY2FsbGJhY2s6IHN1cHByZXNzV2hpbGVQZWVrTG9ja2VkLFxuICAgICAgb3B0aW9uczogeyBjYXB0dXJlOiB0cnVlIH0sXG4gICAgICB0eXBlOiAnY29udGV4dG1lbnUnXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBXcmFwcyBhIHtAbGluayBNb2RhbH0gaW5zdGFuY2UgdG8gbWFrZSBpdCBtaW5pbWl6YWJsZSB0byBhIHNtYWxsIGZsb2F0aW5nIGJhciBhbmQgcmVzdG9yYWJsZS4gV2hpbGVcbiAqIG1pbmltaXplZCB0aGUgYXBwIGlzIHB1dCBpbnRvIGEgcGVlay1vbmx5IGxvY2sgKGtleWJvYXJkLCBjb250ZXh0IG1lbnUsIGFuZCBvcGVuaW5nIG90aGVyIG1vZGFscyBhcmVcbiAqIGJsb2NrZWQpIHNvIHRoZSBtb2RhbCdzIGJsb2NraW5nIGNvbnRyYWN0IGlzIHByZXNlcnZlZC5cbiAqXG4gKiBAdHlwZVBhcmFtIFRNb2RhbCAtIFRoZSB0eXBlIG9mIHRoZSB3cmFwcGVkIG1vZGFsLlxuICovXG5leHBvcnQgY2xhc3MgTWluaW1pemFibGVNb2RhbDxUTW9kYWwgZXh0ZW5kcyBNb2RhbD4ge1xuICAvKipcbiAgICogVGhlIHdyYXBwZWQgbW9kYWwuIE9wZW4sIGNsb3NlLCBhbmQgcG9wdWxhdGUgaXQgYXMgdXN1YWwgKGUuZy4gYG1pbmltaXphYmxlLm1vZGFsLm9wZW4oKWApLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1vZGFsOiBUTW9kYWw7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG1vZGFsIGlzIGN1cnJlbnRseSBtaW5pbWl6ZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbW9kYWwgaXMgY3VycmVudGx5IG1pbmltaXplZCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzTWluaW1pemVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTWluaW1pemVkVmFsdWU7XG4gIH1cblxuICAvLyBQYXRjaGVzIHRoZSB3cmFwcGVkIG1vZGFsJ3MgYG9uQ2xvc2VgIHRvIHJ1biBjbGVhbnVwLiBQZXJzaXN0cyBmb3IgdGhlIHdyYXBwZXIncyB3aG9sZSBsaWZlIChhXG4gIC8vIE1vZGFsIGNhbiBiZSByZW9wZW5lZCwgc28gdGhlIHBhdGNoIG11c3Qgc3Vydml2ZSBlYWNoIGNsb3NlKSwgaGVuY2UgYSBkZWRpY2F0ZWQgY29tcG9uZW50IHRoYXQgaXNcbiAgLy8gTmV2ZXIgdW5sb2FkZWQgXHUyMDE0IGRpc3RpbmN0IGZyb20gYHBlZWtMb2NrQ29tcG9uZW50YCwgd2hvc2UgcGF0Y2hlcyBsaXZlIG9ubHkgd2hpbGUgbWluaW1pemVkLlxuICBwcml2YXRlIHJlYWRvbmx5IGNsb3NlUGF0Y2hDb21wb25lbnQgPSBuZXcgTW9ua2V5QXJvdW5kQ29tcG9uZW50KCk7XG4gIHByaXZhdGUgaXNNaW5pbWl6ZWRWYWx1ZSA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IG1pbmltaXplQnV0dG9uRWw6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIG1pbmltaXplZEJhckVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHBlZWtMb2NrQ29tcG9uZW50OiBudWxsIHwgUGVla0xvY2tDb21wb25lbnQgPSBudWxsO1xuICBwcml2YXRlIHBlZWtMb2NrRW50cnk6IG51bGwgfCBQZWVrTG9ja0VudHJ5ID0gbnVsbDtcblxuICAvKipcbiAgICogV3JhcHMgdGhlIGdpdmVuIG1vZGFsLCBhZGRpbmcgYSBtaW5pbWl6ZSBidXR0b24gYW5kIHdpcmluZyB1cCBjbGVhbnVwIG9uIGNsb3NlLlxuICAgKlxuICAgKiBAcGFyYW0gbW9kYWwgLSBUaGUgbW9kYWwgaW5zdGFuY2UgdG8gbWFrZSBtaW5pbWl6YWJsZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihtb2RhbDogVE1vZGFsKSB7XG4gICAgdGhpcy5tb2RhbCA9IG1vZGFsO1xuICAgIGFkZFBsdWdpbkNzc0NsYXNzZXMobW9kYWwuY29udGFpbmVyRWwsIFtDc3NDbGFzcy5NaW5pbWl6YWJsZU1vZGFsXSk7XG4gICAgdGhpcy5taW5pbWl6ZUJ1dHRvbkVsID0gdGhpcy5jcmVhdGVNaW5pbWl6ZUJ1dHRvbigpO1xuICAgIHRoaXMuY2xvc2VQYXRjaENvbXBvbmVudC5sb2FkKCk7XG4gICAgdGhpcy5wYXRjaE9uQ2xvc2UobW9kYWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1pbmltaXplcyB0aGUgbW9kYWw6IGhpZGVzIHRoZSBtb2RhbCBhbmQgaXRzIGJhY2tkcm9wLCBzaG93cyBhIGZsb2F0aW5nIGJhciB3aXRoIGEgcmVzdG9yZSBidXR0b24sXG4gICAqIGFuZCBwdXRzIHRoZSBhcHAgaW50byB0aGUgcGVlay1vbmx5IGxvY2suIEEgbm8tb3AgaWYgdGhlIG1vZGFsIGlzIGFscmVhZHkgbWluaW1pemVkLlxuICAgKi9cbiAgcHVibGljIG1pbmltaXplKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzTWluaW1pemVkVmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzTWluaW1pemVkVmFsdWUgPSB0cnVlO1xuICAgIHRoaXMubWluaW1pemVCdXR0b25FbC5oaWRlKCk7XG4gICAgdGhpcy5tb2RhbC5jb250YWluZXJFbC5oaWRlKCk7XG4gICAgLy8gVGhlIG1vZGFsIHN0YXlzIG9wZW4gd2hpbGUgbWluaW1pemVkLCBzbyBpdHMga2V5bWFwIHNjb3BlIGlzIHBvcHBlZCB0byByZWxlYXNlIHRoZSBmb2N1cyB0cmFwLlxuICAgIC8vIFJlc3RvcmluZyByZS1wdXNoZXMgaXQuIEFuIGFjdGl2ZSB0cmFwIHdvdWxkIHN0ZWFsIGZvY3VzIGJhY2sgdG8gdGhlIGhpZGRlbiBtb2RhbCwgYmxvY2tpbmcgdGhlXG4gICAgLy8gTW91c2UtZHJpdmVuIGluc3BlY3Rpb24gKGNsaWNraW5nIG5vdGVzLCBzY3JvbGxpbmcpIHRoYXQgbWluaW1pemUgZXhpc3RzIHRvIGFsbG93LlxuICAgIC8vIEtleWJvYXJkIGlucHV0IHJlbWFpbnMgYmxvY2tlZCBieSB0aGUgcGVlay1vbmx5IGxvY2ssIHNvIHJlbGVhc2luZyB0aGUgdHJhcCBrZWVwcyB0aGUgYXBwIGluZXJ0LlxuICAgIHRoaXMubW9kYWwuYXBwLmtleW1hcC5wb3BTY29wZSh0aGlzLm1vZGFsLnNjb3BlKTtcbiAgICB0aGlzLm1pbmltaXplZEJhckVsID0gdGhpcy5jcmVhdGVNaW5pbWl6ZWRCYXIoKTtcbiAgICB0aGlzLmVuYWJsZVBlZWtMb2NrKHRoaXMubWluaW1pemVkQmFyRWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RvcmVzIHRoZSBtb2RhbCBmcm9tIHRoZSBtaW5pbWl6ZWQgc3RhdGUsIHJlbW92aW5nIHRoZSBmbG9hdGluZyBiYXIgYW5kIGxpZnRpbmcgdGhlIHBlZWstb25seVxuICAgKiBsb2NrLiBBIG5vLW9wIGlmIHRoZSBtb2RhbCBpcyBub3QgbWluaW1pemVkLlxuICAgKi9cbiAgcHVibGljIHJlc3RvcmUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzTWluaW1pemVkVmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzTWluaW1pemVkVmFsdWUgPSBmYWxzZTtcbiAgICB0aGlzLmRpc2FibGVQZWVrTG9jaygpO1xuICAgIHRoaXMucmVtb3ZlTWluaW1pemVkQmFyKCk7XG4gICAgLy8gUmUtcHVzaCB0aGUgc2NvcGUgcG9wcGVkIGluIG1pbmltaXplKCkgc28gdGhlIHJlc3RvcmVkIG1vZGFsIGJsb2NrcyB0aGUgYXBwIGFnYWluIChmb2N1cyB0cmFwXG4gICAgLy8gKyBFc2NhcGUgY2FwdHVyZSkuXG4gICAgdGhpcy5tb2RhbC5hcHAua2V5bWFwLnB1c2hTY29wZSh0aGlzLm1vZGFsLnNjb3BlKTtcbiAgICB0aGlzLm1vZGFsLmNvbnRhaW5lckVsLnNob3coKTtcbiAgICB0aGlzLm1pbmltaXplQnV0dG9uRWwuc2hvdygpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVNaW5pbWl6ZUJ1dHRvbigpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgYnV0dG9uRWwgPSB0aGlzLm1vZGFsLm1vZGFsRWwuY3JlYXRlRWwoJ2J1dHRvbicsIHsgY2xzOiBDc3NDbGFzcy5NaW5pbWl6ZUJ1dHRvbiB9KTtcbiAgICBzZXRJY29uKGJ1dHRvbkVsLCBNSU5JTUlaRV9JQ09OX0lEKTtcbiAgICBidXR0b25FbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHRoaXMubWluaW1pemUoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYnV0dG9uRWw7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU1pbmltaXplZEJhcigpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgYmFyRWwgPSB0aGlzLm1vZGFsLmNvbnRhaW5lckVsLm93bmVyRG9jdW1lbnQuYm9keS5jcmVhdGVEaXYoKTtcbiAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKGJhckVsLCBbQ3NzQ2xhc3MuTWluaW1pemVkTW9kYWxCYXJdKTtcbiAgICBiYXJFbC5jcmVhdGVTcGFuKHtcbiAgICAgIGNsczogQ3NzQ2xhc3MuTWluaW1pemVkTW9kYWxCYXJUaXRsZSxcbiAgICAgIHRleHQ6IHRoaXMubW9kYWwudGl0bGVFbC50ZXh0Q29udGVudFxuICAgIH0pO1xuICAgIGNvbnN0IHJlc3RvcmVCdXR0b25FbCA9IGJhckVsLmNyZWF0ZUVsKCdidXR0b24nLCB7IGNsczogQ3NzQ2xhc3MuUmVzdG9yZUJ1dHRvbiB9KTtcbiAgICBzZXRJY29uKHJlc3RvcmVCdXR0b25FbCwgUkVTVE9SRV9JQ09OX0lEKTtcbiAgICAvLyBUaGUgd2hvbGUgYmFyIHJlc3RvcmVzIG9uIGNsaWNrLCBub3QganVzdCB0aGUgcmVzdG9yZSBidXR0b24gXHUyMDE0IGEgbGFyZ2VyLCBlYXNpZXIgY2xpY2sgdGFyZ2V0LlxuICAgIC8vIGByZXN0b3JlKClgIGd1YXJkcyBhZ2FpbnN0IGEgZG91YmxlIGludm9jYXRpb24sIHNvIHRoZSByZXN0b3JlIGJ1dHRvbidzIG93biBjbGljayBidWJibGluZyB1cFxuICAgIC8vIEhlcmUgaXMgYSBuby1vcC4gVGhlIHJlc3RvcmUgYnV0dG9uIHN0YXlzIHB1cmVseSBhcyBhIHZpc3VhbCBhZmZvcmRhbmNlIGZvciB0aGUgY2xpY2sgdGFyZ2V0LlxuICAgIGJhckVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgdGhpcy5yZXN0b3JlKCk7XG4gICAgfSk7XG4gICAgLy8gRHJvcCB0aGUgb25lLXNob3QgYXR0ZW50aW9uIGZsYXNoIG9uY2UgaXQgZmluaXNoZXMgc28gdGhlIGJhciByZXR1cm5zIHRvIGl0cyBnZW50bGUgaWRsZSBwdWxzZS5cbiAgICAvLyBUaGUgaWRsZSBwdWxzZSBpcyBhbiBpbmZpbml0ZSBhbmltYXRpb24sIHdoaWNoIG5ldmVyIGZpcmVzIGBhbmltYXRpb25lbmRgLlxuICAgIGJhckVsLmFkZEV2ZW50TGlzdGVuZXIoJ2FuaW1hdGlvbmVuZCcsICgpID0+IHtcbiAgICAgIGJhckVsLnJlbW92ZUNsYXNzKENzc0NsYXNzLk1pbmltaXplZE1vZGFsQmFyQXR0ZW50aW9uKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYmFyRWw7XG4gIH1cblxuICBwcml2YXRlIGRpc2FibGVQZWVrTG9jaygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGVla0xvY2tFbnRyeSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHBlZWtMb2NrRW50cmllcy5kZWxldGUodGhpcy5wZWVrTG9ja0VudHJ5KTtcbiAgICB0aGlzLnBlZWtMb2NrRW50cnkgPSBudWxsO1xuICAgIC8vIFRlYXIgdGhlIGBvcGVuYCBwYXRjaGVzIGRvd24gd2l0aCB0aGUgY29tcG9uZW50LCBzbyB0aGV5IGV4aXN0IG9ubHkgd2hpbGUgdGhpcyBtb2RhbCBpcyBtaW5pbWl6ZWQuXG4gICAgdGhpcy5wZWVrTG9ja0NvbXBvbmVudD8udW5sb2FkKCk7XG4gICAgdGhpcy5wZWVrTG9ja0NvbXBvbmVudCA9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGVuYWJsZVBlZWtMb2NrKGJhckVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIHRoaXMucGVla0xvY2tFbnRyeSA9IHtcbiAgICAgIGJhckVsLFxuICAgICAgZmxhc2g6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5mbGFzaEJhcihiYXJFbCk7XG4gICAgICB9LFxuICAgICAgaW5uZXJNb2RhbDogdGhpcy5tb2RhbFxuICAgIH07XG4gICAgcGVla0xvY2tFbnRyaWVzLmFkZCh0aGlzLnBlZWtMb2NrRW50cnkpO1xuICAgIC8vIEluc3RhbGwgdGhlIGBvcGVuYCBwYXRjaGVzIGFuZCBpbnB1dCBzdXBwcmVzc29ycyBmb3IgYXMgbG9uZyBhcyB0aGlzIG1vZGFsIGlzIG1pbmltaXplZC4gVGhlXG4gICAgLy8gQmxvY2sgTE9HSUMgaXRzZWxmIGtleXMgb2ZmIHRoZSBzaGFyZWQgYHBlZWtMb2NrRW50cmllc2AgKHNlZSBgc2hvdWxkQmxvY2tPcGVuYCksIHNvIHdpdGggc2V2ZXJhbFxuICAgIC8vIE1vZGFscyBtaW5pbWl6ZWQgZXZlcnkgb25lJ3MgcGF0Y2ggcmVhY2hlcyB0aGUgc2FtZSB2ZXJkaWN0OyB0aGUgbG9jayBsaWZ0cyBvbmx5IG9uY2UgdGhlIGxhc3RcbiAgICAvLyBNb2RhbCByZXN0b3Jlcy9jbG9zZXMuXG4gICAgdGhpcy5wZWVrTG9ja0NvbXBvbmVudCA9IG5ldyBQZWVrTG9ja0NvbXBvbmVudCh0aGlzLm1vZGFsLmFwcCk7XG4gICAgdGhpcy5wZWVrTG9ja0NvbXBvbmVudC5sb2FkKCk7XG4gIH1cblxuICBwcml2YXRlIGZsYXNoQmFyKGJhckVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGJhckVsLnJlbW92ZUNsYXNzKENzc0NsYXNzLk1pbmltaXplZE1vZGFsQmFyQXR0ZW50aW9uKTtcbiAgICAvLyBGb3JjZSBhIHJlZmxvdyBzbyByZS1hZGRpbmcgdGhlIGNsYXNzIHJlc3RhcnRzIHRoZSBvbmUtc2hvdCBmbGFzaCBvbiByYXBpZCByZXBlYXRlZCBibG9ja3MuXG4gICAgYmFyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgYmFyRWwuYWRkQ2xhc3MoQ3NzQ2xhc3MuTWluaW1pemVkTW9kYWxCYXJBdHRlbnRpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVQZWVrTG9jaygpO1xuICAgIHRoaXMucmVtb3ZlTWluaW1pemVkQmFyKCk7XG4gICAgdGhpcy5pc01pbmltaXplZFZhbHVlID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHBhdGNoT25DbG9zZShtb2RhbDogTW9kYWwpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlUGF0Y2hDb21wb25lbnQucmVnaXN0ZXJNZXRob2RQYXRjaDxNb2RhbCwgJ29uQ2xvc2UnPih7XG4gICAgICBtZXRob2ROYW1lOiAnb25DbG9zZScsXG4gICAgICBvYmo6IG1vZGFsLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjayB9KTogdm9pZCA9PiB7XG4gICAgICAgIGZhbGxiYWNrKCk7XG4gICAgICAgIHRoaXMuaGFuZGxlQ2xvc2UoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlTWluaW1pemVkQmFyKCk6IHZvaWQge1xuICAgIHRoaXMubWluaW1pemVkQmFyRWw/LnJlbW92ZSgpO1xuICAgIHRoaXMubWluaW1pemVkQmFyRWwgPSBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJsb2NrRXZlbnQoZXZ0OiBFdmVudCk6IHZvaWQge1xuICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgZXZ0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICBzaWduYWxCbG9ja2VkQXR0ZW1wdCgpO1xufVxuXG5mdW5jdGlvbiBibG9ja09yRmFsbGJhY2sobW9kYWw6IE1vZGFsLCBmYWxsYmFjazogKCkgPT4gdm9pZCk6IHZvaWQge1xuICBpZiAoc2hvdWxkQmxvY2tPcGVuKG1vZGFsKSkge1xuICAgIHNpZ25hbEJsb2NrZWRBdHRlbXB0KCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZmFsbGJhY2soKTtcbn1cblxuZnVuY3Rpb24gZmxhc2hNaW5pbWl6ZWRCYXJzKCk6IHZvaWQge1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIHBlZWtMb2NrRW50cmllcykge1xuICAgIGVudHJ5LmZsYXNoKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNNaW5pbWl6ZWRJbm5lck1vZGFsKG1vZGFsOiBNb2RhbCk6IGJvb2xlYW4ge1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIHBlZWtMb2NrRW50cmllcykge1xuICAgIGlmIChlbnRyeS5pbm5lck1vZGFsID09PSBtb2RhbCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc1BlZWtBbGxvd2VkS2V5KGV2dDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAvLyBOYXZpZ2F0aW9uIG1vdmVzIHRoZSBjdXJzb3Ivc2Nyb2xscyAoYWxsb3dlZCksIGJ1dCBTaGlmdCtuYXZpZ2F0aW9uIGV4dGVuZHMgdGhlIHNlbGVjdGlvbiAobm90XG4gIC8vIE5lZWRlZCBmb3IgaW5zcGVjdGlvbiksIHNvIGl0IGlzIGJsb2NrZWQuIEJhcmUgbW9kaWZpZXIgcHJlc3NlcyBwYXNzIHRocm91Z2ggb24gdGhlaXIgb3duLlxuICBpZiAoTkFWSUdBVElPTl9LRVlTLmhhcyhldnQua2V5KSkge1xuICAgIHJldHVybiAhZXZ0LnNoaWZ0S2V5O1xuICB9XG5cbiAgcmV0dXJuIE1PRElGSUVSX0tFWVMuaGFzKGV2dC5rZXkpO1xufVxuXG5mdW5jdGlvbiBpc1BlZWtMb2NrZWQoKTogYm9vbGVhbiB7XG4gIC8vIERyb3AgZW50cmllcyB3aG9zZSBiYXIgaGFzIGxlZnQgdGhlIERPTSB3aXRob3V0IGEgcmVzdG9yZSgpIG9yIGNsb3NlKCkuXG4gIC8vIEEgdGVzdCB0ZWFyZG93biB0aGF0IGVtcHRpZXMgdGhlIGJvZHkgaXMgdGhlIHR5cGljYWwgY2F1c2U7IHRoaXMga2VlcHMgYSBzdGFsZSBlbnRyeSBmcm9tIGxvY2tpbmcuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgcGVla0xvY2tFbnRyaWVzKSB7XG4gICAgaWYgKCFlbnRyeS5iYXJFbC5pc0Nvbm5lY3RlZCkge1xuICAgICAgcGVla0xvY2tFbnRyaWVzLmRlbGV0ZShlbnRyeSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBlZWtMb2NrRW50cmllcy5zaXplID4gMDtcbn1cblxuZnVuY3Rpb24gc2hvdWxkQmxvY2tPcGVuKG1vZGFsOiBNb2RhbCk6IGJvb2xlYW4ge1xuICAvLyBBIG1vZGFsJ3Mgb3duIHJlLW9wZW4gaXMgbmV2ZXIgYmxvY2tlZCBcdTIwMTQgb3RoZXJ3aXNlIGEgbWluaW1pemVkIG1vZGFsIGNvdWxkIG5vdCByZXN0b3JlL3JlLW9wZW5cbiAgLy8gSXRzZWxmLiBFdmVyeSBPVEhFUiBtb2RhbCBvcGVuIGlzIGJsb2NrZWQgd2hpbGUgYW55IG1vZGFsIGlzIG1pbmltaXplZCAodGhlIHBlZWstb25seSBsb2NrKS5cbiAgcmV0dXJuIGlzUGVla0xvY2tlZCgpICYmICFpc01pbmltaXplZElubmVyTW9kYWwobW9kYWwpO1xufVxuXG5mdW5jdGlvbiBzaWduYWxCbG9ja2VkQXR0ZW1wdCgpOiB2b2lkIHtcbiAgZmxhc2hNaW5pbWl6ZWRCYXJzKCk7XG4gIGJlZXBlci5iZWVwKCk7XG59XG5cbmZ1bmN0aW9uIHN1cHByZXNzS2V5ZG93bldoaWxlUGVla0xvY2tlZChldnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgaWYgKCFpc1BlZWtMb2NrZWQoKSB8fCBpc1BlZWtBbGxvd2VkS2V5KGV2dCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBibG9ja0V2ZW50KGV2dCk7XG59XG5cbmZ1bmN0aW9uIHN1cHByZXNzV2hpbGVQZWVrTG9ja2VkKGV2dDogRXZlbnQpOiB2b2lkIHtcbiAgaWYgKCFpc1BlZWtMb2NrZWQoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGJsb2NrRXZlbnQoZXZ0KTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTZDQSxzQkFHTztBQUVQLG9CQUF1QjtBQUN2Qix5Q0FBeUM7QUFDekMscUNBQXNDO0FBQ3RDLHVCQUF5QjtBQUN6Qiw0QkFBb0M7QUFFcEMsTUFBTSxtQkFBbUI7QUFDekIsTUFBTSxrQkFBa0I7QUFLeEIsTUFBTSxrQkFBa0Isb0JBQUksSUFBWTtBQUFBLEVBQ3RDO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGLENBQUM7QUFJRCxNQUFNLGdCQUFnQixvQkFBSSxJQUFZO0FBQUEsRUFDcEM7QUFBQSxF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
|
|
@@ -2,14 +2,26 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* @file
|
|
4
4
|
*
|
|
5
|
-
* A wrapper that makes any Obsidian {@link Modal} minimizable
|
|
5
|
+
* A wrapper that makes any Obsidian {@link Modal} minimizable to a floating bar — without breaking the
|
|
6
|
+
* modal's blocking contract.
|
|
6
7
|
*
|
|
7
|
-
* Obsidian's {@link Modal} is blocking
|
|
8
|
-
*
|
|
9
|
-
* `
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
8
|
+
* Obsidian's {@link Modal} is blocking: while it is open the rest of the app is meant to be inert until
|
|
9
|
+
* the modal is dismissed. {@link MinimizableModal} wraps any modal instance (plain `Modal`,
|
|
10
|
+
* `FuzzySuggestModal`, the library's `ModalBase`, your own subclass, … — including modals you do not
|
|
11
|
+
* own) and adds a minimize button. Minimizing hides the modal and its blocking backdrop and shows a
|
|
12
|
+
* small floating bar with a restore button, so the user can peek at the notes/folders the operation
|
|
13
|
+
* involves — but the modal is NOT dismissed, so its blocking contract must be preserved.
|
|
14
|
+
*
|
|
15
|
+
* To keep that contract while minimized, the wrapper puts the app into a **peek-only lock**: the user
|
|
16
|
+
* may mouse-click and scroll to inspect content, but cannot start anything new. While any modal is
|
|
17
|
+
* minimized the wrapper:
|
|
18
|
+
* - blocks the keyboard (typing, hotkeys, the command-palette shortcut),
|
|
19
|
+
* - blocks the right-click context menu, and
|
|
20
|
+
* - blocks opening any other modal (a re-fired command, the command palette, settings, …).
|
|
21
|
+
*
|
|
22
|
+
* A blocked attempt flashes the floating bar and beeps so the user sees (and hears) why nothing
|
|
23
|
+
* happened. Restoring (or the modal closing) lifts the lock. This prevents, for example, minimizing a
|
|
24
|
+
* "merge folder" picker and then firing the same command again to stack several concurrent merges.
|
|
13
25
|
*
|
|
14
26
|
* The wrapper reuses the modal's own title (`titleEl`) as the minimized bar label, so set the title
|
|
15
27
|
* the usual way (`modal.setTitle(...)`). Render arbitrary content into {@link Modal.contentEl},
|
|
@@ -23,16 +35,17 @@
|
|
|
23
35
|
*
|
|
24
36
|
* const minimizable = new MinimizableModal(modal);
|
|
25
37
|
* minimizable.modal.open();
|
|
26
|
-
* minimizable.minimize(); //
|
|
38
|
+
* minimizable.minimize(); // a floating bar offers "restore"; the app is peek-only until restored
|
|
27
39
|
* ```
|
|
28
40
|
*
|
|
29
41
|
* The wrapped modal can still be closed normally; the floating bar is cleaned up automatically when
|
|
30
42
|
* the modal closes (even if it is closed while minimized).
|
|
31
43
|
*/
|
|
32
|
-
import
|
|
44
|
+
import { Modal } from 'obsidian';
|
|
33
45
|
/**
|
|
34
|
-
* Wraps a {@link Modal} instance to make it minimizable to a small floating bar and restorable
|
|
35
|
-
*
|
|
46
|
+
* Wraps a {@link Modal} instance to make it minimizable to a small floating bar and restorable. While
|
|
47
|
+
* minimized the app is put into a peek-only lock (keyboard, context menu, and opening other modals are
|
|
48
|
+
* blocked) so the modal's blocking contract is preserved.
|
|
36
49
|
*
|
|
37
50
|
* @typeParam TModal - The type of the wrapped modal.
|
|
38
51
|
*/
|
|
@@ -47,9 +60,12 @@ export declare class MinimizableModal<TModal extends Modal> {
|
|
|
47
60
|
* @returns `true` if the modal is currently minimized, `false` otherwise.
|
|
48
61
|
*/
|
|
49
62
|
get isMinimized(): boolean;
|
|
63
|
+
private readonly closePatchComponent;
|
|
50
64
|
private isMinimizedValue;
|
|
51
65
|
private readonly minimizeButtonEl;
|
|
52
66
|
private minimizedBarEl;
|
|
67
|
+
private peekLockComponent;
|
|
68
|
+
private peekLockEntry;
|
|
53
69
|
/**
|
|
54
70
|
* Wraps the given modal, adding a minimize button and wiring up cleanup on close.
|
|
55
71
|
*
|
|
@@ -57,17 +73,20 @@ export declare class MinimizableModal<TModal extends Modal> {
|
|
|
57
73
|
*/
|
|
58
74
|
constructor(modal: TModal);
|
|
59
75
|
/**
|
|
60
|
-
* Minimizes the modal: hides the modal and its backdrop
|
|
61
|
-
*
|
|
76
|
+
* Minimizes the modal: hides the modal and its backdrop, shows a floating bar with a restore button,
|
|
77
|
+
* and puts the app into the peek-only lock. A no-op if the modal is already minimized.
|
|
62
78
|
*/
|
|
63
79
|
minimize(): void;
|
|
64
80
|
/**
|
|
65
|
-
* Restores the modal from the minimized state, removing the floating bar
|
|
66
|
-
* not minimized.
|
|
81
|
+
* Restores the modal from the minimized state, removing the floating bar and lifting the peek-only
|
|
82
|
+
* lock. A no-op if the modal is not minimized.
|
|
67
83
|
*/
|
|
68
84
|
restore(): void;
|
|
69
85
|
private createMinimizeButton;
|
|
70
86
|
private createMinimizedBar;
|
|
87
|
+
private disablePeekLock;
|
|
88
|
+
private enablePeekLock;
|
|
89
|
+
private flashBar;
|
|
71
90
|
private handleClose;
|
|
72
91
|
private patchOnClose;
|
|
73
92
|
private removeMinimizedBar;
|