@sachin9822/reports-lib 0.0.183 → 0.0.185

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/esm2020/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.mjs +2 -2
  2. package/esm2020/lib/components/accounting-report/accounting-report.component.mjs +3 -3
  3. package/esm2020/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.mjs +78 -334
  4. package/esm2020/lib/components/branch-activity-send-report/branch-activity-send-report.component.mjs +94 -355
  5. package/esm2020/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.mjs +67 -99
  6. package/esm2020/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.mjs +213 -0
  7. package/esm2020/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.mjs +618 -0
  8. package/esm2020/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.mjs +40 -43
  9. package/esm2020/lib/models/cancellation-transaction-report/cancellation-transaction.model.mjs +10 -2
  10. package/esm2020/lib/models/revenue-per-transaction-report/revenue-per-transaction.model.mjs +2 -0
  11. package/esm2020/lib/models/statement-of-account-report/statement-of-accounts.model.mjs +2 -0
  12. package/esm2020/lib/reports-lib.module.mjs +9 -1
  13. package/esm2020/lib/services/report.service.mjs +56 -25
  14. package/esm2020/lib/shared/metadata/metadata.component.mjs +4 -4
  15. package/esm2020/lib/shared/search-filter/search-filter.component.mjs +173 -28
  16. package/esm2020/public-api.mjs +5 -1
  17. package/fesm2015/sachin9822-reports-lib.mjs +1454 -993
  18. package/fesm2015/sachin9822-reports-lib.mjs.map +1 -1
  19. package/fesm2020/sachin9822-reports-lib.mjs +1464 -1014
  20. package/fesm2020/sachin9822-reports-lib.mjs.map +1 -1
  21. package/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.d.ts +6 -6
  22. package/lib/components/branch-activity-send-report/branch-activity-send-report.component.d.ts +8 -18
  23. package/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.d.ts +23 -14
  24. package/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.d.ts +50 -0
  25. package/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.d.ts +104 -0
  26. package/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.d.ts +12 -2
  27. package/lib/models/cancellation-transaction-report/cancellation-transaction.model.d.ts +1 -1
  28. package/lib/models/revenue-per-transaction-report/revenue-per-transaction.model.d.ts +33 -0
  29. package/lib/models/statement-of-account-report/statement-of-accounts.model.d.ts +18 -0
  30. package/lib/reports-lib.module.d.ts +13 -11
  31. package/lib/services/report.service.d.ts +19 -10
  32. package/lib/shared/search-filter/search-filter.component.d.ts +6 -0
  33. package/package.json +1 -1
  34. package/public-api.d.ts +4 -0
@@ -0,0 +1,618 @@
1
+ import { Component } from '@angular/core';
2
+ import { Subject } from 'rxjs';
3
+ import { finalize, takeUntil } from 'rxjs/operators';
4
+ import { ComponentLoadingStates } from '../../models/component-loading-states';
5
+ import { formatDate } from '@angular/common';
6
+ import jsPDF from 'jspdf';
7
+ import 'jspdf-autotable';
8
+ import * as ExcelJS from 'exceljs';
9
+ import * as FileSaver from 'file-saver';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "../../services/report.service";
12
+ import * as i2 from "ag-grid-angular";
13
+ import * as i3 from "@angular/common";
14
+ import * as i4 from "../../shared/metadata/metadata.component";
15
+ import * as i5 from "../../shared/loader/loader.component";
16
+ import * as i6 from "../../shared/search-filter/search-filter.component";
17
+ export class StatementOfAccountsReportComponent {
18
+ constructor(reportService) {
19
+ this.reportService = reportService;
20
+ this.ReportName = "Statement of Accounts";
21
+ this.ComponentLoadingState = ComponentLoadingStates;
22
+ this.loadingState = ComponentLoadingStates.Complete;
23
+ this.destroy$ = new Subject();
24
+ this.openingBalAndFunding = [];
25
+ this.sendDetails = [];
26
+ this.receiveDetails = [];
27
+ this.currentDateTime = new Date();
28
+ this.sendPinnedBottomRow = [];
29
+ this.receivePinnedBottomRow = [];
30
+ this.closingBalance = 0;
31
+ this.closingBalanceCurrency = 'USD';
32
+ this.closingBalanceUSDInWords = '';
33
+ this.selectedClientType = '';
34
+ this.showTables = false;
35
+ this.closingBalanceInSettlment = 0;
36
+ this.closingBalanceSettlmentCurrency = '';
37
+ this.closingBalanceSettlmentInWords = '';
38
+ this.closingBalanceSettlmentFormatted = '0.000';
39
+ this.closingBalanceInUsdFormatted = '0.000';
40
+ this.columnDefs = [
41
+ // { headerName: 'ID', field: 'id', width: 100 },
42
+ { headerName: 'Description', field: 'description', flex: 4, tooltipField: 'description', cellClassRules: { 'pinned-total-cell': params => params.node.rowPinned === 'bottom' } },
43
+ { headerName: 'Settlment Ccy', field: 'settlmentCcy', flex: 1, tooltipField: 'settlmentCcy', cellClassRules: { 'pinned-total-cell': params => params.node.rowPinned === 'bottom' } },
44
+ { headerName: 'Amount In Settlment Ccy', field: 'amountInSettlmentCcy', flex: 2.1, cellClass: 'ag-right-aligned-cell', valueFormatter: this.currencyFormatter, tooltipValueGetter: (params) => this.currencyFormatter(params), cellClassRules: { 'pinned-total-cell': params => params.node.rowPinned === 'bottom' } },
45
+ { headerName: 'Amount In USD', field: 'amountInUSD', flex: 2.1, cellClass: 'ag-right-aligned-cell', valueFormatter: this.currencyFormatter, tooltipValueGetter: (params) => this.currencyFormatter(params), cellClassRules: { 'pinned-total-cell': params => params.node.rowPinned === 'bottom' } }
46
+ ];
47
+ this.defaultColDef = {
48
+ sortable: true,
49
+ filter: false,
50
+ resizable: true,
51
+ minwidth: 40,
52
+ wrapHeaderText: true,
53
+ autoHeaderHeight: true,
54
+ suppressSizeToFit: false,
55
+ wrapText: true,
56
+ autoHeight: true
57
+ };
58
+ // Helper arrays
59
+ this.ones = ["Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"];
60
+ this.teens = ["Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen"];
61
+ this.tens = ["", "", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"];
62
+ }
63
+ async ngOnInit() {
64
+ this.logoBase64 = await this.loadImageAsBase64('assets/reports-lib/assets/images/XMLogo.png');
65
+ }
66
+ currencyFormatter(params) {
67
+ if (params.value == null)
68
+ return '0.000';
69
+ const num = Number(params.value);
70
+ return num.toFixed(3); // rounds to 3 decimals
71
+ }
72
+ async handleSearch(criteria) {
73
+ const modal = criteria.modal;
74
+ const payload = {
75
+ businessPartnerID: Number(modal.client),
76
+ fromDate: new Date(modal.fromDate).toISOString(),
77
+ toDate: new Date(modal.toDate).toISOString(),
78
+ clientType: criteria.clientType
79
+ };
80
+ this.user = criteria.sysUserID;
81
+ this.metaDataOne = {
82
+ 'Report User': this.user,
83
+ 'Report Time': formatDate(this.currentDateTime, 'dd/MM/yyyy hh:mm a', 'en-US'),
84
+ 'Client': criteria.clientName
85
+ };
86
+ console.log(criteria.clientName);
87
+ this.loadingState = ComponentLoadingStates.Loading;
88
+ this.errorMessage = '';
89
+ this.showTables = false;
90
+ this.selectedClientType = criteria.clientType;
91
+ this.reportService.getStatementOfAccount(payload)
92
+ .pipe(finalize(() => {
93
+ this.loadingState = ComponentLoadingStates.Complete;
94
+ this.hasSearched = true;
95
+ this.showTables = true;
96
+ }), takeUntil(this.destroy$))
97
+ .subscribe({
98
+ next: (data) => {
99
+ console.log(data);
100
+ this.openingBalAndFunding = data.openingBalAndFunding ?? [];
101
+ this.sendDetails = data.sendDetails ?? [];
102
+ this.receiveDetails = data.receiveDetails ?? [];
103
+ // add pinned totals
104
+ if (this.selectedClientType == "SendClient") {
105
+ this.sendPinnedBottomRow = [this.buildTotalRow(this.sendDetails)];
106
+ this.receivePinnedBottomRow = [];
107
+ }
108
+ else if (this.selectedClientType == "ReceiveClient") {
109
+ this.receivePinnedBottomRow = [this.buildTotalRow(this.receiveDetails)];
110
+ this.sendPinnedBottomRow = [];
111
+ }
112
+ else if (this.selectedClientType === "Both") {
113
+ this.sendPinnedBottomRow = [this.buildTotalRow(this.sendDetails)];
114
+ this.receivePinnedBottomRow = [this.buildTotalRow(this.receiveDetails)];
115
+ }
116
+ else {
117
+ this.sendPinnedBottomRow = [];
118
+ this.receivePinnedBottomRow = [];
119
+ }
120
+ this.calculateClosingBalance();
121
+ this.noDataFromApi =
122
+ this.openingBalAndFunding.length === 0 &&
123
+ this.sendDetails.length === 0 &&
124
+ (!this.receiveDetails || this.receiveDetails.length === 0);
125
+ },
126
+ error: (err) => {
127
+ console.error('Error fetching Statement of Accounts:', err);
128
+ this.errorMessage = 'Failed to load Statement of Accounts';
129
+ this.openingBalAndFunding = [];
130
+ this.sendDetails = [];
131
+ this.receiveDetails = [];
132
+ this.loadingState = ComponentLoadingStates.Error;
133
+ this.showTables = false;
134
+ }
135
+ });
136
+ }
137
+ buildTotalRow(rows) {
138
+ const totalSettle = (rows || []).reduce((sum, r) => sum + (Number(r.amountInSettlmentCcy) || 0), 0);
139
+ const totalUsd = (rows || []).reduce((sum, r) => sum + (Number(r.amountInUSD) || 0), 0);
140
+ return {
141
+ id: null,
142
+ description: 'Total',
143
+ settlmentCcy: '',
144
+ amountInSettlmentCcy: Number(totalSettle.toFixed(3)),
145
+ amountInUSD: Number(totalUsd.toFixed(3))
146
+ };
147
+ }
148
+ onOpeningGridReady(params) {
149
+ this.openingGridApi = params.api;
150
+ }
151
+ onSendGridReady(params) {
152
+ this.sendGridApi = params.api;
153
+ }
154
+ onReceiveGridReady(params) {
155
+ this.receiveGridApi = params.api;
156
+ }
157
+ filter(text) {
158
+ this.searchText = text;
159
+ if (this.openingGridApi) {
160
+ this.openingGridApi.setQuickFilter(this.searchText);
161
+ }
162
+ if (this.sendGridApi) {
163
+ this.sendGridApi.setQuickFilter(this.searchText);
164
+ }
165
+ if (this.receiveGridApi) {
166
+ this.receiveGridApi.setQuickFilter(this.searchText);
167
+ }
168
+ }
169
+ calculateClosingBalance() {
170
+ // USD totals (existing logic)
171
+ const openingBalTotalUsd = (this.openingBalAndFunding || []).reduce((sum, r) => sum + (Number(r.amountInUSD) || 0), 0);
172
+ const sendTotalUsd = (this.sendDetails || []).reduce((sum, r) => sum + (Number(r.amountInUSD) || 0), 0);
173
+ const receiveTotalUsd = (this.receiveDetails || []).reduce((sum, r) => sum + (Number(r.amountInUSD) || 0), 0);
174
+ const rawClosingUsd = openingBalTotalUsd + sendTotalUsd + receiveTotalUsd;
175
+ this.closingBalance = Number(rawClosingUsd.toFixed(3)); // numeric USD
176
+ // Settlement currency totals (new)
177
+ const openingSettle = (this.openingBalAndFunding || []).reduce((sum, r) => sum + (Number(r.amountInSettlmentCcy) || 0), 0);
178
+ const sendSettle = (this.sendDetails || []).reduce((sum, r) => sum + (Number(r.amountInSettlmentCcy) || 0), 0);
179
+ const receiveSettle = (this.receiveDetails || []).reduce((sum, r) => sum + (Number(r.amountInSettlmentCcy) || 0), 0);
180
+ const rawClosingSettle = openingSettle + sendSettle + receiveSettle;
181
+ this.closingBalanceInSettlment = Number(rawClosingSettle.toFixed(3));
182
+ // pick a settlement currency to display (first non-empty)
183
+ this.closingBalanceSettlmentCurrency = this.getFirstSettlementCurrency();
184
+ // formatted strings (no-thousand-comma, 3 decimals)
185
+ this.closingBalanceInUsdFormatted = this.formatNoComma(this.closingBalance);
186
+ this.closingBalanceSettlmentFormatted = this.formatNoComma(this.closingBalanceInSettlment);
187
+ this.closingBalanceUSDInWords = this.numberToWords(this.closingBalance);
188
+ this.closingBalanceSettlmentInWords =
189
+ this.closingBalanceInSettlment !== null &&
190
+ this.closingBalanceInSettlment !== undefined &&
191
+ !isNaN(Number(this.closingBalanceInSettlment))
192
+ ? this.numberToWords(this.closingBalanceInSettlment)
193
+ : '';
194
+ }
195
+ formatNoComma(value) {
196
+ if (value === null || value === undefined || isNaN(Number(value)))
197
+ return '0.000';
198
+ const num = Number(value);
199
+ const truncated = Math.trunc(num * 1000) / 1000;
200
+ return truncated.toFixed(3);
201
+ }
202
+ getFirstSettlementCurrency() {
203
+ const tryGet = (arr) => {
204
+ if (!arr || arr.length === 0)
205
+ return '';
206
+ for (const r of arr) {
207
+ if (r && r.settlmentCcy)
208
+ return r.settlmentCcy;
209
+ }
210
+ return '';
211
+ };
212
+ return tryGet(this.openingBalAndFunding) || tryGet(this.sendDetails) || tryGet(this.receiveDetails) || '';
213
+ }
214
+ numberToWords(num) {
215
+ if (num === 0)
216
+ return "Zero Point Zero Zero Zero Only";
217
+ let result = "";
218
+ // Handle negative numbers
219
+ if (num < 0) {
220
+ result = "Negative ";
221
+ num = Math.abs(num);
222
+ }
223
+ // Split integer and decimal parts
224
+ const integerPart = Math.floor(num);
225
+ const decimalPart = Math.round((num - integerPart) * 1000); // up to 3 decimal places
226
+ result += this.convertNumber(integerPart);
227
+ if (decimalPart > 0) {
228
+ result += " Point";
229
+ const decimalStr = decimalPart.toString().padStart(3, "0"); // keep 3 digits
230
+ for (const digit of decimalStr) {
231
+ result += " " + this.ones[+digit];
232
+ }
233
+ }
234
+ return result + " Only";
235
+ }
236
+ // Convert whole numbers (Indian/International system)
237
+ convertNumber(num) {
238
+ if (num === 0)
239
+ return "";
240
+ if (num < 10)
241
+ return this.ones[num];
242
+ if (num < 20)
243
+ return this.teens[num - 10];
244
+ if (num < 100)
245
+ return this.tens[Math.floor(num / 10)] + (num % 10 !== 0 ? " " + this.ones[num % 10] : "");
246
+ if (num < 1000)
247
+ return this.convertNumber(Math.floor(num / 100)) + " Hundred" + (num % 100 !== 0 ? " " + this.convertNumber(num % 100) : "");
248
+ if (num < 1000000)
249
+ return this.convertNumber(Math.floor(num / 1000)) + " Thousand" + (num % 1000 !== 0 ? " " + this.convertNumber(num % 1000) : "");
250
+ if (num < 1000000000)
251
+ return this.convertNumber(Math.floor(num / 1000000)) + " Million" + (num % 1000000 !== 0 ? " " + this.convertNumber(num % 1000000) : "");
252
+ return this.convertNumber(Math.floor(num / 1000000000)) + " Billion" + (num % 1000000000 !== 0 ? " " + this.convertNumber(num % 1000000000) : "");
253
+ }
254
+ onExportChange(value) {
255
+ this.selectedExportOption = value;
256
+ }
257
+ handleExport(option) {
258
+ this.selectedExportOption = option;
259
+ switch ((this.selectedExportOption || '').toLowerCase()) {
260
+ case 'pdf':
261
+ this.exportToPDF();
262
+ break;
263
+ case 'excel':
264
+ this.exportToExcel();
265
+ break;
266
+ case 'csv':
267
+ this.exportToCSV();
268
+ break;
269
+ default: console.warn('Unknown export type:', this.selectedExportOption);
270
+ }
271
+ }
272
+ exportToPDF() {
273
+ const sections = this.getVisibleGrids()
274
+ .map(s => {
275
+ const data = this.getDisplayedData(s.api);
276
+ const headers = this.getHeaders();
277
+ let rows = this.buildRows(data);
278
+ if (s.title === 'Send Details' && this.sendPinnedBottomRow?.length) {
279
+ rows = rows.concat(this.buildRows(this.sendPinnedBottomRow));
280
+ }
281
+ if (s.title === 'Receive Details' && this.receivePinnedBottomRow?.length) {
282
+ rows = rows.concat(this.buildRows(this.receivePinnedBottomRow));
283
+ }
284
+ return rows.length ? { title: s.title, headers, rows } : null;
285
+ })
286
+ .filter(Boolean);
287
+ if (!sections.length)
288
+ return;
289
+ const doc = new jsPDF({ orientation: 'landscape', unit: 'mm', format: 'a4' });
290
+ if (this.logoBase64) {
291
+ doc.addImage(this.logoBase64, 'PNG', 15, 10, 38, 18);
292
+ }
293
+ const pageWidth = doc.internal.pageSize.getWidth();
294
+ const pageHeight = doc.internal.pageSize.getHeight();
295
+ doc.setFont('helvetica', 'bold');
296
+ doc.setFontSize(15);
297
+ doc.text(this.ReportName, pageWidth / 2, 18, { align: 'center' });
298
+ let y = 34;
299
+ doc.setFontSize(10);
300
+ Object.entries(this.metaDataOne || {}).forEach(([k, v]) => {
301
+ doc.setFont('helvetica', 'bold');
302
+ doc.text(`${k}: `, 15, y);
303
+ const w = doc.getTextWidth(`${k}: `);
304
+ doc.setFont('helvetica', 'normal');
305
+ doc.text(String(v ?? ''), 15 + w, y);
306
+ y += 6;
307
+ });
308
+ const HEAD = this.getHeaders();
309
+ const margin = { left: 15, right: 15 };
310
+ const avail = pageWidth - margin.left - margin.right;
311
+ const weights = [4, 1, 2, 2];
312
+ const sum = weights.reduce((a, b) => a + b, 0);
313
+ const widths = weights.map(w => (w / sum) * avail);
314
+ const sharedColumnStyles = {
315
+ 0: { cellWidth: widths[0] },
316
+ 1: { cellWidth: widths[1] },
317
+ 2: { cellWidth: widths[2], halign: 'right' },
318
+ 3: { cellWidth: widths[3], halign: 'right' }
319
+ };
320
+ const titleGapAboveFirst = 0;
321
+ const titleGapAboveDefault = 4;
322
+ const titleGapAboveBig = 6;
323
+ const titleToTableGap = 2;
324
+ const topStartY = 20;
325
+ const bottomReserve = 20;
326
+ sections.forEach((s, idx) => {
327
+ const isFirst = idx === 0;
328
+ const isSendOrReceive = s.title === 'Send Details' || s.title === 'Receive Details';
329
+ const preTitleGap = isFirst ? 0 : (isSendOrReceive ? titleGapAboveBig : titleGapAboveDefault);
330
+ if (y + preTitleGap + titleToTableGap > pageHeight - bottomReserve) {
331
+ doc.addPage();
332
+ y = topStartY;
333
+ }
334
+ else {
335
+ y += preTitleGap;
336
+ }
337
+ doc.setFont('helvetica', 'bold');
338
+ doc.setFontSize(11);
339
+ doc.text(s.title, margin.left, y);
340
+ const startYForTable = y + (isFirst ? 0 : titleToTableGap);
341
+ doc.autoTable({
342
+ head: [HEAD],
343
+ body: s.rows,
344
+ startY: startYForTable,
345
+ theme: 'grid',
346
+ margin,
347
+ tableWidth: avail,
348
+ columnStyles: sharedColumnStyles,
349
+ headStyles: { fillColor: [220, 220, 220], textColor: 0, fontStyle: 'bold', fontSize: 9, halign: 'center' },
350
+ bodyStyles: { fontSize: 8 },
351
+ styles: { cellPadding: 2, overflow: 'linebreak', minCellHeight: 6 }
352
+ });
353
+ y = doc.lastAutoTable.finalY;
354
+ });
355
+ if (y + 30 > pageHeight - bottomReserve) {
356
+ doc.addPage();
357
+ y = topStartY;
358
+ }
359
+ const closingBody = [
360
+ [
361
+ { content: 'Closing Balance', colSpan: 2, styles: { halign: 'left', fontStyle: 'bold' } },
362
+ { content: Number(this.closingBalanceInSettlment || 0).toFixed(3), styles: { halign: 'right' } },
363
+ { content: Number(this.closingBalance || 0).toFixed(3), styles: { halign: 'right' } }
364
+ ],
365
+ [
366
+ { content: `${this.closingBalanceSettlmentCurrency || ''} - ${this.closingBalanceSettlmentInWords || ''}`, colSpan: 4, styles: { halign: 'left' } }
367
+ ],
368
+ [
369
+ { content: `${this.closingBalanceCurrency || ''} - ${this.closingBalanceUSDInWords || ''}`, colSpan: 4, styles: { halign: 'left' } }
370
+ ]
371
+ ];
372
+ doc.autoTable({
373
+ body: closingBody,
374
+ startY: y,
375
+ theme: 'grid',
376
+ margin,
377
+ tableWidth: avail,
378
+ columnStyles: sharedColumnStyles,
379
+ styles: { cellPadding: 2, fontSize: 9 }
380
+ });
381
+ doc.save('Statement_of_Accounts.pdf');
382
+ }
383
+ exportToExcel() {
384
+ const sections = this.getVisibleGrids()
385
+ .map(s => {
386
+ const data = this.getDisplayedData(s.api);
387
+ const headers = this.getHeaders();
388
+ let rows = this.buildRows(data);
389
+ if (s.title === 'Send Details' && this.sendPinnedBottomRow?.length) {
390
+ rows = rows.concat(this.buildRows(this.sendPinnedBottomRow));
391
+ }
392
+ if (s.title === 'Receive Details' && this.receivePinnedBottomRow?.length) {
393
+ rows = rows.concat(this.buildRows(this.receivePinnedBottomRow));
394
+ }
395
+ return rows.length ? { title: s.title, headers, rows } : null;
396
+ })
397
+ .filter(Boolean);
398
+ if (!sections.length)
399
+ return;
400
+ const wb = new ExcelJS.Workbook();
401
+ const ws = wb.addWorksheet('Statement of Accounts');
402
+ let r = 1;
403
+ if (this.logoBase64) {
404
+ const imgId = wb.addImage({ base64: this.logoBase64, extension: 'png' });
405
+ ws.addImage(imgId, { tl: { col: 0, row: 0 }, ext: { width: 145, height: 66 }, editAs: 'oneCell' });
406
+ }
407
+ ws.getRow(r).getCell(2).value = this.ReportName;
408
+ ws.getRow(r).getCell(2).font = { bold: true, size: 16 };
409
+ r += 3;
410
+ Object.entries(this.metaDataOne || {}).forEach(([k, v]) => {
411
+ ws.getRow(r++).getCell(1).value = `${k}: ${v ?? ''}`;
412
+ });
413
+ const writeSection = (sec) => {
414
+ ws.getRow(r++).getCell(1).value = sec.title;
415
+ const headerRow = ws.getRow(r++);
416
+ sec.headers.forEach((h, i) => {
417
+ const c = headerRow.getCell(i + 1);
418
+ c.value = h;
419
+ c.font = { bold: true };
420
+ c.alignment = { vertical: 'middle', horizontal: 'center' };
421
+ c.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: 'D9D9D9' } };
422
+ c.border = { top: { style: 'thin' }, bottom: { style: 'thin' }, left: { style: 'thin' }, right: { style: 'thin' } };
423
+ });
424
+ const dataStart = r;
425
+ sec.rows.forEach(rowData => {
426
+ const row = ws.getRow(r++);
427
+ rowData.forEach((v, i) => {
428
+ const c = row.getCell(i + 1);
429
+ if (sec.headers[i] === 'Amount In Settlment Ccy' || sec.headers[i] === 'Amount In USD') {
430
+ const num = typeof v === 'string' ? Number(v.replace(/[, ]+/g, '')) : Number(v);
431
+ c.value = isNaN(num) ? (v ?? '') : num;
432
+ c.alignment = { horizontal: 'right' };
433
+ if (!isNaN(num))
434
+ c.numFmt = '0.000';
435
+ }
436
+ else {
437
+ c.value = v ?? '';
438
+ }
439
+ c.border = { top: { style: 'thin' }, bottom: { style: 'thin' }, left: { style: 'thin' }, right: { style: 'thin' } };
440
+ });
441
+ });
442
+ for (let col = 1; col <= sec.headers.length; col++) {
443
+ let max = (sec.headers[col - 1] || '').toString().length;
444
+ for (let rr = dataStart - 1; rr < r; rr++) {
445
+ const val = (ws.getRow(rr).getCell(col).value ?? '').toString();
446
+ if (val)
447
+ max = Math.max(max, val.length + 2);
448
+ }
449
+ ws.getColumn(col).width = Math.min(Math.max(max, 8), 60);
450
+ }
451
+ };
452
+ sections.forEach((sec, idx) => {
453
+ writeSection(sec);
454
+ if (idx < sections.length - 1) {
455
+ r++;
456
+ }
457
+ });
458
+ const totalCols = sections.length
459
+ ? Math.max(...sections.map(s => s.headers.length))
460
+ : this.columnDefs.length;
461
+ const cols = Math.max(totalCols, 4);
462
+ const labelColsEnd = 2;
463
+ const settleCol = 3;
464
+ const usdCol = 4;
465
+ const row1 = ws.getRow(r++);
466
+ ws.mergeCells(row1.number, 1, row1.number, labelColsEnd);
467
+ row1.getCell(1).value = 'Closing Balance';
468
+ row1.getCell(1).font = { bold: true };
469
+ row1.getCell(1).alignment = { horizontal: 'left', vertical: 'middle' };
470
+ const settleValue = Number(this.closingBalanceInSettlment ?? 0);
471
+ const usdValue = Number(this.closingBalance ?? 0);
472
+ const settleCell = row1.getCell(settleCol);
473
+ settleCell.value = isNaN(settleValue) ? '' : settleValue;
474
+ settleCell.alignment = { horizontal: 'right' };
475
+ if (!isNaN(settleValue))
476
+ settleCell.numFmt = '0.000';
477
+ const usdCell = row1.getCell(usdCol);
478
+ usdCell.value = isNaN(usdValue) ? '' : usdValue;
479
+ usdCell.alignment = { horizontal: 'right' };
480
+ if (!isNaN(usdValue))
481
+ usdCell.numFmt = '0.000';
482
+ for (let c = 1; c <= cols; c++) {
483
+ row1.getCell(c).border = {
484
+ top: { style: 'thin' },
485
+ bottom: { style: 'thin' },
486
+ left: { style: 'thin' },
487
+ right: { style: 'thin' }
488
+ };
489
+ }
490
+ const row2 = ws.getRow(r++);
491
+ ws.mergeCells(row2.number, 1, row2.number, cols);
492
+ row2.getCell(1).value = `${this.closingBalanceSettlmentCurrency || ''} - ${this.closingBalanceSettlmentInWords || ''}`;
493
+ row2.getCell(1).alignment = { horizontal: 'left', vertical: 'middle' };
494
+ row2.getCell(1).font = { italic: false };
495
+ for (let c = 1; c <= cols; c++) {
496
+ const edge = { top: { style: 'thin' }, bottom: { style: 'thin' } };
497
+ if (c === 1)
498
+ edge.left = { style: 'thin' };
499
+ if (c === cols)
500
+ edge.right = { style: 'thin' };
501
+ row2.getCell(c).border = edge;
502
+ }
503
+ const row3 = ws.getRow(r++);
504
+ ws.mergeCells(row3.number, 1, row3.number, cols);
505
+ row3.getCell(1).value = `${this.closingBalanceCurrency || ''} - ${this.closingBalanceUSDInWords || ''}`;
506
+ row3.getCell(1).alignment = { horizontal: 'left', vertical: 'middle' };
507
+ for (let c = 1; c <= cols; c++) {
508
+ const edge = { top: { style: 'thin' }, bottom: { style: 'thin' } };
509
+ if (c === 1)
510
+ edge.left = { style: 'thin' };
511
+ if (c === cols)
512
+ edge.right = { style: 'thin' };
513
+ row3.getCell(c).border = edge;
514
+ }
515
+ wb.xlsx.writeBuffer().then(buf => {
516
+ FileSaver.saveAs(new Blob([buf], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }), 'Statement_of_Accounts.xlsx');
517
+ });
518
+ }
519
+ exportToCSV() {
520
+ const sections = this.getVisibleGrids()
521
+ .map(s => {
522
+ const data = this.getDisplayedData(s.api);
523
+ let rows = this.buildRows(data);
524
+ if (s.title === 'Send Details' && this.sendPinnedBottomRow?.length) {
525
+ rows = rows.concat(this.buildRows(this.sendPinnedBottomRow));
526
+ }
527
+ if (s.title === 'Receive Details' && this.receivePinnedBottomRow?.length) {
528
+ rows = rows.concat(this.buildRows(this.receivePinnedBottomRow));
529
+ }
530
+ return rows.length ? { title: s.title, headers: this.getHeaders(), rows } : null;
531
+ })
532
+ .filter(Boolean);
533
+ if (!sections.length)
534
+ return;
535
+ const lines = [];
536
+ lines.push(this.ReportName);
537
+ Object.entries(this.metaDataOne || {}).forEach(([k, v]) => lines.push(`${k}: ${v ?? ''}`));
538
+ sections.forEach((sec, idx) => {
539
+ lines.push(sec.title);
540
+ lines.push(sec.headers.join(','));
541
+ sec.rows.forEach(r => lines.push(r.map(v => `"${v ?? ''}"`).join(',')));
542
+ if (idx < sections.length - 1) {
543
+ lines.push('');
544
+ }
545
+ });
546
+ lines.push(`"Closing Balance",,"${Number(this.closingBalanceInSettlment || 0).toFixed(3)}","${Number(this.closingBalance || 0).toFixed(3)}"`);
547
+ lines.push(`"${this.closingBalanceSettlmentCurrency || ''} - ${this.closingBalanceSettlmentInWords || ''}"`);
548
+ lines.push(`"${this.closingBalanceCurrency || ''} - ${this.closingBalanceUSDInWords || ''}"`);
549
+ const csv = lines.join('\n');
550
+ FileSaver.saveAs(new Blob([csv], { type: 'text/csv;charset=utf-8' }), 'Statement_of_Accounts.csv');
551
+ }
552
+ loadImageAsBase64(src) {
553
+ return new Promise((resolve, reject) => {
554
+ const img = new Image();
555
+ img.crossOrigin = 'anonymous';
556
+ img.src = src;
557
+ img.onload = () => {
558
+ const canvas = document.createElement('canvas');
559
+ canvas.width = img.width;
560
+ canvas.height = img.height;
561
+ const ctx = canvas.getContext('2d');
562
+ if (!ctx)
563
+ return reject('Canvas context failed');
564
+ ctx.drawImage(img, 0, 0);
565
+ resolve(canvas.toDataURL('image/png'));
566
+ };
567
+ img.onerror = () => reject('Failed to load image: ' + src);
568
+ });
569
+ }
570
+ getDisplayedData(api) {
571
+ if (!api)
572
+ return [];
573
+ const rows = [];
574
+ const count = api.getDisplayedRowCount();
575
+ for (let i = 0; i < count; i++) {
576
+ const node = api.getDisplayedRowAtIndex(i);
577
+ if (node && !node.group && !node.rowPinned)
578
+ rows.push(node.data);
579
+ }
580
+ return rows;
581
+ }
582
+ getHeaders() {
583
+ return this.columnDefs.map(c => c.headerName || c.field);
584
+ }
585
+ format3(n) {
586
+ if (n == null || n === '')
587
+ return '';
588
+ const num = Number(n);
589
+ return num.toFixed(3);
590
+ }
591
+ buildRows(data) {
592
+ return data.map(row => this.columnDefs.map(col => {
593
+ const f = col.field;
594
+ if (f === 'amountInSettlmentCcy' || f === 'amountInUSD') {
595
+ return this.format3(row[f]);
596
+ }
597
+ return row[f] ?? '';
598
+ }));
599
+ }
600
+ getVisibleGrids() {
601
+ const out = [];
602
+ out.push({ title: '', api: this.openingGridApi });
603
+ if (this.selectedClientType === 'SendClient' || this.selectedClientType === 'Both') {
604
+ out.push({ title: 'Send Details', api: this.sendGridApi });
605
+ }
606
+ if (this.selectedClientType === 'ReceiveClient' || this.selectedClientType === 'Both') {
607
+ out.push({ title: 'Receive Details', api: this.receiveGridApi });
608
+ }
609
+ return out;
610
+ }
611
+ }
612
+ StatementOfAccountsReportComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: StatementOfAccountsReportComponent, deps: [{ token: i1.ReportService }], target: i0.ɵɵFactoryTarget.Component });
613
+ StatementOfAccountsReportComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: StatementOfAccountsReportComponent, selector: "lib-statement-of-accounts-report", ngImport: i0, template: "<lib-search-filter \r\n [ReportName]=\"ReportName\" \r\n (searchClicked)=\"handleSearch($event)\">\r\n</lib-search-filter>\r\n\r\n<app-loader *ngIf=\"loadingState === ComponentLoadingState.Loading\"></app-loader>\r\n<span *ngIf=\"loadingState === ComponentLoadingState.Error\">{{ errorMessage }}</span>\r\n<div *ngIf=\"showTables\">\r\n<lib-metadata \r\n [reportName]=\"ReportName\" \r\n [showmetaDataOne]=\"true\" \r\n [showmetaDataTwo]=\"false\" \r\n [metaDataOne]=\"metaDataOne\"\r\n [metaDataTwo]=\"\" \r\n (exportEvent)=\"handleExport($event)\" \r\n (searchEvent)=\"filter($event)\">\r\n </lib-metadata>\r\n\r\n<ag-grid-angular\r\n class=\"ag-theme-alpine transaction-grid\"\r\n [rowData]=\"openingBalAndFunding\"\r\n [columnDefs]=\"columnDefs\"\r\n [pinnedBottomRowData]=\"[]\"\r\n [headerHeight]=\"32\" \r\n [defaultColDef]=\"defaultColDef\"\r\n [rowHeight]=\"28\"\r\n (gridReady)=\"onOpeningGridReady($event)\"\r\n style=\"width: 100%; height: 91px;\">\r\n</ag-grid-angular>\r\n\r\n<div *ngIf=\"(selectedClientType === 'SendClient' || selectedClientType === 'Both')\">\r\n<h3 class=\"details-table\"><span style=\"margin-left: 3px;\">Send Details</span></h3>\r\n<ag-grid-angular\r\n class=\"ag-theme-alpine transaction-grid\"\r\n [rowData]=\"sendDetails\"\r\n [columnDefs]=\"columnDefs\"\r\n [defaultColDef]=\"defaultColDef\"\r\n [rowHeight]=\"28\"\r\n [headerHeight]=\"32\" \r\n [pinnedBottomRowData]=\"sendPinnedBottomRow\"\r\n (gridReady)=\"onSendGridReady($event)\" \r\n style=\"width: 100%; height: 203px;\">\r\n</ag-grid-angular>\r\n</div>\r\n\r\n<div *ngIf=\"(selectedClientType === 'ReceiveClient' || selectedClientType === 'Both')\">\r\n<h3 class=\"details-table\"><span style=\"margin-left: 3px;\">Receive Details</span></h3>\r\n<ag-grid-angular\r\n class=\"ag-theme-alpine transaction-grid\"\r\n [rowData]=\"receiveDetails\"\r\n [columnDefs]=\"columnDefs\"\r\n [defaultColDef]=\"defaultColDef\"\r\n [rowHeight]=\"28\"\r\n [headerHeight]=\"32\" \r\n [pinnedBottomRowData]=\"receivePinnedBottomRow\"\r\n (gridReady)=\"onReceiveGridReady($event)\" \r\n style=\"width: 100%; height: 203px;\">\r\n</ag-grid-angular>\r\n</div>\r\n\r\n\r\n<!-- Closing balance row -->\r\n<div class=\"closing-balance-row\">\r\n <div class=\"label\" title=\"Closing Balance\">\r\n Closing Balance\r\n </div>\r\n\r\n <div class=\"settlement\" \r\n [title]=\"closingBalanceSettlmentFormatted\">\r\n {{ closingBalanceSettlmentFormatted }}\r\n </div>\r\n\r\n <div class=\"value\" [title]=\"closingBalanceInUsdFormatted\">\r\n {{ closingBalanceInUsdFormatted }}\r\n </div>\r\n</div>\r\n\r\n\r\n<!-- settlement currency words row -->\r\n<div class=\"closing-balance-row closing-balance-words\"\r\n *ngIf=\"closingBalanceSettlmentInWords\">\r\n <div class=\"label\"\r\n [title]=\"closingBalanceSettlmentCurrency + ' - ' + closingBalanceSettlmentInWords\">\r\n {{ closingBalanceSettlmentCurrency }} - {{ closingBalanceSettlmentInWords }}\r\n </div>\r\n</div>\r\n\r\n<!-- existing USD words row (keep as-is) -->\r\n<div class=\"closing-balance-row closing-balance-words\">\r\n <div class=\"label\" [title]=\"closingBalanceCurrency + ' - ' + closingBalanceUSDInWords\">\r\n {{ closingBalanceCurrency }} - {{ closingBalanceUSDInWords }}\r\n </div>\r\n</div>\r\n", styles: [".transaction-grid ::ng-deep .ag-header{background-color:#f9f9f9;font-weight:600;font-size:10px;color:#000;border-right:1px solid #e0e0e0}:host ::ng-deep .ag-header-cell{padding:2px!important;align-items:center!important;justify-content:center!important;border-right:1px solid #e0e0e0;white-space:normal!important;word-break:normal!important;overflow-wrap:break-word!important;text-align:center!important;height:auto!important}::ng-deep .ag-header-cell-label{display:flex!important;justify-content:center!important;align-items:center!important;width:100%;text-align:center!important}::ng-deep .ag-header-cell-text{text-align:center!important;width:100%!important;display:flex!important;justify-content:center!important}.transaction-grid ::ng-deep .ag-row{border-bottom:1px solid #e0e0e0}.transaction-grid ::ng-deep .ag-cell{font-size:9px;white-space:normal!important;word-break:keep-all!important;overflow-wrap:anywhere;line-height:1.4;padding:4px!important;color:#000;font-weight:500;border-right:.5px solid #e0e0e0;align-content:center;user-select:text!important;-webkit-user-select:text!important;-moz-user-select:text!important;-ms-user-select:text!important;cursor:text}::ng-deep .ag-cell-label-container{padding:0!important}.ag-theme-alpine{--ag-header-font-size: 10px;--ag-font-size: 10px;--ag-header-background-color: #fdfdfd;--ag-header-foreground-color: rgb(0, 0, 0)}::ng-deep .ag-paging-panel{height:30px!important}::ng-deep .compact-grid .ag-cell{cursor:default!important;border-right:1px solid #e0e0e0;padding:2px 3px!important;font-size:9px!important;display:flex!important;align-items:center!important}::ng-deep .compact-grid .ag-cell-value{cursor:text!important;font-size:9px!important;padding:0 3px 0 2px!important}::ng-deep .compact-grid .ag-right-aligned-cell{text-align:right!important;justify-content:flex-end!important;text-overflow:ellipsis}::ng-deep .ag-theme-alpine .pinned-total-cell{font-weight:700!important}.details-table{background-color:#d3d3d3;margin-bottom:0;height:32px;align-content:center}.closing-balance-row{display:flex;border:1px solid #ccc;border-top:none;font-size:10px!important;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-weight:700;height:28px;align-items:center}.closing-balance-row .label{flex:4.9;padding:6px;text-align:left;border-right:1px solid #ccc}.closing-balance-row .settlement{flex:2;padding:6px;text-align:right;border-right:1px solid #ccc}.closing-balance-row .value{flex:2;padding:6px;text-align:right}\n"], dependencies: [{ kind: "component", type: i2.AgGridAngular, selector: "ag-grid-angular", inputs: ["gridOptions", "modules", "statusBar", "sideBar", "suppressContextMenu", "preventDefaultOnContextMenu", "allowContextMenuWithControlKey", "suppressMenuHide", "enableBrowserTooltips", "tooltipShowDelay", "tooltipHideDelay", "tooltipMouseTrack", "popupParent", "copyHeadersToClipboard", "copyGroupHeadersToClipboard", "clipboardDelimiter", "suppressCopyRowsToClipboard", "suppressCopySingleCellRanges", "suppressLastEmptyLineOnPaste", "suppressClipboardPaste", "suppressClipboardApi", "columnDefs", "defaultColDef", "defaultColGroupDef", "columnTypes", "maintainColumnOrder", "suppressFieldDotNotation", "deltaColumnMode", "applyColumnDefOrder", "immutableColumns", "suppressSetColumnStateEvents", "suppressColumnStateEvents", "colWidth", "minColWidth", "maxColWidth", "headerHeight", "groupHeaderHeight", "floatingFiltersHeight", "pivotHeaderHeight", "pivotGroupHeaderHeight", "allowDragFromColumnsToolPanel", "suppressMovableColumns", "suppressColumnMoveAnimation", "suppressDragLeaveHidesColumns", "suppressRowGroupHidesColumns", "colResizeDefault", "suppressAutoSize", "autoSizePadding", "skipHeaderOnAutoSize", "components", "frameworkComponents", "editType", "singleClickEdit", "suppressClickEdit", "readOnlyEdit", "stopEditingWhenCellsLoseFocus", "enterMovesDown", "enterMovesDownAfterEdit", "enableCellEditingOnBackspace", "undoRedoCellEditing", "undoRedoCellEditingLimit", "stopEditingWhenGridLosesFocus", "defaultCsvExportParams", "suppressCsvExport", "defaultExcelExportParams", "suppressExcelExport", "excelStyles", "defaultExportParams", "quickFilterText", "cacheQuickFilter", "excludeChildrenWhenTreeDataFiltering", "enableCharts", "chartThemes", "customChartThemes", "chartThemeOverrides", "enableChartToolPanelsButton", "chartToolPanelsDef", "loadingCellRenderer", "loadingCellRendererFramework", "loadingCellRendererParams", "loadingCellRendererSelector", "localeText", "masterDetail", "keepDetailRows", "keepDetailRowsCount", "detailCellRenderer", "detailCellRendererFramework", "detailCellRendererParams", "detailRowHeight", "detailRowAutoHeight", "context", "alignedGrids", "tabIndex", "rowBuffer", "valueCache", "valueCacheNeverExpires", "enableCellExpressions", "suppressParentsInRowNodes", "suppressTouch", "suppressFocusAfterRefresh", "suppressAsyncEvents", "suppressBrowserResizeObserver", "suppressPropertyNamesCheck", "suppressChangeDetection", "debug", "overlayLoadingTemplate", "loadingOverlayComponent", "loadingOverlayComponentFramework", "loadingOverlayComponentParams", "suppressLoadingOverlay", "overlayNoRowsTemplate", "noRowsOverlayComponent", "noRowsOverlayComponentFramework", "noRowsOverlayComponentParams", "suppressNoRowsOverlay", "pagination", "paginationPageSize", "paginationAutoPageSize", "paginateChildRows", "suppressPaginationPanel", "pivotMode", "pivotPanelShow", "pivotColumnGroupTotals", "pivotRowTotals", "pivotSuppressAutoColumn", "suppressExpandablePivotGroups", "functionsReadOnly", "aggFuncs", "suppressAggFuncInHeader", "suppressAggAtRootLevel", "aggregateOnlyChangedColumns", "suppressAggFilteredOnly", "removePivotHeaderRowWhenSingleValueColumn", "animateRows", "enableCellChangeFlash", "cellFlashDelay", "cellFadeDelay", "allowShowChangeAfterFilter", "domLayout", "ensureDomOrder", "enableRtl", "suppressColumnVirtualisation", "suppressMaxRenderedRowRestriction", "suppressRowVirtualisation", "rowDragManaged", "suppressRowDrag", "suppressMoveWhenRowDragging", "rowDragEntireRow", "rowDragMultiRow", "rowDragText", "fullWidthCellRenderer", "fullWidthCellRendererFramework", "fullWidthCellRendererParams", "embedFullWidthRows", "deprecatedEmbedFullWidthRows", "groupDisplayType", "groupDefaultExpanded", "autoGroupColumnDef", "groupMaintainOrder", "groupSelectsChildren", "groupAggFiltering", "groupIncludeFooter", "groupIncludeTotalFooter", "groupSuppressBlankHeader", "groupSelectsFiltered", "showOpenedGroup", "groupRemoveSingleChildren", "groupRemoveLowestSingleChildren", "groupHideOpenParents", "rowGroupPanelShow", "groupRowRenderer", "groupRowRendererFramework", "groupRowRendererParams", "suppressMakeColumnVisibleAfterUnGroup", "treeData", "rowGroupPanelSuppressSort", "groupRowsSticky", "groupRowInnerRenderer", "groupRowInnerRendererFramework", "groupMultiAutoColumn", "groupUseEntireRow", "groupSuppressAutoColumn", "rememberGroupStateWhenNewData", "pinnedTopRowData", "pinnedBottomRowData", "rowModelType", "rowData", "immutableData", "asyncTransactionWaitMillis", "suppressModelUpdateAfterUpdateTransaction", "deltaRowDataMode", "batchUpdateWaitMillis", "datasource", "cacheOverflowSize", "infiniteInitialRowCount", "serverSideInitialRowCount", "serverSideStoreType", "serverSideInfiniteScroll", "cacheBlockSize", "maxBlocksInCache", "maxConcurrentDatasourceRequests", "blockLoadDebounceMillis", "purgeClosedRowNodes", "serverSideDatasource", "serverSideSortAllLevels", "serverSideFilterAllLevels", "serverSideSortOnServer", "serverSideFilterOnServer", "serverSideSortingAlwaysResets", "serverSideFilteringAlwaysResets", "suppressEnterpriseResetOnNewColumns", "viewportDatasource", "viewportRowModelPageSize", "viewportRowModelBufferSize", "alwaysShowHorizontalScroll", "alwaysShowVerticalScroll", "debounceVerticalScrollbar", "suppressHorizontalScroll", "suppressScrollOnNewData", "suppressScrollWhenPopupsAreOpen", "suppressAnimationFrame", "suppressMiddleClickScrolls", "suppressPreventDefaultOnMouseWheel", "scrollbarWidth", "rowSelection", "rowMultiSelectWithClick", "suppressRowDeselection", "suppressRowClickSelection", "suppressCellSelection", "suppressCellFocus", "suppressMultiRangeSelection", "enableCellTextSelection", "enableRangeSelection", "enableRangeHandle", "enableFillHandle", "fillHandleDirection", "suppressClearOnFillReduction", "sortingOrder", "accentedSort", "unSortIcon", "suppressMultiSort", "alwaysMultiSort", "multiSortKey", "suppressMaintainUnsortedOrder", "icons", "rowHeight", "rowStyle", "rowClass", "rowClassRules", "suppressRowHoverHighlight", "suppressRowTransform", "columnHoverHighlight", "deltaSort", "treeDataDisplayType", "angularCompileRows", "angularCompileFilters", "functionsPassive", "enableGroupEdit", "getContextMenuItems", "getMainMenuItems", "postProcessPopup", "processCellForClipboard", "processHeaderForClipboard", "processGroupHeaderForClipboard", "processCellFromClipboard", "sendToClipboard", "processDataFromClipboard", "isExternalFilterPresent", "doesExternalFilterPass", "getChartToolbarItems", "createChartContainer", "navigateToNextHeader", "tabToNextHeader", "navigateToNextCell", "tabToNextCell", "suppressKeyboardEvent", "localeTextFunc", "getLocaleText", "getDocument", "paginationNumberFormatter", "groupRowAggNodes", "getGroupRowAgg", "isGroupOpenByDefault", "initialGroupOrderComparator", "defaultGroupOrderComparator", "processSecondaryColDef", "processSecondaryColGroupDef", "processPivotResultColDef", "processPivotResultColGroupDef", "getDataPath", "defaultGroupSortComparator", "getChildCount", "getServerSideGroupLevelParams", "getServerSideStoreParams", "isServerSideGroupOpenByDefault", "isApplyServerSideTransaction", "isServerSideGroup", "getServerSideGroupKey", "getBusinessKeyForNode", "getRowNodeId", "getRowId", "resetRowDataOnUpdate", "processRowPostCreate", "isRowSelectable", "isRowMaster", "fillOperation", "postSort", "postSortRows", "getRowStyle", "getRowClass", "getRowHeight", "isFullWidthCell", "isFullWidthRow"], outputs: ["toolPanelVisibleChanged", "toolPanelSizeChanged", "pasteStart", "pasteEnd", "columnVisible", "columnPinned", "columnResized", "columnMoved", "columnValueChanged", "columnPivotModeChanged", "columnPivotChanged", "columnGroupOpened", "newColumnsLoaded", "gridColumnsChanged", "displayedColumnsChanged", "virtualColumnsChanged", "columnEverythingChanged", "componentStateChanged", "cellValueChanged", "cellEditRequest", "rowValueChanged", "cellEditingStarted", "cellEditingStopped", "rowEditingStarted", "rowEditingStopped", "filterOpened", "filterChanged", "filterModified", "chartCreated", "chartRangeSelectionChanged", "chartOptionsChanged", "chartDestroyed", "cellKeyDown", "cellKeyPress", "gridReady", "firstDataRendered", "gridSizeChanged", "modelUpdated", "virtualRowRemoved", "viewportChanged", "bodyScroll", "bodyScrollEnd", "dragStarted", "dragStopped", "paginationChanged", "rowDragEnter", "rowDragMove", "rowDragLeave", "rowDragEnd", "columnRowGroupChanged", "rowGroupOpened", "expandOrCollapseAll", "pinnedRowDataChanged", "rowDataChanged", "rowDataUpdated", "asyncTransactionsFlushed", "cellClicked", "cellDoubleClicked", "cellFocused", "cellMouseOver", "cellMouseOut", "cellMouseDown", "rowClicked", "rowDoubleClicked", "rowSelected", "selectionChanged", "cellContextMenu", "rangeSelectionChanged", "sortChanged", "columnRowGroupChangeRequest", "columnPivotChangeRequest", "columnValueChangeRequest", "columnAggFuncChangeRequest"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.MetadataComponent, selector: "lib-metadata", inputs: ["metaDataOne", "metaDataTwo", "showmetaDataOne", "showmetaDataTwo", "reportName"], outputs: ["searchEvent", "exportEvent"] }, { kind: "component", type: i5.LoaderComponent, selector: "app-loader" }, { kind: "component", type: i6.SearchFilterComponent, selector: "lib-search-filter", inputs: ["ReportName"], outputs: ["searchClicked"] }] });
614
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: StatementOfAccountsReportComponent, decorators: [{
615
+ type: Component,
616
+ args: [{ selector: 'lib-statement-of-accounts-report', template: "<lib-search-filter \r\n [ReportName]=\"ReportName\" \r\n (searchClicked)=\"handleSearch($event)\">\r\n</lib-search-filter>\r\n\r\n<app-loader *ngIf=\"loadingState === ComponentLoadingState.Loading\"></app-loader>\r\n<span *ngIf=\"loadingState === ComponentLoadingState.Error\">{{ errorMessage }}</span>\r\n<div *ngIf=\"showTables\">\r\n<lib-metadata \r\n [reportName]=\"ReportName\" \r\n [showmetaDataOne]=\"true\" \r\n [showmetaDataTwo]=\"false\" \r\n [metaDataOne]=\"metaDataOne\"\r\n [metaDataTwo]=\"\" \r\n (exportEvent)=\"handleExport($event)\" \r\n (searchEvent)=\"filter($event)\">\r\n </lib-metadata>\r\n\r\n<ag-grid-angular\r\n class=\"ag-theme-alpine transaction-grid\"\r\n [rowData]=\"openingBalAndFunding\"\r\n [columnDefs]=\"columnDefs\"\r\n [pinnedBottomRowData]=\"[]\"\r\n [headerHeight]=\"32\" \r\n [defaultColDef]=\"defaultColDef\"\r\n [rowHeight]=\"28\"\r\n (gridReady)=\"onOpeningGridReady($event)\"\r\n style=\"width: 100%; height: 91px;\">\r\n</ag-grid-angular>\r\n\r\n<div *ngIf=\"(selectedClientType === 'SendClient' || selectedClientType === 'Both')\">\r\n<h3 class=\"details-table\"><span style=\"margin-left: 3px;\">Send Details</span></h3>\r\n<ag-grid-angular\r\n class=\"ag-theme-alpine transaction-grid\"\r\n [rowData]=\"sendDetails\"\r\n [columnDefs]=\"columnDefs\"\r\n [defaultColDef]=\"defaultColDef\"\r\n [rowHeight]=\"28\"\r\n [headerHeight]=\"32\" \r\n [pinnedBottomRowData]=\"sendPinnedBottomRow\"\r\n (gridReady)=\"onSendGridReady($event)\" \r\n style=\"width: 100%; height: 203px;\">\r\n</ag-grid-angular>\r\n</div>\r\n\r\n<div *ngIf=\"(selectedClientType === 'ReceiveClient' || selectedClientType === 'Both')\">\r\n<h3 class=\"details-table\"><span style=\"margin-left: 3px;\">Receive Details</span></h3>\r\n<ag-grid-angular\r\n class=\"ag-theme-alpine transaction-grid\"\r\n [rowData]=\"receiveDetails\"\r\n [columnDefs]=\"columnDefs\"\r\n [defaultColDef]=\"defaultColDef\"\r\n [rowHeight]=\"28\"\r\n [headerHeight]=\"32\" \r\n [pinnedBottomRowData]=\"receivePinnedBottomRow\"\r\n (gridReady)=\"onReceiveGridReady($event)\" \r\n style=\"width: 100%; height: 203px;\">\r\n</ag-grid-angular>\r\n</div>\r\n\r\n\r\n<!-- Closing balance row -->\r\n<div class=\"closing-balance-row\">\r\n <div class=\"label\" title=\"Closing Balance\">\r\n Closing Balance\r\n </div>\r\n\r\n <div class=\"settlement\" \r\n [title]=\"closingBalanceSettlmentFormatted\">\r\n {{ closingBalanceSettlmentFormatted }}\r\n </div>\r\n\r\n <div class=\"value\" [title]=\"closingBalanceInUsdFormatted\">\r\n {{ closingBalanceInUsdFormatted }}\r\n </div>\r\n</div>\r\n\r\n\r\n<!-- settlement currency words row -->\r\n<div class=\"closing-balance-row closing-balance-words\"\r\n *ngIf=\"closingBalanceSettlmentInWords\">\r\n <div class=\"label\"\r\n [title]=\"closingBalanceSettlmentCurrency + ' - ' + closingBalanceSettlmentInWords\">\r\n {{ closingBalanceSettlmentCurrency }} - {{ closingBalanceSettlmentInWords }}\r\n </div>\r\n</div>\r\n\r\n<!-- existing USD words row (keep as-is) -->\r\n<div class=\"closing-balance-row closing-balance-words\">\r\n <div class=\"label\" [title]=\"closingBalanceCurrency + ' - ' + closingBalanceUSDInWords\">\r\n {{ closingBalanceCurrency }} - {{ closingBalanceUSDInWords }}\r\n </div>\r\n</div>\r\n", styles: [".transaction-grid ::ng-deep .ag-header{background-color:#f9f9f9;font-weight:600;font-size:10px;color:#000;border-right:1px solid #e0e0e0}:host ::ng-deep .ag-header-cell{padding:2px!important;align-items:center!important;justify-content:center!important;border-right:1px solid #e0e0e0;white-space:normal!important;word-break:normal!important;overflow-wrap:break-word!important;text-align:center!important;height:auto!important}::ng-deep .ag-header-cell-label{display:flex!important;justify-content:center!important;align-items:center!important;width:100%;text-align:center!important}::ng-deep .ag-header-cell-text{text-align:center!important;width:100%!important;display:flex!important;justify-content:center!important}.transaction-grid ::ng-deep .ag-row{border-bottom:1px solid #e0e0e0}.transaction-grid ::ng-deep .ag-cell{font-size:9px;white-space:normal!important;word-break:keep-all!important;overflow-wrap:anywhere;line-height:1.4;padding:4px!important;color:#000;font-weight:500;border-right:.5px solid #e0e0e0;align-content:center;user-select:text!important;-webkit-user-select:text!important;-moz-user-select:text!important;-ms-user-select:text!important;cursor:text}::ng-deep .ag-cell-label-container{padding:0!important}.ag-theme-alpine{--ag-header-font-size: 10px;--ag-font-size: 10px;--ag-header-background-color: #fdfdfd;--ag-header-foreground-color: rgb(0, 0, 0)}::ng-deep .ag-paging-panel{height:30px!important}::ng-deep .compact-grid .ag-cell{cursor:default!important;border-right:1px solid #e0e0e0;padding:2px 3px!important;font-size:9px!important;display:flex!important;align-items:center!important}::ng-deep .compact-grid .ag-cell-value{cursor:text!important;font-size:9px!important;padding:0 3px 0 2px!important}::ng-deep .compact-grid .ag-right-aligned-cell{text-align:right!important;justify-content:flex-end!important;text-overflow:ellipsis}::ng-deep .ag-theme-alpine .pinned-total-cell{font-weight:700!important}.details-table{background-color:#d3d3d3;margin-bottom:0;height:32px;align-content:center}.closing-balance-row{display:flex;border:1px solid #ccc;border-top:none;font-size:10px!important;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-weight:700;height:28px;align-items:center}.closing-balance-row .label{flex:4.9;padding:6px;text-align:left;border-right:1px solid #ccc}.closing-balance-row .settlement{flex:2;padding:6px;text-align:right;border-right:1px solid #ccc}.closing-balance-row .value{flex:2;padding:6px;text-align:right}\n"] }]
617
+ }], ctorParameters: function () { return [{ type: i1.ReportService }]; } });
618
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGVtZW50LW9mLWFjY291bnRzLXJlcG9ydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yZXBvcnRzLWxpYi9zcmMvbGliL2NvbXBvbmVudHMvc3RhdGVtZW50LW9mLWFjY291bnRzLXJlcG9ydC9zdGF0ZW1lbnQtb2YtYWNjb3VudHMtcmVwb3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JlcG9ydHMtbGliL3NyYy9saWIvY29tcG9uZW50cy9zdGF0ZW1lbnQtb2YtYWNjb3VudHMtcmVwb3J0L3N0YXRlbWVudC1vZi1hY2NvdW50cy1yZXBvcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUVsRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFL0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTdDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sS0FBSyxPQUFPLE1BQU0sU0FBUyxDQUFDO0FBQ25DLE9BQU8sS0FBSyxTQUFTLE1BQU0sWUFBWSxDQUFDOzs7Ozs7OztBQVF4QyxNQUFNLE9BQU8sa0NBQWtDO0lBc0M3QyxZQUFvQixhQUE0QjtRQUE1QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQXBDaEQsZUFBVSxHQUFHLHVCQUF1QixDQUFDO1FBQ25DLDBCQUFxQixHQUFHLHNCQUFzQixDQUFDO1FBQy9DLGlCQUFZLEdBQTJCLHNCQUFzQixDQUFDLFFBQVEsQ0FB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QyxJQUFJLEVBQUUsQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVPLGVBQWU7UUFDckIsTUFBTSxHQUFHLEdBQXVDLEVBQUUsQ0FBQztRQUNuRCxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFDbEQsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEtBQUssWUFBWSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxNQUFNLEVBQUU7WUFDbEYsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1NBQzVEO1FBQ0QsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEtBQUssZUFBZSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxNQUFNLEVBQUU7WUFDckYsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7U0FDbEU7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7OytIQXJyQlUsa0NBQWtDO21IQUFsQyxrQ0FBa0Msd0VDbkIvQywwd0dBNkZBOzJGRDFFYSxrQ0FBa0M7a0JBTjlDLFNBQVM7K0JBQ0Usa0NBQWtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgR3JpZEFwaSB9IGZyb20gJ2FnLWdyaWQtY29tbXVuaXR5JztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBmaW5hbGl6ZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRMb2FkaW5nU3RhdGVzIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NvbXBvbmVudC1sb2FkaW5nLXN0YXRlcyc7XHJcbmltcG9ydCB7IFJlcG9ydFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXBvcnQuc2VydmljZSc7XHJcbmltcG9ydCB7IGZvcm1hdERhdGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBTdGF0ZW1lbnRPZkFjY291bnRJdGVtIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3N0YXRlbWVudC1vZi1hY2NvdW50LXJlcG9ydC9zdGF0ZW1lbnQtb2YtYWNjb3VudHMubW9kZWwnO1xyXG5pbXBvcnQganNQREYgZnJvbSAnanNwZGYnO1xyXG5pbXBvcnQgJ2pzcGRmLWF1dG90YWJsZSc7XHJcbmltcG9ydCAqIGFzIEV4Y2VsSlMgZnJvbSAnZXhjZWxqcyc7XHJcbmltcG9ydCAqIGFzIEZpbGVTYXZlciBmcm9tICdmaWxlLXNhdmVyJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLXN0YXRlbWVudC1vZi1hY2NvdW50cy1yZXBvcnQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9zdGF0ZW1lbnQtb2YtYWNjb3VudHMtcmVwb3J0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9zdGF0ZW1lbnQtb2YtYWNjb3VudHMtcmVwb3J0LmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBTdGF0ZW1lbnRPZkFjY291bnRzUmVwb3J0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgUmVwb3J0TmFtZSA9IFwiU3RhdGVtZW50IG9mIEFjY291bnRzXCI7XHJcbiAgICBDb21wb25lbnRMb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGVzO1xyXG4gICAgbG9hZGluZ1N0YXRlOiBDb21wb25lbnRMb2FkaW5nU3RhdGVzID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlcy5Db21wbGV0ZTtcclxuICAgIGVycm9yTWVzc2FnZTogc3RyaW5nO1xyXG4gICAgaGFzU2VhcmNoZWQ6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIG9wZW5pbmdCYWxBbmRGdW5kaW5nIDogU3RhdGVtZW50T2ZBY2NvdW50SXRlbVtdID1bXTtcclxuICAgIHNlbmREZXRhaWxzOiBTdGF0ZW1lbnRPZkFjY291bnRJdGVtW10gPVtdO1xyXG4gICAgcmVjZWl2ZURldGFpbHM6IFN0YXRlbWVudE9mQWNjb3VudEl0ZW1bXSA9W107XHJcbiAgICBub0RhdGFGcm9tQXBpOiBib29sZWFuO1xyXG4gICAgbWV0YURhdGFPbmU6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XHJcbiAgICB1c2VyOiBhbnk7XHJcbiAgICBjdXJyZW50RGF0ZVRpbWU6IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgc2VuZFBpbm5lZEJvdHRvbVJvdzogYW55W10gPSBbXTtcclxuICAgIHJlY2VpdmVQaW5uZWRCb3R0b21Sb3c6IGFueVtdID0gW107XHJcbiAgICBwcml2YXRlIHNlbmRHcmlkQXBpITogR3JpZEFwaTtcclxuICAgIHByaXZhdGUgcmVjZWl2ZUdyaWRBcGkhOiBHcmlkQXBpO1xyXG4gICAgcHJpdmF0ZSBvcGVuaW5nR3JpZEFwaSE6IEdyaWRBcGk7XHJcbiAgICBzZWFyY2hUZXh0OiBzdHJpbmc7XHJcbiAgICBjbG9zaW5nQmFsYW5jZTogbnVtYmVyID0gMDtcclxuXHJcbiAgY2xvc2luZ0JhbGFuY2VDdXJyZW5jeSA9ICdVU0QnO1xyXG4gIGNsb3NpbmdCYWxhbmNlVVNESW5Xb3Jkczogc3RyaW5nID0gJyc7XHJcblxyXG4gIHNlbGVjdGVkQ2xpZW50VHlwZTogc3RyaW5nID0gJyc7XHJcbiAgc2hvd1RhYmxlcyA9IGZhbHNlO1xyXG4gIHByaXZhdGUgbG9nb0Jhc2U2ND86IHN0cmluZztcclxuICBzZWxlY3RlZEV4cG9ydE9wdGlvbjogc3RyaW5nO1xyXG5cclxuICBjbG9zaW5nQmFsYW5jZUluU2V0dGxtZW50OiBudW1iZXIgPSAwO1xyXG4gIGNsb3NpbmdCYWxhbmNlU2V0dGxtZW50Q3VycmVuY3k6IHN0cmluZyA9ICcnO1xyXG4gIGNsb3NpbmdCYWxhbmNlU2V0dGxtZW50SW5Xb3Jkczogc3RyaW5nID0gJyc7XHJcbiAgY2xvc2luZ0JhbGFuY2VTZXR0bG1lbnRGb3JtYXR0ZWQ6IHN0cmluZyA9ICcwLjAwMCc7XHJcbiAgY2xvc2luZ0JhbGFuY2VJblVzZEZvcm1hdHRlZDogc3RyaW5nID0gJzAuMDAwJztcclxuXHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVwb3J0U2VydmljZTogUmVwb3J0U2VydmljZSkgeyB9XHJcblxyXG4gICAgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmxvZ29CYXNlNjQgPSBhd2FpdCB0aGlzLmxvYWRJbWFnZUFzQmFzZTY0KCdhc3NldHMvcmVwb3J0cy1saWIvYXNzZXRzL2ltYWdlcy9YTUxvZ28ucG5nJyk7XHJcbiAgfVxyXG4gIFxyXG4gICAgY29sdW1uRGVmcyA9IFtcclxuICAgICAgLy8geyBoZWFkZXJOYW1lOiAnSUQnLCBmaWVsZDogJ2lkJywgd2lkdGg6IDEwMCB9LFxyXG4gICAgICB7IGhlYWRlck5hbWU6ICdEZXNjcmlwdGlvbicsIGZpZWxkOiAnZGVzY3JpcHRpb24nLCBmbGV4OiA0LCB0b29sdGlwRmllbGQ6ICdkZXNjcmlwdGlvbicsIGNlbGxDbGFzc1J1bGVzOiB7ICdwaW5uZWQtdG90YWwtY2VsbCc6IHBhcmFtcyA9PiBwYXJhbXMubm9kZS5yb3dQaW5uZWQgPT09ICdib3R0b20nIH0gfSxcclxuICAgICAgeyBoZWFkZXJOYW1lOiAnU2V0dGxtZW50IENjeScsIGZpZWxkOiAnc2V0dGxtZW50Q2N5JywgZmxleDogMSwgdG9vbHRpcEZpZWxkOiAnc2V0dGxtZW50Q2N5JywgY2VsbENsYXNzUnVsZXM6IHsgJ3Bpbm5lZC10b3RhbC1jZWxsJzogcGFyYW1zID0+IHBhcmFtcy5ub2RlLnJvd1Bpbm5lZCA9PT0gJ2JvdHRvbScgfSB9LFxyXG4gICAgICB7IGhlYWRlck5hbWU6ICdBbW91bnQgSW4gU2V0dGxtZW50IENjeScsIGZpZWxkOiAnYW1vdW50SW5TZXR0bG1lbnRDY3knLCBmbGV4OiAyLjEsIGNlbGxDbGFzczogJ2FnLXJpZ2h0LWFsaWduZWQtY2VsbCcsIHZhbHVlRm9ybWF0dGVyOiB0aGlzLmN1cnJlbmN5Rm9ybWF0dGVyLCB0b29sdGlwVmFsdWVHZXR0ZXI6IChwYXJhbXM6IGFueSkgPT4gdGhpcy5jdXJyZW5jeUZvcm1hdHRlcihwYXJhbXMpLCBjZWxsQ2xhc3NSdWxlczogeyAncGlubmVkLXRvdGFsLWNlbGwnOiBwYXJhbXMgPT4gcGFyYW1zLm5vZGUucm93UGlubmVkID09PSAnYm90dG9tJyB9IH0sXHJcbiAgICAgIHsgaGVhZGVyTmFtZTogJ0Ftb3VudCBJbiBVU0QnLCBmaWVsZDogJ2Ftb3VudEluVVNEJywgZmxleDogMi4xLCBjZWxsQ2xhc3M6ICdhZy1yaWdodC1hbGlnbmVkLWNlbGwnLCB2YWx1ZUZvcm1hdHRlcjogdGhpcy5jdXJyZW5jeUZvcm1hdHRlciwgdG9vbHRpcFZhbHVlR2V0dGVyOiAocGFyYW1zOiBhbnkpID0+IHRoaXMuY3VycmVuY3lGb3JtYXR0ZXIocGFyYW1zKSwgY2VsbENsYXNzUnVsZXM6IHsgJ3Bpbm5lZC10b3RhbC1jZWxsJzogcGFyYW1zID0+IHBhcmFtcy5ub2RlLnJvd1Bpbm5lZCA9PT0gJ2JvdHRvbScgfSB9XHJcbiAgICBdO1xyXG4gIFxyXG4gICAgZGVmYXVsdENvbERlZiA9IHtcclxuICAgICAgc29ydGFibGU6IHRydWUsXHJcbiAgICAgIGZpbHRlcjogZmFsc2UsXHJcbiAgICAgIHJlc2l6YWJsZTogdHJ1ZSxcclxuICAgICAgbWlud2lkdGg6IDQwLFxyXG4gICAgICB3cmFwSGVhZGVyVGV4dDogdHJ1ZSxcclxuICAgICAgYXV0b0hlYWRlckhlaWdodDogdHJ1ZSxcclxuICAgICAgc3VwcHJlc3NTaXplVG9GaXQ6IGZhbHNlLFxyXG4gICAgICB3cmFwVGV4dDogdHJ1ZSxcclxuICAgICAgYXV0b0hlaWdodDogdHJ1ZVxyXG4gICAgfTtcclxuICBcclxuICAgIGN1cnJlbmN5Rm9ybWF0dGVyKHBhcmFtczogYW55KSB7XHJcbiAgICAgIGlmIChwYXJhbXMudmFsdWUgPT0gbnVsbCkgcmV0dXJuICcwLjAwMCc7XHJcbiAgICAgIGNvbnN0IG51bSA9IE51bWJlcihwYXJhbXMudmFsdWUpO1xyXG4gICAgICByZXR1cm4gbnVtLnRvRml4ZWQoMyk7IC8vIHJvdW5kcyB0byAzIGRlY2ltYWxzXHJcbiAgICB9XHJcbiAgXHJcbiAgXHJcbiAgICBhc3luYyBoYW5kbGVTZWFyY2goY3JpdGVyaWE6IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICBjb25zdCBtb2RhbCA9IGNyaXRlcmlhLm1vZGFsO1xyXG4gICAgICBjb25zdCBwYXlsb2FkID0ge1xyXG4gICAgICAgIGJ1c2luZXNzUGFydG5lcklEOiBOdW1iZXIobW9kYWwuY2xpZW50KSxcclxuICAgICAgICBmcm9tRGF0ZTogbmV3IERhdGUobW9kYWwuZnJvbURhdGUpLnRvSVNPU3RyaW5nKCksXHJcbiAgICAgICAgdG9EYXRlOiBuZXcgRGF0ZShtb2RhbC50b0RhdGUpLnRvSVNPU3RyaW5nKCksXHJcbiAgICAgICAgY2xpZW50VHlwZTogY3JpdGVyaWEuY2xpZW50VHlwZVxyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLnVzZXIgPSBjcml0ZXJpYS5zeXNVc2VySURcclxuICAgICAgdGhpcy5tZXRhRGF0YU9uZSA9IHtcclxuICAgICAgICAnUmVwb3J0IFVzZXInOiB0aGlzLnVzZXIsXHJcbiAgICAgICAgJ1JlcG9ydCBUaW1lJzogZm9ybWF0RGF0ZSh0aGlzLmN1cnJlbnREYXRlVGltZSwgJ2RkL01NL3l5eXkgaGg6bW0gYScsICdlbi1VUycpLFxyXG4gICAgICAgICdDbGllbnQnOiBjcml0ZXJpYS5jbGllbnROYW1lXHJcbiAgICAgIH1cclxuICAgICAgY29uc29sZS5sb2coY3JpdGVyaWEuY2xpZW50TmFtZSlcclxuICAgICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGVzLkxvYWRpbmc7XHJcbiAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJyc7XHJcbiAgICAgIHRoaXMuc2hvd1RhYmxlcyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkQ2xpZW50VHlwZSA9IGNyaXRlcmlhLmNsaWVudFR5cGU7XHJcbiAgXHJcbiAgICAgIHRoaXMucmVwb3J0U2VydmljZS5nZXRTdGF0ZW1lbnRPZkFjY291bnQocGF5bG9hZClcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIGZpbmFsaXplKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU3RhdGUgPSBDb21wb25lbnRMb2FkaW5nU3RhdGVzLkNvbXBsZXRlO1xyXG4gICAgICAgICAgICB0aGlzLmhhc1NlYXJjaGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5zaG93VGFibGVzID0gdHJ1ZTtcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXHJcbiAgICAgICAgKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgbmV4dDogKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZGF0YSlcclxuICAgICAgICAgICAgdGhpcy5vcGVuaW5nQmFsQW5kRnVuZGluZyA9IGRhdGEub3BlbmluZ0JhbEFuZEZ1bmRpbmcgPz8gW107XHJcbiAgICAgICAgICAgIHRoaXMuc2VuZERldGFpbHMgPSBkYXRhLnNlbmREZXRhaWxzID8/IFtdO1xyXG4gICAgICAgICAgICB0aGlzLnJlY2VpdmVEZXRhaWxzID0gZGF0YS5yZWNlaXZlRGV0YWlscyA/PyBbXTtcclxuICBcclxuICAgICAgICAgICAgLy8gYWRkIHBpbm5lZCB0b3RhbHNcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRDbGllbnRUeXBlID09IFwiU2VuZENsaWVudFwiKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZW5kUGlubmVkQm90dG9tUm93ID0gW3RoaXMuYnVpbGRUb3RhbFJvdyh0aGlzLnNlbmREZXRhaWxzKV07XHJcbiAgICAgICAgICAgICAgdGhpcy5yZWNlaXZlUGlubmVkQm90dG9tUm93ID0gW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5zZWxlY3RlZENsaWVudFR5cGUgPT0gXCJSZWNlaXZlQ2xpZW50XCIpIHtcclxuICAgICAgICAgICAgICB0aGlzLnJlY2VpdmVQaW5uZWRCb3R0b21Sb3cgPSBbdGhpcy5idWlsZFRvdGFsUm93KHRoaXMucmVjZWl2ZURldGFpbHMpXTtcclxuICAgICAgICAgICAgICB0aGlzLnNlbmRQaW5uZWRCb3R0b21Sb3cgPSBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnNlbGVjdGVkQ2xpZW50VHlwZSA9PT0gXCJCb3RoXCIpIHtcclxuICAgICAgICAgICAgICB0aGlzLnNlbmRQaW5uZWRCb3R0b21Sb3cgPSBbdGhpcy5idWlsZFRvdGFsUm93KHRoaXMuc2VuZERldGFpbHMpXTtcclxuICAgICAgICAgICAgICB0aGlzLnJlY2VpdmVQaW5uZWRCb3R0b21Sb3cgPSBbdGhpcy5idWlsZFRvdGFsUm93KHRoaXMucmVjZWl2ZURldGFpbHMpXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLnNlbmRQaW5uZWRCb3R0b21Sb3cgPSBbXTtcclxuICAgICAgICAgICAgICB0aGlzLnJlY2VpdmVQaW5uZWRCb3R0b21Sb3cgPSBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUNsb3NpbmdCYWxhbmNlKCk7XHJcbiAgXHJcbiAgICAgICAgICAgIHRoaXMubm9EYXRhRnJvbUFwaSA9XHJcbiAgICAgICAgICAgICAgdGhpcy5vcGVuaW5nQmFsQW5kRnVuZGluZy5sZW5ndGggPT09IDAgJiZcclxuICAgICAgICAgICAgICB0aGlzLnNlbmREZXRhaWxzLmxlbmd0aCA9PT0gMCAmJlxyXG4gICAgICAgICAgICAgICghdGhpcy5yZWNlaXZlRGV0YWlscyB8fCB0aGlzLnJlY2VpdmVEZXRhaWxzLmxlbmd0aCA9PT0gMCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgU3RhdGVtZW50IG9mIEFjY291bnRzOicsIGVycik7XHJcbiAgICAgICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJ0ZhaWxlZCB0byBsb2FkIFN0YXRlbWVudCBvZiBBY2NvdW50cyc7XHJcbiAgICAgICAgICAgIHRoaXMub3BlbmluZ0JhbEFuZEZ1bmRpbmcgPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5zZW5kRGV0YWlscyA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLnJlY2VpdmVEZXRhaWxzID0gW107XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1N0YXRlID0gQ29tcG9uZW50TG9hZGluZ1N0YXRlcy5FcnJvcjtcclxuICAgICAgICAgICAgdGhpcy5zaG93VGFibGVzID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgXHJcbiAgICBwcml2YXRlIGJ1aWxkVG90YWxSb3cocm93czogeyBhbW91bnRJblNldHRsbWVudENjeTogbnVtYmVyOyBhbW91bnRJblVTRDogbnVtYmVyIH1bXSkge1xyXG4gICAgICBjb25zdCB0b3RhbFNldHRsZSA9IChyb3dzIHx8IFtdKS5yZWR1Y2UoKHN1bSwgcikgPT4gc3VtICsgKE51bWJlcihyLmFtb3VudEluU2V0dGxtZW50Q2N5KSB8fCAwKSwgMCk7XHJcbiAgICAgIGNvbnN0IHRvdGFsVXNkID0gKHJvd3MgfHwgW10pLnJlZHVjZSgoc3VtLCByKSA9PiBzdW0gKyAoTnVtYmVyKHIuYW1vdW50SW5VU0QpIHx8IDApLCAwKTtcclxuICBcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBpZDogbnVsbCxcclxuICAgICAgICBkZXNjcmlwdGlvbjogJ1RvdGFsJyxcclxuICAgICAgICBzZXR0bG1lbnRDY3k6ICcnLFxyXG4gICAgICAgIGFtb3VudEluU2V0dGxtZW50Q2N5OiBOdW1iZXIodG90YWxTZXR0bGUudG9GaXhlZCgzKSksXHJcbiAgICAgICAgYW1vdW50SW5VU0Q6IE51bWJlcih0b3RhbFVzZC50b0ZpeGVkKDMpKVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIFxyXG4gICAgb25PcGVuaW5nR3JpZFJlYWR5KHBhcmFtczogYW55KSB7XHJcbiAgICAgIHRoaXMub3BlbmluZ0dyaWRBcGkgPSBwYXJhbXMuYXBpO1xyXG4gICAgfVxyXG4gICAgb25TZW5kR3JpZFJlYWR5KHBhcmFtczogYW55KSB7XHJcbiAgICAgIHRoaXMuc2VuZEdyaWRBcGkgPSBwYXJhbXMuYXBpO1xyXG4gICAgfVxyXG4gICAgb25SZWNlaXZlR3JpZFJlYWR5KHBhcmFtczogYW55KSB7XHJcbiAgICAgIHRoaXMucmVjZWl2ZUdyaWRBcGkgPSBwYXJhbXMuYXBpO1xyXG4gICAgfVxyXG4gIFxyXG4gICAgZmlsdGVyKHRleHQ6IHN0cmluZykge1xyXG4gICAgICB0aGlzLnNlYXJjaFRleHQgPSB0ZXh0O1xyXG4gICAgICBpZiAodGhpcy5vcGVuaW5nR3JpZEFwaSkge1xyXG4gICAgICAgIHRoaXMub3BlbmluZ0dyaWRBcGkuc2V0UXVpY2tGaWx0ZXIodGhpcy5zZWFyY2hUZXh0KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5zZW5kR3JpZEFwaSkge1xyXG4gICAgICAgIHRoaXMuc2VuZEdyaWRBcGkuc2V0UXVpY2tGaWx0ZXIodGhpcy5zZWFyY2hUZXh0KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5yZWNlaXZlR3JpZEFwaSkge1xyXG4gICAgICAgIHRoaXMucmVjZWl2ZUdyaWRBcGkuc2V0UXVpY2tGaWx0ZXIodGhpcy5zZWFyY2hUZXh0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIFxyXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVDbG9zaW5nQmFsYW5jZSgpOiB2b2lkIHtcclxuICAgIC8vIFVTRCB0b3RhbHMgKGV4aXN0aW5nIGxvZ2ljKVxyXG4gICAgY29uc3Qgb3BlbmluZ0JhbFRvdGFsVXNkID0gKHRoaXMub3BlbmluZ0JhbEFuZEZ1bmRpbmcgfHwgW10pLnJlZHVjZShcclxuICAgICAgKHN1bSwgcjogYW55KSA9PiBzdW0gKyAoTnVtYmVyKHIuYW1vdW50SW5VU0QpIHx8IDApLCAwXHJcbiAgICApO1xyXG4gICAgY29uc3Qgc2VuZFRvdGFsVXNkID0gKHRoaXMuc2VuZERldGFpbHMgfHwgW10pLnJlZHVjZShcclxuICAgICAgKHN1bSwgcjogYW55KSA9PiBzdW0gKyAoTnVtYmVyKHIuYW1vdW50SW5VU0QpIHx8IDApLCAwXHJcbiAgICApO1xyXG4gICAgY29uc3QgcmVjZWl2ZVRvdGFsVXNkID0gKHRoaXMucmVjZWl2ZURldGFpbHMgfHwgW10pLnJlZHVjZShcclxuICAgICAgKHN1bSwgcjogYW55KSA9PiBzdW0gKyAoTnVtYmVyKHIuYW1vdW50SW5VU0QpIHx8IDApLCAwXHJcbiAgICApO1xyXG4gICAgY29uc3QgcmF3Q2xvc2luZ1VzZCA9IG9wZW5pbmdCYWxUb3RhbFVzZCArIHNlbmRUb3RhbFVzZCArIHJlY2VpdmVUb3RhbFVzZDtcclxuICAgIHRoaXMuY2xvc2luZ0JhbGFuY2UgPSBOdW1iZXIocmF3Q2xvc2luZ1VzZC50b0ZpeGVkKDMpKTsgLy8gbnVtZXJpYyBVU0RcclxuICBcclxuICAgIC8vIFNldHRsZW1lbnQgY3VycmVuY3kgdG90YWxzIChuZXcpXHJcbiAgICBjb25zdCBvcGVuaW5nU2V0dGxlID0gKHRoaXMub3BlbmluZ0JhbEFuZEZ1bmRpbmcgfHwgW10pLnJlZHVjZShcclxuICAgICAgKHN1bSwgcjogYW55KSA9PiBzdW0gKyAoTnVtYmVyKHIuYW1vdW50SW5TZXR0bG1lbnRDY3kpIHx8IDApLCAwXHJcbiAgICApO1xyXG4gICAgY29uc3Qgc2VuZFNldHRsZSA9ICh0aGlzLnNlbmREZXRhaWxzIHx8IFtdKS5yZWR1Y2UoXHJcbiAgICAgIChzdW0sIHI6IGFueSkgPT4gc3VtICsgKE51bWJlcihyLmFtb3VudEluU2V0dGxtZW50Q2N5KSB8fCAwKSwgMFxyXG4gICAgKTtcclxuICAgIGNvbnN0IHJlY2VpdmVTZXR0bGUgPSAodGhpcy5yZWNlaXZlRGV0YWlscyB8fCBbXSkucmVkdWNlKFxyXG4gICAgICAoc3VtLCByOiBhbnkpID0+IHN1bSArIChOdW1iZXIoci5hbW91bnRJblNldHRsbWVudENjeSkgfHwgMCksIDBcclxuICAgICk7XHJcbiAgICBjb25zdCByYXdDbG9zaW5nU2V0dGxlID0gb3BlbmluZ1NldHRsZSArIHNlbmRTZXR0bGUgKyByZWNlaXZlU2V0dGxlO1xyXG4gICAgdGhpcy5jbG9zaW5nQmFsYW5jZUluU2V0dGxtZW50ID0gTnVtYmVyKHJhd0Nsb3NpbmdTZXR0bGUudG9GaXhlZCgzKSk7XHJcbiAgXHJcbiAgICAvLyBwaWNrIGEgc2V0dGxlbWVudCBjdXJyZW5jeSB0byBkaXNwbGF5IChmaXJzdCBub24tZW1wdHkpXHJcbiAgICB0aGlzLmNsb3NpbmdCYWxhbmNlU2V0dGxtZW50Q3VycmVuY3kgPSB0aGlzLmdldEZpcnN0U2V0dGxlbWVudEN1cnJlbmN5KCk7XHJcblxyXG4gICAgLy8gZm9ybWF0dGVkIHN0cmluZ3MgKG5vLXRob3VzYW5kLWNvbW1hLCAzIGRlY2ltYWxzKVxyXG4gICAgdGhpcy5jbG9zaW5nQmFsYW5jZUluVXNkRm9ybWF0dGVkID0gdGhpcy5mb3JtYXROb0NvbW1hKHRoaXMuY2xvc2luZ0JhbGFuY2UpO1xyXG4gICAgdGhpcy5jbG9zaW5nQmFsYW5jZVNldHRsbWVudEZvcm1hdHRlZCA9IHRoaXMuZm9ybWF0Tm9Db21tYSh0aGlzLmNsb3NpbmdCYWxhbmNlSW5TZXR0bG1lbnQpO1xyXG4gIFxyXG4gICAgdGhpcy5jbG9zaW5nQmFsYW5jZVVTREluV29yZHMgPSB0aGlzLm51bWJlclRvV29yZHModGhpcy5jbG9zaW5nQmFsYW5jZSk7XHJcbiAgICB0aGlzLmNsb3NpbmdCYWxhbmNlU2V0dGxtZW50SW5Xb3JkcyA9XHJcbiAgICAgIHRoaXMuY2xvc2luZ0JhbGFuY2VJblNldHRsbWVudCAhPT0gbnVsbCAmJlxyXG4gICAgICB0aGlzLmNsb3NpbmdCYWxhbmNlSW5TZXR0bG1lbnQgIT09IHVuZGVmaW5lZCAmJlxyXG4gICAgICAhaXNOYU4oTnVtYmVyKHRoaXMuY2xvc2luZ0JhbGFuY2VJblNldHRsbWVudCkpXHJcbiAgICAgICAgPyB0aGlzLm51bWJlclRvV29yZHModGhpcy5jbG9zaW5nQmFsYW5jZUluU2V0dGxtZW50KVxyXG4gICAgICAgIDogJyc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZvcm1hdE5vQ29tbWEodmFsdWU6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xyXG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgaXNOYU4oTnVtYmVyKHZhbHVlKSkpIHJldHVybiAnMC4wMDAnO1xyXG4gICAgY29uc3QgbnVtID0gTnVtYmVyKHZhbHVlKTtcclxuICAgIGNvbnN0IHRydW5jYXRlZCA9IE1hdGgudHJ1bmMobnVtICogMTAwMCkgLyAxMDAwO1xyXG4gICAgcmV0dXJuIHRydW5jYXRlZC50b0ZpeGVkKDMpO1xyXG4gIH1cclxuICBcclxuICBcclxuICBwcml2YXRlIGdldEZpcnN0U2V0dGxlbWVudEN1cnJlbmN5KCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCB0cnlHZXQgPSAoYXJyOiBhbnlbXSkgPT4ge1xyXG4gICAgICBpZiAoIWFyciB8fCBhcnIubGVuZ3RoID09PSAwKSByZXR1cm4gJyc7XHJcbiAgICAgIGZvciAoY29uc3QgciBvZiBhcnIpIHtcclxuICAgICAgICBpZiAociAmJiByLnNldHRsbWVudENjeSkgcmV0dXJuIHIuc2V0dGxtZW50Q2N5O1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiAnJztcclxuICAgIH07XHJcbiAgXHJcbiAgICByZXR1cm4gdHJ5R2V0KHRoaXMub3BlbmluZ0JhbEFuZEZ1bmRpbmcpIHx8IHRyeUdldCh0aGlzLnNlbmREZXRhaWxzKSB8fCB0cnlHZXQodGhpcy5yZWNlaXZlRGV0YWlscykgfHwgJyc7XHJcbiAgfVxyXG4gIFxyXG4gICAgbnVtYmVyVG9Xb3JkcyhudW06IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAgIGlmIChudW0gPT09IDApIHJldHVybiBcIlplcm8gUG9pbnQgWmVybyBaZXJvIFplcm8gT25seVwiO1xyXG4gIFxyXG4gICAgICBsZXQgcmVzdWx0ID0gXCJcIjtcclxuICBcclxuICAgICAgLy8gSGFuZGxlIG5lZ2F0aXZlIG51bWJlcnNcclxuICAgICAgaWYgKG51bSA8IDApIHtcclxuICAgICAgICByZXN1bHQgPSBcIk5lZ2F0aXZlIFwiO1xyXG4gICAgICAgIG51bSA9IE1hdGguYWJzKG51bSk7XHJcbiAgICAgIH1cclxuICBcclxuICAgICAgLy8gU3BsaXQgaW50ZWdlciBhbmQgZGVjaW1hbCBwYXJ0c1xyXG4gICAgICBjb25zdCBpbnRlZ2VyUGFydCA9IE1hdGguZmxvb3IobnVtKTtcclxuICAgICAgY29uc3QgZGVjaW1hbFBhcnQgPSBNYXRoLnJvdW5kKChudW0gLSBpbnRlZ2VyUGFydCkgKiAxMDAwKTsgLy8gdXAgdG8gMyBkZWNpbWFsIHBsYWNlc1xyXG4gIFxyXG4gICAgICByZXN1bHQgKz0gdGhpcy5jb252ZXJ0TnVtYmVyKGludGVnZXJQYXJ0KTtcclxuICBcclxuICAgICAgaWYgKGRlY2ltYWxQYXJ0ID4gMCkge1xyXG4gICAgICAgIHJlc3VsdCArPSBcIiBQb2ludFwiO1xyXG4gICAgICAgIGNvbnN0IGRlY2ltYWxTdHIgPSBkZWNpbWFsUGFydC50b1N0cmluZygpLnBhZFN0YXJ0KDMsIFwiMFwiKTsgLy8ga2VlcCAzIGRpZ2l0c1xyXG4gICAgICAgIGZvciAoY29uc3QgZGlnaXQgb2YgZGVjaW1hbFN0cikge1xyXG4gICAgICAgICAgcmVzdWx0ICs9IFwiIFwiICsgdGhpcy5vbmVzWytkaWdpdF07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgXHJcbiAgICAgIHJldHVybiByZXN1bHQgKyBcIiBPbmx5XCI7XHJcbiAgICB9XHJcbiAgXHJcbiAgICAvLyBIZWxwZXIgYXJyYXlzXHJcbiAgICBwcml2YXRlIG9uZXMgPSBbXCJaZXJvXCIsIFwiT25lXCIsIFwiVHdvXCIsIFwiVGhyZWVcIiwgXCJGb3VyXCIsIFwiRml2ZVwiLCBcIlNpeFwiLCBcIlNldmVuXCIsIFwiRWlnaHRcIiwgXCJOaW5lXCJdO1xyXG4gICAgcHJpdmF0ZSB0ZWVucyA9IFtcIlRlblwiLCBcIkVsZXZlblwiLCBcIlR3ZWx2ZVwiLCBcIlRoaXJ0ZWVuXCIsIFwiRm91cnRlZW5cIiwgXCJGaWZ0ZWVuXCIsIFwiU2l4dGVlblwiLCBcIlNldmVudGVlblwiLCBcIkVpZ2h0ZWVuXCIsIFwiTmluZXRlZW5cIl07XHJcbiAgICBwcml2YXRlIHRlbnMgPSBbXCJcIiwgXCJcIiwgXCJUd2VudHlcIiwgXCJUaGlydHlcIiwgXCJGb3J0eVwiLCBcIkZpZnR5XCIsIFwiU2l4dHlcIiwgXCJTZXZlbnR5XCIsIFwiRWlnaHR5XCIsIFwiTmluZXR5XCJdO1xyXG4gIFxyXG4gICAgLy8gQ29udmVydCB3aG9sZSBudW1iZXJzIChJbmRpYW4vSW50ZXJuYXRpb25hbCBzeXN0ZW0pXHJcbiAgICBwcml2YXRlIGNvbnZlcnROdW1iZXIobnVtOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgICBpZiAobnVtID09PSAwKSByZXR1cm4gXCJcIjtcclxuICAgICAgaWYgKG51bSA8IDEwKSByZXR1cm4gdGhpcy5vbmVzW251bV07XHJcbiAgICAgIGlmIChudW0gPCAyMCkgcmV0dXJuIHRoaXMudGVlbnNbbnVtIC0gMTBdO1xyXG4gICAgICBpZiAobnVtIDwgMTAwKSByZXR1cm4gdGhpcy50ZW5zW01hdGguZmxvb3IobnVtIC8gMTApXSArIChudW0gJSAxMCAhPT0gMCA/IFwiIFwiICsgdGhpcy5vbmVzW251bSAlIDEwXSA6IFwiXCIpO1xyXG4gICAgICBpZiAobnVtIDwgMTAwMCkgcmV0dXJuIHRoaXMuY29udmVydE51bWJlcihNYXRoLmZsb29yKG51bSAvIDEwMCkpICsgXCIgSHVuZHJlZFwiICsgKG51bSAlIDEwMCAhPT0gMCA/IFwiIFwiICsgdGhpcy5jb252ZXJ0TnVtYmVyKG51bSAlIDEwMCkgOiBcIlwiKTtcclxuICAgICAgaWYgKG51bSA8IDEwMDAwMDApIHJldHVybiB0aGlzLmNvbnZlcnROdW1iZXIoTWF0aC5mbG9vcihudW0gLyAxMDAwKSkgKyBcIiBUaG91c2FuZFwiICsgKG51bSAlIDEwMDAgIT09IDAgPyBcIiBcIiArIHRoaXMuY29udmVydE51bWJlcihudW0gJSAxMDAwKSA6IFwiXCIpO1xyXG4gICAgICBpZiAobnVtIDwgMTAwMDAwMDAwMCkgcmV0dXJuIHRoaXMuY29udmVydE51bWJlcihNYXRoLmZsb29yKG51bSAvIDEwMDAwMDApKSArIFwiIE1pbGxpb25cIiArIChudW0gJSAxMDAwMDAwICE9PSAwID8gXCIgXCIgKyB0aGlzLmNvbnZlcnROdW1iZXIobnVtICUgMTAwMDAwMCkgOiBcIlwiKTtcclxuICAgICAgcmV0dXJuIHRoaXMuY29udmVydE51bWJlcihNYXRoLmZsb29yKG51bSAvIDEwMDAwMDAwMDApKSArIFwiIEJpbGxpb25cIiArIChudW0gJSAxMDAwMDAwMDAwICE9PSAwID8gXCIgXCIgKyB0aGlzLmNvbnZlcnROdW1iZXIobnVtICUgMTAwMDAwMDAwMCkgOiBcIlwiKTtcclxuICAgIH1cclxuXHJcbiAgb25FeHBvcnRDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3RlZEV4cG9ydE9wdGlvbiA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlRXhwb3J0KG9wdGlvbjogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkRXhwb3J0T3B0aW9uID0gb3B0aW9uO1xyXG4gICAgc3dpdGNoICgodGhpcy5zZWxlY3RlZEV4cG9ydE9wdGlvbiB8fCAnJykudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICBjYXNlICdwZGYnOiB0aGlzLmV4cG9ydFRvUERGKCk7IGJyZWFrO1xyXG4gICAgICBjYXNlICdleGNlbCc6IHRoaXMuZXhwb3J0VG9FeGNlbCgpOyBicmVhaztcclxuICAgICAgY2FzZSAnY3N2JzogdGhpcy5leHBvcnRUb0NTVigpOyBicmVhaztcclxuICAgICAgZGVmYXVsdDogY29uc29sZS53YXJuKCdVbmtub3duIGV4cG9ydCB0eXBlOicsIHRoaXMuc2VsZWN0ZWRFeHBvcnRPcHRpb24pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZXhwb3J0VG9QREYoKTogdm9pZCB7XHJcbiAgY29uc3Qgc2VjdGlvbnMgPSB0aGlzLmdldFZpc2libGVHcmlkcygpXHJcbiAgICAubWFwKHMgPT4ge1xyXG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5nZXREaXNwbGF5ZWREYXRhKHMuYXBpKTtcclxuICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuZ2V0SGVhZGVycygpO1xyXG4gICAgICBsZXQgcm93cyA9IHRoaXMuYnVpbGRSb3dzKGRhdGEpO1xyXG5cclxuICAgICAgaWYgKHMudGl0bGUgPT09ICdTZW5kIERldGFpbHMnICYmIHRoaXMuc2VuZFBpbm5lZEJvdHRvbVJvdz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgcm93cyA9IHJvd3MuY29uY2F0KHRoaXMuYnVpbGRSb3dzKHRoaXMuc2VuZFBpbm5lZEJvdHRvbVJvdykpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChzLnRpdGxlID09PSAnUmVjZWl2ZSBEZXRhaWxzJyAmJiB0aGlzLnJlY2VpdmVQaW5uZWRCb3R0b21Sb3c/Lmxlbmd0aCkge1xyXG4gICAgICAgIHJvd3MgPSByb3dzLmNvbmNhdCh0aGlzLmJ1aWxkUm93cyh0aGlzLnJlY2VpdmVQaW5uZWRCb3R0b21Sb3cpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHJvd3MubGVuZ3RoID8geyB0aXRsZTogcy50aXRsZSwgaGVhZGVycywgcm93cyB9IDogbnVsbDtcclxuICAgIH0pXHJcbiAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIHsgdGl0bGU6IHN0cmluZzsgaGVhZGVyczogc3RyaW5nW107IHJvd3M6IGFueVtdW10gfVtdO1xyXG4gIGlmICghc2VjdGlvbnMubGVuZ3RoKSByZXR1cm47XHJcblxyXG4gIGNvbnN0IGRvYyA9IG5ldyBqc1BERih7IG9yaWVudGF0aW9uOiAnbGFuZHNjYXBlJywgdW5pdDogJ21tJywgZm9ybWF0OiAnYTQnIH0pO1xyXG5cclxuICBpZiAodGhpcy5sb2dvQmFzZTY0KSB7XHJcbiAgICBkb2MuYWRkSW1hZ2UodGhpcy5sb2dvQmFzZTY0LCAnUE5HJywgMTUsIDEwLCAzOCwgMTgpO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgcGFnZVdpZHRoID0gZG9jLmludGVybmFsLnBhZ2VTaXplLmdldFdpZHRoKCk7XHJcbiAgY29uc3QgcGFnZUhlaWdodCA9IGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5nZXRIZWlnaHQoKTtcclxuICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcclxuICBkb2Muc2V0Rm9udFNpemUoMTUpO1xyXG4gIGRvYy50ZXh0KHRoaXMuUmVwb3J0TmFtZSwgcGFnZVdpZHRoIC8gMiwgMTgsIHsgYWxpZ246ICdjZW50ZXInIH0pO1xyXG5cclxuICBsZXQgeSA9IDM0OyBcclxuICBkb2Muc2V0Rm9udFNpemUoMTApO1xyXG4gIE9iamVjdC5lbnRyaWVzKHRoaXMubWV0YURhdGFPbmUgfHwge30pLmZvckVhY2goKFtrLCB2XSkgPT4ge1xyXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XHJcbiAgICBkb2MudGV4dChgJHtrfTogYCwgMTUsIHkpO1xyXG4gICAgY29uc3QgdyA9IGRvYy5nZXRUZXh0V2lkdGgoYCR7a306IGApO1xyXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdub3JtYWwnKTtcclxuICAgIGRvYy50ZXh0KFN0cmluZyh2ID8/ICcnKSwgMTUgKyB3LCB5KTtcclxuICAgIHkgKz0gNjtcclxuICB9KTtcclxuXHJcbiAgY29uc3QgSEVBRCA9IHRoaXMuZ2V0SGVhZGVycygpO1xyXG5cclxuICBjb25zdCBtYXJnaW4gPSB7IGxlZnQ6IDE1LCByaWdodDogMTUgfTtcclxuICBjb25zdCBhdmFpbCA9IHBhZ2VXaWR0aCAtIG1hcmdpbi5sZWZ0IC0gbWFyZ2luLnJpZ2h0O1xyXG4gIGNvbnN0IHdlaWdodHMgPSBbNCwgMSwgMiwgMl07XHJcbiAgY29uc3Qgc3VtID0gd2VpZ2h0cy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcclxuICBjb25zdCB3aWR0aHMgPSB3ZWlnaHRzLm1hcCh3ID0+ICh3IC8gc3VtKSAqIGF2YWlsKTtcclxuXHJcbiAgY29uc3Qgc2hhcmVkQ29sdW1uU3R5bGVzID0ge1xyXG4gICAgMDogeyBjZWxsV2lkdGg6IHdpZHRoc1swXSB9LFxyXG4gICAgMTogeyBjZWxsV2lkdGg6IHdpZHRoc1sxXSB9LCAgICAgICAgICAgICAgICAgIFxyXG4gICAgMjogeyBjZWxsV2lkdGg6IHdpZHRoc1syXSwgaGFsaWduOiAncmlnaHQnIH0sIFxyXG4gICAgMzogeyBjZWxsV2lkdGg6IHdpZHRoc1szXSwgaGFsaWduOiAncmlnaHQnIH0gIFxyXG4gIH07XHJcblxyXG4gIGNvbnN0IHRpdGxlR2FwQWJvdmVGaXJzdCA9IDA7XHJcbiAgY29uc3QgdGl0bGVHYXBBYm92ZURlZmF1bHQgPSA0O1xyXG4gIGNvbnN0IHRpdGxlR2FwQWJvdmVCaWcgPSA2O1xyXG4gIGNvbnN0IHRpdGxlVG9UYWJsZUdhcCA9IDI7XHJcbiAgY29uc3QgdG9wU3RhcnRZID0gMjA7XHJcbiAgY29uc3QgYm90dG9tUmVzZXJ2ZSA9IDIwO1xyXG5cclxuICBzZWN0aW9ucy5mb3JFYWNoKChzLCBpZHgpID0+IHtcclxuICAgIGNvbnN0IGlzRmlyc3QgPSBpZHggPT09IDA7XHJcbiAgICBjb25zdCBpc1NlbmRPclJlY2VpdmUgPSBzLnRpdGxlID09PSAnU2VuZCBEZXRhaWxzJyB8fCBzLnRpdGxlID09PSAnUmVjZWl2ZSBEZXRhaWxzJztcclxuICAgIGNvbnN0IHByZVRpdGxlR2FwID0gaXNGaXJzdCA/IDAgOiAoaXNTZW5kT3JSZWNlaXZlID8gdGl0bGVHYXBBYm92ZUJpZyA6IHRpdGxlR2FwQWJvdmVEZWZhdWx0KTtcclxuXHJcbiAgICBpZiAoeSArIHByZVRpdGxlR2FwICsgdGl0bGVUb1RhYmxlR2FwID4gcGFnZUhlaWdodCAtIGJvdHRvbVJlc2VydmUpIHtcclxuICAgICAgZG9jLmFkZFBhZ2UoKTtcclxuICAgICAgeSA9IHRvcFN0YXJ0WTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHkgKz0gcHJlVGl0bGVHYXA7XHJcbiAgICB9XHJcblxyXG4gICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XHJcbiAgICBkb2Muc2V0Rm9udFNpemUoMTEpO1xyXG4gICAgZG9jLnRleHQocy50aXRsZSwgbWFyZ2luLmxlZnQsIHkpO1xyXG5cclxuICAgIGNvbnN0IHN0YXJ0WUZvclRhYmxlID0geSArIChpc0ZpcnN0ID8gMCA6IHRpdGxlVG9UYWJsZUdhcCk7XHJcblxyXG4gICAgZG9jLmF1dG9UYWJsZSh7XHJcbiAgICAgIGhlYWQ6IFtIRUFEXSxcclxuICAgICAgYm9keTogcy5yb3dzLFxyXG4gICAgICBzdGFydFk6IHN0YXJ0WUZvclRhYmxlLFxyXG4gICAgICB0aGVtZTogJ2dyaWQnLFxyXG4gICAgICBtYXJnaW4sXHJcbiAgICAgIHRhYmxlV2lkdGg6IGF2YWlsLFxyXG4gICAgICBjb2x1bW5TdHlsZXM6IHNoYXJlZENvbHVtblN0eWxlcyxcclxuICAgICAgaGVhZFN0eWxlczogeyBmaWxsQ29sb3I6IFsyMjAsIDIyMCwgMjIwXSwgdGV4dENvbG9yOiAwLCBmb250U3R5bGU6ICdib2xkJywgZm9udFNpemU6IDksIGhhbGlnbjogJ2NlbnRlcicgfSxcclxuICAgICAgYm9keVN0eWxlczogeyBmb250U2l6ZTogOCB9LFxyXG4gICAgICBzdHlsZXM6IHsgY2VsbFBhZGRpbmc6IDIsIG92ZXJmbG93OiAnbGluZWJyZWFrJywgbWluQ2VsbEhlaWdodDogNiB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB5ID0gKGRvYyBhcyBhbnkpLmxhc3RBdXRvVGFibGUuZmluYWxZO1xyXG4gIH0pO1xyXG4gIGlmICh5ICsgMzAgPiBwYWdlSGVpZ2h0IC0gYm90dG9tUmVzZXJ2ZSkge1xyXG4gICAgZG9jLmFkZFBhZ2UoKTtcclxuICAgIHkgPSB0b3BTdGFydFk7XHJcbiAgfVxyXG5cclxuICBjb25zdCBjbG9zaW5nQm9keSA9IFtcclxuICAgIFtcclxuICAgICAgeyBjb250ZW50OiAnQ2xvc2luZyBCYWxhbmNlJywgY29sU3BhbjogMiwgc3R5bGVzOiB7IGhhbGlnbjogJ2xlZnQnLCBmb250U3R5bGU6ICdib2xkJyB9IH0sXHJcbiAgICAgIHsgY29udGVudDogTnVtYmVyKHRoaXMuY2xvc2luZ0JhbGFuY2VJblNldHRsbWVudCB8fCAwKS50b0ZpeGVkKDMpLCBzdHlsZXM6IHsgaGFsaWduOiAncmlnaHQnIH0gfSxcclxuICAgICAgeyBjb250ZW50OiBOdW1iZXIodGhpcy5jbG9zaW5nQmFsYW5jZSB8fCAwKS50b0ZpeGVkKDMpLCBzdHlsZXM6IHsgaGFsaWduOiAncmlnaHQnIH0gfVxyXG4gICAgXSxcclxuICAgIFtcclxuICAgICAgeyBjb250ZW50OiBgJHt0aGlzLmNsb3NpbmdCYWxhbmNlU2V0dGxtZW50Q3VycmVuY3kgfHwgJyd9IC0gJHt0aGlzLmNsb3NpbmdCYWxhbmNlU2V0dGxtZW50SW5Xb3JkcyB8fCAnJ31gLCBjb2xTcGFuOiA0LCBzdHlsZXM6IHsgaGFsaWduOiAnbGVmdCcgfSB9XHJcbiAgICBdLFxyXG4gICAgW1xyXG4gICAgICB7IGNvbnRlbnQ6IGAke3RoaXMuY2xvc2luZ0JhbGFuY2VDdXJyZW5jeSB8fCAnJ30gLSAke3RoaXMuY2xvc2luZ0JhbGFuY2VVU0RJbldvcmRzIHx8ICcnfWAsIGNvbFNwYW46IDQsIHN0eWxlczogeyBoYWxpZ246ICdsZWZ0JyB9IH1cclxuICAgIF1cclxuICBdO1xyXG5cclxuICBkb2MuYXV0b1RhYmxlKHtcclxuICAgIGJvZHk6IGNsb3NpbmdCb2R5LFxyXG4gICAgc3RhcnRZOiB5LFxyXG4gICAgdGhlbWU6ICdncmlkJyxcclxuICAgIG1hcmdpbixcclxuICAgIHRhYmxlV2lkdGg6IGF2YWlsLFxyXG4gICAgY29sdW1uU3R5bGVzOiBzaGFyZWRDb2x1bW5TdHlsZXMsXHJcbiAgICBzdHlsZXM6IHsgY2VsbFBhZGRpbmc6IDIsIGZvbnRTaXplOiA5IH1cclxuICB9KTtcclxuXHJcbiAgZG9jLnNhdmUoJ1N0YXRlbWVudF9vZl9BY2NvdW50cy5wZGYnKTtcclxufVxyXG5cclxuICBleHBvcnRUb0V4Y2VsKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgc2VjdGlvbnMgPSB0aGlzLmdldFZpc2libGVHcmlkcygpXHJcbiAgICAgIC5tYXAocyA9PiB7XHJcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0RGlzcGxheWVkRGF0YShzLmFwaSk7XHJcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuZ2V0SGVhZGVycygpO1xyXG4gICAgICAgIGxldCByb3dzID0gdGhpcy5idWlsZFJvd3MoZGF0YSk7XHJcbiAgXHJcbiAgICAgICAgaWYgKHMudGl0bGUgPT09ICdTZW5kIERldGFpbHMnICYmIHRoaXMuc2VuZFBpbm5lZEJvdHRvbVJvdz8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICByb3dzID0gcm93cy5jb25jYXQodGhpcy5idWlsZFJvd3ModGhpcy5zZW5kUGlubmVkQm90dG9tUm93KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzLnRpdGxlID09PSAnUmVjZWl2ZSBEZXRhaWxzJyAmJiB0aGlzLnJlY2VpdmVQaW5uZWRCb3R0b21Sb3c/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgcm93cyA9IHJvd3MuY29uY2F0KHRoaXMuYnVpbGRSb3dzKHRoaXMucmVjZWl2ZVBpbm5lZEJvdHRvbVJvdykpO1xyXG4gICAgICAgIH1cclxuICBcclxuICAgICAgICByZXR1cm4gcm93cy5sZW5ndGggPyB7IHRpdGxlOiBzLnRpdGxlLCBoZWFkZXJzLCByb3dzIH0gOiBudWxsO1xyXG4gICAgICB9KVxyXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIHsgdGl0bGU6IHN0cmluZzsgaGVhZGVyczogc3RyaW5nW107IHJvd3M6IGFueVtdW10gfVtdO1xyXG4gIFxyXG4gICAgaWYgKCFzZWN0aW9ucy5sZW5ndGgpIHJldHVybjtcclxuICBcclxuICAgIGNvbnN0IHdiID0gbmV3IEV4Y2VsSlMuV29ya2Jvb2soKTtcclxuICAgIGNvbnN0IHdzID0gd2IuYWRkV29ya3NoZWV0KCdTdGF0ZW1lbnQgb2YgQWNjb3VudHMnKTtcclxuICAgIGxldCByID0gMTtcclxuICBcclxuICAgIGlmICh0aGlzLmxvZ29CYXNlNjQpIHtcclxuICAgICAgY29uc3QgaW1nSWQgPSB3Yi5hZGRJbWFnZSh7IGJhc2U2NDogdGhpcy5sb2dvQmFzZTY0LCBleHRlbnNpb246ICdwbmcnIH0pO1xyXG4gICAgICB3cy5hZGRJbWFnZShpbWdJZCwgeyB0bDogeyBjb2w6IDAsIHJvdzogMCB9LCBleHQ6IHsgd2lkdGg6IDE0NSwgaGVpZ2h0OiA2NiB9LCBlZGl0QXM6ICdvbmVDZWxsJyB9KTtcclxuICAgIH1cclxuICBcclxuICAgIHdzLmdldFJvdyhyKS5nZXRDZWxsKDIpLnZhbHVlID0gdGhpcy5SZXBvcnROYW1lO1xyXG4gICAgd3MuZ2V0Um93KHIpLmdldENlbGwoMikuZm9udCA9IHsgYm9sZDogdHJ1ZSwgc2l6ZTogMTYgfTtcclxuICAgIHIgKz0gMztcclxuICBcclxuICAgIE9iamVjdC5lbnRyaWVzKHRoaXMubWV0YURhdGFPbmUgfHwge30pLmZvckVhY2goKFtrLCB2XSkgPT4ge1xyXG4gICAgICB3cy5nZXRSb3cocisrKS5nZXRDZWxsKDEpLnZhbHVlID0gYCR7a306ICR7diA/PyAnJ31gO1xyXG4gICAgfSk7XHJcbiAgXHJcbiAgICBjb25zdCB3cml0ZVNlY3Rpb24gPSAoc2VjOiB7IHRpdGxlOiBzdHJpbmc7IGhlYWRlcnM6IHN0cmluZ1tdOyByb3dzOiBhbnlbXVtdIH0pID0+IHtcclxuICAgICAgd3MuZ2V0Um93KHIrKykuZ2V0Q2VsbCgxKS52YWx1ZSA9IHNlYy50aXRsZTtcclxuICBcclxuICAgICAgY29uc3QgaGVhZGVyUm93ID0gd3MuZ2V0Um93KHIrKyk7XHJcbiAgICAgIHNlYy5oZWFkZXJzLmZvckVhY2goKGgsIGkpID0+IHtcclxuICAgICAgICBjb25zdCBjID0gaGVhZGVyUm93LmdldENlbGwoaSArIDEpO1xyXG4gICAgICAgIGMudmFsdWUgPSBoO1xyXG4gICAgICAgIGMuZm9udCA9IHsgYm9sZDogdHJ1ZSB9O1xyXG4gICAgICAgIGMuYWxpZ25tZW50ID0geyB2ZXJ0aWNhbDogJ21pZGRsZScsIGhvcml6b250YWw6ICdjZW50ZXInIH07XHJcbiAgICAgICAgYy5maWxsID0geyB0eXBlOiAncGF0dGVybicsIHBhdHRlcm46ICdzb2xpZCcsIGZnQ29sb3I6IHsgYXJnYjogJ0Q5RDlEOScgfSB9O1xyXG4gICAgICAgIGMuYm9yZGVyID0geyB0b3A6IHsgc3R5bGU6ICd0aGluJyB9LCBib3R0b206IHsgc3R5bGU6ICd0aGluJyB9LCBsZWZ0OiB7IHN0eWxlOiAndGhpbicgfSwgcmlnaHQ6IHsgc3R5bGU6ICd0aGluJyB9IH07XHJcbiAgICAgIH0pO1xyXG4gIFxyXG4gICAgICBjb25zdCBkYXRhU3RhcnQgPSByO1xyXG4gIFxyXG4gICAgICBzZWMucm93cy5mb3JFYWNoKHJvd0RhdGEgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJvdyA9IHdzLmdldFJvdyhyKyspO1xyXG4gICAgICAgIHJvd0RhdGEuZm9yRWFjaCgodiwgaSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgYyA9IHJvdy5nZXRDZWxsKGkgKyAxKTtcclxuICAgICAgICAgIGlmIChzZWMuaGVhZGVyc1tpXSA9PT0gJ0Ftb3VudCBJbiBTZXR0bG1lbnQgQ2N5JyB8fCBzZWMuaGVhZGVyc1tpXSA9PT0gJ0Ftb3VudCBJbiBVU0QnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG51bSA9IHR5cGVvZiB2ID09PSAnc3RyaW5nJyA/IE51bWJlcih2LnJlcGxhY2UoL1ssIF0rL2csICcnKSkgOiBOdW1iZXIodik7XHJcbiAgICAgICAgICAgIGMudmFsdWUgPSBpc05hTihudW0pID8gKHYgPz8gJycpIDogbnVtO1xyXG4gICAgICAgICAgICBjLmFsaWdubWVudCA9IHsgaG9yaXpvbnRhbDogJ3JpZ2h0JyB9O1xyXG4gICAgICAgICAgICBpZiAoIWlzTmFOKG51bSkpIGMubnVtRm10ID0gJzAuMDAwJztcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGMudmFsdWUgPSB2ID8/ICcnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYy5ib3JkZXIgPSB7IHRvcDogeyBzdHlsZTogJ3RoaW4nIH0sIGJvdHRvbTogeyBzdHlsZTogJ3RoaW4nIH0sIGxlZnQ6IHsgc3R5bGU6ICd0aGluJyB9LCByaWdodDogeyBzdHlsZTogJ3RoaW4nIH0gfTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgXHJcbiAgICAgIGZvciAobGV0IGNvbCA9IDE7IGNvbCA8PSBzZWMuaGVhZGVycy5sZW5ndGg7IGNvbCsrKSB7XHJcbiAgICAgICAgbGV0IG1heCA9IChzZWMuaGVhZGVyc1tjb2wgLSAxXSB8fCAnJykudG9TdHJpbmcoKS5sZW5ndGg7XHJcbiAgICAgICAgZm9yIChsZXQgcnIgPSBkYXRhU3RhcnQgLSAxOyByciA8IHI7IHJyKyspIHtcclxuICAgICAgICAgIGNvbnN0IHZhbCA9ICh3cy5nZXRSb3cocnIpLmdldENlbGwoY29sKS52YWx1ZSA/PyAnJykudG9TdHJpbmcoKTtcclxuICAgICAgICAgIGlmICh2YWwpIG1heCA9IE1hdGgubWF4KG1heCwgdmFsLmxlbmd0aCArIDIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB3cy5nZXRDb2x1bW4oY29sKS53aWR0aCA9IE1hdGgubWluKE1hdGgubWF4KG1heCwgOCksIDYwKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICBcclxuICAgIHNlY3Rpb25zLmZvckVhY2goKHNlYywgaWR4KSA9PiB7XHJcbiAgICAgIHdyaXRlU2VjdGlvbihzZWMpO1xyXG4gICAgICBpZiAoaWR4IDwgc2VjdGlvbnMubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgIHIrKztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgXHJcbiAgICBjb25zdCB0b3RhbENvbHMgPSBzZWN0aW9ucy5sZW5ndGhcclxuICAgICAgPyBNYXRoLm1heCguLi5zZWN0aW9ucy5tYXAocyA9PiBzLmhlYWRlcnMubGVuZ3RoKSlcclxuICAgICAgOiB0aGlzLmNvbHVtbkRlZnMubGVuZ3RoO1xyXG4gICAgY29uc3QgY29scyA9IE1hdGgubWF4KHRvdGFsQ29scywgNCk7XHJcbiAgICBjb25zdCBsYWJlbENvbHNFbmQgPSAyO1xyXG4gICAgY29uc3Qgc2V0dGxlQ29sID0gMzsgICAgICBcclxuICAgIGNvbnN0IHVzZENvbCA9IDQ7XHJcbiAgXHJcbiAgICBjb25zdCByb3cxID0gd3MuZ2V0Um93KHIrKyk7XHJcbiAgICB3cy5tZXJnZUNlbGxzKHJvdzEubnVtYmVyLCAxLCByb3cxLm51bWJlciwgbGFiZWxDb2xzRW5kKTtcclxuICAgIHJvdzEuZ2V0Q2VsbCgxKS52YWx1ZSA9ICdDbG9zaW5nIEJhbGFuY2UnO1xyXG4gICAgcm93MS5nZXRDZWxsKDEpLmZvbnQgPSB7IGJvbGQ6IHRydWUgfTtcclxuICAgIHJvdzEuZ2V0Q2VsbCgxKS5hbGlnbm1lbnQgPSB7IGhvcml6b250YWw6ICdsZWZ0JywgdmVydGljYWw6ICdtaWRkbGUnIH07XHJcbiAgXHJcbiAgICBjb25zdCBzZXR0bGVWYWx1ZSA9IE51bWJlcih0aGlzLmNsb3NpbmdCYWxhbmNlSW5TZXR0bG1lbnQgPz8gMCk7XHJcbiAgICBjb25zdCB1c2RWYWx1ZSA9IE51bWJlcih0aGlzLmNsb3NpbmdCYWxhbmNlID8/IDApO1xyXG4gIFxyXG4gICAgY29uc3Qgc2V0dGxlQ2VsbCA9IHJvdzEuZ2V0Q2VsbChzZXR0bGVDb2wpO1xyXG4gICAgc2V0dGxlQ2VsbC52YWx1ZSA9IGlzTmFOKHNldHRsZVZhbHVlKSA/ICcnIDogc2V0dGxlVmFsdWU7XHJcbiAgICBzZXR0bGVDZWxsLmFsaWdubWVudCA9IHsgaG9yaXpvbnRhbDogJ3JpZ2h0JyB9O1xyXG4gICAgaWYgKCFpc05hTihzZXR0bGVWYWx1ZSkpIHNldHRsZUNlbGwubnVtRm10ID0gJzAuMDAwJztcclxuICBcclxuICAgIGNvbnN0IHVzZENlbGwgPSByb3cxLmdldENlbGwodXNkQ29sKTtcclxuICAgIHVzZENlbGwudmFsdWUgPSBpc05hTih1c2RWYWx1ZSkgPyAnJyA6IHVzZFZhbHVlO1xyXG4gICAgdXNkQ2VsbC5hbGlnbm1lbnQgPSB7IGhvcml6b250YWw6ICdyaWdodCcgfTtcclxuICAgIGlmICghaXNOYU4odXNkVmFsdWUpKSB1c2RDZWxsLm51bUZtdCA9ICcwLjAwMCc7XHJcblxyXG4gICAgZm9yIChsZXQgYyA9IDE7IGMgPD0gY29sczsgYysrKSB7XHJcbiAgICAgIHJvdzEuZ2V0Q2VsbChjKS5ib3JkZXIgPSB7XHJcbiAgICAgICAgdG9wOiB7IHN0eWxlOiAndGhpbicgfSxcclxuICAgICAgICBib3R0b206IHsgc3R5bGU6ICd0aGluJyB9LFxyXG4gICAgICAgIGxlZnQ6IHsgc3R5bGU6ICd0aGluJyB9LFxyXG4gICAgICAgIHJpZ2h0OiB7IHN0eWxlOiAndGhpbicgfVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJvdzIgPSB3cy5nZXRSb3cocisrKTtcclxuICAgIHdzLm1lcmdlQ2VsbHMocm93Mi5udW1iZXIsIDEsIHJvdzIubnVtYmVyLCBjb2xzKTtcclxuICAgIHJvdzIuZ2V0Q2VsbCgxKS52YWx1ZSA9IGAke3RoaXMuY2xvc2luZ0JhbGFuY2VTZXR0bG1lbnRDdXJyZW5jeSB8fCAnJ30gLSAke3RoaXMuY2xvc2luZ0JhbGFuY2VTZXR0bG1lbnRJbldvcmRzIHx8ICcnfWA7XHJcbiAgICByb3cyLmdldENlbGwoMSkuYWxpZ25tZW50ID0geyBob3Jpem9udGFsOiAnbGVmdCcsIHZlcnRpY2FsOiAnbWlkZGxlJyB9O1xyXG4gICAgcm93Mi5nZXRDZWxsKDEpLmZvbnQgPSB7IGl0YWxpYzogZmFsc2UgfTtcclxuICBcclxuICAgIGZvciAobGV0IGMgPSAxOyBjIDw9IGNvbHM7IGMrKykge1xyXG4gICAgICBjb25zdCBlZGdlOiBhbnkgPSB7IHRvcDogeyBzdHlsZTogJ3RoaW4nIH0sIGJvdHRvbTogeyBzdHlsZTogJ3RoaW4nIH0gfTtcclxuICAgICAgaWYgKGMgPT09IDEpIGVkZ2UubGVmdCA9IHsgc3R5bGU6ICd0aGluJyB9O1xyXG4gICAgICBpZiAoYyA9PT0gY29scykgZWRnZS5yaWdodCA9IHsgc3R5bGU6ICd0aGluJyB9O1xyXG4gICAgICByb3cyLmdldENlbGwoYykuYm9yZGVyID0gZWRnZTtcclxuICAgIH1cclxuICBcclxuICAgIGNvbnN0IHJvdzMgPSB3cy5nZXRSb3cocisrKTtcclxuICAgIHdzLm1lcmdlQ2VsbHMocm93My5udW1iZXIsIDEsIHJvdzMubnVtYmVyLCBjb2xzKTtcclxuICAgIHJvdzMuZ2V0Q2VsbCgxKS52YWx1ZSA9IGAke3RoaXMuY2xvc2luZ0JhbGFuY2VDdXJyZW5jeSB8fCAnJ30gLSAke3RoaXMuY2xvc2luZ0JhbGFuY2VVU0RJbldvcmRzIHx8ICcnfWA7XHJcbiAgICByb3czLmdldENlbGwoMSkuYWxpZ25tZW50ID0geyBob3Jpem9udGFsOiAnbGVmdCcsIHZlcnRpY2FsOiAnbWlkZGxlJyB9O1xyXG4gIFxyXG4gICAgZm9yIChsZXQgYyA9IDE7IGMgPD0gY29sczsgYysrKSB7XHJcbiAgICAgIGNvbnN0IGVkZ2U6IGFueSA9IHsgdG9wOiB7IHN0eWxlOiAndGhpbicgfSwgYm90dG9tOiB7IHN0eWxlOiAndGhpbicgfSB9O1xyXG4gICAgICBpZiAoYyA9PT0gMSkgZWRnZS5sZWZ0ID0geyBzdHlsZTogJ3RoaW4nIH07XHJcbiAgICAgIGlmIChjID09PSBjb2xzKSBlZGdlLnJpZ2h0ID0geyBzdHlsZTogJ3RoaW4nIH07XHJcbiAgICAgIHJvdzMuZ2V0Q2VsbChjKS5ib3JkZXIgPSBlZGdlO1xyXG4gICAgfVxyXG4gIFxyXG4gICAgd2IueGxzeC53cml0ZUJ1ZmZlcigpLnRoZW4oYnVmID0+IHtcclxuICAgICAgRmlsZVNhdmVyLnNhdmVBcyhcclxuICAgICAgICBuZXcgQmxvYihbYnVmXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQnIH0pLFxyXG4gICAgICAgICdTdGF0ZW1lbnRfb2ZfQWNjb3VudHMueGxzeCdcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0VG9DU1YoKTogdm9pZCB7XHJcbiAgICBjb25zdCBzZWN0aW9ucyA9IHRoaXMuZ2V0VmlzaWJsZUdyaWRzKClcclxuICAgICAgLm1hcChzID0+IHtcclxuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5nZXREaXNwbGF5ZWREYXRhKHMuYXBpKTtcclxuICAgICAgICBsZXQgcm93cyA9IHRoaXMuYnVpbGRSb3dzKGRhdGEpO1xyXG4gIFxyXG4gICAgICAgIGlmIChzLnRpdGxlID09PSAnU2VuZCBEZXRhaWxzJyAmJiB0aGlzLnNlbmRQaW5uZWRCb3R0b21Sb3c/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgcm93cyA9IHJvd3MuY29uY2F0KHRoaXMuYnVpbGRSb3dzKHRoaXMuc2VuZFBpbm5lZEJvdHRvbVJvdykpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocy50aXRsZSA9PT0gJ1JlY2VpdmUgRGV0YWlscycgJiYgdGhpcy5yZWNlaXZlUGlubmVkQm90dG9tUm93Py5sZW5ndGgpIHtcclxuICAgICAgICAgIHJvd3MgPSByb3dzLmNvbmNhdCh0aGlzLmJ1aWxkUm93cyh0aGlzLnJlY2VpdmVQaW5uZWRCb3R0b21Sb3cpKTtcclxuICAgICAgICB9XHJcbiAgXHJcbiAgICAgICAgcmV0dXJuIHJvd3MubGVuZ3RoID8geyB0aXRsZTogcy50aXRsZSwgaGVhZGVyczogdGhpcy5nZXRIZWFkZXJzKCksIHJvd3MgfSA6IG51bGw7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgeyB0aXRsZTogc3RyaW5nOyBoZWFkZXJzOiBzdHJpbmdbXTsgcm93czogYW55W11bXSB9W107XHJcbiAgXHJcbiAgICBpZiAoIXNlY3Rpb25zLmxlbmd0aCkgcmV0dXJuO1xyXG4gIFxyXG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XHJcbiAgICBsaW5lcy5wdXNoKHRoaXMuUmVwb3J0TmFtZSk7XHJcbiAgXHJcbiAgICBPYmplY3QuZW50cmllcyh0aGlzLm1ldGFEYXRhT25lIHx8IHt9KS5mb3JFYWNoKChbaywgdl0pID0+IGxpbmVzLnB1c2goYCR7a306ICR7diA/PyAnJ31gKSk7XHJcbiAgXHJcbiAgICBzZWN0aW9ucy5mb3JFYWNoKChzZWMsIGlkeCkgPT4ge1xyXG4gICAgICBsaW5lcy5wdXNoKHNlYy50aXRsZSk7XHJcbiAgICAgIGxpbmVzLnB1c2goc2VjLmhlYWRlcnMuam9pbignLCcpKTtcclxuICAgICAgc2VjLnJvd3MuZm9yRWFjaChyID0+IGxpbmVzLnB1c2goci5tYXAodiA9PiBgXCIke3YgPz8gJyd9XCJgKS5qb2luKCcsJykpKTtcclxuICBcclxuICAgICAgaWYgKGlkeCA8IHNlY3Rpb25zLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICBsaW5lcy5wdXNoKCcnKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgXHJcbiAgICBsaW5lcy5wdXNoKFxyXG4gICAgICBgXCJDbG9zaW5nIEJhbGFuY2VcIiwsXCIke051bWJlcih0aGlzLmNsb3NpbmdCYWxhbmNlSW5TZXR0bG1lbnQgfHwgMCkudG9GaXhlZCgzKX1cIixcIiR7TnVtYmVyKHRoaXMuY2xvc2luZ0JhbGFuY2UgfHwgMCkudG9GaXhlZCgzKX1cImBcclxuICAgICk7XHJcbiAgXHJcbiAgICBsaW5lcy5wdXNoKGBcIiR7dGhpcy5jbG9zaW5nQmFsYW5jZVNldHRsbWVudEN1cnJlbmN5IHx8ICcnfSAtICR7dGhpcy5jbG9zaW5nQmFsYW5jZVNldHRsbWVudEluV29yZHMgfHwgJyd9XCJgKTtcclxuICBcclxuICAgIGxpbmVzLnB1c2goYFwiJHt0aGlzLmNsb3NpbmdCYWxhbmNlQ3VycmVuY3kgfHwgJyd9IC0gJHt0aGlzLmNsb3NpbmdCYWxhbmNlVVNESW5Xb3JkcyB8fCAnJ31cImApO1xyXG4gIFxyXG4gICAgY29uc3QgY3N2ID0gbGluZXMuam9pbignXFxuJyk7XHJcbiAgICBGaWxlU2F2ZXIuc2F2ZUFzKFxyXG4gICAgICBuZXcgQmxvYihbY3N2XSwgeyB0eXBlOiAndGV4dC9jc3Y7Y2hhcnNldD11dGYtOCcgfSksXHJcbiAgICAgICdTdGF0ZW1lbnRfb2ZfQWNjb3VudHMuY3N2J1xyXG4gICAgKTtcclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIGxvYWRJbWFnZUFzQmFzZTY0KHNyYzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xyXG4gICAgICBpbWcuY3Jvc3NPcmlnaW4gPSAnYW5vbnltb3VzJztcclxuICAgICAgaW1nLnNyYyA9IHNyYztcclxuICAgICAgaW1nLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgICAgICBjYW52YXMud2lkdGggPSBpbWcud2lkdGg7XHJcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IGltZy5oZWlnaHQ7XHJcbiAgICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XHJcbiAgICAgICAgaWYgKCFjdHgpIHJldHVybiByZWplY3QoJ0NhbnZhcyBjb250ZXh0IGZhaWxlZCcpO1xyXG4gICAgICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCAwLCAwKTtcclxuICAgICAgICByZXNvbHZlKGNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL3BuZycpKTtcclxuICAgICAgfTtcclxuICAgICAgaW1nLm9uZXJyb3IgPSAoKSA9PiByZWplY3QoJ0ZhaWxlZCB0byBsb2FkIGltYWdlOiAnICsgc3JjKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREaXNwbGF5ZWREYXRhKGFwaT86IEdyaWRBcGkpOiBhbnlbXSB7XHJcbiAgICBpZiAoIWFwaSkgcmV0dXJuIFtdO1xyXG4gICAgY29uc3Qgcm93czogYW55W10gPSBbXTtcclxuICAgIGNvbnN0IGNvdW50ID0gYXBpLmdldERpc3BsYXllZFJvd0NvdW50KCk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgY29uc3Qgbm9kZSA9IGFwaS5nZXREaXNwbGF5ZWRSb3dBdEluZGV4KGkpO1xyXG4gICAgICBpZiAobm9kZSAmJiAhbm9kZS5ncm91cCAmJiAhbm9kZS5yb3dQaW5uZWQpIHJvd3MucHVzaChub2RlLmRhdGEpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJvd3M7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEhlYWRlcnMoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuY29sdW1uRGVmcy5tYXAoYyA9PiBjLmhlYWRlck5hbWUgfHwgYy5maWVsZCk7XHJcbiAgfVxyXG4gIHByaXZhdGUgZm9ybWF0MyhuOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgaWYgKG4gPT0gbnVsbCB8fCBuID09PSAnJykgcmV0dXJuICcnO1xyXG4gICAgY29uc3QgbnVtID0gTnVtYmVyKG4pO1xyXG4gICAgcmV0dXJuIG51bS50b0ZpeGVkKDMpO1xyXG4gIH1cclxuICBwcml2YXRlIGJ1aWxkUm93cyhkYXRhOiBhbnlbXSk6IGFueVtdW10ge1xyXG4gICAgcmV0dXJuIGRhdGEubWFwKHJvdyA9PlxyXG4gICAgICB0aGlzLmNvbHVtbkRlZnMubWFwKGNvbCA9PiB7XHJcbiAgICAgICAgY29uc3QgZiA9IGNvbC5maWVsZDtcclxuICAgICAgICBpZiAoZiA9PT0gJ2Ftb3VudEluU2V0dGxtZW50Q2N5JyB8fCBmID09PSAnYW1vdW50SW5VU0QnKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXQzKHJvd1tmXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByb3dbZl0gPz8gJyc7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRWaXNpYmxlR3JpZHMoKTogeyB0aXRsZTogc3RyaW5nOyBhcGk/OiBHcmlkQXBpIH1bXSB7XHJcbiAgICBjb25zdCBvdXQ6IHsgdGl0bGU6IHN0cmluZzsgYXBpPzogR3JpZEFwaSB9W10gPSBbXTtcclxuICAgIG91dC5wdXNoKHsgdGl0bGU6ICcnLCBhcGk6IHRoaXMub3BlbmluZ0dyaWRBcGkgfSk7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZENsaWVudFR5cGUgPT09ICdTZW5kQ2xpZW50JyB8fCB0aGlzLnNlbGVjdGVkQ2xpZW50VHlwZSA9PT0gJ0JvdGgnKSB7XHJcbiAgICAgIG91dC5wdXNoKHsgdGl0bGU6ICdTZW5kIERldGFpbHMnLCBhcGk6IHRoaXMuc2VuZEdyaWRBcGkgfSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZENsaWVudFR5cGUgPT09ICdSZWNlaXZlQ2xpZW50JyB8fCB0aGlzLnNlbGVjdGVkQ2xpZW50VHlwZSA9PT0gJ0JvdGgnKSB7XHJcbiAgICAgIG91dC5wdXNoKHsgdGl0bGU6ICdSZWNlaXZlIERldGFpbHMnLCBhcGk6IHRoaXMucmVjZWl2ZUdyaWRBcGkgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb3V0O1xyXG4gIH1cclxuXHJcbn1cclxuIiwiPGxpYi1zZWFyY2gtZmlsdGVyIFxyXG4gIFtSZXBvcnROYW1lXT1cIlJlcG9ydE5hbWVcIiBcclxuICAoc2VhcmNoQ2xpY2tlZCk9XCJoYW5kbGVTZWFyY2goJGV2ZW50KVwiPlxyXG48L2xpYi1zZWFyY2gtZmlsdGVyPlxyXG5cclxuPGFwcC1sb2FkZXIgKm5nSWY9XCJsb2FkaW5nU3RhdGUgPT09IENvbXBvbmVudExvYWRpbmdTdGF0ZS5Mb2FkaW5nXCI+PC9hcHAtbG9hZGVyPlxyXG48c3BhbiAqbmdJZj1cImxvYWRpbmdTdGF0ZSA9PT0gQ29tcG9uZW50TG9hZGluZ1N0YXRlLkVycm9yXCI+e3sgZXJyb3JNZXNzYWdlIH19PC9zcGFuPlxyXG48ZGl2ICpuZ0lmPVwic2hvd1RhYmxlc1wiPlxyXG48bGliLW1ldGFkYXRhIFxyXG4gICAgW3JlcG9ydE5hbWVdPVwiUmVwb3J0TmFtZVwiIFxyXG4gICAgW3Nob3dtZXRhRGF0YU9uZV09XCJ0cnVlXCIgXHJcbiAgICBbc2hvd21ldGFEYXRhVHdvXT1cImZhbHNlXCIgXHJcbiAgICBbbWV0YURhdGFPbmVdPVwibWV0YURhdGFPbmVcIlxyXG4gICAgW21ldGFEYXRhVHdvXT1cIlwiIFxyXG4gICAgKGV4cG9ydEV2ZW50KT1cImhhbmRsZUV4cG9ydCgkZXZlbnQpXCIgXHJcbiAgICAoc2VhcmNoRXZlbnQpPVwiZmlsdGVyKCRldmVudClcIj5cclxuICA8L2xpYi1tZXRhZGF0YT5cclxuXHJcbjxhZy1ncmlkLWFuZ3VsYXJcclxuICBjbGFzcz1cImFnLXRoZW1lLWFscGluZSB0cmFuc2FjdGlvbi1ncmlkXCJcclxuICBbcm93RGF0YV09XCJvcGVuaW5nQmFsQW5kRnVuZGluZ1wiXHJcbiAgW2NvbHVtbkRlZnNdPVwiY29sdW1uRGVmc1wiXHJcbiAgW3Bpbm5lZEJvdHRvbVJvd0RhdGFdPVwiW11cIlxyXG4gIFtoZWFkZXJIZWlnaHRdPVwiMzJcIiBcclxuICBbZGVmYXVsdENvbERlZl09XCJkZWZhdWx0Q29sRGVmXCJcclxuICBbcm93SGVpZ2h0XT1cIjI4XCJcclxuICAoZ3JpZFJlYWR5KT1cIm9uT3BlbmluZ0dyaWRSZWFkeSgkZXZlbnQpXCJcclxuICBzdHlsZT1cIndpZHRoOiAxMDAlOyBoZWlnaHQ6IDkxcHg7XCI+XHJcbjwvYWctZ3JpZC1hbmd1bGFyPlxyXG5cclxuPGRpdiAqbmdJZj1cIihzZWxlY3RlZENsaWVudFR5cGUgPT09ICdTZW5kQ2xpZW50JyB8fCBzZWxlY3RlZENsaWVudFR5cGUgPT09ICdCb3RoJylcIj5cclxuPGgzIGNsYXNzPVwiZGV0YWlscy10YWJsZVwiPjxzcGFuIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDNweDtcIj5TZW5kIERldGFpbHM8L3NwYW4+PC9oMz5cclxuPGFnLWdyaWQtYW5ndWxhclxyXG4gIGNsYXNzPVwiYWctdGhlbWUtYWxwaW5lIHRyYW5zYWN0aW9uLWdyaWRcIlxyXG4gIFtyb3dEYXRhXT1cInNlbmREZXRhaWxzXCJcclxuICBbY29sdW1uRGVmc109XCJjb2x1bW5EZWZzXCJcclxuICBbZGVmYXVsdENvbERlZl09XCJkZWZhdWx0Q29sRGVmXCJcclxuICBbcm93SGVpZ2h0XT1cIjI4XCJcclxuICBbaGVhZGVySGVpZ2h0XT1cIjMyXCIgXHJcbiAgW3Bpbm5lZEJvdHRvbVJvd0RhdGFdPVwic2VuZFBpbm5lZEJvdHRvbVJvd1wiXHJcbiAgKGdyaWRSZWFkeSk9XCJvblNlbmRHcmlkUmVhZHkoJGV2ZW50KVwiIFxyXG4gIHN0eWxlPVwid2lkdGg6IDEwMCU7IGhlaWdodDogMjAzcHg7XCI+XHJcbjwvYWctZ3JpZC1hbmd1bGFyPlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgKm5nSWY9XCIoc2VsZWN0ZWRDbGllbnRUeXBlID09PSAnUmVjZWl2ZUNsaWVudCcgfHwgc2VsZWN0ZWRDbGllbnRUeXBlID09PSAnQm90aCcpXCI+XHJcbjxoMyBjbGFzcz1cImRldGFpbHMtdGFibGVcIj48c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAzcHg7XCI+UmVjZWl2ZSBEZXRhaWxzPC9zcGFuPjwvaDM+XHJcbjxhZy1ncmlkLWFuZ3VsYXJcclxuICBjbGFzcz1cImFnLXRoZW1lLWFscGluZSB0cmFuc2FjdGlvbi1ncmlkXCJcclxuICBbcm93RGF0YV09XCJyZWNlaXZlRGV0YWlsc1wiXHJcbiAgW2NvbHVtbkRlZnNdPVwiY29sdW1uRGVmc1wiXHJcbiAgW2RlZmF1bHRDb2xEZWZdPVwiZGVmYXVsdENvbERlZlwiXHJcbiAgW3Jvd0hlaWdodF09XCIyOFwiXHJcbiAgW2hlYWRlckhlaWdodF09XCIzMlwiIFxyXG4gIFtwaW5uZWRCb3R0b21Sb3dEYXRhXT1cInJlY2VpdmVQaW5uZWRCb3R0b21Sb3dcIlxyXG4gIChncmlkUmVhZHkpPVwib25SZWNlaXZlR3JpZFJlYWR5KCRldmVudClcIiBcclxuICBzdHlsZT1cIndpZHRoOiAxMDAlOyBoZWlnaHQ6IDIwM3B4O1wiPlxyXG48L2FnLWdyaWQtYW5ndWxhcj5cclxuPC9kaXY+XHJcblxyXG5cclxuPCEtLSBDbG9zaW5nIGJhbGFuY2Ugcm93IC0tPlxyXG48ZGl2IGNsYXNzPVwiY2xvc2luZy1iYWxhbmNlLXJvd1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJsYWJlbFwiIHRpdGxlPVwiQ2xvc2luZyBCYWxhbmNlXCI+XHJcbiAgICBDbG9zaW5nIEJhbGFuY2VcclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cInNldHRsZW1lbnRcIiBcclxuICAgICAgIFt0aXRsZV09XCJjbG9zaW5nQmFsYW5jZVNldHRsbWVudEZvcm1hdHRlZFwiPlxyXG4gICAge3sgY2xvc2luZ0JhbGFuY2VTZXR0bG1lbnRGb3JtYXR0ZWQgfX1cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cInZhbHVlXCIgW3RpdGxlXT1cImNsb3NpbmdCYWxhbmNlSW5Vc2RGb3JtYXR0ZWRcIj5cclxuICAgIHt7IGNsb3NpbmdCYWxhbmNlSW5Vc2RGb3JtYXR0ZWQgfX1cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG5cclxuPCEtLSBzZXR0bGVtZW50IGN1cnJlbmN5IHdvcmRzIHJvdyAtLT5cclxuPGRpdiBjbGFzcz1cImNsb3NpbmctYmFsYW5jZS1yb3cgY2xvc2luZy1iYWxhbmNlLXdvcmRzXCJcclxuICAgICAqbmdJZj1cImNsb3NpbmdCYWxhbmNlU2V0dGxtZW50SW5Xb3Jkc1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJsYWJlbFwiXHJcbiAgICAgICBbdGl0bGVdPVwiY2xvc2luZ0JhbGFuY2VTZXR0bG1lbnRDdXJyZW5jeSArICcgLSAnICsgY2xvc2luZ0JhbGFuY2VTZXR0bG1lbnRJbldvcmRzXCI+XHJcbiAgICB7eyBjbG9zaW5nQmFsYW5jZVNldHRsbWVudEN1cnJlbmN5IH19IC0ge3sgY2xvc2luZ0JhbGFuY2VTZXR0bG1lbnRJbldvcmRzIH19XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPCEtLSBleGlzdGluZyBVU0Qgd29yZHMgcm93IChrZWVwIGFzLWlzKSAtLT5cclxuPGRpdiBjbGFzcz1cImNsb3NpbmctYmFsYW5jZS1yb3cgY2xvc2luZy1iYWxhbmNlLXdvcmRzXCI+XHJcbiAgPGRpdiBjbGFzcz1cImxhYmVsXCIgW3RpdGxlXT1cImNsb3NpbmdCYWxhbmNlQ3VycmVuY3kgKyAnIC0gJyArIGNsb3NpbmdCYWxhbmNlVVNESW5Xb3Jkc1wiPlxyXG4gICAge3sgY2xvc2luZ0JhbGFuY2VDdXJyZW5jeSB9fSAtIHt7IGNsb3NpbmdCYWxhbmNlVVNESW5Xb3JkcyB9fVxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19