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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +123 -20
  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 +1964 -421
  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 +52 -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ctY29sdW1uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmUtZ3JpZC9zcmMvbGliL2NvcmUvc2VydmljZXMvb2ctY29sdW1uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXZDLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQzs7QUFJNUIsTUFBTSxPQUFPLGVBQWU7SUFENUI7UUFHVSxxQkFBZ0IsR0FBaUIsSUFBSSxDQUFDO1FBQ3RDLGdCQUFXLEdBQUcsSUFBSSxlQUFlLENBQWlCLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELHFCQUFnQixHQUFHLElBQUksZUFBZSxDQUFzQixFQUFFLENBQUMsQ0FBQztLQXVHekU7SUFyR0MsY0FBYyxDQUFDLGdCQUE4QixFQUFFLFVBQTBCLEVBQUUsZUFBb0M7UUFFN0csSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO1FBRXpDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUV6QyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxjQUFjO1FBRVosTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUU1QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFaEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsa0JBQWtCLENBQUMsZUFBb0M7UUFFckQsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQXdCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBRXZHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELGFBQWEsQ0FBQyxVQUEwQjtRQUV0QyxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBaUIsRUFBRSxFQUFFO1lBRW5ELE1BQU0sTUFBTSxHQUFHO2dCQUNiLEdBQUcsSUFBSSxDQUFDLGdCQUFnQjtnQkFDeEIsR0FBRyxHQUFHO2dCQUNOLEVBQUUsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQzthQUNyRCxDQUFDO1lBRUYsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUMsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFaEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELHVCQUF1QjtJQUN2QixlQUFlLENBQUMsRUFBVSxFQUFFLE9BQThCO1FBRXhELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxPQUFPLENBQUM7UUFFOUMsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXhGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUV2QyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGlCQUFpQixDQUFDLFNBQWlCLEVBQUUsT0FBZTtRQUVsRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU1RCxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFN0MsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRWxDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7T0FFRztJQUNLLGlCQUFpQixDQUFDLFVBQTBCO1FBRWxELElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUVoRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3ZELEdBQUcsS0FBSztnQkFDUixLQUFLLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQ2hOLENBQUMsQ0FBQyxDQUFDO1lBRUosSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyQyxDQUFDO0lBQ0gsQ0FBQztJQUVELHdCQUF3QixDQUFDLEdBQXNCLEVBQUUsTUFBOEI7UUFFN0UsR0FBRyxDQUFDLG1CQUFtQixHQUFHLE9BQU8sR0FBRyxDQUFDLFVBQVUsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7UUFDekcsR0FBRyxDQUFDLG1CQUFtQixHQUFHLE9BQU8sR0FBRyxDQUFDLFVBQVUsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7UUFFekcsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQsdUJBQXVCLENBQUMsR0FBaUIsRUFBRSxNQUE4QjtRQUV2RSxHQUFHLENBQUMsb0JBQW9CLEdBQUcsT0FBTyxHQUFHLENBQUMsV0FBVyxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQztRQUM3RyxHQUFHLENBQUMsb0JBQW9CLEdBQUcsT0FBTyxHQUFHLENBQUMsV0FBVyxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQztRQUU3RyxHQUFHLENBQUMsa0JBQWtCLEdBQUcsT0FBTyxHQUFHLENBQUMsU0FBUyxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQztRQUNyRyxHQUFHLENBQUMsa0JBQWtCLEdBQUcsT0FBTyxHQUFHLENBQUMsU0FBUyxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQztRQUVyRyxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7K0dBMUdVLGVBQWU7bUhBQWYsZUFBZTs7NEZBQWYsZUFBZTtrQkFEM0IsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgT25lQ2VsbFJlbmRlcmVyUGFyYW1zLCBPbmVDb2x1bW5EZWYsIE9uZUdyb3VwQ29sdW1uRGVmIH0gZnJvbSAnLi4vbW9kZWxzL29uZS1jb2x1bW4tZGVmLXR5cGVzLm1vZGVsJztcbmltcG9ydCBsb2Rhc2ggZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IENvbHVtbkNoYW5nZWRFdmVudCB9IGZyb20gJy4uL21vZGVscy9vbmUtZXZlbnQtdHlwZXMubW9kZWwnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgT2dDb2x1bW5TZXJ2aWNlIHtcblxuICBwcml2YXRlIGRlZmF1bHRDb2x1bW5EZWY6IE9uZUNvbHVtbkRlZiA9IG51bGw7XG4gIHByaXZhdGUgY29sdW1uRGVmcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE9uZUNvbHVtbkRlZltdPihbXSk7XG4gIHByaXZhdGUgZ3JvdXBDb2x1bW5EZWZzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8T25lR3JvdXBDb2x1bW5EZWZbXT4oW10pO1xuXG4gIGluaXRDb2x1bW5EZWZzKGRlZmF1bHRDb2x1bW5EZWY6IE9uZUNvbHVtbkRlZiwgY29sdW1uRGVmczogT25lQ29sdW1uRGVmW10sIGdyb3VwQ29sdW1uRGVmczogT25lR3JvdXBDb2x1bW5EZWZbXSk6IHZvaWQge1xuXG4gICAgdGhpcy5kZWZhdWx0Q29sdW1uRGVmID0gZGVmYXVsdENvbHVtbkRlZjtcblxuICAgIHRoaXMuc2V0R3JvdXBDb2x1bW5EZWZzKGdyb3VwQ29sdW1uRGVmcyk7XG4gICAgXG4gICAgdGhpcy5zZXRDb2x1bW5EZWZzKGNvbHVtbkRlZnMpO1xuICB9XG5cbiAgZ2V0Q29sdW1uU3RhdGUoKTogQ29sdW1uQ2hhbmdlZEV2ZW50IHtcblxuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbHVtbkRlZnMkLmdldFZhbHVlKCk7XG5cbiAgICBjb25zdCBncm91cHMgPSB0aGlzLmdyb3VwQ29sdW1uRGVmcyQuZ2V0VmFsdWUoKTtcblxuICAgIHJldHVybiB7IGNvbHVtbnMsIGdyb3VwcyB9O1xuICB9XG5cbiAgc2V0R3JvdXBDb2x1bW5EZWZzKGdyb3VwQ29sdW1uRGVmczogT25lR3JvdXBDb2x1bW5EZWZbXSk6IHZvaWQge1xuXG4gICAgY29uc3QgZ3JvdXBzID0gZ3JvdXBDb2x1bW5EZWZzLm1hcCgoZ3JvdXA6IE9uZUdyb3VwQ29sdW1uRGVmKSA9PiB0aGlzLnJlc29sdmVHcm91cFByZXNlbnRhdGlvbihncm91cCkpO1xuXG4gICAgdGhpcy5ncm91cENvbHVtbkRlZnMkLm5leHQoZ3JvdXBzKTtcbiAgfVxuXG4gIHNldENvbHVtbkRlZnMoY29sdW1uRGVmczogT25lQ29sdW1uRGVmW10pOiB2b2lkIHtcblxuICAgIGNvbnN0IGNvbHVtbnMgPSBjb2x1bW5EZWZzLm1hcCgoY29sOiBPbmVDb2x1bW5EZWYpID0+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,101 @@ 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
+ }
44
130
  /**
45
131
  * Generate New Node State Based on Column Field
46
132
  */
47
133
  generateCellState(node, column) {
48
- const isField = column.field !== undefined || column.field !== '' || column.field !== null;
49
- const isEmpty = this._cellFieldValueEmpty.transform(node.data, column.field);
134
+ // This was `field !== undefined || field !== '' || field !== null`, which is
135
+ // true for every possible value including all three it meant to exclude —
136
+ // `||` where `&&` was intended. It gated the four branches below, so none
137
+ // of them could ever fall through to the default. Reduced to the check it
138
+ // was reaching for: a column with no field has no value to render.
139
+ const field = column?.field;
140
+ if (!field) {
141
+ return { type: 'none', value: '' };
142
+ }
143
+ const isEmpty = this._cellFieldValueEmpty.transform(node.data, field);
50
144
  const isGroup = node.group || node.leafGroup;
51
145
  const isAutoGroup = column?.autoGroupField;
52
146
  if (column && column.cellRenderer && !isGroup) {
53
- const value = column.cellRenderer({ node, columnDef: column });
54
- return { type: 'html', value: value };
147
+ // The renderer used to be handed `{ node, columnDef }` and nothing else,
148
+ // so the obvious way to write one — `params.value` — produced the string
149
+ // "undefined", and `params.data.x` threw. It now gets exactly what every
150
+ // other row-scoped hook gets.
151
+ return { type: 'html', value: column.cellRenderer(this.cellParams(column, node)) };
55
152
  }
56
153
  // 1. Cell Group Placeholder
57
- if (isField && isEmpty && isGroup && isAutoGroup) {
154
+ if (isEmpty && isGroup && isAutoGroup) {
58
155
  return { type: 'placeholder', value: column?.cellRendererParams?.placeholder ?? this._cellValueGetter.transform(node.data, node, column, this._context) ?? '' };
59
156
  }
60
157
  // 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);
158
+ if (isGroup && isAutoGroup) {
159
+ const value = this.formatValue(node, column, this.resolveValue(node, column));
63
160
  return { type: 'text', value: value ?? '' };
64
161
  }
65
162
  // 3. Cell Placeholder
66
- if (isField && isEmpty && !isGroup && !isAutoGroup) {
163
+ //
164
+ // The auto group column is deliberately NOT excluded here. Cases 1 and 2
165
+ // above already claimed the group rows, so what reaches this point is a
166
+ // leaf — and a leaf on the auto group column has to render its label too,
167
+ // indented by level. Excluding it dropped every leaf through to case 5 and
168
+ // rendered the group column blank for the whole bottom row of a tree.
169
+ if (isEmpty && !isGroup) {
67
170
  const valueGetter = this._cellValueGetter.transform(node.data, node, column, this._context);
68
171
  if (valueGetter) {
69
- return { type: 'text', value: valueGetter };
172
+ return { type: 'text', value: this.formatValue(node, column, valueGetter) };
70
173
  }
71
174
  const placeholder = column?.cellRendererParams?.placeholder ?? '';
72
175
  return { type: 'placeholder', value: placeholder };
73
176
  }
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);
177
+ // 4. Cell Text Value (leaves, including the auto group column — see above)
178
+ if (!isGroup) {
179
+ const value = this.formatValue(node, column, this.resolveValue(node, column));
77
180
  return { type: 'text', value: value ?? '' };
78
181
  }
79
182
  // 5. Default
@@ -85,4 +188,4 @@ export class OneGridCellService {
85
188
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridCellService, decorators: [{
86
189
  type: Injectable
87
190
  }] });
88
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtY2VsbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25lLWdyaWQvc3JjL2xpYi9jb3JlL3NlcnZpY2VzL29uZS1ncmlkLWNlbGwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRS9FLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2hILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOztBQUdwRSxNQUFNLE9BQU8sa0JBQWtCO0lBRC9CO1FBR1UseUJBQW9CLEdBQUcsSUFBSSx1QkFBdUIsRUFBRSxDQUFDO1FBQ3JELHFCQUFnQixHQUFHLElBQUksbUJBQW1CLEVBQUUsQ0FBQztRQUM3QyxvQkFBZSxHQUFHLElBQUksa0JBQWtCLEVBQUUsQ0FBQztRQUMzQyxnQkFBVyxHQUFtQixFQUFFLENBQUM7UUE2RnpDOztXQUVHO1FBQ0ksZUFBVSxHQUFHLENBQUMsTUFBb0IsRUFBRSxJQUFnQixFQUFFLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBRXRNLGdCQUFXLEdBQUcsQ0FBQyxNQUFvQixFQUFFLElBQWdCLEVBQUUsRUFBRSxDQUFDLDRCQUE0QixDQUFDLE1BQU0sQ0FBQyxT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LGtCQUFrQjs7NEZBQWxCLGtCQUFrQjtrQkFEOUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9uZUNlbGxTdGF0ZSwgT25lQ2VsbFN0YXRlcywgT25lQ29sdW1uRGVmIH0gZnJvbSAnLi4vbW9kZWxzL29uZS1jb2x1bW4tZGVmLXR5cGVzLm1vZGVsJztcbmltcG9ydCB7IENlbGxGaWVsZFZhbHVlRW1wdHlQaXBlIH0gZnJvbSAnLi4vcGlwZXMvY2VsbC1maWVsZC12YWx1ZS1lbXB0eS5waXBlJztcbmltcG9ydCB7IE9uZVJvd05vZGUgfSBmcm9tICcuLi9pbnN0YW50cy9vbmUtcm93LW5vZGUuY2xhc3MnO1xuaW1wb3J0IHsgcmVzb2x2ZU9uZUNlbGxSZW5kZXJlclBhcmFtcywgcmVzb2x2ZU9uZVZhbHVlR2V0dGVyUGFyYW1zIH0gZnJvbSAnLi4vLi4vaGVscGVycy9vbmUtY29sdW1uLWRlZi5oZWxwZXInO1xuaW1wb3J0IHsgQ2VsbFZhbHVlR2V0dGVyUGlwZSB9IGZyb20gJy4uL3BpcGVzL2NlbGwtdmFsdWUtZ2V0dGVyLnBpcGUnO1xuaW1wb3J0IHsgQ2VsbEZpZWxkVmFsdWVQaXBlIH0gZnJvbSAnLi4vcGlwZXMvY2VsbC1maWVsZC12YWx1ZS5waXBlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE9uZUdyaWRDZWxsU2VydmljZSB7XG5cbiAgcHJpdmF0ZSBfY2VsbEZpZWxkVmFsdWVFbXB0eSA9IG5ldyBDZWxsRmllbGRWYWx1ZUVtcHR5UGlwZSgpO1xuICBwcml2YXRlIF9jZWxsVmFsdWVHZXR0ZXIgPSBuZXcgQ2VsbFZhbHVlR2V0dGVyUGlwZSgpO1xuICBwcml2YXRlIF9jZWxsRmllbGRWYWx1ZSA9IG5ldyBDZWxsRmllbGRWYWx1ZVBpcGUoKTtcbiAgcHJpdmF0ZSBfY29sdW1uRGVmczogT25lQ29sdW1uRGVmW10gPSBbXTtcbiAgcHJpdmF0ZSBfY29udGV4dDogYW55O1xuXG4gIHB1YmxpYyBhcHBseUNvbHVtbkRlZnMoY29sdW1uRGVmczogT25lQ29sdW1uRGVmW10sIGNvbnRleHQ6IGFueSkge1xuXG4gICAgdGhpcy5fY29sdW1uRGVmcyA9IGNvbHVtbkRlZnM7XG4gICAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgTmV3IE5vZGUgU3RhdGVzXG4gICAqL1xuICBwdWJsaWMgZ2VuZXJhdGVDZWxsU3RhdGVzKG5vZGU6IE9uZVJvd05vZGUpOiBPbmVDZWxsU3RhdGVzIHwgbnVsbCB7XG5cbiAgICBpZiAoIW5vZGUpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgbmV3U3RhdGVzOiBPbmVDZWxsU3RhdGVzID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiB0aGlzLl9jb2x1bW5EZWZzKSB7XG5cbiAgICAgIGNvbnN0IGZpZWxkID0gY29sdW1uLmZpZWxkO1xuXG4gICAgICBpZiAoZmllbGQgIT09ICdfb25lUm93TnVtYmVyJykge1xuXG4gICAgICAgIG5ld1N0YXRlc1tmaWVsZF0gPSB0aGlzLmdlbmVyYXRlQ2VsbFN0YXRlKG5vZGUsIGNvbHVtbikgPz8gbm9kZS5jZWxsU3RhdGVzW2ZpZWxkXSA/PyB7IHR5cGU6ICdub25lJywgdmFsdWU6ICcnIH07XG5cbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgbmV3U3RhdGVzW2ZpZWxkXSA9IG5vZGUuY2VsbFN0YXRlc1tjb2x1bW4uZmllbGRdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXdTdGF0ZXM7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgTmV3IE5vZGUgU3RhdGUgQmFzZWQgb24gQ29sdW1uIEZpZWxkXG4gICAqL1xuICBwdWJsaWMgZ2VuZXJhdGVDZWxsU3RhdGUobm9kZTogT25lUm93Tm9kZSwgY29sdW1uOiBPbmVDb2x1bW5EZWYpOiBPbmVDZWxsU3RhdGUge1xuXG4gICAgY29uc3QgaXNGaWVsZCA9IGNvbHVtbi5maWVsZCAhPT0gdW5kZWZpbmVkIHx8IGNvbHVtbi5maWVsZCAhPT0gJycgfHwgY29sdW1uLmZpZWxkICE9PSBudWxsO1xuICAgIGNvbnN0IGlzRW1wdHkgPSB0aGlzLl9jZWxsRmllbGRWYWx1ZUVtcHR5LnRyYW5zZm9ybShub2RlLmRhdGEsIGNvbHVtbi5maWVsZCk7XG4gICAgY29uc3QgaXNHcm91cCA9IG5vZGUuZ3JvdXAgfHwgbm9kZS5sZWFmR3JvdXA7XG4gICAgY29uc3QgaXNBdXRvR3JvdXAgPSBjb2x1bW4/LmF1dG9Hcm91cEZpZWxkO1xuXG4gICAgaWYgKGNvbHVtbiAmJiBjb2x1bW4uY2VsbFJlbmRlcmVyICYmICFpc0dyb3VwKSB7XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gY29sdW1uLmNlbGxSZW5kZXJlcih7IG5vZGUsIGNvbHVtbkRlZjogY29sdW1uIH0pO1xuXG4gICAgICByZXR1cm4geyB0eXBlOiAnaHRtbCcsIHZhbHVlOiB2YWx1ZSB9XG4gICAgfVxuXG4gICAgLy8gMS4gQ2VsbCBHcm91cCBQbGFjZWhvbGRlclxuICAgIGlmIChpc0ZpZWxkICYmIGlzRW1wdHkgJiYgaXNHcm91cCAmJiBpc0F1dG9Hcm91cCkge1xuXG4gICAgICByZXR1cm4geyB0eXBlOiAncGxhY2Vob2xkZXInLCB2YWx1ZTogY29sdW1uPy5jZWxsUmVuZGVyZXJQYXJhbXM/LnBsYWNlaG9sZGVyID8/IHRoaXMuX2NlbGxWYWx1ZUdldHRlci50cmFuc2Zvcm0obm9kZS5kYXRhLCBub2RlLCBjb2x1bW4sIHRoaXMuX2NvbnRleHQpID8/ICcnIH07XG4gICAgfVxuXG4gICAgLy8gMi4gQ2VsbCBHcm91cCBUZXh0IFZhbHVlXG4gICAgaWYgKGlzRmllbGQgJiYgaXNHcm91cCAmJiBpc0F1dG9Hcm91cCkge1xuXG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbHVtbj8udmFsdWVHZXR0ZXIgPyB0aGlzLl9jZWxsVmFsdWVHZXR0ZXIudHJhbnNmb3JtKG5vZGUuZGF0YSwgbm9kZSwgY29sdW1uLCB0aGlzLl9jb250ZXh0KSA6IHRoaXMuX2NlbGxGaWVsZFZhbHVlLnRyYW5zZm9ybShub2RlLmRhdGEsIGNvbHVtbi5maWVsZCk7XG5cbiAgICAgIHJldHVybiB7IHR5cGU6ICd0ZXh0JywgdmFsdWU6IHZhbHVlID8/ICcnIH07XG4gICAgfVxuXG4gICAgLy8gMy4gQ2VsbCBQbGFjZWhvbGRlclxuICAgIGlmIChpc0ZpZWxkICYmIGlzRW1wdHkgJiYgIWlzR3JvdXAgJiYgIWlzQXV0b0dyb3VwKSB7XG5cbiAgICAgIGNvbnN0IHZhbHVlR2V0dGVyID0gdGhpcy5fY2VsbFZhbHVlR2V0dGVyLnRyYW5zZm9ybShub2RlLmRhdGEsIG5vZGUsIGNvbHVtbiwgdGhpcy5fY29udGV4dCk7XG5cbiAgICAgIGlmICh2YWx1ZUdldHRlcikge1xuXG4gICAgICAgIHJldHVybiB7IHR5cGU6ICd0ZXh0JywgdmFsdWU6IHZhbHVlR2V0dGVyIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gY29sdW1uPy5jZWxsUmVuZGVyZXJQYXJhbXM/LnBsYWNlaG9sZGVyID8/ICcnO1xuXG4gICAgICByZXR1cm4geyB0eXBlOiAncGxhY2Vob2xkZXInLCB2YWx1ZTogcGxhY2Vob2xkZXIgfTtcbiAgICB9XG5cbiAgICAvLyA0LiBDZWxsIFRleHQgVmFsdWVcbiAgICBpZiAoaXNGaWVsZCAmJiAhKGlzR3JvdXAgfHwgaXNBdXRvR3JvdXApKSB7XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gY29sdW1uPy52YWx1ZUdldHRlciA/IHRoaXMuX2NlbGxWYWx1ZUdldHRlci50cmFuc2Zvcm0obm9kZS5kYXRhLCBub2RlLCBjb2x1bW4sIHRoaXMuX2NvbnRleHQpIDogdGhpcy5fY2VsbEZpZWxkVmFsdWUudHJhbnNmb3JtKG5vZGUuZGF0YSwgY29sdW1uLmZpZWxkKTtcblxuICAgICAgcmV0dXJuIHsgdHlwZTogJ3RleHQnLCB2YWx1ZTogdmFsdWUgPz8gJycgfTtcbiAgICB9XG5cbiAgICAvLyA1LiBEZWZhdWx0XG4gICAgcmV0dXJuIHsgdHlwZTogJ25vbmUnLCB2YWx1ZTogJycgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmUgQ29sdW1uIERlZiBQYXJhbXMgUmVzb2x2ZXJcbiAgICovXG4gIHB1YmxpYyBlZGl0YWJsZUZuID0gKGNvbHVtbjogT25lQ29sdW1uRGVmLCBub2RlOiBPbmVSb3dOb2RlKSA9PiByZXNvbHZlT25lQ2VsbFJlbmRlcmVyUGFyYW1zKGNvbHVtbi5lZGl0YWJsZSwgeyBub2RlLCBkYXRhOiBub2RlLmRhdGEsIGNvbHVtbkRlZjogY29sdW1uLCByb3dJbmRleDogbm9kZS5yb3dJbmRleCwgY29udGV4dDogdGhpcy5fY29udGV4dCB9KTtcblxuICBwdWJsaWMgdXBkYXRhYmxlRm4gPSAoY29sdW1uOiBPbmVDb2x1bW5EZWYsIG5vZGU6IE9uZVJvd05vZGUpID0+IHJlc29sdmVPbmVDZWxsUmVuZGVyZXJQYXJhbXMoY29sdW1uLnVwZGF0YWJsZSwgeyBub2RlLCBkYXRhOiBub2RlLmRhdGEsIGNvbHVtbkRlZjogY29sdW1uLCByb3dJbmRleDogbm9kZS5yb3dJbmRleCwgY29udGV4dDogdGhpcy5fY29udGV4dCB9KTtcblxuICBwdWJsaWMgZGlzYWJsZUZuID0gKGNvbHVtbjogT25lQ29sdW1uRGVmLCBub2RlOiBPbmVSb3dOb2RlKSA9PiByZXNvbHZlT25lQ2VsbFJlbmRlcmVyUGFyYW1zKGNvbHVtbi5kaXNhYmxlLCB7IG5vZGUsIGRhdGE6IG5vZGUuZGF0YSwgY29sdW1uRGVmOiBjb2x1bW4sIHJvd0luZGV4OiBub2RlLnJvd0luZGV4LCBjb250ZXh0OiB0aGlzLl9jb250ZXh0IH0pO1xuXG4gIHB1YmxpYyBkcmFnYWJsZUZuID0gKGNvbHVtbjogT25lQ29sdW1uRGVmLCBub2RlOiBPbmVSb3dOb2RlKSA9PiByZXNvbHZlT25lQ2VsbFJlbmRlcmVyUGFyYW1zKGNvbHVtbi5kcmFnYWJsZSwgeyBub2RlLCBkYXRhOiBub2RlLmRhdGEsIGNvbHVtbkRlZjogY29sdW1uLCByb3dJbmRleDogbm9kZS5yb3dJbmRleCwgY29udGV4dDogdGhpcy5fY29udGV4dCB9KTtcblxuICBwdWJsaWMgdmFsdWVHZXR0ZXJGbiA9IChjb2x1bW46IE9uZUNvbHVtbkRlZiwgbm9kZTogT25lUm93Tm9kZSkgPT4gcmVzb2x2ZU9uZVZhbHVlR2V0dGVyUGFyYW1zKGNvbHVtbi52YWx1ZUdldHRlciwgeyBkYXRhOiBub2RlLmRhdGEsIHJvd0luZGV4OiBub2RlLnJvd0luZGV4LCBub2RlOiBub2RlLCBjb250ZXh0OiB0aGlzLl9jb250ZXh0IH0pO1xufVxuIl19
191
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtY2VsbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25lLWdyaWQvc3JjL2xpYi9jb3JlL3NlcnZpY2VzL29uZS1ncmlkLWNlbGwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRS9FLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2hILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOztBQUlwRSxNQUFNLE9BQU8sa0JBQWtCO0lBRC9CO1FBR1UseUJBQW9CLEdBQUcsSUFBSSx1QkFBdUIsRUFBRSxDQUFDO1FBQ3JELHFCQUFnQixHQUFHLElBQUksbUJBQW1CLEVBQUUsQ0FBQztRQUM3QyxvQkFBZSxHQUFHLElBQUksa0JBQWtCLEVBQUUsQ0FBQztRQUMzQyxnQkFBVyxHQUFtQixFQUFFLENBQUM7UUFFakMsU0FBSSxHQUFzQixJQUFJLENBQUM7UUE0THZDLDhFQUE4RTtRQUM5RSwrQkFBK0I7UUFDL0IsRUFBRTtRQUNGLDZFQUE2RTtRQUM3RSw4RUFBOEU7UUFDOUUsa0VBQWtFO1FBQ2xFLDhFQUE4RTtRQUU5RSw0RUFBNEU7UUFDckUsZUFBVSxHQUFHLENBQUMsTUFBb0IsRUFBRSxJQUFnQixFQUFXLEVBQUUsQ0FDdEUsNEJBQTRCLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRWhGOzs7Ozs7V0FNRztRQUNJLGdCQUFXLEdBQUcsQ0FBQyxNQUFvQixF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LGFBQWE7UUFDYixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDckMsQ0FBQzsrR0FqTVUsa0JBQWtCO21IQUFsQixrQkFBa0I7OzRGQUFsQixrQkFBa0I7a0JBRDlCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPbmVDZWxsUHJlc2VudGF0aW9uUGFyYW1zLCBPbmVDZWxsU3RhdGUsIE9uZUNlbGxTdGF0ZXMsIE9uZUNvbHVtbkRlZiB9IGZyb20gJy4uL21vZGVscy9vbmUtY29sdW1uLWRlZi10eXBlcy5tb2RlbCc7XG5pbXBvcnQgeyBDZWxsRmllbGRWYWx1ZUVtcHR5UGlwZSB9IGZyb20gJy4uL3BpcGVzL2NlbGwtZmllbGQtdmFsdWUtZW1wdHkucGlwZSc7XG5pbXBvcnQgeyBPbmVSb3dOb2RlIH0gZnJvbSAnLi4vaW5zdGFudHMvb25lLXJvdy1ub2RlLmNsYXNzJztcbmltcG9ydCB7IHJlc29sdmVPbmVDZWxsUmVuZGVyZXJQYXJhbXMsIHJlc29sdmVPbmVWYWx1ZUdldHRlclBhcmFtcyB9IGZyb20gJy4uLy4uL2hlbHBlcnMvb25lLWNvbHVtbi1kZWYuaGVscGVyJztcbmltcG9ydCB7IENlbGxWYWx1ZUdldHRlclBpcGUgfSBmcm9tICcuLi9waXBlcy9jZWxsLXZhbHVlLWdldHRlci5waXBlJztcbmltcG9ydCB7IENlbGxGaWVsZFZhbHVlUGlwZSB9IGZyb20gJy4uL3BpcGVzL2NlbGwtZmllbGQtdmFsdWUucGlwZSc7XG5pbXBvcnQgdHlwZSB7IE9uZUdyaWRBcGkgfSBmcm9tICcuLi9pbnN0YW50cy9vbmUtZ3JpZC1hcGkuY2xhc3MnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgT25lR3JpZENlbGxTZXJ2aWNlIHtcblxuICBwcml2YXRlIF9jZWxsRmllbGRWYWx1ZUVtcHR5ID0gbmV3IENlbGxGaWVsZFZhbHVlRW1wdHlQaXBlKCk7XG4gIHByaXZhdGUgX2NlbGxWYWx1ZUdldHRlciA9IG5ldyBDZWxsVmFsdWVHZXR0ZXJQaXBlKCk7XG4gIHByaXZhdGUgX2NlbGxGaWVsZFZhbHVlID0gbmV3IENlbGxGaWVsZFZhbHVlUGlwZSgpO1xuICBwcml2YXRlIF9jb2x1bW5EZWZzOiBPbmVDb2x1bW5EZWZbXSA9IFtdO1xuICBwcml2YXRlIF9jb250ZXh0OiBhbnk7XG4gIHByaXZhdGUgX2FwaTogT25lR3JpZEFwaSB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyBhcHBseUNvbHVtbkRlZnMoY29sdW1uRGVmczogT25lQ29sdW1uRGVmW10sIGNvbnRleHQ6IGFueSkge1xuXG4gICAgdGhpcy5fY29sdW1uRGVmcyA9IGNvbHVtbkRlZnM7XG4gICAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7XG4gIH1cblxuICAvKipcbiAgICogQmFjay1yZWZlcmVuY2UgdG8gdGhlIGdyaWQgYXBpLCBzbyBwcmVkaWNhdGUgcGFyYW1zIGNhbiBjYXJyeSBpdC5cbiAgICpcbiAgICogUHVzaGVkIGluIHJhdGhlciB0aGFuIGluamVjdGVkOiBgT25lR3JpZEFwaWAgYWxyZWFkeSBkZXBlbmRzIG9uIHRoaXNcbiAgICogc2VydmljZSwgYW5kIGluamVjdGluZyBpdCBiYWNrIHdvdWxkIGNsb3NlIGEgREkgY3ljbGUuXG4gICAqL1xuICBwdWJsaWMgc2V0R3JpZEFwaShhcGk6IE9uZUdyaWRBcGkgfCBudWxsKTogdm9pZCB7XG5cbiAgICB0aGlzLl9hcGkgPSBhcGk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBhcmFtcyBldmVyeSByb3ctc2NvcGVkIGNvbHVtbiBjYWxsYmFjayByZWNlaXZlcy5cbiAgICpcbiAgICogT25lIGJ1aWxkZXIsIGRlbGliZXJhdGVseTogYGVkaXRhYmxlYCwgYHVwZGF0YWJsZWAsIGBkaXNhYmxlYCwgYHJvd0RyYWdgLFxuICAgKiBgaGlkZUFjdGlvbkJ1dHRvbmAsIGBjZWxsQ2xhc3NgLCBgY2VsbFN0eWxlYCwgYGNlbGxSZW5kZXJlcmAgYW5kXG4gICAqIGB2YWx1ZUZvcm1hdHRlcmAgYXJlIGFsbCBcImRlY2lkZSBzb21ldGhpbmcgYWJvdXQgdGhpcyBjZWxsXCIsIGFuZCBhIGNvbnN1bWVyXG4gICAqIHNob3VsZCBub3QgaGF2ZSB0byByZW1lbWJlciB3aGljaCBvZiB0aGVtIGhhcHBlbnMgdG8gYmUgaGFuZGVkIGB2YWx1ZWAgb3JcbiAgICogYGZpZWxkYC4gRWFjaCB1c2VkIHRvIGJlIGNhbGxlZCB3aXRoIGEgc2xpZ2h0bHkgZGlmZmVyZW50IHN1YnNldC5cbiAgICovXG4gIHB1YmxpYyBjZWxsUGFyYW1zKGNvbHVtbjogT25lQ29sdW1uRGVmLCBub2RlOiBPbmVSb3dOb2RlKTogT25lQ2VsbFByZXNlbnRhdGlvblBhcmFtcyB7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLy8gQ29sdW1uIGNvbmZpZyBmaXJzdCwgc28gdGhlIGdyaWQncyBvd24gZmllbGRzIHdpbiBhIG5hbWUgY29sbGlzaW9uOiBhXG4gICAgICAvLyBzdGFsZSBgdmFsdWVgIGxlZnQgaW4gYGNlbGxSZW5kZXJlclBhcmFtc2AgbXVzdCBub3Qgc2hhZG93IHRoaXMgY2VsbCdzLlxuICAgICAgLi4uKGNvbHVtbj8uY2VsbFJlbmRlcmVyUGFyYW1zID8/IHt9KSxcbiAgICAgIHZhbHVlOiB0aGlzLnJlc29sdmVWYWx1ZShub2RlLCBjb2x1bW4pLFxuICAgICAgZGF0YTogbm9kZS5kYXRhLFxuICAgICAgbm9kZSxcbiAgICAgIHJvd0luZGV4OiBub2RlLnJvd0luZGV4LFxuICAgICAgZmllbGQ6IGNvbHVtbj8uZmllbGQgYXMgc3RyaW5nLFxuICAgICAgY29sdW1uRGVmOiBjb2x1bW4sXG4gICAgICBhcGk6IHRoaXMuX2FwaSA/PyB1bmRlZmluZWQsXG4gICAgICBjb250ZXh0OiB0aGlzLl9jb250ZXh0LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgTmV3IE5vZGUgU3RhdGVzXG4gICAqL1xuICBwdWJsaWMgZ2VuZXJhdGVDZWxsU3RhdGVzKG5vZGU6IE9uZVJvd05vZGUpOiBPbmVDZWxsU3RhdGVzIHwgbnVsbCB7XG5cbiAgICBpZiAoIW5vZGUpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgbmV3U3RhdGVzOiBPbmVDZWxsU3RhdGVzID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiB0aGlzLl9jb2x1bW5EZWZzKSB7XG5cbiAgICAgIGNvbnN0IGZpZWxkID0gY29sdW1uLmZpZWxkO1xuXG4gICAgICAvLyBDZWxsIHN0YXRlIGlzIGtleWVkIGJ5IGZpZWxkLCBzbyBhIGNvbHVtbiB3aXRob3V0IG9uZSBjb250cmlidXRlc1xuICAgICAgLy8gbm90aGluZy4gU2tpcHBpbmcgaXQga2VlcHMgYHVuZGVmaW5lZGAgb3V0IG9mIHRoZSBzdGF0ZSBvYmplY3Q7IHN1Y2ggYVxuICAgICAgLy8gY29sdW1uIHN0aWxsIHJlbmRlcnMgaXRzIGFjdGlvbiBidXR0b25zLCB3aGljaCBkbyBub3QgcmVhZCBjZWxsIHN0YXRlLlxuICAgICAgaWYgKCFmaWVsZCkgY29udGludWU7XG5cbiAgICAgIGlmIChmaWVsZCAhPT0gJ19vbmVSb3dOdW1iZXInKSB7XG5cbiAgICAgICAgbmV3U3RhdGVzW2ZpZWxkXSA9IHRoaXMuZ2VuZXJhdGVDZWxsU3RhdGUobm9kZSwgY29sdW1uKSA/PyBub2RlLmNlbGxTdGF0ZXNbZmllbGRdID8/IHsgdHlwZTogJ25vbmUnLCB2YWx1ZTogJycgfTtcblxuICAgICAgfSBlbHNlIHtcblxuICAgICAgICBuZXdTdGF0ZXNbZmllbGRdID0gbm9kZS5jZWxsU3RhdGVzW2ZpZWxkXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3U3RhdGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjZWxsJ3MgdmFsdWU6IHRoZSBgdmFsdWVHZXR0ZXJgJ3Mgb3V0cHV0IHdoZXJlIHRoZSBjb2x1bW4gZGVjbGFyZXMgb25lLFxuICAgKiB0aGUgcmF3IGZpZWxkIG90aGVyd2lzZS4gVGhpcyBpcyB0aGUgdmFsdWUsIG5vdCB0aGUgZGlzcGxheSB0ZXh0IOKAlCBzZWVcbiAgICoge0BsaW5rIGZvcm1hdFZhbHVlfS5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZVZhbHVlKG5vZGU6IE9uZVJvd05vZGUsIGNvbHVtbjogT25lQ29sdW1uRGVmKTogYW55IHtcblxuICAgIHJldHVybiBjb2x1bW4/LnZhbHVlR2V0dGVyXG4gICAgICA/IHRoaXMuX2NlbGxWYWx1ZUdldHRlci50cmFuc2Zvcm0obm9kZS5kYXRhLCBub2RlLCBjb2x1bW4sIHRoaXMuX2NvbnRleHQpXG4gICAgICA6IHRoaXMuX2NlbGxGaWVsZFZhbHVlLnRyYW5zZm9ybShub2RlLmRhdGEsIGNvbHVtbi5maWVsZCk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgdGhlIGNvbHVtbidzIGB2YWx1ZUZvcm1hdHRlcmAuXG4gICAqXG4gICAqIGB2YWx1ZUZvcm1hdHRlcmAgd2FzIGRlY2xhcmVkIG9uIHRoZSBjb2x1bW4gZGVmaW5pdGlvbiBhbmQgY2FsbGVkIGZyb21cbiAgICogbm93aGVyZSDigJQgYSBjb25zdW1lciBjb3VsZCB3cml0ZSBvbmUsIGdldCBubyBlcnJvciwgYW5kIHNlZSBub3RoaW5nIGhhcHBlbi5cbiAgICogSXQgcnVucyBvbiBkaXNwbGF5ZWQgdGV4dCBvbmx5LCBhZnRlciB0aGUgYHZhbHVlR2V0dGVyYCwgYW5kIGlzIGRlbGliZXJhdGVseVxuICAgKiBza2lwcGVkIGZvciBwbGFjZWhvbGRlcnM6IGFuIGVtcHR5IGNlbGwgYWxyZWFkeSBoYXMgaXRzIG93biBtZWNoYW5pc20gaW5cbiAgICogYGNlbGxSZW5kZXJlclBhcmFtcy5wbGFjZWhvbGRlcmAsIGFuZCB0d28gZmVhdHVyZXMgY29tcGV0aW5nIHRvIGZpbGwgdGhlXG4gICAqIHNhbWUgZ2FwIGlzIHdvcnNlIHRoYW4gb25lLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgc29ydGluZyBhbmQgZmlsdGVyaW5nIHJlYWQgdGhlIHVuZGVybHlpbmcgcm93IGRhdGEsIG5vdCB0aGlzIOKAlFxuICAgKiB3aGljaCBpcyBleGFjdGx5IHdoeSBmb3JtYXR0aW5nIGJlbG9uZ3MgaGVyZSByYXRoZXIgdGhhbiBpbiB0aGUgZ2V0dGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXRWYWx1ZShub2RlOiBPbmVSb3dOb2RlLCBjb2x1bW46IE9uZUNvbHVtbkRlZiwgdmFsdWU6IGFueSk6IGFueSB7XG5cbiAgICBpZiAodHlwZW9mIGNvbHVtbj8udmFsdWVGb3JtYXR0ZXIgIT09ICdmdW5jdGlvbicpIHJldHVybiB2YWx1ZTtcblxuICAgIC8vIGB2YWx1ZWAgaXMgcGFzc2VkIGV4cGxpY2l0bHkgcmF0aGVyIHRoYW4gbGVmdCB0byBgY2VsbFBhcmFtc2A6IHRoZSBlbXB0eVxuICAgIC8vIC1jZWxsIGJyYW5jaCByZXNvbHZlcyBpdCB0aHJvdWdoIHRoZSBnZXR0ZXIgYmVmb3JlIGRlY2lkaW5nIHdoZXRoZXIgdGhlcmVcbiAgICAvLyBpcyBhbnl0aGluZyB0byBmb3JtYXQsIGFuZCB0aGUgZm9ybWF0dGVyIG11c3Qgc2VlIHRoYXQgc2FtZSB2YWx1ZS5cbiAgICByZXR1cm4gY29sdW1uLnZhbHVlRm9ybWF0dGVyKHsgLi4udGhpcy5jZWxsUGFyYW1zKGNvbHVtbiwgbm9kZSksIHZhbHVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIE5ldyBOb2RlIFN0YXRlIEJhc2VkIG9uIENvbHVtbiBGaWVsZFxuICAgKi9cbiAgcHVibGljIGdlbmVyYXRlQ2VsbFN0YXRlKG5vZGU6IE9uZVJvd05vZGUsIGNvbHVtbjogT25lQ29sdW1uRGVmKTogT25lQ2VsbFN0YXRlIHtcblxuICAgIC8vIFRoaXMgd2FzIGBmaWVsZCAhPT0gdW5kZWZpbmVkIHx8IGZpZWxkICE9PSAnJyB8fCBmaWVsZCAhPT0gbnVsbGAsIHdoaWNoIGlzXG4gICAgLy8gdHJ1ZSBmb3IgZXZlcnkgcG9zc2libGUgdmFsdWUgaW5jbHVkaW5nIGFsbCB0aHJlZSBpdCBtZWFudCB0byBleGNsdWRlIOKAlFxuICAgIC8vIGB8fGAgd2hlcmUgYCYmYCB3YXMgaW50ZW5kZWQuIEl0IGdhdGVkIHRoZSBmb3VyIGJyYW5jaGVzIGJlbG93LCBzbyBub25lXG4gICAgLy8gb2YgdGhlbSBjb3VsZCBldmVyIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdC4gUmVkdWNlZCB0byB0aGUgY2hlY2sgaXRcbiAgICAvLyB3YXMgcmVhY2hpbmcgZm9yOiBhIGNvbHVtbiB3aXRoIG5vIGZpZWxkIGhhcyBubyB2YWx1ZSB0byByZW5kZXIuXG4gICAgY29uc3QgZmllbGQgPSBjb2x1bW4/LmZpZWxkO1xuXG4gICAgaWYgKCFmaWVsZCkge1xuXG4gICAgICByZXR1cm4geyB0eXBlOiAnbm9uZScsIHZhbHVlOiAnJyB9O1xuICAgIH1cblxuICAgIGNvbnN0IGlzRW1wdHkgPSB0aGlzLl9jZWxsRmllbGRWYWx1ZUVtcHR5LnRyYW5zZm9ybShub2RlLmRhdGEsIGZpZWxkKTtcbiAgICBjb25zdCBpc0dyb3VwID0gbm9kZS5ncm91cCB8fCBub2RlLmxlYWZHcm91cDtcbiAgICBjb25zdCBpc0F1dG9Hcm91cCA9IGNvbHVtbj8uYXV0b0dyb3VwRmllbGQ7XG5cbiAgICBpZiAoY29sdW1uICYmIGNvbHVtbi5jZWxsUmVuZGVyZXIgJiYgIWlzR3JvdXApIHtcblxuICAgICAgLy8gVGhlIHJlbmRlcmVyIHVzZWQgdG8gYmUgaGFuZGVkIGB7IG5vZGUsIGNvbHVtbkRlZiB9YCBhbmQgbm90aGluZyBlbHNlLFxuICAgICAgLy8gc28gdGhlIG9idmlvdXMgd2F5IHRvIHdyaXRlIG9uZSDigJQgYHBhcmFtcy52YWx1ZWAg4oCUIHByb2R1Y2VkIHRoZSBzdHJpbmdcbiAgICAgIC8vIFwidW5kZWZpbmVkXCIsIGFuZCBgcGFyYW1zLmRhdGEueGAgdGhyZXcuIEl0IG5vdyBnZXRzIGV4YWN0bHkgd2hhdCBldmVyeVxuICAgICAgLy8gb3RoZXIgcm93LXNjb3BlZCBob29rIGdldHMuXG4gICAgICByZXR1cm4geyB0eXBlOiAnaHRtbCcsIHZhbHVlOiBjb2x1bW4uY2VsbFJlbmRlcmVyKHRoaXMuY2VsbFBhcmFtcyhjb2x1bW4sIG5vZGUpKSB9XG4gICAgfVxuXG4gICAgLy8gMS4gQ2VsbCBHcm91cCBQbGFjZWhvbGRlclxuICAgIGlmIChpc0VtcHR5ICYmIGlzR3JvdXAgJiYgaXNBdXRvR3JvdXApIHtcblxuICAgICAgcmV0dXJuIHsgdHlwZTogJ3BsYWNlaG9sZGVyJywgdmFsdWU6IGNvbHVtbj8uY2VsbFJlbmRlcmVyUGFyYW1zPy5wbGFjZWhvbGRlciA/PyB0aGlzLl9jZWxsVmFsdWVHZXR0ZXIudHJhbnNmb3JtKG5vZGUuZGF0YSwgbm9kZSwgY29sdW1uLCB0aGlzLl9jb250ZXh0KSA/PyAnJyB9O1xuICAgIH1cblxuICAgIC8vIDIuIENlbGwgR3JvdXAgVGV4dCBWYWx1ZVxuICAgIGlmIChpc0dyb3VwICYmIGlzQXV0b0dyb3VwKSB7XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5mb3JtYXRWYWx1ZShub2RlLCBjb2x1bW4sIHRoaXMucmVzb2x2ZVZhbHVlKG5vZGUsIGNvbHVtbikpO1xuXG4gICAgICByZXR1cm4geyB0eXBlOiAndGV4dCcsIHZhbHVlOiB2YWx1ZSA/PyAnJyB9O1xuICAgIH1cblxuICAgIC8vIDMuIENlbGwgUGxhY2Vob2xkZXJcbiAgICAvL1xuICAgIC8vIFRoZSBhdXRvIGdyb3VwIGNvbHVtbiBpcyBkZWxpYmVyYXRlbHkgTk9UIGV4Y2x1ZGVkIGhlcmUuIENhc2VzIDEgYW5kIDJcbiAgICAvLyBhYm92ZSBhbHJlYWR5IGNsYWltZWQgdGhlIGdyb3VwIHJvd3MsIHNvIHdoYXQgcmVhY2hlcyB0aGlzIHBvaW50IGlzIGFcbiAgICAvLyBsZWFmIOKAlCBhbmQgYSBsZWFmIG9uIHRoZSBhdXRvIGdyb3VwIGNvbHVtbiBoYXMgdG8gcmVuZGVyIGl0cyBsYWJlbCB0b28sXG4gICAgLy8gaW5kZW50ZWQgYnkgbGV2ZWwuIEV4Y2x1ZGluZyBpdCBkcm9wcGVkIGV2ZXJ5IGxlYWYgdGhyb3VnaCB0byBjYXNlIDUgYW5kXG4gICAgLy8gcmVuZGVyZWQgdGhlIGdyb3VwIGNvbHVtbiBibGFuayBmb3IgdGhlIHdob2xlIGJvdHRvbSByb3cgb2YgYSB0cmVlLlxuICAgIGlmIChpc0VtcHR5ICYmICFpc0dyb3VwKSB7XG5cbiAgICAgIGNvbnN0IHZhbHVlR2V0dGVyID0gdGhpcy5fY2VsbFZhbHVlR2V0dGVyLnRyYW5zZm9ybShub2RlLmRhdGEsIG5vZGUsIGNvbHVtbiwgdGhpcy5fY29udGV4dCk7XG5cbiAgICAgIGlmICh2YWx1ZUdldHRlcikge1xuXG4gICAgICAgIHJldHVybiB7IHR5cGU6ICd0ZXh0JywgdmFsdWU6IHRoaXMuZm9ybWF0VmFsdWUobm9kZSwgY29sdW1uLCB2YWx1ZUdldHRlcikgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSBjb2x1bW4/LmNlbGxSZW5kZXJlclBhcmFtcz8ucGxhY2Vob2xkZXIgPz8gJyc7XG5cbiAgICAgIHJldHVybiB7IHR5cGU6ICdwbGFjZWhvbGRlcicsIHZhbHVlOiBwbGFjZWhvbGRlciB9O1xuICAgIH1cblxuICAgIC8vIDQuIENlbGwgVGV4dCBWYWx1ZSAobGVhdmVzLCBpbmNsdWRpbmcgdGhlIGF1dG8gZ3JvdXAgY29sdW1uIOKAlCBzZWUgYWJvdmUpXG4gICAgaWYgKCFpc0dyb3VwKSB7XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5mb3JtYXRWYWx1ZShub2RlLCBjb2x1bW4sIHRoaXMucmVzb2x2ZVZhbHVlKG5vZGUsIGNvbHVtbikpO1xuXG4gICAgICByZXR1cm4geyB0eXBlOiAndGV4dCcsIHZhbHVlOiB2YWx1ZSA/PyAnJyB9O1xuICAgIH1cblxuICAgIC8vIDUuIERlZmF1bHRcbiAgICByZXR1cm4geyB0eXBlOiAnbm9uZScsIHZhbHVlOiAnJyB9O1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFJvdy1zY29wZWQgY29sdW1uIHByZWRpY2F0ZXNcbiAgLy9cbiAgLy8gRXZlcnkgb25lIG9mIHRoZXNlIHJlc29sdmVzIHRoZSBzYW1lIHdheSBhbmQgcmVjZWl2ZXMgdGhlIHNhbWUgcGFyYW1zLCB2aWFcbiAgLy8gYGNlbGxQYXJhbXNgLiBUaGV5IHVzZWQgdG8gZWFjaCBidWlsZCB0aGVpciBvd24gc3Vic2V0IGlubGluZSwgd2hpY2ggaXMgaG93XG4gIC8vIGB2YWx1ZWAsIGBmaWVsZGAgYW5kIGBhcGlgIGNhbWUgdG8gYmUgbWlzc2luZyBmcm9tIGFsbCBvZiB0aGVtLlxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKiogV2hldGhlciB0aGlzIGNlbGwgbWF5IGJlIGVkaXRlZCBhdCBhbGwuIEEgY2FwYWJpbGl0eTogdW5zZXQgbWVhbnMgbm8uICovXG4gIHB1YmxpYyBlZGl0YWJsZUZuID0gKGNvbHVtbjogT25lQ29sdW1uRGVmLCBub2RlOiBPbmVSb3dOb2RlKTogYm9vbGVhbiA9PlxuICAgIHJlc29sdmVPbmVDZWxsUmVuZGVyZXJQYXJhbXMoY29sdW1uPy5lZGl0YWJsZSwgdGhpcy5jZWxsUGFyYW1zKGNvbHVtbiwgbm9kZSkpO1xuXG4gIC8qKlxuICAgKiBUaGUgc2Vjb25kIGVkaXQgZ2F0ZSwgQU5EZWQgd2l0aCBgZWRpdGFibGVgLlxuICAgKlxuICAgKiBBIHJlc3RyaWN0aW9uLCBzbyB1bnNldCBtZWFucyBcIm5vIHJlc3RyaWN0aW9uXCIuIEl0IHVzZWQgdG8gcmVzb2x2ZSB0aHJvdWdoXG4gICAqIGAhIXVuZGVmaW5lZGAgdG8gYGZhbHNlYCwgY2xvc2luZyB0aGUgZ2F0ZSBvbiBldmVyeSBjb2x1bW4gdGhhdCBkaWQgbm90IG5hbWVcbiAgICogaXQg4oCUIHNvIGBlZGl0YWJsZTogdHJ1ZWAgb24gaXRzIG93biBtYWRlIG5vdGhpbmcgZWRpdGFibGUuXG4gICAqL1xuICBwdWJsaWMgdXBkYXRhYmxlRm4gPSAoY29sdW1uOiBPbmVDb2x1bW5EZWYsIG5vZGU6IE9uZVJvd05vZGUpOiBib29sZWFuID0+XG4gICAgcmVzb2x2ZU9uZUNlbGxSZW5kZXJlclBhcmFtcyhjb2x1bW4/LnVwZGF0YWJsZSwgdGhpcy5jZWxsUGFyYW1zKGNvbHVtbiwgbm9kZSksIHRydWUpO1xuXG4gIC8qKiBEaXNhYmxlcyB0aGlzIGNvbHVtbidzIHJvdyBhY3Rpb24gYnV0dG9ucy4gTm90IGFuIGVkaXQgZ2F0ZS4gKi9cbiAgcHVibGljIGRpc2FibGVGbiA9IChjb2x1bW46IE9uZUNvbHVtbkRlZiwgbm9kZTogT25lUm93Tm9kZSk6IGJvb2xlYW4gPT5cbiAgICByZXNvbHZlT25lQ2VsbFJlbmRlcmVyUGFyYW1zKGNvbHVtbj8uZGlzYWJsZSwgdGhpcy5jZWxsUGFyYW1zKGNvbHVtbiwgbm9kZSkpO1xuXG4gIC8qKiBIaWRlcyB0aGlzIGNvbHVtbidzIHJvdyBhY3Rpb24gYnV0dG9ucyBlbnRpcmVseS4gKi9cbiAgcHVibGljIGhpZGVBY3Rpb25CdXR0b25GbiA9IChjb2x1bW46IE9uZUNvbHVtbkRlZiwgbm9kZTogT25lUm93Tm9kZSk6IGJvb2xlYW4gPT5cbiAgICByZXNvbHZlT25lQ2VsbFJlbmRlcmVyUGFyYW1zKGNvbHVtbj8uaGlkZUFjdGlvbkJ1dHRvbiwgdGhpcy5jZWxsUGFyYW1zKGNvbHVtbiwgbm9kZSkpO1xuXG4gIC8qKiBXaGV0aGVyIHRoaXMgY2VsbCBjYXJyaWVzIGEgcm93IGRyYWcgaGFuZGxlLiAqL1xuICBwdWJsaWMgcm93RHJhZ0ZuID0gKGNvbHVtbjogT25lQ29sdW1uRGVmLCBub2RlOiBPbmVSb3dOb2RlKTogYm9vbGVhbiA9PlxuICAgIHJlc29sdmVPbmVDZWxsUmVuZGVyZXJQYXJhbXMoY29sdW1uPy5yb3dEcmFnLCB0aGlzLmNlbGxQYXJhbXMoY29sdW1uLCBub2RlKSk7XG5cbiAgcHVibGljIHZhbHVlR2V0dGVyRm4gPSAoY29sdW1uOiBPbmVDb2x1bW5EZWYsIG5vZGU6IE9uZVJvd05vZGUpID0+XG4gICAgcmVzb2x2ZU9uZVZhbHVlR2V0dGVyUGFyYW1zKGNvbHVtbj8udmFsdWVHZXR0ZXIsIHsgZGF0YTogbm9kZS5kYXRhLCByb3dJbmRleDogbm9kZS5yb3dJbmRleCwgbm9kZSwgY29udGV4dDogdGhpcy5fY29udGV4dCB9KTtcbn1cbiJdfQ==