@textbus/collaborate 2.0.0-beta.5 → 2.0.0-beta.50

Sign up to get free protection for your applications and to get access to all the features.
@@ -7,171 +7,81 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  var __metadata = (this && this.__metadata) || function (k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  };
10
- import { Injectable } from '@tanbo/di';
11
- import { merge, microTask, Subject } from '@tanbo/stream';
12
- import { RootComponentRef, Starter, Translator, Registry, Selection, Renderer, Slot, makeError } from '@textbus/core';
13
- import { Doc as YDoc, Map as YMap, Text as YText, Array as YArray, UndoManager } from 'yjs';
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ import { Inject, Injectable } from '@tanbo/di';
14
+ import { delay, filter, map, Subject } from '@tanbo/stream';
15
+ import { ChangeOrigin, ContentType, Controller, HISTORY_STACK_SIZE, makeError, Registry, RootComponentRef, Scheduler, Selection, Slot, Starter, Translator } from '@textbus/core';
16
+ import { Array as YArray, Doc as YDoc, Map as YMap, Text as YText, UndoManager, createAbsolutePositionFromRelativePosition, createRelativePositionFromTypeIndex } from 'yjs';
14
17
  import { CollaborateCursor } from './collaborate-cursor';
18
+ import { createUnknownComponent } from './unknown.component';
15
19
  const collaborateErrorFn = makeError('Collaborate');
20
+ class ContentMap {
21
+ constructor() {
22
+ this.slotAndYTextMap = new WeakMap();
23
+ this.yTextAndSLotMap = new WeakMap();
24
+ }
25
+ set(key, value) {
26
+ if (key instanceof Slot) {
27
+ this.slotAndYTextMap.set(key, value);
28
+ this.yTextAndSLotMap.set(value, key);
29
+ }
30
+ else {
31
+ this.slotAndYTextMap.set(value, key);
32
+ this.yTextAndSLotMap.set(key, value);
33
+ }
34
+ }
35
+ get(key) {
36
+ if (key instanceof Slot) {
37
+ return this.slotAndYTextMap.get(key) || null;
38
+ }
39
+ return this.yTextAndSLotMap.get(key) || null;
40
+ }
41
+ delete(key) {
42
+ if (key instanceof Slot) {
43
+ const v = this.slotAndYTextMap.get(key);
44
+ this.slotAndYTextMap.delete(key);
45
+ if (v) {
46
+ this.yTextAndSLotMap.delete(v);
47
+ }
48
+ }
49
+ else {
50
+ const v = this.yTextAndSLotMap.get(key);
51
+ this.yTextAndSLotMap.delete(key);
52
+ if (v) {
53
+ this.slotAndYTextMap.delete(v);
54
+ }
55
+ }
56
+ }
57
+ }
16
58
  let Collaborate = class Collaborate {
17
- constructor(rootComponentRef, collaborateCursor, translator, renderer, registry, selection, starter) {
18
- Object.defineProperty(this, "rootComponentRef", {
19
- enumerable: true,
20
- configurable: true,
21
- writable: true,
22
- value: rootComponentRef
23
- });
24
- Object.defineProperty(this, "collaborateCursor", {
25
- enumerable: true,
26
- configurable: true,
27
- writable: true,
28
- value: collaborateCursor
29
- });
30
- Object.defineProperty(this, "translator", {
31
- enumerable: true,
32
- configurable: true,
33
- writable: true,
34
- value: translator
35
- });
36
- Object.defineProperty(this, "renderer", {
37
- enumerable: true,
38
- configurable: true,
39
- writable: true,
40
- value: renderer
41
- });
42
- Object.defineProperty(this, "registry", {
43
- enumerable: true,
44
- configurable: true,
45
- writable: true,
46
- value: registry
47
- });
48
- Object.defineProperty(this, "selection", {
49
- enumerable: true,
50
- configurable: true,
51
- writable: true,
52
- value: selection
53
- });
54
- Object.defineProperty(this, "starter", {
55
- enumerable: true,
56
- configurable: true,
57
- writable: true,
58
- value: starter
59
- });
60
- Object.defineProperty(this, "onSelectionChange", {
61
- enumerable: true,
62
- configurable: true,
63
- writable: true,
64
- value: void 0
65
- });
66
- Object.defineProperty(this, "yDoc", {
67
- enumerable: true,
68
- configurable: true,
69
- writable: true,
70
- value: new YDoc()
71
- });
72
- Object.defineProperty(this, "onBack", {
73
- enumerable: true,
74
- configurable: true,
75
- writable: true,
76
- value: void 0
77
- });
78
- Object.defineProperty(this, "onForward", {
79
- enumerable: true,
80
- configurable: true,
81
- writable: true,
82
- value: void 0
83
- });
84
- Object.defineProperty(this, "onChange", {
85
- enumerable: true,
86
- configurable: true,
87
- writable: true,
88
- value: void 0
89
- });
90
- Object.defineProperty(this, "onPush", {
91
- enumerable: true,
92
- configurable: true,
93
- writable: true,
94
- value: void 0
95
- });
96
- Object.defineProperty(this, "backEvent", {
97
- enumerable: true,
98
- configurable: true,
99
- writable: true,
100
- value: new Subject()
101
- });
102
- Object.defineProperty(this, "forwardEvent", {
103
- enumerable: true,
104
- configurable: true,
105
- writable: true,
106
- value: new Subject()
107
- });
108
- Object.defineProperty(this, "changeEvent", {
109
- enumerable: true,
110
- configurable: true,
111
- writable: true,
112
- value: new Subject()
113
- });
114
- Object.defineProperty(this, "pushEvent", {
115
- enumerable: true,
116
- configurable: true,
117
- writable: true,
118
- value: new Subject()
119
- });
120
- Object.defineProperty(this, "manager", {
121
- enumerable: true,
122
- configurable: true,
123
- writable: true,
124
- value: void 0
125
- });
126
- Object.defineProperty(this, "subscriptions", {
127
- enumerable: true,
128
- configurable: true,
129
- writable: true,
130
- value: []
131
- });
132
- Object.defineProperty(this, "updateFromRemote", {
133
- enumerable: true,
134
- configurable: true,
135
- writable: true,
136
- value: false
137
- });
138
- Object.defineProperty(this, "contentSyncCaches", {
139
- enumerable: true,
140
- configurable: true,
141
- writable: true,
142
- value: new WeakMap()
143
- });
144
- Object.defineProperty(this, "slotStateSyncCaches", {
145
- enumerable: true,
146
- configurable: true,
147
- writable: true,
148
- value: new WeakMap()
149
- });
150
- Object.defineProperty(this, "slotsSyncCaches", {
151
- enumerable: true,
152
- configurable: true,
153
- writable: true,
154
- value: new WeakMap()
155
- });
156
- Object.defineProperty(this, "componentStateSyncCaches", {
157
- enumerable: true,
158
- configurable: true,
159
- writable: true,
160
- value: new WeakMap()
161
- });
162
- Object.defineProperty(this, "selectionChangeEvent", {
163
- enumerable: true,
164
- configurable: true,
165
- writable: true,
166
- value: new Subject()
167
- });
168
- Object.defineProperty(this, "updateRemoteActions", {
169
- enumerable: true,
170
- configurable: true,
171
- writable: true,
172
- value: []
173
- });
174
- this.onSelectionChange = this.selectionChangeEvent.asObservable();
59
+ constructor(stackSize, rootComponentRef, collaborateCursor, controller, scheduler, translator, registry, selection, starter) {
60
+ this.stackSize = stackSize;
61
+ this.rootComponentRef = rootComponentRef;
62
+ this.collaborateCursor = collaborateCursor;
63
+ this.controller = controller;
64
+ this.scheduler = scheduler;
65
+ this.translator = translator;
66
+ this.registry = registry;
67
+ this.selection = selection;
68
+ this.starter = starter;
69
+ this.yDoc = new YDoc();
70
+ this.backEvent = new Subject();
71
+ this.forwardEvent = new Subject();
72
+ this.changeEvent = new Subject();
73
+ this.pushEvent = new Subject();
74
+ this.manager = null;
75
+ this.subscriptions = [];
76
+ this.updateFromRemote = false;
77
+ this.contentSyncCaches = new WeakMap();
78
+ this.slotStateSyncCaches = new WeakMap();
79
+ this.slotsSyncCaches = new WeakMap();
80
+ this.componentStateSyncCaches = new WeakMap();
81
+ this.selectionChangeEvent = new Subject();
82
+ this.contentMap = new ContentMap();
83
+ this.updateRemoteActions = [];
84
+ this.onSelectionChange = this.selectionChangeEvent.asObservable().pipe(delay());
175
85
  this.onBack = this.backEvent.asObservable();
176
86
  this.onForward = this.forwardEvent.asObservable();
177
87
  this.onChange = this.changeEvent.asObservable();
@@ -179,19 +89,18 @@ let Collaborate = class Collaborate {
179
89
  }
180
90
  get canBack() {
181
91
  var _a;
182
- return (_a = this.manager) === null || _a === void 0 ? void 0 : _a.canUndo();
92
+ return ((_a = this.manager) === null || _a === void 0 ? void 0 : _a.canUndo()) || false;
183
93
  }
184
94
  get canForward() {
185
95
  var _a;
186
- return (_a = this.manager) === null || _a === void 0 ? void 0 : _a.canRedo();
96
+ return ((_a = this.manager) === null || _a === void 0 ? void 0 : _a.canRedo()) || false;
187
97
  }
188
98
  setup() {
189
- this.subscriptions.push(this.starter.onReady.subscribe(() => {
190
- this.listen2();
191
- }), this.selection.onChange.subscribe(() => {
99
+ this.subscriptions.push(this.selection.onChange.subscribe(() => {
192
100
  const paths = this.selection.getPaths();
193
101
  this.selectionChangeEvent.next(paths);
194
102
  }));
103
+ this.syncRootComponent();
195
104
  }
196
105
  updateRemoteSelection(paths) {
197
106
  this.collaborateCursor.draw(paths);
@@ -200,37 +109,140 @@ let Collaborate = class Collaborate {
200
109
  //
201
110
  }
202
111
  back() {
112
+ var _a;
203
113
  if (this.canBack) {
204
- this.manager.undo();
114
+ (_a = this.manager) === null || _a === void 0 ? void 0 : _a.undo();
115
+ this.backEvent.next();
205
116
  }
206
117
  }
207
118
  forward() {
119
+ var _a;
208
120
  if (this.canForward) {
209
- this.manager.redo();
121
+ (_a = this.manager) === null || _a === void 0 ? void 0 : _a.redo();
122
+ this.forwardEvent.next();
210
123
  }
211
124
  }
125
+ clear() {
126
+ var _a;
127
+ (_a = this.manager) === null || _a === void 0 ? void 0 : _a.clear();
128
+ this.changeEvent.next();
129
+ }
212
130
  destroy() {
131
+ var _a;
213
132
  this.subscriptions.forEach(i => i.unsubscribe());
133
+ this.collaborateCursor.destroy();
134
+ (_a = this.manager) === null || _a === void 0 ? void 0 : _a.destroy();
214
135
  }
215
- listen2() {
216
- const root = this.yDoc.getText('content');
136
+ syncRootComponent() {
137
+ const root = this.yDoc.getMap('RootComponent');
217
138
  const rootComponent = this.rootComponentRef.component;
218
139
  this.manager = new UndoManager(root, {
219
140
  trackedOrigins: new Set([this.yDoc])
220
141
  });
221
- this.syncContent(root, rootComponent.slots.get(0));
222
- this.subscriptions.push(merge(rootComponent.changeMarker.onForceChange, rootComponent.changeMarker.onChange).pipe(microTask()).subscribe(() => {
142
+ const cursorKey = 'cursor-position';
143
+ this.manager.on('stack-item-added', event => {
144
+ event.stackItem.meta.set(cursorKey, this.getRelativeCursorLocation());
145
+ if (this.manager.undoStack.length > this.stackSize) {
146
+ this.manager.undoStack.shift();
147
+ }
148
+ if (event.origin === this.yDoc) {
149
+ this.pushEvent.next();
150
+ }
151
+ this.changeEvent.next();
152
+ });
153
+ this.manager.on('stack-item-popped', event => {
154
+ const position = event.stackItem.meta.get(cursorKey);
155
+ if (position) {
156
+ this.restoreCursorLocation(position);
157
+ }
158
+ });
159
+ this.yDoc.once('update', () => {
160
+ let slots = root.get('slots');
161
+ if (!slots) {
162
+ slots = new YArray();
163
+ rootComponent.slots.toArray().forEach(i => {
164
+ const sharedSlot = this.createSharedSlotBySlot(i);
165
+ slots.push([sharedSlot]);
166
+ });
167
+ this.yDoc.transact(() => {
168
+ root.set('state', rootComponent.state);
169
+ root.set('slots', slots);
170
+ });
171
+ }
172
+ else if (slots.length === 0) {
173
+ rootComponent.updateState(() => {
174
+ return root.get('state');
175
+ });
176
+ this.yDoc.transact(() => {
177
+ rootComponent.slots.toArray().forEach(i => {
178
+ const sharedSlot = this.createSharedSlotBySlot(i);
179
+ slots.push([sharedSlot]);
180
+ });
181
+ });
182
+ }
183
+ else {
184
+ rootComponent.updateState(() => {
185
+ return root.get('state');
186
+ });
187
+ rootComponent.slots.clean();
188
+ slots.forEach(sharedSlot => {
189
+ const slot = this.createSlotBySharedSlot(sharedSlot);
190
+ this.syncContent(sharedSlot.get('content'), slot);
191
+ this.syncSlot(sharedSlot, slot);
192
+ rootComponent.slots.insert(slot);
193
+ });
194
+ }
195
+ this.syncComponent(root, rootComponent);
196
+ this.syncSlots(slots, rootComponent);
197
+ });
198
+ this.subscriptions.push(this.scheduler.onDocChanged.pipe(map(item => {
199
+ return item.filter(i => {
200
+ return i.from !== ChangeOrigin.Remote;
201
+ });
202
+ }), filter(item => {
203
+ return item.length;
204
+ })).subscribe(() => {
223
205
  this.yDoc.transact(() => {
224
206
  this.updateRemoteActions.forEach(fn => {
225
207
  fn();
226
208
  });
227
209
  this.updateRemoteActions = [];
228
210
  }, this.yDoc);
229
- this.renderer.render();
230
- this.selection.restore();
231
211
  }));
232
212
  }
213
+ restoreCursorLocation(position) {
214
+ const anchorPosition = createAbsolutePositionFromRelativePosition(position.anchor, this.yDoc);
215
+ const focusPosition = createAbsolutePositionFromRelativePosition(position.focus, this.yDoc);
216
+ if (anchorPosition && focusPosition) {
217
+ const focusSlot = this.contentMap.get(focusPosition.type);
218
+ const anchorSlot = this.contentMap.get(anchorPosition.type);
219
+ if (focusSlot && anchorSlot) {
220
+ this.selection.setBaseAndExtent(anchorSlot, anchorPosition.index, focusSlot, focusPosition.index);
221
+ }
222
+ }
223
+ }
224
+ getRelativeCursorLocation() {
225
+ const { anchorSlot, anchorOffset, focusSlot, focusOffset } = this.selection;
226
+ if (anchorSlot) {
227
+ const anchorYText = this.contentMap.get(anchorSlot);
228
+ if (anchorYText) {
229
+ const anchorPosition = createRelativePositionFromTypeIndex(anchorYText, anchorOffset);
230
+ if (focusSlot) {
231
+ const focusYText = this.contentMap.get(focusSlot);
232
+ if (focusYText) {
233
+ const focusPosition = createRelativePositionFromTypeIndex(focusYText, focusOffset);
234
+ return {
235
+ focus: focusPosition,
236
+ anchor: anchorPosition
237
+ };
238
+ }
239
+ }
240
+ }
241
+ }
242
+ return null;
243
+ }
233
244
  syncContent(content, slot) {
245
+ this.contentMap.set(slot, content);
234
246
  const syncRemote = (ev, tr) => {
235
247
  this.runRemoteUpdate(tr, () => {
236
248
  slot.retain(0);
@@ -255,17 +267,18 @@ let Collaborate = class Collaborate {
255
267
  }
256
268
  else {
257
269
  const sharedComponent = action.insert;
258
- const component = this.createComponentBySharedComponent(sharedComponent);
270
+ const canInsertInlineComponent = slot.schema.includes(ContentType.InlineComponent);
271
+ const component = this.createComponentBySharedComponent(sharedComponent, canInsertInlineComponent);
259
272
  this.syncSlots(sharedComponent.get('slots'), component);
260
273
  this.syncComponent(sharedComponent, component);
261
274
  slot.insert(component);
262
275
  }
263
276
  if (this.selection.isSelected) {
264
- if (slot === this.selection.startSlot && this.selection.startOffset >= index) {
265
- this.selection.setStart(slot, this.selection.startOffset + length);
277
+ if (slot === this.selection.anchorSlot && this.selection.anchorOffset > index) {
278
+ this.selection.setAnchor(slot, this.selection.anchorOffset + length);
266
279
  }
267
- if (slot === this.selection.endSlot && this.selection.endOffset >= index) {
268
- this.selection.setEnd(slot, this.selection.endOffset + length);
280
+ if (slot === this.selection.focusSlot && this.selection.focusOffset > index) {
281
+ this.selection.setFocus(slot, this.selection.focusOffset + length);
269
282
  }
270
283
  }
271
284
  }
@@ -274,11 +287,11 @@ let Collaborate = class Collaborate {
274
287
  slot.retain(slot.index);
275
288
  slot.delete(action.delete);
276
289
  if (this.selection.isSelected) {
277
- if (slot === this.selection.startSlot && this.selection.startOffset >= index) {
278
- this.selection.setStart(slot, this.selection.startOffset - action.delete);
290
+ if (slot === this.selection.anchorSlot && this.selection.anchorOffset >= index) {
291
+ this.selection.setAnchor(slot, this.selection.startOffset - action.delete);
279
292
  }
280
- if (slot === this.selection.endSlot && this.selection.endOffset >= index) {
281
- this.selection.setEnd(slot, this.selection.endOffset - action.delete);
293
+ if (slot === this.selection.focusSlot && this.selection.focusOffset >= index) {
294
+ this.selection.setFocus(slot, this.selection.focusOffset - action.delete);
282
295
  }
283
296
  }
284
297
  }
@@ -321,17 +334,13 @@ let Collaborate = class Collaborate {
321
334
  const isEmpty = delta.length === 1 && delta[0].insert === Slot.emptyPlaceholder;
322
335
  if (typeof action.content === 'string') {
323
336
  length = action.content.length;
324
- content.insert(offset, action.content);
337
+ content.insert(offset, action.content, action.formats || {});
325
338
  }
326
339
  else {
327
340
  length = 1;
328
- const component = slot.getContentAtIndex(offset);
329
- const sharedComponent = this.createSharedComponentByComponent(component);
341
+ const sharedComponent = this.createSharedComponentByComponent(action.ref);
330
342
  content.insertEmbed(offset, sharedComponent);
331
343
  }
332
- if (action.formats) {
333
- content.format(offset, length, action.formats);
334
- }
335
344
  if (isEmpty && offset === 0) {
336
345
  content.delete(content.length - 1, 1);
337
346
  }
@@ -339,7 +348,9 @@ let Collaborate = class Collaborate {
339
348
  }
340
349
  else if (action.type === 'delete') {
341
350
  const delta = content.toDelta();
342
- content.delete(offset, action.count);
351
+ if (content.length) {
352
+ content.delete(offset, action.count);
353
+ }
343
354
  if (content.length === 0) {
344
355
  content.insert(0, '\n', (_a = delta[0]) === null || _a === void 0 ? void 0 : _a.attributes);
345
356
  }
@@ -347,6 +358,11 @@ let Collaborate = class Collaborate {
347
358
  }
348
359
  });
349
360
  });
361
+ sub.add(slot.onChildComponentRemove.subscribe(components => {
362
+ components.forEach(c => {
363
+ this.cleanSubscriptionsByComponent(c);
364
+ });
365
+ }));
350
366
  this.contentSyncCaches.set(slot, () => {
351
367
  content.unobserve(syncRemote);
352
368
  sub.unsubscribe();
@@ -382,9 +398,11 @@ let Collaborate = class Collaborate {
382
398
  const slots = component.slots;
383
399
  const syncRemote = (ev, tr) => {
384
400
  this.runRemoteUpdate(tr, () => {
401
+ let index = 0;
385
402
  ev.delta.forEach(action => {
386
403
  if (Reflect.has(action, 'retain')) {
387
- slots.retain(action.retain);
404
+ index += action.retain;
405
+ slots.retain(index);
388
406
  }
389
407
  else if (action.insert) {
390
408
  action.insert.forEach(item => {
@@ -392,10 +410,11 @@ let Collaborate = class Collaborate {
392
410
  slots.insert(slot);
393
411
  this.syncContent(item.get('content'), slot);
394
412
  this.syncSlot(item, slot);
413
+ index++;
395
414
  });
396
415
  }
397
416
  else if (action.delete) {
398
- slots.retain(slots.index);
417
+ slots.retain(index);
399
418
  slots.delete(action.delete);
400
419
  }
401
420
  });
@@ -411,20 +430,21 @@ let Collaborate = class Collaborate {
411
430
  index = action.offset;
412
431
  }
413
432
  else if (action.type === 'insertSlot') {
414
- const slot = slots.get(index);
415
- const sharedSlot = this.createSharedSlotBySlot(slot);
433
+ const sharedSlot = this.createSharedSlotBySlot(action.ref);
416
434
  remoteSlots.insert(index, [sharedSlot]);
417
435
  index++;
418
436
  }
419
437
  else if (action.type === 'delete') {
420
- slots.slice(index, index + action.count).forEach(slot => {
421
- this.cleanSubscriptionsBySlot(slot);
422
- });
423
438
  remoteSlots.delete(index, action.count);
424
439
  }
425
440
  });
426
441
  });
427
442
  });
443
+ sub.add(slots.onChildSlotRemove.subscribe(slots => {
444
+ slots.forEach(slot => {
445
+ this.cleanSubscriptionsBySlot(slot);
446
+ });
447
+ }));
428
448
  this.slotsSyncCaches.set(component, () => {
429
449
  remoteSlots.unobserve(syncRemote);
430
450
  sub.unsubscribe();
@@ -455,7 +475,7 @@ let Collaborate = class Collaborate {
455
475
  });
456
476
  }
457
477
  runLocalUpdate(fn) {
458
- if (this.updateFromRemote) {
478
+ if (this.updateFromRemote || this.controller.readonly) {
459
479
  return;
460
480
  }
461
481
  this.updateRemoteActions.push(fn);
@@ -465,7 +485,12 @@ let Collaborate = class Collaborate {
465
485
  return;
466
486
  }
467
487
  this.updateFromRemote = true;
468
- fn();
488
+ if (tr.origin === this.manager) {
489
+ this.scheduler.historyApplyTransact(fn);
490
+ }
491
+ else {
492
+ this.scheduler.remoteUpdateTransact(fn);
493
+ }
469
494
  this.updateFromRemote = false;
470
495
  }
471
496
  createSharedComponentByComponent(component) {
@@ -512,7 +537,7 @@ let Collaborate = class Collaborate {
512
537
  this.syncSlot(sharedSlot, slot);
513
538
  return sharedSlot;
514
539
  }
515
- createComponentBySharedComponent(yMap) {
540
+ createComponentBySharedComponent(yMap, canInsertInlineComponent) {
516
541
  const sharedSlots = yMap.get('slots');
517
542
  const slots = [];
518
543
  sharedSlots.forEach(sharedSlot => {
@@ -526,13 +551,17 @@ let Collaborate = class Collaborate {
526
551
  });
527
552
  if (instance) {
528
553
  instance.slots.toArray().forEach((slot, index) => {
529
- const sharedSlot = sharedSlots.get(index);
554
+ let sharedSlot = sharedSlots.get(index);
555
+ if (!sharedSlot) {
556
+ sharedSlot = this.createSharedSlotBySlot(slot);
557
+ sharedSlots.push([sharedSlot]);
558
+ }
530
559
  this.syncSlot(sharedSlot, slot);
531
560
  this.syncContent(sharedSlot.get('content'), slot);
532
561
  });
533
562
  return instance;
534
563
  }
535
- throw collaborateErrorFn(`cannot find component factory \`${name}\`.`);
564
+ return createUnknownComponent(name, canInsertInlineComponent).createInstance(this.starter);
536
565
  }
537
566
  createSlotBySharedSlot(sharedSlot) {
538
567
  const content = sharedSlot.get('content');
@@ -550,7 +579,8 @@ let Collaborate = class Collaborate {
550
579
  }
551
580
  else {
552
581
  const sharedComponent = action.insert;
553
- const component = this.createComponentBySharedComponent(sharedComponent);
582
+ const canInsertInlineComponent = slot.schema.includes(ContentType.InlineComponent);
583
+ const component = this.createComponentBySharedComponent(sharedComponent, canInsertInlineComponent);
554
584
  slot.insert(component);
555
585
  this.syncSlots(sharedComponent.get('slots'), component);
556
586
  this.syncComponent(sharedComponent, component);
@@ -563,6 +593,7 @@ let Collaborate = class Collaborate {
563
593
  return slot;
564
594
  }
565
595
  cleanSubscriptionsBySlot(slot) {
596
+ this.contentMap.delete(slot);
566
597
  [this.contentSyncCaches.get(slot), this.slotStateSyncCaches.get(slot)].forEach(fn => {
567
598
  if (fn) {
568
599
  fn();
@@ -587,10 +618,12 @@ let Collaborate = class Collaborate {
587
618
  };
588
619
  Collaborate = __decorate([
589
620
  Injectable(),
590
- __metadata("design:paramtypes", [RootComponentRef,
621
+ __param(0, Inject(HISTORY_STACK_SIZE)),
622
+ __metadata("design:paramtypes", [Number, RootComponentRef,
591
623
  CollaborateCursor,
624
+ Controller,
625
+ Scheduler,
592
626
  Translator,
593
- Renderer,
594
627
  Registry,
595
628
  Selection,
596
629
  Starter])
@@ -599,7 +632,7 @@ export { Collaborate };
599
632
  function makeFormats(registry, attrs) {
600
633
  const formats = [];
601
634
  if (attrs) {
602
- Object.keys(attrs).map(key => {
635
+ Object.keys(attrs).forEach(key => {
603
636
  const formatter = registry.getFormatter(key);
604
637
  if (formatter) {
605
638
  formats.push([formatter, attrs[key]]);
@@ -608,4 +641,4 @@ function makeFormats(registry, attrs) {
608
641
  }
609
642
  return formats;
610
643
  }
611
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGFib3JhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29sbGFib3JhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUN0QyxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBYyxPQUFPLEVBQWdCLE1BQU0sZUFBZSxDQUFBO0FBQ25GLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLFVBQVUsRUFDVixRQUFRLEVBQ1IsU0FBUyxFQUVBLFFBQVEsRUFBRSxJQUFJLEVBQXFCLFNBQVMsRUFDdEQsTUFBTSxlQUFlLENBQUE7QUFDdEIsT0FBTyxFQUNMLEdBQUcsSUFBSSxJQUFJLEVBQ1gsR0FBRyxJQUFJLElBQUksRUFDWCxJQUFJLElBQUksS0FBSyxFQUNiLEtBQUssSUFBSSxNQUFNLEVBQ2YsV0FBVyxFQUVaLE1BQU0sS0FBSyxDQUFBO0FBRVosT0FBTyxFQUFFLGlCQUFpQixFQUFtQixNQUFNLHNCQUFzQixDQUFBO0FBRXpFLE1BQU0sa0JBQWtCLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFBO0FBR25ELElBQWEsV0FBVyxHQUF4QixNQUFhLFdBQVc7SUFtQ3RCLFlBQW9CLGdCQUFrQyxFQUNsQyxpQkFBb0MsRUFDcEMsVUFBc0IsRUFDdEIsUUFBa0IsRUFDbEIsUUFBa0IsRUFDbEIsU0FBb0IsRUFDcEIsT0FBZ0I7Ozs7O21CQU5oQjs7Ozs7O21CQUNBOzs7Ozs7bUJBQ0E7Ozs7OzttQkFDQTs7Ozs7O21CQUNBOzs7Ozs7bUJBQ0E7Ozs7OzttQkFDQTs7UUF4Q3BCOzs7OztXQUE2QztRQUM3Qzs7OzttQkFBTyxJQUFJLElBQUksRUFBRTtXQUFBO1FBQ2pCOzs7OztXQUF3QjtRQUN4Qjs7Ozs7V0FBMkI7UUFDM0I7Ozs7O1dBQXlCO1FBQ3pCOzs7OztXQUF3QjtRQVV4Qjs7OzttQkFBb0IsSUFBSSxPQUFPLEVB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SSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3JDLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGLENBQUE7QUFsZFksV0FBVztJQUR2QixVQUFVLEVBQUU7cUNBb0MyQixnQkFBZ0I7UUFDZixpQkFBaUI7UUFDeEIsVUFBVTtRQUNaLFFBQVE7UUFDUixRQUFRO1FBQ1AsU0FBUztRQUNYLE9BQU87R0F6Q3pCLFdBQVcsQ0FrZHZCO1NBbGRZLFdBQVc7QUFvZHhCLFNBQVMsV0FBVyxDQUFDLFFBQWtCLEVBQUUsS0FBVztJQUNsRCxNQUFNLE9BQU8sR0FBWSxFQUFFLENBQUE7SUFDM0IsSUFBSSxLQUFLLEVBQUU7UUFDVCxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUMzQixNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQzVDLElBQUksU0FBUyxFQUFFO2dCQUNiLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQTthQUN0QztRQUNILENBQUMsQ0FBQyxDQUFBO0tBQ0g7SUFDRCxPQUFPLE9BQU8sQ0FBQTtBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0B0YW5iby9kaSdcbmltcG9ydCB7IG1lcmdlLCBtaWNyb1Rhc2ssIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ0B0YW5iby9zdHJlYW0nXG5pbXBvcnQge1xuICBSb290Q29tcG9uZW50UmVmLFxuICBTdGFydGVyLFxuICBUcmFuc2xhdG9yLFxuICBSZWdpc3RyeSxcbiAgU2VsZWN0aW9uLFxuICBTZWxlY3Rpb25QYXRocyxcbiAgSGlzdG9yeSwgUmVuZGVyZXIsIFNsb3QsIENvbXBvbmVudEluc3RhbmNlLCBtYWtlRXJyb3IsIEZvcm1hdHNcbn0gZnJvbSAnQHRleHRidXMvY29yZSdcbmltcG9ydCB7XG4gIERvYyBhcyBZRG9jLFxuICBNYXAgYXMgWU1hcCxcbiAgVGV4dCBhcyBZVGV4dCxcbiAgQXJyYXkgYXMgWUFycmF5LFxuICBVbmRvTWFuYWdlcixcbiAgVHJhbnNhY3Rpb25cbn0gZnJvbSAneWpzJ1xuXG5pbXBvcnQgeyBDb2xsYWJvcmF0ZUN1cnNvciwgUmVtb3RlU2VsZWN0aW9uIH0gZnJvbSAnLi9jb2xsYWJvcmF0ZS1jdXJzb3InXG5cbmNvbnN0IGNvbGxhYm9yYXRlRXJyb3JGbiA9IG1ha2VFcnJvcignQ29sbGFib3JhdGUnKVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQ29sbGFib3JhdGUgaW1wbGVtZW50cyBIaXN0b3J5IHtcbiAgb25TZWxlY3Rpb25DaGFuZ2U6IE9ic2VydmFibGU8U2VsZWN0aW9uUGF0aHM+XG4gIHlEb2MgPSBuZXcgWURvYygpXG4gIG9uQmFjazogT2JzZXJ2YWJsZTx2b2lkPlxuICBvbkZvcndhcmQ6IE9ic2VydmFibGU8dm9pZD5cbiAgb25DaGFuZ2U6IE9ic2VydmFibGU8YW55PlxuICBvblB1c2g6IE9ic2VydmFibGU8dm9pZD5cblxuICBnZXQgY2FuQmFjaygpIHtcbiAgICByZXR1cm4gdGhpcy5tYW5hZ2VyPy5jYW5VbmRvKClcbiAgfVxuXG4gIGdldCBjYW5Gb3J3YXJkKCkge1xuICAgIHJldHVybiB0aGlzLm1hbmFnZXI/LmNhblJlZG8oKVxuICB9XG5cbiAgcHJpdmF0ZSBiYWNrRXZlbnQgPSBuZXcgU3ViamVjdDx2b2lkPigpXG4gIHByaXZhdGUgZm9yd2FyZEV2ZW50ID0gbmV3IFN1YmplY3Q8dm9pZD4oKVxuICBwcml2YXRlIGNoYW5nZUV2ZW50ID0gbmV3IFN1YmplY3Q8dm9pZD4oKVxuICBwcml2YXRlIHB1c2hFdmVudCA9IG5ldyBTdWJqZWN0PHZvaWQ+KClcblxuICBwcml2YXRlIG1hbmFnZXIhOiBVbmRvTWFuYWdlclxuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXVxuICBwcml2YXRlIHVwZGF0ZUZyb21SZW1vdGUgPSBmYWxzZVxuXG4gIHByaXZhdGUgY29udGVudFN5bmNDYWNoZXMgPSBuZXcgV2Vha01hcDxTbG90LCAoKSA9PiB2b2lkPigpXG4gIHByaXZhdGUgc2xvdFN0YXRlU3luY0NhY2hlcyA9IG5ldyBXZWFrTWFwPFNsb3QsICgpID0+IHZvaWQ+KClcbiAgcHJpdmF0ZSBzbG90c1N5bmNDYWNoZXMgPSBuZXcgV2Vha01hcDxDb21wb25lbnRJbnN0YW5jZSwgKCkgPT4gdm9pZD4oKVxuICBwcml2YXRlIGNvbXBvbmVudFN0YXRlU3luY0NhY2hlcyA9IG5ldyBXZWFrTWFwPENvbXBvbmVudEluc3RhbmNlLCAoKSA9PiB2b2lkPigpXG5cbiAgcHJpdmF0ZSBzZWxlY3Rpb25DaGFuZ2VFdmVudCA9IG5ldyBTdWJqZWN0PFNlbGVjdGlvblBhdGhzPigpXG5cbiAgcHJpdmF0ZSB1cGRhdGVSZW1vdGVBY3Rpb25zOiBBcnJheTwoKSA9PiB2b2lkPiA9IFtdXG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByb290Q29tcG9uZW50UmVmOiBSb290Q29tcG9uZW50UmVmLFxuICAgICAgICAgICAgICBwcml2YXRlIGNvbGxhYm9yYXRlQ3Vyc29yOiBDb2xsYWJvcmF0ZUN1cnNvcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSB0cmFuc2xhdG9yOiBUcmFuc2xhdG9yLFxuICAgICAgICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSByZWdpc3RyeTogUmVnaXN0cnksXG4gICAgICAgICAgICAgIHByaXZhdGUgc2VsZWN0aW9uOiBTZWxlY3Rpb24sXG4gICAgICAgICAgICAgIHByaXZhdGUgc3RhcnRlcjogU3RhcnRlcikge1xuICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UgPSB0aGlzLnNlbGVjdGlvbkNoYW5nZUV2ZW50LmFzT2JzZXJ2YWJsZSgpXG4gICAgdGhpcy5vbkJhY2sgPSB0aGlzLmJhY2tFdmVudC5hc09ic2VydmFibGUoKVxuICAgIHRoaXMub25Gb3J3YXJkID0gdGhpcy5mb3J3YXJkRXZlbnQuYXNPYnNlcnZhYmxlKClcbiAgICB0aGlzLm9uQ2hhbmdlID0gdGhpcy5jaGFuZ2VFdmVudC5hc09ic2VydmFibGUoKVxuICAgIHRoaXMub25QdXNoID0gdGhpcy5wdXNoRXZlbnQuYXNPYnNlcnZhYmxlKClcbiAgfVxuXG4gIHNldHVwKCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5zdGFydGVyLm9uUmVhZHkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5saXN0ZW4yKClcbiAgICAgIH0pLFxuICAgICAgdGhpcy5zZWxlY3Rpb24ub25DaGFuZ2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgY29uc3QgcGF0aHMgPSB0aGlzLnNlbGVjdGlvbi5nZXRQYXRocygpXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlRXZlbnQubmV4dChwYXRocylcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgdXBkYXRlUmVtb3RlU2VsZWN0aW9uKHBhdGhzOiBSZW1vdGVTZWxlY3Rpb25bXSkge1xuICAgIHRoaXMuY29sbGFib3JhdGVDdXJzb3IuZHJhdyhwYXRocylcbiAgfVxuXG4gIGxpc3RlbigpIHtcbiAgICAvL1xuICB9XG5cbiAgYmFjaygpIHtcbiAgICBpZiAodGhpcy5jYW5CYWNrKSB7XG4gICAgICB0aGlzLm1hbmFnZXIudW5kbygpXG4gICAgfVxuICB9XG5cbiAgZm9yd2FyZCgpIHtcbiAgICBpZiAodGhpcy5jYW5Gb3J3YXJkKSB7XG4gICAgICB0aGlzLm1hbmFnZXIucmVkbygpXG4gICAgfVxuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaChpID0+IGkudW5zdWJzY3JpYmUoKSlcbiAgfVxuXG4gIHByaXZhdGUgbGlzdGVuMigpIHtcbiAgICBjb25zdCByb290ID0gdGhpcy55RG9jLmdldFRleHQoJ2NvbnRlbnQnKVxuICAgIGNvbnN0IHJvb3RDb21wb25lbnQgPSB0aGlzLnJvb3RDb21wb25lbnRSZWYuY29tcG9uZW50IVxuICAgIHRoaXMubWFuYWdlciA9IG5ldyBVbmRvTWFuYWdlcihyb290LCB7XG4gICAgICB0cmFja2VkT3JpZ2luczogbmV3IFNldDxhbnk+KFt0aGlzLnlEb2NdKVxuICAgIH0pXG4gICAgdGhpcy5zeW5jQ29udGVudChyb290LCByb290Q29tcG9uZW50LnNsb3RzLmdldCgwKSEpXG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIG1lcmdlKFxuICAgICAgICByb290Q29tcG9uZW50LmNoYW5nZU1hcmtlci5vbkZvcmNlQ2hhbmdlLFxuICAgICAgICByb290Q29tcG9uZW50LmNoYW5nZU1hcmtlci5vbkNoYW5nZVxuICAgICAgKS5waXBlKFxuICAgICAgICBtaWNyb1Rhc2soKVxuICAgICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnlEb2MudHJhbnNhY3QoKCkgPT4ge1xuICAgICAgICAgIHRoaXMudXBkYXRlUmVtb3RlQWN0aW9ucy5mb3JFYWNoKGZuID0+IHtcbiAgICAgICAgICAgIGZuKClcbiAgICAgICAgICB9KVxuICAgICAgICAgIHRoaXMudXBkYXRlUmVtb3RlQWN0aW9ucyA9IFtdXG4gICAgICAgIH0sIHRoaXMueURvYylcbiAgICAgICAgdGhpcy5yZW5kZXJlci5yZW5kZXIoKVxuICAgICAgICB0aGlzLnNlbGVjdGlvbi5yZXN0b3JlKClcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgcHJpdmF0ZSBzeW5jQ29udGVudChjb250ZW50OiBZVGV4dCwgc2xvdDogU2xvdCkge1xuICAgIGNvbnN0IHN5bmNSZW1vdGUgPSAoZXYsIHRyKSA9PiB7XG4gICAgICB0aGlzLnJ1blJlbW90ZVVwZGF0ZSh0ciwgKCkgPT4ge1xuICAgICAgICBzbG90LnJldGFpbigwKVxuICAgICAgICBldi5kZWx0YS5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgICAgICAgaWYgKFJlZmxlY3QuaGFzKGFjdGlvbiwgJ3JldGFpbicpKSB7XG4gICAgICAgICAgICBpZiAoYWN0aW9uLmF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgICAgY29uc3QgZm9ybWF0cyA9IG1ha2VGb3JtYXRzKHRoaXMucmVnaXN0cnksIGFjdGlvbi5hdHRyaWJ1dGVzKVxuICAgICAgICAgICAgICBpZiAoZm9ybWF0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBzbG90LnJldGFpbihhY3Rpb24ucmV0YWluISwgZm9ybWF0cylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2xvdC5yZXRhaW4oYWN0aW9uLnJldGFpbilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5pbnNlcnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc2xvdC5pbmRleFxuICAgICAgICAgICAgbGV0IGxlbmd0aCA9IDFcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYWN0aW9uLmluc2VydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgbGVuZ3RoID0gYWN0aW9uLmluc2VydC5sZW5ndGhcbiAgICAgICAgICAgICAgc2xvdC5pbnNlcnQoYWN0aW9uLmluc2VydCwgbWFrZUZvcm1hdHModGhpcy5yZWdpc3RyeSwgYWN0aW9uLmF0dHJpYnV0ZXMpKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkQ29tcG9uZW50ID0gYWN0aW9uLmluc2VydCBhcyBZTWFwPGFueT5cbiAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jcmVhdGVDb21wb25lbnRCeVNoYXJlZENvbXBvbmVudChzaGFyZWRDb21wb25lbnQpXG4gICAgICAgICAgICAgIHRoaXMuc3luY1Nsb3RzKHNoYXJlZENvbXBvbmVudC5nZXQoJ3Nsb3RzJyksIGNvbXBvbmVudClcbiAgICAgICAgICAgICAgdGhpcy5zeW5jQ29tcG9uZW50KHNoYXJlZENvbXBvbmVudCwgY29tcG9uZW50KVxuICAgICAgICAgICAgICBzbG90Lmluc2VydChjb21wb25lbnQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24uaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgICBpZiAoc2xvdCA9PT0gdGhpcy5zZWxlY3Rpb24uc3RhcnRTbG90ICYmIHRoaXMuc2VsZWN0aW9uLnN0YXJ0T2Zmc2V0ISA+PSBpbmRleCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldFN0YXJ0KHNsb3QsIHRoaXMuc2VsZWN0aW9uLnN0YXJ0T2Zmc2V0ISArIGxlbmd0aClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoc2xvdCA9PT0gdGhpcy5zZWxlY3Rpb24uZW5kU2xvdCAmJiB0aGlzLnNlbGVjdGlvbi5lbmRPZmZzZXQhID49IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2V0RW5kKHNsb3QsIHRoaXMuc2VsZWN0aW9uLmVuZE9mZnNldCEgKyBsZW5ndGgpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5kZWxldGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc2xvdC5pbmRleFxuICAgICAgICAgICAgc2xvdC5yZXRhaW4oc2xvdC5pbmRleClcbiAgICAgICAgICAgIHNsb3QuZGVsZXRlKGFjdGlvbi5kZWxldGUpXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24uaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgICBpZiAoc2xvdCA9PT0gdGhpcy5zZWxlY3Rpb24uc3RhcnRTbG90ICYmIHRoaXMuc2VsZWN0aW9uLnN0YXJ0T2Zmc2V0ISA+PSBpbmRleCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldFN0YXJ0KHNsb3QsIHRoaXMuc2VsZWN0aW9uLnN0YXJ0T2Zmc2V0ISAtIGFjdGlvbi5kZWxldGUpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHNsb3QgPT09IHRoaXMuc2VsZWN0aW9uLmVuZFNsb3QgJiYgdGhpcy5zZWxlY3Rpb24uZW5kT2Zmc2V0ISA+PSBpbmRleCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldEVuZChzbG90LCB0aGlzLnNlbGVjdGlvbi5lbmRPZmZzZXQhIC0gYWN0aW9uLmRlbGV0ZSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIHNsb3QudXBkYXRlU3RhdGUoZHJhZnQgPT4ge1xuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGRyYWZ0LCBhY3Rpb24uYXR0cmlidXRlcylcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG4gICAgY29udGVudC5vYnNlcnZlKHN5bmNSZW1vdGUpXG5cbiAgICBjb25zdCBzdWIgPSBzbG90Lm9uQ29udGVudENoYW5nZS5zdWJzY3JpYmUoYWN0aW9ucyA9PiB7XG4gICAgICB0aGlzLnJ1bkxvY2FsVXBkYXRlKCgpID0+IHtcbiAgICAgICAgbGV0IG9mZnNldCA9IDBcbiAgICAgICAgbGV0IGxlbmd0aCA9IDBcbiAgICAgICAgZm9yIChjb25zdCBhY3Rpb24gb2YgYWN0aW9ucykge1xuICAgICAgICAgIGlmIChhY3Rpb24udHlwZSA9PT0gJ3JldGFpbicpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHMgPSBhY3Rpb24uZm9ybWF0c1xuICAgICAgICAgICAgaWYgKGZvcm1hdHMpIHtcbiAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGZvcm1hdHMpXG4gICAgICAgICAgICAgIGxldCBsZW5ndGggPSBrZXlzLmxlbmd0aFxuICAgICAgICAgICAgICBrZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMucmVnaXN0cnkuZ2V0Rm9ybWF0dGVyKGtleSkpIHtcbiAgICAgICAgICAgICAgICAgIGxlbmd0aC0tXG4gICAgICAgICAgICAgICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGZvcm1hdHMsIGtleSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIGlmIChsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50LmZvcm1hdChvZmZzZXQsIGFjdGlvbi5vZmZzZXQsIGZvcm1hdHMpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG9mZnNldCA9IGFjdGlvbi5vZmZzZXRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi50eXBlID09PSAnaW5zZXJ0Jykge1xuICAgICAgICAgICAgY29uc3QgZGVsdGEgPSBjb250ZW50LnRvRGVsdGEoKVxuICAgICAgICAgICAgY29uc3QgaXNFbXB0eSA9IGRlbHRhLmxlbmd0aCA9PT0gMSAmJiBkZWx0YVswXS5pbnNlcnQgPT09IFNsb3QuZW1wdHlQbGFjZWhvbGRlclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb24uY29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgbGVuZ3RoID0gYWN0aW9uLmNvbnRlbnQubGVuZ3RoXG4gICAgICAgICAgICAgIGNvbnRlbnQuaW5zZXJ0KG9mZnNldCwgYWN0aW9uLmNvbnRlbnQpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsZW5ndGggPSAxXG4gICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHNsb3QuZ2V0Q29udGVudEF0SW5kZXgob2Zmc2V0KSBhcyBDb21wb25lbnRJbnN0YW5jZVxuICAgICAgICAgICAgICBjb25zdCBzaGFyZWRDb21wb25lbnQgPSB0aGlzLmNyZWF0ZVNoYXJlZENvbXBvbmVudEJ5Q29tcG9uZW50KGNvbXBvbmVudClcbiAgICAgICAgICAgICAgY29udGVudC5pbnNlcnRFbWJlZChvZmZzZXQsIHNoYXJlZENvbXBvbmVudClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhY3Rpb24uZm9ybWF0cykge1xuICAgICAgICAgICAgICBjb250ZW50LmZvcm1hdChvZmZzZXQsIGxlbmd0aCwgYWN0aW9uLmZvcm1hdHMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNFbXB0eSAmJiBvZmZzZXQgPT09IDApIHtcbiAgICAgICAgICAgICAgY29udGVudC5kZWxldGUoY29udGVudC5sZW5ndGggLSAxLCAxKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2Zmc2V0ICs9IGxlbmd0aFxuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLnR5cGUgPT09ICdkZWxldGUnKSB7XG4gICAgICAgICAgICBjb25zdCBkZWx0YSA9IGNvbnRlbnQudG9EZWx0YSgpXG4gICAgICAgICAgICBjb250ZW50LmRlbGV0ZShvZmZzZXQsIGFjdGlvbi5jb3VudClcbiAgICAgICAgICAgIGlmIChjb250ZW50Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICBjb250ZW50Lmluc2VydCgwLCAnXFxuJywgZGVsdGFbMF0/LmF0dHJpYnV0ZXMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gICAgdGhpcy5jb250ZW50U3luY0NhY2hlcy5zZXQoc2xvdCwgKCkgPT4ge1xuICAgICAgY29udGVudC51bm9ic2VydmUoc3luY1JlbW90ZSlcbiAgICAgIHN1Yi51bnN1YnNjcmliZSgpXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgc3luY1Nsb3QocmVtb3RlU2xvdDogWU1hcDxhbnk+LCBzbG90OiBTbG90KSB7XG4gICAgY29uc3Qgc3luY1JlbW90ZSA9IChldiwgdHIpID0+IHtcbiAgICAgIHRoaXMucnVuUmVtb3RlVXBkYXRlKHRyLCAoKSA9PiB7XG4gICAgICAgIGV2LmtleXNDaGFuZ2VkLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICBpZiAoa2V5ID09PSAnc3RhdGUnKSB7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZSA9IChldi50YXJnZXQgYXMgWU1hcDxhbnk+KS5nZXQoJ3N0YXRlJylcbiAgICAgICAgICAgIHNsb3QudXBkYXRlU3RhdGUoZHJhZnQgPT4ge1xuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGRyYWZ0LCBzdGF0ZSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG4gICAgcmVtb3RlU2xvdC5vYnNlcnZlKHN5bmNSZW1vdGUpXG5cbiAgICBjb25zdCBzdWIgPSBzbG90Lm9uU3RhdGVDaGFuZ2Uuc3Vic2NyaWJlKGFjdGlvbnMgPT4ge1xuICAgICAgdGhpcy5ydW5Mb2NhbFVwZGF0ZSgoKSA9PiB7XG4gICAgICAgIGFjdGlvbnMuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgICAgICAgIHJlbW90ZVNsb3Quc2V0KCdzdGF0ZScsIGFjdGlvbi52YWx1ZSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcbiAgICB0aGlzLnNsb3RTdGF0ZVN5bmNDYWNoZXMuc2V0KHNsb3QsICgpID0+IHtcbiAgICAgIHJlbW90ZVNsb3QudW5vYnNlcnZlKHN5bmNSZW1vdGUpXG4gICAgICBzdWIudW5zdWJzY3JpYmUoKVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIHN5bmNTbG90cyhyZW1vdGVTbG90czogWUFycmF5PGFueT4sIGNvbXBvbmVudDogQ29tcG9uZW50SW5zdGFuY2UpIHtcbiAgICBjb25zdCBzbG90cyA9IGNvbXBvbmVudC5zbG90c1xuICAgIGNvbnN0IHN5bmNSZW1vdGUgPSAoZXYsIHRyKSA9PiB7XG4gICAgICB0aGlzLnJ1blJlbW90ZVVwZGF0ZSh0ciwgKCkgPT4ge1xuICAgICAgICBldi5kZWx0YS5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgICAgICAgaWYgKFJlZmxlY3QuaGFzKGFjdGlvbiwgJ3JldGFpbicpKSB7XG4gICAgICAgICAgICBzbG90cy5yZXRhaW4oYWN0aW9uLnJldGFpbiEpXG4gICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uaW5zZXJ0KSB7XG4gICAgICAgICAgICAoYWN0aW9uLmluc2VydCBhcyBBcnJheTxZTWFwPGFueT4+KS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICBjb25zdCBzbG90ID0gdGhpcy5jcmVhdGVTbG90QnlTaGFyZWRTbG90KGl0ZW0pXG4gICAgICAgICAgICAgIHNsb3RzLmluc2VydChzbG90KVxuICAgICAgICAgICAgICB0aGlzLnN5bmNDb250ZW50KGl0ZW0uZ2V0KCdjb250ZW50JyksIHNsb3QpXG4gICAgICAgICAgICAgIHRoaXMuc3luY1Nsb3QoaXRlbSwgc2xvdClcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZGVsZXRlKSB7XG4gICAgICAgICAgICBzbG90cy5yZXRhaW4oc2xvdHMuaW5kZXgpXG4gICAgICAgICAgICBzbG90cy5kZWxldGUoYWN0aW9uLmRlbGV0ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH1cbiAgICByZW1vdGVTbG90cy5vYnNlcnZlKHN5bmNSZW1vdGUpXG5cbiAgICBjb25zdCBzdWIgPSBzbG90cy5vbkNoYW5nZS5zdWJzY3JpYmUob3BlcmF0aW9ucyA9PiB7XG4gICAgICB0aGlzLnJ1bkxvY2FsVXBkYXRlKCgpID0+IHtcbiAgICAgICAgY29uc3QgYXBwbHlBY3Rpb25zID0gb3BlcmF0aW9ucy5hcHBseVxuICAgICAgICBsZXQgaW5kZXg6IG51bWJlclxuICAgICAgICBhcHBseUFjdGlvbnMuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgICAgICAgIGlmIChhY3Rpb24udHlwZSA9PT0gJ3JldGFpbicpIHtcbiAgICAgICAgICAgIGluZGV4ID0gYWN0aW9uLm9mZnNldFxuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLnR5cGUgPT09ICdpbnNlcnRTbG90Jykge1xuICAgICAgICAgICAgY29uc3Qgc2xvdCA9IHNsb3RzLmdldChpbmRleCkhXG4gICAgICAgICAgICBjb25zdCBzaGFyZWRTbG90ID0gdGhpcy5jcmVhdGVTaGFyZWRTbG90QnlTbG90KHNsb3QpXG4gICAgICAgICAgICByZW1vdGVTbG90cy5pbnNlcnQoaW5kZXgsIFtzaGFyZWRTbG90XSlcbiAgICAgICAgICAgIGluZGV4KytcbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi50eXBlID09PSAnZGVsZXRlJykge1xuICAgICAgICAgICAgc2xvdHMuc2xpY2UoaW5kZXgsIGluZGV4ICsgYWN0aW9uLmNvdW50KS5mb3JFYWNoKHNsb3QgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmNsZWFuU3Vic2NyaXB0aW9uc0J5U2xvdChzbG90KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJlbW90ZVNsb3RzLmRlbGV0ZShpbmRleCwgYWN0aW9uLmNvdW50KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHRoaXMuc2xvdHNTeW5jQ2FjaGVzLnNldChjb21wb25lbnQsICgpID0+IHtcbiAgICAgIHJlbW90ZVNsb3RzLnVub2JzZXJ2ZShzeW5jUmVtb3RlKVxuICAgICAgc3ViLnVuc3Vic2NyaWJlKClcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBzeW5jQ29tcG9uZW50KHJlbW90ZUNvbXBvbmVudDogWU1hcDxhbnk+LCBjb21wb25lbnQ6IENvbXBvbmVudEluc3RhbmNlKSB7XG4gICAgY29uc3Qgc3luY1JlbW90ZSA9IChldiwgdHIpID0+IHtcbiAgICAgIHRoaXMucnVuUmVtb3RlVXBkYXRlKHRyLCAoKSA9PiB7XG4gICAgICAgIGV2LmtleXNDaGFuZ2VkLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICBpZiAoa2V5ID09PSAnc3RhdGUnKSB7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZSA9IChldi50YXJnZXQgYXMgWU1hcDxhbnk+KS5nZXQoJ3N0YXRlJylcbiAgICAgICAgICAgIGNvbXBvbmVudC51cGRhdGVTdGF0ZShkcmFmdCA9PiB7XG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZHJhZnQsIHN0YXRlKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH1cbiAgICByZW1vdGVDb21wb25lbnQub2JzZXJ2ZShzeW5jUmVtb3RlKVxuXG4gICAgY29uc3Qgc3ViID0gY29tcG9uZW50Lm9uU3RhdGVDaGFuZ2Uuc3Vic2NyaWJlKG5ld1N0YXRlID0+IHtcbiAgICAgIHRoaXMucnVuTG9jYWxVcGRhdGUoKCkgPT4ge1xuICAgICAgICByZW1vdGVDb21wb25lbnQuc2V0KCdzdGF0ZScsIG5ld1N0YXRlKVxuICAgICAgfSlcbiAgICB9KVxuICAgIHRoaXMuY29tcG9uZW50U3RhdGVTeW5jQ2FjaGVzLnNldChjb21wb25lbnQsICgpID0+IHtcbiAgICAgIHJlbW90ZUNvbXBvbmVudC51bm9ic2VydmUoc3luY1JlbW90ZSlcbiAgICAgIHN1Yi51bnN1YnNjcmliZSgpXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgcnVuTG9jYWxVcGRhdGUoZm46ICgpID0+IHZvaWQpIHtcbiAgICBpZiAodGhpcy51cGRhdGVGcm9tUmVtb3RlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy51cGRhdGVSZW1vdGVBY3Rpb25zLnB1c2goZm4pXG4gIH1cblxuICBwcml2YXRlIHJ1blJlbW90ZVVwZGF0ZSh0cjogVHJhbnNhY3Rpb24sIGZuOiAoKSA9PiB2b2lkKSB7XG4gICAgaWYgKHRyLm9yaWdpbiA9PT0gdGhpcy55RG9jKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy51cGRhdGVGcm9tUmVtb3RlID0gdHJ1ZVxuICAgIGZuKClcbiAgICB0aGlzLnVwZGF0ZUZyb21SZW1vdGUgPSBmYWxzZVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTaGFyZWRDb21wb25lbnRCeUNvbXBvbmVudChjb21wb25lbnQ6IENvbXBvbmVudEluc3RhbmNlKTogWU1hcDxhbnk+IHtcbiAgICBjb25zdCBzaGFyZWRDb21wb25lbnQgPSBuZXcgWU1hcCgpXG4gICAgc2hhcmVkQ29tcG9uZW50LnNldCgnc3RhdGUnLCBjb21wb25lbnQuc3RhdGUpXG4gICAgc2hhcmVkQ29tcG9uZW50LnNldCgnbmFtZScsIGNvbXBvbmVudC5uYW1lKVxuICAgIGNvbnN0IHNoYXJlZFNsb3RzID0gbmV3IFlBcnJheSgpXG4gICAgc2hhcmVkQ29tcG9uZW50LnNldCgnc2xvdHMnLCBzaGFyZWRTbG90cylcbiAgICBjb21wb25lbnQuc2xvdHMudG9BcnJheSgpLmZvckVhY2goc2xvdCA9PiB7XG4gICAgICBjb25zdCBzaGFyZWRTbG90ID0gdGhpcy5jcmVhdGVTaGFyZWRTbG90QnlTbG90KHNsb3QpXG4gICAgICBzaGFyZWRTbG90cy5wdXNoKFtzaGFyZWRTbG90XSlcbiAgICB9KVxuICAgIHRoaXMuc3luY1Nsb3RzKHNoYXJlZFNsb3RzLCBjb21wb25lbnQpXG4gICAgdGhpcy5zeW5jQ29tcG9uZW50KHNoYXJlZENvbXBvbmVudCwgY29tcG9uZW50KVxuICAgIHJldHVybiBzaGFyZWRDb21wb25lbnRcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU2hhcmVkU2xvdEJ5U2xvdChzbG90OiBTbG90KTogWU1hcDxhbnk+IHtcbiAgICBjb25zdCBzaGFyZWRTbG90ID0gbmV3IFlNYXAoKVxuICAgIHNoYXJlZFNsb3Quc2V0KCdzY2hlbWEnLCBzbG90LnNjaGVtYSlcbiAgICBzaGFyZWRTbG90LnNldCgnc3RhdGUnLCBzbG90LnN0YXRlKVxuICAgIGNvbnN0IHNoYXJlZENvbnRlbnQgPSBuZXcgWVRleHQoKVxuICAgIHNoYXJlZFNsb3Quc2V0KCdjb250ZW50Jywgc2hhcmVkQ29udGVudClcbiAgICBsZXQgb2Zmc2V0ID0gMFxuICAgIHNsb3QudG9EZWx0YSgpLmZvckVhY2goaSA9PiB7XG4gICAgICBsZXQgZm9ybWF0czogYW55ID0ge31cbiAgICAgIGlmIChpLmZvcm1hdHMpIHtcbiAgICAgICAgaS5mb3JtYXRzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgZm9ybWF0c1tpdGVtWzBdLm5hbWVdID0gaXRlbVsxXVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9ybWF0cyA9IG51bGxcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgaS5pbnNlcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHNoYXJlZENvbnRlbnQuaW5zZXJ0KG9mZnNldCwgaS5pbnNlcnQsIGZvcm1hdHMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzaGFyZWRDb21wb25lbnQgPSB0aGlzLmNyZWF0ZVNoYXJlZENvbXBvbmVudEJ5Q29tcG9uZW50KGkuaW5zZXJ0KVxuICAgICAgICBzaGFyZWRDb250ZW50Lmluc2VydEVtYmVkKG9mZnNldCwgc2hhcmVkQ29tcG9uZW50LCBmb3JtYXRzKVxuICAgICAgfVxuICAgICAgb2Zmc2V0ICs9IGkuaW5zZXJ0Lmxlbmd0aFxuICAgIH0pXG4gICAgdGhpcy5zeW5jQ29udGVudChzaGFyZWRDb250ZW50LCBzbG90KVxuICAgIHRoaXMuc3luY1Nsb3Qoc2hhcmVkU2xvdCwgc2xvdClcbiAgICByZXR1cm4gc2hhcmVkU2xvdFxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDb21wb25lbnRCeVNoYXJlZENvbXBvbmVudCh5TWFwOiBZTWFwPGFueT4pOiBDb21wb25lbnRJbnN0YW5jZSB7XG4gICAgY29uc3Qgc2hhcmVkU2xvdHMgPSB5TWFwLmdldCgnc2xvdHMnKSBhcyBZQXJyYXk8WU1hcDxhbnk+PlxuICAgIGNvbnN0IHNsb3RzOiBTbG90W10gPSBbXVxuICAgIHNoYXJlZFNsb3RzLmZvckVhY2goc2hhcmVkU2xvdCA9PiB7XG4gICAgICBjb25zdCBzbG90ID0gdGhpcy5jcmVhdGVTbG90QnlTaGFyZWRTbG90KHNoYXJlZFNsb3QpXG4gICAgICBzbG90cy5wdXNoKHNsb3QpXG4gICAgfSlcbiAgICBjb25zdCBuYW1lID0geU1hcC5nZXQoJ25hbWUnKVxuICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy50cmFuc2xhdG9yLmNyZWF0ZUNvbXBvbmVudEJ5RGF0YShuYW1lLCB7XG4gICAgICBzdGF0ZTogeU1hcC5nZXQoJ3N0YXRlJyksXG4gICAgICBzbG90c1xuICAgIH0pXG4gICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICBpbnN0YW5jZS5zbG90cy50b0FycmF5KCkuZm9yRWFjaCgoc2xvdCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3Qgc2hhcmVkU2xvdCA9IHNoYXJlZFNsb3RzLmdldChpbmRleClcbiAgICAgICAgdGhpcy5zeW5jU2xvdChzaGFyZWRTbG90LCBzbG90KVxuICAgICAgICB0aGlzLnN5bmNDb250ZW50KHNoYXJlZFNsb3QuZ2V0KCdjb250ZW50JyksIHNsb3QpXG4gICAgICB9KVxuICAgICAgcmV0dXJuIGluc3RhbmNlXG4gICAgfVxuICAgIHRocm93IGNvbGxhYm9yYXRlRXJyb3JGbihgY2Fubm90IGZpbmQgY29tcG9uZW50IGZhY3RvcnkgXFxgJHtuYW1lfVxcYC5gKVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTbG90QnlTaGFyZWRTbG90KHNoYXJlZFNsb3Q6IFlNYXA8YW55Pik6IFNsb3Qge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBzaGFyZWRTbG90LmdldCgnY29udGVudCcpIGFzIFlUZXh0XG4gICAgY29uc3QgZGVsdGEgPSBjb250ZW50LnRvRGVsdGEoKVxuXG4gICAgY29uc3Qgc2xvdCA9IHRoaXMudHJhbnNsYXRvci5jcmVhdGVTbG90KHtcbiAgICAgIHNjaGVtYTogc2hhcmVkU2xvdC5nZXQoJ3NjaGVtYScpLFxuICAgICAgc3RhdGU6IHNoYXJlZFNsb3QuZ2V0KCdzdGF0ZScpLFxuICAgICAgZm9ybWF0czoge30sXG4gICAgICBjb250ZW50OiBbXVxuICAgIH0pXG5cbiAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiBkZWx0YSkge1xuICAgICAgaWYgKGFjdGlvbi5pbnNlcnQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb24uaW5zZXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHNsb3QuaW5zZXJ0KGFjdGlvbi5pbnNlcnQsIG1ha2VGb3JtYXRzKHRoaXMucmVnaXN0cnksIGFjdGlvbi5hdHRyaWJ1dGVzKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBzaGFyZWRDb21wb25lbnQgPSBhY3Rpb24uaW5zZXJ0IGFzIFlNYXA8YW55PlxuICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY3JlYXRlQ29tcG9uZW50QnlTaGFyZWRDb21wb25lbnQoc2hhcmVkQ29tcG9uZW50KVxuICAgICAgICAgIHNsb3QuaW5zZXJ0KGNvbXBvbmVudClcbiAgICAgICAgICB0aGlzLnN5bmNTbG90cyhzaGFyZWRDb21wb25lbnQuZ2V0KCdzbG90cycpLCBjb21wb25lbnQpXG4gICAgICAgICAgdGhpcy5zeW5jQ29tcG9uZW50KHNoYXJlZENvbXBvbmVudCwgY29tcG9uZW50KVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBjb2xsYWJvcmF0ZUVycm9yRm4oJ3VuZXhwZWN0ZWQgZGVsdGEgYWN0aW9uLicpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzbG90XG4gIH1cblxuICBwcml2YXRlIGNsZWFuU3Vic2NyaXB0aW9uc0J5U2xvdChzbG90OiBTbG90KSB7XG4gICAgW3RoaXMuY29udGVudFN5bmNDYWNoZXMuZ2V0KHNsb3QpLCB0aGlzLnNsb3RTdGF0ZVN5bmNDYWNoZXMuZ2V0KHNsb3QpXS5mb3JFYWNoKGZuID0+IHtcbiAgICAgIGlmIChmbikge1xuICAgICAgICBmbigpXG4gICAgICB9XG4gICAgfSlcbiAgICBzbG90LnNsaWNlQ29udGVudCgpLmZvckVhY2goaSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGkgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuY2xlYW5TdWJzY3JpcHRpb25zQnlDb21wb25lbnQoaSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBjbGVhblN1YnNjcmlwdGlvbnNCeUNvbXBvbmVudChjb21wb25lbnQ6IENvbXBvbmVudEluc3RhbmNlKSB7XG4gICAgW3RoaXMuc2xvdHNTeW5jQ2FjaGVzLmdldChjb21wb25lbnQpLCB0aGlzLmNvbXBvbmVudFN0YXRlU3luY0NhY2hlcy5nZXQoY29tcG9uZW50KV0uZm9yRWFjaChmbiA9PiB7XG4gICAgICBpZiAoZm4pIHtcbiAgICAgICAgZm4oKVxuICAgICAgfVxuICAgIH0pXG4gICAgY29tcG9uZW50LnNsb3RzLnRvQXJyYXkoKS5mb3JFYWNoKHNsb3QgPT4ge1xuICAgICAgdGhpcy5jbGVhblN1YnNjcmlwdGlvbnNCeVNsb3Qoc2xvdClcbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIG1ha2VGb3JtYXRzKHJlZ2lzdHJ5OiBSZWdpc3RyeSwgYXR0cnM/OiBhbnkpIHtcbiAgY29uc3QgZm9ybWF0czogRm9ybWF0cyA9IFtdXG4gIGlmIChhdHRycykge1xuICAgIE9iamVjdC5rZXlzKGF0dHJzKS5tYXAoa2V5ID0+IHtcbiAgICAgIGNvbnN0IGZvcm1hdHRlciA9IHJlZ2lzdHJ5LmdldEZvcm1hdHRlcihrZXkpXG4gICAgICBpZiAoZm9ybWF0dGVyKSB7XG4gICAgICAgIGZvcm1hdHMucHVzaChbZm9ybWF0dGVyLCBhdHRyc1trZXldXSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIHJldHVybiBmb3JtYXRzXG59XG4iXX0=
644
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGFib3JhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29sbGFib3JhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDOUMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFjLE9BQU8sRUFBZ0IsTUFBTSxlQUFlLENBQUE7QUFDckYsT0FBTyxFQUNMLFlBQVksRUFFWixXQUFXLEVBQUUsVUFBVSxFQUVkLGtCQUFrQixFQUMzQixTQUFTLEVBQ1QsUUFBUSxFQUNSLGdCQUFnQixFQUNoQixTQUFTLEVBQ1QsU0FBUyxFQUVULElBQUksRUFDSixPQUFPLEVBQ1AsVUFBVSxFQUNYLE1BQU0sZUFBZSxDQUFBO0FBQ3RCLE9BQU8sRUFDTCxLQUFLLElBQUksTUFBTSxFQUNmLEdBQUcsSUFBSSxJQUFJLEVBQ1gsR0FBRyxJQUFJLElBQUksRUFFWCxJQUFJLElBQUksS0FBSyxFQUViLFdBQVcsRUFDWCwwQ0FBMEMsRUFDMUMsbUNBQW1DLEVBQ3BDLE1BQU0sS0FBSyxDQUFBO0FBRVosT0FBTyxFQUFFLGlCQUFpQixFQUFtQixNQUFNLHNCQUFzQixDQUFBO0FBQ3pFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBRTVELE1BQU0sa0JBQWtCLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFBO0FBT25ELE1BQU0sVUFBVTtJQUFoQjtRQUNVLG9CQUFlLEdBQUcsSUFBSSxPQUFPLEVBQWUsQ0FBQTtRQUM1QyxvQkFBZSxHQUFHLElBQUksT0FBTyxFQUFlLENBQUE7SUFzQ3RELENBQUM7SUFsQ0MsR0FBRyxDQUFDLEdBQVEsRUFBRSxLQUFVO1FBQ3RCLElBQUksR0FBRyxZQUFZLElBQUksRUFBRTtZQUN2QixJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVB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LE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDNUMsSUFBSSxTQUFTLEVBQUU7Z0JBQ2IsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFBO2FBQ3RDO1FBQ0gsQ0FBQyxDQUFDLENBQUE7S0FDSDtJQUNELE9BQU8sT0FBTyxDQUFBO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAdGFuYm8vZGknXG5pbXBvcnQgeyBkZWxheSwgZmlsdGVyLCBtYXAsIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ0B0YW5iby9zdHJlYW0nXG5pbXBvcnQge1xuICBDaGFuZ2VPcmlnaW4sXG4gIENvbXBvbmVudEluc3RhbmNlLFxuICBDb250ZW50VHlwZSwgQ29udHJvbGxlcixcbiAgRm9ybWF0cyxcbiAgSGlzdG9yeSwgSElTVE9SWV9TVEFDS19TSVpFLFxuICBtYWtlRXJyb3IsXG4gIFJlZ2lzdHJ5LFxuICBSb290Q29tcG9uZW50UmVmLFxuICBTY2hlZHVsZXIsXG4gIFNlbGVjdGlvbixcbiAgU2VsZWN0aW9uUGF0aHMsXG4gIFNsb3QsXG4gIFN0YXJ0ZXIsXG4gIFRyYW5zbGF0b3Jcbn0gZnJvbSAnQHRleHRidXMvY29yZSdcbmltcG9ydCB7XG4gIEFycmF5IGFzIFlBcnJheSxcbiAgRG9jIGFzIFlEb2MsXG4gIE1hcCBhcyBZTWFwLFxuICBSZWxhdGl2ZVBvc2l0aW9uLFxuICBUZXh0IGFzIFlUZXh0LFxuICBUcmFuc2FjdGlvbixcbiAgVW5kb01hbmFnZXIsXG4gIGNyZWF0ZUFic29sdXRlUG9zaXRpb25Gcm9tUmVsYXRpdmVQb3NpdGlvbixcbiAgY3JlYXRlUmVsYXRpdmVQb3NpdGlvbkZyb21UeXBlSW5kZXhcbn0gZnJvbSAneWpzJ1xuXG5pbXBvcnQgeyBDb2xsYWJvcmF0ZUN1cnNvciwgUmVtb3RlU2VsZWN0aW9uIH0gZnJvbSAnLi9jb2xsYWJvcmF0ZS1jdXJzb3InXG5pbXBvcnQgeyBjcmVhdGVVbmtub3duQ29tcG9uZW50IH0gZnJvbSAnLi91bmtub3duLmNvbXBvbmVudCdcblxuY29uc3QgY29sbGFib3JhdGVFcnJvckZuID0gbWFrZUVycm9yKCdDb2xsYWJvcmF0ZScpXG5cbmludGVyZmFjZSBDdXJzb3JQb3NpdGlvbiB7XG4gIGFuY2hvcjogUmVsYXRpdmVQb3NpdGlvblxuICBmb2N1czogUmVsYXRpdmVQb3NpdGlvblxufVxuXG5jbGFzcyBDb250ZW50TWFwIHtcbiAgcHJpdmF0ZSBzbG90QW5kWVRleHRNYXAgPSBuZXcgV2Vha01hcDxTbG90LCBZVGV4dD4oKVxuICBwcml2YXRlIHlUZXh0QW5kU0xvdE1hcCA9IG5ldyBXZWFrTWFwPFlUZXh0LCBTbG90PigpXG5cbiAgc2V0KGtleTogU2xvdCwgdmFsdWU6IFlUZXh0KTogdm9pZFxuICBzZXQoa2V5OiBZVGV4dCwgdmFsdWU6IFNsb3QpOiB2b2lkXG4gIHNldChrZXk6IGFueSwgdmFsdWU6IGFueSkge1xuICAgIGlmIChrZXkgaW5zdGFuY2VvZiBTbG90KSB7XG4gICAgICB0aGlzLnNsb3RBbmRZVGV4dE1hcC5zZXQoa2V5LCB2YWx1ZSlcbiAgICAgIHRoaXMueVRleHRBbmRTTG90TWFwLnNldCh2YWx1ZSwga2V5KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNsb3RBbmRZVGV4dE1hcC5zZXQodmFsdWUsIGtleSlcbiAgICAgIHRoaXMueVRleHRBbmRTTG90TWFwLnNldChrZXksIHZhbHVlKVxuICAgIH1cbiAgfVxuXG4gIGdldChrZXk6IFNsb3QpOiBZVGV4dCB8IG51bGxcbiAgZ2V0KGtleTogWVRleHQpOiBTbG90IHwgbnVsbFxuICBnZXQoa2V5OiBhbnkpIHtcbiAgICBpZiAoa2V5IGluc3RhbmNlb2YgU2xvdCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2xvdEFuZFlUZXh0TWFwLmdldChrZXkpIHx8IG51bGxcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMueVRleHRBbmRTTG90TWFwLmdldChrZXkpIHx8IG51bGxcbiAgfVxuXG4gIGRlbGV0ZShrZXk6IFNsb3QgfCBZVGV4dCkge1xuICAgIGlmIChrZXkgaW5zdGFuY2VvZiBTbG90KSB7XG4gICAgICBjb25zdCB2ID0gdGhpcy5zbG90QW5kWVRleHRNYXAuZ2V0KGtleSlcbiAgICAgIHRoaXMuc2xvdEFuZFlUZXh0TWFwLmRlbGV0ZShrZXkpXG4gICAgICBpZiAodikge1xuICAgICAgICB0aGlzLnlUZXh0QW5kU0xvdE1hcC5kZWxldGUodilcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdiA9IHRoaXMueVRleHRBbmRTTG90TWFwLmdldChrZXkpXG4gICAgICB0aGlzLnlUZXh0QW5kU0xvdE1hcC5kZWxldGUoa2V5KVxuICAgICAgaWYgKHYpIHtcbiAgICAgICAgdGhpcy5zbG90QW5kWVRleHRNYXAuZGVsZXRlKHYpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDb2xsYWJvcmF0ZSBpbXBsZW1lbnRzIEhpc3Rvcnkge1xuICBvblNlbGVjdGlvbkNoYW5nZTogT2JzZXJ2YWJsZTxTZWxlY3Rpb25QYXRocz5cbiAgeURvYyA9IG5ldyBZRG9jKClcbiAgb25CYWNrOiBPYnNlcnZhYmxlPHZvaWQ+XG4gIG9uRm9yd2FyZDogT2JzZXJ2YWJsZTx2b2lkPlxuICBvbkNoYW5nZTogT2JzZXJ2YWJsZTxhbnk+XG4gIG9uUHVzaDogT2JzZXJ2YWJsZTx2b2lkPlxuXG4gIGdldCBjYW5CYWNrKCkge1xuICAgIHJldHVybiB0aGlzLm1hbmFnZXI/LmNhblVuZG8oKSB8fCBmYWxzZVxuICB9XG5cbiAgZ2V0IGNhbkZvcndhcmQoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFuYWdlcj8uY2FuUmVkbygpIHx8IGZhbHNlXG4gIH1cblxuICBwcml2YXRlIGJhY2tFdmVudCA9IG5ldyBTdWJqZWN0PHZvaWQ+KClcbiAgcHJpdmF0ZSBmb3J3YXJkRXZlbnQgPSBuZXcgU3ViamVjdDx2b2lkPigpXG4gIHByaXZhdGUgY2hhbmdlRXZlbnQgPSBuZXcgU3ViamVjdDx2b2lkPigpXG4gIHByaXZhdGUgcHVzaEV2ZW50ID0gbmV3IFN1YmplY3Q8dm9pZD4oKVxuXG4gIHByaXZhdGUgbWFuYWdlcjogVW5kb01hbmFnZXIgfCBudWxsID0gbnVsbFxuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXVxuICBwcml2YXRlIHVwZGF0ZUZyb21SZW1vdGUgPSBmYWxzZVxuXG4gIHByaXZhdGUgY29udGVudFN5bmNDYWNoZXMgPSBuZXcgV2Vha01hcDxTbG90LCAoKSA9PiB2b2lkPigpXG4gIHByaXZhdGUgc2xvdFN0YXRlU3luY0NhY2hlcyA9IG5ldyBXZWFrTWFwPFNsb3QsICgpID0+IHZvaWQ+KClcbiAgcHJpdmF0ZSBzbG90c1N5bmNDYWNoZXMgPSBuZXcgV2Vha01hcDxDb21wb25lbnRJbnN0YW5jZSwgKCkgPT4gdm9pZD4oKVxuICBwcml2YXRlIGNvbXBvbmVudFN0YXRlU3luY0NhY2hlcyA9IG5ldyBXZWFrTWFwPENvbXBvbmVudEluc3RhbmNlLCAoKSA9PiB2b2lkPigpXG5cbiAgcHJpdmF0ZSBzZWxlY3Rpb25DaGFuZ2VFdmVudCA9IG5ldyBTdWJqZWN0PFNlbGVjdGlvblBhdGhzPigpXG4gIHByaXZhdGUgY29udGVudE1hcCA9IG5ldyBDb250ZW50TWFwKClcblxuICBwcml2YXRlIHVwZGF0ZVJlbW90ZUFjdGlvbnM6IEFycmF5PCgpID0+IHZvaWQ+ID0gW11cblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KEhJU1RPUllfU1RBQ0tfU0laRSkgcHJpdmF0ZSBzdGFja1NpemU6IG51bWJlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSByb290Q29tcG9uZW50UmVmOiBSb290Q29tcG9uZW50UmVmLFxuICAgICAgICAgICAgICBwcml2YXRlIGNvbGxhYm9yYXRlQ3Vyc29yOiBDb2xsYWJvcmF0ZUN1cnNvcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBjb250cm9sbGVyOiBDb250cm9sbGVyLFxuICAgICAgICAgICAgICBwcml2YXRlIHNjaGVkdWxlcjogU2NoZWR1bGVyLFxuICAgICAgICAgICAgICBwcml2YXRlIHRyYW5zbGF0b3I6IFRyYW5zbGF0b3IsXG4gICAgICAgICAgICAgIHByaXZhdGUgcmVnaXN0cnk6IFJlZ2lzdHJ5LFxuICAgICAgICAgICAgICBwcml2YXRlIHNlbGVjdGlvbjogU2VsZWN0aW9uLFxuICAgICAgICAgICAgICBwcml2YXRlIHN0YXJ0ZXI6IFN0YXJ0ZXIpIHtcbiAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlID0gdGhpcy5zZWxlY3Rpb25DaGFuZ2VFdmVudC5hc09ic2VydmFibGUoKS5waXBlKGRlbGF5KCkpXG4gICAgdGhpcy5vbkJhY2sgPSB0aGlzLmJhY2tFdmVudC5hc09ic2VydmFibGUoKVxuICAgIHRoaXMub25Gb3J3YXJkID0gdGhpcy5mb3J3YXJkRXZlbnQuYXNPYnNlcnZhYmxlKClcbiAgICB0aGlzLm9uQ2hhbmdlID0gdGhpcy5jaGFuZ2VFdmVudC5hc09ic2VydmFibGUoKVxuICAgIHRoaXMub25QdXNoID0gdGhpcy5wdXNoRXZlbnQuYXNPYnNlcnZhYmxlKClcbiAgfVxuXG4gIHNldHVwKCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5zZWxlY3Rpb24ub25DaGFuZ2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgY29uc3QgcGF0aHMgPSB0aGlzLnNlbGVjdGlvbi5nZXRQYXRocygpXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlRXZlbnQubmV4dChwYXRocylcbiAgICAgIH0pXG4gICAgKVxuICAgIHRoaXMuc3luY1Jvb3RDb21wb25lbnQoKVxuICB9XG5cbiAgdXBkYXRlUmVtb3RlU2VsZWN0aW9uKHBhdGhzOiBSZW1vdGVTZWxlY3Rpb25bXSkge1xuICAgIHRoaXMuY29sbGFib3JhdGVDdXJzb3IuZHJhdyhwYXRocylcbiAgfVxuXG4gIGxpc3RlbigpIHtcbiAgICAvL1xuICB9XG5cbiAgYmFjaygpIHtcbiAgICBpZiAodGhpcy5jYW5CYWNrKSB7XG4gICAgICB0aGlzLm1hbmFnZXI/LnVuZG8oKVxuICAgICAgdGhpcy5iYWNrRXZlbnQubmV4dCgpXG4gICAgfVxuICB9XG5cbiAgZm9yd2FyZCgpIHtcbiAgICBpZiAodGhpcy5jYW5Gb3J3YXJkKSB7XG4gICAgICB0aGlzLm1hbmFnZXI/LnJlZG8oKVxuICAgICAgdGhpcy5mb3J3YXJkRXZlbnQubmV4dCgpXG4gICAgfVxuICB9XG5cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy5tYW5hZ2VyPy5jbGVhcigpXG4gICAgdGhpcy5jaGFuZ2VFdmVudC5uZXh0KClcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goaSA9PiBpLnVuc3Vic2NyaWJlKCkpXG4gICAgdGhpcy5jb2xsYWJvcmF0ZUN1cnNvci5kZXN0cm95KClcbiAgICB0aGlzLm1hbmFnZXI/LmRlc3Ryb3koKVxuICB9XG5cbiAgcHJpdmF0ZSBzeW5jUm9vdENvbXBvbmVudCgpIHtcbiAgICBjb25zdCByb290ID0gdGhpcy55RG9jLmdldE1hcCgnUm9vdENvbXBvbmVudCcpXG4gICAgY29uc3Qgcm9vdENvbXBvbmVudCA9IHRoaXMucm9vdENvbXBvbmVudFJlZi5jb21wb25lbnQhXG4gICAgdGhpcy5tYW5hZ2VyID0gbmV3IFVuZG9NYW5hZ2VyKHJvb3QsIHtcbiAgICAgIHRyYWNrZWRPcmlnaW5zOiBuZXcgU2V0PGFueT4oW3RoaXMueURvY10pXG4gICAgfSlcbiAgICBjb25zdCBjdXJzb3JLZXkgPSAnY3Vyc29yLXBvc2l0aW9uJ1xuICAgIHRoaXMubWFuYWdlci5vbignc3RhY2staXRlbS1hZGRlZCcsIGV2ZW50ID0+IHtcbiAgICAgIGV2ZW50LnN0YWNrSXRlbS5tZXRhLnNldChjdXJzb3JLZXksIHRoaXMuZ2V0UmVsYXRpdmVDdXJzb3JMb2NhdGlvbigpKVxuICAgICAgaWYgKHRoaXMubWFuYWdlciEudW5kb1N0YWNrLmxlbmd0aCA+IHRoaXMuc3RhY2tTaXplKSB7XG4gICAgICAgIHRoaXMubWFuYWdlciEudW5kb1N0YWNrLnNoaWZ0KClcbiAgICAgIH1cbiAgICAgIGlmIChldmVudC5vcmlnaW4gPT09IHRoaXMueURvYykge1xuICAgICAgICB0aGlzLnB1c2hFdmVudC5uZXh0KClcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hhbmdlRXZlbnQubmV4dCgpXG4gICAgfSlcbiAgICB0aGlzLm1hbmFnZXIub24oJ3N0YWNrLWl0ZW0tcG9wcGVkJywgZXZlbnQgPT4ge1xuICAgICAgY29uc3QgcG9zaXRpb24gPSBldmVudC5zdGFja0l0ZW0ubWV0YS5nZXQoY3Vyc29yS2V5KSBhcyBDdXJzb3JQb3NpdGlvblxuICAgICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICAgIHRoaXMucmVzdG9yZUN1cnNvckxvY2F0aW9uKHBvc2l0aW9uKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICB0aGlzLnlEb2Mub25jZSgndXBkYXRlJywgKCkgPT4ge1xuICAgICAgbGV0IHNsb3RzID0gcm9vdC5nZXQoJ3Nsb3RzJykgYXMgWUFycmF5PFlNYXA8YW55Pj5cbiAgICAgIGlmICghc2xvdHMpIHtcbiAgICAgICAgc2xvdHMgPSBuZXcgWUFycmF5KClcbiAgICAgICAgcm9vdENvbXBvbmVudC5zbG90cy50b0FycmF5KCkuZm9yRWFjaChpID0+IHtcbiAgICAgICAgICBjb25zdCBzaGFyZWRTbG90ID0gdGhpcy5jcmVhdGVTaGFyZWRTbG90QnlTbG90KGkpXG4gICAgICAgICAgc2xvdHMucHVzaChbc2hhcmVkU2xvdF0pXG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMueURvYy50cmFuc2FjdCgoKSA9PiB7XG4gICAgICAgICAgcm9vdC5zZXQoJ3N0YXRlJywgcm9vdENvbXBvbmVudC5zdGF0ZSlcbiAgICAgICAgICByb290LnNldCgnc2xvdHMnLCBzbG90cylcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSBpZiAoc2xvdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJvb3RDb21wb25lbnQudXBkYXRlU3RhdGUoKCkgPT4ge1xuICAgICAgICAgIHJldHVybiByb290LmdldCgnc3RhdGUnKVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLnlEb2MudHJhbnNhY3QoKCkgPT4ge1xuICAgICAgICAgIHJvb3RDb21wb25lbnQuc2xvdHMudG9BcnJheSgpLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzaGFyZWRTbG90ID0gdGhpcy5jcmVhdGVTaGFyZWRTbG90QnlTbG90KGkpXG4gICAgICAgICAgICBzbG90cy5wdXNoKFtzaGFyZWRTbG90XSlcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcm9vdENvbXBvbmVudC51cGRhdGVTdGF0ZSgoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJvb3QuZ2V0KCdzdGF0ZScpXG4gICAgICAgIH0pXG4gICAgICAgIHJvb3RDb21wb25lbnQuc2xvdHMuY2xlYW4oKVxuICAgICAgICBzbG90cy5mb3JFYWNoKHNoYXJlZFNsb3QgPT4ge1xuICAgICAgICAgIGNvbnN0IHNsb3QgPSB0aGlzLmNyZWF0ZVNsb3RCeVNoYXJlZFNsb3Qoc2hhcmVkU2xvdClcbiAgICAgICAgICB0aGlzLnN5bmNDb250ZW50KHNoYXJlZFNsb3QuZ2V0KCdjb250ZW50JyksIHNsb3QpXG4gICAgICAgICAgdGhpcy5zeW5jU2xvdChzaGFyZWRTbG90LCBzbG90KVxuICAgICAgICAgIHJvb3RDb21wb25lbnQuc2xvdHMuaW5zZXJ0KHNsb3QpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICB0aGlzLnN5bmNDb21wb25lbnQocm9vdCwgcm9vdENvbXBvbmVudClcbiAgICAgIHRoaXMuc3luY1Nsb3RzKHNsb3RzLCByb290Q29tcG9uZW50KVxuICAgIH0pXG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuc2NoZWR1bGVyLm9uRG9jQ2hhbmdlZC5waXBlKFxuICAgICAgICBtYXAoaXRlbSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGl0ZW0uZmlsdGVyKGkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGkuZnJvbSAhPT0gQ2hhbmdlT3JpZ2luLlJlbW90ZVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pLFxuICAgICAgICBmaWx0ZXIoaXRlbSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGl0ZW0ubGVuZ3RoXG4gICAgICAgIH0pXG4gICAgICApLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMueURvYy50cmFuc2FjdCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy51cGRhdGVSZW1vdGVBY3Rpb25zLmZvckVhY2goZm4gPT4ge1xuICAgICAgICAgICAgZm4oKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgdGhpcy51cGRhdGVSZW1vdGVBY3Rpb25zID0gW11cbiAgICAgICAgfSwgdGhpcy55RG9jKVxuICAgICAgfSlcbiAgICApXG4gIH1cblxuICBwcml2YXRlIHJlc3RvcmVDdXJzb3JMb2NhdGlvbihwb3NpdGlvbjogQ3Vyc29yUG9zaXRpb24pIHtcbiAgICBjb25zdCBhbmNob3JQb3NpdGlvbiA9IGNyZWF0ZUFic29sdXRlUG9zaXRpb25Gcm9tUmVsYXRpdmVQb3NpdGlvbihwb3NpdGlvbi5hbmNob3IsIHRoaXMueURvYylcbiAgICBjb25zdCBmb2N1c1Bvc2l0aW9uID0gY3JlYXRlQWJzb2x1dGVQb3NpdGlvbkZyb21SZWxhdGl2ZVBvc2l0aW9uKHBvc2l0aW9uLmZvY3VzLCB0aGlzLnlEb2MpXG4gICAgaWYgKGFuY2hvclBvc2l0aW9uICYmIGZvY3VzUG9zaXRpb24pIHtcbiAgICAgIGNvbnN0IGZvY3VzU2xvdCA9IHRoaXMuY29udGVudE1hcC5nZXQoZm9jdXNQb3NpdGlvbi50eXBlIGFzIFlUZXh0KVxuICAgICAgY29uc3QgYW5jaG9yU2xvdCA9IHRoaXMuY29udGVudE1hcC5nZXQoYW5jaG9yUG9zaXRpb24udHlwZSBhcyBZVGV4dClcbiAgICAgIGlmIChmb2N1c1Nsb3QgJiYgYW5jaG9yU2xvdCkge1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZXRCYXNlQW5kRXh0ZW50KGFuY2hvclNsb3QsIGFuY2hvclBvc2l0aW9uLmluZGV4LCBmb2N1c1Nsb3QsIGZvY3VzUG9zaXRpb24uaW5kZXgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRSZWxhdGl2ZUN1cnNvckxvY2F0aW9uKCk6IEN1cnNvclBvc2l0aW9uIHwgbnVsbCB7XG4gICAgY29uc3QgeyBhbmNob3JTbG90LCBhbmNob3JPZmZzZXQsIGZvY3VzU2xvdCwgZm9jdXNPZmZzZXQgfSA9IHRoaXMuc2VsZWN0aW9uXG4gICAgaWYgKGFuY2hvclNsb3QpIHtcbiAgICAgIGNvbnN0IGFuY2hvcllUZXh0ID0gdGhpcy5jb250ZW50TWFwLmdldChhbmNob3JTbG90KVxuICAgICAgaWYgKGFuY2hvcllUZXh0KSB7XG4gICAgICAgIGNvbnN0IGFuY2hvclBvc2l0aW9uID0gY3JlYXRlUmVsYXRpdmVQb3NpdGlvbkZyb21UeXBlSW5kZXgoYW5jaG9yWVRleHQsIGFuY2hvck9mZnNldCEpXG4gICAgICAgIGlmIChmb2N1c1Nsb3QpIHtcbiAgICAgICAgICBjb25zdCBmb2N1c1lUZXh0ID0gdGhpcy5jb250ZW50TWFwLmdldChmb2N1c1Nsb3QpXG4gICAgICAgICAgaWYgKGZvY3VzWVRleHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvY3VzUG9zaXRpb24gPSBjcmVhdGVSZWxhdGl2ZVBvc2l0aW9uRnJvbVR5cGVJbmRleChmb2N1c1lUZXh0LCBmb2N1c09mZnNldCEpXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBmb2N1czogZm9jdXNQb3NpdGlvbixcbiAgICAgICAgICAgICAgYW5jaG9yOiBhbmNob3JQb3NpdGlvblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgcHJpdmF0ZSBzeW5jQ29udGVudChjb250ZW50OiBZVGV4dCwgc2xvdDogU2xvdCkge1xuICAgIHRoaXMuY29udGVudE1hcC5zZXQoc2xvdCwgY29udGVudClcbiAgICBjb25zdCBzeW5jUmVtb3RlID0gKGV2LCB0cikgPT4ge1xuICAgICAgdGhpcy5ydW5SZW1vdGVVcGRhdGUodHIsICgpID0+IHtcbiAgICAgICAgc2xvdC5yZXRhaW4oMClcbiAgICAgICAgZXYuZGVsdGEuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgICAgICAgIGlmIChSZWZsZWN0LmhhcyhhY3Rpb24sICdyZXRhaW4nKSkge1xuICAgICAgICAgICAgaWYgKGFjdGlvbi5hdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZvcm1hdHMgPSBtYWtlRm9ybWF0cyh0aGlzLnJlZ2lzdHJ5LCBhY3Rpb24uYXR0cmlidXRlcylcbiAgICAgICAgICAgICAgaWYgKGZvcm1hdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgc2xvdC5yZXRhaW4oYWN0aW9uLnJldGFpbiEsIGZvcm1hdHMpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNsb3QucmV0YWluKGFjdGlvbi5yZXRhaW4pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uaW5zZXJ0KSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHNsb3QuaW5kZXhcbiAgICAgICAgICAgIGxldCBsZW5ndGggPSAxXG4gICAgICAgICAgICBpZiAodHlwZW9mIGFjdGlvbi5pbnNlcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgIGxlbmd0aCA9IGFjdGlvbi5pbnNlcnQubGVuZ3RoXG4gICAgICAgICAgICAgIHNsb3QuaW5zZXJ0KGFjdGlvbi5pbnNlcnQsIG1ha2VGb3JtYXRzKHRoaXMucmVnaXN0cnksIGFjdGlvbi5hdHRyaWJ1dGVzKSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IHNoYXJlZENvbXBvbmVudCA9IGFjdGlvbi5pbnNlcnQgYXMgWU1hcDxhbnk+XG4gICAgICAgICAgICAgIGNvbnN0IGNhbkluc2VydElubGluZUNvbXBvbmVudCA9IHNsb3Quc2NoZW1hLmluY2x1ZGVzKENvbnRlbnRUeXBlLklubGluZUNvbXBvbmVudClcbiAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jcmVhdGVDb21wb25lbnRCeVNoYXJlZENvbXBvbmVudChzaGFyZWRDb21wb25lbnQsIGNhbkluc2VydElubGluZUNvbXBvbmVudClcbiAgICAgICAgICAgICAgdGhpcy5zeW5jU2xvdHMoc2hhcmVkQ29tcG9uZW50LmdldCgnc2xvdHMnKSwgY29tcG9uZW50KVxuICAgICAgICAgICAgICB0aGlzLnN5bmNDb21wb25lbnQoc2hhcmVkQ29tcG9uZW50LCBjb21wb25lbnQpXG4gICAgICAgICAgICAgIHNsb3QuaW5zZXJ0KGNvbXBvbmVudClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbi5pc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICAgIGlmIChzbG90ID09PSB0aGlzLnNlbGVjdGlvbi5hbmNob3JTbG90ICYmIHRoaXMuc2VsZWN0aW9uLmFuY2hvck9mZnNldCEgPiBpbmRleCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNldEFuY2hvcihzbG90LCB0aGlzLnNlbGVjdGlvbi5hbmNob3JPZmZzZXQhICsgbGVuZ3RoKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzbG90ID09PSB0aGlzLnNlbGVjdGlvbi5mb2N1c1Nsb3QgJiYgdGhpcy5zZWxlY3Rpb24uZm9jdXNPZmZzZXQhID4gaW5kZXgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZXRGb2N1cyhzbG90LCB0aGlzLnNlbGVjdGlvbi5mb2N1c09mZnNldCEgKyBsZW5ndGgpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5kZWxldGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc2xvdC5pbmRleFxuICAgICAgICAgICAgc2xvdC5yZXRhaW4oc2xvdC5pbmRleClcbiAgICAgICAgICAgIHNsb3QuZGVsZXRlKGFjdGlvbi5kZWxldGUpXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24uaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgICBpZiAoc2xvdCA9PT0gdGhpcy5zZWxlY3Rpb24uYW5jaG9yU2xvdCAmJiB0aGlzLnNlbGVjdGlvbi5hbmNob3JPZmZzZXQhID49IGluZGV4KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2V0QW5jaG9yKHNsb3QsIHRoaXMuc2VsZWN0aW9uLnN0YXJ0T2Zmc2V0ISAtIGFjdGlvbi5kZWxldGUpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHNsb3QgPT09IHRoaXMuc2VsZWN0aW9uLmZvY3VzU2xvdCAmJiB0aGlzLnNlbGVjdGlvbi5mb2N1c09mZnNldCEgPj0gaW5kZXgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZXRGb2N1cyhzbG90LCB0aGlzLnNlbGVjdGlvbi5mb2N1c09mZnNldCEgLSBhY3Rpb24uZGVsZXRlKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uYXR0cmlidXRlcykge1xuICAgICAgICAgICAgc2xvdC51cGRhdGVTdGF0ZShkcmFmdCA9PiB7XG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZHJhZnQsIGFjdGlvbi5hdHRyaWJ1dGVzKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH1cbiAgICBjb250ZW50Lm9ic2VydmUoc3luY1JlbW90ZSlcblxuICAgIGNvbnN0IHN1YiA9IHNsb3Qub25Db250ZW50Q2hhbmdlLnN1YnNjcmliZShhY3Rpb25zID0+IHtcbiAgICAgIHRoaXMucnVuTG9jYWxVcGRhdGUoKCkgPT4ge1xuICAgICAgICBsZXQgb2Zmc2V0ID0gMFxuICAgICAgICBsZXQgbGVuZ3RoID0gMFxuICAgICAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiBhY3Rpb25zKSB7XG4gICAgICAgICAgaWYgKGFjdGlvbi50eXBlID09PSAncmV0YWluJykge1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0cyA9IGFjdGlvbi5mb3JtYXRzXG4gICAgICAgICAgICBpZiAoZm9ybWF0cykge1xuICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZm9ybWF0cylcbiAgICAgICAgICAgICAgbGV0IGxlbmd0aCA9IGtleXMubGVuZ3RoXG4gICAgICAgICAgICAgIGtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5yZWdpc3RyeS5nZXRGb3JtYXR0ZXIoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgbGVuZ3RoLS1cbiAgICAgICAgICAgICAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoZm9ybWF0cywga2V5KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgaWYgKGxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQuZm9ybWF0KG9mZnNldCwgYWN0aW9uLm9mZnNldCwgZm9ybWF0cylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgb2Zmc2V0ID0gYWN0aW9uLm9mZnNldFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLnR5cGUgPT09ICdpbnNlcnQnKSB7XG4gICAgICAgICAgICBjb25zdCBkZWx0YSA9IGNvbnRlbnQudG9EZWx0YSgpXG4gICAgICAgICAgICBjb25zdCBpc0VtcHR5ID0gZGVsdGEubGVuZ3RoID09PSAxICYmIGRlbHRhWzBdLmluc2VydCA9PT0gU2xvdC5lbXB0eVBsYWNlaG9sZGVyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGFjdGlvbi5jb250ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICBsZW5ndGggPSBhY3Rpb24uY29udGVudC5sZW5ndGhcbiAgICAgICAgICAgICAgY29udGVudC5pbnNlcnQob2Zmc2V0LCBhY3Rpb24uY29udGVudCwgYWN0aW9uLmZvcm1hdHMgfHwge30pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsZW5ndGggPSAxXG4gICAgICAgICAgICAgIGNvbnN0IHNoYXJlZENvbXBvbmVudCA9IHRoaXMuY3JlYXRlU2hhcmVkQ29tcG9uZW50QnlDb21wb25lbnQoYWN0aW9uLnJlZiBhcyBDb21wb25lbnRJbnN0YW5jZSlcbiAgICAgICAgICAgICAgY29udGVudC5pbnNlcnRFbWJlZChvZmZzZXQsIHNoYXJlZENvbXBvbmVudClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzRW1wdHkgJiYgb2Zmc2V0ID09PSAwKSB7XG4gICAgICAgICAgICAgIGNvbnRlbnQuZGVsZXRlKGNvbnRlbnQubGVuZ3RoIC0gMSwgMSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9mZnNldCArPSBsZW5ndGhcbiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi50eXBlID09PSAnZGVsZXRlJykge1xuICAgICAgICAgICAgY29uc3QgZGVsdGEgPSBjb250ZW50LnRvRGVsdGEoKVxuICAgICAgICAgICAgaWYgKGNvbnRlbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGNvbnRlbnQuZGVsZXRlKG9mZnNldCwgYWN0aW9uLmNvdW50KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbnRlbnQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgIGNvbnRlbnQuaW5zZXJ0KDAsICdcXG4nLCBkZWx0YVswXT8uYXR0cmlidXRlcylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHN1Yi5hZGQoc2xvdC5vbkNoaWxkQ29tcG9uZW50UmVtb3ZlLnN1YnNjcmliZShjb21wb25lbnRzID0+IHtcbiAgICAgIGNvbXBvbmVudHMuZm9yRWFjaChjID0+IHtcbiAgICAgICAgdGhpcy5jbGVhblN1YnNjcmlwdGlvbnNCeUNvbXBvbmVudChjKVxuICAgICAgfSlcbiAgICB9KSlcbiAgICB0aGlzLmNvbnRlbnRTeW5jQ2FjaGVzLnNldChzbG90LCAoKSA9PiB7XG4gICAgICBjb250ZW50LnVub2JzZXJ2ZShzeW5jUmVtb3RlKVxuICAgICAgc3ViLnVuc3Vic2NyaWJlKClcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBzeW5jU2xvdChyZW1vdGVTbG90OiBZTWFwPGFueT4sIHNsb3Q6IFNsb3QpIHtcbiAgICBjb25zdCBzeW5jUmVtb3RlID0gKGV2LCB0cikgPT4ge1xuICAgICAgdGhpcy5ydW5SZW1vdGVVcGRhdGUodHIsICgpID0+IHtcbiAgICAgICAgZXYua2V5c0NoYW5nZWQuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgIGlmIChrZXkgPT09ICdzdGF0ZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gKGV2LnRhcmdldCBhcyBZTWFwPGFueT4pLmdldCgnc3RhdGUnKVxuICAgICAgICAgICAgc2xvdC51cGRhdGVTdGF0ZShkcmFmdCA9PiB7XG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZHJhZnQsIHN0YXRlKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH1cbiAgICByZW1vdGVTbG90Lm9ic2VydmUoc3luY1JlbW90ZSlcblxuICAgIGNvbnN0IHN1YiA9IHNsb3Qub25TdGF0ZUNoYW5nZS5zdWJzY3JpYmUoYWN0aW9ucyA9PiB7XG4gICAgICB0aGlzLnJ1bkxvY2FsVXBkYXRlKCgpID0+IHtcbiAgICAgICAgYWN0aW9ucy5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgICAgICAgcmVtb3RlU2xvdC5zZXQoJ3N0YXRlJywgYWN0aW9uLnZhbHVlKVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuICAgIHRoaXMuc2xvdFN0YXRlU3luY0NhY2hlcy5zZXQoc2xvdCwgKCkgPT4ge1xuICAgICAgcmVtb3RlU2xvdC51bm9ic2VydmUoc3luY1JlbW90ZSlcbiAgICAgIHN1Yi51bnN1YnNjcmliZSgpXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgc3luY1Nsb3RzKHJlbW90ZVNsb3RzOiBZQXJyYXk8YW55PiwgY29tcG9uZW50OiBDb21wb25lbnRJbnN0YW5jZSkge1xuICAgIGNvbnN0IHNsb3RzID0gY29tcG9uZW50LnNsb3RzXG4gICAgY29uc3Qgc3luY1JlbW90ZSA9IChldiwgdHIpID0+IHtcbiAgICAgIHRoaXMucnVuUmVtb3RlVXBkYXRlKHRyLCAoKSA9PiB7XG4gICAgICAgIGxldCBpbmRleCA9IDBcbiAgICAgICAgZXYuZGVsdGEuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgICAgICAgIGlmIChSZWZsZWN0LmhhcyhhY3Rpb24sICdyZXRhaW4nKSkge1xuICAgICAgICAgICAgaW5kZXggKz0gYWN0aW9uLnJldGFpblxuICAgICAgICAgICAgc2xvdHMucmV0YWluKGluZGV4KVxuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmluc2VydCkge1xuICAgICAgICAgICAgKGFjdGlvbi5pbnNlcnQgYXMgQXJyYXk8WU1hcDxhbnk+PikuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qgc2xvdCA9IHRoaXMuY3JlYXRlU2xvdEJ5U2hhcmVkU2xvdChpdGVtKVxuICAgICAgICAgICAgICBzbG90cy5pbnNlcnQoc2xvdClcbiAgICAgICAgICAgICAgdGhpcy5zeW5jQ29udGVudChpdGVtLmdldCgnY29udGVudCcpLCBzbG90KVxuICAgICAgICAgICAgICB0aGlzLnN5bmNTbG90KGl0ZW0sIHNsb3QpXG4gICAgICAgICAgICAgIGluZGV4KytcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZGVsZXRlKSB7XG4gICAgICAgICAgICBzbG90cy5yZXRhaW4oaW5kZXgpXG4gICAgICAgICAgICBzbG90cy5kZWxldGUoYWN0aW9uLmRlbGV0ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH1cbiAgICByZW1vdGVTbG90cy5vYnNlcnZlKHN5bmNSZW1vdGUpXG5cbiAgICBjb25zdCBzdWIgPSBzbG90cy5vbkNoYW5nZS5zdWJzY3JpYmUob3BlcmF0aW9ucyA9PiB7XG4gICAgICB0aGlzLnJ1bkxvY2FsVXBkYXRlKCgpID0+IHtcbiAgICAgICAgY29uc3QgYXBwbHlBY3Rpb25zID0gb3BlcmF0aW9ucy5hcHBseVxuICAgICAgICBsZXQgaW5kZXg6IG51bWJlclxuICAgICAgICBhcHBseUFjdGlvbnMuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgICAgICAgIGlmIChhY3Rpb24udHlwZSA9PT0gJ3JldGFpbicpIHtcbiAgICAgICAgICAgIGluZGV4ID0gYWN0aW9uLm9mZnNldFxuICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLnR5cGUgPT09ICdpbnNlcnRTbG90Jykge1xuICAgICAgICAgICAgY29uc3Qgc2hhcmVkU2xvdCA9IHRoaXMuY3JlYXRlU2hhcmVkU2xvdEJ5U2xvdChhY3Rpb24ucmVmKVxuICAgICAgICAgICAgcmVtb3RlU2xvdHMuaW5zZXJ0KGluZGV4LCBbc2hhcmVkU2xvdF0pXG4gICAgICAgICAgICBpbmRleCsrXG4gICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24udHlwZSA9PT0gJ2RlbGV0ZScpIHtcbiAgICAgICAgICAgIHJlbW90ZVNsb3RzLmRlbGV0ZShpbmRleCwgYWN0aW9uLmNvdW50KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHN1Yi5hZGQoc2xvdHMub25DaGlsZFNsb3RSZW1vdmUuc3Vic2NyaWJlKHNsb3RzID0+IHtcbiAgICAgIHNsb3RzLmZvckVhY2goc2xvdCA9PiB7XG4gICAgICAgIHRoaXMuY2xlYW5TdWJzY3JpcHRpb25zQnlTbG90KHNsb3QpXG4gICAgICB9KVxuICAgIH0pKVxuXG4gICAgdGhpcy5zbG90c1N5bmNDYWNoZXMuc2V0KGNvbXBvbmVudCwgKCkgPT4ge1xuICAgICAgcmVtb3RlU2xvdHMudW5vYnNlcnZlKHN5bmNSZW1vdGUpXG4gICAgICBzdWIudW5zdWJzY3JpYmUoKVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIHN5bmNDb21wb25lbnQocmVtb3RlQ29tcG9uZW50OiBZTWFwPGFueT4sIGNvbXBvbmVudDogQ29tcG9uZW50SW5zdGFuY2UpIHtcbiAgICBjb25zdCBzeW5jUmVtb3RlID0gKGV2LCB0cikgPT4ge1xuICAgICAgdGhpcy5ydW5SZW1vdGVVcGRhdGUodHIsICgpID0+IHtcbiAgICAgICAgZXYua2V5c0NoYW5nZWQuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgIGlmIChrZXkgPT09ICdzdGF0ZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gKGV2LnRhcmdldCBhcyBZTWFwPGFueT4pLmdldCgnc3RhdGUnKVxuICAgICAgICAgICAgY29tcG9uZW50LnVwZGF0ZVN0YXRlKGRyYWZ0ID0+IHtcbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihkcmFmdCwgc3RhdGUpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuICAgIHJlbW90ZUNvbXBvbmVudC5vYnNlcnZlKHN5bmNSZW1vdGUpXG5cbiAgICBjb25zdCBzdWIgPSBjb21wb25lbnQub25TdGF0ZUNoYW5nZS5zdWJzY3JpYmUobmV3U3RhdGUgPT4ge1xuICAgICAgdGhpcy5ydW5Mb2NhbFVwZGF0ZSgoKSA9PiB7XG4gICAgICAgIHJlbW90ZUNvbXBvbmVudC5zZXQoJ3N0YXRlJywgbmV3U3RhdGUpXG4gICAgICB9KVxuICAgIH0pXG4gICAgdGhpcy5jb21wb25lbnRTdGF0ZVN5bmNDYWNoZXMuc2V0KGNvbXBvbmVudCwgKCkgPT4ge1xuICAgICAgcmVtb3RlQ29tcG9uZW50LnVub2JzZXJ2ZShzeW5jUmVtb3RlKVxuICAgICAgc3ViLnVuc3Vic2NyaWJlKClcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBydW5Mb2NhbFVwZGF0ZShmbjogKCkgPT4gdm9pZCkge1xuICAgIGlmICh0aGlzLnVwZGF0ZUZyb21SZW1vdGUgfHwgdGhpcy5jb250cm9sbGVyLnJlYWRvbmx5KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy51cGRhdGVSZW1vdGVBY3Rpb25zLnB1c2goZm4pXG4gIH1cblxuICBwcml2YXRlIHJ1blJlbW90ZVVwZGF0ZSh0cjogVHJhbnNhY3Rpb24sIGZuOiAoKSA9PiB2b2lkKSB7XG4gICAgaWYgKHRyLm9yaWdpbiA9PT0gdGhpcy55RG9jKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy51cGRhdGVGcm9tUmVtb3RlID0gdHJ1ZVxuICAgIGlmICh0ci5vcmlnaW4gPT09IHRoaXMubWFuYWdlcikge1xuICAgICAgdGhpcy5zY2hlZHVsZXIuaGlzdG9yeUFwcGx5VHJhbnNhY3QoZm4pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2NoZWR1bGVyLnJlbW90ZVVwZGF0ZVRyYW5zYWN0KGZuKVxuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUZyb21SZW1vdGUgPSBmYWxzZVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTaGFyZWRDb21wb25lbnRCeUNvbXBvbmVudChjb21wb25lbnQ6IENvbXBvbmVudEluc3RhbmNlKTogWU1hcDxhbnk+IHtcbiAgICBjb25zdCBzaGFyZWRDb21wb25lbnQgPSBuZXcgWU1hcCgpXG4gICAgc2hhcmVkQ29tcG9uZW50LnNldCgnc3RhdGUnLCBjb21wb25lbnQuc3RhdGUpXG4gICAgc2hhcmVkQ29tcG9uZW50LnNldCgnbmFtZScsIGNvbXBvbmVudC5uYW1lKVxuICAgIGNvbnN0IHNoYXJlZFNsb3RzID0gbmV3IFlBcnJheSgpXG4gICAgc2hhcmVkQ29tcG9uZW50LnNldCgnc2xvdHMnLCBzaGFyZWRTbG90cylcbiAgICBjb21wb25lbnQuc2xvdHMudG9BcnJheSgpLmZvckVhY2goc2xvdCA9PiB7XG4gICAgICBjb25zdCBzaGFyZWRTbG90ID0gdGhpcy5jcmVhdGVTaGFyZWRTbG90QnlTbG90KHNsb3QpXG4gICAgICBzaGFyZWRTbG90cy5wdXNoKFtzaGFyZWRTbG90XSlcbiAgICB9KVxuICAgIHRoaXMuc3luY1Nsb3RzKHNoYXJlZFNsb3RzLCBjb21wb25lbnQpXG4gICAgdGhpcy5zeW5jQ29tcG9uZW50KHNoYXJlZENvbXBvbmVudCwgY29tcG9uZW50KVxuICAgIHJldHVybiBzaGFyZWRDb21wb25lbnRcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU2hhcmVkU2xvdEJ5U2xvdChzbG90OiBTbG90KTogWU1hcDxhbnk+IHtcbiAgICBjb25zdCBzaGFyZWRTbG90ID0gbmV3IFlNYXAoKVxuICAgIHNoYXJlZFNsb3Quc2V0KCdzY2hlbWEnLCBzbG90LnNjaGVtYSlcbiAgICBzaGFyZWRTbG90LnNldCgnc3RhdGUnLCBzbG90LnN0YXRlKVxuICAgIGNvbnN0IHNoYXJlZENvbnRlbnQgPSBuZXcgWVRleHQoKVxuICAgIHNoYXJlZFNsb3Quc2V0KCdjb250ZW50Jywgc2hhcmVkQ29udGVudClcbiAgICBsZXQgb2Zmc2V0ID0gMFxuICAgIHNsb3QudG9EZWx0YSgpLmZvckVhY2goaSA9PiB7XG4gICAgICBsZXQgZm9ybWF0czogYW55ID0ge31cbiAgICAgIGlmIChpLmZvcm1hdHMpIHtcbiAgICAgICAgaS5mb3JtYXRzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgZm9ybWF0c1tpdGVtWzBdLm5hbWVdID0gaXRlbVsxXVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9ybWF0cyA9IG51bGxcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgaS5pbnNlcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHNoYXJlZENvbnRlbnQuaW5zZXJ0KG9mZnNldCwgaS5pbnNlcnQsIGZvcm1hdHMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzaGFyZWRDb21wb25lbnQgPSB0aGlzLmNyZWF0ZVNoYXJlZENvbXBvbmVudEJ5Q29tcG9uZW50KGkuaW5zZXJ0KVxuICAgICAgICBzaGFyZWRDb250ZW50Lmluc2VydEVtYmVkKG9mZnNldCwgc2hhcmVkQ29tcG9uZW50LCBmb3JtYXRzKVxuICAgICAgfVxuICAgICAgb2Zmc2V0ICs9IGkuaW5zZXJ0Lmxlbmd0aFxuICAgIH0pXG4gICAgdGhpcy5zeW5jQ29udGVudChzaGFyZWRDb250ZW50LCBzbG90KVxuICAgIHRoaXMuc3luY1Nsb3Qoc2hhcmVkU2xvdCwgc2xvdClcbiAgICByZXR1cm4gc2hhcmVkU2xvdFxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDb21wb25lbnRCeVNoYXJlZENvbXBvbmVudCh5TWFwOiBZTWFwPGFueT4sIGNhbkluc2VydElubGluZUNvbXBvbmVudDogYm9vbGVhbik6IENvbXBvbmVudEluc3RhbmNlIHtcbiAgICBjb25zdCBzaGFyZWRTbG90cyA9IHlNYXAuZ2V0KCdzbG90cycpIGFzIFlBcnJheTxZTWFwPGFueT4+XG4gICAgY29uc3Qgc2xvdHM6IFNsb3RbXSA9IFtdXG4gICAgc2hhcmVkU2xvdHMuZm9yRWFjaChzaGFyZWRTbG90ID0+IHtcbiAgICAgIGNvbnN0IHNsb3QgPSB0aGlzLmNyZWF0ZVNsb3RCeVNoYXJlZFNsb3Qoc2hhcmVkU2xvdClcbiAgICAgIHNsb3RzLnB1c2goc2xvdClcbiAgICB9KVxuICAgIGNvbnN0IG5hbWUgPSB5TWFwLmdldCgnbmFtZScpXG4gICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLnRyYW5zbGF0b3IuY3JlYXRlQ29tcG9uZW50QnlEYXRhKG5hbWUsIHtcbiAgICAgIHN0YXRlOiB5TWFwLmdldCgnc3RhdGUnKSxcbiAgICAgIHNsb3RzXG4gICAgfSlcbiAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgIGluc3RhbmNlLnNsb3RzLnRvQXJyYXkoKS5mb3JFYWNoKChzbG90LCBpbmRleCkgPT4ge1xuICAgICAgICBsZXQgc2hhcmVkU2xvdCA9IHNoYXJlZFNsb3RzLmdldChpbmRleClcbiAgICAgICAgaWYgKCFzaGFyZWRTbG90KSB7XG4gICAgICAgICAgc2hhcmVkU2xvdCA9IHRoaXMuY3JlYXRlU2hhcmVkU2xvdEJ5U2xvdChzbG90KVxuICAgICAgICAgIHNoYXJlZFNsb3RzLnB1c2goW3NoYXJlZFNsb3RdKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3luY1Nsb3Qoc2hhcmVkU2xvdCwgc2xvdClcbiAgICAgICAgdGhpcy5zeW5jQ29udGVudChzaGFyZWRTbG90LmdldCgnY29udGVudCcpLCBzbG90KVxuICAgICAgfSlcbiAgICAgIHJldHVybiBpbnN0YW5jZVxuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlVW5rbm93bkNvbXBvbmVudChuYW1lLCBjYW5JbnNlcnRJbmxpbmVDb21wb25lbnQpLmNyZWF0ZUluc3RhbmNlKHRoaXMuc3RhcnRlcilcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU2xvdEJ5U2hhcmVkU2xvdChzaGFyZWRTbG90OiBZTWFwPGFueT4pOiBTbG90IHtcbiAgICBjb25zdCBjb250ZW50ID0gc2hhcmVkU2xvdC5nZXQoJ2NvbnRlbnQnKSBhcyBZVGV4dFxuICAgIGNvbnN0IGRlbHRhID0gY29udGVudC50b0RlbHRhKClcblxuICAgIGNvbnN0IHNsb3QgPSB0aGlzLnRyYW5zbGF0b3IuY3JlYXRlU2xvdCh7XG4gICAgICBzY2hlbWE6IHNoYXJlZFNsb3QuZ2V0KCdzY2hlbWEnKSxcbiAgICAgIHN0YXRlOiBzaGFyZWRTbG90LmdldCgnc3RhdGUnKSxcbiAgICAgIGZvcm1hdHM6IHt9LFxuICAgICAgY29udGVudDogW11cbiAgICB9KVxuXG4gICAgZm9yIChjb25zdCBhY3Rpb24gb2YgZGVsdGEpIHtcbiAgICAgIGlmIChhY3Rpb24uaW5zZXJ0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgYWN0aW9uLmluc2VydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBzbG90Lmluc2VydChhY3Rpb24uaW5zZXJ0LCBtYWtlRm9ybWF0cyh0aGlzLnJlZ2lzdHJ5LCBhY3Rpb24uYXR0cmlidXRlcykpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qgc2hhcmVkQ29tcG9uZW50ID0gYWN0aW9uLmluc2VydCBhcyBZTWFwPGFueT5cbiAgICAgICAgICBjb25zdCBjYW5JbnNlcnRJbmxpbmVDb21wb25lbnQgPSBzbG90LnNjaGVtYS5pbmNsdWRlcyhDb250ZW50VHlwZS5JbmxpbmVDb21wb25lbnQpXG4gICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jcmVhdGVDb21wb25lbnRCeVNoYXJlZENvbXBvbmVudChzaGFyZWRDb21wb25lbnQsIGNhbkluc2VydElubGluZUNvbXBvbmVudClcbiAgICAgICAgICBzbG90Lmluc2VydChjb21wb25lbnQpXG4gICAgICAgICAgdGhpcy5zeW5jU2xvdHMoc2hhcmVkQ29tcG9uZW50LmdldCgnc2xvdHMnKSwgY29tcG9uZW50KVxuICAgICAgICAgIHRoaXMuc3luY0NvbXBvbmVudChzaGFyZWRDb21wb25lbnQsIGNvbXBvbmVudClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgY29sbGFib3JhdGVFcnJvckZuKCd1bmV4cGVjdGVkIGRlbHRhIGFjdGlvbi4nKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2xvdFxuICB9XG5cbiAgcHJpdmF0ZSBjbGVhblN1YnNjcmlwdGlvbnNCeVNsb3Qoc2xvdDogU2xvdCkge1xuICAgIHRoaXMuY29udGVudE1hcC5kZWxldGUoc2xvdCk7XG4gICAgW3RoaXMuY29udGVudFN5bmNDYWNoZXMuZ2V0KHNsb3QpLCB0aGlzLnNsb3RTdGF0ZVN5bmNDYWNoZXMuZ2V0KHNsb3QpXS5mb3JFYWNoKGZuID0+IHtcbiAgICAgIGlmIChmbikge1xuICAgICAgICBmbigpXG4gICAgICB9XG4gICAgfSlcbiAgICBzbG90LnNsaWNlQ29udGVudCgpLmZvckVhY2goaSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGkgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuY2xlYW5TdWJzY3JpcHRpb25zQnlDb21wb25lbnQoaSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBjbGVhblN1YnNjcmlwdGlvbnNCeUNvbXBvbmVudChjb21wb25lbnQ6IENvbXBvbmVudEluc3RhbmNlKSB7XG4gICAgW3RoaXMuc2xvdHNTeW5jQ2FjaGVzLmdldChjb21wb25lbnQpLCB0aGlzLmNvbXBvbmVudFN0YXRlU3luY0NhY2hlcy5nZXQoY29tcG9uZW50KV0uZm9yRWFjaChmbiA9PiB7XG4gICAgICBpZiAoZm4pIHtcbiAgICAgICAgZm4oKVxuICAgICAgfVxuICAgIH0pXG4gICAgY29tcG9uZW50LnNsb3RzLnRvQXJyYXkoKS5mb3JFYWNoKHNsb3QgPT4ge1xuICAgICAgdGhpcy5jbGVhblN1YnNjcmlwdGlvbnNCeVNsb3Qoc2xvdClcbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIG1ha2VGb3JtYXRzKHJlZ2lzdHJ5OiBSZWdpc3RyeSwgYXR0cnM/OiBhbnkpIHtcbiAgY29uc3QgZm9ybWF0czogRm9ybWF0cyA9IFtdXG4gIGlmIChhdHRycykge1xuICAgIE9iamVjdC5rZXlzKGF0dHJzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBjb25zdCBmb3JtYXR0ZXIgPSByZWdpc3RyeS5nZXRGb3JtYXR0ZXIoa2V5KVxuICAgICAgaWYgKGZvcm1hdHRlcikge1xuICAgICAgICBmb3JtYXRzLnB1c2goW2Zvcm1hdHRlciwgYXR0cnNba2V5XV0pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuICByZXR1cm4gZm9ybWF0c1xufVxuIl19