@dbg-riskit/angular-testing 9999.9999.9999-rc.41311 → 9999.9999.9999-rc.436399

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