verben-ng-ui 0.2.5 → 0.2.7

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.
@@ -11,11 +11,11 @@ export class RightCardDataViewComponent {
11
11
  console.log(this.chilData);
12
12
  }
13
13
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: RightCardDataViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
14
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.5", type: RightCardDataViewComponent, selector: "verben-right-card-data-view", inputs: { parentData: "parentData", chilData: "chilData", meth: "meth" }, queries: [{ propertyName: "parent", first: true, predicate: ["parent"], descendants: true }, { propertyName: "child", first: true, predicate: ["child"], descendants: true }], ngImport: i0, template: " <ng-container *ngIf=\"parentData && !chilData\">\n <ng-content *ngTemplateOutlet=\"parent\"></ng-content>\n </ng-container>\n <ng-container *ngIf=\"chilData\">\n <ng-content *ngTemplateOutlet=\"child\"></ng-content> \n </ng-container>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
14
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.5", type: RightCardDataViewComponent, selector: "verben-right-card-data-view", inputs: { parentData: "parentData", chilData: "chilData", meth: "meth" }, queries: [{ propertyName: "parent", first: true, predicate: ["parent"], descendants: true }, { propertyName: "child", first: true, predicate: ["child"], descendants: true }], ngImport: i0, template: " <ng-container *ngIf=\"parentData && !chilData\">\n <ng-content *ngTemplateOutlet=\"parent\"></ng-content>\n </ng-container>\n <ng-container *ngIf=\"chilData\">\n <ng-content *ngTemplateOutlet=\"child\"></ng-content> \n </ng-container>\n", styles: [":host{flex:1 1 0}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
15
15
  }
16
16
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: RightCardDataViewComponent, decorators: [{
17
17
  type: Component,
18
- args: [{ selector: 'verben-right-card-data-view', template: " <ng-container *ngIf=\"parentData && !chilData\">\n <ng-content *ngTemplateOutlet=\"parent\"></ng-content>\n </ng-container>\n <ng-container *ngIf=\"chilData\">\n <ng-content *ngTemplateOutlet=\"child\"></ng-content> \n </ng-container>\n" }]
18
+ args: [{ selector: 'verben-right-card-data-view', template: " <ng-container *ngIf=\"parentData && !chilData\">\n <ng-content *ngTemplateOutlet=\"parent\"></ng-content>\n </ng-container>\n <ng-container *ngIf=\"chilData\">\n <ng-content *ngTemplateOutlet=\"child\"></ng-content> \n </ng-container>\n", styles: [":host{flex:1 1 0}\n"] }]
19
19
  }], propDecorators: { parent: [{
20
20
  type: ContentChild,
21
21
  args: ['parent']
@@ -1,22 +1,26 @@
1
- import { ChangeDetectionStrategy, Component, computed, ContentChildren, EventEmitter, Input, Output, signal, } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, computed, ContentChildren, EventEmitter, input, Input, Output, signal, } from '@angular/core';
2
2
  import { ColumnDirective } from './column.directive';
3
3
  import * as i0 from "@angular/core";
4
4
  import * as i1 from "@angular/common";
5
5
  export class DataTableComponent {
6
6
  // Modify data input to use grouped data
7
- set data(value) {
8
- this._data = value;
9
- }
10
- get data() {
11
- return this.groupedData();
12
- }
13
- _data = [];
7
+ data = input.required();
8
+ columns = input.required();
9
+ // @Input({ required: true })
10
+ // set data(value: T[]) {
11
+ // this._data = value;
12
+ // }
13
+ // get data(): T[] {
14
+ // return this.groupedData();
15
+ // }
16
+ // private _data: T[] = [];
14
17
  // Modify columns input to use a signal
15
- set columns(value) {
16
- this.columnsSignal.set(value);
17
- }
18
+ // @Input({ required: true })
19
+ // set columns(value: ColumnDefinition<T>[]) {
20
+ // this.columnsSignal.set(value);
21
+ // }
18
22
  // New inputs for grouping
19
- groupBy;
23
+ groupBy = input();
20
24
  styleConfig = defaultTableStyles;
21
25
  columnTemplates;
22
26
  rowEdit = new EventEmitter();
@@ -35,18 +39,20 @@ export class DataTableComponent {
35
39
  // Computed property for grouped data
36
40
  groupedData = computed(() => {
37
41
  // If no grouping is specified, return original data
38
- if (!this.groupBy)
39
- return this._data;
42
+ if (!this.groupBy())
43
+ return this.data();
40
44
  // Determine group function based on input type
41
- const getGroupValue = typeof this.groupBy === 'function'
42
- ? this.groupBy
43
- : (row) => row[this.groupBy];
45
+ const getGroupValue = typeof this.groupBy() === 'function'
46
+ ? this.groupBy()
47
+ : (row) => row[this.groupBy()];
44
48
  // Group the data
45
49
  const groups = new Map();
46
- this._data.forEach((row) => {
47
- const groupValue = getGroupValue(row);
48
- const existingGroup = groups.get(groupValue) || [];
49
- groups.set(groupValue, [...existingGroup, row]);
50
+ this.data().forEach((row) => {
51
+ if (getGroupValue !== undefined) {
52
+ const groupValue = getGroupValue(row);
53
+ const existingGroup = groups.get(groupValue) || [];
54
+ groups.set(groupValue, [...existingGroup, row]);
55
+ }
50
56
  });
51
57
  // Construct final grouped data array with group rows
52
58
  const groupedDataArray = [];
@@ -66,7 +72,7 @@ export class DataTableComponent {
66
72
  ngOnInit() {
67
73
  // Set initial columns if not already set
68
74
  if (this.columnsSignal().length === 0) {
69
- this.columnsSignal.set(this.columns);
75
+ this.columnsSignal.set(this.columns());
70
76
  }
71
77
  }
72
78
  ngAfterContentInit() {
@@ -121,7 +127,7 @@ export class DataTableComponent {
121
127
  });
122
128
  };
123
129
  initializeEditedData(rowId) {
124
- const row = this.data.find((r) => r.id === rowId);
130
+ const row = this.data().find((r) => r.id === rowId);
125
131
  if (row) {
126
132
  this.editedDataSignal.update((map) => {
127
133
  const newMap = new Map(map);
@@ -133,10 +139,10 @@ export class DataTableComponent {
133
139
  saveRow(rowId) {
134
140
  const editedData = this.editedDataSignal().get(rowId);
135
141
  if (editedData) {
136
- const originalRowIndex = this.data.findIndex((r) => r.id === rowId);
142
+ const originalRowIndex = this.data().findIndex((r) => r.id === rowId);
137
143
  if (originalRowIndex !== -1) {
138
- const updatedRow = { ...this.data[originalRowIndex], ...editedData };
139
- this.data[originalRowIndex] = updatedRow;
144
+ const updatedRow = { ...this.data()[originalRowIndex], ...editedData };
145
+ this.data()[originalRowIndex] = updatedRow;
140
146
  this.rowSave.emit(updatedRow);
141
147
  this.editedDataSignal.update((map) => {
142
148
  const newMap = new Map(map);
@@ -174,12 +180,12 @@ export class DataTableComponent {
174
180
  this.selectedRowsSignal.set(new Set());
175
181
  }
176
182
  else {
177
- this.selectedRowsSignal.set(new Set(this.data.map((row) => row.id)));
183
+ this.selectedRowsSignal.set(new Set(this.data().map((row) => row.id)));
178
184
  }
179
185
  this.emitSelectionChange();
180
186
  };
181
187
  emitSelectionChange() {
182
- const selectedRows = this.data.filter((row) => this.selectedRowsSignal().has(row.id));
188
+ const selectedRows = this.data().filter((row) => this.selectedRowsSignal().has(row.id));
183
189
  this.selectionChange.emit(selectedRows);
184
190
  }
185
191
  getHeaderContext(column) {
@@ -241,7 +247,7 @@ export class DataTableComponent {
241
247
  };
242
248
  }
243
249
  deleteRow = (rowId) => {
244
- const rowToDelete = this.data.find((row) => row.id === rowId);
250
+ const rowToDelete = this.data().find((row) => row.id === rowId);
245
251
  if (rowToDelete) {
246
252
  this.rowDelete.emit(rowToDelete);
247
253
  }
@@ -332,20 +338,12 @@ export class DataTableComponent {
332
338
  return cellStyle;
333
339
  }
334
340
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DataTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
335
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.5", type: DataTableComponent, selector: "lib-data-table", inputs: { data: "data", columns: "columns", groupBy: "groupBy", styleConfig: "styleConfig" }, outputs: { rowEdit: "rowEdit", rowSave: "rowSave", rowDelete: "rowDelete", selectionChange: "selectionChange" }, queries: [{ propertyName: "columnTemplates", predicate: ColumnDirective }], ngImport: i0, template: "<table [ngStyle]=\"getTableStyle()\">\n <thead>\n <tr [ngStyle]=\"getHeaderStyle()\">\n @for (column of columnsSignal(); track column.id) {\n <th [ngStyle]=\"getCellStyle(-1, $index)\">\n @if (column.headerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.headerTemplate\"\n [ngTemplateOutletContext]=\"getHeaderContext(column)\"\n ></ng-container>\n } @else {\n {{ column.header }}\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of data; track row.id; let rowIndex = $index) { @if\n (isGroupRow(row)) {\n <tr class=\"group-row\" [ngStyle]=\"getRowStyle(rowIndex)\">\n <td\n [attr.colspan]=\"columnsSignal().length\"\n [ngStyle]=\"getCellStyle(rowIndex, 0)\"\n >\n {{ getCellValue(row, columnsSignal()[0]) }}\n </td>\n </tr>\n } @else {\n <tr [ngStyle]=\"getRowStyle(rowIndex)\">\n @for (column of columnsSignal(); track column.id; let colIndex = $index) {\n <td [ngStyle]=\"getCellStyle(rowIndex, colIndex)\">\n @if (isRowEditing(row.id) && column.cellEditTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.cellEditTemplate\"\n [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n ></ng-container>\n } @else if (column.cellTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.cellTemplate\"\n [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n ></ng-container>\n } @else {\n {{ getCellValue(row, column) }}\n }\n </td>\n }\n </tr>\n } }\n </tbody>\n @if (hasFooter()) {\n <tfoot>\n <tr [ngStyle]=\"getFooterStyle()\">\n @for (column of columnsSignal(); track column.id) {\n <td [ngStyle]=\"getCellStyle(-1, $index)\">\n @if (column.footerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.footerTemplate\"\n [ngTemplateOutletContext]=\"getFooterContext(column)\"\n ></ng-container>\n }\n </td>\n }\n </tr>\n </tfoot>\n }\n</table>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
341
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.5", type: DataTableComponent, selector: "lib-data-table", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: true, transformFunction: null }, groupBy: { classPropertyName: "groupBy", publicName: "groupBy", isSignal: true, isRequired: false, transformFunction: null }, styleConfig: { classPropertyName: "styleConfig", publicName: "styleConfig", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { rowEdit: "rowEdit", rowSave: "rowSave", rowDelete: "rowDelete", selectionChange: "selectionChange" }, queries: [{ propertyName: "columnTemplates", predicate: ColumnDirective }], ngImport: i0, template: "<table [ngStyle]=\"getTableStyle()\">\n <thead>\n <tr [ngStyle]=\"getHeaderStyle()\">\n @for (column of columnsSignal(); track column.id) {\n <th [ngStyle]=\"getCellStyle(-1, $index)\">\n @if (column.headerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.headerTemplate\"\n [ngTemplateOutletContext]=\"getHeaderContext(column)\"\n ></ng-container>\n } @else {\n {{ column.header }}\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of data(); track row.id; let rowIndex = $index) { @if\n (isGroupRow(row)) {\n <tr class=\"group-row\" [ngStyle]=\"getRowStyle(rowIndex)\">\n <td\n [attr.colspan]=\"columnsSignal().length\"\n [ngStyle]=\"getCellStyle(rowIndex, 0)\"\n >\n {{ getCellValue(row, columnsSignal()[0]) }}\n </td>\n </tr>\n } @else {\n <tr [ngStyle]=\"getRowStyle(rowIndex)\">\n @for (column of columnsSignal(); track column.id; let colIndex = $index) {\n <td [ngStyle]=\"getCellStyle(rowIndex, colIndex)\">\n @if (isRowEditing(row.id) && column.cellEditTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.cellEditTemplate\"\n [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n ></ng-container>\n } @else if (column.cellTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.cellTemplate\"\n [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n ></ng-container>\n } @else {\n {{ getCellValue(row, column) }}\n }\n </td>\n }\n </tr>\n } }\n </tbody>\n @if (hasFooter()) {\n <tfoot>\n <tr [ngStyle]=\"getFooterStyle()\">\n @for (column of columnsSignal(); track column.id) {\n <td [ngStyle]=\"getCellStyle(-1, $index)\">\n @if (column.footerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.footerTemplate\"\n [ngTemplateOutletContext]=\"getFooterContext(column)\"\n ></ng-container>\n }\n </td>\n }\n </tr>\n </tfoot>\n }\n</table>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
336
342
  }
337
343
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DataTableComponent, decorators: [{
338
344
  type: Component,
339
- args: [{ selector: 'lib-data-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<table [ngStyle]=\"getTableStyle()\">\n <thead>\n <tr [ngStyle]=\"getHeaderStyle()\">\n @for (column of columnsSignal(); track column.id) {\n <th [ngStyle]=\"getCellStyle(-1, $index)\">\n @if (column.headerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.headerTemplate\"\n [ngTemplateOutletContext]=\"getHeaderContext(column)\"\n ></ng-container>\n } @else {\n {{ column.header }}\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of data; track row.id; let rowIndex = $index) { @if\n (isGroupRow(row)) {\n <tr class=\"group-row\" [ngStyle]=\"getRowStyle(rowIndex)\">\n <td\n [attr.colspan]=\"columnsSignal().length\"\n [ngStyle]=\"getCellStyle(rowIndex, 0)\"\n >\n {{ getCellValue(row, columnsSignal()[0]) }}\n </td>\n </tr>\n } @else {\n <tr [ngStyle]=\"getRowStyle(rowIndex)\">\n @for (column of columnsSignal(); track column.id; let colIndex = $index) {\n <td [ngStyle]=\"getCellStyle(rowIndex, colIndex)\">\n @if (isRowEditing(row.id) && column.cellEditTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.cellEditTemplate\"\n [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n ></ng-container>\n } @else if (column.cellTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.cellTemplate\"\n [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n ></ng-container>\n } @else {\n {{ getCellValue(row, column) }}\n }\n </td>\n }\n </tr>\n } }\n </tbody>\n @if (hasFooter()) {\n <tfoot>\n <tr [ngStyle]=\"getFooterStyle()\">\n @for (column of columnsSignal(); track column.id) {\n <td [ngStyle]=\"getCellStyle(-1, $index)\">\n @if (column.footerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.footerTemplate\"\n [ngTemplateOutletContext]=\"getFooterContext(column)\"\n ></ng-container>\n }\n </td>\n }\n </tr>\n </tfoot>\n }\n</table>\n" }]
340
- }], propDecorators: { data: [{
341
- type: Input,
342
- args: [{ required: true }]
343
- }], columns: [{
344
- type: Input,
345
- args: [{ required: true }]
346
- }], groupBy: [{
347
- type: Input
348
- }], styleConfig: [{
345
+ args: [{ selector: 'lib-data-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<table [ngStyle]=\"getTableStyle()\">\n <thead>\n <tr [ngStyle]=\"getHeaderStyle()\">\n @for (column of columnsSignal(); track column.id) {\n <th [ngStyle]=\"getCellStyle(-1, $index)\">\n @if (column.headerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.headerTemplate\"\n [ngTemplateOutletContext]=\"getHeaderContext(column)\"\n ></ng-container>\n } @else {\n {{ column.header }}\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of data(); track row.id; let rowIndex = $index) { @if\n (isGroupRow(row)) {\n <tr class=\"group-row\" [ngStyle]=\"getRowStyle(rowIndex)\">\n <td\n [attr.colspan]=\"columnsSignal().length\"\n [ngStyle]=\"getCellStyle(rowIndex, 0)\"\n >\n {{ getCellValue(row, columnsSignal()[0]) }}\n </td>\n </tr>\n } @else {\n <tr [ngStyle]=\"getRowStyle(rowIndex)\">\n @for (column of columnsSignal(); track column.id; let colIndex = $index) {\n <td [ngStyle]=\"getCellStyle(rowIndex, colIndex)\">\n @if (isRowEditing(row.id) && column.cellEditTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.cellEditTemplate\"\n [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n ></ng-container>\n } @else if (column.cellTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.cellTemplate\"\n [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n ></ng-container>\n } @else {\n {{ getCellValue(row, column) }}\n }\n </td>\n }\n </tr>\n } }\n </tbody>\n @if (hasFooter()) {\n <tfoot>\n <tr [ngStyle]=\"getFooterStyle()\">\n @for (column of columnsSignal(); track column.id) {\n <td [ngStyle]=\"getCellStyle(-1, $index)\">\n @if (column.footerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.footerTemplate\"\n [ngTemplateOutletContext]=\"getFooterContext(column)\"\n ></ng-container>\n }\n </td>\n }\n </tr>\n </tfoot>\n }\n</table>\n" }]
346
+ }], propDecorators: { styleConfig: [{
349
347
  type: Input
350
348
  }], columnTemplates: [{
351
349
  type: ContentChildren,
@@ -401,4 +399,4 @@ const defaultTableStyles = {
401
399
  borderTop: '2px solid #e0e0e0',
402
400
  },
403
401
  };
404
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsZUFBZSxFQUNmLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUdOLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7OztBQVNyRCxNQUFNLE9BQU8sa0JBQWtCO0lBRzdCLHdDQUF3QztJQUN4QyxJQUNJLElBQUksQ0FBQyxLQUFVO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFDRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBQ08sS0FBSyxHQUFRLEVBQUUsQ0FBQztJQUN4Qix1Q0FBdUM7SUFDdkMsSUFDSSxPQUFPLENBQUMsS0FBNEI7UUFDdEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUNELDBCQUEwQjtJQUNqQixPQUFPLENBQStCO0lBRXRDLFdBQVcsR0FBZ0Isa0JBQWtCLENBQUM7SUFHdkQsZUFBZSxDQUE4QjtJQUVuQyxPQUFPLEdBQUcsSUFBSSxZQUFZLEVBQUssQ0FBQztJQUNoQyxPQUFPLEdBQUcsSUFBSSxZQUFZLEVBQUssQ0FBQztJQUNoQyxT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LEVBQUUsTUFBTTtRQUNiLFNBQVMsRUFBRSxNQUFNO1FBQ2pCLE9BQU8sRUFBRSxXQUFXO1FBQ3BCLFlBQVksRUFBRSxtQkFBbUI7S0FDbEM7SUFDRCxJQUFJLEVBQUU7UUFDSixJQUFJLEVBQUU7WUFDSixlQUFlLEVBQUUsU0FBUztTQUMzQjtRQUNELEdBQUcsRUFBRTtZQUNILGVBQWUsRUFBRSxTQUFTO1NBQzNCO1FBQ0QsR0FBRyxFQUFFO1lBQ0gsUUFBUSxFQUFFLENBQUM7WUFDWCxLQUFLLEVBQUU7Z0JBQ0wsZUFBZSxFQUFFLFNBQVM7YUFDM0I7U0FDRjtLQUNGO0lBQ0QsS0FBSyxFQUFFO1FBQ0wsT0FBTyxFQUFFLFdBQVc7UUFDcEIsWUFBWSxFQUFFLG1CQUFtQjtLQUNsQztJQUNELE1BQU0sRUFBRTtRQUNOLGVBQWUsRUFBRSxTQUFTO1FBQzFCLFVBQVUsRUFBRSxNQUFNO1FBQ2xCLEtBQUssRUFBRSxNQUFNO1FBQ2IsU0FBUyxFQUFFLE1BQU07UUFDakIsT0FBTyxFQUFFLFdBQVc7UUFDcEIsU0FBUyxFQUFFLG1CQUFtQjtLQUMvQjtDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBTaWduYWwsXG4gIHNpZ25hbCxcbiAgV3JpdGFibGVTaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29sdW1uRGVmaW5pdGlvbiB9IGZyb20gJy4vZGF0YS10YWJsZS50eXBlcyc7XG5pbXBvcnQgeyBDb2x1bW5EaXJlY3RpdmUgfSBmcm9tICcuL2NvbHVtbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQmFzZVN0eWxlcywgVGFibGVTdHlsZXMgfSBmcm9tICcuL3N0eWxlLnR5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWRhdGEtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9kYXRhLXRhYmxlLmNvbXBvbmVudC5jc3MnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgRGF0YVRhYmxlQ29tcG9uZW50PFQgZXh0ZW5kcyB7IGlkOiBzdHJpbmcgfCBudW1iZXIgfT5cbiAgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudEluaXRcbntcbiAgLy8gTW9kaWZ5IGRhdGEgaW5wdXQgdG8gdXNlIGdyb3VwZWQgZGF0YVxuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICBzZXQgZGF0YSh2YWx1ZTogVFtdKSB7XG4gICAgdGhpcy5fZGF0YSA9IHZhbHVlO1xuICB9XG4gIGdldCBkYXRhKCk6IFRbXSB7XG4gICAgcmV0dXJuIHRoaXMuZ3JvdXBlZERhdGEoKTtcbiAgfVxuICBwcml2YXRlIF9kYXRhOiBUW10gPSBbXTtcbiAgLy8gTW9kaWZ5IGNvbHVtbnMgaW5wdXQgdG8gdXNlIGEgc2lnbmFsXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIHNldCBjb2x1bW5zKHZhbHVlOiBDb2x1bW5EZWZpbml0aW9uPFQ+W10pIHtcbiAgICB0aGlzLmNvbHVtbnNTaWduYWwuc2V0KHZhbHVlKTtcbiAgfVxuICAvLyBOZXcgaW5wdXRzIGZvciBncm91cGluZ1xuICBASW5wdXQoKSBncm91cEJ5Pzoga2V5b2YgVCB8ICgocm93OiBUKSA9PiBhbnkpO1xuXG4gIEBJbnB1dCgpIHN0eWxlQ29uZmlnOiBUYWJsZVN0eWxlcyA9IGRlZmF1bHRUYWJsZVN0eWxlcztcblxuICBAQ29udGVudENoaWxkcmVuKENvbHVtbkRpcmVjdGl2ZSlcbiAgY29sdW1uVGVtcGxhdGVzITogUXVlcnlMaXN0PENvbHVtbkRpcmVjdGl2ZT47XG5cbiAgQE91dHB1dCgpIHJvd0VkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XG4gIEBPdXRwdXQoKSByb3dTYXZlID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpO1xuICBAT3V0cHV0KCkgcm93RGVsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpO1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUW10+KCk7XG5cbiAgcHJpdmF0ZSBlZGl0aW5nUm93c1NpZ25hbCA9IHNpZ25hbDxTZXQ8c3RyaW5nIHwgbnVtYmVyPj4obmV3IFNldCgpKTtcbiAgcHJpdmF0ZSBzZWxlY3RlZFJvd3NTaWduYWwgPSBzaWduYWw8U2V0PHN0cmluZyB8IG51bWJlcj4+KG5ldyBTZXQoKSk7XG4gIHByaXZhdGUgZWRpdGVkRGF0YVNpZ25hbCA9IHNpZ25hbDxNYXA8c3RyaW5nIHwgbnVtYmVyLCBFZGl0ZWREYXRhPFQ+Pj4oXG4gICAgbmV3IE1hcCgpXG4gICk7XG5cbiAgY29sdW1uc1NpZ25hbDogV3JpdGFibGVTaWduYWw8Q29sdW1uRGVmaW5pdGlvbjxUPltdPiA9IHNpZ25hbChbXSk7XG5cbiAgaGFzRm9vdGVyID0gY29tcHV0ZWQoKCkgPT5cbiAgICB0aGlzLmNvbHVtbnNTaWduYWwoKS5zb21lKChjb2wpID0+IGNvbC5mb290ZXJUZW1wbGF0ZSAhPT0gdW5kZWZpbmVkKVxuICApO1xuXG4gIC8vIFR5cGUgZ3VhcmQgbWV0aG9kIHRvIGNoZWNrIGZvciBncm91cCByb3dzXG4gIGlzR3JvdXBSb3cocm93OiBUKTogcm93IGlzIFQgJiB7IGlzR3JvdXBSb3c6IHRydWU7IGdyb3VwVGl0bGU6IGFueSB9IHtcbiAgICByZXR1cm4gISEocm93IGFzIGFueSkuaXNHcm91cFJvdztcbiAgfVxuXG4gIC8vIENvbXB1dGVkIHByb3BlcnR5IGZvciBncm91cGVkIGRhdGFcbiAgZ3JvdXBlZERhdGEgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgLy8gSWYgbm8gZ3JvdXBpbmcgaXMgc3BlY2lmaWVkLCByZXR1cm4gb3JpZ2luYWwgZGF0YVxuICAgIGlmICghdGhpcy5ncm91cEJ5KSByZXR1cm4gdGhpcy5fZGF0YTtcblxuICAgIC8vIERldGVybWluZSBncm91cCBmdW5jdGlvbiBiYXNlZCBvbiBpbnB1dCB0eXBlXG4gICAgY29uc3QgZ2V0R3JvdXBWYWx1ZSA9XG4gICAgICB0eXBlb2YgdGhpcy5ncm91cEJ5ID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gdGhpcy5ncm91cEJ5XG4gICAgICAgIDogKHJvdzogVCkgPT4gcm93W3RoaXMuZ3JvdXBCeSBhcyBrZXlvZiBUXTtcblxuICAgIC8vIEdyb3VwIHRoZSBkYXRhXG4gICAgY29uc3QgZ3JvdXBzID0gbmV3IE1hcDxhbnksIFRbXT4oKTtcblxuICAgIHRoaXMuX2RhdGEuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICBjb25zdCBncm91cFZhbHVlID0gZ2V0R3JvdXBWYWx1ZShyb3cpO1xuICAgICAgY29uc3QgZXhpc3RpbmdHcm91cCA9IGdyb3Vwcy5nZXQoZ3JvdXBWYWx1ZSkgfHwgW107XG4gICAgICBncm91cHMuc2V0KGdyb3VwVmFsdWUsIFsuLi5leGlzdGluZ0dyb3VwLCByb3ddKTtcbiAgICB9KTtcblxuICAgIC8vIENvbnN0cnVjdCBmaW5hbCBncm91cGVkIGRhdGEgYXJyYXkgd2l0aCBncm91cCByb3dzXG4gICAgY29uc3QgZ3JvdXBlZERhdGFBcnJheTogKFQgJiB7IGlzR3JvdXBSb3c/OiBib29sZWFuIH0pW10gPSBbXTtcblxuICAgIGdyb3Vwcy5mb3JFYWNoKChncm91cFJvd3MsIGdyb3VwVmFsdWUpID0+IHtcbiAgICAgIC8vIENyZWF0ZSBhIGdyb3VwIHJvd1xuICAgICAgY29uc3QgZ3JvdXBSb3cgPSB7XG4gICAgICAgIGlkOiBgZ3JvdXAtJHtncm91cFZhbHVlfWAsXG4gICAgICAgIGlzR3JvdXBSb3c6IHRydWUsXG4gICAgICAgIGdyb3VwVmFsdWUsXG4gICAgICAgIGdyb3VwVGl0bGU6IGdyb3VwVmFsdWUsXG4gICAgICB9IGFzIHVua25vd24gYXMgVCAmIHsgaXNHcm91cFJvdzogYm9vbGVhbiB9O1xuXG4gICAgICBncm91cGVkRGF0YUFycmF5LnB1c2goZ3JvdXBSb3cpO1xuICAgICAgZ3JvdXBlZERhdGFBcnJheS5wdXNoKC4uLmdyb3VwUm93cyk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZ3JvdXBlZERhdGFBcnJheTtcbiAgfSk7XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgLy8gU2V0IGluaXRpYWwgY29sdW1ucyBpZiBub3QgYWxyZWFkeSBzZXRcbiAgICBpZiAodGhpcy5jb2x1bW5zU2lnbmFsKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmNvbHVtbnNTaWduYWwuc2V0KHRoaXMuY29sdW1ucyk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIHRoaXMuY29sdW1uVGVtcGxhdGVzLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHRoaXMubWVyZ2VDb2x1bW5UZW1wbGF0ZXMoKSk7XG4gICAgdGhpcy5tZXJnZUNvbHVtblRlbXBsYXRlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBtZXJnZUNvbHVtblRlbXBsYXRlcygpIHtcbiAgICAvLyBPbmx5IG1lcmdlIGlmIHdlIGhhdmUgYm90aCBjb2x1bW5zIGFuZCB0ZW1wbGF0ZXNcbiAgICBpZiAodGhpcy5jb2x1bW5zU2lnbmFsKCkubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgdXBkYXRlZENvbHVtbnMgPSB0aGlzLmNvbHVtbnNTaWduYWwoKS5tYXAoKGNvbHVtbikgPT4ge1xuICAgICAgICBjb25zdCBtYXRjaGluZ1RlbXBsYXRlID0gdGhpcy5jb2x1bW5UZW1wbGF0ZXMuZmluZChcbiAgICAgICAgICAodCkgPT4gdC5jb2x1bW5JZCA9PT0gY29sdW1uLmlkXG4gICAgICAgICk7XG4gICAgICAgIGlmIChtYXRjaGluZ1RlbXBsYXRlKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmNvbHVtbixcbiAgICAgICAgICAgIGNlbGxUZW1wbGF0ZTogbWF0Y2hpbmdUZW1wbGF0ZS5jZWxsVGVtcGxhdGUsXG4gICAgICAgICAgICBjZWxsRWRpdFRlbXBsYXRlOiBtYXRjaGluZ1RlbXBsYXRlLmNlbGxFZGl0VGVtcGxhdGUsXG4gICAgICAgICAgICBoZWFkZXJUZW1wbGF0ZTogbWF0Y2hpbmdUZW1wbGF0ZS5oZWFkZXJUZW1wbGF0ZSxcbiAgICAgICAgICAgIGZvb3RlclRlbXBsYXRlOiBtYXRjaGluZ1RlbXBsYXRlLmZvb3RlclRlbXBsYXRlLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jb2x1bW5zU2lnbmFsLnNldCh1cGRhdGVkQ29sdW1ucyk7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q2VsbFZhbHVlID0gKHJvdzogVCwgY29sdW1uOiBDb2x1bW5EZWZpbml0aW9uPFQ+KTogYW55ID0+IHtcbiAgICAvLyBGb3IgZ3JvdXAgcm93cywgcmV0dXJuIHRoZSBncm91cCB0aXRsZSBpZiBpdCBleGlzdHNcbiAgICBpZiAodGhpcy5pc0dyb3VwUm93KHJvdykpIHtcbiAgICAgIHJldHVybiAocm93IGFzIGFueSkuZ3JvdXBUaXRsZTtcbiAgICB9XG5cbiAgICAvLyBFeGlzdGluZyBsb2dpYyBmb3Igbm9ybWFsIHJvd3NcbiAgICBpZiAoY29sdW1uLmFjY2Vzc29yS2V5KSB7XG4gICAgICByZXR1cm4gKHJvdyBhcyBhbnkpW2NvbHVtbi5hY2Nlc3NvcktleV07XG4gICAgfVxuICAgIHJldHVybiBjb2x1bW4uYWNjZXNzb3JGbiA/IGNvbHVtbi5hY2Nlc3NvckZuKHJvdykgOiB1bmRlZmluZWQ7XG4gIH07XG5cbiAgaXNSb3dFZGl0aW5nID0gKHJvd0lkOiBzdHJpbmcgfCBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gdGhpcy5lZGl0aW5nUm93c1NpZ25hbCgpLmhhcyhyb3dJZCk7XG4gIH07XG5cbiAgdG9nZ2xlUm93RWRpdCA9IChyb3dJZDogc3RyaW5nIHwgbnVtYmVyKSA9PiB7XG4gICAgdGhpcy5lZGl0aW5nUm93c1NpZ25hbC51cGRhdGUoKHNldCkgPT4ge1xuICAgICAgY29uc3QgbmV3U2V0ID0gbmV3IFNldChzZXQpO1xuICAgICAgaWYgKG5ld1NldC5oYXMocm93SWQpKSB7XG4gICAgICAgIG5ld1NldC5kZWxldGUocm93SWQpO1xuICAgICAgICB0aGlzLnNhdmVSb3cocm93SWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3U2V0LmFkZChyb3dJZCk7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZUVkaXRlZERhdGEocm93SWQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ld1NldDtcbiAgICB9KTtcbiAgfTtcblxuICBwcml2YXRlIGluaXRpYWxpemVFZGl0ZWREYXRhKHJvd0lkOiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICBjb25zdCByb3cgPSB0aGlzLmRhdGEuZmluZCgocikgPT4gci5pZCA9PT0gcm93SWQpO1xuICAgIGlmIChyb3cpIHtcbiAgICAgIHRoaXMuZWRpdGVkRGF0YVNpZ25hbC51cGRhdGUoKG1hcCkgPT4ge1xuICAgICAgICBjb25zdCBuZXdNYXAgPSBuZXcgTWFwKG1hcCk7XG4gICAgICAgIG5ld01hcC5zZXQocm93SWQsIHsgLi4ucm93IH0pO1xuICAgICAgICByZXR1cm4gbmV3TWFwO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzYXZlUm93KHJvd0lkOiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICBjb25zdCBlZGl0ZWREYXRhID0gdGhpcy5lZGl0ZWREYXRhU2lnbmFsKCkuZ2V0KHJvd0lkKTtcbiAgICBpZiAoZWRpdGVkRGF0YSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxSb3dJbmRleCA9IHRoaXMuZGF0YS5maW5kSW5kZXgoKHIpID0+IHIuaWQgPT09IHJvd0lkKTtcbiAgICAgIGlmIChvcmlnaW5hbFJvd0luZGV4ICE9PSAtMSkge1xuICAgICAgICBjb25zdCB1cGRhdGVkUm93ID0geyAuLi50aGlzLmRhdGFbb3JpZ2luYWxSb3dJbmRleF0sIC4uLmVkaXRlZERhdGEgfTtcbiAgICAgICAgdGhpcy5kYXRhW29yaWdpbmFsUm93SW5kZXhdID0gdXBkYXRlZFJvdztcbiAgICAgICAgdGhpcy5yb3dTYXZlLmVtaXQodXBkYXRlZFJvdyk7XG4gICAgICAgIHRoaXMuZWRpdGVkRGF0YVNpZ25hbC51cGRhdGUoKG1hcCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5ld01hcCA9IG5ldyBNYXAobWFwKTtcbiAgICAgICAgICBuZXdNYXAuZGVsZXRlKHJvd0lkKTtcbiAgICAgICAgICByZXR1cm4gbmV3TWFwO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpc1Jvd1NlbGVjdGVkID0gKHJvd0lkOiBzdHJpbmcgfCBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFJvd3NTaWduYWwoKS5oYXMocm93SWQpO1xuICB9O1xuXG4gIHRvZ2dsZVJvd1NlbGVjdGlvbiA9IChyb3dJZDogc3RyaW5nIHwgbnVtYmVyKSA9PiB7XG4gICAgdGhpcy5zZWxlY3RlZFJvd3NTaWduYWwudXBkYXRlKChzZXQpID0+IHtcbiAgICAgIGNvbnN0IG5ld1NldCA9IG5ldyBTZXQoc2V0KTtcbiAgICAgIGlmIChuZXdTZXQuaGFzKHJvd0lkKSkge1xuICAgICAgICBuZXdTZXQuZGVsZXRlKHJvd0lkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1NldC5hZGQocm93SWQpO1xuICAgICAgfVxuICAgICAgdGhpcy5lbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgICByZXR1cm4gbmV3U2V0O1xuICAgIH0pO1xuICB9O1xuXG4gIGFsbFJvd3NTZWxlY3RlZCA9ICgpOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFJvd3NTaWduYWwoKS5zaXplID09PSB0aGlzLmRhdGEubGVuZ3RoO1xuICB9O1xuXG4gIHNvbWVSb3dzU2VsZWN0ZWQgPSAoKTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzU2lnbmFsKCkuc2l6ZSA+IDAgJiZcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzU2lnbmFsKCkuc2l6ZSA8IHRoaXMuZGF0YS5sZW5ndGhcbiAgICApO1xuICB9O1xuXG4gIHRvZ2dsZUFsbFJvd3MgPSAoKSA9PiB7XG4gICAgaWYgKHRoaXMuYWxsUm93c1NlbGVjdGVkKCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzU2lnbmFsLnNldChuZXcgU2V0KCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUm93c1NpZ25hbC5zZXQobmV3IFNldCh0aGlzLmRhdGEubWFwKChyb3cpID0+IHJvdy5pZCkpKTtcbiAgICB9XG4gICAgdGhpcy5lbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gIH07XG5cbiAgcHJpdmF0ZSBlbWl0U2VsZWN0aW9uQ2hhbmdlKCkge1xuICAgIGNvbnN0IHNlbGVjdGVkUm93cyA9IHRoaXMuZGF0YS5maWx0ZXIoKHJvdykgPT5cbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzU2lnbmFsKCkuaGFzKHJvdy5pZClcbiAgICApO1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoc2VsZWN0ZWRSb3dzKTtcbiAgfVxuXG4gIGdldEhlYWRlckNvbnRleHQoY29sdW1uOiBDb2x1bW5EZWZpbml0aW9uPFQ+KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRpbXBsaWNpdDogY29sdW1uLFxuICAgICAgY29sdW1uLFxuICAgICAgYWxsUm93c1NlbGVjdGVkOiB0aGlzLmFsbFJvd3NTZWxlY3RlZCxcbiAgICAgIHNvbWVSb3dzU2VsZWN0ZWQ6IHRoaXMuc29tZVJvd3NTZWxlY3RlZCxcbiAgICAgIHRvZ2dsZUFsbFJvd3M6IHRoaXMudG9nZ2xlQWxsUm93cyxcbiAgICB9O1xuICB9XG5cbiAgdXBkYXRlRWRpdGVkVmFsdWUocm93SWQ6IHN0cmluZyB8IG51bWJlciwgY29sdW1uSWQ6IGtleW9mIFQsIHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLmVkaXRlZERhdGFTaWduYWwudXBkYXRlKChtYXApID0+IHtcbiAgICAgIGNvbnN0IG5ld01hcCA9IG5ldyBNYXAobWFwKTtcbiAgICAgIGNvbnN0IHJvd0RhdGEgPSBuZXdNYXAuZ2V0KHJvd0lkKSB8fCAoe30gYXMgRWRpdGVkRGF0YTxUPik7XG4gICAgICBuZXdNYXAuc2V0KHJvd0lkLCB7IC4uLnJvd0RhdGEsIFtjb2x1bW5JZF06IHZhbHVlIH0pO1xuICAgICAgcmV0dXJuIG5ld01hcDtcbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZU5lc3RlZEVkaXRlZFZhbHVlKFxuICAgIHJvd0lkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgY29sdW1uSWQ6IGtleW9mIFQsXG4gICAgbmVzdGVkRmllbGQ6IHN0cmluZyxcbiAgICB2YWx1ZTogYW55XG4gICkge1xuICAgIHRoaXMuZWRpdGVkRGF0YVNpZ25hbC51cGRhdGUoKG1hcCkgPT4ge1xuICAgICAgY29uc3QgbmV3TWFwID0gbmV3IE1hcChtYXApO1xuICAgICAgY29uc3Qgcm93RGF0YSA9IG5ld01hcC5nZXQocm93SWQpIHx8ICh7fSBhcyBFZGl0ZWREYXRhPFQ+KTtcbiAgICAgIGNvbnN0IGNvbHVtbkRhdGEgPSAocm93RGF0YVtjb2x1bW5JZF0gYXMgYW55KSB8fCB7fTtcbiAgICAgIG5ld01hcC5zZXQocm93SWQsIHtcbiAgICAgICAgLi4ucm93RGF0YSxcbiAgICAgICAgW2NvbHVtbklkXToge1xuICAgICAgICAgIC4uLmNvbHVtbkRhdGEsXG4gICAgICAgICAgW25lc3RlZEZpZWxkXTogdmFsdWUsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXdNYXA7XG4gICAgfSk7XG4gIH1cblxuICBnZXRDZWxsQ29udGV4dChyb3c6IFQsIGNvbHVtbjogQ29sdW1uRGVmaW5pdGlvbjxUPiwgcm93SW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IHJvd0lkID0gcm93LmlkO1xuICAgIGNvbnN0IGlzRWRpdGluZyA9IHRoaXMuaXNSb3dFZGl0aW5nKHJvd0lkKTtcbiAgICBjb25zdCBlZGl0ZWREYXRhID0gdGhpcy5lZGl0ZWREYXRhU2lnbmFsKCkuZ2V0KHJvd0lkKTtcblxuICAgIGxldCB2YWx1ZTogYW55O1xuICAgIGlmIChpc0VkaXRpbmcgJiYgZWRpdGVkRGF0YSAmJiBjb2x1bW4uaWQgaW4gZWRpdGVkRGF0YSkge1xuICAgICAgdmFsdWUgPSBlZGl0ZWREYXRhW2NvbHVtbi5pZCBhcyBrZXlvZiBUXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgPSB0aGlzLmdldENlbGxWYWx1ZShyb3csIGNvbHVtbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICRpbXBsaWNpdDogdmFsdWUsXG4gICAgICB2YWx1ZSxcbiAgICAgIHJvdyxcbiAgICAgIGNvbHVtbixcbiAgICAgIHJvd0luZGV4LFxuICAgICAgaXNFZGl0aW5nLFxuICAgICAgaXNTZWxlY3RlZDogdGhpcy5pc1Jvd1NlbGVjdGVkKHJvd0lkKSxcbiAgICAgIHRvZ2dsZVJvd1NlbGVjdGlvbjogKCkgPT4gdGhpcy50b2dnbGVSb3dTZWxlY3Rpb24ocm93SWQpLFxuICAgICAgdG9nZ2xlUm93RWRpdDogKCkgPT4gdGhpcy50b2dnbGVSb3dFZGl0KHJvd0lkKSxcbiAgICAgIGRlbGV0ZVJvdzogKCkgPT4gdGhpcy5kZWxldGVSb3cocm93SWQpLFxuICAgICAgdXBkYXRlVmFsdWU6IChuZXdWYWx1ZTogYW55KSA9PlxuICAgICAgICB0aGlzLnVwZGF0ZUVkaXRlZFZhbHVlKHJvd0lkLCBjb2x1bW4uaWQgYXMga2V5b2YgVCwgbmV3VmFsdWUpLFxuICAgICAgdXBkYXRlTmVzdGVkVmFsdWU6IChuZXN0ZWRGaWVsZDogc3RyaW5nLCBuZXdWYWx1ZTogYW55KSA9PlxuICAgICAgICB0aGlzLnVwZGF0ZU5lc3RlZEVkaXRlZFZhbHVlKFxuICAgICAgICAgIHJvd0lkLFxuICAgICAgICAgIGNvbHVtbi5pZCBhcyBrZXlvZiBULFxuICAgICAgICAgIG5lc3RlZEZpZWxkLFxuICAgICAgICAgIG5ld1ZhbHVlXG4gICAgICAgICksXG4gICAgfTtcbiAgfVxuXG4gIGRlbGV0ZVJvdyA9IChyb3dJZDogc3RyaW5nIHwgbnVtYmVyKSA9PiB7XG4gICAgY29uc3Qgcm93VG9EZWxldGUgPSB0aGlzLmRhdGEuZmluZCgocm93KSA9PiByb3cuaWQgPT09IHJvd0lkKTtcbiAgICBpZiAocm93VG9EZWxldGUpIHtcbiAgICAgIHRoaXMucm93RGVsZXRlLmVtaXQocm93VG9EZWxldGUpO1xuICAgIH1cbiAgfTtcblxuICBnZXRGb290ZXJDb250ZXh0KGNvbHVtbjogQ29sdW1uRGVmaW5pdGlvbjxUPikge1xuICAgIHJldHVybiB7XG4gICAgICAkaW1wbGljaXQ6IGNvbHVtbixcbiAgICAgIGNvbHVtbixcbiAgICAgIGRhdGE6IHRoaXMuZGF0YSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0VGFibGVTdHlsZSgpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLnN0eWxlQ29uZmlnLFxuICAgICAgZm9udEZhbWlseTogdGhpcy5zdHlsZUNvbmZpZy5mb250RmFtaWx5LFxuICAgICAgZm9udFNpemU6IHRoaXMuc3R5bGVDb25maWcuZm9udFNpemUsXG4gICAgICB3aGl0ZVNwYWNlOiB0aGlzLnN0eWxlQ29uZmlnLndoaXRlU3BhY2UsXG4gICAgICBtYXJnaW46IHRoaXMuc3R5bGVDb25maWcubWFyZ2luLFxuICAgICAgYm9yZGVyOiB0aGlzLnN0eWxlQ29uZmlnLmJvcmRlcixcbiAgICAgIGJvcmRlckNvbGxhcHNlOiB0aGlzLnN0eWxlQ29uZmlnLmJvcmRlckNvbGxhcHNlLFxuICAgICAgYm9yZGVyU3BhY2luZzogdGhpcy5zdHlsZUNvbmZpZy5ib3JkZXJTcGFjaW5nLFxuICAgICAgdGFibGVMYXlvdXQ6IHRoaXMuc3R5bGVDb25maWcudGFibGVMYXlvdXQsXG4gICAgICB3aWR0aDogdGhpcy5zdHlsZUNvbmZpZy53aWR0aCxcbiAgICB9O1xuICB9XG5cbiAgZ2V0SGVhZGVyU3R5bGUoKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5zdHlsZUNvbmZpZy5oZWFkZXIsXG4gICAgICBwb3NpdGlvbjogdGhpcy5zdHlsZUNvbmZpZy5oZWFkZXI/LnN0aWNreVRvcCA/ICdzdGlja3knIDogJ3N0YXRpYycsXG4gICAgICB0b3A6IHRoaXMuc3R5bGVDb25maWcuaGVhZGVyPy5zdGlja3lUb3AgPyAnMCcgOiAnYXV0bycsXG4gICAgICB6SW5kZXg6IHRoaXMuc3R5bGVDb25maWcuaGVhZGVyPy56SW5kZXggfHwgJ2F1dG8nLFxuICAgIH07XG4gIH1cblxuICBnZXRGb290ZXJTdHlsZSgpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLnN0eWxlQ29uZmlnLmZvb3RlcixcbiAgICAgIHBvc2l0aW9uOiB0aGlzLnN0eWxlQ29uZmlnLmZvb3Rlcj8uc3RpY2t5Qm90dG9tID8gJ3N0aWNreScgOiAnc3RhdGljJyxcbiAgICAgIGJvdHRvbTogdGhpcy5zdHlsZUNvbmZpZy5mb290ZXI/LnN0aWNreUJvdHRvbSA/ICcwJyA6ICdhdXRvJyxcbiAgICAgIHpJbmRleDogdGhpcy5zdHlsZUNvbmZpZy5mb290ZXI/LnpJbmRleCB8fCAnYXV0bycsXG4gICAgfTtcbiAgfVxuXG4gIGdldFJvd1N0eWxlKHJvd0luZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIGNvbnN0IHJvd1N0eWxlcyA9IHRoaXMuc3R5bGVDb25maWcucm93cztcbiAgICBpZiAocm93U3R5bGVzICYmICdldmVuJyBpbiByb3dTdHlsZXMgJiYgJ29kZCcgaW4gcm93U3R5bGVzKSB7XG4gICAgICByZXR1cm4gcm93SW5kZXggJSAyID09PSAwID8gcm93U3R5bGVzLmV2ZW4gOiByb3dTdHlsZXMub2RkO1xuICAgIH0gZWxzZSBpZiAocm93U3R5bGVzICYmICdudGgnIGluIHJvd1N0eWxlcyAmJiByb3dTdHlsZXMubnRoKSB7XG4gICAgICBjb25zdCB7IGludGVydmFsLCBzdHlsZSB9ID0gcm93U3R5bGVzLm50aDtcbiAgICAgIHJldHVybiAocm93SW5kZXggKyAxKSAlIChpbnRlcnZhbCB8fCAxKSA9PT0gMCA/IHN0eWxlIDoge307XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByb3dTdHlsZXMgfHwge307XG4gICAgfVxuICB9XG5cbiAgZ2V0Q2VsbFN0eWxlKHJvd0luZGV4OiBudW1iZXIsIGNvbEluZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIGNvbnN0IGlzRmlyc3RDb2x1bW4gPSBjb2xJbmRleCA9PT0gMDtcbiAgICBjb25zdCBpc0xhc3RDb2x1bW4gPSBjb2xJbmRleCA9PT0gdGhpcy5jb2x1bW5zU2lnbmFsKCkubGVuZ3RoIC0gMTtcblxuICAgIGxldCBjZWxsU3R5bGUgPSB7IC4uLnRoaXMuc3R5bGVDb25maWcuY2VsbHMgfTtcblxuICAgIGlmIChpc0ZpcnN0Q29sdW1uKSB7XG4gICAgICBjZWxsU3R5bGUgPSB7XG4gICAgICAgIC4uLmNlbGxTdHlsZSxcbiAgICAgICAgLi4udGhpcy5zdHlsZUNvbmZpZy5maXJzdENvbHVtbixcbiAgICAgICAgcG9zaXRpb246IHRoaXMuc3R5bGVDb25maWcuZmlyc3RDb2x1bW4/LnN0aWNreUxlZnRcbiAgICAgICAgICA/ICdzdGlja3knXG4gICAgICAgICAgOiAnc3RhdGljJyxcbiAgICAgICAgbGVmdDogdGhpcy5zdHlsZUNvbmZpZy5maXJzdENvbHVtbj8uc3RpY2t5TGVmdCA/ICcwJyA6ICdhdXRvJyxcbiAgICAgICAgekluZGV4OiB0aGlzLnN0eWxlQ29uZmlnLmZpcnN0Q29sdW1uPy56SW5kZXggfHwgJ2F1dG8nLFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGlzTGFzdENvbHVtbikge1xuICAgICAgY2VsbFN0eWxlID0ge1xuICAgICAgICAuLi5jZWxsU3R5bGUsXG4gICAgICAgIC4uLnRoaXMuc3R5bGVDb25maWcubGFzdENvbHVtbixcbiAgICAgICAgcG9zaXRpb246IHRoaXMuc3R5bGVDb25maWcubGFzdENvbHVtbj8uc3RpY2t5UmlnaHRcbiAgICAgICAgICA/ICdzdGlja3knXG4gICAgICAgICAgOiAnc3RhdGljJyxcbiAgICAgICAgcmlnaHQ6IHRoaXMuc3R5bGVDb25maWcubGFzdENvbHVtbj8uc3RpY2t5UmlnaHQgPyAnMCcgOiAnYXV0bycsXG4gICAgICAgIHpJbmRleDogdGhpcy5zdHlsZUNvbmZpZy5sYXN0Q29sdW1uPy56SW5kZXggfHwgJ2F1dG8nLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAocm93SW5kZXggPj0gMCkge1xuICAgICAgLy8gQXBwbHkgYm9keSBzdHlsZXMgdG8gYWxsIGNlbGxzXG4gICAgICBjZWxsU3R5bGUgPSB7IC4uLmNlbGxTdHlsZSwgLi4udGhpcy5zdHlsZUNvbmZpZy5ib2R5IH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNlbGxTdHlsZSA9IHsgLi4udGhpcy5zdHlsZUNvbmZpZy5oZWFkZXIgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2VsbFN0eWxlO1xuICB9XG59XG5cbnR5cGUgRWRpdGVkRGF0YTxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVF0/OiBUW0tdIGV4dGVuZHMgb2JqZWN0ID8gUGFydGlhbDxUW0tdPiA6IFRbS107XG59O1xuXG4vLyBEZWZhdWx0IHN0eWxlc1xuY29uc3QgZGVmYXVsdFRhYmxlU3R5bGVzOiBUYWJsZVN0eWxlcyA9IHtcbiAgYm9yZGVyOiAnMXB4IHNvbGlkICNlMGUwZTAnLFxuICBib3JkZXJSYWRpdXM6ICc0cHgnLFxuICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gIGJveFNoYWRvdzogJzAgMnB4IDRweCByZ2JhKDAsMCwwLDAuMSknLFxuICB3aWR0aDogJzEwMCUnLFxuICBoZWFkZXI6IHtcbiAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjZjVmNWY1JyxcbiAgICBmb250V2VpZ2h0OiAnYm9sZCcsXG4gICAgY29sb3I6ICcjMzMzJyxcbiAgICB0ZXh0QWxpZ246ICdsZWZ0JyxcbiAgICBwYWRkaW5nOiAnMTJweCAxNnB4JyxcbiAgICBib3JkZXJCb3R0b206ICcycHggc29saWQgI2UwZTBlMCcsXG4gIH0sXG4gIHJvd3M6IHtcbiAgICBldmVuOiB7XG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjZmZmZmZmJyxcbiAgICB9LFxuICAgIG9kZDoge1xuICAgICAgYmFja2dyb3VuZENvbG9yOiAnI2Y5ZjlmOScsXG4gICAgfSxcbiAgICBudGg6IHtcbiAgICAgIGludGVydmFsOiA1LFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnI2YwZjBmMCcsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIGNlbGxzOiB7XG4gICAgcGFkZGluZzogJzEycHggMTZweCcsXG4gICAgYm9yZGVyQm90dG9tOiAnMXB4IHNvbGlkICNlMGUwZTAnLFxuICB9LFxuICBmb290ZXI6IHtcbiAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjZjVmNWY1JyxcbiAgICBmb250V2VpZ2h0OiAnYm9sZCcsXG4gICAgY29sb3I6ICcjMzMzJyxcbiAgICB0ZXh0QWxpZ246ICdsZWZ0JyxcbiAgICBwYWRkaW5nOiAnMTJweCAxNnB4JyxcbiAgICBib3JkZXJUb3A6ICcycHggc29saWQgI2UwZTBlMCcsXG4gIH0sXG59O1xuIiwiPHRhYmxlIFtuZ1N0eWxlXT1cImdldFRhYmxlU3R5bGUoKVwiPlxuICA8dGhlYWQ+XG4gICAgPHRyIFtuZ1N0eWxlXT1cImdldEhlYWRlclN0eWxlKClcIj5cbiAgICAgIEBmb3IgKGNvbHVtbiBvZiBjb2x1bW5zU2lnbmFsKCk7IHRyYWNrIGNvbHVtbi5pZCkge1xuICAgICAgPHRoIFtuZ1N0eWxlXT1cImdldENlbGxTdHlsZSgtMSwgJGluZGV4KVwiPlxuICAgICAgICBAaWYgKGNvbHVtbi5oZWFkZXJUZW1wbGF0ZSkge1xuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29sdW1uLmhlYWRlclRlbXBsYXRlXCJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0SGVhZGVyQ29udGV4dChjb2x1bW4pXCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAge3sgY29sdW1uLmhlYWRlciB9fVxuICAgICAgICB9XG4gICAgICA8L3RoPlxuICAgICAgfVxuICAgIDwvdHI+XG4gIDwvdGhlYWQ+XG4gIDx0Ym9keT5cbiAgICBAZm9yIChyb3cgb2YgZGF0YTsgdHJhY2sgcm93LmlkOyBsZXQgcm93SW5kZXggPSAkaW5kZXgpIHsgQGlmXG4gICAgKGlzR3JvdXBSb3cocm93KSkge1xuICAgIDx0ciBjbGFzcz1cImdyb3VwLXJvd1wiIFtuZ1N0eWxlXT1cImdldFJvd1N0eWxlKHJvd0luZGV4KVwiPlxuICAgICAgPHRkXG4gICAgICAgIFthdHRyLmNvbHNwYW5dPVwiY29sdW1uc1NpZ25hbCgpLmxlbmd0aFwiXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldENlbGxTdHlsZShyb3dJbmRleCwgMClcIlxuICAgICAgPlxuICAgICAgICB7eyBnZXRDZWxsVmFsdWUocm93LCBjb2x1bW5zU2lnbmFsKClbMF0pIH19XG4gICAgICA8L3RkPlxuICAgIDwvdHI+XG4gICAgfSBAZWxzZSB7XG4gICAgPHRyIFtuZ1N0eWxlXT1cImdldFJvd1N0eWxlKHJvd0luZGV4KVwiPlxuICAgICAgQGZvciAoY29sdW1uIG9mIGNvbHVtbnNTaWduYWwoKTsgdHJhY2sgY29sdW1uLmlkOyBsZXQgY29sSW5kZXggPSAkaW5kZXgpIHtcbiAgICAgIDx0ZCBbbmdTdHlsZV09XCJnZXRDZWxsU3R5bGUocm93SW5kZXgsIGNvbEluZGV4KVwiPlxuICAgICAgICBAaWYgKGlzUm93RWRpdGluZyhyb3cuaWQpICYmIGNvbHVtbi5jZWxsRWRpdFRlbXBsYXRlKSB7XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjb2x1bW4uY2VsbEVkaXRUZW1wbGF0ZVwiXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldENlbGxDb250ZXh0KHJvdywgY29sdW1uLCByb3dJbmRleClcIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgIH0gQGVsc2UgaWYgKGNvbHVtbi5jZWxsVGVtcGxhdGUpIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbHVtbi5jZWxsVGVtcGxhdGVcIlxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRDZWxsQ29udGV4dChyb3csIGNvbHVtbiwgcm93SW5kZXgpXCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAge3sgZ2V0Q2VsbFZhbHVlKHJvdywgY29sdW1uKSB9fVxuICAgICAgICB9XG4gICAgICA8L3RkPlxuICAgICAgfVxuICAgIDwvdHI+XG4gICAgfSB9XG4gIDwvdGJvZHk+XG4gIEBpZiAoaGFzRm9vdGVyKCkpIHtcbiAgPHRmb290PlxuICAgIDx0ciBbbmdTdHlsZV09XCJnZXRGb290ZXJTdHlsZSgpXCI+XG4gICAgICBAZm9yIChjb2x1bW4gb2YgY29sdW1uc1NpZ25hbCgpOyB0cmFjayBjb2x1bW4uaWQpIHtcbiAgICAgIDx0ZCBbbmdTdHlsZV09XCJnZXRDZWxsU3R5bGUoLTEsICRpbmRleClcIj5cbiAgICAgICAgQGlmIChjb2x1bW4uZm9vdGVyVGVtcGxhdGUpIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbHVtbi5mb290ZXJUZW1wbGF0ZVwiXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldEZvb3RlckNvbnRleHQoY29sdW1uKVwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgfVxuICAgICAgPC90ZD5cbiAgICAgIH1cbiAgICA8L3RyPlxuICA8L3Rmb290PlxuICB9XG48L3RhYmxlPlxuIl19
402
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92ZXJiZW4tbmctdWkvc3JjL2xpYi9jb21wb25lbnRzL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsZUFBZSxFQUNmLFlBQVksRUFDWixLQUFLLEVBQ0wsS0FBSyxFQUVMLE1BQU0sRUFHTixNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7QUFTckQsTUFBTSxPQUFPLGtCQUFrQjtJQUc3Qix3Q0FBd0M7SUFDeEMsSUFBSSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQU8sQ0FBQztJQUM3QixPQUFPLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBeUIsQ0FBQztJQUNsRCw2QkFBNkI7SUFDN0IseUJBQXlCO0lBQ3pCLHdCQUF3QjtJQUN4QixJQUFJO0lBQ0osb0JBQW9CO0lBQ3BCLCtCQUErQjtJQUMvQixJQUFJO0lBQ0osMkJBQTJCO0lBQzNCLHVDQUF1QztJQUN2Qyw2QkFBNkI7SUFDN0IsOENBQThDO0lBQzlDLG1DQUFtQztJQUNuQyxJQUFJO0lBQ0osMEJBQTBCO0lBQzFCLE9BQU8sR0FBRyxLQUFLLEVBQStCLENBQUM7SUFFdEMsV0FBVyxHQUFnQixrQkFBa0IsQ0FBQztJQUd2RCxlQUFlLENBQThCO0lBRW5DLE9BQU8sR0FBRyxJQUFJLFlBQVksRUFBSyxDQUFDO0lBQ2hDLE9BQU8sR0FBRyxJQUFJLFlBQVksRUFBSyxDQUFDO0lBQ2hDLFNBQVMsR0FBRyxJQUFJLFlBQVksRUFBSyxDQUFDO0lBQ2xDLGVBQWUsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO0lBRTVDLGlCQUFpQixHQUFHLE1BQU0sQ0FBdUIsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzVELGtCQUFrQixHQUFHLE1BQU0sQ0FBdUIsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzdELGdCQUFnQixHQUFHLE1BQU0sQ0FDL0IsSUFBSSxHQUFHLEVBQUUsQ0FDVixDQUFDO0lBRUYsYUFBYSxHQUEwQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFbEUsU0FBUyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FDeEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLGNBQWMsS0FBSyxTQUFTLENBQUMsQ0FDckUsQ0FBQztJQUVGLDRDQUE0QztJQUM1QyxVQUFVLENBQUMsR0FBTTtRQUNmLE9BQU8sQ0FBQyxDQUFFLEdBQVcsQ0FBQyxVQUFVLENBQUM7SUFDbkMsQ0FBQztJQUVELHFDQUFxQztJQUNyQyxXQUFXLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUMxQixvREFBb0Q7UUFDcEQsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFBRSxPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUV4QywrQ0FBK0M7UUFDL0MsTUFBTSxhQUFhLEdBQ2pCLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLFVBQVU7WUFDbEMsQ0FBQyxDQUFFLElBQUksQ0FBQyxPQUFPLEVBQXNCO1lBQ3JDLENBQUMsQ0FBQyxDQUFDLEdBQU0sRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQWEsQ0FBQyxDQUFDO1FBRWpELGlCQUFpQjtRQUNqQixNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBWSxDQUFDO1FBRW5DLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUMxQixJQUFJLGFBQWEsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDaEMsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN0QyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDbkQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxHQUFHLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2xELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILHFEQUFxRDtRQUNyRCxNQUFNLGdCQUFnQixHQUFxQyxFQUFFLENBQUM7UUFFOUQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsRUFBRTtZQUN2QyxxQkFBcUI7WUFDckIsTUFBTSxRQUFRLEdBQUc7Z0JBQ2YsRUFBRSxFQUFFLFNBQVMsVUFBVSxFQUFFO2dCQUN6QixVQUFVLEVBQUUsSUFBSTtnQkFDaEIsVUFBVTtnQkFDVixVQUFVLEVBQUUsVUFBVTthQUNtQixDQUFDO1lBRTVDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNoQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRO1FBQ04seUNBQXlDO1FBQ3pDLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN6QyxDQUFDO0lBQ0gsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQztRQUMxRSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRU8sb0JBQW9CO1FBQzFCLG1EQUFtRDtRQUNuRCxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDcEMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUN6RCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUNoRCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxNQUFNLENBQUMsRUFBRSxDQUNoQyxDQUFDO2dCQUNGLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztvQkFDckIsT0FBTzt3QkFDTCxHQUFHLE1BQU07d0JBQ1QsWUFBWSxFQUFFLGdCQUFnQixDQUFDLFlBQVk7d0JBQzNDLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDLGdCQUFnQjt3QkFDbkQsY0FBYyxFQUFFLGdCQUFnQixDQUFDLGNBQWM7d0JBQy9DLGNBQWMsRUFBRSxnQkFBZ0IsQ0FBQyxjQUFjO3FCQUNoRCxDQUFDO2dCQUNKLENBQUM7Z0JBQ0QsT0FBTyxNQUFNLENBQUM7WUFDaEIsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN6QyxDQUFDO0lBQ0gsQ0FBQztJQUVELFlBQVksR0FBRyxDQUFDLEdBQU0sRUFBRSxNQUEyQixFQUFPLEVBQUU7UUFDMUQsc0RBQXNEO1FBQ3RELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE9BQVEsR0FBVyxDQUFDLFVBQVUsQ0FBQztRQUNqQyxDQUFDO1FBRUQsaUNBQWlDO1FBQ2pDLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3ZCLE9BQVEsR0FBVyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxQyxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDaEUsQ0FBQyxDQUFDO0lBRUYsWUFBWSxHQUFHLENBQUMsS0FBc0IsRUFBVyxFQUFFO1FBQ2pELE9BQU8sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdDLENBQUMsQ0FBQztJQUVGLGFBQWEsR0FBRyxDQUFDLEtBQXNCLEVBQUUsRUFBRTtRQUN6QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDcEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDNUIsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3RCLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuQyxDQUFDO1lBQ0QsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUM7SUFFTSxvQkFBb0IsQ0FBQyxLQUFzQjtRQUNqRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEtBQUssQ0FBQyxDQUFDO1FBQ3BELElBQUksR0FBRyxFQUFFLENBQUM7WUFDUixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ25DLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM1QixNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDOUIsT0FBTyxNQUFNLENBQUM7WUFDaEIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVPLE9BQU8sQ0FBQyxLQUFzQjtRQUNwQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEQsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNmLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxLQUFLLENBQUMsQ0FBQztZQUN0RSxJQUFJLGdCQUFnQixLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzVCLE1BQU0sVUFBVSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxHQUFHLFVBQVUsRUFBRSxDQUFDO2dCQUN2RSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxVQUFVLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUM5QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7b0JBQ25DLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUM1QixNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNyQixPQUFPLE1BQU0sQ0FBQztnQkFDaEIsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxhQUFhLEdBQUcsQ0FBQyxLQUFzQixFQUFXLEVBQUU7UUFDbEQsT0FBTyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUMsQ0FBQyxDQUFDO0lBRUYsa0JBQWtCLEdBQUcsQ0FBQyxLQUFzQixFQUFFLEVBQUU7UUFDOUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3JDLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzVCLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN0QixNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3BCLENBQUM7WUFDRCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUMzQixPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztJQUVGLGVBQWUsR0FBRyxHQUFZLEVBQUU7UUFDOUIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDN0QsQ0FBQyxDQUFDO0lBRUYsZ0JBQWdCLEdBQUcsR0FBWSxFQUFFO1FBQy9CLE9BQU8sQ0FDTCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQztZQUNsQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQ2xELENBQUM7SUFDSixDQUFDLENBQUM7SUFFRixhQUFhLEdBQUcsR0FBRyxFQUFFO1FBQ25CLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDekMsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekUsQ0FBQztRQUNELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzdCLENBQUMsQ0FBQztJQUVNLG1CQUFtQjtRQUN6QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FDOUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FDdEMsQ0FBQztRQUNGLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxNQUEyQjtRQUMxQyxPQUFPO1lBQ0wsU0FBUyxFQUFFLE1BQU07WUFDakIsTUFBTTtZQUNOLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZTtZQUNyQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsZ0JBQWdCO1lBQ3ZDLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtTQUNsQyxDQUFDO0lBQ0osQ0FBQztJQUVELGlCQUFpQixDQUFDLEtBQXNCLEVBQUUsUUFBaUIsRUFBRSxLQUFVO1FBQ3JFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNuQyxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM1QixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFLLEVBQW9CLENBQUM7WUFDM0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDckQsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsdUJBQXVCLENBQ3JCLEtBQXNCLEVBQ3RCLFFBQWlCLEVBQ2pCLFdBQW1CLEVBQ25CLEtBQVU7UUFFVixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDbkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDNUIsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSyxFQUFvQixDQUFDO1lBQzNELE1BQU0sVUFBVSxHQUFJLE9BQU8sQ0FBQyxRQUFRLENBQVMsSUFBSSxFQUFFLENBQUM7WUFDcEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUU7Z0JBQ2hCLEdBQUcsT0FBTztnQkFDVixDQUFDLFFBQVEsQ0FBQyxFQUFFO29CQUNWLEdBQUcsVUFBVTtvQkFDYixDQUFDLFdBQVcsQ0FBQyxFQUFFLEtBQUs7aUJBQ3JCO2FBQ0YsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsY0FBYyxDQUFDLEdBQU0sRUFBRSxNQUEyQixFQUFFLFFBQWdCO1FBQ2xFLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDckIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFdEQsSUFBSSxLQUFVLENBQUM7UUFDZixJQUFJLFNBQVMsSUFBSSxVQUFVLElBQUksTUFBTSxDQUFDLEVBQUUsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUN2RCxLQUFLLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFhLENBQUMsQ0FBQztRQUMzQyxDQUFDO2FBQU0sQ0FBQztZQUNOLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBRUQsT0FBTztZQUNMLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLEtBQUs7WUFDTCxHQUFHO1lBQ0gsTUFBTTtZQUNOLFFBQVE7WUFDUixTQUFTO1lBQ1QsVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO1lBQ3JDLGtCQUFrQixFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUM7WUFDeEQsYUFBYSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO1lBQzlDLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztZQUN0QyxXQUFXLEVBQUUsQ0FBQyxRQUFhLEVBQUUsRUFBRSxDQUM3QixJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxFQUFhLEVBQUUsUUFBUSxDQUFDO1lBQy9ELGlCQUFpQixFQUFFLENBQUMsV0FBbUIsRUFBRSxRQUFhLEVBQUUsRUFBRSxDQUN4RCxJQUFJLENBQUMsdUJBQXVCLENBQzFCLEtBQUssRUFDTCxNQUFNLENBQUMsRUFBYSxFQUNwQixXQUFXLEVBQ1gsUUFBUSxDQUNUO1NBQ0osQ0FBQztJQUNKLENBQUM7SUFFRCxTQUFTLEdBQUcsQ0FBQyxLQUFzQixFQUFFLEVBQUU7UUFDckMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxLQUFLLENBQUMsQ0FBQztRQUNoRSxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDLENBQUM7SUFFRixnQkFBZ0IsQ0FBQyxNQUEyQjtRQUMxQyxPQUFPO1lBQ0wsU0FBUyxFQUFFLE1BQU07WUFDakIsTUFBTTtZQUNOLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtTQUNoQixDQUFDO0lBQ0osQ0FBQztJQUVELGFBQWE7UUFDWCxPQUFPO1lBQ0wsR0FBRyxJQUFJLENBQUMsV0FBVztZQUNuQixVQUFVLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVO1lBQ3ZDLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVE7WUFDbkMsVUFBVSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVTtZQUN2QyxNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNO1lBQy9CLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU07WUFDL0IsY0FBYyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYztZQUMvQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhO1lBQzdDLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVc7WUFDekMsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSztTQUM5QixDQUFDO0lBQ0osQ0FBQztJQUVELGNBQWM7UUFDWixPQUFPO1lBQ0wsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU07WUFDMUIsUUFBUSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRO1lBQ2xFLEdBQUcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTTtZQUN0RCxNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxJQUFJLE1BQU07U0FDbEQsQ0FBQztJQUNKLENBQUM7SUFFRCxjQUFjO1FBQ1osT0FBTztZQUNMLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNO1lBQzFCLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUTtZQUNyRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU07WUFDNUQsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLE1BQU0sSUFBSSxNQUFNO1NBQ2xELENBQUM7SUFDSixDQUFDO0lBRUQsV0FBVyxDQUFDLFFBQWdCO1FBQzFCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO1FBQ3hDLElBQUksU0FBUyxJQUFJLE1BQU0sSUFBSSxTQUFTLElBQUksS0FBSyxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQzNELE9BQU8sUUFBUSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7UUFDN0QsQ0FBQzthQUFNLElBQUksU0FBUyxJQUFJLEtBQUssSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQzVELE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQztZQUMxQyxPQUFPLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDN0QsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLFNBQVMsSUFBSSxFQUFFLENBQUM7UUFDekIsQ0FBQztJQUNILENBQUM7SUFFRCxZQUFZLENBQUMsUUFBZ0IsRUFBRSxRQUFnQjtRQUM3QyxNQUFNLGFBQWEsR0FBRyxRQUFRLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sWUFBWSxHQUFHLFFBQVEsS0FBSyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUVsRSxJQUFJLFNBQVMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUU5QyxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2xCLFNBQVMsR0FBRztnQkFDVixHQUFHLFNBQVM7Z0JBQ1osR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVc7Z0JBQy9CLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxVQUFVO29CQUNoRCxDQUFDLENBQUMsUUFBUTtvQkFDVixDQUFDLENBQUMsUUFBUTtnQkFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU07Z0JBQzdELE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxNQUFNLElBQUksTUFBTTthQUN2RCxDQUFDO1FBQ0osQ0FBQzthQUFNLElBQUksWUFBWSxFQUFFLENBQUM7WUFDeEIsU0FBUyxHQUFHO2dCQUNWLEdBQUcsU0FBUztnQkFDWixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVTtnQkFDOUIsUUFBUSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLFdBQVc7b0JBQ2hELENBQUMsQ0FBQyxRQUFRO29CQUNWLENBQUMsQ0FBQyxRQUFRO2dCQUNaLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTTtnQkFDOUQsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLE1BQU0sSUFBSSxNQUFNO2FBQ3RELENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxRQUFRLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDbEIsaUNBQWlDO1lBQ2pDLFNBQVMsR0FBRyxFQUFFLEdBQUcsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN6RCxDQUFDO2FBQU0sQ0FBQztZQUNOLFNBQVMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM3QyxDQUFDO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQzt1R0E5WVUsa0JBQWtCOzJGQUFsQixrQkFBa0IsNnNCQXdCWixlQUFlLDZCQ2xEbEMsMm1FQW1FQTs7MkZEekNhLGtCQUFrQjtrQkFOOUIsU0FBUzsrQkFDRSxnQkFBZ0IsbUJBR1QsdUJBQXVCLENBQUMsTUFBTTs4QkF3QnRDLFdBQVc7c0JBQW5CLEtBQUs7Z0JBR04sZUFBZTtzQkFEZCxlQUFlO3VCQUFDLGVBQWU7Z0JBR3RCLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0csT0FBTztzQkFBaEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07O0FBdVhULGlCQUFpQjtBQUNqQixNQUFNLGtCQUFrQixHQUFnQjtJQUN0QyxNQUFNLEVBQUUsbUJBQW1CO0lBQzNCLFlBQVksRUFBRSxLQUFLO0lBQ25CLFFBQVEsRUFBRSxRQUFRO0lBQ2xCLFNBQVMsRUFBRSwyQkFBMkI7SUFDdEMsS0FBSyxFQUFFLE1BQU07SUFDYixNQUFNLEVBQUU7UUFDTixlQUFlLEVBQUUsU0FBUztRQUMxQixVQUFVLEVBQUUsTUFBTTtRQUNsQixLQUFLLEVBQUUsTUFBTTtRQUNiLFNBQVMsRUFBRSxNQUFNO1FBQ2pCLE9BQU8sRUFBRSxXQUFXO1FBQ3BCLFlBQVksRUFBRSxtQkFBbUI7S0FDbEM7SUFDRCxJQUFJLEVBQUU7UUFDSixJQUFJLEVBQUU7WUFDSixlQUFlLEVBQUUsU0FBUztTQUMzQjtRQUNELEdBQUcsRUFBRTtZQUNILGVBQWUsRUFBRSxTQUFTO1NBQzNCO1FBQ0QsR0FBRyxFQUFFO1lBQ0gsUUFBUSxFQUFFLENBQUM7WUFDWCxLQUFLLEVBQUU7Z0JBQ0wsZUFBZSxFQUFFLFNBQVM7YUFDM0I7U0FDRjtLQUNGO0lBQ0QsS0FBSyxFQUFFO1FBQ0wsT0FBTyxFQUFFLFdBQVc7UUFDcEIsWUFBWSxFQUFFLG1CQUFtQjtLQUNsQztJQUNELE1BQU0sRUFBRTtRQUNOLGVBQWUsRUFBRSxTQUFTO1FBQzFCLFVBQVUsRUFBRSxNQUFNO1FBQ2xCLEtBQUssRUFBRSxNQUFNO1FBQ2IsU0FBUyxFQUFFLE1BQU07UUFDakIsT0FBTyxFQUFFLFdBQVc7UUFDcEIsU0FBUyxFQUFFLG1CQUFtQjtLQUMvQjtDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFdmVudEVtaXR0ZXIsXG4gIGlucHV0LFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgU2lnbmFsLFxuICBzaWduYWwsXG4gIFdyaXRhYmxlU2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbHVtbkRlZmluaXRpb24gfSBmcm9tICcuL2RhdGEtdGFibGUudHlwZXMnO1xuaW1wb3J0IHsgQ29sdW1uRGlyZWN0aXZlIH0gZnJvbSAnLi9jb2x1bW4uZGlyZWN0aXZlJztcbmltcG9ydCB7IEJhc2VTdHlsZXMsIFRhYmxlU3R5bGVzIH0gZnJvbSAnLi9zdHlsZS50eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1kYXRhLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZGF0YS10YWJsZS5jb21wb25lbnQuY3NzJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIERhdGFUYWJsZUNvbXBvbmVudDxUIGV4dGVuZHMgeyBpZDogc3RyaW5nIHwgbnVtYmVyIH0+XG4gIGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0XG57XG4gIC8vIE1vZGlmeSBkYXRhIGlucHV0IHRvIHVzZSBncm91cGVkIGRhdGFcbiAgZGF0YSA9IGlucHV0LnJlcXVpcmVkPFRbXT4oKTtcbiAgY29sdW1ucyA9IGlucHV0LnJlcXVpcmVkPENvbHVtbkRlZmluaXRpb248VD5bXT4oKTtcbiAgLy8gQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgLy8gc2V0IGRhdGEodmFsdWU6IFRbXSkge1xuICAvLyAgIHRoaXMuX2RhdGEgPSB2YWx1ZTtcbiAgLy8gfVxuICAvLyBnZXQgZGF0YSgpOiBUW10ge1xuICAvLyAgIHJldHVybiB0aGlzLmdyb3VwZWREYXRhKCk7XG4gIC8vIH1cbiAgLy8gcHJpdmF0ZSBfZGF0YTogVFtdID0gW107XG4gIC8vIE1vZGlmeSBjb2x1bW5zIGlucHV0IHRvIHVzZSBhIHNpZ25hbFxuICAvLyBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICAvLyBzZXQgY29sdW1ucyh2YWx1ZTogQ29sdW1uRGVmaW5pdGlvbjxUPltdKSB7XG4gIC8vICAgdGhpcy5jb2x1bW5zU2lnbmFsLnNldCh2YWx1ZSk7XG4gIC8vIH1cbiAgLy8gTmV3IGlucHV0cyBmb3IgZ3JvdXBpbmdcbiAgZ3JvdXBCeSA9IGlucHV0PGtleW9mIFQgfCAoKHJvdzogVCkgPT4gYW55KT4oKTtcblxuICBASW5wdXQoKSBzdHlsZUNvbmZpZzogVGFibGVTdHlsZXMgPSBkZWZhdWx0VGFibGVTdHlsZXM7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihDb2x1bW5EaXJlY3RpdmUpXG4gIGNvbHVtblRlbXBsYXRlcyE6IFF1ZXJ5TGlzdDxDb2x1bW5EaXJlY3RpdmU+O1xuXG4gIEBPdXRwdXQoKSByb3dFZGl0ID0gbmV3IEV2ZW50RW1pdHRlcjxUPigpO1xuICBAT3V0cHV0KCkgcm93U2F2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8VD4oKTtcbiAgQE91dHB1dCgpIHJvd0RlbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8VD4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VFtdPigpO1xuXG4gIHByaXZhdGUgZWRpdGluZ1Jvd3NTaWduYWwgPSBzaWduYWw8U2V0PHN0cmluZyB8IG51bWJlcj4+KG5ldyBTZXQoKSk7XG4gIHByaXZhdGUgc2VsZWN0ZWRSb3dzU2lnbmFsID0gc2lnbmFsPFNldDxzdHJpbmcgfCBudW1iZXI+PihuZXcgU2V0KCkpO1xuICBwcml2YXRlIGVkaXRlZERhdGFTaWduYWwgPSBzaWduYWw8TWFwPHN0cmluZyB8IG51bWJlciwgRWRpdGVkRGF0YTxUPj4+KFxuICAgIG5ldyBNYXAoKVxuICApO1xuXG4gIGNvbHVtbnNTaWduYWw6IFdyaXRhYmxlU2lnbmFsPENvbHVtbkRlZmluaXRpb248VD5bXT4gPSBzaWduYWwoW10pO1xuXG4gIGhhc0Zvb3RlciA9IGNvbXB1dGVkKCgpID0+XG4gICAgdGhpcy5jb2x1bW5zU2lnbmFsKCkuc29tZSgoY29sKSA9PiBjb2wuZm9vdGVyVGVtcGxhdGUgIT09IHVuZGVmaW5lZClcbiAgKTtcblxuICAvLyBUeXBlIGd1YXJkIG1ldGhvZCB0byBjaGVjayBmb3IgZ3JvdXAgcm93c1xuICBpc0dyb3VwUm93KHJvdzogVCk6IHJvdyBpcyBUICYgeyBpc0dyb3VwUm93OiB0cnVlOyBncm91cFRpdGxlOiBhbnkgfSB7XG4gICAgcmV0dXJuICEhKHJvdyBhcyBhbnkpLmlzR3JvdXBSb3c7XG4gIH1cblxuICAvLyBDb21wdXRlZCBwcm9wZXJ0eSBmb3IgZ3JvdXBlZCBkYXRhXG4gIGdyb3VwZWREYXRhID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIC8vIElmIG5vIGdyb3VwaW5nIGlzIHNwZWNpZmllZCwgcmV0dXJuIG9yaWdpbmFsIGRhdGFcbiAgICBpZiAoIXRoaXMuZ3JvdXBCeSgpKSByZXR1cm4gdGhpcy5kYXRhKCk7XG5cbiAgICAvLyBEZXRlcm1pbmUgZ3JvdXAgZnVuY3Rpb24gYmFzZWQgb24gaW5wdXQgdHlwZVxuICAgIGNvbnN0IGdldEdyb3VwVmFsdWUgPVxuICAgICAgdHlwZW9mIHRoaXMuZ3JvdXBCeSgpID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gKHRoaXMuZ3JvdXBCeSgpIGFzIChyb3c6IFQpID0+IGFueSlcbiAgICAgICAgOiAocm93OiBUKSA9PiByb3dbdGhpcy5ncm91cEJ5KCkgYXMga2V5b2YgVF07XG5cbiAgICAvLyBHcm91cCB0aGUgZGF0YVxuICAgIGNvbnN0IGdyb3VwcyA9IG5ldyBNYXA8YW55LCBUW10+KCk7XG5cbiAgICB0aGlzLmRhdGEoKS5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgIGlmIChnZXRHcm91cFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgZ3JvdXBWYWx1ZSA9IGdldEdyb3VwVmFsdWUocm93KTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdHcm91cCA9IGdyb3Vwcy5nZXQoZ3JvdXBWYWx1ZSkgfHwgW107XG4gICAgICAgIGdyb3Vwcy5zZXQoZ3JvdXBWYWx1ZSwgWy4uLmV4aXN0aW5nR3JvdXAsIHJvd10pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQ29uc3RydWN0IGZpbmFsIGdyb3VwZWQgZGF0YSBhcnJheSB3aXRoIGdyb3VwIHJvd3NcbiAgICBjb25zdCBncm91cGVkRGF0YUFycmF5OiAoVCAmIHsgaXNHcm91cFJvdz86IGJvb2xlYW4gfSlbXSA9IFtdO1xuXG4gICAgZ3JvdXBzLmZvckVhY2goKGdyb3VwUm93cywgZ3JvdXBWYWx1ZSkgPT4ge1xuICAgICAgLy8gQ3JlYXRlIGEgZ3JvdXAgcm93XG4gICAgICBjb25zdCBncm91cFJvdyA9IHtcbiAgICAgICAgaWQ6IGBncm91cC0ke2dyb3VwVmFsdWV9YCxcbiAgICAgICAgaXNHcm91cFJvdzogdHJ1ZSxcbiAgICAgICAgZ3JvdXBWYWx1ZSxcbiAgICAgICAgZ3JvdXBUaXRsZTogZ3JvdXBWYWx1ZSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBUICYgeyBpc0dyb3VwUm93OiBib29sZWFuIH07XG5cbiAgICAgIGdyb3VwZWREYXRhQXJyYXkucHVzaChncm91cFJvdyk7XG4gICAgICBncm91cGVkRGF0YUFycmF5LnB1c2goLi4uZ3JvdXBSb3dzKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBncm91cGVkRGF0YUFycmF5O1xuICB9KTtcblxuICBuZ09uSW5pdCgpIHtcbiAgICAvLyBTZXQgaW5pdGlhbCBjb2x1bW5zIGlmIG5vdCBhbHJlYWR5IHNldFxuICAgIGlmICh0aGlzLmNvbHVtbnNTaWduYWwoKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuY29sdW1uc1NpZ25hbC5zZXQodGhpcy5jb2x1bW5zKCkpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICB0aGlzLmNvbHVtblRlbXBsYXRlcy5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLm1lcmdlQ29sdW1uVGVtcGxhdGVzKCkpO1xuICAgIHRoaXMubWVyZ2VDb2x1bW5UZW1wbGF0ZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgbWVyZ2VDb2x1bW5UZW1wbGF0ZXMoKSB7XG4gICAgLy8gT25seSBtZXJnZSBpZiB3ZSBoYXZlIGJvdGggY29sdW1ucyBhbmQgdGVtcGxhdGVzXG4gICAgaWYgKHRoaXMuY29sdW1uc1NpZ25hbCgpLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRDb2x1bW5zID0gdGhpcy5jb2x1bW5zU2lnbmFsKCkubWFwKChjb2x1bW4pID0+IHtcbiAgICAgICAgY29uc3QgbWF0Y2hpbmdUZW1wbGF0ZSA9IHRoaXMuY29sdW1uVGVtcGxhdGVzLmZpbmQoXG4gICAgICAgICAgKHQpID0+IHQuY29sdW1uSWQgPT09IGNvbHVtbi5pZFxuICAgICAgICApO1xuICAgICAgICBpZiAobWF0Y2hpbmdUZW1wbGF0ZSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgICAgICBjZWxsVGVtcGxhdGU6IG1hdGNoaW5nVGVtcGxhdGUuY2VsbFRlbXBsYXRlLFxuICAgICAgICAgICAgY2VsbEVkaXRUZW1wbGF0ZTogbWF0Y2hpbmdUZW1wbGF0ZS5jZWxsRWRpdFRlbXBsYXRlLFxuICAgICAgICAgICAgaGVhZGVyVGVtcGxhdGU6IG1hdGNoaW5nVGVtcGxhdGUuaGVhZGVyVGVtcGxhdGUsXG4gICAgICAgICAgICBmb290ZXJUZW1wbGF0ZTogbWF0Y2hpbmdUZW1wbGF0ZS5mb290ZXJUZW1wbGF0ZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2x1bW47XG4gICAgICB9KTtcbiAgICAgIHRoaXMuY29sdW1uc1NpZ25hbC5zZXQodXBkYXRlZENvbHVtbnMpO1xuICAgIH1cbiAgfVxuXG4gIGdldENlbGxWYWx1ZSA9IChyb3c6IFQsIGNvbHVtbjogQ29sdW1uRGVmaW5pdGlvbjxUPik6IGFueSA9PiB7XG4gICAgLy8gRm9yIGdyb3VwIHJvd3MsIHJldHVybiB0aGUgZ3JvdXAgdGl0bGUgaWYgaXQgZXhpc3RzXG4gICAgaWYgKHRoaXMuaXNHcm91cFJvdyhyb3cpKSB7XG4gICAgICByZXR1cm4gKHJvdyBhcyBhbnkpLmdyb3VwVGl0bGU7XG4gICAgfVxuXG4gICAgLy8gRXhpc3RpbmcgbG9naWMgZm9yIG5vcm1hbCByb3dzXG4gICAgaWYgKGNvbHVtbi5hY2Nlc3NvcktleSkge1xuICAgICAgcmV0dXJuIChyb3cgYXMgYW55KVtjb2x1bW4uYWNjZXNzb3JLZXldO1xuICAgIH1cbiAgICByZXR1cm4gY29sdW1uLmFjY2Vzc29yRm4gPyBjb2x1bW4uYWNjZXNzb3JGbihyb3cpIDogdW5kZWZpbmVkO1xuICB9O1xuXG4gIGlzUm93RWRpdGluZyA9IChyb3dJZDogc3RyaW5nIHwgbnVtYmVyKTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdGluZ1Jvd3NTaWduYWwoKS5oYXMocm93SWQpO1xuICB9O1xuXG4gIHRvZ2dsZVJvd0VkaXQgPSAocm93SWQ6IHN0cmluZyB8IG51bWJlcikgPT4ge1xuICAgIHRoaXMuZWRpdGluZ1Jvd3NTaWduYWwudXBkYXRlKChzZXQpID0+IHtcbiAgICAgIGNvbnN0IG5ld1NldCA9IG5ldyBTZXQoc2V0KTtcbiAgICAgIGlmIChuZXdTZXQuaGFzKHJvd0lkKSkge1xuICAgICAgICBuZXdTZXQuZGVsZXRlKHJvd0lkKTtcbiAgICAgICAgdGhpcy5zYXZlUm93KHJvd0lkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1NldC5hZGQocm93SWQpO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVFZGl0ZWREYXRhKHJvd0lkKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXdTZXQ7XG4gICAgfSk7XG4gIH07XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplRWRpdGVkRGF0YShyb3dJZDogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgY29uc3Qgcm93ID0gdGhpcy5kYXRhKCkuZmluZCgocikgPT4gci5pZCA9PT0gcm93SWQpO1xuICAgIGlmIChyb3cpIHtcbiAgICAgIHRoaXMuZWRpdGVkRGF0YVNpZ25hbC51cGRhdGUoKG1hcCkgPT4ge1xuICAgICAgICBjb25zdCBuZXdNYXAgPSBuZXcgTWFwKG1hcCk7XG4gICAgICAgIG5ld01hcC5zZXQocm93SWQsIHsgLi4ucm93IH0pO1xuICAgICAgICByZXR1cm4gbmV3TWFwO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzYXZlUm93KHJvd0lkOiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICBjb25zdCBlZGl0ZWREYXRhID0gdGhpcy5lZGl0ZWREYXRhU2lnbmFsKCkuZ2V0KHJvd0lkKTtcbiAgICBpZiAoZWRpdGVkRGF0YSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxSb3dJbmRleCA9IHRoaXMuZGF0YSgpLmZpbmRJbmRleCgocikgPT4gci5pZCA9PT0gcm93SWQpO1xuICAgICAgaWYgKG9yaWdpbmFsUm93SW5kZXggIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRSb3cgPSB7IC4uLnRoaXMuZGF0YSgpW29yaWdpbmFsUm93SW5kZXhdLCAuLi5lZGl0ZWREYXRhIH07XG4gICAgICAgIHRoaXMuZGF0YSgpW29yaWdpbmFsUm93SW5kZXhdID0gdXBkYXRlZFJvdztcbiAgICAgICAgdGhpcy5yb3dTYXZlLmVtaXQodXBkYXRlZFJvdyk7XG4gICAgICAgIHRoaXMuZWRpdGVkRGF0YVNpZ25hbC51cGRhdGUoKG1hcCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5ld01hcCA9IG5ldyBNYXAobWFwKTtcbiAgICAgICAgICBuZXdNYXAuZGVsZXRlKHJvd0lkKTtcbiAgICAgICAgICByZXR1cm4gbmV3TWFwO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpc1Jvd1NlbGVjdGVkID0gKHJvd0lkOiBzdHJpbmcgfCBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFJvd3NTaWduYWwoKS5oYXMocm93SWQpO1xuICB9O1xuXG4gIHRvZ2dsZVJvd1NlbGVjdGlvbiA9IChyb3dJZDogc3RyaW5nIHwgbnVtYmVyKSA9PiB7XG4gICAgdGhpcy5zZWxlY3RlZFJvd3NTaWduYWwudXBkYXRlKChzZXQpID0+IHtcbiAgICAgIGNvbnN0IG5ld1NldCA9IG5ldyBTZXQoc2V0KTtcbiAgICAgIGlmIChuZXdTZXQuaGFzKHJvd0lkKSkge1xuICAgICAgICBuZXdTZXQuZGVsZXRlKHJvd0lkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1NldC5hZGQocm93SWQpO1xuICAgICAgfVxuICAgICAgdGhpcy5lbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgICByZXR1cm4gbmV3U2V0O1xuICAgIH0pO1xuICB9O1xuXG4gIGFsbFJvd3NTZWxlY3RlZCA9ICgpOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFJvd3NTaWduYWwoKS5zaXplID09PSB0aGlzLmRhdGEubGVuZ3RoO1xuICB9O1xuXG4gIHNvbWVSb3dzU2VsZWN0ZWQgPSAoKTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzU2lnbmFsKCkuc2l6ZSA+IDAgJiZcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzU2lnbmFsKCkuc2l6ZSA8IHRoaXMuZGF0YS5sZW5ndGhcbiAgICApO1xuICB9O1xuXG4gIHRvZ2dsZUFsbFJvd3MgPSAoKSA9PiB7XG4gICAgaWYgKHRoaXMuYWxsUm93c1NlbGVjdGVkKCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzU2lnbmFsLnNldChuZXcgU2V0KCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUm93c1NpZ25hbC5zZXQobmV3IFNldCh0aGlzLmRhdGEoKS5tYXAoKHJvdykgPT4gcm93LmlkKSkpO1xuICAgIH1cbiAgICB0aGlzLmVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgfTtcblxuICBwcml2YXRlIGVtaXRTZWxlY3Rpb25DaGFuZ2UoKSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRSb3dzID0gdGhpcy5kYXRhKCkuZmlsdGVyKChyb3cpID0+XG4gICAgICB0aGlzLnNlbGVjdGVkUm93c1NpZ25hbCgpLmhhcyhyb3cuaWQpXG4gICAgKTtcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHNlbGVjdGVkUm93cyk7XG4gIH1cblxuICBnZXRIZWFkZXJDb250ZXh0KGNvbHVtbjogQ29sdW1uRGVmaW5pdGlvbjxUPikge1xuICAgIHJldHVybiB7XG4gICAgICAkaW1wbGljaXQ6IGNvbHVtbixcbiAgICAgIGNvbHVtbixcbiAgICAgIGFsbFJvd3NTZWxlY3RlZDogdGhpcy5hbGxSb3dzU2VsZWN0ZWQsXG4gICAgICBzb21lUm93c1NlbGVjdGVkOiB0aGlzLnNvbWVSb3dzU2VsZWN0ZWQsXG4gICAgICB0b2dnbGVBbGxSb3dzOiB0aGlzLnRvZ2dsZUFsbFJvd3MsXG4gICAgfTtcbiAgfVxuXG4gIHVwZGF0ZUVkaXRlZFZhbHVlKHJvd0lkOiBzdHJpbmcgfCBudW1iZXIsIGNvbHVtbklkOiBrZXlvZiBULCB2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5lZGl0ZWREYXRhU2lnbmFsLnVwZGF0ZSgobWFwKSA9PiB7XG4gICAgICBjb25zdCBuZXdNYXAgPSBuZXcgTWFwKG1hcCk7XG4gICAgICBjb25zdCByb3dEYXRhID0gbmV3TWFwLmdldChyb3dJZCkgfHwgKHt9IGFzIEVkaXRlZERhdGE8VD4pO1xuICAgICAgbmV3TWFwLnNldChyb3dJZCwgeyAuLi5yb3dEYXRhLCBbY29sdW1uSWRdOiB2YWx1ZSB9KTtcbiAgICAgIHJldHVybiBuZXdNYXA7XG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVOZXN0ZWRFZGl0ZWRWYWx1ZShcbiAgICByb3dJZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIGNvbHVtbklkOiBrZXlvZiBULFxuICAgIG5lc3RlZEZpZWxkOiBzdHJpbmcsXG4gICAgdmFsdWU6IGFueVxuICApIHtcbiAgICB0aGlzLmVkaXRlZERhdGFTaWduYWwudXBkYXRlKChtYXApID0+IHtcbiAgICAgIGNvbnN0IG5ld01hcCA9IG5ldyBNYXAobWFwKTtcbiAgICAgIGNvbnN0IHJvd0RhdGEgPSBuZXdNYXAuZ2V0KHJvd0lkKSB8fCAoe30gYXMgRWRpdGVkRGF0YTxUPik7XG4gICAgICBjb25zdCBjb2x1bW5EYXRhID0gKHJvd0RhdGFbY29sdW1uSWRdIGFzIGFueSkgfHwge307XG4gICAgICBuZXdNYXAuc2V0KHJvd0lkLCB7XG4gICAgICAgIC4uLnJvd0RhdGEsXG4gICAgICAgIFtjb2x1bW5JZF06IHtcbiAgICAgICAgICAuLi5jb2x1bW5EYXRhLFxuICAgICAgICAgIFtuZXN0ZWRGaWVsZF06IHZhbHVlLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV3TWFwO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q2VsbENvbnRleHQocm93OiBULCBjb2x1bW46IENvbHVtbkRlZmluaXRpb248VD4sIHJvd0luZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCByb3dJZCA9IHJvdy5pZDtcbiAgICBjb25zdCBpc0VkaXRpbmcgPSB0aGlzLmlzUm93RWRpdGluZyhyb3dJZCk7XG4gICAgY29uc3QgZWRpdGVkRGF0YSA9IHRoaXMuZWRpdGVkRGF0YVNpZ25hbCgpLmdldChyb3dJZCk7XG5cbiAgICBsZXQgdmFsdWU6IGFueTtcbiAgICBpZiAoaXNFZGl0aW5nICYmIGVkaXRlZERhdGEgJiYgY29sdW1uLmlkIGluIGVkaXRlZERhdGEpIHtcbiAgICAgIHZhbHVlID0gZWRpdGVkRGF0YVtjb2x1bW4uaWQgYXMga2V5b2YgVF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlID0gdGhpcy5nZXRDZWxsVmFsdWUocm93LCBjb2x1bW4pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAkaW1wbGljaXQ6IHZhbHVlLFxuICAgICAgdmFsdWUsXG4gICAgICByb3csXG4gICAgICBjb2x1bW4sXG4gICAgICByb3dJbmRleCxcbiAgICAgIGlzRWRpdGluZyxcbiAgICAgIGlzU2VsZWN0ZWQ6IHRoaXMuaXNSb3dTZWxlY3RlZChyb3dJZCksXG4gICAgICB0b2dnbGVSb3dTZWxlY3Rpb246ICgpID0+IHRoaXMudG9nZ2xlUm93U2VsZWN0aW9uKHJvd0lkKSxcbiAgICAgIHRvZ2dsZVJvd0VkaXQ6ICgpID0+IHRoaXMudG9nZ2xlUm93RWRpdChyb3dJZCksXG4gICAgICBkZWxldGVSb3c6ICgpID0+IHRoaXMuZGVsZXRlUm93KHJvd0lkKSxcbiAgICAgIHVwZGF0ZVZhbHVlOiAobmV3VmFsdWU6IGFueSkgPT5cbiAgICAgICAgdGhpcy51cGRhdGVFZGl0ZWRWYWx1ZShyb3dJZCwgY29sdW1uLmlkIGFzIGtleW9mIFQsIG5ld1ZhbHVlKSxcbiAgICAgIHVwZGF0ZU5lc3RlZFZhbHVlOiAobmVzdGVkRmllbGQ6IHN0cmluZywgbmV3VmFsdWU6IGFueSkgPT5cbiAgICAgICAgdGhpcy51cGRhdGVOZXN0ZWRFZGl0ZWRWYWx1ZShcbiAgICAgICAgICByb3dJZCxcbiAgICAgICAgICBjb2x1bW4uaWQgYXMga2V5b2YgVCxcbiAgICAgICAgICBuZXN0ZWRGaWVsZCxcbiAgICAgICAgICBuZXdWYWx1ZVxuICAgICAgICApLFxuICAgIH07XG4gIH1cblxuICBkZWxldGVSb3cgPSAocm93SWQ6IHN0cmluZyB8IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IHJvd1RvRGVsZXRlID0gdGhpcy5kYXRhKCkuZmluZCgocm93KSA9PiByb3cuaWQgPT09IHJvd0lkKTtcbiAgICBpZiAocm93VG9EZWxldGUpIHtcbiAgICAgIHRoaXMucm93RGVsZXRlLmVtaXQocm93VG9EZWxldGUpO1xuICAgIH1cbiAgfTtcblxuICBnZXRGb290ZXJDb250ZXh0KGNvbHVtbjogQ29sdW1uRGVmaW5pdGlvbjxUPikge1xuICAgIHJldHVybiB7XG4gICAgICAkaW1wbGljaXQ6IGNvbHVtbixcbiAgICAgIGNvbHVtbixcbiAgICAgIGRhdGE6IHRoaXMuZGF0YSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0VGFibGVTdHlsZSgpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLnN0eWxlQ29uZmlnLFxuICAgICAgZm9udEZhbWlseTogdGhpcy5zdHlsZUNvbmZpZy5mb250RmFtaWx5LFxuICAgICAgZm9udFNpemU6IHRoaXMuc3R5bGVDb25maWcuZm9udFNpemUsXG4gICAgICB3aGl0ZVNwYWNlOiB0aGlzLnN0eWxlQ29uZmlnLndoaXRlU3BhY2UsXG4gICAgICBtYXJnaW46IHRoaXMuc3R5bGVDb25maWcubWFyZ2luLFxuICAgICAgYm9yZGVyOiB0aGlzLnN0eWxlQ29uZmlnLmJvcmRlcixcbiAgICAgIGJvcmRlckNvbGxhcHNlOiB0aGlzLnN0eWxlQ29uZmlnLmJvcmRlckNvbGxhcHNlLFxuICAgICAgYm9yZGVyU3BhY2luZzogdGhpcy5zdHlsZUNvbmZpZy5ib3JkZXJTcGFjaW5nLFxuICAgICAgdGFibGVMYXlvdXQ6IHRoaXMuc3R5bGVDb25maWcudGFibGVMYXlvdXQsXG4gICAgICB3aWR0aDogdGhpcy5zdHlsZUNvbmZpZy53aWR0aCxcbiAgICB9O1xuICB9XG5cbiAgZ2V0SGVhZGVyU3R5bGUoKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5zdHlsZUNvbmZpZy5oZWFkZXIsXG4gICAgICBwb3NpdGlvbjogdGhpcy5zdHlsZUNvbmZpZy5oZWFkZXI/LnN0aWNreVRvcCA/ICdzdGlja3knIDogJ3N0YXRpYycsXG4gICAgICB0b3A6IHRoaXMuc3R5bGVDb25maWcuaGVhZGVyPy5zdGlja3lUb3AgPyAnMCcgOiAnYXV0bycsXG4gICAgICB6SW5kZXg6IHRoaXMuc3R5bGVDb25maWcuaGVhZGVyPy56SW5kZXggfHwgJ2F1dG8nLFxuICAgIH07XG4gIH1cblxuICBnZXRGb290ZXJTdHlsZSgpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLnN0eWxlQ29uZmlnLmZvb3RlcixcbiAgICAgIHBvc2l0aW9uOiB0aGlzLnN0eWxlQ29uZmlnLmZvb3Rlcj8uc3RpY2t5Qm90dG9tID8gJ3N0aWNreScgOiAnc3RhdGljJyxcbiAgICAgIGJvdHRvbTogdGhpcy5zdHlsZUNvbmZpZy5mb290ZXI/LnN0aWNreUJvdHRvbSA/ICcwJyA6ICdhdXRvJyxcbiAgICAgIHpJbmRleDogdGhpcy5zdHlsZUNvbmZpZy5mb290ZXI/LnpJbmRleCB8fCAnYXV0bycsXG4gICAgfTtcbiAgfVxuXG4gIGdldFJvd1N0eWxlKHJvd0luZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIGNvbnN0IHJvd1N0eWxlcyA9IHRoaXMuc3R5bGVDb25maWcucm93cztcbiAgICBpZiAocm93U3R5bGVzICYmICdldmVuJyBpbiByb3dTdHlsZXMgJiYgJ29kZCcgaW4gcm93U3R5bGVzKSB7XG4gICAgICByZXR1cm4gcm93SW5kZXggJSAyID09PSAwID8gcm93U3R5bGVzLmV2ZW4gOiByb3dTdHlsZXMub2RkO1xuICAgIH0gZWxzZSBpZiAocm93U3R5bGVzICYmICdudGgnIGluIHJvd1N0eWxlcyAmJiByb3dTdHlsZXMubnRoKSB7XG4gICAgICBjb25zdCB7IGludGVydmFsLCBzdHlsZSB9ID0gcm93U3R5bGVzLm50aDtcbiAgICAgIHJldHVybiAocm93SW5kZXggKyAxKSAlIChpbnRlcnZhbCB8fCAxKSA9PT0gMCA/IHN0eWxlIDoge307XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByb3dTdHlsZXMgfHwge307XG4gICAgfVxuICB9XG5cbiAgZ2V0Q2VsbFN0eWxlKHJvd0luZGV4OiBudW1iZXIsIGNvbEluZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIGNvbnN0IGlzRmlyc3RDb2x1bW4gPSBjb2xJbmRleCA9PT0gMDtcbiAgICBjb25zdCBpc0xhc3RDb2x1bW4gPSBjb2xJbmRleCA9PT0gdGhpcy5jb2x1bW5zU2lnbmFsKCkubGVuZ3RoIC0gMTtcblxuICAgIGxldCBjZWxsU3R5bGUgPSB7IC4uLnRoaXMuc3R5bGVDb25maWcuY2VsbHMgfTtcblxuICAgIGlmIChpc0ZpcnN0Q29sdW1uKSB7XG4gICAgICBjZWxsU3R5bGUgPSB7XG4gICAgICAgIC4uLmNlbGxTdHlsZSxcbiAgICAgICAgLi4udGhpcy5zdHlsZUNvbmZpZy5maXJzdENvbHVtbixcbiAgICAgICAgcG9zaXRpb246IHRoaXMuc3R5bGVDb25maWcuZmlyc3RDb2x1bW4/LnN0aWNreUxlZnRcbiAgICAgICAgICA/ICdzdGlja3knXG4gICAgICAgICAgOiAnc3RhdGljJyxcbiAgICAgICAgbGVmdDogdGhpcy5zdHlsZUNvbmZpZy5maXJzdENvbHVtbj8uc3RpY2t5TGVmdCA/ICcwJyA6ICdhdXRvJyxcbiAgICAgICAgekluZGV4OiB0aGlzLnN0eWxlQ29uZmlnLmZpcnN0Q29sdW1uPy56SW5kZXggfHwgJ2F1dG8nLFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGlzTGFzdENvbHVtbikge1xuICAgICAgY2VsbFN0eWxlID0ge1xuICAgICAgICAuLi5jZWxsU3R5bGUsXG4gICAgICAgIC4uLnRoaXMuc3R5bGVDb25maWcubGFzdENvbHVtbixcbiAgICAgICAgcG9zaXRpb246IHRoaXMuc3R5bGVDb25maWcubGFzdENvbHVtbj8uc3RpY2t5UmlnaHRcbiAgICAgICAgICA/ICdzdGlja3knXG4gICAgICAgICAgOiAnc3RhdGljJyxcbiAgICAgICAgcmlnaHQ6IHRoaXMuc3R5bGVDb25maWcubGFzdENvbHVtbj8uc3RpY2t5UmlnaHQgPyAnMCcgOiAnYXV0bycsXG4gICAgICAgIHpJbmRleDogdGhpcy5zdHlsZUNvbmZpZy5sYXN0Q29sdW1uPy56SW5kZXggfHwgJ2F1dG8nLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAocm93SW5kZXggPj0gMCkge1xuICAgICAgLy8gQXBwbHkgYm9keSBzdHlsZXMgdG8gYWxsIGNlbGxzXG4gICAgICBjZWxsU3R5bGUgPSB7IC4uLmNlbGxTdHlsZSwgLi4udGhpcy5zdHlsZUNvbmZpZy5ib2R5IH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNlbGxTdHlsZSA9IHsgLi4udGhpcy5zdHlsZUNvbmZpZy5oZWFkZXIgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2VsbFN0eWxlO1xuICB9XG59XG5cbnR5cGUgRWRpdGVkRGF0YTxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVF0/OiBUW0tdIGV4dGVuZHMgb2JqZWN0ID8gUGFydGlhbDxUW0tdPiA6IFRbS107XG59O1xuXG4vLyBEZWZhdWx0IHN0eWxlc1xuY29uc3QgZGVmYXVsdFRhYmxlU3R5bGVzOiBUYWJsZVN0eWxlcyA9IHtcbiAgYm9yZGVyOiAnMXB4IHNvbGlkICNlMGUwZTAnLFxuICBib3JkZXJSYWRpdXM6ICc0cHgnLFxuICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gIGJveFNoYWRvdzogJzAgMnB4IDRweCByZ2JhKDAsMCwwLDAuMSknLFxuICB3aWR0aDogJzEwMCUnLFxuICBoZWFkZXI6IHtcbiAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjZjVmNWY1JyxcbiAgICBmb250V2VpZ2h0OiAnYm9sZCcsXG4gICAgY29sb3I6ICcjMzMzJyxcbiAgICB0ZXh0QWxpZ246ICdsZWZ0JyxcbiAgICBwYWRkaW5nOiAnMTJweCAxNnB4JyxcbiAgICBib3JkZXJCb3R0b206ICcycHggc29saWQgI2UwZTBlMCcsXG4gIH0sXG4gIHJvd3M6IHtcbiAgICBldmVuOiB7XG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjZmZmZmZmJyxcbiAgICB9LFxuICAgIG9kZDoge1xuICAgICAgYmFja2dyb3VuZENvbG9yOiAnI2Y5ZjlmOScsXG4gICAgfSxcbiAgICBudGg6IHtcbiAgICAgIGludGVydmFsOiA1LFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnI2YwZjBmMCcsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIGNlbGxzOiB7XG4gICAgcGFkZGluZzogJzEycHggMTZweCcsXG4gICAgYm9yZGVyQm90dG9tOiAnMXB4IHNvbGlkICNlMGUwZTAnLFxuICB9LFxuICBmb290ZXI6IHtcbiAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjZjVmNWY1JyxcbiAgICBmb250V2VpZ2h0OiAnYm9sZCcsXG4gICAgY29sb3I6ICcjMzMzJyxcbiAgICB0ZXh0QWxpZ246ICdsZWZ0JyxcbiAgICBwYWRkaW5nOiAnMTJweCAxNnB4JyxcbiAgICBib3JkZXJUb3A6ICcycHggc29saWQgI2UwZTBlMCcsXG4gIH0sXG59O1xuIiwiPHRhYmxlIFtuZ1N0eWxlXT1cImdldFRhYmxlU3R5bGUoKVwiPlxuICA8dGhlYWQ+XG4gICAgPHRyIFtuZ1N0eWxlXT1cImdldEhlYWRlclN0eWxlKClcIj5cbiAgICAgIEBmb3IgKGNvbHVtbiBvZiBjb2x1bW5zU2lnbmFsKCk7IHRyYWNrIGNvbHVtbi5pZCkge1xuICAgICAgPHRoIFtuZ1N0eWxlXT1cImdldENlbGxTdHlsZSgtMSwgJGluZGV4KVwiPlxuICAgICAgICBAaWYgKGNvbHVtbi5oZWFkZXJUZW1wbGF0ZSkge1xuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29sdW1uLmhlYWRlclRlbXBsYXRlXCJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0SGVhZGVyQ29udGV4dChjb2x1bW4pXCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAge3sgY29sdW1uLmhlYWRlciB9fVxuICAgICAgICB9XG4gICAgICA8L3RoPlxuICAgICAgfVxuICAgIDwvdHI+XG4gIDwvdGhlYWQ+XG4gIDx0Ym9keT5cbiAgICBAZm9yIChyb3cgb2YgZGF0YSgpOyB0cmFjayByb3cuaWQ7IGxldCByb3dJbmRleCA9ICRpbmRleCkgeyBAaWZcbiAgICAoaXNHcm91cFJvdyhyb3cpKSB7XG4gICAgPHRyIGNsYXNzPVwiZ3JvdXAtcm93XCIgW25nU3R5bGVdPVwiZ2V0Um93U3R5bGUocm93SW5kZXgpXCI+XG4gICAgICA8dGRcbiAgICAgICAgW2F0dHIuY29sc3Bhbl09XCJjb2x1bW5zU2lnbmFsKCkubGVuZ3RoXCJcbiAgICAgICAgW25nU3R5bGVdPVwiZ2V0Q2VsbFN0eWxlKHJvd0luZGV4LCAwKVwiXG4gICAgICA+XG4gICAgICAgIHt7IGdldENlbGxWYWx1ZShyb3csIGNvbHVtbnNTaWduYWwoKVswXSkgfX1cbiAgICAgIDwvdGQ+XG4gICAgPC90cj5cbiAgICB9IEBlbHNlIHtcbiAgICA8dHIgW25nU3R5bGVdPVwiZ2V0Um93U3R5bGUocm93SW5kZXgpXCI+XG4gICAgICBAZm9yIChjb2x1bW4gb2YgY29sdW1uc1NpZ25hbCgpOyB0cmFjayBjb2x1bW4uaWQ7IGxldCBjb2xJbmRleCA9ICRpbmRleCkge1xuICAgICAgPHRkIFtuZ1N0eWxlXT1cImdldENlbGxTdHlsZShyb3dJbmRleCwgY29sSW5kZXgpXCI+XG4gICAgICAgIEBpZiAoaXNSb3dFZGl0aW5nKHJvdy5pZCkgJiYgY29sdW1uLmNlbGxFZGl0VGVtcGxhdGUpIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbHVtbi5jZWxsRWRpdFRlbXBsYXRlXCJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0Q2VsbENvbnRleHQocm93LCBjb2x1bW4sIHJvd0luZGV4KVwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgfSBAZWxzZSBpZiAoY29sdW1uLmNlbGxUZW1wbGF0ZSkge1xuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29sdW1uLmNlbGxUZW1wbGF0ZVwiXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldENlbGxDb250ZXh0KHJvdywgY29sdW1uLCByb3dJbmRleClcIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICB7eyBnZXRDZWxsVmFsdWUocm93LCBjb2x1bW4pIH19XG4gICAgICAgIH1cbiAgICAgIDwvdGQ+XG4gICAgICB9XG4gICAgPC90cj5cbiAgICB9IH1cbiAgPC90Ym9keT5cbiAgQGlmIChoYXNGb290ZXIoKSkge1xuICA8dGZvb3Q+XG4gICAgPHRyIFtuZ1N0eWxlXT1cImdldEZvb3RlclN0eWxlKClcIj5cbiAgICAgIEBmb3IgKGNvbHVtbiBvZiBjb2x1bW5zU2lnbmFsKCk7IHRyYWNrIGNvbHVtbi5pZCkge1xuICAgICAgPHRkIFtuZ1N0eWxlXT1cImdldENlbGxTdHlsZSgtMSwgJGluZGV4KVwiPlxuICAgICAgICBAaWYgKGNvbHVtbi5mb290ZXJUZW1wbGF0ZSkge1xuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29sdW1uLmZvb3RlclRlbXBsYXRlXCJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0Rm9vdGVyQ29udGV4dChjb2x1bW4pXCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICB9XG4gICAgICA8L3RkPlxuICAgICAgfVxuICAgIDwvdHI+XG4gIDwvdGZvb3Q+XG4gIH1cbjwvdGFibGU+XG4iXX0=
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Component, ContentChild, Input, ViewChild, EventEmitter, Output, NgModule, Directive, Optional, Self, ContentChildren, HostBinding, HostListener, forwardRef, Inject, Injectable, ChangeDetectionStrategy, signal, computed, InjectionToken } from '@angular/core';
2
+ import { Component, ContentChild, Input, ViewChild, EventEmitter, Output, NgModule, Directive, Optional, Self, ContentChildren, HostBinding, HostListener, forwardRef, Inject, Injectable, ChangeDetectionStrategy, input, signal, computed, InjectionToken } from '@angular/core';
3
3
  import * as i1 from '@angular/common';
4
4
  import { CommonModule } from '@angular/common';
5
5
  import * as i1$1 from '@angular/common/http';
@@ -19,11 +19,11 @@ class RightCardDataViewComponent {
19
19
  console.log(this.chilData);
20
20
  }
21
21
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: RightCardDataViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
22
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.5", type: RightCardDataViewComponent, selector: "verben-right-card-data-view", inputs: { parentData: "parentData", chilData: "chilData", meth: "meth" }, queries: [{ propertyName: "parent", first: true, predicate: ["parent"], descendants: true }, { propertyName: "child", first: true, predicate: ["child"], descendants: true }], ngImport: i0, template: " <ng-container *ngIf=\"parentData && !chilData\">\n <ng-content *ngTemplateOutlet=\"parent\"></ng-content>\n </ng-container>\n <ng-container *ngIf=\"chilData\">\n <ng-content *ngTemplateOutlet=\"child\"></ng-content> \n </ng-container>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
22
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.5", type: RightCardDataViewComponent, selector: "verben-right-card-data-view", inputs: { parentData: "parentData", chilData: "chilData", meth: "meth" }, queries: [{ propertyName: "parent", first: true, predicate: ["parent"], descendants: true }, { propertyName: "child", first: true, predicate: ["child"], descendants: true }], ngImport: i0, template: " <ng-container *ngIf=\"parentData && !chilData\">\n <ng-content *ngTemplateOutlet=\"parent\"></ng-content>\n </ng-container>\n <ng-container *ngIf=\"chilData\">\n <ng-content *ngTemplateOutlet=\"child\"></ng-content> \n </ng-container>\n", styles: [":host{flex:1 1 0}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
23
23
  }
24
24
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: RightCardDataViewComponent, decorators: [{
25
25
  type: Component,
26
- args: [{ selector: 'verben-right-card-data-view', template: " <ng-container *ngIf=\"parentData && !chilData\">\n <ng-content *ngTemplateOutlet=\"parent\"></ng-content>\n </ng-container>\n <ng-container *ngIf=\"chilData\">\n <ng-content *ngTemplateOutlet=\"child\"></ng-content> \n </ng-container>\n" }]
26
+ args: [{ selector: 'verben-right-card-data-view', template: " <ng-container *ngIf=\"parentData && !chilData\">\n <ng-content *ngTemplateOutlet=\"parent\"></ng-content>\n </ng-container>\n <ng-container *ngIf=\"chilData\">\n <ng-content *ngTemplateOutlet=\"child\"></ng-content> \n </ng-container>\n", styles: [":host{flex:1 1 0}\n"] }]
27
27
  }], propDecorators: { parent: [{
28
28
  type: ContentChild,
29
29
  args: ['parent']
@@ -3816,19 +3816,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImpor
3816
3816
 
3817
3817
  class DataTableComponent {
3818
3818
  // Modify data input to use grouped data
3819
- set data(value) {
3820
- this._data = value;
3821
- }
3822
- get data() {
3823
- return this.groupedData();
3824
- }
3825
- _data = [];
3819
+ data = input.required();
3820
+ columns = input.required();
3821
+ // @Input({ required: true })
3822
+ // set data(value: T[]) {
3823
+ // this._data = value;
3824
+ // }
3825
+ // get data(): T[] {
3826
+ // return this.groupedData();
3827
+ // }
3828
+ // private _data: T[] = [];
3826
3829
  // Modify columns input to use a signal
3827
- set columns(value) {
3828
- this.columnsSignal.set(value);
3829
- }
3830
+ // @Input({ required: true })
3831
+ // set columns(value: ColumnDefinition<T>[]) {
3832
+ // this.columnsSignal.set(value);
3833
+ // }
3830
3834
  // New inputs for grouping
3831
- groupBy;
3835
+ groupBy = input();
3832
3836
  styleConfig = defaultTableStyles;
3833
3837
  columnTemplates;
3834
3838
  rowEdit = new EventEmitter();
@@ -3847,18 +3851,20 @@ class DataTableComponent {
3847
3851
  // Computed property for grouped data
3848
3852
  groupedData = computed(() => {
3849
3853
  // If no grouping is specified, return original data
3850
- if (!this.groupBy)
3851
- return this._data;
3854
+ if (!this.groupBy())
3855
+ return this.data();
3852
3856
  // Determine group function based on input type
3853
- const getGroupValue = typeof this.groupBy === 'function'
3854
- ? this.groupBy
3855
- : (row) => row[this.groupBy];
3857
+ const getGroupValue = typeof this.groupBy() === 'function'
3858
+ ? this.groupBy()
3859
+ : (row) => row[this.groupBy()];
3856
3860
  // Group the data
3857
3861
  const groups = new Map();
3858
- this._data.forEach((row) => {
3859
- const groupValue = getGroupValue(row);
3860
- const existingGroup = groups.get(groupValue) || [];
3861
- groups.set(groupValue, [...existingGroup, row]);
3862
+ this.data().forEach((row) => {
3863
+ if (getGroupValue !== undefined) {
3864
+ const groupValue = getGroupValue(row);
3865
+ const existingGroup = groups.get(groupValue) || [];
3866
+ groups.set(groupValue, [...existingGroup, row]);
3867
+ }
3862
3868
  });
3863
3869
  // Construct final grouped data array with group rows
3864
3870
  const groupedDataArray = [];
@@ -3878,7 +3884,7 @@ class DataTableComponent {
3878
3884
  ngOnInit() {
3879
3885
  // Set initial columns if not already set
3880
3886
  if (this.columnsSignal().length === 0) {
3881
- this.columnsSignal.set(this.columns);
3887
+ this.columnsSignal.set(this.columns());
3882
3888
  }
3883
3889
  }
3884
3890
  ngAfterContentInit() {
@@ -3933,7 +3939,7 @@ class DataTableComponent {
3933
3939
  });
3934
3940
  };
3935
3941
  initializeEditedData(rowId) {
3936
- const row = this.data.find((r) => r.id === rowId);
3942
+ const row = this.data().find((r) => r.id === rowId);
3937
3943
  if (row) {
3938
3944
  this.editedDataSignal.update((map) => {
3939
3945
  const newMap = new Map(map);
@@ -3945,10 +3951,10 @@ class DataTableComponent {
3945
3951
  saveRow(rowId) {
3946
3952
  const editedData = this.editedDataSignal().get(rowId);
3947
3953
  if (editedData) {
3948
- const originalRowIndex = this.data.findIndex((r) => r.id === rowId);
3954
+ const originalRowIndex = this.data().findIndex((r) => r.id === rowId);
3949
3955
  if (originalRowIndex !== -1) {
3950
- const updatedRow = { ...this.data[originalRowIndex], ...editedData };
3951
- this.data[originalRowIndex] = updatedRow;
3956
+ const updatedRow = { ...this.data()[originalRowIndex], ...editedData };
3957
+ this.data()[originalRowIndex] = updatedRow;
3952
3958
  this.rowSave.emit(updatedRow);
3953
3959
  this.editedDataSignal.update((map) => {
3954
3960
  const newMap = new Map(map);
@@ -3986,12 +3992,12 @@ class DataTableComponent {
3986
3992
  this.selectedRowsSignal.set(new Set());
3987
3993
  }
3988
3994
  else {
3989
- this.selectedRowsSignal.set(new Set(this.data.map((row) => row.id)));
3995
+ this.selectedRowsSignal.set(new Set(this.data().map((row) => row.id)));
3990
3996
  }
3991
3997
  this.emitSelectionChange();
3992
3998
  };
3993
3999
  emitSelectionChange() {
3994
- const selectedRows = this.data.filter((row) => this.selectedRowsSignal().has(row.id));
4000
+ const selectedRows = this.data().filter((row) => this.selectedRowsSignal().has(row.id));
3995
4001
  this.selectionChange.emit(selectedRows);
3996
4002
  }
3997
4003
  getHeaderContext(column) {
@@ -4053,7 +4059,7 @@ class DataTableComponent {
4053
4059
  };
4054
4060
  }
4055
4061
  deleteRow = (rowId) => {
4056
- const rowToDelete = this.data.find((row) => row.id === rowId);
4062
+ const rowToDelete = this.data().find((row) => row.id === rowId);
4057
4063
  if (rowToDelete) {
4058
4064
  this.rowDelete.emit(rowToDelete);
4059
4065
  }
@@ -4144,20 +4150,12 @@ class DataTableComponent {
4144
4150
  return cellStyle;
4145
4151
  }
4146
4152
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DataTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4147
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.5", type: DataTableComponent, selector: "lib-data-table", inputs: { data: "data", columns: "columns", groupBy: "groupBy", styleConfig: "styleConfig" }, outputs: { rowEdit: "rowEdit", rowSave: "rowSave", rowDelete: "rowDelete", selectionChange: "selectionChange" }, queries: [{ propertyName: "columnTemplates", predicate: ColumnDirective }], ngImport: i0, template: "<table [ngStyle]=\"getTableStyle()\">\n <thead>\n <tr [ngStyle]=\"getHeaderStyle()\">\n @for (column of columnsSignal(); track column.id) {\n <th [ngStyle]=\"getCellStyle(-1, $index)\">\n @if (column.headerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.headerTemplate\"\n [ngTemplateOutletContext]=\"getHeaderContext(column)\"\n ></ng-container>\n } @else {\n {{ column.header }}\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of data; track row.id; let rowIndex = $index) { @if\n (isGroupRow(row)) {\n <tr class=\"group-row\" [ngStyle]=\"getRowStyle(rowIndex)\">\n <td\n [attr.colspan]=\"columnsSignal().length\"\n [ngStyle]=\"getCellStyle(rowIndex, 0)\"\n >\n {{ getCellValue(row, columnsSignal()[0]) }}\n </td>\n </tr>\n } @else {\n <tr [ngStyle]=\"getRowStyle(rowIndex)\">\n @for (column of columnsSignal(); track column.id; let colIndex = $index) {\n <td [ngStyle]=\"getCellStyle(rowIndex, colIndex)\">\n @if (isRowEditing(row.id) && column.cellEditTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.cellEditTemplate\"\n [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n ></ng-container>\n } @else if (column.cellTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.cellTemplate\"\n [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n ></ng-container>\n } @else {\n {{ getCellValue(row, column) }}\n }\n </td>\n }\n </tr>\n } }\n </tbody>\n @if (hasFooter()) {\n <tfoot>\n <tr [ngStyle]=\"getFooterStyle()\">\n @for (column of columnsSignal(); track column.id) {\n <td [ngStyle]=\"getCellStyle(-1, $index)\">\n @if (column.footerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.footerTemplate\"\n [ngTemplateOutletContext]=\"getFooterContext(column)\"\n ></ng-container>\n }\n </td>\n }\n </tr>\n </tfoot>\n }\n</table>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4153
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.5", type: DataTableComponent, selector: "lib-data-table", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: true, transformFunction: null }, groupBy: { classPropertyName: "groupBy", publicName: "groupBy", isSignal: true, isRequired: false, transformFunction: null }, styleConfig: { classPropertyName: "styleConfig", publicName: "styleConfig", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { rowEdit: "rowEdit", rowSave: "rowSave", rowDelete: "rowDelete", selectionChange: "selectionChange" }, queries: [{ propertyName: "columnTemplates", predicate: ColumnDirective }], ngImport: i0, template: "<table [ngStyle]=\"getTableStyle()\">\n <thead>\n <tr [ngStyle]=\"getHeaderStyle()\">\n @for (column of columnsSignal(); track column.id) {\n <th [ngStyle]=\"getCellStyle(-1, $index)\">\n @if (column.headerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.headerTemplate\"\n [ngTemplateOutletContext]=\"getHeaderContext(column)\"\n ></ng-container>\n } @else {\n {{ column.header }}\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of data(); track row.id; let rowIndex = $index) { @if\n (isGroupRow(row)) {\n <tr class=\"group-row\" [ngStyle]=\"getRowStyle(rowIndex)\">\n <td\n [attr.colspan]=\"columnsSignal().length\"\n [ngStyle]=\"getCellStyle(rowIndex, 0)\"\n >\n {{ getCellValue(row, columnsSignal()[0]) }}\n </td>\n </tr>\n } @else {\n <tr [ngStyle]=\"getRowStyle(rowIndex)\">\n @for (column of columnsSignal(); track column.id; let colIndex = $index) {\n <td [ngStyle]=\"getCellStyle(rowIndex, colIndex)\">\n @if (isRowEditing(row.id) && column.cellEditTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.cellEditTemplate\"\n [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n ></ng-container>\n } @else if (column.cellTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.cellTemplate\"\n [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n ></ng-container>\n } @else {\n {{ getCellValue(row, column) }}\n }\n </td>\n }\n </tr>\n } }\n </tbody>\n @if (hasFooter()) {\n <tfoot>\n <tr [ngStyle]=\"getFooterStyle()\">\n @for (column of columnsSignal(); track column.id) {\n <td [ngStyle]=\"getCellStyle(-1, $index)\">\n @if (column.footerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.footerTemplate\"\n [ngTemplateOutletContext]=\"getFooterContext(column)\"\n ></ng-container>\n }\n </td>\n }\n </tr>\n </tfoot>\n }\n</table>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4148
4154
  }
4149
4155
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DataTableComponent, decorators: [{
4150
4156
  type: Component,
4151
- args: [{ selector: 'lib-data-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<table [ngStyle]=\"getTableStyle()\">\n <thead>\n <tr [ngStyle]=\"getHeaderStyle()\">\n @for (column of columnsSignal(); track column.id) {\n <th [ngStyle]=\"getCellStyle(-1, $index)\">\n @if (column.headerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.headerTemplate\"\n [ngTemplateOutletContext]=\"getHeaderContext(column)\"\n ></ng-container>\n } @else {\n {{ column.header }}\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of data; track row.id; let rowIndex = $index) { @if\n (isGroupRow(row)) {\n <tr class=\"group-row\" [ngStyle]=\"getRowStyle(rowIndex)\">\n <td\n [attr.colspan]=\"columnsSignal().length\"\n [ngStyle]=\"getCellStyle(rowIndex, 0)\"\n >\n {{ getCellValue(row, columnsSignal()[0]) }}\n </td>\n </tr>\n } @else {\n <tr [ngStyle]=\"getRowStyle(rowIndex)\">\n @for (column of columnsSignal(); track column.id; let colIndex = $index) {\n <td [ngStyle]=\"getCellStyle(rowIndex, colIndex)\">\n @if (isRowEditing(row.id) && column.cellEditTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.cellEditTemplate\"\n [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n ></ng-container>\n } @else if (column.cellTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.cellTemplate\"\n [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n ></ng-container>\n } @else {\n {{ getCellValue(row, column) }}\n }\n </td>\n }\n </tr>\n } }\n </tbody>\n @if (hasFooter()) {\n <tfoot>\n <tr [ngStyle]=\"getFooterStyle()\">\n @for (column of columnsSignal(); track column.id) {\n <td [ngStyle]=\"getCellStyle(-1, $index)\">\n @if (column.footerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.footerTemplate\"\n [ngTemplateOutletContext]=\"getFooterContext(column)\"\n ></ng-container>\n }\n </td>\n }\n </tr>\n </tfoot>\n }\n</table>\n" }]
4152
- }], propDecorators: { data: [{
4153
- type: Input,
4154
- args: [{ required: true }]
4155
- }], columns: [{
4156
- type: Input,
4157
- args: [{ required: true }]
4158
- }], groupBy: [{
4159
- type: Input
4160
- }], styleConfig: [{
4157
+ args: [{ selector: 'lib-data-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<table [ngStyle]=\"getTableStyle()\">\n <thead>\n <tr [ngStyle]=\"getHeaderStyle()\">\n @for (column of columnsSignal(); track column.id) {\n <th [ngStyle]=\"getCellStyle(-1, $index)\">\n @if (column.headerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.headerTemplate\"\n [ngTemplateOutletContext]=\"getHeaderContext(column)\"\n ></ng-container>\n } @else {\n {{ column.header }}\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of data(); track row.id; let rowIndex = $index) { @if\n (isGroupRow(row)) {\n <tr class=\"group-row\" [ngStyle]=\"getRowStyle(rowIndex)\">\n <td\n [attr.colspan]=\"columnsSignal().length\"\n [ngStyle]=\"getCellStyle(rowIndex, 0)\"\n >\n {{ getCellValue(row, columnsSignal()[0]) }}\n </td>\n </tr>\n } @else {\n <tr [ngStyle]=\"getRowStyle(rowIndex)\">\n @for (column of columnsSignal(); track column.id; let colIndex = $index) {\n <td [ngStyle]=\"getCellStyle(rowIndex, colIndex)\">\n @if (isRowEditing(row.id) && column.cellEditTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.cellEditTemplate\"\n [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n ></ng-container>\n } @else if (column.cellTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.cellTemplate\"\n [ngTemplateOutletContext]=\"getCellContext(row, column, rowIndex)\"\n ></ng-container>\n } @else {\n {{ getCellValue(row, column) }}\n }\n </td>\n }\n </tr>\n } }\n </tbody>\n @if (hasFooter()) {\n <tfoot>\n <tr [ngStyle]=\"getFooterStyle()\">\n @for (column of columnsSignal(); track column.id) {\n <td [ngStyle]=\"getCellStyle(-1, $index)\">\n @if (column.footerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"column.footerTemplate\"\n [ngTemplateOutletContext]=\"getFooterContext(column)\"\n ></ng-container>\n }\n </td>\n }\n </tr>\n </tfoot>\n }\n</table>\n" }]
4158
+ }], propDecorators: { styleConfig: [{
4161
4159
  type: Input
4162
4160
  }], columnTemplates: [{
4163
4161
  type: ContentChildren,