@acorex/platform 18.0.11 → 18.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/auth/lib/session.service.d.ts +2 -2
  2. package/core/utils/countdown-timer.d.ts +4 -2
  3. package/esm2022/auth/lib/session.service.mjs +23 -38
  4. package/esm2022/core/utils/countdown-timer.mjs +10 -3
  5. package/esm2022/layout/builder/lib/builder/widget.types.mjs +3 -2
  6. package/esm2022/layout/designer/lib/board/board.component.mjs +72 -13
  7. package/esm2022/layout/designer/lib/buttons/add-widget-button/add-widget-button.component.mjs +16 -16
  8. package/esm2022/layout/designer/lib/designer/designer.component.mjs +18 -41
  9. package/esm2022/layout/designer/lib/designer.service.mjs +37 -51
  10. package/esm2022/layout/designer/lib/header-menu/header-menu.component.mjs +24 -0
  11. package/esm2022/layout/designer/lib/history/history.component.mjs +21 -0
  12. package/esm2022/layout/designer/lib/history-manager.service.mjs +117 -0
  13. package/esm2022/layout/designer/lib/outline/outline.component.mjs +4 -5
  14. package/esm2022/layout/designer/lib/property-viewer/widget-property-viewer.component.mjs +2 -2
  15. package/esm2022/layouts/lib/admin/entity-layout/entity-modify-view/entity-modify-view.component.mjs +7 -6
  16. package/esm2022/widgets/lib/properties/editors.props.mjs +40 -5
  17. package/esm2022/widgets/lib/widgets/actions/button-widget/button-widget-view.component.mjs +19 -4
  18. package/esm2022/widgets/lib/widgets/editors/checkbox/checkbox-widget.config.mjs +2 -1
  19. package/esm2022/widgets/lib/widgets/editors/color-box-widget/color-box-widget-edit.component.mjs +7 -13
  20. package/esm2022/widgets/lib/widgets/editors/contact-widget/contact-widget-edit.component.mjs +5 -5
  21. package/esm2022/widgets/lib/widgets/editors/rich-text-widget/rich-text-widget-edit.component.mjs +2 -2
  22. package/esm2022/widgets/lib/widgets/editors/select-box-widget/select-box-widget-edit.component.mjs +31 -21
  23. package/esm2022/widgets/lib/widgets/editors/select-box-widget/select-box-widget.config.mjs +11 -4
  24. package/esm2022/widgets/lib/widgets/editors/selection-list-widget/selection-list-widget.config.mjs +2 -1
  25. package/esm2022/widgets/lib/widgets/editors/text-box-widget/text-box-widget-edit.component.mjs +4 -4
  26. package/esm2022/widgets/lib/widgets/editors/text-box-widget/text-box-widget.config.mjs +3 -2
  27. package/esm2022/widgets/lib/widgets/editors/toggle-widget/toggle-widget.config.mjs +2 -1
  28. package/esm2022/widgets/lib/widgets/layout/page-widget/page-widget-designer.component.mjs +14 -4
  29. package/esm2022/widgets/lib/widgets/layout/page-widget/page-widget.config.mjs +3 -2
  30. package/esm2022/widgets/lib/widgets/layout/repeater-widget/repeater-widget.config.mjs +2 -1
  31. package/esm2022/widgets/lib/widgets/layout/text-block-widget/text-block-widget.config.mjs +2 -2
  32. package/fesm2022/acorex-platform-auth.mjs +22 -37
  33. package/fesm2022/acorex-platform-auth.mjs.map +1 -1
  34. package/fesm2022/acorex-platform-core.mjs +9 -2
  35. package/fesm2022/acorex-platform-core.mjs.map +1 -1
  36. package/fesm2022/acorex-platform-layout-builder.mjs +2 -1
  37. package/fesm2022/acorex-platform-layout-builder.mjs.map +1 -1
  38. package/fesm2022/acorex-platform-layout-designer.mjs +319 -156
  39. package/fesm2022/acorex-platform-layout-designer.mjs.map +1 -1
  40. package/fesm2022/{acorex-platform-layouts-entity-modify-view.component-CjofXJku.mjs → acorex-platform-layouts-entity-modify-view.component-C9L8cyBm.mjs} +7 -5
  41. package/fesm2022/acorex-platform-layouts-entity-modify-view.component-C9L8cyBm.mjs.map +1 -0
  42. package/fesm2022/acorex-platform-layouts.mjs +2 -2
  43. package/fesm2022/{acorex-platform-widgets-page-widget-designer.component-DYb6bilD.mjs → acorex-platform-widgets-page-widget-designer.component-DlfG4EP1.mjs} +14 -4
  44. package/fesm2022/acorex-platform-widgets-page-widget-designer.component-DlfG4EP1.mjs.map +1 -0
  45. package/fesm2022/acorex-platform-widgets.mjs +332 -267
  46. package/fesm2022/acorex-platform-widgets.mjs.map +1 -1
  47. package/layout/builder/lib/builder/widget.types.d.ts +2 -2
  48. package/layout/designer/lib/board/board.component.d.ts +7 -1
  49. package/layout/designer/lib/designer/designer.component.d.ts +1 -10
  50. package/layout/designer/lib/designer.service.d.ts +20 -16
  51. package/layout/designer/lib/header-menu/header-menu.component.d.ts +7 -0
  52. package/layout/designer/lib/history/history.component.d.ts +7 -0
  53. package/layout/designer/lib/history-manager.service.d.ts +31 -0
  54. package/package.json +7 -7
  55. package/widgets/lib/properties/editors.props.d.ts +1 -0
  56. package/widgets/lib/widgets/actions/button-widget/button-widget-view.component.d.ts +1 -0
  57. package/widgets/lib/widgets/editors/color-box-widget/color-box-widget-edit.component.d.ts +2 -4
  58. package/widgets/lib/widgets/editors/select-box-widget/select-box-widget-edit.component.d.ts +2 -0
  59. package/widgets/lib/widgets/editors/text-box-widget/text-box-widget-edit.component.d.ts +1 -1
  60. package/widgets/lib/widgets/layout/page-widget/page-widget-designer.component.d.ts +2 -0
  61. package/fesm2022/acorex-platform-layouts-entity-modify-view.component-CjofXJku.mjs.map +0 -1
  62. package/fesm2022/acorex-platform-widgets-page-widget-designer.component-DYb6bilD.mjs.map +0 -1
@@ -3,19 +3,19 @@ import { AXPWidgetRegistryService } from '@acorex/platform/layout/builder';
3
3
  import { computed, inject, Injectable, signal } from '@angular/core';
4
4
  import { cloneDeep, get, merge, set, sortBy } from 'lodash-es';
5
5
  import { Subject } from 'rxjs';
6
+ import { AXPObjectHistoryManager } from './history-manager.service';
6
7
  import * as i0 from "@angular/core";
7
8
  export class AXPDesignerService {
8
9
  constructor() {
10
+ this.popupService = inject(AXPopupService);
11
+ this.widgetRegisteryService = inject(AXPWidgetRegistryService);
12
+ this.historyManager = inject((AXPObjectHistoryManager));
9
13
  this.clipboard = signal(null);
10
- this.undoStack = [];
11
- this.redoStack = [];
12
- this.maxHistorySize = 20;
13
- this.canUndo = signal(false);
14
- this.canRedo = signal(false);
15
14
  this.canCutCopy = computed(() => this.selectedNode() != null && this.selectedNode()?.name != "page");
16
15
  this.canPaste = computed(() => (this.clipboard() != null));
17
- this.popupService = inject(AXPopupService);
18
- this.widgetRegisteryService = inject(AXPWidgetRegistryService);
16
+ this.history = computed(() => this.historyManager.history());
17
+ this.canUndo = computed(() => this.historyManager.canUndo());
18
+ this.canRedo = computed(() => this.historyManager.canRedo());
19
19
  this.root = signal(this.createPage());
20
20
  this.breadcrumbs = computed(() => {
21
21
  return this.selectedNode() ? this.findBreadcrumbs(this.root(), this.selectedNode()) ?? [] : [];
@@ -24,16 +24,13 @@ export class AXPDesignerService {
24
24
  this._lastSelectedNode = null;
25
25
  this._focusedNode = null;
26
26
  this.focusedNode = () => this._focusedNode;
27
- this._mode = signal('designer');
28
- this.mode = this._mode.asReadonly();
27
+ this.mode = signal('designer');
28
+ this.size = signal('xl');
29
29
  this.onSelected = new Subject();
30
30
  this.onRefresh = new Subject();
31
31
  this.onUpdate = new Subject();
32
32
  this.onFocused = new Subject();
33
33
  }
34
- setMode(mode) {
35
- this._mode.set(mode);
36
- }
37
34
  register(command) {
38
35
  if (!this._lastSelectedNode) {
39
36
  this.select({ widget: command.widget });
@@ -49,8 +46,7 @@ export class AXPDesignerService {
49
46
  }
50
47
  update(command) {
51
48
  if (command.mode == 'update') {
52
- console.log(this.selectedNode()?.name, command);
53
- this.saveStateForUndo();
49
+ this.historyManager.saveState(cloneDeep(this.root()), `Updated ${this.selectedNode()?.name}`);
54
50
  }
55
51
  this.selectedNode.update(c => merge(this.selectedNode(), command.values));
56
52
  this.onUpdate.next({ widget: this.selectedNode(), values: command.values });
@@ -109,6 +105,7 @@ export class AXPDesignerService {
109
105
  };
110
106
  set(page, '__meta__.id', Math.random() * Math.pow(10, 18));
111
107
  set(page, '__meta__.config', config);
108
+ this.historyManager.saveState(page, "New");
112
109
  return page;
113
110
  }
114
111
  findWidgetById(root, id) {
@@ -169,20 +166,21 @@ export class AXPDesignerService {
169
166
  if (!currentNode)
170
167
  return null;
171
168
  //
172
- this.saveStateForUndo();
169
+ const cloned = cloneDeep(node);
170
+ this.historyManager.saveState(cloneDeep(this.root()), `Added ${cloned.type}`);
173
171
  //
174
172
  if (!currentNode.children) {
175
173
  currentNode.children = [];
176
174
  }
177
175
  const config = this.widgetRegisteryService.resolve(node.type);
178
176
  //
179
- const cloned = cloneDeep(node);
180
177
  cloned.name = this.generateUniqueName(node.type);
181
178
  set(cloned, '__meta__.id', Math.random() * Math.pow(10, 18));
182
179
  set(cloned, '__meta__.config', config);
183
180
  //
184
181
  currentNode.children.push(cloned);
185
182
  //
183
+ this.historyManager.updateState(this.root());
186
184
  //
187
185
  this.refresh({ widget: currentNode });
188
186
  this.select({ widget: cloned });
@@ -193,7 +191,7 @@ export class AXPDesignerService {
193
191
  console.error("Cannot remove the page node.");
194
192
  return; // Prevent removing the root page node
195
193
  }
196
- this.saveStateForUndo(); // Save state before making changes
194
+ this.historyManager.saveState(cloneDeep(this.root()), `Removed ${node.name}`);
197
195
  const nodeIdToRemove = get(node, "__meta__.id");
198
196
  if (!nodeIdToRemove) {
199
197
  throw new Error("Node does not have a valid __meta__.id to identify it for removal.");
@@ -206,6 +204,9 @@ export class AXPDesignerService {
206
204
  const index = parent.children?.findIndex(child => get(child, "__meta__.id") === nodeIdToRemove) ?? -1;
207
205
  if (index > -1) {
208
206
  parent.children.splice(index, 1);
207
+ //
208
+ this.historyManager.updateState(this.root());
209
+ //
209
210
  this.refresh({ widget: parent }); // Refresh the UI to reflect changes
210
211
  this.select({ widget: parent }); // Select the parent node after removal
211
212
  }
@@ -213,41 +214,23 @@ export class AXPDesignerService {
213
214
  throw new Error("Node to remove not found in the widget tree.");
214
215
  }
215
216
  }
216
- saveStateForUndo() {
217
- if (this.undoStack.length >= this.maxHistorySize) {
218
- this.undoStack.shift(); // Remove the oldest snapshot if exceeding the max history size.
219
- }
220
- this.undoStack.push(cloneDeep(this.root()));
221
- this.canUndo.set(true);
222
- // Clear the redo stack whenever a new change is made after undo
223
- if (this.redoStack.length > 0) {
224
- this.redoStack = [];
225
- this.canRedo.set(false);
226
- }
227
- }
228
- applyState(state) {
229
- this.root.set(state);
217
+ revertToChange(index) {
218
+ this.historyManager.revert(index);
219
+ this.root.set(this.historyManager.currentState()?.state);
230
220
  this.refresh({ widget: this.root() });
231
- //TODO: select the selected widget on this state
232
- this.select({ widget: this._lastSelectedNode ?? this.root() });
233
221
  }
234
- undo() {
235
- if (this.undoStack.length > 0) {
236
- const currentState = cloneDeep(this.root());
237
- this.redoStack.push(currentState);
238
- const prevState = this.undoStack.pop();
239
- this.applyState(prevState);
240
- this.canUndo.set(this.undoStack.length > 0);
241
- this.canRedo.set(true); // There is at least one action to redo now
222
+ redo() {
223
+ if (this.historyManager.canRedo()) {
224
+ this.historyManager.redo();
225
+ this.root.set(this.historyManager.currentState()?.state);
226
+ this.refresh({ widget: this.root() });
242
227
  }
243
228
  }
244
- redo() {
245
- if (this.redoStack.length > 0) {
246
- const nextState = this.redoStack.pop();
247
- this.undoStack.push(cloneDeep(this.root()));
248
- this.applyState(nextState);
249
- this.canRedo.set(this.redoStack.length > 0);
250
- this.canUndo.set(true); // Undo is always available after a redo
229
+ undo() {
230
+ if (this.historyManager.canUndo()) {
231
+ this.historyManager.undo();
232
+ this.root.set(this.historyManager.currentState()?.state);
233
+ this.refresh({ widget: this.root() });
251
234
  }
252
235
  }
253
236
  formatOutputJSON(obj, nodeName) {
@@ -285,21 +268,24 @@ export class AXPDesignerService {
285
268
  console.error("Clipboard is empty or no node is selected.");
286
269
  return;
287
270
  }
271
+ const newNode = cloneDeep(this.clipboard());
288
272
  const nearestContainer = this.findNearestContainer(parentNode, true);
289
273
  if (!nearestContainer) {
290
274
  console.error("No suitable container found.");
291
275
  return;
292
276
  }
293
277
  //
294
- this.saveStateForUndo(); // Prepare for undo functionality
278
+ this.historyManager.saveState(newNode, `Pasted ${newNode.name}`); // Prepare for undo functionality
295
279
  //
296
280
  if (!nearestContainer.children) {
297
281
  nearestContainer.children = [];
298
282
  }
299
- const newNode = cloneDeep(this.clipboard());
300
283
  set(newNode, "__meta__.id", Math.random() * Math.pow(10, 18)); // Ensure a unique ID
301
284
  //
302
285
  nearestContainer.children.push(newNode); // Add the new node to the container
286
+ //
287
+ this.historyManager.updateState(this.root());
288
+ //
303
289
  this.refresh({ widget: nearestContainer }); // Refresh the UI
304
290
  this.select({ widget: newNode }); // Select the newly pasted node
305
291
  }
@@ -367,4 +353,4 @@ export class AXPDesignerService {
367
353
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: AXPDesignerService, decorators: [{
368
354
  type: Injectable
369
355
  }] });
370
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcGxhdGZvcm0vbGF5b3V0L2Rlc2lnbmVyL3NyYy9saWIvZGVzaWduZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFMUQsT0FBTyxFQUFzRCx3QkFBd0IsRUFBdUIsTUFBTSxpQ0FBaUMsQ0FBQztBQUNwSixPQUFPLEVBQUUsUUFBUSxFQUFVLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdFLE9BQU8sRUFBRSxTQUFTLEVBQVcsR0FBRyxFQUFXLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFVLE1BQU0sV0FBVyxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBa0QvQixNQUFNLE9BQU8sa0JBQWtCO0lBRC9CO1FBRVksY0FBUyxHQUFHLE1BQU0sQ0FBdUIsSUFBSSxDQUFDLENBQUM7UUFDL0MsY0FBUyxHQUFvQixFQUFFLENBQUM7UUFDaEMsY0FBUyxHQUFvQixFQUFFLENBQUM7UUFDaEMsbUJBQWMsR0FBRyxFQUFFLENBQUM7UUFDckIsWUFBTyxHQUFHLE1BQU0sQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUNqQyxZQUFPLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLGVBQVUsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsSUFBSSxJQUFJLE1BQU0sQ0FBQyxDQUFDO1FBQ2hHLGFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksSUFBSSxDQUFDLENB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O1FBQzdDLE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDeEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFakQsbURBQW1EO1FBQ25ELE9BQU8sYUFBYSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ25DLEtBQUssRUFBRSxDQUFDO1lBQ1IsVUFBVSxHQUFHLEdBQUcsUUFBUSxHQUFHLEtBQUssRUFBRSxDQUFDO1FBQ3ZDLENBQUM7UUFFRCxPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGVBQWUsQ0FBQyxJQUFtQixFQUFFLEtBQWtCO1FBQzNELElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1osS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hCLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNoQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN2QyxDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7OEdBNWFRLGtCQUFrQjtrSEFBbEIsa0JBQWtCOzsyRkFBbEIsa0JBQWtCO2tCQUQ5QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQVhQb3B1cFNlcnZpY2UgfSBmcm9tICdAYWNvcmV4L2NvbXBvbmVudHMvcG9wdXAnO1xuaW1wb3J0IHsgQVhGaWxlU2VydmljZSB9IGZyb20gJ0BhY29yZXgvY29yZS9maWxlJztcbmltcG9ydCB7IEFYUFdpZGdldENvbXBvbmVudCwgQVhQV2lkZ2V0Q29uZmlnLCBBWFBXaWRnZXROb2RlLCBBWFBXaWRnZXRSZWdpc3RyeVNlcnZpY2UsIEFYUFdpZGdldFJlbmRlck1vZGUgfSBmcm9tICdAYWNvcmV4L3BsYXRmb3JtL2xheW91dC9idWlsZGVyJztcbmltcG9ydCB7IGNvbXB1dGVkLCBlZmZlY3QsIGluamVjdCwgSW5qZWN0YWJsZSwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBjbG9uZURlZXAsIGZvckVhY2gsIGdldCwgaXNFcXVhbCwgbWVyZ2UsIHNldCwgc29ydEJ5LCB2YWx1ZXMgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFYUERlc2lnbmVyRm9jdXNDb21tYW5kIHtcbiAgICB3aWRnZXQ6IEFYUFdpZGdldE5vZGUgfCBudWxsLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFYUERlc2lnbmVyVXBkYXRlQ29tbWFuZCB7XG4gICAgdmFsdWVzOiBhbnk7XG4gICAgbW9kZTogXCJpbml0XCIgfCBcInVwZGF0ZVwiXG59XG5leHBvcnQgaW50ZXJmYWNlIEFYUERlc2lnbmVyVXBkYXRlRXZlbnQge1xuICAgIHZhbHVlczogYW55O1xuICAgIHdpZGdldDogQVhQV2lkZ2V0Tm9kZSxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBWFBEZXNpZ25lclNlbGVjdENvbW1hbmQge1xuICAgIHdpZGdldDogQVhQV2lkZ2V0Tm9kZSxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBWFBEZXNpZ25lclJlZ2lzdGVyQ29tbWFuZCB7XG4gICAgaWQ6IG51bWJlcixcbiAgICB3aWRnZXQ6IEFYUFdpZGdldE5vZGUsXG4gICAgY29uZmlnOiBBWFBXaWRnZXRDb25maWcsXG4gICAgaW5zdGFuY2U6IEFYUFdpZGdldENvbXBvbmVudCxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBWFBEZXNpZ25lclNlbGVjdEV2ZW50IHtcbiAgICB3aWRnZXQ6IEFYUFdpZGdldE5vZGUsXG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBBWFBEZXNpZ25lclJlZnJlc2hDb21tYW5kIHtcbiAgICB3aWRnZXQ6IEFYUFdpZGdldE5vZGUsXG59XG5leHBvcnQgaW50ZXJmYWNlIEFYUERlc2lnbmVyUmVmcmVzaEV2ZW50IHtcbiAgICB3aWRnZXQ6IEFYUFdpZGdldE5vZGUsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQVhQRGVzaWduZXJBZGROb2RlQ29tbWFuZCB7XG4gICAgd2lkZ2V0OiBBWFBXaWRnZXROb2RlLFxufVxuZXhwb3J0IGludGVyZmFjZSBBWFBEZXNpZ25lckFkZE5vZGVFdmVudCB7XG4gICAgd2lkZ2V0OiBBWFBXaWRnZXROb2RlLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFYUERlc2lnbmVyRm9jdXNFdmVudCB7XG4gICAgd2lkZ2V0OiBBWFBXaWRnZXROb2RlIHwgbnVsbCxcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEFYUERlc2lnbmVyU2VydmljZSB7XG4gICAgcHJpdmF0ZSBjbGlwYm9hcmQgPSBzaWduYWw8QVhQV2lkZ2V0Tm9kZSB8IG51bGw+KG51bGwpO1xuICAgIHByaXZhdGUgdW5kb1N0YWNrOiBBWFBXaWRnZXROb2RlW10gPSBbXTtcbiAgICBwcml2YXRlIHJlZG9TdGFjazogQVhQV2lkZ2V0Tm9kZVtdID0gW107XG4gICAgcHJpdmF0ZSBtYXhIaXN0b3J5U2l6ZSA9IDIwO1xuICAgIHB1YmxpYyBjYW5VbmRvID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgICBwdWJsaWMgY2FuUmVkbyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gICAgcHVibGljIGNhbkN1dENvcHkgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnNlbGVjdGVkTm9kZSgpICE9IG51bGwgJiYgdGhpcy5zZWxlY3RlZE5vZGUoKT8ubmFtZSAhPSBcInBhZ2VcIik7XG4gICAgcHVibGljIGNhblBhc3RlID0gY29tcHV0ZWQoKCkgPT4gKHRoaXMuY2xpcGJvYXJkKCkgIT0gbnVsbCkpO1xuXG4gICAgcHJpdmF0ZSBwb3B1cFNlcnZpY2UgPSBpbmplY3QoQVhQb3B1cFNlcnZpY2UpO1xuICAgIHByaXZhdGUgd2lkZ2V0UmVnaXN0ZXJ5U2VydmljZSA9IGluamVjdChBWFBXaWRnZXRSZWdpc3RyeVNlcnZpY2UpO1xuXG4gICAgcHVibGljIHJlYWRvbmx5IHJvb3QgPSBzaWduYWwodGhpcy5jcmVhdGVQYWdlKCkpO1xuXG4gICAgcHVibGljIGJyZWFkY3J1bWJzID0gY29tcHV0ZWQ8QVhQV2lkZ2V0Tm9kZVtdPigoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkTm9kZSgpID8gdGhpcy5maW5kQnJlYWRjcnVtYnModGhpcy5yb290KCksIHRoaXMuc2VsZWN0ZWROb2RlKCkhKSA/PyBbXSA6IFtdO1xuICAgIH0pO1xuXG4gICAgcHVibGljIHNlbGVjdGVkTm9kZSA9IHNpZ25hbDxBWFBXaWRnZXROb2RlIHwgbnVsbD4obnVsbCk7XG5cbiAgICBwcml2YXRlIF9sYXN0U2VsZWN0ZWROb2RlOiBBWFBXaWRnZXROb2RlIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwcml2YXRlIF9mb2N1c2VkTm9kZTogQVhQV2lkZ2V0Tm9kZSB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBmb2N1c2VkTm9kZSA9ICgpID0+IHRoaXMuX2ZvY3VzZWROb2RlO1xuXG4gICAgcHJpdmF0ZSBfbW9kZSA9IHNpZ25hbDxBWFBXaWRnZXRSZW5kZXJNb2RlPignZGVzaWduZXInKTtcbiAgICBwdWJsaWMgbW9kZSA9IHRoaXMuX21vZGUuYXNSZWFkb25seSgpO1xuXG4gICAgcHVibGljIHNldE1vZGUobW9kZTogQVhQV2lkZ2V0UmVuZGVyTW9kZSkge1xuICAgICAgICB0aGlzLl9tb2RlLnNldChtb2RlKTtcbiAgICB9XG5cblxuICAgIHB1YmxpYyByZWFkb25seSBvblNlbGVjdGVkID0gbmV3IFN1YmplY3Q8QVhQRGVzaWduZXJTZWxlY3RFdmVudD4oKTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgb25SZWZyZXNoID0gbmV3IFN1YmplY3Q8QVhQRGVzaWduZXJSZWZyZXNoRXZlbnQ+KCk7XG5cblxuICAgIHB1YmxpYyByZWdpc3Rlcihjb21tYW5kOiBBWFBEZXNpZ25lclJlZ2lzdGVyQ29tbWFuZCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuX2xhc3RTZWxlY3RlZE5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0KHsgd2lkZ2V0OiBjb21tYW5kLndpZGdldCB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0KHsgd2lkZ2V0OiB0aGlzLl9sYXN0U2VsZWN0ZWROb2RlIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNlbGVjdChjb21tYW5kOiBBWFBEZXNpZ25lclNlbGVjdENvbW1hbmQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE5vZGUuc2V0KGNvbW1hbmQud2lkZ2V0KTtcbiAgICAgICAgdGhpcy5fbGFzdFNlbGVjdGVkTm9kZSA9IHRoaXMuc2VsZWN0ZWROb2RlKCk7XG4gICAgICAgIHRoaXMub25TZWxlY3RlZC5uZXh0KGNvbW1hbmQpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkb25seSBvblVwZGF0ZSA9IG5ldyBTdWJqZWN0PEFYUERlc2lnbmVyVXBkYXRlRXZlbnQ+KCk7XG5cbiAgICBwdWJsaWMgdXBkYXRlKGNvbW1hbmQ6IEFYUERlc2lnbmVyVXBkYXRlQ29tbWFuZCk6IHZvaWQge1xuICAgICAgICBpZiAoY29tbWFuZC5tb2RlID09ICd1cGRhdGUnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLnNlbGVjdGVkTm9kZSgpPy5uYW1lLCBjb21tYW5kKTtcbiAgICAgICAgICAgIHRoaXMuc2F2ZVN0YXRlRm9yVW5kbygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0ZWROb2RlLnVwZGF0ZShjID0+IG1lcmdlKHRoaXMuc2VsZWN0ZWROb2RlKCksIGNvbW1hbmQudmFsdWVzKSk7XG4gICAgICAgIHRoaXMub25VcGRhdGUubmV4dCh7IHdpZGdldDogdGhpcy5zZWxlY3RlZE5vZGUoKSEsIHZhbHVlczogY29tbWFuZC52YWx1ZXMgfSk7XG4gICAgfVxuXG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgb25Gb2N1c2VkID0gbmV3IFN1YmplY3Q8QVhQRGVzaWduZXJGb2N1c0V2ZW50PigpO1xuXG4gICAgcHVibGljIGZvY3VzKGNvbW1hbmQ6IEFYUERlc2lnbmVyRm9jdXNDb21tYW5kKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9mb2N1c2VkTm9kZSAhPSBjb21tYW5kLndpZGdldCkge1xuICAgICAgICAgICAgdGhpcy5fZm9jdXNlZE5vZGUgPSBjb21tYW5kLndpZGdldDtcbiAgICAgICAgICAgIHRoaXMub25Gb2N1c2VkLm5leHQoeyB3aWRnZXQ6IHRoaXMuX2ZvY3VzZWROb2RlIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlZnJlc2goY29tbWFuZDogQVhQRGVzaWduZXJSZWZyZXNoQ29tbWFuZCkge1xuICAgICAgICB0aGlzLm9uUmVmcmVzaC5uZXh0KHsgd2lkZ2V0OiBjb21tYW5kLndpZGdldCB9KTtcbiAgICB9XG5cblxuICAgIHByaXZhdGUgZmluZEJyZWFkY3J1bWJzKFxuICAgICAgICBub2RlOiBBWFBXaWRnZXROb2RlLFxuICAgICAgICB0YXJnZXROb2RlOiBBWFBXaWRnZXROb2RlLFxuICAgICAgICBicmVhZGNydW1iOiBBWFBXaWRnZXROb2RlW10gPSBbXVxuICAgICk6IEFYUFdpZGdldE5vZGVbXSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIC8vIEFkZCB0aGUgY3VycmVudCBub2RlIHRvIHRoZSBicmVhZGNydW1iIHBhdGhcbiAgICAgICAgY29uc3QgY3VycmVudEJyZWFkY3J1bWIgPSBbLi4uYnJlYWRjcnVtYiwgbm9kZV07XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGN1cnJlbnQgbm9kZSBpcyB0aGUgdGFyZ2V0IG5vZGVcbiAgICAgICAgaWYgKG5vZGUgPT09IHRhcmdldE5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50QnJlYWRjcnVtYjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBub2RlIGhhcyBjaGlsZHJlbiwgcmVjdXJzaXZlbHkgc2VhcmNoIHRoZW1cbiAgICAgICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZmluZEJyZWFkY3J1bWJzKGNoaWxkLCB0YXJnZXROb2RlLCBjdXJyZW50QnJlYWRjcnVtYik7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJldHVybiB1bmRlZmluZWQgaWYgbm8gbWF0Y2ggaXMgZm91bmRcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cblxuICAgIGFzeW5jIHNob3dQaWNrZXIoY3VycmVudE5vZGU6IEFYUFdpZGdldE5vZGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgY29tID0gYXdhaXQgaW1wb3J0KCcuL3dpZGdldC1waWNrZXIvd2lkZ2V0LXBpY2tlci5jb21wb25lbnQnKS50aGVuKGMgPT4gYy5BWFBEZXNpZ25lcldpZGdldFBpY2tlckNvbXBvbmVudCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucG9wdXBTZXJ2aWNlLm9wZW4oY29tLCB7XG4gICAgICAgICAgICB0aXRsZTogXCJXaWRnZXQgR2FsbGVyeVwiLFxuICAgICAgICAgICAgc2l6ZTogJ21kJyxcbiAgICAgICAgICAgIGNsb3NlQnV0dG9uOiB0cnVlLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIHdpZGdldHM6IHNvcnRCeSh0aGlzLndpZGdldFJlZ2lzdGVyeVNlcnZpY2UuYWxsKCkuZmlsdGVyKGMgPT4gYy52aXNpYmxlICE9IGZhbHNlKSwgYyA9PiBjLnRpdGxlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICgocmVzdWx0LmRhdGE/LndpZGdldHMgPz8gW10pLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSByZXN1bHQuZGF0YT8ud2lkZ2V0cyBhcyBBWFBXaWRnZXRDb25maWdbXTtcbiAgICAgICAgICAgIHNlbGVjdGVkLmZvckVhY2goYyA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRXaWRnZXQoY3VycmVudE5vZGUsIHsgdHlwZTogYy5uYW1lIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlUGFnZSgpOiBBWFBXaWRnZXROb2RlIHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy53aWRnZXRSZWdpc3RlcnlTZXJ2aWNlLnJlc29sdmUoJ3BhZ2UnKTtcblxuICAgICAgICBjb25zdCBwYWdlOiBBWFBXaWRnZXROb2RlID0ge1xuICAgICAgICAgICAgdHlwZTogJ3BhZ2UnLFxuICAgICAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAgICAgbmFtZTogXCJwYWdlXCIsXG4gICAgICAgIH1cblxuICAgICAgICBzZXQocGFnZSwgJ19fbWV0YV9fLmlkJywgTWF0aC5yYW5kb20oKSAqIE1hdGgucG93KDEwLCAxOCkpO1xuICAgICAgICBzZXQocGFnZSwgJ19fbWV0YV9fLmNvbmZpZycsIGNvbmZpZyk7XG4gICAgICAgIHJldHVybiBwYWdlO1xuICAgIH1cblxuICAgIHB1YmxpYyBmaW5kV2lkZ2V0QnlJZChyb290OiBBWFBXaWRnZXROb2RlLCBpZDogc3RyaW5nKTogQVhQV2lkZ2V0Tm9kZSB8IG51bGwge1xuICAgICAgICBpZiAoZ2V0KHJvb3QsIFwiX19tZXRhX18uaWRcIikgPT09IGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gcm9vdDsgIC8vIFJldHVybiB0aGUgcm9vdCBpZiBpdCBtYXRjaGVzIHRoZSBJRFxuICAgICAgICB9XG4gICAgICAgIGlmICghcm9vdC5jaGlsZHJlbikgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiByb290LmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMuZmluZFdpZGdldEJ5SWQoY2hpbGQsIGlkKTtcbiAgICAgICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZDsgIC8vIFJldHVybiB0aGUgZm91bmQgY2hpbGRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsOyAgLy8gTm9kZSBub3QgZm91bmRcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRQYXJlbnQoaWQ6IHN0cmluZywgcGFyZW50OiBBWFBXaWRnZXROb2RlID0gdGhpcy5yb290KCkpOiBBWFBXaWRnZXROb2RlIHwgbnVsbCB7XG4gICAgICAgIGlmICghcGFyZW50LmNoaWxkcmVuKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuLnNvbWUoY2hpbGQgPT4gZ2V0KGNoaWxkLCBcIl9fbWV0YV9fLmlkXCIpID09PSBpZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnQ7ICAvLyBSZXR1cm4gdGhpcyBub2RlIGFzIGl0J3MgdGhlIHBhcmVudCBvZiB0aGUgbm9kZSB3aXRoIHRoZSBnaXZlbiBJRFxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBwYXJlbnQuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGNvbnN0IGZvdW5kUGFyZW50ID0gdGhpcy5maW5kUGFyZW50KGlkLCBjaGlsZCk7XG4gICAgICAgICAgICBpZiAoZm91bmRQYXJlbnQpIHJldHVybiBmb3VuZFBhcmVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsOyAgLy8gTm8gcGFyZW50IGZvdW5kXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kTmVhcmVzdENvbnRhaW5lcihub2RlOiBBWFBXaWRnZXROb2RlLCBzZWFyY2hVcHdhcmQ6IGJvb2xlYW4gPSB0cnVlKTogQVhQV2lkZ2V0Tm9kZSB8IG51bGwge1xuICAgICAgICBpZiAoc2VhcmNoVXB3YXJkKSB7XG4gICAgICAgICAgICBsZXQgY3VycmVudDogQVhQV2lkZ2V0Tm9kZSB8IG51bGwgPSBub2RlO1xuICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25maWcgPSB0aGlzLndpZGdldFJlZ2lzdGVyeVNlcnZpY2UucmVzb2x2ZShjdXJyZW50LnR5cGUpO1xuICAgICAgICAgICAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLmNvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3VycmVudCA9IHRoaXMuZmluZFBhcmVudChnZXQoY3VycmVudCwgXCJfX21ldGFfXy5pZFwiKSEpOyAvLyBVc2UgZmluZFBhcmVudCB0byBuYXZpZ2F0ZSB1cHdhcmRzXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBSZWN1cnNpdmUgc2VhcmNoIHRvIGZpbmQgdGhlIGZpcnN0IGNvbnRhaW5lciBhbW9uZyBjaGlsZHJlblxuICAgICAgICAgICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy53aWRnZXRSZWdpc3RlcnlTZXJ2aWNlLnJlc29sdmUoY2hpbGQudHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLmNvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kQ29udGFpbmVyID0gdGhpcy5maW5kTmVhcmVzdENvbnRhaW5lcihjaGlsZCwgZmFsc2UpOyAvLyBDb250aW51ZSBzZWFyY2hpbmcgZG93bndhcmRzXG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZENvbnRhaW5lcikgcmV0dXJuIGZvdW5kQ29udGFpbmVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDsgLy8gUmV0dXJuIG51bGwgaWYgbm8gY29udGFpbmVyIGZvdW5kXG4gICAgfVxuXG4gICAgYWRkV2lkZ2V0KGN1cnJlbnROb2RlOiBBWFBXaWRnZXROb2RlLCBub2RlOiBBWFBXaWRnZXROb2RlKTogQVhQV2lkZ2V0Tm9kZSB8IG51bGwge1xuICAgICAgICBpZiAoIWN1cnJlbnROb2RlKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIC8vXG4gICAgICAgIHRoaXMuc2F2ZVN0YXRlRm9yVW5kbygpO1xuICAgICAgICAvL1xuICAgICAgICBpZiAoIWN1cnJlbnROb2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBjdXJyZW50Tm9kZS5jaGlsZHJlbiA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy53aWRnZXRSZWdpc3RlcnlTZXJ2aWNlLnJlc29sdmUobm9kZS50eXBlKTtcbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgY2xvbmVkID0gY2xvbmVEZWVwKG5vZGUpO1xuICAgICAgICBjbG9uZWQubmFtZSA9IHRoaXMuZ2VuZXJhdGVVbmlxdWVOYW1lKG5vZGUudHlwZSk7XG4gICAgICAgIHNldChjbG9uZWQsICdfX21ldGFfXy5pZCcsIE1hdGgucmFuZG9tKCkgKiBNYXRoLnBvdygxMCwgMTgpKTtcbiAgICAgICAgc2V0KGNsb25lZCwgJ19fbWV0YV9fLmNvbmZpZycsIGNvbmZpZyk7XG4gICAgICAgIC8vXG4gICAgICAgIGN1cnJlbnROb2RlLmNoaWxkcmVuLnB1c2goY2xvbmVkKTtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgdGhpcy5yZWZyZXNoKHsgd2lkZ2V0OiBjdXJyZW50Tm9kZSB9KTtcbiAgICAgICAgdGhpcy5zZWxlY3QoeyB3aWRnZXQ6IGNsb25lZCB9KTtcbiAgICAgICAgcmV0dXJuIGNsb25lZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlV2lkZ2V0KG5vZGU6IEFYUFdpZGdldE5vZGUpOiB2b2lkIHtcbiAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gXCJwYWdlXCIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJDYW5ub3QgcmVtb3ZlIHRoZSBwYWdlIG5vZGUuXCIpO1xuICAgICAgICAgICAgcmV0dXJuOyAgLy8gUHJldmVudCByZW1vdmluZyB0aGUgcm9vdCBwYWdlIG5vZGVcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2F2ZVN0YXRlRm9yVW5kbygpOyAgLy8gU2F2ZSBzdGF0ZSBiZWZvcmUgbWFraW5nIGNoYW5nZXNcblxuICAgICAgICBjb25zdCBub2RlSWRUb1JlbW92ZSA9IGdldChub2RlLCBcIl9fbWV0YV9fLmlkXCIpO1xuICAgICAgICBpZiAoIW5vZGVJZFRvUmVtb3ZlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlIGRvZXMgbm90IGhhdmUgYSB2YWxpZCBfX21ldGFfXy5pZCB0byBpZGVudGlmeSBpdCBmb3IgcmVtb3ZhbC5cIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaW5kIHRoZSBwYXJlbnQgb2YgdGhlIG5vZGUgdG8gcmVtb3ZlIGl0XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuZmluZFBhcmVudChub2RlSWRUb1JlbW92ZSwgdGhpcy5yb290KCkpO1xuICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGFyZW50IG5vZGUgbm90IGZvdW5kLiBUaGUgbm9kZSBtaWdodCBiZSB0aGUgcm9vdCBub2RlIG9yIGRvZXMgbm90IGV4aXN0LlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gcGFyZW50LmNoaWxkcmVuPy5maW5kSW5kZXgoY2hpbGQgPT4gZ2V0KGNoaWxkLCBcIl9fbWV0YV9fLmlkXCIpID09PSBub2RlSWRUb1JlbW92ZSkgPz8gLTE7XG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICBwYXJlbnQuY2hpbGRyZW4hLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2goeyB3aWRnZXQ6IHBhcmVudCB9KTsgIC8vIFJlZnJlc2ggdGhlIFVJIHRvIHJlZmxlY3QgY2hhbmdlc1xuICAgICAgICAgICAgdGhpcy5zZWxlY3QoeyB3aWRnZXQ6IHBhcmVudCB9KTsgIC8vIFNlbGVjdCB0aGUgcGFyZW50IG5vZGUgYWZ0ZXIgcmVtb3ZhbFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZSB0byByZW1vdmUgbm90IGZvdW5kIGluIHRoZSB3aWRnZXQgdHJlZS5cIik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG4gICAgcHJpdmF0ZSBzYXZlU3RhdGVGb3JVbmRvKCkge1xuICAgICAgICBpZiAodGhpcy51bmRvU3RhY2subGVuZ3RoID49IHRoaXMubWF4SGlzdG9yeVNpemUpIHtcbiAgICAgICAgICAgIHRoaXMudW5kb1N0YWNrLnNoaWZ0KCk7IC8vIFJlbW92ZSB0aGUgb2xkZXN0IHNuYXBzaG90IGlmIGV4Y2VlZGluZyB0aGUgbWF4IGhpc3Rvcnkgc2l6ZS5cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVuZG9TdGFjay5wdXNoKGNsb25lRGVlcCh0aGlzLnJvb3QoKSkpO1xuICAgICAgICB0aGlzLmNhblVuZG8uc2V0KHRydWUpO1xuXG4gICAgICAgIC8vIENsZWFyIHRoZSByZWRvIHN0YWNrIHdoZW5ldmVyIGEgbmV3IGNoYW5nZSBpcyBtYWRlIGFmdGVyIHVuZG9cbiAgICAgICAgaWYgKHRoaXMucmVkb1N0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMucmVkb1N0YWNrID0gW107XG4gICAgICAgICAgICB0aGlzLmNhblJlZG8uc2V0KGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXBwbHlTdGF0ZShzdGF0ZTogQVhQV2lkZ2V0Tm9kZSkge1xuICAgICAgICB0aGlzLnJvb3Quc2V0KHN0YXRlKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoKHsgd2lkZ2V0OiB0aGlzLnJvb3QoKSB9KTtcbiAgICAgICAgLy9UT0RPOiBzZWxlY3QgdGhlIHNlbGVjdGVkIHdpZGdldCBvbiB0aGlzIHN0YXRlXG4gICAgICAgIHRoaXMuc2VsZWN0KHsgd2lkZ2V0OiB0aGlzLl9sYXN0U2VsZWN0ZWROb2RlID8/IHRoaXMucm9vdCgpIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyB1bmRvKCkge1xuICAgICAgICBpZiAodGhpcy51bmRvU3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gY2xvbmVEZWVwKHRoaXMucm9vdCgpKTtcbiAgICAgICAgICAgIHRoaXMucmVkb1N0YWNrLnB1c2goY3VycmVudFN0YXRlKTtcbiAgICAgICAgICAgIGNvbnN0IHByZXZTdGF0ZSA9IHRoaXMudW5kb1N0YWNrLnBvcCgpO1xuICAgICAgICAgICAgdGhpcy5hcHBseVN0YXRlKHByZXZTdGF0ZSEpO1xuICAgICAgICAgICAgdGhpcy5jYW5VbmRvLnNldCh0aGlzLnVuZG9TdGFjay5sZW5ndGggPiAwKTtcbiAgICAgICAgICAgIHRoaXMuY2FuUmVkby5zZXQodHJ1ZSk7IC8vIFRoZXJlIGlzIGF0IGxlYXN0IG9uZSBhY3Rpb24gdG8gcmVkbyBub3dcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyByZWRvKCkge1xuICAgICAgICBpZiAodGhpcy5yZWRvU3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgbmV4dFN0YXRlID0gdGhpcy5yZWRvU3RhY2sucG9wKCk7XG4gICAgICAgICAgICB0aGlzLnVuZG9TdGFjay5wdXNoKGNsb25lRGVlcCh0aGlzLnJvb3QoKSkpO1xuICAgICAgICAgICAgdGhpcy5hcHBseVN0YXRlKG5leHRTdGF0ZSEpO1xuICAgICAgICAgICAgdGhpcy5jYW5SZWRvLnNldCh0aGlzLnJlZG9TdGFjay5sZW5ndGggPiAwKTtcbiAgICAgICAgICAgIHRoaXMuY2FuVW5kby5zZXQodHJ1ZSk7IC8vIFVuZG8gaXMgYWx3YXlzIGF2YWlsYWJsZSBhZnRlciBhIHJlZG9cbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgcHJpdmF0ZSBmb3JtYXRPdXRwdXRKU09OKG9iajogYW55LCBub2RlTmFtZTogc3RyaW5nKTogYW55IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIG9iamVjdCBpcyBhbiBhcnJheVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqLm1hcChpdGVtID0+IHRoaXMuZm9ybWF0T3V0cHV0SlNPTihpdGVtLCBub2RlTmFtZSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IG9iamVjdCB0byBzdG9yZSB0aGUgcmVzdWx0XG4gICAgICAgICAgICBsZXQgbmV3T2JqOiBhbnkgPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgICAgICAvLyBPbmx5IGFkZCB0aGUga2V5IGlmIGl0J3Mgbm90IHRoZSBub2RlTmFtZSB3ZSB3YW50IHRvIHJlbW92ZVxuICAgICAgICAgICAgICAgIGlmIChrZXkgIT09IG5vZGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld09ialtrZXldID0gdGhpcy5mb3JtYXRPdXRwdXRKU09OKG9ialtrZXldLCBub2RlTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ld09iajtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGUgdmFsdWUgaXMgbm90IGFuIG9iamVjdCBvciBhcnJheSwgcmV0dXJuIGl0IGFzIGlzXG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG5cbiAgICBwdWJsaWMgY29weSh3aWRnZXQ6IEFYUFdpZGdldE5vZGUgfCBudWxsID0gdGhpcy5zZWxlY3RlZE5vZGUoKSk6IHZvaWQge1xuICAgICAgICBpZiAoIXdpZGdldClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5jbGlwYm9hcmQuc2V0KGNsb25lRGVlcCh3aWRnZXQpKTsgIC8vIFVzZSBsb2Rhc2gncyBjbG9uZURlZXAgdG8gZW5zdXJlIGEgZGVlcCBjb3B5XG4gICAgfVxuXG4gICAgcHVibGljIGN1dCh3aWRnZXQ6IEFYUFdpZGdldE5vZGUgfCBudWxsID0gdGhpcy5zZWxlY3RlZE5vZGUoKSk6IHZvaWQge1xuICAgICAgICBpZiAoIXdpZGdldClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5jb3B5KHdpZGdldCk7ICAvLyBDb3B5IHRoZSB3aWRnZXQgdG8gdGhlIGNsaXBib2FyZFxuICAgICAgICB0aGlzLnJlbW92ZVdpZGdldCh3aWRnZXQpOyAgLy8gUmV1c2UgdGhlIHJlbW92ZVdpZGdldCBtZXRob2Qgd2hpY2ggc2hvdWxkIGhhbmRsZSB1bmRvIGludGVybmFsbHlcbiAgICB9XG5cblxuICAgIHB1YmxpYyBwYXN0ZShwYXJlbnROb2RlOiBBWFBXaWRnZXROb2RlID0gdGhpcy5zZWxlY3RlZE5vZGUoKSA/PyB0aGlzLnJvb3QoKSk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuY2xpcGJvYXJkKCkgfHwgIXRoaXMuc2VsZWN0ZWROb2RlKCkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJDbGlwYm9hcmQgaXMgZW1wdHkgb3Igbm8gbm9kZSBpcyBzZWxlY3RlZC5cIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZWFyZXN0Q29udGFpbmVyID0gdGhpcy5maW5kTmVhcmVzdENvbnRhaW5lcihwYXJlbnROb2RlLCB0cnVlKTtcbiAgICAgICAgaWYgKCFuZWFyZXN0Q29udGFpbmVyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm8gc3VpdGFibGUgY29udGFpbmVyIGZvdW5kLlwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvL1xuICAgICAgICB0aGlzLnNhdmVTdGF0ZUZvclVuZG8oKTsgIC8vIFByZXBhcmUgZm9yIHVuZG8gZnVuY3Rpb25hbGl0eVxuICAgICAgICAvL1xuICAgICAgICBpZiAoIW5lYXJlc3RDb250YWluZXIuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIG5lYXJlc3RDb250YWluZXIuY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld05vZGUgPSBjbG9uZURlZXAodGhpcy5jbGlwYm9hcmQoKSkhO1xuICAgICAgICBzZXQobmV3Tm9kZSwgXCJfX21ldGFfXy5pZFwiLCBNYXRoLnJhbmRvbSgpICogTWF0aC5wb3coMTAsIDE4KSk7IC8vIEVuc3VyZSBhIHVuaXF1ZSBJRFxuICAgICAgICAvL1xuICAgICAgICBuZWFyZXN0Q29udGFpbmVyLmNoaWxkcmVuLnB1c2gobmV3Tm9kZSk7ICAvLyBBZGQgdGhlIG5ldyBub2RlIHRvIHRoZSBjb250YWluZXJcbiAgICAgICAgdGhpcy5yZWZyZXNoKHsgd2lkZ2V0OiBuZWFyZXN0Q29udGFpbmVyIH0pOyAgLy8gUmVmcmVzaCB0aGUgVUlcbiAgICAgICAgdGhpcy5zZWxlY3QoeyB3aWRnZXQ6IG5ld05vZGUgfSk7ICAvLyBTZWxlY3QgdGhlIG5ld2x5IHBhc3RlZCBub2RlXG4gICAgfVxuXG5cbiAgICBleHBvcnQoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QganNvbiA9IHRoaXMuZm9ybWF0T3V0cHV0SlNPTih0aGlzLnJvb3QoKSwgXCJfX21ldGFfX1wiKTtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGpzb24pO1xuICAgIH1cblxuICAgIGRvd25sb2FkKCkge1xuICAgICAgICAvLyBDb252ZXJ0IHRoZSBvYmplY3QgdG8gYSBKU09OIHN0cmluZ1xuICAgICAgICBjb25zdCBqc29uU3RyID0gdGhpcy5leHBvcnQoKTtcblxuICAgICAgICAvLyBDcmVhdGUgYSBibG9iIG9iamVjdCBmcm9tIHRoZSBKU09OIHN0cmluZ1xuICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2pzb25TdHJdLCB7IHR5cGU6IFwiYXBwbGljYXRpb24vanNvblwiIH0pO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIFVSTCBmb3IgdGhlIGJsb2Igb2JqZWN0XG4gICAgICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IDxhPiBlbGVtZW50IHRvIHRyaWdnZXIgdGhlIGRvd25sb2FkXG4gICAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcbiAgICAgICAgYS5ocmVmID0gdXJsO1xuICAgICAgICBhLmRvd25sb2FkID0gXCJleHBvcnQuanNvblwiO1xuXG4gICAgICAgIC8vIEFwcGVuZCB0aGUgPGE+IGVsZW1lbnQgdG8gdGhlIGRvY3VtZW50IGJvZHkgKG5lY2Vzc2FyeSBmb3Igc29tZSBicm93c2VycylcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcblxuICAgICAgICAvLyBUcmlnZ2VyIHRoZSBkb3dubG9hZCBieSBjbGlja2luZyB0aGUgPGE+IGVsZW1lbnRcbiAgICAgICAgYS5jbGljaygpO1xuXG4gICAgICAgIC8vIENsZWFuIHVwIGJ5IHJldm9raW5nIHRoZSBvYmplY3QgVVJMIGFuZCByZW1vdmluZyB0aGUgPGE+IGVsZW1lbnRcbiAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIGEgd2VsbC1mb3JtZWQsIHVuaXF1ZSBuYW1lIGZvciBhIG5ldyB3aWRnZXQgbm9kZSBiYXNlZCBvbiBpdHMgdHlwZS5cbiAgICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgd2lkZ2V0IChlLmcuLCAndGV4dEJveCcsICdudW1iZXJCb3gnKS5cbiAgICAgKiBAcmV0dXJucyBBIHVuaXF1ZSBuYW1lIGZvciB0aGUgd2lkZ2V0IChlLmcuLCAndGV4dEJveDEnLCAnbnVtYmVyQm94MicpLlxuICAgICAqL1xuICAgIHByaXZhdGUgZ2VuZXJhdGVVbmlxdWVOYW1lKHR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgdHlwZSB0byBmb2xsb3cgY2FtZWxDYXNlIGNvbnZlbnRpb25cbiAgICAgICAgY29uc3QgYmFzZU5hbWUgPSB0eXBlLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgdHlwZS5zbGljZSgxKTtcbiAgICAgICAgbGV0IGluZGV4ID0gMTtcbiAgICAgICAgbGV0IHVuaXF1ZU5hbWUgPSBgJHtiYXNlTmFtZX0ke2luZGV4fWA7XG5cbiAgICAgICAgLy8gR2F0aGVyIGFsbCBleGlzdGluZyBuYW1lcyB0byBjaGVjayBhZ2FpbnN0XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgdGhpcy5jb2xsZWN0QWxsTmFtZXModGhpcy5yb290KCksIGV4aXN0aW5nTmFtZXMpO1xuXG4gICAgICAgIC8vIEluY3JlbWVudCB0aGUgaW5kZXggdW50aWwgYSB1bmlxdWUgbmFtZSBpcyBmb3VuZFxuICAgICAgICB3aGlsZSAoZXhpc3RpbmdOYW1lcy5oYXModW5pcXVlTmFtZSkpIHtcbiAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgICB1bmlxdWVOYW1lID0gYCR7YmFzZU5hbWV9JHtpbmRleH1gO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVuaXF1ZU5hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29sbGVjdHMgYWxsIGV4aXN0aW5nIHdpZGdldCBuYW1lcyBmcm9tIHRoZSB3aWRnZXQgdHJlZS5cbiAgICAgKiBAcGFyYW0gbm9kZSBUaGUgY3VycmVudCBub2RlIGJlaW5nIGluc3BlY3RlZC5cbiAgICAgKiBAcGFyYW0gbmFtZXMgQSBzZXQgdG8gc3RvcmUgZXhpc3RpbmcgbmFtZXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjb2xsZWN0QWxsTmFtZXMobm9kZTogQVhQV2lkZ2V0Tm9kZSwgbmFtZXM6IFNldDxzdHJpbmc+KTogdm9pZCB7XG4gICAgICAgIGlmIChub2RlLm5hbWUpIHtcbiAgICAgICAgICAgIG5hbWVzLmFkZChub2RlLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbGxlY3RBbGxOYW1lcyhjaGlsZCwgbmFtZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG59Il19
356
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcGxhdGZvcm0vbGF5b3V0L2Rlc2lnbmVyL3NyYy9saWIvZGVzaWduZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFzRCx3QkFBd0IsRUFBdUIsTUFBTSxpQ0FBaUMsQ0FBQztBQUNwSixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7O0FBcURwRSxNQUFNLE9BQU8sa0JBQWtCO0lBRC9CO1FBR1ksaUJBQVksR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdEMsMkJBQXNCLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFFakQsbUJBQWMsR0FBRyxNQUFNLENBQUMsQ0FBQSx1QkFBc0MsQ0FBQSxDQUFDLENBQUM7UUFJekUsY0FBUyxHQUFHLE1BQU0sQ0FBdUIsSUFBSSxDQUFDLENBQUM7UUFDaEQsZUFBVSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxJQUFJLElBQUksTUFBTSxDQUFDLENBQUM7UUFDaEcsYUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFT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LEVBQUUsQ0FBQztZQUNuQyxLQUFLLEVBQUUsQ0FBQztZQUNSLFVBQVUsR0FBRyxHQUFHLFFBQVEsR0FBRyxLQUFLLEVBQUUsQ0FBQztRQUN2QyxDQUFDO1FBRUQsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxlQUFlLENBQUMsSUFBbUIsRUFBRSxLQUFrQjtRQUMzRCxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNaLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDdkMsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDOzhHQTdaUSxrQkFBa0I7a0hBQWxCLGtCQUFrQjs7MkZBQWxCLGtCQUFrQjtrQkFEOUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFYUG9wdXBTZXJ2aWNlIH0gZnJvbSAnQGFjb3JleC9jb21wb25lbnRzL3BvcHVwJztcbmltcG9ydCB7IEFYUFdpZGdldENvbXBvbmVudCwgQVhQV2lkZ2V0Q29uZmlnLCBBWFBXaWRnZXROb2RlLCBBWFBXaWRnZXRSZWdpc3RyeVNlcnZpY2UsIEFYUFdpZGdldFJlbmRlck1vZGUgfSBmcm9tICdAYWNvcmV4L3BsYXRmb3JtL2xheW91dC9idWlsZGVyJztcbmltcG9ydCB7IGNvbXB1dGVkLCBpbmplY3QsIEluamVjdGFibGUsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBnZXQsIG1lcmdlLCBzZXQsIHNvcnRCeSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBWFBPYmplY3RIaXN0b3J5TWFuYWdlciB9IGZyb20gJy4vaGlzdG9yeS1tYW5hZ2VyLnNlcnZpY2UnO1xuXG5leHBvcnQgdHlwZSBBWFBEZXNpZ25lclByZXZpZXdTaXplID0gJ3NtJyB8ICdtZCcgfCAnbGcnIHwgJ3hsJyB8ICd4eGwnO1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgQVhQRGVzaWduZXJGb2N1c0NvbW1hbmQge1xuICAgIHdpZGdldDogQVhQV2lkZ2V0Tm9kZSB8IG51bGwsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQVhQRGVzaWduZXJVcGRhdGVDb21tYW5kIHtcbiAgICB2YWx1ZXM6IGFueTtcbiAgICBtb2RlOiBcImluaXRcIiB8IFwidXBkYXRlXCJcbn1cbmV4cG9ydCBpbnRlcmZhY2UgQVhQRGVzaWduZXJVcGRhdGVFdmVudCB7XG4gICAgdmFsdWVzOiBhbnk7XG4gICAgd2lkZ2V0OiBBWFBXaWRnZXROb2RlLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFYUERlc2lnbmVyU2VsZWN0Q29tbWFuZCB7XG4gICAgd2lkZ2V0OiBBWFBXaWRnZXROb2RlLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFYUERlc2lnbmVyUmVnaXN0ZXJDb21tYW5kIHtcbiAgICBpZDogbnVtYmVyLFxuICAgIHdpZGdldDogQVhQV2lkZ2V0Tm9kZSxcbiAgICBjb25maWc6IEFYUFdpZGdldENvbmZpZyxcbiAgICBpbnN0YW5jZTogQVhQV2lkZ2V0Q29tcG9uZW50LFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFYUERlc2lnbmVyU2VsZWN0RXZlbnQge1xuICAgIHdpZGdldDogQVhQV2lkZ2V0Tm9kZSxcbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIEFYUERlc2lnbmVyUmVmcmVzaENvbW1hbmQge1xuICAgIHdpZGdldDogQVhQV2lkZ2V0Tm9kZSxcbn1cbmV4cG9ydCBpbnRlcmZhY2UgQVhQRGVzaWduZXJSZWZyZXNoRXZlbnQge1xuICAgIHdpZGdldDogQVhQV2lkZ2V0Tm9kZSxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBWFBEZXNpZ25lckFkZE5vZGVDb21tYW5kIHtcbiAgICB3aWRnZXQ6IEFYUFdpZGdldE5vZGUsXG59XG5leHBvcnQgaW50ZXJmYWNlIEFYUERlc2lnbmVyQWRkTm9kZUV2ZW50IHtcbiAgICB3aWRnZXQ6IEFYUFdpZGdldE5vZGUsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQVhQRGVzaWduZXJGb2N1c0V2ZW50IHtcbiAgICB3aWRnZXQ6IEFYUFdpZGdldE5vZGUgfCBudWxsLFxufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQVhQRGVzaWduZXJTZXJ2aWNlIHtcblxuICAgIHByaXZhdGUgcG9wdXBTZXJ2aWNlID0gaW5qZWN0KEFYUG9wdXBTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHdpZGdldFJlZ2lzdGVyeVNlcnZpY2UgPSBpbmplY3QoQVhQV2lkZ2V0UmVnaXN0cnlTZXJ2aWNlKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgaGlzdG9yeU1hbmFnZXIgPSBpbmplY3QoQVhQT2JqZWN0SGlzdG9yeU1hbmFnZXI8QVhQV2lkZ2V0Tm9kZT4pO1xuXG5cblxuICAgIHByaXZhdGUgY2xpcGJvYXJkID0gc2lnbmFsPEFYUFdpZGdldE5vZGUgfCBudWxsPihudWxsKTtcbiAgICBwdWJsaWMgY2FuQ3V0Q29weSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc2VsZWN0ZWROb2RlKCkgIT0gbnVsbCAmJiB0aGlzLnNlbGVjdGVkTm9kZSgpPy5uYW1lICE9IFwicGFnZVwiKTtcbiAgICBwdWJsaWMgY2FuUGFzdGUgPSBjb21wdXRlZCgoKSA9PiAodGhpcy5jbGlwYm9hcmQoKSAhPSBudWxsKSk7XG5cblxuICAgIHB1YmxpYyByZWFkb25seSBoaXN0b3J5ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5oaXN0b3J5TWFuYWdlci5oaXN0b3J5KCkpO1xuICAgIHB1YmxpYyByZWFkb25seSBjYW5VbmRvID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5oaXN0b3J5TWFuYWdlci5jYW5VbmRvKCkpO1xuICAgIHB1YmxpYyByZWFkb25seSBjYW5SZWRvID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5oaXN0b3J5TWFuYWdlci5jYW5SZWRvKCkpO1xuXG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgcm9vdCA9IHNpZ25hbCh0aGlzLmNyZWF0ZVBhZ2UoKSk7XG5cbiAgICBwdWJsaWMgYnJlYWRjcnVtYnMgPSBjb21wdXRlZDxBWFBXaWRnZXROb2RlW10+KCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWROb2RlKCkgPyB0aGlzLmZpbmRCcmVhZGNydW1icyh0aGlzLnJvb3QoKSwgdGhpcy5zZWxlY3RlZE5vZGUoKSEpID8/IFtdIDogW107XG4gICAgfSk7XG5cbiAgICBwdWJsaWMgc2VsZWN0ZWROb2RlID0gc2lnbmFsPEFYUFdpZGdldE5vZGUgfCBudWxsPihudWxsKTtcblxuICAgIHByaXZhdGUgX2xhc3RTZWxlY3RlZE5vZGU6IEFYUFdpZGdldE5vZGUgfCBudWxsID0gbnVsbDtcblxuICAgIHByaXZhdGUgX2ZvY3VzZWROb2RlOiBBWFBXaWRnZXROb2RlIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIGZvY3VzZWROb2RlID0gKCkgPT4gdGhpcy5fZm9jdXNlZE5vZGU7XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgbW9kZSA9IHNpZ25hbDxBWFBXaWRnZXRSZW5kZXJNb2RlPignZGVzaWduZXInKTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgc2l6ZSA9IHNpZ25hbDxBWFBEZXNpZ25lclByZXZpZXdTaXplPigneGwnKTtcblxuICAgIHB1YmxpYyByZWFkb25seSBvblNlbGVjdGVkID0gbmV3IFN1YmplY3Q8QVhQRGVzaWduZXJTZWxlY3RFdmVudD4oKTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgb25SZWZyZXNoID0gbmV3IFN1YmplY3Q8QVhQRGVzaWduZXJSZWZyZXNoRXZlbnQ+KCk7XG4gICAgcHVibGljIHJlYWRvbmx5IG9uVXBkYXRlID0gbmV3IFN1YmplY3Q8QVhQRGVzaWduZXJVcGRhdGVFdmVudD4oKTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgb25Gb2N1c2VkID0gbmV3IFN1YmplY3Q8QVhQRGVzaWduZXJGb2N1c0V2ZW50PigpO1xuXG5cbiAgICBwdWJsaWMgcmVnaXN0ZXIoY29tbWFuZDogQVhQRGVzaWduZXJSZWdpc3RlckNvbW1hbmQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLl9sYXN0U2VsZWN0ZWROb2RlKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdCh7IHdpZGdldDogY29tbWFuZC53aWRnZXQgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdCh7IHdpZGdldDogdGhpcy5fbGFzdFNlbGVjdGVkTm9kZSB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZWxlY3QoY29tbWFuZDogQVhQRGVzaWduZXJTZWxlY3RDb21tYW5kKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWROb2RlLnNldChjb21tYW5kLndpZGdldCk7XG4gICAgICAgIHRoaXMuX2xhc3RTZWxlY3RlZE5vZGUgPSB0aGlzLnNlbGVjdGVkTm9kZSgpO1xuICAgICAgICB0aGlzLm9uU2VsZWN0ZWQubmV4dChjb21tYW5kKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlKGNvbW1hbmQ6IEFYUERlc2lnbmVyVXBkYXRlQ29tbWFuZCk6IHZvaWQge1xuICAgICAgICBpZiAoY29tbWFuZC5tb2RlID09ICd1cGRhdGUnKSB7XG4gICAgICAgICAgICB0aGlzLmhpc3RvcnlNYW5hZ2VyLnNhdmVTdGF0ZShjbG9uZURlZXAodGhpcy5yb290KCkpLCBgVXBkYXRlZCAke3RoaXMuc2VsZWN0ZWROb2RlKCk/Lm5hbWV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3RlZE5vZGUudXBkYXRlKGMgPT4gbWVyZ2UodGhpcy5zZWxlY3RlZE5vZGUoKSwgY29tbWFuZC52YWx1ZXMpKTtcbiAgICAgICAgdGhpcy5vblVwZGF0ZS5uZXh0KHsgd2lkZ2V0OiB0aGlzLnNlbGVjdGVkTm9kZSgpISwgdmFsdWVzOiBjb21tYW5kLnZhbHVlcyB9KTtcbiAgICB9XG5cblxuXG4gICAgcHVibGljIGZvY3VzKGNvbW1hbmQ6IEFYUERlc2lnbmVyRm9jdXNDb21tYW5kKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9mb2N1c2VkTm9kZSAhPSBjb21tYW5kLndpZGdldCkge1xuICAgICAgICAgICAgdGhpcy5fZm9jdXNlZE5vZGUgPSBjb21tYW5kLndpZGdldDtcbiAgICAgICAgICAgIHRoaXMub25Gb2N1c2VkLm5leHQoeyB3aWRnZXQ6IHRoaXMuX2ZvY3VzZWROb2RlIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlZnJlc2goY29tbWFuZDogQVhQRGVzaWduZXJSZWZyZXNoQ29tbWFuZCkge1xuICAgICAgICB0aGlzLm9uUmVmcmVzaC5uZXh0KHsgd2lkZ2V0OiBjb21tYW5kLndpZGdldCB9KTtcbiAgICB9XG5cblxuICAgIHByaXZhdGUgZmluZEJyZWFkY3J1bWJzKFxuICAgICAgICBub2RlOiBBWFBXaWRnZXROb2RlLFxuICAgICAgICB0YXJnZXROb2RlOiBBWFBXaWRnZXROb2RlLFxuICAgICAgICBicmVhZGNydW1iOiBBWFBXaWRnZXROb2RlW10gPSBbXVxuICAgICk6IEFYUFdpZGdldE5vZGVbXSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIC8vIEFkZCB0aGUgY3VycmVudCBub2RlIHRvIHRoZSBicmVhZGNydW1iIHBhdGhcbiAgICAgICAgY29uc3QgY3VycmVudEJyZWFkY3J1bWIgPSBbLi4uYnJlYWRjcnVtYiwgbm9kZV07XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGN1cnJlbnQgbm9kZSBpcyB0aGUgdGFyZ2V0IG5vZGVcbiAgICAgICAgaWYgKG5vZGUgPT09IHRhcmdldE5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50QnJlYWRjcnVtYjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBub2RlIGhhcyBjaGlsZHJlbiwgcmVjdXJzaXZlbHkgc2VhcmNoIHRoZW1cbiAgICAgICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZmluZEJyZWFkY3J1bWJzKGNoaWxkLCB0YXJnZXROb2RlLCBjdXJyZW50QnJlYWRjcnVtYik7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJldHVybiB1bmRlZmluZWQgaWYgbm8gbWF0Y2ggaXMgZm91bmRcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cblxuICAgIGFzeW5jIHNob3dQaWNrZXIoY3VycmVudE5vZGU6IEFYUFdpZGdldE5vZGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgY29tID0gYXdhaXQgaW1wb3J0KCcuL3dpZGdldC1waWNrZXIvd2lkZ2V0LXBpY2tlci5jb21wb25lbnQnKS50aGVuKGMgPT4gYy5BWFBEZXNpZ25lcldpZGdldFBpY2tlckNvbXBvbmVudCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucG9wdXBTZXJ2aWNlLm9wZW4oY29tLCB7XG4gICAgICAgICAgICB0aXRsZTogXCJXaWRnZXQgR2FsbGVyeVwiLFxuICAgICAgICAgICAgc2l6ZTogJ21kJyxcbiAgICAgICAgICAgIGNsb3NlQnV0dG9uOiB0cnVlLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIHdpZGdldHM6IHNvcnRCeSh0aGlzLndpZGdldFJlZ2lzdGVyeVNlcnZpY2UuYWxsKCkuZmlsdGVyKGMgPT4gYy52aXNpYmxlICE9IGZhbHNlKSwgYyA9PiBjLnRpdGxlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICgocmVzdWx0LmRhdGE/LndpZGdldHMgPz8gW10pLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSByZXN1bHQuZGF0YT8ud2lkZ2V0cyBhcyBBWFBXaWRnZXRDb25maWdbXTtcbiAgICAgICAgICAgIHNlbGVjdGVkLmZvckVhY2goYyA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRXaWRnZXQoY3VycmVudE5vZGUsIHsgdHlwZTogYy5uYW1lIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlUGFnZSgpOiBBWFBXaWRnZXROb2RlIHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy53aWRnZXRSZWdpc3RlcnlTZXJ2aWNlLnJlc29sdmUoJ3BhZ2UnKTtcblxuICAgICAgICBjb25zdCBwYWdlOiBBWFBXaWRnZXROb2RlID0ge1xuICAgICAgICAgICAgdHlwZTogJ3BhZ2UnLFxuICAgICAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAgICAgbmFtZTogXCJwYWdlXCIsXG4gICAgICAgIH1cblxuICAgICAgICBzZXQocGFnZSwgJ19fbWV0YV9fLmlkJywgTWF0aC5yYW5kb20oKSAqIE1hdGgucG93KDEwLCAxOCkpO1xuICAgICAgICBzZXQocGFnZSwgJ19fbWV0YV9fLmNvbmZpZycsIGNvbmZpZyk7XG4gICAgICAgIHRoaXMuaGlzdG9yeU1hbmFnZXIuc2F2ZVN0YXRlKHBhZ2UsIFwiTmV3XCIpO1xuICAgICAgICByZXR1cm4gcGFnZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmluZFdpZGdldEJ5SWQocm9vdDogQVhQV2lkZ2V0Tm9kZSwgaWQ6IHN0cmluZyk6IEFYUFdpZGdldE5vZGUgfCBudWxsIHtcbiAgICAgICAgaWYgKGdldChyb290LCBcIl9fbWV0YV9fLmlkXCIpID09PSBpZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJvb3Q7ICAvLyBSZXR1cm4gdGhlIHJvb3QgaWYgaXQgbWF0Y2hlcyB0aGUgSURcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJvb3QuY2hpbGRyZW4pIHJldHVybiBudWxsO1xuXG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygcm9vdC5jaGlsZHJlbikge1xuICAgICAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLmZpbmRXaWRnZXRCeUlkKGNoaWxkLCBpZCk7XG4gICAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZm91bmQ7ICAvLyBSZXR1cm4gdGhlIGZvdW5kIGNoaWxkXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDsgIC8vIE5vZGUgbm90IGZvdW5kXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kUGFyZW50KGlkOiBzdHJpbmcsIHBhcmVudDogQVhQV2lkZ2V0Tm9kZSA9IHRoaXMucm9vdCgpKTogQVhQV2lkZ2V0Tm9kZSB8IG51bGwge1xuICAgICAgICBpZiAoIXBhcmVudC5jaGlsZHJlbikgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgaWYgKHBhcmVudC5jaGlsZHJlbi5zb21lKGNoaWxkID0+IGdldChjaGlsZCwgXCJfX21ldGFfXy5pZFwiKSA9PT0gaWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50OyAgLy8gUmV0dXJuIHRoaXMgbm9kZSBhcyBpdCdzIHRoZSBwYXJlbnQgb2YgdGhlIG5vZGUgd2l0aCB0aGUgZ2l2ZW4gSURcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgcGFyZW50LmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBjb25zdCBmb3VuZFBhcmVudCA9IHRoaXMuZmluZFBhcmVudChpZCwgY2hpbGQpO1xuICAgICAgICAgICAgaWYgKGZvdW5kUGFyZW50KSByZXR1cm4gZm91bmRQYXJlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDsgIC8vIE5vIHBhcmVudCBmb3VuZFxuICAgIH1cblxuICAgIHByaXZhdGUgZmluZE5lYXJlc3RDb250YWluZXIobm9kZTogQVhQV2lkZ2V0Tm9kZSwgc2VhcmNoVXB3YXJkOiBib29sZWFuID0gdHJ1ZSk6IEFYUFdpZGdldE5vZGUgfCBudWxsIHtcbiAgICAgICAgaWYgKHNlYXJjaFVwd2FyZCkge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnQ6IEFYUFdpZGdldE5vZGUgfCBudWxsID0gbm9kZTtcbiAgICAgICAgICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy53aWRnZXRSZWdpc3RlcnlTZXJ2aWNlLnJlc29sdmUoY3VycmVudC50eXBlKTtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnICYmIGNvbmZpZy5jb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0aGlzLmZpbmRQYXJlbnQoZ2V0KGN1cnJlbnQsIFwiX19tZXRhX18uaWRcIikhKTsgLy8gVXNlIGZpbmRQYXJlbnQgdG8gbmF2aWdhdGUgdXB3YXJkc1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUmVjdXJzaXZlIHNlYXJjaCB0byBmaW5kIHRoZSBmaXJzdCBjb250YWluZXIgYW1vbmcgY2hpbGRyZW5cbiAgICAgICAgICAgIGlmIChub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMud2lkZ2V0UmVnaXN0ZXJ5U2VydmljZS5yZXNvbHZlKGNoaWxkLnR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnICYmIGNvbmZpZy5jb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3VuZENvbnRhaW5lciA9IHRoaXMuZmluZE5lYXJlc3RDb250YWluZXIoY2hpbGQsIGZhbHNlKTsgLy8gQ29udGludWUgc2VhcmNoaW5nIGRvd253YXJkc1xuICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRDb250YWluZXIpIHJldHVybiBmb3VuZENvbnRhaW5lcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7IC8vIFJldHVybiBudWxsIGlmIG5vIGNvbnRhaW5lciBmb3VuZFxuICAgIH1cblxuICAgIGFkZFdpZGdldChjdXJyZW50Tm9kZTogQVhQV2lkZ2V0Tm9kZSwgbm9kZTogQVhQV2lkZ2V0Tm9kZSk6IEFYUFdpZGdldE5vZGUgfCBudWxsIHtcbiAgICAgICAgaWYgKCFjdXJyZW50Tm9kZSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAvL1xuICAgICAgICBjb25zdCBjbG9uZWQgPSBjbG9uZURlZXAobm9kZSk7XG4gICAgICAgIHRoaXMuaGlzdG9yeU1hbmFnZXIuc2F2ZVN0YXRlKGNsb25lRGVlcCh0aGlzLnJvb3QoKSksIGBBZGRlZCAke2Nsb25lZC50eXBlfWApO1xuICAgICAgICAvL1xuICAgICAgICBpZiAoIWN1cnJlbnROb2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBjdXJyZW50Tm9kZS5jaGlsZHJlbiA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy53aWRnZXRSZWdpc3RlcnlTZXJ2aWNlLnJlc29sdmUobm9kZS50eXBlKTtcbiAgICAgICAgLy9cbiAgICAgICAgY2xvbmVkLm5hbWUgPSB0aGlzLmdlbmVyYXRlVW5pcXVlTmFtZShub2RlLnR5cGUpO1xuICAgICAgICBzZXQoY2xvbmVkLCAnX19tZXRhX18uaWQnLCBNYXRoLnJhbmRvbSgpICogTWF0aC5wb3coMTAsIDE4KSk7XG4gICAgICAgIHNldChjbG9uZWQsICdfX21ldGFfXy5jb25maWcnLCBjb25maWcpO1xuICAgICAgICAvL1xuICAgICAgICBjdXJyZW50Tm9kZS5jaGlsZHJlbi5wdXNoKGNsb25lZCk7XG4gICAgICAgIC8vXG4gICAgICAgIHRoaXMuaGlzdG9yeU1hbmFnZXIudXBkYXRlU3RhdGUodGhpcy5yb290KCkpO1xuICAgICAgICAvL1xuICAgICAgICB0aGlzLnJlZnJlc2goeyB3aWRnZXQ6IGN1cnJlbnROb2RlIH0pO1xuICAgICAgICB0aGlzLnNlbGVjdCh7IHdpZGdldDogY2xvbmVkIH0pO1xuICAgICAgICByZXR1cm4gY2xvbmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVXaWRnZXQobm9kZTogQVhQV2lkZ2V0Tm9kZSk6IHZvaWQge1xuICAgICAgICBpZiAobm9kZS50eXBlID09PSBcInBhZ2VcIikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkNhbm5vdCByZW1vdmUgdGhlIHBhZ2Ugbm9kZS5cIik7XG4gICAgICAgICAgICByZXR1cm47ICAvLyBQcmV2ZW50IHJlbW92aW5nIHRoZSByb290IHBhZ2Ugbm9kZVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oaXN0b3J5TWFuYWdlci5zYXZlU3RhdGUoY2xvbmVEZWVwKHRoaXMucm9vdCgpKSwgYFJlbW92ZWQgJHtub2RlLm5hbWV9YCk7XG5cbiAgICAgICAgY29uc3Qgbm9kZUlkVG9SZW1vdmUgPSBnZXQobm9kZSwgXCJfX21ldGFfXy5pZFwiKTtcbiAgICAgICAgaWYgKCFub2RlSWRUb1JlbW92ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZSBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgX19tZXRhX18uaWQgdG8gaWRlbnRpZnkgaXQgZm9yIHJlbW92YWwuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmluZCB0aGUgcGFyZW50IG9mIHRoZSBub2RlIHRvIHJlbW92ZSBpdFxuICAgICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLmZpbmRQYXJlbnQobm9kZUlkVG9SZW1vdmUsIHRoaXMucm9vdCgpKTtcbiAgICAgICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBhcmVudCBub2RlIG5vdCBmb3VuZC4gVGhlIG5vZGUgbWlnaHQgYmUgdGhlIHJvb3Qgbm9kZSBvciBkb2VzIG5vdCBleGlzdC5cIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbmRleCA9IHBhcmVudC5jaGlsZHJlbj8uZmluZEluZGV4KGNoaWxkID0+IGdldChjaGlsZCwgXCJfX21ldGFfXy5pZFwiKSA9PT0gbm9kZUlkVG9SZW1vdmUpID8/IC0xO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgcGFyZW50LmNoaWxkcmVuIS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHRoaXMuaGlzdG9yeU1hbmFnZXIudXBkYXRlU3RhdGUodGhpcy5yb290KCkpO1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHRoaXMucmVmcmVzaCh7IHdpZGdldDogcGFyZW50IH0pOyAgLy8gUmVmcmVzaCB0aGUgVUkgdG8gcmVmbGVjdCBjaGFuZ2VzXG4gICAgICAgICAgICB0aGlzLnNlbGVjdCh7IHdpZGdldDogcGFyZW50IH0pOyAgLy8gU2VsZWN0IHRoZSBwYXJlbnQgbm9kZSBhZnRlciByZW1vdmFsXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlIHRvIHJlbW92ZSBub3QgZm91bmQgaW4gdGhlIHdpZGdldCB0cmVlLlwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyByZXZlcnRUb0NoYW5nZShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGlzdG9yeU1hbmFnZXIucmV2ZXJ0KGluZGV4KTtcbiAgICAgICAgdGhpcy5yb290LnNldCh0aGlzLmhpc3RvcnlNYW5hZ2VyLmN1cnJlbnRTdGF0ZSgpPy5zdGF0ZSk7XG4gICAgICAgIHRoaXMucmVmcmVzaCh7IHdpZGdldDogdGhpcy5yb290KCkgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlZG8oKSB7XG4gICAgICAgIGlmICh0aGlzLmhpc3RvcnlNYW5hZ2VyLmNhblJlZG8oKSkge1xuICAgICAgICAgICAgdGhpcy5oaXN0b3J5TWFuYWdlci5yZWRvKCk7XG4gICAgICAgICAgICB0aGlzLnJvb3Quc2V0KHRoaXMuaGlzdG9yeU1hbmFnZXIuY3VycmVudFN0YXRlKCk/LnN0YXRlKTtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaCh7IHdpZGdldDogdGhpcy5yb290KCkgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdW5kbygpIHtcbiAgICAgICAgaWYgKHRoaXMuaGlzdG9yeU1hbmFnZXIuY2FuVW5kbygpKSB7XG4gICAgICAgICAgICB0aGlzLmhpc3RvcnlNYW5hZ2VyLnVuZG8oKTtcbiAgICAgICAgICAgIHRoaXMucm9vdC5zZXQodGhpcy5oaXN0b3J5TWFuYWdlci5jdXJyZW50U3RhdGUoKT8uc3RhdGUpO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoKHsgd2lkZ2V0OiB0aGlzLnJvb3QoKSB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgcHJpdmF0ZSBmb3JtYXRPdXRwdXRKU09OKG9iajogYW55LCBub2RlTmFtZTogc3RyaW5nKTogYW55IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIG9iamVjdCBpcyBhbiBhcnJheVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqLm1hcChpdGVtID0+IHRoaXMuZm9ybWF0T3V0cHV0SlNPTihpdGVtLCBub2RlTmFtZSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IG9iamVjdCB0byBzdG9yZSB0aGUgcmVzdWx0XG4gICAgICAgICAgICBsZXQgbmV3T2JqOiBhbnkgPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgICAgICAvLyBPbmx5IGFkZCB0aGUga2V5IGlmIGl0J3Mgbm90IHRoZSBub2RlTmFtZSB3ZSB3YW50IHRvIHJlbW92ZVxuICAgICAgICAgICAgICAgIGlmIChrZXkgIT09IG5vZGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld09ialtrZXldID0gdGhpcy5mb3JtYXRPdXRwdXRKU09OKG9ialtrZXldLCBub2RlTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ld09iajtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGUgdmFsdWUgaXMgbm90IGFuIG9iamVjdCBvciBhcnJheSwgcmV0dXJuIGl0IGFzIGlzXG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG5cbiAgICBwdWJsaWMgY29weSh3aWRnZXQ6IEFYUFdpZGdldE5vZGUgfCBudWxsID0gdGhpcy5zZWxlY3RlZE5vZGUoKSk6IHZvaWQge1xuICAgICAgICBpZiAoIXdpZGdldClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5jbGlwYm9hcmQuc2V0KGNsb25lRGVlcCh3aWRnZXQpKTsgIC8vIFVzZSBsb2Rhc2gncyBjbG9uZURlZXAgdG8gZW5zdXJlIGEgZGVlcCBjb3B5XG4gICAgfVxuXG4gICAgcHVibGljIGN1dCh3aWRnZXQ6IEFYUFdpZGdldE5vZGUgfCBudWxsID0gdGhpcy5zZWxlY3RlZE5vZGUoKSk6IHZvaWQge1xuICAgICAgICBpZiAoIXdpZGdldClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5jb3B5KHdpZGdldCk7ICAvLyBDb3B5IHRoZSB3aWRnZXQgdG8gdGhlIGNsaXBib2FyZFxuICAgICAgICB0aGlzLnJlbW92ZVdpZGdldCh3aWRnZXQpOyAgLy8gUmV1c2UgdGhlIHJlbW92ZVdpZGdldCBtZXRob2Qgd2hpY2ggc2hvdWxkIGhhbmRsZSB1bmRvIGludGVybmFsbHlcbiAgICB9XG5cblxuICAgIHB1YmxpYyBwYXN0ZShwYXJlbnROb2RlOiBBWFBXaWRnZXROb2RlID0gdGhpcy5zZWxlY3RlZE5vZGUoKSA/PyB0aGlzLnJvb3QoKSk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuY2xpcGJvYXJkKCkgfHwgIXRoaXMuc2VsZWN0ZWROb2RlKCkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJDbGlwYm9hcmQgaXMgZW1wdHkgb3Igbm8gbm9kZSBpcyBzZWxlY3RlZC5cIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3Tm9kZSA9IGNsb25lRGVlcCh0aGlzLmNsaXBib2FyZCgpKSE7XG4gICAgICAgIGNvbnN0IG5lYXJlc3RDb250YWluZXIgPSB0aGlzLmZpbmROZWFyZXN0Q29udGFpbmVyKHBhcmVudE5vZGUsIHRydWUpO1xuICAgICAgICBpZiAoIW5lYXJlc3RDb250YWluZXIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJObyBzdWl0YWJsZSBjb250YWluZXIgZm91bmQuXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vXG4gICAgICAgIHRoaXMuaGlzdG9yeU1hbmFnZXIuc2F2ZVN0YXRlKG5ld05vZGUsIGBQYXN0ZWQgJHtuZXdOb2RlLm5hbWV9YCk7ICAvLyBQcmVwYXJlIGZvciB1bmRvIGZ1bmN0aW9uYWxpdHlcbiAgICAgICAgLy9cbiAgICAgICAgaWYgKCFuZWFyZXN0Q29udGFpbmVyLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBuZWFyZXN0Q29udGFpbmVyLmNoaWxkcmVuID0gW107XG4gICAgICAgIH1cblxuXG4gICAgICAgIHNldChuZXdOb2RlLCBcIl9fbWV0YV9fLmlkXCIsIE1hdGgucmFuZG9tKCkgKiBNYXRoLnBvdygxMCwgMTgpKTsgLy8gRW5zdXJlIGEgdW5pcXVlIElEXG4gICAgICAgIC8vXG4gICAgICAgIG5lYXJlc3RDb250YWluZXIuY2hpbGRyZW4ucHVzaChuZXdOb2RlKTsgIC8vIEFkZCB0aGUgbmV3IG5vZGUgdG8gdGhlIGNvbnRhaW5lclxuICAgICAgICAvL1xuICAgICAgICB0aGlzLmhpc3RvcnlNYW5hZ2VyLnVwZGF0ZVN0YXRlKHRoaXMucm9vdCgpKTtcbiAgICAgICAgLy9cbiAgICAgICAgdGhpcy5yZWZyZXNoKHsgd2lkZ2V0OiBuZWFyZXN0Q29udGFpbmVyIH0pOyAgLy8gUmVmcmVzaCB0aGUgVUlcbiAgICAgICAgdGhpcy5zZWxlY3QoeyB3aWRnZXQ6IG5ld05vZGUgfSk7ICAvLyBTZWxlY3QgdGhlIG5ld2x5IHBhc3RlZCBub2RlXG4gICAgfVxuXG5cbiAgICBleHBvcnQoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QganNvbiA9IHRoaXMuZm9ybWF0T3V0cHV0SlNPTih0aGlzLnJvb3QoKSwgXCJfX21ldGFfX1wiKTtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGpzb24pO1xuICAgIH1cblxuICAgIGRvd25sb2FkKCkge1xuICAgICAgICAvLyBDb252ZXJ0IHRoZSBvYmplY3QgdG8gYSBKU09OIHN0cmluZ1xuICAgICAgICBjb25zdCBqc29uU3RyID0gdGhpcy5leHBvcnQoKTtcblxuICAgICAgICAvLyBDcmVhdGUgYSBibG9iIG9iamVjdCBmcm9tIHRoZSBKU09OIHN0cmluZ1xuICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2pzb25TdHJdLCB7IHR5cGU6IFwiYXBwbGljYXRpb24vanNvblwiIH0pO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIFVSTCBmb3IgdGhlIGJsb2Igb2JqZWN0XG4gICAgICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IDxhPiBlbGVtZW50IHRvIHRyaWdnZXIgdGhlIGRvd25sb2FkXG4gICAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcbiAgICAgICAgYS5ocmVmID0gdXJsO1xuICAgICAgICBhLmRvd25sb2FkID0gXCJleHBvcnQuanNvblwiO1xuXG4gICAgICAgIC8vIEFwcGVuZCB0aGUgPGE+IGVsZW1lbnQgdG8gdGhlIGRvY3VtZW50IGJvZHkgKG5lY2Vzc2FyeSBmb3Igc29tZSBicm93c2VycylcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcblxuICAgICAgICAvLyBUcmlnZ2VyIHRoZSBkb3dubG9hZCBieSBjbGlja2luZyB0aGUgPGE+IGVsZW1lbnRcbiAgICAgICAgYS5jbGljaygpO1xuXG4gICAgICAgIC8vIENsZWFuIHVwIGJ5IHJldm9raW5nIHRoZSBvYmplY3QgVVJMIGFuZCByZW1vdmluZyB0aGUgPGE+IGVsZW1lbnRcbiAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIGEgd2VsbC1mb3JtZWQsIHVuaXF1ZSBuYW1lIGZvciBhIG5ldyB3aWRnZXQgbm9kZSBiYXNlZCBvbiBpdHMgdHlwZS5cbiAgICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgd2lkZ2V0IChlLmcuLCAndGV4dEJveCcsICdudW1iZXJCb3gnKS5cbiAgICAgKiBAcmV0dXJucyBBIHVuaXF1ZSBuYW1lIGZvciB0aGUgd2lkZ2V0IChlLmcuLCAndGV4dEJveDEnLCAnbnVtYmVyQm94MicpLlxuICAgICAqL1xuICAgIHByaXZhdGUgZ2VuZXJhdGVVbmlxdWVOYW1lKHR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgdHlwZSB0byBmb2xsb3cgY2FtZWxDYXNlIGNvbnZlbnRpb25cbiAgICAgICAgY29uc3QgYmFzZU5hbWUgPSB0eXBlLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgdHlwZS5zbGljZSgxKTtcbiAgICAgICAgbGV0IGluZGV4ID0gMTtcbiAgICAgICAgbGV0IHVuaXF1ZU5hbWUgPSBgJHtiYXNlTmFtZX0ke2luZGV4fWA7XG5cbiAgICAgICAgLy8gR2F0aGVyIGFsbCBleGlzdGluZyBuYW1lcyB0byBjaGVjayBhZ2FpbnN0XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgdGhpcy5jb2xsZWN0QWxsTmFtZXModGhpcy5yb290KCksIGV4aXN0aW5nTmFtZXMpO1xuXG4gICAgICAgIC8vIEluY3JlbWVudCB0aGUgaW5kZXggdW50aWwgYSB1bmlxdWUgbmFtZSBpcyBmb3VuZFxuICAgICAgICB3aGlsZSAoZXhpc3RpbmdOYW1lcy5oYXModW5pcXVlTmFtZSkpIHtcbiAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgICB1bmlxdWVOYW1lID0gYCR7YmFzZU5hbWV9JHtpbmRleH1gO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVuaXF1ZU5hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29sbGVjdHMgYWxsIGV4aXN0aW5nIHdpZGdldCBuYW1lcyBmcm9tIHRoZSB3aWRnZXQgdHJlZS5cbiAgICAgKiBAcGFyYW0gbm9kZSBUaGUgY3VycmVudCBub2RlIGJlaW5nIGluc3BlY3RlZC5cbiAgICAgKiBAcGFyYW0gbmFtZXMgQSBzZXQgdG8gc3RvcmUgZXhpc3RpbmcgbmFtZXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjb2xsZWN0QWxsTmFtZXMobm9kZTogQVhQV2lkZ2V0Tm9kZSwgbmFtZXM6IFNldDxzdHJpbmc+KTogdm9pZCB7XG4gICAgICAgIGlmIChub2RlLm5hbWUpIHtcbiAgICAgICAgICAgIG5hbWVzLmFkZChub2RlLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbGxlY3RBbGxOYW1lcyhjaGlsZCwgbmFtZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG59Il19
@@ -0,0 +1,24 @@
1
+ import { AXDecoratorModule } from '@acorex/components/decorators';
2
+ import { AXMenuModule } from '@acorex/components/menu';
3
+ import { CommonModule } from '@angular/common';
4
+ import { Component, inject } from '@angular/core';
5
+ import { AXPDesignerService } from '../designer.service';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@acorex/components/decorators";
8
+ import * as i2 from "@acorex/components/menu";
9
+ export class AXPDesignerHeaderMenuComponent {
10
+ constructor() {
11
+ this.service = inject(AXPDesignerService);
12
+ }
13
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: AXPDesignerHeaderMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
14
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.0", type: AXPDesignerHeaderMenuComponent, isStandalone: true, selector: "axp-designer-header-menu", ngImport: i0, template: "<ax-menu [openOn]=\"'hover'\">\n <ax-menu-item text=\"Home\">\n <ax-menu-item text=\"New\"></ax-menu-item>\n <ax-menu-item text=\"Export\">\n <ax-menu-item text=\"Download JSON\" (onClick)=\"service.download()\">\n </ax-menu-item>\n </ax-menu-item>\n </ax-menu-item>\n <ax-menu-item text=\"Edit\">\n <ax-menu-item text=\"Undo\" [disabled]=\"!service.canUndo()\" (onClick)=\"service.undo()\">\n <ax-prefix>\n <ax-icon>\n <i class=\"fa-solid fa-rotate-left\"></i>\n </ax-icon>\n </ax-prefix>\n <ax-suffix>\n <ax-text>\n Ctrl+Z\n </ax-text>\n </ax-suffix>\n </ax-menu-item>\n <ax-menu-item text=\"Redo\" [disabled]=\"!service.canRedo()\" (onClick)=\"service.redo()\">\n <ax-prefix>\n <ax-icon>\n <i class=\"fa-solid fa-rotate-right\"></i>\n </ax-icon>\n </ax-prefix>\n <ax-suffix>\n <ax-text>\n Ctrl+Y\n </ax-text>\n </ax-suffix>\n </ax-menu-item>\n <ax-divider></ax-divider>\n <ax-menu-item text=\"Cut\" [disabled]=\"!service.canCutCopy()\" (onClick)=\"service.cut()\">\n <ax-prefix>\n <ax-icon>\n <i class=\"fa-solid fa-cut\"></i>\n </ax-icon>\n </ax-prefix>\n <ax-suffix>\n <ax-text>\n Ctrl+X\n </ax-text>\n </ax-suffix>\n </ax-menu-item>\n <ax-menu-item text=\"Copy\" [disabled]=\"!service.canCutCopy()\" (onClick)=\"service.copy()\">\n <ax-prefix>\n <ax-icon>\n <i class=\"fa-solid fa-copy\"></i>\n </ax-icon>\n </ax-prefix>\n <ax-suffix>\n <ax-text>\n Ctrl+C\n </ax-text>\n </ax-suffix>\n </ax-menu-item>\n <ax-menu-item text=\"Paste\" [disabled]=\"!service.canPaste()\" (onClick)=\"service.paste()\">\n <ax-prefix>\n <ax-icon>\n <i class=\"fa-solid fa-paste\"></i>\n </ax-icon>\n </ax-prefix>\n <ax-suffix>\n <ax-text>\n Ctrl+V\n </ax-text>\n </ax-suffix>\n </ax-menu-item>\n </ax-menu-item>\n <ax-menu-item text=\"Help\">\n <ax-menu-item text=\"About\"></ax-menu-item>\n </ax-menu-item>\n</ax-menu>", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-sub-title, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXMenuModule }, { kind: "component", type: i2.AXMenuItemComponent, selector: "ax-menu-item", inputs: ["disabled", "text", "active"], outputs: ["activeChange", "onClick"] }, { kind: "component", type: i2.AXMenuComponent, selector: "ax-menu", inputs: ["orientation", "openOn"] }] }); }
15
+ }
16
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: AXPDesignerHeaderMenuComponent, decorators: [{
17
+ type: Component,
18
+ args: [{ standalone: true, imports: [
19
+ CommonModule,
20
+ AXDecoratorModule,
21
+ AXMenuModule,
22
+ ], selector: 'axp-designer-header-menu', template: "<ax-menu [openOn]=\"'hover'\">\n <ax-menu-item text=\"Home\">\n <ax-menu-item text=\"New\"></ax-menu-item>\n <ax-menu-item text=\"Export\">\n <ax-menu-item text=\"Download JSON\" (onClick)=\"service.download()\">\n </ax-menu-item>\n </ax-menu-item>\n </ax-menu-item>\n <ax-menu-item text=\"Edit\">\n <ax-menu-item text=\"Undo\" [disabled]=\"!service.canUndo()\" (onClick)=\"service.undo()\">\n <ax-prefix>\n <ax-icon>\n <i class=\"fa-solid fa-rotate-left\"></i>\n </ax-icon>\n </ax-prefix>\n <ax-suffix>\n <ax-text>\n Ctrl+Z\n </ax-text>\n </ax-suffix>\n </ax-menu-item>\n <ax-menu-item text=\"Redo\" [disabled]=\"!service.canRedo()\" (onClick)=\"service.redo()\">\n <ax-prefix>\n <ax-icon>\n <i class=\"fa-solid fa-rotate-right\"></i>\n </ax-icon>\n </ax-prefix>\n <ax-suffix>\n <ax-text>\n Ctrl+Y\n </ax-text>\n </ax-suffix>\n </ax-menu-item>\n <ax-divider></ax-divider>\n <ax-menu-item text=\"Cut\" [disabled]=\"!service.canCutCopy()\" (onClick)=\"service.cut()\">\n <ax-prefix>\n <ax-icon>\n <i class=\"fa-solid fa-cut\"></i>\n </ax-icon>\n </ax-prefix>\n <ax-suffix>\n <ax-text>\n Ctrl+X\n </ax-text>\n </ax-suffix>\n </ax-menu-item>\n <ax-menu-item text=\"Copy\" [disabled]=\"!service.canCutCopy()\" (onClick)=\"service.copy()\">\n <ax-prefix>\n <ax-icon>\n <i class=\"fa-solid fa-copy\"></i>\n </ax-icon>\n </ax-prefix>\n <ax-suffix>\n <ax-text>\n Ctrl+C\n </ax-text>\n </ax-suffix>\n </ax-menu-item>\n <ax-menu-item text=\"Paste\" [disabled]=\"!service.canPaste()\" (onClick)=\"service.paste()\">\n <ax-prefix>\n <ax-icon>\n <i class=\"fa-solid fa-paste\"></i>\n </ax-icon>\n </ax-prefix>\n <ax-suffix>\n <ax-text>\n Ctrl+V\n </ax-text>\n </ax-suffix>\n </ax-menu-item>\n </ax-menu-item>\n <ax-menu-item text=\"Help\">\n <ax-menu-item text=\"About\"></ax-menu-item>\n </ax-menu-item>\n</ax-menu>" }]
23
+ }] });
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhZGVyLW1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wbGF0Zm9ybS9sYXlvdXQvZGVzaWduZXIvc3JjL2xpYi9oZWFkZXItbWVudS9oZWFkZXItbWVudS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3BsYXRmb3JtL2xheW91dC9kZXNpZ25lci9zcmMvbGliL2hlYWRlci1tZW51L2hlYWRlci1tZW51LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7QUFhekQsTUFBTSxPQUFPLDhCQUE4QjtJQVgzQztRQVljLFlBQU8sR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztLQUNsRDs4R0FGWSw4QkFBOEI7a0dBQTlCLDhCQUE4QixvRkNqQjNDLG9tRkEwRVUsMkNEakVGLFlBQVksOEJBQ1osaUJBQWlCLHVWQUNqQixZQUFZOzsyRkFNUCw4QkFBOEI7a0JBWDFDLFNBQVM7aUNBQ00sSUFBSSxXQUNQO3dCQUNMLFlBQVk7d0JBQ1osaUJBQWlCO3dCQUNqQixZQUFZO3FCQUNmLFlBQ1MsMEJBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQVhEZWNvcmF0b3JNb2R1bGUgfSBmcm9tICdAYWNvcmV4L2NvbXBvbmVudHMvZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBBWE1lbnVNb2R1bGUgfSBmcm9tICdAYWNvcmV4L2NvbXBvbmVudHMvbWVudSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBpbmplY3QsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQVhQRGVzaWduZXJTZXJ2aWNlIH0gZnJvbSAnLi4vZGVzaWduZXIuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBDb21tb25Nb2R1bGUsXG4gICAgICAgIEFYRGVjb3JhdG9yTW9kdWxlLFxuICAgICAgICBBWE1lbnVNb2R1bGUsXG4gICAgXSxcbiAgICBzZWxlY3RvcjogJ2F4cC1kZXNpZ25lci1oZWFkZXItbWVudScsXG4gICAgdGVtcGxhdGVVcmw6ICdoZWFkZXItbWVudS5jb21wb25lbnQuaHRtbCdcbn0pXG5cbmV4cG9ydCBjbGFzcyBBWFBEZXNpZ25lckhlYWRlck1lbnVDb21wb25lbnQge1xuICAgIHByb3RlY3RlZCBzZXJ2aWNlID0gaW5qZWN0KEFYUERlc2lnbmVyU2VydmljZSk7XG59IiwiPGF4LW1lbnUgW29wZW5Pbl09XCInaG92ZXInXCI+XG4gICAgPGF4LW1lbnUtaXRlbSB0ZXh0PVwiSG9tZVwiPlxuICAgICAgICA8YXgtbWVudS1pdGVtIHRleHQ9XCJOZXdcIj48L2F4LW1lbnUtaXRlbT5cbiAgICAgICAgPGF4LW1lbnUtaXRlbSB0ZXh0PVwiRXhwb3J0XCI+XG4gICAgICAgICAgICA8YXgtbWVudS1pdGVtIHRleHQ9XCJEb3dubG9hZCBKU09OXCIgKG9uQ2xpY2spPVwic2VydmljZS5kb3dubG9hZCgpXCI+XG4gICAgICAgICAgICA8L2F4LW1lbnUtaXRlbT5cbiAgICAgICAgPC9heC1tZW51LWl0ZW0+XG4gICAgPC9heC1tZW51LWl0ZW0+XG4gICAgPGF4LW1lbnUtaXRlbSB0ZXh0PVwiRWRpdFwiPlxuICAgICAgICA8YXgtbWVudS1pdGVtIHRleHQ9XCJVbmRvXCIgW2Rpc2FibGVkXT1cIiFzZXJ2aWNlLmNhblVuZG8oKVwiIChvbkNsaWNrKT1cInNlcnZpY2UudW5kbygpXCI+XG4gICAgICAgICAgICA8YXgtcHJlZml4PlxuICAgICAgICAgICAgICAgIDxheC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhLXNvbGlkIGZhLXJvdGF0ZS1sZWZ0XCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYXgtaWNvbj5cbiAgICAgICAgICAgIDwvYXgtcHJlZml4PlxuICAgICAgICAgICAgPGF4LXN1ZmZpeD5cbiAgICAgICAgICAgICAgICA8YXgtdGV4dD5cbiAgICAgICAgICAgICAgICAgICAgQ3RybCtaXG4gICAgICAgICAgICAgICAgPC9heC10ZXh0PlxuICAgICAgICAgICAgPC9heC1zdWZmaXg+XG4gICAgICAgIDwvYXgtbWVudS1pdGVtPlxuICAgICAgICA8YXgtbWVudS1pdGVtIHRleHQ9XCJSZWRvXCIgW2Rpc2FibGVkXT1cIiFzZXJ2aWNlLmNhblJlZG8oKVwiIChvbkNsaWNrKT1cInNlcnZpY2UucmVkbygpXCI+XG4gICAgICAgICAgICA8YXgtcHJlZml4PlxuICAgICAgICAgICAgICAgIDxheC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhLXNvbGlkIGZhLXJvdGF0ZS1yaWdodFwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2F4LWljb24+XG4gICAgICAgICAgICA8L2F4LXByZWZpeD5cbiAgICAgICAgICAgIDxheC1zdWZmaXg+XG4gICAgICAgICAgICAgICAgPGF4LXRleHQ+XG4gICAgICAgICAgICAgICAgICAgIEN0cmwrWVxuICAgICAgICAgICAgICAgIDwvYXgtdGV4dD5cbiAgICAgICAgICAgIDwvYXgtc3VmZml4PlxuICAgICAgICA8L2F4LW1lbnUtaXRlbT5cbiAgICAgICAgPGF4LWRpdmlkZXI+PC9heC1kaXZpZGVyPlxuICAgICAgICA8YXgtbWVudS1pdGVtIHRleHQ9XCJDdXRcIiBbZGlzYWJsZWRdPVwiIXNlcnZpY2UuY2FuQ3V0Q29weSgpXCIgKG9uQ2xpY2spPVwic2VydmljZS5jdXQoKVwiPlxuICAgICAgICAgICAgPGF4LXByZWZpeD5cbiAgICAgICAgICAgICAgICA8YXgtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYS1zb2xpZCBmYS1jdXRcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9heC1pY29uPlxuICAgICAgICAgICAgPC9heC1wcmVmaXg+XG4gICAgICAgICAgICA8YXgtc3VmZml4PlxuICAgICAgICAgICAgICAgIDxheC10ZXh0PlxuICAgICAgICAgICAgICAgICAgICBDdHJsK1hcbiAgICAgICAgICAgICAgICA8L2F4LXRleHQ+XG4gICAgICAgICAgICA8L2F4LXN1ZmZpeD5cbiAgICAgICAgPC9heC1tZW51LWl0ZW0+XG4gICAgICAgIDxheC1tZW51LWl0ZW0gdGV4dD1cIkNvcHlcIiBbZGlzYWJsZWRdPVwiIXNlcnZpY2UuY2FuQ3V0Q29weSgpXCIgKG9uQ2xpY2spPVwic2VydmljZS5jb3B5KClcIj5cbiAgICAgICAgICAgIDxheC1wcmVmaXg+XG4gICAgICAgICAgICAgICAgPGF4LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEtc29saWQgZmEtY29weVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2F4LWljb24+XG4gICAgICAgICAgICA8L2F4LXByZWZpeD5cbiAgICAgICAgICAgIDxheC1zdWZmaXg+XG4gICAgICAgICAgICAgICAgPGF4LXRleHQ+XG4gICAgICAgICAgICAgICAgICAgIEN0cmwrQ1xuICAgICAgICAgICAgICAgIDwvYXgtdGV4dD5cbiAgICAgICAgICAgIDwvYXgtc3VmZml4PlxuICAgICAgICA8L2F4LW1lbnUtaXRlbT5cbiAgICAgICAgPGF4LW1lbnUtaXRlbSB0ZXh0PVwiUGFzdGVcIiBbZGlzYWJsZWRdPVwiIXNlcnZpY2UuY2FuUGFzdGUoKVwiIChvbkNsaWNrKT1cInNlcnZpY2UucGFzdGUoKVwiPlxuICAgICAgICAgICAgPGF4LXByZWZpeD5cbiAgICAgICAgICAgICAgICA8YXgtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYS1zb2xpZCBmYS1wYXN0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2F4LWljb24+XG4gICAgICAgICAgICA8L2F4LXByZWZpeD5cbiAgICAgICAgICAgIDxheC1zdWZmaXg+XG4gICAgICAgICAgICAgICAgPGF4LXRleHQ+XG4gICAgICAgICAgICAgICAgICAgIEN0cmwrVlxuICAgICAgICAgICAgICAgIDwvYXgtdGV4dD5cbiAgICAgICAgICAgIDwvYXgtc3VmZml4PlxuICAgICAgICA8L2F4LW1lbnUtaXRlbT5cbiAgICA8L2F4LW1lbnUtaXRlbT5cbiAgICA8YXgtbWVudS1pdGVtIHRleHQ9XCJIZWxwXCI+XG4gICAgICAgIDxheC1tZW51LWl0ZW0gdGV4dD1cIkFib3V0XCI+PC9heC1tZW51LWl0ZW0+XG4gICAgPC9heC1tZW51LWl0ZW0+XG48L2F4LW1lbnU+Il19
@@ -0,0 +1,21 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { ChangeDetectionStrategy, Component, inject, ViewEncapsulation } from '@angular/core';
3
+ import { AXPDesignerService } from '../designer.service';
4
+ import { AXDecoratorModule } from '@acorex/components/decorators';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@acorex/components/decorators";
7
+ export class AXPDesignerHistoryComponent {
8
+ constructor() {
9
+ this.service = inject(AXPDesignerService);
10
+ }
11
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: AXPDesignerHistoryComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
12
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: AXPDesignerHistoryComponent, isStandalone: true, selector: "axp-designer-history", ngImport: i0, template: "<div class=\"ax-flex ax-flex-col ax-border-e ax-w-72\">\n <!-- Header -->\n <div class=\"ax-flex ax-flex-row ax-w-full ax-justify-between ax-text-white ax-p-2 ax-border-b\">\n <div class=\"ax-flex ax-flex-row ax-gap-2 ax-items-center\">\n <span class=\"ax-font-semibold\">History</span>\n </div>\n <ax-close-button></ax-close-button>\n </div>\n\n <!-- History List or Empty State -->\n <div class=\"ax-flex-1 ax-h-full ax-overflow-auto\">\n @if(service.history().length)\n {\n <!-- History Items -->\n <ul class=\"ax-space-y-2 ax-p-2 ax-text-white ax-text-sm\">\n @for (step of service.history(); track $index) {\n <li (click)=\"service.revertToChange($index)\"\n class=\"ax-cursor-pointer ax-transition ax-duration-150 ax-ease-in-out ax-hover:bg-gray-700\">\n {{ step.description }} {{step.disabled}}\n </li>\n }\n </ul>\n }\n @else {\n <!-- No History Found -->\n <div class=\"ax-flex ax-justify-center ax-items-center ax-text-gray-300 ax-p-4\">\n No changes have been made yet.\n </div>\n }\n </div>\n</div>", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i1.AXDecoratorCloseButtonComponent, selector: "ax-close-button", inputs: ["icon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
13
+ }
14
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: AXPDesignerHistoryComponent, decorators: [{
15
+ type: Component,
16
+ args: [{ selector: 'axp-designer-history', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
17
+ CommonModule,
18
+ AXDecoratorModule,
19
+ ], template: "<div class=\"ax-flex ax-flex-col ax-border-e ax-w-72\">\n <!-- Header -->\n <div class=\"ax-flex ax-flex-row ax-w-full ax-justify-between ax-text-white ax-p-2 ax-border-b\">\n <div class=\"ax-flex ax-flex-row ax-gap-2 ax-items-center\">\n <span class=\"ax-font-semibold\">History</span>\n </div>\n <ax-close-button></ax-close-button>\n </div>\n\n <!-- History List or Empty State -->\n <div class=\"ax-flex-1 ax-h-full ax-overflow-auto\">\n @if(service.history().length)\n {\n <!-- History Items -->\n <ul class=\"ax-space-y-2 ax-p-2 ax-text-white ax-text-sm\">\n @for (step of service.history(); track $index) {\n <li (click)=\"service.revertToChange($index)\"\n class=\"ax-cursor-pointer ax-transition ax-duration-150 ax-ease-in-out ax-hover:bg-gray-700\">\n {{ step.description }} {{step.disabled}}\n </li>\n }\n </ul>\n }\n @else {\n <!-- No History Found -->\n <div class=\"ax-flex ax-justify-center ax-items-center ax-text-gray-300 ax-p-4\">\n No changes have been made yet.\n </div>\n }\n </div>\n</div>" }]
20
+ }] });
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9yeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3BsYXRmb3JtL2xheW91dC9kZXNpZ25lci9zcmMvbGliL2hpc3RvcnkvaGlzdG9yeS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3BsYXRmb3JtL2xheW91dC9kZXNpZ25lci9zcmMvbGliL2hpc3RvcnkvaGlzdG9yeS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBWSxNQUFNLEVBQWtCLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtCQUErQixDQUFDOzs7QUFjbEUsTUFBTSxPQUFPLDJCQUEyQjtJQVp4QztRQWFjLFlBQU8sR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztLQUNsRDs4R0FGWSwyQkFBMkI7a0dBQTNCLDJCQUEyQixnRkNsQnhDLHdzQ0E4Qk0sMkNEakJFLFlBQVksOEJBQ1osaUJBQWlCOzsyRkFJWiwyQkFBMkI7a0JBWnZDLFNBQVM7K0JBQ0ksc0JBQXNCLGlCQUVqQixpQkFBaUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDTCxZQUFZO3dCQUNaLGlCQUFpQjtxQkFDcEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBWFBMYXlvdXRCdWlsZGVyTW9kdWxlLCBBWFBXaWRnZXRDb25maWcsIEFYUFdpZGdldE5vZGUgfSBmcm9tICdAYWNvcmV4L3BsYXRmb3JtL2xheW91dC9idWlsZGVyJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBjb21wdXRlZCwgaW5qZWN0LCBPbkluaXQsIHNpZ25hbCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFYUERlc2lnbmVyU2VydmljZSB9IGZyb20gJy4uL2Rlc2lnbmVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQVhEZWNvcmF0b3JNb2R1bGUgfSBmcm9tICdAYWNvcmV4L2NvbXBvbmVudHMvZGVjb3JhdG9ycyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXhwLWRlc2lnbmVyLWhpc3RvcnknLFxuICAgIHRlbXBsYXRlVXJsOiAnaGlzdG9yeS5jb21wb25lbnQuaHRtbCcsXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICBBWERlY29yYXRvck1vZHVsZSxcbiAgICBdLFxufSlcblxuZXhwb3J0IGNsYXNzIEFYUERlc2lnbmVySGlzdG9yeUNvbXBvbmVudCB7XG4gICAgcHJvdGVjdGVkIHNlcnZpY2UgPSBpbmplY3QoQVhQRGVzaWduZXJTZXJ2aWNlKTtcbn0iLCI8ZGl2IGNsYXNzPVwiYXgtZmxleCBheC1mbGV4LWNvbCBheC1ib3JkZXItZSBheC13LTcyXCI+XG4gICAgPCEtLSBIZWFkZXIgLS0+XG4gICAgPGRpdiBjbGFzcz1cImF4LWZsZXggYXgtZmxleC1yb3cgYXgtdy1mdWxsIGF4LWp1c3RpZnktYmV0d2VlbiBheC10ZXh0LXdoaXRlIGF4LXAtMiBheC1ib3JkZXItYlwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXgtZmxleCBheC1mbGV4LXJvdyBheC1nYXAtMiBheC1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXgtZm9udC1zZW1pYm9sZFwiPkhpc3Rvcnk8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YXgtY2xvc2UtYnV0dG9uPjwvYXgtY2xvc2UtYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBIaXN0b3J5IExpc3Qgb3IgRW1wdHkgU3RhdGUgLS0+XG4gICAgPGRpdiBjbGFzcz1cImF4LWZsZXgtMSBheC1oLWZ1bGwgYXgtb3ZlcmZsb3ctYXV0b1wiPlxuICAgICAgICBAaWYoc2VydmljZS5oaXN0b3J5KCkubGVuZ3RoKVxuICAgICAgICB7XG4gICAgICAgIDwhLS0gSGlzdG9yeSBJdGVtcyAtLT5cbiAgICAgICAgPHVsIGNsYXNzPVwiYXgtc3BhY2UteS0yIGF4LXAtMiBheC10ZXh0LXdoaXRlIGF4LXRleHQtc21cIj5cbiAgICAgICAgICAgIEBmb3IgKHN0ZXAgb2Ygc2VydmljZS5oaXN0b3J5KCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgPGxpIChjbGljayk9XCJzZXJ2aWNlLnJldmVydFRvQ2hhbmdlKCRpbmRleClcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYXgtY3Vyc29yLXBvaW50ZXIgYXgtdHJhbnNpdGlvbiBheC1kdXJhdGlvbi0xNTAgYXgtZWFzZS1pbi1vdXQgYXgtaG92ZXI6YmctZ3JheS03MDBcIj5cbiAgICAgICAgICAgICAgICB7eyBzdGVwLmRlc2NyaXB0aW9uIH19IHt7c3RlcC5kaXNhYmxlZH19XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgfVxuICAgICAgICA8L3VsPlxuICAgICAgICB9XG4gICAgICAgIEBlbHNlIHtcbiAgICAgICAgPCEtLSBObyBIaXN0b3J5IEZvdW5kIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXgtZmxleCBheC1qdXN0aWZ5LWNlbnRlciBheC1pdGVtcy1jZW50ZXIgYXgtdGV4dC1ncmF5LTMwMCBheC1wLTRcIj5cbiAgICAgICAgICAgIE5vIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgeWV0LlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgIDwvZGl2PlxuPC9kaXY+Il19
@@ -0,0 +1,117 @@
1
+ import { Injectable, signal, computed } from '@angular/core';
2
+ import { cloneDeep } from 'lodash-es';
3
+ import * as i0 from "@angular/core";
4
+ export class AXPObjectHistoryManager {
5
+ constructor() {
6
+ this.undoStack = signal([]); // Undo history as a signal
7
+ this.redoStack = signal([]); // Redo history as a signal
8
+ this._currentState = signal(null); // Current state as a signal
9
+ this.maxHistorySize = 50;
10
+ this.revertedIndex = null; // Track the index when reverting
11
+ this.currentState = this._currentState.asReadonly();
12
+ this.canUndo = computed(() => this.undoStack().length > 0);
13
+ this.canRedo = computed(() => this.redoStack().length > 0);
14
+ // Get the undo history for UI with disabled future states
15
+ this.history = computed(() => {
16
+ const undoHistory = this.undoStack();
17
+ return undoHistory.map((state, index) => ({
18
+ ...state,
19
+ index,
20
+ disabled: this.revertedIndex !== null && index > this.revertedIndex
21
+ }));
22
+ });
23
+ }
24
+ // Save a new state and clear redo if necessary
25
+ saveState(newState, description) {
26
+ const newHistoryState = {
27
+ state: cloneDeep(newState),
28
+ date: new Date(),
29
+ description: description,
30
+ };
31
+ // Limit undo history size
32
+ if (this.undoStack().length >= this.maxHistorySize) {
33
+ this.undoStack.set(this.undoStack().slice(1)); // Remove oldest state
34
+ }
35
+ // Add the current state to the undo stack
36
+ //if (this._currentState()) {
37
+ this.undoStack.set([...this.undoStack(), this._currentState()]);
38
+ //}
39
+ // Set the new state as the current state
40
+ this._currentState.set(newHistoryState);
41
+ // Clear the redo stack if a new state is saved after undoing
42
+ if (this.revertedIndex !== null) {
43
+ this.redoStack.set([]);
44
+ this.revertedIndex = null; // Reset reverted index
45
+ }
46
+ }
47
+ // Update the current state's last entry in the undo stack
48
+ updateState(newState) {
49
+ const lastStateIndex = this.undoStack().length - 1;
50
+ // Check if there is a valid state to update
51
+ if (lastStateIndex >= 0) {
52
+ const lastState = this.undoStack()[lastStateIndex];
53
+ // Update the state in the last history entry
54
+ const updatedState = {
55
+ ...lastState,
56
+ state: cloneDeep(newState),
57
+ date: new Date() // Update the date to reflect the change
58
+ };
59
+ // Update the undo stack with the modified state
60
+ const updatedUndoStack = [...this.undoStack()];
61
+ updatedUndoStack[lastStateIndex] = updatedState;
62
+ this.undoStack.set(updatedUndoStack);
63
+ // Also update the currentState to reflect the latest change
64
+ this._currentState.set(updatedState);
65
+ }
66
+ }
67
+ // Undo the last action and update the current state
68
+ undo() {
69
+ if (this.undoStack().length > 0) {
70
+ const previousState = this.undoStack().pop(); // Get the last state
71
+ this.redoStack.set([...this.redoStack(), this._currentState()]); // Save current state to redo stack
72
+ this._currentState.set(previousState); // Revert to the previous state
73
+ this.revertedIndex = this.undoStack().length - 1; // Update reverted index
74
+ }
75
+ }
76
+ // Redo the last undone action and update the current state
77
+ redo() {
78
+ if (this.redoStack().length > 0) {
79
+ const nextState = this.redoStack().pop(); // Get the next state
80
+ this.undoStack.set([...this.undoStack(), this._currentState()]); // Save current state to undo stack
81
+ this._currentState.set(nextState); // Apply the redo state
82
+ this.revertedIndex = this.undoStack().length - 1; // Update reverted index
83
+ }
84
+ }
85
+ // Revert to a specific state by index in the undo stack
86
+ revert(index) {
87
+ if (index < 0 || index >= this.undoStack().length) {
88
+ return; // Invalid index, do nothing
89
+ }
90
+ const targetState = this.undoStack()[index];
91
+ const currentStateSnapshot = this._currentState(); // Save the current state for redo
92
+ // Move states after the reverted index to the redo stack
93
+ const statesToRedo = this.undoStack().slice(index + 1);
94
+ this.redoStack.set([currentStateSnapshot, ...statesToRedo]);
95
+ // Update the undo stack to the reverted point
96
+ this.undoStack.set(this.undoStack().slice(0, index + 1));
97
+ // Set the reverted state as the current state
98
+ this._currentState.set(targetState);
99
+ this.revertedIndex = index; // Track the reverted index
100
+ }
101
+ // Clear all history
102
+ clear() {
103
+ this.undoStack.set([]);
104
+ this.redoStack.set([]);
105
+ this.revertedIndex = null;
106
+ this._currentState.set(null);
107
+ }
108
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: AXPObjectHistoryManager, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
109
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: AXPObjectHistoryManager, providedIn: 'root' }); }
110
+ }
111
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: AXPObjectHistoryManager, decorators: [{
112
+ type: Injectable,
113
+ args: [{
114
+ providedIn: 'root',
115
+ }]
116
+ }] });
117
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9yeS1tYW5hZ2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3BsYXRmb3JtL2xheW91dC9kZXNpZ25lci9zcmMvbGliL2hpc3RvcnktbWFuYWdlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDOztBQVd0QyxNQUFNLE9BQU8sdUJBQXVCO0lBSHBDO1FBSXFCLGNBQVMsR0FBRyxNQUFNLENBQXVCLEVBQUUsQ0FBQyxDQUFDLENBQUUsMkJBQTJCO1FBQzFFLGNBQVMsR0FBRyxNQUFNLENBQXVCLEVBQUUsQ0FBQyxDQUFDLENBQUUsMkJBQTJCO1FBQzFFLGtCQUFhLEdBQUcsTUFBTSxDQUE0QixJQUFJLENBQUMsQ0FBQyxDQUFFLDRCQUE0QjtRQUMvRixtQkFBYyxHQUFXLEVBQUUsQ0FBQztRQUM1QixrQkFBYSxHQUFrQixJQUFJLENBQUMsQ0FBRSxpQ0FBaUM7UUFFL0QsaUJBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRXhELFlBQU8sR0FBRyxRQUFRLENBQVUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMvRCxZQUFPLEdBQUcsUUFBUSxDQUFVLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFnR3RFLDBEQUEwRDtRQUNuRCxZQUFPLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUMzQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDckMsT0FBTyxXQUFXLENBQUMs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UUFFdEYseURBQXlEO1FBQ3pELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsb0JBQXFCLEVBQUUsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBRTdELDhDQUE4QztRQUM5QyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV6RCw4Q0FBOEM7UUFDOUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUMsQ0FBRSwyQkFBMkI7SUFDNUQsQ0FBQztJQWNELG9CQUFvQjtJQUNiLEtBQUs7UUFDUixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxDQUFDOzhHQTVIUSx1QkFBdUI7a0hBQXZCLHVCQUF1QixjQUZwQixNQUFNOzsyRkFFVCx1QkFBdUI7a0JBSG5DLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgc2lnbmFsLCBjb21wdXRlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY2xvbmVEZWVwIH0gZnJvbSAnbG9kYXNoLWVzJztcblxuZXhwb3J0IGludGVyZmFjZSBBWFBIaXN0b3J5U3RhdGU8VD4ge1xuICAgIHN0YXRlOiBUO1xuICAgIGRhdGU6IERhdGU7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbn1cblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgQVhQT2JqZWN0SGlzdG9yeU1hbmFnZXI8VD4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdW5kb1N0YWNrID0gc2lnbmFsPEFYUEhpc3RvcnlTdGF0ZTxUPltdPihbXSk7ICAvLyBVbmRvIGhpc3RvcnkgYXMgYSBzaWduYWxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlZG9TdGFjayA9IHNpZ25hbDxBWFBIaXN0b3J5U3RhdGU8VD5bXT4oW10pOyAgLy8gUmVkbyBoaXN0b3J5IGFzIGEgc2lnbmFsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY3VycmVudFN0YXRlID0gc2lnbmFsPEFYUEhpc3RvcnlTdGF0ZTxUPiB8IG51bGw+KG51bGwpOyAgLy8gQ3VycmVudCBzdGF0ZSBhcyBhIHNpZ25hbFxuICAgIHByaXZhdGUgbWF4SGlzdG9yeVNpemU6IG51bWJlciA9IDUwO1xuICAgIHByaXZhdGUgcmV2ZXJ0ZWRJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7ICAvLyBUcmFjayB0aGUgaW5kZXggd2hlbiByZXZlcnRpbmdcblxuICAgIHB1YmxpYyByZWFkb25seSBjdXJyZW50U3RhdGUgPSB0aGlzLl9jdXJyZW50U3RhdGUuYXNSZWFkb25seSgpO1xuXG4gICAgcHVibGljIGNhblVuZG8gPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB0aGlzLnVuZG9TdGFjaygpLmxlbmd0aCA+IDApO1xuICAgIHB1YmxpYyBjYW5SZWRvID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4gdGhpcy5yZWRvU3RhY2soKS5sZW5ndGggPiAwKTtcblxuICAgIC8vIFNhdmUgYSBuZXcgc3RhdGUgYW5kIGNsZWFyIHJlZG8gaWYgbmVjZXNzYXJ5XG4gICAgcHVibGljIHNhdmVTdGF0ZShuZXdTdGF0ZTogVCwgZGVzY3JpcHRpb246IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCBuZXdIaXN0b3J5U3RhdGU6IEFYUEhpc3RvcnlTdGF0ZTxUPiA9IHtcbiAgICAgICAgICAgIHN0YXRlOiBjbG9uZURlZXAobmV3U3RhdGUpLFxuICAgICAgICAgICAgZGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbixcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBMaW1pdCB1bmRvIGhpc3Rvcnkgc2l6ZVxuICAgICAgICBpZiAodGhpcy51bmRvU3RhY2soKS5sZW5ndGggPj0gdGhpcy5tYXhIaXN0b3J5U2l6ZSkge1xuICAgICAgICAgICAgdGhpcy51bmRvU3RhY2suc2V0KHRoaXMudW5kb1N0YWNrKCkuc2xpY2UoMSkpOyAgLy8gUmVtb3ZlIG9sZGVzdCBzdGF0ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIHRoZSBjdXJyZW50IHN0YXRlIHRvIHRoZSB1bmRvIHN0YWNrXG4gICAgICAgIC8vaWYgKHRoaXMuX2N1cnJlbnRTdGF0ZSgpKSB7XG4gICAgICAgIHRoaXMudW5kb1N0YWNrLnNldChbLi4udGhpcy51bmRvU3RhY2soKSwgdGhpcy5fY3VycmVudFN0YXRlKCkhXSk7XG4gICAgICAgIC8vfVxuXG4gICAgICAgIC8vIFNldCB0aGUgbmV3IHN0YXRlIGFzIHRoZSBjdXJyZW50IHN0YXRlXG4gICAgICAgIHRoaXMuX2N1cnJlbnRTdGF0ZS5zZXQobmV3SGlzdG9yeVN0YXRlKTtcblxuICAgICAgICAvLyBDbGVhciB0aGUgcmVkbyBzdGFjayBpZiBhIG5ldyBzdGF0ZSBpcyBzYXZlZCBhZnRlciB1bmRvaW5nXG4gICAgICAgIGlmICh0aGlzLnJldmVydGVkSW5kZXggIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucmVkb1N0YWNrLnNldChbXSk7XG4gICAgICAgICAgICB0aGlzLnJldmVydGVkSW5kZXggPSBudWxsOyAgLy8gUmVzZXQgcmV2ZXJ0ZWQgaW5kZXhcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0aGUgY3VycmVudCBzdGF0ZSdzIGxhc3QgZW50cnkgaW4gdGhlIHVuZG8gc3RhY2tcbiAgICBwdWJsaWMgdXBkYXRlU3RhdGUobmV3U3RhdGU6IFQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbGFzdFN0YXRlSW5kZXggPSB0aGlzLnVuZG9TdGFjaygpLmxlbmd0aCAtIDE7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYSB2YWxpZCBzdGF0ZSB0byB1cGRhdGVcbiAgICAgICAgaWYgKGxhc3RTdGF0ZUluZGV4ID49IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RTdGF0ZSA9IHRoaXMudW5kb1N0YWNrKClbbGFzdFN0YXRlSW5kZXhdO1xuXG4gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHN0YXRlIGluIHRoZSBsYXN0IGhpc3RvcnkgZW50cnlcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRTdGF0ZTogQVhQSGlzdG9yeVN0YXRlPFQ+ID0ge1xuICAgICAgICAgICAgICAgIC4uLmxhc3RTdGF0ZSxcbiAgICAgICAgICAgICAgICBzdGF0ZTogY2xvbmVEZWVwKG5ld1N0YXRlKSxcbiAgICAgICAgICAgICAgICBkYXRlOiBuZXcgRGF0ZSgpICAvLyBVcGRhdGUgdGhlIGRhdGUgdG8gcmVmbGVjdCB0aGUgY2hhbmdlXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHVuZG8gc3RhY2sgd2l0aCB0aGUgbW9kaWZpZWQgc3RhdGVcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRVbmRvU3RhY2sgPSBbLi4udGhpcy51bmRvU3RhY2soKV07XG4gICAgICAgICAgICB1cGRhdGVkVW5kb1N0YWNrW2xhc3RTdGF0ZUluZGV4XSA9IHVwZGF0ZWRTdGF0ZTtcbiAgICAgICAgICAgIHRoaXMudW5kb1N0YWNrLnNldCh1cGRhdGVkVW5kb1N0YWNrKTtcblxuICAgICAgICAgICAgLy8gQWxzbyB1cGRhdGUgdGhlIGN1cnJlbnRTdGF0ZSB0byByZWZsZWN0IHRoZSBsYXRlc3QgY2hhbmdlXG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50U3RhdGUuc2V0KHVwZGF0ZWRTdGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVbmRvIHRoZSBsYXN0IGFjdGlvbiBhbmQgdXBkYXRlIHRoZSBjdXJyZW50IHN0YXRlXG4gICAgcHVibGljIHVuZG8oKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnVuZG9TdGFjaygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzU3RhdGUgPSB0aGlzLnVuZG9TdGFjaygpLnBvcCgpITsgIC8vIEdldCB0aGUgbGFzdCBzdGF0ZVxuICAgICAgICAgICAgdGhpcy5yZWRvU3RhY2suc2V0KFsuLi50aGlzLnJlZG9TdGFjaygpLCB0aGlzLl9jdXJyZW50U3RhdGUoKSFdKTsgIC8vIFNhdmUgY3VycmVudCBzdGF0ZSB0byByZWRvIHN0YWNrXG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50U3RhdGUuc2V0KHByZXZpb3VzU3RhdGUpOyAgLy8gUmV2ZXJ0IHRvIHRoZSBwcmV2aW91cyBzdGF0ZVxuICAgICAgICAgICAgdGhpcy5yZXZlcnRlZEluZGV4ID0gdGhpcy51bmRvU3RhY2soKS5sZW5ndGggLSAxOyAgLy8gVXBkYXRlIHJldmVydGVkIGluZGV4XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZWRvIHRoZSBsYXN0IHVuZG9uZSBhY3Rpb24gYW5kIHVwZGF0ZSB0aGUgY3VycmVudCBzdGF0ZVxuICAgIHB1YmxpYyByZWRvKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5yZWRvU3RhY2soKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0U3RhdGUgPSB0aGlzLnJlZG9TdGFjaygpLnBvcCgpITsgIC8vIEdldCB0aGUgbmV4dCBzdGF0ZVxuICAgICAgICAgICAgdGhpcy51bmRvU3RhY2suc2V0KFsuLi50aGlzLnVuZG9TdGFjaygpLCB0aGlzLl9jdXJyZW50U3RhdGUoKSFdKTsgIC8vIFNhdmUgY3VycmVudCBzdGF0ZSB0byB1bmRvIHN0YWNrXG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50U3RhdGUuc2V0KG5leHRTdGF0ZSk7ICAvLyBBcHBseSB0aGUgcmVkbyBzdGF0ZVxuICAgICAgICAgICAgdGhpcy5yZXZlcnRlZEluZGV4ID0gdGhpcy51bmRvU3RhY2soKS5sZW5ndGggLSAxOyAgLy8gVXBkYXRlIHJldmVydGVkIGluZGV4XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXZlcnQgdG8gYSBzcGVjaWZpYyBzdGF0ZSBieSBpbmRleCBpbiB0aGUgdW5kbyBzdGFja1xuICAgIHB1YmxpYyByZXZlcnQoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMudW5kb1N0YWNrKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47ICAvLyBJbnZhbGlkIGluZGV4LCBkbyBub3RoaW5nXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0YXJnZXRTdGF0ZSA9IHRoaXMudW5kb1N0YWNrKClbaW5kZXhdO1xuICAgICAgICBjb25zdCBjdXJyZW50U3RhdGVTbmFwc2hvdCA9IHRoaXMuX2N1cnJlbnRTdGF0ZSgpOyAgLy8gU2F2ZSB0aGUgY3VycmVudCBzdGF0ZSBmb3IgcmVkb1xuXG4gICAgICAgIC8vIE1vdmUgc3RhdGVzIGFmdGVyIHRoZSByZXZlcnRlZCBpbmRleCB0byB0aGUgcmVkbyBzdGFja1xuICAgICAgICBjb25zdCBzdGF0ZXNUb1JlZG8gPSB0aGlzLnVuZG9TdGFjaygpLnNsaWNlKGluZGV4ICsgMSk7XG4gICAgICAgIHRoaXMucmVkb1N0YWNrLnNldChbY3VycmVudFN0YXRlU25hcHNob3QhLCAuLi5zdGF0ZXNUb1JlZG9dKTtcblxuICAgICAgICAvLyBVcGRhdGUgdGhlIHVuZG8gc3RhY2sgdG8gdGhlIHJldmVydGVkIHBvaW50XG4gICAgICAgIHRoaXMudW5kb1N0YWNrLnNldCh0aGlzLnVuZG9TdGFjaygpLnNsaWNlKDAsIGluZGV4ICsgMSkpO1xuXG4gICAgICAgIC8vIFNldCB0aGUgcmV2ZXJ0ZWQgc3RhdGUgYXMgdGhlIGN1cnJlbnQgc3RhdGVcbiAgICAgICAgdGhpcy5fY3VycmVudFN0YXRlLnNldCh0YXJnZXRTdGF0ZSk7XG4gICAgICAgIHRoaXMucmV2ZXJ0ZWRJbmRleCA9IGluZGV4OyAgLy8gVHJhY2sgdGhlIHJldmVydGVkIGluZGV4XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSB1bmRvIGhpc3RvcnkgZm9yIFVJIHdpdGggZGlzYWJsZWQgZnV0dXJlIHN0YXRlc1xuICAgIHB1YmxpYyBoaXN0b3J5ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCB1bmRvSGlzdG9yeSA9IHRoaXMudW5kb1N0YWNrKCk7XG4gICAgICAgIHJldHVybiB1bmRvSGlzdG9yeS5tYXAoKHN0YXRlLCBpbmRleCkgPT4gKHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICBkaXNhYmxlZDogdGhpcy5yZXZlcnRlZEluZGV4ICE9PSBudWxsICYmIGluZGV4ID4gdGhpcy5yZXZlcnRlZEluZGV4XG4gICAgICAgIH0pKTtcbiAgICB9KTtcblxuXG5cbiAgICAvLyBDbGVhciBhbGwgaGlzdG9yeVxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy51bmRvU3RhY2suc2V0KFtdKTtcbiAgICAgICAgdGhpcy5yZWRvU3RhY2suc2V0KFtdKTtcbiAgICAgICAgdGhpcy5yZXZlcnRlZEluZGV4ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fY3VycmVudFN0YXRlLnNldChudWxsKTtcbiAgICB9XG59Il19