tango-app-ui-manage-billing 3.3.42 → 3.3.44

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/esm2022/lib/components/bank-transactions/bank-transactions.component.mjs +3 -3
  2. package/esm2022/lib/components/bank-transactions/resolve-transaction/resolve-transaction.component.mjs +3 -3
  3. package/esm2022/lib/components/billing-groups/billing-group-form/billing-group-form.component.mjs +3 -3
  4. package/esm2022/lib/components/billing-groups/billing-groups.component.mjs +3 -3
  5. package/esm2022/lib/components/billing-groups/bulk-upload-error/bulk-upload-error.component.mjs +3 -3
  6. package/esm2022/lib/components/billing-groups/delete-warning/delete-warning.component.mjs +3 -3
  7. package/esm2022/lib/components/billing-summary/billing-summary.component.mjs +3 -3
  8. package/esm2022/lib/components/billing-tabs/billing-tabs.component.mjs +3 -3
  9. package/esm2022/lib/components/brand-invoices/brand-invoices.component.mjs +121 -12
  10. package/esm2022/lib/components/brands-billing/brands-billing.component.mjs +3 -3
  11. package/esm2022/lib/components/credit-notes/credit-notes.component.mjs +179 -0
  12. package/esm2022/lib/components/daily-pricing/daily-pricing.component.mjs +3 -3
  13. package/esm2022/lib/components/daily-pricing/generate-invoice-modal/generate-invoice-modal.component.mjs +3 -3
  14. package/esm2022/lib/components/daily-pricing/new-stores-modal/new-stores-modal.component.mjs +3 -3
  15. package/esm2022/lib/components/estimates/estimate-preview/estimate-preview.component.mjs +3 -3
  16. package/esm2022/lib/components/estimates/estimates.component.mjs +3 -3
  17. package/esm2022/lib/components/invoice-preview/amount-in-words.util.mjs +1 -1
  18. package/esm2022/lib/components/invoice-preview/invoice-preview.component.mjs +12 -3
  19. package/esm2022/lib/components/invoice-settings-modal/invoice-settings-modal.component.mjs +3 -3
  20. package/esm2022/lib/components/plans-subscription/billing/billing-group-form/billing-group-form.component.mjs +1 -1
  21. package/esm2022/lib/components/plans-subscription/billing/request-confirmation/request-confirmation.component.mjs +1 -1
  22. package/esm2022/lib/components/plans-subscription/payments-subscription.component.mjs +1 -1
  23. package/esm2022/lib/components/plans-subscription/step-pricing/default-steps.mjs +1 -1
  24. package/esm2022/lib/components/plans-subscription/subscription-popups/credit-note/credit-note.component.mjs +1 -1
  25. package/esm2022/lib/components/plans-subscription/subscription-popups/subscribe-product/subscribe-product.component.mjs +3 -3
  26. package/esm2022/lib/components/plans-subscription/subscription-popups/upload-document/upload-document.component.mjs +3 -3
  27. package/esm2022/lib/components/purchase-order/purchase-order-details/purchase-order-details.component.mjs +3 -3
  28. package/esm2022/lib/components/purchase-order/purchase-order-form/purchase-order-form.component.mjs +3 -3
  29. package/esm2022/lib/components/purchase-order/purchase-order.component.mjs +3 -3
  30. package/esm2022/lib/components/reactive-select/reactive-select.component.mjs +3 -3
  31. package/esm2022/lib/components/send-invoice-email/send-invoice-email.component.mjs +3 -3
  32. package/esm2022/lib/components/services/billing.service.mjs +30 -1
  33. package/esm2022/lib/components/services/po-field-parser.mjs +1 -1
  34. package/esm2022/lib/components/services/po-pdf-extractor.service.mjs +1 -1
  35. package/esm2022/lib/components/setup-billing/setup-billing.component.mjs +3 -3
  36. package/esm2022/lib/components/tango-manage-billing/cancel-invoice/cancel-invoice.component.mjs +3 -3
  37. package/esm2022/lib/components/tango-manage-billing/credit-note/credit-note.component.mjs +1 -1
  38. package/esm2022/lib/components/tango-manage-billing/delete-confirmation/delete-confirmation.component.mjs +3 -3
  39. package/esm2022/lib/components/tango-manage-billing/edit-invoice/edit-invoice.component.mjs +662 -23
  40. package/esm2022/lib/components/tango-manage-billing/invoice-logs/invoice-logs.component.mjs +3 -3
  41. package/esm2022/lib/components/tango-manage-billing/one-time-fee/one-time-fee.component.mjs +1 -1
  42. package/esm2022/lib/components/tango-manage-billing/payment-statuschange/payment-statuschange.component.mjs +3 -3
  43. package/esm2022/lib/components/tango-manage-billing/request-confirmation/request-confirmation.component.mjs +1 -1
  44. package/esm2022/lib/components/tango-manage-billing/tango-manage-billing.component.mjs +80 -6
  45. package/esm2022/lib/tango-manage-billing.module.mjs +4 -1
  46. package/esm2022/public-api.mjs +1 -1
  47. package/fesm2022/tango-app-ui-manage-billing.mjs +1397 -369
  48. package/fesm2022/tango-app-ui-manage-billing.mjs.map +1 -1
  49. package/lib/components/brand-invoices/brand-invoices.component.d.ts +17 -2
  50. package/lib/components/credit-notes/credit-notes.component.d.ts +44 -0
  51. package/lib/components/invoice-preview/invoice-preview.component.d.ts +1 -0
  52. package/lib/components/services/billing.service.d.ts +8 -0
  53. package/lib/components/tango-manage-billing/edit-invoice/edit-invoice.component.d.ts +107 -3
  54. package/lib/components/tango-manage-billing/tango-manage-billing.component.d.ts +8 -2
  55. package/lib/tango-manage-billing.module.d.ts +66 -65
  56. package/package.json +1 -1
@@ -424,10 +424,10 @@ export class BankTransactionsComponent {
424
424
  return this.cards[id]?.count || 0;
425
425
  }
426
426
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BankTransactionsComponent, deps: [{ token: i1.BillingService }, { token: i2.ToastService }, { token: i0.ChangeDetectorRef }, { token: i3.NgbModal }, { token: i4.GlobalStateService }], target: i0.ɵɵFactoryTarget.Component });
427
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BankTransactionsComponent, selector: "lib-bank-transactions", ngImport: i0, template: "<div>\n <!-- ============ Upload stage (no statements yet) ============ -->\n <div *ngIf=\"stage === 'upload' && !loading\" class=\"px-4 pb-4\">\n <div class=\"billingheader ms-1 mt-6\">Bank Statement Reconciliation</div>\n <div class=\"text-muted small ms-1 mt-1\">Upload a bank statement \u2014 transactions are stored and split into\n Reconciled, Needs review, Unmatched and Excluded.</div>\n <label class=\"dropzone mt-4\" for=\"stmt-file\">\n <div class=\"dz-ic\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M12 21V9M8 13l4-4 4 4M5 5h14\" />\n </svg>\n </div>\n <div class=\"dz-title mt-3\">Upload bank statement</div>\n <div class=\"text-muted small mt-1\">Drag &amp; drop or click to browse \u00B7 <strong>Excel (.xlsx, .xls) or CSV</strong></div>\n <button type=\"button\" class=\"btn btn-primary btn-sm mt-3\" [disabled]=\"uploading\"\n onclick=\"document.getElementById('stmt-file').click(); event.preventDefault();\">\n {{ uploading ? 'Parsing\u2026' : 'Upload & parse' }}\n </button>\n </label>\n <input id=\"stmt-file\" type=\"file\" accept=\".xlsx,.xls,.csv\" class=\"d-none\" (change)=\"onFileSelected($event)\">\n </div>\n\n <!-- ============ Results stage ============ -->\n <div *ngIf=\"stage === 'results'\">\n <!-- Upload-another action -->\n <div class=\"d-flex justify-content-end align-items-center mt-4 me-4\">\n <input id=\"stmt-file-again\" type=\"file\" accept=\".xlsx,.xls,.csv\" class=\"d-none\"\n (change)=\"onFileSelected($event)\">\n <button type=\"button\" class=\"btn-outline btn align-items-end text-nowrap invheader\" [disabled]=\"uploading\"\n onclick=\"document.getElementById('stmt-file-again').click()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span class=\"ms-2\">{{ uploading ? 'Parsing\u2026' : 'Upload another statement' }}</span>\n </button>\n </div>\n\n <!-- Status cards \u2014 clicking a card filters the table (click again to clear) -->\n <div class=\"row g-3 mt-1 mb-2 mx-2\">\n <div class=\"col\">\n <div class=\"invoice-card card-clickable\" [class.card-active]=\"activeStatus === 'reconciled'\"\n (click)=\"toggleCardFilter('reconciled')\">\n <div class=\"invoice-card-label\">Reconciled\n <svg class=\"info-ic\" ngbTooltip=\"Payments automatically matched to an invoice (payer name + amount), or manually reconciled.\" placement=\"top\" (click)=\"$event.stopPropagation()\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 11v5M12 8h.01\"/></svg>\n </div>\n <div class=\"invoice-card-value text-success\">{{ cards.reconciled.count }}</div>\n <div class=\"invoice-card-sub\">\u20B9{{ cards.reconciled.amount | number:'1.2-2':'en-IN' }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"invoice-card card-clickable\" [class.card-active]=\"activeStatus === 'needs_review'\"\n (click)=\"toggleCardFilter('needs_review')\">\n <div class=\"invoice-card-label\">Needs review\n <svg class=\"info-ic\" ngbTooltip=\"Payer matches a customer but the amount doesn't match an invoice, or a dollar payment matched \u2014 confirm before reconciling.\" placement=\"top\" (click)=\"$event.stopPropagation()\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 11v5M12 8h.01\"/></svg>\n </div>\n <div class=\"invoice-card-value text-warning\">{{ cards.needs_review.count }}</div>\n <div class=\"invoice-card-sub\">\u20B9{{ cards.needs_review.amount | number:'1.2-2':'en-IN' }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"invoice-card card-clickable\" [class.card-active]=\"activeStatus === 'unmatched'\"\n (click)=\"toggleCardFilter('unmatched')\">\n <div class=\"invoice-card-label\">Unmatched\n <svg class=\"info-ic\" ngbTooltip=\"Payer name doesn't match any customer's invoice \u2014 identify the customer and map it manually.\" placement=\"top\" (click)=\"$event.stopPropagation()\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 11v5M12 8h.01\"/></svg>\n </div>\n <div class=\"invoice-card-value text-danger\">{{ cards.unmatched.count }}</div>\n <div class=\"invoice-card-sub\">\u20B9{{ cards.unmatched.amount | number:'1.2-2':'en-IN' }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"invoice-card card-clickable\" [class.card-active]=\"activeStatus === 'excluded'\"\n (click)=\"toggleCardFilter('excluded')\">\n <div class=\"invoice-card-label\">Excluded\n <svg class=\"info-ic\" ngbTooltip=\"Not a customer payment (no payer name) or manually marked as not to be considered.\" placement=\"top\" (click)=\"$event.stopPropagation()\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 11v5M12 8h.01\"/></svg>\n </div>\n <div class=\"invoice-card-value\">{{ cards.excluded.count }}</div>\n <div class=\"invoice-card-sub\">\u20B9{{ cards.excluded.amount | number:'1.2-2':'en-IN' }}</div>\n </div>\n </div>\n </div>\n\n <!-- Status tabs + search/filter -->\n <div class=\"card-header paymenthistory border-0\">\n <div class=\"d-flex align-items-center gap-2 flex-wrap\">\n <button *ngFor=\"let tab of statusTabs\" class=\"btn btn-sm status-tab\"\n [class.active]=\"activeStatus === tab.id\"\n (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 <div class=\"card-toolbar ms-auto\">\n <div class=\"d-flex align-items-center position-relative my-1\">\n <span class=\"svg-icon invoicesearch svg-icon-1 position-absolute mt-6 ms-3\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\n transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\"></rect>\n <path d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\n fill=\"currentColor\"></path>\n </svg>\n </span>\n <input [(ngModel)]=\"searchValue\" type=\"text\" class=\"form-control ps-14 invoicesearch\"\n placeholder=\"Search payer, narration, UTR...\" autocomplete=\"off\" (change)=\"searchField()\" />\n <!-- Filter dropdown \u2014 opens a self-contained popover anchored to\n the button (lib-filters can't host the date-range inputs). -->\n <div class=\"position-relative txn-filter-wrap\">\n <button type=\"button\" class=\"btn-outline btn align-items-end text-nowrap invheader\"\n (click)=\"toggleFilter()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"#344054\" stroke-width=\"2\">\n <path d=\"M3 5h18M6 12h12M10 19h4\" />\n </svg>\n <span class=\"ms-2\">Filter</span>\n <span *ngIf=\"activeFilterCount\" class=\"countchip ms-1\">{{ activeFilterCount }}</span>\n </button>\n <div *ngIf=\"filterOpen\" class=\"txn-filter-pop card\">\n <div class=\"txn-filter-title\">Filter Options</div>\n <div class=\"mb-3\">\n <label class=\"form-label small fw-semibold\">Date \u2014 from</label>\n <input type=\"date\" class=\"form-control\" [(ngModel)]=\"draftFromDate\">\n </div>\n <div class=\"mb-3\">\n <label class=\"form-label small fw-semibold\">Date \u2014 to</label>\n <input type=\"date\" class=\"form-control\" [(ngModel)]=\"draftToDate\">\n </div>\n <div class=\"mb-2\">\n <label class=\"form-label small fw-semibold\">Source</label>\n <select class=\"form-select\" [(ngModel)]=\"draftSource\">\n <option value=\"all\">All sources</option>\n <option value=\"bank\">Bank Statement</option>\n <option value=\"va\">Virtual Account</option>\n <option value=\"gateway\">Gateway</option>\n <option value=\"manual\">Manual</option>\n </select>\n </div>\n <div class=\"d-flex justify-content-end mb-2\" *ngIf=\"activeFilterCount\">\n <button class=\"btn btn-link btn-sm p-0\" (click)=\"clearFilters()\">Clear all</button>\n </div>\n <!-- Filters apply only on Apply; Cancel discards changes. -->\n <div class=\"d-flex gap-2 mt-2\">\n <button class=\"btn btn-outline-secondary btn-sm flex-fill\" (click)=\"cancelFilters()\">Cancel</button>\n <button class=\"btn btn-primary btn-sm flex-fill\" (click)=\"applyFilters()\">Apply</button>\n </div>\n </div>\n </div>\n <!-- Delete selected (non-reconciled) rows. -->\n <button *ngIf=\"selectedCount > 0 && (gs.userAccess | async)?.Global_Billing_isEdit\"\n type=\"button\" class=\"btn-outline btn align-items-end text-nowrap invheader ms-2 delete-all-btn\"\n (click)=\"deleteSelected()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M3 6h18M8 6V4a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v2m2 0v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\"\n stroke=\"#D92D20\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span class=\"ms-2\">Delete selected ({{ selectedCount }})</span>\n </button>\n <!-- Delete all (non-reconciled) for the current statement batch.\n Reconciled rows are always preserved by the backend. -->\n <button *ngIf=\"!noData && (gs.userAccess | async)?.Global_Billing_isEdit\"\n type=\"button\" class=\"btn-outline btn align-items-end text-nowrap invheader ms-2 delete-all-btn\"\n (click)=\"deleteAll()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M3 6h18M8 6V4a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v2m2 0v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\"\n stroke=\"#D92D20\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span class=\"ms-2\">Delete all</span>\n </button>\n </div>\n </div>\n </div>\n\n <!-- Loading shimmer -->\n <ng-container *ngIf=\"loading\">\n <div class=\"row loader d-flex justify-content-center align-items-center\">\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>\n </div>\n </div>\n </ng-container>\n\n <!-- Transactions table -->\n <div *ngIf=\"!loading && !noData\" class=\"table-responsive\">\n <table class=\"table accordion table bottom-border invoivetable text-nowrap\">\n <thead>\n <tr>\n <th *ngIf=\"(gs.userAccess | async)?.Global_Billing_isEdit\" style=\"width:40px;\">\n <input type=\"checkbox\" [checked]=\"allSelected\" (change)=\"toggleSelectAll($event)\"\n [disabled]=\"selectableRows.length === 0\" ngbTooltip=\"Select all (excludes reconciled)\">\n </th>\n <th>Date</th>\n <th>Source</th>\n <th>Payer (from narration)</th>\n <th>Reference / UTR</th>\n <th>Amount</th>\n <th>Brand Name</th>\n <th>Invoice</th>\n <th>Result</th>\n <th>Status</th>\n <th>Action</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let t of rows\">\n <td *ngIf=\"(gs.userAccess | async)?.Global_Billing_isEdit\" style=\"width:40px;\">\n <!-- Reconciled rows can't be selected. -->\n <input type=\"checkbox\" *ngIf=\"isSelectable(t)\" [checked]=\"isSelected(t)\" (change)=\"toggleSelect(t)\">\n <span *ngIf=\"!isSelectable(t)\" class=\"lock-ic\" ngbTooltip=\"Reconciled \u2014 cannot be deleted\">\uD83D\uDD12</span>\n </td>\n <td>\n <div class=\"table-title\">{{ t.valueDate | date: 'dd MMM, yyyy' }}</div>\n </td>\n <td>\n <span class=\"srcchip\" [class.srcchip-va]=\"t.source === 'va'\">{{ sourceLabel(t.source) }}</span>\n </td>\n <td>\n <div class=\"table-title payer-cell\">{{ t.payer || '\u2014' }}</div>\n <div class=\"narration-sub\" [title]=\"t.narration\">{{ t.narration }}</div>\n </td>\n <td>\n <span class=\"mono\">{{ t.refNo || '\u2014' }}</span>\n </td>\n <td>\n <div class=\"table-title\"><strong>\u20B9{{ t.amount | number:'1.2-2':'en-IN' }}</strong></div>\n </td>\n <td>\n <div class=\"table-title\">{{ t.identifiedClientName || '\u2014' }}</div>\n </td>\n <td>\n <div class=\"table-title\">\n <!-- Multiple invoices settled by one payment: link each individually. -->\n <ng-container *ngIf=\"t.appliedInvoices?.length > 1; else singleInv\">\n <ng-container *ngFor=\"let a of t.appliedInvoices; let last = last\">\n <a class=\"invoice-link\" (click)=\"openInvoicePreviewById(a.invoiceId, a.invoice); $event.stopPropagation()\">{{ a.invoice }}</a><span *ngIf=\"!last\">, </span>\n </ng-container>\n </ng-container>\n <ng-template #singleInv>\n <a *ngIf=\"t.invoice && t.invoiceId\" class=\"invoice-link\"\n (click)=\"openInvoicePreview(t); $event.stopPropagation()\">{{ t.invoice }}</a>\n <span *ngIf=\"t.invoice && !t.invoiceId\">{{ t.invoice }}</span>\n <span *ngIf=\"!t.invoice\">\u2014</span>\n </ng-template>\n </div>\n </td>\n <td>\n <div class=\"result-note\" [title]=\"t.resultNote\">{{ t.resultNote || '\u2014' }}</div>\n </td>\n <td>\n <span *ngIf=\"t.contacted\" class=\"pill pill-amber\">Reaching out</span>\n <span *ngIf=\"!t.contacted\" [ngClass]=\"statusPillClass(t.status)\">{{ statusLabel(t.status) }}</span>\n </td>\n <td>\n <button *ngIf=\"t.status === 'needs_review' || t.status === 'unmatched'\"\n class=\"btn btn-sm btn-primary\" (click)=\"openResolve(t)\">Resolve</button>\n <!-- Reconciled rows: Edit re-opens the Resolve & reconcile\n popup so the matched invoice / resolution can be changed. -->\n <button *ngIf=\"t.status === 'reconciled'\"\n class=\"btn btn-sm btn-outline\" (click)=\"openResolve(t)\">Edit</button>\n <!-- Delete: reconciled rows are protected and never deletable. -->\n <button *ngIf=\"t.status !== 'reconciled' && (gs.userAccess | async)?.Global_Billing_isEdit\"\n class=\"btn btn-sm btn-icon delete-txn\" ngbTooltip=\"Delete transaction\"\n (click)=\"deleteTransaction(t)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M3 6h18M8 6V4a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v2m2 0v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 5v6m4-6v6\"\n stroke=\"#D92D20\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\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>\n</div>", styles: [".dropzone{display:block;border:1.5px dashed #E4E7EC;border-radius:14px;padding:34px;text-align:center;cursor:pointer;background:#fbfdff;transition:border-color .15s,background .15s}.dropzone:hover{border-color:#1493f5;background:#f5faff}.dz-ic{width:52px;height:52px;border-radius:14px;background:#e8f3fe;color:#1493f5;display:grid;place-items:center;margin:0 auto}.dz-title{font-weight:700;font-size:15px;color:#101828}.invoice-card{border:1px solid #E4E7EC;border-radius:12px;padding:18px 22px;background:#fff}.invoice-card.card-clickable{cursor:pointer;transition:border-color .12s,box-shadow .12s}.invoice-card.card-clickable:hover{border-color:#bcd9f7}.invoice-card.card-active{border-color:#1493f5;box-shadow:0 0 0 3px #1493f51f}.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}.invoice-card-label{color:#475467;font-size:13.5px;font-weight:500}.invoice-card-value{font-size:22px;font-weight:700;color:#101828;margin-top:6px;letter-spacing:-.3px}.invoice-card-value.text-success{color:#138a52}.invoice-card-value.text-danger{color:#d64545}.invoice-card-value.text-warning{color:#b9740a}.invoice-card-sub{color:#98a2b3;font-size:12.5px;margin-top:4px}.pill{display:inline-flex;align-items:center;padding:4px 10px;border-radius:999px;font-size:12px;font-weight:600;white-space:nowrap}.pill-green{background:#e7f7ee;color:#138a52}.pill-amber{background:#fdf0dc;color:#b9740a}.pill-red{background:#fdecec;color:#d64545}.pill-gray{background:#f1f3f6;color:#667085}.srcchip{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:600;padding:3px 9px;border-radius:999px;border:1px solid #E4E7EC;color:#475467;background:#fff;white-space:nowrap}.srcchip.srcchip-va{color:#7a3ea8;border-color:#e4d4f3;background:#f7f0fc}.countchip{background:#f1f3f6;color:#667085;font-weight:600;font-size:11px;border-radius:999px;padding:1px 8px}.payer-cell{max-width:230px;white-space:normal;line-height:1.35;font-weight:600}.narration-sub{max-width:230px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#98a2b3;font-size:11.5px;margin-top:2px}.result-note{max-width:220px;white-space:normal;line-height:1.4;color:#475467;font-size:12.5px}.mono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;color:#344054}.filter-panel{border:1px solid #E4E7EC;border-radius:14px;padding:16px 18px;background:#fbfdff}.invoice-link{color:#00a3ff;cursor:pointer;text-decoration:none}.invoice-link:hover{text-decoration:underline}.txn-filter-wrap{margin-left:10px}.txn-filter-pop{position:absolute;top:calc(100% + 6px);right:0;z-index:40;width:280px;padding:16px;border:1px solid #E4E7EC;border-radius:12px;box-shadow:0 8px 24px #1018281f;background:#fff}.txn-filter-title{font-weight:700;color:#101828;font-size:14px;margin-bottom:12px}.invoice-card-label .info-ic{color:#c4c9d2;cursor:help;vertical-align:middle;margin-left:4px}.svg-icon.invoicesearch.position-absolute{top:50%;transform:translateY(-50%);margin-top:0!important}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i6.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i6.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: i6.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type: i2.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.DecimalPipe, name: "number" }, { kind: "pipe", type: i5.DatePipe, name: "date" }] });
427
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BankTransactionsComponent, selector: "lib-bank-transactions", ngImport: i0, template: "<div>\r\n <!-- ============ Upload stage (no statements yet) ============ -->\r\n <div *ngIf=\"stage === 'upload' && !loading\" class=\"px-4 pb-4\">\r\n <div class=\"billingheader ms-1 mt-6\">Bank Statement Reconciliation</div>\r\n <div class=\"text-muted small ms-1 mt-1\">Upload a bank statement \u2014 transactions are stored and split into\r\n Reconciled, Needs review, Unmatched and Excluded.</div>\r\n <label class=\"dropzone mt-4\" for=\"stmt-file\">\r\n <div class=\"dz-ic\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M12 21V9M8 13l4-4 4 4M5 5h14\" />\r\n </svg>\r\n </div>\r\n <div class=\"dz-title mt-3\">Upload bank statement</div>\r\n <div class=\"text-muted small mt-1\">Drag &amp; drop or click to browse \u00B7 <strong>Excel (.xlsx, .xls) or CSV</strong></div>\r\n <button type=\"button\" class=\"btn btn-primary btn-sm mt-3\" [disabled]=\"uploading\"\r\n onclick=\"document.getElementById('stmt-file').click(); event.preventDefault();\">\r\n {{ uploading ? 'Parsing\u2026' : 'Upload & parse' }}\r\n </button>\r\n </label>\r\n <input id=\"stmt-file\" type=\"file\" accept=\".xlsx,.xls,.csv\" class=\"d-none\" (change)=\"onFileSelected($event)\">\r\n </div>\r\n\r\n <!-- ============ Results stage ============ -->\r\n <div *ngIf=\"stage === 'results'\">\r\n <!-- Upload-another action -->\r\n <div class=\"d-flex justify-content-end align-items-center mt-4 me-4\">\r\n <input id=\"stmt-file-again\" type=\"file\" accept=\".xlsx,.xls,.csv\" class=\"d-none\"\r\n (change)=\"onFileSelected($event)\">\r\n <button type=\"button\" class=\"btn-outline btn align-items-end text-nowrap invheader\" [disabled]=\"uploading\"\r\n onclick=\"document.getElementById('stmt-file-again').click()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span class=\"ms-2\">{{ uploading ? 'Parsing\u2026' : 'Upload another statement' }}</span>\r\n </button>\r\n </div>\r\n\r\n <!-- Status cards \u2014 clicking a card filters the table (click again to clear) -->\r\n <div class=\"row g-3 mt-1 mb-2 mx-2\">\r\n <div class=\"col\">\r\n <div class=\"invoice-card card-clickable\" [class.card-active]=\"activeStatus === 'reconciled'\"\r\n (click)=\"toggleCardFilter('reconciled')\">\r\n <div class=\"invoice-card-label\">Reconciled\r\n <svg class=\"info-ic\" ngbTooltip=\"Payments automatically matched to an invoice (payer name + amount), or manually reconciled.\" placement=\"top\" (click)=\"$event.stopPropagation()\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 11v5M12 8h.01\"/></svg>\r\n </div>\r\n <div class=\"invoice-card-value text-success\">{{ cards.reconciled.count }}</div>\r\n <div class=\"invoice-card-sub\">\u20B9{{ cards.reconciled.amount | number:'1.2-2':'en-IN' }}</div>\r\n </div>\r\n </div>\r\n <div class=\"col\">\r\n <div class=\"invoice-card card-clickable\" [class.card-active]=\"activeStatus === 'needs_review'\"\r\n (click)=\"toggleCardFilter('needs_review')\">\r\n <div class=\"invoice-card-label\">Needs review\r\n <svg class=\"info-ic\" ngbTooltip=\"Payer matches a customer but the amount doesn't match an invoice, or a dollar payment matched \u2014 confirm before reconciling.\" placement=\"top\" (click)=\"$event.stopPropagation()\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 11v5M12 8h.01\"/></svg>\r\n </div>\r\n <div class=\"invoice-card-value text-warning\">{{ cards.needs_review.count }}</div>\r\n <div class=\"invoice-card-sub\">\u20B9{{ cards.needs_review.amount | number:'1.2-2':'en-IN' }}</div>\r\n </div>\r\n </div>\r\n <div class=\"col\">\r\n <div class=\"invoice-card card-clickable\" [class.card-active]=\"activeStatus === 'unmatched'\"\r\n (click)=\"toggleCardFilter('unmatched')\">\r\n <div class=\"invoice-card-label\">Unmatched\r\n <svg class=\"info-ic\" ngbTooltip=\"Payer name doesn't match any customer's invoice \u2014 identify the customer and map it manually.\" placement=\"top\" (click)=\"$event.stopPropagation()\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 11v5M12 8h.01\"/></svg>\r\n </div>\r\n <div class=\"invoice-card-value text-danger\">{{ cards.unmatched.count }}</div>\r\n <div class=\"invoice-card-sub\">\u20B9{{ cards.unmatched.amount | number:'1.2-2':'en-IN' }}</div>\r\n </div>\r\n </div>\r\n <div class=\"col\">\r\n <div class=\"invoice-card card-clickable\" [class.card-active]=\"activeStatus === 'excluded'\"\r\n (click)=\"toggleCardFilter('excluded')\">\r\n <div class=\"invoice-card-label\">Excluded\r\n <svg class=\"info-ic\" ngbTooltip=\"Not a customer payment (no payer name) or manually marked as not to be considered.\" placement=\"top\" (click)=\"$event.stopPropagation()\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 11v5M12 8h.01\"/></svg>\r\n </div>\r\n <div class=\"invoice-card-value\">{{ cards.excluded.count }}</div>\r\n <div class=\"invoice-card-sub\">\u20B9{{ cards.excluded.amount | number:'1.2-2':'en-IN' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Status tabs + search/filter -->\r\n <div class=\"card-header paymenthistory border-0\">\r\n <div class=\"d-flex align-items-center gap-2 flex-wrap\">\r\n <button *ngFor=\"let tab of statusTabs\" class=\"btn btn-sm status-tab\"\r\n [class.active]=\"activeStatus === tab.id\"\r\n (click)=\"setStatus(tab.id)\">\r\n {{ tab.label }}\r\n <span *ngIf=\"countOf(tab.id)\" class=\"countchip ms-1\">{{ countOf(tab.id) }}</span>\r\n </button>\r\n </div>\r\n <div class=\"card-toolbar ms-auto\">\r\n <div class=\"d-flex align-items-center position-relative my-1\">\r\n <span class=\"svg-icon invoicesearch svg-icon-1 position-absolute mt-6 ms-3\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\r\n transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\"></rect>\r\n <path d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\r\n fill=\"currentColor\"></path>\r\n </svg>\r\n </span>\r\n <input [(ngModel)]=\"searchValue\" type=\"text\" class=\"form-control ps-14 invoicesearch\"\r\n placeholder=\"Search payer, narration, UTR...\" autocomplete=\"off\" (change)=\"searchField()\" />\r\n <!-- Filter dropdown \u2014 opens a self-contained popover anchored to\r\n the button (lib-filters can't host the date-range inputs). -->\r\n <div class=\"position-relative txn-filter-wrap\">\r\n <button type=\"button\" class=\"btn-outline btn align-items-end text-nowrap invheader\"\r\n (click)=\"toggleFilter()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"#344054\" stroke-width=\"2\">\r\n <path d=\"M3 5h18M6 12h12M10 19h4\" />\r\n </svg>\r\n <span class=\"ms-2\">Filter</span>\r\n <span *ngIf=\"activeFilterCount\" class=\"countchip ms-1\">{{ activeFilterCount }}</span>\r\n </button>\r\n <div *ngIf=\"filterOpen\" class=\"txn-filter-pop card\">\r\n <div class=\"txn-filter-title\">Filter Options</div>\r\n <div class=\"mb-3\">\r\n <label class=\"form-label small fw-semibold\">Date \u2014 from</label>\r\n <input type=\"date\" class=\"form-control\" [(ngModel)]=\"draftFromDate\">\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"form-label small fw-semibold\">Date \u2014 to</label>\r\n <input type=\"date\" class=\"form-control\" [(ngModel)]=\"draftToDate\">\r\n </div>\r\n <div class=\"mb-2\">\r\n <label class=\"form-label small fw-semibold\">Source</label>\r\n <select class=\"form-select\" [(ngModel)]=\"draftSource\">\r\n <option value=\"all\">All sources</option>\r\n <option value=\"bank\">Bank Statement</option>\r\n <option value=\"va\">Virtual Account</option>\r\n <option value=\"gateway\">Gateway</option>\r\n <option value=\"manual\">Manual</option>\r\n </select>\r\n </div>\r\n <div class=\"d-flex justify-content-end mb-2\" *ngIf=\"activeFilterCount\">\r\n <button class=\"btn btn-link btn-sm p-0\" (click)=\"clearFilters()\">Clear all</button>\r\n </div>\r\n <!-- Filters apply only on Apply; Cancel discards changes. -->\r\n <div class=\"d-flex gap-2 mt-2\">\r\n <button class=\"btn btn-outline-secondary btn-sm flex-fill\" (click)=\"cancelFilters()\">Cancel</button>\r\n <button class=\"btn btn-primary btn-sm flex-fill\" (click)=\"applyFilters()\">Apply</button>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- Delete selected (non-reconciled) rows. -->\r\n <button *ngIf=\"selectedCount > 0 && (gs.userAccess | async)?.Global_Billing_isEdit\"\r\n type=\"button\" class=\"btn-outline btn align-items-end text-nowrap invheader ms-2 delete-all-btn\"\r\n (click)=\"deleteSelected()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M3 6h18M8 6V4a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v2m2 0v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\"\r\n stroke=\"#D92D20\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span class=\"ms-2\">Delete selected ({{ selectedCount }})</span>\r\n </button>\r\n <!-- Delete all (non-reconciled) for the current statement batch.\r\n Reconciled rows are always preserved by the backend. -->\r\n <button *ngIf=\"!noData && (gs.userAccess | async)?.Global_Billing_isEdit\"\r\n type=\"button\" class=\"btn-outline btn align-items-end text-nowrap invheader ms-2 delete-all-btn\"\r\n (click)=\"deleteAll()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M3 6h18M8 6V4a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v2m2 0v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\"\r\n stroke=\"#D92D20\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span class=\"ms-2\">Delete all</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Loading shimmer -->\r\n <ng-container *ngIf=\"loading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Empty -->\r\n <ng-container *ngIf=\"!loading && noData\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-12 mb-3\">\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src w-25\" src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Transactions table -->\r\n <div *ngIf=\"!loading && !noData\" class=\"table-responsive\">\r\n <table class=\"table accordion table bottom-border invoivetable text-nowrap\">\r\n <thead>\r\n <tr>\r\n <th *ngIf=\"(gs.userAccess | async)?.Global_Billing_isEdit\" style=\"width:40px;\">\r\n <input type=\"checkbox\" [checked]=\"allSelected\" (change)=\"toggleSelectAll($event)\"\r\n [disabled]=\"selectableRows.length === 0\" ngbTooltip=\"Select all (excludes reconciled)\">\r\n </th>\r\n <th>Date</th>\r\n <th>Source</th>\r\n <th>Payer (from narration)</th>\r\n <th>Reference / UTR</th>\r\n <th>Amount</th>\r\n <th>Brand Name</th>\r\n <th>Invoice</th>\r\n <th>Result</th>\r\n <th>Status</th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let t of rows\">\r\n <td *ngIf=\"(gs.userAccess | async)?.Global_Billing_isEdit\" style=\"width:40px;\">\r\n <!-- Reconciled rows can't be selected. -->\r\n <input type=\"checkbox\" *ngIf=\"isSelectable(t)\" [checked]=\"isSelected(t)\" (change)=\"toggleSelect(t)\">\r\n <span *ngIf=\"!isSelectable(t)\" class=\"lock-ic\" ngbTooltip=\"Reconciled \u2014 cannot be deleted\">\uD83D\uDD12</span>\r\n </td>\r\n <td>\r\n <div class=\"table-title\">{{ t.valueDate | date: 'dd MMM, yyyy' }}</div>\r\n </td>\r\n <td>\r\n <span class=\"srcchip\" [class.srcchip-va]=\"t.source === 'va'\">{{ sourceLabel(t.source) }}</span>\r\n </td>\r\n <td>\r\n <div class=\"table-title payer-cell\">{{ t.payer || '\u2014' }}</div>\r\n <div class=\"narration-sub\" [title]=\"t.narration\">{{ t.narration }}</div>\r\n </td>\r\n <td>\r\n <span class=\"mono\">{{ t.refNo || '\u2014' }}</span>\r\n </td>\r\n <td>\r\n <div class=\"table-title\"><strong>\u20B9{{ t.amount | number:'1.2-2':'en-IN' }}</strong></div>\r\n </td>\r\n <td>\r\n <div class=\"table-title\">{{ t.identifiedClientName || '\u2014' }}</div>\r\n </td>\r\n <td>\r\n <div class=\"table-title\">\r\n <!-- Multiple invoices settled by one payment: link each individually. -->\r\n <ng-container *ngIf=\"t.appliedInvoices?.length > 1; else singleInv\">\r\n <ng-container *ngFor=\"let a of t.appliedInvoices; let last = last\">\r\n <a class=\"invoice-link\" (click)=\"openInvoicePreviewById(a.invoiceId, a.invoice); $event.stopPropagation()\">{{ a.invoice }}</a><span *ngIf=\"!last\">, </span>\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #singleInv>\r\n <a *ngIf=\"t.invoice && t.invoiceId\" class=\"invoice-link\"\r\n (click)=\"openInvoicePreview(t); $event.stopPropagation()\">{{ t.invoice }}</a>\r\n <span *ngIf=\"t.invoice && !t.invoiceId\">{{ t.invoice }}</span>\r\n <span *ngIf=\"!t.invoice\">\u2014</span>\r\n </ng-template>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"result-note\" [title]=\"t.resultNote\">{{ t.resultNote || '\u2014' }}</div>\r\n </td>\r\n <td>\r\n <span *ngIf=\"t.contacted\" class=\"pill pill-amber\">Reaching out</span>\r\n <span *ngIf=\"!t.contacted\" [ngClass]=\"statusPillClass(t.status)\">{{ statusLabel(t.status) }}</span>\r\n </td>\r\n <td>\r\n <button *ngIf=\"t.status === 'needs_review' || t.status === 'unmatched'\"\r\n class=\"btn btn-sm btn-primary\" (click)=\"openResolve(t)\">Resolve</button>\r\n <!-- Reconciled rows: Edit re-opens the Resolve & reconcile\r\n popup so the matched invoice / resolution can be changed. -->\r\n <button *ngIf=\"t.status === 'reconciled'\"\r\n class=\"btn btn-sm btn-outline\" (click)=\"openResolve(t)\">Edit</button>\r\n <!-- Delete: reconciled rows are protected and never deletable. -->\r\n <button *ngIf=\"t.status !== 'reconciled' && (gs.userAccess | async)?.Global_Billing_isEdit\"\r\n class=\"btn btn-sm btn-icon delete-txn\" ngbTooltip=\"Delete transaction\"\r\n (click)=\"deleteTransaction(t)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M3 6h18M8 6V4a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v2m2 0v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 5v6m4-6v6\"\r\n stroke=\"#D92D20\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <lib-pagination class=\"text-start\" [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\"\r\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\r\n (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </div>\r\n</div>", styles: [".dropzone{display:block;border:1.5px dashed #E4E7EC;border-radius:14px;padding:34px;text-align:center;cursor:pointer;background:#fbfdff;transition:border-color .15s,background .15s}.dropzone:hover{border-color:#1493f5;background:#f5faff}.dz-ic{width:52px;height:52px;border-radius:14px;background:#e8f3fe;color:#1493f5;display:grid;place-items:center;margin:0 auto}.dz-title{font-weight:700;font-size:15px;color:#101828}.invoice-card{border:1px solid #E4E7EC;border-radius:12px;padding:18px 22px;background:#fff}.invoice-card.card-clickable{cursor:pointer;transition:border-color .12s,box-shadow .12s}.invoice-card.card-clickable:hover{border-color:#bcd9f7}.invoice-card.card-active{border-color:#1493f5;box-shadow:0 0 0 3px #1493f51f}.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}.invoice-card-label{color:#475467;font-size:13.5px;font-weight:500}.invoice-card-value{font-size:22px;font-weight:700;color:#101828;margin-top:6px;letter-spacing:-.3px}.invoice-card-value.text-success{color:#138a52}.invoice-card-value.text-danger{color:#d64545}.invoice-card-value.text-warning{color:#b9740a}.invoice-card-sub{color:#98a2b3;font-size:12.5px;margin-top:4px}.pill{display:inline-flex;align-items:center;padding:4px 10px;border-radius:999px;font-size:12px;font-weight:600;white-space:nowrap}.pill-green{background:#e7f7ee;color:#138a52}.pill-amber{background:#fdf0dc;color:#b9740a}.pill-red{background:#fdecec;color:#d64545}.pill-gray{background:#f1f3f6;color:#667085}.srcchip{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:600;padding:3px 9px;border-radius:999px;border:1px solid #E4E7EC;color:#475467;background:#fff;white-space:nowrap}.srcchip.srcchip-va{color:#7a3ea8;border-color:#e4d4f3;background:#f7f0fc}.countchip{background:#f1f3f6;color:#667085;font-weight:600;font-size:11px;border-radius:999px;padding:1px 8px}.payer-cell{max-width:230px;white-space:normal;line-height:1.35;font-weight:600}.narration-sub{max-width:230px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#98a2b3;font-size:11.5px;margin-top:2px}.result-note{max-width:220px;white-space:normal;line-height:1.4;color:#475467;font-size:12.5px}.mono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;color:#344054}.filter-panel{border:1px solid #E4E7EC;border-radius:14px;padding:16px 18px;background:#fbfdff}.invoice-link{color:#00a3ff;cursor:pointer;text-decoration:none}.invoice-link:hover{text-decoration:underline}.txn-filter-wrap{margin-left:10px}.txn-filter-pop{position:absolute;top:calc(100% + 6px);right:0;z-index:40;width:280px;padding:16px;border:1px solid #E4E7EC;border-radius:12px;box-shadow:0 8px 24px #1018281f;background:#fff}.txn-filter-title{font-weight:700;color:#101828;font-size:14px;margin-bottom:12px}.invoice-card-label .info-ic{color:#c4c9d2;cursor:help;vertical-align:middle;margin-left:4px}.svg-icon.invoicesearch.position-absolute{top:50%;transform:translateY(-50%);margin-top:0!important}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i6.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i6.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: i6.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type: i2.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.DecimalPipe, name: "number" }, { kind: "pipe", type: i5.DatePipe, name: "date" }] });
428
428
  }
429
429
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BankTransactionsComponent, decorators: [{
430
430
  type: Component,
431
- args: [{ selector: 'lib-bank-transactions', template: "<div>\n <!-- ============ Upload stage (no statements yet) ============ -->\n <div *ngIf=\"stage === 'upload' && !loading\" class=\"px-4 pb-4\">\n <div class=\"billingheader ms-1 mt-6\">Bank Statement Reconciliation</div>\n <div class=\"text-muted small ms-1 mt-1\">Upload a bank statement \u2014 transactions are stored and split into\n Reconciled, Needs review, Unmatched and Excluded.</div>\n <label class=\"dropzone mt-4\" for=\"stmt-file\">\n <div class=\"dz-ic\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M12 21V9M8 13l4-4 4 4M5 5h14\" />\n </svg>\n </div>\n <div class=\"dz-title mt-3\">Upload bank statement</div>\n <div class=\"text-muted small mt-1\">Drag &amp; drop or click to browse \u00B7 <strong>Excel (.xlsx, .xls) or CSV</strong></div>\n <button type=\"button\" class=\"btn btn-primary btn-sm mt-3\" [disabled]=\"uploading\"\n onclick=\"document.getElementById('stmt-file').click(); event.preventDefault();\">\n {{ uploading ? 'Parsing\u2026' : 'Upload & parse' }}\n </button>\n </label>\n <input id=\"stmt-file\" type=\"file\" accept=\".xlsx,.xls,.csv\" class=\"d-none\" (change)=\"onFileSelected($event)\">\n </div>\n\n <!-- ============ Results stage ============ -->\n <div *ngIf=\"stage === 'results'\">\n <!-- Upload-another action -->\n <div class=\"d-flex justify-content-end align-items-center mt-4 me-4\">\n <input id=\"stmt-file-again\" type=\"file\" accept=\".xlsx,.xls,.csv\" class=\"d-none\"\n (change)=\"onFileSelected($event)\">\n <button type=\"button\" class=\"btn-outline btn align-items-end text-nowrap invheader\" [disabled]=\"uploading\"\n onclick=\"document.getElementById('stmt-file-again').click()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span class=\"ms-2\">{{ uploading ? 'Parsing\u2026' : 'Upload another statement' }}</span>\n </button>\n </div>\n\n <!-- Status cards \u2014 clicking a card filters the table (click again to clear) -->\n <div class=\"row g-3 mt-1 mb-2 mx-2\">\n <div class=\"col\">\n <div class=\"invoice-card card-clickable\" [class.card-active]=\"activeStatus === 'reconciled'\"\n (click)=\"toggleCardFilter('reconciled')\">\n <div class=\"invoice-card-label\">Reconciled\n <svg class=\"info-ic\" ngbTooltip=\"Payments automatically matched to an invoice (payer name + amount), or manually reconciled.\" placement=\"top\" (click)=\"$event.stopPropagation()\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 11v5M12 8h.01\"/></svg>\n </div>\n <div class=\"invoice-card-value text-success\">{{ cards.reconciled.count }}</div>\n <div class=\"invoice-card-sub\">\u20B9{{ cards.reconciled.amount | number:'1.2-2':'en-IN' }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"invoice-card card-clickable\" [class.card-active]=\"activeStatus === 'needs_review'\"\n (click)=\"toggleCardFilter('needs_review')\">\n <div class=\"invoice-card-label\">Needs review\n <svg class=\"info-ic\" ngbTooltip=\"Payer matches a customer but the amount doesn't match an invoice, or a dollar payment matched \u2014 confirm before reconciling.\" placement=\"top\" (click)=\"$event.stopPropagation()\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 11v5M12 8h.01\"/></svg>\n </div>\n <div class=\"invoice-card-value text-warning\">{{ cards.needs_review.count }}</div>\n <div class=\"invoice-card-sub\">\u20B9{{ cards.needs_review.amount | number:'1.2-2':'en-IN' }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"invoice-card card-clickable\" [class.card-active]=\"activeStatus === 'unmatched'\"\n (click)=\"toggleCardFilter('unmatched')\">\n <div class=\"invoice-card-label\">Unmatched\n <svg class=\"info-ic\" ngbTooltip=\"Payer name doesn't match any customer's invoice \u2014 identify the customer and map it manually.\" placement=\"top\" (click)=\"$event.stopPropagation()\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 11v5M12 8h.01\"/></svg>\n </div>\n <div class=\"invoice-card-value text-danger\">{{ cards.unmatched.count }}</div>\n <div class=\"invoice-card-sub\">\u20B9{{ cards.unmatched.amount | number:'1.2-2':'en-IN' }}</div>\n </div>\n </div>\n <div class=\"col\">\n <div class=\"invoice-card card-clickable\" [class.card-active]=\"activeStatus === 'excluded'\"\n (click)=\"toggleCardFilter('excluded')\">\n <div class=\"invoice-card-label\">Excluded\n <svg class=\"info-ic\" ngbTooltip=\"Not a customer payment (no payer name) or manually marked as not to be considered.\" placement=\"top\" (click)=\"$event.stopPropagation()\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 11v5M12 8h.01\"/></svg>\n </div>\n <div class=\"invoice-card-value\">{{ cards.excluded.count }}</div>\n <div class=\"invoice-card-sub\">\u20B9{{ cards.excluded.amount | number:'1.2-2':'en-IN' }}</div>\n </div>\n </div>\n </div>\n\n <!-- Status tabs + search/filter -->\n <div class=\"card-header paymenthistory border-0\">\n <div class=\"d-flex align-items-center gap-2 flex-wrap\">\n <button *ngFor=\"let tab of statusTabs\" class=\"btn btn-sm status-tab\"\n [class.active]=\"activeStatus === tab.id\"\n (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 <div class=\"card-toolbar ms-auto\">\n <div class=\"d-flex align-items-center position-relative my-1\">\n <span class=\"svg-icon invoicesearch svg-icon-1 position-absolute mt-6 ms-3\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\n transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\"></rect>\n <path d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\n fill=\"currentColor\"></path>\n </svg>\n </span>\n <input [(ngModel)]=\"searchValue\" type=\"text\" class=\"form-control ps-14 invoicesearch\"\n placeholder=\"Search payer, narration, UTR...\" autocomplete=\"off\" (change)=\"searchField()\" />\n <!-- Filter dropdown \u2014 opens a self-contained popover anchored to\n the button (lib-filters can't host the date-range inputs). -->\n <div class=\"position-relative txn-filter-wrap\">\n <button type=\"button\" class=\"btn-outline btn align-items-end text-nowrap invheader\"\n (click)=\"toggleFilter()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"#344054\" stroke-width=\"2\">\n <path d=\"M3 5h18M6 12h12M10 19h4\" />\n </svg>\n <span class=\"ms-2\">Filter</span>\n <span *ngIf=\"activeFilterCount\" class=\"countchip ms-1\">{{ activeFilterCount }}</span>\n </button>\n <div *ngIf=\"filterOpen\" class=\"txn-filter-pop card\">\n <div class=\"txn-filter-title\">Filter Options</div>\n <div class=\"mb-3\">\n <label class=\"form-label small fw-semibold\">Date \u2014 from</label>\n <input type=\"date\" class=\"form-control\" [(ngModel)]=\"draftFromDate\">\n </div>\n <div class=\"mb-3\">\n <label class=\"form-label small fw-semibold\">Date \u2014 to</label>\n <input type=\"date\" class=\"form-control\" [(ngModel)]=\"draftToDate\">\n </div>\n <div class=\"mb-2\">\n <label class=\"form-label small fw-semibold\">Source</label>\n <select class=\"form-select\" [(ngModel)]=\"draftSource\">\n <option value=\"all\">All sources</option>\n <option value=\"bank\">Bank Statement</option>\n <option value=\"va\">Virtual Account</option>\n <option value=\"gateway\">Gateway</option>\n <option value=\"manual\">Manual</option>\n </select>\n </div>\n <div class=\"d-flex justify-content-end mb-2\" *ngIf=\"activeFilterCount\">\n <button class=\"btn btn-link btn-sm p-0\" (click)=\"clearFilters()\">Clear all</button>\n </div>\n <!-- Filters apply only on Apply; Cancel discards changes. -->\n <div class=\"d-flex gap-2 mt-2\">\n <button class=\"btn btn-outline-secondary btn-sm flex-fill\" (click)=\"cancelFilters()\">Cancel</button>\n <button class=\"btn btn-primary btn-sm flex-fill\" (click)=\"applyFilters()\">Apply</button>\n </div>\n </div>\n </div>\n <!-- Delete selected (non-reconciled) rows. -->\n <button *ngIf=\"selectedCount > 0 && (gs.userAccess | async)?.Global_Billing_isEdit\"\n type=\"button\" class=\"btn-outline btn align-items-end text-nowrap invheader ms-2 delete-all-btn\"\n (click)=\"deleteSelected()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M3 6h18M8 6V4a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v2m2 0v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\"\n stroke=\"#D92D20\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span class=\"ms-2\">Delete selected ({{ selectedCount }})</span>\n </button>\n <!-- Delete all (non-reconciled) for the current statement batch.\n Reconciled rows are always preserved by the backend. -->\n <button *ngIf=\"!noData && (gs.userAccess | async)?.Global_Billing_isEdit\"\n type=\"button\" class=\"btn-outline btn align-items-end text-nowrap invheader ms-2 delete-all-btn\"\n (click)=\"deleteAll()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M3 6h18M8 6V4a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v2m2 0v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\"\n stroke=\"#D92D20\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <span class=\"ms-2\">Delete all</span>\n </button>\n </div>\n </div>\n </div>\n\n <!-- Loading shimmer -->\n <ng-container *ngIf=\"loading\">\n <div class=\"row loader d-flex justify-content-center align-items-center\">\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>\n </div>\n </div>\n </ng-container>\n\n <!-- Transactions table -->\n <div *ngIf=\"!loading && !noData\" class=\"table-responsive\">\n <table class=\"table accordion table bottom-border invoivetable text-nowrap\">\n <thead>\n <tr>\n <th *ngIf=\"(gs.userAccess | async)?.Global_Billing_isEdit\" style=\"width:40px;\">\n <input type=\"checkbox\" [checked]=\"allSelected\" (change)=\"toggleSelectAll($event)\"\n [disabled]=\"selectableRows.length === 0\" ngbTooltip=\"Select all (excludes reconciled)\">\n </th>\n <th>Date</th>\n <th>Source</th>\n <th>Payer (from narration)</th>\n <th>Reference / UTR</th>\n <th>Amount</th>\n <th>Brand Name</th>\n <th>Invoice</th>\n <th>Result</th>\n <th>Status</th>\n <th>Action</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let t of rows\">\n <td *ngIf=\"(gs.userAccess | async)?.Global_Billing_isEdit\" style=\"width:40px;\">\n <!-- Reconciled rows can't be selected. -->\n <input type=\"checkbox\" *ngIf=\"isSelectable(t)\" [checked]=\"isSelected(t)\" (change)=\"toggleSelect(t)\">\n <span *ngIf=\"!isSelectable(t)\" class=\"lock-ic\" ngbTooltip=\"Reconciled \u2014 cannot be deleted\">\uD83D\uDD12</span>\n </td>\n <td>\n <div class=\"table-title\">{{ t.valueDate | date: 'dd MMM, yyyy' }}</div>\n </td>\n <td>\n <span class=\"srcchip\" [class.srcchip-va]=\"t.source === 'va'\">{{ sourceLabel(t.source) }}</span>\n </td>\n <td>\n <div class=\"table-title payer-cell\">{{ t.payer || '\u2014' }}</div>\n <div class=\"narration-sub\" [title]=\"t.narration\">{{ t.narration }}</div>\n </td>\n <td>\n <span class=\"mono\">{{ t.refNo || '\u2014' }}</span>\n </td>\n <td>\n <div class=\"table-title\"><strong>\u20B9{{ t.amount | number:'1.2-2':'en-IN' }}</strong></div>\n </td>\n <td>\n <div class=\"table-title\">{{ t.identifiedClientName || '\u2014' }}</div>\n </td>\n <td>\n <div class=\"table-title\">\n <!-- Multiple invoices settled by one payment: link each individually. -->\n <ng-container *ngIf=\"t.appliedInvoices?.length > 1; else singleInv\">\n <ng-container *ngFor=\"let a of t.appliedInvoices; let last = last\">\n <a class=\"invoice-link\" (click)=\"openInvoicePreviewById(a.invoiceId, a.invoice); $event.stopPropagation()\">{{ a.invoice }}</a><span *ngIf=\"!last\">, </span>\n </ng-container>\n </ng-container>\n <ng-template #singleInv>\n <a *ngIf=\"t.invoice && t.invoiceId\" class=\"invoice-link\"\n (click)=\"openInvoicePreview(t); $event.stopPropagation()\">{{ t.invoice }}</a>\n <span *ngIf=\"t.invoice && !t.invoiceId\">{{ t.invoice }}</span>\n <span *ngIf=\"!t.invoice\">\u2014</span>\n </ng-template>\n </div>\n </td>\n <td>\n <div class=\"result-note\" [title]=\"t.resultNote\">{{ t.resultNote || '\u2014' }}</div>\n </td>\n <td>\n <span *ngIf=\"t.contacted\" class=\"pill pill-amber\">Reaching out</span>\n <span *ngIf=\"!t.contacted\" [ngClass]=\"statusPillClass(t.status)\">{{ statusLabel(t.status) }}</span>\n </td>\n <td>\n <button *ngIf=\"t.status === 'needs_review' || t.status === 'unmatched'\"\n class=\"btn btn-sm btn-primary\" (click)=\"openResolve(t)\">Resolve</button>\n <!-- Reconciled rows: Edit re-opens the Resolve & reconcile\n popup so the matched invoice / resolution can be changed. -->\n <button *ngIf=\"t.status === 'reconciled'\"\n class=\"btn btn-sm btn-outline\" (click)=\"openResolve(t)\">Edit</button>\n <!-- Delete: reconciled rows are protected and never deletable. -->\n <button *ngIf=\"t.status !== 'reconciled' && (gs.userAccess | async)?.Global_Billing_isEdit\"\n class=\"btn btn-sm btn-icon delete-txn\" ngbTooltip=\"Delete transaction\"\n (click)=\"deleteTransaction(t)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M3 6h18M8 6V4a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v2m2 0v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 5v6m4-6v6\"\n stroke=\"#D92D20\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n </button>\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>\n</div>", styles: [".dropzone{display:block;border:1.5px dashed #E4E7EC;border-radius:14px;padding:34px;text-align:center;cursor:pointer;background:#fbfdff;transition:border-color .15s,background .15s}.dropzone:hover{border-color:#1493f5;background:#f5faff}.dz-ic{width:52px;height:52px;border-radius:14px;background:#e8f3fe;color:#1493f5;display:grid;place-items:center;margin:0 auto}.dz-title{font-weight:700;font-size:15px;color:#101828}.invoice-card{border:1px solid #E4E7EC;border-radius:12px;padding:18px 22px;background:#fff}.invoice-card.card-clickable{cursor:pointer;transition:border-color .12s,box-shadow .12s}.invoice-card.card-clickable:hover{border-color:#bcd9f7}.invoice-card.card-active{border-color:#1493f5;box-shadow:0 0 0 3px #1493f51f}.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}.invoice-card-label{color:#475467;font-size:13.5px;font-weight:500}.invoice-card-value{font-size:22px;font-weight:700;color:#101828;margin-top:6px;letter-spacing:-.3px}.invoice-card-value.text-success{color:#138a52}.invoice-card-value.text-danger{color:#d64545}.invoice-card-value.text-warning{color:#b9740a}.invoice-card-sub{color:#98a2b3;font-size:12.5px;margin-top:4px}.pill{display:inline-flex;align-items:center;padding:4px 10px;border-radius:999px;font-size:12px;font-weight:600;white-space:nowrap}.pill-green{background:#e7f7ee;color:#138a52}.pill-amber{background:#fdf0dc;color:#b9740a}.pill-red{background:#fdecec;color:#d64545}.pill-gray{background:#f1f3f6;color:#667085}.srcchip{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:600;padding:3px 9px;border-radius:999px;border:1px solid #E4E7EC;color:#475467;background:#fff;white-space:nowrap}.srcchip.srcchip-va{color:#7a3ea8;border-color:#e4d4f3;background:#f7f0fc}.countchip{background:#f1f3f6;color:#667085;font-weight:600;font-size:11px;border-radius:999px;padding:1px 8px}.payer-cell{max-width:230px;white-space:normal;line-height:1.35;font-weight:600}.narration-sub{max-width:230px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#98a2b3;font-size:11.5px;margin-top:2px}.result-note{max-width:220px;white-space:normal;line-height:1.4;color:#475467;font-size:12.5px}.mono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;color:#344054}.filter-panel{border:1px solid #E4E7EC;border-radius:14px;padding:16px 18px;background:#fbfdff}.invoice-link{color:#00a3ff;cursor:pointer;text-decoration:none}.invoice-link:hover{text-decoration:underline}.txn-filter-wrap{margin-left:10px}.txn-filter-pop{position:absolute;top:calc(100% + 6px);right:0;z-index:40;width:280px;padding:16px;border:1px solid #E4E7EC;border-radius:12px;box-shadow:0 8px 24px #1018281f;background:#fff}.txn-filter-title{font-weight:700;color:#101828;font-size:14px;margin-bottom:12px}.invoice-card-label .info-ic{color:#c4c9d2;cursor:help;vertical-align:middle;margin-left:4px}.svg-icon.invoicesearch.position-absolute{top:50%;transform:translateY(-50%);margin-top:0!important}\n"] }]
431
+ args: [{ selector: 'lib-bank-transactions', template: "<div>\r\n <!-- ============ Upload stage (no statements yet) ============ -->\r\n <div *ngIf=\"stage === 'upload' && !loading\" class=\"px-4 pb-4\">\r\n <div class=\"billingheader ms-1 mt-6\">Bank Statement Reconciliation</div>\r\n <div class=\"text-muted small ms-1 mt-1\">Upload a bank statement \u2014 transactions are stored and split into\r\n Reconciled, Needs review, Unmatched and Excluded.</div>\r\n <label class=\"dropzone mt-4\" for=\"stmt-file\">\r\n <div class=\"dz-ic\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M12 21V9M8 13l4-4 4 4M5 5h14\" />\r\n </svg>\r\n </div>\r\n <div class=\"dz-title mt-3\">Upload bank statement</div>\r\n <div class=\"text-muted small mt-1\">Drag &amp; drop or click to browse \u00B7 <strong>Excel (.xlsx, .xls) or CSV</strong></div>\r\n <button type=\"button\" class=\"btn btn-primary btn-sm mt-3\" [disabled]=\"uploading\"\r\n onclick=\"document.getElementById('stmt-file').click(); event.preventDefault();\">\r\n {{ uploading ? 'Parsing\u2026' : 'Upload & parse' }}\r\n </button>\r\n </label>\r\n <input id=\"stmt-file\" type=\"file\" accept=\".xlsx,.xls,.csv\" class=\"d-none\" (change)=\"onFileSelected($event)\">\r\n </div>\r\n\r\n <!-- ============ Results stage ============ -->\r\n <div *ngIf=\"stage === 'results'\">\r\n <!-- Upload-another action -->\r\n <div class=\"d-flex justify-content-end align-items-center mt-4 me-4\">\r\n <input id=\"stmt-file-again\" type=\"file\" accept=\".xlsx,.xls,.csv\" class=\"d-none\"\r\n (change)=\"onFileSelected($event)\">\r\n <button type=\"button\" class=\"btn-outline btn align-items-end text-nowrap invheader\" [disabled]=\"uploading\"\r\n onclick=\"document.getElementById('stmt-file-again').click()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span class=\"ms-2\">{{ uploading ? 'Parsing\u2026' : 'Upload another statement' }}</span>\r\n </button>\r\n </div>\r\n\r\n <!-- Status cards \u2014 clicking a card filters the table (click again to clear) -->\r\n <div class=\"row g-3 mt-1 mb-2 mx-2\">\r\n <div class=\"col\">\r\n <div class=\"invoice-card card-clickable\" [class.card-active]=\"activeStatus === 'reconciled'\"\r\n (click)=\"toggleCardFilter('reconciled')\">\r\n <div class=\"invoice-card-label\">Reconciled\r\n <svg class=\"info-ic\" ngbTooltip=\"Payments automatically matched to an invoice (payer name + amount), or manually reconciled.\" placement=\"top\" (click)=\"$event.stopPropagation()\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 11v5M12 8h.01\"/></svg>\r\n </div>\r\n <div class=\"invoice-card-value text-success\">{{ cards.reconciled.count }}</div>\r\n <div class=\"invoice-card-sub\">\u20B9{{ cards.reconciled.amount | number:'1.2-2':'en-IN' }}</div>\r\n </div>\r\n </div>\r\n <div class=\"col\">\r\n <div class=\"invoice-card card-clickable\" [class.card-active]=\"activeStatus === 'needs_review'\"\r\n (click)=\"toggleCardFilter('needs_review')\">\r\n <div class=\"invoice-card-label\">Needs review\r\n <svg class=\"info-ic\" ngbTooltip=\"Payer matches a customer but the amount doesn't match an invoice, or a dollar payment matched \u2014 confirm before reconciling.\" placement=\"top\" (click)=\"$event.stopPropagation()\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 11v5M12 8h.01\"/></svg>\r\n </div>\r\n <div class=\"invoice-card-value text-warning\">{{ cards.needs_review.count }}</div>\r\n <div class=\"invoice-card-sub\">\u20B9{{ cards.needs_review.amount | number:'1.2-2':'en-IN' }}</div>\r\n </div>\r\n </div>\r\n <div class=\"col\">\r\n <div class=\"invoice-card card-clickable\" [class.card-active]=\"activeStatus === 'unmatched'\"\r\n (click)=\"toggleCardFilter('unmatched')\">\r\n <div class=\"invoice-card-label\">Unmatched\r\n <svg class=\"info-ic\" ngbTooltip=\"Payer name doesn't match any customer's invoice \u2014 identify the customer and map it manually.\" placement=\"top\" (click)=\"$event.stopPropagation()\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 11v5M12 8h.01\"/></svg>\r\n </div>\r\n <div class=\"invoice-card-value text-danger\">{{ cards.unmatched.count }}</div>\r\n <div class=\"invoice-card-sub\">\u20B9{{ cards.unmatched.amount | number:'1.2-2':'en-IN' }}</div>\r\n </div>\r\n </div>\r\n <div class=\"col\">\r\n <div class=\"invoice-card card-clickable\" [class.card-active]=\"activeStatus === 'excluded'\"\r\n (click)=\"toggleCardFilter('excluded')\">\r\n <div class=\"invoice-card-label\">Excluded\r\n <svg class=\"info-ic\" ngbTooltip=\"Not a customer payment (no payer name) or manually marked as not to be considered.\" placement=\"top\" (click)=\"$event.stopPropagation()\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 11v5M12 8h.01\"/></svg>\r\n </div>\r\n <div class=\"invoice-card-value\">{{ cards.excluded.count }}</div>\r\n <div class=\"invoice-card-sub\">\u20B9{{ cards.excluded.amount | number:'1.2-2':'en-IN' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Status tabs + search/filter -->\r\n <div class=\"card-header paymenthistory border-0\">\r\n <div class=\"d-flex align-items-center gap-2 flex-wrap\">\r\n <button *ngFor=\"let tab of statusTabs\" class=\"btn btn-sm status-tab\"\r\n [class.active]=\"activeStatus === tab.id\"\r\n (click)=\"setStatus(tab.id)\">\r\n {{ tab.label }}\r\n <span *ngIf=\"countOf(tab.id)\" class=\"countchip ms-1\">{{ countOf(tab.id) }}</span>\r\n </button>\r\n </div>\r\n <div class=\"card-toolbar ms-auto\">\r\n <div class=\"d-flex align-items-center position-relative my-1\">\r\n <span class=\"svg-icon invoicesearch svg-icon-1 position-absolute mt-6 ms-3\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <rect opacity=\"0.5\" x=\"17.0365\" y=\"15.1223\" width=\"8.15546\" height=\"2\" rx=\"1\"\r\n transform=\"rotate(45 17.0365 15.1223)\" fill=\"currentColor\"></rect>\r\n <path d=\"M11 19C6.55556 19 3 15.4444 3 11C3 6.55556 6.55556 3 11 3C15.4444 3 19 6.55556 19 11C19 15.4444 15.4444 19 11 19ZM11 5C7.53333 5 5 7.53333 5 11C5 14.4667 7.53333 17 11 17C14.4667 17 17 14.4667 17 11C17 7.53333 14.4667 5 11 5Z\"\r\n fill=\"currentColor\"></path>\r\n </svg>\r\n </span>\r\n <input [(ngModel)]=\"searchValue\" type=\"text\" class=\"form-control ps-14 invoicesearch\"\r\n placeholder=\"Search payer, narration, UTR...\" autocomplete=\"off\" (change)=\"searchField()\" />\r\n <!-- Filter dropdown \u2014 opens a self-contained popover anchored to\r\n the button (lib-filters can't host the date-range inputs). -->\r\n <div class=\"position-relative txn-filter-wrap\">\r\n <button type=\"button\" class=\"btn-outline btn align-items-end text-nowrap invheader\"\r\n (click)=\"toggleFilter()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"#344054\" stroke-width=\"2\">\r\n <path d=\"M3 5h18M6 12h12M10 19h4\" />\r\n </svg>\r\n <span class=\"ms-2\">Filter</span>\r\n <span *ngIf=\"activeFilterCount\" class=\"countchip ms-1\">{{ activeFilterCount }}</span>\r\n </button>\r\n <div *ngIf=\"filterOpen\" class=\"txn-filter-pop card\">\r\n <div class=\"txn-filter-title\">Filter Options</div>\r\n <div class=\"mb-3\">\r\n <label class=\"form-label small fw-semibold\">Date \u2014 from</label>\r\n <input type=\"date\" class=\"form-control\" [(ngModel)]=\"draftFromDate\">\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"form-label small fw-semibold\">Date \u2014 to</label>\r\n <input type=\"date\" class=\"form-control\" [(ngModel)]=\"draftToDate\">\r\n </div>\r\n <div class=\"mb-2\">\r\n <label class=\"form-label small fw-semibold\">Source</label>\r\n <select class=\"form-select\" [(ngModel)]=\"draftSource\">\r\n <option value=\"all\">All sources</option>\r\n <option value=\"bank\">Bank Statement</option>\r\n <option value=\"va\">Virtual Account</option>\r\n <option value=\"gateway\">Gateway</option>\r\n <option value=\"manual\">Manual</option>\r\n </select>\r\n </div>\r\n <div class=\"d-flex justify-content-end mb-2\" *ngIf=\"activeFilterCount\">\r\n <button class=\"btn btn-link btn-sm p-0\" (click)=\"clearFilters()\">Clear all</button>\r\n </div>\r\n <!-- Filters apply only on Apply; Cancel discards changes. -->\r\n <div class=\"d-flex gap-2 mt-2\">\r\n <button class=\"btn btn-outline-secondary btn-sm flex-fill\" (click)=\"cancelFilters()\">Cancel</button>\r\n <button class=\"btn btn-primary btn-sm flex-fill\" (click)=\"applyFilters()\">Apply</button>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- Delete selected (non-reconciled) rows. -->\r\n <button *ngIf=\"selectedCount > 0 && (gs.userAccess | async)?.Global_Billing_isEdit\"\r\n type=\"button\" class=\"btn-outline btn align-items-end text-nowrap invheader ms-2 delete-all-btn\"\r\n (click)=\"deleteSelected()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M3 6h18M8 6V4a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v2m2 0v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\"\r\n stroke=\"#D92D20\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span class=\"ms-2\">Delete selected ({{ selectedCount }})</span>\r\n </button>\r\n <!-- Delete all (non-reconciled) for the current statement batch.\r\n Reconciled rows are always preserved by the backend. -->\r\n <button *ngIf=\"!noData && (gs.userAccess | async)?.Global_Billing_isEdit\"\r\n type=\"button\" class=\"btn-outline btn align-items-end text-nowrap invheader ms-2 delete-all-btn\"\r\n (click)=\"deleteAll()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M3 6h18M8 6V4a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v2m2 0v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\"\r\n stroke=\"#D92D20\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n <span class=\"ms-2\">Delete all</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Loading shimmer -->\r\n <ng-container *ngIf=\"loading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Empty -->\r\n <ng-container *ngIf=\"!loading && noData\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-12 mb-3\">\r\n <div class=\"card-body d-flex justify-content-center align-items-center flex-column\">\r\n <img class=\"img-src w-25\" src=\"./assets/tango/Icons/Nodata.svg\" alt=\"\">\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Transactions table -->\r\n <div *ngIf=\"!loading && !noData\" class=\"table-responsive\">\r\n <table class=\"table accordion table bottom-border invoivetable text-nowrap\">\r\n <thead>\r\n <tr>\r\n <th *ngIf=\"(gs.userAccess | async)?.Global_Billing_isEdit\" style=\"width:40px;\">\r\n <input type=\"checkbox\" [checked]=\"allSelected\" (change)=\"toggleSelectAll($event)\"\r\n [disabled]=\"selectableRows.length === 0\" ngbTooltip=\"Select all (excludes reconciled)\">\r\n </th>\r\n <th>Date</th>\r\n <th>Source</th>\r\n <th>Payer (from narration)</th>\r\n <th>Reference / UTR</th>\r\n <th>Amount</th>\r\n <th>Brand Name</th>\r\n <th>Invoice</th>\r\n <th>Result</th>\r\n <th>Status</th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let t of rows\">\r\n <td *ngIf=\"(gs.userAccess | async)?.Global_Billing_isEdit\" style=\"width:40px;\">\r\n <!-- Reconciled rows can't be selected. -->\r\n <input type=\"checkbox\" *ngIf=\"isSelectable(t)\" [checked]=\"isSelected(t)\" (change)=\"toggleSelect(t)\">\r\n <span *ngIf=\"!isSelectable(t)\" class=\"lock-ic\" ngbTooltip=\"Reconciled \u2014 cannot be deleted\">\uD83D\uDD12</span>\r\n </td>\r\n <td>\r\n <div class=\"table-title\">{{ t.valueDate | date: 'dd MMM, yyyy' }}</div>\r\n </td>\r\n <td>\r\n <span class=\"srcchip\" [class.srcchip-va]=\"t.source === 'va'\">{{ sourceLabel(t.source) }}</span>\r\n </td>\r\n <td>\r\n <div class=\"table-title payer-cell\">{{ t.payer || '\u2014' }}</div>\r\n <div class=\"narration-sub\" [title]=\"t.narration\">{{ t.narration }}</div>\r\n </td>\r\n <td>\r\n <span class=\"mono\">{{ t.refNo || '\u2014' }}</span>\r\n </td>\r\n <td>\r\n <div class=\"table-title\"><strong>\u20B9{{ t.amount | number:'1.2-2':'en-IN' }}</strong></div>\r\n </td>\r\n <td>\r\n <div class=\"table-title\">{{ t.identifiedClientName || '\u2014' }}</div>\r\n </td>\r\n <td>\r\n <div class=\"table-title\">\r\n <!-- Multiple invoices settled by one payment: link each individually. -->\r\n <ng-container *ngIf=\"t.appliedInvoices?.length > 1; else singleInv\">\r\n <ng-container *ngFor=\"let a of t.appliedInvoices; let last = last\">\r\n <a class=\"invoice-link\" (click)=\"openInvoicePreviewById(a.invoiceId, a.invoice); $event.stopPropagation()\">{{ a.invoice }}</a><span *ngIf=\"!last\">, </span>\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #singleInv>\r\n <a *ngIf=\"t.invoice && t.invoiceId\" class=\"invoice-link\"\r\n (click)=\"openInvoicePreview(t); $event.stopPropagation()\">{{ t.invoice }}</a>\r\n <span *ngIf=\"t.invoice && !t.invoiceId\">{{ t.invoice }}</span>\r\n <span *ngIf=\"!t.invoice\">\u2014</span>\r\n </ng-template>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"result-note\" [title]=\"t.resultNote\">{{ t.resultNote || '\u2014' }}</div>\r\n </td>\r\n <td>\r\n <span *ngIf=\"t.contacted\" class=\"pill pill-amber\">Reaching out</span>\r\n <span *ngIf=\"!t.contacted\" [ngClass]=\"statusPillClass(t.status)\">{{ statusLabel(t.status) }}</span>\r\n </td>\r\n <td>\r\n <button *ngIf=\"t.status === 'needs_review' || t.status === 'unmatched'\"\r\n class=\"btn btn-sm btn-primary\" (click)=\"openResolve(t)\">Resolve</button>\r\n <!-- Reconciled rows: Edit re-opens the Resolve & reconcile\r\n popup so the matched invoice / resolution can be changed. -->\r\n <button *ngIf=\"t.status === 'reconciled'\"\r\n class=\"btn btn-sm btn-outline\" (click)=\"openResolve(t)\">Edit</button>\r\n <!-- Delete: reconciled rows are protected and never deletable. -->\r\n <button *ngIf=\"t.status !== 'reconciled' && (gs.userAccess | async)?.Global_Billing_isEdit\"\r\n class=\"btn btn-sm btn-icon delete-txn\" ngbTooltip=\"Delete transaction\"\r\n (click)=\"deleteTransaction(t)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M3 6h18M8 6V4a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v2m2 0v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 5v6m4-6v6\"\r\n stroke=\"#D92D20\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </button>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <lib-pagination class=\"text-start\" [itemsPerPage]=\"itemsPerPage\" [currentPage]=\"currentPage\"\r\n [totalItems]=\"totalItems\" [paginationSizes]=\"paginationSizes\" [pageSize]=\"pageSize\"\r\n (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </div>\r\n</div>", styles: [".dropzone{display:block;border:1.5px dashed #E4E7EC;border-radius:14px;padding:34px;text-align:center;cursor:pointer;background:#fbfdff;transition:border-color .15s,background .15s}.dropzone:hover{border-color:#1493f5;background:#f5faff}.dz-ic{width:52px;height:52px;border-radius:14px;background:#e8f3fe;color:#1493f5;display:grid;place-items:center;margin:0 auto}.dz-title{font-weight:700;font-size:15px;color:#101828}.invoice-card{border:1px solid #E4E7EC;border-radius:12px;padding:18px 22px;background:#fff}.invoice-card.card-clickable{cursor:pointer;transition:border-color .12s,box-shadow .12s}.invoice-card.card-clickable:hover{border-color:#bcd9f7}.invoice-card.card-active{border-color:#1493f5;box-shadow:0 0 0 3px #1493f51f}.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}.invoice-card-label{color:#475467;font-size:13.5px;font-weight:500}.invoice-card-value{font-size:22px;font-weight:700;color:#101828;margin-top:6px;letter-spacing:-.3px}.invoice-card-value.text-success{color:#138a52}.invoice-card-value.text-danger{color:#d64545}.invoice-card-value.text-warning{color:#b9740a}.invoice-card-sub{color:#98a2b3;font-size:12.5px;margin-top:4px}.pill{display:inline-flex;align-items:center;padding:4px 10px;border-radius:999px;font-size:12px;font-weight:600;white-space:nowrap}.pill-green{background:#e7f7ee;color:#138a52}.pill-amber{background:#fdf0dc;color:#b9740a}.pill-red{background:#fdecec;color:#d64545}.pill-gray{background:#f1f3f6;color:#667085}.srcchip{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:600;padding:3px 9px;border-radius:999px;border:1px solid #E4E7EC;color:#475467;background:#fff;white-space:nowrap}.srcchip.srcchip-va{color:#7a3ea8;border-color:#e4d4f3;background:#f7f0fc}.countchip{background:#f1f3f6;color:#667085;font-weight:600;font-size:11px;border-radius:999px;padding:1px 8px}.payer-cell{max-width:230px;white-space:normal;line-height:1.35;font-weight:600}.narration-sub{max-width:230px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#98a2b3;font-size:11.5px;margin-top:2px}.result-note{max-width:220px;white-space:normal;line-height:1.4;color:#475467;font-size:12.5px}.mono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;color:#344054}.filter-panel{border:1px solid #E4E7EC;border-radius:14px;padding:16px 18px;background:#fbfdff}.invoice-link{color:#00a3ff;cursor:pointer;text-decoration:none}.invoice-link:hover{text-decoration:underline}.txn-filter-wrap{margin-left:10px}.txn-filter-pop{position:absolute;top:calc(100% + 6px);right:0;z-index:40;width:280px;padding:16px;border:1px solid #E4E7EC;border-radius:12px;box-shadow:0 8px 24px #1018281f;background:#fff}.txn-filter-title{font-weight:700;color:#101828;font-size:14px;margin-bottom:12px}.invoice-card-label .info-ic{color:#c4c9d2;cursor:help;vertical-align:middle;margin-left:4px}.svg-icon.invoicesearch.position-absolute{top:50%;transform:translateY(-50%);margin-top:0!important}\n"] }]
432
432
  }], ctorParameters: () => [{ type: i1.BillingService }, { type: i2.ToastService }, { type: i0.ChangeDetectorRef }, { type: i3.NgbModal }, { type: i4.GlobalStateService }] });
433
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFuay10cmFuc2FjdGlvbnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tbWFuYWdlLWJpbGxpbmcvc3JjL2xpYi9jb21wb25lbnRzL2JhbmstdHJhbnNhY3Rpb25zL2JhbmstdHJhbnNhY3Rpb25zLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9iYW5rLXRyYW5zYWN0aW9ucy9iYW5rLXRyYW5zYWN0aW9ucy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDaEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFJMUMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDdkYsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDbEcsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sMkVBQTJFLENBQUM7Ozs7Ozs7O0FBR3hILDJFQUEyRTtBQUMzRSw0RUFBNEU7QUFDNUUsNkVBQTZFO0FBQzdFLHlFQUF5RTtBQU16RSxNQUFNLE9BQU8seUJBQXlCO0lBb0QxQjtJQUNBO0lBQ0E7SUFDQTtJQUNEO0lBdkRULDRFQUE0RTtJQUM1RSxLQUFLLEdBQXlCLFFBQVEsQ0FBQztJQUN2QyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ2YsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUNsQixNQUFNLEdBQUcsS0FBSyxDQUFDO0lBRWYsSUFBSSxHQUFVLEVBQUUsQ0FBQztJQUNqQixVQUFVLEdBQUcsQ0FBQyxDQUFDO0lBQ2YsS0FBSyxHQUFHO1FBQ04sVUFBVSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFB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QUFDLEtBQWEsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQzdDLENBQUM7d0dBbmFVLHlCQUF5Qjs0RkFBekIseUJBQXlCLDZEQ25CdEMsZzhwQkFtU007OzRGRGhSTyx5QkFBeUI7a0JBTHJDLFNBQVM7K0JBQ0UsdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTmdiTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcbmltcG9ydCB7IEJpbGxpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYmlsbGluZy5zZXJ2aWNlJztcbmltcG9ydCB7IEludm9pY2VQcmV2aWV3Q29tcG9uZW50IH0gZnJvbSAnLi4vaW52b2ljZS1wcmV2aWV3L2ludm9pY2UtcHJldmlldy5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVzb2x2ZVRyYW5zYWN0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9yZXNvbHZlLXRyYW5zYWN0aW9uL3Jlc29sdmUtdHJhbnNhY3Rpb24uY29tcG9uZW50JztcbmltcG9ydCB7IERlbGV0ZUNvbmZpcm1hdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL3RhbmdvLW1hbmFnZS1iaWxsaW5nL2RlbGV0ZS1jb25maXJtYXRpb24vZGVsZXRlLWNvbmZpcm1hdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLWdsb2JhbCc7XG5cbi8vIEJhbmstc3RhdGVtZW50IHJlY29uY2lsaWF0aW9uIHRhYi4gVXBsb2FkIGEgc3RhdGVtZW50IGV4cG9ydCAoQ1NWL1hMU1gpLFxuLy8gcm93cyBsYW5kIGluIHRoZSBgYmFua3RyYW5zYWN0aW9uYCBjb2xsZWN0aW9uIGFuZCBhcmUgYnVja2V0ZWQgYnkgc3RhdHVzOlxuLy8gcmVjb25jaWxlZCAvIG5lZWRzX3JldmlldyAvIHVubWF0Y2hlZCAvIGV4Y2x1ZGVkLiBDbGFzc2lmaWNhdGlvbiBydWxlcyBhcmVcbi8vIG5vdCB3aXJlZCB5ZXQg4oCUIG5ldyByb3dzIGFycml2ZSBhcyAndW5tYXRjaGVkJyB1bnRpbCB0aGF0IHBhc3MgZXhpc3RzLlxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWJhbmstdHJhbnNhY3Rpb25zJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2JhbmstdHJhbnNhY3Rpb25zLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2JhbmstdHJhbnNhY3Rpb25zLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBCYW5rVHJhbnNhY3Rpb25zQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvLyAndXBsb2FkJyBzaG93cyB0aGUgZHJvcHpvbmUgKGVtcHR5IGNvbGxlY3Rpb24pOyAncmVzdWx0cycgdGhlIHRhYmxlIHZpZXcuXG4gIHN0YWdlOiAndXBsb2FkJyB8ICdyZXN1bHRzJyA9ICd1cGxvYWQnO1xuICBsb2FkaW5nID0gdHJ1ZTtcbiAgdXBsb2FkaW5nID0gZmFsc2U7XG4gIG5vRGF0YSA9IGZhbHNlO1xuXG4gIHJvd3M6IGFueVtdID0gW107XG4gIHRvdGFsSXRlbXMgPSAwO1xuICBjYXJkcyA9IHtcbiAgICByZWNvbmNpbGVkOiB7IGNvdW50OiAwLCBhbW91bnQ6IDAgfSxcbiAgICBuZWVkc19yZXZpZXc6IHsgY291bnQ6IDAsIGFtb3VudDogMCB9LFxuICAgIHVubWF0Y2hlZDogeyBjb3VudDogMCwgYW1vdW50OiAwIH0sXG4gICAgZXhjbHVkZWQ6IHsgY291bnQ6IDAsIGFtb3VudDogMCB9LFxuICAgIHRvdGFsOiAwLFxuICB9O1xuXG4gIC8vIFN0YXR1cyBzZWdtZW50IHRhYnMg4oCUIGlkcyBtYXRjaCB0aGUgYmFja2VuZCBlbnVtLlxuICBzdGF0dXNUYWJzID0gW1xuICAgIHsgaWQ6ICdhbGwnLCBsYWJlbDogJ0FsbCcgfSxcbiAgICB7IGlkOiAncmVjb25jaWxlZCcsIGxhYmVsOiAnUmVjb25jaWxlZCcgfSxcbiAgICB7IGlkOiAnbmVlZHNfcmV2aWV3JywgbGFiZWw6ICdOZWVkcyByZXZpZXcnIH0sXG4gICAgeyBpZDogJ3VubWF0Y2hlZCcsIGxhYmVsOiAnVW5tYXRjaGVkJyB9LFxuICAgIHsgaWQ6ICdleGNsdWRlZCcsIGxhYmVsOiAnRXhjbHVkZWQnIH0sXG4gIF07XG4gIGFjdGl2ZVN0YXR1cyA9ICdhbGwnO1xuXG4gIC8vIEZpbHRlciBwb3BvdmVyIHN0YXRlLlxuICBmaWx0ZXJPcGVuID0gZmFsc2U7XG4gIC8vIENvbW1pdHRlZCAoYXBwbGllZCkgZmlsdGVyIHZhbHVlcyDigJQgdGhlc2UgZHJpdmUgdGhlIGxpc3QuXG4gIGZyb21EYXRlID0gJyc7XG4gIHRvRGF0ZSA9ICcnO1xuICBzb3VyY2UgPSAnYWxsJztcbiAgLy8gRHJhZnQgdmFsdWVzIGJvdW5kIHRvIHRoZSBwb3BvdmVyIGlucHV0cy4gTm90aGluZyBpcyBhcHBsaWVkIHVudGlsIHRoZVxuICAvLyB1c2VyIGNsaWNrcyBBcHBseTsgQ2FuY2VsIGRpc2NhcmRzIHRoZXNlIGJhY2sgdG8gdGhlIGNvbW1pdHRlZCB2YWx1ZXMuXG4gIGRyYWZ0RnJvbURhdGUgPSAnJztcbiAgZHJhZnRUb0RhdGUgPSAnJztcbiAgZHJhZnRTb3VyY2UgPSAnYWxsJztcbiAgc2VhcmNoVmFsdWUgPSAnJztcblxuICAvLyBQYWdpbmF0aW9uIOKAlCBtaXJyb3JzIHRoZSBBbGwgSW52b2ljZXMgdGFibGUuXG4gIGN1cnJlbnRQYWdlID0gMTtcbiAgcGFnZVNpemUgPSAxMDtcbiAgaXRlbXNQZXJQYWdlID0gMTA7XG4gIHBhZ2luYXRpb25TaXplcyA9IFsxMCwgMjAsIDMwXTtcblxuICAvLyBNdWx0aS1zZWxlY3QgZm9yIGJ1bGsgZGVsZXRlLiBSZWNvbmNpbGVkIHJvd3MgYXJlIG5ldmVyIHNlbGVjdGFibGUuXG4gIHNlbGVjdGVkSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBiaWxsaW5nU2VydmljZTogQmlsbGluZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSB0b2FzdDogVG9hc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCxcbiAgICBwdWJsaWMgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubG9hZExpc3QodHJ1ZSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvLyBmaXJzdExvYWQgZGVjaWRlcyB0aGUgc3RhZ2U6IGFuIGVtcHR5LCB1bmZpbHRlcmVkIGNvbGxlY3Rpb24gbWVhbnMgdGhlXG4gIC8vIHVzZXIgaGFzIG5ldmVyIHVwbG9hZGVkIOKAlCBzaG93IHRoZSBkcm9wem9uZSBpbnN0ZWFkIG9mIGFuIGVtcHR5IHRhYmxlLlxuICBsb2FkTGlzdChmaXJzdExvYWQgPSBmYWxzZSkge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgY29uc3QgZmlsdGVycyA9IHtcbiAgICAgIHN0YXR1czogdGhpcy5hY3RpdmVTdGF0dXMsXG4gICAgICBmcm9tOiB0aGlzLmZyb21EYXRlLFxuICAgICAgdG86IHRoaXMudG9EYXRlLFxuICAgICAgc291cmNlOiB0aGlzLnNvdXJjZSxcbiAgICAgIHNlYXJjaFZhbHVlOiB0aGlzLnNlYXJjaFZhbHVlLFxuICAgICAgbGltaXQ6IHRoaXMucGFnZVNpemUsXG4gICAgICBvZmZzZXQ6IHRoaXMuY3VycmVudFBhZ2UsXG4gICAgfTtcbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmJhbmtUcmFuc2FjdGlvbkxpc3QoZmlsdGVycykucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJvd3MgPSByZXM/LmRhdGE/LmRhdGEgfHwgW107XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJZHMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy50b3RhbEl0ZW1zID0gcmVzPy5kYXRhPy5jb3VudCB8fCAwO1xuICAgICAgICBpZiAocmVzPy5kYXRhPy5jYXJkcykge1xuICAgICAgICAgIHRoaXMuY2FyZHMgPSByZXMuZGF0YS5jYXJkcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vRGF0YSA9IHRoaXMucm93cy5sZW5ndGggPT09IDA7XG4gICAgICAgIGlmIChmaXJzdExvYWQpIHtcbiAgICAgICAgICB0aGlzLnN0YWdlID0gdGhpcy5jYXJkcy50b3RhbCA+IDAgPyAncmVzdWx0cycgOiAndXBsb2FkJztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yb3dzID0gW107XG4gICAgICAgIHRoaXMudG90YWxJdGVtcyA9IDA7XG4gICAgICAgIHRoaXMubm9EYXRhID0gdHJ1ZTtcbiAgICAgICAgaWYgKGZpcnN0TG9hZCkge1xuICAgICAgICAgIHRoaXMuc3RhZ2UgPSAndXBsb2FkJztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBvbkZpbGVTZWxlY3RlZChldmVudDogYW55KSB7XG4gICAgY29uc3QgZmlsZTogRmlsZSA9IGV2ZW50Py50YXJnZXQ/LmZpbGVzPy5bMF07XG4gICAgaWYgKCFmaWxlKSByZXR1cm47XG4gICAgY29uc3Qgb2sgPSAvXFwuKHhsc3h8eGxzfGNzdikkL2kudGVzdChmaWxlLm5hbWUpO1xuICAgIGlmICghb2spIHtcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnVXBsb2FkIHRoZSBiYW5rIHN0YXRlbWVudCBhcyBFeGNlbCAoLnhsc3gsIC54bHMpIG9yIENTVicpO1xuICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gJyc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudXBsb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLnVwbG9hZEJhbmtTdGF0ZW1lbnQoZmlsZSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgIHRoaXMudXBsb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGQgPSByZXM/LmRhdGEgfHwge307XG4gICAgICAgIGNvbnN0IHMgPSBkLnN1bW1hcnkgfHwge307XG4gICAgICAgIGxldCBtc2cgPSBgXCIke2ZpbGUubmFtZX1cIiDigJQgJHtkLmluc2VydGVkIHx8IDB9IHRyYW5zYWN0aW9ucyBhZGRlZGA7XG4gICAgICAgIGlmIChkLmluc2VydGVkKSB7XG4gICAgICAgICAgbXNnICs9IGA6ICR7cy5yZWNvbmNpbGVkIHx8IDB9IHJlY29uY2lsZWQsICR7cy5uZWVkc19yZXZpZXcgfHwgMH0gbmVlZCByZXZpZXcsIGAgK1xuICAgICAgICAgICAgICAgICBgJHtzLnVubWF0Y2hlZCB8fCAwfSB1bm1hdGNoZWQsICR7cy5leGNsdWRlZCB8fCAwfSBleGNsdWRlZGA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGQuZHVwbGljYXRlcykgbXNnICs9IGAgKCR7ZC5kdXBsaWNhdGVzfSBkdXBsaWNhdGVzIHNraXBwZWQpYDtcbiAgICAgICAgaWYgKGQuY2xvc2VkSW52b2ljZXM/Lmxlbmd0aCkgbXNnICs9IGAgwrcgJHtkLmNsb3NlZEludm9pY2VzLmxlbmd0aH0gaW52b2ljZShzKSBjbG9zZWQgYXMgcGFpZGA7XG4gICAgICAgIHRoaXMudG9hc3QuZ2V0UHJpbWFyeVRvYXN0KG1zZyk7XG4gICAgICAgIC8vIEF1dG8tcmVjb25jaWxpYXRpb24gbWF5IGhhdmUgY2xvc2VkIGludm9pY2VzIOKAlCByZWZldGNoIG9wdGlvbnMgbmV4dCB0aW1lLlxuICAgICAgICB0aGlzLnJlc29sdmVPcHRpb25zQ2FjaGUgPSBudWxsO1xuICAgICAgICB0aGlzLnN0YWdlID0gJ3Jlc3VsdHMnO1xuICAgICAgICB0aGlzLmFjdGl2ZVN0YXR1cyA9ICdhbGwnO1xuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgICAgICAgdGhpcy5sb2FkTGlzdCgpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMudXBsb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChlcnI/LmVycm9yPy5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gcGFyc2UgdGhlIHN0YXRlbWVudCBmaWxlJyk7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICBldmVudC50YXJnZXQudmFsdWUgPSAnJztcbiAgfVxuXG4gIHNldFN0YXR1cyhpZDogc3RyaW5nKSB7XG4gICAgdGhpcy5hY3RpdmVTdGF0dXMgPSBpZDtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgICB0aGlzLmxvYWRMaXN0KCk7XG4gIH1cblxuICAvLyBTdGF0IGNhcmRzIGRvdWJsZSBhcyBmaWx0ZXJzOiBjbGlja2luZyBzZWxlY3RzIHRoYXQgc3RhdHVzLCBjbGlja2luZyB0aGVcbiAgLy8gYWxyZWFkeS1zZWxlY3RlZCBjYXJkIGNsZWFycyBiYWNrIHRvIEFsbC5cbiAgdG9nZ2xlQ2FyZEZpbHRlcihpZDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRTdGF0dXModGhpcy5hY3RpdmVTdGF0dXMgPT09IGlkID8gJ2FsbCcgOiBpZCk7XG4gIH1cblxuICB0b2dnbGVGaWx0ZXIoKSB7XG4gICAgLy8gT3BlbmluZzogc2VlZCB0aGUgZHJhZnQgaW5wdXRzIGZyb20gdGhlIGN1cnJlbnRseS1hcHBsaWVkIGZpbHRlcnMgc28gdGhlXG4gICAgLy8gcG9wb3ZlciByZWZsZWN0cyB3aGF0J3MgYWN0aXZlLiBDbG9zaW5nIHZpYSB0aGUgYnV0dG9uID0gY2FuY2VsLlxuICAgIGlmICghdGhpcy5maWx0ZXJPcGVuKSB7XG4gICAgICB0aGlzLmRyYWZ0RnJvbURhdGUgPSB0aGlzLmZyb21EYXRlO1xuICAgICAgdGhpcy5kcmFmdFRvRGF0ZSA9IHRoaXMudG9EYXRlO1xuICAgICAgdGhpcy5kcmFmdFNvdXJjZSA9IHRoaXMuc291cmNlO1xuICAgICAgdGhpcy5maWx0ZXJPcGVuID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maWx0ZXJPcGVuID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gQ29tbWl0IHRoZSBkcmFmdCBzZWxlY3Rpb25zIGFuZCByZWxvYWQuIE9ubHkgbm93IGRvZXMgdGhlIGZpbHRlciB0YWtlXG4gIC8vIGVmZmVjdDsgdGhlIHBvcG92ZXIgY2xvc2VzLlxuICBhcHBseUZpbHRlcnMoKSB7XG4gICAgdGhpcy5mcm9tRGF0ZSA9IHRoaXMuZHJhZnRGcm9tRGF0ZTtcbiAgICB0aGlzLnRvRGF0ZSA9IHRoaXMuZHJhZnRUb0RhdGU7XG4gICAgdGhpcy5zb3VyY2UgPSB0aGlzLmRyYWZ0U291cmNlO1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xuICAgIHRoaXMuZmlsdGVyT3BlbiA9IGZhbHNlO1xuICAgIHRoaXMubG9hZExpc3QoKTtcbiAgfVxuXG4gIC8vIERpc2NhcmQgZHJhZnQgZWRpdHMgYW5kIGNsb3NlIHdpdGhvdXQgYXBwbHlpbmcuXG4gIGNhbmNlbEZpbHRlcnMoKSB7XG4gICAgdGhpcy5kcmFmdEZyb21EYXRlID0gdGhpcy5mcm9tRGF0ZTtcbiAgICB0aGlzLmRyYWZ0VG9EYXRlID0gdGhpcy50b0RhdGU7XG4gICAgdGhpcy5kcmFmdFNvdXJjZSA9IHRoaXMuc291cmNlO1xuICAgIHRoaXMuZmlsdGVyT3BlbiA9IGZhbHNlO1xuICB9XG5cbiAgY2xlYXJGaWx0ZXJzKCkge1xuICAgIHRoaXMuZnJvbURhdGUgPSAnJztcbiAgICB0aGlzLnRvRGF0ZSA9ICcnO1xuICAgIHRoaXMuc291cmNlID0gJ2FsbCc7XG4gICAgdGhpcy5kcmFmdEZyb21EYXRlID0gJyc7XG4gICAgdGhpcy5kcmFmdFRvRGF0ZSA9ICcnO1xuICAgIHRoaXMuZHJhZnRTb3VyY2UgPSAnYWxsJztcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgICB0aGlzLmZpbHRlck9wZW4gPSBmYWxzZTtcbiAgICB0aGlzLmxvYWRMaXN0KCk7XG4gIH1cblxuICBnZXQgYWN0aXZlRmlsdGVyQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKHRoaXMuZnJvbURhdGUgPyAxIDogMCkgKyAodGhpcy50b0RhdGUgPyAxIDogMCkgKyAodGhpcy5zb3VyY2UgIT09ICdhbGwnID8gMSA6IDApO1xuICB9XG5cbiAgc2VhcmNoRmllbGQoKSB7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XG4gICAgdGhpcy5sb2FkTGlzdCgpO1xuICB9XG5cbiAgb25QYWdlQ2hhbmdlKHBhZ2U6IG51bWJlcikge1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSBwYWdlO1xuICAgIHRoaXMubG9hZExpc3QoKTtcbiAgfVxuXG4gIG9uUGFnZVNpemVDaGFuZ2Uoc2l6ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5wYWdlU2l6ZSA9IHNpemU7XG4gICAgdGhpcy5pdGVtc1BlclBhZ2UgPSBzaXplO1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xuICAgIHRoaXMubG9hZExpc3QoKTtcbiAgfVxuXG4gIC8vIFJlY29uY2lsZWQgcm93cyBjYXJyeSB0aGUgbWF0Y2hlZCBpbnZvaWNlJ3MgX2lkIOKAlCBvcGVuIHRoZSBzYW1lIHByZXZpZXdcbiAgLy8gcG9wdXAgdGhlIEFsbCBJbnZvaWNlcyB0YWJsZSB1c2VzLlxuICBvcGVuSW52b2ljZVByZXZpZXcodDogYW55KSB7XG4gICAgdGhpcy5vcGVuSW52b2ljZVByZXZpZXdCeUlkKHQ/Lmludm9pY2VJZCk7XG4gIH1cblxuICAvLyBPcGVuIHRoZSBpbnZvaWNlIHByZXZpZXcgZm9yIGEgc3BlY2lmaWMgaW52b2ljZSBpZCDigJQgdXNlZCBieSB0aGUgc2luZ2xlXG4gIC8vIGFuZCBtdWx0aS1pbnZvaWNlIChhcHBsaWVkSW52b2ljZXMpIGNlbGxzIGFsaWtlLlxuICBvcGVuSW52b2ljZVByZXZpZXdCeUlkKGludm9pY2VJZDogc3RyaW5nLCBfaW52b2ljZU5vPzogc3RyaW5nKSB7XG4gICAgaWYgKCFpbnZvaWNlSWQpIHJldHVybjtcbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmdldEludm9pY2VCeUlkKGludm9pY2VJZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgaW52b2ljZURhdGEgPSByZXM/LmRhdGE7XG4gICAgICAgIGlmICghaW52b2ljZURhdGEpIHtcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0ZhaWxlZCB0byBsb2FkIGludm9pY2UnKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKEludm9pY2VQcmV2aWV3Q29tcG9uZW50LCB7XG4gICAgICAgICAgY2VudGVyZWQ6IHRydWUsIHNpemU6ICd4bCcsIHNjcm9sbGFibGU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5pbnZvaWNlRGF0YSA9IGludm9pY2VEYXRhO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0ZhaWxlZCB0byBsb2FkIGludm9pY2UnKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFwiUmVzb2x2ZSAmIHJlY29uY2lsZVwiIHBvcHVwIGZvciBuZWVkcy1yZXZpZXcgLyB1bm1hdGNoZWQgcm93cy4gVGhlXG4gIC8vIGN1c3RvbWVyL2ludm9pY2Ugb3B0aW9ucyBhcmUgY2FjaGVkIGZvciB0aGUgcGFnZSBzZXNzaW9uIOKAlCBmZXRjaGVkIG9uY2UsXG4gIC8vIGludmFsaWRhdGVkIG9ubHkgd2hlbiBhbiBhY3Rpb24gY2hhbmdlcyBpbnZvaWNlIHN0YXRlIChyZWNvbmNpbGUpIG9yIGFcbiAgLy8gbmV3IHN0YXRlbWVudCBpcyB1cGxvYWRlZC5cbiAgcHJpdmF0ZSByZXNvbHZlT3B0aW9uc0NhY2hlOiBhbnlbXSB8IG51bGwgPSBudWxsO1xuXG4gIG9wZW5SZXNvbHZlKHQ6IGFueSkge1xuICAgIGlmICh0aGlzLnJlc29sdmVPcHRpb25zQ2FjaGUpIHtcbiAgICAgIHRoaXMuc2hvd1Jlc29sdmVNb2RhbCh0LCB0aGlzLnJlc29sdmVPcHRpb25zQ2FjaGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmJhbmtSZXNvbHZlT3B0aW9ucygpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICB0aGlzLnJlc29sdmVPcHRpb25zQ2FjaGUgPSByZXM/LmRhdGEgfHwgW107XG4gICAgICAgIHRoaXMuc2hvd1Jlc29sdmVNb2RhbCh0LCB0aGlzLnJlc29sdmVPcHRpb25zQ2FjaGUhKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4gdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdGYWlsZWQgdG8gbG9hZCBjdXN0b21lcnMgYW5kIGludm9pY2VzJyksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNob3dSZXNvbHZlTW9kYWwodDogYW55LCBvcHRpb25zOiBhbnlbXSkge1xuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihSZXNvbHZlVHJhbnNhY3Rpb25Db21wb25lbnQsIHtcbiAgICAgIGNlbnRlcmVkOiB0cnVlLCBzaXplOiAnbWQnLCBzY3JvbGxhYmxlOiB0cnVlLFxuICAgIH0pO1xuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnR4biA9IHQ7XG4gICAgbW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2Uub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgbW9kYWxSZWYucmVzdWx0LnRoZW4oKG1zZzogYW55KSA9PiB7XG4gICAgICBpZiAobXNnKSB7XG4gICAgICAgIHRoaXMudG9hc3QuZ2V0UHJpbWFyeVRvYXN0KFN0cmluZyhtc2cpKTtcbiAgICAgICAgLy8gQSByZXNvbHZlIG1heSBoYXZlIGNsb3NlZC9wYXJ0aWFsbHktcGFpZCBhbiBpbnZvaWNlIOKAlCByZWZldGNoIG5leHQgdGltZS5cbiAgICAgICAgdGhpcy5yZXNvbHZlT3B0aW9uc0NhY2hlID0gbnVsbDtcbiAgICAgICAgdGhpcy5sb2FkTGlzdCgpO1xuICAgICAgfVxuICAgIH0pLmNhdGNoKCgpID0+IHt9KTtcbiAgfVxuXG4gIC8vID09PT09IFNlbGVjdGlvbiAoYnVsayBkZWxldGUpID09PT09XG4gIC8vIEEgcm93IGlzIHNlbGVjdGFibGUgb25seSBpZiBpdCBpcyBub3QgcmVjb25jaWxlZC5cbiAgaXNTZWxlY3RhYmxlKHQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXQgJiYgdC5zdGF0dXMgIT09ICdyZWNvbmNpbGVkJztcbiAgfVxuXG4gIGlzU2VsZWN0ZWQodDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdD8uX2lkICYmIHRoaXMuc2VsZWN0ZWRJZHMuaGFzKHQuX2lkKTtcbiAgfVxuXG4gIHRvZ2dsZVNlbGVjdCh0OiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuaXNTZWxlY3RhYmxlKHQpIHx8ICF0Py5faWQpIHsgcmV0dXJuOyB9XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJZHMuaGFzKHQuX2lkKSkge1xuICAgICAgdGhpcy5zZWxlY3RlZElkcy5kZWxldGUodC5faWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkSWRzLmFkZCh0Ll9pZCk7XG4gICAgfVxuICB9XG5cbiAgLy8gUm93cyBvbiB0aGUgY3VycmVudCBwYWdlIHRoYXQgY2FuIGJlIHNlbGVjdGVkIChleGNsdWRlcyByZWNvbmNpbGVkKS5cbiAgZ2V0IHNlbGVjdGFibGVSb3dzKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5yb3dzLmZpbHRlcigocikgPT4gdGhpcy5pc1NlbGVjdGFibGUocikpO1xuICB9XG5cbiAgZ2V0IGFsbFNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNlbCA9IHRoaXMuc2VsZWN0YWJsZVJvd3M7XG4gICAgcmV0dXJuIHNlbC5sZW5ndGggPiAwICYmIHNlbC5ldmVyeSgocikgPT4gdGhpcy5zZWxlY3RlZElkcy5oYXMoci5faWQpKTtcbiAgfVxuXG4gIHRvZ2dsZVNlbGVjdEFsbChldmVudDogYW55KSB7XG4gICAgY29uc3QgY2hlY2tlZCA9IGV2ZW50Py50YXJnZXQ/LmNoZWNrZWQ7XG4gICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0YWJsZVJvd3MuZm9yRWFjaCgocikgPT4gdGhpcy5zZWxlY3RlZElkcy5hZGQoci5faWQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RhYmxlUm93cy5mb3JFYWNoKChyKSA9PiB0aGlzLnNlbGVjdGVkSWRzLmRlbGV0ZShyLl9pZCkpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBzZWxlY3RlZENvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJZHMuc2l6ZTtcbiAgfVxuXG4gIGRlbGV0ZVNlbGVjdGVkKCkge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZElkcy5zaXplKSB7IHJldHVybjsgfVxuICAgIGNvbnN0IGlkcyA9IEFycmF5LmZyb20odGhpcy5zZWxlY3RlZElkcyk7XG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKERlbGV0ZUNvbmZpcm1hdGlvbkNvbXBvbmVudCwgeyBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ21kJyB9KTtcbiAgICBtb2RhbFJlZi5yZXN1bHQudGhlbigocmVzOiBhbnkpID0+IHtcbiAgICAgIGlmIChyZXMgIT09ICdZZXMnKSB7IHJldHVybjsgfVxuICAgICAgdGhpcy5iaWxsaW5nU2VydmljZS5kZWxldGVTZWxlY3RlZEJhbmtUcmFuc2FjdGlvbnMoaWRzKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHI6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGRlbGV0ZWQgPSByPy5kYXRhPy5kZWxldGVkID8/IDA7XG4gICAgICAgICAgY29uc3Qgc2tpcHBlZCA9IHI/LmRhdGE/LnNraXBwZWQgPz8gMDtcbiAgICAgICAgICBsZXQgbXNnID0gYCR7ZGVsZXRlZH0gdHJhbnNhY3Rpb24ocykgZGVsZXRlZGA7XG4gICAgICAgICAgaWYgKHNraXBwZWQpIHsgbXNnICs9IGAgwrcgJHtza2lwcGVkfSByZWNvbmNpbGVkIGtlcHRgOyB9XG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRQcmltYXJ5VG9hc3QobXNnKTtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcbiAgICAgICAgICB0aGlzLmxvYWRMaXN0KCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoZXJyPy5lcnJvcj8ubWVzc2FnZSB8fCAnRmFpbGVkIHRvIGRlbGV0ZSB0cmFuc2FjdGlvbnMnKSxcbiAgICAgIH0pO1xuICAgIH0pLmNhdGNoKCgpID0+IHt9KTtcbiAgfVxuXG4gIC8vID09PT09IERlbGV0ZSA9PT09PVxuICAvLyBEZWxldGUgYSBzaW5nbGUgKG5vbi1yZWNvbmNpbGVkKSB0cmFuc2FjdGlvbiBhZnRlciBjb25maXJtYXRpb24uIFJlY29uY2lsZWRcbiAgLy8gcm93cyBuZXZlciBzaG93IHRoZSBkZWxldGUgYnV0dG9uLCBhbmQgdGhlIGJhY2tlbmQgcmVqZWN0cyB0aGVtIGFueXdheS5cbiAgZGVsZXRlVHJhbnNhY3Rpb24odDogYW55KSB7XG4gICAgaWYgKCF0Py5faWQgfHwgdC5zdGF0dXMgPT09ICdyZWNvbmNpbGVkJykgeyByZXR1cm47IH1cbiAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oRGVsZXRlQ29uZmlybWF0aW9uQ29tcG9uZW50LCB7IGNlbnRlcmVkOiB0cnVlLCBzaXplOiAnbWQnIH0pO1xuICAgIG1vZGFsUmVmLnJlc3VsdC50aGVuKChyZXM6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlcyAhPT0gJ1llcycpIHsgcmV0dXJuOyB9XG4gICAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmRlbGV0ZUJhbmtUcmFuc2FjdGlvbih0Ll9pZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldFByaW1hcnlUb2FzdCgnVHJhbnNhY3Rpb24gZGVsZXRlZCcpO1xuICAgICAgICAgIHRoaXMubG9hZExpc3QoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChlcnI/LmVycm9yPy5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gZGVsZXRlIHRyYW5zYWN0aW9uJyksXG4gICAgICB9KTtcbiAgICB9KS5jYXRjaCgoKSA9PiB7fSk7XG4gIH1cblxuICAvLyBEZWxldGUgYWxsIG5vbi1yZWNvbmNpbGVkIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBjdXJyZW50IHN0YXRlbWVudCBiYXRjaFxuICAvLyAoYnkgZmlsZU5hbWUpLiBSZWNvbmNpbGVkIHJvd3MgYXJlIHByZXNlcnZlZCBieSB0aGUgYmFja2VuZC5cbiAgZGVsZXRlQWxsKCkge1xuICAgIGNvbnN0IGZpbGVOYW1lID0gdGhpcy5yb3dzPy5bMF0/LmZpbGVOYW1lO1xuICAgIGlmICghZmlsZU5hbWUpIHtcbiAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnTm8gc3RhdGVtZW50IGZpbGUgZm91bmQgZm9yIHRoZXNlIHRyYW5zYWN0aW9ucycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oRGVsZXRlQ29uZmlybWF0aW9uQ29tcG9uZW50LCB7IGNlbnRlcmVkOiB0cnVlLCBzaXplOiAnbWQnIH0pO1xuICAgIG1vZGFsUmVmLnJlc3VsdC50aGVuKChyZXM6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlcyAhPT0gJ1llcycpIHsgcmV0dXJuOyB9XG4gICAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLmRlbGV0ZUFsbEJhbmtUcmFuc2FjdGlvbnMoZmlsZU5hbWUpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocjogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgZGVsZXRlZCA9IHI/LmRhdGE/LmRlbGV0ZWQgPz8gMDtcbiAgICAgICAgICBjb25zdCBza2lwcGVkID0gcj8uZGF0YT8uc2tpcHBlZCA/PyAwO1xuICAgICAgICAgIGxldCBtc2cgPSBgJHtkZWxldGVkfSB0cmFuc2FjdGlvbihzKSBkZWxldGVkYDtcbiAgICAgICAgICBpZiAoc2tpcHBlZCkgeyBtc2cgKz0gYCDCtyAke3NraXBwZWR9IHJlY29uY2lsZWQga2VwdGA7IH1cbiAgICAgICAgICB0aGlzLnRvYXN0LmdldFByaW1hcnlUb2FzdChtc2cpO1xuICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xuICAgICAgICAgIHRoaXMubG9hZExpc3QoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChlcnI/LmVycm9yPy5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gZGVsZXRlIHRyYW5zYWN0aW9ucycpLFxuICAgICAgfSk7XG4gICAgfSkuY2F0Y2goKCkgPT4ge30pO1xuICB9XG5cbiAgLy8gPT09PT0gRGlzcGxheSBoZWxwZXJzID09PT09XG4gIHN0YXR1c0xhYmVsKHM6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgcmVjb25jaWxlZDogJ1JlY29uY2lsZWQnLCBuZWVkc19yZXZpZXc6ICdOZWVkcyByZXZpZXcnLFxuICAgICAgdW5tYXRjaGVkOiAnVW5tYXRjaGVkJywgZXhjbHVkZWQ6ICdFeGNsdWRlZCcsXG4gICAgfTtcbiAgICByZXR1cm4gbWFwW3NdIHx8IHM7XG4gIH1cblxuICBzdGF0dXNQaWxsQ2xhc3Moczogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBtYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICByZWNvbmNpbGVkOiAncGlsbCBwaWxsLWdyZWVuJywgbmVlZHNfcmV2aWV3OiAncGlsbCBwaWxsLWFtYmVyJyxcbiAgICAgIHVubWF0Y2hlZDogJ3BpbGwgcGlsbC1yZWQnLCBleGNsdWRlZDogJ3BpbGwgcGlsbC1ncmF5JyxcbiAgICB9O1xuICAgIHJldHVybiBtYXBbc10gfHwgJ3BpbGwgcGlsbC1ncmF5JztcbiAgfVxuXG4gIHNvdXJjZUxhYmVsKHM6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyBiYW5rOiAnQmFuayBTdGF0ZW1lbnQnLCB2YTogJ1ZpcnR1YWwgQWNjb3VudCcsIGdhdGV3YXk6ICdHYXRld2F5JywgbWFudWFsOiAnTWFudWFsJyB9O1xuICAgIHJldHVybiBtYXBbc10gfHwgcztcbiAgfVxuXG4gIGNvdW50T2YoaWQ6IHN0cmluZyk6IG51bWJlciB7XG4gICAgaWYgKGlkID09PSAnYWxsJykgcmV0dXJuIHRoaXMuY2FyZHMudG90YWw7XG4gICAgcmV0dXJuICh0aGlzLmNhcmRzIGFzIGFueSlbaWRdPy5jb3VudCB8fCAwO1xuICB9XG59IiwiPGRpdj5cbiAgICA8IS0tID09PT09PT09PT09PSBVcGxvYWQgc3RhZ2UgKG5vIHN0YXRlbWVudHMgeWV0KSA9PT09PT09PT09PT0gLS0+XG4gICAgPGRpdiAqbmdJZj1cInN0YWdlID09PSAndXBsb2FkJyAmJiAhbG9hZGluZ1wiIGNsYXNzPVwicHgtNCBwYi00XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJiaWxsaW5naGVhZGVyIG1zLTEgbXQtNlwiPkJhbmsgU3RhdGVtZW50IFJlY29uY2lsaWF0aW9uPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsIG1zLTEgbXQtMVwiPlVwbG9hZCBhIGJhbmsgc3RhdGVtZW50IOKAlCB0cmFuc2FjdGlvbnMgYXJlIHN0b3JlZCBhbmQgc3BsaXQgaW50b1xuICAgICAgICAgICAgUmVjb25jaWxlZCwgTmVlZHMgcmV2aWV3LCBVbm1hdGNoZWQgYW5kIEV4Y2x1ZGVkLjwvZGl2PlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJkcm9wem9uZSBtdC00XCIgZm9yPVwic3RtdC1maWxlXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHotaWNcIj5cbiAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTIgMjFWOU04IDEzbDQtNCA0IDRNNSA1aDE0XCIgLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR6LXRpdGxlIG10LTNcIj5VcGxvYWQgYmFuayBzdGF0ZW1lbnQ8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsIG10LTFcIj5EcmFnICZhbXA7IGRyb3Agb3IgY2xpY2sgdG8gYnJvd3NlIMK3IDxzdHJvbmc+RXhjZWwgKC54bHN4LCAueGxzKSBvciBDU1Y8L3N0cm9uZz48L2Rpdj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1zbSBtdC0zXCIgW2Rpc2FibGVkXT1cInVwbG9hZGluZ1wiXG4gICAgICAgICAgICAgICAgb25jbGljaz1cImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdG10LWZpbGUnKS5jbGljaygpOyBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1wiPlxuICAgICAgICAgICAgICAgIHt7IHVwbG9hZGluZyA/ICdQYXJzaW5n4oCmJyA6ICdVcGxvYWQgJiBwYXJzZScgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8aW5wdXQgaWQ9XCJzdG10LWZpbGVcIiB0eXBlPVwiZmlsZVwiIGFjY2VwdD1cIi54bHN4LC54bHMsLmNzdlwiIGNsYXNzPVwiZC1ub25lXCIgKGNoYW5nZSk9XCJvbkZpbGVTZWxlY3RlZCgkZXZlbnQpXCI+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tID09PT09PT09PT09PSBSZXN1bHRzIHN0YWdlID09PT09PT09PT09PSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwic3RhZ2UgPT09ICdyZXN1bHRzJ1wiPlxuICAgICAgICA8IS0tIFVwbG9hZC1hbm90aGVyIGFjdGlvbiAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGFsaWduLWl0ZW1zLWNlbnRlciBtdC00IG1lLTRcIj5cbiAgICAgICAgICAgIDxpbnB1dCBpZD1cInN0bXQtZmlsZS1hZ2FpblwiIHR5cGU9XCJmaWxlXCIgYWNjZXB0PVwiLnhsc3gsLnhscywuY3N2XCIgY2xhc3M9XCJkLW5vbmVcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25GaWxlU2VsZWN0ZWQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tb3V0bGluZSBidG4gYWxpZ24taXRlbXMtZW5kIHRleHQtbm93cmFwIGludmhlYWRlclwiIFtkaXNhYmxlZF09XCJ1cGxvYWRpbmdcIlxuICAgICAgICAgICAgICAgIG9uY2xpY2s9XCJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RtdC1maWxlLWFnYWluJykuY2xpY2soKVwiPlxuICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE3LjUgMTIuNVYxNS44MzMzQzE3LjUgMTYuMjc1NCAxNy4zMjQ0IDE2LjY5OTMgMTcuMDExOCAxNy4wMTE4QzE2LjY5OTMgMTcuMzI0NCAxNi4yNzU0IDE3LjUgMTUuODMzMyAxNy41SDQuMTY2NjdDMy43MjQ2NCAxNy41IDMuMzAwNzIgMTcuMzI0NCAyLjk4ODE2IDE3LjAxMThDMi42NzU1OSAxNi42OTkzIDIuNSAxNi4yNzU0IDIuNSAxNS44MzMzVjEyLjVNMTQuMTY2NyA2LjY2NjY3TDEwIDIuNU0xMCAyLjVMNS44MzMzMyA2LjY2NjY3TTEwIDIuNVYxMi41XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTJcIj57eyB1cGxvYWRpbmcgPyAnUGFyc2luZ+KApicgOiAnVXBsb2FkIGFub3RoZXIgc3RhdGVtZW50JyB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFN0YXR1cyBjYXJkcyDigJQgY2xpY2tpbmcgYSBjYXJkIGZpbHRlcnMgdGhlIHRhYmxlIChjbGljayBhZ2FpbiB0byBjbGVhcikgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgZy0zIG10LTEgbWItMiBteC0yXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtY2FyZCBjYXJkLWNsaWNrYWJsZVwiIFtjbGFzcy5jYXJkLWFjdGl2ZV09XCJhY3RpdmVTdGF0dXMgPT09ICdyZWNvbmNpbGVkJ1wiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVDYXJkRmlsdGVyKCdyZWNvbmNpbGVkJylcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtY2FyZC1sYWJlbFwiPlJlY29uY2lsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJpbmZvLWljXCIgbmdiVG9vbHRpcD1cIlBheW1lbnRzIGF1dG9tYXRpY2FsbHkgbWF0Y2hlZCB0byBhbiBpbnZvaWNlIChwYXllciBuYW1lICsgYW1vdW50KSwgb3IgbWFudWFsbHkgcmVjb25jaWxlZC5cIiBwbGFjZW1lbnQ9XCJ0b3BcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIj48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjlcIi8+PHBhdGggZD1cIk0xMiAxMXY1TTEyIDhoLjAxXCIvPjwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtY2FyZC12YWx1ZSB0ZXh0LXN1Y2Nlc3NcIj57eyBjYXJkcy5yZWNvbmNpbGVkLmNvdW50IH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLWNhcmQtc3ViXCI+4oK5e3sgY2FyZHMucmVjb25jaWxlZC5hbW91bnQgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52b2ljZS1jYXJkIGNhcmQtY2xpY2thYmxlXCIgW2NsYXNzLmNhcmQtYWN0aXZlXT1cImFjdGl2ZVN0YXR1cyA9PT0gJ25lZWRzX3JldmlldydcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQ2FyZEZpbHRlcignbmVlZHNfcmV2aWV3JylcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtY2FyZC1sYWJlbFwiPk5lZWRzIHJldmlld1xuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImluZm8taWNcIiBuZ2JUb29sdGlwPVwiUGF5ZXIgbWF0Y2hlcyBhIGN1c3RvbWVyIGJ1dCB0aGUgYW1vdW50IGRvZXNuJ3QgbWF0Y2ggYW4gaW52b2ljZSwgb3IgYSBkb2xsYXIgcGF5bWVudCBtYXRjaGVkIOKAlCBjb25maXJtIGJlZm9yZSByZWNvbmNpbGluZy5cIiBwbGFjZW1lbnQ9XCJ0b3BcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIj48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjlcIi8+PHBhdGggZD1cIk0xMiAxMXY1TTEyIDhoLjAxXCIvPjwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtY2FyZC12YWx1ZSB0ZXh0LXdhcm5pbmdcIj57eyBjYXJkcy5uZWVkc19yZXZpZXcuY291bnQgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtY2FyZC1zdWJcIj7igrl7eyBjYXJkcy5uZWVkc19yZXZpZXcuYW1vdW50IHwgbnVtYmVyOicxLjItMic6J2VuLUlOJyB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtY2FyZCBjYXJkLWNsaWNrYWJsZVwiIFtjbGFzcy5jYXJkLWFjdGl2ZV09XCJhY3RpdmVTdGF0dXMgPT09ICd1bm1hdGNoZWQnXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUNhcmRGaWx0ZXIoJ3VubWF0Y2hlZCcpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLWNhcmQtbGFiZWxcIj5Vbm1hdGNoZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJpbmZvLWljXCIgbmdiVG9vbHRpcD1cIlBheWVyIG5hbWUgZG9lc24ndCBtYXRjaCBhbnkgY3VzdG9tZXIncyBpbnZvaWNlIOKAlCBpZGVudGlmeSB0aGUgY3VzdG9tZXIgYW5kIG1hcCBpdCBtYW51YWxseS5cIiBwbGFjZW1lbnQ9XCJ0b3BcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIj48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjlcIi8+PHBhdGggZD1cIk0xMiAxMXY1TTEyIDhoLjAxXCIvPjwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtY2FyZC12YWx1ZSB0ZXh0LWRhbmdlclwiPnt7IGNhcmRzLnVubWF0Y2hlZC5jb3VudCB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52b2ljZS1jYXJkLXN1YlwiPuKCuXt7IGNhcmRzLnVubWF0Y2hlZC5hbW91bnQgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52b2ljZS1jYXJkIGNhcmQtY2xpY2thYmxlXCIgW2NsYXNzLmNhcmQtYWN0aXZlXT1cImFjdGl2ZVN0YXR1cyA9PT0gJ2V4Y2x1ZGVkJ1wiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVDYXJkRmlsdGVyKCdleGNsdWRlZCcpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLWNhcmQtbGFiZWxcIj5FeGNsdWRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImluZm8taWNcIiBuZ2JUb29sdGlwPVwiTm90IGEgY3VzdG9tZXIgcGF5bWVudCAobm8gcGF5ZXIgbmFtZSkgb3IgbWFudWFsbHkgbWFya2VkIGFzIG5vdCB0byBiZSBjb25zaWRlcmVkLlwiIHBsYWNlbWVudD1cInRvcFwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiOVwiLz48cGF0aCBkPVwiTTEyIDExdjVNMTIgOGguMDFcIi8+PC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52b2ljZS1jYXJkLXZhbHVlXCI+e3sgY2FyZHMuZXhjbHVkZWQuY291bnQgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtY2FyZC1zdWJcIj7igrl7eyBjYXJkcy5leGNsdWRlZC5hbW91bnQgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBTdGF0dXMgdGFicyArIHNlYXJjaC9maWx0ZXIgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBwYXltZW50aGlzdG9yeSBib3JkZXItMFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTIgZmxleC13cmFwXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdGb3I9XCJsZXQgdGFiIG9mIHN0YXR1c1RhYnNcIiBjbGFzcz1cImJ0biBidG4tc20gc3RhdHVzLXRhYlwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlU3RhdHVzID09PSB0YWIuaWRcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2V0U3RhdHVzKHRhYi5pZClcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgdGFiLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY291bnRPZih0YWIuaWQpXCIgY2xhc3M9XCJjb3VudGNoaXAgbXMtMVwiPnt7IGNvdW50T2YodGFiLmlkKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtdG9vbGJhciBtcy1hdXRvXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgcG9zaXRpb24tcmVsYXRpdmUgbXktMVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN2Zy1pY29uIGludm9pY2VzZWFyY2ggc3ZnLWljb24tMSBwb3NpdGlvbi1hYnNvbHV0ZSBtdC02IG1zLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IG9wYWNpdHk9XCIwLjVcIiB4PVwiMTcuMDM2NVwiIHk9XCIxNS4xMjIzXCIgd2lkdGg9XCI4LjE1NTQ2XCIgaGVpZ2h0PVwiMlwiIHJ4PVwiMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInJvdGF0ZSg0NSAxNy4wMzY1IDE1LjEyMjMpXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjwvcmVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTExIDE5QzYuNTU1NTYgMTkgMyAxNS40NDQ0IDMgMTFDMyA2LjU1NTU2IDYuNTU1NTYgMyAxMSAzQzE1LjQ0NDQgMyAxOSA2LjU1NTU2IDE5IDExQzE5IDE1LjQ0NDQgMTUuNDQ0NCAxOSAxMSAxOVpNMTEgNUM3LjUzMzMzIDUgNSA3LjUzMzMzIDUgMTFDNSAxNC40NjY3IDcuNTMzMzMgMTcgMTEgMTdDMTQuNDY2NyAxNyAxNyAxNC40NjY3IDE3IDExQzE3IDcuNTMzMzMgMTQuNDY2NyA1IDExIDVaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiPjwvcGF0aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cInNlYXJjaFZhbHVlXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBwcy0xNCBpbnZvaWNlc2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIHBheWVyLCBuYXJyYXRpb24sIFVUUi4uLlwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIChjaGFuZ2UpPVwic2VhcmNoRmllbGQoKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gRmlsdGVyIGRyb3Bkb3duIOKAlCBvcGVucyBhIHNlbGYtY29udGFpbmVkIHBvcG92ZXIgYW5jaG9yZWQgdG9cbiAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYnV0dG9uIChsaWItZmlsdGVycyBjYW4ndCBob3N0IHRoZSBkYXRlLXJhbmdlIGlucHV0cykuIC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmUgdHhuLWZpbHRlci13cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1vdXRsaW5lIGJ0biBhbGlnbi1pdGVtcy1lbmQgdGV4dC1ub3dyYXAgaW52aGVhZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRmlsdGVyKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgNWgxOE02IDEyaDEyTTEwIDE5aDRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtMlwiPkZpbHRlcjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImFjdGl2ZUZpbHRlckNvdW50XCIgY2xhc3M9XCJjb3VudGNoaXAgbXMtMVwiPnt7IGFjdGl2ZUZpbHRlckNvdW50IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmlsdGVyT3BlblwiIGNsYXNzPVwidHhuLWZpbHRlci1wb3AgY2FyZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0eG4tZmlsdGVyLXRpdGxlXCI+RmlsdGVyIE9wdGlvbnM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHNtYWxsIGZ3LXNlbWlib2xkXCI+RGF0ZSDigJQgZnJvbTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZGF0ZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJkcmFmdEZyb21EYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBzbWFsbCBmdy1zZW1pYm9sZFwiPkRhdGUg4oCUIHRvPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJkYXRlXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cImRyYWZ0VG9EYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBzbWFsbCBmdy1zZW1pYm9sZFwiPlNvdXJjZTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIFsobmdNb2RlbCldPVwiZHJhZnRTb3VyY2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJhbGxcIj5BbGwgc291cmNlczwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImJhbmtcIj5CYW5rIFN0YXRlbWVudDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInZhXCI+VmlydHVhbCBBY2NvdW50PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZ2F0ZXdheVwiPkdhdGV3YXk8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJtYW51YWxcIj5NYW51YWw8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTJcIiAqbmdJZj1cImFjdGl2ZUZpbHRlckNvdW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxpbmsgYnRuLXNtIHAtMFwiIChjbGljayk9XCJjbGVhckZpbHRlcnMoKVwiPkNsZWFyIGFsbDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRmlsdGVycyBhcHBseSBvbmx5IG9uIEFwcGx5OyBDYW5jZWwgZGlzY2FyZHMgY2hhbmdlcy4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMiBtdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IGJ0bi1zbSBmbGV4LWZpbGxcIiAoY2xpY2spPVwiY2FuY2VsRmlsdGVycygpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLXNtIGZsZXgtZmlsbFwiIChjbGljayk9XCJhcHBseUZpbHRlcnMoKVwiPkFwcGx5PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gRGVsZXRlIHNlbGVjdGVkIChub24tcmVjb25jaWxlZCkgcm93cy4gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJzZWxlY3RlZENvdW50ID4gMCAmJiAoZ3MudXNlckFjY2VzcyB8IGFzeW5jKT8uR2xvYmFsX0JpbGxpbmdfaXNFZGl0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1vdXRsaW5lIGJ0biBhbGlnbi1pdGVtcy1lbmQgdGV4dC1ub3dyYXAgaW52aGVhZGVyIG1zLTIgZGVsZXRlLWFsbC1idG5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZVNlbGVjdGVkKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMyA2aDE4TTggNlY0YTEgMSAwIDAgMSAxLTFoNmExIDEgMCAwIDEgMSAxdjJtMiAwdjE0YTIgMiAwIDAgMS0yIDJIN2EyIDIgMCAwIDEtMi0yVjZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjRDkyRDIwXCIgc3Ryb2tlLXdpZHRoPVwiMS42XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0yXCI+RGVsZXRlIHNlbGVjdGVkICh7eyBzZWxlY3RlZENvdW50IH19KTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gRGVsZXRlIGFsbCAobm9uLXJlY29uY2lsZWQpIGZvciB0aGUgY3VycmVudCBzdGF0ZW1lbnQgYmF0Y2guXG4gICAgICAgICAgICAgICAgICAgICAgICAgUmVjb25jaWxlZCByb3dzIGFyZSBhbHdheXMgcHJlc2VydmVkIGJ5IHRoZSBiYWNrZW5kLiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFub0RhdGEgJiYgKGdzLnVzZXJBY2Nlc3MgfCBhc3luYyk/Lkdsb2JhbF9CaWxsaW5nX2lzRWRpdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tb3V0bGluZSBidG4gYWxpZ24taXRlbXMtZW5kIHRleHQtbm93cmFwIGludmhlYWRlciBtcy0yIGRlbGV0ZS1hbGwtYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVBbGwoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zIDZoMThNOCA2VjRhMSAxIDAgMCAxIDEtMWg2YTEgMSAwIDAgMSAxIDF2Mm0yIDB2MTRhMiAyIDAgMCAxLTIgMkg3YTIgMiAwIDAgMS0yLTJWNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNEOTJEMjBcIiBzdHJva2Utd2lkdGg9XCIxLjZcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTJcIj5EZWxldGUgYWxsPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIExvYWRpbmcgc2hpbW1lciAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvYWRpbmdcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbG9hZGVyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGltbWVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgdGl0bGVcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSBsaW5rXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBFbXB0eSAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2FkaW5nICYmIG5vRGF0YVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctMTIgbWItM1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImltZy1zcmMgdy0yNVwiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YS5zdmdcIiBhbHQ9XCJcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBUcmFuc2FjdGlvbnMgdGFibGUgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCIhbG9hZGluZyAmJiAhbm9EYXRhXCIgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCI+XG4gICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBhY2NvcmRpb24gdGFibGUgYm90dG9tLWJvcmRlciBpbnZvaXZldGFibGUgdGV4dC1ub3dyYXBcIj5cbiAgICAgICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cIihncy51c2VyQWNjZXNzIHwgYXN5bmMpPy5HbG9iYWxfQmlsbGluZ19pc0VkaXRcIiBzdHlsZT1cIndpZHRoOjQwcHg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cImFsbFNlbGVjdGVkXCIgKGNoYW5nZSk9XCJ0b2dnbGVTZWxlY3RBbGwoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJzZWxlY3RhYmxlUm93cy5sZW5ndGggPT09IDBcIiBuZ2JUb29sdGlwPVwiU2VsZWN0IGFsbCAoZXhjbHVkZXMgcmVjb25jaWxlZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+RGF0ZTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+U291cmNlPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5QYXllciAoZnJvbSBuYXJyYXRpb24pPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5SZWZlcmVuY2UgLyBVVFI8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkFtb3VudDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+QnJhbmQgTmFtZTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+SW52b2ljZTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+UmVzdWx0PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5TdGF0dXM8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkFjdGlvbjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgdCBvZiByb3dzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCIoZ3MudXNlckFjY2VzcyB8IGFzeW5jKT8uR2xvYmFsX0JpbGxpbmdfaXNFZGl0XCIgc3R5bGU9XCJ3aWR0aDo0MHB4O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUmVjb25jaWxlZCByb3dzIGNhbid0IGJlIHNlbGVjdGVkLiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgKm5nSWY9XCJpc1NlbGVjdGFibGUodClcIiBbY2hlY2tlZF09XCJpc1NlbGVjdGVkKHQpXCIgKGNoYW5nZSk9XCJ0b2dnbGVTZWxlY3QodClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc1NlbGVjdGFibGUodClcIiBjbGFzcz1cImxvY2staWNcIiBuZ2JUb29sdGlwPVwiUmVjb25jaWxlZCDigJQgY2Fubm90IGJlIGRlbGV0ZWRcIj7wn5SSPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGVcIj57eyB0LnZhbHVlRGF0ZSB8IGRhdGU6ICdkZCBNTU0sIHl5eXknIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3JjY2hpcFwiIFtjbGFzcy5zcmNjaGlwLXZhXT1cInQuc291cmNlID09PSAndmEnXCI+e3sgc291cmNlTGFiZWwodC5zb3VyY2UpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGUgcGF5ZXItY2VsbFwiPnt7IHQucGF5ZXIgfHwgJ+KAlCcgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmFycmF0aW9uLXN1YlwiIFt0aXRsZV09XCJ0Lm5hcnJhdGlvblwiPnt7IHQubmFycmF0aW9uIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibW9ub1wiPnt7IHQucmVmTm8gfHwgJ+KAlCcgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10aXRsZVwiPjxzdHJvbmc+4oK5e3sgdC5hbW91bnQgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19PC9zdHJvbmc+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10aXRsZVwiPnt7IHQuaWRlbnRpZmllZENsaWVudE5hbWUgfHwgJ+KAlCcgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTXVsdGlwbGUgaW52b2ljZXMgc2V0dGxlZCBieSBvbmUgcGF5bWVudDogbGluayBlYWNoIGluZGl2aWR1YWxseS4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0LmFwcGxpZWRJbnZvaWNlcz8ubGVuZ3RoID4gMTsgZWxzZSBzaW5nbGVJbnZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGEgb2YgdC5hcHBsaWVkSW52b2ljZXM7IGxldCBsYXN0ID0gbGFzdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiaW52b2ljZS1saW5rXCIgKGNsaWNrKT1cIm9wZW5JbnZvaWNlUHJldmlld0J5SWQoYS5pbnZvaWNlSWQsIGEuaW52b2ljZSk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPnt7IGEuaW52b2ljZSB9fTwvYT48c3BhbiAqbmdJZj1cIiFsYXN0XCI+LCA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc2luZ2xlSW52PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgKm5nSWY9XCJ0Lmludm9pY2UgJiYgdC5pbnZvaWNlSWRcIiBjbGFzcz1cImludm9pY2UtbGlua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5JbnZvaWNlUHJldmlldyh0KTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+e3sgdC5pbnZvaWNlIH19PC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ0Lmludm9pY2UgJiYgIXQuaW52b2ljZUlkXCI+e3sgdC5pbnZvaWNlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhdC5pbnZvaWNlXCI+4oCUPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVzdWx0LW5vdGVcIiBbdGl0bGVdPVwidC5yZXN1bHROb3RlXCI+e3sgdC5yZXN1bHROb3RlIHx8ICfigJQnIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidC5jb250YWN0ZWRcIiBjbGFzcz1cInBpbGwgcGlsbC1hbWJlclwiPlJlYWNoaW5nIG91dDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiF0LmNvbnRhY3RlZFwiIFtuZ0NsYXNzXT1cInN0YXR1c1BpbGxDbGFzcyh0LnN0YXR1cylcIj57eyBzdGF0dXNMYWJlbCh0LnN0YXR1cykgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJ0LnN0YXR1cyA9PT0gJ25lZWRzX3JldmlldycgfHwgdC5zdGF0dXMgPT09ICd1bm1hdGNoZWQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cIm9wZW5SZXNvbHZlKHQpXCI+UmVzb2x2ZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUmVjb25jaWxlZCByb3dzOiBFZGl0IHJlLW9wZW5zIHRoZSBSZXNvbHZlICYgcmVjb25jaWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3B1cCBzbyB0aGUgbWF0Y2hlZCBpbnZvaWNlIC8gcmVzb2x1dGlvbiBjYW4gYmUgY2hhbmdlZC4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInQuc3RhdHVzID09PSAncmVjb25jaWxlZCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmVcIiAoY2xpY2spPVwib3BlblJlc29sdmUodClcIj5FZGl0PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEZWxldGU6IHJlY29uY2lsZWQgcm93cyBhcmUgcHJvdGVjdGVkIGFuZCBuZXZlciBkZWxldGFibGUuIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJ0LnN0YXR1cyAhPT0gJ3JlY29uY2lsZWQnICYmIChncy51c2VyQWNjZXNzIHwgYXN5bmMpPy5HbG9iYWxfQmlsbGluZ19pc0VkaXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tc20gYnRuLWljb24gZGVsZXRlLXR4blwiIG5nYlRvb2x0aXA9XCJEZWxldGUgdHJhbnNhY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlVHJhbnNhY3Rpb24odClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgNmgxOE04IDZWNGExIDEgMCAwIDEgMS0xaDZhMSAxIDAgMCAxIDEgMXYybTIgMHYxNGEyIDIgMCAwIDEtMiAySDdhMiAyIDAgMCAxLTItMlY2bTMgNXY2bTQtNnY2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjRDkyRDIwXCIgc3Ryb2tlLXdpZHRoPVwiMS42XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgPGxpYi1wYWdpbmF0aW9uIGNsYXNzPVwidGV4dC1zdGFydFwiIFtpdGVtc1BlclBhZ2VdPVwiaXRlbXNQZXJQYWdlXCIgW2N1cnJlbnRQYWdlXT1cImN1cnJlbnRQYWdlXCJcbiAgICAgICAgICAgICAgICBbdG90YWxJdGVtc109XCJ0b3RhbEl0ZW1zXCIgW3BhZ2luYXRpb25TaXplc109XCJwYWdpbmF0aW9uU2l6ZXNcIiBbcGFnZVNpemVdPVwicGFnZVNpemVcIlxuICAgICAgICAgICAgICAgIChwYWdlQ2hhbmdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCIgKHBhZ2VTaXplQ2hhbmdlKT1cIm9uUGFnZVNpemVDaGFuZ2UoJGV2ZW50KVwiPjwvbGliLXBhZ2luYXRpb24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+Il19
433
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFuay10cmFuc2FjdGlvbnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ28tbWFuYWdlLWJpbGxpbmcvc3JjL2xpYi9jb21wb25lbnRzL2JhbmstdHJhbnNhY3Rpb25zL2JhbmstdHJhbnNhY3Rpb25zLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLW1hbmFnZS1iaWxsaW5nL3NyYy9saWIvY29tcG9uZW50cy9iYW5rLXRyYW5zYWN0aW9ucy9iYW5rLXRyYW5zYWN0aW9ucy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFDaEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFJMUMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDdkYsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDbEcsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sMkVBQTJFLENBQUM7Ozs7Ozs7O0FBR3hILDJFQUEyRTtBQUMzRSw0RUFBNEU7QUFDNUUsNkVBQTZFO0FBQzdFLHlFQUF5RTtBQU16RSxNQUFNLE9BQU8seUJBQXlCO0lBb0QxQjtJQUNBO0lBQ0E7SUFDQTtJQUNEO0lBdkRULDRFQUE0RTtJQUM1RSxLQUFLLEdBQXlCLFFBQVEsQ0FBQztJQUN2QyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ2YsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUNsQixNQUFNLEdBQUcsS0FBSyxDQUFDO0lBRWYsSUFBSSxHQUFVLEVBQUUsQ0FBQztJQUNqQixVQUFVLEdBQUcsQ0FBQyxDQUFDO0lBQ2YsS0FBSyxHQUFHO1FBQ04sVUFBVSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFB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QUFDLEtBQWEsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQzdDLENBQUM7d0dBbmFVLHlCQUF5Qjs0RkFBekIseUJBQXlCLDZEQ25CdEMsc2dyQkFtU007OzRGRGhSTyx5QkFBeUI7a0JBTHJDLFNBQVM7K0JBQ0UsdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE5nYk1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xyXG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcclxuaW1wb3J0IHsgQmlsbGluZ1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9iaWxsaW5nLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBJbnZvaWNlUHJldmlld0NvbXBvbmVudCB9IGZyb20gJy4uL2ludm9pY2UtcHJldmlldy9pbnZvaWNlLXByZXZpZXcuY29tcG9uZW50JztcclxuaW1wb3J0IHsgUmVzb2x2ZVRyYW5zYWN0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9yZXNvbHZlLXRyYW5zYWN0aW9uL3Jlc29sdmUtdHJhbnNhY3Rpb24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgRGVsZXRlQ29uZmlybWF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFuZ28tbWFuYWdlLWJpbGxpbmcvZGVsZXRlLWNvbmZpcm1hdGlvbi9kZWxldGUtY29uZmlybWF0aW9uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1nbG9iYWwnO1xyXG5cclxuLy8gQmFuay1zdGF0ZW1lbnQgcmVjb25jaWxpYXRpb24gdGFiLiBVcGxvYWQgYSBzdGF0ZW1lbnQgZXhwb3J0IChDU1YvWExTWCksXHJcbi8vIHJvd3MgbGFuZCBpbiB0aGUgYGJhbmt0cmFuc2FjdGlvbmAgY29sbGVjdGlvbiBhbmQgYXJlIGJ1Y2tldGVkIGJ5IHN0YXR1czpcclxuLy8gcmVjb25jaWxlZCAvIG5lZWRzX3JldmlldyAvIHVubWF0Y2hlZCAvIGV4Y2x1ZGVkLiBDbGFzc2lmaWNhdGlvbiBydWxlcyBhcmVcclxuLy8gbm90IHdpcmVkIHlldCDigJQgbmV3IHJvd3MgYXJyaXZlIGFzICd1bm1hdGNoZWQnIHVudGlsIHRoYXQgcGFzcyBleGlzdHMuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWJhbmstdHJhbnNhY3Rpb25zJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYmFuay10cmFuc2FjdGlvbnMuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9iYW5rLXRyYW5zYWN0aW9ucy5jb21wb25lbnQuc2NzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIEJhbmtUcmFuc2FjdGlvbnNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgLy8gJ3VwbG9hZCcgc2hvd3MgdGhlIGRyb3B6b25lIChlbXB0eSBjb2xsZWN0aW9uKTsgJ3Jlc3VsdHMnIHRoZSB0YWJsZSB2aWV3LlxyXG4gIHN0YWdlOiAndXBsb2FkJyB8ICdyZXN1bHRzJyA9ICd1cGxvYWQnO1xyXG4gIGxvYWRpbmcgPSB0cnVlO1xyXG4gIHVwbG9hZGluZyA9IGZhbHNlO1xyXG4gIG5vRGF0YSA9IGZhbHNlO1xyXG5cclxuICByb3dzOiBhbnlbXSA9IFtdO1xyXG4gIHRvdGFsSXRlbXMgPSAwO1xyXG4gIGNhcmRzID0ge1xyXG4gICAgcmVjb25jaWxlZDogeyBjb3VudDogMCwgYW1vdW50OiAwIH0sXHJcbiAgICBuZWVkc19yZXZpZXc6IHsgY291bnQ6IDAsIGFtb3VudDogMCB9LFxyXG4gICAgdW5tYXRjaGVkOiB7IGNvdW50OiAwLCBhbW91bnQ6IDAgfSxcclxuICAgIGV4Y2x1ZGVkOiB7IGNvdW50OiAwLCBhbW91bnQ6IDAgfSxcclxuICAgIHRvdGFsOiAwLFxyXG4gIH07XHJcblxyXG4gIC8vIFN0YXR1cyBzZWdtZW50IHRhYnMg4oCUIGlkcyBtYXRjaCB0aGUgYmFja2VuZCBlbnVtLlxyXG4gIHN0YXR1c1RhYnMgPSBbXHJcbiAgICB7IGlkOiAnYWxsJywgbGFiZWw6ICdBbGwnIH0sXHJcbiAgICB7IGlkOiAncmVjb25jaWxlZCcsIGxhYmVsOiAnUmVjb25jaWxlZCcgfSxcclxuICAgIHsgaWQ6ICduZWVkc19yZXZpZXcnLCBsYWJlbDogJ05lZWRzIHJldmlldycgfSxcclxuICAgIHsgaWQ6ICd1bm1hdGNoZWQnLCBsYWJlbDogJ1VubWF0Y2hlZCcgfSxcclxuICAgIHsgaWQ6ICdleGNsdWRlZCcsIGxhYmVsOiAnRXhjbHVkZWQnIH0sXHJcbiAgXTtcclxuICBhY3RpdmVTdGF0dXMgPSAnYWxsJztcclxuXHJcbiAgLy8gRmlsdGVyIHBvcG92ZXIgc3RhdGUuXHJcbiAgZmlsdGVyT3BlbiA9IGZhbHNlO1xyXG4gIC8vIENvbW1pdHRlZCAoYXBwbGllZCkgZmlsdGVyIHZhbHVlcyDigJQgdGhlc2UgZHJpdmUgdGhlIGxpc3QuXHJcbiAgZnJvbURhdGUgPSAnJztcclxuICB0b0RhdGUgPSAnJztcclxuICBzb3VyY2UgPSAnYWxsJztcclxuICAvLyBEcmFmdCB2YWx1ZXMgYm91bmQgdG8gdGhlIHBvcG92ZXIgaW5wdXRzLiBOb3RoaW5nIGlzIGFwcGxpZWQgdW50aWwgdGhlXHJcbiAgLy8gdXNlciBjbGlja3MgQXBwbHk7IENhbmNlbCBkaXNjYXJkcyB0aGVzZSBiYWNrIHRvIHRoZSBjb21taXR0ZWQgdmFsdWVzLlxyXG4gIGRyYWZ0RnJvbURhdGUgPSAnJztcclxuICBkcmFmdFRvRGF0ZSA9ICcnO1xyXG4gIGRyYWZ0U291cmNlID0gJ2FsbCc7XHJcbiAgc2VhcmNoVmFsdWUgPSAnJztcclxuXHJcbiAgLy8gUGFnaW5hdGlvbiDigJQgbWlycm9ycyB0aGUgQWxsIEludm9pY2VzIHRhYmxlLlxyXG4gIGN1cnJlbnRQYWdlID0gMTtcclxuICBwYWdlU2l6ZSA9IDEwO1xyXG4gIGl0ZW1zUGVyUGFnZSA9IDEwO1xyXG4gIHBhZ2luYXRpb25TaXplcyA9IFsxMCwgMjAsIDMwXTtcclxuXHJcbiAgLy8gTXVsdGktc2VsZWN0IGZvciBidWxrIGRlbGV0ZS4gUmVjb25jaWxlZCByb3dzIGFyZSBuZXZlciBzZWxlY3RhYmxlLlxyXG4gIHNlbGVjdGVkSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgYmlsbGluZ1NlcnZpY2U6IEJpbGxpbmdTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdDogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTmdiTW9kYWwsXHJcbiAgICBwdWJsaWMgZ3M6IEdsb2JhbFN0YXRlU2VydmljZSxcclxuICApIHt9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2FkTGlzdCh0cnVlKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICAvLyBmaXJzdExvYWQgZGVjaWRlcyB0aGUgc3RhZ2U6IGFuIGVtcHR5LCB1bmZpbHRlcmVkIGNvbGxlY3Rpb24gbWVhbnMgdGhlXHJcbiAgLy8gdXNlciBoYXMgbmV2ZXIgdXBsb2FkZWQg4oCUIHNob3cgdGhlIGRyb3B6b25lIGluc3RlYWQgb2YgYW4gZW1wdHkgdGFibGUuXHJcbiAgbG9hZExpc3QoZmlyc3RMb2FkID0gZmFsc2UpIHtcclxuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICBjb25zdCBmaWx0ZXJzID0ge1xyXG4gICAgICBzdGF0dXM6IHRoaXMuYWN0aXZlU3RhdHVzLFxyXG4gICAgICBmcm9tOiB0aGlzLmZyb21EYXRlLFxyXG4gICAgICB0bzogdGhpcy50b0RhdGUsXHJcbiAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UsXHJcbiAgICAgIHNlYXJjaFZhbHVlOiB0aGlzLnNlYXJjaFZhbHVlLFxyXG4gICAgICBsaW1pdDogdGhpcy5wYWdlU2l6ZSxcclxuICAgICAgb2Zmc2V0OiB0aGlzLmN1cnJlbnRQYWdlLFxyXG4gICAgfTtcclxuICAgIHRoaXMuYmlsbGluZ1NlcnZpY2UuYmFua1RyYW5zYWN0aW9uTGlzdChmaWx0ZXJzKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlcykgPT4ge1xyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMucm93cyA9IHJlcz8uZGF0YT8uZGF0YSB8fCBbXTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkSWRzLmNsZWFyKCk7XHJcbiAgICAgICAgdGhpcy50b3RhbEl0ZW1zID0gcmVzPy5kYXRhPy5jb3VudCB8fCAwO1xyXG4gICAgICAgIGlmIChyZXM/LmRhdGE/LmNhcmRzKSB7XHJcbiAgICAgICAgICB0aGlzLmNhcmRzID0gcmVzLmRhdGEuY2FyZHM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubm9EYXRhID0gdGhpcy5yb3dzLmxlbmd0aCA9PT0gMDtcclxuICAgICAgICBpZiAoZmlyc3RMb2FkKSB7XHJcbiAgICAgICAgICB0aGlzLnN0YWdlID0gdGhpcy5jYXJkcy50b3RhbCA+IDAgPyAncmVzdWx0cycgOiAndXBsb2FkJztcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5yb3dzID0gW107XHJcbiAgICAgICAgdGhpcy50b3RhbEl0ZW1zID0gMDtcclxuICAgICAgICB0aGlzLm5vRGF0YSA9IHRydWU7XHJcbiAgICAgICAgaWYgKGZpcnN0TG9hZCkge1xyXG4gICAgICAgICAgdGhpcy5zdGFnZSA9ICd1cGxvYWQnO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25GaWxlU2VsZWN0ZWQoZXZlbnQ6IGFueSkge1xyXG4gICAgY29uc3QgZmlsZTogRmlsZSA9IGV2ZW50Py50YXJnZXQ/LmZpbGVzPy5bMF07XHJcbiAgICBpZiAoIWZpbGUpIHJldHVybjtcclxuICAgIGNvbnN0IG9rID0gL1xcLih4bHN4fHhsc3xjc3YpJC9pLnRlc3QoZmlsZS5uYW1lKTtcclxuICAgIGlmICghb2spIHtcclxuICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdVcGxvYWQgdGhlIGJhbmsgc3RhdGVtZW50IGFzIEV4Y2VsICgueGxzeCwgLnhscykgb3IgQ1NWJyk7XHJcbiAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9ICcnO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnVwbG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLmJpbGxpbmdTZXJ2aWNlLnVwbG9hZEJhbmtTdGF0ZW1lbnQoZmlsZSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcclxuICAgICAgICB0aGlzLnVwbG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IGQgPSByZXM/LmRhdGEgfHwge307XHJcbiAgICAgICAgY29uc3QgcyA9IGQuc3VtbWFyeSB8fCB7fTtcclxuICAgICAgICBsZXQgbXNnID0gYFwiJHtmaWxlLm5hbWV9XCIg4oCUICR7ZC5pbnNlcnRlZCB8fCAwfSB0cmFuc2FjdGlvbnMgYWRkZWRgO1xyXG4gICAgICAgIGlmIChkLmluc2VydGVkKSB7XHJcbiAgICAgICAgICBtc2cgKz0gYDogJHtzLnJlY29uY2lsZWQgfHwgMH0gcmVjb25jaWxlZCwgJHtzLm5lZWRzX3JldmlldyB8fCAwfSBuZWVkIHJldmlldywgYCArXHJcbiAgICAgICAgICAgICAgICAgYCR7cy51bm1hdGNoZWQgfHwgMH0gdW5tYXRjaGVkLCAke3MuZXhjbHVkZWQgfHwgMH0gZXhjbHVkZWRgO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZC5kdXBsaWNhdGVzKSBtc2cgKz0gYCAoJHtkLmR1cGxpY2F0ZXN9IGR1cGxpY2F0ZXMgc2tpcHBlZClgO1xyXG4gICAgICAgIGlmIChkLmNsb3NlZEludm9pY2VzPy5sZW5ndGgpIG1zZyArPSBgIMK3ICR7ZC5jbG9zZWRJbnZvaWNlcy5sZW5ndGh9IGludm9pY2UocykgY2xvc2VkIGFzIHBhaWRgO1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0UHJpbWFyeVRvYXN0KG1zZyk7XHJcbiAgICAgICAgLy8gQXV0by1yZWNvbmNpbGlhdGlvbiBtYXkgaGF2ZSBjbG9zZWQgaW52b2ljZXMg4oCUIHJlZmV0Y2ggb3B0aW9ucyBuZXh0IHRpbWUuXHJcbiAgICAgICAgdGhpcy5yZXNvbHZlT3B0aW9uc0NhY2hlID0gbnVsbDtcclxuICAgICAgICB0aGlzLnN0YWdlID0gJ3Jlc3VsdHMnO1xyXG4gICAgICAgIHRoaXMuYWN0aXZlU3RhdHVzID0gJ2FsbCc7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcbiAgICAgICAgdGhpcy5sb2FkTGlzdCgpO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIHRoaXMudXBsb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBwYXJzZSB0aGUgc3RhdGVtZW50IGZpbGUnKTtcclxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG4gICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gJyc7XHJcbiAgfVxyXG5cclxuICBzZXRTdGF0dXMoaWQ6IHN0cmluZykge1xyXG4gICAgdGhpcy5hY3RpdmVTdGF0dXMgPSBpZDtcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG4gICAgdGhpcy5sb2FkTGlzdCgpO1xyXG4gIH1cclxuXHJcbiAgLy8gU3RhdCBjYXJkcyBkb3VibGUgYXMgZmlsdGVyczogY2xpY2tpbmcgc2VsZWN0cyB0aGF0IHN0YXR1cywgY2xpY2tpbmcgdGhlXHJcbiAgLy8gYWxyZWFkeS1zZWxlY3RlZCBjYXJkIGNsZWFycyBiYWNrIHRvIEFsbC5cclxuICB0b2dnbGVDYXJkRmlsdGVyKGlkOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc2V0U3RhdHVzKHRoaXMuYWN0aXZlU3RhdHVzID09PSBpZCA/ICdhbGwnIDogaWQpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlRmlsdGVyKCkge1xyXG4gICAgLy8gT3BlbmluZzogc2VlZCB0aGUgZHJhZnQgaW5wdXRzIGZyb20gdGhlIGN1cnJlbnRseS1hcHBsaWVkIGZpbHRlcnMgc28gdGhlXHJcbiAgICAvLyBwb3BvdmVyIHJlZmxlY3RzIHdoYXQncyBhY3RpdmUuIENsb3NpbmcgdmlhIHRoZSBidXR0b24gPSBjYW5jZWwuXHJcbiAgICBpZiAoIXRoaXMuZmlsdGVyT3Blbikge1xyXG4gICAgICB0aGlzLmRyYWZ0RnJvbURhdGUgPSB0aGlzLmZyb21EYXRlO1xyXG4gICAgICB0aGlzLmRyYWZ0VG9EYXRlID0gdGhpcy50b0RhdGU7XHJcbiAgICAgIHRoaXMuZHJhZnRTb3VyY2UgPSB0aGlzLnNvdXJjZTtcclxuICAgICAgdGhpcy5maWx0ZXJPcGVuID0gdHJ1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyT3BlbiA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gQ29tbWl0IHRoZSBkcmFmdCBzZWxlY3Rpb25zIGFuZCByZWxvYWQuIE9ubHkgbm93IGRvZXMgdGhlIGZpbHRlciB0YWtlXHJcbiAgLy8gZWZmZWN0OyB0aGUgcG9wb3ZlciBjbG9zZXMuXHJcbiAgYXBwbHlGaWx0ZXJzKCkge1xyXG4gICAgdGhpcy5mcm9tRGF0ZSA9IHRoaXMuZHJhZnRGcm9tRGF0ZTtcclxuICAgIHRoaXMudG9EYXRlID0gdGhpcy5kcmFmdFRvRGF0ZTtcclxuICAgIHRoaXMuc291cmNlID0gdGhpcy5kcmFmdFNvdXJjZTtcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG4gICAgdGhpcy5maWx0ZXJPcGVuID0gZmFsc2U7XHJcbiAgICB0aGlzLmxvYWRMaXN0KCk7XHJcbiAgfVxyXG5cclxuICAvLyBEaXNjYXJkIGRyYWZ0IGVkaXRzIGFuZCBjbG9zZSB3aXRob3V0IGFwcGx5aW5nLlxyXG4gIGNhbmNlbEZpbHRlcnMoKSB7XHJcbiAgICB0aGlzLmRyYWZ0RnJvbURhdGUgPSB0aGlzLmZyb21EYXRlO1xyXG4gICAgdGhpcy5kcmFmdFRvRGF0ZSA9IHRoaXMudG9EYXRlO1xyXG4gICAgdGhpcy5kcmFmdFNvdXJjZSA9IHRoaXMuc291cmNlO1xyXG4gICAgdGhpcy5maWx0ZXJPcGVuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBjbGVhckZpbHRlcnMoKSB7XHJcbiAgICB0aGlzLmZyb21EYXRlID0gJyc7XHJcbiAgICB0aGlzLnRvRGF0ZSA9ICcnO1xyXG4gICAgdGhpcy5zb3VyY2UgPSAnYWxsJztcclxuICAgIHRoaXMuZHJhZnRGcm9tRGF0ZSA9ICcnO1xyXG4gICAgdGhpcy5kcmFmdFRvRGF0ZSA9ICcnO1xyXG4gICAgdGhpcy5kcmFmdFNvdXJjZSA9ICdhbGwnO1xyXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcbiAgICB0aGlzLmZpbHRlck9wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMubG9hZExpc3QoKTtcclxuICB9XHJcblxyXG4gIGdldCBhY3RpdmVGaWx0ZXJDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuICh0aGlzLmZyb21EYXRlID8gMSA6IDApICsgKHRoaXMudG9EYXRlID8gMSA6IDApICsgKHRoaXMuc291cmNlICE9PSAnYWxsJyA/IDEgOiAwKTtcclxuICB9XHJcblxyXG4gIHNlYXJjaEZpZWxkKCkge1xyXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XHJcbiAgICB0aGlzLmxvYWRMaXN0KCk7XHJcbiAgfVxyXG5cclxuICBvblBhZ2VDaGFuZ2UocGFnZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gcGFnZTtcclxuICAgIHRoaXMubG9hZExpc3QoKTtcclxuICB9XHJcblxyXG4gIG9uUGFnZVNpemVDaGFuZ2Uoc2l6ZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnBhZ2VTaXplID0gc2l6ZTtcclxuICAgIHRoaXMuaXRlbXNQZXJQYWdlID0gc2l6ZTtcclxuICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG4gICAgdGhpcy5sb2FkTGlzdCgpO1xyXG4gIH1cclxuXHJcbiAgLy8gUmVjb25jaWxlZCByb3dzIGNhcnJ5IHRoZSBtYXRjaGVkIGludm9pY2UncyBfaWQg4oCUIG9wZW4gdGhlIHNhbWUgcHJldmlld1xyXG4gIC8vIHBvcHVwIHRoZSBBbGwgSW52b2ljZXMgdGFibGUgdXNlcy5cclxuICBvcGVuSW52b2ljZVByZXZpZXcodDogYW55KSB7XHJcbiAgICB0aGlzLm9wZW5JbnZvaWNlUHJldmlld0J5SWQodD8uaW52b2ljZUlkKTtcclxuICB9XHJcblxyXG4gIC8vIE9wZW4gdGhlIGludm9pY2UgcHJldmlldyBmb3IgYSBzcGVjaWZpYyBpbnZvaWNlIGlkIOKAlCB1c2VkIGJ5IHRoZSBzaW5nbGVcclxuICAvLyBhbmQgbXVsdGktaW52b2ljZSAoYXBwbGllZEludm9pY2VzKSBjZWxscyBhbGlrZS5cclxuICBvcGVuSW52b2ljZVByZXZpZXdCeUlkKGludm9pY2VJZDogc3RyaW5nLCBfaW52b2ljZU5vPzogc3RyaW5nKSB7XHJcbiAgICBpZiAoIWludm9pY2VJZCkgcmV0dXJuO1xyXG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5nZXRJbnZvaWNlQnlJZChpbnZvaWNlSWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCBpbnZvaWNlRGF0YSA9IHJlcz8uZGF0YTtcclxuICAgICAgICBpZiAoIWludm9pY2VEYXRhKSB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0ZhaWxlZCB0byBsb2FkIGludm9pY2UnKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKEludm9pY2VQcmV2aWV3Q29tcG9uZW50LCB7XHJcbiAgICAgICAgICBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ3hsJywgc2Nyb2xsYWJsZTogdHJ1ZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5pbnZvaWNlRGF0YSA9IGludm9pY2VEYXRhO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKCkgPT4gdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdGYWlsZWQgdG8gbG9hZCBpbnZvaWNlJyksXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIFwiUmVzb2x2ZSAmIHJlY29uY2lsZVwiIHBvcHVwIGZvciBuZWVkcy1yZXZpZXcgLyB1bm1hdGNoZWQgcm93cy4gVGhlXHJcbiAgLy8gY3VzdG9tZXIvaW52b2ljZSBvcHRpb25zIGFyZSBjYWNoZWQgZm9yIHRoZSBwYWdlIHNlc3Npb24g4oCUIGZldGNoZWQgb25jZSxcclxuICAvLyBpbnZhbGlkYXRlZCBvbmx5IHdoZW4gYW4gYWN0aW9uIGNoYW5nZXMgaW52b2ljZSBzdGF0ZSAocmVjb25jaWxlKSBvciBhXHJcbiAgLy8gbmV3IHN0YXRlbWVudCBpcyB1cGxvYWRlZC5cclxuICBwcml2YXRlIHJlc29sdmVPcHRpb25zQ2FjaGU6IGFueVtdIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIG9wZW5SZXNvbHZlKHQ6IGFueSkge1xyXG4gICAgaWYgKHRoaXMucmVzb2x2ZU9wdGlvbnNDYWNoZSkge1xyXG4gICAgICB0aGlzLnNob3dSZXNvbHZlTW9kYWwodCwgdGhpcy5yZXNvbHZlT3B0aW9uc0NhY2hlKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5iaWxsaW5nU2VydmljZS5iYW5rUmVzb2x2ZU9wdGlvbnMoKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlcykgPT4ge1xyXG4gICAgICAgIHRoaXMucmVzb2x2ZU9wdGlvbnNDYWNoZSA9IHJlcz8uZGF0YSB8fCBbXTtcclxuICAgICAgICB0aGlzLnNob3dSZXNvbHZlTW9kYWwodCwgdGhpcy5yZXNvbHZlT3B0aW9uc0NhY2hlISk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoKSA9PiB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ0ZhaWxlZCB0byBsb2FkIGN1c3RvbWVycyBhbmQgaW52b2ljZXMnKSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzaG93UmVzb2x2ZU1vZGFsKHQ6IGFueSwgb3B0aW9uczogYW55W10pIHtcclxuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihSZXNvbHZlVHJhbnNhY3Rpb25Db21wb25lbnQsIHtcclxuICAgICAgY2VudGVyZWQ6IHRydWUsIHNpemU6ICdtZCcsIHNjcm9sbGFibGU6IHRydWUsXHJcbiAgICB9KTtcclxuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnR4biA9IHQ7XHJcbiAgICBtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5vcHRpb25zID0gb3B0aW9ucztcclxuICAgIG1vZGFsUmVmLnJlc3VsdC50aGVuKChtc2c6IGFueSkgPT4ge1xyXG4gICAgICBpZiAobXNnKSB7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRQcmltYXJ5VG9hc3QoU3RyaW5nKG1zZykpO1xyXG4gICAgICAgIC8vIEEgcmVzb2x2ZSBtYXkgaGF2ZSBjbG9zZWQvcGFydGlhbGx5LXBhaWQgYW4gaW52b2ljZSDigJQgcmVmZXRjaCBuZXh0IHRpbWUuXHJcbiAgICAgICAgdGhpcy5yZXNvbHZlT3B0aW9uc0NhY2hlID0gbnVsbDtcclxuICAgICAgICB0aGlzLmxvYWRMaXN0KCk7XHJcbiAgICAgIH1cclxuICAgIH0pLmNhdGNoKCgpID0+IHt9KTtcclxuICB9XHJcblxyXG4gIC8vID09PT09IFNlbGVjdGlvbiAoYnVsayBkZWxldGUpID09PT09XHJcbiAgLy8gQSByb3cgaXMgc2VsZWN0YWJsZSBvbmx5IGlmIGl0IGlzIG5vdCByZWNvbmNpbGVkLlxyXG4gIGlzU2VsZWN0YWJsZSh0OiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhIXQgJiYgdC5zdGF0dXMgIT09ICdyZWNvbmNpbGVkJztcclxuICB9XHJcblxyXG4gIGlzU2VsZWN0ZWQodDogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISF0Py5faWQgJiYgdGhpcy5zZWxlY3RlZElkcy5oYXModC5faWQpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU2VsZWN0KHQ6IGFueSkge1xyXG4gICAgaWYgKCF0aGlzLmlzU2VsZWN0YWJsZSh0KSB8fCAhdD8uX2lkKSB7IHJldHVybjsgfVxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJZHMuaGFzKHQuX2lkKSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkSWRzLmRlbGV0ZSh0Ll9pZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkSWRzLmFkZCh0Ll9pZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBSb3dzIG9uIHRoZSBjdXJyZW50IHBhZ2UgdGhhdCBjYW4gYmUgc2VsZWN0ZWQgKGV4Y2x1ZGVzIHJlY29uY2lsZWQpLlxyXG4gIGdldCBzZWxlY3RhYmxlUm93cygpOiBhbnlbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5yb3dzLmZpbHRlcigocikgPT4gdGhpcy5pc1NlbGVjdGFibGUocikpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGFsbFNlbGVjdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qgc2VsID0gdGhpcy5zZWxlY3RhYmxlUm93cztcclxuICAgIHJldHVybiBzZWwubGVuZ3RoID4gMCAmJiBzZWwuZXZlcnkoKHIpID0+IHRoaXMuc2VsZWN0ZWRJZHMuaGFzKHIuX2lkKSk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVTZWxlY3RBbGwoZXZlbnQ6IGFueSkge1xyXG4gICAgY29uc3QgY2hlY2tlZCA9IGV2ZW50Py50YXJnZXQ/LmNoZWNrZWQ7XHJcbiAgICBpZiAoY2hlY2tlZCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGFibGVSb3dzLmZvckVhY2goKHIpID0+IHRoaXMuc2VsZWN0ZWRJZHMuYWRkKHIuX2lkKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlbGVjdGFibGVSb3dzLmZvckVhY2goKHIpID0+IHRoaXMuc2VsZWN0ZWRJZHMuZGVsZXRlKHIuX2lkKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgc2VsZWN0ZWRDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJZHMuc2l6ZTtcclxuICB9XHJcblxyXG4gIGRlbGV0ZVNlbGVjdGVkKCkge1xyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkSWRzLnNpemUpIHsgcmV0dXJuOyB9XHJcbiAgICBjb25zdCBpZHMgPSBBcnJheS5mcm9tKHRoaXMuc2VsZWN0ZWRJZHMpO1xyXG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKERlbGV0ZUNvbmZpcm1hdGlvbkNvbXBvbmVudCwgeyBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ21kJyB9KTtcclxuICAgIG1vZGFsUmVmLnJlc3VsdC50aGVuKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzICE9PSAnWWVzJykgeyByZXR1cm47IH1cclxuICAgICAgdGhpcy5iaWxsaW5nU2VydmljZS5kZWxldGVTZWxlY3RlZEJhbmtUcmFuc2FjdGlvbnMoaWRzKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocjogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBkZWxldGVkID0gcj8uZGF0YT8uZGVsZXRlZCA/PyAwO1xyXG4gICAgICAgICAgY29uc3Qgc2tpcHBlZCA9IHI/LmRhdGE/LnNraXBwZWQgPz8gMDtcclxuICAgICAgICAgIGxldCBtc2cgPSBgJHtkZWxldGVkfSB0cmFuc2FjdGlvbihzKSBkZWxldGVkYDtcclxuICAgICAgICAgIGlmIChza2lwcGVkKSB7IG1zZyArPSBgIMK3ICR7c2tpcHBlZH0gcmVjb25jaWxlZCBrZXB0YDsgfVxyXG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRQcmltYXJ5VG9hc3QobXNnKTtcclxuICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG4gICAgICAgICAgdGhpcy5sb2FkTGlzdCgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChlcnI/LmVycm9yPy5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gZGVsZXRlIHRyYW5zYWN0aW9ucycpLFxyXG4gICAgICB9KTtcclxuICAgIH0pLmNhdGNoKCgpID0+IHt9KTtcclxuICB9XHJcblxyXG4gIC8vID09PT09IERlbGV0ZSA9PT09PVxyXG4gIC8vIERlbGV0ZSBhIHNpbmdsZSAobm9uLXJlY29uY2lsZWQpIHRyYW5zYWN0aW9uIGFmdGVyIGNvbmZpcm1hdGlvbi4gUmVjb25jaWxlZFxyXG4gIC8vIHJvd3MgbmV2ZXIgc2hvdyB0aGUgZGVsZXRlIGJ1dHRvbiwgYW5kIHRoZSBiYWNrZW5kIHJlamVjdHMgdGhlbSBhbnl3YXkuXHJcbiAgZGVsZXRlVHJhbnNhY3Rpb24odDogYW55KSB7XHJcbiAgICBpZiAoIXQ/Ll9pZCB8fCB0LnN0YXR1cyA9PT0gJ3JlY29uY2lsZWQnKSB7IHJldHVybjsgfVxyXG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKERlbGV0ZUNvbmZpcm1hdGlvbkNvbXBvbmVudCwgeyBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ21kJyB9KTtcclxuICAgIG1vZGFsUmVmLnJlc3VsdC50aGVuKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzICE9PSAnWWVzJykgeyByZXR1cm47IH1cclxuICAgICAgdGhpcy5iaWxsaW5nU2VydmljZS5kZWxldGVCYW5rVHJhbnNhY3Rpb24odC5faWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMudG9hc3QuZ2V0UHJpbWFyeVRvYXN0KCdUcmFuc2FjdGlvbiBkZWxldGVkJyk7XHJcbiAgICAgICAgICB0aGlzLmxvYWRMaXN0KCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycikgPT4gdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGVycj8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBkZWxldGUgdHJhbnNhY3Rpb24nKSxcclxuICAgICAgfSk7XHJcbiAgICB9KS5jYXRjaCgoKSA9PiB7fSk7XHJcbiAgfVxyXG5cclxuICAvLyBEZWxldGUgYWxsIG5vbi1yZWNvbmNpbGVkIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBjdXJyZW50IHN0YXRlbWVudCBiYXRjaFxyXG4gIC8vIChieSBmaWxlTmFtZSkuIFJlY29uY2lsZWQgcm93cyBhcmUgcHJlc2VydmVkIGJ5IHRoZSBiYWNrZW5kLlxyXG4gIGRlbGV0ZUFsbCgpIHtcclxuICAgIGNvbnN0IGZpbGVOYW1lID0gdGhpcy5yb3dzPy5bMF0/LmZpbGVOYW1lO1xyXG4gICAgaWYgKCFmaWxlTmFtZSkge1xyXG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ05vIHN0YXRlbWVudCBmaWxlIGZvdW5kIGZvciB0aGVzZSB0cmFuc2FjdGlvbnMnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKERlbGV0ZUNvbmZpcm1hdGlvbkNvbXBvbmVudCwgeyBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ21kJyB9KTtcclxuICAgIG1vZGFsUmVmLnJlc3VsdC50aGVuKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzICE9PSAnWWVzJykgeyByZXR1cm47IH1cclxuICAgICAgdGhpcy5iaWxsaW5nU2VydmljZS5kZWxldGVBbGxCYW5rVHJhbnNhY3Rpb25zKGZpbGVOYW1lKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocjogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBkZWxldGVkID0gcj8uZGF0YT8uZGVsZXRlZCA/PyAwO1xyXG4gICAgICAgICAgY29uc3Qgc2tpcHBlZCA9IHI/LmRhdGE/LnNraXBwZWQgPz8gMDtcclxuICAgICAgICAgIGxldCBtc2cgPSBgJHtkZWxldGVkfSB0cmFuc2FjdGlvbihzKSBkZWxldGVkYDtcclxuICAgICAgICAgIGlmIChza2lwcGVkKSB7IG1zZyArPSBgIMK3ICR7c2tpcHBlZH0gcmVjb25jaWxlZCBrZXB0YDsgfVxyXG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRQcmltYXJ5VG9hc3QobXNnKTtcclxuICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSAxO1xyXG4gICAgICAgICAgdGhpcy5sb2FkTGlzdCgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdChlcnI/LmVycm9yPy5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gZGVsZXRlIHRyYW5zYWN0aW9ucycpLFxyXG4gICAgICB9KTtcclxuICAgIH0pLmNhdGNoKCgpID0+IHt9KTtcclxuICB9XHJcblxyXG4gIC8vID09PT09IERpc3BsYXkgaGVscGVycyA9PT09PVxyXG4gIHN0YXR1c0xhYmVsKHM6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBtYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XHJcbiAgICAgIHJlY29uY2lsZWQ6ICdSZWNvbmNpbGVkJywgbmVlZHNfcmV2aWV3OiAnTmVlZHMgcmV2aWV3JyxcclxuICAgICAgdW5tYXRjaGVkOiAnVW5tYXRjaGVkJywgZXhjbHVkZWQ6ICdFeGNsdWRlZCcsXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG1hcFtzXSB8fCBzO1xyXG4gIH1cclxuXHJcbiAgc3RhdHVzUGlsbENsYXNzKHM6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBtYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XHJcbiAgICAgIHJlY29uY2lsZWQ6ICdwaWxsIHBpbGwtZ3JlZW4nLCBuZWVkc19yZXZpZXc6ICdwaWxsIHBpbGwtYW1iZXInLFxyXG4gICAgICB1bm1hdGNoZWQ6ICdwaWxsIHBpbGwtcmVkJywgZXhjbHVkZWQ6ICdwaWxsIHBpbGwtZ3JheScsXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG1hcFtzXSB8fCAncGlsbCBwaWxsLWdyYXknO1xyXG4gIH1cclxuXHJcbiAgc291cmNlTGFiZWwoczogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgYmFuazogJ0JhbmsgU3RhdGVtZW50JywgdmE6ICdWaXJ0dWFsIEFjY291bnQnLCBnYXRld2F5OiAnR2F0ZXdheScsIG1hbnVhbDogJ01hbnVhbCcgfTtcclxuICAgIHJldHVybiBtYXBbc10gfHwgcztcclxuICB9XHJcblxyXG4gIGNvdW50T2YoaWQ6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBpZiAoaWQgPT09ICdhbGwnKSByZXR1cm4gdGhpcy5jYXJkcy50b3RhbDtcclxuICAgIHJldHVybiAodGhpcy5jYXJkcyBhcyBhbnkpW2lkXT8uY291bnQgfHwgMDtcclxuICB9XHJcbn0iLCI8ZGl2PlxyXG4gICAgPCEtLSA9PT09PT09PT09PT0gVXBsb2FkIHN0YWdlIChubyBzdGF0ZW1lbnRzIHlldCkgPT09PT09PT09PT09IC0tPlxyXG4gICAgPGRpdiAqbmdJZj1cInN0YWdlID09PSAndXBsb2FkJyAmJiAhbG9hZGluZ1wiIGNsYXNzPVwicHgtNCBwYi00XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJpbGxpbmdoZWFkZXIgbXMtMSBtdC02XCI+QmFuayBTdGF0ZW1lbnQgUmVjb25jaWxpYXRpb248L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbCBtcy0xIG10LTFcIj5VcGxvYWQgYSBiYW5rIHN0YXRlbWVudCDigJQgdHJhbnNhY3Rpb25zIGFyZSBzdG9yZWQgYW5kIHNwbGl0IGludG9cclxuICAgICAgICAgICAgUmVjb25jaWxlZCwgTmVlZHMgcmV2aWV3LCBVbm1hdGNoZWQgYW5kIEV4Y2x1ZGVkLjwvZGl2PlxyXG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImRyb3B6b25lIG10LTRcIiBmb3I9XCJzdG10LWZpbGVcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR6LWljXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyIDIxVjlNOCAxM2w0LTQgNCA0TTUgNWgxNFwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkei10aXRsZSBtdC0zXCI+VXBsb2FkIGJhbmsgc3RhdGVtZW50PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsIG10LTFcIj5EcmFnICZhbXA7IGRyb3Agb3IgY2xpY2sgdG8gYnJvd3NlIMK3IDxzdHJvbmc+RXhjZWwgKC54bHN4LCAueGxzKSBvciBDU1Y8L3N0cm9uZz48L2Rpdj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLXNtIG10LTNcIiBbZGlzYWJsZWRdPVwidXBsb2FkaW5nXCJcclxuICAgICAgICAgICAgICAgIG9uY2xpY2s9XCJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RtdC1maWxlJykuY2xpY2soKTsgZXZlbnQucHJldmVudERlZmF1bHQoKTtcIj5cclxuICAgICAgICAgICAgICAgIHt7IHVwbG9hZGluZyA/ICdQYXJzaW5n4oCmJyA6ICdVcGxvYWQgJiBwYXJzZScgfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8aW5wdXQgaWQ9XCJzdG10LWZpbGVcIiB0eXBlPVwiZmlsZVwiIGFjY2VwdD1cIi54bHN4LC54bHMsLmNzdlwiIGNsYXNzPVwiZC1ub25lXCIgKGNoYW5nZSk9XCJvbkZpbGVTZWxlY3RlZCgkZXZlbnQpXCI+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tID09PT09PT09PT09PSBSZXN1bHRzIHN0YWdlID09PT09PT09PT09PSAtLT5cclxuICAgIDxkaXYgKm5nSWY9XCJzdGFnZSA9PT0gJ3Jlc3VsdHMnXCI+XHJcbiAgICAgICAgPCEtLSBVcGxvYWQtYW5vdGhlciBhY3Rpb24gLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGFsaWduLWl0ZW1zLWNlbnRlciBtdC00IG1lLTRcIj5cclxuICAgICAgICAgICAgPGlucHV0IGlkPVwic3RtdC1maWxlLWFnYWluXCIgdHlwZT1cImZpbGVcIiBhY2NlcHQ9XCIueGxzeCwueGxzLC5jc3ZcIiBjbGFzcz1cImQtbm9uZVwiXHJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uRmlsZVNlbGVjdGVkKCRldmVudClcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tb3V0bGluZSBidG4gYWxpZ24taXRlbXMtZW5kIHRleHQtbm93cmFwIGludmhlYWRlclwiIFtkaXNhYmxlZF09XCJ1cGxvYWRpbmdcIlxyXG4gICAgICAgICAgICAgICAgb25jbGljaz1cImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdG10LWZpbGUtYWdhaW4nKS5jbGljaygpXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE3LjUgMTIuNVYxNS44MzMzQzE3LjUgMTYuMjc1NCAxNy4zMjQ0IDE2LjY5OTMgMTcuMDExOCAxNy4wMTE4QzE2LjY5OTMgMTcuMzI0NCAxNi4yNzU0IDE3LjUgMTUuODMzMyAxNy41SDQuMTY2NjdDMy43MjQ2NCAxNy41IDMuMzAwNzIgMTcuMzI0NCAyLjk4ODE2IDE3LjAxMThDMi42NzU1OSAxNi42OTkzIDIuNSAxNi4yNzU0IDIuNSAxNS44MzMzVjEyLjVNMTQuMTY2NyA2LjY2NjY3TDEwIDIuNU0xMCAyLjVMNS44MzMzMyA2LjY2NjY3TTEwIDIuNVYxMi41XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTJcIj57eyB1cGxvYWRpbmcgPyAnUGFyc2luZ+KApicgOiAnVXBsb2FkIGFub3RoZXIgc3RhdGVtZW50JyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gU3RhdHVzIGNhcmRzIOKAlCBjbGlja2luZyBhIGNhcmQgZmlsdGVycyB0aGUgdGFibGUgKGNsaWNrIGFnYWluIHRvIGNsZWFyKSAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGctMyBtdC0xIG1iLTIgbXgtMlwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52b2ljZS1jYXJkIGNhcmQtY2xpY2thYmxlXCIgW2NsYXNzLmNhcmQtYWN0aXZlXT1cImFjdGl2ZVN0YXR1cyA9PT0gJ3JlY29uY2lsZWQnXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQ2FyZEZpbHRlcigncmVjb25jaWxlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtY2FyZC1sYWJlbFwiPlJlY29uY2lsZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImluZm8taWNcIiBuZ2JUb29sdGlwPVwiUGF5bWVudHMgYXV0b21hdGljYWxseSBtYXRjaGVkIHRvIGFuIGludm9pY2UgKHBheWVyIG5hbWUgKyBhbW91bnQpLCBvciBtYW51YWxseSByZWNvbmNpbGVkLlwiIHBsYWNlbWVudD1cInRvcFwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiOVwiLz48cGF0aCBkPVwiTTEyIDExdjVNMTIgOGguMDFcIi8+PC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtY2FyZC12YWx1ZSB0ZXh0LXN1Y2Nlc3NcIj57eyBjYXJkcy5yZWNvbmNpbGVkLmNvdW50IH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtY2FyZC1zdWJcIj7igrl7eyBjYXJkcy5yZWNvbmNpbGVkLmFtb3VudCB8IG51bWJlcjonMS4yLTInOidlbi1JTicgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtY2FyZCBjYXJkLWNsaWNrYWJsZVwiIFtjbGFzcy5jYXJkLWFjdGl2ZV09XCJhY3RpdmVTdGF0dXMgPT09ICduZWVkc19yZXZpZXcnXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQ2FyZEZpbHRlcignbmVlZHNfcmV2aWV3JylcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52b2ljZS1jYXJkLWxhYmVsXCI+TmVlZHMgcmV2aWV3XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJpbmZvLWljXCIgbmdiVG9vbHRpcD1cIlBheWVyIG1hdGNoZXMgYSBjdXN0b21lciBidXQgdGhlIGFtb3VudCBkb2Vzbid0IG1hdGNoIGFuIGludm9pY2UsIG9yIGEgZG9sbGFyIHBheW1lbnQgbWF0Y2hlZCDigJQgY29uZmlybSBiZWZvcmUgcmVjb25jaWxpbmcuXCIgcGxhY2VtZW50PVwidG9wXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCI+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCI5XCIvPjxwYXRoIGQ9XCJNMTIgMTF2NU0xMiA4aC4wMVwiLz48L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52b2ljZS1jYXJkLXZhbHVlIHRleHQtd2FybmluZ1wiPnt7IGNhcmRzLm5lZWRzX3Jldmlldy5jb3VudCB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLWNhcmQtc3ViXCI+4oK5e3sgY2FyZHMubmVlZHNfcmV2aWV3LmFtb3VudCB8IG51bWJlcjonMS4yLTInOidlbi1JTicgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludm9pY2UtY2FyZCBjYXJkLWNsaWNrYWJsZVwiIFtjbGFzcy5jYXJkLWFjdGl2ZV09XCJhY3RpdmVTdGF0dXMgPT09ICd1bm1hdGNoZWQnXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQ2FyZEZpbHRlcigndW5tYXRjaGVkJylcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52b2ljZS1jYXJkLWxhYmVsXCI+VW5tYXRjaGVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJpbmZvLWljXCIgbmdiVG9vbHRpcD1cIlBheWVyIG5hbWUgZG9lc24ndCBtYXRjaCBhbnkgY3VzdG9tZXIncyBpbnZvaWNlIOKAlCBpZGVudGlmeSB0aGUgY3VzdG9tZXIgYW5kIG1hcCBpdCBtYW51YWxseS5cIiBwbGFjZW1lbnQ9XCJ0b3BcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIj48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjlcIi8+PHBhdGggZD1cIk0xMiAxMXY1TTEyIDhoLjAxXCIvPjwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLWNhcmQtdmFsdWUgdGV4dC1kYW5nZXJcIj57eyBjYXJkcy51bm1hdGNoZWQuY291bnQgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52b2ljZS1jYXJkLXN1YlwiPuKCuXt7IGNhcmRzLnVubWF0Y2hlZC5hbW91bnQgfCBudW1iZXI6JzEuMi0yJzonZW4tSU4nIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLWNhcmQgY2FyZC1jbGlja2FibGVcIiBbY2xhc3MuY2FyZC1hY3RpdmVdPVwiYWN0aXZlU3RhdHVzID09PSAnZXhjbHVkZWQnXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQ2FyZEZpbHRlcignZXhjbHVkZWQnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZvaWNlLWNhcmQtbGFiZWxcIj5FeGNsdWRlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiaW5mby1pY1wiIG5nYlRvb2x0aXA9XCJOb3QgYSBjdXN0b21lciBwYXltZW50IChubyBwYXllciBuYW1lKSBvciBtYW51YWxseSBtYXJrZWQgYXMgbm90IHRvIGJlIGNvbnNpZGVyZWQuXCIgcGxhY2VtZW50PVwidG9wXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCI+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCI5XCIvPjxwYXRoIGQ9XCJNMTIgMTF2NU0xMiA4aC4wMVwiLz48L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52b2ljZS1jYXJkLXZhbHVlXCI+e3sgY2FyZHMuZXhjbHVkZWQuY291bnQgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52b2ljZS1jYXJkLXN1YlwiPuKCuXt7IGNhcmRzLmV4Y2x1ZGVkLmFtb3VudCB8IG51bWJlcjonMS4yLTInOidlbi1JTicgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBTdGF0dXMgdGFicyArIHNlYXJjaC9maWx0ZXIgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHBheW1lbnRoaXN0b3J5IGJvcmRlci0wXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yIGZsZXgtd3JhcFwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdGb3I9XCJsZXQgdGFiIG9mIHN0YXR1c1RhYnNcIiBjbGFzcz1cImJ0biBidG4tc20gc3RhdHVzLXRhYlwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJhY3RpdmVTdGF0dXMgPT09IHRhYi5pZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNldFN0YXR1cyh0YWIuaWQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgdGFiLmxhYmVsIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb3VudE9mKHRhYi5pZClcIiBjbGFzcz1cImNvdW50Y2hpcCBtcy0xXCI+e3sgY291bnRPZih0YWIuaWQpIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC10b29sYmFyIG1zLWF1dG9cIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIHBvc2l0aW9uLXJlbGF0aXZlIG15LTFcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN2Zy1pY29uIGludm9pY2VzZWFyY2ggc3ZnLWljb24tMSBwb3NpdGlvbi1hYnNvbHV0ZSBtdC02IG1zLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCBvcGFjaXR5PVwiMC41XCIgeD1cIjE3LjAzNjVcIiB5PVwiMTUuMTIyM1wiIHdpZHRoPVwiOC4xNTU0NlwiIGhlaWdodD1cIjJcIiByeD1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1cInJvdGF0ZSg0NSAxNy4wMzY1IDE1LjEyMjMpXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPjwvcmVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTEgMTlDNi41NTU1NiAxOSAzIDE1LjQ0NDQgMyAxMUMzIDYuNTU1NTYgNi41NTU1NiAzIDExIDNDMTUuNDQ0NCAzIDE5IDYuNTU1NTYgMTkgMTFDMTkgMTUuNDQ0NCAxNS40NDQ0IDE5IDExIDE5Wk0xMSA1QzcuNTMzMzMgNSA1IDcuNTMzMzMgNSAxMUM1IDE0LjQ2NjcgNy41MzMzMyAxNyAxMSAxN0MxNC40NjY3IDE3IDE3IDE0LjQ2NjcgMTcgMTFDMTcgNy41MzMzMyAxNC40NjY3IDUgMTEgNVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgWyhuZ01vZGVsKV09XCJzZWFyY2hWYWx1ZVwiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgcHMtMTQgaW52b2ljZXNlYXJjaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIHBheWVyLCBuYXJyYXRpb24sIFVUUi4uLlwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIChjaGFuZ2UpPVwic2VhcmNoRmllbGQoKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBGaWx0ZXIgZHJvcGRvd24g4oCUIG9wZW5zIGEgc2VsZi1jb250YWluZWQgcG9wb3ZlciBhbmNob3JlZCB0b1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJ1dHRvbiAobGliLWZpbHRlcnMgY2FuJ3QgaG9zdCB0aGUgZGF0ZS1yYW5nZSBpbnB1dHMpLiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmUgdHhuLWZpbHRlci13cmFwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLW91dGxpbmUgYnRuIGFsaWduLWl0ZW1zLWVuZCB0ZXh0LW5vd3JhcCBpbnZoZWFkZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUZpbHRlcigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zIDVoMThNNiAxMmgxMk0xMCAxOWg0XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0yXCI+RmlsdGVyPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJhY3RpdmVGaWx0ZXJDb3VudFwiIGNsYXNzPVwiY291bnRjaGlwIG1zLTFcIj57eyBhY3RpdmVGaWx0ZXJDb3VudCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWx0ZXJPcGVuXCIgY2xhc3M9XCJ0eG4tZmlsdGVyLXBvcCBjYXJkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHhuLWZpbHRlci10aXRsZVwiPkZpbHRlciBPcHRpb25zPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGwgZnctc2VtaWJvbGRcIj5EYXRlIOKAlCBmcm9tPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImRhdGVcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFsobmdNb2RlbCldPVwiZHJhZnRGcm9tRGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGwgZnctc2VtaWJvbGRcIj5EYXRlIOKAlCB0bzwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJkYXRlXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cImRyYWZ0VG9EYXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBzbWFsbCBmdy1zZW1pYm9sZFwiPlNvdXJjZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgWyhuZ01vZGVsKV09XCJkcmFmdFNvdXJjZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYWxsXCI+QWxsIHNvdXJjZXM8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImJhbmtcIj5CYW5rIFN0YXRlbWVudDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwidmFcIj5WaXJ0dWFsIEFjY291bnQ8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImdhdGV3YXlcIj5HYXRld2F5PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJtYW51YWxcIj5NYW51YWw8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG1iLTJcIiAqbmdJZj1cImFjdGl2ZUZpbHRlckNvdW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGluayBidG4tc20gcC0wXCIgKGNsaWNrKT1cImNsZWFyRmlsdGVycygpXCI+Q2xlYXIgYWxsPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRmlsdGVycyBhcHBseSBvbmx5IG9uIEFwcGx5OyBDYW5jZWwgZGlzY2FyZHMgY2hhbmdlcy4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yIG10LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSBidG4tc20gZmxleC1maWxsXCIgKGNsaWNrKT1cImNhbmNlbEZpbHRlcnMoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLXNtIGZsZXgtZmlsbFwiIChjbGljayk9XCJhcHBseUZpbHRlcnMoKVwiPkFwcGx5PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBEZWxldGUgc2VsZWN0ZWQgKG5vbi1yZWNvbmNpbGVkKSByb3dzLiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwic2VsZWN0ZWRDb3VudCA+IDAgJiYgKGdzLnVzZXJBY2Nlc3MgfCBhc3luYyk/Lkdsb2JhbF9CaWxsaW5nX2lzRWRpdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1vdXRsaW5lIGJ0biBhbGlnbi1pdGVtcy1lbmQgdGV4dC1ub3dyYXAgaW52aGVhZGVyIG1zLTIgZGVsZXRlLWFsbC1idG5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlU2VsZWN0ZWQoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMyA2aDE4TTggNlY0YTEgMSAwIDAgMSAxLTFoNmExIDEgMCAwIDEgMSAxdjJtMiAwdjE0YTIgMiAwIDAgMS0yIDJIN2EyIDIgMCAwIDEtMi0yVjZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNEOTJEMjBcIiBzdHJva2Utd2lkdGg9XCIxLjZcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0yXCI+RGVsZXRlIHNlbGVjdGVkICh7eyBzZWxlY3RlZENvdW50IH19KTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIERlbGV0ZSBhbGwgKG5vbi1yZWNvbmNpbGVkKSBmb3IgdGhlIGN1cnJlbnQgc3RhdGVtZW50IGJhdGNoLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgUmVjb25jaWxlZCByb3dzIGFyZSBhbHdheXMgcHJlc2VydmVkIGJ5IHRoZSBiYWNrZW5kLiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIW5vRGF0YSAmJiAoZ3MudXNlckFjY2VzcyB8IGFzeW5jKT8uR2xvYmFsX0JpbGxpbmdfaXNFZGl0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLW91dGxpbmUgYnRuIGFsaWduLWl0ZW1zLWVuZCB0ZXh0LW5vd3JhcCBpbnZoZWFkZXIgbXMtMiBkZWxldGUtYWxsLWJ0blwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVBbGwoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMyA2aDE4TTggNlY0YTEgMSAwIDAgMSAxLTFoNmExIDEgMCAwIDEgMSAxdjJtMiAwdjE0YTIgMiAwIDAgMS0yIDJIN2EyIDIgMCAwIDEtMi0yVjZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNEOTJEMjBcIiBzdHJva2Utd2lkdGg9XCIxLjZcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0yXCI+RGVsZXRlIGFsbDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBMb2FkaW5nIHNoaW1tZXIgLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvYWRpbmdcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBsb2FkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hpbW1lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdHJva2UgYW5pbWF0ZSB0aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgbGlua1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPCEtLSBFbXB0eSAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxvYWRpbmcgJiYgbm9EYXRhXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctMTIgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJpbWctc3JjIHctMjVcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGEuc3ZnXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDwhLS0gVHJhbnNhY3Rpb25zIHRhYmxlIC0tPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCIhbG9hZGluZyAmJiAhbm9EYXRhXCIgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCI+XHJcbiAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIGFjY29yZGlvbiB0YWJsZSBib3R0b20tYm9yZGVyIGludm9pdmV0YWJsZSB0ZXh0LW5vd3JhcFwiPlxyXG4gICAgICAgICAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiKGdzLnVzZXJBY2Nlc3MgfCBhc3luYyk/Lkdsb2JhbF9CaWxsaW5nX2lzRWRpdFwiIHN0eWxlPVwid2lkdGg6NDBweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJhbGxTZWxlY3RlZFwiIChjaGFuZ2UpPVwidG9nZ2xlU2VsZWN0QWxsKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJzZWxlY3RhYmxlUm93cy5sZW5ndGggPT09IDBcIiBuZ2JUb29sdGlwPVwiU2VsZWN0IGFsbCAoZXhjbHVkZXMgcmVjb25jaWxlZClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkRhdGU8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+U291cmNlPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlBheWVyIChmcm9tIG5hcnJhdGlvbik8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+UmVmZXJlbmNlIC8gVVRSPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkFtb3VudDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5CcmFuZCBOYW1lPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkludm9pY2U8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+UmVzdWx0PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlN0YXR1czwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5BY3Rpb248L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgdCBvZiByb3dzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIihncy51c2VyQWNjZXNzIHwgYXN5bmMpPy5HbG9iYWxfQmlsbGluZ19pc0VkaXRcIiBzdHlsZT1cIndpZHRoOjQwcHg7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFJlY29uY2lsZWQgcm93cyBjYW4ndCBiZSBzZWxlY3RlZC4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgKm5nSWY9XCJpc1NlbGVjdGFibGUodClcIiBbY2hlY2tlZF09XCJpc1NlbGVjdGVkKHQpXCIgKGNoYW5nZSk9XCJ0b2dnbGVTZWxlY3QodClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzU2VsZWN0YWJsZSh0KVwiIGNsYXNzPVwibG9jay1pY1wiIG5nYlRvb2x0aXA9XCJSZWNvbmNpbGVkIOKAlCBjYW5ub3QgYmUgZGVsZXRlZFwiPvCflJI8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10aXRsZVwiPnt7IHQudmFsdWVEYXRlIHwgZGF0ZTogJ2RkIE1NTSwgeXl5eScgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzcmNjaGlwXCIgW2NsYXNzLnNyY2NoaXAtdmFdPVwidC5zb3VyY2UgPT09ICd2YSdcIj57eyBzb3VyY2VMYWJlbCh0LnNvdXJjZSkgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10aXRsZSBwYXllci1jZWxsXCI+e3sgdC5wYXllciB8fCAn4oCUJyB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5hcnJhdGlvbi1zdWJcIiBbdGl0bGVdPVwidC5uYXJyYXRpb25cIj57eyB0Lm5hcnJhdGlvbiB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1vbm9cIj57eyB0LnJlZk5vIHx8ICfigJQnIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGVcIj48c3Ryb25nPuKCuXt7IHQuYW1vdW50IHwgbnVtYmVyOicxLjItMic6J2VuLUlOJyB9fTwvc3Ryb25nPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtdGl0bGVcIj57eyB0LmlkZW50aWZpZWRDbGllbnROYW1lIHx8ICfigJQnIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS10aXRsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTXVsdGlwbGUgaW52b2ljZXMgc2V0dGxlZCBieSBvbmUgcGF5bWVudDogbGluayBlYWNoIGluZGl2aWR1YWxseS4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInQuYXBwbGllZEludm9pY2VzPy5sZW5ndGggPiAxOyBlbHNlIHNpbmdsZUludlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhIG9mIHQuYXBwbGllZEludm9pY2VzOyBsZXQgbGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiaW52b2ljZS1saW5rXCIgKGNsaWNrKT1cIm9wZW5JbnZvaWNlUHJldmlld0J5SWQoYS5pbnZvaWNlSWQsIGEuaW52b2ljZSk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPnt7IGEuaW52b2ljZSB9fTwvYT48c3BhbiAqbmdJZj1cIiFsYXN0XCI+LCA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc2luZ2xlSW52PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSAqbmdJZj1cInQuaW52b2ljZSAmJiB0Lmludm9pY2VJZFwiIGNsYXNzPVwiaW52b2ljZS1saW5rXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuSW52b2ljZVByZXZpZXcodCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPnt7IHQuaW52b2ljZSB9fTwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ0Lmludm9pY2UgJiYgIXQuaW52b2ljZUlkXCI+e3sgdC5pbnZvaWNlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiF0Lmludm9pY2VcIj7igJQ8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVzdWx0LW5vdGVcIiBbdGl0bGVdPVwidC5yZXN1bHROb3RlXCI+e3sgdC5yZXN1bHROb3RlIHx8ICfigJQnIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidC5jb250YWN0ZWRcIiBjbGFzcz1cInBpbGwgcGlsbC1hbWJlclwiPlJlYWNoaW5nIG91dDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIXQuY29udGFjdGVkXCIgW25nQ2xhc3NdPVwic3RhdHVzUGlsbENsYXNzKHQuc3RhdHVzKVwiPnt7IHN0YXR1c0xhYmVsKHQuc3RhdHVzKSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInQuc3RhdHVzID09PSAnbmVlZHNfcmV2aWV3JyB8fCB0LnN0YXR1cyA9PT0gJ3VubWF0Y2hlZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tcHJpbWFyeVwiIChjbGljayk9XCJvcGVuUmVzb2x2ZSh0KVwiPlJlc29sdmU8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUmVjb25jaWxlZCByb3dzOiBFZGl0IHJlLW9wZW5zIHRoZSBSZXNvbHZlICYgcmVjb25jaWxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcHVwIHNvIHRoZSBtYXRjaGVkIGludm9pY2UgLyByZXNvbHV0aW9uIGNhbiBiZSBjaGFuZ2VkLiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJ0LnN0YXR1cyA9PT0gJ3JlY29uY2lsZWQnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmVcIiAoY2xpY2spPVwib3BlblJlc29sdmUodClcIj5FZGl0PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERlbGV0ZTogcmVjb25jaWxlZCByb3dzIGFyZSBwcm90ZWN0ZWQgYW5kIG5ldmVyIGRlbGV0YWJsZS4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwidC5zdGF0dXMgIT09ICdyZWNvbmNpbGVkJyAmJiAoZ3MudXNlckFjY2VzcyB8IGFzeW5jKT8uR2xvYmFsX0JpbGxpbmdfaXNFZGl0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tc20gYnRuLWljb24gZGVsZXRlLXR4blwiIG5nYlRvb2x0aXA9XCJEZWxldGUgdHJhbnNhY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVUcmFuc2FjdGlvbih0KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgNmgxOE04IDZWNGExIDEgMCAwIDEgMS0xaDZhMSAxIDAgMCAxIDEgMXYybTIgMHYxNGEyIDIgMCAwIDEtMiAySDdhMiAyIDAgMCAxLTItMlY2bTMgNXY2bTQtNnY2XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNEOTJEMjBcIiBzdHJva2Utd2lkdGg9XCIxLjZcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgIDxsaWItcGFnaW5hdGlvbiBjbGFzcz1cInRleHQtc3RhcnRcIiBbaXRlbXNQZXJQYWdlXT1cIml0ZW1zUGVyUGFnZVwiIFtjdXJyZW50UGFnZV09XCJjdXJyZW50UGFnZVwiXHJcbiAgICAgICAgICAgICAgICBbdG90YWxJdGVtc109XCJ0b3RhbEl0ZW1zXCIgW3BhZ2luYXRpb25TaXplc109XCJwYWdpbmF0aW9uU2l6ZXNcIiBbcGFnZVNpemVdPVwicGFnZVNpemVcIlxyXG4gICAgICAgICAgICAgICAgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIiAocGFnZVNpemVDaGFuZ2UpPVwib25QYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCI+PC9saWItcGFnaW5hdGlvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj4iXX0=