@swimlane/ngx-datatable 16.1.1 → 19.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/assets/icons-reference.html +2 -2
- package/assets/icons.css +39 -19
- package/bundles/swimlane-ngx-datatable.umd.js +1663 -5743
- package/bundles/swimlane-ngx-datatable.umd.js.map +1 -1
- package/bundles/swimlane-ngx-datatable.umd.min.js +1 -1
- package/bundles/swimlane-ngx-datatable.umd.min.js.map +1 -1
- package/esm2015/lib/components/body/body-cell.component.js +5 -235
- package/esm2015/lib/components/body/body-group-header-template.directive.js +1 -13
- package/esm2015/lib/components/body/body-group-header.directive.js +1 -28
- package/esm2015/lib/components/body/body-row-wrapper.component.js +4 -86
- package/esm2015/lib/components/body/body-row.component.js +2 -153
- package/esm2015/lib/components/body/body.component.js +71 -303
- package/esm2015/lib/components/body/progress-bar.component.js +2 -6
- package/esm2015/lib/components/body/scroller.component.js +6 -82
- package/esm2015/lib/components/body/selection.component.js +7 -112
- package/esm2015/lib/components/body/summary/summary-row.component.js +10 -100
- package/esm2015/lib/components/columns/column-cell.directive.js +1 -13
- package/esm2015/lib/components/columns/column-header.directive.js +1 -13
- package/esm2015/lib/components/columns/column.directive.js +1 -89
- package/esm2015/lib/components/columns/tree.directive.js +1 -13
- package/esm2015/lib/components/datatable.component.js +49 -570
- package/esm2015/lib/components/footer/footer-template.directive.js +1 -13
- package/esm2015/lib/components/footer/footer.component.js +2 -41
- package/esm2015/lib/components/footer/footer.directive.js +2 -29
- package/esm2015/lib/components/footer/pager.component.js +3 -77
- package/esm2015/lib/components/header/header-cell.component.js +11 -130
- package/esm2015/lib/components/header/header.component.js +20 -193
- package/esm2015/lib/components/row-detail/row-detail-template.directive.js +1 -13
- package/esm2015/lib/components/row-detail/row-detail.directive.js +1 -29
- package/esm2015/lib/directives/draggable.directive.js +4 -72
- package/esm2015/lib/directives/long-press.directive.js +8 -88
- package/esm2015/lib/directives/orderable.directive.js +11 -104
- package/esm2015/lib/directives/resizeable.directive.js +14 -81
- package/esm2015/lib/directives/visibility.directive.js +9 -64
- package/esm2015/lib/events.js +6 -13
- package/esm2015/lib/ngx-datatable.module.js +2 -16
- package/esm2015/lib/services/column-changes.service.js +1 -18
- package/esm2015/lib/services/dimensions-helper.service.js +1 -9
- package/esm2015/lib/services/scrollbar-helper.service.js +1 -25
- package/esm2015/lib/types/click.type.js +6 -11
- package/esm2015/lib/types/column-mode.type.js +7 -12
- package/esm2015/lib/types/contextmenu.type.js +6 -11
- package/esm2015/lib/types/selection.type.js +9 -14
- package/esm2015/lib/types/sort-direction.type.js +6 -11
- package/esm2015/lib/types/sort-prop-dir.type.js +2 -15
- package/esm2015/lib/types/sort.type.js +6 -11
- package/esm2015/lib/types/table-column.type.js +2 -217
- package/esm2015/lib/utils/camel-case.js +4 -26
- package/esm2015/lib/utils/column-helper.js +1 -18
- package/esm2015/lib/utils/column-prop-getters.js +6 -21
- package/esm2015/lib/utils/column.js +1 -28
- package/esm2015/lib/utils/elm-from-point.js +3 -15
- package/esm2015/lib/utils/id.js +1 -6
- package/esm2015/lib/utils/keys.js +10 -21
- package/esm2015/lib/utils/math.js +4 -51
- package/esm2015/lib/utils/prefixes.js +5 -24
- package/esm2015/lib/utils/row-height-cache.js +6 -46
- package/esm2015/lib/utils/selection.js +1 -25
- package/esm2015/lib/utils/sort.js +9 -50
- package/esm2015/lib/utils/throttle.js +7 -41
- package/esm2015/lib/utils/translate.js +1 -17
- package/esm2015/lib/utils/tree.js +7 -56
- package/esm2015/public-api.js +56 -60
- package/esm2015/swimlane-ngx-datatable.js +2 -6
- package/fesm2015/swimlane-ngx-datatable.js +308 -3513
- package/fesm2015/swimlane-ngx-datatable.js.map +1 -1
- package/index.css +1 -1
- package/index.scss +1 -1
- package/lib/components/body/body-cell.component.d.ts +23 -14
- package/lib/components/body/body-group-header.directive.d.ts +1 -1
- package/lib/components/body/body-row-wrapper.component.d.ts +4 -2
- package/lib/components/body/body-row.component.d.ts +8 -5
- package/lib/components/body/body.component.d.ts +17 -10
- package/lib/components/columns/column.directive.d.ts +3 -3
- package/lib/components/datatable.component.d.ts +45 -38
- package/lib/components/footer/footer.component.d.ts +2 -2
- package/lib/components/footer/footer.directive.d.ts +1 -1
- package/lib/components/footer/pager.component.d.ts +7 -4
- package/lib/components/header/header-cell.component.d.ts +14 -9
- package/lib/components/header/header.component.d.ts +14 -7
- package/lib/components/row-detail/row-detail.directive.d.ts +1 -1
- package/lib/directives/long-press.directive.d.ts +2 -2
- package/lib/directives/resizeable.directive.d.ts +1 -0
- package/lib/ngx-datatable.module.d.ts +1 -1
- package/lib/services/column-changes.service.d.ts +1 -1
- package/lib/utils/throttle.d.ts +1 -1
- package/package.json +10 -13
- package/swimlane-ngx-datatable.metadata.json +1 -1
- package/themes/material.css +53 -51
- package/themes/material.scss +4 -2
- package/esm5/lib/components/body/body-cell.component.js +0 -667
- package/esm5/lib/components/body/body-group-header-template.directive.js +0 -26
- package/esm5/lib/components/body/body-group-header.directive.js +0 -109
- package/esm5/lib/components/body/body-row-wrapper.component.js +0 -181
- package/esm5/lib/components/body/body-row.component.js +0 -409
- package/esm5/lib/components/body/body.component.js +0 -1148
- package/esm5/lib/components/body/progress-bar.component.js +0 -19
- package/esm5/lib/components/body/scroller.component.js +0 -172
- package/esm5/lib/components/body/selection.component.js +0 -289
- package/esm5/lib/components/body/summary/summary-row.component.js +0 -179
- package/esm5/lib/components/columns/column-cell.directive.js +0 -24
- package/esm5/lib/components/columns/column-header.directive.js +0 -24
- package/esm5/lib/components/columns/column.directive.js +0 -167
- package/esm5/lib/components/columns/tree.directive.js +0 -24
- package/esm5/lib/components/datatable.component.js +0 -1848
- package/esm5/lib/components/footer/footer-template.directive.js +0 -24
- package/esm5/lib/components/footer/footer.component.js +0 -88
- package/esm5/lib/components/footer/footer.directive.js +0 -57
- package/esm5/lib/components/footer/pager.component.js +0 -214
- package/esm5/lib/components/header/header-cell.component.js +0 -351
- package/esm5/lib/components/header/header.component.js +0 -502
- package/esm5/lib/components/row-detail/row-detail-template.directive.js +0 -26
- package/esm5/lib/components/row-detail/row-detail.directive.js +0 -111
- package/esm5/lib/directives/draggable.directive.js +0 -194
- package/esm5/lib/directives/long-press.directive.js +0 -220
- package/esm5/lib/directives/orderable.directive.js +0 -274
- package/esm5/lib/directives/resizeable.directive.js +0 -178
- package/esm5/lib/directives/visibility.directive.js +0 -129
- package/esm5/lib/events.js +0 -14
- package/esm5/lib/ngx-datatable.module.js +0 -123
- package/esm5/lib/services/column-changes.service.js +0 -47
- package/esm5/lib/services/dimensions-helper.service.js +0 -30
- package/esm5/lib/services/scrollbar-helper.service.js +0 -60
- package/esm5/lib/types/click.type.js +0 -11
- package/esm5/lib/types/column-mode.type.js +0 -12
- package/esm5/lib/types/contextmenu.type.js +0 -11
- package/esm5/lib/types/selection.type.js +0 -14
- package/esm5/lib/types/sort-direction.type.js +0 -11
- package/esm5/lib/types/sort-prop-dir.type.js +0 -15
- package/esm5/lib/types/sort.type.js +0 -11
- package/esm5/lib/types/table-column.type.js +0 -217
- package/esm5/lib/utils/camel-case.js +0 -50
- package/esm5/lib/utils/column-helper.js +0 -145
- package/esm5/lib/utils/column-prop-getters.js +0 -111
- package/esm5/lib/utils/column.js +0 -130
- package/esm5/lib/utils/elm-from-point.js +0 -50
- package/esm5/lib/utils/id.js +0 -13
- package/esm5/lib/utils/keys.js +0 -21
- package/esm5/lib/utils/math.js +0 -271
- package/esm5/lib/utils/prefixes.js +0 -59
- package/esm5/lib/utils/row-height-cache.js +0 -264
- package/esm5/lib/utils/selection.js +0 -64
- package/esm5/lib/utils/sort.js +0 -180
- package/esm5/lib/utils/throttle.js +0 -94
- package/esm5/lib/utils/translate.js +0 -41
- package/esm5/lib/utils/tree.js +0 -157
- package/esm5/public-api.js +0 -68
- package/esm5/swimlane-ngx-datatable.js +0 -9
- package/fesm5/swimlane-ngx-datatable.js +0 -9695
- package/fesm5/swimlane-ngx-datatable.js.map +0 -1
- package/lib/test/jasmine-matchers.d.ts +0 -12
|
@@ -1,1148 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview added by tsickle
|
|
3
|
-
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
4
|
-
*/
|
|
5
|
-
import * as tslib_1 from "tslib";
|
|
6
|
-
import { Component, Output, EventEmitter, Input, HostBinding, ChangeDetectorRef, ViewChild, ChangeDetectionStrategy } from '@angular/core';
|
|
7
|
-
import { ScrollerComponent } from './scroller.component';
|
|
8
|
-
import { SelectionType } from '../../types/selection.type';
|
|
9
|
-
import { columnsByPin, columnGroupWidths } from '../../utils/column';
|
|
10
|
-
import { RowHeightCache } from '../../utils/row-height-cache';
|
|
11
|
-
import { translateXY } from '../../utils/translate';
|
|
12
|
-
var DataTableBodyComponent = /** @class */ (function () {
|
|
13
|
-
/**
|
|
14
|
-
* Creates an instance of DataTableBodyComponent.
|
|
15
|
-
*/
|
|
16
|
-
function DataTableBodyComponent(cd) {
|
|
17
|
-
var _this = this;
|
|
18
|
-
this.cd = cd;
|
|
19
|
-
this.selected = [];
|
|
20
|
-
this.scroll = new EventEmitter();
|
|
21
|
-
this.page = new EventEmitter();
|
|
22
|
-
this.activate = new EventEmitter();
|
|
23
|
-
this.select = new EventEmitter();
|
|
24
|
-
this.detailToggle = new EventEmitter();
|
|
25
|
-
this.rowContextmenu = new EventEmitter(false);
|
|
26
|
-
this.treeAction = new EventEmitter();
|
|
27
|
-
this.rowHeightsCache = new RowHeightCache();
|
|
28
|
-
this.temp = [];
|
|
29
|
-
this.offsetY = 0;
|
|
30
|
-
this.indexes = {};
|
|
31
|
-
this.rowIndexes = new Map();
|
|
32
|
-
this.rowExpansions = new Map();
|
|
33
|
-
/**
|
|
34
|
-
* Get the height of the detail row.
|
|
35
|
-
*/
|
|
36
|
-
this.getDetailRowHeight = (/**
|
|
37
|
-
* @param {?=} row
|
|
38
|
-
* @param {?=} index
|
|
39
|
-
* @return {?}
|
|
40
|
-
*/
|
|
41
|
-
function (row, index) {
|
|
42
|
-
if (!_this.rowDetail) {
|
|
43
|
-
return 0;
|
|
44
|
-
}
|
|
45
|
-
/** @type {?} */
|
|
46
|
-
var rowHeight = _this.rowDetail.rowHeight;
|
|
47
|
-
return typeof rowHeight === 'function' ? rowHeight(row, index) : ((/** @type {?} */ (rowHeight)));
|
|
48
|
-
});
|
|
49
|
-
// declare fn here so we can get access to the `this` property
|
|
50
|
-
this.rowTrackingFn = (/**
|
|
51
|
-
* @param {?} index
|
|
52
|
-
* @param {?} row
|
|
53
|
-
* @return {?}
|
|
54
|
-
*/
|
|
55
|
-
function (index, row) {
|
|
56
|
-
/** @type {?} */
|
|
57
|
-
var idx = _this.getRowIndex(row);
|
|
58
|
-
if (_this.trackByProp) {
|
|
59
|
-
return row[_this.trackByProp];
|
|
60
|
-
}
|
|
61
|
-
else {
|
|
62
|
-
return idx;
|
|
63
|
-
}
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
Object.defineProperty(DataTableBodyComponent.prototype, "pageSize", {
|
|
67
|
-
get: /**
|
|
68
|
-
* @return {?}
|
|
69
|
-
*/
|
|
70
|
-
function () {
|
|
71
|
-
return this._pageSize;
|
|
72
|
-
},
|
|
73
|
-
set: /**
|
|
74
|
-
* @param {?} val
|
|
75
|
-
* @return {?}
|
|
76
|
-
*/
|
|
77
|
-
function (val) {
|
|
78
|
-
this._pageSize = val;
|
|
79
|
-
this.recalcLayout();
|
|
80
|
-
},
|
|
81
|
-
enumerable: true,
|
|
82
|
-
configurable: true
|
|
83
|
-
});
|
|
84
|
-
Object.defineProperty(DataTableBodyComponent.prototype, "rows", {
|
|
85
|
-
get: /**
|
|
86
|
-
* @return {?}
|
|
87
|
-
*/
|
|
88
|
-
function () {
|
|
89
|
-
return this._rows;
|
|
90
|
-
},
|
|
91
|
-
set: /**
|
|
92
|
-
* @param {?} val
|
|
93
|
-
* @return {?}
|
|
94
|
-
*/
|
|
95
|
-
function (val) {
|
|
96
|
-
this._rows = val;
|
|
97
|
-
this.rowExpansions.clear();
|
|
98
|
-
this.recalcLayout();
|
|
99
|
-
},
|
|
100
|
-
enumerable: true,
|
|
101
|
-
configurable: true
|
|
102
|
-
});
|
|
103
|
-
Object.defineProperty(DataTableBodyComponent.prototype, "columns", {
|
|
104
|
-
get: /**
|
|
105
|
-
* @return {?}
|
|
106
|
-
*/
|
|
107
|
-
function () {
|
|
108
|
-
return this._columns;
|
|
109
|
-
},
|
|
110
|
-
set: /**
|
|
111
|
-
* @param {?} val
|
|
112
|
-
* @return {?}
|
|
113
|
-
*/
|
|
114
|
-
function (val) {
|
|
115
|
-
this._columns = val;
|
|
116
|
-
/** @type {?} */
|
|
117
|
-
var colsByPin = columnsByPin(val);
|
|
118
|
-
this.columnGroupWidths = columnGroupWidths(colsByPin, val);
|
|
119
|
-
},
|
|
120
|
-
enumerable: true,
|
|
121
|
-
configurable: true
|
|
122
|
-
});
|
|
123
|
-
Object.defineProperty(DataTableBodyComponent.prototype, "offset", {
|
|
124
|
-
get: /**
|
|
125
|
-
* @return {?}
|
|
126
|
-
*/
|
|
127
|
-
function () {
|
|
128
|
-
return this._offset;
|
|
129
|
-
},
|
|
130
|
-
set: /**
|
|
131
|
-
* @param {?} val
|
|
132
|
-
* @return {?}
|
|
133
|
-
*/
|
|
134
|
-
function (val) {
|
|
135
|
-
this._offset = val;
|
|
136
|
-
this.recalcLayout();
|
|
137
|
-
},
|
|
138
|
-
enumerable: true,
|
|
139
|
-
configurable: true
|
|
140
|
-
});
|
|
141
|
-
Object.defineProperty(DataTableBodyComponent.prototype, "rowCount", {
|
|
142
|
-
get: /**
|
|
143
|
-
* @return {?}
|
|
144
|
-
*/
|
|
145
|
-
function () {
|
|
146
|
-
return this._rowCount;
|
|
147
|
-
},
|
|
148
|
-
set: /**
|
|
149
|
-
* @param {?} val
|
|
150
|
-
* @return {?}
|
|
151
|
-
*/
|
|
152
|
-
function (val) {
|
|
153
|
-
this._rowCount = val;
|
|
154
|
-
this.recalcLayout();
|
|
155
|
-
},
|
|
156
|
-
enumerable: true,
|
|
157
|
-
configurable: true
|
|
158
|
-
});
|
|
159
|
-
Object.defineProperty(DataTableBodyComponent.prototype, "bodyWidth", {
|
|
160
|
-
get: /**
|
|
161
|
-
* @return {?}
|
|
162
|
-
*/
|
|
163
|
-
function () {
|
|
164
|
-
if (this.scrollbarH) {
|
|
165
|
-
return this.innerWidth + 'px';
|
|
166
|
-
}
|
|
167
|
-
else {
|
|
168
|
-
return '100%';
|
|
169
|
-
}
|
|
170
|
-
},
|
|
171
|
-
enumerable: true,
|
|
172
|
-
configurable: true
|
|
173
|
-
});
|
|
174
|
-
Object.defineProperty(DataTableBodyComponent.prototype, "bodyHeight", {
|
|
175
|
-
get: /**
|
|
176
|
-
* @return {?}
|
|
177
|
-
*/
|
|
178
|
-
function () {
|
|
179
|
-
return this._bodyHeight;
|
|
180
|
-
},
|
|
181
|
-
set: /**
|
|
182
|
-
* @param {?} val
|
|
183
|
-
* @return {?}
|
|
184
|
-
*/
|
|
185
|
-
function (val) {
|
|
186
|
-
if (this.scrollbarV) {
|
|
187
|
-
this._bodyHeight = val + 'px';
|
|
188
|
-
}
|
|
189
|
-
else {
|
|
190
|
-
this._bodyHeight = 'auto';
|
|
191
|
-
}
|
|
192
|
-
this.recalcLayout();
|
|
193
|
-
},
|
|
194
|
-
enumerable: true,
|
|
195
|
-
configurable: true
|
|
196
|
-
});
|
|
197
|
-
Object.defineProperty(DataTableBodyComponent.prototype, "selectEnabled", {
|
|
198
|
-
/**
|
|
199
|
-
* Returns if selection is enabled.
|
|
200
|
-
*/
|
|
201
|
-
get: /**
|
|
202
|
-
* Returns if selection is enabled.
|
|
203
|
-
* @return {?}
|
|
204
|
-
*/
|
|
205
|
-
function () {
|
|
206
|
-
return !!this.selectionType;
|
|
207
|
-
},
|
|
208
|
-
enumerable: true,
|
|
209
|
-
configurable: true
|
|
210
|
-
});
|
|
211
|
-
Object.defineProperty(DataTableBodyComponent.prototype, "scrollHeight", {
|
|
212
|
-
/**
|
|
213
|
-
* Property that would calculate the height of scroll bar
|
|
214
|
-
* based on the row heights cache for virtual scroll and virtualization. Other scenarios
|
|
215
|
-
* calculate scroll height automatically (as height will be undefined).
|
|
216
|
-
*/
|
|
217
|
-
get: /**
|
|
218
|
-
* Property that would calculate the height of scroll bar
|
|
219
|
-
* based on the row heights cache for virtual scroll and virtualization. Other scenarios
|
|
220
|
-
* calculate scroll height automatically (as height will be undefined).
|
|
221
|
-
* @return {?}
|
|
222
|
-
*/
|
|
223
|
-
function () {
|
|
224
|
-
if (this.scrollbarV && this.virtualization && this.rowCount) {
|
|
225
|
-
return this.rowHeightsCache.query(this.rowCount - 1);
|
|
226
|
-
}
|
|
227
|
-
// avoid TS7030: Not all code paths return a value.
|
|
228
|
-
return undefined;
|
|
229
|
-
},
|
|
230
|
-
enumerable: true,
|
|
231
|
-
configurable: true
|
|
232
|
-
});
|
|
233
|
-
/**
|
|
234
|
-
* Called after the constructor, initializing input properties
|
|
235
|
-
*/
|
|
236
|
-
/**
|
|
237
|
-
* Called after the constructor, initializing input properties
|
|
238
|
-
* @return {?}
|
|
239
|
-
*/
|
|
240
|
-
DataTableBodyComponent.prototype.ngOnInit = /**
|
|
241
|
-
* Called after the constructor, initializing input properties
|
|
242
|
-
* @return {?}
|
|
243
|
-
*/
|
|
244
|
-
function () {
|
|
245
|
-
var _this = this;
|
|
246
|
-
if (this.rowDetail) {
|
|
247
|
-
this.listener = this.rowDetail.toggle.subscribe((/**
|
|
248
|
-
* @param {?} __0
|
|
249
|
-
* @return {?}
|
|
250
|
-
*/
|
|
251
|
-
function (_a) {
|
|
252
|
-
var type = _a.type, value = _a.value;
|
|
253
|
-
if (type === 'row') {
|
|
254
|
-
_this.toggleRowExpansion(value);
|
|
255
|
-
}
|
|
256
|
-
if (type === 'all') {
|
|
257
|
-
_this.toggleAllRows(value);
|
|
258
|
-
}
|
|
259
|
-
// Refresh rows after toggle
|
|
260
|
-
// Fixes #883
|
|
261
|
-
_this.updateIndexes();
|
|
262
|
-
_this.updateRows();
|
|
263
|
-
_this.cd.markForCheck();
|
|
264
|
-
}));
|
|
265
|
-
}
|
|
266
|
-
if (this.groupHeader) {
|
|
267
|
-
this.listener = this.groupHeader.toggle.subscribe((/**
|
|
268
|
-
* @param {?} __0
|
|
269
|
-
* @return {?}
|
|
270
|
-
*/
|
|
271
|
-
function (_a) {
|
|
272
|
-
var type = _a.type, value = _a.value;
|
|
273
|
-
if (type === 'group') {
|
|
274
|
-
_this.toggleRowExpansion(value);
|
|
275
|
-
}
|
|
276
|
-
if (type === 'all') {
|
|
277
|
-
_this.toggleAllRows(value);
|
|
278
|
-
}
|
|
279
|
-
// Refresh rows after toggle
|
|
280
|
-
// Fixes #883
|
|
281
|
-
_this.updateIndexes();
|
|
282
|
-
_this.updateRows();
|
|
283
|
-
_this.cd.markForCheck();
|
|
284
|
-
}));
|
|
285
|
-
}
|
|
286
|
-
};
|
|
287
|
-
/**
|
|
288
|
-
* Called once, before the instance is destroyed.
|
|
289
|
-
*/
|
|
290
|
-
/**
|
|
291
|
-
* Called once, before the instance is destroyed.
|
|
292
|
-
* @return {?}
|
|
293
|
-
*/
|
|
294
|
-
DataTableBodyComponent.prototype.ngOnDestroy = /**
|
|
295
|
-
* Called once, before the instance is destroyed.
|
|
296
|
-
* @return {?}
|
|
297
|
-
*/
|
|
298
|
-
function () {
|
|
299
|
-
if (this.rowDetail || this.groupHeader) {
|
|
300
|
-
this.listener.unsubscribe();
|
|
301
|
-
}
|
|
302
|
-
};
|
|
303
|
-
/**
|
|
304
|
-
* Updates the Y offset given a new offset.
|
|
305
|
-
*/
|
|
306
|
-
/**
|
|
307
|
-
* Updates the Y offset given a new offset.
|
|
308
|
-
* @param {?=} offset
|
|
309
|
-
* @return {?}
|
|
310
|
-
*/
|
|
311
|
-
DataTableBodyComponent.prototype.updateOffsetY = /**
|
|
312
|
-
* Updates the Y offset given a new offset.
|
|
313
|
-
* @param {?=} offset
|
|
314
|
-
* @return {?}
|
|
315
|
-
*/
|
|
316
|
-
function (offset) {
|
|
317
|
-
// scroller is missing on empty table
|
|
318
|
-
if (!this.scroller) {
|
|
319
|
-
return;
|
|
320
|
-
}
|
|
321
|
-
if (this.scrollbarV && this.virtualization && offset) {
|
|
322
|
-
// First get the row Index that we need to move to.
|
|
323
|
-
/** @type {?} */
|
|
324
|
-
var rowIndex = this.pageSize * offset;
|
|
325
|
-
offset = this.rowHeightsCache.query(rowIndex - 1);
|
|
326
|
-
}
|
|
327
|
-
else if (this.scrollbarV && !this.virtualization) {
|
|
328
|
-
offset = 0;
|
|
329
|
-
}
|
|
330
|
-
this.scroller.setOffset(offset || 0);
|
|
331
|
-
};
|
|
332
|
-
/**
|
|
333
|
-
* Body was scrolled, this is mainly useful for
|
|
334
|
-
* when a user is server-side pagination via virtual scroll.
|
|
335
|
-
*/
|
|
336
|
-
/**
|
|
337
|
-
* Body was scrolled, this is mainly useful for
|
|
338
|
-
* when a user is server-side pagination via virtual scroll.
|
|
339
|
-
* @param {?} event
|
|
340
|
-
* @return {?}
|
|
341
|
-
*/
|
|
342
|
-
DataTableBodyComponent.prototype.onBodyScroll = /**
|
|
343
|
-
* Body was scrolled, this is mainly useful for
|
|
344
|
-
* when a user is server-side pagination via virtual scroll.
|
|
345
|
-
* @param {?} event
|
|
346
|
-
* @return {?}
|
|
347
|
-
*/
|
|
348
|
-
function (event) {
|
|
349
|
-
/** @type {?} */
|
|
350
|
-
var scrollYPos = event.scrollYPos;
|
|
351
|
-
/** @type {?} */
|
|
352
|
-
var scrollXPos = event.scrollXPos;
|
|
353
|
-
// if scroll change, trigger update
|
|
354
|
-
// this is mainly used for header cell positions
|
|
355
|
-
if (this.offsetY !== scrollYPos || this.offsetX !== scrollXPos) {
|
|
356
|
-
this.scroll.emit({
|
|
357
|
-
offsetY: scrollYPos,
|
|
358
|
-
offsetX: scrollXPos
|
|
359
|
-
});
|
|
360
|
-
}
|
|
361
|
-
this.offsetY = scrollYPos;
|
|
362
|
-
this.offsetX = scrollXPos;
|
|
363
|
-
this.updateIndexes();
|
|
364
|
-
this.updatePage(event.direction);
|
|
365
|
-
this.updateRows();
|
|
366
|
-
};
|
|
367
|
-
/**
|
|
368
|
-
* Updates the page given a direction.
|
|
369
|
-
*/
|
|
370
|
-
/**
|
|
371
|
-
* Updates the page given a direction.
|
|
372
|
-
* @param {?} direction
|
|
373
|
-
* @return {?}
|
|
374
|
-
*/
|
|
375
|
-
DataTableBodyComponent.prototype.updatePage = /**
|
|
376
|
-
* Updates the page given a direction.
|
|
377
|
-
* @param {?} direction
|
|
378
|
-
* @return {?}
|
|
379
|
-
*/
|
|
380
|
-
function (direction) {
|
|
381
|
-
/** @type {?} */
|
|
382
|
-
var offset = this.indexes.first / this.pageSize;
|
|
383
|
-
if (direction === 'up') {
|
|
384
|
-
offset = Math.ceil(offset);
|
|
385
|
-
}
|
|
386
|
-
else if (direction === 'down') {
|
|
387
|
-
offset = Math.floor(offset);
|
|
388
|
-
}
|
|
389
|
-
if (direction !== undefined && !isNaN(offset)) {
|
|
390
|
-
this.page.emit({ offset: offset });
|
|
391
|
-
}
|
|
392
|
-
};
|
|
393
|
-
/**
|
|
394
|
-
* Updates the rows in the view port
|
|
395
|
-
*/
|
|
396
|
-
/**
|
|
397
|
-
* Updates the rows in the view port
|
|
398
|
-
* @return {?}
|
|
399
|
-
*/
|
|
400
|
-
DataTableBodyComponent.prototype.updateRows = /**
|
|
401
|
-
* Updates the rows in the view port
|
|
402
|
-
* @return {?}
|
|
403
|
-
*/
|
|
404
|
-
function () {
|
|
405
|
-
var _a = this.indexes, first = _a.first, last = _a.last;
|
|
406
|
-
/** @type {?} */
|
|
407
|
-
var rowIndex = first;
|
|
408
|
-
/** @type {?} */
|
|
409
|
-
var idx = 0;
|
|
410
|
-
/** @type {?} */
|
|
411
|
-
var temp = [];
|
|
412
|
-
this.rowIndexes.clear();
|
|
413
|
-
// if grouprowsby has been specified treat row paging
|
|
414
|
-
// parameters as group paging parameters ie if limit 10 has been
|
|
415
|
-
// specified treat it as 10 groups rather than 10 rows
|
|
416
|
-
if (this.groupedRows) {
|
|
417
|
-
/** @type {?} */
|
|
418
|
-
var maxRowsPerGroup = 3;
|
|
419
|
-
// if there is only one group set the maximum number of
|
|
420
|
-
// rows per group the same as the total number of rows
|
|
421
|
-
if (this.groupedRows.length === 1) {
|
|
422
|
-
maxRowsPerGroup = this.groupedRows[0].value.length;
|
|
423
|
-
}
|
|
424
|
-
while (rowIndex < last && rowIndex < this.groupedRows.length) {
|
|
425
|
-
// Add the groups into this page
|
|
426
|
-
/** @type {?} */
|
|
427
|
-
var group = this.groupedRows[rowIndex];
|
|
428
|
-
temp[idx] = group;
|
|
429
|
-
idx++;
|
|
430
|
-
// Group index in this context
|
|
431
|
-
rowIndex++;
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
else {
|
|
435
|
-
while (rowIndex < last && rowIndex < this.rowCount) {
|
|
436
|
-
/** @type {?} */
|
|
437
|
-
var row = this.rows[rowIndex];
|
|
438
|
-
if (row) {
|
|
439
|
-
this.rowIndexes.set(row, rowIndex);
|
|
440
|
-
temp[idx] = row;
|
|
441
|
-
}
|
|
442
|
-
idx++;
|
|
443
|
-
rowIndex++;
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
this.temp = temp;
|
|
447
|
-
};
|
|
448
|
-
/**
|
|
449
|
-
* Get the row height
|
|
450
|
-
*/
|
|
451
|
-
/**
|
|
452
|
-
* Get the row height
|
|
453
|
-
* @param {?} row
|
|
454
|
-
* @return {?}
|
|
455
|
-
*/
|
|
456
|
-
DataTableBodyComponent.prototype.getRowHeight = /**
|
|
457
|
-
* Get the row height
|
|
458
|
-
* @param {?} row
|
|
459
|
-
* @return {?}
|
|
460
|
-
*/
|
|
461
|
-
function (row) {
|
|
462
|
-
// if its a function return it
|
|
463
|
-
if (typeof this.rowHeight === 'function') {
|
|
464
|
-
return this.rowHeight(row);
|
|
465
|
-
}
|
|
466
|
-
return (/** @type {?} */ (this.rowHeight));
|
|
467
|
-
};
|
|
468
|
-
/**
|
|
469
|
-
* @param group the group with all rows
|
|
470
|
-
*/
|
|
471
|
-
/**
|
|
472
|
-
* @param {?} group the group with all rows
|
|
473
|
-
* @return {?}
|
|
474
|
-
*/
|
|
475
|
-
DataTableBodyComponent.prototype.getGroupHeight = /**
|
|
476
|
-
* @param {?} group the group with all rows
|
|
477
|
-
* @return {?}
|
|
478
|
-
*/
|
|
479
|
-
function (group) {
|
|
480
|
-
/** @type {?} */
|
|
481
|
-
var rowHeight = 0;
|
|
482
|
-
if (group.value) {
|
|
483
|
-
for (var index = 0; index < group.value.length; index++) {
|
|
484
|
-
rowHeight += this.getRowAndDetailHeight(group.value[index]);
|
|
485
|
-
}
|
|
486
|
-
}
|
|
487
|
-
return rowHeight;
|
|
488
|
-
};
|
|
489
|
-
/**
|
|
490
|
-
* Calculate row height based on the expanded state of the row.
|
|
491
|
-
*/
|
|
492
|
-
/**
|
|
493
|
-
* Calculate row height based on the expanded state of the row.
|
|
494
|
-
* @param {?} row
|
|
495
|
-
* @return {?}
|
|
496
|
-
*/
|
|
497
|
-
DataTableBodyComponent.prototype.getRowAndDetailHeight = /**
|
|
498
|
-
* Calculate row height based on the expanded state of the row.
|
|
499
|
-
* @param {?} row
|
|
500
|
-
* @return {?}
|
|
501
|
-
*/
|
|
502
|
-
function (row) {
|
|
503
|
-
/** @type {?} */
|
|
504
|
-
var rowHeight = this.getRowHeight(row);
|
|
505
|
-
/** @type {?} */
|
|
506
|
-
var expanded = this.rowExpansions.get(row);
|
|
507
|
-
// Adding detail row height if its expanded.
|
|
508
|
-
if (expanded === 1) {
|
|
509
|
-
rowHeight += this.getDetailRowHeight(row);
|
|
510
|
-
}
|
|
511
|
-
return rowHeight;
|
|
512
|
-
};
|
|
513
|
-
/**
|
|
514
|
-
* Calculates the styles for the row so that the rows can be moved in 2D space
|
|
515
|
-
* during virtual scroll inside the DOM. In the below case the Y position is
|
|
516
|
-
* manipulated. As an example, if the height of row 0 is 30 px and row 1 is
|
|
517
|
-
* 100 px then following styles are generated:
|
|
518
|
-
*
|
|
519
|
-
* transform: translate3d(0px, 0px, 0px); -> row0
|
|
520
|
-
* transform: translate3d(0px, 30px, 0px); -> row1
|
|
521
|
-
* transform: translate3d(0px, 130px, 0px); -> row2
|
|
522
|
-
*
|
|
523
|
-
* Row heights have to be calculated based on the row heights cache as we wont
|
|
524
|
-
* be able to determine which row is of what height before hand. In the above
|
|
525
|
-
* case the positionY of the translate3d for row2 would be the sum of all the
|
|
526
|
-
* heights of the rows before it (i.e. row0 and row1).
|
|
527
|
-
*
|
|
528
|
-
* @param rows the row that needs to be placed in the 2D space.
|
|
529
|
-
* @returns the CSS3 style to be applied
|
|
530
|
-
*
|
|
531
|
-
* @memberOf DataTableBodyComponent
|
|
532
|
-
*/
|
|
533
|
-
/**
|
|
534
|
-
* Calculates the styles for the row so that the rows can be moved in 2D space
|
|
535
|
-
* during virtual scroll inside the DOM. In the below case the Y position is
|
|
536
|
-
* manipulated. As an example, if the height of row 0 is 30 px and row 1 is
|
|
537
|
-
* 100 px then following styles are generated:
|
|
538
|
-
*
|
|
539
|
-
* transform: translate3d(0px, 0px, 0px); -> row0
|
|
540
|
-
* transform: translate3d(0px, 30px, 0px); -> row1
|
|
541
|
-
* transform: translate3d(0px, 130px, 0px); -> row2
|
|
542
|
-
*
|
|
543
|
-
* Row heights have to be calculated based on the row heights cache as we wont
|
|
544
|
-
* be able to determine which row is of what height before hand. In the above
|
|
545
|
-
* case the positionY of the translate3d for row2 would be the sum of all the
|
|
546
|
-
* heights of the rows before it (i.e. row0 and row1).
|
|
547
|
-
*
|
|
548
|
-
* \@memberOf DataTableBodyComponent
|
|
549
|
-
* @param {?} rows the row that needs to be placed in the 2D space.
|
|
550
|
-
* @return {?} the CSS3 style to be applied
|
|
551
|
-
*
|
|
552
|
-
*/
|
|
553
|
-
DataTableBodyComponent.prototype.getRowsStyles = /**
|
|
554
|
-
* Calculates the styles for the row so that the rows can be moved in 2D space
|
|
555
|
-
* during virtual scroll inside the DOM. In the below case the Y position is
|
|
556
|
-
* manipulated. As an example, if the height of row 0 is 30 px and row 1 is
|
|
557
|
-
* 100 px then following styles are generated:
|
|
558
|
-
*
|
|
559
|
-
* transform: translate3d(0px, 0px, 0px); -> row0
|
|
560
|
-
* transform: translate3d(0px, 30px, 0px); -> row1
|
|
561
|
-
* transform: translate3d(0px, 130px, 0px); -> row2
|
|
562
|
-
*
|
|
563
|
-
* Row heights have to be calculated based on the row heights cache as we wont
|
|
564
|
-
* be able to determine which row is of what height before hand. In the above
|
|
565
|
-
* case the positionY of the translate3d for row2 would be the sum of all the
|
|
566
|
-
* heights of the rows before it (i.e. row0 and row1).
|
|
567
|
-
*
|
|
568
|
-
* \@memberOf DataTableBodyComponent
|
|
569
|
-
* @param {?} rows the row that needs to be placed in the 2D space.
|
|
570
|
-
* @return {?} the CSS3 style to be applied
|
|
571
|
-
*
|
|
572
|
-
*/
|
|
573
|
-
function (rows) {
|
|
574
|
-
/** @type {?} */
|
|
575
|
-
var styles = {};
|
|
576
|
-
// only add styles for the group if there is a group
|
|
577
|
-
if (this.groupedRows) {
|
|
578
|
-
styles.width = this.columnGroupWidths.total;
|
|
579
|
-
}
|
|
580
|
-
if (this.scrollbarV && this.virtualization) {
|
|
581
|
-
/** @type {?} */
|
|
582
|
-
var idx = 0;
|
|
583
|
-
if (this.groupedRows) {
|
|
584
|
-
// Get the latest row rowindex in a group
|
|
585
|
-
/** @type {?} */
|
|
586
|
-
var row = rows[rows.length - 1];
|
|
587
|
-
idx = row ? this.getRowIndex(row) : 0;
|
|
588
|
-
}
|
|
589
|
-
else {
|
|
590
|
-
idx = this.getRowIndex(rows);
|
|
591
|
-
}
|
|
592
|
-
// const pos = idx * rowHeight;
|
|
593
|
-
// The position of this row would be the sum of all row heights
|
|
594
|
-
// until the previous row position.
|
|
595
|
-
/** @type {?} */
|
|
596
|
-
var pos = this.rowHeightsCache.query(idx - 1);
|
|
597
|
-
translateXY(styles, 0, pos);
|
|
598
|
-
}
|
|
599
|
-
return styles;
|
|
600
|
-
};
|
|
601
|
-
/**
|
|
602
|
-
* Calculate bottom summary row offset for scrollbar mode.
|
|
603
|
-
* For more information about cache and offset calculation
|
|
604
|
-
* see description for `getRowsStyles` method
|
|
605
|
-
*
|
|
606
|
-
* @returns the CSS3 style to be applied
|
|
607
|
-
*
|
|
608
|
-
* @memberOf DataTableBodyComponent
|
|
609
|
-
*/
|
|
610
|
-
/**
|
|
611
|
-
* Calculate bottom summary row offset for scrollbar mode.
|
|
612
|
-
* For more information about cache and offset calculation
|
|
613
|
-
* see description for `getRowsStyles` method
|
|
614
|
-
*
|
|
615
|
-
* \@memberOf DataTableBodyComponent
|
|
616
|
-
* @return {?} the CSS3 style to be applied
|
|
617
|
-
*
|
|
618
|
-
*/
|
|
619
|
-
DataTableBodyComponent.prototype.getBottomSummaryRowStyles = /**
|
|
620
|
-
* Calculate bottom summary row offset for scrollbar mode.
|
|
621
|
-
* For more information about cache and offset calculation
|
|
622
|
-
* see description for `getRowsStyles` method
|
|
623
|
-
*
|
|
624
|
-
* \@memberOf DataTableBodyComponent
|
|
625
|
-
* @return {?} the CSS3 style to be applied
|
|
626
|
-
*
|
|
627
|
-
*/
|
|
628
|
-
function () {
|
|
629
|
-
if (!this.scrollbarV || !this.rows || !this.rows.length) {
|
|
630
|
-
return null;
|
|
631
|
-
}
|
|
632
|
-
/** @type {?} */
|
|
633
|
-
var styles = { position: 'absolute' };
|
|
634
|
-
/** @type {?} */
|
|
635
|
-
var pos = this.rowHeightsCache.query(this.rows.length - 1);
|
|
636
|
-
translateXY(styles, 0, pos);
|
|
637
|
-
return styles;
|
|
638
|
-
};
|
|
639
|
-
/**
|
|
640
|
-
* Hides the loading indicator
|
|
641
|
-
*/
|
|
642
|
-
/**
|
|
643
|
-
* Hides the loading indicator
|
|
644
|
-
* @return {?}
|
|
645
|
-
*/
|
|
646
|
-
DataTableBodyComponent.prototype.hideIndicator = /**
|
|
647
|
-
* Hides the loading indicator
|
|
648
|
-
* @return {?}
|
|
649
|
-
*/
|
|
650
|
-
function () {
|
|
651
|
-
var _this = this;
|
|
652
|
-
setTimeout((/**
|
|
653
|
-
* @return {?}
|
|
654
|
-
*/
|
|
655
|
-
function () { return (_this.loadingIndicator = false); }), 500);
|
|
656
|
-
};
|
|
657
|
-
/**
|
|
658
|
-
* Updates the index of the rows in the viewport
|
|
659
|
-
*/
|
|
660
|
-
/**
|
|
661
|
-
* Updates the index of the rows in the viewport
|
|
662
|
-
* @return {?}
|
|
663
|
-
*/
|
|
664
|
-
DataTableBodyComponent.prototype.updateIndexes = /**
|
|
665
|
-
* Updates the index of the rows in the viewport
|
|
666
|
-
* @return {?}
|
|
667
|
-
*/
|
|
668
|
-
function () {
|
|
669
|
-
/** @type {?} */
|
|
670
|
-
var first = 0;
|
|
671
|
-
/** @type {?} */
|
|
672
|
-
var last = 0;
|
|
673
|
-
if (this.scrollbarV) {
|
|
674
|
-
if (this.virtualization) {
|
|
675
|
-
// Calculation of the first and last indexes will be based on where the
|
|
676
|
-
// scrollY position would be at. The last index would be the one
|
|
677
|
-
// that shows up inside the view port the last.
|
|
678
|
-
/** @type {?} */
|
|
679
|
-
var height = parseInt(this.bodyHeight, 0);
|
|
680
|
-
first = this.rowHeightsCache.getRowIndex(this.offsetY);
|
|
681
|
-
last = this.rowHeightsCache.getRowIndex(height + this.offsetY) + 1;
|
|
682
|
-
}
|
|
683
|
-
else {
|
|
684
|
-
// If virtual rows are not needed
|
|
685
|
-
// We render all in one go
|
|
686
|
-
first = 0;
|
|
687
|
-
last = this.rowCount;
|
|
688
|
-
}
|
|
689
|
-
}
|
|
690
|
-
else {
|
|
691
|
-
// The server is handling paging and will pass an array that begins with the
|
|
692
|
-
// element at a specified offset. first should always be 0 with external paging.
|
|
693
|
-
if (!this.externalPaging) {
|
|
694
|
-
first = Math.max(this.offset * this.pageSize, 0);
|
|
695
|
-
}
|
|
696
|
-
last = Math.min(first + this.pageSize, this.rowCount);
|
|
697
|
-
}
|
|
698
|
-
this.indexes = { first: first, last: last };
|
|
699
|
-
};
|
|
700
|
-
/**
|
|
701
|
-
* Refreshes the full Row Height cache. Should be used
|
|
702
|
-
* when the entire row array state has changed.
|
|
703
|
-
*/
|
|
704
|
-
/**
|
|
705
|
-
* Refreshes the full Row Height cache. Should be used
|
|
706
|
-
* when the entire row array state has changed.
|
|
707
|
-
* @return {?}
|
|
708
|
-
*/
|
|
709
|
-
DataTableBodyComponent.prototype.refreshRowHeightCache = /**
|
|
710
|
-
* Refreshes the full Row Height cache. Should be used
|
|
711
|
-
* when the entire row array state has changed.
|
|
712
|
-
* @return {?}
|
|
713
|
-
*/
|
|
714
|
-
function () {
|
|
715
|
-
if (!this.scrollbarV || (this.scrollbarV && !this.virtualization)) {
|
|
716
|
-
return;
|
|
717
|
-
}
|
|
718
|
-
// clear the previous row height cache if already present.
|
|
719
|
-
// this is useful during sorts, filters where the state of the
|
|
720
|
-
// rows array is changed.
|
|
721
|
-
this.rowHeightsCache.clearCache();
|
|
722
|
-
// Initialize the tree only if there are rows inside the tree.
|
|
723
|
-
if (this.rows && this.rows.length) {
|
|
724
|
-
this.rowHeightsCache.initCache({
|
|
725
|
-
rows: this.rows,
|
|
726
|
-
rowHeight: this.rowHeight,
|
|
727
|
-
detailRowHeight: this.getDetailRowHeight,
|
|
728
|
-
externalVirtual: this.scrollbarV && this.externalPaging,
|
|
729
|
-
rowCount: this.rowCount,
|
|
730
|
-
rowIndexes: this.rowIndexes,
|
|
731
|
-
rowExpansions: this.rowExpansions
|
|
732
|
-
});
|
|
733
|
-
}
|
|
734
|
-
};
|
|
735
|
-
/**
|
|
736
|
-
* Gets the index for the view port
|
|
737
|
-
*/
|
|
738
|
-
/**
|
|
739
|
-
* Gets the index for the view port
|
|
740
|
-
* @return {?}
|
|
741
|
-
*/
|
|
742
|
-
DataTableBodyComponent.prototype.getAdjustedViewPortIndex = /**
|
|
743
|
-
* Gets the index for the view port
|
|
744
|
-
* @return {?}
|
|
745
|
-
*/
|
|
746
|
-
function () {
|
|
747
|
-
// Capture the row index of the first row that is visible on the viewport.
|
|
748
|
-
// If the scroll bar is just below the row which is highlighted then make that as the
|
|
749
|
-
// first index.
|
|
750
|
-
/** @type {?} */
|
|
751
|
-
var viewPortFirstRowIndex = this.indexes.first;
|
|
752
|
-
if (this.scrollbarV && this.virtualization) {
|
|
753
|
-
/** @type {?} */
|
|
754
|
-
var offsetScroll = this.rowHeightsCache.query(viewPortFirstRowIndex - 1);
|
|
755
|
-
return offsetScroll <= this.offsetY ? viewPortFirstRowIndex - 1 : viewPortFirstRowIndex;
|
|
756
|
-
}
|
|
757
|
-
return viewPortFirstRowIndex;
|
|
758
|
-
};
|
|
759
|
-
/**
|
|
760
|
-
* Toggle the Expansion of the row i.e. if the row is expanded then it will
|
|
761
|
-
* collapse and vice versa. Note that the expanded status is stored as
|
|
762
|
-
* a part of the row object itself as we have to preserve the expanded row
|
|
763
|
-
* status in case of sorting and filtering of the row set.
|
|
764
|
-
*/
|
|
765
|
-
/**
|
|
766
|
-
* Toggle the Expansion of the row i.e. if the row is expanded then it will
|
|
767
|
-
* collapse and vice versa. Note that the expanded status is stored as
|
|
768
|
-
* a part of the row object itself as we have to preserve the expanded row
|
|
769
|
-
* status in case of sorting and filtering of the row set.
|
|
770
|
-
* @param {?} row
|
|
771
|
-
* @return {?}
|
|
772
|
-
*/
|
|
773
|
-
DataTableBodyComponent.prototype.toggleRowExpansion = /**
|
|
774
|
-
* Toggle the Expansion of the row i.e. if the row is expanded then it will
|
|
775
|
-
* collapse and vice versa. Note that the expanded status is stored as
|
|
776
|
-
* a part of the row object itself as we have to preserve the expanded row
|
|
777
|
-
* status in case of sorting and filtering of the row set.
|
|
778
|
-
* @param {?} row
|
|
779
|
-
* @return {?}
|
|
780
|
-
*/
|
|
781
|
-
function (row) {
|
|
782
|
-
// Capture the row index of the first row that is visible on the viewport.
|
|
783
|
-
/** @type {?} */
|
|
784
|
-
var viewPortFirstRowIndex = this.getAdjustedViewPortIndex();
|
|
785
|
-
/** @type {?} */
|
|
786
|
-
var expanded = this.rowExpansions.get(row);
|
|
787
|
-
// If the detailRowHeight is auto --> only in case of non-virtualized scroll
|
|
788
|
-
if (this.scrollbarV && this.virtualization) {
|
|
789
|
-
/** @type {?} */
|
|
790
|
-
var detailRowHeight = this.getDetailRowHeight(row) * (expanded ? -1 : 1);
|
|
791
|
-
// const idx = this.rowIndexes.get(row) || 0;
|
|
792
|
-
/** @type {?} */
|
|
793
|
-
var idx = this.getRowIndex(row);
|
|
794
|
-
this.rowHeightsCache.update(idx, detailRowHeight);
|
|
795
|
-
}
|
|
796
|
-
// Update the toggled row and update thive nevere heights in the cache.
|
|
797
|
-
expanded = expanded ^= 1;
|
|
798
|
-
this.rowExpansions.set(row, expanded);
|
|
799
|
-
this.detailToggle.emit({
|
|
800
|
-
rows: [row],
|
|
801
|
-
currentIndex: viewPortFirstRowIndex
|
|
802
|
-
});
|
|
803
|
-
};
|
|
804
|
-
/**
|
|
805
|
-
* Expand/Collapse all the rows no matter what their state is.
|
|
806
|
-
*/
|
|
807
|
-
/**
|
|
808
|
-
* Expand/Collapse all the rows no matter what their state is.
|
|
809
|
-
* @param {?} expanded
|
|
810
|
-
* @return {?}
|
|
811
|
-
*/
|
|
812
|
-
DataTableBodyComponent.prototype.toggleAllRows = /**
|
|
813
|
-
* Expand/Collapse all the rows no matter what their state is.
|
|
814
|
-
* @param {?} expanded
|
|
815
|
-
* @return {?}
|
|
816
|
-
*/
|
|
817
|
-
function (expanded) {
|
|
818
|
-
var e_1, _a;
|
|
819
|
-
// clear prev expansions
|
|
820
|
-
this.rowExpansions.clear();
|
|
821
|
-
/** @type {?} */
|
|
822
|
-
var rowExpanded = expanded ? 1 : 0;
|
|
823
|
-
// Capture the row index of the first row that is visible on the viewport.
|
|
824
|
-
/** @type {?} */
|
|
825
|
-
var viewPortFirstRowIndex = this.getAdjustedViewPortIndex();
|
|
826
|
-
try {
|
|
827
|
-
for (var _b = tslib_1.__values(this.rows), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
828
|
-
var row = _c.value;
|
|
829
|
-
this.rowExpansions.set(row, rowExpanded);
|
|
830
|
-
}
|
|
831
|
-
}
|
|
832
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
833
|
-
finally {
|
|
834
|
-
try {
|
|
835
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
836
|
-
}
|
|
837
|
-
finally { if (e_1) throw e_1.error; }
|
|
838
|
-
}
|
|
839
|
-
if (this.scrollbarV) {
|
|
840
|
-
// Refresh the full row heights cache since every row was affected.
|
|
841
|
-
this.recalcLayout();
|
|
842
|
-
}
|
|
843
|
-
// Emit all rows that have been expanded.
|
|
844
|
-
this.detailToggle.emit({
|
|
845
|
-
rows: this.rows,
|
|
846
|
-
currentIndex: viewPortFirstRowIndex
|
|
847
|
-
});
|
|
848
|
-
};
|
|
849
|
-
/**
|
|
850
|
-
* Recalculates the table
|
|
851
|
-
*/
|
|
852
|
-
/**
|
|
853
|
-
* Recalculates the table
|
|
854
|
-
* @return {?}
|
|
855
|
-
*/
|
|
856
|
-
DataTableBodyComponent.prototype.recalcLayout = /**
|
|
857
|
-
* Recalculates the table
|
|
858
|
-
* @return {?}
|
|
859
|
-
*/
|
|
860
|
-
function () {
|
|
861
|
-
this.refreshRowHeightCache();
|
|
862
|
-
this.updateIndexes();
|
|
863
|
-
this.updateRows();
|
|
864
|
-
};
|
|
865
|
-
/**
|
|
866
|
-
* Tracks the column
|
|
867
|
-
*/
|
|
868
|
-
/**
|
|
869
|
-
* Tracks the column
|
|
870
|
-
* @param {?} index
|
|
871
|
-
* @param {?} column
|
|
872
|
-
* @return {?}
|
|
873
|
-
*/
|
|
874
|
-
DataTableBodyComponent.prototype.columnTrackingFn = /**
|
|
875
|
-
* Tracks the column
|
|
876
|
-
* @param {?} index
|
|
877
|
-
* @param {?} column
|
|
878
|
-
* @return {?}
|
|
879
|
-
*/
|
|
880
|
-
function (index, column) {
|
|
881
|
-
return column.$$id;
|
|
882
|
-
};
|
|
883
|
-
/**
|
|
884
|
-
* Gets the row pinning group styles
|
|
885
|
-
*/
|
|
886
|
-
/**
|
|
887
|
-
* Gets the row pinning group styles
|
|
888
|
-
* @param {?} group
|
|
889
|
-
* @return {?}
|
|
890
|
-
*/
|
|
891
|
-
DataTableBodyComponent.prototype.stylesByGroup = /**
|
|
892
|
-
* Gets the row pinning group styles
|
|
893
|
-
* @param {?} group
|
|
894
|
-
* @return {?}
|
|
895
|
-
*/
|
|
896
|
-
function (group) {
|
|
897
|
-
/** @type {?} */
|
|
898
|
-
var widths = this.columnGroupWidths;
|
|
899
|
-
/** @type {?} */
|
|
900
|
-
var offsetX = this.offsetX;
|
|
901
|
-
/** @type {?} */
|
|
902
|
-
var styles = {
|
|
903
|
-
width: widths[group] + "px"
|
|
904
|
-
};
|
|
905
|
-
if (group === 'left') {
|
|
906
|
-
translateXY(styles, offsetX, 0);
|
|
907
|
-
}
|
|
908
|
-
else if (group === 'right') {
|
|
909
|
-
/** @type {?} */
|
|
910
|
-
var bodyWidth = parseInt(this.innerWidth + '', 0);
|
|
911
|
-
/** @type {?} */
|
|
912
|
-
var totalDiff = widths.total - bodyWidth;
|
|
913
|
-
/** @type {?} */
|
|
914
|
-
var offsetDiff = totalDiff - offsetX;
|
|
915
|
-
/** @type {?} */
|
|
916
|
-
var offset = offsetDiff * -1;
|
|
917
|
-
translateXY(styles, offset, 0);
|
|
918
|
-
}
|
|
919
|
-
return styles;
|
|
920
|
-
};
|
|
921
|
-
/**
|
|
922
|
-
* Returns if the row was expanded and set default row expansion when row expansion is empty
|
|
923
|
-
*/
|
|
924
|
-
/**
|
|
925
|
-
* Returns if the row was expanded and set default row expansion when row expansion is empty
|
|
926
|
-
* @param {?} row
|
|
927
|
-
* @return {?}
|
|
928
|
-
*/
|
|
929
|
-
DataTableBodyComponent.prototype.getRowExpanded = /**
|
|
930
|
-
* Returns if the row was expanded and set default row expansion when row expansion is empty
|
|
931
|
-
* @param {?} row
|
|
932
|
-
* @return {?}
|
|
933
|
-
*/
|
|
934
|
-
function (row) {
|
|
935
|
-
var e_2, _a;
|
|
936
|
-
if (this.rowExpansions.size === 0 && this.groupExpansionDefault) {
|
|
937
|
-
try {
|
|
938
|
-
for (var _b = tslib_1.__values(this.groupedRows), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
939
|
-
var group = _c.value;
|
|
940
|
-
this.rowExpansions.set(group, 1);
|
|
941
|
-
}
|
|
942
|
-
}
|
|
943
|
-
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
944
|
-
finally {
|
|
945
|
-
try {
|
|
946
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
947
|
-
}
|
|
948
|
-
finally { if (e_2) throw e_2.error; }
|
|
949
|
-
}
|
|
950
|
-
}
|
|
951
|
-
/** @type {?} */
|
|
952
|
-
var expanded = this.rowExpansions.get(row);
|
|
953
|
-
return expanded === 1;
|
|
954
|
-
};
|
|
955
|
-
/**
|
|
956
|
-
* Gets the row index given a row
|
|
957
|
-
*/
|
|
958
|
-
/**
|
|
959
|
-
* Gets the row index given a row
|
|
960
|
-
* @param {?} row
|
|
961
|
-
* @return {?}
|
|
962
|
-
*/
|
|
963
|
-
DataTableBodyComponent.prototype.getRowIndex = /**
|
|
964
|
-
* Gets the row index given a row
|
|
965
|
-
* @param {?} row
|
|
966
|
-
* @return {?}
|
|
967
|
-
*/
|
|
968
|
-
function (row) {
|
|
969
|
-
return this.rowIndexes.get(row) || 0;
|
|
970
|
-
};
|
|
971
|
-
/**
|
|
972
|
-
* @param {?} row
|
|
973
|
-
* @return {?}
|
|
974
|
-
*/
|
|
975
|
-
DataTableBodyComponent.prototype.onTreeAction = /**
|
|
976
|
-
* @param {?} row
|
|
977
|
-
* @return {?}
|
|
978
|
-
*/
|
|
979
|
-
function (row) {
|
|
980
|
-
this.treeAction.emit({ row: row });
|
|
981
|
-
};
|
|
982
|
-
DataTableBodyComponent.decorators = [
|
|
983
|
-
{ type: Component, args: [{
|
|
984
|
-
selector: 'datatable-body',
|
|
985
|
-
template: "\n <datatable-selection\n #selector\n [selected]=\"selected\"\n [rows]=\"rows\"\n [selectCheck]=\"selectCheck\"\n [selectEnabled]=\"selectEnabled\"\n [selectionType]=\"selectionType\"\n [rowIdentity]=\"rowIdentity\"\n (select)=\"select.emit($event)\"\n (activate)=\"activate.emit($event)\"\n >\n <datatable-progress *ngIf=\"loadingIndicator\"> </datatable-progress>\n <datatable-scroller\n *ngIf=\"rows?.length\"\n [scrollbarV]=\"scrollbarV\"\n [scrollbarH]=\"scrollbarH\"\n [scrollHeight]=\"scrollHeight\"\n [scrollWidth]=\"columnGroupWidths?.total\"\n (scroll)=\"onBodyScroll($event)\"\n >\n <datatable-summary-row\n *ngIf=\"summaryRow && summaryPosition === 'top'\"\n [rowHeight]=\"summaryHeight\"\n [offsetX]=\"offsetX\"\n [innerWidth]=\"innerWidth\"\n [rows]=\"rows\"\n [columns]=\"columns\"\n >\n </datatable-summary-row>\n <datatable-row-wrapper\n [groupedRows]=\"groupedRows\"\n *ngFor=\"let group of temp; let i = index; trackBy: rowTrackingFn\"\n [innerWidth]=\"innerWidth\"\n [ngStyle]=\"getRowsStyles(group)\"\n [rowDetail]=\"rowDetail\"\n [groupHeader]=\"groupHeader\"\n [offsetX]=\"offsetX\"\n [detailRowHeight]=\"getDetailRowHeight(group[i], i)\"\n [row]=\"group\"\n [expanded]=\"getRowExpanded(group)\"\n [rowIndex]=\"getRowIndex(group[i])\"\n (rowContextmenu)=\"rowContextmenu.emit($event)\"\n >\n <datatable-body-row\n *ngIf=\"!groupedRows; else groupedRowsTemplate\"\n tabindex=\"-1\"\n [isSelected]=\"selector.getRowSelected(group)\"\n [innerWidth]=\"innerWidth\"\n [offsetX]=\"offsetX\"\n [columns]=\"columns\"\n [rowHeight]=\"getRowHeight(group)\"\n [row]=\"group\"\n [rowIndex]=\"getRowIndex(group)\"\n [expanded]=\"getRowExpanded(group)\"\n [rowClass]=\"rowClass\"\n [displayCheck]=\"displayCheck\"\n [treeStatus]=\"group.treeStatus\"\n (treeAction)=\"onTreeAction(group)\"\n (activate)=\"selector.onActivate($event, indexes.first + i)\"\n >\n </datatable-body-row>\n <ng-template #groupedRowsTemplate>\n <datatable-body-row\n *ngFor=\"let row of group.value; let i = index; trackBy: rowTrackingFn\"\n tabindex=\"-1\"\n [isSelected]=\"selector.getRowSelected(row)\"\n [innerWidth]=\"innerWidth\"\n [offsetX]=\"offsetX\"\n [columns]=\"columns\"\n [rowHeight]=\"getRowHeight(row)\"\n [row]=\"row\"\n [group]=\"group.value\"\n [rowIndex]=\"getRowIndex(row)\"\n [expanded]=\"getRowExpanded(row)\"\n [rowClass]=\"rowClass\"\n (activate)=\"selector.onActivate($event, i)\"\n >\n </datatable-body-row>\n </ng-template>\n </datatable-row-wrapper>\n <datatable-summary-row\n *ngIf=\"summaryRow && summaryPosition === 'bottom'\"\n [ngStyle]=\"getBottomSummaryRowStyles()\"\n [rowHeight]=\"summaryHeight\"\n [offsetX]=\"offsetX\"\n [innerWidth]=\"innerWidth\"\n [rows]=\"rows\"\n [columns]=\"columns\"\n >\n </datatable-summary-row>\n </datatable-scroller>\n <div class=\"empty-row\" *ngIf=\"!rows?.length && !loadingIndicator\" [innerHTML]=\"emptyMessage\"></div>\n </datatable-selection>\n ",
|
|
986
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
987
|
-
host: {
|
|
988
|
-
class: 'datatable-body'
|
|
989
|
-
}
|
|
990
|
-
}] }
|
|
991
|
-
];
|
|
992
|
-
/** @nocollapse */
|
|
993
|
-
DataTableBodyComponent.ctorParameters = function () { return [
|
|
994
|
-
{ type: ChangeDetectorRef }
|
|
995
|
-
]; };
|
|
996
|
-
DataTableBodyComponent.propDecorators = {
|
|
997
|
-
scrollbarV: [{ type: Input }],
|
|
998
|
-
scrollbarH: [{ type: Input }],
|
|
999
|
-
loadingIndicator: [{ type: Input }],
|
|
1000
|
-
externalPaging: [{ type: Input }],
|
|
1001
|
-
rowHeight: [{ type: Input }],
|
|
1002
|
-
offsetX: [{ type: Input }],
|
|
1003
|
-
emptyMessage: [{ type: Input }],
|
|
1004
|
-
selectionType: [{ type: Input }],
|
|
1005
|
-
selected: [{ type: Input }],
|
|
1006
|
-
rowIdentity: [{ type: Input }],
|
|
1007
|
-
rowDetail: [{ type: Input }],
|
|
1008
|
-
groupHeader: [{ type: Input }],
|
|
1009
|
-
selectCheck: [{ type: Input }],
|
|
1010
|
-
displayCheck: [{ type: Input }],
|
|
1011
|
-
trackByProp: [{ type: Input }],
|
|
1012
|
-
rowClass: [{ type: Input }],
|
|
1013
|
-
groupedRows: [{ type: Input }],
|
|
1014
|
-
groupExpansionDefault: [{ type: Input }],
|
|
1015
|
-
innerWidth: [{ type: Input }],
|
|
1016
|
-
groupRowsBy: [{ type: Input }],
|
|
1017
|
-
virtualization: [{ type: Input }],
|
|
1018
|
-
summaryRow: [{ type: Input }],
|
|
1019
|
-
summaryPosition: [{ type: Input }],
|
|
1020
|
-
summaryHeight: [{ type: Input }],
|
|
1021
|
-
pageSize: [{ type: Input }],
|
|
1022
|
-
rows: [{ type: Input }],
|
|
1023
|
-
columns: [{ type: Input }],
|
|
1024
|
-
offset: [{ type: Input }],
|
|
1025
|
-
rowCount: [{ type: Input }],
|
|
1026
|
-
bodyWidth: [{ type: HostBinding, args: ['style.width',] }],
|
|
1027
|
-
bodyHeight: [{ type: Input }, { type: HostBinding, args: ['style.height',] }],
|
|
1028
|
-
scroll: [{ type: Output }],
|
|
1029
|
-
page: [{ type: Output }],
|
|
1030
|
-
activate: [{ type: Output }],
|
|
1031
|
-
select: [{ type: Output }],
|
|
1032
|
-
detailToggle: [{ type: Output }],
|
|
1033
|
-
rowContextmenu: [{ type: Output }],
|
|
1034
|
-
treeAction: [{ type: Output }],
|
|
1035
|
-
scroller: [{ type: ViewChild, args: [ScrollerComponent, { static: false },] }]
|
|
1036
|
-
};
|
|
1037
|
-
return DataTableBodyComponent;
|
|
1038
|
-
}());
|
|
1039
|
-
export { DataTableBodyComponent };
|
|
1040
|
-
if (false) {
|
|
1041
|
-
/** @type {?} */
|
|
1042
|
-
DataTableBodyComponent.prototype.scrollbarV;
|
|
1043
|
-
/** @type {?} */
|
|
1044
|
-
DataTableBodyComponent.prototype.scrollbarH;
|
|
1045
|
-
/** @type {?} */
|
|
1046
|
-
DataTableBodyComponent.prototype.loadingIndicator;
|
|
1047
|
-
/** @type {?} */
|
|
1048
|
-
DataTableBodyComponent.prototype.externalPaging;
|
|
1049
|
-
/** @type {?} */
|
|
1050
|
-
DataTableBodyComponent.prototype.rowHeight;
|
|
1051
|
-
/** @type {?} */
|
|
1052
|
-
DataTableBodyComponent.prototype.offsetX;
|
|
1053
|
-
/** @type {?} */
|
|
1054
|
-
DataTableBodyComponent.prototype.emptyMessage;
|
|
1055
|
-
/** @type {?} */
|
|
1056
|
-
DataTableBodyComponent.prototype.selectionType;
|
|
1057
|
-
/** @type {?} */
|
|
1058
|
-
DataTableBodyComponent.prototype.selected;
|
|
1059
|
-
/** @type {?} */
|
|
1060
|
-
DataTableBodyComponent.prototype.rowIdentity;
|
|
1061
|
-
/** @type {?} */
|
|
1062
|
-
DataTableBodyComponent.prototype.rowDetail;
|
|
1063
|
-
/** @type {?} */
|
|
1064
|
-
DataTableBodyComponent.prototype.groupHeader;
|
|
1065
|
-
/** @type {?} */
|
|
1066
|
-
DataTableBodyComponent.prototype.selectCheck;
|
|
1067
|
-
/** @type {?} */
|
|
1068
|
-
DataTableBodyComponent.prototype.displayCheck;
|
|
1069
|
-
/** @type {?} */
|
|
1070
|
-
DataTableBodyComponent.prototype.trackByProp;
|
|
1071
|
-
/** @type {?} */
|
|
1072
|
-
DataTableBodyComponent.prototype.rowClass;
|
|
1073
|
-
/** @type {?} */
|
|
1074
|
-
DataTableBodyComponent.prototype.groupedRows;
|
|
1075
|
-
/** @type {?} */
|
|
1076
|
-
DataTableBodyComponent.prototype.groupExpansionDefault;
|
|
1077
|
-
/** @type {?} */
|
|
1078
|
-
DataTableBodyComponent.prototype.innerWidth;
|
|
1079
|
-
/** @type {?} */
|
|
1080
|
-
DataTableBodyComponent.prototype.groupRowsBy;
|
|
1081
|
-
/** @type {?} */
|
|
1082
|
-
DataTableBodyComponent.prototype.virtualization;
|
|
1083
|
-
/** @type {?} */
|
|
1084
|
-
DataTableBodyComponent.prototype.summaryRow;
|
|
1085
|
-
/** @type {?} */
|
|
1086
|
-
DataTableBodyComponent.prototype.summaryPosition;
|
|
1087
|
-
/** @type {?} */
|
|
1088
|
-
DataTableBodyComponent.prototype.summaryHeight;
|
|
1089
|
-
/** @type {?} */
|
|
1090
|
-
DataTableBodyComponent.prototype.scroll;
|
|
1091
|
-
/** @type {?} */
|
|
1092
|
-
DataTableBodyComponent.prototype.page;
|
|
1093
|
-
/** @type {?} */
|
|
1094
|
-
DataTableBodyComponent.prototype.activate;
|
|
1095
|
-
/** @type {?} */
|
|
1096
|
-
DataTableBodyComponent.prototype.select;
|
|
1097
|
-
/** @type {?} */
|
|
1098
|
-
DataTableBodyComponent.prototype.detailToggle;
|
|
1099
|
-
/** @type {?} */
|
|
1100
|
-
DataTableBodyComponent.prototype.rowContextmenu;
|
|
1101
|
-
/** @type {?} */
|
|
1102
|
-
DataTableBodyComponent.prototype.treeAction;
|
|
1103
|
-
/** @type {?} */
|
|
1104
|
-
DataTableBodyComponent.prototype.scroller;
|
|
1105
|
-
/** @type {?} */
|
|
1106
|
-
DataTableBodyComponent.prototype.rowHeightsCache;
|
|
1107
|
-
/** @type {?} */
|
|
1108
|
-
DataTableBodyComponent.prototype.temp;
|
|
1109
|
-
/** @type {?} */
|
|
1110
|
-
DataTableBodyComponent.prototype.offsetY;
|
|
1111
|
-
/** @type {?} */
|
|
1112
|
-
DataTableBodyComponent.prototype.indexes;
|
|
1113
|
-
/** @type {?} */
|
|
1114
|
-
DataTableBodyComponent.prototype.columnGroupWidths;
|
|
1115
|
-
/** @type {?} */
|
|
1116
|
-
DataTableBodyComponent.prototype.columnGroupWidthsWithoutGroup;
|
|
1117
|
-
/** @type {?} */
|
|
1118
|
-
DataTableBodyComponent.prototype.rowTrackingFn;
|
|
1119
|
-
/** @type {?} */
|
|
1120
|
-
DataTableBodyComponent.prototype.listener;
|
|
1121
|
-
/** @type {?} */
|
|
1122
|
-
DataTableBodyComponent.prototype.rowIndexes;
|
|
1123
|
-
/** @type {?} */
|
|
1124
|
-
DataTableBodyComponent.prototype.rowExpansions;
|
|
1125
|
-
/** @type {?} */
|
|
1126
|
-
DataTableBodyComponent.prototype._rows;
|
|
1127
|
-
/** @type {?} */
|
|
1128
|
-
DataTableBodyComponent.prototype._bodyHeight;
|
|
1129
|
-
/** @type {?} */
|
|
1130
|
-
DataTableBodyComponent.prototype._columns;
|
|
1131
|
-
/** @type {?} */
|
|
1132
|
-
DataTableBodyComponent.prototype._rowCount;
|
|
1133
|
-
/** @type {?} */
|
|
1134
|
-
DataTableBodyComponent.prototype._offset;
|
|
1135
|
-
/** @type {?} */
|
|
1136
|
-
DataTableBodyComponent.prototype._pageSize;
|
|
1137
|
-
/**
|
|
1138
|
-
* Get the height of the detail row.
|
|
1139
|
-
* @type {?}
|
|
1140
|
-
*/
|
|
1141
|
-
DataTableBodyComponent.prototype.getDetailRowHeight;
|
|
1142
|
-
/**
|
|
1143
|
-
* @type {?}
|
|
1144
|
-
* @private
|
|
1145
|
-
*/
|
|
1146
|
-
DataTableBodyComponent.prototype.cd;
|
|
1147
|
-
}
|
|
1148
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9keS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac3dpbWxhbmUvbmd4LWRhdGF0YWJsZS8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2JvZHkvYm9keS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULE1BQU0sRUFDTixZQUFZLEVBQ1osS0FBSyxFQUNMLFdBQVcsRUFDWCxpQkFBaUIsRUFDakIsU0FBUyxFQUdULHVCQUF1QixFQUN4QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV6RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFcEQ7SUF3UEU7O09BRUc7SUFDSCxnQ0FBb0IsRUFBcUI7UUFBekMsaUJBVUM7UUFWbUIsT0FBRSxHQUFGLEVBQUUsQ0FBbUI7UUE1SWhDLGFBQVEsR0FBVSxFQUFFLENBQUM7UUF5RnBCLFdBQU0sR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMvQyxTQUFJLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDN0MsYUFBUSxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2pELFdBQU0sR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMvQyxpQkFBWSxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3JELG1CQUFjLEdBQUcsSUFBSSxZQUFZLENBQWtDLEtBQUssQ0FBQyxDQUFDO1FBQzFFLGVBQVUsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQXdCN0Qsb0JBQWUsR0FB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Q0FBMkQ7O0lBQzNELHdDQUF5RDs7SUFDekQsOENBQStEOztJQUMvRCxnREFBb0Y7O0lBQ3BGLDRDQUE2RDs7SUFFN0QsMENBQTZFOztJQXNCN0UsaURBQXVEOztJQUN2RCxzQ0FBaUI7O0lBQ2pCLHlDQUFZOztJQUNaLHlDQUFrQjs7SUFDbEIsbURBQXVCOztJQUN2QiwrREFBbUM7O0lBQ25DLCtDQUFtQjs7SUFDbkIsMENBQWM7O0lBQ2QsNENBQTRCOztJQUM1QiwrQ0FBK0I7O0lBRS9CLHVDQUFhOztJQUNiLDZDQUFpQjs7SUFDakIsMENBQWdCOztJQUNoQiwyQ0FBa0I7O0lBQ2xCLHlDQUFnQjs7SUFDaEIsMkNBQWtCOzs7OztJQTRObEIsb0RBTUU7Ozs7O0lBN05VLG9DQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBIb3N0QmluZGluZyxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIFZpZXdDaGlsZCxcbiAgT25Jbml0LFxuICBPbkRlc3Ryb3ksXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU2Nyb2xsZXJDb21wb25lbnQgfSBmcm9tICcuL3Njcm9sbGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNb3VzZUV2ZW50IH0gZnJvbSAnLi4vLi4vZXZlbnRzJztcbmltcG9ydCB7IFNlbGVjdGlvblR5cGUgfSBmcm9tICcuLi8uLi90eXBlcy9zZWxlY3Rpb24udHlwZSc7XG5pbXBvcnQgeyBjb2x1bW5zQnlQaW4sIGNvbHVtbkdyb3VwV2lkdGhzIH0gZnJvbSAnLi4vLi4vdXRpbHMvY29sdW1uJztcbmltcG9ydCB7IFJvd0hlaWdodENhY2hlIH0gZnJvbSAnLi4vLi4vdXRpbHMvcm93LWhlaWdodC1jYWNoZSc7XG5pbXBvcnQgeyB0cmFuc2xhdGVYWSB9IGZyb20gJy4uLy4uL3V0aWxzL3RyYW5zbGF0ZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2RhdGF0YWJsZS1ib2R5JyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGF0YXRhYmxlLXNlbGVjdGlvblxuICAgICAgI3NlbGVjdG9yXG4gICAgICBbc2VsZWN0ZWRdPVwic2VsZWN0ZWRcIlxuICAgICAgW3Jvd3NdPVwicm93c1wiXG4gICAgICBbc2VsZWN0Q2hlY2tdPVwic2VsZWN0Q2hlY2tcIlxuICAgICAgW3NlbGVjdEVuYWJsZWRdPVwic2VsZWN0RW5hYmxlZFwiXG4gICAgICBbc2VsZWN0aW9uVHlwZV09XCJzZWxlY3Rpb25UeXBlXCJcbiAgICAgIFtyb3dJZGVudGl0eV09XCJyb3dJZGVudGl0eVwiXG4gICAgICAoc2VsZWN0KT1cInNlbGVjdC5lbWl0KCRldmVudClcIlxuICAgICAgKGFjdGl2YXRlKT1cImFjdGl2YXRlLmVtaXQoJGV2ZW50KVwiXG4gICAgPlxuICAgICAgPGRhdGF0YWJsZS1wcm9ncmVzcyAqbmdJZj1cImxvYWRpbmdJbmRpY2F0b3JcIj4gPC9kYXRhdGFibGUtcHJvZ3Jlc3M+XG4gICAgICA8ZGF0YXRhYmxlLXNjcm9sbGVyXG4gICAgICAgICpuZ0lmPVwicm93cz8ubGVuZ3RoXCJcbiAgICAgICAgW3Njcm9sbGJhclZdPVwic2Nyb2xsYmFyVlwiXG4gICAgICAgIFtzY3JvbGxiYXJIXT1cInNjcm9sbGJhckhcIlxuICAgICAgICBbc2Nyb2xsSGVpZ2h0XT1cInNjcm9sbEhlaWdodFwiXG4gICAgICAgIFtzY3JvbGxXaWR0aF09XCJjb2x1bW5Hcm91cFdpZHRocz8udG90YWxcIlxuICAgICAgICAoc2Nyb2xsKT1cIm9uQm9keVNjcm9sbCgkZXZlbnQpXCJcbiAgICAgID5cbiAgICAgICAgPGRhdGF0YWJsZS1zdW1tYXJ5LXJvd1xuICAgICAgICAgICpuZ0lmPVwic3VtbWFyeVJvdyAmJiBzdW1tYXJ5UG9zaXRpb24gPT09ICd0b3AnXCJcbiAgICAgICAgICBbcm93SGVpZ2h0XT1cInN1bW1hcnlIZWlnaHRcIlxuICAgICAgICAgIFtvZmZzZXRYXT1cIm9mZnNldFhcIlxuICAgICAgICAgIFtpbm5lcldpZHRoXT1cImlubmVyV2lkdGhcIlxuICAgICAgICAgIFtyb3dzXT1cInJvd3NcIlxuICAgICAgICAgIFtjb2x1bW5zXT1cImNvbHVtbnNcIlxuICAgICAgICA+XG4gICAgICAgIDwvZGF0YXRhYmxlLXN1bW1hcnktcm93PlxuICAgICAgICA8ZGF0YXRhYmxlLXJvdy13cmFwcGVyXG4gICAgICAgICAgW2dyb3VwZWRSb3dzXT1cImdyb3VwZWRSb3dzXCJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgdGVtcDsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogcm93VHJhY2tpbmdGblwiXG4gICAgICAgICAgW2lubmVyV2lkdGhdPVwiaW5uZXJXaWR0aFwiXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0Um93c1N0eWxlcyhncm91cClcIlxuICAgICAgICAgIFtyb3dEZXRhaWxdPVwicm93RGV0YWlsXCJcbiAgICAgICAgICBbZ3JvdXBIZWFkZXJdPVwiZ3JvdXBIZWFkZXJcIlxuICAgICAgICAgIFtvZmZzZXRYXT1cIm9mZnNldFhcIlxuICAgICAgICAgIFtkZXRhaWxSb3dIZWlnaHRdPVwiZ2V0RGV0YWlsUm93SGVpZ2h0KGdyb3VwW2ldLCBpKVwiXG4gICAgICAgICAgW3Jvd109XCJncm91cFwiXG4gICAgICAgICAgW2V4cGFuZGVkXT1cImdldFJvd0V4cGFuZGVkKGdyb3VwKVwiXG4gICAgICAgICAgW3Jvd0luZGV4XT1cImdldFJvd0luZGV4KGdyb3VwW2ldKVwiXG4gICAgICAgICAgKHJvd0NvbnRleHRtZW51KT1cInJvd0NvbnRleHRtZW51LmVtaXQoJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGF0YXRhYmxlLWJvZHktcm93XG4gICAgICAgICAgICAqbmdJZj1cIiFncm91cGVkUm93czsgZWxzZSBncm91cGVkUm93c1RlbXBsYXRlXCJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgW2lzU2VsZWN0ZWRdPVwic2VsZWN0b3IuZ2V0Um93U2VsZWN0ZWQoZ3JvdXApXCJcbiAgICAgICAgICAgIFtpbm5lcldpZHRoXT1cImlubmVyV2lkdGhcIlxuICAgICAgICAgICAgW29mZnNldFhdPVwib2Zmc2V0WFwiXG4gICAgICAgICAgICBbY29sdW1uc109XCJjb2x1bW5zXCJcbiAgICAgICAgICAgIFtyb3dIZWlnaHRdPVwiZ2V0Um93SGVpZ2h0KGdyb3VwKVwiXG4gICAgICAgICAgICBbcm93XT1cImdyb3VwXCJcbiAgICAgICAgICAgIFtyb3dJbmRleF09XCJnZXRSb3dJbmRleChncm91cClcIlxuICAgICAgICAgICAgW2V4cGFuZGVkXT1cImdldFJvd0V4cGFuZGVkKGdyb3VwKVwiXG4gICAgICAgICAgICBbcm93Q2xhc3NdPVwicm93Q2xhc3NcIlxuICAgICAgICAgICAgW2Rpc3BsYXlDaGVja109XCJkaXNwbGF5Q2hlY2tcIlxuICAgICAgICAgICAgW3RyZWVTdGF0dXNdPVwiZ3JvdXAudHJlZVN0YXR1c1wiXG4gICAgICAgICAgICAodHJlZUFjdGlvbik9XCJvblRyZWVBY3Rpb24oZ3JvdXApXCJcbiAgICAgICAgICAgIChhY3RpdmF0ZSk9XCJzZWxlY3Rvci5vbkFjdGl2YXRlKCRldmVudCwgaW5kZXhlcy5maXJzdCArIGkpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPC9kYXRhdGFibGUtYm9keS1yb3c+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNncm91cGVkUm93c1RlbXBsYXRlPlxuICAgICAgICAgICAgPGRhdGF0YWJsZS1ib2R5LXJvd1xuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgcm93IG9mIGdyb3VwLnZhbHVlOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiByb3dUcmFja2luZ0ZuXCJcbiAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgIFtpc1NlbGVjdGVkXT1cInNlbGVjdG9yLmdldFJvd1NlbGVjdGVkKHJvdylcIlxuICAgICAgICAgICAgICBbaW5uZXJXaWR0aF09XCJpbm5lcldpZHRoXCJcbiAgICAgICAgICAgICAgW29mZnNldFhdPVwib2Zmc2V0WFwiXG4gICAgICAgICAgICAgIFtjb2x1bW5zXT1cImNvbHVtbnNcIlxuICAgICAgICAgICAgICBbcm93SGVpZ2h0XT1cImdldFJvd0hlaWdodChyb3cpXCJcbiAgICAgICAgICAgICAgW3Jvd109XCJyb3dcIlxuICAgICAgICAgICAgICBbZ3JvdXBdPVwiZ3JvdXAudmFsdWVcIlxuICAgICAgICAgICAgICBbcm93SW5kZXhdPVwiZ2V0Um93SW5kZXgocm93KVwiXG4gICAgICAgICAgICAgIFtleHBhbmRlZF09XCJnZXRSb3dFeHBhbmRlZChyb3cpXCJcbiAgICAgICAgICAgICAgW3Jvd0NsYXNzXT1cInJvd0NsYXNzXCJcbiAgICAgICAgICAgICAgKGFjdGl2YXRlKT1cInNlbGVjdG9yLm9uQWN0aXZhdGUoJGV2ZW50LCBpKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2RhdGF0YWJsZS1ib2R5LXJvdz5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2RhdGF0YWJsZS1yb3ctd3JhcHBlcj5cbiAgICAgICAgPGRhdGF0YWJsZS1zdW1tYXJ5LXJvd1xuICAgICAgICAgICpuZ0lmPVwic3VtbWFyeVJvdyAmJiBzdW1tYXJ5UG9zaXRpb24gPT09ICdib3R0b20nXCJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRCb3R0b21TdW1tYXJ5Um93U3R5bGVzKClcIlxuICAgICAgICAgIFtyb3dIZWlnaHRdPVwic3VtbWFyeUhlaWdodFwiXG4gICAgICAgICAgW29mZnNldFhdPVwib2Zmc2V0WFwiXG4gICAgICAgICAgW2lubmVyV2lkdGhdPVwiaW5uZXJXaWR0aFwiXG4gICAgICAgICAgW3Jvd3NdPVwicm93c1wiXG4gICAgICAgICAgW2NvbHVtbnNdPVwiY29sdW1uc1wiXG4gICAgICAgID5cbiAgICAgICAgPC9kYXRhdGFibGUtc3VtbWFyeS1yb3c+XG4gICAgICA8L2RhdGF0YWJsZS1zY3JvbGxlcj5cbiAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1yb3dcIiAqbmdJZj1cIiFyb3dzPy5sZW5ndGggJiYgIWxvYWRpbmdJbmRpY2F0b3JcIiBbaW5uZXJIVE1MXT1cImVtcHR5TWVzc2FnZVwiPjwvZGl2PlxuICAgIDwvZGF0YXRhYmxlLXNlbGVjdGlvbj5cbiAgYCxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGhvc3Q6IHtcbiAgICBjbGFzczogJ2RhdGF0YWJsZS1ib2R5J1xuICB9XG59KVxuZXhwb3J0IGNsYXNzIERhdGFUYWJsZUJvZHlDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIHNjcm9sbGJhclY6IGJvb2xlYW47XG4gIEBJbnB1dCgpIHNjcm9sbGJhckg6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGxvYWRpbmdJbmRpY2F0b3I6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGV4dGVybmFsUGFnaW5nOiBib29sZWFuO1xuICBASW5wdXQoKSByb3dIZWlnaHQ6IG51bWJlciB8ICdhdXRvJyB8ICgocm93PzogYW55KSA9PiBudW1iZXIpO1xuICBASW5wdXQoKSBvZmZzZXRYOiBudW1iZXI7XG4gIEBJbnB1dCgpIGVtcHR5TWVzc2FnZTogc3RyaW5nO1xuICBASW5wdXQoKSBzZWxlY3Rpb25UeXBlOiBTZWxlY3Rpb25UeXBlO1xuICBASW5wdXQoKSBzZWxlY3RlZDogYW55W10gPSBbXTtcbiAgQElucHV0KCkgcm93SWRlbnRpdHk6IGFueTtcbiAgQElucHV0KCkgcm93RGV0YWlsOiBhbnk7XG4gIEBJbnB1dCgpIGdyb3VwSGVhZGVyOiBhbnk7XG4gIEBJbnB1dCgpIHNlbGVjdENoZWNrOiBhbnk7XG4gIEBJbnB1dCgpIGRpc3BsYXlDaGVjazogYW55O1xuICBASW5wdXQoKSB0cmFja0J5UHJvcDogc3RyaW5nO1xuICBASW5wdXQoKSByb3dDbGFzczogYW55O1xuICBASW5wdXQoKSBncm91cGVkUm93czogYW55O1xuICBASW5wdXQoKSBncm91cEV4cGFuc2lvbkRlZmF1bHQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGlubmVyV2lkdGg6IG51bWJlcjtcbiAgQElucHV0KCkgZ3JvdXBSb3dzQnk6IHN0cmluZztcbiAgQElucHV0KCkgdmlydHVhbGl6YXRpb246IGJvb2xlYW47XG4gIEBJbnB1dCgpIHN1bW1hcnlSb3c6IGJvb2xlYW47XG4gIEBJbnB1dCgpIHN1bW1hcnlQb3NpdGlvbjogc3RyaW5nO1xuICBASW5wdXQoKSBzdW1tYXJ5SGVpZ2h0OiBudW1iZXI7XG5cbiAgQElucHV0KCkgc2V0IHBhZ2VTaXplKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5fcGFnZVNpemUgPSB2YWw7XG4gICAgdGhpcy5yZWNhbGNMYXlvdXQoKTtcbiAgfVxuXG4gIGdldCBwYWdlU2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9wYWdlU2l6ZTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCByb3dzKHZhbDogYW55W10pIHtcbiAgICB0aGlzLl9yb3dzID0gdmFsO1xuICAgIHRoaXMucm93RXhwYW5zaW9ucy5jbGVhcigpO1xuICAgIHRoaXMucmVjYWxjTGF5b3V0KCk7XG4gIH1cblxuICBnZXQgcm93cygpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvd3M7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgY29sdW1ucyh2YWw6IGFueVtdKSB7XG4gICAgdGhpcy5fY29sdW1ucyA9IHZhbDtcbiAgICBjb25zdCBjb2xzQnlQaW4gPSBjb2x1bW5zQnlQaW4odmFsKTtcbiAgICB0aGlzLmNvbHVtbkdyb3VwV2lkdGhzID0gY29sdW1uR3JvdXBXaWR0aHMoY29sc0J5UGluLCB2YWwpO1xuICB9XG5cbiAgZ2V0IGNvbHVtbnMoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLl9jb2x1bW5zO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IG9mZnNldCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuX29mZnNldCA9IHZhbDtcbiAgICB0aGlzLnJlY2FsY0xheW91dCgpO1xuICB9XG5cbiAgZ2V0IG9mZnNldCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9vZmZzZXQ7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgcm93Q291bnQodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLl9yb3dDb3VudCA9IHZhbDtcbiAgICB0aGlzLnJlY2FsY0xheW91dCgpO1xuICB9XG5cbiAgZ2V0IHJvd0NvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvd0NvdW50O1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdzdHlsZS53aWR0aCcpXG4gIGdldCBib2R5V2lkdGgoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5zY3JvbGxiYXJIKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbm5lcldpZHRoICsgJ3B4JztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICcxMDAlJztcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKVxuICBASG9zdEJpbmRpbmcoJ3N0eWxlLmhlaWdodCcpXG4gIHNldCBib2R5SGVpZ2h0KHZhbCkge1xuICAgIGlmICh0aGlzLnNjcm9sbGJhclYpIHtcbiAgICAgIHRoaXMuX2JvZHlIZWlnaHQgPSB2YWwgKyAncHgnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9ib2R5SGVpZ2h0ID0gJ2F1dG8nO1xuICAgIH1cblxuICAgIHRoaXMucmVjYWxjTGF5b3V0KCk7XG4gIH1cblxuICBnZXQgYm9keUhlaWdodCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYm9keUhlaWdodDtcbiAgfVxuXG4gIEBPdXRwdXQoKSBzY3JvbGw6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcGFnZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBhY3RpdmF0ZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBzZWxlY3Q6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgZGV0YWlsVG9nZ2xlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHJvd0NvbnRleHRtZW51ID0gbmV3IEV2ZW50RW1pdHRlcjx7IGV2ZW50OiBNb3VzZUV2ZW50OyByb3c6IGFueSB9PihmYWxzZSk7XG4gIEBPdXRwdXQoKSB0cmVlQWN0aW9uOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAVmlld0NoaWxkKFNjcm9sbGVyQ29tcG9uZW50LCB7IHN0YXRpYzogZmFsc2UgfSkgc2Nyb2xsZXI6IFNjcm9sbGVyQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGlmIHNlbGVjdGlvbiBpcyBlbmFibGVkLlxuICAgKi9cbiAgZ2V0IHNlbGVjdEVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5zZWxlY3Rpb25UeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3BlcnR5IHRoYXQgd291bGQgY2FsY3VsYXRlIHRoZSBoZWlnaHQgb2Ygc2Nyb2xsIGJhclxuICAgKiBiYXNlZCBvbiB0aGUgcm93IGhlaWdodHMgY2FjaGUgZm9yIHZpcnR1YWwgc2Nyb2xsIGFuZCB2aXJ0dWFsaXphdGlvbi4gT3RoZXIgc2NlbmFyaW9zXG4gICAqIGNhbGN1bGF0ZSBzY3JvbGwgaGVpZ2h0IGF1dG9tYXRpY2FsbHkgKGFzIGhlaWdodCB3aWxsIGJlIHVuZGVmaW5lZCkuXG4gICAqL1xuICBnZXQgc2Nyb2xsSGVpZ2h0KCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuc2Nyb2xsYmFyViAmJiB0aGlzLnZpcnR1YWxpemF0aW9uICYmIHRoaXMucm93Q291bnQpIHtcbiAgICAgIHJldHVybiB0aGlzLnJvd0hlaWdodHNDYWNoZS5xdWVyeSh0aGlzLnJvd0NvdW50IC0gMSk7XG4gICAgfVxuICAgIC8vIGF2b2lkIFRTNzAzMDogTm90IGFsbCBjb2RlIHBhdGhzIHJldHVybiBhIHZhbHVlLlxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByb3dIZWlnaHRzQ2FjaGU6IFJvd0hlaWdodENhY2hlID0gbmV3IFJvd0hlaWdodENhY2hlKCk7XG4gIHRlbXA6IGFueVtdID0gW107XG4gIG9mZnNldFkgPSAwO1xuICBpbmRleGVzOiBhbnkgPSB7fTtcbiAgY29sdW1uR3JvdXBXaWR0aHM6IGFueTtcbiAgY29sdW1uR3JvdXBXaWR0aHNXaXRob3V0R3JvdXA6IGFueTtcbiAgcm93VHJhY2tpbmdGbjogYW55O1xuICBsaXN0ZW5lcjogYW55O1xuICByb3dJbmRleGVzOiBhbnkgPSBuZXcgTWFwKCk7XG4gIHJvd0V4cGFuc2lvbnM6IGFueSA9IG5ldyBNYXAoKTtcblxuICBfcm93czogYW55W107XG4gIF9ib2R5SGVpZ2h0OiBhbnk7XG4gIF9jb2x1bW5zOiBhbnlbXTtcbiAgX3Jvd0NvdW50OiBudW1iZXI7XG4gIF9vZmZzZXQ6IG51bWJlcjtcbiAgX3BhZ2VTaXplOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgRGF0YVRhYmxlQm9keUNvbXBvbmVudC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgLy8gZGVjbGFyZSBmbiBoZXJlIHNvIHdlIGNhbiBnZXQgYWNjZXNzIHRvIHRoZSBgdGhpc2AgcHJvcGVydHlcbiAgICB0aGlzLnJvd1RyYWNraW5nRm4gPSAoaW5kZXg6IG51bWJlciwgcm93OiBhbnkpOiBhbnkgPT4ge1xuICAgICAgY29uc3QgaWR4ID0gdGhpcy5nZXRSb3dJbmRleChyb3cpO1xuICAgICAgaWYgKHRoaXMudHJhY2tCeVByb3ApIHtcbiAgICAgICAgcmV0dXJuIHJvd1t0aGlzLnRyYWNrQnlQcm9wXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpZHg7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYWZ0ZXIgdGhlIGNvbnN0cnVjdG9yLCBpbml0aWFsaXppbmcgaW5wdXQgcHJvcGVydGllc1xuICAgKi9cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucm93RGV0YWlsKSB7XG4gICAgICB0aGlzLmxpc3RlbmVyID0gdGhpcy5yb3dEZXRhaWwudG9nZ2xlLnN1YnNjcmliZSgoeyB0eXBlLCB2YWx1ZSB9OiB7IHR5cGU6IHN0cmluZzsgdmFsdWU6IGFueSB9KSA9PiB7XG4gICAgICAgIGlmICh0eXBlID09PSAncm93Jykge1xuICAgICAgICAgIHRoaXMudG9nZ2xlUm93RXhwYW5zaW9uKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZSA9PT0gJ2FsbCcpIHtcbiAgICAgICAgICB0aGlzLnRvZ2dsZUFsbFJvd3ModmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVmcmVzaCByb3dzIGFmdGVyIHRvZ2dsZVxuICAgICAgICAvLyBGaXhlcyAjODgzXG4gICAgICAgIHRoaXMudXBkYXRlSW5kZXhlcygpO1xuICAgICAgICB0aGlzLnVwZGF0ZVJvd3MoKTtcbiAgICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmdyb3VwSGVhZGVyKSB7XG4gICAgICB0aGlzLmxpc3RlbmVyID0gdGhpcy5ncm91cEhlYWRlci50b2dnbGUuc3Vic2NyaWJlKCh7IHR5cGUsIHZhbHVlIH06IHsgdHlwZTogc3RyaW5nOyB2YWx1ZTogYW55IH0pID0+IHtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdncm91cCcpIHtcbiAgICAgICAgICB0aGlzLnRvZ2dsZVJvd0V4cGFuc2lvbih2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGUgPT09ICdhbGwnKSB7XG4gICAgICAgICAgdGhpcy50b2dnbGVBbGxSb3dzKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlZnJlc2ggcm93cyBhZnRlciB0b2dnbGVcbiAgICAgICAgLy8gRml4ZXMgIzg4M1xuICAgICAgICB0aGlzLnVwZGF0ZUluZGV4ZXMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVSb3dzKCk7XG4gICAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIG9uY2UsIGJlZm9yZSB0aGUgaW5zdGFuY2UgaXMgZGVzdHJveWVkLlxuICAgKi9cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucm93RGV0YWlsIHx8IHRoaXMuZ3JvdXBIZWFkZXIpIHtcbiAgICAgIHRoaXMubGlzdGVuZXIudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgWSBvZmZzZXQgZ2l2ZW4gYSBuZXcgb2Zmc2V0LlxuICAgKi9cbiAgdXBkYXRlT2Zmc2V0WShvZmZzZXQ/OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBzY3JvbGxlciBpcyBtaXNzaW5nIG9uIGVtcHR5IHRhYmxlXG4gICAgaWYgKCF0aGlzLnNjcm9sbGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2Nyb2xsYmFyViAmJiB0aGlzLnZpcnR1YWxpemF0aW9uICYmIG9mZnNldCkge1xuICAgICAgLy8gRmlyc3QgZ2V0IHRoZSByb3cgSW5kZXggdGhhdCB3ZSBuZWVkIHRvIG1vdmUgdG8uXG4gICAgICBjb25zdCByb3dJbmRleCA9IHRoaXMucGFnZVNpemUgKiBvZmZzZXQ7XG4gICAgICBvZmZzZXQgPSB0aGlzLnJvd0hlaWdodHNDYWNoZS5xdWVyeShyb3dJbmRleCAtIDEpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zY3JvbGxiYXJWICYmICF0aGlzLnZpcnR1YWxpemF0aW9uKSB7XG4gICAgICBvZmZzZXQgPSAwO1xuICAgIH1cblxuICAgIHRoaXMuc2Nyb2xsZXIuc2V0T2Zmc2V0KG9mZnNldCB8fCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCb2R5IHdhcyBzY3JvbGxlZCwgdGhpcyBpcyBtYWlubHkgdXNlZnVsIGZvclxuICAgKiB3aGVuIGEgdXNlciBpcyBzZXJ2ZXItc2lkZSBwYWdpbmF0aW9uIHZpYSB2aXJ0dWFsIHNjcm9sbC5cbiAgICovXG4gIG9uQm9keVNjcm9sbChldmVudDogYW55KTogdm9pZCB7XG4gICAgY29uc3Qgc2Nyb2xsWVBvczogbnVtYmVyID0gZXZlbnQuc2Nyb2xsWVBvcztcbiAgICBjb25zdCBzY3JvbGxYUG9zOiBudW1iZXIgPSBldmVudC5zY3JvbGxYUG9zO1xuXG4gICAgLy8gaWYgc2Nyb2xsIGNoYW5nZSwgdHJpZ2dlciB1cGRhdGVcbiAgICAvLyB0aGlzIGlzIG1haW5seSB1c2VkIGZvciBoZWFkZXIgY2VsbCBwb3NpdGlvbnNcbiAgICBpZiAodGhpcy5vZmZzZXRZICE9PSBzY3JvbGxZUG9zIHx8IHRoaXMub2Zmc2V0WCAhPT0gc2Nyb2xsWFBvcykge1xuICAgICAgdGhpcy5zY3JvbGwuZW1pdCh7XG4gICAgICAgIG9mZnNldFk6IHNjcm9sbFlQb3MsXG4gICAgICAgIG9mZnNldFg6IHNjcm9sbFhQb3NcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMub2Zmc2V0WSA9IHNjcm9sbFlQb3M7XG4gICAgdGhpcy5vZmZzZXRYID0gc2Nyb2xsWFBvcztcblxuICAgIHRoaXMudXBkYXRlSW5kZXhlcygpO1xuICAgIHRoaXMudXBkYXRlUGFnZShldmVudC5kaXJlY3Rpb24pO1xuICAgIHRoaXMudXBkYXRlUm93cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIHBhZ2UgZ2l2ZW4gYSBkaXJlY3Rpb24uXG4gICAqL1xuICB1cGRhdGVQYWdlKGRpcmVjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgbGV0IG9mZnNldCA9IHRoaXMuaW5kZXhlcy5maXJzdCAvIHRoaXMucGFnZVNpemU7XG5cbiAgICBpZiAoZGlyZWN0aW9uID09PSAndXAnKSB7XG4gICAgICBvZmZzZXQgPSBNYXRoLmNlaWwob2Zmc2V0KTtcbiAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gJ2Rvd24nKSB7XG4gICAgICBvZmZzZXQgPSBNYXRoLmZsb29yKG9mZnNldCk7XG4gICAgfVxuXG4gICAgaWYgKGRpcmVjdGlvbiAhPT0gdW5kZWZpbmVkICYmICFpc05hTihvZmZzZXQpKSB7XG4gICAgICB0aGlzLnBhZ2UuZW1pdCh7IG9mZnNldCB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgcm93cyBpbiB0aGUgdmlldyBwb3J0XG4gICAqL1xuICB1cGRhdGVSb3dzKCk6IHZvaWQge1xuICAgIGNvbnN0IHsgZmlyc3QsIGxhc3QgfSA9IHRoaXMuaW5kZXhlcztcbiAgICBsZXQgcm93SW5kZXggPSBmaXJzdDtcbiAgICBsZXQgaWR4ID0gMDtcbiAgICBjb25zdCB0ZW1wOiBhbnlbXSA9IFtdO1xuXG4gICAgdGhpcy5yb3dJbmRleGVzLmNsZWFyKCk7XG5cbiAgICAvLyBpZiBncm91cHJvd3NieSBoYXMgYmVlbiBzcGVjaWZpZWQgdHJlYXQgcm93IHBhZ2luZ1xuICAgIC8vIHBhcmFtZXRlcnMgYXMgZ3JvdXAgcGFnaW5nIHBhcmFtZXRlcnMgaWUgaWYgbGltaXQgMTAgaGFzIGJlZW5cbiAgICAvLyBzcGVjaWZpZWQgdHJlYXQgaXQgYXMgMTAgZ3JvdXBzIHJhdGhlciB0aGFuIDEwIHJvd3NcbiAgICBpZiAodGhpcy5ncm91cGVkUm93cykge1xuICAgICAgbGV0IG1heFJvd3NQZXJHcm91cCA9IDM7XG4gICAgICAvLyBpZiB0aGVyZSBpcyBvbmx5IG9uZSBncm91cCBzZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mXG4gICAgICAvLyByb3dzIHBlciBncm91cCB0aGUgc2FtZSBhcyB0aGUgdG90YWwgbnVtYmVyIG9mIHJvd3NcbiAgICAgIGlmICh0aGlzLmdyb3VwZWRSb3dzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBtYXhSb3dzUGVyR3JvdXAgPSB0aGlzLmdyb3VwZWRSb3dzWzBdLnZhbHVlLmxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKHJvd0luZGV4IDwgbGFzdCAmJiByb3dJbmRleCA8IHRoaXMuZ3JvdXBlZFJvd3MubGVuZ3RoKSB7XG4gICAgICAgIC8vIEFkZCB0aGUgZ3JvdXBzIGludG8gdGhpcyBwYWdlXG4gICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cGVkUm93c1tyb3dJbmRleF07XG4gICAgICAgIHRlbXBbaWR4XSA9IGdyb3VwO1xuICAgICAgICBpZHgrKztcblxuICAgICAgICAvLyBHcm91cCBpbmRleCBpbiB0aGlzIGNvbnRleHRcbiAgICAgICAgcm93SW5kZXgrKztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgd2hpbGUgKHJvd0luZGV4IDwgbGFzdCAmJiByb3dJbmRleCA8IHRoaXMucm93Q291bnQpIHtcbiAgICAgICAgY29uc3Qgcm93ID0gdGhpcy5yb3dzW3Jvd0luZGV4XTtcblxuICAgICAgICBpZiAocm93KSB7XG4gICAgICAgICAgdGhpcy5yb3dJbmRleGVzLnNldChyb3csIHJvd0luZGV4KTtcbiAgICAgICAgICB0ZW1wW2lkeF0gPSByb3c7XG4gICAgICAgIH1cblxuICAgICAgICBpZHgrKztcbiAgICAgICAgcm93SW5kZXgrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnRlbXAgPSB0ZW1wO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcm93IGhlaWdodFxuICAgKi9cbiAgZ2V0Um93SGVpZ2h0KHJvdzogYW55KTogbnVtYmVyIHtcbiAgICAvLyBpZiBpdHMgYSBmdW5jdGlvbiByZXR1cm4gaXRcbiAgICBpZiAodHlwZW9mIHRoaXMucm93SGVpZ2h0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gdGhpcy5yb3dIZWlnaHQocm93KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5yb3dIZWlnaHQgYXMgbnVtYmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBncm91cCB0aGUgZ3JvdXAgd2l0aCBhbGwgcm93c1xuICAgKi9cbiAgZ2V0R3JvdXBIZWlnaHQoZ3JvdXA6IGFueSk6IG51bWJlciB7XG4gICAgbGV0IHJvd0hlaWdodCA9IDA7XG5cbiAgICBpZiAoZ3JvdXAudmFsdWUpIHtcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBncm91cC52YWx1ZS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgcm93SGVpZ2h0ICs9IHRoaXMuZ2V0Um93QW5kRGV0YWlsSGVpZ2h0KGdyb3VwLnZhbHVlW2luZGV4XSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJvd0hlaWdodDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgcm93IGhlaWdodCBiYXNlZCBvbiB0aGUgZXhwYW5kZWQgc3RhdGUgb2YgdGhlIHJvdy5cbiAgICovXG4gIGdldFJvd0FuZERldGFpbEhlaWdodChyb3c6IGFueSk6IG51bWJlciB7XG4gICAgbGV0IHJvd0hlaWdodCA9IHRoaXMuZ2V0Um93SGVpZ2h0KHJvdyk7XG4gICAgY29uc3QgZXhwYW5kZWQgPSB0aGlzLnJvd0V4cGFuc2lvbnMuZ2V0KHJvdyk7XG5cbiAgICAvLyBBZGRpbmcgZGV0YWlsIHJvdyBoZWlnaHQgaWYgaXRzIGV4cGFuZGVkLlxuICAgIGlmIChleHBhbmRlZCA9PT0gMSkge1xuICAgICAgcm93SGVpZ2h0ICs9IHRoaXMuZ2V0RGV0YWlsUm93SGVpZ2h0KHJvdyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJvd0hlaWdodDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGhlaWdodCBvZiB0aGUgZGV0YWlsIHJvdy5cbiAgICovXG4gIGdldERldGFpbFJvd0hlaWdodCA9IChyb3c/OiBhbnksIGluZGV4PzogYW55KTogbnVtYmVyID0+IHtcbiAgICBpZiAoIXRoaXMucm93RGV0YWlsKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgY29uc3Qgcm93SGVpZ2h0ID0gdGhpcy5yb3dEZXRhaWwucm93SGVpZ2h0O1xuICAgIHJldHVybiB0eXBlb2Ygcm93SGVpZ2h0ID09PSAnZnVuY3Rpb24nID8gcm93SGVpZ2h0KHJvdywgaW5kZXgpIDogKHJvd0hlaWdodCBhcyBudW1iZXIpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSBzdHlsZXMgZm9yIHRoZSByb3cgc28gdGhhdCB0aGUgcm93cyBjYW4gYmUgbW92ZWQgaW4gMkQgc3BhY2VcbiAgICogZHVyaW5nIHZpcnR1YWwgc2Nyb2xsIGluc2lkZSB0aGUgRE9NLiAgIEluIHRoZSBiZWxvdyBjYXNlIHRoZSBZIHBvc2l0aW9uIGlzXG4gICAqIG1hbmlwdWxhdGVkLiAgIEFzIGFuIGV4YW1wbGUsIGlmIHRoZSBoZWlnaHQgb2Ygcm93IDAgaXMgMzAgcHggYW5kIHJvdyAxIGlzXG4gICAqIDEwMCBweCB0aGVuIGZvbGxvd2luZyBzdHlsZXMgYXJlIGdlbmVyYXRlZDpcbiAgICpcbiAgICogdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwcHgsIDBweCwgMHB4KTsgICAgLT4gIHJvdzBcbiAgICogdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwcHgsIDMwcHgsIDBweCk7ICAgLT4gIHJvdzFcbiAgICogdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwcHgsIDEzMHB4LCAwcHgpOyAgLT4gIHJvdzJcbiAgICpcbiAgICogUm93IGhlaWdodHMgaGF2ZSB0byBiZSBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZSByb3cgaGVpZ2h0cyBjYWNoZSBhcyB3ZSB3b250XG4gICAqIGJlIGFibGUgdG8gZGV0ZXJtaW5lIHdoaWNoIHJvdyBpcyBvZiB3aGF0IGhlaWdodCBiZWZvcmUgaGFuZC4gIEluIHRoZSBhYm92ZVxuICAgKiBjYXNlIHRoZSBwb3NpdGlvblkgb2YgdGhlIHRyYW5zbGF0ZTNkIGZvciByb3cyIHdvdWxkIGJlIHRoZSBzdW0gb2YgYWxsIHRoZVxuICAgKiBoZWlnaHRzIG9mIHRoZSByb3dzIGJlZm9yZSBpdCAoaS5lLiByb3cwIGFuZCByb3cxKS5cbiAgICpcbiAgICogQHBhcmFtIHJvd3MgdGhlIHJvdyB0aGF0IG5lZWRzIHRvIGJlIHBsYWNlZCBpbiB0aGUgMkQgc3BhY2UuXG4gICAqIEByZXR1cm5zIHRoZSBDU1MzIHN0eWxlIHRvIGJlIGFwcGxpZWRcbiAgICpcbiAgICogQG1lbWJlck9mIERhdGFUYWJsZUJvZHlDb21wb25lbnRcbiAgICovXG4gIGdldFJvd3NTdHlsZXMocm93czogYW55KTogYW55IHtcbiAgICBjb25zdCBzdHlsZXM6IGFueSA9IHt9O1xuXG4gICAgLy8gb25seSBhZGQgc3R5bGVzIGZvciB0aGUgZ3JvdXAgaWYgdGhlcmUgaXMgYSBncm91cFxuICAgIGlmICh0aGlzLmdyb3VwZWRSb3dzKSB7XG4gICAgICBzdHlsZXMud2lkdGggPSB0aGlzLmNvbHVtbkdyb3VwV2lkdGhzLnRvdGFsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNjcm9sbGJhclYgJiYgdGhpcy52aXJ0dWFsaXphdGlvbikge1xuICAgICAgbGV0IGlkeCA9IDA7XG5cbiAgICAgIGlmICh0aGlzLmdyb3VwZWRSb3dzKSB7XG4gICAgICAgIC8vIEdldCB0aGUgbGF0ZXN0IHJvdyByb3dpbmRleCBpbiBhIGdyb3VwXG4gICAgICAgIGNvbnN0IHJvdyA9IHJvd3Nbcm93cy5sZW5ndGggLSAxXTtcbiAgICAgICAgaWR4ID0gcm93ID8gdGhpcy5nZXRSb3dJbmRleChyb3cpIDogMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlkeCA9IHRoaXMuZ2V0Um93SW5kZXgocm93cyk7XG4gICAgICB9XG5cbiAgICAgIC8vIGNvbnN0IHBvcyA9IGlkeCAqIHJvd0hlaWdodDtcbiAgICAgIC8vIFRoZSBwb3NpdGlvbiBvZiB0aGlzIHJvdyB3b3VsZCBiZSB0aGUgc3VtIG9mIGFsbCByb3cgaGVpZ2h0c1xuICAgICAgLy8gdW50aWwgdGhlIHByZXZpb3VzIHJvdyBwb3NpdGlvbi5cbiAgICAgIGNvbnN0IHBvcyA9IHRoaXMucm93SGVpZ2h0c0NhY2hlLnF1ZXJ5KGlkeCAtIDEpO1xuXG4gICAgICB0cmFuc2xhdGVYWShzdHlsZXMsIDAsIHBvcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0eWxlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgYm90dG9tIHN1bW1hcnkgcm93IG9mZnNldCBmb3Igc2Nyb2xsYmFyIG1vZGUuXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGNhY2hlIGFuZCBvZmZzZXQgY2FsY3VsYXRpb25cbiAgICogc2VlIGRlc2NyaXB0aW9uIGZvciBgZ2V0Um93c1N0eWxlc2AgbWV0aG9kXG4gICAqXG4gICAqIEByZXR1cm5zIHRoZSBDU1MzIHN0eWxlIHRvIGJlIGFwcGxpZWRcbiAgICpcbiAgICogQG1lbWJlck9mIERhdGFUYWJsZUJvZHlDb21wb25lbnRcbiAgICovXG4gIGdldEJvdHRvbVN1bW1hcnlSb3dTdHlsZXMoKTogYW55IHtcbiAgICBpZiAoIXRoaXMuc2Nyb2xsYmFyViB8fCAhdGhpcy5yb3dzIHx8ICF0aGlzLnJvd3MubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBzdHlsZXMgPSB7IHBvc2l0aW9uOiAnYWJzb2x1dGUnIH07XG4gICAgY29uc3QgcG9zID0gdGhpcy5yb3dIZWlnaHRzQ2FjaGUucXVlcnkodGhpcy5yb3dzLmxlbmd0aCAtIDEpO1xuXG4gICAgdHJhbnNsYXRlWFkoc3R5bGVzLCAwLCBwb3MpO1xuXG4gICAgcmV0dXJuIHN0eWxlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlcyB0aGUgbG9hZGluZyBpbmRpY2F0b3JcbiAgICovXG4gIGhpZGVJbmRpY2F0b3IoKTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiAodGhpcy5sb2FkaW5nSW5kaWNhdG9yID0gZmFsc2UpLCA1MDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIGluZGV4IG9mIHRoZSByb3dzIGluIHRoZSB2aWV3cG9ydFxuICAgKi9cbiAgdXBkYXRlSW5kZXhlcygpOiB2b2lkIHtcbiAgICBsZXQgZmlyc3QgPSAwO1xuICAgIGxldCBsYXN0ID0gMDtcblxuICAgIGlmICh0aGlzLnNjcm9sbGJhclYpIHtcbiAgICAgIGlmICh0aGlzLnZpcnR1YWxpemF0aW9uKSB7XG4gICAgICAgIC8vIENhbGN1bGF0aW9uIG9mIHRoZSBmaXJzdCBhbmQgbGFzdCBpbmRleGVzIHdpbGwgYmUgYmFzZWQgb24gd2hlcmUgdGhlXG4gICAgICAgIC8vIHNjcm9sbFkgcG9zaXRpb24gd291bGQgYmUgYXQuICBUaGUgbGFzdCBpbmRleCB3b3VsZCBiZSB0aGUgb25lXG4gICAgICAgIC8vIHRoYXQgc2hvd3MgdXAgaW5zaWRlIHRoZSB2aWV3IHBvcnQgdGhlIGxhc3QuXG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHBhcnNlSW50KHRoaXMuYm9keUhlaWdodCwgMCk7XG4gICAgICAgIGZpcnN0ID0gdGhpcy5yb3dIZWlnaHRzQ2FjaGUuZ2V0Um93SW5kZXgodGhpcy5vZmZzZXRZKTtcbiAgICAgICAgbGFzdCA9IHRoaXMucm93SGVpZ2h0c0NhY2hlLmdldFJvd0luZGV4KGhlaWdodCArIHRoaXMub2Zmc2V0WSkgKyAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWYgdmlydHVhbCByb3dzIGFyZSBub3QgbmVlZGVkXG4gICAgICAgIC8vIFdlIHJlbmRlciBhbGwgaW4gb25lIGdvXG4gICAgICAgIGZpcnN0ID0gMDtcbiAgICAgICAgbGFzdCA9IHRoaXMucm93Q291bnQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSBzZXJ2ZXIgaXMgaGFuZGxpbmcgcGFnaW5nIGFuZCB3aWxsIHBhc3MgYW4gYXJyYXkgdGhhdCBiZWdpbnMgd2l0aCB0aGVcbiAgICAgIC8vIGVsZW1lbnQgYXQgYSBzcGVjaWZpZWQgb2Zmc2V0LiAgZmlyc3Qgc2hvdWxkIGFsd2F5cyBiZSAwIHdpdGggZXh0ZXJuYWwgcGFnaW5nLlxuICAgICAgaWYgKCF0aGlzLmV4dGVybmFsUGFnaW5nKSB7XG4gICAgICAgIGZpcnN0ID0gTWF0aC5tYXgodGhpcy5vZmZzZXQgKiB0aGlzLnBhZ2VTaXplLCAwKTtcbiAgICAgIH1cbiAgICAgIGxhc3QgPSBNYXRoLm1pbihmaXJzdCArIHRoaXMucGFnZVNpemUsIHRoaXMucm93Q291bnQpO1xuICAgIH1cblxuICAgIHRoaXMuaW5kZXhlcyA9IHsgZmlyc3QsIGxhc3QgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZyZXNoZXMgdGhlIGZ1bGwgUm93IEhlaWdodCBjYWNoZS4gIFNob3VsZCBiZSB1c2VkXG4gICAqIHdoZW4gdGhlIGVudGlyZSByb3cgYXJyYXkgc3RhdGUgaGFzIGNoYW5nZWQuXG4gICAqL1xuICByZWZyZXNoUm93SGVpZ2h0Q2FjaGUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNjcm9sbGJhclYgfHwgKHRoaXMuc2Nyb2xsYmFyViAmJiAhdGhpcy52aXJ0dWFsaXphdGlvbikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBjbGVhciB0aGUgcHJldmlvdXMgcm93IGhlaWdodCBjYWNoZSBpZiBhbHJlYWR5IHByZXNlbnQuXG4gICAgLy8gdGhpcyBpcyB1c2VmdWwgZHVyaW5nIHNvcnRzLCBmaWx0ZXJzIHdoZXJlIHRoZSBzdGF0ZSBvZiB0aGVcbiAgICAvLyByb3dzIGFycmF5IGlzIGNoYW5nZWQuXG4gICAgdGhpcy5yb3dIZWlnaHRzQ2FjaGUuY2xlYXJDYWNoZSgpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgdHJlZSBvbmx5IGlmIHRoZXJlIGFyZSByb3dzIGluc2lkZSB0aGUgdHJlZS5cbiAgICBpZiAodGhpcy5yb3dzICYmIHRoaXMucm93cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMucm93SGVpZ2h0c0NhY2hlLmluaXRDYWNoZSh7XG4gICAgICAgIHJvd3M6IHRoaXMucm93cyxcbiAgICAgICAgcm93SGVpZ2h0OiB0aGlzLnJvd0hlaWdodCxcbiAgICAgICAgZGV0YWlsUm93SGVpZ2h0OiB0aGlzLmdldERldGFpbFJvd0hlaWdodCxcbiAgICAgICAgZXh0ZXJuYWxWaXJ0dWFsOiB0aGlzLnNjcm9sbGJhclYgJiYgdGhpcy5leHRlcm5hbFBhZ2luZyxcbiAgICAgICAgcm93Q291bnQ6IHRoaXMucm93Q291bnQsXG4gICAgICAgIHJvd0luZGV4ZXM6IHRoaXMucm93SW5kZXhlcyxcbiAgICAgICAgcm93RXhwYW5zaW9uczogdGhpcy5yb3dFeHBhbnNpb25zXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgaW5kZXggZm9yIHRoZSB2aWV3IHBvcnRcbiAgICovXG4gIGdldEFkanVzdGVkVmlld1BvcnRJbmRleCgpOiBudW1iZXIge1xuICAgIC8vIENhcHR1cmUgdGhlIHJvdyBpbmRleCBvZiB0aGUgZmlyc3Qgcm93IHRoYXQgaXMgdmlzaWJsZSBvbiB0aGUgdmlld3BvcnQuXG4gICAgLy8gSWYgdGhlIHNjcm9sbCBiYXIgaXMganVzdCBiZWxvdyB0aGUgcm93IHdoaWNoIGlzIGhpZ2hsaWdodGVkIHRoZW4gbWFrZSB0aGF0IGFzIHRoZVxuICAgIC8vIGZpcnN0IGluZGV4LlxuICAgIGNvbnN0IHZpZXdQb3J0Rmlyc3RSb3dJbmRleCA9IHRoaXMuaW5kZXhlcy5maXJzdDtcblxuICAgIGlmICh0aGlzLnNjcm9sbGJhclYgJiYgdGhpcy52aXJ0dWFsaXphdGlvbikge1xuICAgICAgY29uc3Qgb2Zmc2V0U2Nyb2xsID0gdGhpcy5yb3dIZWlnaHRzQ2FjaGUucXVlcnkodmlld1BvcnRGaXJzdFJvd0luZGV4IC0gMSk7XG4gICAgICByZXR1cm4gb2Zmc2V0U2Nyb2xsIDw9IHRoaXMub2Zmc2V0WSA/IHZpZXdQb3J0Rmlyc3RSb3dJbmRleCAtIDEgOiB2aWV3UG9ydEZpcnN0Um93SW5kZXg7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZpZXdQb3J0Rmlyc3RSb3dJbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgdGhlIEV4cGFuc2lvbiBvZiB0aGUgcm93IGkuZS4gaWYgdGhlIHJvdyBpcyBleHBhbmRlZCB0aGVuIGl0IHdpbGxcbiAgICogY29sbGFwc2UgYW5kIHZpY2UgdmVyc2EuICAgTm90ZSB0aGF0IHRoZSBleHBhbmRlZCBzdGF0dXMgaXMgc3RvcmVkIGFzXG4gICAqIGEgcGFydCBvZiB0aGUgcm93IG9iamVjdCBpdHNlbGYgYXMgd2UgaGF2ZSB0byBwcmVzZXJ2ZSB0aGUgZXhwYW5kZWQgcm93XG4gICAqIHN0YXR1cyBpbiBjYXNlIG9mIHNvcnRpbmcgYW5kIGZpbHRlcmluZyBvZiB0aGUgcm93IHNldC5cbiAgICovXG4gIHRvZ2dsZVJvd0V4cGFuc2lvbihyb3c6IGFueSk6IHZvaWQge1xuICAgIC8vIENhcHR1cmUgdGhlIHJvdyBpbmRleCBvZiB0aGUgZmlyc3Qgcm93IHRoYXQgaXMgdmlzaWJsZSBvbiB0aGUgdmlld3BvcnQuXG4gICAgY29uc3Qgdmlld1BvcnRGaXJzdFJvd0luZGV4ID0gdGhpcy5nZXRBZGp1c3RlZFZpZXdQb3J0SW5kZXgoKTtcbiAgICBsZXQgZXhwYW5kZWQgPSB0aGlzLnJvd0V4cGFuc2lvbnMuZ2V0KHJvdyk7XG5cbiAgICAvLyBJZiB0aGUgZGV0YWlsUm93SGVpZ2h0IGlzIGF1dG8gLS0+IG9ubHkgaW4gY2FzZSBvZiBub24tdmlydHVhbGl6ZWQgc2Nyb2xsXG4gICAgaWYgKHRoaXMuc2Nyb2xsYmFyViAmJiB0aGlzLnZpcnR1YWxpemF0aW9uKSB7XG4gICAgICBjb25zdCBkZXRhaWxSb3dIZWlnaHQgPSB0aGlzLmdldERldGFpbFJvd0hlaWdodChyb3cpICogKGV4cGFuZGVkID8gLTEgOiAxKTtcbiAgICAgIC8vIGNvbnN0IGlkeCA9IHRoaXMucm93SW5kZXhlcy5nZXQocm93KSB8fCAwO1xuICAgICAgY29uc3QgaWR4ID0gdGhpcy5nZXRSb3dJbmRleChyb3cpO1xuICAgICAgdGhpcy5yb3dIZWlnaHRzQ2FjaGUudXBkYXRlKGlkeCwgZGV0YWlsUm93SGVpZ2h0KTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdGhlIHRvZ2dsZWQgcm93IGFuZCB1cGRhdGUgdGhpdmUgbmV2ZXJlIGhlaWdodHMgaW4gdGhlIGNhY2hlLlxuICAgIGV4cGFuZGVkID0gZXhwYW5kZWQgXj0gMTtcbiAgICB0aGlzLnJvd0V4cGFuc2lvbnMuc2V0KHJvdywgZXhwYW5kZWQpO1xuXG4gICAgdGhpcy5kZXRhaWxUb2dnbGUuZW1pdCh7XG4gICAgICByb3dzOiBbcm93XSxcbiAgICAgIGN1cnJlbnRJbmRleDogdmlld1BvcnRGaXJzdFJvd0luZGV4XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXhwYW5kL0NvbGxhcHNlIGFsbCB0aGUgcm93cyBubyBtYXR0ZXIgd2hhdCB0aGVpciBzdGF0ZSBpcy5cbiAgICovXG4gIHRvZ2dsZUFsbFJvd3MoZXhwYW5kZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvLyBjbGVhciBwcmV2IGV4cGFuc2lvbnNcbiAgICB0aGlzLnJvd0V4cGFuc2lvbnMuY2xlYXIoKTtcblxuICAgIGNvbnN0IHJvd0V4cGFuZGVkID0gZXhwYW5kZWQgPyAxIDogMDtcblxuICAgIC8vIENhcHR1cmUgdGhlIHJvdyBpbmRleCBvZiB0aGUgZmlyc3Qgcm93IHRoYXQgaXMgdmlzaWJsZSBvbiB0aGUgdmlld3BvcnQuXG4gICAgY29uc3Qgdmlld1BvcnRGaXJzdFJvd0luZGV4ID0gdGhpcy5nZXRBZGp1c3RlZFZpZXdQb3J0SW5kZXgoKTtcblxuICAgIGZvciAoY29uc3Qgcm93IG9mIHRoaXMucm93cykge1xuICAgICAgdGhpcy5yb3dFeHBhbnNpb25zLnNldChyb3csIHJvd0V4cGFuZGVkKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zY3JvbGxiYXJWKSB7XG4gICAgICAvLyBSZWZyZXNoIHRoZSBmdWxsIHJvdyBoZWlnaHRzIGNhY2hlIHNpbmNlIGV2ZXJ5IHJvdyB3YXMgYWZmZWN0ZWQuXG4gICAgICB0aGlzLnJlY2FsY0xheW91dCgpO1xuICAgIH1cblxuICAgIC8vIEVtaXQgYWxsIHJvd3MgdGhhdCBoYXZlIGJlZW4gZXhwYW5kZWQuXG4gICAgdGhpcy5kZXRhaWxUb2dnbGUuZW1pdCh7XG4gICAgICByb3dzOiB0aGlzLnJvd3MsXG4gICAgICBjdXJyZW50SW5kZXg6IHZpZXdQb3J0Rmlyc3RSb3dJbmRleFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY2FsY3VsYXRlcyB0aGUgdGFibGVcbiAgICovXG4gIHJlY2FsY0xheW91dCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZnJlc2hSb3dIZWlnaHRDYWNoZSgpO1xuICAgIHRoaXMudXBkYXRlSW5kZXhlcygpO1xuICAgIHRoaXMudXBkYXRlUm93cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrcyB0aGUgY29sdW1uXG4gICAqL1xuICBjb2x1bW5UcmFja2luZ0ZuKGluZGV4OiBudW1iZXIsIGNvbHVtbjogYW55KTogYW55IHtcbiAgICByZXR1cm4gY29sdW1uLiQkaWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgcm93IHBpbm5pbmcgZ3JvdXAgc3R5bGVzXG4gICAqL1xuICBzdHlsZXNCeUdyb3VwKGdyb3VwOiBzdHJpbmcpIHtcbiAgICBjb25zdCB3aWR0aHMgPSB0aGlzLmNvbHVtbkdyb3VwV2lkdGhzO1xuICAgIGNvbnN0IG9mZnNldFggPSB0aGlzLm9mZnNldFg7XG5cbiAgICBjb25zdCBzdHlsZXMgPSB7XG4gICAgICB3aWR0aDogYCR7d2lkdGhzW2dyb3VwXX1weGBcbiAgICB9O1xuXG4gICAgaWYgKGdyb3VwID09PSAnbGVmdCcpIHtcbiAgICAgIHRyYW5zbGF0ZVhZKHN0eWxlcywgb2Zmc2V0WCwgMCk7XG4gICAgfSBlbHNlIGlmIChncm91cCA9PT0gJ3JpZ2h0Jykge1xuICAgICAgY29uc3QgYm9keVdpZHRoID0gcGFyc2VJbnQodGhpcy5pbm5lcldpZHRoICsgJycsIDApO1xuICAgICAgY29uc3QgdG90YWxEaWZmID0gd2lkdGhzLnRvdGFsIC0gYm9keVdpZHRoO1xuICAgICAgY29uc3Qgb2Zmc2V0RGlmZiA9IHRvdGFsRGlmZiAtIG9mZnNldFg7XG4gICAgICBjb25zdCBvZmZzZXQgPSBvZmZzZXREaWZmICogLTE7XG4gICAgICB0cmFuc2xhdGVYWShzdHlsZXMsIG9mZnNldCwgMCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0eWxlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGlmIHRoZSByb3cgd2FzIGV4cGFuZGVkIGFuZCBzZXQgZGVmYXVsdCByb3cgZXhwYW5zaW9uIHdoZW4gcm93IGV4cGFuc2lvbiBpcyBlbXB0eVxuICAgKi9cbiAgZ2V0Um93RXhwYW5kZWQocm93OiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5yb3dFeHBhbnNpb25zLnNpemUgPT09IDAgJiYgdGhpcy5ncm91cEV4cGFuc2lvbkRlZmF1bHQpIHtcbiAgICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgdGhpcy5ncm91cGVkUm93cykge1xuICAgICAgICB0aGlzLnJvd0V4cGFuc2lvbnMuc2V0KGdyb3VwLCAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBleHBhbmRlZCA9IHRoaXMucm93RXhwYW5zaW9ucy5nZXQocm93KTtcbiAgICByZXR1cm4gZXhwYW5kZWQgPT09IDE7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgcm93IGluZGV4IGdpdmVuIGEgcm93XG4gICAqL1xuICBnZXRSb3dJbmRleChyb3c6IGFueSk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucm93SW5kZXhlcy5nZXQocm93KSB8fCAwO1xuICB9XG5cbiAgb25UcmVlQWN0aW9uKHJvdzogYW55KSB7XG4gICAgdGhpcy50cmVlQWN0aW9uLmVtaXQoeyByb3cgfSk7XG4gIH1cbn1cbiJdfQ==
|