tango-app-ui-analyse-trax 4.0.49 → 4.0.50

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.
@@ -1521,10 +1521,10 @@ export class AuditV2DashboardComponent {
1521
1521
  });
1522
1522
  }
1523
1523
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuditV2DashboardComponent, deps: [{ token: i1.TraxService }, { token: i2.GlobalStateService }, { token: i3.ToastService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
1524
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AuditV2DashboardComponent, selector: "lib-audit-v2-dashboard", ngImport: i0, template: "<div class=\"av2-page audit-dash\">\r\n\r\n <!-- Refresh line + module switch -->\r\n <div class=\"db-topline\">\r\n <div class=\"db-refresh\">Last refreshed at {{ lastRefreshed }}</div>\r\n <div class=\"av2-grow\"></div>\r\n <div class=\"moduleswitch\">\r\n <button type=\"button\" class=\"moduletab\" *ngFor=\"let t of moduleTabs\" [class.moduletab-on]=\"moduleTab === t\"\r\n (click)=\"setModuleTab(t)\">{{ t }}</button>\r\n </div>\r\n </div>\r\n\r\n <!-- ============ AUDIT SCORECARD ============ -->\r\n <ng-container *ngIf=\"!isTaskModule\">\r\n\r\n <!-- Crumb, scope title, actions -->\r\n <div class=\"db-scopebar\">\r\n <div class=\"db-scopetext\">\r\n <div class=\"db-crumb\">Audits \u203A Dashboard</div>\r\n <div class=\"db-scope\">{{ scopeLabel }}</div>\r\n </div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"openFilters()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <line x1=\"4\" y1=\"7\" x2=\"20\" y2=\"7\"></line>\r\n <line x1=\"7\" y1=\"12\" x2=\"17\" y2=\"12\"></line>\r\n <line x1=\"10\" y1=\"17\" x2=\"14\" y2=\"17\"></line>\r\n </svg>\r\n Filters\r\n <span class=\"db-countpill\" *ngIf=\"filterCount\">{{ filterCount }}</span>\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" [disabled]=\"loading || !filteredRows.length\"\r\n title=\"Download the store list below as an Excel file\" (click)=\"exportStores()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 16V4\"></path>\r\n <polyline points=\"7 9 12 4 17 9\"></polyline>\r\n <path d=\"M4 16v4h16v-4\"></path>\r\n </svg>\r\n Export\r\n </button>\r\n </div>\r\n\r\n <!-- Filter chips -->\r\n <div class=\"db-chips\">\r\n <button type=\"button\" class=\"db-chip\" *ngFor=\"let c of filterCats; trackBy: trackByCat\" [class.is-dirty]=\"c.dirty\"\r\n (click)=\"openFilters(c.key)\">\r\n <span class=\"db-chip-label\">{{ c.label }}</span>\r\n <span class=\"db-chip-value\">{{ c.value }}</span>\r\n </button>\r\n <button type=\"button\" class=\"db-clearall\" *ngIf=\"filterCount\" (click)=\"clearAll()\">Clear all</button>\r\n </div>\r\n\r\n <!-- KPI tiles -->\r\n <div class=\"db-kpis\">\r\n <!-- Old Checklist summary card: figure + label in the gradient strip, note below. -->\r\n <div class=\"av2-ocard\" *ngFor=\"let kpi of kpis\">\r\n <div class=\"av2-ocard-head\">\r\n <div class=\"av2-ocard-count\">\r\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!loading\">{{ kpi.value }}</ng-container>\r\n </div>\r\n <div class=\"av2-ocard-text\">{{ kpi.label }}</div>\r\n </div>\r\n <div class=\"av2-ocard-body\">\r\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--note\"></span>\r\n <div *ngIf=\"!loading\" class=\"av2-ocard-note\" [style.color]=\"kpi.noteColor\">{{ kpi.note }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Trend + distribution -->\r\n <div class=\"db-duo\">\r\n <!-- Trend -->\r\n <section class=\"db-card\">\r\n <div class=\"db-card-head db-card-head--wrap\">\r\n <div class=\"db-card-title db-card-title--grow\">Audit score trend</div>\r\n <div class=\"db-seg\">\r\n <button type=\"button\" class=\"db-seg-tab\" [class.is-on]=\"grain === 'quarter'\" (click)=\"setGrain('quarter')\">Quarterly</button>\r\n <button type=\"button\" class=\"db-seg-tab\" [class.is-on]=\"grain === 'date'\" (click)=\"setGrain('date')\">By date</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-daterow\" *ngIf=\"grain === 'date'\">\r\n <div class=\"av2-datepick\">\r\n <svg class=\"av2-datepick-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\r\n <input type=\"text\" class=\"av2-datepick-input db-daterange\" ngxDaterangepickerMd readonly autocomplete=\"off\"\r\n placeholder=\"Select date range\" [(ngModel)]=\"range\" [locale]=\"pickerLocale\" [maxDate]=\"today\"\r\n [dateLimit]=\"maxRangeDays\" [ranges]=\"ranges\" [showCustomRangeLabel]=\"true\" [alwaysShowCalendars]=\"false\"\r\n [keepCalendarOpeningWithRange]=\"true\" [autoApply]=\"true\" [showCancel]=\"false\" [drops]=\"'down'\" [opens]=\"'right'\"\r\n (datesUpdated)=\"onRangePicked($event)\">\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"trendLoading\">\r\n <span class=\"av2-sk av2-sk--title\"></span>\r\n <span class=\"av2-sk av2-sk--block db-sk-chart\"></span>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!trendLoading\">\r\n <div class=\"db-focus\">\r\n <span class=\"db-focus-score\" [class.is-fail]=\"!focusPassed\">{{ focusScore }}</span>\r\n <span class=\"db-focus-pill\" [class.is-pass]=\"focusPassed\" [class.is-fail]=\"!focusPassed\">{{ focusStatus }}</span>\r\n <span class=\"db-focus-line\">{{ focusLine }}</span>\r\n </div>\r\n\r\n <div class=\"db-legend\">\r\n <span class=\"db-legend-dash\"></span>Pass mark {{ passMark }}%\r\n </div>\r\n\r\n <div class=\"db-chart\">\r\n <div class=\"db-chart-y\">\r\n <span style=\"top:0\">100%</span>\r\n <span style=\"top:50%\">50%</span>\r\n <span style=\"top:100%\">0%</span>\r\n </div>\r\n <div class=\"db-chart-area\">\r\n <span class=\"db-gridline\" style=\"top:0\"></span>\r\n <span class=\"db-gridline\" style=\"top:50%\"></span>\r\n <span class=\"db-gridline\" style=\"top:100%\"></span>\r\n <span class=\"db-passline\" [style.top.%]=\"100 - passMark\"></span>\r\n <div class=\"db-bars\">\r\n <div class=\"db-bar-col\" *ngFor=\"let bar of trendBars; let first = first; let last = last\"\r\n [class.is-pickable]=\"grain === 'quarter'\" (click)=\"selectQuarter(bar.key)\">\r\n <span class=\"db-bar-value\" *ngIf=\"!denseTrend\" [class.is-active]=\"bar.key === quarter\" [style.bottom]=\"barHeight(bar)\">\r\n {{ bar.value === null ? '\u2014' : bar.value + '%' }}\r\n </span>\r\n <span class=\"db-bar\" [style.height]=\"barHeight(bar)\" [style.background]=\"barFill(bar)\"></span>\r\n\r\n <div class=\"db-tip\" [class.is-start]=\"first && !last\" [class.is-end]=\"last && !first\" [style.bottom]=\"tipBottom(bar)\">\r\n <div class=\"db-tip-head\">\r\n {{ bar.label }}<span class=\"db-tip-sub\" *ngIf=\"grain === 'quarter'\"> \u00B7 {{ quarterMonths(bar.key) }}</span>\r\n </div>\r\n <div class=\"db-tip-score\" *ngIf=\"bar.value !== null\">\r\n <span class=\"db-tip-dot\" [class.is-fail]=\"bar.value < passMark\"></span>\r\n <span class=\"db-tip-value\">{{ bar.value }}%</span>\r\n <span class=\"db-tip-status\" [class.is-fail]=\"bar.value < passMark\">\r\n {{ bar.value >= passMark ? 'Pass' : 'Below pass mark' }}\r\n </span>\r\n </div>\r\n <div class=\"db-tip-empty\" *ngIf=\"bar.value === null\">No scored audits</div>\r\n <div class=\"db-tip-row\"><span>Audits completed</span><b>{{ bar.submitted }}</b></div>\r\n <div class=\"db-tip-row\" *ngIf=\"bar.count !== bar.submitted\"><span>Scored audits</span><b>{{ bar.count }}</b></div>\r\n <div class=\"db-tip-row\"><span>Pass mark</span><b>{{ passMark }}%</b></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- A month by date has ~30 bars: every few days get a label (first and last always), and the audit counts\r\n move to the bar tooltip, so the labels never run into each other. -->\r\n <div class=\"db-chart-x\" [class.is-dense]=\"denseTrend\">\r\n <span class=\"db-chart-xcol\" *ngFor=\"let bar of trendBars; let i = index; let last = last\" [class.is-pickable]=\"grain === 'quarter'\" (click)=\"selectQuarter(bar.key)\">\r\n <span class=\"db-chart-xlabel\" [class.is-active]=\"bar.key === quarter\" [style.visibility]=\"showXLabel(i, last) ? 'visible' : 'hidden'\">{{ bar.label }}</span>\r\n <span class=\"db-chart-xcount\" *ngIf=\"!denseTrend\">{{ bar.submitted ? bar.submitted + ' audits' : 'no audits' }}</span>\r\n </span>\r\n </div>\r\n </ng-container>\r\n </section>\r\n\r\n <!-- Score bands -->\r\n <section class=\"db-card db-card--tight\">\r\n <div class=\"db-card-head db-card-head--baseline\">\r\n <div class=\"db-card-title db-card-title--grow\">Score distribution</div>\r\n <div class=\"db-card-sub\">{{ storesInScope }} in scope</div>\r\n </div>\r\n <div class=\"db-card-sub\">Stores by score band, {{ periodLabel }}</div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"loading\" [rows]=\"2\"></lib-audit-v2-shimmer>\r\n\r\n <div class=\"db-bandbar\" *ngIf=\"!loading\">\r\n <!-- A band with stores keeps a visible sliver (2 of 3576 stores is under a pixel); the largest band gives way. -->\r\n <span class=\"db-bandseg\" *ngFor=\"let b of bandRows; trackBy: trackByBand\" [style.width]=\"b.width\" [style.background]=\"b.band.soft\"\r\n [class.has-stores]=\"b.count > 0\" [title]=\"b.band.label + ': ' + b.count\"></span>\r\n </div>\r\n\r\n <div class=\"db-bandrows\" *ngIf=\"!loading\">\r\n <div class=\"db-bandrow\" *ngFor=\"let b of bandRows; trackBy: trackByBand\">\r\n <span class=\"db-banddot\" [style.background]=\"b.band.soft\"></span>\r\n <span class=\"db-bandlabel\">{{ b.band.label }}</span>\r\n <span class=\"db-bandrange\">{{ b.band.range }}</span>\r\n <span class=\"db-bandcount\">{{ b.count }} {{ b.count === 1 ? 'store' : 'stores' }}</span>\r\n <span class=\"db-bandshare\">{{ b.share }}</span>\r\n <a class=\"db-bandlink\" [class.is-active]=\"storeListOpen && listBandKey === b.band.key\" (click)=\"applyBand(b.band)\">View stores</a>\r\n </div>\r\n </div>\r\n <div class=\"db-bandhint\" *ngIf=\"!loading && !showStoreList\">Click <b>View stores</b> on a band to list its stores.</div>\r\n </section>\r\n </div>\r\n\r\n <!-- Store ledger: opened from Score distribution -> View stores (or a Filters score range) -->\r\n <section class=\"db-card db-card--table\" id=\"ad-store-list\" *ngIf=\"showStoreList\">\r\n <div class=\"db-ledger-head\">\r\n <div class=\"db-ledger-text\">\r\n <div class=\"db-card-title\">Store list</div>\r\n <div class=\"db-card-sub\">\r\n {{ filteredRows.length }} {{ filteredRows.length === 1 ? 'store' : 'stores' }} \u00B7 {{ periodLabel }}\r\n </div>\r\n <div class=\"db-bandfilter\" *ngIf=\"listChipLabel\">\r\n <span class=\"db-bandchip\">\r\n {{ listChipLabel }}\r\n <span class=\"db-bandchip-x\" title=\"Close the store list\" (click)=\"closeStoreList()\">\r\n <svg width=\"9\" height=\"9\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </span>\r\n </span>\r\n <a class=\"db-bandlink\" (click)=\"showAllStores()\">Show all stores</a>\r\n </div>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <label class=\"av2-search db-search\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input [(ngModel)]=\"search\" (ngModelChange)=\"onSearch()\" type=\"text\" placeholder=\"Search store or owner\"\r\n autocomplete=\"off\" />\r\n </label>\r\n <div class=\"segmented\">\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'all'\" (click)=\"setStatus('all')\">All</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'fail'\" (click)=\"setStatus('fail')\">Fail</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'pass'\" (click)=\"setStatus('pass')\">Pass</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'unscored'\" (click)=\"setStatus('unscored')\"\r\n title=\"Audited, but compliance score is off for the audits\">Not scored</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'na'\" (click)=\"setStatus('na')\">Not audited</button>\r\n </div>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"loading\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!loading\">\r\n <div class=\"av2-table-wrap\">\r\n <table class=\"db-table\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let h of headers\" class=\"is-sortable\" [class.is-sorted]=\"sortKey === h.key\" (click)=\"sortBy(h.key)\">\r\n {{ h.label }} <lib-audit-v2-sort-icon [active]=\"sortKey === h.key\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon>\r\n </th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of pageRows; trackBy: trackByStore\">\r\n <td class=\"db-nowrap\">{{ row.date }}</td>\r\n <td>\r\n <a class=\"db-storeid\" routerLink=\"/manage/trax/audit-v2/dashboard/store\"\r\n [queryParams]=\"detailParams({ store: row.raw?.storeId || row.storeId })\">{{ row.storeId }}</a>\r\n </td>\r\n <td class=\"av2-ellipsis\">{{ row.circle }}</td>\r\n <td class=\"av2-ellipsis\">{{ row.zone }}</td>\r\n <td class=\"av2-ellipsis\">{{ row.aom }}</td>\r\n <td>\r\n <span class=\"db-pill\" [style.background]=\"bandFor(row).bg\" [style.color]=\"bandFor(row).fg\">\r\n {{ row.score === null ? '\u2014' : row.score + '%' }}\r\n </span>\r\n </td>\r\n <td>\r\n <span class=\"db-pill\" [style.background]=\"bandFor(row).bg\" [style.color]=\"bandFor(row).fg\">\r\n {{ statusLabel(row) }}\r\n </span>\r\n </td>\r\n <td>\r\n <div class=\"db-actions\">\r\n <!-- View opens the Gallery on the store's latest submitted audit in the period (QA 11 Oct); a store\r\n with no submission there opens its audit detail instead (same as the store link). -->\r\n <a class=\"db-viewbtn\" *ngIf=\"galleryAuditId(row) as auditId\" routerLink=\"/manage/trax/audit-v2/gallery\"\r\n [queryParams]=\"detailParams({ audit: auditId, store: row.raw?.storeId || row.storeId })\" title=\"View this store's submissions in the Gallery\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n View\r\n </a>\r\n <a class=\"db-viewbtn\" *ngIf=\"!galleryAuditId(row)\" routerLink=\"/manage/trax/audit-v2/dashboard/store\"\r\n [queryParams]=\"detailParams({ store: row.raw?.storeId || row.storeId })\" title=\"View this store's audits\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n View\r\n </a>\r\n <!-- PDF of the store's latest submitted audit in the period (queued, then under Notifications > Downloads). -->\r\n <a class=\"db-pdfbtn\" role=\"button\" [class.is-disabled]=\"!pdfVisitId(row)\"\r\n [attr.aria-disabled]=\"!pdfVisitId(row)\" (click)=\"downloadPdf(row)\"\r\n [title]=\"pdfVisitId(row) ? 'Download the PDF report of the latest submitted audit for this store' : 'No submitted audit for this store in this period'\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 4v12\"></path>\r\n <polyline points=\"7 11 12 16 17 11\"></polyline>\r\n <path d=\"M4 20h16\"></path>\r\n </svg>\r\n </a>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"!pageRows.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">No stores match the current filters.</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Shared pager (10 / 20 / 30), as on the other audit lists. -->\r\n <div class=\"db-perf-pager\" *ngIf=\"filteredRows.length\">\r\n <lib-pagination [itemsPerPage]=\"pageSize\" [pageSize]=\"pageSize\" [paginationSizes]=\"pageSizes\"\r\n [currentPage]=\"page\" [totalItems]=\"filteredRows.length\" (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </ng-container>\r\n </section>\r\n </ng-container>\r\n\r\n <!-- ============ TASK SUMMARY ============ -->\r\n <!-- Tasks raised from this client's audits, in the header scope (shimmer values while loading). -->\r\n <div class=\"db-stats\" *ngIf=\"isTaskModule\">\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.activeTasks }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Active {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body\">\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.taskInstances }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">{{ moduleTab }} Instances</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.notSubmitted }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Not Submitted {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body db-stat-body--2\">\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.openTasks }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Open {{ moduleTab }}s</div>\r\n </div>\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.inProgress }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">In Progress {{ moduleTab }}s</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.submitted }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Submitted {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body db-stat-body--3\">\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.completionScore }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Completion Score</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.completionDelta\" [ngClass]=\"taskDeltaClass('completion')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.completionDelta }}\r\n </div>\r\n </div>\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.complianceScore }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Compliance Score</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.complianceDelta\" [ngClass]=\"taskDeltaClass('compliance')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.complianceDelta }}\r\n </div>\r\n </div>\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid is-underline\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.totalFlags }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Total Flags</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.flagsDelta\" [ngClass]=\"taskDeltaClass('flags')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.flagsDelta }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ============ PERFORMANCE ============ -->\r\n <section class=\"db-perf\">\r\n <div class=\"db-perftabs\">\r\n <button type=\"button\" class=\"db-perftab\" *ngFor=\"let t of perfTabs\" [class.is-on]=\"perfTab === t\"\r\n (click)=\"setPerfTab(t)\">{{ perfTabDisplay(t) }}</button>\r\n </div>\r\n\r\n <div class=\"db-perf-head\">\r\n <div class=\"db-perf-text\">\r\n <div class=\"db-perf-title\">\r\n {{ perfInfoTitle }}\r\n <span class=\"db-total\">\r\n {{ perfTab === 'Audit' ? (isTaskModule ? filteredTaskPerf.length : filteredAuditPerf.length) : (perfTab === 'Store' ? filteredStorePerf.length : filteredUserPerf.length) }} Total\r\n </span>\r\n </div>\r\n <div class=\"db-card-sub\">{{ perfPeriod }}</div>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <label class=\"av2-search db-perf-search\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input type=\"text\" [placeholder]=\"perfSearchPlaceholder\" [(ngModel)]=\"perfSearch\" (ngModelChange)=\"onPerfSearch()\">\r\n </label>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" [disabled]=\"perfLoading || !perfRowCount\"\r\n title=\"Download this table as an Excel file\" (click)=\"exportPerformance()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 16V4\"></path>\r\n <polyline points=\"7 9 12 4 17 9\"></polyline>\r\n <path d=\"M4 16v4h16v-4\"></path>\r\n </svg>\r\n Export\r\n </button>\r\n <button type=\"button\" class=\"av2-btn db-create\" *ngIf=\"perfTab === 'Audit' && access.canAdd\" routerLink=\"/manage/trax/audit-v2/manage\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\"><path d=\"M12 5v14M5 12h14\"></path></svg>\r\n {{ perfCreateLabel }}\r\n </button>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"perfLoading\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!perfLoading\">\r\n <!-- Audit Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Audit' && !isTaskModule\">\r\n <table class=\"db-perftable db-perftable--audit\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of auditPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredAuditPerf); trackBy: trackByPerfAudit\">\r\n <td>\r\n <div class=\"db-name\">\r\n <span class=\"db-avatar\">{{ row.initials }}</span>\r\n <a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id })\">{{ row.name }}</a>\r\n </div>\r\n </td>\r\n <td>{{ row.assigned }}</td>\r\n <td>\r\n <!-- Opens the audit's detail page (as the eye does) on its submitted visits, as the v1 Checklist dashboard did. -->\r\n <a *ngIf=\"row.submitted\" class=\"db-ulink\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id, status: 'submit' })\"\r\n title=\"View the submitted visits\">{{ row.submitted }}</a>\r\n <span *ngIf=\"!row.submitted\">0</span>\r\n </td>\r\n <!-- Store disputes (questions) in the period, as a plain count (QA 10 Oct: no link). -->\r\n <td>\r\n <span *ngIf=\"row.disputes === null\" class=\"av2-faint\">\u2014</span>\r\n <span *ngIf=\"row.disputes !== null\">{{ row.disputes }}</span>\r\n </td>\r\n <td>{{ row.passMark }}</td>\r\n <td>\r\n <div class=\"db-score\" [class.is-empty]=\"row.score === '\u2014'\"\r\n [title]=\"row.score === '\u2014' ? 'Compliance score is off for this audit' : ''\">\r\n <span class=\"db-track db-track--6\"><span [style.width]=\"barWidth(row.scorePct)\"\r\n [style.background]=\"row.result === 'Pass' ? '#12B76A' : '#F04438'\"></span></span>\r\n <span class=\"db-scoretext\">{{ row.score }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <span *ngIf=\"row.result !== '\u2014'\" class=\"db-pill db-pill--strong\" [style.background]=\"row.result === 'Pass' ? '#ECFDF3' : '#FEF3F2'\"\r\n [style.color]=\"row.result === 'Pass' ? '#027A48' : '#B42318'\">{{ row.result }}</span>\r\n <span *ngIf=\"row.result === '\u2014'\" class=\"av2-faint\" title=\"Compliance score is off for this audit\">\u2014</span>\r\n </td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View audit\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredAuditPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No audit matches this search.' : 'There is no result for Audit Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Task Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Audit' && isTaskModule\">\r\n <table class=\"db-perftable db-perftable--task\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of taskPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredTaskPerf); trackBy: trackByPerfTask\">\r\n <td>\r\n <div class=\"db-name\">\r\n <span class=\"db-avatar\">{{ row.initials }}</span>\r\n <a class=\"db-link\" [title]=\"row.raw?.auditName ? 'Raised from ' + row.raw.auditName : ''\">{{ row.name }}</a>\r\n </div>\r\n </td>\r\n <td>{{ row.scheduled }}</td>\r\n <td class=\"db-medium\">{{ row.coverage }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>\r\n <!-- Opens the Gallery (Type Task) on this task's submissions in the dashboard period. -->\r\n <a *ngIf=\"row.submitted && row.raw?.taskId\" class=\"db-ulink\" routerLink=\"/manage/trax/audit-v2/gallery\"\r\n [queryParams]=\"taskSubmittedParams(row)\" title=\"View the submitted tasks in the Gallery\">{{ row.submitted }}</a>\r\n <span *ngIf=\"!row.submitted || !row.raw?.taskId\">{{ row.submitted }}</span>\r\n </td>\r\n <td><a class=\"db-ulink\">{{ row.flags }}</a></td>\r\n <td class=\"av2-faint\">{{ row.tasks }}</td>\r\n <td><a class=\"db-ulink\">{{ row.redo }}</a></td>\r\n <td>\r\n <div class=\"db-score\" [class.is-empty]=\"row.compliance === '\u2014'\">\r\n <span class=\"db-track db-track--6\"><span [style.width]=\"barWidth(row.compliancePct)\"></span></span>\r\n <span class=\"db-scoretext\">{{ row.compliance }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <!-- Opens the audit the task was raised from. -->\r\n <a class=\"db-eye\" title=\"View the audit this task was raised from\"\r\n [routerLink]=\"row.raw?.auditId ? '/manage/trax/audit-v2/dashboard/audit' : null\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.auditId })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredTaskPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">No tasks raised from audits in this period.</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Store Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Store'\">\r\n <table class=\"db-perftable db-perftable--store\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of storePerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredStorePerf); trackBy: trackByPerfStore\">\r\n <td>\r\n <a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/store\" [queryParams]=\"detailParams({ store: row.storeId || row.store })\">{{ row.store }}</a>\r\n </td>\r\n <td class=\"av2-ellipsis av2-dim\" [av2Tip]=\"row.storeId\">{{ row.storeId || '\u2014' }}</td>\r\n <td class=\"av2-ellipsis av2-dim\">{{ row.spoc }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>{{ row.flags ?? '\u2014' }}</td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.completion === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.completion)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.completion }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.compliance === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.compliance)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.compliance }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.perf === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.perf)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.perf }}</span></div></td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View store\" routerLink=\"/manage/trax/audit-v2/dashboard/store\" [queryParams]=\"detailParams({ store: row.storeId || row.store })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredStorePerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No store matches this search.' : 'There is no result for Store Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- User Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'User'\">\r\n <table class=\"db-perftable db-perftable--user\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of userPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredUserPerf); trackBy: trackByPerfUser\">\r\n <td class=\"av2-ellipsis\"><a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/user\" [queryParams]=\"detailParams({ email: row.email })\">{{ row.name }}</a></td>\r\n <td class=\"av2-ellipsis av2-dim\">{{ row.email }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>{{ row.flags }}</td>\r\n <td>{{ row.redo }}</td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.completion === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.completion)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.completion }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.compliance === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.compliance)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.compliance }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.perf === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.perf)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.perf }}</span></div></td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View user\" routerLink=\"/manage/trax/audit-v2/dashboard/user\" [queryParams]=\"detailParams({ email: row.email })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredUserPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No user matches this search.' : 'There is no result for User Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Shared pager (10 / 20 / 30), as on the other audit lists. -->\r\n <div class=\"db-perf-pager\" *ngIf=\"perfTotal\">\r\n <lib-pagination [itemsPerPage]=\"perfPageSize\" [pageSize]=\"perfPageSize\" [paginationSizes]=\"perfPageSizes\"\r\n [currentPage]=\"perfPage\" [totalItems]=\"perfTotal\" (pageChange)=\"onPerfPage($event)\"\r\n (pageSizeChange)=\"onPerfPageSize($event)\"></lib-pagination>\r\n </div>\r\n </ng-container>\r\n </section>\r\n\r\n <!-- ============ FILTER DRAWER ============ -->\r\n <div class=\"filter-backdrop\" *ngIf=\"filtersOpen\" (click)=\"cancelFilters()\"></div>\r\n\r\n <div class=\"filter-drawer\" *ngIf=\"filtersOpen && draft as dr\">\r\n <div class=\"drawer-head\">\r\n <span class=\"drawer-title\">Filters</span>\r\n <span class=\"db-countpill\" *ngIf=\"dr.filterCount\">{{ dr.filterCount }}</span>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"closebtn\" (click)=\"cancelFilters()\" title=\"Close\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-body\">\r\n <div class=\"drawer-nav\">\r\n <button type=\"button\" class=\"drawer-navitem\" *ngFor=\"let c of dr.filterCats; trackBy: trackByCat\" [class.navitem-active]=\"activeCat === c.key\"\r\n (click)=\"selectCat(c.key)\">\r\n <span class=\"navtext\">\r\n <span class=\"navtitle\">{{ c.label }}</span>\r\n <span class=\"navvalue\" [class.is-dirty]=\"c.dirty\">{{ c.value }}</span>\r\n </span>\r\n <span class=\"dirtydot\" *ngIf=\"c.dirty\"></span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-pane\">\r\n <div class=\"panetitle\">{{ dr.activeCatObj.title }}</div>\r\n <div class=\"panehint\">{{ dr.activeCatObj.sub }}</div>\r\n\r\n <!-- Period -->\r\n <ng-container *ngIf=\"activeCat === 'period'\">\r\n <div class=\"pane-options\">\r\n <div class=\"pane-option\" [class.is-on]=\"dr.grain === 'quarter'\" (click)=\"dr.setGrain('quarter')\">\r\n <span class=\"pane-radio\" [class.is-on]=\"dr.grain === 'quarter'\"><span></span></span>\r\n <span class=\"pane-option-text\">\r\n <span class=\"pane-option-label\">Quarterly</span>\r\n <span class=\"pane-option-help\">Read one financial quarter (April\u2013March year) at a time.</span>\r\n </span>\r\n </div>\r\n <div class=\"pane-option\" [class.is-on]=\"dr.grain === 'date'\" (click)=\"dr.setGrain('date')\">\r\n <span class=\"pane-radio\" [class.is-on]=\"dr.grain === 'date'\"><span></span></span>\r\n <span class=\"pane-option-text\">\r\n <span class=\"pane-option-label\">By date</span>\r\n <span class=\"pane-option-help\">Pick a custom start and end date.</span>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"pane-list\" *ngIf=\"dr.grain === 'quarter'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let q of dr.quarters\" [class.option-selected]=\"dr.quarter === q\"\r\n (click)=\"dr.selectQuarter(q)\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.quarter === q\">\r\n <svg *ngIf=\"dr.quarter === q\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">{{ q }} \u00B7 {{ quarterMonths(q) }}</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"pane-fields\" *ngIf=\"dr.grain === 'date'\">\r\n <div class=\"field\">\r\n <span class=\"field-label\">Date range</span>\r\n <div class=\"av2-datepick av2-datepick--compact\">\r\n <svg class=\"av2-datepick-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\r\n <input type=\"text\" class=\"av2-datepick-input db-daterange db-daterange--field\" ngxDaterangepickerMd readonly\r\n autocomplete=\"off\" placeholder=\"Select date range\" [(ngModel)]=\"dr.range\" [locale]=\"pickerLocale\"\r\n [maxDate]=\"today\" [dateLimit]=\"maxRangeDays\" [autoApply]=\"true\" [alwaysShowCalendars]=\"true\" [showCancel]=\"false\"\r\n [drops]=\"'down'\" [opens]=\"'right'\" (datesUpdated)=\"dr.onRangePicked($event)\">\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Scope -->\r\n <ng-container *ngIf=\"activeCat === 'scope'\">\r\n <div class=\"pane-stack\">\r\n <div class=\"field field--full\">\r\n <span class=\"field-label\">Circle Head <span class=\"field-meta\">{{ dr.circles.length }} users</span></span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.circle\" (ngModelChange)=\"dr.onCircleChange()\" [options]=\"dr.pickOptions(dr.circles, 'All Circles')\" ariaLabel=\"Circle\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.circle\">\r\n <span class=\"field-label\">Zone Manager</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.zone\" (ngModelChange)=\"dr.onZoneChange()\" [options]=\"dr.pickOptions(dr.zones, 'All zones')\" ariaLabel=\"Zone\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.zone\">\r\n <span class=\"field-label\">AOM</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.aom\" (ngModelChange)=\"dr.onAomChange()\" [options]=\"dr.pickOptions(dr.aoms, 'All AOMs')\" ariaLabel=\"AOM\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.aom\">\r\n <span class=\"field-label\">Store</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.store\" [options]=\"dr.storePickOptions\" ariaLabel=\"Store\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"readingrow\">\r\n <span class=\"readinglabel\">Reading</span>\r\n <span class=\"readingvalue\">{{ dr.scopeReading }}</span>\r\n <span class=\"av2-grow\"></span>\r\n <a class=\"db-bandlink\" (click)=\"dr.resetScope()\">Reset to all circles</a>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Audit type -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'type'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let t of auditTypes\" [class.option-selected]=\"dr.auditType === t.key\"\r\n (click)=\"dr.auditType = t.key\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.auditType === t.key\">\r\n <svg *ngIf=\"dr.auditType === t.key\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"opttext\">\r\n <span class=\"optlabel\">{{ t.label }}</span>\r\n <span class=\"optmeta\">{{ t.help }}</span>\r\n </span>\r\n </button>\r\n </div>\r\n\r\n <!-- Score band -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'band'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let b of dr.bandRows; trackBy: trackByBand\" [class.option-selected]=\"dr.isBandOn(b.band)\"\r\n (click)=\"dr.applyBand(b.band)\">\r\n <span class=\"db-banddot\" [style.background]=\"b.band.soft\"></span>\r\n <span class=\"opttext\">\r\n <span class=\"optlabel\">{{ b.band.label }}</span>\r\n <span class=\"optmeta\">{{ b.band.range }} \u00B7 {{ b.count }} stores</span>\r\n </span>\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm pane-resetbtn\" (click)=\"dr.clearBand()\">All scores</button>\r\n </div>\r\n\r\n <!-- Status -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'status'\">\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'all'\" (click)=\"dr.setStatus('all')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'all'\">\r\n <svg *ngIf=\"dr.status === 'all'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">All stores</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'fail'\" (click)=\"dr.setStatus('fail')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'fail'\">\r\n <svg *ngIf=\"dr.status === 'fail'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Fail</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'pass'\" (click)=\"dr.setStatus('pass')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'pass'\">\r\n <svg *ngIf=\"dr.status === 'pass'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Pass</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'unscored'\" (click)=\"dr.setStatus('unscored')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'unscored'\">\r\n <svg *ngIf=\"dr.status === 'unscored'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Not scored</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'na'\" (click)=\"dr.setStatus('na')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'na'\">\r\n <svg *ngIf=\"dr.status === 'na'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Not audited</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"drawer-foot\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" (click)=\"dr.clearAll()\">Clear all</button>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" (click)=\"cancelFilters()\">Cancel</button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--wide\" (click)=\"applyFilters()\">Apply filters</button>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.av2-page{display:flex;flex-direction:column;gap:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;color:#101828;-webkit-font-smoothing:antialiased}.av2-page *,.av2-page *:before,.av2-page *:after{box-sizing:border-box}.av2-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:20px 24px;display:flex;flex-direction:column;gap:20px}.av2-card--log{padding:20px 24px 24px;gap:18px}.av2-card--table{padding:20px 24px 24px;gap:16px}.av2-card-head{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap}.av2-card-head--center{align-items:center;gap:12px}.av2-title-block{display:flex;flex-direction:column;gap:4px;flex:1;min-width:220px}.av2-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828;display:flex;align-items:center;gap:10px}.av2-card-title--grow{flex:1;min-width:180px}.av2-card-sub{font-size:14px;line-height:20px;color:#667085}.av2-grow{flex:1}.av2-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.av2-grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:20px}.av2-grid-4{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.av2-stat-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:10px}.av2-stat{padding:8px 16px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;align-items:center;gap:20px}.av2-stat-value{font-size:30px;line-height:38px;font-weight:600;color:#101828}.av2-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-kpi{background:#fff;border-radius:10px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;display:flex;flex-direction:column;overflow:hidden}.av2-kpi.is-primary{box-shadow:inset 0 0 0 1px #99dbff,0 1px 2px #1018280d}.av2-kpi.is-primary .av2-kpi-head{background:#eaf8ff}.av2-kpi-head{padding:14px 18px;background:#f9fafb;font-size:16px;line-height:24px;font-weight:500;color:#101828}.av2-kpi-body{padding:16px 18px 18px;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.av2-kpi-value{font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-kpi-delta{display:flex;align-items:center;gap:4px;font-size:12px;color:#039855}.av2-kpi-delta.is-down{color:#d92d20}.av2-kpi-note{font-size:12px;color:#667085}.av2-ocard{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;display:flex;flex-direction:column;min-width:0;height:100%}.av2-ocard-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:2px;min-width:0}.av2-ocard-head--row{flex-direction:row;align-items:center;justify-content:flex-start;gap:12px}.av2-ocard-count{font-size:30px;line-height:38px;font-weight:600;color:#101828;white-space:nowrap}.av2-ocard-text{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-ocard-body{flex:1;padding:12px 14px;display:flex;gap:16px;min-width:0}.av2-ocard-cell{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.av2-ocard-cell--center{align-items:center;text-align:center}.av2-ocard-sub{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-ocard-note{font-size:14px;line-height:20px;font-weight:400;color:#667085}.av2-ocard-delta{margin-top:6px;display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;font-weight:400;color:#1d2939}.av2-ocard-delta b{font-weight:600;color:#667085}.av2-ocard-delta svg{flex-shrink:0;color:#039855}.av2-ocard-delta.is-down svg{color:#d92d20}.av2-search{position:relative;display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#98a2b3;font-size:14px;flex-shrink:0}.av2-search svg{flex-shrink:0}.av2-search input{flex:1;min-width:0;height:100%;border:0;outline:0;padding:0;background:transparent;font:inherit;font-size:14px;font-weight:500;color:#101828}.av2-search input::placeholder{color:#98a2b3}.av2-search:focus-within{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-search--sm{width:300px}.av2-search--md{width:320px}.av2-search--lg{width:340px}.av2-select{height:44px;padding:0 36px 0 12px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;font-size:14px;font-weight:500;color:#344054;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\");background-repeat:no-repeat;background-position:right 12px center;flex-shrink:0}.av2-select:focus{outline:0;box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-select--sm{width:180px}.av2-chip{display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-size:14px;color:#344054;white-space:nowrap;flex-shrink:0}.av2-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;height:44px;padding:0 16px;border:0;border-radius:8px;font-family:inherit;font-size:14px;line-height:20px;font-weight:600;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background-color .15s cubic-bezier(.4,0,.2,1)}.av2-btn svg{flex-shrink:0}.av2-btn:disabled{opacity:.55;cursor:not-allowed}.av2-btn--ghost{background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054;font-weight:500}.av2-btn--ghost:hover:not(:disabled){background:#f9fafb}.av2-btn--primary{background:#00a3ff;color:#fff;font-size:16px;line-height:24px}.av2-btn--primary:hover:not(:disabled){background:#009bf3}.av2-btn--sm{height:36px;padding:0 14px;font-size:13px}.av2-btn--wide{padding:0 18px}.av2-tabs{display:flex;align-items:center;gap:6px}.av2-tab{height:44px;padding:0 26px;border:0;border-radius:6px;background:transparent;display:inline-flex;align-items:center;justify-content:center;font-family:inherit;font-size:16px;font-weight:500;color:#475467;cursor:pointer}.av2-tab.is-active{background:#eaf8ff;color:#009bf3;font-weight:500}.av2-badge{display:inline-flex;align-items:center;height:22px;padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px;white-space:nowrap}.av2-badge--count{height:22px;padding:0 8px}.av2-badge--success{background:#ecfdf3;color:#027a48}.av2-badge--error{background:#fef3f2;color:#b42318}.av2-badge--warning{background:#fffaeb;color:#b54708}.av2-badge--gray{background:#f2f4f7;color:#344054}.av2-badge--purple{background:#f9f5ff;color:#5925dc}.av2-link{color:#00a3ff;font-size:14px;font-weight:500;text-decoration:underline;cursor:pointer}.av2-link:hover{color:#009bf3;text-decoration:underline}.av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.av2-muted{color:#667085}.av2-dim{color:#475467}.av2-faint{color:#98a2b3}table tbody td.av2-dim{color:#475467}table tbody td.av2-faint{color:#98a2b3}.av2-table-wrap{overflow-x:auto}.av2-table{width:100%;border-collapse:separate;border-spacing:0;margin:0}.av2-table thead th{background:#f9fafb;padding:12px;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;text-transform:none;letter-spacing:0;border:0;white-space:nowrap}.av2-table thead th:first-child{border-radius:8px 0 0}.av2-table thead th:last-child{border-radius:0 8px 0 0}.av2-table tbody td{padding:16px 12px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;font-weight:500;color:#101828;vertical-align:middle}.av2-table .av2-th-sort{display:inline-flex;align-items:center;gap:4px}.av2-table .av2-cell-icon{display:flex;align-items:center;gap:8px;min-width:0}.av2-table .av2-cell-icon svg{flex-shrink:0}.av2-table .av2-cell-icon span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-table .av2-cell-stack{display:flex;flex-direction:column;gap:2px}.av2-table .av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-sortable{cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap}.av2-table--lined thead th{background:transparent;border-bottom:1px solid #EAECF0;border-radius:0!important}.av2-empty{display:flex;flex-direction:column;align-items:center;gap:12px;padding:24px 16px 32px;text-align:center}.av2-empty-img{display:block;width:160px;height:120px}.av2-empty-text{display:flex;flex-direction:column;gap:4px;align-items:center}.av2-empty-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.av2-empty-sub{max-width:480px;font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.av2-col-head{border-radius:8px;background:#f9fafb;padding:14px 16px;font-size:12px;line-height:20px;font-weight:500;color:#344054;display:flex;align-items:center;gap:8px}.av2-avatar{width:32px;height:32px;flex-shrink:0;border-radius:9999px;background:#eaf8ff;color:#009bf3;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}.av2-bar{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:60px}.av2-bar span{display:block;height:5px;border-radius:9999px;background:#00a3ff}@keyframes av2-shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.av2-sk{display:block;width:100%;max-width:100%;height:12px;border-radius:4px;flex-shrink:0;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%;animation:av2-shimmer 3s linear infinite}.av2-sk--value{width:72px;height:28px;border-radius:6px}.av2-sk--title{width:220px;height:18px}.av2-sk--note{width:60%}.av2-sk--block{border-radius:8px}@media (prefers-reduced-motion: reduce){.av2-sk{animation:none}}:host ::ng-deep lib-pagination{display:block}:host ::ng-deep lib-pagination .container{max-width:none;padding:0;display:flex;align-items:center;justify-content:center;gap:16px;flex-wrap:wrap;font-size:14px;color:#475467}:host ::ng-deep lib-pagination .mt-4{margin-top:0!important}:host ::ng-deep lib-pagination .container>.text-center{display:flex;align-items:center}:host ::ng-deep lib-pagination .container>.text-center>ul:not(.ngx-pagination){display:none}:host ::ng-deep lib-pagination pagination-controls{display:flex;align-items:center}:host ::ng-deep lib-pagination .sub-title{color:#475467!important;font-size:14px!important;font-weight:400!important;line-height:20px}:host ::ng-deep lib-pagination .border-val{height:40px;min-width:64px;padding:0 30px 0 12px!important;border:1px solid #D0D5DD!important;border-radius:8px!important;box-shadow:0 1px 2px #1018280d;background-color:#fff;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23667085' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E\")!important;background-repeat:no-repeat!important;background-position:right 10px center!important;background-size:14px 14px!important;appearance:none;-webkit-appearance:none;font-size:14px;font-weight:500;color:#1d2939;cursor:pointer;transition:border-color .15s ease,box-shadow .15s ease}:host ::ng-deep lib-pagination .border-val:hover{border-color:#98a2b3!important}:host ::ng-deep lib-pagination .border-val:focus{outline:none;border-color:#66c8ff!important;box-shadow:0 0 0 3px #eaf8ff}:host ::ng-deep lib-pagination .ngx-pagination{margin:0;padding:0;display:flex;align-items:center;gap:6px;color:#475467!important;font-size:14px!important;font-weight:500}:host ::ng-deep lib-pagination .ngx-pagination li{display:inline-flex;margin:0}:host ::ng-deep lib-pagination .ngx-pagination li.small-screen{display:none!important}:host ::ng-deep lib-pagination .ngx-pagination a,:host ::ng-deep lib-pagination .ngx-pagination button,:host ::ng-deep lib-pagination .ngx-pagination .current,:host ::ng-deep lib-pagination .ngx-pagination .disabled{min-width:40px!important;height:40px;padding:0 8px!important;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;line-height:20px;color:#475467}:host ::ng-deep lib-pagination .ngx-pagination a:hover,:host ::ng-deep lib-pagination .ngx-pagination button:hover{background:#f2f4f7;padding:0 8px!important}:host ::ng-deep lib-pagination .ngx-pagination .current{background:#eaf8ff!important;color:#00a3ff!important;font-weight:600;font-size:14px!important}:host ::ng-deep lib-pagination .ngx-pagination .disabled{color:#98a2b3}:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:after{margin:0}:host ::ng-deep lib-pagination .ngx-pagination .ellipsis:after{color:#98a2b3;padding:0}.db-topline{display:flex;align-items:center;gap:12px}.db-refresh{font-size:15px;font-weight:600;color:#344054}.moduleswitch{display:flex;border-radius:8px;overflow:hidden;box-shadow:inset 0 0 0 1px #d0d5dd}.moduletab{padding:8px 24px;border:none;background:#fff;font-family:inherit;font-size:16px;line-height:24px;font-weight:500;color:#344054;white-space:nowrap;cursor:pointer}.moduletab:first-child{box-shadow:inset -1px 0 #d0d5dd}.moduletab.moduletab-on{background:#00a3ff;color:#fff}.db-scopebar{display:flex;flex-wrap:wrap;align-items:center;gap:12px}.db-scopetext{flex:1 1 300px;min-width:0;display:flex;flex-direction:column;gap:1px}.db-crumb{font-size:13px;line-height:20px;color:#667085}.db-scope{font-size:16px;line-height:24px;font-weight:600;color:#101828;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.db-countpill{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;border-radius:9999px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:700}.db-chips{display:flex;flex-wrap:wrap;align-items:center;gap:10px}.db-chip{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 12px;border:none;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0;font-family:inherit;font-size:13px;line-height:20px;white-space:nowrap;cursor:pointer}.db-chip:hover{background:#f9fafb}.db-chip.is-dirty{box-shadow:inset 0 0 0 1px #99dbff}.db-chip.is-dirty .db-chip-value{color:#009bf3}.db-chip-label{color:#667085;font-weight:500}.db-chip-value{font-weight:600;color:#101828}.db-clearall{border:none;background:transparent;padding:0 4px;font-family:inherit;font-size:13px;font-weight:600;color:#00a3ff;cursor:pointer}.db-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.db-sk-value{margin:2px 0}.db-sk-chart{height:250px}.db-sk-mid{width:48px;height:22px;margin:4px 0;border-radius:6px}.db-duo{display:grid;grid-template-columns:repeat(auto-fit,minmax(340px,1fr));gap:16px;align-items:stretch}.db-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:18px 20px;display:flex;flex-direction:column;gap:12px;min-width:0}.db-card--tight{gap:4px}.db-card--table{padding:0;gap:0;overflow:hidden;scroll-margin-top:16px}.db-card-head{display:flex;align-items:center;gap:10px}.db-card-head--wrap{flex-wrap:wrap}.db-card-head--baseline{align-items:baseline}.db-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828}.db-card-title--grow{flex:1 1 160px;min-width:0}.db-card-sub{font-size:13px;line-height:20px;color:#667085}.db-seg{display:flex;border-radius:8px;overflow:hidden;box-shadow:inset 0 0 0 1px #d0d5dd}.db-seg-tab{padding:8px 14px;border:none;background:#fff;font-family:inherit;font-size:14px;font-weight:500;color:#475467;white-space:nowrap;cursor:pointer}.db-seg-tab.is-on{background:#00a3ff;color:#fff}.db-daterow{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.av2-datepick{position:relative;display:inline-flex;align-items:center}.av2-datepick-icon{position:absolute;left:10px;color:#667085;pointer-events:none}.av2-datepick-input{height:36px;padding:0 10px 0 32px;border:none;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;background:#fff;font-family:inherit;font-size:13px;font-weight:500;color:#101828;cursor:pointer;outline:none}.av2-datepick-input:focus{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}:host ::ng-deep .av2-datepick .md-drppicker{margin-top:4px;z-index:1060;font-family:inherit;border-radius:8px;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808,inset 0 0 0 1px #eaecf0}:host ::ng-deep .av2-datepick .md-drppicker.double,:host ::ng-deep .av2-datepick .md-drppicker.show-ranges{width:max-content}:host ::ng-deep .av2-datepick .md-drppicker.ltr .ranges{float:left;margin-top:10px}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button{width:160px;padding:12px 16px;border:none;border-radius:8px;background:none;color:#344054;font-size:14px;font-weight:400;line-height:20px;text-align:left;cursor:pointer}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button.active{background:#eaf8ff;color:#00a3ff;font-weight:500}:host ::ng-deep .av2-datepick .md-drppicker th,:host ::ng-deep .av2-datepick .md-drppicker td{width:40px!important;height:40px!important;min-width:32px;padding:0!important;border:1px solid transparent!important;background:transparent!important;font-size:14px!important;font-weight:400!important;line-height:38px}:host ::ng-deep .av2-datepick .md-drppicker th{color:#344054!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker th.month{width:auto!important;font-size:16px!important}:host ::ng-deep .av2-datepick .md-drppicker td{color:#344054!important}:host ::ng-deep .av2-datepick .md-drppicker th.available.prev,:host ::ng-deep .av2-datepick .md-drppicker th.available.next{background:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='15 6 9 12 15 18'/%3E%3C/svg%3E\") center/18px no-repeat!important}:host ::ng-deep .av2-datepick .md-drppicker th.available:hover,:host ::ng-deep .av2-datepick .md-drppicker td.available:hover{background-color:#f2f4f7!important}:host ::ng-deep .av2-datepick .md-drppicker td.in-range{background-color:#eaf8ff!important;color:#101828!important}:host ::ng-deep .av2-datepick .md-drppicker td.active,:host ::ng-deep .av2-datepick .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px;color:#fff!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker td.off,:host ::ng-deep .av2-datepick .md-drppicker td.off.in-range{color:#98a2b3!important;background-color:transparent!important}:host ::ng-deep .av2-datepick .md-drppicker td.disabled{color:#98a2b3!important;background-color:transparent!important;text-decoration:line-through;pointer-events:none}:host ::ng-deep .av2-datepick--compact .md-drppicker th,:host ::ng-deep .av2-datepick--compact .md-drppicker td{width:32px!important;height:32px!important;font-size:12px!important;line-height:30px}:host ::ng-deep .av2-datepick--compact .md-drppicker th.month{font-size:14px!important}.db-daterange{width:220px}.db-daterange--field{height:40px;font-size:14px;font-weight:600}.db-focus{display:flex;flex-wrap:wrap;align-items:baseline;gap:8px 14px}.db-focus-score{font-size:32px;line-height:38px;font-weight:700;color:#039855}.db-focus-score.is-fail{color:#d92d20}.db-focus-pill{display:inline-flex;align-items:center;padding:3px 10px;border-radius:9999px;font-size:12px;line-height:18px;font-weight:700}.db-focus-pill.is-pass{background:#ecfdf3;color:#027a48}.db-focus-pill.is-fail{background:#fef3f2;color:#b42318}.db-focus-line{flex:1 1 200px;min-width:0;font-size:13px;line-height:20px;color:#667085;text-wrap:pretty}.db-legend{display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;color:#475467}.db-legend-dash{width:18px;height:0;border-top:2px dashed #00A3FF;display:block}.db-chart{display:flex;gap:10px;min-width:0}.db-chart-y{flex:0 0 34px;position:relative;height:186px}.db-chart-y span{position:absolute;right:0;transform:translateY(-50%);font-size:11px;line-height:16px;color:#98a2b3}.db-chart-area{flex:1;min-width:0;position:relative;height:186px}.db-gridline{position:absolute;left:0;right:0;height:0;border-top:1px solid #F2F4F7;display:block}.db-passline{position:absolute;left:0;right:0;height:0;border-top:2px dashed #00A3FF;display:block}.db-bars{position:absolute;inset:0;display:flex;align-items:flex-end;gap:8px}.db-bar-col{position:relative;flex:1;min-width:0;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:flex-end}.db-bar-value{position:absolute;left:0;right:0;text-align:center;margin-bottom:2px;font-size:13px;line-height:20px;font-weight:700;white-space:nowrap;color:#344054}.db-bar-value.is-active{color:#101828}.db-bar{display:block;width:100%;max-width:72px;border-radius:6px 6px 0 0}.db-tip{position:absolute;left:50%;z-index:5;min-width:168px;padding:10px 12px;border-radius:8px;background:#101828;color:#fff;box-shadow:0 12px 16px -4px #1018282e,0 4px 6px -2px #10182814;font-size:12px;line-height:18px;white-space:nowrap;text-align:left;pointer-events:none;opacity:0;visibility:hidden;transform:translate(-50%,4px);transition:opacity .12s ease,transform .12s ease,visibility .12s}.db-tip.is-start{left:0;transform:translateY(4px)}.db-tip.is-end{left:auto;right:0;transform:translateY(4px)}.db-bar-col:hover .db-tip{opacity:1;visibility:visible;transform:translate(-50%)}.db-bar-col:hover .db-tip.is-start,.db-bar-col:hover .db-tip.is-end{transform:translate(0)}.db-tip-head{font-weight:600;color:#fff}.db-tip-sub{font-weight:400;color:#d0d5dd}.db-tip-score{display:flex;align-items:center;gap:6px;margin:6px 0 8px}.db-tip-dot{width:8px;height:8px;border-radius:9999px;background:#00a3ff;flex:0 0 auto}.db-tip-dot.is-fail{background:#f04438}.db-tip-value{font-size:16px;line-height:24px;font-weight:700}.db-tip-status{margin-left:auto;padding:0 6px;border-radius:9999px;font-size:11px;line-height:18px;font-weight:600;background:#2e91fa33;color:#84caff}.db-tip-status.is-fail{background:#f0443833;color:#fda29b}.db-tip-empty{margin:6px 0 8px;color:#d0d5dd}.db-tip-row{display:flex;justify-content:space-between;gap:16px;padding-top:4px;border-top:1px solid rgba(255,255,255,.08);color:#d0d5dd}.db-tip-row+.db-tip-row{border-top:0;padding-top:2px}.db-tip-row b{font-weight:600;color:#fff}.db-chart-x{display:flex;gap:8px;padding-left:44px}.db-chart-xcol{flex:1;min-width:0;display:flex;flex-direction:column;align-items:center;gap:1px}.db-bar-col.is-pickable,.db-chart-xcol.is-pickable{cursor:pointer}.db-chart-xlabel{font-size:11px;line-height:16px;white-space:nowrap;color:#475467}.db-chart-xlabel.is-active{font-weight:700;color:#101828}.db-chart-x.is-dense .db-chart-xcol{overflow:visible}.db-chart-xcount{font-size:11px;line-height:16px;color:#98a2b3;white-space:nowrap}.db-bandbar{display:flex;height:14px;border-radius:9999px;overflow:hidden;background:#f2f4f7;margin-top:14px}.db-bandseg{display:block;height:14px}.db-bandseg.has-stores{min-width:8px}.db-bandrows{flex:1;display:grid;grid-template-columns:10px minmax(0,1fr) auto auto auto auto;grid-auto-rows:1fr;column-gap:12px;margin-top:12px}.db-bandrow{grid-column:1/-1;display:grid;grid-template-columns:subgrid;align-items:center;min-height:40px;padding:9px 0;border-bottom:1px solid #F2F4F7}.db-bandrow:last-child{border-bottom:0}.db-banddot{grid-column:1}.db-bandlabel{grid-column:2}.db-bandrange{grid-column:3}.db-bandcount{grid-column:4}.db-bandshare{grid-column:5}.db-bandlink{grid-column:6}@media (max-width: 575px){.db-bandrows{grid-template-columns:10px minmax(0,1fr) 0 auto auto auto;column-gap:8px}.db-bandrange{display:none}}.db-banddot{width:10px;height:10px;border-radius:3px;flex-shrink:0;display:block}.db-bandlabel{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px;line-height:20px;font-weight:500;color:#1d2939}.db-bandrange{font-size:12px;line-height:18px;color:#667085;white-space:nowrap;text-align:right}.db-bandcount{font-size:13px;line-height:20px;font-weight:600;color:#101828;text-align:right;white-space:nowrap}.db-bandshare{font-size:12px;line-height:18px;color:#667085;min-width:36px;text-align:right;font-variant-numeric:tabular-nums}.db-bandlink{font-size:12px;line-height:18px;font-weight:600;color:#00a3ff;white-space:nowrap;cursor:pointer}.db-bandlink:hover,.db-bandlink.is-active{color:#009bf3;text-decoration:underline}.db-ledger-head{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:18px 20px}.db-ledger-text{flex:1 1 220px;min-width:0;display:flex;flex-direction:column;gap:2px}.db-bandfilter{display:flex;align-items:center;gap:8px;margin-top:4px;flex-wrap:wrap}.db-bandchip{display:inline-flex;align-items:center;gap:6px;padding:3px 6px 3px 10px;border-radius:9999px;background:#eaf8ff;box-shadow:inset 0 0 0 1px #99dbff;font-size:12px;font-weight:600;white-space:nowrap;color:#009bf3}.db-bandchip-x{width:16px;height:16px;border-radius:9999px;display:flex;align-items:center;justify-content:center;cursor:pointer;background:#ccedff}.db-search{width:240px}.db-search input{font-size:13px}.segmented{display:flex;padding:3px;border-radius:8px;background:#f2f4f7}.segtab{padding:7px 16px;border:none;border-radius:6px;background:transparent;font-family:inherit;font-size:14px;font-weight:500;color:#475467;cursor:pointer;white-space:nowrap}.segtab.segtab-on{background:#fff;color:#101828;box-shadow:0 1px 2px #1018280d}.db-table{width:100%;min-width:1060px;border-collapse:separate;border-spacing:0;margin:0}.db-table thead th{padding:10px 20px;background:#f9fafb;border:0;border-top:1px solid #EAECF0;border-bottom:1px solid #EAECF0;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;white-space:nowrap}.db-table thead th.is-sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.db-table thead th.is-sorted{color:#101828}.db-table tbody td{padding:12px 20px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;color:#344054;vertical-align:middle}.db-table tbody tr:hover td{background:#fcfcfd}.db-nowrap{white-space:nowrap}.db-storeid{font-weight:600;color:#101828;cursor:pointer}.db-storeid:hover{color:#009bf3;text-decoration:underline}.db-pill{display:inline-block;padding:2px 10px;border-radius:9999px;font-size:12px;font-weight:600;white-space:nowrap}.db-pill--strong{padding:3px 10px}.db-actions{display:flex;align-items:center;gap:6px}.db-viewbtn{display:inline-flex;align-items:center;gap:5px;height:28px;padding:0 10px;border-radius:6px;font-size:12px;font-weight:600;color:#009bf3;cursor:pointer;box-shadow:inset 0 0 0 1px #99dbff;white-space:nowrap}.db-viewbtn:hover{background:#eaf8ff;color:#009bf3}.db-pdfbtn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:6px;color:#475467;cursor:pointer;box-shadow:inset 0 0 0 1px #d0d5dd}.db-pdfbtn:hover{background:#f9fafb;color:#344054}.db-pdfbtn.is-disabled{color:#d0d5dd;cursor:not-allowed}.db-pdfbtn.is-disabled:hover{background:transparent;color:#d0d5dd}.db-empty{padding:28px 20px;text-align:center;font-size:13px;color:#667085}.db-pager{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:14px 20px;font-size:13px;color:#475467}.db-pagebtn{width:32px;height:32px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;display:flex;align-items:center;justify-content:center;color:#475467;cursor:pointer}.db-pagebtn:hover:not(:disabled){background:#f9fafb}.db-pagebtn:disabled{color:#d0d5dd;cursor:default}.db-stats{display:grid;grid-template-columns:.9fr 1.6fr 2fr;gap:16px;align-items:stretch}.db-stat{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;overflow:hidden;display:flex;flex-direction:column}.db-stat-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d}.db-stat-big{font-size:30px;line-height:38px;font-weight:600;color:#101828}.db-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.db-stat-body{padding:12px 14px;display:grid;grid-template-columns:1fr;gap:16px}.db-stat-body--2{grid-template-columns:1fr 1fr}.db-stat-body--3{grid-template-columns:repeat(3,1fr)}.db-stat-cell{display:flex;flex-direction:column;gap:2px}.db-stat-mid{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.db-stat-mid.is-underline{text-decoration:underline}.db-stat-sub{font-size:14px;line-height:20px;font-weight:500;color:#344054}.db-stat-delta{display:flex;align-items:center;gap:5px;font-size:12px;color:#d92d20}.db-stat-delta.is-good{color:#039855}.db-stat-delta.is-bad{color:#d92d20}.db-stat-delta.is-flat{color:#667085}.db-stat-delta.is-down svg{transform:scaleY(-1)}.db-perf{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:16px 20px 8px;display:flex;flex-direction:column;gap:16px}.db-perftabs{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.db-perftab{padding:10px 18px;border:none;border-radius:8px;background:transparent;font-family:inherit;font-size:14px;font-weight:500;color:#475467;white-space:nowrap;cursor:pointer}.db-perftab.is-on{background:#eaf8ff;color:#009bf3;font-weight:600}.db-perf-head{display:flex;align-items:flex-start;gap:12px;flex-wrap:wrap}.db-perf-text{display:flex;flex-direction:column;gap:2px}.db-perf-title{display:flex;align-items:center;gap:8px;font-size:20px;line-height:30px;font-weight:600;color:#101828}.db-total{font-size:12px;font-weight:500;border-radius:9999px;padding:2px 10px;background:#eaf8ff;color:#009bf3;white-space:nowrap}.db-perf-search{width:250px}.db-create{gap:6px;padding:0 18px;background:#00a3ff;color:#fff}.db-create:hover:not(:disabled){background:#00a3ff}.db-perftable{width:100%;border-collapse:separate;border-spacing:0;margin:0;table-layout:fixed}.db-perftable thead th{padding:10px 4px;background:#f9fafb;border:0;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;white-space:nowrap}.db-perftable thead th:first-child{border-radius:8px 0 0 8px}.db-perftable thead th:last-child{border-radius:0 8px 8px 0}.db-perftable tbody td{padding:14px 4px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;color:#344054;vertical-align:middle}.db-perftable--audit tbody td{padding:16px 4px}.db-perftable--audit th:nth-child(1){width:28%}.db-perftable--audit th:nth-child(2),.db-perftable--audit th:nth-child(3){width:10%}.db-perftable--audit th:nth-child(4),.db-perftable--audit th:nth-child(5){width:9%}.db-perftable--audit th:nth-child(6){width:18%}.db-perftable--audit th:nth-child(7){width:10%}.db-perftable--audit th:nth-child(8){width:6%}.db-perftable--task tbody td{padding:16px 4px}.db-perftable--task th:nth-child(1){width:22%}.db-perftable--task th:nth-child(2),.db-perftable--task th:nth-child(3){width:7.5%}.db-perftable--task th:nth-child(4),.db-perftable--task th:nth-child(5){width:8.5%}.db-perftable--task th:nth-child(6),.db-perftable--task th:nth-child(7),.db-perftable--task th:nth-child(8){width:6.5%}.db-perftable--task th:nth-child(9){width:15%}.db-perftable--task th:nth-child(10){width:6%}.db-perftable--store th:nth-child(1){width:15%}.db-perftable--store th:nth-child(2){width:10%}.db-perftable--store th:nth-child(3){width:17%}.db-perftable--store th:nth-child(4){width:8%}.db-perftable--store th:nth-child(5){width:7%}.db-perftable--store th:nth-child(6),.db-perftable--store th:nth-child(7),.db-perftable--store th:nth-child(8){width:12%}.db-perftable--store th:nth-child(9){width:7%}.db-perftable--user th:nth-child(1){width:15%}.db-perftable--user th:nth-child(2){width:22%}.db-perftable--user th:nth-child(3){width:9%}.db-perftable--user th:nth-child(4),.db-perftable--user th:nth-child(5){width:6%}.db-perftable--user th:nth-child(6),.db-perftable--user th:nth-child(7),.db-perftable--user th:nth-child(8){width:12%}.db-perftable--user th:nth-child(9){width:5%}.db-table thead th,.db-table tbody td,.db-perftable thead th,.db-perftable tbody td{height:auto!important}.db-table thead th,.db-perftable thead th{font-size:12px!important;font-weight:500!important;background:#f9fafb!important}.db-table thead th{padding:10px 20px!important;border-bottom:1px solid #EAECF0!important;color:#667085!important}.db-table thead th.is-sorted{color:#101828!important}.db-table tbody td{padding:12px 20px!important}.db-perftable thead th{padding:10px 4px!important;border-bottom:0!important;color:#667085!important}.db-perftable thead th.is-sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.db-perftable thead th.is-sorted{color:#101828!important}.db-perftable tbody td{padding:14px 4px!important}.db-perftable--audit tbody td,.db-perftable--task tbody td{padding:16px 4px!important}.db-name{display:flex;align-items:center;gap:10px;min-width:0}.db-avatar{width:34px;height:34px;flex-shrink:0;border-radius:9999px;background:#f2f4f7;color:#475467;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:600}.db-link{font-size:13px;font-weight:500;color:#00a3ff;text-decoration:underline;cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.db-link:hover{color:#009bf3}.db-ulink{color:#00a3ff;text-decoration:underline;cursor:pointer}.db-medium{font-weight:500}.db-score{display:flex;align-items:center;gap:8px}.db-score.is-empty .db-track{display:none}.db-track{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:40px}.db-track>span{display:block;height:100%;border-radius:9999px;background:#00a3ff}.db-track--6{height:6px}.db-scoretext{font-weight:600;white-space:nowrap}.db-scoretext--sm{font-size:12px;color:#475467}.db-eye{width:22px;height:22px;display:inline-flex;align-items:center;justify-content:center;color:#98a2b3;cursor:pointer}.db-eye:hover{color:#00a3ff}.db-perf-pager{display:flex;align-items:center;justify-content:center;gap:10px;padding:12px 4px;font-size:13px;color:#475467}.db-pagebox{display:inline-flex;align-items:center;padding:4px 12px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd}.db-page{display:inline-flex;align-items:center;padding:4px 12px;border-radius:8px}.db-page.is-active{background:#eaf8ff;color:#009bf3;font-weight:600}.filter-backdrop{position:fixed;inset:0;background:#10182873;z-index:1050}.filter-drawer{position:fixed;top:0;right:0;bottom:0;width:860px;max-width:96vw;display:flex;flex-direction:column;background:#fff;box-shadow:-10px 0 30px #1018282e;z-index:1051;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.drawer-head{display:flex;align-items:center;gap:10px;padding:18px 20px;box-shadow:inset 0 -1px #eaecf0}.drawer-title{font-size:17px;line-height:26px;font-weight:700;color:#101828}.closebtn{width:32px;height:32px;border:none;border-radius:8px;background:transparent;color:#667085;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.closebtn:hover{background:#f2f4f7;color:#344054}.drawer-body{display:flex;flex:1;min-height:0}.drawer-nav{flex:0 0 280px;max-width:280px;background:#f9fafb;box-shadow:inset -1px 0 #eaecf0;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:4px}.drawer-navitem{display:flex;align-items:center;gap:10px;width:100%;padding:12px 14px;border:none;border-radius:8px;background:transparent;text-align:left;font-family:inherit;cursor:pointer}.drawer-navitem:hover{background:#fff}.drawer-navitem.navitem-active{background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d}.navtext{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.navtitle{font-size:13px;line-height:20px;font-weight:600;color:#101828}.navvalue{font-size:13px;line-height:20px;color:#667085;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.navvalue.is-dirty{color:#009bf3}.dirtydot{width:8px;height:8px;border-radius:9999px;background:#00a3ff;flex-shrink:0;display:block}.drawer-pane{flex:1;min-width:0;overflow-y:auto;padding:24px 28px;display:flex;flex-direction:column;gap:6px}.panetitle{font-size:17px;line-height:26px;font-weight:700;color:#101828}.panehint{font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.pane-options{display:flex;flex-direction:column;gap:10px;margin-top:14px}.pane-option{display:flex;align-items:flex-start;gap:12px;padding:14px 16px;border-radius:8px;cursor:pointer;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0}.pane-option.is-on{background:#f5fbff;box-shadow:inset 0 0 0 1.5px #00a3ff}.pane-radio{width:18px;height:18px;flex-shrink:0;margin-top:2px;border-radius:9999px;display:flex;align-items:center;justify-content:center;box-shadow:inset 0 0 0 1px #d0d5dd}.pane-radio>span{width:8px;height:8px;border-radius:9999px;background:transparent;display:block}.pane-radio.is-on{box-shadow:inset 0 0 0 1.5px #00a3ff}.pane-radio.is-on>span{background:#00a3ff}.pane-option-text{display:flex;flex-direction:column;gap:2px}.pane-option-label{font-size:14px;line-height:20px;font-weight:600;color:#101828}.pane-option-help{font-size:13px;line-height:20px;color:#667085}.pane-list{display:flex;flex-direction:column;gap:2px;margin-top:14px}.pane-stack{display:flex;flex-direction:column;gap:16px;margin-top:14px}.pane-fields{display:flex;align-items:flex-end;gap:14px;flex-wrap:wrap;margin-top:14px}.pane-resetbtn{align-self:flex-start;margin-top:12px}.field{display:flex;flex-direction:column;gap:6px}.field--full{max-width:420px}.field-label{font-size:12px;line-height:18px;font-weight:600;color:#344054}.field-meta{font-weight:400;color:#667085;margin-left:6px}.field-select{width:100%}.readingrow{display:flex;align-items:center;gap:12px;padding:12px 14px;border-radius:8px;background:#f9fafb;box-shadow:inset 0 0 0 1px #eaecf0;font-size:13px}.readinglabel{font-weight:600;color:#344054}.readingvalue{color:#101828}.optionrow{display:flex;align-items:center;gap:10px;width:100%;padding:11px 12px;border:none;border-radius:8px;background:transparent;text-align:left;font-family:inherit;cursor:pointer}.optionrow:hover{background:#f9fafb}.optionrow.option-selected{background:#eaf8ff}.optionrow.option-selected .optlabel{font-weight:600}.optionmark{display:flex;align-items:center;justify-content:center;width:18px;height:18px;flex-shrink:0;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#fff}.optionmark.mark-on{background:#00a3ff;box-shadow:none}.opttext{flex:1;min-width:0;display:flex;flex-direction:column}.optlabel{font-size:13px;line-height:20px;font-weight:500;color:#1d2939}.optmeta{font-size:11px;line-height:16px;color:#667085}.drawer-foot{display:flex;align-items:center;gap:10px;padding:14px 20px;box-shadow:inset 0 1px #eaecf0}.db-bandhint{margin-top:4px;font-size:12px;color:#667085}.db-bandhint b{color:#344054;font-weight:600}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i3.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { 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.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: i7.DaterangepickerDirective, selector: "input[ngxDaterangepickerMd]", inputs: ["minDate", "maxDate", "autoApply", "alwaysShowCalendars", "showCustomRangeLabel", "linkedCalendars", "dateLimit", "singleDatePicker", "showWeekNumbers", "showISOWeekNumbers", "showDropdowns", "isInvalidDate", "isCustomDate", "isTooltipDate", "showClearButton", "customRangeDirection", "ranges", "opens", "drops", "firstMonthDayClass", "lastMonthDayClass", "emptyWeekRowClass", "emptyWeekColumnClass", "firstDayOfNextMonthClass", "lastDayOfPreviousMonthClass", "keepCalendarOpeningWithRange", "showRangeLabelOnInput", "showCancel", "lockStartDate", "timePicker", "timePicker24Hour", "timePickerIncrement", "timePickerSeconds", "closeOnAutoApply", "endKeyHolder", "startKey", "locale", "endKey"], outputs: ["change", "rangeClicked", "datesUpdated", "startDateChanged", "endDateChanged", "clearClicked"] }, { kind: "directive", type: i8.AuditV2TipDirective, selector: "[av2Tip]", inputs: ["av2Tip"] }, { kind: "component", type: i9.AuditV2ShimmerComponent, selector: "lib-audit-v2-shimmer", inputs: ["rows"] }, { kind: "component", type: i10.AuditV2SelectComponent, selector: "lib-audit-v2-select", inputs: ["options", "placeholder", "searchable", "ariaLabel", "disabled", "value"], outputs: ["changed"] }, { kind: "component", type: i11.AuditV2SortIconComponent, selector: "lib-audit-v2-sort-icon", inputs: ["active", "dir"] }] });
1524
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AuditV2DashboardComponent, selector: "lib-audit-v2-dashboard", ngImport: i0, template: "<div class=\"av2-page audit-dash\">\r\n\r\n <!-- Refresh line + module switch -->\r\n <div class=\"db-topline\">\r\n <div class=\"db-refresh\">Last refreshed at {{ lastRefreshed }}</div>\r\n <div class=\"av2-grow\"></div>\r\n <div class=\"moduleswitch\">\r\n <button type=\"button\" class=\"moduletab\" *ngFor=\"let t of moduleTabs\" [class.moduletab-on]=\"moduleTab === t\"\r\n (click)=\"setModuleTab(t)\">{{ t }}</button>\r\n </div>\r\n </div>\r\n\r\n <!-- ============ AUDIT SCORECARD ============ -->\r\n <ng-container *ngIf=\"!isTaskModule\">\r\n\r\n <!-- Crumb, scope title, actions -->\r\n <div class=\"db-scopebar\">\r\n <div class=\"db-scopetext\">\r\n <div class=\"db-crumb\">Audits \u203A Dashboard</div>\r\n <div class=\"db-scope\">{{ scopeLabel }}</div>\r\n </div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"openFilters()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <line x1=\"4\" y1=\"7\" x2=\"20\" y2=\"7\"></line>\r\n <line x1=\"7\" y1=\"12\" x2=\"17\" y2=\"12\"></line>\r\n <line x1=\"10\" y1=\"17\" x2=\"14\" y2=\"17\"></line>\r\n </svg>\r\n Filters\r\n <span class=\"db-countpill\" *ngIf=\"filterCount\">{{ filterCount }}</span>\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" [disabled]=\"loading || !filteredRows.length\"\r\n title=\"Download the store list below as an Excel file\" (click)=\"exportStores()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 16V4\"></path>\r\n <polyline points=\"7 9 12 4 17 9\"></polyline>\r\n <path d=\"M4 16v4h16v-4\"></path>\r\n </svg>\r\n Export\r\n </button>\r\n </div>\r\n\r\n <!-- Filter chips -->\r\n <div class=\"db-chips\">\r\n <button type=\"button\" class=\"db-chip\" *ngFor=\"let c of filterCats; trackBy: trackByCat\" [class.is-dirty]=\"c.dirty\"\r\n (click)=\"openFilters(c.key)\">\r\n <span class=\"db-chip-label\">{{ c.label }}</span>\r\n <span class=\"db-chip-value\">{{ c.value }}</span>\r\n </button>\r\n <button type=\"button\" class=\"db-clearall\" *ngIf=\"filterCount\" (click)=\"clearAll()\">Clear all</button>\r\n </div>\r\n\r\n <!-- KPI tiles -->\r\n <div class=\"db-kpis\">\r\n <!-- Old Checklist summary card: figure + label in the gradient strip, note below. -->\r\n <div class=\"av2-ocard\" *ngFor=\"let kpi of kpis\">\r\n <div class=\"av2-ocard-head\">\r\n <div class=\"av2-ocard-count\">\r\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!loading\">{{ kpi.value }}</ng-container>\r\n </div>\r\n <div class=\"av2-ocard-text\">{{ kpi.label }}</div>\r\n </div>\r\n <div class=\"av2-ocard-body\">\r\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--note\"></span>\r\n <div *ngIf=\"!loading\" class=\"av2-ocard-note\" [style.color]=\"kpi.noteColor\">{{ kpi.note }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Trend + distribution -->\r\n <div class=\"db-duo\">\r\n <!-- Trend -->\r\n <section class=\"db-card\">\r\n <div class=\"db-card-head db-card-head--wrap\">\r\n <div class=\"db-card-title db-card-title--grow\">Audit score trend</div>\r\n <div class=\"db-seg\">\r\n <button type=\"button\" class=\"db-seg-tab\" [class.is-on]=\"grain === 'quarter'\" (click)=\"setGrain('quarter')\">Quarterly</button>\r\n <button type=\"button\" class=\"db-seg-tab\" [class.is-on]=\"grain === 'date'\" (click)=\"setGrain('date')\">By date</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-daterow\" *ngIf=\"grain === 'date'\">\r\n <div class=\"av2-datepick\">\r\n <svg class=\"av2-datepick-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\r\n <input type=\"text\" class=\"av2-datepick-input db-daterange\" ngxDaterangepickerMd readonly autocomplete=\"off\"\r\n placeholder=\"Select date range\" [(ngModel)]=\"range\" [locale]=\"pickerLocale\" [maxDate]=\"today\"\r\n [dateLimit]=\"maxRangeDays\" [ranges]=\"ranges\" [showCustomRangeLabel]=\"true\" [alwaysShowCalendars]=\"false\"\r\n [keepCalendarOpeningWithRange]=\"true\" [autoApply]=\"true\" [showCancel]=\"false\" [drops]=\"'down'\" [opens]=\"'right'\"\r\n (datesUpdated)=\"onRangePicked($event)\">\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"trendLoading\">\r\n <span class=\"av2-sk av2-sk--title\"></span>\r\n <span class=\"av2-sk av2-sk--block db-sk-chart\"></span>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!trendLoading\">\r\n <div class=\"db-focus\">\r\n <span class=\"db-focus-score\" [class.is-fail]=\"!focusPassed\">{{ focusScore }}</span>\r\n <span class=\"db-focus-pill\" [class.is-pass]=\"focusPassed\" [class.is-fail]=\"!focusPassed\">{{ focusStatus }}</span>\r\n <span class=\"db-focus-line\">{{ focusLine }}</span>\r\n </div>\r\n\r\n <div class=\"db-legend\">\r\n <span class=\"db-legend-dash\"></span>Pass mark {{ passMark }}%\r\n </div>\r\n\r\n <div class=\"db-chart\">\r\n <div class=\"db-chart-y\">\r\n <span style=\"top:0\">100%</span>\r\n <span style=\"top:50%\">50%</span>\r\n <span style=\"top:100%\">0%</span>\r\n </div>\r\n <div class=\"db-chart-area\">\r\n <span class=\"db-gridline\" style=\"top:0\"></span>\r\n <span class=\"db-gridline\" style=\"top:50%\"></span>\r\n <span class=\"db-gridline\" style=\"top:100%\"></span>\r\n <span class=\"db-passline\" [style.top.%]=\"100 - passMark\"></span>\r\n <div class=\"db-bars\">\r\n <div class=\"db-bar-col\" *ngFor=\"let bar of trendBars; let first = first; let last = last\"\r\n [class.is-pickable]=\"grain === 'quarter'\" (click)=\"selectQuarter(bar.key)\">\r\n <span class=\"db-bar-value\" *ngIf=\"!denseTrend\" [class.is-active]=\"bar.key === quarter\" [style.bottom]=\"barHeight(bar)\">\r\n {{ bar.value === null ? '\u2014' : bar.value + '%' }}\r\n </span>\r\n <span class=\"db-bar\" [style.height]=\"barHeight(bar)\" [style.background]=\"barFill(bar)\"></span>\r\n\r\n <div class=\"db-tip\" [class.is-start]=\"first && !last\" [class.is-end]=\"last && !first\" [style.bottom]=\"tipBottom(bar)\">\r\n <div class=\"db-tip-head\">\r\n {{ bar.label }}<span class=\"db-tip-sub\" *ngIf=\"grain === 'quarter'\"> \u00B7 {{ quarterMonths(bar.key) }}</span>\r\n </div>\r\n <div class=\"db-tip-score\" *ngIf=\"bar.value !== null\">\r\n <span class=\"db-tip-dot\" [class.is-fail]=\"bar.value < passMark\"></span>\r\n <span class=\"db-tip-value\">{{ bar.value }}%</span>\r\n <span class=\"db-tip-status\" [class.is-fail]=\"bar.value < passMark\">\r\n {{ bar.value >= passMark ? 'Pass' : 'Below pass mark' }}\r\n </span>\r\n </div>\r\n <div class=\"db-tip-empty\" *ngIf=\"bar.value === null\">No scored audits</div>\r\n <div class=\"db-tip-row\"><span>Audits completed</span><b>{{ bar.submitted }}</b></div>\r\n <div class=\"db-tip-row\" *ngIf=\"bar.count !== bar.submitted\"><span>Scored audits</span><b>{{ bar.count }}</b></div>\r\n <div class=\"db-tip-row\"><span>Pass mark</span><b>{{ passMark }}%</b></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- A month by date has ~30 bars: every few days get a label (first and last always), and the audit counts\r\n move to the bar tooltip, so the labels never run into each other. -->\r\n <div class=\"db-chart-x\" [class.is-dense]=\"denseTrend\">\r\n <span class=\"db-chart-xcol\" *ngFor=\"let bar of trendBars; let i = index; let last = last\" [class.is-pickable]=\"grain === 'quarter'\" (click)=\"selectQuarter(bar.key)\">\r\n <span class=\"db-chart-xlabel\" [class.is-active]=\"bar.key === quarter\" [style.visibility]=\"showXLabel(i, last) ? 'visible' : 'hidden'\">{{ bar.label }}</span>\r\n <span class=\"db-chart-xcount\" *ngIf=\"!denseTrend\">{{ bar.submitted ? bar.submitted + ' audits' : 'no audits' }}</span>\r\n </span>\r\n </div>\r\n </ng-container>\r\n </section>\r\n\r\n <!-- Score bands -->\r\n <section class=\"db-card db-card--tight\">\r\n <div class=\"db-card-head db-card-head--baseline\">\r\n <div class=\"db-card-title db-card-title--grow\">Score distribution</div>\r\n <div class=\"db-card-sub\">{{ storesInScope }} in scope</div>\r\n </div>\r\n <div class=\"db-card-sub\">Stores by score band, {{ periodLabel }}</div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"loading\" [rows]=\"2\"></lib-audit-v2-shimmer>\r\n\r\n <div class=\"db-bandbar\" *ngIf=\"!loading\">\r\n <!-- A band with stores keeps a visible sliver (2 of 3576 stores is under a pixel); the largest band gives way. -->\r\n <span class=\"db-bandseg\" *ngFor=\"let b of bandRows; trackBy: trackByBand\" [style.width]=\"b.width\" [style.background]=\"b.band.soft\"\r\n [class.has-stores]=\"b.count > 0\" [title]=\"b.band.label + ': ' + b.count\"></span>\r\n </div>\r\n\r\n <div class=\"db-bandrows\" *ngIf=\"!loading\">\r\n <div class=\"db-bandrow\" *ngFor=\"let b of bandRows; trackBy: trackByBand\">\r\n <span class=\"db-banddot\" [style.background]=\"b.band.soft\"></span>\r\n <span class=\"db-bandlabel\">{{ b.band.label }}</span>\r\n <span class=\"db-bandrange\">{{ b.band.range }}</span>\r\n <span class=\"db-bandcount\">{{ b.count }} {{ b.count === 1 ? 'store' : 'stores' }}</span>\r\n <span class=\"db-bandshare\">{{ b.share }}</span>\r\n <a class=\"db-bandlink\" [class.is-active]=\"storeListOpen && listBandKey === b.band.key\" (click)=\"applyBand(b.band)\">View stores</a>\r\n </div>\r\n </div>\r\n <div class=\"db-bandhint\" *ngIf=\"!loading && !showStoreList\">Click <b>View stores</b> on a band to list its stores.</div>\r\n </section>\r\n </div>\r\n\r\n <!-- Store ledger: opened from Score distribution -> View stores (or a Filters score range) -->\r\n <section class=\"db-card db-card--table\" id=\"ad-store-list\" *ngIf=\"showStoreList\">\r\n <div class=\"db-ledger-head\">\r\n <div class=\"db-ledger-text\">\r\n <div class=\"db-card-title\">Store list</div>\r\n <div class=\"db-card-sub\">\r\n {{ filteredRows.length }} {{ filteredRows.length === 1 ? 'store' : 'stores' }} \u00B7 {{ periodLabel }}\r\n </div>\r\n <div class=\"db-bandfilter\" *ngIf=\"listChipLabel\">\r\n <span class=\"db-bandchip\">\r\n {{ listChipLabel }}\r\n <span class=\"db-bandchip-x\" title=\"Close the store list\" (click)=\"closeStoreList()\">\r\n <svg width=\"9\" height=\"9\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </span>\r\n </span>\r\n <a class=\"db-bandlink\" (click)=\"showAllStores()\">Show all stores</a>\r\n </div>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <label class=\"av2-search db-search\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input [(ngModel)]=\"search\" (ngModelChange)=\"onSearch()\" type=\"text\" placeholder=\"Search store or owner\"\r\n autocomplete=\"off\" />\r\n </label>\r\n <div class=\"segmented\">\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'all'\" (click)=\"setStatus('all')\">All</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'fail'\" (click)=\"setStatus('fail')\">Fail</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'pass'\" (click)=\"setStatus('pass')\">Pass</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'na'\" (click)=\"setStatus('na')\">Not audited</button>\r\n </div>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"loading\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!loading\">\r\n <div class=\"av2-table-wrap\">\r\n <table class=\"db-table\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let h of headers\" class=\"is-sortable\" [class.is-sorted]=\"sortKey === h.key\" (click)=\"sortBy(h.key)\">\r\n {{ h.label }} <lib-audit-v2-sort-icon [active]=\"sortKey === h.key\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon>\r\n </th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of pageRows; trackBy: trackByStore\">\r\n <td class=\"db-nowrap\">{{ row.date }}</td>\r\n <td>\r\n <a class=\"db-storeid\" routerLink=\"/manage/trax/audit-v2/dashboard/store\"\r\n [queryParams]=\"detailParams({ store: row.raw?.storeId || row.storeId })\">{{ row.storeId }}</a>\r\n </td>\r\n <td class=\"av2-ellipsis\">{{ row.circle }}</td>\r\n <td class=\"av2-ellipsis\">{{ row.zone }}</td>\r\n <td class=\"av2-ellipsis\">{{ row.aom }}</td>\r\n <td>\r\n <span class=\"db-pill\" [style.background]=\"bandFor(row).bg\" [style.color]=\"bandFor(row).fg\">\r\n {{ row.score === null ? '\u2014' : row.score + '%' }}\r\n </span>\r\n </td>\r\n <td>\r\n <span class=\"db-pill\" [style.background]=\"bandFor(row).bg\" [style.color]=\"bandFor(row).fg\">\r\n {{ statusLabel(row) }}\r\n </span>\r\n </td>\r\n <td>\r\n <div class=\"db-actions\">\r\n <!-- View opens the Gallery on the store's latest submitted audit in the period (QA 11 Oct); a store\r\n with no submission there opens its audit detail instead (same as the store link). -->\r\n <a class=\"db-viewbtn\" *ngIf=\"galleryAuditId(row) as auditId\" routerLink=\"/manage/trax/audit-v2/gallery\"\r\n [queryParams]=\"detailParams({ audit: auditId, store: row.raw?.storeId || row.storeId })\" title=\"View this store's submissions in the Gallery\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n View\r\n </a>\r\n <a class=\"db-viewbtn\" *ngIf=\"!galleryAuditId(row)\" routerLink=\"/manage/trax/audit-v2/dashboard/store\"\r\n [queryParams]=\"detailParams({ store: row.raw?.storeId || row.storeId })\" title=\"View this store's audits\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n View\r\n </a>\r\n <!-- PDF of the store's latest submitted audit in the period (queued, then under Notifications > Downloads). -->\r\n <a class=\"db-pdfbtn\" role=\"button\" [class.is-disabled]=\"!pdfVisitId(row)\"\r\n [attr.aria-disabled]=\"!pdfVisitId(row)\" (click)=\"downloadPdf(row)\"\r\n [title]=\"pdfVisitId(row) ? 'Download the PDF report of the latest submitted audit for this store' : 'No submitted audit for this store in this period'\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 4v12\"></path>\r\n <polyline points=\"7 11 12 16 17 11\"></polyline>\r\n <path d=\"M4 20h16\"></path>\r\n </svg>\r\n </a>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"!pageRows.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">No stores match the current filters.</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Shared pager (10 / 20 / 30), as on the other audit lists. -->\r\n <div class=\"db-perf-pager\" *ngIf=\"filteredRows.length\">\r\n <lib-pagination [itemsPerPage]=\"pageSize\" [pageSize]=\"pageSize\" [paginationSizes]=\"pageSizes\"\r\n [currentPage]=\"page\" [totalItems]=\"filteredRows.length\" (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </ng-container>\r\n </section>\r\n </ng-container>\r\n\r\n <!-- ============ TASK SUMMARY ============ -->\r\n <!-- Tasks raised from this client's audits, in the header scope (shimmer values while loading). -->\r\n <div class=\"db-stats\" *ngIf=\"isTaskModule\">\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.activeTasks }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Active {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body\">\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.taskInstances }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">{{ moduleTab }} Instances</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.notSubmitted }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Not Submitted {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body db-stat-body--2\">\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.openTasks }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Open {{ moduleTab }}s</div>\r\n </div>\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.inProgress }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">In Progress {{ moduleTab }}s</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.submitted }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Submitted {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body db-stat-body--3\">\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.completionScore }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Completion Score</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.completionDelta\" [ngClass]=\"taskDeltaClass('completion')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.completionDelta }}\r\n </div>\r\n </div>\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.complianceScore }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Compliance Score</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.complianceDelta\" [ngClass]=\"taskDeltaClass('compliance')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.complianceDelta }}\r\n </div>\r\n </div>\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid is-underline\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.totalFlags }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Total Flags</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.flagsDelta\" [ngClass]=\"taskDeltaClass('flags')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.flagsDelta }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ============ PERFORMANCE ============ -->\r\n <section class=\"db-perf\">\r\n <div class=\"db-perftabs\">\r\n <button type=\"button\" class=\"db-perftab\" *ngFor=\"let t of perfTabs\" [class.is-on]=\"perfTab === t\"\r\n (click)=\"setPerfTab(t)\">{{ perfTabDisplay(t) }}</button>\r\n </div>\r\n\r\n <div class=\"db-perf-head\">\r\n <div class=\"db-perf-text\">\r\n <div class=\"db-perf-title\">\r\n {{ perfInfoTitle }}\r\n <span class=\"db-total\">\r\n {{ perfTab === 'Audit' ? (isTaskModule ? filteredTaskPerf.length : filteredAuditPerf.length) : (perfTab === 'Store' ? filteredStorePerf.length : filteredUserPerf.length) }} Total\r\n </span>\r\n </div>\r\n <div class=\"db-card-sub\">{{ perfPeriod }}</div>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <label class=\"av2-search db-perf-search\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input type=\"text\" [placeholder]=\"perfSearchPlaceholder\" [(ngModel)]=\"perfSearch\" (ngModelChange)=\"onPerfSearch()\">\r\n </label>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" [disabled]=\"perfLoading || !perfRowCount\"\r\n title=\"Download this table as an Excel file\" (click)=\"exportPerformance()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 16V4\"></path>\r\n <polyline points=\"7 9 12 4 17 9\"></polyline>\r\n <path d=\"M4 16v4h16v-4\"></path>\r\n </svg>\r\n Export\r\n </button>\r\n <button type=\"button\" class=\"av2-btn db-create\" *ngIf=\"perfTab === 'Audit' && access.canAdd\" routerLink=\"/manage/trax/audit-v2/manage\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\"><path d=\"M12 5v14M5 12h14\"></path></svg>\r\n {{ perfCreateLabel }}\r\n </button>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"perfLoading\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!perfLoading\">\r\n <!-- Audit Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Audit' && !isTaskModule\">\r\n <table class=\"db-perftable db-perftable--audit\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of auditPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredAuditPerf); trackBy: trackByPerfAudit\">\r\n <td>\r\n <div class=\"db-name\">\r\n <span class=\"db-avatar\">{{ row.initials }}</span>\r\n <a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id })\">{{ row.name }}</a>\r\n </div>\r\n </td>\r\n <td>{{ row.assigned }}</td>\r\n <td>\r\n <!-- Opens the audit's detail page (as the eye does) on its submitted visits, as the v1 Checklist dashboard did. -->\r\n <a *ngIf=\"row.submitted\" class=\"db-ulink\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id, status: 'submit' })\"\r\n title=\"View the submitted visits\">{{ row.submitted }}</a>\r\n <span *ngIf=\"!row.submitted\">0</span>\r\n </td>\r\n <!-- Store disputes (questions) in the period, as a plain count (QA 10 Oct: no link). -->\r\n <td>\r\n <span *ngIf=\"row.disputes === null\" class=\"av2-faint\">\u2014</span>\r\n <span *ngIf=\"row.disputes !== null\">{{ row.disputes }}</span>\r\n </td>\r\n <td>{{ row.passMark }}</td>\r\n <td>\r\n <div class=\"db-score\" [class.is-empty]=\"row.score === '\u2014'\"\r\n [title]=\"row.score === '\u2014' ? 'Compliance score is off for this audit' : ''\">\r\n <span class=\"db-track db-track--6\"><span [style.width]=\"barWidth(row.scorePct)\"\r\n [style.background]=\"row.result === 'Pass' ? '#12B76A' : '#F04438'\"></span></span>\r\n <span class=\"db-scoretext\">{{ row.score }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <span *ngIf=\"row.result !== '\u2014'\" class=\"db-pill db-pill--strong\" [style.background]=\"row.result === 'Pass' ? '#ECFDF3' : '#FEF3F2'\"\r\n [style.color]=\"row.result === 'Pass' ? '#027A48' : '#B42318'\">{{ row.result }}</span>\r\n <span *ngIf=\"row.result === '\u2014'\" class=\"av2-faint\" title=\"Compliance score is off for this audit\">\u2014</span>\r\n </td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View audit\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredAuditPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No audit matches this search.' : 'There is no result for Audit Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Task Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Audit' && isTaskModule\">\r\n <table class=\"db-perftable db-perftable--task\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of taskPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredTaskPerf); trackBy: trackByPerfTask\">\r\n <td>\r\n <div class=\"db-name\">\r\n <span class=\"db-avatar\">{{ row.initials }}</span>\r\n <a class=\"db-link\" [title]=\"row.raw?.auditName ? 'Raised from ' + row.raw.auditName : ''\">{{ row.name }}</a>\r\n </div>\r\n </td>\r\n <td>{{ row.scheduled }}</td>\r\n <td class=\"db-medium\">{{ row.coverage }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>\r\n <!-- Opens the Gallery (Type Task) on this task's submissions in the dashboard period. -->\r\n <a *ngIf=\"row.submitted && row.raw?.taskId\" class=\"db-ulink\" routerLink=\"/manage/trax/audit-v2/gallery\"\r\n [queryParams]=\"taskSubmittedParams(row)\" title=\"View the submitted tasks in the Gallery\">{{ row.submitted }}</a>\r\n <span *ngIf=\"!row.submitted || !row.raw?.taskId\">{{ row.submitted }}</span>\r\n </td>\r\n <td><a class=\"db-ulink\">{{ row.flags }}</a></td>\r\n <td class=\"av2-faint\">{{ row.tasks }}</td>\r\n <td><a class=\"db-ulink\">{{ row.redo }}</a></td>\r\n <td>\r\n <div class=\"db-score\" [class.is-empty]=\"row.compliance === '\u2014'\">\r\n <span class=\"db-track db-track--6\"><span [style.width]=\"barWidth(row.compliancePct)\"></span></span>\r\n <span class=\"db-scoretext\">{{ row.compliance }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <!-- Opens the audit the task was raised from. -->\r\n <a class=\"db-eye\" title=\"View the audit this task was raised from\"\r\n [routerLink]=\"row.raw?.auditId ? '/manage/trax/audit-v2/dashboard/audit' : null\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.auditId })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredTaskPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">No tasks raised from audits in this period.</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Store Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Store'\">\r\n <table class=\"db-perftable db-perftable--store\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of storePerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredStorePerf); trackBy: trackByPerfStore\">\r\n <td>\r\n <a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/store\" [queryParams]=\"detailParams({ store: row.storeId || row.store })\">{{ row.store }}</a>\r\n </td>\r\n <td class=\"av2-ellipsis av2-dim\" [av2Tip]=\"row.storeId\">{{ row.storeId || '\u2014' }}</td>\r\n <td class=\"av2-ellipsis av2-dim\">{{ row.spoc }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>{{ row.flags ?? '\u2014' }}</td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.completion === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.completion)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.completion }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.compliance === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.compliance)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.compliance }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.perf === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.perf)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.perf }}</span></div></td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View store\" routerLink=\"/manage/trax/audit-v2/dashboard/store\" [queryParams]=\"detailParams({ store: row.storeId || row.store })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredStorePerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No store matches this search.' : 'There is no result for Store Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- User Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'User'\">\r\n <table class=\"db-perftable db-perftable--user\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of userPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredUserPerf); trackBy: trackByPerfUser\">\r\n <td class=\"av2-ellipsis\"><a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/user\" [queryParams]=\"detailParams({ email: row.email })\">{{ row.name }}</a></td>\r\n <td class=\"av2-ellipsis av2-dim\">{{ row.email }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>{{ row.flags }}</td>\r\n <td>{{ row.redo }}</td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.completion === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.completion)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.completion }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.compliance === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.compliance)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.compliance }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.perf === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.perf)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.perf }}</span></div></td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View user\" routerLink=\"/manage/trax/audit-v2/dashboard/user\" [queryParams]=\"detailParams({ email: row.email })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredUserPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No user matches this search.' : 'There is no result for User Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Shared pager (10 / 20 / 30), as on the other audit lists. -->\r\n <div class=\"db-perf-pager\" *ngIf=\"perfTotal\">\r\n <lib-pagination [itemsPerPage]=\"perfPageSize\" [pageSize]=\"perfPageSize\" [paginationSizes]=\"perfPageSizes\"\r\n [currentPage]=\"perfPage\" [totalItems]=\"perfTotal\" (pageChange)=\"onPerfPage($event)\"\r\n (pageSizeChange)=\"onPerfPageSize($event)\"></lib-pagination>\r\n </div>\r\n </ng-container>\r\n </section>\r\n\r\n <!-- ============ FILTER DRAWER ============ -->\r\n <div class=\"filter-backdrop\" *ngIf=\"filtersOpen\" (click)=\"cancelFilters()\"></div>\r\n\r\n <div class=\"filter-drawer\" *ngIf=\"filtersOpen && draft as dr\">\r\n <div class=\"drawer-head\">\r\n <span class=\"drawer-title\">Filters</span>\r\n <span class=\"db-countpill\" *ngIf=\"dr.filterCount\">{{ dr.filterCount }}</span>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"closebtn\" (click)=\"cancelFilters()\" title=\"Close\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-body\">\r\n <div class=\"drawer-nav\">\r\n <button type=\"button\" class=\"drawer-navitem\" *ngFor=\"let c of dr.filterCats; trackBy: trackByCat\" [class.navitem-active]=\"activeCat === c.key\"\r\n (click)=\"selectCat(c.key)\">\r\n <span class=\"navtext\">\r\n <span class=\"navtitle\">{{ c.label }}</span>\r\n <span class=\"navvalue\" [class.is-dirty]=\"c.dirty\">{{ c.value }}</span>\r\n </span>\r\n <span class=\"dirtydot\" *ngIf=\"c.dirty\"></span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-pane\">\r\n <div class=\"panetitle\">{{ dr.activeCatObj.title }}</div>\r\n <div class=\"panehint\">{{ dr.activeCatObj.sub }}</div>\r\n\r\n <!-- Period -->\r\n <ng-container *ngIf=\"activeCat === 'period'\">\r\n <div class=\"pane-options\">\r\n <div class=\"pane-option\" [class.is-on]=\"dr.grain === 'quarter'\" (click)=\"dr.setGrain('quarter')\">\r\n <span class=\"pane-radio\" [class.is-on]=\"dr.grain === 'quarter'\"><span></span></span>\r\n <span class=\"pane-option-text\">\r\n <span class=\"pane-option-label\">Quarterly</span>\r\n <span class=\"pane-option-help\">Read one financial quarter (April\u2013March year) at a time.</span>\r\n </span>\r\n </div>\r\n <div class=\"pane-option\" [class.is-on]=\"dr.grain === 'date'\" (click)=\"dr.setGrain('date')\">\r\n <span class=\"pane-radio\" [class.is-on]=\"dr.grain === 'date'\"><span></span></span>\r\n <span class=\"pane-option-text\">\r\n <span class=\"pane-option-label\">By date</span>\r\n <span class=\"pane-option-help\">Pick a custom start and end date.</span>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"pane-list\" *ngIf=\"dr.grain === 'quarter'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let q of dr.quarters\" [class.option-selected]=\"dr.quarter === q\"\r\n (click)=\"dr.selectQuarter(q)\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.quarter === q\">\r\n <svg *ngIf=\"dr.quarter === q\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">{{ q }} \u00B7 {{ quarterMonths(q) }}</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"pane-fields\" *ngIf=\"dr.grain === 'date'\">\r\n <div class=\"field\">\r\n <span class=\"field-label\">Date range</span>\r\n <div class=\"av2-datepick av2-datepick--compact\">\r\n <svg class=\"av2-datepick-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\r\n <input type=\"text\" class=\"av2-datepick-input db-daterange db-daterange--field\" ngxDaterangepickerMd readonly\r\n autocomplete=\"off\" placeholder=\"Select date range\" [(ngModel)]=\"dr.range\" [locale]=\"pickerLocale\"\r\n [maxDate]=\"today\" [dateLimit]=\"maxRangeDays\" [autoApply]=\"true\" [alwaysShowCalendars]=\"true\" [showCancel]=\"false\"\r\n [drops]=\"'down'\" [opens]=\"'right'\" (datesUpdated)=\"dr.onRangePicked($event)\">\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Scope -->\r\n <ng-container *ngIf=\"activeCat === 'scope'\">\r\n <div class=\"pane-stack\">\r\n <div class=\"field field--full\">\r\n <span class=\"field-label\">Circle Head <span class=\"field-meta\">{{ dr.circles.length }} users</span></span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.circle\" (ngModelChange)=\"dr.onCircleChange()\" [options]=\"dr.pickOptions(dr.circles, 'All Circles')\" ariaLabel=\"Circle\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.circle\">\r\n <span class=\"field-label\">Zone Manager</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.zone\" (ngModelChange)=\"dr.onZoneChange()\" [options]=\"dr.pickOptions(dr.zones, 'All zones')\" ariaLabel=\"Zone\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.zone\">\r\n <span class=\"field-label\">AOM</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.aom\" (ngModelChange)=\"dr.onAomChange()\" [options]=\"dr.pickOptions(dr.aoms, 'All AOMs')\" ariaLabel=\"AOM\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.aom\">\r\n <span class=\"field-label\">Store</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.store\" [options]=\"dr.storePickOptions\" ariaLabel=\"Store\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"readingrow\">\r\n <span class=\"readinglabel\">Reading</span>\r\n <span class=\"readingvalue\">{{ dr.scopeReading }}</span>\r\n <span class=\"av2-grow\"></span>\r\n <a class=\"db-bandlink\" (click)=\"dr.resetScope()\">Reset to all circles</a>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Audit type -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'type'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let t of auditTypes\" [class.option-selected]=\"dr.auditType === t.key\"\r\n (click)=\"dr.auditType = t.key\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.auditType === t.key\">\r\n <svg *ngIf=\"dr.auditType === t.key\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"opttext\">\r\n <span class=\"optlabel\">{{ t.label }}</span>\r\n <span class=\"optmeta\">{{ t.help }}</span>\r\n </span>\r\n </button>\r\n </div>\r\n\r\n <!-- Score band -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'band'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let b of dr.bandRows; trackBy: trackByBand\" [class.option-selected]=\"dr.isBandOn(b.band)\"\r\n (click)=\"dr.applyBand(b.band)\">\r\n <span class=\"db-banddot\" [style.background]=\"b.band.soft\"></span>\r\n <span class=\"opttext\">\r\n <span class=\"optlabel\">{{ b.band.label }}</span>\r\n <span class=\"optmeta\">{{ b.band.range }} \u00B7 {{ b.count }} stores</span>\r\n </span>\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm pane-resetbtn\" (click)=\"dr.clearBand()\">All scores</button>\r\n </div>\r\n\r\n <!-- Status -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'status'\">\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'all'\" (click)=\"dr.setStatus('all')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'all'\">\r\n <svg *ngIf=\"dr.status === 'all'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">All stores</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'fail'\" (click)=\"dr.setStatus('fail')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'fail'\">\r\n <svg *ngIf=\"dr.status === 'fail'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Fail</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'pass'\" (click)=\"dr.setStatus('pass')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'pass'\">\r\n <svg *ngIf=\"dr.status === 'pass'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Pass</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'na'\" (click)=\"dr.setStatus('na')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'na'\">\r\n <svg *ngIf=\"dr.status === 'na'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Not audited</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"drawer-foot\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" (click)=\"dr.clearAll()\">Clear all</button>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" (click)=\"cancelFilters()\">Cancel</button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--wide\" (click)=\"applyFilters()\">Apply filters</button>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.av2-page{display:flex;flex-direction:column;gap:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;color:#101828;-webkit-font-smoothing:antialiased}.av2-page *,.av2-page *:before,.av2-page *:after{box-sizing:border-box}.av2-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:20px 24px;display:flex;flex-direction:column;gap:20px}.av2-card--log{padding:20px 24px 24px;gap:18px}.av2-card--table{padding:20px 24px 24px;gap:16px}.av2-card-head{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap}.av2-card-head--center{align-items:center;gap:12px}.av2-title-block{display:flex;flex-direction:column;gap:4px;flex:1;min-width:220px}.av2-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828;display:flex;align-items:center;gap:10px}.av2-card-title--grow{flex:1;min-width:180px}.av2-card-sub{font-size:14px;line-height:20px;color:#667085}.av2-grow{flex:1}.av2-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.av2-grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:20px}.av2-grid-4{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.av2-stat-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:10px}.av2-stat{padding:8px 16px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;align-items:center;gap:20px}.av2-stat-value{font-size:30px;line-height:38px;font-weight:600;color:#101828}.av2-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-kpi{background:#fff;border-radius:10px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;display:flex;flex-direction:column;overflow:hidden}.av2-kpi.is-primary{box-shadow:inset 0 0 0 1px #99dbff,0 1px 2px #1018280d}.av2-kpi.is-primary .av2-kpi-head{background:#eaf8ff}.av2-kpi-head{padding:14px 18px;background:#f9fafb;font-size:16px;line-height:24px;font-weight:500;color:#101828}.av2-kpi-body{padding:16px 18px 18px;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.av2-kpi-value{font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-kpi-delta{display:flex;align-items:center;gap:4px;font-size:12px;color:#039855}.av2-kpi-delta.is-down{color:#d92d20}.av2-kpi-note{font-size:12px;color:#667085}.av2-ocard{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;display:flex;flex-direction:column;min-width:0;height:100%}.av2-ocard-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:2px;min-width:0}.av2-ocard-head--row{flex-direction:row;align-items:center;justify-content:flex-start;gap:12px}.av2-ocard-count{font-size:30px;line-height:38px;font-weight:600;color:#101828;white-space:nowrap}.av2-ocard-text{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-ocard-body{flex:1;padding:12px 14px;display:flex;gap:16px;min-width:0}.av2-ocard-cell{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.av2-ocard-cell--center{align-items:center;text-align:center}.av2-ocard-sub{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-ocard-note{font-size:14px;line-height:20px;font-weight:400;color:#667085}.av2-ocard-delta{margin-top:6px;display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;font-weight:400;color:#1d2939}.av2-ocard-delta b{font-weight:600;color:#667085}.av2-ocard-delta svg{flex-shrink:0;color:#039855}.av2-ocard-delta.is-down svg{color:#d92d20}.av2-search{position:relative;display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#98a2b3;font-size:14px;flex-shrink:0}.av2-search svg{flex-shrink:0}.av2-search input{flex:1;min-width:0;height:100%;border:0;outline:0;padding:0;background:transparent;font:inherit;font-size:14px;font-weight:500;color:#101828}.av2-search input::placeholder{color:#98a2b3}.av2-search:focus-within{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-search--sm{width:300px}.av2-search--md{width:320px}.av2-search--lg{width:340px}.av2-select{height:44px;padding:0 36px 0 12px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;font-size:14px;font-weight:500;color:#344054;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\");background-repeat:no-repeat;background-position:right 12px center;flex-shrink:0}.av2-select:focus{outline:0;box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-select--sm{width:180px}.av2-chip{display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-size:14px;color:#344054;white-space:nowrap;flex-shrink:0}.av2-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;height:44px;padding:0 16px;border:0;border-radius:8px;font-family:inherit;font-size:14px;line-height:20px;font-weight:600;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background-color .15s cubic-bezier(.4,0,.2,1)}.av2-btn svg{flex-shrink:0}.av2-btn:disabled{opacity:.55;cursor:not-allowed}.av2-btn--ghost{background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054;font-weight:500}.av2-btn--ghost:hover:not(:disabled){background:#f9fafb}.av2-btn--primary{background:#00a3ff;color:#fff;font-size:16px;line-height:24px}.av2-btn--primary:hover:not(:disabled){background:#009bf3}.av2-btn--sm{height:36px;padding:0 14px;font-size:13px}.av2-btn--wide{padding:0 18px}.av2-tabs{display:flex;align-items:center;gap:6px}.av2-tab{height:44px;padding:0 26px;border:0;border-radius:6px;background:transparent;display:inline-flex;align-items:center;justify-content:center;font-family:inherit;font-size:16px;font-weight:500;color:#475467;cursor:pointer}.av2-tab.is-active{background:#eaf8ff;color:#009bf3;font-weight:500}.av2-badge{display:inline-flex;align-items:center;height:22px;padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px;white-space:nowrap}.av2-badge--count{height:22px;padding:0 8px}.av2-badge--success{background:#ecfdf3;color:#027a48}.av2-badge--error{background:#fef3f2;color:#b42318}.av2-badge--warning{background:#fffaeb;color:#b54708}.av2-badge--gray{background:#f2f4f7;color:#344054}.av2-badge--purple{background:#f9f5ff;color:#5925dc}.av2-link{color:#00a3ff;font-size:14px;font-weight:500;text-decoration:underline;cursor:pointer}.av2-link:hover{color:#009bf3;text-decoration:underline}.av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.av2-muted{color:#667085}.av2-dim{color:#475467}.av2-faint{color:#98a2b3}table tbody td.av2-dim{color:#475467}table tbody td.av2-faint{color:#98a2b3}.av2-table-wrap{overflow-x:auto}.av2-table{width:100%;border-collapse:separate;border-spacing:0;margin:0}.av2-table thead th{background:#f9fafb;padding:12px;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;text-transform:none;letter-spacing:0;border:0;white-space:nowrap}.av2-table thead th:first-child{border-radius:8px 0 0}.av2-table thead th:last-child{border-radius:0 8px 0 0}.av2-table tbody td{padding:16px 12px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;font-weight:500;color:#101828;vertical-align:middle}.av2-table .av2-th-sort{display:inline-flex;align-items:center;gap:4px}.av2-table .av2-cell-icon{display:flex;align-items:center;gap:8px;min-width:0}.av2-table .av2-cell-icon svg{flex-shrink:0}.av2-table .av2-cell-icon span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-table .av2-cell-stack{display:flex;flex-direction:column;gap:2px}.av2-table .av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-sortable{cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap}.av2-table--lined thead th{background:transparent;border-bottom:1px solid #EAECF0;border-radius:0!important}.av2-empty{display:flex;flex-direction:column;align-items:center;gap:12px;padding:24px 16px 32px;text-align:center}.av2-empty-img{display:block;width:160px;height:120px}.av2-empty-text{display:flex;flex-direction:column;gap:4px;align-items:center}.av2-empty-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.av2-empty-sub{max-width:480px;font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.av2-col-head{border-radius:8px;background:#f9fafb;padding:14px 16px;font-size:12px;line-height:20px;font-weight:500;color:#344054;display:flex;align-items:center;gap:8px}.av2-avatar{width:32px;height:32px;flex-shrink:0;border-radius:9999px;background:#eaf8ff;color:#009bf3;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}.av2-bar{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:60px}.av2-bar span{display:block;height:5px;border-radius:9999px;background:#00a3ff}@keyframes av2-shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.av2-sk{display:block;width:100%;max-width:100%;height:12px;border-radius:4px;flex-shrink:0;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%;animation:av2-shimmer 3s linear infinite}.av2-sk--value{width:72px;height:28px;border-radius:6px}.av2-sk--title{width:220px;height:18px}.av2-sk--note{width:60%}.av2-sk--block{border-radius:8px}@media (prefers-reduced-motion: reduce){.av2-sk{animation:none}}:host ::ng-deep lib-pagination{display:block}:host ::ng-deep lib-pagination .container{max-width:none;padding:0;display:flex;align-items:center;justify-content:center;gap:16px;flex-wrap:wrap;font-size:14px;color:#475467}:host ::ng-deep lib-pagination .mt-4{margin-top:0!important}:host ::ng-deep lib-pagination .container>.text-center{display:flex;align-items:center}:host ::ng-deep lib-pagination .container>.text-center>ul:not(.ngx-pagination){display:none}:host ::ng-deep lib-pagination pagination-controls{display:flex;align-items:center}:host ::ng-deep lib-pagination .sub-title{color:#475467!important;font-size:14px!important;font-weight:400!important;line-height:20px}:host ::ng-deep lib-pagination .border-val{height:40px;min-width:64px;padding:0 30px 0 12px!important;border:1px solid #D0D5DD!important;border-radius:8px!important;box-shadow:0 1px 2px #1018280d;background-color:#fff;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23667085' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E\")!important;background-repeat:no-repeat!important;background-position:right 10px center!important;background-size:14px 14px!important;appearance:none;-webkit-appearance:none;font-size:14px;font-weight:500;color:#1d2939;cursor:pointer;transition:border-color .15s ease,box-shadow .15s ease}:host ::ng-deep lib-pagination .border-val:hover{border-color:#98a2b3!important}:host ::ng-deep lib-pagination .border-val:focus{outline:none;border-color:#66c8ff!important;box-shadow:0 0 0 3px #eaf8ff}:host ::ng-deep lib-pagination .ngx-pagination{margin:0;padding:0;display:flex;align-items:center;gap:6px;color:#475467!important;font-size:14px!important;font-weight:500}:host ::ng-deep lib-pagination .ngx-pagination li{display:inline-flex;margin:0}:host ::ng-deep lib-pagination .ngx-pagination li.small-screen{display:none!important}:host ::ng-deep lib-pagination .ngx-pagination a,:host ::ng-deep lib-pagination .ngx-pagination button,:host ::ng-deep lib-pagination .ngx-pagination .current,:host ::ng-deep lib-pagination .ngx-pagination .disabled{min-width:40px!important;height:40px;padding:0 8px!important;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;line-height:20px;color:#475467}:host ::ng-deep lib-pagination .ngx-pagination a:hover,:host ::ng-deep lib-pagination .ngx-pagination button:hover{background:#f2f4f7;padding:0 8px!important}:host ::ng-deep lib-pagination .ngx-pagination .current{background:#eaf8ff!important;color:#00a3ff!important;font-weight:600;font-size:14px!important}:host ::ng-deep lib-pagination .ngx-pagination .disabled{color:#98a2b3}:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:after{margin:0}:host ::ng-deep lib-pagination .ngx-pagination .ellipsis:after{color:#98a2b3;padding:0}.db-topline{display:flex;align-items:center;gap:12px}.db-refresh{font-size:15px;font-weight:600;color:#344054}.moduleswitch{display:flex;border-radius:8px;overflow:hidden;box-shadow:inset 0 0 0 1px #d0d5dd}.moduletab{padding:8px 24px;border:none;background:#fff;font-family:inherit;font-size:16px;line-height:24px;font-weight:500;color:#344054;white-space:nowrap;cursor:pointer}.moduletab:first-child{box-shadow:inset -1px 0 #d0d5dd}.moduletab.moduletab-on{background:#00a3ff;color:#fff}.db-scopebar{display:flex;flex-wrap:wrap;align-items:center;gap:12px}.db-scopetext{flex:1 1 300px;min-width:0;display:flex;flex-direction:column;gap:1px}.db-crumb{font-size:13px;line-height:20px;color:#667085}.db-scope{font-size:16px;line-height:24px;font-weight:600;color:#101828;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.db-countpill{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;border-radius:9999px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:700}.db-chips{display:flex;flex-wrap:wrap;align-items:center;gap:10px}.db-chip{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 12px;border:none;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0;font-family:inherit;font-size:13px;line-height:20px;white-space:nowrap;cursor:pointer}.db-chip:hover{background:#f9fafb}.db-chip.is-dirty{box-shadow:inset 0 0 0 1px #99dbff}.db-chip.is-dirty .db-chip-value{color:#009bf3}.db-chip-label{color:#667085;font-weight:500}.db-chip-value{font-weight:600;color:#101828}.db-clearall{border:none;background:transparent;padding:0 4px;font-family:inherit;font-size:13px;font-weight:600;color:#00a3ff;cursor:pointer}.db-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.db-sk-value{margin:2px 0}.db-sk-chart{height:250px}.db-sk-mid{width:48px;height:22px;margin:4px 0;border-radius:6px}.db-duo{display:grid;grid-template-columns:repeat(auto-fit,minmax(340px,1fr));gap:16px;align-items:stretch}.db-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:18px 20px;display:flex;flex-direction:column;gap:12px;min-width:0}.db-card--tight{gap:4px}.db-card--table{padding:0;gap:0;overflow:hidden;scroll-margin-top:16px}.db-card-head{display:flex;align-items:center;gap:10px}.db-card-head--wrap{flex-wrap:wrap}.db-card-head--baseline{align-items:baseline}.db-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828}.db-card-title--grow{flex:1 1 160px;min-width:0}.db-card-sub{font-size:13px;line-height:20px;color:#667085}.db-seg{display:flex;border-radius:8px;overflow:hidden;box-shadow:inset 0 0 0 1px #d0d5dd}.db-seg-tab{padding:8px 14px;border:none;background:#fff;font-family:inherit;font-size:14px;font-weight:500;color:#475467;white-space:nowrap;cursor:pointer}.db-seg-tab.is-on{background:#00a3ff;color:#fff}.db-daterow{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.av2-datepick{position:relative;display:inline-flex;align-items:center}.av2-datepick-icon{position:absolute;left:10px;color:#667085;pointer-events:none}.av2-datepick-input{height:36px;padding:0 10px 0 32px;border:none;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;background:#fff;font-family:inherit;font-size:13px;font-weight:500;color:#101828;cursor:pointer;outline:none}.av2-datepick-input:focus{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}:host ::ng-deep .av2-datepick .md-drppicker{margin-top:4px;z-index:1060;font-family:inherit;border-radius:8px;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808,inset 0 0 0 1px #eaecf0}:host ::ng-deep .av2-datepick .md-drppicker.double,:host ::ng-deep .av2-datepick .md-drppicker.show-ranges{width:max-content}:host ::ng-deep .av2-datepick .md-drppicker.ltr .ranges{float:left;margin-top:10px}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button{width:160px;padding:12px 16px;border:none;border-radius:8px;background:none;color:#344054;font-size:14px;font-weight:400;line-height:20px;text-align:left;cursor:pointer}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button.active{background:#eaf8ff;color:#00a3ff;font-weight:500}:host ::ng-deep .av2-datepick .md-drppicker th,:host ::ng-deep .av2-datepick .md-drppicker td{width:40px!important;height:40px!important;min-width:32px;padding:0!important;border:1px solid transparent!important;background:transparent!important;font-size:14px!important;font-weight:400!important;line-height:38px}:host ::ng-deep .av2-datepick .md-drppicker th{color:#344054!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker th.month{width:auto!important;font-size:16px!important}:host ::ng-deep .av2-datepick .md-drppicker td{color:#344054!important}:host ::ng-deep .av2-datepick .md-drppicker th.available.prev,:host ::ng-deep .av2-datepick .md-drppicker th.available.next{background:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='15 6 9 12 15 18'/%3E%3C/svg%3E\") center/18px no-repeat!important}:host ::ng-deep .av2-datepick .md-drppicker th.available:hover,:host ::ng-deep .av2-datepick .md-drppicker td.available:hover{background-color:#f2f4f7!important}:host ::ng-deep .av2-datepick .md-drppicker td.in-range{background-color:#eaf8ff!important;color:#101828!important}:host ::ng-deep .av2-datepick .md-drppicker td.active,:host ::ng-deep .av2-datepick .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px;color:#fff!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker td.off,:host ::ng-deep .av2-datepick .md-drppicker td.off.in-range{color:#98a2b3!important;background-color:transparent!important}:host ::ng-deep .av2-datepick .md-drppicker td.disabled{color:#98a2b3!important;background-color:transparent!important;text-decoration:line-through;pointer-events:none}:host ::ng-deep .av2-datepick--compact .md-drppicker th,:host ::ng-deep .av2-datepick--compact .md-drppicker td{width:32px!important;height:32px!important;font-size:12px!important;line-height:30px}:host ::ng-deep .av2-datepick--compact .md-drppicker th.month{font-size:14px!important}.db-daterange{width:220px}.db-daterange--field{height:40px;font-size:14px;font-weight:600}.db-focus{display:flex;flex-wrap:wrap;align-items:baseline;gap:8px 14px}.db-focus-score{font-size:32px;line-height:38px;font-weight:700;color:#039855}.db-focus-score.is-fail{color:#d92d20}.db-focus-pill{display:inline-flex;align-items:center;padding:3px 10px;border-radius:9999px;font-size:12px;line-height:18px;font-weight:700}.db-focus-pill.is-pass{background:#ecfdf3;color:#027a48}.db-focus-pill.is-fail{background:#fef3f2;color:#b42318}.db-focus-line{flex:1 1 200px;min-width:0;font-size:13px;line-height:20px;color:#667085;text-wrap:pretty}.db-legend{display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;color:#475467}.db-legend-dash{width:18px;height:0;border-top:2px dashed #00A3FF;display:block}.db-chart{display:flex;gap:10px;min-width:0}.db-chart-y{flex:0 0 34px;position:relative;height:186px}.db-chart-y span{position:absolute;right:0;transform:translateY(-50%);font-size:11px;line-height:16px;color:#98a2b3}.db-chart-area{flex:1;min-width:0;position:relative;height:186px}.db-gridline{position:absolute;left:0;right:0;height:0;border-top:1px solid #F2F4F7;display:block}.db-passline{position:absolute;left:0;right:0;height:0;border-top:2px dashed #00A3FF;display:block}.db-bars{position:absolute;inset:0;display:flex;align-items:flex-end;gap:8px}.db-bar-col{position:relative;flex:1;min-width:0;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:flex-end}.db-bar-value{position:absolute;left:0;right:0;text-align:center;margin-bottom:2px;font-size:13px;line-height:20px;font-weight:700;white-space:nowrap;color:#344054}.db-bar-value.is-active{color:#101828}.db-bar{display:block;width:100%;max-width:72px;border-radius:6px 6px 0 0}.db-tip{position:absolute;left:50%;z-index:5;min-width:168px;padding:10px 12px;border-radius:8px;background:#101828;color:#fff;box-shadow:0 12px 16px -4px #1018282e,0 4px 6px -2px #10182814;font-size:12px;line-height:18px;white-space:nowrap;text-align:left;pointer-events:none;opacity:0;visibility:hidden;transform:translate(-50%,4px);transition:opacity .12s ease,transform .12s ease,visibility .12s}.db-tip.is-start{left:0;transform:translateY(4px)}.db-tip.is-end{left:auto;right:0;transform:translateY(4px)}.db-bar-col:hover .db-tip{opacity:1;visibility:visible;transform:translate(-50%)}.db-bar-col:hover .db-tip.is-start,.db-bar-col:hover .db-tip.is-end{transform:translate(0)}.db-tip-head{font-weight:600;color:#fff}.db-tip-sub{font-weight:400;color:#d0d5dd}.db-tip-score{display:flex;align-items:center;gap:6px;margin:6px 0 8px}.db-tip-dot{width:8px;height:8px;border-radius:9999px;background:#00a3ff;flex:0 0 auto}.db-tip-dot.is-fail{background:#f04438}.db-tip-value{font-size:16px;line-height:24px;font-weight:700}.db-tip-status{margin-left:auto;padding:0 6px;border-radius:9999px;font-size:11px;line-height:18px;font-weight:600;background:#2e91fa33;color:#84caff}.db-tip-status.is-fail{background:#f0443833;color:#fda29b}.db-tip-empty{margin:6px 0 8px;color:#d0d5dd}.db-tip-row{display:flex;justify-content:space-between;gap:16px;padding-top:4px;border-top:1px solid rgba(255,255,255,.08);color:#d0d5dd}.db-tip-row+.db-tip-row{border-top:0;padding-top:2px}.db-tip-row b{font-weight:600;color:#fff}.db-chart-x{display:flex;gap:8px;padding-left:44px}.db-chart-xcol{flex:1;min-width:0;display:flex;flex-direction:column;align-items:center;gap:1px}.db-bar-col.is-pickable,.db-chart-xcol.is-pickable{cursor:pointer}.db-chart-xlabel{font-size:11px;line-height:16px;white-space:nowrap;color:#475467}.db-chart-xlabel.is-active{font-weight:700;color:#101828}.db-chart-x.is-dense .db-chart-xcol{overflow:visible}.db-chart-xcount{font-size:11px;line-height:16px;color:#98a2b3;white-space:nowrap}.db-bandbar{display:flex;height:14px;border-radius:9999px;overflow:hidden;background:#f2f4f7;margin-top:14px}.db-bandseg{display:block;height:14px}.db-bandseg.has-stores{min-width:8px}.db-bandrows{flex:1;display:grid;grid-template-columns:10px minmax(0,1fr) auto auto auto auto;grid-auto-rows:1fr;column-gap:12px;margin-top:12px}.db-bandrow{grid-column:1/-1;display:grid;grid-template-columns:subgrid;align-items:center;min-height:40px;padding:9px 0;border-bottom:1px solid #F2F4F7}.db-bandrow:last-child{border-bottom:0}.db-banddot{grid-column:1}.db-bandlabel{grid-column:2}.db-bandrange{grid-column:3}.db-bandcount{grid-column:4}.db-bandshare{grid-column:5}.db-bandlink{grid-column:6}@media (max-width: 575px){.db-bandrows{grid-template-columns:10px minmax(0,1fr) 0 auto auto auto;column-gap:8px}.db-bandrange{display:none}}.db-banddot{width:10px;height:10px;border-radius:3px;flex-shrink:0;display:block}.db-bandlabel{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px;line-height:20px;font-weight:500;color:#1d2939}.db-bandrange{font-size:12px;line-height:18px;color:#667085;white-space:nowrap;text-align:right}.db-bandcount{font-size:13px;line-height:20px;font-weight:600;color:#101828;text-align:right;white-space:nowrap}.db-bandshare{font-size:12px;line-height:18px;color:#667085;min-width:36px;text-align:right;font-variant-numeric:tabular-nums}.db-bandlink{font-size:12px;line-height:18px;font-weight:600;color:#00a3ff;white-space:nowrap;cursor:pointer}.db-bandlink:hover,.db-bandlink.is-active{color:#009bf3;text-decoration:underline}.db-ledger-head{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:18px 20px}.db-ledger-text{flex:1 1 220px;min-width:0;display:flex;flex-direction:column;gap:2px}.db-bandfilter{display:flex;align-items:center;gap:8px;margin-top:4px;flex-wrap:wrap}.db-bandchip{display:inline-flex;align-items:center;gap:6px;padding:3px 6px 3px 10px;border-radius:9999px;background:#eaf8ff;box-shadow:inset 0 0 0 1px #99dbff;font-size:12px;font-weight:600;white-space:nowrap;color:#009bf3}.db-bandchip-x{width:16px;height:16px;border-radius:9999px;display:flex;align-items:center;justify-content:center;cursor:pointer;background:#ccedff}.db-search{width:240px}.db-search input{font-size:13px}.segmented{display:flex;padding:3px;border-radius:8px;background:#f2f4f7}.segtab{padding:7px 16px;border:none;border-radius:6px;background:transparent;font-family:inherit;font-size:14px;font-weight:500;color:#475467;cursor:pointer;white-space:nowrap}.segtab.segtab-on{background:#fff;color:#101828;box-shadow:0 1px 2px #1018280d}.db-table{width:100%;min-width:1060px;border-collapse:separate;border-spacing:0;margin:0}.db-table thead th{padding:10px 20px;background:#f9fafb;border:0;border-top:1px solid #EAECF0;border-bottom:1px solid #EAECF0;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;white-space:nowrap}.db-table thead th.is-sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.db-table thead th.is-sorted{color:#101828}.db-table tbody td{padding:12px 20px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;color:#344054;vertical-align:middle}.db-table tbody tr:hover td{background:#fcfcfd}.db-nowrap{white-space:nowrap}.db-storeid{font-weight:600;color:#101828;cursor:pointer}.db-storeid:hover{color:#009bf3;text-decoration:underline}.db-pill{display:inline-block;padding:2px 10px;border-radius:9999px;font-size:12px;font-weight:600;white-space:nowrap}.db-pill--strong{padding:3px 10px}.db-actions{display:flex;align-items:center;gap:6px}.db-viewbtn{display:inline-flex;align-items:center;gap:5px;height:28px;padding:0 10px;border-radius:6px;font-size:12px;font-weight:600;color:#009bf3;cursor:pointer;box-shadow:inset 0 0 0 1px #99dbff;white-space:nowrap}.db-viewbtn:hover{background:#eaf8ff;color:#009bf3}.db-pdfbtn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:6px;color:#475467;cursor:pointer;box-shadow:inset 0 0 0 1px #d0d5dd}.db-pdfbtn:hover{background:#f9fafb;color:#344054}.db-pdfbtn.is-disabled{color:#d0d5dd;cursor:not-allowed}.db-pdfbtn.is-disabled:hover{background:transparent;color:#d0d5dd}.db-empty{padding:28px 20px;text-align:center;font-size:13px;color:#667085}.db-pager{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:14px 20px;font-size:13px;color:#475467}.db-pagebtn{width:32px;height:32px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;display:flex;align-items:center;justify-content:center;color:#475467;cursor:pointer}.db-pagebtn:hover:not(:disabled){background:#f9fafb}.db-pagebtn:disabled{color:#d0d5dd;cursor:default}.db-stats{display:grid;grid-template-columns:.9fr 1.6fr 2fr;gap:16px;align-items:stretch}.db-stat{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;overflow:hidden;display:flex;flex-direction:column}.db-stat-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d}.db-stat-big{font-size:30px;line-height:38px;font-weight:600;color:#101828}.db-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.db-stat-body{padding:12px 14px;display:grid;grid-template-columns:1fr;gap:16px}.db-stat-body--2{grid-template-columns:1fr 1fr}.db-stat-body--3{grid-template-columns:repeat(3,1fr)}.db-stat-cell{display:flex;flex-direction:column;gap:2px}.db-stat-mid{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.db-stat-mid.is-underline{text-decoration:underline}.db-stat-sub{font-size:14px;line-height:20px;font-weight:500;color:#344054}.db-stat-delta{display:flex;align-items:center;gap:5px;font-size:12px;color:#d92d20}.db-stat-delta.is-good{color:#039855}.db-stat-delta.is-bad{color:#d92d20}.db-stat-delta.is-flat{color:#667085}.db-stat-delta.is-down svg{transform:scaleY(-1)}.db-perf{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:16px 20px 8px;display:flex;flex-direction:column;gap:16px}.db-perftabs{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.db-perftab{padding:10px 18px;border:none;border-radius:8px;background:transparent;font-family:inherit;font-size:14px;font-weight:500;color:#475467;white-space:nowrap;cursor:pointer}.db-perftab.is-on{background:#eaf8ff;color:#009bf3;font-weight:600}.db-perf-head{display:flex;align-items:flex-start;gap:12px;flex-wrap:wrap}.db-perf-text{display:flex;flex-direction:column;gap:2px}.db-perf-title{display:flex;align-items:center;gap:8px;font-size:20px;line-height:30px;font-weight:600;color:#101828}.db-total{font-size:12px;font-weight:500;border-radius:9999px;padding:2px 10px;background:#eaf8ff;color:#009bf3;white-space:nowrap}.db-perf-search{width:250px}.db-create{gap:6px;padding:0 18px;background:#00a3ff;color:#fff}.db-create:hover:not(:disabled){background:#00a3ff}.db-perftable{width:100%;border-collapse:separate;border-spacing:0;margin:0;table-layout:fixed}.db-perftable thead th{padding:10px 4px;background:#f9fafb;border:0;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;white-space:nowrap}.db-perftable thead th:first-child{border-radius:8px 0 0 8px}.db-perftable thead th:last-child{border-radius:0 8px 8px 0}.db-perftable tbody td{padding:14px 4px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;color:#344054;vertical-align:middle}.db-perftable--audit tbody td{padding:16px 4px}.db-perftable--audit th:nth-child(1){width:28%}.db-perftable--audit th:nth-child(2),.db-perftable--audit th:nth-child(3){width:10%}.db-perftable--audit th:nth-child(4),.db-perftable--audit th:nth-child(5){width:9%}.db-perftable--audit th:nth-child(6){width:18%}.db-perftable--audit th:nth-child(7){width:10%}.db-perftable--audit th:nth-child(8){width:6%}.db-perftable--task tbody td{padding:16px 4px}.db-perftable--task th:nth-child(1){width:22%}.db-perftable--task th:nth-child(2),.db-perftable--task th:nth-child(3){width:7.5%}.db-perftable--task th:nth-child(4),.db-perftable--task th:nth-child(5){width:8.5%}.db-perftable--task th:nth-child(6),.db-perftable--task th:nth-child(7),.db-perftable--task th:nth-child(8){width:6.5%}.db-perftable--task th:nth-child(9){width:15%}.db-perftable--task th:nth-child(10){width:6%}.db-perftable--store th:nth-child(1){width:15%}.db-perftable--store th:nth-child(2){width:10%}.db-perftable--store th:nth-child(3){width:17%}.db-perftable--store th:nth-child(4){width:8%}.db-perftable--store th:nth-child(5){width:7%}.db-perftable--store th:nth-child(6),.db-perftable--store th:nth-child(7),.db-perftable--store th:nth-child(8){width:12%}.db-perftable--store th:nth-child(9){width:7%}.db-perftable--user th:nth-child(1){width:15%}.db-perftable--user th:nth-child(2){width:22%}.db-perftable--user th:nth-child(3){width:9%}.db-perftable--user th:nth-child(4),.db-perftable--user th:nth-child(5){width:6%}.db-perftable--user th:nth-child(6),.db-perftable--user th:nth-child(7),.db-perftable--user th:nth-child(8){width:12%}.db-perftable--user th:nth-child(9){width:5%}.db-table thead th,.db-table tbody td,.db-perftable thead th,.db-perftable tbody td{height:auto!important}.db-table thead th,.db-perftable thead th{font-size:12px!important;font-weight:500!important;background:#f9fafb!important}.db-table thead th{padding:10px 20px!important;border-bottom:1px solid #EAECF0!important;color:#667085!important}.db-table thead th.is-sorted{color:#101828!important}.db-table tbody td{padding:12px 20px!important}.db-perftable thead th{padding:10px 4px!important;border-bottom:0!important;color:#667085!important}.db-perftable thead th.is-sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.db-perftable thead th.is-sorted{color:#101828!important}.db-perftable tbody td{padding:14px 4px!important}.db-perftable--audit tbody td,.db-perftable--task tbody td{padding:16px 4px!important}.db-name{display:flex;align-items:center;gap:10px;min-width:0}.db-avatar{width:34px;height:34px;flex-shrink:0;border-radius:9999px;background:#f2f4f7;color:#475467;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:600}.db-link{font-size:13px;font-weight:500;color:#00a3ff;text-decoration:underline;cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.db-link:hover{color:#009bf3}.db-ulink{color:#00a3ff;text-decoration:underline;cursor:pointer}.db-medium{font-weight:500}.db-score{display:flex;align-items:center;gap:8px}.db-score.is-empty .db-track{display:none}.db-track{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:40px}.db-track>span{display:block;height:100%;border-radius:9999px;background:#00a3ff}.db-track--6{height:6px}.db-scoretext{font-weight:600;white-space:nowrap}.db-scoretext--sm{font-size:12px;color:#475467}.db-eye{width:22px;height:22px;display:inline-flex;align-items:center;justify-content:center;color:#98a2b3;cursor:pointer}.db-eye:hover{color:#00a3ff}.db-perf-pager{display:flex;align-items:center;justify-content:center;gap:10px;padding:12px 4px;font-size:13px;color:#475467}.db-pagebox{display:inline-flex;align-items:center;padding:4px 12px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd}.db-page{display:inline-flex;align-items:center;padding:4px 12px;border-radius:8px}.db-page.is-active{background:#eaf8ff;color:#009bf3;font-weight:600}.filter-backdrop{position:fixed;inset:0;background:#10182873;z-index:1050}.filter-drawer{position:fixed;top:0;right:0;bottom:0;width:860px;max-width:96vw;display:flex;flex-direction:column;background:#fff;box-shadow:-10px 0 30px #1018282e;z-index:1051;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.drawer-head{display:flex;align-items:center;gap:10px;padding:18px 20px;box-shadow:inset 0 -1px #eaecf0}.drawer-title{font-size:17px;line-height:26px;font-weight:700;color:#101828}.closebtn{width:32px;height:32px;border:none;border-radius:8px;background:transparent;color:#667085;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.closebtn:hover{background:#f2f4f7;color:#344054}.drawer-body{display:flex;flex:1;min-height:0}.drawer-nav{flex:0 0 280px;max-width:280px;background:#f9fafb;box-shadow:inset -1px 0 #eaecf0;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:4px}.drawer-navitem{display:flex;align-items:center;gap:10px;width:100%;padding:12px 14px;border:none;border-radius:8px;background:transparent;text-align:left;font-family:inherit;cursor:pointer}.drawer-navitem:hover{background:#fff}.drawer-navitem.navitem-active{background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d}.navtext{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.navtitle{font-size:13px;line-height:20px;font-weight:600;color:#101828}.navvalue{font-size:13px;line-height:20px;color:#667085;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.navvalue.is-dirty{color:#009bf3}.dirtydot{width:8px;height:8px;border-radius:9999px;background:#00a3ff;flex-shrink:0;display:block}.drawer-pane{flex:1;min-width:0;overflow-y:auto;padding:24px 28px;display:flex;flex-direction:column;gap:6px}.panetitle{font-size:17px;line-height:26px;font-weight:700;color:#101828}.panehint{font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.pane-options{display:flex;flex-direction:column;gap:10px;margin-top:14px}.pane-option{display:flex;align-items:flex-start;gap:12px;padding:14px 16px;border-radius:8px;cursor:pointer;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0}.pane-option.is-on{background:#f5fbff;box-shadow:inset 0 0 0 1.5px #00a3ff}.pane-radio{width:18px;height:18px;flex-shrink:0;margin-top:2px;border-radius:9999px;display:flex;align-items:center;justify-content:center;box-shadow:inset 0 0 0 1px #d0d5dd}.pane-radio>span{width:8px;height:8px;border-radius:9999px;background:transparent;display:block}.pane-radio.is-on{box-shadow:inset 0 0 0 1.5px #00a3ff}.pane-radio.is-on>span{background:#00a3ff}.pane-option-text{display:flex;flex-direction:column;gap:2px}.pane-option-label{font-size:14px;line-height:20px;font-weight:600;color:#101828}.pane-option-help{font-size:13px;line-height:20px;color:#667085}.pane-list{display:flex;flex-direction:column;gap:2px;margin-top:14px}.pane-stack{display:flex;flex-direction:column;gap:16px;margin-top:14px}.pane-fields{display:flex;align-items:flex-end;gap:14px;flex-wrap:wrap;margin-top:14px}.pane-resetbtn{align-self:flex-start;margin-top:12px}.field{display:flex;flex-direction:column;gap:6px}.field--full{max-width:420px}.field-label{font-size:12px;line-height:18px;font-weight:600;color:#344054}.field-meta{font-weight:400;color:#667085;margin-left:6px}.field-select{width:100%}.readingrow{display:flex;align-items:center;gap:12px;padding:12px 14px;border-radius:8px;background:#f9fafb;box-shadow:inset 0 0 0 1px #eaecf0;font-size:13px}.readinglabel{font-weight:600;color:#344054}.readingvalue{color:#101828}.optionrow{display:flex;align-items:center;gap:10px;width:100%;padding:11px 12px;border:none;border-radius:8px;background:transparent;text-align:left;font-family:inherit;cursor:pointer}.optionrow:hover{background:#f9fafb}.optionrow.option-selected{background:#eaf8ff}.optionrow.option-selected .optlabel{font-weight:600}.optionmark{display:flex;align-items:center;justify-content:center;width:18px;height:18px;flex-shrink:0;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#fff}.optionmark.mark-on{background:#00a3ff;box-shadow:none}.opttext{flex:1;min-width:0;display:flex;flex-direction:column}.optlabel{font-size:13px;line-height:20px;font-weight:500;color:#1d2939}.optmeta{font-size:11px;line-height:16px;color:#667085}.drawer-foot{display:flex;align-items:center;gap:10px;padding:14px 20px;box-shadow:inset 0 1px #eaecf0}.db-bandhint{margin-top:4px;font-size:12px;color:#667085}.db-bandhint b{color:#344054;font-weight:600}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i3.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }, { 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.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: i7.DaterangepickerDirective, selector: "input[ngxDaterangepickerMd]", inputs: ["minDate", "maxDate", "autoApply", "alwaysShowCalendars", "showCustomRangeLabel", "linkedCalendars", "dateLimit", "singleDatePicker", "showWeekNumbers", "showISOWeekNumbers", "showDropdowns", "isInvalidDate", "isCustomDate", "isTooltipDate", "showClearButton", "customRangeDirection", "ranges", "opens", "drops", "firstMonthDayClass", "lastMonthDayClass", "emptyWeekRowClass", "emptyWeekColumnClass", "firstDayOfNextMonthClass", "lastDayOfPreviousMonthClass", "keepCalendarOpeningWithRange", "showRangeLabelOnInput", "showCancel", "lockStartDate", "timePicker", "timePicker24Hour", "timePickerIncrement", "timePickerSeconds", "closeOnAutoApply", "endKeyHolder", "startKey", "locale", "endKey"], outputs: ["change", "rangeClicked", "datesUpdated", "startDateChanged", "endDateChanged", "clearClicked"] }, { kind: "directive", type: i8.AuditV2TipDirective, selector: "[av2Tip]", inputs: ["av2Tip"] }, { kind: "component", type: i9.AuditV2ShimmerComponent, selector: "lib-audit-v2-shimmer", inputs: ["rows"] }, { kind: "component", type: i10.AuditV2SelectComponent, selector: "lib-audit-v2-select", inputs: ["options", "placeholder", "searchable", "ariaLabel", "disabled", "value"], outputs: ["changed"] }, { kind: "component", type: i11.AuditV2SortIconComponent, selector: "lib-audit-v2-sort-icon", inputs: ["active", "dir"] }] });
1525
1525
  }
1526
1526
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuditV2DashboardComponent, decorators: [{
1527
1527
  type: Component,
1528
- args: [{ selector: 'lib-audit-v2-dashboard', template: "<div class=\"av2-page audit-dash\">\r\n\r\n <!-- Refresh line + module switch -->\r\n <div class=\"db-topline\">\r\n <div class=\"db-refresh\">Last refreshed at {{ lastRefreshed }}</div>\r\n <div class=\"av2-grow\"></div>\r\n <div class=\"moduleswitch\">\r\n <button type=\"button\" class=\"moduletab\" *ngFor=\"let t of moduleTabs\" [class.moduletab-on]=\"moduleTab === t\"\r\n (click)=\"setModuleTab(t)\">{{ t }}</button>\r\n </div>\r\n </div>\r\n\r\n <!-- ============ AUDIT SCORECARD ============ -->\r\n <ng-container *ngIf=\"!isTaskModule\">\r\n\r\n <!-- Crumb, scope title, actions -->\r\n <div class=\"db-scopebar\">\r\n <div class=\"db-scopetext\">\r\n <div class=\"db-crumb\">Audits \u203A Dashboard</div>\r\n <div class=\"db-scope\">{{ scopeLabel }}</div>\r\n </div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"openFilters()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <line x1=\"4\" y1=\"7\" x2=\"20\" y2=\"7\"></line>\r\n <line x1=\"7\" y1=\"12\" x2=\"17\" y2=\"12\"></line>\r\n <line x1=\"10\" y1=\"17\" x2=\"14\" y2=\"17\"></line>\r\n </svg>\r\n Filters\r\n <span class=\"db-countpill\" *ngIf=\"filterCount\">{{ filterCount }}</span>\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" [disabled]=\"loading || !filteredRows.length\"\r\n title=\"Download the store list below as an Excel file\" (click)=\"exportStores()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 16V4\"></path>\r\n <polyline points=\"7 9 12 4 17 9\"></polyline>\r\n <path d=\"M4 16v4h16v-4\"></path>\r\n </svg>\r\n Export\r\n </button>\r\n </div>\r\n\r\n <!-- Filter chips -->\r\n <div class=\"db-chips\">\r\n <button type=\"button\" class=\"db-chip\" *ngFor=\"let c of filterCats; trackBy: trackByCat\" [class.is-dirty]=\"c.dirty\"\r\n (click)=\"openFilters(c.key)\">\r\n <span class=\"db-chip-label\">{{ c.label }}</span>\r\n <span class=\"db-chip-value\">{{ c.value }}</span>\r\n </button>\r\n <button type=\"button\" class=\"db-clearall\" *ngIf=\"filterCount\" (click)=\"clearAll()\">Clear all</button>\r\n </div>\r\n\r\n <!-- KPI tiles -->\r\n <div class=\"db-kpis\">\r\n <!-- Old Checklist summary card: figure + label in the gradient strip, note below. -->\r\n <div class=\"av2-ocard\" *ngFor=\"let kpi of kpis\">\r\n <div class=\"av2-ocard-head\">\r\n <div class=\"av2-ocard-count\">\r\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!loading\">{{ kpi.value }}</ng-container>\r\n </div>\r\n <div class=\"av2-ocard-text\">{{ kpi.label }}</div>\r\n </div>\r\n <div class=\"av2-ocard-body\">\r\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--note\"></span>\r\n <div *ngIf=\"!loading\" class=\"av2-ocard-note\" [style.color]=\"kpi.noteColor\">{{ kpi.note }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Trend + distribution -->\r\n <div class=\"db-duo\">\r\n <!-- Trend -->\r\n <section class=\"db-card\">\r\n <div class=\"db-card-head db-card-head--wrap\">\r\n <div class=\"db-card-title db-card-title--grow\">Audit score trend</div>\r\n <div class=\"db-seg\">\r\n <button type=\"button\" class=\"db-seg-tab\" [class.is-on]=\"grain === 'quarter'\" (click)=\"setGrain('quarter')\">Quarterly</button>\r\n <button type=\"button\" class=\"db-seg-tab\" [class.is-on]=\"grain === 'date'\" (click)=\"setGrain('date')\">By date</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-daterow\" *ngIf=\"grain === 'date'\">\r\n <div class=\"av2-datepick\">\r\n <svg class=\"av2-datepick-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\r\n <input type=\"text\" class=\"av2-datepick-input db-daterange\" ngxDaterangepickerMd readonly autocomplete=\"off\"\r\n placeholder=\"Select date range\" [(ngModel)]=\"range\" [locale]=\"pickerLocale\" [maxDate]=\"today\"\r\n [dateLimit]=\"maxRangeDays\" [ranges]=\"ranges\" [showCustomRangeLabel]=\"true\" [alwaysShowCalendars]=\"false\"\r\n [keepCalendarOpeningWithRange]=\"true\" [autoApply]=\"true\" [showCancel]=\"false\" [drops]=\"'down'\" [opens]=\"'right'\"\r\n (datesUpdated)=\"onRangePicked($event)\">\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"trendLoading\">\r\n <span class=\"av2-sk av2-sk--title\"></span>\r\n <span class=\"av2-sk av2-sk--block db-sk-chart\"></span>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!trendLoading\">\r\n <div class=\"db-focus\">\r\n <span class=\"db-focus-score\" [class.is-fail]=\"!focusPassed\">{{ focusScore }}</span>\r\n <span class=\"db-focus-pill\" [class.is-pass]=\"focusPassed\" [class.is-fail]=\"!focusPassed\">{{ focusStatus }}</span>\r\n <span class=\"db-focus-line\">{{ focusLine }}</span>\r\n </div>\r\n\r\n <div class=\"db-legend\">\r\n <span class=\"db-legend-dash\"></span>Pass mark {{ passMark }}%\r\n </div>\r\n\r\n <div class=\"db-chart\">\r\n <div class=\"db-chart-y\">\r\n <span style=\"top:0\">100%</span>\r\n <span style=\"top:50%\">50%</span>\r\n <span style=\"top:100%\">0%</span>\r\n </div>\r\n <div class=\"db-chart-area\">\r\n <span class=\"db-gridline\" style=\"top:0\"></span>\r\n <span class=\"db-gridline\" style=\"top:50%\"></span>\r\n <span class=\"db-gridline\" style=\"top:100%\"></span>\r\n <span class=\"db-passline\" [style.top.%]=\"100 - passMark\"></span>\r\n <div class=\"db-bars\">\r\n <div class=\"db-bar-col\" *ngFor=\"let bar of trendBars; let first = first; let last = last\"\r\n [class.is-pickable]=\"grain === 'quarter'\" (click)=\"selectQuarter(bar.key)\">\r\n <span class=\"db-bar-value\" *ngIf=\"!denseTrend\" [class.is-active]=\"bar.key === quarter\" [style.bottom]=\"barHeight(bar)\">\r\n {{ bar.value === null ? '\u2014' : bar.value + '%' }}\r\n </span>\r\n <span class=\"db-bar\" [style.height]=\"barHeight(bar)\" [style.background]=\"barFill(bar)\"></span>\r\n\r\n <div class=\"db-tip\" [class.is-start]=\"first && !last\" [class.is-end]=\"last && !first\" [style.bottom]=\"tipBottom(bar)\">\r\n <div class=\"db-tip-head\">\r\n {{ bar.label }}<span class=\"db-tip-sub\" *ngIf=\"grain === 'quarter'\"> \u00B7 {{ quarterMonths(bar.key) }}</span>\r\n </div>\r\n <div class=\"db-tip-score\" *ngIf=\"bar.value !== null\">\r\n <span class=\"db-tip-dot\" [class.is-fail]=\"bar.value < passMark\"></span>\r\n <span class=\"db-tip-value\">{{ bar.value }}%</span>\r\n <span class=\"db-tip-status\" [class.is-fail]=\"bar.value < passMark\">\r\n {{ bar.value >= passMark ? 'Pass' : 'Below pass mark' }}\r\n </span>\r\n </div>\r\n <div class=\"db-tip-empty\" *ngIf=\"bar.value === null\">No scored audits</div>\r\n <div class=\"db-tip-row\"><span>Audits completed</span><b>{{ bar.submitted }}</b></div>\r\n <div class=\"db-tip-row\" *ngIf=\"bar.count !== bar.submitted\"><span>Scored audits</span><b>{{ bar.count }}</b></div>\r\n <div class=\"db-tip-row\"><span>Pass mark</span><b>{{ passMark }}%</b></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- A month by date has ~30 bars: every few days get a label (first and last always), and the audit counts\r\n move to the bar tooltip, so the labels never run into each other. -->\r\n <div class=\"db-chart-x\" [class.is-dense]=\"denseTrend\">\r\n <span class=\"db-chart-xcol\" *ngFor=\"let bar of trendBars; let i = index; let last = last\" [class.is-pickable]=\"grain === 'quarter'\" (click)=\"selectQuarter(bar.key)\">\r\n <span class=\"db-chart-xlabel\" [class.is-active]=\"bar.key === quarter\" [style.visibility]=\"showXLabel(i, last) ? 'visible' : 'hidden'\">{{ bar.label }}</span>\r\n <span class=\"db-chart-xcount\" *ngIf=\"!denseTrend\">{{ bar.submitted ? bar.submitted + ' audits' : 'no audits' }}</span>\r\n </span>\r\n </div>\r\n </ng-container>\r\n </section>\r\n\r\n <!-- Score bands -->\r\n <section class=\"db-card db-card--tight\">\r\n <div class=\"db-card-head db-card-head--baseline\">\r\n <div class=\"db-card-title db-card-title--grow\">Score distribution</div>\r\n <div class=\"db-card-sub\">{{ storesInScope }} in scope</div>\r\n </div>\r\n <div class=\"db-card-sub\">Stores by score band, {{ periodLabel }}</div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"loading\" [rows]=\"2\"></lib-audit-v2-shimmer>\r\n\r\n <div class=\"db-bandbar\" *ngIf=\"!loading\">\r\n <!-- A band with stores keeps a visible sliver (2 of 3576 stores is under a pixel); the largest band gives way. -->\r\n <span class=\"db-bandseg\" *ngFor=\"let b of bandRows; trackBy: trackByBand\" [style.width]=\"b.width\" [style.background]=\"b.band.soft\"\r\n [class.has-stores]=\"b.count > 0\" [title]=\"b.band.label + ': ' + b.count\"></span>\r\n </div>\r\n\r\n <div class=\"db-bandrows\" *ngIf=\"!loading\">\r\n <div class=\"db-bandrow\" *ngFor=\"let b of bandRows; trackBy: trackByBand\">\r\n <span class=\"db-banddot\" [style.background]=\"b.band.soft\"></span>\r\n <span class=\"db-bandlabel\">{{ b.band.label }}</span>\r\n <span class=\"db-bandrange\">{{ b.band.range }}</span>\r\n <span class=\"db-bandcount\">{{ b.count }} {{ b.count === 1 ? 'store' : 'stores' }}</span>\r\n <span class=\"db-bandshare\">{{ b.share }}</span>\r\n <a class=\"db-bandlink\" [class.is-active]=\"storeListOpen && listBandKey === b.band.key\" (click)=\"applyBand(b.band)\">View stores</a>\r\n </div>\r\n </div>\r\n <div class=\"db-bandhint\" *ngIf=\"!loading && !showStoreList\">Click <b>View stores</b> on a band to list its stores.</div>\r\n </section>\r\n </div>\r\n\r\n <!-- Store ledger: opened from Score distribution -> View stores (or a Filters score range) -->\r\n <section class=\"db-card db-card--table\" id=\"ad-store-list\" *ngIf=\"showStoreList\">\r\n <div class=\"db-ledger-head\">\r\n <div class=\"db-ledger-text\">\r\n <div class=\"db-card-title\">Store list</div>\r\n <div class=\"db-card-sub\">\r\n {{ filteredRows.length }} {{ filteredRows.length === 1 ? 'store' : 'stores' }} \u00B7 {{ periodLabel }}\r\n </div>\r\n <div class=\"db-bandfilter\" *ngIf=\"listChipLabel\">\r\n <span class=\"db-bandchip\">\r\n {{ listChipLabel }}\r\n <span class=\"db-bandchip-x\" title=\"Close the store list\" (click)=\"closeStoreList()\">\r\n <svg width=\"9\" height=\"9\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </span>\r\n </span>\r\n <a class=\"db-bandlink\" (click)=\"showAllStores()\">Show all stores</a>\r\n </div>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <label class=\"av2-search db-search\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input [(ngModel)]=\"search\" (ngModelChange)=\"onSearch()\" type=\"text\" placeholder=\"Search store or owner\"\r\n autocomplete=\"off\" />\r\n </label>\r\n <div class=\"segmented\">\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'all'\" (click)=\"setStatus('all')\">All</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'fail'\" (click)=\"setStatus('fail')\">Fail</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'pass'\" (click)=\"setStatus('pass')\">Pass</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'unscored'\" (click)=\"setStatus('unscored')\"\r\n title=\"Audited, but compliance score is off for the audits\">Not scored</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'na'\" (click)=\"setStatus('na')\">Not audited</button>\r\n </div>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"loading\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!loading\">\r\n <div class=\"av2-table-wrap\">\r\n <table class=\"db-table\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let h of headers\" class=\"is-sortable\" [class.is-sorted]=\"sortKey === h.key\" (click)=\"sortBy(h.key)\">\r\n {{ h.label }} <lib-audit-v2-sort-icon [active]=\"sortKey === h.key\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon>\r\n </th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of pageRows; trackBy: trackByStore\">\r\n <td class=\"db-nowrap\">{{ row.date }}</td>\r\n <td>\r\n <a class=\"db-storeid\" routerLink=\"/manage/trax/audit-v2/dashboard/store\"\r\n [queryParams]=\"detailParams({ store: row.raw?.storeId || row.storeId })\">{{ row.storeId }}</a>\r\n </td>\r\n <td class=\"av2-ellipsis\">{{ row.circle }}</td>\r\n <td class=\"av2-ellipsis\">{{ row.zone }}</td>\r\n <td class=\"av2-ellipsis\">{{ row.aom }}</td>\r\n <td>\r\n <span class=\"db-pill\" [style.background]=\"bandFor(row).bg\" [style.color]=\"bandFor(row).fg\">\r\n {{ row.score === null ? '\u2014' : row.score + '%' }}\r\n </span>\r\n </td>\r\n <td>\r\n <span class=\"db-pill\" [style.background]=\"bandFor(row).bg\" [style.color]=\"bandFor(row).fg\">\r\n {{ statusLabel(row) }}\r\n </span>\r\n </td>\r\n <td>\r\n <div class=\"db-actions\">\r\n <!-- View opens the Gallery on the store's latest submitted audit in the period (QA 11 Oct); a store\r\n with no submission there opens its audit detail instead (same as the store link). -->\r\n <a class=\"db-viewbtn\" *ngIf=\"galleryAuditId(row) as auditId\" routerLink=\"/manage/trax/audit-v2/gallery\"\r\n [queryParams]=\"detailParams({ audit: auditId, store: row.raw?.storeId || row.storeId })\" title=\"View this store's submissions in the Gallery\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n View\r\n </a>\r\n <a class=\"db-viewbtn\" *ngIf=\"!galleryAuditId(row)\" routerLink=\"/manage/trax/audit-v2/dashboard/store\"\r\n [queryParams]=\"detailParams({ store: row.raw?.storeId || row.storeId })\" title=\"View this store's audits\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n View\r\n </a>\r\n <!-- PDF of the store's latest submitted audit in the period (queued, then under Notifications > Downloads). -->\r\n <a class=\"db-pdfbtn\" role=\"button\" [class.is-disabled]=\"!pdfVisitId(row)\"\r\n [attr.aria-disabled]=\"!pdfVisitId(row)\" (click)=\"downloadPdf(row)\"\r\n [title]=\"pdfVisitId(row) ? 'Download the PDF report of the latest submitted audit for this store' : 'No submitted audit for this store in this period'\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 4v12\"></path>\r\n <polyline points=\"7 11 12 16 17 11\"></polyline>\r\n <path d=\"M4 20h16\"></path>\r\n </svg>\r\n </a>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"!pageRows.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">No stores match the current filters.</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Shared pager (10 / 20 / 30), as on the other audit lists. -->\r\n <div class=\"db-perf-pager\" *ngIf=\"filteredRows.length\">\r\n <lib-pagination [itemsPerPage]=\"pageSize\" [pageSize]=\"pageSize\" [paginationSizes]=\"pageSizes\"\r\n [currentPage]=\"page\" [totalItems]=\"filteredRows.length\" (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </ng-container>\r\n </section>\r\n </ng-container>\r\n\r\n <!-- ============ TASK SUMMARY ============ -->\r\n <!-- Tasks raised from this client's audits, in the header scope (shimmer values while loading). -->\r\n <div class=\"db-stats\" *ngIf=\"isTaskModule\">\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.activeTasks }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Active {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body\">\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.taskInstances }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">{{ moduleTab }} Instances</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.notSubmitted }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Not Submitted {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body db-stat-body--2\">\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.openTasks }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Open {{ moduleTab }}s</div>\r\n </div>\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.inProgress }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">In Progress {{ moduleTab }}s</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.submitted }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Submitted {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body db-stat-body--3\">\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.completionScore }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Completion Score</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.completionDelta\" [ngClass]=\"taskDeltaClass('completion')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.completionDelta }}\r\n </div>\r\n </div>\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.complianceScore }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Compliance Score</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.complianceDelta\" [ngClass]=\"taskDeltaClass('compliance')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.complianceDelta }}\r\n </div>\r\n </div>\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid is-underline\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.totalFlags }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Total Flags</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.flagsDelta\" [ngClass]=\"taskDeltaClass('flags')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.flagsDelta }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ============ PERFORMANCE ============ -->\r\n <section class=\"db-perf\">\r\n <div class=\"db-perftabs\">\r\n <button type=\"button\" class=\"db-perftab\" *ngFor=\"let t of perfTabs\" [class.is-on]=\"perfTab === t\"\r\n (click)=\"setPerfTab(t)\">{{ perfTabDisplay(t) }}</button>\r\n </div>\r\n\r\n <div class=\"db-perf-head\">\r\n <div class=\"db-perf-text\">\r\n <div class=\"db-perf-title\">\r\n {{ perfInfoTitle }}\r\n <span class=\"db-total\">\r\n {{ perfTab === 'Audit' ? (isTaskModule ? filteredTaskPerf.length : filteredAuditPerf.length) : (perfTab === 'Store' ? filteredStorePerf.length : filteredUserPerf.length) }} Total\r\n </span>\r\n </div>\r\n <div class=\"db-card-sub\">{{ perfPeriod }}</div>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <label class=\"av2-search db-perf-search\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input type=\"text\" [placeholder]=\"perfSearchPlaceholder\" [(ngModel)]=\"perfSearch\" (ngModelChange)=\"onPerfSearch()\">\r\n </label>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" [disabled]=\"perfLoading || !perfRowCount\"\r\n title=\"Download this table as an Excel file\" (click)=\"exportPerformance()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 16V4\"></path>\r\n <polyline points=\"7 9 12 4 17 9\"></polyline>\r\n <path d=\"M4 16v4h16v-4\"></path>\r\n </svg>\r\n Export\r\n </button>\r\n <button type=\"button\" class=\"av2-btn db-create\" *ngIf=\"perfTab === 'Audit' && access.canAdd\" routerLink=\"/manage/trax/audit-v2/manage\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\"><path d=\"M12 5v14M5 12h14\"></path></svg>\r\n {{ perfCreateLabel }}\r\n </button>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"perfLoading\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!perfLoading\">\r\n <!-- Audit Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Audit' && !isTaskModule\">\r\n <table class=\"db-perftable db-perftable--audit\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of auditPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredAuditPerf); trackBy: trackByPerfAudit\">\r\n <td>\r\n <div class=\"db-name\">\r\n <span class=\"db-avatar\">{{ row.initials }}</span>\r\n <a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id })\">{{ row.name }}</a>\r\n </div>\r\n </td>\r\n <td>{{ row.assigned }}</td>\r\n <td>\r\n <!-- Opens the audit's detail page (as the eye does) on its submitted visits, as the v1 Checklist dashboard did. -->\r\n <a *ngIf=\"row.submitted\" class=\"db-ulink\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id, status: 'submit' })\"\r\n title=\"View the submitted visits\">{{ row.submitted }}</a>\r\n <span *ngIf=\"!row.submitted\">0</span>\r\n </td>\r\n <!-- Store disputes (questions) in the period, as a plain count (QA 10 Oct: no link). -->\r\n <td>\r\n <span *ngIf=\"row.disputes === null\" class=\"av2-faint\">\u2014</span>\r\n <span *ngIf=\"row.disputes !== null\">{{ row.disputes }}</span>\r\n </td>\r\n <td>{{ row.passMark }}</td>\r\n <td>\r\n <div class=\"db-score\" [class.is-empty]=\"row.score === '\u2014'\"\r\n [title]=\"row.score === '\u2014' ? 'Compliance score is off for this audit' : ''\">\r\n <span class=\"db-track db-track--6\"><span [style.width]=\"barWidth(row.scorePct)\"\r\n [style.background]=\"row.result === 'Pass' ? '#12B76A' : '#F04438'\"></span></span>\r\n <span class=\"db-scoretext\">{{ row.score }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <span *ngIf=\"row.result !== '\u2014'\" class=\"db-pill db-pill--strong\" [style.background]=\"row.result === 'Pass' ? '#ECFDF3' : '#FEF3F2'\"\r\n [style.color]=\"row.result === 'Pass' ? '#027A48' : '#B42318'\">{{ row.result }}</span>\r\n <span *ngIf=\"row.result === '\u2014'\" class=\"av2-faint\" title=\"Compliance score is off for this audit\">\u2014</span>\r\n </td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View audit\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredAuditPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No audit matches this search.' : 'There is no result for Audit Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Task Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Audit' && isTaskModule\">\r\n <table class=\"db-perftable db-perftable--task\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of taskPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredTaskPerf); trackBy: trackByPerfTask\">\r\n <td>\r\n <div class=\"db-name\">\r\n <span class=\"db-avatar\">{{ row.initials }}</span>\r\n <a class=\"db-link\" [title]=\"row.raw?.auditName ? 'Raised from ' + row.raw.auditName : ''\">{{ row.name }}</a>\r\n </div>\r\n </td>\r\n <td>{{ row.scheduled }}</td>\r\n <td class=\"db-medium\">{{ row.coverage }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>\r\n <!-- Opens the Gallery (Type Task) on this task's submissions in the dashboard period. -->\r\n <a *ngIf=\"row.submitted && row.raw?.taskId\" class=\"db-ulink\" routerLink=\"/manage/trax/audit-v2/gallery\"\r\n [queryParams]=\"taskSubmittedParams(row)\" title=\"View the submitted tasks in the Gallery\">{{ row.submitted }}</a>\r\n <span *ngIf=\"!row.submitted || !row.raw?.taskId\">{{ row.submitted }}</span>\r\n </td>\r\n <td><a class=\"db-ulink\">{{ row.flags }}</a></td>\r\n <td class=\"av2-faint\">{{ row.tasks }}</td>\r\n <td><a class=\"db-ulink\">{{ row.redo }}</a></td>\r\n <td>\r\n <div class=\"db-score\" [class.is-empty]=\"row.compliance === '\u2014'\">\r\n <span class=\"db-track db-track--6\"><span [style.width]=\"barWidth(row.compliancePct)\"></span></span>\r\n <span class=\"db-scoretext\">{{ row.compliance }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <!-- Opens the audit the task was raised from. -->\r\n <a class=\"db-eye\" title=\"View the audit this task was raised from\"\r\n [routerLink]=\"row.raw?.auditId ? '/manage/trax/audit-v2/dashboard/audit' : null\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.auditId })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredTaskPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">No tasks raised from audits in this period.</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Store Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Store'\">\r\n <table class=\"db-perftable db-perftable--store\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of storePerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredStorePerf); trackBy: trackByPerfStore\">\r\n <td>\r\n <a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/store\" [queryParams]=\"detailParams({ store: row.storeId || row.store })\">{{ row.store }}</a>\r\n </td>\r\n <td class=\"av2-ellipsis av2-dim\" [av2Tip]=\"row.storeId\">{{ row.storeId || '\u2014' }}</td>\r\n <td class=\"av2-ellipsis av2-dim\">{{ row.spoc }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>{{ row.flags ?? '\u2014' }}</td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.completion === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.completion)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.completion }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.compliance === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.compliance)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.compliance }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.perf === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.perf)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.perf }}</span></div></td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View store\" routerLink=\"/manage/trax/audit-v2/dashboard/store\" [queryParams]=\"detailParams({ store: row.storeId || row.store })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredStorePerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No store matches this search.' : 'There is no result for Store Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- User Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'User'\">\r\n <table class=\"db-perftable db-perftable--user\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of userPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredUserPerf); trackBy: trackByPerfUser\">\r\n <td class=\"av2-ellipsis\"><a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/user\" [queryParams]=\"detailParams({ email: row.email })\">{{ row.name }}</a></td>\r\n <td class=\"av2-ellipsis av2-dim\">{{ row.email }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>{{ row.flags }}</td>\r\n <td>{{ row.redo }}</td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.completion === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.completion)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.completion }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.compliance === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.compliance)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.compliance }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.perf === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.perf)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.perf }}</span></div></td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View user\" routerLink=\"/manage/trax/audit-v2/dashboard/user\" [queryParams]=\"detailParams({ email: row.email })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredUserPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No user matches this search.' : 'There is no result for User Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Shared pager (10 / 20 / 30), as on the other audit lists. -->\r\n <div class=\"db-perf-pager\" *ngIf=\"perfTotal\">\r\n <lib-pagination [itemsPerPage]=\"perfPageSize\" [pageSize]=\"perfPageSize\" [paginationSizes]=\"perfPageSizes\"\r\n [currentPage]=\"perfPage\" [totalItems]=\"perfTotal\" (pageChange)=\"onPerfPage($event)\"\r\n (pageSizeChange)=\"onPerfPageSize($event)\"></lib-pagination>\r\n </div>\r\n </ng-container>\r\n </section>\r\n\r\n <!-- ============ FILTER DRAWER ============ -->\r\n <div class=\"filter-backdrop\" *ngIf=\"filtersOpen\" (click)=\"cancelFilters()\"></div>\r\n\r\n <div class=\"filter-drawer\" *ngIf=\"filtersOpen && draft as dr\">\r\n <div class=\"drawer-head\">\r\n <span class=\"drawer-title\">Filters</span>\r\n <span class=\"db-countpill\" *ngIf=\"dr.filterCount\">{{ dr.filterCount }}</span>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"closebtn\" (click)=\"cancelFilters()\" title=\"Close\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-body\">\r\n <div class=\"drawer-nav\">\r\n <button type=\"button\" class=\"drawer-navitem\" *ngFor=\"let c of dr.filterCats; trackBy: trackByCat\" [class.navitem-active]=\"activeCat === c.key\"\r\n (click)=\"selectCat(c.key)\">\r\n <span class=\"navtext\">\r\n <span class=\"navtitle\">{{ c.label }}</span>\r\n <span class=\"navvalue\" [class.is-dirty]=\"c.dirty\">{{ c.value }}</span>\r\n </span>\r\n <span class=\"dirtydot\" *ngIf=\"c.dirty\"></span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-pane\">\r\n <div class=\"panetitle\">{{ dr.activeCatObj.title }}</div>\r\n <div class=\"panehint\">{{ dr.activeCatObj.sub }}</div>\r\n\r\n <!-- Period -->\r\n <ng-container *ngIf=\"activeCat === 'period'\">\r\n <div class=\"pane-options\">\r\n <div class=\"pane-option\" [class.is-on]=\"dr.grain === 'quarter'\" (click)=\"dr.setGrain('quarter')\">\r\n <span class=\"pane-radio\" [class.is-on]=\"dr.grain === 'quarter'\"><span></span></span>\r\n <span class=\"pane-option-text\">\r\n <span class=\"pane-option-label\">Quarterly</span>\r\n <span class=\"pane-option-help\">Read one financial quarter (April\u2013March year) at a time.</span>\r\n </span>\r\n </div>\r\n <div class=\"pane-option\" [class.is-on]=\"dr.grain === 'date'\" (click)=\"dr.setGrain('date')\">\r\n <span class=\"pane-radio\" [class.is-on]=\"dr.grain === 'date'\"><span></span></span>\r\n <span class=\"pane-option-text\">\r\n <span class=\"pane-option-label\">By date</span>\r\n <span class=\"pane-option-help\">Pick a custom start and end date.</span>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"pane-list\" *ngIf=\"dr.grain === 'quarter'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let q of dr.quarters\" [class.option-selected]=\"dr.quarter === q\"\r\n (click)=\"dr.selectQuarter(q)\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.quarter === q\">\r\n <svg *ngIf=\"dr.quarter === q\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">{{ q }} \u00B7 {{ quarterMonths(q) }}</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"pane-fields\" *ngIf=\"dr.grain === 'date'\">\r\n <div class=\"field\">\r\n <span class=\"field-label\">Date range</span>\r\n <div class=\"av2-datepick av2-datepick--compact\">\r\n <svg class=\"av2-datepick-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\r\n <input type=\"text\" class=\"av2-datepick-input db-daterange db-daterange--field\" ngxDaterangepickerMd readonly\r\n autocomplete=\"off\" placeholder=\"Select date range\" [(ngModel)]=\"dr.range\" [locale]=\"pickerLocale\"\r\n [maxDate]=\"today\" [dateLimit]=\"maxRangeDays\" [autoApply]=\"true\" [alwaysShowCalendars]=\"true\" [showCancel]=\"false\"\r\n [drops]=\"'down'\" [opens]=\"'right'\" (datesUpdated)=\"dr.onRangePicked($event)\">\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Scope -->\r\n <ng-container *ngIf=\"activeCat === 'scope'\">\r\n <div class=\"pane-stack\">\r\n <div class=\"field field--full\">\r\n <span class=\"field-label\">Circle Head <span class=\"field-meta\">{{ dr.circles.length }} users</span></span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.circle\" (ngModelChange)=\"dr.onCircleChange()\" [options]=\"dr.pickOptions(dr.circles, 'All Circles')\" ariaLabel=\"Circle\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.circle\">\r\n <span class=\"field-label\">Zone Manager</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.zone\" (ngModelChange)=\"dr.onZoneChange()\" [options]=\"dr.pickOptions(dr.zones, 'All zones')\" ariaLabel=\"Zone\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.zone\">\r\n <span class=\"field-label\">AOM</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.aom\" (ngModelChange)=\"dr.onAomChange()\" [options]=\"dr.pickOptions(dr.aoms, 'All AOMs')\" ariaLabel=\"AOM\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.aom\">\r\n <span class=\"field-label\">Store</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.store\" [options]=\"dr.storePickOptions\" ariaLabel=\"Store\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"readingrow\">\r\n <span class=\"readinglabel\">Reading</span>\r\n <span class=\"readingvalue\">{{ dr.scopeReading }}</span>\r\n <span class=\"av2-grow\"></span>\r\n <a class=\"db-bandlink\" (click)=\"dr.resetScope()\">Reset to all circles</a>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Audit type -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'type'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let t of auditTypes\" [class.option-selected]=\"dr.auditType === t.key\"\r\n (click)=\"dr.auditType = t.key\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.auditType === t.key\">\r\n <svg *ngIf=\"dr.auditType === t.key\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"opttext\">\r\n <span class=\"optlabel\">{{ t.label }}</span>\r\n <span class=\"optmeta\">{{ t.help }}</span>\r\n </span>\r\n </button>\r\n </div>\r\n\r\n <!-- Score band -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'band'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let b of dr.bandRows; trackBy: trackByBand\" [class.option-selected]=\"dr.isBandOn(b.band)\"\r\n (click)=\"dr.applyBand(b.band)\">\r\n <span class=\"db-banddot\" [style.background]=\"b.band.soft\"></span>\r\n <span class=\"opttext\">\r\n <span class=\"optlabel\">{{ b.band.label }}</span>\r\n <span class=\"optmeta\">{{ b.band.range }} \u00B7 {{ b.count }} stores</span>\r\n </span>\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm pane-resetbtn\" (click)=\"dr.clearBand()\">All scores</button>\r\n </div>\r\n\r\n <!-- Status -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'status'\">\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'all'\" (click)=\"dr.setStatus('all')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'all'\">\r\n <svg *ngIf=\"dr.status === 'all'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">All stores</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'fail'\" (click)=\"dr.setStatus('fail')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'fail'\">\r\n <svg *ngIf=\"dr.status === 'fail'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Fail</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'pass'\" (click)=\"dr.setStatus('pass')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'pass'\">\r\n <svg *ngIf=\"dr.status === 'pass'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Pass</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'unscored'\" (click)=\"dr.setStatus('unscored')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'unscored'\">\r\n <svg *ngIf=\"dr.status === 'unscored'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Not scored</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'na'\" (click)=\"dr.setStatus('na')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'na'\">\r\n <svg *ngIf=\"dr.status === 'na'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Not audited</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"drawer-foot\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" (click)=\"dr.clearAll()\">Clear all</button>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" (click)=\"cancelFilters()\">Cancel</button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--wide\" (click)=\"applyFilters()\">Apply filters</button>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.av2-page{display:flex;flex-direction:column;gap:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;color:#101828;-webkit-font-smoothing:antialiased}.av2-page *,.av2-page *:before,.av2-page *:after{box-sizing:border-box}.av2-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:20px 24px;display:flex;flex-direction:column;gap:20px}.av2-card--log{padding:20px 24px 24px;gap:18px}.av2-card--table{padding:20px 24px 24px;gap:16px}.av2-card-head{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap}.av2-card-head--center{align-items:center;gap:12px}.av2-title-block{display:flex;flex-direction:column;gap:4px;flex:1;min-width:220px}.av2-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828;display:flex;align-items:center;gap:10px}.av2-card-title--grow{flex:1;min-width:180px}.av2-card-sub{font-size:14px;line-height:20px;color:#667085}.av2-grow{flex:1}.av2-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.av2-grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:20px}.av2-grid-4{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.av2-stat-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:10px}.av2-stat{padding:8px 16px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;align-items:center;gap:20px}.av2-stat-value{font-size:30px;line-height:38px;font-weight:600;color:#101828}.av2-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-kpi{background:#fff;border-radius:10px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;display:flex;flex-direction:column;overflow:hidden}.av2-kpi.is-primary{box-shadow:inset 0 0 0 1px #99dbff,0 1px 2px #1018280d}.av2-kpi.is-primary .av2-kpi-head{background:#eaf8ff}.av2-kpi-head{padding:14px 18px;background:#f9fafb;font-size:16px;line-height:24px;font-weight:500;color:#101828}.av2-kpi-body{padding:16px 18px 18px;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.av2-kpi-value{font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-kpi-delta{display:flex;align-items:center;gap:4px;font-size:12px;color:#039855}.av2-kpi-delta.is-down{color:#d92d20}.av2-kpi-note{font-size:12px;color:#667085}.av2-ocard{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;display:flex;flex-direction:column;min-width:0;height:100%}.av2-ocard-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:2px;min-width:0}.av2-ocard-head--row{flex-direction:row;align-items:center;justify-content:flex-start;gap:12px}.av2-ocard-count{font-size:30px;line-height:38px;font-weight:600;color:#101828;white-space:nowrap}.av2-ocard-text{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-ocard-body{flex:1;padding:12px 14px;display:flex;gap:16px;min-width:0}.av2-ocard-cell{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.av2-ocard-cell--center{align-items:center;text-align:center}.av2-ocard-sub{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-ocard-note{font-size:14px;line-height:20px;font-weight:400;color:#667085}.av2-ocard-delta{margin-top:6px;display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;font-weight:400;color:#1d2939}.av2-ocard-delta b{font-weight:600;color:#667085}.av2-ocard-delta svg{flex-shrink:0;color:#039855}.av2-ocard-delta.is-down svg{color:#d92d20}.av2-search{position:relative;display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#98a2b3;font-size:14px;flex-shrink:0}.av2-search svg{flex-shrink:0}.av2-search input{flex:1;min-width:0;height:100%;border:0;outline:0;padding:0;background:transparent;font:inherit;font-size:14px;font-weight:500;color:#101828}.av2-search input::placeholder{color:#98a2b3}.av2-search:focus-within{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-search--sm{width:300px}.av2-search--md{width:320px}.av2-search--lg{width:340px}.av2-select{height:44px;padding:0 36px 0 12px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;font-size:14px;font-weight:500;color:#344054;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\");background-repeat:no-repeat;background-position:right 12px center;flex-shrink:0}.av2-select:focus{outline:0;box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-select--sm{width:180px}.av2-chip{display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-size:14px;color:#344054;white-space:nowrap;flex-shrink:0}.av2-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;height:44px;padding:0 16px;border:0;border-radius:8px;font-family:inherit;font-size:14px;line-height:20px;font-weight:600;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background-color .15s cubic-bezier(.4,0,.2,1)}.av2-btn svg{flex-shrink:0}.av2-btn:disabled{opacity:.55;cursor:not-allowed}.av2-btn--ghost{background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054;font-weight:500}.av2-btn--ghost:hover:not(:disabled){background:#f9fafb}.av2-btn--primary{background:#00a3ff;color:#fff;font-size:16px;line-height:24px}.av2-btn--primary:hover:not(:disabled){background:#009bf3}.av2-btn--sm{height:36px;padding:0 14px;font-size:13px}.av2-btn--wide{padding:0 18px}.av2-tabs{display:flex;align-items:center;gap:6px}.av2-tab{height:44px;padding:0 26px;border:0;border-radius:6px;background:transparent;display:inline-flex;align-items:center;justify-content:center;font-family:inherit;font-size:16px;font-weight:500;color:#475467;cursor:pointer}.av2-tab.is-active{background:#eaf8ff;color:#009bf3;font-weight:500}.av2-badge{display:inline-flex;align-items:center;height:22px;padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px;white-space:nowrap}.av2-badge--count{height:22px;padding:0 8px}.av2-badge--success{background:#ecfdf3;color:#027a48}.av2-badge--error{background:#fef3f2;color:#b42318}.av2-badge--warning{background:#fffaeb;color:#b54708}.av2-badge--gray{background:#f2f4f7;color:#344054}.av2-badge--purple{background:#f9f5ff;color:#5925dc}.av2-link{color:#00a3ff;font-size:14px;font-weight:500;text-decoration:underline;cursor:pointer}.av2-link:hover{color:#009bf3;text-decoration:underline}.av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.av2-muted{color:#667085}.av2-dim{color:#475467}.av2-faint{color:#98a2b3}table tbody td.av2-dim{color:#475467}table tbody td.av2-faint{color:#98a2b3}.av2-table-wrap{overflow-x:auto}.av2-table{width:100%;border-collapse:separate;border-spacing:0;margin:0}.av2-table thead th{background:#f9fafb;padding:12px;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;text-transform:none;letter-spacing:0;border:0;white-space:nowrap}.av2-table thead th:first-child{border-radius:8px 0 0}.av2-table thead th:last-child{border-radius:0 8px 0 0}.av2-table tbody td{padding:16px 12px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;font-weight:500;color:#101828;vertical-align:middle}.av2-table .av2-th-sort{display:inline-flex;align-items:center;gap:4px}.av2-table .av2-cell-icon{display:flex;align-items:center;gap:8px;min-width:0}.av2-table .av2-cell-icon svg{flex-shrink:0}.av2-table .av2-cell-icon span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-table .av2-cell-stack{display:flex;flex-direction:column;gap:2px}.av2-table .av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-sortable{cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap}.av2-table--lined thead th{background:transparent;border-bottom:1px solid #EAECF0;border-radius:0!important}.av2-empty{display:flex;flex-direction:column;align-items:center;gap:12px;padding:24px 16px 32px;text-align:center}.av2-empty-img{display:block;width:160px;height:120px}.av2-empty-text{display:flex;flex-direction:column;gap:4px;align-items:center}.av2-empty-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.av2-empty-sub{max-width:480px;font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.av2-col-head{border-radius:8px;background:#f9fafb;padding:14px 16px;font-size:12px;line-height:20px;font-weight:500;color:#344054;display:flex;align-items:center;gap:8px}.av2-avatar{width:32px;height:32px;flex-shrink:0;border-radius:9999px;background:#eaf8ff;color:#009bf3;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}.av2-bar{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:60px}.av2-bar span{display:block;height:5px;border-radius:9999px;background:#00a3ff}@keyframes av2-shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.av2-sk{display:block;width:100%;max-width:100%;height:12px;border-radius:4px;flex-shrink:0;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%;animation:av2-shimmer 3s linear infinite}.av2-sk--value{width:72px;height:28px;border-radius:6px}.av2-sk--title{width:220px;height:18px}.av2-sk--note{width:60%}.av2-sk--block{border-radius:8px}@media (prefers-reduced-motion: reduce){.av2-sk{animation:none}}:host ::ng-deep lib-pagination{display:block}:host ::ng-deep lib-pagination .container{max-width:none;padding:0;display:flex;align-items:center;justify-content:center;gap:16px;flex-wrap:wrap;font-size:14px;color:#475467}:host ::ng-deep lib-pagination .mt-4{margin-top:0!important}:host ::ng-deep lib-pagination .container>.text-center{display:flex;align-items:center}:host ::ng-deep lib-pagination .container>.text-center>ul:not(.ngx-pagination){display:none}:host ::ng-deep lib-pagination pagination-controls{display:flex;align-items:center}:host ::ng-deep lib-pagination .sub-title{color:#475467!important;font-size:14px!important;font-weight:400!important;line-height:20px}:host ::ng-deep lib-pagination .border-val{height:40px;min-width:64px;padding:0 30px 0 12px!important;border:1px solid #D0D5DD!important;border-radius:8px!important;box-shadow:0 1px 2px #1018280d;background-color:#fff;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23667085' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E\")!important;background-repeat:no-repeat!important;background-position:right 10px center!important;background-size:14px 14px!important;appearance:none;-webkit-appearance:none;font-size:14px;font-weight:500;color:#1d2939;cursor:pointer;transition:border-color .15s ease,box-shadow .15s ease}:host ::ng-deep lib-pagination .border-val:hover{border-color:#98a2b3!important}:host ::ng-deep lib-pagination .border-val:focus{outline:none;border-color:#66c8ff!important;box-shadow:0 0 0 3px #eaf8ff}:host ::ng-deep lib-pagination .ngx-pagination{margin:0;padding:0;display:flex;align-items:center;gap:6px;color:#475467!important;font-size:14px!important;font-weight:500}:host ::ng-deep lib-pagination .ngx-pagination li{display:inline-flex;margin:0}:host ::ng-deep lib-pagination .ngx-pagination li.small-screen{display:none!important}:host ::ng-deep lib-pagination .ngx-pagination a,:host ::ng-deep lib-pagination .ngx-pagination button,:host ::ng-deep lib-pagination .ngx-pagination .current,:host ::ng-deep lib-pagination .ngx-pagination .disabled{min-width:40px!important;height:40px;padding:0 8px!important;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;line-height:20px;color:#475467}:host ::ng-deep lib-pagination .ngx-pagination a:hover,:host ::ng-deep lib-pagination .ngx-pagination button:hover{background:#f2f4f7;padding:0 8px!important}:host ::ng-deep lib-pagination .ngx-pagination .current{background:#eaf8ff!important;color:#00a3ff!important;font-weight:600;font-size:14px!important}:host ::ng-deep lib-pagination .ngx-pagination .disabled{color:#98a2b3}:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:after{margin:0}:host ::ng-deep lib-pagination .ngx-pagination .ellipsis:after{color:#98a2b3;padding:0}.db-topline{display:flex;align-items:center;gap:12px}.db-refresh{font-size:15px;font-weight:600;color:#344054}.moduleswitch{display:flex;border-radius:8px;overflow:hidden;box-shadow:inset 0 0 0 1px #d0d5dd}.moduletab{padding:8px 24px;border:none;background:#fff;font-family:inherit;font-size:16px;line-height:24px;font-weight:500;color:#344054;white-space:nowrap;cursor:pointer}.moduletab:first-child{box-shadow:inset -1px 0 #d0d5dd}.moduletab.moduletab-on{background:#00a3ff;color:#fff}.db-scopebar{display:flex;flex-wrap:wrap;align-items:center;gap:12px}.db-scopetext{flex:1 1 300px;min-width:0;display:flex;flex-direction:column;gap:1px}.db-crumb{font-size:13px;line-height:20px;color:#667085}.db-scope{font-size:16px;line-height:24px;font-weight:600;color:#101828;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.db-countpill{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;border-radius:9999px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:700}.db-chips{display:flex;flex-wrap:wrap;align-items:center;gap:10px}.db-chip{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 12px;border:none;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0;font-family:inherit;font-size:13px;line-height:20px;white-space:nowrap;cursor:pointer}.db-chip:hover{background:#f9fafb}.db-chip.is-dirty{box-shadow:inset 0 0 0 1px #99dbff}.db-chip.is-dirty .db-chip-value{color:#009bf3}.db-chip-label{color:#667085;font-weight:500}.db-chip-value{font-weight:600;color:#101828}.db-clearall{border:none;background:transparent;padding:0 4px;font-family:inherit;font-size:13px;font-weight:600;color:#00a3ff;cursor:pointer}.db-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.db-sk-value{margin:2px 0}.db-sk-chart{height:250px}.db-sk-mid{width:48px;height:22px;margin:4px 0;border-radius:6px}.db-duo{display:grid;grid-template-columns:repeat(auto-fit,minmax(340px,1fr));gap:16px;align-items:stretch}.db-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:18px 20px;display:flex;flex-direction:column;gap:12px;min-width:0}.db-card--tight{gap:4px}.db-card--table{padding:0;gap:0;overflow:hidden;scroll-margin-top:16px}.db-card-head{display:flex;align-items:center;gap:10px}.db-card-head--wrap{flex-wrap:wrap}.db-card-head--baseline{align-items:baseline}.db-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828}.db-card-title--grow{flex:1 1 160px;min-width:0}.db-card-sub{font-size:13px;line-height:20px;color:#667085}.db-seg{display:flex;border-radius:8px;overflow:hidden;box-shadow:inset 0 0 0 1px #d0d5dd}.db-seg-tab{padding:8px 14px;border:none;background:#fff;font-family:inherit;font-size:14px;font-weight:500;color:#475467;white-space:nowrap;cursor:pointer}.db-seg-tab.is-on{background:#00a3ff;color:#fff}.db-daterow{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.av2-datepick{position:relative;display:inline-flex;align-items:center}.av2-datepick-icon{position:absolute;left:10px;color:#667085;pointer-events:none}.av2-datepick-input{height:36px;padding:0 10px 0 32px;border:none;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;background:#fff;font-family:inherit;font-size:13px;font-weight:500;color:#101828;cursor:pointer;outline:none}.av2-datepick-input:focus{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}:host ::ng-deep .av2-datepick .md-drppicker{margin-top:4px;z-index:1060;font-family:inherit;border-radius:8px;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808,inset 0 0 0 1px #eaecf0}:host ::ng-deep .av2-datepick .md-drppicker.double,:host ::ng-deep .av2-datepick .md-drppicker.show-ranges{width:max-content}:host ::ng-deep .av2-datepick .md-drppicker.ltr .ranges{float:left;margin-top:10px}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button{width:160px;padding:12px 16px;border:none;border-radius:8px;background:none;color:#344054;font-size:14px;font-weight:400;line-height:20px;text-align:left;cursor:pointer}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button.active{background:#eaf8ff;color:#00a3ff;font-weight:500}:host ::ng-deep .av2-datepick .md-drppicker th,:host ::ng-deep .av2-datepick .md-drppicker td{width:40px!important;height:40px!important;min-width:32px;padding:0!important;border:1px solid transparent!important;background:transparent!important;font-size:14px!important;font-weight:400!important;line-height:38px}:host ::ng-deep .av2-datepick .md-drppicker th{color:#344054!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker th.month{width:auto!important;font-size:16px!important}:host ::ng-deep .av2-datepick .md-drppicker td{color:#344054!important}:host ::ng-deep .av2-datepick .md-drppicker th.available.prev,:host ::ng-deep .av2-datepick .md-drppicker th.available.next{background:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='15 6 9 12 15 18'/%3E%3C/svg%3E\") center/18px no-repeat!important}:host ::ng-deep .av2-datepick .md-drppicker th.available:hover,:host ::ng-deep .av2-datepick .md-drppicker td.available:hover{background-color:#f2f4f7!important}:host ::ng-deep .av2-datepick .md-drppicker td.in-range{background-color:#eaf8ff!important;color:#101828!important}:host ::ng-deep .av2-datepick .md-drppicker td.active,:host ::ng-deep .av2-datepick .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px;color:#fff!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker td.off,:host ::ng-deep .av2-datepick .md-drppicker td.off.in-range{color:#98a2b3!important;background-color:transparent!important}:host ::ng-deep .av2-datepick .md-drppicker td.disabled{color:#98a2b3!important;background-color:transparent!important;text-decoration:line-through;pointer-events:none}:host ::ng-deep .av2-datepick--compact .md-drppicker th,:host ::ng-deep .av2-datepick--compact .md-drppicker td{width:32px!important;height:32px!important;font-size:12px!important;line-height:30px}:host ::ng-deep .av2-datepick--compact .md-drppicker th.month{font-size:14px!important}.db-daterange{width:220px}.db-daterange--field{height:40px;font-size:14px;font-weight:600}.db-focus{display:flex;flex-wrap:wrap;align-items:baseline;gap:8px 14px}.db-focus-score{font-size:32px;line-height:38px;font-weight:700;color:#039855}.db-focus-score.is-fail{color:#d92d20}.db-focus-pill{display:inline-flex;align-items:center;padding:3px 10px;border-radius:9999px;font-size:12px;line-height:18px;font-weight:700}.db-focus-pill.is-pass{background:#ecfdf3;color:#027a48}.db-focus-pill.is-fail{background:#fef3f2;color:#b42318}.db-focus-line{flex:1 1 200px;min-width:0;font-size:13px;line-height:20px;color:#667085;text-wrap:pretty}.db-legend{display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;color:#475467}.db-legend-dash{width:18px;height:0;border-top:2px dashed #00A3FF;display:block}.db-chart{display:flex;gap:10px;min-width:0}.db-chart-y{flex:0 0 34px;position:relative;height:186px}.db-chart-y span{position:absolute;right:0;transform:translateY(-50%);font-size:11px;line-height:16px;color:#98a2b3}.db-chart-area{flex:1;min-width:0;position:relative;height:186px}.db-gridline{position:absolute;left:0;right:0;height:0;border-top:1px solid #F2F4F7;display:block}.db-passline{position:absolute;left:0;right:0;height:0;border-top:2px dashed #00A3FF;display:block}.db-bars{position:absolute;inset:0;display:flex;align-items:flex-end;gap:8px}.db-bar-col{position:relative;flex:1;min-width:0;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:flex-end}.db-bar-value{position:absolute;left:0;right:0;text-align:center;margin-bottom:2px;font-size:13px;line-height:20px;font-weight:700;white-space:nowrap;color:#344054}.db-bar-value.is-active{color:#101828}.db-bar{display:block;width:100%;max-width:72px;border-radius:6px 6px 0 0}.db-tip{position:absolute;left:50%;z-index:5;min-width:168px;padding:10px 12px;border-radius:8px;background:#101828;color:#fff;box-shadow:0 12px 16px -4px #1018282e,0 4px 6px -2px #10182814;font-size:12px;line-height:18px;white-space:nowrap;text-align:left;pointer-events:none;opacity:0;visibility:hidden;transform:translate(-50%,4px);transition:opacity .12s ease,transform .12s ease,visibility .12s}.db-tip.is-start{left:0;transform:translateY(4px)}.db-tip.is-end{left:auto;right:0;transform:translateY(4px)}.db-bar-col:hover .db-tip{opacity:1;visibility:visible;transform:translate(-50%)}.db-bar-col:hover .db-tip.is-start,.db-bar-col:hover .db-tip.is-end{transform:translate(0)}.db-tip-head{font-weight:600;color:#fff}.db-tip-sub{font-weight:400;color:#d0d5dd}.db-tip-score{display:flex;align-items:center;gap:6px;margin:6px 0 8px}.db-tip-dot{width:8px;height:8px;border-radius:9999px;background:#00a3ff;flex:0 0 auto}.db-tip-dot.is-fail{background:#f04438}.db-tip-value{font-size:16px;line-height:24px;font-weight:700}.db-tip-status{margin-left:auto;padding:0 6px;border-radius:9999px;font-size:11px;line-height:18px;font-weight:600;background:#2e91fa33;color:#84caff}.db-tip-status.is-fail{background:#f0443833;color:#fda29b}.db-tip-empty{margin:6px 0 8px;color:#d0d5dd}.db-tip-row{display:flex;justify-content:space-between;gap:16px;padding-top:4px;border-top:1px solid rgba(255,255,255,.08);color:#d0d5dd}.db-tip-row+.db-tip-row{border-top:0;padding-top:2px}.db-tip-row b{font-weight:600;color:#fff}.db-chart-x{display:flex;gap:8px;padding-left:44px}.db-chart-xcol{flex:1;min-width:0;display:flex;flex-direction:column;align-items:center;gap:1px}.db-bar-col.is-pickable,.db-chart-xcol.is-pickable{cursor:pointer}.db-chart-xlabel{font-size:11px;line-height:16px;white-space:nowrap;color:#475467}.db-chart-xlabel.is-active{font-weight:700;color:#101828}.db-chart-x.is-dense .db-chart-xcol{overflow:visible}.db-chart-xcount{font-size:11px;line-height:16px;color:#98a2b3;white-space:nowrap}.db-bandbar{display:flex;height:14px;border-radius:9999px;overflow:hidden;background:#f2f4f7;margin-top:14px}.db-bandseg{display:block;height:14px}.db-bandseg.has-stores{min-width:8px}.db-bandrows{flex:1;display:grid;grid-template-columns:10px minmax(0,1fr) auto auto auto auto;grid-auto-rows:1fr;column-gap:12px;margin-top:12px}.db-bandrow{grid-column:1/-1;display:grid;grid-template-columns:subgrid;align-items:center;min-height:40px;padding:9px 0;border-bottom:1px solid #F2F4F7}.db-bandrow:last-child{border-bottom:0}.db-banddot{grid-column:1}.db-bandlabel{grid-column:2}.db-bandrange{grid-column:3}.db-bandcount{grid-column:4}.db-bandshare{grid-column:5}.db-bandlink{grid-column:6}@media (max-width: 575px){.db-bandrows{grid-template-columns:10px minmax(0,1fr) 0 auto auto auto;column-gap:8px}.db-bandrange{display:none}}.db-banddot{width:10px;height:10px;border-radius:3px;flex-shrink:0;display:block}.db-bandlabel{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px;line-height:20px;font-weight:500;color:#1d2939}.db-bandrange{font-size:12px;line-height:18px;color:#667085;white-space:nowrap;text-align:right}.db-bandcount{font-size:13px;line-height:20px;font-weight:600;color:#101828;text-align:right;white-space:nowrap}.db-bandshare{font-size:12px;line-height:18px;color:#667085;min-width:36px;text-align:right;font-variant-numeric:tabular-nums}.db-bandlink{font-size:12px;line-height:18px;font-weight:600;color:#00a3ff;white-space:nowrap;cursor:pointer}.db-bandlink:hover,.db-bandlink.is-active{color:#009bf3;text-decoration:underline}.db-ledger-head{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:18px 20px}.db-ledger-text{flex:1 1 220px;min-width:0;display:flex;flex-direction:column;gap:2px}.db-bandfilter{display:flex;align-items:center;gap:8px;margin-top:4px;flex-wrap:wrap}.db-bandchip{display:inline-flex;align-items:center;gap:6px;padding:3px 6px 3px 10px;border-radius:9999px;background:#eaf8ff;box-shadow:inset 0 0 0 1px #99dbff;font-size:12px;font-weight:600;white-space:nowrap;color:#009bf3}.db-bandchip-x{width:16px;height:16px;border-radius:9999px;display:flex;align-items:center;justify-content:center;cursor:pointer;background:#ccedff}.db-search{width:240px}.db-search input{font-size:13px}.segmented{display:flex;padding:3px;border-radius:8px;background:#f2f4f7}.segtab{padding:7px 16px;border:none;border-radius:6px;background:transparent;font-family:inherit;font-size:14px;font-weight:500;color:#475467;cursor:pointer;white-space:nowrap}.segtab.segtab-on{background:#fff;color:#101828;box-shadow:0 1px 2px #1018280d}.db-table{width:100%;min-width:1060px;border-collapse:separate;border-spacing:0;margin:0}.db-table thead th{padding:10px 20px;background:#f9fafb;border:0;border-top:1px solid #EAECF0;border-bottom:1px solid #EAECF0;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;white-space:nowrap}.db-table thead th.is-sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.db-table thead th.is-sorted{color:#101828}.db-table tbody td{padding:12px 20px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;color:#344054;vertical-align:middle}.db-table tbody tr:hover td{background:#fcfcfd}.db-nowrap{white-space:nowrap}.db-storeid{font-weight:600;color:#101828;cursor:pointer}.db-storeid:hover{color:#009bf3;text-decoration:underline}.db-pill{display:inline-block;padding:2px 10px;border-radius:9999px;font-size:12px;font-weight:600;white-space:nowrap}.db-pill--strong{padding:3px 10px}.db-actions{display:flex;align-items:center;gap:6px}.db-viewbtn{display:inline-flex;align-items:center;gap:5px;height:28px;padding:0 10px;border-radius:6px;font-size:12px;font-weight:600;color:#009bf3;cursor:pointer;box-shadow:inset 0 0 0 1px #99dbff;white-space:nowrap}.db-viewbtn:hover{background:#eaf8ff;color:#009bf3}.db-pdfbtn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:6px;color:#475467;cursor:pointer;box-shadow:inset 0 0 0 1px #d0d5dd}.db-pdfbtn:hover{background:#f9fafb;color:#344054}.db-pdfbtn.is-disabled{color:#d0d5dd;cursor:not-allowed}.db-pdfbtn.is-disabled:hover{background:transparent;color:#d0d5dd}.db-empty{padding:28px 20px;text-align:center;font-size:13px;color:#667085}.db-pager{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:14px 20px;font-size:13px;color:#475467}.db-pagebtn{width:32px;height:32px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;display:flex;align-items:center;justify-content:center;color:#475467;cursor:pointer}.db-pagebtn:hover:not(:disabled){background:#f9fafb}.db-pagebtn:disabled{color:#d0d5dd;cursor:default}.db-stats{display:grid;grid-template-columns:.9fr 1.6fr 2fr;gap:16px;align-items:stretch}.db-stat{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;overflow:hidden;display:flex;flex-direction:column}.db-stat-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d}.db-stat-big{font-size:30px;line-height:38px;font-weight:600;color:#101828}.db-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.db-stat-body{padding:12px 14px;display:grid;grid-template-columns:1fr;gap:16px}.db-stat-body--2{grid-template-columns:1fr 1fr}.db-stat-body--3{grid-template-columns:repeat(3,1fr)}.db-stat-cell{display:flex;flex-direction:column;gap:2px}.db-stat-mid{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.db-stat-mid.is-underline{text-decoration:underline}.db-stat-sub{font-size:14px;line-height:20px;font-weight:500;color:#344054}.db-stat-delta{display:flex;align-items:center;gap:5px;font-size:12px;color:#d92d20}.db-stat-delta.is-good{color:#039855}.db-stat-delta.is-bad{color:#d92d20}.db-stat-delta.is-flat{color:#667085}.db-stat-delta.is-down svg{transform:scaleY(-1)}.db-perf{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:16px 20px 8px;display:flex;flex-direction:column;gap:16px}.db-perftabs{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.db-perftab{padding:10px 18px;border:none;border-radius:8px;background:transparent;font-family:inherit;font-size:14px;font-weight:500;color:#475467;white-space:nowrap;cursor:pointer}.db-perftab.is-on{background:#eaf8ff;color:#009bf3;font-weight:600}.db-perf-head{display:flex;align-items:flex-start;gap:12px;flex-wrap:wrap}.db-perf-text{display:flex;flex-direction:column;gap:2px}.db-perf-title{display:flex;align-items:center;gap:8px;font-size:20px;line-height:30px;font-weight:600;color:#101828}.db-total{font-size:12px;font-weight:500;border-radius:9999px;padding:2px 10px;background:#eaf8ff;color:#009bf3;white-space:nowrap}.db-perf-search{width:250px}.db-create{gap:6px;padding:0 18px;background:#00a3ff;color:#fff}.db-create:hover:not(:disabled){background:#00a3ff}.db-perftable{width:100%;border-collapse:separate;border-spacing:0;margin:0;table-layout:fixed}.db-perftable thead th{padding:10px 4px;background:#f9fafb;border:0;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;white-space:nowrap}.db-perftable thead th:first-child{border-radius:8px 0 0 8px}.db-perftable thead th:last-child{border-radius:0 8px 8px 0}.db-perftable tbody td{padding:14px 4px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;color:#344054;vertical-align:middle}.db-perftable--audit tbody td{padding:16px 4px}.db-perftable--audit th:nth-child(1){width:28%}.db-perftable--audit th:nth-child(2),.db-perftable--audit th:nth-child(3){width:10%}.db-perftable--audit th:nth-child(4),.db-perftable--audit th:nth-child(5){width:9%}.db-perftable--audit th:nth-child(6){width:18%}.db-perftable--audit th:nth-child(7){width:10%}.db-perftable--audit th:nth-child(8){width:6%}.db-perftable--task tbody td{padding:16px 4px}.db-perftable--task th:nth-child(1){width:22%}.db-perftable--task th:nth-child(2),.db-perftable--task th:nth-child(3){width:7.5%}.db-perftable--task th:nth-child(4),.db-perftable--task th:nth-child(5){width:8.5%}.db-perftable--task th:nth-child(6),.db-perftable--task th:nth-child(7),.db-perftable--task th:nth-child(8){width:6.5%}.db-perftable--task th:nth-child(9){width:15%}.db-perftable--task th:nth-child(10){width:6%}.db-perftable--store th:nth-child(1){width:15%}.db-perftable--store th:nth-child(2){width:10%}.db-perftable--store th:nth-child(3){width:17%}.db-perftable--store th:nth-child(4){width:8%}.db-perftable--store th:nth-child(5){width:7%}.db-perftable--store th:nth-child(6),.db-perftable--store th:nth-child(7),.db-perftable--store th:nth-child(8){width:12%}.db-perftable--store th:nth-child(9){width:7%}.db-perftable--user th:nth-child(1){width:15%}.db-perftable--user th:nth-child(2){width:22%}.db-perftable--user th:nth-child(3){width:9%}.db-perftable--user th:nth-child(4),.db-perftable--user th:nth-child(5){width:6%}.db-perftable--user th:nth-child(6),.db-perftable--user th:nth-child(7),.db-perftable--user th:nth-child(8){width:12%}.db-perftable--user th:nth-child(9){width:5%}.db-table thead th,.db-table tbody td,.db-perftable thead th,.db-perftable tbody td{height:auto!important}.db-table thead th,.db-perftable thead th{font-size:12px!important;font-weight:500!important;background:#f9fafb!important}.db-table thead th{padding:10px 20px!important;border-bottom:1px solid #EAECF0!important;color:#667085!important}.db-table thead th.is-sorted{color:#101828!important}.db-table tbody td{padding:12px 20px!important}.db-perftable thead th{padding:10px 4px!important;border-bottom:0!important;color:#667085!important}.db-perftable thead th.is-sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.db-perftable thead th.is-sorted{color:#101828!important}.db-perftable tbody td{padding:14px 4px!important}.db-perftable--audit tbody td,.db-perftable--task tbody td{padding:16px 4px!important}.db-name{display:flex;align-items:center;gap:10px;min-width:0}.db-avatar{width:34px;height:34px;flex-shrink:0;border-radius:9999px;background:#f2f4f7;color:#475467;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:600}.db-link{font-size:13px;font-weight:500;color:#00a3ff;text-decoration:underline;cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.db-link:hover{color:#009bf3}.db-ulink{color:#00a3ff;text-decoration:underline;cursor:pointer}.db-medium{font-weight:500}.db-score{display:flex;align-items:center;gap:8px}.db-score.is-empty .db-track{display:none}.db-track{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:40px}.db-track>span{display:block;height:100%;border-radius:9999px;background:#00a3ff}.db-track--6{height:6px}.db-scoretext{font-weight:600;white-space:nowrap}.db-scoretext--sm{font-size:12px;color:#475467}.db-eye{width:22px;height:22px;display:inline-flex;align-items:center;justify-content:center;color:#98a2b3;cursor:pointer}.db-eye:hover{color:#00a3ff}.db-perf-pager{display:flex;align-items:center;justify-content:center;gap:10px;padding:12px 4px;font-size:13px;color:#475467}.db-pagebox{display:inline-flex;align-items:center;padding:4px 12px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd}.db-page{display:inline-flex;align-items:center;padding:4px 12px;border-radius:8px}.db-page.is-active{background:#eaf8ff;color:#009bf3;font-weight:600}.filter-backdrop{position:fixed;inset:0;background:#10182873;z-index:1050}.filter-drawer{position:fixed;top:0;right:0;bottom:0;width:860px;max-width:96vw;display:flex;flex-direction:column;background:#fff;box-shadow:-10px 0 30px #1018282e;z-index:1051;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.drawer-head{display:flex;align-items:center;gap:10px;padding:18px 20px;box-shadow:inset 0 -1px #eaecf0}.drawer-title{font-size:17px;line-height:26px;font-weight:700;color:#101828}.closebtn{width:32px;height:32px;border:none;border-radius:8px;background:transparent;color:#667085;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.closebtn:hover{background:#f2f4f7;color:#344054}.drawer-body{display:flex;flex:1;min-height:0}.drawer-nav{flex:0 0 280px;max-width:280px;background:#f9fafb;box-shadow:inset -1px 0 #eaecf0;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:4px}.drawer-navitem{display:flex;align-items:center;gap:10px;width:100%;padding:12px 14px;border:none;border-radius:8px;background:transparent;text-align:left;font-family:inherit;cursor:pointer}.drawer-navitem:hover{background:#fff}.drawer-navitem.navitem-active{background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d}.navtext{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.navtitle{font-size:13px;line-height:20px;font-weight:600;color:#101828}.navvalue{font-size:13px;line-height:20px;color:#667085;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.navvalue.is-dirty{color:#009bf3}.dirtydot{width:8px;height:8px;border-radius:9999px;background:#00a3ff;flex-shrink:0;display:block}.drawer-pane{flex:1;min-width:0;overflow-y:auto;padding:24px 28px;display:flex;flex-direction:column;gap:6px}.panetitle{font-size:17px;line-height:26px;font-weight:700;color:#101828}.panehint{font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.pane-options{display:flex;flex-direction:column;gap:10px;margin-top:14px}.pane-option{display:flex;align-items:flex-start;gap:12px;padding:14px 16px;border-radius:8px;cursor:pointer;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0}.pane-option.is-on{background:#f5fbff;box-shadow:inset 0 0 0 1.5px #00a3ff}.pane-radio{width:18px;height:18px;flex-shrink:0;margin-top:2px;border-radius:9999px;display:flex;align-items:center;justify-content:center;box-shadow:inset 0 0 0 1px #d0d5dd}.pane-radio>span{width:8px;height:8px;border-radius:9999px;background:transparent;display:block}.pane-radio.is-on{box-shadow:inset 0 0 0 1.5px #00a3ff}.pane-radio.is-on>span{background:#00a3ff}.pane-option-text{display:flex;flex-direction:column;gap:2px}.pane-option-label{font-size:14px;line-height:20px;font-weight:600;color:#101828}.pane-option-help{font-size:13px;line-height:20px;color:#667085}.pane-list{display:flex;flex-direction:column;gap:2px;margin-top:14px}.pane-stack{display:flex;flex-direction:column;gap:16px;margin-top:14px}.pane-fields{display:flex;align-items:flex-end;gap:14px;flex-wrap:wrap;margin-top:14px}.pane-resetbtn{align-self:flex-start;margin-top:12px}.field{display:flex;flex-direction:column;gap:6px}.field--full{max-width:420px}.field-label{font-size:12px;line-height:18px;font-weight:600;color:#344054}.field-meta{font-weight:400;color:#667085;margin-left:6px}.field-select{width:100%}.readingrow{display:flex;align-items:center;gap:12px;padding:12px 14px;border-radius:8px;background:#f9fafb;box-shadow:inset 0 0 0 1px #eaecf0;font-size:13px}.readinglabel{font-weight:600;color:#344054}.readingvalue{color:#101828}.optionrow{display:flex;align-items:center;gap:10px;width:100%;padding:11px 12px;border:none;border-radius:8px;background:transparent;text-align:left;font-family:inherit;cursor:pointer}.optionrow:hover{background:#f9fafb}.optionrow.option-selected{background:#eaf8ff}.optionrow.option-selected .optlabel{font-weight:600}.optionmark{display:flex;align-items:center;justify-content:center;width:18px;height:18px;flex-shrink:0;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#fff}.optionmark.mark-on{background:#00a3ff;box-shadow:none}.opttext{flex:1;min-width:0;display:flex;flex-direction:column}.optlabel{font-size:13px;line-height:20px;font-weight:500;color:#1d2939}.optmeta{font-size:11px;line-height:16px;color:#667085}.drawer-foot{display:flex;align-items:center;gap:10px;padding:14px 20px;box-shadow:inset 0 1px #eaecf0}.db-bandhint{margin-top:4px;font-size:12px;color:#667085}.db-bandhint b{color:#344054;font-weight:600}\n"] }]
1528
+ args: [{ selector: 'lib-audit-v2-dashboard', template: "<div class=\"av2-page audit-dash\">\r\n\r\n <!-- Refresh line + module switch -->\r\n <div class=\"db-topline\">\r\n <div class=\"db-refresh\">Last refreshed at {{ lastRefreshed }}</div>\r\n <div class=\"av2-grow\"></div>\r\n <div class=\"moduleswitch\">\r\n <button type=\"button\" class=\"moduletab\" *ngFor=\"let t of moduleTabs\" [class.moduletab-on]=\"moduleTab === t\"\r\n (click)=\"setModuleTab(t)\">{{ t }}</button>\r\n </div>\r\n </div>\r\n\r\n <!-- ============ AUDIT SCORECARD ============ -->\r\n <ng-container *ngIf=\"!isTaskModule\">\r\n\r\n <!-- Crumb, scope title, actions -->\r\n <div class=\"db-scopebar\">\r\n <div class=\"db-scopetext\">\r\n <div class=\"db-crumb\">Audits \u203A Dashboard</div>\r\n <div class=\"db-scope\">{{ scopeLabel }}</div>\r\n </div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"openFilters()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <line x1=\"4\" y1=\"7\" x2=\"20\" y2=\"7\"></line>\r\n <line x1=\"7\" y1=\"12\" x2=\"17\" y2=\"12\"></line>\r\n <line x1=\"10\" y1=\"17\" x2=\"14\" y2=\"17\"></line>\r\n </svg>\r\n Filters\r\n <span class=\"db-countpill\" *ngIf=\"filterCount\">{{ filterCount }}</span>\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" [disabled]=\"loading || !filteredRows.length\"\r\n title=\"Download the store list below as an Excel file\" (click)=\"exportStores()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 16V4\"></path>\r\n <polyline points=\"7 9 12 4 17 9\"></polyline>\r\n <path d=\"M4 16v4h16v-4\"></path>\r\n </svg>\r\n Export\r\n </button>\r\n </div>\r\n\r\n <!-- Filter chips -->\r\n <div class=\"db-chips\">\r\n <button type=\"button\" class=\"db-chip\" *ngFor=\"let c of filterCats; trackBy: trackByCat\" [class.is-dirty]=\"c.dirty\"\r\n (click)=\"openFilters(c.key)\">\r\n <span class=\"db-chip-label\">{{ c.label }}</span>\r\n <span class=\"db-chip-value\">{{ c.value }}</span>\r\n </button>\r\n <button type=\"button\" class=\"db-clearall\" *ngIf=\"filterCount\" (click)=\"clearAll()\">Clear all</button>\r\n </div>\r\n\r\n <!-- KPI tiles -->\r\n <div class=\"db-kpis\">\r\n <!-- Old Checklist summary card: figure + label in the gradient strip, note below. -->\r\n <div class=\"av2-ocard\" *ngFor=\"let kpi of kpis\">\r\n <div class=\"av2-ocard-head\">\r\n <div class=\"av2-ocard-count\">\r\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!loading\">{{ kpi.value }}</ng-container>\r\n </div>\r\n <div class=\"av2-ocard-text\">{{ kpi.label }}</div>\r\n </div>\r\n <div class=\"av2-ocard-body\">\r\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--note\"></span>\r\n <div *ngIf=\"!loading\" class=\"av2-ocard-note\" [style.color]=\"kpi.noteColor\">{{ kpi.note }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Trend + distribution -->\r\n <div class=\"db-duo\">\r\n <!-- Trend -->\r\n <section class=\"db-card\">\r\n <div class=\"db-card-head db-card-head--wrap\">\r\n <div class=\"db-card-title db-card-title--grow\">Audit score trend</div>\r\n <div class=\"db-seg\">\r\n <button type=\"button\" class=\"db-seg-tab\" [class.is-on]=\"grain === 'quarter'\" (click)=\"setGrain('quarter')\">Quarterly</button>\r\n <button type=\"button\" class=\"db-seg-tab\" [class.is-on]=\"grain === 'date'\" (click)=\"setGrain('date')\">By date</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-daterow\" *ngIf=\"grain === 'date'\">\r\n <div class=\"av2-datepick\">\r\n <svg class=\"av2-datepick-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\r\n <input type=\"text\" class=\"av2-datepick-input db-daterange\" ngxDaterangepickerMd readonly autocomplete=\"off\"\r\n placeholder=\"Select date range\" [(ngModel)]=\"range\" [locale]=\"pickerLocale\" [maxDate]=\"today\"\r\n [dateLimit]=\"maxRangeDays\" [ranges]=\"ranges\" [showCustomRangeLabel]=\"true\" [alwaysShowCalendars]=\"false\"\r\n [keepCalendarOpeningWithRange]=\"true\" [autoApply]=\"true\" [showCancel]=\"false\" [drops]=\"'down'\" [opens]=\"'right'\"\r\n (datesUpdated)=\"onRangePicked($event)\">\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"trendLoading\">\r\n <span class=\"av2-sk av2-sk--title\"></span>\r\n <span class=\"av2-sk av2-sk--block db-sk-chart\"></span>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!trendLoading\">\r\n <div class=\"db-focus\">\r\n <span class=\"db-focus-score\" [class.is-fail]=\"!focusPassed\">{{ focusScore }}</span>\r\n <span class=\"db-focus-pill\" [class.is-pass]=\"focusPassed\" [class.is-fail]=\"!focusPassed\">{{ focusStatus }}</span>\r\n <span class=\"db-focus-line\">{{ focusLine }}</span>\r\n </div>\r\n\r\n <div class=\"db-legend\">\r\n <span class=\"db-legend-dash\"></span>Pass mark {{ passMark }}%\r\n </div>\r\n\r\n <div class=\"db-chart\">\r\n <div class=\"db-chart-y\">\r\n <span style=\"top:0\">100%</span>\r\n <span style=\"top:50%\">50%</span>\r\n <span style=\"top:100%\">0%</span>\r\n </div>\r\n <div class=\"db-chart-area\">\r\n <span class=\"db-gridline\" style=\"top:0\"></span>\r\n <span class=\"db-gridline\" style=\"top:50%\"></span>\r\n <span class=\"db-gridline\" style=\"top:100%\"></span>\r\n <span class=\"db-passline\" [style.top.%]=\"100 - passMark\"></span>\r\n <div class=\"db-bars\">\r\n <div class=\"db-bar-col\" *ngFor=\"let bar of trendBars; let first = first; let last = last\"\r\n [class.is-pickable]=\"grain === 'quarter'\" (click)=\"selectQuarter(bar.key)\">\r\n <span class=\"db-bar-value\" *ngIf=\"!denseTrend\" [class.is-active]=\"bar.key === quarter\" [style.bottom]=\"barHeight(bar)\">\r\n {{ bar.value === null ? '\u2014' : bar.value + '%' }}\r\n </span>\r\n <span class=\"db-bar\" [style.height]=\"barHeight(bar)\" [style.background]=\"barFill(bar)\"></span>\r\n\r\n <div class=\"db-tip\" [class.is-start]=\"first && !last\" [class.is-end]=\"last && !first\" [style.bottom]=\"tipBottom(bar)\">\r\n <div class=\"db-tip-head\">\r\n {{ bar.label }}<span class=\"db-tip-sub\" *ngIf=\"grain === 'quarter'\"> \u00B7 {{ quarterMonths(bar.key) }}</span>\r\n </div>\r\n <div class=\"db-tip-score\" *ngIf=\"bar.value !== null\">\r\n <span class=\"db-tip-dot\" [class.is-fail]=\"bar.value < passMark\"></span>\r\n <span class=\"db-tip-value\">{{ bar.value }}%</span>\r\n <span class=\"db-tip-status\" [class.is-fail]=\"bar.value < passMark\">\r\n {{ bar.value >= passMark ? 'Pass' : 'Below pass mark' }}\r\n </span>\r\n </div>\r\n <div class=\"db-tip-empty\" *ngIf=\"bar.value === null\">No scored audits</div>\r\n <div class=\"db-tip-row\"><span>Audits completed</span><b>{{ bar.submitted }}</b></div>\r\n <div class=\"db-tip-row\" *ngIf=\"bar.count !== bar.submitted\"><span>Scored audits</span><b>{{ bar.count }}</b></div>\r\n <div class=\"db-tip-row\"><span>Pass mark</span><b>{{ passMark }}%</b></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- A month by date has ~30 bars: every few days get a label (first and last always), and the audit counts\r\n move to the bar tooltip, so the labels never run into each other. -->\r\n <div class=\"db-chart-x\" [class.is-dense]=\"denseTrend\">\r\n <span class=\"db-chart-xcol\" *ngFor=\"let bar of trendBars; let i = index; let last = last\" [class.is-pickable]=\"grain === 'quarter'\" (click)=\"selectQuarter(bar.key)\">\r\n <span class=\"db-chart-xlabel\" [class.is-active]=\"bar.key === quarter\" [style.visibility]=\"showXLabel(i, last) ? 'visible' : 'hidden'\">{{ bar.label }}</span>\r\n <span class=\"db-chart-xcount\" *ngIf=\"!denseTrend\">{{ bar.submitted ? bar.submitted + ' audits' : 'no audits' }}</span>\r\n </span>\r\n </div>\r\n </ng-container>\r\n </section>\r\n\r\n <!-- Score bands -->\r\n <section class=\"db-card db-card--tight\">\r\n <div class=\"db-card-head db-card-head--baseline\">\r\n <div class=\"db-card-title db-card-title--grow\">Score distribution</div>\r\n <div class=\"db-card-sub\">{{ storesInScope }} in scope</div>\r\n </div>\r\n <div class=\"db-card-sub\">Stores by score band, {{ periodLabel }}</div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"loading\" [rows]=\"2\"></lib-audit-v2-shimmer>\r\n\r\n <div class=\"db-bandbar\" *ngIf=\"!loading\">\r\n <!-- A band with stores keeps a visible sliver (2 of 3576 stores is under a pixel); the largest band gives way. -->\r\n <span class=\"db-bandseg\" *ngFor=\"let b of bandRows; trackBy: trackByBand\" [style.width]=\"b.width\" [style.background]=\"b.band.soft\"\r\n [class.has-stores]=\"b.count > 0\" [title]=\"b.band.label + ': ' + b.count\"></span>\r\n </div>\r\n\r\n <div class=\"db-bandrows\" *ngIf=\"!loading\">\r\n <div class=\"db-bandrow\" *ngFor=\"let b of bandRows; trackBy: trackByBand\">\r\n <span class=\"db-banddot\" [style.background]=\"b.band.soft\"></span>\r\n <span class=\"db-bandlabel\">{{ b.band.label }}</span>\r\n <span class=\"db-bandrange\">{{ b.band.range }}</span>\r\n <span class=\"db-bandcount\">{{ b.count }} {{ b.count === 1 ? 'store' : 'stores' }}</span>\r\n <span class=\"db-bandshare\">{{ b.share }}</span>\r\n <a class=\"db-bandlink\" [class.is-active]=\"storeListOpen && listBandKey === b.band.key\" (click)=\"applyBand(b.band)\">View stores</a>\r\n </div>\r\n </div>\r\n <div class=\"db-bandhint\" *ngIf=\"!loading && !showStoreList\">Click <b>View stores</b> on a band to list its stores.</div>\r\n </section>\r\n </div>\r\n\r\n <!-- Store ledger: opened from Score distribution -> View stores (or a Filters score range) -->\r\n <section class=\"db-card db-card--table\" id=\"ad-store-list\" *ngIf=\"showStoreList\">\r\n <div class=\"db-ledger-head\">\r\n <div class=\"db-ledger-text\">\r\n <div class=\"db-card-title\">Store list</div>\r\n <div class=\"db-card-sub\">\r\n {{ filteredRows.length }} {{ filteredRows.length === 1 ? 'store' : 'stores' }} \u00B7 {{ periodLabel }}\r\n </div>\r\n <div class=\"db-bandfilter\" *ngIf=\"listChipLabel\">\r\n <span class=\"db-bandchip\">\r\n {{ listChipLabel }}\r\n <span class=\"db-bandchip-x\" title=\"Close the store list\" (click)=\"closeStoreList()\">\r\n <svg width=\"9\" height=\"9\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </span>\r\n </span>\r\n <a class=\"db-bandlink\" (click)=\"showAllStores()\">Show all stores</a>\r\n </div>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <label class=\"av2-search db-search\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input [(ngModel)]=\"search\" (ngModelChange)=\"onSearch()\" type=\"text\" placeholder=\"Search store or owner\"\r\n autocomplete=\"off\" />\r\n </label>\r\n <div class=\"segmented\">\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'all'\" (click)=\"setStatus('all')\">All</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'fail'\" (click)=\"setStatus('fail')\">Fail</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'pass'\" (click)=\"setStatus('pass')\">Pass</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'na'\" (click)=\"setStatus('na')\">Not audited</button>\r\n </div>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"loading\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!loading\">\r\n <div class=\"av2-table-wrap\">\r\n <table class=\"db-table\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let h of headers\" class=\"is-sortable\" [class.is-sorted]=\"sortKey === h.key\" (click)=\"sortBy(h.key)\">\r\n {{ h.label }} <lib-audit-v2-sort-icon [active]=\"sortKey === h.key\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon>\r\n </th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of pageRows; trackBy: trackByStore\">\r\n <td class=\"db-nowrap\">{{ row.date }}</td>\r\n <td>\r\n <a class=\"db-storeid\" routerLink=\"/manage/trax/audit-v2/dashboard/store\"\r\n [queryParams]=\"detailParams({ store: row.raw?.storeId || row.storeId })\">{{ row.storeId }}</a>\r\n </td>\r\n <td class=\"av2-ellipsis\">{{ row.circle }}</td>\r\n <td class=\"av2-ellipsis\">{{ row.zone }}</td>\r\n <td class=\"av2-ellipsis\">{{ row.aom }}</td>\r\n <td>\r\n <span class=\"db-pill\" [style.background]=\"bandFor(row).bg\" [style.color]=\"bandFor(row).fg\">\r\n {{ row.score === null ? '\u2014' : row.score + '%' }}\r\n </span>\r\n </td>\r\n <td>\r\n <span class=\"db-pill\" [style.background]=\"bandFor(row).bg\" [style.color]=\"bandFor(row).fg\">\r\n {{ statusLabel(row) }}\r\n </span>\r\n </td>\r\n <td>\r\n <div class=\"db-actions\">\r\n <!-- View opens the Gallery on the store's latest submitted audit in the period (QA 11 Oct); a store\r\n with no submission there opens its audit detail instead (same as the store link). -->\r\n <a class=\"db-viewbtn\" *ngIf=\"galleryAuditId(row) as auditId\" routerLink=\"/manage/trax/audit-v2/gallery\"\r\n [queryParams]=\"detailParams({ audit: auditId, store: row.raw?.storeId || row.storeId })\" title=\"View this store's submissions in the Gallery\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n View\r\n </a>\r\n <a class=\"db-viewbtn\" *ngIf=\"!galleryAuditId(row)\" routerLink=\"/manage/trax/audit-v2/dashboard/store\"\r\n [queryParams]=\"detailParams({ store: row.raw?.storeId || row.storeId })\" title=\"View this store's audits\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n View\r\n </a>\r\n <!-- PDF of the store's latest submitted audit in the period (queued, then under Notifications > Downloads). -->\r\n <a class=\"db-pdfbtn\" role=\"button\" [class.is-disabled]=\"!pdfVisitId(row)\"\r\n [attr.aria-disabled]=\"!pdfVisitId(row)\" (click)=\"downloadPdf(row)\"\r\n [title]=\"pdfVisitId(row) ? 'Download the PDF report of the latest submitted audit for this store' : 'No submitted audit for this store in this period'\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 4v12\"></path>\r\n <polyline points=\"7 11 12 16 17 11\"></polyline>\r\n <path d=\"M4 20h16\"></path>\r\n </svg>\r\n </a>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"!pageRows.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">No stores match the current filters.</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Shared pager (10 / 20 / 30), as on the other audit lists. -->\r\n <div class=\"db-perf-pager\" *ngIf=\"filteredRows.length\">\r\n <lib-pagination [itemsPerPage]=\"pageSize\" [pageSize]=\"pageSize\" [paginationSizes]=\"pageSizes\"\r\n [currentPage]=\"page\" [totalItems]=\"filteredRows.length\" (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </ng-container>\r\n </section>\r\n </ng-container>\r\n\r\n <!-- ============ TASK SUMMARY ============ -->\r\n <!-- Tasks raised from this client's audits, in the header scope (shimmer values while loading). -->\r\n <div class=\"db-stats\" *ngIf=\"isTaskModule\">\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.activeTasks }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Active {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body\">\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.taskInstances }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">{{ moduleTab }} Instances</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.notSubmitted }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Not Submitted {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body db-stat-body--2\">\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.openTasks }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Open {{ moduleTab }}s</div>\r\n </div>\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.inProgress }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">In Progress {{ moduleTab }}s</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.submitted }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Submitted {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body db-stat-body--3\">\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.completionScore }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Completion Score</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.completionDelta\" [ngClass]=\"taskDeltaClass('completion')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.completionDelta }}\r\n </div>\r\n </div>\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.complianceScore }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Compliance Score</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.complianceDelta\" [ngClass]=\"taskDeltaClass('compliance')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.complianceDelta }}\r\n </div>\r\n </div>\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid is-underline\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.totalFlags }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Total Flags</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.flagsDelta\" [ngClass]=\"taskDeltaClass('flags')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.flagsDelta }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ============ PERFORMANCE ============ -->\r\n <section class=\"db-perf\">\r\n <div class=\"db-perftabs\">\r\n <button type=\"button\" class=\"db-perftab\" *ngFor=\"let t of perfTabs\" [class.is-on]=\"perfTab === t\"\r\n (click)=\"setPerfTab(t)\">{{ perfTabDisplay(t) }}</button>\r\n </div>\r\n\r\n <div class=\"db-perf-head\">\r\n <div class=\"db-perf-text\">\r\n <div class=\"db-perf-title\">\r\n {{ perfInfoTitle }}\r\n <span class=\"db-total\">\r\n {{ perfTab === 'Audit' ? (isTaskModule ? filteredTaskPerf.length : filteredAuditPerf.length) : (perfTab === 'Store' ? filteredStorePerf.length : filteredUserPerf.length) }} Total\r\n </span>\r\n </div>\r\n <div class=\"db-card-sub\">{{ perfPeriod }}</div>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <label class=\"av2-search db-perf-search\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input type=\"text\" [placeholder]=\"perfSearchPlaceholder\" [(ngModel)]=\"perfSearch\" (ngModelChange)=\"onPerfSearch()\">\r\n </label>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" [disabled]=\"perfLoading || !perfRowCount\"\r\n title=\"Download this table as an Excel file\" (click)=\"exportPerformance()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 16V4\"></path>\r\n <polyline points=\"7 9 12 4 17 9\"></polyline>\r\n <path d=\"M4 16v4h16v-4\"></path>\r\n </svg>\r\n Export\r\n </button>\r\n <button type=\"button\" class=\"av2-btn db-create\" *ngIf=\"perfTab === 'Audit' && access.canAdd\" routerLink=\"/manage/trax/audit-v2/manage\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\"><path d=\"M12 5v14M5 12h14\"></path></svg>\r\n {{ perfCreateLabel }}\r\n </button>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"perfLoading\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!perfLoading\">\r\n <!-- Audit Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Audit' && !isTaskModule\">\r\n <table class=\"db-perftable db-perftable--audit\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of auditPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredAuditPerf); trackBy: trackByPerfAudit\">\r\n <td>\r\n <div class=\"db-name\">\r\n <span class=\"db-avatar\">{{ row.initials }}</span>\r\n <a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id })\">{{ row.name }}</a>\r\n </div>\r\n </td>\r\n <td>{{ row.assigned }}</td>\r\n <td>\r\n <!-- Opens the audit's detail page (as the eye does) on its submitted visits, as the v1 Checklist dashboard did. -->\r\n <a *ngIf=\"row.submitted\" class=\"db-ulink\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id, status: 'submit' })\"\r\n title=\"View the submitted visits\">{{ row.submitted }}</a>\r\n <span *ngIf=\"!row.submitted\">0</span>\r\n </td>\r\n <!-- Store disputes (questions) in the period, as a plain count (QA 10 Oct: no link). -->\r\n <td>\r\n <span *ngIf=\"row.disputes === null\" class=\"av2-faint\">\u2014</span>\r\n <span *ngIf=\"row.disputes !== null\">{{ row.disputes }}</span>\r\n </td>\r\n <td>{{ row.passMark }}</td>\r\n <td>\r\n <div class=\"db-score\" [class.is-empty]=\"row.score === '\u2014'\"\r\n [title]=\"row.score === '\u2014' ? 'Compliance score is off for this audit' : ''\">\r\n <span class=\"db-track db-track--6\"><span [style.width]=\"barWidth(row.scorePct)\"\r\n [style.background]=\"row.result === 'Pass' ? '#12B76A' : '#F04438'\"></span></span>\r\n <span class=\"db-scoretext\">{{ row.score }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <span *ngIf=\"row.result !== '\u2014'\" class=\"db-pill db-pill--strong\" [style.background]=\"row.result === 'Pass' ? '#ECFDF3' : '#FEF3F2'\"\r\n [style.color]=\"row.result === 'Pass' ? '#027A48' : '#B42318'\">{{ row.result }}</span>\r\n <span *ngIf=\"row.result === '\u2014'\" class=\"av2-faint\" title=\"Compliance score is off for this audit\">\u2014</span>\r\n </td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View audit\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredAuditPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No audit matches this search.' : 'There is no result for Audit Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Task Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Audit' && isTaskModule\">\r\n <table class=\"db-perftable db-perftable--task\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of taskPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredTaskPerf); trackBy: trackByPerfTask\">\r\n <td>\r\n <div class=\"db-name\">\r\n <span class=\"db-avatar\">{{ row.initials }}</span>\r\n <a class=\"db-link\" [title]=\"row.raw?.auditName ? 'Raised from ' + row.raw.auditName : ''\">{{ row.name }}</a>\r\n </div>\r\n </td>\r\n <td>{{ row.scheduled }}</td>\r\n <td class=\"db-medium\">{{ row.coverage }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>\r\n <!-- Opens the Gallery (Type Task) on this task's submissions in the dashboard period. -->\r\n <a *ngIf=\"row.submitted && row.raw?.taskId\" class=\"db-ulink\" routerLink=\"/manage/trax/audit-v2/gallery\"\r\n [queryParams]=\"taskSubmittedParams(row)\" title=\"View the submitted tasks in the Gallery\">{{ row.submitted }}</a>\r\n <span *ngIf=\"!row.submitted || !row.raw?.taskId\">{{ row.submitted }}</span>\r\n </td>\r\n <td><a class=\"db-ulink\">{{ row.flags }}</a></td>\r\n <td class=\"av2-faint\">{{ row.tasks }}</td>\r\n <td><a class=\"db-ulink\">{{ row.redo }}</a></td>\r\n <td>\r\n <div class=\"db-score\" [class.is-empty]=\"row.compliance === '\u2014'\">\r\n <span class=\"db-track db-track--6\"><span [style.width]=\"barWidth(row.compliancePct)\"></span></span>\r\n <span class=\"db-scoretext\">{{ row.compliance }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <!-- Opens the audit the task was raised from. -->\r\n <a class=\"db-eye\" title=\"View the audit this task was raised from\"\r\n [routerLink]=\"row.raw?.auditId ? '/manage/trax/audit-v2/dashboard/audit' : null\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.auditId })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredTaskPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">No tasks raised from audits in this period.</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Store Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Store'\">\r\n <table class=\"db-perftable db-perftable--store\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of storePerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredStorePerf); trackBy: trackByPerfStore\">\r\n <td>\r\n <a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/store\" [queryParams]=\"detailParams({ store: row.storeId || row.store })\">{{ row.store }}</a>\r\n </td>\r\n <td class=\"av2-ellipsis av2-dim\" [av2Tip]=\"row.storeId\">{{ row.storeId || '\u2014' }}</td>\r\n <td class=\"av2-ellipsis av2-dim\">{{ row.spoc }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>{{ row.flags ?? '\u2014' }}</td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.completion === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.completion)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.completion }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.compliance === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.compliance)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.compliance }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.perf === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.perf)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.perf }}</span></div></td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View store\" routerLink=\"/manage/trax/audit-v2/dashboard/store\" [queryParams]=\"detailParams({ store: row.storeId || row.store })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredStorePerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No store matches this search.' : 'There is no result for Store Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- User Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'User'\">\r\n <table class=\"db-perftable db-perftable--user\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of userPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredUserPerf); trackBy: trackByPerfUser\">\r\n <td class=\"av2-ellipsis\"><a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/user\" [queryParams]=\"detailParams({ email: row.email })\">{{ row.name }}</a></td>\r\n <td class=\"av2-ellipsis av2-dim\">{{ row.email }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>{{ row.flags }}</td>\r\n <td>{{ row.redo }}</td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.completion === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.completion)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.completion }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.compliance === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.compliance)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.compliance }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.perf === '\u2014'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.perf)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.perf }}</span></div></td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View user\" routerLink=\"/manage/trax/audit-v2/dashboard/user\" [queryParams]=\"detailParams({ email: row.email })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredUserPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No user matches this search.' : 'There is no result for User Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Shared pager (10 / 20 / 30), as on the other audit lists. -->\r\n <div class=\"db-perf-pager\" *ngIf=\"perfTotal\">\r\n <lib-pagination [itemsPerPage]=\"perfPageSize\" [pageSize]=\"perfPageSize\" [paginationSizes]=\"perfPageSizes\"\r\n [currentPage]=\"perfPage\" [totalItems]=\"perfTotal\" (pageChange)=\"onPerfPage($event)\"\r\n (pageSizeChange)=\"onPerfPageSize($event)\"></lib-pagination>\r\n </div>\r\n </ng-container>\r\n </section>\r\n\r\n <!-- ============ FILTER DRAWER ============ -->\r\n <div class=\"filter-backdrop\" *ngIf=\"filtersOpen\" (click)=\"cancelFilters()\"></div>\r\n\r\n <div class=\"filter-drawer\" *ngIf=\"filtersOpen && draft as dr\">\r\n <div class=\"drawer-head\">\r\n <span class=\"drawer-title\">Filters</span>\r\n <span class=\"db-countpill\" *ngIf=\"dr.filterCount\">{{ dr.filterCount }}</span>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"closebtn\" (click)=\"cancelFilters()\" title=\"Close\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-body\">\r\n <div class=\"drawer-nav\">\r\n <button type=\"button\" class=\"drawer-navitem\" *ngFor=\"let c of dr.filterCats; trackBy: trackByCat\" [class.navitem-active]=\"activeCat === c.key\"\r\n (click)=\"selectCat(c.key)\">\r\n <span class=\"navtext\">\r\n <span class=\"navtitle\">{{ c.label }}</span>\r\n <span class=\"navvalue\" [class.is-dirty]=\"c.dirty\">{{ c.value }}</span>\r\n </span>\r\n <span class=\"dirtydot\" *ngIf=\"c.dirty\"></span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-pane\">\r\n <div class=\"panetitle\">{{ dr.activeCatObj.title }}</div>\r\n <div class=\"panehint\">{{ dr.activeCatObj.sub }}</div>\r\n\r\n <!-- Period -->\r\n <ng-container *ngIf=\"activeCat === 'period'\">\r\n <div class=\"pane-options\">\r\n <div class=\"pane-option\" [class.is-on]=\"dr.grain === 'quarter'\" (click)=\"dr.setGrain('quarter')\">\r\n <span class=\"pane-radio\" [class.is-on]=\"dr.grain === 'quarter'\"><span></span></span>\r\n <span class=\"pane-option-text\">\r\n <span class=\"pane-option-label\">Quarterly</span>\r\n <span class=\"pane-option-help\">Read one financial quarter (April\u2013March year) at a time.</span>\r\n </span>\r\n </div>\r\n <div class=\"pane-option\" [class.is-on]=\"dr.grain === 'date'\" (click)=\"dr.setGrain('date')\">\r\n <span class=\"pane-radio\" [class.is-on]=\"dr.grain === 'date'\"><span></span></span>\r\n <span class=\"pane-option-text\">\r\n <span class=\"pane-option-label\">By date</span>\r\n <span class=\"pane-option-help\">Pick a custom start and end date.</span>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"pane-list\" *ngIf=\"dr.grain === 'quarter'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let q of dr.quarters\" [class.option-selected]=\"dr.quarter === q\"\r\n (click)=\"dr.selectQuarter(q)\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.quarter === q\">\r\n <svg *ngIf=\"dr.quarter === q\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">{{ q }} \u00B7 {{ quarterMonths(q) }}</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"pane-fields\" *ngIf=\"dr.grain === 'date'\">\r\n <div class=\"field\">\r\n <span class=\"field-label\">Date range</span>\r\n <div class=\"av2-datepick av2-datepick--compact\">\r\n <svg class=\"av2-datepick-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\r\n <input type=\"text\" class=\"av2-datepick-input db-daterange db-daterange--field\" ngxDaterangepickerMd readonly\r\n autocomplete=\"off\" placeholder=\"Select date range\" [(ngModel)]=\"dr.range\" [locale]=\"pickerLocale\"\r\n [maxDate]=\"today\" [dateLimit]=\"maxRangeDays\" [autoApply]=\"true\" [alwaysShowCalendars]=\"true\" [showCancel]=\"false\"\r\n [drops]=\"'down'\" [opens]=\"'right'\" (datesUpdated)=\"dr.onRangePicked($event)\">\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Scope -->\r\n <ng-container *ngIf=\"activeCat === 'scope'\">\r\n <div class=\"pane-stack\">\r\n <div class=\"field field--full\">\r\n <span class=\"field-label\">Circle Head <span class=\"field-meta\">{{ dr.circles.length }} users</span></span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.circle\" (ngModelChange)=\"dr.onCircleChange()\" [options]=\"dr.pickOptions(dr.circles, 'All Circles')\" ariaLabel=\"Circle\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.circle\">\r\n <span class=\"field-label\">Zone Manager</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.zone\" (ngModelChange)=\"dr.onZoneChange()\" [options]=\"dr.pickOptions(dr.zones, 'All zones')\" ariaLabel=\"Zone\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.zone\">\r\n <span class=\"field-label\">AOM</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.aom\" (ngModelChange)=\"dr.onAomChange()\" [options]=\"dr.pickOptions(dr.aoms, 'All AOMs')\" ariaLabel=\"AOM\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.aom\">\r\n <span class=\"field-label\">Store</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.store\" [options]=\"dr.storePickOptions\" ariaLabel=\"Store\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"readingrow\">\r\n <span class=\"readinglabel\">Reading</span>\r\n <span class=\"readingvalue\">{{ dr.scopeReading }}</span>\r\n <span class=\"av2-grow\"></span>\r\n <a class=\"db-bandlink\" (click)=\"dr.resetScope()\">Reset to all circles</a>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Audit type -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'type'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let t of auditTypes\" [class.option-selected]=\"dr.auditType === t.key\"\r\n (click)=\"dr.auditType = t.key\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.auditType === t.key\">\r\n <svg *ngIf=\"dr.auditType === t.key\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"opttext\">\r\n <span class=\"optlabel\">{{ t.label }}</span>\r\n <span class=\"optmeta\">{{ t.help }}</span>\r\n </span>\r\n </button>\r\n </div>\r\n\r\n <!-- Score band -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'band'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let b of dr.bandRows; trackBy: trackByBand\" [class.option-selected]=\"dr.isBandOn(b.band)\"\r\n (click)=\"dr.applyBand(b.band)\">\r\n <span class=\"db-banddot\" [style.background]=\"b.band.soft\"></span>\r\n <span class=\"opttext\">\r\n <span class=\"optlabel\">{{ b.band.label }}</span>\r\n <span class=\"optmeta\">{{ b.band.range }} \u00B7 {{ b.count }} stores</span>\r\n </span>\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm pane-resetbtn\" (click)=\"dr.clearBand()\">All scores</button>\r\n </div>\r\n\r\n <!-- Status -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'status'\">\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'all'\" (click)=\"dr.setStatus('all')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'all'\">\r\n <svg *ngIf=\"dr.status === 'all'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">All stores</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'fail'\" (click)=\"dr.setStatus('fail')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'fail'\">\r\n <svg *ngIf=\"dr.status === 'fail'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Fail</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'pass'\" (click)=\"dr.setStatus('pass')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'pass'\">\r\n <svg *ngIf=\"dr.status === 'pass'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Pass</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'na'\" (click)=\"dr.setStatus('na')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'na'\">\r\n <svg *ngIf=\"dr.status === 'na'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Not audited</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"drawer-foot\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" (click)=\"dr.clearAll()\">Clear all</button>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" (click)=\"cancelFilters()\">Cancel</button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--wide\" (click)=\"applyFilters()\">Apply filters</button>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n", styles: ["@charset \"UTF-8\";.av2-page{display:flex;flex-direction:column;gap:16px;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;color:#101828;-webkit-font-smoothing:antialiased}.av2-page *,.av2-page *:before,.av2-page *:after{box-sizing:border-box}.av2-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:20px 24px;display:flex;flex-direction:column;gap:20px}.av2-card--log{padding:20px 24px 24px;gap:18px}.av2-card--table{padding:20px 24px 24px;gap:16px}.av2-card-head{display:flex;align-items:flex-start;gap:16px;flex-wrap:wrap}.av2-card-head--center{align-items:center;gap:12px}.av2-title-block{display:flex;flex-direction:column;gap:4px;flex:1;min-width:220px}.av2-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828;display:flex;align-items:center;gap:10px}.av2-card-title--grow{flex:1;min-width:180px}.av2-card-sub{font-size:14px;line-height:20px;color:#667085}.av2-grow{flex:1}.av2-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.av2-grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:20px}.av2-grid-4{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.av2-stat-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:10px}.av2-stat{padding:8px 16px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;align-items:center;gap:20px}.av2-stat-value{font-size:30px;line-height:38px;font-weight:600;color:#101828}.av2-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-kpi{background:#fff;border-radius:10px;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d;display:flex;flex-direction:column;overflow:hidden}.av2-kpi.is-primary{box-shadow:inset 0 0 0 1px #99dbff,0 1px 2px #1018280d}.av2-kpi.is-primary .av2-kpi-head{background:#eaf8ff}.av2-kpi-head{padding:14px 18px;background:#f9fafb;font-size:16px;line-height:24px;font-weight:500;color:#101828}.av2-kpi-body{padding:16px 18px 18px;display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.av2-kpi-value{font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-kpi-delta{display:flex;align-items:center;gap:4px;font-size:12px;color:#039855}.av2-kpi-delta.is-down{color:#d92d20}.av2-kpi-note{font-size:12px;color:#667085}.av2-ocard{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;display:flex;flex-direction:column;min-width:0;height:100%}.av2-ocard-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:2px;min-width:0}.av2-ocard-head--row{flex-direction:row;align-items:center;justify-content:flex-start;gap:12px}.av2-ocard-count{font-size:30px;line-height:38px;font-weight:600;color:#101828;white-space:nowrap}.av2-ocard-text{font-size:14px;line-height:20px;font-weight:500;color:#344054}.av2-ocard-body{flex:1;padding:12px 14px;display:flex;gap:16px;min-width:0}.av2-ocard-cell{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.av2-ocard-cell--center{align-items:center;text-align:center}.av2-ocard-sub{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.av2-ocard-note{font-size:14px;line-height:20px;font-weight:400;color:#667085}.av2-ocard-delta{margin-top:6px;display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;font-weight:400;color:#1d2939}.av2-ocard-delta b{font-weight:600;color:#667085}.av2-ocard-delta svg{flex-shrink:0;color:#039855}.av2-ocard-delta.is-down svg{color:#d92d20}.av2-search{position:relative;display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#98a2b3;font-size:14px;flex-shrink:0}.av2-search svg{flex-shrink:0}.av2-search input{flex:1;min-width:0;height:100%;border:0;outline:0;padding:0;background:transparent;font:inherit;font-size:14px;font-weight:500;color:#101828}.av2-search input::placeholder{color:#98a2b3}.av2-search:focus-within{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-search--sm{width:300px}.av2-search--md{width:320px}.av2-search--lg{width:340px}.av2-select{height:44px;padding:0 36px 0 12px;border:0;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font:inherit;font-size:14px;font-weight:500;color:#344054;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\");background-repeat:no-repeat;background-position:right 12px center;flex-shrink:0}.av2-select:focus{outline:0;box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}.av2-select--sm{width:180px}.av2-chip{display:flex;align-items:center;gap:8px;height:44px;padding:0 12px;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;font-size:14px;color:#344054;white-space:nowrap;flex-shrink:0}.av2-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;height:44px;padding:0 16px;border:0;border-radius:8px;font-family:inherit;font-size:14px;line-height:20px;font-weight:600;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background-color .15s cubic-bezier(.4,0,.2,1)}.av2-btn svg{flex-shrink:0}.av2-btn:disabled{opacity:.55;cursor:not-allowed}.av2-btn--ghost{background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#344054;font-weight:500}.av2-btn--ghost:hover:not(:disabled){background:#f9fafb}.av2-btn--primary{background:#00a3ff;color:#fff;font-size:16px;line-height:24px}.av2-btn--primary:hover:not(:disabled){background:#009bf3}.av2-btn--sm{height:36px;padding:0 14px;font-size:13px}.av2-btn--wide{padding:0 18px}.av2-tabs{display:flex;align-items:center;gap:6px}.av2-tab{height:44px;padding:0 26px;border:0;border-radius:6px;background:transparent;display:inline-flex;align-items:center;justify-content:center;font-family:inherit;font-size:16px;font-weight:500;color:#475467;cursor:pointer}.av2-tab.is-active{background:#eaf8ff;color:#009bf3;font-weight:500}.av2-badge{display:inline-flex;align-items:center;height:22px;padding:2px 8px;border-radius:16px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:500;line-height:18px;white-space:nowrap}.av2-badge--count{height:22px;padding:0 8px}.av2-badge--success{background:#ecfdf3;color:#027a48}.av2-badge--error{background:#fef3f2;color:#b42318}.av2-badge--warning{background:#fffaeb;color:#b54708}.av2-badge--gray{background:#f2f4f7;color:#344054}.av2-badge--purple{background:#f9f5ff;color:#5925dc}.av2-link{color:#00a3ff;font-size:14px;font-weight:500;text-decoration:underline;cursor:pointer}.av2-link:hover{color:#009bf3;text-decoration:underline}.av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.av2-muted{color:#667085}.av2-dim{color:#475467}.av2-faint{color:#98a2b3}table tbody td.av2-dim{color:#475467}table tbody td.av2-faint{color:#98a2b3}.av2-table-wrap{overflow-x:auto}.av2-table{width:100%;border-collapse:separate;border-spacing:0;margin:0}.av2-table thead th{background:#f9fafb;padding:12px;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;text-transform:none;letter-spacing:0;border:0;white-space:nowrap}.av2-table thead th:first-child{border-radius:8px 0 0}.av2-table thead th:last-child{border-radius:0 8px 0 0}.av2-table tbody td{padding:16px 12px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;font-weight:500;color:#101828;vertical-align:middle}.av2-table .av2-th-sort{display:inline-flex;align-items:center;gap:4px}.av2-table .av2-cell-icon{display:flex;align-items:center;gap:8px;min-width:0}.av2-table .av2-cell-icon svg{flex-shrink:0}.av2-table .av2-cell-icon span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-table .av2-cell-stack{display:flex;flex-direction:column;gap:2px}.av2-table .av2-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.av2-sortable{cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap}.av2-table--lined thead th{background:transparent;border-bottom:1px solid #EAECF0;border-radius:0!important}.av2-empty{display:flex;flex-direction:column;align-items:center;gap:12px;padding:24px 16px 32px;text-align:center}.av2-empty-img{display:block;width:160px;height:120px}.av2-empty-text{display:flex;flex-direction:column;gap:4px;align-items:center}.av2-empty-title{font-size:16px;line-height:24px;font-weight:600;color:#101828}.av2-empty-sub{max-width:480px;font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.av2-col-head{border-radius:8px;background:#f9fafb;padding:14px 16px;font-size:12px;line-height:20px;font-weight:500;color:#344054;display:flex;align-items:center;gap:8px}.av2-avatar{width:32px;height:32px;flex-shrink:0;border-radius:9999px;background:#eaf8ff;color:#009bf3;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:700}.av2-bar{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:60px}.av2-bar span{display:block;height:5px;border-radius:9999px;background:#00a3ff}@keyframes av2-shimmer{0%{background-position:-1000px 0}to{background-position:1000px 0}}.av2-sk{display:block;width:100%;max-width:100%;height:12px;border-radius:4px;flex-shrink:0;background:linear-gradient(to right,#e6e6e6 5%,#ccc 25%,#e6e6e6 35%);background-size:1000px 100%;animation:av2-shimmer 3s linear infinite}.av2-sk--value{width:72px;height:28px;border-radius:6px}.av2-sk--title{width:220px;height:18px}.av2-sk--note{width:60%}.av2-sk--block{border-radius:8px}@media (prefers-reduced-motion: reduce){.av2-sk{animation:none}}:host ::ng-deep lib-pagination{display:block}:host ::ng-deep lib-pagination .container{max-width:none;padding:0;display:flex;align-items:center;justify-content:center;gap:16px;flex-wrap:wrap;font-size:14px;color:#475467}:host ::ng-deep lib-pagination .mt-4{margin-top:0!important}:host ::ng-deep lib-pagination .container>.text-center{display:flex;align-items:center}:host ::ng-deep lib-pagination .container>.text-center>ul:not(.ngx-pagination){display:none}:host ::ng-deep lib-pagination pagination-controls{display:flex;align-items:center}:host ::ng-deep lib-pagination .sub-title{color:#475467!important;font-size:14px!important;font-weight:400!important;line-height:20px}:host ::ng-deep lib-pagination .border-val{height:40px;min-width:64px;padding:0 30px 0 12px!important;border:1px solid #D0D5DD!important;border-radius:8px!important;box-shadow:0 1px 2px #1018280d;background-color:#fff;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23667085' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E\")!important;background-repeat:no-repeat!important;background-position:right 10px center!important;background-size:14px 14px!important;appearance:none;-webkit-appearance:none;font-size:14px;font-weight:500;color:#1d2939;cursor:pointer;transition:border-color .15s ease,box-shadow .15s ease}:host ::ng-deep lib-pagination .border-val:hover{border-color:#98a2b3!important}:host ::ng-deep lib-pagination .border-val:focus{outline:none;border-color:#66c8ff!important;box-shadow:0 0 0 3px #eaf8ff}:host ::ng-deep lib-pagination .ngx-pagination{margin:0;padding:0;display:flex;align-items:center;gap:6px;color:#475467!important;font-size:14px!important;font-weight:500}:host ::ng-deep lib-pagination .ngx-pagination li{display:inline-flex;margin:0}:host ::ng-deep lib-pagination .ngx-pagination li.small-screen{display:none!important}:host ::ng-deep lib-pagination .ngx-pagination a,:host ::ng-deep lib-pagination .ngx-pagination button,:host ::ng-deep lib-pagination .ngx-pagination .current,:host ::ng-deep lib-pagination .ngx-pagination .disabled{min-width:40px!important;height:40px;padding:0 8px!important;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;line-height:20px;color:#475467}:host ::ng-deep lib-pagination .ngx-pagination a:hover,:host ::ng-deep lib-pagination .ngx-pagination button:hover{background:#f2f4f7;padding:0 8px!important}:host ::ng-deep lib-pagination .ngx-pagination .current{background:#eaf8ff!important;color:#00a3ff!important;font-weight:600;font-size:14px!important}:host ::ng-deep lib-pagination .ngx-pagination .disabled{color:#98a2b3}:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous a:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-previous.disabled:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next a:after,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:before,:host ::ng-deep lib-pagination .ngx-pagination .pagination-next.disabled:after{margin:0}:host ::ng-deep lib-pagination .ngx-pagination .ellipsis:after{color:#98a2b3;padding:0}.db-topline{display:flex;align-items:center;gap:12px}.db-refresh{font-size:15px;font-weight:600;color:#344054}.moduleswitch{display:flex;border-radius:8px;overflow:hidden;box-shadow:inset 0 0 0 1px #d0d5dd}.moduletab{padding:8px 24px;border:none;background:#fff;font-family:inherit;font-size:16px;line-height:24px;font-weight:500;color:#344054;white-space:nowrap;cursor:pointer}.moduletab:first-child{box-shadow:inset -1px 0 #d0d5dd}.moduletab.moduletab-on{background:#00a3ff;color:#fff}.db-scopebar{display:flex;flex-wrap:wrap;align-items:center;gap:12px}.db-scopetext{flex:1 1 300px;min-width:0;display:flex;flex-direction:column;gap:1px}.db-crumb{font-size:13px;line-height:20px;color:#667085}.db-scope{font-size:16px;line-height:24px;font-weight:600;color:#101828;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.db-countpill{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;border-radius:9999px;background:#eaf8ff;color:#009bf3;font-size:12px;font-weight:700}.db-chips{display:flex;flex-wrap:wrap;align-items:center;gap:10px}.db-chip{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 12px;border:none;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0;font-family:inherit;font-size:13px;line-height:20px;white-space:nowrap;cursor:pointer}.db-chip:hover{background:#f9fafb}.db-chip.is-dirty{box-shadow:inset 0 0 0 1px #99dbff}.db-chip.is-dirty .db-chip-value{color:#009bf3}.db-chip-label{color:#667085;font-weight:500}.db-chip-value{font-weight:600;color:#101828}.db-clearall{border:none;background:transparent;padding:0 4px;font-family:inherit;font-size:13px;font-weight:600;color:#00a3ff;cursor:pointer}.db-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.db-sk-value{margin:2px 0}.db-sk-chart{height:250px}.db-sk-mid{width:48px;height:22px;margin:4px 0;border-radius:6px}.db-duo{display:grid;grid-template-columns:repeat(auto-fit,minmax(340px,1fr));gap:16px;align-items:stretch}.db-card{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:18px 20px;display:flex;flex-direction:column;gap:12px;min-width:0}.db-card--tight{gap:4px}.db-card--table{padding:0;gap:0;overflow:hidden;scroll-margin-top:16px}.db-card-head{display:flex;align-items:center;gap:10px}.db-card-head--wrap{flex-wrap:wrap}.db-card-head--baseline{align-items:baseline}.db-card-title{font-size:20px;line-height:30px;font-weight:600;color:#101828}.db-card-title--grow{flex:1 1 160px;min-width:0}.db-card-sub{font-size:13px;line-height:20px;color:#667085}.db-seg{display:flex;border-radius:8px;overflow:hidden;box-shadow:inset 0 0 0 1px #d0d5dd}.db-seg-tab{padding:8px 14px;border:none;background:#fff;font-family:inherit;font-size:14px;font-weight:500;color:#475467;white-space:nowrap;cursor:pointer}.db-seg-tab.is-on{background:#00a3ff;color:#fff}.db-daterow{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.av2-datepick{position:relative;display:inline-flex;align-items:center}.av2-datepick-icon{position:absolute;left:10px;color:#667085;pointer-events:none}.av2-datepick-input{height:36px;padding:0 10px 0 32px;border:none;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd;background:#fff;font-family:inherit;font-size:13px;font-weight:500;color:#101828;cursor:pointer;outline:none}.av2-datepick-input:focus{box-shadow:inset 0 0 0 1px #66c8ff,0 0 0 4px #eaf8ff}:host ::ng-deep .av2-datepick .md-drppicker{margin-top:4px;z-index:1060;font-family:inherit;border-radius:8px;box-shadow:0 12px 16px -4px #10182814,0 4px 6px -2px #10182808,inset 0 0 0 1px #eaecf0}:host ::ng-deep .av2-datepick .md-drppicker.double,:host ::ng-deep .av2-datepick .md-drppicker.show-ranges{width:max-content}:host ::ng-deep .av2-datepick .md-drppicker.ltr .ranges{float:left;margin-top:10px}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button{width:160px;padding:12px 16px;border:none;border-radius:8px;background:none;color:#344054;font-size:14px;font-weight:400;line-height:20px;text-align:left;cursor:pointer}:host ::ng-deep .av2-datepick .md-drppicker .ranges ul li button.active{background:#eaf8ff;color:#00a3ff;font-weight:500}:host ::ng-deep .av2-datepick .md-drppicker th,:host ::ng-deep .av2-datepick .md-drppicker td{width:40px!important;height:40px!important;min-width:32px;padding:0!important;border:1px solid transparent!important;background:transparent!important;font-size:14px!important;font-weight:400!important;line-height:38px}:host ::ng-deep .av2-datepick .md-drppicker th{color:#344054!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker th.month{width:auto!important;font-size:16px!important}:host ::ng-deep .av2-datepick .md-drppicker td{color:#344054!important}:host ::ng-deep .av2-datepick .md-drppicker th.available.prev,:host ::ng-deep .av2-datepick .md-drppicker th.available.next{background:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23344054' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='15 6 9 12 15 18'/%3E%3C/svg%3E\") center/18px no-repeat!important}:host ::ng-deep .av2-datepick .md-drppicker th.available:hover,:host ::ng-deep .av2-datepick .md-drppicker td.available:hover{background-color:#f2f4f7!important}:host ::ng-deep .av2-datepick .md-drppicker td.in-range{background-color:#eaf8ff!important;color:#101828!important}:host ::ng-deep .av2-datepick .md-drppicker td.active,:host ::ng-deep .av2-datepick .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px;color:#fff!important;font-weight:500!important}:host ::ng-deep .av2-datepick .md-drppicker td.off,:host ::ng-deep .av2-datepick .md-drppicker td.off.in-range{color:#98a2b3!important;background-color:transparent!important}:host ::ng-deep .av2-datepick .md-drppicker td.disabled{color:#98a2b3!important;background-color:transparent!important;text-decoration:line-through;pointer-events:none}:host ::ng-deep .av2-datepick--compact .md-drppicker th,:host ::ng-deep .av2-datepick--compact .md-drppicker td{width:32px!important;height:32px!important;font-size:12px!important;line-height:30px}:host ::ng-deep .av2-datepick--compact .md-drppicker th.month{font-size:14px!important}.db-daterange{width:220px}.db-daterange--field{height:40px;font-size:14px;font-weight:600}.db-focus{display:flex;flex-wrap:wrap;align-items:baseline;gap:8px 14px}.db-focus-score{font-size:32px;line-height:38px;font-weight:700;color:#039855}.db-focus-score.is-fail{color:#d92d20}.db-focus-pill{display:inline-flex;align-items:center;padding:3px 10px;border-radius:9999px;font-size:12px;line-height:18px;font-weight:700}.db-focus-pill.is-pass{background:#ecfdf3;color:#027a48}.db-focus-pill.is-fail{background:#fef3f2;color:#b42318}.db-focus-line{flex:1 1 200px;min-width:0;font-size:13px;line-height:20px;color:#667085;text-wrap:pretty}.db-legend{display:inline-flex;align-items:center;gap:6px;font-size:12px;line-height:18px;color:#475467}.db-legend-dash{width:18px;height:0;border-top:2px dashed #00A3FF;display:block}.db-chart{display:flex;gap:10px;min-width:0}.db-chart-y{flex:0 0 34px;position:relative;height:186px}.db-chart-y span{position:absolute;right:0;transform:translateY(-50%);font-size:11px;line-height:16px;color:#98a2b3}.db-chart-area{flex:1;min-width:0;position:relative;height:186px}.db-gridline{position:absolute;left:0;right:0;height:0;border-top:1px solid #F2F4F7;display:block}.db-passline{position:absolute;left:0;right:0;height:0;border-top:2px dashed #00A3FF;display:block}.db-bars{position:absolute;inset:0;display:flex;align-items:flex-end;gap:8px}.db-bar-col{position:relative;flex:1;min-width:0;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:flex-end}.db-bar-value{position:absolute;left:0;right:0;text-align:center;margin-bottom:2px;font-size:13px;line-height:20px;font-weight:700;white-space:nowrap;color:#344054}.db-bar-value.is-active{color:#101828}.db-bar{display:block;width:100%;max-width:72px;border-radius:6px 6px 0 0}.db-tip{position:absolute;left:50%;z-index:5;min-width:168px;padding:10px 12px;border-radius:8px;background:#101828;color:#fff;box-shadow:0 12px 16px -4px #1018282e,0 4px 6px -2px #10182814;font-size:12px;line-height:18px;white-space:nowrap;text-align:left;pointer-events:none;opacity:0;visibility:hidden;transform:translate(-50%,4px);transition:opacity .12s ease,transform .12s ease,visibility .12s}.db-tip.is-start{left:0;transform:translateY(4px)}.db-tip.is-end{left:auto;right:0;transform:translateY(4px)}.db-bar-col:hover .db-tip{opacity:1;visibility:visible;transform:translate(-50%)}.db-bar-col:hover .db-tip.is-start,.db-bar-col:hover .db-tip.is-end{transform:translate(0)}.db-tip-head{font-weight:600;color:#fff}.db-tip-sub{font-weight:400;color:#d0d5dd}.db-tip-score{display:flex;align-items:center;gap:6px;margin:6px 0 8px}.db-tip-dot{width:8px;height:8px;border-radius:9999px;background:#00a3ff;flex:0 0 auto}.db-tip-dot.is-fail{background:#f04438}.db-tip-value{font-size:16px;line-height:24px;font-weight:700}.db-tip-status{margin-left:auto;padding:0 6px;border-radius:9999px;font-size:11px;line-height:18px;font-weight:600;background:#2e91fa33;color:#84caff}.db-tip-status.is-fail{background:#f0443833;color:#fda29b}.db-tip-empty{margin:6px 0 8px;color:#d0d5dd}.db-tip-row{display:flex;justify-content:space-between;gap:16px;padding-top:4px;border-top:1px solid rgba(255,255,255,.08);color:#d0d5dd}.db-tip-row+.db-tip-row{border-top:0;padding-top:2px}.db-tip-row b{font-weight:600;color:#fff}.db-chart-x{display:flex;gap:8px;padding-left:44px}.db-chart-xcol{flex:1;min-width:0;display:flex;flex-direction:column;align-items:center;gap:1px}.db-bar-col.is-pickable,.db-chart-xcol.is-pickable{cursor:pointer}.db-chart-xlabel{font-size:11px;line-height:16px;white-space:nowrap;color:#475467}.db-chart-xlabel.is-active{font-weight:700;color:#101828}.db-chart-x.is-dense .db-chart-xcol{overflow:visible}.db-chart-xcount{font-size:11px;line-height:16px;color:#98a2b3;white-space:nowrap}.db-bandbar{display:flex;height:14px;border-radius:9999px;overflow:hidden;background:#f2f4f7;margin-top:14px}.db-bandseg{display:block;height:14px}.db-bandseg.has-stores{min-width:8px}.db-bandrows{flex:1;display:grid;grid-template-columns:10px minmax(0,1fr) auto auto auto auto;grid-auto-rows:1fr;column-gap:12px;margin-top:12px}.db-bandrow{grid-column:1/-1;display:grid;grid-template-columns:subgrid;align-items:center;min-height:40px;padding:9px 0;border-bottom:1px solid #F2F4F7}.db-bandrow:last-child{border-bottom:0}.db-banddot{grid-column:1}.db-bandlabel{grid-column:2}.db-bandrange{grid-column:3}.db-bandcount{grid-column:4}.db-bandshare{grid-column:5}.db-bandlink{grid-column:6}@media (max-width: 575px){.db-bandrows{grid-template-columns:10px minmax(0,1fr) 0 auto auto auto;column-gap:8px}.db-bandrange{display:none}}.db-banddot{width:10px;height:10px;border-radius:3px;flex-shrink:0;display:block}.db-bandlabel{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px;line-height:20px;font-weight:500;color:#1d2939}.db-bandrange{font-size:12px;line-height:18px;color:#667085;white-space:nowrap;text-align:right}.db-bandcount{font-size:13px;line-height:20px;font-weight:600;color:#101828;text-align:right;white-space:nowrap}.db-bandshare{font-size:12px;line-height:18px;color:#667085;min-width:36px;text-align:right;font-variant-numeric:tabular-nums}.db-bandlink{font-size:12px;line-height:18px;font-weight:600;color:#00a3ff;white-space:nowrap;cursor:pointer}.db-bandlink:hover,.db-bandlink.is-active{color:#009bf3;text-decoration:underline}.db-ledger-head{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:18px 20px}.db-ledger-text{flex:1 1 220px;min-width:0;display:flex;flex-direction:column;gap:2px}.db-bandfilter{display:flex;align-items:center;gap:8px;margin-top:4px;flex-wrap:wrap}.db-bandchip{display:inline-flex;align-items:center;gap:6px;padding:3px 6px 3px 10px;border-radius:9999px;background:#eaf8ff;box-shadow:inset 0 0 0 1px #99dbff;font-size:12px;font-weight:600;white-space:nowrap;color:#009bf3}.db-bandchip-x{width:16px;height:16px;border-radius:9999px;display:flex;align-items:center;justify-content:center;cursor:pointer;background:#ccedff}.db-search{width:240px}.db-search input{font-size:13px}.segmented{display:flex;padding:3px;border-radius:8px;background:#f2f4f7}.segtab{padding:7px 16px;border:none;border-radius:6px;background:transparent;font-family:inherit;font-size:14px;font-weight:500;color:#475467;cursor:pointer;white-space:nowrap}.segtab.segtab-on{background:#fff;color:#101828;box-shadow:0 1px 2px #1018280d}.db-table{width:100%;min-width:1060px;border-collapse:separate;border-spacing:0;margin:0}.db-table thead th{padding:10px 20px;background:#f9fafb;border:0;border-top:1px solid #EAECF0;border-bottom:1px solid #EAECF0;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;white-space:nowrap}.db-table thead th.is-sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.db-table thead th.is-sorted{color:#101828}.db-table tbody td{padding:12px 20px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;color:#344054;vertical-align:middle}.db-table tbody tr:hover td{background:#fcfcfd}.db-nowrap{white-space:nowrap}.db-storeid{font-weight:600;color:#101828;cursor:pointer}.db-storeid:hover{color:#009bf3;text-decoration:underline}.db-pill{display:inline-block;padding:2px 10px;border-radius:9999px;font-size:12px;font-weight:600;white-space:nowrap}.db-pill--strong{padding:3px 10px}.db-actions{display:flex;align-items:center;gap:6px}.db-viewbtn{display:inline-flex;align-items:center;gap:5px;height:28px;padding:0 10px;border-radius:6px;font-size:12px;font-weight:600;color:#009bf3;cursor:pointer;box-shadow:inset 0 0 0 1px #99dbff;white-space:nowrap}.db-viewbtn:hover{background:#eaf8ff;color:#009bf3}.db-pdfbtn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:6px;color:#475467;cursor:pointer;box-shadow:inset 0 0 0 1px #d0d5dd}.db-pdfbtn:hover{background:#f9fafb;color:#344054}.db-pdfbtn.is-disabled{color:#d0d5dd;cursor:not-allowed}.db-pdfbtn.is-disabled:hover{background:transparent;color:#d0d5dd}.db-empty{padding:28px 20px;text-align:center;font-size:13px;color:#667085}.db-pager{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:14px 20px;font-size:13px;color:#475467}.db-pagebtn{width:32px;height:32px;border:none;border-radius:8px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;display:flex;align-items:center;justify-content:center;color:#475467;cursor:pointer}.db-pagebtn:hover:not(:disabled){background:#f9fafb}.db-pagebtn:disabled{color:#d0d5dd;cursor:default}.db-stats{display:grid;grid-template-columns:.9fr 1.6fr 2fr;gap:16px;align-items:stretch}.db-stat{padding:8px;border-radius:12px;border:1px solid #D0D5DD;background:#fff;overflow:hidden;display:flex;flex-direction:column}.db-stat-head{min-height:70px;padding:10px 14px;border-radius:6px;border-bottom:2px solid #EAECF0;background:radial-gradient(206.89% 107.47% at 16.16% 32.77%,#fff6,#45bbfe33),#f2f4f7;box-shadow:0 4px 10px #0000000d}.db-stat-big{font-size:30px;line-height:38px;font-weight:600;color:#101828}.db-stat-label{font-size:14px;line-height:20px;font-weight:500;color:#344054}.db-stat-body{padding:12px 14px;display:grid;grid-template-columns:1fr;gap:16px}.db-stat-body--2{grid-template-columns:1fr 1fr}.db-stat-body--3{grid-template-columns:repeat(3,1fr)}.db-stat-cell{display:flex;flex-direction:column;gap:2px}.db-stat-mid{margin:4px 0;font-size:20px;line-height:30px;font-weight:700;color:#101828}.db-stat-mid.is-underline{text-decoration:underline}.db-stat-sub{font-size:14px;line-height:20px;font-weight:500;color:#344054}.db-stat-delta{display:flex;align-items:center;gap:5px;font-size:12px;color:#d92d20}.db-stat-delta.is-good{color:#039855}.db-stat-delta.is-bad{color:#d92d20}.db-stat-delta.is-flat{color:#667085}.db-stat-delta.is-down svg{transform:scaleY(-1)}.db-perf{background:#fff;border-radius:8px;box-shadow:inset 0 0 0 1px #f1f1f4,0 3px 4px #00000008;padding:16px 20px 8px;display:flex;flex-direction:column;gap:16px}.db-perftabs{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.db-perftab{padding:10px 18px;border:none;border-radius:8px;background:transparent;font-family:inherit;font-size:14px;font-weight:500;color:#475467;white-space:nowrap;cursor:pointer}.db-perftab.is-on{background:#eaf8ff;color:#009bf3;font-weight:600}.db-perf-head{display:flex;align-items:flex-start;gap:12px;flex-wrap:wrap}.db-perf-text{display:flex;flex-direction:column;gap:2px}.db-perf-title{display:flex;align-items:center;gap:8px;font-size:20px;line-height:30px;font-weight:600;color:#101828}.db-total{font-size:12px;font-weight:500;border-radius:9999px;padding:2px 10px;background:#eaf8ff;color:#009bf3;white-space:nowrap}.db-perf-search{width:250px}.db-create{gap:6px;padding:0 18px;background:#00a3ff;color:#fff}.db-create:hover:not(:disabled){background:#00a3ff}.db-perftable{width:100%;border-collapse:separate;border-spacing:0;margin:0;table-layout:fixed}.db-perftable thead th{padding:10px 4px;background:#f9fafb;border:0;font-size:12px;line-height:18px;font-weight:500;color:#667085;text-align:left;white-space:nowrap}.db-perftable thead th:first-child{border-radius:8px 0 0 8px}.db-perftable thead th:last-child{border-radius:0 8px 8px 0}.db-perftable tbody td{padding:14px 4px;border:0;border-bottom:1px solid #F2F4F7;font-size:14px;line-height:20px;color:#344054;vertical-align:middle}.db-perftable--audit tbody td{padding:16px 4px}.db-perftable--audit th:nth-child(1){width:28%}.db-perftable--audit th:nth-child(2),.db-perftable--audit th:nth-child(3){width:10%}.db-perftable--audit th:nth-child(4),.db-perftable--audit th:nth-child(5){width:9%}.db-perftable--audit th:nth-child(6){width:18%}.db-perftable--audit th:nth-child(7){width:10%}.db-perftable--audit th:nth-child(8){width:6%}.db-perftable--task tbody td{padding:16px 4px}.db-perftable--task th:nth-child(1){width:22%}.db-perftable--task th:nth-child(2),.db-perftable--task th:nth-child(3){width:7.5%}.db-perftable--task th:nth-child(4),.db-perftable--task th:nth-child(5){width:8.5%}.db-perftable--task th:nth-child(6),.db-perftable--task th:nth-child(7),.db-perftable--task th:nth-child(8){width:6.5%}.db-perftable--task th:nth-child(9){width:15%}.db-perftable--task th:nth-child(10){width:6%}.db-perftable--store th:nth-child(1){width:15%}.db-perftable--store th:nth-child(2){width:10%}.db-perftable--store th:nth-child(3){width:17%}.db-perftable--store th:nth-child(4){width:8%}.db-perftable--store th:nth-child(5){width:7%}.db-perftable--store th:nth-child(6),.db-perftable--store th:nth-child(7),.db-perftable--store th:nth-child(8){width:12%}.db-perftable--store th:nth-child(9){width:7%}.db-perftable--user th:nth-child(1){width:15%}.db-perftable--user th:nth-child(2){width:22%}.db-perftable--user th:nth-child(3){width:9%}.db-perftable--user th:nth-child(4),.db-perftable--user th:nth-child(5){width:6%}.db-perftable--user th:nth-child(6),.db-perftable--user th:nth-child(7),.db-perftable--user th:nth-child(8){width:12%}.db-perftable--user th:nth-child(9){width:5%}.db-table thead th,.db-table tbody td,.db-perftable thead th,.db-perftable tbody td{height:auto!important}.db-table thead th,.db-perftable thead th{font-size:12px!important;font-weight:500!important;background:#f9fafb!important}.db-table thead th{padding:10px 20px!important;border-bottom:1px solid #EAECF0!important;color:#667085!important}.db-table thead th.is-sorted{color:#101828!important}.db-table tbody td{padding:12px 20px!important}.db-perftable thead th{padding:10px 4px!important;border-bottom:0!important;color:#667085!important}.db-perftable thead th.is-sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.db-perftable thead th.is-sorted{color:#101828!important}.db-perftable tbody td{padding:14px 4px!important}.db-perftable--audit tbody td,.db-perftable--task tbody td{padding:16px 4px!important}.db-name{display:flex;align-items:center;gap:10px;min-width:0}.db-avatar{width:34px;height:34px;flex-shrink:0;border-radius:9999px;background:#f2f4f7;color:#475467;display:inline-flex;align-items:center;justify-content:center;font-size:11px;font-weight:600}.db-link{font-size:13px;font-weight:500;color:#00a3ff;text-decoration:underline;cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.db-link:hover{color:#009bf3}.db-ulink{color:#00a3ff;text-decoration:underline;cursor:pointer}.db-medium{font-weight:500}.db-score{display:flex;align-items:center;gap:8px}.db-score.is-empty .db-track{display:none}.db-track{flex:1;height:5px;border-radius:9999px;background:#f2f4f7;overflow:hidden;display:block;min-width:40px}.db-track>span{display:block;height:100%;border-radius:9999px;background:#00a3ff}.db-track--6{height:6px}.db-scoretext{font-weight:600;white-space:nowrap}.db-scoretext--sm{font-size:12px;color:#475467}.db-eye{width:22px;height:22px;display:inline-flex;align-items:center;justify-content:center;color:#98a2b3;cursor:pointer}.db-eye:hover{color:#00a3ff}.db-perf-pager{display:flex;align-items:center;justify-content:center;gap:10px;padding:12px 4px;font-size:13px;color:#475467}.db-pagebox{display:inline-flex;align-items:center;padding:4px 12px;border-radius:8px;box-shadow:inset 0 0 0 1px #d0d5dd}.db-page{display:inline-flex;align-items:center;padding:4px 12px;border-radius:8px}.db-page.is-active{background:#eaf8ff;color:#009bf3;font-weight:600}.filter-backdrop{position:fixed;inset:0;background:#10182873;z-index:1050}.filter-drawer{position:fixed;top:0;right:0;bottom:0;width:860px;max-width:96vw;display:flex;flex-direction:column;background:#fff;box-shadow:-10px 0 30px #1018282e;z-index:1051;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.drawer-head{display:flex;align-items:center;gap:10px;padding:18px 20px;box-shadow:inset 0 -1px #eaecf0}.drawer-title{font-size:17px;line-height:26px;font-weight:700;color:#101828}.closebtn{width:32px;height:32px;border:none;border-radius:8px;background:transparent;color:#667085;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.closebtn:hover{background:#f2f4f7;color:#344054}.drawer-body{display:flex;flex:1;min-height:0}.drawer-nav{flex:0 0 280px;max-width:280px;background:#f9fafb;box-shadow:inset -1px 0 #eaecf0;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:4px}.drawer-navitem{display:flex;align-items:center;gap:10px;width:100%;padding:12px 14px;border:none;border-radius:8px;background:transparent;text-align:left;font-family:inherit;cursor:pointer}.drawer-navitem:hover{background:#fff}.drawer-navitem.navitem-active{background:#fff;box-shadow:inset 0 0 0 1px #eaecf0,0 1px 2px #1018280d}.navtext{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.navtitle{font-size:13px;line-height:20px;font-weight:600;color:#101828}.navvalue{font-size:13px;line-height:20px;color:#667085;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.navvalue.is-dirty{color:#009bf3}.dirtydot{width:8px;height:8px;border-radius:9999px;background:#00a3ff;flex-shrink:0;display:block}.drawer-pane{flex:1;min-width:0;overflow-y:auto;padding:24px 28px;display:flex;flex-direction:column;gap:6px}.panetitle{font-size:17px;line-height:26px;font-weight:700;color:#101828}.panehint{font-size:14px;line-height:20px;color:#667085;text-wrap:pretty}.pane-options{display:flex;flex-direction:column;gap:10px;margin-top:14px}.pane-option{display:flex;align-items:flex-start;gap:12px;padding:14px 16px;border-radius:8px;cursor:pointer;background:#fff;box-shadow:inset 0 0 0 1px #eaecf0}.pane-option.is-on{background:#f5fbff;box-shadow:inset 0 0 0 1.5px #00a3ff}.pane-radio{width:18px;height:18px;flex-shrink:0;margin-top:2px;border-radius:9999px;display:flex;align-items:center;justify-content:center;box-shadow:inset 0 0 0 1px #d0d5dd}.pane-radio>span{width:8px;height:8px;border-radius:9999px;background:transparent;display:block}.pane-radio.is-on{box-shadow:inset 0 0 0 1.5px #00a3ff}.pane-radio.is-on>span{background:#00a3ff}.pane-option-text{display:flex;flex-direction:column;gap:2px}.pane-option-label{font-size:14px;line-height:20px;font-weight:600;color:#101828}.pane-option-help{font-size:13px;line-height:20px;color:#667085}.pane-list{display:flex;flex-direction:column;gap:2px;margin-top:14px}.pane-stack{display:flex;flex-direction:column;gap:16px;margin-top:14px}.pane-fields{display:flex;align-items:flex-end;gap:14px;flex-wrap:wrap;margin-top:14px}.pane-resetbtn{align-self:flex-start;margin-top:12px}.field{display:flex;flex-direction:column;gap:6px}.field--full{max-width:420px}.field-label{font-size:12px;line-height:18px;font-weight:600;color:#344054}.field-meta{font-weight:400;color:#667085;margin-left:6px}.field-select{width:100%}.readingrow{display:flex;align-items:center;gap:12px;padding:12px 14px;border-radius:8px;background:#f9fafb;box-shadow:inset 0 0 0 1px #eaecf0;font-size:13px}.readinglabel{font-weight:600;color:#344054}.readingvalue{color:#101828}.optionrow{display:flex;align-items:center;gap:10px;width:100%;padding:11px 12px;border:none;border-radius:8px;background:transparent;text-align:left;font-family:inherit;cursor:pointer}.optionrow:hover{background:#f9fafb}.optionrow.option-selected{background:#eaf8ff}.optionrow.option-selected .optlabel{font-weight:600}.optionmark{display:flex;align-items:center;justify-content:center;width:18px;height:18px;flex-shrink:0;border-radius:9999px;background:#fff;box-shadow:inset 0 0 0 1px #d0d5dd;color:#fff}.optionmark.mark-on{background:#00a3ff;box-shadow:none}.opttext{flex:1;min-width:0;display:flex;flex-direction:column}.optlabel{font-size:13px;line-height:20px;font-weight:500;color:#1d2939}.optmeta{font-size:11px;line-height:16px;color:#667085}.drawer-foot{display:flex;align-items:center;gap:10px;padding:14px 20px;box-shadow:inset 0 1px #eaecf0}.db-bandhint{margin-top:4px;font-size:12px;color:#667085}.db-bandhint b{color:#344054;font-weight:600}\n"] }]
1529
1529
  }], ctorParameters: () => [{ type: i1.TraxService }, { type: i2.GlobalStateService }, { type: i3.ToastService }, { type: i0.ChangeDetectorRef }] });
1530
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtdjItZGFzaGJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2UtdHJheC9zcmMvbGliL2NvbXBvbmVudHMvYXVkaXQtdjIvZGFzaGJvYXJkL2F1ZGl0LXYyLWRhc2hib2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYXgvc3JjL2xpYi9jb21wb25lbnRzL2F1ZGl0LXYyL2Rhc2hib2FyZC9hdWRpdC12Mi1kYXNoYm9hcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUc1QyxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFFMUIsT0FBTyxFQUFlLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlELE9BQU8sRUFBRSxhQUFhLEVBQTRCLGVBQWUsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFrSS9ILE1BQU0sZ0JBQWdCLEdBQWM7SUFDbEMsV0FBVyxFQUFFLEdBQUc7SUFDaEIsYUFBYSxFQUFFLEdBQUc7SUFDbEIsWUFBWSxFQUFFLEdBQUc7SUFDakIsU0FBUyxFQUFFLEdBQUc7SUFDZCxVQUFVLEVBQUUsR0FBRztJQUNmLFNBQVMsRUFBRSxHQUFHO0lBQ2QsZUFBZSxFQUFFLEdBQUc7SUFDcEIsZUFBZSxFQUFFLEdBQUc7SUFDcEIsVUFBVSxFQUFFLEdBQUc7SUFDZixlQUFlLEVBQUUs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Q0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN2RixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7S0FDckcsQ0FBQztJQUNlLGFBQWEsR0FBa0Q7UUFDOUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVE7UUFDcEcsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSTtRQUN2RyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDO0tBQzdDLENBQUM7SUFDZSxjQUFjLEdBQW1EO1FBQ2hGLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUs7UUFDL0csVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDO0tBQ3BJLENBQUM7SUFDZSxhQUFhLEdBQWtEO1FBQzlFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUk7UUFDekcsVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxD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RUFBRSxNQUFNLElBQUksRUFBRSxDQUFDO0lBQzVELENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCwwQ0FBMEM7SUFDbEMsY0FBYztRQUNwQixPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEcsQ0FBQztJQUVELElBQVksZ0JBQWdCO1FBQzFCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDdkIsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVPLFlBQVksQ0FBQyxDQUFXLEVBQUUsSUFBZTtRQUMvQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQztlQUNwRixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7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QUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDMUMsSUFBSSxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMvQixJQUFJLEdBQUcsRUFBRSxJQUFJLEtBQUssR0FBRyxFQUFFO29CQUNyQixJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxtRUFBbUUsQ0FBQyxDQUFDO2lCQUNqRztZQUNILENBQUM7WUFDRCxLQUFLLEVBQUUsR0FBRyxFQUFFO2dCQUNWLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1lBQ3BELENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO3dHQS83Q1UseUJBQXlCOzRGQUF6Qix5QkFBeUIsOERDN090Qyw2eXBEQW8yQkE7OzRGRHZuQmEseUJBQXlCO2tCQUxyQyxTQUFTOytCQUNFLHdCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN1YmplY3QsIGRlYm91bmNlVGltZSwgZm9ya0pvaW4sIG9mLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLWdsb2JhbCc7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xyXG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnO1xyXG5pbXBvcnQgeyBUcmF4U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RyYXguc2VydmljZSc7XHJcbmltcG9ydCB7IEF1ZGl0QWNjZXNzLCBhdWRpdEFjY2VzcyB9IGZyb20gJy4uL2F1ZGl0LXYyLWFjY2Vzcyc7XHJcbmltcG9ydCB7IFBJQ0tFUl9MT0NBTEUsIFBpY2tlZERhdGVzLCBQaWNrZXJSYW5nZSwgZnJvbVBpY2tlclJhbmdlLCBwaWNrZXJSYW5nZXMsIHRvUGlja2VyUmFuZ2UgfSBmcm9tICcuLi9hdWRpdC12Mi1kYXRlcGlja2VyJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXVkaXRCYW5kIHtcclxuICBrZXk6IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIHJhbmdlOiBzdHJpbmc7XHJcbiAgbG86IG51bWJlcjtcclxuICBoaTogbnVtYmVyO1xyXG4gIHNvZnQ6IHN0cmluZztcclxuICBiZzogc3RyaW5nO1xyXG4gIGZnOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXVkaXRSb3cge1xyXG4gIGRhdGU6IHN0cmluZztcclxuICBzdG9yZUlkOiBzdHJpbmc7XHJcbiAgY2lyY2xlOiBzdHJpbmc7XHJcbiAgem9uZTogc3RyaW5nO1xyXG4gIGFvbTogc3RyaW5nO1xyXG4gIHNjb3JlOiBudW1iZXIgfCBudWxsO1xyXG4gIC8qKiAndW5zY29yZWQnID0gYXVkaXRlZCwgYnV0IG5vIHF1ZXN0aW9uIG9mIGl0cyBhdWRpdHMgaGFzIGNvbXBsaWFuY2Ugc2NvcmluZyBvbiAobm8gc2NvcmUgdG8gc2hvdykuICovXHJcbiAgc3RhdHVzOiBTdG9yZVN0YXR1cztcclxuICByYXc/OiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFN0b3JlU3RhdHVzID0gJ3Bhc3MnIHwgJ2ZhaWwnIHwgJ25hJyB8ICd1bnNjb3JlZCc7XHJcbmV4cG9ydCB0eXBlIFN0YXR1c0ZpbHRlciA9ICdhbGwnIHwgU3RvcmVTdGF0dXM7XHJcblxyXG4vKiogQSBzb3J0YWJsZSBjb2x1bW4gb2YgYSBQZXJmb3JtYW5jZSB0YWJsZS4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBQZXJmQ29sdW1uIHtcclxuICBrZXk6IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG59XHJcblxyXG50eXBlIFNvcnRWYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQ7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0S3BpIHtcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIHZhbHVlOiBzdHJpbmc7XHJcbiAgbm90ZTogc3RyaW5nO1xyXG4gIG5vdGVDb2xvcjogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlckNhdCB7XHJcbiAga2V5OiBzdHJpbmc7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICB2YWx1ZTogc3RyaW5nO1xyXG4gIHRpdGxlOiBzdHJpbmc7XHJcbiAgc3ViOiBzdHJpbmc7XHJcbiAgZGlydHk6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXVkaXRQZXJmUm93IHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgaW5pdGlhbHM6IHN0cmluZztcclxuICBzY2hlZHVsZWQ6IHN0cmluZztcclxuICBhc3NpZ25lZDogbnVtYmVyO1xyXG4gIHN1Ym1pdHRlZDogbnVtYmVyO1xyXG4gIGRpc3B1dGVzOiBudW1iZXIgfCBudWxsO1xyXG4gIHBhc3NNYXJrOiBzdHJpbmc7XHJcbiAgc2NvcmU6IHN0cmluZztcclxuICBzY29yZVBjdDogbnVtYmVyO1xyXG4gIC8qKiAn4oCUJyB3aGVuIHRoZSBhdWRpdCBoYXMgbm8gY29tcGxpYW5jZSBzY29yaW5nIChubyBzY29yZSwgc28gbm8gcmVzdWx0KS4gKi9cclxuICByZXN1bHQ6ICdQYXNzJyB8ICdGYWlsJyB8ICfigJQnO1xyXG4gIHJhdz86IGFueTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTdG9yZVBlcmZSb3cge1xyXG4gIHN0b3JlSWQ6IHN0cmluZztcclxuICBzdG9yZTogc3RyaW5nO1xyXG4gIHNwb2M6IHN0cmluZztcclxuICBhc3NpZ25lZDogbnVtYmVyO1xyXG4gIGZsYWdzOiBudW1iZXIgfCBudWxsO1xyXG4gIGNvbXBsZXRpb246IHN0cmluZztcclxuICBjb21wbGlhbmNlOiBzdHJpbmc7XHJcbiAgcGVyZjogc3RyaW5nO1xyXG4gIHJhdz86IGFueTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBVc2VyUGVyZlJvdyB7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIGVtYWlsOiBzdHJpbmc7XHJcbiAgYXNzaWduZWQ6IG51bWJlcjtcclxuICBmbGFnczogbnVtYmVyO1xyXG4gIHJlZG86IG51bWJlcjtcclxuICBjb21wbGV0aW9uOiBzdHJpbmc7XHJcbiAgY29tcGxpYW5jZTogc3RyaW5nO1xyXG4gIHBlcmY6IHN0cmluZztcclxuICByYXc/OiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGFza1BlcmZSb3cge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBpbml0aWFsczogc3RyaW5nO1xyXG4gIHNjaGVkdWxlZDogc3RyaW5nO1xyXG4gIGNvdmVyYWdlOiBzdHJpbmc7XHJcbiAgYXNzaWduZWQ6IG51bWJlcjtcclxuICBzdWJtaXR0ZWQ6IG51bWJlcjtcclxuICBmbGFnczogbnVtYmVyO1xyXG4gIHRhc2tzOiBzdHJpbmc7XHJcbiAgcmVkbzogbnVtYmVyO1xyXG4gIGNvbXBsaWFuY2U6IHN0cmluZztcclxuICBjb21wbGlhbmNlUGN0OiBudW1iZXI7XHJcbiAgcmF3PzogYW55O1xyXG59XHJcblxyXG4vKiogVGFzay1tb2RlIHRpbGVzLCBhcyBkaXNwbGF5ZWQgKCfigJQnIHdoZW4gdGhlIEFQSSBoYXMgbm8gdmFsdWUpLiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFRhc2tTdGF0cyB7XHJcbiAgYWN0aXZlVGFza3M6IHN0cmluZztcclxuICB0YXNrSW5zdGFuY2VzOiBzdHJpbmc7XHJcbiAgbm90U3VibWl0dGVkOiBzdHJpbmc7XHJcbiAgb3BlblRhc2tzOiBzdHJpbmc7XHJcbiAgaW5Qcm9ncmVzczogc3RyaW5nO1xyXG4gIHN1Ym1pdHRlZDogc3RyaW5nO1xyXG4gIGNvbXBsZXRpb25TY29yZTogc3RyaW5nO1xyXG4gIGNvbXBsaWFuY2VTY29yZTogc3RyaW5nO1xyXG4gIHRvdGFsRmxhZ3M6IHN0cmluZztcclxuICBjb21wbGV0aW9uRGVsdGE6IHN0cmluZztcclxuICBjb21wbGlhbmNlRGVsdGE6IHN0cmluZztcclxuICBmbGFnc0RlbHRhOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFRhc2tEZWx0YUtleSA9ICdjb21wbGV0aW9uJyB8ICdjb21wbGlhbmNlJyB8ICdmbGFncyc7XHJcblxyXG4vKiogT25lIGV4cG9ydGVkIGNvbHVtbjogaGVhZGVyIHRleHQgYW5kIHRoZSBjZWxsIHZhbHVlIGZvciBhIHJvdy4gKi9cclxuaW50ZXJmYWNlIEV4cG9ydENvbHVtbjxUPiB7XHJcbiAgaGVhZGVyOiBzdHJpbmc7XHJcbiAgdmFsdWU6IChyb3c6IFQpID0+IGFueTtcclxufVxyXG5cclxuY29uc3QgRU1QVFlfVEFTS19TVEFUUzogVGFza1N0YXRzID0ge1xyXG4gIGFjdGl2ZVRhc2tzOiAn4oCUJyxcclxuICB0YXNrSW5zdGFuY2VzOiAn4oCUJyxcclxuICBub3RTdWJtaXR0ZWQ6ICfigJQnLFxyXG4gIG9wZW5UYXNrczogJ+KAlCcsXHJcbiAgaW5Qcm9ncmVzczogJ+KAlCcsXHJcbiAgc3VibWl0dGVkOiAn4oCUJyxcclxuICBjb21wbGV0aW9uU2NvcmU6ICfigJQnLFxyXG4gIGNvbXBsaWFuY2VTY29yZTogJ+KAlCcsXHJcbiAgdG90YWxGbGFnczogJ+KAlCcsXHJcbiAgY29tcGxldGlvbkRlbHRhOiAnJyxcclxuICBjb21wbGlhbmNlRGVsdGE6ICcnLFxyXG4gIGZsYWdzRGVsdGE6ICcnXHJcbn07XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFRyZW5kQmFyIHtcclxuICBrZXk6IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIC8qKiBBdmVyYWdlIG9mIHRoZSBjb21wbGlhbmNlLXNjb3JlZCBhdWRpdHM7IG51bGwgd2hlbiBub25lLiAqL1xyXG4gIHZhbHVlOiBudW1iZXIgfCBudWxsO1xyXG4gIC8qKiBDb21wbGlhbmNlLXNjb3JlZCBhdWRpdHMgKHRoZSBvbmVzIHRoZSBhdmVyYWdlIHJlYWRzKS4gKi9cclxuICBjb3VudDogbnVtYmVyO1xyXG4gIC8qKiBFdmVyeSBzdWJtaXR0ZWQgYXVkaXQsIHNjb3JlZCBvciBub3QuICovXHJcbiAgc3VibWl0dGVkOiBudW1iZXI7XHJcbn1cclxuXHJcbi8qKiBPbmUgZmluYW5jaWFsIHF1YXJ0ZXI6IEFwcmlsLU1hcmNoIHllYXIsIG5hbWVkIGJ5IHRoZSB5ZWFyIGl0IHN0YXJ0cyBpbiAocHJvdG90eXBlOiBBdWcgMjAyNiA9IFEyIEZZMjYpLiAqL1xyXG5pbnRlcmZhY2UgRmlzY2FsUXVhcnRlciB7XHJcbiAga2V5OiBzdHJpbmc7XHJcbiAgZnJvbTogc3RyaW5nO1xyXG4gIHRvOiBzdHJpbmc7XHJcbiAgbW9udGhzOiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKiBUaGUgbGFzdCBgbmAgZmluYW5jaWFsIHF1YXJ0ZXJzLCBvbGRlc3QgZmlyc3QsIGVuZGluZyB3aXRoIHRoZSBvbmUgYHRvZGF5YCBmYWxscyBpbi4gKi9cclxuZnVuY3Rpb24gZmlzY2FsUXVhcnRlcnModG9kYXkgPSBkYXlqcygpLCBuID0gNCk6IEZpc2NhbFF1YXJ0ZXJbXSB7XHJcbiAgY29uc3QgY3VycmVudCA9IHRvZGF5LnN0YXJ0T2YoJ21vbnRoJykuc3VidHJhY3QoKHRvZGF5Lm1vbnRoKCkgKyA5KSAlIDMsICdtb250aCcpO1xyXG4gIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBuIH0sIChfLCBpKSA9PiB7XHJcbiAgICBjb25zdCBzdGFydCA9IGN1cnJlbnQuc3VidHJhY3QoMyAqIChuIC0gMSAtIGkpLCAnbW9udGgnKTtcclxuICAgIGNvbnN0IGVuZCA9IHN0YXJ0LmFkZCgyLCAnbW9udGgnKS5lbmRPZignbW9udGgnKTtcclxuICAgIGNvbnN0IGZ5ID0gc3RhcnQubW9udGgoKSA+PSAzID8gc3RhcnQueWVhcigpIDogc3RhcnQueWVhcigpIC0gMTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGtleTogJ1EnICsgKE1hdGguZmxvb3IoKChzdGFydC5tb250aCgpICsgOSkgJSAxMikgLyAzKSArIDEpICsgJyBGWScgKyBTdHJpbmcoZnkpLnNsaWNlKDIpLFxyXG4gICAgICBmcm9tOiBzdGFydC5mb3JtYXQoJ1lZWVktTU0tREQnKSxcclxuICAgICAgdG86IGVuZC5mb3JtYXQoJ1lZWVktTU0tREQnKSxcclxuICAgICAgbW9udGhzOiBzdGFydC5mb3JtYXQoJ01NTScpICsgJyDigJMgJyArIGVuZC5mb3JtYXQoJ01NTSBZWVlZJylcclxuICAgIH07XHJcbiAgfSk7XHJcbn1cclxuXHJcbi8qKiBQYXNzIG1hcmsgYW5kIGNyaXRpY2FsIHRocmVzaG9sZCBmb3IgdGhlIGF1ZGl0IHByb2dyYW1tZSAobm8gcGVyLWF1ZGl0IHBhc3MgbWFyayBpbiB0aGUgZGF0YSB5ZXQpLiAqL1xyXG5jb25zdCBQQVNTX01BUksgPSA3NTtcclxuY29uc3QgQ1JJVElDQUxfTUFSSyA9IDYwO1xyXG5cclxuY29uc3QgQkFORFM6IEF1ZGl0QmFuZFtdID0gW1xyXG4gIHsga2V5OiAnZXhjZWxsZW50JywgbGFiZWw6ICdFeGNlbGxlbnQnLCByYW5nZTogJzkwLTEwMCUnLCBsbzogOTAsIGhpOiAxMDAsIHNvZnQ6ICcjOEZCRkE1JywgYmc6ICcjRUNGREYzJywgZmc6ICcjMDI3QTQ4JyB9LFxyXG4gIHsga2V5OiAnZ29vZCcsIGxhYmVsOiAnR29vZCcsIHJhbmdlOiAnNzUtODklJywgbG86IDc1LCBoaTogODksIHNvZnQ6ICcjOTZCNEQ2JywgYmc6ICcjRUZGOEZGJywgZmc6ICcjMTc1Q0QzJyB9LFxyXG4gIHsga2V5OiAnZmFpcicsIGxhYmVsOiAnTmVlZHMgaW1wcm92ZW1lbnQnLCByYW5nZTogJzYwLTc0JScsIGxvOiA2MCwgaGk6IDc0LCBzb2Z0OiAnI0RDQkU4QycsIGJnOiAnI0ZGRkFFQicsIGZnOiAnI0I1NDcwOCcgfSxcclxuICB7IGtleTogJ2NyaXRpY2FsJywgbGFiZWw6ICdDcml0aWNhbCcsIHJhbmdlOiAnQmVsb3cgNjAlJywgbG86IDAsIGhpOiA1OSwgc29mdDogJyNENkExOUInLCBiZzogJyNGRUYzRjInLCBmZzogJyNCNDIzMTgnIH0sXHJcbiAgeyBrZXk6ICd1bnNjb3JlZCcsIGxhYmVsOiAnTm90IHNjb3JlZCcsIHJhbmdlOiAnQ29tcGxpYW5jZSBzY29yZSBvZmYnLCBsbzogMCwgaGk6IDEwMCwgc29mdDogJyNDN0Q3RkUnLCBiZzogJyNFRUY0RkYnLCBmZzogJyMzNTM4Q0QnIH0sXHJcbiAgeyBrZXk6ICduYScsIGxhYmVsOiAnTm90IGF1ZGl0ZWQnLCByYW5nZTogJ05vIHN1Ym1pc3Npb24nLCBsbzogMCwgaGk6IDEwMCwgc29mdDogJyNENkRBRTAnLCBiZzogJyNGMkY0RjcnLCBmZzogJyM0NzU0NjcnIH1cclxuXTtcclxuXHJcbi8qKiBCYW5kcyB0aGF0IGhvbGQgc3RvcmVzIHdpdGhvdXQgYSBzY29yZTsgdGhleSBmaWx0ZXIgYnkgc3RhdHVzLCBub3QgYnkgc2NvcmUgcmFuZ2UuICovXHJcbmNvbnN0IFNUQVRVU19CQU5EUyA9IFsndW5zY29yZWQnLCAnbmEnXTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXVkaXRUeXBlT3B0aW9uIHtcclxuICBrZXk6IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIGhlbHA6IHN0cmluZztcclxufVxyXG5cclxuY29uc3QgQUxMX0FVRElUUzogQXVkaXRUeXBlT3B0aW9uID0geyBrZXk6ICdhbGwnLCBsYWJlbDogJ0FsbCBBdWRpdHMnLCBoZWxwOiAnQmxlbmRlZCBzY29yZSBhY3Jvc3MgZXZlcnkgcHJvZ3JhbW1lLicgfTtcclxuXHJcbi8qKiBTdG9yZSBoaWVyYXJjaHkgcGlja3M6IGNpcmNsZSBoZWFkIC8gem9uZSBtYW5hZ2VyIC8gQU9NIG5hbWVzIGFzIHRoZSBkYXNoYm9hcmQgQVBJIHNlbmRzIHRoZW0sIHN0b3JlID0gc3RvcmVJZC4gKi9cclxuaW50ZXJmYWNlIFNjb3BlUGljayB7XHJcbiAgY2lyY2xlOiBzdHJpbmc7XHJcbiAgem9uZTogc3RyaW5nO1xyXG4gIGFvbTogc3RyaW5nO1xyXG4gIHN0b3JlOiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEYXNoYm9hcmQuIFN0b3JlIGxpc3QsIHNjb3JlIGJhbmRzLCBLUElzIGFuZCB0aGUgYnktZGF0ZSB0cmVuZCBjb21lIGZyb20gdGhlIGF1ZGl0IEFQSVxyXG4gKiAoL3RyYXgvYXVkaXQvZGFzaGJvYXJkKTsgdGhlIEF1ZGl0IC8gVXNlciBQZXJmb3JtYW5jZSB0YWJzIHN0aWxsIHVzZSB0aGUgdjEgZGFzaGJvYXJkXHJcbiAqIGVuZHBvaW50cyAoY2hlY2tsaXN0UGVyZm9ybWFuY2UgLyB1c2VyUGVyZm9ybWFuY2UpLiBUYXNrIG1vZGUgKHRpbGVzICsgVGFzayBQZXJmb3JtYW5jZSkgcmVhZHNcclxuICogL3RyYXgvYXVkaXQvZGFzaGJvYXJkL3Rhc2tzOiBvbmx5IHRoZSB0YXNrcyByYWlzZWQgZnJvbSB0aGlzIGNsaWVudCdzIGF1ZGl0cy5cclxuICogU2NvcGUgKGNsaWVudCwgc3RvcmVzLCBkYXRlcykgY29tZXMgZnJvbSB0aGUgZ2xvYmFsIGhlYWRlciBmaWx0ZXI7IHRoZSBwZXJpb2QgcGlja2VyIGNhbiBuYXJyb3cgdGhlIGRhdGVzLlxyXG4gKiBGaWx0ZXJzIGRyYXdlcjogU3RvcmUgaGllcmFyY2h5IG5hcnJvd3MgdGhlIHN0b3JlcyBhbmQgQXVkaXQgdHlwZSAoY2hlY2tsaXN0SWQpIHRoZSBhdWRpdCBvZiBldmVyeSBmZWVkIChyZWxvYWRlZFxyXG4gKiBvbiBBcHBseSk7IFNjb3JlIHJhbmdlIGFuZCBTdGF0dXMgb25seSBmaWx0ZXIgdGhlIGxvYWRlZCBzdG9yZSBsaXN0IGluIHRoZSBicm93c2VyLlxyXG4gKlxyXG4gKiBRdWFydGVybHk6IHRoZSB0cmVuZCBzaG93cyB0aGUgbGFzdCBmb3VyIGZpbmFuY2lhbCBxdWFydGVycyAoYnVpbHQgZnJvbSBvbmUgbW9udGhseS1idWNrZXQgY2FsbCBvZlxyXG4gKiB0aGUgc2FtZSBBUEkpIGFuZCB0aGUgcGlja2VkIHF1YXJ0ZXIgYmVjb21lcyB0aGUgcGVyaW9kIG9mIGV2ZXJ5IGZlZWQuIEJ5IGRhdGU6IHRoZSByYW5nZSBwaWNrZXIuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1hdWRpdC12Mi1kYXNoYm9hcmQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hdWRpdC12Mi1kYXNoYm9hcmQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9hdWRpdC12Mi1kYXNoYm9hcmQuY29tcG9uZW50LnNjc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdWRpdFYyRGFzaGJvYXJkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIC8qKiBQYXNzIC8gY3JpdGljYWwgbWFya3MgY29tZSBmcm9tIHRoZSBhdWRpdCBkYXNoYm9hcmQgQVBJOyB0aGVzZSBhcmUgdGhlIGVtcHR5LXN0YXRlIGRlZmF1bHRzLiAqL1xyXG4gIHBhc3NNYXJrID0gUEFTU19NQVJLO1xyXG4gIGNyaXRpY2FsTWFyayA9IENSSVRJQ0FMX01BUks7XHJcbiAgcmVhZG9ubHkgYmFuZHMgPSBCQU5EUztcclxuICAvKiogXCJBbGwgQXVkaXRzXCIsIHRoZW4gdGhlIGNsaWVudCdzIGF1ZGl0cyAoUE9TVCAvdHJheC9hdWRpdC9saXN0KTsga2V5ID0gYXVkaXQgaWQsIHNlbnQgYXMgY2hlY2tsaXN0SWQuICovXHJcbiAgYXVkaXRUeXBlczogQXVkaXRUeXBlT3B0aW9uW10gPSBbQUxMX0FVRElUU107XHJcbiAgLyoqIENsaWVudCB0aGUgYXVkaXQgbGlzdCB3YXMgZmV0Y2hlZCBmb3IuICovXHJcbiAgcHJpdmF0ZSBhdWRpdFR5cGVzQ2xpZW50ID0gJyc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcmlvZCBzZWxlY3Rpb24uIGZyb20gLyB0byAoWVlZWS1NTS1ERCkgc3RhcnQgYXMgdGhlIGhlYWRlciBkYXRlIHJhbmdlIGFuZCBkcml2ZSBldmVyeSBmZWVkO1xyXG4gICAqIHRoZSByYW5nZSBwaWNrZXIgbmFycm93cyB0aGVtLCBhbmQgYSBoZWFkZXIgY2hhbmdlIHJlc2V0cyB0aGVtLlxyXG4gICAqL1xyXG4gIGdyYWluOiAncXVhcnRlcicgfCAnZGF0ZScgPSAnZGF0ZSc7XHJcbiAgcXVhcnRlciA9ICcnO1xyXG4gIHJlYWRvbmx5IGZpc2NhbCA9IGZpc2NhbFF1YXJ0ZXJzKCk7XHJcbiAgcmVhZG9ubHkgcXVhcnRlcnMgPSB0aGlzLmZpc2NhbC5tYXAocSA9PiBxLmtleSk7XHJcbiAgLyoqIFF1YXJ0ZXJseSB0cmVuZCBiYXJzLCBhbmQgdGhlIGNsaWVudCArIHN0b3JlcyB0aGV5IHdlcmUgZmV0Y2hlZCBmb3IuICovXHJcbiAgcXVhcnRlclRyZW5kOiBUcmVuZEJhcltdID0gW107XHJcbiAgcXVhcnRlclRyZW5kTG9hZGluZyA9IGZhbHNlO1xyXG4gIHByaXZhdGUgcXVhcnRlclRyZW5kU2NvcGUgPSAnJztcclxuICBmcm9tID0gJyc7XHJcbiAgdG8gPSAnJztcclxuICByYW5nZTogUGlja2VyUmFuZ2UgfCBudWxsID0gbnVsbDtcclxuICByZWFkb25seSBwaWNrZXJMb2NhbGUgPSBQSUNLRVJfTE9DQUxFO1xyXG4gIHJlYWRvbmx5IHJhbmdlcyA9IHBpY2tlclJhbmdlcygpO1xyXG4gIHJlYWRvbmx5IHRvZGF5ID0gZGF5anMoKTtcclxuXHJcbiAgLyoqIEZpbHRlcnMuICovXHJcbiAgYXVkaXRUeXBlID0gJ2FsbCc7XHJcbiAgc3RhdHVzOiBTdGF0dXNGaWx0ZXIgPSAnYWxsJztcclxuICBzZWFyY2ggPSAnJztcclxuICBzY29yZU1pbiA9IDA7XHJcbiAgc2NvcmVNYXggPSAxMDA7XHJcblxyXG4gIC8qKiBBdWRpdCAvIFRhc2sgc3dpdGNoLiAqL1xyXG4gIG1vZHVsZVRhYjogJ0F1ZGl0JyB8ICdUYXNrJyA9ICdBdWRpdCc7XHJcbiAgcmVhZG9ubHkgbW9kdWxlVGFiczogQXJyYXk8J0F1ZGl0JyB8ICdUYXNrJz4gPSBbJ0F1ZGl0JywgJ1Rhc2snXTtcclxuXHJcbiAgLyoqIFNob3duIGluIHRoZSBwYWdlIGhlYWRlcjsgc3RhbXBlZCBvbiBldmVyeSBsb2FkLiAqL1xyXG4gIGxhc3RSZWZyZXNoZWQgPSAn4oCUJztcclxuXHJcbiAgLyoqIEZpbHRlciBkcmF3ZXIuICovXHJcbiAgZmlsdGVyc09wZW4gPSBmYWxzZTtcclxuICBhY3RpdmVDYXQgPSAncGVyaW9kJztcclxuICAvKipcclxuICAgKiBUaGUgZmlsdGVyIGRyYXdlcidzIGRyYWZ0IChRQSA5IE9jdCk6IE9iamVjdC5jcmVhdGUodGhpcyksIHNvIGV2ZXJ5IGdldHRlciB0aGUgZHJhd2VyIHNob3dzIHdvcmtzIG9uIHRoZSBkcmFmdCdzXHJcbiAgICogb3duIHZhbHVlcyB3aGlsZSB0aGUgcGFnZSBiZWhpbmQga2VlcHMgdGhlIGFwcGxpZWQgb25lcy4gQXBwbHkgY29waWVzIERSQUZUX0tFWVMgb250byB0aGUgcGFnZTsgQ2FuY2VsIGRyb3BzIGl0LlxyXG4gICAqL1xyXG4gIGRyYWZ0OiBBdWRpdFYyRGFzaGJvYXJkQ29tcG9uZW50IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRFJBRlRfS0VZUyA9IFsnZ3JhaW4nLCAncXVhcnRlcicsICdmcm9tJywgJ3RvJywgJ3JhbmdlJywgJ2F1ZGl0VHlwZScsICdjaXJjbGUnLCAnem9uZScsICdhb20nLCAnc3RvcmUnLFxyXG4gICAgJ3Njb3JlTWluJywgJ3Njb3JlTWF4JywgJ3N0YXR1cycsICdzdG9yZUxpc3RPcGVuJywgJ2xpc3RCYW5kS2V5J10gYXMgY29uc3Q7XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0b3JlIGhpZXJhcmNoeSBwaWNrcyBiZWluZyBlZGl0ZWQgaW4gdGhlIGRyYXdlciAoc3RvcmUgPSBzdG9yZUlkKS4gVGhlIGxpc3RzIGNvbWUgZnJvbSB0aGUgZGFzaGJvYXJkXHJcbiAgICogQVBJJ3Mgc3RvcmUgcm93cyBvZiB0aGUgaGVhZGVyIHNjb3BlOyBBcHBseSBuYXJyb3dzIGV2ZXJ5IGZlZWQgdG8gdGhlIHN0b3JlcyB0aGUgcGljayBjb3ZlcnMuXHJcbiAgICovXHJcbiAgY2lyY2xlID0gJyc7XHJcbiAgem9uZSA9ICcnO1xyXG4gIGFvbSA9ICcnO1xyXG4gIHN0b3JlID0gJyc7XHJcblxyXG4gIC8qKiBTdG9yZSByb3dzIG9mIHRoZSBoZWFkZXIgc2NvcGUsIG5vdCBuYXJyb3dlZCBieSB0aGUgaGllcmFyY2h5OiB0aGUgZHJhd2VyJ3MgbGlzdHMgYW5kIGVhY2ggcGljaydzIHN0b3Jlcy4gKi9cclxuICBwcml2YXRlIHNjb3BlUm93czogQXVkaXRSb3dbXSA9IFtdO1xyXG4gIC8qKiBIaWVyYXJjaHkgKyBhdWRpdCB0eXBlIHRoZSBmZWVkcyB3ZXJlIGxhc3QgbG9hZGVkIHdpdGg7IHRoZSBkcmF3ZXIgZWRpdHMgYSBkcmFmdCB1bnRpbCBBcHBseS4gKi9cclxuICBwcml2YXRlIGFwcGxpZWQ6IFNjb3BlUGljayAmIHsgYXVkaXRUeXBlOiBzdHJpbmcgfSA9IHsgY2lyY2xlOiAnJywgem9uZTogJycsIGFvbTogJycsIHN0b3JlOiAnJywgYXVkaXRUeXBlOiAnYWxsJyB9O1xyXG4gIC8qKiBDbGllbnQgKyBoZWFkZXIgc3RvcmVzOyBhIGNoYW5nZSByZXNldHMgdGhlIGhpZXJhcmNoeSBwaWNrcyAodGhlaXIgc3RvcmVzIG1heSBiZSBnb25lKS4gKi9cclxuICBwcml2YXRlIGhlYWRlclNjb3BlS2V5ID0gJyc7XHJcblxyXG4gIC8qKiBUYWJsZSBzdGF0ZS4gKi9cclxuICBzb3J0S2V5ID0gJ3Njb3JlJztcclxuICBzb3J0RGlyOiAnYXNjJyB8ICdkZXNjJyA9ICdhc2MnO1xyXG4gIHBhZ2UgPSAxO1xyXG4gIC8qKiBTdG9yZSBsaXN0IHBhZ2VyOiAxMCByb3dzIGEgcGFnZSwgMTAgLyAyMCAvIDMwLCBhcyBvbiBldmVyeSBhdWRpdCBsaXN0LiAqL1xyXG4gIHBhZ2VTaXplID0gMTA7XHJcbiAgcmVhZG9ubHkgcGFnZVNpemVzID0gWzEwLCAyMCwgMzBdO1xyXG5cclxuICBoZWFkZXJzOiBBcnJheTx7IGtleTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH0+ID0gW1xyXG4gICAgeyBrZXk6ICdkYXRlJywgbGFiZWw6ICdBdWRpdCBkYXRlJyB9LFxyXG4gICAgLy8gVGhlIGNvbHVtbiBzaG93cyB0aGUgc3RvcmUncyBuYW1lIChyb3cuc3RvcmVJZCBob2xkcyBpdDsgc2VlIHRvQXVkaXRSb3cpLlxyXG4gICAgeyBrZXk6ICdzdG9yZUlkJywgbGFiZWw6ICdTdG9yZSBOYW1lJyB9LFxyXG4gICAgeyBrZXk6ICdjaXJjbGUnLCBsYWJlbDogJ0NpcmNsZSBIZWFkJyB9LFxyXG4gICAgeyBrZXk6ICd6b25lJywgbGFiZWw6ICdab25lIE1hbmFnZXInIH0sXHJcbiAgICB7IGtleTogJ2FvbScsIGxhYmVsOiAnQU9NJyB9LFxyXG4gICAgeyBrZXk6ICdzY29yZScsIGxhYmVsOiAnU2NvcmUnIH0sXHJcbiAgICB7IGtleTogJ3N0YXR1cycsIGxhYmVsOiAnU3RhdHVzJyB9XHJcbiAgXTtcclxuXHJcbiAgLyoqXHJcbiAgICogVGFzayBtb2RlOiB0aWxlcyBhbmQgdGhlIFRhc2sgUGVyZm9ybWFuY2UgdGFibGUgZm9yIHRoZSB0YXNrcyByYWlzZWQgZnJvbSB0aGlzIGNsaWVudCdzIGF1ZGl0c1xyXG4gICAqICgvdHJheC9hdWRpdC9kYXNoYm9hcmQvdGFza3MpLiBMb2FkZWQgd2hlbiB0aGUgVGFzayB0YWIgaXMgb3BlbiwgYW5kIGFnYWluIGFmdGVyIGEgaGVhZGVyIGNoYW5nZS5cclxuICAgKi9cclxuICB0YXNrU3RhdHM6IFRhc2tTdGF0cyA9IHsgLi4uRU1QVFlfVEFTS19TVEFUUyB9O1xyXG4gIHRhc2tQZXJmOiBUYXNrUGVyZlJvd1tdID0gW107XHJcbiAgdGFza0xvYWRpbmcgPSBmYWxzZTtcclxuICAvKiogQ2hhbmdlIHZzIHRoZSBwcmV2aW91cyBwZXJpb2QgKG51bGwgPSBub3RoaW5nIHRvIGNvbXBhcmUpOyBkcml2ZXMgdGhlIGRlbHRhIGFycm93IGFuZCBjb2xvdXIuICovXHJcbiAgcHJpdmF0ZSB0YXNrRGVsdGFWYWx1ZXM6IFJlY29yZDxUYXNrRGVsdGFLZXksIG51bWJlciB8IG51bGw+ID0geyBjb21wbGV0aW9uOiBudWxsLCBjb21wbGlhbmNlOiBudWxsLCBmbGFnczogbnVsbCB9O1xyXG4gIC8qKiBUcnVlIHVudGlsIHRoZSB0YXNrIGZpZ3VyZXMgYXJlIGxvYWRlZCBmb3IgdGhlIGN1cnJlbnQgc2NvcGUuICovXHJcbiAgcHJpdmF0ZSB0YXNrc1N0YWxlID0gdHJ1ZTtcclxuICAvKiogSWdub3JlcyBhIHRhc2sgcmVzcG9uc2UgdGhhdCBhIG5ld2VyIHJlcXVlc3QgaGFzIG92ZXJ0YWtlbi4gKi9cclxuICBwcml2YXRlIHRhc2tSZXF1ZXN0ID0gMDtcclxuICAvKiogUERGIGRvd25sb2FkcyBpbiBmbGlnaHQsIGJ5IHZpc2l0IGlkLCBzbyBhIGRvdWJsZSBjbGljayBxdWV1ZXMgb25lIHJlcG9ydC4gKi9cclxuICBwcml2YXRlIHJlYWRvbmx5IHBkZlF1ZXVlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG5cclxuICAvKiogUGVyZm9ybWFuY2Ugc2VjdGlvbi4gKi9cclxuICBwZXJmVGFiOiAnQXVkaXQnIHwgJ1N0b3JlJyB8ICdVc2VyJyA9ICdBdWRpdCc7XHJcbiAgcmVhZG9ubHkgcGVyZlRhYnM6IEFycmF5PCdBdWRpdCcgfCAnU3RvcmUnIHwgJ1VzZXInPiA9IFsnQXVkaXQnLCAnU3RvcmUnLCAnVXNlciddO1xyXG4gIHBlcmZQZXJpb2QgPSAnJztcclxuICBwZXJmU2VhcmNoID0gJyc7XHJcbiAgLyoqIFBlcmZvcm1hbmNlIHRhYmxlcycgcGFnZXIgKHNoYXJlZCBsaWItcGFnaW5hdGlvbiwgYXMgdGhlIG90aGVyIGF1ZGl0IGxpc3RzKTogMTAgcm93cyBhIHBhZ2UsIDEwIC8gMjAgLyAzMC4gKi9cclxuICBwZXJmUGFnZSA9IDE7XHJcbiAgcGVyZlBhZ2VTaXplID0gMTA7XHJcbiAgcmVhZG9ubHkgcGVyZlBhZ2VTaXplcyA9IFsxMCwgMjAsIDMwXTtcclxuICAvKiogQ29sdW1uIHNvcnQgb2YgdGhlIGFjdGl2ZSBQZXJmb3JtYW5jZSB0YWJsZSAoJycgPSB0aGUgQVBJJ3Mgb3JkZXIpOyByZXNldCB3aGVuIHRoZSB0YWIgY2hhbmdlcy4gKi9cclxuICBwZXJmU29ydEtleSA9ICcnO1xyXG4gIHBlcmZTb3J0RGlyOiAnYXNjJyB8ICdkZXNjJyA9ICdhc2MnO1xyXG5cclxuICAvKiogU29ydGFibGUgY29sdW1ucyBvZiBlYWNoIFBlcmZvcm1hbmNlIHRhYmxlLCBpbiBkaXNwbGF5IG9yZGVyIChBY3Rpb24gaXMgbm90IHNvcnRhYmxlKS4gKi9cclxuICByZWFkb25seSBhdWRpdFBlcmZDb2xzOiBQZXJmQ29sdW1uW10gPSBbXHJcbiAgICAvLyBObyBTY2hlZHVsZWQgY29sdW1uIChRQSA5IE9jdCkuXHJcbiAgICB7IGtleTogJ25hbWUnLCBsYWJlbDogJ0F1ZGl0IE5hbWUnIH0sIHsga2V5OiAnYXNzaWduZWQnLCBsYWJlbDogJ0Fzc2lnbmVkIFRvJyB9LCB7IGtleTogJ3N1Ym1pdHRlZCcsIGxhYmVsOiAnU3VibWl0dGVkJyB9LFxyXG4gICAgeyBrZXk6ICdkaXNwdXRlcycsIGxhYmVsOiAnRGlzcHV0ZXMnIH0sIHsga2V5OiAncGFzc01hcmsnLCBsYWJlbDogJ1Bhc3MgTWFyaycgfSxcclxuICAgIHsga2V5OiAnc2NvcmUnLCBsYWJlbDogJ1Njb3JlJyB9LCB7IGtleTogJ3Jlc3VsdCcsIGxhYmVsOiAnUmVzdWx0JyB9XHJcbiAgXTtcclxuICByZWFkb25seSB0YXNrUGVyZkNvbHM6IFBlcmZDb2x1bW5bXSA9IFtcclxuICAgIHsga2V5OiAnbmFtZScsIGxhYmVsOiAnVGFzayBOYW1lJyB9LCB7IGtleTogJ3NjaGVkdWxlZCcsIGxhYmVsOiAnU2NoZWR1bGVkJyB9LCB7IGtleTogJ2NvdmVyYWdlJywgbGFiZWw6ICdDb3ZlcmFnZScgfSxcclxuICAgIHsga2V5OiAnYXNzaWduZWQnLCBsYWJlbDogJ0Fzc2lnbmVkIFRvJyB9LCB7IGtleTogJ3N1Ym1pdHRlZCcsIGxhYmVsOiAnU3VibWl0dGVkJyB9LCB7IGtleTogJ2ZsYWdzJywgbGFiZWw6ICdGbGFncycgfSxcclxuICAgIHsga2V5OiAndGFza3MnLCBsYWJlbDogJ1Rhc2tzJyB9LCB7IGtleTogJ3JlZG8nLCBsYWJlbDogJ1JlRG8nIH0sIHsga2V5OiAnY29tcGxpYW5jZScsIGxhYmVsOiAnUXVlc3Rpb24gQ29tcGxpYW5jZSAlJyB9XHJcbiAgXTtcclxuICByZWFkb25seSBzdG9yZVBlcmZDb2xzOiBQZXJmQ29sdW1uW10gPSBbXHJcbiAgICB7IGtleTogJ3N0b3JlJywgbGFiZWw6ICdTdG9yZSBOYW1lJyB9LCB7IGtleTogJ3N0b3JlSWQnLCBsYWJlbDogJ1N0b3JlIElEJyB9LCB7IGtleTogJ3Nwb2MnLCBsYWJlbDogJ1N0b3JlIFNwb2MnIH0sXHJcbiAgICB7IGtleTogJ2Fzc2lnbmVkJywgbGFiZWw6ICdBc3NpZ25lZCcgfSxcclxuICAgIHsga2V5OiAnZmxhZ3MnLCBsYWJlbDogJ0ZsYWdzJyB9LCB7IGtleTogJ2NvbXBsZXRpb24nLCBsYWJlbDogJ0NvbXBsZXRpb24gJScgfSwgeyBrZXk6ICdjb21wbGlhbmNlJywgbGFiZWw6ICdDb21wbGlhbmNlICUnIH0sXHJcbiAgICB7IGtleTogJ3BlcmYnLCBsYWJlbDogJ1BlcmZvcm1hbmNlICUnIH1cclxuICBdO1xyXG4gIHJlYWRvbmx5IHVzZXJQZXJmQ29sczogUGVyZkNvbHVtbltdID0gW1xyXG4gICAgeyBrZXk6ICduYW1lJywgbGFiZWw6ICdVc2VyIE5hbWUnIH0sIHsga2V5OiAnZW1haWwnLCBsYWJlbDogJ0VtYWlsJyB9LCB7IGtleTogJ2Fzc2lnbmVkJywgbGFiZWw6ICdBc3NpZ25lZCcgfSxcclxuICAgIHsga2V5OiAnZmxhZ3MnLCBsYWJlbDogJ0ZsYWdzJyB9LCB7IGtleTogJ3JlZG8nLCBsYWJlbDogJ1JlRG8nIH0sIHsga2V5OiAnY29tcGxldGlvbicsIGxhYmVsOiAnQ29tcGxldGlvbiAlJyB9LFxyXG4gICAgeyBrZXk6ICdjb21wbGlhbmNlJywgbGFiZWw6ICdDb21wbGlhbmNlICUnIH0sIHsga2V5OiAncGVyZicsIGxhYmVsOiAnUGVyZm9ybWFuY2UgJScgfVxyXG4gIF07XHJcblxyXG4gIC8qKiBXaGF0IGVhY2ggc29ydGFibGUgY29sdW1uIHNvcnRzIG9uOiBudW1iZXJzIGZvciBjb3VudHMgYW5kIHBlcmNlbnRhZ2VzLCB0ZXh0IG90aGVyd2lzZTsgbnVsbCBzb3J0cyBsYXN0LiAqL1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYXVkaXRTb3J0VmFsdWU6IFJlY29yZDxzdHJpbmcsIChyOiBBdWRpdFBlcmZSb3cpID0+IFNvcnRWYWx1ZT4gPSB7XHJcbiAgICBuYW1lOiByID0+IHIubmFtZSwgYXNzaWduZWQ6IHIgPT4gci5hc3NpZ25lZCwgc3VibWl0dGVkOiByID0+IHIuc3VibWl0dGVkLFxyXG4gICAgZGlzcHV0ZXM6IHIgPT4gci5kaXNwdXRlcywgcGFzc01hcms6IHIgPT4gdGhpcy5udW0oU3RyaW5nKHIucGFzc01hcmspLnJlcGxhY2UoJyUnLCAnJykpLFxyXG4gICAgc2NvcmU6IHIgPT4gKHIuc2NvcmUgPT09ICfigJQnID8gbnVsbCA6IHIuc2NvcmVQY3QpLCByZXN1bHQ6IHIgPT4gKHIucmVzdWx0ID09PSAn4oCUJyA/IG51bGwgOiByLnJlc3VsdClcclxuICB9O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdGFza1NvcnRWYWx1ZTogUmVjb3JkPHN0cmluZywgKHI6IFRhc2tQZXJmUm93KSA9PiBTb3J0VmFsdWU+ID0ge1xyXG4gICAgbmFtZTogciA9PiByLm5hbWUsIHNjaGVkdWxlZDogciA9PiByLnNjaGVkdWxlZCwgY292ZXJhZ2U6IHIgPT4gci5jb3ZlcmFnZSwgYXNzaWduZWQ6IHIgPT4gci5hc3NpZ25lZCxcclxuICAgIHN1Ym1pdHRlZDogciA9PiByLnN1Ym1pdHRlZCwgZmxhZ3M6IHIgPT4gci5mbGFncywgdGFza3M6IHIgPT4gdGhpcy5udW0oci5yYXc/LnRhc2tzKSwgcmVkbzogciA9PiByLnJlZG8sXHJcbiAgICBjb21wbGlhbmNlOiByID0+IHRoaXMubnVtKHIucmF3Py5jb21wbGlhbmNlKVxyXG4gIH07XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzdG9yZVNvcnRWYWx1ZTogUmVjb3JkPHN0cmluZywgKHI6IFN0b3JlUGVyZlJvdykgPT4gU29ydFZhbHVlPiA9IHtcclxuICAgIHN0b3JlOiByID0+IHIuc3RvcmUsIHN0b3JlSWQ6IHIgPT4gci5zdG9yZUlkLCBzcG9jOiByID0+IHIuc3BvYywgYXNzaWduZWQ6IHIgPT4gci5hc3NpZ25lZCwgZmxhZ3M6IHIgPT4gci5mbGFncyxcclxuICAgIGNvbXBsZXRpb246IHIgPT4gdGhpcy5udW0oci5yYXc/LmNvbXBsZXRpb24pLCBjb21wbGlhbmNlOiByID0+IHRoaXMubnVtKHIucmF3Py5jb21wbGlhbmNlKSwgcGVyZjogciA9PiB0aGlzLm51bShyLnJhdz8ucGVyZm9ybWFuY2UpXHJcbiAgfTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHVzZXJTb3J0VmFsdWU6IFJlY29yZDxzdHJpbmcsIChyOiBVc2VyUGVyZlJvdykgPT4gU29ydFZhbHVlPiA9IHtcclxuICAgIG5hbWU6IHIgPT4gci5uYW1lLCBlbWFpbDogciA9PiByLmVtYWlsLCBhc3NpZ25lZDogciA9PiByLmFzc2lnbmVkLCBmbGFnczogciA9PiByLmZsYWdzLCByZWRvOiByID0+IHIucmVkbyxcclxuICAgIGNvbXBsZXRpb246IHIgPT4gdGhpcy5udW0oci5yYXc/LmNvbXBsZXRpb24pLCBjb21wbGlhbmNlOiByID0+IHRoaXMubnVtKHIucmF3Py5jb21wbGlhbmNlKSwgcGVyZjogciA9PiB0aGlzLm51bShyLnJhdz8ucGVyZm9ybWFuY2UpXHJcbiAgfTtcclxuXHJcbiAgYXVkaXRQZXJmOiBBdWRpdFBlcmZSb3dbXSA9IFtdO1xyXG4gIHN0b3JlUGVyZjogU3RvcmVQZXJmUm93W10gPSBbXTtcclxuICB1c2VyUGVyZjogVXNlclBlcmZSb3dbXSA9IFtdO1xyXG5cclxuICByb3dzOiBBdWRpdFJvd1tdID0gW107XHJcbiAgdHJlbmQ6IFRyZW5kQmFyW10gPSBbXTtcclxuXHJcbiAgLyoqIFN0YXJ0cyB0cnVlIHNvIHRoZSBmaXJzdCBwYWludCBzaGltbWVycyBpbnN0ZWFkIG9mIGZsYXNoaW5nIGVtcHR5IHRpbGVzIGFuZCB0YWJsZXMuICovXHJcbiAgbG9hZGluZyA9IHRydWU7XHJcblxyXG4gIHByaXZhdGUgaGVhZGVyRGF0YTogYW55O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXNlckVtYWlsZXM6IHN0cmluZ1tdID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlcnNFbWFpbC1pbmZvJykgfHwgJ1tdJyk7XHJcbiAgLyoqIENyZWF0ZSBBdWRpdCBzaG93cyBvbmx5IHdpdGggdGhlIENoZWNrbGlzdCBhZGQgcGVybWlzc2lvbi4gKi9cclxuICBhY2Nlc3M6IEF1ZGl0QWNjZXNzID0geyBjYW5BZGQ6IGZhbHNlLCBjYW5FZGl0OiBmYWxzZSB9O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgdHJheFNlcnZpY2U6IFRyYXhTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBnczogR2xvYmFsU3RhdGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdDogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuICApIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGF1ZGl0QWNjZXNzKHRoaXMuZ3MpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoYWNjZXNzID0+IHtcclxuICAgICAgdGhpcy5hY2Nlc3MgPSBhY2Nlc3M7XHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSwgZGVib3VuY2VUaW1lKDMwMCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICghZGF0YT8uY2xpZW50KSB7IHJldHVybjsgfVxyXG4gICAgICAgIGNvbnN0IGNsaWVudENoYW5nZWQgPSBkYXRhLmNsaWVudCAhPT0gdGhpcy5oZWFkZXJEYXRhPy5jbGllbnQ7XHJcbiAgICAgICAgdGhpcy5oZWFkZXJEYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLm9uSGVhZGVyU2NvcGUoY2xpZW50Q2hhbmdlZCk7XHJcbiAgICAgICAgLy8gQSBxdWFydGVyIHN0YXlzIHBpY2tlZCBhY3Jvc3MgaGVhZGVyIGNoYW5nZXMgKG5ldyBzdG9yZXMgLyBjbGllbnQpOyBCeSBkYXRlIGZvbGxvd3MgdGhlIGhlYWRlci5cclxuICAgICAgICBpZiAodGhpcy5ncmFpbiA9PT0gJ3F1YXJ0ZXInKSB7IHRoaXMuYXBwbHlRdWFydGVyKHRoaXMucXVhcnRlciwgdHJ1ZSk7IHJldHVybjsgfVxyXG4gICAgICAgIHRoaXMuZnJvbSA9IGRhdGEuZGF0ZT8uc3RhcnREYXRlIHx8ICcnO1xyXG4gICAgICAgIHRoaXMudG8gPSBkYXRhLmRhdGU/LmVuZERhdGUgfHwgJyc7XHJcbiAgICAgICAgdGhpcy5yYW5nZSA9IHRvUGlja2VyUmFuZ2UodGhpcy5mcm9tLCB0aGlzLnRvKTtcclxuICAgICAgICB0aGlzLnJlbG9hZFBlcmlvZCgpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhlYWRlciBjaGFuZ2UuIE5ldyBjbGllbnQ6IHRoZSBhdWRpdCB0eXBlIHN0YXJ0cyBvdmVyIGFuZCBpdHMgbGlzdCBpcyBmZXRjaGVkIGFnYWluLiBOZXcgY2xpZW50IG9yXHJcbiAgICogc3RvcmVzOiB0aGUgaGllcmFyY2h5IHBpY2tzIHN0YXJ0IG92ZXIgKHRoZSBuZXh0IGxvYWQgcmVmaWxscyB0aGUgbGlzdHMpLiBBIGRhdGUtb25seSBjaGFuZ2Uga2VlcHMgYm90aC5cclxuICAgKi9cclxuICBwcml2YXRlIG9uSGVhZGVyU2NvcGUoY2xpZW50Q2hhbmdlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgY29uc3Qga2V5ID0gdGhpcy5oZWFkZXJEYXRhLmNsaWVudCArICd8JyArIHRoaXMuaGVhZGVyU3RvcmVJZHMoKS5qb2luKCcsJyk7XHJcbiAgICBpZiAoa2V5ICE9PSB0aGlzLmhlYWRlclNjb3BlS2V5KSB7XHJcbiAgICAgIHRoaXMuaGVhZGVyU2NvcGVLZXkgPSBrZXk7XHJcbiAgICAgIHRoaXMuY2lyY2xlID0gdGhpcy56b25lID0gdGhpcy5hb20gPSB0aGlzLnN0b3JlID0gJyc7XHJcbiAgICAgIHRoaXMuYXBwbGllZCA9IHsgLi4udGhpcy5hcHBsaWVkLCBjaXJjbGU6ICcnLCB6b25lOiAnJywgYW9tOiAnJywgc3RvcmU6ICcnIH07XHJcbiAgICB9XHJcbiAgICBpZiAoY2xpZW50Q2hhbmdlZCkge1xyXG4gICAgICB0aGlzLmF1ZGl0VHlwZSA9ICdhbGwnO1xyXG4gICAgICB0aGlzLmFwcGxpZWQuYXVkaXRUeXBlID0gJ2FsbCc7XHJcbiAgICAgIHRoaXMuYXVkaXRUeXBlcyA9IFtBTExfQVVESVRTXTtcclxuICAgICAgdGhpcy5sb2FkQXVkaXRUeXBlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBjbGllbnQncyBhdWRpdHMgZm9yIHRoZSBBdWRpdCB0eXBlIGZpbHRlciwgbmV3ZXN0IGZpcnN0IGFzIHRoZSBNYW5hZ2UgbGlzdC4gKi9cclxuICBwcml2YXRlIGxvYWRBdWRpdFR5cGVzKCk6IHZvaWQge1xyXG4gICAgY29uc3QgY2xpZW50SWQgPSB0aGlzLmhlYWRlckRhdGE/LmNsaWVudDtcclxuICAgIGlmICghY2xpZW50SWQgfHwgY2xpZW50SWQgPT09IHRoaXMuYXVkaXRUeXBlc0NsaWVudCkgeyByZXR1cm47IH1cclxuICAgIHRoaXMuYXVkaXRUeXBlc0NsaWVudCA9IGNsaWVudElkO1xyXG4gICAgdGhpcy50cmF4U2VydmljZS5hdWRpdExpc3Qoe1xyXG4gICAgICBjbGllbnRJZCwgZnJvbURhdGU6IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uc3RhcnREYXRlLCB0b0RhdGU6IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uZW5kRGF0ZSxcclxuICAgICAgbGltaXQ6IDUwMCwgb2Zmc2V0OiAxLCBzZWFyY2g6ICcnXHJcbiAgICB9KS5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlcz8uY29kZSAhPT0gMjAwKSB7IHRoaXMuYXVkaXRUeXBlc0NsaWVudCA9ICcnOyByZXR1cm47IH1cclxuICAgICAgY29uc3QgbGlzdDogYW55W10gPSByZXMuZGF0YT8ucmVzdWx0IHx8IFtdO1xyXG4gICAgICB0aGlzLmF1ZGl0VHlwZXMgPSBbQUxMX0FVRElUU10uY29uY2F0KGxpc3QubWFwKGEgPT4gKHtcclxuICAgICAgICBrZXk6IFN0cmluZyhhLl9pZCksXHJcbiAgICAgICAgbGFiZWw6IGEuY2hlY2tMaXN0TmFtZSB8fCAnVW50aXRsZWQgYXVkaXQnLFxyXG4gICAgICAgIGhlbHA6IChhLnB1Ymxpc2ggPyAnUHVibGlzaGVkJyA6ICdEcmFmdCcpICsgJyDCtyBwYXNzIG1hcmsgJyArICh0aGlzLm51bShhLnBhc3NNYXJrKSA/PyBQQVNTX01BUkspICsgJyUnXHJcbiAgICAgIH0pKSk7XHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogQnkgZGF0ZTogb25lIG1vbnRoIGF0IG1vc3QgKHRoZSBwaWNrZXJzJyBkYXRlTGltaXQsIGluIGRheXMgYWZ0ZXIgdGhlIHN0YXJ0OyAzMCA9IHVwIHRvIDMxIGRheXMpLiAqL1xyXG4gIHJlYWRvbmx5IG1heFJhbmdlRGF5cyA9IDMwO1xyXG5cclxuICAvKiogUmFuZ2UgcGlja2VyOiBhIG5ldyBwZXJpb2QgcmVsb2FkcyBldmVyeSBmZWVkLCBleGNlcHQgaW5zaWRlIHRoZSBmaWx0ZXIgZHJhd2VyLCB3aGVyZSBBcHBseSBkb2VzLiAqL1xyXG4gIG9uUmFuZ2VQaWNrZWQoZTogUGlja2VkRGF0ZXMgfCBudWxsKTogdm9pZCB7XHJcbiAgICBjb25zdCBwaWNrZWQgPSBmcm9tUGlja2VyUmFuZ2UoZSk7XHJcbiAgICBpZiAoIXBpY2tlZCB8fCAocGlja2VkLmZyb20gPT09IHRoaXMuZnJvbSAmJiBwaWNrZWQudG8gPT09IHRoaXMudG8pKSB7IHJldHVybjsgfVxyXG4gICAgLy8gQSBsb25nZXIgcmFuZ2UgKHR5cGVkLCBvciBhIHByZXNldCkgaXMgY3V0IGJhY2sgdG8gYSBtb250aCBmcm9tIGl0cyBzdGFydC5cclxuICAgIGlmIChkYXlqcyhwaWNrZWQudG8pLmRpZmYoZGF5anMocGlja2VkLmZyb20pLCAnZGF5JykgPiB0aGlzLm1heFJhbmdlRGF5cykge1xyXG4gICAgICBwaWNrZWQudG8gPSBkYXlqcyhwaWNrZWQuZnJvbSkuYWRkKHRoaXMubWF4UmFuZ2VEYXlzLCAnZGF5JykuZm9ybWF0KCdZWVlZLU1NLUREJyk7XHJcbiAgICAgIHRoaXMucmFuZ2UgPSB0b1BpY2tlclJhbmdlKHBpY2tlZC5mcm9tLCBwaWNrZWQudG8pO1xyXG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ1BpY2sgdXAgdG8gb25lIG1vbnRoIOKAlCB0aGUgcmFuZ2UgZW5kcyBvbiAnICsgZGF5anMocGlja2VkLnRvKS5mb3JtYXQoJ0REIE1NTSBZWVlZJykpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5mcm9tID0gcGlja2VkLmZyb207XHJcbiAgICB0aGlzLnRvID0gcGlja2VkLnRvO1xyXG4gICAgaWYgKCF0aGlzLmZpbHRlcnNPcGVuKSB7IHRoaXMucmVsb2FkUGVyaW9kKCk7IH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVsb2FkUGVyaW9kKCk6IHZvaWQge1xyXG4gICAgdGhpcy5wZXJmUGVyaW9kID0gJ0Jhc2VkIG9uICcgKyB0aGlzLmZtdCh0aGlzLmZyb20pICsgJyAtICcgKyB0aGlzLmZtdCh0aGlzLnRvKTtcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgICB0aGlzLmxvYWQoKTtcclxuICAgIC8vIFRhc2sgZmlndXJlcyBmb2xsb3cgdGhlIHNhbWUgc2NvcGU7IGZldGNoZWQgbm93IGluIFRhc2sgbW9kZSwgZWxzZSB3aGVuIHRoZSB0YWIgb3BlbnMuXHJcbiAgICB0aGlzLnRhc2tzU3RhbGUgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMuaXNUYXNrTW9kdWxlKSB7IHRoaXMubG9hZFRhc2tzKCk7IH1cclxuICAgIGlmICh0aGlzLmdyYWluID09PSAncXVhcnRlcicpIHsgdGhpcy5sb2FkUXVhcnRlclRyZW5kKCk7IH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBmb3VyIHF1YXJ0ZXIgYmFyczogb25lIGNhbGwgb3ZlciB0aGUgZm91ciBxdWFydGVycyAobW9yZSB0aGFuIDEyMCBkYXlzLCBzbyB0aGUgQVBJIGJ1Y2tldHMgdGhlXHJcbiAgICogdHJlbmQgYnkgbW9udGgpIHJvbGxlZCB1cCBwZXIgcXVhcnRlciwgd2VpZ2h0ZWQgYnkgZWFjaCBtb250aCdzIGF1ZGl0IGNvdW50LiBGZXRjaGVkIGFnYWluIG9ubHlcclxuICAgKiB3aGVuIHRoZSBjbGllbnQgb3Igc3RvcmVzIGNoYW5nZS5cclxuICAgKi9cclxuICBwcml2YXRlIGxvYWRRdWFydGVyVHJlbmQoKTogdm9pZCB7XHJcbiAgICBjb25zdCBzY29wZSA9IHRoaXMuYmFzZVBheWxvYWQoKTtcclxuICAgIGNvbnN0IGtleSA9IHNjb3BlWydjbGllbnRJZCddICsgJ3wnICsgKHNjb3BlWydzdG9yZUlkJ10gfHwgW10pLmpvaW4oJywnKSArICd8JyArIChzY29wZVsnY2hlY2tsaXN0SWQnXSB8fCAnJyk7XHJcbiAgICBpZiAoa2V5ID09PSB0aGlzLnF1YXJ0ZXJUcmVuZFNjb3BlKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5xdWFydGVyVHJlbmRTY29wZSA9IGtleTtcclxuICAgIHRoaXMucXVhcnRlclRyZW5kTG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0RGFzaGJvYXJkKHtcclxuICAgICAgY2xpZW50SWQ6IHNjb3BlWydjbGllbnRJZCddLCBmcm9tRGF0ZTogdGhpcy5maXNjYWxbMF0uZnJvbSwgdG9EYXRlOiB0aGlzLnRvZGF5LmZvcm1hdCgnWVlZWS1NTS1ERCcpLCBzdG9yZUlkOiBzY29wZVsnc3RvcmVJZCddLFxyXG4gICAgICAuLi50aGlzLmF1ZGl0RmlsdGVyKClcclxuICAgIH0pLnBpcGUoY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsKSksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBvayA9IHJlcz8uY29kZSA9PT0gMjAwO1xyXG4gICAgICBpZiAoIW9rKSB7IHRoaXMucXVhcnRlclRyZW5kU2NvcGUgPSAnJzsgfVxyXG4gICAgICBjb25zdCBidWNrZXRzOiBhbnlbXSA9IG9rID8gcmVzLmRhdGE/LnRyZW5kIHx8IFtdIDogW107XHJcbiAgICAgIHRoaXMucXVhcnRlclRyZW5kID0gdGhpcy5maXNjYWwubWFwKHEgPT4ge1xyXG4gICAgICAgIGNvbnN0IGluUXVhcnRlciA9IGJ1Y2tldHMuZmlsdGVyKGIgPT4gU3RyaW5nKGIua2V5KSA+PSBxLmZyb20gJiYgU3RyaW5nKGIua2V5KSA8PSBxLnRvICYmIGIudmFsdWUgIT09IG51bGwgJiYgYi52YWx1ZSAhPT0gdW5kZWZpbmVkKTtcclxuICAgICAgICBjb25zdCBjb3VudCA9IGluUXVhcnRlci5yZWR1Y2UoKG4sIGIpID0+IG4gKyAoTnVtYmVyKGIuY291bnQpIHx8IDApLCAwKTtcclxuICAgICAgICBjb25zdCB0b3RhbCA9IGluUXVhcnRlci5yZWR1Y2UoKG4sIGIpID0+IG4gKyBOdW1iZXIoYi52YWx1ZSkgKiAoTnVtYmVyKGIuY291bnQpIHx8IDApLCAwKTtcclxuICAgICAgICBjb25zdCBzdWJtaXR0ZWQgPSBidWNrZXRzLmZpbHRlcihiID0+IFN0cmluZyhiLmtleSkgPj0gcS5mcm9tICYmIFN0cmluZyhiLmtleSkgPD0gcS50bylcclxuICAgICAgICAgIC5yZWR1Y2UoKG4sIGIpID0+IG4gKyAoTnVtYmVyKGIuc3VibWl0dGVkID8/IGIuY291bnQpIHx8IDApLCAwKTtcclxuICAgICAgICByZXR1cm4geyBrZXk6IHEua2V5LCBsYWJlbDogcS5rZXksIHZhbHVlOiBjb3VudCA/IE1hdGgucm91bmQodG90YWwgLyBjb3VudCkgOiBudWxsLCBjb3VudCwgc3VibWl0dGVkIH07XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnF1YXJ0ZXJUcmVuZExvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBNYWtlIGEgcXVhcnRlciB0aGUgcGVyaW9kICh1cCB0byB0b2RheSBmb3IgdGhlIGN1cnJlbnQgb25lKTsgcmVsb2FkcyB1bmxlc3MgdGhlIGZpbHRlciBkcmF3ZXIgaXMgb3Blbi4gKi9cclxuICBwcml2YXRlIGFwcGx5UXVhcnRlcihrZXk6IHN0cmluZywgZm9yY2UgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgY29uc3QgcSA9IHRoaXMuZmlzY2FsLmZpbmQoeCA9PiB4LmtleSA9PT0ga2V5KSB8fCB0aGlzLmZpc2NhbFt0aGlzLmZpc2NhbC5sZW5ndGggLSAxXTtcclxuICAgIGNvbnN0IHRvZGF5ID0gdGhpcy50b2RheS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcclxuICAgIGNvbnN0IHRvID0gcS50byA+IHRvZGF5ID8gdG9kYXkgOiBxLnRvO1xyXG4gICAgaWYgKCFmb3JjZSAmJiBxLmtleSA9PT0gdGhpcy5xdWFydGVyICYmIHRoaXMuZnJvbSA9PT0gcS5mcm9tICYmIHRoaXMudG8gPT09IHRvKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5xdWFydGVyID0gcS5rZXk7XHJcbiAgICB0aGlzLmZyb20gPSBxLmZyb207XHJcbiAgICB0aGlzLnRvID0gdG87XHJcbiAgICB0aGlzLnJhbmdlID0gdG9QaWNrZXJSYW5nZSh0aGlzLmZyb20sIHRoaXMudG8pO1xyXG4gICAgaWYgKCF0aGlzLmZpbHRlcnNPcGVuKSB7IHRoaXMucmVsb2FkUGVyaW9kKCk7IH1cclxuICB9XHJcblxyXG4gIC8qKiBRdWFydGVybHk6IGEgYmFyIChvciBhIHF1YXJ0ZXIgaW4gdGhlIGZpbHRlciBkcmF3ZXIpIHBpY2tzIHRoYXQgcXVhcnRlci4gKi9cclxuICBzZWxlY3RRdWFydGVyKGtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5ncmFpbiAhPT0gJ3F1YXJ0ZXInKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5hcHBseVF1YXJ0ZXIoa2V5KTtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgdHJlbmQgY2FyZCB3YWl0cyBmb3IgdGhlIHBhZ2UgZmVlZHMsIGFuZCBpbiBRdWFydGVybHkgYWxzbyBmb3IgdGhlIHF1YXJ0ZXIgYmFycy4gKi9cclxuICBnZXQgdHJlbmRMb2FkaW5nKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMubG9hZGluZyB8fCAodGhpcy5ncmFpbiA9PT0gJ3F1YXJ0ZXInICYmIHRoaXMucXVhcnRlclRyZW5kTG9hZGluZyk7XHJcbiAgfVxyXG5cclxuICAvKiogQmFycyB0aGUgdHJlbmQgY2hhcnQgZHJhd3M6IHRoZSBmb3VyIHF1YXJ0ZXJzLCBvciB0aGUgQVBJJ3MgYnktZGF0ZSBidWNrZXRzLiAqL1xyXG4gIGdldCB0cmVuZEJhcnMoKTogVHJlbmRCYXJbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmFpbiA9PT0gJ3F1YXJ0ZXInID8gdGhpcy5xdWFydGVyVHJlbmQgOiB0aGlzLnRyZW5kO1xyXG4gIH1cclxuXHJcbiAgLyoqIE1vcmUgYmFycyB0aGFuIGZpdCB0aGVpciBsYWJlbHMgKGEgbW9udGggYnkgZGF0ZSk6IHNlZSBzaG93WExhYmVsLiAqL1xyXG4gIGdldCBkZW5zZVRyZW5kKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMudHJlbmRCYXJzLmxlbmd0aCA+IDEyO1xyXG4gIH1cclxuXHJcbiAgLyoqIERlbnNlIGNoYXJ0OiBhIGxhYmVsIG9uIGV2ZXJ5IGZldyBiYXJzIChhYm91dCA4IGFjcm9zcyksIGFsd2F5cyBvbiB0aGUgZmlyc3QgYW5kIGxhc3Q7IG90aGVyd2lzZSBldmVyeSBiYXIuICovXHJcbiAgc2hvd1hMYWJlbChpOiBudW1iZXIsIGxhc3Q6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIGNvbnN0IG4gPSB0aGlzLnRyZW5kQmFycy5sZW5ndGg7XHJcbiAgICBpZiAobiA8PSAxMikgeyByZXR1cm4gdHJ1ZTsgfVxyXG4gICAgY29uc3Qgc3RlcCA9IE1hdGguY2VpbChuIC8gOCk7XHJcbiAgICAvLyBUaGUgbGFzdCBsYWJlbCBhbHdheXMgc2hvd3M7IHRoZSByZWd1bGFyIG9uZSBqdXN0IGJlZm9yZSBpdCBpcyBza2lwcGVkIHdoZW4gdGhlIHR3byB3b3VsZCB0b3VjaC5cclxuICAgIHJldHVybiBsYXN0IHx8IChpICUgc3RlcCA9PT0gMCAmJiBuIC0gMSAtIGkgPj0gc3RlcCAtIDEpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFwiT2N0IOKAkyBEZWMgMjAyNlwiIGZvciBhIHF1YXJ0ZXIga2V5LiAqL1xyXG4gIHF1YXJ0ZXJNb250aHMoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlzY2FsLmZpbmQocSA9PiBxLmtleSA9PT0ga2V5KT8ubW9udGhzIHx8ICcnO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIC8qKiBTdG9yZXMgdGlja2VkIGluIHRoZSBnbG9iYWwgaGVhZGVyLiAqL1xyXG4gIHByaXZhdGUgaGVhZGVyU3RvcmVJZHMoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuICh0aGlzLmhlYWRlckRhdGE/LnN0b3JlcyB8fCBbXSkuZmlsdGVyKChzOiBhbnkpID0+IHMuY2hlY2tlZCkubWFwKChzOiBhbnkpID0+IHMuc3RvcmVJZCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBoaWVyYXJjaHlBcHBsaWVkKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgYSA9IHRoaXMuYXBwbGllZDtcclxuICAgIHJldHVybiAhIShhLmNpcmNsZSB8fCBhLnpvbmUgfHwgYS5hb20gfHwgYS5zdG9yZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hdGNoZXNTY29wZShyOiBBdWRpdFJvdywgcGljazogU2NvcGVQaWNrKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKCFwaWNrLmNpcmNsZSB8fCByLmNpcmNsZSA9PT0gcGljay5jaXJjbGUpICYmICghcGljay56b25lIHx8IHIuem9uZSA9PT0gcGljay56b25lKVxyXG4gICAgICAmJiAoIXBpY2suYW9tIHx8IHIuYW9tID09PSBwaWNrLmFvbSkgJiYgKCFwaWNrLnN0b3JlIHx8IFN0cmluZyhyLnJhdz8uc3RvcmVJZCkgPT09IHBpY2suc3RvcmUpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBzdG9yZXMgZXZlcnkgZmVlZCByZWFkczogdGhlIGhlYWRlcidzLCBuYXJyb3dlZCB0byB0aGUgYXBwbGllZCBoaWVyYXJjaHkgcGljay4gKi9cclxuICBwcml2YXRlIHNjb3BlZFN0b3JlSWRzKCk6IHN0cmluZ1tdIHtcclxuICAgIGlmICghdGhpcy5oaWVyYXJjaHlBcHBsaWVkKSB7IHJldHVybiB0aGlzLmhlYWRlclN0b3JlSWRzKCk7IH1cclxuICAgIHJldHVybiB0aGlzLnNjb3BlUm93cy5maWx0ZXIociA9PiB0aGlzLm1hdGNoZXNTY29wZShyLCB0aGlzLmFwcGxpZWQpKS5tYXAociA9PiBTdHJpbmcoci5yYXc/LnN0b3JlSWQgfHwgJycpKS5maWx0ZXIoQm9vbGVhbik7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIGFwcGxpZWQgQXVkaXQgdHlwZSBhcyB0aGUgQVBJcyB0YWtlIGl0IChub3RoaW5nIGZvciBBbGwgQXVkaXRzKS4gKi9cclxuICBwcml2YXRlIGF1ZGl0RmlsdGVyKCk6IHsgY2hlY2tsaXN0SWQ/OiBzdHJpbmcgfSB7XHJcbiAgICByZXR1cm4gdGhpcy5hcHBsaWVkLmF1ZGl0VHlwZSAhPT0gJ2FsbCcgPyB7IGNoZWNrbGlzdElkOiB0aGlzLmFwcGxpZWQuYXVkaXRUeXBlIH0gOiB7fTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmFzZVBheWxvYWQoZXh0cmE6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZnJvbURhdGU6IHRoaXMuZnJvbSB8fCB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LnN0YXJ0RGF0ZSxcclxuICAgICAgdG9EYXRlOiB0aGlzLnRvIHx8IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uZW5kRGF0ZSxcclxuICAgICAgc3RvcmVJZDogdGhpcy5zY29wZWRTdG9yZUlkcygpLFxyXG4gICAgICAuLi50aGlzLmF1ZGl0RmlsdGVyKCksXHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmhlYWRlckRhdGE/LmNsaWVudCxcclxuICAgICAgdXNlckVtYWlsZXM6IHRoaXMudXNlckVtYWlsZXMsXHJcbiAgICAgIGxpbWl0OiAxMDAwLFxyXG4gICAgICBvZmZzZXQ6IDAsXHJcbiAgICAgIHNvcnRCeTogJycsXHJcbiAgICAgIHNvcnRDb2x1bW5OYW1lOiAnJyxcclxuICAgICAgc2VhcmNoVmFsdWU6ICcnLFxyXG4gICAgICBleHBvcnQ6IGZhbHNlLFxyXG4gICAgICAuLi5leHRyYVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgZm91ciBmZWVkcyBsb2FkIHRvZ2V0aGVyOyBhIGZhaWx1cmUgaW4gb25lIGxlYXZlcyB0aGUgb3RoZXJzIGludGFjdC4gKi9cclxuICBwcml2YXRlIGxvYWQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgY29uc3Qgc2FmZSA9IChvOiBhbnkpID0+IG8ucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKG51bGwpKSk7XHJcbiAgICBjb25zdCBzY29wZSA9IHRoaXMuYmFzZVBheWxvYWQoKTtcclxuICAgIC8vIFJvd3MgZmV0Y2hlZCBmb3IgdGhlIHdob2xlIGhlYWRlciBzY29wZSByZWZpbGwgdGhlIGhpZXJhcmNoeSBsaXN0czsgbmFycm93ZWQgb25lcyBkbyBub3QuXHJcbiAgICBjb25zdCBuYXJyb3dlZCA9IHRoaXMuaGllcmFyY2h5QXBwbGllZDtcclxuICAgIGZvcmtKb2luKHtcclxuICAgICAgLy8gVGhlIGF1ZGl0IGRhc2hib2FyZCBBUEkgcmVqZWN0cyB1bmtub3duIGtleXMsIHNvIG9ubHkgdGhlIHNjb3BlIGlzIHNlbnQuXHJcbiAgICAgIGRhc2g6IHNhZmUodGhpcy50cmF4U2VydmljZS5hdWRpdERhc2hib2FyZCh7XHJcbiAgICAgICAgY2xpZW50SWQ6IHNjb3BlWydjbGllbnRJZCddLCBmcm9tRGF0ZTogc2NvcGVbJ2Zyb21EYXRlJ10sIHRvRGF0ZTogc2NvcGVbJ3RvRGF0ZSddLCBzdG9yZUlkOiBzY29wZVsnc3RvcmVJZCddLFxyXG4gICAgICAgIC4uLnRoaXMuYXVkaXRGaWx0ZXIoKVxyXG4gICAgICB9KSksXHJcbiAgICAgIC8vIFNhbWUgdGFibGVzIGFzIHRoZSBjaGVja2xpc3QgZGFzaGJvYXJkLCBsaW1pdGVkIHNlcnZlci1zaWRlIHRvIHRoaXMgY2xpZW50J3MgYXVkaXRzLlxyXG4gICAgICBhdWRpdHM6IHNhZmUodGhpcy50cmF4U2VydmljZS5hdWRpdENoZWNrbGlzdFBlcmZvcm1hbmNlKHRoaXMuYmFzZVBheWxvYWQoeyBsaW1pdDogMjAwIH0pKSksXHJcbiAgICAgIHN0b3Jlczogc2FmZSh0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0U3RvcmVQZXJmb3JtYW5jZSh0aGlzLmJhc2VQYXlsb2FkKHsgbGltaXQ6IDEwMDAgfSkpKSxcclxuICAgICAgdXNlcnM6IHNhZmUodGhpcy50cmF4U2VydmljZS5hdWRpdFVzZXJQZXJmb3JtYW5jZSh0aGlzLmJhc2VQYXlsb2FkKHsgbGltaXQ6IDUwMCB9KSkpXHJcbiAgICB9KS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCh7IGRhc2gsIGF1ZGl0cywgc3RvcmVzLCB1c2VycyB9OiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgZGF0YSA9IGRhc2g/LmNvZGUgPT09IDIwMCA/IChkYXNoLmRhdGEgfHwge30pIDoge307XHJcbiAgICAgIGNvbnN0IGF1ZGl0TGlzdCA9IGF1ZGl0cz8uY29kZSA9PT0gMjAwID8gKGF1ZGl0cy5kYXRhPy5jaGVja2xpc3RQZXJmb3JtYW5jZSB8fCBbXSkgOiBbXTtcclxuICAgICAgY29uc3Qgc3RvcmVMaXN0ID0gc3RvcmVzPy5jb2RlID09PSAyMDAgPyAoc3RvcmVzLmRhdGE/LnN0b3JlUGVyZm9ybWFuY2UgfHwgW10pIDogW107XHJcbiAgICAgIGNvbnN0IHVzZXJMaXN0ID0gdXNlcnM/LmNvZGUgPT09IDIwMCA/ICh1c2Vycy5kYXRhPy51c2VyUGVyZm9ybWFuY2UgfHwgW10pIDogW107XHJcblxyXG4gICAgICB0aGlzLnBhc3NNYXJrID0gTnVtYmVyKGRhdGEuc3VtbWFyeT8ucGFzc01hcmspIHx8IFBBU1NfTUFSSztcclxuICAgICAgdGhpcy5jcml0aWNhbE1hcmsgPSBOdW1iZXIoZGF0YS5zdW1tYXJ5Py5jcml0aWNhbE1hcmspIHx8IENSSVRJQ0FMX01BUks7XHJcbiAgICAgIHRoaXMucm93cyA9IChkYXRhLnN0b3JlcyB8fCBbXSkubWFwKChzOiBhbnkpID0+IHRoaXMudG9BdWRpdFJvdyhzKSk7XHJcbiAgICAgIGlmICghbmFycm93ZWQgJiYgZGFzaD8uY29kZSA9PT0gMjAwKSB7IHRoaXMuc2NvcGVSb3dzID0gdGhpcy5yb3dzOyB9XHJcbiAgICAgIHRoaXMuc3RvcmVQZXJmID0gc3RvcmVMaXN0Lm1hcCgocjogYW55KSA9PiB0aGlzLnRvU3RvcmVQZXJmKHIpKTtcclxuICAgICAgdGhpcy50cmVuZCA9IChkYXRhLnRyZW5kIHx8IFtdKS5tYXAoKGI6IGFueSkgPT4gKHtcclxuICAgICAgICBrZXk6IFN0cmluZyhiLmtleSksIGxhYmVsOiBTdHJpbmcoYi5sYWJlbCksXHJcbiAgICAgICAgdmFsdWU6IGIudmFsdWUgPT09IG51bGwgfHwgYi52YWx1ZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IE51bWJlcihiLnZhbHVlKSxcclxuICAgICAgICBjb3VudDogTnVtYmVyKGIuY291bnQpIHx8IDAsXHJcbiAgICAgICAgLy8gT2xkZXIgQVBJIGJ1aWxkcyBzZW5kIG9ubHkgY291bnQgKGV2ZXJ5IGF1ZGl0IHdhcyBzY29yZWQgdGhlbikuXHJcbiAgICAgICAgc3VibWl0dGVkOiBOdW1iZXIoYi5zdWJtaXR0ZWQgPz8gYi5jb3VudCkgfHwgMFxyXG4gICAgICB9KSk7XHJcbiAgICAgIHRoaXMuYXVkaXRQZXJmID0gYXVkaXRMaXN0Lm1hcCgocjogYW55KSA9PiB0aGlzLnRvQXVkaXRQZXJmKHIpKTtcclxuICAgICAgdGhpcy51c2VyUGVyZiA9IHVzZXJMaXN0Lm1hcCgocjogYW55KSA9PiB0aGlzLnRvVXNlclBlcmYocikpO1xyXG4gICAgICB0aGlzLnBlcmZQYWdlID0gMTtcclxuICAgICAgdGhpcy5sYXN0UmVmcmVzaGVkID0gZGF5anMoKS5mb3JtYXQoJ2hoOm1tOnNzIEEnKTtcclxuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPbmUgc3RvcmUgZnJvbSB0aGUgYXVkaXQgZGFzaGJvYXJkIEFQSTogc2NvcmUgaXMgdGhlIG1lYW4gb2YgaXRzIGNvbXBsaWFuY2Utc2NvcmVkIGF1ZGl0cyBpbiB0aGUgcGVyaW9kLFxyXG4gICAqIG51bGwgd2hlbiBub25lLiBBIHN0b3JlIHdpdGggc3VibWl0dGVkIGF1ZGl0cyBidXQgbm8gc2NvcmUgaXMgJ3Vuc2NvcmVkJyAoaXRzIGF1ZGl0cyBoYXZlIG5vIHF1ZXN0aW9uIHdpdGhcclxuICAgKiBjb21wbGlhbmNlIHNjb3Jpbmcgb24pLCBub3QgXCJOb3QgYXVkaXRlZFwiLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgdG9BdWRpdFJvdyhzOiBhbnkpOiBBdWRpdFJvdyB7XHJcbiAgICBjb25zdCBzY29yZSA9IHRoaXMubnVtKHM/LnNjb3JlKTtcclxuICAgIGxldCBzdGF0dXM6IFN0b3JlU3RhdHVzO1xyXG4gICAgaWYgKHNjb3JlICE9PSBudWxsKSB7XHJcbiAgICAgIHN0YXR1cyA9IHNjb3JlID49IHRoaXMucGFzc01hcmsgPyAncGFzcycgOiAnZmFpbCc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzdGF0dXMgPSBzPy5zdGF0dXMgPT09ICd1bnNjb3JlZCcgfHwgKHRoaXMubnVtKHM/LmF1ZGl0cykgPz8gMCkgPiAwID8gJ3Vuc2NvcmVkJyA6ICduYSc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBkYXRlOiBzPy5sYXN0QXVkaXREYXRlID8gdGhpcy5mbXQocy5sYXN0QXVkaXREYXRlKSA6ICfigJQnLFxyXG4gICAgICAvLyBUaGUgc3RvcmUncyBuYW1lIChoaWVyYXJjaHksIGl0cyBzdWJtaXNzaW9ucywgb3IgdGhlIHN0b3JlcyBsaXN0KTsgXCLigJRcIiB3aGVuIGl0IGhhcyBub25lLCBuZXZlciB0aGUgaWQuXHJcbiAgICAgIHN0b3JlSWQ6IHM/LnN0b3JlTmFtZSB8fCAn4oCUJyxcclxuICAgICAgY2lyY2xlOiBzPy5jaXJjbGUgfHwgJ+KAlCcsXHJcbiAgICAgIHpvbmU6IHM/LnpvbmUgfHwgJ+KAlCcsXHJcbiAgICAgIGFvbTogcz8uYW9tIHx8ICfigJQnLFxyXG4gICAgICBzY29yZTogc2NvcmUgPT09IG51bGwgPyBudWxsIDogTWF0aC5yb3VuZChzY29yZSksXHJcbiAgICAgIHN0YXR1cyxcclxuICAgICAgcmF3OiBzXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT25lIHN0b3JlIGZyb20gL2F1ZGl0L2Rhc2hib2FyZC9zdG9yZVBlcmZvcm1hbmNlIChhdWRpdCBjb3B5IG9mIHRoZSBjaGVja2xpc3QgZGFzaGJvYXJkJ3MgdGFibGUpOiBldmVyeSBhdWRpdFxyXG4gICAqIHZpc2l0IGluIHRoZSBwZXJpb2QsIHNvIGNvbXBsZXRpb24gPSBzdWJtaXR0ZWQgLyBhc3NpZ25lZCBhbmQgZmxhZ3MgY291bnQsIHVubGlrZSB0aGUgc2NvcmUtb25seSBzdG9yZSBsaXN0LlxyXG4gICAqL1xyXG4gIHByaXZhdGUgdG9TdG9yZVBlcmYocjogYW55KTogU3RvcmVQZXJmUm93IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHN0b3JlSWQ6IHI/LnN0b3JlX2lkIHx8ICcnLFxyXG4gICAgICBzdG9yZTogcj8uc3RvcmVOYW1lIHx8ICfigJQnLFxyXG4gICAgICBzcG9jOiByPy51c2VyRW1haWwgfHwgJ+KAlCcsXHJcbiAgICAgIGFzc2lnbmVkOiB0aGlzLm51bShyPy5jaGVja0xpc3RDb3VudCkgPz8gMCxcclxuICAgICAgZmxhZ3M6IHRoaXMubnVtKHI/LmZsYWdnZWRDb3VudCksXHJcbiAgICAgIGNvbXBsZXRpb246IHRoaXMucGN0VGV4dChyPy5jb21wbGV0aW9uKSxcclxuICAgICAgY29tcGxpYW5jZTogdGhpcy5wY3RUZXh0KHI/LmNvbXBsaWFuY2UpLFxyXG4gICAgICBwZXJmOiB0aGlzLnBjdFRleHQocj8ucGVyZm9ybWFuY2UpLFxyXG4gICAgICByYXc6IHJcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBCYXIgZmlsbCBmb3IgYSBwZXJjZW50YWdlIChudW1iZXIsIG9yIHRleHQgbGlrZSBcIjUxJVwiIC8gXCItMjUlXCIpOiBrZXB0IHRvIDAtMTAwLiBBIG5lZ2F0aXZlIHNjb3JlIChvcHRpb25cclxuICAgKiBzY29yZXMgY2FuIGJlIG5lZ2F0aXZlIHBlbmFsdGllcykgd291bGQgb3RoZXJ3aXNlIHNldCBhbiBpbnZhbGlkIG5lZ2F0aXZlIHdpZHRoLCB3aGljaCB0aGUgYnJvd3NlciBkcm9wcyxcclxuICAgKiBkcmF3aW5nIHRoZSBiYXIgZnVsbDsgaXQgaXMgZW1wdHkgaW5zdGVhZCwgd2hpbGUgdGhlIG51bWJlciBiZXNpZGUgaXQgc3RpbGwgc2hvd3MgdGhlIHJlYWwgc2NvcmUuXHJcbiAgICovXHJcbiAgYmFyV2lkdGgodmFsdWU6IG51bWJlciB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbiA9IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgPyB2YWx1ZSA6IHBhcnNlRmxvYXQoU3RyaW5nKHZhbHVlID8/ICcnKS5yZXBsYWNlKCclJywgJycpKTtcclxuICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUobikgPyBNYXRoLm1heCgwLCBNYXRoLm1pbigxMDAsIG4pKSArICclJyA6ICcwJSc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRvQXVkaXRQZXJmKHI6IGFueSk6IEF1ZGl0UGVyZlJvdyB7XHJcbiAgICBjb25zdCBuYW1lID0gcj8uY2hlY2tMaXN0TmFtZSB8fCAn4oCUJztcclxuICAgIC8vIE5vIHF1ZXN0aW9uIG9mIHRoZSBhdWRpdCBoYXMgY29tcGxpYW5jZSBzY29yaW5nIG9uOiBubyBzY29yZSBhbmQgbm8gcmVzdWx0ICh0aGUgQVBJIHNlbmRzIG51bGwpLlxyXG4gICAgY29uc3Qgc2NvcmUgPSByPy5jb21wbGlhbmNlRW5hYmxlZCA9PT0gZmFsc2UgPyBudWxsIDogdGhpcy5udW0ocj8ucXVlc3Rpb25Db21wbGlhbmNlKTtcclxuICAgIGNvbnN0IHNjb3JlUGN0ID0gc2NvcmUgPT09IG51bGwgPyAwIDogTWF0aC5yb3VuZChzY29yZSk7XHJcbiAgICAvLyBUaGUgYXVkaXQncyBvd24gcGFzcyBtYXJrIHdoZW4gdGhlIEFQSSBzZW5kcyBpdCwgZWxzZSB0aGUgZGFzaGJvYXJkJ3MgKHN1bW1hcnkucGFzc01hcmspLlxyXG4gICAgY29uc3QgbWFyayA9IHRoaXMubnVtKHI/LnBhc3NNYXJrKSA/PyB0aGlzLnBhc3NNYXJrO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbmFtZSxcclxuICAgICAgaW5pdGlhbHM6IFN0cmluZyhyPy5jaGVja0xpc3RDaGFyIHx8IG5hbWUuc2xpY2UoMCwgMikpLnRvVXBwZXJDYXNlKCksXHJcbiAgICAgIHNjaGVkdWxlZDogcj8uc2NoZWR1bGVSZXBlYXRlZFR5cGUgPyB0aGlzLnRpdGxlQ2FzZShyLnNjaGVkdWxlUmVwZWF0ZWRUeXBlKSA6ICfigJQnLFxyXG4gICAgICBhc3NpZ25lZDogdGhpcy5udW0ocj8uc3RvcmVDb3VudCkgPz8gMCxcclxuICAgICAgc3VibWl0dGVkOiB0aGlzLm51bShyPy5zdWJtaXR0ZWRDaGVja2xpc3QpID8/IDAsXHJcbiAgICAgIC8vIFF1ZXN0aW9ucyB3aXRoIGEgc3RvcmUgZGlzcHV0ZSAocmFpc2VkIG9yIHJldmlld2VkKSBpbiB0aGUgcGVyaW9kOyAn4oCUJyBvbmx5IHdoZW4gdGhlIEFQSSBzZW5kcyBub25lLlxyXG4gICAgICBkaXNwdXRlczogdGhpcy5udW0ocj8uZGlzcHV0ZXMpLFxyXG4gICAgICBwYXNzTWFyazogbWFyayArICclJyxcclxuICAgICAgc2NvcmU6IHNjb3JlID09PSBudWxsID8gJ+KAlCcgOiBzY29yZVBjdCArICclJyxcclxuICAgICAgc2NvcmVQY3QsXHJcbiAgICAgIHJlc3VsdDogc2NvcmUgPT09IG51bGwgPyAn4oCUJyA6IChzY29yZVBjdCA+PSBtYXJrID8gJ1Bhc3MnIDogJ0ZhaWwnKSxcclxuICAgICAgcmF3OiByXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0b1VzZXJQZXJmKHI6IGFueSk6IFVzZXJQZXJmUm93IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIG5hbWU6IHI/LnVzZXJOYW1lIHx8ICfigJQnLFxyXG4gICAgICBlbWFpbDogcj8udXNlckVtYWlsIHx8ICfigJQnLFxyXG4gICAgICBhc3NpZ25lZDogdGhpcy5udW0ocj8uY2hlY2tMaXN0Q291bnQpID8/IDAsXHJcbiAgICAgIGZsYWdzOiB0aGlzLm51bShyPy5mbGFnZ2VkQ291bnQpID8/IDAsXHJcbiAgICAgIHJlZG86IHRoaXMubnVtKHI/LnJlZG8pID8/IDAsXHJcbiAgICAgIGNvbXBsZXRpb246IHRoaXMucGN0VGV4dChyPy5jb21wbGV0aW9uKSxcclxuICAgICAgY29tcGxpYW5jZTogdGhpcy5wY3RUZXh0KHI/LmNvbXBsaWFuY2UpLFxyXG4gICAgICBwZXJmOiB0aGlzLnBjdFRleHQocj8ucGVyZm9ybWFuY2UpLFxyXG4gICAgICByYXc6IHJcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUYXNrIG1vZGU6IHRpbGVzICsgVGFzayBQZXJmb3JtYW5jZSByb3dzIGZvciB0aGUgdGFza3MgcmFpc2VkIGZyb20gdGhpcyBjbGllbnQncyBhdWRpdHMsIGluIHRoZVxyXG4gICAqIGN1cnJlbnQgc2NvcGUuIEEgZmFpbGVkIGNhbGwgbGVhdmVzICfigJQnIGV2ZXJ5d2hlcmUgYW5kIHJldHJpZXMgdGhlIG5leHQgdGltZSB0aGUgVGFzayB0YWIgb3BlbnMuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsb2FkVGFza3MoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaGVhZGVyRGF0YSkgeyByZXR1cm47IH1cclxuICAgIHRoaXMudGFza3NTdGFsZSA9IGZhbHNlO1xyXG4gICAgdGhpcy50YXNrTG9hZGluZyA9IHRydWU7XHJcbiAgICBjb25zdCByZXF1ZXN0ID0gKyt0aGlzLnRhc2tSZXF1ZXN0O1xyXG4gICAgY29uc3Qgc2NvcGUgPSB0aGlzLmJhc2VQYXlsb2FkKCk7XHJcbiAgICAvLyBUaGUgZW5kcG9pbnQgcmVqZWN0cyB1bmtub3duIGtleXMsIHNvIG9ubHkgdGhlIHNjb3BlIGlzIHNlbnQuXHJcbiAgICB0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0RGFzaGJvYXJkVGFza3Moe1xyXG4gICAgICBjbGllbnRJZDogc2NvcGVbJ2NsaWVudElkJ10sIGZyb21EYXRlOiBzY29wZVsnZnJvbURhdGUnXSwgdG9EYXRlOiBzY29wZVsndG9EYXRlJ10sXHJcbiAgICAgIHN0b3JlSWQ6IHNjb3BlWydzdG9yZUlkJ10sIHVzZXJFbWFpbGVzOiBzY29wZVsndXNlckVtYWlsZXMnXSwgLi4udGhpcy5hdWRpdEZpbHRlcigpXHJcbiAgICB9KS5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlcXVlc3QgIT09IHRoaXMudGFza1JlcXVlc3QpIHsgcmV0dXJuOyB9XHJcbiAgICAgIGNvbnN0IGRhdGEgPSByZXM/LmNvZGUgPT09IDIwMCA/IChyZXMuZGF0YSB8fCBudWxsKSA6IG51bGw7XHJcbiAgICAgIGlmICghZGF0YSkgeyB0aGlzLnRhc2tzU3RhbGUgPSB0cnVlOyB9XHJcbiAgICAgIHRoaXMudGFza1N0YXRzID0gdGhpcy50b1Rhc2tTdGF0cyhkYXRhKTtcclxuICAgICAgdGhpcy50YXNrUGVyZiA9IChkYXRhPy50YXNrcyB8fCBbXSkubWFwKCh0OiBhbnkpID0+IHRoaXMudG9UYXNrUGVyZih0KSk7XHJcbiAgICAgIHRoaXMubGFzdFJlZnJlc2hlZCA9IGRheWpzKCkuZm9ybWF0KCdoaDptbTpzcyBBJyk7XHJcbiAgICAgIHRoaXMudGFza0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdG9UYXNrU3RhdHMoZDogYW55KTogVGFza1N0YXRzIHtcclxuICAgIHRoaXMudGFza0RlbHRhVmFsdWVzID0ge1xyXG4gICAgICBjb21wbGV0aW9uOiB0aGlzLm51bShkPy5kZWx0YXM/LmNvbXBsZXRpb24pLFxyXG4gICAgICBjb21wbGlhbmNlOiB0aGlzLm51bShkPy5kZWx0YXM/LmNvbXBsaWFuY2UpLFxyXG4gICAgICBmbGFnczogdGhpcy5udW0oZD8uZGVsdGFzPy5mbGFncylcclxuICAgIH07XHJcbiAgICBpZiAoIWQpIHsgcmV0dXJuIHsgLi4uRU1QVFlfVEFTS19TVEFUUyB9OyB9XHJcbiAgICBjb25zdCBjb3VudCA9ICh2OiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgbiA9IHRoaXMubnVtKHYpO1xyXG4gICAgICByZXR1cm4gbiA9PT0gbnVsbCA/ICfigJQnIDogbi50b0xvY2FsZVN0cmluZygnZW4tVVMnKTtcclxuICAgIH07XHJcbiAgICBjb25zdCBkYXlzID0gdGhpcy5udW0oZD8ucGVyaW9kPy5wcmV2aW91cz8uZGF5cykgPz8gMTtcclxuICAgIGNvbnN0IHZzID0gZGF5cyA9PT0gMSA/ICd2cyBsYXN0IGRheScgOiAndnMgcHJldmlvdXMgJyArIGRheXMgKyAnIGRheXMnO1xyXG4gICAgY29uc3QgZGVsdGEgPSAodjogbnVtYmVyIHwgbnVsbCkgPT4gKHYgPT09IG51bGwgPyAnJyA6IE1hdGguYWJzKHYpICsgJyUgJyArIHZzKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGFjdGl2ZVRhc2tzOiBjb3VudChkLmFjdGl2ZVRhc2tzKSxcclxuICAgICAgdGFza0luc3RhbmNlczogY291bnQoZC50YXNrSW5zdGFuY2VzKSxcclxuICAgICAgbm90U3VibWl0dGVkOiBjb3VudChkLm5vdFN1Ym1pdHRlZCksXHJcbiAgICAgIG9wZW5UYXNrczogY291bnQoZC5vcGVuVGFza3MpLFxyXG4gICAgICBpblByb2dyZXNzOiBjb3VudChkLmluUHJvZ3Jlc3MpLFxyXG4gICAgICBzdWJtaXR0ZWQ6IGNvdW50KGQuc3VibWl0dGVkKSxcclxuICAgICAgY29tcGxldGlvblNjb3JlOiB0aGlzLnBjdFRleHQoZC5jb21wbGV0aW9uU2NvcmUpLFxyXG4gICAgICBjb21wbGlhbmNlU2NvcmU6IHRoaXMucGN0VGV4dChkLmNvbXBsaWFuY2VTY29yZSksXHJcbiAgICAgIHRvdGFsRmxhZ3M6IGNvdW50KGQudG90YWxGbGFncyksXHJcbiAgICAgIGNvbXBsZXRpb25EZWx0YTogZGVsdGEodGhpcy50YXNrRGVsdGFWYWx1ZXMuY29tcGxldGlvbiksXHJcbiAgICAgIGNvbXBsaWFuY2VEZWx0YTogZGVsdGEodGhpcy50YXNrRGVsdGFWYWx1ZXMuY29tcGxpYW5jZSksXHJcbiAgICAgIGZsYWdzRGVsdGE6IGRlbHRhKHRoaXMudGFza0RlbHRhVmFsdWVzLmZsYWdzKVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKiBPbmUgdGFzayByYWlzZWQgZnJvbSBhbiBhdWRpdDsgY29tcGxpYW5jZSBpcyAn4oCUJyB3aGlsZSB0YXNrIGluc3RhbmNlcyBjYXJyeSBubyBzY29yZS4gKi9cclxuICBwcml2YXRlIHRvVGFza1BlcmYodDogYW55KTogVGFza1BlcmZSb3cge1xyXG4gICAgY29uc3QgbmFtZSA9IHQ/LnRhc2tOYW1lIHx8ICfigJQnO1xyXG4gICAgY29uc3QgY29tcGxpYW5jZSA9IHRoaXMubnVtKHQ/LmNvbXBsaWFuY2UpO1xyXG4gICAgY29uc3QgcmFpc2VkID0gdGhpcy5udW0odD8udGFza3MpO1xyXG4gICAgbGV0IHNjaGVkdWxlZCA9ICfigJQnO1xyXG4gICAgaWYgKHQ/LnNjaGVkdWxlUmVwZWF0ZWRUeXBlKSB7XHJcbiAgICAgIHNjaGVkdWxlZCA9IHRoaXMudGl0bGVDYXNlKHQuc2NoZWR1bGVSZXBlYXRlZFR5cGUpO1xyXG4gICAgfSBlbHNlIGlmICh0Py5kdWVEYXRlKSB7XHJcbiAgICAgIHNjaGVkdWxlZCA9ICdEdWUgJyArIHRoaXMuZm10KHQuZHVlRGF0ZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBuYW1lLFxyXG4gICAgICBpbml0aWFsczogbmFtZS5zbGljZSgwLCAyKS50b1VwcGVyQ2FzZSgpLFxyXG4gICAgICBzY2hlZHVsZWQsXHJcbiAgICAgIGNvdmVyYWdlOiB0Py5jb3ZlcmFnZSA/IHRoaXMudGl0bGVDYXNlKHQuY292ZXJhZ2UpIDogJ+KAlCcsXHJcbiAgICAgIGFzc2lnbmVkOiB0aGlzLm51bSh0Py5hc3NpZ25lZCkgPz8gMCxcclxuICAgICAgc3VibWl0dGVkOiB0aGlzLm51bSh0Py5zdWJtaXR0ZWQpID8/IDAsXHJcbiAgICAgIGZsYWdzOiB0aGlzLm51bSh0Py5mbGFncykgPz8gMCxcclxuICAgICAgdGFza3M6IHJhaXNlZCA9PT0gbnVsbCA/ICfigJQnIDogU3RyaW5nKHJhaXNlZCksXHJcbiAgICAgIHJlZG86IHRoaXMubnVtKHQ/LnJlZG8pID8/IDAsXHJcbiAgICAgIGNvbXBsaWFuY2U6IHRoaXMucGN0VGV4dChjb21wbGlhbmNlKSxcclxuICAgICAgY29tcGxpYW5jZVBjdDogY29tcGxpYW5jZSA9PT0gbnVsbCA/IDAgOiBNYXRoLnJvdW5kKGNvbXBsaWFuY2UpLFxyXG4gICAgICByYXc6IHRcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKiogRGVsdGEgc3R5bGluZzogYXJyb3cgZGlyZWN0aW9uLCBhbmQgY29sb3VyIGJ5IHdoZXRoZXIgdGhlIG1vdmUgaXMgZ29vZCAobW9yZSBmbGFncyBpcyBiYWQpLiAqL1xyXG4gIHRhc2tEZWx0YUNsYXNzKGtleTogVGFza0RlbHRhS2V5KTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHYgPSB0aGlzLnRhc2tEZWx0YVZhbHVlc1trZXldO1xyXG4gICAgaWYgKHYgPT09IG51bGwgfHwgdiA9PT0gMCkgeyByZXR1cm4gJ2lzLWZsYXQnOyB9XHJcbiAgICBjb25zdCB1cCA9IHYgPiAwO1xyXG4gICAgY29uc3QgZ29vZCA9IGtleSA9PT0gJ2ZsYWdzJyA/ICF1cCA6IHVwO1xyXG4gICAgcmV0dXJuICh1cCA/ICdpcy11cCcgOiAnaXMtZG93bicpICsgJyAnICsgKGdvb2QgPyAnaXMtZ29vZCcgOiAnaXMtYmFkJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG51bSh2OiBhbnkpOiBudW1iZXIgfCBudWxsIHtcclxuICAgIGlmICh2ID09PSBudWxsIHx8IHYgPT09IHVuZGVmaW5lZCB8fCB2ID09PSAnJykgeyByZXR1cm4gbnVsbDsgfVxyXG4gICAgY29uc3QgbiA9IE51bWJlcih2KTtcclxuICAgIHJldHVybiBpc05hTihuKSA/IG51bGwgOiBuO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwY3RUZXh0KHY6IGFueSk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBuID0gdGhpcy5udW0odik7XHJcbiAgICByZXR1cm4gbiA9PT0gbnVsbCA/ICfigJQnIDogTWF0aC5yb3VuZChuKSArICclJztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdGl0bGVDYXNlKHY6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHYuc2xpY2UoMSkudG9Mb3dlckNhc2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZm10KHY6IGFueSk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdiA/IGRheWpzKHYpLmZvcm1hdCgnTU1NIERELCBZWVlZJykgOiAn4oCUJztcclxuICB9XHJcblxyXG4gIC8qKiBSb3dzIGFmdGVyIHNlYXJjaCwgc3RhdHVzIGFuZCBzY29yZS1iYW5kIGZpbHRlcnMuICovXHJcbiAgZ2V0IGZpbHRlcmVkUm93cygpOiBBdWRpdFJvd1tdIHtcclxuICAgIGNvbnN0IHEgPSB0aGlzLnNlYXJjaC50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIHJldHVybiB0aGlzLnJvd3NcclxuICAgICAgLmZpbHRlcihyID0+IHRoaXMuc3RhdHVzID09PSAnYWxsJyB8fCByLnN0YXR1cyA9PT0gdGhpcy5zdGF0dXMpXHJcbiAgICAgIC5maWx0ZXIociA9PiB7XHJcbiAgICAgICAgaWYgKHIuc2NvcmUgPT09IG51bGwpIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLnNjb3JlTWluID09PSAwICYmIHRoaXMuc2NvcmVNYXggPT09IDEwMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQSBsb3dlciBib3VuZCBvZiAwIGlzIG9wZW46IHBlbmFsdHkgc2NvcmVzIGNhbiB0YWtlIGEgc3RvcmUgYmVsb3cgMCUgKENyaXRpY2FsKS5cclxuICAgICAgICByZXR1cm4gKHRoaXMuc2NvcmVNaW4gPD0gMCB8fCByLnNjb3JlID49IHRoaXMuc2NvcmVNaW4pICYmIHIuc2NvcmUgPD0gdGhpcy5zY29yZU1heDtcclxuICAgICAgfSlcclxuICAgICAgLmZpbHRlcihyID0+ICFxIHx8IFtyLnN0b3JlSWQsIHIuY2lyY2xlLCByLnpvbmUsIHIuYW9tLCByLnJhdz8uc3RvcmVOYW1lIHx8ICcnLCByLnJhdz8uc3RvcmVJZCB8fCAnJ10uc29tZSh2ID0+IFN0cmluZyh2KS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKSlcclxuICAgICAgLnNvcnQoKGEsIGIpID0+IHRoaXMuY29tcGFyZShhLCBiKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbXBhcmUoYTogQXVkaXRSb3csIGI6IEF1ZGl0Um93KTogbnVtYmVyIHtcclxuICAgIGNvbnN0IGRpciA9IHRoaXMuc29ydERpciA9PT0gJ2FzYycgPyAxIDogLTE7XHJcbiAgICBpZiAodGhpcy5zb3J0S2V5ID09PSAnc2NvcmUnKSB7XHJcbiAgICAgIC8vIE5vdC1hdWRpdGVkIHN0b3JlcyAobm8gc2NvcmUpIGFsd2F5cyBjb21lIGFmdGVyIHRoZSBhdWRpdGVkIG9uZXMsIGluIGVpdGhlciBkaXJlY3Rpb24sXHJcbiAgICAgIC8vIHNvIHRoZSBmZXcgYXVkaXRlZCBzdG9yZXMgYXJlIG5vdCBidXJpZWQgdW5kZXIgdGhvdXNhbmRzIG9mIFwiTm90IGF1ZGl0ZWRcIiByb3dzLlxyXG4gICAgICBpZiAoYS5zY29yZSA9PT0gbnVsbCB8fCBiLnNjb3JlID09PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIGEuc2NvcmUgPT09IGIuc2NvcmUgPyAwIDogKGEuc2NvcmUgPT09IG51bGwgPyAxIDogLTEpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiAoYS5zY29yZSAtIGIuc2NvcmUpICogZGlyO1xyXG4gICAgfVxyXG4gICAgY29uc3QgYXYgPSBTdHJpbmcoYVt0aGlzLnNvcnRLZXkgYXMga2V5b2YgQXVkaXRSb3ddID8/ICcnKTtcclxuICAgIGNvbnN0IGJ2ID0gU3RyaW5nKGJbdGhpcy5zb3J0S2V5IGFzIGtleW9mIEF1ZGl0Um93XSA/PyAnJyk7XHJcbiAgICByZXR1cm4gYXYubG9jYWxlQ29tcGFyZShidikgKiBkaXI7XHJcbiAgfVxyXG5cclxuICBnZXQgdG90YWxQYWdlcygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIE1hdGgubWF4KDEsIE1hdGguY2VpbCh0aGlzLmZpbHRlcmVkUm93cy5sZW5ndGggLyB0aGlzLnBhZ2VTaXplKSk7XHJcbiAgfVxyXG5cclxuICBnZXQgcGFnZVJvd3MoKTogQXVkaXRSb3dbXSB7XHJcbiAgICBjb25zdCBzdGFydCA9ICh0aGlzLnBhZ2UgLSAxKSAqIHRoaXMucGFnZVNpemU7XHJcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJlZFJvd3Muc2xpY2Uoc3RhcnQsIHN0YXJ0ICsgdGhpcy5wYWdlU2l6ZSk7XHJcbiAgfVxyXG5cclxuICAvKiogU3RvcmVzIHRoYXQgY2FycnkgYSBzY29yZSBpbiB0aGUgY3VycmVudCBwZXJpb2QuICovXHJcbiAgcHJpdmF0ZSBnZXQgZXZhbHVhdGVkKCk6IEF1ZGl0Um93W10ge1xyXG4gICAgcmV0dXJuIHRoaXMucm93cy5maWx0ZXIociA9PiByLnNjb3JlICE9PSBudWxsKTtcclxuICB9XHJcblxyXG4gIC8qKiBTdG9yZXMgd2l0aCBhIHN1Ym1pdHRlZCBhdWRpdCBpbiB0aGUgcGVyaW9kLCBzY29yZWQgb3Igbm90LiAqL1xyXG4gIHByaXZhdGUgZ2V0IGF1ZGl0ZWRDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMucm93cy5maWx0ZXIociA9PiByLnN0YXR1cyAhPT0gJ25hJykubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGF2ZXJhZ2VTY29yZSgpOiBudW1iZXIgfCBudWxsIHtcclxuICAgIGNvbnN0IGV2ID0gdGhpcy5ldmFsdWF0ZWQ7XHJcbiAgICBpZiAoIWV2Lmxlbmd0aCkgeyByZXR1cm4gbnVsbDsgfVxyXG4gICAgcmV0dXJuIE1hdGgucm91bmQoZXYucmVkdWNlKChzdW0sIHIpID0+IHN1bSArIChyLnNjb3JlIGFzIG51bWJlciksIDApIC8gZXYubGVuZ3RoKTtcclxuICB9XHJcblxyXG4gIGdldCBrcGlzKCk6IEF1ZGl0S3BpW10ge1xyXG4gICAgY29uc3QgZXYgPSB0aGlzLmV2YWx1YXRlZDtcclxuICAgIGNvbnN0IGF2ZyA9IHRoaXMuYXZlcmFnZVNjb3JlO1xyXG4gICAgY29uc3QgcGFzc0NvdW50ID0gZXYuZmlsdGVyKHIgPT4gKHIuc2NvcmUgYXMgbnVtYmVyKSA+PSB0aGlzLnBhc3NNYXJrKS5sZW5ndGg7XHJcbiAgICBjb25zdCBmYWlsQ291bnQgPSBldi5sZW5ndGggLSBwYXNzQ291bnQ7XHJcbiAgICBjb25zdCBjcml0aWNhbCA9IGV2LmZpbHRlcihyID0+IChyLnNjb3JlIGFzIG51bWJlcikgPCB0aGlzLmNyaXRpY2FsTWFyaykubGVuZ3RoO1xyXG4gICAgY29uc3QgcGVyaW9kTGFiZWwgPSB0aGlzLnBlcmlvZExhYmVsO1xyXG4gICAgY29uc3QgYXVkaXRlZCA9IHRoaXMuYXVkaXRlZENvdW50O1xyXG4gICAgbGV0IGF2Z05vdGUgPSAnQWNyb3NzIGF1ZGl0ZWQgc3RvcmVzJztcclxuICAgIGlmIChhdmcgPT09IG51bGwpIHtcclxuICAgICAgYXZnTm90ZSA9IGF1ZGl0ZWQgPyAnQ29tcGxpYW5jZSBzY29yZSBpcyBvZmYgZm9yIHRoZXNlIGF1ZGl0cycgOiAnTm8gYXVkaXRzIGluIHRoaXMgcGVyaW9kJztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gW1xyXG4gICAgICB7XHJcbiAgICAgICAgbGFiZWw6ICdBdmVyYWdlIHNjb3JlJyxcclxuICAgICAgICB2YWx1ZTogYXZnID09PSBudWxsID8gJ+KAlCcgOiBhdmcgKyAnJScsXHJcbiAgICAgICAgbm90ZTogYXZnTm90ZSxcclxuICAgICAgICBub3RlQ29sb3I6IGF2ZyAhPT0gbnVsbCAmJiBhdmcgPCB0aGlzLnBhc3NNYXJrID8gJyNEOTJEMjAnIDogJyMwMjdBNDgnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBsYWJlbDogJ1Bhc3MgcmF0ZScsXHJcbiAgICAgICAgdmFsdWU6IGV2Lmxlbmd0aCA/IE1hdGgucm91bmQocGFzc0NvdW50IC8gZXYubGVuZ3RoICogMTAwKSArICclJyA6ICfigJQnLFxyXG4gICAgICAgIG5vdGU6IHBhc3NDb3VudCArICcgcGFzcywgJyArIGZhaWxDb3VudCArICcgZmFpbCcsXHJcbiAgICAgICAgbm90ZUNvbG9yOiAnIzY2NzA4NSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGxhYmVsOiAnQ3JpdGljYWwgc3RvcmVzJyxcclxuICAgICAgICB2YWx1ZTogU3RyaW5nKGNyaXRpY2FsKSxcclxuICAgICAgICBub3RlOiAnU2NvcmUgYmVsb3cgJyArIHRoaXMuY3JpdGljYWxNYXJrICsgJyUnLFxyXG4gICAgICAgIG5vdGVDb2xvcjogY3JpdGljYWwgPyAnI0Q5MkQyMCcgOiAnIzY2NzA4NSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIC8vIFN1Ym1pdHRlZCBhdWRpdHMsIGFzIHRoZSB0cmVuZCBjb3VudHMgdGhlbTsgdGhlIG5vdGUgZ2l2ZXMgdGhlIHN0b3JlcyB0aGV5IGNvdmVyLlxyXG4gICAgICAgIGxhYmVsOiAnQXVkaXRzIGNvbXBsZXRlZCcsXHJcbiAgICAgICAgdmFsdWU6IFN0cmluZyh0aGlzLnJvd3MucmVkdWNlKChzdW0sIHIpID0+IHN1bSArIChOdW1iZXIoci5yYXc/LmF1ZGl0cykgfHwgMCksIDApKSxcclxuICAgICAgICBub3RlOiAnYXQgJyArIGF1ZGl0ZWQgKyAnIG9mICcgKyB0aGlzLnJvd3MubGVuZ3RoICsgJyBzdG9yZXMgaW4gc2NvcGUgwrcgJyArIHBlcmlvZExhYmVsLFxyXG4gICAgICAgIG5vdGVDb2xvcjogJyM2NjcwODUnXHJcbiAgICAgIH1cclxuICAgIF07XHJcbiAgfVxyXG5cclxuICBnZXQgcGVyaW9kTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLmdyYWluID09PSAncXVhcnRlcicgJiYgdGhpcy5xdWFydGVyKSB7IHJldHVybiB0aGlzLnF1YXJ0ZXIgKyAnICgnICsgdGhpcy5xdWFydGVyTW9udGhzKHRoaXMucXVhcnRlcikgKyAnKSc7IH1cclxuICAgIHJldHVybiB0aGlzLmZtdCh0aGlzLmZyb20pICsgJyB0byAnICsgdGhpcy5mbXQodGhpcy50byk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEaXN0cmlidXRpb24gb2Ygc3RvcmVzIGFjcm9zcyBzY29yZSBiYW5kcy4gTm90IHNjb3JlZCBpcyBsZWZ0IG91dCAoUUEgOSBPY3QpLCBhbmQgaXRzIHN0b3Jlc1xyXG4gICAqIHdpdGggaXQsIHNvIHRoZSBzaGFyZXMgc3RpbGwgYWRkIHVwIHRvIDEwMCUuXHJcbiAgICovXHJcbiAgZ2V0IGJhbmRSb3dzKCk6IEFycmF5PHsgYmFuZDogQXVkaXRCYW5kOyBjb3VudDogbnVtYmVyOyBzaGFyZTogc3RyaW5nOyB3aWR0aDogc3RyaW5nIH0+IHtcclxuICAgIGNvbnN0IHRvdGFsID0gdGhpcy5yb3dzLmZpbHRlcihyID0+IHIuc3RhdHVzICE9PSAndW5zY29yZWQnKS5sZW5ndGggfHwgMTtcclxuICAgIHJldHVybiB0aGlzLmJhbmRzLmZpbHRlcihiYW5kID0+IGJhbmQua2V5ICE9PSAndW5zY29yZWQnKS5tYXAoYmFuZCA9PiB7XHJcbiAgICAgIGNvbnN0IGNvdW50ID0gU1RBVFVTX0JBTkRTLmluY2x1ZGVzKGJhbmQua2V5KVxyXG4gICAgICAgID8gdGhpcy5yb3dzLmZpbHRlcihyID0+IHIuc3RhdHVzID09PSBiYW5kLmtleSkubGVuZ3RoXHJcbiAgICAgICAgOiB0aGlzLnJvd3MuZmlsdGVyKHIgPT4gci5zY29yZSAhPT0gbnVsbCAmJiB0aGlzLmluQmFuZChyLnNjb3JlIGFzIG51bWJlciwgYmFuZCkpLmxlbmd0aDtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBiYW5kLFxyXG4gICAgICAgIGNvdW50LFxyXG4gICAgICAgIC8vIEEgZmV3IHN0b3JlcyBvdXQgb2YgdGhvdXNhbmRzIHJvdW5kIHRvIDAlOyBzYXkgXCI8MSVcIiBpbnN0ZWFkIG9mIDAlIG5leHQgdG8gYSBub24temVybyBjb3VudC5cclxuICAgICAgICBzaGFyZTogY291bnQgJiYgY291bnQgLyB0b3RhbCAqIDEwMCA8IDEgPyAnPDElJyA6IE1hdGgucm91bmQoY291bnQgLyB0b3RhbCAqIDEwMCkgKyAnJScsXHJcbiAgICAgICAgd2lkdGg6IChjb3VudCAvIHRvdGFsICogMTAwKSArICclJ1xyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogQmFuZCBjb2xvdXJzIG9mIGEgc3RvcmUgcm93OiBieSBzY29yZSwgb3IgdGhlIE5vdCBzY29yZWQgLyBOb3QgYXVkaXRlZCBiYW5kIHdoZW4gaXQgaGFzIG5vbmUuICovXHJcbiAgYmFuZEZvcihyb3c6IEF1ZGl0Um93KTogQXVkaXRCYW5kIHtcclxuICAgIGNvbnN0IGxhc3QgPSB0aGlzLmJhbmRzW3RoaXMuYmFuZHMubGVuZ3RoIC0gMV07XHJcbiAgICBpZiAocm93LnNjb3JlID09PSBudWxsKSB7IHJldHVybiB0aGlzLmJhbmRzLmZpbmQoYiA9PiBiLmtleSA9PT0gcm93LnN0YXR1cykgPz8gbGFzdDsgfVxyXG4gICAgY29uc3Qgc2NvcmUgPSByb3cuc2NvcmU7XHJcbiAgICByZXR1cm4gdGhpcy5iYW5kcy5maW5kKGIgPT4gIVNUQVRVU19CQU5EUy5pbmNsdWRlcyhiLmtleSkgJiYgdGhpcy5pbkJhbmQoc2NvcmUsIGIpKSA/PyBsYXN0O1xyXG4gIH1cclxuXHJcbiAgLyoqIEEgc2NvcmUgYmFuZCdzIHJhbmdlOyB0aGUgbG93ZXN0IGJhbmQgKGxvIDAsIENyaXRpY2FsKSBhbHNvIHRha2VzIG5lZ2F0aXZlIHNjb3JlcyAocGVuYWx0eSBvcHRpb25zKS4gKi9cclxuICBwcml2YXRlIGluQmFuZChzY29yZTogbnVtYmVyLCBiYW5kOiBBdWRpdEJhbmQpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoYmFuZC5sbyA8PSAwIHx8IHNjb3JlID49IGJhbmQubG8pICYmIHNjb3JlIDw9IGJhbmQuaGk7XHJcbiAgfVxyXG5cclxuICBzdGF0dXNMYWJlbChyb3c6IEF1ZGl0Um93KTogc3RyaW5nIHtcclxuICAgIGlmIChyb3cuc3RhdHVzID09PSAncGFzcycpIHsgcmV0dXJuICdQYXNzJzsgfVxyXG4gICAgaWYgKHJvdy5zdGF0dXMgPT09ICdmYWlsJykgeyByZXR1cm4gJ0ZhaWwnOyB9XHJcbiAgICByZXR1cm4gcm93LnN0YXR1cyA9PT0gJ3Vuc2NvcmVkJyA/ICdOb3Qgc2NvcmVkJyA6ICdOb3QgYXVkaXRlZCc7XHJcbiAgfVxyXG5cclxuICAvKiogQmFyIGhlaWdodCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIGNoYXJ0IGFyZWEuICovXHJcbiAgYmFySGVpZ2h0KGJhcjogVHJlbmRCYXIpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIChiYXIudmFsdWUgPT09IG51bGwgPyAyIDogTWF0aC5tYXgoMywgYmFyLnZhbHVlKSkgKyAnJSc7XHJcbiAgfVxyXG5cclxuICAvKiogSG92ZXIgY2FyZCBzaXRzIGp1c3QgYWJvdmUgdGhlIGJhcidzIHZhbHVlIGxhYmVsOyBjYXBwZWQgc28gYSB0YWxsIGJhcidzIGNhcmQgc3RheXMgaW5zaWRlIHRoZSBjaGFydC4gKi9cclxuICB0aXBCb3R0b20oYmFyOiBUcmVuZEJhcik6IHN0cmluZyB7XHJcbiAgICBjb25zdCBoID0gYmFyLnZhbHVlID09PSBudWxsID8gMiA6IE1hdGgubWF4KDMsIGJhci52YWx1ZSk7XHJcbiAgICByZXR1cm4gJ2NhbGMoJyArIE1hdGgubWluKGgsIDQ1KSArICclICsgMjZweCknO1xyXG4gIH1cclxuXHJcbiAgYmFyRmlsbChiYXI6IFRyZW5kQmFyKTogc3RyaW5nIHtcclxuICAgIGlmIChiYXIudmFsdWUgPT09IG51bGwpIHsgcmV0dXJuICcjRjJGNEY3JzsgfVxyXG4gICAgY29uc3QgYWN0aXZlID0gYmFyLmtleSA9PT0gdGhpcy5xdWFydGVyO1xyXG4gICAgaWYgKGJhci52YWx1ZSA+PSB0aGlzLnBhc3NNYXJrKSB7IHJldHVybiBhY3RpdmUgPyAnIzE1NzBFRicgOiAnI0IyRERGRic7IH1cclxuICAgIHJldHVybiBhY3RpdmUgPyAnI0YwNDQzOCcgOiAnI0ZFQ0RDQSc7XHJcbiAgfVxyXG5cclxuICBzZXRHcmFpbihncmFpbjogJ3F1YXJ0ZXInIHwgJ2RhdGUnKTogdm9pZCB7XHJcbiAgICBpZiAoZ3JhaW4gPT09IHRoaXMuZ3JhaW4pIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLmdyYWluID0gZ3JhaW47XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gICAgaWYgKGdyYWluID09PSAncXVhcnRlcicpIHtcclxuICAgICAgdGhpcy5hcHBseVF1YXJ0ZXIodGhpcy5xdWFydGVycy5pbmNsdWRlcyh0aGlzLnF1YXJ0ZXIpID8gdGhpcy5xdWFydGVyIDogdGhpcy5xdWFydGVyc1t0aGlzLnF1YXJ0ZXJzLmxlbmd0aCAtIDFdLCB0cnVlKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8gQmFjayB0byBCeSBkYXRlOiB0aGUgaGVhZGVyJ3MgcmFuZ2UgYWdhaW4uXHJcbiAgICB0aGlzLmZyb20gPSB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LnN0YXJ0RGF0ZSB8fCB0aGlzLmZyb207XHJcbiAgICB0aGlzLnRvID0gdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5lbmREYXRlIHx8IHRoaXMudG87XHJcbiAgICB0aGlzLnJhbmdlID0gdG9QaWNrZXJSYW5nZSh0aGlzLmZyb20sIHRoaXMudG8pO1xyXG4gICAgaWYgKCF0aGlzLmZpbHRlcnNPcGVuKSB7IHRoaXMucmVsb2FkUGVyaW9kKCk7IH1cclxuICB9XHJcblxyXG4gIHNldFN0YXR1cyhzdGF0dXM6IFN0YXR1c0ZpbHRlcik6IHZvaWQge1xyXG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgc29ydEJ5KGtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zb3J0S2V5ID09PSBrZXkpIHtcclxuICAgICAgdGhpcy5zb3J0RGlyID0gdGhpcy5zb3J0RGlyID09PSAnYXNjJyA/ICdkZXNjJyA6ICdhc2MnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zb3J0S2V5ID0ga2V5O1xyXG4gICAgICB0aGlzLnNvcnREaXIgPSAnYXNjJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNjb3JlIGRpc3RyaWJ1dGlvbiAtPiBWaWV3IHN0b3JlczogbmFycm93IHRoZSBzdG9yZSBsaXN0IHRvIHRoYXQgYmFuZCAoTm90IGF1ZGl0ZWQgLT4gdGhlXHJcbiAgICogc3RvcmVzIHdpdGggbm8gc3VibWlzc2lvbikgYW5kIGJyaW5nIHRoZSBsaXN0IGludG8gdmlldy5cclxuICAgKi9cclxuICBhcHBseUJhbmQoYmFuZDogQXVkaXRCYW5kKTogdm9pZCB7XHJcbiAgICBpZiAoU1RBVFVTX0JBTkRTLmluY2x1ZGVzKGJhbmQua2V5KSkge1xyXG4gICAgICB0aGlzLmNsZWFyQmFuZCgpO1xyXG4gICAgICB0aGlzLnN0YXR1cyA9IGJhbmQua2V5IGFzIFN0b3JlU3RhdHVzO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zY29yZU1pbiA9IGJhbmQubG87XHJcbiAgICAgIHRoaXMuc2NvcmVNYXggPSBiYW5kLmhpO1xyXG4gICAgICB0aGlzLnN0YXR1cyA9ICdhbGwnO1xyXG4gICAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zdG9yZUxpc3RPcGVuID0gdHJ1ZTtcclxuICAgIHRoaXMubGlzdEJhbmRLZXkgPSBiYW5kLmtleTtcclxuICAgIC8vIEZyb20gdGhlIGRyYXdlciwgQXBwbHkgc2Nyb2xscyBvbmNlIGl0IGNsb3Nlcy5cclxuICAgIGlmICh0aGlzLmZpbHRlcnNPcGVuKSB7IHJldHVybjsgfVxyXG4gICAgc2V0VGltZW91dCgoKSA9PiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWQtc3RvcmUtbGlzdCcpPy5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICdzdGFydCcgfSkpO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJCYW5kKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zY29yZU1pbiA9IDA7XHJcbiAgICB0aGlzLnNjb3JlTWF4ID0gMTAwO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBTdG9yZSBsaXN0IHN0YXlzIGhpZGRlbiB1bnRpbCBTY29yZSBkaXN0cmlidXRpb24gLT4gVmlldyBzdG9yZXMgb3BlbnMgaXQgKG9yIHRoZSBGaWx0ZXJzXHJcbiAgICogZHJhd2VyIHNldHMgYSBzY29yZSByYW5nZSk7IHRoZSBjaGlwJ3MgeCBjbG9zZXMgaXQgYWdhaW4uXHJcbiAgICovXHJcbiAgc3RvcmVMaXN0T3BlbiA9IGZhbHNlO1xyXG4gIC8qKiBCYW5kIHRoZSBsaXN0IHdhcyBvcGVuZWQgZm9yICgnJyA9IGFsbCBzdG9yZXMpLiAqL1xyXG4gIGxpc3RCYW5kS2V5ID0gJyc7XHJcblxyXG4gIGdldCBzaG93U3RvcmVMaXN0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RvcmVMaXN0T3BlbiB8fCB0aGlzLmJhbmRGaWx0ZXJBY3RpdmUgfHwgdGhpcy5zdGF0dXMgIT09ICdhbGwnO1xyXG4gIH1cclxuXHJcbiAgLyoqIENoaXAgb3ZlciB0aGUgbGlzdDogdGhlIGJhbmQgb3Igc3RhdHVzIGl0IHNob3dzLCBvciBcIkFsbCBzdG9yZXNcIi4gKi9cclxuICBnZXQgbGlzdENoaXBMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLnNob3dTdG9yZUxpc3QpIHsgcmV0dXJuICcnOyB9XHJcbiAgICBpZiAodGhpcy5iYW5kRmlsdGVyQWN0aXZlKSB7IHJldHVybiB0aGlzLmJhbmRDaGlwTGFiZWw7IH1cclxuICAgIGNvbnN0IGJhbmQgPSB0aGlzLmJhbmRzLmZpbmQoYiA9PiBiLmtleSA9PT0gdGhpcy5saXN0QmFuZEtleSk7XHJcbiAgICAvLyBBIHNjb3JlIGJhbmQgdGhlIHJhbmdlIG5vIGxvbmdlciBtYXRjaGVzIGlzIHN0YWxlOyBhIHN0YXR1cyBiYW5kIHN0aWxsIGhvbGRzIHdoaWxlIHRoZSBzdGF0dXMgZG9lcy5cclxuICAgIGlmIChiYW5kICYmIGJhbmQua2V5ID09PSB0aGlzLnN0YXR1cykgeyByZXR1cm4gYmFuZC5sYWJlbCArICcgwrcgJyArIGJhbmQucmFuZ2U7IH1cclxuICAgIHJldHVybiB0aGlzLnN0YXR1cyAhPT0gJ2FsbCcgPyB0aGlzLnN0YXR1c0ZpbHRlckxhYmVsIDogJ0FsbCBzdG9yZXMnO1xyXG4gIH1cclxuXHJcbiAgLyoqIERyYXdlciBTY29yZSByYW5nZTogdGhlIGJhbmQgdGhlIGN1cnJlbnQgcmFuZ2UgKG9yIHN0YXR1cyBiYW5kKSBtYXRjaGVzLiAqL1xyXG4gIGlzQmFuZE9uKGJhbmQ6IEF1ZGl0QmFuZCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKFNUQVRVU19CQU5EUy5pbmNsdWRlcyhiYW5kLmtleSkpIHsgcmV0dXJuIHRoaXMuc3RhdHVzID09PSBiYW5kLmtleTsgfVxyXG4gICAgcmV0dXJuIHRoaXMuc2NvcmVNaW4gPT09IGJhbmQubG8gJiYgdGhpcy5zY29yZU1heCA9PT0gYmFuZC5oaTtcclxuICB9XHJcblxyXG4gIC8qKiBDaGlwIFwiU2hvdyBhbGwgc3RvcmVzXCI6IGtlZXAgdGhlIGxpc3Qgb3Blbiwgd2l0aG91dCB0aGUgYmFuZC4gKi9cclxuICBzaG93QWxsU3RvcmVzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jbGVhckJhbmQoKTtcclxuICAgIHRoaXMuc3RhdHVzID0gJ2FsbCc7XHJcbiAgICB0aGlzLmxpc3RCYW5kS2V5ID0gJyc7XHJcbiAgICB0aGlzLnN0b3JlTGlzdE9wZW4gPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqIENoaXAgeDogaGlkZSB0aGUgbGlzdCBhZ2Fpbi4gKi9cclxuICBjbG9zZVN0b3JlTGlzdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY2xlYXJCYW5kKCk7XHJcbiAgICB0aGlzLnN0YXR1cyA9ICdhbGwnO1xyXG4gICAgdGhpcy5saXN0QmFuZEtleSA9ICcnO1xyXG4gICAgdGhpcy5zdG9yZUxpc3RPcGVuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnZXQgYmFuZEZpbHRlckFjdGl2ZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnNjb3JlTWluICE9PSAwIHx8IHRoaXMuc2NvcmVNYXggIT09IDEwMDtcclxuICB9XHJcblxyXG4gIGdldCBiYW5kQ2hpcExhYmVsKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBoaXQgPSB0aGlzLmJhbmRzLmZpbmQoYiA9PiAhU1RBVFVTX0JBTkRTLmluY2x1ZGVzKGIua2V5KSAmJiBiLmxvID09PSB0aGlzLnNjb3JlTWluICYmIGIuaGkgPT09IHRoaXMuc2NvcmVNYXgpO1xyXG4gICAgcmV0dXJuIGhpdCA/IGhpdC5sYWJlbCArICcgwrcgJyArIGhpdC5yYW5nZSA6ICdTY29yZSAnICsgdGhpcy5zY29yZU1pbiArICfigJMnICsgdGhpcy5zY29yZU1heCArICclJztcclxuICB9XHJcblxyXG4gIG9uU2VhcmNoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgZml2ZSBmaWx0ZXIgY2F0ZWdvcmllcyB0aGUgZHJhd2VyIGxpc3RzLiAqL1xyXG4gIGdldCBmaWx0ZXJDYXRzKCk6IEZpbHRlckNhdFtdIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgIHsga2V5OiAncGVyaW9kJywgbGFiZWw6ICdQZXJpb2QnLCB2YWx1ZTogdGhpcy5wZXJpb2RMYWJlbCwgdGl0bGU6ICdQZXJpb2QnLFxyXG4gICAgICAgIHN1YjogJ1N0YXJ0cyBhcyB0aGUgZ2xvYmFsIGhlYWRlciBkYXRlIHJhbmdlOyBwaWNrIGEgcmFuZ2UgdG8gbmFycm93IGl0LicsXHJcbiAgICAgICAgZGlydHk6IGZhbHNlIH0sXHJcbiAgICAgIHsga2V5OiAnc2NvcGUnLCBsYWJlbDogJ1N0b3JlIGhpZXJhcmNoeScsIHZhbHVlOiB0aGlzLnNjb3BlTGFiZWwsIHRpdGxlOiAnU3RvcmUgaGllcmFyY2h5JyxcclxuICAgICAgICBzdWI6ICdQaWNrIHRoZSBjaXJjbGUsIHpvbmUsIEFPTSBvciBzdG9yZSB0aGUgd2hvbGUgZGFzaGJvYXJkIHJlYWRzLicsXHJcbiAgICAgICAgZGlydHk6ICEhdGhpcy5jaXJjbGUgfSxcclxuICAgICAgeyBrZXk6ICd0eXBlJywgbGFiZWw6ICdBdWRpdCB0eXBlJywgdmFsdWU6IHRoaXMuYXVkaXRUeXBlTGFiZWwsIHRpdGxlOiAnQXVkaXQgdHlwZScsXHJcbiAgICAgICAgc3ViOiAnV2hpY2ggYXVkaXQgcHJvZ3JhbW1lIHRoZSBzY29yZXMgY29tZSBmcm9tLicsXHJcbiAgICAgICAgZGlydHk6IHRoaXMuYXVkaXRUeXBlICE9PSAnYWxsJyB9LFxyXG4gICAgICB7IGtleTogJ2JhbmQnLCBsYWJlbDogJ1Njb3JlIHJhbmdlJywgdmFsdWU6IHRoaXMuYmFuZENoaXBMYWJlbCwgdGl0bGU6ICdTY29yZSByYW5nZScsXHJcbiAgICAgICAgc3ViOiAnVGFwIGEgYmFuZCB0byBzZXQgdGhlIHJhbmdlIHRoZSBzdW1tYXJ5IHJlYWRzLicsXHJcbiAgICAgICAgZGlydHk6IHRoaXMuYmFuZEZpbHRlckFjdGl2ZSB9LFxyXG4gICAgICB7IGtleTogJ3N0YXR1cycsIGxhYmVsOiAnU3RhdHVzJywgdmFsdWU6IHRoaXMuc3RhdHVzRmlsdGVyTGFiZWwsIHRpdGxlOiAnU3RhdHVzJyxcclxuICAgICAgICBzdWI6ICdTaG93IGV2ZXJ5IHN0b3JlLCBvciBvbmx5IHRoZSBvbmVzIHRoYXQgcGFzc2VkIG9yIGZhaWxlZC4nLFxyXG4gICAgICAgIGRpcnR5OiB0aGlzLnN0YXR1cyAhPT0gJ2FsbCcgfVxyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIGdldCBhY3RpdmVDYXRPYmooKTogRmlsdGVyQ2F0IHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlckNhdHMuZmluZChjID0+IGMua2V5ID09PSB0aGlzLmFjdGl2ZUNhdCkgfHwgdGhpcy5maWx0ZXJDYXRzWzBdO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZpbHRlckNvdW50KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJDYXRzLmZpbHRlcihjID0+IGMuZGlydHkpLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIC8qKiBTdG9yZXMgdGhlIGRyYXdlcidzIGhpZXJhcmNoeSBwaWNrIGNvdmVycyAod2hhdCBBcHBseSB3aWxsIGxvYWQpLiAqL1xyXG4gIGdldCBzdG9yZXNJblNjb3BlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5zY29wZVJvd3MuZmlsdGVyKHIgPT4gdGhpcy5tYXRjaGVzU2NvcGUociwgdGhpcykpLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIC8qKiBTb3J0ZWQgZGlzdGluY3QgbmFtZXMsIHdpdGhvdXQgdGhlIFwi4oCUXCIgb2Ygc3RvcmVzIG91dHNpZGUgdGhlIGhpZXJhcmNoeS4gKi9cclxuICBwcml2YXRlIGRpc3RpbmN0KHZhbHVlczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KHZhbHVlcy5maWx0ZXIodiA9PiB2ICYmIHYgIT09ICfigJQnKSkpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSk7XHJcbiAgfVxyXG5cclxuICBnZXQgY2lyY2xlcygpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5kaXN0aW5jdCh0aGlzLnNjb3BlUm93cy5tYXAociA9PiByLmNpcmNsZSkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHpvbmVzKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiB0aGlzLmRpc3RpbmN0KHRoaXMuc2NvcGVSb3dzLmZpbHRlcihyID0+IHIuY2lyY2xlID09PSB0aGlzLmNpcmNsZSkubWFwKHIgPT4gci56b25lKSk7XHJcbiAgfVxyXG5cclxuICBnZXQgYW9tcygpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5kaXN0aW5jdCh0aGlzLnNjb3BlUm93cy5maWx0ZXIociA9PiByLmNpcmNsZSA9PT0gdGhpcy5jaXJjbGUgJiYgci56b25lID09PSB0aGlzLnpvbmUpLm1hcChyID0+IHIuYW9tKSk7XHJcbiAgfVxyXG5cclxuICBnZXQgc2NvcGVSZWFkaW5nKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBuID0gdGhpcy5zdG9yZXNJblNjb3BlO1xyXG4gICAgcmV0dXJuIHRoaXMuc2NvcGVMYWJlbCArICcgwrcgJyArIG4gKyAobiA9PT0gMSA/ICcgc3RvcmUnIDogJyBzdG9yZXMnKTtcclxuICB9XHJcblxyXG4gIHNldE1vZHVsZVRhYih0YWI6ICdBdWRpdCcgfCAnVGFzaycpOiB2b2lkIHtcclxuICAgIGlmICh0YWIgIT09IHRoaXMubW9kdWxlVGFiKSB7XHJcbiAgICAgIC8vIFRoZSBmaXJzdCBQZXJmb3JtYW5jZSB0YWJsZSBjaGFuZ2VzIChBdWRpdCAvIFRhc2spLCBzbyBpdHMgc29ydCBzdGFydHMgb3Zlci5cclxuICAgICAgdGhpcy5wZXJmU29ydEtleSA9ICcnO1xyXG4gICAgICB0aGlzLnBlcmZTb3J0RGlyID0gJ2FzYyc7XHJcbiAgICB9XHJcbiAgICB0aGlzLm1vZHVsZVRhYiA9IHRhYjtcclxuICAgIGlmICh0YWIgPT09ICdUYXNrJyAmJiB0aGlzLnRhc2tzU3RhbGUpIHsgdGhpcy5sb2FkVGFza3MoKTsgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHNjb3BlTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHN0b3JlID0gdGhpcy5zdG9yZSA/IHRoaXMuc2NvcGVSb3dzLmZpbmQociA9PiBTdHJpbmcoci5yYXc/LnN0b3JlSWQpID09PSB0aGlzLnN0b3JlKSA6IHVuZGVmaW5lZDtcclxuICAgIHJldHVybiAoc3RvcmUgPyBzdG9yZS5yYXc/LnN0b3JlTmFtZSB8fCB0aGlzLnN0b3JlIDogdGhpcy5zdG9yZSkgfHwgdGhpcy5hb20gfHwgdGhpcy56b25lIHx8IHRoaXMuY2lyY2xlIHx8ICdBbGwgc3RvcmVzJztcclxuICB9XHJcblxyXG4gIGdldCBhdWRpdFR5cGVMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgdCA9IHRoaXMuYXVkaXRUeXBlcy5maW5kKHggPT4geC5rZXkgPT09IHRoaXMuYXVkaXRUeXBlKTtcclxuICAgIHJldHVybiB0ID8gdC5sYWJlbCA6ICdBbGwgQXVkaXRzJztcclxuICB9XHJcblxyXG4gIGdldCBzdGF0dXNGaWx0ZXJMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuc3RhdHVzID09PSAnYWxsJykgeyByZXR1cm4gJ0FsbCBzdG9yZXMnOyB9XHJcbiAgICBpZiAodGhpcy5zdGF0dXMgPT09ICdwYXNzJykgeyByZXR1cm4gJ1Bhc3Mgc3RvcmVzJzsgfVxyXG4gICAgaWYgKHRoaXMuc3RhdHVzID09PSAndW5zY29yZWQnKSB7IHJldHVybiAnTm90IHNjb3JlZCc7IH1cclxuICAgIHJldHVybiB0aGlzLnN0YXR1cyA9PT0gJ2ZhaWwnID8gJ0ZhaWwgc3RvcmVzJyA6ICdOb3QgYXVkaXRlZCc7XHJcbiAgfVxyXG5cclxuICBvcGVuRmlsdGVycyhjYXQ/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuZHJhZnQgPSBPYmplY3QuY3JlYXRlKHRoaXMpIGFzIEF1ZGl0VjJEYXNoYm9hcmRDb21wb25lbnQ7XHJcbiAgICB0aGlzLmFjdGl2ZUNhdCA9IGNhdCB8fCB0aGlzLmFjdGl2ZUNhdDtcclxuICAgIHRoaXMuZmlsdGVyc09wZW4gPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0Q2F0KGtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmFjdGl2ZUNhdCA9IGtleTtcclxuICB9XHJcblxyXG4gIGFwcGx5RmlsdGVycygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGQgPSB0aGlzLmRyYWZ0O1xyXG4gICAgY29uc3QgcGVyaW9kQ2hhbmdlZCA9ICEhZCAmJiAoZC5mcm9tICE9PSB0aGlzLmZyb20gfHwgZC50byAhPT0gdGhpcy50byk7XHJcbiAgICBpZiAoZCkge1xyXG4gICAgICBjb25zdCBzZWxmID0gdGhpcyBhcyBhbnk7XHJcbiAgICAgIEF1ZGl0VjJEYXNoYm9hcmRDb21wb25lbnQuRFJBRlRfS0VZUy5mb3JFYWNoKGsgPT4geyBzZWxmW2tdID0gKGQgYXMgYW55KVtrXTsgfSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBzY29wZUNoYW5nZWQgPSB0aGlzLmNvbW1pdFNjb3BlKCk7XHJcbiAgICB0aGlzLmRyYWZ0ID0gbnVsbDtcclxuICAgIHRoaXMuZmlsdGVyc09wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgICBpZiAocGVyaW9kQ2hhbmdlZCB8fCBzY29wZUNoYW5nZWQpIHsgdGhpcy5yZWxvYWRQZXJpb2QoKTsgfVxyXG4gICAgLy8gU2NvcmUgcmFuZ2UgYW5kIFN0YXR1cyBvbmx5IGZpbHRlciB0aGUgc3RvcmUgbGlzdCwgc28gc2hvdyBpdC5cclxuICAgIGlmICh0aGlzLmJhbmRGaWx0ZXJBY3RpdmUgfHwgdGhpcy5zdGF0dXMgIT09ICdhbGwnKSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkLXN0b3JlLWxpc3QnKT8uc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnc3RhcnQnIH0pKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBNYWtlIHRoZSBkcmF3ZXIncyBoaWVyYXJjaHkgKyBhdWRpdCB0eXBlIHRoZSBsb2FkZWQgb25lczsgdHJ1ZSB3aGVuIHRoZXkgZGlmZmVyIGZyb20gYmVmb3JlLiAqL1xyXG4gIHByaXZhdGUgY29tbWl0U2NvcGUoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBhID0gdGhpcy5hcHBsaWVkO1xyXG4gICAgY29uc3QgY2hhbmdlZCA9IGEuY2lyY2xlICE9PSB0aGlzLmNpcmNsZSB8fCBhLnpvbmUgIT09IHRoaXMuem9uZSB8fCBhLmFvbSAhPT0gdGhpcy5hb20gfHwgYS5zdG9yZSAhPT0gdGhpcy5zdG9yZVxyXG4gICAgICB8fCBhLmF1ZGl0VHlwZSAhPT0gdGhpcy5hdWRpdFR5cGU7XHJcbiAgICB0aGlzLmFwcGxpZWQgPSB7IGNpcmNsZTogdGhpcy5jaXJjbGUsIHpvbmU6IHRoaXMuem9uZSwgYW9tOiB0aGlzLmFvbSwgc3RvcmU6IHRoaXMuc3RvcmUsIGF1ZGl0VHlwZTogdGhpcy5hdWRpdFR5cGUgfTtcclxuICAgIHJldHVybiBjaGFuZ2VkO1xyXG4gIH1cclxuXHJcbiAgLyoqIENhbmNlbCAvIHggLyBiYWNrZHJvcDogdGhlIGRyYWZ0IGlzIGRyb3BwZWQ7IHRoZSBwYWdlIG5ldmVyIGNoYW5nZWQuICovXHJcbiAgY2FuY2VsRmlsdGVycygpOiB2b2lkIHtcclxuICAgIHRoaXMuZHJhZnQgPSBudWxsO1xyXG4gICAgdGhpcy5maWx0ZXJzT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJlc2V0IGV2ZXJ5IGZpbHRlciB0byB0aGUgZG9jdW1lbnRlZCBkZWZhdWx0cy4gKi9cclxuICBjbGVhckFsbCgpOiB2b2lkIHtcclxuICAgIHRoaXMuYXVkaXRUeXBlID0gJ2FsbCc7XHJcbiAgICB0aGlzLmdyYWluID0gJ2RhdGUnO1xyXG4gICAgdGhpcy5jaXJjbGUgPSAnJztcclxuICAgIHRoaXMuem9uZSA9ICcnO1xyXG4gICAgdGhpcy5hb20gPSAnJztcclxuICAgIHRoaXMuc3RvcmUgPSAnJztcclxuICAgIHRoaXMuc2NvcmVNaW4gPSAwO1xyXG4gICAgdGhpcy5zY29yZU1heCA9IDEwMDtcclxuICAgIHRoaXMuc3RhdHVzID0gJ2FsbCc7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gICAgLy8gVGhlIGNoaXBzJyBDbGVhciBhbGwgKGRyYXdlciBjbG9zZWQpIHJlbG9hZHMgbm93OyBpbnNpZGUgdGhlIGRyYXdlciwgQXBwbHkgZG9lcy5cclxuICAgIGlmICghdGhpcy5maWx0ZXJzT3BlbiAmJiB0aGlzLmNvbW1pdFNjb3BlKCkpIHsgdGhpcy5yZWxvYWRQZXJpb2QoKTsgfVxyXG4gIH1cclxuXHJcbiAgLyoqIENoYW5naW5nIGEgbGV2ZWwgY2xlYXJzIHRoZSBsZXZlbHMgYmVsb3cgaXQuICovXHJcbiAgb25DaXJjbGVDaGFuZ2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLnpvbmUgPSAnJztcclxuICAgIHRoaXMuYW9tID0gJyc7XHJcbiAgICB0aGlzLnN0b3JlID0gJyc7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgb25ab25lQ2hhbmdlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5hb20gPSAnJztcclxuICAgIHRoaXMuc3RvcmUgPSAnJztcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgfVxyXG5cclxuICBvbkFvbUNoYW5nZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RvcmUgPSAnJztcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgfVxyXG5cclxuICByZXNldFNjb3BlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jaXJjbGUgPSAnJztcclxuICAgIHRoaXMuem9uZSA9ICcnO1xyXG4gICAgdGhpcy5hb20gPSAnJztcclxuICAgIHRoaXMuc3RvcmUgPSAnJztcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgfVxyXG5cclxuICAvKiogU3RvcmUgZHJvcGRvd246IHRoZSBzdG9yZXMgb2YgdGhlIHBpY2tlZCBBT00sIGJ5IG5hbWUgKHZhbHVlID0gc3RvcmVJZCkuICovXHJcbiAgZ2V0IHN0b3JlUGlja09wdGlvbnMoKTogQXJyYXk8eyB2YWx1ZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH0+IHtcclxuICAgIGNvbnN0IHN0b3JlcyA9IHRoaXMuc2NvcGVSb3dzXHJcbiAgICAgIC5maWx0ZXIociA9PiB0aGlzLm1hdGNoZXNTY29wZShyLCB7IGNpcmNsZTogdGhpcy5jaXJjbGUsIHpvbmU6IHRoaXMuem9uZSwgYW9tOiB0aGlzLmFvbSwgc3RvcmU6ICcnIH0pKVxyXG4gICAgICAubWFwKHIgPT4gKHsgdmFsdWU6IFN0cmluZyhyLnJhdz8uc3RvcmVJZCB8fCAnJyksIGxhYmVsOiBTdHJpbmcoci5yYXc/LnN0b3JlTmFtZSB8fCAn4oCUJykgfSkpXHJcbiAgICAgIC5maWx0ZXIobyA9PiBvLnZhbHVlKVxyXG4gICAgICAuc29ydCgoYSwgYikgPT4gYS5sYWJlbC5sb2NhbGVDb21wYXJlKGIubGFiZWwpKTtcclxuICAgIHJldHVybiBbeyB2YWx1ZTogJycsIGxhYmVsOiAnQWxsIHN0b3JlcycgfV0uY29uY2F0KHN0b3Jlcyk7XHJcbiAgfVxyXG5cclxuICAvKiogT3B0aW9ucyBmb3IgdGhlIGRyYXdlcidzIGN1c3RvbSBkcm9wZG93bnMgKGxpYi1hdWRpdC12Mi1zZWxlY3QpOiBcIkFsbCDigKZcIiBmaXJzdCwgdGhlbiB0aGUgbGlzdC4gKi9cclxuICBwaWNrT3B0aW9ucyhsaXN0OiBzdHJpbmdbXSwgYWxsOiBzdHJpbmcpOiBBcnJheTx7IHZhbHVlOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfT4ge1xyXG4gICAgcmV0dXJuIFt7IHZhbHVlOiAnJywgbGFiZWw6IGFsbCB9XS5jb25jYXQoKGxpc3QgfHwgW10pLm1hcCh2ID0+ICh7IHZhbHVlOiB2LCBsYWJlbDogdiB9KSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBmaXJzdCBwZXJmb3JtYW5jZSB0YWIgaXMgbmFtZWQgYWZ0ZXIgdGhlIGFjdGl2ZSBtb2R1bGUuICovXHJcbiAgZ2V0IHBlcmZUYWJzRm9yTW9kdWxlKCk6IEFycmF5PCdBdWRpdCcgfCAnU3RvcmUnIHwgJ1VzZXInPiB7XHJcbiAgICByZXR1cm4gdGhpcy5wZXJmVGFicztcclxuICB9XHJcblxyXG4gIHBlcmZUYWJEaXNwbGF5KHRhYjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAodGFiID09PSAnQXVkaXQnID8gdGhpcy5tb2R1bGVUYWIgOiB0YWIpICsgJyBQZXJmb3JtYW5jZSc7XHJcbiAgfVxyXG5cclxuICBnZXQgcGVyZkluZm9UaXRsZSgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMucGVyZlRhYiA9PT0gJ1N0b3JlJykgeyByZXR1cm4gJ1N0b3JlcyBJbmZvJzsgfVxyXG4gICAgaWYgKHRoaXMucGVyZlRhYiA9PT0gJ1VzZXInKSB7IHJldHVybiAnVXNlciBJbmZvJzsgfVxyXG4gICAgcmV0dXJuIHRoaXMubW9kdWxlVGFiICsgJyBJbmZvJztcclxuICB9XHJcblxyXG4gIGdldCBwZXJmQ3JlYXRlTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAnKyBDcmVhdGUgJyArIHRoaXMubW9kdWxlVGFiO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzVGFza01vZHVsZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLm1vZHVsZVRhYiA9PT0gJ1Rhc2snO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZpbHRlcmVkVGFza1BlcmYoKTogVGFza1BlcmZSb3dbXSB7XHJcbiAgICBjb25zdCBxID0gdGhpcy5wZXJmU2VhcmNoLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuc29ydFBlcmZSb3dzKHEgPyB0aGlzLnRhc2tQZXJmLmZpbHRlcihyID0+IHIubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKSA6IHRoaXMudGFza1BlcmYsIHRoaXMudGFza1NvcnRWYWx1ZSk7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5UGVyZlRhc2soXzogbnVtYmVyLCByb3c6IFRhc2tQZXJmUm93KTogc3RyaW5nIHtcclxuICAgIHJldHVybiByb3cucmF3Py50YXNrSWQgfHwgcm93Lm5hbWU7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIHNlbGVjdGVkIHRyZW5kIGJ1Y2tldCBkcml2ZXMgdGhlIGhlYWRsaW5lIHNjb3JlIGFib3ZlIHRoZSBjaGFydC4gKi9cclxuICBwcml2YXRlIGdldCBmb2N1c0JhcigpOiBUcmVuZEJhciB8IHVuZGVmaW5lZCB7XHJcbiAgICBpZiAodGhpcy5ncmFpbiA9PT0gJ3F1YXJ0ZXInKSB7IHJldHVybiB0aGlzLnF1YXJ0ZXJUcmVuZC5maW5kKGIgPT4gYi5rZXkgPT09IHRoaXMucXVhcnRlcik7IH1cclxuICAgIHJldHVybiB0aGlzLnRyZW5kLmZpbmQoYiA9PiBiLmtleSA9PT0gdGhpcy5xdWFydGVyKSB8fCB0aGlzLnRyZW5kWzBdO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZvY3VzU2NvcmUoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGIgPSB0aGlzLmZvY3VzQmFyO1xyXG4gICAgaWYgKGIgJiYgYi52YWx1ZSAhPT0gbnVsbCkgeyByZXR1cm4gYi52YWx1ZSArICclJzsgfVxyXG4gICAgLy8gV2l0aCBubyB0cmVuZCBidWNrZXRzLCB0aGUgaGVhZGxpbmUgaXMgdGhlIHBlcmlvZCBhdmVyYWdlLlxyXG4gICAgY29uc3QgYXZnID0gdGhpcy5hdmVyYWdlU2NvcmU7XHJcbiAgICByZXR1cm4gYXZnID09PSBudWxsID8gJ+KAlCcgOiBhdmcgKyAnJSc7XHJcbiAgfVxyXG5cclxuICBnZXQgZm9jdXNQYXNzZWQoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBiID0gdGhpcy5mb2N1c0JhcjtcclxuICAgIGlmIChiICYmIGIudmFsdWUgIT09IG51bGwpIHsgcmV0dXJuIGIudmFsdWUgPj0gdGhpcy5wYXNzTWFyazsgfVxyXG4gICAgY29uc3QgYXZnID0gdGhpcy5hdmVyYWdlU2NvcmU7XHJcbiAgICByZXR1cm4gYXZnICE9PSBudWxsICYmIGF2ZyA+PSB0aGlzLnBhc3NNYXJrO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZvY3VzU3RhdHVzKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBiID0gdGhpcy5mb2N1c0JhcjtcclxuICAgIGNvbnN0IGhhcyA9IChiICYmIGIudmFsdWUgIT09IG51bGwpIHx8IHRoaXMuYXZlcmFnZVNjb3JlICE9PSBudWxsO1xyXG4gICAgaWYgKCFoYXMpIHsgcmV0dXJuICdObyBkYXRhJzsgfVxyXG4gICAgcmV0dXJuIHRoaXMuZm9jdXNQYXNzZWQgPyAnUGFzcycgOiAnQmVsb3cgcGFzcyBtYXJrJztcclxuICB9XHJcblxyXG4gIGdldCBmb2N1c0xpbmUoKTogc3RyaW5nIHtcclxuICAgIC8vIFN1Ym1pdHRlZCBhdWRpdHMsIGFzIHRoZSBiYXJzIGNvdW50IHRoZW0gKFwiMTAgYXVkaXRzXCIpOyBhdWRpdGVkQ291bnQgY291bnRzIGF1ZGl0ZWQgc3RvcmVzLlxyXG4gICAgY29uc3QgbiA9IHRoaXMuZ3JhaW4gPT09ICdxdWFydGVyJ1xyXG4gICAgICA/ICh0aGlzLmZvY3VzQmFyPy5zdWJtaXR0ZWQgPz8gMClcclxuICAgICAgOiB0aGlzLnRyZW5kLnJlZHVjZSgoc3VtLCBiKSA9PiBzdW0gKyAoYi5zdWJtaXR0ZWQgfHwgMCksIDApO1xyXG4gICAgcmV0dXJuIHRoaXMucGVyaW9kTGFiZWwgKyAnIMK3ICcgKyBuICsgKG4gPT09IDEgPyAnIGF1ZGl0IGNvbXBsZXRlZCcgOiAnIGF1ZGl0cyBjb21wbGV0ZWQnKVxyXG4gICAgICArICcgwrcgcGFzcyBtYXJrICcgKyB0aGlzLnBhc3NNYXJrICsgJyUnO1xyXG4gIH1cclxuXHJcbiAgc2V0UGVyZlRhYih0YWI6ICdBdWRpdCcgfCAnU3RvcmUnIHwgJ1VzZXInKTogdm9pZCB7XHJcbiAgICB0aGlzLnBlcmZUYWIgPSB0YWI7XHJcbiAgICB0aGlzLnBlcmZTZWFyY2ggPSAnJztcclxuICAgIHRoaXMucGVyZlNvcnRLZXkgPSAnJztcclxuICAgIHRoaXMucGVyZlNvcnREaXIgPSAnYXNjJztcclxuICAgIHRoaXMucGVyZlBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJvd3MgaW4gdGhlIG9wZW4gcGVyZm9ybWFuY2UgdGFibGUgYWZ0ZXIgc2VhcmNoIC8gc29ydCAod2hhdCB0aGUgcGFnZXIgY291bnRzKS4gKi9cclxuICBnZXQgcGVyZlRvdGFsKCk6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy5wZXJmVGFiID09PSAnQXVkaXQnKSB7IHJldHVybiB0aGlzLmlzVGFza01vZHVsZSA/IHRoaXMuZmlsdGVyZWRUYXNrUGVyZi5sZW5ndGggOiB0aGlzLmZpbHRlcmVkQXVkaXRQZXJmLmxlbmd0aDsgfVxyXG4gICAgcmV0dXJuIHRoaXMucGVyZlRhYiA9PT0gJ1N0b3JlJyA/IHRoaXMuZmlsdGVyZWRTdG9yZVBlcmYubGVuZ3RoIDogdGhpcy5maWx0ZXJlZFVzZXJQZXJmLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgY3VycmVudCBwYWdlIG9mIGEgcGVyZm9ybWFuY2UgdGFibGU7IGEgc2VhcmNoIHRoYXQgc2hyaW5rcyB0aGUgbGlzdCBwdWxscyB0aGUgcGFnZSBiYWNrIGludG8gcmFuZ2UuICovXHJcbiAgcGVyZlBhZ2VPZjxUPihsaXN0OiBUW10pOiBUW10ge1xyXG4gICAgY29uc3QgcGFnZXMgPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwobGlzdC5sZW5ndGggLyB0aGlzLnBlcmZQYWdlU2l6ZSkpO1xyXG4gICAgY29uc3QgcGFnZSA9IE1hdGgubWluKHRoaXMucGVyZlBhZ2UsIHBhZ2VzKTtcclxuICAgIHJldHVybiBsaXN0LnNsaWNlKChwYWdlIC0gMSkgKiB0aGlzLnBlcmZQYWdlU2l6ZSwgcGFnZSAqIHRoaXMucGVyZlBhZ2VTaXplKTtcclxuICB9XHJcblxyXG4gIG9uUGVyZlBhZ2UocGFnZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnBlcmZQYWdlID0gTnVtYmVyKHBhZ2UpIHx8IDE7XHJcbiAgfVxyXG5cclxuICBvblBlcmZQYWdlU2l6ZShzaXplOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMucGVyZlBhZ2VTaXplID0gTnVtYmVyKHNpemUpIHx8IDEwO1xyXG4gICAgdGhpcy5wZXJmUGFnZSA9IDE7XHJcbiAgfVxyXG5cclxuICAvKiogQSBuZXcgc2VhcmNoIHN0YXJ0cyBvbiBwYWdlIDEuICovXHJcbiAgb25QZXJmU2VhcmNoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5wZXJmUGFnZSA9IDE7XHJcbiAgfVxyXG5cclxuICAvKiogUGVyZm9ybWFuY2UgaGVhZGVyIGNsaWNrOiBzb3J0IGJ5IHRoYXQgY29sdW1uLCBhZ2FpbiB0byByZXZlcnNlIChzYW1lIHRvZ2dsZSBhcyB0aGUgc3RvcmUgbGlzdCkuICovXHJcbiAgc29ydFBlcmYoa2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnBlcmZTb3J0S2V5ID09PSBrZXkpIHtcclxuICAgICAgdGhpcy5wZXJmU29ydERpciA9IHRoaXMucGVyZlNvcnREaXIgPT09ICdhc2MnID8gJ2Rlc2MnIDogJ2FzYyc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnBlcmZTb3J0S2V5ID0ga2V5O1xyXG4gICAgICB0aGlzLnBlcmZTb3J0RGlyID0gJ2FzYyc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSb3dzIGluIHRoZSBwaWNrZWQgY29sdW1uIG9yZGVyICh0aGUgQVBJJ3Mgb3JkZXIgd2hlbiBub25lIGlzIHBpY2tlZCkuIE51bWJlcnMgY29tcGFyZSBhcyBudW1iZXJzLCB0ZXh0XHJcbiAgICogY2FzZS1pbnNlbnNpdGl2ZWx5OyBlbXB0eSB2YWx1ZXMgKCfigJQnKSBzdGF5IGF0IHRoZSBib3R0b20gaW4gYm90aCBkaXJlY3Rpb25zLCBhcyBpbiB0aGUgc3RvcmUgbGlzdC5cclxuICAgKi9cclxuICBwcml2YXRlIHNvcnRQZXJmUm93czxUPihyb3dzOiBUW10sIHZhbHVlczogUmVjb3JkPHN0cmluZywgKHI6IFQpID0+IFNvcnRWYWx1ZT4pOiBUW10ge1xyXG4gICAgY29uc3QgZ2V0ID0gdmFsdWVzW3RoaXMucGVyZlNvcnRLZXldO1xyXG4gICAgaWYgKCFnZXQpIHsgcmV0dXJuIHJvd3M7IH1cclxuICAgIGNvbnN0IGRpciA9IHRoaXMucGVyZlNvcnREaXIgPT09ICdhc2MnID8gMSA6IC0xO1xyXG4gICAgY29uc3QgZW1wdHkgPSAodjogU29ydFZhbHVlKSA9PiB2ID09PSBudWxsIHx8IHYgPT09IHVuZGVmaW5lZCB8fCB2ID09PSAnJyB8fCB2ID09PSAn4oCUJztcclxuICAgIHJldHVybiBbLi4ucm93c10uc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICBjb25zdCBhdiA9IGdldChhKTtcclxuICAgICAgY29uc3QgYnYgPSBnZXQoYik7XHJcbiAgICAgIGlmIChlbXB0eShhdikgfHwgZW1wdHkoYnYpKSB7IHJldHVybiBlbXB0eShhdikgPT09IGVtcHR5KGJ2KSA/IDAgOiAoZW1wdHkoYXYpID8gMSA6IC0xKTsgfVxyXG4gICAgICBpZiAodHlwZW9mIGF2ID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgYnYgPT09ICdudW1iZXInKSB7IHJldHVybiAoYXYgLSBidikgKiBkaXI7IH1cclxuICAgICAgcmV0dXJuIFN0cmluZyhhdikubG9jYWxlQ29tcGFyZShTdHJpbmcoYnYpLCB1bmRlZmluZWQsIHsgbnVtZXJpYzogdHJ1ZSwgc2Vuc2l0aXZpdHk6ICdiYXNlJyB9KSAqIGRpcjtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIFN1Ym1pdHRlZCBjb3VudCAtPiB0aGUgR2FsbGVyeSBvbiB0aGlzIGF1ZGl0J3Mgc3VibWlzc2lvbnMgaW4gdGhlIGRhc2hib2FyZCBwZXJpb2QuICovXHJcbiAgc3VibWl0dGVkUGFyYW1zKHJvdzogQXVkaXRQZXJmUm93KTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBhdWRpdDogU3RyaW5nKHJvdy5yYXc/LnNvdXJjZUNoZWNrTGlzdF9pZCB8fCByb3cucmF3Py5faWQgfHwgJycpLFxyXG4gICAgICBmcm9tOiB0aGlzLmZyb20gfHwgdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5zdGFydERhdGUgfHwgJycsXHJcbiAgICAgIHRvOiB0aGlzLnRvIHx8IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uZW5kRGF0ZSB8fCAnJ1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKiBUYXNrIFN1Ym1pdHRlZCBjb3VudCAtPiB0aGUgR2FsbGVyeSB3aXRoIFR5cGUgVGFzayBvbiB0aGlzIHRhc2sncyBzdWJtaXNzaW9ucyBpbiB0aGUgZGFzaGJvYXJkIHBlcmlvZC4gKi9cclxuICB0YXNrU3VibWl0dGVkUGFyYW1zKHJvdzogVGFza1BlcmZSb3cpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGF1ZGl0OiBTdHJpbmcocm93LnJhdz8udGFza0lkIHx8ICcnKSxcclxuICAgICAgdHlwZTogJ3Rhc2snLFxyXG4gICAgICBmcm9tOiB0aGlzLmZyb20gfHwgdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5zdGFydERhdGUgfHwgJycsXHJcbiAgICAgIHRvOiB0aGlzLnRvIHx8IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uZW5kRGF0ZSB8fCAnJ1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEF1ZGl0IC8gc3RvcmUgLyB1c2VyIGRldGFpbCBsaW5rOiB0aGUgc3ViamVjdCBwbHVzIHRoZSBkYXNoYm9hcmQgcGVyaW9kIChmcm9tIC8gdG8pLCBzbyB0aGUgZGV0YWlsXHJcbiAgICogcGFnZSBzaG93cyB0aGUgc2FtZSBkYXlzIGFzIHRoZSByb3cgY2xpY2tlZCwgbm90IHRoZSBoZWFkZXIgcmFuZ2UgKHRoZSBkYXNoYm9hcmQga2VlcHMgaXRzIG93biBwZXJpb2QpLlxyXG4gICAqL1xyXG4gIGRldGFpbFBhcmFtcyhzdWJqZWN0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUmVjb3JkPHN0cmluZywgYW55PiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAuLi5zdWJqZWN0LFxyXG4gICAgICBmcm9tOiB0aGlzLmZyb20gfHwgdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5zdGFydERhdGUgfHwgJycsXHJcbiAgICAgIHRvOiB0aGlzLnRvIHx8IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uZW5kRGF0ZSB8fCAnJ1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHBlcmZUYWJMYWJlbCh0YWI6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGFiICsgJyBQZXJmb3JtYW5jZSc7XHJcbiAgfVxyXG5cclxuICBnZXQgcGVyZlNlYXJjaFBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5wZXJmVGFiID09PSAnU3RvcmUnKSB7IHJldHVybiAnU2VhcmNoIGJ5IFN0b3JlIE5hbWUnOyB9XHJcbiAgICBpZiAodGhpcy5wZXJmVGFiID09PSAnVXNlcicpIHsgcmV0dXJuICdTZWFyY2ggYnkgVXNlciBOYW1lJzsgfVxyXG4gICAgcmV0dXJuICdTZWFyY2ggYnkgJyArIHRoaXMubW9kdWxlVGFiO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZpbHRlcmVkQXVkaXRQZXJmKCk6IEF1ZGl0UGVyZlJvd1tdIHtcclxuICAgIGNvbnN0IHEgPSB0aGlzLnBlcmZTZWFyY2gudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICByZXR1cm4gdGhpcy5zb3J0UGVyZlJvd3MocSA/IHRoaXMuYXVkaXRQZXJmLmZpbHRlcihyID0+IHIubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKSA6IHRoaXMuYXVkaXRQZXJmLCB0aGlzLmF1ZGl0U29ydFZhbHVlKTtcclxuICB9XHJcblxyXG4gIGdldCBmaWx0ZXJlZFN0b3JlUGVyZigpOiBTdG9yZVBlcmZSb3dbXSB7XHJcbiAgICBjb25zdCBxID0gdGhpcy5wZXJmU2VhcmNoLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuc29ydFBlcmZSb3dzKHEgPyB0aGlzLnN0b3JlUGVyZi5maWx0ZXIociA9PiAoci5zdG9yZSArICcgJyArIHIuc3RvcmVJZCArICcgJyArIHIuc3BvYykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSkgOiB0aGlzLnN0b3JlUGVyZiwgdGhpcy5zdG9yZVNvcnRWYWx1ZSk7XHJcbiAgfVxyXG5cclxuICBnZXQgZmlsdGVyZWRVc2VyUGVyZigpOiBVc2VyUGVyZlJvd1tdIHtcclxuICAgIGNvbnN0IHEgPSB0aGlzLnBlcmZTZWFyY2gudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICByZXR1cm4gdGhpcy5zb3J0UGVyZlJvd3MocSA/IHRoaXMudXNlclBlcmYuZmlsdGVyKHIgPT4gKHIubmFtZSArICcgJyArIHIuZW1haWwpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkpIDogdGhpcy51c2VyUGVyZiwgdGhpcy51c2VyU29ydFZhbHVlKTtcclxuICB9XHJcblxyXG4gIHRyYWNrQnlQZXJmQXVkaXQoXzogbnVtYmVyLCByb3c6IEF1ZGl0UGVyZlJvdyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcm93LnJhdz8uc291cmNlQ2hlY2tMaXN0X2lkIHx8IHJvdy5uYW1lO1xyXG4gIH1cclxuXHJcbiAgdHJhY2tCeVBlcmZTdG9yZShfOiBudW1iZXIsIHJvdzogU3RvcmVQZXJmUm93KTogc3RyaW5nIHtcclxuICAgIHJldHVybiByb3cuc3RvcmVJZCB8fCByb3cuc3RvcmU7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5UGVyZlVzZXIoXzogbnVtYmVyLCByb3c6IFVzZXJQZXJmUm93KTogc3RyaW5nIHtcclxuICAgIHJldHVybiByb3cuZW1haWw7XHJcbiAgfVxyXG5cclxuICBvblBhZ2VDaGFuZ2UocGFnZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnBhZ2UgPSBOdW1iZXIocGFnZSkgfHwgMTtcclxuICB9XHJcblxyXG4gIG9uUGFnZVNpemVDaGFuZ2Uoc2l6ZTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnBhZ2VTaXplID0gTnVtYmVyKHNpemUpIHx8IDEwO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICB9XHJcblxyXG4gIHRyYWNrQnlTdG9yZShfOiBudW1iZXIsIHJvdzogQXVkaXRSb3cpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHJvdy5zdG9yZUlkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogZmlsdGVyQ2F0cyAvIGJhbmRSb3dzIGFyZSBnZXR0ZXJzIHRoYXQgYnVpbGQgbmV3IG9iamVjdHMgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvbi4gV2l0aG91dCBhIGtleVxyXG4gICAqIG5nRm9yIHJlYnVpbGRzIHRoZWlyIGJ1dHRvbnMgb24gZWFjaCBwYXNzLCBhbmQgYSBwYXNzIGJldHdlZW4gbW91c2Vkb3duIGFuZCBtb3VzZXVwICh0aGUgaGllcmFyY2h5XHJcbiAgICogZHJvcGRvd24gbGlzdGVucyB0byBkb2N1bWVudDptb3VzZWRvd24pIHN3YWxsb3dzIHRoZSBjbGljay5cclxuICAgKi9cclxuICB0cmFja0J5Q2F0KF86IG51bWJlciwgYzogRmlsdGVyQ2F0KTogc3RyaW5nIHtcclxuICAgIHJldHVybiBjLmtleTtcclxuICB9XHJcblxyXG4gIHRyYWNrQnlCYW5kKF86IG51bWJlciwgYjogeyBiYW5kOiBBdWRpdEJhbmQgfSk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYi5iYW5kLmtleTtcclxuICB9XHJcblxyXG4gIC8qKiAtLS0tIEV4cG9ydCAoY2xpZW50LXNpZGUgLnhsc3ggb2YgZXhhY3RseSB0aGUgZmlsdGVyZWQgcm93cyBhbmQgdmlzaWJsZSBjb2x1bW5zKSAtLS0tICovXHJcblxyXG4gIHByaXZhdGUgZ2V0IGV4cG9ydFBlcmlvZCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZnJvbSArICdfJyArIHRoaXMudG87XHJcbiAgfVxyXG5cclxuICAvKiogSGVhZGVyIEV4cG9ydDogdGhlIHN0b3JlIGxpc3QgYmVsb3cgdGhlIGZpbHRlcnMsIGV2ZXJ5IGZpbHRlcmVkIHJvdyAoYWxsIHBhZ2VzKSwgaXRzIHZpc2libGUgY29sdW1ucy4gKi9cclxuICBleHBvcnRTdG9yZXMoKTogdm9pZCB7XHJcbiAgICBjb25zdCByb3dzID0gdGhpcy5maWx0ZXJlZFJvd3M7XHJcbiAgICBpZiAodGhpcy5sb2FkaW5nIHx8ICFyb3dzLmxlbmd0aCkgeyByZXR1cm47IH1cclxuICAgIGNvbnN0IGNvbHVtbnM6IEV4cG9ydENvbHVtbjxBdWRpdFJvdz5bXSA9IHRoaXMuaGVhZGVycy5tYXAoaCA9PiAoe1xyXG4gICAgICBoZWFkZXI6IGgubGFiZWwsXHJcbiAgICAgIHZhbHVlOiAocjogQXVkaXRSb3cpID0+IHtcclxuICAgICAgICBpZiAoaC5rZXkgPT09ICdzY29yZScpIHsgcmV0dXJuIHIuc2NvcmUgPT09IG51bGwgPyAn4oCUJyA6IHIuc2NvcmUgKyAnJSc7IH1cclxuICAgICAgICBpZiAoaC5rZXkgPT09ICdzdGF0dXMnKSB7IHJldHVybiB0aGlzLnN0YXR1c0xhYmVsKHIpOyB9XHJcbiAgICAgICAgcmV0dXJuIHJbaC5rZXkgYXMga2V5b2YgQXVkaXRSb3ddO1xyXG4gICAgICB9XHJcbiAgICB9KSk7XHJcbiAgICB0aGlzLnRyYXhTZXJ2aWNlLmV4cG9ydFJvd3NYbHN4KHJvd3MsIGNvbHVtbnMsICdBdWRpdC1EYXNoYm9hcmQtU3RvcmVzLScgKyB0aGlzLmV4cG9ydFBlcmlvZCwgJ1N0b3JlIGxpc3QnKTtcclxuICB9XHJcblxyXG4gIC8qKiBSb3dzIG9mIHRoZSBhY3RpdmUgcGVyZm9ybWFuY2UgdGFiIGFmdGVyIGl0cyBzZWFyY2ggKHdoYXQgdGhlIFwiVG90YWxcIiBjb3VudGVyIHNob3dzKS4gKi9cclxuICBnZXQgcGVyZlJvd0NvdW50KCk6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy5wZXJmVGFiID09PSAnU3RvcmUnKSB7IHJldHVybiB0aGlzLmZpbHRlcmVkU3RvcmVQZXJmLmxlbmd0aDsgfVxyXG4gICAgaWYgKHRoaXMucGVyZlRhYiA9PT0gJ1VzZXInKSB7IHJldHVybiB0aGlzLmZpbHRlcmVkVXNlclBlcmYubGVuZ3RoOyB9XHJcbiAgICByZXR1cm4gdGhpcy5pc1Rhc2tNb2R1bGUgPyB0aGlzLmZpbHRlcmVkVGFza1BlcmYubGVuZ3RoIDogdGhpcy5maWx0ZXJlZEF1ZGl0UGVyZi5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIGFjdGl2ZSBwZXJmb3JtYW5jZSB0YWIgaXMgc3RpbGwgbG9hZGluZyAodGhlIFRhc2sgdGFibGUgaGFzIGl0cyBvd24gZmVlZCkuICovXHJcbiAgZ2V0IHBlcmZMb2FkaW5nKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMucGVyZlRhYiA9PT0gJ0F1ZGl0JyAmJiB0aGlzLmlzVGFza01vZHVsZSA/IHRoaXMudGFza0xvYWRpbmcgOiB0aGlzLmxvYWRpbmc7XHJcbiAgfVxyXG5cclxuICAvKiogUGVyZm9ybWFuY2UgRXhwb3J0OiB0aGUgYWN0aXZlIHRhYidzIGZpbHRlcmVkIGxpc3Qgd2l0aCBpdHMgdmlzaWJsZSBjb2x1bW4gaGVhZGVycyAoQWN0aW9uIGxlZnQgb3V0KS4gKi9cclxuICBleHBvcnRQZXJmb3JtYW5jZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnBlcmZMb2FkaW5nIHx8ICF0aGlzLnBlcmZSb3dDb3VudCkgeyByZXR1cm47IH1cclxuICAgIGNvbnN0IHBlcmlvZCA9IHRoaXMuZXhwb3J0UGVyaW9kO1xyXG4gICAgaWYgKHRoaXMucGVyZlRhYiA9PT0gJ1N0b3JlJykge1xyXG4gICAgICBjb25zdCBjb2x1bW5zOiBFeHBvcnRDb2x1bW48U3RvcmVQZXJmUm93PltdID0gW1xyXG4gICAgICAgIHsgaGVhZGVyOiAnU3RvcmUgTmFtZScsIHZhbHVlOiByID0+IHIuc3RvcmUgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ1N0b3JlIElEJywgdmFsdWU6IHIgPT4gci5zdG9yZUlkIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdTdG9yZSBTcG9jJywgdmFsdWU6IHIgPT4gci5zcG9jIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdBc3NpZ25lZCcsIHZhbHVlOiByID0+IHIuYXNzaWduZWQgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ0ZsYWdzJywgdmFsdWU6IHIgPT4gci5mbGFncyA/PyAn4oCUJyB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnQ29tcGxldGlvbiAlJywgdmFsdWU6IHIgPT4gci5jb21wbGV0aW9uIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdDb21wbGlhbmNlICUnLCB2YWx1ZTogciA9PiByLmNvbXBsaWFuY2UgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ1BlcmZvcm1hbmNlICUnLCB2YWx1ZTogciA9PiByLnBlcmYgfVxyXG4gICAgICBdO1xyXG4gICAgICB0aGlzLnRyYXhTZXJ2aWNlLmV4cG9ydFJvd3NYbHN4KHRoaXMuZmlsdGVyZWRTdG9yZVBlcmYsIGNvbHVtbnMsICdBdWRpdC1EYXNoYm9hcmQtU3RvcmUtUGVyZm9ybWFuY2UtJyArIHBlcmlvZCwgJ1N0b3JlIFBlcmZvcm1hbmNlJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnBlcmZUYWIgPT09ICdVc2VyJykge1xyXG4gICAgICBjb25zdCBjb2x1bW5zOiBFeHBvcnRDb2x1bW48VXNlclBlcmZSb3c+W10gPSBbXHJcbiAgICAgICAgeyBoZWFkZXI6ICdVc2VyIE5hbWUnLCB2YWx1ZTogciA9PiByLm5hbWUgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ0VtYWlsJywgdmFsdWU6IHIgPT4gci5lbWFpbCB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnQXNzaWduZWQnLCB2YWx1ZTogciA9PiByLmFzc2lnbmVkIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdGbGFncycsIHZhbHVlOiByID0+IHIuZmxhZ3MgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ1JlRG8nLCB2YWx1ZTogciA9PiByLnJlZG8gfSxcclxuICAgICAgICB7IGhlYWRlcjogJ0NvbXBsZXRpb24gJScsIHZhbHVlOiByID0+IHIuY29tcGxldGlvbiB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnQ29tcGxpYW5jZSAlJywgdmFsdWU6IHIgPT4gci5jb21wbGlhbmNlIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdQZXJmb3JtYW5jZSAlJywgdmFsdWU6IHIgPT4gci5wZXJmIH1cclxuICAgICAgXTtcclxuICAgICAgdGhpcy50cmF4U2VydmljZS5leHBvcnRSb3dzWGxzeCh0aGlzLmZpbHRlcmVkVXNlclBlcmYsIGNvbHVtbnMsICdBdWRpdC1EYXNoYm9hcmQtVXNlci1QZXJmb3JtYW5jZS0nICsgcGVyaW9kLCAnVXNlciBQZXJmb3JtYW5jZScpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5pc1Rhc2tNb2R1bGUpIHtcclxuICAgICAgY29uc3QgY29sdW1uczogRXhwb3J0Q29sdW1uPFRhc2tQZXJmUm93PltdID0gW1xyXG4gICAgICAgIHsgaGVhZGVyOiAnVGFzayBOYW1lJywgdmFsdWU6IHIgPT4gci5uYW1lIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdTY2hlZHVsZWQnLCB2YWx1ZTogciA9PiByLnNjaGVkdWxlZCB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnQ292ZXJhZ2UnLCB2YWx1ZTogciA9PiByLmNvdmVyYWdlIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdBc3NpZ25lZCBUbycsIHZhbHVlOiByID0+IHIuYXNzaWduZWQgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ1N1Ym1pdHRlZCcsIHZhbHVlOiByID0+IHIuc3VibWl0dGVkIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdGbGFncycsIHZhbHVlOiByID0+IHIuZmxhZ3MgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ1Rhc2tzJywgdmFsdWU6IHIgPT4gci50YXNrcyB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnUmVEbycsIHZhbHVlOiByID0+IHIucmVkbyB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnUXVlc3Rpb24gQ29tcGxpYW5jZSAlJywgdmFsdWU6IHIgPT4gci5jb21wbGlhbmNlIH1cclxuICAgICAgXTtcclxuICAgICAgdGhpcy50cmF4U2VydmljZS5leHBvcnRSb3dzWGxzeCh0aGlzLmZpbHRlcmVkVGFza1BlcmYsIGNvbHVtbnMsICdBdWRpdC1EYXNoYm9hcmQtVGFzay1QZXJmb3JtYW5jZS0nICsgcGVyaW9kLCAnVGFzayBQZXJmb3JtYW5jZScpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBjb2x1bW5zOiBFeHBvcnRDb2x1bW48QXVkaXRQZXJmUm93PltdID0gW1xyXG4gICAgICB7IGhlYWRlcjogJ0F1ZGl0IE5hbWUnLCB2YWx1ZTogciA9PiByLm5hbWUgfSxcclxuICAgICAgeyBoZWFkZXI6ICdBc3NpZ25lZCBUbycsIHZhbHVlOiByID0+IHIuYXNzaWduZWQgfSxcclxuICAgICAgeyBoZWFkZXI6ICdTdWJtaXR0ZWQnLCB2YWx1ZTogciA9PiByLnN1Ym1pdHRlZCB9LFxyXG4gICAgICB7IGhlYWRlcjogJ0Rpc3B1dGVzJywgdmFsdWU6IHIgPT4gci5kaXNwdXRlcyA/PyAn4oCUJyB9LFxyXG4gICAgICB7IGhlYWRlcjogJ1Bhc3MgTWFyaycsIHZhbHVlOiByID0+IHIucGFzc01hcmsgfSxcclxuICAgICAgeyBoZWFkZXI6ICdTY29yZScsIHZhbHVlOiByID0+IHIuc2NvcmUgfSxcclxuICAgICAgeyBoZWFkZXI6ICdSZXN1bHQnLCB2YWx1ZTogciA9PiByLnJlc3VsdCB9XHJcbiAgICBdO1xyXG4gICAgdGhpcy50cmF4U2VydmljZS5leHBvcnRSb3dzWGxzeCh0aGlzLmZpbHRlcmVkQXVkaXRQZXJmLCBjb2x1bW5zLCAnQXVkaXQtRGFzaGJvYXJkLUF1ZGl0LVBlcmZvcm1hbmNlLScgKyBwZXJpb2QsICdBdWRpdCBQZXJmb3JtYW5jZScpO1xyXG4gIH1cclxuXHJcbiAgLyoqIC0tLS0gUGVyLXN0b3JlIFBERiAtLS0tICovXHJcblxyXG4gIC8qKiBUaGUgc3RvcmUncyBsYXRlc3Qgc3VibWl0dGVkIGF1ZGl0IGluIHRoZSBwZXJpb2QgKHRoZSBkYXNoYm9hcmQgQVBJJ3MgbGFzdFZpc2l0SWQpLCBpZiBhbnkuICovXHJcbiAgcGRmVmlzaXRJZChyb3c6IEF1ZGl0Um93KTogc3RyaW5nIHtcclxuICAgIHJldHVybiByb3cucmF3Py5sYXN0VmlzaXRJZCA/IFN0cmluZyhyb3cucmF3Lmxhc3RWaXNpdElkKSA6ICcnO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBhdWRpdCBvZiB0aGF0IGxhdGVzdCBzdWJtaXNzaW9uIChsYXN0VmlzaXRBdWRpdElkKTogVmlldyBvcGVucyBpdCBpbiB0aGUgR2FsbGVyeS4gJycgd2l0aG91dCBvbmUuICovXHJcbiAgZ2FsbGVyeUF1ZGl0SWQocm93OiBBdWRpdFJvdyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcm93LnJhdz8ubGFzdFZpc2l0QXVkaXRJZCA/IFN0cmluZyhyb3cucmF3Lmxhc3RWaXNpdEF1ZGl0SWQpIDogJyc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTYW1lIFBERiBkb3dubG9hZCBhcyB0aGUgZGV0YWlsIHBhZ2VzJyBEb3dubG9hZCwgZm9yIHRoZSBzdG9yZSdzIGxhdGVzdCBzdWJtaXR0ZWQgYXVkaXQ6XHJcbiAgICogcXVldWVkLCB0aGVuIGxpc3RlZCB1bmRlciBOb3RpZmljYXRpb25zID4gRG93bmxvYWRzLlxyXG4gICAqL1xyXG4gIGRvd25sb2FkUGRmKHJvdzogQXVkaXRSb3cpOiB2b2lkIHtcclxuICAgIGNvbnN0IHZpc2l0SWQgPSB0aGlzLnBkZlZpc2l0SWQocm93KTtcclxuICAgIGlmICghdmlzaXRJZCB8fCB0aGlzLnBkZlF1ZXVlZC5oYXModmlzaXRJZCkpIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLnBkZlF1ZXVlZC5hZGQodmlzaXRJZCk7XHJcbiAgICBjb25zdCB1c2VyID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlci1pbmZvJykgfHwgJ3t9Jyk7XHJcbiAgICBjb25zdCBzdG9yZUlkID0gcm93LnJhdz8uc3RvcmVJZCB8fCByb3cuc3RvcmVJZDtcclxuICAgIC8vIFRoZSBkb3dubG9hZCBuYW1lIGlzIG1hdGNoZWQgYXMgYSByZWd1bGFyIGV4cHJlc3Npb24gc2VydmVyLXNpZGUsIHNvIGxlYXZlIHJlZ2V4IGNoYXJhY3RlcnMgb3V0LlxyXG4gICAgY29uc3QgbmFtZSA9IFN0cmluZyhyb3cucmF3Py5zdG9yZU5hbWUgfHwgc3RvcmVJZCkucmVwbGFjZSgvW1xcXFxeJC4qKz8oKVtcXF17fXxdL2csICcgJykudHJpbSgpICsgJyBhdWRpdCc7XHJcbiAgICB0aGlzLnRyYXhTZXJ2aWNlLnJlcG9ydFRhYmxlRXhwb3J0KHtcclxuICAgICAgZnJvbURhdGU6IHRoaXMuZnJvbSB8fCB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LnN0YXJ0RGF0ZSxcclxuICAgICAgdG9EYXRlOiB0aGlzLnRvIHx8IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uZW5kRGF0ZSxcclxuICAgICAgY2hlY2tsaXN0SWQ6IFt2aXNpdElkXSxcclxuICAgICAgc291cmNlQ2hlY2tMaXN0X2lkOiAnJyxcclxuICAgICAgY2hlY2tsaXN0TmFtZTogbmFtZSxcclxuICAgICAgZmlsZVR5cGU6ICdwZGYnLFxyXG4gICAgICBzdG9yZUlkczogW3N0b3JlSWRdLFxyXG4gICAgICB1c2VySWQ6IHVzZXI/Ll9pZCxcclxuICAgICAgY2xpZW50SWQ6IHRoaXMuaGVhZGVyRGF0YT8uY2xpZW50LFxyXG4gICAgICBkb3dubG9hZEluc2VydEZyb206ICdkYXNoYm9hcmQnLFxyXG4gICAgICBpbnNlcnRUeXBlOiAnY2hlY2tsaXN0JyxcclxuICAgICAgY2hlY2tMaXN0VHlwZTogJ2N1c3RvbSdcclxuICAgIH0pLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnBkZlF1ZXVlZC5kZWxldGUodmlzaXRJZCk7XHJcbiAgICAgICAgaWYgKHJlcz8uY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdCgnRG93bmxvYWRpbmcgeW91ciByZXBvcnQuIEZpbmQgaXQgdW5kZXIgTm90aWZpY2F0aW9ucyA+IERvd25sb2Fkcy4nKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5wZGZRdWV1ZWQuZGVsZXRlKHZpc2l0SWQpO1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnU29tZXRoaW5nIHdlbnQgd3JvbmchJyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiYXYyLXBhZ2UgYXVkaXQtZGFzaFwiPlxyXG5cclxuICA8IS0tIFJlZnJlc2ggbGluZSArIG1vZHVsZSBzd2l0Y2ggLS0+XHJcbiAgPGRpdiBjbGFzcz1cImRiLXRvcGxpbmVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkYi1yZWZyZXNoXCI+TGFzdCByZWZyZXNoZWQgYXQge3sgbGFzdFJlZnJlc2hlZCB9fTwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImF2Mi1ncm93XCI+PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kdWxlc3dpdGNoXCI+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibW9kdWxldGFiXCIgKm5nRm9yPVwibGV0IHQgb2YgbW9kdWxlVGFic1wiIFtjbGFzcy5tb2R1bGV0YWItb25dPVwibW9kdWxlVGFiID09PSB0XCJcclxuICAgICAgICAoY2xpY2spPVwic2V0TW9kdWxlVGFiKHQpXCI+e3sgdCB9fTwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gPT09PT09PT09PT09IEFVRElUIFNDT1JFQ0FSRCA9PT09PT09PT09PT0gLS0+XHJcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1Rhc2tNb2R1bGVcIj5cclxuXHJcbiAgICA8IS0tIENydW1iLCBzY29wZSB0aXRsZSwgYWN0aW9ucyAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJkYi1zY29wZWJhclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZGItc2NvcGV0ZXh0XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLWNydW1iXCI+QXVkaXRzIOKAuiBEYXNoYm9hcmQ8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc2NvcGVcIj57eyBzY29wZUxhYmVsIH19PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tZ2hvc3QgYXYyLWJ0bi0tc21cIiAoY2xpY2spPVwib3BlbkZpbHRlcnMoKVwiPlxyXG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS44XCJcclxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgPGxpbmUgeDE9XCI0XCIgeTE9XCI3XCIgeDI9XCIyMFwiIHkyPVwiN1wiPjwvbGluZT5cclxuICAgICAgICAgIDxsaW5lIHgxPVwiN1wiIHkxPVwiMTJcIiB4Mj1cIjE3XCIgeTI9XCIxMlwiPjwvbGluZT5cclxuICAgICAgICAgIDxsaW5lIHgxPVwiMTBcIiB5MT1cIjE3XCIgeDI9XCIxNFwiIHkyPVwiMTdcIj48L2xpbmU+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgRmlsdGVyc1xyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZGItY291bnRwaWxsXCIgKm5nSWY9XCJmaWx0ZXJDb3VudFwiPnt7IGZpbHRlckNvdW50IH19PC9zcGFuPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGF2Mi1idG4tLWdob3N0IGF2Mi1idG4tLXNtXCIgW2Rpc2FibGVkXT1cImxvYWRpbmcgfHwgIWZpbHRlcmVkUm93cy5sZW5ndGhcIlxyXG4gICAgICAgIHRpdGxlPVwiRG93bmxvYWQgdGhlIHN0b3JlIGxpc3QgYmVsb3cgYXMgYW4gRXhjZWwgZmlsZVwiIChjbGljayk9XCJleHBvcnRTdG9yZXMoKVwiPlxyXG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS44XCJcclxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgPHBhdGggZD1cIk0xMiAxNlY0XCI+PC9wYXRoPlxyXG4gICAgICAgICAgPHBvbHlsaW5lIHBvaW50cz1cIjcgOSAxMiA0IDE3IDlcIj48L3BvbHlsaW5lPlxyXG4gICAgICAgICAgPHBhdGggZD1cIk00IDE2djRoMTZ2LTRcIj48L3BhdGg+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgRXhwb3J0XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBGaWx0ZXIgY2hpcHMgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZGItY2hpcHNcIj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJkYi1jaGlwXCIgKm5nRm9yPVwibGV0IGMgb2YgZmlsdGVyQ2F0czsgdHJhY2tCeTogdHJhY2tCeUNhdFwiIFtjbGFzcy5pcy1kaXJ0eV09XCJjLmRpcnR5XCJcclxuICAgICAgICAoY2xpY2spPVwib3BlbkZpbHRlcnMoYy5rZXkpXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1jaGlwLWxhYmVsXCI+e3sgYy5sYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWNoaXAtdmFsdWVcIj57eyBjLnZhbHVlIH19PC9zcGFuPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJkYi1jbGVhcmFsbFwiICpuZ0lmPVwiZmlsdGVyQ291bnRcIiAoY2xpY2spPVwiY2xlYXJBbGwoKVwiPkNsZWFyIGFsbDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBLUEkgdGlsZXMgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZGIta3Bpc1wiPlxyXG4gICAgICA8IS0tIE9sZCBDaGVja2xpc3Qgc3VtbWFyeSBjYXJkOiBmaWd1cmUgKyBsYWJlbCBpbiB0aGUgZ3JhZGllbnQgc3RyaXAsIG5vdGUgYmVsb3cuIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYXYyLW9jYXJkXCIgKm5nRm9yPVwibGV0IGtwaSBvZiBrcGlzXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1vY2FyZC1oZWFkXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLW9jYXJkLWNvdW50XCI+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwibG9hZGluZ1wiIGNsYXNzPVwiYXYyLXNrIGF2Mi1zay0tdmFsdWUgZGItc2stdmFsdWVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbG9hZGluZ1wiPnt7IGtwaS52YWx1ZSB9fTwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLW9jYXJkLXRleHRcIj57eyBrcGkubGFiZWwgfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLW9jYXJkLWJvZHlcIj5cclxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwibG9hZGluZ1wiIGNsYXNzPVwiYXYyLXNrIGF2Mi1zay0tbm90ZVwiPjwvc3Bhbj5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCIhbG9hZGluZ1wiIGNsYXNzPVwiYXYyLW9jYXJkLW5vdGVcIiBbc3R5bGUuY29sb3JdPVwia3BpLm5vdGVDb2xvclwiPnt7IGtwaS5ub3RlIH19PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBUcmVuZCArIGRpc3RyaWJ1dGlvbiAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJkYi1kdW9cIj5cclxuICAgICAgPCEtLSBUcmVuZCAtLT5cclxuICAgICAgPHNlY3Rpb24gY2xhc3M9XCJkYi1jYXJkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLWNhcmQtaGVhZCBkYi1jYXJkLWhlYWQtLXdyYXBcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jYXJkLXRpdGxlIGRiLWNhcmQtdGl0bGUtLWdyb3dcIj5BdWRpdCBzY29yZSB0cmVuZDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXNlZ1wiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImRiLXNlZy10YWJcIiBbY2xhc3MuaXMtb25dPVwiZ3JhaW4gPT09ICdxdWFydGVyJ1wiIChjbGljayk9XCJzZXRHcmFpbigncXVhcnRlcicpXCI+UXVhcnRlcmx5PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZGItc2VnLXRhYlwiIFtjbGFzcy5pcy1vbl09XCJncmFpbiA9PT0gJ2RhdGUnXCIgKGNsaWNrKT1cInNldEdyYWluKCdkYXRlJylcIj5CeSBkYXRlPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLWRhdGVyb3dcIiAqbmdJZj1cImdyYWluID09PSAnZGF0ZSdcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZGF0ZXBpY2tcIj5cclxuICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImF2Mi1kYXRlcGljay1pY29uXCIgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHJlY3QgeD1cIjNcIiB5PVwiNFwiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHJ4PVwiMlwiPjwvcmVjdD5cclxuICAgICAgICAgICAgICA8bGluZSB4MT1cIjE2XCIgeTE9XCIyXCIgeDI9XCIxNlwiIHkyPVwiNlwiPjwvbGluZT48bGluZSB4MT1cIjhcIiB5MT1cIjJcIiB4Mj1cIjhcIiB5Mj1cIjZcIj48L2xpbmU+PGxpbmUgeDE9XCIzXCIgeTE9XCIxMFwiIHgyPVwiMjFcIiB5Mj1cIjEwXCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImF2Mi1kYXRlcGljay1pbnB1dCBkYi1kYXRlcmFuZ2VcIiBuZ3hEYXRlcmFuZ2VwaWNrZXJNZCByZWFkb25seSBhdXRvY29tcGxldGU9XCJvZmZcIlxyXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGRhdGUgcmFuZ2VcIiBbKG5nTW9kZWwpXT1cInJhbmdlXCIgW2xvY2FsZV09XCJwaWNrZXJMb2NhbGVcIiBbbWF4RGF0ZV09XCJ0b2RheVwiXHJcbiAgICAgICAgICAgICAgW2RhdGVMaW1pdF09XCJtYXhSYW5nZURheXNcIiBbcmFuZ2VzXT1cInJhbmdlc1wiIFtzaG93Q3VzdG9tUmFuZ2VMYWJlbF09XCJ0cnVlXCIgW2Fsd2F5c1Nob3dDYWxlbmRhcnNdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgIFtrZWVwQ2FsZW5kYXJPcGVuaW5nV2l0aFJhbmdlXT1cInRydWVcIiBbYXV0b0FwcGx5XT1cInRydWVcIiBbc2hvd0NhbmNlbF09XCJmYWxzZVwiIFtkcm9wc109XCInZG93bidcIiBbb3BlbnNdPVwiJ3JpZ2h0J1wiXHJcbiAgICAgICAgICAgICAgKGRhdGVzVXBkYXRlZCk9XCJvblJhbmdlUGlja2VkKCRldmVudClcIj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidHJlbmRMb2FkaW5nXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImF2Mi1zayBhdjItc2stLXRpdGxlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdjItc2sgYXYyLXNrLS1ibG9jayBkYi1zay1jaGFydFwiPjwvc3Bhbj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0cmVuZExvYWRpbmdcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItZm9jdXNcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItZm9jdXMtc2NvcmVcIiBbY2xhc3MuaXMtZmFpbF09XCIhZm9jdXNQYXNzZWRcIj57eyBmb2N1c1Njb3JlIH19PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1mb2N1cy1waWxsXCIgW2NsYXNzLmlzLXBhc3NdPVwiZm9jdXNQYXNzZWRcIiBbY2xhc3MuaXMtZmFpbF09XCIhZm9jdXNQYXNzZWRcIj57eyBmb2N1c1N0YXR1cyB9fTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItZm9jdXMtbGluZVwiPnt7IGZvY3VzTGluZSB9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLWxlZ2VuZFwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1sZWdlbmQtZGFzaFwiPjwvc3Bhbj5QYXNzIG1hcmsge3sgcGFzc01hcmsgfX0lXHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jaGFydFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLWNoYXJ0LXlcIj5cclxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJ0b3A6MFwiPjEwMCU8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwidG9wOjUwJVwiPjUwJTwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJ0b3A6MTAwJVwiPjAlPC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY2hhcnQtYXJlYVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWdyaWRsaW5lXCIgc3R5bGU9XCJ0b3A6MFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1ncmlkbGluZVwiIHN0eWxlPVwidG9wOjUwJVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1ncmlkbGluZVwiIHN0eWxlPVwidG9wOjEwMCVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItcGFzc2xpbmVcIiBbc3R5bGUudG9wLiVdPVwiMTAwIC0gcGFzc01hcmtcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1iYXJzXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLWJhci1jb2xcIiAqbmdGb3I9XCJsZXQgYmFyIG9mIHRyZW5kQmFyczsgbGV0IGZpcnN0ID0gZmlyc3Q7IGxldCBsYXN0ID0gbGFzdFwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaXMtcGlja2FibGVdPVwiZ3JhaW4gPT09ICdxdWFydGVyJ1wiIChjbGljayk9XCJzZWxlY3RRdWFydGVyKGJhci5rZXkpXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWJhci12YWx1ZVwiICpuZ0lmPVwiIWRlbnNlVHJlbmRcIiBbY2xhc3MuaXMtYWN0aXZlXT1cImJhci5rZXkgPT09IHF1YXJ0ZXJcIiBbc3R5bGUuYm90dG9tXT1cImJhckhlaWdodChiYXIpXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IGJhci52YWx1ZSA9PT0gbnVsbCA/ICfigJQnIDogYmFyLnZhbHVlICsgJyUnIH19XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWJhclwiIFtzdHlsZS5oZWlnaHRdPVwiYmFySGVpZ2h0KGJhcilcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJiYXJGaWxsKGJhcilcIj48L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXRpcFwiIFtjbGFzcy5pcy1zdGFydF09XCJmaXJzdCAmJiAhbGFzdFwiIFtjbGFzcy5pcy1lbmRdPVwibGFzdCAmJiAhZmlyc3RcIiBbc3R5bGUuYm90dG9tXT1cInRpcEJvdHRvbShiYXIpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi10aXAtaGVhZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGJhci5sYWJlbCB9fTxzcGFuIGNsYXNzPVwiZGItdGlwLXN1YlwiICpuZ0lmPVwiZ3JhaW4gPT09ICdxdWFydGVyJ1wiPiDCtyB7eyBxdWFydGVyTW9udGhzKGJhci5rZXkpIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXRpcC1zY29yZVwiICpuZ0lmPVwiYmFyLnZhbHVlICE9PSBudWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi10aXAtZG90XCIgW2NsYXNzLmlzLWZhaWxdPVwiYmFyLnZhbHVlIDwgcGFzc01hcmtcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi10aXAtdmFsdWVcIj57eyBiYXIudmFsdWUgfX0lPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItdGlwLXN0YXR1c1wiIFtjbGFzcy5pcy1mYWlsXT1cImJhci52YWx1ZSA8IHBhc3NNYXJrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyBiYXIudmFsdWUgPj0gcGFzc01hcmsgPyAnUGFzcycgOiAnQmVsb3cgcGFzcyBtYXJrJyB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi10aXAtZW1wdHlcIiAqbmdJZj1cImJhci52YWx1ZSA9PT0gbnVsbFwiPk5vIHNjb3JlZCBhdWRpdHM8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXRpcC1yb3dcIj48c3Bhbj5BdWRpdHMgY29tcGxldGVkPC9zcGFuPjxiPnt7IGJhci5zdWJtaXR0ZWQgfX08L2I+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi10aXAtcm93XCIgKm5nSWY9XCJiYXIuY291bnQgIT09IGJhci5zdWJtaXR0ZWRcIj48c3Bhbj5TY29yZWQgYXVkaXRzPC9zcGFuPjxiPnt7IGJhci5jb3VudCB9fTwvYj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXRpcC1yb3dcIj48c3Bhbj5QYXNzIG1hcms8L3NwYW4+PGI+e3sgcGFzc01hcmsgfX0lPC9iPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPCEtLSBBIG1vbnRoIGJ5IGRhdGUgaGFzIH4zMCBiYXJzOiBldmVyeSBmZXcgZGF5cyBnZXQgYSBsYWJlbCAoZmlyc3QgYW5kIGxhc3QgYWx3YXlzKSwgYW5kIHRoZSBhdWRpdCBjb3VudHNcclxuICAgICAgICAgICAgIG1vdmUgdG8gdGhlIGJhciB0b29sdGlwLCBzbyB0aGUgbGFiZWxzIG5ldmVyIHJ1biBpbnRvIGVhY2ggb3RoZXIuIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jaGFydC14XCIgW2NsYXNzLmlzLWRlbnNlXT1cImRlbnNlVHJlbmRcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItY2hhcnQteGNvbFwiICpuZ0Zvcj1cImxldCBiYXIgb2YgdHJlbmRCYXJzOyBsZXQgaSA9IGluZGV4OyBsZXQgbGFzdCA9IGxhc3RcIiBbY2xhc3MuaXMtcGlja2FibGVdPVwiZ3JhaW4gPT09ICdxdWFydGVyJ1wiIChjbGljayk9XCJzZWxlY3RRdWFydGVyKGJhci5rZXkpXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItY2hhcnQteGxhYmVsXCIgW2NsYXNzLmlzLWFjdGl2ZV09XCJiYXIua2V5ID09PSBxdWFydGVyXCIgW3N0eWxlLnZpc2liaWxpdHldPVwic2hvd1hMYWJlbChpLCBsYXN0KSA/ICd2aXNpYmxlJyA6ICdoaWRkZW4nXCI+e3sgYmFyLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWNoYXJ0LXhjb3VudFwiICpuZ0lmPVwiIWRlbnNlVHJlbmRcIj57eyBiYXIuc3VibWl0dGVkID8gYmFyLnN1Ym1pdHRlZCArICcgYXVkaXRzJyA6ICdubyBhdWRpdHMnIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L3NlY3Rpb24+XHJcblxyXG4gICAgICA8IS0tIFNjb3JlIGJhbmRzIC0tPlxyXG4gICAgICA8c2VjdGlvbiBjbGFzcz1cImRiLWNhcmQgZGItY2FyZC0tdGlnaHRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY2FyZC1oZWFkIGRiLWNhcmQtaGVhZC0tYmFzZWxpbmVcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jYXJkLXRpdGxlIGRiLWNhcmQtdGl0bGUtLWdyb3dcIj5TY29yZSBkaXN0cmlidXRpb248L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jYXJkLXN1YlwiPnt7IHN0b3Jlc0luU2NvcGUgfX0gaW4gc2NvcGU8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY2FyZC1zdWJcIj5TdG9yZXMgYnkgc2NvcmUgYmFuZCwge3sgcGVyaW9kTGFiZWwgfX08L2Rpdj5cclxuXHJcbiAgICAgICAgPGxpYi1hdWRpdC12Mi1zaGltbWVyICpuZ0lmPVwibG9hZGluZ1wiIFtyb3dzXT1cIjJcIj48L2xpYi1hdWRpdC12Mi1zaGltbWVyPlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItYmFuZGJhclwiICpuZ0lmPVwiIWxvYWRpbmdcIj5cclxuICAgICAgICAgIDwhLS0gQSBiYW5kIHdpdGggc3RvcmVzIGtlZXBzIGEgdmlzaWJsZSBzbGl2ZXIgKDIgb2YgMzU3NiBzdG9yZXMgaXMgdW5kZXIgYSBwaXhlbCk7IHRoZSBsYXJnZXN0IGJhbmQgZ2l2ZXMgd2F5LiAtLT5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItYmFuZHNlZ1wiICpuZ0Zvcj1cImxldCBiIG9mIGJhbmRSb3dzOyB0cmFja0J5OiB0cmFja0J5QmFuZFwiIFtzdHlsZS53aWR0aF09XCJiLndpZHRoXCIgW3N0eWxlLmJhY2tncm91bmRdPVwiYi5iYW5kLnNvZnRcIlxyXG4gICAgICAgICAgICBbY2xhc3MuaGFzLXN0b3Jlc109XCJiLmNvdW50ID4gMFwiIFt0aXRsZV09XCJiLmJhbmQubGFiZWwgKyAnOiAnICsgYi5jb3VudFwiPjwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLWJhbmRyb3dzXCIgKm5nSWY9XCIhbG9hZGluZ1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLWJhbmRyb3dcIiAqbmdGb3I9XCJsZXQgYiBvZiBiYW5kUm93czsgdHJhY2tCeTogdHJhY2tCeUJhbmRcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1iYW5kZG90XCIgW3N0eWxlLmJhY2tncm91bmRdPVwiYi5iYW5kLnNvZnRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItYmFuZGxhYmVsXCI+e3sgYi5iYW5kLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWJhbmRyYW5nZVwiPnt7IGIuYmFuZC5yYW5nZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1iYW5kY291bnRcIj57eyBiLmNvdW50IH19IHt7IGIuY291bnQgPT09IDEgPyAnc3RvcmUnIDogJ3N0b3JlcycgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItYmFuZHNoYXJlXCI+e3sgYi5zaGFyZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPGEgY2xhc3M9XCJkYi1iYW5kbGlua1wiIFtjbGFzcy5pcy1hY3RpdmVdPVwic3RvcmVMaXN0T3BlbiAmJiBsaXN0QmFuZEtleSA9PT0gYi5iYW5kLmtleVwiIChjbGljayk9XCJhcHBseUJhbmQoYi5iYW5kKVwiPlZpZXcgc3RvcmVzPC9hPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLWJhbmRoaW50XCIgKm5nSWY9XCIhbG9hZGluZyAmJiAhc2hvd1N0b3JlTGlzdFwiPkNsaWNrIDxiPlZpZXcgc3RvcmVzPC9iPiBvbiBhIGJhbmQgdG8gbGlzdCBpdHMgc3RvcmVzLjwvZGl2PlxyXG4gICAgICA8L3NlY3Rpb24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFN0b3JlIGxlZGdlcjogb3BlbmVkIGZyb20gU2NvcmUgZGlzdHJpYnV0aW9uIC0+IFZpZXcgc3RvcmVzIChvciBhIEZpbHRlcnMgc2NvcmUgcmFuZ2UpIC0tPlxyXG4gICAgPHNlY3Rpb24gY2xhc3M9XCJkYi1jYXJkIGRiLWNhcmQtLXRhYmxlXCIgaWQ9XCJhZC1zdG9yZS1saXN0XCIgKm5nSWY9XCJzaG93U3RvcmVMaXN0XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkYi1sZWRnZXItaGVhZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1sZWRnZXItdGV4dFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLWNhcmQtdGl0bGVcIj5TdG9yZSBsaXN0PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY2FyZC1zdWJcIj5cclxuICAgICAgICAgICAge3sgZmlsdGVyZWRSb3dzLmxlbmd0aCB9fSB7eyBmaWx0ZXJlZFJvd3MubGVuZ3RoID09PSAxID8gJ3N0b3JlJyA6ICdzdG9yZXMnIH19IMK3IHt7IHBlcmlvZExhYmVsIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1iYW5kZmlsdGVyXCIgKm5nSWY9XCJsaXN0Q2hpcExhYmVsXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItYmFuZGNoaXBcIj5cclxuICAgICAgICAgICAgICB7eyBsaXN0Q2hpcExhYmVsIH19XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1iYW5kY2hpcC14XCIgdGl0bGU9XCJDbG9zZSB0aGUgc3RvcmUgbGlzdFwiIChjbGljayk9XCJjbG9zZVN0b3JlTGlzdCgpXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiOVwiIGhlaWdodD1cIjlcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIzXCJcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjxsaW5lIHgxPVwiNlwiIHkxPVwiNlwiIHgyPVwiMThcIiB5Mj1cIjE4XCI+PC9saW5lPjxsaW5lIHgxPVwiMThcIiB5MT1cIjZcIiB4Mj1cIjZcIiB5Mj1cIjE4XCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8YSBjbGFzcz1cImRiLWJhbmRsaW5rXCIgKGNsaWNrKT1cInNob3dBbGxTdG9yZXMoKVwiPlNob3cgYWxsIHN0b3JlczwvYT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZ3Jvd1wiPjwvZGl2PlxyXG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImF2Mi1zZWFyY2ggZGItc2VhcmNoXCI+XHJcbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+XHJcbiAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMVwiIGN5PVwiMTFcIiByPVwiN1wiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgICA8bGluZSB4MT1cIjE2LjVcIiB5MT1cIjE2LjVcIiB4Mj1cIjIxXCIgeTI9XCIyMVwiPjwvbGluZT5cclxuICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgPGlucHV0IFsobmdNb2RlbCldPVwic2VhcmNoXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25TZWFyY2goKVwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJTZWFyY2ggc3RvcmUgb3Igb3duZXJcIlxyXG4gICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIiAvPlxyXG4gICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNlZ21lbnRlZFwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZWd0YWJcIiBbY2xhc3Muc2VndGFiLW9uXT1cInN0YXR1cyA9PT0gJ2FsbCdcIiAoY2xpY2spPVwic2V0U3RhdHVzKCdhbGwnKVwiPkFsbDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZWd0YWJcIiBbY2xhc3Muc2VndGFiLW9uXT1cInN0YXR1cyA9PT0gJ2ZhaWwnXCIgKGNsaWNrKT1cInNldFN0YXR1cygnZmFpbCcpXCI+RmFpbDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZWd0YWJcIiBbY2xhc3Muc2VndGFiLW9uXT1cInN0YXR1cyA9PT0gJ3Bhc3MnXCIgKGNsaWNrKT1cInNldFN0YXR1cygncGFzcycpXCI+UGFzczwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZWd0YWJcIiBbY2xhc3Muc2VndGFiLW9uXT1cInN0YXR1cyA9PT0gJ3Vuc2NvcmVkJ1wiIChjbGljayk9XCJzZXRTdGF0dXMoJ3Vuc2NvcmVkJylcIlxyXG4gICAgICAgICAgICB0aXRsZT1cIkF1ZGl0ZWQsIGJ1dCBjb21wbGlhbmNlIHNjb3JlIGlzIG9mZiBmb3IgdGhlIGF1ZGl0c1wiPk5vdCBzY29yZWQ8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2VndGFiXCIgW2NsYXNzLnNlZ3RhYi1vbl09XCJzdGF0dXMgPT09ICduYSdcIiAoY2xpY2spPVwic2V0U3RhdHVzKCduYScpXCI+Tm90IGF1ZGl0ZWQ8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8bGliLWF1ZGl0LXYyLXNoaW1tZXIgKm5nSWY9XCJsb2FkaW5nXCI+PC9saWItYXVkaXQtdjItc2hpbW1lcj5cclxuXHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbG9hZGluZ1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYXYyLXRhYmxlLXdyYXBcIj5cclxuICAgICAgICA8dGFibGUgY2xhc3M9XCJkYi10YWJsZVwiPlxyXG4gICAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBoIG9mIGhlYWRlcnNcIiBjbGFzcz1cImlzLXNvcnRhYmxlXCIgW2NsYXNzLmlzLXNvcnRlZF09XCJzb3J0S2V5ID09PSBoLmtleVwiIChjbGljayk9XCJzb3J0QnkoaC5rZXkpXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBoLmxhYmVsIH19IDxsaWItYXVkaXQtdjItc29ydC1pY29uIFthY3RpdmVdPVwic29ydEtleSA9PT0gaC5rZXlcIiBbZGlyXT1cInNvcnREaXJcIj48L2xpYi1hdWRpdC12Mi1zb3J0LWljb24+XHJcbiAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICA8dGg+QWN0aW9uPC90aD5cclxuICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcm93IG9mIHBhZ2VSb3dzOyB0cmFja0J5OiB0cmFja0J5U3RvcmVcIj5cclxuICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJkYi1ub3dyYXBcIj57eyByb3cuZGF0ZSB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkYi1zdG9yZWlkXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvdHJheC9hdWRpdC12Mi9kYXNoYm9hcmQvc3RvcmVcIlxyXG4gICAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiZGV0YWlsUGFyYW1zKHsgc3RvcmU6IHJvdy5yYXc/LnN0b3JlSWQgfHwgcm93LnN0b3JlSWQgfSlcIj57eyByb3cuc3RvcmVJZCB9fTwvYT5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImF2Mi1lbGxpcHNpc1wiPnt7IHJvdy5jaXJjbGUgfX08L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImF2Mi1lbGxpcHNpc1wiPnt7IHJvdy56b25lIH19PC90ZD5cclxuICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJhdjItZWxsaXBzaXNcIj57eyByb3cuYW9tIH19PC90ZD5cclxuICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLXBpbGxcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJiYW5kRm9yKHJvdykuYmdcIiBbc3R5bGUuY29sb3JdPVwiYmFuZEZvcihyb3cpLmZnXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IHJvdy5zY29yZSA9PT0gbnVsbCA/ICfigJQnIDogcm93LnNjb3JlICsgJyUnIH19XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLXBpbGxcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJiYW5kRm9yKHJvdykuYmdcIiBbc3R5bGUuY29sb3JdPVwiYmFuZEZvcihyb3cpLmZnXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IHN0YXR1c0xhYmVsKHJvdykgfX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1hY3Rpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gVmlldyBvcGVucyB0aGUgR2FsbGVyeSBvbiB0aGUgc3RvcmUncyBsYXRlc3Qgc3VibWl0dGVkIGF1ZGl0IGluIHRoZSBwZXJpb2QgKFFBIDExIE9jdCk7IGEgc3RvcmVcclxuICAgICAgICAgICAgICAgICAgICAgICB3aXRoIG5vIHN1Ym1pc3Npb24gdGhlcmUgb3BlbnMgaXRzIGF1ZGl0IGRldGFpbCBpbnN0ZWFkIChzYW1lIGFzIHRoZSBzdG9yZSBsaW5rKS4gLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZGItdmlld2J0blwiICpuZ0lmPVwiZ2FsbGVyeUF1ZGl0SWQocm93KSBhcyBhdWRpdElkXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvdHJheC9hdWRpdC12Mi9nYWxsZXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiZGV0YWlsUGFyYW1zKHsgYXVkaXQ6IGF1ZGl0SWQsIHN0b3JlOiByb3cucmF3Py5zdG9yZUlkIHx8IHJvdy5zdG9yZUlkIH0pXCIgdGl0bGU9XCJWaWV3IHRoaXMgc3RvcmUncyBzdWJtaXNzaW9ucyBpbiB0aGUgR2FsbGVyeVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMS41IDEyUzUgNS41IDEyIDUuNSAyMi41IDEyIDIyLjUgMTIgMTkgMTguNSAxMiAxOC41IDEuNSAxMiAxLjUgMTJ6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIzXCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgVmlld1xyXG4gICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZGItdmlld2J0blwiICpuZ0lmPVwiIWdhbGxlcnlBdWRpdElkKHJvdylcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS90cmF4L2F1ZGl0LXYyL2Rhc2hib2FyZC9zdG9yZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cImRldGFpbFBhcmFtcyh7IHN0b3JlOiByb3cucmF3Py5zdG9yZUlkIHx8IHJvdy5zdG9yZUlkIH0pXCIgdGl0bGU9XCJWaWV3IHRoaXMgc3RvcmUncyBhdWRpdHNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEuNSAxMlM1IDUuNSAxMiA1LjUgMjIuNSAxMiAyMi41IDEyIDE5IDE4LjUgMTIgMTguNSAxLjUgMTIgMS41IDEyelwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiM1wiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIFZpZXdcclxuICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICA8IS0tIFBERiBvZiB0aGUgc3RvcmUncyBsYXRlc3Qgc3VibWl0dGVkIGF1ZGl0IGluIHRoZSBwZXJpb2QgKHF1ZXVlZCwgdGhlbiB1bmRlciBOb3RpZmljYXRpb25zID4gRG93bmxvYWRzKS4gLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZGItcGRmYnRuXCIgcm9sZT1cImJ1dHRvblwiIFtjbGFzcy5pcy1kaXNhYmxlZF09XCIhcGRmVmlzaXRJZChyb3cpXCJcclxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cIiFwZGZWaXNpdElkKHJvdylcIiAoY2xpY2spPVwiZG93bmxvYWRQZGYocm93KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cInBkZlZpc2l0SWQocm93KSA/ICdEb3dubG9hZCB0aGUgUERGIHJlcG9ydCBvZiB0aGUgbGF0ZXN0IHN1Ym1pdHRlZCBhdWRpdCBmb3IgdGhpcyBzdG9yZScgOiAnTm8gc3VibWl0dGVkIGF1ZGl0IGZvciB0aGlzIHN0b3JlIGluIHRoaXMgcGVyaW9kJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTIgNHYxMlwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwb2x5bGluZSBwb2ludHM9XCI3IDExIDEyIDE2IDE3IDExXCI+PC9wb2x5bGluZT5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNCAyMGgxNlwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgPC90YWJsZT5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiIXBhZ2VSb3dzLmxlbmd0aFwiIGNsYXNzPVwiYXYyLWVtcHR5XCI+XHJcbiAgICAgICAgPGltZyBjbGFzcz1cImF2Mi1lbXB0eS1pbWdcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGExLnN2Z1wiIGFsdD1cIlwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktdGV4dFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS10aXRsZVwiPk5vIGRhdGEgZm91bmQ8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktc3ViXCI+Tm8gc3RvcmVzIG1hdGNoIHRoZSBjdXJyZW50IGZpbHRlcnMuPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSBTaGFyZWQgcGFnZXIgKDEwIC8gMjAgLyAzMCksIGFzIG9uIHRoZSBvdGhlciBhdWRpdCBsaXN0cy4gLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkYi1wZXJmLXBhZ2VyXCIgKm5nSWY9XCJmaWx0ZXJlZFJvd3MubGVuZ3RoXCI+XHJcbiAgICAgICAgPGxpYi1wYWdpbmF0aW9uIFtpdGVtc1BlclBhZ2VdPVwicGFnZVNpemVcIiBbcGFnZVNpemVdPVwicGFnZVNpemVcIiBbcGFnaW5hdGlvblNpemVzXT1cInBhZ2VTaXplc1wiXHJcbiAgICAgICAgICBbY3VycmVudFBhZ2VdPVwicGFnZVwiIFt0b3RhbEl0ZW1zXT1cImZpbHRlcmVkUm93cy5sZW5ndGhcIiAocGFnZUNoYW5nZSk9XCJvblBhZ2VDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAocGFnZVNpemVDaGFuZ2UpPVwib25QYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCI+PC9saWItcGFnaW5hdGlvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9zZWN0aW9uPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuICA8IS0tID09PT09PT09PT09PSBUQVNLIFNVTU1BUlkgPT09PT09PT09PT09IC0tPlxyXG4gIDwhLS0gVGFza3MgcmFpc2VkIGZyb20gdGhpcyBjbGllbnQncyBhdWRpdHMsIGluIHRoZSBoZWFkZXIgc2NvcGUgKHNoaW1tZXIgdmFsdWVzIHdoaWxlIGxvYWRpbmcpLiAtLT5cclxuICA8ZGl2IGNsYXNzPVwiZGItc3RhdHNcIiAqbmdJZj1cImlzVGFza01vZHVsZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImRiLXN0YXRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtaGVhZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LWJpZ1wiPlxyXG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJ0YXNrTG9hZGluZ1wiIGNsYXNzPVwiYXYyLXNrIGF2Mi1zay0tdmFsdWUgZGItc2stdmFsdWVcIj48L3NwYW4+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXRhc2tMb2FkaW5nXCI+e3sgdGFza1N0YXRzLmFjdGl2ZVRhc2tzIH19PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtbGFiZWxcIj5BY3RpdmUge3sgbW9kdWxlVGFiIH19czwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtYm9keVwiPlxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1taWRcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ0YXNrTG9hZGluZ1wiIGNsYXNzPVwiYXYyLXNrIGRiLXNrLW1pZFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0YXNrTG9hZGluZ1wiPnt7IHRhc2tTdGF0cy50YXNrSW5zdGFuY2VzIH19PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LXN1YlwiPnt7IG1vZHVsZVRhYiB9fSBJbnN0YW5jZXM8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1oZWFkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtYmlnXCI+XHJcbiAgICAgICAgICA8c3BhbiAqbmdJZj1cInRhc2tMb2FkaW5nXCIgY2xhc3M9XCJhdjItc2sgYXYyLXNrLS12YWx1ZSBkYi1zay12YWx1ZVwiPjwvc3Bhbj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdGFza0xvYWRpbmdcIj57eyB0YXNrU3RhdHMubm90U3VibWl0dGVkIH19PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtbGFiZWxcIj5Ob3QgU3VibWl0dGVkIHt7IG1vZHVsZVRhYiB9fXM8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LWJvZHkgZGItc3RhdC1ib2R5LS0yXCI+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LW1pZFwiPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cInRhc2tMb2FkaW5nXCIgY2xhc3M9XCJhdjItc2sgZGItc2stbWlkXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXRhc2tMb2FkaW5nXCI+e3sgdGFza1N0YXRzLm9wZW5UYXNrcyB9fTwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1zdWJcIj5PcGVuIHt7IG1vZHVsZVRhYiB9fXM8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtbWlkXCI+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidGFza0xvYWRpbmdcIiBjbGFzcz1cImF2Mi1zayBkYi1zay1taWRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdGFza0xvYWRpbmdcIj57eyB0YXNrU3RhdHMuaW5Qcm9ncmVzcyB9fTwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1zdWJcIj5JbiBQcm9ncmVzcyB7eyBtb2R1bGVUYWIgfX1zPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImRiLXN0YXRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtaGVhZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LWJpZ1wiPlxyXG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJ0YXNrTG9hZGluZ1wiIGNsYXNzPVwiYXYyLXNrIGF2Mi1zay0tdmFsdWUgZGItc2stdmFsdWVcIj48L3NwYW4+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXRhc2tMb2FkaW5nXCI+e3sgdGFza1N0YXRzLnN1Ym1pdHRlZCB9fTwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LWxhYmVsXCI+U3VibWl0dGVkIHt7IG1vZHVsZVRhYiB9fXM8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LWJvZHkgZGItc3RhdC1ib2R5LS0zXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtY2VsbFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtbWlkXCI+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidGFza0xvYWRpbmdcIiBjbGFzcz1cImF2Mi1zayBkYi1zay1taWRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdGFza0xvYWRpbmdcIj57eyB0YXNrU3RhdHMuY29tcGxldGlvblNjb3JlIH19PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LXN1YlwiPkNvbXBsZXRpb24gU2NvcmU8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LWRlbHRhXCIgKm5nSWY9XCIhdGFza0xvYWRpbmcgJiYgdGFza1N0YXRzLmNvbXBsZXRpb25EZWx0YVwiIFtuZ0NsYXNzXT1cInRhc2tEZWx0YUNsYXNzKCdjb21wbGV0aW9uJylcIj5cclxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEzXCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyLjJcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCI0IDYgMTAgMTIgMTQgOCAyMCAxNlwiPjwvcG9seWxpbmU+PHBvbHlsaW5lIHBvaW50cz1cIjE1IDE2IDIwIDE2IDIwIDExXCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAgICAgICAge3sgdGFza1N0YXRzLmNvbXBsZXRpb25EZWx0YSB9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtY2VsbFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtbWlkXCI+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidGFza0xvYWRpbmdcIiBjbGFzcz1cImF2Mi1zayBkYi1zay1taWRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdGFza0xvYWRpbmdcIj57eyB0YXNrU3RhdHMuY29tcGxpYW5jZVNjb3JlIH19PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LXN1YlwiPkNvbXBsaWFuY2UgU2NvcmU8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LWRlbHRhXCIgKm5nSWY9XCIhdGFza0xvYWRpbmcgJiYgdGFza1N0YXRzLmNvbXBsaWFuY2VEZWx0YVwiIFtuZ0NsYXNzXT1cInRhc2tEZWx0YUNsYXNzKCdjb21wbGlhbmNlJylcIj5cclxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEzXCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyLjJcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCI0IDYgMTAgMTIgMTQgOCAyMCAxNlwiPjwvcG9seWxpbmU+PHBvbHlsaW5lIHBvaW50cz1cIjE1IDE2IDIwIDE2IDIwIDExXCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAgICAgICAge3sgdGFza1N0YXRzLmNvbXBsaWFuY2VEZWx0YSB9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtY2VsbFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtbWlkIGlzLXVuZGVybGluZVwiPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cInRhc2tMb2FkaW5nXCIgY2xhc3M9XCJhdjItc2sgZGItc2stbWlkXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXRhc2tMb2FkaW5nXCI+e3sgdGFza1N0YXRzLnRvdGFsRmxhZ3MgfX08L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtc3ViXCI+VG90YWwgRmxhZ3M8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LWRlbHRhXCIgKm5nSWY9XCIhdGFza0xvYWRpbmcgJiYgdGFza1N0YXRzLmZsYWdzRGVsdGFcIiBbbmdDbGFzc109XCJ0YXNrRGVsdGFDbGFzcygnZmxhZ3MnKVwiPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjIuMlwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjQgNiAxMCAxMiAxNCA4IDIwIDE2XCI+PC9wb2x5bGluZT48cG9seWxpbmUgcG9pbnRzPVwiMTUgMTYgMjAgMTYgMjAgMTFcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICB7eyB0YXNrU3RhdHMuZmxhZ3NEZWx0YSB9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gPT09PT09PT09PT09IFBFUkZPUk1BTkNFID09PT09PT09PT09PSAtLT5cclxuICA8c2VjdGlvbiBjbGFzcz1cImRiLXBlcmZcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkYi1wZXJmdGFic1wiPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImRiLXBlcmZ0YWJcIiAqbmdGb3I9XCJsZXQgdCBvZiBwZXJmVGFic1wiIFtjbGFzcy5pcy1vbl09XCJwZXJmVGFiID09PSB0XCJcclxuICAgICAgICAoY2xpY2spPVwic2V0UGVyZlRhYih0KVwiPnt7IHBlcmZUYWJEaXNwbGF5KHQpIH19PC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZGItcGVyZi1oZWFkXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkYi1wZXJmLXRleHRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItcGVyZi10aXRsZVwiPlxyXG4gICAgICAgICAge3sgcGVyZkluZm9UaXRsZSB9fVxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi10b3RhbFwiPlxyXG4gICAgICAgICAgICB7eyBwZXJmVGFiID09PSAnQXVkaXQnID8gKGlzVGFza01vZHVsZSA/IGZpbHRlcmVkVGFza1BlcmYubGVuZ3RoIDogZmlsdGVyZWRBdWRpdFBlcmYubGVuZ3RoKSA6IChwZXJmVGFiID09PSAnU3RvcmUnID8gZmlsdGVyZWRTdG9yZVBlcmYubGVuZ3RoIDogZmlsdGVyZWRVc2VyUGVyZi5sZW5ndGgpIH19IFRvdGFsXHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLWNhcmQtc3ViXCI+e3sgcGVyZlBlcmlvZCB9fTwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImF2Mi1ncm93XCI+PC9kaXY+XHJcbiAgICAgIDxsYWJlbCBjbGFzcz1cImF2Mi1zZWFyY2ggZGItcGVyZi1zZWFyY2hcIj5cclxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPlxyXG4gICAgICAgICAgPGNpcmNsZSBjeD1cIjExXCIgY3k9XCIxMVwiIHI9XCI3XCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICA8bGluZSB4MT1cIjE2LjVcIiB5MT1cIjE2LjVcIiB4Mj1cIjIxXCIgeTI9XCIyMVwiPjwvbGluZT5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbcGxhY2Vob2xkZXJdPVwicGVyZlNlYXJjaFBsYWNlaG9sZGVyXCIgWyhuZ01vZGVsKV09XCJwZXJmU2VhcmNoXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25QZXJmU2VhcmNoKClcIj5cclxuICAgICAgPC9sYWJlbD5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGF2Mi1idG4tLWdob3N0XCIgW2Rpc2FibGVkXT1cInBlcmZMb2FkaW5nIHx8ICFwZXJmUm93Q291bnRcIlxyXG4gICAgICAgIHRpdGxlPVwiRG93bmxvYWQgdGhpcyB0YWJsZSBhcyBhbiBFeGNlbCBmaWxlXCIgKGNsaWNrKT1cImV4cG9ydFBlcmZvcm1hbmNlKClcIj5cclxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuOFwiXHJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cclxuICAgICAgICAgIDxwYXRoIGQ9XCJNMTIgMTZWNFwiPjwvcGF0aD5cclxuICAgICAgICAgIDxwb2x5bGluZSBwb2ludHM9XCI3IDkgMTIgNCAxNyA5XCI+PC9wb2x5bGluZT5cclxuICAgICAgICAgIDxwYXRoIGQ9XCJNNCAxNnY0aDE2di00XCI+PC9wYXRoPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIEV4cG9ydFxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGRiLWNyZWF0ZVwiICpuZ0lmPVwicGVyZlRhYiA9PT0gJ0F1ZGl0JyAmJiBhY2Nlc3MuY2FuQWRkXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvdHJheC9hdWRpdC12Mi9tYW5hZ2VcIj5cclxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjIuMlwiXHJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+PHBhdGggZD1cIk0xMiA1djE0TTUgMTJoMTRcIj48L3BhdGg+PC9zdmc+XHJcbiAgICAgICAge3sgcGVyZkNyZWF0ZUxhYmVsIH19XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGxpYi1hdWRpdC12Mi1zaGltbWVyICpuZ0lmPVwicGVyZkxvYWRpbmdcIj48L2xpYi1hdWRpdC12Mi1zaGltbWVyPlxyXG5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhcGVyZkxvYWRpbmdcIj5cclxuICAgIDwhLS0gQXVkaXQgUGVyZm9ybWFuY2UgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXYyLXRhYmxlLXdyYXBcIiAqbmdJZj1cInBlcmZUYWIgPT09ICdBdWRpdCcgJiYgIWlzVGFza01vZHVsZVwiPlxyXG4gICAgICA8dGFibGUgY2xhc3M9XCJkYi1wZXJmdGFibGUgZGItcGVyZnRhYmxlLS1hdWRpdFwiPlxyXG4gICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBjIG9mIGF1ZGl0UGVyZkNvbHNcIiBjbGFzcz1cImlzLXNvcnRhYmxlXCIgW2NsYXNzLmlzLXNvcnRlZF09XCJwZXJmU29ydEtleSA9PT0gYy5rZXlcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJzb3J0UGVyZihjLmtleSlcIj57eyBjLmxhYmVsIH19IDxsaWItYXVkaXQtdjItc29ydC1pY29uIFthY3RpdmVdPVwicGVyZlNvcnRLZXkgPT09IGMua2V5XCIgW2Rpcl09XCJwZXJmU29ydERpclwiPjwvbGliLWF1ZGl0LXYyLXNvcnQtaWNvbj48L3RoPlxyXG4gICAgICAgICAgICA8dGg+QWN0aW9uPC90aD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90aGVhZD5cclxuICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiBwZXJmUGFnZU9mKGZpbHRlcmVkQXVkaXRQZXJmKTsgdHJhY2tCeTogdHJhY2tCeVBlcmZBdWRpdFwiPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLW5hbWVcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItYXZhdGFyXCI+e3sgcm93LmluaXRpYWxzIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkYi1saW5rXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvdHJheC9hdWRpdC12Mi9kYXNoYm9hcmQvYXVkaXRcIlxyXG4gICAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiZGV0YWlsUGFyYW1zKHsgY2hlY2tsaXN0SWQ6IHJvdy5yYXc/LnNvdXJjZUNoZWNrTGlzdF9pZCB8fCByb3cucmF3Py5faWQgfSlcIj57eyByb3cubmFtZSB9fTwvYT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkPnt7IHJvdy5hc3NpZ25lZCB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8IS0tIE9wZW5zIHRoZSBhdWRpdCdzIGRldGFpbCBwYWdlIChhcyB0aGUgZXllIGRvZXMpIG9uIGl0cyBzdWJtaXR0ZWQgdmlzaXRzLCBhcyB0aGUgdjEgQ2hlY2tsaXN0IGRhc2hib2FyZCBkaWQuIC0tPlxyXG4gICAgICAgICAgICAgIDxhICpuZ0lmPVwicm93LnN1Ym1pdHRlZFwiIGNsYXNzPVwiZGItdWxpbmtcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS90cmF4L2F1ZGl0LXYyL2Rhc2hib2FyZC9hdWRpdFwiXHJcbiAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiZGV0YWlsUGFyYW1zKHsgY2hlY2tsaXN0SWQ6IHJvdy5yYXc/LnNvdXJjZUNoZWNrTGlzdF9pZCB8fCByb3cucmF3Py5faWQsIHN0YXR1czogJ3N1Ym1pdCcgfSlcIlxyXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJWaWV3IHRoZSBzdWJtaXR0ZWQgdmlzaXRzXCI+e3sgcm93LnN1Ym1pdHRlZCB9fTwvYT5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFyb3cuc3VibWl0dGVkXCI+MDwvc3Bhbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPCEtLSBTdG9yZSBkaXNwdXRlcyAocXVlc3Rpb25zKSBpbiB0aGUgcGVyaW9kLCBhcyBhIHBsYWluIGNvdW50IChRQSAxMCBPY3Q6IG5vIGxpbmspLiAtLT5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicm93LmRpc3B1dGVzID09PSBudWxsXCIgY2xhc3M9XCJhdjItZmFpbnRcIj7igJQ8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3cuZGlzcHV0ZXMgIT09IG51bGxcIj57eyByb3cuZGlzcHV0ZXMgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyByb3cucGFzc01hcmsgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXNjb3JlXCIgW2NsYXNzLmlzLWVtcHR5XT1cInJvdy5zY29yZSA9PT0gJ+KAlCdcIlxyXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cInJvdy5zY29yZSA9PT0gJ+KAlCcgPyAnQ29tcGxpYW5jZSBzY29yZSBpcyBvZmYgZm9yIHRoaXMgYXVkaXQnIDogJydcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItdHJhY2sgZGItdHJhY2stLTZcIj48c3BhbiBbc3R5bGUud2lkdGhdPVwiYmFyV2lkdGgocm93LnNjb3JlUGN0KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwicm93LnJlc3VsdCA9PT0gJ1Bhc3MnID8gJyMxMkI3NkEnIDogJyNGMDQ0MzgnXCI+PC9zcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItc2NvcmV0ZXh0XCI+e3sgcm93LnNjb3JlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3cucmVzdWx0ICE9PSAn4oCUJ1wiIGNsYXNzPVwiZGItcGlsbCBkYi1waWxsLS1zdHJvbmdcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJyb3cucmVzdWx0ID09PSAnUGFzcycgPyAnI0VDRkRGMycgOiAnI0ZFRjNGMidcIlxyXG4gICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cInJvdy5yZXN1bHQgPT09ICdQYXNzJyA/ICcjMDI3QTQ4JyA6ICcjQjQyMzE4J1wiPnt7IHJvdy5yZXN1bHQgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3cucmVzdWx0ID09PSAn4oCUJ1wiIGNsYXNzPVwiYXYyLWZhaW50XCIgdGl0bGU9XCJDb21wbGlhbmNlIHNjb3JlIGlzIG9mZiBmb3IgdGhpcyBhdWRpdFwiPuKAlDwvc3Bhbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxhIGNsYXNzPVwiZGItZXllXCIgdGl0bGU9XCJWaWV3IGF1ZGl0XCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvdHJheC9hdWRpdC12Mi9kYXNoYm9hcmQvYXVkaXRcIlxyXG4gICAgICAgICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cImRldGFpbFBhcmFtcyh7IGNoZWNrbGlzdElkOiByb3cucmF3Py5zb3VyY2VDaGVja0xpc3RfaWQgfHwgcm93LnJhdz8uX2lkIH0pXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTdcIiBoZWlnaHQ9XCIxN1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuOVwiXHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEuNSAxMlM1IDUuNSAxMiA1LjUgMjIuNSAxMiAyMi41IDEyIDE5IDE4LjUgMTIgMTguNSAxLjUgMTIgMS41IDEyelwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIzXCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGJvZHk+XHJcbiAgICAgIDwvdGFibGU+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCIhZmlsdGVyZWRBdWRpdFBlcmYubGVuZ3RoXCIgY2xhc3M9XCJhdjItZW1wdHlcIj5cclxuICAgICAgICA8aW1nIGNsYXNzPVwiYXYyLWVtcHR5LWltZ1wiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YTEuc3ZnXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS10ZXh0XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXRpdGxlXCI+Tm8gZGF0YSBmb3VuZDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS1zdWJcIj57eyBwZXJmU2VhcmNoLnRyaW0oKSA/ICdObyBhdWRpdCBtYXRjaGVzIHRoaXMgc2VhcmNoLicgOiAnVGhlcmUgaXMgbm8gcmVzdWx0IGZvciBBdWRpdCBQZXJmb3JtYW5jZSBpbiB0aGlzIHBlcmlvZC4nIH19PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBUYXNrIFBlcmZvcm1hbmNlIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImF2Mi10YWJsZS13cmFwXCIgKm5nSWY9XCJwZXJmVGFiID09PSAnQXVkaXQnICYmIGlzVGFza01vZHVsZVwiPlxyXG4gICAgICA8dGFibGUgY2xhc3M9XCJkYi1wZXJmdGFibGUgZGItcGVyZnRhYmxlLS10YXNrXCI+XHJcbiAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IGMgb2YgdGFza1BlcmZDb2xzXCIgY2xhc3M9XCJpcy1zb3J0YWJsZVwiIFtjbGFzcy5pcy1zb3J0ZWRdPVwicGVyZlNvcnRLZXkgPT09IGMua2V5XCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwic29ydFBlcmYoYy5rZXkpXCI+e3sgYy5sYWJlbCB9fSA8bGliLWF1ZGl0LXYyLXNvcnQtaWNvbiBbYWN0aXZlXT1cInBlcmZTb3J0S2V5ID09PSBjLmtleVwiIFtkaXJdPVwicGVyZlNvcnREaXJcIj48L2xpYi1hdWRpdC12Mi1zb3J0LWljb24+PC90aD5cclxuICAgICAgICAgICAgPHRoPkFjdGlvbjwvdGg+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByb3cgb2YgcGVyZlBhZ2VPZihmaWx0ZXJlZFRhc2tQZXJmKTsgdHJhY2tCeTogdHJhY2tCeVBlcmZUYXNrXCI+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItbmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1hdmF0YXJcIj57eyByb3cuaW5pdGlhbHMgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRiLWxpbmtcIiBbdGl0bGVdPVwicm93LnJhdz8uYXVkaXROYW1lID8gJ1JhaXNlZCBmcm9tICcgKyByb3cucmF3LmF1ZGl0TmFtZSA6ICcnXCI+e3sgcm93Lm5hbWUgfX08L2E+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyByb3cuc2NoZWR1bGVkIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiZGItbWVkaXVtXCI+e3sgcm93LmNvdmVyYWdlIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPnt7IHJvdy5hc3NpZ25lZCB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8IS0tIE9wZW5zIHRoZSBHYWxsZXJ5IChUeXBlIFRhc2spIG9uIHRoaXMgdGFzaydzIHN1Ym1pc3Npb25zIGluIHRoZSBkYXNoYm9hcmQgcGVyaW9kLiAtLT5cclxuICAgICAgICAgICAgICA8YSAqbmdJZj1cInJvdy5zdWJtaXR0ZWQgJiYgcm93LnJhdz8udGFza0lkXCIgY2xhc3M9XCJkYi11bGlua1wiIHJvdXRlckxpbms9XCIvbWFuYWdlL3RyYXgvYXVkaXQtdjIvZ2FsbGVyeVwiXHJcbiAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwidGFza1N1Ym1pdHRlZFBhcmFtcyhyb3cpXCIgdGl0bGU9XCJWaWV3IHRoZSBzdWJtaXR0ZWQgdGFza3MgaW4gdGhlIEdhbGxlcnlcIj57eyByb3cuc3VibWl0dGVkIH19PC9hPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIXJvdy5zdWJtaXR0ZWQgfHwgIXJvdy5yYXc/LnRhc2tJZFwiPnt7IHJvdy5zdWJtaXR0ZWQgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD48YSBjbGFzcz1cImRiLXVsaW5rXCI+e3sgcm93LmZsYWdzIH19PC9hPjwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImF2Mi1mYWludFwiPnt7IHJvdy50YXNrcyB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD48YSBjbGFzcz1cImRiLXVsaW5rXCI+e3sgcm93LnJlZG8gfX08L2E+PC90ZD5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zY29yZVwiIFtjbGFzcy5pcy1lbXB0eV09XCJyb3cuY29tcGxpYW5jZSA9PT0gJ+KAlCdcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItdHJhY2sgZGItdHJhY2stLTZcIj48c3BhbiBbc3R5bGUud2lkdGhdPVwiYmFyV2lkdGgocm93LmNvbXBsaWFuY2VQY3QpXCI+PC9zcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItc2NvcmV0ZXh0XCI+e3sgcm93LmNvbXBsaWFuY2UgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8IS0tIE9wZW5zIHRoZSBhdWRpdCB0aGUgdGFzayB3YXMgcmFpc2VkIGZyb20uIC0tPlxyXG4gICAgICAgICAgICAgIDxhIGNsYXNzPVwiZGItZXllXCIgdGl0bGU9XCJWaWV3IHRoZSBhdWRpdCB0aGlzIHRhc2sgd2FzIHJhaXNlZCBmcm9tXCJcclxuICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cInJvdy5yYXc/LmF1ZGl0SWQgPyAnL21hbmFnZS90cmF4L2F1ZGl0LXYyL2Rhc2hib2FyZC9hdWRpdCcgOiBudWxsXCJcclxuICAgICAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJkZXRhaWxQYXJhbXMoeyBjaGVja2xpc3RJZDogcm93LnJhdz8uYXVkaXRJZCB9KVwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE3XCIgaGVpZ2h0PVwiMTdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjlcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cclxuICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xLjUgMTJTNSA1LjUgMTIgNS41IDIyLjUgMTIgMjIuNSAxMiAxOSAxOC41IDEyIDE4LjUgMS41IDEyIDEuNSAxMnpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiM1wiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3Rib2R5PlxyXG4gICAgICA8L3RhYmxlPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiIWZpbHRlcmVkVGFza1BlcmYubGVuZ3RoXCIgY2xhc3M9XCJhdjItZW1wdHlcIj5cclxuICAgICAgICA8aW1nIGNsYXNzPVwiYXYyLWVtcHR5LWltZ1wiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YTEuc3ZnXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS10ZXh0XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXRpdGxlXCI+Tm8gZGF0YSBmb3VuZDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS1zdWJcIj5ObyB0YXNrcyByYWlzZWQgZnJvbSBhdWRpdHMgaW4gdGhpcyBwZXJpb2QuPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBTdG9yZSBQZXJmb3JtYW5jZSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJhdjItdGFibGUtd3JhcFwiICpuZ0lmPVwicGVyZlRhYiA9PT0gJ1N0b3JlJ1wiPlxyXG4gICAgICA8dGFibGUgY2xhc3M9XCJkYi1wZXJmdGFibGUgZGItcGVyZnRhYmxlLS1zdG9yZVwiPlxyXG4gICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBjIG9mIHN0b3JlUGVyZkNvbHNcIiBjbGFzcz1cImlzLXNvcnRhYmxlXCIgW2NsYXNzLmlzLXNvcnRlZF09XCJwZXJmU29ydEtleSA9PT0gYy5rZXlcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJzb3J0UGVyZihjLmtleSlcIj57eyBjLmxhYmVsIH19IDxsaWItYXVkaXQtdjItc29ydC1pY29uIFthY3RpdmVdPVwicGVyZlNvcnRLZXkgPT09IGMua2V5XCIgW2Rpcl09XCJwZXJmU29ydERpclwiPjwvbGliLWF1ZGl0LXYyLXNvcnQtaWNvbj48L3RoPlxyXG4gICAgICAgICAgICA8dGg+QWN0aW9uPC90aD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90aGVhZD5cclxuICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiBwZXJmUGFnZU9mKGZpbHRlcmVkU3RvcmVQZXJmKTsgdHJhY2tCeTogdHJhY2tCeVBlcmZTdG9yZVwiPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkYi1saW5rXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvdHJheC9hdWRpdC12Mi9kYXNoYm9hcmQvc3RvcmVcIiBbcXVlcnlQYXJhbXNdPVwiZGV0YWlsUGFyYW1zKHsgc3RvcmU6IHJvdy5zdG9yZUlkIHx8IHJvdy5zdG9yZSB9KVwiPnt7IHJvdy5zdG9yZSB9fTwvYT5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiYXYyLWVsbGlwc2lzIGF2Mi1kaW1cIiBbYXYyVGlwXT1cInJvdy5zdG9yZUlkXCI+e3sgcm93LnN0b3JlSWQgfHwgJ+KAlCcgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJhdjItZWxsaXBzaXMgYXYyLWRpbVwiPnt7IHJvdy5zcG9jIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPnt7IHJvdy5hc3NpZ25lZCB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyByb3cuZmxhZ3MgPz8gJ+KAlCcgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+PGRpdiBjbGFzcz1cImRiLXNjb3JlXCIgW2NsYXNzLmlzLWVtcHR5XT1cInJvdy5jb21wbGV0aW9uID09PSAn4oCUJ1wiPjxzcGFuIGNsYXNzPVwiZGItdHJhY2tcIj48c3BhbiBbc3R5bGUud2lkdGhdPVwiYmFyV2lkdGgocm93LmNvbXBsZXRpb24pXCI+PC9zcGFuPjwvc3Bhbj48c3BhbiBjbGFzcz1cImRiLXNjb3JldGV4dCBkYi1zY29yZXRleHQtLXNtXCI+e3sgcm93LmNvbXBsZXRpb24gfX08L3NwYW4+PC9kaXY+PC90ZD5cclxuICAgICAgICAgICAgPHRkPjxkaXYgY2xhc3M9XCJkYi1zY29yZVwiIFtjbGFzcy5pcy1lbXB0eV09XCJyb3cuY29tcGxpYW5jZSA9PT0gJ+KAlCdcIj48c3BhbiBjbGFzcz1cImRiLXRyYWNrXCI+PHNwYW4gW3N0eWxlLndpZHRoXT1cImJhcldpZHRoKHJvdy5jb21wbGlhbmNlKVwiPjwvc3Bhbj48L3NwYW4+PHNwYW4gY2xhc3M9XCJkYi1zY29yZXRleHQgZGItc2NvcmV0ZXh0LS1zbVwiPnt7IHJvdy5jb21wbGlhbmNlIH19PC9zcGFuPjwvZGl2PjwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD48ZGl2IGNsYXNzPVwiZGItc2NvcmVcIiBbY2xhc3MuaXMtZW1wdHldPVwicm93LnBlcmYgPT09ICfigJQnXCI+PHNwYW4gY2xhc3M9XCJkYi10cmFja1wiPjxzcGFuIFtzdHlsZS53aWR0aF09XCJiYXJXaWR0aChyb3cucGVyZilcIj48L3NwYW4+PC9zcGFuPjxzcGFuIGNsYXNzPVwiZGItc2NvcmV0ZXh0IGRiLXNjb3JldGV4dC0tc21cIj57eyByb3cucGVyZiB9fTwvc3Bhbj48L2Rpdj48L3RkPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkYi1leWVcIiB0aXRsZT1cIlZpZXcgc3RvcmVcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS90cmF4L2F1ZGl0LXYyL2Rhc2hib2FyZC9zdG9yZVwiIFtxdWVyeVBhcmFtc109XCJkZXRhaWxQYXJhbXMoeyBzdG9yZTogcm93LnN0b3JlSWQgfHwgcm93LnN0b3JlIH0pXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTdcIiBoZWlnaHQ9XCIxN1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuOVwiXHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEuNSAxMlM1IDUuNSAxMiA1LjUgMjIuNSAxMiAyMi41IDEyIDE5IDE4LjUgMTIgMTguNSAxLjUgMTIgMS41IDEyelwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIzXCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGJvZHk+XHJcbiAgICAgIDwvdGFibGU+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCIhZmlsdGVyZWRTdG9yZVBlcmYubGVuZ3RoXCIgY2xhc3M9XCJhdjItZW1wdHlcIj5cclxuICAgICAgICA8aW1nIGNsYXNzPVwiYXYyLWVtcHR5LWltZ1wiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YTEuc3ZnXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS10ZXh0XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXRpdGxlXCI+Tm8gZGF0YSBmb3VuZDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS1zdWJcIj57eyBwZXJmU2VhcmNoLnRyaW0oKSA/ICdObyBzdG9yZSBtYXRjaGVzIHRoaXMgc2VhcmNoLicgOiAnVGhlcmUgaXMgbm8gcmVzdWx0IGZvciBTdG9yZSBQZXJmb3JtYW5jZSBpbiB0aGlzIHBlcmlvZC4nIH19PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBVc2VyIFBlcmZvcm1hbmNlIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImF2Mi10YWJsZS13cmFwXCIgKm5nSWY9XCJwZXJmVGFiID09PSAnVXNlcidcIj5cclxuICAgICAgPHRhYmxlIGNsYXNzPVwiZGItcGVyZnRhYmxlIGRiLXBlcmZ0YWJsZS0tdXNlclwiPlxyXG4gICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBjIG9mIHVzZXJQZXJmQ29sc1wiIGNsYXNzPVwiaXMtc29ydGFibGVcIiBbY2xhc3MuaXMtc29ydGVkXT1cInBlcmZTb3J0S2V5ID09PSBjLmtleVwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNvcnRQZXJmKGMua2V5KVwiPnt7IGMubGFiZWwgfX0gPGxpYi1hdWRpdC12Mi1zb3J0LWljb24gW2FjdGl2ZV09XCJwZXJmU29ydEtleSA9PT0gYy5rZXlcIiBbZGlyXT1cInBlcmZTb3J0RGlyXCI+PC9saWItYXVkaXQtdjItc29ydC1pY29uPjwvdGg+XHJcbiAgICAgICAgICAgIDx0aD5BY3Rpb248L3RoPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcm93IG9mIHBlcmZQYWdlT2YoZmlsdGVyZWRVc2VyUGVyZik7IHRyYWNrQnk6IHRyYWNrQnlQZXJmVXNlclwiPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJhdjItZWxsaXBzaXNcIj48YSBjbGFzcz1cImRiLWxpbmtcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS90cmF4L2F1ZGl0LXYyL2Rhc2hib2FyZC91c2VyXCIgW3F1ZXJ5UGFyYW1zXT1cImRldGFpbFBhcmFtcyh7IGVtYWlsOiByb3cuZW1haWwgfSlcIj57eyByb3cubmFtZSB9fTwvYT48L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJhdjItZWxsaXBzaXMgYXYyLWRpbVwiPnt7IHJvdy5lbWFpbCB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyByb3cuYXNzaWduZWQgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgcm93LmZsYWdzIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPnt7IHJvdy5yZWRvIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPjxkaXYgY2xhc3M9XCJkYi1zY29yZVwiIFtjbGFzcy5pcy1lbXB0eV09XCJyb3cuY29tcGxldGlvbiA9PT0gJ+KAlCdcIj48c3BhbiBjbGFzcz1cImRiLXRyYWNrXCI+PHNwYW4gW3N0eWxlLndpZHRoXT1cImJhcldpZHRoKHJvdy5jb21wbGV0aW9uKVwiPjwvc3Bhbj48L3NwYW4+PHNwYW4gY2xhc3M9XCJkYi1zY29yZXRleHQgZGItc2NvcmV0ZXh0LS1zbVwiPnt7IHJvdy5jb21wbGV0aW9uIH19PC9zcGFuPjwvZGl2PjwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD48ZGl2IGNsYXNzPVwiZGItc2NvcmVcIiBbY2xhc3MuaXMtZW1wdHldPVwicm93LmNvbXBsaWFuY2UgPT09ICfigJQnXCI+PHNwYW4gY2xhc3M9XCJkYi10cmFja1wiPjxzcGFuIFtzdHlsZS53aWR0aF09XCJiYXJXaWR0aChyb3cuY29tcGxpYW5jZSlcIj48L3NwYW4+PC9zcGFuPjxzcGFuIGNsYXNzPVwiZGItc2NvcmV0ZXh0IGRiLXNjb3JldGV4dC0tc21cIj57eyByb3cuY29tcGxpYW5jZSB9fTwvc3Bhbj48L2Rpdj48L3RkPlxyXG4gICAgICAgICAgICA8dGQ+PGRpdiBjbGFzcz1cImRiLXNjb3JlXCIgW2NsYXNzLmlzLWVtcHR5XT1cInJvdy5wZXJmID09PSAn4oCUJ1wiPjxzcGFuIGNsYXNzPVwiZGItdHJhY2tcIj48c3BhbiBbc3R5bGUud2lkdGhdPVwiYmFyV2lkdGgocm93LnBlcmYpXCI+PC9zcGFuPjwvc3Bhbj48c3BhbiBjbGFzcz1cImRiLXNjb3JldGV4dCBkYi1zY29yZXRleHQtLXNtXCI+e3sgcm93LnBlcmYgfX08L3NwYW4+PC9kaXY+PC90ZD5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxhIGNsYXNzPVwiZGItZXllXCIgdGl0bGU9XCJWaWV3IHVzZXJcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS90cmF4L2F1ZGl0LXYyL2Rhc2hib2FyZC91c2VyXCIgW3F1ZXJ5UGFyYW1zXT1cImRldGFpbFBhcmFtcyh7IGVtYWlsOiByb3cuZW1haWwgfSlcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE3XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS45XCJcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMS41IDEyUzUgNS41IDEyIDUuNSAyMi41IDEyIDIyLjUgMTIgMTkgMTguNSAxMiAxOC41IDEuNSAxMiAxLjUgMTJ6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjNcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90Ym9keT5cclxuICAgICAgPC90YWJsZT5cclxuICAgICAgPGRpdiAqbmdJZj1cIiFmaWx0ZXJlZFVzZXJQZXJmLmxlbmd0aFwiIGNsYXNzPVwiYXYyLWVtcHR5XCI+XHJcbiAgICAgICAgPGltZyBjbGFzcz1cImF2Mi1lbXB0eS1pbWdcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGExLnN2Z1wiIGFsdD1cIlwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktdGV4dFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS10aXRsZVwiPk5vIGRhdGEgZm91bmQ8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktc3ViXCI+e3sgcGVyZlNlYXJjaC50cmltKCkgPyAnTm8gdXNlciBtYXRjaGVzIHRoaXMgc2VhcmNoLicgOiAnVGhlcmUgaXMgbm8gcmVzdWx0IGZvciBVc2VyIFBlcmZvcm1hbmNlIGluIHRoaXMgcGVyaW9kLicgfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFNoYXJlZCBwYWdlciAoMTAgLyAyMCAvIDMwKSwgYXMgb24gdGhlIG90aGVyIGF1ZGl0IGxpc3RzLiAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJkYi1wZXJmLXBhZ2VyXCIgKm5nSWY9XCJwZXJmVG90YWxcIj5cclxuICAgICAgPGxpYi1wYWdpbmF0aW9uIFtpdGVtc1BlclBhZ2VdPVwicGVyZlBhZ2VTaXplXCIgW3BhZ2VTaXplXT1cInBlcmZQYWdlU2l6ZVwiIFtwYWdpbmF0aW9uU2l6ZXNdPVwicGVyZlBhZ2VTaXplc1wiXHJcbiAgICAgICAgW2N1cnJlbnRQYWdlXT1cInBlcmZQYWdlXCIgW3RvdGFsSXRlbXNdPVwicGVyZlRvdGFsXCIgKHBhZ2VDaGFuZ2UpPVwib25QZXJmUGFnZSgkZXZlbnQpXCJcclxuICAgICAgICAocGFnZVNpemVDaGFuZ2UpPVwib25QZXJmUGFnZVNpemUoJGV2ZW50KVwiPjwvbGliLXBhZ2luYXRpb24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvc2VjdGlvbj5cclxuXHJcbiAgPCEtLSA9PT09PT09PT09PT0gRklMVEVSIERSQVdFUiA9PT09PT09PT09PT0gLS0+XHJcbiAgPGRpdiBjbGFzcz1cImZpbHRlci1iYWNrZHJvcFwiICpuZ0lmPVwiZmlsdGVyc09wZW5cIiAoY2xpY2spPVwiY2FuY2VsRmlsdGVycygpXCI+PC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJmaWx0ZXItZHJhd2VyXCIgKm5nSWY9XCJmaWx0ZXJzT3BlbiAmJiBkcmFmdCBhcyBkclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImRyYXdlci1oZWFkXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiZHJhd2VyLXRpdGxlXCI+RmlsdGVyczwvc3Bhbj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJkYi1jb3VudHBpbGxcIiAqbmdJZj1cImRyLmZpbHRlckNvdW50XCI+e3sgZHIuZmlsdGVyQ291bnQgfX08L3NwYW4+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJhdjItZ3Jvd1wiPjwvZGl2PlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlYnRuXCIgKGNsaWNrKT1cImNhbmNlbEZpbHRlcnMoKVwiIHRpdGxlPVwiQ2xvc2VcIj5cclxuICAgICAgICA8c3ZnIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjxsaW5lIHgxPVwiNlwiIHkxPVwiNlwiIHgyPVwiMThcIiB5Mj1cIjE4XCI+PC9saW5lPjxsaW5lIHgxPVwiMThcIiB5MT1cIjZcIiB4Mj1cIjZcIiB5Mj1cIjE4XCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJkcmF3ZXItYm9keVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZHJhd2VyLW5hdlwiPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZHJhd2VyLW5hdml0ZW1cIiAqbmdGb3I9XCJsZXQgYyBvZiBkci5maWx0ZXJDYXRzOyB0cmFja0J5OiB0cmFja0J5Q2F0XCIgW2NsYXNzLm5hdml0ZW0tYWN0aXZlXT1cImFjdGl2ZUNhdCA9PT0gYy5rZXlcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cInNlbGVjdENhdChjLmtleSlcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmF2dGV4dFwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5hdnRpdGxlXCI+e3sgYy5sYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuYXZ2YWx1ZVwiIFtjbGFzcy5pcy1kaXJ0eV09XCJjLmRpcnR5XCI+e3sgYy52YWx1ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGlydHlkb3RcIiAqbmdJZj1cImMuZGlydHlcIj48L3NwYW4+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImRyYXdlci1wYW5lXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmV0aXRsZVwiPnt7IGRyLmFjdGl2ZUNhdE9iai50aXRsZSB9fTwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5laGludFwiPnt7IGRyLmFjdGl2ZUNhdE9iai5zdWIgfX08L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBQZXJpb2QgLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjdGl2ZUNhdCA9PT0gJ3BlcmlvZCdcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lLW9wdGlvbnNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmUtb3B0aW9uXCIgW2NsYXNzLmlzLW9uXT1cImRyLmdyYWluID09PSAncXVhcnRlcidcIiAoY2xpY2spPVwiZHIuc2V0R3JhaW4oJ3F1YXJ0ZXInKVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZS1yYWRpb1wiIFtjbGFzcy5pcy1vbl09XCJkci5ncmFpbiA9PT0gJ3F1YXJ0ZXInXCI+PHNwYW4+PC9zcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbmUtb3B0aW9uLXRleHRcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZS1vcHRpb24tbGFiZWxcIj5RdWFydGVybHk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbmUtb3B0aW9uLWhlbHBcIj5SZWFkIG9uZSBmaW5hbmNpYWwgcXVhcnRlciAoQXByaWzigJNNYXJjaCB5ZWFyKSBhdCBhIHRpbWUuPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lLW9wdGlvblwiIFtjbGFzcy5pcy1vbl09XCJkci5ncmFpbiA9PT0gJ2RhdGUnXCIgKGNsaWNrKT1cImRyLnNldEdyYWluKCdkYXRlJylcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbmUtcmFkaW9cIiBbY2xhc3MuaXMtb25dPVwiZHIuZ3JhaW4gPT09ICdkYXRlJ1wiPjxzcGFuPjwvc3Bhbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYW5lLW9wdGlvbi10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbmUtb3B0aW9uLWxhYmVsXCI+QnkgZGF0ZTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZS1vcHRpb24taGVscFwiPlBpY2sgYSBjdXN0b20gc3RhcnQgYW5kIGVuZCBkYXRlLjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmUtbGlzdFwiICpuZ0lmPVwiZHIuZ3JhaW4gPT09ICdxdWFydGVyJ1wiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm9wdGlvbnJvd1wiICpuZ0Zvcj1cImxldCBxIG9mIGRyLnF1YXJ0ZXJzXCIgW2NsYXNzLm9wdGlvbi1zZWxlY3RlZF09XCJkci5xdWFydGVyID09PSBxXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiZHIuc2VsZWN0UXVhcnRlcihxKVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0aW9ubWFya1wiIFtjbGFzcy5tYXJrLW9uXT1cImRyLnF1YXJ0ZXIgPT09IHFcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJkci5xdWFydGVyID09PSBxXCIgd2lkdGg9XCIxMVwiIGhlaWdodD1cIjExXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0bGFiZWxcIj57eyBxIH19IMK3IHt7IHF1YXJ0ZXJNb250aHMocSkgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmUtZmllbGRzXCIgKm5nSWY9XCJkci5ncmFpbiA9PT0gJ2RhdGUnXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZFwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5EYXRlIHJhbmdlPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZGF0ZXBpY2sgYXYyLWRhdGVwaWNrLS1jb21wYWN0XCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiYXYyLWRhdGVwaWNrLWljb25cIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHJlY3QgeD1cIjNcIiB5PVwiNFwiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHJ4PVwiMlwiPjwvcmVjdD5cclxuICAgICAgICAgICAgICAgICAgPGxpbmUgeDE9XCIxNlwiIHkxPVwiMlwiIHgyPVwiMTZcIiB5Mj1cIjZcIj48L2xpbmU+PGxpbmUgeDE9XCI4XCIgeTE9XCIyXCIgeDI9XCI4XCIgeTI9XCI2XCI+PC9saW5lPjxsaW5lIHgxPVwiM1wiIHkxPVwiMTBcIiB4Mj1cIjIxXCIgeTI9XCIxMFwiPjwvbGluZT48L3N2Zz5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiYXYyLWRhdGVwaWNrLWlucHV0IGRiLWRhdGVyYW5nZSBkYi1kYXRlcmFuZ2UtLWZpZWxkXCIgbmd4RGF0ZXJhbmdlcGlja2VyTWQgcmVhZG9ubHlcclxuICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCIgcGxhY2Vob2xkZXI9XCJTZWxlY3QgZGF0ZSByYW5nZVwiIFsobmdNb2RlbCldPVwiZHIucmFuZ2VcIiBbbG9jYWxlXT1cInBpY2tlckxvY2FsZVwiXHJcbiAgICAgICAgICAgICAgICAgIFttYXhEYXRlXT1cInRvZGF5XCIgW2RhdGVMaW1pdF09XCJtYXhSYW5nZURheXNcIiBbYXV0b0FwcGx5XT1cInRydWVcIiBbYWx3YXlzU2hvd0NhbGVuZGFyc109XCJ0cnVlXCIgW3Nob3dDYW5jZWxdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICBbZHJvcHNdPVwiJ2Rvd24nXCIgW29wZW5zXT1cIidyaWdodCdcIiAoZGF0ZXNVcGRhdGVkKT1cImRyLm9uUmFuZ2VQaWNrZWQoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8IS0tIFNjb3BlIC0tPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY3RpdmVDYXQgPT09ICdzY29wZSdcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lLXN0YWNrXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBmaWVsZC0tZnVsbFwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5DaXJjbGUgSGVhZCA8c3BhbiBjbGFzcz1cImZpZWxkLW1ldGFcIj57eyBkci5jaXJjbGVzLmxlbmd0aCB9fSB1c2Vyczwvc3Bhbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPGxpYi1hdWRpdC12Mi1zZWxlY3QgY2xhc3M9XCJmaWVsZC1zZWxlY3RcIiBbKG5nTW9kZWwpXT1cImRyLmNpcmNsZVwiIChuZ01vZGVsQ2hhbmdlKT1cImRyLm9uQ2lyY2xlQ2hhbmdlKClcIiBbb3B0aW9uc109XCJkci5waWNrT3B0aW9ucyhkci5jaXJjbGVzLCAnQWxsIENpcmNsZXMnKVwiIGFyaWFMYWJlbD1cIkNpcmNsZVwiPjwvbGliLWF1ZGl0LXYyLXNlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBmaWVsZC0tZnVsbFwiICpuZ0lmPVwiZHIuY2lyY2xlXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWVsZC1sYWJlbFwiPlpvbmUgTWFuYWdlcjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8bGliLWF1ZGl0LXYyLXNlbGVjdCBjbGFzcz1cImZpZWxkLXNlbGVjdFwiIFsobmdNb2RlbCldPVwiZHIuem9uZVwiIChuZ01vZGVsQ2hhbmdlKT1cImRyLm9uWm9uZUNoYW5nZSgpXCIgW29wdGlvbnNdPVwiZHIucGlja09wdGlvbnMoZHIuem9uZXMsICdBbGwgem9uZXMnKVwiIGFyaWFMYWJlbD1cIlpvbmVcIj48L2xpYi1hdWRpdC12Mi1zZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgZmllbGQtLWZ1bGxcIiAqbmdJZj1cImRyLnpvbmVcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpZWxkLWxhYmVsXCI+QU9NPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxsaWItYXVkaXQtdjItc2VsZWN0IGNsYXNzPVwiZmllbGQtc2VsZWN0XCIgWyhuZ01vZGVsKV09XCJkci5hb21cIiAobmdNb2RlbENoYW5nZSk9XCJkci5vbkFvbUNoYW5nZSgpXCIgW29wdGlvbnNdPVwiZHIucGlja09wdGlvbnMoZHIuYW9tcywgJ0FsbCBBT01zJylcIiBhcmlhTGFiZWw9XCJBT01cIj48L2xpYi1hdWRpdC12Mi1zZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgZmllbGQtLWZ1bGxcIiAqbmdJZj1cImRyLmFvbVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5TdG9yZTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8bGliLWF1ZGl0LXYyLXNlbGVjdCBjbGFzcz1cImZpZWxkLXNlbGVjdFwiIFsobmdNb2RlbCldPVwiZHIuc3RvcmVcIiBbb3B0aW9uc109XCJkci5zdG9yZVBpY2tPcHRpb25zXCIgYXJpYUxhYmVsPVwiU3RvcmVcIj48L2xpYi1hdWRpdC12Mi1zZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVhZGluZ3Jvd1wiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVhZGluZ2xhYmVsXCI+UmVhZGluZzwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlYWRpbmd2YWx1ZVwiPnt7IGRyLnNjb3BlUmVhZGluZyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImF2Mi1ncm93XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxhIGNsYXNzPVwiZGItYmFuZGxpbmtcIiAoY2xpY2spPVwiZHIucmVzZXRTY29wZSgpXCI+UmVzZXQgdG8gYWxsIGNpcmNsZXM8L2E+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDwhLS0gQXVkaXQgdHlwZSAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZS1saXN0XCIgKm5nSWY9XCJhY3RpdmVDYXQgPT09ICd0eXBlJ1wiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJvcHRpb25yb3dcIiAqbmdGb3I9XCJsZXQgdCBvZiBhdWRpdFR5cGVzXCIgW2NsYXNzLm9wdGlvbi1zZWxlY3RlZF09XCJkci5hdWRpdFR5cGUgPT09IHQua2V5XCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImRyLmF1ZGl0VHlwZSA9IHQua2V5XCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0aW9ubWFya1wiIFtjbGFzcy5tYXJrLW9uXT1cImRyLmF1ZGl0VHlwZSA9PT0gdC5rZXlcIj5cclxuICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiZHIuYXVkaXRUeXBlID09PSB0LmtleVwiIHdpZHRoPVwiMTFcIiBoZWlnaHQ9XCIxMVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdHRleHRcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGxhYmVsXCI+e3sgdC5sYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdG1ldGFcIj57eyB0LmhlbHAgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFNjb3JlIGJhbmQgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmUtbGlzdFwiICpuZ0lmPVwiYWN0aXZlQ2F0ID09PSAnYmFuZCdcIj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3B0aW9ucm93XCIgKm5nRm9yPVwibGV0IGIgb2YgZHIuYmFuZFJvd3M7IHRyYWNrQnk6IHRyYWNrQnlCYW5kXCIgW2NsYXNzLm9wdGlvbi1zZWxlY3RlZF09XCJkci5pc0JhbmRPbihiLmJhbmQpXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImRyLmFwcGx5QmFuZChiLmJhbmQpXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItYmFuZGRvdFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImIuYmFuZC5zb2Z0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdHRleHRcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGxhYmVsXCI+e3sgYi5iYW5kLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0bWV0YVwiPnt7IGIuYmFuZC5yYW5nZSB9fSDCtyB7eyBiLmNvdW50IH19IHN0b3Jlczwvc3Bhbj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tZ2hvc3QgYXYyLWJ0bi0tc20gcGFuZS1yZXNldGJ0blwiIChjbGljayk9XCJkci5jbGVhckJhbmQoKVwiPkFsbCBzY29yZXM8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBTdGF0dXMgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmUtbGlzdFwiICpuZ0lmPVwiYWN0aXZlQ2F0ID09PSAnc3RhdHVzJ1wiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJvcHRpb25yb3dcIiBbY2xhc3Mub3B0aW9uLXNlbGVjdGVkXT1cImRyLnN0YXR1cyA9PT0gJ2FsbCdcIiAoY2xpY2spPVwiZHIuc2V0U3RhdHVzKCdhbGwnKVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGlvbm1hcmtcIiBbY2xhc3MubWFyay1vbl09XCJkci5zdGF0dXMgPT09ICdhbGwnXCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImRyLnN0YXR1cyA9PT0gJ2FsbCdcIiB3aWR0aD1cIjExXCIgaGVpZ2h0PVwiMTFcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRsYWJlbFwiPkFsbCBzdG9yZXM8L3NwYW4+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3B0aW9ucm93XCIgW2NsYXNzLm9wdGlvbi1zZWxlY3RlZF09XCJkci5zdGF0dXMgPT09ICdmYWlsJ1wiIChjbGljayk9XCJkci5zZXRTdGF0dXMoJ2ZhaWwnKVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGlvbm1hcmtcIiBbY2xhc3MubWFyay1vbl09XCJkci5zdGF0dXMgPT09ICdmYWlsJ1wiPlxyXG4gICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJkci5zdGF0dXMgPT09ICdmYWlsJ1wiIHdpZHRoPVwiMTFcIiBoZWlnaHQ9XCIxMVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGxhYmVsXCI+RmFpbDwvc3Bhbj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJvcHRpb25yb3dcIiBbY2xhc3Mub3B0aW9uLXNlbGVjdGVkXT1cImRyLnN0YXR1cyA9PT0gJ3Bhc3MnXCIgKGNsaWNrKT1cImRyLnNldFN0YXR1cygncGFzcycpXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0aW9ubWFya1wiIFtjbGFzcy5tYXJrLW9uXT1cImRyLnN0YXR1cyA9PT0gJ3Bhc3MnXCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImRyLnN0YXR1cyA9PT0gJ3Bhc3MnXCIgd2lkdGg9XCIxMVwiIGhlaWdodD1cIjExXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiMjAgNiA5IDE3IDQgMTJcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0bGFiZWxcIj5QYXNzPC9zcGFuPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm9wdGlvbnJvd1wiIFtjbGFzcy5vcHRpb24tc2VsZWN0ZWRdPVwiZHIuc3RhdHVzID09PSAndW5zY29yZWQnXCIgKGNsaWNrKT1cImRyLnNldFN0YXR1cygndW5zY29yZWQnKVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGlvbm1hcmtcIiBbY2xhc3MubWFyay1vbl09XCJkci5zdGF0dXMgPT09ICd1bnNjb3JlZCdcIj5cclxuICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiZHIuc3RhdHVzID09PSAndW5zY29yZWQnXCIgd2lkdGg9XCIxMVwiIGhlaWdodD1cIjExXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiMjAgNiA5IDE3IDQgMTJcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0bGFiZWxcIj5Ob3Qgc2NvcmVkPC9zcGFuPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm9wdGlvbnJvd1wiIFtjbGFzcy5vcHRpb24tc2VsZWN0ZWRdPVwiZHIuc3RhdHVzID09PSAnbmEnXCIgKGNsaWNrKT1cImRyLnNldFN0YXR1cygnbmEnKVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGlvbm1hcmtcIiBbY2xhc3MubWFyay1vbl09XCJkci5zdGF0dXMgPT09ICduYSdcIj5cclxuICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiZHIuc3RhdHVzID09PSAnbmEnXCIgd2lkdGg9XCIxMVwiIGhlaWdodD1cIjExXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiMjAgNiA5IDE3IDQgMTJcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0bGFiZWxcIj5Ob3QgYXVkaXRlZDwvc3Bhbj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJkcmF3ZXItZm9vdFwiPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tZ2hvc3RcIiAoY2xpY2spPVwiZHIuY2xlYXJBbGwoKVwiPkNsZWFyIGFsbDwvYnV0dG9uPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYXYyLWdyb3dcIj48L2Rpdj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGF2Mi1idG4tLWdob3N0XCIgKGNsaWNrKT1cImNhbmNlbEZpbHRlcnMoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tcHJpbWFyeSBhdjItYnRuLS13aWRlXCIgKGNsaWNrKT1cImFwcGx5RmlsdGVycygpXCI+QXBwbHkgZmlsdGVyczwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG48L2Rpdj5cclxuIl19
1530
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtdjItZGFzaGJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2UtdHJheC9zcmMvbGliL2NvbXBvbmVudHMvYXVkaXQtdjIvZGFzaGJvYXJkL2F1ZGl0LXYyLWRhc2hib2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYXgvc3JjL2xpYi9jb21wb25lbnRzL2F1ZGl0LXYyL2Rhc2hib2FyZC9hdWRpdC12Mi1kYXNoYm9hcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUc1QyxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFFMUIsT0FBTyxFQUFlLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlELE9BQU8sRUFBRSxhQUFhLEVBQTRCLGVBQWUsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFrSS9ILE1BQU0sZ0JBQWdCLEdBQWM7SUFDbEMsV0FBVyxFQUFFLEdBQUc7SUFDaEIsYUFBYSxFQUFFLEdBQUc7SUFDbEIsWUFBWSxFQUFFLEdBQUc7SUFDakIsU0FBUyxFQUFFLEdBQUc7SUFDZCxVQUFVLEVBQUUsR0FBRztJQUNmLFNBQVMsRUFBRSxHQUFHO0lBQ2QsZUFBZSxFQUFFLEdBQUc7SUFDcEIsZUFBZSxFQUFFLEdBQUc7SUFDcEIsVUFBVSxFQUFFLEdBQUc7SUFDZixlQUFlLEVBQUUs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Q0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN2RixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7S0FDckcsQ0FBQztJQUNlLGFBQWEsR0FBa0Q7UUFDOUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVE7UUFDcEcsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSTtRQUN2RyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDO0tBQzdDLENBQUM7SUFDZSxjQUFjLEdBQW1EO1FBQ2hGLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUs7UUFDL0csVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDO0tBQ3BJLENBQUM7SUFDZSxhQUFhLEdBQWtEO1FBQzlFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUk7UUFDekcsVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxD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RUFBRSxNQUFNLElBQUksRUFBRSxDQUFDO0lBQzVELENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCwwQ0FBMEM7SUFDbEMsY0FBYztRQUNwQixPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEcsQ0FBQztJQUVELElBQVksZ0JBQWdCO1FBQzFCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDdkIsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVPLFlBQVksQ0FBQyxDQUFXLEVBQUUsSUFBZTtRQUMvQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQztlQUNwRixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7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QUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDMUMsSUFBSSxFQUFFLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMvQixJQUFJLEdBQUcsRUFBRSxJQUFJLEtBQUssR0FBRyxFQUFFO29CQUNyQixJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxtRUFBbUUsQ0FBQyxDQUFDO2lCQUNqRztZQUNILENBQUM7WUFDRCxLQUFLLEVBQUUsR0FBRyxFQUFFO2dCQUNWLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1lBQ3BELENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO3dHQS83Q1UseUJBQXlCOzRGQUF6Qix5QkFBeUIsOERDN090QyxxOW5EQTIxQkE7OzRGRDltQmEseUJBQXlCO2tCQUxyQyxTQUFTOytCQUNFLHdCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN1YmplY3QsIGRlYm91bmNlVGltZSwgZm9ya0pvaW4sIG9mLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLWdsb2JhbCc7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1zaGFyZWQnO1xyXG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnO1xyXG5pbXBvcnQgeyBUcmF4U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RyYXguc2VydmljZSc7XHJcbmltcG9ydCB7IEF1ZGl0QWNjZXNzLCBhdWRpdEFjY2VzcyB9IGZyb20gJy4uL2F1ZGl0LXYyLWFjY2Vzcyc7XHJcbmltcG9ydCB7IFBJQ0tFUl9MT0NBTEUsIFBpY2tlZERhdGVzLCBQaWNrZXJSYW5nZSwgZnJvbVBpY2tlclJhbmdlLCBwaWNrZXJSYW5nZXMsIHRvUGlja2VyUmFuZ2UgfSBmcm9tICcuLi9hdWRpdC12Mi1kYXRlcGlja2VyJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXVkaXRCYW5kIHtcclxuICBrZXk6IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIHJhbmdlOiBzdHJpbmc7XHJcbiAgbG86IG51bWJlcjtcclxuICBoaTogbnVtYmVyO1xyXG4gIHNvZnQ6IHN0cmluZztcclxuICBiZzogc3RyaW5nO1xyXG4gIGZnOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXVkaXRSb3cge1xyXG4gIGRhdGU6IHN0cmluZztcclxuICBzdG9yZUlkOiBzdHJpbmc7XHJcbiAgY2lyY2xlOiBzdHJpbmc7XHJcbiAgem9uZTogc3RyaW5nO1xyXG4gIGFvbTogc3RyaW5nO1xyXG4gIHNjb3JlOiBudW1iZXIgfCBudWxsO1xyXG4gIC8qKiAndW5zY29yZWQnID0gYXVkaXRlZCwgYnV0IG5vIHF1ZXN0aW9uIG9mIGl0cyBhdWRpdHMgaGFzIGNvbXBsaWFuY2Ugc2NvcmluZyBvbiAobm8gc2NvcmUgdG8gc2hvdykuICovXHJcbiAgc3RhdHVzOiBTdG9yZVN0YXR1cztcclxuICByYXc/OiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFN0b3JlU3RhdHVzID0gJ3Bhc3MnIHwgJ2ZhaWwnIHwgJ25hJyB8ICd1bnNjb3JlZCc7XHJcbmV4cG9ydCB0eXBlIFN0YXR1c0ZpbHRlciA9ICdhbGwnIHwgU3RvcmVTdGF0dXM7XHJcblxyXG4vKiogQSBzb3J0YWJsZSBjb2x1bW4gb2YgYSBQZXJmb3JtYW5jZSB0YWJsZS4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBQZXJmQ29sdW1uIHtcclxuICBrZXk6IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG59XHJcblxyXG50eXBlIFNvcnRWYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQ7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0S3BpIHtcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIHZhbHVlOiBzdHJpbmc7XHJcbiAgbm90ZTogc3RyaW5nO1xyXG4gIG5vdGVDb2xvcjogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlckNhdCB7XHJcbiAga2V5OiBzdHJpbmc7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICB2YWx1ZTogc3RyaW5nO1xyXG4gIHRpdGxlOiBzdHJpbmc7XHJcbiAgc3ViOiBzdHJpbmc7XHJcbiAgZGlydHk6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXVkaXRQZXJmUm93IHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgaW5pdGlhbHM6IHN0cmluZztcclxuICBzY2hlZHVsZWQ6IHN0cmluZztcclxuICBhc3NpZ25lZDogbnVtYmVyO1xyXG4gIHN1Ym1pdHRlZDogbnVtYmVyO1xyXG4gIGRpc3B1dGVzOiBudW1iZXIgfCBudWxsO1xyXG4gIHBhc3NNYXJrOiBzdHJpbmc7XHJcbiAgc2NvcmU6IHN0cmluZztcclxuICBzY29yZVBjdDogbnVtYmVyO1xyXG4gIC8qKiAn4oCUJyB3aGVuIHRoZSBhdWRpdCBoYXMgbm8gY29tcGxpYW5jZSBzY29yaW5nIChubyBzY29yZSwgc28gbm8gcmVzdWx0KS4gKi9cclxuICByZXN1bHQ6ICdQYXNzJyB8ICdGYWlsJyB8ICfigJQnO1xyXG4gIHJhdz86IGFueTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTdG9yZVBlcmZSb3cge1xyXG4gIHN0b3JlSWQ6IHN0cmluZztcclxuICBzdG9yZTogc3RyaW5nO1xyXG4gIHNwb2M6IHN0cmluZztcclxuICBhc3NpZ25lZDogbnVtYmVyO1xyXG4gIGZsYWdzOiBudW1iZXIgfCBudWxsO1xyXG4gIGNvbXBsZXRpb246IHN0cmluZztcclxuICBjb21wbGlhbmNlOiBzdHJpbmc7XHJcbiAgcGVyZjogc3RyaW5nO1xyXG4gIHJhdz86IGFueTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBVc2VyUGVyZlJvdyB7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIGVtYWlsOiBzdHJpbmc7XHJcbiAgYXNzaWduZWQ6IG51bWJlcjtcclxuICBmbGFnczogbnVtYmVyO1xyXG4gIHJlZG86IG51bWJlcjtcclxuICBjb21wbGV0aW9uOiBzdHJpbmc7XHJcbiAgY29tcGxpYW5jZTogc3RyaW5nO1xyXG4gIHBlcmY6IHN0cmluZztcclxuICByYXc/OiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGFza1BlcmZSb3cge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBpbml0aWFsczogc3RyaW5nO1xyXG4gIHNjaGVkdWxlZDogc3RyaW5nO1xyXG4gIGNvdmVyYWdlOiBzdHJpbmc7XHJcbiAgYXNzaWduZWQ6IG51bWJlcjtcclxuICBzdWJtaXR0ZWQ6IG51bWJlcjtcclxuICBmbGFnczogbnVtYmVyO1xyXG4gIHRhc2tzOiBzdHJpbmc7XHJcbiAgcmVkbzogbnVtYmVyO1xyXG4gIGNvbXBsaWFuY2U6IHN0cmluZztcclxuICBjb21wbGlhbmNlUGN0OiBudW1iZXI7XHJcbiAgcmF3PzogYW55O1xyXG59XHJcblxyXG4vKiogVGFzay1tb2RlIHRpbGVzLCBhcyBkaXNwbGF5ZWQgKCfigJQnIHdoZW4gdGhlIEFQSSBoYXMgbm8gdmFsdWUpLiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFRhc2tTdGF0cyB7XHJcbiAgYWN0aXZlVGFza3M6IHN0cmluZztcclxuICB0YXNrSW5zdGFuY2VzOiBzdHJpbmc7XHJcbiAgbm90U3VibWl0dGVkOiBzdHJpbmc7XHJcbiAgb3BlblRhc2tzOiBzdHJpbmc7XHJcbiAgaW5Qcm9ncmVzczogc3RyaW5nO1xyXG4gIHN1Ym1pdHRlZDogc3RyaW5nO1xyXG4gIGNvbXBsZXRpb25TY29yZTogc3RyaW5nO1xyXG4gIGNvbXBsaWFuY2VTY29yZTogc3RyaW5nO1xyXG4gIHRvdGFsRmxhZ3M6IHN0cmluZztcclxuICBjb21wbGV0aW9uRGVsdGE6IHN0cmluZztcclxuICBjb21wbGlhbmNlRGVsdGE6IHN0cmluZztcclxuICBmbGFnc0RlbHRhOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFRhc2tEZWx0YUtleSA9ICdjb21wbGV0aW9uJyB8ICdjb21wbGlhbmNlJyB8ICdmbGFncyc7XHJcblxyXG4vKiogT25lIGV4cG9ydGVkIGNvbHVtbjogaGVhZGVyIHRleHQgYW5kIHRoZSBjZWxsIHZhbHVlIGZvciBhIHJvdy4gKi9cclxuaW50ZXJmYWNlIEV4cG9ydENvbHVtbjxUPiB7XHJcbiAgaGVhZGVyOiBzdHJpbmc7XHJcbiAgdmFsdWU6IChyb3c6IFQpID0+IGFueTtcclxufVxyXG5cclxuY29uc3QgRU1QVFlfVEFTS19TVEFUUzogVGFza1N0YXRzID0ge1xyXG4gIGFjdGl2ZVRhc2tzOiAn4oCUJyxcclxuICB0YXNrSW5zdGFuY2VzOiAn4oCUJyxcclxuICBub3RTdWJtaXR0ZWQ6ICfigJQnLFxyXG4gIG9wZW5UYXNrczogJ+KAlCcsXHJcbiAgaW5Qcm9ncmVzczogJ+KAlCcsXHJcbiAgc3VibWl0dGVkOiAn4oCUJyxcclxuICBjb21wbGV0aW9uU2NvcmU6ICfigJQnLFxyXG4gIGNvbXBsaWFuY2VTY29yZTogJ+KAlCcsXHJcbiAgdG90YWxGbGFnczogJ+KAlCcsXHJcbiAgY29tcGxldGlvbkRlbHRhOiAnJyxcclxuICBjb21wbGlhbmNlRGVsdGE6ICcnLFxyXG4gIGZsYWdzRGVsdGE6ICcnXHJcbn07XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFRyZW5kQmFyIHtcclxuICBrZXk6IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIC8qKiBBdmVyYWdlIG9mIHRoZSBjb21wbGlhbmNlLXNjb3JlZCBhdWRpdHM7IG51bGwgd2hlbiBub25lLiAqL1xyXG4gIHZhbHVlOiBudW1iZXIgfCBudWxsO1xyXG4gIC8qKiBDb21wbGlhbmNlLXNjb3JlZCBhdWRpdHMgKHRoZSBvbmVzIHRoZSBhdmVyYWdlIHJlYWRzKS4gKi9cclxuICBjb3VudDogbnVtYmVyO1xyXG4gIC8qKiBFdmVyeSBzdWJtaXR0ZWQgYXVkaXQsIHNjb3JlZCBvciBub3QuICovXHJcbiAgc3VibWl0dGVkOiBudW1iZXI7XHJcbn1cclxuXHJcbi8qKiBPbmUgZmluYW5jaWFsIHF1YXJ0ZXI6IEFwcmlsLU1hcmNoIHllYXIsIG5hbWVkIGJ5IHRoZSB5ZWFyIGl0IHN0YXJ0cyBpbiAocHJvdG90eXBlOiBBdWcgMjAyNiA9IFEyIEZZMjYpLiAqL1xyXG5pbnRlcmZhY2UgRmlzY2FsUXVhcnRlciB7XHJcbiAga2V5OiBzdHJpbmc7XHJcbiAgZnJvbTogc3RyaW5nO1xyXG4gIHRvOiBzdHJpbmc7XHJcbiAgbW9udGhzOiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKiBUaGUgbGFzdCBgbmAgZmluYW5jaWFsIHF1YXJ0ZXJzLCBvbGRlc3QgZmlyc3QsIGVuZGluZyB3aXRoIHRoZSBvbmUgYHRvZGF5YCBmYWxscyBpbi4gKi9cclxuZnVuY3Rpb24gZmlzY2FsUXVhcnRlcnModG9kYXkgPSBkYXlqcygpLCBuID0gNCk6IEZpc2NhbFF1YXJ0ZXJbXSB7XHJcbiAgY29uc3QgY3VycmVudCA9IHRvZGF5LnN0YXJ0T2YoJ21vbnRoJykuc3VidHJhY3QoKHRvZGF5Lm1vbnRoKCkgKyA5KSAlIDMsICdtb250aCcpO1xyXG4gIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBuIH0sIChfLCBpKSA9PiB7XHJcbiAgICBjb25zdCBzdGFydCA9IGN1cnJlbnQuc3VidHJhY3QoMyAqIChuIC0gMSAtIGkpLCAnbW9udGgnKTtcclxuICAgIGNvbnN0IGVuZCA9IHN0YXJ0LmFkZCgyLCAnbW9udGgnKS5lbmRPZignbW9udGgnKTtcclxuICAgIGNvbnN0IGZ5ID0gc3RhcnQubW9udGgoKSA+PSAzID8gc3RhcnQueWVhcigpIDogc3RhcnQueWVhcigpIC0gMTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGtleTogJ1EnICsgKE1hdGguZmxvb3IoKChzdGFydC5tb250aCgpICsgOSkgJSAxMikgLyAzKSArIDEpICsgJyBGWScgKyBTdHJpbmcoZnkpLnNsaWNlKDIpLFxyXG4gICAgICBmcm9tOiBzdGFydC5mb3JtYXQoJ1lZWVktTU0tREQnKSxcclxuICAgICAgdG86IGVuZC5mb3JtYXQoJ1lZWVktTU0tREQnKSxcclxuICAgICAgbW9udGhzOiBzdGFydC5mb3JtYXQoJ01NTScpICsgJyDigJMgJyArIGVuZC5mb3JtYXQoJ01NTSBZWVlZJylcclxuICAgIH07XHJcbiAgfSk7XHJcbn1cclxuXHJcbi8qKiBQYXNzIG1hcmsgYW5kIGNyaXRpY2FsIHRocmVzaG9sZCBmb3IgdGhlIGF1ZGl0IHByb2dyYW1tZSAobm8gcGVyLWF1ZGl0IHBhc3MgbWFyayBpbiB0aGUgZGF0YSB5ZXQpLiAqL1xyXG5jb25zdCBQQVNTX01BUksgPSA3NTtcclxuY29uc3QgQ1JJVElDQUxfTUFSSyA9IDYwO1xyXG5cclxuY29uc3QgQkFORFM6IEF1ZGl0QmFuZFtdID0gW1xyXG4gIHsga2V5OiAnZXhjZWxsZW50JywgbGFiZWw6ICdFeGNlbGxlbnQnLCByYW5nZTogJzkwLTEwMCUnLCBsbzogOTAsIGhpOiAxMDAsIHNvZnQ6ICcjOEZCRkE1JywgYmc6ICcjRUNGREYzJywgZmc6ICcjMDI3QTQ4JyB9LFxyXG4gIHsga2V5OiAnZ29vZCcsIGxhYmVsOiAnR29vZCcsIHJhbmdlOiAnNzUtODklJywgbG86IDc1LCBoaTogODksIHNvZnQ6ICcjOTZCNEQ2JywgYmc6ICcjRUZGOEZGJywgZmc6ICcjMTc1Q0QzJyB9LFxyXG4gIHsga2V5OiAnZmFpcicsIGxhYmVsOiAnTmVlZHMgaW1wcm92ZW1lbnQnLCByYW5nZTogJzYwLTc0JScsIGxvOiA2MCwgaGk6IDc0LCBzb2Z0OiAnI0RDQkU4QycsIGJnOiAnI0ZGRkFFQicsIGZnOiAnI0I1NDcwOCcgfSxcclxuICB7IGtleTogJ2NyaXRpY2FsJywgbGFiZWw6ICdDcml0aWNhbCcsIHJhbmdlOiAnQmVsb3cgNjAlJywgbG86IDAsIGhpOiA1OSwgc29mdDogJyNENkExOUInLCBiZzogJyNGRUYzRjInLCBmZzogJyNCNDIzMTgnIH0sXHJcbiAgeyBrZXk6ICd1bnNjb3JlZCcsIGxhYmVsOiAnTm90IHNjb3JlZCcsIHJhbmdlOiAnQ29tcGxpYW5jZSBzY29yZSBvZmYnLCBsbzogMCwgaGk6IDEwMCwgc29mdDogJyNDN0Q3RkUnLCBiZzogJyNFRUY0RkYnLCBmZzogJyMzNTM4Q0QnIH0sXHJcbiAgeyBrZXk6ICduYScsIGxhYmVsOiAnTm90IGF1ZGl0ZWQnLCByYW5nZTogJ05vIHN1Ym1pc3Npb24nLCBsbzogMCwgaGk6IDEwMCwgc29mdDogJyNENkRBRTAnLCBiZzogJyNGMkY0RjcnLCBmZzogJyM0NzU0NjcnIH1cclxuXTtcclxuXHJcbi8qKiBCYW5kcyB0aGF0IGhvbGQgc3RvcmVzIHdpdGhvdXQgYSBzY29yZTsgdGhleSBmaWx0ZXIgYnkgc3RhdHVzLCBub3QgYnkgc2NvcmUgcmFuZ2UuICovXHJcbmNvbnN0IFNUQVRVU19CQU5EUyA9IFsndW5zY29yZWQnLCAnbmEnXTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXVkaXRUeXBlT3B0aW9uIHtcclxuICBrZXk6IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIGhlbHA6IHN0cmluZztcclxufVxyXG5cclxuY29uc3QgQUxMX0FVRElUUzogQXVkaXRUeXBlT3B0aW9uID0geyBrZXk6ICdhbGwnLCBsYWJlbDogJ0FsbCBBdWRpdHMnLCBoZWxwOiAnQmxlbmRlZCBzY29yZSBhY3Jvc3MgZXZlcnkgcHJvZ3JhbW1lLicgfTtcclxuXHJcbi8qKiBTdG9yZSBoaWVyYXJjaHkgcGlja3M6IGNpcmNsZSBoZWFkIC8gem9uZSBtYW5hZ2VyIC8gQU9NIG5hbWVzIGFzIHRoZSBkYXNoYm9hcmQgQVBJIHNlbmRzIHRoZW0sIHN0b3JlID0gc3RvcmVJZC4gKi9cclxuaW50ZXJmYWNlIFNjb3BlUGljayB7XHJcbiAgY2lyY2xlOiBzdHJpbmc7XHJcbiAgem9uZTogc3RyaW5nO1xyXG4gIGFvbTogc3RyaW5nO1xyXG4gIHN0b3JlOiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEYXNoYm9hcmQuIFN0b3JlIGxpc3QsIHNjb3JlIGJhbmRzLCBLUElzIGFuZCB0aGUgYnktZGF0ZSB0cmVuZCBjb21lIGZyb20gdGhlIGF1ZGl0IEFQSVxyXG4gKiAoL3RyYXgvYXVkaXQvZGFzaGJvYXJkKTsgdGhlIEF1ZGl0IC8gVXNlciBQZXJmb3JtYW5jZSB0YWJzIHN0aWxsIHVzZSB0aGUgdjEgZGFzaGJvYXJkXHJcbiAqIGVuZHBvaW50cyAoY2hlY2tsaXN0UGVyZm9ybWFuY2UgLyB1c2VyUGVyZm9ybWFuY2UpLiBUYXNrIG1vZGUgKHRpbGVzICsgVGFzayBQZXJmb3JtYW5jZSkgcmVhZHNcclxuICogL3RyYXgvYXVkaXQvZGFzaGJvYXJkL3Rhc2tzOiBvbmx5IHRoZSB0YXNrcyByYWlzZWQgZnJvbSB0aGlzIGNsaWVudCdzIGF1ZGl0cy5cclxuICogU2NvcGUgKGNsaWVudCwgc3RvcmVzLCBkYXRlcykgY29tZXMgZnJvbSB0aGUgZ2xvYmFsIGhlYWRlciBmaWx0ZXI7IHRoZSBwZXJpb2QgcGlja2VyIGNhbiBuYXJyb3cgdGhlIGRhdGVzLlxyXG4gKiBGaWx0ZXJzIGRyYXdlcjogU3RvcmUgaGllcmFyY2h5IG5hcnJvd3MgdGhlIHN0b3JlcyBhbmQgQXVkaXQgdHlwZSAoY2hlY2tsaXN0SWQpIHRoZSBhdWRpdCBvZiBldmVyeSBmZWVkIChyZWxvYWRlZFxyXG4gKiBvbiBBcHBseSk7IFNjb3JlIHJhbmdlIGFuZCBTdGF0dXMgb25seSBmaWx0ZXIgdGhlIGxvYWRlZCBzdG9yZSBsaXN0IGluIHRoZSBicm93c2VyLlxyXG4gKlxyXG4gKiBRdWFydGVybHk6IHRoZSB0cmVuZCBzaG93cyB0aGUgbGFzdCBmb3VyIGZpbmFuY2lhbCBxdWFydGVycyAoYnVpbHQgZnJvbSBvbmUgbW9udGhseS1idWNrZXQgY2FsbCBvZlxyXG4gKiB0aGUgc2FtZSBBUEkpIGFuZCB0aGUgcGlja2VkIHF1YXJ0ZXIgYmVjb21lcyB0aGUgcGVyaW9kIG9mIGV2ZXJ5IGZlZWQuIEJ5IGRhdGU6IHRoZSByYW5nZSBwaWNrZXIuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1hdWRpdC12Mi1kYXNoYm9hcmQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hdWRpdC12Mi1kYXNoYm9hcmQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9hdWRpdC12Mi1kYXNoYm9hcmQuY29tcG9uZW50LnNjc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdWRpdFYyRGFzaGJvYXJkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIC8qKiBQYXNzIC8gY3JpdGljYWwgbWFya3MgY29tZSBmcm9tIHRoZSBhdWRpdCBkYXNoYm9hcmQgQVBJOyB0aGVzZSBhcmUgdGhlIGVtcHR5LXN0YXRlIGRlZmF1bHRzLiAqL1xyXG4gIHBhc3NNYXJrID0gUEFTU19NQVJLO1xyXG4gIGNyaXRpY2FsTWFyayA9IENSSVRJQ0FMX01BUks7XHJcbiAgcmVhZG9ubHkgYmFuZHMgPSBCQU5EUztcclxuICAvKiogXCJBbGwgQXVkaXRzXCIsIHRoZW4gdGhlIGNsaWVudCdzIGF1ZGl0cyAoUE9TVCAvdHJheC9hdWRpdC9saXN0KTsga2V5ID0gYXVkaXQgaWQsIHNlbnQgYXMgY2hlY2tsaXN0SWQuICovXHJcbiAgYXVkaXRUeXBlczogQXVkaXRUeXBlT3B0aW9uW10gPSBbQUxMX0FVRElUU107XHJcbiAgLyoqIENsaWVudCB0aGUgYXVkaXQgbGlzdCB3YXMgZmV0Y2hlZCBmb3IuICovXHJcbiAgcHJpdmF0ZSBhdWRpdFR5cGVzQ2xpZW50ID0gJyc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcmlvZCBzZWxlY3Rpb24uIGZyb20gLyB0byAoWVlZWS1NTS1ERCkgc3RhcnQgYXMgdGhlIGhlYWRlciBkYXRlIHJhbmdlIGFuZCBkcml2ZSBldmVyeSBmZWVkO1xyXG4gICAqIHRoZSByYW5nZSBwaWNrZXIgbmFycm93cyB0aGVtLCBhbmQgYSBoZWFkZXIgY2hhbmdlIHJlc2V0cyB0aGVtLlxyXG4gICAqL1xyXG4gIGdyYWluOiAncXVhcnRlcicgfCAnZGF0ZScgPSAnZGF0ZSc7XHJcbiAgcXVhcnRlciA9ICcnO1xyXG4gIHJlYWRvbmx5IGZpc2NhbCA9IGZpc2NhbFF1YXJ0ZXJzKCk7XHJcbiAgcmVhZG9ubHkgcXVhcnRlcnMgPSB0aGlzLmZpc2NhbC5tYXAocSA9PiBxLmtleSk7XHJcbiAgLyoqIFF1YXJ0ZXJseSB0cmVuZCBiYXJzLCBhbmQgdGhlIGNsaWVudCArIHN0b3JlcyB0aGV5IHdlcmUgZmV0Y2hlZCBmb3IuICovXHJcbiAgcXVhcnRlclRyZW5kOiBUcmVuZEJhcltdID0gW107XHJcbiAgcXVhcnRlclRyZW5kTG9hZGluZyA9IGZhbHNlO1xyXG4gIHByaXZhdGUgcXVhcnRlclRyZW5kU2NvcGUgPSAnJztcclxuICBmcm9tID0gJyc7XHJcbiAgdG8gPSAnJztcclxuICByYW5nZTogUGlja2VyUmFuZ2UgfCBudWxsID0gbnVsbDtcclxuICByZWFkb25seSBwaWNrZXJMb2NhbGUgPSBQSUNLRVJfTE9DQUxFO1xyXG4gIHJlYWRvbmx5IHJhbmdlcyA9IHBpY2tlclJhbmdlcygpO1xyXG4gIHJlYWRvbmx5IHRvZGF5ID0gZGF5anMoKTtcclxuXHJcbiAgLyoqIEZpbHRlcnMuICovXHJcbiAgYXVkaXRUeXBlID0gJ2FsbCc7XHJcbiAgc3RhdHVzOiBTdGF0dXNGaWx0ZXIgPSAnYWxsJztcclxuICBzZWFyY2ggPSAnJztcclxuICBzY29yZU1pbiA9IDA7XHJcbiAgc2NvcmVNYXggPSAxMDA7XHJcblxyXG4gIC8qKiBBdWRpdCAvIFRhc2sgc3dpdGNoLiAqL1xyXG4gIG1vZHVsZVRhYjogJ0F1ZGl0JyB8ICdUYXNrJyA9ICdBdWRpdCc7XHJcbiAgcmVhZG9ubHkgbW9kdWxlVGFiczogQXJyYXk8J0F1ZGl0JyB8ICdUYXNrJz4gPSBbJ0F1ZGl0JywgJ1Rhc2snXTtcclxuXHJcbiAgLyoqIFNob3duIGluIHRoZSBwYWdlIGhlYWRlcjsgc3RhbXBlZCBvbiBldmVyeSBsb2FkLiAqL1xyXG4gIGxhc3RSZWZyZXNoZWQgPSAn4oCUJztcclxuXHJcbiAgLyoqIEZpbHRlciBkcmF3ZXIuICovXHJcbiAgZmlsdGVyc09wZW4gPSBmYWxzZTtcclxuICBhY3RpdmVDYXQgPSAncGVyaW9kJztcclxuICAvKipcclxuICAgKiBUaGUgZmlsdGVyIGRyYXdlcidzIGRyYWZ0IChRQSA5IE9jdCk6IE9iamVjdC5jcmVhdGUodGhpcyksIHNvIGV2ZXJ5IGdldHRlciB0aGUgZHJhd2VyIHNob3dzIHdvcmtzIG9uIHRoZSBkcmFmdCdzXHJcbiAgICogb3duIHZhbHVlcyB3aGlsZSB0aGUgcGFnZSBiZWhpbmQga2VlcHMgdGhlIGFwcGxpZWQgb25lcy4gQXBwbHkgY29waWVzIERSQUZUX0tFWVMgb250byB0aGUgcGFnZTsgQ2FuY2VsIGRyb3BzIGl0LlxyXG4gICAqL1xyXG4gIGRyYWZ0OiBBdWRpdFYyRGFzaGJvYXJkQ29tcG9uZW50IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRFJBRlRfS0VZUyA9IFsnZ3JhaW4nLCAncXVhcnRlcicsICdmcm9tJywgJ3RvJywgJ3JhbmdlJywgJ2F1ZGl0VHlwZScsICdjaXJjbGUnLCAnem9uZScsICdhb20nLCAnc3RvcmUnLFxyXG4gICAgJ3Njb3JlTWluJywgJ3Njb3JlTWF4JywgJ3N0YXR1cycsICdzdG9yZUxpc3RPcGVuJywgJ2xpc3RCYW5kS2V5J10gYXMgY29uc3Q7XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0b3JlIGhpZXJhcmNoeSBwaWNrcyBiZWluZyBlZGl0ZWQgaW4gdGhlIGRyYXdlciAoc3RvcmUgPSBzdG9yZUlkKS4gVGhlIGxpc3RzIGNvbWUgZnJvbSB0aGUgZGFzaGJvYXJkXHJcbiAgICogQVBJJ3Mgc3RvcmUgcm93cyBvZiB0aGUgaGVhZGVyIHNjb3BlOyBBcHBseSBuYXJyb3dzIGV2ZXJ5IGZlZWQgdG8gdGhlIHN0b3JlcyB0aGUgcGljayBjb3ZlcnMuXHJcbiAgICovXHJcbiAgY2lyY2xlID0gJyc7XHJcbiAgem9uZSA9ICcnO1xyXG4gIGFvbSA9ICcnO1xyXG4gIHN0b3JlID0gJyc7XHJcblxyXG4gIC8qKiBTdG9yZSByb3dzIG9mIHRoZSBoZWFkZXIgc2NvcGUsIG5vdCBuYXJyb3dlZCBieSB0aGUgaGllcmFyY2h5OiB0aGUgZHJhd2VyJ3MgbGlzdHMgYW5kIGVhY2ggcGljaydzIHN0b3Jlcy4gKi9cclxuICBwcml2YXRlIHNjb3BlUm93czogQXVkaXRSb3dbXSA9IFtdO1xyXG4gIC8qKiBIaWVyYXJjaHkgKyBhdWRpdCB0eXBlIHRoZSBmZWVkcyB3ZXJlIGxhc3QgbG9hZGVkIHdpdGg7IHRoZSBkcmF3ZXIgZWRpdHMgYSBkcmFmdCB1bnRpbCBBcHBseS4gKi9cclxuICBwcml2YXRlIGFwcGxpZWQ6IFNjb3BlUGljayAmIHsgYXVkaXRUeXBlOiBzdHJpbmcgfSA9IHsgY2lyY2xlOiAnJywgem9uZTogJycsIGFvbTogJycsIHN0b3JlOiAnJywgYXVkaXRUeXBlOiAnYWxsJyB9O1xyXG4gIC8qKiBDbGllbnQgKyBoZWFkZXIgc3RvcmVzOyBhIGNoYW5nZSByZXNldHMgdGhlIGhpZXJhcmNoeSBwaWNrcyAodGhlaXIgc3RvcmVzIG1heSBiZSBnb25lKS4gKi9cclxuICBwcml2YXRlIGhlYWRlclNjb3BlS2V5ID0gJyc7XHJcblxyXG4gIC8qKiBUYWJsZSBzdGF0ZS4gKi9cclxuICBzb3J0S2V5ID0gJ3Njb3JlJztcclxuICBzb3J0RGlyOiAnYXNjJyB8ICdkZXNjJyA9ICdhc2MnO1xyXG4gIHBhZ2UgPSAxO1xyXG4gIC8qKiBTdG9yZSBsaXN0IHBhZ2VyOiAxMCByb3dzIGEgcGFnZSwgMTAgLyAyMCAvIDMwLCBhcyBvbiBldmVyeSBhdWRpdCBsaXN0LiAqL1xyXG4gIHBhZ2VTaXplID0gMTA7XHJcbiAgcmVhZG9ubHkgcGFnZVNpemVzID0gWzEwLCAyMCwgMzBdO1xyXG5cclxuICBoZWFkZXJzOiBBcnJheTx7IGtleTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH0+ID0gW1xyXG4gICAgeyBrZXk6ICdkYXRlJywgbGFiZWw6ICdBdWRpdCBkYXRlJyB9LFxyXG4gICAgLy8gVGhlIGNvbHVtbiBzaG93cyB0aGUgc3RvcmUncyBuYW1lIChyb3cuc3RvcmVJZCBob2xkcyBpdDsgc2VlIHRvQXVkaXRSb3cpLlxyXG4gICAgeyBrZXk6ICdzdG9yZUlkJywgbGFiZWw6ICdTdG9yZSBOYW1lJyB9LFxyXG4gICAgeyBrZXk6ICdjaXJjbGUnLCBsYWJlbDogJ0NpcmNsZSBIZWFkJyB9LFxyXG4gICAgeyBrZXk6ICd6b25lJywgbGFiZWw6ICdab25lIE1hbmFnZXInIH0sXHJcbiAgICB7IGtleTogJ2FvbScsIGxhYmVsOiAnQU9NJyB9LFxyXG4gICAgeyBrZXk6ICdzY29yZScsIGxhYmVsOiAnU2NvcmUnIH0sXHJcbiAgICB7IGtleTogJ3N0YXR1cycsIGxhYmVsOiAnU3RhdHVzJyB9XHJcbiAgXTtcclxuXHJcbiAgLyoqXHJcbiAgICogVGFzayBtb2RlOiB0aWxlcyBhbmQgdGhlIFRhc2sgUGVyZm9ybWFuY2UgdGFibGUgZm9yIHRoZSB0YXNrcyByYWlzZWQgZnJvbSB0aGlzIGNsaWVudCdzIGF1ZGl0c1xyXG4gICAqICgvdHJheC9hdWRpdC9kYXNoYm9hcmQvdGFza3MpLiBMb2FkZWQgd2hlbiB0aGUgVGFzayB0YWIgaXMgb3BlbiwgYW5kIGFnYWluIGFmdGVyIGEgaGVhZGVyIGNoYW5nZS5cclxuICAgKi9cclxuICB0YXNrU3RhdHM6IFRhc2tTdGF0cyA9IHsgLi4uRU1QVFlfVEFTS19TVEFUUyB9O1xyXG4gIHRhc2tQZXJmOiBUYXNrUGVyZlJvd1tdID0gW107XHJcbiAgdGFza0xvYWRpbmcgPSBmYWxzZTtcclxuICAvKiogQ2hhbmdlIHZzIHRoZSBwcmV2aW91cyBwZXJpb2QgKG51bGwgPSBub3RoaW5nIHRvIGNvbXBhcmUpOyBkcml2ZXMgdGhlIGRlbHRhIGFycm93IGFuZCBjb2xvdXIuICovXHJcbiAgcHJpdmF0ZSB0YXNrRGVsdGFWYWx1ZXM6IFJlY29yZDxUYXNrRGVsdGFLZXksIG51bWJlciB8IG51bGw+ID0geyBjb21wbGV0aW9uOiBudWxsLCBjb21wbGlhbmNlOiBudWxsLCBmbGFnczogbnVsbCB9O1xyXG4gIC8qKiBUcnVlIHVudGlsIHRoZSB0YXNrIGZpZ3VyZXMgYXJlIGxvYWRlZCBmb3IgdGhlIGN1cnJlbnQgc2NvcGUuICovXHJcbiAgcHJpdmF0ZSB0YXNrc1N0YWxlID0gdHJ1ZTtcclxuICAvKiogSWdub3JlcyBhIHRhc2sgcmVzcG9uc2UgdGhhdCBhIG5ld2VyIHJlcXVlc3QgaGFzIG92ZXJ0YWtlbi4gKi9cclxuICBwcml2YXRlIHRhc2tSZXF1ZXN0ID0gMDtcclxuICAvKiogUERGIGRvd25sb2FkcyBpbiBmbGlnaHQsIGJ5IHZpc2l0IGlkLCBzbyBhIGRvdWJsZSBjbGljayBxdWV1ZXMgb25lIHJlcG9ydC4gKi9cclxuICBwcml2YXRlIHJlYWRvbmx5IHBkZlF1ZXVlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG5cclxuICAvKiogUGVyZm9ybWFuY2Ugc2VjdGlvbi4gKi9cclxuICBwZXJmVGFiOiAnQXVkaXQnIHwgJ1N0b3JlJyB8ICdVc2VyJyA9ICdBdWRpdCc7XHJcbiAgcmVhZG9ubHkgcGVyZlRhYnM6IEFycmF5PCdBdWRpdCcgfCAnU3RvcmUnIHwgJ1VzZXInPiA9IFsnQXVkaXQnLCAnU3RvcmUnLCAnVXNlciddO1xyXG4gIHBlcmZQZXJpb2QgPSAnJztcclxuICBwZXJmU2VhcmNoID0gJyc7XHJcbiAgLyoqIFBlcmZvcm1hbmNlIHRhYmxlcycgcGFnZXIgKHNoYXJlZCBsaWItcGFnaW5hdGlvbiwgYXMgdGhlIG90aGVyIGF1ZGl0IGxpc3RzKTogMTAgcm93cyBhIHBhZ2UsIDEwIC8gMjAgLyAzMC4gKi9cclxuICBwZXJmUGFnZSA9IDE7XHJcbiAgcGVyZlBhZ2VTaXplID0gMTA7XHJcbiAgcmVhZG9ubHkgcGVyZlBhZ2VTaXplcyA9IFsxMCwgMjAsIDMwXTtcclxuICAvKiogQ29sdW1uIHNvcnQgb2YgdGhlIGFjdGl2ZSBQZXJmb3JtYW5jZSB0YWJsZSAoJycgPSB0aGUgQVBJJ3Mgb3JkZXIpOyByZXNldCB3aGVuIHRoZSB0YWIgY2hhbmdlcy4gKi9cclxuICBwZXJmU29ydEtleSA9ICcnO1xyXG4gIHBlcmZTb3J0RGlyOiAnYXNjJyB8ICdkZXNjJyA9ICdhc2MnO1xyXG5cclxuICAvKiogU29ydGFibGUgY29sdW1ucyBvZiBlYWNoIFBlcmZvcm1hbmNlIHRhYmxlLCBpbiBkaXNwbGF5IG9yZGVyIChBY3Rpb24gaXMgbm90IHNvcnRhYmxlKS4gKi9cclxuICByZWFkb25seSBhdWRpdFBlcmZDb2xzOiBQZXJmQ29sdW1uW10gPSBbXHJcbiAgICAvLyBObyBTY2hlZHVsZWQgY29sdW1uIChRQSA5IE9jdCkuXHJcbiAgICB7IGtleTogJ25hbWUnLCBsYWJlbDogJ0F1ZGl0IE5hbWUnIH0sIHsga2V5OiAnYXNzaWduZWQnLCBsYWJlbDogJ0Fzc2lnbmVkIFRvJyB9LCB7IGtleTogJ3N1Ym1pdHRlZCcsIGxhYmVsOiAnU3VibWl0dGVkJyB9LFxyXG4gICAgeyBrZXk6ICdkaXNwdXRlcycsIGxhYmVsOiAnRGlzcHV0ZXMnIH0sIHsga2V5OiAncGFzc01hcmsnLCBsYWJlbDogJ1Bhc3MgTWFyaycgfSxcclxuICAgIHsga2V5OiAnc2NvcmUnLCBsYWJlbDogJ1Njb3JlJyB9LCB7IGtleTogJ3Jlc3VsdCcsIGxhYmVsOiAnUmVzdWx0JyB9XHJcbiAgXTtcclxuICByZWFkb25seSB0YXNrUGVyZkNvbHM6IFBlcmZDb2x1bW5bXSA9IFtcclxuICAgIHsga2V5OiAnbmFtZScsIGxhYmVsOiAnVGFzayBOYW1lJyB9LCB7IGtleTogJ3NjaGVkdWxlZCcsIGxhYmVsOiAnU2NoZWR1bGVkJyB9LCB7IGtleTogJ2NvdmVyYWdlJywgbGFiZWw6ICdDb3ZlcmFnZScgfSxcclxuICAgIHsga2V5OiAnYXNzaWduZWQnLCBsYWJlbDogJ0Fzc2lnbmVkIFRvJyB9LCB7IGtleTogJ3N1Ym1pdHRlZCcsIGxhYmVsOiAnU3VibWl0dGVkJyB9LCB7IGtleTogJ2ZsYWdzJywgbGFiZWw6ICdGbGFncycgfSxcclxuICAgIHsga2V5OiAndGFza3MnLCBsYWJlbDogJ1Rhc2tzJyB9LCB7IGtleTogJ3JlZG8nLCBsYWJlbDogJ1JlRG8nIH0sIHsga2V5OiAnY29tcGxpYW5jZScsIGxhYmVsOiAnUXVlc3Rpb24gQ29tcGxpYW5jZSAlJyB9XHJcbiAgXTtcclxuICByZWFkb25seSBzdG9yZVBlcmZDb2xzOiBQZXJmQ29sdW1uW10gPSBbXHJcbiAgICB7IGtleTogJ3N0b3JlJywgbGFiZWw6ICdTdG9yZSBOYW1lJyB9LCB7IGtleTogJ3N0b3JlSWQnLCBsYWJlbDogJ1N0b3JlIElEJyB9LCB7IGtleTogJ3Nwb2MnLCBsYWJlbDogJ1N0b3JlIFNwb2MnIH0sXHJcbiAgICB7IGtleTogJ2Fzc2lnbmVkJywgbGFiZWw6ICdBc3NpZ25lZCcgfSxcclxuICAgIHsga2V5OiAnZmxhZ3MnLCBsYWJlbDogJ0ZsYWdzJyB9LCB7IGtleTogJ2NvbXBsZXRpb24nLCBsYWJlbDogJ0NvbXBsZXRpb24gJScgfSwgeyBrZXk6ICdjb21wbGlhbmNlJywgbGFiZWw6ICdDb21wbGlhbmNlICUnIH0sXHJcbiAgICB7IGtleTogJ3BlcmYnLCBsYWJlbDogJ1BlcmZvcm1hbmNlICUnIH1cclxuICBdO1xyXG4gIHJlYWRvbmx5IHVzZXJQZXJmQ29sczogUGVyZkNvbHVtbltdID0gW1xyXG4gICAgeyBrZXk6ICduYW1lJywgbGFiZWw6ICdVc2VyIE5hbWUnIH0sIHsga2V5OiAnZW1haWwnLCBsYWJlbDogJ0VtYWlsJyB9LCB7IGtleTogJ2Fzc2lnbmVkJywgbGFiZWw6ICdBc3NpZ25lZCcgfSxcclxuICAgIHsga2V5OiAnZmxhZ3MnLCBsYWJlbDogJ0ZsYWdzJyB9LCB7IGtleTogJ3JlZG8nLCBsYWJlbDogJ1JlRG8nIH0sIHsga2V5OiAnY29tcGxldGlvbicsIGxhYmVsOiAnQ29tcGxldGlvbiAlJyB9LFxyXG4gICAgeyBrZXk6ICdjb21wbGlhbmNlJywgbGFiZWw6ICdDb21wbGlhbmNlICUnIH0sIHsga2V5OiAncGVyZicsIGxhYmVsOiAnUGVyZm9ybWFuY2UgJScgfVxyXG4gIF07XHJcblxyXG4gIC8qKiBXaGF0IGVhY2ggc29ydGFibGUgY29sdW1uIHNvcnRzIG9uOiBudW1iZXJzIGZvciBjb3VudHMgYW5kIHBlcmNlbnRhZ2VzLCB0ZXh0IG90aGVyd2lzZTsgbnVsbCBzb3J0cyBsYXN0LiAqL1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYXVkaXRTb3J0VmFsdWU6IFJlY29yZDxzdHJpbmcsIChyOiBBdWRpdFBlcmZSb3cpID0+IFNvcnRWYWx1ZT4gPSB7XHJcbiAgICBuYW1lOiByID0+IHIubmFtZSwgYXNzaWduZWQ6IHIgPT4gci5hc3NpZ25lZCwgc3VibWl0dGVkOiByID0+IHIuc3VibWl0dGVkLFxyXG4gICAgZGlzcHV0ZXM6IHIgPT4gci5kaXNwdXRlcywgcGFzc01hcms6IHIgPT4gdGhpcy5udW0oU3RyaW5nKHIucGFzc01hcmspLnJlcGxhY2UoJyUnLCAnJykpLFxyXG4gICAgc2NvcmU6IHIgPT4gKHIuc2NvcmUgPT09ICfigJQnID8gbnVsbCA6IHIuc2NvcmVQY3QpLCByZXN1bHQ6IHIgPT4gKHIucmVzdWx0ID09PSAn4oCUJyA/IG51bGwgOiByLnJlc3VsdClcclxuICB9O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdGFza1NvcnRWYWx1ZTogUmVjb3JkPHN0cmluZywgKHI6IFRhc2tQZXJmUm93KSA9PiBTb3J0VmFsdWU+ID0ge1xyXG4gICAgbmFtZTogciA9PiByLm5hbWUsIHNjaGVkdWxlZDogciA9PiByLnNjaGVkdWxlZCwgY292ZXJhZ2U6IHIgPT4gci5jb3ZlcmFnZSwgYXNzaWduZWQ6IHIgPT4gci5hc3NpZ25lZCxcclxuICAgIHN1Ym1pdHRlZDogciA9PiByLnN1Ym1pdHRlZCwgZmxhZ3M6IHIgPT4gci5mbGFncywgdGFza3M6IHIgPT4gdGhpcy5udW0oci5yYXc/LnRhc2tzKSwgcmVkbzogciA9PiByLnJlZG8sXHJcbiAgICBjb21wbGlhbmNlOiByID0+IHRoaXMubnVtKHIucmF3Py5jb21wbGlhbmNlKVxyXG4gIH07XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzdG9yZVNvcnRWYWx1ZTogUmVjb3JkPHN0cmluZywgKHI6IFN0b3JlUGVyZlJvdykgPT4gU29ydFZhbHVlPiA9IHtcclxuICAgIHN0b3JlOiByID0+IHIuc3RvcmUsIHN0b3JlSWQ6IHIgPT4gci5zdG9yZUlkLCBzcG9jOiByID0+IHIuc3BvYywgYXNzaWduZWQ6IHIgPT4gci5hc3NpZ25lZCwgZmxhZ3M6IHIgPT4gci5mbGFncyxcclxuICAgIGNvbXBsZXRpb246IHIgPT4gdGhpcy5udW0oci5yYXc/LmNvbXBsZXRpb24pLCBjb21wbGlhbmNlOiByID0+IHRoaXMubnVtKHIucmF3Py5jb21wbGlhbmNlKSwgcGVyZjogciA9PiB0aGlzLm51bShyLnJhdz8ucGVyZm9ybWFuY2UpXHJcbiAgfTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHVzZXJTb3J0VmFsdWU6IFJlY29yZDxzdHJpbmcsIChyOiBVc2VyUGVyZlJvdykgPT4gU29ydFZhbHVlPiA9IHtcclxuICAgIG5hbWU6IHIgPT4gci5uYW1lLCBlbWFpbDogciA9PiByLmVtYWlsLCBhc3NpZ25lZDogciA9PiByLmFzc2lnbmVkLCBmbGFnczogciA9PiByLmZsYWdzLCByZWRvOiByID0+IHIucmVkbyxcclxuICAgIGNvbXBsZXRpb246IHIgPT4gdGhpcy5udW0oci5yYXc/LmNvbXBsZXRpb24pLCBjb21wbGlhbmNlOiByID0+IHRoaXMubnVtKHIucmF3Py5jb21wbGlhbmNlKSwgcGVyZjogciA9PiB0aGlzLm51bShyLnJhdz8ucGVyZm9ybWFuY2UpXHJcbiAgfTtcclxuXHJcbiAgYXVkaXRQZXJmOiBBdWRpdFBlcmZSb3dbXSA9IFtdO1xyXG4gIHN0b3JlUGVyZjogU3RvcmVQZXJmUm93W10gPSBbXTtcclxuICB1c2VyUGVyZjogVXNlclBlcmZSb3dbXSA9IFtdO1xyXG5cclxuICByb3dzOiBBdWRpdFJvd1tdID0gW107XHJcbiAgdHJlbmQ6IFRyZW5kQmFyW10gPSBbXTtcclxuXHJcbiAgLyoqIFN0YXJ0cyB0cnVlIHNvIHRoZSBmaXJzdCBwYWludCBzaGltbWVycyBpbnN0ZWFkIG9mIGZsYXNoaW5nIGVtcHR5IHRpbGVzIGFuZCB0YWJsZXMuICovXHJcbiAgbG9hZGluZyA9IHRydWU7XHJcblxyXG4gIHByaXZhdGUgaGVhZGVyRGF0YTogYW55O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXNlckVtYWlsZXM6IHN0cmluZ1tdID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlcnNFbWFpbC1pbmZvJykgfHwgJ1tdJyk7XHJcbiAgLyoqIENyZWF0ZSBBdWRpdCBzaG93cyBvbmx5IHdpdGggdGhlIENoZWNrbGlzdCBhZGQgcGVybWlzc2lvbi4gKi9cclxuICBhY2Nlc3M6IEF1ZGl0QWNjZXNzID0geyBjYW5BZGQ6IGZhbHNlLCBjYW5FZGl0OiBmYWxzZSB9O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgdHJheFNlcnZpY2U6IFRyYXhTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBnczogR2xvYmFsU3RhdGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdDogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuICApIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGF1ZGl0QWNjZXNzKHRoaXMuZ3MpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoYWNjZXNzID0+IHtcclxuICAgICAgdGhpcy5hY2Nlc3MgPSBhY2Nlc3M7XHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSwgZGVib3VuY2VUaW1lKDMwMCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICghZGF0YT8uY2xpZW50KSB7IHJldHVybjsgfVxyXG4gICAgICAgIGNvbnN0IGNsaWVudENoYW5nZWQgPSBkYXRhLmNsaWVudCAhPT0gdGhpcy5oZWFkZXJEYXRhPy5jbGllbnQ7XHJcbiAgICAgICAgdGhpcy5oZWFkZXJEYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLm9uSGVhZGVyU2NvcGUoY2xpZW50Q2hhbmdlZCk7XHJcbiAgICAgICAgLy8gQSBxdWFydGVyIHN0YXlzIHBpY2tlZCBhY3Jvc3MgaGVhZGVyIGNoYW5nZXMgKG5ldyBzdG9yZXMgLyBjbGllbnQpOyBCeSBkYXRlIGZvbGxvd3MgdGhlIGhlYWRlci5cclxuICAgICAgICBpZiAodGhpcy5ncmFpbiA9PT0gJ3F1YXJ0ZXInKSB7IHRoaXMuYXBwbHlRdWFydGVyKHRoaXMucXVhcnRlciwgdHJ1ZSk7IHJldHVybjsgfVxyXG4gICAgICAgIHRoaXMuZnJvbSA9IGRhdGEuZGF0ZT8uc3RhcnREYXRlIHx8ICcnO1xyXG4gICAgICAgIHRoaXMudG8gPSBkYXRhLmRhdGU/LmVuZERhdGUgfHwgJyc7XHJcbiAgICAgICAgdGhpcy5yYW5nZSA9IHRvUGlja2VyUmFuZ2UodGhpcy5mcm9tLCB0aGlzLnRvKTtcclxuICAgICAgICB0aGlzLnJlbG9hZFBlcmlvZCgpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhlYWRlciBjaGFuZ2UuIE5ldyBjbGllbnQ6IHRoZSBhdWRpdCB0eXBlIHN0YXJ0cyBvdmVyIGFuZCBpdHMgbGlzdCBpcyBmZXRjaGVkIGFnYWluLiBOZXcgY2xpZW50IG9yXHJcbiAgICogc3RvcmVzOiB0aGUgaGllcmFyY2h5IHBpY2tzIHN0YXJ0IG92ZXIgKHRoZSBuZXh0IGxvYWQgcmVmaWxscyB0aGUgbGlzdHMpLiBBIGRhdGUtb25seSBjaGFuZ2Uga2VlcHMgYm90aC5cclxuICAgKi9cclxuICBwcml2YXRlIG9uSGVhZGVyU2NvcGUoY2xpZW50Q2hhbmdlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgY29uc3Qga2V5ID0gdGhpcy5oZWFkZXJEYXRhLmNsaWVudCArICd8JyArIHRoaXMuaGVhZGVyU3RvcmVJZHMoKS5qb2luKCcsJyk7XHJcbiAgICBpZiAoa2V5ICE9PSB0aGlzLmhlYWRlclNjb3BlS2V5KSB7XHJcbiAgICAgIHRoaXMuaGVhZGVyU2NvcGVLZXkgPSBrZXk7XHJcbiAgICAgIHRoaXMuY2lyY2xlID0gdGhpcy56b25lID0gdGhpcy5hb20gPSB0aGlzLnN0b3JlID0gJyc7XHJcbiAgICAgIHRoaXMuYXBwbGllZCA9IHsgLi4udGhpcy5hcHBsaWVkLCBjaXJjbGU6ICcnLCB6b25lOiAnJywgYW9tOiAnJywgc3RvcmU6ICcnIH07XHJcbiAgICB9XHJcbiAgICBpZiAoY2xpZW50Q2hhbmdlZCkge1xyXG4gICAgICB0aGlzLmF1ZGl0VHlwZSA9ICdhbGwnO1xyXG4gICAgICB0aGlzLmFwcGxpZWQuYXVkaXRUeXBlID0gJ2FsbCc7XHJcbiAgICAgIHRoaXMuYXVkaXRUeXBlcyA9IFtBTExfQVVESVRTXTtcclxuICAgICAgdGhpcy5sb2FkQXVkaXRUeXBlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBjbGllbnQncyBhdWRpdHMgZm9yIHRoZSBBdWRpdCB0eXBlIGZpbHRlciwgbmV3ZXN0IGZpcnN0IGFzIHRoZSBNYW5hZ2UgbGlzdC4gKi9cclxuICBwcml2YXRlIGxvYWRBdWRpdFR5cGVzKCk6IHZvaWQge1xyXG4gICAgY29uc3QgY2xpZW50SWQgPSB0aGlzLmhlYWRlckRhdGE/LmNsaWVudDtcclxuICAgIGlmICghY2xpZW50SWQgfHwgY2xpZW50SWQgPT09IHRoaXMuYXVkaXRUeXBlc0NsaWVudCkgeyByZXR1cm47IH1cclxuICAgIHRoaXMuYXVkaXRUeXBlc0NsaWVudCA9IGNsaWVudElkO1xyXG4gICAgdGhpcy50cmF4U2VydmljZS5hdWRpdExpc3Qoe1xyXG4gICAgICBjbGllbnRJZCwgZnJvbURhdGU6IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uc3RhcnREYXRlLCB0b0RhdGU6IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uZW5kRGF0ZSxcclxuICAgICAgbGltaXQ6IDUwMCwgb2Zmc2V0OiAxLCBzZWFyY2g6ICcnXHJcbiAgICB9KS5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlcz8uY29kZSAhPT0gMjAwKSB7IHRoaXMuYXVkaXRUeXBlc0NsaWVudCA9ICcnOyByZXR1cm47IH1cclxuICAgICAgY29uc3QgbGlzdDogYW55W10gPSByZXMuZGF0YT8ucmVzdWx0IHx8IFtdO1xyXG4gICAgICB0aGlzLmF1ZGl0VHlwZXMgPSBbQUxMX0FVRElUU10uY29uY2F0KGxpc3QubWFwKGEgPT4gKHtcclxuICAgICAgICBrZXk6IFN0cmluZyhhLl9pZCksXHJcbiAgICAgICAgbGFiZWw6IGEuY2hlY2tMaXN0TmFtZSB8fCAnVW50aXRsZWQgYXVkaXQnLFxyXG4gICAgICAgIGhlbHA6IChhLnB1Ymxpc2ggPyAnUHVibGlzaGVkJyA6ICdEcmFmdCcpICsgJyDCtyBwYXNzIG1hcmsgJyArICh0aGlzLm51bShhLnBhc3NNYXJrKSA/PyBQQVNTX01BUkspICsgJyUnXHJcbiAgICAgIH0pKSk7XHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogQnkgZGF0ZTogb25lIG1vbnRoIGF0IG1vc3QgKHRoZSBwaWNrZXJzJyBkYXRlTGltaXQsIGluIGRheXMgYWZ0ZXIgdGhlIHN0YXJ0OyAzMCA9IHVwIHRvIDMxIGRheXMpLiAqL1xyXG4gIHJlYWRvbmx5IG1heFJhbmdlRGF5cyA9IDMwO1xyXG5cclxuICAvKiogUmFuZ2UgcGlja2VyOiBhIG5ldyBwZXJpb2QgcmVsb2FkcyBldmVyeSBmZWVkLCBleGNlcHQgaW5zaWRlIHRoZSBmaWx0ZXIgZHJhd2VyLCB3aGVyZSBBcHBseSBkb2VzLiAqL1xyXG4gIG9uUmFuZ2VQaWNrZWQoZTogUGlja2VkRGF0ZXMgfCBudWxsKTogdm9pZCB7XHJcbiAgICBjb25zdCBwaWNrZWQgPSBmcm9tUGlja2VyUmFuZ2UoZSk7XHJcbiAgICBpZiAoIXBpY2tlZCB8fCAocGlja2VkLmZyb20gPT09IHRoaXMuZnJvbSAmJiBwaWNrZWQudG8gPT09IHRoaXMudG8pKSB7IHJldHVybjsgfVxyXG4gICAgLy8gQSBsb25nZXIgcmFuZ2UgKHR5cGVkLCBvciBhIHByZXNldCkgaXMgY3V0IGJhY2sgdG8gYSBtb250aCBmcm9tIGl0cyBzdGFydC5cclxuICAgIGlmIChkYXlqcyhwaWNrZWQudG8pLmRpZmYoZGF5anMocGlja2VkLmZyb20pLCAnZGF5JykgPiB0aGlzLm1heFJhbmdlRGF5cykge1xyXG4gICAgICBwaWNrZWQudG8gPSBkYXlqcyhwaWNrZWQuZnJvbSkuYWRkKHRoaXMubWF4UmFuZ2VEYXlzLCAnZGF5JykuZm9ybWF0KCdZWVlZLU1NLUREJyk7XHJcbiAgICAgIHRoaXMucmFuZ2UgPSB0b1BpY2tlclJhbmdlKHBpY2tlZC5mcm9tLCBwaWNrZWQudG8pO1xyXG4gICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoJ1BpY2sgdXAgdG8gb25lIG1vbnRoIOKAlCB0aGUgcmFuZ2UgZW5kcyBvbiAnICsgZGF5anMocGlja2VkLnRvKS5mb3JtYXQoJ0REIE1NTSBZWVlZJykpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5mcm9tID0gcGlja2VkLmZyb207XHJcbiAgICB0aGlzLnRvID0gcGlja2VkLnRvO1xyXG4gICAgaWYgKCF0aGlzLmZpbHRlcnNPcGVuKSB7IHRoaXMucmVsb2FkUGVyaW9kKCk7IH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVsb2FkUGVyaW9kKCk6IHZvaWQge1xyXG4gICAgdGhpcy5wZXJmUGVyaW9kID0gJ0Jhc2VkIG9uICcgKyB0aGlzLmZtdCh0aGlzLmZyb20pICsgJyAtICcgKyB0aGlzLmZtdCh0aGlzLnRvKTtcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgICB0aGlzLmxvYWQoKTtcclxuICAgIC8vIFRhc2sgZmlndXJlcyBmb2xsb3cgdGhlIHNhbWUgc2NvcGU7IGZldGNoZWQgbm93IGluIFRhc2sgbW9kZSwgZWxzZSB3aGVuIHRoZSB0YWIgb3BlbnMuXHJcbiAgICB0aGlzLnRhc2tzU3RhbGUgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMuaXNUYXNrTW9kdWxlKSB7IHRoaXMubG9hZFRhc2tzKCk7IH1cclxuICAgIGlmICh0aGlzLmdyYWluID09PSAncXVhcnRlcicpIHsgdGhpcy5sb2FkUXVhcnRlclRyZW5kKCk7IH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBmb3VyIHF1YXJ0ZXIgYmFyczogb25lIGNhbGwgb3ZlciB0aGUgZm91ciBxdWFydGVycyAobW9yZSB0aGFuIDEyMCBkYXlzLCBzbyB0aGUgQVBJIGJ1Y2tldHMgdGhlXHJcbiAgICogdHJlbmQgYnkgbW9udGgpIHJvbGxlZCB1cCBwZXIgcXVhcnRlciwgd2VpZ2h0ZWQgYnkgZWFjaCBtb250aCdzIGF1ZGl0IGNvdW50LiBGZXRjaGVkIGFnYWluIG9ubHlcclxuICAgKiB3aGVuIHRoZSBjbGllbnQgb3Igc3RvcmVzIGNoYW5nZS5cclxuICAgKi9cclxuICBwcml2YXRlIGxvYWRRdWFydGVyVHJlbmQoKTogdm9pZCB7XHJcbiAgICBjb25zdCBzY29wZSA9IHRoaXMuYmFzZVBheWxvYWQoKTtcclxuICAgIGNvbnN0IGtleSA9IHNjb3BlWydjbGllbnRJZCddICsgJ3wnICsgKHNjb3BlWydzdG9yZUlkJ10gfHwgW10pLmpvaW4oJywnKSArICd8JyArIChzY29wZVsnY2hlY2tsaXN0SWQnXSB8fCAnJyk7XHJcbiAgICBpZiAoa2V5ID09PSB0aGlzLnF1YXJ0ZXJUcmVuZFNjb3BlKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5xdWFydGVyVHJlbmRTY29wZSA9IGtleTtcclxuICAgIHRoaXMucXVhcnRlclRyZW5kTG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0RGFzaGJvYXJkKHtcclxuICAgICAgY2xpZW50SWQ6IHNjb3BlWydjbGllbnRJZCddLCBmcm9tRGF0ZTogdGhpcy5maXNjYWxbMF0uZnJvbSwgdG9EYXRlOiB0aGlzLnRvZGF5LmZvcm1hdCgnWVlZWS1NTS1ERCcpLCBzdG9yZUlkOiBzY29wZVsnc3RvcmVJZCddLFxyXG4gICAgICAuLi50aGlzLmF1ZGl0RmlsdGVyKClcclxuICAgIH0pLnBpcGUoY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsKSksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBvayA9IHJlcz8uY29kZSA9PT0gMjAwO1xyXG4gICAgICBpZiAoIW9rKSB7IHRoaXMucXVhcnRlclRyZW5kU2NvcGUgPSAnJzsgfVxyXG4gICAgICBjb25zdCBidWNrZXRzOiBhbnlbXSA9IG9rID8gcmVzLmRhdGE/LnRyZW5kIHx8IFtdIDogW107XHJcbiAgICAgIHRoaXMucXVhcnRlclRyZW5kID0gdGhpcy5maXNjYWwubWFwKHEgPT4ge1xyXG4gICAgICAgIGNvbnN0IGluUXVhcnRlciA9IGJ1Y2tldHMuZmlsdGVyKGIgPT4gU3RyaW5nKGIua2V5KSA+PSBxLmZyb20gJiYgU3RyaW5nKGIua2V5KSA8PSBxLnRvICYmIGIudmFsdWUgIT09IG51bGwgJiYgYi52YWx1ZSAhPT0gdW5kZWZpbmVkKTtcclxuICAgICAgICBjb25zdCBjb3VudCA9IGluUXVhcnRlci5yZWR1Y2UoKG4sIGIpID0+IG4gKyAoTnVtYmVyKGIuY291bnQpIHx8IDApLCAwKTtcclxuICAgICAgICBjb25zdCB0b3RhbCA9IGluUXVhcnRlci5yZWR1Y2UoKG4sIGIpID0+IG4gKyBOdW1iZXIoYi52YWx1ZSkgKiAoTnVtYmVyKGIuY291bnQpIHx8IDApLCAwKTtcclxuICAgICAgICBjb25zdCBzdWJtaXR0ZWQgPSBidWNrZXRzLmZpbHRlcihiID0+IFN0cmluZyhiLmtleSkgPj0gcS5mcm9tICYmIFN0cmluZyhiLmtleSkgPD0gcS50bylcclxuICAgICAgICAgIC5yZWR1Y2UoKG4sIGIpID0+IG4gKyAoTnVtYmVyKGIuc3VibWl0dGVkID8/IGIuY291bnQpIHx8IDApLCAwKTtcclxuICAgICAgICByZXR1cm4geyBrZXk6IHEua2V5LCBsYWJlbDogcS5rZXksIHZhbHVlOiBjb3VudCA/IE1hdGgucm91bmQodG90YWwgLyBjb3VudCkgOiBudWxsLCBjb3VudCwgc3VibWl0dGVkIH07XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnF1YXJ0ZXJUcmVuZExvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBNYWtlIGEgcXVhcnRlciB0aGUgcGVyaW9kICh1cCB0byB0b2RheSBmb3IgdGhlIGN1cnJlbnQgb25lKTsgcmVsb2FkcyB1bmxlc3MgdGhlIGZpbHRlciBkcmF3ZXIgaXMgb3Blbi4gKi9cclxuICBwcml2YXRlIGFwcGx5UXVhcnRlcihrZXk6IHN0cmluZywgZm9yY2UgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgY29uc3QgcSA9IHRoaXMuZmlzY2FsLmZpbmQoeCA9PiB4LmtleSA9PT0ga2V5KSB8fCB0aGlzLmZpc2NhbFt0aGlzLmZpc2NhbC5sZW5ndGggLSAxXTtcclxuICAgIGNvbnN0IHRvZGF5ID0gdGhpcy50b2RheS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcclxuICAgIGNvbnN0IHRvID0gcS50byA+IHRvZGF5ID8gdG9kYXkgOiBxLnRvO1xyXG4gICAgaWYgKCFmb3JjZSAmJiBxLmtleSA9PT0gdGhpcy5xdWFydGVyICYmIHRoaXMuZnJvbSA9PT0gcS5mcm9tICYmIHRoaXMudG8gPT09IHRvKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5xdWFydGVyID0gcS5rZXk7XHJcbiAgICB0aGlzLmZyb20gPSBxLmZyb207XHJcbiAgICB0aGlzLnRvID0gdG87XHJcbiAgICB0aGlzLnJhbmdlID0gdG9QaWNrZXJSYW5nZSh0aGlzLmZyb20sIHRoaXMudG8pO1xyXG4gICAgaWYgKCF0aGlzLmZpbHRlcnNPcGVuKSB7IHRoaXMucmVsb2FkUGVyaW9kKCk7IH1cclxuICB9XHJcblxyXG4gIC8qKiBRdWFydGVybHk6IGEgYmFyIChvciBhIHF1YXJ0ZXIgaW4gdGhlIGZpbHRlciBkcmF3ZXIpIHBpY2tzIHRoYXQgcXVhcnRlci4gKi9cclxuICBzZWxlY3RRdWFydGVyKGtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5ncmFpbiAhPT0gJ3F1YXJ0ZXInKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5hcHBseVF1YXJ0ZXIoa2V5KTtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgdHJlbmQgY2FyZCB3YWl0cyBmb3IgdGhlIHBhZ2UgZmVlZHMsIGFuZCBpbiBRdWFydGVybHkgYWxzbyBmb3IgdGhlIHF1YXJ0ZXIgYmFycy4gKi9cclxuICBnZXQgdHJlbmRMb2FkaW5nKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMubG9hZGluZyB8fCAodGhpcy5ncmFpbiA9PT0gJ3F1YXJ0ZXInICYmIHRoaXMucXVhcnRlclRyZW5kTG9hZGluZyk7XHJcbiAgfVxyXG5cclxuICAvKiogQmFycyB0aGUgdHJlbmQgY2hhcnQgZHJhd3M6IHRoZSBmb3VyIHF1YXJ0ZXJzLCBvciB0aGUgQVBJJ3MgYnktZGF0ZSBidWNrZXRzLiAqL1xyXG4gIGdldCB0cmVuZEJhcnMoKTogVHJlbmRCYXJbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5ncmFpbiA9PT0gJ3F1YXJ0ZXInID8gdGhpcy5xdWFydGVyVHJlbmQgOiB0aGlzLnRyZW5kO1xyXG4gIH1cclxuXHJcbiAgLyoqIE1vcmUgYmFycyB0aGFuIGZpdCB0aGVpciBsYWJlbHMgKGEgbW9udGggYnkgZGF0ZSk6IHNlZSBzaG93WExhYmVsLiAqL1xyXG4gIGdldCBkZW5zZVRyZW5kKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMudHJlbmRCYXJzLmxlbmd0aCA+IDEyO1xyXG4gIH1cclxuXHJcbiAgLyoqIERlbnNlIGNoYXJ0OiBhIGxhYmVsIG9uIGV2ZXJ5IGZldyBiYXJzIChhYm91dCA4IGFjcm9zcyksIGFsd2F5cyBvbiB0aGUgZmlyc3QgYW5kIGxhc3Q7IG90aGVyd2lzZSBldmVyeSBiYXIuICovXHJcbiAgc2hvd1hMYWJlbChpOiBudW1iZXIsIGxhc3Q6IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIGNvbnN0IG4gPSB0aGlzLnRyZW5kQmFycy5sZW5ndGg7XHJcbiAgICBpZiAobiA8PSAxMikgeyByZXR1cm4gdHJ1ZTsgfVxyXG4gICAgY29uc3Qgc3RlcCA9IE1hdGguY2VpbChuIC8gOCk7XHJcbiAgICAvLyBUaGUgbGFzdCBsYWJlbCBhbHdheXMgc2hvd3M7IHRoZSByZWd1bGFyIG9uZSBqdXN0IGJlZm9yZSBpdCBpcyBza2lwcGVkIHdoZW4gdGhlIHR3byB3b3VsZCB0b3VjaC5cclxuICAgIHJldHVybiBsYXN0IHx8IChpICUgc3RlcCA9PT0gMCAmJiBuIC0gMSAtIGkgPj0gc3RlcCAtIDEpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFwiT2N0IOKAkyBEZWMgMjAyNlwiIGZvciBhIHF1YXJ0ZXIga2V5LiAqL1xyXG4gIHF1YXJ0ZXJNb250aHMoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlzY2FsLmZpbmQocSA9PiBxLmtleSA9PT0ga2V5KT8ubW9udGhzIHx8ICcnO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIC8qKiBTdG9yZXMgdGlja2VkIGluIHRoZSBnbG9iYWwgaGVhZGVyLiAqL1xyXG4gIHByaXZhdGUgaGVhZGVyU3RvcmVJZHMoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuICh0aGlzLmhlYWRlckRhdGE/LnN0b3JlcyB8fCBbXSkuZmlsdGVyKChzOiBhbnkpID0+IHMuY2hlY2tlZCkubWFwKChzOiBhbnkpID0+IHMuc3RvcmVJZCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBoaWVyYXJjaHlBcHBsaWVkKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgYSA9IHRoaXMuYXBwbGllZDtcclxuICAgIHJldHVybiAhIShhLmNpcmNsZSB8fCBhLnpvbmUgfHwgYS5hb20gfHwgYS5zdG9yZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hdGNoZXNTY29wZShyOiBBdWRpdFJvdywgcGljazogU2NvcGVQaWNrKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKCFwaWNrLmNpcmNsZSB8fCByLmNpcmNsZSA9PT0gcGljay5jaXJjbGUpICYmICghcGljay56b25lIHx8IHIuem9uZSA9PT0gcGljay56b25lKVxyXG4gICAgICAmJiAoIXBpY2suYW9tIHx8IHIuYW9tID09PSBwaWNrLmFvbSkgJiYgKCFwaWNrLnN0b3JlIHx8IFN0cmluZyhyLnJhdz8uc3RvcmVJZCkgPT09IHBpY2suc3RvcmUpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBzdG9yZXMgZXZlcnkgZmVlZCByZWFkczogdGhlIGhlYWRlcidzLCBuYXJyb3dlZCB0byB0aGUgYXBwbGllZCBoaWVyYXJjaHkgcGljay4gKi9cclxuICBwcml2YXRlIHNjb3BlZFN0b3JlSWRzKCk6IHN0cmluZ1tdIHtcclxuICAgIGlmICghdGhpcy5oaWVyYXJjaHlBcHBsaWVkKSB7IHJldHVybiB0aGlzLmhlYWRlclN0b3JlSWRzKCk7IH1cclxuICAgIHJldHVybiB0aGlzLnNjb3BlUm93cy5maWx0ZXIociA9PiB0aGlzLm1hdGNoZXNTY29wZShyLCB0aGlzLmFwcGxpZWQpKS5tYXAociA9PiBTdHJpbmcoci5yYXc/LnN0b3JlSWQgfHwgJycpKS5maWx0ZXIoQm9vbGVhbik7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIGFwcGxpZWQgQXVkaXQgdHlwZSBhcyB0aGUgQVBJcyB0YWtlIGl0IChub3RoaW5nIGZvciBBbGwgQXVkaXRzKS4gKi9cclxuICBwcml2YXRlIGF1ZGl0RmlsdGVyKCk6IHsgY2hlY2tsaXN0SWQ/OiBzdHJpbmcgfSB7XHJcbiAgICByZXR1cm4gdGhpcy5hcHBsaWVkLmF1ZGl0VHlwZSAhPT0gJ2FsbCcgPyB7IGNoZWNrbGlzdElkOiB0aGlzLmFwcGxpZWQuYXVkaXRUeXBlIH0gOiB7fTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmFzZVBheWxvYWQoZXh0cmE6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZnJvbURhdGU6IHRoaXMuZnJvbSB8fCB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LnN0YXJ0RGF0ZSxcclxuICAgICAgdG9EYXRlOiB0aGlzLnRvIHx8IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uZW5kRGF0ZSxcclxuICAgICAgc3RvcmVJZDogdGhpcy5zY29wZWRTdG9yZUlkcygpLFxyXG4gICAgICAuLi50aGlzLmF1ZGl0RmlsdGVyKCksXHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmhlYWRlckRhdGE/LmNsaWVudCxcclxuICAgICAgdXNlckVtYWlsZXM6IHRoaXMudXNlckVtYWlsZXMsXHJcbiAgICAgIGxpbWl0OiAxMDAwLFxyXG4gICAgICBvZmZzZXQ6IDAsXHJcbiAgICAgIHNvcnRCeTogJycsXHJcbiAgICAgIHNvcnRDb2x1bW5OYW1lOiAnJyxcclxuICAgICAgc2VhcmNoVmFsdWU6ICcnLFxyXG4gICAgICBleHBvcnQ6IGZhbHNlLFxyXG4gICAgICAuLi5leHRyYVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgZm91ciBmZWVkcyBsb2FkIHRvZ2V0aGVyOyBhIGZhaWx1cmUgaW4gb25lIGxlYXZlcyB0aGUgb3RoZXJzIGludGFjdC4gKi9cclxuICBwcml2YXRlIGxvYWQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgY29uc3Qgc2FmZSA9IChvOiBhbnkpID0+IG8ucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKG51bGwpKSk7XHJcbiAgICBjb25zdCBzY29wZSA9IHRoaXMuYmFzZVBheWxvYWQoKTtcclxuICAgIC8vIFJvd3MgZmV0Y2hlZCBmb3IgdGhlIHdob2xlIGhlYWRlciBzY29wZSByZWZpbGwgdGhlIGhpZXJhcmNoeSBsaXN0czsgbmFycm93ZWQgb25lcyBkbyBub3QuXHJcbiAgICBjb25zdCBuYXJyb3dlZCA9IHRoaXMuaGllcmFyY2h5QXBwbGllZDtcclxuICAgIGZvcmtKb2luKHtcclxuICAgICAgLy8gVGhlIGF1ZGl0IGRhc2hib2FyZCBBUEkgcmVqZWN0cyB1bmtub3duIGtleXMsIHNvIG9ubHkgdGhlIHNjb3BlIGlzIHNlbnQuXHJcbiAgICAgIGRhc2g6IHNhZmUodGhpcy50cmF4U2VydmljZS5hdWRpdERhc2hib2FyZCh7XHJcbiAgICAgICAgY2xpZW50SWQ6IHNjb3BlWydjbGllbnRJZCddLCBmcm9tRGF0ZTogc2NvcGVbJ2Zyb21EYXRlJ10sIHRvRGF0ZTogc2NvcGVbJ3RvRGF0ZSddLCBzdG9yZUlkOiBzY29wZVsnc3RvcmVJZCddLFxyXG4gICAgICAgIC4uLnRoaXMuYXVkaXRGaWx0ZXIoKVxyXG4gICAgICB9KSksXHJcbiAgICAgIC8vIFNhbWUgdGFibGVzIGFzIHRoZSBjaGVja2xpc3QgZGFzaGJvYXJkLCBsaW1pdGVkIHNlcnZlci1zaWRlIHRvIHRoaXMgY2xpZW50J3MgYXVkaXRzLlxyXG4gICAgICBhdWRpdHM6IHNhZmUodGhpcy50cmF4U2VydmljZS5hdWRpdENoZWNrbGlzdFBlcmZvcm1hbmNlKHRoaXMuYmFzZVBheWxvYWQoeyBsaW1pdDogMjAwIH0pKSksXHJcbiAgICAgIHN0b3Jlczogc2FmZSh0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0U3RvcmVQZXJmb3JtYW5jZSh0aGlzLmJhc2VQYXlsb2FkKHsgbGltaXQ6IDEwMDAgfSkpKSxcclxuICAgICAgdXNlcnM6IHNhZmUodGhpcy50cmF4U2VydmljZS5hdWRpdFVzZXJQZXJmb3JtYW5jZSh0aGlzLmJhc2VQYXlsb2FkKHsgbGltaXQ6IDUwMCB9KSkpXHJcbiAgICB9KS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCh7IGRhc2gsIGF1ZGl0cywgc3RvcmVzLCB1c2VycyB9OiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgZGF0YSA9IGRhc2g/LmNvZGUgPT09IDIwMCA/IChkYXNoLmRhdGEgfHwge30pIDoge307XHJcbiAgICAgIGNvbnN0IGF1ZGl0TGlzdCA9IGF1ZGl0cz8uY29kZSA9PT0gMjAwID8gKGF1ZGl0cy5kYXRhPy5jaGVja2xpc3RQZXJmb3JtYW5jZSB8fCBbXSkgOiBbXTtcclxuICAgICAgY29uc3Qgc3RvcmVMaXN0ID0gc3RvcmVzPy5jb2RlID09PSAyMDAgPyAoc3RvcmVzLmRhdGE/LnN0b3JlUGVyZm9ybWFuY2UgfHwgW10pIDogW107XHJcbiAgICAgIGNvbnN0IHVzZXJMaXN0ID0gdXNlcnM/LmNvZGUgPT09IDIwMCA/ICh1c2Vycy5kYXRhPy51c2VyUGVyZm9ybWFuY2UgfHwgW10pIDogW107XHJcblxyXG4gICAgICB0aGlzLnBhc3NNYXJrID0gTnVtYmVyKGRhdGEuc3VtbWFyeT8ucGFzc01hcmspIHx8IFBBU1NfTUFSSztcclxuICAgICAgdGhpcy5jcml0aWNhbE1hcmsgPSBOdW1iZXIoZGF0YS5zdW1tYXJ5Py5jcml0aWNhbE1hcmspIHx8IENSSVRJQ0FMX01BUks7XHJcbiAgICAgIHRoaXMucm93cyA9IChkYXRhLnN0b3JlcyB8fCBbXSkubWFwKChzOiBhbnkpID0+IHRoaXMudG9BdWRpdFJvdyhzKSk7XHJcbiAgICAgIGlmICghbmFycm93ZWQgJiYgZGFzaD8uY29kZSA9PT0gMjAwKSB7IHRoaXMuc2NvcGVSb3dzID0gdGhpcy5yb3dzOyB9XHJcbiAgICAgIHRoaXMuc3RvcmVQZXJmID0gc3RvcmVMaXN0Lm1hcCgocjogYW55KSA9PiB0aGlzLnRvU3RvcmVQZXJmKHIpKTtcclxuICAgICAgdGhpcy50cmVuZCA9IChkYXRhLnRyZW5kIHx8IFtdKS5tYXAoKGI6IGFueSkgPT4gKHtcclxuICAgICAgICBrZXk6IFN0cmluZyhiLmtleSksIGxhYmVsOiBTdHJpbmcoYi5sYWJlbCksXHJcbiAgICAgICAgdmFsdWU6IGIudmFsdWUgPT09IG51bGwgfHwgYi52YWx1ZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IE51bWJlcihiLnZhbHVlKSxcclxuICAgICAgICBjb3VudDogTnVtYmVyKGIuY291bnQpIHx8IDAsXHJcbiAgICAgICAgLy8gT2xkZXIgQVBJIGJ1aWxkcyBzZW5kIG9ubHkgY291bnQgKGV2ZXJ5IGF1ZGl0IHdhcyBzY29yZWQgdGhlbikuXHJcbiAgICAgICAgc3VibWl0dGVkOiBOdW1iZXIoYi5zdWJtaXR0ZWQgPz8gYi5jb3VudCkgfHwgMFxyXG4gICAgICB9KSk7XHJcbiAgICAgIHRoaXMuYXVkaXRQZXJmID0gYXVkaXRMaXN0Lm1hcCgocjogYW55KSA9PiB0aGlzLnRvQXVkaXRQZXJmKHIpKTtcclxuICAgICAgdGhpcy51c2VyUGVyZiA9IHVzZXJMaXN0Lm1hcCgocjogYW55KSA9PiB0aGlzLnRvVXNlclBlcmYocikpO1xyXG4gICAgICB0aGlzLnBlcmZQYWdlID0gMTtcclxuICAgICAgdGhpcy5sYXN0UmVmcmVzaGVkID0gZGF5anMoKS5mb3JtYXQoJ2hoOm1tOnNzIEEnKTtcclxuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPbmUgc3RvcmUgZnJvbSB0aGUgYXVkaXQgZGFzaGJvYXJkIEFQSTogc2NvcmUgaXMgdGhlIG1lYW4gb2YgaXRzIGNvbXBsaWFuY2Utc2NvcmVkIGF1ZGl0cyBpbiB0aGUgcGVyaW9kLFxyXG4gICAqIG51bGwgd2hlbiBub25lLiBBIHN0b3JlIHdpdGggc3VibWl0dGVkIGF1ZGl0cyBidXQgbm8gc2NvcmUgaXMgJ3Vuc2NvcmVkJyAoaXRzIGF1ZGl0cyBoYXZlIG5vIHF1ZXN0aW9uIHdpdGhcclxuICAgKiBjb21wbGlhbmNlIHNjb3Jpbmcgb24pLCBub3QgXCJOb3QgYXVkaXRlZFwiLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgdG9BdWRpdFJvdyhzOiBhbnkpOiBBdWRpdFJvdyB7XHJcbiAgICBjb25zdCBzY29yZSA9IHRoaXMubnVtKHM/LnNjb3JlKTtcclxuICAgIGxldCBzdGF0dXM6IFN0b3JlU3RhdHVzO1xyXG4gICAgaWYgKHNjb3JlICE9PSBudWxsKSB7XHJcbiAgICAgIHN0YXR1cyA9IHNjb3JlID49IHRoaXMucGFzc01hcmsgPyAncGFzcycgOiAnZmFpbCc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzdGF0dXMgPSBzPy5zdGF0dXMgPT09ICd1bnNjb3JlZCcgfHwgKHRoaXMubnVtKHM/LmF1ZGl0cykgPz8gMCkgPiAwID8gJ3Vuc2NvcmVkJyA6ICduYSc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBkYXRlOiBzPy5sYXN0QXVkaXREYXRlID8gdGhpcy5mbXQocy5sYXN0QXVkaXREYXRlKSA6ICfigJQnLFxyXG4gICAgICAvLyBUaGUgc3RvcmUncyBuYW1lIChoaWVyYXJjaHksIGl0cyBzdWJtaXNzaW9ucywgb3IgdGhlIHN0b3JlcyBsaXN0KTsgXCLigJRcIiB3aGVuIGl0IGhhcyBub25lLCBuZXZlciB0aGUgaWQuXHJcbiAgICAgIHN0b3JlSWQ6IHM/LnN0b3JlTmFtZSB8fCAn4oCUJyxcclxuICAgICAgY2lyY2xlOiBzPy5jaXJjbGUgfHwgJ+KAlCcsXHJcbiAgICAgIHpvbmU6IHM/LnpvbmUgfHwgJ+KAlCcsXHJcbiAgICAgIGFvbTogcz8uYW9tIHx8ICfigJQnLFxyXG4gICAgICBzY29yZTogc2NvcmUgPT09IG51bGwgPyBudWxsIDogTWF0aC5yb3VuZChzY29yZSksXHJcbiAgICAgIHN0YXR1cyxcclxuICAgICAgcmF3OiBzXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT25lIHN0b3JlIGZyb20gL2F1ZGl0L2Rhc2hib2FyZC9zdG9yZVBlcmZvcm1hbmNlIChhdWRpdCBjb3B5IG9mIHRoZSBjaGVja2xpc3QgZGFzaGJvYXJkJ3MgdGFibGUpOiBldmVyeSBhdWRpdFxyXG4gICAqIHZpc2l0IGluIHRoZSBwZXJpb2QsIHNvIGNvbXBsZXRpb24gPSBzdWJtaXR0ZWQgLyBhc3NpZ25lZCBhbmQgZmxhZ3MgY291bnQsIHVubGlrZSB0aGUgc2NvcmUtb25seSBzdG9yZSBsaXN0LlxyXG4gICAqL1xyXG4gIHByaXZhdGUgdG9TdG9yZVBlcmYocjogYW55KTogU3RvcmVQZXJmUm93IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHN0b3JlSWQ6IHI/LnN0b3JlX2lkIHx8ICcnLFxyXG4gICAgICBzdG9yZTogcj8uc3RvcmVOYW1lIHx8ICfigJQnLFxyXG4gICAgICBzcG9jOiByPy51c2VyRW1haWwgfHwgJ+KAlCcsXHJcbiAgICAgIGFzc2lnbmVkOiB0aGlzLm51bShyPy5jaGVja0xpc3RDb3VudCkgPz8gMCxcclxuICAgICAgZmxhZ3M6IHRoaXMubnVtKHI/LmZsYWdnZWRDb3VudCksXHJcbiAgICAgIGNvbXBsZXRpb246IHRoaXMucGN0VGV4dChyPy5jb21wbGV0aW9uKSxcclxuICAgICAgY29tcGxpYW5jZTogdGhpcy5wY3RUZXh0KHI/LmNvbXBsaWFuY2UpLFxyXG4gICAgICBwZXJmOiB0aGlzLnBjdFRleHQocj8ucGVyZm9ybWFuY2UpLFxyXG4gICAgICByYXc6IHJcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBCYXIgZmlsbCBmb3IgYSBwZXJjZW50YWdlIChudW1iZXIsIG9yIHRleHQgbGlrZSBcIjUxJVwiIC8gXCItMjUlXCIpOiBrZXB0IHRvIDAtMTAwLiBBIG5lZ2F0aXZlIHNjb3JlIChvcHRpb25cclxuICAgKiBzY29yZXMgY2FuIGJlIG5lZ2F0aXZlIHBlbmFsdGllcykgd291bGQgb3RoZXJ3aXNlIHNldCBhbiBpbnZhbGlkIG5lZ2F0aXZlIHdpZHRoLCB3aGljaCB0aGUgYnJvd3NlciBkcm9wcyxcclxuICAgKiBkcmF3aW5nIHRoZSBiYXIgZnVsbDsgaXQgaXMgZW1wdHkgaW5zdGVhZCwgd2hpbGUgdGhlIG51bWJlciBiZXNpZGUgaXQgc3RpbGwgc2hvd3MgdGhlIHJlYWwgc2NvcmUuXHJcbiAgICovXHJcbiAgYmFyV2lkdGgodmFsdWU6IG51bWJlciB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbiA9IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgPyB2YWx1ZSA6IHBhcnNlRmxvYXQoU3RyaW5nKHZhbHVlID8/ICcnKS5yZXBsYWNlKCclJywgJycpKTtcclxuICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUobikgPyBNYXRoLm1heCgwLCBNYXRoLm1pbigxMDAsIG4pKSArICclJyA6ICcwJSc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRvQXVkaXRQZXJmKHI6IGFueSk6IEF1ZGl0UGVyZlJvdyB7XHJcbiAgICBjb25zdCBuYW1lID0gcj8uY2hlY2tMaXN0TmFtZSB8fCAn4oCUJztcclxuICAgIC8vIE5vIHF1ZXN0aW9uIG9mIHRoZSBhdWRpdCBoYXMgY29tcGxpYW5jZSBzY29yaW5nIG9uOiBubyBzY29yZSBhbmQgbm8gcmVzdWx0ICh0aGUgQVBJIHNlbmRzIG51bGwpLlxyXG4gICAgY29uc3Qgc2NvcmUgPSByPy5jb21wbGlhbmNlRW5hYmxlZCA9PT0gZmFsc2UgPyBudWxsIDogdGhpcy5udW0ocj8ucXVlc3Rpb25Db21wbGlhbmNlKTtcclxuICAgIGNvbnN0IHNjb3JlUGN0ID0gc2NvcmUgPT09IG51bGwgPyAwIDogTWF0aC5yb3VuZChzY29yZSk7XHJcbiAgICAvLyBUaGUgYXVkaXQncyBvd24gcGFzcyBtYXJrIHdoZW4gdGhlIEFQSSBzZW5kcyBpdCwgZWxzZSB0aGUgZGFzaGJvYXJkJ3MgKHN1bW1hcnkucGFzc01hcmspLlxyXG4gICAgY29uc3QgbWFyayA9IHRoaXMubnVtKHI/LnBhc3NNYXJrKSA/PyB0aGlzLnBhc3NNYXJrO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbmFtZSxcclxuICAgICAgaW5pdGlhbHM6IFN0cmluZyhyPy5jaGVja0xpc3RDaGFyIHx8IG5hbWUuc2xpY2UoMCwgMikpLnRvVXBwZXJDYXNlKCksXHJcbiAgICAgIHNjaGVkdWxlZDogcj8uc2NoZWR1bGVSZXBlYXRlZFR5cGUgPyB0aGlzLnRpdGxlQ2FzZShyLnNjaGVkdWxlUmVwZWF0ZWRUeXBlKSA6ICfigJQnLFxyXG4gICAgICBhc3NpZ25lZDogdGhpcy5udW0ocj8uc3RvcmVDb3VudCkgPz8gMCxcclxuICAgICAgc3VibWl0dGVkOiB0aGlzLm51bShyPy5zdWJtaXR0ZWRDaGVja2xpc3QpID8/IDAsXHJcbiAgICAgIC8vIFF1ZXN0aW9ucyB3aXRoIGEgc3RvcmUgZGlzcHV0ZSAocmFpc2VkIG9yIHJldmlld2VkKSBpbiB0aGUgcGVyaW9kOyAn4oCUJyBvbmx5IHdoZW4gdGhlIEFQSSBzZW5kcyBub25lLlxyXG4gICAgICBkaXNwdXRlczogdGhpcy5udW0ocj8uZGlzcHV0ZXMpLFxyXG4gICAgICBwYXNzTWFyazogbWFyayArICclJyxcclxuICAgICAgc2NvcmU6IHNjb3JlID09PSBudWxsID8gJ+KAlCcgOiBzY29yZVBjdCArICclJyxcclxuICAgICAgc2NvcmVQY3QsXHJcbiAgICAgIHJlc3VsdDogc2NvcmUgPT09IG51bGwgPyAn4oCUJyA6IChzY29yZVBjdCA+PSBtYXJrID8gJ1Bhc3MnIDogJ0ZhaWwnKSxcclxuICAgICAgcmF3OiByXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0b1VzZXJQZXJmKHI6IGFueSk6IFVzZXJQZXJmUm93IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIG5hbWU6IHI/LnVzZXJOYW1lIHx8ICfigJQnLFxyXG4gICAgICBlbWFpbDogcj8udXNlckVtYWlsIHx8ICfigJQnLFxyXG4gICAgICBhc3NpZ25lZDogdGhpcy5udW0ocj8uY2hlY2tMaXN0Q291bnQpID8/IDAsXHJcbiAgICAgIGZsYWdzOiB0aGlzLm51bShyPy5mbGFnZ2VkQ291bnQpID8/IDAsXHJcbiAgICAgIHJlZG86IHRoaXMubnVtKHI/LnJlZG8pID8/IDAsXHJcbiAgICAgIGNvbXBsZXRpb246IHRoaXMucGN0VGV4dChyPy5jb21wbGV0aW9uKSxcclxuICAgICAgY29tcGxpYW5jZTogdGhpcy5wY3RUZXh0KHI/LmNvbXBsaWFuY2UpLFxyXG4gICAgICBwZXJmOiB0aGlzLnBjdFRleHQocj8ucGVyZm9ybWFuY2UpLFxyXG4gICAgICByYXc6IHJcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUYXNrIG1vZGU6IHRpbGVzICsgVGFzayBQZXJmb3JtYW5jZSByb3dzIGZvciB0aGUgdGFza3MgcmFpc2VkIGZyb20gdGhpcyBjbGllbnQncyBhdWRpdHMsIGluIHRoZVxyXG4gICAqIGN1cnJlbnQgc2NvcGUuIEEgZmFpbGVkIGNhbGwgbGVhdmVzICfigJQnIGV2ZXJ5d2hlcmUgYW5kIHJldHJpZXMgdGhlIG5leHQgdGltZSB0aGUgVGFzayB0YWIgb3BlbnMuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsb2FkVGFza3MoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaGVhZGVyRGF0YSkgeyByZXR1cm47IH1cclxuICAgIHRoaXMudGFza3NTdGFsZSA9IGZhbHNlO1xyXG4gICAgdGhpcy50YXNrTG9hZGluZyA9IHRydWU7XHJcbiAgICBjb25zdCByZXF1ZXN0ID0gKyt0aGlzLnRhc2tSZXF1ZXN0O1xyXG4gICAgY29uc3Qgc2NvcGUgPSB0aGlzLmJhc2VQYXlsb2FkKCk7XHJcbiAgICAvLyBUaGUgZW5kcG9pbnQgcmVqZWN0cyB1bmtub3duIGtleXMsIHNvIG9ubHkgdGhlIHNjb3BlIGlzIHNlbnQuXHJcbiAgICB0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0RGFzaGJvYXJkVGFza3Moe1xyXG4gICAgICBjbGllbnRJZDogc2NvcGVbJ2NsaWVudElkJ10sIGZyb21EYXRlOiBzY29wZVsnZnJvbURhdGUnXSwgdG9EYXRlOiBzY29wZVsndG9EYXRlJ10sXHJcbiAgICAgIHN0b3JlSWQ6IHNjb3BlWydzdG9yZUlkJ10sIHVzZXJFbWFpbGVzOiBzY29wZVsndXNlckVtYWlsZXMnXSwgLi4udGhpcy5hdWRpdEZpbHRlcigpXHJcbiAgICB9KS5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlcXVlc3QgIT09IHRoaXMudGFza1JlcXVlc3QpIHsgcmV0dXJuOyB9XHJcbiAgICAgIGNvbnN0IGRhdGEgPSByZXM/LmNvZGUgPT09IDIwMCA/IChyZXMuZGF0YSB8fCBudWxsKSA6IG51bGw7XHJcbiAgICAgIGlmICghZGF0YSkgeyB0aGlzLnRhc2tzU3RhbGUgPSB0cnVlOyB9XHJcbiAgICAgIHRoaXMudGFza1N0YXRzID0gdGhpcy50b1Rhc2tTdGF0cyhkYXRhKTtcclxuICAgICAgdGhpcy50YXNrUGVyZiA9IChkYXRhPy50YXNrcyB8fCBbXSkubWFwKCh0OiBhbnkpID0+IHRoaXMudG9UYXNrUGVyZih0KSk7XHJcbiAgICAgIHRoaXMubGFzdFJlZnJlc2hlZCA9IGRheWpzKCkuZm9ybWF0KCdoaDptbTpzcyBBJyk7XHJcbiAgICAgIHRoaXMudGFza0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdG9UYXNrU3RhdHMoZDogYW55KTogVGFza1N0YXRzIHtcclxuICAgIHRoaXMudGFza0RlbHRhVmFsdWVzID0ge1xyXG4gICAgICBjb21wbGV0aW9uOiB0aGlzLm51bShkPy5kZWx0YXM/LmNvbXBsZXRpb24pLFxyXG4gICAgICBjb21wbGlhbmNlOiB0aGlzLm51bShkPy5kZWx0YXM/LmNvbXBsaWFuY2UpLFxyXG4gICAgICBmbGFnczogdGhpcy5udW0oZD8uZGVsdGFzPy5mbGFncylcclxuICAgIH07XHJcbiAgICBpZiAoIWQpIHsgcmV0dXJuIHsgLi4uRU1QVFlfVEFTS19TVEFUUyB9OyB9XHJcbiAgICBjb25zdCBjb3VudCA9ICh2OiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgbiA9IHRoaXMubnVtKHYpO1xyXG4gICAgICByZXR1cm4gbiA9PT0gbnVsbCA/ICfigJQnIDogbi50b0xvY2FsZVN0cmluZygnZW4tVVMnKTtcclxuICAgIH07XHJcbiAgICBjb25zdCBkYXlzID0gdGhpcy5udW0oZD8ucGVyaW9kPy5wcmV2aW91cz8uZGF5cykgPz8gMTtcclxuICAgIGNvbnN0IHZzID0gZGF5cyA9PT0gMSA/ICd2cyBsYXN0IGRheScgOiAndnMgcHJldmlvdXMgJyArIGRheXMgKyAnIGRheXMnO1xyXG4gICAgY29uc3QgZGVsdGEgPSAodjogbnVtYmVyIHwgbnVsbCkgPT4gKHYgPT09IG51bGwgPyAnJyA6IE1hdGguYWJzKHYpICsgJyUgJyArIHZzKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGFjdGl2ZVRhc2tzOiBjb3VudChkLmFjdGl2ZVRhc2tzKSxcclxuICAgICAgdGFza0luc3RhbmNlczogY291bnQoZC50YXNrSW5zdGFuY2VzKSxcclxuICAgICAgbm90U3VibWl0dGVkOiBjb3VudChkLm5vdFN1Ym1pdHRlZCksXHJcbiAgICAgIG9wZW5UYXNrczogY291bnQoZC5vcGVuVGFza3MpLFxyXG4gICAgICBpblByb2dyZXNzOiBjb3VudChkLmluUHJvZ3Jlc3MpLFxyXG4gICAgICBzdWJtaXR0ZWQ6IGNvdW50KGQuc3VibWl0dGVkKSxcclxuICAgICAgY29tcGxldGlvblNjb3JlOiB0aGlzLnBjdFRleHQoZC5jb21wbGV0aW9uU2NvcmUpLFxyXG4gICAgICBjb21wbGlhbmNlU2NvcmU6IHRoaXMucGN0VGV4dChkLmNvbXBsaWFuY2VTY29yZSksXHJcbiAgICAgIHRvdGFsRmxhZ3M6IGNvdW50KGQudG90YWxGbGFncyksXHJcbiAgICAgIGNvbXBsZXRpb25EZWx0YTogZGVsdGEodGhpcy50YXNrRGVsdGFWYWx1ZXMuY29tcGxldGlvbiksXHJcbiAgICAgIGNvbXBsaWFuY2VEZWx0YTogZGVsdGEodGhpcy50YXNrRGVsdGFWYWx1ZXMuY29tcGxpYW5jZSksXHJcbiAgICAgIGZsYWdzRGVsdGE6IGRlbHRhKHRoaXMudGFza0RlbHRhVmFsdWVzLmZsYWdzKVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKiBPbmUgdGFzayByYWlzZWQgZnJvbSBhbiBhdWRpdDsgY29tcGxpYW5jZSBpcyAn4oCUJyB3aGlsZSB0YXNrIGluc3RhbmNlcyBjYXJyeSBubyBzY29yZS4gKi9cclxuICBwcml2YXRlIHRvVGFza1BlcmYodDogYW55KTogVGFza1BlcmZSb3cge1xyXG4gICAgY29uc3QgbmFtZSA9IHQ/LnRhc2tOYW1lIHx8ICfigJQnO1xyXG4gICAgY29uc3QgY29tcGxpYW5jZSA9IHRoaXMubnVtKHQ/LmNvbXBsaWFuY2UpO1xyXG4gICAgY29uc3QgcmFpc2VkID0gdGhpcy5udW0odD8udGFza3MpO1xyXG4gICAgbGV0IHNjaGVkdWxlZCA9ICfigJQnO1xyXG4gICAgaWYgKHQ/LnNjaGVkdWxlUmVwZWF0ZWRUeXBlKSB7XHJcbiAgICAgIHNjaGVkdWxlZCA9IHRoaXMudGl0bGVDYXNlKHQuc2NoZWR1bGVSZXBlYXRlZFR5cGUpO1xyXG4gICAgfSBlbHNlIGlmICh0Py5kdWVEYXRlKSB7XHJcbiAgICAgIHNjaGVkdWxlZCA9ICdEdWUgJyArIHRoaXMuZm10KHQuZHVlRGF0ZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBuYW1lLFxyXG4gICAgICBpbml0aWFsczogbmFtZS5zbGljZSgwLCAyKS50b1VwcGVyQ2FzZSgpLFxyXG4gICAgICBzY2hlZHVsZWQsXHJcbiAgICAgIGNvdmVyYWdlOiB0Py5jb3ZlcmFnZSA/IHRoaXMudGl0bGVDYXNlKHQuY292ZXJhZ2UpIDogJ+KAlCcsXHJcbiAgICAgIGFzc2lnbmVkOiB0aGlzLm51bSh0Py5hc3NpZ25lZCkgPz8gMCxcclxuICAgICAgc3VibWl0dGVkOiB0aGlzLm51bSh0Py5zdWJtaXR0ZWQpID8/IDAsXHJcbiAgICAgIGZsYWdzOiB0aGlzLm51bSh0Py5mbGFncykgPz8gMCxcclxuICAgICAgdGFza3M6IHJhaXNlZCA9PT0gbnVsbCA/ICfigJQnIDogU3RyaW5nKHJhaXNlZCksXHJcbiAgICAgIHJlZG86IHRoaXMubnVtKHQ/LnJlZG8pID8/IDAsXHJcbiAgICAgIGNvbXBsaWFuY2U6IHRoaXMucGN0VGV4dChjb21wbGlhbmNlKSxcclxuICAgICAgY29tcGxpYW5jZVBjdDogY29tcGxpYW5jZSA9PT0gbnVsbCA/IDAgOiBNYXRoLnJvdW5kKGNvbXBsaWFuY2UpLFxyXG4gICAgICByYXc6IHRcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKiogRGVsdGEgc3R5bGluZzogYXJyb3cgZGlyZWN0aW9uLCBhbmQgY29sb3VyIGJ5IHdoZXRoZXIgdGhlIG1vdmUgaXMgZ29vZCAobW9yZSBmbGFncyBpcyBiYWQpLiAqL1xyXG4gIHRhc2tEZWx0YUNsYXNzKGtleTogVGFza0RlbHRhS2V5KTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHYgPSB0aGlzLnRhc2tEZWx0YVZhbHVlc1trZXldO1xyXG4gICAgaWYgKHYgPT09IG51bGwgfHwgdiA9PT0gMCkgeyByZXR1cm4gJ2lzLWZsYXQnOyB9XHJcbiAgICBjb25zdCB1cCA9IHYgPiAwO1xyXG4gICAgY29uc3QgZ29vZCA9IGtleSA9PT0gJ2ZsYWdzJyA/ICF1cCA6IHVwO1xyXG4gICAgcmV0dXJuICh1cCA/ICdpcy11cCcgOiAnaXMtZG93bicpICsgJyAnICsgKGdvb2QgPyAnaXMtZ29vZCcgOiAnaXMtYmFkJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG51bSh2OiBhbnkpOiBudW1iZXIgfCBudWxsIHtcclxuICAgIGlmICh2ID09PSBudWxsIHx8IHYgPT09IHVuZGVmaW5lZCB8fCB2ID09PSAnJykgeyByZXR1cm4gbnVsbDsgfVxyXG4gICAgY29uc3QgbiA9IE51bWJlcih2KTtcclxuICAgIHJldHVybiBpc05hTihuKSA/IG51bGwgOiBuO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwY3RUZXh0KHY6IGFueSk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBuID0gdGhpcy5udW0odik7XHJcbiAgICByZXR1cm4gbiA9PT0gbnVsbCA/ICfigJQnIDogTWF0aC5yb3VuZChuKSArICclJztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdGl0bGVDYXNlKHY6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHYuc2xpY2UoMSkudG9Mb3dlckNhc2UoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZm10KHY6IGFueSk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdiA/IGRheWpzKHYpLmZvcm1hdCgnTU1NIERELCBZWVlZJykgOiAn4oCUJztcclxuICB9XHJcblxyXG4gIC8qKiBSb3dzIGFmdGVyIHNlYXJjaCwgc3RhdHVzIGFuZCBzY29yZS1iYW5kIGZpbHRlcnMuICovXHJcbiAgZ2V0IGZpbHRlcmVkUm93cygpOiBBdWRpdFJvd1tdIHtcclxuICAgIGNvbnN0IHEgPSB0aGlzLnNlYXJjaC50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIHJldHVybiB0aGlzLnJvd3NcclxuICAgICAgLmZpbHRlcihyID0+IHRoaXMuc3RhdHVzID09PSAnYWxsJyB8fCByLnN0YXR1cyA9PT0gdGhpcy5zdGF0dXMpXHJcbiAgICAgIC5maWx0ZXIociA9PiB7XHJcbiAgICAgICAgaWYgKHIuc2NvcmUgPT09IG51bGwpIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLnNjb3JlTWluID09PSAwICYmIHRoaXMuc2NvcmVNYXggPT09IDEwMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQSBsb3dlciBib3VuZCBvZiAwIGlzIG9wZW46IHBlbmFsdHkgc2NvcmVzIGNhbiB0YWtlIGEgc3RvcmUgYmVsb3cgMCUgKENyaXRpY2FsKS5cclxuICAgICAgICByZXR1cm4gKHRoaXMuc2NvcmVNaW4gPD0gMCB8fCByLnNjb3JlID49IHRoaXMuc2NvcmVNaW4pICYmIHIuc2NvcmUgPD0gdGhpcy5zY29yZU1heDtcclxuICAgICAgfSlcclxuICAgICAgLmZpbHRlcihyID0+ICFxIHx8IFtyLnN0b3JlSWQsIHIuY2lyY2xlLCByLnpvbmUsIHIuYW9tLCByLnJhdz8uc3RvcmVOYW1lIHx8ICcnLCByLnJhdz8uc3RvcmVJZCB8fCAnJ10uc29tZSh2ID0+IFN0cmluZyh2KS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKSlcclxuICAgICAgLnNvcnQoKGEsIGIpID0+IHRoaXMuY29tcGFyZShhLCBiKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbXBhcmUoYTogQXVkaXRSb3csIGI6IEF1ZGl0Um93KTogbnVtYmVyIHtcclxuICAgIGNvbnN0IGRpciA9IHRoaXMuc29ydERpciA9PT0gJ2FzYycgPyAxIDogLTE7XHJcbiAgICBpZiAodGhpcy5zb3J0S2V5ID09PSAnc2NvcmUnKSB7XHJcbiAgICAgIC8vIE5vdC1hdWRpdGVkIHN0b3JlcyAobm8gc2NvcmUpIGFsd2F5cyBjb21lIGFmdGVyIHRoZSBhdWRpdGVkIG9uZXMsIGluIGVpdGhlciBkaXJlY3Rpb24sXHJcbiAgICAgIC8vIHNvIHRoZSBmZXcgYXVkaXRlZCBzdG9yZXMgYXJlIG5vdCBidXJpZWQgdW5kZXIgdGhvdXNhbmRzIG9mIFwiTm90IGF1ZGl0ZWRcIiByb3dzLlxyXG4gICAgICBpZiAoYS5zY29yZSA9PT0gbnVsbCB8fCBiLnNjb3JlID09PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIGEuc2NvcmUgPT09IGIuc2NvcmUgPyAwIDogKGEuc2NvcmUgPT09IG51bGwgPyAxIDogLTEpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiAoYS5zY29yZSAtIGIuc2NvcmUpICogZGlyO1xyXG4gICAgfVxyXG4gICAgY29uc3QgYXYgPSBTdHJpbmcoYVt0aGlzLnNvcnRLZXkgYXMga2V5b2YgQXVkaXRSb3ddID8/ICcnKTtcclxuICAgIGNvbnN0IGJ2ID0gU3RyaW5nKGJbdGhpcy5zb3J0S2V5IGFzIGtleW9mIEF1ZGl0Um93XSA/PyAnJyk7XHJcbiAgICByZXR1cm4gYXYubG9jYWxlQ29tcGFyZShidikgKiBkaXI7XHJcbiAgfVxyXG5cclxuICBnZXQgdG90YWxQYWdlcygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIE1hdGgubWF4KDEsIE1hdGguY2VpbCh0aGlzLmZpbHRlcmVkUm93cy5sZW5ndGggLyB0aGlzLnBhZ2VTaXplKSk7XHJcbiAgfVxyXG5cclxuICBnZXQgcGFnZVJvd3MoKTogQXVkaXRSb3dbXSB7XHJcbiAgICBjb25zdCBzdGFydCA9ICh0aGlzLnBhZ2UgLSAxKSAqIHRoaXMucGFnZVNpemU7XHJcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJlZFJvd3Muc2xpY2Uoc3RhcnQsIHN0YXJ0ICsgdGhpcy5wYWdlU2l6ZSk7XHJcbiAgfVxyXG5cclxuICAvKiogU3RvcmVzIHRoYXQgY2FycnkgYSBzY29yZSBpbiB0aGUgY3VycmVudCBwZXJpb2QuICovXHJcbiAgcHJpdmF0ZSBnZXQgZXZhbHVhdGVkKCk6IEF1ZGl0Um93W10ge1xyXG4gICAgcmV0dXJuIHRoaXMucm93cy5maWx0ZXIociA9PiByLnNjb3JlICE9PSBudWxsKTtcclxuICB9XHJcblxyXG4gIC8qKiBTdG9yZXMgd2l0aCBhIHN1Ym1pdHRlZCBhdWRpdCBpbiB0aGUgcGVyaW9kLCBzY29yZWQgb3Igbm90LiAqL1xyXG4gIHByaXZhdGUgZ2V0IGF1ZGl0ZWRDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMucm93cy5maWx0ZXIociA9PiByLnN0YXR1cyAhPT0gJ25hJykubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGF2ZXJhZ2VTY29yZSgpOiBudW1iZXIgfCBudWxsIHtcclxuICAgIGNvbnN0IGV2ID0gdGhpcy5ldmFsdWF0ZWQ7XHJcbiAgICBpZiAoIWV2Lmxlbmd0aCkgeyByZXR1cm4gbnVsbDsgfVxyXG4gICAgcmV0dXJuIE1hdGgucm91bmQoZXYucmVkdWNlKChzdW0sIHIpID0+IHN1bSArIChyLnNjb3JlIGFzIG51bWJlciksIDApIC8gZXYubGVuZ3RoKTtcclxuICB9XHJcblxyXG4gIGdldCBrcGlzKCk6IEF1ZGl0S3BpW10ge1xyXG4gICAgY29uc3QgZXYgPSB0aGlzLmV2YWx1YXRlZDtcclxuICAgIGNvbnN0IGF2ZyA9IHRoaXMuYXZlcmFnZVNjb3JlO1xyXG4gICAgY29uc3QgcGFzc0NvdW50ID0gZXYuZmlsdGVyKHIgPT4gKHIuc2NvcmUgYXMgbnVtYmVyKSA+PSB0aGlzLnBhc3NNYXJrKS5sZW5ndGg7XHJcbiAgICBjb25zdCBmYWlsQ291bnQgPSBldi5sZW5ndGggLSBwYXNzQ291bnQ7XHJcbiAgICBjb25zdCBjcml0aWNhbCA9IGV2LmZpbHRlcihyID0+IChyLnNjb3JlIGFzIG51bWJlcikgPCB0aGlzLmNyaXRpY2FsTWFyaykubGVuZ3RoO1xyXG4gICAgY29uc3QgcGVyaW9kTGFiZWwgPSB0aGlzLnBlcmlvZExhYmVsO1xyXG4gICAgY29uc3QgYXVkaXRlZCA9IHRoaXMuYXVkaXRlZENvdW50O1xyXG4gICAgbGV0IGF2Z05vdGUgPSAnQWNyb3NzIGF1ZGl0ZWQgc3RvcmVzJztcclxuICAgIGlmIChhdmcgPT09IG51bGwpIHtcclxuICAgICAgYXZnTm90ZSA9IGF1ZGl0ZWQgPyAnQ29tcGxpYW5jZSBzY29yZSBpcyBvZmYgZm9yIHRoZXNlIGF1ZGl0cycgOiAnTm8gYXVkaXRzIGluIHRoaXMgcGVyaW9kJztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gW1xyXG4gICAgICB7XHJcbiAgICAgICAgbGFiZWw6ICdBdmVyYWdlIHNjb3JlJyxcclxuICAgICAgICB2YWx1ZTogYXZnID09PSBudWxsID8gJ+KAlCcgOiBhdmcgKyAnJScsXHJcbiAgICAgICAgbm90ZTogYXZnTm90ZSxcclxuICAgICAgICBub3RlQ29sb3I6IGF2ZyAhPT0gbnVsbCAmJiBhdmcgPCB0aGlzLnBhc3NNYXJrID8gJyNEOTJEMjAnIDogJyMwMjdBNDgnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBsYWJlbDogJ1Bhc3MgcmF0ZScsXHJcbiAgICAgICAgdmFsdWU6IGV2Lmxlbmd0aCA/IE1hdGgucm91bmQocGFzc0NvdW50IC8gZXYubGVuZ3RoICogMTAwKSArICclJyA6ICfigJQnLFxyXG4gICAgICAgIG5vdGU6IHBhc3NDb3VudCArICcgcGFzcywgJyArIGZhaWxDb3VudCArICcgZmFpbCcsXHJcbiAgICAgICAgbm90ZUNvbG9yOiAnIzY2NzA4NSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGxhYmVsOiAnQ3JpdGljYWwgc3RvcmVzJyxcclxuICAgICAgICB2YWx1ZTogU3RyaW5nKGNyaXRpY2FsKSxcclxuICAgICAgICBub3RlOiAnU2NvcmUgYmVsb3cgJyArIHRoaXMuY3JpdGljYWxNYXJrICsgJyUnLFxyXG4gICAgICAgIG5vdGVDb2xvcjogY3JpdGljYWwgPyAnI0Q5MkQyMCcgOiAnIzY2NzA4NSdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIC8vIFN1Ym1pdHRlZCBhdWRpdHMsIGFzIHRoZSB0cmVuZCBjb3VudHMgdGhlbTsgdGhlIG5vdGUgZ2l2ZXMgdGhlIHN0b3JlcyB0aGV5IGNvdmVyLlxyXG4gICAgICAgIGxhYmVsOiAnQXVkaXRzIGNvbXBsZXRlZCcsXHJcbiAgICAgICAgdmFsdWU6IFN0cmluZyh0aGlzLnJvd3MucmVkdWNlKChzdW0sIHIpID0+IHN1bSArIChOdW1iZXIoci5yYXc/LmF1ZGl0cykgfHwgMCksIDApKSxcclxuICAgICAgICBub3RlOiAnYXQgJyArIGF1ZGl0ZWQgKyAnIG9mICcgKyB0aGlzLnJvd3MubGVuZ3RoICsgJyBzdG9yZXMgaW4gc2NvcGUgwrcgJyArIHBlcmlvZExhYmVsLFxyXG4gICAgICAgIG5vdGVDb2xvcjogJyM2NjcwODUnXHJcbiAgICAgIH1cclxuICAgIF07XHJcbiAgfVxyXG5cclxuICBnZXQgcGVyaW9kTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLmdyYWluID09PSAncXVhcnRlcicgJiYgdGhpcy5xdWFydGVyKSB7IHJldHVybiB0aGlzLnF1YXJ0ZXIgKyAnICgnICsgdGhpcy5xdWFydGVyTW9udGhzKHRoaXMucXVhcnRlcikgKyAnKSc7IH1cclxuICAgIHJldHVybiB0aGlzLmZtdCh0aGlzLmZyb20pICsgJyB0byAnICsgdGhpcy5mbXQodGhpcy50byk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEaXN0cmlidXRpb24gb2Ygc3RvcmVzIGFjcm9zcyBzY29yZSBiYW5kcy4gTm90IHNjb3JlZCBpcyBsZWZ0IG91dCAoUUEgOSBPY3QpLCBhbmQgaXRzIHN0b3Jlc1xyXG4gICAqIHdpdGggaXQsIHNvIHRoZSBzaGFyZXMgc3RpbGwgYWRkIHVwIHRvIDEwMCUuXHJcbiAgICovXHJcbiAgZ2V0IGJhbmRSb3dzKCk6IEFycmF5PHsgYmFuZDogQXVkaXRCYW5kOyBjb3VudDogbnVtYmVyOyBzaGFyZTogc3RyaW5nOyB3aWR0aDogc3RyaW5nIH0+IHtcclxuICAgIGNvbnN0IHRvdGFsID0gdGhpcy5yb3dzLmZpbHRlcihyID0+IHIuc3RhdHVzICE9PSAndW5zY29yZWQnKS5sZW5ndGggfHwgMTtcclxuICAgIHJldHVybiB0aGlzLmJhbmRzLmZpbHRlcihiYW5kID0+IGJhbmQua2V5ICE9PSAndW5zY29yZWQnKS5tYXAoYmFuZCA9PiB7XHJcbiAgICAgIGNvbnN0IGNvdW50ID0gU1RBVFVTX0JBTkRTLmluY2x1ZGVzKGJhbmQua2V5KVxyXG4gICAgICAgID8gdGhpcy5yb3dzLmZpbHRlcihyID0+IHIuc3RhdHVzID09PSBiYW5kLmtleSkubGVuZ3RoXHJcbiAgICAgICAgOiB0aGlzLnJvd3MuZmlsdGVyKHIgPT4gci5zY29yZSAhPT0gbnVsbCAmJiB0aGlzLmluQmFuZChyLnNjb3JlIGFzIG51bWJlciwgYmFuZCkpLmxlbmd0aDtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBiYW5kLFxyXG4gICAgICAgIGNvdW50LFxyXG4gICAgICAgIC8vIEEgZmV3IHN0b3JlcyBvdXQgb2YgdGhvdXNhbmRzIHJvdW5kIHRvIDAlOyBzYXkgXCI8MSVcIiBpbnN0ZWFkIG9mIDAlIG5leHQgdG8gYSBub24temVybyBjb3VudC5cclxuICAgICAgICBzaGFyZTogY291bnQgJiYgY291bnQgLyB0b3RhbCAqIDEwMCA8IDEgPyAnPDElJyA6IE1hdGgucm91bmQoY291bnQgLyB0b3RhbCAqIDEwMCkgKyAnJScsXHJcbiAgICAgICAgd2lkdGg6IChjb3VudCAvIHRvdGFsICogMTAwKSArICclJ1xyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogQmFuZCBjb2xvdXJzIG9mIGEgc3RvcmUgcm93OiBieSBzY29yZSwgb3IgdGhlIE5vdCBzY29yZWQgLyBOb3QgYXVkaXRlZCBiYW5kIHdoZW4gaXQgaGFzIG5vbmUuICovXHJcbiAgYmFuZEZvcihyb3c6IEF1ZGl0Um93KTogQXVkaXRCYW5kIHtcclxuICAgIGNvbnN0IGxhc3QgPSB0aGlzLmJhbmRzW3RoaXMuYmFuZHMubGVuZ3RoIC0gMV07XHJcbiAgICBpZiAocm93LnNjb3JlID09PSBudWxsKSB7IHJldHVybiB0aGlzLmJhbmRzLmZpbmQoYiA9PiBiLmtleSA9PT0gcm93LnN0YXR1cykgPz8gbGFzdDsgfVxyXG4gICAgY29uc3Qgc2NvcmUgPSByb3cuc2NvcmU7XHJcbiAgICByZXR1cm4gdGhpcy5iYW5kcy5maW5kKGIgPT4gIVNUQVRVU19CQU5EUy5pbmNsdWRlcyhiLmtleSkgJiYgdGhpcy5pbkJhbmQoc2NvcmUsIGIpKSA/PyBsYXN0O1xyXG4gIH1cclxuXHJcbiAgLyoqIEEgc2NvcmUgYmFuZCdzIHJhbmdlOyB0aGUgbG93ZXN0IGJhbmQgKGxvIDAsIENyaXRpY2FsKSBhbHNvIHRha2VzIG5lZ2F0aXZlIHNjb3JlcyAocGVuYWx0eSBvcHRpb25zKS4gKi9cclxuICBwcml2YXRlIGluQmFuZChzY29yZTogbnVtYmVyLCBiYW5kOiBBdWRpdEJhbmQpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoYmFuZC5sbyA8PSAwIHx8IHNjb3JlID49IGJhbmQubG8pICYmIHNjb3JlIDw9IGJhbmQuaGk7XHJcbiAgfVxyXG5cclxuICBzdGF0dXNMYWJlbChyb3c6IEF1ZGl0Um93KTogc3RyaW5nIHtcclxuICAgIGlmIChyb3cuc3RhdHVzID09PSAncGFzcycpIHsgcmV0dXJuICdQYXNzJzsgfVxyXG4gICAgaWYgKHJvdy5zdGF0dXMgPT09ICdmYWlsJykgeyByZXR1cm4gJ0ZhaWwnOyB9XHJcbiAgICByZXR1cm4gcm93LnN0YXR1cyA9PT0gJ3Vuc2NvcmVkJyA/ICdOb3Qgc2NvcmVkJyA6ICdOb3QgYXVkaXRlZCc7XHJcbiAgfVxyXG5cclxuICAvKiogQmFyIGhlaWdodCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIGNoYXJ0IGFyZWEuICovXHJcbiAgYmFySGVpZ2h0KGJhcjogVHJlbmRCYXIpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIChiYXIudmFsdWUgPT09IG51bGwgPyAyIDogTWF0aC5tYXgoMywgYmFyLnZhbHVlKSkgKyAnJSc7XHJcbiAgfVxyXG5cclxuICAvKiogSG92ZXIgY2FyZCBzaXRzIGp1c3QgYWJvdmUgdGhlIGJhcidzIHZhbHVlIGxhYmVsOyBjYXBwZWQgc28gYSB0YWxsIGJhcidzIGNhcmQgc3RheXMgaW5zaWRlIHRoZSBjaGFydC4gKi9cclxuICB0aXBCb3R0b20oYmFyOiBUcmVuZEJhcik6IHN0cmluZyB7XHJcbiAgICBjb25zdCBoID0gYmFyLnZhbHVlID09PSBudWxsID8gMiA6IE1hdGgubWF4KDMsIGJhci52YWx1ZSk7XHJcbiAgICByZXR1cm4gJ2NhbGMoJyArIE1hdGgubWluKGgsIDQ1KSArICclICsgMjZweCknO1xyXG4gIH1cclxuXHJcbiAgYmFyRmlsbChiYXI6IFRyZW5kQmFyKTogc3RyaW5nIHtcclxuICAgIGlmIChiYXIudmFsdWUgPT09IG51bGwpIHsgcmV0dXJuICcjRjJGNEY3JzsgfVxyXG4gICAgY29uc3QgYWN0aXZlID0gYmFyLmtleSA9PT0gdGhpcy5xdWFydGVyO1xyXG4gICAgaWYgKGJhci52YWx1ZSA+PSB0aGlzLnBhc3NNYXJrKSB7IHJldHVybiBhY3RpdmUgPyAnIzE1NzBFRicgOiAnI0IyRERGRic7IH1cclxuICAgIHJldHVybiBhY3RpdmUgPyAnI0YwNDQzOCcgOiAnI0ZFQ0RDQSc7XHJcbiAgfVxyXG5cclxuICBzZXRHcmFpbihncmFpbjogJ3F1YXJ0ZXInIHwgJ2RhdGUnKTogdm9pZCB7XHJcbiAgICBpZiAoZ3JhaW4gPT09IHRoaXMuZ3JhaW4pIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLmdyYWluID0gZ3JhaW47XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gICAgaWYgKGdyYWluID09PSAncXVhcnRlcicpIHtcclxuICAgICAgdGhpcy5hcHBseVF1YXJ0ZXIodGhpcy5xdWFydGVycy5pbmNsdWRlcyh0aGlzLnF1YXJ0ZXIpID8gdGhpcy5xdWFydGVyIDogdGhpcy5xdWFydGVyc1t0aGlzLnF1YXJ0ZXJzLmxlbmd0aCAtIDFdLCB0cnVlKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8gQmFjayB0byBCeSBkYXRlOiB0aGUgaGVhZGVyJ3MgcmFuZ2UgYWdhaW4uXHJcbiAgICB0aGlzLmZyb20gPSB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LnN0YXJ0RGF0ZSB8fCB0aGlzLmZyb207XHJcbiAgICB0aGlzLnRvID0gdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5lbmREYXRlIHx8IHRoaXMudG87XHJcbiAgICB0aGlzLnJhbmdlID0gdG9QaWNrZXJSYW5nZSh0aGlzLmZyb20sIHRoaXMudG8pO1xyXG4gICAgaWYgKCF0aGlzLmZpbHRlcnNPcGVuKSB7IHRoaXMucmVsb2FkUGVyaW9kKCk7IH1cclxuICB9XHJcblxyXG4gIHNldFN0YXR1cyhzdGF0dXM6IFN0YXR1c0ZpbHRlcik6IHZvaWQge1xyXG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgc29ydEJ5KGtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zb3J0S2V5ID09PSBrZXkpIHtcclxuICAgICAgdGhpcy5zb3J0RGlyID0gdGhpcy5zb3J0RGlyID09PSAnYXNjJyA/ICdkZXNjJyA6ICdhc2MnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zb3J0S2V5ID0ga2V5O1xyXG4gICAgICB0aGlzLnNvcnREaXIgPSAnYXNjJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNjb3JlIGRpc3RyaWJ1dGlvbiAtPiBWaWV3IHN0b3JlczogbmFycm93IHRoZSBzdG9yZSBsaXN0IHRvIHRoYXQgYmFuZCAoTm90IGF1ZGl0ZWQgLT4gdGhlXHJcbiAgICogc3RvcmVzIHdpdGggbm8gc3VibWlzc2lvbikgYW5kIGJyaW5nIHRoZSBsaXN0IGludG8gdmlldy5cclxuICAgKi9cclxuICBhcHBseUJhbmQoYmFuZDogQXVkaXRCYW5kKTogdm9pZCB7XHJcbiAgICBpZiAoU1RBVFVTX0JBTkRTLmluY2x1ZGVzKGJhbmQua2V5KSkge1xyXG4gICAgICB0aGlzLmNsZWFyQmFuZCgpO1xyXG4gICAgICB0aGlzLnN0YXR1cyA9IGJhbmQua2V5IGFzIFN0b3JlU3RhdHVzO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zY29yZU1pbiA9IGJhbmQubG87XHJcbiAgICAgIHRoaXMuc2NvcmVNYXggPSBiYW5kLmhpO1xyXG4gICAgICB0aGlzLnN0YXR1cyA9ICdhbGwnO1xyXG4gICAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zdG9yZUxpc3RPcGVuID0gdHJ1ZTtcclxuICAgIHRoaXMubGlzdEJhbmRLZXkgPSBiYW5kLmtleTtcclxuICAgIC8vIEZyb20gdGhlIGRyYXdlciwgQXBwbHkgc2Nyb2xscyBvbmNlIGl0IGNsb3Nlcy5cclxuICAgIGlmICh0aGlzLmZpbHRlcnNPcGVuKSB7IHJldHVybjsgfVxyXG4gICAgc2V0VGltZW91dCgoKSA9PiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWQtc3RvcmUtbGlzdCcpPy5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICdzdGFydCcgfSkpO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJCYW5kKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zY29yZU1pbiA9IDA7XHJcbiAgICB0aGlzLnNjb3JlTWF4ID0gMTAwO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBTdG9yZSBsaXN0IHN0YXlzIGhpZGRlbiB1bnRpbCBTY29yZSBkaXN0cmlidXRpb24gLT4gVmlldyBzdG9yZXMgb3BlbnMgaXQgKG9yIHRoZSBGaWx0ZXJzXHJcbiAgICogZHJhd2VyIHNldHMgYSBzY29yZSByYW5nZSk7IHRoZSBjaGlwJ3MgeCBjbG9zZXMgaXQgYWdhaW4uXHJcbiAgICovXHJcbiAgc3RvcmVMaXN0T3BlbiA9IGZhbHNlO1xyXG4gIC8qKiBCYW5kIHRoZSBsaXN0IHdhcyBvcGVuZWQgZm9yICgnJyA9IGFsbCBzdG9yZXMpLiAqL1xyXG4gIGxpc3RCYW5kS2V5ID0gJyc7XHJcblxyXG4gIGdldCBzaG93U3RvcmVMaXN0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RvcmVMaXN0T3BlbiB8fCB0aGlzLmJhbmRGaWx0ZXJBY3RpdmUgfHwgdGhpcy5zdGF0dXMgIT09ICdhbGwnO1xyXG4gIH1cclxuXHJcbiAgLyoqIENoaXAgb3ZlciB0aGUgbGlzdDogdGhlIGJhbmQgb3Igc3RhdHVzIGl0IHNob3dzLCBvciBcIkFsbCBzdG9yZXNcIi4gKi9cclxuICBnZXQgbGlzdENoaXBMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLnNob3dTdG9yZUxpc3QpIHsgcmV0dXJuICcnOyB9XHJcbiAgICBpZiAodGhpcy5iYW5kRmlsdGVyQWN0aXZlKSB7IHJldHVybiB0aGlzLmJhbmRDaGlwTGFiZWw7IH1cclxuICAgIGNvbnN0IGJhbmQgPSB0aGlzLmJhbmRzLmZpbmQoYiA9PiBiLmtleSA9PT0gdGhpcy5saXN0QmFuZEtleSk7XHJcbiAgICAvLyBBIHNjb3JlIGJhbmQgdGhlIHJhbmdlIG5vIGxvbmdlciBtYXRjaGVzIGlzIHN0YWxlOyBhIHN0YXR1cyBiYW5kIHN0aWxsIGhvbGRzIHdoaWxlIHRoZSBzdGF0dXMgZG9lcy5cclxuICAgIGlmIChiYW5kICYmIGJhbmQua2V5ID09PSB0aGlzLnN0YXR1cykgeyByZXR1cm4gYmFuZC5sYWJlbCArICcgwrcgJyArIGJhbmQucmFuZ2U7IH1cclxuICAgIHJldHVybiB0aGlzLnN0YXR1cyAhPT0gJ2FsbCcgPyB0aGlzLnN0YXR1c0ZpbHRlckxhYmVsIDogJ0FsbCBzdG9yZXMnO1xyXG4gIH1cclxuXHJcbiAgLyoqIERyYXdlciBTY29yZSByYW5nZTogdGhlIGJhbmQgdGhlIGN1cnJlbnQgcmFuZ2UgKG9yIHN0YXR1cyBiYW5kKSBtYXRjaGVzLiAqL1xyXG4gIGlzQmFuZE9uKGJhbmQ6IEF1ZGl0QmFuZCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKFNUQVRVU19CQU5EUy5pbmNsdWRlcyhiYW5kLmtleSkpIHsgcmV0dXJuIHRoaXMuc3RhdHVzID09PSBiYW5kLmtleTsgfVxyXG4gICAgcmV0dXJuIHRoaXMuc2NvcmVNaW4gPT09IGJhbmQubG8gJiYgdGhpcy5zY29yZU1heCA9PT0gYmFuZC5oaTtcclxuICB9XHJcblxyXG4gIC8qKiBDaGlwIFwiU2hvdyBhbGwgc3RvcmVzXCI6IGtlZXAgdGhlIGxpc3Qgb3Blbiwgd2l0aG91dCB0aGUgYmFuZC4gKi9cclxuICBzaG93QWxsU3RvcmVzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jbGVhckJhbmQoKTtcclxuICAgIHRoaXMuc3RhdHVzID0gJ2FsbCc7XHJcbiAgICB0aGlzLmxpc3RCYW5kS2V5ID0gJyc7XHJcbiAgICB0aGlzLnN0b3JlTGlzdE9wZW4gPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqIENoaXAgeDogaGlkZSB0aGUgbGlzdCBhZ2Fpbi4gKi9cclxuICBjbG9zZVN0b3JlTGlzdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY2xlYXJCYW5kKCk7XHJcbiAgICB0aGlzLnN0YXR1cyA9ICdhbGwnO1xyXG4gICAgdGhpcy5saXN0QmFuZEtleSA9ICcnO1xyXG4gICAgdGhpcy5zdG9yZUxpc3RPcGVuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnZXQgYmFuZEZpbHRlckFjdGl2ZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnNjb3JlTWluICE9PSAwIHx8IHRoaXMuc2NvcmVNYXggIT09IDEwMDtcclxuICB9XHJcblxyXG4gIGdldCBiYW5kQ2hpcExhYmVsKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBoaXQgPSB0aGlzLmJhbmRzLmZpbmQoYiA9PiAhU1RBVFVTX0JBTkRTLmluY2x1ZGVzKGIua2V5KSAmJiBiLmxvID09PSB0aGlzLnNjb3JlTWluICYmIGIuaGkgPT09IHRoaXMuc2NvcmVNYXgpO1xyXG4gICAgcmV0dXJuIGhpdCA/IGhpdC5sYWJlbCArICcgwrcgJyArIGhpdC5yYW5nZSA6ICdTY29yZSAnICsgdGhpcy5zY29yZU1pbiArICfigJMnICsgdGhpcy5zY29yZU1heCArICclJztcclxuICB9XHJcblxyXG4gIG9uU2VhcmNoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgZml2ZSBmaWx0ZXIgY2F0ZWdvcmllcyB0aGUgZHJhd2VyIGxpc3RzLiAqL1xyXG4gIGdldCBmaWx0ZXJDYXRzKCk6IEZpbHRlckNhdFtdIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgIHsga2V5OiAncGVyaW9kJywgbGFiZWw6ICdQZXJpb2QnLCB2YWx1ZTogdGhpcy5wZXJpb2RMYWJlbCwgdGl0bGU6ICdQZXJpb2QnLFxyXG4gICAgICAgIHN1YjogJ1N0YXJ0cyBhcyB0aGUgZ2xvYmFsIGhlYWRlciBkYXRlIHJhbmdlOyBwaWNrIGEgcmFuZ2UgdG8gbmFycm93IGl0LicsXHJcbiAgICAgICAgZGlydHk6IGZhbHNlIH0sXHJcbiAgICAgIHsga2V5OiAnc2NvcGUnLCBsYWJlbDogJ1N0b3JlIGhpZXJhcmNoeScsIHZhbHVlOiB0aGlzLnNjb3BlTGFiZWwsIHRpdGxlOiAnU3RvcmUgaGllcmFyY2h5JyxcclxuICAgICAgICBzdWI6ICdQaWNrIHRoZSBjaXJjbGUsIHpvbmUsIEFPTSBvciBzdG9yZSB0aGUgd2hvbGUgZGFzaGJvYXJkIHJlYWRzLicsXHJcbiAgICAgICAgZGlydHk6ICEhdGhpcy5jaXJjbGUgfSxcclxuICAgICAgeyBrZXk6ICd0eXBlJywgbGFiZWw6ICdBdWRpdCB0eXBlJywgdmFsdWU6IHRoaXMuYXVkaXRUeXBlTGFiZWwsIHRpdGxlOiAnQXVkaXQgdHlwZScsXHJcbiAgICAgICAgc3ViOiAnV2hpY2ggYXVkaXQgcHJvZ3JhbW1lIHRoZSBzY29yZXMgY29tZSBmcm9tLicsXHJcbiAgICAgICAgZGlydHk6IHRoaXMuYXVkaXRUeXBlICE9PSAnYWxsJyB9LFxyXG4gICAgICB7IGtleTogJ2JhbmQnLCBsYWJlbDogJ1Njb3JlIHJhbmdlJywgdmFsdWU6IHRoaXMuYmFuZENoaXBMYWJlbCwgdGl0bGU6ICdTY29yZSByYW5nZScsXHJcbiAgICAgICAgc3ViOiAnVGFwIGEgYmFuZCB0byBzZXQgdGhlIHJhbmdlIHRoZSBzdW1tYXJ5IHJlYWRzLicsXHJcbiAgICAgICAgZGlydHk6IHRoaXMuYmFuZEZpbHRlckFjdGl2ZSB9LFxyXG4gICAgICB7IGtleTogJ3N0YXR1cycsIGxhYmVsOiAnU3RhdHVzJywgdmFsdWU6IHRoaXMuc3RhdHVzRmlsdGVyTGFiZWwsIHRpdGxlOiAnU3RhdHVzJyxcclxuICAgICAgICBzdWI6ICdTaG93IGV2ZXJ5IHN0b3JlLCBvciBvbmx5IHRoZSBvbmVzIHRoYXQgcGFzc2VkIG9yIGZhaWxlZC4nLFxyXG4gICAgICAgIGRpcnR5OiB0aGlzLnN0YXR1cyAhPT0gJ2FsbCcgfVxyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIGdldCBhY3RpdmVDYXRPYmooKTogRmlsdGVyQ2F0IHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlckNhdHMuZmluZChjID0+IGMua2V5ID09PSB0aGlzLmFjdGl2ZUNhdCkgfHwgdGhpcy5maWx0ZXJDYXRzWzBdO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZpbHRlckNvdW50KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJDYXRzLmZpbHRlcihjID0+IGMuZGlydHkpLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIC8qKiBTdG9yZXMgdGhlIGRyYXdlcidzIGhpZXJhcmNoeSBwaWNrIGNvdmVycyAod2hhdCBBcHBseSB3aWxsIGxvYWQpLiAqL1xyXG4gIGdldCBzdG9yZXNJblNjb3BlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5zY29wZVJvd3MuZmlsdGVyKHIgPT4gdGhpcy5tYXRjaGVzU2NvcGUociwgdGhpcykpLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIC8qKiBTb3J0ZWQgZGlzdGluY3QgbmFtZXMsIHdpdGhvdXQgdGhlIFwi4oCUXCIgb2Ygc3RvcmVzIG91dHNpZGUgdGhlIGhpZXJhcmNoeS4gKi9cclxuICBwcml2YXRlIGRpc3RpbmN0KHZhbHVlczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KHZhbHVlcy5maWx0ZXIodiA9PiB2ICYmIHYgIT09ICfigJQnKSkpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSk7XHJcbiAgfVxyXG5cclxuICBnZXQgY2lyY2xlcygpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5kaXN0aW5jdCh0aGlzLnNjb3BlUm93cy5tYXAociA9PiByLmNpcmNsZSkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHpvbmVzKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiB0aGlzLmRpc3RpbmN0KHRoaXMuc2NvcGVSb3dzLmZpbHRlcihyID0+IHIuY2lyY2xlID09PSB0aGlzLmNpcmNsZSkubWFwKHIgPT4gci56b25lKSk7XHJcbiAgfVxyXG5cclxuICBnZXQgYW9tcygpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5kaXN0aW5jdCh0aGlzLnNjb3BlUm93cy5maWx0ZXIociA9PiByLmNpcmNsZSA9PT0gdGhpcy5jaXJjbGUgJiYgci56b25lID09PSB0aGlzLnpvbmUpLm1hcChyID0+IHIuYW9tKSk7XHJcbiAgfVxyXG5cclxuICBnZXQgc2NvcGVSZWFkaW5nKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBuID0gdGhpcy5zdG9yZXNJblNjb3BlO1xyXG4gICAgcmV0dXJuIHRoaXMuc2NvcGVMYWJlbCArICcgwrcgJyArIG4gKyAobiA9PT0gMSA/ICcgc3RvcmUnIDogJyBzdG9yZXMnKTtcclxuICB9XHJcblxyXG4gIHNldE1vZHVsZVRhYih0YWI6ICdBdWRpdCcgfCAnVGFzaycpOiB2b2lkIHtcclxuICAgIGlmICh0YWIgIT09IHRoaXMubW9kdWxlVGFiKSB7XHJcbiAgICAgIC8vIFRoZSBmaXJzdCBQZXJmb3JtYW5jZSB0YWJsZSBjaGFuZ2VzIChBdWRpdCAvIFRhc2spLCBzbyBpdHMgc29ydCBzdGFydHMgb3Zlci5cclxuICAgICAgdGhpcy5wZXJmU29ydEtleSA9ICcnO1xyXG4gICAgICB0aGlzLnBlcmZTb3J0RGlyID0gJ2FzYyc7XHJcbiAgICB9XHJcbiAgICB0aGlzLm1vZHVsZVRhYiA9IHRhYjtcclxuICAgIGlmICh0YWIgPT09ICdUYXNrJyAmJiB0aGlzLnRhc2tzU3RhbGUpIHsgdGhpcy5sb2FkVGFza3MoKTsgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHNjb3BlTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHN0b3JlID0gdGhpcy5zdG9yZSA/IHRoaXMuc2NvcGVSb3dzLmZpbmQociA9PiBTdHJpbmcoci5yYXc/LnN0b3JlSWQpID09PSB0aGlzLnN0b3JlKSA6IHVuZGVmaW5lZDtcclxuICAgIHJldHVybiAoc3RvcmUgPyBzdG9yZS5yYXc/LnN0b3JlTmFtZSB8fCB0aGlzLnN0b3JlIDogdGhpcy5zdG9yZSkgfHwgdGhpcy5hb20gfHwgdGhpcy56b25lIHx8IHRoaXMuY2lyY2xlIHx8ICdBbGwgc3RvcmVzJztcclxuICB9XHJcblxyXG4gIGdldCBhdWRpdFR5cGVMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgdCA9IHRoaXMuYXVkaXRUeXBlcy5maW5kKHggPT4geC5rZXkgPT09IHRoaXMuYXVkaXRUeXBlKTtcclxuICAgIHJldHVybiB0ID8gdC5sYWJlbCA6ICdBbGwgQXVkaXRzJztcclxuICB9XHJcblxyXG4gIGdldCBzdGF0dXNGaWx0ZXJMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuc3RhdHVzID09PSAnYWxsJykgeyByZXR1cm4gJ0FsbCBzdG9yZXMnOyB9XHJcbiAgICBpZiAodGhpcy5zdGF0dXMgPT09ICdwYXNzJykgeyByZXR1cm4gJ1Bhc3Mgc3RvcmVzJzsgfVxyXG4gICAgaWYgKHRoaXMuc3RhdHVzID09PSAndW5zY29yZWQnKSB7IHJldHVybiAnTm90IHNjb3JlZCc7IH1cclxuICAgIHJldHVybiB0aGlzLnN0YXR1cyA9PT0gJ2ZhaWwnID8gJ0ZhaWwgc3RvcmVzJyA6ICdOb3QgYXVkaXRlZCc7XHJcbiAgfVxyXG5cclxuICBvcGVuRmlsdGVycyhjYXQ/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuZHJhZnQgPSBPYmplY3QuY3JlYXRlKHRoaXMpIGFzIEF1ZGl0VjJEYXNoYm9hcmRDb21wb25lbnQ7XHJcbiAgICB0aGlzLmFjdGl2ZUNhdCA9IGNhdCB8fCB0aGlzLmFjdGl2ZUNhdDtcclxuICAgIHRoaXMuZmlsdGVyc09wZW4gPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0Q2F0KGtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmFjdGl2ZUNhdCA9IGtleTtcclxuICB9XHJcblxyXG4gIGFwcGx5RmlsdGVycygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGQgPSB0aGlzLmRyYWZ0O1xyXG4gICAgY29uc3QgcGVyaW9kQ2hhbmdlZCA9ICEhZCAmJiAoZC5mcm9tICE9PSB0aGlzLmZyb20gfHwgZC50byAhPT0gdGhpcy50byk7XHJcbiAgICBpZiAoZCkge1xyXG4gICAgICBjb25zdCBzZWxmID0gdGhpcyBhcyBhbnk7XHJcbiAgICAgIEF1ZGl0VjJEYXNoYm9hcmRDb21wb25lbnQuRFJBRlRfS0VZUy5mb3JFYWNoKGsgPT4geyBzZWxmW2tdID0gKGQgYXMgYW55KVtrXTsgfSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBzY29wZUNoYW5nZWQgPSB0aGlzLmNvbW1pdFNjb3BlKCk7XHJcbiAgICB0aGlzLmRyYWZ0ID0gbnVsbDtcclxuICAgIHRoaXMuZmlsdGVyc09wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgICBpZiAocGVyaW9kQ2hhbmdlZCB8fCBzY29wZUNoYW5nZWQpIHsgdGhpcy5yZWxvYWRQZXJpb2QoKTsgfVxyXG4gICAgLy8gU2NvcmUgcmFuZ2UgYW5kIFN0YXR1cyBvbmx5IGZpbHRlciB0aGUgc3RvcmUgbGlzdCwgc28gc2hvdyBpdC5cclxuICAgIGlmICh0aGlzLmJhbmRGaWx0ZXJBY3RpdmUgfHwgdGhpcy5zdGF0dXMgIT09ICdhbGwnKSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkLXN0b3JlLWxpc3QnKT8uc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnc3RhcnQnIH0pKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBNYWtlIHRoZSBkcmF3ZXIncyBoaWVyYXJjaHkgKyBhdWRpdCB0eXBlIHRoZSBsb2FkZWQgb25lczsgdHJ1ZSB3aGVuIHRoZXkgZGlmZmVyIGZyb20gYmVmb3JlLiAqL1xyXG4gIHByaXZhdGUgY29tbWl0U2NvcGUoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBhID0gdGhpcy5hcHBsaWVkO1xyXG4gICAgY29uc3QgY2hhbmdlZCA9IGEuY2lyY2xlICE9PSB0aGlzLmNpcmNsZSB8fCBhLnpvbmUgIT09IHRoaXMuem9uZSB8fCBhLmFvbSAhPT0gdGhpcy5hb20gfHwgYS5zdG9yZSAhPT0gdGhpcy5zdG9yZVxyXG4gICAgICB8fCBhLmF1ZGl0VHlwZSAhPT0gdGhpcy5hdWRpdFR5cGU7XHJcbiAgICB0aGlzLmFwcGxpZWQgPSB7IGNpcmNsZTogdGhpcy5jaXJjbGUsIHpvbmU6IHRoaXMuem9uZSwgYW9tOiB0aGlzLmFvbSwgc3RvcmU6IHRoaXMuc3RvcmUsIGF1ZGl0VHlwZTogdGhpcy5hdWRpdFR5cGUgfTtcclxuICAgIHJldHVybiBjaGFuZ2VkO1xyXG4gIH1cclxuXHJcbiAgLyoqIENhbmNlbCAvIHggLyBiYWNrZHJvcDogdGhlIGRyYWZ0IGlzIGRyb3BwZWQ7IHRoZSBwYWdlIG5ldmVyIGNoYW5nZWQuICovXHJcbiAgY2FuY2VsRmlsdGVycygpOiB2b2lkIHtcclxuICAgIHRoaXMuZHJhZnQgPSBudWxsO1xyXG4gICAgdGhpcy5maWx0ZXJzT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJlc2V0IGV2ZXJ5IGZpbHRlciB0byB0aGUgZG9jdW1lbnRlZCBkZWZhdWx0cy4gKi9cclxuICBjbGVhckFsbCgpOiB2b2lkIHtcclxuICAgIHRoaXMuYXVkaXRUeXBlID0gJ2FsbCc7XHJcbiAgICB0aGlzLmdyYWluID0gJ2RhdGUnO1xyXG4gICAgdGhpcy5jaXJjbGUgPSAnJztcclxuICAgIHRoaXMuem9uZSA9ICcnO1xyXG4gICAgdGhpcy5hb20gPSAnJztcclxuICAgIHRoaXMuc3RvcmUgPSAnJztcclxuICAgIHRoaXMuc2NvcmVNaW4gPSAwO1xyXG4gICAgdGhpcy5zY29yZU1heCA9IDEwMDtcclxuICAgIHRoaXMuc3RhdHVzID0gJ2FsbCc7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gICAgLy8gVGhlIGNoaXBzJyBDbGVhciBhbGwgKGRyYXdlciBjbG9zZWQpIHJlbG9hZHMgbm93OyBpbnNpZGUgdGhlIGRyYXdlciwgQXBwbHkgZG9lcy5cclxuICAgIGlmICghdGhpcy5maWx0ZXJzT3BlbiAmJiB0aGlzLmNvbW1pdFNjb3BlKCkpIHsgdGhpcy5yZWxvYWRQZXJpb2QoKTsgfVxyXG4gIH1cclxuXHJcbiAgLyoqIENoYW5naW5nIGEgbGV2ZWwgY2xlYXJzIHRoZSBsZXZlbHMgYmVsb3cgaXQuICovXHJcbiAgb25DaXJjbGVDaGFuZ2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLnpvbmUgPSAnJztcclxuICAgIHRoaXMuYW9tID0gJyc7XHJcbiAgICB0aGlzLnN0b3JlID0gJyc7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgb25ab25lQ2hhbmdlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5hb20gPSAnJztcclxuICAgIHRoaXMuc3RvcmUgPSAnJztcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgfVxyXG5cclxuICBvbkFvbUNoYW5nZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RvcmUgPSAnJztcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgfVxyXG5cclxuICByZXNldFNjb3BlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jaXJjbGUgPSAnJztcclxuICAgIHRoaXMuem9uZSA9ICcnO1xyXG4gICAgdGhpcy5hb20gPSAnJztcclxuICAgIHRoaXMuc3RvcmUgPSAnJztcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgfVxyXG5cclxuICAvKiogU3RvcmUgZHJvcGRvd246IHRoZSBzdG9yZXMgb2YgdGhlIHBpY2tlZCBBT00sIGJ5IG5hbWUgKHZhbHVlID0gc3RvcmVJZCkuICovXHJcbiAgZ2V0IHN0b3JlUGlja09wdGlvbnMoKTogQXJyYXk8eyB2YWx1ZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH0+IHtcclxuICAgIGNvbnN0IHN0b3JlcyA9IHRoaXMuc2NvcGVSb3dzXHJcbiAgICAgIC5maWx0ZXIociA9PiB0aGlzLm1hdGNoZXNTY29wZShyLCB7IGNpcmNsZTogdGhpcy5jaXJjbGUsIHpvbmU6IHRoaXMuem9uZSwgYW9tOiB0aGlzLmFvbSwgc3RvcmU6ICcnIH0pKVxyXG4gICAgICAubWFwKHIgPT4gKHsgdmFsdWU6IFN0cmluZyhyLnJhdz8uc3RvcmVJZCB8fCAnJyksIGxhYmVsOiBTdHJpbmcoci5yYXc/LnN0b3JlTmFtZSB8fCAn4oCUJykgfSkpXHJcbiAgICAgIC5maWx0ZXIobyA9PiBvLnZhbHVlKVxyXG4gICAgICAuc29ydCgoYSwgYikgPT4gYS5sYWJlbC5sb2NhbGVDb21wYXJlKGIubGFiZWwpKTtcclxuICAgIHJldHVybiBbeyB2YWx1ZTogJycsIGxhYmVsOiAnQWxsIHN0b3JlcycgfV0uY29uY2F0KHN0b3Jlcyk7XHJcbiAgfVxyXG5cclxuICAvKiogT3B0aW9ucyBmb3IgdGhlIGRyYXdlcidzIGN1c3RvbSBkcm9wZG93bnMgKGxpYi1hdWRpdC12Mi1zZWxlY3QpOiBcIkFsbCDigKZcIiBmaXJzdCwgdGhlbiB0aGUgbGlzdC4gKi9cclxuICBwaWNrT3B0aW9ucyhsaXN0OiBzdHJpbmdbXSwgYWxsOiBzdHJpbmcpOiBBcnJheTx7IHZhbHVlOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfT4ge1xyXG4gICAgcmV0dXJuIFt7IHZhbHVlOiAnJywgbGFiZWw6IGFsbCB9XS5jb25jYXQoKGxpc3QgfHwgW10pLm1hcCh2ID0+ICh7IHZhbHVlOiB2LCBsYWJlbDogdiB9KSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBmaXJzdCBwZXJmb3JtYW5jZSB0YWIgaXMgbmFtZWQgYWZ0ZXIgdGhlIGFjdGl2ZSBtb2R1bGUuICovXHJcbiAgZ2V0IHBlcmZUYWJzRm9yTW9kdWxlKCk6IEFycmF5PCdBdWRpdCcgfCAnU3RvcmUnIHwgJ1VzZXInPiB7XHJcbiAgICByZXR1cm4gdGhpcy5wZXJmVGFicztcclxuICB9XHJcblxyXG4gIHBlcmZUYWJEaXNwbGF5KHRhYjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAodGFiID09PSAnQXVkaXQnID8gdGhpcy5tb2R1bGVUYWIgOiB0YWIpICsgJyBQZXJmb3JtYW5jZSc7XHJcbiAgfVxyXG5cclxuICBnZXQgcGVyZkluZm9UaXRsZSgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMucGVyZlRhYiA9PT0gJ1N0b3JlJykgeyByZXR1cm4gJ1N0b3JlcyBJbmZvJzsgfVxyXG4gICAgaWYgKHRoaXMucGVyZlRhYiA9PT0gJ1VzZXInKSB7IHJldHVybiAnVXNlciBJbmZvJzsgfVxyXG4gICAgcmV0dXJuIHRoaXMubW9kdWxlVGFiICsgJyBJbmZvJztcclxuICB9XHJcblxyXG4gIGdldCBwZXJmQ3JlYXRlTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAnKyBDcmVhdGUgJyArIHRoaXMubW9kdWxlVGFiO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzVGFza01vZHVsZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLm1vZHVsZVRhYiA9PT0gJ1Rhc2snO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZpbHRlcmVkVGFza1BlcmYoKTogVGFza1BlcmZSb3dbXSB7XHJcbiAgICBjb25zdCBxID0gdGhpcy5wZXJmU2VhcmNoLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuc29ydFBlcmZSb3dzKHEgPyB0aGlzLnRhc2tQZXJmLmZpbHRlcihyID0+IHIubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKSA6IHRoaXMudGFza1BlcmYsIHRoaXMudGFza1NvcnRWYWx1ZSk7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5UGVyZlRhc2soXzogbnVtYmVyLCByb3c6IFRhc2tQZXJmUm93KTogc3RyaW5nIHtcclxuICAgIHJldHVybiByb3cucmF3Py50YXNrSWQgfHwgcm93Lm5hbWU7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIHNlbGVjdGVkIHRyZW5kIGJ1Y2tldCBkcml2ZXMgdGhlIGhlYWRsaW5lIHNjb3JlIGFib3ZlIHRoZSBjaGFydC4gKi9cclxuICBwcml2YXRlIGdldCBmb2N1c0JhcigpOiBUcmVuZEJhciB8IHVuZGVmaW5lZCB7XHJcbiAgICBpZiAodGhpcy5ncmFpbiA9PT0gJ3F1YXJ0ZXInKSB7IHJldHVybiB0aGlzLnF1YXJ0ZXJUcmVuZC5maW5kKGIgPT4gYi5rZXkgPT09IHRoaXMucXVhcnRlcik7IH1cclxuICAgIHJldHVybiB0aGlzLnRyZW5kLmZpbmQoYiA9PiBiLmtleSA9PT0gdGhpcy5xdWFydGVyKSB8fCB0aGlzLnRyZW5kWzBdO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZvY3VzU2NvcmUoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGIgPSB0aGlzLmZvY3VzQmFyO1xyXG4gICAgaWYgKGIgJiYgYi52YWx1ZSAhPT0gbnVsbCkgeyByZXR1cm4gYi52YWx1ZSArICclJzsgfVxyXG4gICAgLy8gV2l0aCBubyB0cmVuZCBidWNrZXRzLCB0aGUgaGVhZGxpbmUgaXMgdGhlIHBlcmlvZCBhdmVyYWdlLlxyXG4gICAgY29uc3QgYXZnID0gdGhpcy5hdmVyYWdlU2NvcmU7XHJcbiAgICByZXR1cm4gYXZnID09PSBudWxsID8gJ+KAlCcgOiBhdmcgKyAnJSc7XHJcbiAgfVxyXG5cclxuICBnZXQgZm9jdXNQYXNzZWQoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBiID0gdGhpcy5mb2N1c0JhcjtcclxuICAgIGlmIChiICYmIGIudmFsdWUgIT09IG51bGwpIHsgcmV0dXJuIGIudmFsdWUgPj0gdGhpcy5wYXNzTWFyazsgfVxyXG4gICAgY29uc3QgYXZnID0gdGhpcy5hdmVyYWdlU2NvcmU7XHJcbiAgICByZXR1cm4gYXZnICE9PSBudWxsICYmIGF2ZyA+PSB0aGlzLnBhc3NNYXJrO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZvY3VzU3RhdHVzKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBiID0gdGhpcy5mb2N1c0JhcjtcclxuICAgIGNvbnN0IGhhcyA9IChiICYmIGIudmFsdWUgIT09IG51bGwpIHx8IHRoaXMuYXZlcmFnZVNjb3JlICE9PSBudWxsO1xyXG4gICAgaWYgKCFoYXMpIHsgcmV0dXJuICdObyBkYXRhJzsgfVxyXG4gICAgcmV0dXJuIHRoaXMuZm9jdXNQYXNzZWQgPyAnUGFzcycgOiAnQmVsb3cgcGFzcyBtYXJrJztcclxuICB9XHJcblxyXG4gIGdldCBmb2N1c0xpbmUoKTogc3RyaW5nIHtcclxuICAgIC8vIFN1Ym1pdHRlZCBhdWRpdHMsIGFzIHRoZSBiYXJzIGNvdW50IHRoZW0gKFwiMTAgYXVkaXRzXCIpOyBhdWRpdGVkQ291bnQgY291bnRzIGF1ZGl0ZWQgc3RvcmVzLlxyXG4gICAgY29uc3QgbiA9IHRoaXMuZ3JhaW4gPT09ICdxdWFydGVyJ1xyXG4gICAgICA/ICh0aGlzLmZvY3VzQmFyPy5zdWJtaXR0ZWQgPz8gMClcclxuICAgICAgOiB0aGlzLnRyZW5kLnJlZHVjZSgoc3VtLCBiKSA9PiBzdW0gKyAoYi5zdWJtaXR0ZWQgfHwgMCksIDApO1xyXG4gICAgcmV0dXJuIHRoaXMucGVyaW9kTGFiZWwgKyAnIMK3ICcgKyBuICsgKG4gPT09IDEgPyAnIGF1ZGl0IGNvbXBsZXRlZCcgOiAnIGF1ZGl0cyBjb21wbGV0ZWQnKVxyXG4gICAgICArICcgwrcgcGFzcyBtYXJrICcgKyB0aGlzLnBhc3NNYXJrICsgJyUnO1xyXG4gIH1cclxuXHJcbiAgc2V0UGVyZlRhYih0YWI6ICdBdWRpdCcgfCAnU3RvcmUnIHwgJ1VzZXInKTogdm9pZCB7XHJcbiAgICB0aGlzLnBlcmZUYWIgPSB0YWI7XHJcbiAgICB0aGlzLnBlcmZTZWFyY2ggPSAnJztcclxuICAgIHRoaXMucGVyZlNvcnRLZXkgPSAnJztcclxuICAgIHRoaXMucGVyZlNvcnREaXIgPSAnYXNjJztcclxuICAgIHRoaXMucGVyZlBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJvd3MgaW4gdGhlIG9wZW4gcGVyZm9ybWFuY2UgdGFibGUgYWZ0ZXIgc2VhcmNoIC8gc29ydCAod2hhdCB0aGUgcGFnZXIgY291bnRzKS4gKi9cclxuICBnZXQgcGVyZlRvdGFsKCk6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy5wZXJmVGFiID09PSAnQXVkaXQnKSB7IHJldHVybiB0aGlzLmlzVGFza01vZHVsZSA/IHRoaXMuZmlsdGVyZWRUYXNrUGVyZi5sZW5ndGggOiB0aGlzLmZpbHRlcmVkQXVkaXRQZXJmLmxlbmd0aDsgfVxyXG4gICAgcmV0dXJuIHRoaXMucGVyZlRhYiA9PT0gJ1N0b3JlJyA/IHRoaXMuZmlsdGVyZWRTdG9yZVBlcmYubGVuZ3RoIDogdGhpcy5maWx0ZXJlZFVzZXJQZXJmLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgY3VycmVudCBwYWdlIG9mIGEgcGVyZm9ybWFuY2UgdGFibGU7IGEgc2VhcmNoIHRoYXQgc2hyaW5rcyB0aGUgbGlzdCBwdWxscyB0aGUgcGFnZSBiYWNrIGludG8gcmFuZ2UuICovXHJcbiAgcGVyZlBhZ2VPZjxUPihsaXN0OiBUW10pOiBUW10ge1xyXG4gICAgY29uc3QgcGFnZXMgPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwobGlzdC5sZW5ndGggLyB0aGlzLnBlcmZQYWdlU2l6ZSkpO1xyXG4gICAgY29uc3QgcGFnZSA9IE1hdGgubWluKHRoaXMucGVyZlBhZ2UsIHBhZ2VzKTtcclxuICAgIHJldHVybiBsaXN0LnNsaWNlKChwYWdlIC0gMSkgKiB0aGlzLnBlcmZQYWdlU2l6ZSwgcGFnZSAqIHRoaXMucGVyZlBhZ2VTaXplKTtcclxuICB9XHJcblxyXG4gIG9uUGVyZlBhZ2UocGFnZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnBlcmZQYWdlID0gTnVtYmVyKHBhZ2UpIHx8IDE7XHJcbiAgfVxyXG5cclxuICBvblBlcmZQYWdlU2l6ZShzaXplOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMucGVyZlBhZ2VTaXplID0gTnVtYmVyKHNpemUpIHx8IDEwO1xyXG4gICAgdGhpcy5wZXJmUGFnZSA9IDE7XHJcbiAgfVxyXG5cclxuICAvKiogQSBuZXcgc2VhcmNoIHN0YXJ0cyBvbiBwYWdlIDEuICovXHJcbiAgb25QZXJmU2VhcmNoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5wZXJmUGFnZSA9IDE7XHJcbiAgfVxyXG5cclxuICAvKiogUGVyZm9ybWFuY2UgaGVhZGVyIGNsaWNrOiBzb3J0IGJ5IHRoYXQgY29sdW1uLCBhZ2FpbiB0byByZXZlcnNlIChzYW1lIHRvZ2dsZSBhcyB0aGUgc3RvcmUgbGlzdCkuICovXHJcbiAgc29ydFBlcmYoa2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnBlcmZTb3J0S2V5ID09PSBrZXkpIHtcclxuICAgICAgdGhpcy5wZXJmU29ydERpciA9IHRoaXMucGVyZlNvcnREaXIgPT09ICdhc2MnID8gJ2Rlc2MnIDogJ2FzYyc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnBlcmZTb3J0S2V5ID0ga2V5O1xyXG4gICAgICB0aGlzLnBlcmZTb3J0RGlyID0gJ2FzYyc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSb3dzIGluIHRoZSBwaWNrZWQgY29sdW1uIG9yZGVyICh0aGUgQVBJJ3Mgb3JkZXIgd2hlbiBub25lIGlzIHBpY2tlZCkuIE51bWJlcnMgY29tcGFyZSBhcyBudW1iZXJzLCB0ZXh0XHJcbiAgICogY2FzZS1pbnNlbnNpdGl2ZWx5OyBlbXB0eSB2YWx1ZXMgKCfigJQnKSBzdGF5IGF0IHRoZSBib3R0b20gaW4gYm90aCBkaXJlY3Rpb25zLCBhcyBpbiB0aGUgc3RvcmUgbGlzdC5cclxuICAgKi9cclxuICBwcml2YXRlIHNvcnRQZXJmUm93czxUPihyb3dzOiBUW10sIHZhbHVlczogUmVjb3JkPHN0cmluZywgKHI6IFQpID0+IFNvcnRWYWx1ZT4pOiBUW10ge1xyXG4gICAgY29uc3QgZ2V0ID0gdmFsdWVzW3RoaXMucGVyZlNvcnRLZXldO1xyXG4gICAgaWYgKCFnZXQpIHsgcmV0dXJuIHJvd3M7IH1cclxuICAgIGNvbnN0IGRpciA9IHRoaXMucGVyZlNvcnREaXIgPT09ICdhc2MnID8gMSA6IC0xO1xyXG4gICAgY29uc3QgZW1wdHkgPSAodjogU29ydFZhbHVlKSA9PiB2ID09PSBudWxsIHx8IHYgPT09IHVuZGVmaW5lZCB8fCB2ID09PSAnJyB8fCB2ID09PSAn4oCUJztcclxuICAgIHJldHVybiBbLi4ucm93c10uc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICBjb25zdCBhdiA9IGdldChhKTtcclxuICAgICAgY29uc3QgYnYgPSBnZXQoYik7XHJcbiAgICAgIGlmIChlbXB0eShhdikgfHwgZW1wdHkoYnYpKSB7IHJldHVybiBlbXB0eShhdikgPT09IGVtcHR5KGJ2KSA/IDAgOiAoZW1wdHkoYXYpID8gMSA6IC0xKTsgfVxyXG4gICAgICBpZiAodHlwZW9mIGF2ID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgYnYgPT09ICdudW1iZXInKSB7IHJldHVybiAoYXYgLSBidikgKiBkaXI7IH1cclxuICAgICAgcmV0dXJuIFN0cmluZyhhdikubG9jYWxlQ29tcGFyZShTdHJpbmcoYnYpLCB1bmRlZmluZWQsIHsgbnVtZXJpYzogdHJ1ZSwgc2Vuc2l0aXZpdHk6ICdiYXNlJyB9KSAqIGRpcjtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIFN1Ym1pdHRlZCBjb3VudCAtPiB0aGUgR2FsbGVyeSBvbiB0aGlzIGF1ZGl0J3Mgc3VibWlzc2lvbnMgaW4gdGhlIGRhc2hib2FyZCBwZXJpb2QuICovXHJcbiAgc3VibWl0dGVkUGFyYW1zKHJvdzogQXVkaXRQZXJmUm93KTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBhdWRpdDogU3RyaW5nKHJvdy5yYXc/LnNvdXJjZUNoZWNrTGlzdF9pZCB8fCByb3cucmF3Py5faWQgfHwgJycpLFxyXG4gICAgICBmcm9tOiB0aGlzLmZyb20gfHwgdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5zdGFydERhdGUgfHwgJycsXHJcbiAgICAgIHRvOiB0aGlzLnRvIHx8IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uZW5kRGF0ZSB8fCAnJ1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKiBUYXNrIFN1Ym1pdHRlZCBjb3VudCAtPiB0aGUgR2FsbGVyeSB3aXRoIFR5cGUgVGFzayBvbiB0aGlzIHRhc2sncyBzdWJtaXNzaW9ucyBpbiB0aGUgZGFzaGJvYXJkIHBlcmlvZC4gKi9cclxuICB0YXNrU3VibWl0dGVkUGFyYW1zKHJvdzogVGFza1BlcmZSb3cpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGF1ZGl0OiBTdHJpbmcocm93LnJhdz8udGFza0lkIHx8ICcnKSxcclxuICAgICAgdHlwZTogJ3Rhc2snLFxyXG4gICAgICBmcm9tOiB0aGlzLmZyb20gfHwgdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5zdGFydERhdGUgfHwgJycsXHJcbiAgICAgIHRvOiB0aGlzLnRvIHx8IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uZW5kRGF0ZSB8fCAnJ1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEF1ZGl0IC8gc3RvcmUgLyB1c2VyIGRldGFpbCBsaW5rOiB0aGUgc3ViamVjdCBwbHVzIHRoZSBkYXNoYm9hcmQgcGVyaW9kIChmcm9tIC8gdG8pLCBzbyB0aGUgZGV0YWlsXHJcbiAgICogcGFnZSBzaG93cyB0aGUgc2FtZSBkYXlzIGFzIHRoZSByb3cgY2xpY2tlZCwgbm90IHRoZSBoZWFkZXIgcmFuZ2UgKHRoZSBkYXNoYm9hcmQga2VlcHMgaXRzIG93biBwZXJpb2QpLlxyXG4gICAqL1xyXG4gIGRldGFpbFBhcmFtcyhzdWJqZWN0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUmVjb3JkPHN0cmluZywgYW55PiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAuLi5zdWJqZWN0LFxyXG4gICAgICBmcm9tOiB0aGlzLmZyb20gfHwgdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5zdGFydERhdGUgfHwgJycsXHJcbiAgICAgIHRvOiB0aGlzLnRvIHx8IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uZW5kRGF0ZSB8fCAnJ1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHBlcmZUYWJMYWJlbCh0YWI6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGFiICsgJyBQZXJmb3JtYW5jZSc7XHJcbiAgfVxyXG5cclxuICBnZXQgcGVyZlNlYXJjaFBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5wZXJmVGFiID09PSAnU3RvcmUnKSB7IHJldHVybiAnU2VhcmNoIGJ5IFN0b3JlIE5hbWUnOyB9XHJcbiAgICBpZiAodGhpcy5wZXJmVGFiID09PSAnVXNlcicpIHsgcmV0dXJuICdTZWFyY2ggYnkgVXNlciBOYW1lJzsgfVxyXG4gICAgcmV0dXJuICdTZWFyY2ggYnkgJyArIHRoaXMubW9kdWxlVGFiO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZpbHRlcmVkQXVkaXRQZXJmKCk6IEF1ZGl0UGVyZlJvd1tdIHtcclxuICAgIGNvbnN0IHEgPSB0aGlzLnBlcmZTZWFyY2gudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICByZXR1cm4gdGhpcy5zb3J0UGVyZlJvd3MocSA/IHRoaXMuYXVkaXRQZXJmLmZpbHRlcihyID0+IHIubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKSA6IHRoaXMuYXVkaXRQZXJmLCB0aGlzLmF1ZGl0U29ydFZhbHVlKTtcclxuICB9XHJcblxyXG4gIGdldCBmaWx0ZXJlZFN0b3JlUGVyZigpOiBTdG9yZVBlcmZSb3dbXSB7XHJcbiAgICBjb25zdCBxID0gdGhpcy5wZXJmU2VhcmNoLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuc29ydFBlcmZSb3dzKHEgPyB0aGlzLnN0b3JlUGVyZi5maWx0ZXIociA9PiAoci5zdG9yZSArICcgJyArIHIuc3RvcmVJZCArICcgJyArIHIuc3BvYykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSkgOiB0aGlzLnN0b3JlUGVyZiwgdGhpcy5zdG9yZVNvcnRWYWx1ZSk7XHJcbiAgfVxyXG5cclxuICBnZXQgZmlsdGVyZWRVc2VyUGVyZigpOiBVc2VyUGVyZlJvd1tdIHtcclxuICAgIGNvbnN0IHEgPSB0aGlzLnBlcmZTZWFyY2gudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICByZXR1cm4gdGhpcy5zb3J0UGVyZlJvd3MocSA/IHRoaXMudXNlclBlcmYuZmlsdGVyKHIgPT4gKHIubmFtZSArICcgJyArIHIuZW1haWwpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkpIDogdGhpcy51c2VyUGVyZiwgdGhpcy51c2VyU29ydFZhbHVlKTtcclxuICB9XHJcblxyXG4gIHRyYWNrQnlQZXJmQXVkaXQoXzogbnVtYmVyLCByb3c6IEF1ZGl0UGVyZlJvdyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcm93LnJhdz8uc291cmNlQ2hlY2tMaXN0X2lkIHx8IHJvdy5uYW1lO1xyXG4gIH1cclxuXHJcbiAgdHJhY2tCeVBlcmZTdG9yZShfOiBudW1iZXIsIHJvdzogU3RvcmVQZXJmUm93KTogc3RyaW5nIHtcclxuICAgIHJldHVybiByb3cuc3RvcmVJZCB8fCByb3cuc3RvcmU7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5UGVyZlVzZXIoXzogbnVtYmVyLCByb3c6IFVzZXJQZXJmUm93KTogc3RyaW5nIHtcclxuICAgIHJldHVybiByb3cuZW1haWw7XHJcbiAgfVxyXG5cclxuICBvblBhZ2VDaGFuZ2UocGFnZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnBhZ2UgPSBOdW1iZXIocGFnZSkgfHwgMTtcclxuICB9XHJcblxyXG4gIG9uUGFnZVNpemVDaGFuZ2Uoc2l6ZTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnBhZ2VTaXplID0gTnVtYmVyKHNpemUpIHx8IDEwO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICB9XHJcblxyXG4gIHRyYWNrQnlTdG9yZShfOiBudW1iZXIsIHJvdzogQXVkaXRSb3cpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHJvdy5zdG9yZUlkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogZmlsdGVyQ2F0cyAvIGJhbmRSb3dzIGFyZSBnZXR0ZXJzIHRoYXQgYnVpbGQgbmV3IG9iamVjdHMgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvbi4gV2l0aG91dCBhIGtleVxyXG4gICAqIG5nRm9yIHJlYnVpbGRzIHRoZWlyIGJ1dHRvbnMgb24gZWFjaCBwYXNzLCBhbmQgYSBwYXNzIGJldHdlZW4gbW91c2Vkb3duIGFuZCBtb3VzZXVwICh0aGUgaGllcmFyY2h5XHJcbiAgICogZHJvcGRvd24gbGlzdGVucyB0byBkb2N1bWVudDptb3VzZWRvd24pIHN3YWxsb3dzIHRoZSBjbGljay5cclxuICAgKi9cclxuICB0cmFja0J5Q2F0KF86IG51bWJlciwgYzogRmlsdGVyQ2F0KTogc3RyaW5nIHtcclxuICAgIHJldHVybiBjLmtleTtcclxuICB9XHJcblxyXG4gIHRyYWNrQnlCYW5kKF86IG51bWJlciwgYjogeyBiYW5kOiBBdWRpdEJhbmQgfSk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYi5iYW5kLmtleTtcclxuICB9XHJcblxyXG4gIC8qKiAtLS0tIEV4cG9ydCAoY2xpZW50LXNpZGUgLnhsc3ggb2YgZXhhY3RseSB0aGUgZmlsdGVyZWQgcm93cyBhbmQgdmlzaWJsZSBjb2x1bW5zKSAtLS0tICovXHJcblxyXG4gIHByaXZhdGUgZ2V0IGV4cG9ydFBlcmlvZCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZnJvbSArICdfJyArIHRoaXMudG87XHJcbiAgfVxyXG5cclxuICAvKiogSGVhZGVyIEV4cG9ydDogdGhlIHN0b3JlIGxpc3QgYmVsb3cgdGhlIGZpbHRlcnMsIGV2ZXJ5IGZpbHRlcmVkIHJvdyAoYWxsIHBhZ2VzKSwgaXRzIHZpc2libGUgY29sdW1ucy4gKi9cclxuICBleHBvcnRTdG9yZXMoKTogdm9pZCB7XHJcbiAgICBjb25zdCByb3dzID0gdGhpcy5maWx0ZXJlZFJvd3M7XHJcbiAgICBpZiAodGhpcy5sb2FkaW5nIHx8ICFyb3dzLmxlbmd0aCkgeyByZXR1cm47IH1cclxuICAgIGNvbnN0IGNvbHVtbnM6IEV4cG9ydENvbHVtbjxBdWRpdFJvdz5bXSA9IHRoaXMuaGVhZGVycy5tYXAoaCA9PiAoe1xyXG4gICAgICBoZWFkZXI6IGgubGFiZWwsXHJcbiAgICAgIHZhbHVlOiAocjogQXVkaXRSb3cpID0+IHtcclxuICAgICAgICBpZiAoaC5rZXkgPT09ICdzY29yZScpIHsgcmV0dXJuIHIuc2NvcmUgPT09IG51bGwgPyAn4oCUJyA6IHIuc2NvcmUgKyAnJSc7IH1cclxuICAgICAgICBpZiAoaC5rZXkgPT09ICdzdGF0dXMnKSB7IHJldHVybiB0aGlzLnN0YXR1c0xhYmVsKHIpOyB9XHJcbiAgICAgICAgcmV0dXJuIHJbaC5rZXkgYXMga2V5b2YgQXVkaXRSb3ddO1xyXG4gICAgICB9XHJcbiAgICB9KSk7XHJcbiAgICB0aGlzLnRyYXhTZXJ2aWNlLmV4cG9ydFJvd3NYbHN4KHJvd3MsIGNvbHVtbnMsICdBdWRpdC1EYXNoYm9hcmQtU3RvcmVzLScgKyB0aGlzLmV4cG9ydFBlcmlvZCwgJ1N0b3JlIGxpc3QnKTtcclxuICB9XHJcblxyXG4gIC8qKiBSb3dzIG9mIHRoZSBhY3RpdmUgcGVyZm9ybWFuY2UgdGFiIGFmdGVyIGl0cyBzZWFyY2ggKHdoYXQgdGhlIFwiVG90YWxcIiBjb3VudGVyIHNob3dzKS4gKi9cclxuICBnZXQgcGVyZlJvd0NvdW50KCk6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy5wZXJmVGFiID09PSAnU3RvcmUnKSB7IHJldHVybiB0aGlzLmZpbHRlcmVkU3RvcmVQZXJmLmxlbmd0aDsgfVxyXG4gICAgaWYgKHRoaXMucGVyZlRhYiA9PT0gJ1VzZXInKSB7IHJldHVybiB0aGlzLmZpbHRlcmVkVXNlclBlcmYubGVuZ3RoOyB9XHJcbiAgICByZXR1cm4gdGhpcy5pc1Rhc2tNb2R1bGUgPyB0aGlzLmZpbHRlcmVkVGFza1BlcmYubGVuZ3RoIDogdGhpcy5maWx0ZXJlZEF1ZGl0UGVyZi5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIGFjdGl2ZSBwZXJmb3JtYW5jZSB0YWIgaXMgc3RpbGwgbG9hZGluZyAodGhlIFRhc2sgdGFibGUgaGFzIGl0cyBvd24gZmVlZCkuICovXHJcbiAgZ2V0IHBlcmZMb2FkaW5nKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMucGVyZlRhYiA9PT0gJ0F1ZGl0JyAmJiB0aGlzLmlzVGFza01vZHVsZSA/IHRoaXMudGFza0xvYWRpbmcgOiB0aGlzLmxvYWRpbmc7XHJcbiAgfVxyXG5cclxuICAvKiogUGVyZm9ybWFuY2UgRXhwb3J0OiB0aGUgYWN0aXZlIHRhYidzIGZpbHRlcmVkIGxpc3Qgd2l0aCBpdHMgdmlzaWJsZSBjb2x1bW4gaGVhZGVycyAoQWN0aW9uIGxlZnQgb3V0KS4gKi9cclxuICBleHBvcnRQZXJmb3JtYW5jZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnBlcmZMb2FkaW5nIHx8ICF0aGlzLnBlcmZSb3dDb3VudCkgeyByZXR1cm47IH1cclxuICAgIGNvbnN0IHBlcmlvZCA9IHRoaXMuZXhwb3J0UGVyaW9kO1xyXG4gICAgaWYgKHRoaXMucGVyZlRhYiA9PT0gJ1N0b3JlJykge1xyXG4gICAgICBjb25zdCBjb2x1bW5zOiBFeHBvcnRDb2x1bW48U3RvcmVQZXJmUm93PltdID0gW1xyXG4gICAgICAgIHsgaGVhZGVyOiAnU3RvcmUgTmFtZScsIHZhbHVlOiByID0+IHIuc3RvcmUgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ1N0b3JlIElEJywgdmFsdWU6IHIgPT4gci5zdG9yZUlkIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdTdG9yZSBTcG9jJywgdmFsdWU6IHIgPT4gci5zcG9jIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdBc3NpZ25lZCcsIHZhbHVlOiByID0+IHIuYXNzaWduZWQgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ0ZsYWdzJywgdmFsdWU6IHIgPT4gci5mbGFncyA/PyAn4oCUJyB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnQ29tcGxldGlvbiAlJywgdmFsdWU6IHIgPT4gci5jb21wbGV0aW9uIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdDb21wbGlhbmNlICUnLCB2YWx1ZTogciA9PiByLmNvbXBsaWFuY2UgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ1BlcmZvcm1hbmNlICUnLCB2YWx1ZTogciA9PiByLnBlcmYgfVxyXG4gICAgICBdO1xyXG4gICAgICB0aGlzLnRyYXhTZXJ2aWNlLmV4cG9ydFJvd3NYbHN4KHRoaXMuZmlsdGVyZWRTdG9yZVBlcmYsIGNvbHVtbnMsICdBdWRpdC1EYXNoYm9hcmQtU3RvcmUtUGVyZm9ybWFuY2UtJyArIHBlcmlvZCwgJ1N0b3JlIFBlcmZvcm1hbmNlJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnBlcmZUYWIgPT09ICdVc2VyJykge1xyXG4gICAgICBjb25zdCBjb2x1bW5zOiBFeHBvcnRDb2x1bW48VXNlclBlcmZSb3c+W10gPSBbXHJcbiAgICAgICAgeyBoZWFkZXI6ICdVc2VyIE5hbWUnLCB2YWx1ZTogciA9PiByLm5hbWUgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ0VtYWlsJywgdmFsdWU6IHIgPT4gci5lbWFpbCB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnQXNzaWduZWQnLCB2YWx1ZTogciA9PiByLmFzc2lnbmVkIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdGbGFncycsIHZhbHVlOiByID0+IHIuZmxhZ3MgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ1JlRG8nLCB2YWx1ZTogciA9PiByLnJlZG8gfSxcclxuICAgICAgICB7IGhlYWRlcjogJ0NvbXBsZXRpb24gJScsIHZhbHVlOiByID0+IHIuY29tcGxldGlvbiB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnQ29tcGxpYW5jZSAlJywgdmFsdWU6IHIgPT4gci5jb21wbGlhbmNlIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdQZXJmb3JtYW5jZSAlJywgdmFsdWU6IHIgPT4gci5wZXJmIH1cclxuICAgICAgXTtcclxuICAgICAgdGhpcy50cmF4U2VydmljZS5leHBvcnRSb3dzWGxzeCh0aGlzLmZpbHRlcmVkVXNlclBlcmYsIGNvbHVtbnMsICdBdWRpdC1EYXNoYm9hcmQtVXNlci1QZXJmb3JtYW5jZS0nICsgcGVyaW9kLCAnVXNlciBQZXJmb3JtYW5jZScpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5pc1Rhc2tNb2R1bGUpIHtcclxuICAgICAgY29uc3QgY29sdW1uczogRXhwb3J0Q29sdW1uPFRhc2tQZXJmUm93PltdID0gW1xyXG4gICAgICAgIHsgaGVhZGVyOiAnVGFzayBOYW1lJywgdmFsdWU6IHIgPT4gci5uYW1lIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdTY2hlZHVsZWQnLCB2YWx1ZTogciA9PiByLnNjaGVkdWxlZCB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnQ292ZXJhZ2UnLCB2YWx1ZTogciA9PiByLmNvdmVyYWdlIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdBc3NpZ25lZCBUbycsIHZhbHVlOiByID0+IHIuYXNzaWduZWQgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ1N1Ym1pdHRlZCcsIHZhbHVlOiByID0+IHIuc3VibWl0dGVkIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdGbGFncycsIHZhbHVlOiByID0+IHIuZmxhZ3MgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ1Rhc2tzJywgdmFsdWU6IHIgPT4gci50YXNrcyB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnUmVEbycsIHZhbHVlOiByID0+IHIucmVkbyB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnUXVlc3Rpb24gQ29tcGxpYW5jZSAlJywgdmFsdWU6IHIgPT4gci5jb21wbGlhbmNlIH1cclxuICAgICAgXTtcclxuICAgICAgdGhpcy50cmF4U2VydmljZS5leHBvcnRSb3dzWGxzeCh0aGlzLmZpbHRlcmVkVGFza1BlcmYsIGNvbHVtbnMsICdBdWRpdC1EYXNoYm9hcmQtVGFzay1QZXJmb3JtYW5jZS0nICsgcGVyaW9kLCAnVGFzayBQZXJmb3JtYW5jZScpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBjb2x1bW5zOiBFeHBvcnRDb2x1bW48QXVkaXRQZXJmUm93PltdID0gW1xyXG4gICAgICB7IGhlYWRlcjogJ0F1ZGl0IE5hbWUnLCB2YWx1ZTogciA9PiByLm5hbWUgfSxcclxuICAgICAgeyBoZWFkZXI6ICdBc3NpZ25lZCBUbycsIHZhbHVlOiByID0+IHIuYXNzaWduZWQgfSxcclxuICAgICAgeyBoZWFkZXI6ICdTdWJtaXR0ZWQnLCB2YWx1ZTogciA9PiByLnN1Ym1pdHRlZCB9LFxyXG4gICAgICB7IGhlYWRlcjogJ0Rpc3B1dGVzJywgdmFsdWU6IHIgPT4gci5kaXNwdXRlcyA/PyAn4oCUJyB9LFxyXG4gICAgICB7IGhlYWRlcjogJ1Bhc3MgTWFyaycsIHZhbHVlOiByID0+IHIucGFzc01hcmsgfSxcclxuICAgICAgeyBoZWFkZXI6ICdTY29yZScsIHZhbHVlOiByID0+IHIuc2NvcmUgfSxcclxuICAgICAgeyBoZWFkZXI6ICdSZXN1bHQnLCB2YWx1ZTogciA9PiByLnJlc3VsdCB9XHJcbiAgICBdO1xyXG4gICAgdGhpcy50cmF4U2VydmljZS5leHBvcnRSb3dzWGxzeCh0aGlzLmZpbHRlcmVkQXVkaXRQZXJmLCBjb2x1bW5zLCAnQXVkaXQtRGFzaGJvYXJkLUF1ZGl0LVBlcmZvcm1hbmNlLScgKyBwZXJpb2QsICdBdWRpdCBQZXJmb3JtYW5jZScpO1xyXG4gIH1cclxuXHJcbiAgLyoqIC0tLS0gUGVyLXN0b3JlIFBERiAtLS0tICovXHJcblxyXG4gIC8qKiBUaGUgc3RvcmUncyBsYXRlc3Qgc3VibWl0dGVkIGF1ZGl0IGluIHRoZSBwZXJpb2QgKHRoZSBkYXNoYm9hcmQgQVBJJ3MgbGFzdFZpc2l0SWQpLCBpZiBhbnkuICovXHJcbiAgcGRmVmlzaXRJZChyb3c6IEF1ZGl0Um93KTogc3RyaW5nIHtcclxuICAgIHJldHVybiByb3cucmF3Py5sYXN0VmlzaXRJZCA/IFN0cmluZyhyb3cucmF3Lmxhc3RWaXNpdElkKSA6ICcnO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBhdWRpdCBvZiB0aGF0IGxhdGVzdCBzdWJtaXNzaW9uIChsYXN0VmlzaXRBdWRpdElkKTogVmlldyBvcGVucyBpdCBpbiB0aGUgR2FsbGVyeS4gJycgd2l0aG91dCBvbmUuICovXHJcbiAgZ2FsbGVyeUF1ZGl0SWQocm93OiBBdWRpdFJvdyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcm93LnJhdz8ubGFzdFZpc2l0QXVkaXRJZCA/IFN0cmluZyhyb3cucmF3Lmxhc3RWaXNpdEF1ZGl0SWQpIDogJyc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTYW1lIFBERiBkb3dubG9hZCBhcyB0aGUgZGV0YWlsIHBhZ2VzJyBEb3dubG9hZCwgZm9yIHRoZSBzdG9yZSdzIGxhdGVzdCBzdWJtaXR0ZWQgYXVkaXQ6XHJcbiAgICogcXVldWVkLCB0aGVuIGxpc3RlZCB1bmRlciBOb3RpZmljYXRpb25zID4gRG93bmxvYWRzLlxyXG4gICAqL1xyXG4gIGRvd25sb2FkUGRmKHJvdzogQXVkaXRSb3cpOiB2b2lkIHtcclxuICAgIGNvbnN0IHZpc2l0SWQgPSB0aGlzLnBkZlZpc2l0SWQocm93KTtcclxuICAgIGlmICghdmlzaXRJZCB8fCB0aGlzLnBkZlF1ZXVlZC5oYXModmlzaXRJZCkpIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLnBkZlF1ZXVlZC5hZGQodmlzaXRJZCk7XHJcbiAgICBjb25zdCB1c2VyID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlci1pbmZvJykgfHwgJ3t9Jyk7XHJcbiAgICBjb25zdCBzdG9yZUlkID0gcm93LnJhdz8uc3RvcmVJZCB8fCByb3cuc3RvcmVJZDtcclxuICAgIC8vIFRoZSBkb3dubG9hZCBuYW1lIGlzIG1hdGNoZWQgYXMgYSByZWd1bGFyIGV4cHJlc3Npb24gc2VydmVyLXNpZGUsIHNvIGxlYXZlIHJlZ2V4IGNoYXJhY3RlcnMgb3V0LlxyXG4gICAgY29uc3QgbmFtZSA9IFN0cmluZyhyb3cucmF3Py5zdG9yZU5hbWUgfHwgc3RvcmVJZCkucmVwbGFjZSgvW1xcXFxeJC4qKz8oKVtcXF17fXxdL2csICcgJykudHJpbSgpICsgJyBhdWRpdCc7XHJcbiAgICB0aGlzLnRyYXhTZXJ2aWNlLnJlcG9ydFRhYmxlRXhwb3J0KHtcclxuICAgICAgZnJvbURhdGU6IHRoaXMuZnJvbSB8fCB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LnN0YXJ0RGF0ZSxcclxuICAgICAgdG9EYXRlOiB0aGlzLnRvIHx8IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uZW5kRGF0ZSxcclxuICAgICAgY2hlY2tsaXN0SWQ6IFt2aXNpdElkXSxcclxuICAgICAgc291cmNlQ2hlY2tMaXN0X2lkOiAnJyxcclxuICAgICAgY2hlY2tsaXN0TmFtZTogbmFtZSxcclxuICAgICAgZmlsZVR5cGU6ICdwZGYnLFxyXG4gICAgICBzdG9yZUlkczogW3N0b3JlSWRdLFxyXG4gICAgICB1c2VySWQ6IHVzZXI/Ll9pZCxcclxuICAgICAgY2xpZW50SWQ6IHRoaXMuaGVhZGVyRGF0YT8uY2xpZW50LFxyXG4gICAgICBkb3dubG9hZEluc2VydEZyb206ICdkYXNoYm9hcmQnLFxyXG4gICAgICBpbnNlcnRUeXBlOiAnY2hlY2tsaXN0JyxcclxuICAgICAgY2hlY2tMaXN0VHlwZTogJ2N1c3RvbSdcclxuICAgIH0pLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnBkZlF1ZXVlZC5kZWxldGUodmlzaXRJZCk7XHJcbiAgICAgICAgaWYgKHJlcz8uY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdCgnRG93bmxvYWRpbmcgeW91ciByZXBvcnQuIEZpbmQgaXQgdW5kZXIgTm90aWZpY2F0aW9ucyA+IERvd25sb2Fkcy4nKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5wZGZRdWV1ZWQuZGVsZXRlKHZpc2l0SWQpO1xyXG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnU29tZXRoaW5nIHdlbnQgd3JvbmchJyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiYXYyLXBhZ2UgYXVkaXQtZGFzaFwiPlxyXG5cclxuICA8IS0tIFJlZnJlc2ggbGluZSArIG1vZHVsZSBzd2l0Y2ggLS0+XHJcbiAgPGRpdiBjbGFzcz1cImRiLXRvcGxpbmVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkYi1yZWZyZXNoXCI+TGFzdCByZWZyZXNoZWQgYXQge3sgbGFzdFJlZnJlc2hlZCB9fTwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImF2Mi1ncm93XCI+PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kdWxlc3dpdGNoXCI+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibW9kdWxldGFiXCIgKm5nRm9yPVwibGV0IHQgb2YgbW9kdWxlVGFic1wiIFtjbGFzcy5tb2R1bGV0YWItb25dPVwibW9kdWxlVGFiID09PSB0XCJcclxuICAgICAgICAoY2xpY2spPVwic2V0TW9kdWxlVGFiKHQpXCI+e3sgdCB9fTwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gPT09PT09PT09PT09IEFVRElUIFNDT1JFQ0FSRCA9PT09PT09PT09PT0gLS0+XHJcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1Rhc2tNb2R1bGVcIj5cclxuXHJcbiAgICA8IS0tIENydW1iLCBzY29wZSB0aXRsZSwgYWN0aW9ucyAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJkYi1zY29wZWJhclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZGItc2NvcGV0ZXh0XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLWNydW1iXCI+QXVkaXRzIOKAuiBEYXNoYm9hcmQ8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc2NvcGVcIj57eyBzY29wZUxhYmVsIH19PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tZ2hvc3QgYXYyLWJ0bi0tc21cIiAoY2xpY2spPVwib3BlbkZpbHRlcnMoKVwiPlxyXG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS44XCJcclxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgPGxpbmUgeDE9XCI0XCIgeTE9XCI3XCIgeDI9XCIyMFwiIHkyPVwiN1wiPjwvbGluZT5cclxuICAgICAgICAgIDxsaW5lIHgxPVwiN1wiIHkxPVwiMTJcIiB4Mj1cIjE3XCIgeTI9XCIxMlwiPjwvbGluZT5cclxuICAgICAgICAgIDxsaW5lIHgxPVwiMTBcIiB5MT1cIjE3XCIgeDI9XCIxNFwiIHkyPVwiMTdcIj48L2xpbmU+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgRmlsdGVyc1xyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZGItY291bnRwaWxsXCIgKm5nSWY9XCJmaWx0ZXJDb3VudFwiPnt7IGZpbHRlckNvdW50IH19PC9zcGFuPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGF2Mi1idG4tLWdob3N0IGF2Mi1idG4tLXNtXCIgW2Rpc2FibGVkXT1cImxvYWRpbmcgfHwgIWZpbHRlcmVkUm93cy5sZW5ndGhcIlxyXG4gICAgICAgIHRpdGxlPVwiRG93bmxvYWQgdGhlIHN0b3JlIGxpc3QgYmVsb3cgYXMgYW4gRXhjZWwgZmlsZVwiIChjbGljayk9XCJleHBvcnRTdG9yZXMoKVwiPlxyXG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS44XCJcclxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgPHBhdGggZD1cIk0xMiAxNlY0XCI+PC9wYXRoPlxyXG4gICAgICAgICAgPHBvbHlsaW5lIHBvaW50cz1cIjcgOSAxMiA0IDE3IDlcIj48L3BvbHlsaW5lPlxyXG4gICAgICAgICAgPHBhdGggZD1cIk00IDE2djRoMTZ2LTRcIj48L3BhdGg+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgRXhwb3J0XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBGaWx0ZXIgY2hpcHMgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZGItY2hpcHNcIj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJkYi1jaGlwXCIgKm5nRm9yPVwibGV0IGMgb2YgZmlsdGVyQ2F0czsgdHJhY2tCeTogdHJhY2tCeUNhdFwiIFtjbGFzcy5pcy1kaXJ0eV09XCJjLmRpcnR5XCJcclxuICAgICAgICAoY2xpY2spPVwib3BlbkZpbHRlcnMoYy5rZXkpXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1jaGlwLWxhYmVsXCI+e3sgYy5sYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWNoaXAtdmFsdWVcIj57eyBjLnZhbHVlIH19PC9zcGFuPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJkYi1jbGVhcmFsbFwiICpuZ0lmPVwiZmlsdGVyQ291bnRcIiAoY2xpY2spPVwiY2xlYXJBbGwoKVwiPkNsZWFyIGFsbDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBLUEkgdGlsZXMgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZGIta3Bpc1wiPlxyXG4gICAgICA8IS0tIE9sZCBDaGVja2xpc3Qgc3VtbWFyeSBjYXJkOiBmaWd1cmUgKyBsYWJlbCBpbiB0aGUgZ3JhZGllbnQgc3RyaXAsIG5vdGUgYmVsb3cuIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYXYyLW9jYXJkXCIgKm5nRm9yPVwibGV0IGtwaSBvZiBrcGlzXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1vY2FyZC1oZWFkXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLW9jYXJkLWNvdW50XCI+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwibG9hZGluZ1wiIGNsYXNzPVwiYXYyLXNrIGF2Mi1zay0tdmFsdWUgZGItc2stdmFsdWVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbG9hZGluZ1wiPnt7IGtwaS52YWx1ZSB9fTwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLW9jYXJkLXRleHRcIj57eyBrcGkubGFiZWwgfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLW9jYXJkLWJvZHlcIj5cclxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwibG9hZGluZ1wiIGNsYXNzPVwiYXYyLXNrIGF2Mi1zay0tbm90ZVwiPjwvc3Bhbj5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCIhbG9hZGluZ1wiIGNsYXNzPVwiYXYyLW9jYXJkLW5vdGVcIiBbc3R5bGUuY29sb3JdPVwia3BpLm5vdGVDb2xvclwiPnt7IGtwaS5ub3RlIH19PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBUcmVuZCArIGRpc3RyaWJ1dGlvbiAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJkYi1kdW9cIj5cclxuICAgICAgPCEtLSBUcmVuZCAtLT5cclxuICAgICAgPHNlY3Rpb24gY2xhc3M9XCJkYi1jYXJkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLWNhcmQtaGVhZCBkYi1jYXJkLWhlYWQtLXdyYXBcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jYXJkLXRpdGxlIGRiLWNhcmQtdGl0bGUtLWdyb3dcIj5BdWRpdCBzY29yZSB0cmVuZDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXNlZ1wiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImRiLXNlZy10YWJcIiBbY2xhc3MuaXMtb25dPVwiZ3JhaW4gPT09ICdxdWFydGVyJ1wiIChjbGljayk9XCJzZXRHcmFpbigncXVhcnRlcicpXCI+UXVhcnRlcmx5PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZGItc2VnLXRhYlwiIFtjbGFzcy5pcy1vbl09XCJncmFpbiA9PT0gJ2RhdGUnXCIgKGNsaWNrKT1cInNldEdyYWluKCdkYXRlJylcIj5CeSBkYXRlPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLWRhdGVyb3dcIiAqbmdJZj1cImdyYWluID09PSAnZGF0ZSdcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZGF0ZXBpY2tcIj5cclxuICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImF2Mi1kYXRlcGljay1pY29uXCIgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHJlY3QgeD1cIjNcIiB5PVwiNFwiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHJ4PVwiMlwiPjwvcmVjdD5cclxuICAgICAgICAgICAgICA8bGluZSB4MT1cIjE2XCIgeTE9XCIyXCIgeDI9XCIxNlwiIHkyPVwiNlwiPjwvbGluZT48bGluZSB4MT1cIjhcIiB5MT1cIjJcIiB4Mj1cIjhcIiB5Mj1cIjZcIj48L2xpbmU+PGxpbmUgeDE9XCIzXCIgeTE9XCIxMFwiIHgyPVwiMjFcIiB5Mj1cIjEwXCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImF2Mi1kYXRlcGljay1pbnB1dCBkYi1kYXRlcmFuZ2VcIiBuZ3hEYXRlcmFuZ2VwaWNrZXJNZCByZWFkb25seSBhdXRvY29tcGxldGU9XCJvZmZcIlxyXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGRhdGUgcmFuZ2VcIiBbKG5nTW9kZWwpXT1cInJhbmdlXCIgW2xvY2FsZV09XCJwaWNrZXJMb2NhbGVcIiBbbWF4RGF0ZV09XCJ0b2RheVwiXHJcbiAgICAgICAgICAgICAgW2RhdGVMaW1pdF09XCJtYXhSYW5nZURheXNcIiBbcmFuZ2VzXT1cInJhbmdlc1wiIFtzaG93Q3VzdG9tUmFuZ2VMYWJlbF09XCJ0cnVlXCIgW2Fsd2F5c1Nob3dDYWxlbmRhcnNdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgIFtrZWVwQ2FsZW5kYXJPcGVuaW5nV2l0aFJhbmdlXT1cInRydWVcIiBbYXV0b0FwcGx5XT1cInRydWVcIiBbc2hvd0NhbmNlbF09XCJmYWxzZVwiIFtkcm9wc109XCInZG93bidcIiBbb3BlbnNdPVwiJ3JpZ2h0J1wiXHJcbiAgICAgICAgICAgICAgKGRhdGVzVXBkYXRlZCk9XCJvblJhbmdlUGlja2VkKCRldmVudClcIj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidHJlbmRMb2FkaW5nXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImF2Mi1zayBhdjItc2stLXRpdGxlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdjItc2sgYXYyLXNrLS1ibG9jayBkYi1zay1jaGFydFwiPjwvc3Bhbj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0cmVuZExvYWRpbmdcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItZm9jdXNcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItZm9jdXMtc2NvcmVcIiBbY2xhc3MuaXMtZmFpbF09XCIhZm9jdXNQYXNzZWRcIj57eyBmb2N1c1Njb3JlIH19PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1mb2N1cy1waWxsXCIgW2NsYXNzLmlzLXBhc3NdPVwiZm9jdXNQYXNzZWRcIiBbY2xhc3MuaXMtZmFpbF09XCIhZm9jdXNQYXNzZWRcIj57eyBmb2N1c1N0YXR1cyB9fTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItZm9jdXMtbGluZVwiPnt7IGZvY3VzTGluZSB9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLWxlZ2VuZFwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1sZWdlbmQtZGFzaFwiPjwvc3Bhbj5QYXNzIG1hcmsge3sgcGFzc01hcmsgfX0lXHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jaGFydFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLWNoYXJ0LXlcIj5cclxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJ0b3A6MFwiPjEwMCU8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwidG9wOjUwJVwiPjUwJTwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJ0b3A6MTAwJVwiPjAlPC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY2hhcnQtYXJlYVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWdyaWRsaW5lXCIgc3R5bGU9XCJ0b3A6MFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1ncmlkbGluZVwiIHN0eWxlPVwidG9wOjUwJVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1ncmlkbGluZVwiIHN0eWxlPVwidG9wOjEwMCVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItcGFzc2xpbmVcIiBbc3R5bGUudG9wLiVdPVwiMTAwIC0gcGFzc01hcmtcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1iYXJzXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLWJhci1jb2xcIiAqbmdGb3I9XCJsZXQgYmFyIG9mIHRyZW5kQmFyczsgbGV0IGZpcnN0ID0gZmlyc3Q7IGxldCBsYXN0ID0gbGFzdFwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaXMtcGlja2FibGVdPVwiZ3JhaW4gPT09ICdxdWFydGVyJ1wiIChjbGljayk9XCJzZWxlY3RRdWFydGVyKGJhci5rZXkpXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWJhci12YWx1ZVwiICpuZ0lmPVwiIWRlbnNlVHJlbmRcIiBbY2xhc3MuaXMtYWN0aXZlXT1cImJhci5rZXkgPT09IHF1YXJ0ZXJcIiBbc3R5bGUuYm90dG9tXT1cImJhckhlaWdodChiYXIpXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IGJhci52YWx1ZSA9PT0gbnVsbCA/ICfigJQnIDogYmFyLnZhbHVlICsgJyUnIH19XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWJhclwiIFtzdHlsZS5oZWlnaHRdPVwiYmFySGVpZ2h0KGJhcilcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJiYXJGaWxsKGJhcilcIj48L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXRpcFwiIFtjbGFzcy5pcy1zdGFydF09XCJmaXJzdCAmJiAhbGFzdFwiIFtjbGFzcy5pcy1lbmRdPVwibGFzdCAmJiAhZmlyc3RcIiBbc3R5bGUuYm90dG9tXT1cInRpcEJvdHRvbShiYXIpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi10aXAtaGVhZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGJhci5sYWJlbCB9fTxzcGFuIGNsYXNzPVwiZGItdGlwLXN1YlwiICpuZ0lmPVwiZ3JhaW4gPT09ICdxdWFydGVyJ1wiPiDCtyB7eyBxdWFydGVyTW9udGhzKGJhci5rZXkpIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXRpcC1zY29yZVwiICpuZ0lmPVwiYmFyLnZhbHVlICE9PSBudWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi10aXAtZG90XCIgW2NsYXNzLmlzLWZhaWxdPVwiYmFyLnZhbHVlIDwgcGFzc01hcmtcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi10aXAtdmFsdWVcIj57eyBiYXIudmFsdWUgfX0lPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItdGlwLXN0YXR1c1wiIFtjbGFzcy5pcy1mYWlsXT1cImJhci52YWx1ZSA8IHBhc3NNYXJrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyBiYXIudmFsdWUgPj0gcGFzc01hcmsgPyAnUGFzcycgOiAnQmVsb3cgcGFzcyBtYXJrJyB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi10aXAtZW1wdHlcIiAqbmdJZj1cImJhci52YWx1ZSA9PT0gbnVsbFwiPk5vIHNjb3JlZCBhdWRpdHM8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXRpcC1yb3dcIj48c3Bhbj5BdWRpdHMgY29tcGxldGVkPC9zcGFuPjxiPnt7IGJhci5zdWJtaXR0ZWQgfX08L2I+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi10aXAtcm93XCIgKm5nSWY9XCJiYXIuY291bnQgIT09IGJhci5zdWJtaXR0ZWRcIj48c3Bhbj5TY29yZWQgYXVkaXRzPC9zcGFuPjxiPnt7IGJhci5jb3VudCB9fTwvYj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXRpcC1yb3dcIj48c3Bhbj5QYXNzIG1hcms8L3NwYW4+PGI+e3sgcGFzc01hcmsgfX0lPC9iPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPCEtLSBBIG1vbnRoIGJ5IGRhdGUgaGFzIH4zMCBiYXJzOiBldmVyeSBmZXcgZGF5cyBnZXQgYSBsYWJlbCAoZmlyc3QgYW5kIGxhc3QgYWx3YXlzKSwgYW5kIHRoZSBhdWRpdCBjb3VudHNcclxuICAgICAgICAgICAgIG1vdmUgdG8gdGhlIGJhciB0b29sdGlwLCBzbyB0aGUgbGFiZWxzIG5ldmVyIHJ1biBpbnRvIGVhY2ggb3RoZXIuIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jaGFydC14XCIgW2NsYXNzLmlzLWRlbnNlXT1cImRlbnNlVHJlbmRcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItY2hhcnQteGNvbFwiICpuZ0Zvcj1cImxldCBiYXIgb2YgdHJlbmRCYXJzOyBsZXQgaSA9IGluZGV4OyBsZXQgbGFzdCA9IGxhc3RcIiBbY2xhc3MuaXMtcGlja2FibGVdPVwiZ3JhaW4gPT09ICdxdWFydGVyJ1wiIChjbGljayk9XCJzZWxlY3RRdWFydGVyKGJhci5rZXkpXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItY2hhcnQteGxhYmVsXCIgW2NsYXNzLmlzLWFjdGl2ZV09XCJiYXIua2V5ID09PSBxdWFydGVyXCIgW3N0eWxlLnZpc2liaWxpdHldPVwic2hvd1hMYWJlbChpLCBsYXN0KSA/ICd2aXNpYmxlJyA6ICdoaWRkZW4nXCI+e3sgYmFyLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWNoYXJ0LXhjb3VudFwiICpuZ0lmPVwiIWRlbnNlVHJlbmRcIj57eyBiYXIuc3VibWl0dGVkID8gYmFyLnN1Ym1pdHRlZCArICcgYXVkaXRzJyA6ICdubyBhdWRpdHMnIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L3NlY3Rpb24+XHJcblxyXG4gICAgICA8IS0tIFNjb3JlIGJhbmRzIC0tPlxyXG4gICAgICA8c2VjdGlvbiBjbGFzcz1cImRiLWNhcmQgZGItY2FyZC0tdGlnaHRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY2FyZC1oZWFkIGRiLWNhcmQtaGVhZC0tYmFzZWxpbmVcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jYXJkLXRpdGxlIGRiLWNhcmQtdGl0bGUtLWdyb3dcIj5TY29yZSBkaXN0cmlidXRpb248L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jYXJkLXN1YlwiPnt7IHN0b3Jlc0luU2NvcGUgfX0gaW4gc2NvcGU8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY2FyZC1zdWJcIj5TdG9yZXMgYnkgc2NvcmUgYmFuZCwge3sgcGVyaW9kTGFiZWwgfX08L2Rpdj5cclxuXHJcbiAgICAgICAgPGxpYi1hdWRpdC12Mi1zaGltbWVyICpuZ0lmPVwibG9hZGluZ1wiIFtyb3dzXT1cIjJcIj48L2xpYi1hdWRpdC12Mi1zaGltbWVyPlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItYmFuZGJhclwiICpuZ0lmPVwiIWxvYWRpbmdcIj5cclxuICAgICAgICAgIDwhLS0gQSBiYW5kIHdpdGggc3RvcmVzIGtlZXBzIGEgdmlzaWJsZSBzbGl2ZXIgKDIgb2YgMzU3NiBzdG9yZXMgaXMgdW5kZXIgYSBwaXhlbCk7IHRoZSBsYXJnZXN0IGJhbmQgZ2l2ZXMgd2F5LiAtLT5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItYmFuZHNlZ1wiICpuZ0Zvcj1cImxldCBiIG9mIGJhbmRSb3dzOyB0cmFja0J5OiB0cmFja0J5QmFuZFwiIFtzdHlsZS53aWR0aF09XCJiLndpZHRoXCIgW3N0eWxlLmJhY2tncm91bmRdPVwiYi5iYW5kLnNvZnRcIlxyXG4gICAgICAgICAgICBbY2xhc3MuaGFzLXN0b3Jlc109XCJiLmNvdW50ID4gMFwiIFt0aXRsZV09XCJiLmJhbmQubGFiZWwgKyAnOiAnICsgYi5jb3VudFwiPjwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLWJhbmRyb3dzXCIgKm5nSWY9XCIhbG9hZGluZ1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLWJhbmRyb3dcIiAqbmdGb3I9XCJsZXQgYiBvZiBiYW5kUm93czsgdHJhY2tCeTogdHJhY2tCeUJhbmRcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1iYW5kZG90XCIgW3N0eWxlLmJhY2tncm91bmRdPVwiYi5iYW5kLnNvZnRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItYmFuZGxhYmVsXCI+e3sgYi5iYW5kLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWJhbmRyYW5nZVwiPnt7IGIuYmFuZC5yYW5nZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1iYW5kY291bnRcIj57eyBiLmNvdW50IH19IHt7IGIuY291bnQgPT09IDEgPyAnc3RvcmUnIDogJ3N0b3JlcycgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItYmFuZHNoYXJlXCI+e3sgYi5zaGFyZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPGEgY2xhc3M9XCJkYi1iYW5kbGlua1wiIFtjbGFzcy5pcy1hY3RpdmVdPVwic3RvcmVMaXN0T3BlbiAmJiBsaXN0QmFuZEtleSA9PT0gYi5iYW5kLmtleVwiIChjbGljayk9XCJhcHBseUJhbmQoYi5iYW5kKVwiPlZpZXcgc3RvcmVzPC9hPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLWJhbmRoaW50XCIgKm5nSWY9XCIhbG9hZGluZyAmJiAhc2hvd1N0b3JlTGlzdFwiPkNsaWNrIDxiPlZpZXcgc3RvcmVzPC9iPiBvbiBhIGJhbmQgdG8gbGlzdCBpdHMgc3RvcmVzLjwvZGl2PlxyXG4gICAgICA8L3NlY3Rpb24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFN0b3JlIGxlZGdlcjogb3BlbmVkIGZyb20gU2NvcmUgZGlzdHJpYnV0aW9uIC0+IFZpZXcgc3RvcmVzIChvciBhIEZpbHRlcnMgc2NvcmUgcmFuZ2UpIC0tPlxyXG4gICAgPHNlY3Rpb24gY2xhc3M9XCJkYi1jYXJkIGRiLWNhcmQtLXRhYmxlXCIgaWQ9XCJhZC1zdG9yZS1saXN0XCIgKm5nSWY9XCJzaG93U3RvcmVMaXN0XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkYi1sZWRnZXItaGVhZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1sZWRnZXItdGV4dFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLWNhcmQtdGl0bGVcIj5TdG9yZSBsaXN0PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY2FyZC1zdWJcIj5cclxuICAgICAgICAgICAge3sgZmlsdGVyZWRSb3dzLmxlbmd0aCB9fSB7eyBmaWx0ZXJlZFJvd3MubGVuZ3RoID09PSAxID8gJ3N0b3JlJyA6ICdzdG9yZXMnIH19IMK3IHt7IHBlcmlvZExhYmVsIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1iYW5kZmlsdGVyXCIgKm5nSWY9XCJsaXN0Q2hpcExhYmVsXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItYmFuZGNoaXBcIj5cclxuICAgICAgICAgICAgICB7eyBsaXN0Q2hpcExhYmVsIH19XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1iYW5kY2hpcC14XCIgdGl0bGU9XCJDbG9zZSB0aGUgc3RvcmUgbGlzdFwiIChjbGljayk9XCJjbG9zZVN0b3JlTGlzdCgpXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiOVwiIGhlaWdodD1cIjlcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIzXCJcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjxsaW5lIHgxPVwiNlwiIHkxPVwiNlwiIHgyPVwiMThcIiB5Mj1cIjE4XCI+PC9saW5lPjxsaW5lIHgxPVwiMThcIiB5MT1cIjZcIiB4Mj1cIjZcIiB5Mj1cIjE4XCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8YSBjbGFzcz1cImRiLWJhbmRsaW5rXCIgKGNsaWNrKT1cInNob3dBbGxTdG9yZXMoKVwiPlNob3cgYWxsIHN0b3JlczwvYT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZ3Jvd1wiPjwvZGl2PlxyXG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImF2Mi1zZWFyY2ggZGItc2VhcmNoXCI+XHJcbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+XHJcbiAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMVwiIGN5PVwiMTFcIiByPVwiN1wiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgICA8bGluZSB4MT1cIjE2LjVcIiB5MT1cIjE2LjVcIiB4Mj1cIjIxXCIgeTI9XCIyMVwiPjwvbGluZT5cclxuICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgPGlucHV0IFsobmdNb2RlbCldPVwic2VhcmNoXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25TZWFyY2goKVwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJTZWFyY2ggc3RvcmUgb3Igb3duZXJcIlxyXG4gICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIiAvPlxyXG4gICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNlZ21lbnRlZFwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZWd0YWJcIiBbY2xhc3Muc2VndGFiLW9uXT1cInN0YXR1cyA9PT0gJ2FsbCdcIiAoY2xpY2spPVwic2V0U3RhdHVzKCdhbGwnKVwiPkFsbDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZWd0YWJcIiBbY2xhc3Muc2VndGFiLW9uXT1cInN0YXR1cyA9PT0gJ2ZhaWwnXCIgKGNsaWNrKT1cInNldFN0YXR1cygnZmFpbCcpXCI+RmFpbDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZWd0YWJcIiBbY2xhc3Muc2VndGFiLW9uXT1cInN0YXR1cyA9PT0gJ3Bhc3MnXCIgKGNsaWNrKT1cInNldFN0YXR1cygncGFzcycpXCI+UGFzczwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZWd0YWJcIiBbY2xhc3Muc2VndGFiLW9uXT1cInN0YXR1cyA9PT0gJ25hJ1wiIChjbGljayk9XCJzZXRTdGF0dXMoJ25hJylcIj5Ob3QgYXVkaXRlZDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxsaWItYXVkaXQtdjItc2hpbW1lciAqbmdJZj1cImxvYWRpbmdcIj48L2xpYi1hdWRpdC12Mi1zaGltbWVyPlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2FkaW5nXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJhdjItdGFibGUtd3JhcFwiPlxyXG4gICAgICAgIDx0YWJsZSBjbGFzcz1cImRiLXRhYmxlXCI+XHJcbiAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IGggb2YgaGVhZGVyc1wiIGNsYXNzPVwiaXMtc29ydGFibGVcIiBbY2xhc3MuaXMtc29ydGVkXT1cInNvcnRLZXkgPT09IGgua2V5XCIgKGNsaWNrKT1cInNvcnRCeShoLmtleSlcIj5cclxuICAgICAgICAgICAgICAgIHt7IGgubGFiZWwgfX0gPGxpYi1hdWRpdC12Mi1zb3J0LWljb24gW2FjdGl2ZV09XCJzb3J0S2V5ID09PSBoLmtleVwiIFtkaXJdPVwic29ydERpclwiPjwvbGliLWF1ZGl0LXYyLXNvcnQtaWNvbj5cclxuICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgIDx0aD5BY3Rpb248L3RoPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByb3cgb2YgcGFnZVJvd3M7IHRyYWNrQnk6IHRyYWNrQnlTdG9yZVwiPlxyXG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImRiLW5vd3JhcFwiPnt7IHJvdy5kYXRlIH19PC90ZD5cclxuICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRiLXN0b3JlaWRcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS90cmF4L2F1ZGl0LXYyL2Rhc2hib2FyZC9zdG9yZVwiXHJcbiAgICAgICAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJkZXRhaWxQYXJhbXMoeyBzdG9yZTogcm93LnJhdz8uc3RvcmVJZCB8fCByb3cuc3RvcmVJZCB9KVwiPnt7IHJvdy5zdG9yZUlkIH19PC9hPlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiYXYyLWVsbGlwc2lzXCI+e3sgcm93LmNpcmNsZSB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiYXYyLWVsbGlwc2lzXCI+e3sgcm93LnpvbmUgfX08L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImF2Mi1lbGxpcHNpc1wiPnt7IHJvdy5hb20gfX08L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItcGlsbFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImJhbmRGb3Iocm93KS5iZ1wiIFtzdHlsZS5jb2xvcl09XCJiYW5kRm9yKHJvdykuZmdcIj5cclxuICAgICAgICAgICAgICAgICAge3sgcm93LnNjb3JlID09PSBudWxsID8gJ+KAlCcgOiByb3cuc2NvcmUgKyAnJScgfX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItcGlsbFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImJhbmRGb3Iocm93KS5iZ1wiIFtzdHlsZS5jb2xvcl09XCJiYW5kRm9yKHJvdykuZmdcIj5cclxuICAgICAgICAgICAgICAgICAge3sgc3RhdHVzTGFiZWwocm93KSB9fVxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLWFjdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBWaWV3IG9wZW5zIHRoZSBHYWxsZXJ5IG9uIHRoZSBzdG9yZSdzIGxhdGVzdCBzdWJtaXR0ZWQgYXVkaXQgaW4gdGhlIHBlcmlvZCAoUUEgMTEgT2N0KTsgYSBzdG9yZVxyXG4gICAgICAgICAgICAgICAgICAgICAgIHdpdGggbm8gc3VibWlzc2lvbiB0aGVyZSBvcGVucyBpdHMgYXVkaXQgZGV0YWlsIGluc3RlYWQgKHNhbWUgYXMgdGhlIHN0b3JlIGxpbmspLiAtLT5cclxuICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkYi12aWV3YnRuXCIgKm5nSWY9XCJnYWxsZXJ5QXVkaXRJZChyb3cpIGFzIGF1ZGl0SWRcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS90cmF4L2F1ZGl0LXYyL2dhbGxlcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJkZXRhaWxQYXJhbXMoeyBhdWRpdDogYXVkaXRJZCwgc3RvcmU6IHJvdy5yYXc/LnN0b3JlSWQgfHwgcm93LnN0b3JlSWQgfSlcIiB0aXRsZT1cIlZpZXcgdGhpcyBzdG9yZSdzIHN1Ym1pc3Npb25zIGluIHRoZSBHYWxsZXJ5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEzXCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xLjUgMTJTNSA1LjUgMTIgNS41IDIyLjUgMTIgMjIuNSAxMiAxOSAxOC41IDEyIDE4LjUgMS41IDEyIDEuNSAxMnpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjNcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICBWaWV3XHJcbiAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkYi12aWV3YnRuXCIgKm5nSWY9XCIhZ2FsbGVyeUF1ZGl0SWQocm93KVwiIHJvdXRlckxpbms9XCIvbWFuYWdlL3RyYXgvYXVkaXQtdjIvZGFzaGJvYXJkL3N0b3JlXCJcclxuICAgICAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiZGV0YWlsUGFyYW1zKHsgc3RvcmU6IHJvdy5yYXc/LnN0b3JlSWQgfHwgcm93LnN0b3JlSWQgfSlcIiB0aXRsZT1cIlZpZXcgdGhpcyBzdG9yZSdzIGF1ZGl0c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMS41IDEyUzUgNS41IDEyIDUuNSAyMi41IDEyIDIyLjUgMTIgMTkgMTguNSAxMiAxOC41IDEuNSAxMiAxLjUgMTJ6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIzXCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgVmlld1xyXG4gICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gUERGIG9mIHRoZSBzdG9yZSdzIGxhdGVzdCBzdWJtaXR0ZWQgYXVkaXQgaW4gdGhlIHBlcmlvZCAocXVldWVkLCB0aGVuIHVuZGVyIE5vdGlmaWNhdGlvbnMgPiBEb3dubG9hZHMpLiAtLT5cclxuICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkYi1wZGZidG5cIiByb2xlPVwiYnV0dG9uXCIgW2NsYXNzLmlzLWRpc2FibGVkXT1cIiFwZGZWaXNpdElkKHJvdylcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiIXBkZlZpc2l0SWQocm93KVwiIChjbGljayk9XCJkb3dubG9hZFBkZihyb3cpXCJcclxuICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwicGRmVmlzaXRJZChyb3cpID8gJ0Rvd25sb2FkIHRoZSBQREYgcmVwb3J0IG9mIHRoZSBsYXRlc3Qgc3VibWl0dGVkIGF1ZGl0IGZvciB0aGlzIHN0b3JlJyA6ICdObyBzdWJtaXR0ZWQgYXVkaXQgZm9yIHRoaXMgc3RvcmUgaW4gdGhpcyBwZXJpb2QnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMiA0djEyXCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHBvbHlsaW5lIHBvaW50cz1cIjcgMTEgMTIgMTYgMTcgMTFcIj48L3BvbHlsaW5lPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk00IDIwaDE2XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICA8L3RhYmxlPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCIhcGFnZVJvd3MubGVuZ3RoXCIgY2xhc3M9XCJhdjItZW1wdHlcIj5cclxuICAgICAgICA8aW1nIGNsYXNzPVwiYXYyLWVtcHR5LWltZ1wiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YTEuc3ZnXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS10ZXh0XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXRpdGxlXCI+Tm8gZGF0YSBmb3VuZDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS1zdWJcIj5ObyBzdG9yZXMgbWF0Y2ggdGhlIGN1cnJlbnQgZmlsdGVycy48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIFNoYXJlZCBwYWdlciAoMTAgLyAyMCAvIDMwKSwgYXMgb24gdGhlIG90aGVyIGF1ZGl0IGxpc3RzLiAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImRiLXBlcmYtcGFnZXJcIiAqbmdJZj1cImZpbHRlcmVkUm93cy5sZW5ndGhcIj5cclxuICAgICAgICA8bGliLXBhZ2luYXRpb24gW2l0ZW1zUGVyUGFnZV09XCJwYWdlU2l6ZVwiIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiIFtwYWdpbmF0aW9uU2l6ZXNdPVwicGFnZVNpemVzXCJcclxuICAgICAgICAgIFtjdXJyZW50UGFnZV09XCJwYWdlXCIgW3RvdGFsSXRlbXNdPVwiZmlsdGVyZWRSb3dzLmxlbmd0aFwiIChwYWdlQ2hhbmdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgIChwYWdlU2l6ZUNoYW5nZSk9XCJvblBhZ2VTaXplQ2hhbmdlKCRldmVudClcIj48L2xpYi1wYWdpbmF0aW9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L3NlY3Rpb24+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gIDwhLS0gPT09PT09PT09PT09IFRBU0sgU1VNTUFSWSA9PT09PT09PT09PT0gLS0+XHJcbiAgPCEtLSBUYXNrcyByYWlzZWQgZnJvbSB0aGlzIGNsaWVudCdzIGF1ZGl0cywgaW4gdGhlIGhlYWRlciBzY29wZSAoc2hpbW1lciB2YWx1ZXMgd2hpbGUgbG9hZGluZykuIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJkYi1zdGF0c1wiICpuZ0lmPVwiaXNUYXNrTW9kdWxlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1oZWFkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtYmlnXCI+XHJcbiAgICAgICAgICA8c3BhbiAqbmdJZj1cInRhc2tMb2FkaW5nXCIgY2xhc3M9XCJhdjItc2sgYXYyLXNrLS12YWx1ZSBkYi1zay12YWx1ZVwiPjwvc3Bhbj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdGFza0xvYWRpbmdcIj57eyB0YXNrU3RhdHMuYWN0aXZlVGFza3MgfX08L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1sYWJlbFwiPkFjdGl2ZSB7eyBtb2R1bGVUYWIgfX1zPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1ib2R5XCI+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LW1pZFwiPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cInRhc2tMb2FkaW5nXCIgY2xhc3M9XCJhdjItc2sgZGItc2stbWlkXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXRhc2tMb2FkaW5nXCI+e3sgdGFza1N0YXRzLnRhc2tJbnN0YW5jZXMgfX08L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtc3ViXCI+e3sgbW9kdWxlVGFiIH19IEluc3RhbmNlczwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LWhlYWRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1iaWdcIj5cclxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwidGFza0xvYWRpbmdcIiBjbGFzcz1cImF2Mi1zayBhdjItc2stLXZhbHVlIGRiLXNrLXZhbHVlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0YXNrTG9hZGluZ1wiPnt7IHRhc2tTdGF0cy5ub3RTdWJtaXR0ZWQgfX08L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1sYWJlbFwiPk5vdCBTdWJtaXR0ZWQge3sgbW9kdWxlVGFiIH19czwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtYm9keSBkYi1zdGF0LWJvZHktLTJcIj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtbWlkXCI+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidGFza0xvYWRpbmdcIiBjbGFzcz1cImF2Mi1zayBkYi1zay1taWRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdGFza0xvYWRpbmdcIj57eyB0YXNrU3RhdHMub3BlblRhc2tzIH19PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LXN1YlwiPk9wZW4ge3sgbW9kdWxlVGFiIH19czwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1taWRcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ0YXNrTG9hZGluZ1wiIGNsYXNzPVwiYXYyLXNrIGRiLXNrLW1pZFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0YXNrTG9hZGluZ1wiPnt7IHRhc2tTdGF0cy5pblByb2dyZXNzIH19PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zdGF0LXN1YlwiPkluIFByb2dyZXNzIHt7IG1vZHVsZVRhYiB9fXM8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1oZWFkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtYmlnXCI+XHJcbiAgICAgICAgICA8c3BhbiAqbmdJZj1cInRhc2tMb2FkaW5nXCIgY2xhc3M9XCJhdjItc2sgYXYyLXNrLS12YWx1ZSBkYi1zay12YWx1ZVwiPjwvc3Bhbj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdGFza0xvYWRpbmdcIj57eyB0YXNrU3RhdHMuc3VibWl0dGVkIH19PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtbGFiZWxcIj5TdWJtaXR0ZWQge3sgbW9kdWxlVGFiIH19czwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtYm9keSBkYi1zdGF0LWJvZHktLTNcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1jZWxsXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1taWRcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ0YXNrTG9hZGluZ1wiIGNsYXNzPVwiYXYyLXNrIGRiLXNrLW1pZFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0YXNrTG9hZGluZ1wiPnt7IHRhc2tTdGF0cy5jb21wbGV0aW9uU2NvcmUgfX08L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtc3ViXCI+Q29tcGxldGlvbiBTY29yZTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtZGVsdGFcIiAqbmdJZj1cIiF0YXNrTG9hZGluZyAmJiB0YXNrU3RhdHMuY29tcGxldGlvbkRlbHRhXCIgW25nQ2xhc3NdPVwidGFza0RlbHRhQ2xhc3MoJ2NvbXBsZXRpb24nKVwiPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjIuMlwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjQgNiAxMCAxMiAxNCA4IDIwIDE2XCI+PC9wb2x5bGluZT48cG9seWxpbmUgcG9pbnRzPVwiMTUgMTYgMjAgMTYgMjAgMTFcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICB7eyB0YXNrU3RhdHMuY29tcGxldGlvbkRlbHRhIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1jZWxsXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1taWRcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ0YXNrTG9hZGluZ1wiIGNsYXNzPVwiYXYyLXNrIGRiLXNrLW1pZFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0YXNrTG9hZGluZ1wiPnt7IHRhc2tTdGF0cy5jb21wbGlhbmNlU2NvcmUgfX08L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtc3ViXCI+Q29tcGxpYW5jZSBTY29yZTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtZGVsdGFcIiAqbmdJZj1cIiF0YXNrTG9hZGluZyAmJiB0YXNrU3RhdHMuY29tcGxpYW5jZURlbHRhXCIgW25nQ2xhc3NdPVwidGFza0RlbHRhQ2xhc3MoJ2NvbXBsaWFuY2UnKVwiPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjIuMlwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjQgNiAxMCAxMiAxNCA4IDIwIDE2XCI+PC9wb2x5bGluZT48cG9seWxpbmUgcG9pbnRzPVwiMTUgMTYgMjAgMTYgMjAgMTFcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICB7eyB0YXNrU3RhdHMuY29tcGxpYW5jZURlbHRhIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1jZWxsXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1taWQgaXMtdW5kZXJsaW5lXCI+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidGFza0xvYWRpbmdcIiBjbGFzcz1cImF2Mi1zayBkYi1zay1taWRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdGFza0xvYWRpbmdcIj57eyB0YXNrU3RhdHMudG90YWxGbGFncyB9fTwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc3RhdC1zdWJcIj5Ub3RhbCBGbGFnczwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXN0YXQtZGVsdGFcIiAqbmdJZj1cIiF0YXNrTG9hZGluZyAmJiB0YXNrU3RhdHMuZmxhZ3NEZWx0YVwiIFtuZ0NsYXNzXT1cInRhc2tEZWx0YUNsYXNzKCdmbGFncycpXCI+XHJcbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMi4yXCJcclxuICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiNCA2IDEwIDEyIDE0IDggMjAgMTZcIj48L3BvbHlsaW5lPjxwb2x5bGluZSBwb2ludHM9XCIxNSAxNiAyMCAxNiAyMCAxMVwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgIHt7IHRhc2tTdGF0cy5mbGFnc0RlbHRhIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSA9PT09PT09PT09PT0gUEVSRk9STUFOQ0UgPT09PT09PT09PT09IC0tPlxyXG4gIDxzZWN0aW9uIGNsYXNzPVwiZGItcGVyZlwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImRiLXBlcmZ0YWJzXCI+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZGItcGVyZnRhYlwiICpuZ0Zvcj1cImxldCB0IG9mIHBlcmZUYWJzXCIgW2NsYXNzLmlzLW9uXT1cInBlcmZUYWIgPT09IHRcIlxyXG4gICAgICAgIChjbGljayk9XCJzZXRQZXJmVGFiKHQpXCI+e3sgcGVyZlRhYkRpc3BsYXkodCkgfX08L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJkYi1wZXJmLWhlYWRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRiLXBlcmYtdGV4dFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1wZXJmLXRpdGxlXCI+XHJcbiAgICAgICAgICB7eyBwZXJmSW5mb1RpdGxlIH19XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLXRvdGFsXCI+XHJcbiAgICAgICAgICAgIHt7IHBlcmZUYWIgPT09ICdBdWRpdCcgPyAoaXNUYXNrTW9kdWxlID8gZmlsdGVyZWRUYXNrUGVyZi5sZW5ndGggOiBmaWx0ZXJlZEF1ZGl0UGVyZi5sZW5ndGgpIDogKHBlcmZUYWIgPT09ICdTdG9yZScgPyBmaWx0ZXJlZFN0b3JlUGVyZi5sZW5ndGggOiBmaWx0ZXJlZFVzZXJQZXJmLmxlbmd0aCkgfX0gVG90YWxcclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY2FyZC1zdWJcIj57eyBwZXJmUGVyaW9kIH19PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYXYyLWdyb3dcIj48L2Rpdj5cclxuICAgICAgPGxhYmVsIGNsYXNzPVwiYXYyLXNlYXJjaCBkYi1wZXJmLXNlYXJjaFwiPlxyXG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+XHJcbiAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTFcIiBjeT1cIjExXCIgcj1cIjdcIj48L2NpcmNsZT5cclxuICAgICAgICAgIDxsaW5lIHgxPVwiMTYuNVwiIHkxPVwiMTYuNVwiIHgyPVwiMjFcIiB5Mj1cIjIxXCI+PC9saW5lPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFtwbGFjZWhvbGRlcl09XCJwZXJmU2VhcmNoUGxhY2Vob2xkZXJcIiBbKG5nTW9kZWwpXT1cInBlcmZTZWFyY2hcIiAobmdNb2RlbENoYW5nZSk9XCJvblBlcmZTZWFyY2goKVwiPlxyXG4gICAgICA8L2xhYmVsPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tZ2hvc3RcIiBbZGlzYWJsZWRdPVwicGVyZkxvYWRpbmcgfHwgIXBlcmZSb3dDb3VudFwiXHJcbiAgICAgICAgdGl0bGU9XCJEb3dubG9hZCB0aGlzIHRhYmxlIGFzIGFuIEV4Y2VsIGZpbGVcIiAoY2xpY2spPVwiZXhwb3J0UGVyZm9ybWFuY2UoKVwiPlxyXG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS44XCJcclxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgPHBhdGggZD1cIk0xMiAxNlY0XCI+PC9wYXRoPlxyXG4gICAgICAgICAgPHBvbHlsaW5lIHBvaW50cz1cIjcgOSAxMiA0IDE3IDlcIj48L3BvbHlsaW5lPlxyXG4gICAgICAgICAgPHBhdGggZD1cIk00IDE2djRoMTZ2LTRcIj48L3BhdGg+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgRXhwb3J0XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gZGItY3JlYXRlXCIgKm5nSWY9XCJwZXJmVGFiID09PSAnQXVkaXQnICYmIGFjY2Vzcy5jYW5BZGRcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS90cmF4L2F1ZGl0LXYyL21hbmFnZVwiPlxyXG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMi4yXCJcclxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48cGF0aCBkPVwiTTEyIDV2MTRNNSAxMmgxNFwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICB7eyBwZXJmQ3JlYXRlTGFiZWwgfX1cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8bGliLWF1ZGl0LXYyLXNoaW1tZXIgKm5nSWY9XCJwZXJmTG9hZGluZ1wiPjwvbGliLWF1ZGl0LXYyLXNoaW1tZXI+XHJcblxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFwZXJmTG9hZGluZ1wiPlxyXG4gICAgPCEtLSBBdWRpdCBQZXJmb3JtYW5jZSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJhdjItdGFibGUtd3JhcFwiICpuZ0lmPVwicGVyZlRhYiA9PT0gJ0F1ZGl0JyAmJiAhaXNUYXNrTW9kdWxlXCI+XHJcbiAgICAgIDx0YWJsZSBjbGFzcz1cImRiLXBlcmZ0YWJsZSBkYi1wZXJmdGFibGUtLWF1ZGl0XCI+XHJcbiAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IGMgb2YgYXVkaXRQZXJmQ29sc1wiIGNsYXNzPVwiaXMtc29ydGFibGVcIiBbY2xhc3MuaXMtc29ydGVkXT1cInBlcmZTb3J0S2V5ID09PSBjLmtleVwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNvcnRQZXJmKGMua2V5KVwiPnt7IGMubGFiZWwgfX0gPGxpYi1hdWRpdC12Mi1zb3J0LWljb24gW2FjdGl2ZV09XCJwZXJmU29ydEtleSA9PT0gYy5rZXlcIiBbZGlyXT1cInBlcmZTb3J0RGlyXCI+PC9saWItYXVkaXQtdjItc29ydC1pY29uPjwvdGg+XHJcbiAgICAgICAgICAgIDx0aD5BY3Rpb248L3RoPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcm93IG9mIHBlcmZQYWdlT2YoZmlsdGVyZWRBdWRpdFBlcmYpOyB0cmFja0J5OiB0cmFja0J5UGVyZkF1ZGl0XCI+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItbmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1hdmF0YXJcIj57eyByb3cuaW5pdGlhbHMgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRiLWxpbmtcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS90cmF4L2F1ZGl0LXYyL2Rhc2hib2FyZC9hdWRpdFwiXHJcbiAgICAgICAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJkZXRhaWxQYXJhbXMoeyBjaGVja2xpc3RJZDogcm93LnJhdz8uc291cmNlQ2hlY2tMaXN0X2lkIHx8IHJvdy5yYXc/Ll9pZCB9KVwiPnt7IHJvdy5uYW1lIH19PC9hPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgcm93LmFzc2lnbmVkIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDwhLS0gT3BlbnMgdGhlIGF1ZGl0J3MgZGV0YWlsIHBhZ2UgKGFzIHRoZSBleWUgZG9lcykgb24gaXRzIHN1Ym1pdHRlZCB2aXNpdHMsIGFzIHRoZSB2MSBDaGVja2xpc3QgZGFzaGJvYXJkIGRpZC4gLS0+XHJcbiAgICAgICAgICAgICAgPGEgKm5nSWY9XCJyb3cuc3VibWl0dGVkXCIgY2xhc3M9XCJkYi11bGlua1wiIHJvdXRlckxpbms9XCIvbWFuYWdlL3RyYXgvYXVkaXQtdjIvZGFzaGJvYXJkL2F1ZGl0XCJcclxuICAgICAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJkZXRhaWxQYXJhbXMoeyBjaGVja2xpc3RJZDogcm93LnJhdz8uc291cmNlQ2hlY2tMaXN0X2lkIHx8IHJvdy5yYXc/Ll9pZCwgc3RhdHVzOiAnc3VibWl0JyB9KVwiXHJcbiAgICAgICAgICAgICAgICB0aXRsZT1cIlZpZXcgdGhlIHN1Ym1pdHRlZCB2aXNpdHNcIj57eyByb3cuc3VibWl0dGVkIH19PC9hPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIXJvdy5zdWJtaXR0ZWRcIj4wPC9zcGFuPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8IS0tIFN0b3JlIGRpc3B1dGVzIChxdWVzdGlvbnMpIGluIHRoZSBwZXJpb2QsIGFzIGEgcGxhaW4gY291bnQgKFFBIDEwIE9jdDogbm8gbGluaykuIC0tPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3cuZGlzcHV0ZXMgPT09IG51bGxcIiBjbGFzcz1cImF2Mi1mYWludFwiPuKAlDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJvdy5kaXNwdXRlcyAhPT0gbnVsbFwiPnt7IHJvdy5kaXNwdXRlcyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkPnt7IHJvdy5wYXNzTWFyayB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc2NvcmVcIiBbY2xhc3MuaXMtZW1wdHldPVwicm93LnNjb3JlID09PSAn4oCUJ1wiXHJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwicm93LnNjb3JlID09PSAn4oCUJyA/ICdDb21wbGlhbmNlIHNjb3JlIGlzIG9mZiBmb3IgdGhpcyBhdWRpdCcgOiAnJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi10cmFjayBkYi10cmFjay0tNlwiPjxzcGFuIFtzdHlsZS53aWR0aF09XCJiYXJXaWR0aChyb3cuc2NvcmVQY3QpXCJcclxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJyb3cucmVzdWx0ID09PSAnUGFzcycgPyAnIzEyQjc2QScgOiAnI0YwNDQzOCdcIj48L3NwYW4+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1zY29yZXRleHRcIj57eyByb3cuc2NvcmUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJvdy5yZXN1bHQgIT09ICfigJQnXCIgY2xhc3M9XCJkYi1waWxsIGRiLXBpbGwtLXN0cm9uZ1wiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cInJvdy5yZXN1bHQgPT09ICdQYXNzJyA/ICcjRUNGREYzJyA6ICcjRkVGM0YyJ1wiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwicm93LnJlc3VsdCA9PT0gJ1Bhc3MnID8gJyMwMjdBNDgnIDogJyNCNDIzMTgnXCI+e3sgcm93LnJlc3VsdCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJvdy5yZXN1bHQgPT09ICfigJQnXCIgY2xhc3M9XCJhdjItZmFpbnRcIiB0aXRsZT1cIkNvbXBsaWFuY2Ugc2NvcmUgaXMgb2ZmIGZvciB0aGlzIGF1ZGl0XCI+4oCUPC9zcGFuPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkYi1leWVcIiB0aXRsZT1cIlZpZXcgYXVkaXRcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS90cmF4L2F1ZGl0LXYyL2Rhc2hib2FyZC9hdWRpdFwiXHJcbiAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiZGV0YWlsUGFyYW1zKHsgY2hlY2tsaXN0SWQ6IHJvdy5yYXc/LnNvdXJjZUNoZWNrTGlzdF9pZCB8fCByb3cucmF3Py5faWQgfSlcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE3XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS45XCJcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMS41IDEyUzUgNS41IDEyIDUuNSAyMi41IDEyIDIyLjUgMTIgMTkgMTguNSAxMiAxOC41IDEuNSAxMiAxLjUgMTJ6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjNcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90Ym9keT5cclxuICAgICAgPC90YWJsZT5cclxuICAgICAgPGRpdiAqbmdJZj1cIiFmaWx0ZXJlZEF1ZGl0UGVyZi5sZW5ndGhcIiBjbGFzcz1cImF2Mi1lbXB0eVwiPlxyXG4gICAgICAgIDxpbWcgY2xhc3M9XCJhdjItZW1wdHktaW1nXCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvTm9kYXRhMS5zdmdcIiBhbHQ9XCJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXRleHRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktdGl0bGVcIj5ObyBkYXRhIGZvdW5kPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXN1YlwiPnt7IHBlcmZTZWFyY2gudHJpbSgpID8gJ05vIGF1ZGl0IG1hdGNoZXMgdGhpcyBzZWFyY2guJyA6ICdUaGVyZSBpcyBubyByZXN1bHQgZm9yIEF1ZGl0IFBlcmZvcm1hbmNlIGluIHRoaXMgcGVyaW9kLicgfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFRhc2sgUGVyZm9ybWFuY2UgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXYyLXRhYmxlLXdyYXBcIiAqbmdJZj1cInBlcmZUYWIgPT09ICdBdWRpdCcgJiYgaXNUYXNrTW9kdWxlXCI+XHJcbiAgICAgIDx0YWJsZSBjbGFzcz1cImRiLXBlcmZ0YWJsZSBkYi1wZXJmdGFibGUtLXRhc2tcIj5cclxuICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgIDx0aCAqbmdGb3I9XCJsZXQgYyBvZiB0YXNrUGVyZkNvbHNcIiBjbGFzcz1cImlzLXNvcnRhYmxlXCIgW2NsYXNzLmlzLXNvcnRlZF09XCJwZXJmU29ydEtleSA9PT0gYy5rZXlcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJzb3J0UGVyZihjLmtleSlcIj57eyBjLmxhYmVsIH19IDxsaWItYXVkaXQtdjItc29ydC1pY29uIFthY3RpdmVdPVwicGVyZlNvcnRLZXkgPT09IGMua2V5XCIgW2Rpcl09XCJwZXJmU29ydERpclwiPjwvbGliLWF1ZGl0LXYyLXNvcnQtaWNvbj48L3RoPlxyXG4gICAgICAgICAgICA8dGg+QWN0aW9uPC90aD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90aGVhZD5cclxuICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiBwZXJmUGFnZU9mKGZpbHRlcmVkVGFza1BlcmYpOyB0cmFja0J5OiB0cmFja0J5UGVyZlRhc2tcIj5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1uYW1lXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWF2YXRhclwiPnt7IHJvdy5pbml0aWFscyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZGItbGlua1wiIFt0aXRsZV09XCJyb3cucmF3Py5hdWRpdE5hbWUgPyAnUmFpc2VkIGZyb20gJyArIHJvdy5yYXcuYXVkaXROYW1lIDogJydcIj57eyByb3cubmFtZSB9fTwvYT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkPnt7IHJvdy5zY2hlZHVsZWQgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJkYi1tZWRpdW1cIj57eyByb3cuY292ZXJhZ2UgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgcm93LmFzc2lnbmVkIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDwhLS0gT3BlbnMgdGhlIEdhbGxlcnkgKFR5cGUgVGFzaykgb24gdGhpcyB0YXNrJ3Mgc3VibWlzc2lvbnMgaW4gdGhlIGRhc2hib2FyZCBwZXJpb2QuIC0tPlxyXG4gICAgICAgICAgICAgIDxhICpuZ0lmPVwicm93LnN1Ym1pdHRlZCAmJiByb3cucmF3Py50YXNrSWRcIiBjbGFzcz1cImRiLXVsaW5rXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvdHJheC9hdWRpdC12Mi9nYWxsZXJ5XCJcclxuICAgICAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJ0YXNrU3VibWl0dGVkUGFyYW1zKHJvdylcIiB0aXRsZT1cIlZpZXcgdGhlIHN1Ym1pdHRlZCB0YXNrcyBpbiB0aGUgR2FsbGVyeVwiPnt7IHJvdy5zdWJtaXR0ZWQgfX08L2E+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhcm93LnN1Ym1pdHRlZCB8fCAhcm93LnJhdz8udGFza0lkXCI+e3sgcm93LnN1Ym1pdHRlZCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkPjxhIGNsYXNzPVwiZGItdWxpbmtcIj57eyByb3cuZmxhZ3MgfX08L2E+PC90ZD5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiYXYyLWZhaW50XCI+e3sgcm93LnRhc2tzIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPjxhIGNsYXNzPVwiZGItdWxpbmtcIj57eyByb3cucmVkbyB9fTwvYT48L3RkPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXNjb3JlXCIgW2NsYXNzLmlzLWVtcHR5XT1cInJvdy5jb21wbGlhbmNlID09PSAn4oCUJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi10cmFjayBkYi10cmFjay0tNlwiPjxzcGFuIFtzdHlsZS53aWR0aF09XCJiYXJXaWR0aChyb3cuY29tcGxpYW5jZVBjdClcIj48L3NwYW4+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1zY29yZXRleHRcIj57eyByb3cuY29tcGxpYW5jZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDwhLS0gT3BlbnMgdGhlIGF1ZGl0IHRoZSB0YXNrIHdhcyByYWlzZWQgZnJvbS4gLS0+XHJcbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkYi1leWVcIiB0aXRsZT1cIlZpZXcgdGhlIGF1ZGl0IHRoaXMgdGFzayB3YXMgcmFpc2VkIGZyb21cIlxyXG4gICAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwicm93LnJhdz8uYXVkaXRJZCA/ICcvbWFuYWdlL3RyYXgvYXVkaXQtdjIvZGFzaGJvYXJkL2F1ZGl0JyA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cImRldGFpbFBhcmFtcyh7IGNoZWNrbGlzdElkOiByb3cucmF3Py5hdWRpdElkIH0pXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTdcIiBoZWlnaHQ9XCIxN1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuOVwiXHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEuNSAxMlM1IDUuNSAxMiA1LjUgMjIuNSAxMiAyMi41IDEyIDE5IDE4LjUgMTIgMTguNSAxLjUgMTIgMS41IDEyelwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIzXCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGJvZHk+XHJcbiAgICAgIDwvdGFibGU+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCIhZmlsdGVyZWRUYXNrUGVyZi5sZW5ndGhcIiBjbGFzcz1cImF2Mi1lbXB0eVwiPlxyXG4gICAgICAgIDxpbWcgY2xhc3M9XCJhdjItZW1wdHktaW1nXCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvTm9kYXRhMS5zdmdcIiBhbHQ9XCJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXRleHRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktdGl0bGVcIj5ObyBkYXRhIGZvdW5kPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXN1YlwiPk5vIHRhc2tzIHJhaXNlZCBmcm9tIGF1ZGl0cyBpbiB0aGlzIHBlcmlvZC48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFN0b3JlIFBlcmZvcm1hbmNlIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImF2Mi10YWJsZS13cmFwXCIgKm5nSWY9XCJwZXJmVGFiID09PSAnU3RvcmUnXCI+XHJcbiAgICAgIDx0YWJsZSBjbGFzcz1cImRiLXBlcmZ0YWJsZSBkYi1wZXJmdGFibGUtLXN0b3JlXCI+XHJcbiAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IGMgb2Ygc3RvcmVQZXJmQ29sc1wiIGNsYXNzPVwiaXMtc29ydGFibGVcIiBbY2xhc3MuaXMtc29ydGVkXT1cInBlcmZTb3J0S2V5ID09PSBjLmtleVwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNvcnRQZXJmKGMua2V5KVwiPnt7IGMubGFiZWwgfX0gPGxpYi1hdWRpdC12Mi1zb3J0LWljb24gW2FjdGl2ZV09XCJwZXJmU29ydEtleSA9PT0gYy5rZXlcIiBbZGlyXT1cInBlcmZTb3J0RGlyXCI+PC9saWItYXVkaXQtdjItc29ydC1pY29uPjwvdGg+XHJcbiAgICAgICAgICAgIDx0aD5BY3Rpb248L3RoPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcm93IG9mIHBlcmZQYWdlT2YoZmlsdGVyZWRTdG9yZVBlcmYpOyB0cmFja0J5OiB0cmFja0J5UGVyZlN0b3JlXCI+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8YSBjbGFzcz1cImRiLWxpbmtcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS90cmF4L2F1ZGl0LXYyL2Rhc2hib2FyZC9zdG9yZVwiIFtxdWVyeVBhcmFtc109XCJkZXRhaWxQYXJhbXMoeyBzdG9yZTogcm93LnN0b3JlSWQgfHwgcm93LnN0b3JlIH0pXCI+e3sgcm93LnN0b3JlIH19PC9hPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJhdjItZWxsaXBzaXMgYXYyLWRpbVwiIFthdjJUaXBdPVwicm93LnN0b3JlSWRcIj57eyByb3cuc3RvcmVJZCB8fCAn4oCUJyB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImF2Mi1lbGxpcHNpcyBhdjItZGltXCI+e3sgcm93LnNwb2MgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgcm93LmFzc2lnbmVkIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPnt7IHJvdy5mbGFncyA/PyAn4oCUJyB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD48ZGl2IGNsYXNzPVwiZGItc2NvcmVcIiBbY2xhc3MuaXMtZW1wdHldPVwicm93LmNvbXBsZXRpb24gPT09ICfigJQnXCI+PHNwYW4gY2xhc3M9XCJkYi10cmFja1wiPjxzcGFuIFtzdHlsZS53aWR0aF09XCJiYXJXaWR0aChyb3cuY29tcGxldGlvbilcIj48L3NwYW4+PC9zcGFuPjxzcGFuIGNsYXNzPVwiZGItc2NvcmV0ZXh0IGRiLXNjb3JldGV4dC0tc21cIj57eyByb3cuY29tcGxldGlvbiB9fTwvc3Bhbj48L2Rpdj48L3RkPlxyXG4gICAgICAgICAgICA8dGQ+PGRpdiBjbGFzcz1cImRiLXNjb3JlXCIgW2NsYXNzLmlzLWVtcHR5XT1cInJvdy5jb21wbGlhbmNlID09PSAn4oCUJ1wiPjxzcGFuIGNsYXNzPVwiZGItdHJhY2tcIj48c3BhbiBbc3R5bGUud2lkdGhdPVwiYmFyV2lkdGgocm93LmNvbXBsaWFuY2UpXCI+PC9zcGFuPjwvc3Bhbj48c3BhbiBjbGFzcz1cImRiLXNjb3JldGV4dCBkYi1zY29yZXRleHQtLXNtXCI+e3sgcm93LmNvbXBsaWFuY2UgfX08L3NwYW4+PC9kaXY+PC90ZD5cclxuICAgICAgICAgICAgPHRkPjxkaXYgY2xhc3M9XCJkYi1zY29yZVwiIFtjbGFzcy5pcy1lbXB0eV09XCJyb3cucGVyZiA9PT0gJ+KAlCdcIj48c3BhbiBjbGFzcz1cImRiLXRyYWNrXCI+PHNwYW4gW3N0eWxlLndpZHRoXT1cImJhcldpZHRoKHJvdy5wZXJmKVwiPjwvc3Bhbj48L3NwYW4+PHNwYW4gY2xhc3M9XCJkYi1zY29yZXRleHQgZGItc2NvcmV0ZXh0LS1zbVwiPnt7IHJvdy5wZXJmIH19PC9zcGFuPjwvZGl2PjwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8YSBjbGFzcz1cImRiLWV5ZVwiIHRpdGxlPVwiVmlldyBzdG9yZVwiIHJvdXRlckxpbms9XCIvbWFuYWdlL3RyYXgvYXVkaXQtdjIvZGFzaGJvYXJkL3N0b3JlXCIgW3F1ZXJ5UGFyYW1zXT1cImRldGFpbFBhcmFtcyh7IHN0b3JlOiByb3cuc3RvcmVJZCB8fCByb3cuc3RvcmUgfSlcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE3XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS45XCJcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMS41IDEyUzUgNS41IDEyIDUuNSAyMi41IDEyIDIyLjUgMTIgMTkgMTguNSAxMiAxOC41IDEuNSAxMiAxLjUgMTJ6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjNcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90Ym9keT5cclxuICAgICAgPC90YWJsZT5cclxuICAgICAgPGRpdiAqbmdJZj1cIiFmaWx0ZXJlZFN0b3JlUGVyZi5sZW5ndGhcIiBjbGFzcz1cImF2Mi1lbXB0eVwiPlxyXG4gICAgICAgIDxpbWcgY2xhc3M9XCJhdjItZW1wdHktaW1nXCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvTm9kYXRhMS5zdmdcIiBhbHQ9XCJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXRleHRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktdGl0bGVcIj5ObyBkYXRhIGZvdW5kPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXN1YlwiPnt7IHBlcmZTZWFyY2gudHJpbSgpID8gJ05vIHN0b3JlIG1hdGNoZXMgdGhpcyBzZWFyY2guJyA6ICdUaGVyZSBpcyBubyByZXN1bHQgZm9yIFN0b3JlIFBlcmZvcm1hbmNlIGluIHRoaXMgcGVyaW9kLicgfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFVzZXIgUGVyZm9ybWFuY2UgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXYyLXRhYmxlLXdyYXBcIiAqbmdJZj1cInBlcmZUYWIgPT09ICdVc2VyJ1wiPlxyXG4gICAgICA8dGFibGUgY2xhc3M9XCJkYi1wZXJmdGFibGUgZGItcGVyZnRhYmxlLS11c2VyXCI+XHJcbiAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IGMgb2YgdXNlclBlcmZDb2xzXCIgY2xhc3M9XCJpcy1zb3J0YWJsZVwiIFtjbGFzcy5pcy1zb3J0ZWRdPVwicGVyZlNvcnRLZXkgPT09IGMua2V5XCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwic29ydFBlcmYoYy5rZXkpXCI+e3sgYy5sYWJlbCB9fSA8bGliLWF1ZGl0LXYyLXNvcnQtaWNvbiBbYWN0aXZlXT1cInBlcmZTb3J0S2V5ID09PSBjLmtleVwiIFtkaXJdPVwicGVyZlNvcnREaXJcIj48L2xpYi1hdWRpdC12Mi1zb3J0LWljb24+PC90aD5cclxuICAgICAgICAgICAgPHRoPkFjdGlvbjwvdGg+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByb3cgb2YgcGVyZlBhZ2VPZihmaWx0ZXJlZFVzZXJQZXJmKTsgdHJhY2tCeTogdHJhY2tCeVBlcmZVc2VyXCI+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImF2Mi1lbGxpcHNpc1wiPjxhIGNsYXNzPVwiZGItbGlua1wiIHJvdXRlckxpbms9XCIvbWFuYWdlL3RyYXgvYXVkaXQtdjIvZGFzaGJvYXJkL3VzZXJcIiBbcXVlcnlQYXJhbXNdPVwiZGV0YWlsUGFyYW1zKHsgZW1haWw6IHJvdy5lbWFpbCB9KVwiPnt7IHJvdy5uYW1lIH19PC9hPjwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImF2Mi1lbGxpcHNpcyBhdjItZGltXCI+e3sgcm93LmVtYWlsIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPnt7IHJvdy5hc3NpZ25lZCB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyByb3cuZmxhZ3MgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgcm93LnJlZG8gfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+PGRpdiBjbGFzcz1cImRiLXNjb3JlXCIgW2NsYXNzLmlzLWVtcHR5XT1cInJvdy5jb21wbGV0aW9uID09PSAn4oCUJ1wiPjxzcGFuIGNsYXNzPVwiZGItdHJhY2tcIj48c3BhbiBbc3R5bGUud2lkdGhdPVwiYmFyV2lkdGgocm93LmNvbXBsZXRpb24pXCI+PC9zcGFuPjwvc3Bhbj48c3BhbiBjbGFzcz1cImRiLXNjb3JldGV4dCBkYi1zY29yZXRleHQtLXNtXCI+e3sgcm93LmNvbXBsZXRpb24gfX08L3NwYW4+PC9kaXY+PC90ZD5cclxuICAgICAgICAgICAgPHRkPjxkaXYgY2xhc3M9XCJkYi1zY29yZVwiIFtjbGFzcy5pcy1lbXB0eV09XCJyb3cuY29tcGxpYW5jZSA9PT0gJ+KAlCdcIj48c3BhbiBjbGFzcz1cImRiLXRyYWNrXCI+PHNwYW4gW3N0eWxlLndpZHRoXT1cImJhcldpZHRoKHJvdy5jb21wbGlhbmNlKVwiPjwvc3Bhbj48L3NwYW4+PHNwYW4gY2xhc3M9XCJkYi1zY29yZXRleHQgZGItc2NvcmV0ZXh0LS1zbVwiPnt7IHJvdy5jb21wbGlhbmNlIH19PC9zcGFuPjwvZGl2PjwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD48ZGl2IGNsYXNzPVwiZGItc2NvcmVcIiBbY2xhc3MuaXMtZW1wdHldPVwicm93LnBlcmYgPT09ICfigJQnXCI+PHNwYW4gY2xhc3M9XCJkYi10cmFja1wiPjxzcGFuIFtzdHlsZS53aWR0aF09XCJiYXJXaWR0aChyb3cucGVyZilcIj48L3NwYW4+PC9zcGFuPjxzcGFuIGNsYXNzPVwiZGItc2NvcmV0ZXh0IGRiLXNjb3JldGV4dC0tc21cIj57eyByb3cucGVyZiB9fTwvc3Bhbj48L2Rpdj48L3RkPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkYi1leWVcIiB0aXRsZT1cIlZpZXcgdXNlclwiIHJvdXRlckxpbms9XCIvbWFuYWdlL3RyYXgvYXVkaXQtdjIvZGFzaGJvYXJkL3VzZXJcIiBbcXVlcnlQYXJhbXNdPVwiZGV0YWlsUGFyYW1zKHsgZW1haWw6IHJvdy5lbWFpbCB9KVwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE3XCIgaGVpZ2h0PVwiMTdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjlcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cclxuICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xLjUgMTJTNSA1LjUgMTIgNS41IDIyLjUgMTIgMjIuNSAxMiAxOSAxOC41IDEyIDE4LjUgMS41IDEyIDEuNSAxMnpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiM1wiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3Rib2R5PlxyXG4gICAgICA8L3RhYmxlPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiIWZpbHRlcmVkVXNlclBlcmYubGVuZ3RoXCIgY2xhc3M9XCJhdjItZW1wdHlcIj5cclxuICAgICAgICA8aW1nIGNsYXNzPVwiYXYyLWVtcHR5LWltZ1wiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YTEuc3ZnXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS10ZXh0XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXRpdGxlXCI+Tm8gZGF0YSBmb3VuZDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS1zdWJcIj57eyBwZXJmU2VhcmNoLnRyaW0oKSA/ICdObyB1c2VyIG1hdGNoZXMgdGhpcyBzZWFyY2guJyA6ICdUaGVyZSBpcyBubyByZXN1bHQgZm9yIFVzZXIgUGVyZm9ybWFuY2UgaW4gdGhpcyBwZXJpb2QuJyB9fTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gU2hhcmVkIHBhZ2VyICgxMCAvIDIwIC8gMzApLCBhcyBvbiB0aGUgb3RoZXIgYXVkaXQgbGlzdHMuIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImRiLXBlcmYtcGFnZXJcIiAqbmdJZj1cInBlcmZUb3RhbFwiPlxyXG4gICAgICA8bGliLXBhZ2luYXRpb24gW2l0ZW1zUGVyUGFnZV09XCJwZXJmUGFnZVNpemVcIiBbcGFnZVNpemVdPVwicGVyZlBhZ2VTaXplXCIgW3BhZ2luYXRpb25TaXplc109XCJwZXJmUGFnZVNpemVzXCJcclxuICAgICAgICBbY3VycmVudFBhZ2VdPVwicGVyZlBhZ2VcIiBbdG90YWxJdGVtc109XCJwZXJmVG90YWxcIiAocGFnZUNoYW5nZSk9XCJvblBlcmZQYWdlKCRldmVudClcIlxyXG4gICAgICAgIChwYWdlU2l6ZUNoYW5nZSk9XCJvblBlcmZQYWdlU2l6ZSgkZXZlbnQpXCI+PC9saWItcGFnaW5hdGlvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgPC9zZWN0aW9uPlxyXG5cclxuICA8IS0tID09PT09PT09PT09PSBGSUxURVIgRFJBV0VSID09PT09PT09PT09PSAtLT5cclxuICA8ZGl2IGNsYXNzPVwiZmlsdGVyLWJhY2tkcm9wXCIgKm5nSWY9XCJmaWx0ZXJzT3BlblwiIChjbGljayk9XCJjYW5jZWxGaWx0ZXJzKClcIj48L2Rpdj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImZpbHRlci1kcmF3ZXJcIiAqbmdJZj1cImZpbHRlcnNPcGVuICYmIGRyYWZ0IGFzIGRyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZHJhd2VyLWhlYWRcIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJkcmF3ZXItdGl0bGVcIj5GaWx0ZXJzPC9zcGFuPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImRiLWNvdW50cGlsbFwiICpuZ0lmPVwiZHIuZmlsdGVyQ291bnRcIj57eyBkci5maWx0ZXJDb3VudCB9fTwvc3Bhbj5cclxuICAgICAgPGRpdiBjbGFzcz1cImF2Mi1ncm93XCI+PC9kaXY+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2VidG5cIiAoY2xpY2spPVwiY2FuY2VsRmlsdGVycygpXCIgdGl0bGU9XCJDbG9zZVwiPlxyXG4gICAgICAgIDxzdmcgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+PGxpbmUgeDE9XCI2XCIgeTE9XCI2XCIgeDI9XCIxOFwiIHkyPVwiMThcIj48L2xpbmU+PGxpbmUgeDE9XCIxOFwiIHkxPVwiNlwiIHgyPVwiNlwiIHkyPVwiMThcIj48L2xpbmU+PC9zdmc+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImRyYXdlci1ib2R5XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkcmF3ZXItbmF2XCI+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJkcmF3ZXItbmF2aXRlbVwiICpuZ0Zvcj1cImxldCBjIG9mIGRyLmZpbHRlckNhdHM7IHRyYWNrQnk6IHRyYWNrQnlDYXRcIiBbY2xhc3MubmF2aXRlbS1hY3RpdmVdPVwiYWN0aXZlQ2F0ID09PSBjLmtleVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwic2VsZWN0Q2F0KGMua2V5KVwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJuYXZ0ZXh0XCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmF2dGl0bGVcIj57eyBjLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5hdnZhbHVlXCIgW2NsYXNzLmlzLWRpcnR5XT1cImMuZGlydHlcIj57eyBjLnZhbHVlIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkaXJ0eWRvdFwiICpuZ0lmPVwiYy5kaXJ0eVwiPjwvc3Bhbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZHJhd2VyLXBhbmVcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZXRpdGxlXCI+e3sgZHIuYWN0aXZlQ2F0T2JqLnRpdGxlIH19PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVoaW50XCI+e3sgZHIuYWN0aXZlQ2F0T2JqLnN1YiB9fTwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFBlcmlvZCAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aXZlQ2F0ID09PSAncGVyaW9kJ1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmUtb3B0aW9uc1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZS1vcHRpb25cIiBbY2xhc3MuaXMtb25dPVwiZHIuZ3JhaW4gPT09ICdxdWFydGVyJ1wiIChjbGljayk9XCJkci5zZXRHcmFpbigncXVhcnRlcicpXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYW5lLXJhZGlvXCIgW2NsYXNzLmlzLW9uXT1cImRyLmdyYWluID09PSAncXVhcnRlcidcIj48c3Bhbj48L3NwYW4+PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZS1vcHRpb24tdGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYW5lLW9wdGlvbi1sYWJlbFwiPlF1YXJ0ZXJseTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZS1vcHRpb24taGVscFwiPlJlYWQgb25lIGZpbmFuY2lhbCBxdWFydGVyIChBcHJpbOKAk01hcmNoIHllYXIpIGF0IGEgdGltZS48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmUtb3B0aW9uXCIgW2NsYXNzLmlzLW9uXT1cImRyLmdyYWluID09PSAnZGF0ZSdcIiAoY2xpY2spPVwiZHIuc2V0R3JhaW4oJ2RhdGUnKVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZS1yYWRpb1wiIFtjbGFzcy5pcy1vbl09XCJkci5ncmFpbiA9PT0gJ2RhdGUnXCI+PHNwYW4+PC9zcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbmUtb3B0aW9uLXRleHRcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZS1vcHRpb24tbGFiZWxcIj5CeSBkYXRlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYW5lLW9wdGlvbi1oZWxwXCI+UGljayBhIGN1c3RvbSBzdGFydCBhbmQgZW5kIGRhdGUuPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZS1saXN0XCIgKm5nSWY9XCJkci5ncmFpbiA9PT0gJ3F1YXJ0ZXInXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3B0aW9ucm93XCIgKm5nRm9yPVwibGV0IHEgb2YgZHIucXVhcnRlcnNcIiBbY2xhc3Mub3B0aW9uLXNlbGVjdGVkXT1cImRyLnF1YXJ0ZXIgPT09IHFcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJkci5zZWxlY3RRdWFydGVyKHEpXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRpb25tYXJrXCIgW2NsYXNzLm1hcmstb25dPVwiZHIucXVhcnRlciA9PT0gcVwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImRyLnF1YXJ0ZXIgPT09IHFcIiB3aWR0aD1cIjExXCIgaGVpZ2h0PVwiMTFcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRsYWJlbFwiPnt7IHEgfX0gwrcge3sgcXVhcnRlck1vbnRocyhxKSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZS1maWVsZHNcIiAqbmdJZj1cImRyLmdyYWluID09PSAnZGF0ZSdcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWVsZC1sYWJlbFwiPkRhdGUgcmFuZ2U8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1kYXRlcGljayBhdjItZGF0ZXBpY2stLWNvbXBhY3RcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJhdjItZGF0ZXBpY2staWNvblwiIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cmVjdCB4PVwiM1wiIHk9XCI0XCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgcng9XCIyXCI+PC9yZWN0PlxyXG4gICAgICAgICAgICAgICAgICA8bGluZSB4MT1cIjE2XCIgeTE9XCIyXCIgeDI9XCIxNlwiIHkyPVwiNlwiPjwvbGluZT48bGluZSB4MT1cIjhcIiB5MT1cIjJcIiB4Mj1cIjhcIiB5Mj1cIjZcIj48L2xpbmU+PGxpbmUgeDE9XCIzXCIgeTE9XCIxMFwiIHgyPVwiMjFcIiB5Mj1cIjEwXCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJhdjItZGF0ZXBpY2staW5wdXQgZGItZGF0ZXJhbmdlIGRiLWRhdGVyYW5nZS0tZmllbGRcIiBuZ3hEYXRlcmFuZ2VwaWNrZXJNZCByZWFkb25seVxyXG4gICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIiBwbGFjZWhvbGRlcj1cIlNlbGVjdCBkYXRlIHJhbmdlXCIgWyhuZ01vZGVsKV09XCJkci5yYW5nZVwiIFtsb2NhbGVdPVwicGlja2VyTG9jYWxlXCJcclxuICAgICAgICAgICAgICAgICAgW21heERhdGVdPVwidG9kYXlcIiBbZGF0ZUxpbWl0XT1cIm1heFJhbmdlRGF5c1wiIFthdXRvQXBwbHldPVwidHJ1ZVwiIFthbHdheXNTaG93Q2FsZW5kYXJzXT1cInRydWVcIiBbc2hvd0NhbmNlbF09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgIFtkcm9wc109XCInZG93bidcIiBbb3BlbnNdPVwiJ3JpZ2h0J1wiIChkYXRlc1VwZGF0ZWQpPVwiZHIub25SYW5nZVBpY2tlZCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDwhLS0gU2NvcGUgLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjdGl2ZUNhdCA9PT0gJ3Njb3BlJ1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmUtc3RhY2tcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGZpZWxkLS1mdWxsXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWVsZC1sYWJlbFwiPkNpcmNsZSBIZWFkIDxzcGFuIGNsYXNzPVwiZmllbGQtbWV0YVwiPnt7IGRyLmNpcmNsZXMubGVuZ3RoIH19IHVzZXJzPC9zcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8bGliLWF1ZGl0LXYyLXNlbGVjdCBjbGFzcz1cImZpZWxkLXNlbGVjdFwiIFsobmdNb2RlbCldPVwiZHIuY2lyY2xlXCIgKG5nTW9kZWxDaGFuZ2UpPVwiZHIub25DaXJjbGVDaGFuZ2UoKVwiIFtvcHRpb25zXT1cImRyLnBpY2tPcHRpb25zKGRyLmNpcmNsZXMsICdBbGwgQ2lyY2xlcycpXCIgYXJpYUxhYmVsPVwiQ2lyY2xlXCI+PC9saWItYXVkaXQtdjItc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGZpZWxkLS1mdWxsXCIgKm5nSWY9XCJkci5jaXJjbGVcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpZWxkLWxhYmVsXCI+Wm9uZSBNYW5hZ2VyPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxsaWItYXVkaXQtdjItc2VsZWN0IGNsYXNzPVwiZmllbGQtc2VsZWN0XCIgWyhuZ01vZGVsKV09XCJkci56b25lXCIgKG5nTW9kZWxDaGFuZ2UpPVwiZHIub25ab25lQ2hhbmdlKClcIiBbb3B0aW9uc109XCJkci5waWNrT3B0aW9ucyhkci56b25lcywgJ0FsbCB6b25lcycpXCIgYXJpYUxhYmVsPVwiWm9uZVwiPjwvbGliLWF1ZGl0LXYyLXNlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBmaWVsZC0tZnVsbFwiICpuZ0lmPVwiZHIuem9uZVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5BT008L3NwYW4+XHJcbiAgICAgICAgICAgICAgPGxpYi1hdWRpdC12Mi1zZWxlY3QgY2xhc3M9XCJmaWVsZC1zZWxlY3RcIiBbKG5nTW9kZWwpXT1cImRyLmFvbVwiIChuZ01vZGVsQ2hhbmdlKT1cImRyLm9uQW9tQ2hhbmdlKClcIiBbb3B0aW9uc109XCJkci5waWNrT3B0aW9ucyhkci5hb21zLCAnQWxsIEFPTXMnKVwiIGFyaWFMYWJlbD1cIkFPTVwiPjwvbGliLWF1ZGl0LXYyLXNlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBmaWVsZC0tZnVsbFwiICpuZ0lmPVwiZHIuYW9tXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWVsZC1sYWJlbFwiPlN0b3JlPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxsaWItYXVkaXQtdjItc2VsZWN0IGNsYXNzPVwiZmllbGQtc2VsZWN0XCIgWyhuZ01vZGVsKV09XCJkci5zdG9yZVwiIFtvcHRpb25zXT1cImRyLnN0b3JlUGlja09wdGlvbnNcIiBhcmlhTGFiZWw9XCJTdG9yZVwiPjwvbGliLWF1ZGl0LXYyLXNlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWFkaW5ncm93XCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZWFkaW5nbGFiZWxcIj5SZWFkaW5nPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVhZGluZ3ZhbHVlXCI+e3sgZHIuc2NvcGVSZWFkaW5nIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXYyLWdyb3dcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkYi1iYW5kbGlua1wiIChjbGljayk9XCJkci5yZXNldFNjb3BlKClcIj5SZXNldCB0byBhbGwgY2lyY2xlczwvYT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPCEtLSBBdWRpdCB0eXBlIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lLWxpc3RcIiAqbmdJZj1cImFjdGl2ZUNhdCA9PT0gJ3R5cGUnXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm9wdGlvbnJvd1wiICpuZ0Zvcj1cImxldCB0IG9mIGF1ZGl0VHlwZXNcIiBbY2xhc3Mub3B0aW9uLXNlbGVjdGVkXT1cImRyLmF1ZGl0VHlwZSA9PT0gdC5rZXlcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiZHIuYXVkaXRUeXBlID0gdC5rZXlcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRpb25tYXJrXCIgW2NsYXNzLm1hcmstb25dPVwiZHIuYXVkaXRUeXBlID09PSB0LmtleVwiPlxyXG4gICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJkci5hdWRpdFR5cGUgPT09IHQua2V5XCIgd2lkdGg9XCIxMVwiIGhlaWdodD1cIjExXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiMjAgNiA5IDE3IDQgMTJcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0dGV4dFwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0bGFiZWxcIj57eyB0LmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0bWV0YVwiPnt7IHQuaGVscCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gU2NvcmUgYmFuZCAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZS1saXN0XCIgKm5nSWY9XCJhY3RpdmVDYXQgPT09ICdiYW5kJ1wiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJvcHRpb25yb3dcIiAqbmdGb3I9XCJsZXQgYiBvZiBkci5iYW5kUm93czsgdHJhY2tCeTogdHJhY2tCeUJhbmRcIiBbY2xhc3Mub3B0aW9uLXNlbGVjdGVkXT1cImRyLmlzQmFuZE9uKGIuYmFuZClcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiZHIuYXBwbHlCYW5kKGIuYmFuZClcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1iYW5kZG90XCIgW3N0eWxlLmJhY2tncm91bmRdPVwiYi5iYW5kLnNvZnRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0dGV4dFwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0bGFiZWxcIj57eyBiLmJhbmQubGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRtZXRhXCI+e3sgYi5iYW5kLnJhbmdlIH19IMK3IHt7IGIuY291bnQgfX0gc3RvcmVzPC9zcGFuPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1naG9zdCBhdjItYnRuLS1zbSBwYW5lLXJlc2V0YnRuXCIgKGNsaWNrKT1cImRyLmNsZWFyQmFuZCgpXCI+QWxsIHNjb3JlczwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFN0YXR1cyAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZS1saXN0XCIgKm5nSWY9XCJhY3RpdmVDYXQgPT09ICdzdGF0dXMnXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm9wdGlvbnJvd1wiIFtjbGFzcy5vcHRpb24tc2VsZWN0ZWRdPVwiZHIuc3RhdHVzID09PSAnYWxsJ1wiIChjbGljayk9XCJkci5zZXRTdGF0dXMoJ2FsbCcpXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0aW9ubWFya1wiIFtjbGFzcy5tYXJrLW9uXT1cImRyLnN0YXR1cyA9PT0gJ2FsbCdcIj5cclxuICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiZHIuc3RhdHVzID09PSAnYWxsJ1wiIHdpZHRoPVwiMTFcIiBoZWlnaHQ9XCIxMVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGxhYmVsXCI+QWxsIHN0b3Jlczwvc3Bhbj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJvcHRpb25yb3dcIiBbY2xhc3Mub3B0aW9uLXNlbGVjdGVkXT1cImRyLnN0YXR1cyA9PT0gJ2ZhaWwnXCIgKGNsaWNrKT1cImRyLnNldFN0YXR1cygnZmFpbCcpXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0aW9ubWFya1wiIFtjbGFzcy5tYXJrLW9uXT1cImRyLnN0YXR1cyA9PT0gJ2ZhaWwnXCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImRyLnN0YXR1cyA9PT0gJ2ZhaWwnXCIgd2lkdGg9XCIxMVwiIGhlaWdodD1cIjExXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiMjAgNiA5IDE3IDQgMTJcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0bGFiZWxcIj5GYWlsPC9zcGFuPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm9wdGlvbnJvd1wiIFtjbGFzcy5vcHRpb24tc2VsZWN0ZWRdPVwiZHIuc3RhdHVzID09PSAncGFzcydcIiAoY2xpY2spPVwiZHIuc2V0U3RhdHVzKCdwYXNzJylcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRpb25tYXJrXCIgW2NsYXNzLm1hcmstb25dPVwiZHIuc3RhdHVzID09PSAncGFzcydcIj5cclxuICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiZHIuc3RhdHVzID09PSAncGFzcydcIiB3aWR0aD1cIjExXCIgaGVpZ2h0PVwiMTFcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRsYWJlbFwiPlBhc3M8L3NwYW4+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3B0aW9ucm93XCIgW2NsYXNzLm9wdGlvbi1zZWxlY3RlZF09XCJkci5zdGF0dXMgPT09ICduYSdcIiAoY2xpY2spPVwiZHIuc2V0U3RhdHVzKCduYScpXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0aW9ubWFya1wiIFtjbGFzcy5tYXJrLW9uXT1cImRyLnN0YXR1cyA9PT0gJ25hJ1wiPlxyXG4gICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJkci5zdGF0dXMgPT09ICduYSdcIiB3aWR0aD1cIjExXCIgaGVpZ2h0PVwiMTFcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRsYWJlbFwiPk5vdCBhdWRpdGVkPC9zcGFuPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImRyYXdlci1mb290XCI+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1naG9zdFwiIChjbGljayk9XCJkci5jbGVhckFsbCgpXCI+Q2xlYXIgYWxsPC9idXR0b24+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJhdjItZ3Jvd1wiPjwvZGl2PlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tZ2hvc3RcIiAoY2xpY2spPVwiY2FuY2VsRmlsdGVycygpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1wcmltYXJ5IGF2Mi1idG4tLXdpZGVcIiAoY2xpY2spPVwiYXBwbHlGaWx0ZXJzKClcIj5BcHBseSBmaWx0ZXJzPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbjwvZGl2PlxyXG4iXX0=