@textbus/collaborate 2.0.0-alpha.79 → 2.0.0-beta.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -30,6 +30,7 @@ export declare class Collaborate implements History {
30
30
  private slotsSyncCaches;
31
31
  private componentStateSyncCaches;
32
32
  private selectionChangeEvent;
33
+ private updateRemoteActions;
33
34
  constructor(rootComponentRef: RootComponentRef, collaborateCursor: CollaborateCursor, translator: Translator, renderer: Renderer, registry: Registry, selection: Selection, starter: Starter);
34
35
  setup(): void;
35
36
  updateRemoteSelection(paths: RemoteSelection[]): void;
@@ -48,4 +49,6 @@ export declare class Collaborate implements History {
48
49
  private createSharedSlotBySlot;
49
50
  private createComponentBySharedComponent;
50
51
  private createSlotBySharedSlot;
52
+ private cleanSubscriptionsBySlot;
53
+ private cleanSubscriptionsByComponent;
51
54
  }
@@ -165,6 +165,12 @@ let Collaborate = class Collaborate {
165
165
  writable: true,
166
166
  value: new Subject()
167
167
  });
168
+ Object.defineProperty(this, "updateRemoteActions", {
169
+ enumerable: true,
170
+ configurable: true,
171
+ writable: true,
172
+ value: []
173
+ });
168
174
  this.onSelectionChange = this.selectionChangeEvent.asObservable();
169
175
  this.onBack = this.backEvent.asObservable();
170
176
  this.onForward = this.forwardEvent.asObservable();
@@ -214,15 +220,17 @@ let Collaborate = class Collaborate {
214
220
  });
215
221
  this.syncContent(root, rootComponent.slots.get(0));
216
222
  this.subscriptions.push(merge(rootComponent.changeMarker.onForceChange, rootComponent.changeMarker.onChange).pipe(microTask()).subscribe(() => {
223
+ this.yDoc.transact(() => {
224
+ this.updateRemoteActions.forEach(fn => {
225
+ fn();
226
+ });
227
+ this.updateRemoteActions = [];
228
+ }, this.yDoc);
217
229
  this.renderer.render();
218
230
  this.selection.restore();
219
231
  }));
220
232
  }
221
233
  syncContent(content, slot) {
222
- const fn = this.contentSyncCaches.get(slot);
223
- if (fn) {
224
- fn();
225
- }
226
234
  const syncRemote = (ev, tr) => {
227
235
  this.runRemoteUpdate(tr, () => {
228
236
  slot.retain(0);
@@ -326,10 +334,6 @@ let Collaborate = class Collaborate {
326
334
  });
327
335
  }
328
336
  syncSlot(remoteSlot, slot) {
329
- const fn = this.slotStateSyncCaches.get(slot);
330
- if (fn) {
331
- fn();
332
- }
333
337
  const syncRemote = (ev, tr) => {
334
338
  this.runRemoteUpdate(tr, () => {
335
339
  ev.keysChanged.forEach(key => {
@@ -357,10 +361,6 @@ let Collaborate = class Collaborate {
357
361
  }
358
362
  syncSlots(remoteSlots, component) {
359
363
  const slots = component.slots;
360
- const fn = this.slotsSyncCaches.get(component);
361
- if (fn) {
362
- fn();
363
- }
364
364
  const syncRemote = (ev, tr) => {
365
365
  this.runRemoteUpdate(tr, () => {
366
366
  ev.delta.forEach(action => {
@@ -398,6 +398,9 @@ let Collaborate = class Collaborate {
398
398
  index++;
399
399
  }
400
400
  else if (action.type === 'delete') {
401
+ slots.slice(index, index + action.count).forEach(slot => {
402
+ this.cleanSubscriptionsBySlot(slot);
403
+ });
401
404
  remoteSlots.delete(index, action.count);
402
405
  }
403
406
  });
@@ -409,10 +412,6 @@ let Collaborate = class Collaborate {
409
412
  });
410
413
  }
411
414
  syncComponent(remoteComponent, component) {
412
- const fn = this.componentStateSyncCaches.get(component);
413
- if (fn) {
414
- fn();
415
- }
416
415
  const syncRemote = (ev, tr) => {
417
416
  this.runRemoteUpdate(tr, () => {
418
417
  ev.keysChanged.forEach(key => {
@@ -440,10 +439,10 @@ let Collaborate = class Collaborate {
440
439
  if (this.updateFromRemote) {
441
440
  return;
442
441
  }
443
- fn();
442
+ this.updateRemoteActions.push(fn);
444
443
  }
445
444
  runRemoteUpdate(tr, fn) {
446
- if (!tr.origin) {
445
+ if (tr.origin === this.yDoc) {
447
446
  return;
448
447
  }
449
448
  this.updateFromRemote = true;
@@ -544,6 +543,28 @@ let Collaborate = class Collaborate {
544
543
  }
545
544
  return slot;
546
545
  }
546
+ cleanSubscriptionsBySlot(slot) {
547
+ [this.contentSyncCaches.get(slot), this.slotStateSyncCaches.get(slot)].forEach(fn => {
548
+ if (fn) {
549
+ fn();
550
+ }
551
+ });
552
+ slot.sliceContent().forEach(i => {
553
+ if (typeof i !== 'string') {
554
+ this.cleanSubscriptionsByComponent(i);
555
+ }
556
+ });
557
+ }
558
+ cleanSubscriptionsByComponent(component) {
559
+ [this.slotsSyncCaches.get(component), this.componentStateSyncCaches.get(component)].forEach(fn => {
560
+ if (fn) {
561
+ fn();
562
+ }
563
+ });
564
+ component.slots.toArray().forEach(slot => {
565
+ this.cleanSubscriptionsBySlot(slot);
566
+ });
567
+ }
547
568
  };
548
569
  Collaborate = __decorate([
549
570
  Injectable(),
@@ -568,4 +589,4 @@ function makeFormats(registry, attrs) {
568
589
  }
569
590
  return formats;
570
591
  }
571
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGFib3JhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29sbGFib3JhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUN0QyxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBYyxPQUFPLEVBQWdCLE1BQU0sZUFBZSxDQUFBO0FBQ25GLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLFVBQVUsRUFDVixRQUFRLEVBQ1IsU0FBUyxFQUVBLFFBQVEsRUFBRSxJQUFJLEVBQXFCLFNBQVMsRUFDdEQsTUFBTSxlQUFlLENBQUE7QUFDdEIsT0FBTyxFQUNMLEdBQUcsSUFBSSxJQUFJLEVBQ1gsR0FBRyxJQUFJLElBQUksRUFDWCxJQUFJLElBQUksS0FBSyxFQUNiLEtBQUssSUFBSSxNQUFNLEVBQ2YsV0FBVyxFQUVaLE1BQU0sS0FBSyxDQUFBO0FBRVosT0FBTyxFQUFFLGlCQUFpQixFQUFtQixNQUFNLGVBQWUsQ0FBQTtBQUVsRSxNQUFNLGtCQUFrQixHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQTtBQUduRCxJQUFhLFdBQVcsR0FBeEIsTUFBYSxXQUFXO0lBaUN0QixZQUFvQixnQkFBa0MsRUFDbEMsaUJBQW9DLEVBQ3BDLFVBQXNCLEVBQ3RCLFFBQWtCLEVBQ2xCLFFBQWtCLEVBQ2xCLFNBQW9CLEVBQ3BCLE9BQWdCOzs7OzttQkFOaEI7Ozs7OzttQkFDQTs7Ozs7O21CQUNBOzs7Ozs7bUJBQ0E7Ozs7OzttQkFDQTs7Ozs7O21CQUNBOzs7Ozs7bUJBQ0E7O1FBdENwQjs7Ozs7V0FBNkM7UUFDN0M7Ozs7bUJBQU8sSUFBSSxJQUFJLEVBQUU7V0FBQTtRQUNqQjs7Ozs7V0FBd0I7UUFDeEI7Ozs7O1dBQTJCO1FBQzNCOzs7OztXQUF5QjtRQUN6Qjs7Ozs7V0FBd0I7UUFVeEI7Ozs7bUJBQW9CLElBQUksT0FBTyxFQUFR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LENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQzVDLElBQUksU0FBUyxFQUFFO2dCQUNiLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQTthQUN0QztRQUNILENBQUMsQ0FBQyxDQUFBO0tBQ0g7SUFDRCxPQUFPLE9BQU8sQ0FBQTtBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0B0YW5iby9kaSdcbmltcG9ydCB7IG1lcmdlLCBtaWNyb1Rhc2ssIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ0B0YW5iby9zdHJlYW0nXG5pbXBvcnQge1xuICBSb290Q29tcG9uZW50UmVmLFxuICBTdGFydGVyLFxuICBUcmFuc2xhdG9yLFxuICBSZWdpc3RyeSxcbiAgU2VsZWN0aW9uLFxuICBTZWxlY3Rpb25QYXRocyxcbiAgSGlzdG9yeSwgUmVuZGVyZXIsIFNsb3QsIENvbXBvbmVudEluc3RhbmNlLCBtYWtlRXJyb3IsIEZvcm1hdHNcbn0gZnJvbSAnQHRleHRidXMvY29yZSdcbmltcG9ydCB7XG4gIERvYyBhcyBZRG9jLFxuICBNYXAgYXMgWU1hcCxcbiAgVGV4dCBhcyBZVGV4dCxcbiAgQXJyYXkgYXMgWUFycmF5LFxuICBVbmRvTWFuYWdlcixcbiAgVHJhbnNhY3Rpb25cbn0gZnJvbSAneWpzJ1xuXG5pbXBvcnQgeyBDb2xsYWJvcmF0ZUN1cnNvciwgUmVtb3RlU2VsZWN0aW9uIH0gZnJvbSAnLi9jb2xsYWIvX2FwaSdcblxuY29uc3QgY29sbGFib3JhdGVFcnJvckZuID0gbWFrZUVycm9yKCdDb2xsYWJvcmF0ZScpXG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDb2xsYWJvcmF0ZSBpbXBsZW1lbnRzIEhpc3Rvcnkge1xuICBvblNlbGVjdGlvbkNoYW5nZTogT2JzZXJ2YWJsZTxTZWxlY3Rpb25QYXRocz5cbiAgeURvYyA9IG5ldyBZRG9jKClcbiAgb25CYWNrOiBPYnNlcnZhYmxlPHZvaWQ+XG4gIG9uRm9yd2FyZDogT2JzZXJ2YWJsZTx2b2lkPlxuICBvbkNoYW5nZTogT2JzZXJ2YWJsZTxhbnk+XG4gIG9uUHVzaDogT2JzZXJ2YWJsZTx2b2lkPlxuXG4gIGdldCBjYW5CYWNrKCkge1xuICAgIHJldHVybiB0aGlzLm1hbmFnZXI/LmNhblVuZG8oKVxuICB9XG5cbiAgZ2V0IGNhbkZvcndhcmQoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFuYWdlcj8uY2FuUmVkbygpXG4gIH1cblxuICBwcml2YXRlIGJhY2tFdmVudCA9IG5ldyBTdWJqZWN0PHZvaWQ+KClcbiAgcHJpdmF0ZSBmb3J3YXJkRXZlbnQgPSBuZXcgU3ViamVjdDx2b2lkPigpXG4gIHByaXZhdGUgY2hhbmdlRXZlbnQgPSBuZXcgU3ViamVjdDx2b2lkPigpXG4gIHByaXZhdGUgcHVzaEV2ZW50ID0gbmV3IFN1YmplY3Q8dm9pZD4oKVxuXG4gIHByaXZhdGUgbWFuYWdlciE6IFVuZG9NYW5hZ2VyXG5cbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdXG4gIHByaXZhdGUgdXBkYXRlRnJvbVJlbW90ZSA9IGZhbHNlXG5cbiAgcHJpdmF0ZSBjb250ZW50U3luY0NhY2hlcyA9IG5ldyBXZWFrTWFwPFNsb3QsICgpID0+IHZvaWQ+KClcbiAgcHJpdmF0ZSBzbG90U3RhdGVTeW5jQ2FjaGVzID0gbmV3IFdlYWtNYXA8U2xvdCwgKCkgPT4gdm9pZD4oKVxuICBwcml2YXRlIHNsb3RzU3luY0NhY2hlcyA9IG5ldyBXZWFrTWFwPENvbXBvbmVudEluc3RhbmNlLCAoKSA9PiB2b2lkPigpXG4gIHByaXZhdGUgY29tcG9uZW50U3RhdGVTeW5jQ2FjaGVzID0gbmV3IFdlYWtNYXA8Q29tcG9uZW50SW5zdGFuY2UsICgpID0+IHZvaWQ+KClcblxuICBwcml2YXRlIHNlbGVjdGlvbkNoYW5nZUV2ZW50ID0gbmV3IFN1YmplY3Q8U2VsZWN0aW9uUGF0aHM+KClcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJvb3RDb21wb25lbnRSZWY6IFJvb3RDb21wb25lbnRSZWYsXG4gICAgICAgICAgICAgIHByaXZhdGUgY29sbGFib3JhdGVDdXJzb3I6IENvbGxhYm9yYXRlQ3Vyc29yLFxuICAgICAgICAgICAgICBwcml2YXRlIHRyYW5zbGF0b3I6IFRyYW5zbGF0b3IsXG4gICAgICAgICAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyLFxuICAgICAgICAgICAgICBwcml2YXRlIHJlZ2lzdHJ5OiBSZWdpc3RyeSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBzZWxlY3Rpb246IFNlbGVjdGlvbixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBzdGFydGVyOiBTdGFydGVyKSB7XG4gICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSA9IHRoaXMuc2VsZWN0aW9uQ2hhbmdlRXZlbnQuYXNPYnNlcnZhYmxlKClcbiAgICB0aGlzLm9uQmFjayA9IHRoaXMuYmFja0V2ZW50LmFzT2JzZXJ2YWJsZSgpXG4gICAgdGhpcy5vbkZvcndhcmQgPSB0aGlzLmZvcndhcmRFdmVudC5hc09ic2VydmFibGUoKVxuICAgIHRoaXMub25DaGFuZ2UgPSB0aGlzLmNoYW5nZUV2ZW50LmFzT2JzZXJ2YWJsZSgpXG4gICAgdGhpcy5vblB1c2ggPSB0aGlzLnB1c2hFdmVudC5hc09ic2VydmFibGUoKVxuICB9XG5cbiAgc2V0dXAoKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLnN0YXJ0ZXIub25SZWFkeS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmxpc3RlbjIoKVxuICAgICAgfSksXG4gICAgICB0aGlzLnNlbGVjdGlvbi5vbkNoYW5nZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBjb25zdCBwYXRocyA9IHRoaXMuc2VsZWN0aW9uLmdldFBhdGhzKClcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VFdmVudC5uZXh0KHBhdGhzKVxuICAgICAgfSlcbiAgICApXG4gIH1cblxuICB1cGRhdGVSZW1vdGVTZWxlY3Rpb24ocGF0aHM6IFJlbW90ZVNlbGVjdGlvbltdKSB7XG4gICAgdGhpcy5jb2xsYWJvcmF0ZUN1cnNvci5kcmF3KHBhdGhzKVxuICB9XG5cbiAgbGlzdGVuKCkge1xuICAgIC8vXG4gIH1cblxuICBiYWNrKCkge1xuICAgIGlmICh0aGlzLmNhbkJhY2spIHtcbiAgICAgIHRoaXMubWFuYWdlci51bmRvKClcbiAgICB9XG4gIH1cblxuICBmb3J3YXJkKCkge1xuICAgIGlmICh0aGlzLmNhbkZvcndhcmQpIHtcbiAgICAgIHRoaXMubWFuYWdlci5yZWRvKClcbiAgICB9XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKGkgPT4gaS51bnN1YnNjcmliZSgpKVxuICB9XG5cbiAgcHJpdmF0ZSBsaXN0ZW4yKCkge1xuICAgIGNvbnN0IHJvb3QgPSB0aGlzLnlEb2MuZ2V0VGV4dCgnY29udGVudCcpXG4gICAgY29uc3Qgcm9vdENvbXBvbmVudCA9IHRoaXMucm9vdENvbXBvbmVudFJlZi5jb21wb25lbnQhXG4gICAgdGhpcy5tYW5hZ2VyID0gbmV3IFVuZG9NYW5hZ2VyKHJvb3QsIHtcbiAgICAgIHRyYWNrZWRPcmlnaW5zOiBuZXcgU2V0PGFueT4oW3RoaXMueURvY10pXG4gICAgfSlcbiAgICB0aGlzLnN5bmNDb250ZW50KHJvb3QsIHJvb3RDb21wb25lbnQuc2xvdHMuZ2V0KDApISlcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgbWVyZ2UoXG4gICAgICAgIHJvb3RDb21wb25lbnQuY2hhbmdlTWFya2VyLm9uRm9yY2VDaGFuZ2UsXG4gICAgICAgIHJvb3RDb21wb25lbnQuY2hhbmdlTWFya2VyLm9uQ2hhbmdlXG4gICAgICApLnBpcGUoXG4gICAgICAgIG1pY3JvVGFzaygpXG4gICAgICApLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVuZGVyKClcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucmVzdG9yZSgpXG4gICAgICB9KVxuICAgIClcbiAgfVxuXG4gIHByaXZhdGUgc3luY0NvbnRlbnQoY29udGVudDogWVRleHQsIHNsb3Q6IFNsb3QpIHtcbiAgICBjb25zdCBmbiA9IHRoaXMuY29udGVudFN5bmNDYWNoZXMuZ2V0KHNsb3QpXG4gICAgaWYgKGZuKSB7XG4gICAgICBmbigpXG4gICAgfVxuICAgIGNvbnN0IHN5bmNSZW1vdGUgPSAoZXYsIHRyKSA9PiB7XG4gICAgICB0aGlzLnJ1blJlbW90ZVVwZGF0ZSh0ciwgKCkgPT4ge1xuICAgICAgICBzbG90LnJldGFpbigwKVxuICAgICAgICBldi5kZWx0YS5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgICAgICAgaWYgKFJlZmxlY3QuaGFzKGFjdGlvbiwgJ3JldGFpbicpKSB7XG4gICAgICAgICAgICBzbG90LnJldGFpbihhY3Rpb24ucmV0YWluISwgbWFrZUZvcm1hdHModGhpcy5yZWdpc3RyeSwgYWN0aW9uLmF0dHJpYnV0ZXMpKVxuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmluc2VydCkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzbG90LmluZGV4XG4gICAgICAgICAgICBsZXQgbGVuZ3RoID0gMVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb24uaW5zZXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICBsZW5ndGggPSBhY3Rpb24uaW5zZXJ0Lmxlbmd0aFxuICAgICAgICAgICAgICBzbG90Lmluc2VydChhY3Rpb24uaW5zZXJ0LCBtYWtlRm9ybWF0cyh0aGlzLnJlZ2lzdHJ5LCBhY3Rpb24uYXR0cmlidXRlcykpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCBzaGFyZWRDb21wb25lbnQgPSBhY3Rpb24uaW5zZXJ0IGFzIFlNYXA8YW55PlxuICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmNyZWF0ZUNvbXBvbmVudEJ5U2hhcmVkQ29tcG9uZW50KHNoYXJlZENvbXBvbmVudClcbiAgICAgICAgICAgICAgdGhpcy5zeW5jU2xvdHMoc2hhcmVkQ29tcG9uZW50LmdldCgnc2xvdHMnKSwgY29tcG9uZW50KVxuICAgICAgICAgICAgICB0aGlzLnN5bmNDb21wb25lbnQoc2hhcmVkQ29tcG9uZW50LCBjb21wb25lbnQpXG4gICAgICAgICAgICAgIHNsb3QuaW5zZXJ0KGNvbXBvbmVudClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbi5pc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICAgIGlmIChzbG90ID09PSB0aGlzLnNlbGVjdGlvbi5zdGFydFNsb3QgJiYgdGhpcy5zZWxlY3Rpb24uc3RhcnRPZmZzZXQhID49IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2V0U3RhcnQoc2xvdCwgdGhpcy5zZWxlY3Rpb24uc3RhcnRPZmZzZXQhICsgbGVuZ3RoKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzbG90ID09PSB0aGlzLnNlbGVjdGlvbi5lbmRTbG90ICYmIHRoaXMuc2VsZWN0aW9uLmVuZE9mZnNldCEgPj0gaW5kZXgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZXRFbmQoc2xvdCwgdGhpcy5zZWxlY3Rpb24uZW5kT2Zmc2V0ISArIGxlbmd0aClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmRlbGV0ZSkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzbG90LmluZGV4XG4gICAgICAgICAgICBzbG90LnJldGFpbihzbG90LmluZGV4KVxuICAgICAgICAgICAgc2xvdC5kZWxldGUoYWN0aW9uLmRlbGV0ZSlcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbi5pc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICAgIGlmIChzbG90ID09PSB0aGlzLnNlbGVjdGlvbi5zdGFydFNsb3QgJiYgdGhpcy5zZWxlY3Rpb24uc3RhcnRPZmZzZXQhID49IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2V0U3RhcnQoc2xvdCwgdGhpcy5zZWxlY3Rpb24uc3RhcnRPZmZzZXQhIC0gYWN0aW9uLmRlbGV0ZSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoc2xvdCA9PT0gdGhpcy5zZWxlY3Rpb24uZW5kU2xvdCAmJiB0aGlzLnNlbGVjdGlvbi5lbmRPZmZzZXQhID49IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2V0RW5kKHNsb3QsIHRoaXMuc2VsZWN0aW9uLmVuZE9mZnNldCEgLSBhY3Rpb24uZGVsZXRlKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uYXR0cmlidXRlcykge1xuICAgICAgICAgICAgc2xvdC51cGRhdGVTdGF0ZShkcmFmdCA9PiB7XG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZHJhZnQsIGFjdGlvbi5hdHRyaWJ1dGVzKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH1cbiAgICBjb250ZW50Lm9ic2VydmUoc3luY1JlbW90ZSlcblxuICAgIGNvbnN0IHN1YiA9IHNsb3Qub25Db250ZW50Q2hhbmdlLnN1YnNjcmliZShhY3Rpb25zID0+IHtcbiAgICAgIHRoaXMucnVuTG9jYWxVcGRhdGUoKCkgPT4ge1xuICAgICAgICBsZXQgb2Zmc2V0ID0gMFxuICAgICAgICBsZXQgbGVuZ3RoID0gMFxuICAgICAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiBhY3Rpb25zKSB7XG4gICAgICAgICAgaWYgKGFjdGlvbi50eXBlID09PSAncmV0YWluJykge1xuICAgICAgICAgICAgaWYgKGFjdGlvbi5mb3JtYXRzKSB7XG4gICAgICAgICAgICAgIGNvbnRlbnQuZm9ybWF0KG9mZnNldCwgYWN0aW9uLm9mZnNldCwgYWN0aW9uLmZvcm1hdHMpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvZmZzZXQgPSBhY3Rpb24ub2Zmc2V0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24udHlwZSA9PT0gJ2luc2VydCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlbHRhID0gY29udGVudC50b0RlbHRhKClcbiAgICAgICAgICAgIGNvbnN0IGlzRW1wdHkgPSBkZWx0YS5sZW5ndGggPT09IDEgJiYgZGVsdGFbMF0uaW5zZXJ0ID09PSBTbG90LmVtcHR5UGxhY2Vob2xkZXJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYWN0aW9uLmNvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgIGxlbmd0aCA9IGFjdGlvbi5jb250ZW50Lmxlbmd0aFxuICAgICAgICAgICAgICBjb250ZW50Lmluc2VydChvZmZzZXQsIGFjdGlvbi5jb250ZW50KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbGVuZ3RoID0gMVxuICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBzbG90LmdldENvbnRlbnRBdEluZGV4KG9mZnNldCkgYXMgQ29tcG9uZW50SW5zdGFuY2VcbiAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkQ29tcG9uZW50ID0gdGhpcy5jcmVhdGVTaGFyZWRDb21wb25lbnRCeUNvbXBvbmVudChjb21wb25lbnQpXG4gICAgICAgICAgICAgIGNvbnRlbnQuaW5zZXJ0RW1iZWQob2Zmc2V0LCBzaGFyZWRDb21wb25lbnQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYWN0aW9uLmZvcm1hdHMpIHtcbiAgICAgICAgICAgICAgY29udGVudC5mb3JtYXQob2Zmc2V0LCBsZW5ndGgsIGFjdGlvbi5mb3JtYXRzKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzRW1wdHkgJiYgb2Zmc2V0ID09PSAwKSB7XG4gICAgICAgICAgICAgIGNvbnRlbnQuZGVsZXRlKGNvbnRlbnQubGVuZ3RoIC0gMSwgMSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZnNldCArPSBsZW5ndGhcbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi50eXBlID09PSAnZGVsZXRlJykge1xuICAgICAgICAgICAgY29uc3QgZGVsdGEgPSBjb250ZW50LnRvRGVsdGEoKVxuICAgICAgICAgICAgY29udGVudC5kZWxldGUob2Zmc2V0LCBhY3Rpb24uY291bnQpXG4gICAgICAgICAgICBpZiAoY29udGVudC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgY29udGVudC5pbnNlcnQoMCwgJ1xcbicsIGRlbHRhWzBdPy5hdHRyaWJ1dGVzKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuICAgIHRoaXMuY29udGVudFN5bmNDYWNoZXMuc2V0KHNsb3QsICgpID0+IHtcbiAgICAgIGNvbnRlbnQudW5vYnNlcnZlKHN5bmNSZW1vdGUpXG4gICAgICBzdWIudW5zdWJzY3JpYmUoKVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIHN5bmNTbG90KHJlbW90ZVNsb3Q6IFlNYXA8YW55Piwgc2xvdDogU2xvdCkge1xuICAgIGNvbnN0IGZuID0gdGhpcy5zbG90U3RhdGVTeW5jQ2FjaGVzLmdldChzbG90KVxuICAgIGlmIChmbikge1xuICAgICAgZm4oKVxuICAgIH1cbiAgICBjb25zdCBzeW5jUmVtb3RlID0gKGV2LCB0cikgPT4ge1xuICAgICAgdGhpcy5ydW5SZW1vdGVVcGRhdGUodHIsICgpID0+IHtcbiAgICAgICAgZXYua2V5c0NoYW5nZWQuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgIGlmIChrZXkgPT09ICdzdGF0ZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gKGV2LnRhcmdldCBhcyBZTWFwPGFueT4pLmdldCgnc3RhdGUnKVxuICAgICAgICAgICAgc2xvdC51cGRhdGVTdGF0ZShkcmFmdCA9PiB7XG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZHJhZnQsIHN0YXRlKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH1cbiAgICByZW1vdGVTbG90Lm9ic2VydmUoc3luY1JlbW90ZSlcblxuICAgIGNvbnN0IHN1YiA9IHNsb3Qub25TdGF0ZUNoYW5nZS5zdWJzY3JpYmUoYWN0aW9ucyA9PiB7XG4gICAgICB0aGlzLnJ1bkxvY2FsVXBkYXRlKCgpID0+IHtcbiAgICAgICAgYWN0aW9ucy5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgICAgICAgcmVtb3RlU2xvdC5zZXQoJ3N0YXRlJywgYWN0aW9uLnZhbHVlKVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuICAgIHRoaXMuc2xvdFN0YXRlU3luY0NhY2hlcy5zZXQoc2xvdCwgKCkgPT4ge1xuICAgICAgcmVtb3RlU2xvdC51bm9ic2VydmUoc3luY1JlbW90ZSlcbiAgICAgIHN1Yi51bnN1YnNjcmliZSgpXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgc3luY1Nsb3RzKHJlbW90ZVNsb3RzOiBZQXJyYXk8YW55PiwgY29tcG9uZW50OiBDb21wb25lbnRJbnN0YW5jZSkge1xuICAgIGNvbnN0IHNsb3RzID0gY29tcG9uZW50LnNsb3RzXG4gICAgY29uc3QgZm4gPSB0aGlzLnNsb3RzU3luY0NhY2hlcy5nZXQoY29tcG9uZW50KVxuICAgIGlmIChmbikge1xuICAgICAgZm4oKVxuICAgIH1cbiAgICBjb25zdCBzeW5jUmVtb3RlID0gKGV2LCB0cikgPT4ge1xuICAgICAgdGhpcy5ydW5SZW1vdGVVcGRhdGUodHIsICgpID0+IHtcbiAgICAgICAgZXYuZGVsdGEuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgICAgICAgIGlmIChSZWZsZWN0LmhhcyhhY3Rpb24sICdyZXRhaW4nKSkge1xuICAgICAgICAgICAgc2xvdHMucmV0YWluKGFjdGlvbi5yZXRhaW4hKVxuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmluc2VydCkge1xuICAgICAgICAgICAgKGFjdGlvbi5pbnNlcnQgYXMgQXJyYXk8WU1hcDxhbnk+PikuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qgc2xvdCA9IHRoaXMuY3JlYXRlU2xvdEJ5U2hhcmVkU2xvdChpdGVtKVxuICAgICAgICAgICAgICBzbG90cy5pbnNlcnQoc2xvdClcbiAgICAgICAgICAgICAgdGhpcy5zeW5jQ29udGVudChpdGVtLmdldCgnY29udGVudCcpLCBzbG90KVxuICAgICAgICAgICAgICB0aGlzLnN5bmNTbG90KGl0ZW0sIHNsb3QpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmRlbGV0ZSkge1xuICAgICAgICAgICAgc2xvdHMucmV0YWluKHNsb3RzLmluZGV4KVxuICAgICAgICAgICAgc2xvdHMuZGVsZXRlKGFjdGlvbi5kZWxldGUpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG4gICAgcmVtb3RlU2xvdHMub2JzZXJ2ZShzeW5jUmVtb3RlKVxuXG4gICAgY29uc3Qgc3ViID0gc2xvdHMub25DaGFuZ2Uuc3Vic2NyaWJlKG9wZXJhdGlvbnMgPT4ge1xuICAgICAgdGhpcy5ydW5Mb2NhbFVwZGF0ZSgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGFwcGx5QWN0aW9ucyA9IG9wZXJhdGlvbnMuYXBwbHlcbiAgICAgICAgbGV0IGluZGV4OiBudW1iZXJcbiAgICAgICAgYXBwbHlBY3Rpb25zLmZvckVhY2goYWN0aW9uID0+IHtcbiAgICAgICAgICBpZiAoYWN0aW9uLnR5cGUgPT09ICdyZXRhaW4nKSB7XG4gICAgICAgICAgICBpbmRleCA9IGFjdGlvbi5vZmZzZXRcbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi50eXBlID09PSAnaW5zZXJ0U2xvdCcpIHtcbiAgICAgICAgICAgIGNvbnN0IHNsb3QgPSBzbG90cy5nZXQoaW5kZXgpIVxuICAgICAgICAgICAgY29uc3Qgc2hhcmVkU2xvdCA9IHRoaXMuY3JlYXRlU2hhcmVkU2xvdEJ5U2xvdChzbG90KVxuICAgICAgICAgICAgcmVtb3RlU2xvdHMuaW5zZXJ0KGluZGV4LCBbc2hhcmVkU2xvdF0pXG4gICAgICAgICAgICBpbmRleCsrXG4gICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24udHlwZSA9PT0gJ2RlbGV0ZScpIHtcbiAgICAgICAgICAgIHJlbW90ZVNsb3RzLmRlbGV0ZShpbmRleCwgYWN0aW9uLmNvdW50KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHRoaXMuc2xvdHNTeW5jQ2FjaGVzLnNldChjb21wb25lbnQsICgpID0+IHtcbiAgICAgIHJlbW90ZVNsb3RzLnVub2JzZXJ2ZShzeW5jUmVtb3RlKVxuICAgICAgc3ViLnVuc3Vic2NyaWJlKClcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBzeW5jQ29tcG9uZW50KHJlbW90ZUNvbXBvbmVudDogWU1hcDxhbnk+LCBjb21wb25lbnQ6IENvbXBvbmVudEluc3RhbmNlKSB7XG4gICAgY29uc3QgZm4gPSB0aGlzLmNvbXBvbmVudFN0YXRlU3luY0NhY2hlcy5nZXQoY29tcG9uZW50KVxuICAgIGlmIChmbikge1xuICAgICAgZm4oKVxuICAgIH1cbiAgICBjb25zdCBzeW5jUmVtb3RlID0gKGV2LCB0cikgPT4ge1xuICAgICAgdGhpcy5ydW5SZW1vdGVVcGRhdGUodHIsICgpID0+IHtcbiAgICAgICAgZXYua2V5c0NoYW5nZWQuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgIGlmIChrZXkgPT09ICdzdGF0ZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gKGV2LnRhcmdldCBhcyBZTWFwPGFueT4pLmdldCgnc3RhdGUnKVxuICAgICAgICAgICAgY29tcG9uZW50LnVwZGF0ZVN0YXRlKGRyYWZ0ID0+IHtcbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihkcmFmdCwgc3RhdGUpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuICAgIHJlbW90ZUNvbXBvbmVudC5vYnNlcnZlKHN5bmNSZW1vdGUpXG5cbiAgICBjb25zdCBzdWIgPSBjb21wb25lbnQub25TdGF0ZUNoYW5nZS5zdWJzY3JpYmUobmV3U3RhdGUgPT4ge1xuICAgICAgdGhpcy5ydW5Mb2NhbFVwZGF0ZSgoKSA9PiB7XG4gICAgICAgIHJlbW90ZUNvbXBvbmVudC5zZXQoJ3N0YXRlJywgbmV3U3RhdGUpXG4gICAgICB9KVxuICAgIH0pXG4gICAgdGhpcy5jb21wb25lbnRTdGF0ZVN5bmNDYWNoZXMuc2V0KGNvbXBvbmVudCwgKCkgPT4ge1xuICAgICAgcmVtb3RlQ29tcG9uZW50LnVub2JzZXJ2ZShzeW5jUmVtb3RlKVxuICAgICAgc3ViLnVuc3Vic2NyaWJlKClcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBydW5Mb2NhbFVwZGF0ZShmbjogKCkgPT4gdm9pZCkge1xuICAgIGlmICh0aGlzLnVwZGF0ZUZyb21SZW1vdGUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBmbigpXG4gIH1cblxuICBwcml2YXRlIHJ1blJlbW90ZVVwZGF0ZSh0cjogVHJhbnNhY3Rpb24sIGZuOiAoKSA9PiB2b2lkKSB7XG4gICAgaWYgKCF0ci5vcmlnaW4pIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUZyb21SZW1vdGUgPSB0cnVlXG4gICAgZm4oKVxuICAgIHRoaXMudXBkYXRlRnJvbVJlbW90ZSA9IGZhbHNlXG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVNoYXJlZENvbXBvbmVudEJ5Q29tcG9uZW50KGNvbXBvbmVudDogQ29tcG9uZW50SW5zdGFuY2UpOiBZTWFwPGFueT4ge1xuICAgIGNvbnN0IHNoYXJlZENvbXBvbmVudCA9IG5ldyBZTWFwKClcbiAgICBzaGFyZWRDb21wb25lbnQuc2V0KCdzdGF0ZScsIGNvbXBvbmVudC5zdGF0ZSlcbiAgICBzaGFyZWRDb21wb25lbnQuc2V0KCduYW1lJywgY29tcG9uZW50Lm5hbWUpXG4gICAgY29uc3Qgc2hhcmVkU2xvdHMgPSBuZXcgWUFycmF5KClcbiAgICBzaGFyZWRDb21wb25lbnQuc2V0KCdzbG90cycsIHNoYXJlZFNsb3RzKVxuICAgIGNvbXBvbmVudC5zbG90cy50b0FycmF5KCkuZm9yRWFjaChzbG90ID0+IHtcbiAgICAgIGNvbnN0IHNoYXJlZFNsb3QgPSB0aGlzLmNyZWF0ZVNoYXJlZFNsb3RCeVNsb3Qoc2xvdClcbiAgICAgIHNoYXJlZFNsb3RzLnB1c2goW3NoYXJlZFNsb3RdKVxuICAgIH0pXG4gICAgdGhpcy5zeW5jU2xvdHMoc2hhcmVkU2xvdHMsIGNvbXBvbmVudClcbiAgICB0aGlzLnN5bmNDb21wb25lbnQoc2hhcmVkQ29tcG9uZW50LCBjb21wb25lbnQpXG4gICAgcmV0dXJuIHNoYXJlZENvbXBvbmVudFxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTaGFyZWRTbG90QnlTbG90KHNsb3Q6IFNsb3QpOiBZTWFwPGFueT4ge1xuICAgIGNvbnN0IHNoYXJlZFNsb3QgPSBuZXcgWU1hcCgpXG4gICAgc2hhcmVkU2xvdC5zZXQoJ3NjaGVtYScsIHNsb3Quc2NoZW1hKVxuICAgIHNoYXJlZFNsb3Quc2V0KCdzdGF0ZScsIHNsb3Quc3RhdGUpXG4gICAgY29uc3Qgc2hhcmVkQ29udGVudCA9IG5ldyBZVGV4dCgpXG4gICAgc2hhcmVkU2xvdC5zZXQoJ2NvbnRlbnQnLCBzaGFyZWRDb250ZW50KVxuICAgIGxldCBvZmZzZXQgPSAwXG4gICAgc2xvdC50b0RlbHRhKCkuZm9yRWFjaChpID0+IHtcbiAgICAgIGxldCBmb3JtYXRzOiBhbnkgPSB7fVxuICAgICAgaWYgKGkuZm9ybWF0cykge1xuICAgICAgICBpLmZvcm1hdHMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICBmb3JtYXRzW2l0ZW1bMF0ubmFtZV0gPSBpdGVtWzFdXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3JtYXRzID0gbnVsbFxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBpLmluc2VydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc2hhcmVkQ29udGVudC5pbnNlcnQob2Zmc2V0LCBpLmluc2VydCwgZm9ybWF0cylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHNoYXJlZENvbXBvbmVudCA9IHRoaXMuY3JlYXRlU2hhcmVkQ29tcG9uZW50QnlDb21wb25lbnQoaS5pbnNlcnQpXG4gICAgICAgIHNoYXJlZENvbnRlbnQuaW5zZXJ0RW1iZWQob2Zmc2V0LCBzaGFyZWRDb21wb25lbnQsIGZvcm1hdHMpXG4gICAgICB9XG4gICAgICBvZmZzZXQgKz0gaS5pbnNlcnQubGVuZ3RoXG4gICAgfSlcbiAgICB0aGlzLnN5bmNDb250ZW50KHNoYXJlZENvbnRlbnQsIHNsb3QpXG4gICAgdGhpcy5zeW5jU2xvdChzaGFyZWRTbG90LCBzbG90KVxuICAgIHJldHVybiBzaGFyZWRTbG90XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNvbXBvbmVudEJ5U2hhcmVkQ29tcG9uZW50KHlNYXA6IFlNYXA8YW55Pik6IENvbXBvbmVudEluc3RhbmNlIHtcbiAgICBjb25zdCBzaGFyZWRTbG90cyA9IHlNYXAuZ2V0KCdzbG90cycpIGFzIFlBcnJheTxZTWFwPGFueT4+XG4gICAgY29uc3Qgc2xvdHM6IFNsb3RbXSA9IFtdXG4gICAgc2hhcmVkU2xvdHMuZm9yRWFjaChzaGFyZWRTbG90ID0+IHtcbiAgICAgIGNvbnN0IHNsb3QgPSB0aGlzLmNyZWF0ZVNsb3RCeVNoYXJlZFNsb3Qoc2hhcmVkU2xvdClcbiAgICAgIHNsb3RzLnB1c2goc2xvdClcbiAgICB9KVxuICAgIGNvbnN0IG5hbWUgPSB5TWFwLmdldCgnbmFtZScpXG4gICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLnRyYW5zbGF0b3IuY3JlYXRlQ29tcG9uZW50QnlEYXRhKG5hbWUsIHtcbiAgICAgIHN0YXRlOiB5TWFwLmdldCgnc3RhdGUnKSxcbiAgICAgIHNsb3RzXG4gICAgfSlcbiAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgIGluc3RhbmNlLnNsb3RzLnRvQXJyYXkoKS5mb3JFYWNoKChzbG90LCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBzaGFyZWRTbG90ID0gc2hhcmVkU2xvdHMuZ2V0KGluZGV4KVxuICAgICAgICB0aGlzLnN5bmNTbG90KHNoYXJlZFNsb3QsIHNsb3QpXG4gICAgICAgIHRoaXMuc3luY0NvbnRlbnQoc2hhcmVkU2xvdC5nZXQoJ2NvbnRlbnQnKSwgc2xvdClcbiAgICAgIH0pXG4gICAgICByZXR1cm4gaW5zdGFuY2VcbiAgICB9XG4gICAgdGhyb3cgY29sbGFib3JhdGVFcnJvckZuKGBjYW5ub3QgZmluZCBjb21wb25lbnQgZmFjdG9yeSBcXGAke25hbWV9XFxgLmApXG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVNsb3RCeVNoYXJlZFNsb3Qoc2hhcmVkU2xvdDogWU1hcDxhbnk+KTogU2xvdCB7XG4gICAgY29uc3QgY29udGVudCA9IHNoYXJlZFNsb3QuZ2V0KCdjb250ZW50JykgYXMgWVRleHRcbiAgICBjb25zdCBkZWx0YSA9IGNvbnRlbnQudG9EZWx0YSgpXG5cbiAgICBjb25zdCBzbG90ID0gdGhpcy50cmFuc2xhdG9yLmNyZWF0ZVNsb3Qoe1xuICAgICAgc2NoZW1hOiBzaGFyZWRTbG90LmdldCgnc2NoZW1hJyksXG4gICAgICBzdGF0ZTogc2hhcmVkU2xvdC5nZXQoJ3N0YXRlJyksXG4gICAgICBmb3JtYXRzOiB7fSxcbiAgICAgIGNvbnRlbnQ6IFtdXG4gICAgfSlcblxuICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIGRlbHRhKSB7XG4gICAgICBpZiAoYWN0aW9uLmluc2VydCkge1xuICAgICAgICBpZiAodHlwZW9mIGFjdGlvbi5pbnNlcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgc2xvdC5pbnNlcnQoYWN0aW9uLmluc2VydCwgbWFrZUZvcm1hdHModGhpcy5yZWdpc3RyeSwgYWN0aW9uLmF0dHJpYnV0ZXMpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHNoYXJlZENvbXBvbmVudCA9IGFjdGlvbi5pbnNlcnQgYXMgWU1hcDxhbnk+XG4gICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jcmVhdGVDb21wb25lbnRCeVNoYXJlZENvbXBvbmVudChzaGFyZWRDb21wb25lbnQpXG4gICAgICAgICAgc2xvdC5pbnNlcnQoY29tcG9uZW50KVxuICAgICAgICAgIHRoaXMuc3luY1Nsb3RzKHNoYXJlZENvbXBvbmVudC5nZXQoJ3Nsb3RzJyksIGNvbXBvbmVudClcbiAgICAgICAgICB0aGlzLnN5bmNDb21wb25lbnQoc2hhcmVkQ29tcG9uZW50LCBjb21wb25lbnQpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGNvbGxhYm9yYXRlRXJyb3JGbigndW5leHBlY3RlZCBkZWx0YSBhY3Rpb24uJylcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNsb3RcbiAgfVxufVxuXG5mdW5jdGlvbiBtYWtlRm9ybWF0cyhyZWdpc3RyeTogUmVnaXN0cnksIGF0dHJzPzogYW55KSB7XG4gIGNvbnN0IGZvcm1hdHM6IEZvcm1hdHMgPSBbXVxuICBpZiAoYXR0cnMpIHtcbiAgICBPYmplY3Qua2V5cyhhdHRycykubWFwKGtleSA9PiB7XG4gICAgICBjb25zdCBmb3JtYXR0ZXIgPSByZWdpc3RyeS5nZXRGb3JtYXR0ZXIoa2V5KVxuICAgICAgaWYgKGZvcm1hdHRlcikge1xuICAgICAgICBmb3JtYXRzLnB1c2goW2Zvcm1hdHRlciwgYXR0cnNba2V5XV0pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuICByZXR1cm4gZm9ybWF0c1xufVxuIl19
592
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGFib3JhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29sbGFib3JhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUN0QyxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBYyxPQUFPLEVBQWdCLE1BQU0sZUFBZSxDQUFBO0FBQ25GLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLFVBQVUsRUFDVixRQUFRLEVBQ1IsU0FBUyxFQUVBLFFBQVEsRUFBRSxJQUFJLEVBQXFCLFNBQVMsRUFDdEQsTUFBTSxlQUFlLENBQUE7QUFDdEIsT0FBTyxFQUNMLEdBQUcsSUFBSSxJQUFJLEVBQ1gsR0FBRyxJQUFJLElBQUksRUFDWCxJQUFJLElBQUksS0FBSyxFQUNiLEtBQUssSUFBSSxNQUFNLEVBQ2YsV0FBVyxFQUVaLE1BQU0sS0FBSyxDQUFBO0FBRVosT0FBTyxFQUFFLGlCQUFpQixFQUFtQixNQUFNLGVBQWUsQ0FBQTtBQUVsRSxNQUFNLGtCQUFrQixHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQTtBQUduRCxJQUFhLFdBQVcsR0FBeEIsTUFBYSxXQUFXO0lBbUN0QixZQUFvQixnQkFBa0MsRUFDbEMsaUJBQW9DLEVBQ3BDLFVBQXNCLEVBQ3RCLFFBQWtCLEVBQ2xCLFFBQWtCLEVBQ2xCLFNBQW9CLEVBQ3BCLE9BQWdCOzs7OzttQkFOaEI7Ozs7OzttQkFDQTs7Ozs7O21CQUNBOzs7Ozs7bUJBQ0E7Ozs7OzttQkFDQTs7Ozs7O21CQUNBOzs7Ozs7bUJBQ0E7O1FBeENwQjs7Ozs7V0FBNkM7UUFDN0M7Ozs7bUJBQU8sSUFBSSxJQUFJLEVBQUU7V0FBQTtRQUNqQjs7Ozs7V0FBd0I7UUFDeEI7Ozs7O1dBQTJCO1FBQzNCOzs7OztXQUF5QjtRQUN6Qjs7Ozs7V0FBd0I7UUFVeEI7Ozs7bUJBQW9CLElBQUksT0FBTyxFQUFR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QUNILENBQUMsQ0FBQyxDQUFBO0tBQ0g7SUFDRCxPQUFPLE9BQU8sQ0FBQTtBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0B0YW5iby9kaSdcbmltcG9ydCB7IG1lcmdlLCBtaWNyb1Rhc2ssIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ0B0YW5iby9zdHJlYW0nXG5pbXBvcnQge1xuICBSb290Q29tcG9uZW50UmVmLFxuICBTdGFydGVyLFxuICBUcmFuc2xhdG9yLFxuICBSZWdpc3RyeSxcbiAgU2VsZWN0aW9uLFxuICBTZWxlY3Rpb25QYXRocyxcbiAgSGlzdG9yeSwgUmVuZGVyZXIsIFNsb3QsIENvbXBvbmVudEluc3RhbmNlLCBtYWtlRXJyb3IsIEZvcm1hdHNcbn0gZnJvbSAnQHRleHRidXMvY29yZSdcbmltcG9ydCB7XG4gIERvYyBhcyBZRG9jLFxuICBNYXAgYXMgWU1hcCxcbiAgVGV4dCBhcyBZVGV4dCxcbiAgQXJyYXkgYXMgWUFycmF5LFxuICBVbmRvTWFuYWdlcixcbiAgVHJhbnNhY3Rpb25cbn0gZnJvbSAneWpzJ1xuXG5pbXBvcnQgeyBDb2xsYWJvcmF0ZUN1cnNvciwgUmVtb3RlU2VsZWN0aW9uIH0gZnJvbSAnLi9jb2xsYWIvX2FwaSdcblxuY29uc3QgY29sbGFib3JhdGVFcnJvckZuID0gbWFrZUVycm9yKCdDb2xsYWJvcmF0ZScpXG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDb2xsYWJvcmF0ZSBpbXBsZW1lbnRzIEhpc3Rvcnkge1xuICBvblNlbGVjdGlvbkNoYW5nZTogT2JzZXJ2YWJsZTxTZWxlY3Rpb25QYXRocz5cbiAgeURvYyA9IG5ldyBZRG9jKClcbiAgb25CYWNrOiBPYnNlcnZhYmxlPHZvaWQ+XG4gIG9uRm9yd2FyZDogT2JzZXJ2YWJsZTx2b2lkPlxuICBvbkNoYW5nZTogT2JzZXJ2YWJsZTxhbnk+XG4gIG9uUHVzaDogT2JzZXJ2YWJsZTx2b2lkPlxuXG4gIGdldCBjYW5CYWNrKCkge1xuICAgIHJldHVybiB0aGlzLm1hbmFnZXI/LmNhblVuZG8oKVxuICB9XG5cbiAgZ2V0IGNhbkZvcndhcmQoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFuYWdlcj8uY2FuUmVkbygpXG4gIH1cblxuICBwcml2YXRlIGJhY2tFdmVudCA9IG5ldyBTdWJqZWN0PHZvaWQ+KClcbiAgcHJpdmF0ZSBmb3J3YXJkRXZlbnQgPSBuZXcgU3ViamVjdDx2b2lkPigpXG4gIHByaXZhdGUgY2hhbmdlRXZlbnQgPSBuZXcgU3ViamVjdDx2b2lkPigpXG4gIHByaXZhdGUgcHVzaEV2ZW50ID0gbmV3IFN1YmplY3Q8dm9pZD4oKVxuXG4gIHByaXZhdGUgbWFuYWdlciE6IFVuZG9NYW5hZ2VyXG5cbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdXG4gIHByaXZhdGUgdXBkYXRlRnJvbVJlbW90ZSA9IGZhbHNlXG5cbiAgcHJpdmF0ZSBjb250ZW50U3luY0NhY2hlcyA9IG5ldyBXZWFrTWFwPFNsb3QsICgpID0+IHZvaWQ+KClcbiAgcHJpdmF0ZSBzbG90U3RhdGVTeW5jQ2FjaGVzID0gbmV3IFdlYWtNYXA8U2xvdCwgKCkgPT4gdm9pZD4oKVxuICBwcml2YXRlIHNsb3RzU3luY0NhY2hlcyA9IG5ldyBXZWFrTWFwPENvbXBvbmVudEluc3RhbmNlLCAoKSA9PiB2b2lkPigpXG4gIHByaXZhdGUgY29tcG9uZW50U3RhdGVTeW5jQ2FjaGVzID0gbmV3IFdlYWtNYXA8Q29tcG9uZW50SW5zdGFuY2UsICgpID0+IHZvaWQ+KClcblxuICBwcml2YXRlIHNlbGVjdGlvbkNoYW5nZUV2ZW50ID0gbmV3IFN1YmplY3Q8U2VsZWN0aW9uUGF0aHM+KClcblxuICBwcml2YXRlIHVwZGF0ZVJlbW90ZUFjdGlvbnM6IEFycmF5PCgpID0+IHZvaWQ+ID0gW11cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJvb3RDb21wb25lbnRSZWY6IFJvb3RDb21wb25lbnRSZWYsXG4gICAgICAgICAgICAgIHByaXZhdGUgY29sbGFib3JhdGVDdXJzb3I6IENvbGxhYm9yYXRlQ3Vyc29yLFxuICAgICAgICAgICAgICBwcml2YXRlIHRyYW5zbGF0b3I6IFRyYW5zbGF0b3IsXG4gICAgICAgICAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyLFxuICAgICAgICAgICAgICBwcml2YXRlIHJlZ2lzdHJ5OiBSZWdpc3RyeSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBzZWxlY3Rpb246IFNlbGVjdGlvbixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBzdGFydGVyOiBTdGFydGVyKSB7XG4gICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSA9IHRoaXMuc2VsZWN0aW9uQ2hhbmdlRXZlbnQuYXNPYnNlcnZhYmxlKClcbiAgICB0aGlzLm9uQmFjayA9IHRoaXMuYmFja0V2ZW50LmFzT2JzZXJ2YWJsZSgpXG4gICAgdGhpcy5vbkZvcndhcmQgPSB0aGlzLmZvcndhcmRFdmVudC5hc09ic2VydmFibGUoKVxuICAgIHRoaXMub25DaGFuZ2UgPSB0aGlzLmNoYW5nZUV2ZW50LmFzT2JzZXJ2YWJsZSgpXG4gICAgdGhpcy5vblB1c2ggPSB0aGlzLnB1c2hFdmVudC5hc09ic2VydmFibGUoKVxuICB9XG5cbiAgc2V0dXAoKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLnN0YXJ0ZXIub25SZWFkeS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmxpc3RlbjIoKVxuICAgICAgfSksXG4gICAgICB0aGlzLnNlbGVjdGlvbi5vbkNoYW5nZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBjb25zdCBwYXRocyA9IHRoaXMuc2VsZWN0aW9uLmdldFBhdGhzKClcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VFdmVudC5uZXh0KHBhdGhzKVxuICAgICAgfSlcbiAgICApXG4gIH1cblxuICB1cGRhdGVSZW1vdGVTZWxlY3Rpb24ocGF0aHM6IFJlbW90ZVNlbGVjdGlvbltdKSB7XG4gICAgdGhpcy5jb2xsYWJvcmF0ZUN1cnNvci5kcmF3KHBhdGhzKVxuICB9XG5cbiAgbGlzdGVuKCkge1xuICAgIC8vXG4gIH1cblxuICBiYWNrKCkge1xuICAgIGlmICh0aGlzLmNhbkJhY2spIHtcbiAgICAgIHRoaXMubWFuYWdlci51bmRvKClcbiAgICB9XG4gIH1cblxuICBmb3J3YXJkKCkge1xuICAgIGlmICh0aGlzLmNhbkZvcndhcmQpIHtcbiAgICAgIHRoaXMubWFuYWdlci5yZWRvKClcbiAgICB9XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKGkgPT4gaS51bnN1YnNjcmliZSgpKVxuICB9XG5cbiAgcHJpdmF0ZSBsaXN0ZW4yKCkge1xuICAgIGNvbnN0IHJvb3QgPSB0aGlzLnlEb2MuZ2V0VGV4dCgnY29udGVudCcpXG4gICAgY29uc3Qgcm9vdENvbXBvbmVudCA9IHRoaXMucm9vdENvbXBvbmVudFJlZi5jb21wb25lbnQhXG4gICAgdGhpcy5tYW5hZ2VyID0gbmV3IFVuZG9NYW5hZ2VyKHJvb3QsIHtcbiAgICAgIHRyYWNrZWRPcmlnaW5zOiBuZXcgU2V0PGFueT4oW3RoaXMueURvY10pXG4gICAgfSlcbiAgICB0aGlzLnN5bmNDb250ZW50KHJvb3QsIHJvb3RDb21wb25lbnQuc2xvdHMuZ2V0KDApISlcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgbWVyZ2UoXG4gICAgICAgIHJvb3RDb21wb25lbnQuY2hhbmdlTWFya2VyLm9uRm9yY2VDaGFuZ2UsXG4gICAgICAgIHJvb3RDb21wb25lbnQuY2hhbmdlTWFya2VyLm9uQ2hhbmdlXG4gICAgICApLnBpcGUoXG4gICAgICAgIG1pY3JvVGFzaygpXG4gICAgICApLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMueURvYy50cmFuc2FjdCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy51cGRhdGVSZW1vdGVBY3Rpb25zLmZvckVhY2goZm4gPT4ge1xuICAgICAgICAgICAgZm4oKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgdGhpcy51cGRhdGVSZW1vdGVBY3Rpb25zID0gW11cbiAgICAgICAgfSwgdGhpcy55RG9jKVxuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbmRlcigpXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnJlc3RvcmUoKVxuICAgICAgfSlcbiAgICApXG4gIH1cblxuICBwcml2YXRlIHN5bmNDb250ZW50KGNvbnRlbnQ6IFlUZXh0LCBzbG90OiBTbG90KSB7XG4gICAgY29uc3Qgc3luY1JlbW90ZSA9IChldiwgdHIpID0+IHtcbiAgICAgIHRoaXMucnVuUmVtb3RlVXBkYXRlKHRyLCAoKSA9PiB7XG4gICAgICAgIHNsb3QucmV0YWluKDApXG4gICAgICAgIGV2LmRlbHRhLmZvckVhY2goYWN0aW9uID0+IHtcbiAgICAgICAgICBpZiAoUmVmbGVjdC5oYXMoYWN0aW9uLCAncmV0YWluJykpIHtcbiAgICAgICAgICAgIHNsb3QucmV0YWluKGFjdGlvbi5yZXRhaW4hLCBtYWtlRm9ybWF0cyh0aGlzLnJlZ2lzdHJ5LCBhY3Rpb24uYXR0cmlidXRlcykpXG4gICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uaW5zZXJ0KSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHNsb3QuaW5kZXhcbiAgICAgICAgICAgIGxldCBsZW5ndGggPSAxXG4gICAgICAgICAgICBpZiAodHlwZW9mIGFjdGlvbi5pbnNlcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgIGxlbmd0aCA9IGFjdGlvbi5pbnNlcnQubGVuZ3RoXG4gICAgICAgICAgICAgIHNsb3QuaW5zZXJ0KGFjdGlvbi5pbnNlcnQsIG1ha2VGb3JtYXRzKHRoaXMucmVnaXN0cnksIGFjdGlvbi5hdHRyaWJ1dGVzKSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IHNoYXJlZENvbXBvbmVudCA9IGFjdGlvbi5pbnNlcnQgYXMgWU1hcDxhbnk+XG4gICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY3JlYXRlQ29tcG9uZW50QnlTaGFyZWRDb21wb25lbnQoc2hhcmVkQ29tcG9uZW50KVxuICAgICAgICAgICAgICB0aGlzLnN5bmNTbG90cyhzaGFyZWRDb21wb25lbnQuZ2V0KCdzbG90cycpLCBjb21wb25lbnQpXG4gICAgICAgICAgICAgIHRoaXMuc3luY0NvbXBvbmVudChzaGFyZWRDb21wb25lbnQsIGNvbXBvbmVudClcbiAgICAgICAgICAgICAgc2xvdC5pbnNlcnQoY29tcG9uZW50KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLmlzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgaWYgKHNsb3QgPT09IHRoaXMuc2VsZWN0aW9uLnN0YXJ0U2xvdCAmJiB0aGlzLnNlbGVjdGlvbi5zdGFydE9mZnNldCEgPj0gaW5kZXgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZXRTdGFydChzbG90LCB0aGlzLnNlbGVjdGlvbi5zdGFydE9mZnNldCEgKyBsZW5ndGgpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHNsb3QgPT09IHRoaXMuc2VsZWN0aW9uLmVuZFNsb3QgJiYgdGhpcy5zZWxlY3Rpb24uZW5kT2Zmc2V0ISA+PSBpbmRleCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldEVuZChzbG90LCB0aGlzLnNlbGVjdGlvbi5lbmRPZmZzZXQhICsgbGVuZ3RoKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZGVsZXRlKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHNsb3QuaW5kZXhcbiAgICAgICAgICAgIHNsb3QucmV0YWluKHNsb3QuaW5kZXgpXG4gICAgICAgICAgICBzbG90LmRlbGV0ZShhY3Rpb24uZGVsZXRlKVxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLmlzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgaWYgKHNsb3QgPT09IHRoaXMuc2VsZWN0aW9uLnN0YXJ0U2xvdCAmJiB0aGlzLnNlbGVjdGlvbi5zdGFydE9mZnNldCEgPj0gaW5kZXgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZXRTdGFydChzbG90LCB0aGlzLnNlbGVjdGlvbi5zdGFydE9mZnNldCEgLSBhY3Rpb24uZGVsZXRlKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzbG90ID09PSB0aGlzLnNlbGVjdGlvbi5lbmRTbG90ICYmIHRoaXMuc2VsZWN0aW9uLmVuZE9mZnNldCEgPj0gaW5kZXgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZXRFbmQoc2xvdCwgdGhpcy5zZWxlY3Rpb24uZW5kT2Zmc2V0ISAtIGFjdGlvbi5kZWxldGUpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5hdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBzbG90LnVwZGF0ZVN0YXRlKGRyYWZ0ID0+IHtcbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihkcmFmdCwgYWN0aW9uLmF0dHJpYnV0ZXMpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuICAgIGNvbnRlbnQub2JzZXJ2ZShzeW5jUmVtb3RlKVxuXG4gICAgY29uc3Qgc3ViID0gc2xvdC5vbkNvbnRlbnRDaGFuZ2Uuc3Vic2NyaWJlKGFjdGlvbnMgPT4ge1xuICAgICAgdGhpcy5ydW5Mb2NhbFVwZGF0ZSgoKSA9PiB7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwXG4gICAgICAgIGxldCBsZW5ndGggPSAwXG4gICAgICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIGFjdGlvbnMpIHtcbiAgICAgICAgICBpZiAoYWN0aW9uLnR5cGUgPT09ICdyZXRhaW4nKSB7XG4gICAgICAgICAgICBpZiAoYWN0aW9uLmZvcm1hdHMpIHtcbiAgICAgICAgICAgICAgY29udGVudC5mb3JtYXQob2Zmc2V0LCBhY3Rpb24ub2Zmc2V0LCBhY3Rpb24uZm9ybWF0cylcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG9mZnNldCA9IGFjdGlvbi5vZmZzZXRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi50eXBlID09PSAnaW5zZXJ0Jykge1xuICAgICAgICAgICAgY29uc3QgZGVsdGEgPSBjb250ZW50LnRvRGVsdGEoKVxuICAgICAgICAgICAgY29uc3QgaXNFbXB0eSA9IGRlbHRhLmxlbmd0aCA9PT0gMSAmJiBkZWx0YVswXS5pbnNlcnQgPT09IFNsb3QuZW1wdHlQbGFjZWhvbGRlclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb24uY29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgbGVuZ3RoID0gYWN0aW9uLmNvbnRlbnQubGVuZ3RoXG4gICAgICAgICAgICAgIGNvbnRlbnQuaW5zZXJ0KG9mZnNldCwgYWN0aW9uLmNvbnRlbnQpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsZW5ndGggPSAxXG4gICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHNsb3QuZ2V0Q29udGVudEF0SW5kZXgob2Zmc2V0KSBhcyBDb21wb25lbnRJbnN0YW5jZVxuICAgICAgICAgICAgICBjb25zdCBzaGFyZWRDb21wb25lbnQgPSB0aGlzLmNyZWF0ZVNoYXJlZENvbXBvbmVudEJ5Q29tcG9uZW50KGNvbXBvbmVudClcbiAgICAgICAgICAgICAgY29udGVudC5pbnNlcnRFbWJlZChvZmZzZXQsIHNoYXJlZENvbXBvbmVudClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhY3Rpb24uZm9ybWF0cykge1xuICAgICAgICAgICAgICBjb250ZW50LmZvcm1hdChvZmZzZXQsIGxlbmd0aCwgYWN0aW9uLmZvcm1hdHMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNFbXB0eSAmJiBvZmZzZXQgPT09IDApIHtcbiAgICAgICAgICAgICAgY29udGVudC5kZWxldGUoY29udGVudC5sZW5ndGggLSAxLCAxKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2Zmc2V0ICs9IGxlbmd0aFxuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLnR5cGUgPT09ICdkZWxldGUnKSB7XG4gICAgICAgICAgICBjb25zdCBkZWx0YSA9IGNvbnRlbnQudG9EZWx0YSgpXG4gICAgICAgICAgICBjb250ZW50LmRlbGV0ZShvZmZzZXQsIGFjdGlvbi5jb3VudClcbiAgICAgICAgICAgIGlmIChjb250ZW50Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICBjb250ZW50Lmluc2VydCgwLCAnXFxuJywgZGVsdGFbMF0/LmF0dHJpYnV0ZXMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gICAgdGhpcy5jb250ZW50U3luY0NhY2hlcy5zZXQoc2xvdCwgKCkgPT4ge1xuICAgICAgY29udGVudC51bm9ic2VydmUoc3luY1JlbW90ZSlcbiAgICAgIHN1Yi51bnN1YnNjcmliZSgpXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgc3luY1Nsb3QocmVtb3RlU2xvdDogWU1hcDxhbnk+LCBzbG90OiBTbG90KSB7XG4gICAgY29uc3Qgc3luY1JlbW90ZSA9IChldiwgdHIpID0+IHtcbiAgICAgIHRoaXMucnVuUmVtb3RlVXBkYXRlKHRyLCAoKSA9PiB7XG4gICAgICAgIGV2LmtleXNDaGFuZ2VkLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICBpZiAoa2V5ID09PSAnc3RhdGUnKSB7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZSA9IChldi50YXJnZXQgYXMgWU1hcDxhbnk+KS5nZXQoJ3N0YXRlJylcbiAgICAgICAgICAgIHNsb3QudXBkYXRlU3RhdGUoZHJhZnQgPT4ge1xuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGRyYWZ0LCBzdGF0ZSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG4gICAgcmVtb3RlU2xvdC5vYnNlcnZlKHN5bmNSZW1vdGUpXG5cbiAgICBjb25zdCBzdWIgPSBzbG90Lm9uU3RhdGVDaGFuZ2Uuc3Vic2NyaWJlKGFjdGlvbnMgPT4ge1xuICAgICAgdGhpcy5ydW5Mb2NhbFVwZGF0ZSgoKSA9PiB7XG4gICAgICAgIGFjdGlvbnMuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgICAgICAgIHJlbW90ZVNsb3Quc2V0KCdzdGF0ZScsIGFjdGlvbi52YWx1ZSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcbiAgICB0aGlzLnNsb3RTdGF0ZVN5bmNDYWNoZXMuc2V0KHNsb3QsICgpID0+IHtcbiAgICAgIHJlbW90ZVNsb3QudW5vYnNlcnZlKHN5bmNSZW1vdGUpXG4gICAgICBzdWIudW5zdWJzY3JpYmUoKVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIHN5bmNTbG90cyhyZW1vdGVTbG90czogWUFycmF5PGFueT4sIGNvbXBvbmVudDogQ29tcG9uZW50SW5zdGFuY2UpIHtcbiAgICBjb25zdCBzbG90cyA9IGNvbXBvbmVudC5zbG90c1xuICAgIGNvbnN0IHN5bmNSZW1vdGUgPSAoZXYsIHRyKSA9PiB7XG4gICAgICB0aGlzLnJ1blJlbW90ZVVwZGF0ZSh0ciwgKCkgPT4ge1xuICAgICAgICBldi5kZWx0YS5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgICAgICAgaWYgKFJlZmxlY3QuaGFzKGFjdGlvbiwgJ3JldGFpbicpKSB7XG4gICAgICAgICAgICBzbG90cy5yZXRhaW4oYWN0aW9uLnJldGFpbiEpXG4gICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uaW5zZXJ0KSB7XG4gICAgICAgICAgICAoYWN0aW9uLmluc2VydCBhcyBBcnJheTxZTWFwPGFueT4+KS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICBjb25zdCBzbG90ID0gdGhpcy5jcmVhdGVTbG90QnlTaGFyZWRTbG90KGl0ZW0pXG4gICAgICAgICAgICAgIHNsb3RzLmluc2VydChzbG90KVxuICAgICAgICAgICAgICB0aGlzLnN5bmNDb250ZW50KGl0ZW0uZ2V0KCdjb250ZW50JyksIHNsb3QpXG4gICAgICAgICAgICAgIHRoaXMuc3luY1Nsb3QoaXRlbSwgc2xvdClcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZGVsZXRlKSB7XG4gICAgICAgICAgICBzbG90cy5yZXRhaW4oc2xvdHMuaW5kZXgpXG4gICAgICAgICAgICBzbG90cy5kZWxldGUoYWN0aW9uLmRlbGV0ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH1cbiAgICByZW1vdGVTbG90cy5vYnNlcnZlKHN5bmNSZW1vdGUpXG5cbiAgICBjb25zdCBzdWIgPSBzbG90cy5vbkNoYW5nZS5zdWJzY3JpYmUob3BlcmF0aW9ucyA9PiB7XG4gICAgICB0aGlzLnJ1bkxvY2FsVXBkYXRlKCgpID0+IHtcbiAgICAgICAgY29uc3QgYXBwbHlBY3Rpb25zID0gb3BlcmF0aW9ucy5hcHBseVxuICAgICAgICBsZXQgaW5kZXg6IG51bWJlclxuICAgICAgICBhcHBseUFjdGlvbnMuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgICAgICAgIGlmIChhY3Rpb24udHlwZSA9PT0gJ3JldGFpbicpIHtcbiAgICAgICAgICAgIGluZGV4ID0gYWN0aW9uLm9mZnNldFxuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLnR5cGUgPT09ICdpbnNlcnRTbG90Jykge1xuICAgICAgICAgICAgY29uc3Qgc2xvdCA9IHNsb3RzLmdldChpbmRleCkhXG4gICAgICAgICAgICBjb25zdCBzaGFyZWRTbG90ID0gdGhpcy5jcmVhdGVTaGFyZWRTbG90QnlTbG90KHNsb3QpXG4gICAgICAgICAgICByZW1vdGVTbG90cy5pbnNlcnQoaW5kZXgsIFtzaGFyZWRTbG90XSlcbiAgICAgICAgICAgIGluZGV4KytcbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi50eXBlID09PSAnZGVsZXRlJykge1xuICAgICAgICAgICAgc2xvdHMuc2xpY2UoaW5kZXgsIGluZGV4ICsgYWN0aW9uLmNvdW50KS5mb3JFYWNoKHNsb3QgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmNsZWFuU3Vic2NyaXB0aW9uc0J5U2xvdChzbG90KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJlbW90ZVNsb3RzLmRlbGV0ZShpbmRleCwgYWN0aW9uLmNvdW50KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHRoaXMuc2xvdHNTeW5jQ2FjaGVzLnNldChjb21wb25lbnQsICgpID0+IHtcbiAgICAgIHJlbW90ZVNsb3RzLnVub2JzZXJ2ZShzeW5jUmVtb3RlKVxuICAgICAgc3ViLnVuc3Vic2NyaWJlKClcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBzeW5jQ29tcG9uZW50KHJlbW90ZUNvbXBvbmVudDogWU1hcDxhbnk+LCBjb21wb25lbnQ6IENvbXBvbmVudEluc3RhbmNlKSB7XG4gICAgY29uc3Qgc3luY1JlbW90ZSA9IChldiwgdHIpID0+IHtcbiAgICAgIHRoaXMucnVuUmVtb3RlVXBkYXRlKHRyLCAoKSA9PiB7XG4gICAgICAgIGV2LmtleXNDaGFuZ2VkLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICBpZiAoa2V5ID09PSAnc3RhdGUnKSB7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZSA9IChldi50YXJnZXQgYXMgWU1hcDxhbnk+KS5nZXQoJ3N0YXRlJylcbiAgICAgICAgICAgIGNvbXBvbmVudC51cGRhdGVTdGF0ZShkcmFmdCA9PiB7XG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZHJhZnQsIHN0YXRlKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH1cbiAgICByZW1vdGVDb21wb25lbnQub2JzZXJ2ZShzeW5jUmVtb3RlKVxuXG4gICAgY29uc3Qgc3ViID0gY29tcG9uZW50Lm9uU3RhdGVDaGFuZ2Uuc3Vic2NyaWJlKG5ld1N0YXRlID0+IHtcbiAgICAgIHRoaXMucnVuTG9jYWxVcGRhdGUoKCkgPT4ge1xuICAgICAgICByZW1vdGVDb21wb25lbnQuc2V0KCdzdGF0ZScsIG5ld1N0YXRlKVxuICAgICAgfSlcbiAgICB9KVxuICAgIHRoaXMuY29tcG9uZW50U3RhdGVTeW5jQ2FjaGVzLnNldChjb21wb25lbnQsICgpID0+IHtcbiAgICAgIHJlbW90ZUNvbXBvbmVudC51bm9ic2VydmUoc3luY1JlbW90ZSlcbiAgICAgIHN1Yi51bnN1YnNjcmliZSgpXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgcnVuTG9jYWxVcGRhdGUoZm46ICgpID0+IHZvaWQpIHtcbiAgICBpZiAodGhpcy51cGRhdGVGcm9tUmVtb3RlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy51cGRhdGVSZW1vdGVBY3Rpb25zLnB1c2goZm4pXG4gIH1cblxuICBwcml2YXRlIHJ1blJlbW90ZVVwZGF0ZSh0cjogVHJhbnNhY3Rpb24sIGZuOiAoKSA9PiB2b2lkKSB7XG4gICAgaWYgKHRyLm9yaWdpbiA9PT0gdGhpcy55RG9jKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy51cGRhdGVGcm9tUmVtb3RlID0gdHJ1ZVxuICAgIGZuKClcbiAgICB0aGlzLnVwZGF0ZUZyb21SZW1vdGUgPSBmYWxzZVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTaGFyZWRDb21wb25lbnRCeUNvbXBvbmVudChjb21wb25lbnQ6IENvbXBvbmVudEluc3RhbmNlKTogWU1hcDxhbnk+IHtcbiAgICBjb25zdCBzaGFyZWRDb21wb25lbnQgPSBuZXcgWU1hcCgpXG4gICAgc2hhcmVkQ29tcG9uZW50LnNldCgnc3RhdGUnLCBjb21wb25lbnQuc3RhdGUpXG4gICAgc2hhcmVkQ29tcG9uZW50LnNldCgnbmFtZScsIGNvbXBvbmVudC5uYW1lKVxuICAgIGNvbnN0IHNoYXJlZFNsb3RzID0gbmV3IFlBcnJheSgpXG4gICAgc2hhcmVkQ29tcG9uZW50LnNldCgnc2xvdHMnLCBzaGFyZWRTbG90cylcbiAgICBjb21wb25lbnQuc2xvdHMudG9BcnJheSgpLmZvckVhY2goc2xvdCA9PiB7XG4gICAgICBjb25zdCBzaGFyZWRTbG90ID0gdGhpcy5jcmVhdGVTaGFyZWRTbG90QnlTbG90KHNsb3QpXG4gICAgICBzaGFyZWRTbG90cy5wdXNoKFtzaGFyZWRTbG90XSlcbiAgICB9KVxuICAgIHRoaXMuc3luY1Nsb3RzKHNoYXJlZFNsb3RzLCBjb21wb25lbnQpXG4gICAgdGhpcy5zeW5jQ29tcG9uZW50KHNoYXJlZENvbXBvbmVudCwgY29tcG9uZW50KVxuICAgIHJldHVybiBzaGFyZWRDb21wb25lbnRcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU2hhcmVkU2xvdEJ5U2xvdChzbG90OiBTbG90KTogWU1hcDxhbnk+IHtcbiAgICBjb25zdCBzaGFyZWRTbG90ID0gbmV3IFlNYXAoKVxuICAgIHNoYXJlZFNsb3Quc2V0KCdzY2hlbWEnLCBzbG90LnNjaGVtYSlcbiAgICBzaGFyZWRTbG90LnNldCgnc3RhdGUnLCBzbG90LnN0YXRlKVxuICAgIGNvbnN0IHNoYXJlZENvbnRlbnQgPSBuZXcgWVRleHQoKVxuICAgIHNoYXJlZFNsb3Quc2V0KCdjb250ZW50Jywgc2hhcmVkQ29udGVudClcbiAgICBsZXQgb2Zmc2V0ID0gMFxuICAgIHNsb3QudG9EZWx0YSgpLmZvckVhY2goaSA9PiB7XG4gICAgICBsZXQgZm9ybWF0czogYW55ID0ge31cbiAgICAgIGlmIChpLmZvcm1hdHMpIHtcbiAgICAgICAgaS5mb3JtYXRzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgZm9ybWF0c1tpdGVtWzBdLm5hbWVdID0gaXRlbVsxXVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9ybWF0cyA9IG51bGxcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgaS5pbnNlcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHNoYXJlZENvbnRlbnQuaW5zZXJ0KG9mZnNldCwgaS5pbnNlcnQsIGZvcm1hdHMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzaGFyZWRDb21wb25lbnQgPSB0aGlzLmNyZWF0ZVNoYXJlZENvbXBvbmVudEJ5Q29tcG9uZW50KGkuaW5zZXJ0KVxuICAgICAgICBzaGFyZWRDb250ZW50Lmluc2VydEVtYmVkKG9mZnNldCwgc2hhcmVkQ29tcG9uZW50LCBmb3JtYXRzKVxuICAgICAgfVxuICAgICAgb2Zmc2V0ICs9IGkuaW5zZXJ0Lmxlbmd0aFxuICAgIH0pXG4gICAgdGhpcy5zeW5jQ29udGVudChzaGFyZWRDb250ZW50LCBzbG90KVxuICAgIHRoaXMuc3luY1Nsb3Qoc2hhcmVkU2xvdCwgc2xvdClcbiAgICByZXR1cm4gc2hhcmVkU2xvdFxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDb21wb25lbnRCeVNoYXJlZENvbXBvbmVudCh5TWFwOiBZTWFwPGFueT4pOiBDb21wb25lbnRJbnN0YW5jZSB7XG4gICAgY29uc3Qgc2hhcmVkU2xvdHMgPSB5TWFwLmdldCgnc2xvdHMnKSBhcyBZQXJyYXk8WU1hcDxhbnk+PlxuICAgIGNvbnN0IHNsb3RzOiBTbG90W10gPSBbXVxuICAgIHNoYXJlZFNsb3RzLmZvckVhY2goc2hhcmVkU2xvdCA9PiB7XG4gICAgICBjb25zdCBzbG90ID0gdGhpcy5jcmVhdGVTbG90QnlTaGFyZWRTbG90KHNoYXJlZFNsb3QpXG4gICAgICBzbG90cy5wdXNoKHNsb3QpXG4gICAgfSlcbiAgICBjb25zdCBuYW1lID0geU1hcC5nZXQoJ25hbWUnKVxuICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy50cmFuc2xhdG9yLmNyZWF0ZUNvbXBvbmVudEJ5RGF0YShuYW1lLCB7XG4gICAgICBzdGF0ZTogeU1hcC5nZXQoJ3N0YXRlJyksXG4gICAgICBzbG90c1xuICAgIH0pXG4gICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICBpbnN0YW5jZS5zbG90cy50b0FycmF5KCkuZm9yRWFjaCgoc2xvdCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3Qgc2hhcmVkU2xvdCA9IHNoYXJlZFNsb3RzLmdldChpbmRleClcbiAgICAgICAgdGhpcy5zeW5jU2xvdChzaGFyZWRTbG90LCBzbG90KVxuICAgICAgICB0aGlzLnN5bmNDb250ZW50KHNoYXJlZFNsb3QuZ2V0KCdjb250ZW50JyksIHNsb3QpXG4gICAgICB9KVxuICAgICAgcmV0dXJuIGluc3RhbmNlXG4gICAgfVxuICAgIHRocm93IGNvbGxhYm9yYXRlRXJyb3JGbihgY2Fubm90IGZpbmQgY29tcG9uZW50IGZhY3RvcnkgXFxgJHtuYW1lfVxcYC5gKVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTbG90QnlTaGFyZWRTbG90KHNoYXJlZFNsb3Q6IFlNYXA8YW55Pik6IFNsb3Qge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBzaGFyZWRTbG90LmdldCgnY29udGVudCcpIGFzIFlUZXh0XG4gICAgY29uc3QgZGVsdGEgPSBjb250ZW50LnRvRGVsdGEoKVxuXG4gICAgY29uc3Qgc2xvdCA9IHRoaXMudHJhbnNsYXRvci5jcmVhdGVTbG90KHtcbiAgICAgIHNjaGVtYTogc2hhcmVkU2xvdC5nZXQoJ3NjaGVtYScpLFxuICAgICAgc3RhdGU6IHNoYXJlZFNsb3QuZ2V0KCdzdGF0ZScpLFxuICAgICAgZm9ybWF0czoge30sXG4gICAgICBjb250ZW50OiBbXVxuICAgIH0pXG5cbiAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiBkZWx0YSkge1xuICAgICAgaWYgKGFjdGlvbi5pbnNlcnQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb24uaW5zZXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHNsb3QuaW5zZXJ0KGFjdGlvbi5pbnNlcnQsIG1ha2VGb3JtYXRzKHRoaXMucmVnaXN0cnksIGFjdGlvbi5hdHRyaWJ1dGVzKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBzaGFyZWRDb21wb25lbnQgPSBhY3Rpb24uaW5zZXJ0IGFzIFlNYXA8YW55PlxuICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY3JlYXRlQ29tcG9uZW50QnlTaGFyZWRDb21wb25lbnQoc2hhcmVkQ29tcG9uZW50KVxuICAgICAgICAgIHNsb3QuaW5zZXJ0KGNvbXBvbmVudClcbiAgICAgICAgICB0aGlzLnN5bmNTbG90cyhzaGFyZWRDb21wb25lbnQuZ2V0KCdzbG90cycpLCBjb21wb25lbnQpXG4gICAgICAgICAgdGhpcy5zeW5jQ29tcG9uZW50KHNoYXJlZENvbXBvbmVudCwgY29tcG9uZW50KVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBjb2xsYWJvcmF0ZUVycm9yRm4oJ3VuZXhwZWN0ZWQgZGVsdGEgYWN0aW9uLicpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzbG90XG4gIH1cblxuICBwcml2YXRlIGNsZWFuU3Vic2NyaXB0aW9uc0J5U2xvdChzbG90OiBTbG90KSB7XG4gICAgW3RoaXMuY29udGVudFN5bmNDYWNoZXMuZ2V0KHNsb3QpLCB0aGlzLnNsb3RTdGF0ZVN5bmNDYWNoZXMuZ2V0KHNsb3QpXS5mb3JFYWNoKGZuID0+IHtcbiAgICAgIGlmIChmbikge1xuICAgICAgICBmbigpXG4gICAgICB9XG4gICAgfSlcbiAgICBzbG90LnNsaWNlQ29udGVudCgpLmZvckVhY2goaSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGkgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuY2xlYW5TdWJzY3JpcHRpb25zQnlDb21wb25lbnQoaSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBjbGVhblN1YnNjcmlwdGlvbnNCeUNvbXBvbmVudChjb21wb25lbnQ6IENvbXBvbmVudEluc3RhbmNlKSB7XG4gICAgW3RoaXMuc2xvdHNTeW5jQ2FjaGVzLmdldChjb21wb25lbnQpLCB0aGlzLmNvbXBvbmVudFN0YXRlU3luY0NhY2hlcy5nZXQoY29tcG9uZW50KV0uZm9yRWFjaChmbiA9PiB7XG4gICAgICBpZiAoZm4pIHtcbiAgICAgICAgZm4oKVxuICAgICAgfVxuICAgIH0pXG4gICAgY29tcG9uZW50LnNsb3RzLnRvQXJyYXkoKS5mb3JFYWNoKHNsb3QgPT4ge1xuICAgICAgdGhpcy5jbGVhblN1YnNjcmlwdGlvbnNCeVNsb3Qoc2xvdClcbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIG1ha2VGb3JtYXRzKHJlZ2lzdHJ5OiBSZWdpc3RyeSwgYXR0cnM/OiBhbnkpIHtcbiAgY29uc3QgZm9ybWF0czogRm9ybWF0cyA9IFtdXG4gIGlmIChhdHRycykge1xuICAgIE9iamVjdC5rZXlzKGF0dHJzKS5tYXAoa2V5ID0+IHtcbiAgICAgIGNvbnN0IGZvcm1hdHRlciA9IHJlZ2lzdHJ5LmdldEZvcm1hdHRlcihrZXkpXG4gICAgICBpZiAoZm9ybWF0dGVyKSB7XG4gICAgICAgIGZvcm1hdHMucHVzaChbZm9ybWF0dGVyLCBhdHRyc1trZXldXSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIHJldHVybiBmb3JtYXRzXG59XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@textbus/collaborate",
3
- "version": "2.0.0-alpha.79",
3
+ "version": "2.0.0-beta.0",
4
4
  "description": "Textbus is a rich text editor and framework that is highly customizable and extensible to achieve rich wysiwyg effects.",
5
5
  "main": "./bundles/public-api.js",
6
6
  "module": "./bundles/public-api.js",
@@ -25,10 +25,10 @@
25
25
  "typescript editor"
26
26
  ],
27
27
  "dependencies": {
28
- "@tanbo/di": "^1.0.7",
28
+ "@tanbo/di": "^1.1.0",
29
29
  "@tanbo/stream": "^1.0.0",
30
- "@textbus/browser": "^2.0.0-alpha.79",
31
- "@textbus/core": "^2.0.0-alpha.79",
30
+ "@textbus/browser": "^2.0.0-beta.0",
31
+ "@textbus/core": "^2.0.0-beta.0",
32
32
  "reflect-metadata": "^0.1.13",
33
33
  "y-protocols": "^1.0.5",
34
34
  "yjs": "^13.5.27"
@@ -44,5 +44,5 @@
44
44
  "bugs": {
45
45
  "url": "https://github.com/textbus/textbus.git/issues"
46
46
  },
47
- "gitHead": "259681deafbeb03aaea416f67c07fca31c7f92d0"
47
+ "gitHead": "e04fbe36732c505db71401c7b1ce36a51ee5ce1f"
48
48
  }
@@ -56,6 +56,8 @@ export class Collaborate implements History {
56
56
 
57
57
  private selectionChangeEvent = new Subject<SelectionPaths>()
58
58
 
59
+ private updateRemoteActions: Array<() => void> = []
60
+
59
61
  constructor(private rootComponentRef: RootComponentRef,
60
62
  private collaborateCursor: CollaborateCursor,
61
63
  private translator: Translator,
@@ -121,6 +123,12 @@ export class Collaborate implements History {
121
123
  ).pipe(
122
124
  microTask()
123
125
  ).subscribe(() => {
126
+ this.yDoc.transact(() => {
127
+ this.updateRemoteActions.forEach(fn => {
128
+ fn()
129
+ })
130
+ this.updateRemoteActions = []
131
+ }, this.yDoc)
124
132
  this.renderer.render()
125
133
  this.selection.restore()
126
134
  })
@@ -128,10 +136,6 @@ export class Collaborate implements History {
128
136
  }
129
137
 
130
138
  private syncContent(content: YText, slot: Slot) {
131
- const fn = this.contentSyncCaches.get(slot)
132
- if (fn) {
133
- fn()
134
- }
135
139
  const syncRemote = (ev, tr) => {
136
140
  this.runRemoteUpdate(tr, () => {
137
141
  slot.retain(0)
@@ -228,10 +232,6 @@ export class Collaborate implements History {
228
232
  }
229
233
 
230
234
  private syncSlot(remoteSlot: YMap<any>, slot: Slot) {
231
- const fn = this.slotStateSyncCaches.get(slot)
232
- if (fn) {
233
- fn()
234
- }
235
235
  const syncRemote = (ev, tr) => {
236
236
  this.runRemoteUpdate(tr, () => {
237
237
  ev.keysChanged.forEach(key => {
@@ -261,10 +261,6 @@ export class Collaborate implements History {
261
261
 
262
262
  private syncSlots(remoteSlots: YArray<any>, component: ComponentInstance) {
263
263
  const slots = component.slots
264
- const fn = this.slotsSyncCaches.get(component)
265
- if (fn) {
266
- fn()
267
- }
268
264
  const syncRemote = (ev, tr) => {
269
265
  this.runRemoteUpdate(tr, () => {
270
266
  ev.delta.forEach(action => {
@@ -299,6 +295,9 @@ export class Collaborate implements History {
299
295
  remoteSlots.insert(index, [sharedSlot])
300
296
  index++
301
297
  } else if (action.type === 'delete') {
298
+ slots.slice(index, index + action.count).forEach(slot => {
299
+ this.cleanSubscriptionsBySlot(slot)
300
+ })
302
301
  remoteSlots.delete(index, action.count)
303
302
  }
304
303
  })
@@ -312,10 +311,6 @@ export class Collaborate implements History {
312
311
  }
313
312
 
314
313
  private syncComponent(remoteComponent: YMap<any>, component: ComponentInstance) {
315
- const fn = this.componentStateSyncCaches.get(component)
316
- if (fn) {
317
- fn()
318
- }
319
314
  const syncRemote = (ev, tr) => {
320
315
  this.runRemoteUpdate(tr, () => {
321
316
  ev.keysChanged.forEach(key => {
@@ -345,11 +340,11 @@ export class Collaborate implements History {
345
340
  if (this.updateFromRemote) {
346
341
  return
347
342
  }
348
- fn()
343
+ this.updateRemoteActions.push(fn)
349
344
  }
350
345
 
351
346
  private runRemoteUpdate(tr: Transaction, fn: () => void) {
352
- if (!tr.origin) {
347
+ if (tr.origin === this.yDoc) {
353
348
  return
354
349
  }
355
350
  this.updateFromRemote = true
@@ -452,6 +447,30 @@ export class Collaborate implements History {
452
447
  }
453
448
  return slot
454
449
  }
450
+
451
+ private cleanSubscriptionsBySlot(slot: Slot) {
452
+ [this.contentSyncCaches.get(slot), this.slotStateSyncCaches.get(slot)].forEach(fn => {
453
+ if (fn) {
454
+ fn()
455
+ }
456
+ })
457
+ slot.sliceContent().forEach(i => {
458
+ if (typeof i !== 'string') {
459
+ this.cleanSubscriptionsByComponent(i)
460
+ }
461
+ })
462
+ }
463
+
464
+ private cleanSubscriptionsByComponent(component: ComponentInstance) {
465
+ [this.slotsSyncCaches.get(component), this.componentStateSyncCaches.get(component)].forEach(fn => {
466
+ if (fn) {
467
+ fn()
468
+ }
469
+ })
470
+ component.slots.toArray().forEach(slot => {
471
+ this.cleanSubscriptionsBySlot(slot)
472
+ })
473
+ }
455
474
  }
456
475
 
457
476
  function makeFormats(registry: Registry, attrs?: any) {