@acorex/data-grid 3.0.63 → 4.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. package/acorex-data-grid.d.ts +1 -0
  2. package/esm2020/acorex-data-grid.mjs +5 -0
  3. package/esm2020/lib/data-grid/columns/check-column.component.mjs +117 -0
  4. package/esm2020/lib/data-grid/columns/column.component.mjs +164 -0
  5. package/{esm2015/lib/data-grid/columns/command-column.component.js → esm2020/lib/data-grid/columns/command-column.component.mjs} +46 -35
  6. package/esm2020/lib/data-grid/columns/date-column.component.mjs +112 -0
  7. package/esm2020/lib/data-grid/columns/row-number-column.component.mjs +37 -0
  8. package/esm2020/lib/data-grid/columns/selection-column.component.mjs +42 -0
  9. package/esm2020/lib/data-grid/columns/text-column.component.mjs +89 -0
  10. package/esm2020/lib/data-grid/datagrid.component.mjs +658 -0
  11. package/esm2020/lib/data-grid/datagrid.events.mjs +2 -0
  12. package/esm2020/lib/data-grid/datagrid.module.mjs +145 -0
  13. package/esm2020/lib/data-grid/filters/filter.component.mjs +39 -0
  14. package/esm2020/lib/data-grid/templates/cell-template.component.mjs +53 -0
  15. package/esm2020/lib/data-grid/templates/detail-template.component.mjs +46 -0
  16. package/esm2020/lib/data-grid/templates/row-template.component.mjs +43 -0
  17. package/esm2020/lib/data-lov/data-lov-popup/data-lov-popup.component.mjs +118 -0
  18. package/esm2020/lib/data-lov/data-lov.component.mjs +163 -0
  19. package/esm2020/lib/data-lov/data-lov.module.mjs +23 -0
  20. package/esm2020/public-api.mjs +18 -0
  21. package/fesm2015/acorex-data-grid.mjs +1875 -0
  22. package/fesm2015/acorex-data-grid.mjs.map +1 -0
  23. package/fesm2020/acorex-data-grid.mjs +1875 -0
  24. package/fesm2020/acorex-data-grid.mjs.map +1 -0
  25. package/lib/data-grid/columns/check-column.component.d.ts +7 -0
  26. package/lib/data-grid/columns/column.component.d.ts +3 -0
  27. package/lib/data-grid/columns/command-column.component.d.ts +5 -0
  28. package/lib/data-grid/columns/date-column.component.d.ts +5 -0
  29. package/lib/data-grid/columns/row-number-column.component.d.ts +3 -0
  30. package/lib/data-grid/columns/selection-column.component.d.ts +3 -0
  31. package/lib/data-grid/columns/text-column.component.d.ts +5 -0
  32. package/lib/data-grid/datagrid.component.d.ts +8 -1
  33. package/lib/data-grid/datagrid.module.d.ts +20 -0
  34. package/lib/data-grid/filters/filter.component.d.ts +3 -0
  35. package/lib/data-grid/templates/cell-template.component.d.ts +5 -0
  36. package/lib/data-grid/templates/detail-template.component.d.ts +5 -0
  37. package/lib/data-grid/templates/row-template.component.d.ts +5 -0
  38. package/lib/data-lov/data-lov-popup/data-lov-popup.component.d.ts +3 -0
  39. package/lib/data-lov/data-lov.component.d.ts +3 -0
  40. package/lib/data-lov/data-lov.module.d.ts +10 -0
  41. package/package.json +23 -13
  42. package/acorex-data-grid.metadata.json +0 -1
  43. package/bundles/acorex-data-grid.umd.js +0 -2249
  44. package/bundles/acorex-data-grid.umd.js.map +0 -1
  45. package/bundles/acorex-data-grid.umd.min.js +0 -16
  46. package/bundles/acorex-data-grid.umd.min.js.map +0 -1
  47. package/esm2015/acorex-data-grid.js +0 -5
  48. package/esm2015/lib/data-grid/columns/check-column.component.js +0 -104
  49. package/esm2015/lib/data-grid/columns/column.component.js +0 -204
  50. package/esm2015/lib/data-grid/columns/date-column.component.js +0 -114
  51. package/esm2015/lib/data-grid/columns/row-number-column.component.js +0 -39
  52. package/esm2015/lib/data-grid/columns/selection-column.component.js +0 -48
  53. package/esm2015/lib/data-grid/columns/text-column.component.js +0 -81
  54. package/esm2015/lib/data-grid/datagrid.component.js +0 -722
  55. package/esm2015/lib/data-grid/datagrid.events.js +0 -1
  56. package/esm2015/lib/data-grid/datagrid.module.js +0 -98
  57. package/esm2015/lib/data-grid/filters/filter.component.js +0 -25
  58. package/esm2015/lib/data-grid/templates/cell-template.component.js +0 -47
  59. package/esm2015/lib/data-grid/templates/detail-template.component.js +0 -45
  60. package/esm2015/lib/data-grid/templates/row-template.component.js +0 -40
  61. package/esm2015/lib/data-lov/data-lov-popup/data-lov-popup.component.js +0 -121
  62. package/esm2015/lib/data-lov/data-lov.component.js +0 -212
  63. package/esm2015/lib/data-lov/data-lov.module.js +0 -21
  64. package/esm2015/public-api.js +0 -17
  65. package/esm5/acorex-data-grid.js +0 -5
  66. package/esm5/lib/data-grid/columns/check-column.component.js +0 -102
  67. package/esm5/lib/data-grid/columns/column.component.js +0 -206
  68. package/esm5/lib/data-grid/columns/command-column.component.js +0 -98
  69. package/esm5/lib/data-grid/columns/date-column.component.js +0 -119
  70. package/esm5/lib/data-grid/columns/row-number-column.component.js +0 -42
  71. package/esm5/lib/data-grid/columns/selection-column.component.js +0 -52
  72. package/esm5/lib/data-grid/columns/text-column.component.js +0 -81
  73. package/esm5/lib/data-grid/datagrid.component.js +0 -780
  74. package/esm5/lib/data-grid/datagrid.events.js +0 -1
  75. package/esm5/lib/data-grid/datagrid.module.js +0 -101
  76. package/esm5/lib/data-grid/filters/filter.component.js +0 -16
  77. package/esm5/lib/data-grid/templates/cell-template.component.js +0 -46
  78. package/esm5/lib/data-grid/templates/detail-template.component.js +0 -49
  79. package/esm5/lib/data-grid/templates/row-template.component.js +0 -44
  80. package/esm5/lib/data-lov/data-lov-popup/data-lov-popup.component.js +0 -127
  81. package/esm5/lib/data-lov/data-lov.component.js +0 -222
  82. package/esm5/lib/data-lov/data-lov.module.js +0 -24
  83. package/esm5/public-api.js +0 -17
  84. package/fesm2015/acorex-data-grid.js +0 -1927
  85. package/fesm2015/acorex-data-grid.js.map +0 -1
  86. package/fesm5/acorex-data-grid.js +0 -2005
  87. package/fesm5/acorex-data-grid.js.map +0 -1
@@ -1,780 +0,0 @@
1
- import { __decorate, __extends, __metadata, __read, __spread } from "tslib";
2
- import { Component, ContentChild, Input, ContentChildren, QueryList, EventEmitter, Output, ElementRef, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core';
3
- import { AXDataSourceComponent } from '@acorex/components';
4
- import { AXGridDataColumn } from './columns/column.component';
5
- import { LicenseManager } from 'ag-grid-enterprise';
6
- import { ViewEncapsulation } from '@angular/core';
7
- import { AXDataGridRowTemplateComponent } from './templates/row-template.component';
8
- import { AXToolbarSearchComponent, AXToolbarComponent, AXDataEvent, AXValueEvent } from '@acorex/components';
9
- import { AXDataGridDetailTemplateComponent } from './templates/detail-template.component';
10
- import { AXTranslator } from '@acorex/core';
11
- import { AXDatePickerFilterComponent } from './columns/date-column.component';
12
- import { AXConfig } from '@acorex/core';
13
- LicenseManager.prototype.validateLicense = function () {
14
- //console.info('Cracked by Arash Oshnoudi!');
15
- };
16
- // WatermarkComp.prototype.shouldDisplayWatermark = function () {
17
- // return false;
18
- // }
19
- var AXDataGridColumnsChangeEvent = /** @class */ (function (_super) {
20
- __extends(AXDataGridColumnsChangeEvent, _super);
21
- function AXDataGridColumnsChangeEvent() {
22
- return _super !== null && _super.apply(this, arguments) || this;
23
- }
24
- return AXDataGridColumnsChangeEvent;
25
- }(AXValueEvent));
26
- export { AXDataGridColumnsChangeEvent };
27
- var AXDataGridCellEvent = /** @class */ (function (_super) {
28
- __extends(AXDataGridCellEvent, _super);
29
- function AXDataGridCellEvent() {
30
- return _super !== null && _super.apply(this, arguments) || this;
31
- }
32
- return AXDataGridCellEvent;
33
- }(AXDataEvent));
34
- export { AXDataGridCellEvent };
35
- var AXDaagridRowClickEvent = /** @class */ (function (_super) {
36
- __extends(AXDaagridRowClickEvent, _super);
37
- function AXDaagridRowClickEvent() {
38
- return _super !== null && _super.apply(this, arguments) || this;
39
- }
40
- return AXDaagridRowClickEvent;
41
- }(AXDataEvent));
42
- export { AXDaagridRowClickEvent };
43
- var AXDataGridSelectionChangeEvent = /** @class */ (function (_super) {
44
- __extends(AXDataGridSelectionChangeEvent, _super);
45
- function AXDataGridSelectionChangeEvent() {
46
- return _super !== null && _super.apply(this, arguments) || this;
47
- }
48
- return AXDataGridSelectionChangeEvent;
49
- }(AXDataEvent));
50
- export { AXDataGridSelectionChangeEvent };
51
- var AXDataGridRowSelectionChangeEvent = /** @class */ (function (_super) {
52
- __extends(AXDataGridRowSelectionChangeEvent, _super);
53
- function AXDataGridRowSelectionChangeEvent() {
54
- return _super !== null && _super.apply(this, arguments) || this;
55
- }
56
- return AXDataGridRowSelectionChangeEvent;
57
- }(AXDataEvent));
58
- export { AXDataGridRowSelectionChangeEvent };
59
- var AXDataGridComponent = /** @class */ (function () {
60
- function AXDataGridComponent(ref, cdr) {
61
- var _this = this;
62
- this.ref = ref;
63
- this.cdr = cdr;
64
- this.columnDefs = [];
65
- this.rowModelType = 'clientSide';
66
- this.frameworkComponents = {};
67
- this.internalHeight = '100%';
68
- this.masterDetail = false;
69
- this.treeData = false;
70
- this.enabelSelect = false;
71
- this.gridView = false;
72
- this.groupSelectsChildren = false;
73
- this.oldSelectionNodes = [];
74
- this.paginationAutoPageSize = true;
75
- this.paginationPageSize = 10;
76
- this.cacheBlockSize = 10;
77
- // @Input()
78
- // showRowNumber: boolean = true;
79
- this.remoteOperation = false;
80
- this.rowMultiSelectWithClick = true;
81
- this.suppressRowClickSelection = true;
82
- this.suppressCellSelection = false;
83
- this.sizeColumnsToFit = true;
84
- this.showCheckBox = true;
85
- this.floatingFilter = false;
86
- this.autoGroupColumnDef = {};
87
- this.selectionMode = 'single';
88
- // @Input()
89
- // allowFiltering: boolean = false;
90
- this.selectRow = [];
91
- this.rowGroupPanelShow = 'never';
92
- this.loadOnInit = true;
93
- // @Input()
94
- // groupDefaultExpanded: number = 0;
95
- this.keyField = 'null';
96
- this.hasChildField = 'null';
97
- this.columnsChange = new EventEmitter();
98
- this._columns = [];
99
- this.defaultColDef = {
100
- filter: true,
101
- floatingFilter: true
102
- };
103
- this.groupHideOpenParents = false;
104
- this.cellClick = new EventEmitter();
105
- this.cellDbClick = new EventEmitter();
106
- this.cellFocuse = new EventEmitter();
107
- this.rowClick = new EventEmitter();
108
- this.rowDbClick = new EventEmitter();
109
- this.selectionChanged = new EventEmitter();
110
- this.rowSelectionChange = new EventEmitter();
111
- this.onRowSelectionChanged = new EventEmitter();
112
- this.rtl = AXConfig.get('layout.rtl');
113
- this.isServerSideGroup = function (e) {
114
- return e[_this.hasChildField];
115
- };
116
- this.getColumnDefs = function () {
117
- return _this.gridApi.getColumnDefs();
118
- };
119
- this.getServerSideGroupKey = function (e) {
120
- return e[_this.keyField];
121
- };
122
- this.internalGetRowClass = function (p) {
123
- if (_this.rowClass) {
124
- if (_this.rowClass instanceof Function) {
125
- return _this.rowClass({
126
- rowIndex: p.node.rowIndex,
127
- rowLevel: p.node.level,
128
- data: p.data
129
- });
130
- }
131
- else {
132
- return _this.rowClass;
133
- }
134
- }
135
- };
136
- this.localeText = AXTranslator.get('dataGrid');
137
- }
138
- Object.defineProperty(AXDataGridComponent.prototype, "searchText", {
139
- get: function () {
140
- return this._searchText;
141
- },
142
- set: function (v) {
143
- if (v !== this._searchText) {
144
- this._searchText = v;
145
- if (this.gridApi) {
146
- this.refresh();
147
- this.gridApi.setQuickFilter(this.searchText);
148
- }
149
- }
150
- },
151
- enumerable: true,
152
- configurable: true
153
- });
154
- Object.defineProperty(AXDataGridComponent.prototype, "filter", {
155
- get: function () {
156
- return this._filter;
157
- },
158
- set: function (v) {
159
- var _this = this;
160
- if (v !== this._filter) {
161
- this._filter = v;
162
- this._filter.forEach(function (f) {
163
- var fc = _this.gridApi.getFilterInstance(f.field);
164
- if (fc) {
165
- var ff = fc.getFrameworkComponentInstance();
166
- ff.setModel(f);
167
- }
168
- });
169
- }
170
- },
171
- enumerable: true,
172
- configurable: true
173
- });
174
- Object.defineProperty(AXDataGridComponent.prototype, "columns", {
175
- get: function () {
176
- return this._inlineColumns ? __spread(this._columns, this._inlineColumns.toArray()) : this._columns;
177
- },
178
- set: function (val) {
179
- if (val && val.length) {
180
- var old = this._columns;
181
- this._columns = val;
182
- this.columnsChange.emit({ component: this, value: val, oldValue: old, htmlElement: this.ref.nativeElement });
183
- }
184
- },
185
- enumerable: true,
186
- configurable: true
187
- });
188
- Object.defineProperty(AXDataGridComponent.prototype, "dataSource", {
189
- get: function () {
190
- return this._dataSource ? this._dataSource : this._contentDataSource;
191
- },
192
- set: function (v) {
193
- this._dataSource = v;
194
- },
195
- enumerable: true,
196
- configurable: true
197
- });
198
- AXDataGridComponent.prototype.getRowHeight = function (param) {
199
- if (param.data && param.data.rowHeight && param.node.level == 0) {
200
- return param.data.rowHeight;
201
- }
202
- else if (this.masterDetail == true && param.node.level == 1) {
203
- return this.detailRowHeight;
204
- }
205
- else if (this.masterDetail == false && param.data && param.data.rowHeight) {
206
- return param.data.rowHeight;
207
- }
208
- else {
209
- return null;
210
- }
211
- };
212
- AXDataGridComponent.prototype.calcHeight = function () {
213
- if (this.toolbar) {
214
- this.internalHeight = "calc(100% - " + 40 + "px)";
215
- }
216
- else {
217
- this.internalHeight = '100%';
218
- }
219
- };
220
- Object.defineProperty(AXDataGridComponent.prototype, "intenalGridDataSource", {
221
- get: function () {
222
- var that = this;
223
- return {
224
- rowCount: null,
225
- getRows: function (params) {
226
- // that.gridApi.gridOptionsWrapper.setProperty('cacheBlockSize', this.takeCount ? this.takeCount : params.api.paginationGetPageSize());
227
- that.dataSourceSuccessCallback = params.successCallback;
228
- var loadParams = {};
229
- loadParams.searchText = that.searchText;
230
- loadParams.skip = params.request.startRow;
231
- // loadParams.take = params.request.endRow - params.request.startRow;
232
- loadParams.take = that.takeCount ? that.takeCount : params.api.paginationGetPageSize() * 2;
233
- loadParams.sort = params.request.sortModel.map(function (c) {
234
- return {
235
- field: c.colId,
236
- dir: c.sort
237
- };
238
- });
239
- // loadParams.groups = params.request.rowGroupCols.map(r => r.field);
240
- // loadParams.groupKeys = params.request.groupKeys;
241
- // loadParams.data = params.parentNode.data;
242
- loadParams.group = {
243
- fields: params.request.rowGroupCols.map(function (r) { return r.field; }),
244
- keys: params.request.groupKeys,
245
- parentData: params.parentNode.data
246
- };
247
- loadParams.filter = params.request.filterModel;
248
- that.dataSource.fetch(loadParams);
249
- }
250
- };
251
- },
252
- enumerable: true,
253
- configurable: true
254
- });
255
- AXDataGridComponent.prototype.getMainMenuItems = function (e) {
256
- return ['pinSubMenu', 'separator'];
257
- };
258
- AXDataGridComponent.prototype.ngOnDestroy = function () {
259
- this.gridApi.destroy();
260
- };
261
- // todo gridOptions: GridOptions
262
- AXDataGridComponent.prototype.internalGridReady = function (gridOptions) {
263
- gridOptions.api.checkGridSize();
264
- this.takeCount = this.takeCount ? this.takeCount : gridOptions.api.paginationGetPageSize() * 2;
265
- // this.takeCount = this.takeCount < 20 ? 20 : this.takeCount;
266
- gridOptions.api.gridOptionsWrapper.setProperty('cacheBlockSize', this.takeCount);
267
- this.gridApi = gridOptions.api;
268
- this.mapColumns();
269
- this.calcHeight();
270
- if (!this.loadOnInit) {
271
- this.loadOnInit = true;
272
- return;
273
- }
274
- if (this.remoteOperation) {
275
- this.gridApi.setServerSideDatasource(this.intenalGridDataSource);
276
- }
277
- if (!this.remoteOperation) {
278
- this.refresh();
279
- }
280
- };
281
- AXDataGridComponent.prototype.ngAfterContentInit = function () {
282
- var that = this;
283
- if (this.rowTemplate) {
284
- this.fullWidthCellRendererFramework = this.rowTemplate.renderer;
285
- this.fullWidthCellRendererParams = this.rowTemplate.params;
286
- }
287
- this.frameworkComponents.agDateInput = AXDatePickerFilterComponent;
288
- if (this.gridDetailTemplate) {
289
- this.masterDetail = true;
290
- this.detailCellRendererParams = this.gridDetailTemplate.params;
291
- this.detailCellRenderer = 'detailRendererFramework';
292
- this.frameworkComponents.detailRendererFramework = this.gridDetailTemplate.renderer;
293
- this.detailRowHeight = this.gridDetailTemplate.height;
294
- }
295
- this.isFullWidthCell = function () {
296
- return that.rowTemplate != null;
297
- };
298
- //this.cdr
299
- };
300
- AXDataGridComponent.prototype.ngOnInit = function () {
301
- if (this.takeCount && this.takeCount > 0) {
302
- this.paginationPageSize = this.takeCount;
303
- this.paginationAutoPageSize = false;
304
- this.cacheBlockSize = this.takeCount;
305
- }
306
- if (this.selectionMode === 'single') {
307
- this.groupSelectsChildren = false;
308
- }
309
- if (this.keyField !== 'null' && this.hasChildField !== 'null') {
310
- this.rowGroupPanelShow = 'never';
311
- this.treeData = true;
312
- }
313
- if (this.remoteOperation) {
314
- this.rowModelType = 'serverSide';
315
- }
316
- //
317
- if (this.rtl == null) {
318
- this.rtl = window.getComputedStyle(this.ref.nativeElement, null).getPropertyValue('direction') === 'rtl';
319
- }
320
- //
321
- };
322
- AXDataGridComponent.prototype.gridSelectRow = function () {
323
- var _this = this;
324
- if (this.gridApi) {
325
- if (this.selectRow && this.selectRow.length > 0 && this.gridApi !== undefined && typeof this.selectRow[0] != 'object') {
326
- this.gridApi.forEachNode(function (node) {
327
- if (node.data !== undefined) {
328
- var select_1 = false;
329
- _this.selectRow.forEach(function (id) {
330
- if (node.data[_this.keyField] === id) {
331
- select_1 = true;
332
- node.setSelected(select_1);
333
- }
334
- });
335
- }
336
- });
337
- }
338
- else {
339
- this.gridApi.forEachNode(function (node) {
340
- if (node.data !== undefined) {
341
- var select_2 = false;
342
- _this.selectRow.forEach(function (item) {
343
- if (item.rowIndex != undefined && item.rowLevel != undefined) {
344
- if (node.data[_this.keyField] === item.data[_this.keyField]) {
345
- select_2 = true;
346
- }
347
- }
348
- else {
349
- if (node.data[_this.keyField] === item[_this.keyField]) {
350
- select_2 = true;
351
- }
352
- }
353
- });
354
- node.setSelected(select_2);
355
- }
356
- });
357
- }
358
- }
359
- };
360
- // ngAfterViewChecked(): void {
361
- // //Called after every check of the component's view. Applies to components only.
362
- // //Add 'implements AfterViewChecked' to the class.
363
- // // this.selectByValues();
364
- // this.enabelSelect = false;
365
- // }
366
- AXDataGridComponent.prototype.rebuildGrid = function () {
367
- var _this = this;
368
- this.mapColumns();
369
- setTimeout(function () {
370
- if (_this.sizeColumnsToFit) {
371
- _this.gridApi.sizeColumnsToFit();
372
- }
373
- }, 10);
374
- };
375
- AXDataGridComponent.prototype.ngAfterViewInit = function () {
376
- var _this = this;
377
- if (this.treeData === true) {
378
- this.columnDefs = this.columns.map(function (c) { return c.render(); });
379
- var groupColumn = this.columnDefs.find(function (c) { return c.rowGroupIndex == '0' && c.field !== ''; });
380
- this.autoGroupColumnDef = {
381
- headerName: groupColumn.headerName,
382
- width: groupColumn.width,
383
- cellRendererParams: { checkbox: this.showCheckBox },
384
- field: groupColumn.field
385
- };
386
- this.columnDefs.forEach(function (elm) {
387
- if (elm.rowGroupIndex > -1) {
388
- elm.hide = true;
389
- }
390
- });
391
- }
392
- //setTimeout(() => {
393
- this.gridView = true;
394
- //});
395
- this.enabelSelect = true;
396
- this.dataSource.onDataReceived.subscribe(function (_data) {
397
- var result = _data.data.result;
398
- _this.hideLoading();
399
- var items;
400
- var totalCount;
401
- if (Array.isArray(result)) {
402
- items = result;
403
- totalCount = result.length;
404
- }
405
- else {
406
- items = result.items;
407
- totalCount = result.totalCount;
408
- }
409
- if (_this.dataSourceSuccessCallback) {
410
- if (!_this.loadOnInit) {
411
- _this.dataSourceSuccessCallback([], 0);
412
- }
413
- else {
414
- _this.dataSourceSuccessCallback(items, totalCount);
415
- }
416
- }
417
- else {
418
- if (!_this.loadOnInit && _this.gridApi !== undefined) {
419
- _this.gridApi.setRowData([]);
420
- }
421
- else if (_this.gridApi !== undefined) {
422
- _this.gridApi.setRowData(items);
423
- }
424
- }
425
- _this.gridSelectRow();
426
- });
427
- this.dataSource.onFetchStart.subscribe(function () {
428
- _this.showLoading();
429
- });
430
- if (this.searchInput) {
431
- this.searchInput.onValueChanged.subscribe(function (c) {
432
- _this.searchText = c.value;
433
- });
434
- }
435
- //
436
- this.cdr.detectChanges();
437
- };
438
- AXDataGridComponent.prototype.mapColumns = function () {
439
- this.columnDefs = this.columns.map(function (c) { return c.render(); });
440
- // if (this.showRowNumber) {
441
- // this.columnDefs.push({
442
- // headerName: AXConfig.get('layout.rtl') ? 'ردیف' : 'Row',
443
- // valueGetter: 'node.rowIndex + 1',
444
- // pinned: AXConfig.get('layout.rtl') ? 'right' : 'left'
445
- // });
446
- // }
447
- if (this.gridDetailTemplate) {
448
- if (this.columnDefs[0].checkboxSelection === true && this.columnDefs[0].field === '') {
449
- this.columnDefs[1].cellRenderer = 'agGroupCellRenderer';
450
- }
451
- else {
452
- this.columnDefs[0].cellRenderer = 'agGroupCellRenderer';
453
- }
454
- }
455
- if (this.hasChildField === 'null') {
456
- var groupColumn = this.columnDefs.find(function (c) { return c.rowGroupIndex === undefined && c.field !== ''; });
457
- if (groupColumn && this.groupHideOpenParents == false) {
458
- this.autoGroupColumnDef = {
459
- headerName: groupColumn.headerName,
460
- width: groupColumn.width,
461
- cellRendererParams: { checkbox: this.showCheckBox },
462
- field: groupColumn.field
463
- };
464
- // groupColumn.hide = true;
465
- }
466
- }
467
- this.columnDefs.forEach(function (elm) {
468
- if (elm.rowGroupIndex > -1) {
469
- elm.hide = true;
470
- }
471
- });
472
- };
473
- AXDataGridComponent.prototype.displayedColumnsChanged = function (e) {
474
- if (this.hasChildField === 'null') {
475
- var ee = e.columnApi.getAllDisplayedColumnGroups();
476
- var eee = ee.find(function (c) { return c.colId !== 'ag-Grid-AutoColumn' && c.colId !== '0'; });
477
- if (eee && eee.colId) {
478
- this.autoGroupColumnDef = {
479
- headerName: eee.colDef.headerName,
480
- width: eee.colDef.width,
481
- cellRendererParams: { checkbox: this.showCheckBox },
482
- field: eee.colDef.field
483
- };
484
- }
485
- // eee.hide = true;
486
- }
487
- };
488
- AXDataGridComponent.prototype.refresh = function (route) {
489
- if (route === void 0) { route = []; }
490
- if (this.remoteOperation && this.gridApi !== undefined) {
491
- // this.gridApi.purgeServerSideCache(route);
492
- this.gridApi.setServerSideDatasource(this.intenalGridDataSource);
493
- }
494
- else {
495
- // TODO : check fetch param
496
- this.dataSource.fetch(null);
497
- }
498
- };
499
- AXDataGridComponent.prototype.internalGridCellClicked = function (e) {
500
- this.cellClick.emit({ data: this.mapCellEvent(e), component: this, htmlElement: this.ref.nativeElement });
501
- };
502
- AXDataGridComponent.prototype.internalGridCellDoubleClicked = function (e) {
503
- this.cellDbClick.emit({ data: this.mapCellEvent(e), component: this, htmlElement: this.ref.nativeElement });
504
- };
505
- AXDataGridComponent.prototype.internalGridCellFocused = function (e) {
506
- this.cellFocuse.emit({ data: this.mapCellEvent(e), htmlElement: this.ref.nativeElement, component: this });
507
- };
508
- AXDataGridComponent.prototype.internalGridRowClicked = function (e) {
509
- if (!e.node.group) {
510
- this.rowClick.emit({ data: this.mapRowEvent(e), component: this, htmlElement: this.ref.nativeElement });
511
- }
512
- };
513
- AXDataGridComponent.prototype.internalGridRowDoubleClicked = function (e) {
514
- if (!e.node.group) {
515
- this.rowDbClick.emit({ data: this.mapRowEvent(e), htmlElement: this.ref.nativeElement, component: this });
516
- }
517
- };
518
- AXDataGridComponent.prototype.differenceOf2Arrays = function (array1, array2) {
519
- var temp = [];
520
- for (var i in array1) {
521
- if (array2.indexOf(array1[i]) === -1) {
522
- temp.push(array1[i]);
523
- }
524
- }
525
- for (var i in array2) {
526
- if (array1.indexOf(array2[i]) === -1) {
527
- temp.push(array2[i]);
528
- }
529
- }
530
- return temp.sort(function (a, b) { return a - b; });
531
- };
532
- AXDataGridComponent.prototype.rowSelectionChanged = function (e) {
533
- var _this = this;
534
- // this.gridApi.forEachNode((node) => {
535
- // if (node.data[this.keyField] == e.node.data[this.keyField]) {
536
- // node.setSelected(e.node.selected);
537
- // }
538
- // });
539
- if (e.node.selected == true) {
540
- this.selectRow = this.selectRow.filter(function (c) { return c[_this.keyField] != e.data[_this.keyField]; });
541
- this.selectRow.push(e.data);
542
- }
543
- else {
544
- this.selectRow = this.selectRow.filter(function (c) { return c[_this.keyField] != e.data[_this.keyField]; });
545
- }
546
- this.rowSelectionChange.emit({ component: this, data: e, htmlElement: this.ref.nativeElement });
547
- // console.log('e', e);
548
- // console.log('select', e.node.selected);
549
- // console.log('index', e.rowIndex);
550
- };
551
- AXDataGridComponent.prototype.internalGridSelectionChanged = function (e) {
552
- var args = { items: [] };
553
- var oldNodes = this.oldSelectionNodes;
554
- var nodes = this.gridApi.getSelectedNodes();
555
- nodes.forEach(function (i) {
556
- args.items.push({
557
- rowLevel: i.level,
558
- rowIndex: i.rowIndex,
559
- data: i.data
560
- });
561
- });
562
- this.selectionChanged.emit({ data: args, component: this, htmlElement: this.ref.nativeElement });
563
- var action = nodes.length > oldNodes.length ? true : false;
564
- var node = this.differenceOf2Arrays(nodes, oldNodes);
565
- this.onRowSelectionChanged.emit({ component: this, selected: action, data: node, htmlElement: this.ref.nativeElement });
566
- this.oldSelectionNodes = nodes;
567
- };
568
- AXDataGridComponent.prototype.mapCellEvent = function (e) {
569
- return {
570
- rowLevel: 0,
571
- column: e.column,
572
- data: e.data,
573
- rowIndex: e.rowIndex,
574
- value: e.value
575
- };
576
- };
577
- AXDataGridComponent.prototype.mapRowEvent = function (e) {
578
- return {
579
- rowLevel: 0,
580
- data: e.data,
581
- rowIndex: e.rowIndex
582
- };
583
- };
584
- AXDataGridComponent.prototype.deselectAll = function () {
585
- this.gridApi.deselectAll();
586
- };
587
- AXDataGridComponent.prototype.showLoading = function () {
588
- if (this.gridApi) {
589
- this.gridApi.showLoadingOverlay();
590
- }
591
- };
592
- AXDataGridComponent.prototype.hideLoading = function () {
593
- if (this.gridApi) {
594
- this.gridApi.hideOverlay();
595
- }
596
- };
597
- AXDataGridComponent.prototype.internalGridSizeChanged = function (e) {
598
- if (e.clientWidth > 0 && e.clientHeight > 0) {
599
- this.performSizeColumnsToFit(e.api);
600
- }
601
- // this.refresh();
602
- // this.gridApi.paginationGoToFirstPage();
603
- };
604
- AXDataGridComponent.prototype.internalGridFirstDataRendered = function (e) {
605
- this.performSizeColumnsToFit(e.api);
606
- };
607
- AXDataGridComponent.prototype.performSizeColumnsToFit = function (api) {
608
- if (this.sizeColumnsToFit) {
609
- api.sizeColumnsToFit();
610
- }
611
- };
612
- AXDataGridComponent.ctorParameters = function () { return [
613
- { type: ElementRef },
614
- { type: ChangeDetectorRef }
615
- ]; };
616
- __decorate([
617
- Input(),
618
- __metadata("design:type", Boolean)
619
- ], AXDataGridComponent.prototype, "remoteOperation", void 0);
620
- __decorate([
621
- Input(),
622
- __metadata("design:type", Boolean)
623
- ], AXDataGridComponent.prototype, "rowMultiSelectWithClick", void 0);
624
- __decorate([
625
- Input(),
626
- __metadata("design:type", Boolean)
627
- ], AXDataGridComponent.prototype, "suppressRowClickSelection", void 0);
628
- __decorate([
629
- Input(),
630
- __metadata("design:type", Boolean)
631
- ], AXDataGridComponent.prototype, "suppressCellSelection", void 0);
632
- __decorate([
633
- Input(),
634
- __metadata("design:type", Boolean)
635
- ], AXDataGridComponent.prototype, "sizeColumnsToFit", void 0);
636
- __decorate([
637
- Input(),
638
- __metadata("design:type", Boolean)
639
- ], AXDataGridComponent.prototype, "showCheckBox", void 0);
640
- __decorate([
641
- Input(),
642
- __metadata("design:type", Boolean)
643
- ], AXDataGridComponent.prototype, "floatingFilter", void 0);
644
- __decorate([
645
- Input(),
646
- __metadata("design:type", Number)
647
- ], AXDataGridComponent.prototype, "takeCount", void 0);
648
- __decorate([
649
- Input(),
650
- __metadata("design:type", String)
651
- ], AXDataGridComponent.prototype, "selectionMode", void 0);
652
- __decorate([
653
- Input(),
654
- __metadata("design:type", Array)
655
- ], AXDataGridComponent.prototype, "selectRow", void 0);
656
- __decorate([
657
- Input(),
658
- __metadata("design:type", String)
659
- ], AXDataGridComponent.prototype, "rowGroupPanelShow", void 0);
660
- __decorate([
661
- Input(),
662
- __metadata("design:type", Boolean)
663
- ], AXDataGridComponent.prototype, "loadOnInit", void 0);
664
- __decorate([
665
- Input(),
666
- __metadata("design:type", String)
667
- ], AXDataGridComponent.prototype, "keyField", void 0);
668
- __decorate([
669
- Input(),
670
- __metadata("design:type", String)
671
- ], AXDataGridComponent.prototype, "hasChildField", void 0);
672
- __decorate([
673
- Input(),
674
- __metadata("design:type", String),
675
- __metadata("design:paramtypes", [String])
676
- ], AXDataGridComponent.prototype, "searchText", null);
677
- __decorate([
678
- Input(),
679
- __metadata("design:type", Array),
680
- __metadata("design:paramtypes", [Array])
681
- ], AXDataGridComponent.prototype, "filter", null);
682
- __decorate([
683
- ContentChildren(AXGridDataColumn),
684
- __metadata("design:type", QueryList)
685
- ], AXDataGridComponent.prototype, "_inlineColumns", void 0);
686
- __decorate([
687
- Output(),
688
- __metadata("design:type", EventEmitter)
689
- ], AXDataGridComponent.prototype, "columnsChange", void 0);
690
- __decorate([
691
- Input(),
692
- __metadata("design:type", Array),
693
- __metadata("design:paramtypes", [Array])
694
- ], AXDataGridComponent.prototype, "columns", null);
695
- __decorate([
696
- Input(),
697
- __metadata("design:type", Object)
698
- ], AXDataGridComponent.prototype, "rowHeight", void 0);
699
- __decorate([
700
- ContentChild(AXToolbarSearchComponent, { static: true }),
701
- __metadata("design:type", AXToolbarSearchComponent)
702
- ], AXDataGridComponent.prototype, "searchInput", void 0);
703
- __decorate([
704
- ContentChild(AXToolbarComponent, { static: true }),
705
- __metadata("design:type", AXToolbarComponent)
706
- ], AXDataGridComponent.prototype, "toolbar", void 0);
707
- __decorate([
708
- ContentChild(AXDataGridRowTemplateComponent, { static: true }),
709
- __metadata("design:type", AXDataGridRowTemplateComponent)
710
- ], AXDataGridComponent.prototype, "rowTemplate", void 0);
711
- __decorate([
712
- ContentChild(AXDataGridDetailTemplateComponent, { static: true }),
713
- __metadata("design:type", AXDataGridDetailTemplateComponent)
714
- ], AXDataGridComponent.prototype, "gridDetailTemplate", void 0);
715
- __decorate([
716
- ContentChild(AXDataSourceComponent, { static: true }),
717
- __metadata("design:type", AXDataSourceComponent)
718
- ], AXDataGridComponent.prototype, "_contentDataSource", void 0);
719
- __decorate([
720
- Input(),
721
- __metadata("design:type", AXDataSourceComponent),
722
- __metadata("design:paramtypes", [AXDataSourceComponent])
723
- ], AXDataGridComponent.prototype, "dataSource", null);
724
- __decorate([
725
- Input(),
726
- __metadata("design:type", Boolean)
727
- ], AXDataGridComponent.prototype, "groupHideOpenParents", void 0);
728
- __decorate([
729
- Output(),
730
- __metadata("design:type", EventEmitter)
731
- ], AXDataGridComponent.prototype, "cellClick", void 0);
732
- __decorate([
733
- Output(),
734
- __metadata("design:type", EventEmitter)
735
- ], AXDataGridComponent.prototype, "cellDbClick", void 0);
736
- __decorate([
737
- Output(),
738
- __metadata("design:type", EventEmitter)
739
- ], AXDataGridComponent.prototype, "cellFocuse", void 0);
740
- __decorate([
741
- Output(),
742
- __metadata("design:type", EventEmitter)
743
- ], AXDataGridComponent.prototype, "rowClick", void 0);
744
- __decorate([
745
- Output(),
746
- __metadata("design:type", EventEmitter)
747
- ], AXDataGridComponent.prototype, "rowDbClick", void 0);
748
- __decorate([
749
- Output(),
750
- __metadata("design:type", EventEmitter)
751
- ], AXDataGridComponent.prototype, "selectionChanged", void 0);
752
- __decorate([
753
- Output(),
754
- __metadata("design:type", EventEmitter)
755
- ], AXDataGridComponent.prototype, "rowSelectionChange", void 0);
756
- __decorate([
757
- Output(),
758
- __metadata("design:type", EventEmitter)
759
- ], AXDataGridComponent.prototype, "onRowSelectionChanged", void 0);
760
- __decorate([
761
- Input(),
762
- __metadata("design:type", Function)
763
- ], AXDataGridComponent.prototype, "rowClass", void 0);
764
- __decorate([
765
- Input(),
766
- __metadata("design:type", Boolean)
767
- ], AXDataGridComponent.prototype, "rtl", void 0);
768
- AXDataGridComponent = __decorate([
769
- Component({
770
- selector: 'ax-data-grid',
771
- template: "<div class=\"ax-grid-toolbar\" *ngIf=\"toolbar\">\r\n <ng-content select=\"ax-toolbar\"></ng-content>\r\n</div>\r\n<!-- [enableSorting]=\"true\" [enableColResize]=\"true\" [enableFilter]=\"allowFiltering\" -->\r\n<ag-grid-angular *ngIf=\"gridView\" class=\"ag-theme-balham\" [getRowClass]=\"internalGetRowClass\"\r\n [style.height]=\"internalHeight\" [columnDefs]=\"columnDefs\" [enableRtl]=\"rtl\" [pagination]=\"true\"\r\n [rowGroupPanelShow]=\"rowGroupPanelShow\" [rowModelType]=\"rowModelType\" [detailRowHeight]=\"detailRowHeight\"\r\n [getRowHeight]=\"getRowHeight\" [paginationAutoPageSize]=\"paginationAutoPageSize\"\r\n [paginationPageSize]=\"paginationPageSize\" [suppressMenuHide]=\"true\" [frameworkComponents]=\"frameworkComponents\"\r\n [isFullWidthCell]=\"isFullWidthCell\" [rowSelection]=\"selectionMode\" [rowMultiSelectWithClick]=\"rowMultiSelectWithClick\"\r\n [fullWidthCellRendererFramework]=\"fullWidthCellRendererFramework\"\r\n [fullWidthCellRendererParams]=\"fullWidthCellRendererParams\" (cellClicked)=\"internalGridCellClicked($event)\"\r\n (cellDoubleClicked)=\"internalGridCellDoubleClicked($event)\" (cellFocused)=\"internalGridCellFocused($event)\"\r\n (rowClicked)=\"internalGridRowClicked($event)\" (selectionChanged)=\"internalGridSelectionChanged($event)\"\r\n (rowSelected)=\"rowSelectionChanged($event)\" (rowDoubleClicked)=\"internalGridRowDoubleClicked($event)\"\r\n (gridReady)=\"internalGridReady($event)\" [groupSelectsChildren]=\"groupSelectsChildren\"\r\n [suppressRowClickSelection]=\"suppressRowClickSelection\" [groupSelectsFiltered]=\"true\"\r\n [suppressCellSelection]=\"suppressCellSelection\" [autoGroupColumnDef]=\"autoGroupColumnDef\"\r\n [suppressAggFuncInHeader]=\"true\" [treeData]=\"treeData\" [animateRows]=\"true\" [isServerSideGroup]=\"isServerSideGroup\"\r\n [getServerSideGroupKey]=\"getServerSideGroupKey\" [masterDetail]=\"masterDetail\"\r\n [detailCellRendererParams]=\"detailCellRendererParams\" [detailCellRenderer]=\"detailCellRenderer\"\r\n (gridSizeChanged)=\"internalGridSizeChanged($event)\" (firstDataRendered)=\"internalGridFirstDataRendered($event)\"\r\n [localeText]=\"localeText\" [groupHideOpenParents]=\"groupHideOpenParents\" [enableRangeSelection]=\"true\"\r\n [enableRangeSelection]=\"false\" [allowContextMenuWithControlKey]=\"false\" [getMainMenuItems]=\"getMainMenuItems\">\r\n</ag-grid-angular>\r\n\r\n<!-- (displayedColumnsChanged)=\"displayedColumnsChanged($event)\" -->",
772
- encapsulation: ViewEncapsulation.None
773
- // changeDetection: ChangeDetectionStrategy.OnPush
774
- }),
775
- __metadata("design:paramtypes", [ElementRef, ChangeDetectorRef])
776
- ], AXDataGridComponent);
777
- return AXDataGridComponent;
778
- }());
779
- export { AXDataGridComponent };
780
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGFjb3JleC9kYXRhLWdyaWQvIiwic291cmNlcyI6WyJsaWIvZGF0YS1ncmlkL2RhdGFncmlkLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLGVBQWUsRUFDZixTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixVQUFVLEVBQ1YsaUJBQWlCLEVBQ2pCLHVCQUF1QixFQUN4QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQWE5RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR2xELE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDN0csT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDMUYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM1QyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRXhDLGNBQWMsQ0FBQyxTQUFTLENBQUMsZUFBZSxHQUFHO0lBQ3pDLDZDQUE2QztBQUMvQyxDQUFDLENBQUM7QUFFRixpRUFBaUU7QUFDakUsa0JBQWtCO0FBQ2xCLElBQUk7QUFFSjtJQUFrRCxnREFBZ0M7SUFBbEY7O0lBRUEsQ0FBQztJ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Q1csWUFBWTttRUFBc0Y7SUFHdEg7UUFEQyxNQUFNLEVBQUU7a0NBQ2MsWUFBWTtzRUFBNEY7SUFlL0g7UUFEQyxLQUFLLEVBQUU7O3lEQUMwRTtJQUdsRjtRQURDLEtBQUssRUFBRTs7b0RBQ2tDO0lBaE4vQixtQkFBbUI7UUFOL0IsU0FBUyxDQUFDO1lBQ1QsUUFBUSxFQUFFLGNBQWM7WUFDeEIsNjdFQUF3QztZQUN4QyxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTtZQUNyQyxrREFBa0Q7U0FDbkQsQ0FBQzt5Q0FtTnlCLFVBQVUsRUFBZSxpQkFBaUI7T0FsTnhELG1CQUFtQixDQTBwQi9CO0lBQUQsMEJBQUM7Q0FBQSxBQTFwQkQsSUEwcEJDO1NBMXBCWSxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBDb250ZW50Q2hpbGQsXHJcbiAgSW5wdXQsXHJcbiAgQ29udGVudENoaWxkcmVuLFxyXG4gIFF1ZXJ5TGlzdCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgT3V0cHV0LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3lcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQVhEYXRhU291cmNlQ29tcG9uZW50IH0gZnJvbSAnQGFjb3JleC9jb21wb25lbnRzJztcclxuaW1wb3J0IHsgQVhHcmlkRGF0YUNvbHVtbiB9IGZyb20gJy4vY29sdW1ucy9jb2x1bW4uY29tcG9uZW50JztcclxuaW1wb3J0IHsgQVhEYXRhU291cmNlUmVhZFBhcmFtcyB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cyc7XHJcbmltcG9ydCB7XHJcbiAgR3JpZE9wdGlvbnMsXHJcbiAgQ2VsbENsaWNrZWRFdmVudCxcclxuICBSb3dDbGlja2VkRXZlbnQsXHJcbiAgQ2VsbEV2ZW50LFxyXG4gIFJvd0V2ZW50LFxyXG4gIEZpcnN0RGF0YVJlbmRlcmVkRXZlbnQsXHJcbiAgR3JpZFNpemVDaGFuZ2VkRXZlbnQsXHJcbiAgR3JpZEFwaVxyXG59IGZyb20gJ2FnLWdyaWQtY29tbXVuaXR5JztcclxuXHJcbmltcG9ydCB7IExpY2Vuc2VNYW5hZ2VyIH0gZnJvbSAnYWctZ3JpZC1lbnRlcnByaXNlJztcclxuaW1wb3J0IHsgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQVhHcmlkQ2VsbEV2ZW50LCBBWEdyaWRSb3dFdmVudCwgQVhHcmlkUm93U2VsZWN0aW9uRXZlbnQsIEFYR3JpZFJvd1BhcmFtcyB9IGZyb20gJy4vZGF0YWdyaWQuZXZlbnRzJztcclxuXHJcbmltcG9ydCB7IEFYRGF0YUdyaWRSb3dUZW1wbGF0ZUNvbXBvbmVudCB9IGZyb20gJy4vdGVtcGxhdGVzL3Jvdy10ZW1wbGF0ZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBBWFRvb2xiYXJTZWFyY2hDb21wb25lbnQsIEFYVG9vbGJhckNvbXBvbmVudCwgQVhEYXRhRXZlbnQsIEFYVmFsdWVFdmVudCB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cyc7XHJcbmltcG9ydCB7IEFYRGF0YUdyaWREZXRhaWxUZW1wbGF0ZUNvbXBvbmVudCB9IGZyb20gJy4vdGVtcGxhdGVzL2RldGFpbC10ZW1wbGF0ZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBBWFRyYW5zbGF0b3IgfSBmcm9tICdAYWNvcmV4L2NvcmUnO1xyXG5pbXBvcnQgeyBBWERhdGVQaWNrZXJGaWx0ZXJDb21wb25lbnQgfSBmcm9tICcuL2NvbHVtbnMvZGF0ZS1jb2x1bW4uY29tcG9uZW50JztcclxuaW1wb3J0IHsgQVhDb25maWcgfSBmcm9tICdAYWNvcmV4L2NvcmUnO1xyXG5cclxuTGljZW5zZU1hbmFnZXIucHJvdG90eXBlLnZhbGlkYXRlTGljZW5zZSA9IGZ1bmN0aW9uICgpIHtcclxuICAvL2NvbnNvbGUuaW5mbygnQ3JhY2tlZCBieSBBcmFzaCBPc2hub3VkaSEnKTtcclxufTtcclxuXHJcbi8vIFdhdGVybWFya0NvbXAucHJvdG90eXBlLnNob3VsZERpc3BsYXlXYXRlcm1hcmsgPSBmdW5jdGlvbiAoKSB7XHJcbi8vICAgcmV0dXJuIGZhbHNlO1xyXG4vLyB9XHJcblxyXG5leHBvcnQgY2xhc3MgQVhEYXRhR3JpZENvbHVtbnNDaGFuZ2VFdmVudCBleHRlbmRzIEFYVmFsdWVFdmVudDxBWEdyaWREYXRhQ29sdW1uW10+IHtcclxuICBjb21wb25lbnQ6IEFYRGF0YUdyaWRDb21wb25lbnQ7XHJcbn1cclxuZXhwb3J0IGNsYXNzIEFYRGF0YUdyaWRDZWxsRXZlbnQgZXh0ZW5kcyBBWERhdGFFdmVudDxBWEdyaWRDZWxsRXZlbnQ+IHtcclxuICBjb21wb25lbnQ6IEFYRGF0YUdyaWRDb21wb25lbnQ7XHJcbn1cclxuZXhwb3J0IGNsYXNzIEFYRGFhZ3JpZFJvd0NsaWNrRXZlbnQgZXh0ZW5kcyBBWERhdGFFdmVudDxBWEdyaWRSb3dFdmVudD4ge1xyXG4gIGNvbXBvbmVudDogQVhEYXRhR3JpZENvbXBvbmVudDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEFYRGF0YUdyaWRTZWxlY3Rpb25DaGFuZ2VFdmVudCBleHRlbmRzIEFYRGF0YUV2ZW50PEFYR3JpZFJvd1NlbGVjdGlvbkV2ZW50PiB7XHJcbiAgY29tcG9uZW50OiBBWERhdGFHcmlkQ29tcG9uZW50O1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQVhEYXRhR3JpZFJvd1NlbGVjdGlvbkNoYW5nZUV2ZW50IGV4dGVuZHMgQVhEYXRhRXZlbnQ8YW55PiB7XHJcbiAgY29tcG9uZW50OiBBWERhdGFHcmlkQ29tcG9uZW50O1xyXG4gIHNlbGVjdGVkOiBib29sZWFuO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2F4LWRhdGEtZ3JpZCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGFncmlkLmNvbXBvbmVudC5odG1sJyxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXHJcbiAgLy8gY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcclxufSlcclxuZXhwb3J0IGNsYXNzIEFYRGF0YUdyaWRDb21wb25lbnQge1xyXG4gIHByaXZhdGUgZ3JpZEFwaTtcclxuICBwcml2YXRlIGRhdGFTb3VyY2VTdWNjZXNzQ2FsbGJhY2s7XHJcbiAgbG9jYWxlVGV4dDogYW55O1xyXG5cclxuICBncmlkT3B0aW9uczogR3JpZE9wdGlvbnM7XHJcbiAgY29sdW1uRGVmczogYW55W10gPSBbXTtcclxuICByb3dNb2RlbFR5cGUgPSAnY2xpZW50U2lkZSc7XHJcbiAgZnVsbFdpZHRoQ2VsbFJlbmRlcmVyRnJhbWV3b3JrOiBhbnk7XHJcbiAgZnVsbFdpZHRoQ2VsbFJlbmRlcmVyUGFyYW1zOiBhbnk7XHJcbiAgZnJhbWV3b3JrQ29tcG9uZW50czogYW55ID0ge307XHJcbiAgaXNGdWxsV2lkdGhDZWxsOiBGdW5jdGlvbjtcclxuICBpbnRlcm5hbEhlaWdodDogc3RyaW5nID0gJzEwMCUnO1xyXG4gIGRldGFpbENlbGxSZW5kZXJlcjogYW55O1xyXG4gIGRldGFpbENlbGxSZW5kZXJlclBhcmFtczogYW55O1xyXG4gIGRldGFpbFJvd0hlaWdodDogbnVtYmVyO1xyXG4gIG1hc3RlckRldGFpbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHRyZWVEYXRhOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZW5hYmVsU2VsZWN0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgZ3JpZFZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBncm91cFNlbGVjdHNDaGlsZHJlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG9sZFNlbGVjdGlvbk5vZGVzOiBhbnlbXSA9IFtdO1xyXG4gIHBhZ2luYXRpb25BdXRvUGFnZVNpemU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHBhZ2luYXRpb25QYWdlU2l6ZTogbnVtYmVyID0gMTA7XHJcbiAgY2FjaGVCbG9ja1NpemU6IG51bWJlciA9IDEwO1xyXG4gIC8vIEBJbnB1dCgpXHJcbiAgLy8gc2hvd1Jvd051bWJlcjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHJlbW90ZU9wZXJhdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyByb3dNdWx0aVNlbGVjdFdpdGhDbGljazogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIHN1cHByZXNzUm93Q2xpY2tTZWxlY3Rpb246IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzdXBwcmVzc0NlbGxTZWxlY3Rpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2l6ZUNvbHVtbnNUb0ZpdDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2hvd0NoZWNrQm94OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KClcclxuICBmbG9hdGluZ0ZpbHRlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHRha2VDb3VudDogbnVtYmVyO1xyXG5cclxuICBhdXRvR3JvdXBDb2x1bW5EZWY6IGFueSA9IHt9O1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNlbGVjdGlvbk1vZGU6ICdzaW5nbGUnIHwgJ211bHRpcGxlJyA9ICdzaW5nbGUnO1xyXG5cclxuICAvLyBASW5wdXQoKVxyXG4gIC8vIGFsbG93RmlsdGVyaW5nOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2VsZWN0Um93OiBhbnlbXSA9IFtdO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHJvd0dyb3VwUGFuZWxTaG93OiAnYWx3YXlzJyB8ICduZXZlcicgPSAnbmV2ZXInO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGxvYWRPbkluaXQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvLyBASW5wdXQoKVxyXG4gIC8vIGdyb3VwRGVmYXVsdEV4cGFuZGVkOiBudW1iZXIgPSAwO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGtleUZpZWxkOiBzdHJpbmcgPSAnbnVsbCc7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgaGFzQ2hpbGRGaWVsZDogc3RyaW5nID0gJ251bGwnO1xyXG5cclxuICBwcml2YXRlIF9zZWFyY2hUZXh0OiBzdHJpbmc7XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZ2V0IHNlYXJjaFRleHQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9zZWFyY2hUZXh0O1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IHNlYXJjaFRleHQodjogc3RyaW5nKSB7XHJcbiAgICBpZiAodiAhPT0gdGhpcy5fc2VhcmNoVGV4dCkge1xyXG4gICAgICB0aGlzLl9zZWFyY2hUZXh0ID0gdjtcclxuICAgICAgaWYgKHRoaXMuZ3JpZEFwaSkge1xyXG4gICAgICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gICAgICAgIHRoaXMuZ3JpZEFwaS5zZXRRdWlja0ZpbHRlcih0aGlzLnNlYXJjaFRleHQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9maWx0ZXI6IGFueVtdO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGdldCBmaWx0ZXIoKTogYW55W10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlcjtcclxuICB9XHJcbiAgcHVibGljIHNldCBmaWx0ZXIodjogYW55W10pIHtcclxuICAgIGlmICh2ICE9PSB0aGlzLl9maWx0ZXIpIHtcclxuICAgICAgdGhpcy5fZmlsdGVyID0gdjtcclxuICAgICAgdGhpcy5fZmlsdGVyLmZvckVhY2goKGYpID0+IHtcclxuICAgICAgICBjb25zdCBmYyA9IHRoaXMuZ3JpZEFwaS5nZXRGaWx0ZXJJbnN0YW5jZShmLmZpZWxkKTtcclxuICAgICAgICBpZiAoZmMpIHtcclxuICAgICAgICAgIGNvbnN0IGZmID0gZmMuZ2V0RnJhbWV3b3JrQ29tcG9uZW50SW5zdGFuY2UoKTtcclxuICAgICAgICAgIGZmLnNldE1vZGVsKGYpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBAQ29udGVudENoaWxkcmVuKEFYR3JpZERhdGFDb2x1bW4pXHJcbiAgcHJpdmF0ZSBfaW5saW5lQ29sdW1uczogUXVlcnlMaXN0PEFYR3JpZERhdGFDb2x1bW4+O1xyXG5cclxuICBAT3V0cHV0KClcclxuICBjb2x1bW5zQ2hhbmdlOiBFdmVudEVtaXR0ZXI8QVhEYXRhR3JpZENvbHVtbnNDaGFuZ2VFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPEFYRGF0YUdyaWRDb2x1bW5zQ2hhbmdlRXZlbnQ+KCk7XHJcblxyXG4gIHByaXZhdGUgX2NvbHVtbnM6IEFYR3JpZERhdGFDb2x1bW5bXSA9IFtdO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGdldCBjb2x1bW5zKCk6IEFYR3JpZERhdGFDb2x1bW5bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5faW5saW5lQ29sdW1ucyA/IFsuLi50aGlzLl9jb2x1bW5zLCAuLi50aGlzLl9pbmxpbmVDb2x1bW5zLnRvQXJyYXkoKV0gOiB0aGlzLl9jb2x1bW5zO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBjb2x1bW5zKHZhbDogQVhHcmlkRGF0YUNvbHVtbltdKSB7XHJcbiAgICBpZiAodmFsICYmIHZhbC5sZW5ndGgpIHtcclxuICAgICAgbGV0IG9sZCA9IHRoaXMuX2NvbHVtbnM7XHJcbiAgICAgIHRoaXMuX2NvbHVtbnMgPSB2YWw7XHJcbiAgICAgIHRoaXMuY29sdW1uc0NoYW5nZS5lbWl0KHsgY29tcG9uZW50OiB0aGlzLCB2YWx1ZTogdmFsLCBvbGRWYWx1ZTogb2xkLCBodG1sRWxlbWVudDogdGhpcy5yZWYubmF0aXZlRWxlbWVudCB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRlZmF1bHRDb2xEZWY6IGFueSA9IHtcclxuICAgIGZpbHRlcjogdHJ1ZSxcclxuICAgIGZsb2F0aW5nRmlsdGVyOiB0cnVlXHJcbiAgfTtcclxuXHJcbiAgQElucHV0KClcclxuICByb3dIZWlnaHQ6IGFueTtcclxuXHJcbiAgQENvbnRlbnRDaGlsZChBWFRvb2xiYXJTZWFyY2hDb21wb25lbnQsIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgc2VhcmNoSW5wdXQ6IEFYVG9vbGJhclNlYXJjaENvbXBvbmVudDtcclxuXHJcbiAgQENvbnRlbnRDaGlsZChBWFRvb2xiYXJDb21wb25lbnQsIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgdG9vbGJhcjogQVhUb29sYmFyQ29tcG9uZW50O1xyXG5cclxuICBAQ29udGVudENoaWxkKEFYRGF0YUdyaWRSb3dUZW1wbGF0ZUNvbXBvbmVudCwgeyBzdGF0aWM6IHRydWUgfSlcclxuICByb3dUZW1wbGF0ZTogQVhEYXRhR3JpZFJvd1RlbXBsYXRlQ29tcG9uZW50O1xyXG5cclxuICBAQ29udGVudENoaWxkKEFYRGF0YUdyaWREZXRhaWxUZW1wbGF0ZUNvbXBvbmVudCwgeyBzdGF0aWM6IHRydWUgfSlcclxuICBncmlkRGV0YWlsVGVtcGxhdGU6IEFYRGF0YUdyaWREZXRhaWxUZW1wbGF0ZUNvbXBvbmVudDtcclxuXHJcbiAgQENvbnRlbnRDaGlsZChBWERhdGFTb3VyY2VDb21wb25lbnQsIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgcHJpdmF0ZSBfY29udGVudERhdGFTb3VyY2U6IEFYRGF0YVNvdXJjZUNvbXBvbmVudDtcclxuXHJcbiAgcHJpdmF0ZSBfZGF0YVNvdXJjZTogQVhEYXRhU291cmNlQ29tcG9uZW50O1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBnZXQgZGF0YVNvdXJjZSgpOiBBWERhdGFTb3VyY2VDb21wb25lbnQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2UgPyB0aGlzLl9kYXRhU291cmNlIDogdGhpcy5fY29udGVudERhdGFTb3VyY2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGRhdGFTb3VyY2UodjogQVhEYXRhU291cmNlQ29tcG9uZW50KSB7XHJcbiAgICB0aGlzLl9kYXRhU291cmNlID0gdjtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZ3JvdXBIaWRlT3BlblBhcmVudHM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgY2VsbENsaWNrOiBFdmVudEVtaXR0ZXI8QVhEYXRhR3JpZENlbGxFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPEFYRGF0YUdyaWRDZWxsRXZlbnQ+KCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIGNlbGxEYkNsaWNrOiBFdmVudEVtaXR0ZXI8QVhEYXRhR3JpZENlbGxFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPEFYRGF0YUdyaWRDZWxsRXZlbnQ+KCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIGNlbGxGb2N1c2U6IEV2ZW50RW1pdHRlcjxBWERhdGFHcmlkQ2VsbEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8QVhEYXRhR3JpZENlbGxFdmVudD4oKTtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgcm93Q2xpY2s6IEV2ZW50RW1pdHRlcjxBWERhYWdyaWRSb3dDbGlja0V2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8QVhEYWFncmlkUm93Q2xpY2tFdmVudD4oKTtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgcm93RGJDbGljazogRXZlbnRFbWl0dGVyPEFYRGFhZ3JpZFJvd0NsaWNrRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxBWERhYWdyaWRSb3dDbGlja0V2ZW50PigpO1xyXG5cclxuICBAT3V0cHV0KClcclxuICBzZWxlY3Rpb25DaGFuZ2VkOiBFdmVudEVtaXR0ZXI8QVhEYXRhR3JpZFNlbGVjdGlvbkNoYW5nZUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8QVhEYXRhR3JpZFNlbGVjdGlvbkNoYW5nZUV2ZW50PigpO1xyXG5cclxuICBAT3V0cHV0KClcclxuICByb3dTZWxlY3Rpb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxBWERhdGFHcmlkU2VsZWN0aW9uQ2hhbmdlRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxBWERhdGFHcmlkU2VsZWN0aW9uQ2hhbmdlRXZlbnQ+KCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIG9uUm93U2VsZWN0aW9uQ2hhbmdlZDogRXZlbnRFbWl0dGVyPEFYRGF0YUdyaWRSb3dTZWxlY3Rpb25DaGFuZ2VFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPEFYRGF0YUdyaWRSb3dTZWxlY3Rpb25DaGFuZ2VFdmVudD4oKTtcclxuXHJcbiAgZ2V0Um93SGVpZ2h0KHBhcmFtKSB7XHJcbiAgICBpZiAocGFyYW0uZGF0YSAmJiBwYXJhbS5kYXRhLnJvd0hlaWdodCAmJiBwYXJhbS5ub2RlLmxldmVsID09IDApIHtcclxuICAgICAgcmV0dXJuIHBhcmFtLmRhdGEucm93SGVpZ2h0O1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLm1hc3RlckRldGFpbCA9PSB0cnVlICYmIHBhcmFtLm5vZGUubGV2ZWwgPT0gMSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5kZXRhaWxSb3dIZWlnaHQ7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMubWFzdGVyRGV0YWlsID09IGZhbHNlICYmIHBhcmFtLmRhdGEgJiYgcGFyYW0uZGF0YS5yb3dIZWlnaHQpIHtcclxuICAgICAgcmV0dXJuIHBhcmFtLmRhdGEucm93SGVpZ2h0O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHJvd0NsYXNzPzogKHBhcmFtczogQVhHcmlkUm93UGFyYW1zKSA9PiAoc3RyaW5nIHwgc3RyaW5nW10pIHwgKHN0cmluZyB8IHN0cmluZ1tdKTtcclxuXHJcbiAgQElucHV0KClcclxuICBydGw6IGJvb2xlYW4gPSBBWENvbmZpZy5nZXQoJ2xheW91dC5ydGwnKTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge1xyXG4gICAgdGhpcy5sb2NhbGVUZXh0ID0gQVhUcmFuc2xhdG9yLmdldCgnZGF0YUdyaWQnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2FsY0hlaWdodCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnRvb2xiYXIpIHtcclxuICAgICAgdGhpcy5pbnRlcm5hbEhlaWdodCA9IGBjYWxjKDEwMCUgLSAkezQwfXB4KWA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmludGVybmFsSGVpZ2h0ID0gJzEwMCUnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgaW50ZW5hbEdyaWREYXRhU291cmNlKCkge1xyXG4gICAgY29uc3QgdGhhdCA9IHRoaXM7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICByb3dDb3VudDogbnVsbCxcclxuICAgICAgZ2V0Um93czogKHBhcmFtcykgPT4ge1xyXG4gICAgICAgIC8vIHRoYXQuZ3JpZEFwaS5ncmlkT3B0aW9uc1dyYXBwZXIuc2V0UHJvcGVydHkoJ2NhY2hlQmxvY2tTaXplJywgdGhpcy50YWtlQ291bnQgPyB0aGlzLnRha2VDb3VudCA6IHBhcmFtcy5hcGkucGFnaW5hdGlvbkdldFBhZ2VTaXplKCkpO1xyXG4gICAgICAgIHRoYXQuZGF0YVNvdXJjZVN1Y2Nlc3NDYWxsYmFjayA9IHBhcmFtcy5zdWNjZXNzQ2FsbGJhY2s7XHJcbiAgICAgICAgY29uc3QgbG9hZFBhcmFtczogQVhEYXRhU291cmNlUmVhZFBhcmFtcyA9IHt9O1xyXG4gICAgICAgIGxvYWRQYXJhbXMuc2VhcmNoVGV4dCA9IHRoYXQuc2VhcmNoVGV4dDtcclxuICAgICAgICBsb2FkUGFyYW1zLnNraXAgPSBwYXJhbXMucmVxdWVzdC5zdGFydFJvdztcclxuICAgICAgICAvLyAgbG9hZFBhcmFtcy50YWtlID0gcGFyYW1zLnJlcXVlc3QuZW5kUm93IC0gcGFyYW1zLnJlcXVlc3Quc3RhcnRSb3c7XHJcbiAgICAgICAgbG9hZFBhcmFtcy50YWtlID0gdGhhdC50YWtlQ291bnQgPyB0aGF0LnRha2VDb3VudCA6IHBhcmFtcy5hcGkucGFnaW5hdGlvbkdldFBhZ2VTaXplKCkgKiAyO1xyXG4gICAgICAgIGxvYWRQYXJhbXMuc29ydCA9IHBhcmFtcy5yZXF1ZXN0LnNvcnRNb2RlbC5tYXAoKGMpID0+IHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGZpZWxkOiBjLmNvbElkLFxyXG4gICAgICAgICAgICBkaXI6IGMuc29ydFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBsb2FkUGFyYW1zLmdyb3VwcyA9IHBhcmFtcy5yZXF1ZXN0LnJvd0dyb3VwQ29scy5tYXAociA9PiByLmZpZWxkKTtcclxuICAgICAgICAvLyBsb2FkUGFyYW1zLmdyb3VwS2V5cyA9IHBhcmFtcy5yZXF1ZXN0Lmdyb3VwS2V5cztcclxuICAgICAgICAvLyBsb2FkUGFyYW1zLmRhdGEgPSBwYXJhbXMucGFyZW50Tm9kZS5kYXRhO1xyXG4gICAgICAgIGxvYWRQYXJhbXMuZ3JvdXAgPSB7XHJcbiAgICAgICAgICBmaWVsZHM6IHBhcmFtcy5yZXF1ZXN0LnJvd0dyb3VwQ29scy5tYXAoKHIpID0+IHIuZmllbGQpLFxyXG4gICAgICAgICAga2V5czogcGFyYW1zLnJlcXVlc3QuZ3JvdXBLZXlzLFxyXG4gICAgICAgICAgcGFyZW50RGF0YTogcGFyYW1zLnBhcmVudE5vZGUuZGF0YVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgbG9hZFBhcmFtcy5maWx0ZXIgPSBwYXJhbXMucmVxdWVzdC5maWx0ZXJNb2RlbDtcclxuICAgICAgICB0aGF0LmRhdGFTb3VyY2UuZmV0Y2gobG9hZFBhcmFtcyk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG4gIGdldE1haW5NZW51SXRlbXMoZSkge1xyXG4gICAgcmV0dXJuIFsncGluU3ViTWVudScsICdzZXBhcmF0b3InXTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5ncmlkQXBpLmRlc3Ryb3koKTtcclxuICB9XHJcblxyXG4gIGlzU2VydmVyU2lkZUdyb3VwID0gKGUpID0+IHtcclxuICAgIHJldHVybiBlW3RoaXMuaGFzQ2hpbGRGaWVsZF07XHJcbiAgfTtcclxuXHJcbiAgZ2V0Q29sdW1uRGVmcyA9ICgpID0+IHtcclxuICAgIHJldHVybiB0aGlzLmdyaWRBcGkuZ2V0Q29sdW1uRGVmcygpO1xyXG4gIH07XHJcblxyXG4gIGdldFNlcnZlclNpZGVHcm91cEtleSA9IChlKSA9PiB7XHJcbiAgICByZXR1cm4gZVt0aGlzLmtleUZpZWxkXTtcclxuICB9O1xyXG4gIC8vIHRvZG8gZ3JpZE9wdGlvbnM6IEdyaWRPcHRpb25zXHJcbiAgaW50ZXJuYWxHcmlkUmVhZHkoZ3JpZE9wdGlvbnMpIHtcclxuICAgIGdyaWRPcHRpb25zLmFwaS5jaGVja0dyaWRTaXplKCk7XHJcbiAgICB0aGlzLnRha2VDb3VudCA9IHRoaXMudGFrZUNvdW50ID8gdGhpcy50YWtlQ291bnQgOiBncmlkT3B0aW9ucy5hcGkucGFnaW5hdGlvbkdldFBhZ2VTaXplKCkgKiAyO1xyXG4gICAgLy8gIHRoaXMudGFrZUNvdW50ID0gdGhpcy50YWtlQ291bnQgPCAyMCA/IDIwIDogdGhpcy50YWtlQ291bnQ7XHJcbiAgICBncmlkT3B0aW9ucy5hcGkuZ3JpZE9wdGlvbnNXcmFwcGVyLnNldFByb3BlcnR5KCdjYWNoZUJsb2NrU2l6ZScsIHRoaXMudGFrZUNvdW50KTtcclxuICAgIHRoaXMuZ3JpZEFwaSA9IGdyaWRPcHRpb25zLmFwaTtcclxuXHJcbiAgICB0aGlzLm1hcENvbHVtbnMoKTtcclxuICAgIHRoaXMuY2FsY0hlaWdodCgpO1xyXG5cclxuICAgIGlmICghdGhpcy5sb2FkT25Jbml0KSB7XHJcbiAgICAgIHRoaXMubG9hZE9uSW5pdCA9IHRydWU7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5yZW1vdGVPcGVyYXRpb24pIHtcclxuICAgICAgdGhpcy5ncmlkQXBpLnNldFNlcnZlclNpZGVEYXRhc291cmNlKHRoaXMuaW50ZW5hbEdyaWREYXRhU291cmNlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMucmVtb3RlT3BlcmF0aW9uKSB7XHJcbiAgICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xyXG4gICAgY29uc3QgdGhhdCA9IHRoaXM7XHJcbiAgICBpZiAodGhpcy5yb3dUZW1wbGF0ZSkge1xyXG4gICAgICB0aGlzLmZ1bGxXaWR0aENlbGxSZW5kZXJlckZyYW1ld29yayA9IHRoaXMucm93VGVtcGxhdGUucmVuZGVyZXI7XHJcbiAgICAgIHRoaXMuZnVsbFdpZHRoQ2VsbFJlbmRlcmVyUGFyYW1zID0gdGhpcy5yb3dUZW1wbGF0ZS5wYXJhbXM7XHJcbiAgICB9XHJcbiAgICB0aGlzLmZyYW1ld29ya0NvbXBvbmVudHMuYWdEYXRlSW5wdXQgPSBBWERhdGVQaWNrZXJGaWx0ZXJDb21wb25lbnQ7XHJcblxyXG4gICAgaWYgKHRoaXMuZ3JpZERldGFpbFRlbXBsYXRlKSB7XHJcbiAgICAgIHRoaXMubWFzdGVyRGV0YWlsID0gdHJ1ZTtcclxuICAgICAgdGhpcy5kZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXMgPSB0aGlzLmdyaWREZXRhaWxUZW1wbGF0ZS5wYXJhbXM7XHJcbiAgICAgIHRoaXMuZGV0YWlsQ2VsbFJlbmRlcmVyID0gJ2RldGFpbFJlbmRlcmVyRnJhbWV3b3JrJztcclxuICAgICAgdGhpcy5mcmFtZXdvcmtDb21wb25lbnRzLmRldGFpbFJlbmRlcmVyRnJhbWV3b3JrID0gdGhpcy5ncmlkRGV0YWlsVGVtcGxhdGUucmVuZGVyZXI7XHJcblxyXG4gICAgICB0aGlzLmRldGFpbFJvd0hlaWdodCA9IHRoaXMuZ3JpZERldGFpbFRlbXBsYXRlLmhlaWdodDtcclxuICAgIH1cclxuICAgIHRoaXMuaXNGdWxsV2lkdGhDZWxsID0gKCkgPT4ge1xyXG4gICAgICByZXR1cm4gdGhhdC5yb3dUZW1wbGF0ZSAhPSBudWxsO1xyXG4gICAgfTtcclxuICAgIC8vdGhpcy5jZHJcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMudGFrZUNvdW50ICYmIHRoaXMudGFrZUNvdW50ID4gMCkge1xyXG4gICAgICB0aGlzLnBhZ2luYXRpb25QYWdlU2l6ZSA9IHRoaXMudGFrZUNvdW50O1xyXG4gICAgICB0aGlzLnBhZ2luYXRpb25BdXRvUGFnZVNpemUgPSBmYWxzZTtcclxuICAgICAgdGhpcy5jYWNoZUJsb2NrU2l6ZSA9IHRoaXMudGFrZUNvdW50O1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ3NpbmdsZScpIHtcclxuICAgICAgdGhpcy5ncm91cFNlbGVjdHNDaGlsZHJlbiA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMua2V5RmllbGQgIT09ICdudWxsJyAmJiB0aGlzLmhhc0NoaWxkRmllbGQgIT09ICdudWxsJykge1xyXG4gICAgICB0aGlzLnJvd0dyb3VwUGFuZWxTaG93ID0gJ25ldmVyJztcclxuICAgICAgdGhpcy50cmVlRGF0YSA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5yZW1vdGVPcGVyYXRpb24pIHtcclxuICAgICAgdGhpcy5yb3dNb2RlbFR5cGUgPSAnc2VydmVyU2lkZSc7XHJcbiAgICB9XHJcbiAgICAvL1xyXG4gICAgaWYgKHRoaXMucnRsID09IG51bGwpIHtcclxuICAgICAgdGhpcy5ydGwgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLnJlZi5uYXRpdmVFbGVtZW50LCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCdkaXJlY3Rpb24nKSA9PT0gJ3J0bCc7XHJcbiAgICB9XHJcbiAgICAvL1xyXG4gIH1cclxuXHJcbiAgZ3JpZFNlbGVjdFJvdygpIHtcclxuICAgIGlmICh0aGlzLmdyaWRBcGkpIHtcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0Um93ICYmIHRoaXMuc2VsZWN0Um93Lmxlbmd0aCA+IDAgJiYgdGhpcy5ncmlkQXBpICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHRoaXMuc2VsZWN0Um93WzBdICE9ICdvYmplY3QnKSB7XHJcbiAgICAgICAgdGhpcy5ncmlkQXBpLmZvckVhY2hOb2RlKChub2RlKSA9PiB7XHJcbiAgICAgICAgICBpZiAobm9kZS5kYXRhICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgbGV0IHNlbGVjdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdFJvdy5mb3JFYWNoKChpZCkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChub2RlLmRhdGFbdGhpcy5rZXlGaWVsZF0gPT09IGlkKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3QgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgbm9kZS5zZXRTZWxlY3RlZChzZWxlY3QpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5ncmlkQXBpLmZvckVhY2hOb2RlKChub2RlKSA9PiB7XHJcbiAgICAgICAgICBpZiAobm9kZS5kYXRhICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgbGV0IHNlbGVjdDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdFJvdy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKGl0ZW0ucm93SW5kZXggIT0gdW5kZWZpbmVkICYmIGl0ZW0ucm93TGV2ZWwgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5kYXRhW3RoaXMua2V5RmllbGRdID09PSBpdGVtLmRhdGFbdGhpcy5rZXlGaWVsZF0pIHtcclxuICAgICAgICAgICAgICAgICAgc2VsZWN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuZGF0YVt0aGlzLmtleUZpZWxkXSA9PT0gaXRlbVt0aGlzLmtleUZpZWxkXSkge1xyXG4gICAgICAgICAgICAgICAgICBzZWxlY3QgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIG5vZGUuc2V0U2VsZWN0ZWQoc2VsZWN0KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xyXG5cclxuICAvLyAgIC8vQ2FsbGVkIGFmdGVyIGV2ZXJ5IGNoZWNrIG9mIHRoZSBjb21wb25lbnQncyB2aWV3LiBBcHBsaWVzIHRvIGNvbXBvbmVudHMgb25seS5cclxuICAvLyAgIC8vQWRkICdpbXBsZW1lbnRzIEFmdGVyVmlld0NoZWNrZWQnIHRvIHRoZSBjbGFzcy5cclxuICAvLyAgIC8vIHRoaXMuc2VsZWN0QnlWYWx1ZXMoKTtcclxuICAvLyAgIHRoaXMuZW5hYmVsU2VsZWN0ID0gZmFsc2U7XHJcblxyXG4gIC8vIH1cclxuICByZWJ1aWxkR3JpZCgpIHtcclxuICAgIHRoaXMubWFwQ29sdW1ucygpO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLnNpemVDb2x1bW5zVG9GaXQpIHtcclxuICAgICAgICB0aGlzLmdyaWRBcGkuc2l6ZUNvbHVtbnNUb0ZpdCgpO1xyXG4gICAgICB9XHJcbiAgICB9LCAxMCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy50cmVlRGF0YSA9PT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLmNvbHVtbkRlZnMgPSB0aGlzLmNvbHVtbnMubWFwKChjKSA9PiBjLnJlbmRlcigpKTtcclxuXHJcbiAgICAgIGNvbnN0IGdyb3VwQ29sdW1uID0gdGhpcy5jb2x1bW5EZWZzLmZpbmQoKGMpID0+IGMucm93R3JvdXBJbmRleCA9PSAnMCcgJiYgYy5maWVsZCAhPT0gJycpO1xyXG5cclxuICAgICAgdGhpcy5hdXRvR3JvdXBDb2x1bW5EZWYgPSB7XHJcbiAgICAgICAgaGVhZGVyTmFtZTogZ3JvdXBDb2x1bW4uaGVhZGVyTmFtZSxcclxuICAgICAgICB3aWR0aDogZ3JvdXBDb2x1bW4ud2lkdGgsXHJcbiAgICAgICAgY2VsbFJlbmRlcmVyUGFyYW1zOiB7IGNoZWNrYm94OiB0aGlzLnNob3dDaGVja0JveCB9LFxyXG4gICAgICAgIGZpZWxkOiBncm91cENvbHVtbi5maWVsZFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy5jb2x1bW5EZWZzLmZvckVhY2goKGVsbSkgPT4ge1xyXG4gICAgICAgIGlmIChlbG0ucm93R3JvdXBJbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICBlbG0uaGlkZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIC8vc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICB0aGlzLmdyaWRWaWV3ID0gdHJ1ZTtcclxuICAgIC8vfSk7XHJcblxyXG4gICAgdGhpcy5lbmFiZWxTZWxlY3QgPSB0cnVlO1xyXG4gICAgdGhpcy5kYXRhU291cmNlLm9uRGF0YVJlY2VpdmVkLnN1YnNjcmliZSgoX2RhdGEpID0+IHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gX2RhdGEuZGF0YS5yZXN1bHQ7XHJcbiAgICAgIHRoaXMuaGlkZUxvYWRpbmcoKTtcclxuICAgICAgbGV0IGl0ZW1zOiBhbnlbXTtcclxuICAgICAgbGV0IHRvdGFsQ291bnQ6IG51bWJlcjtcclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xyXG4gICAgICAgIGl0ZW1zID0gcmVzdWx0O1xyXG4gICAgICAgIHRvdGFsQ291bnQgPSByZXN1bHQubGVuZ3RoO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGl0ZW1zID0gcmVzdWx0Lml0ZW1zO1xyXG4gICAgICAgIHRvdGFsQ291bnQgPSByZXN1bHQudG90YWxDb3VudDtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5kYXRhU291cmNlU3VjY2Vzc0NhbGxiYWNrKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmxvYWRPbkluaXQpIHtcclxuICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZVN1Y2Nlc3NDYWxsYmFjayhbXSwgMCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZVN1Y2Nlc3NDYWxsYmFjayhpdGVtcywgdG90YWxDb3VudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICghdGhpcy5sb2FkT25Jbml0ICYmIHRoaXMuZ3JpZEFwaSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICB0aGlzLmdyaWRBcGkuc2V0Um93RGF0YShbXSk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmdyaWRBcGkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgdGhpcy5ncmlkQXBpLnNldFJvd0RhdGEoaXRlbXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5ncmlkU2VsZWN0Um93KCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmRhdGFTb3VyY2Uub25GZXRjaFN0YXJ0LnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc2hvd0xvYWRpbmcoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICh0aGlzLnNlYXJjaElucHV0KSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoSW5wdXQub25WYWx1ZUNoYW5nZWQuc3Vic2NyaWJlKChjKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zZWFyY2hUZXh0ID0gYy52YWx1ZTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvL1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgbWFwQ29sdW1ucygpIHtcclxuICAgIHRoaXMuY29sdW1uRGVmcyA9IHRoaXMuY29sdW1ucy5tYXAoKGMpID0+IGMucmVuZGVyKCkpO1xyXG5cclxuICAgIC8vIGlmICh0aGlzLnNob3dSb3dOdW1iZXIpIHtcclxuICAgIC8vICAgdGhpcy5jb2x1bW5EZWZzLnB1c2goe1xyXG4gICAgLy8gICAgIGhlYWRlck5hbWU6IEFYQ29uZmlnLmdldCgnbGF5b3V0LnJ0bCcpID8gJ9ix2K/bjNmBJyA6ICdSb3cnLFxyXG4gICAgLy8gICAgIHZhbHVlR2V0dGVyOiAnbm9kZS5yb3dJbmRleCArIDEnLFxyXG4gICAgLy8gICAgIHBpbm5lZDogQVhDb25maWcuZ2V0KCdsYXlvdXQucnRsJykgPyAncmlnaHQnIDogJ2xlZnQnXHJcbiAgICAvLyAgIH0pO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIGlmICh0aGlzLmdyaWREZXRhaWxUZW1wbGF0ZSkge1xyXG4gICAgICBpZiAodGhpcy5jb2x1bW5EZWZzWzBdLmNoZWNrYm94U2VsZWN0aW9uID09PSB0cnVlICYmIHRoaXMuY29sdW1uRGVmc1swXS5maWVsZCA9PT0gJycpIHtcclxuICAgICAgICB0aGlzLmNvbHVtbkRlZnNbMV0uY2VsbFJlbmRlcmVyID0gJ2FnR3JvdXBDZWxsUmVuZGVyZXInO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuY29sdW1uRGVmc1swXS5jZWxsUmVuZGVyZXIgPSAnYWdHcm91cENlbGxSZW5kZXJlcic7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5oYXNDaGlsZEZpZWxkID09PSAnbnVsbCcpIHtcclxuICAgICAgY29uc3QgZ3JvdXBDb2x1bW4gPSB0aGlzLmNvbHVtbkRlZnMuZmluZCgoYykgPT4gYy5yb3dHcm91cEluZGV4ID09PSB1bmRlZmluZWQgJiYgYy5maWVsZCAhPT0gJycpO1xyXG4gICAgICBpZiAoZ3JvdXBDb2x1bW4gJiYgdGhpcy5ncm91cEhpZGVPcGVuUGFyZW50cyA9PSBmYWxzZSkge1xyXG4gICAgICAgIHRoaXMuYXV0b0dyb3VwQ29sdW1uRGVmID0ge1xyXG4gICAgICAgICAgaGVhZGVyTmFtZTogZ3JvdXBDb2x1bW4uaGVhZGVyTmFtZSxcclxuICAgICAgICAgIHdpZHRoOiBncm91cENvbHVtbi53aWR0aCxcclxuICAgICAgICAgIGNlbGxSZW5kZXJlclBhcmFtczogeyBjaGVja2JveDogdGhpcy5zaG93Q2hlY2tCb3ggfSxcclxuICAgICAgICAgIGZpZWxkOiBncm91cENvbHVtbi5maWVsZFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy8gIGdyb3VwQ29sdW1uLmhpZGUgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jb2x1bW5EZWZzLmZvckVhY2goKGVsbSkgPT4ge1xyXG4gICAgICBpZiAoZWxtLnJvd0dyb3VwSW5kZXggPiAtMSkge1xyXG4gICAgICAgIGVsbS5oaWRlID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBkaXNwbGF5ZWRDb2x1bW5zQ2hhbmdlZChlKSB7XHJcbiAgICBpZiAodGhpcy5oYXNDaGlsZEZpZWxkID09PSAnbnVsbCcpIHtcclxuICAgICAgY29uc3QgZWUgPSBlLmNvbHVtbkFwaS5nZXRBbGxEaXNwbGF5ZWRDb2x1bW5Hcm91cHMoKTtcclxuICAgICAgY29uc3QgZWVlID0gZWUuZmluZCgoYykgPT4gYy5jb2xJZCAhPT0gJ2FnLUdyaWQtQXV0b0NvbHVtbicgJiYgYy5jb2xJZCAhPT0gJzAnKTtcclxuICAgICAgaWYgKGVlZSAmJiBlZWUuY29sSWQpIHtcclxuICAgICAgICB0aGlzLmF1dG9Hcm91cENvbHVtbkRlZiA9IHtcclxuICAgICAgICAgIGhlYWRlck5hbWU6IGVlZS5jb2xEZWYuaGVhZGVyTmFtZSxcclxuICAgICAgICAgIHdpZHRoOiBlZWUuY29sRGVmLndpZHRoLFxyXG4gICAgICAgICAgY2VsbFJlbmRlcmVyUGFyYW1zOiB7IGNoZWNrYm94OiB0aGlzLnNob3dDaGVja0JveCB9LFxyXG4gICAgICAgICAgZmllbGQ6IGVlZS5jb2xEZWYuZmllbGRcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGVlZS5oaWRlID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlZnJlc2gocm91dGU6IGFueVtdID0gW10pIHtcclxuICAgIGlmICh0aGlzLnJlbW90ZU9wZXJhdGlvbiAmJiB0aGlzLmdyaWRBcGkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAvLyAgdGhpcy5ncmlkQXBpLnB1cmdlU2VydmVyU2lkZUNhY2hlKHJvdXRlKTtcclxuICAgICAgdGhpcy5ncmlkQXBpLnNldFNlcnZlclNpZGVEYXRhc291cmNlKHRoaXMuaW50ZW5hbEdyaWREYXRhU291cmNlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIFRPRE8gOiBjaGVjayBmZXRjaCBwYXJhbVxyXG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZmV0Y2gobnVsbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbnRlcm5hbEdyaWRDZWxsQ2xpY2tlZChlOiBDZWxsQ2xpY2tlZEV2ZW50KSB7XHJcbiAgICB0aGlzLmNlbGxDbGljay5lbWl0KHsgZGF0YTogdGhpcy5tYXBDZWxsRXZlbnQoZSksIGNvbXBvbmVudDogdGhpcywgaHRtbEVsZW1lbnQ6IHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQgfSk7XHJcbiAgfVxyXG5cclxuICBpbnRlcm5hbEdyaWRDZWxsRG91YmxlQ2xpY2tlZChlOiBDZWxsQ2xpY2tlZEV2ZW50KSB7XHJcbiAgICB0aGlzLmNlbGxEYkNsaWNrLmVtaXQoeyBkYXRhOiB0aGlzLm1hcENlbGxFdmVudChlKSwgY29tcG9uZW50OiB0aGlzLCBodG1sRWxlbWVudDogdGhpcy5yZWYubmF0aXZlRWxlbWVudCB9KTtcclxuICB9XHJcblxyXG4gIGludGVybmFsR3JpZENlbGxGb2N1c2VkKGU6IENlbGxDbGlja2VkRXZlbnQpIHtcclxuICAgIHRoaXMuY2VsbEZvY3VzZS5lbWl0KHsgZGF0YTogdGhpcy5tYXBDZWxsRXZlbnQoZSksIGh0bWxFbGVtZW50OiB0aGlzLnJlZi5uYXRpdmVFbGVtZW50LCBjb21wb25lbnQ6IHRoaXMgfSk7XHJcbiAgfVxyXG5cclxuICBpbnRlcm5hbEdyaWRSb3dDbGlja2VkKGU6IFJvd0NsaWNrZWRFdmVudCkge1xyXG4gICAgaWYgKCFlLm5vZGUuZ3JvdXApIHtcclxuICAgICAgdGhpcy5yb3dDbGljay5lbWl0KHsgZGF0YTogdGhpcy5tYXBSb3dFdmVudChlKSwgY29tcG9uZW50OiB0aGlzLCBodG1sRWxlbWVudDogdGhpcy5yZWYubmF0aXZlRWxlbWVudCB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGludGVybmFsR3JpZFJvd0RvdWJsZUNsaWNrZWQoZTogQ2VsbENsaWNrZWRFdmVudCkge1xyXG4gICAgaWYgKCFlLm5vZGUuZ3JvdXApIHtcclxuICAgICAgdGhpcy5yb3dEYkNsaWNrLmVtaXQoeyBkYXRhOiB0aGlzLm1hcFJvd0V2ZW50KGUpLCBodG1sRWxlbWVudDogdGhpcy5yZWYubmF0aXZlRWxlbWVudCwgY29tcG9uZW50OiB0aGlzIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGlmZmVyZW5jZU9mMkFycmF5cyhhcnJheTE6IGFueSwgYXJyYXkyOiBhbnkpIHtcclxuICAgIGNvbnN0IHRlbXAgPSBbXTtcclxuICAgIGZvciAoY29uc3QgaSBpbiBhcnJheTEpIHtcclxuICAgICAgaWYgKGFycmF5Mi5pbmRleE9mKGFycmF5MVtpXSkgPT09IC0xKSB7XHJcbiAgICAgICAgdGVtcC5wdXNoKGFycmF5MVtpXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGZvciAoY29uc3QgaSBpbiBhcnJheTIpIHtcclxuICAgICAgaWYgKGFycmF5MS5pbmRleE9mKGFycmF5MltpXSkgPT09IC0xKSB7XHJcbiAgICAgICAgdGVtcC5wdXNoKGFycmF5MltpXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0ZW1wLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcclxuICB9XHJcblxyXG4gIHJvd1NlbGVjdGlvbkNoYW5nZWQoZSkge1xyXG4gICAgLy8gdGhpcy5ncmlkQXBpLmZvckVhY2hOb2RlKChub2RlKSA9PiB7XHJcbiAgICAvLyAgIGlmIChub2RlLmRhdGFbdGhpcy5rZXlGaWVsZF0gPT0gZS5ub2RlLmRhdGFbdGhpcy5rZXlGaWVsZF0pIHtcclxuICAgIC8vICAgICBub2RlLnNldFNlbGVjdGVkKGUubm9kZS5zZWxlY3RlZCk7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH0pO1xyXG4gICAgaWYgKGUubm9kZS5zZWxlY3RlZCA9PSB0cnVlKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0Um93ID0gdGhpcy5zZWxlY3RSb3cuZmlsdGVyKChjKSA9PiBjW3RoaXMua2V5RmllbGRdICE9IGUuZGF0YVt0aGlzLmtleUZpZWxkXSk7XHJcbiAgICAgIHRoaXMuc2VsZWN0Um93LnB1c2goZS5kYXRhKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0Um93ID0gdGhpcy5zZWxlY3RSb3cuZmlsdGVyKChjKSA9PiBjW3RoaXMua2V5RmllbGRdICE9IGUuZGF0YVt0aGlzLmtleUZpZWxkXSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnJvd1NlbGVjdGlvbkNoYW5nZS5lbWl0KHsgY29tcG9uZW50OiB0aGlzLCBkYXRhOiBlLCBodG1sRWxlbWVudDogdGhpcy5yZWYubmF0aXZlRWxlbWVudCB9KTtcclxuICAgIC8vIGNvbnNvbGUubG9nKCdlJywgZSk7XHJcbiAgICAvLyBjb25zb2xlLmxvZygnc2VsZWN0JywgZS5ub2RlLnNlbGVjdGVkKTtcclxuICAgIC8vIGNvbnNvbGUubG9nKCdpbmRleCcsIGUucm93SW5kZXgpO1xyXG4gIH1cclxuXHJcbiAgaW50ZXJuYWxHcmlkU2VsZWN0aW9uQ2hhbmdlZChlKSB7XHJcbiAgICBjb25zdCBhcmdzOiBBWEdyaWRSb3dTZWxlY3Rpb25FdmVudCA9IHsgaXRlbXM6IFtdIH07XHJcbiAgICBjb25zdCBvbGROb2RlcyA9IHRoaXMub2xkU2VsZWN0aW9uTm9kZXM7XHJcbiAgICBjb25zdCBub2RlcyA9IHRoaXMuZ3JpZEFwaS5nZXRTZWxlY3RlZE5vZGVzKCk7XHJcbiAgICBub2Rlcy5mb3JFYWNoKChpKSA9PiB7XHJcbiAgICAgIGFyZ3MuaXRlbXMucHVzaCh7XHJcbiAgICAgICAgcm93TGV2ZWw6IGkubGV2ZWwsXHJcbiAgICAgICAgcm93SW5kZXg6IGkucm93SW5kZXgsXHJcbiAgICAgICAgZGF0YTogaS5kYXRhXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZWQuZW1pdCh7IGRhdGE6IGFyZ3MsIGNvbXBvbmVudDogdGhpcywgaHRtbEVsZW1lbnQ6IHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQgfSk7XHJcbiAgICBsZXQgYWN0aW9uID0gbm9kZXMubGVuZ3RoID4gb2xkTm9kZXMubGVuZ3RoID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZGlmZmVyZW5jZU9mMkFycmF5cyhub2Rlcywgb2xkTm9kZXMpO1xyXG4gICAgdGhpcy5vblJvd1NlbGVjdGlvbkNoYW5nZWQuZW1pdCh7IGNvbXBvbmVudDogdGhpcywgc2VsZWN0ZWQ6IGFjdGlvbiwgZGF0YTogbm9kZSwgaHRtbEVsZW1lbnQ6IHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQgfSk7XHJcbiAgICB0aGlzLm9sZFNlbGVjdGlvbk5vZGVzID0gbm9kZXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hcENlbGxFdmVudChlOiBDZWxsRXZlbnQpOiBBWEdyaWRDZWxsRXZlbnQge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcm93TGV2ZWw6IDAsXHJcbiAgICAgIGNvbHVtbjogZS5jb2x1bW4sXHJcbiAgICAgIGRhdGE6IGUuZGF0YSxcclxuICAgICAgcm93SW5kZXg6IGUucm93SW5kZXgsXHJcbiAgICAgIHZhbHVlOiBlLnZhbHVlXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtYXBSb3dFdmVudChlOiBSb3dFdmVudCk6IEFYR3JpZFJvd0V2ZW50IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHJvd0xldmVsOiAwLFxyXG4gICAgICBkYXRhOiBlLmRhdGEsXHJcbiAgICAgIHJvd0luZGV4OiBlLnJvd0luZGV4XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRlc2VsZWN0QWxsKCkge1xyXG4gICAgdGhpcy5ncmlkQXBpLmRlc2VsZWN0QWxsKCk7XHJcbiAgfVxyXG5cclxuICBpbnRlcm5hbEdldFJvd0NsYXNzID0gKHA6IGFueSkgPT4ge1xyXG4gICAgaWYgKHRoaXMucm93Q2xhc3MpIHtcclxuICAgICAgaWYgKHRoaXMucm93Q2xhc3MgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJvd0NsYXNzKHtcclxuICAgICAgICAgIHJvd0luZGV4OiBwLm5vZGUucm93SW5kZXgsXHJcbiAgICAgICAgICByb3dMZXZlbDogcC5ub2RlLmxldmVsLFxyXG4gICAgICAgICAgZGF0YTogcC5kYXRhXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucm93Q2xhc3M7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9O1xyXG5cclxuICBzaG93TG9hZGluZygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmdyaWRBcGkpIHtcclxuICAgICAgdGhpcy5ncmlkQXBpLnNob3dMb2FkaW5nT3ZlcmxheSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGlkZUxvYWRpbmcoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5ncmlkQXBpKSB7XHJcbiAgICAgIHRoaXMuZ3JpZEFwaS5oaWRlT3ZlcmxheSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW50ZXJuYWxHcmlkU2l6ZUNoYW5nZWQoZTogR3JpZFNpemVDaGFuZ2VkRXZlbnQpIHtcclxuICAgIGlmIChlLmNsaWVudFdpZHRoID4gMCAmJiBlLmNsaWVudEhlaWdodCA+IDApIHtcclxuICAgICAgdGhpcy5wZXJmb3JtU2l6ZUNvbHVtbnNUb0ZpdChlLmFwaSk7XHJcbiAgICB9XHJcbiAgICAvLyAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICAvLyAgdGhpcy5ncmlkQXBpLnBhZ2luYXRpb25Hb1RvRmlyc3RQYWdlKCk7XHJcbiAgfVxyXG5cclxuICBpbnRlcm5hbEdyaWRGaXJzdERhdGFSZW5kZXJlZChlOiBGaXJzdERhdGFSZW5kZXJlZEV2ZW50KSB7XHJcbiAgICB0aGlzLnBlcmZvcm1TaXplQ29sdW1uc1RvRml0KGUuYXBpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGVyZm9ybVNpemVDb2x1bW5zVG9GaXQoYXBpOiBHcmlkQXBpKSB7XHJcbiAgICBpZiAodGhpcy5zaXplQ29sdW1uc1RvRml0KSB7XHJcbiAgICAgIGFwaS5zaXplQ29sdW1uc1RvRml0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==