@firestitch/list 12.13.0 → 12.13.2

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 (155) hide show
  1. package/app/classes/actions-controller.d.ts +20 -20
  2. package/app/classes/columns-controller.d.ts +71 -71
  3. package/app/classes/data-controller.d.ts +91 -91
  4. package/app/classes/external-params-controller.d.ts +31 -31
  5. package/app/classes/index.d.ts +2 -2
  6. package/app/classes/list-controller.d.ts +177 -175
  7. package/app/classes/pagination-controller.d.ts +189 -189
  8. package/app/classes/persistance-controller.d.ts +10 -10
  9. package/app/classes/reorder-controller.d.ts +68 -68
  10. package/app/classes/selection-controller.d.ts +146 -146
  11. package/app/classes/sorting-controller.d.ts +64 -64
  12. package/app/components/body/body.component.d.ts +29 -29
  13. package/app/components/body/row/actions/actions.component.d.ts +34 -34
  14. package/app/components/body/row/cell/cell.component.d.ts +23 -23
  15. package/app/components/body/row/inline-action/inline-action.component.d.ts +16 -16
  16. package/app/components/body/row/menu-action/menu-action.component.d.ts +14 -14
  17. package/app/components/body/row/row.component.d.ts +80 -80
  18. package/app/components/customize-cols/customize-cols.component.d.ts +17 -17
  19. package/app/components/footer/footer-row/footer-cell/footer-cell.component.d.ts +7 -7
  20. package/app/components/footer/footer-row/footer-row.component.d.ts +14 -14
  21. package/app/components/footer/footer.component.d.ts +16 -16
  22. package/app/components/head/head-cell/head-cell.component.d.ts +14 -14
  23. package/app/components/head/head.component.d.ts +47 -47
  24. package/app/components/list/list.component.d.ts +121 -120
  25. package/app/components/loader/loader.component.d.ts +14 -14
  26. package/app/components/manage-saved-filters/manage-saved-filters.component.d.ts +13 -13
  27. package/app/components/pagination/pagination.component.d.ts +14 -14
  28. package/app/components/saved-filters/saved-filters.component.d.ts +15 -15
  29. package/app/components/status/status.component.d.ts +21 -21
  30. package/app/directives/cell/cell.directive.d.ts +8 -8
  31. package/app/directives/column/column.directive.d.ts +33 -33
  32. package/app/directives/content/content.directive.d.ts +5 -5
  33. package/app/directives/content-init/content-init.directive.d.ts +9 -9
  34. package/app/directives/draggable-list/draggable-list.directive.d.ts +90 -90
  35. package/app/directives/draggable-row/draggable-row.directive.d.ts +23 -23
  36. package/app/directives/empty-state/empty-state.directive.d.ts +5 -5
  37. package/app/directives/footer/footer.directive.d.ts +8 -8
  38. package/app/directives/group-expand-trigger/group-expand-trigger.directive.d.ts +10 -10
  39. package/app/directives/group-footer/group-footer.directive.d.ts +6 -6
  40. package/app/directives/group-header/group-header.directive.d.ts +6 -6
  41. package/app/directives/header/header.directive.d.ts +8 -8
  42. package/app/directives/heading/heading.directive.d.ts +5 -5
  43. package/app/directives/heading-container/heading-container.directive.d.ts +5 -5
  44. package/app/directives/index.d.ts +3 -3
  45. package/app/directives/subheading/subheading.directive.d.ts +5 -5
  46. package/app/enums/button-type.enum.d.ts +7 -7
  47. package/app/enums/page-change-type.enum.d.ts +4 -4
  48. package/app/enums/pagination-strategy.enum.d.ts +5 -5
  49. package/app/enums/row-type.enum.d.ts +6 -6
  50. package/app/enums/state.enum.d.ts +9 -9
  51. package/app/fs-list.module.d.ts +60 -60
  52. package/app/fs-list.providers.d.ts +3 -3
  53. package/app/interfaces/cellconfig.interface.d.ts +5 -5
  54. package/app/interfaces/column-config.interface.d.ts +2 -2
  55. package/app/interfaces/draggable-list.interface.d.ts +7 -7
  56. package/app/interfaces/external-params.interface.d.ts +13 -13
  57. package/app/interfaces/index.d.ts +3 -3
  58. package/app/interfaces/listconfig.interface.d.ts +257 -253
  59. package/app/interfaces/pagination.interface.d.ts +13 -13
  60. package/app/models/column-async-attribute.d.ts +5 -5
  61. package/app/models/column-attributes.d.ts +39 -39
  62. package/app/models/column.model.d.ts +59 -59
  63. package/app/models/row/base-row.d.ts +13 -13
  64. package/app/models/row/child-row.d.ts +12 -12
  65. package/app/models/row/group-footer-row.d.ts +10 -10
  66. package/app/models/row/group-row.d.ts +16 -16
  67. package/app/models/row/simple-row.d.ts +5 -5
  68. package/app/models/row-action.model.d.ts +29 -29
  69. package/app/models/row.d.ts +30 -30
  70. package/app/models/styleConfig.model.d.ts +31 -31
  71. package/app/pipes/action-label.d.ts +8 -8
  72. package/app/pipes/index.d.ts +1 -1
  73. package/app/services/group-expand-notifier.service.d.ts +11 -11
  74. package/bundles/firestitch-list.umd.js +6838 -6834
  75. package/bundles/firestitch-list.umd.js.map +1 -1
  76. package/esm2015/app/classes/actions-controller.js +55 -55
  77. package/esm2015/app/classes/columns-controller.js +205 -205
  78. package/esm2015/app/classes/data-controller.js +352 -352
  79. package/esm2015/app/classes/external-params-controller.js +153 -153
  80. package/esm2015/app/classes/index.js +3 -3
  81. package/esm2015/app/classes/list-controller.js +716 -716
  82. package/esm2015/app/classes/pagination-controller.js +460 -460
  83. package/esm2015/app/classes/persistance-controller.js +19 -19
  84. package/esm2015/app/classes/reorder-controller.js +182 -182
  85. package/esm2015/app/classes/selection-controller.js +458 -458
  86. package/esm2015/app/classes/sorting-controller.js +180 -180
  87. package/esm2015/app/components/body/body.component.js +67 -67
  88. package/esm2015/app/components/body/row/actions/actions.component.js +95 -95
  89. package/esm2015/app/components/body/row/cell/cell.component.js +107 -107
  90. package/esm2015/app/components/body/row/inline-action/inline-action.component.js +39 -39
  91. package/esm2015/app/components/body/row/menu-action/menu-action.component.js +35 -35
  92. package/esm2015/app/components/body/row/row.component.js +292 -292
  93. package/esm2015/app/components/customize-cols/customize-cols.component.js +72 -72
  94. package/esm2015/app/components/footer/footer-row/footer-cell/footer-cell.component.js +20 -20
  95. package/esm2015/app/components/footer/footer-row/footer-row.component.js +31 -31
  96. package/esm2015/app/components/footer/footer.component.js +34 -34
  97. package/esm2015/app/components/head/head-cell/head-cell.component.js +33 -33
  98. package/esm2015/app/components/head/head.component.js +104 -104
  99. package/esm2015/app/components/list/list.component.js +382 -378
  100. package/esm2015/app/components/loader/loader.component.js +47 -47
  101. package/esm2015/app/components/manage-saved-filters/manage-saved-filters.component.js +78 -78
  102. package/esm2015/app/components/pagination/pagination.component.js +44 -44
  103. package/esm2015/app/components/saved-filters/saved-filters.component.js +33 -33
  104. package/esm2015/app/components/status/status.component.js +72 -72
  105. package/esm2015/app/directives/cell/cell.directive.js +18 -18
  106. package/esm2015/app/directives/column/column.directive.js +111 -111
  107. package/esm2015/app/directives/content/content.directive.js +12 -12
  108. package/esm2015/app/directives/content-init/content-init.directive.js +21 -21
  109. package/esm2015/app/directives/draggable-list/draggable-list.directive.js +323 -323
  110. package/esm2015/app/directives/draggable-row/draggable-row.directive.js +80 -80
  111. package/esm2015/app/directives/empty-state/empty-state.directive.js +13 -13
  112. package/esm2015/app/directives/footer/footer.directive.js +18 -18
  113. package/esm2015/app/directives/group-expand-trigger/group-expand-trigger.directive.js +26 -26
  114. package/esm2015/app/directives/group-footer/group-footer.directive.js +13 -13
  115. package/esm2015/app/directives/group-header/group-header.directive.js +13 -13
  116. package/esm2015/app/directives/header/header.directive.js +18 -18
  117. package/esm2015/app/directives/heading/heading.directive.js +13 -13
  118. package/esm2015/app/directives/heading-container/heading-container.directive.js +13 -13
  119. package/esm2015/app/directives/index.js +4 -4
  120. package/esm2015/app/directives/subheading/subheading.directive.js +13 -13
  121. package/esm2015/app/enums/button-type.enum.js +9 -9
  122. package/esm2015/app/enums/page-change-type.enum.js +6 -6
  123. package/esm2015/app/enums/pagination-strategy.enum.js +7 -7
  124. package/esm2015/app/enums/row-type.enum.js +7 -7
  125. package/esm2015/app/enums/state.enum.js +11 -11
  126. package/esm2015/app/fs-list.module.js +244 -244
  127. package/esm2015/app/fs-list.providers.js +4 -4
  128. package/esm2015/app/interfaces/cellconfig.interface.js +2 -2
  129. package/esm2015/app/interfaces/column-config.interface.js +1 -1
  130. package/esm2015/app/interfaces/draggable-list.interface.js +2 -2
  131. package/esm2015/app/interfaces/external-params.interface.js +2 -2
  132. package/esm2015/app/interfaces/index.js +4 -4
  133. package/esm2015/app/interfaces/listconfig.interface.js +2 -2
  134. package/esm2015/app/interfaces/pagination.interface.js +2 -2
  135. package/esm2015/app/models/column-async-attribute.js +13 -13
  136. package/esm2015/app/models/column-attributes.js +130 -130
  137. package/esm2015/app/models/column.model.js +166 -166
  138. package/esm2015/app/models/row/base-row.js +23 -23
  139. package/esm2015/app/models/row/child-row.js +28 -28
  140. package/esm2015/app/models/row/group-footer-row.js +20 -20
  141. package/esm2015/app/models/row/group-row.js +44 -44
  142. package/esm2015/app/models/row/simple-row.js +10 -10
  143. package/esm2015/app/models/row-action.model.js +94 -94
  144. package/esm2015/app/models/row.js +80 -80
  145. package/esm2015/app/models/styleConfig.model.js +75 -75
  146. package/esm2015/app/pipes/action-label.js +16 -16
  147. package/esm2015/app/pipes/index.js +1 -1
  148. package/esm2015/app/services/group-expand-notifier.service.js +26 -26
  149. package/esm2015/firestitch-list.js +4 -4
  150. package/esm2015/public_api.js +45 -45
  151. package/fesm2015/firestitch-list.js +5619 -5615
  152. package/fesm2015/firestitch-list.js.map +1 -1
  153. package/firestitch-list.d.ts +5 -5
  154. package/package.json +1 -1
  155. package/public_api.d.ts +39 -39
@@ -1,293 +1,293 @@
1
- import { ChangeDetectionStrategy, ChangeDetectorRef, ElementRef, EventEmitter, KeyValueDiffers, Renderer2, Component, HostBinding, Input, ViewChildren, } from '@angular/core';
2
- import { Subject } from 'rxjs';
3
- import { takeUntil } from 'rxjs/operators';
4
- import { ReorderPosition, ReorderStrategy } from '../../../classes/reorder-controller';
5
- import { SelectionController } from '../../../classes/selection-controller';
6
- import { RowAction } from '../../../models/row-action.model';
7
- import { Row } from '../../../models/row';
8
- import { FsListDraggableListDirective } from '../../../directives/draggable-list/draggable-list.directive';
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "../../../directives/draggable-list/draggable-list.directive";
11
- import * as i2 from "@angular/material/checkbox";
12
- import * as i3 from "./cell/cell.component";
13
- import * as i4 from "./actions/actions.component";
14
- import * as i5 from "@angular/material/icon";
15
- import * as i6 from "@angular/common";
16
- export class FsRowComponent {
17
- constructor(el, _cdRef, _differs, _renderer, _draggableList) {
18
- this.el = el;
19
- this._cdRef = _cdRef;
20
- this._differs = _differs;
21
- this._renderer = _renderer;
22
- this._draggableList = _draggableList;
23
- this.role = 'row';
24
- this.rowActionsRaw = [];
25
- this.groupActionsRaw = [];
26
- this.hasRowActions = false;
27
- this.rowEvents = {};
28
- this.restoreMode = false;
29
- this.ReorderPosition = ReorderPosition;
30
- this.ReorderStrategy = ReorderStrategy;
31
- this.rowActions = [];
32
- this.menuRowActions = [];
33
- this.inlineRowActions = [];
34
- this.selected = false;
35
- this.indeterminateSelected = false;
36
- this._eventListeners = [];
37
- this._destroy$ = new Subject();
38
- this._rowDiffer = _differs.find({}).create();
39
- }
40
- get isGroupRow() {
41
- return this.row.isGroup;
42
- }
43
- get isChildRow() {
44
- return this.row.isChild;
45
- }
46
- get isGroupFooterRow() {
47
- return this.row.isGroupFooter;
48
- }
49
- get isDragDisabled() {
50
- return !this.selected && this.reorderMultiple && !!this.selection.selectedRows.size;
51
- }
52
- get isMultipleSelection() {
53
- const multiple = this.reorderMultiple;
54
- return multiple && this.selected;
55
- }
56
- get rowCssClass() {
57
- var _a, _b, _c;
58
- let cls = 'fs-list-row';
59
- if (this.rowIndex % 2 !== 0)
60
- cls += ' fs-list-row-odd';
61
- if (this.rowIndex % 2 === 0)
62
- cls += ' fs-list-row-even';
63
- if ((_a = this.row) === null || _a === void 0 ? void 0 : _a.isGroup) {
64
- cls += ' fs-list-row-group';
65
- }
66
- else if ((_b = this.row) === null || _b === void 0 ? void 0 : _b.isChild) {
67
- cls += ' fs-list-row-group-child';
68
- }
69
- else if ((_c = this.row) === null || _c === void 0 ? void 0 : _c.isGroupFooter) {
70
- cls += ' fs-list-row-group-footer';
71
- }
72
- if (this.rowClass) {
73
- const options = {
74
- index: this.rowIndex,
75
- };
76
- if (this.row.isGroup) {
77
- options.groupIndex = this.row.index;
78
- }
79
- else if (this.row.isChild) {
80
- options.groupIndex = this.row.index;
81
- }
82
- const resultClass = this.rowClass(this.row.data, options);
83
- if (typeof resultClass === 'string') {
84
- cls += ` ${resultClass}`;
85
- }
86
- else if (typeof resultClass === 'object') {
87
- const keys = Object.keys(resultClass);
88
- for (const k of keys) {
89
- if (resultClass[k] === true)
90
- cls += ` ${k}`;
91
- }
92
- }
93
- }
94
- return cls;
95
- }
96
- get dragCellVisible() {
97
- return !this.row.isGroup;
98
- }
99
- get leftDragDropEnabled() {
100
- return this.reorderEnabled
101
- && this.reorderPosition === ReorderPosition.Left
102
- && this.activeFiltersCount == 0;
103
- }
104
- get rightDragDropEnabled() {
105
- return this.reorderEnabled
106
- && this.reorderPosition === ReorderPosition.Right
107
- && this.activeFiltersCount == 0;
108
- }
109
- ngOnInit() {
110
- this.initRowEvents();
111
- this.initSelection();
112
- if (this.row && this.row.isGroup) {
113
- if (this.row && this.row.isGroup && this.groupActionsRaw) {
114
- this.rowActions = this.groupActionsRaw.map((action) => new RowAction(action));
115
- this.filterActionsByCategories();
116
- }
117
- }
118
- else if (this.rowActionsRaw) {
119
- this.rowActions = this.rowActionsRaw.map((action) => new RowAction(action));
120
- this.filterActionsByCategories();
121
- }
122
- }
123
- ngDoCheck() {
124
- if (this._rowDiffer.diff(this.row)) {
125
- if (this.rowActions) {
126
- this.rowActions.forEach((action) => {
127
- action.checkShowStatus(this.row.data, this.rowIndex);
128
- action.updateLink(this.row.data);
129
- });
130
- this.filterActionsByCategories();
131
- }
132
- this._cdRef.markForCheck();
133
- }
134
- }
135
- ngOnDestroy() {
136
- this._eventListeners.forEach((listener) => { listener(); });
137
- this._destroy$.next();
138
- this._destroy$.complete();
139
- }
140
- /**
141
- * Select row by checkbox
142
- * @param event
143
- */
144
- selectRow(event) {
145
- this.selection.rowSelectionChange(this.row, event.checked);
146
- this._cdRef.markForCheck();
147
- }
148
- /**
149
- * Track By for improve change detection
150
- * @param index
151
- */
152
- trackByFn(index) {
153
- return index;
154
- }
155
- dragStart(event) {
156
- if (this.reorderEnabled && !this.isDragDisabled) {
157
- event.preventDefault();
158
- event.stopPropagation();
159
- this._draggableList.dragStart(this.el.nativeElement);
160
- }
161
- }
162
- /**
163
- * Set event listeners for row
164
- */
165
- initRowEvents() {
166
- for (const event in this.rowEvents) {
167
- if (this.rowEvents.hasOwnProperty(event)) {
168
- const listener = this._renderer.listen(this.el.nativeElement, event, (evt) => {
169
- // evt.preventDefault();
170
- // evt.stopPropagation();
171
- if (!this.reorderEnabled) {
172
- this.rowEvents[event]({
173
- event: evt,
174
- row: this.row.data,
175
- rowIndex: this.rowIndex
176
- });
177
- }
178
- });
179
- this._eventListeners.push(listener);
180
- }
181
- }
182
- }
183
- /**
184
- * Subscribe to selection change events
185
- */
186
- initSelection() {
187
- if (this.selection) {
188
- this.selected = this.row && this.selection.isRowSelected(this.row.data);
189
- this.selection.selectionChange$
190
- .pipe(
191
- // // Would like to respond only when checkbox on top is changed
192
- // // or was clicked "Select All" in selection dialog
193
- // filter(({type}) => {
194
- // return type === SelectionChangeType.AllVisibleSelectionChange
195
- // || type === SelectionChangeType.SelectedAll;
196
- // }),
197
- takeUntil(this._destroy$))
198
- .subscribe(() => {
199
- var _a;
200
- this.selected = this.row && this.selection.isRowSelected(this.row.data);
201
- if ((_a = this.row) === null || _a === void 0 ? void 0 : _a.isGroup) {
202
- const groupSelection = this.selection.isGroupSelected(this.row);
203
- if (groupSelection === 'indeterminate') {
204
- this.selected = true;
205
- this.indeterminateSelected = true;
206
- }
207
- else {
208
- this.selected = groupSelection;
209
- this.indeterminateSelected = false;
210
- }
211
- }
212
- this._cdRef.markForCheck();
213
- });
214
- }
215
- }
216
- filterActionsByCategories() {
217
- this.menuRowActions = [];
218
- this.inlineRowActions = [];
219
- this.restoreAction = null;
220
- this.rowActions.forEach((action) => {
221
- if (!action.isShown) {
222
- return;
223
- }
224
- if (action.menu && !action.restore) {
225
- this.menuRowActions.push(action);
226
- }
227
- else if (!action.menu && !action.restore) {
228
- this.inlineRowActions.push(action);
229
- }
230
- else if (action.restore) {
231
- this.restoreAction = action;
232
- }
233
- });
234
- }
235
- }
236
- FsRowComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsRowComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i0.KeyValueDiffers }, { token: i0.Renderer2 }, { token: i1.FsListDraggableListDirective }], target: i0.ɵɵFactoryTarget.Component });
237
- FsRowComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: FsRowComponent, selector: "[fs-list-row]", inputs: { row: "row", rowActionsRaw: "rowActionsRaw", groupActionsRaw: "groupActionsRaw", hasRowActions: "hasRowActions", rowEvents: "rowEvents", rowClass: "rowClass", restoreMode: "restoreMode", rowIndex: "rowIndex", columns: "columns", selection: "selection", rowRemoved: "rowRemoved", activeFiltersCount: "activeFiltersCount", reorderEnabled: "reorderEnabled", reorderPosition: "reorderPosition", reorderStrategy: "reorderStrategy", reorderMultiple: "reorderMultiple" }, host: { properties: { "attr.role": "this.role", "class.drag-row": "this.reorderEnabled", "class.multiple-selection": "this.isMultipleSelection", "class": "this.rowCssClass" } }, viewQueries: [{ propertyName: "cellRefs", predicate: ["td"], descendants: true }], ngImport: i0, template: "<!-- Drag -->\n<ng-container *ngIf=\"leftDragDropEnabled\">\n <ng-container *ngTemplateOutlet=\"dragCell\"></ng-container>\n</ng-container>\n\n<!-- Selection -->\n<ng-container *ngIf=\"selection && !(selection.disabled$ | async)\">\n <td class=\"fs-list-col fs-list-col-selection\">\n <ng-container *ngIf=\"!row.isGroupFooter\">\n <mat-checkbox (change)=\"selectRow($event)\"\n [checked]=\"selected\"\n [indeterminate]=\"indeterminateSelected\">\n </mat-checkbox>\n </ng-container>\n </td>\n</ng-container>\n\n<!-- Content -->\n<ng-container *ngFor=\"let column of columns; trackBy: trackByFn; let isFirst = first\">\n <td fs-cell\n *ngIf=\"(isGroupRow && !column.groupHeaderColspanned)\n || (isGroupFooterRow && !column.groupFooterColspanned)\n || (!isGroupRow && !isGroupFooterRow && !column.cellColspanned)\"\n [column]=\"column\"\n [row]=\"row\"\n [rowIndex]=\"rowIndex\"\n [class]=\"(isGroupRow && column.groupHeaderConfigs.classesString)\n || (isGroupFooterRow && column.groupFooterConfigs.classesString)\n || (!isGroupFooterRow && column.cellConfigs.classesString)\"\n [ngClass]=\"{ 'primary-col': isFirst }\"\n [attr.colspan]=\"(isGroupRow && column.groupHeaderConfigs.colspan)\n || (isGroupFooterRow && column.groupFooterConfigs.colspan)\n || column.cellConfigs.colspan\"\n [attr.width]=\"column.width\"\n >\n </td>\n</ng-container>\n\n<!-- Drag -->\n<ng-container *ngIf=\"rightDragDropEnabled\">\n <ng-container *ngTemplateOutlet=\"dragCell\"></ng-container>\n</ng-container>\n\n<!-- Row Actions -->\n<td *ngIf=\"hasRowActions && !(reorderEnabled && reorderStrategy === ReorderStrategy.Manual)\" class=\"fs-list-col row-actions\">\n <ng-container *ngIf=\"!isGroupFooterRow\">\n <fs-list-row-actions [row]=\"row\"\n [index]=\"rowIndex\"\n [rowActions]=\"rowActions\"\n [menuRowActions]=\"menuRowActions\"\n [inlineRowActions]=\"inlineRowActions\"\n [restoreAction]=\"restoreAction\"\n [restoreMode]=\"restoreMode\"\n [rowRemoved]=\"rowRemoved\"\n ></fs-list-row-actions>\n </ng-container>\n</td>\n\n<ng-template #dragCell>\n <ng-container *ngIf=\"dragCellVisible && !isGroupFooterRow; else emptyCell\">\n <td class=\"fs-list-col drag-col\"\n [class.drag-disabled]=\"isDragDisabled\"\n (mousedown)=\"dragStart($event)\"\n (touchstart)=\"dragStart($event)\"\n >\n <mat-icon>drag_handle</mat-icon>\n </td>\n </ng-container>\n <ng-template #emptyCell>\n <td class=\"fs-list-col drag-col\"></td>\n </ng-template>\n</ng-template>\n", components: [{ type: i2.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "id", "labelPosition", "name", "required", "checked", "disabled", "indeterminate", "aria-describedby", "value"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { type: i3.FsCellComponent, selector: "[fs-cell]", inputs: ["column", "row", "rowIndex"] }, { type: i4.FsRowActionsComponent, selector: "fs-list-row-actions", inputs: ["row", "index", "restoreMode", "rowActions", "rowRemoved", "menuRowActions", "inlineRowActions", "restoreAction"] }, { type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], pipes: { "async": i6.AsyncPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
238
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsRowComponent, decorators: [{
239
- type: Component,
240
- args: [{
241
- selector: '[fs-list-row]',
242
- templateUrl: 'row.component.html',
243
- changeDetection: ChangeDetectionStrategy.OnPush
244
- }]
245
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i0.KeyValueDiffers }, { type: i0.Renderer2 }, { type: i1.FsListDraggableListDirective }]; }, propDecorators: { role: [{
246
- type: HostBinding,
247
- args: ['attr.role']
248
- }], row: [{
249
- type: Input
250
- }], rowActionsRaw: [{
251
- type: Input
252
- }], groupActionsRaw: [{
253
- type: Input
254
- }], hasRowActions: [{
255
- type: Input
256
- }], rowEvents: [{
257
- type: Input
258
- }], rowClass: [{
259
- type: Input
260
- }], restoreMode: [{
261
- type: Input
262
- }], rowIndex: [{
263
- type: Input
264
- }], columns: [{
265
- type: Input
266
- }], selection: [{
267
- type: Input
268
- }], rowRemoved: [{
269
- type: Input
270
- }], activeFiltersCount: [{
271
- type: Input
272
- }], reorderEnabled: [{
273
- type: Input
274
- }, {
275
- type: HostBinding,
276
- args: ['class.drag-row']
277
- }], reorderPosition: [{
278
- type: Input
279
- }], reorderStrategy: [{
280
- type: Input
281
- }], reorderMultiple: [{
282
- type: Input
283
- }], cellRefs: [{
284
- type: ViewChildren,
285
- args: ['td']
286
- }], isMultipleSelection: [{
287
- type: HostBinding,
288
- args: ['class.multiple-selection']
289
- }], rowCssClass: [{
290
- type: HostBinding,
291
- args: ['class']
292
- }] } });
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, ElementRef, EventEmitter, KeyValueDiffers, Renderer2, Component, HostBinding, Input, ViewChildren, } from '@angular/core';
2
+ import { Subject } from 'rxjs';
3
+ import { takeUntil } from 'rxjs/operators';
4
+ import { ReorderPosition, ReorderStrategy } from '../../../classes/reorder-controller';
5
+ import { SelectionController } from '../../../classes/selection-controller';
6
+ import { RowAction } from '../../../models/row-action.model';
7
+ import { Row } from '../../../models/row';
8
+ import { FsListDraggableListDirective } from '../../../directives/draggable-list/draggable-list.directive';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "../../../directives/draggable-list/draggable-list.directive";
11
+ import * as i2 from "@angular/material/checkbox";
12
+ import * as i3 from "./cell/cell.component";
13
+ import * as i4 from "./actions/actions.component";
14
+ import * as i5 from "@angular/material/icon";
15
+ import * as i6 from "@angular/common";
16
+ export class FsRowComponent {
17
+ constructor(el, _cdRef, _differs, _renderer, _draggableList) {
18
+ this.el = el;
19
+ this._cdRef = _cdRef;
20
+ this._differs = _differs;
21
+ this._renderer = _renderer;
22
+ this._draggableList = _draggableList;
23
+ this.role = 'row';
24
+ this.rowActionsRaw = [];
25
+ this.groupActionsRaw = [];
26
+ this.hasRowActions = false;
27
+ this.rowEvents = {};
28
+ this.restoreMode = false;
29
+ this.ReorderPosition = ReorderPosition;
30
+ this.ReorderStrategy = ReorderStrategy;
31
+ this.rowActions = [];
32
+ this.menuRowActions = [];
33
+ this.inlineRowActions = [];
34
+ this.selected = false;
35
+ this.indeterminateSelected = false;
36
+ this._eventListeners = [];
37
+ this._destroy$ = new Subject();
38
+ this._rowDiffer = _differs.find({}).create();
39
+ }
40
+ get isGroupRow() {
41
+ return this.row.isGroup;
42
+ }
43
+ get isChildRow() {
44
+ return this.row.isChild;
45
+ }
46
+ get isGroupFooterRow() {
47
+ return this.row.isGroupFooter;
48
+ }
49
+ get isDragDisabled() {
50
+ return !this.selected && this.reorderMultiple && !!this.selection.selectedRows.size;
51
+ }
52
+ get isMultipleSelection() {
53
+ const multiple = this.reorderMultiple;
54
+ return multiple && this.selected;
55
+ }
56
+ get rowCssClass() {
57
+ var _a, _b, _c;
58
+ let cls = 'fs-list-row';
59
+ if (this.rowIndex % 2 !== 0)
60
+ cls += ' fs-list-row-odd';
61
+ if (this.rowIndex % 2 === 0)
62
+ cls += ' fs-list-row-even';
63
+ if ((_a = this.row) === null || _a === void 0 ? void 0 : _a.isGroup) {
64
+ cls += ' fs-list-row-group';
65
+ }
66
+ else if ((_b = this.row) === null || _b === void 0 ? void 0 : _b.isChild) {
67
+ cls += ' fs-list-row-group-child';
68
+ }
69
+ else if ((_c = this.row) === null || _c === void 0 ? void 0 : _c.isGroupFooter) {
70
+ cls += ' fs-list-row-group-footer';
71
+ }
72
+ if (this.rowClass) {
73
+ const options = {
74
+ index: this.rowIndex,
75
+ };
76
+ if (this.row.isGroup) {
77
+ options.groupIndex = this.row.index;
78
+ }
79
+ else if (this.row.isChild) {
80
+ options.groupIndex = this.row.index;
81
+ }
82
+ const resultClass = this.rowClass(this.row.data, options);
83
+ if (typeof resultClass === 'string') {
84
+ cls += ` ${resultClass}`;
85
+ }
86
+ else if (typeof resultClass === 'object') {
87
+ const keys = Object.keys(resultClass);
88
+ for (const k of keys) {
89
+ if (resultClass[k] === true)
90
+ cls += ` ${k}`;
91
+ }
92
+ }
93
+ }
94
+ return cls;
95
+ }
96
+ get dragCellVisible() {
97
+ return !this.row.isGroup;
98
+ }
99
+ get leftDragDropEnabled() {
100
+ return this.reorderEnabled
101
+ && this.reorderPosition === ReorderPosition.Left
102
+ && this.activeFiltersCount == 0;
103
+ }
104
+ get rightDragDropEnabled() {
105
+ return this.reorderEnabled
106
+ && this.reorderPosition === ReorderPosition.Right
107
+ && this.activeFiltersCount == 0;
108
+ }
109
+ ngOnInit() {
110
+ this.initRowEvents();
111
+ this.initSelection();
112
+ if (this.row && this.row.isGroup) {
113
+ if (this.row && this.row.isGroup && this.groupActionsRaw) {
114
+ this.rowActions = this.groupActionsRaw.map((action) => new RowAction(action));
115
+ this.filterActionsByCategories();
116
+ }
117
+ }
118
+ else if (this.rowActionsRaw) {
119
+ this.rowActions = this.rowActionsRaw.map((action) => new RowAction(action));
120
+ this.filterActionsByCategories();
121
+ }
122
+ }
123
+ ngDoCheck() {
124
+ if (this._rowDiffer.diff(this.row)) {
125
+ if (this.rowActions) {
126
+ this.rowActions.forEach((action) => {
127
+ action.checkShowStatus(this.row.data, this.rowIndex);
128
+ action.updateLink(this.row.data);
129
+ });
130
+ this.filterActionsByCategories();
131
+ }
132
+ this._cdRef.markForCheck();
133
+ }
134
+ }
135
+ ngOnDestroy() {
136
+ this._eventListeners.forEach((listener) => { listener(); });
137
+ this._destroy$.next();
138
+ this._destroy$.complete();
139
+ }
140
+ /**
141
+ * Select row by checkbox
142
+ * @param event
143
+ */
144
+ selectRow(event) {
145
+ this.selection.rowSelectionChange(this.row, event.checked);
146
+ this._cdRef.markForCheck();
147
+ }
148
+ /**
149
+ * Track By for improve change detection
150
+ * @param index
151
+ */
152
+ trackByFn(index) {
153
+ return index;
154
+ }
155
+ dragStart(event) {
156
+ if (this.reorderEnabled && !this.isDragDisabled) {
157
+ event.preventDefault();
158
+ event.stopPropagation();
159
+ this._draggableList.dragStart(this.el.nativeElement);
160
+ }
161
+ }
162
+ /**
163
+ * Set event listeners for row
164
+ */
165
+ initRowEvents() {
166
+ for (const event in this.rowEvents) {
167
+ if (this.rowEvents.hasOwnProperty(event)) {
168
+ const listener = this._renderer.listen(this.el.nativeElement, event, (evt) => {
169
+ // evt.preventDefault();
170
+ // evt.stopPropagation();
171
+ if (!this.reorderEnabled) {
172
+ this.rowEvents[event]({
173
+ event: evt,
174
+ row: this.row.data,
175
+ rowIndex: this.rowIndex
176
+ });
177
+ }
178
+ });
179
+ this._eventListeners.push(listener);
180
+ }
181
+ }
182
+ }
183
+ /**
184
+ * Subscribe to selection change events
185
+ */
186
+ initSelection() {
187
+ if (this.selection) {
188
+ this.selected = this.row && this.selection.isRowSelected(this.row.data);
189
+ this.selection.selectionChange$
190
+ .pipe(
191
+ // // Would like to respond only when checkbox on top is changed
192
+ // // or was clicked "Select All" in selection dialog
193
+ // filter(({type}) => {
194
+ // return type === SelectionChangeType.AllVisibleSelectionChange
195
+ // || type === SelectionChangeType.SelectedAll;
196
+ // }),
197
+ takeUntil(this._destroy$))
198
+ .subscribe(() => {
199
+ var _a;
200
+ this.selected = this.row && this.selection.isRowSelected(this.row.data);
201
+ if ((_a = this.row) === null || _a === void 0 ? void 0 : _a.isGroup) {
202
+ const groupSelection = this.selection.isGroupSelected(this.row);
203
+ if (groupSelection === 'indeterminate') {
204
+ this.selected = true;
205
+ this.indeterminateSelected = true;
206
+ }
207
+ else {
208
+ this.selected = groupSelection;
209
+ this.indeterminateSelected = false;
210
+ }
211
+ }
212
+ this._cdRef.markForCheck();
213
+ });
214
+ }
215
+ }
216
+ filterActionsByCategories() {
217
+ this.menuRowActions = [];
218
+ this.inlineRowActions = [];
219
+ this.restoreAction = null;
220
+ this.rowActions.forEach((action) => {
221
+ if (!action.isShown) {
222
+ return;
223
+ }
224
+ if (action.menu && !action.restore) {
225
+ this.menuRowActions.push(action);
226
+ }
227
+ else if (!action.menu && !action.restore) {
228
+ this.inlineRowActions.push(action);
229
+ }
230
+ else if (action.restore) {
231
+ this.restoreAction = action;
232
+ }
233
+ });
234
+ }
235
+ }
236
+ FsRowComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsRowComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i0.KeyValueDiffers }, { token: i0.Renderer2 }, { token: i1.FsListDraggableListDirective }], target: i0.ɵɵFactoryTarget.Component });
237
+ FsRowComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: FsRowComponent, selector: "[fs-list-row]", inputs: { row: "row", rowActionsRaw: "rowActionsRaw", groupActionsRaw: "groupActionsRaw", hasRowActions: "hasRowActions", rowEvents: "rowEvents", rowClass: "rowClass", restoreMode: "restoreMode", rowIndex: "rowIndex", columns: "columns", selection: "selection", rowRemoved: "rowRemoved", activeFiltersCount: "activeFiltersCount", reorderEnabled: "reorderEnabled", reorderPosition: "reorderPosition", reorderStrategy: "reorderStrategy", reorderMultiple: "reorderMultiple" }, host: { properties: { "attr.role": "this.role", "class.drag-row": "this.reorderEnabled", "class.multiple-selection": "this.isMultipleSelection", "class": "this.rowCssClass" } }, viewQueries: [{ propertyName: "cellRefs", predicate: ["td"], descendants: true }], ngImport: i0, template: "<!-- Drag -->\n<ng-container *ngIf=\"leftDragDropEnabled\">\n <ng-container *ngTemplateOutlet=\"dragCell\"></ng-container>\n</ng-container>\n\n<!-- Selection -->\n<ng-container *ngIf=\"selection && !(selection.disabled$ | async)\">\n <td class=\"fs-list-col fs-list-col-selection\">\n <ng-container *ngIf=\"!row.isGroupFooter\">\n <mat-checkbox (change)=\"selectRow($event)\"\n [checked]=\"selected\"\n [indeterminate]=\"indeterminateSelected\">\n </mat-checkbox>\n </ng-container>\n </td>\n</ng-container>\n\n<!-- Content -->\n<ng-container *ngFor=\"let column of columns; trackBy: trackByFn; let isFirst = first\">\n <td fs-cell\n *ngIf=\"(isGroupRow && !column.groupHeaderColspanned)\n || (isGroupFooterRow && !column.groupFooterColspanned)\n || (!isGroupRow && !isGroupFooterRow && !column.cellColspanned)\"\n [column]=\"column\"\n [row]=\"row\"\n [rowIndex]=\"rowIndex\"\n [class]=\"(isGroupRow && column.groupHeaderConfigs.classesString)\n || (isGroupFooterRow && column.groupFooterConfigs.classesString)\n || (!isGroupFooterRow && column.cellConfigs.classesString)\"\n [ngClass]=\"{ 'primary-col': isFirst }\"\n [attr.colspan]=\"(isGroupRow && column.groupHeaderConfigs.colspan)\n || (isGroupFooterRow && column.groupFooterConfigs.colspan)\n || column.cellConfigs.colspan\"\n [attr.width]=\"column.width\"\n >\n </td>\n</ng-container>\n\n<!-- Drag -->\n<ng-container *ngIf=\"rightDragDropEnabled\">\n <ng-container *ngTemplateOutlet=\"dragCell\"></ng-container>\n</ng-container>\n\n<!-- Row Actions -->\n<td *ngIf=\"hasRowActions && !(reorderEnabled && reorderStrategy === ReorderStrategy.Manual)\" class=\"fs-list-col row-actions\">\n <ng-container *ngIf=\"!isGroupFooterRow\">\n <fs-list-row-actions [row]=\"row\"\n [index]=\"rowIndex\"\n [rowActions]=\"rowActions\"\n [menuRowActions]=\"menuRowActions\"\n [inlineRowActions]=\"inlineRowActions\"\n [restoreAction]=\"restoreAction\"\n [restoreMode]=\"restoreMode\"\n [rowRemoved]=\"rowRemoved\"\n ></fs-list-row-actions>\n </ng-container>\n</td>\n\n<ng-template #dragCell>\n <ng-container *ngIf=\"dragCellVisible && !isGroupFooterRow; else emptyCell\">\n <td class=\"fs-list-col drag-col\"\n [class.drag-disabled]=\"isDragDisabled\"\n (mousedown)=\"dragStart($event)\"\n (touchstart)=\"dragStart($event)\"\n >\n <mat-icon>drag_handle</mat-icon>\n </td>\n </ng-container>\n <ng-template #emptyCell>\n <td class=\"fs-list-col drag-col\"></td>\n </ng-template>\n</ng-template>\n", components: [{ type: i2.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "id", "labelPosition", "name", "required", "checked", "disabled", "indeterminate", "aria-describedby", "value"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { type: i3.FsCellComponent, selector: "[fs-cell]", inputs: ["column", "row", "rowIndex"] }, { type: i4.FsRowActionsComponent, selector: "fs-list-row-actions", inputs: ["row", "index", "restoreMode", "rowActions", "rowRemoved", "menuRowActions", "inlineRowActions", "restoreAction"] }, { type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], pipes: { "async": i6.AsyncPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
238
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsRowComponent, decorators: [{
239
+ type: Component,
240
+ args: [{
241
+ selector: '[fs-list-row]',
242
+ templateUrl: 'row.component.html',
243
+ changeDetection: ChangeDetectionStrategy.OnPush
244
+ }]
245
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i0.KeyValueDiffers }, { type: i0.Renderer2 }, { type: i1.FsListDraggableListDirective }]; }, propDecorators: { role: [{
246
+ type: HostBinding,
247
+ args: ['attr.role']
248
+ }], row: [{
249
+ type: Input
250
+ }], rowActionsRaw: [{
251
+ type: Input
252
+ }], groupActionsRaw: [{
253
+ type: Input
254
+ }], hasRowActions: [{
255
+ type: Input
256
+ }], rowEvents: [{
257
+ type: Input
258
+ }], rowClass: [{
259
+ type: Input
260
+ }], restoreMode: [{
261
+ type: Input
262
+ }], rowIndex: [{
263
+ type: Input
264
+ }], columns: [{
265
+ type: Input
266
+ }], selection: [{
267
+ type: Input
268
+ }], rowRemoved: [{
269
+ type: Input
270
+ }], activeFiltersCount: [{
271
+ type: Input
272
+ }], reorderEnabled: [{
273
+ type: Input
274
+ }, {
275
+ type: HostBinding,
276
+ args: ['class.drag-row']
277
+ }], reorderPosition: [{
278
+ type: Input
279
+ }], reorderStrategy: [{
280
+ type: Input
281
+ }], reorderMultiple: [{
282
+ type: Input
283
+ }], cellRefs: [{
284
+ type: ViewChildren,
285
+ args: ['td']
286
+ }], isMultipleSelection: [{
287
+ type: HostBinding,
288
+ args: ['class.multiple-selection']
289
+ }], rowCssClass: [{
290
+ type: HostBinding,
291
+ args: ['class']
292
+ }] } });
293
293
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm93LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9ib2R5L3Jvdy9yb3cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb21wb25lbnRzL2JvZHkvcm93L3Jvdy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixVQUFVLEVBQ1YsWUFBWSxFQUNaLGVBQWUsRUFDZixTQUFTLEVBQ1QsU0FBUyxFQUVULFdBQVcsRUFDWCxLQUFLLEVBSUwsWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRzNDLE9BQU8sRUFFTCxlQUFlLEVBQ2YsZUFBZSxFQUNoQixNQUFNLHFDQUFxQyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUM3RCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDMUMsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sNkRBQTZELENBQUM7Ozs7Ozs7O0FBUTNHLE1BQU0sT0FBTyxjQUFjO0lBbUR6QixZQUNTLEVBQWMsRUFDYixNQUF5QixFQUN6QixRQUF5QixFQUN6QixTQUFvQixFQUNwQixjQUE0QztRQUo3QyxPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQ2IsV0FBTSxHQUFOLE1BQU0sQ0FBbUI7UUFDekIsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7UUFDekIsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUNwQixtQkFBYyxHQUFkLGNBQWMsQ0FBOEI7UUFy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QUFhO3NCQUE1QixLQUFLO2dCQUNVLGVBQWU7c0JBQTlCLEtBQUs7Z0JBQ1UsYUFBYTtzQkFBNUIsS0FBSztnQkFDVSxTQUFTO3NCQUF4QixLQUFLO2dCQUNVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBQ1UsV0FBVztzQkFBMUIsS0FBSztnQkFFVSxRQUFRO3NCQUF2QixLQUFLO2dCQUNVLE9BQU87c0JBQXRCLEtBQUs7Z0JBQ1UsU0FBUztzQkFBeEIsS0FBSztnQkFFVSxVQUFVO3NCQUF6QixLQUFLO2dCQUVHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFJQyxjQUFjO3NCQUZwQixLQUFLOztzQkFDTCxXQUFXO3VCQUFDLGdCQUFnQjtnQkFHcEIsZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBSUMsUUFBUTtzQkFEZCxZQUFZO3VCQUFDLElBQUk7Z0JBZ0RkLG1CQUFtQjtzQkFEdEIsV0FBVzt1QkFBQywwQkFBMEI7Z0JBUW5DLFdBQVc7c0JBRGQsV0FBVzt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEtleVZhbHVlRGlmZmVycyxcbiAgUmVuZGVyZXIyLFxuICBDb21wb25lbnQsXG4gIERvQ2hlY2ssXG4gIEhvc3RCaW5kaW5nLFxuICBJbnB1dCxcbiAgS2V5VmFsdWVEaWZmZXIsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBWaWV3Q2hpbGRyZW4sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0Q2hlY2tib3hDaGFuZ2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XG5cbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgQ29sdW1uIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2NvbHVtbi5tb2RlbCc7XG5pbXBvcnQge1xuICBSZW9yZGVyQ29udHJvbGxlcixcbiAgUmVvcmRlclBvc2l0aW9uLFxuICBSZW9yZGVyU3RyYXRlZ3lcbn0gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy9yZW9yZGVyLWNvbnRyb2xsZXInO1xuaW1wb3J0IHsgU2VsZWN0aW9uQ29udHJvbGxlciB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvc2VsZWN0aW9uLWNvbnRyb2xsZXInO1xuaW1wb3J0IHsgUm93QWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3Jvdy1hY3Rpb24ubW9kZWwnO1xuaW1wb3J0IHsgUm93IH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3Jvdyc7XG5pbXBvcnQgeyBGc0xpc3REcmFnZ2FibGVMaXN0RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlcy9kcmFnZ2FibGUtbGlzdC9kcmFnZ2FibGUtbGlzdC5kaXJlY3RpdmUnO1xuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ1tmcy1saXN0LXJvd10nLFxuICB0ZW1wbGF0ZVVybDogJ3Jvdy5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIEZzUm93Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBEb0NoZWNrLCBPbkRlc3Ryb3kge1xuXG4gIEBIb3N0QmluZGluZygnYXR0ci5yb2xlJylcbiAgcHVibGljIHJvbGUgPSAncm93JztcblxuICBASW5wdXQoKSBwdWJsaWMgcm93OiBSb3c7XG4gIEBJbnB1dCgpIHB1YmxpYyByb3dBY3Rpb25zUmF3OiBhbnkgW10gPSBbXTtcbiAgQElucHV0KCkgcHVibGljIGdyb3VwQWN0aW9uc1JhdzogYW55IFtdID0gW107XG4gIEBJbnB1dCgpIHB1YmxpYyBoYXNSb3dBY3Rpb25zID0gZmFsc2U7XG4gIEBJbnB1dCgpIHB1YmxpYyByb3dFdmVudHMgPSB7fTtcbiAgQElucHV0KCkgcHVibGljIHJvd0NsYXNzO1xuICBASW5wdXQoKSBwdWJsaWMgcmVzdG9yZU1vZGUgPSBmYWxzZTtcblxuICBASW5wdXQoKSBwdWJsaWMgcm93SW5kZXg6IG51bWJlcjtcbiAgQElucHV0KCkgcHVibGljIGNvbHVtbnM6IENvbHVtbltdO1xuICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0aW9uOiBTZWxlY3Rpb25Db250cm9sbGVyO1xuXG4gIEBJbnB1dCgpIHB1YmxpYyByb3dSZW1vdmVkOiBFdmVudEVtaXR0ZXI8YW55PjtcblxuICBASW5wdXQoKSBhY3RpdmVGaWx0ZXJzQ291bnQ6IG51bWJlcjtcblxuICBASW5wdXQoKVxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmRyYWctcm93JylcbiAgcHVibGljIHJlb3JkZXJFbmFibGVkOiBib29sZWFuO1xuXG4gIEBJbnB1dCgpIHJlb3JkZXJQb3NpdGlvbjogUmVvcmRlclBvc2l0aW9uIHwgbnVsbDtcbiAgQElucHV0KCkgcmVvcmRlclN0cmF0ZWd5OiBSZW9yZGVyU3RyYXRlZ3kgfCBudWxsO1xuICBASW5wdXQoKSByZW9yZGVyTXVsdGlwbGU6IGJvb2xlYW47XG5cblxuICBAVmlld0NoaWxkcmVuKCd0ZCcpXG4gIHB1YmxpYyBjZWxsUmVmcztcblxuICBwdWJsaWMgcmVhZG9ubHkgUmVvcmRlclBvc2l0aW9uID0gUmVvcmRlclBvc2l0aW9uO1xuICBwdWJsaWMgcmVhZG9ubHkgUmVvcmRlclN0cmF0ZWd5ID0gUmVvcmRlclN0cmF0ZWd5O1xuXG4gIHB1YmxpYyByb3dBY3Rpb25zOiBSb3dBY3Rpb25bXSA9IFtdO1xuXG4gIHB1YmxpYyBtZW51Um93QWN0aW9uczogUm93QWN0aW9uW10gPSBbXTtcbiAgcHVibGljIGlubGluZVJvd0FjdGlvbnM6IFJvd0FjdGlvbltdID0gW107XG4gIHB1YmxpYyByZXN0b3JlQWN0aW9uOiBSb3dBY3Rpb247XG5cbiAgcHVibGljIHNlbGVjdGVkID0gZmFsc2U7XG4gIHB1YmxpYyBpbmRldGVybWluYXRlU2VsZWN0ZWQ6IGJvb2xlYW4gfCAnaW5kZXRlcm1pbmF0ZScgPSBmYWxzZTtcblxuICBwcml2YXRlIF9yb3dEaWZmZXI6IEtleVZhbHVlRGlmZmVyPGFueSwgYW55PjtcblxuICBwcml2YXRlIF9ldmVudExpc3RlbmVycyA9IFtdO1xuXG4gIHByaXZhdGUgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZWw6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBfY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgX2RpZmZlcnM6IEtleVZhbHVlRGlmZmVycyxcbiAgICBwcml2YXRlIF9yZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgX2RyYWdnYWJsZUxpc3Q6IEZzTGlzdERyYWdnYWJsZUxpc3REaXJlY3RpdmUsXG4gICkge1xuICAgIHRoaXMuX3Jvd0RpZmZlciA9IF9kaWZmZXJzLmZpbmQoe30pLmNyZWF0ZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0dyb3VwUm93KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJvdy5pc0dyb3VwO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0NoaWxkUm93KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJvdy5pc0NoaWxkO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0dyb3VwRm9vdGVyUm93KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJvdy5pc0dyb3VwRm9vdGVyO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0RyYWdEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuc2VsZWN0ZWQgJiYgdGhpcy5yZW9yZGVyTXVsdGlwbGUgJiYgISF0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZFJvd3Muc2l6ZTtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnY2xhc3MubXVsdGlwbGUtc2VsZWN0aW9uJylcbiAgZ2V0IGlzTXVsdGlwbGVTZWxlY3Rpb24oKSB7XG4gICAgY29uc3QgbXVsdGlwbGUgPSB0aGlzLnJlb3JkZXJNdWx0aXBsZTtcblxuICAgIHJldHVybiBtdWx0aXBsZSAmJiB0aGlzLnNlbGVjdGVkO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcycpXG4gIGdldCByb3dDc3NDbGFzcygpIHtcbiAgICBsZXQgY2xzID0gJ2ZzLWxpc3Qtcm93JztcblxuICAgIGlmICh0aGlzLnJvd0luZGV4ICUgMiAhPT0gMCkgY2xzICs9ICcgZnMtbGlzdC1yb3ctb2RkJztcbiAgICBpZiAodGhpcy5yb3dJbmRleCAlIDIgPT09IDApIGNscyArPSAnIGZzLWxpc3Qtcm93LWV2ZW4nO1xuXG4gICAgaWYgKHRoaXMucm93Py5pc0dyb3VwKSB7XG4gICAgICBjbHMgKz0gJyBmcy1saXN0LXJvdy1ncm91cCc7XG4gICAgfSBlbHNlIGlmICh0aGlzLnJvdz8uaXNDaGlsZCkge1xuICAgICAgY2xzICs9ICcgZnMtbGlzdC1yb3ctZ3JvdXAtY2hpbGQnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5yb3c/LmlzR3JvdXBGb290ZXIpIHtcbiAgICAgIGNscyArPSAnIGZzLWxpc3Qtcm93LWdyb3VwLWZvb3Rlcic7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucm93Q2xhc3MpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnM6IGFueSA9IHtcbiAgICAgICAgaW5kZXg6IHRoaXMucm93SW5kZXgsXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5yb3cuaXNHcm91cCkge1xuICAgICAgICBvcHRpb25zLmdyb3VwSW5kZXggPSB0aGlzLnJvdy5pbmRleDtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5yb3cuaXNDaGlsZCkge1xuICAgICAgICBvcHRpb25zLmdyb3VwSW5kZXggPSB0aGlzLnJvdy5pbmRleDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0Q2xhc3MgPSB0aGlzLnJvd0NsYXNzKHRoaXMucm93LmRhdGEsIG9wdGlvbnMpO1xuXG4gICAgICBpZiAodHlwZW9mIHJlc3VsdENsYXNzID09PSAnc3RyaW5nJykge1xuICAgICAgICBjbHMgKz0gYCAke3Jlc3VsdENsYXNzfWA7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZXN1bHRDbGFzcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHJlc3VsdENsYXNzKTtcbiAgICAgICAgZm9yIChjb25zdCBrIG9mIGtleXMpIHtcbiAgICAgICAgICBpZiAocmVzdWx0Q2xhc3Nba10gPT09IHRydWUpIGNscyArPSBgICR7a31gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNscztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZHJhZ0NlbGxWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5yb3cuaXNHcm91cDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbGVmdERyYWdEcm9wRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZW9yZGVyRW5hYmxlZFxuICAgICAgJiYgdGhpcy5yZW9yZGVyUG9zaXRpb24gPT09IFJlb3JkZXJQb3NpdGlvbi5MZWZ0XG4gICAgICAmJiB0aGlzLmFjdGl2ZUZpbHRlcnNDb3VudCA9PSAwXG4gIH1cblxuICBwdWJsaWMgZ2V0IHJpZ2h0RHJhZ0Ryb3BFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlb3JkZXJFbmFibGVkXG4gICAgICAmJiB0aGlzLnJlb3JkZXJQb3NpdGlvbiA9PT0gUmVvcmRlclBvc2l0aW9uLlJpZ2h0XG4gICAgICAmJiB0aGlzLmFjdGl2ZUZpbHRlcnNDb3VudCA9PSAwXG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5pbml0Um93RXZlbnRzKCk7XG4gICAgdGhpcy5pbml0U2VsZWN0aW9uKCk7XG5cbiAgICBpZiAodGhpcy5yb3cgJiYgdGhpcy5yb3cuaXNHcm91cCkge1xuICAgICAgaWYgKHRoaXMucm93ICYmIHRoaXMucm93LmlzR3JvdXAgJiYgdGhpcy5ncm91cEFjdGlvbnNSYXcpIHtcbiAgICAgICAgdGhpcy5yb3dBY3Rpb25zID0gdGhpcy5ncm91cEFjdGlvbnNSYXcubWFwKChhY3Rpb24pID0+IG5ldyBSb3dBY3Rpb24oYWN0aW9uKSk7XG5cbiAgICAgICAgdGhpcy5maWx0ZXJBY3Rpb25zQnlDYXRlZ29yaWVzKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLnJvd0FjdGlvbnNSYXcpIHtcbiAgICAgIHRoaXMucm93QWN0aW9ucyA9IHRoaXMucm93QWN0aW9uc1Jhdy5tYXAoKGFjdGlvbikgPT4gbmV3IFJvd0FjdGlvbihhY3Rpb24pKTtcblxuICAgICAgdGhpcy5maWx0ZXJBY3Rpb25zQnlDYXRlZ29yaWVzKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nRG9DaGVjaygpIHtcbiAgICBpZiAodGhpcy5fcm93RGlmZmVyLmRpZmYodGhpcy5yb3cpKSB7XG4gICAgICBpZiAodGhpcy5yb3dBY3Rpb25zKSB7XG4gICAgICAgIHRoaXMucm93QWN0aW9ucy5mb3JFYWNoKChhY3Rpb24pID0+IHtcbiAgICAgICAgICBhY3Rpb24uY2hlY2tTaG93U3RhdHVzKHRoaXMucm93LmRhdGEsIHRoaXMucm93SW5kZXgpO1xuICAgICAgICAgIGFjdGlvbi51cGRhdGVMaW5rKHRoaXMucm93LmRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5maWx0ZXJBY3Rpb25zQnlDYXRlZ29yaWVzKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9ldmVudExpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4geyBsaXN0ZW5lcigpIH0pO1xuXG4gICAgdGhpcy5fZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0IHJvdyBieSBjaGVja2JveFxuICAgKiBAcGFyYW0gZXZlbnRcbiAgICovXG4gIHB1YmxpYyBzZWxlY3RSb3coZXZlbnQ6IE1hdENoZWNrYm94Q2hhbmdlKSB7XG4gICAgdGhpcy5zZWxlY3Rpb24ucm93U2VsZWN0aW9uQ2hhbmdlKHRoaXMucm93LCBldmVudC5jaGVja2VkKTtcbiAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFjayBCeSBmb3IgaW1wcm92ZSBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAqIEBwYXJhbSBpbmRleFxuICAgKi9cbiAgcHVibGljIHRyYWNrQnlGbihpbmRleCkge1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIHB1YmxpYyBkcmFnU3RhcnQoZXZlbnQpIHtcbiAgICBpZiAodGhpcy5yZW9yZGVyRW5hYmxlZCAmJiAhdGhpcy5pc0RyYWdEaXNhYmxlZCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICB0aGlzLl9kcmFnZ2FibGVMaXN0LmRyYWdTdGFydCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZXZlbnQgbGlzdGVuZXJzIGZvciByb3dcbiAgICovXG4gIHByaXZhdGUgaW5pdFJvd0V2ZW50cygpIHtcbiAgICBmb3IgKGNvbnN0IGV2ZW50IGluIHRoaXMucm93RXZlbnRzKSB7XG4gICAgICBpZiAodGhpcy5yb3dFdmVudHMuaGFzT3duUHJvcGVydHkoZXZlbnQpKSB7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVyID0gdGhpcy5fcmVuZGVyZXIubGlzdGVuKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgZXZlbnQsIChldnQpID0+IHtcbiAgICAgICAgICAvLyBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAvLyBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgICBpZiAoIXRoaXMucmVvcmRlckVuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMucm93RXZlbnRzW2V2ZW50XSh7XG4gICAgICAgICAgICAgIGV2ZW50OiBldnQsXG4gICAgICAgICAgICAgIHJvdzogdGhpcy5yb3cuZGF0YSxcbiAgICAgICAgICAgICAgcm93SW5kZXg6IHRoaXMucm93SW5kZXhcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fZXZlbnRMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSB0byBzZWxlY3Rpb24gY2hhbmdlIGV2ZW50c1xuICAgKi9cbiAgcHJpdmF0ZSBpbml0U2VsZWN0aW9uKCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMucm93ICYmIHRoaXMuc2VsZWN0aW9uLmlzUm93U2VsZWN0ZWQodGhpcy5yb3cuZGF0YSk7XG5cbiAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdGlvbkNoYW5nZSRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgLy8gLy8gV291bGQgbGlrZSB0byByZXNwb25kIG9ubHkgd2hlbiBjaGVja2JveCBvbiB0b3AgaXMgY2hhbmdlZFxuICAgICAgICAgIC8vIC8vIG9yIHdhcyBjbGlja2VkIFwiU2VsZWN0IEFsbFwiIGluIHNlbGVjdGlvbiBkaWFsb2dcbiAgICAgICAgICAvLyBmaWx0ZXIoKHt0eXBlfSkgPT4ge1xuICAgICAgICAgIC8vICAgcmV0dXJuIHR5cGUgPT09IFNlbGVjdGlvbkNoYW5nZVR5cGUuQWxsVmlzaWJsZVNlbGVjdGlvbkNoYW5nZVxuICAgICAgICAgIC8vICAgICB8fCB0eXBlID09PSBTZWxlY3Rpb25DaGFuZ2VUeXBlLlNlbGVjdGVkQWxsO1xuICAgICAgICAgIC8vIH0pLFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMucm93ICYmIHRoaXMuc2VsZWN0aW9uLmlzUm93U2VsZWN0ZWQodGhpcy5yb3cuZGF0YSk7XG5cbiAgICAgICAgICBpZiAodGhpcy5yb3c/LmlzR3JvdXApIHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwU2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb24uaXNHcm91cFNlbGVjdGVkKHRoaXMucm93KTtcblxuICAgICAgICAgICAgaWYgKGdyb3VwU2VsZWN0aW9uID09PSAnaW5kZXRlcm1pbmF0ZScpIHtcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgIHRoaXMuaW5kZXRlcm1pbmF0ZVNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBncm91cFNlbGVjdGlvbjtcbiAgICAgICAgICAgICAgdGhpcy5pbmRldGVybWluYXRlU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmaWx0ZXJBY3Rpb25zQnlDYXRlZ29yaWVzKCkge1xuICAgIHRoaXMubWVudVJvd0FjdGlvbnMgPSBbXTtcbiAgICB0aGlzLmlubGluZVJvd0FjdGlvbnMgPSBbXTtcbiAgICB0aGlzLnJlc3RvcmVBY3Rpb24gPSBudWxsO1xuXG4gICAgdGhpcy5yb3dBY3Rpb25zLmZvckVhY2goKGFjdGlvbikgPT4ge1xuXG4gICAgICBpZiAoIWFjdGlvbi5pc1Nob3duKSB7IHJldHVybiB9XG5cbiAgICAgIGlmIChhY3Rpb24ubWVudSAmJiAhYWN0aW9uLnJlc3RvcmUpIHtcbiAgICAgICAgdGhpcy5tZW51Um93QWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gICAgICB9IGVsc2UgaWYgKCFhY3Rpb24ubWVudSAmJiAhYWN0aW9uLnJlc3RvcmUpIHtcbiAgICAgICAgdGhpcy5pbmxpbmVSb3dBY3Rpb25zLnB1c2goYWN0aW9uKTtcbiAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLnJlc3RvcmUpIHtcbiAgICAgICAgdGhpcy5yZXN0b3JlQWN0aW9uID0gYWN0aW9uO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iLCI8IS0tIERyYWcgLS0+XG48bmctY29udGFpbmVyICpuZ0lmPVwibGVmdERyYWdEcm9wRW5hYmxlZFwiPlxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZHJhZ0NlbGxcIj48L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuXG48IS0tIFNlbGVjdGlvbiAtLT5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3Rpb24gJiYgIShzZWxlY3Rpb24uZGlzYWJsZWQkIHwgYXN5bmMpXCI+XG4gIDx0ZCBjbGFzcz1cImZzLWxpc3QtY29sIGZzLWxpc3QtY29sLXNlbGVjdGlvblwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhcm93LmlzR3JvdXBGb290ZXJcIj5cbiAgICAgIDxtYXQtY2hlY2tib3ggKGNoYW5nZSk9XCJzZWxlY3RSb3coJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwiaW5kZXRlcm1pbmF0ZVNlbGVjdGVkXCI+XG4gICAgICA8L21hdC1jaGVja2JveD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC90ZD5cbjwvbmctY29udGFpbmVyPlxuXG48IS0tIENvbnRlbnQgLS0+XG48bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uczsgdHJhY2tCeTogdHJhY2tCeUZuOyBsZXQgaXNGaXJzdCA9IGZpcnN0XCI+XG4gIDx0ZCBmcy1jZWxsXG4gICAgICAqbmdJZj1cIihpc0dyb3VwUm93ICYmICFjb2x1bW4uZ3JvdXBIZWFkZXJDb2xzcGFubmVkKVxuICAgICAgICB8fCAoaXNHcm91cEZvb3RlclJvdyAmJiAhY29sdW1uLmdyb3VwRm9vdGVyQ29sc3Bhbm5lZClcbiAgICAgICAgfHwgKCFpc0dyb3VwUm93ICYmICFpc0dyb3VwRm9vdGVyUm93ICYmICFjb2x1bW4uY2VsbENvbHNwYW5uZWQpXCJcbiAgICAgIFtjb2x1bW5dPVwiY29sdW1uXCJcbiAgICAgIFtyb3ddPVwicm93XCJcbiAgICAgIFtyb3dJbmRleF09XCJyb3dJbmRleFwiXG4gICAgICBbY2xhc3NdPVwiKGlzR3JvdXBSb3cgJiYgY29sdW1uLmdyb3VwSGVhZGVyQ29uZmlncy5jbGFzc2VzU3RyaW5nKVxuICAgICAgICB8fCAoaXNHcm91cEZvb3RlclJvdyAmJiBjb2x1bW4uZ3JvdXBGb290ZXJDb25maWdzLmNsYXNzZXNTdHJpbmcpXG4gICAgICAgIHx8ICghaXNHcm91cEZvb3RlclJvdyAmJiBjb2x1bW4uY2VsbENvbmZpZ3MuY2xhc3Nlc1N0cmluZylcIlxuICAgICAgW25nQ2xhc3NdPVwieyAncHJpbWFyeS1jb2wnOiBpc0ZpcnN0IH1cIlxuICAgICAgW2F0dHIuY29sc3Bhbl09XCIoaXNHcm91cFJvdyAmJiBjb2x1bW4uZ3JvdXBIZWFkZXJDb25maWdzLmNvbHNwYW4pXG4gICAgICAgIHx8IChpc0dyb3VwRm9vdGVyUm93ICYmIGNvbHVtbi5ncm91cEZvb3RlckNvbmZpZ3MuY29sc3BhbilcbiAgICAgICAgfHwgY29sdW1uLmNlbGxDb25maWdzLmNvbHNwYW5cIlxuICAgICAgW2F0dHIud2lkdGhdPVwiY29sdW1uLndpZHRoXCJcbiAgPlxuICA8L3RkPlxuPC9uZy1jb250YWluZXI+XG5cbjwhLS0gRHJhZyAtLT5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJyaWdodERyYWdEcm9wRW5hYmxlZFwiPlxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZHJhZ0NlbGxcIj48L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuXG48IS0tIFJvdyBBY3Rpb25zIC0tPlxuPHRkICpuZ0lmPVwiaGFzUm93QWN0aW9ucyAmJiAhKHJlb3JkZXJFbmFibGVkICYmIHJlb3JkZXJTdHJhdGVneSA9PT0gUmVvcmRlclN0cmF0ZWd5Lk1hbnVhbClcIiBjbGFzcz1cImZzLWxpc3QtY29sIHJvdy1hY3Rpb25zXCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNHcm91cEZvb3RlclJvd1wiPlxuICAgIDxmcy1saXN0LXJvdy1hY3Rpb25zIFtyb3ddPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbaW5kZXhdPVwicm93SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dBY3Rpb25zXT1cInJvd0FjdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIFttZW51Um93QWN0aW9uc109XCJtZW51Um93QWN0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2lubGluZVJvd0FjdGlvbnNdPVwiaW5saW5lUm93QWN0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc3RvcmVBY3Rpb25dPVwicmVzdG9yZUFjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc3RvcmVNb2RlXT1cInJlc3RvcmVNb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbcm93UmVtb3ZlZF09XCJyb3dSZW1vdmVkXCJcbiAgICA+PC9mcy1saXN0LXJvdy1hY3Rpb25zPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvdGQ+XG5cbjxuZy10ZW1wbGF0ZSAjZHJhZ0NlbGw+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJkcmFnQ2VsbFZpc2libGUgJiYgIWlzR3JvdXBGb290ZXJSb3c7IGVsc2UgZW1wdHlDZWxsXCI+XG4gICAgPHRkIGNsYXNzPVwiZnMtbGlzdC1jb2wgZHJhZy1jb2xcIlxuICAgICAgICBbY2xhc3MuZHJhZy1kaXNhYmxlZF09XCJpc0RyYWdEaXNhYmxlZFwiXG4gICAgICAgIChtb3VzZWRvd24pPVwiZHJhZ1N0YXJ0KCRldmVudClcIlxuICAgICAgICAodG91Y2hzdGFydCk9XCJkcmFnU3RhcnQoJGV2ZW50KVwiXG4gICAgPlxuICAgICAgPG1hdC1pY29uPmRyYWdfaGFuZGxlPC9tYXQtaWNvbj5cbiAgICA8L3RkPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPG5nLXRlbXBsYXRlICNlbXB0eUNlbGw+XG4gICAgPHRkIGNsYXNzPVwiZnMtbGlzdC1jb2wgZHJhZy1jb2xcIj48L3RkPlxuICA8L25nLXRlbXBsYXRlPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==