@firestitch/list 15.0.0 → 17.0.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 (156) hide show
  1. package/app/components/body/body.component.d.ts +1 -1
  2. package/app/components/body/row/actions/actions.component.d.ts +1 -1
  3. package/app/components/body/row/cell/cell.component.d.ts +1 -1
  4. package/app/components/body/row/inline-action/inline-action.component.d.ts +1 -1
  5. package/app/components/body/row/menu-action/menu-action.component.d.ts +1 -1
  6. package/app/components/body/row/row.component.d.ts +1 -1
  7. package/app/components/footer/footer-row/footer-row.component.d.ts +1 -7
  8. package/app/components/footer/footer.component.d.ts +1 -1
  9. package/app/components/head/head.component.d.ts +1 -1
  10. package/app/components/list/list.component.d.ts +1 -1
  11. package/app/components/loader/loader.component.d.ts +1 -1
  12. package/app/components/pagination/pagination.component.d.ts +1 -1
  13. package/app/components/status/status.component.d.ts +1 -1
  14. package/app/directives/cell/cell.directive.d.ts +1 -1
  15. package/app/directives/column/column.directive.d.ts +1 -1
  16. package/app/directives/content-init/content-init.directive.d.ts +1 -1
  17. package/app/directives/draggable-list/draggable-list.directive.d.ts +1 -1
  18. package/app/directives/draggable-row/draggable-row.directive.d.ts +1 -1
  19. package/app/directives/footer/footer.directive.d.ts +1 -1
  20. package/app/directives/group-expand-trigger/group-expand-trigger.directive.d.ts +1 -1
  21. package/app/directives/header/header.directive.d.ts +1 -1
  22. package/app/models/column.model.d.ts +1 -1
  23. package/esm2022/app/classes/actions-controller.mjs +57 -0
  24. package/esm2022/app/classes/columns-controller.mjs +211 -0
  25. package/esm2022/app/classes/data-controller.mjs +348 -0
  26. package/esm2022/app/classes/external-params-controller.mjs +153 -0
  27. package/{esm2020 → esm2022}/app/classes/index.mjs +1 -1
  28. package/esm2022/app/classes/list-controller.mjs +712 -0
  29. package/esm2022/app/classes/pagination-controller.mjs +491 -0
  30. package/esm2022/app/classes/persistance-controller.mjs +19 -0
  31. package/esm2022/app/classes/reorder-controller.mjs +191 -0
  32. package/esm2022/app/classes/selection-controller.mjs +473 -0
  33. package/esm2022/app/classes/sorting-controller.mjs +207 -0
  34. package/esm2022/app/components/body/body.component.mjs +73 -0
  35. package/esm2022/app/components/body/row/actions/actions.component.mjs +102 -0
  36. package/esm2022/app/components/body/row/cell/cell.component.mjs +109 -0
  37. package/esm2022/app/components/body/row/inline-action/inline-action.component.mjs +32 -0
  38. package/esm2022/app/components/body/row/menu-action/menu-action.component.mjs +51 -0
  39. package/esm2022/app/components/body/row/row.component.mjs +341 -0
  40. package/esm2022/app/components/customize-cols/customize-cols.component.mjs +70 -0
  41. package/esm2022/app/components/footer/footer-row/footer-cell/footer-cell.component.mjs +16 -0
  42. package/esm2022/app/components/footer/footer-row/footer-row.component.mjs +17 -0
  43. package/esm2022/app/components/footer/footer.component.mjs +35 -0
  44. package/esm2022/app/components/head/head-cell/head-cell.component.mjs +32 -0
  45. package/esm2022/app/components/head/head.component.mjs +113 -0
  46. package/esm2022/app/components/list/list.component.mjs +407 -0
  47. package/esm2022/app/components/loader/loader.component.mjs +40 -0
  48. package/esm2022/app/components/manage-saved-filters/manage-saved-filters.component.mjs +78 -0
  49. package/esm2022/app/components/pagination/pagination.component.mjs +40 -0
  50. package/esm2022/app/components/saved-filters/saved-filters.component.mjs +32 -0
  51. package/esm2022/app/components/status/status.component.mjs +69 -0
  52. package/esm2022/app/directives/cell/cell.directive.mjs +21 -0
  53. package/esm2022/app/directives/column/column.directive.mjs +137 -0
  54. package/{esm2020 → esm2022}/app/directives/content/content.directive.mjs +4 -4
  55. package/esm2022/app/directives/content-init/content-init.directive.mjs +23 -0
  56. package/esm2022/app/directives/draggable-list/draggable-list.directive.mjs +344 -0
  57. package/esm2022/app/directives/draggable-row/draggable-row.directive.mjs +83 -0
  58. package/esm2022/app/directives/empty-state/empty-state.directive.mjs +13 -0
  59. package/esm2022/app/directives/footer/footer.directive.mjs +21 -0
  60. package/esm2022/app/directives/group-expand-trigger/group-expand-trigger.directive.mjs +28 -0
  61. package/{esm2020 → esm2022}/app/directives/group-footer/group-footer.directive.mjs +4 -4
  62. package/{esm2020 → esm2022}/app/directives/group-header/group-header.directive.mjs +4 -4
  63. package/esm2022/app/directives/header/header.directive.mjs +21 -0
  64. package/esm2022/app/directives/heading/heading.directive.mjs +13 -0
  65. package/{esm2020 → esm2022}/app/directives/heading-container/heading-container.directive.mjs +4 -4
  66. package/{esm2020 → esm2022}/app/directives/index.mjs +1 -1
  67. package/esm2022/app/directives/subheading/subheading.directive.mjs +13 -0
  68. package/{esm2020 → esm2022}/app/enums/page-change-type.enum.mjs +1 -1
  69. package/{esm2020 → esm2022}/app/enums/pagination-strategy.enum.mjs +1 -1
  70. package/{esm2020 → esm2022}/app/enums/state.enum.mjs +1 -1
  71. package/{esm2020 → esm2022}/app/fs-list.module.mjs +89 -89
  72. package/{esm2020 → esm2022}/app/fs-list.providers.mjs +1 -1
  73. package/{esm2020 → esm2022}/app/interfaces/cellconfig.interface.mjs +1 -1
  74. package/{esm2020 → esm2022}/app/interfaces/draggable-list.interface.mjs +1 -1
  75. package/esm2022/app/interfaces/external-params.interface.mjs +2 -0
  76. package/{esm2020 → esm2022}/app/interfaces/index.mjs +1 -1
  77. package/esm2022/app/interfaces/pagination.interface.mjs +2 -0
  78. package/{esm2020 → esm2022}/app/interfaces/sorting-change-event.interface.mjs +1 -1
  79. package/{esm2020 → esm2022}/app/models/column-async-attribute.mjs +1 -1
  80. package/esm2022/app/models/column-attributes.mjs +139 -0
  81. package/esm2022/app/models/column.model.mjs +173 -0
  82. package/esm2022/app/models/row/base-row.mjs +25 -0
  83. package/esm2022/app/models/row/child-row.mjs +29 -0
  84. package/esm2022/app/models/row/group-footer-row.mjs +22 -0
  85. package/esm2022/app/models/row/group-row.mjs +45 -0
  86. package/{esm2020 → esm2022}/app/models/row/simple-row.mjs +1 -1
  87. package/esm2022/app/models/row-action.model.mjs +102 -0
  88. package/esm2022/app/models/row.mjs +90 -0
  89. package/esm2022/app/models/styleConfig.model.mjs +78 -0
  90. package/esm2022/app/pipes/action-label.mjs +17 -0
  91. package/{esm2020 → esm2022}/app/services/group-expand-notifier.service.mjs +7 -9
  92. package/{fesm2020 → fesm2022}/firestitch-list.mjs +731 -497
  93. package/fesm2022/firestitch-list.mjs.map +1 -0
  94. package/package.json +5 -11
  95. package/esm2020/app/classes/actions-controller.mjs +0 -55
  96. package/esm2020/app/classes/columns-controller.mjs +0 -206
  97. package/esm2020/app/classes/data-controller.mjs +0 -345
  98. package/esm2020/app/classes/external-params-controller.mjs +0 -147
  99. package/esm2020/app/classes/list-controller.mjs +0 -674
  100. package/esm2020/app/classes/pagination-controller.mjs +0 -491
  101. package/esm2020/app/classes/persistance-controller.mjs +0 -19
  102. package/esm2020/app/classes/reorder-controller.mjs +0 -182
  103. package/esm2020/app/classes/selection-controller.mjs +0 -466
  104. package/esm2020/app/classes/sorting-controller.mjs +0 -206
  105. package/esm2020/app/components/body/body.component.mjs +0 -64
  106. package/esm2020/app/components/body/row/actions/actions.component.mjs +0 -97
  107. package/esm2020/app/components/body/row/cell/cell.component.mjs +0 -107
  108. package/esm2020/app/components/body/row/inline-action/inline-action.component.mjs +0 -33
  109. package/esm2020/app/components/body/row/menu-action/menu-action.component.mjs +0 -46
  110. package/esm2020/app/components/body/row/row.component.mjs +0 -322
  111. package/esm2020/app/components/customize-cols/customize-cols.component.mjs +0 -68
  112. package/esm2020/app/components/footer/footer-row/footer-cell/footer-cell.component.mjs +0 -16
  113. package/esm2020/app/components/footer/footer-row/footer-row.component.mjs +0 -28
  114. package/esm2020/app/components/footer/footer.component.mjs +0 -31
  115. package/esm2020/app/components/head/head-cell/head-cell.component.mjs +0 -29
  116. package/esm2020/app/components/head/head.component.mjs +0 -103
  117. package/esm2020/app/components/list/list.component.mjs +0 -385
  118. package/esm2020/app/components/loader/loader.component.mjs +0 -40
  119. package/esm2020/app/components/manage-saved-filters/manage-saved-filters.component.mjs +0 -76
  120. package/esm2020/app/components/pagination/pagination.component.mjs +0 -37
  121. package/esm2020/app/components/saved-filters/saved-filters.component.mjs +0 -29
  122. package/esm2020/app/components/status/status.component.mjs +0 -64
  123. package/esm2020/app/directives/cell/cell.directive.mjs +0 -18
  124. package/esm2020/app/directives/column/column.directive.mjs +0 -121
  125. package/esm2020/app/directives/content-init/content-init.directive.mjs +0 -22
  126. package/esm2020/app/directives/draggable-list/draggable-list.directive.mjs +0 -330
  127. package/esm2020/app/directives/draggable-row/draggable-row.directive.mjs +0 -78
  128. package/esm2020/app/directives/empty-state/empty-state.directive.mjs +0 -13
  129. package/esm2020/app/directives/footer/footer.directive.mjs +0 -18
  130. package/esm2020/app/directives/group-expand-trigger/group-expand-trigger.directive.mjs +0 -26
  131. package/esm2020/app/directives/header/header.directive.mjs +0 -18
  132. package/esm2020/app/directives/heading/heading.directive.mjs +0 -13
  133. package/esm2020/app/directives/subheading/subheading.directive.mjs +0 -13
  134. package/esm2020/app/interfaces/external-params.interface.mjs +0 -2
  135. package/esm2020/app/interfaces/pagination.interface.mjs +0 -2
  136. package/esm2020/app/models/column-attributes.mjs +0 -132
  137. package/esm2020/app/models/column.model.mjs +0 -164
  138. package/esm2020/app/models/row/base-row.mjs +0 -23
  139. package/esm2020/app/models/row/child-row.mjs +0 -28
  140. package/esm2020/app/models/row/group-footer-row.mjs +0 -21
  141. package/esm2020/app/models/row/group-row.mjs +0 -45
  142. package/esm2020/app/models/row-action.model.mjs +0 -90
  143. package/esm2020/app/models/row.mjs +0 -89
  144. package/esm2020/app/models/styleConfig.model.mjs +0 -76
  145. package/esm2020/app/pipes/action-label.mjs +0 -17
  146. package/fesm2015/firestitch-list.mjs +0 -5802
  147. package/fesm2015/firestitch-list.mjs.map +0 -1
  148. package/fesm2020/firestitch-list.mjs.map +0 -1
  149. /package/{esm2020 → esm2022}/app/enums/action-type.enum.mjs +0 -0
  150. /package/{esm2020 → esm2022}/app/enums/row-type.enum.mjs +0 -0
  151. /package/{esm2020 → esm2022}/app/interfaces/column-config.interface.mjs +0 -0
  152. /package/{esm2020 → esm2022}/app/interfaces/listconfig.interface.mjs +0 -0
  153. /package/{esm2020 → esm2022}/app/interfaces/pagination-state.interface.mjs +0 -0
  154. /package/{esm2020 → esm2022}/app/pipes/index.mjs +0 -0
  155. /package/{esm2020 → esm2022}/firestitch-list.mjs +0 -0
  156. /package/{esm2020 → esm2022}/public_api.mjs +0 -0
@@ -0,0 +1,473 @@
1
+ import { BehaviorSubject, Observable, Subject } from 'rxjs';
2
+ import { take, takeUntil } from 'rxjs/operators';
3
+ import { get as _get } from 'lodash-es';
4
+ export var SelectionChangeType;
5
+ (function (SelectionChangeType) {
6
+ SelectionChangeType["AllVisibleSelectionChange"] = "AllVisibleSelectionChange";
7
+ SelectionChangeType["RowSelectionChange"] = "RowSelectionChange";
8
+ SelectionChangeType["SelectedAll"] = "SelectedAll";
9
+ })(SelectionChangeType || (SelectionChangeType = {}));
10
+ export class SelectionController {
11
+ _trackBy;
12
+ _selectionDialog;
13
+ // Options from passed config
14
+ actions = [];
15
+ selectAll = true;
16
+ selectionChangedFn;
17
+ actionSelectedFn;
18
+ allSelectedFn;
19
+ cancelledFn;
20
+ // Store for selected visible rows
21
+ selectedRows = new Map();
22
+ selectedGroups = new Map();
23
+ // Reference to selection dialog
24
+ _selectionDialogRef = null;
25
+ _getRows;
26
+ _selectionChange = new Subject();
27
+ // Selected only visible rows (ex.: selected only limited 15 rows when we have pagination)
28
+ _selectedAllVisible = false;
29
+ // Selected all rows when was clicked "Select All" in selection dialog
30
+ // or count of visible records is equal to total and all visible rows was selected
31
+ _selectedAll = false;
32
+ _selectedRecords = 0;
33
+ _visibleRecordsCount = 0;
34
+ _totalRecordsCount = 0;
35
+ _destroy$ = new Subject();
36
+ _disabled$ = new BehaviorSubject(false);
37
+ constructor(config = {}, _trackBy, _selectionDialog) {
38
+ this._trackBy = _trackBy;
39
+ this._selectionDialog = _selectionDialog;
40
+ this.actions = config.actions ? [...config.actions] : [];
41
+ this.actionSelectedFn = config.actionSelected;
42
+ this.allSelectedFn = config.allSelected;
43
+ this.cancelledFn = config.cancelled;
44
+ this.selectionChangedFn = config.selectionChanged;
45
+ this.selectAll = config.selectAll;
46
+ this._disabled$.next(!!config.disabled);
47
+ }
48
+ get disabled() {
49
+ return this._disabled$.getValue();
50
+ }
51
+ get disabled$() {
52
+ return this._disabled$.asObservable();
53
+ }
54
+ get selectedAll() {
55
+ return this._selectedAll;
56
+ }
57
+ get selectionChange$() {
58
+ return this._selectionChange.pipe(takeUntil(this._destroy$));
59
+ }
60
+ setRowsCallback(data) {
61
+ this._getRows = data;
62
+ }
63
+ /**
64
+ * Trigger when row was selected
65
+ *
66
+ * @param row
67
+ * @param checked
68
+ */
69
+ rowSelectionChange(row, checked) {
70
+ if (row) {
71
+ if (checked) {
72
+ this._selectRow(row);
73
+ this.openDialog();
74
+ }
75
+ else {
76
+ if (this._selectedAll) {
77
+ this._selectedAll = false;
78
+ }
79
+ this._deselectRow(row);
80
+ }
81
+ }
82
+ this._updateSelectionRefSelected();
83
+ this._updateSelectedVisibleStatus();
84
+ }
85
+ /**
86
+ * Do check or uncheck of visible rows
87
+ *
88
+ * @param checked
89
+ */
90
+ selectAllVisibleRows(checked) {
91
+ this.openDialog();
92
+ this._selectedAllVisible = checked;
93
+ this._selectedRecords = 0;
94
+ const rows = this._getRows();
95
+ if (checked) {
96
+ rows.forEach((row) => {
97
+ const identifier = this._rowIdentifier(row.data);
98
+ if (row.isGroup) {
99
+ this._setNumberOfSelectedChildrenInGroup(identifier, row.children.length);
100
+ }
101
+ else {
102
+ this.selectedRows.set(identifier, row.data);
103
+ this._selectedRecords++;
104
+ }
105
+ });
106
+ }
107
+ else {
108
+ rows.forEach((row) => {
109
+ const identifier = this._rowIdentifier(row.data);
110
+ if (row.isGroup) {
111
+ this._setNumberOfSelectedChildrenInGroup(identifier, 0);
112
+ }
113
+ else {
114
+ this.selectedRows.delete(identifier);
115
+ }
116
+ });
117
+ this._selectedAll = false;
118
+ this._selectedRecords = 0;
119
+ }
120
+ // Fire an event that all visible selection was changed
121
+ this._visibleRowsSelectionChanged();
122
+ this._updateSelectionRefSelected();
123
+ }
124
+ isRowSelected(rowData) {
125
+ return this.selectedRows.has(this._rowIdentifier(rowData))
126
+ || this.selectedGroups.has(this._rowIdentifier(rowData))
127
+ || this.selectedAll;
128
+ }
129
+ isGroupSelected(row) {
130
+ const identifier = this._rowIdentifier(row.data);
131
+ if (this.selectedGroups.has(identifier)
132
+ && row.children?.length > this.selectedGroups.get(identifier)) {
133
+ return 'indeterminate';
134
+ }
135
+ return this.selectedGroups.has(identifier) || this.selectedAll;
136
+ }
137
+ /**
138
+ * Open selection dialog and create reference
139
+ */
140
+ openDialog() {
141
+ if (!this._selectionDialogRef) {
142
+ this._selectionDialogRef = this._selectionDialog.open({
143
+ selectAll: this.selectAll,
144
+ allCount: this._totalRecordsCount,
145
+ actions: [...this.actions],
146
+ // selectAll: this.sele
147
+ });
148
+ this._subscribeToSelection();
149
+ }
150
+ }
151
+ /**
152
+ * Update count of visible elements
153
+ *
154
+ * @param count
155
+ */
156
+ updateVisibleRecordsCount(count) {
157
+ this._visibleRecordsCount = count;
158
+ }
159
+ /**
160
+ * Update count of total available elemenets
161
+ *
162
+ * @param count
163
+ */
164
+ updateTotalRecordsCount(count) {
165
+ this._totalRecordsCount = count;
166
+ if (this._selectionDialogRef) {
167
+ this._selectionDialogRef.updateAllCount(this._totalRecordsCount);
168
+ }
169
+ }
170
+ pageChanged() {
171
+ if (this._selectedAll) {
172
+ this._resetSelection();
173
+ }
174
+ else {
175
+ this._selectedRecords = 0;
176
+ this._getRows()
177
+ .map((row) => row.data)
178
+ .forEach((rowData) => {
179
+ const identified = this._rowIdentifier(rowData);
180
+ if (this.selectedRows.has(identified)) {
181
+ this._selectedRecords++;
182
+ }
183
+ });
184
+ this._updateSelectionRefSelected();
185
+ this._updateSelectedVisibleStatus();
186
+ }
187
+ }
188
+ enableSelection() {
189
+ this._disabled$.next(false);
190
+ }
191
+ disableSelection() {
192
+ this._disabled$.next(true);
193
+ }
194
+ /**
195
+ * Method will be called from List for remove row if it was selected
196
+ *
197
+ * BUT methods for update visible and etc. will be called a bit later
198
+ *
199
+ * @param row
200
+ */
201
+ removeRow(row) {
202
+ this.selectedRows.delete(this._rowIdentifier(row));
203
+ this._updateSelectionRefSelected();
204
+ this._updateSelectionRefSelectedAll();
205
+ }
206
+ /**
207
+ * Intersection of selected and passed rows to remove rows that we dont need more
208
+ *
209
+ * @param rows
210
+ */
211
+ selectedRowsIntersection(rows) {
212
+ const rowsIndentifiers = rows.map((row) => this._rowIdentifier(row));
213
+ this.selectedRows.forEach((selectedRow, identifier) => {
214
+ if (rowsIndentifiers.indexOf(identifier) === -1) {
215
+ this.removeRow(selectedRow);
216
+ }
217
+ });
218
+ }
219
+ updateConfig({ actions, actionSelected, allSelected, cancelled, selectionChanged, selectAll, }) {
220
+ this.actions = actions ? [...actions] : this.actions;
221
+ this.actionSelectedFn = actionSelected ?? this.actionSelectedFn;
222
+ this.allSelectedFn = allSelected ?? this.allSelectedFn;
223
+ this.cancelledFn = cancelled ?? this.cancelledFn;
224
+ this.selectionChangedFn = selectionChanged ?? this.selectionChangedFn;
225
+ this.selectAll = selectAll ?? this.selectAll;
226
+ }
227
+ // Reset actions to default set
228
+ resetActions() {
229
+ this._selectionDialogRef?.resetActions();
230
+ }
231
+ closeSelectionDialog() {
232
+ this._selectionDialogRef?.close();
233
+ }
234
+ destroy() {
235
+ this._resetSelection();
236
+ this.actions = null;
237
+ this.actionSelectedFn = null;
238
+ this.allSelectedFn = null;
239
+ this.cancelledFn = null;
240
+ this.closeSelectionDialog();
241
+ this._selectionDialogRef = null;
242
+ this._destroy$.next(null);
243
+ this._destroy$.complete();
244
+ this._selectionChange.complete();
245
+ }
246
+ /**
247
+ * Subscribe to selectionRef events
248
+ */
249
+ _subscribeToSelection() {
250
+ this._selectionDialogRef.actionSelected$()
251
+ .pipe(takeUntil(this._destroy$))
252
+ .subscribe((data) => {
253
+ this._onActionActions(data);
254
+ });
255
+ this._selectionDialogRef.cancelled$()
256
+ .pipe(takeUntil(this._destroy$))
257
+ .subscribe(() => this._onCancelActions());
258
+ this._selectionDialogRef.allSelected$()
259
+ .pipe(takeUntil(this._destroy$))
260
+ .subscribe((data) => {
261
+ this._onSelectAllActions(data);
262
+ });
263
+ }
264
+ /**
265
+ * If some action was clicked on selection ref dialog
266
+ *
267
+ * @param data
268
+ */
269
+ _onActionActions(data) {
270
+ if (!this.actionSelectedFn) {
271
+ return;
272
+ }
273
+ // Execute callback
274
+ const result = this.actionSelectedFn({
275
+ selected: Array.from(this.selectedRows.values()).map((row) => {
276
+ return { ...row };
277
+ }),
278
+ ...data,
279
+ });
280
+ // If result is observable
281
+ if (result instanceof Observable) {
282
+ // Subscribe and whait why it resolved
283
+ result.pipe(take(1), takeUntil(this._destroy$)).subscribe({
284
+ next: () => {
285
+ // Close dialog
286
+ this.closeSelectionDialog();
287
+ // Uncheck all visible rows
288
+ this.selectAllVisibleRows(false);
289
+ },
290
+ error: () => { },
291
+ });
292
+ }
293
+ }
294
+ /**
295
+ * If cancel was clicked on selection ref dialog
296
+ */
297
+ _onCancelActions() {
298
+ this.selectAllVisibleRows(false);
299
+ if (this.cancelledFn) {
300
+ this.cancelledFn();
301
+ }
302
+ this._selectionDialogRef = null;
303
+ }
304
+ /**
305
+ * If "Select All" action was clicked on selection ref dialog
306
+ *
307
+ * @param flag
308
+ */
309
+ _onSelectAllActions(flag) {
310
+ this._selectedAll = flag;
311
+ this.selectAllVisibleRows(flag);
312
+ this._selectionDialogRef.updateSelected(this._totalRecordsCount);
313
+ this._selectionChangeEvent(SelectionChangeType.SelectedAll, this._selectedAll);
314
+ this._updateSelectionRefSelectedAll();
315
+ if (!this.allSelectedFn) {
316
+ return;
317
+ }
318
+ this.allSelectedFn(flag);
319
+ }
320
+ _selectionChangedActions() {
321
+ // Remove actions if no rows selected
322
+ // otherwise it will "blink" when user select any action
323
+ if (this.selectedRows.size === 0) {
324
+ this._selectionDialogRef.updateActions([]);
325
+ return;
326
+ }
327
+ if (this.selectionChangedFn) {
328
+ const result = this.selectionChangedFn(Array.from(this.selectedRows.values()), this.selectedAll, this._selectionDialogRef);
329
+ if (result) {
330
+ if (result instanceof Observable) {
331
+ result.pipe(take(1), takeUntil(this._destroy$)).subscribe({
332
+ next: (actions) => {
333
+ this._selectionDialogRef.updateActions(actions);
334
+ },
335
+ });
336
+ }
337
+ else if (Array.isArray(result)) {
338
+ this._selectionDialogRef.updateActions(result);
339
+ }
340
+ }
341
+ }
342
+ }
343
+ /**
344
+ * Update in Dialog Ref how much rows was selected
345
+ */
346
+ _updateSelectionRefSelected() {
347
+ if (this._selectionDialogRef) {
348
+ this._selectionDialogRef.updateSelected(this.selectedRows.size);
349
+ // S-T1268
350
+ if (this.selectedRows.size === 0) {
351
+ this._selectionDialogRef.close();
352
+ }
353
+ this._selectionChangedActions();
354
+ }
355
+ }
356
+ /**
357
+ * Update in Dialog Ref selected all status
358
+ *
359
+ * Ex.: Was clicked "Select All" in Dialog and after that some checkbox was unchecked
360
+ * Dialog Ref must know about it
361
+ *
362
+ */
363
+ _updateSelectionRefSelectedAll() {
364
+ if (this._selectionDialogRef) {
365
+ this._selectionDialogRef.updateSelectedAllStatus(this._selectedAll);
366
+ }
367
+ }
368
+ /**
369
+ * Check if all visible rows was checked and send event to main header checkbox
370
+ */
371
+ _updateSelectedVisibleStatus() {
372
+ this._selectedAllVisible = this._selectedRecords !== 0 && this._selectedRecords === this._visibleRecordsCount;
373
+ this._selectionChangeEvent(SelectionChangeType.RowSelectionChange, this._selectedAllVisible);
374
+ }
375
+ /**
376
+ * If select all checkbox in header was changed
377
+ */
378
+ _visibleRowsSelectionChanged() {
379
+ this._selectionChangeEvent(SelectionChangeType.AllVisibleSelectionChange, this._selectedAllVisible);
380
+ }
381
+ /**
382
+ * Method constructor for events
383
+ *
384
+ * @param type
385
+ * @param payload
386
+ */
387
+ _selectionChangeEvent(type, payload) {
388
+ this._selectionChange.next({
389
+ type,
390
+ payload,
391
+ });
392
+ }
393
+ /**
394
+ * Get row identified by trackBy path
395
+ *
396
+ * @param row
397
+ */
398
+ _rowIdentifier(row) {
399
+ const identifier = _get(row, this._trackBy, undefined);
400
+ if (identifier === undefined) {
401
+ console.warn('Selection can not recognize track by field for row. ' +
402
+ 'Please check if you had configured trackBy function.');
403
+ }
404
+ return identifier;
405
+ }
406
+ _selectRow(row) {
407
+ const identifier = this._rowIdentifier(row.data);
408
+ if (row.isGroup) {
409
+ row.children.forEach((childRow) => {
410
+ this._selectRow(childRow);
411
+ });
412
+ }
413
+ else {
414
+ if (row.isChild) {
415
+ this._selectChildRow(row);
416
+ }
417
+ this.selectedRows.set(identifier, row.data);
418
+ this._selectedRecords++;
419
+ }
420
+ }
421
+ _deselectRow(row) {
422
+ const identifier = this._rowIdentifier(row.data);
423
+ if (row.isGroup) {
424
+ this.selectedGroups.delete(identifier);
425
+ row.children.forEach((childRow) => {
426
+ this._deselectRow(childRow);
427
+ });
428
+ }
429
+ else {
430
+ if (row.isChild && this.selectedRows.has(identifier)) {
431
+ this._deselectChildRow(row);
432
+ }
433
+ this.selectedRows.delete(identifier);
434
+ this._selectedRecords--;
435
+ }
436
+ }
437
+ _selectChildRow(row) {
438
+ const parentIdentifier = this._rowIdentifier(row.parent.data);
439
+ const selectedChildrenNumber = this.selectedGroups.get(parentIdentifier) || 0;
440
+ this._setNumberOfSelectedChildrenInGroup(parentIdentifier, selectedChildrenNumber + 1);
441
+ }
442
+ _deselectChildRow(row) {
443
+ const parentIdentifier = this._rowIdentifier(row.parent.data);
444
+ const selectedChildrenNumber = this.selectedGroups.get(parentIdentifier) || 0;
445
+ if (selectedChildrenNumber > 1) {
446
+ this._setNumberOfSelectedChildrenInGroup(parentIdentifier, selectedChildrenNumber - 1);
447
+ }
448
+ else {
449
+ this._setNumberOfSelectedChildrenInGroup(parentIdentifier, 0);
450
+ }
451
+ }
452
+ _setNumberOfSelectedChildrenInGroup(identifier, n) {
453
+ if (n === 0) {
454
+ this.selectedGroups.delete(identifier);
455
+ return;
456
+ }
457
+ this.selectedGroups.set(identifier, n);
458
+ }
459
+ /**
460
+ * Reset selection
461
+ */
462
+ _resetSelection() {
463
+ this._selectedAll = false;
464
+ this._selectedAllVisible = false;
465
+ this._visibleRecordsCount = 0;
466
+ this._selectedRecords = 0;
467
+ this.selectedRows.clear();
468
+ this._updateSelectionRefSelected();
469
+ this._updateSelectionRefSelectedAll();
470
+ this._visibleRowsSelectionChanged();
471
+ }
472
+ }
473
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aW9uLWNvbnRyb2xsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBwL2NsYXNzZXMvc2VsZWN0aW9uLWNvbnRyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFakQsT0FBTyxFQUFFLEdBQUcsSUFBSSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFLeEMsTUFBTSxDQUFOLElBQVksbUJBSVg7QUFKRCxXQUFZLG1CQUFtQjtJQUM3Qiw4RUFBdUQsQ0FBQTtJQUN2RCxnRUFBeUMsQ0FBQTtJQUN6QyxrREFBMkIsQ0FBQTtBQUM3QixDQUFDLEVBSlcsbUJBQW1CLEtBQW5CLG1CQUFtQixRQUk5QjtBQUdELE1BQU0sT0FBTyxtQkFBbUI7SUFxQ3BCO0lBQ0E7SUFwQ1YsNkJBQTZCO0lBQ3RCLE9BQU8sR0FBRyxFQUFFLENBQUM7SUFDYixTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQ2pCLGtCQUFrQixDQUFDO0lBQ25CLGdCQUFnQixDQUFDO0lBQ2pCLGFBQWEsQ0FBQztJQUVkLFdBQVcsQ0FBQztJQUVuQixrQ0FBa0M7SUFDM0IsWUFBWSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7SUFDekIsY0FBYyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7SUFFbEMsZ0NBQWdDO0lBQ3hCLG1CQUFtQixHQUFpQixJQUFJLENBQUM7SUFFekMsUUFBUSxDQUFjO0lBQ3RCLGdCQUFnQixHQUFHLElBQUksT0FBTyxFQUErQyxDQUFDO0lBRXRGLDBGQUEwRjtJQUNsRixtQkFBbUIsR0FBRyxLQUFLLENBQUM7SUFFcEMsc0VBQXNFO0lBQ3RFLGtGQUFrRjtJQUMxRSxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBRXJC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QztJQUVEOztPQUVHO0lBQ0ssZUFBZTtRQUNyQixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMxQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRTFCLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO0lBQ3RDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNlbGVjdGlvbkRpYWxvZywgU2VsZWN0aW9uUmVmIH0gZnJvbSAnQGZpcmVzdGl0Y2gvc2VsZWN0aW9uJztcblxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IGdldCBhcyBfZ2V0IH0gZnJvbSAnbG9kYXNoLWVzJztcblxuaW1wb3J0IHsgRnNMaXN0U2VsZWN0aW9uQ29uZmlnIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBSb3cgfSBmcm9tICcuLi9tb2RlbHMvcm93JztcblxuZXhwb3J0IGVudW0gU2VsZWN0aW9uQ2hhbmdlVHlwZSB7XG4gIEFsbFZpc2libGVTZWxlY3Rpb25DaGFuZ2UgPSAnQWxsVmlzaWJsZVNlbGVjdGlvbkNoYW5nZScsXG4gIFJvd1NlbGVjdGlvbkNoYW5nZSA9ICdSb3dTZWxlY3Rpb25DaGFuZ2UnLFxuICBTZWxlY3RlZEFsbCA9ICdTZWxlY3RlZEFsbCcsXG59XG5cblxuZXhwb3J0IGNsYXNzIFNlbGVjdGlvbkNvbnRyb2xsZXIge1xuXG4gIC8vIE9wdGlvbnMgZnJvbSBwYXNzZWQgY29uZmlnXG4gIHB1YmxpYyBhY3Rpb25zID0gW107XG4gIHB1YmxpYyBzZWxlY3RBbGwgPSB0cnVlO1xuICBwdWJsaWMgc2VsZWN0aW9uQ2hhbmdlZEZuO1xuICBwdWJsaWMgYWN0aW9uU2VsZWN0ZWRGbjtcbiAgcHVibGljIGFsbFNlbGVjdGVkRm47XG5cbiAgcHVibGljIGNhbmNlbGxlZEZuO1xuXG4gIC8vIFN0b3JlIGZvciBzZWxlY3RlZCB2aXNpYmxlIHJvd3NcbiAgcHVibGljIHNlbGVjdGVkUm93cyA9IG5ldyBNYXAoKTtcbiAgcHVibGljIHNlbGVjdGVkR3JvdXBzID0gbmV3IE1hcCgpO1xuXG4gIC8vIFJlZmVyZW5jZSB0byBzZWxlY3Rpb24gZGlhbG9nXG4gIHByaXZhdGUgX3NlbGVjdGlvbkRpYWxvZ1JlZjogU2VsZWN0aW9uUmVmID0gbnVsbDtcblxuICBwcml2YXRlIF9nZXRSb3dzOiAoKSA9PiBhbnlbXTtcbiAgcHJpdmF0ZSBfc2VsZWN0aW9uQ2hhbmdlID0gbmV3IFN1YmplY3Q8eyB0eXBlOiBTZWxlY3Rpb25DaGFuZ2VUeXBlOyBwYXlsb2FkOiBhbnkgfT4oKTtcblxuICAvLyBTZWxlY3RlZCBvbmx5IHZpc2libGUgcm93cyAoZXguOiBzZWxlY3RlZCBvbmx5IGxpbWl0ZWQgMTUgcm93cyB3aGVuIHdlIGhhdmUgcGFnaW5hdGlvbilcbiAgcHJpdmF0ZSBfc2VsZWN0ZWRBbGxWaXNpYmxlID0gZmFsc2U7XG5cbiAgLy8gU2VsZWN0ZWQgYWxsIHJvd3Mgd2hlbiB3YXMgY2xpY2tlZCBcIlNlbGVjdCBBbGxcIiBpbiBzZWxlY3Rpb24gZGlhbG9nXG4gIC8vIG9yIGNvdW50IG9mIHZpc2libGUgcmVjb3JkcyBpcyBlcXVhbCB0byB0b3RhbCBhbmQgYWxsIHZpc2libGUgcm93cyB3YXMgc2VsZWN0ZWRcbiAgcHJpdmF0ZSBfc2VsZWN0ZWRBbGwgPSBmYWxzZTtcblxuICBwcml2YXRlIF9zZWxlY3RlZFJlY29yZHMgPSAwO1xuICBwcml2YXRlIF92aXNpYmxlUmVjb3Jkc0NvdW50ID0gMDtcbiAgcHJpdmF0ZSBfdG90YWxSZWNvcmRzQ291bnQgPSAwO1xuXG4gIHByaXZhdGUgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcbiAgcHJpdmF0ZSBfZGlzYWJsZWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgY29uZmlnOiBGc0xpc3RTZWxlY3Rpb25Db25maWcgPSB7fSxcbiAgICBwcml2YXRlIF90cmFja0J5OiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfc2VsZWN0aW9uRGlhbG9nOiBTZWxlY3Rpb25EaWFsb2csXG4gICkge1xuICAgIHRoaXMuYWN0aW9ucyA9IGNvbmZpZy5hY3Rpb25zID8gWy4uLmNvbmZpZy5hY3Rpb25zXSA6IFtdO1xuICAgIHRoaXMuYWN0aW9uU2VsZWN0ZWRGbiA9IGNvbmZpZy5hY3Rpb25TZWxlY3RlZDtcbiAgICB0aGlzLmFsbFNlbGVjdGVkRm4gPSBjb25maWcuYWxsU2VsZWN0ZWQ7XG4gICAgdGhpcy5jYW5jZWxsZWRGbiA9IGNvbmZpZy5jYW5jZWxsZWQ7XG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VkRm4gPSBjb25maWcuc2VsZWN0aW9uQ2hhbmdlZDtcbiAgICB0aGlzLnNlbGVjdEFsbCA9IGNvbmZpZy5zZWxlY3RBbGw7XG4gICAgdGhpcy5fZGlzYWJsZWQkLm5leHQoISFjb25maWcuZGlzYWJsZWQpO1xuICB9XG5cbiAgcHVibGljIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQkLmdldFZhbHVlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRpc2FibGVkJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBzZWxlY3RlZEFsbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRBbGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlbGVjdGlvbkNoYW5nZSQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbkNoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpO1xuICB9XG5cbiAgcHVibGljIHNldFJvd3NDYWxsYmFjayhkYXRhOiAoKSA9PiBhbnlbXSkge1xuICAgIHRoaXMuX2dldFJvd3MgPSBkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXIgd2hlbiByb3cgd2FzIHNlbGVjdGVkXG4gICAqXG4gICAqIEBwYXJhbSByb3dcbiAgICogQHBhcmFtIGNoZWNrZWRcbiAgICovXG4gIHB1YmxpYyByb3dTZWxlY3Rpb25DaGFuZ2Uocm93OiBSb3csIGNoZWNrZWQ6IGJvb2xlYW4pIHtcbiAgICBpZiAocm93KSB7XG4gICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICB0aGlzLl9zZWxlY3RSb3cocm93KTtcbiAgICAgICAgdGhpcy5vcGVuRGlhbG9nKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWRBbGwpIHtcbiAgICAgICAgICB0aGlzLl9zZWxlY3RlZEFsbCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZGVzZWxlY3RSb3cocm93KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGVTZWxlY3Rpb25SZWZTZWxlY3RlZCgpO1xuICAgIHRoaXMuX3VwZGF0ZVNlbGVjdGVkVmlzaWJsZVN0YXR1cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIERvIGNoZWNrIG9yIHVuY2hlY2sgb2YgdmlzaWJsZSByb3dzXG4gICAqXG4gICAqIEBwYXJhbSBjaGVja2VkXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0QWxsVmlzaWJsZVJvd3MoY2hlY2tlZCkge1xuICAgIHRoaXMub3BlbkRpYWxvZygpO1xuXG4gICAgdGhpcy5fc2VsZWN0ZWRBbGxWaXNpYmxlID0gY2hlY2tlZDtcbiAgICB0aGlzLl9zZWxlY3RlZFJlY29yZHMgPSAwO1xuXG4gICAgY29uc3Qgcm93cyA9IHRoaXMuX2dldFJvd3MoKTtcblxuICAgIGlmIChjaGVja2VkKSB7XG4gICAgICByb3dzLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5fcm93SWRlbnRpZmllcihyb3cuZGF0YSk7XG5cbiAgICAgICAgaWYgKHJvdy5pc0dyb3VwKSB7XG4gICAgICAgICAgdGhpcy5fc2V0TnVtYmVyT2ZTZWxlY3RlZENoaWxkcmVuSW5Hcm91cChpZGVudGlmaWVyLCByb3cuY2hpbGRyZW4ubGVuZ3RoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkUm93cy5zZXQoaWRlbnRpZmllciwgcm93LmRhdGEpO1xuICAgICAgICAgIHRoaXMuX3NlbGVjdGVkUmVjb3JkcysrO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcm93cy5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuX3Jvd0lkZW50aWZpZXIocm93LmRhdGEpO1xuXG4gICAgICAgIGlmIChyb3cuaXNHcm91cCkge1xuICAgICAgICAgIHRoaXMuX3NldE51bWJlck9mU2VsZWN0ZWRDaGlsZHJlbkluR3JvdXAoaWRlbnRpZmllciwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFJvd3MuZGVsZXRlKGlkZW50aWZpZXIpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5fc2VsZWN0ZWRBbGwgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3NlbGVjdGVkUmVjb3JkcyA9IDA7XG4gICAgfVxuXG4gICAgLy8gRmlyZSBhbiBldmVudCB0aGF0IGFsbCB2aXNpYmxlIHNlbGVjdGlvbiB3YXMgY2hhbmdlZFxuICAgIHRoaXMuX3Zpc2libGVSb3dzU2VsZWN0aW9uQ2hhbmdlZCgpO1xuICAgIHRoaXMuX3VwZGF0ZVNlbGVjdGlvblJlZlNlbGVjdGVkKCk7XG4gIH1cblxuICBwdWJsaWMgaXNSb3dTZWxlY3RlZChyb3dEYXRhKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRSb3dzLmhhcyh0aGlzLl9yb3dJZGVudGlmaWVyKHJvd0RhdGEpKVxuICAgICAgfHwgdGhpcy5zZWxlY3RlZEdyb3Vwcy5oYXModGhpcy5fcm93SWRlbnRpZmllcihyb3dEYXRhKSlcbiAgICAgIHx8IHRoaXMuc2VsZWN0ZWRBbGw7XG4gIH1cblxuICBwdWJsaWMgaXNHcm91cFNlbGVjdGVkKHJvdyk6IGJvb2xlYW4gfCAnaW5kZXRlcm1pbmF0ZScge1xuICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0aGlzLl9yb3dJZGVudGlmaWVyKHJvdy5kYXRhKTtcblxuICAgIGlmIChcbiAgICAgIHRoaXMuc2VsZWN0ZWRHcm91cHMuaGFzKGlkZW50aWZpZXIpXG4gICAgICAmJiByb3cuY2hpbGRyZW4/Lmxlbmd0aCA+IHRoaXMuc2VsZWN0ZWRHcm91cHMuZ2V0KGlkZW50aWZpZXIpXG4gICAgKSB7XG4gICAgICByZXR1cm4gJ2luZGV0ZXJtaW5hdGUnO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkR3JvdXBzLmhhcyhpZGVudGlmaWVyKSB8fCB0aGlzLnNlbGVjdGVkQWxsO1xuXG4gIH1cblxuICAvKipcbiAgICogT3BlbiBzZWxlY3Rpb24gZGlhbG9nIGFuZCBjcmVhdGUgcmVmZXJlbmNlXG4gICAqL1xuICBwdWJsaWMgb3BlbkRpYWxvZygpIHtcbiAgICBpZiAoIXRoaXMuX3NlbGVjdGlvbkRpYWxvZ1JlZikge1xuICAgICAgdGhpcy5fc2VsZWN0aW9uRGlhbG9nUmVmID0gdGhpcy5fc2VsZWN0aW9uRGlhbG9nLm9wZW4oe1xuICAgICAgICBzZWxlY3RBbGw6IHRoaXMuc2VsZWN0QWxsLFxuICAgICAgICBhbGxDb3VudDogdGhpcy5fdG90YWxSZWNvcmRzQ291bnQsXG4gICAgICAgIGFjdGlvbnM6IFsuLi50aGlzLmFjdGlvbnNdLFxuICAgICAgICAvLyBzZWxlY3RBbGw6IHRoaXMuc2VsZVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX3N1YnNjcmliZVRvU2VsZWN0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBjb3VudCBvZiB2aXNpYmxlIGVsZW1lbnRzXG4gICAqXG4gICAqIEBwYXJhbSBjb3VudFxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVZpc2libGVSZWNvcmRzQ291bnQoY291bnQ6IG51bWJlcikge1xuICAgIHRoaXMuX3Zpc2libGVSZWNvcmRzQ291bnQgPSBjb3VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgY291bnQgb2YgdG90YWwgYXZhaWxhYmxlIGVsZW1lbmV0c1xuICAgKlxuICAgKiBAcGFyYW0gY291bnRcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVUb3RhbFJlY29yZHNDb3VudChjb3VudDogbnVtYmVyKSB7XG4gICAgdGhpcy5fdG90YWxSZWNvcmRzQ291bnQgPSBjb3VudDtcblxuICAgIGlmICh0aGlzLl9zZWxlY3Rpb25EaWFsb2dSZWYpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGlvbkRpYWxvZ1JlZi51cGRhdGVBbGxDb3VudCh0aGlzLl90b3RhbFJlY29yZHNDb3VudCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHBhZ2VDaGFuZ2VkKCkge1xuICAgIGlmICh0aGlzLl9zZWxlY3RlZEFsbCkge1xuICAgICAgdGhpcy5fcmVzZXRTZWxlY3Rpb24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc2VsZWN0ZWRSZWNvcmRzID0gMDtcbiAgICAgIHRoaXMuX2dldFJvd3MoKVxuICAgICAgICAubWFwKChyb3cpID0+IHJvdy5kYXRhKVxuICAgICAgICAuZm9yRWFjaCgocm93RGF0YSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkZW50aWZpZWQgPSB0aGlzLl9yb3dJZGVudGlmaWVyKHJvd0RhdGEpO1xuXG4gICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRSb3dzLmhhcyhpZGVudGlmaWVkKSkge1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRSZWNvcmRzKys7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgdGhpcy5fdXBkYXRlU2VsZWN0aW9uUmVmU2VsZWN0ZWQoKTtcbiAgICAgIHRoaXMuX3VwZGF0ZVNlbGVjdGVkVmlzaWJsZVN0YXR1cygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBlbmFibGVTZWxlY3Rpb24oKSB7XG4gICAgdGhpcy5fZGlzYWJsZWQkLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIGRpc2FibGVTZWxlY3Rpb24oKSB7XG4gICAgdGhpcy5fZGlzYWJsZWQkLm5leHQodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHdpbGwgYmUgY2FsbGVkIGZyb20gTGlzdCBmb3IgcmVtb3ZlIHJvdyBpZiBpdCB3YXMgc2VsZWN0ZWRcbiAgICpcbiAgICogQlVUIG1ldGhvZHMgZm9yIHVwZGF0ZSB2aXNpYmxlIGFuZCBldGMuIHdpbGwgYmUgY2FsbGVkIGEgYml0IGxhdGVyXG4gICAqXG4gICAqIEBwYXJhbSByb3dcbiAgICovXG4gIHB1YmxpYyByZW1vdmVSb3cocm93KSB7XG4gICAgdGhpcy5zZWxlY3RlZFJvd3MuZGVsZXRlKHRoaXMuX3Jvd0lkZW50aWZpZXIocm93KSk7XG5cbiAgICB0aGlzLl91cGRhdGVTZWxlY3Rpb25SZWZTZWxlY3RlZCgpO1xuICAgIHRoaXMuX3VwZGF0ZVNlbGVjdGlvblJlZlNlbGVjdGVkQWxsKCk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJzZWN0aW9uIG9mIHNlbGVjdGVkIGFuZCBwYXNzZWQgcm93cyB0byByZW1vdmUgcm93cyB0aGF0IHdlIGRvbnQgbmVlZCBtb3JlXG4gICAqXG4gICAqIEBwYXJhbSByb3dzXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0ZWRSb3dzSW50ZXJzZWN0aW9uKHJvd3MpIHtcbiAgICBjb25zdCByb3dzSW5kZW50aWZpZXJzID0gcm93cy5tYXAoKHJvdykgPT4gdGhpcy5fcm93SWRlbnRpZmllcihyb3cpKTtcblxuICAgIHRoaXMuc2VsZWN0ZWRSb3dzLmZvckVhY2goKHNlbGVjdGVkUm93LCBpZGVudGlmaWVyKSA9PiB7XG4gICAgICBpZiAocm93c0luZGVudGlmaWVycy5pbmRleE9mKGlkZW50aWZpZXIpID09PSAtMSkge1xuICAgICAgICB0aGlzLnJlbW92ZVJvdyhzZWxlY3RlZFJvdyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlQ29uZmlnKHtcbiAgICBhY3Rpb25zLCBhY3Rpb25TZWxlY3RlZCwgYWxsU2VsZWN0ZWQsIGNhbmNlbGxlZCwgc2VsZWN0aW9uQ2hhbmdlZCwgc2VsZWN0QWxsLFxuICB9OiBGc0xpc3RTZWxlY3Rpb25Db25maWcpIHtcbiAgICB0aGlzLmFjdGlvbnMgPSBhY3Rpb25zID8gWy4uLmFjdGlvbnNdIDogdGhpcy5hY3Rpb25zO1xuICAgIHRoaXMuYWN0aW9uU2VsZWN0ZWRGbiA9IGFjdGlvblNlbGVjdGVkID8/IHRoaXMuYWN0aW9uU2VsZWN0ZWRGbjtcbiAgICB0aGlzLmFsbFNlbGVjdGVkRm4gPSBhbGxTZWxlY3RlZCA/PyB0aGlzLmFsbFNlbGVjdGVkRm47XG4gICAgdGhpcy5jYW5jZWxsZWRGbiA9IGNhbmNlbGxlZCA/PyB0aGlzLmNhbmNlbGxlZEZuO1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZEZuID0gc2VsZWN0aW9uQ2hhbmdlZCA/PyB0aGlzLnNlbGVjdGlvbkNoYW5nZWRGbjtcbiAgICB0aGlzLnNlbGVjdEFsbCA9IHNlbGVjdEFsbCA/PyB0aGlzLnNlbGVjdEFsbDtcbiAgfVxuXG4gIC8vIFJlc2V0IGFjdGlvbnMgdG8gZGVmYXVsdCBzZXRcbiAgcHVibGljIHJlc2V0QWN0aW9ucygpIHtcbiAgICB0aGlzLl9zZWxlY3Rpb25EaWFsb2dSZWY/LnJlc2V0QWN0aW9ucygpO1xuICB9XG5cbiAgcHVibGljIGNsb3NlU2VsZWN0aW9uRGlhbG9nKCkge1xuICAgIHRoaXMuX3NlbGVjdGlvbkRpYWxvZ1JlZj8uY2xvc2UoKTtcbiAgfVxuXG4gIHB1YmxpYyBkZXN0cm95KCkge1xuICAgIHRoaXMuX3Jlc2V0U2VsZWN0aW9uKCk7XG5cbiAgICB0aGlzLmFjdGlvbnMgPSBudWxsO1xuICAgIHRoaXMuYWN0aW9uU2VsZWN0ZWRGbiA9IG51bGw7XG4gICAgdGhpcy5hbGxTZWxlY3RlZEZuID0gbnVsbDtcbiAgICB0aGlzLmNhbmNlbGxlZEZuID0gbnVsbDtcblxuICAgIHRoaXMuY2xvc2VTZWxlY3Rpb25EaWFsb2coKTtcbiAgICB0aGlzLl9zZWxlY3Rpb25EaWFsb2dSZWYgPSBudWxsO1xuXG4gICAgdGhpcy5fZGVzdHJveSQubmV4dChudWxsKTtcbiAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xuXG4gICAgdGhpcy5fc2VsZWN0aW9uQ2hhbmdlLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlIHRvIHNlbGVjdGlvblJlZiBldmVudHNcbiAgICovXG4gIHByaXZhdGUgX3N1YnNjcmliZVRvU2VsZWN0aW9uKCkge1xuICAgIHRoaXMuX3NlbGVjdGlvbkRpYWxvZ1JlZi5hY3Rpb25TZWxlY3RlZCQoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICAgIHRoaXMuX29uQWN0aW9uQWN0aW9ucyhkYXRhKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5fc2VsZWN0aW9uRGlhbG9nUmVmLmNhbmNlbGxlZCQoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuX29uQ2FuY2VsQWN0aW9ucygpKTtcblxuICAgIHRoaXMuX3NlbGVjdGlvbkRpYWxvZ1JlZi5hbGxTZWxlY3RlZCQoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICAgIHRoaXMuX29uU2VsZWN0QWxsQWN0aW9ucyhkYXRhKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHNvbWUgYWN0aW9uIHdhcyBjbGlja2VkIG9uIHNlbGVjdGlvbiByZWYgZGlhbG9nXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhXG4gICAqL1xuICBwcml2YXRlIF9vbkFjdGlvbkFjdGlvbnMoZGF0YSkge1xuICAgIGlmICghdGhpcy5hY3Rpb25TZWxlY3RlZEZuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRXhlY3V0ZSBjYWxsYmFja1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYWN0aW9uU2VsZWN0ZWRGbih7XG4gICAgICBzZWxlY3RlZDogQXJyYXkuZnJvbSh0aGlzLnNlbGVjdGVkUm93cy52YWx1ZXMoKSkubWFwKChyb3cpID0+IHtcbiAgICAgICAgcmV0dXJuIHsgLi4ucm93IH07XG4gICAgICB9KSxcbiAgICAgIC4uLmRhdGEsXG4gICAgfSk7XG5cbiAgICAvLyBJZiByZXN1bHQgaXMgb2JzZXJ2YWJsZVxuICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7XG5cbiAgICAgIC8vIFN1YnNjcmliZSBhbmQgd2hhaXQgd2h5IGl0IHJlc29sdmVkXG4gICAgICByZXN1bHQucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuXG4gICAgICAgICAgLy8gQ2xvc2UgZGlhbG9nXG4gICAgICAgICAgdGhpcy5jbG9zZVNlbGVjdGlvbkRpYWxvZygpO1xuXG4gICAgICAgICAgLy8gVW5jaGVjayBhbGwgdmlzaWJsZSByb3dzXG4gICAgICAgICAgdGhpcy5zZWxlY3RBbGxWaXNpYmxlUm93cyhmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoKSA9PiB7IH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSWYgY2FuY2VsIHdhcyBjbGlja2VkIG9uIHNlbGVjdGlvbiByZWYgZGlhbG9nXG4gICAqL1xuICBwcml2YXRlIF9vbkNhbmNlbEFjdGlvbnMoKSB7XG4gICAgdGhpcy5zZWxlY3RBbGxWaXNpYmxlUm93cyhmYWxzZSk7XG5cbiAgICBpZiAodGhpcy5jYW5jZWxsZWRGbikge1xuICAgICAgdGhpcy5jYW5jZWxsZWRGbigpO1xuICAgIH1cblxuICAgIHRoaXMuX3NlbGVjdGlvbkRpYWxvZ1JlZiA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogSWYgXCJTZWxlY3QgQWxsXCIgYWN0aW9uIHdhcyBjbGlja2VkIG9uIHNlbGVjdGlvbiByZWYgZGlhbG9nXG4gICAqXG4gICAqIEBwYXJhbSBmbGFnXG4gICAqL1xuICBwcml2YXRlIF9vblNlbGVjdEFsbEFjdGlvbnMoZmxhZykge1xuICAgIHRoaXMuX3NlbGVjdGVkQWxsID0gZmxhZztcblxuICAgIHRoaXMuc2VsZWN0QWxsVmlzaWJsZVJvd3MoZmxhZyk7XG5cbiAgICB0aGlzLl9zZWxlY3Rpb25EaWFsb2dSZWYudXBkYXRlU2VsZWN0ZWQodGhpcy5fdG90YWxSZWNvcmRzQ291bnQpO1xuXG4gICAgdGhpcy5fc2VsZWN0aW9uQ2hhbmdlRXZlbnQoU2VsZWN0aW9uQ2hhbmdlVHlwZS5TZWxlY3RlZEFsbCwgdGhpcy5fc2VsZWN0ZWRBbGwpO1xuICAgIHRoaXMuX3VwZGF0ZVNlbGVjdGlvblJlZlNlbGVjdGVkQWxsKCk7XG5cbiAgICBpZiAoIXRoaXMuYWxsU2VsZWN0ZWRGbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYWxsU2VsZWN0ZWRGbihmbGFnKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NlbGVjdGlvbkNoYW5nZWRBY3Rpb25zKCkge1xuICAgIC8vIFJlbW92ZSBhY3Rpb25zIGlmIG5vIHJvd3Mgc2VsZWN0ZWRcbiAgICAvLyBvdGhlcndpc2UgaXQgd2lsbCBcImJsaW5rXCIgd2hlbiB1c2VyIHNlbGVjdCBhbnkgYWN0aW9uXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRSb3dzLnNpemUgPT09IDApIHtcbiAgICAgIHRoaXMuX3NlbGVjdGlvbkRpYWxvZ1JlZi51cGRhdGVBY3Rpb25zKFtdKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNlbGVjdGlvbkNoYW5nZWRGbikge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zZWxlY3Rpb25DaGFuZ2VkRm4oXG4gICAgICAgIEFycmF5LmZyb20odGhpcy5zZWxlY3RlZFJvd3MudmFsdWVzKCkpLFxuICAgICAgICB0aGlzLnNlbGVjdGVkQWxsLFxuICAgICAgICB0aGlzLl9zZWxlY3Rpb25EaWFsb2dSZWYsXG4gICAgICApO1xuXG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7XG4gICAgICAgICAgcmVzdWx0LnBpcGUoXG4gICAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgICApLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiAoYWN0aW9ucykgPT4ge1xuICAgICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25EaWFsb2dSZWYudXBkYXRlQWN0aW9ucyhhY3Rpb25zKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICAgICAgdGhpcy5fc2VsZWN0aW9uRGlhbG9nUmVmLnVwZGF0ZUFjdGlvbnMocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgaW4gRGlhbG9nIFJlZiBob3cgbXVjaCByb3dzIHdhcyBzZWxlY3RlZFxuICAgKi9cbiAgcHJpdmF0ZSBfdXBkYXRlU2VsZWN0aW9uUmVmU2VsZWN0ZWQoKSB7XG4gICAgaWYgKHRoaXMuX3NlbGVjdGlvbkRpYWxvZ1JlZikge1xuICAgICAgdGhpcy5fc2VsZWN0aW9uRGlhbG9nUmVmLnVwZGF0ZVNlbGVjdGVkKHRoaXMuc2VsZWN0ZWRSb3dzLnNpemUpO1xuXG4gICAgICAvLyBTLVQxMjY4XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZFJvd3Muc2l6ZSA9PT0gMCkge1xuICAgICAgICB0aGlzLl9zZWxlY3Rpb25EaWFsb2dSZWYuY2xvc2UoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fc2VsZWN0aW9uQ2hhbmdlZEFjdGlvbnMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGluIERpYWxvZyBSZWYgc2VsZWN0ZWQgYWxsIHN0YXR1c1xuICAgKlxuICAgKiBFeC46IFdhcyBjbGlja2VkIFwiU2VsZWN0IEFsbFwiIGluIERpYWxvZyBhbmQgYWZ0ZXIgdGhhdCBzb21lIGNoZWNrYm94IHdhcyB1bmNoZWNrZWRcbiAgICogRGlhbG9nIFJlZiBtdXN0IGtub3cgYWJvdXQgaXRcbiAgICpcbiAgICovXG4gIHByaXZhdGUgX3VwZGF0ZVNlbGVjdGlvblJlZlNlbGVjdGVkQWxsKCkge1xuICAgIGlmICh0aGlzLl9zZWxlY3Rpb25EaWFsb2dSZWYpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGlvbkRpYWxvZ1JlZi51cGRhdGVTZWxlY3RlZEFsbFN0YXR1cyh0aGlzLl9zZWxlY3RlZEFsbCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFsbCB2aXNpYmxlIHJvd3Mgd2FzIGNoZWNrZWQgYW5kIHNlbmQgZXZlbnQgdG8gbWFpbiBoZWFkZXIgY2hlY2tib3hcbiAgICovXG4gIHByaXZhdGUgX3VwZGF0ZVNlbGVjdGVkVmlzaWJsZVN0YXR1cygpIHtcbiAgICB0aGlzLl9zZWxlY3RlZEFsbFZpc2libGUgPSB0aGlzLl9zZWxlY3RlZFJlY29yZHMgIT09IDAgJiYgdGhpcy5fc2VsZWN0ZWRSZWNvcmRzID09PSB0aGlzLl92aXNpYmxlUmVjb3Jkc0NvdW50O1xuXG4gICAgdGhpcy5fc2VsZWN0aW9uQ2hhbmdlRXZlbnQoXG4gICAgICBTZWxlY3Rpb25DaGFuZ2VUeXBlLlJvd1NlbGVjdGlvbkNoYW5nZSxcbiAgICAgIHRoaXMuX3NlbGVjdGVkQWxsVmlzaWJsZSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHNlbGVjdCBhbGwgY2hlY2tib3ggaW4gaGVhZGVyIHdhcyBjaGFuZ2VkXG4gICAqL1xuICBwcml2YXRlIF92aXNpYmxlUm93c1NlbGVjdGlvbkNoYW5nZWQoKSB7XG4gICAgdGhpcy5fc2VsZWN0aW9uQ2hhbmdlRXZlbnQoXG4gICAgICBTZWxlY3Rpb25DaGFuZ2VUeXBlLkFsbFZpc2libGVTZWxlY3Rpb25DaGFuZ2UsXG4gICAgICB0aGlzLl9zZWxlY3RlZEFsbFZpc2libGUsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgY29uc3RydWN0b3IgZm9yIGV2ZW50c1xuICAgKlxuICAgKiBAcGFyYW0gdHlwZVxuICAgKiBAcGFyYW0gcGF5bG9hZFxuICAgKi9cbiAgcHJpdmF0ZSBfc2VsZWN0aW9uQ2hhbmdlRXZlbnQodHlwZTogU2VsZWN0aW9uQ2hhbmdlVHlwZSwgcGF5bG9hZCkge1xuICAgIHRoaXMuX3NlbGVjdGlvbkNoYW5nZS5uZXh0KHtcbiAgICAgIHR5cGUsXG4gICAgICBwYXlsb2FkLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByb3cgaWRlbnRpZmllZCBieSB0cmFja0J5IHBhdGhcbiAgICpcbiAgICogQHBhcmFtIHJvd1xuICAgKi9cbiAgcHJpdmF0ZSBfcm93SWRlbnRpZmllcihyb3cpIHtcbiAgICBjb25zdCBpZGVudGlmaWVyID0gX2dldChyb3csIHRoaXMuX3RyYWNrQnksIHVuZGVmaW5lZCk7XG5cbiAgICBpZiAoaWRlbnRpZmllciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NlbGVjdGlvbiBjYW4gbm90IHJlY29nbml6ZSB0cmFjayBieSBmaWVsZCBmb3Igcm93LiAnICtcbiAgICAgICAgJ1BsZWFzZSBjaGVjayBpZiB5b3UgaGFkIGNvbmZpZ3VyZWQgdHJhY2tCeSBmdW5jdGlvbi4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaWRlbnRpZmllcjtcbiAgfVxuXG4gIHByaXZhdGUgX3NlbGVjdFJvdyhyb3cpIHtcbiAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5fcm93SWRlbnRpZmllcihyb3cuZGF0YSk7XG5cbiAgICBpZiAocm93LmlzR3JvdXApIHtcbiAgICAgIHJvdy5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZFJvdykgPT4ge1xuICAgICAgICB0aGlzLl9zZWxlY3RSb3coY2hpbGRSb3cpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyb3cuaXNDaGlsZCkge1xuICAgICAgICB0aGlzLl9zZWxlY3RDaGlsZFJvdyhyb3cpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNlbGVjdGVkUm93cy5zZXQoaWRlbnRpZmllciwgcm93LmRhdGEpO1xuICAgICAgdGhpcy5fc2VsZWN0ZWRSZWNvcmRzKys7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZGVzZWxlY3RSb3cocm93KSB7XG4gICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuX3Jvd0lkZW50aWZpZXIocm93LmRhdGEpO1xuXG4gICAgaWYgKHJvdy5pc0dyb3VwKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkR3JvdXBzLmRlbGV0ZShpZGVudGlmaWVyKTtcblxuICAgICAgcm93LmNoaWxkcmVuLmZvckVhY2goKGNoaWxkUm93KSA9PiB7XG4gICAgICAgIHRoaXMuX2Rlc2VsZWN0Um93KGNoaWxkUm93KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocm93LmlzQ2hpbGQgJiYgdGhpcy5zZWxlY3RlZFJvd3MuaGFzKGlkZW50aWZpZXIpKSB7XG4gICAgICAgIHRoaXMuX2Rlc2VsZWN0Q2hpbGRSb3cocm93KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZWxlY3RlZFJvd3MuZGVsZXRlKGlkZW50aWZpZXIpO1xuICAgICAgdGhpcy5fc2VsZWN0ZWRSZWNvcmRzLS07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2VsZWN0Q2hpbGRSb3cocm93KSB7XG4gICAgY29uc3QgcGFyZW50SWRlbnRpZmllciA9IHRoaXMuX3Jvd0lkZW50aWZpZXIocm93LnBhcmVudC5kYXRhKTtcbiAgICBjb25zdCBzZWxlY3RlZENoaWxkcmVuTnVtYmVyID0gdGhpcy5zZWxlY3RlZEdyb3Vwcy5nZXQocGFyZW50SWRlbnRpZmllcikgfHwgMDtcblxuICAgIHRoaXMuX3NldE51bWJlck9mU2VsZWN0ZWRDaGlsZHJlbkluR3JvdXAocGFyZW50SWRlbnRpZmllciwgc2VsZWN0ZWRDaGlsZHJlbk51bWJlciArIDEpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGVzZWxlY3RDaGlsZFJvdyhyb3cpIHtcbiAgICBjb25zdCBwYXJlbnRJZGVudGlmaWVyID0gdGhpcy5fcm93SWRlbnRpZmllcihyb3cucGFyZW50LmRhdGEpO1xuICAgIGNvbnN0IHNlbGVjdGVkQ2hpbGRyZW5OdW1iZXIgPSB0aGlzLnNlbGVjdGVkR3JvdXBzLmdldChwYXJlbnRJZGVudGlmaWVyKSB8fCAwO1xuXG4gICAgaWYgKHNlbGVjdGVkQ2hpbGRyZW5OdW1iZXIgPiAxKSB7XG4gICAgICB0aGlzLl9zZXROdW1iZXJPZlNlbGVjdGVkQ2hpbGRyZW5Jbkdyb3VwKHBhcmVudElkZW50aWZpZXIsIHNlbGVjdGVkQ2hpbGRyZW5OdW1iZXIgLSAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc2V0TnVtYmVyT2ZTZWxlY3RlZENoaWxkcmVuSW5Hcm91cChwYXJlbnRJZGVudGlmaWVyLCAwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZXROdW1iZXJPZlNlbGVjdGVkQ2hpbGRyZW5Jbkdyb3VwKGlkZW50aWZpZXI6IHN0cmluZywgbjogbnVtYmVyKSB7XG4gICAgaWYgKG4gPT09IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRHcm91cHMuZGVsZXRlKGlkZW50aWZpZXIpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RlZEdyb3Vwcy5zZXQoaWRlbnRpZmllciwgbik7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgc2VsZWN0aW9uXG4gICAqL1xuICBwcml2YXRlIF9yZXNldFNlbGVjdGlvbigpIHtcbiAgICB0aGlzLl9zZWxlY3RlZEFsbCA9IGZhbHNlO1xuICAgIHRoaXMuX3NlbGVjdGVkQWxsVmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuX3Zpc2libGVSZWNvcmRzQ291bnQgPSAwO1xuICAgIHRoaXMuX3NlbGVjdGVkUmVjb3JkcyA9IDA7XG4gICAgdGhpcy5zZWxlY3RlZFJvd3MuY2xlYXIoKTtcblxuICAgIHRoaXMuX3VwZGF0ZVNlbGVjdGlvblJlZlNlbGVjdGVkKCk7XG4gICAgdGhpcy5fdXBkYXRlU2VsZWN0aW9uUmVmU2VsZWN0ZWRBbGwoKTtcbiAgICB0aGlzLl92aXNpYmxlUm93c1NlbGVjdGlvbkNoYW5nZWQoKTtcbiAgfVxufVxuIl19