obsidian-dev-utils 82.0.0-beta.8 → 82.0.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 (35) hide show
  1. package/CHANGELOG.md +37 -14
  2. package/dist/dev/main.js +30870 -0
  3. package/dist/dev/manifest.json +9 -0
  4. package/dist/lib/cjs/library.cjs +2 -2
  5. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +1 -1
  6. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.d.cts +1 -1
  7. package/dist/lib/cjs/obsidian/editor-lock.cjs +172 -16
  8. package/dist/lib/cjs/obsidian/editor-lock.d.cts +30 -1
  9. package/dist/lib/cjs/obsidian/file-manager.cjs +1 -1
  10. package/dist/lib/cjs/obsidian/file-manager.d.cts +2 -2
  11. package/dist/lib/cjs/obsidian/i18n/locales/en.cjs +5 -2
  12. package/dist/lib/cjs/obsidian/i18n/locales/en.d.cts +3 -0
  13. package/dist/lib/cjs/obsidian/i18n/locales/translations-map.d.cts +3 -0
  14. package/dist/lib/cjs/obsidian/markdown-code-block-processor.cjs +1 -1
  15. package/dist/lib/cjs/obsidian/markdown-code-block-processor.d.cts +3 -3
  16. package/dist/lib/cjs/obsidian/modals/minimizable-modal.cjs +3 -1
  17. package/dist/lib/cjs/obsidian/vault.cjs +1 -1
  18. package/dist/lib/cjs/obsidian/vault.d.cts +1 -1
  19. package/dist/lib/esm/library.mjs +2 -2
  20. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.d.mts +1 -1
  21. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +1 -1
  22. package/dist/lib/esm/obsidian/editor-lock.d.mts +30 -1
  23. package/dist/lib/esm/obsidian/editor-lock.mjs +174 -17
  24. package/dist/lib/esm/obsidian/file-manager.d.mts +2 -2
  25. package/dist/lib/esm/obsidian/file-manager.mjs +1 -1
  26. package/dist/lib/esm/obsidian/i18n/locales/en.d.mts +3 -0
  27. package/dist/lib/esm/obsidian/i18n/locales/en.mjs +5 -2
  28. package/dist/lib/esm/obsidian/i18n/locales/translations-map.d.mts +3 -0
  29. package/dist/lib/esm/obsidian/markdown-code-block-processor.d.mts +3 -3
  30. package/dist/lib/esm/obsidian/markdown-code-block-processor.mjs +1 -1
  31. package/dist/lib/esm/obsidian/modals/minimizable-modal.mjs +3 -1
  32. package/dist/lib/esm/obsidian/vault.d.mts +1 -1
  33. package/dist/lib/esm/obsidian/vault.mjs +1 -1
  34. package/dist/styles.css +12 -2
  35. package/package.json +9 -9
@@ -128,49 +128,65 @@ __export(editor_lock_exports, {
128
128
  EditorLockComponent: () => EditorLockComponent,
129
129
  isEditorLockedForPath: () => isEditorLockedForPath,
130
130
  lockEditorForPath: () => lockEditorForPath,
131
+ requestEditorUnlockForPath: () => requestEditorUnlockForPath,
131
132
  unlockEditorForPath: () => unlockEditorForPath
132
133
  });
133
134
  module.exports = __toCommonJS(editor_lock_exports);
134
135
  var import_implementations = require('@obsidian-typings/obsidian-public-latest/implementations');
135
136
  var import_obsidian = require('obsidian');
137
+ var import_async = require('../async.cjs');
136
138
  var import_disposable = require('../disposable.cjs');
137
139
  var import_function = require('../function.cjs');
140
+ var import_html_element = require('../html-element.cjs');
138
141
  var import_obsidian_dev_utils_state = require('../obsidian-dev-utils-state.cjs');
139
142
  var import_type_guards = require('../type-guards.cjs');
140
143
  var import_component_ex = require('./components/component-ex.cjs');
141
144
  var import_editor = require('./editor.cjs');
142
145
  var import_file_system = require('./file-system.cjs');
143
146
  var import_i18n = require('./i18n/i18n.cjs');
147
+ var import_confirm = require('./modals/confirm.cjs');
144
148
  var import_plugin_id = require('./plugin/plugin-id.cjs');
149
+ const BEEP_DURATION_SECONDS = 0.08;
150
+ const BEEP_FREQUENCY_HZ = 660;
151
+ const BEEP_GAIN = 0.05;
152
+ const BEEP_THROTTLE_MILLISECONDS = 200;
145
153
  const EDITOR_LOCK_STATE_KEY = "editorLock";
146
154
  const LOCK_ICON_ID = "lock";
147
155
  const LOCK_INDICATOR_CSS_CLASS = "obsidian-dev-utils-lock-indicator";
156
+ const LOCK_INDICATOR_FLASH_CSS_CLASS = "obsidian-dev-utils-lock-indicator-flash";
148
157
  const STATUS_BAR_ITEM_CSS_CLASS = "status-bar-item";
149
158
  const STATUS_BAR_CSS_SELECTOR = ".status-bar";
159
+ const UNLOCK_ICON_ID = "unlock";
150
160
  class EditorLockEventsComponent extends import_component_ex.ComponentEx {
151
- constructor(app, onChange) {
152
- super();
153
- this.app = app;
154
- this.onChange = onChange;
155
- }
156
161
  app;
157
162
  onChange;
163
+ onFileMenu;
164
+ constructor(params) {
165
+ super();
166
+ this.app = params.app;
167
+ this.onChange = params.onChange;
168
+ this.onFileMenu = params.onFileMenu;
169
+ }
158
170
  onload() {
159
171
  super.onload();
160
172
  this.registerEvent(this.app.workspace.on("active-leaf-change", this.onChange));
161
173
  this.registerEvent(this.app.workspace.on("layout-change", this.onChange));
162
174
  this.registerEvent(this.app.workspace.on("file-open", this.onChange));
175
+ this.registerEvent(this.app.workspace.on("file-menu", this.onFileMenu));
163
176
  }
164
177
  }
165
178
  class EditorPathLockManager {
179
+ abortControllersByPath = /* @__PURE__ */ new Map();
180
+ audioContext = null;
166
181
  eventsComponent;
167
182
  indicatorsByView = /* @__PURE__ */ new Map();
183
+ lastBeepMilliseconds = 0;
168
184
  lockCountByPluginIdByPath = /* @__PURE__ */ new Map();
169
185
  statusBarItemEl = null;
170
186
  isLocked(app, pathOrFile) {
171
187
  return this.isPathLocked((0, import_file_system.getPath)(app, pathOrFile));
172
188
  }
173
- lock(app, pathOrFile, pluginId) {
189
+ lock(app, pathOrFile, pluginId, abortController) {
174
190
  const path = (0, import_file_system.getPath)(app, pathOrFile);
175
191
  let lockCountByPluginId = this.lockCountByPluginIdByPath.get(path);
176
192
  if (!lockCountByPluginId) {
@@ -178,15 +194,49 @@ class EditorPathLockManager {
178
194
  this.lockCountByPluginIdByPath.set(path, lockCountByPluginId);
179
195
  }
180
196
  lockCountByPluginId.set(pluginId, (lockCountByPluginId.get(pluginId) ?? 0) + 1);
197
+ if (abortController) {
198
+ let abortControllers = this.abortControllersByPath.get(path);
199
+ if (!abortControllers) {
200
+ abortControllers = /* @__PURE__ */ new Set();
201
+ this.abortControllersByPath.set(path, abortControllers);
202
+ }
203
+ abortControllers.add(abortController);
204
+ }
181
205
  this.ensureSubscribed(app);
182
206
  this.reconcile(app);
183
207
  return new import_disposable.CallbackDisposable({
184
208
  callback: () => {
209
+ if (abortController) {
210
+ const abortControllers = this.abortControllersByPath.get(path);
211
+ (0, import_type_guards.assertNonNullable)(abortControllers);
212
+ abortControllers.delete(abortController);
213
+ if (abortControllers.size === 0) {
214
+ this.abortControllersByPath.delete(path);
215
+ }
216
+ }
185
217
  this.unlockPath(app, path, pluginId);
186
218
  },
187
219
  multipleDisposeBehavior: import_disposable.MultipleDisposeBehavior.Ignore
188
220
  });
189
221
  }
222
+ /**
223
+ * Aborts every {@link AbortController} currently registered for the note at the given path, which
224
+ * cancels the operations holding the lock. Each operation releases its own lock in its `finally`
225
+ * when it observes the abort, so this does not unlock the path directly. A no-op when no controller
226
+ * is registered for the path.
227
+ *
228
+ * @param app - The Obsidian app instance.
229
+ * @param pathOrFile - The path or file of the note to request an unlock for.
230
+ */
231
+ requestUnlock(app, pathOrFile) {
232
+ const abortControllers = this.abortControllersByPath.get((0, import_file_system.getPath)(app, pathOrFile));
233
+ if (!abortControllers) {
234
+ return;
235
+ }
236
+ for (const controller of abortControllers) {
237
+ controller.abort();
238
+ }
239
+ }
190
240
  unlock(app, pathOrFile, pluginId) {
191
241
  this.unlockPath(app, (0, import_file_system.getPath)(app, pathOrFile), pluginId);
192
242
  }
@@ -198,17 +248,63 @@ class EditorPathLockManager {
198
248
  }
199
249
  this.reconcileAndCleanup(app);
200
250
  }
201
- createIndicators(view, tooltip) {
251
+ addUnlockMenuItem(app, menu, path) {
252
+ menu.addItem((item) => {
253
+ item.setTitle((0, import_i18n.t)(($) => $.obsidianDevUtils.editorLock.unlockMenuItem)).setIcon(UNLOCK_ICON_ID).onClick((0, import_async.convertAsyncToSync)(async () => {
254
+ const isConfirmed = await (0, import_confirm.confirm)({
255
+ app,
256
+ message: this.unlockConfirmMessage(app, path),
257
+ title: (0, import_i18n.t)(($) => $.obsidianDevUtils.editorLock.unlockConfirmTitle)
258
+ });
259
+ if (isConfirmed) {
260
+ this.requestUnlock(app, path);
261
+ }
262
+ }));
263
+ });
264
+ }
265
+ beep() {
266
+ const nowMilliseconds = Date.now();
267
+ if (nowMilliseconds - this.lastBeepMilliseconds < BEEP_THROTTLE_MILLISECONDS) {
268
+ return;
269
+ }
270
+ this.lastBeepMilliseconds = nowMilliseconds;
271
+ const AudioContextClass = window.AudioContext;
272
+ if (!AudioContextClass) {
273
+ return;
274
+ }
275
+ this.audioContext ??= new AudioContextClass();
276
+ const audioContext = this.audioContext;
277
+ const oscillator = audioContext.createOscillator();
278
+ const gainNode = audioContext.createGain();
279
+ oscillator.type = "sine";
280
+ oscillator.frequency.value = BEEP_FREQUENCY_HZ;
281
+ gainNode.gain.value = BEEP_GAIN;
282
+ oscillator.connect(gainNode);
283
+ gainNode.connect(audioContext.destination);
284
+ oscillator.start();
285
+ oscillator.stop(audioContext.currentTime + BEEP_DURATION_SECONDS);
286
+ }
287
+ createIndicators(app, view, path, tooltip) {
202
288
  const actionIconEl = view.addAction(LOCK_ICON_ID, tooltip, import_function.noop);
289
+ this.registerUnlockMenu(app, actionIconEl, () => path);
203
290
  let tabIconEl = null;
204
291
  const tabStatusContainerEl = view.leaf.tabHeaderStatusContainerEl;
205
292
  if (tabStatusContainerEl) {
206
293
  tabIconEl = tabStatusContainerEl.createSpan({ cls: LOCK_INDICATOR_CSS_CLASS });
207
294
  (0, import_obsidian.setIcon)(tabIconEl, LOCK_ICON_ID);
208
295
  (0, import_obsidian.setTooltip)(tabIconEl, tooltip);
296
+ this.registerUnlockMenu(app, tabIconEl, () => path);
209
297
  }
298
+ const onTypeAttempt = () => {
299
+ this.flashIndicators(view);
300
+ this.beep();
301
+ };
302
+ view.contentEl.addEventListener("beforeinput", onTypeAttempt);
210
303
  return {
211
304
  actionIconEl,
305
+ disposeTypeListener: () => {
306
+ view.contentEl.removeEventListener("beforeinput", onTypeAttempt);
307
+ },
212
308
  tabIconEl
213
309
  };
214
310
  }
@@ -216,20 +312,50 @@ class EditorPathLockManager {
216
312
  if (this.eventsComponent) {
217
313
  return;
218
314
  }
219
- this.eventsComponent = new EditorLockEventsComponent(app, () => {
220
- this.reconcile(app);
315
+ this.eventsComponent = new EditorLockEventsComponent({
316
+ app,
317
+ onChange: () => {
318
+ this.reconcile(app);
319
+ },
320
+ onFileMenu: (menu, file) => {
321
+ this.handleFileMenu(app, menu, file);
322
+ }
221
323
  });
222
324
  this.eventsComponent.load();
223
325
  }
326
+ flashElement(el) {
327
+ el.removeClass(LOCK_INDICATOR_FLASH_CSS_CLASS);
328
+ el.getBoundingClientRect();
329
+ el.addClass(LOCK_INDICATOR_FLASH_CSS_CLASS);
330
+ }
331
+ flashIndicators(view) {
332
+ const indicators = this.indicatorsByView.get(view);
333
+ for (const el of [indicators?.actionIconEl, indicators?.tabIconEl, this.statusBarItemEl]) {
334
+ if (el) {
335
+ this.flashElement(el);
336
+ }
337
+ }
338
+ }
339
+ handleFileMenu(app, menu, file) {
340
+ if (!(file instanceof import_obsidian.TFile)) {
341
+ return;
342
+ }
343
+ if (!this.isPathLocked(file.path)) {
344
+ return;
345
+ }
346
+ this.addUnlockMenuItem(app, menu, file.path);
347
+ }
224
348
  isPathLocked(path) {
225
349
  return (this.lockCountByPluginIdByPath.get(path)?.size ?? 0) > 0;
226
350
  }
227
- lockTooltip(app, path) {
351
+ lockingPluginNames(app, path) {
228
352
  const lockCountByPluginId = this.lockCountByPluginIdByPath.get(path);
229
353
  (0, import_type_guards.assertNonNullable)(lockCountByPluginId);
354
+ return Array.from(lockCountByPluginId.keys()).map((pluginId) => app.plugins.manifests[pluginId]?.name ?? pluginId);
355
+ }
356
+ lockTooltip(app, path) {
230
357
  const header = (0, import_i18n.t)(($) => $.obsidianDevUtils.editorLock.lockedByTooltip);
231
- const pluginNames = Array.from(lockCountByPluginId.keys()).map((pluginId) => app.plugins.manifests[pluginId]?.name ?? pluginId);
232
- return [header, ...pluginNames].join("\n");
358
+ return [header, ...this.lockingPluginNames(app, path)].join("\n");
233
359
  }
234
360
  reconcile(app) {
235
361
  const viewsToLock = /* @__PURE__ */ new Set();
@@ -250,13 +376,14 @@ class EditorPathLockManager {
250
376
  if (indicators) {
251
377
  this.updateIndicatorTooltips(indicators, tooltip);
252
378
  } else {
253
- this.indicatorsByView.set(view, this.createIndicators(view, tooltip));
379
+ this.indicatorsByView.set(view, this.createIndicators(app, view, path, tooltip));
254
380
  }
255
381
  }
256
382
  }
257
383
  for (const [view, indicators] of this.indicatorsByView) {
258
384
  if (!viewsToLock.has(view)) {
259
385
  (0, import_editor.toggleEditorReadOnly)(view.editor, false);
386
+ indicators.disposeTypeListener();
260
387
  indicators.actionIconEl.remove();
261
388
  indicators.tabIconEl?.remove();
262
389
  this.indicatorsByView.delete(view);
@@ -271,6 +398,27 @@ class EditorPathLockManager {
271
398
  this.eventsComponent = void 0;
272
399
  }
273
400
  }
401
+ registerUnlockMenu(app, el, getContextPath) {
402
+ el.addEventListener("contextmenu", (evt) => {
403
+ evt.preventDefault();
404
+ const path = getContextPath();
405
+ if (path === void 0) {
406
+ return;
407
+ }
408
+ const menu = new import_obsidian.Menu();
409
+ this.addUnlockMenuItem(app, menu, path);
410
+ menu.showAtMouseEvent(evt);
411
+ });
412
+ }
413
+ unlockConfirmMessage(app, path) {
414
+ const fragment = createFragment();
415
+ fragment.appendText((0, import_i18n.t)(($) => $.obsidianDevUtils.editorLock.unlockConfirmMessage));
416
+ for (const name of this.lockingPluginNames(app, path)) {
417
+ fragment.createEl("br");
418
+ (0, import_html_element.appendCodeBlock)(fragment, name);
419
+ }
420
+ return fragment;
421
+ }
274
422
  unlockPath(app, path, pluginId) {
275
423
  const lockCountByPluginId = this.lockCountByPluginIdByPath.get(path);
276
424
  if (!lockCountByPluginId) {
@@ -312,6 +460,7 @@ class EditorPathLockManager {
312
460
  }
313
461
  this.statusBarItemEl = statusBarEl.createDiv({ cls: [STATUS_BAR_ITEM_CSS_CLASS, LOCK_INDICATOR_CSS_CLASS] });
314
462
  (0, import_obsidian.setIcon)(this.statusBarItemEl, LOCK_ICON_ID);
463
+ this.registerUnlockMenu(app, this.statusBarItemEl, () => app.workspace.getActiveViewOfType(import_obsidian.MarkdownView)?.file?.path);
315
464
  }
316
465
  (0, import_obsidian.setTooltip)(this.statusBarItemEl, this.lockTooltip(app, activePath));
317
466
  }
@@ -347,10 +496,13 @@ class EditorLockComponent extends import_component_ex.ComponentEx {
347
496
  * with a dispose of the returned {@link Disposable} (ideally via `using`) or {@link unlockForPath}.
348
497
  *
349
498
  * @param pathOrFile - The path or file of the note to lock.
499
+ * @param options - Optional locking options. Pass an
500
+ * {@link EditorLockComponentLockForPathOptions.abortController} to make the lock cancelable via the
501
+ * indicator's right-click "unlock" menu or {@link requestEditorUnlockForPath}.
350
502
  * @returns A {@link Disposable} that releases this lock when disposed. Disposing more than once is a no-op.
351
503
  */
352
- lockForPath(pathOrFile) {
353
- return getManager().lock(this.app, pathOrFile, this.pluginId);
504
+ lockForPath(pathOrFile, options) {
505
+ return getManager().lock(this.app, pathOrFile, this.pluginId, options?.abortController);
354
506
  }
355
507
  /**
356
508
  * Releases every lock still held by this plugin when the component (and thus the plugin) unloads,
@@ -375,6 +527,9 @@ function isEditorLockedForPath(app, pathOrFile) {
375
527
  function lockEditorForPath(app, pathOrFile) {
376
528
  return getManager().lock(app, pathOrFile, (0, import_plugin_id.getPluginId)());
377
529
  }
530
+ function requestEditorUnlockForPath(app, pathOrFile) {
531
+ getManager().requestUnlock(app, pathOrFile);
532
+ }
378
533
  function unlockEditorForPath(app, pathOrFile) {
379
534
  getManager().unlock(app, pathOrFile, (0, import_plugin_id.getPluginId)());
380
535
  }
@@ -386,6 +541,7 @@ function getManager() {
386
541
  EditorLockComponent,
387
542
  isEditorLockedForPath,
388
543
  lockEditorForPath,
544
+ requestEditorUnlockForPath,
389
545
  unlockEditorForPath
390
546
  });
391
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2VkaXRvci1sb2NrLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogTm90ZS1zY29wZWQsIHJlZmVyZW5jZS1jb3VudGVkIGVkaXRvciBsb2NraW5nLlxuICpcbiAqIFdoZXJlIHtAbGluayB0b2dnbGVFZGl0b3JSZWFkT25seX0gZnJvbSBgLi9lZGl0b3IudHNgIHRvZ2dsZXMgdGhlIHJlYWQtb25seSBzdGF0ZSBvZiBhIHNpbmdsZVxuICoge0BsaW5rIEVkaXRvcn0gaW5zdGFuY2UsIHRoZSBoZWxwZXJzIGhlcmUgbG9jayBhIG5vdGUgYnkgaXRzICoqcGF0aCoqOiB3aGlsZSBhIHBhdGggaXNcbiAqIGxvY2tlZCwgZXZlcnkgY3VycmVudCBhbmQgZnV0dXJlIHtAbGluayBNYXJrZG93blZpZXd9IG9mIHRoYXQgbm90ZSAoaW4gYW55IHdpbmRvdywgaW5jbHVkaW5nXG4gKiBwb3BvdXRzKSBpcyBtYWRlIHJlYWQtb25seSBhbmQgc2hvd3MgYSBsb2NrIGluZGljYXRvciBpbiBpdHMgdGFiIGhlYWRlciwgaXRzIHZpZXcgYWN0aW9uIGJhciwgYW5kXG4gKiB0aGUgc3RhdHVzIGJhciAod2hpbGUgdGhlIG5vdGUgaXMgYWN0aXZlKS4gTG9ja3MgYXJlIHJlZmVyZW5jZS1jb3VudGVkIHBlciBsb2NraW5nIHBsdWdpbiwgc29cbiAqIG5lc3RlZCBvciBjb25jdXJyZW50IG9wZXJhdGlvbnMgb24gdGhlIHNhbWUgbm90ZSBhcmUgc2FmZSBcdTIwMTQgdGhlIG5vdGUgaXMgdW5sb2NrZWQgb25seSB3aGVuIHRoZVxuICogbGFzdCBsb2NrIGlzIHJlbGVhc2VkIFx1MjAxNCBhbmQgdGhlIGluZGljYXRvcnMnIHRvb2x0aXAgbGlzdHMgd2hpY2ggcGx1Z2lucyBjdXJyZW50bHkgaG9sZCBhIGxvY2suXG4gKlxuICogVGhlIGFjcXVpcmVycyByZXR1cm4gYSB7QGxpbmsgRGlzcG9zYWJsZX0sIHNvIHRoZSBwcmVmZXJyZWQgY2FsbCBzdHlsZSBpcyBhIGB1c2luZ2AgZGVjbGFyYXRpb25cbiAqIHRoYXQgcmVsZWFzZXMgYXV0b21hdGljYWxseSBhdCBzY29wZSBleGl0IChpbmNsdWRpbmcgb24gdGhyb3cpOlxuICpcbiAqIGBgYHRzXG4gKiB1c2luZyBfbG9jayA9IGxvY2tFZGl0b3JGb3JQYXRoKGFwcCwgcGF0aCk7XG4gKiAvLyAuLi4gbG9uZy1ydW5uaW5nIHdvcmsgKHByb2Nlc3MsIHByb2Nlc3NGcm9udE1hdHRlciwgbWVyZ2Uvc3BsaXQpIC4uLlxuICogLy8gYXV0by11bmxvY2tlZCBhdCBzY29wZSBleGl0XG4gKiBgYGBcbiAqXG4gKiBUaGUgZXhwbGljaXQge0BsaW5rIHVubG9ja0VkaXRvckZvclBhdGh9IHBhaXIgcmVtYWlucyBhdmFpbGFibGUgZm9yIG5vbi1gdXNpbmdgIGNhbGwgc2l0ZXMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IFZpZXdUeXBlIH0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHtcbiAgTWFya2Rvd25WaWV3LFxuICBzZXRJY29uLFxuICBzZXRUb29sdGlwXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUgeyBQYXRoT3JGaWxlIH0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5cbmltcG9ydCB7XG4gIENhbGxiYWNrRGlzcG9zYWJsZSxcbiAgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3Jcbn0gZnJvbSAnLi4vZGlzcG9zYWJsZS50cyc7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnLi4vZnVuY3Rpb24udHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi4vb2JzaWRpYW4tZGV2LXV0aWxzLXN0YXRlLnRzJztcbmltcG9ydCB7IGFzc2VydE5vbk51bGxhYmxlIH0gZnJvbSAnLi4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuL2NvbXBvbmVudHMvY29tcG9uZW50LWV4LnRzJztcbmltcG9ydCB7IHRvZ2dsZUVkaXRvclJlYWRPbmx5IH0gZnJvbSAnLi9lZGl0b3IudHMnO1xuaW1wb3J0IHsgZ2V0UGF0aCB9IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHsgdCB9IGZyb20gJy4vaTE4bi9pMThuLnRzJztcbmltcG9ydCB7IGdldFBsdWdpbklkIH0gZnJvbSAnLi9wbHVnaW4vcGx1Z2luLWlkLnRzJztcblxuY29uc3QgRURJVE9SX0xPQ0tfU1RBVEVfS0VZID0gJ2VkaXRvckxvY2snO1xuY29uc3QgTE9DS19JQ09OX0lEID0gJ2xvY2snO1xuY29uc3QgTE9DS19JTkRJQ0FUT1JfQ1NTX0NMQVNTID0gJ29ic2lkaWFuLWRldi11dGlscy1sb2NrLWluZGljYXRvcic7XG5jb25zdCBTVEFUVVNfQkFSX0lURU1fQ1NTX0NMQVNTID0gJ3N0YXR1cy1iYXItaXRlbSc7XG5jb25zdCBTVEFUVVNfQkFSX0NTU19TRUxFQ1RPUiA9ICcuc3RhdHVzLWJhcic7XG5cbmludGVyZmFjZSBMb2NrSW5kaWNhdG9ycyB7XG4gIHJlYWRvbmx5IGFjdGlvbkljb25FbDogSFRNTEVsZW1lbnQ7XG4gIHJlYWRvbmx5IHRhYkljb25FbDogSFRNTEVsZW1lbnQgfCBudWxsO1xufVxuXG4vKipcbiAqIFN1YnNjcmliZXMgdG8gdGhlIHdvcmtzcGFjZSBldmVudHMgdGhhdCBzaG91bGQgdHJpZ2dlciBhIGxvY2sgcmVjb25jaWxlLiBJbXBsZW1lbnRlZCBhcyBhXG4gKiB7QGxpbmsgQ29tcG9uZW50RXh9IHNvIHRoZSBzdWJzY3JpcHRpb25zIGFyZSByZWdpc3RlcmVkIG9uIGBsb2FkKClgIGFuZCBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgb25cbiAqIGB1bmxvYWQoKWAsIGluc3RlYWQgb2YgYmVpbmcgdHJhY2tlZCBhbmQgdG9ybiBkb3duIGJ5IGhhbmQuXG4gKi9cbmNsYXNzIEVkaXRvckxvY2tFdmVudHNDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRFeCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwLCBwcml2YXRlIHJlYWRvbmx5IG9uQ2hhbmdlOiAoKSA9PiB2b2lkKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgc3VwZXIub25sb2FkKCk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbignYWN0aXZlLWxlYWYtY2hhbmdlJywgdGhpcy5vbkNoYW5nZSkpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC53b3Jrc3BhY2Uub24oJ2xheW91dC1jaGFuZ2UnLCB0aGlzLm9uQ2hhbmdlKSk7XG4gICAgLy8gU2FtZS1sZWFmIG5hdmlnYXRpb24gdG8gYW5vdGhlciBub3RlIGZpcmVzIG5vIGxlYWYvbGF5b3V0IGNoYW5nZTsgd2l0aG91dCB0aGlzIGl0IHN0YXlzIHJlYWQtb25seS5cbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKCdmaWxlLW9wZW4nLCB0aGlzLm9uQ2hhbmdlKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUcmFja3MgcmVmZXJlbmNlLWNvdW50ZWQsIHBhdGgtc2NvcGVkIGVkaXRvciBsb2NrcyBhbmQga2VlcHMgZXZlcnkgb3BlbiB7QGxpbmsgTWFya2Rvd25WaWV3fSBpblxuICogc3luYyB3aXRoIHRoZSBsb2NrZWQtcGF0aCBzZXQuIEEgc2luZ2xlIGluc3RhbmNlIGxpdmVzIG9uIHRoZSBzaGFyZWQgYG9ic2lkaWFuLWRldi11dGlsc2Agc3RhdGUuXG4gKiBGb3IgZWFjaCBsb2NrZWQgcGF0aCB0aGUgbG9jayBjb3VudCBpcyB0cmFja2VkIHBlciBsb2NraW5nIHBsdWdpbiwgc28gdGhlIGluZGljYXRvcnMgY2FuIHJlcG9ydFxuICogd2hpY2ggcGx1Z2lucyBjdXJyZW50bHkgaG9sZCBhIGxvY2suXG4gKi9cbmNsYXNzIEVkaXRvclBhdGhMb2NrTWFuYWdlciB7XG4gIHByaXZhdGUgZXZlbnRzQ29tcG9uZW50OiBFZGl0b3JMb2NrRXZlbnRzQ29tcG9uZW50IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IGluZGljYXRvcnNCeVZpZXcgPSBuZXcgTWFwPE1hcmtkb3duVmlldywgTG9ja0luZGljYXRvcnM+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9ja0NvdW50QnlQbHVnaW5JZEJ5UGF0aCA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBudW1iZXI+PigpO1xuICBwcml2YXRlIHN0YXR1c0Jhckl0ZW1FbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICBwdWJsaWMgaXNMb2NrZWQoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1BhdGhMb2NrZWQoZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpKTtcbiAgfVxuXG4gIHB1YmxpYyBsb2NrKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlLCBwbHVnaW5JZDogc3RyaW5nKTogRGlzcG9zYWJsZSB7XG4gICAgY29uc3QgcGF0aCA9IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKTtcbiAgICBsZXQgbG9ja0NvdW50QnlQbHVnaW5JZCA9IHRoaXMubG9ja0NvdW50QnlQbHVnaW5JZEJ5UGF0aC5nZXQocGF0aCk7XG4gICAgaWYgKCFsb2NrQ291bnRCeVBsdWdpbklkKSB7XG4gICAgICBsb2NrQ291bnRCeVBsdWdpbklkID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgICAgIHRoaXMubG9ja0NvdW50QnlQbHVnaW5JZEJ5UGF0aC5zZXQocGF0aCwgbG9ja0NvdW50QnlQbHVnaW5JZCk7XG4gICAgfVxuICAgIGxvY2tDb3VudEJ5UGx1Z2luSWQuc2V0KHBsdWdpbklkLCAobG9ja0NvdW50QnlQbHVnaW5JZC5nZXQocGx1Z2luSWQpID8/IDApICsgMSk7XG4gICAgdGhpcy5lbnN1cmVTdWJzY3JpYmVkKGFwcCk7XG4gICAgdGhpcy5yZWNvbmNpbGUoYXBwKTtcblxuICAgIHJldHVybiBuZXcgQ2FsbGJhY2tEaXNwb3NhYmxlKHtcbiAgICAgIGNhbGxiYWNrOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMudW5sb2NrUGF0aChhcHAsIHBhdGgsIHBsdWdpbklkKTtcbiAgICAgIH0sXG4gICAgICBtdWx0aXBsZURpc3Bvc2VCZWhhdmlvcjogTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSWdub3JlXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgdW5sb2NrKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlLCBwbHVnaW5JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy51bmxvY2tQYXRoKGFwcCwgZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpLCBwbHVnaW5JZCk7XG4gIH1cblxuICBwdWJsaWMgdW5sb2NrQWxsRm9yUGx1Z2luKGFwcDogQXBwLCBwbHVnaW5JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBbcGF0aCwgbG9ja0NvdW50QnlQbHVnaW5JZF0gb2YgdGhpcy5sb2NrQ291bnRCeVBsdWdpbklkQnlQYXRoKSB7XG4gICAgICBpZiAobG9ja0NvdW50QnlQbHVnaW5JZC5kZWxldGUocGx1Z2luSWQpICYmIGxvY2tDb3VudEJ5UGx1Z2luSWQuc2l6ZSA9PT0gMCkge1xuICAgICAgICB0aGlzLmxvY2tDb3VudEJ5UGx1Z2luSWRCeVBhdGguZGVsZXRlKHBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnJlY29uY2lsZUFuZENsZWFudXAoYXBwKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlSW5kaWNhdG9ycyh2aWV3OiBNYXJrZG93blZpZXcsIHRvb2x0aXA6IHN0cmluZyk6IExvY2tJbmRpY2F0b3JzIHtcbiAgICBjb25zdCBhY3Rpb25JY29uRWwgPSB2aWV3LmFkZEFjdGlvbihMT0NLX0lDT05fSUQsIHRvb2x0aXAsIG5vb3ApO1xuXG4gICAgbGV0IHRhYkljb25FbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICBjb25zdCB0YWJTdGF0dXNDb250YWluZXJFbCA9IHZpZXcubGVhZi50YWJIZWFkZXJTdGF0dXNDb250YWluZXJFbDtcbiAgICBpZiAodGFiU3RhdHVzQ29udGFpbmVyRWwpIHtcbiAgICAgIHRhYkljb25FbCA9IHRhYlN0YXR1c0NvbnRhaW5lckVsLmNyZWF0ZVNwYW4oeyBjbHM6IExPQ0tfSU5ESUNBVE9SX0NTU19DTEFTUyB9KTtcbiAgICAgIHNldEljb24odGFiSWNvbkVsLCBMT0NLX0lDT05fSUQpO1xuICAgICAgc2V0VG9vbHRpcCh0YWJJY29uRWwsIHRvb2x0aXApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb25JY29uRWwsXG4gICAgICB0YWJJY29uRWxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVTdWJzY3JpYmVkKGFwcDogQXBwKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZXZlbnRzQ29tcG9uZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZXZlbnRzQ29tcG9uZW50ID0gbmV3IEVkaXRvckxvY2tFdmVudHNDb21wb25lbnQoYXBwLCAoKSA9PiB7XG4gICAgICB0aGlzLnJlY29uY2lsZShhcHApO1xuICAgIH0pO1xuICAgIHRoaXMuZXZlbnRzQ29tcG9uZW50LmxvYWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNQYXRoTG9ja2VkKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy5sb2NrQ291bnRCeVBsdWdpbklkQnlQYXRoLmdldChwYXRoKT8uc2l6ZSA/PyAwKSA+IDA7XG4gIH1cblxuICBwcml2YXRlIGxvY2tUb29sdGlwKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxvY2tDb3VudEJ5UGx1Z2luSWQgPSB0aGlzLmxvY2tDb3VudEJ5UGx1Z2luSWRCeVBhdGguZ2V0KHBhdGgpO1xuICAgIC8vIGBsb2NrVG9vbHRpcGAgaXMgb25seSBldmVyIGNhbGxlZCBmb3IgYSBsb2NrZWQgcGF0aCwgc28gdGhlIHBlci1wbHVnaW4gbWFwIGlzIGFsd2F5cyBwcmVzZW50LlxuICAgIGFzc2VydE5vbk51bGxhYmxlKGxvY2tDb3VudEJ5UGx1Z2luSWQpO1xuICAgIGNvbnN0IGhlYWRlciA9IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5lZGl0b3JMb2NrLmxvY2tlZEJ5VG9vbHRpcCk7XG4gICAgY29uc3QgcGx1Z2luTmFtZXMgPSBBcnJheS5mcm9tKGxvY2tDb3VudEJ5UGx1Z2luSWQua2V5cygpKS5tYXAoKHBsdWdpbklkKSA9PiBhcHAucGx1Z2lucy5tYW5pZmVzdHNbcGx1Z2luSWRdPy5uYW1lID8/IHBsdWdpbklkKTtcbiAgICAvLyBBIHJ1bnRpbWUtbGVuZ3RoIGxpc3Qgb2YgcGx1Z2luIG5hbWVzLCBvbmUgcGVyIGxpbmUgdW5kZXIgdGhlIGhlYWRlci5cbiAgICByZXR1cm4gW2hlYWRlciwgLi4ucGx1Z2luTmFtZXNdLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWNvbmNpbGUoYXBwOiBBcHApOiB2b2lkIHtcbiAgICBjb25zdCB2aWV3c1RvTG9jayA9IG5ldyBTZXQ8TWFya2Rvd25WaWV3PigpO1xuICAgIGZvciAoY29uc3QgbGVhZiBvZiBhcHAud29ya3NwYWNlLmdldExlYXZlc09mVHlwZShWaWV3VHlwZS5NYXJrZG93bikpIHtcbiAgICAgIGNvbnN0IHZpZXcgPSBsZWFmLnZpZXc7XG4gICAgICBpZiAoISh2aWV3IGluc3RhbmNlb2YgTWFya2Rvd25WaWV3KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGF0aCA9IHZpZXcuZmlsZT8ucGF0aDtcbiAgICAgIGlmIChwYXRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmlzUGF0aExvY2tlZChwYXRoKSkge1xuICAgICAgICB2aWV3c1RvTG9jay5hZGQodmlldyk7XG4gICAgICAgIGNvbnN0IHRvb2x0aXAgPSB0aGlzLmxvY2tUb29sdGlwKGFwcCwgcGF0aCk7XG4gICAgICAgIC8vIFJlLWFwcGx5IHRoZSByZWFkLW9ubHkgdG9nZ2xlIG9uIGV2ZXJ5IHJlY29uY2lsZSwgbm90IG9ubHkgdGhlIGZpcnN0IHRpbWUgYSB2aWV3IGlzIHRyYWNrZWQuXG4gICAgICAgIC8vIFRoZSB0b2dnbGUgaXMgaWRlbXBvdGVudCwgc28gcmUtYXBwbHlpbmcgdG8gYW4gYWxyZWFkeS1sb2NrZWQgdmlldyBpcyBjaGVhcC5cbiAgICAgICAgLy8gQSB2aWV3IG9wZW5lZCBhZnRlciB0aGUgbG9jayBpcyByZWNvbmNpbGVkIHN5bmNocm9ub3VzbHksIGJlZm9yZSBpdHMgQ29kZU1pcnJvciBpcyByZWFkeS5cbiAgICAgICAgLy8gSXRzIGZpcnN0IHRvZ2dsZSBpcyB0aGVyZWZvcmUgYSBuby1vcDsgcmUtYXBwbHlpbmcgbWFrZXMgdGhlIGxvY2sgdGFrZSBob2xkIG9uY2UgaXQgc2V0dGxlcy5cbiAgICAgICAgdG9nZ2xlRWRpdG9yUmVhZE9ubHkodmlldy5lZGl0b3IsIHRydWUpO1xuICAgICAgICBjb25zdCBpbmRpY2F0b3JzID0gdGhpcy5pbmRpY2F0b3JzQnlWaWV3LmdldCh2aWV3KTtcbiAgICAgICAgaWYgKGluZGljYXRvcnMpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUluZGljYXRvclRvb2x0aXBzKGluZGljYXRvcnMsIHRvb2x0aXApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuaW5kaWNhdG9yc0J5Vmlldy5zZXQodmlldywgdGhpcy5jcmVhdGVJbmRpY2F0b3JzKHZpZXcsIHRvb2x0aXApKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3ZpZXcsIGluZGljYXRvcnNdIG9mIHRoaXMuaW5kaWNhdG9yc0J5Vmlldykge1xuICAgICAgaWYgKCF2aWV3c1RvTG9jay5oYXModmlldykpIHtcbiAgICAgICAgdG9nZ2xlRWRpdG9yUmVhZE9ubHkodmlldy5lZGl0b3IsIGZhbHNlKTtcbiAgICAgICAgaW5kaWNhdG9ycy5hY3Rpb25JY29uRWwucmVtb3ZlKCk7XG4gICAgICAgIGluZGljYXRvcnMudGFiSWNvbkVsPy5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy5pbmRpY2F0b3JzQnlWaWV3LmRlbGV0ZSh2aWV3KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVN0YXR1c0JhcihhcHApO1xuICB9XG5cbiAgcHJpdmF0ZSByZWNvbmNpbGVBbmRDbGVhbnVwKGFwcDogQXBwKTogdm9pZCB7XG4gICAgdGhpcy5yZWNvbmNpbGUoYXBwKTtcbiAgICBpZiAodGhpcy5sb2NrQ291bnRCeVBsdWdpbklkQnlQYXRoLnNpemUgPT09IDApIHtcbiAgICAgIHRoaXMuZXZlbnRzQ29tcG9uZW50Py51bmxvYWQoKTtcbiAgICAgIHRoaXMuZXZlbnRzQ29tcG9uZW50ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdW5sb2NrUGF0aChhcHA6IEFwcCwgcGF0aDogc3RyaW5nLCBwbHVnaW5JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbG9ja0NvdW50QnlQbHVnaW5JZCA9IHRoaXMubG9ja0NvdW50QnlQbHVnaW5JZEJ5UGF0aC5nZXQocGF0aCk7XG4gICAgaWYgKCFsb2NrQ291bnRCeVBsdWdpbklkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY291bnQgPSBsb2NrQ291bnRCeVBsdWdpbklkLmdldChwbHVnaW5JZCkgPz8gMDtcbiAgICBpZiAoY291bnQgPD0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChjb3VudCA9PT0gMSkge1xuICAgICAgbG9ja0NvdW50QnlQbHVnaW5JZC5kZWxldGUocGx1Z2luSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2NrQ291bnRCeVBsdWdpbklkLnNldChwbHVnaW5JZCwgY291bnQgLSAxKTtcbiAgICB9XG5cbiAgICBpZiAobG9ja0NvdW50QnlQbHVnaW5JZC5zaXplID09PSAwKSB7XG4gICAgICB0aGlzLmxvY2tDb3VudEJ5UGx1Z2luSWRCeVBhdGguZGVsZXRlKHBhdGgpO1xuICAgIH1cblxuICAgIHRoaXMucmVjb25jaWxlQW5kQ2xlYW51cChhcHApO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVJbmRpY2F0b3JUb29sdGlwcyhpbmRpY2F0b3JzOiBMb2NrSW5kaWNhdG9ycywgdG9vbHRpcDogc3RyaW5nKTogdm9pZCB7XG4gICAgc2V0VG9vbHRpcChpbmRpY2F0b3JzLmFjdGlvbkljb25FbCwgdG9vbHRpcCk7XG4gICAgaWYgKGluZGljYXRvcnMudGFiSWNvbkVsKSB7XG4gICAgICBzZXRUb29sdGlwKGluZGljYXRvcnMudGFiSWNvbkVsLCB0b29sdGlwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVN0YXR1c0JhcihhcHA6IEFwcCk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2ZVZpZXcgPSBhcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcbiAgICBjb25zdCBhY3RpdmVQYXRoID0gYWN0aXZlVmlldz8uZmlsZT8ucGF0aDtcbiAgICBjb25zdCBpc0FjdGl2ZUxvY2tlZCA9IGFjdGl2ZVBhdGggIT09IHVuZGVmaW5lZCAmJiB0aGlzLmlzUGF0aExvY2tlZChhY3RpdmVQYXRoKTtcblxuICAgIGlmICghaXNBY3RpdmVMb2NrZWQgfHwgIWFjdGl2ZVZpZXcpIHtcbiAgICAgIHRoaXMuc3RhdHVzQmFySXRlbUVsPy5yZW1vdmUoKTtcbiAgICAgIHRoaXMuc3RhdHVzQmFySXRlbUVsID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc3RhdHVzQmFySXRlbUVsKSB7XG4gICAgICBjb25zdCBzdGF0dXNCYXJFbCA9IGFjdGl2ZVZpZXcuY29udGFpbmVyRWwub3duZXJEb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFNUQVRVU19CQVJfQ1NTX1NFTEVDVE9SKTtcbiAgICAgIGlmICghc3RhdHVzQmFyRWwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5zdGF0dXNCYXJJdGVtRWwgPSBzdGF0dXNCYXJFbC5jcmVhdGVEaXYoeyBjbHM6IFtTVEFUVVNfQkFSX0lURU1fQ1NTX0NMQVNTLCBMT0NLX0lORElDQVRPUl9DU1NfQ0xBU1NdIH0pO1xuICAgICAgc2V0SWNvbih0aGlzLnN0YXR1c0Jhckl0ZW1FbCwgTE9DS19JQ09OX0lEKTtcbiAgICB9XG5cbiAgICBzZXRUb29sdGlwKHRoaXMuc3RhdHVzQmFySXRlbUVsLCB0aGlzLmxvY2tUb29sdGlwKGFwcCwgYWN0aXZlUGF0aCkpO1xuICB9XG59XG5cbi8qKlxuICogQSBwZXItcGx1Z2luIGhhbmRsZSBmb3Igbm90ZS1zY29wZWQgZWRpdG9yIGxvY2tpbmcuIEFkZCBpdCBhcyBhIGNoaWxkIG9mIHlvdXIgcGx1Z2luXG4gKiAoYHRoaXMuYWRkQ2hpbGQobmV3IEVkaXRvckxvY2tDb21wb25lbnQodGhpcy5hcHApKWApIHNvIHRoYXQgYW55IGxvY2tzIGl0IHN0aWxsIGhvbGRzIGFyZSByZWxlYXNlZFxuICogYXV0b21hdGljYWxseSB3aGVuIHRoZSBwbHVnaW4gdW5sb2FkcyBcdTIwMTQgYSBub3RlIGNhbiBuZXZlciBiZSBsZWZ0IHN0dWNrIHJlYWQtb25seSBiZWNhdXNlIHRoZVxuICogcGx1Z2luIHRoYXQgbG9ja2VkIGl0IHdhcyBkaXNhYmxlZCBvciByZWxvYWRlZCBtaWQtb3BlcmF0aW9uLlxuICpcbiAqIExvY2tzIGFyZSByZWZlcmVuY2UtY291bnRlZCBhbmQgYXR0cmlidXRlZCB0byB0aGlzIHBsdWdpbiwgc28gdGhlIGxvY2sgaW5kaWNhdG9ycycgdG9vbHRpcCBuYW1lc1xuICogaXQgYW1vbmcgdGhlIHBsdWdpbnMgY3VycmVudGx5IGhvbGRpbmcgYSBsb2NrLlxuICovXG5leHBvcnQgY2xhc3MgRWRpdG9yTG9ja0NvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGVkaXRvci1sb2NrIGhhbmRsZSBvd25lZCBieSBhIHBsdWdpbi5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwbHVnaW5JZCAtIFRoZSBpZCBvZiB0aGUgb3duaW5nIHBsdWdpbi4gRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgcGx1Z2luIGNvbnRleHQncyBpZDsgcGFzc1xuICAgKiBpdCBleHBsaWNpdGx5IChlLmcuIGZyb20gYSBwbHVnaW4ncyBgbWFuaWZlc3QuaWRgKSB3aGVuIGNvbnN0cnVjdGluZyBiZWZvcmUgdGhlIHBsdWdpbiBjb250ZXh0IGlzXG4gICAqIGluaXRpYWxpemVkLCBzdWNoIGFzIGluc2lkZSBgUGx1Z2luQmFzZS5vbmxvYWRgLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW5JZDogc3RyaW5nID0gZ2V0UGx1Z2luSWQoKSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hcHAgPSBhcHA7XG4gICAgdGhpcy5wbHVnaW5JZCA9IHBsdWdpbklkO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoIGlzIGN1cnJlbnRseSBsb2NrZWQgYnkgYW55IHBsdWdpbi5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG5vdGUgaGFzIGF0IGxlYXN0IG9uZSBhY3RpdmUgbG9jaywgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqL1xuICBwdWJsaWMgaXNMb2NrZWRGb3JQYXRoKHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZ2V0TWFuYWdlcigpLmlzTG9ja2VkKHRoaXMuYXBwLCBwYXRoT3JGaWxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2NrcyB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCBvbiBiZWhhbGYgb2YgdGhpcyBwbHVnaW4sIG1ha2luZyBpdCByZWFkLW9ubHkgaW4gZXZlcnkgY3VycmVudFxuICAgKiBhbmQgZnV0dXJlIHtAbGluayBNYXJrZG93blZpZXd9IHVudGlsIHRoZSBsb2NrIGlzIHJlbGVhc2VkLiBSZWZlcmVuY2UtY291bnRlZDogYmFsYW5jZSBlYWNoIGNhbGxcbiAgICogd2l0aCBhIGRpc3Bvc2Ugb2YgdGhlIHJldHVybmVkIHtAbGluayBEaXNwb3NhYmxlfSAoaWRlYWxseSB2aWEgYHVzaW5nYCkgb3Ige0BsaW5rIHVubG9ja0ZvclBhdGh9LlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gbG9jay5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgRGlzcG9zYWJsZX0gdGhhdCByZWxlYXNlcyB0aGlzIGxvY2sgd2hlbiBkaXNwb3NlZC4gRGlzcG9zaW5nIG1vcmUgdGhhbiBvbmNlIGlzIGEgbm8tb3AuXG4gICAqL1xuICBwdWJsaWMgbG9ja0ZvclBhdGgocGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IERpc3Bvc2FibGUge1xuICAgIHJldHVybiBnZXRNYW5hZ2VyKCkubG9jayh0aGlzLmFwcCwgcGF0aE9yRmlsZSwgdGhpcy5wbHVnaW5JZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZXMgZXZlcnkgbG9jayBzdGlsbCBoZWxkIGJ5IHRoaXMgcGx1Z2luIHdoZW4gdGhlIGNvbXBvbmVudCAoYW5kIHRodXMgdGhlIHBsdWdpbikgdW5sb2FkcyxcbiAgICogc28gbm8gbm90ZSBpcyBsZWZ0IHN0dWNrIHJlYWQtb25seSBieSBhbiBvcGVyYXRpb24gdGhhdCBuZXZlciBjb21wbGV0ZWQuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb251bmxvYWQoKTogdm9pZCB7XG4gICAgZ2V0TWFuYWdlcigpLnVubG9ja0FsbEZvclBsdWdpbih0aGlzLmFwcCwgdGhpcy5wbHVnaW5JZCk7XG4gICAgc3VwZXIub251bmxvYWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlcyBvbmUgbG9jayBwcmV2aW91c2x5IGFjcXVpcmVkIGZvciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCB2aWEge0BsaW5rIGxvY2tGb3JQYXRofS5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIHVubG9jay5cbiAgICovXG4gIHB1YmxpYyB1bmxvY2tGb3JQYXRoKHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiB2b2lkIHtcbiAgICBnZXRNYW5hZ2VyKCkudW5sb2NrKHRoaXMuYXBwLCBwYXRoT3JGaWxlLCB0aGlzLnBsdWdpbklkKTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoIGlzIGN1cnJlbnRseSBsb2NrZWQuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG5vdGUgaGFzIGF0IGxlYXN0IG9uZSBhY3RpdmUgbG9jaywgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0VkaXRvckxvY2tlZEZvclBhdGgoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldE1hbmFnZXIoKS5pc0xvY2tlZChhcHAsIHBhdGhPckZpbGUpO1xufVxuXG4vKipcbiAqIExvY2tzIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoLCBtYWtpbmcgaXQgcmVhZC1vbmx5IGluIGV2ZXJ5IGN1cnJlbnQgYW5kIGZ1dHVyZVxuICoge0BsaW5rIE1hcmtkb3duVmlld30gdW50aWwgdGhlIGxvY2sgaXMgcmVsZWFzZWQsIGFuZCBzaG93aW5nIGEgbG9jayBpbmRpY2F0b3IgaW4gdGhlIHRhYiBoZWFkZXIsXG4gKiB2aWV3IGFjdGlvbiBiYXIsIGFuZCAod2hpbGUgYWN0aXZlKSB0aGUgc3RhdHVzIGJhci4gVGhlIGluZGljYXRvcnMnIHRvb2x0aXAgbGlzdHMgdGhlIHBsdWdpbnNcbiAqIHRoYXQgY3VycmVudGx5IGhvbGQgYSBsb2NrIG9uIHRoZSBub3RlLlxuICpcbiAqIFRoZSBsb2NrIGlzIHJlZmVyZW5jZS1jb3VudGVkIHBlciBjYWxsaW5nIHBsdWdpbjogZWFjaCBjYWxsIG11c3QgYmUgYmFsYW5jZWQgYnkgZXhhY3RseSBvbmVcbiAqIHJlbGVhc2UgKGVpdGhlciBkaXNwb3NpbmcgdGhlIHJldHVybmVkIHtAbGluayBEaXNwb3NhYmxlfSBcdTIwMTQgaWRlYWxseSB2aWEgYSBgdXNpbmdgIGRlY2xhcmF0aW9uIFx1MjAxNCBvclxuICogYSBtYXRjaGluZyB7QGxpbmsgdW5sb2NrRWRpdG9yRm9yUGF0aH0gY2FsbCkuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gbG9jay5cbiAqIEByZXR1cm5zIEEge0BsaW5rIERpc3Bvc2FibGV9IHRoYXQgcmVsZWFzZXMgdGhpcyBsb2NrIHdoZW4gZGlzcG9zZWQuIERpc3Bvc2luZyBtb3JlIHRoYW4gb25jZSBpcyBhIG5vLW9wLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9ja0VkaXRvckZvclBhdGgoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBEaXNwb3NhYmxlIHtcbiAgcmV0dXJuIGdldE1hbmFnZXIoKS5sb2NrKGFwcCwgcGF0aE9yRmlsZSwgZ2V0UGx1Z2luSWQoKSk7XG59XG5cbi8qKlxuICogUmVsZWFzZXMgb25lIGxvY2sgcHJldmlvdXNseSBhY3F1aXJlZCBmb3IgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggdmlhIHtAbGluayBsb2NrRWRpdG9yRm9yUGF0aH0uXG4gKlxuICogV2hlbiB0aGUgbGFzdCBsb2NrIGlzIHJlbGVhc2VkIHRoZSBub3RlIGJlY29tZXMgZnVsbHkgZWRpdGFibGUgYWdhaW4gYW5kIGl0cyBsb2NrIGluZGljYXRvcnMgYXJlXG4gKiByZW1vdmVkLiBDYWxsaW5nIHRoaXMgd2hlbiB0aGUgbm90ZSBpcyBub3QgbG9ja2VkIGlzIGEgbm8tb3AuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gdW5sb2NrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5sb2NrRWRpdG9yRm9yUGF0aChhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IHZvaWQge1xuICBnZXRNYW5hZ2VyKCkudW5sb2NrKGFwcCwgcGF0aE9yRmlsZSwgZ2V0UGx1Z2luSWQoKSk7XG59XG5cbmZ1bmN0aW9uIGdldE1hbmFnZXIoKTogRWRpdG9yUGF0aExvY2tNYW5hZ2VyIHtcbiAgcmV0dXJuIGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZTxFZGl0b3JQYXRoTG9ja01hbmFnZXI+KEVESVRPUl9MT0NLX1NUQVRFX0tFWSwgbmV3IEVkaXRvclBhdGhMb2NrTWFuYWdlcigpKS52YWx1ZTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7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
547
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2VkaXRvci1sb2NrLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogTm90ZS1zY29wZWQsIHJlZmVyZW5jZS1jb3VudGVkIGVkaXRvciBsb2NraW5nLlxuICpcbiAqIFdoZXJlIHtAbGluayB0b2dnbGVFZGl0b3JSZWFkT25seX0gZnJvbSBgLi9lZGl0b3IudHNgIHRvZ2dsZXMgdGhlIHJlYWQtb25seSBzdGF0ZSBvZiBhIHNpbmdsZVxuICoge0BsaW5rIEVkaXRvcn0gaW5zdGFuY2UsIHRoZSBoZWxwZXJzIGhlcmUgbG9jayBhIG5vdGUgYnkgaXRzICoqcGF0aCoqOiB3aGlsZSBhIHBhdGggaXNcbiAqIGxvY2tlZCwgZXZlcnkgY3VycmVudCBhbmQgZnV0dXJlIHtAbGluayBNYXJrZG93blZpZXd9IG9mIHRoYXQgbm90ZSAoaW4gYW55IHdpbmRvdywgaW5jbHVkaW5nXG4gKiBwb3BvdXRzKSBpcyBtYWRlIHJlYWQtb25seSBhbmQgc2hvd3MgYSBsb2NrIGluZGljYXRvciBpbiBpdHMgdGFiIGhlYWRlciwgaXRzIHZpZXcgYWN0aW9uIGJhciwgYW5kXG4gKiB0aGUgc3RhdHVzIGJhciAod2hpbGUgdGhlIG5vdGUgaXMgYWN0aXZlKS4gTG9ja3MgYXJlIHJlZmVyZW5jZS1jb3VudGVkIHBlciBsb2NraW5nIHBsdWdpbiwgc29cbiAqIG5lc3RlZCBvciBjb25jdXJyZW50IG9wZXJhdGlvbnMgb24gdGhlIHNhbWUgbm90ZSBhcmUgc2FmZSBcdTIwMTQgdGhlIG5vdGUgaXMgdW5sb2NrZWQgb25seSB3aGVuIHRoZVxuICogbGFzdCBsb2NrIGlzIHJlbGVhc2VkIFx1MjAxNCBhbmQgdGhlIGluZGljYXRvcnMnIHRvb2x0aXAgbGlzdHMgd2hpY2ggcGx1Z2lucyBjdXJyZW50bHkgaG9sZCBhIGxvY2suXG4gKlxuICogVGhlIGFjcXVpcmVycyByZXR1cm4gYSB7QGxpbmsgRGlzcG9zYWJsZX0sIHNvIHRoZSBwcmVmZXJyZWQgY2FsbCBzdHlsZSBpcyBhIGB1c2luZ2AgZGVjbGFyYXRpb25cbiAqIHRoYXQgcmVsZWFzZXMgYXV0b21hdGljYWxseSBhdCBzY29wZSBleGl0IChpbmNsdWRpbmcgb24gdGhyb3cpOlxuICpcbiAqIGBgYHRzXG4gKiB1c2luZyBfbG9jayA9IGxvY2tFZGl0b3JGb3JQYXRoKGFwcCwgcGF0aCk7XG4gKiAvLyAuLi4gbG9uZy1ydW5uaW5nIHdvcmsgKHByb2Nlc3MsIHByb2Nlc3NGcm9udE1hdHRlciwgbWVyZ2Uvc3BsaXQpIC4uLlxuICogLy8gYXV0by11bmxvY2tlZCBhdCBzY29wZSBleGl0XG4gKiBgYGBcbiAqXG4gKiBUaGUgZXhwbGljaXQge0BsaW5rIHVubG9ja0VkaXRvckZvclBhdGh9IHBhaXIgcmVtYWlucyBhdmFpbGFibGUgZm9yIG5vbi1gdXNpbmdgIGNhbGwgc2l0ZXMuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIFRBYnN0cmFjdEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBWaWV3VHlwZSB9IGZyb20gJ0BvYnNpZGlhbi10eXBpbmdzL29ic2lkaWFuLXB1YmxpYy1sYXRlc3QvaW1wbGVtZW50YXRpb25zJztcbmltcG9ydCB7XG4gIE1hcmtkb3duVmlldyxcbiAgTWVudSxcbiAgc2V0SWNvbixcbiAgc2V0VG9vbHRpcCxcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFBhdGhPckZpbGUgfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcblxuaW1wb3J0IHsgY29udmVydEFzeW5jVG9TeW5jIH0gZnJvbSAnLi4vYXN5bmMudHMnO1xuaW1wb3J0IHtcbiAgQ2FsbGJhY2tEaXNwb3NhYmxlLFxuICBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvclxufSBmcm9tICcuLi9kaXNwb3NhYmxlLnRzJztcbmltcG9ydCB7IG5vb3AgfSBmcm9tICcuLi9mdW5jdGlvbi50cyc7XG5pbXBvcnQgeyBhcHBlbmRDb2RlQmxvY2sgfSBmcm9tICcuLi9odG1sLWVsZW1lbnQudHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi4vb2JzaWRpYW4tZGV2LXV0aWxzLXN0YXRlLnRzJztcbmltcG9ydCB7IGFzc2VydE5vbk51bGxhYmxlIH0gZnJvbSAnLi4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuL2NvbXBvbmVudHMvY29tcG9uZW50LWV4LnRzJztcbmltcG9ydCB7IHRvZ2dsZUVkaXRvclJlYWRPbmx5IH0gZnJvbSAnLi9lZGl0b3IudHMnO1xuaW1wb3J0IHsgZ2V0UGF0aCB9IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHsgdCB9IGZyb20gJy4vaTE4bi9pMThuLnRzJztcbmltcG9ydCB7IGNvbmZpcm0gfSBmcm9tICcuL21vZGFscy9jb25maXJtLnRzJztcbmltcG9ydCB7IGdldFBsdWdpbklkIH0gZnJvbSAnLi9wbHVnaW4vcGx1Z2luLWlkLnRzJztcblxuY29uc3QgQkVFUF9EVVJBVElPTl9TRUNPTkRTID0gMC4wODtcbmNvbnN0IEJFRVBfRlJFUVVFTkNZX0haID0gNjYwO1xuY29uc3QgQkVFUF9HQUlOID0gMC4wNTtcbmNvbnN0IEJFRVBfVEhST1RUTEVfTUlMTElTRUNPTkRTID0gMjAwO1xuY29uc3QgRURJVE9SX0xPQ0tfU1RBVEVfS0VZID0gJ2VkaXRvckxvY2snO1xuY29uc3QgTE9DS19JQ09OX0lEID0gJ2xvY2snO1xuY29uc3QgTE9DS19JTkRJQ0FUT1JfQ1NTX0NMQVNTID0gJ29ic2lkaWFuLWRldi11dGlscy1sb2NrLWluZGljYXRvcic7XG5jb25zdCBMT0NLX0lORElDQVRPUl9GTEFTSF9DU1NfQ0xBU1MgPSAnb2JzaWRpYW4tZGV2LXV0aWxzLWxvY2staW5kaWNhdG9yLWZsYXNoJztcbmNvbnN0IFNUQVRVU19CQVJfSVRFTV9DU1NfQ0xBU1MgPSAnc3RhdHVzLWJhci1pdGVtJztcbmNvbnN0IFNUQVRVU19CQVJfQ1NTX1NFTEVDVE9SID0gJy5zdGF0dXMtYmFyJztcbmNvbnN0IFVOTE9DS19JQ09OX0lEID0gJ3VubG9jayc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIEVkaXRvckxvY2tDb21wb25lbnQubG9ja0ZvclBhdGh9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVkaXRvckxvY2tDb21wb25lbnRMb2NrRm9yUGF0aE9wdGlvbnMge1xuICAvKipcbiAgICogQW4gb3B0aW9uYWwge0BsaW5rIEFib3J0Q29udHJvbGxlcn0gYXNzb2NpYXRlZCB3aXRoIHRoZSBsb2NrLiBXaGVuIHRoZSBsb2NrIGluZGljYXRvciBpc1xuICAgKiByaWdodC1jbGlja2VkIGFuZCB0aGUgdXNlciBjb25maXJtcyBhbiB1bmxvY2sgKG9yIHtAbGluayByZXF1ZXN0RWRpdG9yVW5sb2NrRm9yUGF0aH0gaXMgY2FsbGVkIGZvclxuICAgKiB0aGUgcGF0aCksIHRoaXMgY29udHJvbGxlciBpcyBhYm9ydGVkIHNvIHRoZSBvcGVyYXRpb24gaG9sZGluZyB0aGUgbG9jayBjYW4gY2FuY2VsIGl0c2VsZiBhbmRcbiAgICogcmVsZWFzZSB0aGUgbG9jayBpbiBpdHMgb3duIGNsZWFudXAuXG4gICAqL1xuICByZWFkb25seSBhYm9ydENvbnRyb2xsZXI/OiBBYm9ydENvbnRyb2xsZXI7XG59XG5cbi8qKlxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVycyBmb3Ige0BsaW5rIEVkaXRvckxvY2tFdmVudHNDb21wb25lbnR9LlxuICovXG5pbnRlcmZhY2UgRWRpdG9yTG9ja0V2ZW50c0NvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIG9uQ2hhbmdlKHRoaXM6IHZvaWQpOiB2b2lkO1xuICBvbkZpbGVNZW51KHRoaXM6IHZvaWQsIG1lbnU6IE1lbnUsIGZpbGU6IFRBYnN0cmFjdEZpbGUpOiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgTG9ja0luZGljYXRvcnMge1xuICByZWFkb25seSBhY3Rpb25JY29uRWw6IEhUTUxFbGVtZW50O1xuICBkaXNwb3NlVHlwZUxpc3RlbmVyKCk6IHZvaWQ7XG4gIHJlYWRvbmx5IHRhYkljb25FbDogSFRNTEVsZW1lbnQgfCBudWxsO1xufVxuXG4vKipcbiAqIFN1YnNjcmliZXMgdG8gdGhlIHdvcmtzcGFjZSBldmVudHMgdGhhdCBzaG91bGQgdHJpZ2dlciBhIGxvY2sgcmVjb25jaWxlIChhbmQgdGhlIGZpbGUgY29udGV4dC1tZW51XG4gKiBldmVudCB0aGF0IG9mZmVycyBhbiBcIlVubG9ja1wiIGl0ZW0pLiBJbXBsZW1lbnRlZCBhcyBhIHtAbGluayBDb21wb25lbnRFeH0gc28gdGhlIHN1YnNjcmlwdGlvbnMgYXJlXG4gKiByZWdpc3RlcmVkIG9uIGBsb2FkKClgIGFuZCBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgb24gYHVubG9hZCgpYCwgaW5zdGVhZCBvZiBiZWluZyB0cmFja2VkIGJ5IGhhbmQuXG4gKi9cbmNsYXNzIEVkaXRvckxvY2tFdmVudHNDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRFeCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25DaGFuZ2U6ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25GaWxlTWVudTogKG1lbnU6IE1lbnUsIGZpbGU6IFRBYnN0cmFjdEZpbGUpID0+IHZvaWQ7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogRWRpdG9yTG9ja0V2ZW50c0NvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5vbkNoYW5nZSA9IHBhcmFtcy5vbkNoYW5nZTtcbiAgICB0aGlzLm9uRmlsZU1lbnUgPSBwYXJhbXMub25GaWxlTWVudTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgc3VwZXIub25sb2FkKCk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbignYWN0aXZlLWxlYWYtY2hhbmdlJywgdGhpcy5vbkNoYW5nZSkpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC53b3Jrc3BhY2Uub24oJ2xheW91dC1jaGFuZ2UnLCB0aGlzLm9uQ2hhbmdlKSk7XG4gICAgLy8gU2FtZS1sZWFmIG5hdmlnYXRpb24gdG8gYW5vdGhlciBub3RlIGZpcmVzIG5vIGxlYWYvbGF5b3V0IGNoYW5nZTsgd2l0aG91dCB0aGlzIGl0IHN0YXlzIHJlYWQtb25seS5cbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKCdmaWxlLW9wZW4nLCB0aGlzLm9uQ2hhbmdlKSk7XG4gICAgLy8gQWRkcyBhbiBcIlVubG9ja1wiIGl0ZW0gdG8gYSBsb2NrZWQgbm90ZSdzIHRhYi9maWxlIGNvbnRleHQgbWVudSAoYWxvbmdzaWRlIHRoZSBpbmRpY2F0b3IgbWVudXMpLlxuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC53b3Jrc3BhY2Uub24oJ2ZpbGUtbWVudScsIHRoaXMub25GaWxlTWVudSkpO1xuICB9XG59XG5cbi8qKlxuICogVHJhY2tzIHJlZmVyZW5jZS1jb3VudGVkLCBwYXRoLXNjb3BlZCBlZGl0b3IgbG9ja3MgYW5kIGtlZXBzIGV2ZXJ5IG9wZW4ge0BsaW5rIE1hcmtkb3duVmlld30gaW5cbiAqIHN5bmMgd2l0aCB0aGUgbG9ja2VkLXBhdGggc2V0LiBBIHNpbmdsZSBpbnN0YW5jZSBsaXZlcyBvbiB0aGUgc2hhcmVkIGBvYnNpZGlhbi1kZXYtdXRpbHNgIHN0YXRlLlxuICogRm9yIGVhY2ggbG9ja2VkIHBhdGggdGhlIGxvY2sgY291bnQgaXMgdHJhY2tlZCBwZXIgbG9ja2luZyBwbHVnaW4sIHNvIHRoZSBpbmRpY2F0b3JzIGNhbiByZXBvcnRcbiAqIHdoaWNoIHBsdWdpbnMgY3VycmVudGx5IGhvbGQgYSBsb2NrLlxuICovXG5jbGFzcyBFZGl0b3JQYXRoTG9ja01hbmFnZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGFib3J0Q29udHJvbGxlcnNCeVBhdGggPSBuZXcgTWFwPHN0cmluZywgU2V0PEFib3J0Q29udHJvbGxlcj4+KCk7XG4gIHByaXZhdGUgYXVkaW9Db250ZXh0OiBBdWRpb0NvbnRleHQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBldmVudHNDb21wb25lbnQ6IEVkaXRvckxvY2tFdmVudHNDb21wb25lbnQgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5kaWNhdG9yc0J5VmlldyA9IG5ldyBNYXA8TWFya2Rvd25WaWV3LCBMb2NrSW5kaWNhdG9ycz4oKTtcbiAgcHJpdmF0ZSBsYXN0QmVlcE1pbGxpc2Vjb25kcyA9IDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9ja0NvdW50QnlQbHVnaW5JZEJ5UGF0aCA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBudW1iZXI+PigpO1xuICBwcml2YXRlIHN0YXR1c0Jhckl0ZW1FbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICBwdWJsaWMgaXNMb2NrZWQoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1BhdGhMb2NrZWQoZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpKTtcbiAgfVxuXG4gIHB1YmxpYyBsb2NrKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlLCBwbHVnaW5JZDogc3RyaW5nLCBhYm9ydENvbnRyb2xsZXI/OiBBYm9ydENvbnRyb2xsZXIpOiBEaXNwb3NhYmxlIHtcbiAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpO1xuICAgIGxldCBsb2NrQ291bnRCeVBsdWdpbklkID0gdGhpcy5sb2NrQ291bnRCeVBsdWdpbklkQnlQYXRoLmdldChwYXRoKTtcbiAgICBpZiAoIWxvY2tDb3VudEJ5UGx1Z2luSWQpIHtcbiAgICAgIGxvY2tDb3VudEJ5UGx1Z2luSWQgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgICAgdGhpcy5sb2NrQ291bnRCeVBsdWdpbklkQnlQYXRoLnNldChwYXRoLCBsb2NrQ291bnRCeVBsdWdpbklkKTtcbiAgICB9XG4gICAgbG9ja0NvdW50QnlQbHVnaW5JZC5zZXQocGx1Z2luSWQsIChsb2NrQ291bnRCeVBsdWdpbklkLmdldChwbHVnaW5JZCkgPz8gMCkgKyAxKTtcbiAgICBpZiAoYWJvcnRDb250cm9sbGVyKSB7XG4gICAgICBsZXQgYWJvcnRDb250cm9sbGVycyA9IHRoaXMuYWJvcnRDb250cm9sbGVyc0J5UGF0aC5nZXQocGF0aCk7XG4gICAgICBpZiAoIWFib3J0Q29udHJvbGxlcnMpIHtcbiAgICAgICAgYWJvcnRDb250cm9sbGVycyA9IG5ldyBTZXQ8QWJvcnRDb250cm9sbGVyPigpO1xuICAgICAgICB0aGlzLmFib3J0Q29udHJvbGxlcnNCeVBhdGguc2V0KHBhdGgsIGFib3J0Q29udHJvbGxlcnMpO1xuICAgICAgfVxuICAgICAgYWJvcnRDb250cm9sbGVycy5hZGQoYWJvcnRDb250cm9sbGVyKTtcbiAgICB9XG4gICAgdGhpcy5lbnN1cmVTdWJzY3JpYmVkKGFwcCk7XG4gICAgdGhpcy5yZWNvbmNpbGUoYXBwKTtcblxuICAgIHJldHVybiBuZXcgQ2FsbGJhY2tEaXNwb3NhYmxlKHtcbiAgICAgIGNhbGxiYWNrOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChhYm9ydENvbnRyb2xsZXIpIHtcbiAgICAgICAgICBjb25zdCBhYm9ydENvbnRyb2xsZXJzID0gdGhpcy5hYm9ydENvbnRyb2xsZXJzQnlQYXRoLmdldChwYXRoKTtcbiAgICAgICAgICAvLyBUaGUgc2V0IHdhcyBjcmVhdGVkIHdoZW4gdGhpcyBsb2NrIGFkZGVkIGl0cyBjb250cm9sbGVyIGFuZCBpcyBvbmx5IHJlbW92ZWQgaGVyZS5cbiAgICAgICAgICAvLyBJdCBpcyB0aGVyZWZvcmUgYWx3YXlzIHByZXNlbnQgd2hpbGUgdGhpcyAoc2luZ2xlLXJ1bikgZGlzcG9zYWJsZSBjYWxsYmFjayBleGVjdXRlcy5cbiAgICAgICAgICBhc3NlcnROb25OdWxsYWJsZShhYm9ydENvbnRyb2xsZXJzKTtcbiAgICAgICAgICBhYm9ydENvbnRyb2xsZXJzLmRlbGV0ZShhYm9ydENvbnRyb2xsZXIpO1xuICAgICAgICAgIGlmIChhYm9ydENvbnRyb2xsZXJzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuYWJvcnRDb250cm9sbGVyc0J5UGF0aC5kZWxldGUocGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudW5sb2NrUGF0aChhcHAsIHBhdGgsIHBsdWdpbklkKTtcbiAgICAgIH0sXG4gICAgICBtdWx0aXBsZURpc3Bvc2VCZWhhdmlvcjogTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSWdub3JlXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWJvcnRzIGV2ZXJ5IHtAbGluayBBYm9ydENvbnRyb2xsZXJ9IGN1cnJlbnRseSByZWdpc3RlcmVkIGZvciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCwgd2hpY2hcbiAgICogY2FuY2VscyB0aGUgb3BlcmF0aW9ucyBob2xkaW5nIHRoZSBsb2NrLiBFYWNoIG9wZXJhdGlvbiByZWxlYXNlcyBpdHMgb3duIGxvY2sgaW4gaXRzIGBmaW5hbGx5YFxuICAgKiB3aGVuIGl0IG9ic2VydmVzIHRoZSBhYm9ydCwgc28gdGhpcyBkb2VzIG5vdCB1bmxvY2sgdGhlIHBhdGggZGlyZWN0bHkuIEEgbm8tb3Agd2hlbiBubyBjb250cm9sbGVyXG4gICAqIGlzIHJlZ2lzdGVyZWQgZm9yIHRoZSBwYXRoLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIHJlcXVlc3QgYW4gdW5sb2NrIGZvci5cbiAgICovXG4gIHB1YmxpYyByZXF1ZXN0VW5sb2NrKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gICAgY29uc3QgYWJvcnRDb250cm9sbGVycyA9IHRoaXMuYWJvcnRDb250cm9sbGVyc0J5UGF0aC5nZXQoZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpKTtcbiAgICBpZiAoIWFib3J0Q29udHJvbGxlcnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBjb250cm9sbGVyIG9mIGFib3J0Q29udHJvbGxlcnMpIHtcbiAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdW5sb2NrKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlLCBwbHVnaW5JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy51bmxvY2tQYXRoKGFwcCwgZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpLCBwbHVnaW5JZCk7XG4gIH1cblxuICBwdWJsaWMgdW5sb2NrQWxsRm9yUGx1Z2luKGFwcDogQXBwLCBwbHVnaW5JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBbcGF0aCwgbG9ja0NvdW50QnlQbHVnaW5JZF0gb2YgdGhpcy5sb2NrQ291bnRCeVBsdWdpbklkQnlQYXRoKSB7XG4gICAgICBpZiAobG9ja0NvdW50QnlQbHVnaW5JZC5kZWxldGUocGx1Z2luSWQpICYmIGxvY2tDb3VudEJ5UGx1Z2luSWQuc2l6ZSA9PT0gMCkge1xuICAgICAgICB0aGlzLmxvY2tDb3VudEJ5UGx1Z2luSWRCeVBhdGguZGVsZXRlKHBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnJlY29uY2lsZUFuZENsZWFudXAoYXBwKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkVW5sb2NrTWVudUl0ZW0oYXBwOiBBcHAsIG1lbnU6IE1lbnUsIHBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIG1lbnUuYWRkSXRlbSgoaXRlbSkgPT4ge1xuICAgICAgaXRlbVxuICAgICAgICAuc2V0VGl0bGUodCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLmVkaXRvckxvY2sudW5sb2NrTWVudUl0ZW0pKVxuICAgICAgICAuc2V0SWNvbihVTkxPQ0tfSUNPTl9JRClcbiAgICAgICAgLm9uQ2xpY2soY29udmVydEFzeW5jVG9TeW5jKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBpc0NvbmZpcm1lZCA9IGF3YWl0IGNvbmZpcm0oe1xuICAgICAgICAgICAgYXBwLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy51bmxvY2tDb25maXJtTWVzc2FnZShhcHAsIHBhdGgpLFxuICAgICAgICAgICAgdGl0bGU6IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5lZGl0b3JMb2NrLnVubG9ja0NvbmZpcm1UaXRsZSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoaXNDb25maXJtZWQpIHtcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdFVubG9jayhhcHAsIHBhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBiZWVwKCk6IHZvaWQge1xuICAgIC8vIFRocm90dGxlIHNvIGEgYnVyc3Qgb2Yga2V5c3Ryb2tlcyBkb2VzIG5vdCBzdGFjayBvdmVybGFwcGluZyB0b25lcyBpbnRvIGEgYnV6ei5cbiAgICBjb25zdCBub3dNaWxsaXNlY29uZHMgPSBEYXRlLm5vdygpO1xuICAgIGlmIChub3dNaWxsaXNlY29uZHMgLSB0aGlzLmxhc3RCZWVwTWlsbGlzZWNvbmRzIDwgQkVFUF9USFJPVFRMRV9NSUxMSVNFQ09ORFMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5sYXN0QmVlcE1pbGxpc2Vjb25kcyA9IG5vd01pbGxpc2Vjb25kcztcblxuICAgIC8vIGBsaWIuZG9tYCB0eXBlcyBgQXVkaW9Db250ZXh0YCBhcyBhbHdheXMgcHJlc2VudCwgYnV0IGl0IGlzIGFic2VudCBpbiBzb21lIHJ1bnRpbWVzXG4gICAgLy8gKGUuZy4gdGhlIGpzZG9tIHRlc3QgZW52aXJvbm1lbnQpLCBzbyB0aGlzIGd1YXJkIGlzIHJlYWwsIG5vdCByZWR1bmRhbnQuXG4gICAgY29uc3QgQXVkaW9Db250ZXh0Q2xhc3MgPSB3aW5kb3cuQXVkaW9Db250ZXh0O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIHNlZSB0aGUgY29tbWVudCBhYm92ZS5cbiAgICBpZiAoIUF1ZGlvQ29udGV4dENsYXNzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYXVkaW9Db250ZXh0ID8/PSBuZXcgQXVkaW9Db250ZXh0Q2xhc3MoKTtcbiAgICBjb25zdCBhdWRpb0NvbnRleHQgPSB0aGlzLmF1ZGlvQ29udGV4dDtcbiAgICBjb25zdCBvc2NpbGxhdG9yID0gYXVkaW9Db250ZXh0LmNyZWF0ZU9zY2lsbGF0b3IoKTtcbiAgICBjb25zdCBnYWluTm9kZSA9IGF1ZGlvQ29udGV4dC5jcmVhdGVHYWluKCk7XG4gICAgb3NjaWxsYXRvci50eXBlID0gJ3NpbmUnO1xuICAgIG9zY2lsbGF0b3IuZnJlcXVlbmN5LnZhbHVlID0gQkVFUF9GUkVRVUVOQ1lfSFo7XG4gICAgZ2Fpbk5vZGUuZ2Fpbi52YWx1ZSA9IEJFRVBfR0FJTjtcbiAgICBvc2NpbGxhdG9yLmNvbm5lY3QoZ2Fpbk5vZGUpO1xuICAgIGdhaW5Ob2RlLmNvbm5lY3QoYXVkaW9Db250ZXh0LmRlc3RpbmF0aW9uKTtcbiAgICBvc2NpbGxhdG9yLnN0YXJ0KCk7XG4gICAgb3NjaWxsYXRvci5zdG9wKGF1ZGlvQ29udGV4dC5jdXJyZW50VGltZSArIEJFRVBfRFVSQVRJT05fU0VDT05EUyk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUluZGljYXRvcnMoYXBwOiBBcHAsIHZpZXc6IE1hcmtkb3duVmlldywgcGF0aDogc3RyaW5nLCB0b29sdGlwOiBzdHJpbmcpOiBMb2NrSW5kaWNhdG9ycyB7XG4gICAgY29uc3QgYWN0aW9uSWNvbkVsID0gdmlldy5hZGRBY3Rpb24oTE9DS19JQ09OX0lELCB0b29sdGlwLCBub29wKTtcbiAgICB0aGlzLnJlZ2lzdGVyVW5sb2NrTWVudShhcHAsIGFjdGlvbkljb25FbCwgKCkgPT4gcGF0aCk7XG5cbiAgICBsZXQgdGFiSWNvbkVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IHRhYlN0YXR1c0NvbnRhaW5lckVsID0gdmlldy5sZWFmLnRhYkhlYWRlclN0YXR1c0NvbnRhaW5lckVsO1xuICAgIGlmICh0YWJTdGF0dXNDb250YWluZXJFbCkge1xuICAgICAgdGFiSWNvbkVsID0gdGFiU3RhdHVzQ29udGFpbmVyRWwuY3JlYXRlU3Bhbih7IGNsczogTE9DS19JTkRJQ0FUT1JfQ1NTX0NMQVNTIH0pO1xuICAgICAgc2V0SWNvbih0YWJJY29uRWwsIExPQ0tfSUNPTl9JRCk7XG4gICAgICBzZXRUb29sdGlwKHRhYkljb25FbCwgdG9vbHRpcCk7XG4gICAgICB0aGlzLnJlZ2lzdGVyVW5sb2NrTWVudShhcHAsIHRhYkljb25FbCwgKCkgPT4gcGF0aCk7XG4gICAgfVxuXG4gICAgLy8gQSBsb2NrZWQgdmlldyBpcyByZWFkLW9ubHkgYnV0IHN0aWxsIGVkaXRhYmxlLWZvY3VzYWJsZSwgc28gYSBrZXlzdHJva2UgZmlyZXMgYGJlZm9yZWlucHV0YC5cbiAgICAvLyBPbiB0aGF0IHJlamVjdGVkIGF0dGVtcHQsIGZsYXNoIHRoZSBpbmRpY2F0b3JzIGFuZCBiZWVwIHNvIGl0J3MgY2xlYXIgdGhlIG5vdGUgaXMgbG9ja2VkLlxuICAgIC8vIFRoZSBsaXN0ZW5lciBpcyByZW1vdmVkIG9uIHVubG9jay5cbiAgICBjb25zdCBvblR5cGVBdHRlbXB0ID0gKCk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5mbGFzaEluZGljYXRvcnModmlldyk7XG4gICAgICB0aGlzLmJlZXAoKTtcbiAgICB9O1xuICAgIHZpZXcuY29udGVudEVsLmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZWlucHV0Jywgb25UeXBlQXR0ZW1wdCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uSWNvbkVsLFxuICAgICAgZGlzcG9zZVR5cGVMaXN0ZW5lcjogKCk6IHZvaWQgPT4ge1xuICAgICAgICB2aWV3LmNvbnRlbnRFbC5yZW1vdmVFdmVudExpc3RlbmVyKCdiZWZvcmVpbnB1dCcsIG9uVHlwZUF0dGVtcHQpO1xuICAgICAgfSxcbiAgICAgIHRhYkljb25FbFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZVN1YnNjcmliZWQoYXBwOiBBcHApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ldmVudHNDb21wb25lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5ldmVudHNDb21wb25lbnQgPSBuZXcgRWRpdG9yTG9ja0V2ZW50c0NvbXBvbmVudCh7XG4gICAgICBhcHAsXG4gICAgICBvbkNoYW5nZTogKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnJlY29uY2lsZShhcHApO1xuICAgICAgfSxcbiAgICAgIG9uRmlsZU1lbnU6IChtZW51LCBmaWxlKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlRmlsZU1lbnUoYXBwLCBtZW51LCBmaWxlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmV2ZW50c0NvbXBvbmVudC5sb2FkKCk7XG4gIH1cblxuICBwcml2YXRlIGZsYXNoRWxlbWVudChlbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBlbC5yZW1vdmVDbGFzcyhMT0NLX0lORElDQVRPUl9GTEFTSF9DU1NfQ0xBU1MpO1xuICAgIC8vIFJlYWQgbGF5b3V0IHRvIGZvcmNlIGEgcmVmbG93IHNvIHRoZSBmbGFzaCBhbmltYXRpb24gcmVzdGFydHMgb24gZXZlcnkgcmVqZWN0ZWQga2V5c3Ryb2tlLlxuICAgIGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGVsLmFkZENsYXNzKExPQ0tfSU5ESUNBVE9SX0ZMQVNIX0NTU19DTEFTUyk7XG4gIH1cblxuICBwcml2YXRlIGZsYXNoSW5kaWNhdG9ycyh2aWV3OiBNYXJrZG93blZpZXcpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRpY2F0b3JzID0gdGhpcy5pbmRpY2F0b3JzQnlWaWV3LmdldCh2aWV3KTtcbiAgICBmb3IgKGNvbnN0IGVsIG9mIFtpbmRpY2F0b3JzPy5hY3Rpb25JY29uRWwsIGluZGljYXRvcnM/LnRhYkljb25FbCwgdGhpcy5zdGF0dXNCYXJJdGVtRWxdKSB7XG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgdGhpcy5mbGFzaEVsZW1lbnQoZWwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRmlsZU1lbnUoYXBwOiBBcHAsIG1lbnU6IE1lbnUsIGZpbGU6IFRBYnN0cmFjdEZpbGUpOiB2b2lkIHtcbiAgICBpZiAoIShmaWxlIGluc3RhbmNlb2YgVEZpbGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5pc1BhdGhMb2NrZWQoZmlsZS5wYXRoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFkZFVubG9ja01lbnVJdGVtKGFwcCwgbWVudSwgZmlsZS5wYXRoKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNQYXRoTG9ja2VkKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy5sb2NrQ291bnRCeVBsdWdpbklkQnlQYXRoLmdldChwYXRoKT8uc2l6ZSA/PyAwKSA+IDA7XG4gIH1cblxuICBwcml2YXRlIGxvY2tpbmdQbHVnaW5OYW1lcyhhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGxvY2tDb3VudEJ5UGx1Z2luSWQgPSB0aGlzLmxvY2tDb3VudEJ5UGx1Z2luSWRCeVBhdGguZ2V0KHBhdGgpO1xuICAgIC8vIGBsb2NraW5nUGx1Z2luTmFtZXNgIGlzIG9ubHkgZXZlciBjYWxsZWQgZm9yIGEgbG9ja2VkIHBhdGgsIHNvIHRoZSBwZXItcGx1Z2luIG1hcCBpcyBhbHdheXMgcHJlc2VudC5cbiAgICBhc3NlcnROb25OdWxsYWJsZShsb2NrQ291bnRCeVBsdWdpbklkKTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShsb2NrQ291bnRCeVBsdWdpbklkLmtleXMoKSkubWFwKChwbHVnaW5JZCkgPT4gYXBwLnBsdWdpbnMubWFuaWZlc3RzW3BsdWdpbklkXT8ubmFtZSA/PyBwbHVnaW5JZCk7XG4gIH1cblxuICBwcml2YXRlIGxvY2tUb29sdGlwKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGhlYWRlciA9IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5lZGl0b3JMb2NrLmxvY2tlZEJ5VG9vbHRpcCk7XG4gICAgLy8gQSBydW50aW1lLWxlbmd0aCBsaXN0IG9mIHBsdWdpbiBuYW1lcywgb25lIHBlciBsaW5lIHVuZGVyIHRoZSBoZWFkZXIuXG4gICAgcmV0dXJuIFtoZWFkZXIsIC4uLnRoaXMubG9ja2luZ1BsdWdpbk5hbWVzKGFwcCwgcGF0aCldLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWNvbmNpbGUoYXBwOiBBcHApOiB2b2lkIHtcbiAgICBjb25zdCB2aWV3c1RvTG9jayA9IG5ldyBTZXQ8TWFya2Rvd25WaWV3PigpO1xuICAgIGZvciAoY29uc3QgbGVhZiBvZiBhcHAud29ya3NwYWNlLmdldExlYXZlc09mVHlwZShWaWV3VHlwZS5NYXJrZG93bikpIHtcbiAgICAgIGNvbnN0IHZpZXcgPSBsZWFmLnZpZXc7XG4gICAgICBpZiAoISh2aWV3IGluc3RhbmNlb2YgTWFya2Rvd25WaWV3KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGF0aCA9IHZpZXcuZmlsZT8ucGF0aDtcbiAgICAgIGlmIChwYXRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmlzUGF0aExvY2tlZChwYXRoKSkge1xuICAgICAgICB2aWV3c1RvTG9jay5hZGQodmlldyk7XG4gICAgICAgIGNvbnN0IHRvb2x0aXAgPSB0aGlzLmxvY2tUb29sdGlwKGFwcCwgcGF0aCk7XG4gICAgICAgIC8vIFJlLWFwcGx5IHRoZSByZWFkLW9ubHkgdG9nZ2xlIG9uIGV2ZXJ5IHJlY29uY2lsZSwgbm90IG9ubHkgdGhlIGZpcnN0IHRpbWUgYSB2aWV3IGlzIHRyYWNrZWQuXG4gICAgICAgIC8vIFRoZSB0b2dnbGUgaXMgaWRlbXBvdGVudCwgc28gcmUtYXBwbHlpbmcgdG8gYW4gYWxyZWFkeS1sb2NrZWQgdmlldyBpcyBjaGVhcC5cbiAgICAgICAgLy8gQSB2aWV3IG9wZW5lZCBhZnRlciB0aGUgbG9jayBpcyByZWNvbmNpbGVkIHN5bmNocm9ub3VzbHksIGJlZm9yZSBpdHMgQ29kZU1pcnJvciBpcyByZWFkeS5cbiAgICAgICAgLy8gSXRzIGZpcnN0IHRvZ2dsZSBpcyB0aGVyZWZvcmUgYSBuby1vcDsgcmUtYXBwbHlpbmcgbWFrZXMgdGhlIGxvY2sgdGFrZSBob2xkIG9uY2UgaXQgc2V0dGxlcy5cbiAgICAgICAgdG9nZ2xlRWRpdG9yUmVhZE9ubHkodmlldy5lZGl0b3IsIHRydWUpO1xuICAgICAgICBjb25zdCBpbmRpY2F0b3JzID0gdGhpcy5pbmRpY2F0b3JzQnlWaWV3LmdldCh2aWV3KTtcbiAgICAgICAgaWYgKGluZGljYXRvcnMpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUluZGljYXRvclRvb2x0aXBzKGluZGljYXRvcnMsIHRvb2x0aXApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuaW5kaWNhdG9yc0J5Vmlldy5zZXQodmlldywgdGhpcy5jcmVhdGVJbmRpY2F0b3JzKGFwcCwgdmlldywgcGF0aCwgdG9vbHRpcCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbdmlldywgaW5kaWNhdG9yc10gb2YgdGhpcy5pbmRpY2F0b3JzQnlWaWV3KSB7XG4gICAgICBpZiAoIXZpZXdzVG9Mb2NrLmhhcyh2aWV3KSkge1xuICAgICAgICB0b2dnbGVFZGl0b3JSZWFkT25seSh2aWV3LmVkaXRvciwgZmFsc2UpO1xuICAgICAgICBpbmRpY2F0b3JzLmRpc3Bvc2VUeXBlTGlzdGVuZXIoKTtcbiAgICAgICAgaW5kaWNhdG9ycy5hY3Rpb25JY29uRWwucmVtb3ZlKCk7XG4gICAgICAgIGluZGljYXRvcnMudGFiSWNvbkVsPy5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy5pbmRpY2F0b3JzQnlWaWV3LmRlbGV0ZSh2aWV3KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVN0YXR1c0JhcihhcHApO1xuICB9XG5cbiAgcHJpdmF0ZSByZWNvbmNpbGVBbmRDbGVhbnVwKGFwcDogQXBwKTogdm9pZCB7XG4gICAgdGhpcy5yZWNvbmNpbGUoYXBwKTtcbiAgICBpZiAodGhpcy5sb2NrQ291bnRCeVBsdWdpbklkQnlQYXRoLnNpemUgPT09IDApIHtcbiAgICAgIHRoaXMuZXZlbnRzQ29tcG9uZW50Py51bmxvYWQoKTtcbiAgICAgIHRoaXMuZXZlbnRzQ29tcG9uZW50ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJVbmxvY2tNZW51KGFwcDogQXBwLCBlbDogSFRNTEVsZW1lbnQsIGdldENvbnRleHRQYXRoOiAoKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICAvLyBBIHBsYWluIGxpc3RlbmVyIGRpZXMgd2l0aCB0aGUgZWxlbWVudCB3aGVuIGl0IGlzIGAucmVtb3ZlKClgZCBvbiB1bmxvY2ssIHNvIGl0IG5ldmVyIGxlYWtzLlxuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgKGV2dCkgPT4ge1xuICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCBwYXRoID0gZ2V0Q29udGV4dFBhdGgoKTtcbiAgICAgIGlmIChwYXRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbWVudSA9IG5ldyBNZW51KCk7XG4gICAgICB0aGlzLmFkZFVubG9ja01lbnVJdGVtKGFwcCwgbWVudSwgcGF0aCk7XG4gICAgICBtZW51LnNob3dBdE1vdXNlRXZlbnQoZXZ0KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdW5sb2NrQ29uZmlybU1lc3NhZ2UoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIGNvbnN0IGZyYWdtZW50ID0gY3JlYXRlRnJhZ21lbnQoKTtcbiAgICBmcmFnbWVudC5hcHBlbmRUZXh0KHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5lZGl0b3JMb2NrLnVubG9ja0NvbmZpcm1NZXNzYWdlKSk7XG4gICAgLy8gQSBydW50aW1lLWxlbmd0aCBsaXN0IG9mIHRoZSBwbHVnaW5zIGN1cnJlbnRseSBob2xkaW5nIGEgbG9jaywgZWFjaCBhcyBhIGNvZGUgYmxvY2sgb24gaXRzIG93biBsaW5lLlxuICAgIGZvciAoY29uc3QgbmFtZSBvZiB0aGlzLmxvY2tpbmdQbHVnaW5OYW1lcyhhcHAsIHBhdGgpKSB7XG4gICAgICBmcmFnbWVudC5jcmVhdGVFbCgnYnInKTtcbiAgICAgIGFwcGVuZENvZGVCbG9jayhmcmFnbWVudCwgbmFtZSk7XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgdW5sb2NrUGF0aChhcHA6IEFwcCwgcGF0aDogc3RyaW5nLCBwbHVnaW5JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbG9ja0NvdW50QnlQbHVnaW5JZCA9IHRoaXMubG9ja0NvdW50QnlQbHVnaW5JZEJ5UGF0aC5nZXQocGF0aCk7XG4gICAgaWYgKCFsb2NrQ291bnRCeVBsdWdpbklkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY291bnQgPSBsb2NrQ291bnRCeVBsdWdpbklkLmdldChwbHVnaW5JZCkgPz8gMDtcbiAgICBpZiAoY291bnQgPD0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChjb3VudCA9PT0gMSkge1xuICAgICAgbG9ja0NvdW50QnlQbHVnaW5JZC5kZWxldGUocGx1Z2luSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2NrQ291bnRCeVBsdWdpbklkLnNldChwbHVnaW5JZCwgY291bnQgLSAxKTtcbiAgICB9XG5cbiAgICBpZiAobG9ja0NvdW50QnlQbHVnaW5JZC5zaXplID09PSAwKSB7XG4gICAgICB0aGlzLmxvY2tDb3VudEJ5UGx1Z2luSWRCeVBhdGguZGVsZXRlKHBhdGgpO1xuICAgIH1cblxuICAgIHRoaXMucmVjb25jaWxlQW5kQ2xlYW51cChhcHApO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVJbmRpY2F0b3JUb29sdGlwcyhpbmRpY2F0b3JzOiBMb2NrSW5kaWNhdG9ycywgdG9vbHRpcDogc3RyaW5nKTogdm9pZCB7XG4gICAgc2V0VG9vbHRpcChpbmRpY2F0b3JzLmFjdGlvbkljb25FbCwgdG9vbHRpcCk7XG4gICAgaWYgKGluZGljYXRvcnMudGFiSWNvbkVsKSB7XG4gICAgICBzZXRUb29sdGlwKGluZGljYXRvcnMudGFiSWNvbkVsLCB0b29sdGlwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVN0YXR1c0JhcihhcHA6IEFwcCk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2ZVZpZXcgPSBhcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KTtcbiAgICBjb25zdCBhY3RpdmVQYXRoID0gYWN0aXZlVmlldz8uZmlsZT8ucGF0aDtcbiAgICBjb25zdCBpc0FjdGl2ZUxvY2tlZCA9IGFjdGl2ZVBhdGggIT09IHVuZGVmaW5lZCAmJiB0aGlzLmlzUGF0aExvY2tlZChhY3RpdmVQYXRoKTtcblxuICAgIGlmICghaXNBY3RpdmVMb2NrZWQgfHwgIWFjdGl2ZVZpZXcpIHtcbiAgICAgIHRoaXMuc3RhdHVzQmFySXRlbUVsPy5yZW1vdmUoKTtcbiAgICAgIHRoaXMuc3RhdHVzQmFySXRlbUVsID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc3RhdHVzQmFySXRlbUVsKSB7XG4gICAgICBjb25zdCBzdGF0dXNCYXJFbCA9IGFjdGl2ZVZpZXcuY29udGFpbmVyRWwub3duZXJEb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFNUQVRVU19CQVJfQ1NTX1NFTEVDVE9SKTtcbiAgICAgIGlmICghc3RhdHVzQmFyRWwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5zdGF0dXNCYXJJdGVtRWwgPSBzdGF0dXNCYXJFbC5jcmVhdGVEaXYoeyBjbHM6IFtTVEFUVVNfQkFSX0lURU1fQ1NTX0NMQVNTLCBMT0NLX0lORElDQVRPUl9DU1NfQ0xBU1NdIH0pO1xuICAgICAgc2V0SWNvbih0aGlzLnN0YXR1c0Jhckl0ZW1FbCwgTE9DS19JQ09OX0lEKTtcbiAgICAgIC8vIFRoZSBzaW5nbGUgc3RhdHVzLWJhciBpdGVtIGlzIHJldXNlZCBhY3Jvc3MgYWN0aXZlLW5vdGUgc3dpdGNoZXMuXG4gICAgICAvLyBJdCBtdXN0IHJlc29sdmUgdGhlIGN1cnJlbnRseSBhY3RpdmUgbm90ZSdzIHBhdGggYXQgY2xpY2sgdGltZSByYXRoZXIgdGhhbiBjYXB0dXJpbmcgb25lIHBhdGguXG4gICAgICB0aGlzLnJlZ2lzdGVyVW5sb2NrTWVudShhcHAsIHRoaXMuc3RhdHVzQmFySXRlbUVsLCAoKSA9PiBhcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KT8uZmlsZT8ucGF0aCk7XG4gICAgfVxuXG4gICAgc2V0VG9vbHRpcCh0aGlzLnN0YXR1c0Jhckl0ZW1FbCwgdGhpcy5sb2NrVG9vbHRpcChhcHAsIGFjdGl2ZVBhdGgpKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgcGVyLXBsdWdpbiBoYW5kbGUgZm9yIG5vdGUtc2NvcGVkIGVkaXRvciBsb2NraW5nLiBBZGQgaXQgYXMgYSBjaGlsZCBvZiB5b3VyIHBsdWdpblxuICogKGB0aGlzLmFkZENoaWxkKG5ldyBFZGl0b3JMb2NrQ29tcG9uZW50KHRoaXMuYXBwKSlgKSBzbyB0aGF0IGFueSBsb2NrcyBpdCBzdGlsbCBob2xkcyBhcmUgcmVsZWFzZWRcbiAqIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgcGx1Z2luIHVubG9hZHMgXHUyMDE0IGEgbm90ZSBjYW4gbmV2ZXIgYmUgbGVmdCBzdHVjayByZWFkLW9ubHkgYmVjYXVzZSB0aGVcbiAqIHBsdWdpbiB0aGF0IGxvY2tlZCBpdCB3YXMgZGlzYWJsZWQgb3IgcmVsb2FkZWQgbWlkLW9wZXJhdGlvbi5cbiAqXG4gKiBMb2NrcyBhcmUgcmVmZXJlbmNlLWNvdW50ZWQgYW5kIGF0dHJpYnV0ZWQgdG8gdGhpcyBwbHVnaW4sIHNvIHRoZSBsb2NrIGluZGljYXRvcnMnIHRvb2x0aXAgbmFtZXNcbiAqIGl0IGFtb25nIHRoZSBwbHVnaW5zIGN1cnJlbnRseSBob2xkaW5nIGEgbG9jay5cbiAqL1xuZXhwb3J0IGNsYXNzIEVkaXRvckxvY2tDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRFeCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBlZGl0b3ItbG9jayBoYW5kbGUgb3duZWQgYnkgYSBwbHVnaW4uXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGx1Z2luSWQgLSBUaGUgaWQgb2YgdGhlIG93bmluZyBwbHVnaW4uIERlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHBsdWdpbiBjb250ZXh0J3MgaWQ7IHBhc3NcbiAgICogaXQgZXhwbGljaXRseSAoZS5nLiBmcm9tIGEgcGx1Z2luJ3MgYG1hbmlmZXN0LmlkYCkgd2hlbiBjb25zdHJ1Y3RpbmcgYmVmb3JlIHRoZSBwbHVnaW4gY29udGV4dCBpc1xuICAgKiBpbml0aWFsaXplZCwgc3VjaCBhcyBpbnNpZGUgYFBsdWdpbkJhc2Uub25sb2FkYC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luSWQ6IHN0cmluZyA9IGdldFBsdWdpbklkKCkpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gYXBwO1xuICAgIHRoaXMucGx1Z2luSWQgPSBwbHVnaW5JZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCBpcyBjdXJyZW50bHkgbG9ja2VkIGJ5IGFueSBwbHVnaW4uXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byBjaGVjay5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBub3RlIGhhcyBhdCBsZWFzdCBvbmUgYWN0aXZlIGxvY2ssIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHVibGljIGlzTG9ja2VkRm9yUGF0aChwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGdldE1hbmFnZXIoKS5pc0xvY2tlZCh0aGlzLmFwcCwgcGF0aE9yRmlsZSk7XG4gIH1cblxuICAvKipcbiAgICogTG9ja3MgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggb24gYmVoYWxmIG9mIHRoaXMgcGx1Z2luLCBtYWtpbmcgaXQgcmVhZC1vbmx5IGluIGV2ZXJ5IGN1cnJlbnRcbiAgICogYW5kIGZ1dHVyZSB7QGxpbmsgTWFya2Rvd25WaWV3fSB1bnRpbCB0aGUgbG9jayBpcyByZWxlYXNlZC4gUmVmZXJlbmNlLWNvdW50ZWQ6IGJhbGFuY2UgZWFjaCBjYWxsXG4gICAqIHdpdGggYSBkaXNwb3NlIG9mIHRoZSByZXR1cm5lZCB7QGxpbmsgRGlzcG9zYWJsZX0gKGlkZWFsbHkgdmlhIGB1c2luZ2ApIG9yIHtAbGluayB1bmxvY2tGb3JQYXRofS5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIGxvY2suXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgbG9ja2luZyBvcHRpb25zLiBQYXNzIGFuXG4gICAqIHtAbGluayBFZGl0b3JMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhPcHRpb25zLmFib3J0Q29udHJvbGxlcn0gdG8gbWFrZSB0aGUgbG9jayBjYW5jZWxhYmxlIHZpYSB0aGVcbiAgICogaW5kaWNhdG9yJ3MgcmlnaHQtY2xpY2sgXCJ1bmxvY2tcIiBtZW51IG9yIHtAbGluayByZXF1ZXN0RWRpdG9yVW5sb2NrRm9yUGF0aH0uXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIERpc3Bvc2FibGV9IHRoYXQgcmVsZWFzZXMgdGhpcyBsb2NrIHdoZW4gZGlzcG9zZWQuIERpc3Bvc2luZyBtb3JlIHRoYW4gb25jZSBpcyBhIG5vLW9wLlxuICAgKi9cbiAgcHVibGljIGxvY2tGb3JQYXRoKHBhdGhPckZpbGU6IFBhdGhPckZpbGUsIG9wdGlvbnM/OiBFZGl0b3JMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhPcHRpb25zKTogRGlzcG9zYWJsZSB7XG4gICAgcmV0dXJuIGdldE1hbmFnZXIoKS5sb2NrKHRoaXMuYXBwLCBwYXRoT3JGaWxlLCB0aGlzLnBsdWdpbklkLCBvcHRpb25zPy5hYm9ydENvbnRyb2xsZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2VzIGV2ZXJ5IGxvY2sgc3RpbGwgaGVsZCBieSB0aGlzIHBsdWdpbiB3aGVuIHRoZSBjb21wb25lbnQgKGFuZCB0aHVzIHRoZSBwbHVnaW4pIHVubG9hZHMsXG4gICAqIHNvIG5vIG5vdGUgaXMgbGVmdCBzdHVjayByZWFkLW9ubHkgYnkgYW4gb3BlcmF0aW9uIHRoYXQgbmV2ZXIgY29tcGxldGVkLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIG9udW5sb2FkKCk6IHZvaWQge1xuICAgIGdldE1hbmFnZXIoKS51bmxvY2tBbGxGb3JQbHVnaW4odGhpcy5hcHAsIHRoaXMucGx1Z2luSWQpO1xuICAgIHN1cGVyLm9udW5sb2FkKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZXMgb25lIGxvY2sgcHJldmlvdXNseSBhY3F1aXJlZCBmb3IgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggdmlhIHtAbGluayBsb2NrRm9yUGF0aH0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byB1bmxvY2suXG4gICAqL1xuICBwdWJsaWMgdW5sb2NrRm9yUGF0aChwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gICAgZ2V0TWFuYWdlcigpLnVubG9jayh0aGlzLmFwcCwgcGF0aE9yRmlsZSwgdGhpcy5wbHVnaW5JZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCBpcyBjdXJyZW50bHkgbG9ja2VkLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBub3RlIGhhcyBhdCBsZWFzdCBvbmUgYWN0aXZlIGxvY2ssIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFZGl0b3JMb2NrZWRGb3JQYXRoKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gIHJldHVybiBnZXRNYW5hZ2VyKCkuaXNMb2NrZWQoYXBwLCBwYXRoT3JGaWxlKTtcbn1cblxuLyoqXG4gKiBMb2NrcyB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCwgbWFraW5nIGl0IHJlYWQtb25seSBpbiBldmVyeSBjdXJyZW50IGFuZCBmdXR1cmVcbiAqIHtAbGluayBNYXJrZG93blZpZXd9IHVudGlsIHRoZSBsb2NrIGlzIHJlbGVhc2VkLCBhbmQgc2hvd2luZyBhIGxvY2sgaW5kaWNhdG9yIGluIHRoZSB0YWIgaGVhZGVyLFxuICogdmlldyBhY3Rpb24gYmFyLCBhbmQgKHdoaWxlIGFjdGl2ZSkgdGhlIHN0YXR1cyBiYXIuIFRoZSBpbmRpY2F0b3JzJyB0b29sdGlwIGxpc3RzIHRoZSBwbHVnaW5zXG4gKiB0aGF0IGN1cnJlbnRseSBob2xkIGEgbG9jayBvbiB0aGUgbm90ZS5cbiAqXG4gKiBUaGUgbG9jayBpcyByZWZlcmVuY2UtY291bnRlZCBwZXIgY2FsbGluZyBwbHVnaW46IGVhY2ggY2FsbCBtdXN0IGJlIGJhbGFuY2VkIGJ5IGV4YWN0bHkgb25lXG4gKiByZWxlYXNlIChlaXRoZXIgZGlzcG9zaW5nIHRoZSByZXR1cm5lZCB7QGxpbmsgRGlzcG9zYWJsZX0gXHUyMDE0IGlkZWFsbHkgdmlhIGEgYHVzaW5nYCBkZWNsYXJhdGlvbiBcdTIwMTQgb3JcbiAqIGEgbWF0Y2hpbmcge0BsaW5rIHVubG9ja0VkaXRvckZvclBhdGh9IGNhbGwpLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIGxvY2suXG4gKiBAcmV0dXJucyBBIHtAbGluayBEaXNwb3NhYmxlfSB0aGF0IHJlbGVhc2VzIHRoaXMgbG9jayB3aGVuIGRpc3Bvc2VkLiBEaXNwb3NpbmcgbW9yZSB0aGFuIG9uY2UgaXMgYSBuby1vcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvY2tFZGl0b3JGb3JQYXRoKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogRGlzcG9zYWJsZSB7XG4gIHJldHVybiBnZXRNYW5hZ2VyKCkubG9jayhhcHAsIHBhdGhPckZpbGUsIGdldFBsdWdpbklkKCkpO1xufVxuXG4vKipcbiAqIFJlcXVlc3RzIGFuIHVubG9jayBvZiB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCBieSBhYm9ydGluZyBldmVyeSB7QGxpbmsgQWJvcnRDb250cm9sbGVyfSB0aGF0IHdhc1xuICogYXNzb2NpYXRlZCB3aXRoIGEgbG9jayBvbiBpdCAodmlhIHtAbGluayBFZGl0b3JMb2NrQ29tcG9uZW50LmxvY2tGb3JQYXRofSdzXG4gKiB7QGxpbmsgRWRpdG9yTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoT3B0aW9ucy5hYm9ydENvbnRyb2xsZXJ9KS4gVGhlIG9wZXJhdGlvbnMgaG9sZGluZyB0aGUgbG9ja1xuICogb2JzZXJ2ZSB0aGUgYWJvcnQgYW5kIHJlbGVhc2UgdGhlaXIgb3duIGxvY2tzLiBBIG5vLW9wIHdoZW4gbm8gYWJvcnRhYmxlIGxvY2sgaXMgcmVnaXN0ZXJlZCBmb3IgdGhlXG4gKiBwYXRoLlxuICpcbiAqIFRoaXMgbGV0cyBhIGNvbnN1bWluZyBwbHVnaW4gd2lyZSBpdHMgb3duIFwidW5sb2NrIGFjdGl2ZSBub3RlXCIgY29tbWFuZCB3aXRob3V0IHJlYWNoaW5nIGludG8gdGhlXG4gKiBsb2NrIG1hbmFnZXIgZGlyZWN0bHkuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gcmVxdWVzdCBhbiB1bmxvY2sgZm9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWVzdEVkaXRvclVubG9ja0ZvclBhdGgoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiB2b2lkIHtcbiAgZ2V0TWFuYWdlcigpLnJlcXVlc3RVbmxvY2soYXBwLCBwYXRoT3JGaWxlKTtcbn1cblxuLyoqXG4gKiBSZWxlYXNlcyBvbmUgbG9jayBwcmV2aW91c2x5IGFjcXVpcmVkIGZvciB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aCB2aWEge0BsaW5rIGxvY2tFZGl0b3JGb3JQYXRofS5cbiAqXG4gKiBXaGVuIHRoZSBsYXN0IGxvY2sgaXMgcmVsZWFzZWQgdGhlIG5vdGUgYmVjb21lcyBmdWxseSBlZGl0YWJsZSBhZ2FpbiBhbmQgaXRzIGxvY2sgaW5kaWNhdG9ycyBhcmVcbiAqIHJlbW92ZWQuIENhbGxpbmcgdGhpcyB3aGVuIHRoZSBub3RlIGlzIG5vdCBsb2NrZWQgaXMgYSBuby1vcC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byB1bmxvY2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmxvY2tFZGl0b3JGb3JQYXRoKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gIGdldE1hbmFnZXIoKS51bmxvY2soYXBwLCBwYXRoT3JGaWxlLCBnZXRQbHVnaW5JZCgpKTtcbn1cblxuZnVuY3Rpb24gZ2V0TWFuYWdlcigpOiBFZGl0b3JQYXRoTG9ja01hbmFnZXIge1xuICByZXR1cm4gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlPEVkaXRvclBhdGhMb2NrTWFuYWdlcj4oRURJVE9SX0xPQ0tfU1RBVEVfS0VZLCBuZXcgRWRpdG9yUGF0aExvY2tNYW5hZ2VyKCkpLnZhbHVlO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUE4QkEsNkJBQXlCO0FBQ3pCLHNCQU1PO0FBSVAsbUJBQW1DO0FBQ25DLHdCQUdPO0FBQ1Asc0JBQXFCO0FBQ3JCLDBCQUFnQztBQUNoQyxzQ0FBeUM7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
@@ -26,6 +26,18 @@
26
26
  import type { App } from 'obsidian' with { 'resolution-mode': 'import' };
27
27
  import type { PathOrFile } from './file-system.cjs';
28
28
  import { ComponentEx } from './components/component-ex.cjs';
29
+ /**
30
+ * Options for {@link EditorLockComponent.lockForPath}.
31
+ */
32
+ export interface EditorLockComponentLockForPathOptions {
33
+ /**
34
+ * An optional {@link AbortController} associated with the lock. When the lock indicator is
35
+ * right-clicked and the user confirms an unlock (or {@link requestEditorUnlockForPath} is called for
36
+ * the path), this controller is aborted so the operation holding the lock can cancel itself and
37
+ * release the lock in its own cleanup.
38
+ */
39
+ readonly abortController?: AbortController;
40
+ }
29
41
  /**
30
42
  * A per-plugin handle for note-scoped editor locking. Add it as a child of your plugin
31
43
  * (`this.addChild(new EditorLockComponent(this.app))`) so that any locks it still holds are released
@@ -60,9 +72,12 @@ export declare class EditorLockComponent extends ComponentEx {
60
72
  * with a dispose of the returned {@link Disposable} (ideally via `using`) or {@link unlockForPath}.
61
73
  *
62
74
  * @param pathOrFile - The path or file of the note to lock.
75
+ * @param options - Optional locking options. Pass an
76
+ * {@link EditorLockComponentLockForPathOptions.abortController} to make the lock cancelable via the
77
+ * indicator's right-click "unlock" menu or {@link requestEditorUnlockForPath}.
63
78
  * @returns A {@link Disposable} that releases this lock when disposed. Disposing more than once is a no-op.
64
79
  */
65
- lockForPath(pathOrFile: PathOrFile): Disposable;
80
+ lockForPath(pathOrFile: PathOrFile, options?: EditorLockComponentLockForPathOptions): Disposable;
66
81
  /**
67
82
  * Releases every lock still held by this plugin when the component (and thus the plugin) unloads,
68
83
  * so no note is left stuck read-only by an operation that never completed.
@@ -98,6 +113,20 @@ export declare function isEditorLockedForPath(app: App, pathOrFile: PathOrFile):
98
113
  * @returns A {@link Disposable} that releases this lock when disposed. Disposing more than once is a no-op.
99
114
  */
100
115
  export declare function lockEditorForPath(app: App, pathOrFile: PathOrFile): Disposable;
116
+ /**
117
+ * Requests an unlock of the note at the given path by aborting every {@link AbortController} that was
118
+ * associated with a lock on it (via {@link EditorLockComponent.lockForPath}'s
119
+ * {@link EditorLockComponentLockForPathOptions.abortController}). The operations holding the lock
120
+ * observe the abort and release their own locks. A no-op when no abortable lock is registered for the
121
+ * path.
122
+ *
123
+ * This lets a consuming plugin wire its own "unlock active note" command without reaching into the
124
+ * lock manager directly.
125
+ *
126
+ * @param app - The Obsidian app instance.
127
+ * @param pathOrFile - The path or file of the note to request an unlock for.
128
+ */
129
+ export declare function requestEditorUnlockForPath(app: App, pathOrFile: PathOrFile): void;
101
130
  /**
102
131
  * Releases one lock previously acquired for the note at the given path via {@link lockEditorForPath}.
103
132
  *
@@ -227,4 +227,4 @@ async function processFrontmatter(params) {
227
227
  deleteAlias,
228
228
  processFrontmatter
229
229
  });
230
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2ZpbGUtbWFuYWdlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBtYW5hZ2luZyBmaWxlcyBpbiBPYnNpZGlhbi5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHsgTWF5YmVSZXR1cm4gfSBmcm9tICcuLi90eXBlLnRzJztcbmltcG9ydCB0eXBlIHsgRWRpdG9yTG9ja0NvbXBvbmVudCB9IGZyb20gJy4vZWRpdG9yLWxvY2sudHMnO1xuaW1wb3J0IHR5cGUgeyBQYXRoT3JGaWxlIH0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQgdHlwZSB7IENvbWJpbmVkRnJvbnRtYXR0ZXIgfSBmcm9tICcuL2Zyb250bWF0dGVyLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgUHJvY2Vzc09wdGlvbnMsXG4gIFByb2Nlc3NQYXJhbXNcbn0gZnJvbSAnLi92YXVsdC50cyc7XG5cbmltcG9ydCB7XG4gIGRlZXBFcXVhbCxcbiAgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzXG59IGZyb20gJy4uL29iamVjdC11dGlscy50cyc7XG5pbXBvcnQge1xuICBnZXRGaWxlLFxuICBnZXRQYXRoLFxuICBpc01hcmtkb3duRmlsZVxufSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIHBhcnNlRnJvbnRtYXR0ZXIsXG4gIHNldEZyb250bWF0dGVyXG59IGZyb20gJy4vZnJvbnRtYXR0ZXIudHMnO1xuaW1wb3J0IHsgcHJvY2VzcyB9IGZyb20gJy4vdmF1bHQudHMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBhZGRBbGlhc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkQWxpYXNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFsaWFzIHRvIGFkZC5cbiAgICovXG4gIHJlYWRvbmx5IGFsaWFzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBlZGl0b3ItbG9jayBjb21wb25lbnQgdXNlZCB0byBsb2NrIHRoZSBub3RlIHdoaWxlIGl0IGlzIGJlaW5nIG1vZGlmaWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZWRpdG9yTG9ja0NvbXBvbmVudDogRWRpdG9yTG9ja0NvbXBvbmVudCB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgVEZpbGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGRlbGV0ZUFsaWFzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWxldGVBbGlhc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYWxpYXMgdG8gZGVsZXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXM/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGVkaXRvci1sb2NrIGNvbXBvbmVudCB1c2VkIHRvIGxvY2sgdGhlIG5vdGUgd2hpbGUgaXQgaXMgYmVpbmcgbW9kaWZpZWQuXG4gICAqL1xuICByZWFkb25seSBlZGl0b3JMb2NrQ29tcG9uZW50OiBFZGl0b3JMb2NrQ29tcG9uZW50IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBURmlsZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBub3RlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcHJvY2Vzc0Zyb250bWF0dGVyfS5cbiAqL1xuZXhwb3J0IHR5cGUgUHJvY2Vzc0Zyb250bWF0dGVyT3B0aW9ucyA9IFByb2Nlc3NPcHRpb25zO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBwcm9jZXNzRnJvbnRtYXR0ZXJ9LlxuICpcbiAqIEB0eXBlUGFyYW0gQ3VzdG9tRnJvbnRtYXR0ZXIgLSBUaGUgdHlwZSBvZiBjdXN0b20gZnJvbnQgbWF0dGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NGcm9udG1hdHRlclBhcmFtczxDdXN0b21Gcm9udG1hdHRlciA9IHVua25vd24+IGV4dGVuZHMgUHJvY2Vzc0Zyb250bWF0dGVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gdGhhdCBtb2RpZmllcyB0aGUgZnJvbnQgbWF0dGVyLlxuICAgKlxuICAgKiBAcGFyYW0gZnJvbnRtYXR0ZXIgLSBUaGUgZnJvbnQgbWF0dGVyIHRvIG1vZGlmeS5cbiAgICogQHBhcmFtIGFib3J0U2lnbmFsIC0gVGhlIGFib3J0IHNpZ25hbCB0byBsaXN0ZW4gdG8uXG4gICAqIEByZXR1cm5zIEEgdmFsdWUgdGhhdCBtYXkgYmUgYG51bGxgIHRvIGFib3J0IHRoZSBwcm9jZXNzLlxuICAgKi9cbiAgZnJvbnRtYXR0ZXJGbih0aGlzOiB2b2lkLCBmcm9udG1hdHRlcjogQ29tYmluZWRGcm9udG1hdHRlcjxDdXN0b21Gcm9udG1hdHRlcj4sIGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCk6IFByb21pc2FibGU8TWF5YmVSZXR1cm48bnVsbD4+O1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBURmlsZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBub3RlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBBZGRzIGFuIGFsaWFzIHRvIHRoZSBmcm9udCBtYXR0ZXIgb2YgYSBnaXZlbiBmaWxlIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBhZGRpbmcgdGhlIGFsaWFzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBhbGlhcyBoYXMgYmVlbiBhZGRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFkZEFsaWFzKHBhcmFtczogQWRkQWxpYXNQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGFsaWFzLFxuICAgIGFwcCxcbiAgICBlZGl0b3JMb2NrQ29tcG9uZW50LFxuICAgIHBhdGhPckZpbGVcbiAgfSA9IHBhcmFtcztcbiAgaWYgKCFhbGlhcykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGZpbGUgPSBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlIH0pO1xuXG4gIGlmICghaXNNYXJrZG93bkZpbGUoZmlsZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgJHtmaWxlLnBhdGh9IGlzIG5vdCBhIG1hcmtkb3duIGZpbGUuYCk7XG4gIH1cblxuICBpZiAoYWxpYXMgPT09IGZpbGUuYmFzZW5hbWUgfHwgYWxpYXMgPT09IGZpbGUubmFtZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IHByb2Nlc3NGcm9udG1hdHRlcih7XG4gICAgYXBwLFxuICAgIGVkaXRvckxvY2tDb21wb25lbnQsXG4gICAgZnJvbnRtYXR0ZXJGbjogKGZyb250bWF0dGVyKSA9PiB7XG4gICAgICBmcm9udG1hdHRlci5hbGlhc2VzID8/PSBbXTtcblxuICAgICAgaWYgKCFmcm9udG1hdHRlci5hbGlhc2VzLmluY2x1ZGVzKGFsaWFzKSkge1xuICAgICAgICBmcm9udG1hdHRlci5hbGlhc2VzLnB1c2goYWxpYXMpO1xuICAgICAgfVxuICAgIH0sXG4gICAgcGF0aE9yRmlsZVxuICB9KTtcbn1cblxuLyoqXG4gKiBEZWxldGVzIGFuIGFsaWFzIGZyb20gdGhlIGZyb250IG1hdHRlciBvZiBhIGdpdmVuIGZpbGUgaWYgaXQgZXhpc3RzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZGVsZXRpbmcgdGhlIGFsaWFzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBhbGlhcyBoYXMgYmVlbiBkZWxldGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlQWxpYXMocGFyYW1zOiBEZWxldGVBbGlhc1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYWxpYXMsXG4gICAgYXBwLFxuICAgIGVkaXRvckxvY2tDb21wb25lbnQsXG4gICAgcGF0aE9yRmlsZVxuICB9ID0gcGFyYW1zO1xuICBpZiAoIWFsaWFzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFpc01hcmtkb3duRmlsZShwYXRoT3JGaWxlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSAke2dldFBhdGgoYXBwLCBwYXRoT3JGaWxlKX0gaXMgbm90IGEgbWFya2Rvd24gZmlsZS5gKTtcbiAgfVxuXG4gIGF3YWl0IHByb2Nlc3NGcm9udG1hdHRlcih7XG4gICAgYXBwLFxuICAgIGVkaXRvckxvY2tDb21wb25lbnQsXG4gICAgZnJvbnRtYXR0ZXJGbjogKGZyb250bWF0dGVyKSA9PiB7XG4gICAgICBpZiAoIWZyb250bWF0dGVyLmFsaWFzZXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBmcm9udG1hdHRlci5hbGlhc2VzID0gZnJvbnRtYXR0ZXIuYWxpYXNlcy5maWx0ZXIoKGEpID0+IGEgIT09IGFsaWFzKTtcblxuICAgICAgaWYgKGZyb250bWF0dGVyLmFsaWFzZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBmcm9udG1hdHRlci5hbGlhc2VzO1xuICAgICAgfVxuICAgIH0sXG4gICAgcGF0aE9yRmlsZVxuICB9KTtcbn1cblxuLyoqXG4gKiBQcm9jZXNzZXMgdGhlIGZyb250IG1hdHRlciBvZiBhIGdpdmVuIGZpbGUsIGFsbG93aW5nIG1vZGlmaWNhdGlvbnMgdmlhIGEgcHJvdmlkZWQgZnVuY3Rpb24uXG4gKlxuICogQHR5cGVQYXJhbSBDdXN0b21Gcm9udG1hdHRlciAtIFRoZSB0eXBlIG9mIGN1c3RvbSBmcm9udCBtYXR0ZXIuXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHByb2Nlc3NpbmcgdGhlIGZyb250IG1hdHRlci5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZnJvbnQgbWF0dGVyIGhhcyBiZWVuIHByb2Nlc3NlZCBhbmQgc2F2ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzRnJvbnRtYXR0ZXI8Q3VzdG9tRnJvbnRtYXR0ZXIgPSB1bmtub3duPihwYXJhbXM6IFByb2Nlc3NGcm9udG1hdHRlclBhcmFtczxDdXN0b21Gcm9udG1hdHRlcj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBmcm9udG1hdHRlckZuLFxuICAgIHBhdGhPckZpbGUsXG4gICAgLi4ub3B0aW9uc1xuICB9ID0gcGFyYW1zO1xuICBpZiAoIWlzTWFya2Rvd25GaWxlKHBhdGhPckZpbGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlICR7Z2V0UGF0aChhcHAsIHBhdGhPckZpbGUpfSBpcyBub3QgYSBtYXJrZG93biBmaWxlLmApO1xuICB9XG5cbiAgYXdhaXQgcHJvY2Vzcyhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UHJvY2Vzc1BhcmFtcz4oe1xuICAgIGFwcCxcbiAgICBhc3luYyBuZXdDb250ZW50UHJvdmlkZXIoeyBhYm9ydFNpZ25hbCwgY29udGVudCB9KSB7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgICBjb25zdCBvbGRGcm9udG1hdHRlciA9IHBhcnNlRnJvbnRtYXR0ZXI8Q3VzdG9tRnJvbnRtYXR0ZXI+KGNvbnRlbnQpO1xuICAgICAgY29uc3QgbmV3RnJvbnRtYXR0ZXIgPSBwYXJzZUZyb250bWF0dGVyPEN1c3RvbUZyb250bWF0dGVyPihjb250ZW50KTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZyb250bWF0dGVyRm4obmV3RnJvbnRtYXR0ZXIsIGFib3J0U2lnbmFsKTtcbiAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmIChkZWVwRXF1YWwob2xkRnJvbnRtYXR0ZXIsIG5ld0Zyb250bWF0dGVyKSkge1xuICAgICAgICByZXR1cm4gY29udGVudDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNldEZyb250bWF0dGVyKGNvbnRlbnQsIG5ld0Zyb250bWF0dGVyKTtcbiAgICB9LFxuICAgIHBhdGhPckZpbGUsXG4gICAgLi4ub3B0aW9uc1xuICB9KSk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBa0JBLDBCQUdPO0FBQ1AseUJBSU87QUFDUCx5QkFHTztBQUNQLG1CQUF3QjtBQXlGeEIsZUFBc0IsU0FBUyxRQUF1QztBQUNwRSxRQUFN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
230
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2ZpbGUtbWFuYWdlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBtYW5hZ2luZyBmaWxlcyBpbiBPYnNpZGlhbi5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHsgTWF5YmVSZXR1cm4gfSBmcm9tICcuLi90eXBlLnRzJztcbmltcG9ydCB0eXBlIHsgRWRpdG9yTG9ja0NvbXBvbmVudCB9IGZyb20gJy4vZWRpdG9yLWxvY2sudHMnO1xuaW1wb3J0IHR5cGUgeyBQYXRoT3JGaWxlIH0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQgdHlwZSB7IENvbWJpbmVkRnJvbnRtYXR0ZXIgfSBmcm9tICcuL2Zyb250bWF0dGVyLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgUHJvY2Vzc09wdGlvbnMsXG4gIFByb2Nlc3NQYXJhbXNcbn0gZnJvbSAnLi92YXVsdC50cyc7XG5cbmltcG9ydCB7XG4gIGRlZXBFcXVhbCxcbiAgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzXG59IGZyb20gJy4uL29iamVjdC11dGlscy50cyc7XG5pbXBvcnQge1xuICBnZXRGaWxlLFxuICBnZXRQYXRoLFxuICBpc01hcmtkb3duRmlsZVxufSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIHBhcnNlRnJvbnRtYXR0ZXIsXG4gIHNldEZyb250bWF0dGVyXG59IGZyb20gJy4vZnJvbnRtYXR0ZXIudHMnO1xuaW1wb3J0IHsgcHJvY2VzcyB9IGZyb20gJy4vdmF1bHQudHMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBhZGRBbGlhc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkQWxpYXNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFsaWFzIHRvIGFkZC5cbiAgICovXG4gIHJlYWRvbmx5IGFsaWFzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBlZGl0b3ItbG9jayBjb21wb25lbnQgdXNlZCB0byBsb2NrIHRoZSBub3RlIHdoaWxlIGl0IGlzIGJlaW5nIG1vZGlmaWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZWRpdG9yTG9ja0NvbXBvbmVudDogRWRpdG9yTG9ja0NvbXBvbmVudCB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIFRGaWxlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIG5vdGUuXG4gICAqL1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBkZWxldGVBbGlhc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVsZXRlQWxpYXNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFsaWFzIHRvIGRlbGV0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGFsaWFzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBlZGl0b3ItbG9jayBjb21wb25lbnQgdXNlZCB0byBsb2NrIHRoZSBub3RlIHdoaWxlIGl0IGlzIGJlaW5nIG1vZGlmaWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZWRpdG9yTG9ja0NvbXBvbmVudDogRWRpdG9yTG9ja0NvbXBvbmVudCB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIFRGaWxlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIG5vdGUuXG4gICAqL1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBwcm9jZXNzRnJvbnRtYXR0ZXJ9LlxuICovXG5leHBvcnQgdHlwZSBQcm9jZXNzRnJvbnRtYXR0ZXJPcHRpb25zID0gUHJvY2Vzc09wdGlvbnM7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHByb2Nlc3NGcm9udG1hdHRlcn0uXG4gKlxuICogQHR5cGVQYXJhbSBDdXN0b21Gcm9udG1hdHRlciAtIFRoZSB0eXBlIG9mIGN1c3RvbSBmcm9udCBtYXR0ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc0Zyb250bWF0dGVyUGFyYW1zPEN1c3RvbUZyb250bWF0dGVyID0gdW5rbm93bj4gZXh0ZW5kcyBQcm9jZXNzRnJvbnRtYXR0ZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSBmdW5jdGlvbiB0aGF0IG1vZGlmaWVzIHRoZSBmcm9udCBtYXR0ZXIuXG4gICAqXG4gICAqIEBwYXJhbSBmcm9udG1hdHRlciAtIFRoZSBmcm9udCBtYXR0ZXIgdG8gbW9kaWZ5LlxuICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgLSBUaGUgYWJvcnQgc2lnbmFsIHRvIGxpc3RlbiB0by5cbiAgICogQHJldHVybnMgQSB2YWx1ZSB0aGF0IG1heSBiZSBgbnVsbGAgdG8gYWJvcnQgdGhlIHByb2Nlc3MuXG4gICAqL1xuICBmcm9udG1hdHRlckZuKHRoaXM6IHZvaWQsIGZyb250bWF0dGVyOiBDb21iaW5lZEZyb250bWF0dGVyPEN1c3RvbUZyb250bWF0dGVyPiwgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKTogUHJvbWlzYWJsZTxNYXliZVJldHVybjxudWxsPj47XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIFRGaWxlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIG5vdGUuXG4gICAqL1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIEFkZHMgYW4gYWxpYXMgdG8gdGhlIGZyb250IG1hdHRlciBvZiBhIGdpdmVuIGZpbGUgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGFkZGluZyB0aGUgYWxpYXMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGFsaWFzIGhhcyBiZWVuIGFkZGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkQWxpYXMocGFyYW1zOiBBZGRBbGlhc1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYWxpYXMsXG4gICAgYXBwLFxuICAgIGVkaXRvckxvY2tDb21wb25lbnQsXG4gICAgcGF0aE9yRmlsZVxuICB9ID0gcGFyYW1zO1xuICBpZiAoIWFsaWFzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZmlsZSA9IGdldEZpbGUoeyBhcHAsIHBhdGhPckZpbGUgfSk7XG5cbiAgaWYgKCFpc01hcmtkb3duRmlsZShmaWxlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSAke2ZpbGUucGF0aH0gaXMgbm90IGEgbWFya2Rvd24gZmlsZS5gKTtcbiAgfVxuXG4gIGlmIChhbGlhcyA9PT0gZmlsZS5iYXNlbmFtZSB8fCBhbGlhcyA9PT0gZmlsZS5uYW1lKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgcHJvY2Vzc0Zyb250bWF0dGVyKHtcbiAgICBhcHAsXG4gICAgZWRpdG9yTG9ja0NvbXBvbmVudCxcbiAgICBmcm9udG1hdHRlckZuOiAoZnJvbnRtYXR0ZXIpID0+IHtcbiAgICAgIGZyb250bWF0dGVyLmFsaWFzZXMgPz89IFtdO1xuXG4gICAgICBpZiAoIWZyb250bWF0dGVyLmFsaWFzZXMuaW5jbHVkZXMoYWxpYXMpKSB7XG4gICAgICAgIGZyb250bWF0dGVyLmFsaWFzZXMucHVzaChhbGlhcyk7XG4gICAgICB9XG4gICAgfSxcbiAgICBwYXRoT3JGaWxlXG4gIH0pO1xufVxuXG4vKipcbiAqIERlbGV0ZXMgYW4gYWxpYXMgZnJvbSB0aGUgZnJvbnQgbWF0dGVyIG9mIGEgZ2l2ZW4gZmlsZSBpZiBpdCBleGlzdHMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBkZWxldGluZyB0aGUgYWxpYXMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGFsaWFzIGhhcyBiZWVuIGRlbGV0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVBbGlhcyhwYXJhbXM6IERlbGV0ZUFsaWFzUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhbGlhcyxcbiAgICBhcHAsXG4gICAgZWRpdG9yTG9ja0NvbXBvbmVudCxcbiAgICBwYXRoT3JGaWxlXG4gIH0gPSBwYXJhbXM7XG4gIGlmICghYWxpYXMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIWlzTWFya2Rvd25GaWxlKHBhdGhPckZpbGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlICR7Z2V0UGF0aChhcHAsIHBhdGhPckZpbGUpfSBpcyBub3QgYSBtYXJrZG93biBmaWxlLmApO1xuICB9XG5cbiAgYXdhaXQgcHJvY2Vzc0Zyb250bWF0dGVyKHtcbiAgICBhcHAsXG4gICAgZWRpdG9yTG9ja0NvbXBvbmVudCxcbiAgICBmcm9udG1hdHRlckZuOiAoZnJvbnRtYXR0ZXIpID0+IHtcbiAgICAgIGlmICghZnJvbnRtYXR0ZXIuYWxpYXNlcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGZyb250bWF0dGVyLmFsaWFzZXMgPSBmcm9udG1hdHRlci5hbGlhc2VzLmZpbHRlcigoYSkgPT4gYSAhPT0gYWxpYXMpO1xuXG4gICAgICBpZiAoZnJvbnRtYXR0ZXIuYWxpYXNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVsZXRlIGZyb250bWF0dGVyLmFsaWFzZXM7XG4gICAgICB9XG4gICAgfSxcbiAgICBwYXRoT3JGaWxlXG4gIH0pO1xufVxuXG4vKipcbiAqIFByb2Nlc3NlcyB0aGUgZnJvbnQgbWF0dGVyIG9mIGEgZ2l2ZW4gZmlsZSwgYWxsb3dpbmcgbW9kaWZpY2F0aW9ucyB2aWEgYSBwcm92aWRlZCBmdW5jdGlvbi5cbiAqXG4gKiBAdHlwZVBhcmFtIEN1c3RvbUZyb250bWF0dGVyIC0gVGhlIHR5cGUgb2YgY3VzdG9tIGZyb250IG1hdHRlci5cbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgcHJvY2Vzc2luZyB0aGUgZnJvbnQgbWF0dGVyLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmcm9udCBtYXR0ZXIgaGFzIGJlZW4gcHJvY2Vzc2VkIGFuZCBzYXZlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NGcm9udG1hdHRlcjxDdXN0b21Gcm9udG1hdHRlciA9IHVua25vd24+KHBhcmFtczogUHJvY2Vzc0Zyb250bWF0dGVyUGFyYW1zPEN1c3RvbUZyb250bWF0dGVyPik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGZyb250bWF0dGVyRm4sXG4gICAgcGF0aE9yRmlsZSxcbiAgICAuLi5vcHRpb25zXG4gIH0gPSBwYXJhbXM7XG4gIGlmICghaXNNYXJrZG93bkZpbGUocGF0aE9yRmlsZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgJHtnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSl9IGlzIG5vdCBhIG1hcmtkb3duIGZpbGUuYCk7XG4gIH1cblxuICBhd2FpdCBwcm9jZXNzKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxQcm9jZXNzUGFyYW1zPih7XG4gICAgYXBwLFxuICAgIGFzeW5jIG5ld0NvbnRlbnRQcm92aWRlcih7IGFib3J0U2lnbmFsLCBjb250ZW50IH0pIHtcbiAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAgIGNvbnN0IG9sZEZyb250bWF0dGVyID0gcGFyc2VGcm9udG1hdHRlcjxDdXN0b21Gcm9udG1hdHRlcj4oY29udGVudCk7XG4gICAgICBjb25zdCBuZXdGcm9udG1hdHRlciA9IHBhcnNlRnJvbnRtYXR0ZXI8Q3VzdG9tRnJvbnRtYXR0ZXI+KGNvbnRlbnQpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZnJvbnRtYXR0ZXJGbihuZXdGcm9udG1hdHRlciwgYWJvcnRTaWduYWwpO1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlZXBFcXVhbChvbGRGcm9udG1hdHRlciwgbmV3RnJvbnRtYXR0ZXIpKSB7XG4gICAgICAgIHJldHVybiBjb250ZW50O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2V0RnJvbnRtYXR0ZXIoY29udGVudCwgbmV3RnJvbnRtYXR0ZXIpO1xuICAgIH0sXG4gICAgcGF0aE9yRmlsZSxcbiAgICAuLi5vcHRpb25zXG4gIH0pKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFrQkEsMEJBR087QUFDUCx5QkFJTztBQUNQLHlCQUdPO0FBQ1AsbUJBQXdCO0FBeUZ4QixlQUFzQixTQUFTLFFBQXVDO0FBQ3BFLFFBQU07QUFBQSxJQUNK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
@@ -26,7 +26,7 @@ export interface AddAliasParams {
26
26
  /**
27
27
  * The editor-lock component used to lock the note while it is being modified.
28
28
  */
29
- readonly editorLockComponent: EditorLockComponent | undefined;
29
+ readonly editorLockComponent: EditorLockComponent | null;
30
30
  /**
31
31
  * The path or TFile object representing the note.
32
32
  */
@@ -47,7 +47,7 @@ export interface DeleteAliasParams {
47
47
  /**
48
48
  * The editor-lock component used to lock the note while it is being modified.
49
49
  */
50
- readonly editorLockComponent: EditorLockComponent | undefined;
50
+ readonly editorLockComponent: EditorLockComponent | null;
51
51
  /**
52
52
  * The path or TFile object representing the note.
53
53
  */