@dbg-riskit/angular-testing 12.3.0 → 9999.9999.9999-rc.12148
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/dbg-riskit-angular-testing.d.ts +1 -0
- package/docs/README.md +1 -11
- package/{esm2015/dbg-riskit-angular-testing.js → esm2020/dbg-riskit-angular-testing.mjs} +0 -0
- package/{esm2015/lib/by.util.js → esm2020/lib/by.util.mjs} +0 -0
- package/esm2020/lib/cached.resource.provider.mjs +17 -0
- package/esm2020/lib/definitions/data.table.definition.mjs +556 -0
- package/esm2020/lib/definitions/download.menu.page.mjs +90 -0
- package/esm2020/lib/definitions/highlighter.directive.page.mjs +36 -0
- package/esm2020/lib/definitions/layout.component.page.mjs +93 -0
- package/{esm2015/lib/definitions/link.definition.js → esm2020/lib/definitions/link.definition.mjs} +0 -0
- package/{esm2015/lib/definitions/link.only.page.js → esm2020/lib/definitions/link.only.page.mjs} +0 -0
- package/{esm2015/lib/definitions/login.menu.page.js → esm2020/lib/definitions/login.menu.page.mjs} +0 -0
- package/{esm2015/lib/definitions/login.page.js → esm2020/lib/definitions/login.page.mjs} +4 -4
- package/{esm2015/lib/definitions/message.def.js → esm2020/lib/definitions/message.def.mjs} +0 -0
- package/esm2020/lib/definitions/message.page.mjs +68 -0
- package/esm2020/lib/definitions/page.base.mjs +64 -0
- package/esm2020/lib/environment.mjs +23 -0
- package/esm2020/lib/events.mjs +60 -0
- package/esm2020/lib/stubs/auth/auth.routing.flow.service.stub.mjs +37 -0
- package/esm2020/lib/stubs/auth/auth.service.stub.mjs +40 -0
- package/esm2020/lib/stubs/auth/well.known.service.stub.mjs +22 -0
- package/esm2020/lib/stubs/http.service.stub.mjs +54 -0
- package/esm2020/lib/stubs/login.menu.stub.component.mjs +19 -0
- package/esm2020/lib/stubs/router/activated.route.stub.mjs +29 -0
- package/esm2020/lib/stubs/router/router.link.stub.mjs +46 -0
- package/{esm2015/lib/stubs/router/router.module.stub.js → esm2020/lib/stubs/router/router.module.stub.mjs} +4 -4
- package/esm2020/lib/stubs/router/router.outlet.stub.component.mjs +16 -0
- package/esm2020/lib/stubs/router/router.stub.mjs +79 -0
- package/esm2020/lib/testing.module.mjs +52 -0
- package/esm2020/lib/utils.mjs +48 -0
- package/{esm2015/public_api.js → esm2020/public_api.mjs} +4 -4
- package/fesm2015/{dbg-riskit-angular-testing.js → dbg-riskit-angular-testing.mjs} +263 -128
- package/fesm2015/dbg-riskit-angular-testing.mjs.map +1 -0
- package/fesm2020/dbg-riskit-angular-testing.mjs +1570 -0
- package/fesm2020/dbg-riskit-angular-testing.mjs.map +1 -0
- package/lib/definitions/data.table.definition.d.ts +3 -0
- package/lib/definitions/download.menu.page.d.ts +3 -0
- package/lib/definitions/highlighter.directive.page.d.ts +3 -0
- package/lib/definitions/layout.component.page.d.ts +5 -2
- package/lib/definitions/message.page.d.ts +3 -0
- package/lib/stubs/auth/auth.routing.flow.service.stub.d.ts +3 -0
- package/lib/stubs/auth/auth.service.stub.d.ts +3 -0
- package/lib/stubs/auth/well.known.service.stub.d.ts +3 -0
- package/lib/stubs/http.service.stub.d.ts +5 -0
- package/lib/stubs/login.menu.stub.component.d.ts +6 -0
- package/lib/stubs/router/activated.route.stub.d.ts +3 -0
- package/lib/stubs/router/router.link.stub.d.ts +5 -2
- package/lib/stubs/router/router.outlet.stub.component.d.ts +5 -0
- package/lib/stubs/router/router.stub.d.ts +3 -0
- package/lib/testing.module.d.ts +15 -0
- package/package.json +32 -20
- package/public_api.d.ts +3 -3
- package/bundles/dbg-riskit-angular-testing.umd.js +0 -2253
- package/bundles/dbg-riskit-angular-testing.umd.js.map +0 -1
- package/dbg-riskit-angular-testing.metadata.json +0 -1
- package/esm2015/lib/cached.resource.provider.js +0 -16
- package/esm2015/lib/definitions/data.table.definition.js +0 -508
- package/esm2015/lib/definitions/download.menu.page.js +0 -81
- package/esm2015/lib/definitions/highlighter.directive.page.js +0 -30
- package/esm2015/lib/definitions/layout.component.page.js +0 -73
- package/esm2015/lib/definitions/message.page.js +0 -54
- package/esm2015/lib/definitions/page.base.js +0 -64
- package/esm2015/lib/environment.js +0 -19
- package/esm2015/lib/events.js +0 -60
- package/esm2015/lib/stubs/auth/auth.routing.flow.service.stub.js +0 -31
- package/esm2015/lib/stubs/auth/auth.service.stub.js +0 -38
- package/esm2015/lib/stubs/auth/well.known.service.stub.js +0 -19
- package/esm2015/lib/stubs/http.service.stub.js +0 -49
- package/esm2015/lib/stubs/login.menu.component.stub.js +0 -16
- package/esm2015/lib/stubs/router/activated.route.stub.js +0 -26
- package/esm2015/lib/stubs/router/router.link.stub.js +0 -45
- package/esm2015/lib/stubs/router/router.outlet.stub.js +0 -12
- package/esm2015/lib/stubs/router/router.stub.js +0 -72
- package/esm2015/lib/testing.module.js +0 -34
- package/esm2015/lib/utils.js +0 -48
- package/fesm2015/dbg-riskit-angular-testing.js.map +0 -1
- package/lib/stubs/login.menu.component.stub.d.ts +0 -3
- package/lib/stubs/router/router.outlet.stub.d.ts +0 -2
|
@@ -1,508 +0,0 @@
|
|
|
1
|
-
import { Component } from '@angular/core';
|
|
2
|
-
import { MatAnchor, MatButton } from '@angular/material/button';
|
|
3
|
-
import { MatButtonToggle } from '@angular/material/button-toggle';
|
|
4
|
-
import { MatIcon } from '@angular/material/icon';
|
|
5
|
-
import { MatTooltip } from '@angular/material/tooltip';
|
|
6
|
-
import { By } from '@angular/platform-browser';
|
|
7
|
-
import { secureRandom } from '@dbg-riskit/common';
|
|
8
|
-
import { DataTableComponent, DataTableRowDetailExpander, HIGHLIGHTER_CLASS, PagingComponent } from '@dbg-riskit/angular-datatable';
|
|
9
|
-
import { click } from '../events';
|
|
10
|
-
import { Page } from './page.base';
|
|
11
|
-
export class DataTableDefinition {
|
|
12
|
-
constructor(debugElement, page) {
|
|
13
|
-
this.debugElement = debugElement;
|
|
14
|
-
this.page = page;
|
|
15
|
-
}
|
|
16
|
-
get component() {
|
|
17
|
-
return this.debugElement.componentInstance;
|
|
18
|
-
}
|
|
19
|
-
get data() {
|
|
20
|
-
return this.component.plainData;
|
|
21
|
-
}
|
|
22
|
-
get element() {
|
|
23
|
-
return this.debugElement.query(By.css('.risk-data-table-wrapper > table'));
|
|
24
|
-
}
|
|
25
|
-
get header() {
|
|
26
|
-
return new TableHeader(this.debugElement.query((de) => de.references.mainHeader), this.page);
|
|
27
|
-
}
|
|
28
|
-
get sorting() {
|
|
29
|
-
return new TableSorting(this, this.page);
|
|
30
|
-
}
|
|
31
|
-
get body() {
|
|
32
|
-
return new TableBody(this.debugElement.query((de) => de.references.mainBody), this.page);
|
|
33
|
-
}
|
|
34
|
-
get footer() {
|
|
35
|
-
return new TableFooter(this.debugElement.query((de) => de.references.mainFooter));
|
|
36
|
-
}
|
|
37
|
-
get recordsCount() {
|
|
38
|
-
return new RecordsCount(this.debugElement.query(By.css('.risk-data-table-page-count')));
|
|
39
|
-
}
|
|
40
|
-
get pager() {
|
|
41
|
-
return new Pager(this.debugElement.query(By.directive(PagingComponent)), this.page);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
// <editor-fold defaultstate="collapsed" desc="Table header">
|
|
45
|
-
export class TableHeader {
|
|
46
|
-
constructor(element, page) {
|
|
47
|
-
this.element = element;
|
|
48
|
-
this.page = page;
|
|
49
|
-
}
|
|
50
|
-
get rows() {
|
|
51
|
-
return this.element.queryAll(By.css('tr')).map((element) => {
|
|
52
|
-
return new TableHeaderRow(element, this.page);
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
get cells() {
|
|
56
|
-
return this.element.queryAll(By.css('th')).map((element) => {
|
|
57
|
-
return new TableHeaderCell(element, this.page);
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
export class TableHeaderRow {
|
|
62
|
-
constructor(element, page) {
|
|
63
|
-
this.element = element;
|
|
64
|
-
this.page = page;
|
|
65
|
-
}
|
|
66
|
-
get cells() {
|
|
67
|
-
return this.element.queryAll(By.css('th')).map((element) => {
|
|
68
|
-
return new TableHeaderCell(element, this.page);
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
export class TableHeaderCell {
|
|
73
|
-
constructor(element, page) {
|
|
74
|
-
this.element = element;
|
|
75
|
-
this.page = page;
|
|
76
|
-
}
|
|
77
|
-
get sortingHandle() {
|
|
78
|
-
const handle = this.element.query(By.directive(MatButton));
|
|
79
|
-
if (handle) {
|
|
80
|
-
return new SortingHandle(this.page, handle);
|
|
81
|
-
}
|
|
82
|
-
return null;
|
|
83
|
-
}
|
|
84
|
-
get tooltip() {
|
|
85
|
-
const handle = this.element.query(By.directive(MatTooltip));
|
|
86
|
-
if (handle) {
|
|
87
|
-
return handle.injector.get(MatTooltip).message;
|
|
88
|
-
}
|
|
89
|
-
return null;
|
|
90
|
-
}
|
|
91
|
-
get title() {
|
|
92
|
-
const textNode = this.element.childNodes.find((node) => node.nativeNode.nodeType === Node.TEXT_NODE);
|
|
93
|
-
if (textNode != null) {
|
|
94
|
-
return textNode
|
|
95
|
-
.nativeNode.textContent.trim();
|
|
96
|
-
}
|
|
97
|
-
return '';
|
|
98
|
-
}
|
|
99
|
-
get colspan() {
|
|
100
|
-
return this.element.nativeElement.colspan;
|
|
101
|
-
}
|
|
102
|
-
get rowspan() {
|
|
103
|
-
return this.element.nativeElement.rowspan;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
// <editor-fold defaultstate="collapsed" desc="Sorting">
|
|
107
|
-
export class TableSorting {
|
|
108
|
-
constructor(table, page) {
|
|
109
|
-
this.table = table;
|
|
110
|
-
this.page = page;
|
|
111
|
-
}
|
|
112
|
-
get handles() {
|
|
113
|
-
const handles = this.table.debugElement.query((de) => de.references.mainHeader)
|
|
114
|
-
.queryAll(By.directive(MatButton));
|
|
115
|
-
if (!handles) {
|
|
116
|
-
return [];
|
|
117
|
-
}
|
|
118
|
-
return handles.map((handle) => {
|
|
119
|
-
return new SortingHandle(this.page, handle);
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
get detailRowHandles() {
|
|
123
|
-
const handles = this.table.debugElement.query(By.css('.risk-data-table-detail')).query(By.css('thead'))
|
|
124
|
-
.queryAll(By.directive(MatButton));
|
|
125
|
-
if (!handles) {
|
|
126
|
-
return null;
|
|
127
|
-
}
|
|
128
|
-
return handles.map((handle) => {
|
|
129
|
-
return new SortingHandle(this.page, handle);
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
get currentOrdering() {
|
|
133
|
-
return this.table.component.ordering;
|
|
134
|
-
}
|
|
135
|
-
checkSorting(firstNRows = this.table.component.rows.length, criterium) {
|
|
136
|
-
// WARN: call data once as it calls .map on all table rows
|
|
137
|
-
const data = this.table.data;
|
|
138
|
-
let ordering;
|
|
139
|
-
if (criterium) {
|
|
140
|
-
ordering = [criterium].concat(this.table.component._defaultOrdering);
|
|
141
|
-
}
|
|
142
|
-
else {
|
|
143
|
-
ordering = this.currentOrdering;
|
|
144
|
-
}
|
|
145
|
-
for (let i = 1; i < Math.min(data.length, firstNRows); i++) {
|
|
146
|
-
ordering.some((criteria) => {
|
|
147
|
-
//noinspection EqualityComparisonWithCoercionJS
|
|
148
|
-
const valueA = criteria.get(data[i - 1]);
|
|
149
|
-
const valueB = criteria.get(data[i]);
|
|
150
|
-
if (valueA == null && valueB == null) {
|
|
151
|
-
return false;
|
|
152
|
-
}
|
|
153
|
-
expect(valueA).not.toBeNull();
|
|
154
|
-
expect(valueA).not.toBeUndefined();
|
|
155
|
-
if (valueB != null) {
|
|
156
|
-
if (criteria.descending) {
|
|
157
|
-
expect(valueA >= valueB)
|
|
158
|
-
.toBeTruthy('Expect: ' + valueA + ' >= '
|
|
159
|
-
+ valueB);
|
|
160
|
-
}
|
|
161
|
-
else {
|
|
162
|
-
expect(valueA <= valueB)
|
|
163
|
-
.toBeTruthy('Expect: ' + valueA + ' <= '
|
|
164
|
-
+ valueB);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
return valueA !== valueB;
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
export class SortingHandle {
|
|
173
|
-
constructor(page, handle) {
|
|
174
|
-
this.page = page;
|
|
175
|
-
this.handle = handle;
|
|
176
|
-
}
|
|
177
|
-
click() {
|
|
178
|
-
click(this.handle);
|
|
179
|
-
this.page.detectChanges();
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
// </editor-fold>
|
|
183
|
-
// </editor-fold>
|
|
184
|
-
// <editor-fold defaultstate="collapsed" desc="Table body">
|
|
185
|
-
export class TableBody {
|
|
186
|
-
constructor(element, page) {
|
|
187
|
-
this.element = element;
|
|
188
|
-
this.page = page;
|
|
189
|
-
}
|
|
190
|
-
get rows() {
|
|
191
|
-
return this.element.queryAll((de) => de.references.masterRow).map((element) => {
|
|
192
|
-
return new TableBodyRow(element, this.page);
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
get cells() {
|
|
196
|
-
let cells = [];
|
|
197
|
-
this.element.queryAll((de) => de.references.masterRow).forEach((row) => {
|
|
198
|
-
cells = cells.concat(row.queryAll(By.css('td')).map((cell) => {
|
|
199
|
-
return new TableBodyCell(cell);
|
|
200
|
-
}));
|
|
201
|
-
});
|
|
202
|
-
return cells;
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
export class TableBodyRow {
|
|
206
|
-
constructor(element, page) {
|
|
207
|
-
this.element = element;
|
|
208
|
-
this.page = page;
|
|
209
|
-
}
|
|
210
|
-
expandRow() {
|
|
211
|
-
click(this.element);
|
|
212
|
-
this.page.detectChanges();
|
|
213
|
-
}
|
|
214
|
-
get expander() {
|
|
215
|
-
return new RowExpander(this.element.query(By.directive(DataTableRowDetailExpander)).query(By.directive(MatAnchor)));
|
|
216
|
-
}
|
|
217
|
-
get cells() {
|
|
218
|
-
return this.element.queryAll(By.css('td')).map((element) => {
|
|
219
|
-
return new TableBodyCell(element);
|
|
220
|
-
});
|
|
221
|
-
}
|
|
222
|
-
get rowDetail() {
|
|
223
|
-
const parent = this.element.parent;
|
|
224
|
-
if (parent != null) {
|
|
225
|
-
const next = parent.children[parent.children.indexOf(this.element) + 1];
|
|
226
|
-
if (next && !next.references.masterRow) {
|
|
227
|
-
return new TableBodyDetail(next, this.page);
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
return null;
|
|
231
|
-
}
|
|
232
|
-
get highlighted() {
|
|
233
|
-
return this.element.nativeElement.classList.contains(HIGHLIGHTER_CLASS);
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
export class RowExpander {
|
|
237
|
-
constructor(element) {
|
|
238
|
-
this.element = element;
|
|
239
|
-
}
|
|
240
|
-
get icon() {
|
|
241
|
-
return this.element.query(By.directive(MatIcon)).nativeElement.textContent.trim();
|
|
242
|
-
}
|
|
243
|
-
get opened() {
|
|
244
|
-
return this.icon === 'expand_less';
|
|
245
|
-
}
|
|
246
|
-
get closed() {
|
|
247
|
-
return this.icon === 'expand_more';
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
export class TableBodyCell {
|
|
251
|
-
constructor(element) {
|
|
252
|
-
this.element = element;
|
|
253
|
-
}
|
|
254
|
-
get colspan() {
|
|
255
|
-
return this.element.nativeElement.colspan;
|
|
256
|
-
}
|
|
257
|
-
get rowspan() {
|
|
258
|
-
return this.element.nativeElement.rowspan;
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
// <editor-fold defaultstate="collapsed" desc="Row detail">
|
|
262
|
-
export class TableBodyDetail {
|
|
263
|
-
constructor(element, page) {
|
|
264
|
-
this.element = element;
|
|
265
|
-
this.page = page;
|
|
266
|
-
}
|
|
267
|
-
header() {
|
|
268
|
-
return new TableHeader(this.element.query(By.css('thead')), this.page);
|
|
269
|
-
}
|
|
270
|
-
get body() {
|
|
271
|
-
return new TableBodyDetailBody(this.element.query(By.css('tbody')));
|
|
272
|
-
}
|
|
273
|
-
get highlighted() {
|
|
274
|
-
return this.element.nativeElement.classList.contains(HIGHLIGHTER_CLASS);
|
|
275
|
-
}
|
|
276
|
-
get colspan() {
|
|
277
|
-
return this.element.children[0].nativeElement.colspan;
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
export class TableBodyDetailBody {
|
|
281
|
-
constructor(element) {
|
|
282
|
-
this.element = element;
|
|
283
|
-
}
|
|
284
|
-
get rows() {
|
|
285
|
-
return this.element.queryAll(By.css('tr')).map((element) => {
|
|
286
|
-
return new TableBodyDetailRow(element);
|
|
287
|
-
});
|
|
288
|
-
}
|
|
289
|
-
get cells() {
|
|
290
|
-
let cells = [];
|
|
291
|
-
this.element.queryAll(By.css('tr')).forEach((row) => {
|
|
292
|
-
cells = cells.concat(row.queryAll(By.css('td')).map((cell) => {
|
|
293
|
-
return new TableBodyCell(cell);
|
|
294
|
-
}));
|
|
295
|
-
});
|
|
296
|
-
return cells;
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
export class TableBodyDetailRow {
|
|
300
|
-
constructor(element) {
|
|
301
|
-
this.element = element;
|
|
302
|
-
}
|
|
303
|
-
get cells() {
|
|
304
|
-
return this.element.queryAll(By.css('td')).map((element) => {
|
|
305
|
-
return new TableBodyCell(element);
|
|
306
|
-
});
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
// </editor-fold>
|
|
310
|
-
// </editor-fold>
|
|
311
|
-
// <editor-fold defaultstate="collapsed" desc="Table footer">
|
|
312
|
-
export class TableFooter {
|
|
313
|
-
constructor(element) {
|
|
314
|
-
this.element = element;
|
|
315
|
-
}
|
|
316
|
-
get rows() {
|
|
317
|
-
return this.element.queryAll(By.css('tr')).map((element) => {
|
|
318
|
-
return new TableFooterRow(element);
|
|
319
|
-
});
|
|
320
|
-
}
|
|
321
|
-
get cells() {
|
|
322
|
-
let cells = [];
|
|
323
|
-
this.element.queryAll(By.css('tr')).forEach((row) => {
|
|
324
|
-
cells = cells.concat(row.queryAll(By.css('th')).map((cell) => {
|
|
325
|
-
return new TableBodyCell(cell);
|
|
326
|
-
}));
|
|
327
|
-
});
|
|
328
|
-
return cells;
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
export class TableFooterRow {
|
|
332
|
-
constructor(element) {
|
|
333
|
-
this.element = element;
|
|
334
|
-
}
|
|
335
|
-
get cells() {
|
|
336
|
-
return this.element.queryAll(By.css('th')).map((element) => {
|
|
337
|
-
return new TableBodyCell(element);
|
|
338
|
-
});
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
// </editor-fold>
|
|
342
|
-
export class RecordsCount {
|
|
343
|
-
constructor(element) {
|
|
344
|
-
this.element = element;
|
|
345
|
-
}
|
|
346
|
-
get message() {
|
|
347
|
-
return this.element.nativeElement.textContent;
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
export class Pager {
|
|
351
|
-
constructor(element, page) {
|
|
352
|
-
this.element = element;
|
|
353
|
-
this.page = page;
|
|
354
|
-
}
|
|
355
|
-
get pageButtons() {
|
|
356
|
-
return this.element.queryAll(By.directive(MatButtonToggle));
|
|
357
|
-
}
|
|
358
|
-
expectLeadingButtonsDisabled() {
|
|
359
|
-
for (let i = 0; i < 2; i++) {
|
|
360
|
-
expect(this.pageButtons[i].classes['mat-button-toggle-disabled'])
|
|
361
|
-
.toBe(true, 'First two are disabled.');
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
expectLeadingButtonsNotDisabled() {
|
|
365
|
-
for (let i = 0; i < 2; i++) {
|
|
366
|
-
expect(this.pageButtons[i].classes['mat-button-toggle-disabled'])
|
|
367
|
-
.not.toBe(true, 'First two are not disabled.');
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
expectTrailingButtonsDisabled() {
|
|
371
|
-
for (let i = this.pageButtons.length - 1; i > this.pageButtons.length - 3; i--) {
|
|
372
|
-
expect(this.pageButtons[i].classes['mat-button-toggle-disabled'])
|
|
373
|
-
.toBe(true, 'Last two are disabled.');
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
expectTrailingButtonsNotDisabled() {
|
|
377
|
-
for (let i = this.pageButtons.length - 1; i > this.pageButtons.length - 3; i--) {
|
|
378
|
-
expect(this.pageButtons[i].classes['mat-button-toggle-disabled'])
|
|
379
|
-
.not.toBe(true, 'Last two are not disabled.');
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
expectButtonNumbers(numbers) {
|
|
383
|
-
for (let i = 0; i < numbers.length; i++) {
|
|
384
|
-
expect(this.pageButtons[i + 2].query(By.css('.mat-button-toggle-label-content'))
|
|
385
|
-
.nativeElement.textContent.trim())
|
|
386
|
-
.toEqual(numbers[i] + '', 'Button numbers are correct');
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
expectButtonActive(index) {
|
|
390
|
-
expect(this.pageButtons[index].classes['mat-button-toggle-checked'])
|
|
391
|
-
.toBe(true, 'Button is active.');
|
|
392
|
-
}
|
|
393
|
-
click(index) {
|
|
394
|
-
click(this.pageButtons[index].query(By.css('.mat-button-toggle-label-content')).nativeElement);
|
|
395
|
-
this.page.detectChanges();
|
|
396
|
-
this.page.advanceAndDetectChanges();
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
export function chceckSorting(page, criteria) {
|
|
400
|
-
page.dataTable.sorting.checkSorting(150);
|
|
401
|
-
page.dataTable.sorting.handles.forEach((handle, index) => {
|
|
402
|
-
// Tigger sort based on a handle
|
|
403
|
-
handle.click();
|
|
404
|
-
page.detectChanges();
|
|
405
|
-
// Check the sorting
|
|
406
|
-
page.dataTable.sorting.checkSorting(150, {
|
|
407
|
-
get: criteria[index]
|
|
408
|
-
});
|
|
409
|
-
// Tigger sort based on a handle
|
|
410
|
-
handle.click();
|
|
411
|
-
page.detectChanges();
|
|
412
|
-
// Check the sorting
|
|
413
|
-
page.dataTable.sorting.checkSorting(150, {
|
|
414
|
-
get: criteria[index],
|
|
415
|
-
descending: true
|
|
416
|
-
});
|
|
417
|
-
});
|
|
418
|
-
}
|
|
419
|
-
export class DataTableDefinitionHosted extends Page {
|
|
420
|
-
constructor(fixture) {
|
|
421
|
-
super(fixture);
|
|
422
|
-
}
|
|
423
|
-
get dataTable() {
|
|
424
|
-
return new DataTableDefinition(this.debugElement.query(By.directive(DataTableComponent)), this);
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
export class TestDataTableHostComponent {
|
|
428
|
-
constructor() {
|
|
429
|
-
this.data = [];
|
|
430
|
-
for (let i = 0; i < 500; i++) {
|
|
431
|
-
this.data.push({
|
|
432
|
-
value1: Math.floor(secureRandom() * 20) + ' - value 1',
|
|
433
|
-
value2: Math.floor(secureRandom() * 20) + ' - value 2',
|
|
434
|
-
value3: Math.floor(secureRandom() * 20) + ' - value 3'
|
|
435
|
-
});
|
|
436
|
-
}
|
|
437
|
-
this.footer = this.data[0];
|
|
438
|
-
}
|
|
439
|
-
get defaultOrdering() {
|
|
440
|
-
return [
|
|
441
|
-
{
|
|
442
|
-
get: (record) => {
|
|
443
|
-
return record.value3;
|
|
444
|
-
},
|
|
445
|
-
descending: true
|
|
446
|
-
},
|
|
447
|
-
(record) => {
|
|
448
|
-
return record.value2;
|
|
449
|
-
}
|
|
450
|
-
];
|
|
451
|
-
}
|
|
452
|
-
get valueGetter() {
|
|
453
|
-
return (record) => {
|
|
454
|
-
return record.value1;
|
|
455
|
-
};
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
|
-
TestDataTableHostComponent.decorators = [
|
|
459
|
-
{ type: Component, args: [{
|
|
460
|
-
template: `
|
|
461
|
-
<risk-data-table [data]="data"
|
|
462
|
-
[footer]="footer"
|
|
463
|
-
[pageSize]="20"
|
|
464
|
-
[defaultOrdering]="defaultOrdering"
|
|
465
|
-
[striped]="true">
|
|
466
|
-
<risk-data-table-column title="Test Column 1"
|
|
467
|
-
[sortingKey]="valueGetter">
|
|
468
|
-
<ng-template let-record="row" risk-data-table-cell>
|
|
469
|
-
{{record.value1}}
|
|
470
|
-
</ng-template>
|
|
471
|
-
</risk-data-table-column>
|
|
472
|
-
<risk-data-table-column>
|
|
473
|
-
<ng-template risk-data-table-cell let-record="row" let-expanded="expanded">
|
|
474
|
-
<risk-data-table-detail-expander [expanded]="expanded"></risk-data-table-detail-expander>
|
|
475
|
-
</ng-template>
|
|
476
|
-
<ng-template risk-data-table-footer-cell let-footer="footer">
|
|
477
|
-
{{footer.value1}}
|
|
478
|
-
</ng-template>
|
|
479
|
-
</risk-data-table-column>
|
|
480
|
-
<!-- Sub detail -->
|
|
481
|
-
<risk-data-table-detail-row>
|
|
482
|
-
<risk-data-table-column-group>
|
|
483
|
-
<risk-data-table-column title="Test Detail Column 1"
|
|
484
|
-
[sortingKey]="valueGetter">
|
|
485
|
-
<ng-template risk-data-table-cell let-record="row">
|
|
486
|
-
{{record.value1}}
|
|
487
|
-
</ng-template>
|
|
488
|
-
</risk-data-table-column>
|
|
489
|
-
</risk-data-table-column-group>
|
|
490
|
-
<risk-data-table-column-group>
|
|
491
|
-
<risk-data-table-column title="Test Detail Column 2">
|
|
492
|
-
<ng-template risk-data-table-cell let-record="row">
|
|
493
|
-
{{record.value2}}
|
|
494
|
-
</ng-template>
|
|
495
|
-
</risk-data-table-column>
|
|
496
|
-
<risk-data-table-column title="Test Detail Column 3">
|
|
497
|
-
<ng-template risk-data-table-cell let-record="row">
|
|
498
|
-
{{record.value3}}
|
|
499
|
-
</ng-template>
|
|
500
|
-
</risk-data-table-column>
|
|
501
|
-
</risk-data-table-column-group>
|
|
502
|
-
<risk-data-table-column-group></risk-data-table-column-group>
|
|
503
|
-
</risk-data-table-detail-row>
|
|
504
|
-
</risk-data-table>`
|
|
505
|
-
},] }
|
|
506
|
-
];
|
|
507
|
-
TestDataTableHostComponent.ctorParameters = () => [];
|
|
508
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS50YWJsZS5kZWZpbml0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGtnL2RiZy1yaXNraXQvYW5ndWxhci10ZXN0aW5nL3NyYy9saWIvZGVmaW5pdGlvbnMvZGF0YS50YWJsZS5kZWZpbml0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQTBCLE1BQU0sZUFBZSxDQUFDO0FBRWpFLE9BQU8sRUFBQyxTQUFTLEVBQUUsU0FBUyxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDOUQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ2hFLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUMvQyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDckQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQzdDLE9BQU8sRUFBYyxZQUFZLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUM3RCxPQUFPLEVBQ0gsa0JBQWtCLEVBQ2xCLDBCQUEwQixFQUMxQixpQkFBaUIsRUFFakIsZUFBZSxFQUNsQixNQUFNLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDaEMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUVqQyxNQUFNLE9BQU8sbUJBQW1CO0lBRTVCLFlBQTBCLFlBQTBCLEVBQ3pCLElBQXdFO1FBRHpFLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQ3pCLFNBQUksR0FBSixJQUFJLENBQW9FO0lBQ25HLENBQUM7SUFFRCxJQUFXLFNBQVM7UUFDaEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDO0lBQy9DLENBQUM7SUFFRCxJQUFXLElBQUk7UUFDWCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMs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QUksQ0FBQyxJQUFJLENBQUM7Z0JBQ1gsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsWUFBWTtnQkFDdEQsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsWUFBWTtnQkFDdEQsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsWUFBWTthQUN6RCxDQUFDLENBQUM7U0FDTjtRQUNELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBVyxlQUFlO1FBQ3RCLE9BQU87WUFDSDtnQkFDSSxHQUFHLEVBQVMsQ0FBQyxNQUFXLEVBQUUsRUFBRTtvQkFDeEIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUN6QixDQUFDO2dCQUNELFVBQVUsRUFBRSxJQUFJO2FBQ25CO1lBQ0QsQ0FBQyxNQUFXLEVBQUUsRUFBRTtnQkFDWixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDekIsQ0FBQztTQUNKLENBQUM7SUFDTixDQUFDO0lBRUQsSUFBVyxXQUFXO1FBQ2xCLE9BQU8sQ0FBQyxNQUFXLEVBQUUsRUFBRTtZQUNuQixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDekIsQ0FBQyxDQUFDO0lBQ04sQ0FBQzs7O1lBbkZKLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzJCQTRDYTthQUMxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBEZWJ1Z0VsZW1lbnQsIERlYnVnTm9kZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0NvbXBvbmVudEZpeHR1cmV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvdGVzdGluZyc7XG5pbXBvcnQge01hdEFuY2hvciwgTWF0QnV0dG9ufSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHtNYXRCdXR0b25Ub2dnbGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbi10b2dnbGUnO1xuaW1wb3J0IHtNYXRJY29ufSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7TWF0VG9vbHRpcH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5pbXBvcnQge0J5fSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7VmFsdWVHZXR0ZXIsIHNlY3VyZVJhbmRvbX0gZnJvbSAnQGRiZy1yaXNraXQvY29tbW9uJztcbmltcG9ydCB7XG4gICAgRGF0YVRhYmxlQ29tcG9uZW50LFxuICAgIERhdGFUYWJsZVJvd0RldGFpbEV4cGFuZGVyLFxuICAgIEhJR0hMSUdIVEVSX0NMQVNTLFxuICAgIE9yZGVyaW5nQ3JpdGVyaWEsXG4gICAgUGFnaW5nQ29tcG9uZW50XG59IGZyb20gJ0BkYmctcmlza2l0L2FuZ3VsYXItZGF0YXRhYmxlJztcbmltcG9ydCB7Y2xpY2t9IGZyb20gJy4uL2V2ZW50cyc7XG5pbXBvcnQge1BhZ2V9IGZyb20gJy4vcGFnZS5iYXNlJztcblxuZXhwb3J0IGNsYXNzIERhdGFUYWJsZURlZmluaXRpb24ge1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBkZWJ1Z0VsZW1lbnQ6IERlYnVnRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBwYWdlOiB7IGRldGVjdENoYW5nZXM6ICgpID0+IHZvaWQsIGFkdmFuY2VBbmREZXRlY3RDaGFuZ2VzOiAoKSA9PiB2b2lkIH0pIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNvbXBvbmVudCgpOiBEYXRhVGFibGVDb21wb25lbnQ8dW5rbm93biwgdW5rbm93bj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWJ1Z0VsZW1lbnQuY29tcG9uZW50SW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkYXRhKCk6IGFueVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcG9uZW50LnBsYWluRGF0YTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGVsZW1lbnQoKTogRGVidWdFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVidWdFbGVtZW50LnF1ZXJ5KEJ5LmNzcygnLnJpc2stZGF0YS10YWJsZS13cmFwcGVyID4gdGFibGUnKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoZWFkZXIoKTogVGFibGVIZWFkZXIge1xuICAgICAgICByZXR1cm4gbmV3IFRhYmxlSGVhZGVyKHRoaXMuZGVidWdFbGVtZW50LnF1ZXJ5KChkZSkgPT4gZGUucmVmZXJlbmNlcy5tYWluSGVhZGVyKSwgdGhpcy5wYWdlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNvcnRpbmcoKTogVGFibGVTb3J0aW5nIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZVNvcnRpbmcodGhpcywgdGhpcy5wYWdlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGJvZHkoKTogVGFibGVCb2R5IHtcbiAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUJvZHkodGhpcy5kZWJ1Z0VsZW1lbnQucXVlcnkoKGRlKSA9PiBkZS5yZWZlcmVuY2VzLm1haW5Cb2R5KSwgdGhpcy5wYWdlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGZvb3RlcigpOiBUYWJsZUZvb3RlciB7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVGb290ZXIodGhpcy5kZWJ1Z0VsZW1lbnQucXVlcnkoKGRlKSA9PiBkZS5yZWZlcmVuY2VzLm1haW5Gb290ZXIpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJlY29yZHNDb3VudCgpOiBSZWNvcmRzQ291bnQge1xuICAgICAgICByZXR1cm4gbmV3IFJlY29yZHNDb3VudCh0aGlzLmRlYnVnRWxlbWVudC5xdWVyeShCeS5jc3MoJy5yaXNrLWRhdGEtdGFibGUtcGFnZS1jb3VudCcpKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwYWdlcigpOiBQYWdlciB7XG4gICAgICAgIHJldHVybiBuZXcgUGFnZXIodGhpcy5kZWJ1Z0VsZW1lbnQucXVlcnkoQnkuZGlyZWN0aXZlKFBhZ2luZ0NvbXBvbmVudCkpLCB0aGlzLnBhZ2UpO1xuICAgIH1cbn1cblxuLy8gPGVkaXRvci1mb2xkIGRlZmF1bHRzdGF0ZT1cImNvbGxhcHNlZFwiIGRlc2M9XCJUYWJsZSBoZWFkZXJcIj5cblxuZXhwb3J0IGNsYXNzIFRhYmxlSGVhZGVyIHtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudDogRGVidWdFbGVtZW50LCBwcml2YXRlIHBhZ2U6IHsgZGV0ZWN0Q2hhbmdlczogKCkgPT4gdm9pZCB9KSB7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByb3dzKCk6IFRhYmxlSGVhZGVyUm93W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50LnF1ZXJ5QWxsKEJ5LmNzcygndHInKSkubWFwKChlbGVtZW50OiBEZWJ1Z0VsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVGFibGVIZWFkZXJSb3coZWxlbWVudCwgdGhpcy5wYWdlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjZWxscygpOiBUYWJsZUhlYWRlckNlbGxbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQucXVlcnlBbGwoQnkuY3NzKCd0aCcpKS5tYXAoKGVsZW1lbnQ6IERlYnVnRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUhlYWRlckNlbGwoZWxlbWVudCwgdGhpcy5wYWdlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG59XG5cbmV4cG9ydCBjbGFzcyBUYWJsZUhlYWRlclJvdyB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OiBEZWJ1Z0VsZW1lbnQsIHByaXZhdGUgcGFnZTogeyBkZXRlY3RDaGFuZ2VzOiAoKSA9PiB2b2lkIH0pIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNlbGxzKCk6IFRhYmxlSGVhZGVyQ2VsbFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5xdWVyeUFsbChCeS5jc3MoJ3RoJykpLm1hcCgoZWxlbWVudDogRGVidWdFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRhYmxlSGVhZGVyQ2VsbChlbGVtZW50LCB0aGlzLnBhZ2UpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUYWJsZUhlYWRlckNlbGwge1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OiBEZWJ1Z0VsZW1lbnQsIHByaXZhdGUgcGFnZTogeyBkZXRlY3RDaGFuZ2VzOiAoKSA9PiB2b2lkIH0pIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHNvcnRpbmdIYW5kbGUoKTogU29ydGluZ0hhbmRsZSB8IG51bGwge1xuICAgICAgICBjb25zdCBoYW5kbGUgPSB0aGlzLmVsZW1lbnQucXVlcnkoQnkuZGlyZWN0aXZlKE1hdEJ1dHRvbikpO1xuICAgICAgICBpZiAoaGFuZGxlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNvcnRpbmdIYW5kbGUodGhpcy5wYWdlLCBoYW5kbGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdG9vbHRpcCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgY29uc3QgaGFuZGxlID0gdGhpcy5lbGVtZW50LnF1ZXJ5KEJ5LmRpcmVjdGl2ZShNYXRUb29sdGlwKSk7XG4gICAgICAgIGlmIChoYW5kbGUpIHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGUuaW5qZWN0b3IuZ2V0KE1hdFRvb2x0aXApLm1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0aXRsZSgpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IHRoaXMuZWxlbWVudC5jaGlsZE5vZGVzLmZpbmQoKG5vZGU6IERlYnVnTm9kZSkgPT4gbm9kZS5uYXRpdmVOb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSk7XG4gICAgICAgIGlmICh0ZXh0Tm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGV4dE5vZGVcbiAgICAgICAgICAgICAgICAubmF0aXZlTm9kZS50ZXh0Q29udGVudC50cmltKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY29sc3BhbigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY29sc3BhbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJvd3NwYW4oKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnJvd3NwYW47XG4gICAgfVxuXG59XG5cbi8vIDxlZGl0b3ItZm9sZCBkZWZhdWx0c3RhdGU9XCJjb2xsYXBzZWRcIiBkZXNjPVwiU29ydGluZ1wiPlxuXG5leHBvcnQgY2xhc3MgVGFibGVTb3J0aW5nIHtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHRhYmxlOiBEYXRhVGFibGVEZWZpbml0aW9uLCBwcml2YXRlIHBhZ2U6IHsgZGV0ZWN0Q2hhbmdlczogKCkgPT4gdm9pZCB9KSB7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoYW5kbGVzKCk6IFNvcnRpbmdIYW5kbGVbXSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXMgPSB0aGlzLnRhYmxlLmRlYnVnRWxlbWVudC5xdWVyeSgoZGUpID0+IGRlLnJlZmVyZW5jZXMubWFpbkhlYWRlcilcbiAgICAgICAgICAgIC5xdWVyeUFsbChCeS5kaXJlY3RpdmUoTWF0QnV0dG9uKSk7XG4gICAgICAgIGlmICghaGFuZGxlcykge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYW5kbGVzLm1hcCgoaGFuZGxlOiBEZWJ1Z0VsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU29ydGluZ0hhbmRsZSh0aGlzLnBhZ2UsIGhhbmRsZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGV0YWlsUm93SGFuZGxlcygpOiBTb3J0aW5nSGFuZGxlW10gfCBudWxsIHtcbiAgICAgICAgY29uc3QgaGFuZGxlcyA9IHRoaXMudGFibGUuZGVidWdFbGVtZW50LnF1ZXJ5KEJ5LmNzcygnLnJpc2stZGF0YS10YWJsZS1kZXRhaWwnKSkucXVlcnkoQnkuY3NzKCd0aGVhZCcpKVxuICAgICAgICAgICAgLnF1ZXJ5QWxsKEJ5LmRpcmVjdGl2ZShNYXRCdXR0b24pKTtcbiAgICAgICAgaWYgKCFoYW5kbGVzKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFuZGxlcy5tYXAoKGhhbmRsZTogRGVidWdFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNvcnRpbmdIYW5kbGUodGhpcy5wYWdlLCBoYW5kbGUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnRPcmRlcmluZygpOiBBcnJheTxPcmRlcmluZ0NyaXRlcmlhPGFueT4+IHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnRhYmxlLmNvbXBvbmVudCBhcyBhbnkpLm9yZGVyaW5nO1xuICAgIH1cblxuICAgIHB1YmxpYyBjaGVja1NvcnRpbmcoZmlyc3ROUm93czogbnVtYmVyID0gdGhpcy50YWJsZS5jb21wb25lbnQucm93cy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBjcml0ZXJpdW0/OiBPcmRlcmluZ0NyaXRlcmlhPGFueT4pOiB2b2lkIHtcbiAgICAgICAgLy8gV0FSTjogY2FsbCBkYXRhIG9uY2UgYXMgaXQgY2FsbHMgLm1hcCBvbiBhbGwgdGFibGUgcm93c1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy50YWJsZS5kYXRhO1xuXG4gICAgICAgIGxldCBvcmRlcmluZzogQXJyYXk8T3JkZXJpbmdDcml0ZXJpYTxhbnk+PjtcbiAgICAgICAgaWYgKGNyaXRlcml1bSkge1xuICAgICAgICAgICAgb3JkZXJpbmcgPSBbY3JpdGVyaXVtXS5jb25jYXQoKHRoaXMudGFibGUuY29tcG9uZW50IGFzIGFueSkuX2RlZmF1bHRPcmRlcmluZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvcmRlcmluZyA9IHRoaXMuY3VycmVudE9yZGVyaW5nO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgTWF0aC5taW4oZGF0YS5sZW5ndGgsIGZpcnN0TlJvd3MpOyBpKyspIHtcbiAgICAgICAgICAgIG9yZGVyaW5nLnNvbWUoKGNyaXRlcmlhOiBPcmRlcmluZ0NyaXRlcmlhPGFueT4pID0+IHtcbiAgICAgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBFcXVhbGl0eUNvbXBhcmlzb25XaXRoQ29lcmNpb25KU1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlQTogYW55ID0gY3JpdGVyaWEuZ2V0KGRhdGFbaSAtIDFdKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZUI6IGFueSA9IGNyaXRlcmlhLmdldChkYXRhW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWVBID09IG51bGwgJiYgdmFsdWVCID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBleHBlY3QodmFsdWVBKS5ub3QudG9CZU51bGwoKTtcbiAgICAgICAgICAgICAgICBleHBlY3QodmFsdWVBKS5ub3QudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZUIgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3JpdGVyaWEuZGVzY2VuZGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0KHZhbHVlQSA+PSB2YWx1ZUIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvQmVUcnV0aHkoJ0V4cGVjdDogJyArIHZhbHVlQSArICcgPj0gJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdmFsdWVCKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdCh2YWx1ZUEgPD0gdmFsdWVCKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b0JlVHJ1dGh5KCdFeHBlY3Q6ICcgKyB2YWx1ZUEgKyAnIDw9ICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZhbHVlQik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlQSAhPT0gdmFsdWVCO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTb3J0aW5nSGFuZGxlIHtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHBhZ2U6IHsgZGV0ZWN0Q2hhbmdlczogKCkgPT4gdm9pZCB9LCBwcml2YXRlIGhhbmRsZTogRGVidWdFbGVtZW50KSB7XG4gICAgfVxuXG4gICAgcHVibGljIGNsaWNrKCkge1xuICAgICAgICBjbGljayh0aGlzLmhhbmRsZSk7XG4gICAgICAgIHRoaXMucGFnZS5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxufVxuXG4vLyA8L2VkaXRvci1mb2xkPlxuXG4vLyA8L2VkaXRvci1mb2xkPlxuXG4vLyA8ZWRpdG9yLWZvbGQgZGVmYXVsdHN0YXRlPVwiY29sbGFwc2VkXCIgZGVzYz1cIlRhYmxlIGJvZHlcIj5cblxuZXhwb3J0IGNsYXNzIFRhYmxlQm9keSB7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIGVsZW1lbnQ6IERlYnVnRWxlbWVudCwgcHJpdmF0ZSBwYWdlOiB7IGRldGVjdENoYW5nZXM6ICgpID0+IHZvaWQgfSkge1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcm93cygpOiBUYWJsZUJvZHlSb3dbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQucXVlcnlBbGwoKGRlKSA9PiBkZS5yZWZlcmVuY2VzLm1hc3RlclJvdykubWFwKChlbGVtZW50OiBEZWJ1Z0VsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVGFibGVCb2R5Um93KGVsZW1lbnQsIHRoaXMucGFnZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY2VsbHMoKTogVGFibGVCb2R5Q2VsbFtdIHtcbiAgICAgICAgbGV0IGNlbGxzOiBUYWJsZUJvZHlDZWxsW10gPSBbXTtcbiAgICAgICAgdGhpcy5lbGVtZW50LnF1ZXJ5QWxsKChkZSkgPT4gZGUucmVmZXJlbmNlcy5tYXN0ZXJSb3cpLmZvckVhY2goKHJvdzogRGVidWdFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBjZWxscyA9IGNlbGxzLmNvbmNhdChyb3cucXVlcnlBbGwoQnkuY3NzKCd0ZCcpKS5tYXAoKGNlbGw6IERlYnVnRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGFibGVCb2R5Q2VsbChjZWxsKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjZWxscztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUYWJsZUJvZHlSb3cge1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OiBEZWJ1Z0VsZW1lbnQsIHByaXZhdGUgcGFnZTogeyBkZXRlY3RDaGFuZ2VzOiAoKSA9PiB2b2lkIH0pIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgZXhwYW5kUm93KCk6IHZvaWQge1xuICAgICAgICBjbGljayh0aGlzLmVsZW1lbnQpO1xuICAgICAgICB0aGlzLnBhZ2UuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZXhwYW5kZXIoKTogUm93RXhwYW5kZXIge1xuICAgICAgICByZXR1cm4gbmV3IFJvd0V4cGFuZGVyKFxuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnF1ZXJ5KEJ5LmRpcmVjdGl2ZShEYXRhVGFibGVSb3dEZXRhaWxFeHBhbmRlcikpLnF1ZXJ5KEJ5LmRpcmVjdGl2ZShNYXRBbmNob3IpKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjZWxscygpOiBUYWJsZUJvZHlDZWxsW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50LnF1ZXJ5QWxsKEJ5LmNzcygndGQnKSkubWFwKChlbGVtZW50OiBEZWJ1Z0VsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVGFibGVCb2R5Q2VsbChlbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByb3dEZXRhaWwoKTogVGFibGVCb2R5RGV0YWlsIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuZWxlbWVudC5wYXJlbnQ7XG4gICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgbmV4dCA9IHBhcmVudC5jaGlsZHJlbltwYXJlbnQuY2hpbGRyZW4uaW5kZXhPZih0aGlzLmVsZW1lbnQpICsgMV07XG4gICAgICAgICAgICBpZiAobmV4dCAmJiAhbmV4dC5yZWZlcmVuY2VzLm1hc3RlclJvdykge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVGFibGVCb2R5RGV0YWlsKG5leHQsIHRoaXMucGFnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBoaWdobGlnaHRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhISUdITElHSFRFUl9DTEFTUyk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUm93RXhwYW5kZXIge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudDogRGVidWdFbGVtZW50KSB7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpY29uKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQucXVlcnkoQnkuZGlyZWN0aXZlKE1hdEljb24pKS5uYXRpdmVFbGVtZW50LnRleHRDb250ZW50LnRyaW0oKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG9wZW5lZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaWNvbiA9PT0gJ2V4cGFuZF9sZXNzJztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNsb3NlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaWNvbiA9PT0gJ2V4cGFuZF9tb3JlJztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUYWJsZUJvZHlDZWxsIHtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudDogRGVidWdFbGVtZW50KSB7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjb2xzcGFuKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jb2xzcGFuO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcm93c3BhbigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucm93c3BhbjtcbiAgICB9XG59XG5cbi8vIDxlZGl0b3ItZm9sZCBkZWZhdWx0c3RhdGU9XCJjb2xsYXBzZWRcIiBkZXNjPVwiUm93IGRldGFpbFwiPlxuXG5leHBvcnQgY2xhc3MgVGFibGVCb2R5RGV0YWlsIHtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudDogRGVidWdFbGVtZW50LCBwcml2YXRlIHBhZ2U6IHsgZGV0ZWN0Q2hhbmdlczogKCkgPT4gdm9pZCB9KSB7XG4gICAgfVxuXG4gICAgcHVibGljIGhlYWRlcigpOiBUYWJsZUhlYWRlciB7XG4gICAgICAgIHJldHVybiBuZXcgVGFibGVIZWFkZXIodGhpcy5lbGVtZW50LnF1ZXJ5KEJ5LmNzcygndGhlYWQnKSksIHRoaXMucGFnZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBib2R5KCk6IFRhYmxlQm9keURldGFpbEJvZHkge1xuICAgICAgICByZXR1cm4gbmV3IFRhYmxlQm9keURldGFpbEJvZHkodGhpcy5lbGVtZW50LnF1ZXJ5KEJ5LmNzcygndGJvZHknKSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGlnaGxpZ2h0ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoSElHSExJR0hURVJfQ0xBU1MpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY29sc3BhbigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50LmNoaWxkcmVuWzBdLm5hdGl2ZUVsZW1lbnQuY29sc3BhbjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUYWJsZUJvZHlEZXRhaWxCb2R5IHtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudDogRGVidWdFbGVtZW50KSB7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByb3dzKCk6IFRhYmxlQm9keURldGFpbFJvd1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5xdWVyeUFsbChCeS5jc3MoJ3RyJykpLm1hcCgoZWxlbWVudDogRGVidWdFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRhYmxlQm9keURldGFpbFJvdyhlbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjZWxscygpOiBUYWJsZUJvZHlDZWxsW10ge1xuICAgICAgICBsZXQgY2VsbHM6IFRhYmxlQm9keUNlbGxbXSA9IFtdO1xuICAgICAgICB0aGlzLmVsZW1lbnQucXVlcnlBbGwoQnkuY3NzKCd0cicpKS5mb3JFYWNoKChyb3c6IERlYnVnRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgY2VsbHMgPSBjZWxscy5jb25jYXQocm93LnF1ZXJ5QWxsKEJ5LmNzcygndGQnKSkubWFwKChjZWxsOiBEZWJ1Z0VsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRhYmxlQm9keUNlbGwoY2VsbCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY2VsbHM7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGFibGVCb2R5RGV0YWlsUm93IHtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudDogRGVidWdFbGVtZW50KSB7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjZWxscygpOiBUYWJsZUJvZHlDZWxsW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50LnF1ZXJ5QWxsKEJ5LmNzcygndGQnKSkubWFwKChlbGVtZW50OiBEZWJ1Z0VsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVGFibGVCb2R5Q2VsbChlbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG4vLyA8L2VkaXRvci1mb2xkPlxuXG4vLyA8L2VkaXRvci1mb2xkPlxuXG4vLyA8ZWRpdG9yLWZvbGQgZGVmYXVsdHN0YXRlPVwiY29sbGFwc2VkXCIgZGVzYz1cIlRhYmxlIGZvb3RlclwiPlxuXG5leHBvcnQgY2xhc3MgVGFibGVGb290ZXIge1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OiBEZWJ1Z0VsZW1lbnQpIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJvd3MoKTogVGFibGVGb290ZXJSb3dbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQucXVlcnlBbGwoQnkuY3NzKCd0cicpKS5tYXAoKGVsZW1lbnQ6IERlYnVnRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUZvb3RlclJvdyhlbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjZWxscygpOiBUYWJsZUJvZHlDZWxsW10ge1xuICAgICAgICBsZXQgY2VsbHM6IFRhYmxlQm9keUNlbGxbXSA9IFtdO1xuICAgICAgICB0aGlzLmVsZW1lbnQucXVlcnlBbGwoQnkuY3NzKCd0cicpKS5mb3JFYWNoKChyb3c6IERlYnVnRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgY2VsbHMgPSBjZWxscy5jb25jYXQocm93LnF1ZXJ5QWxsKEJ5LmNzcygndGgnKSkubWFwKChjZWxsOiBEZWJ1Z0VsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRhYmxlQm9keUNlbGwoY2VsbCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY2VsbHM7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGFibGVGb290ZXJSb3cge1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OiBEZWJ1Z0VsZW1lbnQpIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNlbGxzKCk6IFRhYmxlQm9keUNlbGxbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQucXVlcnlBbGwoQnkuY3NzKCd0aCcpKS5tYXAoKGVsZW1lbnQ6IERlYnVnRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUJvZHlDZWxsKGVsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbi8vIDwvZWRpdG9yLWZvbGQ+XG5cbmV4cG9ydCBjbGFzcyBSZWNvcmRzQ291bnQge1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OiBEZWJ1Z0VsZW1lbnQpIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnRleHRDb250ZW50O1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBhZ2VyIHtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudDogRGVidWdFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHBhZ2U6IHsgZGV0ZWN0Q2hhbmdlczogKCkgPT4gdm9pZCwgYWR2YW5jZUFuZERldGVjdENoYW5nZXM6ICgpID0+IHZvaWQgfSkge1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGFnZUJ1dHRvbnMoKTogRGVidWdFbGVtZW50W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50LnF1ZXJ5QWxsKEJ5LmRpcmVjdGl2ZShNYXRCdXR0b25Ub2dnbGUpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZXhwZWN0TGVhZGluZ0J1dHRvbnNEaXNhYmxlZCgpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyOyBpKyspIHtcbiAgICAgICAgICAgIGV4cGVjdCh0aGlzLnBhZ2VCdXR0b25zW2ldLmNsYXNzZXNbJ21hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkJ10pXG4gICAgICAgICAgICAgICAgLnRvQmUodHJ1ZSwgJ0ZpcnN0IHR3byBhcmUgZGlzYWJsZWQuJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZXhwZWN0TGVhZGluZ0J1dHRvbnNOb3REaXNhYmxlZCgpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyOyBpKyspIHtcbiAgICAgICAgICAgIGV4cGVjdCh0aGlzLnBhZ2VCdXR0b25zW2ldLmNsYXNzZXNbJ21hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkJ10pXG4gICAgICAgICAgICAgICAgLm5vdC50b0JlKHRydWUsICdGaXJzdCB0d28gYXJlIG5vdCBkaXNhYmxlZC4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBleHBlY3RUcmFpbGluZ0J1dHRvbnNEaXNhYmxlZCgpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMucGFnZUJ1dHRvbnMubGVuZ3RoIC0gMTsgaSA+IHRoaXMucGFnZUJ1dHRvbnMubGVuZ3RoIC0gMzsgaS0tKSB7XG4gICAgICAgICAgICBleHBlY3QodGhpcy5wYWdlQnV0dG9uc1tpXS5jbGFzc2VzWydtYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZCddKVxuICAgICAgICAgICAgICAgIC50b0JlKHRydWUsICdMYXN0IHR3byBhcmUgZGlzYWJsZWQuJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZXhwZWN0VHJhaWxpbmdCdXR0b25zTm90RGlzYWJsZWQoKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLnBhZ2VCdXR0b25zLmxlbmd0aCAtIDE7IGkgPiB0aGlzLnBhZ2VCdXR0b25zLmxlbmd0aCAtIDM7IGktLSkge1xuICAgICAgICAgICAgZXhwZWN0KHRoaXMucGFnZUJ1dHRvbnNbaV0uY2xhc3Nlc1snbWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQnXSlcbiAgICAgICAgICAgICAgICAubm90LnRvQmUodHJ1ZSwgJ0xhc3QgdHdvIGFyZSBub3QgZGlzYWJsZWQuJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZXhwZWN0QnV0dG9uTnVtYmVycyhudW1iZXJzOiBudW1iZXJbXSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGV4cGVjdCh0aGlzLnBhZ2VCdXR0b25zW2kgKyAyXS5xdWVyeShCeS5jc3MoJy5tYXQtYnV0dG9uLXRvZ2dsZS1sYWJlbC1jb250ZW50JykpXG4gICAgICAgICAgICAgICAgLm5hdGl2ZUVsZW1lbnQudGV4dENvbnRlbnQudHJpbSgpKVxuICAgICAgICAgICAgICAgIC50b0VxdWFsKG51bWJlcnNbaV0gKyAnJywgJ0J1dHRvbiBudW1iZXJzIGFyZSBjb3JyZWN0Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZXhwZWN0QnV0dG9uQWN0aXZlKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgZXhwZWN0KHRoaXMucGFnZUJ1dHRvbnNbaW5kZXhdLmNsYXNzZXNbJ21hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWQnXSlcbiAgICAgICAgICAgIC50b0JlKHRydWUsICdCdXR0b24gaXMgYWN0aXZlLicpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGljayhpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGNsaWNrKHRoaXMucGFnZUJ1dHRvbnNbaW5kZXhdLnF1ZXJ5KEJ5LmNzcygnLm1hdC1idXR0b24tdG9nZ2xlLWxhYmVsLWNvbnRlbnQnKSkubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIHRoaXMucGFnZS5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMucGFnZS5hZHZhbmNlQW5kRGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoY2Vja1NvcnRpbmcocGFnZTogeyBkZXRlY3RDaGFuZ2VzOiAoKSA9PiB2b2lkLCBkYXRhVGFibGU6IERhdGFUYWJsZURlZmluaXRpb24gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlhOiBBcnJheTxWYWx1ZUdldHRlcjxhbnk+Pikge1xuICAgIHBhZ2UuZGF0YVRhYmxlLnNvcnRpbmcuY2hlY2tTb3J0aW5nKDE1MCk7XG5cbiAgICBwYWdlLmRhdGFUYWJsZS5zb3J0aW5nLmhhbmRsZXMuZm9yRWFjaCgoaGFuZGxlOiBTb3J0aW5nSGFuZGxlLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIC8vIFRpZ2dlciBzb3J0IGJhc2VkIG9uIGEgaGFuZGxlXG4gICAgICAgIGhhbmRsZS5jbGljaygpO1xuICAgICAgICBwYWdlLmRldGVjdENoYW5nZXMoKTtcblxuICAgICAgICAvLyBDaGVjayB0aGUgc29ydGluZ1xuICAgICAgICBwYWdlLmRhdGFUYWJsZS5zb3J0aW5nLmNoZWNrU29ydGluZygxNTAsIHtcbiAgICAgICAgICAgIGdldDogY3JpdGVyaWFbaW5kZXhdXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFRpZ2dlciBzb3J0IGJhc2VkIG9uIGEgaGFuZGxlXG4gICAgICAgIGhhbmRsZS5jbGljaygpO1xuICAgICAgICBwYWdlLmRldGVjdENoYW5nZXMoKTtcblxuICAgICAgICAvLyBDaGVjayB0aGUgc29ydGluZ1xuICAgICAgICBwYWdlLmRhdGFUYWJsZS5zb3J0aW5nLmNoZWNrU29ydGluZygxNTAsIHtcbiAgICAgICAgICAgIGdldCAgICAgICA6IGNyaXRlcmlhW2luZGV4XSxcbiAgICAgICAgICAgIGRlc2NlbmRpbmc6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBjbGFzcyBEYXRhVGFibGVEZWZpbml0aW9uSG9zdGVkIGV4dGVuZHMgUGFnZTxUZXN0RGF0YVRhYmxlSG9zdENvbXBvbmVudD4ge1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGZpeHR1cmU6IENvbXBvbmVudEZpeHR1cmU8VGVzdERhdGFUYWJsZUhvc3RDb21wb25lbnQ+KSB7XG4gICAgICAgIHN1cGVyKGZpeHR1cmUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGF0YVRhYmxlKCk6IERhdGFUYWJsZURlZmluaXRpb24ge1xuICAgICAgICByZXR1cm4gbmV3IERhdGFUYWJsZURlZmluaXRpb24odGhpcy5kZWJ1Z0VsZW1lbnQucXVlcnkoQnkuZGlyZWN0aXZlKERhdGFUYWJsZUNvbXBvbmVudCkpLCB0aGlzKTtcbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxyaXNrLWRhdGEtdGFibGUgW2RhdGFdPVwiZGF0YVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2Zvb3Rlcl09XCJmb290ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIFtwYWdlU2l6ZV09XCIyMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHRPcmRlcmluZ109XCJkZWZhdWx0T3JkZXJpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHJpcGVkXT1cInRydWVcIj5cbiAgICAgICAgICAgIDxyaXNrLWRhdGEtdGFibGUtY29sdW1uIHRpdGxlPVwiVGVzdCBDb2x1bW4gMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc29ydGluZ0tleV09XCJ2YWx1ZUdldHRlclwiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtcmVjb3JkPVwicm93XCIgcmlzay1kYXRhLXRhYmxlLWNlbGw+XG4gICAgICAgICAgICAgICAgICAgIHt7cmVjb3JkLnZhbHVlMX19XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvcmlzay1kYXRhLXRhYmxlLWNvbHVtbj5cbiAgICAgICAgICAgIDxyaXNrLWRhdGEtdGFibGUtY29sdW1uPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSByaXNrLWRhdGEtdGFibGUtY2VsbCBsZXQtcmVjb3JkPVwicm93XCIgbGV0LWV4cGFuZGVkPVwiZXhwYW5kZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHJpc2stZGF0YS10YWJsZS1kZXRhaWwtZXhwYW5kZXIgW2V4cGFuZGVkXT1cImV4cGFuZGVkXCI+PC9yaXNrLWRhdGEtdGFibGUtZGV0YWlsLWV4cGFuZGVyPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHJpc2stZGF0YS10YWJsZS1mb290ZXItY2VsbCBsZXQtZm9vdGVyPVwiZm9vdGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7Zm9vdGVyLnZhbHVlMX19XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvcmlzay1kYXRhLXRhYmxlLWNvbHVtbj5cbiAgICAgICAgICAgIDwhLS0gU3ViIGRldGFpbCAtLT5cbiAgICAgICAgICAgIDxyaXNrLWRhdGEtdGFibGUtZGV0YWlsLXJvdz5cbiAgICAgICAgICAgICAgICA8cmlzay1kYXRhLXRhYmxlLWNvbHVtbi1ncm91cD5cbiAgICAgICAgICAgICAgICAgICAgPHJpc2stZGF0YS10YWJsZS1jb2x1bW4gdGl0bGU9XCJUZXN0IERldGFpbCBDb2x1bW4gMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzb3J0aW5nS2V5XT1cInZhbHVlR2V0dGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcmlzay1kYXRhLXRhYmxlLWNlbGwgbGV0LXJlY29yZD1cInJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7cmVjb3JkLnZhbHVlMX19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8L3Jpc2stZGF0YS10YWJsZS1jb2x1bW4+XG4gICAgICAgICAgICAgICAgPC9yaXNrLWRhdGEtdGFibGUtY29sdW1uLWdyb3VwPlxuICAgICAgICAgICAgICAgIDxyaXNrLWRhdGEtdGFibGUtY29sdW1uLWdyb3VwPlxuICAgICAgICAgICAgICAgICAgICA8cmlzay1kYXRhLXRhYmxlLWNvbHVtbiB0aXRsZT1cIlRlc3QgRGV0YWlsIENvbHVtbiAyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcmlzay1kYXRhLXRhYmxlLWNlbGwgbGV0LXJlY29yZD1cInJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7cmVjb3JkLnZhbHVlMn19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8L3Jpc2stZGF0YS10YWJsZS1jb2x1bW4+XG4gICAgICAgICAgICAgICAgICAgIDxyaXNrLWRhdGEtdGFibGUtY29sdW1uIHRpdGxlPVwiVGVzdCBEZXRhaWwgQ29sdW1uIDNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSByaXNrLWRhdGEtdGFibGUtY2VsbCBsZXQtcmVjb3JkPVwicm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tyZWNvcmQudmFsdWUzfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDwvcmlzay1kYXRhLXRhYmxlLWNvbHVtbj5cbiAgICAgICAgICAgICAgICA8L3Jpc2stZGF0YS10YWJsZS1jb2x1bW4tZ3JvdXA+XG4gICAgICAgICAgICAgICAgPHJpc2stZGF0YS10YWJsZS1jb2x1bW4tZ3JvdXA+PC9yaXNrLWRhdGEtdGFibGUtY29sdW1uLWdyb3VwPlxuICAgICAgICAgICAgPC9yaXNrLWRhdGEtdGFibGUtZGV0YWlsLXJvdz5cbiAgICAgICAgPC9yaXNrLWRhdGEtdGFibGU+YFxufSlcbmV4cG9ydCBjbGFzcyBUZXN0RGF0YVRhYmxlSG9zdENvbXBvbmVudCB7XG5cbiAgICBwdWJsaWMgZGF0YTogYW55W107XG5cbiAgICBwdWJsaWMgZm9vdGVyOiBhbnk7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZGF0YSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDUwMDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGEucHVzaCh7XG4gICAgICAgICAgICAgICAgdmFsdWUxOiBNYXRoLmZsb29yKHNlY3VyZVJhbmRvbSgpICogMjApICsgJyAtIHZhbHVlIDEnLFxuICAgICAgICAgICAgICAgIHZhbHVlMjogTWF0aC5mbG9vcihzZWN1cmVSYW5kb20oKSAqIDIwKSArICcgLSB2YWx1ZSAyJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTM6IE1hdGguZmxvb3Ioc2VjdXJlUmFuZG9tKCkgKiAyMCkgKyAnIC0gdmFsdWUgMydcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZm9vdGVyID0gdGhpcy5kYXRhWzBdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGVmYXVsdE9yZGVyaW5nKCk6IEFycmF5PE9yZGVyaW5nQ3JpdGVyaWE8YW55PiB8IFZhbHVlR2V0dGVyPGFueT4+IHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBnZXQgICAgICAgOiAocmVjb3JkOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlY29yZC52YWx1ZTM7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBkZXNjZW5kaW5nOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKHJlY29yZDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlY29yZC52YWx1ZTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB2YWx1ZUdldHRlcigpOiAocmVjb3JkOiBhbnkpID0+IGFueSB7XG4gICAgICAgIHJldHVybiAocmVjb3JkOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZWNvcmQudmFsdWUxO1xuICAgICAgICB9O1xuICAgIH1cbn1cbiJdfQ==
|