@one-grid-core/angular 0.1.0-beta.6 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +49 -4
  2. package/esm2022/lib/components/one-grid/one-grid.component.mjs +67 -16
  3. package/esm2022/lib/components/one-grid-body/one-grid-body.component.mjs +282 -30
  4. package/esm2022/lib/components/one-grid-cell-group-renderer/one-grid-cell-group-renderer.component.mjs +10 -7
  5. package/esm2022/lib/components/one-grid-cell-option-menu/one-grid-cell-option-menu.component.mjs +60 -4
  6. package/esm2022/lib/components/one-grid-checkbox-header/one-grid-checkbox-header.component.mjs +14 -5
  7. package/esm2022/lib/components/one-grid-header/one-grid-header.component.mjs +50 -13
  8. package/esm2022/lib/components/one-grid-pagination/one-grid-pagination.component.mjs +39 -15
  9. package/esm2022/lib/components/one-grid-row-action/one-grid-row-action.component.mjs +54 -8
  10. package/esm2022/lib/components/one-grid-row-drag-handle/one-grid-row-drag-handle.component.mjs +110 -0
  11. package/esm2022/lib/core/directives/one-cell-renderer-component.directive.mjs +9 -2
  12. package/esm2022/lib/core/directives/one-cell-text-expand.directive.mjs +33 -51
  13. package/esm2022/lib/core/instants/one-grid-api.class.mjs +429 -166
  14. package/esm2022/lib/core/instants/one-row-node.class.mjs +103 -37
  15. package/esm2022/lib/core/models/one-column-def-types.model.mjs +1 -1
  16. package/esm2022/lib/core/models/one-event-types.model.mjs +1 -1
  17. package/esm2022/lib/core/models/one-grid-types.model.mjs +1 -1
  18. package/esm2022/lib/core/models/one-row-drag.model.mjs +2 -0
  19. package/esm2022/lib/core/models/one-row.model.mjs +1 -1
  20. package/esm2022/lib/core/models/one-tree-data.model.mjs +1 -1
  21. package/esm2022/lib/core/models/one-validation.model.mjs +1 -1
  22. package/esm2022/lib/core/pipes/cell-field-value-empty.pipe.mjs +8 -3
  23. package/esm2022/lib/core/pipes/column-sort-state.pipe.mjs +3 -1
  24. package/esm2022/lib/core/services/og-column.service.mjs +120 -13
  25. package/esm2022/lib/core/services/one-grid-cell.service.mjs +147 -22
  26. package/esm2022/lib/core/services/one-grid-row-drag.service.mjs +351 -0
  27. package/esm2022/lib/core/services/one-grid-selection.service.mjs +19 -6
  28. package/esm2022/lib/helpers/one-column-def.helper.mjs +27 -2
  29. package/esm2022/lib/helpers/one-filter.helper.mjs +71 -12
  30. package/esm2022/lib/helpers/one-validation.helper.mjs +7 -2
  31. package/esm2022/lib/index.mjs +6 -1
  32. package/esm2022/lib/one-grid.module.mjs +7 -16
  33. package/fesm2022/one-grid-core-angular.mjs +1988 -423
  34. package/fesm2022/one-grid-core-angular.mjs.map +1 -1
  35. package/lib/components/one-grid/one-grid.component.d.ts +16 -1
  36. package/lib/components/one-grid-body/one-grid-body.component.d.ts +132 -5
  37. package/lib/components/one-grid-cell-group-renderer/one-grid-cell-group-renderer.component.d.ts +6 -1
  38. package/lib/components/one-grid-cell-option-menu/one-grid-cell-option-menu.component.d.ts +19 -2
  39. package/lib/components/one-grid-checkbox-header/one-grid-checkbox-header.component.d.ts +5 -2
  40. package/lib/components/one-grid-header/one-grid-header.component.d.ts +15 -7
  41. package/lib/components/one-grid-pagination/one-grid-pagination.component.d.ts +24 -5
  42. package/lib/components/one-grid-row-action/one-grid-row-action.component.d.ts +44 -0
  43. package/lib/components/one-grid-row-drag-handle/one-grid-row-drag-handle.component.d.ts +39 -0
  44. package/lib/core/directives/one-cell-text-expand.directive.d.ts +21 -9
  45. package/lib/core/instants/one-grid-api.class.d.ts +212 -26
  46. package/lib/core/instants/one-row-node.class.d.ts +67 -14
  47. package/lib/core/models/one-column-def-types.model.d.ts +89 -15
  48. package/lib/core/models/one-event-types.model.d.ts +24 -1
  49. package/lib/core/models/one-grid-types.model.d.ts +36 -1
  50. package/lib/core/models/one-row-drag.model.d.ts +44 -0
  51. package/lib/core/models/one-row.model.d.ts +0 -5
  52. package/lib/core/models/one-tree-data.model.d.ts +13 -0
  53. package/lib/core/models/one-validation.model.d.ts +12 -2
  54. package/lib/core/pipes/column-sort-state.pipe.d.ts +1 -1
  55. package/lib/core/services/og-column.service.d.ts +44 -3
  56. package/lib/core/services/one-grid-cell.service.d.ts +68 -4
  57. package/lib/core/services/one-grid-row-drag.service.d.ts +113 -0
  58. package/lib/core/services/one-grid-selection.service.d.ts +9 -0
  59. package/lib/helpers/one-column-def.helper.d.ts +19 -1
  60. package/lib/helpers/one-filter.helper.d.ts +29 -4
  61. package/lib/index.d.ts +5 -0
  62. package/lib/one-grid.module.d.ts +17 -19
  63. package/package.json +1 -2
  64. package/scss/_one-grid.scss +389 -17
  65. package/esm2022/lib/core/pipes/cell-disable-resolver.pipe.mjs +0 -26
  66. package/lib/core/pipes/cell-disable-resolver.pipe.d.ts +0 -9
@@ -1,15 +1,22 @@
1
1
  import { Injectable } from '@angular/core';
2
2
  import { BehaviorSubject } from 'rxjs';
3
3
  import lodash from 'lodash';
4
+ import { resolveColumnWidth, resolveOneCellRendererParams } from '../../helpers/one-column-def.helper';
4
5
  import * as i0 from "@angular/core";
5
6
  export class OgColumnService {
6
7
  constructor() {
7
8
  this.defaultColumnDef = null;
9
+ /**
10
+ * The grid's `context`, so header callbacks receive the same one cell
11
+ * callbacks do. Set during init; null in a bare service.
12
+ */
13
+ this.context = null;
8
14
  this.columnDefs$ = new BehaviorSubject([]);
9
15
  this.groupColumnDefs$ = new BehaviorSubject([]);
10
16
  }
11
- initColumnDefs(defaultColumnDef, columnDefs, groupColumnDefs) {
17
+ initColumnDefs(defaultColumnDef, columnDefs, groupColumnDefs, context = null) {
12
18
  this.defaultColumnDef = defaultColumnDef;
19
+ this.context = context;
13
20
  this.setGroupColumnDefs(groupColumnDefs);
14
21
  this.setColumnDefs(columnDefs);
15
22
  }
@@ -19,7 +26,7 @@ export class OgColumnService {
19
26
  return { columns, groups };
20
27
  }
21
28
  setGroupColumnDefs(groupColumnDefs) {
22
- const groups = groupColumnDefs.map((group) => this.resolveGroupPresentation(group));
29
+ const groups = groupColumnDefs.map((group) => this.resolveGroupPresentation(group, { context: this.context }));
23
30
  this.groupColumnDefs$.next(groups);
24
31
  }
25
32
  setColumnDefs(columnDefs) {
@@ -29,24 +36,86 @@ export class OgColumnService {
29
36
  ...col,
30
37
  id: col?.field ? col.field : lodash.uniqueId('col_'),
31
38
  };
32
- return this.resolveCellPresentation(column);
39
+ return this.resolveHeaderPresentation(column);
33
40
  });
34
- this.recalculateGroups(columns);
35
- this.columnDefs$.next(columns);
41
+ const ordered = this.applyPinning(columns);
42
+ this.recalculateGroups(ordered);
43
+ this.columnDefs$.next(ordered);
44
+ }
45
+ /**
46
+ * Move pinned columns to their edge and measure how far in each one sits.
47
+ *
48
+ * Display order becomes left-pinned, unpinned, right-pinned, with declared
49
+ * order preserved inside each band. `_pinnedOffset` is the distance from that
50
+ * column's own edge — the sum of the widths of the pinned columns outside it
51
+ * — which is what the sticky `left` / `right` binding needs.
52
+ *
53
+ * With nothing pinned this returns the same array, in the same order, so a
54
+ * grid that does not use the feature is unaffected.
55
+ */
56
+ applyPinning(columns) {
57
+ const left = columns.filter(column => column.pinned === 'left');
58
+ const right = columns.filter(column => column.pinned === 'right');
59
+ if (!left.length && !right.length) {
60
+ for (const column of columns) {
61
+ column._pinnedOffset = null;
62
+ column._pinnedEdge = false;
63
+ }
64
+ return columns;
65
+ }
66
+ const center = columns.filter(column => column.pinned !== 'left' && column.pinned !== 'right');
67
+ let offset = 0;
68
+ for (const column of left) {
69
+ column._pinnedOffset = offset;
70
+ column._pinnedEdge = false;
71
+ offset += resolveColumnWidth(column);
72
+ }
73
+ // Right-pinned columns are measured from the right edge inwards, so the
74
+ // last declared one sits flush and the earlier ones stack outside it.
75
+ offset = 0;
76
+ for (let index = right.length - 1; index >= 0; index--) {
77
+ right[index]._pinnedOffset = offset;
78
+ right[index]._pinnedEdge = false;
79
+ offset += resolveColumnWidth(right[index]);
80
+ }
81
+ for (const column of center) {
82
+ column._pinnedOffset = null;
83
+ column._pinnedEdge = false;
84
+ }
85
+ // Only the innermost column of each band carries the divider, so stacked
86
+ // pinned columns do not each cast a shadow onto the next.
87
+ if (left.length)
88
+ left[left.length - 1]._pinnedEdge = true;
89
+ if (right.length)
90
+ right[0]._pinnedEdge = true;
91
+ return [...left, ...center, ...right];
92
+ }
93
+ /** Total width of the columns frozen against the given edge. */
94
+ getPinnedWidth(side) {
95
+ return this.columnDefs$.getValue()
96
+ .filter(column => column.pinned === side)
97
+ .reduce((total, column) => total + resolveColumnWidth(column), 0);
36
98
  }
37
99
  // Update single column
38
100
  updateColumnDef(id, changes) {
39
101
  const columns = this.getColumnState().columns;
40
102
  const updatedColumns = columns.map(col => col.id === id ? { ...col, ...changes } : col);
41
- this.recalculateGroups(updatedColumns);
42
- this.columnDefs$.next(updatedColumns);
103
+ // Re-pinned, not just re-grouped: resizing a pinned column changes where
104
+ // the ones inside it have to sit, and this is the path a column resize
105
+ // takes.
106
+ const ordered = this.applyPinning(updatedColumns);
107
+ this.recalculateGroups(ordered);
108
+ this.columnDefs$.next(ordered);
43
109
  }
44
110
  // Reorder columns
45
111
  reorderColumnDefs(fromIndex, toIndex) {
46
112
  const columns = lodash.clone(this.getColumnState().columns);
47
113
  const [moved] = columns.splice(fromIndex, 1);
48
114
  columns.splice(toIndex, 0, moved);
49
- this.columnDefs$.next(columns);
115
+ // Dragging can drop a column between two pinned ones; re-pinning puts the
116
+ // bands back in order rather than leaving them interleaved, which would
117
+ // make the computed offsets meaningless.
118
+ this.columnDefs$.next(this.applyPinning(columns));
50
119
  }
51
120
  /**
52
121
  * Group Header Columns
@@ -55,7 +124,7 @@ export class OgColumnService {
55
124
  if (this.groupColumnDefs$.getValue().length > 0) {
56
125
  const groups = this.groupColumnDefs$.value.map(group => ({
57
126
  ...group,
58
- width: columnDefs.filter(c => c.groupId === group.id).reduce((sum, col) => sum + (col.width ? col.width > col.maxWidth ? col.maxWidth : col.width < col.minWidth ? col.minWidth : col.width : col.minWidth), 0)
127
+ width: columnDefs.filter(c => c.groupId === group.id).reduce((sum, col) => sum + resolveColumnWidth(col), 0)
59
128
  }));
60
129
  this.groupColumnDefs$.next(groups);
61
130
  }
@@ -65,17 +134,55 @@ export class OgColumnService {
65
134
  col._resolvedGroupStyle = typeof col.groupStyle === 'function' ? col.groupStyle(params) : col.groupStyle;
66
135
  return col;
67
136
  }
68
- resolveCellPresentation(col, params) {
137
+ /**
138
+ * Resolve a column's header presentation. Once per column, when the columns
139
+ * are set — a header is one cell for the whole column, so there is no row to
140
+ * resolve it against and nothing to redo per render.
141
+ *
142
+ * This used to resolve the cell hooks too, from the same call, with no params
143
+ * at all. Two bugs came out of that: any callback touching `params` threw a
144
+ * TypeError at init, and the header's resolved value was then overwritten by
145
+ * every cell that rendered, since the body re-ran the same method per cell
146
+ * with row params. In dev mode the disagreement surfaced as NG0100.
147
+ */
148
+ resolveHeaderPresentation(col) {
149
+ const params = {
150
+ columnDef: col,
151
+ field: col.field,
152
+ context: this.context,
153
+ };
69
154
  col._resolvedHeaderClass = typeof col.headerClass === 'function' ? col.headerClass(params) : col.headerClass;
70
155
  col._resolvedHeaderStyle = typeof col.headerStyle === 'function' ? col.headerStyle(params) : col.headerStyle;
71
- col._resolvedCellClass = typeof col.cellClass === 'function' ? col.cellClass(params) : col.cellClass;
72
- col._resolvedCellStyle = typeof col.cellStyle === 'function' ? col.cellStyle(params) : col.cellStyle;
156
+ // The header's own predicates. Declared as `boolean | ((params) => boolean)`
157
+ // and read straight off the column in the template, where a function is
158
+ // simply truthy — so `sortable: () => false` rendered a sort button that a
159
+ // consumer had explicitly asked not to have. Resolved here to a real
160
+ // boolean, once, because none of them depends on a row.
161
+ col._resolvedSortable = resolveOneCellRendererParams(col.sortable, params);
162
+ col._resolvedResizable = resolveOneCellRendererParams(col.resizable, params);
163
+ col._resolvedDragable = resolveOneCellRendererParams(col.dragable, params);
164
+ col._resolvedSuppressHeaderMenuButton = resolveOneCellRendererParams(col.suppressHeaderMenuButton, params);
73
165
  return col;
74
166
  }
167
+ /**
168
+ * Resolve one cell's class, for one row.
169
+ *
170
+ * Pure: the result is returned rather than written back onto the column def,
171
+ * which every row of that column shares. Writing to it worked only because
172
+ * the template resolved and read in the same expression — one render order
173
+ * away from every row showing the last row's class.
174
+ */
175
+ resolveCellClass(col, params) {
176
+ return typeof col?.cellClass === 'function' ? col.cellClass(params) : col?.cellClass;
177
+ }
178
+ /** Resolve one cell's inline style, for one row. Pure, as above. */
179
+ resolveCellStyle(col, params) {
180
+ return typeof col?.cellStyle === 'function' ? col.cellStyle(params) : col?.cellStyle;
181
+ }
75
182
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OgColumnService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
76
183
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OgColumnService }); }
77
184
  }
78
185
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OgColumnService, decorators: [{
79
186
  type: Injectable
80
187
  }] });
81
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ctY29sdW1uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmUtZ3JpZC9zcmMvbGliL2NvcmUvc2VydmljZXMvb2ctY29sdW1uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXZDLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQzs7QUFJNUIsTUFBTSxPQUFPLGVBQWU7SUFENUI7UUFHVSxxQkFBZ0IsR0FBaUIsSUFBSSxDQUFDO1FBQ3RDLGdCQUFXLEdBQUcsSUFBSSxlQUFlLENBQWlCLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELHFCQUFnQixHQUFHLElBQUksZUFBZSxDQUFzQixFQUFFLENBQUMsQ0FBQztLQXVHekU7SUFyR0MsY0FBYyxDQUFDLGdCQUE4QixFQUFFLFVBQTBCLEVBQUUsZUFBb0M7UUFFN0csSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO1FBRXpDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUV6QyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxjQUFjO1FBRVosTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUU1QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFaEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsa0JBQWtCLENBQUMsZUFBb0M7UUFFckQsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQXdCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FB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QUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQztRQUNyRyxHQUFHLENBQUMsa0JBQWtCLEdBQUcsT0FBTyxHQUFHLENBQUMsU0FBUyxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQztRQUVyRyxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7K0dBMUdVLGVBQWU7bUhBQWYsZUFBZTs7NEZBQWYsZUFBZTtrQkFEM0IsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgT25lQ2VsbFJlbmRlcmVyUGFyYW1zLCBPbmVDb2x1bW5EZWYsIE9uZUdyb3VwQ29sdW1uRGVmIH0gZnJvbSAnLi4vbW9kZWxzL29uZS1jb2x1bW4tZGVmLXR5cGVzLm1vZGVsJztcbmltcG9ydCBsb2Rhc2ggZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IENvbHVtbkNoYW5nZWRFdmVudCB9IGZyb20gJy4uL21vZGVscy9vbmUtZXZlbnQtdHlwZXMubW9kZWwnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgT2dDb2x1bW5TZXJ2aWNlIHtcblxuICBwcml2YXRlIGRlZmF1bHRDb2x1bW5EZWY6IE9uZUNvbHVtbkRlZiA9IG51bGw7XG4gIHByaXZhdGUgY29sdW1uRGVmcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE9uZUNvbHVtbkRlZltdPihbXSk7XG4gIHByaXZhdGUgZ3JvdXBDb2x1bW5EZWZzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8T25lR3JvdXBDb2x1bW5EZWZbXT4oW10pO1xuXG4gIGluaXRDb2x1bW5EZWZzKGRlZmF1bHRDb2x1bW5EZWY6IE9uZUNvbHVtbkRlZiwgY29sdW1uRGVmczogT25lQ29sdW1uRGVmW10sIGdyb3VwQ29sdW1uRGVmczogT25lR3JvdXBDb2x1bW5EZWZbXSk6IHZvaWQge1xuXG4gICAgdGhpcy5kZWZhdWx0Q29sdW1uRGVmID0gZGVmYXVsdENvbHVtbkRlZjtcblxuICAgIHRoaXMuc2V0R3JvdXBDb2x1bW5EZWZzKGdyb3VwQ29sdW1uRGVmcyk7XG4gICAgXG4gICAgdGhpcy5zZXRDb2x1bW5EZWZzKGNvbHVtbkRlZnMpO1xuICB9XG5cbiAgZ2V0Q29sdW1uU3RhdGUoKTogQ29sdW1uQ2hhbmdlZEV2ZW50IHtcblxuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbHVtbkRlZnMkLmdldFZhbHVlKCk7XG5cbiAgICBjb25zdCBncm91cHMgPSB0aGlzLmdyb3VwQ29sdW1uRGVmcyQuZ2V0VmFsdWUoKTtcblxuICAgIHJldHVybiB7IGNvbHVtbnMsIGdyb3VwcyB9O1xuICB9XG5cbiAgc2V0R3JvdXBDb2x1bW5EZWZzKGdyb3VwQ29sdW1uRGVmczogT25lR3JvdXBDb2x1bW5EZWZbXSk6IHZvaWQge1xuXG4gICAgY29uc3QgZ3JvdXBzID0gZ3JvdXBDb2x1bW5EZWZzLm1hcCgoZ3JvdXA6IE9uZUdyb3VwQ29sdW1uRGVmKSA9PiB0aGlzLnJlc29sdmVHcm91cFByZXNlbnRhdGlvbihncm91cCkpO1xuXG4gICAgdGhpcy5ncm91cENvbHVtbkRlZnMkLm5leHQoZ3JvdXBzKTtcbiAgfVxuXG4gIHNldENvbHVtbkRlZnMoY29sdW1uRGVmczogT25lQ29sdW1uRGVmW10pOiB2b2lkIHtcblxuICAgIGNvbnN0IGNvbHVtbnMgPSBjb2x1bW5EZWZzLm1hcCgoY29sOiBPbmVDb2x1bW5EZWYpID0+IHtcblxuICAgICAgY29uc3QgY29sdW1uID0ge1xuICAgICAgICAuLi50aGlzLmRlZmF1bHRDb2x1bW5EZWYsXG4gICAgICAgIC4uLmNvbCxcbiAgICAgICAgaWQ6IGNvbD8uZmllbGQgPyBjb2wuZmllbGQgOiBsb2Rhc2gudW5pcXVlSWQoJ2NvbF8nKSxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmVDZWxsUHJlc2VudGF0aW9uKGNvbHVtbik7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlY2FsY3VsYXRlR3JvdXBzKGNvbHVtbnMpO1xuXG4gICAgdGhpcy5jb2x1bW5EZWZzJC5uZXh0KGNvbHVtbnMpO1xuICB9XG5cbiAgLy8gVXBkYXRlIHNpbmdsZSBjb2x1bW5cbiAgdXBkYXRlQ29sdW1uRGVmKGlkOiBzdHJpbmcsIGNoYW5nZXM6IFBhcnRpYWw8T25lQ29sdW1uRGVmPik6IHZvaWQge1xuXG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMuZ2V0Q29sdW1uU3RhdGUoKS5jb2x1bW5zO1xuXG4gICAgY29uc3QgdXBkYXRlZENvbHVtbnMgPSBjb2x1bW5zLm1hcChjb2wgPT4gY29sLmlkID09PSBpZCA/IHsgLi4uY29sLCAuLi5jaGFuZ2VzIH0gOiBjb2wpO1xuXG4gICAgdGhpcy5yZWNhbGN1bGF0ZUdyb3Vwcyh1cGRhdGVkQ29sdW1ucyk7XG4gICAgXG4gICAgdGhpcy5jb2x1bW5EZWZzJC5uZXh0KHVwZGF0ZWRDb2x1bW5zKTtcbiAgfVxuXG4gIC8vIFJlb3JkZXIgY29sdW1uc1xuICByZW9yZGVyQ29sdW1uRGVmcyhmcm9tSW5kZXg6IG51bWJlciwgdG9JbmRleDogbnVtYmVyKTogdm9pZCB7XG5cbiAgICBjb25zdCBjb2x1bW5zID0gbG9kYXNoLmNsb25lKHRoaXMuZ2V0Q29sdW1uU3RhdGUoKS5jb2x1bW5zKTtcblxuICAgIGNvbnN0IFttb3ZlZF0gPSBjb2x1bW5zLnNwbGljZShmcm9tSW5kZXgsIDEpO1xuXG4gICAgY29sdW1ucy5zcGxpY2UodG9JbmRleCwgMCwgbW92ZWQpO1xuXG4gICAgdGhpcy5jb2x1bW5EZWZzJC5uZXh0KGNvbHVtbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyb3VwIEhlYWRlciBDb2x1bW5zXG4gICAqL1xuICBwcml2YXRlIHJlY2FsY3VsYXRlR3JvdXBzKGNvbHVtbkRlZnM6IE9uZUNvbHVtbkRlZltdKSB7XG5cbiAgICBpZiAodGhpcy5ncm91cENvbHVtbkRlZnMkLmdldFZhbHVlKCkubGVuZ3RoID4gMCkge1xuXG4gICAgICBjb25zdCBncm91cHMgPSB0aGlzLmdyb3VwQ29sdW1uRGVmcyQudmFsdWUubWFwKGdyb3VwID0+ICh7XG4gICAgICAgIC4uLmdyb3VwLFxuICAgICAgICB3aWR0aDogY29sdW1uRGVmcy5maWx0ZXIoYyA9PiBjLmdyb3VwSWQgPT09IGdyb3VwLmlkKS5yZWR1Y2UoKHN1bSwgY29sKSA9PiBzdW0gKyAoY29sLndpZHRoID8gY29sLndpZHRoID4gY29sLm1heFdpZHRoID8gY29sLm1heFdpZHRoIDogY29sLndpZHRoIDwgY29sLm1pbldpZHRoID8gY29sLm1pbldpZHRoIDogY29sLndpZHRoIDogY29sLm1pbldpZHRoKSwgMClcbiAgICAgIH0pKTtcblxuICAgICAgdGhpcy5ncm91cENvbHVtbkRlZnMkLm5leHQoZ3JvdXBzKTtcbiAgICB9XG4gIH1cblxuICByZXNvbHZlR3JvdXBQcmVzZW50YXRpb24oY29sOiBPbmVHcm91cENvbHVtbkRlZiwgcGFyYW1zPzogT25lQ2VsbFJlbmRlcmVyUGFyYW1zKTogT25lR3JvdXBDb2x1bW5EZWYge1xuXG4gICAgY29sLl9yZXNvbHZlZEdyb3VwQ2xhc3MgPSB0eXBlb2YgY29sLmdyb3VwQ2xhc3MgPT09ICdmdW5jdGlvbicgPyBjb2wuZ3JvdXBDbGFzcyhwYXJhbXMpIDogY29sLmdyb3VwQ2xhc3M7XG4gICAgY29sLl9yZXNvbHZlZEdyb3VwU3R5bGUgPSB0eXBlb2YgY29sLmdyb3VwU3R5bGUgPT09ICdmdW5jdGlvbicgPyBjb2wuZ3JvdXBTdHlsZShwYXJhbXMpIDogY29sLmdyb3VwU3R5bGU7XG5cbiAgICByZXR1cm4gY29sO1xuICB9XG5cbiAgcmVzb2x2ZUNlbGxQcmVzZW50YXRpb24oY29sOiBPbmVDb2x1bW5EZWYsIHBhcmFtcz86IE9uZUNlbGxSZW5kZXJlclBhcmFtcyk6IE9uZUNvbHVtbkRlZiB7XG5cbiAgICBjb2wuX3Jlc29sdmVkSGVhZGVyQ2xhc3MgPSB0eXBlb2YgY29sLmhlYWRlckNsYXNzID09PSAnZnVuY3Rpb24nID8gY29sLmhlYWRlckNsYXNzKHBhcmFtcykgOiBjb2wuaGVhZGVyQ2xhc3M7XG4gICAgY29sLl9yZXNvbHZlZEhlYWRlclN0eWxlID0gdHlwZW9mIGNvbC5oZWFkZXJTdHlsZSA9PT0gJ2Z1bmN0aW9uJyA/IGNvbC5oZWFkZXJTdHlsZShwYXJhbXMpIDogY29sLmhlYWRlclN0eWxlO1xuXG4gICAgY29sLl9yZXNvbHZlZENlbGxDbGFzcyA9IHR5cGVvZiBjb2wuY2VsbENsYXNzID09PSAnZnVuY3Rpb24nID8gY29sLmNlbGxDbGFzcyhwYXJhbXMpIDogY29sLmNlbGxDbGFzcztcbiAgICBjb2wuX3Jlc29sdmVkQ2VsbFN0eWxlID0gdHlwZW9mIGNvbC5jZWxsU3R5bGUgPT09ICdmdW5jdGlvbicgPyBjb2wuY2VsbFN0eWxlKHBhcmFtcykgOiBjb2wuY2VsbFN0eWxlO1xuXG4gICAgcmV0dXJuIGNvbDtcbiAgfVxufSJdfQ==
188
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ctY29sdW1uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmUtZ3JpZC9zcmMvbGliL2NvcmUvc2VydmljZXMvb2ctY29sdW1uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXZDLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUU1QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7QUFHdkcsTUFBTSxPQUFPLGVBQWU7SUFENUI7UUFHVSxxQkFBZ0IsR0FBaUIsSUFBSSxDQUFDO1FBRTlDOzs7V0FHRztRQUNLLFlBQU8sR0FBWSxJQUFJLENBQUM7UUFDeEIsZ0JBQVcsR0FBRyxJQUFJLGVBQWUsQ0FBaUIsRUFBRSxDQUFDLENBQUM7UUFDdEQscUJBQWdCLEdBQUcsSUFBSSxlQUFlLENBQXNCLEVBQUUsQ0FBQyxDQUFDO0tBdU96RTtJQXJPQyxjQUFjLENBQUMsZ0JBQThCLEVBQUUsVUFBMEIsRUFBRSxlQUFvQyxFQUFFLFVBQW1CLElBQUk7UUFFdEksSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO1FBRXpDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBRXZCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUV6QyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxjQUFjO1FBRVosTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUU1QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLENBQUM7UUFF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Q3ZGLENBQUM7K0dBaFBVLGVBQWU7bUhBQWYsZUFBZTs7NEZBQWYsZUFBZTtrQkFEM0IsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgT25lQ2VsbFByZXNlbnRhdGlvblBhcmFtcywgT25lQ2VsbFJlbmRlcmVyUGFyYW1zLCBPbmVDb2x1bW5EZWYsIE9uZUdyb3VwQ29sdW1uRGVmLCBPbmVIZWFkZXJQcmVzZW50YXRpb25QYXJhbXMgfSBmcm9tICcuLi9tb2RlbHMvb25lLWNvbHVtbi1kZWYtdHlwZXMubW9kZWwnO1xuaW1wb3J0IGxvZGFzaCBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgQ29sdW1uQ2hhbmdlZEV2ZW50IH0gZnJvbSAnLi4vbW9kZWxzL29uZS1ldmVudC10eXBlcy5tb2RlbCc7XG5pbXBvcnQgeyByZXNvbHZlQ29sdW1uV2lkdGgsIHJlc29sdmVPbmVDZWxsUmVuZGVyZXJQYXJhbXMgfSBmcm9tICcuLi8uLi9oZWxwZXJzL29uZS1jb2x1bW4tZGVmLmhlbHBlcic7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBPZ0NvbHVtblNlcnZpY2Uge1xuXG4gIHByaXZhdGUgZGVmYXVsdENvbHVtbkRlZjogT25lQ29sdW1uRGVmID0gbnVsbDtcblxuICAvKipcbiAgICogVGhlIGdyaWQncyBgY29udGV4dGAsIHNvIGhlYWRlciBjYWxsYmFja3MgcmVjZWl2ZSB0aGUgc2FtZSBvbmUgY2VsbFxuICAgKiBjYWxsYmFja3MgZG8uIFNldCBkdXJpbmcgaW5pdDsgbnVsbCBpbiBhIGJhcmUgc2VydmljZS5cbiAgICovXG4gIHByaXZhdGUgY29udGV4dDogdW5rbm93biA9IG51bGw7XG4gIHByaXZhdGUgY29sdW1uRGVmcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE9uZUNvbHVtbkRlZltdPihbXSk7XG4gIHByaXZhdGUgZ3JvdXBDb2x1bW5EZWZzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8T25lR3JvdXBDb2x1bW5EZWZbXT4oW10pO1xuXG4gIGluaXRDb2x1bW5EZWZzKGRlZmF1bHRDb2x1bW5EZWY6IE9uZUNvbHVtbkRlZiwgY29sdW1uRGVmczogT25lQ29sdW1uRGVmW10sIGdyb3VwQ29sdW1uRGVmczogT25lR3JvdXBDb2x1bW5EZWZbXSwgY29udGV4dDogdW5rbm93biA9IG51bGwpOiB2b2lkIHtcblxuICAgIHRoaXMuZGVmYXVsdENvbHVtbkRlZiA9IGRlZmF1bHRDb2x1bW5EZWY7XG5cbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuXG4gICAgdGhpcy5zZXRHcm91cENvbHVtbkRlZnMoZ3JvdXBDb2x1bW5EZWZzKTtcbiAgICBcbiAgICB0aGlzLnNldENvbHVtbkRlZnMoY29sdW1uRGVmcyk7XG4gIH1cblxuICBnZXRDb2x1bW5TdGF0ZSgpOiBDb2x1bW5DaGFuZ2VkRXZlbnQge1xuXG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMuY29sdW1uRGVmcyQuZ2V0VmFsdWUoKTtcblxuICAgIGNvbnN0IGdyb3VwcyA9IHRoaXMuZ3JvdXBDb2x1bW5EZWZzJC5nZXRWYWx1ZSgpO1xuXG4gICAgcmV0dXJuIHsgY29sdW1ucywgZ3JvdXBzIH07XG4gIH1cblxuICBzZXRHcm91cENvbHVtbkRlZnMoZ3JvdXBDb2x1bW5EZWZzOiBPbmVHcm91cENvbHVtbkRlZltdKTogdm9pZCB7XG5cbiAgICBjb25zdCBncm91cHMgPSBncm91cENvbHVtbkRlZnMubWFwKChncm91cDogT25lR3JvdXBDb2x1bW5EZWYpID0+IHRoaXMucmVzb2x2ZUdyb3VwUHJlc2VudGF0aW9uKGdyb3VwLCB7IGNvbnRleHQ6IHRoaXMuY29udGV4dCB9KSk7XG5cbiAgICB0aGlzLmdyb3VwQ29sdW1uRGVmcyQubmV4dChncm91cHMpO1xuICB9XG5cbiAgc2V0Q29sdW1uRGVmcyhjb2x1bW5EZWZzOiBPbmVDb2x1bW5EZWZbXSk6IHZvaWQge1xuXG4gICAgY29uc3QgY29sdW1ucyA9IGNvbHVtbkRlZnMubWFwKChjb2w6IE9uZUNvbHVtbkRlZikgPT4ge1xuXG4gICAgICBjb25zdCBjb2x1bW4gPSB7XG4gICAgICAgIC4uLnRoaXMuZGVmYXVsdENvbHVtbkRlZixcbiAgICAgICAgLi4uY29sLFxuICAgICAgICBpZDogY29sPy5maWVsZCA/IGNvbC5maWVsZCA6IGxvZGFzaC51bmlxdWVJZCgnY29sXycpLFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZUhlYWRlclByZXNlbnRhdGlvbihjb2x1bW4pO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgb3JkZXJlZCA9IHRoaXMuYXBwbHlQaW5uaW5nKGNvbHVtbnMpO1xuXG4gICAgdGhpcy5yZWNhbGN1bGF0ZUdyb3VwcyhvcmRlcmVkKTtcblxuICAgIHRoaXMuY29sdW1uRGVmcyQubmV4dChvcmRlcmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIHBpbm5lZCBjb2x1bW5zIHRvIHRoZWlyIGVkZ2UgYW5kIG1lYXN1cmUgaG93IGZhciBpbiBlYWNoIG9uZSBzaXRzLlxuICAgKlxuICAgKiBEaXNwbGF5IG9yZGVyIGJlY29tZXMgbGVmdC1waW5uZWQsIHVucGlubmVkLCByaWdodC1waW5uZWQsIHdpdGggZGVjbGFyZWRcbiAgICogb3JkZXIgcHJlc2VydmVkIGluc2lkZSBlYWNoIGJhbmQuIGBfcGlubmVkT2Zmc2V0YCBpcyB0aGUgZGlzdGFuY2UgZnJvbSB0aGF0XG4gICAqIGNvbHVtbidzIG93biBlZGdlIOKAlCB0aGUgc3VtIG9mIHRoZSB3aWR0aHMgb2YgdGhlIHBpbm5lZCBjb2x1bW5zIG91dHNpZGUgaXRcbiAgICog4oCUIHdoaWNoIGlzIHdoYXQgdGhlIHN0aWNreSBgbGVmdGAgLyBgcmlnaHRgIGJpbmRpbmcgbmVlZHMuXG4gICAqXG4gICAqIFdpdGggbm90aGluZyBwaW5uZWQgdGhpcyByZXR1cm5zIHRoZSBzYW1lIGFycmF5LCBpbiB0aGUgc2FtZSBvcmRlciwgc28gYVxuICAgKiBncmlkIHRoYXQgZG9lcyBub3QgdXNlIHRoZSBmZWF0dXJlIGlzIHVuYWZmZWN0ZWQuXG4gICAqL1xuICBwcml2YXRlIGFwcGx5UGlubmluZyhjb2x1bW5zOiBPbmVDb2x1bW5EZWZbXSk6IE9uZUNvbHVtbkRlZltdIHtcblxuICAgIGNvbnN0IGxlZnQgPSBjb2x1bW5zLmZpbHRlcihjb2x1bW4gPT4gY29sdW1uLnBpbm5lZCA9PT0gJ2xlZnQnKTtcbiAgICBjb25zdCByaWdodCA9IGNvbHVtbnMuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4ucGlubmVkID09PSAncmlnaHQnKTtcblxuICAgIGlmICghbGVmdC5sZW5ndGggJiYgIXJpZ2h0Lmxlbmd0aCkge1xuXG4gICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG5cbiAgICAgICAgY29sdW1uLl9waW5uZWRPZmZzZXQgPSBudWxsO1xuICAgICAgICBjb2x1bW4uX3Bpbm5lZEVkZ2UgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbHVtbnM7XG4gICAgfVxuXG4gICAgY29uc3QgY2VudGVyID0gY29sdW1ucy5maWx0ZXIoY29sdW1uID0+IGNvbHVtbi5waW5uZWQgIT09ICdsZWZ0JyAmJiBjb2x1bW4ucGlubmVkICE9PSAncmlnaHQnKTtcblxuICAgIGxldCBvZmZzZXQgPSAwO1xuXG4gICAgZm9yIChjb25zdCBjb2x1bW4gb2YgbGVmdCkge1xuXG4gICAgICBjb2x1bW4uX3Bpbm5lZE9mZnNldCA9IG9mZnNldDtcbiAgICAgIGNvbHVtbi5fcGlubmVkRWRnZSA9IGZhbHNlO1xuXG4gICAgICBvZmZzZXQgKz0gcmVzb2x2ZUNvbHVtbldpZHRoKGNvbHVtbik7XG4gICAgfVxuXG4gICAgLy8gUmlnaHQtcGlubmVkIGNvbHVtbnMgYXJlIG1lYXN1cmVkIGZyb20gdGhlIHJpZ2h0IGVkZ2UgaW53YXJkcywgc28gdGhlXG4gICAgLy8gbGFzdCBkZWNsYXJlZCBvbmUgc2l0cyBmbHVzaCBhbmQgdGhlIGVhcmxpZXIgb25lcyBzdGFjayBvdXRzaWRlIGl0LlxuICAgIG9mZnNldCA9IDA7XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IHJpZ2h0Lmxlbmd0aCAtIDE7IGluZGV4ID49IDA7IGluZGV4LS0pIHtcblxuICAgICAgcmlnaHRbaW5kZXhdLl9waW5uZWRPZmZzZXQgPSBvZmZzZXQ7XG4gICAgICByaWdodFtpbmRleF0uX3Bpbm5lZEVkZ2UgPSBmYWxzZTtcblxuICAgICAgb2Zmc2V0ICs9IHJlc29sdmVDb2x1bW5XaWR0aChyaWdodFtpbmRleF0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGNlbnRlcikge1xuXG4gICAgICBjb2x1bW4uX3Bpbm5lZE9mZnNldCA9IG51bGw7XG4gICAgICBjb2x1bW4uX3Bpbm5lZEVkZ2UgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBPbmx5IHRoZSBpbm5lcm1vc3QgY29sdW1uIG9mIGVhY2ggYmFuZCBjYXJyaWVzIHRoZSBkaXZpZGVyLCBzbyBzdGFja2VkXG4gICAgLy8gcGlubmVkIGNvbHVtbnMgZG8gbm90IGVhY2ggY2FzdCBhIHNoYWRvdyBvbnRvIHRoZSBuZXh0LlxuICAgIGlmIChsZWZ0Lmxlbmd0aCkgbGVmdFtsZWZ0Lmxlbmd0aCAtIDFdLl9waW5uZWRFZGdlID0gdHJ1ZTtcbiAgICBpZiAocmlnaHQubGVuZ3RoKSByaWdodFswXS5fcGlubmVkRWRnZSA9IHRydWU7XG5cbiAgICByZXR1cm4gWy4uLmxlZnQsIC4uLmNlbnRlciwgLi4ucmlnaHRdO1xuICB9XG5cbiAgLyoqIFRvdGFsIHdpZHRoIG9mIHRoZSBjb2x1bW5zIGZyb3plbiBhZ2FpbnN0IHRoZSBnaXZlbiBlZGdlLiAqL1xuICBwdWJsaWMgZ2V0UGlubmVkV2lkdGgoc2lkZTogJ2xlZnQnIHwgJ3JpZ2h0Jyk6IG51bWJlciB7XG5cbiAgICByZXR1cm4gdGhpcy5jb2x1bW5EZWZzJC5nZXRWYWx1ZSgpXG4gICAgICAuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4ucGlubmVkID09PSBzaWRlKVxuICAgICAgLnJlZHVjZSgodG90YWwsIGNvbHVtbikgPT4gdG90YWwgKyByZXNvbHZlQ29sdW1uV2lkdGgoY29sdW1uKSwgMCk7XG4gIH1cblxuICAvLyBVcGRhdGUgc2luZ2xlIGNvbHVtblxuICB1cGRhdGVDb2x1bW5EZWYoaWQ6IHN0cmluZywgY2hhbmdlczogUGFydGlhbDxPbmVDb2x1bW5EZWY+KTogdm9pZCB7XG5cbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5nZXRDb2x1bW5TdGF0ZSgpLmNvbHVtbnM7XG5cbiAgICBjb25zdCB1cGRhdGVkQ29sdW1ucyA9IGNvbHVtbnMubWFwKGNvbCA9PiBjb2wuaWQgPT09IGlkID8geyAuLi5jb2wsIC4uLmNoYW5nZXMgfSA6IGNvbCk7XG5cbiAgICAvLyBSZS1waW5uZWQsIG5vdCBqdXN0IHJlLWdyb3VwZWQ6IHJlc2l6aW5nIGEgcGlubmVkIGNvbHVtbiBjaGFuZ2VzIHdoZXJlXG4gICAgLy8gdGhlIG9uZXMgaW5zaWRlIGl0IGhhdmUgdG8gc2l0LCBhbmQgdGhpcyBpcyB0aGUgcGF0aCBhIGNvbHVtbiByZXNpemVcbiAgICAvLyB0YWtlcy5cbiAgICBjb25zdCBvcmRlcmVkID0gdGhpcy5hcHBseVBpbm5pbmcodXBkYXRlZENvbHVtbnMpO1xuXG4gICAgdGhpcy5yZWNhbGN1bGF0ZUdyb3VwcyhvcmRlcmVkKTtcblxuICAgIHRoaXMuY29sdW1uRGVmcyQubmV4dChvcmRlcmVkKTtcbiAgfVxuXG4gIC8vIFJlb3JkZXIgY29sdW1uc1xuICByZW9yZGVyQ29sdW1uRGVmcyhmcm9tSW5kZXg6IG51bWJlciwgdG9JbmRleDogbnVtYmVyKTogdm9pZCB7XG5cbiAgICBjb25zdCBjb2x1bW5zID0gbG9kYXNoLmNsb25lKHRoaXMuZ2V0Q29sdW1uU3RhdGUoKS5jb2x1bW5zKTtcblxuICAgIGNvbnN0IFttb3ZlZF0gPSBjb2x1bW5zLnNwbGljZShmcm9tSW5kZXgsIDEpO1xuXG4gICAgY29sdW1ucy5zcGxpY2UodG9JbmRleCwgMCwgbW92ZWQpO1xuXG4gICAgLy8gRHJhZ2dpbmcgY2FuIGRyb3AgYSBjb2x1bW4gYmV0d2VlbiB0d28gcGlubmVkIG9uZXM7IHJlLXBpbm5pbmcgcHV0cyB0aGVcbiAgICAvLyBiYW5kcyBiYWNrIGluIG9yZGVyIHJhdGhlciB0aGFuIGxlYXZpbmcgdGhlbSBpbnRlcmxlYXZlZCwgd2hpY2ggd291bGRcbiAgICAvLyBtYWtlIHRoZSBjb21wdXRlZCBvZmZzZXRzIG1lYW5pbmdsZXNzLlxuICAgIHRoaXMuY29sdW1uRGVmcyQubmV4dCh0aGlzLmFwcGx5UGlubmluZyhjb2x1bW5zKSk7XG4gIH1cblxuICAvKipcbiAgICogR3JvdXAgSGVhZGVyIENvbHVtbnNcbiAgICovXG4gIHByaXZhdGUgcmVjYWxjdWxhdGVHcm91cHMoY29sdW1uRGVmczogT25lQ29sdW1uRGVmW10pIHtcblxuICAgIGlmICh0aGlzLmdyb3VwQ29sdW1uRGVmcyQuZ2V0VmFsdWUoKS5sZW5ndGggPiAwKSB7XG5cbiAgICAgIGNvbnN0IGdyb3VwcyA9IHRoaXMuZ3JvdXBDb2x1bW5EZWZzJC52YWx1ZS5tYXAoZ3JvdXAgPT4gKHtcbiAgICAgICAgLi4uZ3JvdXAsXG4gICAgICAgIHdpZHRoOiBjb2x1bW5EZWZzLmZpbHRlcihjID0+IGMuZ3JvdXBJZCA9PT0gZ3JvdXAuaWQpLnJlZHVjZSgoc3VtLCBjb2wpID0+IHN1bSArIHJlc29sdmVDb2x1bW5XaWR0aChjb2wpLCAwKVxuICAgICAgfSkpO1xuXG4gICAgICB0aGlzLmdyb3VwQ29sdW1uRGVmcyQubmV4dChncm91cHMpO1xuICAgIH1cbiAgfVxuXG4gIHJlc29sdmVHcm91cFByZXNlbnRhdGlvbihjb2w6IE9uZUdyb3VwQ29sdW1uRGVmLCBwYXJhbXM/OiBPbmVDZWxsUmVuZGVyZXJQYXJhbXMpOiBPbmVHcm91cENvbHVtbkRlZiB7XG5cbiAgICBjb2wuX3Jlc29sdmVkR3JvdXBDbGFzcyA9IHR5cGVvZiBjb2wuZ3JvdXBDbGFzcyA9PT0gJ2Z1bmN0aW9uJyA/IGNvbC5ncm91cENsYXNzKHBhcmFtcykgOiBjb2wuZ3JvdXBDbGFzcztcbiAgICBjb2wuX3Jlc29sdmVkR3JvdXBTdHlsZSA9IHR5cGVvZiBjb2wuZ3JvdXBTdHlsZSA9PT0gJ2Z1bmN0aW9uJyA/IGNvbC5ncm91cFN0eWxlKHBhcmFtcykgOiBjb2wuZ3JvdXBTdHlsZTtcblxuICAgIHJldHVybiBjb2w7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhIGNvbHVtbidzIGhlYWRlciBwcmVzZW50YXRpb24uIE9uY2UgcGVyIGNvbHVtbiwgd2hlbiB0aGUgY29sdW1uc1xuICAgKiBhcmUgc2V0IOKAlCBhIGhlYWRlciBpcyBvbmUgY2VsbCBmb3IgdGhlIHdob2xlIGNvbHVtbiwgc28gdGhlcmUgaXMgbm8gcm93IHRvXG4gICAqIHJlc29sdmUgaXQgYWdhaW5zdCBhbmQgbm90aGluZyB0byByZWRvIHBlciByZW5kZXIuXG4gICAqXG4gICAqIFRoaXMgdXNlZCB0byByZXNvbHZlIHRoZSBjZWxsIGhvb2tzIHRvbywgZnJvbSB0aGUgc2FtZSBjYWxsLCB3aXRoIG5vIHBhcmFtc1xuICAgKiBhdCBhbGwuIFR3byBidWdzIGNhbWUgb3V0IG9mIHRoYXQ6IGFueSBjYWxsYmFjayB0b3VjaGluZyBgcGFyYW1zYCB0aHJldyBhXG4gICAqIFR5cGVFcnJvciBhdCBpbml0LCBhbmQgdGhlIGhlYWRlcidzIHJlc29sdmVkIHZhbHVlIHdhcyB0aGVuIG92ZXJ3cml0dGVuIGJ5XG4gICAqIGV2ZXJ5IGNlbGwgdGhhdCByZW5kZXJlZCwgc2luY2UgdGhlIGJvZHkgcmUtcmFuIHRoZSBzYW1lIG1ldGhvZCBwZXIgY2VsbFxuICAgKiB3aXRoIHJvdyBwYXJhbXMuIEluIGRldiBtb2RlIHRoZSBkaXNhZ3JlZW1lbnQgc3VyZmFjZWQgYXMgTkcwMTAwLlxuICAgKi9cbiAgcmVzb2x2ZUhlYWRlclByZXNlbnRhdGlvbihjb2w6IE9uZUNvbHVtbkRlZik6IE9uZUNvbHVtbkRlZiB7XG5cbiAgICBjb25zdCBwYXJhbXM6IE9uZUhlYWRlclByZXNlbnRhdGlvblBhcmFtcyA9IHtcbiAgICAgIGNvbHVtbkRlZjogY29sLFxuICAgICAgZmllbGQ6IGNvbC5maWVsZCBhcyBzdHJpbmcsXG4gICAgICBjb250ZXh0OiB0aGlzLmNvbnRleHQsXG4gICAgfTtcblxuICAgIGNvbC5fcmVzb2x2ZWRIZWFkZXJDbGFzcyA9IHR5cGVvZiBjb2wuaGVhZGVyQ2xhc3MgPT09ICdmdW5jdGlvbicgPyBjb2wuaGVhZGVyQ2xhc3MocGFyYW1zKSA6IGNvbC5oZWFkZXJDbGFzcztcbiAgICBjb2wuX3Jlc29sdmVkSGVhZGVyU3R5bGUgPSB0eXBlb2YgY29sLmhlYWRlclN0eWxlID09PSAnZnVuY3Rpb24nID8gY29sLmhlYWRlclN0eWxlKHBhcmFtcykgOiBjb2wuaGVhZGVyU3R5bGU7XG5cbiAgICAvLyBUaGUgaGVhZGVyJ3Mgb3duIHByZWRpY2F0ZXMuIERlY2xhcmVkIGFzIGBib29sZWFuIHwgKChwYXJhbXMpID0+IGJvb2xlYW4pYFxuICAgIC8vIGFuZCByZWFkIHN0cmFpZ2h0IG9mZiB0aGUgY29sdW1uIGluIHRoZSB0ZW1wbGF0ZSwgd2hlcmUgYSBmdW5jdGlvbiBpc1xuICAgIC8vIHNpbXBseSB0cnV0aHkg4oCUIHNvIGBzb3J0YWJsZTogKCkgPT4gZmFsc2VgIHJlbmRlcmVkIGEgc29ydCBidXR0b24gdGhhdCBhXG4gICAgLy8gY29uc3VtZXIgaGFkIGV4cGxpY2l0bHkgYXNrZWQgbm90IHRvIGhhdmUuIFJlc29sdmVkIGhlcmUgdG8gYSByZWFsXG4gICAgLy8gYm9vbGVhbiwgb25jZSwgYmVjYXVzZSBub25lIG9mIHRoZW0gZGVwZW5kcyBvbiBhIHJvdy5cbiAgICBjb2wuX3Jlc29sdmVkU29ydGFibGUgPSByZXNvbHZlT25lQ2VsbFJlbmRlcmVyUGFyYW1zKGNvbC5zb3J0YWJsZSwgcGFyYW1zKTtcbiAgICBjb2wuX3Jlc29sdmVkUmVzaXphYmxlID0gcmVzb2x2ZU9uZUNlbGxSZW5kZXJlclBhcmFtcyhjb2wucmVzaXphYmxlLCBwYXJhbXMpO1xuICAgIGNvbC5fcmVzb2x2ZWREcmFnYWJsZSA9IHJlc29sdmVPbmVDZWxsUmVuZGVyZXJQYXJhbXMoY29sLmRyYWdhYmxlLCBwYXJhbXMpO1xuICAgIGNvbC5fcmVzb2x2ZWRTdXBwcmVzc0hlYWRlck1lbnVCdXR0b24gPSByZXNvbHZlT25lQ2VsbFJlbmRlcmVyUGFyYW1zKGNvbC5zdXBwcmVzc0hlYWRlck1lbnVCdXR0b24sIHBhcmFtcyk7XG5cbiAgICByZXR1cm4gY29sO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgb25lIGNlbGwncyBjbGFzcywgZm9yIG9uZSByb3cuXG4gICAqXG4gICAqIFB1cmU6IHRoZSByZXN1bHQgaXMgcmV0dXJuZWQgcmF0aGVyIHRoYW4gd3JpdHRlbiBiYWNrIG9udG8gdGhlIGNvbHVtbiBkZWYsXG4gICAqIHdoaWNoIGV2ZXJ5IHJvdyBvZiB0aGF0IGNvbHVtbiBzaGFyZXMuIFdyaXRpbmcgdG8gaXQgd29ya2VkIG9ubHkgYmVjYXVzZVxuICAgKiB0aGUgdGVtcGxhdGUgcmVzb2x2ZWQgYW5kIHJlYWQgaW4gdGhlIHNhbWUgZXhwcmVzc2lvbiDigJQgb25lIHJlbmRlciBvcmRlclxuICAgKiBhd2F5IGZyb20gZXZlcnkgcm93IHNob3dpbmcgdGhlIGxhc3Qgcm93J3MgY2xhc3MuXG4gICAqL1xuICByZXNvbHZlQ2VsbENsYXNzKGNvbDogT25lQ29sdW1uRGVmLCBwYXJhbXM6IE9uZUNlbGxQcmVzZW50YXRpb25QYXJhbXMpOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG5cbiAgICByZXR1cm4gdHlwZW9mIGNvbD8uY2VsbENsYXNzID09PSAnZnVuY3Rpb24nID8gY29sLmNlbGxDbGFzcyhwYXJhbXMpIDogY29sPy5jZWxsQ2xhc3M7XG4gIH1cblxuICAvKiogUmVzb2x2ZSBvbmUgY2VsbCdzIGlubGluZSBzdHlsZSwgZm9yIG9uZSByb3cuIFB1cmUsIGFzIGFib3ZlLiAqL1xuICByZXNvbHZlQ2VsbFN0eWxlKGNvbDogT25lQ29sdW1uRGVmLCBwYXJhbXM6IE9uZUNlbGxQcmVzZW50YXRpb25QYXJhbXMpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkIHtcblxuICAgIHJldHVybiB0eXBlb2YgY29sPy5jZWxsU3R5bGUgPT09ICdmdW5jdGlvbicgPyBjb2wuY2VsbFN0eWxlKHBhcmFtcykgOiBjb2w/LmNlbGxTdHlsZTtcbiAgfVxufSJdfQ==
@@ -10,19 +10,69 @@ export class OneGridCellService {
10
10
  this._cellValueGetter = new CellValueGetterPipe();
11
11
  this._cellFieldValue = new CellFieldValuePipe();
12
12
  this._columnDefs = [];
13
+ this._api = null;
14
+ // ---------------------------------------------------------------------------
15
+ // Row-scoped column predicates
16
+ //
17
+ // Every one of these resolves the same way and receives the same params, via
18
+ // `cellParams`. They used to each build their own subset inline, which is how
19
+ // `value`, `field` and `api` came to be missing from all of them.
20
+ // ---------------------------------------------------------------------------
21
+ /** Whether this cell may be edited at all. A capability: unset means no. */
22
+ this.editableFn = (column, node) => resolveOneCellRendererParams(column?.editable, this.cellParams(column, node));
13
23
  /**
14
- * One Column Def Params Resolver
24
+ * The second edit gate, ANDed with `editable`.
25
+ *
26
+ * A restriction, so unset means "no restriction". It used to resolve through
27
+ * `!!undefined` to `false`, closing the gate on every column that did not name
28
+ * it — so `editable: true` on its own made nothing editable.
15
29
  */
16
- this.editableFn = (column, node) => resolveOneCellRendererParams(column.editable, { node, data: node.data, columnDef: column, rowIndex: node.rowIndex, context: this._context });
17
- this.updatableFn = (column, node) => resolveOneCellRendererParams(column.updatable, { node, data: node.data, columnDef: column, rowIndex: node.rowIndex, context: this._context });
18
- this.disableFn = (column, node) => resolveOneCellRendererParams(column.disable, { node, data: node.data, columnDef: column, rowIndex: node.rowIndex, context: this._context });
19
- this.dragableFn = (column, node) => resolveOneCellRendererParams(column.dragable, { node, data: node.data, columnDef: column, rowIndex: node.rowIndex, context: this._context });
20
- this.valueGetterFn = (column, node) => resolveOneValueGetterParams(column.valueGetter, { data: node.data, rowIndex: node.rowIndex, node: node, context: this._context });
30
+ this.updatableFn = (column, node) => resolveOneCellRendererParams(column?.updatable, this.cellParams(column, node), true);
31
+ /** Disables this column's row action buttons. Not an edit gate. */
32
+ this.disableFn = (column, node) => resolveOneCellRendererParams(column?.disable, this.cellParams(column, node));
33
+ /** Hides this column's row action buttons entirely. */
34
+ this.hideActionButtonFn = (column, node) => resolveOneCellRendererParams(column?.hideActionButton, this.cellParams(column, node));
35
+ /** Whether this cell carries a row drag handle. */
36
+ this.rowDragFn = (column, node) => resolveOneCellRendererParams(column?.rowDrag, this.cellParams(column, node));
37
+ this.valueGetterFn = (column, node) => resolveOneValueGetterParams(column?.valueGetter, { data: node.data, rowIndex: node.rowIndex, node, context: this._context });
21
38
  }
22
39
  applyColumnDefs(columnDefs, context) {
23
40
  this._columnDefs = columnDefs;
24
41
  this._context = context;
25
42
  }
43
+ /**
44
+ * Back-reference to the grid api, so predicate params can carry it.
45
+ *
46
+ * Pushed in rather than injected: `OneGridApi` already depends on this
47
+ * service, and injecting it back would close a DI cycle.
48
+ */
49
+ setGridApi(api) {
50
+ this._api = api;
51
+ }
52
+ /**
53
+ * The params every row-scoped column callback receives.
54
+ *
55
+ * One builder, deliberately: `editable`, `updatable`, `disable`, `rowDrag`,
56
+ * `hideActionButton`, `cellClass`, `cellStyle`, `cellRenderer` and
57
+ * `valueFormatter` are all "decide something about this cell", and a consumer
58
+ * should not have to remember which of them happens to be handed `value` or
59
+ * `field`. Each used to be called with a slightly different subset.
60
+ */
61
+ cellParams(column, node) {
62
+ return {
63
+ // Column config first, so the grid's own fields win a name collision: a
64
+ // stale `value` left in `cellRendererParams` must not shadow this cell's.
65
+ ...(column?.cellRendererParams ?? {}),
66
+ value: this.resolveValue(node, column),
67
+ data: node.data,
68
+ node,
69
+ rowIndex: node.rowIndex,
70
+ field: column?.field,
71
+ columnDef: column,
72
+ api: this._api ?? undefined,
73
+ context: this._context,
74
+ };
75
+ }
26
76
  /**
27
77
  * Generate New Node States
28
78
  */
@@ -32,48 +82,123 @@ export class OneGridCellService {
32
82
  const newStates = {};
33
83
  for (const column of this._columnDefs) {
34
84
  const field = column.field;
85
+ // Cell state is keyed by field, so a column without one contributes
86
+ // nothing. Skipping it keeps `undefined` out of the state object; such a
87
+ // column still renders its action buttons, which do not read cell state.
88
+ if (!field)
89
+ continue;
35
90
  if (field !== '_oneRowNumber') {
36
91
  newStates[field] = this.generateCellState(node, column) ?? node.cellStates[field] ?? { type: 'none', value: '' };
37
92
  }
38
93
  else {
39
- newStates[field] = node.cellStates[column.field];
94
+ newStates[field] = node.cellStates[field];
40
95
  }
41
96
  }
42
97
  return newStates;
43
98
  }
99
+ /**
100
+ * The cell's value: the `valueGetter`'s output where the column declares one,
101
+ * the raw field otherwise. This is the value, not the display text — see
102
+ * {@link formatValue}.
103
+ */
104
+ resolveValue(node, column) {
105
+ return column?.valueGetter
106
+ ? this._cellValueGetter.transform(node.data, node, column, this._context)
107
+ : this._cellFieldValue.transform(node.data, column.field);
108
+ }
109
+ /**
110
+ * Apply the column's `valueFormatter`.
111
+ *
112
+ * `valueFormatter` was declared on the column definition and called from
113
+ * nowhere — a consumer could write one, get no error, and see nothing happen.
114
+ * It runs on displayed text only, after the `valueGetter`, and is deliberately
115
+ * skipped for placeholders: an empty cell already has its own mechanism in
116
+ * `cellRendererParams.placeholder`, and two features competing to fill the
117
+ * same gap is worse than one.
118
+ *
119
+ * Note that sorting and filtering read the underlying row data, not this —
120
+ * which is exactly why formatting belongs here rather than in the getter.
121
+ */
122
+ formatValue(node, column, value) {
123
+ if (typeof column?.valueFormatter !== 'function')
124
+ return value;
125
+ // `value` is passed explicitly rather than left to `cellParams`: the empty
126
+ // -cell branch resolves it through the getter before deciding whether there
127
+ // is anything to format, and the formatter must see that same value.
128
+ return column.valueFormatter({ ...this.cellParams(column, node), value });
129
+ }
130
+ /**
131
+ * The placeholder for an empty cell, or `undefined` when this row's tree
132
+ * depth may not be edited.
133
+ *
134
+ * `cellRendererParams.placeholder` is a prompt, not data: it renders at half
135
+ * opacity where the value would go, which reads as "click here and fill this
136
+ * in". On the auto group column `editableLevels` decides which depths accept
137
+ * an edit at all, so a depth outside that list was advertising an edit the
138
+ * grid then refuses — the cell offers no input and the prompt never clears.
139
+ *
140
+ * The suppression is scoped to columns that actually declare `editableLevels`.
141
+ * The list is opt-in, and a column without one has no per-level rules rather
142
+ * than no editable levels, so plain grids and untouched tree columns keep
143
+ * showing their placeholder exactly as before.
144
+ */
145
+ resolvePlaceholder(node, column) {
146
+ const placeholder = column?.cellRendererParams?.placeholder;
147
+ const editableLevels = column?.editableLevels;
148
+ if (!column?.autoGroupField || !Array.isArray(editableLevels))
149
+ return placeholder;
150
+ return editableLevels.includes(node?.level) ? placeholder : undefined;
151
+ }
44
152
  /**
45
153
  * Generate New Node State Based on Column Field
46
154
  */
47
155
  generateCellState(node, column) {
48
- const isField = column.field !== undefined || column.field !== '' || column.field !== null;
49
- const isEmpty = this._cellFieldValueEmpty.transform(node.data, column.field);
156
+ // This was `field !== undefined || field !== '' || field !== null`, which is
157
+ // true for every possible value including all three it meant to exclude —
158
+ // `||` where `&&` was intended. It gated the four branches below, so none
159
+ // of them could ever fall through to the default. Reduced to the check it
160
+ // was reaching for: a column with no field has no value to render.
161
+ const field = column?.field;
162
+ if (!field) {
163
+ return { type: 'none', value: '' };
164
+ }
165
+ const isEmpty = this._cellFieldValueEmpty.transform(node.data, field);
50
166
  const isGroup = node.group || node.leafGroup;
51
167
  const isAutoGroup = column?.autoGroupField;
52
168
  if (column && column.cellRenderer && !isGroup) {
53
- const value = column.cellRenderer({ node, columnDef: column });
54
- return { type: 'html', value: value };
169
+ // The renderer used to be handed `{ node, columnDef }` and nothing else,
170
+ // so the obvious way to write one — `params.value` — produced the string
171
+ // "undefined", and `params.data.x` threw. It now gets exactly what every
172
+ // other row-scoped hook gets.
173
+ return { type: 'html', value: column.cellRenderer(this.cellParams(column, node)) };
55
174
  }
56
175
  // 1. Cell Group Placeholder
57
- if (isField && isEmpty && isGroup && isAutoGroup) {
58
- return { type: 'placeholder', value: column?.cellRendererParams?.placeholder ?? this._cellValueGetter.transform(node.data, node, column, this._context) ?? '' };
176
+ if (isEmpty && isGroup && isAutoGroup) {
177
+ return { type: 'placeholder', value: this.resolvePlaceholder(node, column) ?? this._cellValueGetter.transform(node.data, node, column, this._context) ?? '' };
59
178
  }
60
179
  // 2. Cell Group Text Value
61
- if (isField && isGroup && isAutoGroup) {
62
- const value = column?.valueGetter ? this._cellValueGetter.transform(node.data, node, column, this._context) : this._cellFieldValue.transform(node.data, column.field);
180
+ if (isGroup && isAutoGroup) {
181
+ const value = this.formatValue(node, column, this.resolveValue(node, column));
63
182
  return { type: 'text', value: value ?? '' };
64
183
  }
65
184
  // 3. Cell Placeholder
66
- if (isField && isEmpty && !isGroup && !isAutoGroup) {
185
+ //
186
+ // The auto group column is deliberately NOT excluded here. Cases 1 and 2
187
+ // above already claimed the group rows, so what reaches this point is a
188
+ // leaf — and a leaf on the auto group column has to render its label too,
189
+ // indented by level. Excluding it dropped every leaf through to case 5 and
190
+ // rendered the group column blank for the whole bottom row of a tree.
191
+ if (isEmpty && !isGroup) {
67
192
  const valueGetter = this._cellValueGetter.transform(node.data, node, column, this._context);
68
193
  if (valueGetter) {
69
- return { type: 'text', value: valueGetter };
194
+ return { type: 'text', value: this.formatValue(node, column, valueGetter) };
70
195
  }
71
- const placeholder = column?.cellRendererParams?.placeholder ?? '';
196
+ const placeholder = this.resolvePlaceholder(node, column) ?? '';
72
197
  return { type: 'placeholder', value: placeholder };
73
198
  }
74
- // 4. Cell Text Value
75
- if (isField && !(isGroup || isAutoGroup)) {
76
- const value = column?.valueGetter ? this._cellValueGetter.transform(node.data, node, column, this._context) : this._cellFieldValue.transform(node.data, column.field);
199
+ // 4. Cell Text Value (leaves, including the auto group column — see above)
200
+ if (!isGroup) {
201
+ const value = this.formatValue(node, column, this.resolveValue(node, column));
77
202
  return { type: 'text', value: value ?? '' };
78
203
  }
79
204
  // 5. Default
@@ -85,4 +210,4 @@ export class OneGridCellService {
85
210
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridCellService, decorators: [{
86
211
  type: Injectable
87
212
  }] });
88
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtY2VsbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25lLWdyaWQvc3JjL2xpYi9jb3JlL3NlcnZpY2VzL29uZS1ncmlkLWNlbGwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRS9FLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2hILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOztBQUdwRSxNQUFNLE9BQU8sa0JBQWtCO0lBRC9CO1FBR1UseUJBQW9CLEdBQUcsSUFBSSx1QkFBdUIsRUFBRSxDQUFDO1FBQ3JELHFCQUFnQixHQUFHLElBQUksbUJBQW1CLEVBQUUsQ0FBQztRQUM3QyxvQkFBZSxHQUFHLElBQUksa0JBQWtCLEVBQUUsQ0FBQztRQUMzQyxnQkFBVyxHQUFtQixFQUFFLENBQUM7UUE2RnpDOztXQUVHO1FBQ0ksZUFBVSxHQUFHLENBQUMsTUFBb0IsRUFBRSxJQUFnQixFQUFFLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBRXRNLGdCQUFXLEdBQUcsQ0FBQyxNQUFvQixFQUFFLElBQWdCLEVBQUUsRUFBRSxDQUFDLDRCQUE0QixDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFFeE0sY0FBUyxHQUFHLENBQUMsTUFBb0IsRUFBRSxJQUFnQixFQUFFLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBRXBNLGVBQVUsR0FBRyxDQUFDLE1BQW9CLEVBQUUsSUFBZ0IsRUFBRSxFQUFFLENBQUMsNEJBQTRCLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUV0TSxrQkFBYSxHQUFHLENBQUMsTUFBb0IsRUFBRSxJQUFnQixFQUFFLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7S0FDdE07SUF0R1EsZUFBZSxDQUFDLFVBQTBCLEVBQUUsT0FBWTtRQUU3RCxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztRQUM5QixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztJQUMxQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxrQkFBa0IsQ0FBQyxJQUFnQjtRQUV4QyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRXZCLE1BQU0sU0FBUyxHQUFrQixFQUFFLENBQUM7UUFFcEMsS0FBSyxNQUFNLE1BQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFFdEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUUzQixJQUFJLEtBQUssS0FBSyxlQUFlLEVBQUUsQ0FBQztnQkFFOUIsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDO1lBRW5ILENBQUM7aUJBQU0sQ0FBQztnQkFFTixTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkQsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxpQkFBaUIsQ0FBQyxJQUFnQixFQUFFLE1BQW9CO1FBRTdELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEtBQUssRUFBRSxJQUFJLE1BQU0sQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDO1FBQzNGLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0UsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzdDLE1BQU0sV0FBVyxHQUFHLE1BQU0sRUFBRSxjQUFjLENBQUM7UUFFM0MsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLFlBQVksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBRTlDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFFL0QsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFBO1FBQ3ZDLENBQUM7UUFFRCw0QkFBNEI7UUFDNUIsSUFBSSxPQUFPLElBQUksT0FBTyxJQUFJLE9BQU8sSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUVqRCxPQUFPLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLGtCQUFrQixFQUFFLFdBQVcsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7UUFDbEssQ0FBQztRQUVELDJCQUEyQjtRQUMzQixJQUFJLE9BQU8sSUFBSSxPQUFPLElBQUksV0FBVyxFQUFFLENBQUM7WUFFdEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUV0SyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQzlDLENBQUM7UUFFRCxzQkFBc0I7UUFDdEIsSUFBSSxPQUFPLElBQUksT0FBTyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFFbkQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRTVGLElBQUksV0FBVyxFQUFFLENBQUM7Z0JBRWhCLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsQ0FBQztZQUM5QyxDQUFDO1lBRUQsTUFBTSxXQUFXLEdBQUcsTUFBTSxFQUFFLGtCQUFrQixFQUFFLFdBQVcsSUFBSSxFQUFFLENBQUM7WUFFbEUsT0FBTyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ3JELENBQUM7UUFFRCxxQkFBcUI7UUFDckIsSUFBSSxPQUFPLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDO1lBRXpDLE1BQU0sS0FBSyxHQUFHLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFdEssT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUM5QyxDQUFDO1FBRUQsYUFBYTtRQUNiLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUNyQyxDQUFDOytHQWhHVSxrQkFBa0I7bUhBQWxCLGtCQUFrQjs7NEZBQWxCLGtCQUFrQjtrQkFEOUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9uZUNlbGxTdGF0ZSwgT25lQ2VsbFN0YXRlcywgT25lQ29sdW1uRGVmIH0gZnJvbSAnLi4vbW9kZWxzL29uZS1jb2x1bW4tZGVmLXR5cGVzLm1vZGVsJztcbmltcG9ydCB7IENlbGxGaWVsZFZhbHVlRW1wdHlQaXBlIH0gZnJvbSAnLi4vcGlwZXMvY2VsbC1maWVsZC12YWx1ZS1lbXB0eS5waXBlJztcbmltcG9ydCB7IE9uZVJvd05vZGUgfSBmcm9tICcuLi9pbnN0YW50cy9vbmUtcm93LW5vZGUuY2xhc3MnO1xuaW1wb3J0IHsgcmVzb2x2ZU9uZUNlbGxSZW5kZXJlclBhcmFtcywgcmVzb2x2ZU9uZVZhbHVlR2V0dGVyUGFyYW1zIH0gZnJvbSAnLi4vLi4vaGVscGVycy9vbmUtY29sdW1uLWRlZi5oZWxwZXInO1xuaW1wb3J0IHsgQ2VsbFZhbHVlR2V0dGVyUGlwZSB9IGZyb20gJy4uL3BpcGVzL2NlbGwtdmFsdWUtZ2V0dGVyLnBpcGUnO1xuaW1wb3J0IHsgQ2VsbEZpZWxkVmFsdWVQaXBlIH0gZnJvbSAnLi4vcGlwZXMvY2VsbC1maWVsZC12YWx1ZS5waXBlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE9uZUdyaWRDZWxsU2VydmljZSB7XG5cbiAgcHJpdmF0ZSBfY2VsbEZpZWxkVmFsdWVFbXB0eSA9IG5ldyBDZWxsRmllbGRWYWx1ZUVtcHR5UGlwZSgpO1xuICBwcml2YXRlIF9jZWxsVmFsdWVHZXR0ZXIgPSBuZXcgQ2VsbFZhbHVlR2V0dGVyUGlwZSgpO1xuICBwcml2YXRlIF9jZWxsRmllbGRWYWx1ZSA9IG5ldyBDZWxsRmllbGRWYWx1ZVBpcGUoKTtcbiAgcHJpdmF0ZSBfY29sdW1uRGVmczogT25lQ29sdW1uRGVmW10gPSBbXTtcbiAgcHJpdmF0ZSBfY29udGV4dDogYW55O1xuXG4gIHB1YmxpYyBhcHBseUNvbHVtbkRlZnMoY29sdW1uRGVmczogT25lQ29sdW1uRGVmW10sIGNvbnRleHQ6IGFueSkge1xuXG4gICAgdGhpcy5fY29sdW1uRGVmcyA9IGNvbHVtbkRlZnM7XG4gICAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgTmV3IE5vZGUgU3RhdGVzXG4gICAqL1xuICBwdWJsaWMgZ2VuZXJhdGVDZWxsU3RhdGVzKG5vZGU6IE9uZVJvd05vZGUpOiBPbmVDZWxsU3RhdGVzIHwgbnVsbCB7XG5cbiAgICBpZiAoIW5vZGUpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgbmV3U3RhdGVzOiBPbmVDZWxsU3RhdGVzID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiB0aGlzLl9jb2x1bW5EZWZzKSB7XG5cbiAgICAgIGNvbnN0IGZpZWxkID0gY29sdW1uLmZpZWxkO1xuXG4gICAgICBpZiAoZmllbGQgIT09ICdfb25lUm93TnVtYmVyJykge1xuXG4gICAgICAgIG5ld1N0YXRlc1tmaWVsZF0gPSB0aGlzLmdlbmVyYXRlQ2VsbFN0YXRlKG5vZGUsIGNvbHVtbikgPz8gbm9kZS5jZWxsU3RhdGVzW2ZpZWxkXSA/PyB7IHR5cGU6ICdub25lJywgdmFsdWU6ICcnIH07XG5cbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgbmV3U3RhdGVzW2ZpZWxkXSA9IG5vZGUuY2VsbFN0YXRlc1tjb2x1bW4uZmllbGRdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXdTdGF0ZXM7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgTmV3IE5vZGUgU3RhdGUgQmFzZWQgb24gQ29sdW1uIEZpZWxkXG4gICAqL1xuICBwdWJsaWMgZ2VuZXJhdGVDZWxsU3RhdGUobm9kZTogT25lUm93Tm9kZSwgY29sdW1uOiBPbmVDb2x1bW5EZWYpOiBPbmVDZWxsU3RhdGUge1xuXG4gICAgY29uc3QgaXNGaWVsZCA9IGNvbHVtbi5maWVsZCAhPT0gdW5kZWZpbmVkIHx8IGNvbHVtbi5maWVsZCAhPT0gJycgfHwgY29sdW1uLmZpZWxkICE9PSBudWxsO1xuICAgIGNvbnN0IGlzRW1wdHkgPSB0aGlzLl9jZWxsRmllbGRWYWx1ZUVtcHR5LnRyYW5zZm9ybShub2RlLmRhdGEsIGNvbHVtbi5maWVsZCk7XG4gICAgY29uc3QgaXNHcm91cCA9IG5vZGUuZ3JvdXAgfHwgbm9kZS5sZWFmR3JvdXA7XG4gICAgY29uc3QgaXNBdXRvR3JvdXAgPSBjb2x1bW4/LmF1dG9Hcm91cEZpZWxkO1xuXG4gICAgaWYgKGNvbHVtbiAmJiBjb2x1bW4uY2VsbFJlbmRlcmVyICYmICFpc0dyb3VwKSB7XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gY29sdW1uLmNlbGxSZW5kZXJlcih7IG5vZGUsIGNvbHVtbkRlZjogY29sdW1uIH0pO1xuXG4gICAgICByZXR1cm4geyB0eXBlOiAnaHRtbCcsIHZhbHVlOiB2YWx1ZSB9XG4gICAgfVxuXG4gICAgLy8gMS4gQ2VsbCBHcm91cCBQbGFjZWhvbGRlclxuICAgIGlmIChpc0ZpZWxkICYmIGlzRW1wdHkgJiYgaXNHcm91cCAmJiBpc0F1dG9Hcm91cCkge1xuXG4gICAgICByZXR1cm4geyB0eXBlOiAncGxhY2Vob2xkZXInLCB2YWx1ZTogY29sdW1uPy5jZWxsUmVuZGVyZXJQYXJhbXM/LnBsYWNlaG9sZGVyID8/IHRoaXMuX2NlbGxWYWx1ZUdldHRlci50cmFuc2Zvcm0obm9kZS5kYXRhLCBub2RlLCBjb2x1bW4sIHRoaXMuX2NvbnRleHQpID8/ICcnIH07XG4gICAgfVxuXG4gICAgLy8gMi4gQ2VsbCBHcm91cCBUZXh0IFZhbHVlXG4gICAgaWYgKGlzRmllbGQgJiYgaXNHcm91cCAmJiBpc0F1dG9Hcm91cCkge1xuXG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbHVtbj8udmFsdWVHZXR0ZXIgPyB0aGlzLl9jZWxsVmFsdWVHZXR0ZXIudHJhbnNmb3JtKG5vZGUuZGF0YSwgbm9kZSwgY29sdW1uLCB0aGlzLl9jb250ZXh0KSA6IHRoaXMuX2NlbGxGaWVsZFZhbHVlLnRyYW5zZm9ybShub2RlLmRhdGEsIGNvbHVtbi5maWVsZCk7XG5cbiAgICAgIHJldHVybiB7IHR5cGU6ICd0ZXh0JywgdmFsdWU6IHZhbHVlID8/ICcnIH07XG4gICAgfVxuXG4gICAgLy8gMy4gQ2VsbCBQbGFjZWhvbGRlclxuICAgIGlmIChpc0ZpZWxkICYmIGlzRW1wdHkgJiYgIWlzR3JvdXAgJiYgIWlzQXV0b0dyb3VwKSB7XG5cbiAgICAgIGNvbnN0IHZhbHVlR2V0dGVyID0gdGhpcy5fY2VsbFZhbHVlR2V0dGVyLnRyYW5zZm9ybShub2RlLmRhdGEsIG5vZGUsIGNvbHVtbiwgdGhpcy5fY29udGV4dCk7XG5cbiAgICAgIGlmICh2YWx1ZUdldHRlcikge1xuXG4gICAgICAgIHJldHVybiB7IHR5cGU6ICd0ZXh0JywgdmFsdWU6IHZhbHVlR2V0dGVyIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gY29sdW1uPy5jZWxsUmVuZGVyZXJQYXJhbXM/LnBsYWNlaG9sZGVyID8/ICcnO1xuXG4gICAgICByZXR1cm4geyB0eXBlOiAncGxhY2Vob2xkZXInLCB2YWx1ZTogcGxhY2Vob2xkZXIgfTtcbiAgICB9XG5cbiAgICAvLyA0LiBDZWxsIFRleHQgVmFsdWVcbiAgICBpZiAoaXNGaWVsZCAmJiAhKGlzR3JvdXAgfHwgaXNBdXRvR3JvdXApKSB7XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gY29sdW1uPy52YWx1ZUdldHRlciA/IHRoaXMuX2NlbGxWYWx1ZUdldHRlci50cmFuc2Zvcm0obm9kZS5kYXRhLCBub2RlLCBjb2x1bW4sIHRoaXMuX2NvbnRleHQpIDogdGhpcy5fY2VsbEZpZWxkVmFsdWUudHJhbnNmb3JtKG5vZGUuZGF0YSwgY29sdW1uLmZpZWxkKTtcblxuICAgICAgcmV0dXJuIHsgdHlwZTogJ3RleHQnLCB2YWx1ZTogdmFsdWUgPz8gJycgfTtcbiAgICB9XG5cbiAgICAvLyA1LiBEZWZhdWx0XG4gICAgcmV0dXJuIHsgdHlwZTogJ25vbmUnLCB2YWx1ZTogJycgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmUgQ29sdW1uIERlZiBQYXJhbXMgUmVzb2x2ZXJcbiAgICovXG4gIHB1YmxpYyBlZGl0YWJsZUZuID0gKGNvbHVtbjogT25lQ29sdW1uRGVmLCBub2RlOiBPbmVSb3dOb2RlKSA9PiByZXNvbHZlT25lQ2VsbFJlbmRlcmVyUGFyYW1zKGNvbHVtbi5lZGl0YWJsZSwgeyBub2RlLCBkYXRhOiBub2RlLmRhdGEsIGNvbHVtbkRlZjogY29sdW1uLCByb3dJbmRleDogbm9kZS5yb3dJbmRleCwgY29udGV4dDogdGhpcy5fY29udGV4dCB9KTtcblxuICBwdWJsaWMgdXBkYXRhYmxlRm4gPSAoY29sdW1uOiBPbmVDb2x1bW5EZWYsIG5vZGU6IE9uZVJvd05vZGUpID0+IHJlc29sdmVPbmVDZWxsUmVuZGVyZXJQYXJhbXMoY29sdW1uLnVwZGF0YWJsZSwgeyBub2RlLCBkYXRhOiBub2RlLmRhdGEsIGNvbHVtbkRlZjogY29sdW1uLCByb3dJbmRleDogbm9kZS5yb3dJbmRleCwgY29udGV4dDogdGhpcy5fY29udGV4dCB9KTtcblxuICBwdWJsaWMgZGlzYWJsZUZuID0gKGNvbHVtbjogT25lQ29sdW1uRGVmLCBub2RlOiBPbmVSb3dOb2RlKSA9PiByZXNvbHZlT25lQ2VsbFJlbmRlcmVyUGFyYW1zKGNvbHVtbi5kaXNhYmxlLCB7IG5vZGUsIGRhdGE6IG5vZGUuZGF0YSwgY29sdW1uRGVmOiBjb2x1bW4sIHJvd0luZGV4OiBub2RlLnJvd0luZGV4LCBjb250ZXh0OiB0aGlzLl9jb250ZXh0IH0pO1xuXG4gIHB1YmxpYyBkcmFnYWJsZUZuID0gKGNvbHVtbjogT25lQ29sdW1uRGVmLCBub2RlOiBPbmVSb3dOb2RlKSA9PiByZXNvbHZlT25lQ2VsbFJlbmRlcmVyUGFyYW1zKGNvbHVtbi5kcmFnYWJsZSwgeyBub2RlLCBkYXRhOiBub2RlLmRhdGEsIGNvbHVtbkRlZjogY29sdW1uLCByb3dJbmRleDogbm9kZS5yb3dJbmRleCwgY29udGV4dDogdGhpcy5fY29udGV4dCB9KTtcblxuICBwdWJsaWMgdmFsdWVHZXR0ZXJGbiA9IChjb2x1bW46IE9uZUNvbHVtbkRlZiwgbm9kZTogT25lUm93Tm9kZSkgPT4gcmVzb2x2ZU9uZVZhbHVlR2V0dGVyUGFyYW1zKGNvbHVtbi52YWx1ZUdldHRlciwgeyBkYXRhOiBub2RlLmRhdGEsIHJvd0luZGV4OiBub2RlLnJvd0luZGV4LCBub2RlOiBub2RlLCBjb250ZXh0OiB0aGlzLl9jb250ZXh0IH0pO1xufVxuIl19
213
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtY2VsbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25lLWdyaWQvc3JjL2xpYi9jb3JlL3NlcnZpY2VzL29uZS1ncmlkLWNlbGwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRS9FLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2hILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOztBQUlwRSxNQUFNLE9BQU8sa0JBQWtCO0lBRC9CO1FBR1UseUJBQW9CLEdBQUcsSUFBSSx1QkFBdUIsRUFBRSxDQUFDO1FBQ3JELHFCQUFnQixHQUFHLElBQUksbUJBQW1CLEVBQUUsQ0FBQztRQUM3QyxvQkFBZSxHQUFHLElBQUksa0JBQWtCLEVBQUUsQ0FBQztRQUMzQyxnQkFBVyxHQUFtQixFQUFFLENBQUM7UUFFakMsU0FBSSxHQUFzQixJQUFJLENBQUM7UUFxTnZDLDhFQUE4RTtRQUM5RSwrQkFBK0I7UUFDL0IsRUFBRTtRQUNGLDZFQUE2RTtRQUM3RSw4RUFBOEU7UUFDOUUsa0VBQWtFO1FBQ2xFLDhFQUE4RTtRQUU5RSw0RUFBNEU7UUFDckUsZUFBVSxHQUFHLENBQUMsTUFBb0IsRUFBRSxJQUFnQixFQUFXLEVBQUUsQ0FDdEUsNEJBQTRCLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRWhGOzs7Ozs7V0FNRztRQUNJLGdCQUFXLEdBQUcsQ0FBQyxNQUFvQixF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LFdBQVcsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUVoRSxPQUFPLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDckQsQ0FBQztRQUVELDJFQUEyRTtRQUMzRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFFYixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUU5RSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQzlDLENBQUM7UUFFRCxhQUFhO1FBQ2IsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQ3JDLENBQUM7K0dBMU5VLGtCQUFrQjttSEFBbEIsa0JBQWtCOzs0RkFBbEIsa0JBQWtCO2tCQUQ5QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT25lQ2VsbFByZXNlbnRhdGlvblBhcmFtcywgT25lQ2VsbFN0YXRlLCBPbmVDZWxsU3RhdGVzLCBPbmVDb2x1bW5EZWYgfSBmcm9tICcuLi9tb2RlbHMvb25lLWNvbHVtbi1kZWYtdHlwZXMubW9kZWwnO1xuaW1wb3J0IHsgQ2VsbEZpZWxkVmFsdWVFbXB0eVBpcGUgfSBmcm9tICcuLi9waXBlcy9jZWxsLWZpZWxkLXZhbHVlLWVtcHR5LnBpcGUnO1xuaW1wb3J0IHsgT25lUm93Tm9kZSB9IGZyb20gJy4uL2luc3RhbnRzL29uZS1yb3ctbm9kZS5jbGFzcyc7XG5pbXBvcnQgeyByZXNvbHZlT25lQ2VsbFJlbmRlcmVyUGFyYW1zLCByZXNvbHZlT25lVmFsdWVHZXR0ZXJQYXJhbXMgfSBmcm9tICcuLi8uLi9oZWxwZXJzL29uZS1jb2x1bW4tZGVmLmhlbHBlcic7XG5pbXBvcnQgeyBDZWxsVmFsdWVHZXR0ZXJQaXBlIH0gZnJvbSAnLi4vcGlwZXMvY2VsbC12YWx1ZS1nZXR0ZXIucGlwZSc7XG5pbXBvcnQgeyBDZWxsRmllbGRWYWx1ZVBpcGUgfSBmcm9tICcuLi9waXBlcy9jZWxsLWZpZWxkLXZhbHVlLnBpcGUnO1xuaW1wb3J0IHR5cGUgeyBPbmVHcmlkQXBpIH0gZnJvbSAnLi4vaW5zdGFudHMvb25lLWdyaWQtYXBpLmNsYXNzJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE9uZUdyaWRDZWxsU2VydmljZSB7XG5cbiAgcHJpdmF0ZSBfY2VsbEZpZWxkVmFsdWVFbXB0eSA9IG5ldyBDZWxsRmllbGRWYWx1ZUVtcHR5UGlwZSgpO1xuICBwcml2YXRlIF9jZWxsVmFsdWVHZXR0ZXIgPSBuZXcgQ2VsbFZhbHVlR2V0dGVyUGlwZSgpO1xuICBwcml2YXRlIF9jZWxsRmllbGRWYWx1ZSA9IG5ldyBDZWxsRmllbGRWYWx1ZVBpcGUoKTtcbiAgcHJpdmF0ZSBfY29sdW1uRGVmczogT25lQ29sdW1uRGVmW10gPSBbXTtcbiAgcHJpdmF0ZSBfY29udGV4dDogYW55O1xuICBwcml2YXRlIF9hcGk6IE9uZUdyaWRBcGkgfCBudWxsID0gbnVsbDtcblxuICBwdWJsaWMgYXBwbHlDb2x1bW5EZWZzKGNvbHVtbkRlZnM6IE9uZUNvbHVtbkRlZltdLCBjb250ZXh0OiBhbnkpIHtcblxuICAgIHRoaXMuX2NvbHVtbkRlZnMgPSBjb2x1bW5EZWZzO1xuICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIEJhY2stcmVmZXJlbmNlIHRvIHRoZSBncmlkIGFwaSwgc28gcHJlZGljYXRlIHBhcmFtcyBjYW4gY2FycnkgaXQuXG4gICAqXG4gICAqIFB1c2hlZCBpbiByYXRoZXIgdGhhbiBpbmplY3RlZDogYE9uZUdyaWRBcGlgIGFscmVhZHkgZGVwZW5kcyBvbiB0aGlzXG4gICAqIHNlcnZpY2UsIGFuZCBpbmplY3RpbmcgaXQgYmFjayB3b3VsZCBjbG9zZSBhIERJIGN5Y2xlLlxuICAgKi9cbiAgcHVibGljIHNldEdyaWRBcGkoYXBpOiBPbmVHcmlkQXBpIHwgbnVsbCk6IHZvaWQge1xuXG4gICAgdGhpcy5fYXBpID0gYXBpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJhbXMgZXZlcnkgcm93LXNjb3BlZCBjb2x1bW4gY2FsbGJhY2sgcmVjZWl2ZXMuXG4gICAqXG4gICAqIE9uZSBidWlsZGVyLCBkZWxpYmVyYXRlbHk6IGBlZGl0YWJsZWAsIGB1cGRhdGFibGVgLCBgZGlzYWJsZWAsIGByb3dEcmFnYCxcbiAgICogYGhpZGVBY3Rpb25CdXR0b25gLCBgY2VsbENsYXNzYCwgYGNlbGxTdHlsZWAsIGBjZWxsUmVuZGVyZXJgIGFuZFxuICAgKiBgdmFsdWVGb3JtYXR0ZXJgIGFyZSBhbGwgXCJkZWNpZGUgc29tZXRoaW5nIGFib3V0IHRoaXMgY2VsbFwiLCBhbmQgYSBjb25zdW1lclxuICAgKiBzaG91bGQgbm90IGhhdmUgdG8gcmVtZW1iZXIgd2hpY2ggb2YgdGhlbSBoYXBwZW5zIHRvIGJlIGhhbmRlZCBgdmFsdWVgIG9yXG4gICAqIGBmaWVsZGAuIEVhY2ggdXNlZCB0byBiZSBjYWxsZWQgd2l0aCBhIHNsaWdodGx5IGRpZmZlcmVudCBzdWJzZXQuXG4gICAqL1xuICBwdWJsaWMgY2VsbFBhcmFtcyhjb2x1bW46IE9uZUNvbHVtbkRlZiwgbm9kZTogT25lUm93Tm9kZSk6IE9uZUNlbGxQcmVzZW50YXRpb25QYXJhbXMge1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIENvbHVtbiBjb25maWcgZmlyc3QsIHNvIHRoZSBncmlkJ3Mgb3duIGZpZWxkcyB3aW4gYSBuYW1lIGNvbGxpc2lvbjogYVxuICAgICAgLy8gc3RhbGUgYHZhbHVlYCBsZWZ0IGluIGBjZWxsUmVuZGVyZXJQYXJhbXNgIG11c3Qgbm90IHNoYWRvdyB0aGlzIGNlbGwncy5cbiAgICAgIC4uLihjb2x1bW4/LmNlbGxSZW5kZXJlclBhcmFtcyA/PyB7fSksXG4gICAgICB2YWx1ZTogdGhpcy5yZXNvbHZlVmFsdWUobm9kZSwgY29sdW1uKSxcbiAgICAgIGRhdGE6IG5vZGUuZGF0YSxcbiAgICAgIG5vZGUsXG4gICAgICByb3dJbmRleDogbm9kZS5yb3dJbmRleCxcbiAgICAgIGZpZWxkOiBjb2x1bW4/LmZpZWxkIGFzIHN0cmluZyxcbiAgICAgIGNvbHVtbkRlZjogY29sdW1uLFxuICAgICAgYXBpOiB0aGlzLl9hcGkgPz8gdW5kZWZpbmVkLFxuICAgICAgY29udGV4dDogdGhpcy5fY29udGV4dCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIE5ldyBOb2RlIFN0YXRlc1xuICAgKi9cbiAgcHVibGljIGdlbmVyYXRlQ2VsbFN0YXRlcyhub2RlOiBPbmVSb3dOb2RlKTogT25lQ2VsbFN0YXRlcyB8IG51bGwge1xuXG4gICAgaWYgKCFub2RlKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IG5ld1N0YXRlczogT25lQ2VsbFN0YXRlcyA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBjb2x1bW4gb2YgdGhpcy5fY29sdW1uRGVmcykge1xuXG4gICAgICBjb25zdCBmaWVsZCA9IGNvbHVtbi5maWVsZDtcblxuICAgICAgLy8gQ2VsbCBzdGF0ZSBpcyBrZXllZCBieSBmaWVsZCwgc28gYSBjb2x1bW4gd2l0aG91dCBvbmUgY29udHJpYnV0ZXNcbiAgICAgIC8vIG5vdGhpbmcuIFNraXBwaW5nIGl0IGtlZXBzIGB1bmRlZmluZWRgIG91dCBvZiB0aGUgc3RhdGUgb2JqZWN0OyBzdWNoIGFcbiAgICAgIC8vIGNvbHVtbiBzdGlsbCByZW5kZXJzIGl0cyBhY3Rpb24gYnV0dG9ucywgd2hpY2ggZG8gbm90IHJlYWQgY2VsbCBzdGF0ZS5cbiAgICAgIGlmICghZmllbGQpIGNvbnRpbnVlO1xuXG4gICAgICBpZiAoZmllbGQgIT09ICdfb25lUm93TnVtYmVyJykge1xuXG4gICAgICAgIG5ld1N0YXRlc1tmaWVsZF0gPSB0aGlzLmdlbmVyYXRlQ2VsbFN0YXRlKG5vZGUsIGNvbHVtbikgPz8gbm9kZS5jZWxsU3RhdGVzW2ZpZWxkXSA/PyB7IHR5cGU6ICdub25lJywgdmFsdWU6ICcnIH07XG5cbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgbmV3U3RhdGVzW2ZpZWxkXSA9IG5vZGUuY2VsbFN0YXRlc1tmaWVsZF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld1N0YXRlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY2VsbCdzIHZhbHVlOiB0aGUgYHZhbHVlR2V0dGVyYCdzIG91dHB1dCB3aGVyZSB0aGUgY29sdW1uIGRlY2xhcmVzIG9uZSxcbiAgICogdGhlIHJhdyBmaWVsZCBvdGhlcndpc2UuIFRoaXMgaXMgdGhlIHZhbHVlLCBub3QgdGhlIGRpc3BsYXkgdGV4dCDigJQgc2VlXG4gICAqIHtAbGluayBmb3JtYXRWYWx1ZX0uXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVWYWx1ZShub2RlOiBPbmVSb3dOb2RlLCBjb2x1bW46IE9uZUNvbHVtbkRlZik6IGFueSB7XG5cbiAgICByZXR1cm4gY29sdW1uPy52YWx1ZUdldHRlclxuICAgICAgPyB0aGlzLl9jZWxsVmFsdWVHZXR0ZXIudHJhbnNmb3JtKG5vZGUuZGF0YSwgbm9kZSwgY29sdW1uLCB0aGlzLl9jb250ZXh0KVxuICAgICAgOiB0aGlzLl9jZWxsRmllbGRWYWx1ZS50cmFuc2Zvcm0obm9kZS5kYXRhLCBjb2x1bW4uZmllbGQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IHRoZSBjb2x1bW4ncyBgdmFsdWVGb3JtYXR0ZXJgLlxuICAgKlxuICAgKiBgdmFsdWVGb3JtYXR0ZXJgIHdhcyBkZWNsYXJlZCBvbiB0aGUgY29sdW1uIGRlZmluaXRpb24gYW5kIGNhbGxlZCBmcm9tXG4gICAqIG5vd2hlcmUg4oCUIGEgY29uc3VtZXIgY291bGQgd3JpdGUgb25lLCBnZXQgbm8gZXJyb3IsIGFuZCBzZWUgbm90aGluZyBoYXBwZW4uXG4gICAqIEl0IHJ1bnMgb24gZGlzcGxheWVkIHRleHQgb25seSwgYWZ0ZXIgdGhlIGB2YWx1ZUdldHRlcmAsIGFuZCBpcyBkZWxpYmVyYXRlbHlcbiAgICogc2tpcHBlZCBmb3IgcGxhY2Vob2xkZXJzOiBhbiBlbXB0eSBjZWxsIGFscmVhZHkgaGFzIGl0cyBvd24gbWVjaGFuaXNtIGluXG4gICAqIGBjZWxsUmVuZGVyZXJQYXJhbXMucGxhY2Vob2xkZXJgLCBhbmQgdHdvIGZlYXR1cmVzIGNvbXBldGluZyB0byBmaWxsIHRoZVxuICAgKiBzYW1lIGdhcCBpcyB3b3JzZSB0aGFuIG9uZS5cbiAgICpcbiAgICogTm90ZSB0aGF0IHNvcnRpbmcgYW5kIGZpbHRlcmluZyByZWFkIHRoZSB1bmRlcmx5aW5nIHJvdyBkYXRhLCBub3QgdGhpcyDigJRcbiAgICogd2hpY2ggaXMgZXhhY3RseSB3aHkgZm9ybWF0dGluZyBiZWxvbmdzIGhlcmUgcmF0aGVyIHRoYW4gaW4gdGhlIGdldHRlci5cbiAgICovXG4gIHByaXZhdGUgZm9ybWF0VmFsdWUobm9kZTogT25lUm93Tm9kZSwgY29sdW1uOiBPbmVDb2x1bW5EZWYsIHZhbHVlOiBhbnkpOiBhbnkge1xuXG4gICAgaWYgKHR5cGVvZiBjb2x1bW4/LnZhbHVlRm9ybWF0dGVyICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gdmFsdWU7XG5cbiAgICAvLyBgdmFsdWVgIGlzIHBhc3NlZCBleHBsaWNpdGx5IHJhdGhlciB0aGFuIGxlZnQgdG8gYGNlbGxQYXJhbXNgOiB0aGUgZW1wdHlcbiAgICAvLyAtY2VsbCBicmFuY2ggcmVzb2x2ZXMgaXQgdGhyb3VnaCB0aGUgZ2V0dGVyIGJlZm9yZSBkZWNpZGluZyB3aGV0aGVyIHRoZXJlXG4gICAgLy8gaXMgYW55dGhpbmcgdG8gZm9ybWF0LCBhbmQgdGhlIGZvcm1hdHRlciBtdXN0IHNlZSB0aGF0IHNhbWUgdmFsdWUuXG4gICAgcmV0dXJuIGNvbHVtbi52YWx1ZUZvcm1hdHRlcih7IC4uLnRoaXMuY2VsbFBhcmFtcyhjb2x1bW4sIG5vZGUpLCB2YWx1ZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcGxhY2Vob2xkZXIgZm9yIGFuIGVtcHR5IGNlbGwsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhpcyByb3cncyB0cmVlXG4gICAqIGRlcHRoIG1heSBub3QgYmUgZWRpdGVkLlxuICAgKlxuICAgKiBgY2VsbFJlbmRlcmVyUGFyYW1zLnBsYWNlaG9sZGVyYCBpcyBhIHByb21wdCwgbm90IGRhdGE6IGl0IHJlbmRlcnMgYXQgaGFsZlxuICAgKiBvcGFjaXR5IHdoZXJlIHRoZSB2YWx1ZSB3b3VsZCBnbywgd2hpY2ggcmVhZHMgYXMgXCJjbGljayBoZXJlIGFuZCBmaWxsIHRoaXNcbiAgICogaW5cIi4gT24gdGhlIGF1dG8gZ3JvdXAgY29sdW1uIGBlZGl0YWJsZUxldmVsc2AgZGVjaWRlcyB3aGljaCBkZXB0aHMgYWNjZXB0XG4gICAqIGFuIGVkaXQgYXQgYWxsLCBzbyBhIGRlcHRoIG91dHNpZGUgdGhhdCBsaXN0IHdhcyBhZHZlcnRpc2luZyBhbiBlZGl0IHRoZVxuICAgKiBncmlkIHRoZW4gcmVmdXNlcyDigJQgdGhlIGNlbGwgb2ZmZXJzIG5vIGlucHV0IGFuZCB0aGUgcHJvbXB0IG5ldmVyIGNsZWFycy5cbiAgICpcbiAgICogVGhlIHN1cHByZXNzaW9uIGlzIHNjb3BlZCB0byBjb2x1bW5zIHRoYXQgYWN0dWFsbHkgZGVjbGFyZSBgZWRpdGFibGVMZXZlbHNgLlxuICAgKiBUaGUgbGlzdCBpcyBvcHQtaW4sIGFuZCBhIGNvbHVtbiB3aXRob3V0IG9uZSBoYXMgbm8gcGVyLWxldmVsIHJ1bGVzIHJhdGhlclxuICAgKiB0aGFuIG5vIGVkaXRhYmxlIGxldmVscywgc28gcGxhaW4gZ3JpZHMgYW5kIHVudG91Y2hlZCB0cmVlIGNvbHVtbnMga2VlcFxuICAgKiBzaG93aW5nIHRoZWlyIHBsYWNlaG9sZGVyIGV4YWN0bHkgYXMgYmVmb3JlLlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlUGxhY2Vob2xkZXIobm9kZTogT25lUm93Tm9kZSwgY29sdW1uOiBPbmVDb2x1bW5EZWYpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXG4gICAgY29uc3QgcGxhY2Vob2xkZXIgPSBjb2x1bW4/LmNlbGxSZW5kZXJlclBhcmFtcz8ucGxhY2Vob2xkZXI7XG4gICAgY29uc3QgZWRpdGFibGVMZXZlbHMgPSBjb2x1bW4/LmVkaXRhYmxlTGV2ZWxzO1xuXG4gICAgaWYgKCFjb2x1bW4/LmF1dG9Hcm91cEZpZWxkIHx8ICFBcnJheS5pc0FycmF5KGVkaXRhYmxlTGV2ZWxzKSkgcmV0dXJuIHBsYWNlaG9sZGVyO1xuXG4gICAgcmV0dXJuIGVkaXRhYmxlTGV2ZWxzLmluY2x1ZGVzKG5vZGU/LmxldmVsKSA/IHBsYWNlaG9sZGVyIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIE5ldyBOb2RlIFN0YXRlIEJhc2VkIG9uIENvbHVtbiBGaWVsZFxuICAgKi9cbiAgcHVibGljIGdlbmVyYXRlQ2VsbFN0YXRlKG5vZGU6IE9uZVJvd05vZGUsIGNvbHVtbjogT25lQ29sdW1uRGVmKTogT25lQ2VsbFN0YXRlIHtcblxuICAgIC8vIFRoaXMgd2FzIGBmaWVsZCAhPT0gdW5kZWZpbmVkIHx8IGZpZWxkICE9PSAnJyB8fCBmaWVsZCAhPT0gbnVsbGAsIHdoaWNoIGlzXG4gICAgLy8gdHJ1ZSBmb3IgZXZlcnkgcG9zc2libGUgdmFsdWUgaW5jbHVkaW5nIGFsbCB0aHJlZSBpdCBtZWFudCB0byBleGNsdWRlIOKAlFxuICAgIC8vIGB8fGAgd2hlcmUgYCYmYCB3YXMgaW50ZW5kZWQuIEl0IGdhdGVkIHRoZSBmb3VyIGJyYW5jaGVzIGJlbG93LCBzbyBub25lXG4gICAgLy8gb2YgdGhlbSBjb3VsZCBldmVyIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdC4gUmVkdWNlZCB0byB0aGUgY2hlY2sgaXRcbiAgICAvLyB3YXMgcmVhY2hpbmcgZm9yOiBhIGNvbHVtbiB3aXRoIG5vIGZpZWxkIGhhcyBubyB2YWx1ZSB0byByZW5kZXIuXG4gICAgY29uc3QgZmllbGQgPSBjb2x1bW4/LmZpZWxkO1xuXG4gICAgaWYgKCFmaWVsZCkge1xuXG4gICAgICByZXR1cm4geyB0eXBlOiAnbm9uZScsIHZhbHVlOiAnJyB9O1xuICAgIH1cblxuICAgIGNvbnN0IGlzRW1wdHkgPSB0aGlzLl9jZWxsRmllbGRWYWx1ZUVtcHR5LnRyYW5zZm9ybShub2RlLmRhdGEsIGZpZWxkKTtcbiAgICBjb25zdCBpc0dyb3VwID0gbm9kZS5ncm91cCB8fCBub2RlLmxlYWZHcm91cDtcbiAgICBjb25zdCBpc0F1dG9Hcm91cCA9IGNvbHVtbj8uYXV0b0dyb3VwRmllbGQ7XG5cbiAgICBpZiAoY29sdW1uICYmIGNvbHVtbi5jZWxsUmVuZGVyZXIgJiYgIWlzR3JvdXApIHtcblxuICAgICAgLy8gVGhlIHJlbmRlcmVyIHVzZWQgdG8gYmUgaGFuZGVkIGB7IG5vZGUsIGNvbHVtbkRlZiB9YCBhbmQgbm90aGluZyBlbHNlLFxuICAgICAgLy8gc28gdGhlIG9idmlvdXMgd2F5IHRvIHdyaXRlIG9uZSDigJQgYHBhcmFtcy52YWx1ZWAg4oCUIHByb2R1Y2VkIHRoZSBzdHJpbmdcbiAgICAgIC8vIFwidW5kZWZpbmVkXCIsIGFuZCBgcGFyYW1zLmRhdGEueGAgdGhyZXcuIEl0IG5vdyBnZXRzIGV4YWN0bHkgd2hhdCBldmVyeVxuICAgICAgLy8gb3RoZXIgcm93LXNjb3BlZCBob29rIGdldHMuXG4gICAgICByZXR1cm4geyB0eXBlOiAnaHRtbCcsIHZhbHVlOiBjb2x1bW4uY2VsbFJlbmRlcmVyKHRoaXMuY2VsbFBhcmFtcyhjb2x1bW4sIG5vZGUpKSB9XG4gICAgfVxuXG4gICAgLy8gMS4gQ2VsbCBHcm91cCBQbGFjZWhvbGRlclxuICAgIGlmIChpc0VtcHR5ICYmIGlzR3JvdXAgJiYgaXNBdXRvR3JvdXApIHtcblxuICAgICAgcmV0dXJuIHsgdHlwZTogJ3BsYWNlaG9sZGVyJywgdmFsdWU6IHRoaXMucmVzb2x2ZVBsYWNlaG9sZGVyKG5vZGUsIGNvbHVtbikgPz8gdGhpcy5fY2VsbFZhbHVlR2V0dGVyLnRyYW5zZm9ybShub2RlLmRhdGEsIG5vZGUsIGNvbHVtbiwgdGhpcy5fY29udGV4dCkgPz8gJycgfTtcbiAgICB9XG5cbiAgICAvLyAyLiBDZWxsIEdyb3VwIFRleHQgVmFsdWVcbiAgICBpZiAoaXNHcm91cCAmJiBpc0F1dG9Hcm91cCkge1xuXG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZm9ybWF0VmFsdWUobm9kZSwgY29sdW1uLCB0aGlzLnJlc29sdmVWYWx1ZShub2RlLCBjb2x1bW4pKTtcblxuICAgICAgcmV0dXJuIHsgdHlwZTogJ3RleHQnLCB2YWx1ZTogdmFsdWUgPz8gJycgfTtcbiAgICB9XG5cbiAgICAvLyAzLiBDZWxsIFBsYWNlaG9sZGVyXG4gICAgLy9cbiAgICAvLyBUaGUgYXV0byBncm91cCBjb2x1bW4gaXMgZGVsaWJlcmF0ZWx5IE5PVCBleGNsdWRlZCBoZXJlLiBDYXNlcyAxIGFuZCAyXG4gICAgLy8gYWJvdmUgYWxyZWFkeSBjbGFpbWVkIHRoZSBncm91cCByb3dzLCBzbyB3aGF0IHJlYWNoZXMgdGhpcyBwb2ludCBpcyBhXG4gICAgLy8gbGVhZiDigJQgYW5kIGEgbGVhZiBvbiB0aGUgYXV0byBncm91cCBjb2x1bW4gaGFzIHRvIHJlbmRlciBpdHMgbGFiZWwgdG9vLFxuICAgIC8vIGluZGVudGVkIGJ5IGxldmVsLiBFeGNsdWRpbmcgaXQgZHJvcHBlZCBldmVyeSBsZWFmIHRocm91Z2ggdG8gY2FzZSA1IGFuZFxuICAgIC8vIHJlbmRlcmVkIHRoZSBncm91cCBjb2x1bW4gYmxhbmsgZm9yIHRoZSB3aG9sZSBib3R0b20gcm93IG9mIGEgdHJlZS5cbiAgICBpZiAoaXNFbXB0eSAmJiAhaXNHcm91cCkge1xuXG4gICAgICBjb25zdCB2YWx1ZUdldHRlciA9IHRoaXMuX2NlbGxWYWx1ZUdldHRlci50cmFuc2Zvcm0obm9kZS5kYXRhLCBub2RlLCBjb2x1bW4sIHRoaXMuX2NvbnRleHQpO1xuXG4gICAgICBpZiAodmFsdWVHZXR0ZXIpIHtcblxuICAgICAgICByZXR1cm4geyB0eXBlOiAndGV4dCcsIHZhbHVlOiB0aGlzLmZvcm1hdFZhbHVlKG5vZGUsIGNvbHVtbiwgdmFsdWVHZXR0ZXIpIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gdGhpcy5yZXNvbHZlUGxhY2Vob2xkZXIobm9kZSwgY29sdW1uKSA/PyAnJztcblxuICAgICAgcmV0dXJuIHsgdHlwZTogJ3BsYWNlaG9sZGVyJywgdmFsdWU6IHBsYWNlaG9sZGVyIH07XG4gICAgfVxuXG4gICAgLy8gNC4gQ2VsbCBUZXh0IFZhbHVlIChsZWF2ZXMsIGluY2x1ZGluZyB0aGUgYXV0byBncm91cCBjb2x1bW4g4oCUIHNlZSBhYm92ZSlcbiAgICBpZiAoIWlzR3JvdXApIHtcblxuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmZvcm1hdFZhbHVlKG5vZGUsIGNvbHVtbiwgdGhpcy5yZXNvbHZlVmFsdWUobm9kZSwgY29sdW1uKSk7XG5cbiAgICAgIHJldHVybiB7IHR5cGU6ICd0ZXh0JywgdmFsdWU6IHZhbHVlID8/ICcnIH07XG4gICAgfVxuXG4gICAgLy8gNS4gRGVmYXVsdFxuICAgIHJldHVybiB7IHR5cGU6ICdub25lJywgdmFsdWU6ICcnIH07XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gUm93LXNjb3BlZCBjb2x1bW4gcHJlZGljYXRlc1xuICAvL1xuICAvLyBFdmVyeSBvbmUgb2YgdGhlc2UgcmVzb2x2ZXMgdGhlIHNhbWUgd2F5IGFuZCByZWNlaXZlcyB0aGUgc2FtZSBwYXJhbXMsIHZpYVxuICAvLyBgY2VsbFBhcmFtc2AuIFRoZXkgdXNlZCB0byBlYWNoIGJ1aWxkIHRoZWlyIG93biBzdWJzZXQgaW5saW5lLCB3aGljaCBpcyBob3dcbiAgLy8gYHZhbHVlYCwgYGZpZWxkYCBhbmQgYGFwaWAgY2FtZSB0byBiZSBtaXNzaW5nIGZyb20gYWxsIG9mIHRoZW0uXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKiBXaGV0aGVyIHRoaXMgY2VsbCBtYXkgYmUgZWRpdGVkIGF0IGFsbC4gQSBjYXBhYmlsaXR5OiB1bnNldCBtZWFucyBuby4gKi9cbiAgcHVibGljIGVkaXRhYmxlRm4gPSAoY29sdW1uOiBPbmVDb2x1bW5EZWYsIG5vZGU6IE9uZVJvd05vZGUpOiBib29sZWFuID0+XG4gICAgcmVzb2x2ZU9uZUNlbGxSZW5kZXJlclBhcmFtcyhjb2x1bW4/LmVkaXRhYmxlLCB0aGlzLmNlbGxQYXJhbXMoY29sdW1uLCBub2RlKSk7XG5cbiAgLyoqXG4gICAqIFRoZSBzZWNvbmQgZWRpdCBnYXRlLCBBTkRlZCB3aXRoIGBlZGl0YWJsZWAuXG4gICAqXG4gICAqIEEgcmVzdHJpY3Rpb24sIHNvIHVuc2V0IG1lYW5zIFwibm8gcmVzdHJpY3Rpb25cIi4gSXQgdXNlZCB0byByZXNvbHZlIHRocm91Z2hcbiAgICogYCEhdW5kZWZpbmVkYCB0byBgZmFsc2VgLCBjbG9zaW5nIHRoZSBnYXRlIG9uIGV2ZXJ5IGNvbHVtbiB0aGF0IGRpZCBub3QgbmFtZVxuICAgKiBpdCDigJQgc28gYGVkaXRhYmxlOiB0cnVlYCBvbiBpdHMgb3duIG1hZGUgbm90aGluZyBlZGl0YWJsZS5cbiAgICovXG4gIHB1YmxpYyB1cGRhdGFibGVGbiA9IChjb2x1bW46IE9uZUNvbHVtbkRlZiwgbm9kZTogT25lUm93Tm9kZSk6IGJvb2xlYW4gPT5cbiAgICByZXNvbHZlT25lQ2VsbFJlbmRlcmVyUGFyYW1zKGNvbHVtbj8udXBkYXRhYmxlLCB0aGlzLmNlbGxQYXJhbXMoY29sdW1uLCBub2RlKSwgdHJ1ZSk7XG5cbiAgLyoqIERpc2FibGVzIHRoaXMgY29sdW1uJ3Mgcm93IGFjdGlvbiBidXR0b25zLiBOb3QgYW4gZWRpdCBnYXRlLiAqL1xuICBwdWJsaWMgZGlzYWJsZUZuID0gKGNvbHVtbjogT25lQ29sdW1uRGVmLCBub2RlOiBPbmVSb3dOb2RlKTogYm9vbGVhbiA9PlxuICAgIHJlc29sdmVPbmVDZWxsUmVuZGVyZXJQYXJhbXMoY29sdW1uPy5kaXNhYmxlLCB0aGlzLmNlbGxQYXJhbXMoY29sdW1uLCBub2RlKSk7XG5cbiAgLyoqIEhpZGVzIHRoaXMgY29sdW1uJ3Mgcm93IGFjdGlvbiBidXR0b25zIGVudGlyZWx5LiAqL1xuICBwdWJsaWMgaGlkZUFjdGlvbkJ1dHRvbkZuID0gKGNvbHVtbjogT25lQ29sdW1uRGVmLCBub2RlOiBPbmVSb3dOb2RlKTogYm9vbGVhbiA9PlxuICAgIHJlc29sdmVPbmVDZWxsUmVuZGVyZXJQYXJhbXMoY29sdW1uPy5oaWRlQWN0aW9uQnV0dG9uLCB0aGlzLmNlbGxQYXJhbXMoY29sdW1uLCBub2RlKSk7XG5cbiAgLyoqIFdoZXRoZXIgdGhpcyBjZWxsIGNhcnJpZXMgYSByb3cgZHJhZyBoYW5kbGUuICovXG4gIHB1YmxpYyByb3dEcmFnRm4gPSAoY29sdW1uOiBPbmVDb2x1bW5EZWYsIG5vZGU6IE9uZVJvd05vZGUpOiBib29sZWFuID0+XG4gICAgcmVzb2x2ZU9uZUNlbGxSZW5kZXJlclBhcmFtcyhjb2x1bW4/LnJvd0RyYWcsIHRoaXMuY2VsbFBhcmFtcyhjb2x1bW4sIG5vZGUpKTtcblxuICBwdWJsaWMgdmFsdWVHZXR0ZXJGbiA9IChjb2x1bW46IE9uZUNvbHVtbkRlZiwgbm9kZTogT25lUm93Tm9kZSkgPT5cbiAgICByZXNvbHZlT25lVmFsdWVHZXR0ZXJQYXJhbXMoY29sdW1uPy52YWx1ZUdldHRlciwgeyBkYXRhOiBub2RlLmRhdGEsIHJvd0luZGV4OiBub2RlLnJvd0luZGV4LCBub2RlLCBjb250ZXh0OiB0aGlzLl9jb250ZXh0IH0pO1xufVxuIl19