tango-app-ui-manage-billing 3.3.12 → 3.3.13

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.
@@ -2,6 +2,7 @@ import { Component, Input } from '@angular/core';
2
2
  import { Subject, takeUntil } from 'rxjs';
3
3
  import { EditInvoiceComponent } from '../tango-manage-billing/edit-invoice/edit-invoice.component';
4
4
  import { EstimatePreviewComponent } from './estimate-preview/estimate-preview.component';
5
+ import { RequestConfirmationComponent } from '../tango-manage-billing/request-confirmation/request-confirmation.component';
5
6
  import * as i0 from "@angular/core";
6
7
  import * as i1 from "../services/billing.service";
7
8
  import * as i2 from "tango-app-ui-shared";
@@ -9,7 +10,7 @@ import * as i3 from "@ng-bootstrap/ng-bootstrap";
9
10
  import * as i4 from "@angular/common";
10
11
  import * as i5 from "@angular/forms";
11
12
  // Estimate tab (prototype design): per-brand list of quotation documents with
12
- // status (Draft/Sent/Accepted/Declined/Expired), date filters and create.
13
+ // status (Pending/Sent/Accepted/Declined/Expired), date filters and create.
13
14
  export class EstimatesComponent {
14
15
  billingService;
15
16
  toast;
@@ -21,11 +22,11 @@ export class EstimatesComponent {
21
22
  noData = false;
22
23
  rows = [];
23
24
  totalItems = 0;
24
- counts = { draft: 0, sent: 0, accepted: 0, declined: 0, expired: 0, total: 0 };
25
+ counts = { pending: 0, sent: 0, accepted: 0, declined: 0, expired: 0, total: 0 };
25
26
  // Filter tabs by status.
26
27
  statusTabs = [
27
28
  { id: 'All', label: 'All' },
28
- { id: 'draft', label: 'Draft' },
29
+ { id: 'pending', label: 'Pending' },
29
30
  { id: 'sent', label: 'Sent' },
30
31
  { id: 'accepted', label: 'Accepted' },
31
32
  { id: 'declined', label: 'Declined' },
@@ -188,7 +189,7 @@ export class EstimatesComponent {
188
189
  // ---- display helpers ----
189
190
  statusPillClass(s) {
190
191
  const map = {
191
- draft: 'pill pill-gray', sent: 'pill pill-blue', accepted: 'pill pill-green',
192
+ pending: 'pill pill-amber', sent: 'pill pill-blue', accepted: 'pill pill-green',
192
193
  declined: 'pill pill-red', expired: 'pill pill-red',
193
194
  };
194
195
  return map[s] || 'pill pill-gray';
@@ -234,6 +235,27 @@ export class EstimatesComponent {
234
235
  error: (err) => this.toast.getErrorToast(err?.error?.message || 'Update failed'),
235
236
  });
236
237
  }
238
+ // Approve a pending estimate: confirm, then email the estimate PDF to the
239
+ // billing-group recipients (same flow as invoice send) and flip it to Sent.
240
+ approveAndSend(e) {
241
+ const modalRef = this.modalService.open(RequestConfirmationComponent, {
242
+ centered: true, size: 'md', scrollable: true,
243
+ });
244
+ modalRef.componentInstance.title = 'Approve & send estimate?';
245
+ modalRef.componentInstance.description =
246
+ `Estimate ${e.estimate} will be emailed (with the PDF attached) to the billing group's recipients and marked as Sent. This action cannot be undone.`;
247
+ modalRef.result.then((result) => {
248
+ if (result !== 'Yes')
249
+ return;
250
+ this.billingService.sendEstimate(e._id).pipe(takeUntil(this.destroy$)).subscribe({
251
+ next: () => {
252
+ this.toast.getPrimaryToast(`Estimate ${e.estimate} sent`);
253
+ this.loadList();
254
+ },
255
+ error: (err) => this.toast.getErrorToast(err?.error?.message || 'Failed to send estimate'),
256
+ });
257
+ }).catch(() => { });
258
+ }
237
259
  deleteEstimate(e) {
238
260
  this.billingService.deleteEstimate(e._id).pipe(takeUntil(this.destroy$)).subscribe({
239
261
  next: () => {
@@ -244,12 +266,12 @@ export class EstimatesComponent {
244
266
  });
245
267
  }
246
268
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EstimatesComponent, deps: [{ token: i1.BillingService }, { token: i2.ToastService }, { token: i0.ChangeDetectorRef }, { token: i3.NgbModal }], target: i0.ɵɵFactoryTarget.Component });
247
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: EstimatesComponent, selector: "lib-estimates", inputs: { clientId: "clientId" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"px-1\">\n <!-- Header -->\n <div class=\"d-flex justify-content-between align-items-center flex-wrap gap-2\">\n <div class=\"billingheader\">Estimates <span class=\"countchip ms-1\">{{ counts.total }}</span></div>\n <div class=\"d-flex align-items-center gap-2\">\n <div class=\"position-relative\">\n <span class=\"svg-icon est-search-ic position-absolute mt-2 ms-3\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"#98a2b3\" stroke-width=\"2\"><circle cx=\"11\" cy=\"11\" r=\"7\" /><path d=\"M21 21l-4-4\" /></svg>\n </span>\n <input [(ngModel)]=\"searchValue\" type=\"text\" class=\"form-control ps-12 est-search\"\n placeholder=\"Estimate # or billing group...\" autocomplete=\"off\" (change)=\"searchField()\">\n </div>\n <button type=\"button\" class=\"btn-outline btn align-items-center text-nowrap est-btn\"\n (click)=\"filterOpen = !filterOpen\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"#344054\" stroke-width=\"2\"><path d=\"M3 5h18M6 12h12M10 19h4\" /></svg>\n <span class=\"ms-2\">Filter</span>\n <span *ngIf=\"activeFilterCount\" class=\"countchip ms-1\">{{ activeFilterCount }}</span>\n </button>\n <button type=\"button\" class=\"btn-outline btn align-items-center text-nowrap est-btn\"\n [disabled]=\"!rows.length\" (click)=\"onExport()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"#344054\" stroke-width=\"2\"><path d=\"M12 3v12M8 7l4-4 4 4M5 15v4h14v-4\" /></svg>\n <span class=\"ms-2\">Export</span>\n </button>\n <button type=\"button\" class=\"btn btn-primary align-items-center text-nowrap\"\n (click)=\"generateEstimate()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"#fff\" stroke-width=\"2.2\"><path d=\"M12 5v14M5 12h14\" /></svg>\n <span class=\"ms-2\">Generate Estimate</span>\n </button>\n </div>\n </div>\n\n <!-- Filter panel -->\n <div *ngIf=\"filterOpen\" class=\"filter-panel mt-3\">\n <div class=\"row g-3\">\n <div class=\"col-md-4\">\n <label class=\"form-label small fw-semibold\">Generated \u2014 from</label>\n <input type=\"date\" class=\"form-control\" [(ngModel)]=\"fromDate\" (change)=\"applyFilters()\">\n </div>\n <div class=\"col-md-4\">\n <label class=\"form-label small fw-semibold\">Generated \u2014 to</label>\n <input type=\"date\" class=\"form-control\" [(ngModel)]=\"toDate\" (change)=\"applyFilters()\">\n </div>\n </div>\n <div class=\"d-flex justify-content-between align-items-center mt-3\" *ngIf=\"activeFilterCount\">\n <span class=\"text-muted small\">{{ totalItems }} estimates match</span>\n <button class=\"btn btn-link btn-sm p-0\" (click)=\"clearFilters()\">Clear all filters</button>\n </div>\n </div>\n\n <!-- Status tabs -->\n <div class=\"d-flex align-items-center gap-2 flex-wrap mt-3\">\n <button *ngFor=\"let tab of statusTabs\" class=\"btn btn-sm status-tab\"\n [class.active]=\"activeStatus === tab.id\" (click)=\"setStatus(tab.id)\">\n {{ tab.label }}\n <span *ngIf=\"countOf(tab.id)\" class=\"countchip ms-1\">{{ countOf(tab.id) }}</span>\n </button>\n </div>\n\n <!-- Loading -->\n <ng-container *ngIf=\"loading\">\n <div class=\"row loader d-flex justify-content-center align-items-center mt-4\">\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Empty -->\n <ng-container *ngIf=\"!loading && noData\">\n <div class=\"row\">\n <div class=\"col-lg-12 mb-3\">\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\n <img class=\"img-src w-25\" src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\n <div class=\"text-muted mt-2\">No estimates match this filter.</div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Table -->\n <div *ngIf=\"!loading && !noData\" class=\"table-responsive mt-2\">\n <table class=\"table bottom-border est-table text-nowrap\">\n <thead>\n <tr>\n <th>Estimate #</th>\n <th>Billing Group</th>\n <th>Period</th>\n <th>Generated</th>\n <th>Valid Till</th>\n <th class=\"text-center\">No of Stores</th>\n <th class=\"text-end\">Amount (excl. GST)</th>\n <th class=\"text-end\">Amount (incl. GST)</th>\n <th>Status</th>\n <th>Action</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let e of rows\">\n <td class=\"est-no\"><a class=\"est-link\" (click)=\"openPreview(e)\">{{ e.estimate }}</a></td>\n <td>\n <span class=\"d-inline-flex align-items-center gap-2\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"#98a2b3\" stroke-width=\"2\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2\"/><path d=\"M3 9h18M8 3v4M16 3v4\"/></svg>\n {{ e.groupName || 'Default Group' }}\n </span>\n </td>\n <td>{{ e.period }}</td>\n <td>{{ e.createdDate | date: 'dd MMM yyyy' }}</td>\n <td>{{ e.validTill | date: 'dd MMM yyyy' }}</td>\n <td class=\"text-center\"><b>{{ e.stores }}</b></td>\n <td class=\"text-end\">{{ currencySymbol(e) }}{{ e.amount | number:'1.0-2':'en-IN' }}</td>\n <td class=\"text-end\"><b>{{ currencySymbol(e) }}{{ e.totalAmount | number:'1.0-2':'en-IN' }}</b></td>\n <td><span [ngClass]=\"statusPillClass(e.status)\">{{ statusLabel(e.status) }}</span></td>\n <td>\n <div class=\"d-flex align-items-center gap-1\">\n <button class=\"ico-btn\" title=\"Preview\" (click)=\"openPreview(e)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"#344054\" stroke-width=\"2\"><path d=\"M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7-10-7-10-7z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>\n </button>\n <button class=\"ico-btn\" title=\"Download PDF\" (click)=\"downloadEstimate(e)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"#344054\" stroke-width=\"2\"><path d=\"M12 3v12M8 11l4 4 4-4M5 19h14\"/></svg>\n </button>\n <button class=\"ico-btn\" title=\"Edit\"\n *ngIf=\"e.status !== 'accepted'\" (click)=\"editEstimate(e)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"#344054\" stroke-width=\"2\"><path d=\"M12 20h9M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4 12.5-12.5z\"/></svg>\n </button>\n <button *ngIf=\"e.status === 'draft'\" class=\"btn btn-sm btn-primary py-1 px-2\"\n (click)=\"updateStatus(e, 'sent')\" title=\"Mark as sent\">Send</button>\n <button *ngIf=\"e.status === 'sent'\" class=\"btn btn-sm btn-success py-1 px-2\"\n (click)=\"updateStatus(e, 'accepted')\" title=\"Mark accepted\">Accept</button>\n <button class=\"ico-btn\" title=\"Delete\"\n *ngIf=\"e.status !== 'accepted'\" (click)=\"deleteEstimate(e)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"#d92d20\" stroke-width=\"2\"><path d=\"M4 7h16M9 7V5a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2M6 7l1 13h10l1-13\"/></svg>\n </button>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n <lib-pagination class=\"text-start\" [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\"\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\n (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\n </div>\n</div>", styles: [".billingheader{font-size:18px;font-weight:800;display:flex;align-items:center}.est-search{border:1px solid #D0D5DD;border-radius:10px;padding:9px 13px 9px 38px;min-width:260px}.est-search-ic{pointer-events:none}.est-btn{border:1px solid #D0D5DD;border-radius:10px;padding:8px 13px;font-weight:600;color:#344054;background:#fff}.est-btn:hover{background:#f7f8fa}.status-tab{border:0;border-radius:8px;padding:7px 14px;font-weight:600;color:#5b6472;background:transparent}.status-tab:hover{background:#f4f6f9}.status-tab.active{background:#e8f3fe;color:#1493f5}.status-tab.active .countchip{background:#d3e9fd;color:#1573c4}.countchip{background:#f1f3f6;color:#667085;font-weight:600;font-size:11px;border-radius:999px;padding:1px 8px}.est-table{width:100%}.est-table thead th{font-size:11.5px;letter-spacing:.04em;text-transform:uppercase;color:#8a93a2;font-weight:600;padding:13px 14px;border-bottom:1px solid #eceef1;white-space:nowrap}.est-table tbody td{padding:16px 14px;border-bottom:1px solid #eceef1;vertical-align:middle;font-size:14px;color:#344054}.est-table tbody tr:hover{background:#fbfcfe}.est-table .est-no{border-left:3px solid #1493f5}.est-table .est-link{color:#1493f5;font-weight:600;cursor:pointer}.est-table .est-link:hover{text-decoration:underline}.pill{display:inline-flex;align-items:center;padding:4px 10px;border-radius:999px;font-size:12px;font-weight:600;white-space:nowrap}.pill-gray{background:#f1f3f6;color:#667085}.pill-blue{background:#e8f3fe;color:#1573c4}.pill-green{background:#e7f7ee;color:#138a52}.pill-red{background:#fdecec;color:#d64545}.ico-btn{width:32px;height:32px;border:1px solid #e4e6ea;background:#fff;border-radius:8px;display:grid;place-items:center;cursor:pointer}.ico-btn:hover{border-color:#f3c0c0}.filter-panel{border:1px solid #E4E7EC;border-radius:14px;padding:16px 18px;background:#fbfdff}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "pipe", type: i4.DecimalPipe, name: "number" }, { kind: "pipe", type: i4.DatePipe, name: "date" }] });
269
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: EstimatesComponent, selector: "lib-estimates", inputs: { clientId: "clientId" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"px-1\">\n <!-- Header -->\n <div class=\"d-flex justify-content-between align-items-center flex-wrap gap-2\">\n <div class=\"billingheader\">Estimates <span class=\"countchip ms-1\">{{ counts.total }}</span></div>\n <div class=\"d-flex align-items-center gap-2\">\n <div class=\"position-relative\">\n <span class=\"svg-icon est-search-ic position-absolute mt-2 ms-3\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"#98a2b3\" stroke-width=\"2\"><circle cx=\"11\" cy=\"11\" r=\"7\" /><path d=\"M21 21l-4-4\" /></svg>\n </span>\n <input [(ngModel)]=\"searchValue\" type=\"text\" class=\"form-control ps-12 est-search\"\n placeholder=\"Estimate # or billing group...\" autocomplete=\"off\" (change)=\"searchField()\">\n </div>\n <button type=\"button\" class=\"btn-outline btn align-items-center text-nowrap est-btn\"\n (click)=\"filterOpen = !filterOpen\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"#344054\" stroke-width=\"2\"><path d=\"M3 5h18M6 12h12M10 19h4\" /></svg>\n <span class=\"ms-2\">Filter</span>\n <span *ngIf=\"activeFilterCount\" class=\"countchip ms-1\">{{ activeFilterCount }}</span>\n </button>\n <button type=\"button\" class=\"btn-outline btn align-items-center text-nowrap est-btn\"\n [disabled]=\"!rows.length\" (click)=\"onExport()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"#344054\" stroke-width=\"2\"><path d=\"M12 3v12M8 7l4-4 4 4M5 15v4h14v-4\" /></svg>\n <span class=\"ms-2\">Export</span>\n </button>\n <button type=\"button\" class=\"btn btn-primary align-items-center text-nowrap\"\n (click)=\"generateEstimate()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"#fff\" stroke-width=\"2.2\"><path d=\"M12 5v14M5 12h14\" /></svg>\n <span class=\"ms-2\">Generate Estimate</span>\n </button>\n </div>\n </div>\n\n <!-- Filter panel -->\n <div *ngIf=\"filterOpen\" class=\"filter-panel mt-3\">\n <div class=\"row g-3\">\n <div class=\"col-md-4\">\n <label class=\"form-label small fw-semibold\">Generated \u2014 from</label>\n <input type=\"date\" class=\"form-control\" [(ngModel)]=\"fromDate\" (change)=\"applyFilters()\">\n </div>\n <div class=\"col-md-4\">\n <label class=\"form-label small fw-semibold\">Generated \u2014 to</label>\n <input type=\"date\" class=\"form-control\" [(ngModel)]=\"toDate\" (change)=\"applyFilters()\">\n </div>\n </div>\n <div class=\"d-flex justify-content-between align-items-center mt-3\" *ngIf=\"activeFilterCount\">\n <span class=\"text-muted small\">{{ totalItems }} estimates match</span>\n <button class=\"btn btn-link btn-sm p-0\" (click)=\"clearFilters()\">Clear all filters</button>\n </div>\n </div>\n\n <!-- Status tabs -->\n <div class=\"d-flex align-items-center gap-2 flex-wrap mt-3\">\n <button *ngFor=\"let tab of statusTabs\" class=\"btn btn-sm status-tab\"\n [class.active]=\"activeStatus === tab.id\" (click)=\"setStatus(tab.id)\">\n {{ tab.label }}\n <span *ngIf=\"countOf(tab.id)\" class=\"countchip ms-1\">{{ countOf(tab.id) }}</span>\n </button>\n </div>\n\n <!-- Loading -->\n <ng-container *ngIf=\"loading\">\n <div class=\"row loader d-flex justify-content-center align-items-center mt-4\">\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Empty -->\n <ng-container *ngIf=\"!loading && noData\">\n <div class=\"row\">\n <div class=\"col-lg-12 mb-3\">\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\n <img class=\"img-src w-25\" src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\n <div class=\"text-muted mt-2\">No estimates match this filter.</div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Table -->\n <div *ngIf=\"!loading && !noData\" class=\"table-responsive mt-2\">\n <table class=\"table bottom-border est-table text-nowrap\">\n <thead>\n <tr>\n <th>Estimate #</th>\n <th>Billing Group</th>\n <th>Period</th>\n <th>Generated</th>\n <th>Valid Till</th>\n <th class=\"text-center\">No of Stores</th>\n <th class=\"text-end\">Amount (excl. GST)</th>\n <th class=\"text-end\">Amount (incl. GST)</th>\n <th>Status</th>\n <th>Action</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let e of rows\">\n <td class=\"est-no\"><a class=\"est-link\" (click)=\"openPreview(e)\">{{ e.estimate }}</a></td>\n <td>\n <span class=\"d-inline-flex align-items-center gap-2\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"#98a2b3\" stroke-width=\"2\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2\"/><path d=\"M3 9h18M8 3v4M16 3v4\"/></svg>\n {{ e.groupName || 'Default Group' }}\n </span>\n </td>\n <td>{{ e.period }}</td>\n <td>{{ e.createdDate | date: 'dd MMM yyyy' }}</td>\n <td>{{ e.validTill | date: 'dd MMM yyyy' }}</td>\n <td class=\"text-center\"><b>{{ e.stores }}</b></td>\n <td class=\"text-end\">{{ currencySymbol(e) }}{{ e.amount | number:'1.0-2':'en-IN' }}</td>\n <td class=\"text-end\"><b>{{ currencySymbol(e) }}{{ e.totalAmount | number:'1.0-2':'en-IN' }}</b></td>\n <td><span [ngClass]=\"statusPillClass(e.status)\">{{ statusLabel(e.status) }}</span></td>\n <td>\n <div class=\"d-flex align-items-center gap-1\">\n <button class=\"ico-btn\" title=\"Download PDF\" (click)=\"downloadEstimate(e)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"#344054\" stroke-width=\"2\"><path d=\"M12 3v12M8 11l4 4 4-4M5 19h14\"/></svg>\n </button>\n <button class=\"ico-btn\" title=\"Edit\"\n *ngIf=\"e.status !== 'accepted'\" (click)=\"editEstimate(e)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"#344054\" stroke-width=\"2\"><path d=\"M12 20h9M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4 12.5-12.5z\"/></svg>\n </button>\n <button *ngIf=\"e.status === 'pending'\" class=\"btn btn-sm btn-primary py-1 px-2\"\n (click)=\"approveAndSend(e)\" title=\"Approve & send estimate\">Approve</button>\n <button *ngIf=\"e.status === 'sent'\" class=\"btn btn-sm btn-success py-1 px-2\"\n (click)=\"updateStatus(e, 'accepted')\" title=\"Mark accepted\">Accept</button>\n <button class=\"ico-btn\" title=\"Delete\"\n *ngIf=\"e.status !== 'accepted'\" (click)=\"deleteEstimate(e)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"#d92d20\" stroke-width=\"2\"><path d=\"M4 7h16M9 7V5a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2M6 7l1 13h10l1-13\"/></svg>\n </button>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n <lib-pagination class=\"text-start\" [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\"\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\n (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\n </div>\n</div>", styles: [".billingheader{font-size:18px;font-weight:800;display:flex;align-items:center}.est-search{border:1px solid #D0D5DD;border-radius:10px;padding:9px 13px 9px 38px;min-width:260px}.est-search-ic{pointer-events:none}.est-btn{border:1px solid #D0D5DD;border-radius:10px;padding:8px 13px;font-weight:600;color:#344054;background:#fff}.est-btn:hover{background:#f7f8fa}.status-tab{border:0;border-radius:8px;padding:7px 14px;font-weight:600;color:#5b6472;background:transparent}.status-tab:hover{background:#f4f6f9}.status-tab.active{background:#e8f3fe;color:#1493f5}.status-tab.active .countchip{background:#d3e9fd;color:#1573c4}.countchip{background:#f1f3f6;color:#667085;font-weight:600;font-size:11px;border-radius:999px;padding:1px 8px}.est-table{width:100%}.est-table thead th{font-size:11.5px;letter-spacing:.04em;text-transform:uppercase;color:#8a93a2;font-weight:600;padding:13px 14px;border-bottom:1px solid #eceef1;white-space:nowrap}.est-table tbody td{padding:16px 14px;border-bottom:1px solid #eceef1;vertical-align:middle;font-size:14px;color:#344054}.est-table tbody tr:hover{background:#fbfcfe}.est-table .est-no{border-left:3px solid #1493f5}.est-table .est-link{color:#1493f5;font-weight:600;cursor:pointer}.est-table .est-link:hover{text-decoration:underline}.pill{display:inline-flex;align-items:center;padding:4px 10px;border-radius:999px;font-size:12px;font-weight:600;white-space:nowrap}.pill-gray{background:#f1f3f6;color:#667085}.pill-blue{background:#e8f3fe;color:#1573c4}.pill-green{background:#e7f7ee;color:#138a52}.pill-red{background:#fdecec;color:#d64545}.ico-btn{width:32px;height:32px;border:1px solid #e4e6ea;background:#fff;border-radius:8px;display:grid;place-items:center;cursor:pointer}.ico-btn:hover{border-color:#f3c0c0}.filter-panel{border:1px solid #E4E7EC;border-radius:14px;padding:16px 18px;background:#fbfdff}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "pipe", type: i4.DecimalPipe, name: "number" }, { kind: "pipe", type: i4.DatePipe, name: "date" }] });
248
270
  }
249
271
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EstimatesComponent, decorators: [{
250
272
  type: Component,
251
- args: [{ selector: 'lib-estimates', template: "<div class=\"px-1\">\n <!-- Header -->\n <div class=\"d-flex justify-content-between align-items-center flex-wrap gap-2\">\n <div class=\"billingheader\">Estimates <span class=\"countchip ms-1\">{{ counts.total }}</span></div>\n <div class=\"d-flex align-items-center gap-2\">\n <div class=\"position-relative\">\n <span class=\"svg-icon est-search-ic position-absolute mt-2 ms-3\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"#98a2b3\" stroke-width=\"2\"><circle cx=\"11\" cy=\"11\" r=\"7\" /><path d=\"M21 21l-4-4\" /></svg>\n </span>\n <input [(ngModel)]=\"searchValue\" type=\"text\" class=\"form-control ps-12 est-search\"\n placeholder=\"Estimate # or billing group...\" autocomplete=\"off\" (change)=\"searchField()\">\n </div>\n <button type=\"button\" class=\"btn-outline btn align-items-center text-nowrap est-btn\"\n (click)=\"filterOpen = !filterOpen\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"#344054\" stroke-width=\"2\"><path d=\"M3 5h18M6 12h12M10 19h4\" /></svg>\n <span class=\"ms-2\">Filter</span>\n <span *ngIf=\"activeFilterCount\" class=\"countchip ms-1\">{{ activeFilterCount }}</span>\n </button>\n <button type=\"button\" class=\"btn-outline btn align-items-center text-nowrap est-btn\"\n [disabled]=\"!rows.length\" (click)=\"onExport()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"#344054\" stroke-width=\"2\"><path d=\"M12 3v12M8 7l4-4 4 4M5 15v4h14v-4\" /></svg>\n <span class=\"ms-2\">Export</span>\n </button>\n <button type=\"button\" class=\"btn btn-primary align-items-center text-nowrap\"\n (click)=\"generateEstimate()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"#fff\" stroke-width=\"2.2\"><path d=\"M12 5v14M5 12h14\" /></svg>\n <span class=\"ms-2\">Generate Estimate</span>\n </button>\n </div>\n </div>\n\n <!-- Filter panel -->\n <div *ngIf=\"filterOpen\" class=\"filter-panel mt-3\">\n <div class=\"row g-3\">\n <div class=\"col-md-4\">\n <label class=\"form-label small fw-semibold\">Generated \u2014 from</label>\n <input type=\"date\" class=\"form-control\" [(ngModel)]=\"fromDate\" (change)=\"applyFilters()\">\n </div>\n <div class=\"col-md-4\">\n <label class=\"form-label small fw-semibold\">Generated \u2014 to</label>\n <input type=\"date\" class=\"form-control\" [(ngModel)]=\"toDate\" (change)=\"applyFilters()\">\n </div>\n </div>\n <div class=\"d-flex justify-content-between align-items-center mt-3\" *ngIf=\"activeFilterCount\">\n <span class=\"text-muted small\">{{ totalItems }} estimates match</span>\n <button class=\"btn btn-link btn-sm p-0\" (click)=\"clearFilters()\">Clear all filters</button>\n </div>\n </div>\n\n <!-- Status tabs -->\n <div class=\"d-flex align-items-center gap-2 flex-wrap mt-3\">\n <button *ngFor=\"let tab of statusTabs\" class=\"btn btn-sm status-tab\"\n [class.active]=\"activeStatus === tab.id\" (click)=\"setStatus(tab.id)\">\n {{ tab.label }}\n <span *ngIf=\"countOf(tab.id)\" class=\"countchip ms-1\">{{ countOf(tab.id) }}</span>\n </button>\n </div>\n\n <!-- Loading -->\n <ng-container *ngIf=\"loading\">\n <div class=\"row loader d-flex justify-content-center align-items-center mt-4\">\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Empty -->\n <ng-container *ngIf=\"!loading && noData\">\n <div class=\"row\">\n <div class=\"col-lg-12 mb-3\">\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\n <img class=\"img-src w-25\" src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\n <div class=\"text-muted mt-2\">No estimates match this filter.</div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Table -->\n <div *ngIf=\"!loading && !noData\" class=\"table-responsive mt-2\">\n <table class=\"table bottom-border est-table text-nowrap\">\n <thead>\n <tr>\n <th>Estimate #</th>\n <th>Billing Group</th>\n <th>Period</th>\n <th>Generated</th>\n <th>Valid Till</th>\n <th class=\"text-center\">No of Stores</th>\n <th class=\"text-end\">Amount (excl. GST)</th>\n <th class=\"text-end\">Amount (incl. GST)</th>\n <th>Status</th>\n <th>Action</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let e of rows\">\n <td class=\"est-no\"><a class=\"est-link\" (click)=\"openPreview(e)\">{{ e.estimate }}</a></td>\n <td>\n <span class=\"d-inline-flex align-items-center gap-2\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"#98a2b3\" stroke-width=\"2\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2\"/><path d=\"M3 9h18M8 3v4M16 3v4\"/></svg>\n {{ e.groupName || 'Default Group' }}\n </span>\n </td>\n <td>{{ e.period }}</td>\n <td>{{ e.createdDate | date: 'dd MMM yyyy' }}</td>\n <td>{{ e.validTill | date: 'dd MMM yyyy' }}</td>\n <td class=\"text-center\"><b>{{ e.stores }}</b></td>\n <td class=\"text-end\">{{ currencySymbol(e) }}{{ e.amount | number:'1.0-2':'en-IN' }}</td>\n <td class=\"text-end\"><b>{{ currencySymbol(e) }}{{ e.totalAmount | number:'1.0-2':'en-IN' }}</b></td>\n <td><span [ngClass]=\"statusPillClass(e.status)\">{{ statusLabel(e.status) }}</span></td>\n <td>\n <div class=\"d-flex align-items-center gap-1\">\n <button class=\"ico-btn\" title=\"Preview\" (click)=\"openPreview(e)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"#344054\" stroke-width=\"2\"><path d=\"M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7-10-7-10-7z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>\n </button>\n <button class=\"ico-btn\" title=\"Download PDF\" (click)=\"downloadEstimate(e)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"#344054\" stroke-width=\"2\"><path d=\"M12 3v12M8 11l4 4 4-4M5 19h14\"/></svg>\n </button>\n <button class=\"ico-btn\" title=\"Edit\"\n *ngIf=\"e.status !== 'accepted'\" (click)=\"editEstimate(e)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"#344054\" stroke-width=\"2\"><path d=\"M12 20h9M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4 12.5-12.5z\"/></svg>\n </button>\n <button *ngIf=\"e.status === 'draft'\" class=\"btn btn-sm btn-primary py-1 px-2\"\n (click)=\"updateStatus(e, 'sent')\" title=\"Mark as sent\">Send</button>\n <button *ngIf=\"e.status === 'sent'\" class=\"btn btn-sm btn-success py-1 px-2\"\n (click)=\"updateStatus(e, 'accepted')\" title=\"Mark accepted\">Accept</button>\n <button class=\"ico-btn\" title=\"Delete\"\n *ngIf=\"e.status !== 'accepted'\" (click)=\"deleteEstimate(e)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"#d92d20\" stroke-width=\"2\"><path d=\"M4 7h16M9 7V5a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2M6 7l1 13h10l1-13\"/></svg>\n </button>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n <lib-pagination class=\"text-start\" [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\"\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\n (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\n </div>\n</div>", styles: [".billingheader{font-size:18px;font-weight:800;display:flex;align-items:center}.est-search{border:1px solid #D0D5DD;border-radius:10px;padding:9px 13px 9px 38px;min-width:260px}.est-search-ic{pointer-events:none}.est-btn{border:1px solid #D0D5DD;border-radius:10px;padding:8px 13px;font-weight:600;color:#344054;background:#fff}.est-btn:hover{background:#f7f8fa}.status-tab{border:0;border-radius:8px;padding:7px 14px;font-weight:600;color:#5b6472;background:transparent}.status-tab:hover{background:#f4f6f9}.status-tab.active{background:#e8f3fe;color:#1493f5}.status-tab.active .countchip{background:#d3e9fd;color:#1573c4}.countchip{background:#f1f3f6;color:#667085;font-weight:600;font-size:11px;border-radius:999px;padding:1px 8px}.est-table{width:100%}.est-table thead th{font-size:11.5px;letter-spacing:.04em;text-transform:uppercase;color:#8a93a2;font-weight:600;padding:13px 14px;border-bottom:1px solid #eceef1;white-space:nowrap}.est-table tbody td{padding:16px 14px;border-bottom:1px solid #eceef1;vertical-align:middle;font-size:14px;color:#344054}.est-table tbody tr:hover{background:#fbfcfe}.est-table .est-no{border-left:3px solid #1493f5}.est-table .est-link{color:#1493f5;font-weight:600;cursor:pointer}.est-table .est-link:hover{text-decoration:underline}.pill{display:inline-flex;align-items:center;padding:4px 10px;border-radius:999px;font-size:12px;font-weight:600;white-space:nowrap}.pill-gray{background:#f1f3f6;color:#667085}.pill-blue{background:#e8f3fe;color:#1573c4}.pill-green{background:#e7f7ee;color:#138a52}.pill-red{background:#fdecec;color:#d64545}.ico-btn{width:32px;height:32px;border:1px solid #e4e6ea;background:#fff;border-radius:8px;display:grid;place-items:center;cursor:pointer}.ico-btn:hover{border-color:#f3c0c0}.filter-panel{border:1px solid #E4E7EC;border-radius:14px;padding:16px 18px;background:#fbfdff}\n"] }]
273
+ args: [{ selector: 'lib-estimates', template: "<div class=\"px-1\">\n <!-- Header -->\n <div class=\"d-flex justify-content-between align-items-center flex-wrap gap-2\">\n <div class=\"billingheader\">Estimates <span class=\"countchip ms-1\">{{ counts.total }}</span></div>\n <div class=\"d-flex align-items-center gap-2\">\n <div class=\"position-relative\">\n <span class=\"svg-icon est-search-ic position-absolute mt-2 ms-3\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"#98a2b3\" stroke-width=\"2\"><circle cx=\"11\" cy=\"11\" r=\"7\" /><path d=\"M21 21l-4-4\" /></svg>\n </span>\n <input [(ngModel)]=\"searchValue\" type=\"text\" class=\"form-control ps-12 est-search\"\n placeholder=\"Estimate # or billing group...\" autocomplete=\"off\" (change)=\"searchField()\">\n </div>\n <button type=\"button\" class=\"btn-outline btn align-items-center text-nowrap est-btn\"\n (click)=\"filterOpen = !filterOpen\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"#344054\" stroke-width=\"2\"><path d=\"M3 5h18M6 12h12M10 19h4\" /></svg>\n <span class=\"ms-2\">Filter</span>\n <span *ngIf=\"activeFilterCount\" class=\"countchip ms-1\">{{ activeFilterCount }}</span>\n </button>\n <button type=\"button\" class=\"btn-outline btn align-items-center text-nowrap est-btn\"\n [disabled]=\"!rows.length\" (click)=\"onExport()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"#344054\" stroke-width=\"2\"><path d=\"M12 3v12M8 7l4-4 4 4M5 15v4h14v-4\" /></svg>\n <span class=\"ms-2\">Export</span>\n </button>\n <button type=\"button\" class=\"btn btn-primary align-items-center text-nowrap\"\n (click)=\"generateEstimate()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"#fff\" stroke-width=\"2.2\"><path d=\"M12 5v14M5 12h14\" /></svg>\n <span class=\"ms-2\">Generate Estimate</span>\n </button>\n </div>\n </div>\n\n <!-- Filter panel -->\n <div *ngIf=\"filterOpen\" class=\"filter-panel mt-3\">\n <div class=\"row g-3\">\n <div class=\"col-md-4\">\n <label class=\"form-label small fw-semibold\">Generated \u2014 from</label>\n <input type=\"date\" class=\"form-control\" [(ngModel)]=\"fromDate\" (change)=\"applyFilters()\">\n </div>\n <div class=\"col-md-4\">\n <label class=\"form-label small fw-semibold\">Generated \u2014 to</label>\n <input type=\"date\" class=\"form-control\" [(ngModel)]=\"toDate\" (change)=\"applyFilters()\">\n </div>\n </div>\n <div class=\"d-flex justify-content-between align-items-center mt-3\" *ngIf=\"activeFilterCount\">\n <span class=\"text-muted small\">{{ totalItems }} estimates match</span>\n <button class=\"btn btn-link btn-sm p-0\" (click)=\"clearFilters()\">Clear all filters</button>\n </div>\n </div>\n\n <!-- Status tabs -->\n <div class=\"d-flex align-items-center gap-2 flex-wrap mt-3\">\n <button *ngFor=\"let tab of statusTabs\" class=\"btn btn-sm status-tab\"\n [class.active]=\"activeStatus === tab.id\" (click)=\"setStatus(tab.id)\">\n {{ tab.label }}\n <span *ngIf=\"countOf(tab.id)\" class=\"countchip ms-1\">{{ countOf(tab.id) }}</span>\n </button>\n </div>\n\n <!-- Loading -->\n <ng-container *ngIf=\"loading\">\n <div class=\"row loader d-flex justify-content-center align-items-center mt-4\">\n <div class=\"shimmer\">\n <div class=\"wrapper\">\n <div class=\"stroke animate title\"></div>\n <div class=\"stroke animate link\"></div>\n <div class=\"stroke animate description\"></div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Empty -->\n <ng-container *ngIf=\"!loading && noData\">\n <div class=\"row\">\n <div class=\"col-lg-12 mb-3\">\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\n <img class=\"img-src w-25\" src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\n <div class=\"text-muted mt-2\">No estimates match this filter.</div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Table -->\n <div *ngIf=\"!loading && !noData\" class=\"table-responsive mt-2\">\n <table class=\"table bottom-border est-table text-nowrap\">\n <thead>\n <tr>\n <th>Estimate #</th>\n <th>Billing Group</th>\n <th>Period</th>\n <th>Generated</th>\n <th>Valid Till</th>\n <th class=\"text-center\">No of Stores</th>\n <th class=\"text-end\">Amount (excl. GST)</th>\n <th class=\"text-end\">Amount (incl. GST)</th>\n <th>Status</th>\n <th>Action</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let e of rows\">\n <td class=\"est-no\"><a class=\"est-link\" (click)=\"openPreview(e)\">{{ e.estimate }}</a></td>\n <td>\n <span class=\"d-inline-flex align-items-center gap-2\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"#98a2b3\" stroke-width=\"2\"><rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2\"/><path d=\"M3 9h18M8 3v4M16 3v4\"/></svg>\n {{ e.groupName || 'Default Group' }}\n </span>\n </td>\n <td>{{ e.period }}</td>\n <td>{{ e.createdDate | date: 'dd MMM yyyy' }}</td>\n <td>{{ e.validTill | date: 'dd MMM yyyy' }}</td>\n <td class=\"text-center\"><b>{{ e.stores }}</b></td>\n <td class=\"text-end\">{{ currencySymbol(e) }}{{ e.amount | number:'1.0-2':'en-IN' }}</td>\n <td class=\"text-end\"><b>{{ currencySymbol(e) }}{{ e.totalAmount | number:'1.0-2':'en-IN' }}</b></td>\n <td><span [ngClass]=\"statusPillClass(e.status)\">{{ statusLabel(e.status) }}</span></td>\n <td>\n <div class=\"d-flex align-items-center gap-1\">\n <button class=\"ico-btn\" title=\"Download PDF\" (click)=\"downloadEstimate(e)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"#344054\" stroke-width=\"2\"><path d=\"M12 3v12M8 11l4 4 4-4M5 19h14\"/></svg>\n </button>\n <button class=\"ico-btn\" title=\"Edit\"\n *ngIf=\"e.status !== 'accepted'\" (click)=\"editEstimate(e)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"#344054\" stroke-width=\"2\"><path d=\"M12 20h9M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4 12.5-12.5z\"/></svg>\n </button>\n <button *ngIf=\"e.status === 'pending'\" class=\"btn btn-sm btn-primary py-1 px-2\"\n (click)=\"approveAndSend(e)\" title=\"Approve & send estimate\">Approve</button>\n <button *ngIf=\"e.status === 'sent'\" class=\"btn btn-sm btn-success py-1 px-2\"\n (click)=\"updateStatus(e, 'accepted')\" title=\"Mark accepted\">Accept</button>\n <button class=\"ico-btn\" title=\"Delete\"\n *ngIf=\"e.status !== 'accepted'\" (click)=\"deleteEstimate(e)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"#d92d20\" stroke-width=\"2\"><path d=\"M4 7h16M9 7V5a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2M6 7l1 13h10l1-13\"/></svg>\n </button>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n <lib-pagination class=\"text-start\" [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\"\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\n (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\n </div>\n</div>", styles: [".billingheader{font-size:18px;font-weight:800;display:flex;align-items:center}.est-search{border:1px solid #D0D5DD;border-radius:10px;padding:9px 13px 9px 38px;min-width:260px}.est-search-ic{pointer-events:none}.est-btn{border:1px solid #D0D5DD;border-radius:10px;padding:8px 13px;font-weight:600;color:#344054;background:#fff}.est-btn:hover{background:#f7f8fa}.status-tab{border:0;border-radius:8px;padding:7px 14px;font-weight:600;color:#5b6472;background:transparent}.status-tab:hover{background:#f4f6f9}.status-tab.active{background:#e8f3fe;color:#1493f5}.status-tab.active .countchip{background:#d3e9fd;color:#1573c4}.countchip{background:#f1f3f6;color:#667085;font-weight:600;font-size:11px;border-radius:999px;padding:1px 8px}.est-table{width:100%}.est-table thead th{font-size:11.5px;letter-spacing:.04em;text-transform:uppercase;color:#8a93a2;font-weight:600;padding:13px 14px;border-bottom:1px solid #eceef1;white-space:nowrap}.est-table tbody td{padding:16px 14px;border-bottom:1px solid #eceef1;vertical-align:middle;font-size:14px;color:#344054}.est-table tbody tr:hover{background:#fbfcfe}.est-table .est-no{border-left:3px solid #1493f5}.est-table .est-link{color:#1493f5;font-weight:600;cursor:pointer}.est-table .est-link:hover{text-decoration:underline}.pill{display:inline-flex;align-items:center;padding:4px 10px;border-radius:999px;font-size:12px;font-weight:600;white-space:nowrap}.pill-gray{background:#f1f3f6;color:#667085}.pill-blue{background:#e8f3fe;color:#1573c4}.pill-green{background:#e7f7ee;color:#138a52}.pill-red{background:#fdecec;color:#d64545}.ico-btn{width:32px;height:32px;border:1px solid #e4e6ea;background:#fff;border-radius:8px;display:grid;place-items:center;cursor:pointer}.ico-btn:hover{border-color:#f3c0c0}.filter-panel{border:1px solid #E4E7EC;border-radius:14px;padding:16px 18px;background:#fbfdff}\n"] }]
252
274
  }], ctorParameters: () => [{ type: i1.BillingService }, { type: i2.ToastService }, { type: i0.ChangeDetectorRef }, { type: i3.NgbModal }], propDecorators: { clientId: [{
253
275
  type: Input
254
276
  }] } });
255
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXN0aW1hdGVzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9lc3RpbWF0ZXMvZXN0aW1hdGVzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9lc3RpbWF0ZXMvZXN0aW1hdGVzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsU0FBUyxFQUFFLEtBQUssRUFBd0IsTUFBTSxlQUFlLENBQUM7QUFDMUYsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFJMUMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkRBQTZELENBQUM7QUFDbkcsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0NBQStDLENBQUM7Ozs7Ozs7QUFFekYsOEVBQThFO0FBQzlFLDBFQUEwRTtBQU0xRSxNQUFNLE9BQU8sa0JBQWtCO0lBa0NuQjtJQUNBO0lBQ0E7SUFDQTtJQXBDViwwREFBMEQ7SUFDakQsUUFBUSxHQUFXLEVBQUUsQ0FBQztJQUUvQixPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ2YsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUNmLElBQUksR0FBVSxFQUFFLENBQUM7SUFDakIsVUFBVSxHQUFHLENBQUMsQ0FBQztJQUNmLE1BQU0sR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFFL0UseUJBQXlCO0lBQ3pCLFVBQVUsR0FBRztRQUNYLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1FBQzNCLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFO1FBQy9CLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO1FBQzdCLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFO1FBQ3JDLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFO1FBQ3JDLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO0tBQ3BDLENBQUM7SUFDRixZQUFZLEdBQUcsS0FBSyxDQUFDO0lBRXJCLFdBQVcsR0FBRyxFQUFFLENBQUM7SUFDakIsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUNuQixRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ2QsTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUVaLFdBQVcsR0FBRyxDQUFDLENBQUM7SUFDaEIsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNkLFlBQVksR0FBRyxFQUFFLENBQUM7SUFDbEIsZUFBZSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUVkLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBRWhELFlBQ1UsY0FBOEIsRUFDOUIsS0FBbUIsRUFDbkIsY0FBaUMsRUFDakMsWUFBc0I7UUFIdEIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLFVBQUssR0FBTCxLQUFLLENBQWM7UUFDbkIsbUJBQWMsR0FBZCxjQUFjLENBQW1CO1FBQ2pDLGlCQUFZLEdBQVosWUFBWSxDQUFVO0lBQzdCLENBQUM7SUFFSixvREFBb0Q7SUFDcEQsZ0JBQWdCLENBQUMsQ0FBTTtRQUNyQixJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNuRixJQUFJLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDakIsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQUM7Z0JBQzFELE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3RDLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3RDLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO2dCQUNiLENBQUMsQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLENBQUMsUUFBUSxNQUFNLENBQUM7Z0JBQ2pDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3BELEdBQUcsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDM0IsQ0FBQztZQUNELEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyw2QkFBNkIsQ0FBQztTQUNyRSxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsK0NBQStDO0lBQy9DLFdBQVcsQ0FBQyxDQUFNO1FBQ2hCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLHdCQUF3QixFQUFFO1lBQ2hFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSTtTQUM3QyxDQUFDLENBQUM7UUFDSCxRQUFRLENBQUMsaUJBQWlCLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLGlEQUFpRDtJQUNqRCxnQkFBZ0I7UUFDZCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUM1RCxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUk7U0FDN0MsQ0FBQyxDQUFDO1FBQ0gsUUFBUSxDQUFDLGlCQUFpQixDQUFDLElBQUksR0FBRyxVQUFVLENBQUM7UUFDN0MsUUFBUSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3BELFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBVyxFQUFFLEVBQUU7WUFDbkMsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO2dCQUN4QixJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztnQkFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzthQUNqQjtRQUNILENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLHFEQUFxRDtJQUNyRCxZQUFZLENBQUMsQ0FBTTtRQUNqQixJQUFJLENBQUMsRUFBRSxNQUFNLEtBQUssVUFBVSxFQUFFO1lBQzVCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLHdDQUF3QyxDQUFDLENBQUM7WUFDbkUsT0FBTztTQUNSO1FBQ0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUU7WUFDNUQsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJO1NBQzdDLENBQUMsQ0FBQztRQUNILFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEdBQUcsY0FBYyxDQUFDO1FBQ2pELFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNwRCxRQUFRLENBQUMsaUJBQWlCLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztRQUMzQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQVcsRUFBRSxFQUFFO1lBQ25DLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtnQkFDeEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2FBQ2pCO1FBQ0gsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUNqQjtJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTztRQUMzQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixNQUFNLE9BQU8sR0FBRztZQUNkLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDekIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3BCLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVztTQUN6QixDQUFDO1FBQ0YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDakYsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNsQyxJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU07b0JBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztnQkFDckQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdEMsQ0FBQztZQUNELEtBQUssRUFBRSxHQUFHLEVBQUU7Z0JBQ1YsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNmLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO2dCQUNwQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztnQkFDbkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN0QyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFNBQVMsQ0FBQyxFQUFVO1FBQ2xCLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRUQsT0FBTyxDQUFDLEVBQVU7UUFDaEIsSUFBSSxFQUFFLEtBQUssS0FBSztZQUFFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDM0MsT0FBUSxJQUFJLENBQUMsTUFBYyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRUQsSUFBSSxpQkFBaUI7UUFDbkIsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxZQUFZLENBQUMsSUFBWTtRQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUVELGdCQUFnQixDQUFDLElBQVk7UUFDM0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCw0QkFBNEI7SUFDNUIsZUFBZSxDQUFDLENBQVM7UUFDdkIsTUFBTSxHQUFHLEdBQTJCO1lBQ2xDLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLGlCQUFpQjtZQUM1RSxRQUFRLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxlQUFlO1NBQ3BELENBQUM7UUFDRixPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsV0FBVyxDQUFDLENBQVM7UUFDbkIsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3pELENBQUM7SUFDRCxjQUFjLENBQUMsQ0FBTTtRQUNuQixPQUFPLENBQUMsRUFBRSxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUM5QyxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNyQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQzlDLE9BQU87U0FDUjtRQUNELE1BQU0sT0FBTyxHQUFHO1lBQ2QsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQ2xELFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUMzRSxNQUFNLEVBQUUsSUFBSTtTQUNiLENBQUM7UUFDRixJQUFJLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3ZGLElBQUksRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNqQixNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLG1FQUFtRSxFQUFFLENBQUMsQ0FBQztnQkFDNUcsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEMsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDdEMsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7Z0JBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQztnQkFDNUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDcEQsR0FBRyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMzQixDQUFDO1lBQ0QsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQztTQUN2RCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsd0NBQXdDO0lBQ3hDLFlBQVksQ0FBQyxDQUFNLEVBQUUsTUFBYztRQUNqQyxJQUFJLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUMvRyxJQUFJLEVBQUUsR0FBRyxFQUFFO2dCQUNULElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDLFFBQVEsV0FBVyxNQUFNLEVBQUUsQ0FBQyxDQUFDO2dCQUN0RSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxPQUFPLElBQUksZUFBZSxDQUFDO1NBQ2pGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxjQUFjLENBQUMsQ0FBTTtRQUNuQixJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDakYsSUFBSSxFQUFFLEdBQUcsRUFBRTtnQkFDVCxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxRQUFRLFVBQVUsQ0FBQyxDQUFDO2dCQUM3RCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxPQUFPLElBQUksZUFBZSxDQUFDO1NBQ2pGLENBQUMsQ0FBQztJQUNMLENBQUM7d0dBclBVLGtCQUFrQjs0RkFBbEIsa0JBQWtCLDRHQ2YvQixpcFRBMEpNOzs0RkQzSU8sa0JBQWtCO2tCQUw5QixTQUFTOytCQUNFLGVBQWU7cUtBTWhCLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTmdiTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcbmltcG9ydCB7IEJpbGxpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYmlsbGluZy5zZXJ2aWNlJztcbmltcG9ydCB7IEVkaXRJbnZvaWNlQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFuZ28tbWFuYWdlLWJpbGxpbmcvZWRpdC1pbnZvaWNlL2VkaXQtaW52b2ljZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRXN0aW1hdGVQcmV2aWV3Q29tcG9uZW50IH0gZnJvbSAnLi9lc3RpbWF0ZS1wcmV2aWV3L2VzdGltYXRlLXByZXZpZXcuY29tcG9uZW50JztcblxuLy8gRXN0aW1hdGUgdGFiIChwcm90b3R5cGUgZGVzaWduKTogcGVyLWJyYW5kIGxpc3Qgb2YgcXVvdGF0aW9uIGRvY3VtZW50cyB3aXRoXG4vLyBzdGF0dXMgKERyYWZ0L1NlbnQvQWNjZXB0ZWQvRGVjbGluZWQvRXhwaXJlZCksIGRhdGUgZmlsdGVycyBhbmQgY3JlYXRlLlxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWVzdGltYXRlcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9lc3RpbWF0ZXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZXN0aW1hdGVzLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBFc3RpbWF0ZXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIC8vIEJyYW5kIGNvbnRleHQg4oCUIHBhc3NlZCBmcm9tIHRoZSBicmFuZC1pbnZvaWNlcyB3cmFwcGVyLlxuICBASW5wdXQoKSBjbGllbnRJZDogc3RyaW5nID0gJyc7XG5cbiAgbG9hZGluZyA9IHRydWU7XG4gIG5vRGF0YSA9IGZhbHNlO1xuICByb3dzOiBhbnlbXSA9IFtdO1xuICB0b3RhbEl0ZW1zID0gMDtcbiAgY291bnRzID0geyBkcmFmdDogMCwgc2VudDogMCwgYWNjZXB0ZWQ6IDAsIGRlY2xpbmVkOiAwLCBleHBpcmVkOiAwLCB0b3RhbDogMCB9O1xuXG4gIC8vIEZpbHRlciB0YWJzIGJ5IHN0YXR1cy5cbiAgc3RhdHVzVGFicyA9IFtcbiAgICB7IGlkOiAnQWxsJywgbGFiZWw6ICdBbGwnIH0sXG4gICAgeyBpZDogJ2RyYWZ0JywgbGFiZWw6ICdEcmFmdCcgfSxcbiAgICB7IGlkOiAnc2VudCcsIGxhYmVsOiAnU2VudCcgfSxcbiAgICB7IGlkOiAnYWNjZXB0ZWQnLCBsYWJlbDogJ0FjY2VwdGVkJyB9LFxuICAgIHsgaWQ6ICdkZWNsaW5lZCcsIGxhYmVsOiAnRGVjbGluZWQnIH0sXG4gICAgeyBpZDogJ2V4cGlyZWQnLCBsYWJlbDogJ0V4cGlyZWQnIH0sXG4gIF07XG4gIGFjdGl2ZVN0YXR1cyA9ICdBbGwnO1xuXG4gIHNlYXJjaFZhbHVlID0gJyc7XG4gIGZpbHRlck9wZW4gPSBmYWxzZTtcbiAgZnJvbURhdGUgPSAnJztcbiAgdG9EYXRlID0gJyc7XG5cbiAgY3VycmVudFBhZ2UgPSAxO1xuICBwYWdlU2l6ZSA9IDEwO1xuICBpdGVtc1BlclBhZ2UgPSAxMDtcbiAgcGFnaW5hdGlvblNpemVzID0gWzEwLCAyMCwgMzBdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYmlsbGluZ1NlcnZpY2U6IEJpbGxpbmdTZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9hc3Q6IFRvYXN0U2VydmljZSxcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTmdiTW9kYWwsXG4gICkge31cblxuICAvLyBEb3dubG9hZCB0aGUgZXN0aW1hdGUgYXMgYSBQREYgKHNlcnZlci1yZW5kZXJlZCkuXG4gIGRvd25sb2FkRXN0aW1hdGUoZTogYW55KSB7XG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5kb3dubG9hZEVzdGltYXRlKGUuX2lkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChidWY6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2J1Zl0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL3BkZicgfSk7XG4gICAgICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgIGEuaHJlZiA9IHVybDtcbiAgICAgICAgYS5kb3dubG9hZCA9IGAke2UuZXN0aW1hdGV9LnBkZmA7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7IGEuY2xpY2soKTsgYS5yZW1vdmUoKTtcbiAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0ZhaWxlZCB0byBkb3dubG9hZCBlc3RpbWF0ZScpLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gUmVhZC1vbmx5IHByZXZpZXcgcG9wdXAgZm9yIGFuIGVzdGltYXRlIHJvdy5cbiAgb3BlblByZXZpZXcoZTogYW55KSB7XG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKEVzdGltYXRlUHJldmlld0NvbXBvbmVudCwge1xuICAgICAgY2VudGVyZWQ6IHRydWUsIHNpemU6ICdsZycsIHNjcm9sbGFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuZXN0aW1hdGVEYXRhID0gZTtcbiAgfVxuXG4gIC8vIE9wZW5zIHRoZSBzYW1lIGZvcm0gQ3JlYXRlIEludm9pY2UgdXNlcywgaW4gJ2VzdGltYXRlJyBtb2RlIHNvIGl0IHBvc3RzIHRvXG4gIC8vIHRoZSBlc3RpbWF0ZSBBUEkgYW5kIHdyaXRlcyBhbiBFU1Qt4oCmIGRvY3VtZW50LlxuICBnZW5lcmF0ZUVzdGltYXRlKCkge1xuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihFZGl0SW52b2ljZUNvbXBvbmVudCwge1xuICAgICAgY2VudGVyZWQ6IHRydWUsIHNpemU6ICd4bCcsIHNjcm9sbGFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UubW9kZSA9ICdlc3RpbWF0ZSc7XG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuY2xpZW50SWQgPSB0aGlzLmNsaWVudElkO1xuICAgIG1vZGFsUmVmLnJlc3VsdC50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gJ2NyZWF0ZWQnKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xuICAgICAgICB0aGlzLmFjdGl2ZVN0YXR1cyA9ICdBbGwnO1xuICAgICAgICB0aGlzLmxvYWRMaXN0KCk7XG4gICAgICB9XG4gICAgfSkuY2F0Y2goKCkgPT4ge30pO1xuICB9XG5cbiAgLy8gT3BlbnMgdGhlIHNhbWUgZm9ybSBpbiAnZWRpdEVzdGltYXRlJyBtb2RlLCBwcmVmaWxsZWQgd2l0aCB0aGUgcm93J3MgZGF0YSxcbiAgLy8gYW5kIHJlbG9hZHMgdGhlIGxpc3Qgd2hlbiB0aGUgZXN0aW1hdGUgaXMgdXBkYXRlZC5cbiAgZWRpdEVzdGltYXRlKGU6IGFueSkge1xuICAgIGlmIChlPy5zdGF0dXMgPT09ICdhY2NlcHRlZCcpIHtcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnQW4gYWNjZXB0ZWQgZXN0aW1hdGUgY2Fubm90IGJlIGVkaXRlZC4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKEVkaXRJbnZvaWNlQ29tcG9uZW50LCB7XG4gICAgICBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ3hsJywgc2Nyb2xsYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5tb2RlID0gJ2VkaXRFc3RpbWF0ZSc7XG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuY2xpZW50SWQgPSB0aGlzLmNsaWVudElkO1xuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmludm9pY2VEYXRhID0gZTtcbiAgICBtb2RhbFJlZi5yZXN1bHQudGhlbigocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgIGlmIChyZXN1bHQgPT09ICd1cGRhdGVkJykge1xuICAgICAgICB0aGlzLmxvYWRMaXN0KCk7XG4gICAgICB9XG4gICAgfSkuY2F0Y2goKCkgPT4ge30pO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2xpZW50SWQpIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xuICAgICAgdGhpcy5sb2FkTGlzdCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIGxvYWRMaXN0KCkge1xuICAgIGlmICghdGhpcy5jbGllbnRJZCkgcmV0dXJuO1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgY29uc3QgZmlsdGVycyA9IHtcbiAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxuICAgICAgc3RhdHVzOiB0aGlzLmFjdGl2ZVN0YXR1cyxcbiAgICAgIHNlYXJjaFZhbHVlOiB0aGlzLnNlYXJjaFZhbHVlLFxuICAgICAgZnJvbURhdGU6IHRoaXMuZnJvbURhdGUsXG4gICAgICB0b0RhdGU6IHRoaXMudG9EYXRlLFxuICAgICAgbGltaXQ6IHRoaXMucGFnZVNpemUsXG4gICAgICBvZmZzZXQ6IHRoaXMuY3VycmVudFBhZ2UsXG4gICAgfTtcbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmVzdGltYXRlTGlzdChmaWx0ZXJzKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMucm93cyA9IHJlcz8uZGF0YT8uZGF0YSB8fCBbXTtcbiAgICAgICAgdGhpcy50b3RhbEl0ZW1zID0gcmVzPy5kYXRhPy5jb3VudCB8fCAwO1xuICAgICAgICBpZiAocmVzPy5kYXRhPy5jb3VudHMpIHRoaXMuY291bnRzID0gcmVzLmRhdGEuY291bnRzO1xuICAgICAgICB0aGlzLm5vRGF0YSA9IHRoaXMucm93cy5sZW5ndGggPT09IDA7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJvd3MgPSBbXTtcbiAgICAgICAgdGhpcy50b3RhbEl0ZW1zID0gMDtcbiAgICAgICAgdGhpcy5ub0RhdGEgPSB0cnVlO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBzZXRTdGF0dXMoaWQ6IHN0cmluZykge1xuICAgIHRoaXMuYWN0aXZlU3RhdHVzID0gaWQ7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XG4gICAgdGhpcy5sb2FkTGlzdCgpO1xuICB9XG5cbiAgY291bnRPZihpZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBpZiAoaWQgPT09ICdBbGwnKSByZXR1cm4gdGhpcy5jb3VudHMudG90YWw7XG4gICAgcmV0dXJuICh0aGlzLmNvdW50cyBhcyBhbnkpW2lkXSB8fCAwO1xuICB9XG5cbiAgc2VhcmNoRmllbGQoKSB7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XG4gICAgdGhpcy5sb2FkTGlzdCgpO1xuICB9XG5cbiAgZ2V0IGFjdGl2ZUZpbHRlckNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuICh0aGlzLmZyb21EYXRlID8gMSA6IDApICsgKHRoaXMudG9EYXRlID8gMSA6IDApO1xuICB9XG5cbiAgYXBwbHlGaWx0ZXJzKCkge1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xuICAgIHRoaXMubG9hZExpc3QoKTtcbiAgfVxuXG4gIGNsZWFyRmlsdGVycygpIHtcbiAgICB0aGlzLmZyb21EYXRlID0gJyc7XG4gICAgdGhpcy50b0RhdGUgPSAnJztcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgICB0aGlzLmxvYWRMaXN0KCk7XG4gIH1cblxuICBvblBhZ2VDaGFuZ2UocGFnZTogbnVtYmVyKSB7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHBhZ2U7XG4gICAgdGhpcy5sb2FkTGlzdCgpO1xuICB9XG5cbiAgb25QYWdlU2l6ZUNoYW5nZShzaXplOiBudW1iZXIpIHtcbiAgICB0aGlzLnBhZ2VTaXplID0gc2l6ZTtcbiAgICB0aGlzLml0ZW1zUGVyUGFnZSA9IHNpemU7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XG4gICAgdGhpcy5sb2FkTGlzdCgpO1xuICB9XG5cbiAgLy8gLS0tLSBkaXNwbGF5IGhlbHBlcnMgLS0tLVxuICBzdGF0dXNQaWxsQ2xhc3Moczogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBtYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBkcmFmdDogJ3BpbGwgcGlsbC1ncmF5Jywgc2VudDogJ3BpbGwgcGlsbC1ibHVlJywgYWNjZXB0ZWQ6ICdwaWxsIHBpbGwtZ3JlZW4nLFxuICAgICAgZGVjbGluZWQ6ICdwaWxsIHBpbGwtcmVkJywgZXhwaXJlZDogJ3BpbGwgcGlsbC1yZWQnLFxuICAgIH07XG4gICAgcmV0dXJuIG1hcFtzXSB8fCAncGlsbCBwaWxsLWdyYXknO1xuICB9XG4gIHN0YXR1c0xhYmVsKHM6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHMgPyBzLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcy5zbGljZSgxKSA6ICcnO1xuICB9XG4gIGN1cnJlbmN5U3ltYm9sKGU6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGU/LmN1cnJlbmN5ID09PSAnZG9sbGFyJyA/ICckJyA6ICfigrknO1xuICB9XG5cbiAgb25FeHBvcnQoKSB7XG4gICAgaWYgKCF0aGlzLnJvd3MubGVuZ3RoKSB7XG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ05vdGhpbmcgdG8gZXhwb3J0Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZpbHRlcnMgPSB7XG4gICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZCwgc3RhdHVzOiB0aGlzLmFjdGl2ZVN0YXR1cyxcbiAgICAgIHNlYXJjaFZhbHVlOiB0aGlzLnNlYXJjaFZhbHVlLCBmcm9tRGF0ZTogdGhpcy5mcm9tRGF0ZSwgdG9EYXRlOiB0aGlzLnRvRGF0ZSxcbiAgICAgIGV4cG9ydDogdHJ1ZSxcbiAgICB9O1xuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuZXN0aW1hdGVMaXN0RXhwb3J0KGZpbHRlcnMpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGJ1ZjogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYnVmXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQnIH0pO1xuICAgICAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICBhLmhyZWYgPSB1cmw7IGEuZG93bmxvYWQgPSAnZXN0aW1hdGVzLnhsc3gnO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpOyBhLmNsaWNrKCk7IGEucmVtb3ZlKCk7XG4gICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4gdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdFeHBvcnQgZmFpbGVkJyksXG4gICAgfSk7XG4gIH1cblxuICAvLyBRdWljayBsaWZlY3ljbGUgYWN0aW9ucyBmcm9tIHRoZSByb3cuXG4gIHVwZGF0ZVN0YXR1cyhlOiBhbnksIHN0YXR1czogc3RyaW5nKSB7XG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5lc3RpbWF0ZVN0YXR1c1VwZGF0ZSh7IGVzdGltYXRlSWQ6IGUuX2lkLCBzdGF0dXMgfSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMudG9hc3QuZ2V0UHJpbWFyeVRvYXN0KGBFc3RpbWF0ZSAke2UuZXN0aW1hdGV9IG1hcmtlZCAke3N0YXR1c31gKTtcbiAgICAgICAgdGhpcy5sb2FkTGlzdCgpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCAnVXBkYXRlIGZhaWxlZCcpLFxuICAgIH0pO1xuICB9XG5cbiAgZGVsZXRlRXN0aW1hdGUoZTogYW55KSB7XG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5kZWxldGVFc3RpbWF0ZShlLl9pZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMudG9hc3QuZ2V0UHJpbWFyeVRvYXN0KGBFc3RpbWF0ZSAke2UuZXN0aW1hdGV9IHJlbW92ZWRgKTtcbiAgICAgICAgdGhpcy5sb2FkTGlzdCgpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCAnRGVsZXRlIGZhaWxlZCcpLFxuICAgIH0pO1xuICB9XG59IiwiPGRpdiBjbGFzcz1cInB4LTFcIj5cbiAgICA8IS0tIEhlYWRlciAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LXdyYXAgZ2FwLTJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJpbGxpbmdoZWFkZXJcIj5Fc3RpbWF0ZXMgPHNwYW4gY2xhc3M9XCJjb3VudGNoaXAgbXMtMVwiPnt7IGNvdW50cy50b3RhbCB9fTwvc3Bhbj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3ZnLWljb24gZXN0LXNlYXJjaC1pYyBwb3NpdGlvbi1hYnNvbHV0ZSBtdC0yIG1zLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM5OGEyYjNcIiBzdHJva2Utd2lkdGg9XCIyXCI+PGNpcmNsZSBjeD1cIjExXCIgY3k9XCIxMVwiIHI9XCI3XCIgLz48cGF0aCBkPVwiTTIxIDIxbC00LTRcIiAvPjwvc3ZnPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgWyhuZ01vZGVsKV09XCJzZWFyY2hWYWx1ZVwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgcHMtMTIgZXN0LXNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRXN0aW1hdGUgIyBvciBiaWxsaW5nIGdyb3VwLi4uXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgKGNoYW5nZSk9XCJzZWFyY2hGaWVsZCgpXCI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLW91dGxpbmUgYnRuIGFsaWduLWl0ZW1zLWNlbnRlciB0ZXh0LW5vd3JhcCBlc3QtYnRuXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZmlsdGVyT3BlbiA9ICFmaWx0ZXJPcGVuXCI+XG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjJcIj48cGF0aCBkPVwiTTMgNWgxOE02IDEyaDEyTTEwIDE5aDRcIiAvPjwvc3ZnPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtMlwiPkZpbHRlcjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImFjdGl2ZUZpbHRlckNvdW50XCIgY2xhc3M9XCJjb3VudGNoaXAgbXMtMVwiPnt7IGFjdGl2ZUZpbHRlckNvdW50IH19PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1vdXRsaW5lIGJ0biBhbGlnbi1pdGVtcy1jZW50ZXIgdGV4dC1ub3dyYXAgZXN0LWJ0blwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFyb3dzLmxlbmd0aFwiIChjbGljayk9XCJvbkV4cG9ydCgpXCI+XG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjJcIj48cGF0aCBkPVwiTTEyIDN2MTJNOCA3bDQtNCA0IDRNNSAxNXY0aDE0di00XCIgLz48L3N2Zz5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTJcIj5FeHBvcnQ8L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGFsaWduLWl0ZW1zLWNlbnRlciB0ZXh0LW5vd3JhcFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImdlbmVyYXRlRXN0aW1hdGUoKVwiPlxuICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNmZmZcIiBzdHJva2Utd2lkdGg9XCIyLjJcIj48cGF0aCBkPVwiTTEyIDV2MTRNNSAxMmgxNFwiIC8+PC9zdmc+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0yXCI+R2VuZXJhdGUgRXN0aW1hdGU8L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEZpbHRlciBwYW5lbCAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiZmlsdGVyT3BlblwiIGNsYXNzPVwiZmlsdGVyLXBhbmVsIG10LTNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBnLTNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGwgZnctc2VtaWJvbGRcIj5HZW5lcmF0ZWQg4oCUIGZyb208L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZGF0ZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJmcm9tRGF0ZVwiIChjaGFuZ2UpPVwiYXBwbHlGaWx0ZXJzKClcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBzbWFsbCBmdy1zZW1pYm9sZFwiPkdlbmVyYXRlZCDigJQgdG88L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZGF0ZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJ0b0RhdGVcIiAoY2hhbmdlKT1cImFwcGx5RmlsdGVycygpXCI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG10LTNcIiAqbmdJZj1cImFjdGl2ZUZpbHRlckNvdW50XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGxcIj57eyB0b3RhbEl0ZW1zIH19IGVzdGltYXRlcyBtYXRjaDwvc3Bhbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxpbmsgYnRuLXNtIHAtMFwiIChjbGljayk9XCJjbGVhckZpbHRlcnMoKVwiPkNsZWFyIGFsbCBmaWx0ZXJzPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBTdGF0dXMgdGFicyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiBmbGV4LXdyYXAgbXQtM1wiPlxuICAgICAgICA8YnV0dG9uICpuZ0Zvcj1cImxldCB0YWIgb2Ygc3RhdHVzVGFic1wiIGNsYXNzPVwiYnRuIGJ0bi1zbSBzdGF0dXMtdGFiXCJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlU3RhdHVzID09PSB0YWIuaWRcIiAoY2xpY2spPVwic2V0U3RhdHVzKHRhYi5pZClcIj5cbiAgICAgICAgICAgIHt7IHRhYi5sYWJlbCB9fVxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb3VudE9mKHRhYi5pZClcIiBjbGFzcz1cImNvdW50Y2hpcCBtcy0xXCI+e3sgY291bnRPZih0YWIuaWQpIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gTG9hZGluZyAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibG9hZGluZ1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGxvYWRlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtNFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGRlc2NyaXB0aW9uXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIEVtcHR5IC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbG9hZGluZyAmJiBub0RhdGFcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy0xMiBtYi0zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1jb2x1bW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImltZy1zcmMgdy0yNVwiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YS5zdmdcIiBhbHQ9XCJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWQgbXQtMlwiPk5vIGVzdGltYXRlcyBtYXRjaCB0aGlzIGZpbHRlci48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gVGFibGUgLS0+XG4gICAgPGRpdiAqbmdJZj1cIiFsb2FkaW5nICYmICFub0RhdGFcIiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmUgbXQtMlwiPlxuICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBib3R0b20tYm9yZGVyIGVzdC10YWJsZSB0ZXh0LW5vd3JhcFwiPlxuICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgPHRoPkVzdGltYXRlICM8L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGg+QmlsbGluZyBHcm91cDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aD5QZXJpb2Q8L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGg+R2VuZXJhdGVkPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoPlZhbGlkIFRpbGw8L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPk5vIG9mIFN0b3JlczwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInRleHQtZW5kXCI+QW1vdW50IChleGNsLiBHU1QpPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwidGV4dC1lbmRcIj5BbW91bnQgKGluY2wuIEdTVCk8L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGg+U3RhdHVzPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoPkFjdGlvbjwvdGg+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBlIG9mIHJvd3NcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiZXN0LW5vXCI+PGEgY2xhc3M9XCJlc3QtbGlua1wiIChjbGljayk9XCJvcGVuUHJldmlldyhlKVwiPnt7IGUuZXN0aW1hdGUgfX08L2E+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkLWlubGluZS1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiM5OGEyYjNcIiBzdHJva2Utd2lkdGg9XCIyXCI+PHJlY3QgeD1cIjNcIiB5PVwiNVwiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxNlwiIHJ4PVwiMlwiLz48cGF0aCBkPVwiTTMgOWgxOE04IDN2NE0xNiAzdjRcIi8+PC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZS5ncm91cE5hbWUgfHwgJ0RlZmF1bHQgR3JvdXAnIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD57eyBlLnBlcmlvZCB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD57eyBlLmNyZWF0ZWREYXRlIHwgZGF0ZTogJ2RkIE1NTSB5eXl5JyB9fTwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD57eyBlLnZhbGlkVGlsbCB8IGRhdGU6ICdkZCBNTU0geXl5eScgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPjxiPnt7IGUuc3RvcmVzIH19PC9iPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtZW5kXCI+e3sgY3VycmVuY3lTeW1ib2woZSkgfX17eyBlLmFtb3VudCB8IG51bWJlcjonMS4wLTInOidlbi1JTicgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWVuZFwiPjxiPnt7IGN1cnJlbmN5U3ltYm9sKGUpIH19e3sgZS50b3RhbEFtb3VudCB8IG51bWJlcjonMS4wLTInOidlbi1JTicgfX08L2I+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPjxzcGFuIFtuZ0NsYXNzXT1cInN0YXR1c1BpbGxDbGFzcyhlLnN0YXR1cylcIj57eyBzdGF0dXNMYWJlbChlLnN0YXR1cykgfX08L3NwYW4+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvLWJ0blwiIHRpdGxlPVwiUHJldmlld1wiIChjbGljayk9XCJvcGVuUHJldmlldyhlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjJcIj48cGF0aCBkPVwiTTIgMTJzMy41LTcgMTAtNyAxMCA3IDEwIDctMy41IDctMTAgNy0xMC03LTEwLTd6XCIvPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiM1wiLz48L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvLWJ0blwiIHRpdGxlPVwiRG93bmxvYWQgUERGXCIgKGNsaWNrKT1cImRvd25sb2FkRXN0aW1hdGUoZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIyXCI+PHBhdGggZD1cIk0xMiAzdjEyTTggMTFsNCA0IDQtNE01IDE5aDE0XCIvPjwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY28tYnRuXCIgdGl0bGU9XCJFZGl0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJlLnN0YXR1cyAhPT0gJ2FjY2VwdGVkJ1wiIChjbGljayk9XCJlZGl0RXN0aW1hdGUoZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIyXCI+PHBhdGggZD1cIk0xMiAyMGg5TTE2LjUgMy41YTIuMTIgMi4xMiAwIDAgMSAzIDNMNyAxOWwtNCAxIDEtNCAxMi41LTEyLjV6XCIvPjwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJlLnN0YXR1cyA9PT0gJ2RyYWZ0J1wiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tcHJpbWFyeSBweS0xIHB4LTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidXBkYXRlU3RhdHVzKGUsICdzZW50JylcIiB0aXRsZT1cIk1hcmsgYXMgc2VudFwiPlNlbmQ8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZS5zdGF0dXMgPT09ICdzZW50J1wiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tc3VjY2VzcyBweS0xIHB4LTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidXBkYXRlU3RhdHVzKGUsICdhY2NlcHRlZCcpXCIgdGl0bGU9XCJNYXJrIGFjY2VwdGVkXCI+QWNjZXB0PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljby1idG5cIiB0aXRsZT1cIkRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZS5zdGF0dXMgIT09ICdhY2NlcHRlZCdcIiAoY2xpY2spPVwiZGVsZXRlRXN0aW1hdGUoZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiNkOTJkMjBcIiBzdHJva2Utd2lkdGg9XCIyXCI+PHBhdGggZD1cIk00IDdoMTZNOSA3VjVhMSAxIDAgMCAxIDEtMWg0YTEgMSAwIDAgMSAxIDF2Mk02IDdsMSAxM2gxMGwxLTEzXCIvPjwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgIDwvdGFibGU+XG4gICAgICAgIDxsaWItcGFnaW5hdGlvbiBjbGFzcz1cInRleHQtc3RhcnRcIiBbaXRlbXNQZXJQYWdlXT1cIml0ZW1zUGVyUGFnZVwiIFtjdXJyZW50UGFnZV09XCJjdXJyZW50UGFnZVwiXG4gICAgICAgICAgICBbdG90YWxJdGVtc109XCJ0b3RhbEl0ZW1zXCIgW3BhZ2luYXRpb25TaXplc109XCJwYWdpbmF0aW9uU2l6ZXNcIiBbcGFnZVNpemVdPVwicGFnZVNpemVcIlxuICAgICAgICAgICAgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIiAocGFnZVNpemVDaGFuZ2UpPVwib25QYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCI+PC9saWItcGFnaW5hdGlvbj5cbiAgICA8L2Rpdj5cbjwvZGl2PiJdfQ==
277
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXN0aW1hdGVzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9lc3RpbWF0ZXMvZXN0aW1hdGVzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9lc3RpbWF0ZXMvZXN0aW1hdGVzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsU0FBUyxFQUFFLEtBQUssRUFBd0IsTUFBTSxlQUFlLENBQUM7QUFDMUYsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFJMUMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkRBQTZELENBQUM7QUFDbkcsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDekYsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sNkVBQTZFLENBQUM7Ozs7Ozs7QUFFM0gsOEVBQThFO0FBQzlFLDRFQUE0RTtBQU01RSxNQUFNLE9BQU8sa0JBQWtCO0lBa0NuQjtJQUNBO0lBQ0E7SUFDQTtJQXBDViwwREFBMEQ7SUFDakQsUUFBUSxHQUFXLEVBQUUsQ0FBQztJQUUvQixPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ2YsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUNmLElBQUksR0FBVSxFQUFFLENBQUM7SUFDakIsVUFBVSxHQUFHLENBQUMsQ0FBQztJQUNmLE1BQU0sR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENB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Q0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsT0FBTyxJQUFJLHlCQUF5QixDQUFDO2FBQzNGLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQsY0FBYyxDQUFDLENBQU07UUFDbkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ2pGLElBQUksRUFBRSxHQUFHLEVBQUU7Z0JBQ1QsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUMsUUFBUSxVQUFVLENBQUMsQ0FBQztnQkFDN0QsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsT0FBTyxJQUFJLGVBQWUsQ0FBQztTQUNqRixDQUFDLENBQUM7SUFDTCxDQUFDO3dHQTFRVSxrQkFBa0I7NEZBQWxCLGtCQUFrQiw0R0NoQi9CLGd0U0FzSk07OzRGRHRJTyxrQkFBa0I7a0JBTDlCLFNBQVM7K0JBQ0UsZUFBZTtxS0FNaEIsUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBOZ2JNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xuaW1wb3J0IHsgQmlsbGluZ1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9iaWxsaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgRWRpdEludm9pY2VDb21wb25lbnQgfSBmcm9tICcuLi90YW5nby1tYW5hZ2UtYmlsbGluZy9lZGl0LWludm9pY2UvZWRpdC1pbnZvaWNlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFc3RpbWF0ZVByZXZpZXdDb21wb25lbnQgfSBmcm9tICcuL2VzdGltYXRlLXByZXZpZXcvZXN0aW1hdGUtcHJldmlldy5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVxdWVzdENvbmZpcm1hdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3JlcXVlc3QtY29uZmlybWF0aW9uL3JlcXVlc3QtY29uZmlybWF0aW9uLmNvbXBvbmVudCc7XG5cbi8vIEVzdGltYXRlIHRhYiAocHJvdG90eXBlIGRlc2lnbik6IHBlci1icmFuZCBsaXN0IG9mIHF1b3RhdGlvbiBkb2N1bWVudHMgd2l0aFxuLy8gc3RhdHVzIChQZW5kaW5nL1NlbnQvQWNjZXB0ZWQvRGVjbGluZWQvRXhwaXJlZCksIGRhdGUgZmlsdGVycyBhbmQgY3JlYXRlLlxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWVzdGltYXRlcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9lc3RpbWF0ZXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZXN0aW1hdGVzLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBFc3RpbWF0ZXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIC8vIEJyYW5kIGNvbnRleHQg4oCUIHBhc3NlZCBmcm9tIHRoZSBicmFuZC1pbnZvaWNlcyB3cmFwcGVyLlxuICBASW5wdXQoKSBjbGllbnRJZDogc3RyaW5nID0gJyc7XG5cbiAgbG9hZGluZyA9IHRydWU7XG4gIG5vRGF0YSA9IGZhbHNlO1xuICByb3dzOiBhbnlbXSA9IFtdO1xuICB0b3RhbEl0ZW1zID0gMDtcbiAgY291bnRzID0geyBwZW5kaW5nOiAwLCBzZW50OiAwLCBhY2NlcHRlZDogMCwgZGVjbGluZWQ6IDAsIGV4cGlyZWQ6IDAsIHRvdGFsOiAwIH07XG5cbiAgLy8gRmlsdGVyIHRhYnMgYnkgc3RhdHVzLlxuICBzdGF0dXNUYWJzID0gW1xuICAgIHsgaWQ6ICdBbGwnLCBsYWJlbDogJ0FsbCcgfSxcbiAgICB7IGlkOiAncGVuZGluZycsIGxhYmVsOiAnUGVuZGluZycgfSxcbiAgICB7IGlkOiAnc2VudCcsIGxhYmVsOiAnU2VudCcgfSxcbiAgICB7IGlkOiAnYWNjZXB0ZWQnLCBsYWJlbDogJ0FjY2VwdGVkJyB9LFxuICAgIHsgaWQ6ICdkZWNsaW5lZCcsIGxhYmVsOiAnRGVjbGluZWQnIH0sXG4gICAgeyBpZDogJ2V4cGlyZWQnLCBsYWJlbDogJ0V4cGlyZWQnIH0sXG4gIF07XG4gIGFjdGl2ZVN0YXR1cyA9ICdBbGwnO1xuXG4gIHNlYXJjaFZhbHVlID0gJyc7XG4gIGZpbHRlck9wZW4gPSBmYWxzZTtcbiAgZnJvbURhdGUgPSAnJztcbiAgdG9EYXRlID0gJyc7XG5cbiAgY3VycmVudFBhZ2UgPSAxO1xuICBwYWdlU2l6ZSA9IDEwO1xuICBpdGVtc1BlclBhZ2UgPSAxMDtcbiAgcGFnaW5hdGlvblNpemVzID0gWzEwLCAyMCwgMzBdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYmlsbGluZ1NlcnZpY2U6IEJpbGxpbmdTZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9hc3Q6IFRvYXN0U2VydmljZSxcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTmdiTW9kYWwsXG4gICkge31cblxuICAvLyBEb3dubG9hZCB0aGUgZXN0aW1hdGUgYXMgYSBQREYgKHNlcnZlci1yZW5kZXJlZCkuXG4gIGRvd25sb2FkRXN0aW1hdGUoZTogYW55KSB7XG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5kb3dubG9hZEVzdGltYXRlKGUuX2lkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChidWY6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2J1Zl0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL3BkZicgfSk7XG4gICAgICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgIGEuaHJlZiA9IHVybDtcbiAgICAgICAgYS5kb3dubG9hZCA9IGAke2UuZXN0aW1hdGV9LnBkZmA7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7IGEuY2xpY2soKTsgYS5yZW1vdmUoKTtcbiAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0ZhaWxlZCB0byBkb3dubG9hZCBlc3RpbWF0ZScpLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gUmVhZC1vbmx5IHByZXZpZXcgcG9wdXAgZm9yIGFuIGVzdGltYXRlIHJvdy5cbiAgb3BlblByZXZpZXcoZTogYW55KSB7XG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKEVzdGltYXRlUHJldmlld0NvbXBvbmVudCwge1xuICAgICAgY2VudGVyZWQ6IHRydWUsIHNpemU6ICdsZycsIHNjcm9sbGFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuZXN0aW1hdGVEYXRhID0gZTtcbiAgfVxuXG4gIC8vIE9wZW5zIHRoZSBzYW1lIGZvcm0gQ3JlYXRlIEludm9pY2UgdXNlcywgaW4gJ2VzdGltYXRlJyBtb2RlIHNvIGl0IHBvc3RzIHRvXG4gIC8vIHRoZSBlc3RpbWF0ZSBBUEkgYW5kIHdyaXRlcyBhbiBFU1Qt4oCmIGRvY3VtZW50LlxuICBnZW5lcmF0ZUVzdGltYXRlKCkge1xuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihFZGl0SW52b2ljZUNvbXBvbmVudCwge1xuICAgICAgY2VudGVyZWQ6IHRydWUsIHNpemU6ICd4bCcsIHNjcm9sbGFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UubW9kZSA9ICdlc3RpbWF0ZSc7XG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuY2xpZW50SWQgPSB0aGlzLmNsaWVudElkO1xuICAgIG1vZGFsUmVmLnJlc3VsdC50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gJ2NyZWF0ZWQnKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xuICAgICAgICB0aGlzLmFjdGl2ZVN0YXR1cyA9ICdBbGwnO1xuICAgICAgICB0aGlzLmxvYWRMaXN0KCk7XG4gICAgICB9XG4gICAgfSkuY2F0Y2goKCkgPT4ge30pO1xuICB9XG5cbiAgLy8gT3BlbnMgdGhlIHNhbWUgZm9ybSBpbiAnZWRpdEVzdGltYXRlJyBtb2RlLCBwcmVmaWxsZWQgd2l0aCB0aGUgcm93J3MgZGF0YSxcbiAgLy8gYW5kIHJlbG9hZHMgdGhlIGxpc3Qgd2hlbiB0aGUgZXN0aW1hdGUgaXMgdXBkYXRlZC5cbiAgZWRpdEVzdGltYXRlKGU6IGFueSkge1xuICAgIGlmIChlPy5zdGF0dXMgPT09ICdhY2NlcHRlZCcpIHtcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnQW4gYWNjZXB0ZWQgZXN0aW1hdGUgY2Fubm90IGJlIGVkaXRlZC4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKEVkaXRJbnZvaWNlQ29tcG9uZW50LCB7XG4gICAgICBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ3hsJywgc2Nyb2xsYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5tb2RlID0gJ2VkaXRFc3RpbWF0ZSc7XG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuY2xpZW50SWQgPSB0aGlzLmNsaWVudElkO1xuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmludm9pY2VEYXRhID0gZTtcbiAgICBtb2RhbFJlZi5yZXN1bHQudGhlbigocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgIGlmIChyZXN1bHQgPT09ICd1cGRhdGVkJykge1xuICAgICAgICB0aGlzLmxvYWRMaXN0KCk7XG4gICAgICB9XG4gICAgfSkuY2F0Y2goKCkgPT4ge30pO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2xpZW50SWQpIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xuICAgICAgdGhpcy5sb2FkTGlzdCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIGxvYWRMaXN0KCkge1xuICAgIGlmICghdGhpcy5jbGllbnRJZCkgcmV0dXJuO1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgY29uc3QgZmlsdGVycyA9IHtcbiAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxuICAgICAgc3RhdHVzOiB0aGlzLmFjdGl2ZVN0YXR1cyxcbiAgICAgIHNlYXJjaFZhbHVlOiB0aGlzLnNlYXJjaFZhbHVlLFxuICAgICAgZnJvbURhdGU6IHRoaXMuZnJvbURhdGUsXG4gICAgICB0b0RhdGU6IHRoaXMudG9EYXRlLFxuICAgICAgbGltaXQ6IHRoaXMucGFnZVNpemUsXG4gICAgICBvZmZzZXQ6IHRoaXMuY3VycmVudFBhZ2UsXG4gICAgfTtcbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmVzdGltYXRlTGlzdChmaWx0ZXJzKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMucm93cyA9IHJlcz8uZGF0YT8uZGF0YSB8fCBbXTtcbiAgICAgICAgdGhpcy50b3RhbEl0ZW1zID0gcmVzPy5kYXRhPy5jb3VudCB8fCAwO1xuICAgICAgICBpZiAocmVzPy5kYXRhPy5jb3VudHMpIHRoaXMuY291bnRzID0gcmVzLmRhdGEuY291bnRzO1xuICAgICAgICB0aGlzLm5vRGF0YSA9IHRoaXMucm93cy5sZW5ndGggPT09IDA7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJvd3MgPSBbXTtcbiAgICAgICAgdGhpcy50b3RhbEl0ZW1zID0gMDtcbiAgICAgICAgdGhpcy5ub0RhdGEgPSB0cnVlO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBzZXRTdGF0dXMoaWQ6IHN0cmluZykge1xuICAgIHRoaXMuYWN0aXZlU3RhdHVzID0gaWQ7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XG4gICAgdGhpcy5sb2FkTGlzdCgpO1xuICB9XG5cbiAgY291bnRPZihpZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBpZiAoaWQgPT09ICdBbGwnKSByZXR1cm4gdGhpcy5jb3VudHMudG90YWw7XG4gICAgcmV0dXJuICh0aGlzLmNvdW50cyBhcyBhbnkpW2lkXSB8fCAwO1xuICB9XG5cbiAgc2VhcmNoRmllbGQoKSB7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XG4gICAgdGhpcy5sb2FkTGlzdCgpO1xuICB9XG5cbiAgZ2V0IGFjdGl2ZUZpbHRlckNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuICh0aGlzLmZyb21EYXRlID8gMSA6IDApICsgKHRoaXMudG9EYXRlID8gMSA6IDApO1xuICB9XG5cbiAgYXBwbHlGaWx0ZXJzKCkge1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xuICAgIHRoaXMubG9hZExpc3QoKTtcbiAgfVxuXG4gIGNsZWFyRmlsdGVycygpIHtcbiAgICB0aGlzLmZyb21EYXRlID0gJyc7XG4gICAgdGhpcy50b0RhdGUgPSAnJztcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgICB0aGlzLmxvYWRMaXN0KCk7XG4gIH1cblxuICBvblBhZ2VDaGFuZ2UocGFnZTogbnVtYmVyKSB7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHBhZ2U7XG4gICAgdGhpcy5sb2FkTGlzdCgpO1xuICB9XG5cbiAgb25QYWdlU2l6ZUNoYW5nZShzaXplOiBudW1iZXIpIHtcbiAgICB0aGlzLnBhZ2VTaXplID0gc2l6ZTtcbiAgICB0aGlzLml0ZW1zUGVyUGFnZSA9IHNpemU7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XG4gICAgdGhpcy5sb2FkTGlzdCgpO1xuICB9XG5cbiAgLy8gLS0tLSBkaXNwbGF5IGhlbHBlcnMgLS0tLVxuICBzdGF0dXNQaWxsQ2xhc3Moczogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBtYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBwZW5kaW5nOiAncGlsbCBwaWxsLWFtYmVyJywgc2VudDogJ3BpbGwgcGlsbC1ibHVlJywgYWNjZXB0ZWQ6ICdwaWxsIHBpbGwtZ3JlZW4nLFxuICAgICAgZGVjbGluZWQ6ICdwaWxsIHBpbGwtcmVkJywgZXhwaXJlZDogJ3BpbGwgcGlsbC1yZWQnLFxuICAgIH07XG4gICAgcmV0dXJuIG1hcFtzXSB8fCAncGlsbCBwaWxsLWdyYXknO1xuICB9XG4gIHN0YXR1c0xhYmVsKHM6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHMgPyBzLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcy5zbGljZSgxKSA6ICcnO1xuICB9XG4gIGN1cnJlbmN5U3ltYm9sKGU6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGU/LmN1cnJlbmN5ID09PSAnZG9sbGFyJyA/ICckJyA6ICfigrknO1xuICB9XG5cbiAgb25FeHBvcnQoKSB7XG4gICAgaWYgKCF0aGlzLnJvd3MubGVuZ3RoKSB7XG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ05vdGhpbmcgdG8gZXhwb3J0Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZpbHRlcnMgPSB7XG4gICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZCwgc3RhdHVzOiB0aGlzLmFjdGl2ZVN0YXR1cyxcbiAgICAgIHNlYXJjaFZhbHVlOiB0aGlzLnNlYXJjaFZhbHVlLCBmcm9tRGF0ZTogdGhpcy5mcm9tRGF0ZSwgdG9EYXRlOiB0aGlzLnRvRGF0ZSxcbiAgICAgIGV4cG9ydDogdHJ1ZSxcbiAgICB9O1xuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuZXN0aW1hdGVMaXN0RXhwb3J0KGZpbHRlcnMpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGJ1ZjogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYnVmXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQnIH0pO1xuICAgICAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICBhLmhyZWYgPSB1cmw7IGEuZG93bmxvYWQgPSAnZXN0aW1hdGVzLnhsc3gnO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpOyBhLmNsaWNrKCk7IGEucmVtb3ZlKCk7XG4gICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4gdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdFeHBvcnQgZmFpbGVkJyksXG4gICAgfSk7XG4gIH1cblxuICAvLyBRdWljayBsaWZlY3ljbGUgYWN0aW9ucyBmcm9tIHRoZSByb3cuXG4gIHVwZGF0ZVN0YXR1cyhlOiBhbnksIHN0YXR1czogc3RyaW5nKSB7XG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5lc3RpbWF0ZVN0YXR1c1VwZGF0ZSh7IGVzdGltYXRlSWQ6IGUuX2lkLCBzdGF0dXMgfSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMudG9hc3QuZ2V0UHJpbWFyeVRvYXN0KGBFc3RpbWF0ZSAke2UuZXN0aW1hdGV9IG1hcmtlZCAke3N0YXR1c31gKTtcbiAgICAgICAgdGhpcy5sb2FkTGlzdCgpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCAnVXBkYXRlIGZhaWxlZCcpLFxuICAgIH0pO1xuICB9XG5cbiAgLy8gQXBwcm92ZSBhIHBlbmRpbmcgZXN0aW1hdGU6IGNvbmZpcm0sIHRoZW4gZW1haWwgdGhlIGVzdGltYXRlIFBERiB0byB0aGVcbiAgLy8gYmlsbGluZy1ncm91cCByZWNpcGllbnRzIChzYW1lIGZsb3cgYXMgaW52b2ljZSBzZW5kKSBhbmQgZmxpcCBpdCB0byBTZW50LlxuICBhcHByb3ZlQW5kU2VuZChlOiBhbnkpIHtcbiAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oUmVxdWVzdENvbmZpcm1hdGlvbkNvbXBvbmVudCwge1xuICAgICAgY2VudGVyZWQ6IHRydWUsIHNpemU6ICdtZCcsIHNjcm9sbGFibGU6IHRydWUsXG4gICAgfSk7XG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UudGl0bGUgPSAnQXBwcm92ZSAmIHNlbmQgZXN0aW1hdGU/JztcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5kZXNjcmlwdGlvbiA9XG4gICAgICBgRXN0aW1hdGUgJHtlLmVzdGltYXRlfSB3aWxsIGJlIGVtYWlsZWQgKHdpdGggdGhlIFBERiBhdHRhY2hlZCkgdG8gdGhlIGJpbGxpbmcgZ3JvdXAncyByZWNpcGllbnRzIGFuZCBtYXJrZWQgYXMgU2VudC4gVGhpcyBhY3Rpb24gY2Fubm90IGJlIHVuZG9uZS5gO1xuICAgIG1vZGFsUmVmLnJlc3VsdC50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCAhPT0gJ1llcycpIHJldHVybjtcbiAgICAgIHRoaXMuYmlsbGluZ1NlcnZpY2Uuc2VuZEVzdGltYXRlKGUuX2lkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0UHJpbWFyeVRvYXN0KGBFc3RpbWF0ZSAke2UuZXN0aW1hdGV9IHNlbnRgKTtcbiAgICAgICAgICB0aGlzLmxvYWRMaXN0KCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCAnRmFpbGVkIHRvIHNlbmQgZXN0aW1hdGUnKSxcbiAgICAgIH0pO1xuICAgIH0pLmNhdGNoKCgpID0+IHt9KTtcbiAgfVxuXG4gIGRlbGV0ZUVzdGltYXRlKGU6IGFueSkge1xuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuZGVsZXRlRXN0aW1hdGUoZS5faWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICB0aGlzLnRvYXN0LmdldFByaW1hcnlUb2FzdChgRXN0aW1hdGUgJHtlLmVzdGltYXRlfSByZW1vdmVkYCk7XG4gICAgICAgIHRoaXMubG9hZExpc3QoKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycikgPT4gdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ0RlbGV0ZSBmYWlsZWQnKSxcbiAgICB9KTtcbiAgfVxufSIsIjxkaXYgY2xhc3M9XCJweC0xXCI+XG4gICAgPCEtLSBIZWFkZXIgLS0+XG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC13cmFwIGdhcC0yXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJiaWxsaW5naGVhZGVyXCI+RXN0aW1hdGVzIDxzcGFuIGNsYXNzPVwiY291bnRjaGlwIG1zLTFcIj57eyBjb3VudHMudG90YWwgfX08L3NwYW4+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmVcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN2Zy1pY29uIGVzdC1zZWFyY2gtaWMgcG9zaXRpb24tYWJzb2x1dGUgbXQtMiBtcy0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjOThhMmIzXCIgc3Ryb2tlLXdpZHRoPVwiMlwiPjxjaXJjbGUgY3g9XCIxMVwiIGN5PVwiMTFcIiByPVwiN1wiIC8+PHBhdGggZD1cIk0yMSAyMWwtNC00XCIgLz48L3N2Zz5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPGlucHV0IFsobmdNb2RlbCldPVwic2VhcmNoVmFsdWVcIiB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHBzLTEyIGVzdC1zZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVzdGltYXRlICMgb3IgYmlsbGluZyBncm91cC4uLlwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIChjaGFuZ2UpPVwic2VhcmNoRmllbGQoKVwiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1vdXRsaW5lIGJ0biBhbGlnbi1pdGVtcy1jZW50ZXIgdGV4dC1ub3dyYXAgZXN0LWJ0blwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImZpbHRlck9wZW4gPSAhZmlsdGVyT3BlblwiPlxuICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIyXCI+PHBhdGggZD1cIk0zIDVoMThNNiAxMmgxMk0xMCAxOWg0XCIgLz48L3N2Zz5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTJcIj5GaWx0ZXI8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJhY3RpdmVGaWx0ZXJDb3VudFwiIGNsYXNzPVwiY291bnRjaGlwIG1zLTFcIj57eyBhY3RpdmVGaWx0ZXJDb3VudCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tb3V0bGluZSBidG4gYWxpZ24taXRlbXMtY2VudGVyIHRleHQtbm93cmFwIGVzdC1idG5cIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhcm93cy5sZW5ndGhcIiAoY2xpY2spPVwib25FeHBvcnQoKVwiPlxuICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIyXCI+PHBhdGggZD1cIk0xMiAzdjEyTTggN2w0LTQgNCA0TTUgMTV2NGgxNHYtNFwiIC8+PC9zdmc+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0yXCI+RXhwb3J0PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBhbGlnbi1pdGVtcy1jZW50ZXIgdGV4dC1ub3dyYXBcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJnZW5lcmF0ZUVzdGltYXRlKClcIj5cbiAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjZmZmXCIgc3Ryb2tlLXdpZHRoPVwiMi4yXCI+PHBhdGggZD1cIk0xMiA1djE0TTUgMTJoMTRcIiAvPjwvc3ZnPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtMlwiPkdlbmVyYXRlIEVzdGltYXRlPC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBGaWx0ZXIgcGFuZWwgLS0+XG4gICAgPGRpdiAqbmdJZj1cImZpbHRlck9wZW5cIiBjbGFzcz1cImZpbHRlci1wYW5lbCBtdC0zXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgZy0zXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHNtYWxsIGZ3LXNlbWlib2xkXCI+R2VuZXJhdGVkIOKAlCBmcm9tPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImRhdGVcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFsobmdNb2RlbCldPVwiZnJvbURhdGVcIiAoY2hhbmdlKT1cImFwcGx5RmlsdGVycygpXCI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGwgZnctc2VtaWJvbGRcIj5HZW5lcmF0ZWQg4oCUIHRvPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImRhdGVcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFsobmdNb2RlbCldPVwidG9EYXRlXCIgKGNoYW5nZSk9XCJhcHBseUZpbHRlcnMoKVwiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCIgKm5nSWY9XCJhY3RpdmVGaWx0ZXJDb3VudFwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsXCI+e3sgdG90YWxJdGVtcyB9fSBlc3RpbWF0ZXMgbWF0Y2g8L3NwYW4+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saW5rIGJ0bi1zbSBwLTBcIiAoY2xpY2spPVwiY2xlYXJGaWx0ZXJzKClcIj5DbGVhciBhbGwgZmlsdGVyczwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU3RhdHVzIHRhYnMgLS0+XG4gICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTIgZmxleC13cmFwIG10LTNcIj5cbiAgICAgICAgPGJ1dHRvbiAqbmdGb3I9XCJsZXQgdGFiIG9mIHN0YXR1c1RhYnNcIiBjbGFzcz1cImJ0biBidG4tc20gc3RhdHVzLXRhYlwiXG4gICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImFjdGl2ZVN0YXR1cyA9PT0gdGFiLmlkXCIgKGNsaWNrKT1cInNldFN0YXR1cyh0YWIuaWQpXCI+XG4gICAgICAgICAgICB7eyB0YWIubGFiZWwgfX1cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY291bnRPZih0YWIuaWQpXCIgY2xhc3M9XCJjb3VudGNoaXAgbXMtMVwiPnt7IGNvdW50T2YodGFiLmlkKSB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIExvYWRpbmcgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvYWRpbmdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBsb2FkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIG10LTRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBkZXNjcmlwdGlvblwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBFbXB0eSAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxvYWRpbmcgJiYgbm9EYXRhXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctMTIgbWItM1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJpbWctc3JjIHctMjVcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGEuc3ZnXCIgYWx0PVwiXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIG10LTJcIj5ObyBlc3RpbWF0ZXMgbWF0Y2ggdGhpcyBmaWx0ZXIuPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIFRhYmxlIC0tPlxuICAgIDxkaXYgKm5nSWY9XCIhbG9hZGluZyAmJiAhbm9EYXRhXCIgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlIG10LTJcIj5cbiAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgYm90dG9tLWJvcmRlciBlc3QtdGFibGUgdGV4dC1ub3dyYXBcIj5cbiAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgIDx0aD5Fc3RpbWF0ZSAjPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoPkJpbGxpbmcgR3JvdXA8L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGg+UGVyaW9kPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoPkdlbmVyYXRlZDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aD5WYWxpZCBUaWxsPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwidGV4dC1jZW50ZXJcIj5ObyBvZiBTdG9yZXM8L3RoPlxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJ0ZXh0LWVuZFwiPkFtb3VudCAoZXhjbC4gR1NUKTwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInRleHQtZW5kXCI+QW1vdW50IChpbmNsLiBHU1QpPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoPlN0YXR1czwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aD5BY3Rpb248L3RoPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgZSBvZiByb3dzXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImVzdC1ub1wiPjxhIGNsYXNzPVwiZXN0LWxpbmtcIiAoY2xpY2spPVwib3BlblByZXZpZXcoZSlcIj57eyBlLmVzdGltYXRlIH19PC9hPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZC1pbmxpbmUtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjOThhMmIzXCIgc3Ryb2tlLXdpZHRoPVwiMlwiPjxyZWN0IHg9XCIzXCIgeT1cIjVcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMTZcIiByeD1cIjJcIi8+PHBhdGggZD1cIk0zIDloMThNOCAzdjRNMTYgM3Y0XCIvPjwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGUuZ3JvdXBOYW1lIHx8ICdEZWZhdWx0IEdyb3VwJyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgZS5wZXJpb2QgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgZS5jcmVhdGVkRGF0ZSB8IGRhdGU6ICdkZCBNTU0geXl5eScgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgZS52YWxpZFRpbGwgfCBkYXRlOiAnZGQgTU1NIHl5eXknIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1jZW50ZXJcIj48Yj57eyBlLnN0b3JlcyB9fTwvYj48L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWVuZFwiPnt7IGN1cnJlbmN5U3ltYm9sKGUpIH19e3sgZS5hbW91bnQgfCBudW1iZXI6JzEuMC0yJzonZW4tSU4nIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1lbmRcIj48Yj57eyBjdXJyZW5jeVN5bWJvbChlKSB9fXt7IGUudG90YWxBbW91bnQgfCBudW1iZXI6JzEuMC0yJzonZW4tSU4nIH19PC9iPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD48c3BhbiBbbmdDbGFzc109XCJzdGF0dXNQaWxsQ2xhc3MoZS5zdGF0dXMpXCI+e3sgc3RhdHVzTGFiZWwoZS5zdGF0dXMpIH19PC9zcGFuPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljby1idG5cIiB0aXRsZT1cIkRvd25sb2FkIFBERlwiIChjbGljayk9XCJkb3dubG9hZEVzdGltYXRlKGUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMlwiPjxwYXRoIGQ9XCJNMTIgM3YxMk04IDExbDQgNCA0LTRNNSAxOWgxNFwiLz48L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvLWJ0blwiIHRpdGxlPVwiRWRpdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZS5zdGF0dXMgIT09ICdhY2NlcHRlZCdcIiAoY2xpY2spPVwiZWRpdEVzdGltYXRlKGUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMlwiPjxwYXRoIGQ9XCJNMTIgMjBoOU0xNi41IDMuNWEyLjEyIDIuMTIgMCAwIDEgMyAzTDcgMTlsLTQgMSAxLTQgMTIuNS0xMi41elwiLz48L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZS5zdGF0dXMgPT09ICdwZW5kaW5nJ1wiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tcHJpbWFyeSBweS0xIHB4LTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYXBwcm92ZUFuZFNlbmQoZSlcIiB0aXRsZT1cIkFwcHJvdmUgJiBzZW5kIGVzdGltYXRlXCI+QXBwcm92ZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJlLnN0YXR1cyA9PT0gJ3NlbnQnXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1zdWNjZXNzIHB5LTEgcHgtMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ1cGRhdGVTdGF0dXMoZSwgJ2FjY2VwdGVkJylcIiB0aXRsZT1cIk1hcmsgYWNjZXB0ZWRcIj5BY2NlcHQ8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvLWJ0blwiIHRpdGxlPVwiRGVsZXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJlLnN0YXR1cyAhPT0gJ2FjY2VwdGVkJ1wiIChjbGljayk9XCJkZWxldGVFc3RpbWF0ZShlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiI2Q5MmQyMFwiIHN0cm9rZS13aWR0aD1cIjJcIj48cGF0aCBkPVwiTTQgN2gxNk05IDdWNWExIDEgMCAwIDEgMS0xaDRhMSAxIDAgMCAxIDEgMXYyTTYgN2wxIDEzaDEwbDEtMTNcIi8+PC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgPC90YWJsZT5cbiAgICAgICAgPGxpYi1wYWdpbmF0aW9uIGNsYXNzPVwidGV4dC1zdGFydFwiIFtpdGVtc1BlclBhZ2VdPVwiaXRlbXNQZXJQYWdlXCIgW2N1cnJlbnRQYWdlXT1cImN1cnJlbnRQYWdlXCJcbiAgICAgICAgICAgIFt0b3RhbEl0ZW1zXT1cInRvdGFsSXRlbXNcIiBbcGFnaW5hdGlvblNpemVzXT1cInBhZ2luYXRpb25TaXplc1wiIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXG4gICAgICAgICAgICAocGFnZUNoYW5nZSk9XCJvblBhZ2VDaGFuZ2UoJGV2ZW50KVwiIChwYWdlU2l6ZUNoYW5nZSk9XCJvblBhZ2VTaXplQ2hhbmdlKCRldmVudClcIj48L2xpYi1wYWdpbmF0aW9uPlxuICAgIDwvZGl2PlxuPC9kaXY+Il19