tango-app-ui-analyse-trax 4.0.64 → 4.0.65

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/esm2022/lib/components/audit-v2/audit-v2-access.mjs +5 -5
  2. package/esm2022/lib/components/audit-v2/dashboard/audit-v2-dashboard.component.mjs +31 -10
  3. package/esm2022/lib/components/audit-v2/detail/audit-v2-detail.component.mjs +9 -5
  4. package/esm2022/lib/components/audit-v2/flags/flag-detail/audit-v2-flag-detail.component.mjs +3 -2
  5. package/esm2022/lib/components/audit-v2/gallery/audit-v2-gallery.component.mjs +109 -10
  6. package/esm2022/lib/components/audit-v2/reports/audit-v2-reports.component.mjs +14 -5
  7. package/esm2022/lib/components/dashboard/dashboard.component.mjs +132 -56
  8. package/esm2022/lib/components/flags-new/flags-new.component.mjs +205 -35
  9. package/esm2022/lib/components/flags-new/flags-new.interface.mjs +1 -1
  10. package/esm2022/lib/components/gallery/gallery.component.mjs +2 -2
  11. package/esm2022/lib/services/trax.service.mjs +5 -1
  12. package/fesm2022/{tango-app-ui-analyse-trax-audit-v2.module-DcPedMzy.mjs → tango-app-ui-analyse-trax-audit-v2.module-CZPe-gKT.mjs} +166 -32
  13. package/fesm2022/tango-app-ui-analyse-trax-audit-v2.module-CZPe-gKT.mjs.map +1 -0
  14. package/fesm2022/{tango-app-ui-analyse-trax-tango-app-ui-analyse-trax-CDUM8VGW.mjs → tango-app-ui-analyse-trax-tango-app-ui-analyse-trax-CN8ZTzNR.mjs} +341 -91
  15. package/fesm2022/tango-app-ui-analyse-trax-tango-app-ui-analyse-trax-CN8ZTzNR.mjs.map +1 -0
  16. package/fesm2022/tango-app-ui-analyse-trax.mjs +1 -1
  17. package/lib/components/audit-v2/audit-v2-access.d.ts +1 -1
  18. package/lib/components/audit-v2/dashboard/audit-v2-dashboard.component.d.ts +11 -0
  19. package/lib/components/audit-v2/detail/audit-v2-detail.component.d.ts +2 -0
  20. package/lib/components/audit-v2/gallery/audit-v2-gallery.component.d.ts +39 -4
  21. package/lib/components/audit-v2/reports/audit-v2-reports.component.d.ts +4 -0
  22. package/lib/components/dashboard/dashboard.component.d.ts +25 -0
  23. package/lib/components/flags-new/flags-new.component.d.ts +34 -0
  24. package/lib/components/flags-new/flags-new.interface.d.ts +3 -1
  25. package/lib/services/trax.service.d.ts +2 -0
  26. package/package.json +1 -1
  27. package/fesm2022/tango-app-ui-analyse-trax-audit-v2.module-DcPedMzy.mjs.map +0 -1
  28. package/fesm2022/tango-app-ui-analyse-trax-tango-app-ui-analyse-trax-CDUM8VGW.mjs.map +0 -1
@@ -79,6 +79,11 @@ export class AuditV2DashboardComponent {
79
79
  cd;
80
80
  /** Pass / critical marks come from the audit dashboard API; these are the empty-state defaults. */
81
81
  passMark = PASS_MARK;
82
+ /**
83
+ * The audits in scope have different pass marks (Configure): no single pass line is drawn, and each store / bar
84
+ * is judged on the marks of its own audits. passMark is then their average, for the KPI colour only.
85
+ */
86
+ passMarkMixed = false;
82
87
  criticalMark = CRITICAL_MARK;
83
88
  bands = BANDS;
84
89
  /** "All Audits", then the client's audits (POST /trax/audit/list); key = audit id, sent as checklistId. */
@@ -388,9 +393,14 @@ export class AuditV2DashboardComponent {
388
393
  const inQuarter = buckets.filter(b => String(b.key) >= q.from && String(b.key) <= q.to && b.value !== null && b.value !== undefined);
389
394
  const count = inQuarter.reduce((n, b) => n + (Number(b.count) || 0), 0);
390
395
  const total = inQuarter.reduce((n, b) => n + Number(b.value) * (Number(b.count) || 0), 0);
396
+ // Each month's pass mark, weighted the same way (an older API sends none: the page's).
397
+ const marks = inQuarter.reduce((n, b) => n + (this.num(b.passMark) ?? this.passMark) * (Number(b.count) || 0), 0);
391
398
  const submitted = buckets.filter(b => String(b.key) >= q.from && String(b.key) <= q.to)
392
399
  .reduce((n, b) => n + (Number(b.submitted ?? b.count) || 0), 0);
393
- return { key: q.key, label: q.key, value: count ? Math.round(total / count) : null, count, submitted };
400
+ return {
401
+ key: q.key, label: q.key, value: count ? Math.round(total / count) : null, count, submitted,
402
+ passMark: count ? Math.round(marks / count * 10) / 10 : null
403
+ };
394
404
  });
395
405
  this.quarterTrendLoading = false;
396
406
  this.cd.detectChanges();
@@ -512,6 +522,7 @@ export class AuditV2DashboardComponent {
512
522
  const storeList = stores?.code === 200 ? (stores.data?.storePerformance || []) : [];
513
523
  const userList = users?.code === 200 ? (users.data?.userPerformance || []) : [];
514
524
  this.passMark = Number(data.summary?.passMark) || PASS_MARK;
525
+ this.passMarkMixed = !!data.summary?.passMarkMixed;
515
526
  this.criticalMark = Number(data.summary?.criticalMark) || CRITICAL_MARK;
516
527
  this.rows = (data.stores || []).map((s) => this.toAuditRow(s));
517
528
  if (!narrowed && dash?.code === 200) {
@@ -523,7 +534,8 @@ export class AuditV2DashboardComponent {
523
534
  value: b.value === null || b.value === undefined ? null : Number(b.value),
524
535
  count: Number(b.count) || 0,
525
536
  // Older API builds send only count (every audit was scored then).
526
- submitted: Number(b.submitted ?? b.count) || 0
537
+ submitted: Number(b.submitted ?? b.count) || 0,
538
+ passMark: this.num(b.passMark)
527
539
  }));
528
540
  this.auditPerf = auditList.map((r) => this.toAuditPerf(r));
529
541
  this.userPerf = userList.map((r) => this.toUserPerf(r));
@@ -542,7 +554,8 @@ export class AuditV2DashboardComponent {
542
554
  const score = this.num(s?.score);
543
555
  let status;
544
556
  if (score !== null) {
545
- status = score >= this.passMark ? 'pass' : 'fail';
557
+ // The store's own pass mark: its scored audits' configured marks (an older API sends none: the page's).
558
+ status = score >= (this.num(s?.passMark) ?? this.passMark) ? 'pass' : 'fail';
546
559
  }
547
560
  else {
548
561
  status = s?.status === 'unscored' || (this.num(s?.audits) ?? 0) > 0 ? 'unscored' : 'na';
@@ -804,7 +817,7 @@ export class AuditV2DashboardComponent {
804
817
  get kpis() {
805
818
  const ev = this.evaluated;
806
819
  const avg = this.averageScore;
807
- const passCount = ev.filter(r => r.score >= this.passMark).length;
820
+ const passCount = ev.filter(r => r.status === 'pass').length;
808
821
  const failCount = ev.length - passCount;
809
822
  const critical = ev.filter(r => r.score < this.criticalMark).length;
810
823
  const activeStores = this.storesInScope;
@@ -902,11 +915,15 @@ export class AuditV2DashboardComponent {
902
915
  return '#F2F4F7';
903
916
  }
904
917
  const active = bar.key === this.quarter;
905
- if (bar.value >= this.passMark) {
918
+ if (bar.value >= this.barMark(bar)) {
906
919
  return active ? '#1570EF' : '#B2DDFF';
907
920
  }
908
921
  return active ? '#F04438' : '#FECDCA';
909
922
  }
923
+ /** A bar's pass mark: the configured marks of the audits it averages, else the page's. */
924
+ barMark(bar) {
925
+ return bar.passMark ?? this.passMark;
926
+ }
910
927
  setGrain(grain) {
911
928
  if (grain === this.grain) {
912
929
  return;
@@ -1212,7 +1229,7 @@ export class AuditV2DashboardComponent {
1212
1229
  get focusPassed() {
1213
1230
  const b = this.focusBar;
1214
1231
  if (b && b.value !== null) {
1215
- return b.value >= this.passMark;
1232
+ return b.value >= this.barMark(b);
1216
1233
  }
1217
1234
  const avg = this.averageScore;
1218
1235
  return avg !== null && avg >= this.passMark;
@@ -1231,7 +1248,11 @@ export class AuditV2DashboardComponent {
1231
1248
  ? (this.focusBar?.submitted ?? 0)
1232
1249
  : this.trend.reduce((sum, b) => sum + (b.submitted || 0), 0);
1233
1250
  return this.periodLabel + ' · ' + n + (n === 1 ? ' audit completed' : ' audits completed')
1234
- + (this.showPassMarkInfo ? ' · pass mark ' + this.passMark + '%' : '');
1251
+ + (this.showPassMarkInfo ? ' · ' + this.passMarkText : '');
1252
+ }
1253
+ /** "pass mark 75%", or "pass mark varies by audit" when the audits in scope are configured differently. */
1254
+ get passMarkText() {
1255
+ return this.passMarkMixed ? 'pass mark varies by audit' : 'pass mark ' + this.passMark + '%';
1235
1256
  }
1236
1257
  setPerfTab(tab) {
1237
1258
  this.perfTab = tab;
@@ -1566,11 +1587,11 @@ export class AuditV2DashboardComponent {
1566
1587
  });
1567
1588
  }
1568
1589
  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 });
1569
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AuditV2DashboardComponent, selector: "lib-audit-v2-dashboard", host: { listeners: { "document:click": "closeViewMenu()", "window:scroll": "closeViewMenu()", "window:resize": "closeViewMenu()" } }, 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=\"showTrendDatePicker && 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\" *ngIf=\"showPassMarkInfo\" [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\" *ngIf=\"showPassMarkInfo\">\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\" *ngIf=\"showPassMarkInfo\" [class.is-fail]=\"bar.value < passMark\">\r\n {{ bar.value >= passMark ? labels.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>\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')\">{{ labels.fail }}</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'pass'\" (click)=\"setStatus('pass')\">{{ labels.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 <!-- Audits: one cell per header (headers lists Audits), so Score / Status / Action stay under their own headings. -->\r\n <td [class.av2-faint]=\"!row.audits\">{{ row.audits || '\u2014' }}</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 <!-- Several audits submitted by this store: View lists them; each opens the Gallery on that audit. -->\r\n <div class=\"db-viewmenu-wrap\" *ngIf=\"storeAudits(row).length > 1\">\r\n <button type=\"button\" class=\"db-viewbtn\" [class.is-open]=\"isViewMenuOpen(row)\"\r\n title=\"Pick the audit to view in the Gallery\" (click)=\"toggleViewMenu(row, $event)\">\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 <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\r\n </button>\r\n <div class=\"db-viewmenu\" *ngIf=\"isViewMenuOpen(row)\" (click)=\"$event.stopPropagation()\"\r\n [style.top.px]=\"viewMenuPos.top\" [style.right.px]=\"viewMenuPos.right\">\r\n <div class=\"db-viewmenu-title\">{{ storeAudits(row).length }} audits submitted</div>\r\n <a class=\"db-viewmenu-item\" *ngFor=\"let a of storeAudits(row)\" routerLink=\"/manage/trax/audit-v2/gallery\"\r\n [queryParams]=\"detailParams({ audit: a.auditId, store: row.raw?.storeId || row.storeId })\"\r\n (click)=\"viewMenuStore = ''\">\r\n <span class=\"db-viewmenu-name av2-ellipsis\" [title]=\"a.name\">{{ a.name || '\u2014' }}</span>\r\n <span class=\"db-viewmenu-meta\">{{ a.submitted }} {{ a.submitted === 1 ? 'submission' : 'submissions' }}</span>\r\n <span class=\"db-viewmenu-score\">{{ a.score === null ? '\u2014' : a.score + '%' }}</span>\r\n </a>\r\n </div>\r\n </div>\r\n <a class=\"db-viewbtn\" *ngIf=\"storeAudits(row).length <= 1 && 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 <!-- Not audited (no submission in the period): nothing to view, so View is disabled. -->\r\n <button type=\"button\" class=\"db-viewbtn\" *ngIf=\"!galleryAuditId(row)\" disabled\r\n title=\"No audit submitted for this store in this period\">\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 </button>\r\n <!-- The Gallery's Export as PDF for this store's audit in the period (queued, then under Notifications > Downloads). -->\r\n <!-- <a class=\"db-pdfbtn\" role=\"button\" [class.is-disabled]=\"!galleryAuditId(row)\"\r\n [attr.aria-disabled]=\"!galleryAuditId(row)\" (click)=\"downloadPdf(row)\"\r\n [title]=\"galleryAuditId(row) ? 'Export this store\\'s submissions as PDF (same as the Gallery\\'s Export as PDF)' : '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 <!-- Task mode always shows its Task Info table; the rest of Performance follows showPerformance. -->\r\n <section class=\"db-perf\" *ngIf=\"showPerformance || isTaskModule\">\r\n <div class=\"db-perftabs\" *ngIf=\"showPerformance\">\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' && !isTaskModule && 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 <!-- Task mode: Create Task opens Manage -> Task (task add permission). -->\r\n <button type=\"button\" class=\"av2-btn db-create\" *ngIf=\"perfTab === 'Audit' && isTaskModule && access.canAddTask\"\r\n routerLink=\"/manage/trax/audit-v2/manage\" [queryParams]=\"{ module: 'task' }\">\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 Create Task\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'\">{{ resultText(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 text-nowrap\">\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 <!-- Task Info: the same columns as Checklist > Dashboard > Task (\"--\" when empty). -->\r\n <td>\r\n <a class=\"db-link\" [title]=\"row.raw?.auditName ? 'Raised from ' + row.raw.auditName : ''\">{{ row.name }}</a>\r\n </td>\r\n <td>\r\n <div class=\"db-name\">\r\n <span class=\"db-avatar\">{{ row.createdByInitials }}</span>\r\n <span [title]=\"row.createdBy\">{{ row.createdBy }}</span>\r\n </div>\r\n </td>\r\n <td class=\"db-nowrap\">{{ row.createdOn }}</td>\r\n <td>{{ row.priority }}</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\">--</span>\r\n </td>\r\n <!-- The Gallery has no redo filter to open, so Redo is plain text. -->\r\n <td>{{ row.redo || '--' }}</td>\r\n <td class=\"db-nowrap\">{{ row.dueOn }}</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\">{{ showDrawerDateRange ? 'Pick a custom start and end date.' : 'Use the header date range.' }}</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=\"showDrawerDateRange && 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\">{{ dr.labels.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\">{{ dr.labels.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-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:24%}.db-perftable--task th:nth-child(2){width:15%}.db-perftable--task th:nth-child(3){width:10%}.db-perftable--task th:nth-child(4){width:8%}.db-perftable--task th:nth-child(5){width:10%}.db-perftable--task th:nth-child(6){width:9%}.db-perftable--task th:nth-child(7){width:7%}.db-perftable--task th:nth-child(8){width:10%}.db-perftable--task th:nth-child(9){width:7%}.db-perftable--task .db-name>span:last-child{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.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}.db-viewmenu-wrap{display:inline-flex}.db-viewbtn.is-open{background:#eaf8ff}button.db-viewbtn{border:0;background:transparent}.db-viewmenu{position:fixed;z-index:1060;width:320px;max-height:320px;overflow-y:auto;padding:6px;border-radius:8px;background:#fff;box-shadow:0 12px 24px -6px #10182829,0 0 0 1px #eaecf0}.db-viewmenu-title{padding:6px 10px 8px;font-size:12px;font-weight:600;color:#667085}.db-viewmenu-item{display:grid;grid-template-columns:minmax(0,1fr) auto;grid-template-areas:\"name score\" \"meta score\";align-items:center;column-gap:12px;padding:8px 10px;border-radius:6px;cursor:pointer;text-decoration:none}.db-viewmenu-item:hover{background:#f9fafb}.db-viewmenu-name{grid-area:name;font-size:13px;font-weight:600;color:#101828}.db-viewmenu-meta{grid-area:meta;font-size:12px;color:#667085}.db-viewmenu-score{grid-area:score;font-size:13px;font-weight:600;color:#344054}button.db-viewbtn:disabled{opacity:.45;cursor:not-allowed}button.db-viewbtn:disabled:hover{background:transparent}\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"] }] });
1590
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AuditV2DashboardComponent, selector: "lib-audit-v2-dashboard", host: { listeners: { "document:click": "closeViewMenu()", "window:scroll": "closeViewMenu()", "window:resize": "closeViewMenu()" } }, 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=\"showTrendDatePicker && 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\" *ngIf=\"showPassMarkInfo\" [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\" *ngIf=\"showPassMarkInfo\">\r\n <span class=\"db-legend-dash\" *ngIf=\"!passMarkMixed\"></span>{{ passMarkMixed ? 'Pass mark varies by audit' : '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 <!-- One line only when the audits in scope share a pass mark; otherwise each bar is coloured on its own. -->\r\n <span class=\"db-passline\" *ngIf=\"!passMarkMixed\" [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 < barMark(bar)\"></span>\r\n <span class=\"db-tip-value\">{{ bar.value }}%</span>\r\n <span class=\"db-tip-status\" *ngIf=\"showPassMarkInfo\" [class.is-fail]=\"bar.value < barMark(bar)\">\r\n {{ bar.value >= barMark(bar) ? labels.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\" *ngIf=\"bar.value !== null || !passMarkMixed\"><span>Pass mark</span><b>{{ barMark(bar) }}%</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>\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')\">{{ labels.fail }}</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'pass'\" (click)=\"setStatus('pass')\">{{ labels.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 <!-- Audits: one cell per header (headers lists Audits), so Score / Status / Action stay under their own headings. -->\r\n <td [class.av2-faint]=\"!row.audits\">{{ row.audits || '\u2014' }}</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 <!-- Several audits submitted by this store: View lists them; each opens the Gallery on that audit. -->\r\n <div class=\"db-viewmenu-wrap\" *ngIf=\"storeAudits(row).length > 1\">\r\n <button type=\"button\" class=\"db-viewbtn\" [class.is-open]=\"isViewMenuOpen(row)\"\r\n title=\"Pick the audit to view in the Gallery\" (click)=\"toggleViewMenu(row, $event)\">\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 <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\r\n </button>\r\n <div class=\"db-viewmenu\" *ngIf=\"isViewMenuOpen(row)\" (click)=\"$event.stopPropagation()\"\r\n [style.top.px]=\"viewMenuPos.top\" [style.right.px]=\"viewMenuPos.right\">\r\n <div class=\"db-viewmenu-title\">{{ storeAudits(row).length }} audits submitted</div>\r\n <a class=\"db-viewmenu-item\" *ngFor=\"let a of storeAudits(row)\" routerLink=\"/manage/trax/audit-v2/gallery\"\r\n [queryParams]=\"detailParams({ audit: a.auditId, store: row.raw?.storeId || row.storeId })\"\r\n (click)=\"viewMenuStore = ''\">\r\n <span class=\"db-viewmenu-name av2-ellipsis\" [title]=\"a.name\">{{ a.name || '\u2014' }}</span>\r\n <span class=\"db-viewmenu-meta\">{{ a.submitted }} {{ a.submitted === 1 ? 'submission' : 'submissions' }}</span>\r\n <span class=\"db-viewmenu-score\">{{ a.score === null ? '\u2014' : a.score + '%' }}</span>\r\n </a>\r\n </div>\r\n </div>\r\n <a class=\"db-viewbtn\" *ngIf=\"storeAudits(row).length <= 1 && 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 <!-- Not audited (no submission in the period): nothing to view, so View is disabled. -->\r\n <button type=\"button\" class=\"db-viewbtn\" *ngIf=\"!galleryAuditId(row)\" disabled\r\n title=\"No audit submitted for this store in this period\">\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 </button>\r\n <!-- The Gallery's Export as PDF for this store's audit in the period (queued, then under Notifications > Downloads). -->\r\n <!-- <a class=\"db-pdfbtn\" role=\"button\" [class.is-disabled]=\"!galleryAuditId(row)\"\r\n [attr.aria-disabled]=\"!galleryAuditId(row)\" (click)=\"downloadPdf(row)\"\r\n [title]=\"galleryAuditId(row) ? 'Export this store\\'s submissions as PDF (same as the Gallery\\'s Export as PDF)' : '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 <!-- Task mode always shows its Task Info table; the rest of Performance follows showPerformance. -->\r\n <section class=\"db-perf\" *ngIf=\"showPerformance || isTaskModule\">\r\n <div class=\"db-perftabs\" *ngIf=\"showPerformance\">\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' && !isTaskModule && 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 <!-- Task mode: Create Task opens Manage -> Task (task add permission). -->\r\n <button type=\"button\" class=\"av2-btn db-create\" *ngIf=\"perfTab === 'Audit' && isTaskModule && access.canAddTask\"\r\n routerLink=\"/manage/trax/audit-v2/manage\" [queryParams]=\"{ module: 'task' }\">\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 Create Task\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'\">{{ resultText(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 text-nowrap\">\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 <!-- Task Info: the same columns as Checklist > Dashboard > Task (\"--\" when empty). -->\r\n <td>\r\n <a class=\"db-link\" [title]=\"row.raw?.auditName ? 'Raised from ' + row.raw.auditName : ''\">{{ row.name }}</a>\r\n </td>\r\n <td>\r\n <div class=\"db-name\">\r\n <span class=\"db-avatar\">{{ row.createdByInitials }}</span>\r\n <span [title]=\"row.createdBy\">{{ row.createdBy }}</span>\r\n </div>\r\n </td>\r\n <td class=\"db-nowrap\">{{ row.createdOn }}</td>\r\n <td>{{ row.priority }}</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\">--</span>\r\n </td>\r\n <!-- The Gallery has no redo filter to open, so Redo is plain text. -->\r\n <td>{{ row.redo || '--' }}</td>\r\n <td class=\"db-nowrap\">{{ row.dueOn }}</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\">{{ showDrawerDateRange ? 'Pick a custom start and end date.' : 'Use the header date range.' }}</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=\"showDrawerDateRange && 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\">{{ dr.labels.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\">{{ dr.labels.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-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:24%}.db-perftable--task th:nth-child(2){width:15%}.db-perftable--task th:nth-child(3){width:10%}.db-perftable--task th:nth-child(4){width:8%}.db-perftable--task th:nth-child(5){width:10%}.db-perftable--task th:nth-child(6){width:9%}.db-perftable--task th:nth-child(7){width:7%}.db-perftable--task th:nth-child(8){width:10%}.db-perftable--task th:nth-child(9){width:7%}.db-perftable--task .db-name>span:last-child{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.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}.db-viewmenu-wrap{display:inline-flex}.db-viewbtn.is-open{background:#eaf8ff}button.db-viewbtn{border:0;background:transparent}.db-viewmenu{position:fixed;z-index:1060;width:320px;max-height:320px;overflow-y:auto;padding:6px;border-radius:8px;background:#fff;box-shadow:0 12px 24px -6px #10182829,0 0 0 1px #eaecf0}.db-viewmenu-title{padding:6px 10px 8px;font-size:12px;font-weight:600;color:#667085}.db-viewmenu-item{display:grid;grid-template-columns:minmax(0,1fr) auto;grid-template-areas:\"name score\" \"meta score\";align-items:center;column-gap:12px;padding:8px 10px;border-radius:6px;cursor:pointer;text-decoration:none}.db-viewmenu-item:hover{background:#f9fafb}.db-viewmenu-name{grid-area:name;font-size:13px;font-weight:600;color:#101828}.db-viewmenu-meta{grid-area:meta;font-size:12px;color:#667085}.db-viewmenu-score{grid-area:score;font-size:13px;font-weight:600;color:#344054}button.db-viewbtn:disabled{opacity:.45;cursor:not-allowed}button.db-viewbtn:disabled:hover{background:transparent}\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"] }] });
1570
1591
  }
1571
1592
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuditV2DashboardComponent, decorators: [{
1572
1593
  type: Component,
1573
- 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=\"showTrendDatePicker && 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\" *ngIf=\"showPassMarkInfo\" [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\" *ngIf=\"showPassMarkInfo\">\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\" *ngIf=\"showPassMarkInfo\" [class.is-fail]=\"bar.value < passMark\">\r\n {{ bar.value >= passMark ? labels.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>\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')\">{{ labels.fail }}</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'pass'\" (click)=\"setStatus('pass')\">{{ labels.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 <!-- Audits: one cell per header (headers lists Audits), so Score / Status / Action stay under their own headings. -->\r\n <td [class.av2-faint]=\"!row.audits\">{{ row.audits || '\u2014' }}</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 <!-- Several audits submitted by this store: View lists them; each opens the Gallery on that audit. -->\r\n <div class=\"db-viewmenu-wrap\" *ngIf=\"storeAudits(row).length > 1\">\r\n <button type=\"button\" class=\"db-viewbtn\" [class.is-open]=\"isViewMenuOpen(row)\"\r\n title=\"Pick the audit to view in the Gallery\" (click)=\"toggleViewMenu(row, $event)\">\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 <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\r\n </button>\r\n <div class=\"db-viewmenu\" *ngIf=\"isViewMenuOpen(row)\" (click)=\"$event.stopPropagation()\"\r\n [style.top.px]=\"viewMenuPos.top\" [style.right.px]=\"viewMenuPos.right\">\r\n <div class=\"db-viewmenu-title\">{{ storeAudits(row).length }} audits submitted</div>\r\n <a class=\"db-viewmenu-item\" *ngFor=\"let a of storeAudits(row)\" routerLink=\"/manage/trax/audit-v2/gallery\"\r\n [queryParams]=\"detailParams({ audit: a.auditId, store: row.raw?.storeId || row.storeId })\"\r\n (click)=\"viewMenuStore = ''\">\r\n <span class=\"db-viewmenu-name av2-ellipsis\" [title]=\"a.name\">{{ a.name || '\u2014' }}</span>\r\n <span class=\"db-viewmenu-meta\">{{ a.submitted }} {{ a.submitted === 1 ? 'submission' : 'submissions' }}</span>\r\n <span class=\"db-viewmenu-score\">{{ a.score === null ? '\u2014' : a.score + '%' }}</span>\r\n </a>\r\n </div>\r\n </div>\r\n <a class=\"db-viewbtn\" *ngIf=\"storeAudits(row).length <= 1 && 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 <!-- Not audited (no submission in the period): nothing to view, so View is disabled. -->\r\n <button type=\"button\" class=\"db-viewbtn\" *ngIf=\"!galleryAuditId(row)\" disabled\r\n title=\"No audit submitted for this store in this period\">\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 </button>\r\n <!-- The Gallery's Export as PDF for this store's audit in the period (queued, then under Notifications > Downloads). -->\r\n <!-- <a class=\"db-pdfbtn\" role=\"button\" [class.is-disabled]=\"!galleryAuditId(row)\"\r\n [attr.aria-disabled]=\"!galleryAuditId(row)\" (click)=\"downloadPdf(row)\"\r\n [title]=\"galleryAuditId(row) ? 'Export this store\\'s submissions as PDF (same as the Gallery\\'s Export as PDF)' : '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 <!-- Task mode always shows its Task Info table; the rest of Performance follows showPerformance. -->\r\n <section class=\"db-perf\" *ngIf=\"showPerformance || isTaskModule\">\r\n <div class=\"db-perftabs\" *ngIf=\"showPerformance\">\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' && !isTaskModule && 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 <!-- Task mode: Create Task opens Manage -> Task (task add permission). -->\r\n <button type=\"button\" class=\"av2-btn db-create\" *ngIf=\"perfTab === 'Audit' && isTaskModule && access.canAddTask\"\r\n routerLink=\"/manage/trax/audit-v2/manage\" [queryParams]=\"{ module: 'task' }\">\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 Create Task\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'\">{{ resultText(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 text-nowrap\">\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 <!-- Task Info: the same columns as Checklist > Dashboard > Task (\"--\" when empty). -->\r\n <td>\r\n <a class=\"db-link\" [title]=\"row.raw?.auditName ? 'Raised from ' + row.raw.auditName : ''\">{{ row.name }}</a>\r\n </td>\r\n <td>\r\n <div class=\"db-name\">\r\n <span class=\"db-avatar\">{{ row.createdByInitials }}</span>\r\n <span [title]=\"row.createdBy\">{{ row.createdBy }}</span>\r\n </div>\r\n </td>\r\n <td class=\"db-nowrap\">{{ row.createdOn }}</td>\r\n <td>{{ row.priority }}</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\">--</span>\r\n </td>\r\n <!-- The Gallery has no redo filter to open, so Redo is plain text. -->\r\n <td>{{ row.redo || '--' }}</td>\r\n <td class=\"db-nowrap\">{{ row.dueOn }}</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\">{{ showDrawerDateRange ? 'Pick a custom start and end date.' : 'Use the header date range.' }}</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=\"showDrawerDateRange && 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\">{{ dr.labels.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\">{{ dr.labels.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-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:24%}.db-perftable--task th:nth-child(2){width:15%}.db-perftable--task th:nth-child(3){width:10%}.db-perftable--task th:nth-child(4){width:8%}.db-perftable--task th:nth-child(5){width:10%}.db-perftable--task th:nth-child(6){width:9%}.db-perftable--task th:nth-child(7){width:7%}.db-perftable--task th:nth-child(8){width:10%}.db-perftable--task th:nth-child(9){width:7%}.db-perftable--task .db-name>span:last-child{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.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}.db-viewmenu-wrap{display:inline-flex}.db-viewbtn.is-open{background:#eaf8ff}button.db-viewbtn{border:0;background:transparent}.db-viewmenu{position:fixed;z-index:1060;width:320px;max-height:320px;overflow-y:auto;padding:6px;border-radius:8px;background:#fff;box-shadow:0 12px 24px -6px #10182829,0 0 0 1px #eaecf0}.db-viewmenu-title{padding:6px 10px 8px;font-size:12px;font-weight:600;color:#667085}.db-viewmenu-item{display:grid;grid-template-columns:minmax(0,1fr) auto;grid-template-areas:\"name score\" \"meta score\";align-items:center;column-gap:12px;padding:8px 10px;border-radius:6px;cursor:pointer;text-decoration:none}.db-viewmenu-item:hover{background:#f9fafb}.db-viewmenu-name{grid-area:name;font-size:13px;font-weight:600;color:#101828}.db-viewmenu-meta{grid-area:meta;font-size:12px;color:#667085}.db-viewmenu-score{grid-area:score;font-size:13px;font-weight:600;color:#344054}button.db-viewbtn:disabled{opacity:.45;cursor:not-allowed}button.db-viewbtn:disabled:hover{background:transparent}\n"] }]
1594
+ 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=\"showTrendDatePicker && 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\" *ngIf=\"showPassMarkInfo\" [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\" *ngIf=\"showPassMarkInfo\">\r\n <span class=\"db-legend-dash\" *ngIf=\"!passMarkMixed\"></span>{{ passMarkMixed ? 'Pass mark varies by audit' : '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 <!-- One line only when the audits in scope share a pass mark; otherwise each bar is coloured on its own. -->\r\n <span class=\"db-passline\" *ngIf=\"!passMarkMixed\" [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 < barMark(bar)\"></span>\r\n <span class=\"db-tip-value\">{{ bar.value }}%</span>\r\n <span class=\"db-tip-status\" *ngIf=\"showPassMarkInfo\" [class.is-fail]=\"bar.value < barMark(bar)\">\r\n {{ bar.value >= barMark(bar) ? labels.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\" *ngIf=\"bar.value !== null || !passMarkMixed\"><span>Pass mark</span><b>{{ barMark(bar) }}%</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>\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')\">{{ labels.fail }}</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'pass'\" (click)=\"setStatus('pass')\">{{ labels.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 <!-- Audits: one cell per header (headers lists Audits), so Score / Status / Action stay under their own headings. -->\r\n <td [class.av2-faint]=\"!row.audits\">{{ row.audits || '\u2014' }}</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 <!-- Several audits submitted by this store: View lists them; each opens the Gallery on that audit. -->\r\n <div class=\"db-viewmenu-wrap\" *ngIf=\"storeAudits(row).length > 1\">\r\n <button type=\"button\" class=\"db-viewbtn\" [class.is-open]=\"isViewMenuOpen(row)\"\r\n title=\"Pick the audit to view in the Gallery\" (click)=\"toggleViewMenu(row, $event)\">\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 <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\r\n </button>\r\n <div class=\"db-viewmenu\" *ngIf=\"isViewMenuOpen(row)\" (click)=\"$event.stopPropagation()\"\r\n [style.top.px]=\"viewMenuPos.top\" [style.right.px]=\"viewMenuPos.right\">\r\n <div class=\"db-viewmenu-title\">{{ storeAudits(row).length }} audits submitted</div>\r\n <a class=\"db-viewmenu-item\" *ngFor=\"let a of storeAudits(row)\" routerLink=\"/manage/trax/audit-v2/gallery\"\r\n [queryParams]=\"detailParams({ audit: a.auditId, store: row.raw?.storeId || row.storeId })\"\r\n (click)=\"viewMenuStore = ''\">\r\n <span class=\"db-viewmenu-name av2-ellipsis\" [title]=\"a.name\">{{ a.name || '\u2014' }}</span>\r\n <span class=\"db-viewmenu-meta\">{{ a.submitted }} {{ a.submitted === 1 ? 'submission' : 'submissions' }}</span>\r\n <span class=\"db-viewmenu-score\">{{ a.score === null ? '\u2014' : a.score + '%' }}</span>\r\n </a>\r\n </div>\r\n </div>\r\n <a class=\"db-viewbtn\" *ngIf=\"storeAudits(row).length <= 1 && 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 <!-- Not audited (no submission in the period): nothing to view, so View is disabled. -->\r\n <button type=\"button\" class=\"db-viewbtn\" *ngIf=\"!galleryAuditId(row)\" disabled\r\n title=\"No audit submitted for this store in this period\">\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 </button>\r\n <!-- The Gallery's Export as PDF for this store's audit in the period (queued, then under Notifications > Downloads). -->\r\n <!-- <a class=\"db-pdfbtn\" role=\"button\" [class.is-disabled]=\"!galleryAuditId(row)\"\r\n [attr.aria-disabled]=\"!galleryAuditId(row)\" (click)=\"downloadPdf(row)\"\r\n [title]=\"galleryAuditId(row) ? 'Export this store\\'s submissions as PDF (same as the Gallery\\'s Export as PDF)' : '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 <!-- Task mode always shows its Task Info table; the rest of Performance follows showPerformance. -->\r\n <section class=\"db-perf\" *ngIf=\"showPerformance || isTaskModule\">\r\n <div class=\"db-perftabs\" *ngIf=\"showPerformance\">\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' && !isTaskModule && 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 <!-- Task mode: Create Task opens Manage -> Task (task add permission). -->\r\n <button type=\"button\" class=\"av2-btn db-create\" *ngIf=\"perfTab === 'Audit' && isTaskModule && access.canAddTask\"\r\n routerLink=\"/manage/trax/audit-v2/manage\" [queryParams]=\"{ module: 'task' }\">\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 Create Task\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'\">{{ resultText(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 text-nowrap\">\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 <!-- Task Info: the same columns as Checklist > Dashboard > Task (\"--\" when empty). -->\r\n <td>\r\n <a class=\"db-link\" [title]=\"row.raw?.auditName ? 'Raised from ' + row.raw.auditName : ''\">{{ row.name }}</a>\r\n </td>\r\n <td>\r\n <div class=\"db-name\">\r\n <span class=\"db-avatar\">{{ row.createdByInitials }}</span>\r\n <span [title]=\"row.createdBy\">{{ row.createdBy }}</span>\r\n </div>\r\n </td>\r\n <td class=\"db-nowrap\">{{ row.createdOn }}</td>\r\n <td>{{ row.priority }}</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\">--</span>\r\n </td>\r\n <!-- The Gallery has no redo filter to open, so Redo is plain text. -->\r\n <td>{{ row.redo || '--' }}</td>\r\n <td class=\"db-nowrap\">{{ row.dueOn }}</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\">{{ showDrawerDateRange ? 'Pick a custom start and end date.' : 'Use the header date range.' }}</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=\"showDrawerDateRange && 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\">{{ dr.labels.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\">{{ dr.labels.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-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:24%}.db-perftable--task th:nth-child(2){width:15%}.db-perftable--task th:nth-child(3){width:10%}.db-perftable--task th:nth-child(4){width:8%}.db-perftable--task th:nth-child(5){width:10%}.db-perftable--task th:nth-child(6){width:9%}.db-perftable--task th:nth-child(7){width:7%}.db-perftable--task th:nth-child(8){width:10%}.db-perftable--task th:nth-child(9){width:7%}.db-perftable--task .db-name>span:last-child{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.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}.db-viewmenu-wrap{display:inline-flex}.db-viewbtn.is-open{background:#eaf8ff}button.db-viewbtn{border:0;background:transparent}.db-viewmenu{position:fixed;z-index:1060;width:320px;max-height:320px;overflow-y:auto;padding:6px;border-radius:8px;background:#fff;box-shadow:0 12px 24px -6px #10182829,0 0 0 1px #eaecf0}.db-viewmenu-title{padding:6px 10px 8px;font-size:12px;font-weight:600;color:#667085}.db-viewmenu-item{display:grid;grid-template-columns:minmax(0,1fr) auto;grid-template-areas:\"name score\" \"meta score\";align-items:center;column-gap:12px;padding:8px 10px;border-radius:6px;cursor:pointer;text-decoration:none}.db-viewmenu-item:hover{background:#f9fafb}.db-viewmenu-name{grid-area:name;font-size:13px;font-weight:600;color:#101828}.db-viewmenu-meta{grid-area:meta;font-size:12px;color:#667085}.db-viewmenu-score{grid-area:score;font-size:13px;font-weight:600;color:#344054}button.db-viewbtn:disabled{opacity:.45;cursor:not-allowed}button.db-viewbtn:disabled:hover{background:transparent}\n"] }]
1574
1595
  }], ctorParameters: () => [{ type: i1.TraxService }, { type: i2.GlobalStateService }, { type: i3.ToastService }, { type: i0.ChangeDetectorRef }], propDecorators: { closeViewMenu: [{
1575
1596
  type: HostListener,
1576
1597
  args: ['document:click']
@@ -1581,4 +1602,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1581
1602
  type: HostListener,
1582
1603
  args: ['window:resize']
1583
1604
  }] } });
1584
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtdjItZGFzaGJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2UtdHJheC9zcmMvbGliL2NvbXBvbmVudHMvYXVkaXQtdjIvZGFzaGJvYXJkL2F1ZGl0LXYyLWRhc2hib2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYXgvc3JjL2xpYi9jb21wb25lbnRzL2F1ZGl0LXYyL2Rhc2hib2FyZC9hdWRpdC12Mi1kYXNoYm9hcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQUUsWUFBWSxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUM5RixPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHNUMsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBRTFCLE9BQU8sRUFBZSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5RCxPQUFPLEVBQWUsb0JBQW9CLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDeEYsT0FBTyxFQUFFLGFBQWEsRUFBNEIsZUFBZSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7Ozs7OztBQTRJL0gsTUFBTSxnQkFBZ0IsR0FBYztJQUNsQyxXQUFXLEVBQUUsR0FBRztJQUNoQixhQUFhLEVBQUUsR0FBRztJQUNsQixZQUFZLEVBQUUsR0FBRztJQUNqQixTQUFTLEVBQUUsR0FBRztJQUNkLFVBQVUsRUFBRSxHQUFHO0lBQ2YsU0FBUyxFQUFFLEdBQUc7SUFDZCxlQUFlLEVB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QUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQ2hILElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxJQUFJO0tBQ2hELENBQUM7SUFDZSxjQUFjLEdBQW1EO1FBQ2hGLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUs7UUFDL0csVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDO0tBQ3BJLENBQUM7SUFDZSxhQUFhLEdBQWtEO1FBQzlFLElBQUksRUFB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SUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDbkYsTUFBTSxFQUFFLEdBQUcsR0FBRyxFQUFFLElBQUksS0FBSyxHQUFHLENBQUM7WUFDN0IsSUFBSSxDQUFDLEVBQUUsRUFBRTtnQkFBRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO2FBQUU7WUFDekMsTUFBTSxPQUFPLEdBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN2RCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUN0QyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDO2dCQUNySSxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDeEUsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDMUYsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7cUJBQ3BGLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDbEUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDO1lBQ3pHLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztZQUNqQyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELDZHQUE2RztJQUNyRyxZQUFZLENBQUMsR0FBVyxFQUFFLEtBQUssR0FBRyxLQUFLO1FBQzdDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3RGLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzlDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQUUsT0FBTztTQUFFO1FBQzNGLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUNyQixJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDbkIsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsS0FBSyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUFFO0lBQ2pELENBQUM7SUFFRCwrRUFBK0U7SUFDL0UsYUFBYSxDQUFDLEdBQVc7UUFDdkIsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUFFLE9BQU87U0FBRTtRQUN6QyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCwyRkFBMkY7SUFDM0YsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUVELG1GQUFtRjtJQUNuRixJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ25FLENBQUM7SUFFRCx5RUFBeUU7SUFDekUsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELGtIQUFrSDtJQUNsSCxVQUFVLENBQUMsQ0FBUyxFQUFFLElBQWE7UUFDakMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7UUFDaEMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFO1lBQUUsT0FBTyxJQUFJLENBQUM7U0FBRTtRQUM3QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5QixtR0FBbUc7UUFDbkcsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVELDBDQUEwQztJQUMxQyxhQUFhLENBQUMsR0FBVztRQUN2QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsRUFBRSxNQUFNLElBQUksRUFBRSxDQUFDO0lBQzVELENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCwwQ0FBMEM7SUFDbEMsY0FBYztRQUNwQixPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEcsQ0FBQztJQUVELElBQVksZ0JBQWdCO1FBQzFCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDdkIsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVPLFlBQVksQ0FBQyxDQUFXLEVBQUUsSUFBZTtRQUMvQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQztlQUNwRixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkcsQ0FBQztJQUVELHlGQUF5RjtJQUNqRixjQUFjO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFBRSxPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUFFO1FBQzdELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDL0gsQ0FBQztJQUVELDJFQUEyRTtJQUNuRSxXQUFXO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDekYsQ0FBQztJQUVPLFdBQVcsQ0FBQyxRQUE2QixFQUFFO1FBQ2pELE9BQU87WUFDTCxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxTQUFTO1lBQ3ZELE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLE9BQU87WUFDakQsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDOUIsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3JCLFFBQVEsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLE1BQU07WUFDakMsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLEtBQUssRUFBRSxJQUFJO1lBQ1gsTUFBTSxFQUFFLENBQUM7WUFDVCxNQUFNLEVBQUUsRUFBRTtZQUNWLGNBQWMsRUFBRSxFQUFFO1lBQ2xCLFdBQVcsRUFBRSxFQUFFO1lBQ2YsTUFBTSxFQUFFLEtBQUs7WUFDYixHQUFHLEtBQUs7U0FDVCxDQUFDO0lBQ0osQ0FBQztJQUVELCtFQUErRTtJQUN2RSxJQUFJO1FBQ1YsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2pDLDRGQUE0RjtRQUM1RixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDdkMsUUFBUSxDQUFDO1lBQ1AsMkVBQTJFO1lBQzNFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUM7Z0JBQ3pDLFFBQVEsRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDO2dCQUM1RyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUU7YUFDdEIsQ0FBQyxDQUFDO1lBQ0gsdUZBQXVGO1lBQ3ZGLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMxRixNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdkYsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3JGLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFPLEVBQUUsRUFBRTtZQUNuRixNQUFNLElBQUksR0FBRyxJQUFJLEVBQUUsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDekQsTUFBTSxTQUFTLEdBQUcsTUFBTSxFQUFFLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxvQkFBb0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3hGLE1BQU0sU0FBUyxHQUFHLE1BQU0sRUFBRSxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNwRixNQUFNLFFBQVEsR0FBRyxLQUFLLEVBQUUsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLGVBQWUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBRWhGLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLElBQUksU0FBUyxDQUFDO1lBQzVELElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLElBQUksYUFBYSxDQUFDO1lBQ3hFLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BFLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxFQUFFLElBQUksS0FBSyxHQUFHLEVBQUU7Z0JBQUUsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO2FBQUU7WUFDcEUsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEUsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUMvQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBQzFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztnQkFDekUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztnQkFDM0Isa0VBQWtFO2dCQUNsRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7YUFDL0MsQ0FBQyxDQUFDLENBQUM7WUFDSixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoRSxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztZQUNsQixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNyQixJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxVQUFVLENBQUMsQ0FBTTtRQUN2QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqQyxJQUFJLE1BQW1CLENBQUM7UUFDeEIsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO1lBQ2xCLE1BQU0sR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7U0FDbkQ7YUFBTTtZQUNMLE1BQU0sR0FBRyxDQUFDLEVBQUUsTUFBTSxLQUFLLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7U0FDekY7UUFDRCxPQUFPO1lBQ0wsSUFBSSxFQUFFLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHO1lBQ3hELHlHQUF5RztZQUN6RyxPQUFPLEVBQUUsQ0FBQyxFQUFFLFNBQVMsSUFBSSxHQUFHO1lBQzVCLE1BQU0sRUFBRSxDQUFDLEVBQUUsTUFBTSxJQUFJLEdBQUc7WUFDeEIsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLElBQUksR0FBRztZQUNwQixHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxHQUFHO1lBQ2xCLE1BQU0sRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ2hDLEtBQUssRUFBRSxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ2hELE1BQU07WUFDTixHQUFHLEVBQUUsQ0FBQztTQUNQLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssV0FBVyxDQUFDLENBQU07UUFDeEIsT0FBTztZQUNMLE9BQU8sRUFBRSxDQUFDLEVBQUUsUUFBUSxJQUFJLEVBQUU7WUFDMUIsS0FBSyxFQUFFLENBQUMsRUFBRSxTQUFTLElBQUksR0FBRztZQUMxQixJQUFJLEVBQUUsQ0FBQyxFQUFFLFNBQVMsSUFBSSxHQUFHO1lBQ3pCLFFBQVEsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsSUFBSSxDQUFDO1lBQzFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUM7WUFDaEMsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQztZQUN2QyxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDO1lBQ3ZDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUM7WUFDbEMsR0FBRyxFQUFFLENBQUM7U0FDUCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxRQUFRLENBQUMsS0FBeUM7UUFDaEQsTUFBTSxDQUFDLEdBQUcsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMvRixPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDekUsQ0FBQztJQUVPLFdBQVcsQ0FBQyxDQUFNO1FBQ3hCLE1BQU0sSUFBSSxHQUFHLENBQUMsRUFBRSxhQUFhLElBQUksR0FBRyxDQUFDO1FBQ3JDLG1HQUFtRztRQUNuRyxNQUFNLEtBQUssR0FBRyxDQUFDLEVBQUUsaUJBQWlCLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFDdEYsTUFBTSxRQUFRLEdBQUcsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hELDRGQUE0RjtRQUM1RixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3BELE9BQU87WUFDTCxJQUFJO1lBQ0osUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsYUFBYSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFO1lBQ3BFLFNBQVMsRUFBRSxDQUFDLEVBQUUsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUc7WUFDakYsUUFBUSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUM7WUFDdEMsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLElBQUksQ0FBQztZQUMvQyx1R0FBdUc7WUFDdkcsUUFBUSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQztZQUMvQixRQUFRLEVBQUUsSUFBSSxHQUFHLEdBQUc7WUFDcEIsS0FBSyxFQUFFLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLEdBQUc7WUFDNUMsUUFBUTtZQUNSLE1BQU0sRUFBRSxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDbkUsR0FBRyxFQUFFLENBQUM7U0FDUCxDQUFDO0lBQ0osQ0FBQztJQUVPLFVBQVUsQ0FBQyxDQUFNO1FBQ3ZCLE9BQU87WUFDTCxJQUFJLEVBQUUsQ0FBQyxFQUFFLFFBQVEsSUFBSSxHQUFHO1lBQ3hCLEtBQUssRUFBRSxDQUFDLEVBQUUsU0FBUyxJQUFJLEdBQUc7WUFDMUIsUUFBUSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxJQUFJLENBQUM7WUFDMUMsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUM7WUFDckMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDNUIsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQztZQUN2QyxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDO1lBQ3ZDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUM7WUFDbEMsR0FBRyxFQUFFLENBQUM7U0FDUCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNLLFNBQVM7UUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUFFLE9BQU87U0FBRTtRQUNqQyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixNQUFNLE9BQU8sR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDbkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2pDLGdFQUFnRTtRQUNoRSxJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDO1lBQ25DLFFBQVEsRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQztZQUNqRixPQUFPLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFO1NBQ3BGLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUNuRixJQUFJLE9BQU8sS0FBSyxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUFFLE9BQU87YUFBRTtZQUM3QyxNQUFNLElBQUksR0FBRyxHQUFHLEVBQUUsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDM0QsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFBRSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQzthQUFFO1lBQ3RDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4RSxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUN6QixJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLFdBQVcsQ0FBQyxDQUFNO1FBQ3hCLElBQUksQ0FBQyxlQUFlLEdBQUc7WUFDckIsVUFBVSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUM7WUFDM0MsVUFBVSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUM7WUFDM0MsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUM7U0FDbEMsQ0FBQztRQUNGLElBQUksQ0FBQyxDQUFDLEVBQUU7WUFBRSxPQUFPLEVBQUUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO1NBQUU7UUFDM0MsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFNLEVBQUUsRUFBRTtZQUN2QixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RELENBQUMsQ0FBQztRQUNGLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RELE1BQU0sRUFBRSxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsY0FBYyxHQUFHLElBQUksR0FBRyxPQUFPLENBQUM7UUFDeEUsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFnQixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDaEYsT0FBTztZQUNMLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztZQUNqQyxhQUFhLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7WUFDckMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO1lBQ25DLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUM3QixVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7WUFDL0IsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzdCLGVBQWUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUM7WUFDaEQsZUFBZSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQztZQUNoRCxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7WUFDL0IsZUFBZSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQztZQUN2RCxlQUFlLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDO1lBQ3ZELFVBQVUsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUM7U0FDOUMsQ0FBQztJQUNKLENBQUM7SUFFRCw0RkFBNEY7SUFDcEYsVUFBVSxDQUFDLENBQU07UUFDdkIsTUFBTSxJQUFJLEdBQUcsQ0FBQyxFQUFFLFFBQVEsSUFBSSxHQUFHLENBQUM7UUFDaEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDM0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbEMsSUFBSSxTQUFTLEdBQUcsR0FBRyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxFQUFFLG9CQUFvQixFQUFFO1lBQzNCLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1NBQ3BEO2FBQU0sSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFO1lBQ3JCLFNBQVMsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDMUM7UUFDRCxNQUFNLFNBQVMsR0FBRyxDQUFDLEVBQUUsYUFBYSxJQUFJLEVBQUUsQ0FBQztRQUN6QyxNQUFNLE9BQU8sR0FBRyxDQUFDLEVBQUUsU0FBUyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN6RixNQUFNLEdBQUcsR0FBRyxDQUFDLEVBQUUsT0FBTyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUMvRSxPQUFPO1lBQ0wsSUFBSTtZQUNKLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUU7WUFDeEMsU0FBUyxFQUFFLFNBQVMsSUFBSSxJQUFJO1lBQzVCLGlCQUFpQixFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUNuRyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQ3pELFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNsRCxRQUFRLEVBQUUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDakUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUM3QyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDcEMsU0FBUztZQUNULFFBQVEsRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRztZQUN4RCxRQUFRLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQztZQUNwQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQztZQUN0QyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQztZQUM5QixLQUFLLEVBQUUsTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQzdDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQzVCLFVBQVUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztZQUNwQyxhQUFhLEVBQUUsVUFBVSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztZQUMvRCxHQUFHLEVBQUUsQ0FBQztTQUNQLENBQUM7SUFDSixDQUFDO0lBRUQsa0dBQWtHO0lBQ2xHLGNBQWMsQ0FBQyxHQUFpQjtRQUM5QixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQUUsT0FBTyxTQUFTLENBQUM7U0FBRTtRQUNoRCxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLE1BQU0sSUFBSSxHQUFHLEdBQUcsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDeEMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVPLEdBQUcsQ0FBQyxDQUFNO1FBQ2hCLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssU0FBUyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFBRSxPQUFPLElBQUksQ0FBQztTQUFFO1FBQy9ELE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQixPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVPLE9BQU8sQ0FBQyxDQUFNO1FBQ3BCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsT0FBTyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2hELENBQUM7SUFFTyxTQUFTLENBQUMsQ0FBUztRQUN6QixPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUM5RCxDQUFDO0lBRU8sR0FBRyxDQUFDLENBQU07UUFDaEIsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUNuRCxDQUFDO0lBRUQsd0RBQXdEO0lBQ3hELElBQUksWUFBWTtRQUNkLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDM0MsT0FBTyxJQUFJLENBQUMsSUFBSTthQUNiLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQzthQUM5RCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDVixJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssSUFBSSxFQUFFO2dCQUNwQixPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssR0FBRyxDQUFDO2FBQ3JEO1lBQ0QsbUZBQW1GO1lBQ25GLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDdEYsQ0FBQyxDQUFDO2FBQ0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDcEosSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRU8sT0FBTyxDQUFDLENBQVcsRUFBRSxDQUFXO1FBQ3RDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVDLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxPQUFPLEVBQUU7WUFDNUIseUZBQXlGO1lBQ3pGLGtGQUFrRjtZQUNsRixJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssSUFBSSxFQUFFO2dCQUN4QyxPQUFPLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDOUQ7WUFDRCxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDO1NBQ2xDO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLFFBQVEsRUFBRTtZQUM3QixPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDO1NBQ3BDO1FBQ0QsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBeUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzNELE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQXlCLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMzRCxPQUFPLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVELElBQUksUUFBUTtRQUNWLE1BQU0sS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzlDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELHVEQUF1RDtJQUN2RCxJQUFZLFNBQVM7UUFDbkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELGtFQUFrRTtJQUNsRSxJQUFZLFlBQVk7UUFDdEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3pELENBQUM7SUFFRCxJQUFJLFlBQVk7UUFDZCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzFCLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFO1lBQUUsT0FBTyxJQUFJLENBQUM7U0FBRTtRQUNoQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBSSxDQUFDLENBQUMsS0FBZ0IsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDMUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUM5QixNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUUsQ0FBQyxDQUFDLEtBQWdCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUM5RSxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztRQUN4QyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUUsQ0FBQyxDQUFDLEtBQWdCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNoRixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3hDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDbEMsSUFBSSxPQUFPLEdBQUcsdUJBQXVCLENBQUM7UUFDdEMsSUFBSSxHQUFHLEtBQUssSUFBSSxFQUFFO1lBQ2hCLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLDBDQUEwQyxDQUFDLENBQUMsQ0FBQywwQkFBMEIsQ0FBQztTQUM3RjtRQUVELE9BQU87WUFDTDtnQkFDRSxLQUFLLEVBQUUsZUFBZTtnQkFDdEIsS0FBSyxFQUFFLEdBQUcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUc7Z0JBQ3JDLElBQUksRUFBRSxPQUFPO2dCQUNiLFNBQVMsRUFBRSxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVM7YUFDdkU7WUFDRDtnQkFDRSxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsT0FBTztnQkFDakMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHO2dCQUN0RSxJQUFJLEVBQUUsU0FBUyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLEdBQUcsU0FBUyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUk7Z0JBQ3BGLFNBQVMsRUFBRSxTQUFTO2FBQ3JCO1lBQ0Q7Z0JBQ0UsS0FBSyxFQUFFLGlCQUFpQjtnQkFDeEIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUM7Z0JBQ3ZCLElBQUksRUFBRSxjQUFjLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxHQUFHO2dCQUM5QyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVM7YUFDNUM7WUFDRDtnQkFDRSx5RkFBeUY7Z0JBQ3pGLEtBQUssRUFBRSxrQkFBa0I7Z0JBQ3pCLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDbEYsSUFBSSxFQUFFLFlBQVksR0FBRyxDQUFDLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUM7Z0JBQzlFLFNBQVMsRUFBRSxTQUFTO2FBQ3JCO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFJLFdBQVc7UUFDYixJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFBRSxPQUFPLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQztTQUFFO1FBQ3RILE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFJLFFBQVE7UUFDVixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssVUFBVSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUN6RSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDbkUsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO2dCQUMzQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNO2dCQUNyRCxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFlLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDM0YsT0FBTztnQkFDTCxJQUFJO2dCQUNKLEtBQUs7Z0JBQ0wsK0ZBQStGO2dCQUMvRixLQUFLLEVBQUUsS0FBSyxJQUFJLEtBQUssR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRztnQkFDdkYsS0FBSyxFQUFFLENBQUMsS0FBSyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHO2FBQ25DLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxvR0FBb0c7SUFDcEcsT0FBTyxDQUFDLEdBQWE7UUFDbkIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMvQyxJQUFJLEdBQUcsQ0FBQyxLQUFLLEtBQUssSUFBSSxFQUFFO1lBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQztTQUFFO1FBQ3RGLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7UUFDeEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDOUYsQ0FBQztJQUVELDJHQUEyRztJQUNuRyxNQUFNLENBQUMsS0FBYSxFQUFFLElBQWU7UUFDM0MsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDaEUsQ0FBQztJQUVELFdBQVcsQ0FBQyxHQUFhO1FBQ3ZCLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxNQUFNLEVBQUU7WUFBRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1NBQUU7UUFDdkQsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLE1BQU0sRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7U0FBRTtRQUN2RCxPQUFPLEdBQUcsQ0FBQyxNQUFNLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztJQUNsRSxDQUFDO0lBRUQsb0RBQW9EO0lBQ3BELFNBQVMsQ0FBQyxHQUFhO1FBQ3JCLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDakUsQ0FBQztJQUVELDRHQUE0RztJQUM1RyxTQUFTLENBQUMsR0FBYTtRQUNyQixNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUQsT0FBTyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDO0lBQ2pELENBQUM7SUFFRCxPQUFPLENBQUMsR0FBYTtRQUNuQixJQUFJLEdBQUcsQ0FBQyxLQUFLLEtBQUssSUFBSSxFQUFFO1lBQUUsT0FBTyxTQUFTLENBQUM7U0FBRTtRQUM3QyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDeEMsSUFBSSxHQUFHLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFBRSxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7U0FBRTtRQUMxRSxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDeEMsQ0FBQztJQUVELFFBQVEsQ0FBQyxLQUF5QjtRQUNoQyxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQUUsT0FBTztTQUFFO1FBQ3JDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3ZILE9BQU87U0FDUjtRQUNELDZDQUE2QztRQUM3QyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLFNBQVMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQzFELElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsT0FBTyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDcEQsSUFBSSxDQUFDLEtBQUssR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7U0FBRTtJQUNqRCxDQUFDO0lBRUQsU0FBUyxDQUFDLE1BQW9CO1FBQzVCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFFRCxNQUFNLENBQUMsR0FBVztRQUNoQixJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssR0FBRyxFQUFFO1lBQ3hCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1NBQ3hEO2FBQU07WUFDTCxJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQztZQUNuQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztTQUN0QjtJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxTQUFTLENBQUMsSUFBZTtRQUN2QixJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ25DLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFrQixDQUFDO1NBQ3ZDO2FBQU07WUFDTCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1NBQ2Y7UUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDNUIsaURBQWlEO1FBQ2pELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUFFLE9BQU87U0FBRTtRQUNqQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckgsQ0FBQztJQUVELFNBQVM7UUFDUCxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNsQixJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQztRQUNwQixJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNoQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsYUFBYSxHQUFHLElBQUksQ0FBQztJQUNyQixzREFBc0Q7SUFDdEQsV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUVqQixJQUFJLGFBQWE7UUFDZixPQUFPLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDO0lBQzlFLENBQUM7SUFFRCwrRUFBK0U7SUFDL0UsUUFBUSxDQUFDLElBQWU7UUFDdEIsSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDO1NBQUU7UUFDekUsT0FBTyxJQUFJLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO0lBQ2hFLENBQUM7SUFFRCxJQUFJLGdCQUFnQjtRQUNsQixPQUFPLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssR0FBRyxDQUFDO0lBQ3RELENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BILE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUM7SUFDcEcsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNoQixDQUFDO0lBRUQsbURBQW1EO0lBQ25ELElBQUksVUFBVTtRQUNaLE9BQU87WUFDTCxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsUUFBUTtnQkFDeEUsR0FBRyxFQUFFLG9FQUFvRTtnQkFDekUsS0FBSyxFQUFFLEtBQUssRUFBRTtZQUNoQixFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxpQkFBaUI7Z0JBQ3hGLEdBQUcsRUFBRSxnRUFBZ0U7Z0JBQ3JFLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUN4QixFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxLQUFLLEVBQUUsWUFBWTtnQkFDakYsR0FBRyxFQUFFLDZDQUE2QztnQkFDbEQsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxFQUFFO1lBQ25DLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLEtBQUssRUFBRSxhQUFhO2dCQUNsRixHQUFHLEVBQUUsZ0RBQWdEO2dCQUNyRCxLQUFLLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ2hDLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLFFBQVE7Z0JBQzlFLEdBQUcsRUFBRSw0Q0FBNEMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRztnQkFDdEcsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLEtBQUssS0FBSyxFQUFFO1NBQ2pDLENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVELElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3JELENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3ZFLENBQUM7SUFFRCw4RUFBOEU7SUFDdEUsUUFBUSxDQUFDLE1BQWdCO1FBQy9CLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BHLENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDOUYsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNySCxDQUFDO0lBRUQsSUFBSSxZQUFZO1FBQ2QsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUM3QixPQUFPLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVELFlBQVksQ0FBQyxHQUFxQjtRQUNoQyxJQUFJLEdBQUcsS0FBSyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQzFCLCtFQUErRTtZQUMvRSxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztTQUMxQjtRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDO1FBQ3JCLElBQUksR0FBRyxLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1NBQUU7SUFDOUQsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDdkcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxTQUFTLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLFlBQVksQ0FBQztJQUMzSCxDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2hCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUQsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztJQUNwQyxDQUFDO0lBRUQsSUFBSSxpQkFBaUI7UUFDbkIsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLEtBQUssRUFBRTtZQUFFLE9BQU8sWUFBWSxDQUFDO1NBQUU7UUFDbkQsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLE1BQU0sRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDO1NBQUU7UUFDcEUsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFVBQVUsRUFBRTtZQUFFLE9BQU8sWUFBWSxDQUFDO1NBQUU7UUFDeEQsT0FBTyxJQUFJLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7SUFDL0UsQ0FBQztJQUVELFdBQVcsQ0FBQyxHQUFZO1FBQ3RCLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQThCLENBQUM7UUFDOUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN2QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztJQUMxQixDQUFDO0lBRUQsU0FBUyxDQUFDLEdBQVc7UUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUM7SUFDdkIsQ0FBQztJQUVELFlBQVk7UUFDVixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3JCLE1BQU0sYUFBYSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLEVBQUU7WUFDTCxNQUFNLElBQUksR0FBRyxJQUFXLENBQUM7WUFDekIseUJBQXlCLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBSSxDQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNqRjtRQUNELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNsQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksYUFBYSxJQUFJLFlBQVksRUFBRTtZQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUFFO1FBQzNELGlFQUFpRTtRQUNqRSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLEtBQUssRUFBRTtZQUNsRCxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsRUFBRSxjQUFjLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDcEg7SUFDSCxDQUFDO0lBRUQsbUdBQW1HO0lBQzNGLFdBQVc7UUFDakIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUN2QixNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxLQUFLO2VBQzNHLENBQUMsQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNwQyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNySCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsMkVBQTJFO0lBQzNFLGFBQWE7UUFDWCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNsQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUMzQixDQUFDO0lBRUQscURBQXFEO0lBQ3JELFFBQVE7UUFDTixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQztRQUNwQixJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2QsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDbEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUM7UUFDcEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7UUFDZCxtRkFBbUY7UUFDbkYsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQUU7SUFDdkUsQ0FBQztJQUVELG1EQUFtRDtJQUNuRCxjQUFjO1FBQ1osSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDZixJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDZCxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNoQixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFFRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDZixJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFFRCwrRUFBK0U7SUFDL0UsSUFBSSxnQkFBZ0I7UUFDbEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVM7YUFDMUIsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQzthQUNyRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUMzRixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2FBQ3BCLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ2xELE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRCxxR0FBcUc7SUFDckcsV0FBVyxDQUFDLElBQWMsRUFBRSxHQUFXO1FBQ3JDLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3RixDQUFDO0lBRUQsa0VBQWtFO0lBQ2xFLElBQUksaUJBQWlCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsY0FBYyxDQUFDLEdBQVc7UUFDeEIsT0FBTyxDQUFDLEdBQUcsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLGNBQWMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLE9BQU8sRUFBRTtZQUFFLE9BQU8sYUFBYSxDQUFDO1NBQUU7UUFDdkQsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLE1BQU0sRUFBRTtZQUFFLE9BQU8sV0FBVyxDQUFDO1NBQUU7UUFDcEQsT0FBTyxJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQztJQUNsQyxDQUFDO0lBRUQsSUFBSSxlQUFlO1FBQ2pCLE9BQU8sV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDdEMsQ0FBQztJQUVELElBQUksWUFBWTtRQUNkLE9BQU8sSUFBSSxDQUFDLFNBQVMsS0FBSyxNQUFNLENBQUM7SUFDbkMsQ0FBQztJQUVELElBQUksZ0JBQWdCO1FBQ2xCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0MsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNoSSxDQUFDO0lBRUQsZUFBZSxDQUFDLENBQVMsRUFBRSxHQUFnQjtRQUN6QyxPQUFPLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUM7SUFDckMsQ0FBQztJQUVELDJFQUEyRTtJQUMzRSxJQUFZLFFBQVE7UUFDbEIsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUFFO1FBQzdGLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDWixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssSUFBSSxFQUFFO1lBQUUsT0FBTyxDQUFDLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztTQUFFO1FBQ3BELDZEQUE2RDtRQUM3RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQzlCLE9BQU8sR0FBRyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxJQUFJLFdBQVc7UUFDYixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssSUFBSSxFQUFFO1lBQUUsT0FBTyxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUM7U0FBRTtRQUMvRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQzlCLE9BQU8sR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUM5QyxDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ2IsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUN4QixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssSUFBSSxDQUFDO1FBQ2xFLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFBRSxPQUFPLFNBQVMsQ0FBQztTQUFFO1FBQy9CLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDO0lBQ2pFLENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDWCw4RkFBOEY7UUFDOUYsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTO1lBQ2hDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsU0FBUyxJQUFJLENBQUMsQ0FBQztZQUNqQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQy9ELE9BQU8sSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDO2NBQ3RGLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFRCxVQUFVLENBQUMsR0FBK0I7UUFDeEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7UUFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUVELHNGQUFzRjtJQUN0RixJQUFJLFNBQVM7UUFDWCxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssT0FBTyxFQUFFO1lBQUUsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDO1NBQUU7UUFDMUgsT0FBTyxJQUFJLENBQUMsT0FBTyxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztJQUNqRyxDQUFDO0lBRUQsOEdBQThHO0lBQzlHLFVBQVUsQ0FBSSxJQUFTO1FBQ3JCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUN0RSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDNUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRUQsVUFBVSxDQUFDLElBQVk7UUFDckIsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxjQUFjLENBQUMsSUFBUztRQUN0QixJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUVELHFDQUFxQztJQUNyQyxZQUFZO1FBQ1YsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUVELHVHQUF1RztJQUN2RyxRQUFRLENBQUMsR0FBVztRQUNsQixJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssR0FBRyxFQUFFO1lBQzVCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1NBQ2hFO2FBQU07WUFDTCxJQUFJLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQztZQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztTQUMxQjtJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSyxZQUFZLENBQUksSUFBUyxFQUFFLE1BQTJDO1FBQzVFLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDO1NBQUU7UUFDMUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFZLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLFNBQVMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUM7UUFDdkYsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzdCLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQixNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEIsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFO2dCQUFFLE9BQU8sS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQUU7WUFDMUYsSUFBSSxPQUFPLEVBQUUsS0FBSyxRQUFRLElBQUksT0FBTyxFQUFFLEtBQUssUUFBUSxFQUFFO2dCQUFFLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO2FBQUU7WUFDakYsT0FBTyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN2RyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCwwRkFBMEY7SUFDMUYsZUFBZSxDQUFDLEdBQWlCO1FBQy9CLE9BQU87WUFDTCxLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsa0JBQWtCLElBQUksR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDO1lBQ2hFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLFNBQVMsSUFBSSxFQUFFO1lBQ3pELEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLE9BQU8sSUFBSSxFQUFFO1NBQ3BELENBQUM7SUFDSixDQUFDO0lBRUQsNkdBQTZHO0lBQzdHLG1CQUFtQixDQUFDLEdBQWdCO1FBQ2xDLE9BQU87WUFDTCxLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxJQUFJLEVBQUUsQ0FBQztZQUNwQyxJQUFJLEVBQUUsTUFBTTtZQUNaLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLFNBQVMsSUFBSSxFQUFFO1lBQ3pELEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLE9BQU8sSUFBSSxFQUFFO1NBQ3BELENBQUM7SUFDSixDQUFDO0lBRUQsOEVBQThFO0lBQzlFLGNBQWMsQ0FBQyxHQUFnQjtRQUM3QixPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ3pELENBQUM7SUFFRDs7O09BR0c7SUFDSCxZQUFZLENBQUMsT0FBNEI7UUFDdkMsT0FBTztZQUNMLEdBQUcsT0FBTztZQUNWLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLFNBQVMsSUFBSSxFQUFFO1lBQ3pELEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLE9BQU8sSUFBSSxFQUFFO1NBQ3BELENBQUM7SUFDSixDQUFDO0lBRUQsWUFBWSxDQUFDLEdBQVc7UUFDdEIsT0FBTyxHQUFHLEdBQUcsY0FBYyxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUFJLHFCQUFxQjtRQUN2QixJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssT0FBTyxFQUFFO1lBQUUsT0FBTyxzQkFBc0IsQ0FBQztTQUFFO1FBQ2hFLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxNQUFNLEVBQUU7WUFBRSxPQUFPLHFCQUFxQixDQUFDO1NBQUU7UUFDOUQsT0FBTyxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsSUFBSSxpQkFBaUI7UUFDbkIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMvQyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ25JLENBQUM7SUFFRCxJQUFJLGlCQUFpQjtRQUNuQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQy9DLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsT0FBTyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3ZLLENBQUM7SUFFRCxJQUFJLGdCQUFnQjtRQUNsQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQy9DLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2xKLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxDQUFTLEVBQUUsR0FBaUI7UUFDM0MsT0FBTyxHQUFHLENBQUMsR0FBRyxFQUFFLGtCQUFrQixJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUM7SUFDakQsQ0FBQztJQUVELGdCQUFnQixDQUFDLENBQVMsRUFBRSxHQUFpQjtRQUMzQyxPQUFPLEdBQUcsQ0FBQyxPQUFPLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQztJQUNsQyxDQUFDO0lBRUQsZUFBZSxDQUFDLENBQVMsRUFBRSxHQUFnQjtRQUN6QyxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUM7SUFDbkIsQ0FBQztJQUVELFlBQVksQ0FBQyxJQUFZO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsSUFBUztRQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7SUFDaEIsQ0FBQztJQUVELFlBQVksQ0FBQyxDQUFTLEVBQUUsR0FBYTtRQUNuQyxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxVQUFVLENBQUMsQ0FBUyxFQUFFLENBQVk7UUFDaEMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUVELFdBQVcsQ0FBQyxDQUFTLEVBQUUsQ0FBc0I7UUFDM0MsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNwQixDQUFDO0lBRUQsNEZBQTRGO0lBRTVGLElBQVksWUFBWTtRQUN0QixPQUFPLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVELDRHQUE0RztJQUM1RyxZQUFZO1FBQ1YsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUMvQixJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQUUsT0FBTztTQUFFO1FBQzdDLE1BQU0sT0FBTyxHQUE2QixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDL0QsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLO1lBQ2YsS0FBSyxFQUFFLENBQUMsQ0FBVyxFQUFFLEVBQUU7Z0JBQ3JCLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxPQUFPLEVBQUU7b0JBQUUsT0FBTyxDQUFDLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztpQkFBRTtnQkFDekUsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLFFBQVEsRUFBRTtvQkFBRSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQUU7Z0JBQ3ZELE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFxQixDQUFDLENBQUM7WUFDcEMsQ0FBQztTQUNGLENBQUMsQ0FBQyxDQUFDO1FBQ0osSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSx5QkFBeUIsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQzlHLENBQUM7SUFFRCw0RkFBNEY7SUFDNUYsSUFBSSxZQUFZO1FBQ2QsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLE9BQU8sRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztTQUFFO1FBQ3ZFLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxNQUFNLEVBQUU7WUFBRSxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUM7U0FBRTtRQUNyRSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7SUFDMUYsQ0FBQztJQUVELHFGQUFxRjtJQUNyRixJQUFJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxPQUFPLEtBQUssT0FBTyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDekYsQ0FBQztJQUVELDRHQUE0RztJQUM1RyxpQkFBaUI7UUFDZixJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQUUsT0FBTztTQUFFO1FBQ3ZELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDakMsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLE9BQU8sRUFBRTtZQUM1QixNQUFNLE9BQU8sR0FBaUM7Z0JBQzVDLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFO2dCQUM3QyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRTtnQkFDN0MsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7Z0JBQzVDLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFO2dCQUM5QyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxHQUFHLEVBQUU7Z0JBQy9DLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFO2dCQUNwRCxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRTtnQkFDcEQsRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7YUFDaEQsQ0FBQztZQUNGLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsb0NBQW9DLEdBQUcsTUFBTSxFQUFFLG1CQUFtQixDQUFDLENBQUM7WUFDckksT0FBTztTQUNSO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLE1BQU0sRUFBRTtZQUMzQixNQUFNLE9BQU8sR0FBZ0M7Z0JBQzNDLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFO2dCQUMzQyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRTtnQkFDeEMsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7Z0JBQzlDLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFO2dCQUN4QyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRTtnQkFDdEMsRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUU7Z0JBQ3BELEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFO2dCQUNwRCxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRTthQUNoRCxDQUFDO1lBQ0YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxtQ0FBbUMsR0FBRyxNQUFNLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztZQUNsSSxPQUFPO1NBQ1I7UUFDRCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDckIsTUFBTSxPQUFPLEdBQWdDO2dCQUMzQyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRTtnQkFDM0MsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUU7Z0JBQ2pELEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFO2dCQUNqRCxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRTtnQkFDOUMsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7Z0JBQ2pELEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLElBQUksRUFBRTtnQkFDeEQsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxFQUFFO2dCQUM5QyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRTthQUMxQyxDQUFDO1lBQ0YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxtQ0FBbUMsR0FBRyxNQUFNLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztZQUNsSSxPQUFPO1NBQ1I7UUFDRCxNQUFNLE9BQU8sR0FBaUM7WUFDNUMsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7WUFDNUMsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7WUFDakQsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUU7WUFDaEQsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksR0FBRyxFQUFFO1lBQ3JELEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFO1lBQy9DLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFO1lBQ3hDLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRTtTQUM1RCxDQUFDO1FBQ0YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLE9BQU8sRUFBRSxvQ0FBb0MsR0FBRyxNQUFNLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUN2SSxDQUFDO0lBRUQsOEJBQThCO0lBRTlCLGtHQUFrRztJQUNsRyxVQUFVLENBQUMsR0FBYTtRQUN0QixPQUFPLEdBQUcsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ2pFLENBQUM7SUFFRCw0R0FBNEc7SUFDNUcsY0FBYyxDQUFDLEdBQWE7UUFDMUIsT0FBTyxHQUFHLENBQUMsR0FBRyxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDM0UsQ0FBQztJQUVEOzs7T0FHRztJQUNILFdBQVcsQ0FBQyxHQUFhO1FBQ3ZCLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3BFLENBQUM7SUFFRCx5REFBeUQ7SUFDekQsYUFBYSxHQUFHLEVBQUUsQ0FBQztJQUVuQiwyRkFBMkY7SUFDM0YsV0FBVyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFFbkMsY0FBYyxDQUFDLEdBQWEsRUFBRSxLQUFZO1FBQ3hDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxPQUFPLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BELElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxHQUFHLEVBQUU7WUFDOUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7WUFDeEIsT0FBTztTQUNSO1FBQ0QsTUFBTSxJQUFJLEdBQUksS0FBSyxDQUFDLGFBQTZCLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMxRSxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2hHLElBQUksQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDO0lBQzNCLENBQUM7SUFFRCxjQUFjLENBQUMsR0FBYTtRQUMxQixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoRyxDQUFDO0lBRUQsd0VBQXdFO0lBSXhFLGFBQWE7UUFDWCxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFdBQVcsQ0FBQyxHQUFhO1FBQ3ZCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekMsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxPQUFPLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQztRQUNoRCxNQUFNLEdBQUcsR0FBRyxPQUFPLEdBQUcsR0FBRyxHQUFHLE9BQU8sQ0FBQztRQUNwQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQUUsT0FBTztTQUFFO1FBQ3BELElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDO1FBQy9ELElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQW9CLENBQUM7WUFDcEMsUUFBUSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsTUFBTTtZQUNqQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPO1lBQzFDLGtCQUFrQixFQUFFLE9BQU87WUFDM0IsUUFBUTtZQUNSLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLE9BQU8sSUFBSSxRQUFRO1lBQzdELFFBQVEsRUFBRSxLQUFLO1lBQ2YsVUFBVSxFQUFFLFVBQVU7WUFDdEIsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDO1lBQ25CLGFBQWEsRUFBRSxFQUFFO1lBQ2pCLFNBQVMsRUFBRSxFQUFFO1lBQ2IsVUFBVSxFQUFFLEtBQUs7WUFDakIsYUFBYSxFQUFFLEtBQUs7WUFDcEIsUUFBUSxFQUFFLEtBQUs7WUFDZixRQUFRLEVBQUUsS0FBSztZQUNmLFlBQVksRUFBRSxLQUFLO1lBQ25CLFdBQVcsRUFBRSxPQUFPO1NBQ3JCLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUMxQyxJQUFJLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDakIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzNCLElBQUksR0FBRyxFQUFFLElBQUksS0FBSyxHQUFHLEVBQUU7b0JBQ3JCLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUN4QixvTEFBb0wsQ0FDckwsQ0FBQztpQkFDSDtxQkFBTTtvQkFDTCxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsT0FBTyxJQUFJLDRCQUE0QixDQUFDLENBQUM7aUJBQ3hFO1lBQ0gsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLENBQU0sRUFBRSxFQUFFO2dCQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLElBQUksNEJBQTRCLENBQUMsQ0FBQztZQUNqRyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzt3R0E1L0NVLHlCQUF5Qjs0RkFBekIseUJBQXlCLG9NQ3hQdEMsc3Z0REFtM0JBOzs0RkQzbkJhLHlCQUF5QjtrQkFMckMsU0FBUzsrQkFDRSx3QkFBd0I7NEtBKzhDbEMsYUFBYTtzQkFIWixZQUFZO3VCQUFDLGdCQUFnQjs7c0JBQzdCLFlBQVk7dUJBQUMsZUFBZTs7c0JBQzVCLFlBQVk7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEhvc3RMaXN0ZW5lciwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgU3ViamVjdCwgZGVib3VuY2VUaW1lLCBmb3JrSm9pbiwgb2YsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBHbG9iYWxTdGF0ZVNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktZ2xvYmFsJztcclxuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLXNoYXJlZCc7XHJcbmltcG9ydCBkYXlqcyBmcm9tICdkYXlqcyc7XHJcbmltcG9ydCB7IFRyYXhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdHJheC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXVkaXRBY2Nlc3MsIGF1ZGl0QWNjZXNzIH0gZnJvbSAnLi4vYXVkaXQtdjItYWNjZXNzJztcclxuaW1wb3J0IHsgQXVkaXRMYWJlbHMsIERFRkFVTFRfQVVESVRfTEFCRUxTLCBsb2FkQXVkaXRMYWJlbHMgfSBmcm9tICcuLi9hdWRpdC12Mi1sYWJlbHMnO1xyXG5pbXBvcnQgeyBQSUNLRVJfTE9DQUxFLCBQaWNrZWREYXRlcywgUGlja2VyUmFuZ2UsIGZyb21QaWNrZXJSYW5nZSwgcGlja2VyUmFuZ2VzLCB0b1BpY2tlclJhbmdlIH0gZnJvbSAnLi4vYXVkaXQtdjItZGF0ZXBpY2tlcic7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0QmFuZCB7XHJcbiAga2V5OiBzdHJpbmc7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICByYW5nZTogc3RyaW5nO1xyXG4gIGxvOiBudW1iZXI7XHJcbiAgaGk6IG51bWJlcjtcclxuICBzb2Z0OiBzdHJpbmc7XHJcbiAgYmc6IHN0cmluZztcclxuICBmZzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0Um93IHtcclxuICBkYXRlOiBzdHJpbmc7XHJcbiAgc3RvcmVJZDogc3RyaW5nO1xyXG4gIGNpcmNsZTogc3RyaW5nO1xyXG4gIHpvbmU6IHN0cmluZztcclxuICBhb206IHN0cmluZztcclxuICAvKiogQXVkaXRzIHRoZSBzdG9yZSBzdWJtaXR0ZWQgaW4gdGhlIHBlcmlvZCAodGhleSBhZGQgdXAgdG8gdGhlIFwiQXVkaXRzIGNvbXBsZXRlZFwiIGNhcmQpLiAqL1xyXG4gIGF1ZGl0czogbnVtYmVyO1xyXG4gIHNjb3JlOiBudW1iZXIgfCBudWxsO1xyXG4gIC8qKiAndW5zY29yZWQnID0gYXVkaXRlZCwgYnV0IG5vIHF1ZXN0aW9uIG9mIGl0cyBhdWRpdHMgaGFzIGNvbXBsaWFuY2Ugc2NvcmluZyBvbiAobm8gc2NvcmUgdG8gc2hvdykuICovXHJcbiAgc3RhdHVzOiBTdG9yZVN0YXR1cztcclxuICByYXc/OiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFN0b3JlU3RhdHVzID0gJ3Bhc3MnIHwgJ2ZhaWwnIHwgJ25hJyB8ICd1bnNjb3JlZCc7XHJcbmV4cG9ydCB0eXBlIFN0YXR1c0ZpbHRlciA9ICdhbGwnIHwgU3RvcmVTdGF0dXM7XHJcblxyXG4vKiogQSBzb3J0YWJsZSBjb2x1bW4gb2YgYSBQZXJmb3JtYW5jZSB0YWJsZS4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBQZXJmQ29sdW1uIHtcclxuICBrZXk6IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG59XHJcblxyXG50eXBlIFNvcnRWYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQ7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0S3BpIHtcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIHZhbHVlOiBzdHJpbmc7XHJcbiAgbm90ZTogc3RyaW5nO1xyXG4gIG5vdGVDb2xvcjogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlckNhdCB7XHJcbiAga2V5OiBzdHJpbmc7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICB2YWx1ZTogc3RyaW5nO1xyXG4gIHRpdGxlOiBzdHJpbmc7XHJcbiAgc3ViOiBzdHJpbmc7XHJcbiAgZGlydHk6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXVkaXRQZXJmUm93IHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgaW5pdGlhbHM6IHN0cmluZztcclxuICBzY2hlZHVsZWQ6IHN0cmluZztcclxuICBhc3NpZ25lZDogbnVtYmVyO1xyXG4gIHN1Ym1pdHRlZDogbnVtYmVyO1xyXG4gIGRpc3B1dGVzOiBudW1iZXIgfCBudWxsO1xyXG4gIHBhc3NNYXJrOiBzdHJpbmc7XHJcbiAgc2NvcmU6IHN0cmluZztcclxuICBzY29yZVBjdDogbnVtYmVyO1xyXG4gIC8qKiAn4oCUJyB3aGVuIHRoZSBhdWRpdCBoYXMgbm8gY29tcGxpYW5jZSBzY29yaW5nIChubyBzY29yZSwgc28gbm8gcmVzdWx0KS4gKi9cclxuICByZXN1bHQ6ICdQYXNzJyB8ICdGYWlsJyB8ICfigJQnO1xyXG4gIHJhdz86IGFueTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTdG9yZVBlcmZSb3cge1xyXG4gIHN0b3JlSWQ6IHN0cmluZztcclxuICBzdG9yZTogc3RyaW5nO1xyXG4gIHNwb2M6IHN0cmluZztcclxuICBhc3NpZ25lZDogbnVtYmVyO1xyXG4gIGZsYWdzOiBudW1iZXIgfCBudWxsO1xyXG4gIGNvbXBsZXRpb246IHN0cmluZztcclxuICBjb21wbGlhbmNlOiBzdHJpbmc7XHJcbiAgcGVyZjogc3RyaW5nO1xyXG4gIHJhdz86IGFueTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBVc2VyUGVyZlJvdyB7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIGVtYWlsOiBzdHJpbmc7XHJcbiAgYXNzaWduZWQ6IG51bWJlcjtcclxuICBmbGFnczogbnVtYmVyO1xyXG4gIHJlZG86IG51bWJlcjtcclxuICBjb21wbGV0aW9uOiBzdHJpbmc7XHJcbiAgY29tcGxpYW5jZTogc3RyaW5nO1xyXG4gIHBlcmY6IHN0cmluZztcclxuICByYXc/OiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGFza1BlcmZSb3cge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBpbml0aWFsczogc3RyaW5nO1xyXG4gIC8qKiBUYXNrIEluZm8gKGFzIENoZWNrbGlzdCA+IERhc2hib2FyZCA+IFRhc2spOiB3aG8gY3JlYXRlZCB0aGUgdGFzaywgd2hlbiwgaXRzIHByaW9yaXR5IGFuZCBkdWUgZGF0ZS4gKi9cclxuICBjcmVhdGVkQnk6IHN0cmluZztcclxuICBjcmVhdGVkQnlJbml0aWFsczogc3RyaW5nO1xyXG4gIGNyZWF0ZWRPbjogc3RyaW5nO1xyXG4gIGNyZWF0ZWRPbklzbzogc3RyaW5nO1xyXG4gIHByaW9yaXR5OiBzdHJpbmc7XHJcbiAgZHVlT246IHN0cmluZztcclxuICBkdWVJc286IHN0cmluZztcclxuICBzY2hlZHVsZWQ6IHN0cmluZztcclxuICBjb3ZlcmFnZTogc3RyaW5nO1xyXG4gIGFzc2lnbmVkOiBudW1iZXI7XHJcbiAgc3VibWl0dGVkOiBudW1iZXI7XHJcbiAgZmxhZ3M6IG51bWJlcjtcclxuICB0YXNrczogc3RyaW5nO1xyXG4gIHJlZG86IG51bWJlcjtcclxuICBjb21wbGlhbmNlOiBzdHJpbmc7XHJcbiAgY29tcGxpYW5jZVBjdDogbnVtYmVyO1xyXG4gIHJhdz86IGFueTtcclxufVxyXG5cclxuLyoqIFRhc2stbW9kZSB0aWxlcywgYXMgZGlzcGxheWVkICgn4oCUJyB3aGVuIHRoZSBBUEkgaGFzIG5vIHZhbHVlKS4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBUYXNrU3RhdHMge1xyXG4gIGFjdGl2ZVRhc2tzOiBzdHJpbmc7XHJcbiAgdGFza0luc3RhbmNlczogc3RyaW5nO1xyXG4gIG5vdFN1Ym1pdHRlZDogc3RyaW5nO1xyXG4gIG9wZW5UYXNrczogc3RyaW5nO1xyXG4gIGluUHJvZ3Jlc3M6IHN0cmluZztcclxuICBzdWJtaXR0ZWQ6IHN0cmluZztcclxuICBjb21wbGV0aW9uU2NvcmU6IHN0cmluZztcclxuICBjb21wbGlhbmNlU2NvcmU6IHN0cmluZztcclxuICB0b3RhbEZsYWdzOiBzdHJpbmc7XHJcbiAgY29tcGxldGlvbkRlbHRhOiBzdHJpbmc7XHJcbiAgY29tcGxpYW5jZURlbHRhOiBzdHJpbmc7XHJcbiAgZmxhZ3NEZWx0YTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBUYXNrRGVsdGFLZXkgPSAnY29tcGxldGlvbicgfCAnY29tcGxpYW5jZScgfCAnZmxhZ3MnO1xyXG5cclxuLyoqIE9uZSBleHBvcnRlZCBjb2x1bW46IGhlYWRlciB0ZXh0IGFuZCB0aGUgY2VsbCB2YWx1ZSBmb3IgYSByb3cuICovXHJcbmludGVyZmFjZSBFeHBvcnRDb2x1bW48VD4ge1xyXG4gIGhlYWRlcjogc3RyaW5nO1xyXG4gIHZhbHVlOiAocm93OiBUKSA9PiBhbnk7XHJcbn1cclxuXHJcbmNvbnN0IEVNUFRZX1RBU0tfU1RBVFM6IFRhc2tTdGF0cyA9IHtcclxuICBhY3RpdmVUYXNrczogJ+KAlCcsXHJcbiAgdGFza0luc3RhbmNlczogJ+KAlCcsXHJcbiAgbm90U3VibWl0dGVkOiAn4oCUJyxcclxuICBvcGVuVGFza3M6ICfigJQnLFxyXG4gIGluUHJvZ3Jlc3M6ICfigJQnLFxyXG4gIHN1Ym1pdHRlZDogJ+KAlCcsXHJcbiAgY29tcGxldGlvblNjb3JlOiAn4oCUJyxcclxuICBjb21wbGlhbmNlU2NvcmU6ICfigJQnLFxyXG4gIHRvdGFsRmxhZ3M6ICfigJQnLFxyXG4gIGNvbXBsZXRpb25EZWx0YTogJycsXHJcbiAgY29tcGxpYW5jZURlbHRhOiAnJyxcclxuICBmbGFnc0RlbHRhOiAnJ1xyXG59O1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUcmVuZEJhciB7XHJcbiAga2V5OiBzdHJpbmc7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICAvKiogQXZlcmFnZSBvZiB0aGUgY29tcGxpYW5jZS1zY29yZWQgYXVkaXRzOyBudWxsIHdoZW4gbm9uZS4gKi9cclxuICB2YWx1ZTogbnVtYmVyIHwgbnVsbDtcclxuICAvKiogQ29tcGxpYW5jZS1zY29yZWQgYXVkaXRzICh0aGUgb25lcyB0aGUgYXZlcmFnZSByZWFkcykuICovXHJcbiAgY291bnQ6IG51bWJlcjtcclxuICAvKiogRXZlcnkgc3VibWl0dGVkIGF1ZGl0LCBzY29yZWQgb3Igbm90LiAqL1xyXG4gIHN1Ym1pdHRlZDogbnVtYmVyO1xyXG59XHJcblxyXG4vKiogT25lIGZpbmFuY2lhbCBxdWFydGVyOiBBcHJpbC1NYXJjaCB5ZWFyLCBuYW1lZCBieSB0aGUgeWVhciBpdCBzdGFydHMgaW4gKHByb3RvdHlwZTogQXVnIDIwMjYgPSBRMiBGWTI2KS4gKi9cclxuaW50ZXJmYWNlIEZpc2NhbFF1YXJ0ZXIge1xyXG4gIGtleTogc3RyaW5nO1xyXG4gIGZyb206IHN0cmluZztcclxuICB0bzogc3RyaW5nO1xyXG4gIG1vbnRoczogc3RyaW5nO1xyXG59XHJcblxyXG4vKiogVGhlIGxhc3QgYG5gIGZpbmFuY2lhbCBxdWFydGVycywgb2xkZXN0IGZpcnN0LCBlbmRpbmcgd2l0aCB0aGUgb25lIGB0b2RheWAgZmFsbHMgaW4uICovXHJcbmZ1bmN0aW9uIGZpc2NhbFF1YXJ0ZXJzKHRvZGF5ID0gZGF5anMoKSwgbiA9IDQpOiBGaXNjYWxRdWFydGVyW10ge1xyXG4gIGNvbnN0IGN1cnJlbnQgPSB0b2RheS5zdGFydE9mKCdtb250aCcpLnN1YnRyYWN0KCh0b2RheS5tb250aCgpICsgOSkgJSAzLCAnbW9udGgnKTtcclxuICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogbiB9LCAoXywgaSkgPT4ge1xyXG4gICAgY29uc3Qgc3RhcnQgPSBjdXJyZW50LnN1YnRyYWN0KDMgKiAobiAtIDEgLSBpKSwgJ21vbnRoJyk7XHJcbiAgICBjb25zdCBlbmQgPSBzdGFydC5hZGQoMiwgJ21vbnRoJykuZW5kT2YoJ21vbnRoJyk7XHJcbiAgICBjb25zdCBmeSA9IHN0YXJ0Lm1vbnRoKCkgPj0gMyA/IHN0YXJ0LnllYXIoKSA6IHN0YXJ0LnllYXIoKSAtIDE7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBrZXk6ICdRJyArIChNYXRoLmZsb29yKCgoc3RhcnQubW9udGgoKSArIDkpICUgMTIpIC8gMykgKyAxKSArICcgRlknICsgU3RyaW5nKGZ5KS5zbGljZSgyKSxcclxuICAgICAgZnJvbTogc3RhcnQuZm9ybWF0KCdZWVlZLU1NLUREJyksXHJcbiAgICAgIHRvOiBlbmQuZm9ybWF0KCdZWVlZLU1NLUREJyksXHJcbiAgICAgIG1vbnRoczogc3RhcnQuZm9ybWF0KCdNTU0nKSArICcg4oCTICcgKyBlbmQuZm9ybWF0KCdNTU0gWVlZWScpXHJcbiAgICB9O1xyXG4gIH0pO1xyXG59XHJcblxyXG4vKiogUGFzcyBtYXJrIGFuZCBjcml0aWNhbCB0aHJlc2hvbGQgZm9yIHRoZSBhdWRpdCBwcm9ncmFtbWUgKG5vIHBlci1hdWRpdCBwYXNzIG1hcmsgaW4gdGhlIGRhdGEgeWV0KS4gKi9cclxuY29uc3QgUEFTU19NQVJLID0gNzU7XHJcbmNvbnN0IENSSVRJQ0FMX01BUksgPSA2MDtcclxuXHJcbmNvbnN0IEJBTkRTOiBBdWRpdEJhbmRbXSA9IFtcclxuICB7IGtleTogJ2V4Y2VsbGVudCcsIGxhYmVsOiAnRXhjZWxsZW50JywgcmFuZ2U6ICc5MC0xMDAlJywgbG86IDkwLCBoaTogMTAwLCBzb2Z0OiAnIzhGQkZBNScsIGJnOiAnI0VDRkRGMycsIGZnOiAnIzAyN0E0OCcgfSxcclxuICB7IGtleTogJ2dvb2QnLCBsYWJlbDogJ0dvb2QnLCByYW5nZTogJzc1LTg5JScsIGxvOiA3NSwgaGk6IDg5LCBzb2Z0OiAnIzk2QjRENicsIGJnOiAnI0VGRjhGRicsIGZnOiAnIzE3NUNEMycgfSxcclxuICB7IGtleTogJ2ZhaXInLCBsYWJlbDogJ05lZWRzIGltcHJvdmVtZW50JywgcmFuZ2U6ICc2MC03NCUnLCBsbzogNjAsIGhpOiA3NCwgc29mdDogJyNEQ0JFOEMnLCBiZzogJyNGRkZBRUInLCBmZzogJyNCNTQ3MDgnIH0sXHJcbiAgeyBrZXk6ICdjcml0aWNhbCcsIGxhYmVsOiAnQ3JpdGljYWwnLCByYW5nZTogJ0JlbG93IDYwJScsIGxvOiAwLCBoaTogNTksIHNvZnQ6ICcjRDZBMTlCJywgYmc6ICcjRkVGM0YyJywgZmc6ICcjQjQyMzE4JyB9LFxyXG4gIHsga2V5OiAndW5zY29yZWQnLCBsYWJlbDogJ05vdCBzY29yZWQnLCByYW5nZTogJ0NvbXBsaWFuY2Ugc2NvcmUgb2ZmJywgbG86IDAsIGhpOiAxMDAsIHNvZnQ6ICcjQzdEN0ZFJywgYmc6ICcjRUVGNEZGJywgZmc6ICcjMzUzOENEJyB9LFxyXG4gIHsga2V5OiAnbmEnLCBsYWJlbDogJ05vdCBhdWRpdGVkJywgcmFuZ2U6ICdObyBzdWJtaXNzaW9uJywgbG86IDAsIGhpOiAxMDAsIHNvZnQ6ICcjRDZEQUUwJywgYmc6ICcjRjJGNEY3JywgZmc6ICcjNDc1NDY3JyB9XHJcbl07XHJcblxyXG4vKiogQmFuZHMgdGhhdCBob2xkIHN0b3JlcyB3aXRob3V0IGEgc2NvcmU7IHRoZXkgZmlsdGVyIGJ5IHN0YXR1cywgbm90IGJ5IHNjb3JlIHJhbmdlLiAqL1xyXG5jb25zdCBTVEFUVVNfQkFORFMgPSBbJ3Vuc2NvcmVkJywgJ25hJ107XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0VHlwZU9wdGlvbiB7XHJcbiAga2V5OiBzdHJpbmc7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICBoZWxwOiBzdHJpbmc7XHJcbn1cclxuXHJcbmNvbnN0IEFMTF9BVURJVFM6IEF1ZGl0VHlwZU9wdGlvbiA9IHsga2V5OiAnYWxsJywgbGFiZWw6ICdBbGwgQXVkaXRzJywgaGVscDogJ0JsZW5kZWQgc2NvcmUgYWNyb3NzIGV2ZXJ5IHByb2dyYW1tZS4nIH07XHJcblxyXG4vKiogU3RvcmUgaGllcmFyY2h5IHBpY2tzOiBjaXJjbGUgaGVhZCAvIHpvbmUgbWFuYWdlciAvIEFPTSBuYW1lcyBhcyB0aGUgZGFzaGJvYXJkIEFQSSBzZW5kcyB0aGVtLCBzdG9yZSA9IHN0b3JlSWQuICovXHJcbmludGVyZmFjZSBTY29wZVBpY2sge1xyXG4gIGNpcmNsZTogc3RyaW5nO1xyXG4gIHpvbmU6IHN0cmluZztcclxuICBhb206IHN0cmluZztcclxuICBzdG9yZTogc3RyaW5nO1xyXG59XHJcblxyXG4vKipcclxuICogRGFzaGJvYXJkLiBTdG9yZSBsaXN0LCBzY29yZSBiYW5kcywgS1BJcyBhbmQgdGhlIGJ5LWRhdGUgdHJlbmQgY29tZSBmcm9tIHRoZSBhdWRpdCBBUElcclxuICogKC90cmF4L2F1ZGl0L2Rhc2hib2FyZCk7IHRoZSBBdWRpdCAvIFVzZXIgUGVyZm9ybWFuY2UgdGFicyBzdGlsbCB1c2UgdGhlIHYxIGRhc2hib2FyZFxyXG4gKiBlbmRwb2ludHMgKGNoZWNrbGlzdFBlcmZvcm1hbmNlIC8gdXNlclBlcmZvcm1hbmNlKS4gVGFzayBtb2RlICh0aWxlcyArIFRhc2sgUGVyZm9ybWFuY2UpIHJlYWRzXHJcbiAqIC90cmF4L2F1ZGl0L2Rhc2hib2FyZC90YXNrczogb25seSB0aGUgdGFza3MgcmFpc2VkIGZyb20gdGhpcyBjbGllbnQncyBhdWRpdHMuXHJcbiAqIFNjb3BlIChjbGllbnQsIHN0b3JlcywgZGF0ZXMpIGNvbWVzIGZyb20gdGhlIGdsb2JhbCBoZWFkZXIgZmlsdGVyOyB0aGUgcGVyaW9kIHBpY2tlciBjYW4gbmFycm93IHRoZSBkYXRlcy5cclxuICogRmlsdGVycyBkcmF3ZXI6IFN0b3JlIGhpZXJhcmNoeSBuYXJyb3dzIHRoZSBzdG9yZXMgYW5kIEF1ZGl0IHR5cGUgKGNoZWNrbGlzdElkKSB0aGUgYXVkaXQgb2YgZXZlcnkgZmVlZCAocmVsb2FkZWRcclxuICogb24gQXBwbHkpOyBTY29yZSByYW5nZSBhbmQgU3RhdHVzIG9ubHkgZmlsdGVyIHRoZSBsb2FkZWQgc3RvcmUgbGlzdCBpbiB0aGUgYnJvd3Nlci5cclxuICpcclxuICogUXVhcnRlcmx5OiB0aGUgdHJlbmQgc2hvd3MgdGhlIGxhc3QgZm91ciBmaW5hbmNpYWwgcXVhcnRlcnMgKGJ1aWx0IGZyb20gb25lIG1vbnRobHktYnVja2V0IGNhbGwgb2ZcclxuICogdGhlIHNhbWUgQVBJKSBhbmQgdGhlIHBpY2tlZCBxdWFydGVyIGJlY29tZXMgdGhlIHBlcmlvZCBvZiBldmVyeSBmZWVkLiBCeSBkYXRlOiB0aGUgcmFuZ2UgcGlja2VyLlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItYXVkaXQtdjItZGFzaGJvYXJkJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYXVkaXQtdjItZGFzaGJvYXJkLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vYXVkaXQtdjItZGFzaGJvYXJkLmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQXVkaXRWMkRhc2hib2FyZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICAvKiogUGFzcyAvIGNyaXRpY2FsIG1hcmtzIGNvbWUgZnJvbSB0aGUgYXVkaXQgZGFzaGJvYXJkIEFQSTsgdGhlc2UgYXJlIHRoZSBlbXB0eS1zdGF0ZSBkZWZhdWx0cy4gKi9cclxuICBwYXNzTWFyayA9IFBBU1NfTUFSSztcclxuICBjcml0aWNhbE1hcmsgPSBDUklUSUNBTF9NQVJLO1xyXG4gIHJlYWRvbmx5IGJhbmRzID0gQkFORFM7XHJcbiAgLyoqIFwiQWxsIEF1ZGl0c1wiLCB0aGVuIHRoZSBjbGllbnQncyBhdWRpdHMgKFBPU1QgL3RyYXgvYXVkaXQvbGlzdCk7IGtleSA9IGF1ZGl0IGlkLCBzZW50IGFzIGNoZWNrbGlzdElkLiAqL1xyXG4gIGF1ZGl0VHlwZXM6IEF1ZGl0VHlwZU9wdGlvbltdID0gW0FMTF9BVURJVFNdO1xyXG4gIC8qKiBDbGllbnQgdGhlIGF1ZGl0IGxpc3Qgd2FzIGZldGNoZWQgZm9yLiAqL1xyXG4gIHByaXZhdGUgYXVkaXRUeXBlc0NsaWVudCA9ICcnO1xyXG5cclxuICAvKipcclxuICAgKiBQZXJpb2Qgc2VsZWN0aW9uLiBmcm9tIC8gdG8gKFlZWVktTU0tREQpIHN0YXJ0IGFzIHRoZSBoZWFkZXIgZGF0ZSByYW5nZSBhbmQgZHJpdmUgZXZlcnkgZmVlZDtcclxuICAgKiB0aGUgcmFuZ2UgcGlja2VyIG5hcnJvd3MgdGhlbSwgYW5kIGEgaGVhZGVyIGNoYW5nZSByZXNldHMgdGhlbS5cclxuICAgKi9cclxuICBncmFpbjogJ3F1YXJ0ZXInIHwgJ2RhdGUnID0gJ2RhdGUnO1xyXG4gIHF1YXJ0ZXIgPSAnJztcclxuICByZWFkb25seSBmaXNjYWwgPSBmaXNjYWxRdWFydGVycygpO1xyXG4gIHJlYWRvbmx5IHF1YXJ0ZXJzID0gdGhpcy5maXNjYWwubWFwKHEgPT4gcS5rZXkpO1xyXG4gIC8qKiBRdWFydGVybHkgdHJlbmQgYmFycywgYW5kIHRoZSBjbGllbnQgKyBzdG9yZXMgdGhleSB3ZXJlIGZldGNoZWQgZm9yLiAqL1xyXG4gIHF1YXJ0ZXJUcmVuZDogVHJlbmRCYXJbXSA9IFtdO1xyXG4gIHF1YXJ0ZXJUcmVuZExvYWRpbmcgPSBmYWxzZTtcclxuICBwcml2YXRlIHF1YXJ0ZXJUcmVuZFNjb3BlID0gJyc7XHJcbiAgZnJvbSA9ICcnO1xyXG4gIHRvID0gJyc7XHJcbiAgcmFuZ2U6IFBpY2tlclJhbmdlIHwgbnVsbCA9IG51bGw7XHJcbiAgcmVhZG9ubHkgcGlja2VyTG9jYWxlID0gUElDS0VSX0xPQ0FMRTtcclxuICByZWFkb25seSByYW5nZXMgPSBwaWNrZXJSYW5nZXMoKTtcclxuICByZWFkb25seSB0b2RheSA9IGRheWpzKCk7XHJcblxyXG4gIC8qKiBGaWx0ZXJzLiAqL1xyXG4gIGF1ZGl0VHlwZSA9ICdhbGwnO1xyXG4gIHN0YXR1czogU3RhdHVzRmlsdGVyID0gJ2FsbCc7XHJcbiAgc2VhcmNoID0gJyc7XHJcbiAgc2NvcmVNaW4gPSAwO1xyXG4gIHNjb3JlTWF4ID0gMTAwO1xyXG5cclxuICAvKiogQXVkaXQgLyBUYXNrIHN3aXRjaC4gKi9cclxuICBtb2R1bGVUYWI6ICdBdWRpdCcgfCAnVGFzaycgPSAnQXVkaXQnO1xyXG4gIHJlYWRvbmx5IG1vZHVsZVRhYnM6IEFycmF5PCdBdWRpdCcgfCAnVGFzayc+ID0gWydBdWRpdCcsICdUYXNrJ107XHJcblxyXG4gIC8qKiBTaG93biBpbiB0aGUgcGFnZSBoZWFkZXI7IHN0YW1wZWQgb24gZXZlcnkgbG9hZC4gKi9cclxuICBsYXN0UmVmcmVzaGVkID0gJ+KAlCc7XHJcblxyXG4gIC8qKiBGaWx0ZXIgZHJhd2VyLiAqL1xyXG4gIGZpbHRlcnNPcGVuID0gZmFsc2U7XHJcbiAgYWN0aXZlQ2F0ID0gJ3BlcmlvZCc7XHJcbiAgLyoqXHJcbiAgICogVGhlIGZpbHRlciBkcmF3ZXIncyBkcmFmdCAoUUEgOSBPY3QpOiBPYmplY3QuY3JlYXRlKHRoaXMpLCBzbyBldmVyeSBnZXR0ZXIgdGhlIGRyYXdlciBzaG93cyB3b3JrcyBvbiB0aGUgZHJhZnQnc1xyXG4gICAqIG93biB2YWx1ZXMgd2hpbGUgdGhlIHBhZ2UgYmVoaW5kIGtlZXBzIHRoZSBhcHBsaWVkIG9uZXMuIEFwcGx5IGNvcGllcyBEUkFGVF9LRVlTIG9udG8gdGhlIHBhZ2U7IENhbmNlbCBkcm9wcyBpdC5cclxuICAgKi9cclxuICBkcmFmdDogQXVkaXRWMkRhc2hib2FyZENvbXBvbmVudCB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERSQUZUX0tFWVMgPSBbJ2dyYWluJywgJ3F1YXJ0ZXInLCAnZnJvbScsICd0bycsICdyYW5nZScsICdhdWRpdFR5cGUnLCAnY2lyY2xlJywgJ3pvbmUnLCAnYW9tJywgJ3N0b3JlJyxcclxuICAgICdzY29yZU1pbicsICdzY29yZU1heCcsICdzdGF0dXMnLCAnc3RvcmVMaXN0T3BlbicsICdsaXN0QmFuZEtleSddIGFzIGNvbnN0O1xyXG5cclxuICAvKipcclxuICAgKiBTdG9yZSBoaWVyYXJjaHkgcGlja3MgYmVpbmcgZWRpdGVkIGluIHRoZSBkcmF3ZXIgKHN0b3JlID0gc3RvcmVJZCkuIFRoZSBsaXN0cyBjb21lIGZyb20gdGhlIGRhc2hib2FyZFxyXG4gICAqIEFQSSdzIHN0b3JlIHJvd3Mgb2YgdGhlIGhlYWRlciBzY29wZTsgQXBwbHkgbmFycm93cyBldmVyeSBmZWVkIHRvIHRoZSBzdG9yZXMgdGhlIHBpY2sgY292ZXJzLlxyXG4gICAqL1xyXG4gIGNpcmNsZSA9ICcnO1xyXG4gIHpvbmUgPSAnJztcclxuICBhb20gPSAnJztcclxuICBzdG9yZSA9ICcnO1xyXG5cclxuICAvKiogU3RvcmUgcm93cyBvZiB0aGUgaGVhZGVyIHNjb3BlLCBub3QgbmFycm93ZWQgYnkgdGhlIGhpZXJhcmNoeTogdGhlIGRyYXdlcidzIGxpc3RzIGFuZCBlYWNoIHBpY2sncyBzdG9yZXMuICovXHJcbiAgcHJpdmF0ZSBzY29wZVJvd3M6IEF1ZGl0Um93W10gPSBbXTtcclxuICAvKiogSGllcmFyY2h5ICsgYXVkaXQgdHlwZSB0aGUgZmVlZHMgd2VyZSBsYXN0IGxvYWRlZCB3aXRoOyB0aGUgZHJhd2VyIGVkaXRzIGEgZHJhZnQgdW50aWwgQXBwbHkuICovXHJcbiAgcHJpdmF0ZSBhcHBsaWVkOiBTY29wZVBpY2sgJiB7IGF1ZGl0VHlwZTogc3RyaW5nIH0gPSB7IGNpcmNsZTogJycsIHpvbmU6ICcnLCBhb206ICcnLCBzdG9yZTogJycsIGF1ZGl0VHlwZTogJ2FsbCcgfTtcclxuICAvKiogQ2xpZW50ICsgaGVhZGVyIHN0b3JlczsgYSBjaGFuZ2UgcmVzZXRzIHRoZSBoaWVyYXJjaHkgcGlja3MgKHRoZWlyIHN0b3JlcyBtYXkgYmUgZ29uZSkuICovXHJcbiAgcHJpdmF0ZSBoZWFkZXJTY29wZUtleSA9ICcnO1xyXG5cclxuICAvKiogVGFibGUgc3RhdGUuICovXHJcbiAgc29ydEtleSA9ICdzY29yZSc7XHJcbiAgc29ydERpcjogJ2FzYycgfCAnZGVzYycgPSAnYXNjJztcclxuICBwYWdlID0gMTtcclxuICAvKiogU3RvcmUgbGlzdCBwYWdlcjogMTAgcm93cyBhIHBhZ2UsIDEwIC8gMjAgLyAzMCwgYXMgb24gZXZlcnkgYXVkaXQgbGlzdC4gKi9cclxuICBwYWdlU2l6ZSA9IDEwO1xyXG4gIHJlYWRvbmx5IHBhZ2VTaXplcyA9IFsxMCwgMjAsIDMwXTtcclxuXHJcbiAgaGVhZGVyczogQXJyYXk8eyBrZXk6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9PiA9IFtcclxuICAgIHsga2V5OiAnZGF0ZScsIGxhYmVsOiAnQXVkaXQgZGF0ZScgfSxcclxuICAgIC8vIFRoZSBjb2x1bW4gc2hvd3MgdGhlIHN0b3JlJ3MgbmFtZSAocm93LnN0b3JlSWQgaG9sZHMgaXQ7IHNlZSB0b0F1ZGl0Um93KS5cclxuICAgIHsga2V5OiAnc3RvcmVJZCcsIGxhYmVsOiAnU3RvcmUgTmFtZScgfSxcclxuICAgIHsga2V5OiAnY2lyY2xlJywgbGFiZWw6ICdDaXJjbGUgSGVhZCcgfSxcclxuICAgIHsga2V5OiAnem9uZScsIGxhYmVsOiAnWm9uZSBNYW5hZ2VyJyB9LFxyXG4gICAgeyBrZXk6ICdhb20nLCBsYWJlbDogJ0FPTScgfSxcclxuICAgIC8vIEEgc3RvcmUgY2FuIHN1Ym1pdCBzZXZlcmFsIGF1ZGl0cyBpbiB0aGUgcGVyaW9kOiB0aGUgY29sdW1uIGFkZHMgdXAgdG8gXCJBdWRpdHMgY29tcGxldGVkXCIgKFFBIDEzIE9jdCkuXHJcbiAgICB7IGtleTogJ2F1ZGl0cycsIGxhYmVsOiAnQXVkaXRzJyB9LFxyXG4gICAgeyBrZXk6ICdzY29yZScsIGxhYmVsOiAnU2NvcmUnIH0sXHJcbiAgICB7IGtleTogJ3N0YXR1cycsIGxhYmVsOiAnU3RhdHVzJyB9XHJcblxyXG4gIF07XHJcblxyXG4gIC8qKlxyXG4gICAqIFRhc2sgbW9kZTogdGlsZXMgYW5kIHRoZSBUYXNrIFBlcmZvcm1hbmNlIHRhYmxlIGZvciB0aGUgdGFza3MgcmFpc2VkIGZyb20gdGhpcyBjbGllbnQncyBhdWRpdHNcclxuICAgKiAoL3RyYXgvYXVkaXQvZGFzaGJvYXJkL3Rhc2tzKS4gTG9hZGVkIHdoZW4gdGhlIFRhc2sgdGFiIGlzIG9wZW4sIGFuZCBhZ2FpbiBhZnRlciBhIGhlYWRlciBjaGFuZ2UuXHJcbiAgICovXHJcbiAgdGFza1N0YXRzOiBUYXNrU3RhdHMgPSB7IC4uLkVNUFRZX1RBU0tfU1RBVFMgfTtcclxuICB0YXNrUGVyZjogVGFza1BlcmZSb3dbXSA9IFtdO1xyXG4gIHRhc2tMb2FkaW5nID0gZmFsc2U7XHJcbiAgLyoqIENoYW5nZSB2cyB0aGUgcHJldmlvdXMgcGVyaW9kIChudWxsID0gbm90aGluZyB0byBjb21wYXJlKTsgZHJpdmVzIHRoZSBkZWx0YSBhcnJvdyBhbmQgY29sb3VyLiAqL1xyXG4gIHByaXZhdGUgdGFza0RlbHRhVmFsdWVzOiBSZWNvcmQ8VGFza0RlbHRhS2V5LCBudW1iZXIgfCBudWxsPiA9IHsgY29tcGxldGlvbjogbnVsbCwgY29tcGxpYW5jZTogbnVsbCwgZmxhZ3M6IG51bGwgfTtcclxuICAvKiogVHJ1ZSB1bnRpbCB0aGUgdGFzayBmaWd1cmVzIGFyZSBsb2FkZWQgZm9yIHRoZSBjdXJyZW50IHNjb3BlLiAqL1xyXG4gIHByaXZhdGUgdGFza3NTdGFsZSA9IHRydWU7XHJcbiAgLyoqIElnbm9yZXMgYSB0YXNrIHJlc3BvbnNlIHRoYXQgYSBuZXdlciByZXF1ZXN0IGhhcyBvdmVydGFrZW4uICovXHJcbiAgcHJpdmF0ZSB0YXNrUmVxdWVzdCA9IDA7XHJcbiAgLyoqIFBERiBkb3dubG9hZHMgaW4gZmxpZ2h0LCBieSB2aXNpdCBpZCwgc28gYSBkb3VibGUgY2xpY2sgcXVldWVzIG9uZSByZXBvcnQuICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSBwZGZRdWV1ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuXHJcbiAgLyoqIFBlcmZvcm1hbmNlIHNlY3Rpb24gKGhpZGRlbiBmb3Igbm93OyBzZXQgdHJ1ZSB0byBzaG93IGl0IGFnYWluKS4gKi9cclxuICBzaG93UGVyZm9ybWFuY2UgPSBmYWxzZTtcclxuICAvKiogQXVkaXQgc2NvcmUgdHJlbmQ6IHRoZSBjYXJkJ3Mgb3duIGRhdGUgcGlja2VyIChoaWRkZW4gZm9yIG5vdzsgdGhlIGhlYWRlciBkYXRlIGFuZCBGaWx0ZXJzIHN0aWxsIHNldCB0aGUgcGVyaW9kKS4gKi9cclxuICBzaG93VHJlbmREYXRlUGlja2VyID0gZmFsc2U7XHJcbiAgLyoqIEF1ZGl0IHNjb3JlIHRyZW5kOiBcIkJlbG93IHBhc3MgbWFya1wiIHBpbGwgKGNhcmQgKyBiYXIgaG92ZXIgdGlwKSwgXCJQYXNzIG1hcmsgTiVcIiBsZWdlbmQgYW5kIFwiwrcgcGFzcyBtYXJrIE4lXCIgdGV4dCAoaGlkZGVuIGZvciBub3cpLiAqL1xyXG4gIHNob3dQYXNzTWFya0luZm8gPSBmYWxzZTtcclxuICAvKiogRmlsdGVycyBkcmF3ZXIgPiBQZXJpb2Q6IHRoZSBcIkRhdGUgcmFuZ2VcIiBwaWNrZXIgdW5kZXIgQnkgZGF0ZSAoaGlkZGVuIGZvciBub3c7IEJ5IGRhdGUgcmVhZHMgdGhlIGhlYWRlciBkYXRlIHJhbmdlKS4gKi9cclxuICBzaG93RHJhd2VyRGF0ZVJhbmdlID0gZmFsc2U7XHJcbiAgcGVyZlRhYjogJ0F1ZGl0JyB8ICdTdG9yZScgfCAnVXNlcicgPSAnQXVkaXQnO1xyXG4gIHJlYWRvbmx5IHBlcmZUYWJzOiBBcnJheTwnQXVkaXQnIHwgJ1N0b3JlJyB8ICdVc2VyJz4gPSBbJ0F1ZGl0JywgJ1N0b3JlJywgJ1VzZXInXTtcclxuICBwZXJmUGVyaW9kID0gJyc7XHJcbiAgcGVyZlNlYXJjaCA9ICcnO1xyXG4gIC8qKiBQZXJmb3JtYW5jZSB0YWJsZXMnIHBhZ2VyIChzaGFyZWQgbGliLXBhZ2luYXRpb24sIGFzIHRoZSBvdGhlciBhdWRpdCBsaXN0cyk6IDEwIHJvd3MgYSBwYWdlLCAxMCAvIDIwIC8gMzAuICovXHJcbiAgcGVyZlBhZ2UgPSAxO1xyXG4gIHBlcmZQYWdlU2l6ZSA9IDEwO1xyXG4gIHJlYWRvbmx5IHBlcmZQYWdlU2l6ZXMgPSBbMTAsIDIwLCAzMF07XHJcbiAgLyoqIENvbHVtbiBzb3J0IG9mIHRoZSBhY3RpdmUgUGVyZm9ybWFuY2UgdGFibGUgKCcnID0gdGhlIEFQSSdzIG9yZGVyKTsgcmVzZXQgd2hlbiB0aGUgdGFiIGNoYW5nZXMuICovXHJcbiAgcGVyZlNvcnRLZXkgPSAnJztcclxuICBwZXJmU29ydERpcjogJ2FzYycgfCAnZGVzYycgPSAnYXNjJztcclxuXHJcbiAgLyoqIFNvcnRhYmxlIGNvbHVtbnMgb2YgZWFjaCBQZXJmb3JtYW5jZSB0YWJsZSwgaW4gZGlzcGxheSBvcmRlciAoQWN0aW9uIGlzIG5vdCBzb3J0YWJsZSkuICovXHJcbiAgcmVhZG9ubHkgYXVkaXRQZXJmQ29sczogUGVyZkNvbHVtbltdID0gW1xyXG4gICAgLy8gTm8gU2NoZWR1bGVkIGNvbHVtbiAoUUEgOSBPY3QpLlxyXG4gICAgeyBrZXk6ICduYW1lJywgbGFiZWw6ICdBdWRpdCBOYW1lJyB9LCB7IGtleTogJ2Fzc2lnbmVkJywgbGFiZWw6ICdBc3NpZ25lZCBUbycgfSwgeyBrZXk6ICdzdWJtaXR0ZWQnLCBsYWJlbDogJ1N1Ym1pdHRlZCcgfSxcclxuICAgIHsga2V5OiAnZGlzcHV0ZXMnLCBsYWJlbDogJ0Rpc3B1dGVzJyB9LCB7IGtleTogJ3Bhc3NNYXJrJywgbGFiZWw6ICdQYXNzIE1hcmsnIH0sXHJcbiAgICB7IGtleTogJ3Njb3JlJywgbGFiZWw6ICdTY29yZScgfSwgeyBrZXk6ICdyZXN1bHQnLCBsYWJlbDogJ1Jlc3VsdCcgfVxyXG4gIF07XHJcbiAgLy8gVGFzayBJbmZvOiB0aGUgc2FtZSBjb2x1bW5zIGFzIENoZWNrbGlzdCA+IERhc2hib2FyZCA+IFRhc2suXHJcbiAgcmVhZG9ubHkgdGFza1BlcmZDb2xzOiBQZXJmQ29sdW1uW10gPSBbXHJcbiAgICB7IGtleTogJ25hbWUnLCBsYWJlbDogJ1Rhc2sgTmFtZScgfSwgeyBrZXk6ICdjcmVhdGVkQnknLCBsYWJlbDogJ0NyZWF0ZWQgYnknIH0sIHsga2V5OiAnY3JlYXRlZE9uJywgbGFiZWw6ICdDcmVhdGVkIE9uJyB9LFxyXG4gICAgeyBrZXk6ICdwcmlvcml0eScsIGxhYmVsOiAnUHJpb3JpdHknIH0sIHsga2V5OiAnYXNzaWduZWQnLCBsYWJlbDogJ0Fzc2lnbmVkIFRvJyB9LCB7IGtleTogJ3N1Ym1pdHRlZCcsIGxhYmVsOiAnU3VibWl0dGVkJyB9LFxyXG4gICAgeyBrZXk6ICdyZWRvJywgbGFiZWw6ICdSZWRvJyB9LCB7IGtleTogJ2R1ZU9uJywgbGFiZWw6ICdEdWUgb24nIH1cclxuICBdO1xyXG4gIHJlYWRvbmx5IHN0b3JlUGVyZkNvbHM6IFBlcmZDb2x1bW5bXSA9IFtcclxuICAgIHsga2V5OiAnc3RvcmUnLCBsYWJlbDogJ1N0b3JlIE5hbWUnIH0sIHsga2V5OiAnc3RvcmVJZCcsIGxhYmVsOiAnU3RvcmUgSUQnIH0sIHsga2V5OiAnc3BvYycsIGxhYmVsOiAnU3RvcmUgU3BvYycgfSxcclxuICAgIHsga2V5OiAnYXNzaWduZWQnLCBsYWJlbDogJ0Fzc2lnbmVkJyB9LFxyXG4gICAgeyBrZXk6ICdmbGFncycsIGxhYmVsOiAnRmxhZ3MnIH0sIHsga2V5OiAnY29tcGxldGlvbicsIGxhYmVsOiAnQ29tcGxldGlvbiAlJyB9LCB7IGtleTogJ2NvbXBsaWFuY2UnLCBsYWJlbDogJ0NvbXBsaWFuY2UgJScgfSxcclxuICAgIHsga2V5OiAncGVyZicsIGxhYmVsOiAnUGVyZm9ybWFuY2UgJScgfVxyXG4gIF07XHJcbiAgcmVhZG9ubHkgdXNlclBlcmZDb2xzOiBQZXJmQ29sdW1uW10gPSBbXHJcbiAgICB7IGtleTogJ25hbWUnLCBsYWJlbDogJ1VzZXIgTmFtZScgfSwgeyBrZXk6ICdlbWFpbCcsIGxhYmVsOiAnRW1haWwnIH0sIHsga2V5OiAnYXNzaWduZWQnLCBsYWJlbDogJ0Fzc2lnbmVkJyB9LFxyXG4gICAgeyBrZXk6ICdmbGFncycsIGxhYmVsOiAnRmxhZ3MnIH0sIHsga2V5OiAncmVkbycsIGxhYmVsOiAnUmVEbycgfSwgeyBrZXk6ICdjb21wbGV0aW9uJywgbGFiZWw6ICdDb21wbGV0aW9uICUnIH0sXHJcbiAgICB7IGtleTogJ2NvbXBsaWFuY2UnLCBsYWJlbDogJ0NvbXBsaWFuY2UgJScgfSwgeyBrZXk6ICdwZXJmJywgbGFiZWw6ICdQZXJmb3JtYW5jZSAlJyB9XHJcbiAgXTtcclxuXHJcbiAgLyoqIFdoYXQgZWFjaCBzb3J0YWJsZSBjb2x1bW4gc29ydHMgb246IG51bWJlcnMgZm9yIGNvdW50cyBhbmQgcGVyY2VudGFnZXMsIHRleHQgb3RoZXJ3aXNlOyBudWxsIHNvcnRzIGxhc3QuICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSBhdWRpdFNvcnRWYWx1ZTogUmVjb3JkPHN0cmluZywgKHI6IEF1ZGl0UGVyZlJvdykgPT4gU29ydFZhbHVlPiA9IHtcclxuICAgIG5hbWU6IHIgPT4gci5uYW1lLCBhc3NpZ25lZDogciA9PiByLmFzc2lnbmVkLCBzdWJtaXR0ZWQ6IHIgPT4gci5zdWJtaXR0ZWQsXHJcbiAgICBkaXNwdXRlczogciA9PiByLmRpc3B1dGVzLCBwYXNzTWFyazogciA9PiB0aGlzLm51bShTdHJpbmcoci5wYXNzTWFyaykucmVwbGFjZSgnJScsICcnKSksXHJcbiAgICBzY29yZTogciA9PiAoci5zY29yZSA9PT0gJ+KAlCcgPyBudWxsIDogci5zY29yZVBjdCksIHJlc3VsdDogciA9PiAoci5yZXN1bHQgPT09ICfigJQnID8gbnVsbCA6IHIucmVzdWx0KVxyXG4gIH07XHJcbiAgcHJpdmF0ZSByZWFkb25seSB0YXNrU29ydFZhbHVlOiBSZWNvcmQ8c3RyaW5nLCAocjogVGFza1BlcmZSb3cpID0+IFNvcnRWYWx1ZT4gPSB7XHJcbiAgICBuYW1lOiByID0+IHIubmFtZSwgY3JlYXRlZEJ5OiByID0+IChyLmNyZWF0ZWRCeSA9PT0gJy0tJyA/IG51bGwgOiByLmNyZWF0ZWRCeSksIGNyZWF0ZWRPbjogciA9PiByLmNyZWF0ZWRPbklzbyB8fCBudWxsLFxyXG4gICAgcHJpb3JpdHk6IHIgPT4gKHIucHJpb3JpdHkgPT09ICctLScgPyBudWxsIDogci5wcmlvcml0eSksIGFzc2lnbmVkOiByID0+IHIuYXNzaWduZWQsIHN1Ym1pdHRlZDogciA9PiByLnN1Ym1pdHRlZCxcclxuICAgIHJlZG86IHIgPT4gci5yZWRvLCBkdWVPbjogciA9PiByLmR1ZUlzbyB8fCBudWxsXHJcbiAgfTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHN0b3JlU29ydFZhbHVlOiBSZWNvcmQ8c3RyaW5nLCAocjogU3RvcmVQZXJmUm93KSA9PiBTb3J0VmFsdWU+ID0ge1xyXG4gICAgc3RvcmU6IHIgPT4gci5zdG9yZSwgc3RvcmVJZDogciA9PiByLnN0b3JlSWQsIHNwb2M6IHIgPT4gci5zcG9jLCBhc3NpZ25lZDogciA9PiByLmFzc2lnbmVkLCBmbGFnczogciA9PiByLmZsYWdzLFxyXG4gICAgY29tcGxldGlvbjogciA9PiB0aGlzLm51bShyLnJhdz8uY29tcGxldGlvbiksIGNvbXBsaWFuY2U6IHIgPT4gdGhpcy5udW0oci5yYXc/LmNvbXBsaWFuY2UpLCBwZXJmOiByID0+IHRoaXMubnVtKHIucmF3Py5wZXJmb3JtYW5jZSlcclxuICB9O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXNlclNvcnRWYWx1ZTogUmVjb3JkPHN0cmluZywgKHI6IFVzZXJQZXJmUm93KSA9PiBTb3J0VmFsdWU+ID0ge1xyXG4gICAgbmFtZTogciA9PiByLm5hbWUsIGVtYWlsOiByID0+IHIuZW1haWwsIGFzc2lnbmVkOiByID0+IHIuYXNzaWduZWQsIGZsYWdzOiByID0+IHIuZmxhZ3MsIHJlZG86IHIgPT4gci5yZWRvLFxyXG4gICAgY29tcGxldGlvbjogciA9PiB0aGlzLm51bShyLnJhdz8uY29tcGxldGlvbiksIGNvbXBsaWFuY2U6IHIgPT4gdGhpcy5udW0oci5yYXc/LmNvbXBsaWFuY2UpLCBwZXJmOiByID0+IHRoaXMubnVtKHIucmF3Py5wZXJmb3JtYW5jZSlcclxuICB9O1xyXG5cclxuICBhdWRpdFBlcmY6IEF1ZGl0UGVyZlJvd1tdID0gW107XHJcbiAgc3RvcmVQZXJmOiBTdG9yZVBlcmZSb3dbXSA9IFtdO1xyXG4gIHVzZXJQZXJmOiBVc2VyUGVyZlJvd1tdID0gW107XHJcblxyXG4gIHJvd3M6IEF1ZGl0Um93W10gPSBbXTtcclxuICB0cmVuZDogVHJlbmRCYXJbXSA9IFtdO1xyXG5cclxuICAvKiogU3RhcnRzIHRydWUgc28gdGhlIGZpcnN0IHBhaW50IHNoaW1tZXJzIGluc3RlYWQgb2YgZmxhc2hpbmcgZW1wdHkgdGlsZXMgYW5kIHRhYmxlcy4gKi9cclxuICBsb2FkaW5nID0gdHJ1ZTtcclxuXHJcbiAgcHJpdmF0ZSBoZWFkZXJEYXRhOiBhbnk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB1c2VyRW1haWxlczogc3RyaW5nW10gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2Vyc0VtYWlsLWluZm8nKSB8fCAnW10nKTtcclxuICAvKiogQ3JlYXRlIEF1ZGl0IHNob3dzIG9ubHkgd2l0aCB0aGUgQ2hlY2tsaXN0IGFkZCBwZXJtaXNzaW9uLiAqL1xyXG4gIGFjY2VzczogQXVkaXRBY2Nlc3MgPSB7IGNhbkFkZDogZmFsc2UsIGNhbkVkaXQ6IGZhbHNlIH07XHJcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSB0cmF4U2VydmljZTogVHJheFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGdzOiBHbG9iYWxTdGF0ZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRvYXN0OiBUb2FzdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZlxyXG4gICkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgYXVkaXRBY2Nlc3ModGhpcy5ncykucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZShhY2Nlc3MgPT4ge1xyXG4gICAgICB0aGlzLmFjY2VzcyA9IGFjY2VzcztcclxuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZ3MuZGF0YVJhbmdlVmFsdWVcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLCBkZWJvdW5jZVRpbWUoMzAwKSlcclxuICAgICAgLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKCFkYXRhPy5jbGllbnQpIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgY29uc3QgY2xpZW50Q2hhbmdlZCA9IGRhdGEuY2xpZW50ICE9PSB0aGlzLmhlYWRlckRhdGE/LmNsaWVudDtcclxuICAgICAgICB0aGlzLmhlYWRlckRhdGEgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMub25IZWFkZXJTY29wZShjbGllbnRDaGFuZ2VkKTtcclxuICAgICAgICAvLyBBIHF1YXJ0ZXIgc3RheXMgcGlja2VkIGFjcm9zcyBoZWFkZXIgY2hhbmdlcyAobmV3IHN0b3JlcyAvIGNsaWVudCk7IEJ5IGRhdGUgZm9sbG93cyB0aGUgaGVhZGVyLlxyXG4gICAgICAgIGlmICh0aGlzLmdyYWluID09PSAncXVhcnRlcicpIHsgdGhpcy5hcHBseVF1YXJ0ZXIodGhpcy5xdWFydGVyLCB0cnVlKTsgcmV0dXJuOyB9XHJcbiAgICAgICAgdGhpcy5mcm9tID0gZGF0YS5kYXRlPy5zdGFydERhdGUgfHwgJyc7XHJcbiAgICAgICAgdGhpcy50byA9IGRhdGEuZGF0ZT8uZW5kRGF0ZSB8fCAnJztcclxuICAgICAgICB0aGlzLnJhbmdlID0gdG9QaWNrZXJSYW5nZSh0aGlzLmZyb20sIHRoaXMudG8pO1xyXG4gICAgICAgIHRoaXMucmVsb2FkUGVyaW9kKCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGVhZGVyIGNoYW5nZS4gTmV3IGNsaWVudDogdGhlIGF1ZGl0IHR5cGUgc3RhcnRzIG92ZXIgYW5kIGl0cyBsaXN0IGlzIGZldGNoZWQgYWdhaW4uIE5ldyBjbGllbnQgb3JcclxuICAgKiBzdG9yZXM6IHRoZSBoaWVyYXJjaHkgcGlja3Mgc3RhcnQgb3ZlciAodGhlIG5leHQgbG9hZCByZWZpbGxzIHRoZSBsaXN0cykuIEEgZGF0ZS1vbmx5IGNoYW5nZSBrZWVwcyBib3RoLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgb25IZWFkZXJTY29wZShjbGllbnRDaGFuZ2VkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBjb25zdCBrZXkgPSB0aGlzLmhlYWRlckRhdGEuY2xpZW50ICsgJ3wnICsgdGhpcy5oZWFkZXJTdG9yZUlkcygpLmpvaW4oJywnKTtcclxuICAgIGlmIChrZXkgIT09IHRoaXMuaGVhZGVyU2NvcGVLZXkpIHtcclxuICAgICAgdGhpcy5oZWFkZXJTY29wZUtleSA9IGtleTtcclxuICAgICAgdGhpcy5jaXJjbGUgPSB0aGlzLnpvbmUgPSB0aGlzLmFvbSA9IHRoaXMuc3RvcmUgPSAnJztcclxuICAgICAgdGhpcy5hcHBsaWVkID0geyAuLi50aGlzLmFwcGxpZWQsIGNpcmNsZTogJycsIHpvbmU6ICcnLCBhb206ICcnLCBzdG9yZTogJycgfTtcclxuICAgIH1cclxuICAgIGlmIChjbGllbnRDaGFuZ2VkKSB7XHJcbiAgICAgIHRoaXMuYXVkaXRUeXBlID0gJ2FsbCc7XHJcbiAgICAgIHRoaXMuYXBwbGllZC5hdWRpdFR5cGUgPSAnYWxsJztcclxuICAgICAgdGhpcy5hdWRpdFR5cGVzID0gW0FMTF9BVURJVFNdO1xyXG4gICAgICB0aGlzLmxvYWRBdWRpdFR5cGVzKCk7XHJcbiAgICAgIGxvYWRBdWRpdExhYmVscyh0aGlzLnRyYXhTZXJ2aWNlLCB0aGlzLmhlYWRlckRhdGEuY2xpZW50KS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKGxhYmVscyA9PiB7XHJcbiAgICAgICAgdGhpcy5sYWJlbHMgPSBsYWJlbHM7XHJcbiAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFBhc3MgLyBGYWlsIGFzIFRyYXggQ29uZmlndXJhdGlvbiDigLogQXVkaXQgTGFiZWxzIG5hbWVzIHRoZW07IHN0YXR1c2VzIHN0YXkgJ3Bhc3MnIC8gJ2ZhaWwnLiAqL1xyXG4gIGxhYmVsczogQXVkaXRMYWJlbHMgPSBERUZBVUxUX0FVRElUX0xBQkVMUztcclxuXHJcbiAgLyoqIEFuIGF1ZGl0IHJvdydzIHJlc3VsdCAoJ1Bhc3MnIC8gJ0ZhaWwnIC8gJ+KAlCcpIHdpdGggdGhlIGNvbmZpZ3VyZWQgbGFiZWwuICovXHJcbiAgcmVzdWx0VGV4dChyZXN1bHQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcmVzdWx0ID09PSAnUGFzcycgPyB0aGlzLmxhYmVscy5wYXNzIDogcmVzdWx0ID09PSAnRmFpbCcgPyB0aGlzLmxhYmVscy5mYWlsIDogcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBjbGllbnQncyBhdWRpdHMgZm9yIHRoZSBBdWRpdCB0eXBlIGZpbHRlciwgbmV3ZXN0IGZpcnN0IGFzIHRoZSBNYW5hZ2UgbGlzdC4gKi9cclxuICBwcml2YXRlIGxvYWRBdWRpdFR5cGVzKCk6IHZvaWQge1xyXG4gICAgY29uc3QgY2xpZW50SWQgPSB0aGlzLmhlYWRlckRhdGE/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+KAlCcsXHJcbiAgICAgIGFvbTogcz8uYW9tIHx8ICfigJQnLFxyXG4gICAgICBhdWRpdHM6IHRoaXMubnVtKHM/LmF1ZGl0cykgPz8gMCxcclxuICAgICAgc2NvcmU6IHNjb3JlID09PSBudWxsID8gbnVsbCA6IE1hdGgucm91bmQoc2NvcmUpLFxyXG4gICAgICBzdGF0dXMsXHJcbiAgICAgIHJhdzogc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9uZSBzdG9yZSBmcm9tIC9hdWRpdC9kYXNoYm9hcmQvc3RvcmVQZXJmb3JtYW5jZSAoYXVkaXQgY29weSBvZiB0aGUgY2hlY2tsaXN0IGRhc2hib2FyZCdzIHRhYmxlKTogZXZlcnkgYXVkaXRcclxuICAgKiB2aXNpdCBpbiB0aGUgcGVyaW9kLCBzbyBjb21wbGV0aW9uID0gc3VibWl0dGVkIC8gYXNzaWduZWQgYW5kIGZsYWdzIGNvdW50LCB1bmxpa2UgdGhlIHNjb3JlLW9ubHkgc3RvcmUgbGlzdC5cclxuICAgKi9cclxuICBwcml2YXRlIHRvU3RvcmVQZXJmKHI6IGFueSk6IFN0b3JlUGVyZlJvdyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzdG9yZUlkOiByPy5zdG9yZV9pZCB8fCAnJyxcclxuICAgICAgc3RvcmU6IHI/LnN0b3JlTmFtZSB8fCAn4oCUJyxcclxuICAgICAgc3BvYzogcj8udXNlckVtYWlsIHx8ICfigJQnLFxyXG4gICAgICBhc3NpZ25lZDogdGhpcy5udW0ocj8uY2hlY2tMaXN0Q291bnQpID8/IDAsXHJcbiAgICAgIGZsYWdzOiB0aGlzLm51bShyPy5mbGFnZ2VkQ291bnQpLFxyXG4gICAgICBjb21wbGV0aW9uOiB0aGlzLnBjdFRleHQocj8uY29tcGxldGlvbiksXHJcbiAgICAgIGNvbXBsaWFuY2U6IHRoaXMucGN0VGV4dChyPy5jb21wbGlhbmNlKSxcclxuICAgICAgcGVyZjogdGhpcy5wY3RUZXh0KHI/LnBlcmZvcm1hbmNlKSxcclxuICAgICAgcmF3OiByXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQmFyIGZpbGwgZm9yIGEgcGVyY2VudGFnZSAobnVtYmVyLCBvciB0ZXh0IGxpa2UgXCI1MSVcIiAvIFwiLTI1JVwiKToga2VwdCB0byAwLTEwMC4gQSBuZWdhdGl2ZSBzY29yZSAob3B0aW9uXHJcbiAgICogc2NvcmVzIGNhbiBiZSBuZWdhdGl2ZSBwZW5hbHRpZXMpIHdvdWxkIG90aGVyd2lzZSBzZXQgYW4gaW52YWxpZCBuZWdhdGl2ZSB3aWR0aCwgd2hpY2ggdGhlIGJyb3dzZXIgZHJvcHMsXHJcbiAgICogZHJhd2luZyB0aGUgYmFyIGZ1bGw7IGl0IGlzIGVtcHR5IGluc3RlYWQsIHdoaWxlIHRoZSBudW1iZXIgYmVzaWRlIGl0IHN0aWxsIHNob3dzIHRoZSByZWFsIHNjb3JlLlxyXG4gICAqL1xyXG4gIGJhcldpZHRoKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG4gPSB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInID8gdmFsdWUgOiBwYXJzZUZsb2F0KFN0cmluZyh2YWx1ZSA/PyAnJykucmVwbGFjZSgnJScsICcnKSk7XHJcbiAgICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKG4pID8gTWF0aC5tYXgoMCwgTWF0aC5taW4oMTAwLCBuKSkgKyAnJScgOiAnMCUnO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0b0F1ZGl0UGVyZihyOiBhbnkpOiBBdWRpdFBlcmZSb3cge1xyXG4gICAgY29uc3QgbmFtZSA9IHI/LmNoZWNrTGlzdE5hbWUgfHwgJ+KAlCc7XHJcbiAgICAvLyBObyBxdWVzdGlvbiBvZiB0aGUgYXVkaXQgaGFzIGNvbXBsaWFuY2Ugc2NvcmluZyBvbjogbm8gc2NvcmUgYW5kIG5vIHJlc3VsdCAodGhlIEFQSSBzZW5kcyBudWxsKS5cclxuICAgIGNvbnN0IHNjb3JlID0gcj8uY29tcGxpYW5jZUVuYWJsZWQgPT09IGZhbHNlID8gbnVsbCA6IHRoaXMubnVtKHI/LnF1ZXN0aW9uQ29tcGxpYW5jZSk7XHJcbiAgICBjb25zdCBzY29yZVBjdCA9IHNjb3JlID09PSBudWxsID8gMCA6IE1hdGgucm91bmQoc2NvcmUpO1xyXG4gICAgLy8gVGhlIGF1ZGl0J3Mgb3duIHBhc3MgbWFyayB3aGVuIHRoZSBBUEkgc2VuZHMgaXQsIGVsc2UgdGhlIGRhc2hib2FyZCdzIChzdW1tYXJ5LnBhc3NNYXJrKS5cclxuICAgIGNvbnN0IG1hcmsgPSB0aGlzLm51bShyPy5wYXNzTWFyaykgPz8gdGhpcy5wYXNzTWFyaztcclxuICAgIHJldHVybiB7XHJcbiAgICAgIG5hbWUsXHJcbiAgICAgIGluaXRpYWxzOiBTdHJpbmcocj8uY2hlY2tMaXN0Q2hhciB8fCBuYW1lLnNsaWNlKDAsIDIpKS50b1VwcGVyQ2FzZSgpLFxyXG4gICAgICBzY2hlZHVsZWQ6IHI/LnNjaGVkdWxlUmVwZWF0ZWRUeXBlID8gdGhpcy50aXRsZUNhc2Uoci5zY2hlZHVsZVJlcGVhdGVkVHlwZSkgOiAn4oCUJyxcclxuICAgICAgYXNzaWduZWQ6IHRoaXMubnVtKHI/LnN0b3JlQ291bnQpID8/IDAsXHJcbiAgICAgIHN1Ym1pdHRlZDogdGhpcy5udW0ocj8uc3VibWl0dGVkQ2hlY2tsaXN0KSA/PyAwLFxyXG4gICAgICAvLyBRdWVzdGlvbnMgd2l0aCBhIHN0b3JlIGRpc3B1dGUgKHJhaXNlZCBvciByZXZpZXdlZCkgaW4gdGhlIHBlcmlvZDsgJ+KAlCcgb25seSB3aGVuIHRoZSBBUEkgc2VuZHMgbm9uZS5cclxuICAgICAgZGlzcHV0ZXM6IHRoaXMubnVtKHI/LmRpc3B1dGVzKSxcclxuICAgICAgcGFzc01hcms6IG1hcmsgKyAnJScsXHJcbiAgICAgIHNjb3JlOiBzY29yZSA9PT0gbnVsbCA/ICfigJQnIDogc2NvcmVQY3QgKyAnJScsXHJcbiAgICAgIHNjb3JlUGN0LFxyXG4gICAgICByZXN1bHQ6IHNjb3JlID09PSBudWxsID8gJ+KAlCcgOiAoc2NvcmVQY3QgPj0gbWFyayA/ICdQYXNzJyA6ICdGYWlsJyksXHJcbiAgICAgIHJhdzogclxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdG9Vc2VyUGVyZihyOiBhbnkpOiBVc2VyUGVyZlJvdyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBuYW1lOiByPy51c2VyTmFtZSB8fCAn4oCUJyxcclxuICAgICAgZW1haWw6IHI/LnVzZXJFbWFpbCB8fCAn4oCUJyxcclxuICAgICAgYXNzaWduZWQ6IHRoaXMubnVtKHI/LmNoZWNrTGlzdENvdW50KSA/PyAwLFxyXG4gICAgICBmbGFnczogdGhpcy5udW0ocj8uZmxhZ2dlZENvdW50KSA/PyAwLFxyXG4gICAgICByZWRvOiB0aGlzLm51bShyPy5yZWRvKSA/PyAwLFxyXG4gICAgICBjb21wbGV0aW9uOiB0aGlzLnBjdFRleHQocj8uY29tcGxldGlvbiksXHJcbiAgICAgIGNvbXBsaWFuY2U6IHRoaXMucGN0VGV4dChyPy5jb21wbGlhbmNlKSxcclxuICAgICAgcGVyZjogdGhpcy5wY3RUZXh0KHI/LnBlcmZvcm1hbmNlKSxcclxuICAgICAgcmF3OiByXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGFzayBtb2RlOiB0aWxlcyArIFRhc2sgUGVyZm9ybWFuY2Ugcm93cyBmb3IgdGhlIHRhc2tzIHJhaXNlZCBmcm9tIHRoaXMgY2xpZW50J3MgYXVkaXRzLCBpbiB0aGVcclxuICAgKiBjdXJyZW50IHNjb3BlLiBBIGZhaWxlZCBjYWxsIGxlYXZlcyAn4oCUJyBldmVyeXdoZXJlIGFuZCByZXRyaWVzIHRoZSBuZXh0IHRpbWUgdGhlIFRhc2sgdGFiIG9wZW5zLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgbG9hZFRhc2tzKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmhlYWRlckRhdGEpIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLnRhc2tzU3RhbGUgPSBmYWxzZTtcclxuICAgIHRoaXMudGFza0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgY29uc3QgcmVxdWVzdCA9ICsrdGhpcy50YXNrUmVxdWVzdDtcclxuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5iYXNlUGF5bG9hZCgpO1xyXG4gICAgLy8gVGhlIGVuZHBvaW50IHJlamVjdHMgdW5rbm93biBrZXlzLCBzbyBvbmx5IHRoZSBzY29wZSBpcyBzZW50LlxyXG4gICAgdGhpcy50cmF4U2VydmljZS5hdWRpdERhc2hib2FyZFRhc2tzKHtcclxuICAgICAgY2xpZW50SWQ6IHNjb3BlWydjbGllbnRJZCddLCBmcm9tRGF0ZTogc2NvcGVbJ2Zyb21EYXRlJ10sIHRvRGF0ZTogc2NvcGVbJ3RvRGF0ZSddLFxyXG4gICAgICBzdG9yZUlkOiBzY29wZVsnc3RvcmVJZCddLCB1c2VyRW1haWxlczogc2NvcGVbJ3VzZXJFbWFpbGVzJ10sIC4uLnRoaXMuYXVkaXRGaWx0ZXIoKVxyXG4gICAgfSkucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKG51bGwpKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXF1ZXN0ICE9PSB0aGlzLnRhc2tSZXF1ZXN0KSB7IHJldHVybjsgfVxyXG4gICAgICBjb25zdCBkYXRhID0gcmVzPy5jb2RlID09PSAyMDAgPyAocmVzLmRhdGEgfHwgbnVsbCkgOiBudWxsO1xyXG4gICAgICBpZiAoIWRhdGEpIHsgdGhpcy50YXNrc1N0YWxlID0gdHJ1ZTsgfVxyXG4gICAgICB0aGlzLnRhc2tTdGF0cyA9IHRoaXMudG9UYXNrU3RhdHMoZGF0YSk7XHJcbiAgICAgIHRoaXMudGFza1BlcmYgPSAoZGF0YT8udGFza3MgfHwgW10pLm1hcCgodDogYW55KSA9PiB0aGlzLnRvVGFza1BlcmYodCkpO1xyXG4gICAgICB0aGlzLmxhc3RSZWZyZXNoZWQgPSBkYXlqcygpLmZvcm1hdCgnaGg6bW06c3MgQScpO1xyXG4gICAgICB0aGlzLnRhc2tMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRvVGFza1N0YXRzKGQ6IGFueSk6IFRhc2tTdGF0cyB7XHJcbiAgICB0aGlzLnRhc2tEZWx0YVZhbHVlcyA9IHtcclxuICAgICAgY29tcGxldGlvbjogdGhpcy5udW0oZD8uZGVsdGFzPy5jb21wbGV0aW9uKSxcclxuICAgICAgY29tcGxpYW5jZTogdGhpcy5udW0oZD8uZGVsdGFzPy5jb21wbGlhbmNlKSxcclxuICAgICAgZmxhZ3M6IHRoaXMubnVtKGQ/LmRlbHRhcz8uZmxhZ3MpXHJcbiAgICB9O1xyXG4gICAgaWYgKCFkKSB7IHJldHVybiB7IC4uLkVNUFRZX1RBU0tfU1RBVFMgfTsgfVxyXG4gICAgY29uc3QgY291bnQgPSAodjogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IG4gPSB0aGlzLm51bSh2KTtcclxuICAgICAgcmV0dXJuIG4gPT09IG51bGwgPyAn4oCUJyA6IG4udG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJyk7XHJcbiAgICB9O1xyXG4gICAgY29uc3QgZGF5cyA9IHRoaXMubnVtKGQ/LnBlcmlvZD8ucHJldmlvdXM/LmRheXMpID8/IDE7XHJcbiAgICBjb25zdCB2cyA9IGRheXMgPT09IDEgPyAndnMgbGFzdCBkYXknIDogJ3ZzIHByZXZpb3VzICcgKyBkYXlzICsgJyBkYXlzJztcclxuICAgIGNvbnN0IGRlbHRhID0gKHY6IG51bWJlciB8IG51bGwpID0+ICh2ID09PSBudWxsID8gJycgOiBNYXRoLmFicyh2KSArICclICcgKyB2cyk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBhY3RpdmVUYXNrczogY291bnQoZC5hY3RpdmVUYXNrcyksXHJcbiAgICAgIHRhc2tJbnN0YW5jZXM6IGNvdW50KGQudGFza0luc3RhbmNlcyksXHJcbiAgICAgIG5vdFN1Ym1pdHRlZDogY291bnQoZC5ub3RTdWJtaXR0ZWQpLFxyXG4gICAgICBvcGVuVGFza3M6IGNvdW50KGQub3BlblRhc2tzKSxcclxuICAgICAgaW5Qcm9ncmVzczogY291bnQoZC5pblByb2dyZXNzKSxcclxuICAgICAgc3VibWl0dGVkOiBjb3VudChkLnN1Ym1pdHRlZCksXHJcbiAgICAgIGNvbXBsZXRpb25TY29yZTogdGhpcy5wY3RUZXh0KGQuY29tcGxldGlvblNjb3JlKSxcclxuICAgICAgY29tcGxpYW5jZVNjb3JlOiB0aGlzLnBjdFRleHQoZC5jb21wbGlhbmNlU2NvcmUpLFxyXG4gICAgICB0b3RhbEZsYWdzOiBjb3VudChkLnRvdGFsRmxhZ3MpLFxyXG4gICAgICBjb21wbGV0aW9uRGVsdGE6IGRlbHRhKHRoaXMudGFza0RlbHRhVmFsdWVzLmNvbXBsZXRpb24pLFxyXG4gICAgICBjb21wbGlhbmNlRGVsdGE6IGRlbHRhKHRoaXMudGFza0RlbHRhVmFsdWVzLmNvbXBsaWFuY2UpLFxyXG4gICAgICBmbGFnc0RlbHRhOiBkZWx0YSh0aGlzLnRhc2tEZWx0YVZhbHVlcy5mbGFncylcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKiogT25lIHRhc2sgcmFpc2VkIGZyb20gYW4gYXVkaXQ7IGNvbXBsaWFuY2UgaXMgJ+KAlCcgd2hpbGUgdGFzayBpbnN0YW5jZXMgY2Fycnkgbm8gc2NvcmUuICovXHJcbiAgcHJpdmF0ZSB0b1Rhc2tQZXJmKHQ6IGFueSk6IFRhc2tQZXJmUm93IHtcclxuICAgIGNvbnN0IG5hbWUgPSB0Py50YXNrTmFtZSB8fCAn4oCUJztcclxuICAgIGNvbnN0IGNvbXBsaWFuY2UgPSB0aGlzLm51bSh0Py5jb21wbGlhbmNlKTtcclxuICAgIGNvbnN0IHJhaXNlZCA9IHRoaXMubnVtKHQ/LnRhc2tzKTtcclxuICAgIGxldCBzY2hlZHVsZWQgPSAn4oCUJztcclxuICAgIGlmICh0Py5zY2hlZHVsZVJlcGVhdGVkVHlwZSkge1xyXG4gICAgICBzY2hlZHVsZWQgPSB0aGlzLnRpdGxlQ2FzZSh0LnNjaGVkdWxlUmVwZWF0ZWRUeXBlKTtcclxuICAgIH0gZWxzZSBpZiAodD8uZHVlRGF0ZSkge1xyXG4gICAgICBzY2hlZHVsZWQgPSAnRHVlICcgKyB0aGlzLmZtdCh0LmR1ZURhdGUpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY3JlYXRlZEJ5ID0gdD8uY3JlYXRlZEJ5TmFtZSB8fCAnJztcclxuICAgIGNvbnN0IGNyZWF0ZWQgPSB0Py5jcmVhdGVkQXQgJiYgZGF5anModC5jcmVhdGVkQXQpLmlzVmFsaWQoKSA/IGRheWpzKHQuY3JlYXRlZEF0KSA6IG51bGw7XHJcbiAgICBjb25zdCBkdWUgPSB0Py5kdWVEYXRlICYmIGRheWpzKHQuZHVlRGF0ZSkuaXNWYWxpZCgpID8gZGF5anModC5kdWVEYXRlKSA6IG51bGw7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBuYW1lLFxyXG4gICAgICBpbml0aWFsczogbmFtZS5zbGljZSgwLCAyKS50b1VwcGVyQ2FzZSgpLFxyXG4gICAgICBjcmVhdGVkQnk6IGNyZWF0ZWRCeSB8fCAnLS0nLFxyXG4gICAgICBjcmVhdGVkQnlJbml0aWFsczogY3JlYXRlZEJ5ID8gY3JlYXRlZEJ5LnJlcGxhY2UoL1teQS1aYS16XS9nLCAnJykuc2xpY2UoMCwgMikudG9VcHBlckNhc2UoKSA6ICctLScsXHJcbiAgICAgIGNyZWF0ZWRPbjogY3JlYXRlZCA/IGNyZWF0ZWQuZm9ybWF0KCdERCBNTU0gWVlZWScpIDogJy0tJyxcclxuICAgICAgY3JlYXRlZE9uSXNvOiBjcmVhdGVkID8gY3JlYXRlZC50b0lTT1N0cmluZygpIDogJycsXHJcbiAgICAgIHByaW9yaXR5OiB0Py5wcmlvcml0eVR5cGUgPyB0aGlzLnRpdGxlQ2FzZSh0LnByaW9yaXR5VHlwZSkgOiAnLS0nLFxyXG4gICAgICBkdWVPbjogZHVlID8gZHVlLmZvcm1hdCgnREQgTU1NIFlZWVknKSA6ICctLScsXHJcbiAgICAgIGR1ZUlzbzogZHVlID8gZHVlLnRvSVNPU3RyaW5nKCkgOiAnJyxcclxuICAgICAgc2NoZWR1bGVkLFxyXG4gICAgICBjb3ZlcmFnZTogdD8uY292ZXJhZ2UgPyB0aGlzLnRpdGxlQ2FzZSh0LmNvdmVyYWdlKSA6ICfigJQnLFxyXG4gICAgICBhc3NpZ25lZDogdGhpcy5udW0odD8uYXNzaWduZWQpID8/IDAsXHJcbiAgICAgIHN1Ym1pdHRlZDogdGhpcy5udW0odD8uc3VibWl0dGVkKSA/PyAwLFxyXG4gICAgICBmbGFnczogdGhpcy5udW0odD8uZmxhZ3MpID8/IDAsXHJcbiAgICAgIHRhc2tzOiByYWlzZWQgPT09IG51bGwgPyAn4oCUJyA6IFN0cmluZyhyYWlzZWQpLFxyXG4gICAgICByZWRvOiB0aGlzLm51bSh0Py5yZWRvKSA/PyAwLFxyXG4gICAgICBjb21wbGlhbmNlOiB0aGlzLnBjdFRleHQoY29tcGxpYW5jZSksXHJcbiAgICAgIGNvbXBsaWFuY2VQY3Q6IGNvbXBsaWFuY2UgPT09IG51bGwgPyAwIDogTWF0aC5yb3VuZChjb21wbGlhbmNlKSxcclxuICAgICAgcmF3OiB0XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqIERlbHRhIHN0eWxpbmc6IGFycm93IGRpcmVjdGlvbiwgYW5kIGNvbG91ciBieSB3aGV0aGVyIHRoZSBtb3ZlIGlzIGdvb2QgKG1vcmUgZmxhZ3MgaXMgYmFkKS4gKi9cclxuICB0YXNrRGVsdGFDbGFzcyhrZXk6IFRhc2tEZWx0YUtleSk6IHN0cmluZyB7XHJcbiAgICBjb25zdCB2ID0gdGhpcy50YXNrRGVsdGFWYWx1ZXNba2V5XTtcclxuICAgIGlmICh2ID09PSBudWxsIHx8IHYgPT09IDApIHsgcmV0dXJuICdpcy1mbGF0JzsgfVxyXG4gICAgY29uc3QgdXAgPSB2ID4gMDtcclxuICAgIGNvbnN0IGdvb2QgPSBrZXkgPT09ICdmbGFncycgPyAhdXAgOiB1cDtcclxuICAgIHJldHVybiAodXAgPyAnaXMtdXAnIDogJ2lzLWRvd24nKSArICcgJyArIChnb29kID8gJ2lzLWdvb2QnIDogJ2lzLWJhZCcpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBudW0odjogYW55KTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICBpZiAodiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWQgfHwgdiA9PT0gJycpIHsgcmV0dXJuIG51bGw7IH1cclxuICAgIGNvbnN0IG4gPSBOdW1iZXIodik7XHJcbiAgICByZXR1cm4gaXNOYU4obikgPyBudWxsIDogbjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGN0VGV4dCh2OiBhbnkpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbiA9IHRoaXMubnVtKHYpO1xyXG4gICAgcmV0dXJuIG4gPT09IG51bGwgPyAn4oCUJyA6IE1hdGgucm91bmQobikgKyAnJSc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRpdGxlQ2FzZSh2OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHYuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB2LnNsaWNlKDEpLnRvTG93ZXJDYXNlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZtdCh2OiBhbnkpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHYgPyBkYXlqcyh2KS5mb3JtYXQoJ01NTSBERCwgWVlZWScpIDogJ+KAlCc7XHJcbiAgfVxyXG5cclxuICAvKiogUm93cyBhZnRlciBzZWFyY2gsIHN0YXR1cyBhbmQgc2NvcmUtYmFuZCBmaWx0ZXJzLiAqL1xyXG4gIGdldCBmaWx0ZXJlZFJvd3MoKTogQXVkaXRSb3dbXSB7XHJcbiAgICBjb25zdCBxID0gdGhpcy5zZWFyY2gudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICByZXR1cm4gdGhpcy5yb3dzXHJcbiAgICAgIC5maWx0ZXIociA9PiB0aGlzLnN0YXR1cyA9PT0gJ2FsbCcgfHwgci5zdGF0dXMgPT09IHRoaXMuc3RhdHVzKVxyXG4gICAgICAuZmlsdGVyKHIgPT4ge1xyXG4gICAgICAgIGlmIChyLnNjb3JlID09PSBudWxsKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5zY29yZU1pbiA9PT0gMCAmJiB0aGlzLnNjb3JlTWF4ID09PSAxMDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEEgbG93ZXIgYm91bmQgb2YgMCBpcyBvcGVuOiBwZW5hbHR5IHNjb3JlcyBjYW4gdGFrZSBhIHN0b3JlIGJlbG93IDAlIChDcml0aWNhbCkuXHJcbiAgICAgICAgcmV0dXJuICh0aGlzLnNjb3JlTWluIDw9IDAgfHwgci5zY29yZSA+PSB0aGlzLnNjb3JlTWluKSAmJiByLnNjb3JlIDw9IHRoaXMuc2NvcmVNYXg7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5maWx0ZXIociA9PiAhcSB8fCBbci5zdG9yZUlkLCByLmNpcmNsZSwgci56b25lLCByLmFvbSwgci5yYXc/LnN0b3JlTmFtZSB8fCAnJywgci5yYXc/LnN0b3JlSWQgfHwgJyddLnNvbWUodiA9PiBTdHJpbmcodikudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSkpXHJcbiAgICAgIC5zb3J0KChhLCBiKSA9PiB0aGlzLmNvbXBhcmUoYSwgYikpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb21wYXJlKGE6IEF1ZGl0Um93LCBiOiBBdWRpdFJvdyk6IG51bWJlciB7XHJcbiAgICBjb25zdCBkaXIgPSB0aGlzLnNvcnREaXIgPT09ICdhc2MnID8gMSA6IC0xO1xyXG4gICAgaWYgKHRoaXMuc29ydEtleSA9PT0gJ3Njb3JlJykge1xyXG4gICAgICAvLyBOb3QtYXVkaXRlZCBzdG9yZXMgKG5vIHNjb3JlKSBhbHdheXMgY29tZSBhZnRlciB0aGUgYXVkaXRlZCBvbmVzLCBpbiBlaXRoZXIgZGlyZWN0aW9uLFxyXG4gICAgICAvLyBzbyB0aGUgZmV3IGF1ZGl0ZWQgc3RvcmVzIGFyZSBub3QgYnVyaWVkIHVuZGVyIHRob3VzYW5kcyBvZiBcIk5vdCBhdWRpdGVkXCIgcm93cy5cclxuICAgICAgaWYgKGEuc2NvcmUgPT09IG51bGwgfHwgYi5zY29yZSA9PT0gbnVsbCkge1xyXG4gICAgICAgIHJldHVybiBhLnNjb3JlID09PSBiLnNjb3JlID8gMCA6IChhLnNjb3JlID09PSBudWxsID8gMSA6IC0xKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gKGEuc2NvcmUgLSBiLnNjb3JlKSAqIGRpcjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNvcnRLZXkgPT09ICdhdWRpdHMnKSB7XHJcbiAgICAgIHJldHVybiAoYS5hdWRpdHMgLSBiLmF1ZGl0cykgKiBkaXI7XHJcbiAgICB9XHJcbiAgICBjb25zdCBhdiA9IFN0cmluZyhhW3RoaXMuc29ydEtleSBhcyBrZXlvZiBBdWRpdFJvd10gPz8gJycpO1xyXG4gICAgY29uc3QgYnYgPSBTdHJpbmcoYlt0aGlzLnNvcnRLZXkgYXMga2V5b2YgQXVkaXRSb3ddID8/ICcnKTtcclxuICAgIHJldHVybiBhdi5sb2NhbGVDb21wYXJlKGJ2KSAqIGRpcjtcclxuICB9XHJcblxyXG4gIGdldCB0b3RhbFBhZ2VzKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRoaXMuZmlsdGVyZWRSb3dzLmxlbmd0aCAvIHRoaXMucGFnZVNpemUpKTtcclxuICB9XHJcblxyXG4gIGdldCBwYWdlUm93cygpOiBBdWRpdFJvd1tdIHtcclxuICAgIGNvbnN0IHN0YXJ0ID0gKHRoaXMucGFnZSAtIDEpICogdGhpcy5wYWdlU2l6ZTtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkUm93cy5zbGljZShzdGFydCwgc3RhcnQgKyB0aGlzLnBhZ2VTaXplKTtcclxuICB9XHJcblxyXG4gIC8qKiBTdG9yZXMgdGhhdCBjYXJyeSBhIHNjb3JlIGluIHRoZSBjdXJyZW50IHBlcmlvZC4gKi9cclxuICBwcml2YXRlIGdldCBldmFsdWF0ZWQoKTogQXVkaXRSb3dbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5yb3dzLmZpbHRlcihyID0+IHIuc2NvcmUgIT09IG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFN0b3JlcyB3aXRoIGEgc3VibWl0dGVkIGF1ZGl0IGluIHRoZSBwZXJpb2QsIHNjb3JlZCBvciBub3QuICovXHJcbiAgcHJpdmF0ZSBnZXQgYXVkaXRlZENvdW50KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5yb3dzLmZpbHRlcihyID0+IHIuc3RhdHVzICE9PSAnbmEnKS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBnZXQgYXZlcmFnZVNjb3JlKCk6IG51bWJlciB8IG51bGwge1xyXG4gICAgY29uc3QgZXYgPSB0aGlzLmV2YWx1YXRlZDtcclxuICAgIGlmICghZXYubGVuZ3RoKSB7IHJldHVybiBudWxsOyB9XHJcbiAgICByZXR1cm4gTWF0aC5yb3VuZChldi5yZWR1Y2UoKHN1bSwgcikgPT4gc3VtICsgKHIuc2NvcmUgYXMgbnVtYmVyKSwgMCkgLyBldi5sZW5ndGgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGtwaXMoKTogQXVkaXRLcGlbXSB7XHJcbiAgICBjb25zdCBldiA9IHRoaXMuZXZhbHVhdGVkO1xyXG4gICAgY29uc3QgYXZnID0gdGhpcy5hdmVyYWdlU2NvcmU7XHJcbiAgICBjb25zdCBwYXNzQ291bnQgPSBldi5maWx0ZXIociA9PiAoci5zY29yZSBhcyBudW1iZXIpID49IHRoaXMucGFzc01hcmspLmxlbmd0aDtcclxuICAgIGNvbnN0IGZhaWxDb3VudCA9IGV2Lmxlbmd0aCAtIHBhc3NDb3VudDtcclxuICAgIGNvbnN0IGNyaXRpY2FsID0gZXYuZmlsdGVyKHIgPT4gKHIuc2NvcmUgYXMgbnVtYmVyKSA8IHRoaXMuY3JpdGljYWxNYXJrKS5sZW5ndGg7XHJcbiAgICBjb25zdCBhY3RpdmVTdG9yZXMgPSB0aGlzLnN0b3Jlc0luU2NvcGU7XHJcbiAgICBjb25zdCBhdWRpdGVkID0gdGhpcy5hdWRpdGVkQ291bnQ7XHJcbiAgICBsZXQgYXZnTm90ZSA9ICdBY3Jvc3MgYXVkaXRlZCBzdG9yZXMnO1xyXG4gICAgaWYgKGF2ZyA9PT0gbnVsbCkge1xyXG4gICAgICBhdmdOb3RlID0gYXVkaXRlZCA/ICdDb21wbGlhbmNlIHNjb3JlIGlzIG9mZiBmb3IgdGhlc2UgYXVkaXRzJyA6ICdObyBhdWRpdHMgaW4gdGhpcyBwZXJpb2QnO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBbXHJcbiAgICAgIHtcclxuICAgICAgICBsYWJlbDogJ0F2ZXJhZ2Ugc2NvcmUnLFxyXG4gICAgICAgIHZhbHVlOiBhdmcgPT09IG51bGwgPyAn4oCUJyA6IGF2ZyArICclJyxcclxuICAgICAgICBub3RlOiBhdmdOb3RlLFxyXG4gICAgICAgIG5vdGVDb2xvcjogYXZnICE9PSBudWxsICYmIGF2ZyA8IHRoaXMucGFzc01hcmsgPyAnI0Q5MkQyMCcgOiAnIzAyN0E0OCdcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGxhYmVsOiB0aGlzLmxhYmVscy5wYXNzICsgJyByYXRlJyxcclxuICAgICAgICB2YWx1ZTogZXYubGVuZ3RoID8gTWF0aC5yb3VuZChwYXNzQ291bnQgLyBldi5sZW5ndGggKiAxMDApICsgJyUnIDogJ+KAlCcsXHJcbiAgICAgICAgbm90ZTogcGFzc0NvdW50ICsgJyAnICsgdGhpcy5sYWJlbHMucGFzcyArICcsICcgKyBmYWlsQ291bnQgKyAnICcgKyB0aGlzLmxhYmVscy5mYWlsLFxyXG4gICAgICAgIG5vdGVDb2xvcjogJyM2NjcwODUnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBsYWJlbDogJ0NyaXRpY2FsIHN0b3JlcycsXHJcbiAgICAgICAgdmFsdWU6IFN0cmluZyhjcml0aWNhbCksXHJcbiAgICAgICAgbm90ZTogJ1Njb3JlIGJlbG93ICcgKyB0aGlzLmNyaXRpY2FsTWFyayArICclJyxcclxuICAgICAgICBub3RlQ29sb3I6IGNyaXRpY2FsID8gJyNEOTJEMjAnIDogJyM2NjcwODUnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICAvLyBTdWJtaXR0ZWQgYXVkaXRzLCBhcyB0aGUgdHJlbmQgY291bnRzIHRoZW07IHRoZSBub3RlIGdpdmVzIHRoZSBhY3RpdmUgc3RvcmVzIGluIHNjb3BlLlxyXG4gICAgICAgIGxhYmVsOiAnQXVkaXRzIGNvbXBsZXRlZCcsXHJcbiAgICAgICAgdmFsdWU6IFN0cmluZyh0aGlzLnJvd3MucmVkdWNlKChzdW0sIHIpID0+IHN1bSArIChOdW1iZXIoci5yYXc/LmF1ZGl0cykgfHwgMCksIDApKSxcclxuICAgICAgICBub3RlOiBhY3RpdmVTdG9yZXMgKyAoYWN0aXZlU3RvcmVzID09PSAxID8gJyBhY3RpdmUgc3RvcmUnIDogJyBhY3RpdmUgc3RvcmVzJyksXHJcbiAgICAgICAgbm90ZUNvbG9yOiAnIzY2NzA4NSdcclxuICAgICAgfVxyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIGdldCBwZXJpb2RMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuZ3JhaW4gPT09ICdxdWFydGVyJyAmJiB0aGlzLnF1YXJ0ZXIpIHsgcmV0dXJuIHRoaXMucXVhcnRlciArICcgKCcgKyB0aGlzLnF1YXJ0ZXJNb250aHModGhpcy5xdWFydGVyKSArICcpJzsgfVxyXG4gICAgcmV0dXJuIHRoaXMuZm10KHRoaXMuZnJvbSkgKyAnIHRvICcgKyB0aGlzLmZtdCh0aGlzLnRvKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERpc3RyaWJ1dGlvbiBvZiBzdG9yZXMgYWNyb3NzIHNjb3JlIGJhbmRzLiBOb3Qgc2NvcmVkIGlzIGxlZnQgb3V0IChRQSA5IE9jdCksIGFuZCBpdHMgc3RvcmVzXHJcbiAgICogd2l0aCBpdCwgc28gdGhlIHNoYXJlcyBzdGlsbCBhZGQgdXAgdG8gMTAwJS5cclxuICAgKi9cclxuICBnZXQgYmFuZFJvd3MoKTogQXJyYXk8eyBiYW5kOiBBdWRpdEJhbmQ7IGNvdW50OiBudW1iZXI7IHNoYXJlOiBzdHJpbmc7IHdpZHRoOiBzdHJpbmcgfT4ge1xyXG4gICAgY29uc3QgdG90YWwgPSB0aGlzLnJvd3MuZmlsdGVyKHIgPT4gci5zdGF0dXMgIT09ICd1bnNjb3JlZCcpLmxlbmd0aCB8fCAxO1xyXG4gICAgcmV0dXJuIHRoaXMuYmFuZHMuZmlsdGVyKGJhbmQgPT4gYmFuZC5rZXkgIT09ICd1bnNjb3JlZCcpLm1hcChiYW5kID0+IHtcclxuICAgICAgY29uc3QgY291bnQgPSBTVEFUVVNfQkFORFMuaW5jbHVkZXMoYmFuZC5rZXkpXHJcbiAgICAgICAgPyB0aGlzLnJvd3MuZmlsdGVyKHIgPT4gci5zdGF0dXMgPT09IGJhbmQua2V5KS5sZW5ndGhcclxuICAgICAgICA6IHRoaXMucm93cy5maWx0ZXIociA9PiByLnNjb3JlICE9PSBudWxsICYmIHRoaXMuaW5CYW5kKHIuc2NvcmUgYXMgbnVtYmVyLCBiYW5kKSkubGVuZ3RoO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGJhbmQsXHJcbiAgICAgICAgY291bnQsXHJcbiAgICAgICAgLy8gQSBmZXcgc3RvcmVzIG91dCBvZiB0aG91c2FuZHMgcm91bmQgdG8gMCU7IHNheSBcIjwxJVwiIGluc3RlYWQgb2YgMCUgbmV4dCB0byBhIG5vbi16ZXJvIGNvdW50LlxyXG4gICAgICAgIHNoYXJlOiBjb3VudCAmJiBjb3VudCAvIHRvdGFsICogMTAwIDwgMSA/ICc8MSUnIDogTWF0aC5yb3VuZChjb3VudCAvIHRvdGFsICogMTAwKSArICclJyxcclxuICAgICAgICB3aWR0aDogKGNvdW50IC8gdG90YWwgKiAxMDApICsgJyUnXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBCYW5kIGNvbG91cnMgb2YgYSBzdG9yZSByb3c6IGJ5IHNjb3JlLCBvciB0aGUgTm90IHNjb3JlZCAvIE5vdCBhdWRpdGVkIGJhbmQgd2hlbiBpdCBoYXMgbm9uZS4gKi9cclxuICBiYW5kRm9yKHJvdzogQXVkaXRSb3cpOiBBdWRpdEJhbmQge1xyXG4gICAgY29uc3QgbGFzdCA9IHRoaXMuYmFuZHNbdGhpcy5iYW5kcy5sZW5ndGggLSAxXTtcclxuICAgIGlmIChyb3cuc2NvcmUgPT09IG51bGwpIHsgcmV0dXJuIHRoaXMuYmFuZHMuZmluZChiID0+IGIua2V5ID09PSByb3cuc3RhdHVzKSA/PyBsYXN0OyB9XHJcbiAgICBjb25zdCBzY29yZSA9IHJvdy5zY29yZTtcclxuICAgIHJldHVybiB0aGlzLmJhbmRzLmZpbmQoYiA9PiAhU1RBVFVTX0JBTkRTLmluY2x1ZGVzKGIua2V5KSAmJiB0aGlzLmluQmFuZChzY29yZSwgYikpID8/IGxhc3Q7XHJcbiAgfVxyXG5cclxuICAvKiogQSBzY29yZSBiYW5kJ3MgcmFuZ2U7IHRoZSBsb3dlc3QgYmFuZCAobG8gMCwgQ3JpdGljYWwpIGFsc28gdGFrZXMgbmVnYXRpdmUgc2NvcmVzIChwZW5hbHR5IG9wdGlvbnMpLiAqL1xyXG4gIHByaXZhdGUgaW5CYW5kKHNjb3JlOiBudW1iZXIsIGJhbmQ6IEF1ZGl0QmFuZCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChiYW5kLmxvIDw9IDAgfHwgc2NvcmUgPj0gYmFuZC5sbykgJiYgc2NvcmUgPD0gYmFuZC5oaTtcclxuICB9XHJcblxyXG4gIHN0YXR1c0xhYmVsKHJvdzogQXVkaXRSb3cpOiBzdHJpbmcge1xyXG4gICAgaWYgKHJvdy5zdGF0dXMgPT09ICdwYXNzJykgeyByZXR1cm4gdGhpcy5sYWJlbHMucGFzczsgfVxyXG4gICAgaWYgKHJvdy5zdGF0dXMgPT09ICdmYWlsJykgeyByZXR1cm4gdGhpcy5sYWJlbHMuZmFpbDsgfVxyXG4gICAgcmV0dXJuIHJvdy5zdGF0dXMgPT09ICd1bnNjb3JlZCcgPyAnTm90IHNjb3JlZCcgOiAnTm90IGF1ZGl0ZWQnO1xyXG4gIH1cclxuXHJcbiAgLyoqIEJhciBoZWlnaHQgYXMgYSBwZXJjZW50YWdlIG9mIHRoZSBjaGFydCBhcmVhLiAqL1xyXG4gIGJhckhlaWdodChiYXI6IFRyZW5kQmFyKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAoYmFyLnZhbHVlID09PSBudWxsID8gMiA6IE1hdGgubWF4KDMsIGJhci52YWx1ZSkpICsgJyUnO1xyXG4gIH1cclxuXHJcbiAgLyoqIEhvdmVyIGNhcmQgc2l0cyBqdXN0IGFib3ZlIHRoZSBiYXIncyB2YWx1ZSBsYWJlbDsgY2FwcGVkIHNvIGEgdGFsbCBiYXIncyBjYXJkIHN0YXlzIGluc2lkZSB0aGUgY2hhcnQuICovXHJcbiAgdGlwQm90dG9tKGJhcjogVHJlbmRCYXIpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgaCA9IGJhci52YWx1ZSA9PT0gbnVsbCA/IDIgOiBNYXRoLm1heCgzLCBiYXIudmFsdWUpO1xyXG4gICAgcmV0dXJuICdjYWxjKCcgKyBNYXRoLm1pbihoLCA0NSkgKyAnJSArIDI2cHgpJztcclxuICB9XHJcblxyXG4gIGJhckZpbGwoYmFyOiBUcmVuZEJhcik6IHN0cmluZyB7XHJcbiAgICBpZiAoYmFyLnZhbHVlID09PSBudWxsKSB7IHJldHVybiAnI0YyRjRGNyc7IH1cclxuICAgIGNvbnN0IGFjdGl2ZSA9IGJhci5rZXkgPT09IHRoaXMucXVhcnRlcjtcclxuICAgIGlmIChiYXIudmFsdWUgPj0gdGhpcy5wYXNzTWFyaykgeyByZXR1cm4gYWN0aXZlID8gJyMxNTcwRUYnIDogJyNCMkRERkYnOyB9XHJcbiAgICByZXR1cm4gYWN0aXZlID8gJyNGMDQ0MzgnIDogJyNGRUNEQ0EnO1xyXG4gIH1cclxuXHJcbiAgc2V0R3JhaW4oZ3JhaW46ICdxdWFydGVyJyB8ICdkYXRlJyk6IHZvaWQge1xyXG4gICAgaWYgKGdyYWluID09PSB0aGlzLmdyYWluKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5ncmFpbiA9IGdyYWluO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICAgIGlmIChncmFpbiA9PT0gJ3F1YXJ0ZXInKSB7XHJcbiAgICAgIHRoaXMuYXBwbHlRdWFydGVyKHRoaXMucXVhcnRlcnMuaW5jbHVkZXModGhpcy5xdWFydGVyKSA/IHRoaXMucXVhcnRlciA6IHRoaXMucXVhcnRlcnNbdGhpcy5xdWFydGVycy5sZW5ndGggLSAxXSwgdHJ1ZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIEJhY2sgdG8gQnkgZGF0ZTogdGhlIGhlYWRlcidzIHJhbmdlIGFnYWluLlxyXG4gICAgdGhpcy5mcm9tID0gdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5zdGFydERhdGUgfHwgdGhpcy5mcm9tO1xyXG4gICAgdGhpcy50byA9IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uZW5kRGF0ZSB8fCB0aGlzLnRvO1xyXG4gICAgdGhpcy5yYW5nZSA9IHRvUGlja2VyUmFuZ2UodGhpcy5mcm9tLCB0aGlzLnRvKTtcclxuICAgIGlmICghdGhpcy5maWx0ZXJzT3BlbikgeyB0aGlzLnJlbG9hZFBlcmlvZCgpOyB9XHJcbiAgfVxyXG5cclxuICBzZXRTdGF0dXMoc3RhdHVzOiBTdGF0dXNGaWx0ZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICB9XHJcblxyXG4gIHNvcnRCeShrZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc29ydEtleSA9PT0ga2V5KSB7XHJcbiAgICAgIHRoaXMuc29ydERpciA9IHRoaXMuc29ydERpciA9PT0gJ2FzYycgPyAnZGVzYycgOiAnYXNjJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc29ydEtleSA9IGtleTtcclxuICAgICAgdGhpcy5zb3J0RGlyID0gJ2FzYyc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTY29yZSBkaXN0cmlidXRpb24gLT4gVmlldyBzdG9yZXM6IG5hcnJvdyB0aGUgc3RvcmUgbGlzdCB0byB0aGF0IGJhbmQgKE5vdCBhdWRpdGVkIC0+IHRoZVxyXG4gICAqIHN0b3JlcyB3aXRoIG5vIHN1Ym1pc3Npb24pIGFuZCBicmluZyB0aGUgbGlzdCBpbnRvIHZpZXcuXHJcbiAgICovXHJcbiAgYXBwbHlCYW5kKGJhbmQ6IEF1ZGl0QmFuZCk6IHZvaWQge1xyXG4gICAgaWYgKFNUQVRVU19CQU5EUy5pbmNsdWRlcyhiYW5kLmtleSkpIHtcclxuICAgICAgdGhpcy5jbGVhckJhbmQoKTtcclxuICAgICAgdGhpcy5zdGF0dXMgPSBiYW5kLmtleSBhcyBTdG9yZVN0YXR1cztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2NvcmVNaW4gPSBiYW5kLmxvO1xyXG4gICAgICB0aGlzLnNjb3JlTWF4ID0gYmFuZC5oaTtcclxuICAgICAgdGhpcy5zdGF0dXMgPSAnYWxsJztcclxuICAgICAgdGhpcy5wYWdlID0gMTtcclxuICAgIH1cclxuICAgIHRoaXMuc3RvcmVMaXN0T3BlbiA9IHRydWU7XHJcbiAgICB0aGlzLmxpc3RCYW5kS2V5ID0gYmFuZC5rZXk7XHJcbiAgICAvLyBGcm9tIHRoZSBkcmF3ZXIsIEFwcGx5IHNjcm9sbHMgb25jZSBpdCBjbG9zZXMuXHJcbiAgICBpZiAodGhpcy5maWx0ZXJzT3BlbikgeyByZXR1cm47IH1cclxuICAgIHNldFRpbWVvdXQoKCkgPT4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkLXN0b3JlLWxpc3QnKT8uc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnc3RhcnQnIH0pKTtcclxuICB9XHJcblxyXG4gIGNsZWFyQmFuZCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2NvcmVNaW4gPSAwO1xyXG4gICAgdGhpcy5zY29yZU1heCA9IDEwMDtcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgU3RvcmUgbGlzdCBvcGVucyBieSBkZWZhdWx0IHdpdGggYWxsIHN0b3JlczsgU2NvcmUgZGlzdHJpYnV0aW9uIC0+IFZpZXcgc3RvcmVzIChvciBhIEZpbHRlcnNcclxuICAgKiBzY29yZSByYW5nZSkgbmFycm93cyBpdCB0byBhIGJhbmQsIGFuZCB0aGUgY2hpcCdzIHggY2xvc2VzIGl0LlxyXG4gICAqL1xyXG4gIHN0b3JlTGlzdE9wZW4gPSB0cnVlO1xyXG4gIC8qKiBCYW5kIHRoZSBsaXN0IHdhcyBvcGVuZWQgZm9yICgnJyA9IGFsbCBzdG9yZXMpLiAqL1xyXG4gIGxpc3RCYW5kS2V5ID0gJyc7XHJcblxyXG4gIGdldCBzaG93U3RvcmVMaXN0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RvcmVMaXN0T3BlbiB8fCB0aGlzLmJhbmRGaWx0ZXJBY3RpdmUgfHwgdGhpcy5zdGF0dXMgIT09ICdhbGwnO1xyXG4gIH1cclxuXHJcbiAgLyoqIERyYXdlciBTY29yZSByYW5nZTogdGhlIGJhbmQgdGhlIGN1cnJlbnQgcmFuZ2UgKG9yIHN0YXR1cyBiYW5kKSBtYXRjaGVzLiAqL1xyXG4gIGlzQmFuZE9uKGJhbmQ6IEF1ZGl0QmFuZCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKFNUQVRVU19CQU5EUy5pbmNsdWRlcyhiYW5kLmtleSkpIHsgcmV0dXJuIHRoaXMuc3RhdHVzID09PSBiYW5kLmtleTsgfVxyXG4gICAgcmV0dXJuIHRoaXMuc2NvcmVNaW4gPT09IGJhbmQubG8gJiYgdGhpcy5zY29yZU1heCA9PT0gYmFuZC5oaTtcclxuICB9XHJcblxyXG4gIGdldCBiYW5kRmlsdGVyQWN0aXZlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2NvcmVNaW4gIT09IDAgfHwgdGhpcy5zY29yZU1heCAhPT0gMTAwO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGJhbmRDaGlwTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGhpdCA9IHRoaXMuYmFuZHMuZmluZChiID0+ICFTVEFUVVNfQkFORFMuaW5jbHVkZXMoYi5rZXkpICYmIGIubG8gPT09IHRoaXMuc2NvcmVNaW4gJiYgYi5oaSA9PT0gdGhpcy5zY29yZU1heCk7XHJcbiAgICByZXR1cm4gaGl0ID8gaGl0LmxhYmVsICsgJyDCtyAnICsgaGl0LnJhbmdlIDogJ1Njb3JlICcgKyB0aGlzLnNjb3JlTWluICsgJ+KAkycgKyB0aGlzLnNjb3JlTWF4ICsgJyUnO1xyXG4gIH1cclxuXHJcbiAgb25TZWFyY2goKTogdm9pZCB7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBmaXZlIGZpbHRlciBjYXRlZ29yaWVzIHRoZSBkcmF3ZXIgbGlzdHMuICovXHJcbiAgZ2V0IGZpbHRlckNhdHMoKTogRmlsdGVyQ2F0W10ge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgeyBrZXk6ICdwZXJpb2QnLCBsYWJlbDogJ1BlcmlvZCcsIHZhbHVlOiB0aGlzLnBlcmlvZExhYmVsLCB0aXRsZTogJ1BlcmlvZCcsXHJcbiAgICAgICAgc3ViOiAnU3RhcnRzIGFzIHRoZSBnbG9iYWwgaGVhZGVyIGRhdGUgcmFuZ2U7IHBpY2sgYSByYW5nZSB0byBuYXJyb3cgaXQuJyxcclxuICAgICAgICBkaXJ0eTogZmFsc2UgfSxcclxuICAgICAgeyBrZXk6ICdzY29wZScsIGxhYmVsOiAnU3RvcmUgaGllcmFyY2h5JywgdmFsdWU6IHRoaXMuc2NvcGVMYWJlbCwgdGl0bGU6ICdTdG9yZSBoaWVyYXJjaHknLFxyXG4gICAgICAgIHN1YjogJ1BpY2sgdGhlIGNpcmNsZSwgem9uZSwgQU9NIG9yIHN0b3JlIHRoZSB3aG9sZSBkYXNoYm9hcmQgcmVhZHMuJyxcclxuICAgICAgICBkaXJ0eTogISF0aGlzLmNpcmNsZSB9LFxyXG4gICAgICB7IGtleTogJ3R5cGUnLCBsYWJlbDogJ0F1ZGl0IHR5cGUnLCB2YWx1ZTogdGhpcy5hdWRpdFR5cGVMYWJlbCwgdGl0bGU6ICdBdWRpdCB0eXBlJyxcclxuICAgICAgICBzdWI6ICdXaGljaCBhdWRpdCBwcm9ncmFtbWUgdGhlIHNjb3JlcyBjb21lIGZyb20uJyxcclxuICAgICAgICBkaXJ0eTogdGhpcy5hdWRpdFR5cGUgIT09ICdhbGwnIH0sXHJcbiAgICAgIHsga2V5OiAnYmFuZCcsIGxhYmVsOiAnU2NvcmUgcmFuZ2UnLCB2YWx1ZTogdGhpcy5iYW5kQ2hpcExhYmVsLCB0aXRsZTogJ1Njb3JlIHJhbmdlJyxcclxuICAgICAgICBzdWI6ICdUYXAgYSBiYW5kIHRvIHNldCB0aGUgcmFuZ2UgdGhlIHN1bW1hcnkgcmVhZHMuJyxcclxuICAgICAgICBkaXJ0eTogdGhpcy5iYW5kRmlsdGVyQWN0aXZlIH0sXHJcbiAgICAgIHsga2V5OiAnc3RhdHVzJywgbGFiZWw6ICdTdGF0dXMnLCB2YWx1ZTogdGhpcy5zdGF0dXNGaWx0ZXJMYWJlbCwgdGl0bGU6ICdTdGF0dXMnLFxyXG4gICAgICAgIHN1YjogJ1Nob3cgZXZlcnkgc3RvcmUsIG9yIG9ubHkgdGhlIG9uZXMgbWFya2VkICcgKyB0aGlzLmxhYmVscy5wYXNzICsgJyBvciAnICsgdGhpcy5sYWJlbHMuZmFpbCArICcuJyxcclxuICAgICAgICBkaXJ0eTogdGhpcy5zdGF0dXMgIT09ICdhbGwnIH1cclxuICAgIF07XHJcbiAgfVxyXG5cclxuICBnZXQgYWN0aXZlQ2F0T2JqKCk6IEZpbHRlckNhdCB7XHJcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJDYXRzLmZpbmQoYyA9PiBjLmtleSA9PT0gdGhpcy5hY3RpdmVDYXQpIHx8IHRoaXMuZmlsdGVyQ2F0c1swXTtcclxuICB9XHJcblxyXG4gIGdldCBmaWx0ZXJDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyQ2F0cy5maWx0ZXIoYyA9PiBjLmRpcnR5KS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICAvKiogU3RvcmVzIHRoZSBkcmF3ZXIncyBoaWVyYXJjaHkgcGljayBjb3ZlcnMgKHdoYXQgQXBwbHkgd2lsbCBsb2FkKS4gKi9cclxuICBnZXQgc3RvcmVzSW5TY29wZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuc2NvcGVSb3dzLmZpbHRlcihyID0+IHRoaXMubWF0Y2hlc1Njb3BlKHIsIHRoaXMpKS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICAvKiogU29ydGVkIGRpc3RpbmN0IG5hbWVzLCB3aXRob3V0IHRoZSBcIuKAlFwiIG9mIHN0b3JlcyBvdXRzaWRlIHRoZSBoaWVyYXJjaHkuICovXHJcbiAgcHJpdmF0ZSBkaXN0aW5jdCh2YWx1ZXM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldCh2YWx1ZXMuZmlsdGVyKHYgPT4gdiAmJiB2ICE9PSAn4oCUJykpKS5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNpcmNsZXMoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZGlzdGluY3QodGhpcy5zY29wZVJvd3MubWFwKHIgPT4gci5jaXJjbGUpKTtcclxuICB9XHJcblxyXG4gIGdldCB6b25lcygpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5kaXN0aW5jdCh0aGlzLnNjb3BlUm93cy5maWx0ZXIociA9PiByLmNpcmNsZSA9PT0gdGhpcy5jaXJjbGUpLm1hcChyID0+IHIuem9uZSkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGFvbXMoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZGlzdGluY3QodGhpcy5zY29wZVJvd3MuZmlsdGVyKHIgPT4gci5jaXJjbGUgPT09IHRoaXMuY2lyY2xlICYmIHIuem9uZSA9PT0gdGhpcy56b25lKS5tYXAociA9PiByLmFvbSkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNjb3BlUmVhZGluZygpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbiA9IHRoaXMuc3RvcmVzSW5TY29wZTtcclxuICAgIHJldHVybiB0aGlzLnNjb3BlTGFiZWwgKyAnIMK3ICcgKyBuICsgKG4gPT09IDEgPyAnIHN0b3JlJyA6ICcgc3RvcmVzJyk7XHJcbiAgfVxyXG5cclxuICBzZXRNb2R1bGVUYWIodGFiOiAnQXVkaXQnIHwgJ1Rhc2snKTogdm9pZCB7XHJcbiAgICBpZiAodGFiICE9PSB0aGlzLm1vZHVsZVRhYikge1xyXG4gICAgICAvLyBUaGUgZmlyc3QgUGVyZm9ybWFuY2UgdGFibGUgY2hhbmdlcyAoQXVkaXQgLyBUYXNrKSwgc28gaXRzIHNvcnQgc3RhcnRzIG92ZXIuXHJcbiAgICAgIHRoaXMucGVyZlNvcnRLZXkgPSAnJztcclxuICAgICAgdGhpcy5wZXJmU29ydERpciA9ICdhc2MnO1xyXG4gICAgfVxyXG4gICAgdGhpcy5tb2R1bGVUYWIgPSB0YWI7XHJcbiAgICBpZiAodGFiID09PSAnVGFzaycgJiYgdGhpcy50YXNrc1N0YWxlKSB7IHRoaXMubG9hZFRhc2tzKCk7IH1cclxuICB9XHJcblxyXG4gIGdldCBzY29wZUxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuc3RvcmUgPyB0aGlzLnNjb3BlUm93cy5maW5kKHIgPT4gU3RyaW5nKHIucmF3Py5zdG9yZUlkKSA9PT0gdGhpcy5zdG9yZSkgOiB1bmRlZmluZWQ7XHJcbiAgICByZXR1cm4gKHN0b3JlID8gc3RvcmUucmF3Py5zdG9yZU5hbWUgfHwgdGhpcy5zdG9yZSA6IHRoaXMuc3RvcmUpIHx8IHRoaXMuYW9tIHx8IHRoaXMuem9uZSB8fCB0aGlzLmNpcmNsZSB8fCAnQWxsIHN0b3Jlcyc7XHJcbiAgfVxyXG5cclxuICBnZXQgYXVkaXRUeXBlTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHQgPSB0aGlzLmF1ZGl0VHlwZXMuZmluZCh4ID0+IHgua2V5ID09PSB0aGlzLmF1ZGl0VHlwZSk7XHJcbiAgICByZXR1cm4gdCA/IHQubGFiZWwgOiAnQWxsIEF1ZGl0cyc7XHJcbiAgfVxyXG5cclxuICBnZXQgc3RhdHVzRmlsdGVyTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gJ2FsbCcpIHsgcmV0dXJuICdBbGwgc3RvcmVzJzsgfVxyXG4gICAgaWYgKHRoaXMuc3RhdHVzID09PSAncGFzcycpIHsgcmV0dXJuIHRoaXMubGFiZWxzLnBhc3MgKyAnIHN0b3Jlcyc7IH1cclxuICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gJ3Vuc2NvcmVkJykgeyByZXR1cm4gJ05vdCBzY29yZWQnOyB9XHJcbiAgICByZXR1cm4gdGhpcy5zdGF0dXMgPT09ICdmYWlsJyA/IHRoaXMubGFiZWxzLmZhaWwgKyAnIHN0b3JlcycgOiAnTm90IGF1ZGl0ZWQnO1xyXG4gIH1cclxuXHJcbiAgb3BlbkZpbHRlcnMoY2F0Pzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmRyYWZ0ID0gT2JqZWN0LmNyZWF0ZSh0aGlzKSBhcyBBdWRpdFYyRGFzaGJvYXJkQ29tcG9uZW50O1xyXG4gICAgdGhpcy5hY3RpdmVDYXQgPSBjYXQgfHwgdGhpcy5hY3RpdmVDYXQ7XHJcbiAgICB0aGlzLmZpbHRlcnNPcGVuID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHNlbGVjdENhdChrZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5hY3RpdmVDYXQgPSBrZXk7XHJcbiAgfVxyXG5cclxuICBhcHBseUZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICBjb25zdCBkID0gdGhpcy5kcmFmdDtcclxuICAgIGNvbnN0IHBlcmlvZENoYW5nZWQgPSAhIWQgJiYgKGQuZnJvbSAhPT0gdGhpcy5mcm9tIHx8IGQudG8gIT09IHRoaXMudG8pO1xyXG4gICAgaWYgKGQpIHtcclxuICAgICAgY29uc3Qgc2VsZiA9IHRoaXMgYXMgYW55O1xyXG4gICAgICBBdWRpdFYyRGFzaGJvYXJkQ29tcG9uZW50LkRSQUZUX0tFWVMuZm9yRWFjaChrID0+IHsgc2VsZltrXSA9IChkIGFzIGFueSlba107IH0pO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2NvcGVDaGFuZ2VkID0gdGhpcy5jb21taXRTY29wZSgpO1xyXG4gICAgdGhpcy5kcmFmdCA9IG51bGw7XHJcbiAgICB0aGlzLmZpbHRlcnNPcGVuID0gZmFsc2U7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gICAgaWYgKHBlcmlvZENoYW5nZWQgfHwgc2NvcGVDaGFuZ2VkKSB7IHRoaXMucmVsb2FkUGVyaW9kKCk7IH1cclxuICAgIC8vIFNjb3JlIHJhbmdlIGFuZCBTdGF0dXMgb25seSBmaWx0ZXIgdGhlIHN0b3JlIGxpc3QsIHNvIHNob3cgaXQuXHJcbiAgICBpZiAodGhpcy5iYW5kRmlsdGVyQWN0aXZlIHx8IHRoaXMuc3RhdHVzICE9PSAnYWxsJykge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZC1zdG9yZS1saXN0Jyk/LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ3N0YXJ0JyB9KSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogTWFrZSB0aGUgZHJhd2VyJ3MgaGllcmFyY2h5ICsgYXVkaXQgdHlwZSB0aGUgbG9hZGVkIG9uZXM7IHRydWUgd2hlbiB0aGV5IGRpZmZlciBmcm9tIGJlZm9yZS4gKi9cclxuICBwcml2YXRlIGNvbW1pdFNjb3BlKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgYSA9IHRoaXMuYXBwbGllZDtcclxuICAgIGNvbnN0IGNoYW5nZWQgPSBhLmNpcmNsZSAhPT0gdGhpcy5jaXJjbGUgfHwgYS56b25lICE9PSB0aGlzLnpvbmUgfHwgYS5hb20gIT09IHRoaXMuYW9tIHx8IGEuc3RvcmUgIT09IHRoaXMuc3RvcmVcclxuICAgICAgfHwgYS5hdWRpdFR5cGUgIT09IHRoaXMuYXVkaXRUeXBlO1xyXG4gICAgdGhpcy5hcHBsaWVkID0geyBjaXJjbGU6IHRoaXMuY2lyY2xlLCB6b25lOiB0aGlzLnpvbmUsIGFvbTogdGhpcy5hb20sIHN0b3JlOiB0aGlzLnN0b3JlLCBhdWRpdFR5cGU6IHRoaXMuYXVkaXRUeXBlIH07XHJcbiAgICByZXR1cm4gY2hhbmdlZDtcclxuICB9XHJcblxyXG4gIC8qKiBDYW5jZWwgLyB4IC8gYmFja2Ryb3A6IHRoZSBkcmFmdCBpcyBkcm9wcGVkOyB0aGUgcGFnZSBuZXZlciBjaGFuZ2VkLiAqL1xyXG4gIGNhbmNlbEZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmRyYWZ0ID0gbnVsbDtcclxuICAgIHRoaXMuZmlsdGVyc09wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKiBSZXNldCBldmVyeSBmaWx0ZXIgdG8gdGhlIGRvY3VtZW50ZWQgZGVmYXVsdHMuICovXHJcbiAgY2xlYXJBbGwoKTogdm9pZCB7XHJcbiAgICB0aGlzLmF1ZGl0VHlwZSA9ICdhbGwnO1xyXG4gICAgdGhpcy5ncmFpbiA9ICdkYXRlJztcclxuICAgIHRoaXMuY2lyY2xlID0gJyc7XHJcbiAgICB0aGlzLnpvbmUgPSAnJztcclxuICAgIHRoaXMuYW9tID0gJyc7XHJcbiAgICB0aGlzLnN0b3JlID0gJyc7XHJcbiAgICB0aGlzLnNjb3JlTWluID0gMDtcclxuICAgIHRoaXMuc2NvcmVNYXggPSAxMDA7XHJcbiAgICB0aGlzLnN0YXR1cyA9ICdhbGwnO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICAgIC8vIFRoZSBjaGlwcycgQ2xlYXIgYWxsIChkcmF3ZXIgY2xvc2VkKSByZWxvYWRzIG5vdzsgaW5zaWRlIHRoZSBkcmF3ZXIsIEFwcGx5IGRvZXMuXHJcbiAgICBpZiAoIXRoaXMuZmlsdGVyc09wZW4gJiYgdGhpcy5jb21taXRTY29wZSgpKSB7IHRoaXMucmVsb2FkUGVyaW9kKCk7IH1cclxuICB9XHJcblxyXG4gIC8qKiBDaGFuZ2luZyBhIGxldmVsIGNsZWFycyB0aGUgbGV2ZWxzIGJlbG93IGl0LiAqL1xyXG4gIG9uQ2lyY2xlQ2hhbmdlKCk6IHZvaWQge1xyXG4gICAgdGhpcy56b25lID0gJyc7XHJcbiAgICB0aGlzLmFvbSA9ICcnO1xyXG4gICAgdGhpcy5zdG9yZSA9ICcnO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICB9XHJcblxyXG4gIG9uWm9uZUNoYW5nZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuYW9tID0gJyc7XHJcbiAgICB0aGlzLnN0b3JlID0gJyc7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgb25Bb21DaGFuZ2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0b3JlID0gJyc7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgcmVzZXRTY29wZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuY2lyY2xlID0gJyc7XHJcbiAgICB0aGlzLnpvbmUgPSAnJztcclxuICAgIHRoaXMuYW9tID0gJyc7XHJcbiAgICB0aGlzLnN0b3JlID0gJyc7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgLyoqIFN0b3JlIGRyb3Bkb3duOiB0aGUgc3RvcmVzIG9mIHRoZSBwaWNrZWQgQU9NLCBieSBuYW1lICh2YWx1ZSA9IHN0b3JlSWQpLiAqL1xyXG4gIGdldCBzdG9yZVBpY2tPcHRpb25zKCk6IEFycmF5PHsgdmFsdWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9PiB7XHJcbiAgICBjb25zdCBzdG9yZXMgPSB0aGlzLnNjb3BlUm93c1xyXG4gICAgICAuZmlsdGVyKHIgPT4gdGhpcy5tYXRjaGVzU2NvcGUociwgeyBjaXJjbGU6IHRoaXMuY2lyY2xlLCB6b25lOiB0aGlzLnpvbmUsIGFvbTogdGhpcy5hb20sIHN0b3JlOiAnJyB9KSlcclxuICAgICAgLm1hcChyID0+ICh7IHZhbHVlOiBTdHJpbmcoci5yYXc/LnN0b3JlSWQgfHwgJycpLCBsYWJlbDogU3RyaW5nKHIucmF3Py5zdG9yZU5hbWUgfHwgJ+KAlCcpIH0pKVxyXG4gICAgICAuZmlsdGVyKG8gPT4gby52YWx1ZSlcclxuICAgICAgLnNvcnQoKGEsIGIpID0+IGEubGFiZWwubG9jYWxlQ29tcGFyZShiLmxhYmVsKSk7XHJcbiAgICByZXR1cm4gW3sgdmFsdWU6ICcnLCBsYWJlbDogJ0FsbCBzdG9yZXMnIH1dLmNvbmNhdChzdG9yZXMpO1xyXG4gIH1cclxuXHJcbiAgLyoqIE9wdGlvbnMgZm9yIHRoZSBkcmF3ZXIncyBjdXN0b20gZHJvcGRvd25zIChsaWItYXVkaXQtdjItc2VsZWN0KTogXCJBbGwg4oCmXCIgZmlyc3QsIHRoZW4gdGhlIGxpc3QuICovXHJcbiAgcGlja09wdGlvbnMobGlzdDogc3RyaW5nW10sIGFsbDogc3RyaW5nKTogQXJyYXk8eyB2YWx1ZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH0+IHtcclxuICAgIHJldHVybiBbeyB2YWx1ZTogJycsIGxhYmVsOiBhbGwgfV0uY29uY2F0KChsaXN0IHx8IFtdKS5tYXAodiA9PiAoeyB2YWx1ZTogdiwgbGFiZWw6IHYgfSkpKTtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgZmlyc3QgcGVyZm9ybWFuY2UgdGFiIGlzIG5hbWVkIGFmdGVyIHRoZSBhY3RpdmUgbW9kdWxlLiAqL1xyXG4gIGdldCBwZXJmVGFic0Zvck1vZHVsZSgpOiBBcnJheTwnQXVkaXQnIHwgJ1N0b3JlJyB8ICdVc2VyJz4ge1xyXG4gICAgcmV0dXJuIHRoaXMucGVyZlRhYnM7XHJcbiAgfVxyXG5cclxuICBwZXJmVGFiRGlzcGxheSh0YWI6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gKHRhYiA9PT0gJ0F1ZGl0JyA/IHRoaXMubW9kdWxlVGFiIDogdGFiKSArICcgUGVyZm9ybWFuY2UnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBlcmZJbmZvVGl0bGUoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLnBlcmZUYWIgPT09ICdTdG9yZScpIHsgcmV0dXJuICdTdG9yZXMgSW5mbyc7IH1cclxuICAgIGlmICh0aGlzLnBlcmZUYWIgPT09ICdVc2VyJykgeyByZXR1cm4gJ1VzZXIgSW5mbyc7IH1cclxuICAgIHJldHVybiB0aGlzLm1vZHVsZVRhYiArICcgSW5mbyc7XHJcbiAgfVxyXG5cclxuICBnZXQgcGVyZkNyZWF0ZUxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gJysgQ3JlYXRlICcgKyB0aGlzLm1vZHVsZVRhYjtcclxuICB9XHJcblxyXG4gIGdldCBpc1Rhc2tNb2R1bGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5tb2R1bGVUYWIgPT09ICdUYXNrJztcclxuICB9XHJcblxyXG4gIGdldCBmaWx0ZXJlZFRhc2tQZXJmKCk6IFRhc2tQZXJmUm93W10ge1xyXG4gICAgY29uc3QgcSA9IHRoaXMucGVyZlNlYXJjaC50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIHJldHVybiB0aGlzLnNvcnRQZXJmUm93cyhxID8gdGhpcy50YXNrUGVyZi5maWx0ZXIociA9PiByLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSkgOiB0aGlzLnRhc2tQZXJmLCB0aGlzLnRhc2tTb3J0VmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgdHJhY2tCeVBlcmZUYXNrKF86IG51bWJlciwgcm93OiBUYXNrUGVyZlJvdyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcm93LnJhdz8udGFza0lkIHx8IHJvdy5uYW1lO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBzZWxlY3RlZCB0cmVuZCBidWNrZXQgZHJpdmVzIHRoZSBoZWFkbGluZSBzY29yZSBhYm92ZSB0aGUgY2hhcnQuICovXHJcbiAgcHJpdmF0ZSBnZXQgZm9jdXNCYXIoKTogVHJlbmRCYXIgfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKHRoaXMuZ3JhaW4gPT09ICdxdWFydGVyJykgeyByZXR1cm4gdGhpcy5xdWFydGVyVHJlbmQuZmluZChiID0+IGIua2V5ID09PSB0aGlzLnF1YXJ0ZXIpOyB9XHJcbiAgICByZXR1cm4gdGhpcy50cmVuZC5maW5kKGIgPT4gYi5rZXkgPT09IHRoaXMucXVhcnRlcikgfHwgdGhpcy50cmVuZFswXTtcclxuICB9XHJcblxyXG4gIGdldCBmb2N1c1Njb3JlKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBiID0gdGhpcy5mb2N1c0JhcjtcclxuICAgIGlmIChiICYmIGIudmFsdWUgIT09IG51bGwpIHsgcmV0dXJuIGIudmFsdWUgKyAnJSc7IH1cclxuICAgIC8vIFdpdGggbm8gdHJlbmQgYnVja2V0cywgdGhlIGhlYWRsaW5lIGlzIHRoZSBwZXJpb2QgYXZlcmFnZS5cclxuICAgIGNvbnN0IGF2ZyA9IHRoaXMuYXZlcmFnZVNjb3JlO1xyXG4gICAgcmV0dXJuIGF2ZyA9PT0gbnVsbCA/ICfigJQnIDogYXZnICsgJyUnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZvY3VzUGFzc2VkKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgYiA9IHRoaXMuZm9jdXNCYXI7XHJcbiAgICBpZiAoYiAmJiBiLnZhbHVlICE9PSBudWxsKSB7IHJldHVybiBiLnZhbHVlID49IHRoaXMucGFzc01hcms7IH1cclxuICAgIGNvbnN0IGF2ZyA9IHRoaXMuYXZlcmFnZVNjb3JlO1xyXG4gICAgcmV0dXJuIGF2ZyAhPT0gbnVsbCAmJiBhdmcgPj0gdGhpcy5wYXNzTWFyaztcclxuICB9XHJcblxyXG4gIGdldCBmb2N1c1N0YXR1cygpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgYiA9IHRoaXMuZm9jdXNCYXI7XHJcbiAgICBjb25zdCBoYXMgPSAoYiAmJiBiLnZhbHVlICE9PSBudWxsKSB8fCB0aGlzLmF2ZXJhZ2VTY29yZSAhPT0gbnVsbDtcclxuICAgIGlmICghaGFzKSB7IHJldHVybiAnTm8gZGF0YSc7IH1cclxuICAgIHJldHVybiB0aGlzLmZvY3VzUGFzc2VkID8gdGhpcy5sYWJlbHMucGFzcyA6ICdCZWxvdyBwYXNzIG1hcmsnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZvY3VzTGluZSgpOiBzdHJpbmcge1xyXG4gICAgLy8gU3VibWl0dGVkIGF1ZGl0cywgYXMgdGhlIGJhcnMgY291bnQgdGhlbSAoXCIxMCBhdWRpdHNcIik7IGF1ZGl0ZWRDb3VudCBjb3VudHMgYXVkaXRlZCBzdG9yZXMuXHJcbiAgICBjb25zdCBuID0gdGhpcy5ncmFpbiA9PT0gJ3F1YXJ0ZXInXHJcbiAgICAgID8gKHRoaXMuZm9jdXNCYXI/LnN1Ym1pdHRlZCA/PyAwKVxyXG4gICAgICA6IHRoaXMudHJlbmQucmVkdWNlKChzdW0sIGIpID0+IHN1bSArIChiLnN1Ym1pdHRlZCB8fCAwKSwgMCk7XHJcbiAgICByZXR1cm4gdGhpcy5wZXJpb2RMYWJlbCArICcgwrcgJyArIG4gKyAobiA9PT0gMSA/ICcgYXVkaXQgY29tcGxldGVkJyA6ICcgYXVkaXRzIGNvbXBsZXRlZCcpXHJcbiAgICAgICsgKHRoaXMuc2hvd1Bhc3NNYXJrSW5mbyA/ICcgwrcgcGFzcyBtYXJrICcgKyB0aGlzLnBhc3NNYXJrICsgJyUnIDogJycpO1xyXG4gIH1cclxuXHJcbiAgc2V0UGVyZlRhYih0YWI6ICdBdWRpdCcgfCAnU3RvcmUnIHwgJ1VzZXInKTogdm9pZCB7XHJcbiAgICB0aGlzLnBlcmZUYWIgPSB0YWI7XHJcbiAgICB0aGlzLnBlcmZTZWFyY2ggPSAnJztcclxuICAgIHRoaXMucGVyZlNvcnRLZXkgPSAnJztcclxuICAgIHRoaXMucGVyZlNvcnREaXIgPSAnYXNjJztcclxuICAgIHRoaXMucGVyZlBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJvd3MgaW4gdGhlIG9wZW4gcGVyZm9ybWFuY2UgdGFibGUgYWZ0ZXIgc2VhcmNoIC8gc29ydCAod2hhdCB0aGUgcGFnZXIgY291bnRzKS4gKi9cclxuICBnZXQgcGVyZlRvdGFsKCk6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy5wZXJmVGFiID09PSAnQXVkaXQnKSB7IHJldHVybiB0aGlzLmlzVGFza01vZHVsZSA/IHRoaXMuZmlsdGVyZWRUYXNrUGVyZi5sZW5ndGggOiB0aGlzLmZpbHRlcmVkQXVkaXRQZXJmLmxlbmd0aDsgfVxyXG4gICAgcmV0dXJuIHRoaXMucGVyZlRhYiA9PT0gJ1N0b3JlJyA/IHRoaXMuZmlsdGVyZWRTdG9yZVBlcmYubGVuZ3RoIDogdGhpcy5maWx0ZXJlZFVzZXJQZXJmLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgY3VycmVudCBwYWdlIG9mIGEgcGVyZm9ybWFuY2UgdGFibGU7IGEgc2VhcmNoIHRoYXQgc2hyaW5rcyB0aGUgbGlzdCBwdWxscyB0aGUgcGFnZSBiYWNrIGludG8gcmFuZ2UuICovXHJcbiAgcGVyZlBhZ2VPZjxUPihsaXN0OiBUW10pOiBUW10ge1xyXG4gICAgY29uc3QgcGFnZXMgPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwobGlzdC5sZW5ndGggLyB0aGlzLnBlcmZQYWdlU2l6ZSkpO1xyXG4gICAgY29uc3QgcGFnZSA9IE1hdGgubWluKHRoaXMucGVyZlBhZ2UsIHBhZ2VzKTtcclxuICAgIHJldHVybiBsaXN0LnNsaWNlKChwYWdlIC0gMSkgKiB0aGlzLnBlcmZQYWdlU2l6ZSwgcGFnZSAqIHRoaXMucGVyZlBhZ2VTaXplKTtcclxuICB9XHJcblxyXG4gIG9uUGVyZlBhZ2UocGFnZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnBlcmZQYWdlID0gTnVtYmVyKHBhZ2UpIHx8IDE7XHJcbiAgfVxyXG5cclxuICBvblBlcmZQYWdlU2l6ZShzaXplOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMucGVyZlBhZ2VTaXplID0gTnVtYmVyKHNpemUpIHx8IDEwO1xyXG4gICAgdGhpcy5wZXJmUGFnZSA9IDE7XHJcbiAgfVxyXG5cclxuICAvKiogQSBuZXcgc2VhcmNoIHN0YXJ0cyBvbiBwYWdlIDEuICovXHJcbiAgb25QZXJmU2VhcmNoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5wZXJmUGFnZSA9IDE7XHJcbiAgfVxyXG5cclxuICAvKiogUGVyZm9ybWFuY2UgaGVhZGVyIGNsaWNrOiBzb3J0IGJ5IHRoYXQgY29sdW1uLCBhZ2FpbiB0byByZXZlcnNlIChzYW1lIHRvZ2dsZSBhcyB0aGUgc3RvcmUgbGlzdCkuICovXHJcbiAgc29ydFBlcmYoa2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnBlcmZTb3J0S2V5ID09PSBrZXkpIHtcclxuICAgICAgdGhpcy5wZXJmU29ydERpciA9IHRoaXMucGVyZlNvcnREaXIgPT09ICdhc2MnID8gJ2Rlc2MnIDogJ2FzYyc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnBlcmZTb3J0S2V5ID0ga2V5O1xyXG4gICAgICB0aGlzLnBlcmZTb3J0RGlyID0gJ2FzYyc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSb3dzIGluIHRoZSBwaWNrZWQgY29sdW1uIG9yZGVyICh0aGUgQVBJJ3Mgb3JkZXIgd2hlbiBub25lIGlzIHBpY2tlZCkuIE51bWJlcnMgY29tcGFyZSBhcyBudW1iZXJzLCB0ZXh0XHJcbiAgICogY2FzZS1pbnNlbnNpdGl2ZWx5OyBlbXB0eSB2YWx1ZXMgKCfigJQnKSBzdGF5IGF0IHRoZSBib3R0b20gaW4gYm90aCBkaXJlY3Rpb25zLCBhcyBpbiB0aGUgc3RvcmUgbGlzdC5cclxuICAgKi9cclxuICBwcml2YXRlIHNvcnRQZXJmUm93czxUPihyb3dzOiBUW10sIHZhbHVlczogUmVjb3JkPHN0cmluZywgKHI6IFQpID0+IFNvcnRWYWx1ZT4pOiBUW10ge1xyXG4gICAgY29uc3QgZ2V0ID0gdmFsdWVzW3RoaXMucGVyZlNvcnRLZXldO1xyXG4gICAgaWYgKCFnZXQpIHsgcmV0dXJuIHJvd3M7IH1cclxuICAgIGNvbnN0IGRpciA9IHRoaXMucGVyZlNvcnREaXIgPT09ICdhc2MnID8gMSA6IC0xO1xyXG4gICAgY29uc3QgZW1wdHkgPSAodjogU29ydFZhbHVlKSA9PiB2ID09PSBudWxsIHx8IHYgPT09IHVuZGVmaW5lZCB8fCB2ID09PSAnJyB8fCB2ID09PSAn4oCUJztcclxuICAgIHJldHVybiBbLi4ucm93c10uc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICBjb25zdCBhdiA9IGdldChhKTtcclxuICAgICAgY29uc3QgYnYgPSBnZXQoYik7XHJcbiAgICAgIGlmIChlbXB0eShhdikgfHwgZW1wdHkoYnYpKSB7IHJldHVybiBlbXB0eShhdikgPT09IGVtcHR5KGJ2KSA/IDAgOiAoZW1wdHkoYXYpID8gMSA6IC0xKTsgfVxyXG4gICAgICBpZiAodHlwZW9mIGF2ID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgYnYgPT09ICdudW1iZXInKSB7IHJldHVybiAoYXYgLSBidikgKiBkaXI7IH1cclxuICAgICAgcmV0dXJuIFN0cmluZyhhdikubG9jYWxlQ29tcGFyZShTdHJpbmcoYnYpLCB1bmRlZmluZWQsIHsgbnVtZXJpYzogdHJ1ZSwgc2Vuc2l0aXZpdHk6ICdiYXNlJyB9KSAqIGRpcjtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIFN1Ym1pdHRlZCBjb3VudCAtPiB0aGUgR2FsbGVyeSBvbiB0aGlzIGF1ZGl0J3Mgc3VibWlzc2lvbnMgaW4gdGhlIGRhc2hib2FyZCBwZXJpb2QuICovXHJcbiAgc3VibWl0dGVkUGFyYW1zKHJvdzogQXVkaXRQZXJmUm93KTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBhdWRpdDogU3RyaW5nKHJvdy5yYXc/LnNvdXJjZUNoZWNrTGlzdF9pZCB8fCByb3cucmF3Py5faWQgfHwgJycpLFxyXG4gICAgICBmcm9tOiB0aGlzLmZyb20gfHwgdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5zdGFydERhdGUgfHwgJycsXHJcbiAgICAgIHRvOiB0aGlzLnRvIHx8IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uZW5kRGF0ZSB8fCAnJ1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKiBUYXNrIFN1Ym1pdHRlZCBjb3VudCAtPiB0aGUgR2FsbGVyeSB3aXRoIFR5cGUgVGFzayBvbiB0aGlzIHRhc2sncyBzdWJtaXNzaW9ucyBpbiB0aGUgZGFzaGJvYXJkIHBlcmlvZC4gKi9cclxuICB0YXNrU3VibWl0dGVkUGFyYW1zKHJvdzogVGFza1BlcmZSb3cpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGF1ZGl0OiBTdHJpbmcocm93LnJhdz8udGFza0lkIHx8ICcnKSxcclxuICAgICAgdHlwZTogJ3Rhc2snLFxyXG4gICAgICBmcm9tOiB0aGlzLmZyb20gfHwgdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5zdGFydERhdGUgfHwgJycsXHJcbiAgICAgIHRvOiB0aGlzLnRvIHx8IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uZW5kRGF0ZSB8fCAnJ1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKiBGbGFncyBjb3VudDogdGhlIHNhbWUgR2FsbGVyeSBsaW5rLCBvbmx5IGZsYWdnZWQgc3VibWlzc2lvbnMgKD9mbGFnPTEpLiAqL1xyXG4gIHRhc2tGbGFnUGFyYW1zKHJvdzogVGFza1BlcmZSb3cpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcclxuICAgIHJldHVybiB7IC4uLnRoaXMudGFza1N1Ym1pdHRlZFBhcmFtcyhyb3cpLCBmbGFnOiAnMScgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEF1ZGl0IC8gc3RvcmUgLyB1c2VyIGRldGFpbCBsaW5rOiB0aGUgc3ViamVjdCBwbHVzIHRoZSBkYXNoYm9hcmQgcGVyaW9kIChmcm9tIC8gdG8pLCBzbyB0aGUgZGV0YWlsXHJcbiAgICogcGFnZSBzaG93cyB0aGUgc2FtZSBkYXlzIGFzIHRoZSByb3cgY2xpY2tlZCwgbm90IHRoZSBoZWFkZXIgcmFuZ2UgKHRoZSBkYXNoYm9hcmQga2VlcHMgaXRzIG93biBwZXJpb2QpLlxyXG4gICAqL1xyXG4gIGRldGFpbFBhcmFtcyhzdWJqZWN0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUmVjb3JkPHN0cmluZywgYW55PiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAuLi5zdWJqZWN0LFxyXG4gICAgICBmcm9tOiB0aGlzLmZyb20gfHwgdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5zdGFydERhdGUgfHwgJycsXHJcbiAgICAgIHRvOiB0aGlzLnRvIHx8IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uZW5kRGF0ZSB8fCAnJ1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHBlcmZUYWJMYWJlbCh0YWI6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGFiICsgJyBQZXJmb3JtYW5jZSc7XHJcbiAgfVxyXG5cclxuICBnZXQgcGVyZlNlYXJjaFBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5wZXJmVGFiID09PSAnU3RvcmUnKSB7IHJldHVybiAnU2VhcmNoIGJ5IFN0b3JlIE5hbWUnOyB9XHJcbiAgICBpZiAodGhpcy5wZXJmVGFiID09PSAnVXNlcicpIHsgcmV0dXJuICdTZWFyY2ggYnkgVXNlciBOYW1lJzsgfVxyXG4gICAgcmV0dXJuICdTZWFyY2ggYnkgJyArIHRoaXMubW9kdWxlVGFiO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZpbHRlcmVkQXVkaXRQZXJmKCk6IEF1ZGl0UGVyZlJvd1tdIHtcclxuICAgIGNvbnN0IHEgPSB0aGlzLnBlcmZTZWFyY2gudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICByZXR1cm4gdGhpcy5zb3J0UGVyZlJvd3MocSA/IHRoaXMuYXVkaXRQZXJmLmZpbHRlcihyID0+IHIubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKSA6IHRoaXMuYXVkaXRQZXJmLCB0aGlzLmF1ZGl0U29ydFZhbHVlKTtcclxuICB9XHJcblxyXG4gIGdldCBmaWx0ZXJlZFN0b3JlUGVyZigpOiBTdG9yZVBlcmZSb3dbXSB7XHJcbiAgICBjb25zdCBxID0gdGhpcy5wZXJmU2VhcmNoLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuc29ydFBlcmZSb3dzKHEgPyB0aGlzLnN0b3JlUGVyZi5maWx0ZXIociA9PiAoci5zdG9yZSArICcgJyArIHIuc3RvcmVJZCArICcgJyArIHIuc3BvYykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSkgOiB0aGlzLnN0b3JlUGVyZiwgdGhpcy5zdG9yZVNvcnRWYWx1ZSk7XHJcbiAgfVxyXG5cclxuICBnZXQgZmlsdGVyZWRVc2VyUGVyZigpOiBVc2VyUGVyZlJvd1tdIHtcclxuICAgIGNvbnN0IHEgPSB0aGlzLnBlcmZTZWFyY2gudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICByZXR1cm4gdGhpcy5zb3J0UGVyZlJvd3MocSA/IHRoaXMudXNlclBlcmYuZmlsdGVyKHIgPT4gKHIubmFtZSArICcgJyArIHIuZW1haWwpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkpIDogdGhpcy51c2VyUGVyZiwgdGhpcy51c2VyU29ydFZhbHVlKTtcclxuICB9XHJcblxyXG4gIHRyYWNrQnlQZXJmQXVkaXQoXzogbnVtYmVyLCByb3c6IEF1ZGl0UGVyZlJvdyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcm93LnJhdz8uc291cmNlQ2hlY2tMaXN0X2lkIHx8IHJvdy5uYW1lO1xyXG4gIH1cclxuXHJcbiAgdHJhY2tCeVBlcmZTdG9yZShfOiBudW1iZXIsIHJvdzogU3RvcmVQZXJmUm93KTogc3RyaW5nIHtcclxuICAgIHJldHVybiByb3cuc3RvcmVJZCB8fCByb3cuc3RvcmU7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5UGVyZlVzZXIoXzogbnVtYmVyLCByb3c6IFVzZXJQZXJmUm93KTogc3RyaW5nIHtcclxuICAgIHJldHVybiByb3cuZW1haWw7XHJcbiAgfVxyXG5cclxuICBvblBhZ2VDaGFuZ2UocGFnZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnBhZ2UgPSBOdW1iZXIocGFnZSkgfHwgMTtcclxuICB9XHJcblxyXG4gIG9uUGFnZVNpemVDaGFuZ2Uoc2l6ZTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnBhZ2VTaXplID0gTnVtYmVyKHNpemUpIHx8IDEwO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICB9XHJcblxyXG4gIHRyYWNrQnlTdG9yZShfOiBudW1iZXIsIHJvdzogQXVkaXRSb3cpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHJvdy5zdG9yZUlkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogZmlsdGVyQ2F0cyAvIGJhbmRSb3dzIGFyZSBnZXR0ZXJzIHRoYXQgYnVpbGQgbmV3IG9iamVjdHMgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvbi4gV2l0aG91dCBhIGtleVxyXG4gICAqIG5nRm9yIHJlYnVpbGRzIHRoZWlyIGJ1dHRvbnMgb24gZWFjaCBwYXNzLCBhbmQgYSBwYXNzIGJldHdlZW4gbW91c2Vkb3duIGFuZCBtb3VzZXVwICh0aGUgaGllcmFyY2h5XHJcbiAgICogZHJvcGRvd24gbGlzdGVucyB0byBkb2N1bWVudDptb3VzZWRvd24pIHN3YWxsb3dzIHRoZSBjbGljay5cclxuICAgKi9cclxuICB0cmFja0J5Q2F0KF86IG51bWJlciwgYzogRmlsdGVyQ2F0KTogc3RyaW5nIHtcclxuICAgIHJldHVybiBjLmtleTtcclxuICB9XHJcblxyXG4gIHRyYWNrQnlCYW5kKF86IG51bWJlciwgYjogeyBiYW5kOiBBdWRpdEJhbmQgfSk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYi5iYW5kLmtleTtcclxuICB9XHJcblxyXG4gIC8qKiAtLS0tIEV4cG9ydCAoY2xpZW50LXNpZGUgLnhsc3ggb2YgZXhhY3RseSB0aGUgZmlsdGVyZWQgcm93cyBhbmQgdmlzaWJsZSBjb2x1bW5zKSAtLS0tICovXHJcblxyXG4gIHByaXZhdGUgZ2V0IGV4cG9ydFBlcmlvZCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZnJvbSArICdfJyArIHRoaXMudG87XHJcbiAgfVxyXG5cclxuICAvKiogSGVhZGVyIEV4cG9ydDogdGhlIHN0b3JlIGxpc3QgYmVsb3cgdGhlIGZpbHRlcnMsIGV2ZXJ5IGZpbHRlcmVkIHJvdyAoYWxsIHBhZ2VzKSwgaXRzIHZpc2libGUgY29sdW1ucy4gKi9cclxuICBleHBvcnRTdG9yZXMoKTogdm9pZCB7XHJcbiAgICBjb25zdCByb3dzID0gdGhpcy5maWx0ZXJlZFJvd3M7XHJcbiAgICBpZiAodGhpcy5sb2FkaW5nIHx8ICFyb3dzLmxlbmd0aCkgeyByZXR1cm47IH1cclxuICAgIGNvbnN0IGNvbHVtbnM6IEV4cG9ydENvbHVtbjxBdWRpdFJvdz5bXSA9IHRoaXMuaGVhZGVycy5tYXAoaCA9PiAoe1xyXG4gICAgICBoZWFkZXI6IGgubGFiZWwsXHJcbiAgICAgIHZhbHVlOiAocjogQXVkaXRSb3cpID0+IHtcclxuICAgICAgICBpZiAoaC5rZXkgPT09ICdzY29yZScpIHsgcmV0dXJuIHIuc2NvcmUgPT09IG51bGwgPyAn4oCUJyA6IHIuc2NvcmUgKyAnJSc7IH1cclxuICAgICAgICBpZiAoaC5rZXkgPT09ICdzdGF0dXMnKSB7IHJldHVybiB0aGlzLnN0YXR1c0xhYmVsKHIpOyB9XHJcbiAgICAgICAgcmV0dXJuIHJbaC5rZXkgYXMga2V5b2YgQXVkaXRSb3ddO1xyXG4gICAgICB9XHJcbiAgICB9KSk7XHJcbiAgICB0aGlzLnRyYXhTZXJ2aWNlLmV4cG9ydFJvd3NYbHN4KHJvd3MsIGNvbHVtbnMsICdBdWRpdC1EYXNoYm9hcmQtU3RvcmVzLScgKyB0aGlzLmV4cG9ydFBlcmlvZCwgJ1N0b3JlIGxpc3QnKTtcclxuICB9XHJcblxyXG4gIC8qKiBSb3dzIG9mIHRoZSBhY3RpdmUgcGVyZm9ybWFuY2UgdGFiIGFmdGVyIGl0cyBzZWFyY2ggKHdoYXQgdGhlIFwiVG90YWxcIiBjb3VudGVyIHNob3dzKS4gKi9cclxuICBnZXQgcGVyZlJvd0NvdW50KCk6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy5wZXJmVGFiID09PSAnU3RvcmUnKSB7IHJldHVybiB0aGlzLmZpbHRlcmVkU3RvcmVQZXJmLmxlbmd0aDsgfVxyXG4gICAgaWYgKHRoaXMucGVyZlRhYiA9PT0gJ1VzZXInKSB7IHJldHVybiB0aGlzLmZpbHRlcmVkVXNlclBlcmYubGVuZ3RoOyB9XHJcbiAgICByZXR1cm4gdGhpcy5pc1Rhc2tNb2R1bGUgPyB0aGlzLmZpbHRlcmVkVGFza1BlcmYubGVuZ3RoIDogdGhpcy5maWx0ZXJlZEF1ZGl0UGVyZi5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIGFjdGl2ZSBwZXJmb3JtYW5jZSB0YWIgaXMgc3RpbGwgbG9hZGluZyAodGhlIFRhc2sgdGFibGUgaGFzIGl0cyBvd24gZmVlZCkuICovXHJcbiAgZ2V0IHBlcmZMb2FkaW5nKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMucGVyZlRhYiA9PT0gJ0F1ZGl0JyAmJiB0aGlzLmlzVGFza01vZHVsZSA/IHRoaXMudGFza0xvYWRpbmcgOiB0aGlzLmxvYWRpbmc7XHJcbiAgfVxyXG5cclxuICAvKiogUGVyZm9ybWFuY2UgRXhwb3J0OiB0aGUgYWN0aXZlIHRhYidzIGZpbHRlcmVkIGxpc3Qgd2l0aCBpdHMgdmlzaWJsZSBjb2x1bW4gaGVhZGVycyAoQWN0aW9uIGxlZnQgb3V0KS4gKi9cclxuICBleHBvcnRQZXJmb3JtYW5jZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnBlcmZMb2FkaW5nIHx8ICF0aGlzLnBlcmZSb3dDb3VudCkgeyByZXR1cm47IH1cclxuICAgIGNvbnN0IHBlcmlvZCA9IHRoaXMuZXhwb3J0UGVyaW9kO1xyXG4gICAgaWYgKHRoaXMucGVyZlRhYiA9PT0gJ1N0b3JlJykge1xyXG4gICAgICBjb25zdCBjb2x1bW5zOiBFeHBvcnRDb2x1bW48U3RvcmVQZXJmUm93PltdID0gW1xyXG4gICAgICAgIHsgaGVhZGVyOiAnU3RvcmUgTmFtZScsIHZhbHVlOiByID0+IHIuc3RvcmUgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ1N0b3JlIElEJywgdmFsdWU6IHIgPT4gci5zdG9yZUlkIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdTdG9yZSBTcG9jJywgdmFsdWU6IHIgPT4gci5zcG9jIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdBc3NpZ25lZCcsIHZhbHVlOiByID0+IHIuYXNzaWduZWQgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ0ZsYWdzJywgdmFsdWU6IHIgPT4gci5mbGFncyA/PyAn4oCUJyB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnQ29tcGxldGlvbiAlJywgdmFsdWU6IHIgPT4gci5jb21wbGV0aW9uIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdDb21wbGlhbmNlICUnLCB2YWx1ZTogciA9PiByLmNvbXBsaWFuY2UgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ1BlcmZvcm1hbmNlICUnLCB2YWx1ZTogciA9PiByLnBlcmYgfVxyXG4gICAgICBdO1xyXG4gICAgICB0aGlzLnRyYXhTZXJ2aWNlLmV4cG9ydFJvd3NYbHN4KHRoaXMuZmlsdGVyZWRTdG9yZVBlcmYsIGNvbHVtbnMsICdBdWRpdC1EYXNoYm9hcmQtU3RvcmUtUGVyZm9ybWFuY2UtJyArIHBlcmlvZCwgJ1N0b3JlIFBlcmZvcm1hbmNlJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnBlcmZUYWIgPT09ICdVc2VyJykge1xyXG4gICAgICBjb25zdCBjb2x1bW5zOiBFeHBvcnRDb2x1bW48VXNlclBlcmZSb3c+W10gPSBbXHJcbiAgICAgICAgeyBoZWFkZXI6ICdVc2VyIE5hbWUnLCB2YWx1ZTogciA9PiByLm5hbWUgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ0VtYWlsJywgdmFsdWU6IHIgPT4gci5lbWFpbCB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnQXNzaWduZWQnLCB2YWx1ZTogciA9PiByLmFzc2lnbmVkIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdGbGFncycsIHZhbHVlOiByID0+IHIuZmxhZ3MgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ1JlRG8nLCB2YWx1ZTogciA9PiByLnJlZG8gfSxcclxuICAgICAgICB7IGhlYWRlcjogJ0NvbXBsZXRpb24gJScsIHZhbHVlOiByID0+IHIuY29tcGxldGlvbiB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnQ29tcGxpYW5jZSAlJywgdmFsdWU6IHIgPT4gci5jb21wbGlhbmNlIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdQZXJmb3JtYW5jZSAlJywgdmFsdWU6IHIgPT4gci5wZXJmIH1cclxuICAgICAgXTtcclxuICAgICAgdGhpcy50cmF4U2VydmljZS5leHBvcnRSb3dzWGxzeCh0aGlzLmZpbHRlcmVkVXNlclBlcmYsIGNvbHVtbnMsICdBdWRpdC1EYXNoYm9hcmQtVXNlci1QZXJmb3JtYW5jZS0nICsgcGVyaW9kLCAnVXNlciBQZXJmb3JtYW5jZScpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5pc1Rhc2tNb2R1bGUpIHtcclxuICAgICAgY29uc3QgY29sdW1uczogRXhwb3J0Q29sdW1uPFRhc2tQZXJmUm93PltdID0gW1xyXG4gICAgICAgIHsgaGVhZGVyOiAnVGFzayBOYW1lJywgdmFsdWU6IHIgPT4gci5uYW1lIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdDcmVhdGVkIGJ5JywgdmFsdWU6IHIgPT4gci5jcmVhdGVkQnkgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ0NyZWF0ZWQgT24nLCB2YWx1ZTogciA9PiByLmNyZWF0ZWRPbiB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnUHJpb3JpdHknLCB2YWx1ZTogciA9PiByLnByaW9yaXR5IH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdBc3NpZ25lZCBUbycsIHZhbHVlOiByID0+IHIuYXNzaWduZWQgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ1N1Ym1pdHRlZCcsIHZhbHVlOiByID0+IHIuc3VibWl0dGVkIHx8ICctLScgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ1JlZG8nLCB2YWx1ZTogciA9PiByLnJlZG8gfHwgJy0tJyB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnRHVlIG9uJywgdmFsdWU6IHIgPT4gci5kdWVPbiB9XHJcbiAgICAgIF07XHJcbiAgICAgIHRoaXMudHJheFNlcnZpY2UuZXhwb3J0Um93c1hsc3godGhpcy5maWx0ZXJlZFRhc2tQZXJmLCBjb2x1bW5zLCAnQXVkaXQtRGFzaGJvYXJkLVRhc2stUGVyZm9ybWFuY2UtJyArIHBlcmlvZCwgJ1Rhc2sgUGVyZm9ybWFuY2UnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY29sdW1uczogRXhwb3J0Q29sdW1uPEF1ZGl0UGVyZlJvdz5bXSA9IFtcclxuICAgICAgeyBoZWFkZXI6ICdBdWRpdCBOYW1lJywgdmFsdWU6IHIgPT4gci5uYW1lIH0sXHJcbiAgICAgIHsgaGVhZGVyOiAnQXNzaWduZWQgVG8nLCB2YWx1ZTogciA9PiByLmFzc2lnbmVkIH0sXHJcbiAgICAgIHsgaGVhZGVyOiAnU3VibWl0dGVkJywgdmFsdWU6IHIgPT4gci5zdWJtaXR0ZWQgfSxcclxuICAgICAgeyBoZWFkZXI6ICdEaXNwdXRlcycsIHZhbHVlOiByID0+IHIuZGlzcHV0ZXMgPz8gJ+KAlCcgfSxcclxuICAgICAgeyBoZWFkZXI6ICdQYXNzIE1hcmsnLCB2YWx1ZTogciA9PiByLnBhc3NNYXJrIH0sXHJcbiAgICAgIHsgaGVhZGVyOiAnU2NvcmUnLCB2YWx1ZTogciA9PiByLnNjb3JlIH0sXHJcbiAgICAgIHsgaGVhZGVyOiAnUmVzdWx0JywgdmFsdWU6IHIgPT4gdGhpcy5yZXN1bHRUZXh0KHIucmVzdWx0KSB9XHJcbiAgICBdO1xyXG4gICAgdGhpcy50cmF4U2VydmljZS5leHBvcnRSb3dzWGxzeCh0aGlzLmZpbHRlcmVkQXVkaXRQZXJmLCBjb2x1bW5zLCAnQXVkaXQtRGFzaGJvYXJkLUF1ZGl0LVBlcmZvcm1hbmNlLScgKyBwZXJpb2QsICdBdWRpdCBQZXJmb3JtYW5jZScpO1xyXG4gIH1cclxuXHJcbiAgLyoqIC0tLS0gUGVyLXN0b3JlIFBERiAtLS0tICovXHJcblxyXG4gIC8qKiBUaGUgc3RvcmUncyBsYXRlc3Qgc3VibWl0dGVkIGF1ZGl0IGluIHRoZSBwZXJpb2QgKHRoZSBkYXNoYm9hcmQgQVBJJ3MgbGFzdFZpc2l0SWQpLCBpZiBhbnkuICovXHJcbiAgcGRmVmlzaXRJZChyb3c6IEF1ZGl0Um93KTogc3RyaW5nIHtcclxuICAgIHJldHVybiByb3cucmF3Py5sYXN0VmlzaXRJZCA/IFN0cmluZyhyb3cucmF3Lmxhc3RWaXNpdElkKSA6ICcnO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBhdWRpdCBvZiB0aGF0IGxhdGVzdCBzdWJtaXNzaW9uIChsYXN0VmlzaXRBdWRpdElkKTogVmlldyBvcGVucyBpdCBpbiB0aGUgR2FsbGVyeS4gJycgd2l0aG91dCBvbmUuICovXHJcbiAgZ2FsbGVyeUF1ZGl0SWQocm93OiBBdWRpdFJvdyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcm93LnJhdz8ubGFzdFZpc2l0QXVkaXRJZCA/IFN0cmluZyhyb3cucmF3Lmxhc3RWaXNpdEF1ZGl0SWQpIDogJyc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgYXVkaXRzIGEgc3RvcmUgc3VibWl0dGVkIGluIHRoZSBwZXJpb2QgKEFQSSBhdWRpdExpc3Q6IG5hbWUsIHN1Ym1pc3Npb25zLCB0aGF0IGF1ZGl0J3MgYXZlcmFnZSBzY29yZSkuIFdpdGhcclxuICAgKiBtb3JlIHRoYW4gb25lLCBWaWV3IG9wZW5zIGEgbWVudSB0byBwaWNrIHRoZSBhdWRpdCB0aGUgR2FsbGVyeSBvcGVucyBvbiAodGhlIEdhbGxlcnkgcmVhZHMgb25lIGF1ZGl0IGF0IGEgdGltZSkuXHJcbiAgICovXHJcbiAgc3RvcmVBdWRpdHMocm93OiBBdWRpdFJvdyk6IEFycmF5PHsgYXVkaXRJZDogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHN1Ym1pdHRlZDogbnVtYmVyOyBzY29yZTogbnVtYmVyIHwgbnVsbCB9PiB7XHJcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShyb3cucmF3Py5hdWRpdExpc3QpID8gcm93LnJhdy5hdWRpdExpc3QgOiBbXTtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgc3RvcmUgcm93IHdob3NlIFZpZXcgbWVudSBpcyBvcGVuICgnJyA9IG5vbmUpLiAqL1xyXG4gIHZpZXdNZW51U3RvcmUgPSAnJztcclxuXHJcbiAgLyoqIFRoZSBvcGVuIFZpZXcgbWVudSdzIHBsYWNlIG9uIHNjcmVlbiAoZml4ZWQsIHNvIHRoZSBzY3JvbGxpbmcgdGFibGUgbmV2ZXIgY2xpcHMgaXQpLiAqL1xyXG4gIHZpZXdNZW51UG9zID0geyB0b3A6IDAsIHJpZ2h0OiAwIH07XHJcblxyXG4gIHRvZ2dsZVZpZXdNZW51KHJvdzogQXVkaXRSb3csIGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBjb25zdCBrZXkgPSBTdHJpbmcocm93LnJhdz8uc3RvcmVJZCB8fCByb3cuc3RvcmVJZCk7XHJcbiAgICBpZiAodGhpcy52aWV3TWVudVN0b3JlID09PSBrZXkpIHtcclxuICAgICAgdGhpcy52aWV3TWVudVN0b3JlID0gJyc7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHJlY3QgPSAoZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICB0aGlzLnZpZXdNZW51UG9zID0geyB0b3A6IHJlY3QuYm90dG9tICsgNiwgcmlnaHQ6IE1hdGgubWF4KDgsIHdpbmRvdy5pbm5lcldpZHRoIC0gcmVjdC5yaWdodCkgfTtcclxuICAgIHRoaXMudmlld01lbnVTdG9yZSA9IGtleTtcclxuICB9XHJcblxyXG4gIGlzVmlld01lbnVPcGVuKHJvdzogQXVkaXRSb3cpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhIXRoaXMudmlld01lbnVTdG9yZSAmJiB0aGlzLnZpZXdNZW51U3RvcmUgPT09IFN0cmluZyhyb3cucmF3Py5zdG9yZUlkIHx8IHJvdy5zdG9yZUlkKTtcclxuICB9XHJcblxyXG4gIC8qKiBBIGNsaWNrIGFueXdoZXJlIGVsc2UsIGEgc2Nyb2xsIG9yIGEgcmVzaXplIGNsb3NlcyB0aGUgVmlldyBtZW51LiAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJylcclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6c2Nyb2xsJylcclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcclxuICBjbG9zZVZpZXdNZW51KCk6IHZvaWQge1xyXG4gICAgdGhpcy52aWV3TWVudVN0b3JlID0gJyc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgR2FsbGVyeSdzIEV4cG9ydCBhcyBQREYgKFBPU1QgL3RyYXgvYXVkaXQvZ2FsbGVyeS9kb3dubG9hZCkgZm9yIHRoaXMgc3RvcmU6IHRoZSBhdWRpdCBvZiBpdHMgbGF0ZXN0IHN1Ym1pc3Npb25cclxuICAgKiAodGhlIGF1ZGl0IFZpZXcgb3BlbnMgaW4gdGhlIEdhbGxlcnkpLCB0aGUgZGFzaGJvYXJkJ3MgcGVyaW9kLCBldmVyeSBxdWVzdGlvbiBhbmQgbm8gb3RoZXIgZmlsdGVyLlxyXG4gICAqIFF1ZXVlZCwgdGhlbiBsaXN0ZWQgdW5kZXIgTm90aWZpY2F0aW9ucyA+IERvd25sb2Fkcy5cclxuICAgKi9cclxuICBkb3dubG9hZFBkZihyb3c6IEF1ZGl0Um93KTogdm9pZCB7XHJcbiAgICBjb25zdCBhdWRpdElkID0gdGhpcy5nYWxsZXJ5QXVkaXRJZChyb3cpO1xyXG4gICAgY29uc3Qgc3RvcmVJZCA9IHJvdy5yYXc/LnN0b3JlSWQgfHwgcm93LnN0b3JlSWQ7XHJcbiAgICBjb25zdCBrZXkgPSBhdWRpdElkICsgJ3wnICsgc3RvcmVJZDtcclxuICAgIGlmICghYXVkaXRJZCB8fCB0aGlzLnBkZlF1ZXVlZC5oYXMoa2V5KSkgeyByZXR1cm47IH1cclxuICAgIHRoaXMucGRmUXVldWVkLmFkZChrZXkpO1xyXG4gICAgY29uc3QgZnJvbURhdGUgPSB0aGlzLmZyb20gfHwgdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5zdGFydERhdGU7XHJcbiAgICB0aGlzLnRyYXhTZXJ2aWNlLmF1ZGl0R2FsbGVyeURvd25sb2FkKHtcclxuICAgICAgY2xpZW50SWQ6IHRoaXMuaGVhZGVyRGF0YT8uY2xpZW50LFxyXG4gICAgICB0eXBlOiB0aGlzLmlzVGFza01vZHVsZSA/ICd0YXNrJyA6ICdhdWRpdCcsXHJcbiAgICAgIHNvdXJjZUNoZWNrTGlzdF9pZDogYXVkaXRJZCxcclxuICAgICAgZnJvbURhdGUsXHJcbiAgICAgIHRvRGF0ZTogdGhpcy50byB8fCB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LmVuZERhdGUgfHwgZnJvbURhdGUsXHJcbiAgICAgIGZpbGVUeXBlOiAncGRmJyxcclxuICAgICAgZmlsdGVydHlwZTogJ0NsdXN0ZXJzJyxcclxuICAgICAgc3RvcmVJZHM6IFtzdG9yZUlkXSxcclxuICAgICAgdXNlckVtYWlsTGlzdDogW10sXHJcbiAgICAgIHF1ZXN0aW9uczogW10sXHJcbiAgICAgIGFuc3dlclR5cGU6ICdhbGwnLFxyXG4gICAgICBhcHByb3ZlRmlsdGVyOiAnYWxsJyxcclxuICAgICAgdmlld0ZsYWc6IGZhbHNlLFxyXG4gICAgICB2aWV3UmVkbzogZmFsc2UsXHJcbiAgICAgIHZpZXdEaXNwdXRlZDogZmFsc2UsXHJcbiAgICAgIHByZXZpZXdUeXBlOiAnaW1hZ2UnXHJcbiAgICB9KS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5wZGZRdWV1ZWQuZGVsZXRlKGtleSk7XHJcbiAgICAgICAgaWYgKHJlcz8uY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldFN1Y2Nlc3NUb2FzdChcclxuICAgICAgICAgICAgJzxkaXY+PHNwYW4gY2xhc3M9XCJtZS04XCI+RG93bmxvYWRpbmcgeW91ciByZXBvcnRzPC9zcGFuPjxhIGhyZWY9XCJub3RpZmljYXRpb25zL2FsZXJ0cz90YWI9ZG93bmxvYWRcIiBzdHlsZT1cImNvbG9yOiM5OWMzZmY7IHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7IGN1cnNvcjpwb2ludGVyXCI+VmlldzwvYT48L2Rpdj4nXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QocmVzPy5tZXNzYWdlIHx8ICdDb3VsZCBub3Qgc3RhcnQgdGhlIGV4cG9ydCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnBkZlF1ZXVlZC5kZWxldGUoa2V5KTtcclxuICAgICAgICB0aGlzLnRvYXN0LmdldEVycm9yVG9hc3QoZT8uZXJyb3I/Lm1lc3NhZ2UgfHwgZT8uZXJyb3I/LmVycm9yIHx8ICdDb3VsZCBub3Qgc3RhcnQgdGhlIGV4cG9ydCcpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImF2Mi1wYWdlIGF1ZGl0LWRhc2hcIj5cclxuXHJcbiAgPCEtLSBSZWZyZXNoIGxpbmUgKyBtb2R1bGUgc3dpdGNoIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJkYi10b3BsaW5lXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZGItcmVmcmVzaFwiPkxhc3QgcmVmcmVzaGVkIGF0IHt7IGxhc3RSZWZyZXNoZWQgfX08L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJhdjItZ3Jvd1wiPjwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZHVsZXN3aXRjaFwiPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1vZHVsZXRhYlwiICpuZ0Zvcj1cImxldCB0IG9mIG1vZHVsZVRhYnNcIiBbY2xhc3MubW9kdWxldGFiLW9uXT1cIm1vZHVsZVRhYiA9PT0gdFwiXHJcbiAgICAgICAgKGNsaWNrKT1cInNldE1vZHVsZVRhYih0KVwiPnt7IHQgfX08L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tID09PT09PT09PT09PSBBVURJVCBTQ09SRUNBUkQgPT09PT09PT09PT09IC0tPlxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNUYXNrTW9kdWxlXCI+XHJcblxyXG4gICAgPCEtLSBDcnVtYiwgc2NvcGUgdGl0bGUsIGFjdGlvbnMgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZGItc2NvcGViYXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRiLXNjb3BldGV4dFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jcnVtYlwiPkF1ZGl0cyDigLogRGFzaGJvYXJkPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLXNjb3BlXCI+e3sgc2NvcGVMYWJlbCB9fTwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGF2Mi1idG4tLWdob3N0IGF2Mi1idG4tLXNtXCIgKGNsaWNrKT1cIm9wZW5GaWx0ZXJzKClcIj5cclxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuOFwiXHJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cclxuICAgICAgICAgIDxsaW5lIHgxPVwiNFwiIHkxPVwiN1wiIHgyPVwiMjBcIiB5Mj1cIjdcIj48L2xpbmU+XHJcbiAgICAgICAgICA8bGluZSB4MT1cIjdcIiB5MT1cIjEyXCIgeDI9XCIxN1wiIHkyPVwiMTJcIj48L2xpbmU+XHJcbiAgICAgICAgICA8bGluZSB4MT1cIjEwXCIgeTE9XCIxN1wiIHgyPVwiMTRcIiB5Mj1cIjE3XCI+PC9saW5lPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIEZpbHRlcnNcclxuICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWNvdW50cGlsbFwiICpuZ0lmPVwiZmlsdGVyQ291bnRcIj57eyBmaWx0ZXJDb3VudCB9fTwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1naG9zdCBhdjItYnRuLS1zbVwiIFtkaXNhYmxlZF09XCJsb2FkaW5nIHx8ICFmaWx0ZXJlZFJvd3MubGVuZ3RoXCJcclxuICAgICAgICB0aXRsZT1cIkRvd25sb2FkIHRoZSBzdG9yZSBsaXN0IGJlbG93IGFzIGFuIEV4Y2VsIGZpbGVcIiAoY2xpY2spPVwiZXhwb3J0U3RvcmVzKClcIj5cclxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuOFwiXHJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cclxuICAgICAgICAgIDxwYXRoIGQ9XCJNMTIgMTZWNFwiPjwvcGF0aD5cclxuICAgICAgICAgIDxwb2x5bGluZSBwb2ludHM9XCI3IDkgMTIgNCAxNyA5XCI+PC9wb2x5bGluZT5cclxuICAgICAgICAgIDxwYXRoIGQ9XCJNNCAxNnY0aDE2di00XCI+PC9wYXRoPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIEV4cG9ydFxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gRmlsdGVyIGNoaXBzIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImRiLWNoaXBzXCI+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZGItY2hpcFwiICpuZ0Zvcj1cImxldCBjIG9mIGZpbHRlckNhdHM7IHRyYWNrQnk6IHRyYWNrQnlDYXRcIiBbY2xhc3MuaXMtZGlydHldPVwiYy5kaXJ0eVwiXHJcbiAgICAgICAgKGNsaWNrKT1cIm9wZW5GaWx0ZXJzKGMua2V5KVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZGItY2hpcC1sYWJlbFwiPnt7IGMubGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1jaGlwLXZhbHVlXCI+e3sgYy52YWx1ZSB9fTwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZGItY2xlYXJhbGxcIiAqbmdJZj1cImZpbHRlckNvdW50XCIgKGNsaWNrKT1cImNsZWFyQWxsKClcIj5DbGVhciBhbGw8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gS1BJIHRpbGVzIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImRiLWtwaXNcIj5cclxuICAgICAgPCEtLSBPbGQgQ2hlY2tsaXN0IHN1bW1hcnkgY2FyZDogZmlndXJlICsgbGFiZWwgaW4gdGhlIGdyYWRpZW50IHN0cmlwLCBub3RlIGJlbG93LiAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImF2Mi1vY2FyZFwiICpuZ0Zvcj1cImxldCBrcGkgb2Yga3Bpc1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdjItb2NhcmQtaGVhZFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1vY2FyZC1jb3VudFwiPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImxvYWRpbmdcIiBjbGFzcz1cImF2Mi1zayBhdjItc2stLXZhbHVlIGRiLXNrLXZhbHVlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxvYWRpbmdcIj57eyBrcGkudmFsdWUgfX08L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1vY2FyZC10ZXh0XCI+e3sga3BpLmxhYmVsIH19PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1vY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImxvYWRpbmdcIiBjbGFzcz1cImF2Mi1zayBhdjItc2stLW5vdGVcIj48L3NwYW4+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWxvYWRpbmdcIiBjbGFzcz1cImF2Mi1vY2FyZC1ub3RlXCIgW3N0eWxlLmNvbG9yXT1cImtwaS5ub3RlQ29sb3JcIj57eyBrcGkubm90ZSB9fTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gVHJlbmQgKyBkaXN0cmlidXRpb24gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZGItZHVvXCI+XHJcbiAgICAgIDwhLS0gVHJlbmQgLS0+XHJcbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwiZGItY2FyZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jYXJkLWhlYWQgZGItY2FyZC1oZWFkLS13cmFwXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY2FyZC10aXRsZSBkYi1jYXJkLXRpdGxlLS1ncm93XCI+QXVkaXQgc2NvcmUgdHJlbmQ8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zZWdcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJkYi1zZWctdGFiXCIgW2NsYXNzLmlzLW9uXT1cImdyYWluID09PSAncXVhcnRlcidcIiAoY2xpY2spPVwic2V0R3JhaW4oJ3F1YXJ0ZXInKVwiPlF1YXJ0ZXJseTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImRiLXNlZy10YWJcIiBbY2xhc3MuaXMtb25dPVwiZ3JhaW4gPT09ICdkYXRlJ1wiIChjbGljayk9XCJzZXRHcmFpbignZGF0ZScpXCI+QnkgZGF0ZTwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1kYXRlcm93XCIgKm5nSWY9XCJzaG93VHJlbmREYXRlUGlja2VyICYmIGdyYWluID09PSAnZGF0ZSdcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZGF0ZXBpY2tcIj5cclxuICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImF2Mi1kYXRlcGljay1pY29uXCIgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHJlY3QgeD1cIjNcIiB5PVwiNFwiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxOFwiIHJ4PVwiMlwiPjwvcmVjdD5cclxuICAgICAgICAgICAgICA8bGluZSB4MT1cIjE2XCIgeTE9XCIyXCIgeDI9XCIxNlwiIHkyPVwiNlwiPjwvbGluZT48bGluZSB4MT1cIjhcIiB5MT1cIjJcIiB4Mj1cIjhcIiB5Mj1cIjZcIj48L2xpbmU+PGxpbmUgeDE9XCIzXCIgeTE9XCIxMFwiIHgyPVwiMjFcIiB5Mj1cIjEwXCI+PC9saW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImF2Mi1kYXRlcGljay1pbnB1dCBkYi1kYXRlcmFuZ2VcIiBuZ3hEYXRlcmFuZ2VwaWNrZXJNZCByZWFkb25seSBhdXRvY29tcGxldGU9XCJvZmZcIlxyXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGRhdGUgcmFuZ2VcIiBbKG5nTW9kZWwpXT1cInJhbmdlXCIgW2xvY2FsZV09XCJwaWNrZXJMb2NhbGVcIiBbbWF4RGF0ZV09XCJ0b2RheVwiXHJcbiAgICAgICAgICAgICAgW2RhdGVMaW1pdF09XCJtYXhSYW5nZURheXNcIiBbcmFuZ2VzXT1cInJhbmdlc1wiIFtzaG93Q3VzdG9tUmFuZ2VMYWJlbF09XCJ0cnVlXCIgW2Fsd2F5c1Nob3dDYWxlbmRhcnNdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgIFtrZWVwQ2FsZW5kYXJPcGVuaW5nV2l0aFJhbmdlXT1cInRydWVcIiBbYXV0b0FwcGx5XT1cInRydWVcIiBbc2hvd0NhbmNlbF09XCJmYWxzZVwiIFtkcm9wc109XCInZG93bidcIiBbb3BlbnNdPVwiJ3JpZ2h0J1wiXHJcbiAgICAgICAgICAgICAgKGRhdGVzVXBkYXRlZCk9XCJvblJhbmdlUGlja2VkKCRldmVudClcIj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidHJlbmRMb2FkaW5nXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImF2Mi1zayBhdjItc2stLXRpdGxlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdjItc2sgYXYyLXNrLS1ibG9jayBkYi1zay1jaGFydFwiPjwvc3Bhbj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF0cmVuZExvYWRpbmdcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItZm9jdXNcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItZm9jdXMtc2NvcmVcIiBbY2xhc3MuaXMtZmFpbF09XCIhZm9jdXNQYXNzZWRcIj57eyBmb2N1c1Njb3JlIH19PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1mb2N1cy1waWxsXCIgKm5nSWY9XCJzaG93UGFzc01hcmtJbmZvXCIgW2NsYXNzLmlzLXBhc3NdPVwiZm9jdXNQYXNzZWRcIiBbY2xhc3MuaXMtZmFpbF09XCIhZm9jdXNQYXNzZWRcIj57eyBmb2N1c1N0YXR1cyB9fTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItZm9jdXMtbGluZVwiPnt7IGZvY3VzTGluZSB9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLWxlZ2VuZFwiICpuZ0lmPVwic2hvd1Bhc3NNYXJrSW5mb1wiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1sZWdlbmQtZGFzaFwiPjwvc3Bhbj5QYXNzIG1hcmsge3sgcGFzc01hcmsgfX0lXHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jaGFydFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLWNoYXJ0LXlcIj5cclxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJ0b3A6MFwiPjEwMCU8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwidG9wOjUwJVwiPjUwJTwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJ0b3A6MTAwJVwiPjAlPC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY2hhcnQtYXJlYVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWdyaWRsaW5lXCIgc3R5bGU9XCJ0b3A6MFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1ncmlkbGluZVwiIHN0eWxlPVwidG9wOjUwJVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1ncmlkbGluZVwiIHN0eWxlPVwidG9wOjEwMCVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItcGFzc2xpbmVcIiBbc3R5bGUudG9wLiVdPVwiMTAwIC0gcGFzc01hcmtcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1iYXJzXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLWJhci1jb2xcIiAqbmdGb3I9XCJsZXQgYmFyIG9mIHRyZW5kQmFyczsgbGV0IGZpcnN0ID0gZmlyc3Q7IGxldCBsYXN0ID0gbGFzdFwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaXMtcGlja2FibGVdPVwiZ3JhaW4gPT09ICdxdWFydGVyJ1wiIChjbGljayk9XCJzZWxlY3RRdWFydGVyKGJhci5rZXkpXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWJhci12YWx1ZVwiICpuZ0lmPVwiIWRlbnNlVHJlbmRcIiBbY2xhc3MuaXMtYWN0aXZlXT1cImJhci5rZXkgPT09IHF1YXJ0ZXJcIiBbc3R5bGUuYm90dG9tXT1cImJhckhlaWdodChiYXIpXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IGJhci52YWx1ZSA9PT0gbnVsbCA/ICfigJQnIDogYmFyLnZhbHVlICsgJyUnIH19XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWJhclwiIFtzdHlsZS5oZWlnaHRdPVwiYmFySGVpZ2h0KGJhcilcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJiYXJGaWxsKGJhcilcIj48L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXRpcFwiIFtjbGFzcy5pcy1zdGFydF09XCJmaXJzdCAmJiAhbGFzdFwiIFtjbGFzcy5pcy1lbmRdPVwibGFzdCAmJiAhZmlyc3RcIiBbc3R5bGUuYm90dG9tXT1cInRpcEJvdHRvbShiYXIpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi10aXAtaGVhZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGJhci5sYWJlbCB9fTxzcGFuIGNsYXNzPVwiZGItdGlwLXN1YlwiICpuZ0lmPVwiZ3JhaW4gPT09ICdxdWFydGVyJ1wiPiDCtyB7eyBxdWFydGVyTW9udGhzKGJhci5rZXkpIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXRpcC1zY29yZVwiICpuZ0lmPVwiYmFyLnZhbHVlICE9PSBudWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi10aXAtZG90XCIgW2NsYXNzLmlzLWZhaWxdPVwiYmFyLnZhbHVlIDwgcGFzc01hcmtcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi10aXAtdmFsdWVcIj57eyBiYXIudmFsdWUgfX0lPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItdGlwLXN0YXR1c1wiICpuZ0lmPVwic2hvd1Bhc3NNYXJrSW5mb1wiIFtjbGFzcy5pcy1mYWlsXT1cImJhci52YWx1ZSA8IHBhc3NNYXJrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyBiYXIudmFsdWUgPj0gcGFzc01hcmsgPyBsYWJlbHMucGFzcyA6ICdCZWxvdyBwYXNzIG1hcmsnIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXRpcC1lbXB0eVwiICpuZ0lmPVwiYmFyLnZhbHVlID09PSBudWxsXCI+Tm8gc2NvcmVkIGF1ZGl0czwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItdGlwLXJvd1wiPjxzcGFuPkF1ZGl0cyBjb21wbGV0ZWQ8L3NwYW4+PGI+e3sgYmFyLnN1Ym1pdHRlZCB9fTwvYj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXRpcC1yb3dcIiAqbmdJZj1cImJhci5jb3VudCAhPT0gYmFyLnN1Ym1pdHRlZFwiPjxzcGFuPlNjb3JlZCBhdWRpdHM8L3NwYW4+PGI+e3sgYmFyLmNvdW50IH19PC9iPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItdGlwLXJvd1wiPjxzcGFuPlBhc3MgbWFyazwvc3Bhbj48Yj57eyBwYXNzTWFyayB9fSU8L2I+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tIEEgbW9udGggYnkgZGF0ZSBoYXMgfjMwIGJhcnM6IGV2ZXJ5IGZldyBkYXlzIGdldCBhIGxhYmVsIChmaXJzdCBhbmQgbGFzdCBhbHdheXMpLCBhbmQgdGhlIGF1ZGl0IGNvdW50c1xyXG4gICAgICAgICAgICAgbW92ZSB0byB0aGUgYmFyIHRvb2x0aXAsIHNvIHRoZSBsYWJlbHMgbmV2ZXIgcnVuIGludG8gZWFjaCBvdGhlci4gLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLWNoYXJ0LXhcIiBbY2xhc3MuaXMtZGVuc2VdPVwiZGVuc2VUcmVuZFwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1jaGFydC14Y29sXCIgKm5nRm9yPVwibGV0IGJhciBvZiB0cmVuZEJhcnM7IGxldCBpID0gaW5kZXg7IGxldCBsYXN0ID0gbGFzdFwiIFtjbGFzcy5pcy1waWNrYWJsZV09XCJncmFpbiA9PT0gJ3F1YXJ0ZXInXCIgKGNsaWNrKT1cInNlbGVjdFF1YXJ0ZXIoYmFyLmtleSlcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1jaGFydC14bGFiZWxcIiBbY2xhc3MuaXMtYWN0aXZlXT1cImJhci5rZXkgPT09IHF1YXJ0ZXJcIiBbc3R5bGUudmlzaWJpbGl0eV09XCJzaG93WExhYmVsKGksIGxhc3QpID8gJ3Zpc2libGUnIDogJ2hpZGRlbidcIj57eyBiYXIubGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItY2hhcnQteGNvdW50XCIgKm5nSWY9XCIhZGVuc2VUcmVuZFwiPnt7IGJhci5zdWJtaXR0ZWQgPyBiYXIuc3VibWl0dGVkICsgJyBhdWRpdHMnIDogJ25vIGF1ZGl0cycgfX08L3NwYW4+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvc2VjdGlvbj5cclxuXHJcbiAgICAgIDwhLS0gU2NvcmUgYmFuZHMgLS0+XHJcbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwiZGItY2FyZCBkYi1jYXJkLS10aWdodFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jYXJkLWhlYWQgZGItY2FyZC1oZWFkLS1iYXNlbGluZVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLWNhcmQtdGl0bGUgZGItY2FyZC10aXRsZS0tZ3Jvd1wiPlNjb3JlIGRpc3RyaWJ1dGlvbjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLWNhcmQtc3ViXCI+e3sgc3RvcmVzSW5TY29wZSB9fSBpbiBzY29wZTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jYXJkLXN1YlwiPlN0b3JlcyBieSBzY29yZSBiYW5kLCB7eyBwZXJpb2RMYWJlbCB9fTwvZGl2PlxyXG5cclxuICAgICAgICA8bGliLWF1ZGl0LXYyLXNoaW1tZXIgKm5nSWY9XCJsb2FkaW5nXCIgW3Jvd3NdPVwiMlwiPjwvbGliLWF1ZGl0LXYyLXNoaW1tZXI+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1iYW5kYmFyXCIgKm5nSWY9XCIhbG9hZGluZ1wiPlxyXG4gICAgICAgICAgPCEtLSBBIGJhbmQgd2l0aCBzdG9yZXMga2VlcHMgYSB2aXNpYmxlIHNsaXZlciAoMiBvZiAzNTc2IHN0b3JlcyBpcyB1bmRlciBhIHBpeGVsKTsgdGhlIGxhcmdlc3QgYmFuZCBnaXZlcyB3YXkuIC0tPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1iYW5kc2VnXCIgKm5nRm9yPVwibGV0IGIgb2YgYmFuZFJvd3M7IHRyYWNrQnk6IHRyYWNrQnlCYW5kXCIgW3N0eWxlLndpZHRoXT1cImIud2lkdGhcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJiLmJhbmQuc29mdFwiXHJcbiAgICAgICAgICAgIFtjbGFzcy5oYXMtc3RvcmVzXT1cImIuY291bnQgPiAwXCIgW3RpdGxlXT1cImIuYmFuZC5sYWJlbCArICc6ICcgKyBiLmNvdW50XCI+PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItYmFuZHJvd3NcIiAqbmdJZj1cIiFsb2FkaW5nXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItYmFuZHJvd1wiICpuZ0Zvcj1cImxldCBiIG9mIGJhbmRSb3dzOyB0cmFja0J5OiB0cmFja0J5QmFuZFwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWJhbmRkb3RcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJiLmJhbmQuc29mdFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1iYW5kbGFiZWxcIj57eyBiLmJhbmQubGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItYmFuZHJhbmdlXCI+e3sgYi5iYW5kLnJhbmdlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWJhbmRjb3VudFwiPnt7IGIuY291bnQgfX0ge3sgYi5jb3VudCA9PT0gMSA/ICdzdG9yZScgOiAnc3RvcmVzJyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1iYW5kc2hhcmVcIj57eyBiLnNoYXJlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8YSBjbGFzcz1cImRiLWJhbmRsaW5rXCIgW2NsYXNzLmlzLWFjdGl2ZV09XCJzdG9yZUxpc3RPcGVuICYmIGxpc3RCYW5kS2V5ID09PSBiLmJhbmQua2V5XCIgKGNsaWNrKT1cImFwcGx5QmFuZChiLmJhbmQpXCI+VmlldyBzdG9yZXM8L2E+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItYmFuZGhpbnRcIiAqbmdJZj1cIiFsb2FkaW5nICYmICFzaG93U3RvcmVMaXN0XCI+Q2xpY2sgPGI+VmlldyBzdG9yZXM8L2I+IG9uIGEgYmFuZCB0byBsaXN0IGl0cyBzdG9yZXMuPC9kaXY+XHJcbiAgICAgIDwvc2VjdGlvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gU3RvcmUgbGVkZ2VyOiBvcGVuZWQgZnJvbSBTY29yZSBkaXN0cmlidXRpb24gLT4gVmlldyBzdG9yZXMgKG9yIGEgRmlsdGVycyBzY29yZSByYW5nZSkgLS0+XHJcbiAgICA8c2VjdGlvbiBjbGFzcz1cImRiLWNhcmQgZGItY2FyZC0tdGFibGVcIiBpZD1cImFkLXN0b3JlLWxpc3RcIiAqbmdJZj1cInNob3dTdG9yZUxpc3RcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRiLWxlZGdlci1oZWFkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLWxlZGdlci10ZXh0XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY2FyZC10aXRsZVwiPlN0b3JlIGxpc3Q8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jYXJkLXN1YlwiPlxyXG4gICAgICAgICAgICB7eyBmaWx0ZXJlZFJvd3MubGVuZ3RoIH19IHt7IGZpbHRlcmVkUm93cy5sZW5ndGggPT09IDEgPyAnc3RvcmUnIDogJ3N0b3JlcycgfX0gwrcge3sgcGVyaW9kTGFiZWwgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZ3Jvd1wiPjwvZGl2PlxyXG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImF2Mi1zZWFyY2ggZGItc2VhcmNoXCI+XHJcbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+XHJcbiAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMVwiIGN5PVwiMTFcIiByPVwiN1wiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgICA8bGluZSB4MT1cIjE2LjVcIiB5MT1cIjE2LjVcIiB4Mj1cIjIxXCIgeTI9XCIyMVwiPjwvbGluZT5cclxuICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgPGlucHV0IFsobmdNb2RlbCldPVwic2VhcmNoXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25TZWFyY2goKVwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJTZWFyY2ggc3RvcmUgb3Igb3duZXJcIlxyXG4gICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIiAvPlxyXG4gICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNlZ21lbnRlZFwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZWd0YWJcIiBbY2xhc3Muc2VndGFiLW9uXT1cInN0YXR1cyA9PT0gJ2FsbCdcIiAoY2xpY2spPVwic2V0U3RhdHVzKCdhbGwnKVwiPkFsbDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZWd0YWJcIiBbY2xhc3Muc2VndGFiLW9uXT1cInN0YXR1cyA9PT0gJ2ZhaWwnXCIgKGNsaWNrKT1cInNldFN0YXR1cygnZmFpbCcpXCI+e3sgbGFiZWxzLmZhaWwgfX08L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2VndGFiXCIgW2NsYXNzLnNlZ3RhYi1vbl09XCJzdGF0dXMgPT09ICdwYXNzJ1wiIChjbGljayk9XCJzZXRTdGF0dXMoJ3Bhc3MnKVwiPnt7IGxhYmVscy5wYXNzIH19PC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInNlZ3RhYlwiIFtjbGFzcy5zZWd0YWItb25dPVwic3RhdHVzID09PSAnbmEnXCIgKGNsaWNrKT1cInNldFN0YXR1cygnbmEnKVwiPk5vdCBhdWRpdGVkPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGxpYi1hdWRpdC12Mi1zaGltbWVyICpuZ0lmPVwibG9hZGluZ1wiPjwvbGliLWF1ZGl0LXYyLXNoaW1tZXI+XHJcblxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxvYWRpbmdcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImF2Mi10YWJsZS13cmFwXCI+XHJcbiAgICAgICAgPHRhYmxlIGNsYXNzPVwiZGItdGFibGVcIj5cclxuICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgIDx0aCAqbmdGb3I9XCJsZXQgaCBvZiBoZWFkZXJzXCIgY2xhc3M9XCJpcy1zb3J0YWJsZVwiIFtjbGFzcy5pcy1zb3J0ZWRdPVwic29ydEtleSA9PT0gaC5rZXlcIiAoY2xpY2spPVwic29ydEJ5KGgua2V5KVwiPlxyXG4gICAgICAgICAgICAgICAge3sgaC5sYWJlbCB9fSA8bGliLWF1ZGl0LXYyLXNvcnQtaWNvbiBbYWN0aXZlXT1cInNvcnRLZXkgPT09IGgua2V5XCIgW2Rpcl09XCJzb3J0RGlyXCI+PC9saWItYXVkaXQtdjItc29ydC1pY29uPlxyXG4gICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgPHRoPkFjdGlvbjwvdGg+XHJcbiAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiBwYWdlUm93czsgdHJhY2tCeTogdHJhY2tCeVN0b3JlXCI+XHJcbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiZGItbm93cmFwXCI+e3sgcm93LmRhdGUgfX08L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZGItc3RvcmVpZFwiIHJvdXRlckxpbms9XCIvbWFuYWdlL3RyYXgvYXVkaXQtdjIvZGFzaGJvYXJkL3N0b3JlXCJcclxuICAgICAgICAgICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cImRldGFpbFBhcmFtcyh7IHN0b3JlOiByb3cucmF3Py5zdG9yZUlkIHx8IHJvdy5zdG9yZUlkIH0pXCI+e3sgcm93LnN0b3JlSWQgfX08L2E+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJhdjItZWxsaXBzaXNcIj57eyByb3cuY2lyY2xlIH19PC90ZD5cclxuICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJhdjItZWxsaXBzaXNcIj57eyByb3cuem9uZSB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiYXYyLWVsbGlwc2lzXCI+e3sgcm93LmFvbSB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgPCEtLSBBdWRpdHM6IG9uZSBjZWxsIHBlciBoZWFkZXIgKGhlYWRlcnMgbGlzdHMgQXVkaXRzKSwgc28gU2NvcmUgLyBTdGF0dXMgLyBBY3Rpb24gc3RheSB1bmRlciB0aGVpciBvd24gaGVhZGluZ3MuIC0tPlxyXG4gICAgICAgICAgICAgIDx0ZCBbY2xhc3MuYXYyLWZhaW50XT1cIiFyb3cuYXVkaXRzXCI+e3sgcm93LmF1ZGl0cyB8fCAn4oCUJyB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1waWxsXCIgW3N0eWxlLmJhY2tncm91bmRdPVwiYmFuZEZvcihyb3cpLmJnXCIgW3N0eWxlLmNvbG9yXT1cImJhbmRGb3Iocm93KS5mZ1wiPlxyXG4gICAgICAgICAgICAgICAgICB7eyByb3cuc2NvcmUgPT09IG51bGwgPyAn4oCUJyA6IHJvdy5zY29yZSArICclJyB9fVxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1waWxsXCIgW3N0eWxlLmJhY2tncm91bmRdPVwiYmFuZEZvcihyb3cpLmJnXCIgW3N0eWxlLmNvbG9yXT1cImJhbmRGb3Iocm93KS5mZ1wiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBzdGF0dXNMYWJlbChyb3cpIH19XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItYWN0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgICA8IS0tIFZpZXcgb3BlbnMgdGhlIEdhbGxlcnkgb24gdGhlIHN0b3JlJ3MgbGF0ZXN0IHN1Ym1pdHRlZCBhdWRpdCBpbiB0aGUgcGVyaW9kIChRQSAxMSBPY3QpOyBhIHN0b3JlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBubyBzdWJtaXNzaW9uIHRoZXJlIG9wZW5zIGl0cyBhdWRpdCBkZXRhaWwgaW5zdGVhZCAoc2FtZSBhcyB0aGUgc3RvcmUgbGluaykuIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8IS0tIFNldmVyYWwgYXVkaXRzIHN1Ym1pdHRlZCBieSB0aGlzIHN0b3JlOiBWaWV3IGxpc3RzIHRoZW07IGVhY2ggb3BlbnMgdGhlIEdhbGxlcnkgb24gdGhhdCBhdWRpdC4gLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi12aWV3bWVudS13cmFwXCIgKm5nSWY9XCJzdG9yZUF1ZGl0cyhyb3cpLmxlbmd0aCA+IDFcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImRiLXZpZXdidG5cIiBbY2xhc3MuaXMtb3Blbl09XCJpc1ZpZXdNZW51T3Blbihyb3cpXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiUGljayB0aGUgYXVkaXQgdG8gdmlldyBpbiB0aGUgR2FsbGVyeVwiIChjbGljayk9XCJ0b2dnbGVWaWV3TWVudShyb3csICRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEuNSAxMlM1IDUuNSAxMiA1LjUgMjIuNSAxMiAyMi41IDEyIDE5IDE4LjUgMTIgMTguNSAxLjUgMTIgMS41IDEyelwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIzXCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgIFZpZXdcclxuICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMVwiIGhlaWdodD1cIjExXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMi40XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjYgOSAxMiAxNSAxOCA5XCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItdmlld21lbnVcIiAqbmdJZj1cImlzVmlld01lbnVPcGVuKHJvdylcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS50b3AucHhdPVwidmlld01lbnVQb3MudG9wXCIgW3N0eWxlLnJpZ2h0LnB4XT1cInZpZXdNZW51UG9zLnJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItdmlld21lbnUtdGl0bGVcIj57eyBzdG9yZUF1ZGl0cyhyb3cpLmxlbmd0aCB9fSBhdWRpdHMgc3VibWl0dGVkPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRiLXZpZXdtZW51LWl0ZW1cIiAqbmdGb3I9XCJsZXQgYSBvZiBzdG9yZUF1ZGl0cyhyb3cpXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvdHJheC9hdWRpdC12Mi9nYWxsZXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cImRldGFpbFBhcmFtcyh7IGF1ZGl0OiBhLmF1ZGl0SWQsIHN0b3JlOiByb3cucmF3Py5zdG9yZUlkIHx8IHJvdy5zdG9yZUlkIH0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInZpZXdNZW51U3RvcmUgPSAnJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLXZpZXdtZW51LW5hbWUgYXYyLWVsbGlwc2lzXCIgW3RpdGxlXT1cImEubmFtZVwiPnt7IGEubmFtZSB8fCAn4oCUJyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi12aWV3bWVudS1tZXRhXCI+e3sgYS5zdWJtaXR0ZWQgfX0ge3sgYS5zdWJtaXR0ZWQgPT09IDEgPyAnc3VibWlzc2lvbicgOiAnc3VibWlzc2lvbnMnIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLXZpZXdtZW51LXNjb3JlXCI+e3sgYS5zY29yZSA9PT0gbnVsbCA/ICfigJQnIDogYS5zY29yZSArICclJyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZGItdmlld2J0blwiICpuZ0lmPVwic3RvcmVBdWRpdHMocm93KS5sZW5ndGggPD0gMSAmJiBnYWxsZXJ5QXVkaXRJZChyb3cpIGFzIGF1ZGl0SWRcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS90cmF4L2F1ZGl0LXYyL2dhbGxlcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJkZXRhaWxQYXJhbXMoeyBhdWRpdDogYXVkaXRJZCwgc3RvcmU6IHJvdy5yYXc/LnN0b3JlSWQgfHwgcm93LnN0b3JlSWQgfSlcIiB0aXRsZT1cIlZpZXcgdGhpcyBzdG9yZSdzIHN1Ym1pc3Npb25zIGluIHRoZSBHYWxsZXJ5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEzXCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xLjUgMTJTNSA1LjUgMTIgNS41IDIyLjUgMTIgMjIuNSAxMiAxOSAxOC41IDEyIDE4LjUgMS41IDEyIDEuNSAxMnpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjNcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICBWaWV3XHJcbiAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBOb3QgYXVkaXRlZCAobm8gc3VibWlzc2lvbiBpbiB0aGUgcGVyaW9kKTogbm90aGluZyB0byB2aWV3LCBzbyBWaWV3IGlzIGRpc2FibGVkLiAtLT5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJkYi12aWV3YnRuXCIgKm5nSWY9XCIhZ2FsbGVyeUF1ZGl0SWQocm93KVwiIGRpc2FibGVkXHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJObyBhdWRpdCBzdWJtaXR0ZWQgZm9yIHRoaXMgc3RvcmUgaW4gdGhpcyBwZXJpb2RcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEuNSAxMlM1IDUuNSAxMiA1LjUgMjIuNSAxMiAyMi41IDEyIDE5IDE4LjUgMTIgMTguNSAxLjUgMTIgMS41IDEyelwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiM1wiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgIFZpZXdcclxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gVGhlIEdhbGxlcnkncyBFeHBvcnQgYXMgUERGIGZvciB0aGlzIHN0b3JlJ3MgYXVkaXQgaW4gdGhlIHBlcmlvZCAocXVldWVkLCB0aGVuIHVuZGVyIE5vdGlmaWNhdGlvbnMgPiBEb3dubG9hZHMpLiAtLT5cclxuICAgICAgICAgICAgICAgICAgPCEtLSA8YSBjbGFzcz1cImRiLXBkZmJ0blwiIHJvbGU9XCJidXR0b25cIiBbY2xhc3MuaXMtZGlzYWJsZWRdPVwiIWdhbGxlcnlBdWRpdElkKHJvdylcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiIWdhbGxlcnlBdWRpdElkKHJvdylcIiAoY2xpY2spPVwiZG93bmxvYWRQZGYocm93KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImdhbGxlcnlBdWRpdElkKHJvdykgPyAnRXhwb3J0IHRoaXMgc3RvcmVcXCdzIHN1Ym1pc3Npb25zIGFzIFBERiAoc2FtZSBhcyB0aGUgR2FsbGVyeVxcJ3MgRXhwb3J0IGFzIFBERiknIDogJ05vIHN1Ym1pdHRlZCBhdWRpdCBmb3IgdGhpcyBzdG9yZSBpbiB0aGlzIHBlcmlvZCdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyIDR2MTJcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8cG9seWxpbmUgcG9pbnRzPVwiNyAxMSAxMiAxNiAxNyAxMVwiPjwvcG9seWxpbmU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTQgMjBoMTZcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgIDwvYT4gLS0+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+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSA9PT09PT09PT09PT0gUEVSRk9STUFOQ0UgPT09PT09PT09PT09IC0tPlxyXG4gIDwhLS0gVGFzayBtb2RlIGFsd2F5cyBzaG93cyBpdHMgVGFzayBJbmZvIHRhYmxlOyB0aGUgcmVzdCBvZiBQZXJmb3JtYW5jZSBmb2xsb3dzIHNob3dQZXJmb3JtYW5jZS4gLS0+XHJcbiAgPHNlY3Rpb24gY2xhc3M9XCJkYi1wZXJmXCIgKm5nSWY9XCJzaG93UGVyZm9ybWFuY2UgfHwgaXNUYXNrTW9kdWxlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZGItcGVyZnRhYnNcIiAqbmdJZj1cInNob3dQZXJmb3JtYW5jZVwiPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImRiLXBlcmZ0YWJcIiAqbmdGb3I9XCJsZXQgdCBvZiBwZXJmVGFic1wiIFtjbGFzcy5pcy1vbl09XCJwZXJmVGFiID09PSB0XCJcclxuICAgICAgICAoY2xpY2spPVwic2V0UGVyZlRhYih0KVwiPnt7IHBlcmZUYWJEaXNwbGF5KHQpIH19PC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZGItcGVyZi1oZWFkXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkYi1wZXJmLXRleHRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItcGVyZi10aXRsZVwiPlxyXG4gICAgICAgICAge3sgcGVyZkluZm9UaXRsZSB9fVxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi10b3RhbFwiPlxyXG4gICAgICAgICAgICB7eyBwZXJmVGFiID09PSAnQXVkaXQnID8gKGlzVGFza01vZHVsZSA/IGZpbHRlcmVkVGFza1BlcmYubGVuZ3RoIDogZmlsdGVyZWRBdWRpdFBlcmYubGVuZ3RoKSA6IChwZXJmVGFiID09PSAnU3RvcmUnID8gZmlsdGVyZWRTdG9yZVBlcmYubGVuZ3RoIDogZmlsdGVyZWRVc2VyUGVyZi5sZW5ndGgpIH19IFRvdGFsXHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLWNhcmQtc3ViXCI+e3sgcGVyZlBlcmlvZCB9fTwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImF2Mi1ncm93XCI+PC9kaXY+XHJcbiAgICAgIDxsYWJlbCBjbGFzcz1cImF2Mi1zZWFyY2ggZGItcGVyZi1zZWFyY2hcIj5cclxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPlxyXG4gICAgICAgICAgPGNpcmNsZSBjeD1cIjExXCIgY3k9XCIxMVwiIHI9XCI3XCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICA8bGluZSB4MT1cIjE2LjVcIiB5MT1cIjE2LjVcIiB4Mj1cIjIxXCIgeTI9XCIyMVwiPjwvbGluZT5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbcGxhY2Vob2xkZXJdPVwicGVyZlNlYXJjaFBsYWNlaG9sZGVyXCIgWyhuZ01vZGVsKV09XCJwZXJmU2VhcmNoXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25QZXJmU2VhcmNoKClcIj5cclxuICAgICAgPC9sYWJlbD5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGF2Mi1idG4tLWdob3N0XCIgW2Rpc2FibGVkXT1cInBlcmZMb2FkaW5nIHx8ICFwZXJmUm93Q291bnRcIlxyXG4gICAgICAgIHRpdGxlPVwiRG93bmxvYWQgdGhpcyB0YWJsZSBhcyBhbiBFeGNlbCBmaWxlXCIgKGNsaWNrKT1cImV4cG9ydFBlcmZvcm1hbmNlKClcIj5cclxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuOFwiXHJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cclxuICAgICAgICAgIDxwYXRoIGQ9XCJNMTIgMTZWNFwiPjwvcGF0aD5cclxuICAgICAgICAgIDxwb2x5bGluZSBwb2ludHM9XCI3IDkgMTIgNCAxNyA5XCI+PC9wb2x5bGluZT5cclxuICAgICAgICAgIDxwYXRoIGQ9XCJNNCAxNnY0aDE2di00XCI+PC9wYXRoPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIEV4cG9ydFxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGRiLWNyZWF0ZVwiICpuZ0lmPVwicGVyZlRhYiA9PT0gJ0F1ZGl0JyAmJiAhaXNUYXNrTW9kdWxlICYmIGFjY2Vzcy5jYW5BZGRcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS90cmF4L2F1ZGl0LXYyL21hbmFnZVwiPlxyXG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMi4yXCJcclxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48cGF0aCBkPVwiTTEyIDV2MTRNNSAxMmgxNFwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICB7eyBwZXJmQ3JlYXRlTGFiZWwgfX1cclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwhLS0gVGFzayBtb2RlOiBDcmVhdGUgVGFzayBvcGVucyBNYW5hZ2UgLT4gVGFzayAodGFzayBhZGQgcGVybWlzc2lvbikuIC0tPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gZGItY3JlYXRlXCIgKm5nSWY9XCJwZXJmVGFiID09PSAnQXVkaXQnICYmIGlzVGFza01vZHVsZSAmJiBhY2Nlc3MuY2FuQWRkVGFza1wiXHJcbiAgICAgICAgcm91dGVyTGluaz1cIi9tYW5hZ2UvdHJheC9hdWRpdC12Mi9tYW5hZ2VcIiBbcXVlcnlQYXJhbXNdPVwieyBtb2R1bGU6ICd0YXNrJyB9XCI+XHJcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyLjJcIlxyXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjxwYXRoIGQ9XCJNMTIgNXYxNE01IDEyaDE0XCI+PC9wYXRoPjwvc3ZnPlxyXG4gICAgICAgIENyZWF0ZSBUYXNrXHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGxpYi1hdWRpdC12Mi1zaGltbWVyICpuZ0lmPVwicGVyZkxvYWRpbmdcIj48L2xpYi1hdWRpdC12Mi1zaGltbWVyPlxyXG5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhcGVyZkxvYWRpbmdcIj5cclxuICAgIDwhLS0gQXVkaXQgUGVyZm9ybWFuY2UgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXYyLXRhYmxlLXdyYXBcIiAqbmdJZj1cInBlcmZUYWIgPT09ICdBdWRpdCcgJiYgIWlzVGFza01vZHVsZVwiPlxyXG4gICAgICA8dGFibGUgY2xhc3M9XCJkYi1wZXJmdGFibGUgZGItcGVyZnRhYmxlLS1hdWRpdFwiPlxyXG4gICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBjIG9mIGF1ZGl0UGVyZkNvbHNcIiBjbGFzcz1cImlzLXNvcnRhYmxlXCIgW2NsYXNzLmlzLXNvcnRlZF09XCJwZXJmU29ydEtleSA9PT0gYy5rZXlcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJzb3J0UGVyZihjLmtleSlcIj57eyBjLmxhYmVsIH19IDxsaWItYXVkaXQtdjItc29ydC1pY29uIFthY3RpdmVdPVwicGVyZlNvcnRLZXkgPT09IGMua2V5XCIgW2Rpcl09XCJwZXJmU29ydERpclwiPjwvbGliLWF1ZGl0LXYyLXNvcnQtaWNvbj48L3RoPlxyXG4gICAgICAgICAgICA8dGg+QWN0aW9uPC90aD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90aGVhZD5cclxuICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiBwZXJmUGFnZU9mKGZpbHRlcmVkQXVkaXRQZXJmKTsgdHJhY2tCeTogdHJhY2tCeVBlcmZBdWRpdFwiPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLW5hbWVcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItYXZhdGFyXCI+e3sgcm93LmluaXRpYWxzIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkYi1saW5rXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvdHJheC9hdWRpdC12Mi9kYXNoYm9hcmQvYXVkaXRcIlxyXG4gICAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiZGV0YWlsUGFyYW1zKHsgY2hlY2tsaXN0SWQ6IHJvdy5yYXc/LnNvdXJjZUNoZWNrTGlzdF9pZCB8fCByb3cucmF3Py5faWQgfSlcIj57eyByb3cubmFtZSB9fTwvYT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkPnt7IHJvdy5hc3NpZ25lZCB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8IS0tIE9wZW5zIHRoZSBhdWRpdCdzIGRldGFpbCBwYWdlIChhcyB0aGUgZXllIGRvZXMpIG9uIGl0cyBzdWJtaXR0ZWQgdmlzaXRzLCBhcyB0aGUgdjEgQ2hlY2tsaXN0IGRhc2hib2FyZCBkaWQuIC0tPlxyXG4gICAgICAgICAgICAgIDxhICpuZ0lmPVwicm93LnN1Ym1pdHRlZFwiIGNsYXNzPVwiZGItdWxpbmtcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS90cmF4L2F1ZGl0LXYyL2Rhc2hib2FyZC9hdWRpdFwiXHJcbiAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiZGV0YWlsUGFyYW1zKHsgY2hlY2tsaXN0SWQ6IHJvdy5yYXc/LnNvdXJjZUNoZWNrTGlzdF9pZCB8fCByb3cucmF3Py5faWQsIHN0YXR1czogJ3N1Ym1pdCcgfSlcIlxyXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJWaWV3IHRoZSBzdWJtaXR0ZWQgdmlzaXRzXCI+e3sgcm93LnN1Ym1pdHRlZCB9fTwvYT5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFyb3cuc3VibWl0dGVkXCI+MDwvc3Bhbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPCEtLSBTdG9yZSBkaXNwdXRlcyAocXVlc3Rpb25zKSBpbiB0aGUgcGVyaW9kLCBhcyBhIHBsYWluIGNvdW50IChRQSAxMCBPY3Q6IG5vIGxpbmspLiAtLT5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicm93LmRpc3B1dGVzID09PSBudWxsXCIgY2xhc3M9XCJhdjItZmFpbnRcIj7igJQ8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3cuZGlzcHV0ZXMgIT09IG51bGxcIj57eyByb3cuZGlzcHV0ZXMgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyByb3cucGFzc01hcmsgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXNjb3JlXCIgW2NsYXNzLmlzLWVtcHR5XT1cInJvdy5zY29yZSA9PT0gJ+KAlCdcIlxyXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cInJvdy5zY29yZSA9PT0gJ+KAlCcgPyAnQ29tcGxpYW5jZSBzY29yZSBpcyBvZmYgZm9yIHRoaXMgYXVkaXQnIDogJydcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItdHJhY2sgZGItdHJhY2stLTZcIj48c3BhbiBbc3R5bGUud2lkdGhdPVwiYmFyV2lkdGgocm93LnNjb3JlUGN0KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwicm93LnJlc3VsdCA9PT0gJ1Bhc3MnID8gJyMxMkI3NkEnIDogJyNGMDQ0MzgnXCI+PC9zcGFuPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItc2NvcmV0ZXh0XCI+e3sgcm93LnNjb3JlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3cucmVzdWx0ICE9PSAn4oCUJ1wiIGNsYXNzPVwiZGItcGlsbCBkYi1waWxsLS1zdHJvbmdcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJyb3cucmVzdWx0ID09PSAnUGFzcycgPyAnI0VDRkRGMycgOiAnI0ZFRjNGMidcIlxyXG4gICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cInJvdy5yZXN1bHQgPT09ICdQYXNzJyA/ICcjMDI3QTQ4JyA6ICcjQjQyMzE4J1wiPnt7IHJlc3VsdFRleHQocm93LnJlc3VsdCkgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3cucmVzdWx0ID09PSAn4oCUJ1wiIGNsYXNzPVwiYXYyLWZhaW50XCIgdGl0bGU9XCJDb21wbGlhbmNlIHNjb3JlIGlzIG9mZiBmb3IgdGhpcyBhdWRpdFwiPuKAlDwvc3Bhbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxhIGNsYXNzPVwiZGItZXllXCIgdGl0bGU9XCJWaWV3IGF1ZGl0XCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvdHJheC9hdWRpdC12Mi9kYXNoYm9hcmQvYXVkaXRcIlxyXG4gICAgICAgICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cImRldGFpbFBhcmFtcyh7IGNoZWNrbGlzdElkOiByb3cucmF3Py5zb3VyY2VDaGVja0xpc3RfaWQgfHwgcm93LnJhdz8uX2lkIH0pXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTdcIiBoZWlnaHQ9XCIxN1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuOVwiXHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEuNSAxMlM1IDUuNSAxMiA1LjUgMjIuNSAxMiAyMi41IDEyIDE5IDE4LjUgMTIgMTguNSAxLjUgMTIgMS41IDEyelwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIzXCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGJvZHk+XHJcbiAgICAgIDwvdGFibGU+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCIhZmlsdGVyZWRBdWRpdFBlcmYubGVuZ3RoXCIgY2xhc3M9XCJhdjItZW1wdHlcIj5cclxuICAgICAgICA8aW1nIGNsYXNzPVwiYXYyLWVtcHR5LWltZ1wiIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YTEuc3ZnXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS10ZXh0XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXRpdGxlXCI+Tm8gZGF0YSBmb3VuZDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS1zdWJcIj57eyBwZXJmU2VhcmNoLnRyaW0oKSA/ICdObyBhdWRpdCBtYXRjaGVzIHRoaXMgc2VhcmNoLicgOiAnVGhlcmUgaXMgbm8gcmVzdWx0IGZvciBBdWRpdCBQZXJmb3JtYW5jZSBpbiB0aGlzIHBlcmlvZC4nIH19PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBUYXNrIFBlcmZvcm1hbmNlIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImF2Mi10YWJsZS13cmFwXCIgKm5nSWY9XCJwZXJmVGFiID09PSAnQXVkaXQnICYmIGlzVGFza01vZHVsZVwiPlxyXG4gICAgICA8dGFibGUgY2xhc3M9XCJkYi1wZXJmdGFibGUgZGItcGVyZnRhYmxlLS10YXNrIHRleHQtbm93cmFwXCI+XHJcbiAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IGMgb2YgdGFza1BlcmZDb2xzXCIgY2xhc3M9XCJpcy1zb3J0YWJsZVwiIFtjbGFzcy5pcy1zb3J0ZWRdPVwicGVyZlNvcnRLZXkgPT09IGMua2V5XCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwic29ydFBlcmYoYy5rZXkpXCI+e3sgYy5sYWJlbCB9fSA8bGliLWF1ZGl0LXYyLXNvcnQtaWNvbiBbYWN0aXZlXT1cInBlcmZTb3J0S2V5ID09PSBjLmtleVwiIFtkaXJdPVwicGVyZlNvcnREaXJcIj48L2xpYi1hdWRpdC12Mi1zb3J0LWljb24+PC90aD5cclxuICAgICAgICAgICAgPHRoPkFjdGlvbjwvdGg+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByb3cgb2YgcGVyZlBhZ2VPZihmaWx0ZXJlZFRhc2tQZXJmKTsgdHJhY2tCeTogdHJhY2tCeVBlcmZUYXNrXCI+XHJcbiAgICAgICAgICAgIDwhLS0gVGFzayBJbmZvOiB0aGUgc2FtZSBjb2x1bW5zIGFzIENoZWNrbGlzdCA+IERhc2hib2FyZCA+IFRhc2sgKFwiLS1cIiB3aGVuIGVtcHR5KS4gLS0+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8YSBjbGFzcz1cImRiLWxpbmtcIiBbdGl0bGVdPVwicm93LnJhdz8uYXVkaXROYW1lID8gJ1JhaXNlZCBmcm9tICcgKyByb3cucmF3LmF1ZGl0TmFtZSA6ICcnXCI+e3sgcm93Lm5hbWUgfX08L2E+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItbmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1hdmF0YXJcIj57eyByb3cuY3JlYXRlZEJ5SW5pdGlhbHMgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBbdGl0bGVdPVwicm93LmNyZWF0ZWRCeVwiPnt7IHJvdy5jcmVhdGVkQnkgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImRiLW5vd3JhcFwiPnt7IHJvdy5jcmVhdGVkT24gfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgcm93LnByaW9yaXR5IH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPnt7IHJvdy5hc3NpZ25lZCB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8IS0tIE9wZW5zIHRoZSBHYWxsZXJ5IChUeXBlIFRhc2spIG9uIHRoaXMgdGFzaydzIHN1Ym1pc3Npb25zIGluIHRoZSBkYXNoYm9hcmQgcGVyaW9kLiAtLT5cclxuICAgICAgICAgICAgICA8YSAqbmdJZj1cInJvdy5zdWJtaXR0ZWQgJiYgcm93LnJhdz8udGFza0lkXCIgY2xhc3M9XCJkYi11bGlua1wiIHJvdXRlckxpbms9XCIvbWFuYWdlL3RyYXgvYXVkaXQtdjIvZ2FsbGVyeVwiXHJcbiAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwidGFza1N1Ym1pdHRlZFBhcmFtcyhyb3cpXCIgdGl0bGU9XCJWaWV3IHRoZSBzdWJtaXR0ZWQgdGFza3MgaW4gdGhlIEdhbGxlcnlcIj57eyByb3cuc3VibWl0dGVkIH19PC9hPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIXJvdy5zdWJtaXR0ZWQgfHwgIXJvdy5yYXc/LnRhc2tJZFwiPi0tPC9zcGFuPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8IS0tIFRoZSBHYWxsZXJ5IGhhcyBubyByZWRvIGZpbHRlciB0byBvcGVuLCBzbyBSZWRvIGlzIHBsYWluIHRleHQuIC0tPlxyXG4gICAgICAgICAgICA8dGQ+e3sgcm93LnJlZG8gfHwgJy0tJyB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImRiLW5vd3JhcFwiPnt7IHJvdy5kdWVPbiB9fTwvdGQ+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+QnkgZGF0ZTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZS1vcHRpb24taGVscFwiPnt7IHNob3dEcmF3ZXJEYXRlUmFuZ2UgPyAnUGljayBhIGN1c3RvbSBzdGFydCBhbmQgZW5kIGRhdGUuJyA6ICdVc2UgdGhlIGhlYWRlciBkYXRlIHJhbmdlLicgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lLWxpc3RcIiAqbmdJZj1cImRyLmdyYWluID09PSAncXVhcnRlcidcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJvcHRpb25yb3dcIiAqbmdGb3I9XCJsZXQgcSBvZiBkci5xdWFydGVyc1wiIFtjbGFzcy5vcHRpb24tc2VsZWN0ZWRdPVwiZHIucXVhcnRlciA9PT0gcVwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImRyLnNlbGVjdFF1YXJ0ZXIocSlcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGlvbm1hcmtcIiBbY2xhc3MubWFyay1vbl09XCJkci5xdWFydGVyID09PSBxXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiZHIucXVhcnRlciA9PT0gcVwiIHdpZHRoPVwiMTFcIiBoZWlnaHQ9XCIxMVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiMjAgNiA5IDE3IDQgMTJcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGxhYmVsXCI+e3sgcSB9fSDCtyB7eyBxdWFydGVyTW9udGhzKHEpIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lLWZpZWxkc1wiICpuZ0lmPVwic2hvd0RyYXdlckRhdGVSYW5nZSAmJiBkci5ncmFpbiA9PT0gJ2RhdGUnXCI+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+e3sgZHIubGFiZWxzLmZhaWwgfX08L3NwYW4+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3B0aW9ucm93XCIgW2NsYXNzLm9wdGlvbi1zZWxlY3RlZF09XCJkci5zdGF0dXMgPT09ICdwYXNzJ1wiIChjbGljayk9XCJkci5zZXRTdGF0dXMoJ3Bhc3MnKVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGlvbm1hcmtcIiBbY2xhc3MubWFyay1vbl09XCJkci5zdGF0dXMgPT09ICdwYXNzJ1wiPlxyXG4gICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJkci5zdGF0dXMgPT09ICdwYXNzJ1wiIHdpZHRoPVwiMTFcIiBoZWlnaHQ9XCIxMVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGxhYmVsXCI+e3sgZHIubGFiZWxzLnBhc3MgfX08L3NwYW4+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3B0aW9ucm93XCIgW2NsYXNzLm9wdGlvbi1zZWxlY3RlZF09XCJkci5zdGF0dXMgPT09ICduYSdcIiAoY2xpY2spPVwiZHIuc2V0U3RhdHVzKCduYScpXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0aW9ubWFya1wiIFtjbGFzcy5tYXJrLW9uXT1cImRyLnN0YXR1cyA9PT0gJ25hJ1wiPlxyXG4gICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJkci5zdGF0dXMgPT09ICduYSdcIiB3aWR0aD1cIjExXCIgaGVpZ2h0PVwiMTFcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRsYWJlbFwiPk5vdCBhdWRpdGVkPC9zcGFuPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImRyYXdlci1mb290XCI+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1naG9zdFwiIChjbGljayk9XCJkci5jbGVhckFsbCgpXCI+Q2xlYXIgYWxsPC9idXR0b24+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJhdjItZ3Jvd1wiPjwvZGl2PlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tZ2hvc3RcIiAoY2xpY2spPVwiY2FuY2VsRmlsdGVycygpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1wcmltYXJ5IGF2Mi1idG4tLXdpZGVcIiAoY2xpY2spPVwiYXBwbHlGaWx0ZXJzKClcIj5BcHBseSBmaWx0ZXJzPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbjwvZGl2PlxyXG4iXX0=
1605
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtdjItZGFzaGJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2UtdHJheC9zcmMvbGliL2NvbXBvbmVudHMvYXVkaXQtdjIvZGFzaGJvYXJkL2F1ZGl0LXYyLWRhc2hib2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYXgvc3JjL2xpYi9jb21wb25lbnRzL2F1ZGl0LXYyL2Rhc2hib2FyZC9hdWRpdC12Mi1kYXNoYm9hcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixTQUFTLEVBQUUsWUFBWSxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUM5RixPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHNUMsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBRTFCLE9BQU8sRUFBZSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5RCxPQUFPLEVBQWUsb0JBQW9CLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDeEYsT0FBTyxFQUFFLGFBQWEsRUFBNEIsZUFBZSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7Ozs7OztBQTRJL0gsTUFBTSxnQkFBZ0IsR0FBYztJQUNsQyxXQUFXLEVBQUUsR0FBRztJQUNoQixhQUFhLEVBQUUsR0FBRztJQUNsQixZQUFZLEVBQUUsR0FBRztJQUNqQixTQUFTLEVBQUUsR0FBRztJQUNkLFVBQVUsRUFBRSxHQUFHO0lBQ2YsU0FBUyxFQUFFLEdBQUc7SUFDZCxlQUFlLEVB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LENBQUMsQ0FBQyxDQUFDLFlBQVksSUFBSSxJQUFJO1FBQ3RILFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDaEgsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLElBQUk7S0FDaEQsQ0FBQztJQUNlLGNBQWMsR0FBbUQ7UUFDaEYsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSztRQUMvRyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUM7S0FD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LENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMxRix1RkFBdUY7Z0JBQ3ZGLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNsSCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztxQkFDcEYsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNsRSxPQUFPO29CQUNMLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxF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QUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDbkksQ0FBQztJQUVELElBQUksaUJBQWlCO1FBQ25CLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0MsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxPQUFPLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDdkssQ0FBQztJQUVELElBQUksZ0JBQWdCO1FBQ2xCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0MsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDbEos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QUcsRUFBRSxPQUFPLElBQUksNEJBQTRCLENBQUMsQ0FBQztpQkFDeEU7WUFDSCxDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsQ0FBTSxFQUFFLEVBQUU7Z0JBQ2hCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMzQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssSUFBSSw0QkFBNEIsQ0FBQyxDQUFDO1lBQ2pHLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO3dHQW5oRFUseUJBQXlCOzRGQUF6Qix5QkFBeUIsb01DMVB0Qyw0aHVEQW8zQkE7OzRGRDFuQmEseUJBQXlCO2tCQUxyQyxTQUFTOytCQUNFLHdCQUF3Qjs0S0FzK0NsQyxhQUFhO3NCQUhaLFlBQVk7dUJBQUMsZ0JBQWdCOztzQkFDN0IsWUFBWTt1QkFBQyxlQUFlOztzQkFDNUIsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgSG9zdExpc3RlbmVyLCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCBkZWJvdW5jZVRpbWUsIGZvcmtKb2luLCBvZiwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGNhdGNoRXJyb3IgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1nbG9iYWwnO1xyXG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcclxuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJztcclxuaW1wb3J0IHsgVHJheFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy90cmF4LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBdWRpdEFjY2VzcywgYXVkaXRBY2Nlc3MgfSBmcm9tICcuLi9hdWRpdC12Mi1hY2Nlc3MnO1xyXG5pbXBvcnQgeyBBdWRpdExhYmVscywgREVGQVVMVF9BVURJVF9MQUJFTFMsIGxvYWRBdWRpdExhYmVscyB9IGZyb20gJy4uL2F1ZGl0LXYyLWxhYmVscyc7XHJcbmltcG9ydCB7IFBJQ0tFUl9MT0NBTEUsIFBpY2tlZERhdGVzLCBQaWNrZXJSYW5nZSwgZnJvbVBpY2tlclJhbmdlLCBwaWNrZXJSYW5nZXMsIHRvUGlja2VyUmFuZ2UgfSBmcm9tICcuLi9hdWRpdC12Mi1kYXRlcGlja2VyJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXVkaXRCYW5kIHtcclxuICBrZXk6IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIHJhbmdlOiBzdHJpbmc7XHJcbiAgbG86IG51bWJlcjtcclxuICBoaTogbnVtYmVyO1xyXG4gIHNvZnQ6IHN0cmluZztcclxuICBiZzogc3RyaW5nO1xyXG4gIGZnOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXVkaXRSb3cge1xyXG4gIGRhdGU6IHN0cmluZztcclxuICBzdG9yZUlkOiBzdHJpbmc7XHJcbiAgY2lyY2xlOiBzdHJpbmc7XHJcbiAgem9uZTogc3RyaW5nO1xyXG4gIGFvbTogc3RyaW5nO1xyXG4gIC8qKiBBdWRpdHMgdGhlIHN0b3JlIHN1Ym1pdHRlZCBpbiB0aGUgcGVyaW9kICh0aGV5IGFkZCB1cCB0byB0aGUgXCJBdWRpdHMgY29tcGxldGVkXCIgY2FyZCkuICovXHJcbiAgYXVkaXRzOiBudW1iZXI7XHJcbiAgc2NvcmU6IG51bWJlciB8IG51bGw7XHJcbiAgLyoqICd1bnNjb3JlZCcgPSBhdWRpdGVkLCBidXQgbm8gcXVlc3Rpb24gb2YgaXRzIGF1ZGl0cyBoYXMgY29tcGxpYW5jZSBzY29yaW5nIG9uIChubyBzY29yZSB0byBzaG93KS4gKi9cclxuICBzdGF0dXM6IFN0b3JlU3RhdHVzO1xyXG4gIHJhdz86IGFueTtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgU3RvcmVTdGF0dXMgPSAncGFzcycgfCAnZmFpbCcgfCAnbmEnIHwgJ3Vuc2NvcmVkJztcclxuZXhwb3J0IHR5cGUgU3RhdHVzRmlsdGVyID0gJ2FsbCcgfCBTdG9yZVN0YXR1cztcclxuXHJcbi8qKiBBIHNvcnRhYmxlIGNvbHVtbiBvZiBhIFBlcmZvcm1hbmNlIHRhYmxlLiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFBlcmZDb2x1bW4ge1xyXG4gIGtleTogc3RyaW5nO1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbn1cclxuXHJcbnR5cGUgU29ydFZhbHVlID0gc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZDtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXVkaXRLcGkge1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgdmFsdWU6IHN0cmluZztcclxuICBub3RlOiBzdHJpbmc7XHJcbiAgbm90ZUNvbG9yOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRmlsdGVyQ2F0IHtcclxuICBrZXk6IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIHZhbHVlOiBzdHJpbmc7XHJcbiAgdGl0bGU6IHN0cmluZztcclxuICBzdWI6IHN0cmluZztcclxuICBkaXJ0eTogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBBdWRpdFBlcmZSb3cge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBpbml0aWFsczogc3RyaW5nO1xyXG4gIHNjaGVkdWxlZDogc3RyaW5nO1xyXG4gIGFzc2lnbmVkOiBudW1iZXI7XHJcbiAgc3VibWl0dGVkOiBudW1iZXI7XHJcbiAgZGlzcHV0ZXM6IG51bWJlciB8IG51bGw7XHJcbiAgcGFzc01hcms6IHN0cmluZztcclxuICBzY29yZTogc3RyaW5nO1xyXG4gIHNjb3JlUGN0OiBudW1iZXI7XHJcbiAgLyoqICfigJQnIHdoZW4gdGhlIGF1ZGl0IGhhcyBubyBjb21wbGlhbmNlIHNjb3JpbmcgKG5vIHNjb3JlLCBzbyBubyByZXN1bHQpLiAqL1xyXG4gIHJlc3VsdDogJ1Bhc3MnIHwgJ0ZhaWwnIHwgJ+KAlCc7XHJcbiAgcmF3PzogYW55O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JlUGVyZlJvdyB7XHJcbiAgc3RvcmVJZDogc3RyaW5nO1xyXG4gIHN0b3JlOiBzdHJpbmc7XHJcbiAgc3BvYzogc3RyaW5nO1xyXG4gIGFzc2lnbmVkOiBudW1iZXI7XHJcbiAgZmxhZ3M6IG51bWJlciB8IG51bGw7XHJcbiAgY29tcGxldGlvbjogc3RyaW5nO1xyXG4gIGNvbXBsaWFuY2U6IHN0cmluZztcclxuICBwZXJmOiBzdHJpbmc7XHJcbiAgcmF3PzogYW55O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJQZXJmUm93IHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgZW1haWw6IHN0cmluZztcclxuICBhc3NpZ25lZDogbnVtYmVyO1xyXG4gIGZsYWdzOiBudW1iZXI7XHJcbiAgcmVkbzogbnVtYmVyO1xyXG4gIGNvbXBsZXRpb246IHN0cmluZztcclxuICBjb21wbGlhbmNlOiBzdHJpbmc7XHJcbiAgcGVyZjogc3RyaW5nO1xyXG4gIHJhdz86IGFueTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUYXNrUGVyZlJvdyB7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIGluaXRpYWxzOiBzdHJpbmc7XHJcbiAgLyoqIFRhc2sgSW5mbyAoYXMgQ2hlY2tsaXN0ID4gRGFzaGJvYXJkID4gVGFzayk6IHdobyBjcmVhdGVkIHRoZSB0YXNrLCB3aGVuLCBpdHMgcHJpb3JpdHkgYW5kIGR1ZSBkYXRlLiAqL1xyXG4gIGNyZWF0ZWRCeTogc3RyaW5nO1xyXG4gIGNyZWF0ZWRCeUluaXRpYWxzOiBzdHJpbmc7XHJcbiAgY3JlYXRlZE9uOiBzdHJpbmc7XHJcbiAgY3JlYXRlZE9uSXNvOiBzdHJpbmc7XHJcbiAgcHJpb3JpdHk6IHN0cmluZztcclxuICBkdWVPbjogc3RyaW5nO1xyXG4gIGR1ZUlzbzogc3RyaW5nO1xyXG4gIHNjaGVkdWxlZDogc3RyaW5nO1xyXG4gIGNvdmVyYWdlOiBzdHJpbmc7XHJcbiAgYXNzaWduZWQ6IG51bWJlcjtcclxuICBzdWJtaXR0ZWQ6IG51bWJlcjtcclxuICBmbGFnczogbnVtYmVyO1xyXG4gIHRhc2tzOiBzdHJpbmc7XHJcbiAgcmVkbzogbnVtYmVyO1xyXG4gIGNvbXBsaWFuY2U6IHN0cmluZztcclxuICBjb21wbGlhbmNlUGN0OiBudW1iZXI7XHJcbiAgcmF3PzogYW55O1xyXG59XHJcblxyXG4vKiogVGFzay1tb2RlIHRpbGVzLCBhcyBkaXNwbGF5ZWQgKCfigJQnIHdoZW4gdGhlIEFQSSBoYXMgbm8gdmFsdWUpLiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFRhc2tTdGF0cyB7XHJcbiAgYWN0aXZlVGFza3M6IHN0cmluZztcclxuICB0YXNrSW5zdGFuY2VzOiBzdHJpbmc7XHJcbiAgbm90U3VibWl0dGVkOiBzdHJpbmc7XHJcbiAgb3BlblRhc2tzOiBzdHJpbmc7XHJcbiAgaW5Qcm9ncmVzczogc3RyaW5nO1xyXG4gIHN1Ym1pdHRlZDogc3RyaW5nO1xyXG4gIGNvbXBsZXRpb25TY29yZTogc3RyaW5nO1xyXG4gIGNvbXBsaWFuY2VTY29yZTogc3RyaW5nO1xyXG4gIHRvdGFsRmxhZ3M6IHN0cmluZztcclxuICBjb21wbGV0aW9uRGVsdGE6IHN0cmluZztcclxuICBjb21wbGlhbmNlRGVsdGE6IHN0cmluZztcclxuICBmbGFnc0RlbHRhOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFRhc2tEZWx0YUtleSA9ICdjb21wbGV0aW9uJyB8ICdjb21wbGlhbmNlJyB8ICdmbGFncyc7XHJcblxyXG4vKiogT25lIGV4cG9ydGVkIGNvbHVtbjogaGVhZGVyIHRleHQgYW5kIHRoZSBjZWxsIHZhbHVlIGZvciBhIHJvdy4gKi9cclxuaW50ZXJmYWNlIEV4cG9ydENvbHVtbjxUPiB7XHJcbiAgaGVhZGVyOiBzdHJpbmc7XHJcbiAgdmFsdWU6IChyb3c6IFQpID0+IGFueTtcclxufVxyXG5cclxuY29uc3QgRU1QVFlfVEFTS19TVEFUUzogVGFza1N0YXRzID0ge1xyXG4gIGFjdGl2ZVRhc2tzOiAn4oCUJyxcclxuICB0YXNrSW5zdGFuY2VzOiAn4oCUJyxcclxuICBub3RTdWJtaXR0ZWQ6ICfigJQnLFxyXG4gIG9wZW5UYXNrczogJ+KAlCcsXHJcbiAgaW5Qcm9ncmVzczogJ+KAlCcsXHJcbiAgc3VibWl0dGVkOiAn4oCUJyxcclxuICBjb21wbGV0aW9uU2NvcmU6ICfigJQnLFxyXG4gIGNvbXBsaWFuY2VTY29yZTogJ+KAlCcsXHJcbiAgdG90YWxGbGFnczogJ+KAlCcsXHJcbiAgY29tcGxldGlvbkRlbHRhOiAnJyxcclxuICBjb21wbGlhbmNlRGVsdGE6ICcnLFxyXG4gIGZsYWdzRGVsdGE6ICcnXHJcbn07XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFRyZW5kQmFyIHtcclxuICBrZXk6IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIC8qKiBBdmVyYWdlIG9mIHRoZSBjb21wbGlhbmNlLXNjb3JlZCBhdWRpdHM7IG51bGwgd2hlbiBub25lLiAqL1xyXG4gIHZhbHVlOiBudW1iZXIgfCBudWxsO1xyXG4gIC8qKiBDb21wbGlhbmNlLXNjb3JlZCBhdWRpdHMgKHRoZSBvbmVzIHRoZSBhdmVyYWdlIHJlYWRzKS4gKi9cclxuICBjb3VudDogbnVtYmVyO1xyXG4gIC8qKiBFdmVyeSBzdWJtaXR0ZWQgYXVkaXQsIHNjb3JlZCBvciBub3QuICovXHJcbiAgc3VibWl0dGVkOiBudW1iZXI7XHJcbiAgLyoqIEF2ZXJhZ2UgY29uZmlndXJlZCBwYXNzIG1hcmsgb2YgdGhlIGF1ZGl0cyBgdmFsdWVgIGlzIGJ1aWx0IGZyb207IG51bGwgd2hlbiBub25lIChvbGRlciBBUEk6IHRoZSBwYWdlJ3MpLiAqL1xyXG4gIHBhc3NNYXJrOiBudW1iZXIgfCBudWxsO1xyXG59XHJcblxyXG4vKiogT25lIGZpbmFuY2lhbCBxdWFydGVyOiBBcHJpbC1NYXJjaCB5ZWFyLCBuYW1lZCBieSB0aGUgeWVhciBpdCBzdGFydHMgaW4gKHByb3RvdHlwZTogQXVnIDIwMjYgPSBRMiBGWTI2KS4gKi9cclxuaW50ZXJmYWNlIEZpc2NhbFF1YXJ0ZXIge1xyXG4gIGtleTogc3RyaW5nO1xyXG4gIGZyb206IHN0cmluZztcclxuICB0bzogc3RyaW5nO1xyXG4gIG1vbnRoczogc3RyaW5nO1xyXG59XHJcblxyXG4vKiogVGhlIGxhc3QgYG5gIGZpbmFuY2lhbCBxdWFydGVycywgb2xkZXN0IGZpcnN0LCBlbmRpbmcgd2l0aCB0aGUgb25lIGB0b2RheWAgZmFsbHMgaW4uICovXHJcbmZ1bmN0aW9uIGZpc2NhbFF1YXJ0ZXJzKHRvZGF5ID0gZGF5anMoKSwgbiA9IDQpOiBGaXNjYWxRdWFydGVyW10ge1xyXG4gIGNvbnN0IGN1cnJlbnQgPSB0b2RheS5zdGFydE9mKCdtb250aCcpLnN1YnRyYWN0KCh0b2RheS5tb250aCgpICsgOSkgJSAzLCAnbW9udGgnKTtcclxuICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogbiB9LCAoXywgaSkgPT4ge1xyXG4gICAgY29uc3Qgc3RhcnQgPSBjdXJyZW50LnN1YnRyYWN0KDMgKiAobiAtIDEgLSBpKSwgJ21vbnRoJyk7XHJcbiAgICBjb25zdCBlbmQgPSBzdGFydC5hZGQoMiwgJ21vbnRoJykuZW5kT2YoJ21vbnRoJyk7XHJcbiAgICBjb25zdCBmeSA9IHN0YXJ0Lm1vbnRoKCkgPj0gMyA/IHN0YXJ0LnllYXIoKSA6IHN0YXJ0LnllYXIoKSAtIDE7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBrZXk6ICdRJyArIChNYXRoLmZsb29yKCgoc3RhcnQubW9udGgoKSArIDkpICUgMTIpIC8gMykgKyAxKSArICcgRlknICsgU3RyaW5nKGZ5KS5zbGljZSgyKSxcclxuICAgICAgZnJvbTogc3RhcnQuZm9ybWF0KCdZWVlZLU1NLUREJyksXHJcbiAgICAgIHRvOiBlbmQuZm9ybWF0KCdZWVlZLU1NLUREJyksXHJcbiAgICAgIG1vbnRoczogc3RhcnQuZm9ybWF0KCdNTU0nKSArICcg4oCTICcgKyBlbmQuZm9ybWF0KCdNTU0gWVlZWScpXHJcbiAgICB9O1xyXG4gIH0pO1xyXG59XHJcblxyXG4vKiogUGFzcyBtYXJrIGFuZCBjcml0aWNhbCB0aHJlc2hvbGQgZm9yIHRoZSBhdWRpdCBwcm9ncmFtbWUgKG5vIHBlci1hdWRpdCBwYXNzIG1hcmsgaW4gdGhlIGRhdGEgeWV0KS4gKi9cclxuY29uc3QgUEFTU19NQVJLID0gNzU7XHJcbmNvbnN0IENSSVRJQ0FMX01BUksgPSA2MDtcclxuXHJcbmNvbnN0IEJBTkRTOiBBdWRpdEJhbmRbXSA9IFtcclxuICB7IGtleTogJ2V4Y2VsbGVudCcsIGxhYmVsOiAnRXhjZWxsZW50JywgcmFuZ2U6ICc5MC0xMDAlJywgbG86IDkwLCBoaTogMTAwLCBzb2Z0OiAnIzhGQkZBNScsIGJnOiAnI0VDRkRGMycsIGZnOiAnIzAyN0E0OCcgfSxcclxuICB7IGtleTogJ2dvb2QnLCBsYWJlbDogJ0dvb2QnLCByYW5nZTogJzc1LTg5JScsIGxvOiA3NSwgaGk6IDg5LCBzb2Z0OiAnIzk2QjRENicsIGJnOiAnI0VGRjhGRicsIGZnOiAnIzE3NUNEMycgfSxcclxuICB7IGtleTogJ2ZhaXInLCBsYWJlbDogJ05lZWRzIGltcHJvdmVtZW50JywgcmFuZ2U6ICc2MC03NCUnLCBsbzogNjAsIGhpOiA3NCwgc29mdDogJyNEQ0JFOEMnLCBiZzogJyNGRkZBRUInLCBmZzogJyNCNTQ3MDgnIH0sXHJcbiAgeyBrZXk6ICdjcml0aWNhbCcsIGxhYmVsOiAnQ3JpdGljYWwnLCByYW5nZTogJ0JlbG93IDYwJScsIGxvOiAwLCBoaTogNTksIHNvZnQ6ICcjRDZBMTlCJywgYmc6ICcjRkVGM0YyJywgZmc6ICcjQjQyMzE4JyB9LFxyXG4gIHsga2V5OiAndW5zY29yZWQnLCBsYWJlbDogJ05vdCBzY29yZWQnLCByYW5nZTogJ0NvbXBsaWFuY2Ugc2NvcmUgb2ZmJywgbG86IDAsIGhpOiAxMDAsIHNvZnQ6ICcjQzdEN0ZFJywgYmc6ICcjRUVGNEZGJywgZmc6ICcjMzUzOENEJyB9LFxyXG4gIHsga2V5OiAnbmEnLCBsYWJlbDogJ05vdCBhdWRpdGVkJywgcmFuZ2U6ICdObyBzdWJtaXNzaW9uJywgbG86IDAsIGhpOiAxMDAsIHNvZnQ6ICcjRDZEQUUwJywgYmc6ICcjRjJGNEY3JywgZmc6ICcjNDc1NDY3JyB9XHJcbl07XHJcblxyXG4vKiogQmFuZHMgdGhhdCBob2xkIHN0b3JlcyB3aXRob3V0IGEgc2NvcmU7IHRoZXkgZmlsdGVyIGJ5IHN0YXR1cywgbm90IGJ5IHNjb3JlIHJhbmdlLiAqL1xyXG5jb25zdCBTVEFUVVNfQkFORFMgPSBbJ3Vuc2NvcmVkJywgJ25hJ107XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0VHlwZU9wdGlvbiB7XHJcbiAga2V5OiBzdHJpbmc7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICBoZWxwOiBzdHJpbmc7XHJcbn1cclxuXHJcbmNvbnN0IEFMTF9BVURJVFM6IEF1ZGl0VHlwZU9wdGlvbiA9IHsga2V5OiAnYWxsJywgbGFiZWw6ICdBbGwgQXVkaXRzJywgaGVscDogJ0JsZW5kZWQgc2NvcmUgYWNyb3NzIGV2ZXJ5IHByb2dyYW1tZS4nIH07XHJcblxyXG4vKiogU3RvcmUgaGllcmFyY2h5IHBpY2tzOiBjaXJjbGUgaGVhZCAvIHpvbmUgbWFuYWdlciAvIEFPTSBuYW1lcyBhcyB0aGUgZGFzaGJvYXJkIEFQSSBzZW5kcyB0aGVtLCBzdG9yZSA9IHN0b3JlSWQuICovXHJcbmludGVyZmFjZSBTY29wZVBpY2sge1xyXG4gIGNpcmNsZTogc3RyaW5nO1xyXG4gIHpvbmU6IHN0cmluZztcclxuICBhb206IHN0cmluZztcclxuICBzdG9yZTogc3RyaW5nO1xyXG59XHJcblxyXG4vKipcclxuICogRGFzaGJvYXJkLiBTdG9yZSBsaXN0LCBzY29yZSBiYW5kcywgS1BJcyBhbmQgdGhlIGJ5LWRhdGUgdHJlbmQgY29tZSBmcm9tIHRoZSBhdWRpdCBBUElcclxuICogKC90cmF4L2F1ZGl0L2Rhc2hib2FyZCk7IHRoZSBBdWRpdCAvIFVzZXIgUGVyZm9ybWFuY2UgdGFicyBzdGlsbCB1c2UgdGhlIHYxIGRhc2hib2FyZFxyXG4gKiBlbmRwb2ludHMgKGNoZWNrbGlzdFBlcmZvcm1hbmNlIC8gdXNlclBlcmZvcm1hbmNlKS4gVGFzayBtb2RlICh0aWxlcyArIFRhc2sgUGVyZm9ybWFuY2UpIHJlYWRzXHJcbiAqIC90cmF4L2F1ZGl0L2Rhc2hib2FyZC90YXNrczogb25seSB0aGUgdGFza3MgcmFpc2VkIGZyb20gdGhpcyBjbGllbnQncyBhdWRpdHMuXHJcbiAqIFNjb3BlIChjbGllbnQsIHN0b3JlcywgZGF0ZXMpIGNvbWVzIGZyb20gdGhlIGdsb2JhbCBoZWFkZXIgZmlsdGVyOyB0aGUgcGVyaW9kIHBpY2tlciBjYW4gbmFycm93IHRoZSBkYXRlcy5cclxuICogRmlsdGVycyBkcmF3ZXI6IFN0b3JlIGhpZXJhcmNoeSBuYXJyb3dzIHRoZSBzdG9yZXMgYW5kIEF1ZGl0IHR5cGUgKGNoZWNrbGlzdElkKSB0aGUgYXVkaXQgb2YgZXZlcnkgZmVlZCAocmVsb2FkZWRcclxuICogb24gQXBwbHkpOyBTY29yZSByYW5nZSBhbmQgU3RhdHVzIG9ubHkgZmlsdGVyIHRoZSBsb2FkZWQgc3RvcmUgbGlzdCBpbiB0aGUgYnJvd3Nlci5cclxuICpcclxuICogUXVhcnRlcmx5OiB0aGUgdHJlbmQgc2hvd3MgdGhlIGxhc3QgZm91ciBmaW5hbmNpYWwgcXVhcnRlcnMgKGJ1aWx0IGZyb20gb25lIG1vbnRobHktYnVja2V0IGNhbGwgb2ZcclxuICogdGhlIHNhbWUgQVBJKSBhbmQgdGhlIHBpY2tlZCBxdWFydGVyIGJlY29tZXMgdGhlIHBlcmlvZCBvZiBldmVyeSBmZWVkLiBCeSBkYXRlOiB0aGUgcmFuZ2UgcGlja2VyLlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItYXVkaXQtdjItZGFzaGJvYXJkJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYXVkaXQtdjItZGFzaGJvYXJkLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vYXVkaXQtdjItZGFzaGJvYXJkLmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQXVkaXRWMkRhc2hib2FyZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICAvKiogUGFzcyAvIGNyaXRpY2FsIG1hcmtzIGNvbWUgZnJvbSB0aGUgYXVkaXQgZGFzaGJvYXJkIEFQSTsgdGhlc2UgYXJlIHRoZSBlbXB0eS1zdGF0ZSBkZWZhdWx0cy4gKi9cclxuICBwYXNzTWFyayA9IFBBU1NfTUFSSztcclxuICAvKipcclxuICAgKiBUaGUgYXVkaXRzIGluIHNjb3BlIGhhdmUgZGlmZmVyZW50IHBhc3MgbWFya3MgKENvbmZpZ3VyZSk6IG5vIHNpbmdsZSBwYXNzIGxpbmUgaXMgZHJhd24sIGFuZCBlYWNoIHN0b3JlIC8gYmFyXHJcbiAgICogaXMganVkZ2VkIG9uIHRoZSBtYXJrcyBvZiBpdHMgb3duIGF1ZGl0cy4gcGFzc01hcmsgaXMgdGhlbiB0aGVpciBhdmVyYWdlLCBmb3IgdGhlIEtQSSBjb2xvdXIgb25seS5cclxuICAgKi9cclxuICBwYXNzTWFya01peGVkID0gZmFsc2U7XHJcbiAgY3JpdGljYWxNYXJrID0gQ1JJVElDQUxfTUFSSztcclxuICByZWFkb25seSBiYW5kcyA9IEJBTkRTO1xyXG4gIC8qKiBcIkFsbCBBdWRpdHNcIiwgdGhlbiB0aGUgY2xpZW50J3MgYXVkaXRzIChQT1NUIC90cmF4L2F1ZGl0L2xpc3QpOyBrZXkgPSBhdWRpdCBpZCwgc2VudCBhcyBjaGVja2xpc3RJZC4gKi9cclxuICBhdWRpdFR5cGVzOiBBdWRpdFR5cGVPcHRpb25bXSA9IFtBTExfQVVESVRTXTtcclxuICAvKiogQ2xpZW50IHRoZSBhdWRpdCBsaXN0IHdhcyBmZXRjaGVkIGZvci4gKi9cclxuICBwcml2YXRlIGF1ZGl0VHlwZXNDbGllbnQgPSAnJztcclxuXHJcbiAgLyoqXHJcbiAgICogUGVyaW9kIHNlbGVjdGlvbi4gZnJvbSAvIHRvIChZWVlZLU1NLUREKSBzdGFydCBhcyB0aGUgaGVhZGVyIGRhdGUgcmFuZ2UgYW5kIGRyaXZlIGV2ZXJ5IGZlZWQ7XHJcbiAgICogdGhlIHJhbmdlIHBpY2tlciBuYXJyb3dzIHRoZW0sIGFuZCBhIGhlYWRlciBjaGFuZ2UgcmVzZXRzIHRoZW0uXHJcbiAgICovXHJcbiAgZ3JhaW46ICdxdWFydGVyJyB8ICdkYXRlJyA9ICdkYXRlJztcclxuICBxdWFydGVyID0gJyc7XHJcbiAgcmVhZG9ubHkgZmlzY2FsID0gZmlzY2FsUXVhcnRlcnMoKTtcclxuICByZWFkb25seSBxdWFydGVycyA9IHRoaXMuZmlzY2FsLm1hcChxID0+IHEua2V5KTtcclxuICAvKiogUXVhcnRlcmx5IHRyZW5kIGJhcnMsIGFuZCB0aGUgY2xpZW50ICsgc3RvcmVzIHRoZXkgd2VyZSBmZXRjaGVkIGZvci4gKi9cclxuICBxdWFydGVyVHJlbmQ6IFRyZW5kQmFyW10gPSBbXTtcclxuICBxdWFydGVyVHJlbmRMb2FkaW5nID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBxdWFydGVyVHJlbmRTY29wZSA9ICcnO1xyXG4gIGZyb20gPSAnJztcclxuICB0byA9ICcnO1xyXG4gIHJhbmdlOiBQaWNrZXJSYW5nZSB8IG51bGwgPSBudWxsO1xyXG4gIHJlYWRvbmx5IHBpY2tlckxvY2FsZSA9IFBJQ0tFUl9MT0NBTEU7XHJcbiAgcmVhZG9ubHkgcmFuZ2VzID0gcGlja2VyUmFuZ2VzKCk7XHJcbiAgcmVhZG9ubHkgdG9kYXkgPSBkYXlqcygpO1xyXG5cclxuICAvKiogRmlsdGVycy4gKi9cclxuICBhdWRpdFR5cGUgPSAnYWxsJztcclxuICBzdGF0dXM6IFN0YXR1c0ZpbHRlciA9ICdhbGwnO1xyXG4gIHNlYXJjaCA9ICcnO1xyXG4gIHNjb3JlTWluID0gMDtcclxuICBzY29yZU1heCA9IDEwMDtcclxuXHJcbiAgLyoqIEF1ZGl0IC8gVGFzayBzd2l0Y2guICovXHJcbiAgbW9kdWxlVGFiOiAnQXVkaXQnIHwgJ1Rhc2snID0gJ0F1ZGl0JztcclxuICByZWFkb25seSBtb2R1bGVUYWJzOiBBcnJheTwnQXVkaXQnIHwgJ1Rhc2snPiA9IFsnQXVkaXQnLCAnVGFzayddO1xyXG5cclxuICAvKiogU2hvd24gaW4gdGhlIHBhZ2UgaGVhZGVyOyBzdGFtcGVkIG9uIGV2ZXJ5IGxvYWQuICovXHJcbiAgbGFzdFJlZnJlc2hlZCA9ICfigJQnO1xyXG5cclxuICAvKiogRmlsdGVyIGRyYXdlci4gKi9cclxuICBmaWx0ZXJzT3BlbiA9IGZhbHNlO1xyXG4gIGFjdGl2ZUNhdCA9ICdwZXJpb2QnO1xyXG4gIC8qKlxyXG4gICAqIFRoZSBmaWx0ZXIgZHJhd2VyJ3MgZHJhZnQgKFFBIDkgT2N0KTogT2JqZWN0LmNyZWF0ZSh0aGlzKSwgc28gZXZlcnkgZ2V0dGVyIHRoZSBkcmF3ZXIgc2hvd3Mgd29ya3Mgb24gdGhlIGRyYWZ0J3NcclxuICAgKiBvd24gdmFsdWVzIHdoaWxlIHRoZSBwYWdlIGJlaGluZCBrZWVwcyB0aGUgYXBwbGllZCBvbmVzLiBBcHBseSBjb3BpZXMgRFJBRlRfS0VZUyBvbnRvIHRoZSBwYWdlOyBDYW5jZWwgZHJvcHMgaXQuXHJcbiAgICovXHJcbiAgZHJhZnQ6IEF1ZGl0VjJEYXNoYm9hcmRDb21wb25lbnQgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBEUkFGVF9LRVlTID0gWydncmFpbicsICdxdWFydGVyJywgJ2Zyb20nLCAndG8nLCAncmFuZ2UnLCAnYXVkaXRUeXBlJywgJ2NpcmNsZScsICd6b25lJywgJ2FvbScsICdzdG9yZScsXHJcbiAgICAnc2NvcmVNaW4nLCAnc2NvcmVNYXgnLCAnc3RhdHVzJywgJ3N0b3JlTGlzdE9wZW4nLCAnbGlzdEJhbmRLZXknXSBhcyBjb25zdDtcclxuXHJcbiAgLyoqXHJcbiAgICogU3RvcmUgaGllcmFyY2h5IHBpY2tzIGJlaW5nIGVkaXRlZCBpbiB0aGUgZHJhd2VyIChzdG9yZSA9IHN0b3JlSWQpLiBUaGUgbGlzdHMgY29tZSBmcm9tIHRoZSBkYXNoYm9hcmRcclxuICAgKiBBUEkncyBzdG9yZSByb3dzIG9mIHRoZSBoZWFkZXIgc2NvcGU7IEFwcGx5IG5hcnJvd3MgZXZlcnkgZmVlZCB0byB0aGUgc3RvcmVzIHRoZSBwaWNrIGNvdmVycy5cclxuICAgKi9cclxuICBjaXJjbGUgPSAnJztcclxuICB6b25lID0gJyc7XHJcbiAgYW9tID0gJyc7XHJcbiAgc3RvcmUgPSAnJztcclxuXHJcbiAgLyoqIFN0b3JlIHJvd3Mgb2YgdGhlIGhlYWRlciBzY29wZSwgbm90IG5hcnJvd2VkIGJ5IHRoZSBoaWVyYXJjaHk6IHRoZSBkcmF3ZXIncyBsaXN0cyBhbmQgZWFjaCBwaWNrJ3Mgc3RvcmVzLiAqL1xyXG4gIHByaXZhdGUgc2NvcGVSb3dzOiBBdWRpdFJvd1tdID0gW107XHJcbiAgLyoqIEhpZXJhcmNoeSArIGF1ZGl0IHR5cGUgdGhlIGZlZWRzIHdlcmUgbGFzdCBsb2FkZWQgd2l0aDsgdGhlIGRyYXdlciBlZGl0cyBhIGRyYWZ0IHVudGlsIEFwcGx5LiAqL1xyXG4gIHByaXZhdGUgYXBwbGllZDogU2NvcGVQaWNrICYgeyBhdWRpdFR5cGU6IHN0cmluZyB9ID0geyBjaXJjbGU6ICcnLCB6b25lOiAnJywgYW9tOiAnJywgc3RvcmU6ICcnLCBhdWRpdFR5cGU6ICdhbGwnIH07XHJcbiAgLyoqIENsaWVudCArIGhlYWRlciBzdG9yZXM7IGEgY2hhbmdlIHJlc2V0cyB0aGUgaGllcmFyY2h5IHBpY2tzICh0aGVpciBzdG9yZXMgbWF5IGJlIGdvbmUpLiAqL1xyXG4gIHByaXZhdGUgaGVhZGVyU2NvcGVLZXkgPSAnJztcclxuXHJcbiAgLyoqIFRhYmxlIHN0YXRlLiAqL1xyXG4gIHNvcnRLZXkgPSAnc2NvcmUnO1xyXG4gIHNvcnREaXI6ICdhc2MnIHwgJ2Rlc2MnID0gJ2FzYyc7XHJcbiAgcGFnZSA9IDE7XHJcbiAgLyoqIFN0b3JlIGxpc3QgcGFnZXI6IDEwIHJvd3MgYSBwYWdlLCAxMCAvIDIwIC8gMzAsIGFzIG9uIGV2ZXJ5IGF1ZGl0IGxpc3QuICovXHJcbiAgcGFnZVNpemUgPSAxMDtcclxuICByZWFkb25seSBwYWdlU2l6ZXMgPSBbMTAsIDIwLCAzMF07XHJcblxyXG4gIGhlYWRlcnM6IEFycmF5PHsga2V5OiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfT4gPSBbXHJcbiAgICB7IGtleTogJ2RhdGUnLCBsYWJlbDogJ0F1ZGl0IGRhdGUnIH0sXHJcbiAgICAvLyBUaGUgY29sdW1uIHNob3dzIHRoZSBzdG9yZSdzIG5hbWUgKHJvdy5zdG9yZUlkIGhvbGRzIGl0OyBzZWUgdG9BdWRpdFJvdykuXHJcbiAgICB7IGtleTogJ3N0b3JlSWQnLCBsYWJlbDogJ1N0b3JlIE5hbWUnIH0sXHJcbiAgICB7IGtleTogJ2NpcmNsZScsIGxhYmVsOiAnQ2lyY2xlIEhlYWQnIH0sXHJcbiAgICB7IGtleTogJ3pvbmUnLCBsYWJlbDogJ1pvbmUgTWFuYWdlcicgfSxcclxuICAgIHsga2V5OiAnYW9tJywgbGFiZWw6ICdBT00nIH0sXHJcbiAgICAvLyBBIHN0b3JlIGNhbiBzdWJtaXQgc2V2ZXJhbCBhdWRpdHMgaW4gdGhlIHBlcmlvZDogdGhlIGNvbHVtbiBhZGRzIHVwIHRvIFwiQXVkaXRzIGNvbXBsZXRlZFwiIChRQSAxMyBPY3QpLlxyXG4gICAgeyBrZXk6ICdhdWRpdHMnLCBsYWJlbDogJ0F1ZGl0cycgfSxcclxuICAgIHsga2V5OiAnc2NvcmUnLCBsYWJlbDogJ1Njb3JlJyB9LFxyXG4gICAgeyBrZXk6ICdzdGF0dXMnLCBsYWJlbDogJ1N0YXR1cycgfVxyXG5cclxuICBdO1xyXG5cclxuICAvKipcclxuICAgKiBUYXNrIG1vZGU6IHRpbGVzIGFuZCB0aGUgVGFzayBQZXJmb3JtYW5jZSB0YWJsZSBmb3IgdGhlIHRhc2tzIHJhaXNlZCBmcm9tIHRoaXMgY2xpZW50J3MgYXVkaXRzXHJcbiAgICogKC90cmF4L2F1ZGl0L2Rhc2hib2FyZC90YXNrcykuIExvYWRlZCB3aGVuIHRoZSBUYXNrIHRhYiBpcyBvcGVuLCBhbmQgYWdhaW4gYWZ0ZXIgYSBoZWFkZXIgY2hhbmdlLlxyXG4gICAqL1xyXG4gIHRhc2tTdGF0czogVGFza1N0YXRzID0geyAuLi5FTVBUWV9UQVNLX1NUQVRTIH07XHJcbiAgdGFza1BlcmY6IFRhc2tQZXJmUm93W10gPSBbXTtcclxuICB0YXNrTG9hZGluZyA9IGZhbHNlO1xyXG4gIC8qKiBDaGFuZ2UgdnMgdGhlIHByZXZpb3VzIHBlcmlvZCAobnVsbCA9IG5vdGhpbmcgdG8gY29tcGFyZSk7IGRyaXZlcyB0aGUgZGVsdGEgYXJyb3cgYW5kIGNvbG91ci4gKi9cclxuICBwcml2YXRlIHRhc2tEZWx0YVZhbHVlczogUmVjb3JkPFRhc2tEZWx0YUtleSwgbnVtYmVyIHwgbnVsbD4gPSB7IGNvbXBsZXRpb246IG51bGwsIGNvbXBsaWFuY2U6IG51bGwsIGZsYWdzOiBudWxsIH07XHJcbiAgLyoqIFRydWUgdW50aWwgdGhlIHRhc2sgZmlndXJlcyBhcmUgbG9hZGVkIGZvciB0aGUgY3VycmVudCBzY29wZS4gKi9cclxuICBwcml2YXRlIHRhc2tzU3RhbGUgPSB0cnVlO1xyXG4gIC8qKiBJZ25vcmVzIGEgdGFzayByZXNwb25zZSB0aGF0IGEgbmV3ZXIgcmVxdWVzdCBoYXMgb3ZlcnRha2VuLiAqL1xyXG4gIHByaXZhdGUgdGFza1JlcXVlc3QgPSAwO1xyXG4gIC8qKiBQREYgZG93bmxvYWRzIGluIGZsaWdodCwgYnkgdmlzaXQgaWQsIHNvIGEgZG91YmxlIGNsaWNrIHF1ZXVlcyBvbmUgcmVwb3J0LiAqL1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcGRmUXVldWVkID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcblxyXG4gIC8qKiBQZXJmb3JtYW5jZSBzZWN0aW9uIChoaWRkZW4gZm9yIG5vdzsgc2V0IHRydWUgdG8gc2hvdyBpdCBhZ2FpbikuICovXHJcbiAgc2hvd1BlcmZvcm1hbmNlID0gZmFsc2U7XHJcbiAgLyoqIEF1ZGl0IHNjb3JlIHRyZW5kOiB0aGUgY2FyZCdzIG93biBkYXRlIHBpY2tlciAoaGlkZGVuIGZvciBub3c7IHRoZSBoZWFkZXIgZGF0ZSBhbmQgRmlsdGVycyBzdGlsbCBzZXQgdGhlIHBlcmlvZCkuICovXHJcbiAgc2hvd1RyZW5kRGF0ZVBpY2tlciA9IGZhbHNlO1xyXG4gIC8qKiBBdWRpdCBzY29yZSB0cmVuZDogXCJCZWxvdyBwYXNzIG1hcmtcIiBwaWxsIChjYXJkICsgYmFyIGhvdmVyIHRpcCksIFwiUGFzcyBtYXJrIE4lXCIgbGVnZW5kIGFuZCBcIsK3IHBhc3MgbWFyayBOJVwiIHRleHQgKGhpZGRlbiBmb3Igbm93KS4gKi9cclxuICBzaG93UGFzc01hcmtJbmZvID0gZmFsc2U7XHJcbiAgLyoqIEZpbHRlcnMgZHJhd2VyID4gUGVyaW9kOiB0aGUgXCJEYXRlIHJhbmdlXCIgcGlja2VyIHVuZGVyIEJ5IGRhdGUgKGhpZGRlbiBmb3Igbm93OyBCeSBkYXRlIHJlYWRzIHRoZSBoZWFkZXIgZGF0ZSByYW5nZSkuICovXHJcbiAgc2hvd0RyYXdlckRhdGVSYW5nZSA9IGZhbHNlO1xyXG4gIHBlcmZUYWI6ICdBdWRpdCcgfCAnU3RvcmUnIHwgJ1VzZXInID0gJ0F1ZGl0JztcclxuICByZWFkb25seSBwZXJmVGFiczogQXJyYXk8J0F1ZGl0JyB8ICdTdG9yZScgfCAnVXNlcic+ID0gWydBdWRpdCcsICdTdG9yZScsICdVc2VyJ107XHJcbiAgcGVyZlBlcmlvZCA9ICcnO1xyXG4gIHBlcmZTZWFyY2ggPSAnJztcclxuICAvKiogUGVyZm9ybWFuY2UgdGFibGVzJyBwYWdlciAoc2hhcmVkIGxpYi1wYWdpbmF0aW9uLCBhcyB0aGUgb3RoZXIgYXVkaXQgbGlzdHMpOiAxMCByb3dzIGEgcGFnZSwgMTAgLyAyMCAvIDMwLiAqL1xyXG4gIHBlcmZQYWdlID0gMTtcclxuICBwZXJmUGFnZVNpemUgPSAxMDtcclxuICByZWFkb25seSBwZXJmUGFnZVNpemVzID0gWzEwLCAyMCwgMzBdO1xyXG4gIC8qKiBDb2x1bW4gc29ydCBvZiB0aGUgYWN0aXZlIFBlcmZvcm1hbmNlIHRhYmxlICgnJyA9IHRoZSBBUEkncyBvcmRlcik7IHJlc2V0IHdoZW4gdGhlIHRhYiBjaGFuZ2VzLiAqL1xyXG4gIHBlcmZTb3J0S2V5ID0gJyc7XHJcbiAgcGVyZlNvcnREaXI6ICdhc2MnIHwgJ2Rlc2MnID0gJ2FzYyc7XHJcblxyXG4gIC8qKiBTb3J0YWJsZSBjb2x1bW5zIG9mIGVhY2ggUGVyZm9ybWFuY2UgdGFibGUsIGluIGRpc3BsYXkgb3JkZXIgKEFjdGlvbiBpcyBub3Qgc29ydGFibGUpLiAqL1xyXG4gIHJlYWRvbmx5IGF1ZGl0UGVyZkNvbHM6IFBlcmZDb2x1bW5bXSA9IFtcclxuICAgIC8vIE5vIFNjaGVkdWxlZCBjb2x1bW4gKFFBIDkgT2N0KS5cclxuICAgIHsga2V5OiAnbmFtZScsIGxhYmVsOiAnQXVkaXQgTmFtZScgfSwgeyBrZXk6ICdhc3NpZ25lZCcsIGxhYmVsOiAnQXNzaWduZWQgVG8nIH0sIHsga2V5OiAnc3VibWl0dGVkJywgbGFiZWw6ICdTdWJtaXR0ZWQnIH0sXHJcbiAgICB7IGtleTogJ2Rpc3B1dGVzJywgbGFiZWw6ICdEaXNwdXRlcycgfSwgeyBrZXk6ICdwYXNzTWFyaycsIGxhYmVsOiAnUGFzcyBNYXJrJyB9LFxyXG4gICAgeyBrZXk6ICdzY29yZScsIGxhYmVsOiAnU2NvcmUnIH0sIHsga2V5OiAncmVzdWx0JywgbGFiZWw6ICdSZXN1bHQnIH1cclxuICBdO1xyXG4gIC8vIFRhc2sgSW5mbzogdGhlIHNhbWUgY29sdW1ucyBhcyBDaGVja2xpc3QgPiBEYXNoYm9hcmQgPiBUYXNrLlxyXG4gIHJlYWRvbmx5IHRhc2tQZXJmQ29sczogUGVyZkNvbHVtbltdID0gW1xyXG4gICAgeyBrZXk6ICduYW1lJywgbGFiZWw6ICdUYXNrIE5hbWUnIH0sIHsga2V5OiAnY3JlYXRlZEJ5JywgbGFiZWw6ICdDcmVhdGVkIGJ5JyB9LCB7IGtleTogJ2NyZWF0ZWRPbicsIGxhYmVsOiAnQ3JlYXRlZCBPbicgfSxcclxuICAgIHsga2V5OiAncHJpb3JpdHknLCBsYWJlbDogJ1ByaW9yaXR5JyB9LCB7IGtleTogJ2Fzc2lnbmVkJywgbGFiZWw6ICdBc3NpZ25lZCBUbycgfSwgeyBrZXk6ICdzdWJtaXR0ZWQnLCBsYWJlbDogJ1N1Ym1pdHRlZCcgfSxcclxuICAgIHsga2V5OiAncmVkbycsIGxhYmVsOiAnUmVkbycgfSwgeyBrZXk6ICdkdWVPbicsIGxhYmVsOiAnRHVlIG9uJyB9XHJcbiAgXTtcclxuICByZWFkb25seSBzdG9yZVBlcmZDb2xzOiBQZXJmQ29sdW1uW10gPSBbXHJcbiAgICB7IGtleTogJ3N0b3JlJywgbGFiZWw6ICdTdG9yZSBOYW1lJyB9LCB7IGtleTogJ3N0b3JlSWQnLCBsYWJlbDogJ1N0b3JlIElEJyB9LCB7IGtleTogJ3Nwb2MnLCBsYWJlbDogJ1N0b3JlIFNwb2MnIH0sXHJcbiAgICB7IGtleTogJ2Fzc2lnbmVkJywgbGFiZWw6ICdBc3NpZ25lZCcgfSxcclxuICAgIHsga2V5OiAnZmxhZ3MnLCBsYWJlbDogJ0ZsYWdzJyB9LCB7IGtleTogJ2NvbXBsZXRpb24nLCBsYWJlbDogJ0NvbXBsZXRpb24gJScgfSwgeyBrZXk6ICdjb21wbGlhbmNlJywgbGFiZWw6ICdDb21wbGlhbmNlICUnIH0sXHJcbiAgICB7IGtleTogJ3BlcmYnLCBsYWJlbDogJ1BlcmZvcm1hbmNlICUnIH1cclxuICBdO1xyXG4gIHJlYWRvbmx5IHVzZXJQZXJmQ29sczogUGVyZkNvbHVtbltdID0gW1xyXG4gICAgeyBrZXk6ICduYW1lJywgbGFiZWw6ICdVc2VyIE5hbWUnIH0sIHsga2V5OiAnZW1haWwnLCBsYWJlbDogJ0VtYWlsJyB9LCB7IGtleTogJ2Fzc2lnbmVkJywgbGFiZWw6ICdBc3NpZ25lZCcgfSxcclxuICAgIHsga2V5OiAnZmxhZ3MnLCBsYWJlbDogJ0ZsYWdzJyB9LCB7IGtleTogJ3JlZG8nLCBsYWJlbDogJ1JlRG8nIH0sIHsga2V5OiAnY29tcGxldGlvbicsIGxhYmVsOiAnQ29tcGxldGlvbiAlJyB9LFxyXG4gICAgeyBrZXk6ICdjb21wbGlhbmNlJywgbGFiZWw6ICdDb21wbGlhbmNlICUnIH0sIHsga2V5OiAncGVyZicsIGxhYmVsOiAnUGVyZm9ybWFuY2UgJScgfVxyXG4gIF07XHJcblxyXG4gIC8qKiBXaGF0IGVhY2ggc29ydGFibGUgY29sdW1uIHNvcnRzIG9uOiBudW1iZXJzIGZvciBjb3VudHMgYW5kIHBlcmNlbnRhZ2VzLCB0ZXh0IG90aGVyd2lzZTsgbnVsbCBzb3J0cyBsYXN0LiAqL1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYXVkaXRTb3J0VmFsdWU6IFJlY29yZDxzdHJpbmcsIChyOiBBdWRpdFBlcmZSb3cpID0+IFNvcnRWYWx1ZT4gPSB7XHJcbiAgICBuYW1lOiByID0+IHIubmFtZSwgYXNzaWduZWQ6IHIgPT4gci5hc3NpZ25lZCwgc3VibWl0dGVkOiByID0+IHIuc3VibWl0dGVkLFxyXG4gICAgZGlzcHV0ZXM6IHIgPT4gci5kaXNwdXRlcywgcGFzc01hcms6IHIgPT4gdGhpcy5udW0oU3RyaW5nKHIucGFzc01hcmspLnJlcGxhY2UoJyUnLCAnJykpLFxyXG4gICAgc2NvcmU6IHIgPT4gKHIuc2NvcmUgPT09ICfigJQnID8gbnVsbCA6IHIuc2NvcmVQY3QpLCByZXN1bHQ6IHIgPT4gKHIucmVzdWx0ID09PSAn4oCUJyA/IG51bGwgOiByLnJlc3VsdClcclxuICB9O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdGFza1NvcnRWYWx1ZTogUmVjb3JkPHN0cmluZywgKHI6IFRhc2tQZXJmUm93KSA9PiBTb3J0VmFsdWU+ID0ge1xyXG4gICAgbmFtZTogciA9PiByLm5hbWUsIGNyZWF0ZWRCeTogciA9PiAoci5jcmVhdGVkQnkgPT09ICctLScgPyBudWxsIDogci5jcmVhdGVkQnkpLCBjcmVhdGVkT246IHIgPT4gci5jcmVhdGVkT25Jc28gfHwgbnVsbCxcclxuICAgIHByaW9yaXR5OiByID0+IChyLnByaW9yaXR5ID09PSAnLS0nID8gbnVsbCA6IHIucHJpb3JpdHkpLCBhc3NpZ25lZDogciA9PiByLmFzc2lnbmVkLCBzdWJtaXR0ZWQ6IHIgPT4gci5zdWJtaXR0ZWQsXHJcbiAgICByZWRvOiByID0+IHIucmVkbywgZHVlT246IHIgPT4gci5kdWVJc28gfHwgbnVsbFxyXG4gIH07XHJcbiAgcHJpdmF0ZSByZWFkb25seSBzdG9yZVNvcnRWYWx1ZTogUmVjb3JkPHN0cmluZywgKHI6IFN0b3JlUGVyZlJvdykgPT4gU29ydFZhbHVlPiA9IHtcclxuICAgIHN0b3JlOiByID0+IHIuc3RvcmUsIHN0b3JlSWQ6IHIgPT4gci5zdG9yZUlkLCBzcG9jOiByID0+IHIuc3BvYywgYXNzaWduZWQ6IHIgPT4gci5hc3NpZ25lZCwgZmxhZ3M6IHIgPT4gci5mbGFncyxcclxuICAgIGNvbXBsZXRpb246IHIgPT4gdGhpcy5udW0oci5yYXc/LmNvbXBsZXRpb24pLCBjb21wbGlhbmNlOiByID0+IHRoaXMubnVtKHIucmF3Py5jb21wbGlhbmNlKSwgcGVyZjogciA9PiB0aGlzLm51bShyLnJhdz8ucGVyZm9ybWFuY2UpXHJcbiAgfTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHVzZXJTb3J0VmFsdWU6IFJlY29yZDxzdHJpbmcsIChyOiBVc2VyUGVyZlJvdykgPT4gU29ydFZhbHVlPiA9IHtcclxuICAgIG5hbWU6IHIgPT4gci5uYW1lLCBlbWFpbDogciA9PiByLmVtYWlsLCBhc3NpZ25lZDogciA9PiByLmFzc2lnbmVkLCBmbGFnczogciA9PiByLmZsYWdzLCByZWRvOiByID0+IHIucmVkbyxcclxuICAgIGNvbXBsZXRpb246IHIgPT4gdGhpcy5udW0oci5yYXc/LmNvbXBsZXRpb24pLCBjb21wbGlhbmNlOiByID0+IHRoaXMubnVtKHIucmF3Py5jb21wbGlhbmNlKSwgcGVyZjogciA9PiB0aGlzLm51bShyLnJhdz8ucGVyZm9ybWFuY2UpXHJcbiAgfTtcclxuXHJcbiAgYXVkaXRQZXJmOiBBdWRpdFBlcmZSb3dbXSA9IFtdO1xyXG4gIHN0b3JlUGVyZjogU3RvcmVQZXJmUm93W10gPSBbXTtcclxuICB1c2VyUGVyZjogVXNlclBlcmZSb3dbXSA9IFtdO1xyXG5cclxuICByb3dzOiBBdWRpdFJvd1tdID0gW107XHJcbiAgdHJlbmQ6IFRyZW5kQmFyW10gPSBbXTtcclxuXHJcbiAgLyoqIFN0YXJ0cyB0cnVlIHNvIHRoZSBmaXJzdCBwYWludCBzaGltbWVycyBpbnN0ZWFkIG9mIGZsYXNoaW5nIGVtcHR5IHRpbGVzIGFuZCB0YWJsZXMuICovXHJcbiAgbG9hZGluZyA9IHRydWU7XHJcblxyXG4gIHByaXZhdGUgaGVhZGVyRGF0YTogYW55O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdXNlckVtYWlsZXM6IHN0cmluZ1tdID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlcnNFbWFpbC1pbmZvJykgfHwgJ1tdJyk7XHJcbiAgLyoqIENyZWF0ZSBBdWRpdCBzaG93cyBvbmx5IHdpdGggdGhlIENoZWNrbGlzdCBhZGQgcGVybWlzc2lvbi4gKi9cclxuICBhY2Nlc3M6IEF1ZGl0QWNjZXNzID0geyBjYW5BZGQ6IGZhbHNlLCBjYW5FZGl0OiBmYWxzZSB9O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgdHJheFNlcnZpY2U6IFRyYXhTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBnczogR2xvYmFsU3RhdGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdDogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuICApIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGF1ZGl0QWNjZXNzKHRoaXMuZ3MpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoYWNjZXNzID0+IHtcclxuICAgICAgdGhpcy5hY2Nlc3MgPSBhY2Nlc3M7XHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmdzLmRhdGFSYW5nZVZhbHVlXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSwgZGVib3VuY2VUaW1lKDMwMCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICghZGF0YT8uY2xpZW50KSB7IHJldHVybjsgfVxyXG4gICAgICAgIGNvbnN0IGNsaWVudENoYW5nZWQgPSBkYXRhLmNsaWVudCAhPT0gdGhpcy5oZWFkZXJEYXRhPy5jbGllbnQ7XHJcbiAgICAgICAgdGhpcy5oZWFkZXJEYXRhID0gZGF0YTtcclxuICAgICAgICB0aGlzLm9uSGVhZGVyU2NvcGUoY2xpZW50Q2hhbmdlZCk7XHJcbiAgICAgICAgLy8gQSBxdWFydGVyIHN0YXlzIHBpY2tlZCBhY3Jvc3MgaGVhZGVyIGNoYW5nZXMgKG5ldyBzdG9yZXMgLyBjbGllbnQpOyBCeSBkYXRlIGZvbGxvd3MgdGhlIGhlYWRlci5cclxuICAgICAgICBpZiAodGhpcy5ncmFpbiA9PT0gJ3F1YXJ0ZXInKSB7IHRoaXMuYXBwbHlRdWFydGVyKHRoaXMucXVhcnRlciwgdHJ1ZSk7IHJldHVybjsgfVxyXG4gICAgICAgIHRoaXMuZnJvbSA9IGRhdGEuZGF0ZT8uc3RhcnREYXRlIHx8ICcnO1xyXG4gICAgICAgIHRoaXMudG8gPSBkYXRhLmRhdGU/LmVuZERhdGUgfHwgJyc7XHJcbiAgICAgICAgdGhpcy5yYW5nZSA9IHRvUGlja2VyUmFuZ2UodGhpcy5mcm9tLCB0aGlzLnRvKTtcclxuICAgICAgICB0aGlzLnJlbG9hZFBlcmlvZCgpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhlYWRlciBjaGFuZ2UuIE5ldyBjbGllbnQ6IHRoZSBhdWRpdCB0eXBlIHN0YXJ0cyBvdmVyIGFuZCBpdHMgbGlzdCBpcyBmZXRjaGVkIGFnYWluLiBOZXcgY2xpZW50IG9yXHJcbiAgICogc3RvcmVzOiB0aGUgaGllcmFyY2h5IHBpY2tzIHN0YXJ0IG92ZXIgKHRoZSBuZXh0IGxvYWQgcmVmaWxscyB0aGUgbGlzdHMpLiBBIGRhdGUtb25seSBjaGFuZ2Uga2VlcHMgYm90aC5cclxuICAgKi9cclxuICBwcml2YXRlIG9uSGVhZGVyU2NvcGUoY2xpZW50Q2hhbmdlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgY29uc3Qga2V5ID0gdGhpcy5oZWFkZXJEYXRhLmNsaWVudCArICd8JyArIHRoaXMuaGVhZGVyU3RvcmVJZHMoKS5qb2luKCcsJyk7XHJcbiAgICBpZiAoa2V5ICE9PSB0aGlzLmhlYWRlclNjb3BlS2V5KSB7XHJcbiAgICAgIHRoaXMuaGVhZGVyU2NvcGVLZXkgPSBrZXk7XHJcbiAgICAgIHRoaXMuY2lyY2xlID0gdGhpcy56b25lID0gdGhpcy5hb20gPSB0aGlzLnN0b3JlID0gJyc7XHJcbiAgICAgIHRoaXMuYXBwbGllZCA9IHsgLi4udGhpcy5hcHBsaWVkLCBjaXJjbGU6ICcnLCB6b25lOiAnJywgYW9tOiAnJywgc3RvcmU6ICcnIH07XHJcbiAgICB9XHJcbiAgICBpZiAoY2xpZW50Q2hhbmdlZCkge1xyXG4gICAgICB0aGlzLmF1ZGl0VHlwZSA9ICdhbGwnO1xyXG4gICAgICB0aGlzLmFwcGxpZWQuYXVkaXRUeXBlID0gJ2FsbCc7XHJcbiAgICAgIHRoaXMuYXVkaXRUeXBlcyA9IFtBTExfQVVESVRTXTtcclxuICAgICAgdGhpcy5sb2FkQXVkaXRUeXBlcygpO1xyXG4gICAgICBsb2FkQXVkaXRMYWJlbHModGhpcy50cmF4U2VydmljZSwgdGhpcy5oZWFkZXJEYXRhLmNsaWVudCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZShsYWJlbHMgPT4ge1xyXG4gICAgICAgIHRoaXMubGFiZWxzID0gbGFiZWxzO1xyXG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBQYXNzIC8gRmFpbCBhcyBUcmF4IENvbmZpZ3VyYXRpb24g4oC6IEF1ZGl0IExhYmVscyBuYW1lcyB0aGVtOyBzdGF0dXNlcyBzdGF5ICdwYXNzJyAvICdmYWlsJy4gKi9cclxuICBsYWJlbHM6IEF1ZGl0TGFiZWxzID0gREVGQVVMVF9BVURJVF9MQUJFTFM7XHJcblxyXG4gIC8qKiBBbiBhdWRpdCByb3cncyByZXN1bHQgKCdQYXNzJyAvICdGYWlsJyAvICfigJQnKSB3aXRoIHRoZSBjb25maWd1cmVkIGxhYmVsLiAqL1xyXG4gIHJlc3VsdFRleHQocmVzdWx0OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHJlc3VsdCA9PT0gJ1Bhc3MnID8gdGhpcy5sYWJlbHMucGFzcyA6IHJlc3VsdCA9PT0gJ0ZhaWwnID8gdGhpcy5sYWJlbHMuZmFpbCA6IHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgY2xpZW50J3MgYXVkaXRzIGZvciB0aGUgQXVkaXQgdHlwZSBmaWx0ZXIsIG5ld2VzdCBmaXJzdCBhcyB0aGUgTWFuYWdlIGxpc3QuICovXHJcbiAgcHJpdmF0ZSBsb2FkQXVkaXRUeXBlcygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNsaWVudElkID0gdGhpcy5oZWFkZXJEYXRhPy5jbGllbnQ7XHJcbiAgICBpZiAoIWNsaWVudElkIHx8IGNsaWVudElkID09PSB0aGlzLmF1ZGl0VHlwZXNDbGllbnQpIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLmF1ZGl0VHlwZXNDbGllbnQgPSBjbGllbnRJZDtcclxuICAgIHRoaXMudHJheFNlcnZpY2UuYXVkaXRMaXN0KHtcclxuICAgICAgY2xpZW50SWQsIGZyb21EYXRlOiB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LnN0YXJ0RGF0ZSwgdG9EYXRlOiB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LmVuZERhdGUsXHJcbiAgICAgIGxpbWl0OiA1MDAsIG9mZnNldDogMSwgc2VhcmNoOiAnJ1xyXG4gICAgfSkucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKG51bGwpKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXM/LmNvZGUgIT09IDIwMCkgeyB0aGlzLmF1ZGl0VHlwZXNDbGllbnQgPSAnJzsgcmV0dXJuOyB9XHJcbiAgICAgIGNvbnN0IGxpc3Q6IGFueVtdID0gcmVzLmRhdGE/LnJlc3VsdCB8fCBbXTtcclxuICAgICAgdGhpcy5hdWRpdFR5cGVzID0gW0FMTF9BVURJVFNdLmNvbmNhdChsaXN0Lm1hcChhID0+ICh7XHJcbiAgICAgICAga2V5OiBTdHJpbmcoYS5faWQpLFxyXG4gICAgICAgIGxhYmVsOiBhLmNoZWNrTGlzdE5hbWUgfHwgJ1VudGl0bGVkIGF1ZGl0JyxcclxuICAgICAgICBoZWxwOiAoYS5wdWJsaXNoID8gJ1B1Ymxpc2hlZCcgOiAnRHJhZnQnKSArICcgwrcgcGFzcyBtYXJrICcgKyAodGhpcy5udW0oYS5wYXNzTWFyaykgPz8gUEFTU19NQVJLKSArICclJ1xyXG4gICAgICB9KSkpO1xyXG4gICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIEJ5IGRhdGU6IG9uZSBtb250aCBhdCBtb3N0ICh0aGUgcGlja2VycycgZGF0ZUxpbWl0LCBpbiBkYXlzIGFmdGVyIHRoZSBzdGFydDsgMzAgPSB1cCB0byAzMSBkYXlzKS4gKi9cclxuICByZWFkb25seSBtYXhSYW5nZURheXMgPSAzMDtcclxuXHJcbiAgLyoqIFJhbmdlIHBpY2tlcjogYSBuZXcgcGVyaW9kIHJlbG9hZHMgZXZlcnkgZmVlZCwgZXhjZXB0IGluc2lkZSB0aGUgZmlsdGVyIGRyYXdlciwgd2hlcmUgQXBwbHkgZG9lcy4gKi9cclxuICBvblJhbmdlUGlja2VkKGU6IFBpY2tlZERhdGVzIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgY29uc3QgcGlja2VkID0gZnJvbVBpY2tlclJhbmdlKGUpO1xyXG4gICAgaWYgKCFwaWNrZWQgfHwgKHBpY2tlZC5mcm9tID09PSB0aGlzLmZyb20gJiYgcGlja2VkLnRvID09PSB0aGlzLnRvKSkgeyByZXR1cm47IH1cclxuICAgIC8vIEEgbG9uZ2VyIHJhbmdlICh0eXBlZCwgb3IgYSBwcmVzZXQpIGlzIGN1dCBiYWNrIHRvIGEgbW9udGggZnJvbSBpdHMgc3RhcnQuXHJcbiAgICBpZiAoZGF5anMocGlja2VkLnRvKS5kaWZmKGRheWpzKHBpY2tlZC5mcm9tKSwgJ2RheScpID4gdGhpcy5tYXhSYW5nZURheXMpIHtcclxuICAgICAgcGlja2VkLnRvID0gZGF5anMocGlja2VkLmZyb20pLmFkZCh0aGlzLm1heFJhbmdlRGF5cywgJ2RheScpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xyXG4gICAgICB0aGlzLnJhbmdlID0gdG9QaWNrZXJSYW5nZShwaWNrZWQuZnJvbSwgcGlja2VkLnRvKTtcclxuICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KCdQaWNrIHVwIHRvIG9uZSBtb250aCDigJQgdGhlIHJhbmdlIGVuZHMgb24gJyArIGRheWpzKHBpY2tlZC50bykuZm9ybWF0KCdERCBNTU0gWVlZWScpKTtcclxuICAgIH1cclxuICAgIHRoaXMuZnJvbSA9IHBpY2tlZC5mcm9tO1xyXG4gICAgdGhpcy50byA9IHBpY2tlZC50bztcclxuICAgIGlmICghdGhpcy5maWx0ZXJzT3BlbikgeyB0aGlzLnJlbG9hZFBlcmlvZCgpOyB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbG9hZFBlcmlvZCgpOiB2b2lkIHtcclxuICAgIHRoaXMucGVyZlBlcmlvZCA9ICdCYXNlZCBvbiAnICsgdGhpcy5mbXQodGhpcy5mcm9tKSArICcgLSAnICsgdGhpcy5mbXQodGhpcy50byk7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gICAgdGhpcy5sb2FkKCk7XHJcbiAgICAvLyBUYXNrIGZpZ3VyZXMgZm9sbG93IHRoZSBzYW1lIHNjb3BlOyBmZXRjaGVkIG5vdyBpbiBUYXNrIG1vZGUsIGVsc2Ugd2hlbiB0aGUgdGFiIG9wZW5zLlxyXG4gICAgdGhpcy50YXNrc1N0YWxlID0gdHJ1ZTtcclxuICAgIGlmICh0aGlzLmlzVGFza01vZHVsZSkgeyB0aGlzLmxvYWRUYXNrcygpOyB9XHJcbiAgICBpZiAodGhpcy5ncmFpbiA9PT0gJ3F1YXJ0ZXInKSB7IHRoaXMubG9hZFF1YXJ0ZXJUcmVuZCgpOyB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgZm91ciBxdWFydGVyIGJhcnM6IG9uZSBjYWxsIG92ZXIgdGhlIGZvdXIgcXVhcnRlcnMgKG1vcmUgdGhhbiAxMjAgZGF5cywgc28gdGhlIEFQSSBidWNrZXRzIHRoZVxyXG4gICAqIHRyZW5kIGJ5IG1vbnRoKSByb2xsZWQgdXAgcGVyIHF1YXJ0ZXIsIHdlaWdodGVkIGJ5IGVhY2ggbW9udGgncyBhdWRpdCBjb3VudC4gRmV0Y2hlZCBhZ2FpbiBvbmx5XHJcbiAgICogd2hlbiB0aGUgY2xpZW50IG9yIHN0b3JlcyBjaGFuZ2UuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsb2FkUXVhcnRlclRyZW5kKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgc2NvcGUgPSB0aGlzLmJhc2VQYXlsb2FkKCk7XHJcbiAgICBjb25zdCBrZXkgPSBzY29wZVsnY2xpZW50SWQnXSArICd8JyArIChzY29wZVsnc3RvcmVJZCddIHx8IFtdKS5qb2luKCcsJykgKyAnfCcgKyAoc2NvcGVbJ2NoZWNrbGlzdElkJ10gfHwgJycpO1xyXG4gICAgaWYgKGtleSA9PT0gdGhpcy5xdWFydGVyVHJlbmRTY29wZSkgeyByZXR1cm47IH1cclxuICAgIHRoaXMucXVhcnRlclRyZW5kU2NvcGUgPSBrZXk7XHJcbiAgICB0aGlzLnF1YXJ0ZXJUcmVuZExvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy50cmF4U2VydmljZS5hdWRpdERhc2hib2FyZCh7XHJcbiAgICAgIGNsaWVudElkOiBzY29wZVsnY2xpZW50SWQnXSwgZnJvbURhdGU6IHRoaXMuZmlzY2FsWzBdLmZyb20sIHRvRGF0ZTogdGhpcy50b2RheS5mb3JtYXQoJ1lZWVktTU0tREQnKSwgc3RvcmVJZDogc2NvcGVbJ3N0b3JlSWQnXSxcclxuICAgICAgLi4udGhpcy5hdWRpdEZpbHRlcigpXHJcbiAgICB9KS5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgY29uc3Qgb2sgPSByZXM/LmNvZGUgPT09IDIwMDtcclxuICAgICAgaWYgKCFvaykgeyB0aGlzLnF1YXJ0ZXJUcmVuZFNjb3BlID0gJyc7IH1cclxuICAgICAgY29uc3QgYnVja2V0czogYW55W10gPSBvayA/IHJlcy5kYXRhPy50cmVuZCB8fCBbXSA6IFtdO1xyXG4gICAgICB0aGlzLnF1YXJ0ZXJUcmVuZCA9IHRoaXMuZmlzY2FsLm1hcChxID0+IHtcclxuICAgICAgICBjb25zdCBpblF1YXJ0ZXIgPSBidWNrZXRzLmZpbHRlcihiID0+IFN0cmluZyhiLmtleSkgPj0gcS5mcm9tICYmIFN0cmluZyhiLmtleSkgPD0gcS50byAmJiBiLnZhbHVlICE9PSBudWxsICYmIGIudmFsdWUgIT09IHVuZGVmaW5lZCk7XHJcbiAgICAgICAgY29uc3QgY291bnQgPSBpblF1YXJ0ZXIucmVkdWNlKChuLCBiKSA9PiBuICsgKE51bWJlcihiLmNvdW50KSB8fCAwKSwgMCk7XHJcbiAgICAgICAgY29uc3QgdG90YWwgPSBpblF1YXJ0ZXIucmVkdWNlKChuLCBiKSA9PiBuICsgTnVtYmVyKGIudmFsdWUpICogKE51bWJlcihiLmNvdW50KSB8fCAwKSwgMCk7XHJcbiAgICAgICAgLy8gRWFjaCBtb250aCdzIHBhc3MgbWFyaywgd2VpZ2h0ZWQgdGhlIHNhbWUgd2F5IChhbiBvbGRlciBBUEkgc2VuZHMgbm9uZTogdGhlIHBhZ2UncykuXHJcbiAgICAgICAgY29uc3QgbWFya3MgPSBpblF1YXJ0ZXIucmVkdWNlKChuLCBiKSA9PiBuICsgKHRoaXMubnVtKGIucGFzc01hcmspID8/IHRoaXMucGFzc01hcmspICogKE51bWJlcihiLmNvdW50KSB8fCAwKSwgMCk7XHJcbiAgICAgICAgY29uc3Qgc3VibWl0dGVkID0gYnVja2V0cy5maWx0ZXIoYiA9PiBTdHJpbmcoYi5rZXkpID49IHEuZnJvbSAmJiBTdHJpbmcoYi5rZXkpIDw9IHEudG8pXHJcbiAgICAgICAgICAucmVkdWNlKChuLCBiKSA9PiBuICsgKE51bWJlcihiLnN1Ym1pdHRlZCA/PyBiLmNvdW50KSB8fCAwKSwgMCk7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIGtleTogcS5rZXksIGxhYmVsOiBxLmtleSwgdmFsdWU6IGNvdW50ID8gTWF0aC5yb3VuZCh0b3RhbCAvIGNvdW50KSA6IG51bGwsIGNvdW50LCBzdWJtaXR0ZWQsXHJcbiAgICAgICAgICBwYXNzTWFyazogY291bnQgPyBNYXRoLnJvdW5kKG1hcmtzIC8gY291bnQgKiAxMCkgLyAxMCA6IG51bGxcclxuICAgICAgICB9O1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5xdWFydGVyVHJlbmRMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogTWFrZSBhIHF1YXJ0ZXIgdGhlIHBlcmlvZCAodXAgdG8gdG9kYXkgZm9yIHRoZSBjdXJyZW50IG9uZSk7IHJlbG9hZHMgdW5sZXNzIHRoZSBmaWx0ZXIgZHJhd2VyIGlzIG9wZW4uICovXHJcbiAgcHJpdmF0ZSBhcHBseVF1YXJ0ZXIoa2V5OiBzdHJpbmcsIGZvcmNlID0gZmFsc2UpOiB2b2lkIHtcclxuICAgIGNvbnN0IHEgPSB0aGlzLmZpc2NhbC5maW5kKHggPT4geC5rZXkgPT09IGtleSkgfHwgdGhpcy5maXNjYWxbdGhpcy5maXNjYWwubGVuZ3RoIC0gMV07XHJcbiAgICBjb25zdCB0b2RheSA9IHRoaXMudG9kYXkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XHJcbiAgICBjb25zdCB0byA9IHEudG8gPiB0b2RheSA/IHRvZGF5IDogcS50bztcclxuICAgIGlmICghZm9yY2UgJiYgcS5rZXkgPT09IHRoaXMucXVhcnRlciAmJiB0aGlzLmZyb20gPT09IHEuZnJvbSAmJiB0aGlzLnRvID09PSB0bykgeyByZXR1cm47IH1cclxuICAgIHRoaXMucXVhcnRlciA9IHEua2V5O1xyXG4gICAgdGhpcy5mcm9tID0gcS5mcm9tO1xyXG4gICAgdGhpcy50byA9IHRvO1xyXG4gICAgdGhpcy5yYW5nZSA9IHRvUGlja2VyUmFuZ2UodGhpcy5mcm9tLCB0aGlzLnRvKTtcclxuICAgIGlmICghdGhpcy5maWx0ZXJzT3BlbikgeyB0aGlzLnJlbG9hZFBlcmlvZCgpOyB9XHJcbiAgfVxyXG5cclxuICAvKiogUXVhcnRlcmx5OiBhIGJhciAob3IgYSBxdWFydGVyIGluIHRoZSBmaWx0ZXIgZHJhd2VyKSBwaWNrcyB0aGF0IHF1YXJ0ZXIuICovXHJcbiAgc2VsZWN0UXVhcnRlcihrZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZ3JhaW4gIT09ICdxdWFydGVyJykgeyByZXR1cm47IH1cclxuICAgIHRoaXMuYXBwbHlRdWFydGVyKGtleSk7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIHRyZW5kIGNhcmQgd2FpdHMgZm9yIHRoZSBwYWdlIGZlZWRzLCBhbmQgaW4gUXVhcnRlcmx5IGFsc28gZm9yIHRoZSBxdWFydGVyIGJhcnMuICovXHJcbiAgZ2V0IHRyZW5kTG9hZGluZygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmxvYWRpbmcgfHwgKHRoaXMuZ3JhaW4gPT09ICdxdWFydGVyJyAmJiB0aGlzLnF1YXJ0ZXJUcmVuZExvYWRpbmcpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEJhcnMgdGhlIHRyZW5kIGNoYXJ0IGRyYXdzOiB0aGUgZm91ciBxdWFydGVycywgb3IgdGhlIEFQSSdzIGJ5LWRhdGUgYnVja2V0cy4gKi9cclxuICBnZXQgdHJlbmRCYXJzKCk6IFRyZW5kQmFyW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ3JhaW4gPT09ICdxdWFydGVyJyA/IHRoaXMucXVhcnRlclRyZW5kIDogdGhpcy50cmVuZDtcclxuICB9XHJcblxyXG4gIC8qKiBNb3JlIGJhcnMgdGhhbiBmaXQgdGhlaXIgbGFiZWxzIChhIG1vbnRoIGJ5IGRhdGUpOiBzZWUgc2hvd1hMYWJlbC4gKi9cclxuICBnZXQgZGVuc2VUcmVuZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnRyZW5kQmFycy5sZW5ndGggPiAxMjtcclxuICB9XHJcblxyXG4gIC8qKiBEZW5zZSBjaGFydDogYSBsYWJlbCBvbiBldmVyeSBmZXcgYmFycyAoYWJvdXQgOCBhY3Jvc3MpLCBhbHdheXMgb24gdGhlIGZpcnN0IGFuZCBsYXN0OyBvdGhlcndpc2UgZXZlcnkgYmFyLiAqL1xyXG4gIHNob3dYTGFiZWwoaTogbnVtYmVyLCBsYXN0OiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBuID0gdGhpcy50cmVuZEJhcnMubGVuZ3RoO1xyXG4gICAgaWYgKG4gPD0gMTIpIHsgcmV0dXJuIHRydWU7IH1cclxuICAgIGNvbnN0IHN0ZXAgPSBNYXRoLmNlaWwobiAvIDgpO1xyXG4gICAgLy8gVGhlIGxhc3QgbGFiZWwgYWx3YXlzIHNob3dzOyB0aGUgcmVndWxhciBvbmUganVzdCBiZWZvcmUgaXQgaXMgc2tpcHBlZCB3aGVuIHRoZSB0d28gd291bGQgdG91Y2guXHJcbiAgICByZXR1cm4gbGFzdCB8fCAoaSAlIHN0ZXAgPT09IDAgJiYgbiAtIDEgLSBpID49IHN0ZXAgLSAxKTtcclxuICB9XHJcblxyXG4gIC8qKiBcIk9jdCDigJMgRGVjIDIwMjZcIiBmb3IgYSBxdWFydGVyIGtleS4gKi9cclxuICBxdWFydGVyTW9udGhzKGtleTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmZpc2NhbC5maW5kKHEgPT4gcS5rZXkgPT09IGtleSk/Lm1vbnRocyB8fCAnJztcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICAvKiogU3RvcmVzIHRpY2tlZCBpbiB0aGUgZ2xvYmFsIGhlYWRlci4gKi9cclxuICBwcml2YXRlIGhlYWRlclN0b3JlSWRzKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiAodGhpcy5oZWFkZXJEYXRhPy5zdG9yZXMgfHwgW10pLmZpbHRlcigoczogYW55KSA9PiBzLmNoZWNrZWQpLm1hcCgoczogYW55KSA9PiBzLnN0b3JlSWQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgaGllcmFyY2h5QXBwbGllZCgpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGEgPSB0aGlzLmFwcGxpZWQ7XHJcbiAgICByZXR1cm4gISEoYS5jaXJjbGUgfHwgYS56b25lIHx8IGEuYW9tIHx8IGEuc3RvcmUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtYXRjaGVzU2NvcGUocjogQXVkaXRSb3csIHBpY2s6IFNjb3BlUGljayk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICghcGljay5jaXJjbGUgfHwgci5jaXJjbGUgPT09IHBpY2suY2lyY2xlKSAmJiAoIXBpY2suem9uZSB8fCByLnpvbmUgPT09IHBpY2suem9uZSlcclxuICAgICAgJiYgKCFwaWNrLmFvbSB8fCByLmFvbSA9PT0gcGljay5hb20pICYmICghcGljay5zdG9yZSB8fCBTdHJpbmcoci5yYXc/LnN0b3JlSWQpID09PSBwaWNrLnN0b3JlKTtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgc3RvcmVzIGV2ZXJ5IGZlZWQgcmVhZHM6IHRoZSBoZWFkZXIncywgbmFycm93ZWQgdG8gdGhlIGFwcGxpZWQgaGllcmFyY2h5IHBpY2suICovXHJcbiAgcHJpdmF0ZSBzY29wZWRTdG9yZUlkcygpOiBzdHJpbmdbXSB7XHJcbiAgICBpZiAoIXRoaXMuaGllcmFyY2h5QXBwbGllZCkgeyByZXR1cm4gdGhpcy5oZWFkZXJTdG9yZUlkcygpOyB9XHJcbiAgICByZXR1cm4gdGhpcy5zY29wZVJvd3MuZmlsdGVyKHIgPT4gdGhpcy5tYXRjaGVzU2NvcGUociwgdGhpcy5hcHBsaWVkKSkubWFwKHIgPT4gU3RyaW5nKHIucmF3Py5zdG9yZUlkIHx8ICcnKSkuZmlsdGVyKEJvb2xlYW4pO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBhcHBsaWVkIEF1ZGl0IHR5cGUgYXMgdGhlIEFQSXMgdGFrZSBpdCAobm90aGluZyBmb3IgQWxsIEF1ZGl0cykuICovXHJcbiAgcHJpdmF0ZSBhdWRpdEZpbHRlcigpOiB7IGNoZWNrbGlzdElkPzogc3RyaW5nIH0ge1xyXG4gICAgcmV0dXJuIHRoaXMuYXBwbGllZC5hdWRpdFR5cGUgIT09ICdhbGwnID8geyBjaGVja2xpc3RJZDogdGhpcy5hcHBsaWVkLmF1ZGl0VHlwZSB9IDoge307XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJhc2VQYXlsb2FkKGV4dHJhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGZyb21EYXRlOiB0aGlzLmZyb20gfHwgdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5zdGFydERhdGUsXHJcbiAgICAgIHRvRGF0ZTogdGhpcy50byB8fCB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LmVuZERhdGUsXHJcbiAgICAgIHN0b3JlSWQ6IHRoaXMuc2NvcGVkU3RvcmVJZHMoKSxcclxuICAgICAgLi4udGhpcy5hdWRpdEZpbHRlcigpLFxyXG4gICAgICBjbGllbnRJZDogdGhpcy5oZWFkZXJEYXRhPy5jbGllbnQsXHJcbiAgICAgIHVzZXJFbWFpbGVzOiB0aGlzLnVzZXJFbWFpbGVzLFxyXG4gICAgICBsaW1pdDogMTAwMCxcclxuICAgICAgb2Zmc2V0OiAwLFxyXG4gICAgICBzb3J0Qnk6ICcnLFxyXG4gICAgICBzb3J0Q29sdW1uTmFtZTogJycsXHJcbiAgICAgIHNlYXJjaFZhbHVlOiAnJyxcclxuICAgICAgZXhwb3J0OiBmYWxzZSxcclxuICAgICAgLi4uZXh0cmFcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIGZvdXIgZmVlZHMgbG9hZCB0b2dldGhlcjsgYSBmYWlsdXJlIGluIG9uZSBsZWF2ZXMgdGhlIG90aGVycyBpbnRhY3QuICovXHJcbiAgcHJpdmF0ZSBsb2FkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIGNvbnN0IHNhZmUgPSAobzogYW55KSA9PiBvLnBpcGUoY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsKSkpO1xyXG4gICAgY29uc3Qgc2NvcGUgPSB0aGlzLmJhc2VQYXlsb2FkKCk7XHJcbiAgICAvLyBSb3dzIGZldGNoZWQgZm9yIHRoZSB3aG9sZSBoZWFkZXIgc2NvcGUgcmVmaWxsIHRoZSBoaWVyYXJjaHkgbGlzdHM7IG5hcnJvd2VkIG9uZXMgZG8gbm90LlxyXG4gICAgY29uc3QgbmFycm93ZWQgPSB0aGlzLmhpZXJhcmNoeUFwcGxpZWQ7XHJcbiAgICBmb3JrSm9pbih7XHJcbiAgICAgIC8vIFRoZSBhdWRpdCBkYXNoYm9hcmQgQVBJIHJlamVjdHMgdW5rbm93biBrZXlzLCBzbyBvbmx5IHRoZSBzY29wZSBpcyBzZW50LlxyXG4gICAgICBkYXNoOiBzYWZlKHRoaXMudHJheFNlcnZpY2UuYXVkaXREYXNoYm9hcmQoe1xyXG4gICAgICAgIGNsaWVudElkOiBzY29wZVsnY2xpZW50SWQnXSwgZnJvbURhdGU6IHNjb3BlWydmcm9tRGF0ZSddLCB0b0RhdGU6IHNjb3BlWyd0b0RhdGUnXSwgc3RvcmVJZDogc2NvcGVbJ3N0b3JlSWQnXSxcclxuICAgICAgICAuLi50aGlzLmF1ZGl0RmlsdGVyKClcclxuICAgICAgfSkpLFxyXG4gICAgICAvLyBTYW1lIHRhYmxlcyBhcyB0aGUgY2hlY2tsaXN0IGRhc2hib2FyZCwgbGltaXRlZCBzZXJ2ZXItc2lkZSB0byB0aGlzIGNsaWVudCdzIGF1ZGl0cy5cclxuICAgICAgYXVkaXRzOiBzYWZlKHRoaXMudHJheFNlcnZpY2UuYXVkaXRDaGVja2xpc3RQZXJmb3JtYW5jZSh0aGlzLmJhc2VQYXlsb2FkKHsgbGltaXQ6IDIwMCB9KSkpLFxyXG4gICAgICBzdG9yZXM6IHNhZmUodGhpcy50cmF4U2VydmljZS5hdWRpdFN0b3JlUGVyZm9ybWFuY2UodGhpcy5iYXNlUGF5bG9hZCh7IGxpbWl0OiAxMDAwIH0pKSksXHJcbiAgICAgIHVzZXJzOiBzYWZlKHRoaXMudHJheFNlcnZpY2UuYXVkaXRVc2VyUGVyZm9ybWFuY2UodGhpcy5iYXNlUGF5bG9hZCh7IGxpbWl0OiA1MDAgfSkpKVxyXG4gICAgfSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoeyBkYXNoLCBhdWRpdHMsIHN0b3JlcywgdXNlcnMgfTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSBkYXNoPy5jb2RlID09PSAyMDAgPyAoZGFzaC5kYXRhIHx8IHt9KSA6IHt9O1xyXG4gICAgICBjb25zdCBhdWRpdExpc3QgPSBhdWRpdHM/LmNvZGUgPT09IDIwMCA/IChhdWRpdHMuZGF0YT8uY2hlY2tsaXN0UGVyZm9ybWFuY2UgfHwgW10pIDogW107XHJcbiAgICAgIGNvbnN0IHN0b3JlTGlzdCA9IHN0b3Jlcz8uY29kZSA9PT0gMjAwID8gKHN0b3Jlcy5kYXRhPy5zdG9yZVBlcmZvcm1hbmNlIHx8IFtdKSA6IFtdO1xyXG4gICAgICBjb25zdCB1c2VyTGlzdCA9IHVzZXJzPy5jb2RlID09PSAyMDAgPyAodXNlcnMuZGF0YT8udXNlclBlcmZvcm1hbmNlIHx8IFtdKSA6IFtdO1xyXG5cclxuICAgICAgdGhpcy5wYXNzTWFyayA9IE51bWJlcihkYXRhLnN1bW1hcnk/LnBhc3NNYXJrKSB8fCBQQVNTX01BUks7XHJcbiAgICAgIHRoaXMucGFzc01hcmtNaXhlZCA9ICEhZGF0YS5zdW1tYXJ5Py5wYXNzTWFya01peGVkO1xyXG4gICAgICB0aGlzLmNyaXRpY2FsTWFyayA9IE51bWJlcihkYXRhLnN1bW1hcnk/LmNyaXRpY2FsTWFyaykgfHwgQ1JJVElDQUxfTUFSSztcclxuICAgICAgdGhpcy5yb3dzID0gKGRhdGEuc3RvcmVzIHx8IFtdKS5tYXAoKHM6IGFueSkgPT4gdGhpcy50b0F1ZGl0Um93KHMpKTtcclxuICAgICAgaWYgKCFuYXJyb3dlZCAmJiBkYXNoPy5jb2RlID09PSAyMDApIHsgdGhpcy5zY29wZVJvd3MgPSB0aGlzLnJvd3M7IH1cclxuICAgICAgdGhpcy5zdG9yZVBlcmYgPSBzdG9yZUxpc3QubWFwKChyOiBhbnkpID0+IHRoaXMudG9TdG9yZVBlcmYocikpO1xyXG4gICAgICB0aGlzLnRyZW5kID0gKGRhdGEudHJlbmQgfHwgW10pLm1hcCgoYjogYW55KSA9PiAoe1xyXG4gICAgICAgIGtleTogU3RyaW5nKGIua2V5KSwgbGFiZWw6IFN0cmluZyhiLmxhYmVsKSxcclxuICAgICAgICB2YWx1ZTogYi52YWx1ZSA9PT0gbnVsbCB8fCBiLnZhbHVlID09PSB1bmRlZmluZWQgPyBudWxsIDogTnVtYmVyKGIudmFsdWUpLFxyXG4gICAgICAgIGNvdW50OiBOdW1iZXIoYi5jb3VudCkgfHwgMCxcclxuICAgICAgICAvLyBPbGRlciBBUEkgYnVpbGRzIHNlbmQgb25seSBjb3VudCAoZXZlcnkgYXVkaXQgd2FzIHNjb3JlZCB0aGVuKS5cclxuICAgICAgICBzdWJtaXR0ZWQ6IE51bWJlcihiLnN1Ym1pdHRlZCA/PyBiLmNvdW50KSB8fCAwLFxyXG4gICAgICAgIHBhc3NNYXJrOiB0aGlzLm51bShiLnBhc3NNYXJrKVxyXG4gICAgICB9KSk7XHJcbiAgICAgIHRoaXMuYXVkaXRQZXJmID0gYXVkaXRMaXN0Lm1hcCgocjogYW55KSA9PiB0aGlzLnRvQXVkaXRQZXJmKHIpKTtcclxuICAgICAgdGhpcy51c2VyUGVyZiA9IHVzZXJMaXN0Lm1hcCgocjogYW55KSA9PiB0aGlzLnRvVXNlclBlcmYocikpO1xyXG4gICAgICB0aGlzLnBlcmZQYWdlID0gMTtcclxuICAgICAgdGhpcy5sYXN0UmVmcmVzaGVkID0gZGF5anMoKS5mb3JtYXQoJ2hoOm1tOnNzIEEnKTtcclxuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPbmUgc3RvcmUgZnJvbSB0aGUgYXVkaXQgZGFzaGJvYXJkIEFQSTogc2NvcmUgaXMgdGhlIG1lYW4gb2YgaXRzIGNvbXBsaWFuY2Utc2NvcmVkIGF1ZGl0cyBpbiB0aGUgcGVyaW9kLFxyXG4gICAqIG51bGwgd2hlbiBub25lLiBBIHN0b3JlIHdpdGggc3VibWl0dGVkIGF1ZGl0cyBidXQgbm8gc2NvcmUgaXMgJ3Vuc2NvcmVkJyAoaXRzIGF1ZGl0cyBoYXZlIG5vIHF1ZXN0aW9uIHdpdGhcclxuICAgKiBjb21wbGlhbmNlIHNjb3Jpbmcgb24pLCBub3QgXCJOb3QgYXVkaXRlZFwiLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgdG9BdWRpdFJvdyhzOiBhbnkpOiBBdWRpdFJvdyB7XHJcbiAgICBjb25zdCBzY29yZSA9IHRoaXMubnVtKHM/LnNjb3JlKTtcclxuICAgIGxldCBzdGF0dXM6IFN0b3JlU3RhdHVzO1xyXG4gICAgaWYgKHNjb3JlICE9PSBudWxsKSB7XHJcbiAgICAgIC8vIFRoZSBzdG9yZSdzIG93biBwYXNzIG1hcms6IGl0cyBzY29yZWQgYXVkaXRzJyBjb25maWd1cmVkIG1hcmtzIChhbiBvbGRlciBBUEkgc2VuZHMgbm9uZTogdGhlIHBhZ2UncykuXHJcbiAgICAgIHN0YXR1cyA9IHNjb3JlID49ICh0aGlzLm51bShzPy5wYXNzTWFyaykgPz8gdGhpcy5wYXNzTWFyaykgPyAncGFzcycgOiAnZmFpbCc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzdGF0dXMgPSBzPy5zdGF0dXMgPT09ICd1bnNjb3JlZCcgfHwgKHRoaXMubnVtKHM/LmF1ZGl0cykgPz8gMCkgPiAwID8gJ3Vuc2NvcmVkJyA6ICduYSc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBkYXRlOiBzPy5sYXN0QXVkaXREYXRlID8gdGhpcy5mbXQocy5sYXN0QXVkaXREYXRlKSA6ICfigJQnLFxyXG4gICAgICAvLyBUaGUgc3RvcmUncyBuYW1lIChoaWVyYXJjaHksIGl0cyBzdWJtaXNzaW9ucywgb3IgdGhlIHN0b3JlcyBsaXN0KTsgXCLigJRcIiB3aGVuIGl0IGhhcyBub25lLCBuZXZlciB0aGUgaWQuXHJcbiAgICAgIHN0b3JlSWQ6IHM/LnN0b3JlTmFtZSB8fCAn4oCUJyxcclxuICAgICAgY2lyY2xlOiBzPy5jaXJjbGUgfHwgJ+KAlCcsXHJcbiAgICAgIHpvbmU6IHM/LnpvbmUgfHwgJ+KAlCcsXHJcbiAgICAgIGFvbTogcz8uYW9tIHx8ICfigJQnLFxyXG4gICAgICBhdWRpdHM6IHRoaXMubnVtKHM/LmF1ZGl0cykgPz8gMCxcclxuICAgICAgc2NvcmU6IHNjb3JlID09PSBudWxsID8gbnVsbCA6IE1hdGgucm91bmQoc2NvcmUpLFxyXG4gICAgICBzdGF0dXMsXHJcbiAgICAgIHJhdzogc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9uZSBzdG9yZSBmcm9tIC9hdWRpdC9kYXNoYm9hcmQvc3RvcmVQZXJmb3JtYW5jZSAoYXVkaXQgY29weSBvZiB0aGUgY2hlY2tsaXN0IGRhc2hib2FyZCdzIHRhYmxlKTogZXZlcnkgYXVkaXRcclxuICAgKiB2aXNpdCBpbiB0aGUgcGVyaW9kLCBzbyBjb21wbGV0aW9uID0gc3VibWl0dGVkIC8gYXNzaWduZWQgYW5kIGZsYWdzIGNvdW50LCB1bmxpa2UgdGhlIHNjb3JlLW9ubHkgc3RvcmUgbGlzdC5cclxuICAgKi9cclxuICBwcml2YXRlIHRvU3RvcmVQZXJmKHI6IGFueSk6IFN0b3JlUGVyZlJvdyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzdG9yZUlkOiByPy5zdG9yZV9pZCB8fCAnJyxcclxuICAgICAgc3RvcmU6IHI/LnN0b3JlTmFtZSB8fCAn4oCUJyxcclxuICAgICAgc3BvYzogcj8udXNlckVtYWlsIHx8ICfigJQnLFxyXG4gICAgICBhc3NpZ25lZDogdGhpcy5udW0ocj8uY2hlY2tMaXN0Q291bnQpID8/IDAsXHJcbiAgICAgIGZsYWdzOiB0aGlzLm51bShyPy5mbGFnZ2VkQ291bnQpLFxyXG4gICAgICBjb21wbGV0aW9uOiB0aGlzLnBjdFRleHQocj8uY29tcGxldGlvbiksXHJcbiAgICAgIGNvbXBsaWFuY2U6IHRoaXMucGN0VGV4dChyPy5jb21wbGlhbmNlKSxcclxuICAgICAgcGVyZjogdGhpcy5wY3RUZXh0KHI/LnBlcmZvcm1hbmNlKSxcclxuICAgICAgcmF3OiByXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQmFyIGZpbGwgZm9yIGEgcGVyY2VudGFnZSAobnVtYmVyLCBvciB0ZXh0IGxpa2UgXCI1MSVcIiAvIFwiLTI1JVwiKToga2VwdCB0byAwLTEwMC4gQSBuZWdhdGl2ZSBzY29yZSAob3B0aW9uXHJcbiAgICogc2NvcmVzIGNhbiBiZSBuZWdhdGl2ZSBwZW5hbHRpZXMpIHdvdWxkIG90aGVyd2lzZSBzZXQgYW4gaW52YWxpZCBuZWdhdGl2ZSB3aWR0aCwgd2hpY2ggdGhlIGJyb3dzZXIgZHJvcHMsXHJcbiAgICogZHJhd2luZyB0aGUgYmFyIGZ1bGw7IGl0IGlzIGVtcHR5IGluc3RlYWQsIHdoaWxlIHRoZSBudW1iZXIgYmVzaWRlIGl0IHN0aWxsIHNob3dzIHRoZSByZWFsIHNjb3JlLlxyXG4gICAqL1xyXG4gIGJhcldpZHRoKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG4gPSB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInID8gdmFsdWUgOiBwYXJzZUZsb2F0KFN0cmluZyh2YWx1ZSA/PyAnJykucmVwbGFjZSgnJScsICcnKSk7XHJcbiAgICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKG4pID8gTWF0aC5tYXgoMCwgTWF0aC5taW4oMTAwLCBuKSkgKyAnJScgOiAnMCUnO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0b0F1ZGl0UGVyZihyOiBhbnkpOiBBdWRpdFBlcmZSb3cge1xyXG4gICAgY29uc3QgbmFtZSA9IHI/LmNoZWNrTGlzdE5hbWUgfHwgJ+KAlCc7XHJcbiAgICAvLyBObyBxdWVzdGlvbiBvZiB0aGUgYXVkaXQgaGFzIGNvbXBsaWFuY2Ugc2NvcmluZyBvbjogbm8gc2NvcmUgYW5kIG5vIHJlc3VsdCAodGhlIEFQSSBzZW5kcyBudWxsKS5cclxuICAgIGNvbnN0IHNjb3JlID0gcj8uY29tcGxpYW5jZUVuYWJsZWQgPT09IGZhbHNlID8gbnVsbCA6IHRoaXMubnVtKHI/LnF1ZXN0aW9uQ29tcGxpYW5jZSk7XHJcbiAgICBjb25zdCBzY29yZVBjdCA9IHNjb3JlID09PSBudWxsID8gMCA6IE1hdGgucm91bmQoc2NvcmUpO1xyXG4gICAgLy8gVGhlIGF1ZGl0J3Mgb3duIHBhc3MgbWFyayB3aGVuIHRoZSBBUEkgc2VuZHMgaXQsIGVsc2UgdGhlIGRhc2hib2FyZCdzIChzdW1tYXJ5LnBhc3NNYXJrKS5cclxuICAgIGNvbnN0IG1hcmsgPSB0aGlzLm51bShyPy5wYXNzTWFyaykgPz8gdGhpcy5wYXNzTWFyaztcclxuICAgIHJldHVybiB7XHJcbiAgICAgIG5hbWUsXHJcbiAgICAgIGluaXRpYWxzOiBTdHJpbmcocj8uY2hlY2tMaXN0Q2hhciB8fCBuYW1lLnNsaWNlKDAsIDIpKS50b1VwcGVyQ2FzZSgpLFxyXG4gICAgICBzY2hlZHVsZWQ6IHI/LnNjaGVkdWxlUmVwZWF0ZWRUeXBlID8gdGhpcy50aXRsZUNhc2Uoci5zY2hlZHVsZVJlcGVhdGVkVHlwZSkgOiAn4oCUJyxcclxuICAgICAgYXNzaWduZWQ6IHRoaXMubnVtKHI/LnN0b3JlQ291bnQpID8/IDAsXHJcbiAgICAgIHN1Ym1pdHRlZDogdGhpcy5udW0ocj8uc3VibWl0dGVkQ2hlY2tsaXN0KSA/PyAwLFxyXG4gICAgICAvLyBRdWVzdGlvbnMgd2l0aCBhIHN0b3JlIGRpc3B1dGUgKHJhaXNlZCBvciByZXZpZXdlZCkgaW4gdGhlIHBlcmlvZDsgJ+KAlCcgb25seSB3aGVuIHRoZSBBUEkgc2VuZHMgbm9uZS5cclxuICAgICAgZGlzcHV0ZXM6IHRoaXMubnVtKHI/LmRpc3B1dGVzKSxcclxuICAgICAgcGFzc01hcms6IG1hcmsgKyAnJScsXHJcbiAgICAgIHNjb3JlOiBzY29yZSA9PT0gbnVsbCA/ICfigJQnIDogc2NvcmVQY3QgKyAnJScsXHJcbiAgICAgIHNjb3JlUGN0LFxyXG4gICAgICByZXN1bHQ6IHNjb3JlID09PSBudWxsID8gJ+KAlCcgOiAoc2NvcmVQY3QgPj0gbWFyayA/ICdQYXNzJyA6ICdGYWlsJyksXHJcbiAgICAgIHJhdzogclxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdG9Vc2VyUGVyZihyOiBhbnkpOiBVc2VyUGVyZlJvdyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBuYW1lOiByPy51c2VyTmFtZSB8fCAn4oCUJyxcclxuICAgICAgZW1haWw6IHI/LnVzZXJFbWFpbCB8fCAn4oCUJyxcclxuICAgICAgYXNzaWduZWQ6IHRoaXMubnVtKHI/LmNoZWNrTGlzdENvdW50KSA/PyAwLFxyXG4gICAgICBmbGFnczogdGhpcy5udW0ocj8uZmxhZ2dlZENvdW50KSA/PyAwLFxyXG4gICAgICByZWRvOiB0aGlzLm51bShyPy5yZWRvKSA/PyAwLFxyXG4gICAgICBjb21wbGV0aW9uOiB0aGlzLnBjdFRleHQocj8uY29tcGxldGlvbiksXHJcbiAgICAgIGNvbXBsaWFuY2U6IHRoaXMucGN0VGV4dChyPy5jb21wbGlhbmNlKSxcclxuICAgICAgcGVyZjogdGhpcy5wY3RUZXh0KHI/LnBlcmZvcm1hbmNlKSxcclxuICAgICAgcmF3OiByXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGFzayBtb2RlOiB0aWxlcyArIFRhc2sgUGVyZm9ybWFuY2Ugcm93cyBmb3IgdGhlIHRhc2tzIHJhaXNlZCBmcm9tIHRoaXMgY2xpZW50J3MgYXVkaXRzLCBpbiB0aGVcclxuICAgKiBjdXJyZW50IHNjb3BlLiBBIGZhaWxlZCBjYWxsIGxlYXZlcyAn4oCUJyBldmVyeXdoZXJlIGFuZCByZXRyaWVzIHRoZSBuZXh0IHRpbWUgdGhlIFRhc2sgdGFiIG9wZW5zLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgbG9hZFRhc2tzKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmhlYWRlckRhdGEpIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLnRhc2tzU3RhbGUgPSBmYWxzZTtcclxuICAgIHRoaXMudGFza0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgY29uc3QgcmVxdWVzdCA9ICsrdGhpcy50YXNrUmVxdWVzdDtcclxuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5iYXNlUGF5bG9hZCgpO1xyXG4gICAgLy8gVGhlIGVuZHBvaW50IHJlamVjdHMgdW5rbm93biBrZXlzLCBzbyBvbmx5IHRoZSBzY29wZSBpcyBzZW50LlxyXG4gICAgdGhpcy50cmF4U2VydmljZS5hdWRpdERhc2hib2FyZFRhc2tzKHtcclxuICAgICAgY2xpZW50SWQ6IHNjb3BlWydjbGllbnRJZCddLCBmcm9tRGF0ZTogc2NvcGVbJ2Zyb21EYXRlJ10sIHRvRGF0ZTogc2NvcGVbJ3RvRGF0ZSddLFxyXG4gICAgICBzdG9yZUlkOiBzY29wZVsnc3RvcmVJZCddLCB1c2VyRW1haWxlczogc2NvcGVbJ3VzZXJFbWFpbGVzJ10sIC4uLnRoaXMuYXVkaXRGaWx0ZXIoKVxyXG4gICAgfSkucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKG51bGwpKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXF1ZXN0ICE9PSB0aGlzLnRhc2tSZXF1ZXN0KSB7IHJldHVybjsgfVxyXG4gICAgICBjb25zdCBkYXRhID0gcmVzPy5jb2RlID09PSAyMDAgPyAocmVzLmRhdGEgfHwgbnVsbCkgOiBudWxsO1xyXG4gICAgICBpZiAoIWRhdGEpIHsgdGhpcy50YXNrc1N0YWxlID0gdHJ1ZTsgfVxyXG4gICAgICB0aGlzLnRhc2tTdGF0cyA9IHRoaXMudG9UYXNrU3RhdHMoZGF0YSk7XHJcbiAgICAgIHRoaXMudGFza1BlcmYgPSAoZGF0YT8udGFza3MgfHwgW10pLm1hcCgodDogYW55KSA9PiB0aGlzLnRvVGFza1BlcmYodCkpO1xyXG4gICAgICB0aGlzLmxhc3RSZWZyZXNoZWQgPSBkYXlqcygpLmZvcm1hdCgnaGg6bW06c3MgQScpO1xyXG4gICAgICB0aGlzLnRhc2tMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRvVGFza1N0YXRzKGQ6IGFueSk6IFRhc2tTdGF0cyB7XHJcbiAgICB0aGlzLnRhc2tEZWx0YVZhbHVlcyA9IHtcclxuICAgICAgY29tcGxldGlvbjogdGhpcy5udW0oZD8uZGVsdGFzPy5jb21wbGV0aW9uKSxcclxuICAgICAgY29tcGxpYW5jZTogdGhpcy5udW0oZD8uZGVsdGFzPy5jb21wbGlhbmNlKSxcclxuICAgICAgZmxhZ3M6IHRoaXMubnVtKGQ/LmRlbHRhcz8uZmxhZ3MpXHJcbiAgICB9O1xyXG4gICAgaWYgKCFkKSB7IHJldHVybiB7IC4uLkVNUFRZX1RBU0tfU1RBVFMgfTsgfVxyXG4gICAgY29uc3QgY291bnQgPSAodjogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IG4gPSB0aGlzLm51bSh2KTtcclxuICAgICAgcmV0dXJuIG4gPT09IG51bGwgPyAn4oCUJyA6IG4udG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJyk7XHJcbiAgICB9O1xyXG4gICAgY29uc3QgZGF5cyA9IHRoaXMubnVtKGQ/LnBlcmlvZD8ucHJldmlvdXM/LmRheXMpID8/IDE7XHJcbiAgICBjb25zdCB2cyA9IGRheXMgPT09IDEgPyAndnMgbGFzdCBkYXknIDogJ3ZzIHByZXZpb3VzICcgKyBkYXlzICsgJyBkYXlzJztcclxuICAgIGNvbnN0IGRlbHRhID0gKHY6IG51bWJlciB8IG51bGwpID0+ICh2ID09PSBudWxsID8gJycgOiBNYXRoLmFicyh2KSArICclICcgKyB2cyk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBhY3RpdmVUYXNrczogY291bnQoZC5hY3RpdmVUYXNrcyksXHJcbiAgICAgIHRhc2tJbnN0YW5jZXM6IGNvdW50KGQudGFza0luc3RhbmNlcyksXHJcbiAgICAgIG5vdFN1Ym1pdHRlZDogY291bnQoZC5ub3RTdWJtaXR0ZWQpLFxyXG4gICAgICBvcGVuVGFza3M6IGNvdW50KGQub3BlblRhc2tzKSxcclxuICAgICAgaW5Qcm9ncmVzczogY291bnQoZC5pblByb2dyZXNzKSxcclxuICAgICAgc3VibWl0dGVkOiBjb3VudChkLnN1Ym1pdHRlZCksXHJcbiAgICAgIGNvbXBsZXRpb25TY29yZTogdGhpcy5wY3RUZXh0KGQuY29tcGxldGlvblNjb3JlKSxcclxuICAgICAgY29tcGxpYW5jZVNjb3JlOiB0aGlzLnBjdFRleHQoZC5jb21wbGlhbmNlU2NvcmUpLFxyXG4gICAgICB0b3RhbEZsYWdzOiBjb3VudChkLnRvdGFsRmxhZ3MpLFxyXG4gICAgICBjb21wbGV0aW9uRGVsdGE6IGRlbHRhKHRoaXMudGFza0RlbHRhVmFsdWVzLmNvbXBsZXRpb24pLFxyXG4gICAgICBjb21wbGlhbmNlRGVsdGE6IGRlbHRhKHRoaXMudGFza0RlbHRhVmFsdWVzLmNvbXBsaWFuY2UpLFxyXG4gICAgICBmbGFnc0RlbHRhOiBkZWx0YSh0aGlzLnRhc2tEZWx0YVZhbHVlcy5mbGFncylcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKiogT25lIHRhc2sgcmFpc2VkIGZyb20gYW4gYXVkaXQ7IGNvbXBsaWFuY2UgaXMgJ+KAlCcgd2hpbGUgdGFzayBpbnN0YW5jZXMgY2Fycnkgbm8gc2NvcmUuICovXHJcbiAgcHJpdmF0ZSB0b1Rhc2tQZXJmKHQ6IGFueSk6IFRhc2tQZXJmUm93IHtcclxuICAgIGNvbnN0IG5hbWUgPSB0Py50YXNrTmFtZSB8fCAn4oCUJztcclxuICAgIGNvbnN0IGNvbXBsaWFuY2UgPSB0aGlzLm51bSh0Py5jb21wbGlhbmNlKTtcclxuICAgIGNvbnN0IHJhaXNlZCA9IHRoaXMubnVtKHQ/LnRhc2tzKTtcclxuICAgIGxldCBzY2hlZHVsZWQgPSAn4oCUJztcclxuICAgIGlmICh0Py5zY2hlZHVsZVJlcGVhdGVkVHlwZSkge1xyXG4gICAgICBzY2hlZHVsZWQgPSB0aGlzLnRpdGxlQ2FzZSh0LnNjaGVkdWxlUmVwZWF0ZWRUeXBlKTtcclxuICAgIH0gZWxzZSBpZiAodD8uZHVlRGF0ZSkge1xyXG4gICAgICBzY2hlZHVsZWQgPSAnRHVlICcgKyB0aGlzLmZtdCh0LmR1ZURhdGUpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY3JlYXRlZEJ5ID0gdD8uY3JlYXRlZEJ5TmFtZSB8fCAnJztcclxuICAgIGNvbnN0IGNyZWF0ZWQgPSB0Py5jcmVhdGVkQXQgJiYgZGF5anModC5jcmVhdGVkQXQpLmlzVmFsaWQoKSA/IGRheWpzKHQuY3JlYXRlZEF0KSA6IG51bGw7XHJcbiAgICBjb25zdCBkdWUgPSB0Py5kdWVEYXRlICYmIGRheWpzKHQuZHVlRGF0ZSkuaXNWYWxpZCgpID8gZGF5anModC5kdWVEYXRlKSA6IG51bGw7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBuYW1lLFxyXG4gICAgICBpbml0aWFsczogbmFtZS5zbGljZSgwLCAyKS50b1VwcGVyQ2FzZSgpLFxyXG4gICAgICBjcmVhdGVkQnk6IGNyZWF0ZWRCeSB8fCAnLS0nLFxyXG4gICAgICBjcmVhdGVkQnlJbml0aWFsczogY3JlYXRlZEJ5ID8gY3JlYXRlZEJ5LnJlcGxhY2UoL1teQS1aYS16XS9nLCAnJykuc2xpY2UoMCwgMikudG9VcHBlckNhc2UoKSA6ICctLScsXHJcbiAgICAgIGNyZWF0ZWRPbjogY3JlYXRlZCA/IGNyZWF0ZWQuZm9ybWF0KCdERCBNTU0gWVlZWScpIDogJy0tJyxcclxuICAgICAgY3JlYXRlZE9uSXNvOiBjcmVhdGVkID8gY3JlYXRlZC50b0lTT1N0cmluZygpIDogJycsXHJcbiAgICAgIHByaW9yaXR5OiB0Py5wcmlvcml0eVR5cGUgPyB0aGlzLnRpdGxlQ2FzZSh0LnByaW9yaXR5VHlwZSkgOiAnLS0nLFxyXG4gICAgICBkdWVPbjogZHVlID8gZHVlLmZvcm1hdCgnREQgTU1NIFlZWVknKSA6ICctLScsXHJcbiAgICAgIGR1ZUlzbzogZHVlID8gZHVlLnRvSVNPU3RyaW5nKCkgOiAnJyxcclxuICAgICAgc2NoZWR1bGVkLFxyXG4gICAgICBjb3ZlcmFnZTogdD8uY292ZXJhZ2UgPyB0aGlzLnRpdGxlQ2FzZSh0LmNvdmVyYWdlKSA6ICfigJQnLFxyXG4gICAgICBhc3NpZ25lZDogdGhpcy5udW0odD8uYXNzaWduZWQpID8/IDAsXHJcbiAgICAgIHN1Ym1pdHRlZDogdGhpcy5udW0odD8uc3VibWl0dGVkKSA/PyAwLFxyXG4gICAgICBmbGFnczogdGhpcy5udW0odD8uZmxhZ3MpID8/IDAsXHJcbiAgICAgIHRhc2tzOiByYWlzZWQgPT09IG51bGwgPyAn4oCUJyA6IFN0cmluZyhyYWlzZWQpLFxyXG4gICAgICByZWRvOiB0aGlzLm51bSh0Py5yZWRvKSA/PyAwLFxyXG4gICAgICBjb21wbGlhbmNlOiB0aGlzLnBjdFRleHQoY29tcGxpYW5jZSksXHJcbiAgICAgIGNvbXBsaWFuY2VQY3Q6IGNvbXBsaWFuY2UgPT09IG51bGwgPyAwIDogTWF0aC5yb3VuZChjb21wbGlhbmNlKSxcclxuICAgICAgcmF3OiB0XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqIERlbHRhIHN0eWxpbmc6IGFycm93IGRpcmVjdGlvbiwgYW5kIGNvbG91ciBieSB3aGV0aGVyIHRoZSBtb3ZlIGlzIGdvb2QgKG1vcmUgZmxhZ3MgaXMgYmFkKS4gKi9cclxuICB0YXNrRGVsdGFDbGFzcyhrZXk6IFRhc2tEZWx0YUtleSk6IHN0cmluZyB7XHJcbiAgICBjb25zdCB2ID0gdGhpcy50YXNrRGVsdGFWYWx1ZXNba2V5XTtcclxuICAgIGlmICh2ID09PSBudWxsIHx8IHYgPT09IDApIHsgcmV0dXJuICdpcy1mbGF0JzsgfVxyXG4gICAgY29uc3QgdXAgPSB2ID4gMDtcclxuICAgIGNvbnN0IGdvb2QgPSBrZXkgPT09ICdmbGFncycgPyAhdXAgOiB1cDtcclxuICAgIHJldHVybiAodXAgPyAnaXMtdXAnIDogJ2lzLWRvd24nKSArICcgJyArIChnb29kID8gJ2lzLWdvb2QnIDogJ2lzLWJhZCcpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBudW0odjogYW55KTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICBpZiAodiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWQgfHwgdiA9PT0gJycpIHsgcmV0dXJuIG51bGw7IH1cclxuICAgIGNvbnN0IG4gPSBOdW1iZXIodik7XHJcbiAgICByZXR1cm4gaXNOYU4obikgPyBudWxsIDogbjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGN0VGV4dCh2OiBhbnkpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbiA9IHRoaXMubnVtKHYpO1xyXG4gICAgcmV0dXJuIG4gPT09IG51bGwgPyAn4oCUJyA6IE1hdGgucm91bmQobikgKyAnJSc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRpdGxlQ2FzZSh2OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHYuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB2LnNsaWNlKDEpLnRvTG93ZXJDYXNlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZtdCh2OiBhbnkpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHYgPyBkYXlqcyh2KS5mb3JtYXQoJ01NTSBERCwgWVlZWScpIDogJ+KAlCc7XHJcbiAgfVxyXG5cclxuICAvKiogUm93cyBhZnRlciBzZWFyY2gsIHN0YXR1cyBhbmQgc2NvcmUtYmFuZCBmaWx0ZXJzLiAqL1xyXG4gIGdldCBmaWx0ZXJlZFJvd3MoKTogQXVkaXRSb3dbXSB7XHJcbiAgICBjb25zdCBxID0gdGhpcy5zZWFyY2gudHJpbSgpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICByZXR1cm4gdGhpcy5yb3dzXHJcbiAgICAgIC5maWx0ZXIociA9PiB0aGlzLnN0YXR1cyA9PT0gJ2FsbCcgfHwgci5zdGF0dXMgPT09IHRoaXMuc3RhdHVzKVxyXG4gICAgICAuZmlsdGVyKHIgPT4ge1xyXG4gICAgICAgIGlmIChyLnNjb3JlID09PSBudWxsKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5zY29yZU1pbiA9PT0gMCAmJiB0aGlzLnNjb3JlTWF4ID09PSAxMDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIEEgbG93ZXIgYm91bmQgb2YgMCBpcyBvcGVuOiBwZW5hbHR5IHNjb3JlcyBjYW4gdGFrZSBhIHN0b3JlIGJlbG93IDAlIChDcml0aWNhbCkuXHJcbiAgICAgICAgcmV0dXJuICh0aGlzLnNjb3JlTWluIDw9IDAgfHwgci5zY29yZSA+PSB0aGlzLnNjb3JlTWluKSAmJiByLnNjb3JlIDw9IHRoaXMuc2NvcmVNYXg7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5maWx0ZXIociA9PiAhcSB8fCBbci5zdG9yZUlkLCByLmNpcmNsZSwgci56b25lLCByLmFvbSwgci5yYXc/LnN0b3JlTmFtZSB8fCAnJywgci5yYXc/LnN0b3JlSWQgfHwgJyddLnNvbWUodiA9PiBTdHJpbmcodikudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSkpXHJcbiAgICAgIC5zb3J0KChhLCBiKSA9PiB0aGlzLmNvbXBhcmUoYSwgYikpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb21wYXJlKGE6IEF1ZGl0Um93LCBiOiBBdWRpdFJvdyk6IG51bWJlciB7XHJcbiAgICBjb25zdCBkaXIgPSB0aGlzLnNvcnREaXIgPT09ICdhc2MnID8gMSA6IC0xO1xyXG4gICAgaWYgKHRoaXMuc29ydEtleSA9PT0gJ3Njb3JlJykge1xyXG4gICAgICAvLyBOb3QtYXVkaXRlZCBzdG9yZXMgKG5vIHNjb3JlKSBhbHdheXMgY29tZSBhZnRlciB0aGUgYXVkaXRlZCBvbmVzLCBpbiBlaXRoZXIgZGlyZWN0aW9uLFxyXG4gICAgICAvLyBzbyB0aGUgZmV3IGF1ZGl0ZWQgc3RvcmVzIGFyZSBub3QgYnVyaWVkIHVuZGVyIHRob3VzYW5kcyBvZiBcIk5vdCBhdWRpdGVkXCIgcm93cy5cclxuICAgICAgaWYgKGEuc2NvcmUgPT09IG51bGwgfHwgYi5zY29yZSA9PT0gbnVsbCkge1xyXG4gICAgICAgIHJldHVybiBhLnNjb3JlID09PSBiLnNjb3JlID8gMCA6IChhLnNjb3JlID09PSBudWxsID8gMSA6IC0xKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gKGEuc2NvcmUgLSBiLnNjb3JlKSAqIGRpcjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNvcnRLZXkgPT09ICdhdWRpdHMnKSB7XHJcbiAgICAgIHJldHVybiAoYS5hdWRpdHMgLSBiLmF1ZGl0cykgKiBkaXI7XHJcbiAgICB9XHJcbiAgICBjb25zdCBhdiA9IFN0cmluZyhhW3RoaXMuc29ydEtleSBhcyBrZXlvZiBBdWRpdFJvd10gPz8gJycpO1xyXG4gICAgY29uc3QgYnYgPSBTdHJpbmcoYlt0aGlzLnNvcnRLZXkgYXMga2V5b2YgQXVkaXRSb3ddID8/ICcnKTtcclxuICAgIHJldHVybiBhdi5sb2NhbGVDb21wYXJlKGJ2KSAqIGRpcjtcclxuICB9XHJcblxyXG4gIGdldCB0b3RhbFBhZ2VzKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRoaXMuZmlsdGVyZWRSb3dzLmxlbmd0aCAvIHRoaXMucGFnZVNpemUpKTtcclxuICB9XHJcblxyXG4gIGdldCBwYWdlUm93cygpOiBBdWRpdFJvd1tdIHtcclxuICAgIGNvbnN0IHN0YXJ0ID0gKHRoaXMucGFnZSAtIDEpICogdGhpcy5wYWdlU2l6ZTtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkUm93cy5zbGljZShzdGFydCwgc3RhcnQgKyB0aGlzLnBhZ2VTaXplKTtcclxuICB9XHJcblxyXG4gIC8qKiBTdG9yZXMgdGhhdCBjYXJyeSBhIHNjb3JlIGluIHRoZSBjdXJyZW50IHBlcmlvZC4gKi9cclxuICBwcml2YXRlIGdldCBldmFsdWF0ZWQoKTogQXVkaXRSb3dbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5yb3dzLmZpbHRlcihyID0+IHIuc2NvcmUgIT09IG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFN0b3JlcyB3aXRoIGEgc3VibWl0dGVkIGF1ZGl0IGluIHRoZSBwZXJpb2QsIHNjb3JlZCBvciBub3QuICovXHJcbiAgcHJpdmF0ZSBnZXQgYXVkaXRlZENvdW50KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5yb3dzLmZpbHRlcihyID0+IHIuc3RhdHVzICE9PSAnbmEnKS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBnZXQgYXZlcmFnZVNjb3JlKCk6IG51bWJlciB8IG51bGwge1xyXG4gICAgY29uc3QgZXYgPSB0aGlzLmV2YWx1YXRlZDtcclxuICAgIGlmICghZXYubGVuZ3RoKSB7IHJldHVybiBudWxsOyB9XHJcbiAgICByZXR1cm4gTWF0aC5yb3VuZChldi5yZWR1Y2UoKHN1bSwgcikgPT4gc3VtICsgKHIuc2NvcmUgYXMgbnVtYmVyKSwgMCkgLyBldi5sZW5ndGgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGtwaXMoKTogQXVkaXRLcGlbXSB7XHJcbiAgICBjb25zdCBldiA9IHRoaXMuZXZhbHVhdGVkO1xyXG4gICAgY29uc3QgYXZnID0gdGhpcy5hdmVyYWdlU2NvcmU7XHJcbiAgICBjb25zdCBwYXNzQ291bnQgPSBldi5maWx0ZXIociA9PiByLnN0YXR1cyA9PT0gJ3Bhc3MnKS5sZW5ndGg7XHJcbiAgICBjb25zdCBmYWlsQ291bnQgPSBldi5sZW5ndGggLSBwYXNzQ291bnQ7XHJcbiAgICBjb25zdCBjcml0aWNhbCA9IGV2LmZpbHRlcihyID0+IChyLnNjb3JlIGFzIG51bWJlcikgPCB0aGlzLmNyaXRpY2FsTWFyaykubGVuZ3RoO1xyXG4gICAgY29uc3QgYWN0aXZlU3RvcmVzID0gdGhpcy5zdG9yZXNJblNjb3BlO1xyXG4gICAgY29uc3QgYXVkaXRlZCA9IHRoaXMuYXVkaXRlZENvdW50O1xyXG4gICAgbGV0IGF2Z05vdGUgPSAnQWNyb3NzIGF1ZGl0ZWQgc3RvcmVzJztcclxuICAgIGlmIChhdmcgPT09IG51bGwpIHtcclxuICAgICAgYXZnTm90ZSA9IGF1ZGl0ZWQgPyAnQ29tcGxpYW5jZSBzY29yZSBpcyBvZmYgZm9yIHRoZXNlIGF1ZGl0cycgOiAnTm8gYXVkaXRzIGluIHRoaXMgcGVyaW9kJztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gW1xyXG4gICAgICB7XHJcbiAgICAgICAgbGFiZWw6ICdBdmVyYWdlIHNjb3JlJyxcclxuICAgICAgICB2YWx1ZTogYXZnID09PSBudWxsID8gJ+KAlCcgOiBhdmcgKyAnJScsXHJcbiAgICAgICAgbm90ZTogYXZnTm90ZSxcclxuICAgICAgICBub3RlQ29sb3I6IGF2ZyAhPT0gbnVsbCAmJiBhdmcgPCB0aGlzLnBhc3NNYXJrID8gJyNEOTJEMjAnIDogJyMwMjdBNDgnXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBsYWJlbDogdGhpcy5sYWJlbHMucGFzcyArICcgcmF0ZScsXHJcbiAgICAgICAgdmFsdWU6IGV2Lmxlbmd0aCA/IE1hdGgucm91bmQocGFzc0NvdW50IC8gZXYubGVuZ3RoICogMTAwKSArICclJyA6ICfigJQnLFxyXG4gICAgICAgIG5vdGU6IHBhc3NDb3VudCArICcgJyArIHRoaXMubGFiZWxzLnBhc3MgKyAnLCAnICsgZmFpbENvdW50ICsgJyAnICsgdGhpcy5sYWJlbHMuZmFpbCxcclxuICAgICAgICBub3RlQ29sb3I6ICcjNjY3MDg1J1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbGFiZWw6ICdDcml0aWNhbCBzdG9yZXMnLFxyXG4gICAgICAgIHZhbHVlOiBTdHJpbmcoY3JpdGljYWwpLFxyXG4gICAgICAgIG5vdGU6ICdTY29yZSBiZWxvdyAnICsgdGhpcy5jcml0aWNhbE1hcmsgKyAnJScsXHJcbiAgICAgICAgbm90ZUNvbG9yOiBjcml0aWNhbCA/ICcjRDkyRDIwJyA6ICcjNjY3MDg1J1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgLy8gU3VibWl0dGVkIGF1ZGl0cywgYXMgdGhlIHRyZW5kIGNvdW50cyB0aGVtOyB0aGUgbm90ZSBnaXZlcyB0aGUgYWN0aXZlIHN0b3JlcyBpbiBzY29wZS5cclxuICAgICAgICBsYWJlbDogJ0F1ZGl0cyBjb21wbGV0ZWQnLFxyXG4gICAgICAgIHZhbHVlOiBTdHJpbmcodGhpcy5yb3dzLnJlZHVjZSgoc3VtLCByKSA9PiBzdW0gKyAoTnVtYmVyKHIucmF3Py5hdWRpdHMpIHx8IDApLCAwKSksXHJcbiAgICAgICAgbm90ZTogYWN0aXZlU3RvcmVzICsgKGFjdGl2ZVN0b3JlcyA9PT0gMSA/ICcgYWN0aXZlIHN0b3JlJyA6ICcgYWN0aXZlIHN0b3JlcycpLFxyXG4gICAgICAgIG5vdGVDb2xvcjogJyM2NjcwODUnXHJcbiAgICAgIH1cclxuICAgIF07XHJcbiAgfVxyXG5cclxuICBnZXQgcGVyaW9kTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLmdyYWluID09PSAncXVhcnRlcicgJiYgdGhpcy5xdWFydGVyKSB7IHJldHVybiB0aGlzLnF1YXJ0ZXIgKyAnICgnICsgdGhpcy5xdWFydGVyTW9udGhzKHRoaXMucXVhcnRlcikgKyAnKSc7IH1cclxuICAgIHJldHVybiB0aGlzLmZtdCh0aGlzLmZyb20pICsgJyB0byAnICsgdGhpcy5mbXQodGhpcy50byk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEaXN0cmlidXRpb24gb2Ygc3RvcmVzIGFjcm9zcyBzY29yZSBiYW5kcy4gTm90IHNjb3JlZCBpcyBsZWZ0IG91dCAoUUEgOSBPY3QpLCBhbmQgaXRzIHN0b3Jlc1xyXG4gICAqIHdpdGggaXQsIHNvIHRoZSBzaGFyZXMgc3RpbGwgYWRkIHVwIHRvIDEwMCUuXHJcbiAgICovXHJcbiAgZ2V0IGJhbmRSb3dzKCk6IEFycmF5PHsgYmFuZDogQXVkaXRCYW5kOyBjb3VudDogbnVtYmVyOyBzaGFyZTogc3RyaW5nOyB3aWR0aDogc3RyaW5nIH0+IHtcclxuICAgIGNvbnN0IHRvdGFsID0gdGhpcy5yb3dzLmZpbHRlcihyID0+IHIuc3RhdHVzICE9PSAndW5zY29yZWQnKS5sZW5ndGggfHwgMTtcclxuICAgIHJldHVybiB0aGlzLmJhbmRzLmZpbHRlcihiYW5kID0+IGJhbmQua2V5ICE9PSAndW5zY29yZWQnKS5tYXAoYmFuZCA9PiB7XHJcbiAgICAgIGNvbnN0IGNvdW50ID0gU1RBVFVTX0JBTkRTLmluY2x1ZGVzKGJhbmQua2V5KVxyXG4gICAgICAgID8gdGhpcy5yb3dzLmZpbHRlcihyID0+IHIuc3RhdHVzID09PSBiYW5kLmtleSkubGVuZ3RoXHJcbiAgICAgICAgOiB0aGlzLnJvd3MuZmlsdGVyKHIgPT4gci5zY29yZSAhPT0gbnVsbCAmJiB0aGlzLmluQmFuZChyLnNjb3JlIGFzIG51bWJlciwgYmFuZCkpLmxlbmd0aDtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBiYW5kLFxyXG4gICAgICAgIGNvdW50LFxyXG4gICAgICAgIC8vIEEgZmV3IHN0b3JlcyBvdXQgb2YgdGhvdXNhbmRzIHJvdW5kIHRvIDAlOyBzYXkgXCI8MSVcIiBpbnN0ZWFkIG9mIDAlIG5leHQgdG8gYSBub24temVybyBjb3VudC5cclxuICAgICAgICBzaGFyZTogY291bnQgJiYgY291bnQgLyB0b3RhbCAqIDEwMCA8IDEgPyAnPDElJyA6IE1hdGgucm91bmQoY291bnQgLyB0b3RhbCAqIDEwMCkgKyAnJScsXHJcbiAgICAgICAgd2lkdGg6IChjb3VudCAvIHRvdGFsICogMTAwKSArICclJ1xyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogQmFuZCBjb2xvdXJzIG9mIGEgc3RvcmUgcm93OiBieSBzY29yZSwgb3IgdGhlIE5vdCBzY29yZWQgLyBOb3QgYXVkaXRlZCBiYW5kIHdoZW4gaXQgaGFzIG5vbmUuICovXHJcbiAgYmFuZEZvcihyb3c6IEF1ZGl0Um93KTogQXVkaXRCYW5kIHtcclxuICAgIGNvbnN0IGxhc3QgPSB0aGlzLmJhbmRzW3RoaXMuYmFuZHMubGVuZ3RoIC0gMV07XHJcbiAgICBpZiAocm93LnNjb3JlID09PSBudWxsKSB7IHJldHVybiB0aGlzLmJhbmRzLmZpbmQoYiA9PiBiLmtleSA9PT0gcm93LnN0YXR1cykgPz8gbGFzdDsgfVxyXG4gICAgY29uc3Qgc2NvcmUgPSByb3cuc2NvcmU7XHJcbiAgICByZXR1cm4gdGhpcy5iYW5kcy5maW5kKGIgPT4gIVNUQVRVU19CQU5EUy5pbmNsdWRlcyhiLmtleSkgJiYgdGhpcy5pbkJhbmQoc2NvcmUsIGIpKSA/PyBsYXN0O1xyXG4gIH1cclxuXHJcbiAgLyoqIEEgc2NvcmUgYmFuZCdzIHJhbmdlOyB0aGUgbG93ZXN0IGJhbmQgKGxvIDAsIENyaXRpY2FsKSBhbHNvIHRha2VzIG5lZ2F0aXZlIHNjb3JlcyAocGVuYWx0eSBvcHRpb25zKS4gKi9cclxuICBwcml2YXRlIGluQmFuZChzY29yZTogbnVtYmVyLCBiYW5kOiBBdWRpdEJhbmQpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoYmFuZC5sbyA8PSAwIHx8IHNjb3JlID49IGJhbmQubG8pICYmIHNjb3JlIDw9IGJhbmQuaGk7XHJcbiAgfVxyXG5cclxuICBzdGF0dXNMYWJlbChyb3c6IEF1ZGl0Um93KTogc3RyaW5nIHtcclxuICAgIGlmIChyb3cuc3RhdHVzID09PSAncGFzcycpIHsgcmV0dXJuIHRoaXMubGFiZWxzLnBhc3M7IH1cclxuICAgIGlmIChyb3cuc3RhdHVzID09PSAnZmFpbCcpIHsgcmV0dXJuIHRoaXMubGFiZWxzLmZhaWw7IH1cclxuICAgIHJldHVybiByb3cuc3RhdHVzID09PSAndW5zY29yZWQnID8gJ05vdCBzY29yZWQnIDogJ05vdCBhdWRpdGVkJztcclxuICB9XHJcblxyXG4gIC8qKiBCYXIgaGVpZ2h0IGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgY2hhcnQgYXJlYS4gKi9cclxuICBiYXJIZWlnaHQoYmFyOiBUcmVuZEJhcik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gKGJhci52YWx1ZSA9PT0gbnVsbCA/IDIgOiBNYXRoLm1heCgzLCBiYXIudmFsdWUpKSArICclJztcclxuICB9XHJcblxyXG4gIC8qKiBIb3ZlciBjYXJkIHNpdHMganVzdCBhYm92ZSB0aGUgYmFyJ3MgdmFsdWUgbGFiZWw7IGNhcHBlZCBzbyBhIHRhbGwgYmFyJ3MgY2FyZCBzdGF5cyBpbnNpZGUgdGhlIGNoYXJ0LiAqL1xyXG4gIHRpcEJvdHRvbShiYXI6IFRyZW5kQmFyKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGggPSBiYXIudmFsdWUgPT09IG51bGwgPyAyIDogTWF0aC5tYXgoMywgYmFyLnZhbHVlKTtcclxuICAgIHJldHVybiAnY2FsYygnICsgTWF0aC5taW4oaCwgNDUpICsgJyUgKyAyNnB4KSc7XHJcbiAgfVxyXG5cclxuICBiYXJGaWxsKGJhcjogVHJlbmRCYXIpOiBzdHJpbmcge1xyXG4gICAgaWYgKGJhci52YWx1ZSA9PT0gbnVsbCkgeyByZXR1cm4gJyNGMkY0RjcnOyB9XHJcbiAgICBjb25zdCBhY3RpdmUgPSBiYXIua2V5ID09PSB0aGlzLnF1YXJ0ZXI7XHJcbiAgICBpZiAoYmFyLnZhbHVlID49IHRoaXMuYmFyTWFyayhiYXIpKSB7IHJldHVybiBhY3RpdmUgPyAnIzE1NzBFRicgOiAnI0IyRERGRic7IH1cclxuICAgIHJldHVybiBhY3RpdmUgPyAnI0YwNDQzOCcgOiAnI0ZFQ0RDQSc7XHJcbiAgfVxyXG5cclxuICAvKiogQSBiYXIncyBwYXNzIG1hcms6IHRoZSBjb25maWd1cmVkIG1hcmtzIG9mIHRoZSBhdWRpdHMgaXQgYXZlcmFnZXMsIGVsc2UgdGhlIHBhZ2Uncy4gKi9cclxuICBiYXJNYXJrKGJhcjogVHJlbmRCYXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIGJhci5wYXNzTWFyayA/PyB0aGlzLnBhc3NNYXJrO1xyXG4gIH1cclxuXHJcbiAgc2V0R3JhaW4oZ3JhaW46ICdxdWFydGVyJyB8ICdkYXRlJyk6IHZvaWQge1xyXG4gICAgaWYgKGdyYWluID09PSB0aGlzLmdyYWluKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5ncmFpbiA9IGdyYWluO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICAgIGlmIChncmFpbiA9PT0gJ3F1YXJ0ZXInKSB7XHJcbiAgICAgIHRoaXMuYXBwbHlRdWFydGVyKHRoaXMucXVhcnRlcnMuaW5jbHVkZXModGhpcy5xdWFydGVyKSA/IHRoaXMucXVhcnRlciA6IHRoaXMucXVhcnRlcnNbdGhpcy5xdWFydGVycy5sZW5ndGggLSAxXSwgdHJ1ZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIEJhY2sgdG8gQnkgZGF0ZTogdGhlIGhlYWRlcidzIHJhbmdlIGFnYWluLlxyXG4gICAgdGhpcy5mcm9tID0gdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5zdGFydERhdGUgfHwgdGhpcy5mcm9tO1xyXG4gICAgdGhpcy50byA9IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uZW5kRGF0ZSB8fCB0aGlzLnRvO1xyXG4gICAgdGhpcy5yYW5nZSA9IHRvUGlja2VyUmFuZ2UodGhpcy5mcm9tLCB0aGlzLnRvKTtcclxuICAgIGlmICghdGhpcy5maWx0ZXJzT3BlbikgeyB0aGlzLnJlbG9hZFBlcmlvZCgpOyB9XHJcbiAgfVxyXG5cclxuICBzZXRTdGF0dXMoc3RhdHVzOiBTdGF0dXNGaWx0ZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICB9XHJcblxyXG4gIHNvcnRCeShrZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc29ydEtleSA9PT0ga2V5KSB7XHJcbiAgICAgIHRoaXMuc29ydERpciA9IHRoaXMuc29ydERpciA9PT0gJ2FzYycgPyAnZGVzYycgOiAnYXNjJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc29ydEtleSA9IGtleTtcclxuICAgICAgdGhpcy5zb3J0RGlyID0gJ2FzYyc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTY29yZSBkaXN0cmlidXRpb24gLT4gVmlldyBzdG9yZXM6IG5hcnJvdyB0aGUgc3RvcmUgbGlzdCB0byB0aGF0IGJhbmQgKE5vdCBhdWRpdGVkIC0+IHRoZVxyXG4gICAqIHN0b3JlcyB3aXRoIG5vIHN1Ym1pc3Npb24pIGFuZCBicmluZyB0aGUgbGlzdCBpbnRvIHZpZXcuXHJcbiAgICovXHJcbiAgYXBwbHlCYW5kKGJhbmQ6IEF1ZGl0QmFuZCk6IHZvaWQge1xyXG4gICAgaWYgKFNUQVRVU19CQU5EUy5pbmNsdWRlcyhiYW5kLmtleSkpIHtcclxuICAgICAgdGhpcy5jbGVhckJhbmQoKTtcclxuICAgICAgdGhpcy5zdGF0dXMgPSBiYW5kLmtleSBhcyBTdG9yZVN0YXR1cztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2NvcmVNaW4gPSBiYW5kLmxvO1xyXG4gICAgICB0aGlzLnNjb3JlTWF4ID0gYmFuZC5oaTtcclxuICAgICAgdGhpcy5zdGF0dXMgPSAnYWxsJztcclxuICAgICAgdGhpcy5wYWdlID0gMTtcclxuICAgIH1cclxuICAgIHRoaXMuc3RvcmVMaXN0T3BlbiA9IHRydWU7XHJcbiAgICB0aGlzLmxpc3RCYW5kS2V5ID0gYmFuZC5rZXk7XHJcbiAgICAvLyBGcm9tIHRoZSBkcmF3ZXIsIEFwcGx5IHNjcm9sbHMgb25jZSBpdCBjbG9zZXMuXHJcbiAgICBpZiAodGhpcy5maWx0ZXJzT3BlbikgeyByZXR1cm47IH1cclxuICAgIHNldFRpbWVvdXQoKCkgPT4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkLXN0b3JlLWxpc3QnKT8uc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnc3RhcnQnIH0pKTtcclxuICB9XHJcblxyXG4gIGNsZWFyQmFuZCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2NvcmVNaW4gPSAwO1xyXG4gICAgdGhpcy5zY29yZU1heCA9IDEwMDtcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgU3RvcmUgbGlzdCBvcGVucyBieSBkZWZhdWx0IHdpdGggYWxsIHN0b3JlczsgU2NvcmUgZGlzdHJpYnV0aW9uIC0+IFZpZXcgc3RvcmVzIChvciBhIEZpbHRlcnNcclxuICAgKiBzY29yZSByYW5nZSkgbmFycm93cyBpdCB0byBhIGJhbmQsIGFuZCB0aGUgY2hpcCdzIHggY2xvc2VzIGl0LlxyXG4gICAqL1xyXG4gIHN0b3JlTGlzdE9wZW4gPSB0cnVlO1xyXG4gIC8qKiBCYW5kIHRoZSBsaXN0IHdhcyBvcGVuZWQgZm9yICgnJyA9IGFsbCBzdG9yZXMpLiAqL1xyXG4gIGxpc3RCYW5kS2V5ID0gJyc7XHJcblxyXG4gIGdldCBzaG93U3RvcmVMaXN0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RvcmVMaXN0T3BlbiB8fCB0aGlzLmJhbmRGaWx0ZXJBY3RpdmUgfHwgdGhpcy5zdGF0dXMgIT09ICdhbGwnO1xyXG4gIH1cclxuXHJcbiAgLyoqIERyYXdlciBTY29yZSByYW5nZTogdGhlIGJhbmQgdGhlIGN1cnJlbnQgcmFuZ2UgKG9yIHN0YXR1cyBiYW5kKSBtYXRjaGVzLiAqL1xyXG4gIGlzQmFuZE9uKGJhbmQ6IEF1ZGl0QmFuZCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKFNUQVRVU19CQU5EUy5pbmNsdWRlcyhiYW5kLmtleSkpIHsgcmV0dXJuIHRoaXMuc3RhdHVzID09PSBiYW5kLmtleTsgfVxyXG4gICAgcmV0dXJuIHRoaXMuc2NvcmVNaW4gPT09IGJhbmQubG8gJiYgdGhpcy5zY29yZU1heCA9PT0gYmFuZC5oaTtcclxuICB9XHJcblxyXG4gIGdldCBiYW5kRmlsdGVyQWN0aXZlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2NvcmVNaW4gIT09IDAgfHwgdGhpcy5zY29yZU1heCAhPT0gMTAwO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGJhbmRDaGlwTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGhpdCA9IHRoaXMuYmFuZHMuZmluZChiID0+ICFTVEFUVVNfQkFORFMuaW5jbHVkZXMoYi5rZXkpICYmIGIubG8gPT09IHRoaXMuc2NvcmVNaW4gJiYgYi5oaSA9PT0gdGhpcy5zY29yZU1heCk7XHJcbiAgICByZXR1cm4gaGl0ID8gaGl0LmxhYmVsICsgJyDCtyAnICsgaGl0LnJhbmdlIDogJ1Njb3JlICcgKyB0aGlzLnNjb3JlTWluICsgJ+KAkycgKyB0aGlzLnNjb3JlTWF4ICsgJyUnO1xyXG4gIH1cclxuXHJcbiAgb25TZWFyY2goKTogdm9pZCB7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBmaXZlIGZpbHRlciBjYXRlZ29yaWVzIHRoZSBkcmF3ZXIgbGlzdHMuICovXHJcbiAgZ2V0IGZpbHRlckNhdHMoKTogRmlsdGVyQ2F0W10ge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgeyBrZXk6ICdwZXJpb2QnLCBsYWJlbDogJ1BlcmlvZCcsIHZhbHVlOiB0aGlzLnBlcmlvZExhYmVsLCB0aXRsZTogJ1BlcmlvZCcsXHJcbiAgICAgICAgc3ViOiAnU3RhcnRzIGFzIHRoZSBnbG9iYWwgaGVhZGVyIGRhdGUgcmFuZ2U7IHBpY2sgYSByYW5nZSB0byBuYXJyb3cgaXQuJyxcclxuICAgICAgICBkaXJ0eTogZmFsc2UgfSxcclxuICAgICAgeyBrZXk6ICdzY29wZScsIGxhYmVsOiAnU3RvcmUgaGllcmFyY2h5JywgdmFsdWU6IHRoaXMuc2NvcGVMYWJlbCwgdGl0bGU6ICdTdG9yZSBoaWVyYXJjaHknLFxyXG4gICAgICAgIHN1YjogJ1BpY2sgdGhlIGNpcmNsZSwgem9uZSwgQU9NIG9yIHN0b3JlIHRoZSB3aG9sZSBkYXNoYm9hcmQgcmVhZHMuJyxcclxuICAgICAgICBkaXJ0eTogISF0aGlzLmNpcmNsZSB9LFxyXG4gICAgICB7IGtleTogJ3R5cGUnLCBsYWJlbDogJ0F1ZGl0IHR5cGUnLCB2YWx1ZTogdGhpcy5hdWRpdFR5cGVMYWJlbCwgdGl0bGU6ICdBdWRpdCB0eXBlJyxcclxuICAgICAgICBzdWI6ICdXaGljaCBhdWRpdCBwcm9ncmFtbWUgdGhlIHNjb3JlcyBjb21lIGZyb20uJyxcclxuICAgICAgICBkaXJ0eTogdGhpcy5hdWRpdFR5cGUgIT09ICdhbGwnIH0sXHJcbiAgICAgIHsga2V5OiAnYmFuZCcsIGxhYmVsOiAnU2NvcmUgcmFuZ2UnLCB2YWx1ZTogdGhpcy5iYW5kQ2hpcExhYmVsLCB0aXRsZTogJ1Njb3JlIHJhbmdlJyxcclxuICAgICAgICBzdWI6ICdUYXAgYSBiYW5kIHRvIHNldCB0aGUgcmFuZ2UgdGhlIHN1bW1hcnkgcmVhZHMuJyxcclxuICAgICAgICBkaXJ0eTogdGhpcy5iYW5kRmlsdGVyQWN0aXZlIH0sXHJcbiAgICAgIHsga2V5OiAnc3RhdHVzJywgbGFiZWw6ICdTdGF0dXMnLCB2YWx1ZTogdGhpcy5zdGF0dXNGaWx0ZXJMYWJlbCwgdGl0bGU6ICdTdGF0dXMnLFxyXG4gICAgICAgIHN1YjogJ1Nob3cgZXZlcnkgc3RvcmUsIG9yIG9ubHkgdGhlIG9uZXMgbWFya2VkICcgKyB0aGlzLmxhYmVscy5wYXNzICsgJyBvciAnICsgdGhpcy5sYWJlbHMuZmFpbCArICcuJyxcclxuICAgICAgICBkaXJ0eTogdGhpcy5zdGF0dXMgIT09ICdhbGwnIH1cclxuICAgIF07XHJcbiAgfVxyXG5cclxuICBnZXQgYWN0aXZlQ2F0T2JqKCk6IEZpbHRlckNhdCB7XHJcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJDYXRzLmZpbmQoYyA9PiBjLmtleSA9PT0gdGhpcy5hY3RpdmVDYXQpIHx8IHRoaXMuZmlsdGVyQ2F0c1swXTtcclxuICB9XHJcblxyXG4gIGdldCBmaWx0ZXJDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyQ2F0cy5maWx0ZXIoYyA9PiBjLmRpcnR5KS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICAvKiogU3RvcmVzIHRoZSBkcmF3ZXIncyBoaWVyYXJjaHkgcGljayBjb3ZlcnMgKHdoYXQgQXBwbHkgd2lsbCBsb2FkKS4gKi9cclxuICBnZXQgc3RvcmVzSW5TY29wZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuc2NvcGVSb3dzLmZpbHRlcihyID0+IHRoaXMubWF0Y2hlc1Njb3BlKHIsIHRoaXMpKS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICAvKiogU29ydGVkIGRpc3RpbmN0IG5hbWVzLCB3aXRob3V0IHRoZSBcIuKAlFwiIG9mIHN0b3JlcyBvdXRzaWRlIHRoZSBoaWVyYXJjaHkuICovXHJcbiAgcHJpdmF0ZSBkaXN0aW5jdCh2YWx1ZXM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldCh2YWx1ZXMuZmlsdGVyKHYgPT4gdiAmJiB2ICE9PSAn4oCUJykpKS5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNpcmNsZXMoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZGlzdGluY3QodGhpcy5zY29wZVJvd3MubWFwKHIgPT4gci5jaXJjbGUpKTtcclxuICB9XHJcblxyXG4gIGdldCB6b25lcygpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5kaXN0aW5jdCh0aGlzLnNjb3BlUm93cy5maWx0ZXIociA9PiByLmNpcmNsZSA9PT0gdGhpcy5jaXJjbGUpLm1hcChyID0+IHIuem9uZSkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGFvbXMoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZGlzdGluY3QodGhpcy5zY29wZVJvd3MuZmlsdGVyKHIgPT4gci5jaXJjbGUgPT09IHRoaXMuY2lyY2xlICYmIHIuem9uZSA9PT0gdGhpcy56b25lKS5tYXAociA9PiByLmFvbSkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNjb3BlUmVhZGluZygpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbiA9IHRoaXMuc3RvcmVzSW5TY29wZTtcclxuICAgIHJldHVybiB0aGlzLnNjb3BlTGFiZWwgKyAnIMK3ICcgKyBuICsgKG4gPT09IDEgPyAnIHN0b3JlJyA6ICcgc3RvcmVzJyk7XHJcbiAgfVxyXG5cclxuICBzZXRNb2R1bGVUYWIodGFiOiAnQXVkaXQnIHwgJ1Rhc2snKTogdm9pZCB7XHJcbiAgICBpZiAodGFiICE9PSB0aGlzLm1vZHVsZVRhYikge1xyXG4gICAgICAvLyBUaGUgZmlyc3QgUGVyZm9ybWFuY2UgdGFibGUgY2hhbmdlcyAoQXVkaXQgLyBUYXNrKSwgc28gaXRzIHNvcnQgc3RhcnRzIG92ZXIuXHJcbiAgICAgIHRoaXMucGVyZlNvcnRLZXkgPSAnJztcclxuICAgICAgdGhpcy5wZXJmU29ydERpciA9ICdhc2MnO1xyXG4gICAgfVxyXG4gICAgdGhpcy5tb2R1bGVUYWIgPSB0YWI7XHJcbiAgICBpZiAodGFiID09PSAnVGFzaycgJiYgdGhpcy50YXNrc1N0YWxlKSB7IHRoaXMubG9hZFRhc2tzKCk7IH1cclxuICB9XHJcblxyXG4gIGdldCBzY29wZUxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuc3RvcmUgPyB0aGlzLnNjb3BlUm93cy5maW5kKHIgPT4gU3RyaW5nKHIucmF3Py5zdG9yZUlkKSA9PT0gdGhpcy5zdG9yZSkgOiB1bmRlZmluZWQ7XHJcbiAgICByZXR1cm4gKHN0b3JlID8gc3RvcmUucmF3Py5zdG9yZU5hbWUgfHwgdGhpcy5zdG9yZSA6IHRoaXMuc3RvcmUpIHx8IHRoaXMuYW9tIHx8IHRoaXMuem9uZSB8fCB0aGlzLmNpcmNsZSB8fCAnQWxsIHN0b3Jlcyc7XHJcbiAgfVxyXG5cclxuICBnZXQgYXVkaXRUeXBlTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHQgPSB0aGlzLmF1ZGl0VHlwZXMuZmluZCh4ID0+IHgua2V5ID09PSB0aGlzLmF1ZGl0VHlwZSk7XHJcbiAgICByZXR1cm4gdCA/IHQubGFiZWwgOiAnQWxsIEF1ZGl0cyc7XHJcbiAgfVxyXG5cclxuICBnZXQgc3RhdHVzRmlsdGVyTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gJ2FsbCcpIHsgcmV0dXJuICdBbGwgc3RvcmVzJzsgfVxyXG4gICAgaWYgKHRoaXMuc3RhdHVzID09PSAncGFzcycpIHsgcmV0dXJuIHRoaXMubGFiZWxzLnBhc3MgKyAnIHN0b3Jlcyc7IH1cclxuICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gJ3Vuc2NvcmVkJykgeyByZXR1cm4gJ05vdCBzY29yZWQnOyB9XHJcbiAgICByZXR1cm4gdGhpcy5zdGF0dXMgPT09ICdmYWlsJyA/IHRoaXMubGFiZWxzLmZhaWwgKyAnIHN0b3JlcycgOiAnTm90IGF1ZGl0ZWQnO1xyXG4gIH1cclxuXHJcbiAgb3BlbkZpbHRlcnMoY2F0Pzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmRyYWZ0ID0gT2JqZWN0LmNyZWF0ZSh0aGlzKSBhcyBBdWRpdFYyRGFzaGJvYXJkQ29tcG9uZW50O1xyXG4gICAgdGhpcy5hY3RpdmVDYXQgPSBjYXQgfHwgdGhpcy5hY3RpdmVDYXQ7XHJcbiAgICB0aGlzLmZpbHRlcnNPcGVuID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHNlbGVjdENhdChrZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5hY3RpdmVDYXQgPSBrZXk7XHJcbiAgfVxyXG5cclxuICBhcHBseUZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICBjb25zdCBkID0gdGhpcy5kcmFmdDtcclxuICAgIGNvbnN0IHBlcmlvZENoYW5nZWQgPSAhIWQgJiYgKGQuZnJvbSAhPT0gdGhpcy5mcm9tIHx8IGQudG8gIT09IHRoaXMudG8pO1xyXG4gICAgaWYgKGQpIHtcclxuICAgICAgY29uc3Qgc2VsZiA9IHRoaXMgYXMgYW55O1xyXG4gICAgICBBdWRpdFYyRGFzaGJvYXJkQ29tcG9uZW50LkRSQUZUX0tFWVMuZm9yRWFjaChrID0+IHsgc2VsZltrXSA9IChkIGFzIGFueSlba107IH0pO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2NvcGVDaGFuZ2VkID0gdGhpcy5jb21taXRTY29wZSgpO1xyXG4gICAgdGhpcy5kcmFmdCA9IG51bGw7XHJcbiAgICB0aGlzLmZpbHRlcnNPcGVuID0gZmFsc2U7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gICAgaWYgKHBlcmlvZENoYW5nZWQgfHwgc2NvcGVDaGFuZ2VkKSB7IHRoaXMucmVsb2FkUGVyaW9kKCk7IH1cclxuICAgIC8vIFNjb3JlIHJhbmdlIGFuZCBTdGF0dXMgb25seSBmaWx0ZXIgdGhlIHN0b3JlIGxpc3QsIHNvIHNob3cgaXQuXHJcbiAgICBpZiAodGhpcy5iYW5kRmlsdGVyQWN0aXZlIHx8IHRoaXMuc3RhdHVzICE9PSAnYWxsJykge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZC1zdG9yZS1saXN0Jyk/LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ3N0YXJ0JyB9KSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogTWFrZSB0aGUgZHJhd2VyJ3MgaGllcmFyY2h5ICsgYXVkaXQgdHlwZSB0aGUgbG9hZGVkIG9uZXM7IHRydWUgd2hlbiB0aGV5IGRpZmZlciBmcm9tIGJlZm9yZS4gKi9cclxuICBwcml2YXRlIGNvbW1pdFNjb3BlKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgYSA9IHRoaXMuYXBwbGllZDtcclxuICAgIGNvbnN0IGNoYW5nZWQgPSBhLmNpcmNsZSAhPT0gdGhpcy5jaXJjbGUgfHwgYS56b25lICE9PSB0aGlzLnpvbmUgfHwgYS5hb20gIT09IHRoaXMuYW9tIHx8IGEuc3RvcmUgIT09IHRoaXMuc3RvcmVcclxuICAgICAgfHwgYS5hdWRpdFR5cGUgIT09IHRoaXMuYXVkaXRUeXBlO1xyXG4gICAgdGhpcy5hcHBsaWVkID0geyBjaXJjbGU6IHRoaXMuY2lyY2xlLCB6b25lOiB0aGlzLnpvbmUsIGFvbTogdGhpcy5hb20sIHN0b3JlOiB0aGlzLnN0b3JlLCBhdWRpdFR5cGU6IHRoaXMuYXVkaXRUeXBlIH07XHJcbiAgICByZXR1cm4gY2hhbmdlZDtcclxuICB9XHJcblxyXG4gIC8qKiBDYW5jZWwgLyB4IC8gYmFja2Ryb3A6IHRoZSBkcmFmdCBpcyBkcm9wcGVkOyB0aGUgcGFnZSBuZXZlciBjaGFuZ2VkLiAqL1xyXG4gIGNhbmNlbEZpbHRlcnMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmRyYWZ0ID0gbnVsbDtcclxuICAgIHRoaXMuZmlsdGVyc09wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKiBSZXNldCBldmVyeSBmaWx0ZXIgdG8gdGhlIGRvY3VtZW50ZWQgZGVmYXVsdHMuICovXHJcbiAgY2xlYXJBbGwoKTogdm9pZCB7XHJcbiAgICB0aGlzLmF1ZGl0VHlwZSA9ICdhbGwnO1xyXG4gICAgdGhpcy5ncmFpbiA9ICdkYXRlJztcclxuICAgIHRoaXMuY2lyY2xlID0gJyc7XHJcbiAgICB0aGlzLnpvbmUgPSAnJztcclxuICAgIHRoaXMuYW9tID0gJyc7XHJcbiAgICB0aGlzLnN0b3JlID0gJyc7XHJcbiAgICB0aGlzLnNjb3JlTWluID0gMDtcclxuICAgIHRoaXMuc2NvcmVNYXggPSAxMDA7XHJcbiAgICB0aGlzLnN0YXR1cyA9ICdhbGwnO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICAgIC8vIFRoZSBjaGlwcycgQ2xlYXIgYWxsIChkcmF3ZXIgY2xvc2VkKSByZWxvYWRzIG5vdzsgaW5zaWRlIHRoZSBkcmF3ZXIsIEFwcGx5IGRvZXMuXHJcbiAgICBpZiAoIXRoaXMuZmlsdGVyc09wZW4gJiYgdGhpcy5jb21taXRTY29wZSgpKSB7IHRoaXMucmVsb2FkUGVyaW9kKCk7IH1cclxuICB9XHJcblxyXG4gIC8qKiBDaGFuZ2luZyBhIGxldmVsIGNsZWFycyB0aGUgbGV2ZWxzIGJlbG93IGl0LiAqL1xyXG4gIG9uQ2lyY2xlQ2hhbmdlKCk6IHZvaWQge1xyXG4gICAgdGhpcy56b25lID0gJyc7XHJcbiAgICB0aGlzLmFvbSA9ICcnO1xyXG4gICAgdGhpcy5zdG9yZSA9ICcnO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICB9XHJcblxyXG4gIG9uWm9uZUNoYW5nZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuYW9tID0gJyc7XHJcbiAgICB0aGlzLnN0b3JlID0gJyc7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgb25Bb21DaGFuZ2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0b3JlID0gJyc7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgcmVzZXRTY29wZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuY2lyY2xlID0gJyc7XHJcbiAgICB0aGlzLnpvbmUgPSAnJztcclxuICAgIHRoaXMuYW9tID0gJyc7XHJcbiAgICB0aGlzLnN0b3JlID0gJyc7XHJcbiAgICB0aGlzLnBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgLyoqIFN0b3JlIGRyb3Bkb3duOiB0aGUgc3RvcmVzIG9mIHRoZSBwaWNrZWQgQU9NLCBieSBuYW1lICh2YWx1ZSA9IHN0b3JlSWQpLiAqL1xyXG4gIGdldCBzdG9yZVBpY2tPcHRpb25zKCk6IEFycmF5PHsgdmFsdWU6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9PiB7XHJcbiAgICBjb25zdCBzdG9yZXMgPSB0aGlzLnNjb3BlUm93c1xyXG4gICAgICAuZmlsdGVyKHIgPT4gdGhpcy5tYXRjaGVzU2NvcGUociwgeyBjaXJjbGU6IHRoaXMuY2lyY2xlLCB6b25lOiB0aGlzLnpvbmUsIGFvbTogdGhpcy5hb20sIHN0b3JlOiAnJyB9KSlcclxuICAgICAgLm1hcChyID0+ICh7IHZhbHVlOiBTdHJpbmcoci5yYXc/LnN0b3JlSWQgfHwgJycpLCBsYWJlbDogU3RyaW5nKHIucmF3Py5zdG9yZU5hbWUgfHwgJ+KAlCcpIH0pKVxyXG4gICAgICAuZmlsdGVyKG8gPT4gby52YWx1ZSlcclxuICAgICAgLnNvcnQoKGEsIGIpID0+IGEubGFiZWwubG9jYWxlQ29tcGFyZShiLmxhYmVsKSk7XHJcbiAgICByZXR1cm4gW3sgdmFsdWU6ICcnLCBsYWJlbDogJ0FsbCBzdG9yZXMnIH1dLmNvbmNhdChzdG9yZXMpO1xyXG4gIH1cclxuXHJcbiAgLyoqIE9wdGlvbnMgZm9yIHRoZSBkcmF3ZXIncyBjdXN0b20gZHJvcGRvd25zIChsaWItYXVkaXQtdjItc2VsZWN0KTogXCJBbGwg4oCmXCIgZmlyc3QsIHRoZW4gdGhlIGxpc3QuICovXHJcbiAgcGlja09wdGlvbnMobGlzdDogc3RyaW5nW10sIGFsbDogc3RyaW5nKTogQXJyYXk8eyB2YWx1ZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH0+IHtcclxuICAgIHJldHVybiBbeyB2YWx1ZTogJycsIGxhYmVsOiBhbGwgfV0uY29uY2F0KChsaXN0IHx8IFtdKS5tYXAodiA9PiAoeyB2YWx1ZTogdiwgbGFiZWw6IHYgfSkpKTtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgZmlyc3QgcGVyZm9ybWFuY2UgdGFiIGlzIG5hbWVkIGFmdGVyIHRoZSBhY3RpdmUgbW9kdWxlLiAqL1xyXG4gIGdldCBwZXJmVGFic0Zvck1vZHVsZSgpOiBBcnJheTwnQXVkaXQnIHwgJ1N0b3JlJyB8ICdVc2VyJz4ge1xyXG4gICAgcmV0dXJuIHRoaXMucGVyZlRhYnM7XHJcbiAgfVxyXG5cclxuICBwZXJmVGFiRGlzcGxheSh0YWI6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gKHRhYiA9PT0gJ0F1ZGl0JyA/IHRoaXMubW9kdWxlVGFiIDogdGFiKSArICcgUGVyZm9ybWFuY2UnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBlcmZJbmZvVGl0bGUoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLnBlcmZUYWIgPT09ICdTdG9yZScpIHsgcmV0dXJuICdTdG9yZXMgSW5mbyc7IH1cclxuICAgIGlmICh0aGlzLnBlcmZUYWIgPT09ICdVc2VyJykgeyByZXR1cm4gJ1VzZXIgSW5mbyc7IH1cclxuICAgIHJldHVybiB0aGlzLm1vZHVsZVRhYiArICcgSW5mbyc7XHJcbiAgfVxyXG5cclxuICBnZXQgcGVyZkNyZWF0ZUxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gJysgQ3JlYXRlICcgKyB0aGlzLm1vZHVsZVRhYjtcclxuICB9XHJcblxyXG4gIGdldCBpc1Rhc2tNb2R1bGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5tb2R1bGVUYWIgPT09ICdUYXNrJztcclxuICB9XHJcblxyXG4gIGdldCBmaWx0ZXJlZFRhc2tQZXJmKCk6IFRhc2tQZXJmUm93W10ge1xyXG4gICAgY29uc3QgcSA9IHRoaXMucGVyZlNlYXJjaC50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIHJldHVybiB0aGlzLnNvcnRQZXJmUm93cyhxID8gdGhpcy50YXNrUGVyZi5maWx0ZXIociA9PiByLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSkgOiB0aGlzLnRhc2tQZXJmLCB0aGlzLnRhc2tTb3J0VmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgdHJhY2tCeVBlcmZUYXNrKF86IG51bWJlciwgcm93OiBUYXNrUGVyZlJvdyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcm93LnJhdz8udGFza0lkIHx8IHJvdy5uYW1lO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBzZWxlY3RlZCB0cmVuZCBidWNrZXQgZHJpdmVzIHRoZSBoZWFkbGluZSBzY29yZSBhYm92ZSB0aGUgY2hhcnQuICovXHJcbiAgcHJpdmF0ZSBnZXQgZm9jdXNCYXIoKTogVHJlbmRCYXIgfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKHRoaXMuZ3JhaW4gPT09ICdxdWFydGVyJykgeyByZXR1cm4gdGhpcy5xdWFydGVyVHJlbmQuZmluZChiID0+IGIua2V5ID09PSB0aGlzLnF1YXJ0ZXIpOyB9XHJcbiAgICByZXR1cm4gdGhpcy50cmVuZC5maW5kKGIgPT4gYi5rZXkgPT09IHRoaXMucXVhcnRlcikgfHwgdGhpcy50cmVuZFswXTtcclxuICB9XHJcblxyXG4gIGdldCBmb2N1c1Njb3JlKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBiID0gdGhpcy5mb2N1c0JhcjtcclxuICAgIGlmIChiICYmIGIudmFsdWUgIT09IG51bGwpIHsgcmV0dXJuIGIudmFsdWUgKyAnJSc7IH1cclxuICAgIC8vIFdpdGggbm8gdHJlbmQgYnVja2V0cywgdGhlIGhlYWRsaW5lIGlzIHRoZSBwZXJpb2QgYXZlcmFnZS5cclxuICAgIGNvbnN0IGF2ZyA9IHRoaXMuYXZlcmFnZVNjb3JlO1xyXG4gICAgcmV0dXJuIGF2ZyA9PT0gbnVsbCA/ICfigJQnIDogYXZnICsgJyUnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZvY3VzUGFzc2VkKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgYiA9IHRoaXMuZm9jdXNCYXI7XHJcbiAgICBpZiAoYiAmJiBiLnZhbHVlICE9PSBudWxsKSB7IHJldHVybiBiLnZhbHVlID49IHRoaXMuYmFyTWFyayhiKTsgfVxyXG4gICAgY29uc3QgYXZnID0gdGhpcy5hdmVyYWdlU2NvcmU7XHJcbiAgICByZXR1cm4gYXZnICE9PSBudWxsICYmIGF2ZyA+PSB0aGlzLnBhc3NNYXJrO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZvY3VzU3RhdHVzKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBiID0gdGhpcy5mb2N1c0JhcjtcclxuICAgIGNvbnN0IGhhcyA9IChiICYmIGIudmFsdWUgIT09IG51bGwpIHx8IHRoaXMuYXZlcmFnZVNjb3JlICE9PSBudWxsO1xyXG4gICAgaWYgKCFoYXMpIHsgcmV0dXJuICdObyBkYXRhJzsgfVxyXG4gICAgcmV0dXJuIHRoaXMuZm9jdXNQYXNzZWQgPyB0aGlzLmxhYmVscy5wYXNzIDogJ0JlbG93IHBhc3MgbWFyayc7XHJcbiAgfVxyXG5cclxuICBnZXQgZm9jdXNMaW5lKCk6IHN0cmluZyB7XHJcbiAgICAvLyBTdWJtaXR0ZWQgYXVkaXRzLCBhcyB0aGUgYmFycyBjb3VudCB0aGVtIChcIjEwIGF1ZGl0c1wiKTsgYXVkaXRlZENvdW50IGNvdW50cyBhdWRpdGVkIHN0b3Jlcy5cclxuICAgIGNvbnN0IG4gPSB0aGlzLmdyYWluID09PSAncXVhcnRlcidcclxuICAgICAgPyAodGhpcy5mb2N1c0Jhcj8uc3VibWl0dGVkID8/IDApXHJcbiAgICAgIDogdGhpcy50cmVuZC5yZWR1Y2UoKHN1bSwgYikgPT4gc3VtICsgKGIuc3VibWl0dGVkIHx8IDApLCAwKTtcclxuICAgIHJldHVybiB0aGlzLnBlcmlvZExhYmVsICsgJyDCtyAnICsgbiArIChuID09PSAxID8gJyBhdWRpdCBjb21wbGV0ZWQnIDogJyBhdWRpdHMgY29tcGxldGVkJylcclxuICAgICAgKyAodGhpcy5zaG93UGFzc01hcmtJbmZvID8gJyDCtyAnICsgdGhpcy5wYXNzTWFya1RleHQgOiAnJyk7XHJcbiAgfVxyXG5cclxuICAvKiogXCJwYXNzIG1hcmsgNzUlXCIsIG9yIFwicGFzcyBtYXJrIHZhcmllcyBieSBhdWRpdFwiIHdoZW4gdGhlIGF1ZGl0cyBpbiBzY29wZSBhcmUgY29uZmlndXJlZCBkaWZmZXJlbnRseS4gKi9cclxuICBnZXQgcGFzc01hcmtUZXh0KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5wYXNzTWFya01peGVkID8gJ3Bhc3MgbWFyayB2YXJpZXMgYnkgYXVkaXQnIDogJ3Bhc3MgbWFyayAnICsgdGhpcy5wYXNzTWFyayArICclJztcclxuICB9XHJcblxyXG4gIHNldFBlcmZUYWIodGFiOiAnQXVkaXQnIHwgJ1N0b3JlJyB8ICdVc2VyJyk6IHZvaWQge1xyXG4gICAgdGhpcy5wZXJmVGFiID0gdGFiO1xyXG4gICAgdGhpcy5wZXJmU2VhcmNoID0gJyc7XHJcbiAgICB0aGlzLnBlcmZTb3J0S2V5ID0gJyc7XHJcbiAgICB0aGlzLnBlcmZTb3J0RGlyID0gJ2FzYyc7XHJcbiAgICB0aGlzLnBlcmZQYWdlID0gMTtcclxuICB9XHJcblxyXG4gIC8qKiBSb3dzIGluIHRoZSBvcGVuIHBlcmZvcm1hbmNlIHRhYmxlIGFmdGVyIHNlYXJjaCAvIHNvcnQgKHdoYXQgdGhlIHBhZ2VyIGNvdW50cykuICovXHJcbiAgZ2V0IHBlcmZUb3RhbCgpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMucGVyZlRhYiA9PT0gJ0F1ZGl0JykgeyByZXR1cm4gdGhpcy5pc1Rhc2tNb2R1bGUgPyB0aGlzLmZpbHRlcmVkVGFza1BlcmYubGVuZ3RoIDogdGhpcy5maWx0ZXJlZEF1ZGl0UGVyZi5sZW5ndGg7IH1cclxuICAgIHJldHVybiB0aGlzLnBlcmZUYWIgPT09ICdTdG9yZScgPyB0aGlzLmZpbHRlcmVkU3RvcmVQZXJmLmxlbmd0aCA6IHRoaXMuZmlsdGVyZWRVc2VyUGVyZi5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIGN1cnJlbnQgcGFnZSBvZiBhIHBlcmZvcm1hbmNlIHRhYmxlOyBhIHNlYXJjaCB0aGF0IHNocmlua3MgdGhlIGxpc3QgcHVsbHMgdGhlIHBhZ2UgYmFjayBpbnRvIHJhbmdlLiAqL1xyXG4gIHBlcmZQYWdlT2Y8VD4obGlzdDogVFtdKTogVFtdIHtcclxuICAgIGNvbnN0IHBhZ2VzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGxpc3QubGVuZ3RoIC8gdGhpcy5wZXJmUGFnZVNpemUpKTtcclxuICAgIGNvbnN0IHBhZ2UgPSBNYXRoLm1pbih0aGlzLnBlcmZQYWdlLCBwYWdlcyk7XHJcbiAgICByZXR1cm4gbGlzdC5zbGljZSgocGFnZSAtIDEpICogdGhpcy5wZXJmUGFnZVNpemUsIHBhZ2UgKiB0aGlzLnBlcmZQYWdlU2l6ZSk7XHJcbiAgfVxyXG5cclxuICBvblBlcmZQYWdlKHBhZ2U6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5wZXJmUGFnZSA9IE51bWJlcihwYWdlKSB8fCAxO1xyXG4gIH1cclxuXHJcbiAgb25QZXJmUGFnZVNpemUoc2l6ZTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnBlcmZQYWdlU2l6ZSA9IE51bWJlcihzaXplKSB8fCAxMDtcclxuICAgIHRoaXMucGVyZlBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgLyoqIEEgbmV3IHNlYXJjaCBzdGFydHMgb24gcGFnZSAxLiAqL1xyXG4gIG9uUGVyZlNlYXJjaCgpOiB2b2lkIHtcclxuICAgIHRoaXMucGVyZlBhZ2UgPSAxO1xyXG4gIH1cclxuXHJcbiAgLyoqIFBlcmZvcm1hbmNlIGhlYWRlciBjbGljazogc29ydCBieSB0aGF0IGNvbHVtbiwgYWdhaW4gdG8gcmV2ZXJzZSAoc2FtZSB0b2dnbGUgYXMgdGhlIHN0b3JlIGxpc3QpLiAqL1xyXG4gIHNvcnRQZXJmKGtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5wZXJmU29ydEtleSA9PT0ga2V5KSB7XHJcbiAgICAgIHRoaXMucGVyZlNvcnREaXIgPSB0aGlzLnBlcmZTb3J0RGlyID09PSAnYXNjJyA/ICdkZXNjJyA6ICdhc2MnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5wZXJmU29ydEtleSA9IGtleTtcclxuICAgICAgdGhpcy5wZXJmU29ydERpciA9ICdhc2MnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUm93cyBpbiB0aGUgcGlja2VkIGNvbHVtbiBvcmRlciAodGhlIEFQSSdzIG9yZGVyIHdoZW4gbm9uZSBpcyBwaWNrZWQpLiBOdW1iZXJzIGNvbXBhcmUgYXMgbnVtYmVycywgdGV4dFxyXG4gICAqIGNhc2UtaW5zZW5zaXRpdmVseTsgZW1wdHkgdmFsdWVzICgn4oCUJykgc3RheSBhdCB0aGUgYm90dG9tIGluIGJvdGggZGlyZWN0aW9ucywgYXMgaW4gdGhlIHN0b3JlIGxpc3QuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzb3J0UGVyZlJvd3M8VD4ocm93czogVFtdLCB2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIChyOiBUKSA9PiBTb3J0VmFsdWU+KTogVFtdIHtcclxuICAgIGNvbnN0IGdldCA9IHZhbHVlc1t0aGlzLnBlcmZTb3J0S2V5XTtcclxuICAgIGlmICghZ2V0KSB7IHJldHVybiByb3dzOyB9XHJcbiAgICBjb25zdCBkaXIgPSB0aGlzLnBlcmZTb3J0RGlyID09PSAnYXNjJyA/IDEgOiAtMTtcclxuICAgIGNvbnN0IGVtcHR5ID0gKHY6IFNvcnRWYWx1ZSkgPT4gdiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWQgfHwgdiA9PT0gJycgfHwgdiA9PT0gJ+KAlCc7XHJcbiAgICByZXR1cm4gWy4uLnJvd3NdLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgY29uc3QgYXYgPSBnZXQoYSk7XHJcbiAgICAgIGNvbnN0IGJ2ID0gZ2V0KGIpO1xyXG4gICAgICBpZiAoZW1wdHkoYXYpIHx8IGVtcHR5KGJ2KSkgeyByZXR1cm4gZW1wdHkoYXYpID09PSBlbXB0eShidikgPyAwIDogKGVtcHR5KGF2KSA/IDEgOiAtMSk7IH1cclxuICAgICAgaWYgKHR5cGVvZiBhdiA9PT0gJ251bWJlcicgJiYgdHlwZW9mIGJ2ID09PSAnbnVtYmVyJykgeyByZXR1cm4gKGF2IC0gYnYpICogZGlyOyB9XHJcbiAgICAgIHJldHVybiBTdHJpbmcoYXYpLmxvY2FsZUNvbXBhcmUoU3RyaW5nKGJ2KSwgdW5kZWZpbmVkLCB7IG51bWVyaWM6IHRydWUsIHNlbnNpdGl2aXR5OiAnYmFzZScgfSkgKiBkaXI7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBTdWJtaXR0ZWQgY291bnQgLT4gdGhlIEdhbGxlcnkgb24gdGhpcyBhdWRpdCdzIHN1Ym1pc3Npb25zIGluIHRoZSBkYXNoYm9hcmQgcGVyaW9kLiAqL1xyXG4gIHN1Ym1pdHRlZFBhcmFtcyhyb3c6IEF1ZGl0UGVyZlJvdyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgYXVkaXQ6IFN0cmluZyhyb3cucmF3Py5zb3VyY2VDaGVja0xpc3RfaWQgfHwgcm93LnJhdz8uX2lkIHx8ICcnKSxcclxuICAgICAgZnJvbTogdGhpcy5mcm9tIHx8IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uc3RhcnREYXRlIHx8ICcnLFxyXG4gICAgICB0bzogdGhpcy50byB8fCB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LmVuZERhdGUgfHwgJydcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKiogVGFzayBTdWJtaXR0ZWQgY291bnQgLT4gdGhlIEdhbGxlcnkgd2l0aCBUeXBlIFRhc2sgb24gdGhpcyB0YXNrJ3Mgc3VibWlzc2lvbnMgaW4gdGhlIGRhc2hib2FyZCBwZXJpb2QuICovXHJcbiAgdGFza1N1Ym1pdHRlZFBhcmFtcyhyb3c6IFRhc2tQZXJmUm93KTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBhdWRpdDogU3RyaW5nKHJvdy5yYXc/LnRhc2tJZCB8fCAnJyksXHJcbiAgICAgIHR5cGU6ICd0YXNrJyxcclxuICAgICAgZnJvbTogdGhpcy5mcm9tIHx8IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uc3RhcnREYXRlIHx8ICcnLFxyXG4gICAgICB0bzogdGhpcy50byB8fCB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LmVuZERhdGUgfHwgJydcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKiogRmxhZ3MgY291bnQ6IHRoZSBzYW1lIEdhbGxlcnkgbGluaywgb25seSBmbGFnZ2VkIHN1Ym1pc3Npb25zICg/ZmxhZz0xKS4gKi9cclxuICB0YXNrRmxhZ1BhcmFtcyhyb3c6IFRhc2tQZXJmUm93KTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XHJcbiAgICByZXR1cm4geyAuLi50aGlzLnRhc2tTdWJtaXR0ZWRQYXJhbXMocm93KSwgZmxhZzogJzEnIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBdWRpdCAvIHN0b3JlIC8gdXNlciBkZXRhaWwgbGluazogdGhlIHN1YmplY3QgcGx1cyB0aGUgZGFzaGJvYXJkIHBlcmlvZCAoZnJvbSAvIHRvKSwgc28gdGhlIGRldGFpbFxyXG4gICAqIHBhZ2Ugc2hvd3MgdGhlIHNhbWUgZGF5cyBhcyB0aGUgcm93IGNsaWNrZWQsIG5vdCB0aGUgaGVhZGVyIHJhbmdlICh0aGUgZGFzaGJvYXJkIGtlZXBzIGl0cyBvd24gcGVyaW9kKS5cclxuICAgKi9cclxuICBkZXRhaWxQYXJhbXMoc3ViamVjdDogUmVjb3JkPHN0cmluZywgYW55Pik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLi4uc3ViamVjdCxcclxuICAgICAgZnJvbTogdGhpcy5mcm9tIHx8IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uc3RhcnREYXRlIHx8ICcnLFxyXG4gICAgICB0bzogdGhpcy50byB8fCB0aGlzLmhlYWRlckRhdGE/LmRhdGU/LmVuZERhdGUgfHwgJydcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwZXJmVGFiTGFiZWwodGFiOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRhYiArICcgUGVyZm9ybWFuY2UnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBlcmZTZWFyY2hQbGFjZWhvbGRlcigpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMucGVyZlRhYiA9PT0gJ1N0b3JlJykgeyByZXR1cm4gJ1NlYXJjaCBieSBTdG9yZSBOYW1lJzsgfVxyXG4gICAgaWYgKHRoaXMucGVyZlRhYiA9PT0gJ1VzZXInKSB7IHJldHVybiAnU2VhcmNoIGJ5IFVzZXIgTmFtZSc7IH1cclxuICAgIHJldHVybiAnU2VhcmNoIGJ5ICcgKyB0aGlzLm1vZHVsZVRhYjtcclxuICB9XHJcblxyXG4gIGdldCBmaWx0ZXJlZEF1ZGl0UGVyZigpOiBBdWRpdFBlcmZSb3dbXSB7XHJcbiAgICBjb25zdCBxID0gdGhpcy5wZXJmU2VhcmNoLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuc29ydFBlcmZSb3dzKHEgPyB0aGlzLmF1ZGl0UGVyZi5maWx0ZXIociA9PiByLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSkgOiB0aGlzLmF1ZGl0UGVyZiwgdGhpcy5hdWRpdFNvcnRWYWx1ZSk7XHJcbiAgfVxyXG5cclxuICBnZXQgZmlsdGVyZWRTdG9yZVBlcmYoKTogU3RvcmVQZXJmUm93W10ge1xyXG4gICAgY29uc3QgcSA9IHRoaXMucGVyZlNlYXJjaC50cmltKCkudG9Mb3dlckNhc2UoKTtcclxuICAgIHJldHVybiB0aGlzLnNvcnRQZXJmUm93cyhxID8gdGhpcy5zdG9yZVBlcmYuZmlsdGVyKHIgPT4gKHIuc3RvcmUgKyAnICcgKyByLnN0b3JlSWQgKyAnICcgKyByLnNwb2MpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkpIDogdGhpcy5zdG9yZVBlcmYsIHRoaXMuc3RvcmVTb3J0VmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZpbHRlcmVkVXNlclBlcmYoKTogVXNlclBlcmZSb3dbXSB7XHJcbiAgICBjb25zdCBxID0gdGhpcy5wZXJmU2VhcmNoLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuc29ydFBlcmZSb3dzKHEgPyB0aGlzLnVzZXJQZXJmLmZpbHRlcihyID0+IChyLm5hbWUgKyAnICcgKyByLmVtYWlsKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKSA6IHRoaXMudXNlclBlcmYsIHRoaXMudXNlclNvcnRWYWx1ZSk7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5UGVyZkF1ZGl0KF86IG51bWJlciwgcm93OiBBdWRpdFBlcmZSb3cpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHJvdy5yYXc/LnNvdXJjZUNoZWNrTGlzdF9pZCB8fCByb3cubmFtZTtcclxuICB9XHJcblxyXG4gIHRyYWNrQnlQZXJmU3RvcmUoXzogbnVtYmVyLCByb3c6IFN0b3JlUGVyZlJvdyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcm93LnN0b3JlSWQgfHwgcm93LnN0b3JlO1xyXG4gIH1cclxuXHJcbiAgdHJhY2tCeVBlcmZVc2VyKF86IG51bWJlciwgcm93OiBVc2VyUGVyZlJvdyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcm93LmVtYWlsO1xyXG4gIH1cclxuXHJcbiAgb25QYWdlQ2hhbmdlKHBhZ2U6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5wYWdlID0gTnVtYmVyKHBhZ2UpIHx8IDE7XHJcbiAgfVxyXG5cclxuICBvblBhZ2VTaXplQ2hhbmdlKHNpemU6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5wYWdlU2l6ZSA9IE51bWJlcihzaXplKSB8fCAxMDtcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5U3RvcmUoXzogbnVtYmVyLCByb3c6IEF1ZGl0Um93KTogc3RyaW5nIHtcclxuICAgIHJldHVybiByb3cuc3RvcmVJZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGZpbHRlckNhdHMgLyBiYW5kUm93cyBhcmUgZ2V0dGVycyB0aGF0IGJ1aWxkIG5ldyBvYmplY3RzIG9uIGV2ZXJ5IGNoYW5nZSBkZXRlY3Rpb24uIFdpdGhvdXQgYSBrZXlcclxuICAgKiBuZ0ZvciByZWJ1aWxkcyB0aGVpciBidXR0b25zIG9uIGVhY2ggcGFzcywgYW5kIGEgcGFzcyBiZXR3ZWVuIG1vdXNlZG93biBhbmQgbW91c2V1cCAodGhlIGhpZXJhcmNoeVxyXG4gICAqIGRyb3Bkb3duIGxpc3RlbnMgdG8gZG9jdW1lbnQ6bW91c2Vkb3duKSBzd2FsbG93cyB0aGUgY2xpY2suXHJcbiAgICovXHJcbiAgdHJhY2tCeUNhdChfOiBudW1iZXIsIGM6IEZpbHRlckNhdCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYy5rZXk7XHJcbiAgfVxyXG5cclxuICB0cmFja0J5QmFuZChfOiBudW1iZXIsIGI6IHsgYmFuZDogQXVkaXRCYW5kIH0pOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGIuYmFuZC5rZXk7XHJcbiAgfVxyXG5cclxuICAvKiogLS0tLSBFeHBvcnQgKGNsaWVudC1zaWRlIC54bHN4IG9mIGV4YWN0bHkgdGhlIGZpbHRlcmVkIHJvd3MgYW5kIHZpc2libGUgY29sdW1ucykgLS0tLSAqL1xyXG5cclxuICBwcml2YXRlIGdldCBleHBvcnRQZXJpb2QoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmZyb20gKyAnXycgKyB0aGlzLnRvO1xyXG4gIH1cclxuXHJcbiAgLyoqIEhlYWRlciBFeHBvcnQ6IHRoZSBzdG9yZSBsaXN0IGJlbG93IHRoZSBmaWx0ZXJzLCBldmVyeSBmaWx0ZXJlZCByb3cgKGFsbCBwYWdlcyksIGl0cyB2aXNpYmxlIGNvbHVtbnMuICovXHJcbiAgZXhwb3J0U3RvcmVzKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgcm93cyA9IHRoaXMuZmlsdGVyZWRSb3dzO1xyXG4gICAgaWYgKHRoaXMubG9hZGluZyB8fCAhcm93cy5sZW5ndGgpIHsgcmV0dXJuOyB9XHJcbiAgICBjb25zdCBjb2x1bW5zOiBFeHBvcnRDb2x1bW48QXVkaXRSb3c+W10gPSB0aGlzLmhlYWRlcnMubWFwKGggPT4gKHtcclxuICAgICAgaGVhZGVyOiBoLmxhYmVsLFxyXG4gICAgICB2YWx1ZTogKHI6IEF1ZGl0Um93KSA9PiB7XHJcbiAgICAgICAgaWYgKGgua2V5ID09PSAnc2NvcmUnKSB7IHJldHVybiByLnNjb3JlID09PSBudWxsID8gJ+KAlCcgOiByLnNjb3JlICsgJyUnOyB9XHJcbiAgICAgICAgaWYgKGgua2V5ID09PSAnc3RhdHVzJykgeyByZXR1cm4gdGhpcy5zdGF0dXNMYWJlbChyKTsgfVxyXG4gICAgICAgIHJldHVybiByW2gua2V5IGFzIGtleW9mIEF1ZGl0Um93XTtcclxuICAgICAgfVxyXG4gICAgfSkpO1xyXG4gICAgdGhpcy50cmF4U2VydmljZS5leHBvcnRSb3dzWGxzeChyb3dzLCBjb2x1bW5zLCAnQXVkaXQtRGFzaGJvYXJkLVN0b3Jlcy0nICsgdGhpcy5leHBvcnRQZXJpb2QsICdTdG9yZSBsaXN0Jyk7XHJcbiAgfVxyXG5cclxuICAvKiogUm93cyBvZiB0aGUgYWN0aXZlIHBlcmZvcm1hbmNlIHRhYiBhZnRlciBpdHMgc2VhcmNoICh3aGF0IHRoZSBcIlRvdGFsXCIgY291bnRlciBzaG93cykuICovXHJcbiAgZ2V0IHBlcmZSb3dDb3VudCgpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMucGVyZlRhYiA9PT0gJ1N0b3JlJykgeyByZXR1cm4gdGhpcy5maWx0ZXJlZFN0b3JlUGVyZi5sZW5ndGg7IH1cclxuICAgIGlmICh0aGlzLnBlcmZUYWIgPT09ICdVc2VyJykgeyByZXR1cm4gdGhpcy5maWx0ZXJlZFVzZXJQZXJmLmxlbmd0aDsgfVxyXG4gICAgcmV0dXJuIHRoaXMuaXNUYXNrTW9kdWxlID8gdGhpcy5maWx0ZXJlZFRhc2tQZXJmLmxlbmd0aCA6IHRoaXMuZmlsdGVyZWRBdWRpdFBlcmYubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBhY3RpdmUgcGVyZm9ybWFuY2UgdGFiIGlzIHN0aWxsIGxvYWRpbmcgKHRoZSBUYXNrIHRhYmxlIGhhcyBpdHMgb3duIGZlZWQpLiAqL1xyXG4gIGdldCBwZXJmTG9hZGluZygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnBlcmZUYWIgPT09ICdBdWRpdCcgJiYgdGhpcy5pc1Rhc2tNb2R1bGUgPyB0aGlzLnRhc2tMb2FkaW5nIDogdGhpcy5sb2FkaW5nO1xyXG4gIH1cclxuXHJcbiAgLyoqIFBlcmZvcm1hbmNlIEV4cG9ydDogdGhlIGFjdGl2ZSB0YWIncyBmaWx0ZXJlZCBsaXN0IHdpdGggaXRzIHZpc2libGUgY29sdW1uIGhlYWRlcnMgKEFjdGlvbiBsZWZ0IG91dCkuICovXHJcbiAgZXhwb3J0UGVyZm9ybWFuY2UoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5wZXJmTG9hZGluZyB8fCAhdGhpcy5wZXJmUm93Q291bnQpIHsgcmV0dXJuOyB9XHJcbiAgICBjb25zdCBwZXJpb2QgPSB0aGlzLmV4cG9ydFBlcmlvZDtcclxuICAgIGlmICh0aGlzLnBlcmZUYWIgPT09ICdTdG9yZScpIHtcclxuICAgICAgY29uc3QgY29sdW1uczogRXhwb3J0Q29sdW1uPFN0b3JlUGVyZlJvdz5bXSA9IFtcclxuICAgICAgICB7IGhlYWRlcjogJ1N0b3JlIE5hbWUnLCB2YWx1ZTogciA9PiByLnN0b3JlIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdTdG9yZSBJRCcsIHZhbHVlOiByID0+IHIuc3RvcmVJZCB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnU3RvcmUgU3BvYycsIHZhbHVlOiByID0+IHIuc3BvYyB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnQXNzaWduZWQnLCB2YWx1ZTogciA9PiByLmFzc2lnbmVkIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdGbGFncycsIHZhbHVlOiByID0+IHIuZmxhZ3MgPz8gJ+KAlCcgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ0NvbXBsZXRpb24gJScsIHZhbHVlOiByID0+IHIuY29tcGxldGlvbiB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnQ29tcGxpYW5jZSAlJywgdmFsdWU6IHIgPT4gci5jb21wbGlhbmNlIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdQZXJmb3JtYW5jZSAlJywgdmFsdWU6IHIgPT4gci5wZXJmIH1cclxuICAgICAgXTtcclxuICAgICAgdGhpcy50cmF4U2VydmljZS5leHBvcnRSb3dzWGxzeCh0aGlzLmZpbHRlcmVkU3RvcmVQZXJmLCBjb2x1bW5zLCAnQXVkaXQtRGFzaGJvYXJkLVN0b3JlLVBlcmZvcm1hbmNlLScgKyBwZXJpb2QsICdTdG9yZSBQZXJmb3JtYW5jZScpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5wZXJmVGFiID09PSAnVXNlcicpIHtcclxuICAgICAgY29uc3QgY29sdW1uczogRXhwb3J0Q29sdW1uPFVzZXJQZXJmUm93PltdID0gW1xyXG4gICAgICAgIHsgaGVhZGVyOiAnVXNlciBOYW1lJywgdmFsdWU6IHIgPT4gci5uYW1lIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdFbWFpbCcsIHZhbHVlOiByID0+IHIuZW1haWwgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ0Fzc2lnbmVkJywgdmFsdWU6IHIgPT4gci5hc3NpZ25lZCB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnRmxhZ3MnLCB2YWx1ZTogciA9PiByLmZsYWdzIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdSZURvJywgdmFsdWU6IHIgPT4gci5yZWRvIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdDb21wbGV0aW9uICUnLCB2YWx1ZTogciA9PiByLmNvbXBsZXRpb24gfSxcclxuICAgICAgICB7IGhlYWRlcjogJ0NvbXBsaWFuY2UgJScsIHZhbHVlOiByID0+IHIuY29tcGxpYW5jZSB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnUGVyZm9ybWFuY2UgJScsIHZhbHVlOiByID0+IHIucGVyZiB9XHJcbiAgICAgIF07XHJcbiAgICAgIHRoaXMudHJheFNlcnZpY2UuZXhwb3J0Um93c1hsc3godGhpcy5maWx0ZXJlZFVzZXJQZXJmLCBjb2x1bW5zLCAnQXVkaXQtRGFzaGJvYXJkLVVzZXItUGVyZm9ybWFuY2UtJyArIHBlcmlvZCwgJ1VzZXIgUGVyZm9ybWFuY2UnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaXNUYXNrTW9kdWxlKSB7XHJcbiAgICAgIGNvbnN0IGNvbHVtbnM6IEV4cG9ydENvbHVtbjxUYXNrUGVyZlJvdz5bXSA9IFtcclxuICAgICAgICB7IGhlYWRlcjogJ1Rhc2sgTmFtZScsIHZhbHVlOiByID0+IHIubmFtZSB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnQ3JlYXRlZCBieScsIHZhbHVlOiByID0+IHIuY3JlYXRlZEJ5IH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdDcmVhdGVkIE9uJywgdmFsdWU6IHIgPT4gci5jcmVhdGVkT24gfSxcclxuICAgICAgICB7IGhlYWRlcjogJ1ByaW9yaXR5JywgdmFsdWU6IHIgPT4gci5wcmlvcml0eSB9LFxyXG4gICAgICAgIHsgaGVhZGVyOiAnQXNzaWduZWQgVG8nLCB2YWx1ZTogciA9PiByLmFzc2lnbmVkIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdTdWJtaXR0ZWQnLCB2YWx1ZTogciA9PiByLnN1Ym1pdHRlZCB8fCAnLS0nIH0sXHJcbiAgICAgICAgeyBoZWFkZXI6ICdSZWRvJywgdmFsdWU6IHIgPT4gci5yZWRvIHx8ICctLScgfSxcclxuICAgICAgICB7IGhlYWRlcjogJ0R1ZSBvbicsIHZhbHVlOiByID0+IHIuZHVlT24gfVxyXG4gICAgICBdO1xyXG4gICAgICB0aGlzLnRyYXhTZXJ2aWNlLmV4cG9ydFJvd3NYbHN4KHRoaXMuZmlsdGVyZWRUYXNrUGVyZiwgY29sdW1ucywgJ0F1ZGl0LURhc2hib2FyZC1UYXNrLVBlcmZvcm1hbmNlLScgKyBwZXJpb2QsICdUYXNrIFBlcmZvcm1hbmNlJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGNvbHVtbnM6IEV4cG9ydENvbHVtbjxBdWRpdFBlcmZSb3c+W10gPSBbXHJcbiAgICAgIHsgaGVhZGVyOiAnQXVkaXQgTmFtZScsIHZhbHVlOiByID0+IHIubmFtZSB9LFxyXG4gICAgICB7IGhlYWRlcjogJ0Fzc2lnbmVkIFRvJywgdmFsdWU6IHIgPT4gci5hc3NpZ25lZCB9LFxyXG4gICAgICB7IGhlYWRlcjogJ1N1Ym1pdHRlZCcsIHZhbHVlOiByID0+IHIuc3VibWl0dGVkIH0sXHJcbiAgICAgIHsgaGVhZGVyOiAnRGlzcHV0ZXMnLCB2YWx1ZTogciA9PiByLmRpc3B1dGVzID8/ICfigJQnIH0sXHJcbiAgICAgIHsgaGVhZGVyOiAnUGFzcyBNYXJrJywgdmFsdWU6IHIgPT4gci5wYXNzTWFyayB9LFxyXG4gICAgICB7IGhlYWRlcjogJ1Njb3JlJywgdmFsdWU6IHIgPT4gci5zY29yZSB9LFxyXG4gICAgICB7IGhlYWRlcjogJ1Jlc3VsdCcsIHZhbHVlOiByID0+IHRoaXMucmVzdWx0VGV4dChyLnJlc3VsdCkgfVxyXG4gICAgXTtcclxuICAgIHRoaXMudHJheFNlcnZpY2UuZXhwb3J0Um93c1hsc3godGhpcy5maWx0ZXJlZEF1ZGl0UGVyZiwgY29sdW1ucywgJ0F1ZGl0LURhc2hib2FyZC1BdWRpdC1QZXJmb3JtYW5jZS0nICsgcGVyaW9kLCAnQXVkaXQgUGVyZm9ybWFuY2UnKTtcclxuICB9XHJcblxyXG4gIC8qKiAtLS0tIFBlci1zdG9yZSBQREYgLS0tLSAqL1xyXG5cclxuICAvKiogVGhlIHN0b3JlJ3MgbGF0ZXN0IHN1Ym1pdHRlZCBhdWRpdCBpbiB0aGUgcGVyaW9kICh0aGUgZGFzaGJvYXJkIEFQSSdzIGxhc3RWaXNpdElkKSwgaWYgYW55LiAqL1xyXG4gIHBkZlZpc2l0SWQocm93OiBBdWRpdFJvdyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gcm93LnJhdz8ubGFzdFZpc2l0SWQgPyBTdHJpbmcocm93LnJhdy5sYXN0VmlzaXRJZCkgOiAnJztcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgYXVkaXQgb2YgdGhhdCBsYXRlc3Qgc3VibWlzc2lvbiAobGFzdFZpc2l0QXVkaXRJZCk6IFZpZXcgb3BlbnMgaXQgaW4gdGhlIEdhbGxlcnkuICcnIHdpdGhvdXQgb25lLiAqL1xyXG4gIGdhbGxlcnlBdWRpdElkKHJvdzogQXVkaXRSb3cpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHJvdy5yYXc/Lmxhc3RWaXNpdEF1ZGl0SWQgPyBTdHJpbmcocm93LnJhdy5sYXN0VmlzaXRBdWRpdElkKSA6ICcnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGF1ZGl0cyBhIHN0b3JlIHN1Ym1pdHRlZCBpbiB0aGUgcGVyaW9kIChBUEkgYXVkaXRMaXN0OiBuYW1lLCBzdWJtaXNzaW9ucywgdGhhdCBhdWRpdCdzIGF2ZXJhZ2Ugc2NvcmUpLiBXaXRoXHJcbiAgICogbW9yZSB0aGFuIG9uZSwgVmlldyBvcGVucyBhIG1lbnUgdG8gcGljayB0aGUgYXVkaXQgdGhlIEdhbGxlcnkgb3BlbnMgb24gKHRoZSBHYWxsZXJ5IHJlYWRzIG9uZSBhdWRpdCBhdCBhIHRpbWUpLlxyXG4gICAqL1xyXG4gIHN0b3JlQXVkaXRzKHJvdzogQXVkaXRSb3cpOiBBcnJheTx7IGF1ZGl0SWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBzdWJtaXR0ZWQ6IG51bWJlcjsgc2NvcmU6IG51bWJlciB8IG51bGwgfT4ge1xyXG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocm93LnJhdz8uYXVkaXRMaXN0KSA/IHJvdy5yYXcuYXVkaXRMaXN0IDogW107XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIHN0b3JlIHJvdyB3aG9zZSBWaWV3IG1lbnUgaXMgb3BlbiAoJycgPSBub25lKS4gKi9cclxuICB2aWV3TWVudVN0b3JlID0gJyc7XHJcblxyXG4gIC8qKiBUaGUgb3BlbiBWaWV3IG1lbnUncyBwbGFjZSBvbiBzY3JlZW4gKGZpeGVkLCBzbyB0aGUgc2Nyb2xsaW5nIHRhYmxlIG5ldmVyIGNsaXBzIGl0KS4gKi9cclxuICB2aWV3TWVudVBvcyA9IHsgdG9wOiAwLCByaWdodDogMCB9O1xyXG5cclxuICB0b2dnbGVWaWV3TWVudShyb3c6IEF1ZGl0Um93LCBldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgY29uc3Qga2V5ID0gU3RyaW5nKHJvdy5yYXc/LnN0b3JlSWQgfHwgcm93LnN0b3JlSWQpO1xyXG4gICAgaWYgKHRoaXMudmlld01lbnVTdG9yZSA9PT0ga2V5KSB7XHJcbiAgICAgIHRoaXMudmlld01lbnVTdG9yZSA9ICcnO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCByZWN0ID0gKGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgdGhpcy52aWV3TWVudVBvcyA9IHsgdG9wOiByZWN0LmJvdHRvbSArIDYsIHJpZ2h0OiBNYXRoLm1heCg4LCB3aW5kb3cuaW5uZXJXaWR0aCAtIHJlY3QucmlnaHQpIH07XHJcbiAgICB0aGlzLnZpZXdNZW51U3RvcmUgPSBrZXk7XHJcbiAgfVxyXG5cclxuICBpc1ZpZXdNZW51T3Blbihyb3c6IEF1ZGl0Um93KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISF0aGlzLnZpZXdNZW51U3RvcmUgJiYgdGhpcy52aWV3TWVudVN0b3JlID09PSBTdHJpbmcocm93LnJhdz8uc3RvcmVJZCB8fCByb3cuc3RvcmVJZCk7XHJcbiAgfVxyXG5cclxuICAvKiogQSBjbGljayBhbnl3aGVyZSBlbHNlLCBhIHNjcm9sbCBvciBhIHJlc2l6ZSBjbG9zZXMgdGhlIFZpZXcgbWVudS4gKi9cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycpXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnNjcm9sbCcpXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXHJcbiAgY2xvc2VWaWV3TWVudSgpOiB2b2lkIHtcclxuICAgIHRoaXMudmlld01lbnVTdG9yZSA9ICcnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIEdhbGxlcnkncyBFeHBvcnQgYXMgUERGIChQT1NUIC90cmF4L2F1ZGl0L2dhbGxlcnkvZG93bmxvYWQpIGZvciB0aGlzIHN0b3JlOiB0aGUgYXVkaXQgb2YgaXRzIGxhdGVzdCBzdWJtaXNzaW9uXHJcbiAgICogKHRoZSBhdWRpdCBWaWV3IG9wZW5zIGluIHRoZSBHYWxsZXJ5KSwgdGhlIGRhc2hib2FyZCdzIHBlcmlvZCwgZXZlcnkgcXVlc3Rpb24gYW5kIG5vIG90aGVyIGZpbHRlci5cclxuICAgKiBRdWV1ZWQsIHRoZW4gbGlzdGVkIHVuZGVyIE5vdGlmaWNhdGlvbnMgPiBEb3dubG9hZHMuXHJcbiAgICovXHJcbiAgZG93bmxvYWRQZGYocm93OiBBdWRpdFJvdyk6IHZvaWQge1xyXG4gICAgY29uc3QgYXVkaXRJZCA9IHRoaXMuZ2FsbGVyeUF1ZGl0SWQocm93KTtcclxuICAgIGNvbnN0IHN0b3JlSWQgPSByb3cucmF3Py5zdG9yZUlkIHx8IHJvdy5zdG9yZUlkO1xyXG4gICAgY29uc3Qga2V5ID0gYXVkaXRJZCArICd8JyArIHN0b3JlSWQ7XHJcbiAgICBpZiAoIWF1ZGl0SWQgfHwgdGhpcy5wZGZRdWV1ZWQuaGFzKGtleSkpIHsgcmV0dXJuOyB9XHJcbiAgICB0aGlzLnBkZlF1ZXVlZC5hZGQoa2V5KTtcclxuICAgIGNvbnN0IGZyb21EYXRlID0gdGhpcy5mcm9tIHx8IHRoaXMuaGVhZGVyRGF0YT8uZGF0ZT8uc3RhcnREYXRlO1xyXG4gICAgdGhpcy50cmF4U2VydmljZS5hdWRpdEdhbGxlcnlEb3dubG9hZCh7XHJcbiAgICAgIGNsaWVudElkOiB0aGlzLmhlYWRlckRhdGE/LmNsaWVudCxcclxuICAgICAgdHlwZTogdGhpcy5pc1Rhc2tNb2R1bGUgPyAndGFzaycgOiAnYXVkaXQnLFxyXG4gICAgICBzb3VyY2VDaGVja0xpc3RfaWQ6IGF1ZGl0SWQsXHJcbiAgICAgIGZyb21EYXRlLFxyXG4gICAgICB0b0RhdGU6IHRoaXMudG8gfHwgdGhpcy5oZWFkZXJEYXRhPy5kYXRlPy5lbmREYXRlIHx8IGZyb21EYXRlLFxyXG4gICAgICBmaWxlVHlwZTogJ3BkZicsXHJcbiAgICAgIGZpbHRlcnR5cGU6ICdDbHVzdGVycycsXHJcbiAgICAgIHN0b3JlSWRzOiBbc3RvcmVJZF0sXHJcbiAgICAgIHVzZXJFbWFpbExpc3Q6IFtdLFxyXG4gICAgICBxdWVzdGlvbnM6IFtdLFxyXG4gICAgICBhbnN3ZXJUeXBlOiAnYWxsJyxcclxuICAgICAgYXBwcm92ZUZpbHRlcjogJ2FsbCcsXHJcbiAgICAgIHZpZXdGbGFnOiBmYWxzZSxcclxuICAgICAgdmlld1JlZG86IGZhbHNlLFxyXG4gICAgICB2aWV3RGlzcHV0ZWQ6IGZhbHNlLFxyXG4gICAgICBwcmV2aWV3VHlwZTogJ2ltYWdlJ1xyXG4gICAgfSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMucGRmUXVldWVkLmRlbGV0ZShrZXkpO1xyXG4gICAgICAgIGlmIChyZXM/LmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRTdWNjZXNzVG9hc3QoXHJcbiAgICAgICAgICAgICc8ZGl2PjxzcGFuIGNsYXNzPVwibWUtOFwiPkRvd25sb2FkaW5nIHlvdXIgcmVwb3J0czwvc3Bhbj48YSBocmVmPVwibm90aWZpY2F0aW9ucy9hbGVydHM/dGFiPWRvd25sb2FkXCIgc3R5bGU9XCJjb2xvcjojOTljM2ZmOyB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lOyBjdXJzb3I6cG9pbnRlclwiPlZpZXc8L2E+PC9kaXY+J1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KHJlcz8ubWVzc2FnZSB8fCAnQ291bGQgbm90IHN0YXJ0IHRoZSBleHBvcnQnKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZTogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5wZGZRdWV1ZWQuZGVsZXRlKGtleSk7XHJcbiAgICAgICAgdGhpcy50b2FzdC5nZXRFcnJvclRvYXN0KGU/LmVycm9yPy5tZXNzYWdlIHx8IGU/LmVycm9yPy5lcnJvciB8fCAnQ291bGQgbm90IHN0YXJ0IHRoZSBleHBvcnQnKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJhdjItcGFnZSBhdWRpdC1kYXNoXCI+XHJcblxyXG4gIDwhLS0gUmVmcmVzaCBsaW5lICsgbW9kdWxlIHN3aXRjaCAtLT5cclxuICA8ZGl2IGNsYXNzPVwiZGItdG9wbGluZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImRiLXJlZnJlc2hcIj5MYXN0IHJlZnJlc2hlZCBhdCB7eyBsYXN0UmVmcmVzaGVkIH19PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXYyLWdyb3dcIj48L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2R1bGVzd2l0Y2hcIj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtb2R1bGV0YWJcIiAqbmdGb3I9XCJsZXQgdCBvZiBtb2R1bGVUYWJzXCIgW2NsYXNzLm1vZHVsZXRhYi1vbl09XCJtb2R1bGVUYWIgPT09IHRcIlxyXG4gICAgICAgIChjbGljayk9XCJzZXRNb2R1bGVUYWIodClcIj57eyB0IH19PC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSA9PT09PT09PT09PT0gQVVESVQgU0NPUkVDQVJEID09PT09PT09PT09PSAtLT5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzVGFza01vZHVsZVwiPlxyXG5cclxuICAgIDwhLS0gQ3J1bWIsIHNjb3BlIHRpdGxlLCBhY3Rpb25zIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImRiLXNjb3BlYmFyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkYi1zY29wZXRleHRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY3J1bWJcIj5BdWRpdHMg4oC6IERhc2hib2FyZDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zY29wZVwiPnt7IHNjb3BlTGFiZWwgfX08L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1naG9zdCBhdjItYnRuLS1zbVwiIChjbGljayk9XCJvcGVuRmlsdGVycygpXCI+XHJcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjhcIlxyXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICA8bGluZSB4MT1cIjRcIiB5MT1cIjdcIiB4Mj1cIjIwXCIgeTI9XCI3XCI+PC9saW5lPlxyXG4gICAgICAgICAgPGxpbmUgeDE9XCI3XCIgeTE9XCIxMlwiIHgyPVwiMTdcIiB5Mj1cIjEyXCI+PC9saW5lPlxyXG4gICAgICAgICAgPGxpbmUgeDE9XCIxMFwiIHkxPVwiMTdcIiB4Mj1cIjE0XCIgeTI9XCIxN1wiPjwvbGluZT5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICBGaWx0ZXJzXHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1jb3VudHBpbGxcIiAqbmdJZj1cImZpbHRlckNvdW50XCI+e3sgZmlsdGVyQ291bnQgfX08L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tZ2hvc3QgYXYyLWJ0bi0tc21cIiBbZGlzYWJsZWRdPVwibG9hZGluZyB8fCAhZmlsdGVyZWRSb3dzLmxlbmd0aFwiXHJcbiAgICAgICAgdGl0bGU9XCJEb3dubG9hZCB0aGUgc3RvcmUgbGlzdCBiZWxvdyBhcyBhbiBFeGNlbCBmaWxlXCIgKGNsaWNrKT1cImV4cG9ydFN0b3JlcygpXCI+XHJcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjhcIlxyXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICA8cGF0aCBkPVwiTTEyIDE2VjRcIj48L3BhdGg+XHJcbiAgICAgICAgICA8cG9seWxpbmUgcG9pbnRzPVwiNyA5IDEyIDQgMTcgOVwiPjwvcG9seWxpbmU+XHJcbiAgICAgICAgICA8cGF0aCBkPVwiTTQgMTZ2NGgxNnYtNFwiPjwvcGF0aD5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICBFeHBvcnRcclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIEZpbHRlciBjaGlwcyAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJkYi1jaGlwc1wiPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImRiLWNoaXBcIiAqbmdGb3I9XCJsZXQgYyBvZiBmaWx0ZXJDYXRzOyB0cmFja0J5OiB0cmFja0J5Q2F0XCIgW2NsYXNzLmlzLWRpcnR5XT1cImMuZGlydHlcIlxyXG4gICAgICAgIChjbGljayk9XCJvcGVuRmlsdGVycyhjLmtleSlcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWNoaXAtbGFiZWxcIj57eyBjLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZGItY2hpcC12YWx1ZVwiPnt7IGMudmFsdWUgfX08L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImRiLWNsZWFyYWxsXCIgKm5nSWY9XCJmaWx0ZXJDb3VudFwiIChjbGljayk9XCJjbGVhckFsbCgpXCI+Q2xlYXIgYWxsPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIEtQSSB0aWxlcyAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJkYi1rcGlzXCI+XHJcbiAgICAgIDwhLS0gT2xkIENoZWNrbGlzdCBzdW1tYXJ5IGNhcmQ6IGZpZ3VyZSArIGxhYmVsIGluIHRoZSBncmFkaWVudCBzdHJpcCwgbm90ZSBiZWxvdy4gLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJhdjItb2NhcmRcIiAqbmdGb3I9XCJsZXQga3BpIG9mIGtwaXNcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLW9jYXJkLWhlYWRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItb2NhcmQtY291bnRcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJsb2FkaW5nXCIgY2xhc3M9XCJhdjItc2sgYXYyLXNrLS12YWx1ZSBkYi1zay12YWx1ZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2FkaW5nXCI+e3sga3BpLnZhbHVlIH19PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItb2NhcmQtdGV4dFwiPnt7IGtwaS5sYWJlbCB9fTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdjItb2NhcmQtYm9keVwiPlxyXG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJsb2FkaW5nXCIgY2xhc3M9XCJhdjItc2sgYXYyLXNrLS1ub3RlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cIiFsb2FkaW5nXCIgY2xhc3M9XCJhdjItb2NhcmQtbm90ZVwiIFtzdHlsZS5jb2xvcl09XCJrcGkubm90ZUNvbG9yXCI+e3sga3BpLm5vdGUgfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFRyZW5kICsgZGlzdHJpYnV0aW9uIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImRiLWR1b1wiPlxyXG4gICAgICA8IS0tIFRyZW5kIC0tPlxyXG4gICAgICA8c2VjdGlvbiBjbGFzcz1cImRiLWNhcmRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY2FyZC1oZWFkIGRiLWNhcmQtaGVhZC0td3JhcFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLWNhcmQtdGl0bGUgZGItY2FyZC10aXRsZS0tZ3Jvd1wiPkF1ZGl0IHNjb3JlIHRyZW5kPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItc2VnXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZGItc2VnLXRhYlwiIFtjbGFzcy5pcy1vbl09XCJncmFpbiA9PT0gJ3F1YXJ0ZXInXCIgKGNsaWNrKT1cInNldEdyYWluKCdxdWFydGVyJylcIj5RdWFydGVybHk8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJkYi1zZWctdGFiXCIgW2NsYXNzLmlzLW9uXT1cImdyYWluID09PSAnZGF0ZSdcIiAoY2xpY2spPVwic2V0R3JhaW4oJ2RhdGUnKVwiPkJ5IGRhdGU8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItZGF0ZXJvd1wiICpuZ0lmPVwic2hvd1RyZW5kRGF0ZVBpY2tlciAmJiBncmFpbiA9PT0gJ2RhdGUnXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWRhdGVwaWNrXCI+XHJcbiAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJhdjItZGF0ZXBpY2staWNvblwiIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxyZWN0IHg9XCIzXCIgeT1cIjRcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiByeD1cIjJcIj48L3JlY3Q+XHJcbiAgICAgICAgICAgICAgPGxpbmUgeDE9XCIxNlwiIHkxPVwiMlwiIHgyPVwiMTZcIiB5Mj1cIjZcIj48L2xpbmU+PGxpbmUgeDE9XCI4XCIgeTE9XCIyXCIgeDI9XCI4XCIgeTI9XCI2XCI+PC9saW5lPjxsaW5lIHgxPVwiM1wiIHkxPVwiMTBcIiB4Mj1cIjIxXCIgeTI9XCIxMFwiPjwvbGluZT48L3N2Zz5cclxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJhdjItZGF0ZXBpY2staW5wdXQgZGItZGF0ZXJhbmdlXCIgbmd4RGF0ZXJhbmdlcGlja2VyTWQgcmVhZG9ubHkgYXV0b2NvbXBsZXRlPVwib2ZmXCJcclxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBkYXRlIHJhbmdlXCIgWyhuZ01vZGVsKV09XCJyYW5nZVwiIFtsb2NhbGVdPVwicGlja2VyTG9jYWxlXCIgW21heERhdGVdPVwidG9kYXlcIlxyXG4gICAgICAgICAgICAgIFtkYXRlTGltaXRdPVwibWF4UmFuZ2VEYXlzXCIgW3Jhbmdlc109XCJyYW5nZXNcIiBbc2hvd0N1c3RvbVJhbmdlTGFiZWxdPVwidHJ1ZVwiIFthbHdheXNTaG93Q2FsZW5kYXJzXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICBba2VlcENhbGVuZGFyT3BlbmluZ1dpdGhSYW5nZV09XCJ0cnVlXCIgW2F1dG9BcHBseV09XCJ0cnVlXCIgW3Nob3dDYW5jZWxdPVwiZmFsc2VcIiBbZHJvcHNdPVwiJ2Rvd24nXCIgW29wZW5zXT1cIidyaWdodCdcIlxyXG4gICAgICAgICAgICAgIChkYXRlc1VwZGF0ZWQpPVwib25SYW5nZVBpY2tlZCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRyZW5kTG9hZGluZ1wiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdjItc2sgYXYyLXNrLS10aXRsZVwiPjwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXYyLXNrIGF2Mi1zay0tYmxvY2sgZGItc2stY2hhcnRcIj48L3NwYW4+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdHJlbmRMb2FkaW5nXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLWZvY3VzXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWZvY3VzLXNjb3JlXCIgW2NsYXNzLmlzLWZhaWxdPVwiIWZvY3VzUGFzc2VkXCI+e3sgZm9jdXNTY29yZSB9fTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItZm9jdXMtcGlsbFwiICpuZ0lmPVwic2hvd1Bhc3NNYXJrSW5mb1wiIFtjbGFzcy5pcy1wYXNzXT1cImZvY3VzUGFzc2VkXCIgW2NsYXNzLmlzLWZhaWxdPVwiIWZvY3VzUGFzc2VkXCI+e3sgZm9jdXNTdGF0dXMgfX08L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWZvY3VzLWxpbmVcIj57eyBmb2N1c0xpbmUgfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1sZWdlbmRcIiAqbmdJZj1cInNob3dQYXNzTWFya0luZm9cIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItbGVnZW5kLWRhc2hcIiAqbmdJZj1cIiFwYXNzTWFya01peGVkXCI+PC9zcGFuPnt7IHBhc3NNYXJrTWl4ZWQgPyAnUGFzcyBtYXJrIHZhcmllcyBieSBhdWRpdCcgOiAnUGFzcyBtYXJrICcgKyBwYXNzTWFyayArICclJyB9fVxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY2hhcnRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jaGFydC15XCI+XHJcbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwidG9wOjBcIj4xMDAlPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cInRvcDo1MCVcIj41MCU8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwidG9wOjEwMCVcIj4wJTwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLWNoYXJ0LWFyZWFcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1ncmlkbGluZVwiIHN0eWxlPVwidG9wOjBcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItZ3JpZGxpbmVcIiBzdHlsZT1cInRvcDo1MCVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItZ3JpZGxpbmVcIiBzdHlsZT1cInRvcDoxMDAlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8IS0tIE9uZSBsaW5lIG9ubHkgd2hlbiB0aGUgYXVkaXRzIGluIHNjb3BlIHNoYXJlIGEgcGFzcyBtYXJrOyBvdGhlcndpc2UgZWFjaCBiYXIgaXMgY29sb3VyZWQgb24gaXRzIG93bi4gLS0+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItcGFzc2xpbmVcIiAqbmdJZj1cIiFwYXNzTWFya01peGVkXCIgW3N0eWxlLnRvcC4lXT1cIjEwMCAtIHBhc3NNYXJrXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItYmFyc1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1iYXItY29sXCIgKm5nRm9yPVwibGV0IGJhciBvZiB0cmVuZEJhcnM7IGxldCBmaXJzdCA9IGZpcnN0OyBsZXQgbGFzdCA9IGxhc3RcIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLmlzLXBpY2thYmxlXT1cImdyYWluID09PSAncXVhcnRlcidcIiAoY2xpY2spPVwic2VsZWN0UXVhcnRlcihiYXIua2V5KVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1iYXItdmFsdWVcIiAqbmdJZj1cIiFkZW5zZVRyZW5kXCIgW2NsYXNzLmlzLWFjdGl2ZV09XCJiYXIua2V5ID09PSBxdWFydGVyXCIgW3N0eWxlLmJvdHRvbV09XCJiYXJIZWlnaHQoYmFyKVwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBiYXIudmFsdWUgPT09IG51bGwgPyAn4oCUJyA6IGJhci52YWx1ZSArICclJyB9fVxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1iYXJcIiBbc3R5bGUuaGVpZ2h0XT1cImJhckhlaWdodChiYXIpXCIgW3N0eWxlLmJhY2tncm91bmRdPVwiYmFyRmlsbChiYXIpXCI+PC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi10aXBcIiBbY2xhc3MuaXMtc3RhcnRdPVwiZmlyc3QgJiYgIWxhc3RcIiBbY2xhc3MuaXMtZW5kXT1cImxhc3QgJiYgIWZpcnN0XCIgW3N0eWxlLmJvdHRvbV09XCJ0aXBCb3R0b20oYmFyKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItdGlwLWhlYWRcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBiYXIubGFiZWwgfX08c3BhbiBjbGFzcz1cImRiLXRpcC1zdWJcIiAqbmdJZj1cImdyYWluID09PSAncXVhcnRlcidcIj4gwrcge3sgcXVhcnRlck1vbnRocyhiYXIua2V5KSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi10aXAtc2NvcmVcIiAqbmdJZj1cImJhci52YWx1ZSAhPT0gbnVsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItdGlwLWRvdFwiIFtjbGFzcy5pcy1mYWlsXT1cImJhci52YWx1ZSA8IGJhck1hcmsoYmFyKVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLXRpcC12YWx1ZVwiPnt7IGJhci52YWx1ZSB9fSU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi10aXAtc3RhdHVzXCIgKm5nSWY9XCJzaG93UGFzc01hcmtJbmZvXCIgW2NsYXNzLmlzLWZhaWxdPVwiYmFyLnZhbHVlIDwgYmFyTWFyayhiYXIpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyBiYXIudmFsdWUgPj0gYmFyTWFyayhiYXIpID8gbGFiZWxzLnBhc3MgOiAnQmVsb3cgcGFzcyBtYXJrJyB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi10aXAtZW1wdHlcIiAqbmdJZj1cImJhci52YWx1ZSA9PT0gbnVsbFwiPk5vIHNjb3JlZCBhdWRpdHM8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXRpcC1yb3dcIj48c3Bhbj5BdWRpdHMgY29tcGxldGVkPC9zcGFuPjxiPnt7IGJhci5zdWJtaXR0ZWQgfX08L2I+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi10aXAtcm93XCIgKm5nSWY9XCJiYXIuY291bnQgIT09IGJhci5zdWJtaXR0ZWRcIj48c3Bhbj5TY29yZWQgYXVkaXRzPC9zcGFuPjxiPnt7IGJhci5jb3VudCB9fTwvYj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXRpcC1yb3dcIiAqbmdJZj1cImJhci52YWx1ZSAhPT0gbnVsbCB8fCAhcGFzc01hcmtNaXhlZFwiPjxzcGFuPlBhc3MgbWFyazwvc3Bhbj48Yj57eyBiYXJNYXJrKGJhcikgfX0lPC9iPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPCEtLSBBIG1vbnRoIGJ5IGRhdGUgaGFzIH4zMCBiYXJzOiBldmVyeSBmZXcgZGF5cyBnZXQgYSBsYWJlbCAoZmlyc3QgYW5kIGxhc3QgYWx3YXlzKSwgYW5kIHRoZSBhdWRpdCBjb3VudHNcclxuICAgICAgICAgICAgIG1vdmUgdG8gdGhlIGJhciB0b29sdGlwLCBzbyB0aGUgbGFiZWxzIG5ldmVyIHJ1biBpbnRvIGVhY2ggb3RoZXIuIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jaGFydC14XCIgW2NsYXNzLmlzLWRlbnNlXT1cImRlbnNlVHJlbmRcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItY2hhcnQteGNvbFwiICpuZ0Zvcj1cImxldCBiYXIgb2YgdHJlbmRCYXJzOyBsZXQgaSA9IGluZGV4OyBsZXQgbGFzdCA9IGxhc3RcIiBbY2xhc3MuaXMtcGlja2FibGVdPVwiZ3JhaW4gPT09ICdxdWFydGVyJ1wiIChjbGljayk9XCJzZWxlY3RRdWFydGVyKGJhci5rZXkpXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItY2hhcnQteGxhYmVsXCIgW2NsYXNzLmlzLWFjdGl2ZV09XCJiYXIua2V5ID09PSBxdWFydGVyXCIgW3N0eWxlLnZpc2liaWxpdHldPVwic2hvd1hMYWJlbChpLCBsYXN0KSA/ICd2aXNpYmxlJyA6ICdoaWRkZW4nXCI+e3sgYmFyLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWNoYXJ0LXhjb3VudFwiICpuZ0lmPVwiIWRlbnNlVHJlbmRcIj57eyBiYXIuc3VibWl0dGVkID8gYmFyLnN1Ym1pdHRlZCArICcgYXVkaXRzJyA6ICdubyBhdWRpdHMnIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L3NlY3Rpb24+XHJcblxyXG4gICAgICA8IS0tIFNjb3JlIGJhbmRzIC0tPlxyXG4gICAgICA8c2VjdGlvbiBjbGFzcz1cImRiLWNhcmQgZGItY2FyZC0tdGlnaHRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY2FyZC1oZWFkIGRiLWNhcmQtaGVhZC0tYmFzZWxpbmVcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jYXJkLXRpdGxlIGRiLWNhcmQtdGl0bGUtLWdyb3dcIj5TY29yZSBkaXN0cmlidXRpb248L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jYXJkLXN1YlwiPnt7IHN0b3Jlc0luU2NvcGUgfX0gaW4gc2NvcGU8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY2FyZC1zdWJcIj5TdG9yZXMgYnkgc2NvcmUgYmFuZCwge3sgcGVyaW9kTGFiZWwgfX08L2Rpdj5cclxuXHJcbiAgICAgICAgPGxpYi1hdWRpdC12Mi1zaGltbWVyICpuZ0lmPVwibG9hZGluZ1wiIFtyb3dzXT1cIjJcIj48L2xpYi1hdWRpdC12Mi1zaGltbWVyPlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGItYmFuZGJhclwiICpuZ0lmPVwiIWxvYWRpbmdcIj5cclxuICAgICAgICAgIDwhLS0gQSBiYW5kIHdpdGggc3RvcmVzIGtlZXBzIGEgdmlzaWJsZSBzbGl2ZXIgKDIgb2YgMzU3NiBzdG9yZXMgaXMgdW5kZXIgYSBwaXhlbCk7IHRoZSBsYXJnZXN0IGJhbmQgZ2l2ZXMgd2F5LiAtLT5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItYmFuZHNlZ1wiICpuZ0Zvcj1cImxldCBiIG9mIGJhbmRSb3dzOyB0cmFja0J5OiB0cmFja0J5QmFuZFwiIFtzdHlsZS53aWR0aF09XCJiLndpZHRoXCIgW3N0eWxlLmJhY2tncm91bmRdPVwiYi5iYW5kLnNvZnRcIlxyXG4gICAgICAgICAgICBbY2xhc3MuaGFzLXN0b3Jlc109XCJiLmNvdW50ID4gMFwiIFt0aXRsZV09XCJiLmJhbmQubGFiZWwgKyAnOiAnICsgYi5jb3VudFwiPjwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLWJhbmRyb3dzXCIgKm5nSWY9XCIhbG9hZGluZ1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLWJhbmRyb3dcIiAqbmdGb3I9XCJsZXQgYiBvZiBiYW5kUm93czsgdHJhY2tCeTogdHJhY2tCeUJhbmRcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1iYW5kZG90XCIgW3N0eWxlLmJhY2tncm91bmRdPVwiYi5iYW5kLnNvZnRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItYmFuZGxhYmVsXCI+e3sgYi5iYW5kLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWJhbmRyYW5nZVwiPnt7IGIuYmFuZC5yYW5nZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi1iYW5kY291bnRcIj57eyBiLmNvdW50IH19IHt7IGIuY291bnQgPT09IDEgPyAnc3RvcmUnIDogJ3N0b3JlcycgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItYmFuZHNoYXJlXCI+e3sgYi5zaGFyZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPGEgY2xhc3M9XCJkYi1iYW5kbGlua1wiIFtjbGFzcy5pcy1hY3RpdmVdPVwic3RvcmVMaXN0T3BlbiAmJiBsaXN0QmFuZEtleSA9PT0gYi5iYW5kLmtleVwiIChjbGljayk9XCJhcHBseUJhbmQoYi5iYW5kKVwiPlZpZXcgc3RvcmVzPC9hPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLWJhbmRoaW50XCIgKm5nSWY9XCIhbG9hZGluZyAmJiAhc2hvd1N0b3JlTGlzdFwiPkNsaWNrIDxiPlZpZXcgc3RvcmVzPC9iPiBvbiBhIGJhbmQgdG8gbGlzdCBpdHMgc3RvcmVzLjwvZGl2PlxyXG4gICAgICA8L3NlY3Rpb24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFN0b3JlIGxlZGdlcjogb3BlbmVkIGZyb20gU2NvcmUgZGlzdHJpYnV0aW9uIC0+IFZpZXcgc3RvcmVzIChvciBhIEZpbHRlcnMgc2NvcmUgcmFuZ2UpIC0tPlxyXG4gICAgPHNlY3Rpb24gY2xhc3M9XCJkYi1jYXJkIGRiLWNhcmQtLXRhYmxlXCIgaWQ9XCJhZC1zdG9yZS1saXN0XCIgKm5nSWY9XCJzaG93U3RvcmVMaXN0XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkYi1sZWRnZXItaGVhZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1sZWRnZXItdGV4dFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiLWNhcmQtdGl0bGVcIj5TdG9yZSBsaXN0PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItY2FyZC1zdWJcIj5cclxuICAgICAgICAgICAge3sgZmlsdGVyZWRSb3dzLmxlbmd0aCB9fSB7eyBmaWx0ZXJlZFJvd3MubGVuZ3RoID09PSAxID8gJ3N0b3JlJyA6ICdzdG9yZXMnIH19IMK3IHt7IHBlcmlvZExhYmVsIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWdyb3dcIj48L2Rpdj5cclxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJhdjItc2VhcmNoIGRiLXNlYXJjaFwiPlxyXG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPlxyXG4gICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTFcIiBjeT1cIjExXCIgcj1cIjdcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgPGxpbmUgeDE9XCIxNi41XCIgeTE9XCIxNi41XCIgeDI9XCIyMVwiIHkyPVwiMjFcIj48L2xpbmU+XHJcbiAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cInNlYXJjaFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uU2VhcmNoKClcIiB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoIHN0b3JlIG9yIG93bmVyXCJcclxuICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCIgLz5cclxuICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWdtZW50ZWRcIj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2VndGFiXCIgW2NsYXNzLnNlZ3RhYi1vbl09XCJzdGF0dXMgPT09ICdhbGwnXCIgKGNsaWNrKT1cInNldFN0YXR1cygnYWxsJylcIj5BbGw8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwic2VndGFiXCIgW2NsYXNzLnNlZ3RhYi1vbl09XCJzdGF0dXMgPT09ICdmYWlsJ1wiIChjbGljayk9XCJzZXRTdGF0dXMoJ2ZhaWwnKVwiPnt7IGxhYmVscy5mYWlsIH19PC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInNlZ3RhYlwiIFtjbGFzcy5zZWd0YWItb25dPVwic3RhdHVzID09PSAncGFzcydcIiAoY2xpY2spPVwic2V0U3RhdHVzKCdwYXNzJylcIj57eyBsYWJlbHMucGFzcyB9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzZWd0YWJcIiBbY2xhc3Muc2VndGFiLW9uXT1cInN0YXR1cyA9PT0gJ25hJ1wiIChjbGljayk9XCJzZXRTdGF0dXMoJ25hJylcIj5Ob3QgYXVkaXRlZDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxsaWItYXVkaXQtdjItc2hpbW1lciAqbmdJZj1cImxvYWRpbmdcIj48L2xpYi1hdWRpdC12Mi1zaGltbWVyPlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2FkaW5nXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJhdjItdGFibGUtd3JhcFwiPlxyXG4gICAgICAgIDx0YWJsZSBjbGFzcz1cImRiLXRhYmxlXCI+XHJcbiAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IGggb2YgaGVhZGVyc1wiIGNsYXNzPVwiaXMtc29ydGFibGVcIiBbY2xhc3MuaXMtc29ydGVkXT1cInNvcnRLZXkgPT09IGgua2V5XCIgKGNsaWNrKT1cInNvcnRCeShoLmtleSlcIj5cclxuICAgICAgICAgICAgICAgIHt7IGgubGFiZWwgfX0gPGxpYi1hdWRpdC12Mi1zb3J0LWljb24gW2FjdGl2ZV09XCJzb3J0S2V5ID09PSBoLmtleVwiIFtkaXJdPVwic29ydERpclwiPjwvbGliLWF1ZGl0LXYyLXNvcnQtaWNvbj5cclxuICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgIDx0aD5BY3Rpb248L3RoPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByb3cgb2YgcGFnZVJvd3M7IHRyYWNrQnk6IHRyYWNrQnlTdG9yZVwiPlxyXG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImRiLW5vd3JhcFwiPnt7IHJvdy5kYXRlIH19PC90ZD5cclxuICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRiLXN0b3JlaWRcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS90cmF4L2F1ZGl0LXYyL2Rhc2hib2FyZC9zdG9yZVwiXHJcbiAgICAgICAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJkZXRhaWxQYXJhbXMoeyBzdG9yZTogcm93LnJhdz8uc3RvcmVJZCB8fCByb3cuc3RvcmVJZCB9KVwiPnt7IHJvdy5zdG9yZUlkIH19PC9hPlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiYXYyLWVsbGlwc2lzXCI+e3sgcm93LmNpcmNsZSB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiYXYyLWVsbGlwc2lzXCI+e3sgcm93LnpvbmUgfX08L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImF2Mi1lbGxpcHNpc1wiPnt7IHJvdy5hb20gfX08L3RkPlxyXG4gICAgICAgICAgICAgIDwhLS0gQXVkaXRzOiBvbmUgY2VsbCBwZXIgaGVhZGVyIChoZWFkZXJzIGxpc3RzIEF1ZGl0cyksIHNvIFNjb3JlIC8gU3RhdHVzIC8gQWN0aW9uIHN0YXkgdW5kZXIgdGhlaXIgb3duIGhlYWRpbmdzLiAtLT5cclxuICAgICAgICAgICAgICA8dGQgW2NsYXNzLmF2Mi1mYWludF09XCIhcm93LmF1ZGl0c1wiPnt7IHJvdy5hdWRpdHMgfHwgJ+KAlCcgfX08L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItcGlsbFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImJhbmRGb3Iocm93KS5iZ1wiIFtzdHlsZS5jb2xvcl09XCJiYW5kRm9yKHJvdykuZmdcIj5cclxuICAgICAgICAgICAgICAgICAge3sgcm93LnNjb3JlID09PSBudWxsID8gJ+KAlCcgOiByb3cuc2NvcmUgKyAnJScgfX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItcGlsbFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImJhbmRGb3Iocm93KS5iZ1wiIFtzdHlsZS5jb2xvcl09XCJiYW5kRm9yKHJvdykuZmdcIj5cclxuICAgICAgICAgICAgICAgICAge3sgc3RhdHVzTGFiZWwocm93KSB9fVxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLWFjdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBWaWV3IG9wZW5zIHRoZSBHYWxsZXJ5IG9uIHRoZSBzdG9yZSdzIGxhdGVzdCBzdWJtaXR0ZWQgYXVkaXQgaW4gdGhlIHBlcmlvZCAoUUEgMTEgT2N0KTsgYSBzdG9yZVxyXG4gICAgICAgICAgICAgICAgICAgICAgIHdpdGggbm8gc3VibWlzc2lvbiB0aGVyZSBvcGVucyBpdHMgYXVkaXQgZGV0YWlsIGluc3RlYWQgKHNhbWUgYXMgdGhlIHN0b3JlIGxpbmspLiAtLT5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBTZXZlcmFsIGF1ZGl0cyBzdWJtaXR0ZWQgYnkgdGhpcyBzdG9yZTogVmlldyBsaXN0cyB0aGVtOyBlYWNoIG9wZW5zIHRoZSBHYWxsZXJ5IG9uIHRoYXQgYXVkaXQuIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGItdmlld21lbnUtd3JhcFwiICpuZ0lmPVwic3RvcmVBdWRpdHMocm93KS5sZW5ndGggPiAxXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJkYi12aWV3YnRuXCIgW2NsYXNzLmlzLW9wZW5dPVwiaXNWaWV3TWVudU9wZW4ocm93KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIlBpY2sgdGhlIGF1ZGl0IHRvIHZpZXcgaW4gdGhlIEdhbGxlcnlcIiAoY2xpY2spPVwidG9nZ2xlVmlld01lbnUocm93LCAkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xLjUgMTJTNSA1LjUgMTIgNS41IDIyLjUgMTIgMjIuNSAxMiAxOSAxOC41IDEyIDE4LjUgMS41IDEyIDEuNSAxMnpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiM1wiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICBWaWV3XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTFcIiBoZWlnaHQ9XCIxMVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjIuNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCI2IDkgMTIgMTUgMTggOVwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXZpZXdtZW51XCIgKm5nSWY9XCJpc1ZpZXdNZW51T3Blbihyb3cpXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUudG9wLnB4XT1cInZpZXdNZW51UG9zLnRvcFwiIFtzdHlsZS5yaWdodC5weF09XCJ2aWV3TWVudVBvcy5yaWdodFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLXZpZXdtZW51LXRpdGxlXCI+e3sgc3RvcmVBdWRpdHMocm93KS5sZW5ndGggfX0gYXVkaXRzIHN1Ym1pdHRlZDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkYi12aWV3bWVudS1pdGVtXCIgKm5nRm9yPVwibGV0IGEgb2Ygc3RvcmVBdWRpdHMocm93KVwiIHJvdXRlckxpbms9XCIvbWFuYWdlL3RyYXgvYXVkaXQtdjIvZ2FsbGVyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJkZXRhaWxQYXJhbXMoeyBhdWRpdDogYS5hdWRpdElkLCBzdG9yZTogcm93LnJhdz8uc3RvcmVJZCB8fCByb3cuc3RvcmVJZCB9KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ2aWV3TWVudVN0b3JlID0gJydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi12aWV3bWVudS1uYW1lIGF2Mi1lbGxpcHNpc1wiIFt0aXRsZV09XCJhLm5hbWVcIj57eyBhLm5hbWUgfHwgJ+KAlCcgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItdmlld21lbnUtbWV0YVwiPnt7IGEuc3VibWl0dGVkIH19IHt7IGEuc3VibWl0dGVkID09PSAxID8gJ3N1Ym1pc3Npb24nIDogJ3N1Ym1pc3Npb25zJyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYi12aWV3bWVudS1zY29yZVwiPnt7IGEuc2NvcmUgPT09IG51bGwgPyAn4oCUJyA6IGEuc2NvcmUgKyAnJScgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRiLXZpZXdidG5cIiAqbmdJZj1cInN0b3JlQXVkaXRzKHJvdykubGVuZ3RoIDw9IDEgJiYgZ2FsbGVyeUF1ZGl0SWQocm93KSBhcyBhdWRpdElkXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvdHJheC9hdWRpdC12Mi9nYWxsZXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiZGV0YWlsUGFyYW1zKHsgYXVkaXQ6IGF1ZGl0SWQsIHN0b3JlOiByb3cucmF3Py5zdG9yZUlkIHx8IHJvdy5zdG9yZUlkIH0pXCIgdGl0bGU9XCJWaWV3IHRoaXMgc3RvcmUncyBzdWJtaXNzaW9ucyBpbiB0aGUgR2FsbGVyeVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMS41IDEyUzUgNS41IDEyIDUuNSAyMi41IDEyIDIyLjUgMTIgMTkgMTguNSAxMiAxOC41IDEuNSAxMiAxLjUgMTJ6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIzXCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgVmlld1xyXG4gICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gTm90IGF1ZGl0ZWQgKG5vIHN1Ym1pc3Npb24gaW4gdGhlIHBlcmlvZCk6IG5vdGhpbmcgdG8gdmlldywgc28gVmlldyBpcyBkaXNhYmxlZC4gLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZGItdmlld2J0blwiICpuZ0lmPVwiIWdhbGxlcnlBdWRpdElkKHJvdylcIiBkaXNhYmxlZFxyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiTm8gYXVkaXQgc3VibWl0dGVkIGZvciB0aGlzIHN0b3JlIGluIHRoaXMgcGVyaW9kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEzXCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xLjUgMTJTNSA1LjUgMTIgNS41IDIyLjUgMTIgMjIuNSAxMiAxOSAxOC41IDEyIDE4LjUgMS41IDEyIDEuNSAxMnpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjNcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICBWaWV3XHJcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8IS0tIFRoZSBHYWxsZXJ5J3MgRXhwb3J0IGFzIFBERiBmb3IgdGhpcyBzdG9yZSdzIGF1ZGl0IGluIHRoZSBwZXJpb2QgKHF1ZXVlZCwgdGhlbiB1bmRlciBOb3RpZmljYXRpb25zID4gRG93bmxvYWRzKS4gLS0+XHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gPGEgY2xhc3M9XCJkYi1wZGZidG5cIiByb2xlPVwiYnV0dG9uXCIgW2NsYXNzLmlzLWRpc2FibGVkXT1cIiFnYWxsZXJ5QXVkaXRJZChyb3cpXCJcclxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cIiFnYWxsZXJ5QXVkaXRJZChyb3cpXCIgKGNsaWNrKT1cImRvd25sb2FkUGRmKHJvdylcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJnYWxsZXJ5QXVkaXRJZChyb3cpID8gJ0V4cG9ydCB0aGlzIHN0b3JlXFwncyBzdWJtaXNzaW9ucyBhcyBQREYgKHNhbWUgYXMgdGhlIEdhbGxlcnlcXCdzIEV4cG9ydCBhcyBQREYpJyA6ICdObyBzdWJtaXR0ZWQgYXVkaXQgZm9yIHRoaXMgc3RvcmUgaW4gdGhpcyBwZXJpb2QnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMiA0djEyXCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHBvbHlsaW5lIHBvaW50cz1cIjcgMTEgMTIgMTYgMTcgMTFcIj48L3BvbHlsaW5lPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk00IDIwaDE2XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICA8L2E+IC0tPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+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+XHJcblxyXG4gIDwhLS0gPT09PT09PT09PT09IFBFUkZPUk1BTkNFID09PT09PT09PT09PSAtLT5cclxuICA8IS0tIFRhc2sgbW9kZSBhbHdheXMgc2hvd3MgaXRzIFRhc2sgSW5mbyB0YWJsZTsgdGhlIHJlc3Qgb2YgUGVyZm9ybWFuY2UgZm9sbG93cyBzaG93UGVyZm9ybWFuY2UuIC0tPlxyXG4gIDxzZWN0aW9uIGNsYXNzPVwiZGItcGVyZlwiICpuZ0lmPVwic2hvd1BlcmZvcm1hbmNlIHx8IGlzVGFza01vZHVsZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImRiLXBlcmZ0YWJzXCIgKm5nSWY9XCJzaG93UGVyZm9ybWFuY2VcIj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJkYi1wZXJmdGFiXCIgKm5nRm9yPVwibGV0IHQgb2YgcGVyZlRhYnNcIiBbY2xhc3MuaXMtb25dPVwicGVyZlRhYiA9PT0gdFwiXHJcbiAgICAgICAgKGNsaWNrKT1cInNldFBlcmZUYWIodClcIj57eyBwZXJmVGFiRGlzcGxheSh0KSB9fTwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImRiLXBlcmYtaGVhZFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZGItcGVyZi10ZXh0XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRiLXBlcmYtdGl0bGVcIj5cclxuICAgICAgICAgIHt7IHBlcmZJbmZvVGl0bGUgfX1cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItdG90YWxcIj5cclxuICAgICAgICAgICAge3sgcGVyZlRhYiA9PT0gJ0F1ZGl0JyA/IChpc1Rhc2tNb2R1bGUgPyBmaWx0ZXJlZFRhc2tQZXJmLmxlbmd0aCA6IGZpbHRlcmVkQXVkaXRQZXJmLmxlbmd0aCkgOiAocGVyZlRhYiA9PT0gJ1N0b3JlJyA/IGZpbHRlcmVkU3RvcmVQZXJmLmxlbmd0aCA6IGZpbHRlcmVkVXNlclBlcmYubGVuZ3RoKSB9fSBUb3RhbFxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYi1jYXJkLXN1YlwiPnt7IHBlcmZQZXJpb2QgfX08L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJhdjItZ3Jvd1wiPjwvZGl2PlxyXG4gICAgICA8bGFiZWwgY2xhc3M9XCJhdjItc2VhcmNoIGRiLXBlcmYtc2VhcmNoXCI+XHJcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj5cclxuICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMVwiIGN5PVwiMTFcIiByPVwiN1wiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgPGxpbmUgeDE9XCIxNi41XCIgeTE9XCIxNi41XCIgeDI9XCIyMVwiIHkyPVwiMjFcIj48L2xpbmU+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgW3BsYWNlaG9sZGVyXT1cInBlcmZTZWFyY2hQbGFjZWhvbGRlclwiIFsobmdNb2RlbCldPVwicGVyZlNlYXJjaFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uUGVyZlNlYXJjaCgpXCI+XHJcbiAgICAgIDwvbGFiZWw+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBhdjItYnRuLS1naG9zdFwiIFtkaXNhYmxlZF09XCJwZXJmTG9hZGluZyB8fCAhcGVyZlJvd0NvdW50XCJcclxuICAgICAgICB0aXRsZT1cIkRvd25sb2FkIHRoaXMgdGFibGUgYXMgYW4gRXhjZWwgZmlsZVwiIChjbGljayk9XCJleHBvcnRQZXJmb3JtYW5jZSgpXCI+XHJcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjhcIlxyXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICA8cGF0aCBkPVwiTTEyIDE2VjRcIj48L3BhdGg+XHJcbiAgICAgICAgICA8cG9seWxpbmUgcG9pbnRzPVwiNyA5IDEyIDQgMTcgOVwiPjwvcG9seWxpbmU+XHJcbiAgICAgICAgICA8cGF0aCBkPVwiTTQgMTZ2NGgxNnYtNFwiPjwvcGF0aD5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICBFeHBvcnRcclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYXYyLWJ0biBkYi1jcmVhdGVcIiAqbmdJZj1cInBlcmZUYWIgPT09ICdBdWRpdCcgJiYgIWlzVGFza01vZHVsZSAmJiBhY2Nlc3MuY2FuQWRkXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvdHJheC9hdWRpdC12Mi9tYW5hZ2VcIj5cclxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjIuMlwiXHJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+PHBhdGggZD1cIk0xMiA1djE0TTUgMTJoMTRcIj48L3BhdGg+PC9zdmc+XHJcbiAgICAgICAge3sgcGVyZkNyZWF0ZUxhYmVsIH19XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8IS0tIFRhc2sgbW9kZTogQ3JlYXRlIFRhc2sgb3BlbnMgTWFuYWdlIC0+IFRhc2sgKHRhc2sgYWRkIHBlcm1pc3Npb24pLiAtLT5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGRiLWNyZWF0ZVwiICpuZ0lmPVwicGVyZlRhYiA9PT0gJ0F1ZGl0JyAmJiBpc1Rhc2tNb2R1bGUgJiYgYWNjZXNzLmNhbkFkZFRhc2tcIlxyXG4gICAgICAgIHJvdXRlckxpbms9XCIvbWFuYWdlL3RyYXgvYXVkaXQtdjIvbWFuYWdlXCIgW3F1ZXJ5UGFyYW1zXT1cInsgbW9kdWxlOiAndGFzaycgfVwiPlxyXG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMi4yXCJcclxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48cGF0aCBkPVwiTTEyIDV2MTRNNSAxMmgxNFwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICBDcmVhdGUgVGFza1xyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxsaWItYXVkaXQtdjItc2hpbW1lciAqbmdJZj1cInBlcmZMb2FkaW5nXCI+PC9saWItYXVkaXQtdjItc2hpbW1lcj5cclxuXHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXBlcmZMb2FkaW5nXCI+XHJcbiAgICA8IS0tIEF1ZGl0IFBlcmZvcm1hbmNlIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImF2Mi10YWJsZS13cmFwXCIgKm5nSWY9XCJwZXJmVGFiID09PSAnQXVkaXQnICYmICFpc1Rhc2tNb2R1bGVcIj5cclxuICAgICAgPHRhYmxlIGNsYXNzPVwiZGItcGVyZnRhYmxlIGRiLXBlcmZ0YWJsZS0tYXVkaXRcIj5cclxuICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgIDx0aCAqbmdGb3I9XCJsZXQgYyBvZiBhdWRpdFBlcmZDb2xzXCIgY2xhc3M9XCJpcy1zb3J0YWJsZVwiIFtjbGFzcy5pcy1zb3J0ZWRdPVwicGVyZlNvcnRLZXkgPT09IGMua2V5XCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwic29ydFBlcmYoYy5rZXkpXCI+e3sgYy5sYWJlbCB9fSA8bGliLWF1ZGl0LXYyLXNvcnQtaWNvbiBbYWN0aXZlXT1cInBlcmZTb3J0S2V5ID09PSBjLmtleVwiIFtkaXJdPVwicGVyZlNvcnREaXJcIj48L2xpYi1hdWRpdC12Mi1zb3J0LWljb24+PC90aD5cclxuICAgICAgICAgICAgPHRoPkFjdGlvbjwvdGg+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByb3cgb2YgcGVyZlBhZ2VPZihmaWx0ZXJlZEF1ZGl0UGVyZik7IHRyYWNrQnk6IHRyYWNrQnlQZXJmQXVkaXRcIj5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1uYW1lXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWF2YXRhclwiPnt7IHJvdy5pbml0aWFscyB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZGItbGlua1wiIHJvdXRlckxpbms9XCIvbWFuYWdlL3RyYXgvYXVkaXQtdjIvZGFzaGJvYXJkL2F1ZGl0XCJcclxuICAgICAgICAgICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cImRldGFpbFBhcmFtcyh7IGNoZWNrbGlzdElkOiByb3cucmF3Py5zb3VyY2VDaGVja0xpc3RfaWQgfHwgcm93LnJhdz8uX2lkIH0pXCI+e3sgcm93Lm5hbWUgfX08L2E+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyByb3cuYXNzaWduZWQgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPCEtLSBPcGVucyB0aGUgYXVkaXQncyBkZXRhaWwgcGFnZSAoYXMgdGhlIGV5ZSBkb2VzKSBvbiBpdHMgc3VibWl0dGVkIHZpc2l0cywgYXMgdGhlIHYxIENoZWNrbGlzdCBkYXNoYm9hcmQgZGlkLiAtLT5cclxuICAgICAgICAgICAgICA8YSAqbmdJZj1cInJvdy5zdWJtaXR0ZWRcIiBjbGFzcz1cImRiLXVsaW5rXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvdHJheC9hdWRpdC12Mi9kYXNoYm9hcmQvYXVkaXRcIlxyXG4gICAgICAgICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cImRldGFpbFBhcmFtcyh7IGNoZWNrbGlzdElkOiByb3cucmF3Py5zb3VyY2VDaGVja0xpc3RfaWQgfHwgcm93LnJhdz8uX2lkLCBzdGF0dXM6ICdzdWJtaXQnIH0pXCJcclxuICAgICAgICAgICAgICAgIHRpdGxlPVwiVmlldyB0aGUgc3VibWl0dGVkIHZpc2l0c1wiPnt7IHJvdy5zdWJtaXR0ZWQgfX08L2E+XHJcbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhcm93LnN1Ym1pdHRlZFwiPjA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDwhLS0gU3RvcmUgZGlzcHV0ZXMgKHF1ZXN0aW9ucykgaW4gdGhlIHBlcmlvZCwgYXMgYSBwbGFpbiBjb3VudCAoUUEgMTAgT2N0OiBubyBsaW5rKS4gLS0+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInJvdy5kaXNwdXRlcyA9PT0gbnVsbFwiIGNsYXNzPVwiYXYyLWZhaW50XCI+4oCUPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicm93LmRpc3B1dGVzICE9PSBudWxsXCI+e3sgcm93LmRpc3B1dGVzIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgcm93LnBhc3NNYXJrIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYi1zY29yZVwiIFtjbGFzcy5pcy1lbXB0eV09XCJyb3cuc2NvcmUgPT09ICfigJQnXCJcclxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCJyb3cuc2NvcmUgPT09ICfigJQnID8gJ0NvbXBsaWFuY2Ugc2NvcmUgaXMgb2ZmIGZvciB0aGlzIGF1ZGl0JyA6ICcnXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLXRyYWNrIGRiLXRyYWNrLS02XCI+PHNwYW4gW3N0eWxlLndpZHRoXT1cImJhcldpZHRoKHJvdy5zY29yZVBjdClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cInJvdy5yZXN1bHQgPT09ICdQYXNzJyA/ICcjMTJCNzZBJyA6ICcjRjA0NDM4J1wiPjwvc3Bhbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLXNjb3JldGV4dFwiPnt7IHJvdy5zY29yZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicm93LnJlc3VsdCAhPT0gJ+KAlCdcIiBjbGFzcz1cImRiLXBpbGwgZGItcGlsbC0tc3Ryb25nXCIgW3N0eWxlLmJhY2tncm91bmRdPVwicm93LnJlc3VsdCA9PT0gJ1Bhc3MnID8gJyNFQ0ZERjMnIDogJyNGRUYzRjInXCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJyb3cucmVzdWx0ID09PSAnUGFzcycgPyAnIzAyN0E0OCcgOiAnI0I0MjMxOCdcIj57eyByZXN1bHRUZXh0KHJvdy5yZXN1bHQpIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicm93LnJlc3VsdCA9PT0gJ+KAlCdcIiBjbGFzcz1cImF2Mi1mYWludFwiIHRpdGxlPVwiQ29tcGxpYW5jZSBzY29yZSBpcyBvZmYgZm9yIHRoaXMgYXVkaXRcIj7igJQ8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8YSBjbGFzcz1cImRiLWV5ZVwiIHRpdGxlPVwiVmlldyBhdWRpdFwiIHJvdXRlckxpbms9XCIvbWFuYWdlL3RyYXgvYXVkaXQtdjIvZGFzaGJvYXJkL2F1ZGl0XCJcclxuICAgICAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJkZXRhaWxQYXJhbXMoeyBjaGVja2xpc3RJZDogcm93LnJhdz8uc291cmNlQ2hlY2tMaXN0X2lkIHx8IHJvdy5yYXc/Ll9pZCB9KVwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE3XCIgaGVpZ2h0PVwiMTdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjlcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cclxuICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xLjUgMTJTNSA1LjUgMTIgNS41IDIyLjUgMTIgMjIuNSAxMiAxOSAxOC41IDEyIDE4LjUgMS41IDEyIDEuNSAxMnpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiM1wiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3Rib2R5PlxyXG4gICAgICA8L3RhYmxlPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiIWZpbHRlcmVkQXVkaXRQZXJmLmxlbmd0aFwiIGNsYXNzPVwiYXYyLWVtcHR5XCI+XHJcbiAgICAgICAgPGltZyBjbGFzcz1cImF2Mi1lbXB0eS1pbWdcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGExLnN2Z1wiIGFsdD1cIlwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktdGV4dFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS10aXRsZVwiPk5vIGRhdGEgZm91bmQ8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktc3ViXCI+e3sgcGVyZlNlYXJjaC50cmltKCkgPyAnTm8gYXVkaXQgbWF0Y2hlcyB0aGlzIHNlYXJjaC4nIDogJ1RoZXJlIGlzIG5vIHJlc3VsdCBmb3IgQXVkaXQgUGVyZm9ybWFuY2UgaW4gdGhpcyBwZXJpb2QuJyB9fTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gVGFzayBQZXJmb3JtYW5jZSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJhdjItdGFibGUtd3JhcFwiICpuZ0lmPVwicGVyZlRhYiA9PT0gJ0F1ZGl0JyAmJiBpc1Rhc2tNb2R1bGVcIj5cclxuICAgICAgPHRhYmxlIGNsYXNzPVwiZGItcGVyZnRhYmxlIGRiLXBlcmZ0YWJsZS0tdGFzayB0ZXh0LW5vd3JhcFwiPlxyXG4gICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBjIG9mIHRhc2tQZXJmQ29sc1wiIGNsYXNzPVwiaXMtc29ydGFibGVcIiBbY2xhc3MuaXMtc29ydGVkXT1cInBlcmZTb3J0S2V5ID09PSBjLmtleVwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNvcnRQZXJmKGMua2V5KVwiPnt7IGMubGFiZWwgfX0gPGxpYi1hdWRpdC12Mi1zb3J0LWljb24gW2FjdGl2ZV09XCJwZXJmU29ydEtleSA9PT0gYy5rZXlcIiBbZGlyXT1cInBlcmZTb3J0RGlyXCI+PC9saWItYXVkaXQtdjItc29ydC1pY29uPjwvdGg+XHJcbiAgICAgICAgICAgIDx0aD5BY3Rpb248L3RoPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcm93IG9mIHBlcmZQYWdlT2YoZmlsdGVyZWRUYXNrUGVyZik7IHRyYWNrQnk6IHRyYWNrQnlQZXJmVGFza1wiPlxyXG4gICAgICAgICAgICA8IS0tIFRhc2sgSW5mbzogdGhlIHNhbWUgY29sdW1ucyBhcyBDaGVja2xpc3QgPiBEYXNoYm9hcmQgPiBUYXNrIChcIi0tXCIgd2hlbiBlbXB0eSkuIC0tPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkYi1saW5rXCIgW3RpdGxlXT1cInJvdy5yYXc/LmF1ZGl0TmFtZSA/ICdSYWlzZWQgZnJvbSAnICsgcm93LnJhdy5hdWRpdE5hbWUgOiAnJ1wiPnt7IHJvdy5uYW1lIH19PC9hPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiLW5hbWVcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGItYXZhdGFyXCI+e3sgcm93LmNyZWF0ZWRCeUluaXRpYWxzIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gW3RpdGxlXT1cInJvdy5jcmVhdGVkQnlcIj57eyByb3cuY3JlYXRlZEJ5IH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJkYi1ub3dyYXBcIj57eyByb3cuY3JlYXRlZE9uIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPnt7IHJvdy5wcmlvcml0eSB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyByb3cuYXNzaWduZWQgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPCEtLSBPcGVucyB0aGUgR2FsbGVyeSAoVHlwZSBUYXNrKSBvbiB0aGlzIHRhc2sncyBzdWJtaXNzaW9ucyBpbiB0aGUgZGFzaGJvYXJkIHBlcmlvZC4gLS0+XHJcbiAgICAgICAgICAgICAgPGEgKm5nSWY9XCJyb3cuc3VibWl0dGVkICYmIHJvdy5yYXc/LnRhc2tJZFwiIGNsYXNzPVwiZGItdWxpbmtcIiByb3V0ZXJMaW5rPVwiL21hbmFnZS90cmF4L2F1ZGl0LXYyL2dhbGxlcnlcIlxyXG4gICAgICAgICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cInRhc2tTdWJtaXR0ZWRQYXJhbXMocm93KVwiIHRpdGxlPVwiVmlldyB0aGUgc3VibWl0dGVkIHRhc2tzIGluIHRoZSBHYWxsZXJ5XCI+e3sgcm93LnN1Ym1pdHRlZCB9fTwvYT5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFyb3cuc3VibWl0dGVkIHx8ICFyb3cucmF3Py50YXNrSWRcIj4tLTwvc3Bhbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPCEtLSBUaGUgR2FsbGVyeSBoYXMgbm8gcmVkbyBmaWx0ZXIgdG8gb3Blbiwgc28gUmVkbyBpcyBwbGFpbiB0ZXh0LiAtLT5cclxuICAgICAgICAgICAgPHRkPnt7IHJvdy5yZWRvIHx8ICctLScgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJkYi1ub3dyYXBcIj57eyByb3cuZHVlT24gfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgPCEtLSBPcGVucyB0aGUgYXVkaXQgdGhlIHRhc2sgd2FzIHJhaXNlZCBmcm9tLiAtLT5cclxuICAgICAgICAgICAgICA8YSBjbGFzcz1cImRiLWV5ZVwiIHRpdGxlPVwiVmlldyB0aGUgYXVkaXQgdGhpcyB0YXNrIHdhcyByYWlzZWQgZnJvbVwiXHJcbiAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJyb3cucmF3Py5hdWRpdElkID8gJy9tYW5hZ2UvdHJheC9hdWRpdC12Mi9kYXNoYm9hcmQvYXVkaXQnIDogbnVsbFwiXHJcbiAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiZGV0YWlsUGFyYW1zKHsgY2hlY2tsaXN0SWQ6IHJvdy5yYXc/LmF1ZGl0SWQgfSlcIj5cclxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE3XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS45XCJcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMS41IDEyUzUgNS41IDEyIDUuNSAyMi41IDEyIDIyLjUgMTIgMTkgMTguNSAxMiAxOC41IDEuNSAxMiAxLjUgMTJ6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjNcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90Ym9keT5cclxuICAgICAgPC90YWJsZT5cclxuICAgICAgPGRpdiAqbmdJZj1cIiFmaWx0ZXJlZFRhc2tQZXJmLmxlbmd0aFwiIGNsYXNzPVwiYXYyLWVtcHR5XCI+XHJcbiAgICAgICAgPGltZyBjbGFzcz1cImF2Mi1lbXB0eS1pbWdcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGExLnN2Z1wiIGFsdD1cIlwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktdGV4dFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS10aXRsZVwiPk5vIGRhdGEgZm91bmQ8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktc3ViXCI+Tm8gdGFza3MgcmFpc2VkIGZyb20gYXVkaXRzIGluIHRoaXMgcGVyaW9kLjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gU3RvcmUgUGVyZm9ybWFuY2UgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXYyLXRhYmxlLXdyYXBcIiAqbmdJZj1cInBlcmZUYWIgPT09ICdTdG9yZSdcIj5cclxuICAgICAgPHRhYmxlIGNsYXNzPVwiZGItcGVyZnRhYmxlIGRiLXBlcmZ0YWJsZS0tc3RvcmVcIj5cclxuICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgIDx0aCAqbmdGb3I9XCJsZXQgYyBvZiBzdG9yZVBlcmZDb2xzXCIgY2xhc3M9XCJpcy1zb3J0YWJsZVwiIFtjbGFzcy5pcy1zb3J0ZWRdPVwicGVyZlNvcnRLZXkgPT09IGMua2V5XCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwic29ydFBlcmYoYy5rZXkpXCI+e3sgYy5sYWJlbCB9fSA8bGliLWF1ZGl0LXYyLXNvcnQtaWNvbiBbYWN0aXZlXT1cInBlcmZTb3J0S2V5ID09PSBjLmtleVwiIFtkaXJdPVwicGVyZlNvcnREaXJcIj48L2xpYi1hdWRpdC12Mi1zb3J0LWljb24+PC90aD5cclxuICAgICAgICAgICAgPHRoPkFjdGlvbjwvdGg+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCByb3cgb2YgcGVyZlBhZ2VPZihmaWx0ZXJlZFN0b3JlUGVyZik7IHRyYWNrQnk6IHRyYWNrQnlQZXJmU3RvcmVcIj5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxhIGNsYXNzPVwiZGItbGlua1wiIHJvdXRlckxpbms9XCIvbWFuYWdlL3RyYXgvYXVkaXQtdjIvZGFzaGJvYXJkL3N0b3JlXCIgW3F1ZXJ5UGFyYW1zXT1cImRldGFpbFBhcmFtcyh7IHN0b3JlOiByb3cuc3RvcmVJZCB8fCByb3cuc3RvcmUgfSlcIj57eyByb3cuc3RvcmUgfX08L2E+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImF2Mi1lbGxpcHNpcyBhdjItZGltXCIgW2F2MlRpcF09XCJyb3cuc3RvcmVJZFwiPnt7IHJvdy5zdG9yZUlkIHx8ICfigJQnIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiYXYyLWVsbGlwc2lzIGF2Mi1kaW1cIj57eyByb3cuc3BvYyB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyByb3cuYXNzaWduZWQgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgcm93LmZsYWdzID8/ICfigJQnIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPjxkaXYgY2xhc3M9XCJkYi1zY29yZVwiIFtjbGFzcy5pcy1lbXB0eV09XCJyb3cuY29tcGxldGlvbiA9PT0gJ+KAlCdcIj48c3BhbiBjbGFzcz1cImRiLXRyYWNrXCI+PHNwYW4gW3N0eWxlLndpZHRoXT1cImJhcldpZHRoKHJvdy5jb21wbGV0aW9uKVwiPjwvc3Bhbj48L3NwYW4+PHNwYW4gY2xhc3M9XCJkYi1zY29yZXRleHQgZGItc2NvcmV0ZXh0LS1zbVwiPnt7IHJvdy5jb21wbGV0aW9uIH19PC9zcGFuPjwvZGl2PjwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD48ZGl2IGNsYXNzPVwiZGItc2NvcmVcIiBbY2xhc3MuaXMtZW1wdHldPVwicm93LmNvbXBsaWFuY2UgPT09ICfigJQnXCI+PHNwYW4gY2xhc3M9XCJkYi10cmFja1wiPjxzcGFuIFtzdHlsZS53aWR0aF09XCJiYXJXaWR0aChyb3cuY29tcGxpYW5jZSlcIj48L3NwYW4+PC9zcGFuPjxzcGFuIGNsYXNzPVwiZGItc2NvcmV0ZXh0IGRiLXNjb3JldGV4dC0tc21cIj57eyByb3cuY29tcGxpYW5jZSB9fTwvc3Bhbj48L2Rpdj48L3RkPlxyXG4gICAgICAgICAgICA8dGQ+PGRpdiBjbGFzcz1cImRiLXNjb3JlXCIgW2NsYXNzLmlzLWVtcHR5XT1cInJvdy5wZXJmID09PSAn4oCUJ1wiPjxzcGFuIGNsYXNzPVwiZGItdHJhY2tcIj48c3BhbiBbc3R5bGUud2lkdGhdPVwiYmFyV2lkdGgocm93LnBlcmYpXCI+PC9zcGFuPjwvc3Bhbj48c3BhbiBjbGFzcz1cImRiLXNjb3JldGV4dCBkYi1zY29yZXRleHQtLXNtXCI+e3sgcm93LnBlcmYgfX08L3NwYW4+PC9kaXY+PC90ZD5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgIDxhIGNsYXNzPVwiZGItZXllXCIgdGl0bGU9XCJWaWV3IHN0b3JlXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvdHJheC9hdWRpdC12Mi9kYXNoYm9hcmQvc3RvcmVcIiBbcXVlcnlQYXJhbXNdPVwiZGV0YWlsUGFyYW1zKHsgc3RvcmU6IHJvdy5zdG9yZUlkIHx8IHJvdy5zdG9yZSB9KVwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE3XCIgaGVpZ2h0PVwiMTdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjlcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj5cclxuICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xLjUgMTJTNSA1LjUgMTIgNS41IDIyLjUgMTIgMjIuNSAxMiAxOSAxOC41IDEyIDE4LjUgMS41IDEyIDEuNSAxMnpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiM1wiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3Rib2R5PlxyXG4gICAgICA8L3RhYmxlPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiIWZpbHRlcmVkU3RvcmVQZXJmLmxlbmd0aFwiIGNsYXNzPVwiYXYyLWVtcHR5XCI+XHJcbiAgICAgICAgPGltZyBjbGFzcz1cImF2Mi1lbXB0eS1pbWdcIiBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGExLnN2Z1wiIGFsdD1cIlwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktdGV4dFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2Mi1lbXB0eS10aXRsZVwiPk5vIGRhdGEgZm91bmQ8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktc3ViXCI+e3sgcGVyZlNlYXJjaC50cmltKCkgPyAnTm8gc3RvcmUgbWF0Y2hlcyB0aGlzIHNlYXJjaC4nIDogJ1RoZXJlIGlzIG5vIHJlc3VsdCBmb3IgU3RvcmUgUGVyZm9ybWFuY2UgaW4gdGhpcyBwZXJpb2QuJyB9fTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gVXNlciBQZXJmb3JtYW5jZSAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJhdjItdGFibGUtd3JhcFwiICpuZ0lmPVwicGVyZlRhYiA9PT0gJ1VzZXInXCI+XHJcbiAgICAgIDx0YWJsZSBjbGFzcz1cImRiLXBlcmZ0YWJsZSBkYi1wZXJmdGFibGUtLXVzZXJcIj5cclxuICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgIDx0aCAqbmdGb3I9XCJsZXQgYyBvZiB1c2VyUGVyZkNvbHNcIiBjbGFzcz1cImlzLXNvcnRhYmxlXCIgW2NsYXNzLmlzLXNvcnRlZF09XCJwZXJmU29ydEtleSA9PT0gYy5rZXlcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJzb3J0UGVyZihjLmtleSlcIj57eyBjLmxhYmVsIH19IDxsaWItYXVkaXQtdjItc29ydC1pY29uIFthY3RpdmVdPVwicGVyZlNvcnRLZXkgPT09IGMua2V5XCIgW2Rpcl09XCJwZXJmU29ydERpclwiPjwvbGliLWF1ZGl0LXYyLXNvcnQtaWNvbj48L3RoPlxyXG4gICAgICAgICAgICA8dGg+QWN0aW9uPC90aD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90aGVhZD5cclxuICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiBwZXJmUGFnZU9mKGZpbHRlcmVkVXNlclBlcmYpOyB0cmFja0J5OiB0cmFja0J5UGVyZlVzZXJcIj5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiYXYyLWVsbGlwc2lzXCI+PGEgY2xhc3M9XCJkYi1saW5rXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvdHJheC9hdWRpdC12Mi9kYXNoYm9hcmQvdXNlclwiIFtxdWVyeVBhcmFtc109XCJkZXRhaWxQYXJhbXMoeyBlbWFpbDogcm93LmVtYWlsIH0pXCI+e3sgcm93Lm5hbWUgfX08L2E+PC90ZD5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiYXYyLWVsbGlwc2lzIGF2Mi1kaW1cIj57eyByb3cuZW1haWwgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgcm93LmFzc2lnbmVkIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPnt7IHJvdy5mbGFncyB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyByb3cucmVkbyB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD48ZGl2IGNsYXNzPVwiZGItc2NvcmVcIiBbY2xhc3MuaXMtZW1wdHldPVwicm93LmNvbXBsZXRpb24gPT09ICfigJQnXCI+PHNwYW4gY2xhc3M9XCJkYi10cmFja1wiPjxzcGFuIFtzdHlsZS53aWR0aF09XCJiYXJXaWR0aChyb3cuY29tcGxldGlvbilcIj48L3NwYW4+PC9zcGFuPjxzcGFuIGNsYXNzPVwiZGItc2NvcmV0ZXh0IGRiLXNjb3JldGV4dC0tc21cIj57eyByb3cuY29tcGxldGlvbiB9fTwvc3Bhbj48L2Rpdj48L3RkPlxyXG4gICAgICAgICAgICA8dGQ+PGRpdiBjbGFzcz1cImRiLXNjb3JlXCIgW2NsYXNzLmlzLWVtcHR5XT1cInJvdy5jb21wbGlhbmNlID09PSAn4oCUJ1wiPjxzcGFuIGNsYXNzPVwiZGItdHJhY2tcIj48c3BhbiBbc3R5bGUud2lkdGhdPVwiYmFyV2lkdGgocm93LmNvbXBsaWFuY2UpXCI+PC9zcGFuPjwvc3Bhbj48c3BhbiBjbGFzcz1cImRiLXNjb3JldGV4dCBkYi1zY29yZXRleHQtLXNtXCI+e3sgcm93LmNvbXBsaWFuY2UgfX08L3NwYW4+PC9kaXY+PC90ZD5cclxuICAgICAgICAgICAgPHRkPjxkaXYgY2xhc3M9XCJkYi1zY29yZVwiIFtjbGFzcy5pcy1lbXB0eV09XCJyb3cucGVyZiA9PT0gJ+KAlCdcIj48c3BhbiBjbGFzcz1cImRiLXRyYWNrXCI+PHNwYW4gW3N0eWxlLndpZHRoXT1cImJhcldpZHRoKHJvdy5wZXJmKVwiPjwvc3Bhbj48L3NwYW4+PHNwYW4gY2xhc3M9XCJkYi1zY29yZXRleHQgZGItc2NvcmV0ZXh0LS1zbVwiPnt7IHJvdy5wZXJmIH19PC9zcGFuPjwvZGl2PjwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICA8YSBjbGFzcz1cImRiLWV5ZVwiIHRpdGxlPVwiVmlldyB1c2VyXCIgcm91dGVyTGluaz1cIi9tYW5hZ2UvdHJheC9hdWRpdC12Mi9kYXNoYm9hcmQvdXNlclwiIFtxdWVyeVBhcmFtc109XCJkZXRhaWxQYXJhbXMoeyBlbWFpbDogcm93LmVtYWlsIH0pXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTdcIiBoZWlnaHQ9XCIxN1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuOVwiXHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEuNSAxMlM1IDUuNSAxMiA1LjUgMjIuNSAxMiAyMi41IDEyIDE5IDE4LjUgMTIgMTguNSAxLjUgMTIgMS41IDEyelwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIzXCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGJvZHk+XHJcbiAgICAgIDwvdGFibGU+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCIhZmlsdGVyZWRVc2VyUGVyZi5sZW5ndGhcIiBjbGFzcz1cImF2Mi1lbXB0eVwiPlxyXG4gICAgICAgIDxpbWcgY2xhc3M9XCJhdjItZW1wdHktaW1nXCIgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvTm9kYXRhMS5zdmdcIiBhbHQ9XCJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXRleHRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdjItZW1wdHktdGl0bGVcIj5ObyBkYXRhIGZvdW5kPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWVtcHR5LXN1YlwiPnt7IHBlcmZTZWFyY2gudHJpbSgpID8gJ05vIHVzZXIgbWF0Y2hlcyB0aGlzIHNlYXJjaC4nIDogJ1RoZXJlIGlzIG5vIHJlc3VsdCBmb3IgVXNlciBQZXJmb3JtYW5jZSBpbiB0aGlzIHBlcmlvZC4nIH19PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBTaGFyZWQgcGFnZXIgKDEwIC8gMjAgLyAzMCksIGFzIG9uIHRoZSBvdGhlciBhdWRpdCBsaXN0cy4gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZGItcGVyZi1wYWdlclwiICpuZ0lmPVwicGVyZlRvdGFsXCI+XHJcbiAgICAgIDxsaWItcGFnaW5hdGlvbiBbaXRlbXNQZXJQYWdlXT1cInBlcmZQYWdlU2l6ZVwiIFtwYWdlU2l6ZV09XCJwZXJmUGFnZVNpemVcIiBbcGFnaW5hdGlvblNpemVzXT1cInBlcmZQYWdlU2l6ZXNcIlxyXG4gICAgICAgIFtjdXJyZW50UGFnZV09XCJwZXJmUGFnZVwiIFt0b3RhbEl0ZW1zXT1cInBlcmZUb3RhbFwiIChwYWdlQ2hhbmdlKT1cIm9uUGVyZlBhZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgKHBhZ2VTaXplQ2hhbmdlKT1cIm9uUGVyZlBhZ2VTaXplKCRldmVudClcIj48L2xpYi1wYWdpbmF0aW9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L3NlY3Rpb24+XHJcblxyXG4gIDwhLS0gPT09PT09PT09PT09IEZJTFRFUiBEUkFXRVIgPT09PT09PT09PT09IC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJmaWx0ZXItYmFja2Ryb3BcIiAqbmdJZj1cImZpbHRlcnNPcGVuXCIgKGNsaWNrKT1cImNhbmNlbEZpbHRlcnMoKVwiPjwvZGl2PlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiZmlsdGVyLWRyYXdlclwiICpuZ0lmPVwiZmlsdGVyc09wZW4gJiYgZHJhZnQgYXMgZHJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkcmF3ZXItaGVhZFwiPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImRyYXdlci10aXRsZVwiPkZpbHRlcnM8L3NwYW4+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiZGItY291bnRwaWxsXCIgKm5nSWY9XCJkci5maWx0ZXJDb3VudFwiPnt7IGRyLmZpbHRlckNvdW50IH19PC9zcGFuPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYXYyLWdyb3dcIj48L2Rpdj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZWJ0blwiIChjbGljayk9XCJjYW5jZWxGaWx0ZXJzKClcIiB0aXRsZT1cIkNsb3NlXCI+XHJcbiAgICAgICAgPHN2ZyB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48bGluZSB4MT1cIjZcIiB5MT1cIjZcIiB4Mj1cIjE4XCIgeTI9XCIxOFwiPjwvbGluZT48bGluZSB4MT1cIjE4XCIgeTE9XCI2XCIgeDI9XCI2XCIgeTI9XCIxOFwiPjwvbGluZT48L3N2Zz5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZHJhd2VyLWJvZHlcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRyYXdlci1uYXZcIj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImRyYXdlci1uYXZpdGVtXCIgKm5nRm9yPVwibGV0IGMgb2YgZHIuZmlsdGVyQ2F0czsgdHJhY2tCeTogdHJhY2tCeUNhdFwiIFtjbGFzcy5uYXZpdGVtLWFjdGl2ZV09XCJhY3RpdmVDYXQgPT09IGMua2V5XCJcclxuICAgICAgICAgIChjbGljayk9XCJzZWxlY3RDYXQoYy5rZXkpXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5hdnRleHRcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuYXZ0aXRsZVwiPnt7IGMubGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmF2dmFsdWVcIiBbY2xhc3MuaXMtZGlydHldPVwiYy5kaXJ0eVwiPnt7IGMudmFsdWUgfX08L3NwYW4+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImRpcnR5ZG90XCIgKm5nSWY9XCJjLmRpcnR5XCI+PC9zcGFuPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkcmF3ZXItcGFuZVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5ldGl0bGVcIj57eyBkci5hY3RpdmVDYXRPYmoudGl0bGUgfX08L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWhpbnRcIj57eyBkci5hY3RpdmVDYXRPYmouc3ViIH19PC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gUGVyaW9kIC0tPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY3RpdmVDYXQgPT09ICdwZXJpb2QnXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZS1vcHRpb25zXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lLW9wdGlvblwiIFtjbGFzcy5pcy1vbl09XCJkci5ncmFpbiA9PT0gJ3F1YXJ0ZXInXCIgKGNsaWNrKT1cImRyLnNldEdyYWluKCdxdWFydGVyJylcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbmUtcmFkaW9cIiBbY2xhc3MuaXMtb25dPVwiZHIuZ3JhaW4gPT09ICdxdWFydGVyJ1wiPjxzcGFuPjwvc3Bhbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYW5lLW9wdGlvbi10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbmUtb3B0aW9uLWxhYmVsXCI+UXVhcnRlcmx5PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYW5lLW9wdGlvbi1oZWxwXCI+UmVhZCBvbmUgZmluYW5jaWFsIHF1YXJ0ZXIgKEFwcmls4oCTTWFyY2ggeWVhcikgYXQgYSB0aW1lLjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZS1vcHRpb25cIiBbY2xhc3MuaXMtb25dPVwiZHIuZ3JhaW4gPT09ICdkYXRlJ1wiIChjbGljayk9XCJkci5zZXRHcmFpbignZGF0ZScpXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYW5lLXJhZGlvXCIgW2NsYXNzLmlzLW9uXT1cImRyLmdyYWluID09PSAnZGF0ZSdcIj48c3Bhbj48L3NwYW4+PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGFuZS1vcHRpb24tdGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYW5lLW9wdGlvbi1sYWJlbFwiPkJ5IGRhdGU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbmUtb3B0aW9uLWhlbHBcIj57eyBzaG93RHJhd2VyRGF0ZVJhbmdlID8gJ1BpY2sgYSBjdXN0b20gc3RhcnQgYW5kIGVuZCBkYXRlLicgOiAnVXNlIHRoZSBoZWFkZXIgZGF0ZSByYW5nZS4nIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZS1saXN0XCIgKm5nSWY9XCJkci5ncmFpbiA9PT0gJ3F1YXJ0ZXInXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3B0aW9ucm93XCIgKm5nRm9yPVwibGV0IHEgb2YgZHIucXVhcnRlcnNcIiBbY2xhc3Mub3B0aW9uLXNlbGVjdGVkXT1cImRyLnF1YXJ0ZXIgPT09IHFcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJkci5zZWxlY3RRdWFydGVyKHEpXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRpb25tYXJrXCIgW2NsYXNzLm1hcmstb25dPVwiZHIucXVhcnRlciA9PT0gcVwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImRyLnF1YXJ0ZXIgPT09IHFcIiB3aWR0aD1cIjExXCIgaGVpZ2h0PVwiMTFcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz5cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRsYWJlbFwiPnt7IHEgfX0gwrcge3sgcXVhcnRlck1vbnRocyhxKSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZS1maWVsZHNcIiAqbmdJZj1cInNob3dEcmF3ZXJEYXRlUmFuZ2UgJiYgZHIuZ3JhaW4gPT09ICdkYXRlJ1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGRcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpZWxkLWxhYmVsXCI+RGF0ZSByYW5nZTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXYyLWRhdGVwaWNrIGF2Mi1kYXRlcGljay0tY29tcGFjdFwiPlxyXG4gICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImF2Mi1kYXRlcGljay1pY29uXCIgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxyZWN0IHg9XCIzXCIgeT1cIjRcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMThcIiByeD1cIjJcIj48L3JlY3Q+XHJcbiAgICAgICAgICAgICAgICAgIDxsaW5lIHgxPVwiMTZcIiB5MT1cIjJcIiB4Mj1cIjE2XCIgeTI9XCI2XCI+PC9saW5lPjxsaW5lIHgxPVwiOFwiIHkxPVwiMlwiIHgyPVwiOFwiIHkyPVwiNlwiPjwvbGluZT48bGluZSB4MT1cIjNcIiB5MT1cIjEwXCIgeDI9XCIyMVwiIHkyPVwiMTBcIj48L2xpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImF2Mi1kYXRlcGljay1pbnB1dCBkYi1kYXRlcmFuZ2UgZGItZGF0ZXJhbmdlLS1maWVsZFwiIG5neERhdGVyYW5nZXBpY2tlck1kIHJlYWRvbmx5XHJcbiAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGRhdGUgcmFuZ2VcIiBbKG5nTW9kZWwpXT1cImRyLnJhbmdlXCIgW2xvY2FsZV09XCJwaWNrZXJMb2NhbGVcIlxyXG4gICAgICAgICAgICAgICAgICBbbWF4RGF0ZV09XCJ0b2RheVwiIFtkYXRlTGltaXRdPVwibWF4UmFuZ2VEYXlzXCIgW2F1dG9BcHBseV09XCJ0cnVlXCIgW2Fsd2F5c1Nob3dDYWxlbmRhcnNdPVwidHJ1ZVwiIFtzaG93Q2FuY2VsXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgW2Ryb3BzXT1cIidkb3duJ1wiIFtvcGVuc109XCIncmlnaHQnXCIgKGRhdGVzVXBkYXRlZCk9XCJkci5vblJhbmdlUGlja2VkKCRldmVudClcIj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPCEtLSBTY29wZSAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aXZlQ2F0ID09PSAnc2NvcGUnXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZS1zdGFja1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgZmllbGQtLWZ1bGxcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpZWxkLWxhYmVsXCI+Q2lyY2xlIEhlYWQgPHNwYW4gY2xhc3M9XCJmaWVsZC1tZXRhXCI+e3sgZHIuY2lyY2xlcy5sZW5ndGggfX0gdXNlcnM8L3NwYW4+PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxsaWItYXVkaXQtdjItc2VsZWN0IGNsYXNzPVwiZmllbGQtc2VsZWN0XCIgWyhuZ01vZGVsKV09XCJkci5jaXJjbGVcIiAobmdNb2RlbENoYW5nZSk9XCJkci5vbkNpcmNsZUNoYW5nZSgpXCIgW29wdGlvbnNdPVwiZHIucGlja09wdGlvbnMoZHIuY2lyY2xlcywgJ0FsbCBDaXJjbGVzJylcIiBhcmlhTGFiZWw9XCJDaXJjbGVcIj48L2xpYi1hdWRpdC12Mi1zZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgZmllbGQtLWZ1bGxcIiAqbmdJZj1cImRyLmNpcmNsZVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5ab25lIE1hbmFnZXI8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPGxpYi1hdWRpdC12Mi1zZWxlY3QgY2xhc3M9XCJmaWVsZC1zZWxlY3RcIiBbKG5nTW9kZWwpXT1cImRyLnpvbmVcIiAobmdNb2RlbENoYW5nZSk9XCJkci5vblpvbmVDaGFuZ2UoKVwiIFtvcHRpb25zXT1cImRyLnBpY2tPcHRpb25zKGRyLnpvbmVzLCAnQWxsIHpvbmVzJylcIiBhcmlhTGFiZWw9XCJab25lXCI+PC9saWItYXVkaXQtdjItc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGZpZWxkLS1mdWxsXCIgKm5nSWY9XCJkci56b25lXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWVsZC1sYWJlbFwiPkFPTTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8bGliLWF1ZGl0LXYyLXNlbGVjdCBjbGFzcz1cImZpZWxkLXNlbGVjdFwiIFsobmdNb2RlbCldPVwiZHIuYW9tXCIgKG5nTW9kZWxDaGFuZ2UpPVwiZHIub25Bb21DaGFuZ2UoKVwiIFtvcHRpb25zXT1cImRyLnBpY2tPcHRpb25zKGRyLmFvbXMsICdBbGwgQU9NcycpXCIgYXJpYUxhYmVsPVwiQU9NXCI+PC9saWItYXVkaXQtdjItc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGZpZWxkLS1mdWxsXCIgKm5nSWY9XCJkci5hb21cIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpZWxkLWxhYmVsXCI+U3RvcmU8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPGxpYi1hdWRpdC12Mi1zZWxlY3QgY2xhc3M9XCJmaWVsZC1zZWxlY3RcIiBbKG5nTW9kZWwpXT1cImRyLnN0b3JlXCIgW29wdGlvbnNdPVwiZHIuc3RvcmVQaWNrT3B0aW9uc1wiIGFyaWFMYWJlbD1cIlN0b3JlXCI+PC9saWItYXVkaXQtdjItc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlYWRpbmdyb3dcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlYWRpbmdsYWJlbFwiPlJlYWRpbmc8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZWFkaW5ndmFsdWVcIj57eyBkci5zY29wZVJlYWRpbmcgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdjItZ3Jvd1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8YSBjbGFzcz1cImRiLWJhbmRsaW5rXCIgKGNsaWNrKT1cImRyLnJlc2V0U2NvcGUoKVwiPlJlc2V0IHRvIGFsbCBjaXJjbGVzPC9hPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8IS0tIEF1ZGl0IHR5cGUgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmUtbGlzdFwiICpuZ0lmPVwiYWN0aXZlQ2F0ID09PSAndHlwZSdcIj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3B0aW9ucm93XCIgKm5nRm9yPVwibGV0IHQgb2YgYXVkaXRUeXBlc1wiIFtjbGFzcy5vcHRpb24tc2VsZWN0ZWRdPVwiZHIuYXVkaXRUeXBlID09PSB0LmtleVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJkci5hdWRpdFR5cGUgPSB0LmtleVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGlvbm1hcmtcIiBbY2xhc3MubWFyay1vbl09XCJkci5hdWRpdFR5cGUgPT09IHQua2V5XCI+XHJcbiAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImRyLmF1ZGl0VHlwZSA9PT0gdC5rZXlcIiB3aWR0aD1cIjExXCIgaGVpZ2h0PVwiMTFcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHR0ZXh0XCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRsYWJlbFwiPnt7IHQubGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRtZXRhXCI+e3sgdC5oZWxwIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBTY29yZSBiYW5kIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lLWxpc3RcIiAqbmdJZj1cImFjdGl2ZUNhdCA9PT0gJ2JhbmQnXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm9wdGlvbnJvd1wiICpuZ0Zvcj1cImxldCBiIG9mIGRyLmJhbmRSb3dzOyB0cmFja0J5OiB0cmFja0J5QmFuZFwiIFtjbGFzcy5vcHRpb24tc2VsZWN0ZWRdPVwiZHIuaXNCYW5kT24oYi5iYW5kKVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJkci5hcHBseUJhbmQoYi5iYW5kKVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiLWJhbmRkb3RcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJiLmJhbmQuc29mdFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHR0ZXh0XCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRsYWJlbFwiPnt7IGIuYmFuZC5sYWJlbCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdG1ldGFcIj57eyBiLmJhbmQucmFuZ2UgfX0gwrcge3sgYi5jb3VudCB9fSBzdG9yZXM8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGF2Mi1idG4tLWdob3N0IGF2Mi1idG4tLXNtIHBhbmUtcmVzZXRidG5cIiAoY2xpY2spPVwiZHIuY2xlYXJCYW5kKClcIj5BbGwgc2NvcmVzPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gU3RhdHVzIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lLWxpc3RcIiAqbmdJZj1cImFjdGl2ZUNhdCA9PT0gJ3N0YXR1cydcIj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib3B0aW9ucm93XCIgW2NsYXNzLm9wdGlvbi1zZWxlY3RlZF09XCJkci5zdGF0dXMgPT09ICdhbGwnXCIgKGNsaWNrKT1cImRyLnNldFN0YXR1cygnYWxsJylcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRpb25tYXJrXCIgW2NsYXNzLm1hcmstb25dPVwiZHIuc3RhdHVzID09PSAnYWxsJ1wiPlxyXG4gICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJkci5zdGF0dXMgPT09ICdhbGwnXCIgd2lkdGg9XCIxMVwiIGhlaWdodD1cIjExXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiMjAgNiA5IDE3IDQgMTJcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0bGFiZWxcIj5BbGwgc3RvcmVzPC9zcGFuPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm9wdGlvbnJvd1wiIFtjbGFzcy5vcHRpb24tc2VsZWN0ZWRdPVwiZHIuc3RhdHVzID09PSAnZmFpbCdcIiAoY2xpY2spPVwiZHIuc2V0U3RhdHVzKCdmYWlsJylcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRpb25tYXJrXCIgW2NsYXNzLm1hcmstb25dPVwiZHIuc3RhdHVzID09PSAnZmFpbCdcIj5cclxuICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiZHIuc3RhdHVzID09PSAnZmFpbCdcIiB3aWR0aD1cIjExXCIgaGVpZ2h0PVwiMTFcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRsYWJlbFwiPnt7IGRyLmxhYmVscy5mYWlsIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm9wdGlvbnJvd1wiIFtjbGFzcy5vcHRpb24tc2VsZWN0ZWRdPVwiZHIuc3RhdHVzID09PSAncGFzcydcIiAoY2xpY2spPVwiZHIuc2V0U3RhdHVzKCdwYXNzJylcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRpb25tYXJrXCIgW2NsYXNzLm1hcmstb25dPVwiZHIuc3RhdHVzID09PSAncGFzcydcIj5cclxuICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiZHIuc3RhdHVzID09PSAncGFzcydcIiB3aWR0aD1cIjExXCIgaGVpZ2h0PVwiMTFcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+PC9zdmc+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvcHRsYWJlbFwiPnt7IGRyLmxhYmVscy5wYXNzIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm9wdGlvbnJvd1wiIFtjbGFzcy5vcHRpb24tc2VsZWN0ZWRdPVwiZHIuc3RhdHVzID09PSAnbmEnXCIgKGNsaWNrKT1cImRyLnNldFN0YXR1cygnbmEnKVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm9wdGlvbm1hcmtcIiBbY2xhc3MubWFyay1vbl09XCJkci5zdGF0dXMgPT09ICduYSdcIj5cclxuICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiZHIuc3RhdHVzID09PSAnbmEnXCIgd2lkdGg9XCIxMVwiIGhlaWdodD1cIjExXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cG9seWxpbmUgcG9pbnRzPVwiMjAgNiA5IDE3IDQgMTJcIj48L3BvbHlsaW5lPjwvc3ZnPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib3B0bGFiZWxcIj5Ob3QgYXVkaXRlZDwvc3Bhbj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJkcmF3ZXItZm9vdFwiPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tZ2hvc3RcIiAoY2xpY2spPVwiZHIuY2xlYXJBbGwoKVwiPkNsZWFyIGFsbDwvYnV0dG9uPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYXYyLWdyb3dcIj48L2Rpdj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhdjItYnRuIGF2Mi1idG4tLWdob3N0XCIgKGNsaWNrKT1cImNhbmNlbEZpbHRlcnMoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImF2Mi1idG4gYXYyLWJ0bi0tcHJpbWFyeSBhdjItYnRuLS13aWRlXCIgKGNsaWNrKT1cImFwcGx5RmlsdGVycygpXCI+QXBwbHkgZmlsdGVyczwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG48L2Rpdj5cclxuIl19