@universis/ngx-tables 0.8.5 → 15.0.2
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/esm2020/lib/actions/table.actions.mjs +27 -0
- package/esm2020/lib/advanced-aggregator.mjs +2 -0
- package/esm2020/lib/components/add-items/add-items.component.mjs +138 -0
- package/esm2020/lib/components/advanced-aggregator/advanced-aggregator.component.mjs +126 -0
- package/esm2020/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.mjs +53 -0
- package/esm2020/lib/components/advanced-list/advanced-list.component.mjs +184 -0
- package/esm2020/lib/components/advanced-row-action/advanced-row-action.component.mjs +178 -0
- package/esm2020/lib/components/advanced-search-form/advanced-search-form.component.mjs +154 -0
- package/esm2020/lib/components/advanced-select/advanced-select.component.mjs +42 -0
- package/esm2020/lib/components/advanced-select/advanced-select.service.mjs +38 -0
- package/esm2020/lib/components/advanced-table/advanced-filter-value-provider.service.mjs +31 -0
- package/esm2020/lib/components/advanced-table/advanced-table-resolvers.mjs +40 -0
- package/esm2020/lib/components/advanced-table/advanced-table-search-base.mjs +31 -0
- package/esm2020/lib/components/advanced-table/advanced-table-search.component.mjs +525 -0
- package/esm2020/lib/components/advanced-table/advanced-table-settings.component.mjs +108 -0
- package/esm2020/lib/components/advanced-table/advanced-table.component.mjs +1599 -0
- package/esm2020/lib/components/advanced-table/advanced-table.formatters.interface.mjs +17 -0
- package/esm2020/lib/components/advanced-table/advanced-table.formatters.mjs +429 -0
- package/esm2020/lib/components/advanced-table/advanced-table.interfaces.mjs +2 -0
- package/esm2020/lib/components/advanced-table-modal/advanced-table-modal-base.component.mjs +420 -0
- package/esm2020/lib/components/column-selector/column-selector.component.mjs +205 -0
- package/esm2020/lib/components/column-selector/column-selector.service.mjs +45 -0
- package/esm2020/lib/components/table-simple-header/table-simple-header.component.mjs +52 -0
- package/esm2020/lib/directives/advance-search-state.directive.mjs +111 -0
- package/esm2020/lib/directives/advance-table-state.directive.mjs +63 -0
- package/esm2020/lib/directives/advanced-search-router-state.directive.mjs +64 -0
- package/esm2020/lib/directives/advanced-table-editor.directive.mjs +154 -0
- package/esm2020/lib/directives/btnexp.directive.mjs +222 -0
- package/esm2020/lib/i18n/tables.el.mjs +129 -0
- package/esm2020/lib/i18n/tables.en.mjs +128 -0
- package/esm2020/lib/pipes/advanced-aggregator.pipe.mjs +38 -0
- package/esm2020/lib/pipes/advansed-aggregator-list-title-parse.pipe.mjs +45 -0
- package/esm2020/lib/reducers/index.mjs +37 -0
- package/esm2020/lib/services/advanced-aggregator/advanced-aggregator.service.mjs +119 -0
- package/esm2020/lib/tables.activated-table.service.mjs +46 -0
- package/esm2020/lib/tables.module.mjs +218 -0
- package/esm2020/public_api.mjs +37 -0
- package/esm2020/universis-ngx-tables.mjs +5 -0
- package/fesm2015/{universis-ngx-tables.js → universis-ngx-tables.mjs} +2927 -2729
- package/fesm2015/universis-ngx-tables.mjs.map +1 -0
- package/fesm2020/universis-ngx-tables.mjs +5609 -0
- package/fesm2020/universis-ngx-tables.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/actions/table.actions.d.ts +4 -4
- package/lib/components/add-items/add-items.component.d.ts +14 -21
- package/lib/components/advanced-aggregator/advanced-aggregator.component.d.ts +15 -9
- package/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.d.ts +4 -1
- package/lib/components/advanced-list/advanced-list.component.d.ts +17 -14
- package/lib/components/advanced-row-action/advanced-row-action.component.d.ts +20 -23
- package/lib/components/advanced-search-form/advanced-search-form.component.d.ts +7 -4
- package/lib/components/advanced-select/advanced-select.component.d.ts +3 -1
- package/lib/components/advanced-select/advanced-select.service.d.ts +3 -0
- package/lib/components/advanced-table/advanced-filter-value-provider.service.d.ts +3 -0
- package/lib/components/advanced-table/advanced-table-resolvers.d.ts +5 -0
- package/lib/components/advanced-table/advanced-table-search-base.d.ts +6 -2
- package/lib/components/advanced-table/advanced-table-search.component.d.ts +11 -7
- package/lib/components/advanced-table/advanced-table-settings.component.d.ts +8 -6
- package/lib/components/advanced-table/advanced-table.component.d.ts +33 -25
- package/lib/components/advanced-table/advanced-table.formatters.d.ts +11 -11
- package/lib/components/advanced-table-modal/advanced-table-modal-base.component.d.ts +15 -12
- package/lib/components/column-selector/column-selector.component.d.ts +9 -6
- package/lib/components/column-selector/column-selector.service.d.ts +3 -0
- package/lib/components/table-simple-header/table-simple-header.component.d.ts +8 -3
- package/lib/directives/advance-search-state.directive.d.ts +6 -3
- package/lib/directives/advance-table-state.directive.d.ts +4 -1
- package/lib/directives/advanced-search-router-state.directive.d.ts +9 -6
- package/lib/directives/advanced-table-editor.directive.d.ts +4 -1
- package/lib/directives/btnexp.directive.d.ts +12 -9
- package/lib/i18n/tables.el.d.ts +107 -107
- package/lib/i18n/tables.en.d.ts +106 -106
- package/lib/pipes/advanced-aggregator.pipe.d.ts +7 -4
- package/lib/pipes/advansed-aggregator-list-title-parse.pipe.d.ts +9 -6
- package/lib/reducers/index.d.ts +5 -3
- package/lib/services/advanced-aggregator/advanced-aggregator.service.d.ts +11 -8
- package/lib/tables.activated-table.service.d.ts +10 -6
- package/lib/tables.module.d.ts +36 -0
- package/package.json +44 -36
- package/public_api.d.ts +3 -0
- package/bundles/universis-ngx-tables.umd.js +0 -6101
- package/bundles/universis-ngx-tables.umd.js.map +0 -1
- package/bundles/universis-ngx-tables.umd.min.js +0 -2
- package/bundles/universis-ngx-tables.umd.min.js.map +0 -1
- package/esm2015/lib/actions/table.actions.js +0 -28
- package/esm2015/lib/advanced-aggregator.js +0 -2
- package/esm2015/lib/components/add-items/add-items.component.js +0 -142
- package/esm2015/lib/components/advanced-aggregator/advanced-aggregator.component.js +0 -120
- package/esm2015/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.js +0 -53
- package/esm2015/lib/components/advanced-list/advanced-list.component.js +0 -173
- package/esm2015/lib/components/advanced-row-action/advanced-row-action.component.js +0 -184
- package/esm2015/lib/components/advanced-search-form/advanced-search-form.component.js +0 -142
- package/esm2015/lib/components/advanced-select/advanced-select.component.js +0 -65
- package/esm2015/lib/components/advanced-select/advanced-select.service.js +0 -40
- package/esm2015/lib/components/advanced-table/advanced-filter-value-provider.service.js +0 -37
- package/esm2015/lib/components/advanced-table/advanced-table-resolvers.js +0 -44
- package/esm2015/lib/components/advanced-table/advanced-table-search-base.js +0 -28
- package/esm2015/lib/components/advanced-table/advanced-table-search.component.js +0 -526
- package/esm2015/lib/components/advanced-table/advanced-table-settings.component.js +0 -109
- package/esm2015/lib/components/advanced-table/advanced-table.component.js +0 -1523
- package/esm2015/lib/components/advanced-table/advanced-table.formatters.interface.js +0 -18
- package/esm2015/lib/components/advanced-table/advanced-table.formatters.js +0 -429
- package/esm2015/lib/components/advanced-table/advanced-table.interfaces.js +0 -2
- package/esm2015/lib/components/advanced-table-modal/advanced-table-modal-base.component.js +0 -397
- package/esm2015/lib/components/column-selector/column-selector.component.js +0 -202
- package/esm2015/lib/components/column-selector/column-selector.service.js +0 -47
- package/esm2015/lib/components/table-simple-header/table-simple-header.component.js +0 -52
- package/esm2015/lib/directives/advance-search-state.directive.js +0 -108
- package/esm2015/lib/directives/advance-table-state.directive.js +0 -63
- package/esm2015/lib/directives/advanced-search-router-state.directive.js +0 -63
- package/esm2015/lib/directives/advanced-table-editor.directive.js +0 -156
- package/esm2015/lib/directives/btnexp.directive.js +0 -229
- package/esm2015/lib/i18n/tables.el.js +0 -130
- package/esm2015/lib/i18n/tables.en.js +0 -129
- package/esm2015/lib/pipes/advanced-aggregator.pipe.js +0 -35
- package/esm2015/lib/pipes/advansed-aggregator-list-title-parse.pipe.js +0 -46
- package/esm2015/lib/reducers/index.js +0 -32
- package/esm2015/lib/services/advanced-aggregator/advanced-aggregator.service.js +0 -120
- package/esm2015/lib/tables.activated-table.service.js +0 -50
- package/esm2015/lib/tables.module.js +0 -149
- package/esm2015/public_api.js +0 -33
- package/esm2015/universis-ngx-tables.js +0 -9
- package/esm5/lib/actions/table.actions.js +0 -34
- package/esm5/lib/advanced-aggregator.js +0 -2
- package/esm5/lib/components/add-items/add-items.component.js +0 -153
- package/esm5/lib/components/advanced-aggregator/advanced-aggregator.component.js +0 -169
- package/esm5/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.js +0 -56
- package/esm5/lib/components/advanced-list/advanced-list.component.js +0 -185
- package/esm5/lib/components/advanced-row-action/advanced-row-action.component.js +0 -188
- package/esm5/lib/components/advanced-search-form/advanced-search-form.component.js +0 -145
- package/esm5/lib/components/advanced-select/advanced-select.component.js +0 -71
- package/esm5/lib/components/advanced-select/advanced-select.service.js +0 -43
- package/esm5/lib/components/advanced-table/advanced-filter-value-provider.service.js +0 -50
- package/esm5/lib/components/advanced-table/advanced-table-resolvers.js +0 -48
- package/esm5/lib/components/advanced-table/advanced-table-search-base.js +0 -34
- package/esm5/lib/components/advanced-table/advanced-table-search.component.js +0 -563
- package/esm5/lib/components/advanced-table/advanced-table-settings.component.js +0 -115
- package/esm5/lib/components/advanced-table/advanced-table.component.js +0 -1548
- package/esm5/lib/components/advanced-table/advanced-table.formatters.interface.js +0 -18
- package/esm5/lib/components/advanced-table/advanced-table.formatters.js +0 -480
- package/esm5/lib/components/advanced-table/advanced-table.interfaces.js +0 -2
- package/esm5/lib/components/advanced-table-modal/advanced-table-modal-base.component.js +0 -314
- package/esm5/lib/components/column-selector/column-selector.component.js +0 -270
- package/esm5/lib/components/column-selector/column-selector.service.js +0 -50
- package/esm5/lib/components/table-simple-header/table-simple-header.component.js +0 -58
- package/esm5/lib/directives/advance-search-state.directive.js +0 -116
- package/esm5/lib/directives/advance-table-state.directive.js +0 -65
- package/esm5/lib/directives/advanced-search-router-state.directive.js +0 -71
- package/esm5/lib/directives/advanced-table-editor.directive.js +0 -196
- package/esm5/lib/directives/btnexp.directive.js +0 -257
- package/esm5/lib/i18n/tables.el.js +0 -130
- package/esm5/lib/i18n/tables.en.js +0 -129
- package/esm5/lib/pipes/advanced-aggregator.pipe.js +0 -39
- package/esm5/lib/pipes/advansed-aggregator-list-title-parse.pipe.js +0 -49
- package/esm5/lib/reducers/index.js +0 -34
- package/esm5/lib/services/advanced-aggregator/advanced-aggregator.service.js +0 -134
- package/esm5/lib/tables.activated-table.service.js +0 -57
- package/esm5/lib/tables.module.js +0 -154
- package/esm5/public_api.js +0 -33
- package/esm5/universis-ngx-tables.js +0 -9
- package/fesm2015/universis-ngx-tables.js.map +0 -1
- package/fesm5/universis-ngx-tables.js +0 -5737
- package/fesm5/universis-ngx-tables.js.map +0 -1
- package/universis-ngx-tables.d.ts +0 -8
- package/universis-ngx-tables.metadata.json +0 -1
|
@@ -1,397 +0,0 @@
|
|
|
1
|
-
import * as tslib_1 from "tslib";
|
|
2
|
-
import { Component, ElementRef, Input, ViewChild } from '@angular/core';
|
|
3
|
-
import { RouterModalOkCancel } from '@universis/common/routing';
|
|
4
|
-
import { ActivatedRoute, Router } from '@angular/router';
|
|
5
|
-
import { AdvancedTableComponent } from '../advanced-table/advanced-table.component';
|
|
6
|
-
import { AngularDataContext } from '@themost/angular';
|
|
7
|
-
import { AdvancedFilterValueProvider } from './../advanced-table/advanced-filter-value-provider.service';
|
|
8
|
-
import { DatePipe } from '@angular/common';
|
|
9
|
-
import { TemplatePipe } from '@universis/common';
|
|
10
|
-
// important: export this const due to AOT compilation errors
|
|
11
|
-
// see more https://angular.io/guide/aot-metadata-errors#only-initialized-variables
|
|
12
|
-
export const AdvancedTableModalBaseTemplate = `
|
|
13
|
-
<div>
|
|
14
|
-
<!-- search -->
|
|
15
|
-
<div class="row mt-3">
|
|
16
|
-
<div class="col-12 col-lg-3">
|
|
17
|
-
<div class="input-group mb-3">
|
|
18
|
-
<input spellcheck="false" type="text" #searchElement
|
|
19
|
-
(keyup)="onKeyUp($event)" [(ngModel)]="searchText"
|
|
20
|
-
class="form-control bg-gray-100 border-0"
|
|
21
|
-
placeholder="{{'Tables.SearchPlaceholder' | translate}}" aria-label="Search" aria-describedby="basic-addon2">
|
|
22
|
-
<div class="input-group-append">
|
|
23
|
-
<button class="btn btn-default bg-gray-100 border-0" type="button" (click)="onSearch()">
|
|
24
|
-
<i class="fa fa-search text-secondary"></i>
|
|
25
|
-
</button>
|
|
26
|
-
</div>
|
|
27
|
-
</div>
|
|
28
|
-
</div>
|
|
29
|
-
<div #emptyTable class="d-none">
|
|
30
|
-
<div>
|
|
31
|
-
<div class="mt-4">
|
|
32
|
-
<div class="icon-circle bg-gray-300 border-gray-100"></div>
|
|
33
|
-
</div>
|
|
34
|
-
<div class="mt-4">
|
|
35
|
-
<h4 class="font-3xl text-dark" [translate]="'Tables.EmptyTableTitle'"></h4>
|
|
36
|
-
<p class="font-lg text-dark" [translate]="'Tables.EmptyTableMessage'"></p>
|
|
37
|
-
</div>
|
|
38
|
-
|
|
39
|
-
</div>
|
|
40
|
-
</div>
|
|
41
|
-
<div class="col-12 col-lg-5">
|
|
42
|
-
<div class="btn-toolbar">
|
|
43
|
-
<button class="btn btn-gray-100">
|
|
44
|
-
<i class="fa fa-sliders-h pr-2 text-secondary" aria-hidden="true"></i>{{'Tables.Filters' | translate}}
|
|
45
|
-
</button>
|
|
46
|
-
<div #dropdownFilter class="dropdown ml-3">
|
|
47
|
-
<button class="btn btn-gray-100 dropdown-toggle"
|
|
48
|
-
type="button" id="dropdownDefaultFilters"
|
|
49
|
-
data-toggle="dropdown" dropdownToggle>
|
|
50
|
-
{{ this.defaultFilter.name | translate }}
|
|
51
|
-
</button>
|
|
52
|
-
<div class="dropdown-menu" aria-labelledby="dropdownDefaultFilters">
|
|
53
|
-
<button type="button" class="dropdown-item" *ngFor="let filter of defaultFilters" (click)="onFilterSelect(filter)">
|
|
54
|
-
{{ filter.name | translate }}
|
|
55
|
-
</button>
|
|
56
|
-
</div>
|
|
57
|
-
</div>
|
|
58
|
-
</div>
|
|
59
|
-
</div>
|
|
60
|
-
<div class="col text-lg-right mt-3 mt-lg-0 d-none">
|
|
61
|
-
<button [disabled]="true" class="btn rounded-pill btn-outline-theme">
|
|
62
|
-
<span class="pr-2 font-lg">+</span><span [translate]="'Tables.AddItem'"></span>
|
|
63
|
-
</button>
|
|
64
|
-
</div>
|
|
65
|
-
</div>
|
|
66
|
-
<div class="row">
|
|
67
|
-
<div class="col-12" [ngClass]="{ 'component-loading': loading}">
|
|
68
|
-
<app-advanced-table #advancedTable (init)="onTableInit()"
|
|
69
|
-
(load)="onDataLoad($event)"
|
|
70
|
-
[selectable]="true"
|
|
71
|
-
[multipleSelect]="true"
|
|
72
|
-
[scrollX]="false" [scrollY]="320"
|
|
73
|
-
[pageLength]="pageLength"
|
|
74
|
-
[scrollable]="false" [showFooter]="false"
|
|
75
|
-
[showActions]="false" [lengthMenu]="lengthMenu"
|
|
76
|
-
[config]="tableConfig" [configSrc]="tableConfigSrc"></app-advanced-table>
|
|
77
|
-
</div>
|
|
78
|
-
</div>
|
|
79
|
-
<div class="row mt-3 table-custom-pager">
|
|
80
|
-
<div class="col-12 d-flex" *ngIf="recordsTotal">
|
|
81
|
-
<div class="mt-2 ml-auto mr-3 text-secondary" [translate]="'Tables.RecordsPerPage'"></div>
|
|
82
|
-
<div #dropdownLength class="dropdown mr-3">
|
|
83
|
-
<button class="btn btn-gray-100 dropdown-toggle"
|
|
84
|
-
type="button" id="dropdownPageSize" data-toggle="dropdown"
|
|
85
|
-
dropdownToggle>
|
|
86
|
-
{{pageLength}}
|
|
87
|
-
</button>
|
|
88
|
-
<div class="dropdown-menu" aria-labelledby="dropdownPageSize">
|
|
89
|
-
<button (click)="setLength(item)"
|
|
90
|
-
class="dropdown-item dropdown-item-theme"
|
|
91
|
-
type="button" *ngFor="let item of lengthMenu">{{item}}</button>
|
|
92
|
-
</div>
|
|
93
|
-
</div>
|
|
94
|
-
<div class="mt-2 mr-2" [translate]="'Tables.PageInfo'" [translateParams]="pageInfo"></div>
|
|
95
|
-
<button [disabled]="pageInfo && pageInfo.page === 0" class="btn text-nowrap" (click)="firstPage()">
|
|
96
|
-
<i class="fa fa-chevron-left text-color-theme"></i>
|
|
97
|
-
<i class="fa fa-chevron-left text-color-theme"></i>
|
|
98
|
-
</button>
|
|
99
|
-
<button [disabled]="pageInfo && pageInfo.page===0" class="btn" (click)="previousPage()">
|
|
100
|
-
<i class="fa fa-chevron-left text-color-theme"></i>
|
|
101
|
-
</button>
|
|
102
|
-
<button [disabled]="pageInfo && pageInfo.page===pageInfo.pages-1" class="btn" (click)="nextPage()">
|
|
103
|
-
<i class="fa fa-chevron-right text-color-theme"></i>
|
|
104
|
-
</button>
|
|
105
|
-
<button [disabled]="pageInfo && pageInfo.page===pageInfo.pages-1" class="btn text-nowrap" (click)="lastPage()">
|
|
106
|
-
<i class="fa fa-chevron-right text-color-theme"></i>
|
|
107
|
-
<i class="fa fa-chevron-right text-color-theme"></i>
|
|
108
|
-
</button>
|
|
109
|
-
</div>
|
|
110
|
-
</div>
|
|
111
|
-
</div>
|
|
112
|
-
`;
|
|
113
|
-
export class AdvancedTableModalBaseComponent extends RouterModalOkCancel {
|
|
114
|
-
constructor(_router, _activatedRoute, _context, advancedFilterValueProvider, datePipe) {
|
|
115
|
-
super(_router, _activatedRoute);
|
|
116
|
-
this._context = _context;
|
|
117
|
-
this.advancedFilterValueProvider = advancedFilterValueProvider;
|
|
118
|
-
this.datePipe = datePipe;
|
|
119
|
-
this.pageLength = 25;
|
|
120
|
-
this.lengthMenu = [5, 10, 25, 50, 100];
|
|
121
|
-
this.recordsTotal = 0;
|
|
122
|
-
this.loading = false;
|
|
123
|
-
this.recordsFiltered = 0;
|
|
124
|
-
this.defaultFilters = [AdvancedTableModalBaseComponent.DEFAULT_ALL_FILTER];
|
|
125
|
-
this.defaultFilter = AdvancedTableModalBaseComponent.DEFAULT_ALL_FILTER;
|
|
126
|
-
this.pageInfo = {
|
|
127
|
-
serverSide: true
|
|
128
|
-
};
|
|
129
|
-
this.modalClass = 'modal-xl modal-table';
|
|
130
|
-
this._template = new TemplatePipe();
|
|
131
|
-
}
|
|
132
|
-
ngAfterViewInit() {
|
|
133
|
-
setTimeout(() => {
|
|
134
|
-
if (this.searchElement && this.searchElement.nativeElement) {
|
|
135
|
-
this.searchElement.nativeElement.focus();
|
|
136
|
-
}
|
|
137
|
-
}, 0);
|
|
138
|
-
}
|
|
139
|
-
_getInputs(componentType) {
|
|
140
|
-
const props = componentType.__prop__metadata__;
|
|
141
|
-
const inputs = [];
|
|
142
|
-
if (props == null) {
|
|
143
|
-
return inputs;
|
|
144
|
-
}
|
|
145
|
-
Object.keys(props).forEach(prop => {
|
|
146
|
-
const member = props[prop][0];
|
|
147
|
-
if (member.ngMetadataName === 'Input') {
|
|
148
|
-
inputs.push(prop);
|
|
149
|
-
}
|
|
150
|
-
});
|
|
151
|
-
return inputs.sort();
|
|
152
|
-
}
|
|
153
|
-
hasInputs() {
|
|
154
|
-
return [];
|
|
155
|
-
}
|
|
156
|
-
ngOnInit() {
|
|
157
|
-
this.okButtonText = 'Tables.Apply';
|
|
158
|
-
this.cancelButtonText = 'Tables.Cancel';
|
|
159
|
-
// get route data
|
|
160
|
-
this.subscription = this.activatedRoute.data.subscribe(data => {
|
|
161
|
-
// set modal title if any
|
|
162
|
-
if (data.title) {
|
|
163
|
-
this.modalTitle = data.title;
|
|
164
|
-
}
|
|
165
|
-
if (data.config) {
|
|
166
|
-
this.tableConfig = data.config;
|
|
167
|
-
}
|
|
168
|
-
if (this.tableConfig) {
|
|
169
|
-
this.defaultFilters.push.apply(this.defaultFilters, this.tableConfig.searches);
|
|
170
|
-
}
|
|
171
|
-
// important: use hasInputs due to AOT compilation. Metadata properties cannot be used (e.g. @Input())
|
|
172
|
-
// because there are empty during runtime
|
|
173
|
-
// so we need to define manually input properties that are going to be bind through this process
|
|
174
|
-
// bind all inputs
|
|
175
|
-
const inputs = this.hasInputs();
|
|
176
|
-
inputs.forEach(input => {
|
|
177
|
-
if (Object.prototype.hasOwnProperty.call(data, input)) {
|
|
178
|
-
this[input] = data[input];
|
|
179
|
-
}
|
|
180
|
-
});
|
|
181
|
-
this.configChangesSubscription = this.advancedTable.configChanges.subscribe((config) => {
|
|
182
|
-
if (this.tableConfig) {
|
|
183
|
-
// reset default filter
|
|
184
|
-
this.defaultFilter = AdvancedTableModalBaseComponent.DEFAULT_ALL_FILTER;
|
|
185
|
-
// init filter
|
|
186
|
-
this.defaultFilters = [AdvancedTableModalBaseComponent.DEFAULT_ALL_FILTER];
|
|
187
|
-
// add extra filters
|
|
188
|
-
this.defaultFilters.push.apply(this.defaultFilters, this.tableConfig.searches);
|
|
189
|
-
}
|
|
190
|
-
});
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
cancel() {
|
|
194
|
-
return this.close();
|
|
195
|
-
}
|
|
196
|
-
ok() {
|
|
197
|
-
return this.close();
|
|
198
|
-
}
|
|
199
|
-
ngOnDestroy() {
|
|
200
|
-
if (this.subscription) {
|
|
201
|
-
this.subscription.unsubscribe();
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
onDataLoad(data) {
|
|
205
|
-
this.recordsTotal = data.recordsTotal;
|
|
206
|
-
this.recordsFiltered = data.recordsFiltered;
|
|
207
|
-
// get first page info (because page is not going to be fired for first page)
|
|
208
|
-
if (data.recordsTotal > 0 && this.pageInfo.recordsTotal === 0) {
|
|
209
|
-
this.pageInfo.recordsTotal = data.recordsTotal;
|
|
210
|
-
}
|
|
211
|
-
const self = this;
|
|
212
|
-
}
|
|
213
|
-
previousPage() {
|
|
214
|
-
// go to next page
|
|
215
|
-
// noinspection TypeScriptValidateJSTypes
|
|
216
|
-
this.advancedTable.dataTable.page('previous').draw('page');
|
|
217
|
-
}
|
|
218
|
-
nextPage() {
|
|
219
|
-
// go to next page
|
|
220
|
-
// noinspection TypeScriptValidateJSTypes
|
|
221
|
-
this.advancedTable.dataTable.page('next').draw('page');
|
|
222
|
-
}
|
|
223
|
-
onTableInit() {
|
|
224
|
-
const self = this;
|
|
225
|
-
const dataTable = self.advancedTable.dataTable;
|
|
226
|
-
// get initial page info
|
|
227
|
-
const initialPageInfo = dataTable.page.info();
|
|
228
|
-
initialPageInfo.start += 1;
|
|
229
|
-
self.pageInfo = initialPageInfo;
|
|
230
|
-
// change emptyTableMessage
|
|
231
|
-
dataTable.context[0].oLanguage.sEmptyTable = this.emptyTable.nativeElement.innerHTML;
|
|
232
|
-
// bind page change event
|
|
233
|
-
dataTable.on('page.dt', function () {
|
|
234
|
-
const pageInfo = dataTable.page.info();
|
|
235
|
-
pageInfo.start += 1;
|
|
236
|
-
self.pageInfo = pageInfo;
|
|
237
|
-
});
|
|
238
|
-
// bind draw change event
|
|
239
|
-
dataTable.on('draw.dt', function () {
|
|
240
|
-
// for future use
|
|
241
|
-
self.loading = false;
|
|
242
|
-
const pageInfo = dataTable.page.info();
|
|
243
|
-
pageInfo.start += 1;
|
|
244
|
-
self.pageInfo = pageInfo;
|
|
245
|
-
});
|
|
246
|
-
}
|
|
247
|
-
firstPage() {
|
|
248
|
-
// go to first page
|
|
249
|
-
// noinspection TypeScriptValidateJSTypes
|
|
250
|
-
this.advancedTable.dataTable.page('first').draw('page');
|
|
251
|
-
}
|
|
252
|
-
lastPage() {
|
|
253
|
-
// go to last page
|
|
254
|
-
// noinspection TypeScriptValidateJSTypes
|
|
255
|
-
this.advancedTable.dataTable.page('last').draw('page');
|
|
256
|
-
}
|
|
257
|
-
setLength(value) {
|
|
258
|
-
this.pageLength = value;
|
|
259
|
-
this.advancedTable.dataTable.page.len(value).draw();
|
|
260
|
-
}
|
|
261
|
-
onKeyUp(event) {
|
|
262
|
-
if (event.key === 'Enter' || event.key === 'Return') {
|
|
263
|
-
// loading
|
|
264
|
-
this.loading = true;
|
|
265
|
-
this.advancedTable.search(event.target.value);
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
onSearch() {
|
|
269
|
-
// loading
|
|
270
|
-
this.loading = true;
|
|
271
|
-
this.advancedTable.search(this.searchText);
|
|
272
|
-
}
|
|
273
|
-
/**
|
|
274
|
-
*
|
|
275
|
-
* Reads the modal table and returns a list of filters to use in the table
|
|
276
|
-
* query.
|
|
277
|
-
*
|
|
278
|
-
* @param tableConfig {object} The table configuration from json file
|
|
279
|
-
* @param defaultFilterValues {object} A list of default filters
|
|
280
|
-
* @param {object} searchItem The searchItem to use
|
|
281
|
-
*
|
|
282
|
-
*/
|
|
283
|
-
getFilters(tableConfig, defaultFilterValues = {}, searchItem) {
|
|
284
|
-
// Do nothing in absence of configuration.
|
|
285
|
-
if (!tableConfig || !Array.isArray(tableConfig.criteria)) {
|
|
286
|
-
return [];
|
|
287
|
-
}
|
|
288
|
-
if (searchItem.filter == null) {
|
|
289
|
-
return [];
|
|
290
|
-
}
|
|
291
|
-
const matchedCriterion = tableConfig.criteria.find(criterion => Object.prototype.hasOwnProperty.call(searchItem.filter, criterion.name));
|
|
292
|
-
if (matchedCriterion == null) {
|
|
293
|
-
return [];
|
|
294
|
-
}
|
|
295
|
-
const value = searchItem.filter[matchedCriterion.name];
|
|
296
|
-
const criterionSafeName = matchedCriterion.name !== null
|
|
297
|
-
? matchedCriterion.name.toString()
|
|
298
|
-
: '';
|
|
299
|
-
let applicableFilter;
|
|
300
|
-
// Raw dates should be transformed to a specific format
|
|
301
|
-
if (criterionSafeName.includes('GMT')) {
|
|
302
|
-
const newDate = this.datePipe.transform(criterionSafeName, 'MM/dd/yyyy');
|
|
303
|
-
applicableFilter = this._template.transform(matchedCriterion.filter, {
|
|
304
|
-
value: newDate
|
|
305
|
-
});
|
|
306
|
-
}
|
|
307
|
-
else if (criterionSafeName !== 'undefined') {
|
|
308
|
-
applicableFilter = (this._template.transform(matchedCriterion.filter, Object.assign({
|
|
309
|
-
value: value
|
|
310
|
-
}, defaultFilterValues)));
|
|
311
|
-
}
|
|
312
|
-
else {
|
|
313
|
-
applicableFilter = '';
|
|
314
|
-
}
|
|
315
|
-
return [applicableFilter];
|
|
316
|
-
}
|
|
317
|
-
onFilterSelect(value) {
|
|
318
|
-
this.advancedSearch(value);
|
|
319
|
-
}
|
|
320
|
-
/**
|
|
321
|
-
*
|
|
322
|
-
* Runs a filter against the modal table
|
|
323
|
-
*
|
|
324
|
-
* @param {object} filter The filter to use in the search
|
|
325
|
-
*
|
|
326
|
-
*/
|
|
327
|
-
advancedSearch(filter) {
|
|
328
|
-
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
329
|
-
// Do nothing in absence of configuration.
|
|
330
|
-
if (!this.tableConfig && !Array.isArray(this.tableConfig.criteria)) {
|
|
331
|
-
console.warn('No table configuration available', this.tableConfig);
|
|
332
|
-
return;
|
|
333
|
-
}
|
|
334
|
-
// An advanced table has some filters by default
|
|
335
|
-
let defaultFilterValues;
|
|
336
|
-
try {
|
|
337
|
-
defaultFilterValues = yield this.advancedFilterValueProvider.getValues();
|
|
338
|
-
}
|
|
339
|
-
catch (err) {
|
|
340
|
-
defaultFilterValues = {};
|
|
341
|
-
}
|
|
342
|
-
const expressions = [];
|
|
343
|
-
let predefinedCriteria;
|
|
344
|
-
if (filter) {
|
|
345
|
-
this.defaultFilter = filter;
|
|
346
|
-
predefinedCriteria = this.getFilters(this.tableConfig, defaultFilterValues, filter);
|
|
347
|
-
}
|
|
348
|
-
else {
|
|
349
|
-
// Empty a falsy filter resets the results
|
|
350
|
-
this.defaultFilter = AdvancedTableModalBaseComponent.DEFAULT_ALL_FILTER;
|
|
351
|
-
}
|
|
352
|
-
// search filter is applied separately, there is no need to add here.
|
|
353
|
-
expressions.push(predefinedCriteria);
|
|
354
|
-
const query = this._context.model(this.advancedTable.config.model).asQueryable();
|
|
355
|
-
query.setParam('filter', expressions.join(' and ')).prepare();
|
|
356
|
-
this.advancedTable.query = query;
|
|
357
|
-
this.advancedTable.fetch();
|
|
358
|
-
});
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
AdvancedTableModalBaseComponent.DEFAULT_ALL_FILTER = {
|
|
362
|
-
name: 'Tables.All',
|
|
363
|
-
filter: null
|
|
364
|
-
};
|
|
365
|
-
AdvancedTableModalBaseComponent.decorators = [
|
|
366
|
-
{ type: Component, args: [{
|
|
367
|
-
// tslint:disable-next-line: component-selector
|
|
368
|
-
selector: 'app-advanced-table-modal',
|
|
369
|
-
template: AdvancedTableModalBaseTemplate,
|
|
370
|
-
styles: [`
|
|
371
|
-
|
|
372
|
-
`]
|
|
373
|
-
}] }
|
|
374
|
-
];
|
|
375
|
-
/** @nocollapse */
|
|
376
|
-
AdvancedTableModalBaseComponent.ctorParameters = () => [
|
|
377
|
-
{ type: Router },
|
|
378
|
-
{ type: ActivatedRoute },
|
|
379
|
-
{ type: AngularDataContext },
|
|
380
|
-
{ type: AdvancedFilterValueProvider },
|
|
381
|
-
{ type: DatePipe }
|
|
382
|
-
];
|
|
383
|
-
AdvancedTableModalBaseComponent.propDecorators = {
|
|
384
|
-
advancedTable: [{ type: ViewChild, args: ['advancedTable',] }],
|
|
385
|
-
emptyTable: [{ type: ViewChild, args: ['emptyTable',] }],
|
|
386
|
-
dropdownFilter: [{ type: ViewChild, args: ['dropdownFilter',] }],
|
|
387
|
-
dropdownLength: [{ type: ViewChild, args: ['dropdownLength',] }],
|
|
388
|
-
searchElement: [{ type: ViewChild, args: ['searchElement',] }],
|
|
389
|
-
tableConfig: [{ type: Input, args: ['tableConfig',] }],
|
|
390
|
-
tableConfigSrc: [{ type: Input, args: ['tableConfigSrc',] }],
|
|
391
|
-
pageLength: [{ type: Input, args: ['pageLength',] }],
|
|
392
|
-
searchText: [{ type: Input, args: ['searchText',] }],
|
|
393
|
-
lengthMenu: [{ type: Input, args: ['lengthMenu',] }],
|
|
394
|
-
defaultFilter: [{ type: Input, args: ['defaultFilter',] }]
|
|
395
|
-
};
|
|
396
|
-
|
|
397
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtdGFibGUtbW9kYWwtYmFzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AdW5pdmVyc2lzL25neC10YWJsZXMvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9hZHZhbmNlZC10YWJsZS1tb2RhbC9hZHZhbmNlZC10YWJsZS1tb2RhbC1iYXNlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFxQixTQUFTLEVBQTBCLE1BQU0sZUFBZSxDQUFDO0FBQ25ILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHekQsT0FBTyxFQUFFLHNCQUFzQixFQUEyQixNQUFNLDRDQUE0QyxDQUFDO0FBQzdHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3RELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDREQUE0RCxDQUFDO0FBQ3pHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFZakQsNkRBQTZEO0FBQzdELG1GQUFtRjtBQUNuRixNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQW9HN0MsQ0FBQztBQXNCRixNQUFNLHNDQUF1QyxTQUFRLG1CQUFtQjtJQXNDdEUsWUFDRSxPQUFlLEVBQ2YsZUFBK0IsRUFDckIsUUFBNEIsRUFDNUIsMkJBQXdELEVBQ3hELFFBQWtCO1FBRTVCLEtBQUssQ0FBQyxPQUFPLEVBQUUs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O2dCQUNwQyxRQUFRLEVBQUUsOEJBQThCO3lCQUV0Qzs7S0FFQzthQUVKOzs7O1lBOUl3QixNQUFNO1lBQXRCLGNBQWM7WUFJZCxrQkFBa0I7WUFDbEIsMkJBQTJCO1lBQzNCLFFBQVE7Ozs0QkF1SmQsU0FBUyxTQUFDLGVBQWU7eUJBQ3pCLFNBQVMsU0FBQyxZQUFZOzZCQUN0QixTQUFTLFNBQUMsZ0JBQWdCOzZCQUMxQixTQUFTLFNBQUMsZ0JBQWdCOzRCQUMxQixTQUFTLFNBQUMsZUFBZTswQkFDekIsS0FBSyxTQUFDLGFBQWE7NkJBQ25CLEtBQUssU0FBQyxnQkFBZ0I7eUJBQ3RCLEtBQUssU0FBQyxZQUFZO3lCQUNsQixLQUFLLFNBQUMsWUFBWTt5QkFDbEIsS0FBSyxTQUFDLFlBQVk7NEJBTWxCLEtBQUssU0FBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIFZpZXdDaGlsZCwgQWZ0ZXJWaWV3SW5pdCwgRG9DaGVjayB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUm91dGVyTW9kYWxPa0NhbmNlbCB9IGZyb20gJ0B1bml2ZXJzaXMvY29tbW9uL3JvdXRpbmcnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBUYWJsZUNvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi9hZHZhbmNlZC10YWJsZS9hZHZhbmNlZC10YWJsZS5pbnRlcmZhY2VzJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQWR2YW5jZWRUYWJsZUNvbXBvbmVudCwgQWR2YW5jZWRUYWJsZURhdGFSZXN1bHQgfSBmcm9tICcuLi9hZHZhbmNlZC10YWJsZS9hZHZhbmNlZC10YWJsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQW5ndWxhckRhdGFDb250ZXh0IH0gZnJvbSAnQHRoZW1vc3QvYW5ndWxhcic7XG5pbXBvcnQgeyBBZHZhbmNlZEZpbHRlclZhbHVlUHJvdmlkZXIgfSBmcm9tICcuLy4uL2FkdmFuY2VkLXRhYmxlL2FkdmFuY2VkLWZpbHRlci12YWx1ZS1wcm92aWRlci5zZXJ2aWNlJztcbmltcG9ydCB7IERhdGVQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFRlbXBsYXRlUGlwZSB9IGZyb20gJ0B1bml2ZXJzaXMvY29tbW9uJztcbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBQYWdlSW5mbyB7XG4gIHBhZ2U6IG51bWJlcjtcbiAgcGFnZXM6IG51bWJlcjtcbiAgc3RhcnQ6IG51bWJlcjtcbiAgZW5kOiBudW1iZXI7XG4gIGxlbmd0aDogbnVtYmVyO1xuICByZWNvcmRzVG90YWw6IG51bWJlcjtcbiAgcmVjb3Jkc0Rpc3BsYXk6IG51bWJlcjtcbiAgc2VydmVyU2lkZT86IGJvb2xlYW47XG59XG5cbi8vIGltcG9ydGFudDogZXhwb3J0IHRoaXMgY29uc3QgZHVlIHRvIEFPVCBjb21waWxhdGlvbiBlcnJvcnNcbi8vIHNlZSBtb3JlIGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9hb3QtbWV0YWRhdGEtZXJyb3JzI29ubHktaW5pdGlhbGl6ZWQtdmFyaWFibGVzXG5leHBvcnQgY29uc3QgQWR2YW5jZWRUYWJsZU1vZGFsQmFzZVRlbXBsYXRlID0gYFxuPGRpdj5cbiAgICA8IS0tIHNlYXJjaCAtLT5cbiAgICA8ZGl2IGNsYXNzPVwicm93IG10LTNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgY29sLWxnLTNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIG1iLTNcIj5cbiAgICAgICAgICA8aW5wdXQgc3BlbGxjaGVjaz1cImZhbHNlXCIgdHlwZT1cInRleHRcIiAjc2VhcmNoRWxlbWVudFxuICAgICAgICAgICAgICAgICAoa2V5dXApPVwib25LZXlVcCgkZXZlbnQpXCIgWyhuZ01vZGVsKV09XCJzZWFyY2hUZXh0XCJcbiAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgYmctZ3JheS0xMDAgYm9yZGVyLTBcIlxuICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7J1RhYmxlcy5TZWFyY2hQbGFjZWhvbGRlcicgfCB0cmFuc2xhdGV9fVwiIGFyaWEtbGFiZWw9XCJTZWFyY2hcIiBhcmlhLWRlc2NyaWJlZGJ5PVwiYmFzaWMtYWRkb24yXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWFwcGVuZFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBiZy1ncmF5LTEwMCBib3JkZXItMFwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25TZWFyY2goKVwiPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNlYXJjaCB0ZXh0LXNlY29uZGFyeVwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAjZW1wdHlUYWJsZSBjbGFzcz1cImQtbm9uZVwiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvbi1jaXJjbGUgYmctZ3JheS0zMDAgYm9yZGVyLWdyYXktMTAwXCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTRcIj5cbiAgICAgICAgICAgIDxoNCBjbGFzcz1cImZvbnQtM3hsIHRleHQtZGFya1wiIFt0cmFuc2xhdGVdPVwiJ1RhYmxlcy5FbXB0eVRhYmxlVGl0bGUnXCI+PC9oND5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwiZm9udC1sZyB0ZXh0LWRhcmtcIiBbdHJhbnNsYXRlXT1cIidUYWJsZXMuRW1wdHlUYWJsZU1lc3NhZ2UnXCI+PC9wPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1sZy01XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJidG4tdG9vbGJhclwiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWdyYXktMTAwXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNsaWRlcnMtaCBwci0yIHRleHQtc2Vjb25kYXJ5XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPnt7J1RhYmxlcy5GaWx0ZXJzJyB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGRpdiAjZHJvcGRvd25GaWx0ZXIgY2xhc3M9XCJkcm9wZG93biBtbC0zXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1ncmF5LTEwMCBkcm9wZG93bi10b2dnbGVcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJkcm9wZG93bkRlZmF1bHRGaWx0ZXJzXCJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS10b2dnbGU9XCJkcm9wZG93blwiIGRyb3Bkb3duVG9nZ2xlPlxuICAgICAgICAgICAgICB7eyB0aGlzLmRlZmF1bHRGaWx0ZXIubmFtZSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbWVudVwiIGFyaWEtbGFiZWxsZWRieT1cImRyb3Bkb3duRGVmYXVsdEZpbHRlcnNcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgKm5nRm9yPVwibGV0IGZpbHRlciBvZiBkZWZhdWx0RmlsdGVyc1wiIChjbGljayk9XCJvbkZpbHRlclNlbGVjdChmaWx0ZXIpXCI+XG4gICAgICAgICAgICAgICAge3sgZmlsdGVyLm5hbWUgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wgdGV4dC1sZy1yaWdodCBtdC0zIG10LWxnLTAgZC1ub25lXCI+XG4gICAgICAgIDxidXR0b24gW2Rpc2FibGVkXT1cInRydWVcIiBjbGFzcz1cImJ0biByb3VuZGVkLXBpbGwgYnRuLW91dGxpbmUtdGhlbWVcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInByLTIgZm9udC1sZ1wiPis8L3NwYW4+PHNwYW4gW3RyYW5zbGF0ZV09XCInVGFibGVzLkFkZEl0ZW0nXCI+PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTJcIiBbbmdDbGFzc109XCJ7ICdjb21wb25lbnQtbG9hZGluZyc6IGxvYWRpbmd9XCI+XG4gICAgICAgIDxhcHAtYWR2YW5jZWQtdGFibGUgI2FkdmFuY2VkVGFibGUgKGluaXQpPVwib25UYWJsZUluaXQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvYWQpPVwib25EYXRhTG9hZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0YWJsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbXVsdGlwbGVTZWxlY3RdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Njcm9sbFhdPVwiZmFsc2VcIiBbc2Nyb2xsWV09XCIzMjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwYWdlTGVuZ3RoXT1cInBhZ2VMZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzY3JvbGxhYmxlXT1cImZhbHNlXCIgW3Nob3dGb290ZXJdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93QWN0aW9uc109XCJmYWxzZVwiIFtsZW5ndGhNZW51XT1cImxlbmd0aE1lbnVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb25maWddPVwidGFibGVDb25maWdcIiBbY29uZmlnU3JjXT1cInRhYmxlQ29uZmlnU3JjXCI+PC9hcHAtYWR2YW5jZWQtdGFibGU+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicm93IG10LTMgdGFibGUtY3VzdG9tLXBhZ2VyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGQtZmxleFwiICpuZ0lmPVwicmVjb3Jkc1RvdGFsXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yIG1sLWF1dG8gbXItMyB0ZXh0LXNlY29uZGFyeVwiIFt0cmFuc2xhdGVdPVwiJ1RhYmxlcy5SZWNvcmRzUGVyUGFnZSdcIj48L2Rpdj5cbiAgICAgICAgPGRpdiAjZHJvcGRvd25MZW5ndGggY2xhc3M9XCJkcm9wZG93biBtci0zXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tZ3JheS0xMDAgZHJvcGRvd24tdG9nZ2xlXCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBpZD1cImRyb3Bkb3duUGFnZVNpemVcIiBkYXRhLXRvZ2dsZT1cImRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgICAgIGRyb3Bkb3duVG9nZ2xlPlxuICAgICAgICAgICAge3twYWdlTGVuZ3RofX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbWVudVwiIGFyaWEtbGFiZWxsZWRieT1cImRyb3Bkb3duUGFnZVNpemVcIj5cbiAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInNldExlbmd0aChpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24taXRlbSBkcm9wZG93bi1pdGVtLXRoZW1lXCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGxlbmd0aE1lbnVcIj57e2l0ZW19fTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm10LTIgbXItMlwiIFt0cmFuc2xhdGVdPVwiJ1RhYmxlcy5QYWdlSW5mbydcIiBbdHJhbnNsYXRlUGFyYW1zXT1cInBhZ2VJbmZvXCI+PC9kaXY+XG4gICAgICAgIDxidXR0b24gW2Rpc2FibGVkXT1cInBhZ2VJbmZvICYmIHBhZ2VJbmZvLnBhZ2UgPT09IDBcIiBjbGFzcz1cImJ0biB0ZXh0LW5vd3JhcFwiIChjbGljayk9XCJmaXJzdFBhZ2UoKVwiPlxuICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1sZWZ0IHRleHQtY29sb3ItdGhlbWVcIj48L2k+XG4gICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLWxlZnQgdGV4dC1jb2xvci10aGVtZVwiPjwvaT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gW2Rpc2FibGVkXT1cInBhZ2VJbmZvICYmIHBhZ2VJbmZvLnBhZ2U9PT0wXCIgY2xhc3M9XCJidG5cIiAoY2xpY2spPVwicHJldmlvdXNQYWdlKClcIj5cbiAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNoZXZyb24tbGVmdCB0ZXh0LWNvbG9yLXRoZW1lXCI+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwicGFnZUluZm8gJiYgcGFnZUluZm8ucGFnZT09PXBhZ2VJbmZvLnBhZ2VzLTFcIiBjbGFzcz1cImJ0blwiIChjbGljayk9XCJuZXh0UGFnZSgpXCI+XG4gICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLXJpZ2h0IHRleHQtY29sb3ItdGhlbWVcIj48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCJwYWdlSW5mbyAmJiBwYWdlSW5mby5wYWdlPT09cGFnZUluZm8ucGFnZXMtMVwiIGNsYXNzPVwiYnRuIHRleHQtbm93cmFwXCIgKGNsaWNrKT1cImxhc3RQYWdlKClcIj5cbiAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNoZXZyb24tcmlnaHQgdGV4dC1jb2xvci10aGVtZVwiPjwvaT5cbiAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNoZXZyb24tcmlnaHQgdGV4dC1jb2xvci10aGVtZVwiPjwvaT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5gO1xuXG4vKipcbiAqXG4gKiBBIHNwZWNpZmljIHZhbHVlIGZvciBhIGNyaXRlcmlvblxuICpcbiAqL1xuaW50ZXJmYWNlIFNlYXJjaEl0ZW0ge1xuICBmaWx0ZXI6IGFueTtcbiAgbmFtZTogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBjb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdhcHAtYWR2YW5jZWQtdGFibGUtbW9kYWwnLFxuICB0ZW1wbGF0ZTogQWR2YW5jZWRUYWJsZU1vZGFsQmFzZVRlbXBsYXRlLFxuICBzdHlsZXM6IFtcbiAgICBgXG5cbiAgICBgXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgQWR2YW5jZWRUYWJsZU1vZGFsQmFzZUNvbXBvbmVudCBleHRlbmRzIFJvdXRlck1vZGFsT2tDYW5jZWwgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnNlYXJjaEVsZW1lbnQgJiYgdGhpcy5zZWFyY2hFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5zZWFyY2hFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9LCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfQUxMX0ZJTFRFUiA9IHtcbiAgICBuYW1lOiAnVGFibGVzLkFsbCcsXG4gICAgZmlsdGVyOiBudWxsXG4gIH07XG5cbiAgQFZpZXdDaGlsZCgnYWR2YW5jZWRUYWJsZScpIGFkdmFuY2VkVGFibGU6IEFkdmFuY2VkVGFibGVDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ2VtcHR5VGFibGUnKSBlbXB0eVRhYmxlOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdkcm9wZG93bkZpbHRlcicpIGRyb3Bkb3duRmlsdGVyOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdkcm9wZG93bkxlbmd0aCcpIGRyb3Bkb3duTGVuZ3RoOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdzZWFyY2hFbGVtZW50Jykgc2VhcmNoRWxlbWVudDogYW55O1xuICBASW5wdXQoJ3RhYmxlQ29uZmlnJykgdGFibGVDb25maWc6IFRhYmxlQ29uZmlndXJhdGlvbjtcbiAgQElucHV0KCd0YWJsZUNvbmZpZ1NyYycpIHRhYmxlQ29uZmlnU3JjOiBzdHJpbmc7XG4gIEBJbnB1dCgncGFnZUxlbmd0aCcpIHBhZ2VMZW5ndGggPSAyNTtcbiAgQElucHV0KCdzZWFyY2hUZXh0Jykgc2VhcmNoVGV4dDogc3RyaW5nO1xuICBASW5wdXQoJ2xlbmd0aE1lbnUnKSBsZW5ndGhNZW51OiBBcnJheTxudW1iZXI+ID0gWzUsIDEwLCAyNSwgNTAsIDEwMF07XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHB1YmxpYyByZWNvcmRzVG90YWwgPSAwO1xuICBwdWJsaWMgbG9hZGluZyA9IGZhbHNlO1xuICBwdWJsaWMgcmVjb3Jkc0ZpbHRlcmVkID0gMDtcbiAgcHVibGljIGRlZmF1bHRGaWx0ZXJzOiBBcnJheTxhbnk+ID0gW0FkdmFuY2VkVGFibGVNb2RhbEJhc2VDb21wb25lbnQuREVGQVVMVF9BTExfRklMVEVSXTtcbiAgQElucHV0KCdkZWZhdWx0RmlsdGVyJykgZGVmYXVsdEZpbHRlciA9IEFkdmFuY2VkVGFibGVNb2RhbEJhc2VDb21wb25lbnQuREVGQVVMVF9BTExfRklMVEVSO1xuIFxuXG4gIHB1YmxpYyBwYWdlSW5mbyA9IDxQYWdlSW5mbz57XG4gICAgc2VydmVyU2lkZTogdHJ1ZVxuICB9O1xuICBwcml2YXRlIF90ZW1wbGF0ZTogVGVtcGxhdGVQaXBlO1xuICBjb25maWdDaGFuZ2VzU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgY29uc3RydWN0b3IoXG4gICAgX3JvdXRlcjogUm91dGVyLFxuICAgIF9hY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJvdGVjdGVkIF9jb250ZXh0OiBBbmd1bGFyRGF0YUNvbnRleHQsXG4gICAgcHJvdGVjdGVkIGFkdmFuY2VkRmlsdGVyVmFsdWVQcm92aWRlcjogQWR2YW5jZWRGaWx0ZXJWYWx1ZVByb3ZpZGVyLFxuICAgIHByb3RlY3RlZCBkYXRlUGlwZTogRGF0ZVBpcGVcbiAgKSB7XG4gICAgc3VwZXIoX3JvdXRlciwgX2FjdGl2YXRlZFJvdXRlKTtcbiAgICB0aGlzLm1vZGFsQ2xhc3MgPSAnbW9kYWwteGwgbW9kYWwtdGFibGUnO1xuICAgIHRoaXMuX3RlbXBsYXRlID0gbmV3IFRlbXBsYXRlUGlwZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0SW5wdXRzKGNvbXBvbmVudFR5cGUpOiBBcnJheTxhbnk+IHtcbiAgICBjb25zdCBwcm9wcyA9IGNvbXBvbmVudFR5cGUuX19wcm9wX19tZXRhZGF0YV9fO1xuICAgIGNvbnN0IGlucHV0cyA9IFtdO1xuICAgIGlmIChwcm9wcyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gaW5wdXRzO1xuICAgIH1cbiAgICBPYmplY3Qua2V5cyhwcm9wcykuZm9yRWFjaChwcm9wID0+IHtcbiAgICAgIGNvbnN0IG1lbWJlciA9IHByb3BzW3Byb3BdWzBdO1xuICAgICAgaWYgKG1lbWJlci5uZ01ldGFkYXRhTmFtZSA9PT0gJ0lucHV0Jykge1xuICAgICAgICBpbnB1dHMucHVzaChwcm9wKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gaW5wdXRzLnNvcnQoKTtcbiAgfVxuXG4gIHB1YmxpYyBoYXNJbnB1dHMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG5cbiAgICB0aGlzLm9rQnV0dG9uVGV4dCA9ICdUYWJsZXMuQXBwbHknO1xuICAgIHRoaXMuY2FuY2VsQnV0dG9uVGV4dCA9ICdUYWJsZXMuQ2FuY2VsJztcbiAgICAvLyBnZXQgcm91dGUgZGF0YVxuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5hY3RpdmF0ZWRSb3V0ZS5kYXRhLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgIC8vIHNldCBtb2RhbCB0aXRsZSBpZiBhbnlcbiAgICAgIGlmIChkYXRhLnRpdGxlKSB7XG4gICAgICAgIHRoaXMubW9kYWxUaXRsZSA9IGRhdGEudGl0bGU7XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhLmNvbmZpZykge1xuICAgICAgICB0aGlzLnRhYmxlQ29uZmlnID0gZGF0YS5jb25maWc7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy50YWJsZUNvbmZpZykge1xuICAgICAgICB0aGlzLmRlZmF1bHRGaWx0ZXJzLnB1c2guYXBwbHkodGhpcy5kZWZhdWx0RmlsdGVycywgdGhpcy50YWJsZUNvbmZpZy5zZWFyY2hlcyk7XG4gICAgICB9XG4gICAgICAvLyBpbXBvcnRhbnQ6IHVzZSBoYXNJbnB1dHMgZHVlIHRvIEFPVCBjb21waWxhdGlvbi4gTWV0YWRhdGEgcHJvcGVydGllcyBjYW5ub3QgYmUgdXNlZCAoZS5nLiBASW5wdXQoKSlcbiAgICAgIC8vIGJlY2F1c2UgdGhlcmUgYXJlIGVtcHR5IGR1cmluZyBydW50aW1lXG4gICAgICAvLyBzbyB3ZSBuZWVkIHRvIGRlZmluZSBtYW51YWxseSBpbnB1dCBwcm9wZXJ0aWVzIHRoYXQgYXJlIGdvaW5nIHRvIGJlIGJpbmQgdGhyb3VnaCB0aGlzIHByb2Nlc3NcbiAgICAgIC8vIGJpbmQgYWxsIGlucHV0c1xuICAgICAgY29uc3QgaW5wdXRzID0gdGhpcy5oYXNJbnB1dHMoKTtcbiAgICAgIGlucHV0cy5mb3JFYWNoKGlucHV0ID0+IHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBpbnB1dCkpIHtcbiAgICAgICAgICB0aGlzW2lucHV0XSA9IGRhdGFbaW5wdXRdO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5jb25maWdDaGFuZ2VzU3Vic2NyaXB0aW9uID0gdGhpcy5hZHZhbmNlZFRhYmxlLmNvbmZpZ0NoYW5nZXMuc3Vic2NyaWJlKChjb25maWcpID0+IHtcbiAgICAgICAgaWYgKHRoaXMudGFibGVDb25maWcpIHtcbiAgICAgICAgICAvLyByZXNldCBkZWZhdWx0IGZpbHRlclxuICAgICAgICAgIHRoaXMuZGVmYXVsdEZpbHRlciA9IEFkdmFuY2VkVGFibGVNb2RhbEJhc2VDb21wb25lbnQuREVGQVVMVF9BTExfRklMVEVSO1xuICAgICAgICAgIC8vIGluaXQgZmlsdGVyXG4gICAgICAgICAgdGhpcy5kZWZhdWx0RmlsdGVycyA9IFtBZHZhbmNlZFRhYmxlTW9kYWxCYXNlQ29tcG9uZW50LkRFRkFVTFRfQUxMX0ZJTFRFUl07XG4gICAgICAgICAgLy8gYWRkIGV4dHJhIGZpbHRlcnNcbiAgICAgICAgICB0aGlzLmRlZmF1bHRGaWx0ZXJzLnB1c2guYXBwbHkodGhpcy5kZWZhdWx0RmlsdGVycywgdGhpcy50YWJsZUNvbmZpZy5zZWFyY2hlcyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgfSk7XG4gIH1cblxuICBjYW5jZWwoKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5jbG9zZSgpO1xuICB9XG5cbiAgb2soKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5jbG9zZSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIG9uRGF0YUxvYWQoZGF0YTogQWR2YW5jZWRUYWJsZURhdGFSZXN1bHQpIHtcbiAgICB0aGlzLnJlY29yZHNUb3RhbCA9IGRhdGEucmVjb3Jkc1RvdGFsO1xuICAgIHRoaXMucmVjb3Jkc0ZpbHRlcmVkID0gZGF0YS5yZWNvcmRzRmlsdGVyZWQ7XG4gICAgLy8gZ2V0IGZpcnN0IHBhZ2UgaW5mbyAoYmVjYXVzZSBwYWdlIGlzIG5vdCBnb2luZyB0byBiZSBmaXJlZCBmb3IgZmlyc3QgcGFnZSlcbiAgICBpZiAoZGF0YS5yZWNvcmRzVG90YWwgPiAwICYmIHRoaXMucGFnZUluZm8ucmVjb3Jkc1RvdGFsID09PSAwKSB7XG4gICAgICB0aGlzLnBhZ2VJbmZvLnJlY29yZHNUb3RhbCA9IGRhdGEucmVjb3Jkc1RvdGFsO1xuICAgIH1cbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgfVxuXG4gIHByZXZpb3VzUGFnZSgpIHtcbiAgICAvLyBnbyB0byBuZXh0IHBhZ2VcbiAgICAvLyBub2luc3BlY3Rpb24gVHlwZVNjcmlwdFZhbGlkYXRlSlNUeXBlc1xuICAgIHRoaXMuYWR2YW5jZWRUYWJsZS5kYXRhVGFibGUucGFnZSgncHJldmlvdXMnKS5kcmF3KCdwYWdlJyk7XG4gIH1cblxuICBuZXh0UGFnZSgpIHtcbiAgICAvLyBnbyB0byBuZXh0IHBhZ2VcbiAgICAvLyBub2luc3BlY3Rpb24gVHlwZVNjcmlwdFZhbGlkYXRlSlNUeXBlc1xuICAgIHRoaXMuYWR2YW5jZWRUYWJsZS5kYXRhVGFibGUucGFnZSgnbmV4dCcpLmRyYXcoJ3BhZ2UnKTtcbiAgfVxuXG4gIG9uVGFibGVJbml0KCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IGRhdGFUYWJsZSA9IHNlbGYuYWR2YW5jZWRUYWJsZS5kYXRhVGFibGU7XG4gICAgLy8gZ2V0IGluaXRpYWwgcGFnZSBpbmZvXG4gICAgY29uc3QgaW5pdGlhbFBhZ2VJbmZvID0gPFBhZ2VJbmZvPmRhdGFUYWJsZS5wYWdlLmluZm8oKTtcbiAgICBpbml0aWFsUGFnZUluZm8uc3RhcnQgKz0gMTtcbiAgICBzZWxmLnBhZ2VJbmZvID0gaW5pdGlhbFBhZ2VJbmZvO1xuICAgIC8vIGNoYW5nZSBlbXB0eVRhYmxlTWVzc2FnZVxuICAgIGRhdGFUYWJsZS5jb250ZXh0WzBdLm9MYW5ndWFnZS5zRW1wdHlUYWJsZSA9IHRoaXMuZW1wdHlUYWJsZS5uYXRpdmVFbGVtZW50LmlubmVySFRNTDtcbiAgICAvLyBiaW5kIHBhZ2UgY2hhbmdlIGV2ZW50XG4gICAgZGF0YVRhYmxlLm9uKCdwYWdlLmR0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcGFnZUluZm8gPSA8UGFnZUluZm8+ZGF0YVRhYmxlLnBhZ2UuaW5mbygpO1xuICAgICAgcGFnZUluZm8uc3RhcnQgKz0gMTtcbiAgICAgIHNlbGYucGFnZUluZm8gPSBwYWdlSW5mbztcbiAgICB9KTtcbiAgICAvLyBiaW5kIGRyYXcgY2hhbmdlIGV2ZW50XG4gICAgZGF0YVRhYmxlLm9uKCdkcmF3LmR0JywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gZm9yIGZ1dHVyZSB1c2VcbiAgICAgIHNlbGYubG9hZGluZyA9IGZhbHNlO1xuICAgICAgY29uc3QgcGFnZUluZm8gPSA8UGFnZUluZm8+ZGF0YVRhYmxlLnBhZ2UuaW5mbygpO1xuICAgICAgcGFnZUluZm8uc3RhcnQgKz0gMTtcbiAgICAgIHNlbGYucGFnZUluZm8gPSBwYWdlSW5mbztcbiAgICB9KTtcbiAgfVxuXG4gIGZpcnN0UGFnZSgpIHtcbiAgICAvLyBnbyB0byBmaXJzdCBwYWdlXG4gICAgLy8gbm9pbnNwZWN0aW9uIFR5cGVTY3JpcHRWYWxpZGF0ZUpTVHlwZXNcbiAgICB0aGlzLmFkdmFuY2VkVGFibGUuZGF0YVRhYmxlLnBhZ2UoJ2ZpcnN0JykuZHJhdygncGFnZScpO1xuICB9XG5cbiAgbGFzdFBhZ2UoKSB7XG4gICAgLy8gZ28gdG8gbGFzdCBwYWdlXG4gICAgLy8gbm9pbnNwZWN0aW9uIFR5cGVTY3JpcHRWYWxpZGF0ZUpTVHlwZXNcbiAgICB0aGlzLmFkdmFuY2VkVGFibGUuZGF0YVRhYmxlLnBhZ2UoJ2xhc3QnKS5kcmF3KCdwYWdlJyk7XG4gIH1cblxuICBzZXRMZW5ndGgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMucGFnZUxlbmd0aCA9IHZhbHVlO1xuICAgIHRoaXMuYWR2YW5jZWRUYWJsZS5kYXRhVGFibGUucGFnZS5sZW4odmFsdWUpLmRyYXcoKTtcbiAgfVxuXG4gIG9uS2V5VXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInIHx8IGV2ZW50LmtleSA9PT0gJ1JldHVybicpIHtcbiAgICAgIC8vIGxvYWRpbmdcbiAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICB0aGlzLmFkdmFuY2VkVGFibGUuc2VhcmNoKCg8SFRNTElucHV0RWxlbWVudD5ldmVudC50YXJnZXQpLnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBvblNlYXJjaCgpIHtcbiAgICAvLyBsb2FkaW5nXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmFkdmFuY2VkVGFibGUuc2VhcmNoKHRoaXMuc2VhcmNoVGV4dCk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogUmVhZHMgdGhlIG1vZGFsIHRhYmxlIGFuZCByZXR1cm5zIGEgbGlzdCBvZiBmaWx0ZXJzIHRvIHVzZSBpbiB0aGUgdGFibGVcbiAgICogcXVlcnkuXG4gICAqXG4gICAqIEBwYXJhbSB0YWJsZUNvbmZpZyB7b2JqZWN0fSBUaGUgdGFibGUgY29uZmlndXJhdGlvbiBmcm9tIGpzb24gZmlsZVxuICAgKiBAcGFyYW0gZGVmYXVsdEZpbHRlclZhbHVlcyB7b2JqZWN0fSBBIGxpc3Qgb2YgZGVmYXVsdCBmaWx0ZXJzXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzZWFyY2hJdGVtIFRoZSBzZWFyY2hJdGVtIHRvIHVzZVxuICAgKlxuICAgKi9cbiAgZ2V0RmlsdGVycyhcbiAgICB0YWJsZUNvbmZpZzogYW55LFxuICAgIGRlZmF1bHRGaWx0ZXJWYWx1ZXMgPSB7fSxcbiAgICBzZWFyY2hJdGVtOiBhbnlcbiAgKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgLy8gRG8gbm90aGluZyBpbiBhYnNlbmNlIG9mIGNvbmZpZ3VyYXRpb24uXG4gICAgaWYgKCF0YWJsZUNvbmZpZyB8fCAhQXJyYXkuaXNBcnJheSh0YWJsZUNvbmZpZy5jcml0ZXJpYSkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBpZiAoc2VhcmNoSXRlbS5maWx0ZXIgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IG1hdGNoZWRDcml0ZXJpb24gPSB0YWJsZUNvbmZpZy5jcml0ZXJpYS5maW5kKGNyaXRlcmlvbiA9PlxuICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNlYXJjaEl0ZW0uZmlsdGVyLCBjcml0ZXJpb24ubmFtZSlcbiAgICApO1xuXG4gICAgaWYgKG1hdGNoZWRDcml0ZXJpb24gPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gc2VhcmNoSXRlbS5maWx0ZXJbbWF0Y2hlZENyaXRlcmlvbi5uYW1lXTtcblxuICAgIGNvbnN0IGNyaXRlcmlvblNhZmVOYW1lID0gbWF0Y2hlZENyaXRlcmlvbi5uYW1lICE9PSBudWxsXG4gICAgICA/IG1hdGNoZWRDcml0ZXJpb24ubmFtZS50b1N0cmluZygpXG4gICAgICA6ICcnO1xuXG4gICAgbGV0IGFwcGxpY2FibGVGaWx0ZXI6IHN0cmluZztcblxuICAgIC8vIFJhdyBkYXRlcyBzaG91bGQgYmUgdHJhbnNmb3JtZWQgdG8gYSBzcGVjaWZpYyBmb3JtYXRcbiAgICBpZiAoY3JpdGVyaW9uU2FmZU5hbWUuaW5jbHVkZXMoJ0dNVCcpKSB7XG4gICAgICBjb25zdCBuZXdEYXRlID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oY3JpdGVyaW9uU2FmZU5hbWUsICdNTS9kZC95eXl5Jyk7XG4gICAgICBhcHBsaWNhYmxlRmlsdGVyID0gdGhpcy5fdGVtcGxhdGUudHJhbnNmb3JtKG1hdGNoZWRDcml0ZXJpb24uZmlsdGVyLCB7XG4gICAgICAgIHZhbHVlOiBuZXdEYXRlXG4gICAgICB9KTtcblxuICAgIH0gZWxzZSBpZiAoY3JpdGVyaW9uU2FmZU5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBhcHBsaWNhYmxlRmlsdGVyID0gKHRoaXMuX3RlbXBsYXRlLnRyYW5zZm9ybShtYXRjaGVkQ3JpdGVyaW9uLmZpbHRlciwgT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSwgZGVmYXVsdEZpbHRlclZhbHVlcykpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwbGljYWJsZUZpbHRlciA9ICcnO1xuICAgIH1cblxuICAgIHJldHVybiBbYXBwbGljYWJsZUZpbHRlcl07XG4gIH1cblxuICBvbkZpbHRlclNlbGVjdCh2YWx1ZTogeyBmaWx0ZXI6IGFueTsgbmFtZTogc3RyaW5nIH0gfCBhbnkpIHtcbiAgICB0aGlzLmFkdmFuY2VkU2VhcmNoKHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBSdW5zIGEgZmlsdGVyIGFnYWluc3QgdGhlIG1vZGFsIHRhYmxlXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBmaWx0ZXIgVGhlIGZpbHRlciB0byB1c2UgaW4gdGhlIHNlYXJjaFxuICAgKlxuICAgKi9cbiAgYXN5bmMgYWR2YW5jZWRTZWFyY2goZmlsdGVyKTogUHJvbWlzZTxhbnk+IHtcbiAgICAvLyBEbyBub3RoaW5nIGluIGFic2VuY2Ugb2YgY29uZmlndXJhdGlvbi5cbiAgICBpZiAoIXRoaXMudGFibGVDb25maWcgJiYgIUFycmF5LmlzQXJyYXkodGhpcy50YWJsZUNvbmZpZy5jcml0ZXJpYSkpIHtcbiAgICAgIGNvbnNvbGUud2FybignTm8gdGFibGUgY29uZmlndXJhdGlvbiBhdmFpbGFibGUnLCB0aGlzLnRhYmxlQ29uZmlnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBbiBhZHZhbmNlZCB0YWJsZSBoYXMgc29tZSBmaWx0ZXJzIGJ5IGRlZmF1bHRcbiAgICBsZXQgZGVmYXVsdEZpbHRlclZhbHVlcztcbiAgICB0cnkge1xuICAgICAgZGVmYXVsdEZpbHRlclZhbHVlcyA9IGF3YWl0IHRoaXMuYWR2YW5jZWRGaWx0ZXJWYWx1ZVByb3ZpZGVyLmdldFZhbHVlcygpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgZGVmYXVsdEZpbHRlclZhbHVlcyA9IHt9O1xuICAgIH1cblxuICAgIGNvbnN0IGV4cHJlc3Npb25zID0gW107XG4gICAgbGV0IHByZWRlZmluZWRDcml0ZXJpYTtcbiAgICBpZiAoZmlsdGVyKSB7XG4gICAgICB0aGlzLmRlZmF1bHRGaWx0ZXIgPSBmaWx0ZXI7XG4gICAgICBwcmVkZWZpbmVkQ3JpdGVyaWEgPSB0aGlzLmdldEZpbHRlcnMoXG4gICAgICAgIHRoaXMudGFibGVDb25maWcsXG4gICAgICAgIGRlZmF1bHRGaWx0ZXJWYWx1ZXMsXG4gICAgICAgIGZpbHRlclxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRW1wdHkgYSBmYWxzeSBmaWx0ZXIgcmVzZXRzIHRoZSByZXN1bHRzXG4gICAgICB0aGlzLmRlZmF1bHRGaWx0ZXIgPSBBZHZhbmNlZFRhYmxlTW9kYWxCYXNlQ29tcG9uZW50LkRFRkFVTFRfQUxMX0ZJTFRFUjtcbiAgICB9XG5cbiAgICAvLyBzZWFyY2ggZmlsdGVyIGlzIGFwcGxpZWQgc2VwYXJhdGVseSwgdGhlcmUgaXMgbm8gbmVlZCB0byBhZGQgaGVyZS5cbiAgICBleHByZXNzaW9ucy5wdXNoKHByZWRlZmluZWRDcml0ZXJpYSk7XG5cbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuX2NvbnRleHQubW9kZWwodGhpcy5hZHZhbmNlZFRhYmxlLmNvbmZpZy5tb2RlbCkuYXNRdWVyeWFibGUoKTtcbiAgICBxdWVyeS5zZXRQYXJhbSgnZmlsdGVyJywgZXhwcmVzc2lvbnMuam9pbignIGFuZCAnKSkucHJlcGFyZSgpO1xuICAgIHRoaXMuYWR2YW5jZWRUYWJsZS5xdWVyeSA9IHF1ZXJ5O1xuICAgIHRoaXMuYWR2YW5jZWRUYWJsZS5mZXRjaCgpO1xuICB9XG59XG5cbiJdfQ==
|