@cqa-lib/cqa-ui 0.1.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/action-menu/action-menu.component.mjs +42 -0
- package/esm2020/lib/assets/images/image-assets.constants.mjs +28 -0
- package/esm2020/lib/badge/badge.component.mjs +141 -0
- package/esm2020/lib/button/button.component.mjs +232 -0
- package/esm2020/lib/column-visibility/column-visibility.component.mjs +69 -0
- package/esm2020/lib/dashboards/chart-card/chart-card.component.mjs +22 -0
- package/esm2020/lib/dashboards/coverage-module-card/coverage-module-card.component.mjs +104 -0
- package/esm2020/lib/dashboards/dashboard-header/dashboard-header.component.mjs +82 -0
- package/esm2020/lib/dashboards/failed-test-cases-card/failed-test-cases-card.component.mjs +60 -0
- package/esm2020/lib/dashboards/heat-error-map-cell/heat-error-map-cell.component.mjs +45 -0
- package/esm2020/lib/dashboards/insight-card/insight-card.component.mjs +201 -0
- package/esm2020/lib/dashboards/metrics-card/metrics-block.component.mjs +41 -0
- package/esm2020/lib/dashboards/metrics-card/metrics-card-item.interface.mjs +2 -0
- package/esm2020/lib/dashboards/metrics-card/metrics-card.component.mjs +62 -0
- package/esm2020/lib/dashboards/progress-text-card/progress-text-card.component.mjs +46 -0
- package/esm2020/lib/dashboards/test-distribution-card/test-distribution-card.component.mjs +35 -0
- package/esm2020/lib/dialog/dialog.component.mjs +127 -0
- package/esm2020/lib/dropdown-button/dropdown-button.component.mjs +189 -0
- package/esm2020/lib/dynamic-select/dynamic-select-field.component.mjs +160 -0
- package/esm2020/lib/empty-state/empty-state.component.mjs +37 -0
- package/esm2020/lib/filters/dynamic-filter/dynamic-filter.component.mjs +239 -0
- package/esm2020/lib/full-table-loader/full-table-loader.component.mjs +16 -0
- package/esm2020/lib/inline-sort/inline-sort.component.mjs +58 -0
- package/esm2020/lib/other-button/other-button.component.mjs +76 -0
- package/esm2020/lib/pagination/pagination.component.mjs +102 -0
- package/{dist/cqa-ui/esm2020 → esm2020}/lib/search-bar/search-bar.component.mjs +3 -3
- package/{dist/cqa-ui/esm2020 → esm2020}/lib/segment-control/segment-control.component.mjs +3 -3
- package/esm2020/lib/selected-filters/selected-filters.component.mjs +27 -0
- package/esm2020/lib/table/dynamic-table/dynamic-cell.directive.mjs +35 -0
- package/esm2020/lib/table/dynamic-table/dynamic-table.component.mjs +258 -0
- package/esm2020/lib/table-action-toolbar/table-action-toolbar.component.mjs +52 -0
- package/esm2020/lib/table-data-loader/table-data-loader.component.mjs +19 -0
- package/esm2020/lib/templates/table-template.component.mjs +365 -0
- package/esm2020/lib/ui-kit.module.mjs +248 -0
- package/esm2020/lib/utils/metadata-colors.util.mjs +100 -0
- package/esm2020/lib/utils/tw-overlay-container.mjs +22 -0
- package/esm2020/public-api.mjs +38 -0
- package/fesm2015/cqa-lib-cqa-ui.mjs +3661 -0
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -0
- package/fesm2020/cqa-lib-cqa-ui.mjs +3615 -0
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -0
- package/lib/action-menu/action-menu.component.d.ts +17 -0
- package/lib/assets/images/image-assets.constants.d.ts +20 -0
- package/lib/badge/badge.component.d.ts +25 -0
- package/{dist/cqa-ui/lib → lib}/button/button.component.d.ts +6 -5
- package/lib/column-visibility/column-visibility.component.d.ts +33 -0
- package/lib/dashboards/chart-card/chart-card.component.d.ts +8 -0
- package/lib/dashboards/coverage-module-card/coverage-module-card.component.d.ts +44 -0
- package/lib/dashboards/dashboard-header/dashboard-header.component.d.ts +30 -0
- package/lib/dashboards/failed-test-cases-card/failed-test-cases-card.component.d.ts +28 -0
- package/lib/dashboards/heat-error-map-cell/heat-error-map-cell.component.d.ts +14 -0
- package/lib/dashboards/insight-card/insight-card.component.d.ts +73 -0
- package/lib/dashboards/metrics-card/metrics-block.component.d.ts +12 -0
- package/lib/dashboards/metrics-card/metrics-card-item.interface.d.ts +12 -0
- package/lib/dashboards/metrics-card/metrics-card.component.d.ts +17 -0
- package/lib/dashboards/progress-text-card/progress-text-card.component.d.ts +13 -0
- package/lib/dashboards/test-distribution-card/test-distribution-card.component.d.ts +29 -0
- package/lib/dropdown-button/dropdown-button.component.d.ts +32 -0
- package/lib/dynamic-select/dynamic-select-field.component.d.ts +43 -0
- package/lib/empty-state/empty-state.component.d.ts +20 -0
- package/lib/filters/dynamic-filter/dynamic-filter.component.d.ts +56 -0
- package/lib/full-table-loader/full-table-loader.component.d.ts +6 -0
- package/lib/inline-sort/inline-sort.component.d.ts +12 -0
- package/lib/other-button/other-button.component.d.ts +37 -0
- package/lib/pagination/pagination.component.d.ts +37 -0
- package/lib/selected-filters/selected-filters.component.d.ts +17 -0
- package/lib/table/dynamic-table/dynamic-cell.directive.d.ts +16 -0
- package/lib/table/dynamic-table/dynamic-table.component.d.ts +72 -0
- package/lib/table-action-toolbar/table-action-toolbar.component.d.ts +34 -0
- package/lib/table-data-loader/table-data-loader.component.d.ts +7 -0
- package/lib/templates/table-template.component.d.ts +90 -0
- package/lib/ui-kit.module.d.ts +52 -0
- package/lib/utils/metadata-colors.util.d.ts +50 -0
- package/lib/utils/tw-overlay-container.d.ts +12 -0
- package/package.json +23 -49
- package/public-api.d.ts +37 -0
- package/src/lib/assets/images/.gitkeep +0 -0
- package/src/lib/assets/images/DashboardIcon.png +0 -0
- package/src/lib/assets/images/FilesIcon.png +0 -0
- package/src/lib/assets/images/README.md +66 -0
- package/src/lib/assets/images/ReportsIcon.png +0 -0
- package/src/lib/assets/images/SearchIcon.png +0 -0
- package/src/lib/assets/images/StepsIcon.png +0 -0
- package/src/lib/assets/images/TestCaseIcon.png +0 -0
- package/src/lib/assets/images/analytics-chart-icon.svg +11 -0
- package/src/lib/assets/images/checklist-add-icon.svg +10 -0
- package/src/lib/assets/images/document-gear-icon.svg +9 -0
- package/src/lib/assets/images/empty-state-default-icon.svg +8 -0
- package/src/lib/assets/images/image-assets.constants.ts +38 -0
- package/src/lib/assets/images/search-debug-icon.svg +8 -0
- package/src/lib/assets/images/test-case-icon.svg +9 -0
- package/src/lib/assets/images/upload-folder-icon.svg +7 -0
- package/src/lib/utils/metadata-colors.constants.js +33 -0
- package/storybook-static/assets/images/README.md +66 -0
- package/styles.css +1 -0
- package/dist/cqa-ui/README.md +0 -226
- package/dist/cqa-ui/esm2020/lib/button/button.component.mjs +0 -257
- package/dist/cqa-ui/esm2020/lib/dialog/dialog.component.mjs +0 -127
- package/dist/cqa-ui/esm2020/lib/ui-kit.module.mjs +0 -69
- package/dist/cqa-ui/esm2020/public-api.mjs +0 -10
- package/dist/cqa-ui/fesm2015/cqa-lib-cqa-ui.mjs +0 -895
- package/dist/cqa-ui/fesm2015/cqa-lib-cqa-ui.mjs.map +0 -1
- package/dist/cqa-ui/fesm2020/cqa-lib-cqa-ui.mjs +0 -881
- package/dist/cqa-ui/fesm2020/cqa-lib-cqa-ui.mjs.map +0 -1
- package/dist/cqa-ui/lib/ui-kit.module.d.ts +0 -15
- package/dist/cqa-ui/package.json +0 -56
- package/dist/cqa-ui/public-api.d.ts +0 -9
- package/dist/cqa-ui/styles.css +0 -1
- /package/{dist/cqa-ui/cqa-lib-cqa-ui.d.ts → cqa-lib-cqa-ui.d.ts} +0 -0
- /package/{dist/cqa-ui/esm2020 → esm2020}/cqa-lib-cqa-ui.mjs +0 -0
- /package/{dist/cqa-ui/esm2020 → esm2020}/lib/dialog/dialog-ref.mjs +0 -0
- /package/{dist/cqa-ui/esm2020 → esm2020}/lib/dialog/dialog.models.mjs +0 -0
- /package/{dist/cqa-ui/esm2020 → esm2020}/lib/dialog/dialog.service.mjs +0 -0
- /package/{dist/cqa-ui/esm2020 → esm2020}/lib/dialog/dialog.tokens.mjs +0 -0
- /package/{dist/cqa-ui/lib → lib}/dialog/dialog-ref.d.ts +0 -0
- /package/{dist/cqa-ui/lib → lib}/dialog/dialog.component.d.ts +0 -0
- /package/{dist/cqa-ui/lib → lib}/dialog/dialog.models.d.ts +0 -0
- /package/{dist/cqa-ui/lib → lib}/dialog/dialog.service.d.ts +0 -0
- /package/{dist/cqa-ui/lib → lib}/dialog/dialog.tokens.d.ts +0 -0
- /package/{dist/cqa-ui/lib → lib}/search-bar/search-bar.component.d.ts +0 -0
- /package/{dist/cqa-ui/lib → lib}/segment-control/segment-control.component.d.ts +0 -0
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
import { Component, Input, } from '@angular/core';
|
|
2
|
+
import { EMPTY_STATE_IMAGES } from '../assets/images/image-assets.constants';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "../search-bar/search-bar.component";
|
|
5
|
+
import * as i2 from "../button/button.component";
|
|
6
|
+
import * as i3 from "../column-visibility/column-visibility.component";
|
|
7
|
+
import * as i4 from "../selected-filters/selected-filters.component";
|
|
8
|
+
import * as i5 from "../filters/dynamic-filter/dynamic-filter.component";
|
|
9
|
+
import * as i6 from "../table/dynamic-table/dynamic-table.component";
|
|
10
|
+
import * as i7 from "../action-menu/action-menu.component";
|
|
11
|
+
import * as i8 from "../empty-state/empty-state.component";
|
|
12
|
+
import * as i9 from "../pagination/pagination.component";
|
|
13
|
+
import * as i10 from "../table-action-toolbar/table-action-toolbar.component";
|
|
14
|
+
import * as i11 from "@angular/common";
|
|
15
|
+
import * as i12 from "../table/dynamic-table/dynamic-cell.directive";
|
|
16
|
+
export class TableTemplateComponent {
|
|
17
|
+
constructor() {
|
|
18
|
+
// Search bar inputs
|
|
19
|
+
this.searchPlaceholder = 'Search components';
|
|
20
|
+
this.searchValue = '';
|
|
21
|
+
this.showClear = true;
|
|
22
|
+
this.showSearchBar = true;
|
|
23
|
+
// Filter inputs
|
|
24
|
+
this.filterConfig = [];
|
|
25
|
+
this.showFilterPanel = false;
|
|
26
|
+
this.showFilterButton = true;
|
|
27
|
+
// Other button input
|
|
28
|
+
this.otherButtonLabel = 'Other Button';
|
|
29
|
+
this.otherButtonVariant = 'filled';
|
|
30
|
+
this.showOtherButton = true;
|
|
31
|
+
// Action menu button (three-dot menu in table rows)
|
|
32
|
+
this.showActionButton = true;
|
|
33
|
+
// Settings and refresh buttons
|
|
34
|
+
this.showSettingsButton = true;
|
|
35
|
+
this.showAutoRefreshButton = true;
|
|
36
|
+
// Data input
|
|
37
|
+
this.data = [];
|
|
38
|
+
// Empty state inputs
|
|
39
|
+
this.isEmptyState = false;
|
|
40
|
+
this.emptyStateConfig = {
|
|
41
|
+
title: 'No Data Available Yet',
|
|
42
|
+
description: 'Run or upload your first test to see your analytics and trends here. Watch your quality metrics come to life with real-time insights.',
|
|
43
|
+
imageUrl: EMPTY_STATE_IMAGES.DASHBOARD,
|
|
44
|
+
actions: [{ label: 'Run Test Suite', variant: 'filled' }],
|
|
45
|
+
};
|
|
46
|
+
// Action bar inputs
|
|
47
|
+
this.actions = [
|
|
48
|
+
{
|
|
49
|
+
id: 'delete',
|
|
50
|
+
label: 'Delete',
|
|
51
|
+
icon: 'delete',
|
|
52
|
+
tooltip: 'Delete selected',
|
|
53
|
+
onClick: (context) => {
|
|
54
|
+
console.log('Delete action clicked:', context);
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
id: 'edit',
|
|
59
|
+
label: 'Edit',
|
|
60
|
+
icon: 'edit',
|
|
61
|
+
tooltip: 'Edit selected',
|
|
62
|
+
onClick: (context) => {
|
|
63
|
+
console.log('Edit action clicked:', context);
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
id: 'add-tag',
|
|
68
|
+
label: 'Add Tag',
|
|
69
|
+
icon: 'local_offer',
|
|
70
|
+
tooltip: 'Add tags',
|
|
71
|
+
onClick: (context) => {
|
|
72
|
+
console.log('Add tag action clicked:', context);
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
id: 'remove-tag',
|
|
77
|
+
label: 'Remove Tag',
|
|
78
|
+
icon: 'label_off',
|
|
79
|
+
tooltip: 'Remove tags',
|
|
80
|
+
onClick: (context) => {
|
|
81
|
+
console.log('Remove tag action clicked:', context);
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
];
|
|
85
|
+
// Chips inputs
|
|
86
|
+
this.chips = [];
|
|
87
|
+
this.filterApplied = false;
|
|
88
|
+
// Table inputs
|
|
89
|
+
this.columns = [];
|
|
90
|
+
this.selectedAutoRefreshInterval = 0;
|
|
91
|
+
this.pageIndex = 0;
|
|
92
|
+
this.pageSize = 10;
|
|
93
|
+
// Backward-compatibility flag; if provided, dynamic table will use it when specific flags are undefined
|
|
94
|
+
// Internal state for column visibility
|
|
95
|
+
this._columnVisibility = {};
|
|
96
|
+
this._cachedVisibilityColumns = [];
|
|
97
|
+
this.filteredRows = [];
|
|
98
|
+
this.pagedRows = [];
|
|
99
|
+
}
|
|
100
|
+
// Derived columns with visibility applied. Avoid mutating @Input() columns so parent bindings aren't overridden.
|
|
101
|
+
get computedColumns() {
|
|
102
|
+
const visibility = this._columnVisibility || {};
|
|
103
|
+
const source = this.columns || [];
|
|
104
|
+
return source.map(col => {
|
|
105
|
+
if (['checkbox', 'actions'].includes(col.fieldId)) {
|
|
106
|
+
return col;
|
|
107
|
+
}
|
|
108
|
+
const show = visibility[col.fieldId];
|
|
109
|
+
return { ...col, isShow: show !== false };
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
// Auto-generated visibility columns from columns input (excludes default columns and checkbox/actions)
|
|
113
|
+
// Cached to avoid creating new arrays on every change detection cycle
|
|
114
|
+
get visibilityColumns() {
|
|
115
|
+
return this._cachedVisibilityColumns;
|
|
116
|
+
}
|
|
117
|
+
// Internal column visibility state
|
|
118
|
+
get columnVisibility() {
|
|
119
|
+
return this._columnVisibility;
|
|
120
|
+
}
|
|
121
|
+
ngOnInit() {
|
|
122
|
+
this.initializeComponent();
|
|
123
|
+
}
|
|
124
|
+
ngOnChanges(changes) {
|
|
125
|
+
if (changes['data'] || changes['isEmptyState']) {
|
|
126
|
+
this.initializeComponent();
|
|
127
|
+
}
|
|
128
|
+
if (changes['columns']) {
|
|
129
|
+
this.initializeColumnVisibility();
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
initializeComponent() {
|
|
133
|
+
if (this.isEmptyState) {
|
|
134
|
+
this.filteredRows = [];
|
|
135
|
+
this.pagedRows = [];
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
this.filteredRows = [...this.data];
|
|
139
|
+
this.applyPagination();
|
|
140
|
+
this.initializeColumnVisibility();
|
|
141
|
+
}
|
|
142
|
+
initializeColumnVisibility() {
|
|
143
|
+
// Cache visibility columns to avoid creating new arrays on every change detection
|
|
144
|
+
this._cachedVisibilityColumns = this.mapVisibilityColumns();
|
|
145
|
+
// Initialize visibility state for all visibility columns (default to true)
|
|
146
|
+
for (const col of this._cachedVisibilityColumns) {
|
|
147
|
+
if (this._columnVisibility[col.id] === undefined) {
|
|
148
|
+
this._columnVisibility[col.id] = true;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
get anyRowSelected() {
|
|
153
|
+
return !!(this.pagedRows && this.pagedRows.some(r => !!r.isSelected));
|
|
154
|
+
}
|
|
155
|
+
get currentSelectedItems() {
|
|
156
|
+
return (this.pagedRows || []).filter(r => !!r.isSelected);
|
|
157
|
+
}
|
|
158
|
+
actionClick(data) {
|
|
159
|
+
console.log('action toolbar', data);
|
|
160
|
+
}
|
|
161
|
+
view(id) {
|
|
162
|
+
console.log('View', id);
|
|
163
|
+
}
|
|
164
|
+
edit(row) {
|
|
165
|
+
console.log('Edit', row);
|
|
166
|
+
}
|
|
167
|
+
delete(row) {
|
|
168
|
+
console.log('Delete', row);
|
|
169
|
+
}
|
|
170
|
+
onRowCheckboxChange(event, row) {
|
|
171
|
+
const input = event.target;
|
|
172
|
+
const checked = !!input?.checked;
|
|
173
|
+
row.isSelected = checked;
|
|
174
|
+
}
|
|
175
|
+
toggleFilter() {
|
|
176
|
+
this.showFilterPanel = !this.showFilterPanel;
|
|
177
|
+
}
|
|
178
|
+
onColumnVisibilityChange(cfg) {
|
|
179
|
+
this._columnVisibility = { ...cfg };
|
|
180
|
+
// Do not mutate this.columns; computedColumns getter will reflect changes
|
|
181
|
+
}
|
|
182
|
+
onAutoRefreshChange(intervalMs) {
|
|
183
|
+
this.selectedAutoRefreshInterval = intervalMs;
|
|
184
|
+
console.log('Auto refresh interval', intervalMs);
|
|
185
|
+
}
|
|
186
|
+
valueChange(value) {
|
|
187
|
+
console.log('Value changed', value);
|
|
188
|
+
}
|
|
189
|
+
search(value) {
|
|
190
|
+
console.log('Search', value);
|
|
191
|
+
}
|
|
192
|
+
cleared() {
|
|
193
|
+
console.log('Cleared');
|
|
194
|
+
}
|
|
195
|
+
resultBadgeClass(result) {
|
|
196
|
+
const value = (result || '').toUpperCase();
|
|
197
|
+
if (value === 'SUCCESS')
|
|
198
|
+
return 'cqa-bg-green-100 cqa-text-green-700';
|
|
199
|
+
if (value === 'FAILURE' || value === 'ABORTED')
|
|
200
|
+
return 'cqa-bg-red-100 cqa-text-red-700';
|
|
201
|
+
if (value === 'QUEUED' || value === 'NOT_EXECUTED' || value === 'STOPPED')
|
|
202
|
+
return 'cqa-bg-gray-100 cqa-text-gray-700';
|
|
203
|
+
return 'cqa-bg-gray-100 cqa-text-gray-700';
|
|
204
|
+
}
|
|
205
|
+
onEmptyAction(action) {
|
|
206
|
+
if (action?.label === 'Show filters') {
|
|
207
|
+
this.toggleFilter();
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
onFiltersChanged(current) {
|
|
211
|
+
this.filteredRows = this.data.filter(r => this.passFilters(current, r));
|
|
212
|
+
this.pageIndex = 0;
|
|
213
|
+
this.applyPagination();
|
|
214
|
+
const chips = [];
|
|
215
|
+
if (current) {
|
|
216
|
+
for (const key of Object.keys(current)) {
|
|
217
|
+
const value = current[key];
|
|
218
|
+
if (value == null || value === '' || (Array.isArray(value) && value.length === 0))
|
|
219
|
+
continue;
|
|
220
|
+
let text = '';
|
|
221
|
+
if (Array.isArray(value)) {
|
|
222
|
+
text = value.map((v) => (v?.name ?? v?.label ?? v?.value ?? v)).join(', ');
|
|
223
|
+
}
|
|
224
|
+
else if (typeof value === 'object') {
|
|
225
|
+
if ('start' in value || 'end' in value) {
|
|
226
|
+
const s = value.start ? new Date(value.start).toLocaleDateString() : '';
|
|
227
|
+
const e = value.end ? new Date(value.end).toLocaleDateString() : '';
|
|
228
|
+
text = [s, e].filter(Boolean).join(' - ');
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
text = (value?.name ?? value?.label ?? value?.value ?? JSON.stringify(value));
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
text = String(value);
|
|
236
|
+
}
|
|
237
|
+
chips.push({ key, text, fullText: text, hasMore: text.length > 30 });
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
this.chips = chips;
|
|
241
|
+
this.filterApplied = this.chips.length > 0;
|
|
242
|
+
}
|
|
243
|
+
onFiltersApplied(_) {
|
|
244
|
+
// handled in onFiltersChanged for this demo
|
|
245
|
+
}
|
|
246
|
+
onPaginate(e) {
|
|
247
|
+
this.pageIndex = e.pageIndex;
|
|
248
|
+
this.pageSize = e.pageSize;
|
|
249
|
+
this.applyPagination();
|
|
250
|
+
}
|
|
251
|
+
onPageSizeChange(size) {
|
|
252
|
+
this.pageSize = size;
|
|
253
|
+
this.pageIndex = 0;
|
|
254
|
+
this.applyPagination();
|
|
255
|
+
}
|
|
256
|
+
onRemoveChip(chip) {
|
|
257
|
+
this.chips = this.chips.filter(c => c !== chip);
|
|
258
|
+
this.filterApplied = this.chips.length > 0;
|
|
259
|
+
}
|
|
260
|
+
onClearAllChips() {
|
|
261
|
+
this.chips = [];
|
|
262
|
+
this.filterApplied = false;
|
|
263
|
+
}
|
|
264
|
+
applyPagination() {
|
|
265
|
+
const start = this.pageIndex * this.pageSize;
|
|
266
|
+
const end = start + this.pageSize;
|
|
267
|
+
this.pagedRows = this.filteredRows.slice(start, end);
|
|
268
|
+
}
|
|
269
|
+
mapVisibilityColumns() {
|
|
270
|
+
return (this.columns || [])
|
|
271
|
+
.filter(c => c.isDefault === false)
|
|
272
|
+
.map(c => ({ id: c.fieldId, label: c.fieldName || c.fieldId }));
|
|
273
|
+
}
|
|
274
|
+
normalizeDate(d) {
|
|
275
|
+
if (!d)
|
|
276
|
+
return null;
|
|
277
|
+
const ts = Date.parse(d);
|
|
278
|
+
return isNaN(ts) ? null : ts;
|
|
279
|
+
}
|
|
280
|
+
passFilters(filters, row) {
|
|
281
|
+
if (!filters)
|
|
282
|
+
return true;
|
|
283
|
+
if (filters.status && Array.isArray(filters.status) && filters.status.length) {
|
|
284
|
+
if (!filters.status.includes(row.status))
|
|
285
|
+
return false;
|
|
286
|
+
}
|
|
287
|
+
if (filters.priority && Array.isArray(filters.priority) && filters.priority.length) {
|
|
288
|
+
if (!filters.priority.includes(row.priorityName))
|
|
289
|
+
return false;
|
|
290
|
+
}
|
|
291
|
+
if (filters.testType && Array.isArray(filters.testType) && filters.testType.length) {
|
|
292
|
+
if (!filters.testType.includes(row.testType))
|
|
293
|
+
return false;
|
|
294
|
+
}
|
|
295
|
+
if (filters.created_date && (filters.created_date.start || filters.created_date.end)) {
|
|
296
|
+
const startTs = this.normalizeDate(filters.created_date.start);
|
|
297
|
+
const endTs = this.normalizeDate(filters.created_date.end);
|
|
298
|
+
const rowTs = this.normalizeDate(row.createdAt);
|
|
299
|
+
if (rowTs != null) {
|
|
300
|
+
if (startTs != null && rowTs < startTs)
|
|
301
|
+
return false;
|
|
302
|
+
if (endTs != null && rowTs > endTs)
|
|
303
|
+
return false;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
return true;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
TableTemplateComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TableTemplateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
310
|
+
TableTemplateComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TableTemplateComponent, selector: "cqa-table-template", inputs: { searchPlaceholder: "searchPlaceholder", searchValue: "searchValue", showClear: "showClear", showSearchBar: "showSearchBar", filterConfig: "filterConfig", showFilterPanel: "showFilterPanel", showFilterButton: "showFilterButton", otherButtonLabel: "otherButtonLabel", otherButtonVariant: "otherButtonVariant", showOtherButton: "showOtherButton", showActionButton: "showActionButton", showSettingsButton: "showSettingsButton", showAutoRefreshButton: "showAutoRefreshButton", data: "data", isEmptyState: "isEmptyState", emptyStateConfig: "emptyStateConfig", actions: "actions", chips: "chips", filterApplied: "filterApplied", columns: "columns", selectedAutoRefreshInterval: "selectedAutoRefreshInterval", pageIndex: "pageIndex", pageSize: "pageSize", isTableLoading: "isTableLoading", isTableDataLoading: "isTableDataLoading" }, usesOnChanges: true, ngImport: i0, template: "<div id=\"cqa-ui-root\">\n <div class=\"cqa-w-full cqa-flex cqa-flex-col cqa-relative\">\n <div class=\"cqa-w-full cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-flex-wrap cqa-mb-3\">\n <cqa-search-bar\n *ngIf=\"showSearchBar\"\n [placeholder]=\"searchPlaceholder\"\n [value]=\"searchValue\"\n [showClear]=\"showClear\"\n (valueChange)=\"valueChange($event)\"\n (search)=\"search($event)\"\n (cleared)=\"cleared()\"\n ></cqa-search-bar>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-flex-wrap\">\n <cqa-button\n *ngIf=\"showFilterButton\"\n variant=\"grey-solid\"\n icon=\"add\"\n [text]=\"'Filter'\"\n (clicked)=\"toggleFilter()\"\n >\n <span>Filter</span>\n </cqa-button>\n <cqa-column-visibility\n *ngIf=\"showSettingsButton\"\n [columns]=\"visibilityColumns\"\n [columnVisibility]=\"columnVisibility\"\n [selectedAutoRefreshInterval]=\"selectedAutoRefreshInterval\"\n (columnVisibilityChange)=\"onColumnVisibilityChange($event)\"\n (autoRefreshChange)=\"onAutoRefreshChange($event)\"\n ></cqa-column-visibility>\n <cqa-button *ngIf=\"showAutoRefreshButton\" variant=\"grey-solid\" icon=\"refresh\"></cqa-button>\n <cqa-button *ngIf=\"showOtherButton\" [variant]=\"otherButtonVariant\" [text]=\"otherButtonLabel\"></cqa-button>\n </div>\n </div>\n\n <cqa-selected-filters \n *ngIf=\"showFilterPanel\"\n [filterApplied]=\"filterApplied\"\n [chips]=\"chips\"\n (removeChip)=\"onRemoveChip($event)\"\n (clearAll)=\"onClearAllChips()\"\n >\n </cqa-selected-filters>\n\n <cqa-dynamic-filter\n *ngIf=\"showFilterPanel\"\n [config]=\"filterConfig\"\n [showFilterPanel]=\"showFilterPanel\"\n (filtersChanged)=\"onFiltersChanged($event)\"\n (filtersApplied)=\"onFiltersApplied($event)\"\n >\n </cqa-dynamic-filter>\n\n <div class=\"cqa-rounded-[7px] cqa-overflow-hidden cqa-border-t cqa-border-l cqa-border-r cqa-border-grey-200 cqa-relative\">\n <ng-container *ngIf=\"!isEmptyState && pagedRows && pagedRows.length > 0; else storyEmptyTpl\">\n <app-dynamic-table\n [columns]=\"computedColumns\"\n [data]=\"pagedRows\"\n [isTableLoading]=\"isTableLoading\"\n [isTableDataLoading]=\"isTableDataLoading\">\n <ng-template dynamicCell=\"checkbox\" let-row=\"row\">\n <div class=\"custom-checkbox\">\n <input\n type=\"checkbox\"\n class=\"hidden-checkbox\"\n [attr.id]=\"'row-checkbox-' + row.id\"\n [checked]=\"row.isSelected\"\n aria-label=\"Select row\"\n (change)=\"onRowCheckboxChange($event, row)\" />\n <label\n class=\"custom-checkbox-label\"\n [attr.for]=\"'row-checkbox-' + row.id\">\n </label>\n </div>\n </ng-template>\n\n <ng-template dynamicCell=\"testCases\" let-row=\"row\" let-value=\"value\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-text-[12.3px] cqa-leading-[17.5px] cqa-font-medium\">\n <div class=\"cqa-text-[#3F43EE] cqa-truncate\">\n #{{ row.id }}\n </div>\n <div class=\"cqa-text-[#0A0A0A]\">{{ value }}</div>\n </div>\n </ng-template>\n\n <ng-template dynamicCell=\"type\" let-row=\"row\" let-value=\"value\">\n <div class=\"cqa-text-xs cqa-text-[#111827] cqa-truncate\">{{ value }}</div>\n </ng-template>\n\n <ng-template dynamicCell=\"priority\" let-row=\"row\" let-value=\"value\">\n <span\n class=\"cqa-inline-flex cqa-items-center cqa-px-2 cqa-py-0.5 cqa-rounded cqa-text-xs\"\n [ngClass]=\"{\n 'cqa-bg-red-100 cqa-text-red-700': value === 'Critical' || value === 'Major',\n 'cqa-bg-yellow-100 cqa-text-yellow-700': value === 'Medium',\n 'cqa-bg-blue-100 cqa-text-blue-700': value === 'Minor',\n 'cqa-bg-gray-100 cqa-text-gray-700': !value || value === 'Not Set'\n }\"\n >{{ value || 'Not Set' }}</span\n >\n </ng-template>\n\n <ng-template dynamicCell=\"result\" let-row=\"row\" let-value=\"value\">\n <span class=\"cqa-inline-flex cqa-items-center cqa-px-2 cqa-py-0.5 cqa-rounded cqa-text-xs\" [ngClass]=\"resultBadgeClass(value)\">\n {{ value || 'NOT_EXECUTED' }}\n </span>\n </ng-template>\n\n <ng-template dynamicCell=\"status\" let-row=\"row\" let-value=\"value\">\n <span class=\"cqa-text-xs\">{{ value }}</span>\n </ng-template>\n\n <ng-template dynamicCell=\"labels\" let-row=\"row\" let-value=\"value\">\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-1\">\n <span *ngFor=\"let tag of (row.tags || []) | slice: 0:3\" class=\"cqa-px-2 cqa-py-0.5 cqa-rounded cqa-bg-gray-100 cqa-text-gray-700 cqa-text-xs\">\n {{ tag }}\n </span>\n <span *ngIf=\"(row.tags?.length || 0) > 3\" class=\"cqa-px-2 cqa-py-0.5 cqa-rounded cqa-bg-gray-100 cqa-text-gray-700 cqa-text-xs\">\n +{{ (row.tags?.length || 0) - 3 }} more\n </span>\n </div>\n </ng-template>\n\n <ng-template dynamicCell=\"createdBy\" let-row=\"row\" let-value=\"value\">\n <span class=\"cqa-text-xs\">{{ value }}</span>\n </ng-template>\n\n <ng-template dynamicCell=\"createdAt\" let-row=\"row\" let-value=\"value\">\n <span class=\"cqa-text-xs cqa-text-gray-700\">{{ value | date: 'medium' }}</span>\n </ng-template>\n\n <ng-template dynamicCell=\"updatedAt\" let-row=\"row\" let-value=\"value\">\n <span class=\"cqa-text-xs cqa-text-gray-700\">{{ value | date: 'medium' }}</span>\n </ng-template>\n\n <ng-template dynamicCell=\"lastRun\" let-row=\"row\">\n <div class=\"cqa-flex cqa-flex-col\">\n <span class=\"cqa-text-xs cqa-text-[#111827]\">{{ row.lastRun?.startTime | date: 'medium' }}</span>\n </div>\n </ng-template>\n\n <ng-template dynamicCell=\"actions\" let-row=\"row\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" *ngIf=\"showActionButton\">\n <cqa-action-menu-button\n [row]=\"row\"\n (view)=\"view($event)\"\n (edit)=\"edit($event)\"\n (delete)=\"delete($event)\"\n ></cqa-action-menu-button>\n </div>\n </ng-template>\n\n <ng-template #emptyTableTpl>\n <div class=\"cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-py-8\">\n <img src=\"/assets/illustrations/empty-state.svg\" alt=\"No data\" class=\"cqa-w-32 cqa-h-32 cqa-mb-4\" />\n <h3 class=\"cqa-text-lg cqa-font-semibold cqa-mb-2\">No test cases</h3>\n <p class=\"cqa-text-sm cqa-text-neutral-500 cqa-mb-4\">Try adjusting filters or create a new test case.</p>\n <cqa-button variant=\"filled\" (clicked)=\"toggleFilter()\">Show Filters</cqa-button>\n </div>\n </ng-template>\n </app-dynamic-table>\n </ng-container>\n\n <ng-template #storyEmptyTpl>\n <div class=\"cqa-p-6 cqa-flex cqa-flex-col cqa-items-center cqa-justify-center\">\n <cqa-empty-state\n *ngIf=\"isEmptyState\"\n [title]=\"emptyStateConfig.title\"\n [description]=\"emptyStateConfig.description\"\n [imageUrl]=\"emptyStateConfig.imageUrl\"\n [actions]=\"emptyStateConfig.actions\"\n (actionClick)=\"onEmptyAction($event)\"\n >\n </cqa-empty-state>\n </div>\n </ng-template>\n\n </div>\n\n <cqa-pagination\n [totalElements]=\"filteredRows.length\"\n [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [pageItemCount]=\"pagedRows.length\"\n (paginate)=\"onPaginate($event)\"\n (pageSizeChange)=\"onPageSizeChange($event)\"\n >\n </cqa-pagination>\n\n <div *ngIf=\"anyRowSelected\" class=\"cqa-absolute cqa-bottom-[18.75px] cqa-left-[50%] cqa-translate-x-[-50%] cqa-w-full lg:cqa-max-w-[68%] cqa-sm:max-w-[75%] cqa-max-w-[90%] cqa-z-[1]\" >\n <cqa-table-action-toolbar\n [selectedItems]=\"currentSelectedItems\"\n [actions]=\"actions\"\n (actionClick)=\"actionClick($event)\"\n ></cqa-table-action-toolbar>\n </div>\n \n </div>\n</div>\n\n", components: [{ type: i1.SearchBarComponent, selector: "cqa-search-bar", inputs: ["placeholder", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth"], outputs: ["valueChange", "search", "cleared"] }, { type: i2.ButtonComponent, selector: "cqa-button", inputs: ["variant", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass"], outputs: ["clicked"] }, { type: i3.ColumnVisibilityComponent, selector: "cqa-column-visibility", inputs: ["isStepGroup", "columns", "columnVisibility", "selectedAutoRefreshInterval"], outputs: ["columnVisibilityChange", "autoRefreshChange"] }, { type: i4.SelectedFiltersComponent, selector: "cqa-selected-filters", inputs: ["filterApplied", "chips"], outputs: ["removeChip", "clearAll"] }, { type: i5.DynamicFilterComponent, selector: "cqa-dynamic-filter", inputs: ["config", "model", "showFilterPanel"], outputs: ["filtersApplied", "filtersChanged", "resetAction"] }, { type: i6.DynamicTableComponent, selector: "app-dynamic-table", inputs: ["data", "columns", "emptyState", "gridTemplateColumns", "screenWidth", "enableSelectAll", "enableLocalSort", "isTableLoading", "isTableDataLoading"], outputs: ["sortChange"] }, { type: i7.ActionMenuButtonComponent, selector: "cqa-action-menu-button", inputs: ["row"], outputs: ["view", "edit", "delete"] }, { type: i8.EmptyStateComponent, selector: "cqa-empty-state", inputs: ["imageUrl", "title", "description", "actions"], outputs: ["actionClick"] }, { type: i9.PaginationComponent, selector: "cqa-pagination", inputs: ["totalElements", "totalPages", "pageIndex", "pageSize", "pageItemCount", "pageSizeOptions"], outputs: ["pageIndexChange", "pageSizeChange", "paginate"] }, { type: i10.TableActionToolbarComponent, selector: "cqa-table-action-toolbar", inputs: ["selectedItems", "actions"], outputs: ["actionClick"] }], directives: [{ type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i12.DynamicCellTemplateDirective, selector: "ng-template[dynamicCell]", inputs: ["dynamicCell"] }, { type: i11.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "slice": i11.SlicePipe, "date": i11.DatePipe } });
|
|
311
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TableTemplateComponent, decorators: [{
|
|
312
|
+
type: Component,
|
|
313
|
+
args: [{ selector: 'cqa-table-template', template: "<div id=\"cqa-ui-root\">\n <div class=\"cqa-w-full cqa-flex cqa-flex-col cqa-relative\">\n <div class=\"cqa-w-full cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-flex-wrap cqa-mb-3\">\n <cqa-search-bar\n *ngIf=\"showSearchBar\"\n [placeholder]=\"searchPlaceholder\"\n [value]=\"searchValue\"\n [showClear]=\"showClear\"\n (valueChange)=\"valueChange($event)\"\n (search)=\"search($event)\"\n (cleared)=\"cleared()\"\n ></cqa-search-bar>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-flex-wrap\">\n <cqa-button\n *ngIf=\"showFilterButton\"\n variant=\"grey-solid\"\n icon=\"add\"\n [text]=\"'Filter'\"\n (clicked)=\"toggleFilter()\"\n >\n <span>Filter</span>\n </cqa-button>\n <cqa-column-visibility\n *ngIf=\"showSettingsButton\"\n [columns]=\"visibilityColumns\"\n [columnVisibility]=\"columnVisibility\"\n [selectedAutoRefreshInterval]=\"selectedAutoRefreshInterval\"\n (columnVisibilityChange)=\"onColumnVisibilityChange($event)\"\n (autoRefreshChange)=\"onAutoRefreshChange($event)\"\n ></cqa-column-visibility>\n <cqa-button *ngIf=\"showAutoRefreshButton\" variant=\"grey-solid\" icon=\"refresh\"></cqa-button>\n <cqa-button *ngIf=\"showOtherButton\" [variant]=\"otherButtonVariant\" [text]=\"otherButtonLabel\"></cqa-button>\n </div>\n </div>\n\n <cqa-selected-filters \n *ngIf=\"showFilterPanel\"\n [filterApplied]=\"filterApplied\"\n [chips]=\"chips\"\n (removeChip)=\"onRemoveChip($event)\"\n (clearAll)=\"onClearAllChips()\"\n >\n </cqa-selected-filters>\n\n <cqa-dynamic-filter\n *ngIf=\"showFilterPanel\"\n [config]=\"filterConfig\"\n [showFilterPanel]=\"showFilterPanel\"\n (filtersChanged)=\"onFiltersChanged($event)\"\n (filtersApplied)=\"onFiltersApplied($event)\"\n >\n </cqa-dynamic-filter>\n\n <div class=\"cqa-rounded-[7px] cqa-overflow-hidden cqa-border-t cqa-border-l cqa-border-r cqa-border-grey-200 cqa-relative\">\n <ng-container *ngIf=\"!isEmptyState && pagedRows && pagedRows.length > 0; else storyEmptyTpl\">\n <app-dynamic-table\n [columns]=\"computedColumns\"\n [data]=\"pagedRows\"\n [isTableLoading]=\"isTableLoading\"\n [isTableDataLoading]=\"isTableDataLoading\">\n <ng-template dynamicCell=\"checkbox\" let-row=\"row\">\n <div class=\"custom-checkbox\">\n <input\n type=\"checkbox\"\n class=\"hidden-checkbox\"\n [attr.id]=\"'row-checkbox-' + row.id\"\n [checked]=\"row.isSelected\"\n aria-label=\"Select row\"\n (change)=\"onRowCheckboxChange($event, row)\" />\n <label\n class=\"custom-checkbox-label\"\n [attr.for]=\"'row-checkbox-' + row.id\">\n </label>\n </div>\n </ng-template>\n\n <ng-template dynamicCell=\"testCases\" let-row=\"row\" let-value=\"value\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-text-[12.3px] cqa-leading-[17.5px] cqa-font-medium\">\n <div class=\"cqa-text-[#3F43EE] cqa-truncate\">\n #{{ row.id }}\n </div>\n <div class=\"cqa-text-[#0A0A0A]\">{{ value }}</div>\n </div>\n </ng-template>\n\n <ng-template dynamicCell=\"type\" let-row=\"row\" let-value=\"value\">\n <div class=\"cqa-text-xs cqa-text-[#111827] cqa-truncate\">{{ value }}</div>\n </ng-template>\n\n <ng-template dynamicCell=\"priority\" let-row=\"row\" let-value=\"value\">\n <span\n class=\"cqa-inline-flex cqa-items-center cqa-px-2 cqa-py-0.5 cqa-rounded cqa-text-xs\"\n [ngClass]=\"{\n 'cqa-bg-red-100 cqa-text-red-700': value === 'Critical' || value === 'Major',\n 'cqa-bg-yellow-100 cqa-text-yellow-700': value === 'Medium',\n 'cqa-bg-blue-100 cqa-text-blue-700': value === 'Minor',\n 'cqa-bg-gray-100 cqa-text-gray-700': !value || value === 'Not Set'\n }\"\n >{{ value || 'Not Set' }}</span\n >\n </ng-template>\n\n <ng-template dynamicCell=\"result\" let-row=\"row\" let-value=\"value\">\n <span class=\"cqa-inline-flex cqa-items-center cqa-px-2 cqa-py-0.5 cqa-rounded cqa-text-xs\" [ngClass]=\"resultBadgeClass(value)\">\n {{ value || 'NOT_EXECUTED' }}\n </span>\n </ng-template>\n\n <ng-template dynamicCell=\"status\" let-row=\"row\" let-value=\"value\">\n <span class=\"cqa-text-xs\">{{ value }}</span>\n </ng-template>\n\n <ng-template dynamicCell=\"labels\" let-row=\"row\" let-value=\"value\">\n <div class=\"cqa-flex cqa-flex-wrap cqa-gap-1\">\n <span *ngFor=\"let tag of (row.tags || []) | slice: 0:3\" class=\"cqa-px-2 cqa-py-0.5 cqa-rounded cqa-bg-gray-100 cqa-text-gray-700 cqa-text-xs\">\n {{ tag }}\n </span>\n <span *ngIf=\"(row.tags?.length || 0) > 3\" class=\"cqa-px-2 cqa-py-0.5 cqa-rounded cqa-bg-gray-100 cqa-text-gray-700 cqa-text-xs\">\n +{{ (row.tags?.length || 0) - 3 }} more\n </span>\n </div>\n </ng-template>\n\n <ng-template dynamicCell=\"createdBy\" let-row=\"row\" let-value=\"value\">\n <span class=\"cqa-text-xs\">{{ value }}</span>\n </ng-template>\n\n <ng-template dynamicCell=\"createdAt\" let-row=\"row\" let-value=\"value\">\n <span class=\"cqa-text-xs cqa-text-gray-700\">{{ value | date: 'medium' }}</span>\n </ng-template>\n\n <ng-template dynamicCell=\"updatedAt\" let-row=\"row\" let-value=\"value\">\n <span class=\"cqa-text-xs cqa-text-gray-700\">{{ value | date: 'medium' }}</span>\n </ng-template>\n\n <ng-template dynamicCell=\"lastRun\" let-row=\"row\">\n <div class=\"cqa-flex cqa-flex-col\">\n <span class=\"cqa-text-xs cqa-text-[#111827]\">{{ row.lastRun?.startTime | date: 'medium' }}</span>\n </div>\n </ng-template>\n\n <ng-template dynamicCell=\"actions\" let-row=\"row\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" *ngIf=\"showActionButton\">\n <cqa-action-menu-button\n [row]=\"row\"\n (view)=\"view($event)\"\n (edit)=\"edit($event)\"\n (delete)=\"delete($event)\"\n ></cqa-action-menu-button>\n </div>\n </ng-template>\n\n <ng-template #emptyTableTpl>\n <div class=\"cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-py-8\">\n <img src=\"/assets/illustrations/empty-state.svg\" alt=\"No data\" class=\"cqa-w-32 cqa-h-32 cqa-mb-4\" />\n <h3 class=\"cqa-text-lg cqa-font-semibold cqa-mb-2\">No test cases</h3>\n <p class=\"cqa-text-sm cqa-text-neutral-500 cqa-mb-4\">Try adjusting filters or create a new test case.</p>\n <cqa-button variant=\"filled\" (clicked)=\"toggleFilter()\">Show Filters</cqa-button>\n </div>\n </ng-template>\n </app-dynamic-table>\n </ng-container>\n\n <ng-template #storyEmptyTpl>\n <div class=\"cqa-p-6 cqa-flex cqa-flex-col cqa-items-center cqa-justify-center\">\n <cqa-empty-state\n *ngIf=\"isEmptyState\"\n [title]=\"emptyStateConfig.title\"\n [description]=\"emptyStateConfig.description\"\n [imageUrl]=\"emptyStateConfig.imageUrl\"\n [actions]=\"emptyStateConfig.actions\"\n (actionClick)=\"onEmptyAction($event)\"\n >\n </cqa-empty-state>\n </div>\n </ng-template>\n\n </div>\n\n <cqa-pagination\n [totalElements]=\"filteredRows.length\"\n [pageIndex]=\"pageIndex\"\n [pageSize]=\"pageSize\"\n [pageItemCount]=\"pagedRows.length\"\n (paginate)=\"onPaginate($event)\"\n (pageSizeChange)=\"onPageSizeChange($event)\"\n >\n </cqa-pagination>\n\n <div *ngIf=\"anyRowSelected\" class=\"cqa-absolute cqa-bottom-[18.75px] cqa-left-[50%] cqa-translate-x-[-50%] cqa-w-full lg:cqa-max-w-[68%] cqa-sm:max-w-[75%] cqa-max-w-[90%] cqa-z-[1]\" >\n <cqa-table-action-toolbar\n [selectedItems]=\"currentSelectedItems\"\n [actions]=\"actions\"\n (actionClick)=\"actionClick($event)\"\n ></cqa-table-action-toolbar>\n </div>\n \n </div>\n</div>\n\n", styles: [] }]
|
|
314
|
+
}], propDecorators: { searchPlaceholder: [{
|
|
315
|
+
type: Input
|
|
316
|
+
}], searchValue: [{
|
|
317
|
+
type: Input
|
|
318
|
+
}], showClear: [{
|
|
319
|
+
type: Input
|
|
320
|
+
}], showSearchBar: [{
|
|
321
|
+
type: Input
|
|
322
|
+
}], filterConfig: [{
|
|
323
|
+
type: Input
|
|
324
|
+
}], showFilterPanel: [{
|
|
325
|
+
type: Input
|
|
326
|
+
}], showFilterButton: [{
|
|
327
|
+
type: Input
|
|
328
|
+
}], otherButtonLabel: [{
|
|
329
|
+
type: Input
|
|
330
|
+
}], otherButtonVariant: [{
|
|
331
|
+
type: Input
|
|
332
|
+
}], showOtherButton: [{
|
|
333
|
+
type: Input
|
|
334
|
+
}], showActionButton: [{
|
|
335
|
+
type: Input
|
|
336
|
+
}], showSettingsButton: [{
|
|
337
|
+
type: Input
|
|
338
|
+
}], showAutoRefreshButton: [{
|
|
339
|
+
type: Input
|
|
340
|
+
}], data: [{
|
|
341
|
+
type: Input
|
|
342
|
+
}], isEmptyState: [{
|
|
343
|
+
type: Input
|
|
344
|
+
}], emptyStateConfig: [{
|
|
345
|
+
type: Input
|
|
346
|
+
}], actions: [{
|
|
347
|
+
type: Input
|
|
348
|
+
}], chips: [{
|
|
349
|
+
type: Input
|
|
350
|
+
}], filterApplied: [{
|
|
351
|
+
type: Input
|
|
352
|
+
}], columns: [{
|
|
353
|
+
type: Input
|
|
354
|
+
}], selectedAutoRefreshInterval: [{
|
|
355
|
+
type: Input
|
|
356
|
+
}], pageIndex: [{
|
|
357
|
+
type: Input
|
|
358
|
+
}], pageSize: [{
|
|
359
|
+
type: Input
|
|
360
|
+
}], isTableLoading: [{
|
|
361
|
+
type: Input
|
|
362
|
+
}], isTableDataLoading: [{
|
|
363
|
+
type: Input
|
|
364
|
+
}] } });
|
|
365
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtdGVtcGxhdGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90ZW1wbGF0ZXMvdGFibGUtdGVtcGxhdGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90ZW1wbGF0ZXMvdGFibGUtdGVtcGxhdGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEdBSU4sTUFBTSxlQUFlLENBQUM7QUFNdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUNBQXlDLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBYzdFLE1BQU0sT0FBTyxzQkFBc0I7SUFMbkM7UUFNRSxvQkFBb0I7UUFDWCxzQkFBaUIsR0FBVyxtQkFBbUIsQ0FBQztRQUNoRCxnQkFBVyxHQUFXLEVBQUUsQ0FBQztRQUN6QixjQUFTLEdBQVksSUFBSSxDQUFDO1FBQzFCLGtCQUFhLEdBQVksSUFBSSxDQUFDO1FBRXZDLGdCQUFnQjtRQUNQLGlCQUFZLEdBQXdCLEVBQUUsQ0FBQztRQUN2QyxvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUNqQyxxQkFBZ0IsR0FBWSxJQUFJLENBQUM7UUFFMUMscUJBQXFCO1FBQ1oscUJBQWdCLEdBQVcsY0FBYyxDQUFDO1FBQzFDLHVCQUFrQixHQUF5RSxRQUFRLENBQUM7UUFDcEcsb0JBQWUsR0FBWSxJQUFJLENBQUM7UUFFekMsb0RBQW9EO1FBQzNDLHFCQUFnQixHQUFZLElBQUksQ0FBQztRQUUxQywrQkFBK0I7UUFDdEIsdUJBQWtCLEdBQVksSUFBSSxDQUFDO1FBQ25DLDBCQUFxQixHQUFZLElBQUksQ0FBQztRQUUvQyxhQUFhO1FBQ0osU0FBSSxHQUFVLEVBQUUsQ0FBQztRQUUxQixxQkFBcUI7UUFDWixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5QixxQkFBZ0IsR0FBcUI7WUFDNUMsS0FBSyxFQUFFLHVC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a0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFHRyxJQUFJO3NCQUFaLEtBQUs7Z0JBR0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBUUcsT0FBTztzQkFBZixLQUFLO2dCQXdDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFHRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csMkJBQTJCO3NCQUFuQyxLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IER5bmFtaWNGaWx0ZXJJdGVtIH0gZnJvbSAnLi4vZmlsdGVycy9keW5hbWljLWZpbHRlci9keW5hbWljLWZpbHRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgRHluYW1pY1RhYmxlQ29sdW1uIH0gZnJvbSAnLi4vdGFibGUvZHluYW1pYy10YWJsZS9keW5hbWljLXRhYmxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb2x1bW5WaXNpYmlsaXR5Q29uZmlnIH0gZnJvbSAnLi4vY29sdW1uLXZpc2liaWxpdHkvY29sdW1uLXZpc2liaWxpdHkuY29tcG9uZW50JztcbmltcG9ydCB7IFRhYmxlQWN0aW9uIH0gZnJvbSAnLi4vdGFibGUtYWN0aW9uLXRvb2xiYXIvdGFibGUtYWN0aW9uLXRvb2xiYXIuY29tcG9uZW50JztcbmltcG9ydCB7IEVtcHR5U3RhdGVBY3Rpb24gfSBmcm9tICcuLi9lbXB0eS1zdGF0ZS9lbXB0eS1zdGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRU1QVFlfU1RBVEVfSU1BR0VTIH0gZnJvbSAnLi4vYXNzZXRzL2ltYWdlcy9pbWFnZS1hc3NldHMuY29uc3RhbnRzJztcblxuZXhwb3J0IGludGVyZmFjZSBFbXB0eVN0YXRlQ29uZmlnIHtcbiAgdGl0bGU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgaW1hZ2VVcmw6IHN0cmluZztcbiAgYWN0aW9uczogRW1wdHlTdGF0ZUFjdGlvbltdO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtdGFibGUtdGVtcGxhdGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFibGUtdGVtcGxhdGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZVRlbXBsYXRlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICAvLyBTZWFyY2ggYmFyIGlucHV0c1xuICBASW5wdXQoKSBzZWFyY2hQbGFjZWhvbGRlcjogc3RyaW5nID0gJ1NlYXJjaCBjb21wb25lbnRzJztcbiAgQElucHV0KCkgc2VhcmNoVmFsdWU6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBzaG93Q2xlYXI6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBzaG93U2VhcmNoQmFyOiBib29sZWFuID0gdHJ1ZTtcblxuICAvLyBGaWx0ZXIgaW5wdXRzXG4gIEBJbnB1dCgpIGZpbHRlckNvbmZpZzogRHluYW1pY0ZpbHRlckl0ZW1bXSA9IFtdO1xuICBASW5wdXQoKSBzaG93RmlsdGVyUGFuZWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgc2hvd0ZpbHRlckJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XG5cbiAgLy8gT3RoZXIgYnV0dG9uIGlucHV0XG4gIEBJbnB1dCgpIG90aGVyQnV0dG9uTGFiZWw6IHN0cmluZyA9ICdPdGhlciBCdXR0b24nO1xuICBASW5wdXQoKSBvdGhlckJ1dHRvblZhcmlhbnQ6ICdmaWxsZWQnIHwgJ291dGxpbmVkJyB8ICd0ZXh0JyB8ICdlbGV2YXRlZCcgfCAndG9uYWwnIHwgJ2dyZXktc29saWQnID0gJ2ZpbGxlZCc7XG4gIEBJbnB1dCgpIHNob3dPdGhlckJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XG4gIFxuICAvLyBBY3Rpb24gbWVudSBidXR0b24gKHRocmVlLWRvdCBtZW51IGluIHRhYmxlIHJvd3MpXG4gIEBJbnB1dCgpIHNob3dBY3Rpb25CdXR0b246IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8vIFNldHRpbmdzIGFuZCByZWZyZXNoIGJ1dHRvbnNcbiAgQElucHV0KCkgc2hvd1NldHRpbmdzQnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgc2hvd0F1dG9SZWZyZXNoQnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcblxuICAvLyBEYXRhIGlucHV0XG4gIEBJbnB1dCgpIGRhdGE6IGFueVtdID0gW107XG5cbiAgLy8gRW1wdHkgc3RhdGUgaW5wdXRzXG4gIEBJbnB1dCgpIGlzRW1wdHlTdGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBlbXB0eVN0YXRlQ29uZmlnOiBFbXB0eVN0YXRlQ29uZmlnID0ge1xuICAgIHRpdGxlOiAnTm8gRGF0YSBBdmFpbGFibGUgWWV0JyxcbiAgICBkZXNjcmlwdGlvbjogJ1J1biBvciB1cGxvYWQgeW91ciBmaXJzdCB0ZXN0IHRvIHNlZSB5b3VyIGFuYWx5dGljcyBhbmQgdHJlbmRzIGhlcmUuIFdhdGNoIHlvdXIgcXVhbGl0eSBtZXRyaWNzIGNvbWUgdG8gbGlmZSB3aXRoIHJlYWwtdGltZSBpbnNpZ2h0cy4nLFxuICAgIGltYWdlVXJsOiBFTVBUWV9TVEFURV9JTUFHRVMuREFTSEJPQVJELFxuICAgIGFjdGlvbnM6IFt7IGxhYmVsOiAnUnVuIFRlc3QgU3VpdGUnLCB2YXJpYW50OiAnZmlsbGVkJyB9XSxcbiAgfTtcblxuICAvLyBBY3Rpb24gYmFyIGlucHV0c1xuICBASW5wdXQoKSBhY3Rpb25zOiBUYWJsZUFjdGlvbltdID0gW1xuICAgIHsgXG4gICAgICBpZDogJ2RlbGV0ZScsIFxuICAgICAgbGFiZWw6ICdEZWxldGUnLCBcbiAgICAgIGljb246ICdkZWxldGUnLCBcbiAgICAgIHRvb2x0aXA6ICdEZWxldGUgc2VsZWN0ZWQnLFxuICAgICAgb25DbGljazogKGNvbnRleHQpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ0RlbGV0ZSBhY3Rpb24gY2xpY2tlZDonLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHsgXG4gICAgICBpZDogJ2VkaXQnLCBcbiAgICAgIGxhYmVsOiAnRWRpdCcsIFxuICAgICAgaWNvbjogJ2VkaXQnLCBcbiAgICAgIHRvb2x0aXA6ICdFZGl0IHNlbGVjdGVkJyxcbiAgICAgIG9uQ2xpY2s6IChjb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdFZGl0IGFjdGlvbiBjbGlja2VkOicsIGNvbnRleHQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgeyBcbiAgICAgIGlkOiAnYWRkLXRhZycsIFxuICAgICAgbGFiZWw6ICdBZGQgVGFnJywgXG4gICAgICBpY29uOiAnbG9jYWxfb2ZmZXInLCBcbiAgICAgIHRvb2x0aXA6ICdBZGQgdGFncycsXG4gICAgICBvbkNsaWNrOiAoY29udGV4dCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnQWRkIHRhZyBhY3Rpb24gY2xpY2tlZDonLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHsgXG4gICAgICBpZDogJ3JlbW92ZS10YWcnLCBcbiAgICAgIGxhYmVsOiAnUmVtb3ZlIFRhZycsIFxuICAgICAgaWNvbjogJ2xhYmVsX29mZicsIFxuICAgICAgdG9vbHRpcDogJ1JlbW92ZSB0YWdzJyxcbiAgICAgIG9uQ2xpY2s6IChjb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdSZW1vdmUgdGFnIGFjdGlvbiBjbGlja2VkOicsIGNvbnRleHQpO1xuICAgICAgfVxuICAgIH0sXG4gIF07XG5cbiAgLy8gQ2hpcHMgaW5wdXRzXG4gIEBJbnB1dCgpIGNoaXBzOiBBcnJheTx7IGtleT86IHN0cmluZzsgbGFiZWw/OiBzdHJpbmc7IHRleHQ6IHN0cmluZzsgZnVsbFRleHQ/OiBzdHJpbmc7IGhhc01vcmU/OiBib29sZWFuIH0+ID0gW107XG4gIEBJbnB1dCgpIGZpbHRlckFwcGxpZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvLyBUYWJsZSBpbnB1dHNcbiAgQElucHV0KCkgY29sdW1uczogRHluYW1pY1RhYmxlQ29sdW1uW10gPSBbXTtcbiAgQElucHV0KCkgc2VsZWN0ZWRBdXRvUmVmcmVzaEludGVydmFsOiBudW1iZXIgPSAwO1xuICBASW5wdXQoKSBwYWdlSW5kZXg6IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpIHBhZ2VTaXplOiBudW1iZXIgPSAxMDtcbiAgLy8gTG9hZGVyIGNvbnRyb2xzIChwYXNzZWQgZG93biB0byBkeW5hbWljIHRhYmxlKVxuICBASW5wdXQoKSBpc1RhYmxlTG9hZGluZz86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGlzVGFibGVEYXRhTG9hZGluZz86IGJvb2xlYW47XG4gIC8vIEJhY2t3YXJkLWNvbXBhdGliaWxpdHkgZmxhZzsgaWYgcHJvdmlkZWQsIGR5bmFtaWMgdGFibGUgd2lsbCB1c2UgaXQgd2hlbiBzcGVjaWZpYyBmbGFncyBhcmUgdW5kZWZpbmVkXG5cbiAgLy8gSW50ZXJuYWwgc3RhdGUgZm9yIGNvbHVtbiB2aXNpYmlsaXR5XG4gIHByaXZhdGUgX2NvbHVtblZpc2liaWxpdHk6IENvbHVtblZpc2liaWxpdHlDb25maWcgPSB7fTtcbiAgcHJpdmF0ZSBfY2FjaGVkVmlzaWJpbGl0eUNvbHVtbnM6IEFycmF5PHsgaWQ6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9PiA9IFtdO1xuICBmaWx0ZXJlZFJvd3M6IGFueVtdID0gW107XG4gIHBhZ2VkUm93czogYW55W10gPSBbXTtcblxuICAvLyBEZXJpdmVkIGNvbHVtbnMgd2l0aCB2aXNpYmlsaXR5IGFwcGxpZWQuIEF2b2lkIG11dGF0aW5nIEBJbnB1dCgpIGNvbHVtbnMgc28gcGFyZW50IGJpbmRpbmdzIGFyZW4ndCBvdmVycmlkZGVuLlxuICBnZXQgY29tcHV0ZWRDb2x1bW5zKCk6IER5bmFtaWNUYWJsZUNvbHVtbltdIHtcbiAgICBjb25zdCB2aXNpYmlsaXR5ID0gdGhpcy5fY29sdW1uVmlzaWJpbGl0eSB8fCB7fTtcbiAgICBjb25zdCBzb3VyY2UgPSB0aGlzLmNvbHVtbnMgfHwgW107XG4gICAgcmV0dXJuIHNvdXJjZS5tYXAoY29sID0+IHtcbiAgICAgIGlmIChbJ2NoZWNrYm94JywgJ2FjdGlvbnMnXS5pbmNsdWRlcyhjb2wuZmllbGRJZCkpIHtcbiAgICAgICAgcmV0dXJuIGNvbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNob3cgPSB2aXNpYmlsaXR5W2NvbC5maWVsZElkXTtcbiAgICAgIHJldHVybiB7IC4uLmNvbCwgaXNTaG93OiBzaG93ICE9PSBmYWxzZSB9O1xuICAgIH0pO1xuICB9XG5cbiAgLy8gQXV0by1nZW5lcmF0ZWQgdmlzaWJpbGl0eSBjb2x1bW5zIGZyb20gY29sdW1ucyBpbnB1dCAoZXhjbHVkZXMgZGVmYXVsdCBjb2x1bW5zIGFuZCBjaGVja2JveC9hY3Rpb25zKVxuICAvLyBDYWNoZWQgdG8gYXZvaWQgY3JlYXRpbmcgbmV3IGFycmF5cyBvbiBldmVyeSBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlXG4gIGdldCB2aXNpYmlsaXR5Q29sdW1ucygpOiBBcnJheTx7IGlkOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLl9jYWNoZWRWaXNpYmlsaXR5Q29sdW1ucztcbiAgfVxuXG4gIC8vIEludGVybmFsIGNvbHVtbiB2aXNpYmlsaXR5IHN0YXRlXG4gIGdldCBjb2x1bW5WaXNpYmlsaXR5KCk6IENvbHVtblZpc2liaWxpdHlDb25maWcge1xuICAgIHJldHVybiB0aGlzLl9jb2x1bW5WaXNpYmlsaXR5O1xuICB9XG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdGlhbGl6ZUNvbXBvbmVudCgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydkYXRhJ10gfHwgY2hhbmdlc1snaXNFbXB0eVN0YXRlJ10pIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUNvbXBvbmVudCgpO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1snY29sdW1ucyddKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemVDb2x1bW5WaXNpYmlsaXR5KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ29tcG9uZW50KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRW1wdHlTdGF0ZSkge1xuICAgICAgdGhpcy5maWx0ZXJlZFJvd3MgPSBbXTtcbiAgICAgIHRoaXMucGFnZWRSb3dzID0gW107XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5maWx0ZXJlZFJvd3MgPSBbLi4udGhpcy5kYXRhXTtcbiAgICB0aGlzLmFwcGx5UGFnaW5hdGlvbigpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZUNvbHVtblZpc2liaWxpdHkoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUNvbHVtblZpc2liaWxpdHkoKTogdm9pZCB7XG4gICAgLy8gQ2FjaGUgdmlzaWJpbGl0eSBjb2x1bW5zIHRvIGF2b2lkIGNyZWF0aW5nIG5ldyBhcnJheXMgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvblxuICAgIHRoaXMuX2NhY2hlZFZpc2liaWxpdHlDb2x1bW5zID0gdGhpcy5tYXBWaXNpYmlsaXR5Q29sdW1ucygpO1xuICAgIC8vIEluaXRpYWxpemUgdmlzaWJpbGl0eSBzdGF0ZSBmb3IgYWxsIHZpc2liaWxpdHkgY29sdW1ucyAoZGVmYXVsdCB0byB0cnVlKVxuICAgIGZvciAoY29uc3QgY29sIG9mIHRoaXMuX2NhY2hlZFZpc2liaWxpdHlDb2x1bW5zKSB7XG4gICAgICBpZiAodGhpcy5fY29sdW1uVmlzaWJpbGl0eVtjb2wuaWRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fY29sdW1uVmlzaWJpbGl0eVtjb2wuaWRdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgYW55Um93U2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHRoaXMucGFnZWRSb3dzICYmIHRoaXMucGFnZWRSb3dzLnNvbWUociA9PiAhIShyIGFzIGFueSkuaXNTZWxlY3RlZCkpO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRTZWxlY3RlZEl0ZW1zKCk6IGFueVtdIHtcbiAgICByZXR1cm4gKHRoaXMucGFnZWRSb3dzIHx8IFtdKS5maWx0ZXIociA9PiAhIShyIGFzIGFueSkuaXNTZWxlY3RlZCk7XG4gIH1cblxuICBhY3Rpb25DbGljayhkYXRhOiBhbnkpIHtcbiAgICBjb25zb2xlLmxvZygnYWN0aW9uIHRvb2xiYXInLCBkYXRhKTtcbiAgfVxuXG4gIHZpZXcoaWQ6IG51bWJlciB8IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdWaWV3JywgaWQpO1xuICB9XG5cbiAgZWRpdChyb3c6IGFueSk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdFZGl0Jywgcm93KTtcbiAgfVxuXG4gIGRlbGV0ZShyb3c6IGFueSk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdEZWxldGUnLCByb3cpO1xuICB9XG5cbiAgb25Sb3dDaGVja2JveENoYW5nZShldmVudDogRXZlbnQsIHJvdzogYW55KTogdm9pZCB7XG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCB8IG51bGw7XG4gICAgY29uc3QgY2hlY2tlZCA9ICEhaW5wdXQ/LmNoZWNrZWQ7XG4gICAgcm93LmlzU2VsZWN0ZWQgPSBjaGVja2VkO1xuICB9XG5cbiAgdG9nZ2xlRmlsdGVyKCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0ZpbHRlclBhbmVsID0gIXRoaXMuc2hvd0ZpbHRlclBhbmVsO1xuICB9XG5cbiAgb25Db2x1bW5WaXNpYmlsaXR5Q2hhbmdlKGNmZzogQ29sdW1uVmlzaWJpbGl0eUNvbmZpZyk6IHZvaWQge1xuICAgIHRoaXMuX2NvbHVtblZpc2liaWxpdHkgPSB7IC4uLmNmZyB9O1xuICAgIC8vIERvIG5vdCBtdXRhdGUgdGhpcy5jb2x1bW5zOyBjb21wdXRlZENvbHVtbnMgZ2V0dGVyIHdpbGwgcmVmbGVjdCBjaGFuZ2VzXG4gIH1cblxuICBvbkF1dG9SZWZyZXNoQ2hhbmdlKGludGVydmFsTXM6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRBdXRvUmVmcmVzaEludGVydmFsID0gaW50ZXJ2YWxNcztcbiAgICBjb25zb2xlLmxvZygnQXV0byByZWZyZXNoIGludGVydmFsJywgaW50ZXJ2YWxNcyk7XG4gIH1cblxuICB2YWx1ZUNoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ1ZhbHVlIGNoYW5nZWQnLCB2YWx1ZSk7XG4gIH1cblxuICBzZWFyY2godmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdTZWFyY2gnLCB2YWx1ZSk7XG4gIH1cblxuICBjbGVhcmVkKCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdDbGVhcmVkJyk7XG4gIH1cblxuICByZXN1bHRCYWRnZUNsYXNzKHJlc3VsdD86IHN0cmluZyB8IG51bGwpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlID0gKHJlc3VsdCB8fCAnJykudG9VcHBlckNhc2UoKTtcbiAgICBpZiAodmFsdWUgPT09ICdTVUNDRVNTJykgcmV0dXJuICdjcWEtYmctZ3JlZW4tMTAwIGNxYS10ZXh0LWdyZWVuLTcwMCc7XG4gICAgaWYgKHZhbHVlID09PSAnRkFJTFVSRScgfHwgdmFsdWUgPT09ICdBQk9SVEVEJykgcmV0dXJuICdjcWEtYmctcmVkLTEwMCBjcWEtdGV4dC1yZWQtNzAwJztcbiAgICBpZiAodmFsdWUgPT09ICdRVUVVRUQnIHx8IHZhbHVlID09PSAnTk9UX0VYRUNVVEVEJyB8fCB2YWx1ZSA9PT0gJ1NUT1BQRUQnKSByZXR1cm4gJ2NxYS1iZy1ncmF5LTEwMCBjcWEtdGV4dC1ncmF5LTcwMCc7XG4gICAgcmV0dXJuICdjcWEtYmctZ3JheS0xMDAgY3FhLXRleHQtZ3JheS03MDAnO1xuICB9XG5cbiAgb25FbXB0eUFjdGlvbihhY3Rpb246IGFueSkge1xuICAgIGlmIChhY3Rpb24/LmxhYmVsID09PSAnU2hvdyBmaWx0ZXJzJykge1xuICAgICAgdGhpcy50b2dnbGVGaWx0ZXIoKTtcbiAgICB9XG4gIH1cblxuICBvbkZpbHRlcnNDaGFuZ2VkKGN1cnJlbnQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyZWRSb3dzID0gdGhpcy5kYXRhLmZpbHRlcihyID0+IHRoaXMucGFzc0ZpbHRlcnMoY3VycmVudCwgcikpO1xuICAgIHRoaXMucGFnZUluZGV4ID0gMDtcbiAgICB0aGlzLmFwcGx5UGFnaW5hdGlvbigpO1xuICAgIGNvbnN0IGNoaXBzOiBBcnJheTx7IGtleT86IHN0cmluZzsgbGFiZWw/OiBzdHJpbmc7IHRleHQ6IHN0cmluZzsgZnVsbFRleHQ/OiBzdHJpbmc7IGhhc01vcmU/OiBib29sZWFuIH0+ID0gW107XG4gICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGN1cnJlbnQpKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gY3VycmVudFtrZXldO1xuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PT0gJycgfHwgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkpIGNvbnRpbnVlO1xuICAgICAgICBsZXQgdGV4dCA9ICcnO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICB0ZXh0ID0gdmFsdWUubWFwKCh2OiBhbnkpID0+ICh2Py5uYW1lID8/IHY/LmxhYmVsID8/IHY/LnZhbHVlID8/IHYpKS5qb2luKCcsICcpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBpZiAoJ3N0YXJ0JyBpbiB2YWx1ZSB8fCAnZW5kJyBpbiB2YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgcyA9IHZhbHVlLnN0YXJ0ID8gbmV3IERhdGUodmFsdWUuc3RhcnQpLnRvTG9jYWxlRGF0ZVN0cmluZygpIDogJyc7XG4gICAgICAgICAgICBjb25zdCBlID0gdmFsdWUuZW5kID8gbmV3IERhdGUodmFsdWUuZW5kKS50b0xvY2FsZURhdGVTdHJpbmcoKSA6ICcnO1xuICAgICAgICAgICAgdGV4dCA9IFtzLCBlXS5maWx0ZXIoQm9vbGVhbikuam9pbignIC0gJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRleHQgPSAodmFsdWU/Lm5hbWUgPz8gdmFsdWU/LmxhYmVsID8/IHZhbHVlPy52YWx1ZSA/PyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZXh0ID0gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBjaGlwcy5wdXNoKHsga2V5LCB0ZXh0LCBmdWxsVGV4dDogdGV4dCwgaGFzTW9yZTogdGV4dC5sZW5ndGggPiAzMCB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jaGlwcyA9IGNoaXBzO1xuICAgIHRoaXMuZmlsdGVyQXBwbGllZCA9IHRoaXMuY2hpcHMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIG9uRmlsdGVyc0FwcGxpZWQoXzogYW55KTogdm9pZCB7XG4gICAgLy8gaGFuZGxlZCBpbiBvbkZpbHRlcnNDaGFuZ2VkIGZvciB0aGlzIGRlbW9cbiAgfVxuXG4gIG9uUGFnaW5hdGUoZTogeyBwYWdlSW5kZXg6IG51bWJlcjsgcGFnZVNpemU6IG51bWJlciB9KTogdm9pZCB7XG4gICAgdGhpcy5wYWdlSW5kZXggPSBlLnBhZ2VJbmRleDtcbiAgICB0aGlzLnBhZ2VTaXplID0gZS5wYWdlU2l6ZTtcbiAgICB0aGlzLmFwcGx5UGFnaW5hdGlvbigpO1xuICB9XG5cbiAgb25QYWdlU2l6ZUNoYW5nZShzaXplOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnBhZ2VTaXplID0gc2l6ZTtcbiAgICB0aGlzLnBhZ2VJbmRleCA9IDA7XG4gICAgdGhpcy5hcHBseVBhZ2luYXRpb24oKTtcbiAgfVxuXG4gIG9uUmVtb3ZlQ2hpcChjaGlwOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmNoaXBzID0gdGhpcy5jaGlwcy5maWx0ZXIoYyA9PiBjICE9PSBjaGlwKTtcbiAgICB0aGlzLmZpbHRlckFwcGxpZWQgPSB0aGlzLmNoaXBzLmxlbmd0aCA+IDA7XG4gIH1cblxuICBvbkNsZWFyQWxsQ2hpcHMoKTogdm9pZCB7XG4gICAgdGhpcy5jaGlwcyA9IFtdO1xuICAgIHRoaXMuZmlsdGVyQXBwbGllZCA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVBhZ2luYXRpb24oKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLnBhZ2VJbmRleCAqIHRoaXMucGFnZVNpemU7XG4gICAgY29uc3QgZW5kID0gc3RhcnQgKyB0aGlzLnBhZ2VTaXplO1xuICAgIHRoaXMucGFnZWRSb3dzID0gdGhpcy5maWx0ZXJlZFJvd3Muc2xpY2Uoc3RhcnQsIGVuZCk7XG4gIH1cblxuICBwcml2YXRlIG1hcFZpc2liaWxpdHlDb2x1bW5zKCk6IEFycmF5PHsgaWQ6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9PiB7XG4gICAgcmV0dXJuICh0aGlzLmNvbHVtbnMgfHwgW10pXG4gICAgICAuZmlsdGVyKGMgPT4gYy5pc0RlZmF1bHQgPT09IGZhbHNlKVxuICAgICAgLm1hcChjID0+ICh7IGlkOiBjLmZpZWxkSWQsIGxhYmVsOiBjLmZpZWxkTmFtZSB8fCBjLmZpZWxkSWQgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVEYXRlKGQ6IGFueSk6IG51bWJlciB8IG51bGwge1xuICAgIGlmICghZCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgdHMgPSBEYXRlLnBhcnNlKGQpO1xuICAgIHJldHVybiBpc05hTih0cykgPyBudWxsIDogdHM7XG4gIH1cblxuICBwcml2YXRlIHBhc3NGaWx0ZXJzKGZpbHRlcnM6IGFueSwgcm93OiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoIWZpbHRlcnMpIHJldHVybiB0cnVlO1xuICAgIGlmIChmaWx0ZXJzLnN0YXR1cyAmJiBBcnJheS5pc0FycmF5KGZpbHRlcnMuc3RhdHVzKSAmJiBmaWx0ZXJzLnN0YXR1cy5sZW5ndGgpIHtcbiAgICAgIGlmICghZmlsdGVycy5zdGF0dXMuaW5jbHVkZXMocm93LnN0YXR1cykpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGZpbHRlcnMucHJpb3JpdHkgJiYgQXJyYXkuaXNBcnJheShmaWx0ZXJzLnByaW9yaXR5KSAmJiBmaWx0ZXJzLnByaW9yaXR5Lmxlbmd0aCkge1xuICAgICAgaWYgKCFmaWx0ZXJzLnByaW9yaXR5LmluY2x1ZGVzKHJvdy5wcmlvcml0eU5hbWUpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChmaWx0ZXJzLnRlc3RUeXBlICYmIEFycmF5LmlzQXJyYXkoZmlsdGVycy50ZXN0VHlwZSkgJiYgZmlsdGVycy50ZXN0VHlwZS5sZW5ndGgpIHtcbiAgICAgIGlmICghZmlsdGVycy50ZXN0VHlwZS5pbmNsdWRlcyhyb3cudGVzdFR5cGUpKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChmaWx0ZXJzLmNyZWF0ZWRfZGF0ZSAmJiAoZmlsdGVycy5jcmVhdGVkX2RhdGUuc3RhcnQgfHwgZmlsdGVycy5jcmVhdGVkX2RhdGUuZW5kKSkge1xuICAgICAgY29uc3Qgc3RhcnRUcyA9IHRoaXMubm9ybWFsaXplRGF0ZShmaWx0ZXJzLmNyZWF0ZWRfZGF0ZS5zdGFydCk7XG4gICAgICBjb25zdCBlbmRUcyA9IHRoaXMubm9ybWFsaXplRGF0ZShmaWx0ZXJzLmNyZWF0ZWRfZGF0ZS5lbmQpO1xuICAgICAgY29uc3Qgcm93VHMgPSB0aGlzLm5vcm1hbGl6ZURhdGUocm93LmNyZWF0ZWRBdCk7XG4gICAgICBpZiAocm93VHMgIT0gbnVsbCkge1xuICAgICAgICBpZiAoc3RhcnRUcyAhPSBudWxsICYmIHJvd1RzIDwgc3RhcnRUcykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZW5kVHMgIT0gbnVsbCAmJiByb3dUcyA+IGVuZFRzKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG4iLCI8ZGl2IGlkPVwiY3FhLXVpLXJvb3RcIj5cbiAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1yZWxhdGl2ZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZ2FwLTMgY3FhLWZsZXgtd3JhcCBjcWEtbWItM1wiPlxuICAgICAgPGNxYS1zZWFyY2gtYmFyXG4gICAgICAgICpuZ0lmPVwic2hvd1NlYXJjaEJhclwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJzZWFyY2hQbGFjZWhvbGRlclwiXG4gICAgICAgIFt2YWx1ZV09XCJzZWFyY2hWYWx1ZVwiXG4gICAgICAgIFtzaG93Q2xlYXJdPVwic2hvd0NsZWFyXCJcbiAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInZhbHVlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAoc2VhcmNoKT1cInNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgKGNsZWFyZWQpPVwiY2xlYXJlZCgpXCJcbiAgICAgID48L2NxYS1zZWFyY2gtYmFyPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1mbGV4LXdyYXBcIj5cbiAgICAgICAgPGNxYS1idXR0b25cbiAgICAgICAgICAqbmdJZj1cInNob3dGaWx0ZXJCdXR0b25cIlxuICAgICAgICAgIHZhcmlhbnQ9XCJncmV5LXNvbGlkXCJcbiAgICAgICAgICBpY29uPVwiYWRkXCJcbiAgICAgICAgICBbdGV4dF09XCInRmlsdGVyJ1wiXG4gICAgICAgICAgKGNsaWNrZWQpPVwidG9nZ2xlRmlsdGVyKClcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4+RmlsdGVyPC9zcGFuPlxuICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgIDxjcWEtY29sdW1uLXZpc2liaWxpdHlcbiAgICAgICAgICAqbmdJZj1cInNob3dTZXR0aW5nc0J1dHRvblwiXG4gICAgICAgICAgW2NvbHVtbnNdPVwidmlzaWJpbGl0eUNvbHVtbnNcIlxuICAgICAgICAgIFtjb2x1bW5WaXNpYmlsaXR5XT1cImNvbHVtblZpc2liaWxpdHlcIlxuICAgICAgICAgIFtzZWxlY3RlZEF1dG9SZWZyZXNoSW50ZXJ2YWxdPVwic2VsZWN0ZWRBdXRvUmVmcmVzaEludGVydmFsXCJcbiAgICAgICAgICAoY29sdW1uVmlzaWJpbGl0eUNoYW5nZSk9XCJvbkNvbHVtblZpc2liaWxpdHlDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgKGF1dG9SZWZyZXNoQ2hhbmdlKT1cIm9uQXV0b1JlZnJlc2hDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgID48L2NxYS1jb2x1bW4tdmlzaWJpbGl0eT5cbiAgICAgICAgPGNxYS1idXR0b24gKm5nSWY9XCJzaG93QXV0b1JlZnJlc2hCdXR0b25cIiB2YXJpYW50PVwiZ3JleS1zb2xpZFwiIGljb249XCJyZWZyZXNoXCI+PC9jcWEtYnV0dG9uPlxuICAgICAgICA8Y3FhLWJ1dHRvbiAqbmdJZj1cInNob3dPdGhlckJ1dHRvblwiIFt2YXJpYW50XT1cIm90aGVyQnV0dG9uVmFyaWFudFwiIFt0ZXh0XT1cIm90aGVyQnV0dG9uTGFiZWxcIj48L2NxYS1idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxjcWEtc2VsZWN0ZWQtZmlsdGVycyBcbiAgICAgICpuZ0lmPVwic2hvd0ZpbHRlclBhbmVsXCJcbiAgICAgIFtmaWx0ZXJBcHBsaWVkXT1cImZpbHRlckFwcGxpZWRcIlxuICAgICAgW2NoaXBzXT1cImNoaXBzXCJcbiAgICAgIChyZW1vdmVDaGlwKT1cIm9uUmVtb3ZlQ2hpcCgkZXZlbnQpXCJcbiAgICAgIChjbGVhckFsbCk9XCJvbkNsZWFyQWxsQ2hpcHMoKVwiXG4gICAgPlxuICAgIDwvY3FhLXNlbGVjdGVkLWZpbHRlcnM+XG5cbiAgICA8Y3FhLWR5bmFtaWMtZmlsdGVyXG4gICAgICAqbmdJZj1cInNob3dGaWx0ZXJQYW5lbFwiXG4gICAgICBbY29uZmlnXT1cImZpbHRlckNvbmZpZ1wiXG4gICAgICBbc2hvd0ZpbHRlclBhbmVsXT1cInNob3dGaWx0ZXJQYW5lbFwiXG4gICAgICAoZmlsdGVyc0NoYW5nZWQpPVwib25GaWx0ZXJzQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgIChmaWx0ZXJzQXBwbGllZCk9XCJvbkZpbHRlcnNBcHBsaWVkKCRldmVudClcIlxuICAgID5cbiAgICA8L2NxYS1keW5hbWljLWZpbHRlcj5cblxuICAgIDxkaXYgY2xhc3M9XCJjcWEtcm91bmRlZC1bN3B4XSBjcWEtb3ZlcmZsb3ctaGlkZGVuIGNxYS1ib3JkZXItdCBjcWEtYm9yZGVyLWwgY3FhLWJvcmRlci1yIGNxYS1ib3JkZXItZ3JleS0yMDAgY3FhLXJlbGF0aXZlXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzRW1wdHlTdGF0ZSAmJiBwYWdlZFJvd3MgJiYgcGFnZWRSb3dzLmxlbmd0aCA+IDA7IGVsc2Ugc3RvcnlFbXB0eVRwbFwiPlxuICAgICAgICA8YXBwLWR5bmFtaWMtdGFibGVcbiAgICAgICAgICBbY29sdW1uc109XCJjb21wdXRlZENvbHVtbnNcIlxuICAgICAgICAgIFtkYXRhXT1cInBhZ2VkUm93c1wiXG4gICAgICAgICAgW2lzVGFibGVMb2FkaW5nXT1cImlzVGFibGVMb2FkaW5nXCJcbiAgICAgICAgICBbaXNUYWJsZURhdGFMb2FkaW5nXT1cImlzVGFibGVEYXRhTG9hZGluZ1wiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBkeW5hbWljQ2VsbD1cImNoZWNrYm94XCIgbGV0LXJvdz1cInJvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1jaGVja2JveFwiPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaGlkZGVuLWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCIncm93LWNoZWNrYm94LScgKyByb3cuaWRcIlxuICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInJvdy5pc1NlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiU2VsZWN0IHJvd1wiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblJvd0NoZWNrYm94Q2hhbmdlKCRldmVudCwgcm93KVwiIC8+XG4gICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3VzdG9tLWNoZWNrYm94LWxhYmVsXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5mb3JdPVwiJ3Jvdy1jaGVja2JveC0nICsgcm93LmlkXCI+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgPG5nLXRlbXBsYXRlIGR5bmFtaWNDZWxsPVwidGVzdENhc2VzXCIgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT1cInZhbHVlXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMSBjcWEtdGV4dC1bMTIuM3B4XSBjcWEtbGVhZGluZy1bMTcuNXB4XSBjcWEtZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdHJ1bmNhdGVcIj5cbiAgICAgICAgICAgICAgICAje3sgcm93LmlkIH19XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQtWyMwQTBBMEFdXCI+e3sgdmFsdWUgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgZHluYW1pY0NlbGw9XCJ0eXBlXCIgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT1cInZhbHVlXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQteHMgY3FhLXRleHQtWyMxMTE4MjddIGNxYS10cnVuY2F0ZVwiPnt7IHZhbHVlIH19PC9kaXY+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBkeW5hbWljQ2VsbD1cInByaW9yaXR5XCIgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT1cInZhbHVlXCI+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1weC0yIGNxYS1weS0wLjUgY3FhLXJvdW5kZWQgY3FhLXRleHQteHNcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgJ2NxYS1iZy1yZWQtMTAwIGNxYS10ZXh0LXJlZC03MDAnOiB2YWx1ZSA9PT0gJ0NyaXRpY2FsJyB8fCB2YWx1ZSA9PT0gJ01ham9yJyxcbiAgICAgICAgICAgICAgICAnY3FhLWJnLXllbGxvdy0xMDAgY3FhLXRleHQteWVsbG93LTcwMCc6IHZhbHVlID09PSAnTWVkaXVtJyxcbiAgICAgICAgICAgICAgICAnY3FhLWJnLWJsdWUtMTAwIGNxYS10ZXh0LWJsdWUtNzAwJzogdmFsdWUgPT09ICdNaW5vcicsXG4gICAgICAgICAgICAgICAgJ2NxYS1iZy1ncmF5LTEwMCBjcWEtdGV4dC1ncmF5LTcwMCc6ICF2YWx1ZSB8fCB2YWx1ZSA9PT0gJ05vdCBTZXQnXG4gICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICA+e3sgdmFsdWUgfHwgJ05vdCBTZXQnIH19PC9zcGFuXG4gICAgICAgICAgICA+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBkeW5hbWljQ2VsbD1cInJlc3VsdFwiIGxldC1yb3c9XCJyb3dcIiBsZXQtdmFsdWU9XCJ2YWx1ZVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtcHgtMiBjcWEtcHktMC41IGNxYS1yb3VuZGVkIGNxYS10ZXh0LXhzXCIgW25nQ2xhc3NdPVwicmVzdWx0QmFkZ2VDbGFzcyh2YWx1ZSlcIj5cbiAgICAgICAgICAgICAge3sgdmFsdWUgfHwgJ05PVF9FWEVDVVRFRCcgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgPG5nLXRlbXBsYXRlIGR5bmFtaWNDZWxsPVwic3RhdHVzXCIgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT1cInZhbHVlXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXhzXCI+e3sgdmFsdWUgfX08L3NwYW4+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBkeW5hbWljQ2VsbD1cImxhYmVsc1wiIGxldC1yb3c9XCJyb3dcIiBsZXQtdmFsdWU9XCJ2YWx1ZVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LXdyYXAgY3FhLWdhcC0xXCI+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCB0YWcgb2YgKHJvdy50YWdzIHx8IFtdKSB8IHNsaWNlOiAwOjNcIiBjbGFzcz1cImNxYS1weC0yIGNxYS1weS0wLjUgY3FhLXJvdW5kZWQgY3FhLWJnLWdyYXktMTAwIGNxYS10ZXh0LWdyYXktNzAwIGNxYS10ZXh0LXhzXCI+XG4gICAgICAgICAgICAgICAge3sgdGFnIH19XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIocm93LnRhZ3M/Lmxlbmd0aCB8fCAwKSA+IDNcIiBjbGFzcz1cImNxYS1weC0yIGNxYS1weS0wLjUgY3FhLXJvdW5kZWQgY3FhLWJnLWdyYXktMTAwIGNxYS10ZXh0LWdyYXktNzAwIGNxYS10ZXh0LXhzXCI+XG4gICAgICAgICAgICAgICAgK3t7IChyb3cudGFncz8ubGVuZ3RoIHx8IDApIC0gMyB9fSBtb3JlXG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgZHluYW1pY0NlbGw9XCJjcmVhdGVkQnlcIiBsZXQtcm93PVwicm93XCIgbGV0LXZhbHVlPVwidmFsdWVcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQteHNcIj57eyB2YWx1ZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgPG5nLXRlbXBsYXRlIGR5bmFtaWNDZWxsPVwiY3JlYXRlZEF0XCIgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT1cInZhbHVlXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LWdyYXktNzAwXCI+e3sgdmFsdWUgfCBkYXRlOiAnbWVkaXVtJyB9fTwvc3Bhbj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgPG5nLXRlbXBsYXRlIGR5bmFtaWNDZWxsPVwidXBkYXRlZEF0XCIgbGV0LXJvdz1cInJvd1wiIGxldC12YWx1ZT1cInZhbHVlXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LXhzIGNxYS10ZXh0LWdyYXktNzAwXCI+e3sgdmFsdWUgfCBkYXRlOiAnbWVkaXVtJyB9fTwvc3Bhbj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgPG5nLXRlbXBsYXRlIGR5bmFtaWNDZWxsPVwibGFzdFJ1blwiIGxldC1yb3c9XCJyb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC14cyBjcWEtdGV4dC1bIzExMTgyN11cIj57eyByb3cubGFzdFJ1bj8uc3RhcnRUaW1lIHwgZGF0ZTogJ21lZGl1bScgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgPG5nLXRlbXBsYXRlIGR5bmFtaWNDZWxsPVwiYWN0aW9uc1wiIGxldC1yb3c9XCJyb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiICpuZ0lmPVwic2hvd0FjdGlvbkJ1dHRvblwiPlxuICAgICAgICAgICAgICA8Y3FhLWFjdGlvbi1tZW51LWJ1dHRvblxuICAgICAgICAgICAgICAgIFtyb3ddPVwicm93XCJcbiAgICAgICAgICAgICAgICAodmlldyk9XCJ2aWV3KCRldmVudClcIlxuICAgICAgICAgICAgICAgIChlZGl0KT1cImVkaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGRlbGV0ZSk9XCJkZWxldGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgID48L2NxYS1hY3Rpb24tbWVudS1idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNlbXB0eVRhYmxlVHBsPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcHktOFwiPlxuICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWxsdXN0cmF0aW9ucy9lbXB0eS1zdGF0ZS5zdmdcIiBhbHQ9XCJObyBkYXRhXCIgY2xhc3M9XCJjcWEtdy0zMiBjcWEtaC0zMiBjcWEtbWItNFwiIC8+XG4gICAgICAgICAgICAgIDxoMyBjbGFzcz1cImNxYS10ZXh0LWxnIGNxYS1mb250LXNlbWlib2xkIGNxYS1tYi0yXCI+Tm8gdGVzdCBjYXNlczwvaDM+XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLXRleHQtbmV1dHJhbC01MDAgY3FhLW1iLTRcIj5UcnkgYWRqdXN0aW5nIGZpbHRlcnMgb3IgY3JlYXRlIGEgbmV3IHRlc3QgY2FzZS48L3A+XG4gICAgICAgICAgICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJmaWxsZWRcIiAoY2xpY2tlZCk9XCJ0b2dnbGVGaWx0ZXIoKVwiPlNob3cgRmlsdGVyczwvY3FhLWJ1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvYXBwLWR5bmFtaWMtdGFibGU+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLXRlbXBsYXRlICNzdG9yeUVtcHR5VHBsPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXAtNiBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICA8Y3FhLWVtcHR5LXN0YXRlXG4gICAgICAgICAgICAqbmdJZj1cImlzRW1wdHlTdGF0ZVwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiZW1wdHlTdGF0ZUNvbmZpZy50aXRsZVwiXG4gICAgICAgICAgICBbZGVzY3JpcHRpb25dPVwiZW1wdHlTdGF0ZUNvbmZpZy5kZXNjcmlwdGlvblwiXG4gICAgICAgICAgICBbaW1hZ2VVcmxdPVwiZW1wdHlTdGF0ZUNvbmZpZy5pbWFnZVVybFwiXG4gICAgICAgICAgICBbYWN0aW9uc109XCJlbXB0eVN0YXRlQ29uZmlnLmFjdGlvbnNcIlxuICAgICAgICAgICAgKGFjdGlvbkNsaWNrKT1cIm9uRW1wdHlBY3Rpb24oJGV2ZW50KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDwvY3FhLWVtcHR5LXN0YXRlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8L2Rpdj5cblxuICAgIDxjcWEtcGFnaW5hdGlvblxuICAgICAgW3RvdGFsRWxlbWVudHNdPVwiZmlsdGVyZWRSb3dzLmxlbmd0aFwiXG4gICAgICBbcGFnZUluZGV4XT1cInBhZ2VJbmRleFwiXG4gICAgICBbcGFnZVNpemVdPVwicGFnZVNpemVcIlxuICAgICAgW3BhZ2VJdGVtQ291bnRdPVwicGFnZWRSb3dzLmxlbmd0aFwiXG4gICAgICAocGFnaW5hdGUpPVwib25QYWdpbmF0ZSgkZXZlbnQpXCJcbiAgICAgIChwYWdlU2l6ZUNoYW5nZSk9XCJvblBhZ2VTaXplQ2hhbmdlKCRldmVudClcIlxuICAgID5cbiAgICA8L2NxYS1wYWdpbmF0aW9uPlxuXG4gICAgPGRpdiAqbmdJZj1cImFueVJvd1NlbGVjdGVkXCIgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWJvdHRvbS1bMTguNzVweF0gY3FhLWxlZnQtWzUwJV0gY3FhLXRyYW5zbGF0ZS14LVstNTAlXSBjcWEtdy1mdWxsIGxnOmNxYS1tYXgtdy1bNjglXSBjcWEtc206bWF4LXctWzc1JV0gY3FhLW1heC13LVs5MCVdIGNxYS16LVsxXVwiID5cbiAgICAgIDxjcWEtdGFibGUtYWN0aW9uLXRvb2xiYXJcbiAgICAgICAgW3NlbGVjdGVkSXRlbXNdPVwiY3VycmVudFNlbGVjdGVkSXRlbXNcIlxuICAgICAgICBbYWN0aW9uc109XCJhY3Rpb25zXCJcbiAgICAgICAgKGFjdGlvbkNsaWNrKT1cImFjdGlvbkNsaWNrKCRldmVudClcIlxuICAgICAgPjwvY3FhLXRhYmxlLWFjdGlvbi10b29sYmFyPlxuICAgIDwvZGl2PlxuICAgIFxuICA8L2Rpdj5cbjwvZGl2PlxuXG4iXX0=
|