ng-prime-tools 1.0.15 → 1.0.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -16
- package/esm2022/lib/models/card-config.model.mjs +1 -1
- package/esm2022/lib/models/table-column.model.mjs +1 -1
- package/esm2022/lib/ng-prime-tools.module.mjs +8 -8
- package/esm2022/lib/{ng-advanced-prime-table → pt-advanced-prime-table}/index.mjs +1 -1
- package/esm2022/lib/pt-advanced-prime-table/pt-advanced-prime-table.component.mjs +353 -0
- package/esm2022/lib/{ng-advanced-prime-table/ng-advanced-prime-table.module.mjs → pt-advanced-prime-table/pt-advanced-prime-table.module.mjs} +10 -10
- package/esm2022/lib/{ng-advanced-prime-table → pt-advanced-prime-table}/public-api.mjs +3 -3
- package/esm2022/lib/pt-card/pt-card.component.mjs +2 -1
- package/esm2022/lib/pt-menu-fancy/pt-menu-fancy.component.mjs +8 -4
- package/esm2022/public-api.mjs +2 -2
- package/fesm2022/ng-prime-tools.mjs +30 -23
- package/fesm2022/ng-prime-tools.mjs.map +1 -1
- package/lib/models/card-config.model.d.ts +1 -0
- package/lib/models/card-config.model.d.ts.map +1 -1
- package/lib/models/table-column.model.d.ts +1 -0
- package/lib/models/table-column.model.d.ts.map +1 -1
- package/lib/ng-prime-tools.module.d.ts +2 -2
- package/lib/pt-advanced-prime-table/index.d.ts.map +1 -0
- package/lib/{ng-advanced-prime-table/ng-advanced-prime-table.component.d.ts → pt-advanced-prime-table/pt-advanced-prime-table.component.d.ts} +5 -4
- package/lib/{ng-advanced-prime-table/ng-advanced-prime-table.component.d.ts.map → pt-advanced-prime-table/pt-advanced-prime-table.component.d.ts.map} +1 -1
- package/lib/{ng-advanced-prime-table/ng-advanced-prime-table.module.d.ts → pt-advanced-prime-table/pt-advanced-prime-table.module.d.ts} +6 -6
- package/lib/pt-advanced-prime-table/pt-advanced-prime-table.module.d.ts.map +1 -0
- package/lib/pt-advanced-prime-table/public-api.d.ts +3 -0
- package/lib/{ng-advanced-prime-table → pt-advanced-prime-table}/public-api.d.ts.map +1 -1
- package/lib/pt-card/pt-card.component.d.ts +1 -0
- package/lib/pt-card/pt-card.component.d.ts.map +1 -1
- package/lib/pt-menu-fancy/pt-menu-fancy.component.d.ts.map +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +1 -1
- package/esm2022/lib/ng-advanced-prime-table/ng-advanced-prime-table.component.mjs +0 -351
- package/lib/ng-advanced-prime-table/index.d.ts.map +0 -1
- package/lib/ng-advanced-prime-table/ng-advanced-prime-table.module.d.ts.map +0 -1
- package/lib/ng-advanced-prime-table/public-api.d.ts +0 -3
- /package/lib/{ng-advanced-prime-table → pt-advanced-prime-table}/index.d.ts +0 -0
@@ -1,351 +0,0 @@
|
|
1
|
-
import { Component, Input, Output, ViewChild } from '@angular/core';
|
2
|
-
import { EventEmitter } from '@angular/core';
|
3
|
-
import { TableTypeEnum } from '../../public-api';
|
4
|
-
import { calculateTextWidth } from '../utils/text.util';
|
5
|
-
import * as i0 from "@angular/core";
|
6
|
-
import * as i1 from "@angular/common";
|
7
|
-
import * as i2 from "primeng/table";
|
8
|
-
import * as i3 from "primeng/api";
|
9
|
-
import * as i4 from "primeng/inputtext";
|
10
|
-
import * as i5 from "primeng/button";
|
11
|
-
import * as i6 from "primeng/calendar";
|
12
|
-
import * as i7 from "@angular/forms";
|
13
|
-
import * as i8 from "primeng/multiselect";
|
14
|
-
import * as i9 from "primeng/tag";
|
15
|
-
import * as i10 from "primeng/iconfield";
|
16
|
-
import * as i11 from "primeng/inputicon";
|
17
|
-
import * as i12 from "../pipes/custom-currency";
|
18
|
-
import * as i13 from "../pipes/custom-date.pipe";
|
19
|
-
export class NgAdvancedPrimeTableComponent {
|
20
|
-
constructor() {
|
21
|
-
// Inputs
|
22
|
-
this.data = [];
|
23
|
-
this.columns = [];
|
24
|
-
this.totalRecords = 0;
|
25
|
-
this.rowsPerPage = [];
|
26
|
-
this.hasSearchFilter = false;
|
27
|
-
this.hasExportExcel = false;
|
28
|
-
this.hasExportPDF = false;
|
29
|
-
this.hasColumnFilter = false;
|
30
|
-
this.isPaginated = false;
|
31
|
-
this.actions = [];
|
32
|
-
this.isSortable = false;
|
33
|
-
this.loading = false;
|
34
|
-
this.maxHeight = null;
|
35
|
-
// Outputs: Events emitted to the parent component
|
36
|
-
this.filter = new EventEmitter();
|
37
|
-
this.search = new EventEmitter();
|
38
|
-
this.exportExcelEvent = new EventEmitter();
|
39
|
-
this.exportPdfEvent = new EventEmitter();
|
40
|
-
this.searchValue = '';
|
41
|
-
this.validCurrencyCodes = ['USD', 'EUR', 'MAD'];
|
42
|
-
this.iconWidth = 77;
|
43
|
-
// Component state properties
|
44
|
-
this.isDelete = false;
|
45
|
-
this.isEdit = false;
|
46
|
-
this.rows = 0;
|
47
|
-
// Data management properties
|
48
|
-
this.dataMap = new Map();
|
49
|
-
this.map = new Map();
|
50
|
-
this.optionEntries = new Map();
|
51
|
-
this.optionValues = [];
|
52
|
-
this.globalFilterFields = [];
|
53
|
-
// CRUD operation handlers
|
54
|
-
this.Delete = () => { };
|
55
|
-
this.initEditableRow = () => { };
|
56
|
-
this.saveEditableRow = () => { };
|
57
|
-
this.cancelEditableRow = () => { };
|
58
|
-
}
|
59
|
-
ngOnInit() {
|
60
|
-
// Transform the date fields based on column metadata
|
61
|
-
this.data = this.formatingDateFields();
|
62
|
-
this.globalFilterFields = this.columns
|
63
|
-
.filter((col) => col.code !== undefined && col.isFilter !== false)
|
64
|
-
.map((col) => col.code);
|
65
|
-
this.initializePagination();
|
66
|
-
this.initializeActions();
|
67
|
-
// Set default value for isSortable
|
68
|
-
this.columns.forEach((col) => {
|
69
|
-
if (col.type === TableTypeEnum.ACTION) {
|
70
|
-
col.isEditable = false;
|
71
|
-
col.isFilter = false;
|
72
|
-
col.isSortable = false;
|
73
|
-
}
|
74
|
-
if (col.isSortable === undefined) {
|
75
|
-
col.isSortable = true;
|
76
|
-
}
|
77
|
-
if (col.isEditable === undefined) {
|
78
|
-
col.isEditable = true;
|
79
|
-
}
|
80
|
-
if (col.isFilter !== false && col.code !== undefined) {
|
81
|
-
this.globalFilterFields.push(col.code);
|
82
|
-
}
|
83
|
-
if (!col.width) {
|
84
|
-
col.width = this.calculateColumnWidth(col);
|
85
|
-
}
|
86
|
-
});
|
87
|
-
}
|
88
|
-
// Function to calculate column width based on text in header and data
|
89
|
-
calculateColumnWidth(col) {
|
90
|
-
const calculatedWidth = calculateTextWidth(col, col.title);
|
91
|
-
const totalWidth = calculatedWidth + this.iconWidth + 20;
|
92
|
-
return `${totalWidth}px`;
|
93
|
-
}
|
94
|
-
getHeaderWidth(col) {
|
95
|
-
// Remove 'px' from col.width and convert it to a number
|
96
|
-
const widthWithoutPx = parseInt(col.width?.replace('px', '') || '0', 10);
|
97
|
-
// Add 20 to the calculated width
|
98
|
-
const headerWidth = widthWithoutPx + 20;
|
99
|
-
// Return the new width in 'px'
|
100
|
-
return `${headerWidth}px`;
|
101
|
-
}
|
102
|
-
// Initialization Methods
|
103
|
-
formatingDateFields() {
|
104
|
-
return this.data.map((item) => {
|
105
|
-
const transformedItem = { ...item };
|
106
|
-
this.columns.forEach((column) => {
|
107
|
-
if (column.type === TableTypeEnum.DATE &&
|
108
|
-
column.code !== undefined &&
|
109
|
-
transformedItem[column.code] !== undefined) {
|
110
|
-
const dateValue = this.parseDate(transformedItem[column.code]);
|
111
|
-
transformedItem[column.code] = dateValue ? dateValue : null;
|
112
|
-
}
|
113
|
-
});
|
114
|
-
return transformedItem;
|
115
|
-
});
|
116
|
-
}
|
117
|
-
clear(table) {
|
118
|
-
table.clear();
|
119
|
-
this.searchValue = '';
|
120
|
-
}
|
121
|
-
parseDate(dateString) {
|
122
|
-
const parts = dateString.split('/');
|
123
|
-
if (parts.length === 3) {
|
124
|
-
// Assuming date format is DD/MM/YYYY
|
125
|
-
const day = parseInt(parts[0], 10);
|
126
|
-
const month = parseInt(parts[1], 10) - 1;
|
127
|
-
const year = parseInt(parts[2], 10);
|
128
|
-
const date = new Date(year, month, day);
|
129
|
-
return isNaN(date.getTime()) ? null : date;
|
130
|
-
}
|
131
|
-
return null;
|
132
|
-
}
|
133
|
-
initializePagination() {
|
134
|
-
if (this.isPaginated) {
|
135
|
-
// Check if rowsPerPage is undefined or an empty array
|
136
|
-
if (!this.rowsPerPage || this.rowsPerPage.length === 0) {
|
137
|
-
this.rowsPerPage = [20, 30, 40];
|
138
|
-
}
|
139
|
-
this.rows = this.rowsPerPage[0];
|
140
|
-
}
|
141
|
-
}
|
142
|
-
initializeActions() {
|
143
|
-
if (this.actions) {
|
144
|
-
this.actions.forEach((action) => {
|
145
|
-
switch (action.code) {
|
146
|
-
case 'delete':
|
147
|
-
this.isDelete = true;
|
148
|
-
this.Delete = (value) => action.action(value);
|
149
|
-
break;
|
150
|
-
case 'edit':
|
151
|
-
this.initializeEditActions(action);
|
152
|
-
break;
|
153
|
-
default:
|
154
|
-
this.isDelete = false;
|
155
|
-
this.isEdit = false;
|
156
|
-
}
|
157
|
-
});
|
158
|
-
}
|
159
|
-
}
|
160
|
-
initializeEditActions(action) {
|
161
|
-
this.isEdit = true;
|
162
|
-
this.initEditableRow = (data) => action.action.init(data);
|
163
|
-
this.saveEditableRow = (data) => {
|
164
|
-
const record = this.map.get(data.id);
|
165
|
-
action.action.save(data, record);
|
166
|
-
this.dataMap.clear();
|
167
|
-
};
|
168
|
-
this.cancelEditableRow = (item) => console.log(item);
|
169
|
-
}
|
170
|
-
onChange(event, id, key) {
|
171
|
-
const target = event.target;
|
172
|
-
this.changeHandler(id, key, target.value);
|
173
|
-
}
|
174
|
-
changeHandler(id, key, value) {
|
175
|
-
let column = this.columns.find((item) => item.code === key);
|
176
|
-
if (!this.map.get(id)) {
|
177
|
-
if (column?.type === TableTypeEnum.DATE) {
|
178
|
-
let date = this.parseDate(value);
|
179
|
-
this.dataMap.set(key, date);
|
180
|
-
}
|
181
|
-
else {
|
182
|
-
this.dataMap.set(key, value);
|
183
|
-
}
|
184
|
-
this.map.set(id, new Map(this.dataMap));
|
185
|
-
}
|
186
|
-
else {
|
187
|
-
let mapItem = this.map.get(id);
|
188
|
-
if (column?.type === TableTypeEnum.DATE) {
|
189
|
-
let date = this.parseDate(value);
|
190
|
-
mapItem.set(key, date);
|
191
|
-
}
|
192
|
-
else {
|
193
|
-
mapItem.set(key, value);
|
194
|
-
}
|
195
|
-
}
|
196
|
-
}
|
197
|
-
getColumnFilterType(column) {
|
198
|
-
switch (column.type) {
|
199
|
-
case TableTypeEnum.STRING:
|
200
|
-
return 'text';
|
201
|
-
case TableTypeEnum.AMOUNT:
|
202
|
-
return 'numeric';
|
203
|
-
case TableTypeEnum.NUMBER:
|
204
|
-
return 'numeric';
|
205
|
-
case TableTypeEnum.DATE:
|
206
|
-
return 'date';
|
207
|
-
case TableTypeEnum.MULTISELECT:
|
208
|
-
return 'multiSelect';
|
209
|
-
case TableTypeEnum.BOOLEAN:
|
210
|
-
return 'boolean';
|
211
|
-
default:
|
212
|
-
return 'text';
|
213
|
-
}
|
214
|
-
}
|
215
|
-
// State Check Methods
|
216
|
-
isEditable(key) {
|
217
|
-
let column = this.columns.find((item) => item.code === key);
|
218
|
-
return column?.isEditable !== false;
|
219
|
-
}
|
220
|
-
isMultiSelect(key) {
|
221
|
-
let column = this.columns.find((item) => item.code === key);
|
222
|
-
if (column?.type === TableTypeEnum.MULTISELECT &&
|
223
|
-
column.options &&
|
224
|
-
column.code !== undefined) {
|
225
|
-
this.optionEntries = new Map([
|
226
|
-
[column.code, Object.values(column.options)],
|
227
|
-
]);
|
228
|
-
this.optionValues = this.optionEntries.get(key) || [];
|
229
|
-
return true;
|
230
|
-
}
|
231
|
-
return false;
|
232
|
-
}
|
233
|
-
isDatePicker(key) {
|
234
|
-
return (this.columns.find((item) => item.code === key)?.type ===
|
235
|
-
TableTypeEnum.DATE);
|
236
|
-
}
|
237
|
-
// Utility Methods
|
238
|
-
dateConverter(value) {
|
239
|
-
return new Date(value).toLocaleDateString('en-US');
|
240
|
-
}
|
241
|
-
getCurrencySymbol(column) {
|
242
|
-
return column.type === TableTypeEnum.AMOUNT &&
|
243
|
-
column.currency &&
|
244
|
-
this.isValidCurrencyCode(column.currency)
|
245
|
-
? column.currency
|
246
|
-
: undefined;
|
247
|
-
}
|
248
|
-
isValidCurrencyCode(currencyCode) {
|
249
|
-
return this.validCurrencyCodes.includes(currencyCode);
|
250
|
-
}
|
251
|
-
filterGlobal(event) {
|
252
|
-
const target = event.target;
|
253
|
-
const value = target.value.toLowerCase();
|
254
|
-
// Create a new filtered dataset
|
255
|
-
const filteredData = this.data.filter((item) => {
|
256
|
-
return this.globalFilterFields.some((field) => {
|
257
|
-
const column = this.columns.find((col) => col.code === field);
|
258
|
-
if (!column) {
|
259
|
-
return false;
|
260
|
-
}
|
261
|
-
// Handle different column types
|
262
|
-
if (column.type === TableTypeEnum.DATE) {
|
263
|
-
const itemDate = this.formatDate(item[field]);
|
264
|
-
return itemDate && itemDate.includes(value);
|
265
|
-
}
|
266
|
-
else if (column.type === TableTypeEnum.AMOUNT ||
|
267
|
-
column.type === TableTypeEnum.NUMBER) {
|
268
|
-
return (item[field] && item[field].toString().toLowerCase().includes(value));
|
269
|
-
}
|
270
|
-
else {
|
271
|
-
return (item[field] && item[field].toString().toLowerCase().includes(value));
|
272
|
-
}
|
273
|
-
});
|
274
|
-
});
|
275
|
-
// Update the table's value
|
276
|
-
this.dt.value = filteredData;
|
277
|
-
}
|
278
|
-
formatDate(date) {
|
279
|
-
if (!date)
|
280
|
-
return '';
|
281
|
-
if (date instanceof Date) {
|
282
|
-
// Handle Date object
|
283
|
-
const day = date.getDate().toString().padStart(2, '0');
|
284
|
-
const month = (date.getMonth() + 1).toString().padStart(2, '0');
|
285
|
-
const year = date.getFullYear().toString();
|
286
|
-
return `${day}/${month}/${year}`;
|
287
|
-
}
|
288
|
-
else if (typeof date === 'string') {
|
289
|
-
// Handle string date
|
290
|
-
const parts = date.split('/');
|
291
|
-
if (parts.length === 3) {
|
292
|
-
return `${parts[0]}/${parts[1]}/${parts[2]}`;
|
293
|
-
}
|
294
|
-
else {
|
295
|
-
// Handle partial dates
|
296
|
-
return date;
|
297
|
-
}
|
298
|
-
}
|
299
|
-
return '';
|
300
|
-
}
|
301
|
-
exportExcel() {
|
302
|
-
this.exportExcelEvent.emit();
|
303
|
-
}
|
304
|
-
exportPdf() {
|
305
|
-
this.exportPdfEvent.emit();
|
306
|
-
}
|
307
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: NgAdvancedPrimeTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
308
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: NgAdvancedPrimeTableComponent, selector: "ng-advanced-prime-table", inputs: { data: "data", columns: "columns", totalRecords: "totalRecords", rowsPerPage: "rowsPerPage", hasSearchFilter: "hasSearchFilter", hasExportExcel: "hasExportExcel", hasExportPDF: "hasExportPDF", hasColumnFilter: "hasColumnFilter", isPaginated: "isPaginated", actions: "actions", isSortable: "isSortable", loading: "loading", maxHeight: "maxHeight" }, outputs: { filter: "filter", search: "search", exportExcelEvent: "exportExcelEvent", exportPdfEvent: "exportPdfEvent" }, viewQueries: [{ propertyName: "dt", first: true, predicate: ["dt"], descendants: true }], ngImport: i0, template: "<div class=\"ng-advanced-prime-table table-container\">\n <p-table\n #dt\n [value]=\"data\"\n [loading]=\"loading\"\n [rows]=\"rows\"\n [paginator]=\"isPaginated\"\n [globalFilterFields]=\"globalFilterFields\"\n [rowsPerPageOptions]=\"rowsPerPage\"\n dataKey=\"id\"\n styleClass=\"p-datatable-gridlines\"\n styleClass=\"p-datatable-striped\"\n editMode=\"row\"\n [scrollable]=\"true\"\n [scrollHeight]=\"maxHeight !== null ? maxHeight : undefined\"\n >\n <ng-template pTemplate=\"caption\">\n <div class=\"flex\">\n <div>\n <h3>Total: {{ totalRecords }}</h3>\n </div>\n\n <div>\n <!-- Clear filters -->\n <button\n *ngIf=\"hasSearchFilter\"\n pButton\n icon=\"pi pi-filter-slash\"\n class=\"p-button-rounded p-button-text\"\n (click)=\"clear(dt)\"\n title=\"Clear filters\"\n ></button>\n\n <!-- Export to Excel Button -->\n <button\n *ngIf=\"hasExportExcel\"\n pButton\n icon=\"pi pi-file-excel\"\n class=\"p-button-rounded p-button-text\"\n (click)=\"exportExcel()\"\n title=\"Export to Excel\"\n ></button>\n\n <!-- Export to PDF Button -->\n <button\n *ngIf=\"hasExportPDF\"\n pButton\n icon=\"pi pi-file-pdf\"\n class=\"p-button-rounded p-button-text\"\n (click)=\"exportPdf()\"\n title=\"Export to PDF\"\n ></button>\n </div>\n <div class=\"ml-auto\" *ngIf=\"hasSearchFilter\">\n <!-- Add this wrapper div with ml-auto class -->\n <p-iconField iconPosition=\"left\" class=\"ml-auto\">\n <p-inputIcon>\n <i class=\"pi pi-search\"></i>\n </p-inputIcon>\n <input\n pInputText\n type=\"text\"\n [(ngModel)]=\"searchValue\"\n (input)=\"filterGlobal($event)\"\n placeholder=\"Search keyword\"\n />\n </p-iconField>\n </div>\n </div>\n </ng-template>\n\n <ng-template pTemplate=\"header\">\n <tr class=\"sticky-header\">\n <th\n *ngFor=\"let col of columns\"\n [style.width]=\"getHeaderWidth(col)\"\n [style.padding]=\"'0px'\"\n >\n <ng-container\n *ngIf=\"isSortable && col.isSortable !== false; else noSortHeader\"\n >\n <th\n pSortableColumn=\"{{ col.code }}\"\n [style.width]=\"getHeaderWidth(col)\"\n >\n <div\n class=\"header-container d-flex align-items-center justify-content-between\"\n [style.width]=\"col.width\"\n [style.padding]=\"'0px'\"\n [style.margin]=\"'10px'\"\n >\n <span>{{ col.title }}</span>\n <div\n class=\"icons d-flex align-items-center\"\n [style.width]=\"'77px'\"\n >\n <p-sortIcon field=\"{{ col.code }}\" />\n <ng-container *ngIf=\"col.isFilter !== false\">\n <p-columnFilter\n *ngIf=\"col.type === 'AMOUNT'\"\n display=\"menu\"\n [field]=\"col.code\"\n [type]=\"getColumnFilterType(col)\"\n [currency]=\"getCurrencySymbol(col)\"\n ></p-columnFilter>\n\n <p-columnFilter\n *ngIf=\"col.type !== 'AMOUNT'\"\n display=\"menu\"\n [field]=\"col.code\"\n display=\"menu\"\n [type]=\"getColumnFilterType(col)\"\n [type]=\"getColumnFilterType(col)\"\n >\n <ng-template\n pTemplate=\"filter\"\n let-value\n let-filterCallback=\"filterCallback\"\n *ngIf=\"getColumnFilterType(col) === 'date'\"\n >\n <p-calendar\n [ngModel]=\"value\"\n (ngModelChange)=\"filterCallback($event)\"\n [dateFormat]=\"'dd/mm/yy'\"\n ></p-calendar>\n </ng-template>\n\n <ng-template\n pTemplate=\"filter\"\n let-value\n let-filterCallback=\"filterCallback\"\n *ngIf=\"getColumnFilterType(col) === 'multiSelect'\"\n >\n <p-multiSelect\n [options]=\"col.filterOptions\"\n [ngModel]=\"value\"\n (ngModelChange)=\"filterCallback($event)\"\n [display]=\"'chip'\"\n placeholder=\"Select\"\n class=\"custom-multiselect\"\n ></p-multiSelect>\n </ng-template>\n </p-columnFilter>\n </ng-container>\n </div>\n </div>\n </th>\n </ng-container>\n <ng-template #noSortHeader>\n <th>\n <div class=\"header-container\">\n <span>{{ col.title }}</span>\n <ng-container *ngIf=\"col.isFilter !== false\">\n <p-columnFilter\n *ngIf=\"col.type === 'AMOUNT'\"\n display=\"menu\"\n [field]=\"col.code\"\n [type]=\"getColumnFilterType(col)\"\n [currency]=\"getCurrencySymbol(col)\"\n ></p-columnFilter>\n\n <p-columnFilter\n *ngIf=\"col.type !== 'AMOUNT'\"\n display=\"menu\"\n [field]=\"col.code\"\n [type]=\"getColumnFilterType(col)\"\n >\n <ng-template\n pTemplate=\"filter\"\n let-value\n let-filterCallback=\"filterCallback\"\n *ngIf=\"getColumnFilterType(col) === 'date'\"\n >\n <p-calendar\n [ngModel]=\"value\"\n (ngModelChange)=\"filterCallback($event)\"\n [dateFormat]=\"'dd/mm/yy'\"\n ></p-calendar>\n </ng-template>\n\n <ng-template\n pTemplate=\"filter\"\n let-value\n let-filterCallback=\"filterCallback\"\n *ngIf=\"getColumnFilterType(col) === 'multiSelect'\"\n >\n <p-multiSelect\n [options]=\"col.filterOptions\"\n [ngModel]=\"value\"\n (ngModelChange)=\"filterCallback($event)\"\n [display]=\"'chip'\"\n placeholder=\"Select\"\n class=\"custom-multiselect\"\n ></p-multiSelect>\n </ng-template>\n </p-columnFilter>\n </ng-container>\n </div>\n </th>\n </ng-template>\n </th>\n </tr>\n </ng-template>\n\n <!-- Empty message template -->\n <ng-template pTemplate=\"emptymessage\">\n <div class=\"empty-message\">\n <i class=\"pi pi-info-circle\"></i>\n <p>No records available to display.</p>\n </div>\n </ng-template>\n\n <ng-template\n pTemplate=\"body\"\n let-data\n let-editing=\"editing\"\n let-ri=\"rowIndex\"\n >\n <!-- Render a table row and make it editable if `isEdit` is true -->\n <tr *ngIf=\"!loading\" [pEditableRow]=\"isEdit ? data : null\">\n <!-- Loop through each column and render corresponding table cells -->\n <ng-container *ngFor=\"let col of columns\">\n <ng-container *ngIf=\"col.code !== undefined\">\n <!-- Check if the data for the column exists -->\n <ng-container *ngIf=\"data[col.code] !== undefined\">\n <!-- Render an editable cell if the column is editable -->\n <td\n *ngIf=\"isEditable(col.code); else normalTD\"\n [style.width]=\"getHeaderWidth(col)\"\n >\n <!-- Multi-select input for columns that are multi-selectable -->\n <ng-container *ngIf=\"isMultiSelect(col.code); else datePicker\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <p-multiSelect\n appendTo=\"body\"\n [ngModel]=\"data[col.code]\"\n [style]=\"{ width: '100%' }\"\n (ngModelChange)=\"\n changeHandler(data.id, col.code, $event)\n \"\n [options]=\"optionValues\"\n ></p-multiSelect>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <div class=\"multi-select-container\">\n <ng-container *ngFor=\"let rec of data[col.code]\">\n <p-tag [value]=\"rec\"></p-tag>\n </ng-container>\n </div>\n </ng-template>\n </p-cellEditor>\n </ng-container>\n\n <!-- Date picker input for columns that require date selection -->\n <ng-template #datePicker>\n <ng-container\n *ngIf=\"isDatePicker(col.code); else normalInput\"\n >\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <p-calendar\n [inputId]=\"data[col.code]\"\n [ngModel]=\"data[col.code]\"\n (ngModelChange)=\"\n changeHandler(data.id, col.code, $event)\n \"\n [dateFormat]=\"'dd/mm/yy'\"\n ></p-calendar>\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{ data[col.code] | customDate }}\n </ng-template>\n </p-cellEditor>\n </ng-container>\n </ng-template>\n\n <!-- Normal text input for other columns -->\n <ng-template #normalInput>\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input\n pInputText\n type=\"text\"\n [ngModel]=\"data[col.code]\"\n (change)=\"onChange($event, data.id, col.code)\"\n />\n </ng-template>\n <ng-template pTemplate=\"output\">\n <!-- Use currency pipe to format the output for AMOUNT type -->\n <ng-container\n *ngIf=\"col.type === 'AMOUNT'; else normalOutput\"\n >\n {{\n data[col.code]\n | customCurrency\n : getCurrencySymbol(col)\n : col.decimalPlaces\n : col.thousandSeparator\n : col.decimalSeparator\n }}\n </ng-container>\n <ng-template #normalOutput>\n {{ data[col.code] }}\n </ng-template>\n </ng-template>\n </p-cellEditor>\n </ng-template>\n </td>\n\n <!-- Render a normal table cell if the column is not editable -->\n <ng-template #normalTD>\n <td [style.width]=\"getHeaderWidth(col)\">\n <!-- Use customCurrency pipe to format the output for AMOUNT type with optional decimal places -->\n <ng-container *ngIf=\"col.type === 'AMOUNT'; else normalText\">\n >\n {{\n data[col.code]\n | customCurrency\n : getCurrencySymbol(col)\n : col.decimalPlaces\n : col.thousandSeparator\n : col.decimalSeparator\n }}\n </ng-container>\n <ng-template #normalText>\n {{ data[col.code] }}\n </ng-template>\n </td>\n </ng-template>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <!-- Render action buttons if there are any actions defined -->\n <td *ngIf=\"actions?.length\">\n <div class=\"action-buttons-container\">\n <!-- Delete button if deletion is allowed -->\n <div *ngIf=\"isDelete\">\n <button\n pButton\n pRipple\n type=\"button\"\n icon=\"pi pi-trash\"\n (click)=\"Delete(data.id)\"\n class=\"p-button-rounded p-button-text\"\n ></button>\n </div>\n <!-- Edit, save, and cancel buttons for row editing -->\n <div>\n <button\n pInitEditableRow\n *ngIf=\"!editing\"\n pButton\n pRipple\n type=\"button\"\n icon=\"pi pi-pencil\"\n (click)=\"initEditableRow(data)\"\n class=\"p-button-rounded p-button-text\"\n ></button>\n <button\n *ngIf=\"editing\"\n pSaveEditableRow\n pButton\n pRipple\n type=\"button\"\n icon=\"pi pi-check\"\n (click)=\"saveEditableRow(data)\"\n class=\"p-button-rounded p-button-text\"\n ></button>\n <button\n *ngIf=\"editing\"\n pCancelEditableRow\n pButton\n pRipple\n type=\"button\"\n icon=\"pi pi-times\"\n (click)=\"cancelEditableRow(data)\"\n class=\"p-button-rounded p-button-text\"\n ></button>\n </div>\n </div>\n </td>\n </tr>\n </ng-template>\n </p-table>\n</div>\n", styles: [".ng-advanced-prime-table .bread-crumb{margin-bottom:15px}.ng-advanced-prime-table .date{width:100%;height:5rem;display:grid;justify-items:start;align-items:center}.ng-advanced-prime-table .filter-container{width:100%;display:flex;justify-content:space-between;align-items:center}.ng-advanced-prime-table .settings{display:flex;gap:1rem}.ng-advanced-prime-table .multi-select-container{display:flex;justify-content:center;align-items:center;gap:.3rem}.ng-advanced-prime-table ::ng-deep p-table{min-width:50rem}.ng-advanced-prime-table ::ng-deep .custom-multiselect .p-hidden-accessible input{display:none}.ng-advanced-prime-table ::ng-deep .p-datatable .p-sortable-column.p-highlight:hover{background:none}.ng-advanced-prime-table ::ng-deep .p-datatable .p-sortable-column:focus{box-shadow:none;outline:0 none}.ng-advanced-prime-table ::ng-deep .header-container{display:flex;justify-content:space-between;align-items:center;width:100%}.ng-advanced-prime-table ::ng-deep p-columnfilter.p-element.ng-star-inserted{margin-top:4px}.ng-advanced-prime-table .flex{display:flex;justify-content:space-between;align-items:center}.ng-advanced-prime-table .ml-auto{margin-left:auto}.ng-advanced-prime-table ::ng-deep p-inputicon{margin-right:-1.5rem;z-index:2;position:relative}.ng-advanced-prime-table ::ng-deep .p-inputtext{padding-left:1.7rem}.ng-advanced-prime-table ::ng-deep .bt-filter-btn button{cursor:pointer;margin-left:1rem}.ng-advanced-prime-table ::ng-deep .p-icon-field-left .p-input-icon:first-of-type{left:-1rem}.ng-advanced-prime-table .table-row{text-align:center;display:flex;gap:1rem;justify-content:center}.ng-advanced-prime-table ::ng-deep span.p-button-icon.pi.pi-file-excel{font-size:1.25em;color:green}.ng-advanced-prime-table ::ng-deep span.p-button-icon.pi.pi-file-pdf{font-size:1.25em;color:red}.ng-advanced-prime-table .table-container{display:flex;flex-direction:column;height:100%;overflow:hidden}.ng-advanced-prime-table ::ng-deep .p-datatable{display:flex;flex-direction:column;width:100%;border-collapse:collapse;table-layout:fixed}.ng-advanced-prime-table ::ng-deep .p-datatable thead{display:table;width:100%;table-layout:fixed;background:#fff;z-index:2}.ng-advanced-prime-table ::ng-deep .p-datatable tfoot{display:table;width:100%;table-layout:fixed;background:#fff;z-index:2}.ng-advanced-prime-table ::ng-deep .p-datatable tbody{display:block;overflow-y:auto;overflow-x:hidden}.ng-advanced-prime-table ::ng-deep .p-datatable tbody tr{display:table;width:100%;table-layout:fixed}.ng-advanced-prime-table .empty-message{text-align:center;padding:2rem;color:#888;font-size:1.2rem}.ng-advanced-prime-table .empty-message i{display:block;font-size:2rem;margin-bottom:.5rem}.ng-advanced-prime-table th{white-space:normal;word-wrap:break-word}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i2.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "component", type: i2.CellEditor, selector: "p-cellEditor" }, { kind: "component", type: i2.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "directive", type: i2.EditableRow, selector: "[pEditableRow]", inputs: ["pEditableRow", "pEditableRowDisabled"] }, { kind: "directive", type: i2.InitEditableRow, selector: "[pInitEditableRow]" }, { kind: "directive", type: i2.SaveEditableRow, selector: "[pSaveEditableRow]" }, { kind: "directive", type: i2.CancelEditableRow, selector: "[pCancelEditableRow]" }, { kind: "component", type: i2.ColumnFilter, selector: "p-columnFilter", inputs: ["field", "type", "display", "showMenu", "matchMode", "operator", "showOperator", "showClearButton", "showApplyButton", "showMatchModes", "showAddButton", "hideOnClear", "placeholder", "matchModeOptions", "maxConstraints", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "locale", "localeMatcher", "currency", "currencyDisplay", "useGrouping", "showButtons", "ariaLabel"], outputs: ["onShow", "onHide"] }, { kind: "directive", type: i4.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "directive", type: i5.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "component", type: i6.Calendar, selector: "p-calendar", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepYearPicker", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "startWeekFromFirstDayOfYear", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autofocus", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "variant", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "directive", type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i8.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "component", type: i9.Tag, selector: "p-tag", inputs: ["style", "styleClass", "severity", "value", "icon", "rounded"] }, { kind: "component", type: i10.IconField, selector: "p-iconField", inputs: ["iconPosition"] }, { kind: "component", type: i11.InputIcon, selector: "p-inputIcon", inputs: ["styleClass"] }, { kind: "pipe", type: i12.CustomCurrencyPipe, name: "customCurrency" }, { kind: "pipe", type: i13.CustomDatePipe, name: "customDate" }] }); }
|
309
|
-
}
|
310
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: NgAdvancedPrimeTableComponent, decorators: [{
|
311
|
-
type: Component,
|
312
|
-
args: [{ selector: 'ng-advanced-prime-table', template: "<div class=\"ng-advanced-prime-table table-container\">\n <p-table\n #dt\n [value]=\"data\"\n [loading]=\"loading\"\n [rows]=\"rows\"\n [paginator]=\"isPaginated\"\n [globalFilterFields]=\"globalFilterFields\"\n [rowsPerPageOptions]=\"rowsPerPage\"\n dataKey=\"id\"\n styleClass=\"p-datatable-gridlines\"\n styleClass=\"p-datatable-striped\"\n editMode=\"row\"\n [scrollable]=\"true\"\n [scrollHeight]=\"maxHeight !== null ? maxHeight : undefined\"\n >\n <ng-template pTemplate=\"caption\">\n <div class=\"flex\">\n <div>\n <h3>Total: {{ totalRecords }}</h3>\n </div>\n\n <div>\n <!-- Clear filters -->\n <button\n *ngIf=\"hasSearchFilter\"\n pButton\n icon=\"pi pi-filter-slash\"\n class=\"p-button-rounded p-button-text\"\n (click)=\"clear(dt)\"\n title=\"Clear filters\"\n ></button>\n\n <!-- Export to Excel Button -->\n <button\n *ngIf=\"hasExportExcel\"\n pButton\n icon=\"pi pi-file-excel\"\n class=\"p-button-rounded p-button-text\"\n (click)=\"exportExcel()\"\n title=\"Export to Excel\"\n ></button>\n\n <!-- Export to PDF Button -->\n <button\n *ngIf=\"hasExportPDF\"\n pButton\n icon=\"pi pi-file-pdf\"\n class=\"p-button-rounded p-button-text\"\n (click)=\"exportPdf()\"\n title=\"Export to PDF\"\n ></button>\n </div>\n <div class=\"ml-auto\" *ngIf=\"hasSearchFilter\">\n <!-- Add this wrapper div with ml-auto class -->\n <p-iconField iconPosition=\"left\" class=\"ml-auto\">\n <p-inputIcon>\n <i class=\"pi pi-search\"></i>\n </p-inputIcon>\n <input\n pInputText\n type=\"text\"\n [(ngModel)]=\"searchValue\"\n (input)=\"filterGlobal($event)\"\n placeholder=\"Search keyword\"\n />\n </p-iconField>\n </div>\n </div>\n </ng-template>\n\n <ng-template pTemplate=\"header\">\n <tr class=\"sticky-header\">\n <th\n *ngFor=\"let col of columns\"\n [style.width]=\"getHeaderWidth(col)\"\n [style.padding]=\"'0px'\"\n >\n <ng-container\n *ngIf=\"isSortable && col.isSortable !== false; else noSortHeader\"\n >\n <th\n pSortableColumn=\"{{ col.code }}\"\n [style.width]=\"getHeaderWidth(col)\"\n >\n <div\n class=\"header-container d-flex align-items-center justify-content-between\"\n [style.width]=\"col.width\"\n [style.padding]=\"'0px'\"\n [style.margin]=\"'10px'\"\n >\n <span>{{ col.title }}</span>\n <div\n class=\"icons d-flex align-items-center\"\n [style.width]=\"'77px'\"\n >\n <p-sortIcon field=\"{{ col.code }}\" />\n <ng-container *ngIf=\"col.isFilter !== false\">\n <p-columnFilter\n *ngIf=\"col.type === 'AMOUNT'\"\n display=\"menu\"\n [field]=\"col.code\"\n [type]=\"getColumnFilterType(col)\"\n [currency]=\"getCurrencySymbol(col)\"\n ></p-columnFilter>\n\n <p-columnFilter\n *ngIf=\"col.type !== 'AMOUNT'\"\n display=\"menu\"\n [field]=\"col.code\"\n display=\"menu\"\n [type]=\"getColumnFilterType(col)\"\n [type]=\"getColumnFilterType(col)\"\n >\n <ng-template\n pTemplate=\"filter\"\n let-value\n let-filterCallback=\"filterCallback\"\n *ngIf=\"getColumnFilterType(col) === 'date'\"\n >\n <p-calendar\n [ngModel]=\"value\"\n (ngModelChange)=\"filterCallback($event)\"\n [dateFormat]=\"'dd/mm/yy'\"\n ></p-calendar>\n </ng-template>\n\n <ng-template\n pTemplate=\"filter\"\n let-value\n let-filterCallback=\"filterCallback\"\n *ngIf=\"getColumnFilterType(col) === 'multiSelect'\"\n >\n <p-multiSelect\n [options]=\"col.filterOptions\"\n [ngModel]=\"value\"\n (ngModelChange)=\"filterCallback($event)\"\n [display]=\"'chip'\"\n placeholder=\"Select\"\n class=\"custom-multiselect\"\n ></p-multiSelect>\n </ng-template>\n </p-columnFilter>\n </ng-container>\n </div>\n </div>\n </th>\n </ng-container>\n <ng-template #noSortHeader>\n <th>\n <div class=\"header-container\">\n <span>{{ col.title }}</span>\n <ng-container *ngIf=\"col.isFilter !== false\">\n <p-columnFilter\n *ngIf=\"col.type === 'AMOUNT'\"\n display=\"menu\"\n [field]=\"col.code\"\n [type]=\"getColumnFilterType(col)\"\n [currency]=\"getCurrencySymbol(col)\"\n ></p-columnFilter>\n\n <p-columnFilter\n *ngIf=\"col.type !== 'AMOUNT'\"\n display=\"menu\"\n [field]=\"col.code\"\n [type]=\"getColumnFilterType(col)\"\n >\n <ng-template\n pTemplate=\"filter\"\n let-value\n let-filterCallback=\"filterCallback\"\n *ngIf=\"getColumnFilterType(col) === 'date'\"\n >\n <p-calendar\n [ngModel]=\"value\"\n (ngModelChange)=\"filterCallback($event)\"\n [dateFormat]=\"'dd/mm/yy'\"\n ></p-calendar>\n </ng-template>\n\n <ng-template\n pTemplate=\"filter\"\n let-value\n let-filterCallback=\"filterCallback\"\n *ngIf=\"getColumnFilterType(col) === 'multiSelect'\"\n >\n <p-multiSelect\n [options]=\"col.filterOptions\"\n [ngModel]=\"value\"\n (ngModelChange)=\"filterCallback($event)\"\n [display]=\"'chip'\"\n placeholder=\"Select\"\n class=\"custom-multiselect\"\n ></p-multiSelect>\n </ng-template>\n </p-columnFilter>\n </ng-container>\n </div>\n </th>\n </ng-template>\n </th>\n </tr>\n </ng-template>\n\n <!-- Empty message template -->\n <ng-template pTemplate=\"emptymessage\">\n <div class=\"empty-message\">\n <i class=\"pi pi-info-circle\"></i>\n <p>No records available to display.</p>\n </div>\n </ng-template>\n\n <ng-template\n pTemplate=\"body\"\n let-data\n let-editing=\"editing\"\n let-ri=\"rowIndex\"\n >\n <!-- Render a table row and make it editable if `isEdit` is true -->\n <tr *ngIf=\"!loading\" [pEditableRow]=\"isEdit ? data : null\">\n <!-- Loop through each column and render corresponding table cells -->\n <ng-container *ngFor=\"let col of columns\">\n <ng-container *ngIf=\"col.code !== undefined\">\n <!-- Check if the data for the column exists -->\n <ng-container *ngIf=\"data[col.code] !== undefined\">\n <!-- Render an editable cell if the column is editable -->\n <td\n *ngIf=\"isEditable(col.code); else normalTD\"\n [style.width]=\"getHeaderWidth(col)\"\n >\n <!-- Multi-select input for columns that are multi-selectable -->\n <ng-container *ngIf=\"isMultiSelect(col.code); else datePicker\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <p-multiSelect\n appendTo=\"body\"\n [ngModel]=\"data[col.code]\"\n [style]=\"{ width: '100%' }\"\n (ngModelChange)=\"\n changeHandler(data.id, col.code, $event)\n \"\n [options]=\"optionValues\"\n ></p-multiSelect>\n </ng-template>\n <ng-template pTemplate=\"output\">\n <div class=\"multi-select-container\">\n <ng-container *ngFor=\"let rec of data[col.code]\">\n <p-tag [value]=\"rec\"></p-tag>\n </ng-container>\n </div>\n </ng-template>\n </p-cellEditor>\n </ng-container>\n\n <!-- Date picker input for columns that require date selection -->\n <ng-template #datePicker>\n <ng-container\n *ngIf=\"isDatePicker(col.code); else normalInput\"\n >\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <p-calendar\n [inputId]=\"data[col.code]\"\n [ngModel]=\"data[col.code]\"\n (ngModelChange)=\"\n changeHandler(data.id, col.code, $event)\n \"\n [dateFormat]=\"'dd/mm/yy'\"\n ></p-calendar>\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{ data[col.code] | customDate }}\n </ng-template>\n </p-cellEditor>\n </ng-container>\n </ng-template>\n\n <!-- Normal text input for other columns -->\n <ng-template #normalInput>\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <input\n pInputText\n type=\"text\"\n [ngModel]=\"data[col.code]\"\n (change)=\"onChange($event, data.id, col.code)\"\n />\n </ng-template>\n <ng-template pTemplate=\"output\">\n <!-- Use currency pipe to format the output for AMOUNT type -->\n <ng-container\n *ngIf=\"col.type === 'AMOUNT'; else normalOutput\"\n >\n {{\n data[col.code]\n | customCurrency\n : getCurrencySymbol(col)\n : col.decimalPlaces\n : col.thousandSeparator\n : col.decimalSeparator\n }}\n </ng-container>\n <ng-template #normalOutput>\n {{ data[col.code] }}\n </ng-template>\n </ng-template>\n </p-cellEditor>\n </ng-template>\n </td>\n\n <!-- Render a normal table cell if the column is not editable -->\n <ng-template #normalTD>\n <td [style.width]=\"getHeaderWidth(col)\">\n <!-- Use customCurrency pipe to format the output for AMOUNT type with optional decimal places -->\n <ng-container *ngIf=\"col.type === 'AMOUNT'; else normalText\">\n >\n {{\n data[col.code]\n | customCurrency\n : getCurrencySymbol(col)\n : col.decimalPlaces\n : col.thousandSeparator\n : col.decimalSeparator\n }}\n </ng-container>\n <ng-template #normalText>\n {{ data[col.code] }}\n </ng-template>\n </td>\n </ng-template>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <!-- Render action buttons if there are any actions defined -->\n <td *ngIf=\"actions?.length\">\n <div class=\"action-buttons-container\">\n <!-- Delete button if deletion is allowed -->\n <div *ngIf=\"isDelete\">\n <button\n pButton\n pRipple\n type=\"button\"\n icon=\"pi pi-trash\"\n (click)=\"Delete(data.id)\"\n class=\"p-button-rounded p-button-text\"\n ></button>\n </div>\n <!-- Edit, save, and cancel buttons for row editing -->\n <div>\n <button\n pInitEditableRow\n *ngIf=\"!editing\"\n pButton\n pRipple\n type=\"button\"\n icon=\"pi pi-pencil\"\n (click)=\"initEditableRow(data)\"\n class=\"p-button-rounded p-button-text\"\n ></button>\n <button\n *ngIf=\"editing\"\n pSaveEditableRow\n pButton\n pRipple\n type=\"button\"\n icon=\"pi pi-check\"\n (click)=\"saveEditableRow(data)\"\n class=\"p-button-rounded p-button-text\"\n ></button>\n <button\n *ngIf=\"editing\"\n pCancelEditableRow\n pButton\n pRipple\n type=\"button\"\n icon=\"pi pi-times\"\n (click)=\"cancelEditableRow(data)\"\n class=\"p-button-rounded p-button-text\"\n ></button>\n </div>\n </div>\n </td>\n </tr>\n </ng-template>\n </p-table>\n</div>\n", styles: [".ng-advanced-prime-table .bread-crumb{margin-bottom:15px}.ng-advanced-prime-table .date{width:100%;height:5rem;display:grid;justify-items:start;align-items:center}.ng-advanced-prime-table .filter-container{width:100%;display:flex;justify-content:space-between;align-items:center}.ng-advanced-prime-table .settings{display:flex;gap:1rem}.ng-advanced-prime-table .multi-select-container{display:flex;justify-content:center;align-items:center;gap:.3rem}.ng-advanced-prime-table ::ng-deep p-table{min-width:50rem}.ng-advanced-prime-table ::ng-deep .custom-multiselect .p-hidden-accessible input{display:none}.ng-advanced-prime-table ::ng-deep .p-datatable .p-sortable-column.p-highlight:hover{background:none}.ng-advanced-prime-table ::ng-deep .p-datatable .p-sortable-column:focus{box-shadow:none;outline:0 none}.ng-advanced-prime-table ::ng-deep .header-container{display:flex;justify-content:space-between;align-items:center;width:100%}.ng-advanced-prime-table ::ng-deep p-columnfilter.p-element.ng-star-inserted{margin-top:4px}.ng-advanced-prime-table .flex{display:flex;justify-content:space-between;align-items:center}.ng-advanced-prime-table .ml-auto{margin-left:auto}.ng-advanced-prime-table ::ng-deep p-inputicon{margin-right:-1.5rem;z-index:2;position:relative}.ng-advanced-prime-table ::ng-deep .p-inputtext{padding-left:1.7rem}.ng-advanced-prime-table ::ng-deep .bt-filter-btn button{cursor:pointer;margin-left:1rem}.ng-advanced-prime-table ::ng-deep .p-icon-field-left .p-input-icon:first-of-type{left:-1rem}.ng-advanced-prime-table .table-row{text-align:center;display:flex;gap:1rem;justify-content:center}.ng-advanced-prime-table ::ng-deep span.p-button-icon.pi.pi-file-excel{font-size:1.25em;color:green}.ng-advanced-prime-table ::ng-deep span.p-button-icon.pi.pi-file-pdf{font-size:1.25em;color:red}.ng-advanced-prime-table .table-container{display:flex;flex-direction:column;height:100%;overflow:hidden}.ng-advanced-prime-table ::ng-deep .p-datatable{display:flex;flex-direction:column;width:100%;border-collapse:collapse;table-layout:fixed}.ng-advanced-prime-table ::ng-deep .p-datatable thead{display:table;width:100%;table-layout:fixed;background:#fff;z-index:2}.ng-advanced-prime-table ::ng-deep .p-datatable tfoot{display:table;width:100%;table-layout:fixed;background:#fff;z-index:2}.ng-advanced-prime-table ::ng-deep .p-datatable tbody{display:block;overflow-y:auto;overflow-x:hidden}.ng-advanced-prime-table ::ng-deep .p-datatable tbody tr{display:table;width:100%;table-layout:fixed}.ng-advanced-prime-table .empty-message{text-align:center;padding:2rem;color:#888;font-size:1.2rem}.ng-advanced-prime-table .empty-message i{display:block;font-size:2rem;margin-bottom:.5rem}.ng-advanced-prime-table th{white-space:normal;word-wrap:break-word}\n"] }]
|
313
|
-
}], ctorParameters: () => [], propDecorators: { data: [{
|
314
|
-
type: Input
|
315
|
-
}], columns: [{
|
316
|
-
type: Input
|
317
|
-
}], totalRecords: [{
|
318
|
-
type: Input
|
319
|
-
}], rowsPerPage: [{
|
320
|
-
type: Input
|
321
|
-
}], hasSearchFilter: [{
|
322
|
-
type: Input
|
323
|
-
}], hasExportExcel: [{
|
324
|
-
type: Input
|
325
|
-
}], hasExportPDF: [{
|
326
|
-
type: Input
|
327
|
-
}], hasColumnFilter: [{
|
328
|
-
type: Input
|
329
|
-
}], isPaginated: [{
|
330
|
-
type: Input
|
331
|
-
}], actions: [{
|
332
|
-
type: Input
|
333
|
-
}], isSortable: [{
|
334
|
-
type: Input
|
335
|
-
}], loading: [{
|
336
|
-
type: Input
|
337
|
-
}], maxHeight: [{
|
338
|
-
type: Input
|
339
|
-
}], filter: [{
|
340
|
-
type: Output
|
341
|
-
}], search: [{
|
342
|
-
type: Output
|
343
|
-
}], exportExcelEvent: [{
|
344
|
-
type: Output
|
345
|
-
}], exportPdfEvent: [{
|
346
|
-
type: Output
|
347
|
-
}], dt: [{
|
348
|
-
type: ViewChild,
|
349
|
-
args: ['dt', { static: false }]
|
350
|
-
}] } });
|
351
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctYWR2YW5jZWQtcHJpbWUtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctcHJpbWUtdG9vbHMvc3JjL2xpYi9uZy1hZHZhbmNlZC1wcmltZS10YWJsZS9uZy1hZHZhbmNlZC1wcmltZS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1wcmltZS10b29scy9zcmMvbGliL25nLWFkdmFuY2VkLXByaW1lLXRhYmxlL25nLWFkdmFuY2VkLXByaW1lLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU3QyxPQUFPLEVBQWUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQU94RCxNQUFNLE9BQU8sNkJBQTZCO0lBK0N4QztRQTlDQSxTQUFTO1FBQ0EsU0FBSSxHQUFVLEVBQUUsQ0FBQztRQUNqQixZQUFPLEdBQWtCLEVBQUUsQ0FBQztRQUM1QixpQkFBWSxHQUFXLENBQUMsQ0FBQztRQUN6QixnQkFBVyxHQUFhLEVBQUUsQ0FBQztRQUMzQixvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUNqQyxtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUNoQyxpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5QixvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUNqQyxnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3QixZQUFPLEdBQVUsRUFBRSxDQUFDO1FBQ3BCLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFDNUIsWUFBTyxHQUFZLEtBQUss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c0JBQXRCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBR0ksTUFBTTtzQkFBZixNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFFNkIsRUFBRTtzQkFBckMsU0FBUzt1QkFBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUYWJsZSB9IGZyb20gJ3ByaW1lbmcvdGFibGUnO1xuaW1wb3J0IHsgVGFibGVDb2x1bW4sIFRhYmxlVHlwZUVudW0gfSBmcm9tICcuLi8uLi9wdWJsaWMtYXBpJztcbmltcG9ydCB7IGNhbGN1bGF0ZVRleHRXaWR0aCB9IGZyb20gJy4uL3V0aWxzL3RleHQudXRpbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25nLWFkdmFuY2VkLXByaW1lLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL25nLWFkdmFuY2VkLXByaW1lLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL25nLWFkdmFuY2VkLXByaW1lLXRhYmxlLmNvbXBvbmVudC5jc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBOZ0FkdmFuY2VkUHJpbWVUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8vIElucHV0c1xuICBASW5wdXQoKSBkYXRhOiBhbnlbXSA9IFtdO1xuICBASW5wdXQoKSBjb2x1bW5zOiBUYWJsZUNvbHVtbltdID0gW107XG4gIEBJbnB1dCgpIHRvdGFsUmVjb3JkczogbnVtYmVyID0gMDtcbiAgQElucHV0KCkgcm93c1BlclBhZ2U6IG51bWJlcltdID0gW107XG4gIEBJbnB1dCgpIGhhc1NlYXJjaEZpbHRlcjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBoYXNFeHBvcnRFeGNlbDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBoYXNFeHBvcnRQREY6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaGFzQ29sdW1uRmlsdGVyOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzUGFnaW5hdGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGFjdGlvbnM6IGFueVtdID0gW107XG4gIEBJbnB1dCgpIGlzU29ydGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBtYXhIZWlnaHQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8vIE91dHB1dHM6IEV2ZW50cyBlbWl0dGVkIHRvIHRoZSBwYXJlbnQgY29tcG9uZW50XG4gIEBPdXRwdXQoKSBmaWx0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBzZWFyY2ggPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIGV4cG9ydEV4Y2VsRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBleHBvcnRQZGZFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBAVmlld0NoaWxkKCdkdCcsIHsgc3RhdGljOiBmYWxzZSB9KSBkdCE6IFRhYmxlO1xuXG4gIHNlYXJjaFZhbHVlOiBzdHJpbmcgPSAnJztcblxuICBwcml2YXRlIHZhbGlkQ3VycmVuY3lDb2RlcyA9IFsnVVNEJywgJ0VVUicsICdNQUQnXTtcbiAgaWNvbldpZHRoID0gNzc7XG5cbiAgLy8gQ29tcG9uZW50IHN0YXRlIHByb3BlcnRpZXNcbiAgaXNEZWxldGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNFZGl0OiBib29sZWFuID0gZmFsc2U7XG4gIHJvd3M6IG51bWJlciA9IDA7XG5cbiAgLy8gRGF0YSBtYW5hZ2VtZW50IHByb3BlcnRpZXNcbiAgZGF0YU1hcCA9IG5ldyBNYXAoKTtcbiAgbWFwID0gbmV3IE1hcCgpO1xuICBvcHRpb25FbnRyaWVzID0gbmV3IE1hcDxzdHJpbmcsIGFueVtdPigpO1xuICBvcHRpb25WYWx1ZXM6IGFueVtdID0gW107XG4gIGdsb2JhbEZpbHRlckZpZWxkczogc3RyaW5nW10gPSBbXTtcblxuICAvLyBDUlVEIG9wZXJhdGlvbiBoYW5kbGVyc1xuICBEZWxldGU6ICh2YWx1ZTogYW55KSA9PiB2b2lkID0gKCkgPT4ge307XG4gIGluaXRFZGl0YWJsZVJvdzogKGRhdGE6IGFueSkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICBzYXZlRWRpdGFibGVSb3c6IChkYXRhOiBhbnkpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgY2FuY2VsRWRpdGFibGVSb3c6IChpdGVtOiBhbnkpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gVHJhbnNmb3JtIHRoZSBkYXRlIGZpZWxkcyBiYXNlZCBvbiBjb2x1bW4gbWV0YWRhdGFcbiAgICB0aGlzLmRhdGEgPSB0aGlzLmZvcm1hdGluZ0RhdGVGaWVsZHMoKTtcbiAgICB0aGlzLmdsb2JhbEZpbHRlckZpZWxkcyA9IHRoaXMuY29sdW1uc1xuICAgICAgLmZpbHRlcigoY29sKSA9PiBjb2wuY29kZSAhPT0gdW5kZWZpbmVkICYmIGNvbC5pc0ZpbHRlciAhPT0gZmFsc2UpXG4gICAgICAubWFwKChjb2wpID0+IGNvbC5jb2RlIGFzIHN0cmluZyk7XG4gICAgdGhpcy5pbml0aWFsaXplUGFnaW5hdGlvbigpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZUFjdGlvbnMoKTtcblxuICAgIC8vIFNldCBkZWZhdWx0IHZhbHVlIGZvciBpc1NvcnRhYmxlXG4gICAgdGhpcy5jb2x1bW5zLmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgaWYgKGNvbC50eXBlID09PSBUYWJsZVR5cGVFbnVtLkFDVElPTikge1xuICAgICAgICBjb2wuaXNFZGl0YWJsZSA9IGZhbHNlO1xuICAgICAgICBjb2wuaXNGaWx0ZXIgPSBmYWxzZTtcbiAgICAgICAgY29sLmlzU29ydGFibGUgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbC5pc1NvcnRhYmxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29sLmlzU29ydGFibGUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29sLmlzRWRpdGFibGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb2wuaXNFZGl0YWJsZSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb2wuaXNGaWx0ZXIgIT09IGZhbHNlICYmIGNvbC5jb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5nbG9iYWxGaWx0ZXJGaWVsZHMucHVzaChjb2wuY29kZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghY29sLndpZHRoKSB7XG4gICAgICAgIGNvbC53aWR0aCA9IHRoaXMuY2FsY3VsYXRlQ29sdW1uV2lkdGgoY29sKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBjb2x1bW4gd2lkdGggYmFzZWQgb24gdGV4dCBpbiBoZWFkZXIgYW5kIGRhdGFcbiAgcHJpdmF0ZSBjYWxjdWxhdGVDb2x1bW5XaWR0aChjb2w6IFRhYmxlQ29sdW1uKTogc3RyaW5nIHtcbiAgICBjb25zdCBjYWxjdWxhdGVkV2lkdGggPSBjYWxjdWxhdGVUZXh0V2lkdGgoY29sLCBjb2wudGl0bGUpO1xuICAgIGNvbnN0IHRvdGFsV2lkdGggPSBjYWxjdWxhdGVkV2lkdGggKyB0aGlzLmljb25XaWR0aCArIDIwO1xuICAgIHJldHVybiBgJHt0b3RhbFdpZHRofXB4YDtcbiAgfVxuXG4gIGdldEhlYWRlcldpZHRoKGNvbDogVGFibGVDb2x1bW4pOiBzdHJpbmcge1xuICAgIC8vIFJlbW92ZSAncHgnIGZyb20gY29sLndpZHRoIGFuZCBjb252ZXJ0IGl0IHRvIGEgbnVtYmVyXG4gICAgY29uc3Qgd2lkdGhXaXRob3V0UHggPSBwYXJzZUludChjb2wud2lkdGg/LnJlcGxhY2UoJ3B4JywgJycpIHx8ICcwJywgMTApO1xuXG4gICAgLy8gQWRkIDIwIHRvIHRoZSBjYWxjdWxhdGVkIHdpZHRoXG4gICAgY29uc3QgaGVhZGVyV2lkdGggPSB3aWR0aFdpdGhvdXRQeCArIDIwO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBuZXcgd2lkdGggaW4gJ3B4J1xuICAgIHJldHVybiBgJHtoZWFkZXJXaWR0aH1weGA7XG4gIH1cblxuICAvLyBJbml0aWFsaXphdGlvbiBNZXRob2RzXG4gIHByaXZhdGUgZm9ybWF0aW5nRGF0ZUZpZWxkcygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmRhdGEubWFwKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCB0cmFuc2Zvcm1lZEl0ZW0gPSB7IC4uLml0ZW0gfTtcbiAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNvbHVtbi50eXBlID09PSBUYWJsZVR5cGVFbnVtLkRBVEUgJiZcbiAgICAgICAgICBjb2x1bW4uY29kZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgdHJhbnNmb3JtZWRJdGVtW2NvbHVtbi5jb2RlXSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IGRhdGVWYWx1ZSA9IHRoaXMucGFyc2VEYXRlKHRyYW5zZm9ybWVkSXRlbVtjb2x1bW4uY29kZV0pO1xuICAgICAgICAgIHRyYW5zZm9ybWVkSXRlbVtjb2x1bW4uY29kZV0gPSBkYXRlVmFsdWUgPyBkYXRlVmFsdWUgOiBudWxsO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0cmFuc2Zvcm1lZEl0ZW07XG4gICAgfSk7XG4gIH1cblxuICBjbGVhcih0YWJsZTogVGFibGUpIHtcbiAgICB0YWJsZS5jbGVhcigpO1xuICAgIHRoaXMuc2VhcmNoVmFsdWUgPSAnJztcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VEYXRlKGRhdGVTdHJpbmc6IHN0cmluZyk6IERhdGUgfCBudWxsIHtcbiAgICBjb25zdCBwYXJ0cyA9IGRhdGVTdHJpbmcuc3BsaXQoJy8nKTtcbiAgICBpZiAocGFydHMubGVuZ3RoID09PSAzKSB7XG4gICAgICAvLyBBc3N1bWluZyBkYXRlIGZvcm1hdCBpcyBERC9NTS9ZWVlZXG4gICAgICBjb25zdCBkYXkgPSBwYXJzZUludChwYXJ0c1swXSwgMTApO1xuICAgICAgY29uc3QgbW9udGggPSBwYXJzZUludChwYXJ0c1sxXSwgMTApIC0gMTtcbiAgICAgIGNvbnN0IHllYXIgPSBwYXJzZUludChwYXJ0c1syXSwgMTApO1xuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCBkYXkpO1xuICAgICAgcmV0dXJuIGlzTmFOKGRhdGUuZ2V0VGltZSgpKSA/IG51bGwgOiBkYXRlO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVBhZ2luYXRpb24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNQYWdpbmF0ZWQpIHtcbiAgICAgIC8vIENoZWNrIGlmIHJvd3NQZXJQYWdlIGlzIHVuZGVmaW5lZCBvciBhbiBlbXB0eSBhcnJheVxuICAgICAgaWYgKCF0aGlzLnJvd3NQZXJQYWdlIHx8IHRoaXMucm93c1BlclBhZ2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMucm93c1BlclBhZ2UgPSBbMjAsIDMwLCA0MF07XG4gICAgICB9XG4gICAgICB0aGlzLnJvd3MgPSB0aGlzLnJvd3NQZXJQYWdlWzBdO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUFjdGlvbnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWN0aW9ucykge1xuICAgICAgdGhpcy5hY3Rpb25zLmZvckVhY2goKGFjdGlvbikgPT4ge1xuICAgICAgICBzd2l0Y2ggKGFjdGlvbi5jb2RlKSB7XG4gICAgICAgICAgY2FzZSAnZGVsZXRlJzpcbiAgICAgICAgICAgIHRoaXMuaXNEZWxldGUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5EZWxldGUgPSAodmFsdWU6IGFueSkgPT4gYWN0aW9uLmFjdGlvbih2YWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdlZGl0JzpcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZUVkaXRBY3Rpb25zKGFjdGlvbik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhpcy5pc0RlbGV0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5pc0VkaXQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplRWRpdEFjdGlvbnMoYWN0aW9uOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmlzRWRpdCA9IHRydWU7XG4gICAgdGhpcy5pbml0RWRpdGFibGVSb3cgPSAoZGF0YTogYW55KSA9PiBhY3Rpb24uYWN0aW9uLmluaXQoZGF0YSk7XG4gICAgdGhpcy5zYXZlRWRpdGFibGVSb3cgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICBjb25zdCByZWNvcmQgPSB0aGlzLm1hcC5nZXQoZGF0YS5pZCk7XG4gICAgICBhY3Rpb24uYWN0aW9uLnNhdmUoZGF0YSwgcmVjb3JkKTtcbiAgICAgIHRoaXMuZGF0YU1hcC5jbGVhcigpO1xuICAgIH07XG4gICAgdGhpcy5jYW5jZWxFZGl0YWJsZVJvdyA9IChpdGVtOiBhbnkpID0+IGNvbnNvbGUubG9nKGl0ZW0pO1xuICB9XG5cbiAgb25DaGFuZ2UoZXZlbnQ6IEV2ZW50LCBpZDogbnVtYmVyLCBrZXk6IGFueSkge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIHRoaXMuY2hhbmdlSGFuZGxlcihpZCwga2V5LCB0YXJnZXQudmFsdWUpO1xuICB9XG5cbiAgY2hhbmdlSGFuZGxlcihpZDogbnVtYmVyLCBrZXk6IGFueSwgdmFsdWU6IGFueSkge1xuICAgIGxldCBjb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZCgoaXRlbSkgPT4gaXRlbS5jb2RlID09PSBrZXkpO1xuICAgIGlmICghdGhpcy5tYXAuZ2V0KGlkKSkge1xuICAgICAgaWYgKGNvbHVtbj8udHlwZSA9PT0gVGFibGVUeXBlRW51bS5EQVRFKSB7XG4gICAgICAgIGxldCBkYXRlID0gdGhpcy5wYXJzZURhdGUodmFsdWUpO1xuICAgICAgICB0aGlzLmRhdGFNYXAuc2V0KGtleSwgZGF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRhdGFNYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgICAgdGhpcy5tYXAuc2V0KGlkLCBuZXcgTWFwKHRoaXMuZGF0YU1hcCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgbWFwSXRlbSA9IHRoaXMubWFwLmdldChpZCk7XG4gICAgICBpZiAoY29sdW1uPy50eXBlID09PSBUYWJsZVR5cGVFbnVtLkRBVEUpIHtcbiAgICAgICAgbGV0IGRhdGUgPSB0aGlzLnBhcnNlRGF0ZSh2YWx1ZSk7XG4gICAgICAgIG1hcEl0ZW0uc2V0KGtleSwgZGF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXBJdGVtLnNldChrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRDb2x1bW5GaWx0ZXJUeXBlKGNvbHVtbjogVGFibGVDb2x1bW4pOiBzdHJpbmcge1xuICAgIHN3aXRjaCAoY29sdW1uLnR5cGUpIHtcbiAgICAgIGNhc2UgVGFibGVUeXBlRW51bS5TVFJJTkc6XG4gICAgICAgIHJldHVybiAndGV4dCc7XG4gICAgICBjYXNlIFRhYmxlVHlwZUVudW0uQU1PVU5UOlxuICAgICAgICByZXR1cm4gJ251bWVyaWMnO1xuICAgICAgY2FzZSBUYWJsZVR5cGVFbnVtLk5VTUJFUjpcbiAgICAgICAgcmV0dXJuICdudW1lcmljJztcbiAgICAgIGNhc2UgVGFibGVUeXBlRW51bS5EQVRFOlxuICAgICAgICByZXR1cm4gJ2RhdGUnO1xuICAgICAgY2FzZSBUYWJsZVR5cGVFbnVtLk1VTFRJU0VMRUNUOlxuICAgICAgICByZXR1cm4gJ211bHRpU2VsZWN0JztcbiAgICAgIGNhc2UgVGFibGVUeXBlRW51bS5CT09MRUFOOlxuICAgICAgICByZXR1cm4gJ2Jvb2xlYW4nO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICd0ZXh0JztcbiAgICB9XG4gIH1cblxuICAvLyBTdGF0ZSBDaGVjayBNZXRob2RzXG4gIGlzRWRpdGFibGUoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBsZXQgY29sdW1uID0gdGhpcy5jb2x1bW5zLmZpbmQoKGl0ZW0pID0+IGl0ZW0uY29kZSA9PT0ga2V5KTtcbiAgICByZXR1cm4gY29sdW1uPy5pc0VkaXRhYmxlICE9PSBmYWxzZTtcbiAgfVxuXG4gIGlzTXVsdGlTZWxlY3Qoa2V5OiBhbnkpOiBib29sZWFuIHtcbiAgICBsZXQgY29sdW1uID0gdGhpcy5jb2x1bW5zLmZpbmQoKGl0ZW0pID0+IGl0ZW0uY29kZSA9PT0ga2V5KTtcbiAgICBpZiAoXG4gICAgICBjb2x1bW4/LnR5cGUgPT09IFRhYmxlVHlwZUVudW0uTVVMVElTRUxFQ1QgJiZcbiAgICAgIGNvbHVtbi5vcHRpb25zICYmXG4gICAgICBjb2x1bW4uY29kZSAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICB0aGlzLm9wdGlvbkVudHJpZXMgPSBuZXcgTWFwKFtcbiAgICAgICAgW2NvbHVtbi5jb2RlLCBPYmplY3QudmFsdWVzKGNvbHVtbi5vcHRpb25zKV0sXG4gICAgICBdKTtcbiAgICAgIHRoaXMub3B0aW9uVmFsdWVzID0gdGhpcy5vcHRpb25FbnRyaWVzLmdldChrZXkpIHx8IFtdO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlzRGF0ZVBpY2tlcihrZXk6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmNvbHVtbnMuZmluZCgoaXRlbSkgPT4gaXRlbS5jb2RlID09PSBrZXkpPy50eXBlID09PVxuICAgICAgVGFibGVUeXBlRW51bS5EQVRFXG4gICAgKTtcbiAgfVxuXG4gIC8vIFV0aWxpdHkgTWV0aG9kc1xuICBkYXRlQ29udmVydGVyKHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSkudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1VUycpO1xuICB9XG5cbiAgZ2V0Q3VycmVuY3lTeW1ib2woY29sdW1uOiBUYWJsZUNvbHVtbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGNvbHVtbi50eXBlID09PSBUYWJsZVR5cGVFbnVtLkFNT1VOVCAmJlxuICAgICAgY29sdW1uLmN1cnJlbmN5ICYmXG4gICAgICB0aGlzLmlzVmFsaWRDdXJyZW5jeUNvZGUoY29sdW1uLmN1cnJlbmN5KVxuICAgICAgPyBjb2x1bW4uY3VycmVuY3lcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1ZhbGlkQ3VycmVuY3lDb2RlKGN1cnJlbmN5Q29kZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudmFsaWRDdXJyZW5jeUNvZGVzLmluY2x1ZGVzKGN1cnJlbmN5Q29kZSk7XG4gIH1cblxuICBmaWx0ZXJHbG9iYWwoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgY29uc3QgdmFsdWUgPSB0YXJnZXQudmFsdWUudG9Mb3dlckNhc2UoKTtcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBmaWx0ZXJlZCBkYXRhc2V0XG4gICAgY29uc3QgZmlsdGVyZWREYXRhID0gdGhpcy5kYXRhLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZ2xvYmFsRmlsdGVyRmllbGRzLnNvbWUoKGZpZWxkKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5jb2RlID09PSBmaWVsZCk7XG4gICAgICAgIGlmICghY29sdW1uKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGFuZGxlIGRpZmZlcmVudCBjb2x1bW4gdHlwZXNcbiAgICAgICAgaWYgKGNvbHVtbi50eXBlID09PSBUYWJsZVR5cGVFbnVtLkRBVEUpIHtcbiAgICAgICAgICBjb25zdCBpdGVtRGF0ZSA9IHRoaXMuZm9ybWF0RGF0ZShpdGVtW2ZpZWxkXSk7XG4gICAgICAgICAgcmV0dXJuIGl0ZW1EYXRlICYmIGl0ZW1EYXRlLmluY2x1ZGVzKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBjb2x1bW4udHlwZSA9PT0gVGFibGVUeXBlRW51bS5BTU9VTlQgfHxcbiAgICAgICAgICBjb2x1bW4udHlwZSA9PT0gVGFibGVUeXBlRW51bS5OVU1CRVJcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGl0ZW1bZmllbGRdICYmIGl0ZW1bZmllbGRdLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh2YWx1ZSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBpdGVtW2ZpZWxkXSAmJiBpdGVtW2ZpZWxkXS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModmFsdWUpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHRhYmxlJ3MgdmFsdWVcbiAgICB0aGlzLmR0LnZhbHVlID0gZmlsdGVyZWREYXRhO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXREYXRlKGRhdGU6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKCFkYXRlKSByZXR1cm4gJyc7XG4gICAgaWYgKGRhdGUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAvLyBIYW5kbGUgRGF0ZSBvYmplY3RcbiAgICAgIGNvbnN0IGRheSA9IGRhdGUuZ2V0RGF0ZSgpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgIGNvbnN0IG1vbnRoID0gKGRhdGUuZ2V0TW9udGgoKSArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCkudG9TdHJpbmcoKTtcbiAgICAgIHJldHVybiBgJHtkYXl9LyR7bW9udGh9LyR7eWVhcn1gO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRhdGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBIYW5kbGUgc3RyaW5nIGRhdGVcbiAgICAgIGNvbnN0IHBhcnRzID0gZGF0ZS5zcGxpdCgnLycpO1xuICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgICByZXR1cm4gYCR7cGFydHNbMF19LyR7cGFydHNbMV19LyR7cGFydHNbMl19YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEhhbmRsZSBwYXJ0aWFsIGRhdGVzXG4gICAgICAgIHJldHVybiBkYXRlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBleHBvcnRFeGNlbCgpIHtcbiAgICB0aGlzLmV4cG9ydEV4Y2VsRXZlbnQuZW1pdCgpO1xuICB9XG5cbiAgZXhwb3J0UGRmKCkge1xuICAgIHRoaXMuZXhwb3J0UGRmRXZlbnQuZW1pdCgpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwibmctYWR2YW5jZWQtcHJpbWUtdGFibGUgdGFibGUtY29udGFpbmVyXCI+XG4gIDxwLXRhYmxlXG4gICAgI2R0XG4gICAgW3ZhbHVlXT1cImRhdGFcIlxuICAgIFtsb2FkaW5nXT1cImxvYWRpbmdcIlxuICAgIFtyb3dzXT1cInJvd3NcIlxuICAgIFtwYWdpbmF0b3JdPVwiaXNQYWdpbmF0ZWRcIlxuICAgIFtnbG9iYWxGaWx0ZXJGaWVsZHNdPVwiZ2xvYmFsRmlsdGVyRmllbGRzXCJcbiAgICBbcm93c1BlclBhZ2VPcHRpb25zXT1cInJvd3NQZXJQYWdlXCJcbiAgICBkYXRhS2V5PVwiaWRcIlxuICAgIHN0eWxlQ2xhc3M9XCJwLWRhdGF0YWJsZS1ncmlkbGluZXNcIlxuICAgIHN0eWxlQ2xhc3M9XCJwLWRhdGF0YWJsZS1zdHJpcGVkXCJcbiAgICBlZGl0TW9kZT1cInJvd1wiXG4gICAgW3Njcm9sbGFibGVdPVwidHJ1ZVwiXG4gICAgW3Njcm9sbEhlaWdodF09XCJtYXhIZWlnaHQgIT09IG51bGwgPyBtYXhIZWlnaHQgOiB1bmRlZmluZWRcIlxuICA+XG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImNhcHRpb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4XCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGgzPlRvdGFsOiB7eyB0b3RhbFJlY29yZHMgfX08L2gzPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDwhLS0gQ2xlYXIgZmlsdGVycyAtLT5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cImhhc1NlYXJjaEZpbHRlclwiXG4gICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICBpY29uPVwicGkgcGktZmlsdGVyLXNsYXNoXCJcbiAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0XCJcbiAgICAgICAgICAgIChjbGljayk9XCJjbGVhcihkdClcIlxuICAgICAgICAgICAgdGl0bGU9XCJDbGVhciBmaWx0ZXJzXCJcbiAgICAgICAgICA+PC9idXR0b24+XG5cbiAgICAgICAgICA8IS0tIEV4cG9ydCB0byBFeGNlbCBCdXR0b24gLS0+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJoYXNFeHBvcnRFeGNlbFwiXG4gICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICBpY29uPVwicGkgcGktZmlsZS1leGNlbFwiXG4gICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiZXhwb3J0RXhjZWwoKVwiXG4gICAgICAgICAgICB0aXRsZT1cIkV4cG9ydCB0byBFeGNlbFwiXG4gICAgICAgICAgPjwvYnV0dG9uPlxuXG4gICAgICAgICAgPCEtLSBFeHBvcnQgdG8gUERGIEJ1dHRvbiAtLT5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cImhhc0V4cG9ydFBERlwiXG4gICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICBpY29uPVwicGkgcGktZmlsZS1wZGZcIlxuICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImV4cG9ydFBkZigpXCJcbiAgICAgICAgICAgIHRpdGxlPVwiRXhwb3J0IHRvIFBERlwiXG4gICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1sLWF1dG9cIiAqbmdJZj1cImhhc1NlYXJjaEZpbHRlclwiPlxuICAgICAgICAgIDwhLS0gQWRkIHRoaXMgd3JhcHBlciBkaXYgd2l0aCBtbC1hdXRvIGNsYXNzIC0tPlxuICAgICAgICAgIDxwLWljb25GaWVsZCBpY29uUG9zaXRpb249XCJsZWZ0XCIgY2xhc3M9XCJtbC1hdXRvXCI+XG4gICAgICAgICAgICA8cC1pbnB1dEljb24+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktc2VhcmNoXCI+PC9pPlxuICAgICAgICAgICAgPC9wLWlucHV0SWNvbj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBwSW5wdXRUZXh0XG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWFyY2hWYWx1ZVwiXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJmaWx0ZXJHbG9iYWwoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIGtleXdvcmRcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L3AtaWNvbkZpZWxkPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XG4gICAgICA8dHIgY2xhc3M9XCJzdGlja3ktaGVhZGVyXCI+XG4gICAgICAgIDx0aFxuICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiXG4gICAgICAgICAgW3N0eWxlLndpZHRoXT1cImdldEhlYWRlcldpZHRoKGNvbClcIlxuICAgICAgICAgIFtzdHlsZS5wYWRkaW5nXT1cIicwcHgnXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0lmPVwiaXNTb3J0YWJsZSAmJiBjb2wuaXNTb3J0YWJsZSAhPT0gZmFsc2U7IGVsc2Ugbm9Tb3J0SGVhZGVyXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgcFNvcnRhYmxlQ29sdW1uPVwie3sgY29sLmNvZGUgfX1cIlxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiZ2V0SGVhZGVyV2lkdGgoY29sKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImhlYWRlci1jb250YWluZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImNvbC53aWR0aFwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLnBhZGRpbmddPVwiJzBweCdcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5tYXJnaW5dPVwiJzEwcHgnXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IGNvbC50aXRsZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImljb25zIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cIic3N3B4J1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHAtc29ydEljb24gZmllbGQ9XCJ7eyBjb2wuY29kZSB9fVwiIC8+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLmlzRmlsdGVyICE9PSBmYWxzZVwiPlxuICAgICAgICAgICAgICAgICAgICA8cC1jb2x1bW5GaWx0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbC50eXBlID09PSAnQU1PVU5UJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgZGlzcGxheT1cIm1lbnVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZF09XCJjb2wuY29kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiZ2V0Q29sdW1uRmlsdGVyVHlwZShjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY3VycmVuY3ldPVwiZ2V0Q3VycmVuY3lTeW1ib2woY29sKVwiXG4gICAgICAgICAgICAgICAgICAgID48L3AtY29sdW1uRmlsdGVyPlxuXG4gICAgICAgICAgICAgICAgICAgIDxwLWNvbHVtbkZpbHRlclxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sLnR5cGUgIT09ICdBTU9VTlQnXCJcbiAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5PVwibWVudVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2ZpZWxkXT1cImNvbC5jb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5PVwibWVudVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiZ2V0Q29sdW1uRmlsdGVyVHlwZShjb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdHlwZV09XCJnZXRDb2x1bW5GaWx0ZXJUeXBlKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICBwVGVtcGxhdGU9XCJmaWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0LXZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQtZmlsdGVyQ2FsbGJhY2s9XCJmaWx0ZXJDYWxsYmFja1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdldENvbHVtbkZpbHRlclR5cGUoY29sKSA9PT0gJ2RhdGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1jYWxlbmRhclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlckNhbGxiYWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0ZUZvcm1hdF09XCInZGQvbW0veXknXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3AtY2FsZW5kYXI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBsYXRlPVwiZmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldC12YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0LWZpbHRlckNhbGxiYWNrPVwiZmlsdGVyQ2FsbGJhY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJnZXRDb2x1bW5GaWx0ZXJUeXBlKGNvbCkgPT09ICdtdWx0aVNlbGVjdCdcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLW11bHRpU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImNvbC5maWx0ZXJPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwidmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJDYWxsYmFjaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXldPVwiJ2NoaXAnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImN1c3RvbS1tdWx0aXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9wLW11bHRpU2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDwvcC1jb2x1bW5GaWx0ZXI+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9Tb3J0SGVhZGVyPlxuICAgICAgICAgICAgPHRoPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IGNvbC50aXRsZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLmlzRmlsdGVyICE9PSBmYWxzZVwiPlxuICAgICAgICAgICAgICAgICAgPHAtY29sdW1uRmlsdGVyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sLnR5cGUgPT09ICdBTU9VTlQnXCJcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheT1cIm1lbnVcIlxuICAgICAgICAgICAgICAgICAgICBbZmllbGRdPVwiY29sLmNvZGVcIlxuICAgICAgICAgICAgICAgICAgICBbdHlwZV09XCJnZXRDb2x1bW5GaWx0ZXJUeXBlKGNvbClcIlxuICAgICAgICAgICAgICAgICAgICBbY3VycmVuY3ldPVwiZ2V0Q3VycmVuY3lTeW1ib2woY29sKVwiXG4gICAgICAgICAgICAgICAgICA+PC9wLWNvbHVtbkZpbHRlcj5cblxuICAgICAgICAgICAgICAgICAgPHAtY29sdW1uRmlsdGVyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sLnR5cGUgIT09ICdBTU9VTlQnXCJcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheT1cIm1lbnVcIlxuICAgICAgICAgICAgICAgICAgICBbZmllbGRdPVwiY29sLmNvZGVcIlxuICAgICAgICAgICAgICAgICAgICBbdHlwZV09XCJnZXRDb2x1bW5GaWx0ZXJUeXBlKGNvbClcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgICBwVGVtcGxhdGU9XCJmaWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIGxldC12YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgIGxldC1maWx0ZXJDYWxsYmFjaz1cImZpbHRlckNhbGxiYWNrXCJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImdldENvbHVtbkZpbHRlclR5cGUoY29sKSA9PT0gJ2RhdGUnXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxwLWNhbGVuZGFyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJDYWxsYmFjaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRlRm9ybWF0XT1cIidkZC9tbS95eSdcIlxuICAgICAgICAgICAgICAgICAgICAgID48L3AtY2FsZW5kYXI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgcFRlbXBsYXRlPVwiZmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQtdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICBsZXQtZmlsdGVyQ2FsbGJhY2s9XCJmaWx0ZXJDYWxsYmFja1wiXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJnZXRDb2x1bW5GaWx0ZXJUeXBlKGNvbCkgPT09ICdtdWx0aVNlbGVjdCdcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPHAtbXVsdGlTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImNvbC5maWx0ZXJPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlckNhbGxiYWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXldPVwiJ2NoaXAnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY3VzdG9tLW11bHRpc2VsZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9wLW11bHRpU2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgPC9wLWNvbHVtbkZpbHRlcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvdGg+XG4gICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8IS0tIEVtcHR5IG1lc3NhZ2UgdGVtcGxhdGUgLS0+XG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImVtcHR5LW1lc3NhZ2VcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1pbmZvLWNpcmNsZVwiPjwvaT5cbiAgICAgICAgPHA+Tm8gcmVjb3JkcyBhdmFpbGFibGUgdG8gZGlzcGxheS48L3A+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPG5nLXRlbXBsYXRlXG4gICAgICBwVGVtcGxhdGU9XCJib2R5XCJcbiAgICAgIGxldC1kYXRhXG4gICAgICBsZXQtZWRpdGluZz1cImVkaXRpbmdcIlxuICAgICAgbGV0LXJpPVwicm93SW5kZXhcIlxuICAgID5cbiAgICAgIDwhLS0gUmVuZGVyIGEgdGFibGUgcm93IGFuZCBtYWtlIGl0IGVkaXRhYmxlIGlmIGBpc0VkaXRgIGlzIHRydWUgLS0+XG4gICAgICA8dHIgKm5nSWY9XCIhbG9hZGluZ1wiIFtwRWRpdGFibGVSb3ddPVwiaXNFZGl0ID8gZGF0YSA6IG51bGxcIj5cbiAgICAgICAgPCEtLSBMb29wIHRocm91Z2ggZWFjaCBjb2x1bW4gYW5kIHJlbmRlciBjb3JyZXNwb25kaW5nIHRhYmxlIGNlbGxzIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wuY29kZSAhPT0gdW5kZWZpbmVkXCI+XG4gICAgICAgICAgICA8IS0tIENoZWNrIGlmIHRoZSBkYXRhIGZvciB0aGUgY29sdW1uIGV4aXN0cyAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhW2NvbC5jb2RlXSAhPT0gdW5kZWZpbmVkXCI+XG4gICAgICAgICAgICAgIDwhLS0gUmVuZGVyIGFuIGVkaXRhYmxlIGNlbGwgaWYgdGhlIGNvbHVtbiBpcyBlZGl0YWJsZSAtLT5cbiAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJpc0VkaXRhYmxlKGNvbC5jb2RlKTsgZWxzZSBub3JtYWxURFwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImdldEhlYWRlcldpZHRoKGNvbClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPCEtLSBNdWx0aS1zZWxlY3QgaW5wdXQgZm9yIGNvbHVtbnMgdGhhdCBhcmUgbXVsdGktc2VsZWN0YWJsZSAtLT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNNdWx0aVNlbGVjdChjb2wuY29kZSk7IGVsc2UgZGF0ZVBpY2tlclwiPlxuICAgICAgICAgICAgICAgICAgPHAtY2VsbEVkaXRvcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHAtbXVsdGlTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJkYXRhW2NvbC5jb2RlXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGVdPVwieyB3aWR0aDogJzEwMCUnIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZUhhbmRsZXIoZGF0YS5pZCwgY29sLmNvZGUsICRldmVudClcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJvcHRpb25WYWx1ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgID48L3AtbXVsdGlTZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJvdXRwdXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXVsdGktc2VsZWN0LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcmVjIG9mIGRhdGFbY29sLmNvZGVdXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwLXRhZyBbdmFsdWVdPVwicmVjXCI+PC9wLXRhZz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8IS0tIERhdGUgcGlja2VyIGlucHV0IGZvciBjb2x1bW5zIHRoYXQgcmVxdWlyZSBkYXRlIHNlbGVjdGlvbiAtLT5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RhdGVQaWNrZXI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNEYXRlUGlja2VyKGNvbC5jb2RlKTsgZWxzZSBub3JtYWxJbnB1dFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxwLWNlbGxFZGl0b3I+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1jYWxlbmRhclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5wdXRJZF09XCJkYXRhW2NvbC5jb2RlXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImRhdGFbY29sLmNvZGVdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlSGFuZGxlcihkYXRhLmlkLCBjb2wuY29kZSwgJGV2ZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0ZUZvcm1hdF09XCInZGQvbW0veXknXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3AtY2FsZW5kYXI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXRhW2NvbC5jb2RlXSB8IGN1c3RvbURhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8L3AtY2VsbEVkaXRvcj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgICAgICA8IS0tIE5vcm1hbCB0ZXh0IGlucHV0IGZvciBvdGhlciBjb2x1bW5zIC0tPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9ybWFsSW5wdXQ+XG4gICAgICAgICAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaW5wdXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHBJbnB1dFRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImRhdGFbY29sLmNvZGVdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25DaGFuZ2UoJGV2ZW50LCBkYXRhLmlkLCBjb2wuY29kZSlcIlxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJvdXRwdXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIFVzZSBjdXJyZW5jeSBwaXBlIHRvIGZvcm1hdCB0aGUgb3V0cHV0IGZvciBBTU9VTlQgdHlwZSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbC50eXBlID09PSAnQU1PVU5UJzsgZWxzZSBub3JtYWxPdXRwdXRcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbY29sLmNvZGVdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjdXN0b21DdXJyZW5jeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBnZXRDdXJyZW5jeVN5bWJvbChjb2wpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbC5kZWNpbWFsUGxhY2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbC50aG91c2FuZFNlcGFyYXRvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjb2wuZGVjaW1hbFNlcGFyYXRvclxuICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vcm1hbE91dHB1dD5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRhdGFbY29sLmNvZGVdIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgIDwvcC1jZWxsRWRpdG9yPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvdGQ+XG5cbiAgICAgICAgICAgICAgPCEtLSBSZW5kZXIgYSBub3JtYWwgdGFibGUgY2VsbCBpZiB0aGUgY29sdW1uIGlzIG5vdCBlZGl0YWJsZSAtLT5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub3JtYWxURD5cbiAgICAgICAgICAgICAgICA8dGQgW3N0eWxlLndpZHRoXT1cImdldEhlYWRlcldpZHRoKGNvbClcIj5cbiAgICAgICAgICAgICAgICAgIDwhLS0gVXNlIGN1c3RvbUN1cnJlbmN5IHBpcGUgdG8gZm9ybWF0IHRoZSBvdXRwdXQgZm9yIEFNT1VOVCB0eXBlIHdpdGggb3B0aW9uYWwgZGVjaW1hbCBwbGFjZXMgLS0+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT09ICdBTU9VTlQnOyBlbHNlIG5vcm1hbFRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgIGRhdGFbY29sLmNvZGVdXG4gICAgICAgICAgICAgICAgICAgICAgICB8IGN1c3RvbUN1cnJlbmN5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogZ2V0Q3VycmVuY3lTeW1ib2woY29sKVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbC5kZWNpbWFsUGxhY2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogY29sLnRob3VzYW5kU2VwYXJhdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogY29sLmRlY2ltYWxTZXBhcmF0b3JcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub3JtYWxUZXh0PlxuICAgICAgICAgICAgICAgICAgICB7eyBkYXRhW2NvbC5jb2RlXSB9fVxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gUmVuZGVyIGFjdGlvbiBidXR0b25zIGlmIHRoZXJlIGFyZSBhbnkgYWN0aW9ucyBkZWZpbmVkIC0tPlxuICAgICAgICA8dGQgKm5nSWY9XCJhY3Rpb25zPy5sZW5ndGhcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWJ1dHRvbnMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8IS0tIERlbGV0ZSBidXR0b24gaWYgZGVsZXRpb24gaXMgYWxsb3dlZCAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0RlbGV0ZVwiPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICAgIHBSaXBwbGVcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktdHJhc2hcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJEZWxldGUoZGF0YS5pZClcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0XCJcbiAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tIEVkaXQsIHNhdmUsIGFuZCBjYW5jZWwgYnV0dG9ucyBmb3Igcm93IGVkaXRpbmcgLS0+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgcEluaXRFZGl0YWJsZVJvd1xuICAgICAgICAgICAgICAgICpuZ0lmPVwiIWVkaXRpbmdcIlxuICAgICAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgICAgICBwUmlwcGxlXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLXBlbmNpbFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImluaXRFZGl0YWJsZVJvdyhkYXRhKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHRcIlxuICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAqbmdJZj1cImVkaXRpbmdcIlxuICAgICAgICAgICAgICAgIHBTYXZlRWRpdGFibGVSb3dcbiAgICAgICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICAgICAgcFJpcHBsZVxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1jaGVja1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNhdmVFZGl0YWJsZVJvdyhkYXRhKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHRcIlxuICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAqbmdJZj1cImVkaXRpbmdcIlxuICAgICAgICAgICAgICAgIHBDYW5jZWxFZGl0YWJsZVJvd1xuICAgICAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgICAgICBwUmlwcGxlXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLXRpbWVzXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2FuY2VsRWRpdGFibGVSb3coZGF0YSlcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0XCJcbiAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L3RyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvcC10YWJsZT5cbjwvZGl2PlxuIl19
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../projects/ng-prime-tools/src/lib/ng-advanced-prime-table/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC"}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"ng-advanced-prime-table.module.d.ts","sourceRoot":"","sources":["../../../../projects/ng-prime-tools/src/lib/ng-advanced-prime-table/ng-advanced-prime-table.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAgBA,qBAkBa,0BAA0B;yCAA1B,0BAA0B;0CAA1B,0BAA0B;0CAA1B,0BAA0B;CAAG"}
|
File without changes
|