@rosoftlab/material 1.0.0-alpha-0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (32) hide show
  1. package/README.md +27 -0
  2. package/esm2022/lib/components/generic-table/generic-table.component.mjs +435 -0
  3. package/esm2022/lib/components/index.mjs +3 -0
  4. package/esm2022/lib/components/searchable-dropdown/searchable-dropdown.component.mjs +234 -0
  5. package/esm2022/lib/core.mjs +6 -0
  6. package/esm2022/lib/decorators/grid-layout.decorator.mjs +23 -0
  7. package/esm2022/lib/decorators/index.mjs +2 -0
  8. package/esm2022/lib/models/grid-layout.mjs +18 -0
  9. package/esm2022/lib/models/index.mjs +3 -0
  10. package/esm2022/lib/models/material-base-model.mjs +17 -0
  11. package/esm2022/lib/rsl-material-module.mjs +96 -0
  12. package/esm2022/lib/services/grid-layout.service.mjs +22 -0
  13. package/esm2022/lib/services/index.mjs +2 -0
  14. package/esm2022/public-api.mjs +5 -0
  15. package/esm2022/rosoftlab-material.mjs +5 -0
  16. package/fesm2022/rosoftlab-material.mjs +823 -0
  17. package/fesm2022/rosoftlab-material.mjs.map +1 -0
  18. package/index.d.ts +5 -0
  19. package/lib/components/generic-table/generic-table.component.d.ts +88 -0
  20. package/lib/components/index.d.ts +2 -0
  21. package/lib/components/searchable-dropdown/searchable-dropdown.component.d.ts +61 -0
  22. package/lib/core.d.ts +5 -0
  23. package/lib/decorators/grid-layout.decorator.d.ts +2 -0
  24. package/lib/decorators/index.d.ts +1 -0
  25. package/lib/models/grid-layout.d.ts +13 -0
  26. package/lib/models/index.d.ts +2 -0
  27. package/lib/models/material-base-model.d.ts +5 -0
  28. package/lib/rsl-material-module.d.ts +45 -0
  29. package/lib/services/grid-layout.service.d.ts +11 -0
  30. package/lib/services/index.d.ts +1 -0
  31. package/package.json +31 -0
  32. package/public-api.d.ts +1 -0
package/README.md ADDED
@@ -0,0 +1,27 @@
1
+ # RslWorkspace
2
+
3
+ This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 12.1.3.
4
+
5
+ ## Development server
6
+
7
+ Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files.
8
+
9
+ ## Code scaffolding
10
+
11
+ Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`.
12
+
13
+ ## Build
14
+
15
+ Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory.
16
+
17
+ ## Running unit tests
18
+
19
+ Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
20
+
21
+ ## Running end-to-end tests
22
+
23
+ Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities.
24
+
25
+ ## Further help
26
+
27
+ To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
@@ -0,0 +1,435 @@
1
+ import { moveItemInArray } from '@angular/cdk/drag-drop';
2
+ import { DatePipe, DecimalPipe, PercentPipe } from '@angular/common';
3
+ import { Component, ElementRef, EventEmitter, Input, Output, Renderer2, ViewChild, ViewEncapsulation } from '@angular/core';
4
+ import { MatPaginator } from '@angular/material/paginator';
5
+ import { MatSort } from '@angular/material/sort';
6
+ import { MatTable, MatTableDataSource } from '@angular/material/table';
7
+ import { Router } from '@angular/router';
8
+ import { BaseService, CellTextAlign, DialogService, GridLayoutFormat } from '@rosoftlab/core';
9
+ import * as jsonLogic from 'json-logic-js/logic.js';
10
+ import { Subject, fromEvent, merge, of } from 'rxjs';
11
+ import { catchError, debounceTime, distinctUntilChanged, map, startWith, switchMap } from 'rxjs/operators';
12
+ import { RSLMaterialModule } from '../../rsl-material-module';
13
+ import { GridLayoutService } from '../../services';
14
+ import * as i0 from "@angular/core";
15
+ import * as i1 from "@rosoftlab/core";
16
+ import * as i2 from "@angular/router";
17
+ import * as i3 from "@angular/common";
18
+ import * as i4 from "@angular/forms";
19
+ import * as i5 from "@angular/material/icon";
20
+ import * as i6 from "@angular/material/input";
21
+ import * as i7 from "@angular/material/form-field";
22
+ import * as i8 from "@angular/material/paginator";
23
+ import * as i9 from "@angular/material/progress-spinner";
24
+ import * as i10 from "@angular/material/sort";
25
+ import * as i11 from "@angular/material/table";
26
+ import * as i12 from "@angular/material/tooltip";
27
+ import * as i13 from "@angular/cdk/drag-drop";
28
+ import * as i14 from "@ngx-translate/core";
29
+ export class GenericTableComponent {
30
+ // ruleEngineService: RuleEngineService<T>;
31
+ constructor(dialogService, router, datePipe, numberPipe, percentPipe, renderer) {
32
+ this.dialogService = dialogService;
33
+ this.router = router;
34
+ this.datePipe = datePipe;
35
+ this.numberPipe = numberPipe;
36
+ this.percentPipe = percentPipe;
37
+ this.renderer = renderer;
38
+ this.defaultSort = null;
39
+ this.defaultSortDirection = null;
40
+ this.deletePropertyName = 'name';
41
+ this.stickyColumns = null;
42
+ this.editOnClick = false;
43
+ this.editOnDblClick = false;
44
+ this.allowEdit = true;
45
+ this.popupEdit = false;
46
+ this.customInclude = null;
47
+ this.infiniteScroll = false;
48
+ this.dataSource = new MatTableDataSource();
49
+ this.resultsLength = 0;
50
+ this.isLoadingResults = true;
51
+ this.isRateLimitReached = false;
52
+ this.filterChanged = new Subject();
53
+ this.selectedObject = new EventEmitter();
54
+ this.click = new EventEmitter();
55
+ this.editModel = new EventEmitter();
56
+ }
57
+ ngOnChanges() {
58
+ if (this.baseService !== undefined || this.baseService !== null) {
59
+ if (this.gridLayoutService != null) {
60
+ this.gridLayout = this.gridLayoutService.getGridLayout();
61
+ }
62
+ else {
63
+ const model = this.baseService.newModel();
64
+ this.gridLayout = model.getGridLayout();
65
+ }
66
+ this.displayedColumns = [];
67
+ if (this.allowReorderItems) {
68
+ this.displayedColumns.push('position');
69
+ }
70
+ this.displayedColumns.push.apply(this.displayedColumns, this.gridLayout.map(x => x.propertyName));
71
+ if (!this.editOnClick && !this.editOnDblClick && this.allowEdit) {
72
+ this.displayedColumns.push('delete');
73
+ }
74
+ }
75
+ }
76
+ ngOnInit() {
77
+ this.filterChangedSubscription = this.filterChanged
78
+ .pipe(debounceTime(300), distinctUntilChanged())
79
+ .subscribe(newText => {
80
+ if (newText.length >= 3 || newText.length == 0) {
81
+ this.filterValue = newText;
82
+ this.paginator.pageIndex = 0;
83
+ this.refreshForm();
84
+ }
85
+ });
86
+ // this.getGridLayout();
87
+ this.sort.sortChange.subscribe(() => this.paginator.pageIndex = 0);
88
+ this.paginator.pageSize = 15;
89
+ if (this.defaultSort) {
90
+ this.sort.active = this.defaultSort;
91
+ if (this.defaultSortDirection) {
92
+ this.sort.direction = this.defaultSortDirection;
93
+ }
94
+ else {
95
+ this.sort.direction = 'asc';
96
+ }
97
+ }
98
+ // this.dataSource.paginator = this.paginator;
99
+ merge(this.sort.sortChange, this.paginator.page)
100
+ .pipe(startWith({}), switchMap(() => {
101
+ this.isLoadingResults = true;
102
+ return this.getData();
103
+ }), map(data => {
104
+ // Flip flag to show that loading has finished.
105
+ this.isLoadingResults = false;
106
+ this.isRateLimitReached = false;
107
+ if (data) {
108
+ this.resultsLength = data.getMeta().meta.count;
109
+ return data.getModels();
110
+ }
111
+ else {
112
+ this.resultsLength = 0;
113
+ return [];
114
+ }
115
+ }), catchError(() => {
116
+ this.isLoadingResults = false;
117
+ // Catch if the GitHub API has reached its rate limit. Return empty data.
118
+ this.isRateLimitReached = true;
119
+ return of([]);
120
+ })).subscribe(data => {
121
+ // if (this.infiniteScroll) {
122
+ // let oldData = this.dataSource.data ?? null;
123
+ // // if (oldData.length === 0) {
124
+ // // oldData = data;
125
+ // // } else {
126
+ // oldData=oldData.concat(data);
127
+ // // }
128
+ // this.dataSource.data = oldData;
129
+ // }
130
+ // else {
131
+ this.dataSource.data = data;
132
+ // }
133
+ });
134
+ // this.paginator.nextPage()
135
+ }
136
+ getData() {
137
+ this.isLoadingResults = true;
138
+ const pageIndex = (this.paginator.pageIndex || 0) + 1;
139
+ const pageSize = this.paginator.pageSize || 20;
140
+ const filters = [];
141
+ let sorts = '';
142
+ if (this.sort.active) {
143
+ if (this.sort.direction === 'desc') {
144
+ sorts = '-' + this.sort.active;
145
+ }
146
+ else {
147
+ sorts = this.sort.active;
148
+ }
149
+ }
150
+ if (this.hasSearch) {
151
+ if (this.filterValue) {
152
+ // const filtersArr = this.searchFields.split(",");
153
+ // filtersArr.forEach(element => {
154
+ // filters.push(element + '@=*' + this.filterValue);
155
+ // });
156
+ const y = '(' + this.searchFields.replace(',', '|') + ')';
157
+ filters.push(y + '@=*' + this.filterValue);
158
+ }
159
+ }
160
+ if (this.defaultFilter) {
161
+ filters.push(this.defaultFilter);
162
+ }
163
+ const filtersValue = filters.join(', ');
164
+ return this.baseService.getAll(pageIndex, pageSize, sorts, filtersValue, this.customInclude);
165
+ }
166
+ refreshForm() {
167
+ this.getData().subscribe(data => {
168
+ if (data) {
169
+ this.isLoadingResults = false;
170
+ this.isRateLimitReached = false;
171
+ this.resultsLength = data.getMeta().meta.count;
172
+ this.dataSource.data = data.getModels();
173
+ }
174
+ else {
175
+ this.isLoadingResults = false;
176
+ this.isRateLimitReached = false;
177
+ this.resultsLength = 0;
178
+ this.dataSource.data = [];
179
+ }
180
+ });
181
+ }
182
+ highlight(element) {
183
+ if (this.selectedItem) {
184
+ this.selectedItem.highlighted = element.highlighted;
185
+ }
186
+ this.selectedItem = null;
187
+ element.highlighted = !element.highlighted;
188
+ if (element.highlighted) {
189
+ this.selectedItem = element;
190
+ this.selectedObject.emit(element);
191
+ }
192
+ else {
193
+ this.selectedObject.emit(null);
194
+ }
195
+ }
196
+ deleteObject(model) {
197
+ const msg = 'Do you want to delete ' + model[this.deletePropertyName] + '?';
198
+ this.dialogService.confirm(msg).subscribe((response) => {
199
+ if (response) {
200
+ this.baseService.delete(model.id).subscribe(() => {
201
+ const tempData = [];
202
+ this.selectedObject.emit(null);
203
+ this.dataSource.data.map((item) => {
204
+ if (item.id !== model.id) {
205
+ tempData.push(item);
206
+ }
207
+ });
208
+ this.dataSource.data = tempData;
209
+ });
210
+ }
211
+ });
212
+ }
213
+ editObject(model) {
214
+ if (!this.popupEdit) {
215
+ const id = model.id;
216
+ this.router.navigate([this.editLink, id]);
217
+ }
218
+ else {
219
+ this.editModel.emit(model);
220
+ }
221
+ }
222
+ getFlexStyle(column) {
223
+ if (column.width) {
224
+ const style = column.grow + ' ' + column.shrink + ' ' + column.width + 'px';
225
+ return style;
226
+ }
227
+ return null;
228
+ }
229
+ getCellTextAlign(column) {
230
+ return column.textAlign ?? CellTextAlign.left;
231
+ }
232
+ showPictureCell(column) {
233
+ return (column?.formating ?? GridLayoutFormat.none) === GridLayoutFormat.picture;
234
+ }
235
+ deleteDisabled(model) {
236
+ if (this.deleteDisableRule) {
237
+ return this.evaluateRule(this.deleteDisableRule, model);
238
+ }
239
+ else {
240
+ return false;
241
+ }
242
+ }
243
+ cellClick(model, propertyName) {
244
+ this.click.emit({ propertyName, model });
245
+ }
246
+ evaluateRule(rules, model) {
247
+ let result = true;
248
+ rules.forEach(rule => {
249
+ let jsonRule;
250
+ if (typeof rule.rule === 'string') {
251
+ jsonRule = JSON.parse(rule.rule);
252
+ }
253
+ else {
254
+ jsonRule = rule.rule;
255
+ }
256
+ if (rule.parameters) {
257
+ const data = '{' + rule.parameters.map((item) => {
258
+ return '"' + item + '":"' + model[item] + '"';
259
+ }).join(',') + '}';
260
+ result = jsonLogic.apply(jsonRule, JSON.parse(data));
261
+ }
262
+ else {
263
+ result = jsonLogic.apply(jsonRule);
264
+ }
265
+ });
266
+ return result;
267
+ }
268
+ getCelValue(row, propertyName) {
269
+ if (!row)
270
+ return "";
271
+ // if (propertyName == 'kompetenzenStdev')
272
+ // console.log(propertyName);
273
+ if (propertyName.indexOf('.') === -1) {
274
+ var gridLayout = this.gridLayout.find(f => f.propertyName.indexOf(propertyName) > -1);
275
+ return this.getFormatedValue(gridLayout, row[propertyName]);
276
+ }
277
+ else {
278
+ const prop = propertyName.split('.')[0];
279
+ const subProp = propertyName.replace(prop + '.', '');
280
+ return this.getCelValue(row[prop], subProp);
281
+ }
282
+ }
283
+ getFormatedValue(gridLayout, value) {
284
+ if (gridLayout) {
285
+ switch (gridLayout.formating) {
286
+ case GridLayoutFormat.date:
287
+ return this.datePipe.transform(value, gridLayout.format);
288
+ break;
289
+ case GridLayoutFormat.number:
290
+ return this.numberPipe.transform(value, gridLayout.format);
291
+ case GridLayoutFormat.percent:
292
+ const valuePrc = value / 100;
293
+ return this.percentPipe.transform(valuePrc, gridLayout.format);
294
+ default:
295
+ return value;
296
+ break;
297
+ }
298
+ }
299
+ return value;
300
+ }
301
+ applyFilter(event) {
302
+ }
303
+ dropTable(event) {
304
+ if (this.changeItemPosition) {
305
+ const prevItem = this.dataSource.data[event.previousIndex];
306
+ const currentItem = this.dataSource.data[event.currentIndex];
307
+ if (this.changeItemPosition(prevItem, currentItem)) {
308
+ const prevIndex = this.dataSource.data.findIndex((d) => d === event.item.data);
309
+ moveItemInArray(this.dataSource.data, prevIndex, event.currentIndex);
310
+ this.table.renderRows();
311
+ }
312
+ }
313
+ }
314
+ isColumnSticky(name) {
315
+ if (this.stickyColumns) {
316
+ const filtersArr = this.stickyColumns.split(",");
317
+ return filtersArr.findIndex(f => f == name) !== -1;
318
+ }
319
+ return false;
320
+ }
321
+ updateElement(model) {
322
+ //Find if element exist
323
+ var currentElement = this.dataSource.data.find(f => f.id === model.id);
324
+ if (currentElement !== null) {
325
+ const index = this.dataSource.data.indexOf(currentElement);
326
+ this.dataSource.data[index] = model;
327
+ }
328
+ else {
329
+ this.dataSource.data.push(model);
330
+ }
331
+ const newData = [...this.dataSource.data];
332
+ this.dataSource.data = newData;
333
+ this.dataSource._updateChangeSubscription();
334
+ }
335
+ ngAfterViewInit() {
336
+ fromEvent(this.matTableRef.nativeElement, 'scroll')
337
+ .pipe(debounceTime(700))
338
+ .subscribe((e) => this.onTableScroll(e));
339
+ }
340
+ onTableScroll(e) {
341
+ const tableViewHeight = e.target.offsetHeight; // viewport: ~500px
342
+ const tableScrollHeight = e.target.scrollHeight; // length of all table
343
+ const scrollLocation = e.target.scrollTop; // how far user scrolled
344
+ // If the user has scrolled within 200px of the bottom, add more data
345
+ const scrollThreshold = 200;
346
+ const scrollUpLimit = scrollThreshold;
347
+ if (scrollLocation < scrollUpLimit && this.paginator.pageIndex > 0) {
348
+ // this.firstPage--;
349
+ console.log(`onTableScroll() UP: firstPage decreased to ${this.paginator.pageIndex}. Now fetching data...`);
350
+ // this.fetchData();
351
+ this.scrollTo(tableScrollHeight / 2 - 2 * tableViewHeight);
352
+ }
353
+ const scrollDownLimit = tableScrollHeight - tableViewHeight - scrollThreshold;
354
+ if (scrollLocation > scrollDownLimit && this.paginator.pageIndex < this.paginator.getNumberOfPages()) {
355
+ // this.firstPage++;
356
+ console.log(`onTableScroll(): firstPage increased to ${this.paginator.pageIndex}. Now fetching data...`);
357
+ this.paginator.nextPage();
358
+ // this.scrollTo(tableScrollHeight / 2 + tableViewHeight);
359
+ }
360
+ }
361
+ scrollTo(position) {
362
+ this.renderer.setProperty(this.matTableRef.nativeElement, 'scrollTop', position);
363
+ }
364
+ getCellClass(model, property) {
365
+ return model.getCellClass(property);
366
+ }
367
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: GenericTableComponent, deps: [{ token: i1.DialogService }, { token: i2.Router }, { token: i3.DatePipe }, { token: i3.DecimalPipe }, { token: i3.PercentPipe }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
368
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: GenericTableComponent, isStandalone: true, selector: "rsl-generic-table", inputs: { modelType: "modelType", baseService: "baseService", gridLayoutService: "gridLayoutService", editLink: "editLink", defaultSort: "defaultSort", defaultSortDirection: "defaultSortDirection", deleteDisableRule: "deleteDisableRule", deletePropertyName: "deletePropertyName", hasSearch: "hasSearch", searchFields: "searchFields", defaultFilter: "defaultFilter", allowReorderItems: "allowReorderItems", stickyColumns: "stickyColumns", editOnClick: "editOnClick", editOnDblClick: "editOnDblClick", allowEdit: "allowEdit", popupEdit: "popupEdit", customInclude: "customInclude", changeItemPosition: "changeItemPosition", infiniteScroll: "infiniteScroll" }, outputs: { selectedObject: "selectedObject", click: "click", editModel: "editModel" }, viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true, static: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true, static: true }, { propertyName: "filter", first: true, predicate: ElementRef, descendants: true }, { propertyName: "table", first: true, predicate: ["table"], descendants: true }, { propertyName: "matTableRef", first: true, predicate: ["table"], descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<div class=\"containerX\" *ngIf=\"hasSearch\">\r\n <div fxLayout=\"row\" fxLayout.xs=\"column\" fxLayout.sm=\"column\" fxFlexFill>\r\n <mat-form-field fxFlex>\r\n <mat-label>Filter</mat-label>\r\n <input matInput [ngModel]='filterValue' (ngModelChange)='filterChanged.next($event)' #filter>\r\n </mat-form-field>\r\n </div>\r\n</div>\r\n\r\n<div class=\"table-container\">\r\n <div class=\"mat-elevation-z2\">\r\n <!-- #applicationsContainer -->\r\n <div class=\"example-loading-shade\" *ngIf=\"isLoadingResults || isRateLimitReached\">\r\n <mat-spinner *ngIf=\"isLoadingResults\"></mat-spinner>\r\n <div class=\"example-rate-limit-reached\" *ngIf=\"isRateLimitReached\">\r\n {{'General.LoadingData' | translate}}\r\n </div>\r\n </div>\r\n\r\n\r\n <mat-table fxFlex #table [dataSource]=\"dataSource\" id=\"tempalte-forms-table\" matSort matSortDisableClear\r\n matSortDirection=\"asc\" cdkDropList [cdkDropListData]=\"dataSource\" (cdkDropListDropped)=\"dropTable($event)\">\r\n <!-- (scroll)=\"onTableScroll($event)\" -->\r\n\r\n\r\n <ng-container matColumnDef=\"position\">\r\n <mat-header-cell *matHeaderCellDef disableClear=\"true\">\r\n <!-- {{'General.Order' | translate}} -->\r\n </mat-header-cell>\r\n <mat-cell fxFlex *matCellDef=\"let element;\">\r\n <mat-icon cdkDragHandle>reorder</mat-icon>\r\n </mat-cell>\r\n </ng-container>\r\n\r\n\r\n <ng-container *ngFor=\"let column of gridLayout\" [matColumnDef]=\"column.propertyName\"\r\n [sticky]=\"isColumnSticky(column.propertyName)\">\r\n <mat-header-cell mat-sort-header disableClear [style.flex]=\"getFlexStyle(column)\" *matHeaderCellDef>\r\n {{column.translateKey | translate}}\r\n </mat-header-cell>\r\n <mat-cell matTooltip={{getCelValue(row,column.propertyName)}} [style.flex]=\"getFlexStyle(column)\"\r\n [style.text-align]=\"getCellTextAlign(column)\" *matCellDef=\"let row\" (click)=\"cellClick(row,column.propertyName)\">\r\n <div [ngClass]=\"getCellClass(row,column.propertyName)\" *ngIf=\"!showPictureCell(column)\">\r\n {{getCelValue(row,column.propertyName)}}\r\n </div>\r\n <img [ngClass]=\"getCellClass(row,column.propertyName)\" *ngIf=\"showPictureCell(column)\">\r\n </mat-cell>\r\n </ng-container>\r\n\r\n\r\n <ng-container matColumnDef=\"delete\" stickyEnd *ngIf=\"!editOnClick && !editOnDblClick\">\r\n <mat-header-cell *matHeaderCellDef disableClear=\"true\">\r\n </mat-header-cell>\r\n <mat-cell *matCellDef=\"let row\">\r\n <button class=\"btn btn-green btn-fill btn-wd btn-just-icon\" (click)=\"editObject(row)\"\r\n matTooltip=\"{{'General.Edit' | translate}}\">\r\n <!-- <mat-icon>edit</mat-icon> -->\r\n <i class=\"material-icons\">edit</i>\r\n <div class=\"ripple-container\"></div>\r\n </button>\r\n <button class=\"btn btn-red btn-fill btn-wd btn-just-icon\" (click)=\"deleteObject(row)\"\r\n [disabled]=\"deleteDisabled(row)\" matTooltip=\"{{'General.Delete' | translate}}\">\r\n <i class=\"material-icons\">delete</i>\r\n <div class=\"ripple-container\"></div>\r\n </button>\r\n </mat-cell>\r\n </ng-container>\r\n\r\n <mat-header-row *matHeaderRowDef=\"displayedColumns;sticky: true\"></mat-header-row>\r\n\r\n <ng-container *ngIf=\"!editOnClick && !editOnDblClick\">\r\n <mat-row *matRowDef=\"let row;let index = dataIndex; columns: displayedColumns;\" cdkDrag [cdkDragData]=\"row\"\r\n [ngClass]=\"{hovered: row.hovered, highlighted: row.highlighted}\" (click)=\"highlight(row)\"\r\n (mouseover)=\"row.hovered = true\" (mouseout)=\"row.hovered = false\">\r\n </mat-row>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"editOnClick && !editOnDblClick\">\r\n <mat-row *matRowDef=\"let row;let index = dataIndex; columns: displayedColumns;\" cdkDrag [cdkDragData]=\"row\"\r\n [ngClass]=\"{hovered: row.hovered, highlighted: row.highlighted}\" (click)=\"editObject(row)\"\r\n (mouseover)=\"row.hovered = true\" (mouseout)=\"row.hovered = false\" style=\"cursor: pointer;\"></mat-row>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!editOnClick && editOnDblClick\">\r\n <mat-row *matRowDef=\"let row;let index = dataIndex; columns: displayedColumns;\" cdkDrag [cdkDragData]=\"row\"\r\n [ngClass]=\"{hovered: row.hovered, highlighted: row.highlighted}\" (dblclick)=\"editObject(row)\"\r\n (click)=\"highlight(row)\" (mouseover)=\"row.hovered = true\" (mouseout)=\"row.hovered = false\"\r\n style=\"cursor: pointer;\"></mat-row>\r\n </ng-container>\r\n\r\n <!-- [ngClass]=\"{hovered: row.hovered, highlighted: row.highlighted}\"\r\n (click)=\"highlight(row)\" (mouseover)=\"row.hovered = true\" (mouseout)=\"row.hovered = false\" -->\r\n </mat-table>\r\n <mat-paginator #paginator [hidden]=\"infiniteScroll\" [length]=\"resultsLength\" [pageSize]=\"15\"\r\n [pageSizeOptions]=\"[15, 30, 100]\" [showFirstLastButtons]=\"true\">\r\n </mat-paginator>\r\n </div>\r\n</div>", styles: [".mat-column-delete{flex:0 0 90px;padding-right:30px}.mat-sort-header-button{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mat-column-position{flex:0 0 60px!important}.mat-table{overflow-x:auto}[hidden]{display:none!important}\n"], dependencies: [{ kind: "ngmodule", type: RSLMaterialModule }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatLabel, selector: "mat-label" }, { kind: "component", type: i8.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "component", type: i9.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i10.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i10.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i11.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i11.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i11.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i11.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i11.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i11.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i11.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i11.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i11.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i11.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i12.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: i13.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i13.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i13.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "pipe", type: i14.TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
369
+ }
370
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: GenericTableComponent, decorators: [{
371
+ type: Component,
372
+ args: [{ standalone: true, selector: 'rsl-generic-table', encapsulation: ViewEncapsulation.None, imports: [RSLMaterialModule], template: "<div class=\"containerX\" *ngIf=\"hasSearch\">\r\n <div fxLayout=\"row\" fxLayout.xs=\"column\" fxLayout.sm=\"column\" fxFlexFill>\r\n <mat-form-field fxFlex>\r\n <mat-label>Filter</mat-label>\r\n <input matInput [ngModel]='filterValue' (ngModelChange)='filterChanged.next($event)' #filter>\r\n </mat-form-field>\r\n </div>\r\n</div>\r\n\r\n<div class=\"table-container\">\r\n <div class=\"mat-elevation-z2\">\r\n <!-- #applicationsContainer -->\r\n <div class=\"example-loading-shade\" *ngIf=\"isLoadingResults || isRateLimitReached\">\r\n <mat-spinner *ngIf=\"isLoadingResults\"></mat-spinner>\r\n <div class=\"example-rate-limit-reached\" *ngIf=\"isRateLimitReached\">\r\n {{'General.LoadingData' | translate}}\r\n </div>\r\n </div>\r\n\r\n\r\n <mat-table fxFlex #table [dataSource]=\"dataSource\" id=\"tempalte-forms-table\" matSort matSortDisableClear\r\n matSortDirection=\"asc\" cdkDropList [cdkDropListData]=\"dataSource\" (cdkDropListDropped)=\"dropTable($event)\">\r\n <!-- (scroll)=\"onTableScroll($event)\" -->\r\n\r\n\r\n <ng-container matColumnDef=\"position\">\r\n <mat-header-cell *matHeaderCellDef disableClear=\"true\">\r\n <!-- {{'General.Order' | translate}} -->\r\n </mat-header-cell>\r\n <mat-cell fxFlex *matCellDef=\"let element;\">\r\n <mat-icon cdkDragHandle>reorder</mat-icon>\r\n </mat-cell>\r\n </ng-container>\r\n\r\n\r\n <ng-container *ngFor=\"let column of gridLayout\" [matColumnDef]=\"column.propertyName\"\r\n [sticky]=\"isColumnSticky(column.propertyName)\">\r\n <mat-header-cell mat-sort-header disableClear [style.flex]=\"getFlexStyle(column)\" *matHeaderCellDef>\r\n {{column.translateKey | translate}}\r\n </mat-header-cell>\r\n <mat-cell matTooltip={{getCelValue(row,column.propertyName)}} [style.flex]=\"getFlexStyle(column)\"\r\n [style.text-align]=\"getCellTextAlign(column)\" *matCellDef=\"let row\" (click)=\"cellClick(row,column.propertyName)\">\r\n <div [ngClass]=\"getCellClass(row,column.propertyName)\" *ngIf=\"!showPictureCell(column)\">\r\n {{getCelValue(row,column.propertyName)}}\r\n </div>\r\n <img [ngClass]=\"getCellClass(row,column.propertyName)\" *ngIf=\"showPictureCell(column)\">\r\n </mat-cell>\r\n </ng-container>\r\n\r\n\r\n <ng-container matColumnDef=\"delete\" stickyEnd *ngIf=\"!editOnClick && !editOnDblClick\">\r\n <mat-header-cell *matHeaderCellDef disableClear=\"true\">\r\n </mat-header-cell>\r\n <mat-cell *matCellDef=\"let row\">\r\n <button class=\"btn btn-green btn-fill btn-wd btn-just-icon\" (click)=\"editObject(row)\"\r\n matTooltip=\"{{'General.Edit' | translate}}\">\r\n <!-- <mat-icon>edit</mat-icon> -->\r\n <i class=\"material-icons\">edit</i>\r\n <div class=\"ripple-container\"></div>\r\n </button>\r\n <button class=\"btn btn-red btn-fill btn-wd btn-just-icon\" (click)=\"deleteObject(row)\"\r\n [disabled]=\"deleteDisabled(row)\" matTooltip=\"{{'General.Delete' | translate}}\">\r\n <i class=\"material-icons\">delete</i>\r\n <div class=\"ripple-container\"></div>\r\n </button>\r\n </mat-cell>\r\n </ng-container>\r\n\r\n <mat-header-row *matHeaderRowDef=\"displayedColumns;sticky: true\"></mat-header-row>\r\n\r\n <ng-container *ngIf=\"!editOnClick && !editOnDblClick\">\r\n <mat-row *matRowDef=\"let row;let index = dataIndex; columns: displayedColumns;\" cdkDrag [cdkDragData]=\"row\"\r\n [ngClass]=\"{hovered: row.hovered, highlighted: row.highlighted}\" (click)=\"highlight(row)\"\r\n (mouseover)=\"row.hovered = true\" (mouseout)=\"row.hovered = false\">\r\n </mat-row>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"editOnClick && !editOnDblClick\">\r\n <mat-row *matRowDef=\"let row;let index = dataIndex; columns: displayedColumns;\" cdkDrag [cdkDragData]=\"row\"\r\n [ngClass]=\"{hovered: row.hovered, highlighted: row.highlighted}\" (click)=\"editObject(row)\"\r\n (mouseover)=\"row.hovered = true\" (mouseout)=\"row.hovered = false\" style=\"cursor: pointer;\"></mat-row>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!editOnClick && editOnDblClick\">\r\n <mat-row *matRowDef=\"let row;let index = dataIndex; columns: displayedColumns;\" cdkDrag [cdkDragData]=\"row\"\r\n [ngClass]=\"{hovered: row.hovered, highlighted: row.highlighted}\" (dblclick)=\"editObject(row)\"\r\n (click)=\"highlight(row)\" (mouseover)=\"row.hovered = true\" (mouseout)=\"row.hovered = false\"\r\n style=\"cursor: pointer;\"></mat-row>\r\n </ng-container>\r\n\r\n <!-- [ngClass]=\"{hovered: row.hovered, highlighted: row.highlighted}\"\r\n (click)=\"highlight(row)\" (mouseover)=\"row.hovered = true\" (mouseout)=\"row.hovered = false\" -->\r\n </mat-table>\r\n <mat-paginator #paginator [hidden]=\"infiniteScroll\" [length]=\"resultsLength\" [pageSize]=\"15\"\r\n [pageSizeOptions]=\"[15, 30, 100]\" [showFirstLastButtons]=\"true\">\r\n </mat-paginator>\r\n </div>\r\n</div>", styles: [".mat-column-delete{flex:0 0 90px;padding-right:30px}.mat-sort-header-button{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mat-column-position{flex:0 0 60px!important}.mat-table{overflow-x:auto}[hidden]{display:none!important}\n"] }]
373
+ }], ctorParameters: function () { return [{ type: i1.DialogService }, { type: i2.Router }, { type: i3.DatePipe }, { type: i3.DecimalPipe }, { type: i3.PercentPipe }, { type: i0.Renderer2 }]; }, propDecorators: { modelType: [{
374
+ type: Input
375
+ }], baseService: [{
376
+ type: Input
377
+ }], gridLayoutService: [{
378
+ type: Input
379
+ }], editLink: [{
380
+ type: Input
381
+ }], defaultSort: [{
382
+ type: Input
383
+ }], defaultSortDirection: [{
384
+ type: Input
385
+ }], deleteDisableRule: [{
386
+ type: Input
387
+ }], deletePropertyName: [{
388
+ type: Input
389
+ }], hasSearch: [{
390
+ type: Input
391
+ }], searchFields: [{
392
+ type: Input
393
+ }], defaultFilter: [{
394
+ type: Input
395
+ }], allowReorderItems: [{
396
+ type: Input
397
+ }], stickyColumns: [{
398
+ type: Input
399
+ }], editOnClick: [{
400
+ type: Input
401
+ }], editOnDblClick: [{
402
+ type: Input
403
+ }], allowEdit: [{
404
+ type: Input
405
+ }], popupEdit: [{
406
+ type: Input
407
+ }], customInclude: [{
408
+ type: Input
409
+ }], changeItemPosition: [{
410
+ type: Input
411
+ }], infiniteScroll: [{
412
+ type: Input
413
+ }], paginator: [{
414
+ type: ViewChild,
415
+ args: [MatPaginator, { static: true }]
416
+ }], sort: [{
417
+ type: ViewChild,
418
+ args: [MatSort, { static: true }]
419
+ }], filter: [{
420
+ type: ViewChild,
421
+ args: [ElementRef, { static: false }]
422
+ }], table: [{
423
+ type: ViewChild,
424
+ args: ['table']
425
+ }], matTableRef: [{
426
+ type: ViewChild,
427
+ args: ['table', { read: ElementRef }]
428
+ }], selectedObject: [{
429
+ type: Output
430
+ }], click: [{
431
+ type: Output
432
+ }], editModel: [{
433
+ type: Output
434
+ }] } });
435
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yb3NvZnRsYWIvbWF0ZXJpYWwvc3JjL2xpYi9jb21wb25lbnRzL2dlbmVyaWMtdGFibGUvZ2VuZXJpYy10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yb3NvZnRsYWIvbWF0ZXJpYWwvc3JjL2xpYi9jb21wb25lbnRzL2dlbmVyaWMtdGFibGUvZ2VuZXJpYy10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckUsT0FBTyxFQUFpQixTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlKLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsT0FBTyxFQUFpQixNQUFNLHdCQUF3QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxRQUFRLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFpQixXQUFXLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBUSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ILE9BQU8sS0FBSyxTQUFTLE1BQU0sd0JBQXdCLENBQUM7QUFDcEQsT0FBTyxFQUFjLE9BQU8sRUFBZ0IsU0FBUyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUs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O2dCQUNHLEtBQUs7c0JBQWQsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2RrRHJhZ0Ryb3AsIG1vdmVJdGVtSW5BcnJheSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xyXG5pbXBvcnQgeyBEYXRlUGlwZSwgRGVjaW1hbFBpcGUsIFBlcmNlbnRQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBSZW5kZXJlcjIsIFZpZXdDaGlsZCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0UGFnaW5hdG9yIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcclxuaW1wb3J0IHsgTWF0U29ydCwgU29ydERpcmVjdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xyXG5pbXBvcnQgeyBNYXRUYWJsZSwgTWF0VGFibGVEYXRhU291cmNlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBCYXNlUXVlcnlEYXRhLCBCYXNlU2VydmljZSwgQ2VsbFRleHRBbGlnbiwgRGlhbG9nU2VydmljZSwgR3JpZExheW91dEZvcm1hdCwgUnVsZSB9IGZyb20gJ0Byb3NvZnRsYWIvY29yZSc7XHJcbmltcG9ydCAqIGFzIGpzb25Mb2dpYyBmcm9tICdqc29uLWxvZ2ljLWpzL2xvZ2ljLmpzJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCBmcm9tRXZlbnQsIG1lcmdlLCBvZiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yLCBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIHN0YXJ0V2l0aCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBHcmlkTGF5b3V0TW9kZWwsIE1hdGVyaWFsQmFzZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcclxuaW1wb3J0IHsgUlNMTWF0ZXJpYWxNb2R1bGUgfSBmcm9tICcuLi8uLi9yc2wtbWF0ZXJpYWwtbW9kdWxlJztcclxuaW1wb3J0IHsgR3JpZExheW91dFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcyc7XHJcbmRlY2xhcmUgdmFyICQ6IGFueTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgc2VsZWN0b3I6ICdyc2wtZ2VuZXJpYy10YWJsZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2dlbmVyaWMtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2dlbmVyaWMtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gIGltcG9ydHM6IFtSU0xNYXRlcmlhbE1vZHVsZV1cclxufSlcclxuZXhwb3J0IGNsYXNzIEdlbmVyaWNUYWJsZUNvbXBvbmVudDxUIGV4dGVuZHMgTWF0ZXJpYWxCYXNlTW9kZWw+IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQge1xyXG4gIC8vIGRpc3BsYXllZENvbHVtbnMgPSBbJ2NvZGUnXTsgLy8sICduYW1lJywgJ2NpZicsICdjaXR5JywgJ2FkZHJlc3MnLCAnc3RhdGUnLCAncHJpY2VMaXN0TmFtZScsICdkZWxldGUnXTtcclxuICBASW5wdXQoKSBtb2RlbFR5cGU6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XHJcbiAgQElucHV0KCkgYmFzZVNlcnZpY2U6IEJhc2VTZXJ2aWNlPFQ+O1xyXG4gIEBJbnB1dCgpIGdyaWRMYXlvdXRTZXJ2aWNlPzogR3JpZExheW91dFNlcnZpY2U8VD47XHJcbiAgQElucHV0KCkgZWRpdExpbms6IHN0cmluZztcclxuICBASW5wdXQoKSBkZWZhdWx0U29ydDogc3RyaW5nID0gbnVsbDtcclxuICBASW5wdXQoKSBkZWZhdWx0U29ydERpcmVjdGlvbjogU29ydERpcmVjdGlvbiA9IG51bGw7XHJcbiAgQElucHV0KCkgZGVsZXRlRGlzYWJsZVJ1bGU6IFJ1bGVbXTtcclxuICBASW5wdXQoKSBkZWxldGVQcm9wZXJ0eU5hbWU6IHN0cmluZyA9ICduYW1lJztcclxuICBASW5wdXQoKSBoYXNTZWFyY2g6IGJvb2xlYW47XHJcbiAgQElucHV0KCkgc2VhcmNoRmllbGRzOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgZGVmYXVsdEZpbHRlcjogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGFsbG93UmVvcmRlckl0ZW1zOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIHN0aWNreUNvbHVtbnM6IHN0cmluZyA9IG51bGw7XHJcbiAgQElucHV0KCkgZWRpdE9uQ2xpY2s6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBlZGl0T25EYmxDbGljazogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGFsbG93RWRpdDogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgcG9wdXBFZGl0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgY3VzdG9tSW5jbHVkZTogc3RyaW5nID0gbnVsbDtcclxuICBASW5wdXQoKSBjaGFuZ2VJdGVtUG9zaXRpb246IChwcmV2SXRlbTogVCwgY3VycmVudEl0ZW06IFQpID0+IGJvb2xlYW47XHJcbiAgQElucHV0KCkgaW5maW5pdGVTY3JvbGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBkYXRhU291cmNlOiBNYXRUYWJsZURhdGFTb3VyY2U8VD4gPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKCk7XHJcbiAgcmVzdWx0c0xlbmd0aCA9IDA7XHJcbiAgaXNMb2FkaW5nUmVzdWx0cyA9IHRydWU7XHJcbiAgaXNSYXRlTGltaXRSZWFjaGVkID0gZmFsc2U7XHJcblxyXG4gIGZpbHRlclZhbHVlOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBmaWx0ZXJDaGFuZ2VkOiBTdWJqZWN0PHN0cmluZz4gPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XHJcbiAgcHJpdmF0ZSBmaWx0ZXJDaGFuZ2VkU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb25cclxuXHJcbiAgQFZpZXdDaGlsZChNYXRQYWdpbmF0b3IsIHsgc3RhdGljOiB0cnVlIH0pIHBhZ2luYXRvcjogTWF0UGFnaW5hdG9yO1xyXG4gIEBWaWV3Q2hpbGQoTWF0U29ydCwgeyBzdGF0aWM6IHRydWUgfSkgc29ydDogTWF0U29ydDtcclxuICBAVmlld0NoaWxkKEVsZW1lbnRSZWYsIHsgc3RhdGljOiBmYWxzZSB9KSBmaWx0ZXI6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgndGFibGUnKSB0YWJsZTogTWF0VGFibGU8YW55PjtcclxuICBAVmlld0NoaWxkKCd0YWJsZScsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBwdWJsaWMgbWF0VGFibGVSZWY6IEVsZW1lbnRSZWY7XHJcbiAgcmVzaXplU3Vic2NyaXB0aW9uOiBhbnk7XHJcblxyXG4gIHNlbGVjdGVkSXRlbTogVDtcclxuICBncmlkTGF5b3V0OiBHcmlkTGF5b3V0TW9kZWxbXTtcclxuICBAT3V0cHV0KCkgc2VsZWN0ZWRPYmplY3Q6IEV2ZW50RW1pdHRlcjxUPiA9IG5ldyBFdmVudEVtaXR0ZXI8VD4oKTtcclxuICBAT3V0cHV0KCkgY2xpY2s6IEV2ZW50RW1pdHRlcjx7IHByb3BlcnR5TmFtZTogc3RyaW5nLCBtb2RlbDogVCB9PiA9IG5ldyBFdmVudEVtaXR0ZXI8eyBwcm9wZXJ0eU5hbWU6IHN0cmluZywgbW9kZWw6IFQgfT4oKTtcclxuICBAT3V0cHV0KCkgZWRpdE1vZGVsOiBFdmVudEVtaXR0ZXI8VD4gPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XHJcblxyXG4gIGRpc3BsYXllZENvbHVtbnM6IHN0cmluZ1tdO1xyXG4gIC8vIHJ1bGVFbmdpbmVTZXJ2aWNlOiBSdWxlRW5naW5lU2VydmljZTxUPjtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlLFxyXG4gICAgcHVibGljIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSBkYXRlUGlwZTogRGF0ZVBpcGUsXHJcbiAgICBwcml2YXRlIG51bWJlclBpcGU6IERlY2ltYWxQaXBlLFxyXG4gICAgcHJpdmF0ZSBwZXJjZW50UGlwZTogUGVyY2VudFBpcGUsXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjJcclxuICApIHtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKCkge1xyXG4gICAgaWYgKHRoaXMuYmFzZVNlcnZpY2UgIT09IHVuZGVmaW5lZCB8fCB0aGlzLmJhc2VTZXJ2aWNlICE9PSBudWxsKSB7XHJcbiAgICAgIGlmICh0aGlzLmdyaWRMYXlvdXRTZXJ2aWNlICE9IG51bGwpIHtcclxuICAgICAgICB0aGlzLmdyaWRMYXlvdXQgPSB0aGlzLmdyaWRMYXlvdXRTZXJ2aWNlLmdldEdyaWRMYXlvdXQoKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBjb25zdCBtb2RlbCA9IHRoaXMuYmFzZVNlcnZpY2UubmV3TW9kZWwoKTtcclxuICAgICAgICB0aGlzLmdyaWRMYXlvdXQgPSBtb2RlbC5nZXRHcmlkTGF5b3V0KCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gW107XHJcbiAgICAgIGlmICh0aGlzLmFsbG93UmVvcmRlckl0ZW1zKSB7XHJcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zLnB1c2goJ3Bvc2l0aW9uJylcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMucHVzaC5hcHBseSh0aGlzLmRpc3BsYXllZENvbHVtbnMsIHRoaXMuZ3JpZExheW91dC5tYXAoeCA9PiB4LnByb3BlcnR5TmFtZSkpO1xyXG4gICAgICBpZiAoIXRoaXMuZWRpdE9uQ2xpY2sgJiYgIXRoaXMuZWRpdE9uRGJsQ2xpY2sgJiYgdGhpcy5hbGxvd0VkaXQpIHtcclxuICAgICAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMucHVzaCgnZGVsZXRlJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5maWx0ZXJDaGFuZ2VkU3Vic2NyaXB0aW9uID0gdGhpcy5maWx0ZXJDaGFuZ2VkXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGRlYm91bmNlVGltZSgzMDApLFxyXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKG5ld1RleHQgPT4ge1xyXG4gICAgICAgIGlmIChuZXdUZXh0Lmxlbmd0aCA+PSAzIHx8IG5ld1RleHQubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgIHRoaXMuZmlsdGVyVmFsdWUgPSBuZXdUZXh0O1xyXG5cclxuICAgICAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2VJbmRleCA9IDA7XHJcbiAgICAgICAgICB0aGlzLnJlZnJlc2hGb3JtKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIC8vIHRoaXMuZ2V0R3JpZExheW91dCgpO1xyXG4gICAgdGhpcy5zb3J0LnNvcnRDaGFuZ2Uuc3Vic2NyaWJlKCgpID0+IHRoaXMucGFnaW5hdG9yLnBhZ2VJbmRleCA9IDApO1xyXG4gICAgdGhpcy5wYWdpbmF0b3IucGFnZVNpemUgPSAxNTtcclxuICAgIGlmICh0aGlzLmRlZmF1bHRTb3J0KSB7XHJcbiAgICAgIHRoaXMuc29ydC5hY3RpdmUgPSB0aGlzLmRlZmF1bHRTb3J0O1xyXG4gICAgICBpZiAodGhpcy5kZWZhdWx0U29ydERpcmVjdGlvbikge1xyXG4gICAgICAgIHRoaXMuc29ydC5kaXJlY3Rpb24gPSB0aGlzLmRlZmF1bHRTb3J0RGlyZWN0aW9uO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc29ydC5kaXJlY3Rpb24gPSAnYXNjJztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IgPSB0aGlzLnBhZ2luYXRvcjtcclxuICAgIG1lcmdlKHRoaXMuc29ydC5zb3J0Q2hhbmdlLCB0aGlzLnBhZ2luYXRvci5wYWdlKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBzdGFydFdpdGgoe30pLFxyXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZ1Jlc3VsdHMgPSB0cnVlO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGF0YSgpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIG1hcChkYXRhID0+IHtcclxuICAgICAgICAgIC8vIEZsaXAgZmxhZyB0byBzaG93IHRoYXQgbG9hZGluZyBoYXMgZmluaXNoZWQuXHJcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZ1Jlc3VsdHMgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuaXNSYXRlTGltaXRSZWFjaGVkID0gZmFsc2U7XHJcbiAgICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICB0aGlzLnJlc3VsdHNMZW5ndGggPSBkYXRhLmdldE1ldGEoKS5tZXRhLmNvdW50O1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0YS5nZXRNb2RlbHMoKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzdWx0c0xlbmd0aCA9IDA7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nUmVzdWx0cyA9IGZhbHNlO1xyXG4gICAgICAgICAgLy8gQ2F0Y2ggaWYgdGhlIEdpdEh1YiBBUEkgaGFzIHJlYWNoZWQgaXRzIHJhdGUgbGltaXQuIFJldHVybiBlbXB0eSBkYXRhLlxyXG4gICAgICAgICAgdGhpcy5pc1JhdGVMaW1pdFJlYWNoZWQgPSB0cnVlO1xyXG4gICAgICAgICAgcmV0dXJuIG9mKFtdKTtcclxuICAgICAgICB9KVxyXG4gICAgICApLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICAvLyBpZiAodGhpcy5pbmZpbml0ZVNjcm9sbCkge1xyXG4gICAgICAgIC8vICAgbGV0IG9sZERhdGEgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YSA/PyBudWxsO1xyXG4gICAgICAgIC8vICAgLy8gaWYgKG9sZERhdGEubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgLy8gICAvLyAgIG9sZERhdGEgPSBkYXRhO1xyXG4gICAgICAgIC8vICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgb2xkRGF0YT1vbGREYXRhLmNvbmNhdChkYXRhKTtcclxuICAgICAgICAvLyAgIC8vIH1cclxuICAgICAgICAvLyAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gb2xkRGF0YTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgfSk7XHJcbiAgICAvLyB0aGlzLnBhZ2luYXRvci5uZXh0UGFnZSgpXHJcbiAgfVxyXG4gIGdldERhdGEoKTogT2JzZXJ2YWJsZTxCYXNlUXVlcnlEYXRhPFQ+PiB7XHJcbiAgICB0aGlzLmlzTG9hZGluZ1Jlc3VsdHMgPSB0cnVlO1xyXG4gICAgY29uc3QgcGFnZUluZGV4ID0gKHRoaXMucGFnaW5hdG9yLnBhZ2VJbmRleCB8fCAwKSArIDE7XHJcbiAgICBjb25zdCBwYWdlU2l6ZSA9IHRoaXMucGFnaW5hdG9yLnBhZ2VTaXplIHx8IDIwO1xyXG4gICAgY29uc3QgZmlsdGVycyA9IFtdO1xyXG5cclxuICAgIGxldCBzb3J0cyA9ICcnO1xyXG4gICAgaWYgKHRoaXMuc29ydC5hY3RpdmUpIHtcclxuICAgICAgaWYgKHRoaXMuc29ydC5kaXJlY3Rpb24gPT09ICdkZXNjJykge1xyXG4gICAgICAgIHNvcnRzID0gJy0nICsgdGhpcy5zb3J0LmFjdGl2ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzb3J0cyA9IHRoaXMuc29ydC5hY3RpdmU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLmhhc1NlYXJjaCkge1xyXG4gICAgICBpZiAodGhpcy5maWx0ZXJWYWx1ZSkge1xyXG4gICAgICAgIC8vIGNvbnN0IGZpbHRlcnNBcnIgPSB0aGlzLnNlYXJjaEZpZWxkcy5zcGxpdChcIixcIik7XHJcbiAgICAgICAgLy8gZmlsdGVyc0Fyci5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgIC8vICAgZmlsdGVycy5wdXNoKGVsZW1lbnQgKyAnQD0qJyArIHRoaXMuZmlsdGVyVmFsdWUpO1xyXG4gICAgICAgIC8vIH0pO1xyXG4gICAgICAgIGNvbnN0IHkgPSAnKCcgKyB0aGlzLnNlYXJjaEZpZWxkcy5yZXBsYWNlKCcsJywgJ3wnKSArICcpJztcclxuICAgICAgICBmaWx0ZXJzLnB1c2goeSArICdAPSonICsgdGhpcy5maWx0ZXJWYWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLmRlZmF1bHRGaWx0ZXIpIHtcclxuICAgICAgZmlsdGVycy5wdXNoKHRoaXMuZGVmYXVsdEZpbHRlcik7XHJcbiAgICB9XHJcbiAgICBjb25zdCBmaWx0ZXJzVmFsdWUgPSBmaWx0ZXJzLmpvaW4oJywgJyk7XHJcbiAgICByZXR1cm4gdGhpcy5iYXNlU2VydmljZS5nZXRBbGwocGFnZUluZGV4LCBwYWdlU2l6ZSwgc29ydHMsIGZpbHRlcnNWYWx1ZSwgdGhpcy5jdXN0b21JbmNsdWRlKTtcclxuICB9XHJcblxyXG4gIHJlZnJlc2hGb3JtKCkge1xyXG4gICAgdGhpcy5nZXREYXRhKCkuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nUmVzdWx0cyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaXNSYXRlTGltaXRSZWFjaGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5yZXN1bHRzTGVuZ3RoID0gZGF0YS5nZXRNZXRhKCkubWV0YS5jb3VudDtcclxuICAgICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IGRhdGEuZ2V0TW9kZWxzKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmdSZXN1bHRzID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc1JhdGVMaW1pdFJlYWNoZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnJlc3VsdHNMZW5ndGggPSAwO1xyXG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gW107XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIGhpZ2hsaWdodChlbGVtZW50OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlbSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbS5oaWdobGlnaHRlZCA9IGVsZW1lbnQuaGlnaGxpZ2h0ZWQ7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IG51bGw7XHJcbiAgICBlbGVtZW50LmhpZ2hsaWdodGVkID0gIWVsZW1lbnQuaGlnaGxpZ2h0ZWQ7XHJcbiAgICBpZiAoZWxlbWVudC5oaWdobGlnaHRlZCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IGVsZW1lbnQ7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRPYmplY3QuZW1pdChlbGVtZW50KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRPYmplY3QuZW1pdChudWxsKTtcclxuICAgIH1cclxuICB9XHJcbiAgZGVsZXRlT2JqZWN0KG1vZGVsOiBUKSB7XHJcbiAgICBjb25zdCBtc2cgPSAnRG8geW91IHdhbnQgdG8gZGVsZXRlICcgKyBtb2RlbFt0aGlzLmRlbGV0ZVByb3BlcnR5TmFtZV0gKyAnPyc7XHJcbiAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuY29uZmlybShtc2cpLnN1YnNjcmliZSgocmVzcG9uc2U6IGJvb2xlYW4pID0+IHtcclxuICAgICAgaWYgKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgdGhpcy5iYXNlU2VydmljZS5kZWxldGUobW9kZWwuaWQpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCB0ZW1wRGF0YSA9IFtdO1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZE9iamVjdC5lbWl0KG51bGwpO1xyXG4gICAgICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEubWFwKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChpdGVtLmlkICE9PSBtb2RlbC5pZCkge1xyXG4gICAgICAgICAgICAgIHRlbXBEYXRhLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSB0ZW1wRGF0YTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGVkaXRPYmplY3QobW9kZWw6IFQpIHtcclxuICAgIGlmICghdGhpcy5wb3B1cEVkaXQpIHtcclxuICAgICAgY29uc3QgaWQgPSBtb2RlbC5pZDtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMuZWRpdExpbmssIGlkXSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmVkaXRNb2RlbC5lbWl0KG1vZGVsKTtcclxuICAgIH1cclxuICB9XHJcbiAgZ2V0RmxleFN0eWxlKGNvbHVtbjogR3JpZExheW91dE1vZGVsKSB7XHJcbiAgICBpZiAoY29sdW1uLndpZHRoKSB7XHJcbiAgICAgIGNvbnN0IHN0eWxlID0gY29sdW1uLmdyb3cgKyAnICcgKyBjb2x1bW4uc2hyaW5rICsgJyAnICsgY29sdW1uLndpZHRoICsgJ3B4JztcclxuICAgICAgcmV0dXJuIHN0eWxlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBnZXRDZWxsVGV4dEFsaWduKGNvbHVtbjogR3JpZExheW91dE1vZGVsKSB7XHJcbiAgICByZXR1cm4gY29sdW1uLnRleHRBbGlnbiA/PyBDZWxsVGV4dEFsaWduLmxlZnQ7XHJcbiAgfVxyXG5cclxuICBzaG93UGljdHVyZUNlbGwoY29sdW1uOiBHcmlkTGF5b3V0TW9kZWwpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoY29sdW1uPy5mb3JtYXRpbmcgPz8gR3JpZExheW91dEZvcm1hdC5ub25lKSA9PT0gR3JpZExheW91dEZvcm1hdC5waWN0dXJlO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRlRGlzYWJsZWQobW9kZWw6IFQpIHtcclxuICAgIGlmICh0aGlzLmRlbGV0ZURpc2FibGVSdWxlKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmV2YWx1YXRlUnVsZSh0aGlzLmRlbGV0ZURpc2FibGVSdWxlLCBtb2RlbCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGNlbGxDbGljayhtb2RlbDogVCwgcHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuY2xpY2suZW1pdCh7IHByb3BlcnR5TmFtZSwgbW9kZWwgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGV2YWx1YXRlUnVsZShydWxlczogUnVsZVtdLCBtb2RlbDogVCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHJlc3VsdCA9IHRydWU7XHJcbiAgICBydWxlcy5mb3JFYWNoKHJ1bGUgPT4ge1xyXG4gICAgICBsZXQganNvblJ1bGU6IGFueTtcclxuICAgICAgaWYgKHR5cGVvZiBydWxlLnJ1bGUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAganNvblJ1bGUgPSBKU09OLnBhcnNlKHJ1bGUucnVsZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAganNvblJ1bGUgPSBydWxlLnJ1bGU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHJ1bGUucGFyYW1ldGVycykge1xyXG4gICAgICAgIGNvbnN0IGRhdGEgPSAneycgKyBydWxlLnBhcmFtZXRlcnMubWFwKChpdGVtOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIHJldHVybiAnXCInICsgaXRlbSArICdcIjpcIicgKyBtb2RlbFtpdGVtXSArICdcIic7XHJcbiAgICAgICAgfSkuam9pbignLCcpICsgJ30nO1xyXG4gICAgICAgIHJlc3VsdCA9IGpzb25Mb2dpYy5hcHBseShqc29uUnVsZSwgSlNPTi5wYXJzZShkYXRhKSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzdWx0ID0ganNvbkxvZ2ljLmFwcGx5KGpzb25SdWxlKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuICBnZXRDZWxWYWx1ZShyb3c6IGFueSwgcHJvcGVydHlOYW1lOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgaWYgKCFyb3cpXHJcbiAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgLy8gaWYgKHByb3BlcnR5TmFtZSA9PSAna29tcGV0ZW56ZW5TdGRldicpXHJcbiAgICAvLyAgIGNvbnNvbGUubG9nKHByb3BlcnR5TmFtZSk7XHJcbiAgICBpZiAocHJvcGVydHlOYW1lLmluZGV4T2YoJy4nKSA9PT0gLTEpIHtcclxuICAgICAgdmFyIGdyaWRMYXlvdXQgPSB0aGlzLmdyaWRMYXlvdXQuZmluZChmID0+IGYucHJvcGVydHlOYW1lLmluZGV4T2YocHJvcGVydHlOYW1lKSA+IC0xKTtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0Rm9ybWF0ZWRWYWx1ZShncmlkTGF5b3V0LCByb3dbcHJvcGVydHlOYW1lXSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBwcm9wID0gcHJvcGVydHlOYW1lLnNwbGl0KCcuJylbMF07XHJcbiAgICAgIGNvbnN0IHN1YlByb3AgPSBwcm9wZXJ0eU5hbWUucmVwbGFjZShwcm9wICsgJy4nLCAnJyk7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldENlbFZhbHVlKHJvd1twcm9wXSwgc3ViUHJvcCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHByaXZhdGUgZ2V0Rm9ybWF0ZWRWYWx1ZShncmlkTGF5b3V0OiBHcmlkTGF5b3V0TW9kZWwsIHZhbHVlOiBhbnkpIHtcclxuXHJcbiAgICBpZiAoZ3JpZExheW91dCkge1xyXG4gICAgICBzd2l0Y2ggKGdyaWRMYXlvdXQuZm9ybWF0aW5nKSB7XHJcbiAgICAgICAgY2FzZSBHcmlkTGF5b3V0Rm9ybWF0LmRhdGU6XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0odmFsdWUsIGdyaWRMYXlvdXQuZm9ybWF0KTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgR3JpZExheW91dEZvcm1hdC5udW1iZXI6XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5udW1iZXJQaXBlLnRyYW5zZm9ybSh2YWx1ZSwgZ3JpZExheW91dC5mb3JtYXQpO1xyXG4gICAgICAgIGNhc2UgR3JpZExheW91dEZvcm1hdC5wZXJjZW50OlxyXG4gICAgICAgICAgY29uc3QgdmFsdWVQcmMgPSB2YWx1ZSAvIDEwMDtcclxuICAgICAgICAgIHJldHVybiB0aGlzLnBlcmNlbnRQaXBlLnRyYW5zZm9ybSh2YWx1ZVByYywgZ3JpZExheW91dC5mb3JtYXQpO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH1cclxuICBhcHBseUZpbHRlcihldmVudDogRXZlbnQpIHtcclxuICB9XHJcbiAgZHJvcFRhYmxlKGV2ZW50OiBDZGtEcmFnRHJvcDxhbnk+KSB7XHJcbiAgICBpZiAodGhpcy5jaGFuZ2VJdGVtUG9zaXRpb24pIHtcclxuICAgICAgY29uc3QgcHJldkl0ZW0gPSB0aGlzLmRhdGFTb3VyY2UuZGF0YVtldmVudC5wcmV2aW91c0luZGV4XTtcclxuICAgICAgY29uc3QgY3VycmVudEl0ZW0gPSB0aGlzLmRhdGFTb3VyY2UuZGF0YVtldmVudC5jdXJyZW50SW5kZXhdO1xyXG5cclxuICAgICAgaWYgKHRoaXMuY2hhbmdlSXRlbVBvc2l0aW9uKHByZXZJdGVtLCBjdXJyZW50SXRlbSkpIHtcclxuICAgICAgICBjb25zdCBwcmV2SW5kZXggPSB0aGlzLmRhdGFTb3VyY2UuZGF0YS5maW5kSW5kZXgoKGQpID0+IGQgPT09IGV2ZW50Lml0ZW0uZGF0YSk7XHJcbiAgICAgICAgbW92ZUl0ZW1JbkFycmF5KHRoaXMuZGF0YVNvdXJjZS5kYXRhLCBwcmV2SW5kZXgsIGV2ZW50LmN1cnJlbnRJbmRleCk7XHJcbiAgICAgICAgdGhpcy50YWJsZS5yZW5kZXJSb3dzKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgaXNDb2x1bW5TdGlja3kobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5zdGlja3lDb2x1bW5zKSB7XHJcbiAgICAgIGNvbnN0IGZpbHRlcnNBcnIgPSB0aGlzLnN0aWNreUNvbHVtbnMuc3BsaXQoXCIsXCIpO1xyXG4gICAgICByZXR1cm4gZmlsdGVyc0Fyci5maW5kSW5kZXgoZiA9PiBmID09IG5hbWUpICE9PSAtMTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAgdXBkYXRlRWxlbWVudChtb2RlbDogVCkge1xyXG4gICAgLy9GaW5kIGlmIGVsZW1lbnQgZXhpc3RcclxuICAgIHZhciBjdXJyZW50RWxlbWVudCA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhLmZpbmQoZiA9PiBmLmlkID09PSBtb2RlbC5pZCk7XHJcbiAgICBpZiAoY3VycmVudEVsZW1lbnQgIT09IG51bGwpIHtcclxuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmRhdGFTb3VyY2UuZGF0YS5pbmRleE9mKGN1cnJlbnRFbGVtZW50KTtcclxuICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGFbaW5kZXhdID0gbW9kZWw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YS5wdXNoKG1vZGVsKTtcclxuICAgIH1cclxuICAgIGNvbnN0IG5ld0RhdGEgPSBbLi4udGhpcy5kYXRhU291cmNlLmRhdGFdO1xyXG4gICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSBuZXdEYXRhO1xyXG4gICAgdGhpcy5kYXRhU291cmNlLl91cGRhdGVDaGFuZ2VTdWJzY3JpcHRpb24oKTtcclxuICB9XHJcbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIGZyb21FdmVudCh0aGlzLm1hdFRhYmxlUmVmLm5hdGl2ZUVsZW1lbnQsICdzY3JvbGwnKVxyXG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoNzAwKSlcclxuICAgICAgLnN1YnNjcmliZSgoZTogYW55KSA9PiB0aGlzLm9uVGFibGVTY3JvbGwoZSkpO1xyXG4gIH1cclxuICBvblRhYmxlU2Nyb2xsKGUpIHtcclxuICAgIGNvbnN0IHRhYmxlVmlld0hlaWdodCA9IGUudGFyZ2V0Lm9mZnNldEhlaWdodCAvLyB2aWV3cG9ydDogfjUwMHB4XHJcbiAgICBjb25zdCB0YWJsZVNjcm9sbEhlaWdodCA9IGUudGFyZ2V0LnNjcm9sbEhlaWdodCAvLyBsZW5ndGggb2YgYWxsIHRhYmxlXHJcbiAgICBjb25zdCBzY3JvbGxMb2NhdGlvbiA9IGUudGFyZ2V0LnNjcm9sbFRvcDsgLy8gaG93IGZhciB1c2VyIHNjcm9sbGVkXHJcblxyXG4gICAgLy8gSWYgdGhlIHVzZXIgaGFzIHNjcm9sbGVkIHdpdGhpbiAyMDBweCBvZiB0aGUgYm90dG9tLCBhZGQgbW9yZSBkYXRhXHJcbiAgICBjb25zdCBzY3JvbGxUaHJlc2hvbGQgPSAyMDA7XHJcblxyXG4gICAgY29uc3Qgc2Nyb2xsVXBMaW1pdCA9IHNjcm9sbFRocmVzaG9sZDtcclxuICAgIGlmIChzY3JvbGxMb2NhdGlvbiA8IHNjcm9sbFVwTGltaXQgJiYgdGhpcy5wYWdpbmF0b3IucGFnZUluZGV4ID4gMCkge1xyXG4gICAgICAvLyB0aGlzLmZpcnN0UGFnZS0tO1xyXG4gICAgICBjb25zb2xlLmxvZyhgb25UYWJsZVNjcm9sbCgpIFVQOiBmaXJzdFBhZ2UgZGVjcmVhc2VkIHRvICR7dGhpcy5wYWdpbmF0b3IucGFnZUluZGV4fS4gTm93IGZldGNoaW5nIGRhdGEuLi5gKTtcclxuICAgICAgLy8gdGhpcy5mZXRjaERhdGEoKTtcclxuXHJcbiAgICAgIHRoaXMuc2Nyb2xsVG8odGFibGVTY3JvbGxIZWlnaHQgLyAyIC0gMiAqIHRhYmxlVmlld0hlaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2Nyb2xsRG93bkxpbWl0ID0gdGFibGVTY3JvbGxIZWlnaHQgLSB0YWJsZVZpZXdIZWlnaHQgLSBzY3JvbGxUaHJlc2hvbGQ7XHJcbiAgICBpZiAoc2Nyb2xsTG9jYXRpb24gPiBzY3JvbGxEb3duTGltaXQgJiYgdGhpcy5wYWdpbmF0b3IucGFnZUluZGV4IDwgdGhpcy5wYWdpbmF0b3IuZ2V0TnVtYmVyT2ZQYWdlcygpKSB7XHJcbiAgICAgIC8vIHRoaXMuZmlyc3RQYWdlKys7XHJcbiAgICAgIGNvbnNvbGUubG9nKGBvblRhYmxlU2Nyb2xsKCk6IGZpcnN0UGFnZSBpbmNyZWFzZWQgdG8gJHt0aGlzLnBhZ2luYXRvci5wYWdlSW5kZXh9LiBOb3cgZmV0Y2hpbmcgZGF0YS4uLmApO1xyXG4gICAgICB0aGlzLnBhZ2luYXRvci5uZXh0UGFnZSgpO1xyXG4gICAgICAvLyB0aGlzLnNjcm9sbFRvKHRhYmxlU2Nyb2xsSGVpZ2h0IC8gMiArIHRhYmxlVmlld0hlaWdodCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHByaXZhdGUgc2Nyb2xsVG8ocG9zaXRpb246IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLm1hdFRhYmxlUmVmLm5hdGl2ZUVsZW1lbnQsICdzY3JvbGxUb3AnLCBwb3NpdGlvbik7XHJcbiAgfVxyXG4gIGdldENlbGxDbGFzcyhtb2RlbDogVCwgcHJvcGVydHk6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIG1vZGVsLmdldENlbGxDbGFzcyhwcm9wZXJ0eSk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJjb250YWluZXJYXCIgKm5nSWY9XCJoYXNTZWFyY2hcIj5cclxuICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXQueHM9XCJjb2x1bW5cIiBmeExheW91dC5zbT1cImNvbHVtblwiIGZ4RmxleEZpbGw+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQgZnhGbGV4PlxyXG4gICAgICA8bWF0LWxhYmVsPkZpbHRlcjwvbWF0LWxhYmVsPlxyXG4gICAgICA8aW5wdXQgbWF0SW5wdXQgW25nTW9kZWxdPSdmaWx0ZXJWYWx1ZScgKG5nTW9kZWxDaGFuZ2UpPSdmaWx0ZXJDaGFuZ2VkLm5leHQoJGV2ZW50KScgI2ZpbHRlcj5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiBjbGFzcz1cInRhYmxlLWNvbnRhaW5lclwiPlxyXG4gIDxkaXYgY2xhc3M9XCJtYXQtZWxldmF0aW9uLXoyXCI+XHJcbiAgICA8IS0tICAjYXBwbGljYXRpb25zQ29udGFpbmVyIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImV4YW1wbGUtbG9hZGluZy1zaGFkZVwiICpuZ0lmPVwiaXNMb2FkaW5nUmVzdWx0cyB8fCBpc1JhdGVMaW1pdFJlYWNoZWRcIj5cclxuICAgICAgPG1hdC1zcGlubmVyICpuZ0lmPVwiaXNMb2FkaW5nUmVzdWx0c1wiPjwvbWF0LXNwaW5uZXI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJleGFtcGxlLXJhdGUtbGltaXQtcmVhY2hlZFwiICpuZ0lmPVwiaXNSYXRlTGltaXRSZWFjaGVkXCI+XHJcbiAgICAgICAge3snR2VuZXJhbC5Mb2FkaW5nRGF0YScgfCB0cmFuc2xhdGV9fVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICA8bWF0LXRhYmxlIGZ4RmxleCAjdGFibGUgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiIGlkPVwidGVtcGFsdGUtZm9ybXMtdGFibGVcIiBtYXRTb3J0IG1hdFNvcnREaXNhYmxlQ2xlYXJcclxuICAgICAgbWF0U29ydERpcmVjdGlvbj1cImFzY1wiIGNka0Ryb3BMaXN0IFtjZGtEcm9wTGlzdERhdGFdPVwiZGF0YVNvdXJjZVwiIChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcFRhYmxlKCRldmVudClcIj5cclxuICAgICAgPCEtLSAoc2Nyb2xsKT1cIm9uVGFibGVTY3JvbGwoJGV2ZW50KVwiIC0tPlxyXG5cclxuXHJcbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwicG9zaXRpb25cIj5cclxuICAgICAgICA8bWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGRpc2FibGVDbGVhcj1cInRydWVcIj5cclxuICAgICAgICAgIDwhLS0ge3snR2VuZXJhbC5PcmRlcicgfCB0cmFuc2xhdGV9fSAtLT5cclxuICAgICAgICA8L21hdC1oZWFkZXItY2VsbD5cclxuICAgICAgICA8bWF0LWNlbGwgZnhGbGV4ICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnQ7XCI+XHJcbiAgICAgICAgICA8bWF0LWljb24gY2RrRHJhZ0hhbmRsZT5yZW9yZGVyPC9tYXQtaWNvbj5cclxuICAgICAgICA8L21hdC1jZWxsPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgZ3JpZExheW91dFwiIFttYXRDb2x1bW5EZWZdPVwiY29sdW1uLnByb3BlcnR5TmFtZVwiXHJcbiAgICAgICAgW3N0aWNreV09XCJpc0NvbHVtblN0aWNreShjb2x1bW4ucHJvcGVydHlOYW1lKVwiPlxyXG4gICAgICAgIDxtYXQtaGVhZGVyLWNlbGwgbWF0LXNvcnQtaGVhZGVyIGRpc2FibGVDbGVhciBbc3R5bGUuZmxleF09XCJnZXRGbGV4U3R5bGUoY29sdW1uKVwiICptYXRIZWFkZXJDZWxsRGVmPlxyXG4gICAgICAgICAge3tjb2x1bW4udHJhbnNsYXRlS2V5IHwgdHJhbnNsYXRlfX1cclxuICAgICAgICA8L21hdC1oZWFkZXItY2VsbD5cclxuICAgICAgICA8bWF0LWNlbGwgbWF0VG9vbHRpcD17e2dldENlbFZhbHVlKHJvdyxjb2x1bW4ucHJvcGVydHlOYW1lKX19IFtzdHlsZS5mbGV4XT1cImdldEZsZXhTdHlsZShjb2x1bW4pXCJcclxuICAgICAgICAgIFtzdHlsZS50ZXh0LWFsaWduXT1cImdldENlbGxUZXh0QWxpZ24oY29sdW1uKVwiICptYXRDZWxsRGVmPVwibGV0IHJvd1wiICAoY2xpY2spPVwiY2VsbENsaWNrKHJvdyxjb2x1bW4ucHJvcGVydHlOYW1lKVwiPlxyXG4gICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJnZXRDZWxsQ2xhc3Mocm93LGNvbHVtbi5wcm9wZXJ0eU5hbWUpXCIgKm5nSWY9XCIhc2hvd1BpY3R1cmVDZWxsKGNvbHVtbilcIj5cclxuICAgICAgICAgICAge3tnZXRDZWxWYWx1ZShyb3csY29sdW1uLnByb3BlcnR5TmFtZSl9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8aW1nIFtuZ0NsYXNzXT1cImdldENlbGxDbGFzcyhyb3csY29sdW1uLnByb3BlcnR5TmFtZSlcIiAqbmdJZj1cInNob3dQaWN0dXJlQ2VsbChjb2x1bW4pXCI+XHJcbiAgICAgICAgPC9tYXQtY2VsbD5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJkZWxldGVcIiBzdGlja3lFbmQgKm5nSWY9XCIhZWRpdE9uQ2xpY2sgJiYgIWVkaXRPbkRibENsaWNrXCI+XHJcbiAgICAgICAgPG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBkaXNhYmxlQ2xlYXI9XCJ0cnVlXCI+XHJcbiAgICAgICAgPC9tYXQtaGVhZGVyLWNlbGw+XHJcbiAgICAgICAgPG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxyXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tZ3JlZW4gYnRuLWZpbGwgYnRuLXdkIGJ0bi1qdXN0LWljb25cIiAoY2xpY2spPVwiZWRpdE9iamVjdChyb3cpXCJcclxuICAgICAgICAgICAgbWF0VG9vbHRpcD1cInt7J0dlbmVyYWwuRWRpdCcgfCB0cmFuc2xhdGV9fVwiPlxyXG4gICAgICAgICAgICA8IS0tIDxtYXQtaWNvbj5lZGl0PC9tYXQtaWNvbj4gLS0+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnNcIj5lZGl0PC9pPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmlwcGxlLWNvbnRhaW5lclwiPjwvZGl2PlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1yZWQgYnRuLWZpbGwgYnRuLXdkIGJ0bi1qdXN0LWljb25cIiAoY2xpY2spPVwiZGVsZXRlT2JqZWN0KHJvdylcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGVsZXRlRGlzYWJsZWQocm93KVwiIG1hdFRvb2x0aXA9XCJ7eydHZW5lcmFsLkRlbGV0ZScgfCB0cmFuc2xhdGV9fVwiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cIm1hdGVyaWFsLWljb25zXCI+ZGVsZXRlPC9pPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmlwcGxlLWNvbnRhaW5lclwiPjwvZGl2PlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9tYXQtY2VsbD5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICA8bWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnM7c3RpY2t5OiB0cnVlXCI+PC9tYXQtaGVhZGVyLXJvdz5cclxuXHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZWRpdE9uQ2xpY2sgJiYgIWVkaXRPbkRibENsaWNrXCI+XHJcbiAgICAgICAgPG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7bGV0IGluZGV4ID0gZGF0YUluZGV4OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zO1wiIGNka0RyYWcgW2Nka0RyYWdEYXRhXT1cInJvd1wiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7aG92ZXJlZDogcm93LmhvdmVyZWQsIGhpZ2hsaWdodGVkOiByb3cuaGlnaGxpZ2h0ZWR9XCIgKGNsaWNrKT1cImhpZ2hsaWdodChyb3cpXCJcclxuICAgICAgICAgIChtb3VzZW92ZXIpPVwicm93LmhvdmVyZWQgPSB0cnVlXCIgKG1vdXNlb3V0KT1cInJvdy5ob3ZlcmVkID0gZmFsc2VcIj5cclxuICAgICAgICA8L21hdC1yb3c+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVkaXRPbkNsaWNrICYmICFlZGl0T25EYmxDbGlja1wiPlxyXG4gICAgICAgIDxtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93O2xldCBpbmRleCA9IGRhdGFJbmRleDsgY29sdW1uczogZGlzcGxheWVkQ29sdW1ucztcIiBjZGtEcmFnIFtjZGtEcmFnRGF0YV09XCJyb3dcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwie2hvdmVyZWQ6IHJvdy5ob3ZlcmVkLCBoaWdobGlnaHRlZDogcm93LmhpZ2hsaWdodGVkfVwiIChjbGljayk9XCJlZGl0T2JqZWN0KHJvdylcIlxyXG4gICAgICAgICAgKG1vdXNlb3Zlcik9XCJyb3cuaG92ZXJlZCA9IHRydWVcIiAobW91c2VvdXQpPVwicm93LmhvdmVyZWQgPSBmYWxzZVwiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyO1wiPjwvbWF0LXJvdz5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWVkaXRPbkNsaWNrICYmIGVkaXRPbkRibENsaWNrXCI+XHJcbiAgICAgICAgPG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7bGV0IGluZGV4ID0gZGF0YUluZGV4OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zO1wiIGNka0RyYWcgW2Nka0RyYWdEYXRhXT1cInJvd1wiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7aG92ZXJlZDogcm93LmhvdmVyZWQsIGhpZ2hsaWdodGVkOiByb3cuaGlnaGxpZ2h0ZWR9XCIgKGRibGNsaWNrKT1cImVkaXRPYmplY3Qocm93KVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiaGlnaGxpZ2h0KHJvdylcIiAobW91c2VvdmVyKT1cInJvdy5ob3ZlcmVkID0gdHJ1ZVwiIChtb3VzZW91dCk9XCJyb3cuaG92ZXJlZCA9IGZhbHNlXCJcclxuICAgICAgICAgIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyO1wiPjwvbWF0LXJvdz5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICA8IS0tIFtuZ0NsYXNzXT1cIntob3ZlcmVkOiByb3cuaG92ZXJlZCwgaGlnaGxpZ2h0ZWQ6IHJvdy5oaWdobGlnaHRlZH1cIlxyXG4gICAgICAgIChjbGljayk9XCJoaWdobGlnaHQocm93KVwiIChtb3VzZW92ZXIpPVwicm93LmhvdmVyZWQgPSB0cnVlXCIgKG1vdXNlb3V0KT1cInJvdy5ob3ZlcmVkID0gZmFsc2VcIiAtLT5cclxuICAgIDwvbWF0LXRhYmxlPlxyXG4gICAgPG1hdC1wYWdpbmF0b3IgI3BhZ2luYXRvciBbaGlkZGVuXT1cImluZmluaXRlU2Nyb2xsXCIgW2xlbmd0aF09XCJyZXN1bHRzTGVuZ3RoXCIgW3BhZ2VTaXplXT1cIjE1XCJcclxuICAgICAgW3BhZ2VTaXplT3B0aW9uc109XCJbMTUsIDMwLCAgMTAwXVwiIFtzaG93Rmlyc3RMYXN0QnV0dG9uc109XCJ0cnVlXCI+XHJcbiAgICA8L21hdC1wYWdpbmF0b3I+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==
@@ -0,0 +1,3 @@
1
+ export { GenericTableComponent } from './generic-table/generic-table.component';
2
+ export { SearchableDropdownComponent } from './searchable-dropdown/searchable-dropdown.component';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yb3NvZnRsYWIvbWF0ZXJpYWwvc3JjL2xpYi9jb21wb25lbnRzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFBO0FBQy9FLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHFEQUFxRCxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgR2VuZXJpY1RhYmxlQ29tcG9uZW50IH0gZnJvbSAnLi9nZW5lcmljLXRhYmxlL2dlbmVyaWMtdGFibGUuY29tcG9uZW50J1xyXG5leHBvcnQgeyBTZWFyY2hhYmxlRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICcuL3NlYXJjaGFibGUtZHJvcGRvd24vc2VhcmNoYWJsZS1kcm9wZG93bi5jb21wb25lbnQnXHJcblxyXG4iXX0=