@c8y/ngx-components 1021.78.5 → 1021.80.1

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 (49) hide show
  1. package/core/asset-property/asset-property.model.d.ts +33 -0
  2. package/core/asset-property/asset-property.model.d.ts.map +1 -0
  3. package/core/asset-property/asset-property.service.d.ts +20 -0
  4. package/core/asset-property/asset-property.service.d.ts.map +1 -0
  5. package/core/common/virtual-scroll/virtual-scroller-wrapper.component.d.ts +7 -1
  6. package/core/common/virtual-scroll/virtual-scroller-wrapper.component.d.ts.map +1 -1
  7. package/core/data-grid/configure-custom-column/asset-property-grid.component.d.ts +31 -0
  8. package/core/data-grid/configure-custom-column/asset-property-grid.component.d.ts.map +1 -0
  9. package/core/data-grid/configure-custom-column/configure-custom-column.service.d.ts +17 -0
  10. package/core/data-grid/configure-custom-column/configure-custom-column.service.d.ts.map +1 -0
  11. package/core/data-grid/configure-custom-column/identifier.cell-renderer.component.d.ts +9 -0
  12. package/core/data-grid/configure-custom-column/identifier.cell-renderer.component.d.ts.map +1 -0
  13. package/core/data-grid/configure-custom-column/identifier.data-grid-column.d.ts +6 -0
  14. package/core/data-grid/configure-custom-column/identifier.data-grid-column.d.ts.map +1 -0
  15. package/core/data-grid/configure-custom-column/tags.cell-renderer.components.d.ts +9 -0
  16. package/core/data-grid/configure-custom-column/tags.cell-renderer.components.d.ts.map +1 -0
  17. package/core/data-grid/configure-custom-column/tags.data-grid-column.d.ts +6 -0
  18. package/core/data-grid/configure-custom-column/tags.data-grid-column.d.ts.map +1 -0
  19. package/core/data-grid/configure-custom-column/title.cell-renderer.component.d.ts +9 -0
  20. package/core/data-grid/configure-custom-column/title.cell-renderer.component.d.ts.map +1 -0
  21. package/core/data-grid/configure-custom-column/title.data-grid-column.d.ts +6 -0
  22. package/core/data-grid/configure-custom-column/title.data-grid-column.d.ts.map +1 -0
  23. package/core/data-grid/data-grid.component.d.ts +4 -5
  24. package/core/data-grid/data-grid.component.d.ts.map +1 -1
  25. package/core/data-grid/data-grid.module.d.ts.map +1 -1
  26. package/core/data-grid/filter-chip/filter-mapper.module.d.ts.map +1 -1
  27. package/esm2022/core/asset-property/asset-property.model.mjs +2 -0
  28. package/esm2022/core/asset-property/asset-property.service.mjs +84 -0
  29. package/esm2022/core/common/virtual-scroll/virtual-scroller-wrapper.component.mjs +25 -6
  30. package/esm2022/core/data-grid/configure-custom-column/asset-property-grid.component.mjs +131 -0
  31. package/esm2022/core/data-grid/configure-custom-column/configure-custom-column.component.mjs +3 -3
  32. package/esm2022/core/data-grid/configure-custom-column/configure-custom-column.service.mjs +51 -0
  33. package/esm2022/core/data-grid/configure-custom-column/identifier.cell-renderer.component.mjs +20 -0
  34. package/esm2022/core/data-grid/configure-custom-column/identifier.data-grid-column.mjs +26 -0
  35. package/esm2022/core/data-grid/configure-custom-column/tags.cell-renderer.components.mjs +20 -0
  36. package/esm2022/core/data-grid/configure-custom-column/tags.data-grid-column.mjs +25 -0
  37. package/esm2022/core/data-grid/configure-custom-column/title.cell-renderer.component.mjs +20 -0
  38. package/esm2022/core/data-grid/configure-custom-column/title.data-grid-column.mjs +26 -0
  39. package/esm2022/core/data-grid/data-grid.component.mjs +42 -53
  40. package/esm2022/core/data-grid/data-grid.module.mjs +1 -1
  41. package/esm2022/core/data-grid/filter-chip/filter-mapper.module.mjs +3 -2
  42. package/fesm2022/c8y-ngx-components-asset-property-grid.component-CmhkghTo.mjs +233 -0
  43. package/fesm2022/c8y-ngx-components-asset-property-grid.component-CmhkghTo.mjs.map +1 -0
  44. package/fesm2022/c8y-ngx-components-c8y-ngx-components-D-YOjLHK.mjs +36646 -0
  45. package/fesm2022/c8y-ngx-components-c8y-ngx-components-D-YOjLHK.mjs.map +1 -0
  46. package/fesm2022/c8y-ngx-components.mjs +1 -36518
  47. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  48. package/locales/locales.pot +30 -0
  49. package/package.json +1 -1
@@ -1,9 +1,8 @@
1
1
  import { CdkHeaderCell, CdkTable } from '@angular/cdk/table';
2
- import { Component, ContentChild, ContentChildren, ElementRef, EventEmitter, Inject, Input, Optional, Output, QueryList, ViewChild, ViewChildren, ViewContainerRef, forwardRef } from '@angular/core';
2
+ import { Component, ContentChild, ContentChildren, ElementRef, EventEmitter, Inject, Input, Optional, Output, QueryList, ViewChild, ViewChildren, ViewContainerRef, forwardRef, inject } from '@angular/core';
3
3
  import { DomSanitizer } from '@angular/platform-browser';
4
4
  import { ActivatedRoute } from '@angular/router';
5
5
  import { parseInt as _parseInt, castArray, flow, get, indexOf, isEmpty, isNil, union, uniqBy, without } from 'lodash-es';
6
- import { BsModalService } from 'ngx-bootstrap/modal';
7
6
  import { BehaviorSubject, Subject, combineLatest, forkJoin, isObservable, merge, of, pipe } from 'rxjs';
8
7
  import { combineLatestWith, concatMap, debounceTime, delay, distinctUntilChanged, filter, first, map, mergeMap, startWith, switchMap, take, takeUntil, tap } from 'rxjs/operators';
9
8
  import { AlertService } from '../alert/alert.service';
@@ -15,44 +14,43 @@ import { GainsightService } from '../product-experience/gainsight.service';
15
14
  import { PRODUCT_EXPERIENCE_EVENT_SOURCE } from '../product-experience/product-experience.model';
16
15
  import { ActionControlsExtensionService } from './action-controls-extension.service';
17
16
  import { ColumnDirective } from './column/column.directive';
18
- import { CustomColumn } from './column/custom.column';
19
17
  import { ExpandableRowColumn } from './column/expandable-row-column/expandable.data-grid-column';
20
- import { ConfigureCustomColumnComponent } from './configure-custom-column';
21
18
  import { DATA_GRID_CONFIGURATION_STRATEGY } from './data-grid-configuration.model';
22
19
  import { BuiltInActionType, FilteringActionType, minColumnGridTrackSize, ratiosByColumnTypes } from './data-grid.model';
23
20
  import { DataGridService } from './data-grid.service';
24
21
  import { ExpandableRowDirective } from './expandable-row.directive';
25
22
  import { GridDataSource } from './grid-data-source';
26
23
  import { PX_ACTIONS, PX_EVENT_NAME } from './product-experience.constants';
24
+ import { CustomColumn } from './column/custom.column';
25
+ import { CustomColumnService } from './configure-custom-column/configure-custom-column.service';
27
26
  import * as i0 from "@angular/core";
28
27
  import * as i1 from "./data-grid.service";
29
28
  import * as i2 from "@angular/platform-browser";
30
29
  import * as i3 from "../product-experience/gainsight.service";
31
- import * as i4 from "ngx-bootstrap/modal";
32
- import * as i5 from "../alert/alert.service";
33
- import * as i6 from "./action-controls-extension.service";
34
- import * as i7 from "@angular/router";
35
- import * as i8 from "@angular/common";
36
- import * as i9 from "@angular/cdk/table";
37
- import * as i10 from "@angular/cdk/drag-drop";
38
- import * as i11 from "@angular/forms";
39
- import * as i12 from "../common/icon.directive";
40
- import * as i13 from "../i18n/c8y-translate.directive";
41
- import * as i14 from "../common/loading.component";
42
- import * as i15 from "../modal/popover-confirm.component";
43
- import * as i16 from "ngx-bootstrap/dropdown";
44
- import * as i17 from "ngx-bootstrap/popover";
45
- import * as i18 from "ngx-bootstrap/tooltip";
46
- import * as i19 from "ngx-bootstrap/pagination";
47
- import * as i20 from "../product-experience/product-experience.directive";
48
- import * as i21 from "@angular/cdk/a11y";
49
- import * as i22 from "./column/cell-renderer.component";
50
- import * as i23 from "./column/filtering-form-renderer.component";
51
- import * as i24 from "../i18n/c8y-translate.pipe";
52
- import * as i25 from "../common/map-function.pipe";
53
- import * as i26 from "./filter-chip/filter-mapper.pipe";
54
- import * as i27 from "./filter-chip/grouped-filter-chips.pipe";
55
- import * as i28 from "./visible-controls.pipe";
30
+ import * as i4 from "../alert/alert.service";
31
+ import * as i5 from "./action-controls-extension.service";
32
+ import * as i6 from "@angular/router";
33
+ import * as i7 from "@angular/common";
34
+ import * as i8 from "@angular/cdk/table";
35
+ import * as i9 from "@angular/cdk/drag-drop";
36
+ import * as i10 from "@angular/forms";
37
+ import * as i11 from "../common/icon.directive";
38
+ import * as i12 from "../i18n/c8y-translate.directive";
39
+ import * as i13 from "../common/loading.component";
40
+ import * as i14 from "../modal/popover-confirm.component";
41
+ import * as i15 from "ngx-bootstrap/dropdown";
42
+ import * as i16 from "ngx-bootstrap/popover";
43
+ import * as i17 from "ngx-bootstrap/tooltip";
44
+ import * as i18 from "ngx-bootstrap/pagination";
45
+ import * as i19 from "../product-experience/product-experience.directive";
46
+ import * as i20 from "@angular/cdk/a11y";
47
+ import * as i21 from "./column/cell-renderer.component";
48
+ import * as i22 from "./column/filtering-form-renderer.component";
49
+ import * as i23 from "../i18n/c8y-translate.pipe";
50
+ import * as i24 from "../common/map-function.pipe";
51
+ import * as i25 from "./filter-chip/filter-mapper.pipe";
52
+ import * as i26 from "./filter-chip/grouped-filter-chips.pipe";
53
+ import * as i27 from "./visible-controls.pipe";
56
54
  var SortingOrder;
57
55
  (function (SortingOrder) {
58
56
  SortingOrder["ASC"] = "asc";
@@ -106,12 +104,11 @@ export class DataGridComponent {
106
104
  set _headerActionControls(headerActionControls) {
107
105
  this.headerActionControls = headerActionControls || [];
108
106
  }
109
- constructor(configurationStrategy, dataGridService, sanitizer, gainsightService, bsModalService, alertService, actionControlsService, route) {
107
+ constructor(configurationStrategy, dataGridService, sanitizer, gainsightService, alertService, actionControlsService, route) {
110
108
  this.configurationStrategy = configurationStrategy;
111
109
  this.dataGridService = dataGridService;
112
110
  this.sanitizer = sanitizer;
113
111
  this.gainsightService = gainsightService;
114
- this.bsModalService = bsModalService;
115
112
  this.alertService = alertService;
116
113
  this.actionControlsService = actionControlsService;
117
114
  this.route = route;
@@ -253,6 +250,7 @@ export class DataGridComponent {
253
250
  this.manualSearch$ = new Subject();
254
251
  this.lastManualSearchValue = '';
255
252
  this.SEARCH_DEBOUNCE_TIME = 500;
253
+ this.customColumnService = inject(CustomColumnService);
256
254
  /**
257
255
  * Event emitter, taking boolean values used for loading data grid data with debounce.
258
256
  * Default value is set to false. Set to true if data grid is using infinite scroll and page should be reloaded.
@@ -389,27 +387,18 @@ export class DataGridComponent {
389
387
  this.pagination = { ...this.pagination, pageSize: this.minPossiblePageSize };
390
388
  }
391
389
  }
392
- openCustomColumnModal() {
393
- const modalRef = this.bsModalService.show(ConfigureCustomColumnComponent, {
394
- class: 'modal-sm',
395
- ariaDescribedby: 'modal-body',
396
- ariaLabelledBy: 'modal-title',
397
- ignoreBackdropClick: true,
398
- initialState: {
399
- columns: this.columns
400
- }
401
- });
402
- modalRef.content.onAddCustomColumn
403
- .pipe(tap((customColumnConfig) => {
404
- const firstFixedColumPosition = this.columns.indexOf(this.columns.find(column => column.positionFixed));
405
- this.columns.splice(firstFixedColumPosition > -1 ? firstFixedColumPosition : this.columns.length, 0, new CustomColumn(customColumnConfig));
390
+ async openCustomColumn() {
391
+ await this.customColumnService.openCustomColumns(this.columns, config => {
392
+ const firstFixed = this.columns.findIndex(c => c.positionFixed);
393
+ const idx = firstFixed > -1 ? firstFixed : this.columns.length;
394
+ this.columns.splice(idx, 0, new CustomColumn(config));
406
395
  this.updateColumns();
407
396
  this.triggerEvent({
408
397
  action: PX_ACTIONS.ADD_CUSTOM_COLUMN,
409
- column: customColumnConfig.header || customColumnConfig.name
398
+ column: config.header || config.name
410
399
  });
411
- }), takeUntil(modalRef.onHidden))
412
- .subscribe(event => this.onAddCustomColumn.emit(event));
400
+ this.onAddCustomColumn.emit(config);
401
+ });
413
402
  }
414
403
  async removeCustomColumn(poConfirm, column, ddConfigureColumns) {
415
404
  ddConfigureColumns.autoClose = false;
@@ -1097,13 +1086,13 @@ export class DataGridComponent {
1097
1086
  }
1098
1087
  }
1099
1088
  }
1100
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataGridComponent, deps: [{ token: DATA_GRID_CONFIGURATION_STRATEGY, optional: true }, { token: i1.DataGridService }, { token: i2.DomSanitizer }, { token: i3.GainsightService }, { token: i4.BsModalService }, { token: i5.AlertService }, { token: i6.ActionControlsExtensionService }, { token: i7.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
1089
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataGridComponent, deps: [{ token: DATA_GRID_CONFIGURATION_STRATEGY, optional: true }, { token: i1.DataGridService }, { token: i2.DomSanitizer }, { token: i3.GainsightService }, { token: i4.AlertService }, { token: i5.ActionControlsExtensionService }, { token: i6.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
1101
1090
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DataGridComponent, selector: "c8y-data-grid", inputs: { title: "title", loadMoreItemsLabel: "loadMoreItemsLabel", loadingItemsLabel: "loadingItemsLabel", showSearch: "showSearch", refresh: "refresh", _columns: ["columns", "_columns"], _rows: ["rows", "_rows"], _pagination: ["pagination", "_pagination"], _infiniteScroll: ["infiniteScroll", "_infiniteScroll"], _serverSideDataCallback: ["serverSideDataCallback", "_serverSideDataCallback"], _selectable: ["selectable", "_selectable"], _singleSelection: ["singleSelection", "_singleSelection"], _selectionPrimaryKey: ["selectionPrimaryKey", "_selectionPrimaryKey"], _displayOptions: ["displayOptions", "_displayOptions"], _actionControls: ["actionControls", "_actionControls"], _bulkActionControls: ["bulkActionControls", "_bulkActionControls"], _headerActionControls: ["headerActionControls", "_headerActionControls"], searchText: "searchText", configureColumnsEnabled: "configureColumnsEnabled", showCounterWarning: "showCounterWarning", activeClassName: "activeClassName", expandableRows: "expandableRows", hideReload: "hideReload" }, outputs: { rowMouseOver: "rowMouseOver", rowMouseLeave: "rowMouseLeave", rowClick: "rowClick", onConfigChange: "onConfigChange", onBeforeFilter: "onBeforeFilter", onBeforeSearch: "onBeforeSearch", onFilter: "onFilter", itemsSelect: "itemsSelect", onReload: "onReload", onAddCustomColumn: "onAddCustomColumn", onRemoveCustomColumn: "onRemoveCustomColumn", onColumnFilterReset: "onColumnFilterReset", onSort: "onSort", onPageSizeChange: "onPageSizeChange", onColumnReordered: "onColumnReordered", onColumnVisibilityChange: "onColumnVisibilityChange" }, host: { classAttribute: "d-contents" }, providers: [
1102
1091
  {
1103
1092
  provide: PRODUCT_EXPERIENCE_EVENT_SOURCE,
1104
1093
  useExisting: forwardRef(() => DataGridComponent)
1105
1094
  }
1106
- ], queries: [{ propertyName: "expandableRow", first: true, predicate: ExpandableRowDirective, descendants: true }, { propertyName: "emptyState", first: true, predicate: EmptyStateContextDirective, descendants: true }, { propertyName: "columnRenderers", predicate: ColumnDirective }], viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scroll"], descendants: true, static: true }, { propertyName: "infiniteScrollContainer", first: true, predicate: ["infiniteScrollContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "tableRef", first: true, predicate: CdkTable, descendants: true }, { propertyName: "thRefs", predicate: CdkHeaderCell, descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"table-data-grid-scroll\"\n #scroll\n [ngClass]=\"{\n 'table-data-grid__overlay': (dataSource.loading$ | async) && !loadMoreComponent?.isLoading\n }\"\n data-cy=\"c8y-data-grid--table-data-grid-scroll\"\n>\n <div\n class=\"table-data-grid__loading--wrapper\"\n *ngIf=\"(dataSource.loading$ | async) && !loadMoreComponent?.isLoading\"\n >\n <div class=\"table-data-grid__loading--loader\">\n <c8y-loading\n layout=\"application\"\n [message]=\"loadingItemsLabel\"\n ></c8y-loading>\n </div>\n </div>\n\n <div\n class=\"table-data-grid-header separator large-padding\"\n *ngIf=\"displayOptions.gridHeader\"\n >\n <div\n class=\"h4\"\n [ngClass]=\"{ 'm-r-16': !!title }\"\n >\n {{ title | translate }}\n </div>\n\n <ng-container *ngIf=\"displayOptions.filter\">\n <span *ngIf=\"!filteringApplied\">\n <small\n class=\"m-r-4\"\n *ngIf=\"!!filteringLabelsParams.allItemsCount\"\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n {{ filteredItemsCount }} of {{ allItemsCount }} items\n </small>\n <span\n class=\"label label-default m-r-4\"\n translate\n >\n No filters\n </span>\n </span>\n <span\n class=\"d-flex a-i-center\"\n *ngIf=\"filteringApplied\"\n >\n <ng-container *ngIf=\"!!filteringLabelsParams.allItemsCount\">\n <div class=\"a-i-center\">\n <span class=\"badge badge-info m-r-4\">\n {{ (dataSource.stats$ | async).filteredSize }}\n </span>\n <small\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n of {{ allItemsCount }} items\n </small>\n </div>\n </ng-container>\n <div\n class=\"dropdown\"\n placement=\"bottom left\"\n dropdown\n #ddFilters=\"bs-dropdown\"\n [cdkTrapFocus]=\"ddFilters.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btn btn-default btn-sm m-l-8\"\n title=\"{{ 'Active filters' | translate }}\"\n aria-haspopup=\"true\"\n dropdownToggle\n data-cy=\"c8y-data-grid--filters\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"filter\"\n ></i>\n <span>{{ 'Active filters' | translate }}</span>\n <span class=\"badge badge-system\">\n {{ columnsWithFiltersApplied.length }}\n </span>\n </button>\n\n <div\n class=\"dropdown-menu\"\n *dropdownMenu\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"data-grid__dropdown bg-level-0\">\n <ul class=\"list-unstyled m-0\">\n <li\n *ngFor=\"let column of columnsWithFiltersApplied; let last = last\"\n [ngClass]=\"{ 'separator-bottom': !last }\"\n >\n <ng-container>\n <div\n class=\"dropdown-header sticky-top text-truncate no-border-top p-b-0\"\n title=\"{{ (column.header | translate) || column.name }}\"\n >\n <label>\n {{ (column.header | translate) || column.name }}\n </label>\n </div>\n <div\n class=\"list-group-item borderless d-flex d-col\"\n *ngFor=\"\n let groupedFilterChips of column\n | mapToFilterChips\n | async\n | groupedFilterChips;\n let first = first\n \"\n [ngClass]=\"{ 'p-t-0': first }\"\n >\n <p\n class=\"small p-b-4\"\n *ngIf=\"groupedFilterChips.label\"\n >\n {{ groupedFilterChips.label | translate }}\n </p>\n <div class=\"d-flex a-i-center gap-4 flex-wrap\">\n <span\n class=\"tag tag--info chip\"\n *ngFor=\"let chip of groupedFilterChips.chips\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10 m-r-4\"\n title=\"{{ 'Remove filter' | translate }}\"\n (click)=\"removeFilter(chip.remove())\"\n data-cy=\"c8y-data-grid--remove-chip\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n {{ chip.displayValue | translate }}\n </span>\n </div>\n </div>\n </ng-container>\n </li>\n </ul>\n </div>\n <div class=\"list-group-item separator-top sticky-bottom\">\n <button\n class=\"btn btn-sm btn-default\"\n title=\"{{ 'Clear all filters' | translate }}\"\n type=\"button\"\n (click)=\"clearFilters()\"\n data-cy=\"c8y-data-grid--clear-filters\"\n >\n {{ 'Clear all filters' | translate }}\n </button>\n </div>\n </div>\n </div>\n </span>\n\n <button\n class=\"btn-help btn-help--sm hidden-xs hidden-sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"filtersHelpPopover\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"displayOptions.filter\"\n data-cy=\"data-grid--help-filters\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n <ng-template #filtersHelpPopover>\n <div [innerHtml]=\"filtersHelpPopoverHtml | translate\"></div>\n </ng-template>\n\n <button\n class=\"btn-clean text-primary hidden-xs hidden-sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ 'The counter for the total number of items might be inaccurate.' | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"showCounterWarning\"\n >\n <i c8yIcon=\"warning\"></i>\n </button>\n </ng-container>\n\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex a-i-center\">\n <ng-container\n *ngFor=\"let headerActionControl of headerActionControls | visibleControls | async\"\n >\n <ng-container *ngIf=\"!headerActionControl.template; else customTemplate\">\n <button\n class=\"btnbar-btn btn-link\"\n title=\"{{ headerActionControl.text | translate }}\"\n type=\"button\"\n (click)=\"headerActionControl.callback()\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION,\n customActionName: headerActionControl.text,\n type: headerActionControl.type\n }\"\n >\n <i\n class=\"m-r-4\"\n [c8yIcon]=\"headerActionControl.icon\"\n ></i>\n <span>{{ headerActionControl.text | translate }}</span>\n </button>\n </ng-container>\n <ng-template #customTemplate>\n <ng-container\n *ngTemplateOutlet=\"\n headerActionControl.template;\n context: { headerActionControl: headerActionControl }\n \"\n ></ng-container>\n </ng-template>\n </ng-container>\n\n <div\n class=\"dropdown\"\n placement=\"bottom left\"\n *ngIf=\"configureColumnsEnabled\"\n dropdown\n #ddConfigureColumns=\"bs-dropdown\"\n [cdkTrapFocus]=\"ddConfigureColumns.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Configure columns' | translate }}\"\n type=\"button\"\n data-cy=\"data-grid--custom-column-btn\"\n dropdownToggle\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"columns\"\n ></i>\n <span>{{ 'Configure columns' | translate }}</span>\n </button>\n\n <ul\n class=\"dropdown-menu data-grid__dropdown\"\n *dropdownMenu\n (click)=\"$event.stopPropagation()\"\n >\n <li>\n <div\n class=\"list-group m-0\"\n cdkDropList\n (cdkDropListDropped)=\"onColumnDrop($event)\"\n >\n <div\n *ngFor=\"let column of columns\"\n cdkDrag\n cdkDragLockAxis=\"y\"\n >\n <ng-container *ngIf=\"!column.positionFixed\">\n <div class=\"list-group-item draggable-after p-0 a-i-center\">\n <label\n class=\"c8y-checkbox p-l-16\"\n title=\"{{ (column.header | translate) || column.name }}\"\n [attr.data-cy]=\"'data-grid--custom-column-header-' + column.header\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"column.visible\"\n (change)=\"\n updateGridColumnsSize(); emitConfigChange('changeColumnVisibility')\n \"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CHANGE_VISIBILITY,\n column: column.name,\n visible: !column.visible\n }\"\n />\n <span></span>\n <span>{{ (column.header | translate) || column.name }}</span>\n </label>\n <button\n class=\"btn btn-dot showOnHover max-width-fit a-i-center\"\n [attr.aria-label]=\"'Remove`column,verb`' | translate\"\n tooltip=\"{{ 'Remove`column,verb`' | translate }}\"\n placement=\"left\"\n container=\"body\"\n type=\"button\"\n (click)=\"removeCustomColumn(poConfirm, column, ddConfigureColumns)\"\n *ngIf=\"column.custom\"\n >\n <c8y-popover-confirm\n [title]=\"'Confirm removal' | translate\"\n triggers=\"focus\"\n [placement]=\"'left'\"\n #poConfirm\n ></c8y-popover-confirm>\n <i\n c8yIcon=\"minus-circle\"\n data-cy=\"data-grid--custom-column-remove-btn\"\n ></i>\n </button>\n </div>\n </ng-container>\n </div>\n </div>\n </li>\n <li\n class=\"p-8 sticky-bottom separator-top\"\n *ngIf=\"isConfigContextKnown\"\n >\n <button\n class=\"btn btn-default btn-block\"\n title=\"{{ 'Add custom column' | translate }}\"\n type=\"button\"\n data-cy=\"data-grid--add-custom-column\"\n (click)=\"openCustomColumnModal(); ddConfigureColumns.hide()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"plus-circle\"\n ></i>\n <span>{{ 'Add custom column' | translate }}</span>\n </button>\n </li>\n </ul>\n </div>\n\n <button\n class=\"btnbar-btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n *ngIf=\"!hideReload\"\n data-cy=\"data-grid--reload-btn\"\n [disabled]=\"dataSource.loading$ | async\"\n (click)=\"clickReload()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"refresh\"\n ></i>\n <span>{{ 'Reload' | translate }}</span>\n </button>\n\n <div\n class=\"input-group input-group-search m-l-sm-16 data-grid__search-input\"\n *ngIf=\"!serverSideDataCallback || showSearch\"\n >\n <input\n class=\"form-control\"\n placeholder=\"{{ 'Search\u2026' | translate }}\"\n type=\"search\"\n [(ngModel)]=\"searchText\"\n (ngModelChange)=\"searchText$.emit($event)\"\n (keydown.enter)=\"$event.stopPropagation(); performSearch(searchText)\"\n />\n <div class=\"input-group-addon\">\n <i\n c8yIcon=\"search\"\n *ngIf=\"searchText.length === 0\"\n ></i>\n <i\n class=\"pointer\"\n c8yIcon=\"times\"\n *ngIf=\"searchText.length > 0\"\n (click)=\"searchText = ''; searchText$.emit('')\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.CLEAR_SEARCH }\"\n ></i>\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"table-data-grid-header-bulk-actions animated slideInDown fast\"\n data-cy=\"table-data-grid-header-bulk-actions\"\n *ngIf=\"selectedItemIds.length !== 0\"\n >\n <h4>\n <ng-container [ngPlural]=\"selectedItemIds.length\">\n <ng-template ngPluralCase=\"=1\">\n <span translate>1 selected item.</span>\n </ng-template>\n <ng-template ngPluralCase=\"other\">\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: selectedItemIds.length }\"\n >\n {{ count }} selected items.\n </span>\n </ng-template>\n </ng-container>\n <br class=\"visible-xs\" />\n <small *ngIf=\"!serverSideDataCallback && selectedItemIds.length >= pagination.pageSize\">\n <a\n class=\"interact\"\n (click)=\"setAllItemsSelected(true)\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n >\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: (dataSource.stats$ | async).filteredSize }\"\n >\n Select all {{ count }} items\n </span>\n </a>\n </small>\n </h4>\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex\">\n <ng-container\n *ngFor=\"\n let bulkActionControl of bulkActionControls | visibleControls: selectedItemIds | async\n \"\n >\n <ng-container [ngSwitch]=\"bulkActionControl.type\">\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Export\"\n [actionData]=\"{ action: PX_ACTIONS.BULK_EXPORT }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"sign-out\"></i>\n <span>{{ 'Export' | translate }}</span>\n </button>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n [actionData]=\"{ action: PX_ACTIONS.BULK_DELETE }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"delete\"></i>\n <span>{{ 'Delete' | translate }}</span>\n </button>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ bulkActionControl.text | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchDefault\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CUSTOM_ACTION,\n customActionName: bulkActionControl.text\n }\"\n c8yProductExperience\n inherit\n >\n <i\n [class]=\"bulkActionControl.iconClasses\"\n c8yIcon=\"{{ bulkActionControl.icon }}\"\n ></i>\n <span>{{ bulkActionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancel()\"\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CANCEL\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"times\"></i>\n <span>{{ 'Cancel' | translate }}</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <table\n class=\"table table-filtered-sorted table-data-grid large-padding\"\n [class.table-striped]=\"displayOptions.striped\"\n [class.table-bordered]=\"displayOptions.bordered\"\n [class.table-hover]=\"displayOptions.hover\"\n [class.table-data-grid-with-checkboxes]=\"selectable\"\n [class.table-data-grid-with-actions]=\"actionControls.length > 0\"\n [style.grid-template-columns]=\"styles.gridTemplateColumns\"\n cdk-table\n [dataSource]=\"dataSource\"\n [multiTemplateDataRows]=\"true\"\n (mousemove)=\"resizeHandleContainerMouseMove$.emit($event)\"\n (mouseup)=\"resizeHandleContainerMouseUp$.emit($event)\"\n data-cy=\"c8y-data-grid--table\"\n >\n <ng-container\n *ngFor=\"let column of columns; let i = index; trackBy: trackByName\"\n [cdkColumnDef]=\"column.name\"\n >\n <ng-container [ngSwitch]=\"column.name\">\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n >\n <div>\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"currentPageSelectionState.allSelected\"\n [indeterminate]=\"\n !(\n currentPageSelectionState.allSelected ||\n currentPageSelectionState.allDeselected\n )\n \"\n (change)=\"setAllItemsInCurrentPageSelected($event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n />\n <span></span>\n </label>\n </div>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"setItemsSelected([row], $event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.SELECT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--checkbox\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'radio-button'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n ></th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <label class=\"c8y-radio\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n name=\"select-row\"\n type=\"radio\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"changeSelectedItem(row)\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.SELECT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--radio\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'actions'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n >\n <p class=\"text-medium sr-only\">{{ 'Actions' | translate }}</p>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <ng-container\n *ngFor=\"\n let actionControl of actionControls\n | visibleControls: row\n | async\n | slice: 0 : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2)\n \"\n >\n <ng-container [ngSwitch]=\"actionControl.type\">\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"'Edit' | translate\"\n tooltip=\"{{ 'Edit' | translate }}\"\n container=\"body\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n [delay]=\"500\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--edit-button-in-row\"\n >\n <i c8yIcon=\"pencil\"></i>\n </button>\n\n <button\n class=\"btn btn-dot btn-dot--danger showOnHover\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n data-cy=\"c8y-data-grid--remove-button-in-row\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"(actionControl.icon ? actionControl.text : '') | translate\"\n tooltip=\"{{ (actionControl.icon ? actionControl.text : '') | translate }}\"\n container=\"body\"\n type=\"button\"\n [ngClass]=\"{ showOnHover: actionControl.showOnHover }\"\n [delay]=\"500\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n [attr.data-cy]=\"'c8y-data-grid--button-in-row--' + actionControl.text\"\n >\n <i\n c8yIcon=\"{{ actionControl.icon }}\"\n [ngClass]=\"actionControl.iconClasses\"\n *ngIf=\"actionControl.icon\"\n ></i>\n <span *ngIf=\"!actionControl.icon\">{{ actionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <div\n [ngClass]=\"{\n 'm-l-auto overflow-visible':\n (actionControls | visibleControls: row | async)?.length > 2\n }\"\n >\n <div\n class=\"dropdown\"\n placement=\"bottom right\"\n container=\"body\"\n dropdown\n *ngIf=\"(actionControls | visibleControls: row | async)?.length > 2\"\n >\n <button\n class=\"dropdown-toggle c8y-dropdown\"\n title=\"{{ 'Actions' | translate }}\"\n aria-haspopup=\"true\"\n type=\"button\"\n data-cy=\"c8y-data-grid--row-actions-dropdown\"\n dropdownToggle\n >\n <i c8yIcon=\"ellipsis-v\"></i>\n </button>\n <ul\n class=\"dropdown-menu dropdown-menu-right\"\n *dropdownMenu\n >\n <li\n *ngFor=\"\n let actionControl of actionControls\n | visibleControls: row\n | async\n | slice\n : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2)\n \"\n >\n <ng-container [ngSwitch]=\"actionControl.type\">\n <button\n title=\"{{ 'Edit' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"pencil\"></i>\n {{ 'Edit' | translate }}\n </button>\n <button\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Delete' | translate }}\n </button>\n <button\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Export\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.EXPORT_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"data-export\"></i>\n {{ 'Export' | translate }}\n </button>\n <button\n title=\"{{ actionControl.text | translate }}\"\n type=\"button\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n >\n <i\n c8yIcon=\"{{ actionControl.icon }}\"\n [ngClass]=\"actionControl.iconClasses\"\n ></i>\n {{ actionControl.text | translate }}\n </button>\n </ng-container>\n </li>\n </ul>\n </div>\n </div>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <th\n [class.sorted]=\"column.sortOrder\"\n [class.filtered]=\"column | map: isColumnFilteringApplied\"\n [class.hidden]=\"!column.visible\"\n cdk-header-cell\n *cdkHeaderCellDef\n [ngClass]=\"column.headerCSSClassName\"\n [attr.data-type]=\"column.dataType\"\n >\n <div\n [title]=\"(column.header | translate) || column.name\"\n *ngIf=\"!column.filterable\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </div>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <div\n class=\"dropdown\"\n placement=\"bottom {{ isDropDownPlacedRight(column) ? 'right' : 'left' }}\"\n *ngIf=\"column.filterable\"\n dropdown\n #gridHeaderDropdown=\"bs-dropdown\"\n [cdkTrapFocus]=\"gridHeaderDropdown.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btn-header\"\n [title]=\"(column.header | translate) || column.name\"\n type=\"button\"\n [attr.data-cy]=\"'data-grid--header-btn--' + column.header\"\n dropdownToggle\n >\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer\n data-cy=\"c8y-data-grid--c8y-cell-renderer\"\n [spec]=\"cellRendererSpec\"\n ></c8y-cell-renderer>\n </ng-container>\n <i\n c8yIcon=\"filter\"\n title=\"{{ 'Filter' | translate }}\"\n ></i>\n </button>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <ul\n class=\"dropdown-menu\"\n *dropdownMenu\n [ngClass]=\"{ 'dropdown-menu-right-grid': isDropDownPlacedRight(column) }\"\n (click)=\"$event.stopPropagation()\"\n >\n <li class=\"data-grid__dropdown\">\n <ng-container\n *ngIf=\"\n [\n {\n column: column,\n dropdown: gridHeaderDropdown\n }\n ] | map: getFilteringFormRendererSpec : this as filteringFormRendererSpec\n \"\n >\n <c8y-filtering-form-renderer\n class=\"bg-component\"\n [spec]=\"filteringFormRendererSpec\"\n data-cy=\"c8y-data-grid--c8y-filtering-form-renderer\"\n ></c8y-filtering-form-renderer>\n </ng-container>\n </li>\n </ul>\n </div>\n\n <button\n class=\"btn-sort\"\n [style]=\"{ 'margin-left': !column.filterable && column.sortable ? '-20px' : null }\"\n [title]=\"sortColumnTitle | translate: { name: column.header | translate }\"\n type=\"button\"\n *ngIf=\"column.sortable\"\n (click)=\"changeSortOrder(column.name)\"\n data-cy=\"change-sort-order\"\n >\n <ng-container [ngSwitch]=\"column.sortOrder\">\n <i\n c8yIcon=\"long-arrow-up\"\n *ngSwitchCase=\"'asc'\"\n ></i>\n <i\n c8yIcon=\"long-arrow-down\"\n *ngSwitchCase=\"'desc'\"\n ></i>\n <i\n c8yIcon=\"exchange\"\n *ngSwitchDefault\n ></i>\n </ng-container>\n </button>\n\n <span\n class=\"resize-handle\"\n *ngIf=\"column.resizable\"\n (mousedown)=\"\n resizeHandleMouseDown$.emit({ event: $event, targetColumnName: column.name })\n \"\n ></span>\n </th>\n\n <td\n [class.hidden]=\"!column.visible\"\n [attr.data-cell-title]=\"column.header | translate\"\n cdk-cell\n *cdkCellDef=\"let row\"\n [ngClass]=\"column.cellCSSClassName\"\n [attr.data-cy]=\"'data-grid--' + column.header\"\n [attr.data-type]=\"column.dataType\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n value: resolveCellValue(row, column.path),\n row: row,\n columnName: column.name\n }\n ] | map: getCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </td>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container cdkColumnDef=\"infiniteScrollFooter\">\n <td\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-footer-cell\n *cdkFooterCellDef\n >\n <template #infiniteScrollContainer></template>\n </td>\n </ng-container>\n\n <tr\n cdk-header-row\n *cdkHeaderRowDef=\"columnNames\"\n ></tr>\n\n <tr\n data-cy=\"c8y-data-grid--row-in-data-grid\"\n cdk-row\n *cdkRowDef=\"let row; columns: columnNames; let idx = dataIndex\"\n [ngClass]=\"[\n activeClassName && row === lastClickedRow ? activeClassName : '',\n idx % 2 === 0 ? 'even' : 'odd'\n ]\"\n (mouseover)=\"rowMouseOver.emit(row)\"\n (mouseleave)=\"rowMouseLeave.emit(row)\"\n (click)=\"handleClick(row)\"\n ></tr>\n\n <tr\n class=\"expanded-row\"\n [ngClass]=\"{ hidden: !(expandedRows.get(row).visible$ | async) }\"\n data-cy=\"c8y-data-grid--expanded-row-in-data-grid\"\n cdk-row\n *cdkRowDef=\"let row; columns: ['expanded-row']; when: isRowExpanded\"\n ></tr>\n\n <ng-container cdkColumnDef=\"expanded-row\">\n <td\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-cell\n *cdkCellDef=\"let row\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n expandableRow?.template;\n context: {\n $implicit: row,\n asyncRenderSuccess: setExpandableRowVisible.bind(this, row, true),\n asyncRenderFail: setExpandableRowVisible.bind(this, row, false)\n }\n \"\n ></ng-container>\n </td>\n </ng-container>\n\n <ng-container>\n <tr\n [ngClass]=\"{ hidden: !infiniteScroll }\"\n cdk-footer-row\n *cdkFooterRowDef=\"['infiniteScrollFooter']\"\n ></tr>\n </ng-container>\n </table>\n\n <div\n class=\"d-flex m-0 p-t-40 p-b-40\"\n *ngIf=\"\n !(dataSource.loading$ | async) &&\n ((dataSource.stats$ | async).filteredSize === 0 || (dataSource.data$ | async).length === 0)\n \"\n >\n <div class=\"col-lg-3 col-sm-4 m-l-auto m-r-auto\">\n <ng-content select=\"c8y-ui-empty-state, .c8y-empty-state\"></ng-content>\n <ng-container\n *ngTemplateOutlet=\"\n emptyState?.templateRef;\n context: { $implicit: emptyStateContext$ | async }\n \"\n ></ng-container>\n </div>\n </div>\n\n <div\n class=\"table-data-grid-footer separator large-padding\"\n *ngIf=\"pagination && !infiniteScroll\"\n >\n <div class=\"col-sm-4 no-gutter\">\n <div\n class=\"counter p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).currentPageSize > 0\"\n data-cy=\"data-grid--counter\"\n >\n <span\n class=\"text-muted\"\n ngNonBindable\n translate\n [translateParams]=\"paginationLabelParams\"\n >\n {{ pageFirstItemIdx }} - {{ pageLastItemIdx }} of {{ itemsTotal }}\n </span>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-center\">\n <div\n class=\"form-group form-inline p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).filteredSize > minPossiblePageSize\"\n >\n <label\n class=\"m-r-4\"\n for=\"filteredSize\"\n >\n {{ 'Items per page' | translate }}\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"filteredSize\"\n data-cy=\"data-grid--pagesize-options\"\n [ngModel]=\"pagination.pageSize\"\n (ngModelChange)=\"\n updatePagination({ itemsPerPage: $event, page: pagination.currentPage })\n \"\n >\n <option\n *ngFor=\"let pageSize of possiblePageSizes\"\n [ngValue]=\"pageSize\"\n >\n {{ pageSize }}\n </option>\n </select>\n </div>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-right\">\n <pagination\n [class.hidden]=\"hidePagination$ | async\"\n class=\"p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).filteredSize > 0\"\n [ngModel]=\"pagination.currentPage\"\n (pageChanged)=\"updatePagination($event)\"\n [totalItems]=\"(dataSource.stats$ | async).filteredSize\"\n [itemsPerPage]=\"pagination.pageSize\"\n (numPages)=\"totalPagesCount$.next($event)\"\n [maxSize]=\"5\"\n [boundaryLinks]=\"false\"\n previousText=\"Previous\"\n nextText=\"Next\"\n ></pagination>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i8.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i8.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i8.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i8.NgPlural, selector: "[ngPlural]", inputs: ["ngPlural"] }, { kind: "directive", type: i8.NgPluralCase, selector: "[ngPluralCase]" }, { kind: "component", type: i9.CdkTable, selector: "cdk-table, table[cdk-table]", inputs: ["trackBy", "dataSource", "multiTemplateDataRows", "fixedLayout"], outputs: ["contentChanged"], exportAs: ["cdkTable"] }, { kind: "directive", type: i9.CdkRowDef, selector: "[cdkRowDef]", inputs: ["cdkRowDefColumns", "cdkRowDefWhen"] }, { kind: "directive", type: i9.CdkCellDef, selector: "[cdkCellDef]" }, { kind: "directive", type: i9.CdkHeaderCellDef, selector: "[cdkHeaderCellDef]" }, { kind: "directive", type: i9.CdkFooterCellDef, selector: "[cdkFooterCellDef]" }, { kind: "directive", type: i9.CdkColumnDef, selector: "[cdkColumnDef]", inputs: ["cdkColumnDef", "sticky", "stickyEnd"] }, { kind: "directive", type: i9.CdkCell, selector: "cdk-cell, td[cdk-cell]" }, { kind: "component", type: i9.CdkRow, selector: "cdk-row, tr[cdk-row]" }, { kind: "directive", type: i9.CdkHeaderCell, selector: "cdk-header-cell, th[cdk-header-cell]" }, { kind: "directive", type: i9.CdkFooterCell, selector: "cdk-footer-cell, td[cdk-footer-cell]" }, { kind: "component", type: i9.CdkHeaderRow, selector: "cdk-header-row, tr[cdk-header-row]" }, { kind: "directive", type: i9.CdkHeaderRowDef, selector: "[cdkHeaderRowDef]", inputs: ["cdkHeaderRowDef", "cdkHeaderRowDefSticky"] }, { kind: "component", type: i9.CdkFooterRow, selector: "cdk-footer-row, tr[cdk-footer-row]" }, { kind: "directive", type: i9.CdkFooterRowDef, selector: "[cdkFooterRowDef]", inputs: ["cdkFooterRowDef", "cdkFooterRowDefSticky"] }, { kind: "directive", type: i10.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i10.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i11.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i11.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i11.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: i11.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i11.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i11.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i11.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i12.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i13.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "component", type: i14.LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "component", type: i15.PopoverConfirmComponent, selector: "c8y-popover-confirm", inputs: ["buttons", "message", "title", "isOpen", "containerClass", "placement", "outsideClick", "adaptivePosition", "container"] }, { kind: "directive", type: i16.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i16.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i16.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "directive", type: i17.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "directive", type: i18.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "component", type: i19.PaginationComponent, selector: "pagination", inputs: ["align", "maxSize", "boundaryLinks", "directionLinks", "firstText", "previousText", "nextText", "lastText", "rotate", "pageBtnClass", "disabled", "customPageTemplate", "customNextTemplate", "customPreviousTemplate", "customFirstTemplate", "customLastTemplate", "itemsPerPage", "totalItems"], outputs: ["numPages", "pageChanged"] }, { kind: "directive", type: i20.ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit", "suppressDataOverriding"] }, { kind: "directive", type: i21.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: i22.CellRendererComponent, selector: "c8y-cell-renderer", inputs: ["spec"] }, { kind: "component", type: i23.FilteringFormRendererComponent, selector: "c8y-filtering-form-renderer", inputs: ["spec"] }, { kind: "pipe", type: i8.AsyncPipe, name: "async" }, { kind: "pipe", type: i8.SlicePipe, name: "slice" }, { kind: "pipe", type: i24.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i25.MapFunctionPipe, name: "map" }, { kind: "pipe", type: i26.FilterMapperPipe, name: "mapToFilterChips" }, { kind: "pipe", type: i27.GroupedFilterChips, name: "groupedFilterChips" }, { kind: "pipe", type: i28.VisibleControlsPipe, name: "visibleControls" }] }); }
1095
+ ], queries: [{ propertyName: "expandableRow", first: true, predicate: ExpandableRowDirective, descendants: true }, { propertyName: "emptyState", first: true, predicate: EmptyStateContextDirective, descendants: true }, { propertyName: "columnRenderers", predicate: ColumnDirective }], viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scroll"], descendants: true, static: true }, { propertyName: "infiniteScrollContainer", first: true, predicate: ["infiniteScrollContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "tableRef", first: true, predicate: CdkTable, descendants: true }, { propertyName: "thRefs", predicate: CdkHeaderCell, descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"table-data-grid-scroll\"\n #scroll\n [ngClass]=\"{\n 'table-data-grid__overlay': (dataSource.loading$ | async) && !loadMoreComponent?.isLoading\n }\"\n data-cy=\"c8y-data-grid--table-data-grid-scroll\"\n>\n <div\n class=\"table-data-grid__loading--wrapper\"\n *ngIf=\"(dataSource.loading$ | async) && !loadMoreComponent?.isLoading\"\n >\n <div class=\"table-data-grid__loading--loader\">\n <c8y-loading\n layout=\"application\"\n [message]=\"loadingItemsLabel\"\n ></c8y-loading>\n </div>\n </div>\n\n <div\n class=\"table-data-grid-header separator large-padding\"\n *ngIf=\"displayOptions.gridHeader\"\n >\n <div\n class=\"h4\"\n [ngClass]=\"{ 'm-r-16': !!title }\"\n >\n {{ title | translate }}\n </div>\n\n <ng-container *ngIf=\"displayOptions.filter\">\n <span *ngIf=\"!filteringApplied\">\n <small\n class=\"m-r-4\"\n *ngIf=\"!!filteringLabelsParams.allItemsCount\"\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n {{ filteredItemsCount }} of {{ allItemsCount }} items\n </small>\n <span\n class=\"label label-default m-r-4\"\n translate\n >\n No filters\n </span>\n </span>\n <span\n class=\"d-flex a-i-center\"\n *ngIf=\"filteringApplied\"\n >\n <ng-container *ngIf=\"!!filteringLabelsParams.allItemsCount\">\n <div class=\"a-i-center\">\n <span class=\"badge badge-info m-r-4\">\n {{ (dataSource.stats$ | async).filteredSize }}\n </span>\n <small\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n of {{ allItemsCount }} items\n </small>\n </div>\n </ng-container>\n <div\n class=\"dropdown\"\n placement=\"bottom left\"\n dropdown\n #ddFilters=\"bs-dropdown\"\n [cdkTrapFocus]=\"ddFilters.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btn btn-default btn-sm m-l-8\"\n title=\"{{ 'Active filters' | translate }}\"\n aria-haspopup=\"true\"\n dropdownToggle\n data-cy=\"c8y-data-grid--filters\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"filter\"\n ></i>\n <span>{{ 'Active filters' | translate }}</span>\n <span class=\"badge badge-system\">\n {{ columnsWithFiltersApplied.length }}\n </span>\n </button>\n\n <div\n class=\"dropdown-menu\"\n *dropdownMenu\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"data-grid__dropdown bg-level-0\">\n <ul class=\"list-unstyled m-0\">\n <li\n *ngFor=\"let column of columnsWithFiltersApplied; let last = last\"\n [ngClass]=\"{ 'separator-bottom': !last }\"\n >\n <ng-container>\n <div\n class=\"dropdown-header sticky-top text-truncate no-border-top p-b-0\"\n title=\"{{ (column.header | translate) || column.name }}\"\n >\n <label>\n {{ (column.header | translate) || column.name }}\n </label>\n </div>\n <div\n class=\"list-group-item borderless d-flex d-col\"\n *ngFor=\"\n let groupedFilterChips of column\n | mapToFilterChips\n | async\n | groupedFilterChips;\n let first = first\n \"\n [ngClass]=\"{ 'p-t-0': first }\"\n >\n <p\n class=\"small p-b-4\"\n *ngIf=\"groupedFilterChips.label\"\n >\n {{ groupedFilterChips.label | translate }}\n </p>\n <div class=\"d-flex a-i-center gap-4 flex-wrap\">\n <span\n class=\"tag tag--info chip\"\n *ngFor=\"let chip of groupedFilterChips.chips\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10 m-r-4\"\n title=\"{{ 'Remove filter' | translate }}\"\n (click)=\"removeFilter(chip.remove())\"\n data-cy=\"c8y-data-grid--remove-chip\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n {{ chip.displayValue | translate }}\n </span>\n </div>\n </div>\n </ng-container>\n </li>\n </ul>\n </div>\n <div class=\"list-group-item separator-top sticky-bottom\">\n <button\n class=\"btn btn-sm btn-default\"\n title=\"{{ 'Clear all filters' | translate }}\"\n type=\"button\"\n (click)=\"clearFilters()\"\n data-cy=\"c8y-data-grid--clear-filters\"\n >\n {{ 'Clear all filters' | translate }}\n </button>\n </div>\n </div>\n </div>\n </span>\n\n <button\n class=\"btn-help btn-help--sm hidden-xs hidden-sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"filtersHelpPopover\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"displayOptions.filter\"\n data-cy=\"data-grid--help-filters\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n <ng-template #filtersHelpPopover>\n <div [innerHtml]=\"filtersHelpPopoverHtml | translate\"></div>\n </ng-template>\n\n <button\n class=\"btn-clean text-primary hidden-xs hidden-sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ 'The counter for the total number of items might be inaccurate.' | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"showCounterWarning\"\n >\n <i c8yIcon=\"warning\"></i>\n </button>\n </ng-container>\n\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex a-i-center\">\n <ng-container\n *ngFor=\"let headerActionControl of headerActionControls | visibleControls | async\"\n >\n <ng-container *ngIf=\"!headerActionControl.template; else customTemplate\">\n <button\n class=\"btnbar-btn btn-link\"\n title=\"{{ headerActionControl.text | translate }}\"\n type=\"button\"\n (click)=\"headerActionControl.callback()\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION,\n customActionName: headerActionControl.text,\n type: headerActionControl.type\n }\"\n >\n <i\n class=\"m-r-4\"\n [c8yIcon]=\"headerActionControl.icon\"\n ></i>\n <span>{{ headerActionControl.text | translate }}</span>\n </button>\n </ng-container>\n <ng-template #customTemplate>\n <ng-container\n *ngTemplateOutlet=\"\n headerActionControl.template;\n context: { headerActionControl: headerActionControl }\n \"\n ></ng-container>\n </ng-template>\n </ng-container>\n\n <div\n class=\"dropdown\"\n placement=\"bottom left\"\n *ngIf=\"configureColumnsEnabled\"\n dropdown\n #ddConfigureColumns=\"bs-dropdown\"\n [cdkTrapFocus]=\"ddConfigureColumns.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Configure columns' | translate }}\"\n type=\"button\"\n data-cy=\"data-grid--custom-column-btn\"\n dropdownToggle\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"columns\"\n ></i>\n <span>{{ 'Configure columns' | translate }}</span>\n </button>\n\n <ul\n class=\"dropdown-menu data-grid__dropdown\"\n *dropdownMenu\n (click)=\"$event.stopPropagation()\"\n >\n <li>\n <div\n class=\"list-group m-0\"\n cdkDropList\n (cdkDropListDropped)=\"onColumnDrop($event)\"\n >\n <div\n *ngFor=\"let column of columns\"\n cdkDrag\n cdkDragLockAxis=\"y\"\n >\n <ng-container *ngIf=\"!column.positionFixed\">\n <div class=\"list-group-item draggable-after p-0 a-i-center\">\n <label\n class=\"c8y-checkbox p-l-16\"\n title=\"{{ (column.header | translate) || column.name }}\"\n [attr.data-cy]=\"'data-grid--custom-column-header-' + column.header\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"column.visible\"\n (change)=\"\n updateGridColumnsSize(); emitConfigChange('changeColumnVisibility')\n \"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CHANGE_VISIBILITY,\n column: column.name,\n visible: !column.visible\n }\"\n />\n <span></span>\n <span>{{ (column.header | translate) || column.name }}</span>\n </label>\n <button\n class=\"btn btn-dot showOnHover max-width-fit a-i-center\"\n [attr.aria-label]=\"'Remove`column,verb`' | translate\"\n tooltip=\"{{ 'Remove`column,verb`' | translate }}\"\n placement=\"left\"\n container=\"body\"\n type=\"button\"\n (click)=\"removeCustomColumn(poConfirm, column, ddConfigureColumns)\"\n *ngIf=\"column.custom\"\n >\n <c8y-popover-confirm\n [title]=\"'Confirm removal' | translate\"\n triggers=\"focus\"\n [placement]=\"'left'\"\n #poConfirm\n ></c8y-popover-confirm>\n <i\n c8yIcon=\"minus-circle\"\n data-cy=\"data-grid--custom-column-remove-btn\"\n ></i>\n </button>\n </div>\n </ng-container>\n </div>\n </div>\n </li>\n <li\n class=\"p-8 sticky-bottom separator-top\"\n *ngIf=\"isConfigContextKnown\"\n >\n <button\n class=\"btn btn-default btn-block\"\n title=\"{{ 'Add custom column' | translate }}\"\n type=\"button\"\n data-cy=\"data-grid--add-custom-column\"\n (click)=\"openCustomColumn(); ddConfigureColumns.hide()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"plus-circle\"\n ></i>\n <span>{{ 'Add custom column' | translate }}</span>\n </button>\n </li>\n </ul>\n </div>\n\n <button\n class=\"btnbar-btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n *ngIf=\"!hideReload\"\n data-cy=\"data-grid--reload-btn\"\n [disabled]=\"dataSource.loading$ | async\"\n (click)=\"clickReload()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"refresh\"\n ></i>\n <span>{{ 'Reload' | translate }}</span>\n </button>\n\n <div\n class=\"input-group input-group-search m-l-sm-16 data-grid__search-input\"\n *ngIf=\"!serverSideDataCallback || showSearch\"\n >\n <input\n class=\"form-control\"\n placeholder=\"{{ 'Search\u2026' | translate }}\"\n type=\"search\"\n [(ngModel)]=\"searchText\"\n (ngModelChange)=\"searchText$.emit($event)\"\n (keydown.enter)=\"$event.stopPropagation(); performSearch(searchText)\"\n />\n <div class=\"input-group-addon\">\n <i\n c8yIcon=\"search\"\n *ngIf=\"searchText.length === 0\"\n ></i>\n <i\n class=\"pointer\"\n c8yIcon=\"times\"\n *ngIf=\"searchText.length > 0\"\n (click)=\"searchText = ''; searchText$.emit('')\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.CLEAR_SEARCH }\"\n ></i>\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"table-data-grid-header-bulk-actions animated slideInDown fast\"\n data-cy=\"table-data-grid-header-bulk-actions\"\n *ngIf=\"selectedItemIds.length !== 0\"\n >\n <h4>\n <ng-container [ngPlural]=\"selectedItemIds.length\">\n <ng-template ngPluralCase=\"=1\">\n <span translate>1 selected item.</span>\n </ng-template>\n <ng-template ngPluralCase=\"other\">\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: selectedItemIds.length }\"\n >\n {{ count }} selected items.\n </span>\n </ng-template>\n </ng-container>\n <br class=\"visible-xs\" />\n <small *ngIf=\"!serverSideDataCallback && selectedItemIds.length >= pagination.pageSize\">\n <a\n class=\"interact\"\n (click)=\"setAllItemsSelected(true)\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n >\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: (dataSource.stats$ | async).filteredSize }\"\n >\n Select all {{ count }} items\n </span>\n </a>\n </small>\n </h4>\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex\">\n <ng-container\n *ngFor=\"\n let bulkActionControl of bulkActionControls | visibleControls: selectedItemIds | async\n \"\n >\n <ng-container [ngSwitch]=\"bulkActionControl.type\">\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Export\"\n [actionData]=\"{ action: PX_ACTIONS.BULK_EXPORT }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"sign-out\"></i>\n <span>{{ 'Export' | translate }}</span>\n </button>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n [actionData]=\"{ action: PX_ACTIONS.BULK_DELETE }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"delete\"></i>\n <span>{{ 'Delete' | translate }}</span>\n </button>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ bulkActionControl.text | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchDefault\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CUSTOM_ACTION,\n customActionName: bulkActionControl.text\n }\"\n c8yProductExperience\n inherit\n >\n <i\n [class]=\"bulkActionControl.iconClasses\"\n c8yIcon=\"{{ bulkActionControl.icon }}\"\n ></i>\n <span>{{ bulkActionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancel()\"\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CANCEL\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"times\"></i>\n <span>{{ 'Cancel' | translate }}</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <table\n class=\"table table-filtered-sorted table-data-grid large-padding\"\n [class.table-striped]=\"displayOptions.striped\"\n [class.table-bordered]=\"displayOptions.bordered\"\n [class.table-hover]=\"displayOptions.hover\"\n [class.table-data-grid-with-checkboxes]=\"selectable\"\n [class.table-data-grid-with-actions]=\"actionControls.length > 0\"\n [style.grid-template-columns]=\"styles.gridTemplateColumns\"\n cdk-table\n [dataSource]=\"dataSource\"\n [multiTemplateDataRows]=\"true\"\n (mousemove)=\"resizeHandleContainerMouseMove$.emit($event)\"\n (mouseup)=\"resizeHandleContainerMouseUp$.emit($event)\"\n data-cy=\"c8y-data-grid--table\"\n >\n <ng-container\n *ngFor=\"let column of columns; let i = index; trackBy: trackByName\"\n [cdkColumnDef]=\"column.name\"\n >\n <ng-container [ngSwitch]=\"column.name\">\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n >\n <div>\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"currentPageSelectionState.allSelected\"\n [indeterminate]=\"\n !(\n currentPageSelectionState.allSelected ||\n currentPageSelectionState.allDeselected\n )\n \"\n (change)=\"setAllItemsInCurrentPageSelected($event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n />\n <span></span>\n </label>\n </div>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"setItemsSelected([row], $event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.SELECT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--checkbox\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'radio-button'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n ></th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <label class=\"c8y-radio\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n name=\"select-row\"\n type=\"radio\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"changeSelectedItem(row)\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.SELECT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--radio\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'actions'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n >\n <p class=\"text-medium sr-only\">{{ 'Actions' | translate }}</p>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <ng-container\n *ngFor=\"\n let actionControl of actionControls\n | visibleControls: row\n | async\n | slice: 0 : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2)\n \"\n >\n <ng-container [ngSwitch]=\"actionControl.type\">\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"'Edit' | translate\"\n tooltip=\"{{ 'Edit' | translate }}\"\n container=\"body\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n [delay]=\"500\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--edit-button-in-row\"\n >\n <i c8yIcon=\"pencil\"></i>\n </button>\n\n <button\n class=\"btn btn-dot btn-dot--danger showOnHover\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n data-cy=\"c8y-data-grid--remove-button-in-row\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"(actionControl.icon ? actionControl.text : '') | translate\"\n tooltip=\"{{ (actionControl.icon ? actionControl.text : '') | translate }}\"\n container=\"body\"\n type=\"button\"\n [ngClass]=\"{ showOnHover: actionControl.showOnHover }\"\n [delay]=\"500\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n [attr.data-cy]=\"'c8y-data-grid--button-in-row--' + actionControl.text\"\n >\n <i\n c8yIcon=\"{{ actionControl.icon }}\"\n [ngClass]=\"actionControl.iconClasses\"\n *ngIf=\"actionControl.icon\"\n ></i>\n <span *ngIf=\"!actionControl.icon\">{{ actionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <div\n [ngClass]=\"{\n 'm-l-auto overflow-visible':\n (actionControls | visibleControls: row | async)?.length > 2\n }\"\n >\n <div\n class=\"dropdown\"\n placement=\"bottom right\"\n container=\"body\"\n dropdown\n *ngIf=\"(actionControls | visibleControls: row | async)?.length > 2\"\n >\n <button\n class=\"dropdown-toggle c8y-dropdown\"\n title=\"{{ 'Actions' | translate }}\"\n aria-haspopup=\"true\"\n type=\"button\"\n data-cy=\"c8y-data-grid--row-actions-dropdown\"\n dropdownToggle\n >\n <i c8yIcon=\"ellipsis-v\"></i>\n </button>\n <ul\n class=\"dropdown-menu dropdown-menu-right\"\n *dropdownMenu\n >\n <li\n *ngFor=\"\n let actionControl of actionControls\n | visibleControls: row\n | async\n | slice\n : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2)\n \"\n >\n <ng-container [ngSwitch]=\"actionControl.type\">\n <button\n title=\"{{ 'Edit' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"pencil\"></i>\n {{ 'Edit' | translate }}\n </button>\n <button\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Delete' | translate }}\n </button>\n <button\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Export\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.EXPORT_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"data-export\"></i>\n {{ 'Export' | translate }}\n </button>\n <button\n title=\"{{ actionControl.text | translate }}\"\n type=\"button\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n >\n <i\n c8yIcon=\"{{ actionControl.icon }}\"\n [ngClass]=\"actionControl.iconClasses\"\n ></i>\n {{ actionControl.text | translate }}\n </button>\n </ng-container>\n </li>\n </ul>\n </div>\n </div>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <th\n [class.sorted]=\"column.sortOrder\"\n [class.filtered]=\"column | map: isColumnFilteringApplied\"\n [class.hidden]=\"!column.visible\"\n cdk-header-cell\n *cdkHeaderCellDef\n [ngClass]=\"column.headerCSSClassName\"\n [attr.data-type]=\"column.dataType\"\n >\n <div\n [title]=\"(column.header | translate) || column.name\"\n *ngIf=\"!column.filterable\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </div>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <div\n class=\"dropdown\"\n placement=\"bottom {{ isDropDownPlacedRight(column) ? 'right' : 'left' }}\"\n *ngIf=\"column.filterable\"\n dropdown\n #gridHeaderDropdown=\"bs-dropdown\"\n [cdkTrapFocus]=\"gridHeaderDropdown.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btn-header\"\n [title]=\"(column.header | translate) || column.name\"\n type=\"button\"\n [attr.data-cy]=\"'data-grid--header-btn--' + column.header\"\n dropdownToggle\n >\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer\n data-cy=\"c8y-data-grid--c8y-cell-renderer\"\n [spec]=\"cellRendererSpec\"\n ></c8y-cell-renderer>\n </ng-container>\n <i\n c8yIcon=\"filter\"\n title=\"{{ 'Filter' | translate }}\"\n ></i>\n </button>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <ul\n class=\"dropdown-menu\"\n *dropdownMenu\n [ngClass]=\"{ 'dropdown-menu-right-grid': isDropDownPlacedRight(column) }\"\n (click)=\"$event.stopPropagation()\"\n >\n <li class=\"data-grid__dropdown\">\n <ng-container\n *ngIf=\"\n [\n {\n column: column,\n dropdown: gridHeaderDropdown\n }\n ] | map: getFilteringFormRendererSpec : this as filteringFormRendererSpec\n \"\n >\n <c8y-filtering-form-renderer\n class=\"bg-component\"\n [spec]=\"filteringFormRendererSpec\"\n data-cy=\"c8y-data-grid--c8y-filtering-form-renderer\"\n ></c8y-filtering-form-renderer>\n </ng-container>\n </li>\n </ul>\n </div>\n\n <button\n class=\"btn-sort\"\n [style]=\"{ 'margin-left': !column.filterable && column.sortable ? '-20px' : null }\"\n [title]=\"sortColumnTitle | translate: { name: column.header | translate }\"\n type=\"button\"\n *ngIf=\"column.sortable\"\n (click)=\"changeSortOrder(column.name)\"\n data-cy=\"change-sort-order\"\n >\n <ng-container [ngSwitch]=\"column.sortOrder\">\n <i\n c8yIcon=\"long-arrow-up\"\n *ngSwitchCase=\"'asc'\"\n ></i>\n <i\n c8yIcon=\"long-arrow-down\"\n *ngSwitchCase=\"'desc'\"\n ></i>\n <i\n c8yIcon=\"exchange\"\n *ngSwitchDefault\n ></i>\n </ng-container>\n </button>\n\n <span\n class=\"resize-handle\"\n *ngIf=\"column.resizable\"\n (mousedown)=\"\n resizeHandleMouseDown$.emit({ event: $event, targetColumnName: column.name })\n \"\n ></span>\n </th>\n\n <td\n [class.hidden]=\"!column.visible\"\n [attr.data-cell-title]=\"column.header | translate\"\n cdk-cell\n *cdkCellDef=\"let row\"\n [ngClass]=\"column.cellCSSClassName\"\n [attr.data-cy]=\"'data-grid--' + column.header\"\n [attr.data-type]=\"column.dataType\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n value: resolveCellValue(row, column.path),\n row: row,\n columnName: column.name\n }\n ] | map: getCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </td>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container cdkColumnDef=\"infiniteScrollFooter\">\n <td\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-footer-cell\n *cdkFooterCellDef\n >\n <template #infiniteScrollContainer></template>\n </td>\n </ng-container>\n\n <tr\n cdk-header-row\n *cdkHeaderRowDef=\"columnNames\"\n ></tr>\n\n <tr\n data-cy=\"c8y-data-grid--row-in-data-grid\"\n cdk-row\n *cdkRowDef=\"let row; columns: columnNames; let idx = dataIndex\"\n [ngClass]=\"[\n activeClassName && row === lastClickedRow ? activeClassName : '',\n idx % 2 === 0 ? 'even' : 'odd'\n ]\"\n (mouseover)=\"rowMouseOver.emit(row)\"\n (mouseleave)=\"rowMouseLeave.emit(row)\"\n (click)=\"handleClick(row)\"\n ></tr>\n\n <tr\n class=\"expanded-row\"\n [ngClass]=\"{ hidden: !(expandedRows.get(row).visible$ | async) }\"\n data-cy=\"c8y-data-grid--expanded-row-in-data-grid\"\n cdk-row\n *cdkRowDef=\"let row; columns: ['expanded-row']; when: isRowExpanded\"\n ></tr>\n\n <ng-container cdkColumnDef=\"expanded-row\">\n <td\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-cell\n *cdkCellDef=\"let row\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n expandableRow?.template;\n context: {\n $implicit: row,\n asyncRenderSuccess: setExpandableRowVisible.bind(this, row, true),\n asyncRenderFail: setExpandableRowVisible.bind(this, row, false)\n }\n \"\n ></ng-container>\n </td>\n </ng-container>\n\n <ng-container>\n <tr\n [ngClass]=\"{ hidden: !infiniteScroll }\"\n cdk-footer-row\n *cdkFooterRowDef=\"['infiniteScrollFooter']\"\n ></tr>\n </ng-container>\n </table>\n\n <div\n class=\"d-flex m-0 p-t-40 p-b-40\"\n *ngIf=\"\n !(dataSource.loading$ | async) &&\n ((dataSource.stats$ | async).filteredSize === 0 || (dataSource.data$ | async).length === 0)\n \"\n >\n <div class=\"col-lg-3 col-sm-4 m-l-auto m-r-auto\">\n <ng-content select=\"c8y-ui-empty-state, .c8y-empty-state\"></ng-content>\n <ng-container\n *ngTemplateOutlet=\"\n emptyState?.templateRef;\n context: { $implicit: emptyStateContext$ | async }\n \"\n ></ng-container>\n </div>\n </div>\n\n <div\n class=\"table-data-grid-footer separator large-padding\"\n *ngIf=\"pagination && !infiniteScroll\"\n >\n <div class=\"col-sm-4 no-gutter\">\n <div\n class=\"counter p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).currentPageSize > 0\"\n data-cy=\"data-grid--counter\"\n >\n <span\n class=\"text-muted\"\n ngNonBindable\n translate\n [translateParams]=\"paginationLabelParams\"\n >\n {{ pageFirstItemIdx }} - {{ pageLastItemIdx }} of {{ itemsTotal }}\n </span>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-center\">\n <div\n class=\"form-group form-inline p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).filteredSize > minPossiblePageSize\"\n >\n <label\n class=\"m-r-4\"\n for=\"filteredSize\"\n >\n {{ 'Items per page' | translate }}\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"filteredSize\"\n data-cy=\"data-grid--pagesize-options\"\n [ngModel]=\"pagination.pageSize\"\n (ngModelChange)=\"\n updatePagination({ itemsPerPage: $event, page: pagination.currentPage })\n \"\n >\n <option\n *ngFor=\"let pageSize of possiblePageSizes\"\n [ngValue]=\"pageSize\"\n >\n {{ pageSize }}\n </option>\n </select>\n </div>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-right\">\n <pagination\n [class.hidden]=\"hidePagination$ | async\"\n class=\"p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).filteredSize > 0\"\n [ngModel]=\"pagination.currentPage\"\n (pageChanged)=\"updatePagination($event)\"\n [totalItems]=\"(dataSource.stats$ | async).filteredSize\"\n [itemsPerPage]=\"pagination.pageSize\"\n (numPages)=\"totalPagesCount$.next($event)\"\n [maxSize]=\"5\"\n [boundaryLinks]=\"false\"\n previousText=\"Previous\"\n nextText=\"Next\"\n ></pagination>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i7.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i7.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i7.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i7.NgPlural, selector: "[ngPlural]", inputs: ["ngPlural"] }, { kind: "directive", type: i7.NgPluralCase, selector: "[ngPluralCase]" }, { kind: "component", type: i8.CdkTable, selector: "cdk-table, table[cdk-table]", inputs: ["trackBy", "dataSource", "multiTemplateDataRows", "fixedLayout"], outputs: ["contentChanged"], exportAs: ["cdkTable"] }, { kind: "directive", type: i8.CdkRowDef, selector: "[cdkRowDef]", inputs: ["cdkRowDefColumns", "cdkRowDefWhen"] }, { kind: "directive", type: i8.CdkCellDef, selector: "[cdkCellDef]" }, { kind: "directive", type: i8.CdkHeaderCellDef, selector: "[cdkHeaderCellDef]" }, { kind: "directive", type: i8.CdkFooterCellDef, selector: "[cdkFooterCellDef]" }, { kind: "directive", type: i8.CdkColumnDef, selector: "[cdkColumnDef]", inputs: ["cdkColumnDef", "sticky", "stickyEnd"] }, { kind: "directive", type: i8.CdkCell, selector: "cdk-cell, td[cdk-cell]" }, { kind: "component", type: i8.CdkRow, selector: "cdk-row, tr[cdk-row]" }, { kind: "directive", type: i8.CdkHeaderCell, selector: "cdk-header-cell, th[cdk-header-cell]" }, { kind: "directive", type: i8.CdkFooterCell, selector: "cdk-footer-cell, td[cdk-footer-cell]" }, { kind: "component", type: i8.CdkHeaderRow, selector: "cdk-header-row, tr[cdk-header-row]" }, { kind: "directive", type: i8.CdkHeaderRowDef, selector: "[cdkHeaderRowDef]", inputs: ["cdkHeaderRowDef", "cdkHeaderRowDefSticky"] }, { kind: "component", type: i8.CdkFooterRow, selector: "cdk-footer-row, tr[cdk-footer-row]" }, { kind: "directive", type: i8.CdkFooterRowDef, selector: "[cdkFooterRowDef]", inputs: ["cdkFooterRowDef", "cdkFooterRowDefSticky"] }, { kind: "directive", type: i9.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i9.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i10.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i10.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i10.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: i10.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i10.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i11.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i12.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "component", type: i13.LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "component", type: i14.PopoverConfirmComponent, selector: "c8y-popover-confirm", inputs: ["buttons", "message", "title", "isOpen", "containerClass", "placement", "outsideClick", "adaptivePosition", "container"] }, { kind: "directive", type: i15.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i15.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i15.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "directive", type: i16.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "directive", type: i17.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "component", type: i18.PaginationComponent, selector: "pagination", inputs: ["align", "maxSize", "boundaryLinks", "directionLinks", "firstText", "previousText", "nextText", "lastText", "rotate", "pageBtnClass", "disabled", "customPageTemplate", "customNextTemplate", "customPreviousTemplate", "customFirstTemplate", "customLastTemplate", "itemsPerPage", "totalItems"], outputs: ["numPages", "pageChanged"] }, { kind: "directive", type: i19.ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit", "suppressDataOverriding"] }, { kind: "directive", type: i20.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: i21.CellRendererComponent, selector: "c8y-cell-renderer", inputs: ["spec"] }, { kind: "component", type: i22.FilteringFormRendererComponent, selector: "c8y-filtering-form-renderer", inputs: ["spec"] }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }, { kind: "pipe", type: i7.SlicePipe, name: "slice" }, { kind: "pipe", type: i23.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i24.MapFunctionPipe, name: "map" }, { kind: "pipe", type: i25.FilterMapperPipe, name: "mapToFilterChips" }, { kind: "pipe", type: i26.GroupedFilterChips, name: "groupedFilterChips" }, { kind: "pipe", type: i27.VisibleControlsPipe, name: "visibleControls" }] }); }
1107
1096
  }
1108
1097
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataGridComponent, decorators: [{
1109
1098
  type: Component,
@@ -1112,13 +1101,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
1112
1101
  provide: PRODUCT_EXPERIENCE_EVENT_SOURCE,
1113
1102
  useExisting: forwardRef(() => DataGridComponent)
1114
1103
  }
1115
- ], template: "<div\n class=\"table-data-grid-scroll\"\n #scroll\n [ngClass]=\"{\n 'table-data-grid__overlay': (dataSource.loading$ | async) && !loadMoreComponent?.isLoading\n }\"\n data-cy=\"c8y-data-grid--table-data-grid-scroll\"\n>\n <div\n class=\"table-data-grid__loading--wrapper\"\n *ngIf=\"(dataSource.loading$ | async) && !loadMoreComponent?.isLoading\"\n >\n <div class=\"table-data-grid__loading--loader\">\n <c8y-loading\n layout=\"application\"\n [message]=\"loadingItemsLabel\"\n ></c8y-loading>\n </div>\n </div>\n\n <div\n class=\"table-data-grid-header separator large-padding\"\n *ngIf=\"displayOptions.gridHeader\"\n >\n <div\n class=\"h4\"\n [ngClass]=\"{ 'm-r-16': !!title }\"\n >\n {{ title | translate }}\n </div>\n\n <ng-container *ngIf=\"displayOptions.filter\">\n <span *ngIf=\"!filteringApplied\">\n <small\n class=\"m-r-4\"\n *ngIf=\"!!filteringLabelsParams.allItemsCount\"\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n {{ filteredItemsCount }} of {{ allItemsCount }} items\n </small>\n <span\n class=\"label label-default m-r-4\"\n translate\n >\n No filters\n </span>\n </span>\n <span\n class=\"d-flex a-i-center\"\n *ngIf=\"filteringApplied\"\n >\n <ng-container *ngIf=\"!!filteringLabelsParams.allItemsCount\">\n <div class=\"a-i-center\">\n <span class=\"badge badge-info m-r-4\">\n {{ (dataSource.stats$ | async).filteredSize }}\n </span>\n <small\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n of {{ allItemsCount }} items\n </small>\n </div>\n </ng-container>\n <div\n class=\"dropdown\"\n placement=\"bottom left\"\n dropdown\n #ddFilters=\"bs-dropdown\"\n [cdkTrapFocus]=\"ddFilters.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btn btn-default btn-sm m-l-8\"\n title=\"{{ 'Active filters' | translate }}\"\n aria-haspopup=\"true\"\n dropdownToggle\n data-cy=\"c8y-data-grid--filters\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"filter\"\n ></i>\n <span>{{ 'Active filters' | translate }}</span>\n <span class=\"badge badge-system\">\n {{ columnsWithFiltersApplied.length }}\n </span>\n </button>\n\n <div\n class=\"dropdown-menu\"\n *dropdownMenu\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"data-grid__dropdown bg-level-0\">\n <ul class=\"list-unstyled m-0\">\n <li\n *ngFor=\"let column of columnsWithFiltersApplied; let last = last\"\n [ngClass]=\"{ 'separator-bottom': !last }\"\n >\n <ng-container>\n <div\n class=\"dropdown-header sticky-top text-truncate no-border-top p-b-0\"\n title=\"{{ (column.header | translate) || column.name }}\"\n >\n <label>\n {{ (column.header | translate) || column.name }}\n </label>\n </div>\n <div\n class=\"list-group-item borderless d-flex d-col\"\n *ngFor=\"\n let groupedFilterChips of column\n | mapToFilterChips\n | async\n | groupedFilterChips;\n let first = first\n \"\n [ngClass]=\"{ 'p-t-0': first }\"\n >\n <p\n class=\"small p-b-4\"\n *ngIf=\"groupedFilterChips.label\"\n >\n {{ groupedFilterChips.label | translate }}\n </p>\n <div class=\"d-flex a-i-center gap-4 flex-wrap\">\n <span\n class=\"tag tag--info chip\"\n *ngFor=\"let chip of groupedFilterChips.chips\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10 m-r-4\"\n title=\"{{ 'Remove filter' | translate }}\"\n (click)=\"removeFilter(chip.remove())\"\n data-cy=\"c8y-data-grid--remove-chip\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n {{ chip.displayValue | translate }}\n </span>\n </div>\n </div>\n </ng-container>\n </li>\n </ul>\n </div>\n <div class=\"list-group-item separator-top sticky-bottom\">\n <button\n class=\"btn btn-sm btn-default\"\n title=\"{{ 'Clear all filters' | translate }}\"\n type=\"button\"\n (click)=\"clearFilters()\"\n data-cy=\"c8y-data-grid--clear-filters\"\n >\n {{ 'Clear all filters' | translate }}\n </button>\n </div>\n </div>\n </div>\n </span>\n\n <button\n class=\"btn-help btn-help--sm hidden-xs hidden-sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"filtersHelpPopover\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"displayOptions.filter\"\n data-cy=\"data-grid--help-filters\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n <ng-template #filtersHelpPopover>\n <div [innerHtml]=\"filtersHelpPopoverHtml | translate\"></div>\n </ng-template>\n\n <button\n class=\"btn-clean text-primary hidden-xs hidden-sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ 'The counter for the total number of items might be inaccurate.' | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"showCounterWarning\"\n >\n <i c8yIcon=\"warning\"></i>\n </button>\n </ng-container>\n\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex a-i-center\">\n <ng-container\n *ngFor=\"let headerActionControl of headerActionControls | visibleControls | async\"\n >\n <ng-container *ngIf=\"!headerActionControl.template; else customTemplate\">\n <button\n class=\"btnbar-btn btn-link\"\n title=\"{{ headerActionControl.text | translate }}\"\n type=\"button\"\n (click)=\"headerActionControl.callback()\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION,\n customActionName: headerActionControl.text,\n type: headerActionControl.type\n }\"\n >\n <i\n class=\"m-r-4\"\n [c8yIcon]=\"headerActionControl.icon\"\n ></i>\n <span>{{ headerActionControl.text | translate }}</span>\n </button>\n </ng-container>\n <ng-template #customTemplate>\n <ng-container\n *ngTemplateOutlet=\"\n headerActionControl.template;\n context: { headerActionControl: headerActionControl }\n \"\n ></ng-container>\n </ng-template>\n </ng-container>\n\n <div\n class=\"dropdown\"\n placement=\"bottom left\"\n *ngIf=\"configureColumnsEnabled\"\n dropdown\n #ddConfigureColumns=\"bs-dropdown\"\n [cdkTrapFocus]=\"ddConfigureColumns.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Configure columns' | translate }}\"\n type=\"button\"\n data-cy=\"data-grid--custom-column-btn\"\n dropdownToggle\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"columns\"\n ></i>\n <span>{{ 'Configure columns' | translate }}</span>\n </button>\n\n <ul\n class=\"dropdown-menu data-grid__dropdown\"\n *dropdownMenu\n (click)=\"$event.stopPropagation()\"\n >\n <li>\n <div\n class=\"list-group m-0\"\n cdkDropList\n (cdkDropListDropped)=\"onColumnDrop($event)\"\n >\n <div\n *ngFor=\"let column of columns\"\n cdkDrag\n cdkDragLockAxis=\"y\"\n >\n <ng-container *ngIf=\"!column.positionFixed\">\n <div class=\"list-group-item draggable-after p-0 a-i-center\">\n <label\n class=\"c8y-checkbox p-l-16\"\n title=\"{{ (column.header | translate) || column.name }}\"\n [attr.data-cy]=\"'data-grid--custom-column-header-' + column.header\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"column.visible\"\n (change)=\"\n updateGridColumnsSize(); emitConfigChange('changeColumnVisibility')\n \"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CHANGE_VISIBILITY,\n column: column.name,\n visible: !column.visible\n }\"\n />\n <span></span>\n <span>{{ (column.header | translate) || column.name }}</span>\n </label>\n <button\n class=\"btn btn-dot showOnHover max-width-fit a-i-center\"\n [attr.aria-label]=\"'Remove`column,verb`' | translate\"\n tooltip=\"{{ 'Remove`column,verb`' | translate }}\"\n placement=\"left\"\n container=\"body\"\n type=\"button\"\n (click)=\"removeCustomColumn(poConfirm, column, ddConfigureColumns)\"\n *ngIf=\"column.custom\"\n >\n <c8y-popover-confirm\n [title]=\"'Confirm removal' | translate\"\n triggers=\"focus\"\n [placement]=\"'left'\"\n #poConfirm\n ></c8y-popover-confirm>\n <i\n c8yIcon=\"minus-circle\"\n data-cy=\"data-grid--custom-column-remove-btn\"\n ></i>\n </button>\n </div>\n </ng-container>\n </div>\n </div>\n </li>\n <li\n class=\"p-8 sticky-bottom separator-top\"\n *ngIf=\"isConfigContextKnown\"\n >\n <button\n class=\"btn btn-default btn-block\"\n title=\"{{ 'Add custom column' | translate }}\"\n type=\"button\"\n data-cy=\"data-grid--add-custom-column\"\n (click)=\"openCustomColumnModal(); ddConfigureColumns.hide()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"plus-circle\"\n ></i>\n <span>{{ 'Add custom column' | translate }}</span>\n </button>\n </li>\n </ul>\n </div>\n\n <button\n class=\"btnbar-btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n *ngIf=\"!hideReload\"\n data-cy=\"data-grid--reload-btn\"\n [disabled]=\"dataSource.loading$ | async\"\n (click)=\"clickReload()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"refresh\"\n ></i>\n <span>{{ 'Reload' | translate }}</span>\n </button>\n\n <div\n class=\"input-group input-group-search m-l-sm-16 data-grid__search-input\"\n *ngIf=\"!serverSideDataCallback || showSearch\"\n >\n <input\n class=\"form-control\"\n placeholder=\"{{ 'Search\u2026' | translate }}\"\n type=\"search\"\n [(ngModel)]=\"searchText\"\n (ngModelChange)=\"searchText$.emit($event)\"\n (keydown.enter)=\"$event.stopPropagation(); performSearch(searchText)\"\n />\n <div class=\"input-group-addon\">\n <i\n c8yIcon=\"search\"\n *ngIf=\"searchText.length === 0\"\n ></i>\n <i\n class=\"pointer\"\n c8yIcon=\"times\"\n *ngIf=\"searchText.length > 0\"\n (click)=\"searchText = ''; searchText$.emit('')\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.CLEAR_SEARCH }\"\n ></i>\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"table-data-grid-header-bulk-actions animated slideInDown fast\"\n data-cy=\"table-data-grid-header-bulk-actions\"\n *ngIf=\"selectedItemIds.length !== 0\"\n >\n <h4>\n <ng-container [ngPlural]=\"selectedItemIds.length\">\n <ng-template ngPluralCase=\"=1\">\n <span translate>1 selected item.</span>\n </ng-template>\n <ng-template ngPluralCase=\"other\">\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: selectedItemIds.length }\"\n >\n {{ count }} selected items.\n </span>\n </ng-template>\n </ng-container>\n <br class=\"visible-xs\" />\n <small *ngIf=\"!serverSideDataCallback && selectedItemIds.length >= pagination.pageSize\">\n <a\n class=\"interact\"\n (click)=\"setAllItemsSelected(true)\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n >\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: (dataSource.stats$ | async).filteredSize }\"\n >\n Select all {{ count }} items\n </span>\n </a>\n </small>\n </h4>\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex\">\n <ng-container\n *ngFor=\"\n let bulkActionControl of bulkActionControls | visibleControls: selectedItemIds | async\n \"\n >\n <ng-container [ngSwitch]=\"bulkActionControl.type\">\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Export\"\n [actionData]=\"{ action: PX_ACTIONS.BULK_EXPORT }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"sign-out\"></i>\n <span>{{ 'Export' | translate }}</span>\n </button>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n [actionData]=\"{ action: PX_ACTIONS.BULK_DELETE }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"delete\"></i>\n <span>{{ 'Delete' | translate }}</span>\n </button>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ bulkActionControl.text | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchDefault\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CUSTOM_ACTION,\n customActionName: bulkActionControl.text\n }\"\n c8yProductExperience\n inherit\n >\n <i\n [class]=\"bulkActionControl.iconClasses\"\n c8yIcon=\"{{ bulkActionControl.icon }}\"\n ></i>\n <span>{{ bulkActionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancel()\"\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CANCEL\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"times\"></i>\n <span>{{ 'Cancel' | translate }}</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <table\n class=\"table table-filtered-sorted table-data-grid large-padding\"\n [class.table-striped]=\"displayOptions.striped\"\n [class.table-bordered]=\"displayOptions.bordered\"\n [class.table-hover]=\"displayOptions.hover\"\n [class.table-data-grid-with-checkboxes]=\"selectable\"\n [class.table-data-grid-with-actions]=\"actionControls.length > 0\"\n [style.grid-template-columns]=\"styles.gridTemplateColumns\"\n cdk-table\n [dataSource]=\"dataSource\"\n [multiTemplateDataRows]=\"true\"\n (mousemove)=\"resizeHandleContainerMouseMove$.emit($event)\"\n (mouseup)=\"resizeHandleContainerMouseUp$.emit($event)\"\n data-cy=\"c8y-data-grid--table\"\n >\n <ng-container\n *ngFor=\"let column of columns; let i = index; trackBy: trackByName\"\n [cdkColumnDef]=\"column.name\"\n >\n <ng-container [ngSwitch]=\"column.name\">\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n >\n <div>\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"currentPageSelectionState.allSelected\"\n [indeterminate]=\"\n !(\n currentPageSelectionState.allSelected ||\n currentPageSelectionState.allDeselected\n )\n \"\n (change)=\"setAllItemsInCurrentPageSelected($event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n />\n <span></span>\n </label>\n </div>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"setItemsSelected([row], $event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.SELECT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--checkbox\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'radio-button'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n ></th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <label class=\"c8y-radio\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n name=\"select-row\"\n type=\"radio\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"changeSelectedItem(row)\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.SELECT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--radio\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'actions'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n >\n <p class=\"text-medium sr-only\">{{ 'Actions' | translate }}</p>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <ng-container\n *ngFor=\"\n let actionControl of actionControls\n | visibleControls: row\n | async\n | slice: 0 : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2)\n \"\n >\n <ng-container [ngSwitch]=\"actionControl.type\">\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"'Edit' | translate\"\n tooltip=\"{{ 'Edit' | translate }}\"\n container=\"body\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n [delay]=\"500\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--edit-button-in-row\"\n >\n <i c8yIcon=\"pencil\"></i>\n </button>\n\n <button\n class=\"btn btn-dot btn-dot--danger showOnHover\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n data-cy=\"c8y-data-grid--remove-button-in-row\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"(actionControl.icon ? actionControl.text : '') | translate\"\n tooltip=\"{{ (actionControl.icon ? actionControl.text : '') | translate }}\"\n container=\"body\"\n type=\"button\"\n [ngClass]=\"{ showOnHover: actionControl.showOnHover }\"\n [delay]=\"500\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n [attr.data-cy]=\"'c8y-data-grid--button-in-row--' + actionControl.text\"\n >\n <i\n c8yIcon=\"{{ actionControl.icon }}\"\n [ngClass]=\"actionControl.iconClasses\"\n *ngIf=\"actionControl.icon\"\n ></i>\n <span *ngIf=\"!actionControl.icon\">{{ actionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <div\n [ngClass]=\"{\n 'm-l-auto overflow-visible':\n (actionControls | visibleControls: row | async)?.length > 2\n }\"\n >\n <div\n class=\"dropdown\"\n placement=\"bottom right\"\n container=\"body\"\n dropdown\n *ngIf=\"(actionControls | visibleControls: row | async)?.length > 2\"\n >\n <button\n class=\"dropdown-toggle c8y-dropdown\"\n title=\"{{ 'Actions' | translate }}\"\n aria-haspopup=\"true\"\n type=\"button\"\n data-cy=\"c8y-data-grid--row-actions-dropdown\"\n dropdownToggle\n >\n <i c8yIcon=\"ellipsis-v\"></i>\n </button>\n <ul\n class=\"dropdown-menu dropdown-menu-right\"\n *dropdownMenu\n >\n <li\n *ngFor=\"\n let actionControl of actionControls\n | visibleControls: row\n | async\n | slice\n : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2)\n \"\n >\n <ng-container [ngSwitch]=\"actionControl.type\">\n <button\n title=\"{{ 'Edit' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"pencil\"></i>\n {{ 'Edit' | translate }}\n </button>\n <button\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Delete' | translate }}\n </button>\n <button\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Export\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.EXPORT_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"data-export\"></i>\n {{ 'Export' | translate }}\n </button>\n <button\n title=\"{{ actionControl.text | translate }}\"\n type=\"button\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n >\n <i\n c8yIcon=\"{{ actionControl.icon }}\"\n [ngClass]=\"actionControl.iconClasses\"\n ></i>\n {{ actionControl.text | translate }}\n </button>\n </ng-container>\n </li>\n </ul>\n </div>\n </div>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <th\n [class.sorted]=\"column.sortOrder\"\n [class.filtered]=\"column | map: isColumnFilteringApplied\"\n [class.hidden]=\"!column.visible\"\n cdk-header-cell\n *cdkHeaderCellDef\n [ngClass]=\"column.headerCSSClassName\"\n [attr.data-type]=\"column.dataType\"\n >\n <div\n [title]=\"(column.header | translate) || column.name\"\n *ngIf=\"!column.filterable\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </div>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <div\n class=\"dropdown\"\n placement=\"bottom {{ isDropDownPlacedRight(column) ? 'right' : 'left' }}\"\n *ngIf=\"column.filterable\"\n dropdown\n #gridHeaderDropdown=\"bs-dropdown\"\n [cdkTrapFocus]=\"gridHeaderDropdown.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btn-header\"\n [title]=\"(column.header | translate) || column.name\"\n type=\"button\"\n [attr.data-cy]=\"'data-grid--header-btn--' + column.header\"\n dropdownToggle\n >\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer\n data-cy=\"c8y-data-grid--c8y-cell-renderer\"\n [spec]=\"cellRendererSpec\"\n ></c8y-cell-renderer>\n </ng-container>\n <i\n c8yIcon=\"filter\"\n title=\"{{ 'Filter' | translate }}\"\n ></i>\n </button>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <ul\n class=\"dropdown-menu\"\n *dropdownMenu\n [ngClass]=\"{ 'dropdown-menu-right-grid': isDropDownPlacedRight(column) }\"\n (click)=\"$event.stopPropagation()\"\n >\n <li class=\"data-grid__dropdown\">\n <ng-container\n *ngIf=\"\n [\n {\n column: column,\n dropdown: gridHeaderDropdown\n }\n ] | map: getFilteringFormRendererSpec : this as filteringFormRendererSpec\n \"\n >\n <c8y-filtering-form-renderer\n class=\"bg-component\"\n [spec]=\"filteringFormRendererSpec\"\n data-cy=\"c8y-data-grid--c8y-filtering-form-renderer\"\n ></c8y-filtering-form-renderer>\n </ng-container>\n </li>\n </ul>\n </div>\n\n <button\n class=\"btn-sort\"\n [style]=\"{ 'margin-left': !column.filterable && column.sortable ? '-20px' : null }\"\n [title]=\"sortColumnTitle | translate: { name: column.header | translate }\"\n type=\"button\"\n *ngIf=\"column.sortable\"\n (click)=\"changeSortOrder(column.name)\"\n data-cy=\"change-sort-order\"\n >\n <ng-container [ngSwitch]=\"column.sortOrder\">\n <i\n c8yIcon=\"long-arrow-up\"\n *ngSwitchCase=\"'asc'\"\n ></i>\n <i\n c8yIcon=\"long-arrow-down\"\n *ngSwitchCase=\"'desc'\"\n ></i>\n <i\n c8yIcon=\"exchange\"\n *ngSwitchDefault\n ></i>\n </ng-container>\n </button>\n\n <span\n class=\"resize-handle\"\n *ngIf=\"column.resizable\"\n (mousedown)=\"\n resizeHandleMouseDown$.emit({ event: $event, targetColumnName: column.name })\n \"\n ></span>\n </th>\n\n <td\n [class.hidden]=\"!column.visible\"\n [attr.data-cell-title]=\"column.header | translate\"\n cdk-cell\n *cdkCellDef=\"let row\"\n [ngClass]=\"column.cellCSSClassName\"\n [attr.data-cy]=\"'data-grid--' + column.header\"\n [attr.data-type]=\"column.dataType\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n value: resolveCellValue(row, column.path),\n row: row,\n columnName: column.name\n }\n ] | map: getCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </td>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container cdkColumnDef=\"infiniteScrollFooter\">\n <td\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-footer-cell\n *cdkFooterCellDef\n >\n <template #infiniteScrollContainer></template>\n </td>\n </ng-container>\n\n <tr\n cdk-header-row\n *cdkHeaderRowDef=\"columnNames\"\n ></tr>\n\n <tr\n data-cy=\"c8y-data-grid--row-in-data-grid\"\n cdk-row\n *cdkRowDef=\"let row; columns: columnNames; let idx = dataIndex\"\n [ngClass]=\"[\n activeClassName && row === lastClickedRow ? activeClassName : '',\n idx % 2 === 0 ? 'even' : 'odd'\n ]\"\n (mouseover)=\"rowMouseOver.emit(row)\"\n (mouseleave)=\"rowMouseLeave.emit(row)\"\n (click)=\"handleClick(row)\"\n ></tr>\n\n <tr\n class=\"expanded-row\"\n [ngClass]=\"{ hidden: !(expandedRows.get(row).visible$ | async) }\"\n data-cy=\"c8y-data-grid--expanded-row-in-data-grid\"\n cdk-row\n *cdkRowDef=\"let row; columns: ['expanded-row']; when: isRowExpanded\"\n ></tr>\n\n <ng-container cdkColumnDef=\"expanded-row\">\n <td\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-cell\n *cdkCellDef=\"let row\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n expandableRow?.template;\n context: {\n $implicit: row,\n asyncRenderSuccess: setExpandableRowVisible.bind(this, row, true),\n asyncRenderFail: setExpandableRowVisible.bind(this, row, false)\n }\n \"\n ></ng-container>\n </td>\n </ng-container>\n\n <ng-container>\n <tr\n [ngClass]=\"{ hidden: !infiniteScroll }\"\n cdk-footer-row\n *cdkFooterRowDef=\"['infiniteScrollFooter']\"\n ></tr>\n </ng-container>\n </table>\n\n <div\n class=\"d-flex m-0 p-t-40 p-b-40\"\n *ngIf=\"\n !(dataSource.loading$ | async) &&\n ((dataSource.stats$ | async).filteredSize === 0 || (dataSource.data$ | async).length === 0)\n \"\n >\n <div class=\"col-lg-3 col-sm-4 m-l-auto m-r-auto\">\n <ng-content select=\"c8y-ui-empty-state, .c8y-empty-state\"></ng-content>\n <ng-container\n *ngTemplateOutlet=\"\n emptyState?.templateRef;\n context: { $implicit: emptyStateContext$ | async }\n \"\n ></ng-container>\n </div>\n </div>\n\n <div\n class=\"table-data-grid-footer separator large-padding\"\n *ngIf=\"pagination && !infiniteScroll\"\n >\n <div class=\"col-sm-4 no-gutter\">\n <div\n class=\"counter p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).currentPageSize > 0\"\n data-cy=\"data-grid--counter\"\n >\n <span\n class=\"text-muted\"\n ngNonBindable\n translate\n [translateParams]=\"paginationLabelParams\"\n >\n {{ pageFirstItemIdx }} - {{ pageLastItemIdx }} of {{ itemsTotal }}\n </span>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-center\">\n <div\n class=\"form-group form-inline p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).filteredSize > minPossiblePageSize\"\n >\n <label\n class=\"m-r-4\"\n for=\"filteredSize\"\n >\n {{ 'Items per page' | translate }}\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"filteredSize\"\n data-cy=\"data-grid--pagesize-options\"\n [ngModel]=\"pagination.pageSize\"\n (ngModelChange)=\"\n updatePagination({ itemsPerPage: $event, page: pagination.currentPage })\n \"\n >\n <option\n *ngFor=\"let pageSize of possiblePageSizes\"\n [ngValue]=\"pageSize\"\n >\n {{ pageSize }}\n </option>\n </select>\n </div>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-right\">\n <pagination\n [class.hidden]=\"hidePagination$ | async\"\n class=\"p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).filteredSize > 0\"\n [ngModel]=\"pagination.currentPage\"\n (pageChanged)=\"updatePagination($event)\"\n [totalItems]=\"(dataSource.stats$ | async).filteredSize\"\n [itemsPerPage]=\"pagination.pageSize\"\n (numPages)=\"totalPagesCount$.next($event)\"\n [maxSize]=\"5\"\n [boundaryLinks]=\"false\"\n previousText=\"Previous\"\n nextText=\"Next\"\n ></pagination>\n </div>\n </div>\n</div>\n" }]
1104
+ ], template: "<div\n class=\"table-data-grid-scroll\"\n #scroll\n [ngClass]=\"{\n 'table-data-grid__overlay': (dataSource.loading$ | async) && !loadMoreComponent?.isLoading\n }\"\n data-cy=\"c8y-data-grid--table-data-grid-scroll\"\n>\n <div\n class=\"table-data-grid__loading--wrapper\"\n *ngIf=\"(dataSource.loading$ | async) && !loadMoreComponent?.isLoading\"\n >\n <div class=\"table-data-grid__loading--loader\">\n <c8y-loading\n layout=\"application\"\n [message]=\"loadingItemsLabel\"\n ></c8y-loading>\n </div>\n </div>\n\n <div\n class=\"table-data-grid-header separator large-padding\"\n *ngIf=\"displayOptions.gridHeader\"\n >\n <div\n class=\"h4\"\n [ngClass]=\"{ 'm-r-16': !!title }\"\n >\n {{ title | translate }}\n </div>\n\n <ng-container *ngIf=\"displayOptions.filter\">\n <span *ngIf=\"!filteringApplied\">\n <small\n class=\"m-r-4\"\n *ngIf=\"!!filteringLabelsParams.allItemsCount\"\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n {{ filteredItemsCount }} of {{ allItemsCount }} items\n </small>\n <span\n class=\"label label-default m-r-4\"\n translate\n >\n No filters\n </span>\n </span>\n <span\n class=\"d-flex a-i-center\"\n *ngIf=\"filteringApplied\"\n >\n <ng-container *ngIf=\"!!filteringLabelsParams.allItemsCount\">\n <div class=\"a-i-center\">\n <span class=\"badge badge-info m-r-4\">\n {{ (dataSource.stats$ | async).filteredSize }}\n </span>\n <small\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n of {{ allItemsCount }} items\n </small>\n </div>\n </ng-container>\n <div\n class=\"dropdown\"\n placement=\"bottom left\"\n dropdown\n #ddFilters=\"bs-dropdown\"\n [cdkTrapFocus]=\"ddFilters.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btn btn-default btn-sm m-l-8\"\n title=\"{{ 'Active filters' | translate }}\"\n aria-haspopup=\"true\"\n dropdownToggle\n data-cy=\"c8y-data-grid--filters\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"filter\"\n ></i>\n <span>{{ 'Active filters' | translate }}</span>\n <span class=\"badge badge-system\">\n {{ columnsWithFiltersApplied.length }}\n </span>\n </button>\n\n <div\n class=\"dropdown-menu\"\n *dropdownMenu\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"data-grid__dropdown bg-level-0\">\n <ul class=\"list-unstyled m-0\">\n <li\n *ngFor=\"let column of columnsWithFiltersApplied; let last = last\"\n [ngClass]=\"{ 'separator-bottom': !last }\"\n >\n <ng-container>\n <div\n class=\"dropdown-header sticky-top text-truncate no-border-top p-b-0\"\n title=\"{{ (column.header | translate) || column.name }}\"\n >\n <label>\n {{ (column.header | translate) || column.name }}\n </label>\n </div>\n <div\n class=\"list-group-item borderless d-flex d-col\"\n *ngFor=\"\n let groupedFilterChips of column\n | mapToFilterChips\n | async\n | groupedFilterChips;\n let first = first\n \"\n [ngClass]=\"{ 'p-t-0': first }\"\n >\n <p\n class=\"small p-b-4\"\n *ngIf=\"groupedFilterChips.label\"\n >\n {{ groupedFilterChips.label | translate }}\n </p>\n <div class=\"d-flex a-i-center gap-4 flex-wrap\">\n <span\n class=\"tag tag--info chip\"\n *ngFor=\"let chip of groupedFilterChips.chips\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10 m-r-4\"\n title=\"{{ 'Remove filter' | translate }}\"\n (click)=\"removeFilter(chip.remove())\"\n data-cy=\"c8y-data-grid--remove-chip\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n {{ chip.displayValue | translate }}\n </span>\n </div>\n </div>\n </ng-container>\n </li>\n </ul>\n </div>\n <div class=\"list-group-item separator-top sticky-bottom\">\n <button\n class=\"btn btn-sm btn-default\"\n title=\"{{ 'Clear all filters' | translate }}\"\n type=\"button\"\n (click)=\"clearFilters()\"\n data-cy=\"c8y-data-grid--clear-filters\"\n >\n {{ 'Clear all filters' | translate }}\n </button>\n </div>\n </div>\n </div>\n </span>\n\n <button\n class=\"btn-help btn-help--sm hidden-xs hidden-sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"filtersHelpPopover\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"displayOptions.filter\"\n data-cy=\"data-grid--help-filters\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n <ng-template #filtersHelpPopover>\n <div [innerHtml]=\"filtersHelpPopoverHtml | translate\"></div>\n </ng-template>\n\n <button\n class=\"btn-clean text-primary hidden-xs hidden-sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ 'The counter for the total number of items might be inaccurate.' | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"showCounterWarning\"\n >\n <i c8yIcon=\"warning\"></i>\n </button>\n </ng-container>\n\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex a-i-center\">\n <ng-container\n *ngFor=\"let headerActionControl of headerActionControls | visibleControls | async\"\n >\n <ng-container *ngIf=\"!headerActionControl.template; else customTemplate\">\n <button\n class=\"btnbar-btn btn-link\"\n title=\"{{ headerActionControl.text | translate }}\"\n type=\"button\"\n (click)=\"headerActionControl.callback()\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION,\n customActionName: headerActionControl.text,\n type: headerActionControl.type\n }\"\n >\n <i\n class=\"m-r-4\"\n [c8yIcon]=\"headerActionControl.icon\"\n ></i>\n <span>{{ headerActionControl.text | translate }}</span>\n </button>\n </ng-container>\n <ng-template #customTemplate>\n <ng-container\n *ngTemplateOutlet=\"\n headerActionControl.template;\n context: { headerActionControl: headerActionControl }\n \"\n ></ng-container>\n </ng-template>\n </ng-container>\n\n <div\n class=\"dropdown\"\n placement=\"bottom left\"\n *ngIf=\"configureColumnsEnabled\"\n dropdown\n #ddConfigureColumns=\"bs-dropdown\"\n [cdkTrapFocus]=\"ddConfigureColumns.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Configure columns' | translate }}\"\n type=\"button\"\n data-cy=\"data-grid--custom-column-btn\"\n dropdownToggle\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"columns\"\n ></i>\n <span>{{ 'Configure columns' | translate }}</span>\n </button>\n\n <ul\n class=\"dropdown-menu data-grid__dropdown\"\n *dropdownMenu\n (click)=\"$event.stopPropagation()\"\n >\n <li>\n <div\n class=\"list-group m-0\"\n cdkDropList\n (cdkDropListDropped)=\"onColumnDrop($event)\"\n >\n <div\n *ngFor=\"let column of columns\"\n cdkDrag\n cdkDragLockAxis=\"y\"\n >\n <ng-container *ngIf=\"!column.positionFixed\">\n <div class=\"list-group-item draggable-after p-0 a-i-center\">\n <label\n class=\"c8y-checkbox p-l-16\"\n title=\"{{ (column.header | translate) || column.name }}\"\n [attr.data-cy]=\"'data-grid--custom-column-header-' + column.header\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"column.visible\"\n (change)=\"\n updateGridColumnsSize(); emitConfigChange('changeColumnVisibility')\n \"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CHANGE_VISIBILITY,\n column: column.name,\n visible: !column.visible\n }\"\n />\n <span></span>\n <span>{{ (column.header | translate) || column.name }}</span>\n </label>\n <button\n class=\"btn btn-dot showOnHover max-width-fit a-i-center\"\n [attr.aria-label]=\"'Remove`column,verb`' | translate\"\n tooltip=\"{{ 'Remove`column,verb`' | translate }}\"\n placement=\"left\"\n container=\"body\"\n type=\"button\"\n (click)=\"removeCustomColumn(poConfirm, column, ddConfigureColumns)\"\n *ngIf=\"column.custom\"\n >\n <c8y-popover-confirm\n [title]=\"'Confirm removal' | translate\"\n triggers=\"focus\"\n [placement]=\"'left'\"\n #poConfirm\n ></c8y-popover-confirm>\n <i\n c8yIcon=\"minus-circle\"\n data-cy=\"data-grid--custom-column-remove-btn\"\n ></i>\n </button>\n </div>\n </ng-container>\n </div>\n </div>\n </li>\n <li\n class=\"p-8 sticky-bottom separator-top\"\n *ngIf=\"isConfigContextKnown\"\n >\n <button\n class=\"btn btn-default btn-block\"\n title=\"{{ 'Add custom column' | translate }}\"\n type=\"button\"\n data-cy=\"data-grid--add-custom-column\"\n (click)=\"openCustomColumn(); ddConfigureColumns.hide()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"plus-circle\"\n ></i>\n <span>{{ 'Add custom column' | translate }}</span>\n </button>\n </li>\n </ul>\n </div>\n\n <button\n class=\"btnbar-btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n *ngIf=\"!hideReload\"\n data-cy=\"data-grid--reload-btn\"\n [disabled]=\"dataSource.loading$ | async\"\n (click)=\"clickReload()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"refresh\"\n ></i>\n <span>{{ 'Reload' | translate }}</span>\n </button>\n\n <div\n class=\"input-group input-group-search m-l-sm-16 data-grid__search-input\"\n *ngIf=\"!serverSideDataCallback || showSearch\"\n >\n <input\n class=\"form-control\"\n placeholder=\"{{ 'Search\u2026' | translate }}\"\n type=\"search\"\n [(ngModel)]=\"searchText\"\n (ngModelChange)=\"searchText$.emit($event)\"\n (keydown.enter)=\"$event.stopPropagation(); performSearch(searchText)\"\n />\n <div class=\"input-group-addon\">\n <i\n c8yIcon=\"search\"\n *ngIf=\"searchText.length === 0\"\n ></i>\n <i\n class=\"pointer\"\n c8yIcon=\"times\"\n *ngIf=\"searchText.length > 0\"\n (click)=\"searchText = ''; searchText$.emit('')\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.CLEAR_SEARCH }\"\n ></i>\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"table-data-grid-header-bulk-actions animated slideInDown fast\"\n data-cy=\"table-data-grid-header-bulk-actions\"\n *ngIf=\"selectedItemIds.length !== 0\"\n >\n <h4>\n <ng-container [ngPlural]=\"selectedItemIds.length\">\n <ng-template ngPluralCase=\"=1\">\n <span translate>1 selected item.</span>\n </ng-template>\n <ng-template ngPluralCase=\"other\">\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: selectedItemIds.length }\"\n >\n {{ count }} selected items.\n </span>\n </ng-template>\n </ng-container>\n <br class=\"visible-xs\" />\n <small *ngIf=\"!serverSideDataCallback && selectedItemIds.length >= pagination.pageSize\">\n <a\n class=\"interact\"\n (click)=\"setAllItemsSelected(true)\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n >\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: (dataSource.stats$ | async).filteredSize }\"\n >\n Select all {{ count }} items\n </span>\n </a>\n </small>\n </h4>\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex\">\n <ng-container\n *ngFor=\"\n let bulkActionControl of bulkActionControls | visibleControls: selectedItemIds | async\n \"\n >\n <ng-container [ngSwitch]=\"bulkActionControl.type\">\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Export\"\n [actionData]=\"{ action: PX_ACTIONS.BULK_EXPORT }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"sign-out\"></i>\n <span>{{ 'Export' | translate }}</span>\n </button>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n [actionData]=\"{ action: PX_ACTIONS.BULK_DELETE }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"delete\"></i>\n <span>{{ 'Delete' | translate }}</span>\n </button>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ bulkActionControl.text | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchDefault\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CUSTOM_ACTION,\n customActionName: bulkActionControl.text\n }\"\n c8yProductExperience\n inherit\n >\n <i\n [class]=\"bulkActionControl.iconClasses\"\n c8yIcon=\"{{ bulkActionControl.icon }}\"\n ></i>\n <span>{{ bulkActionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancel()\"\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CANCEL\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"times\"></i>\n <span>{{ 'Cancel' | translate }}</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <table\n class=\"table table-filtered-sorted table-data-grid large-padding\"\n [class.table-striped]=\"displayOptions.striped\"\n [class.table-bordered]=\"displayOptions.bordered\"\n [class.table-hover]=\"displayOptions.hover\"\n [class.table-data-grid-with-checkboxes]=\"selectable\"\n [class.table-data-grid-with-actions]=\"actionControls.length > 0\"\n [style.grid-template-columns]=\"styles.gridTemplateColumns\"\n cdk-table\n [dataSource]=\"dataSource\"\n [multiTemplateDataRows]=\"true\"\n (mousemove)=\"resizeHandleContainerMouseMove$.emit($event)\"\n (mouseup)=\"resizeHandleContainerMouseUp$.emit($event)\"\n data-cy=\"c8y-data-grid--table\"\n >\n <ng-container\n *ngFor=\"let column of columns; let i = index; trackBy: trackByName\"\n [cdkColumnDef]=\"column.name\"\n >\n <ng-container [ngSwitch]=\"column.name\">\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n >\n <div>\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"currentPageSelectionState.allSelected\"\n [indeterminate]=\"\n !(\n currentPageSelectionState.allSelected ||\n currentPageSelectionState.allDeselected\n )\n \"\n (change)=\"setAllItemsInCurrentPageSelected($event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n />\n <span></span>\n </label>\n </div>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"setItemsSelected([row], $event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.SELECT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--checkbox\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'radio-button'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n ></th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <label class=\"c8y-radio\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n name=\"select-row\"\n type=\"radio\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"changeSelectedItem(row)\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.SELECT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--radio\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'actions'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n >\n <p class=\"text-medium sr-only\">{{ 'Actions' | translate }}</p>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <ng-container\n *ngFor=\"\n let actionControl of actionControls\n | visibleControls: row\n | async\n | slice: 0 : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2)\n \"\n >\n <ng-container [ngSwitch]=\"actionControl.type\">\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"'Edit' | translate\"\n tooltip=\"{{ 'Edit' | translate }}\"\n container=\"body\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n [delay]=\"500\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--edit-button-in-row\"\n >\n <i c8yIcon=\"pencil\"></i>\n </button>\n\n <button\n class=\"btn btn-dot btn-dot--danger showOnHover\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n data-cy=\"c8y-data-grid--remove-button-in-row\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"(actionControl.icon ? actionControl.text : '') | translate\"\n tooltip=\"{{ (actionControl.icon ? actionControl.text : '') | translate }}\"\n container=\"body\"\n type=\"button\"\n [ngClass]=\"{ showOnHover: actionControl.showOnHover }\"\n [delay]=\"500\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n [attr.data-cy]=\"'c8y-data-grid--button-in-row--' + actionControl.text\"\n >\n <i\n c8yIcon=\"{{ actionControl.icon }}\"\n [ngClass]=\"actionControl.iconClasses\"\n *ngIf=\"actionControl.icon\"\n ></i>\n <span *ngIf=\"!actionControl.icon\">{{ actionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <div\n [ngClass]=\"{\n 'm-l-auto overflow-visible':\n (actionControls | visibleControls: row | async)?.length > 2\n }\"\n >\n <div\n class=\"dropdown\"\n placement=\"bottom right\"\n container=\"body\"\n dropdown\n *ngIf=\"(actionControls | visibleControls: row | async)?.length > 2\"\n >\n <button\n class=\"dropdown-toggle c8y-dropdown\"\n title=\"{{ 'Actions' | translate }}\"\n aria-haspopup=\"true\"\n type=\"button\"\n data-cy=\"c8y-data-grid--row-actions-dropdown\"\n dropdownToggle\n >\n <i c8yIcon=\"ellipsis-v\"></i>\n </button>\n <ul\n class=\"dropdown-menu dropdown-menu-right\"\n *dropdownMenu\n >\n <li\n *ngFor=\"\n let actionControl of actionControls\n | visibleControls: row\n | async\n | slice\n : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2)\n \"\n >\n <ng-container [ngSwitch]=\"actionControl.type\">\n <button\n title=\"{{ 'Edit' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"pencil\"></i>\n {{ 'Edit' | translate }}\n </button>\n <button\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Delete' | translate }}\n </button>\n <button\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Export\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.EXPORT_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"data-export\"></i>\n {{ 'Export' | translate }}\n </button>\n <button\n title=\"{{ actionControl.text | translate }}\"\n type=\"button\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n >\n <i\n c8yIcon=\"{{ actionControl.icon }}\"\n [ngClass]=\"actionControl.iconClasses\"\n ></i>\n {{ actionControl.text | translate }}\n </button>\n </ng-container>\n </li>\n </ul>\n </div>\n </div>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <th\n [class.sorted]=\"column.sortOrder\"\n [class.filtered]=\"column | map: isColumnFilteringApplied\"\n [class.hidden]=\"!column.visible\"\n cdk-header-cell\n *cdkHeaderCellDef\n [ngClass]=\"column.headerCSSClassName\"\n [attr.data-type]=\"column.dataType\"\n >\n <div\n [title]=\"(column.header | translate) || column.name\"\n *ngIf=\"!column.filterable\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </div>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <div\n class=\"dropdown\"\n placement=\"bottom {{ isDropDownPlacedRight(column) ? 'right' : 'left' }}\"\n *ngIf=\"column.filterable\"\n dropdown\n #gridHeaderDropdown=\"bs-dropdown\"\n [cdkTrapFocus]=\"gridHeaderDropdown.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btn-header\"\n [title]=\"(column.header | translate) || column.name\"\n type=\"button\"\n [attr.data-cy]=\"'data-grid--header-btn--' + column.header\"\n dropdownToggle\n >\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer\n data-cy=\"c8y-data-grid--c8y-cell-renderer\"\n [spec]=\"cellRendererSpec\"\n ></c8y-cell-renderer>\n </ng-container>\n <i\n c8yIcon=\"filter\"\n title=\"{{ 'Filter' | translate }}\"\n ></i>\n </button>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <ul\n class=\"dropdown-menu\"\n *dropdownMenu\n [ngClass]=\"{ 'dropdown-menu-right-grid': isDropDownPlacedRight(column) }\"\n (click)=\"$event.stopPropagation()\"\n >\n <li class=\"data-grid__dropdown\">\n <ng-container\n *ngIf=\"\n [\n {\n column: column,\n dropdown: gridHeaderDropdown\n }\n ] | map: getFilteringFormRendererSpec : this as filteringFormRendererSpec\n \"\n >\n <c8y-filtering-form-renderer\n class=\"bg-component\"\n [spec]=\"filteringFormRendererSpec\"\n data-cy=\"c8y-data-grid--c8y-filtering-form-renderer\"\n ></c8y-filtering-form-renderer>\n </ng-container>\n </li>\n </ul>\n </div>\n\n <button\n class=\"btn-sort\"\n [style]=\"{ 'margin-left': !column.filterable && column.sortable ? '-20px' : null }\"\n [title]=\"sortColumnTitle | translate: { name: column.header | translate }\"\n type=\"button\"\n *ngIf=\"column.sortable\"\n (click)=\"changeSortOrder(column.name)\"\n data-cy=\"change-sort-order\"\n >\n <ng-container [ngSwitch]=\"column.sortOrder\">\n <i\n c8yIcon=\"long-arrow-up\"\n *ngSwitchCase=\"'asc'\"\n ></i>\n <i\n c8yIcon=\"long-arrow-down\"\n *ngSwitchCase=\"'desc'\"\n ></i>\n <i\n c8yIcon=\"exchange\"\n *ngSwitchDefault\n ></i>\n </ng-container>\n </button>\n\n <span\n class=\"resize-handle\"\n *ngIf=\"column.resizable\"\n (mousedown)=\"\n resizeHandleMouseDown$.emit({ event: $event, targetColumnName: column.name })\n \"\n ></span>\n </th>\n\n <td\n [class.hidden]=\"!column.visible\"\n [attr.data-cell-title]=\"column.header | translate\"\n cdk-cell\n *cdkCellDef=\"let row\"\n [ngClass]=\"column.cellCSSClassName\"\n [attr.data-cy]=\"'data-grid--' + column.header\"\n [attr.data-type]=\"column.dataType\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n value: resolveCellValue(row, column.path),\n row: row,\n columnName: column.name\n }\n ] | map: getCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </td>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container cdkColumnDef=\"infiniteScrollFooter\">\n <td\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-footer-cell\n *cdkFooterCellDef\n >\n <template #infiniteScrollContainer></template>\n </td>\n </ng-container>\n\n <tr\n cdk-header-row\n *cdkHeaderRowDef=\"columnNames\"\n ></tr>\n\n <tr\n data-cy=\"c8y-data-grid--row-in-data-grid\"\n cdk-row\n *cdkRowDef=\"let row; columns: columnNames; let idx = dataIndex\"\n [ngClass]=\"[\n activeClassName && row === lastClickedRow ? activeClassName : '',\n idx % 2 === 0 ? 'even' : 'odd'\n ]\"\n (mouseover)=\"rowMouseOver.emit(row)\"\n (mouseleave)=\"rowMouseLeave.emit(row)\"\n (click)=\"handleClick(row)\"\n ></tr>\n\n <tr\n class=\"expanded-row\"\n [ngClass]=\"{ hidden: !(expandedRows.get(row).visible$ | async) }\"\n data-cy=\"c8y-data-grid--expanded-row-in-data-grid\"\n cdk-row\n *cdkRowDef=\"let row; columns: ['expanded-row']; when: isRowExpanded\"\n ></tr>\n\n <ng-container cdkColumnDef=\"expanded-row\">\n <td\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-cell\n *cdkCellDef=\"let row\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n expandableRow?.template;\n context: {\n $implicit: row,\n asyncRenderSuccess: setExpandableRowVisible.bind(this, row, true),\n asyncRenderFail: setExpandableRowVisible.bind(this, row, false)\n }\n \"\n ></ng-container>\n </td>\n </ng-container>\n\n <ng-container>\n <tr\n [ngClass]=\"{ hidden: !infiniteScroll }\"\n cdk-footer-row\n *cdkFooterRowDef=\"['infiniteScrollFooter']\"\n ></tr>\n </ng-container>\n </table>\n\n <div\n class=\"d-flex m-0 p-t-40 p-b-40\"\n *ngIf=\"\n !(dataSource.loading$ | async) &&\n ((dataSource.stats$ | async).filteredSize === 0 || (dataSource.data$ | async).length === 0)\n \"\n >\n <div class=\"col-lg-3 col-sm-4 m-l-auto m-r-auto\">\n <ng-content select=\"c8y-ui-empty-state, .c8y-empty-state\"></ng-content>\n <ng-container\n *ngTemplateOutlet=\"\n emptyState?.templateRef;\n context: { $implicit: emptyStateContext$ | async }\n \"\n ></ng-container>\n </div>\n </div>\n\n <div\n class=\"table-data-grid-footer separator large-padding\"\n *ngIf=\"pagination && !infiniteScroll\"\n >\n <div class=\"col-sm-4 no-gutter\">\n <div\n class=\"counter p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).currentPageSize > 0\"\n data-cy=\"data-grid--counter\"\n >\n <span\n class=\"text-muted\"\n ngNonBindable\n translate\n [translateParams]=\"paginationLabelParams\"\n >\n {{ pageFirstItemIdx }} - {{ pageLastItemIdx }} of {{ itemsTotal }}\n </span>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-center\">\n <div\n class=\"form-group form-inline p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).filteredSize > minPossiblePageSize\"\n >\n <label\n class=\"m-r-4\"\n for=\"filteredSize\"\n >\n {{ 'Items per page' | translate }}\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"filteredSize\"\n data-cy=\"data-grid--pagesize-options\"\n [ngModel]=\"pagination.pageSize\"\n (ngModelChange)=\"\n updatePagination({ itemsPerPage: $event, page: pagination.currentPage })\n \"\n >\n <option\n *ngFor=\"let pageSize of possiblePageSizes\"\n [ngValue]=\"pageSize\"\n >\n {{ pageSize }}\n </option>\n </select>\n </div>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-right\">\n <pagination\n [class.hidden]=\"hidePagination$ | async\"\n class=\"p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).filteredSize > 0\"\n [ngModel]=\"pagination.currentPage\"\n (pageChanged)=\"updatePagination($event)\"\n [totalItems]=\"(dataSource.stats$ | async).filteredSize\"\n [itemsPerPage]=\"pagination.pageSize\"\n (numPages)=\"totalPagesCount$.next($event)\"\n [maxSize]=\"5\"\n [boundaryLinks]=\"false\"\n previousText=\"Previous\"\n nextText=\"Next\"\n ></pagination>\n </div>\n </div>\n</div>\n" }]
1116
1105
  }], ctorParameters: () => [{ type: undefined, decorators: [{
1117
1106
  type: Optional
1118
1107
  }, {
1119
1108
  type: Inject,
1120
1109
  args: [DATA_GRID_CONFIGURATION_STRATEGY]
1121
- }] }, { type: i1.DataGridService }, { type: i2.DomSanitizer }, { type: i3.GainsightService }, { type: i4.BsModalService }, { type: i5.AlertService }, { type: i6.ActionControlsExtensionService }, { type: i7.ActivatedRoute }], propDecorators: { title: [{
1110
+ }] }, { type: i1.DataGridService }, { type: i2.DomSanitizer }, { type: i3.GainsightService }, { type: i4.AlertService }, { type: i5.ActionControlsExtensionService }, { type: i6.ActivatedRoute }], propDecorators: { title: [{
1122
1111
  type: Input
1123
1112
  }], loadMoreItemsLabel: [{
1124
1113
  type: Input
@@ -1230,4 +1219,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
1230
1219
  type: ViewChild,
1231
1220
  args: [CdkTable, { static: false }]
1232
1221
  }] } });
1233
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1ncmlkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvZGF0YS1ncmlkL2RhdGEtZ3JpZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9jb3JlL2RhdGEtZ3JpZC9kYXRhLWdyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM3RCxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBQ2YsVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsRUFDVCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWpELE9BQU8sRUFDTCxRQUFRLElBQUksU0FBUyxFQUNyQixTQUFTLEVBQ1QsSUFBSSxFQUNKLEdBQUcsRUFDSCxPQUFPLEVBQ1AsT0FBTyxFQUNQLEtBQUssRUFDTCxLQUFLLEVBQ0wsTUFBTSxFQUNOLE9BQU8sRUFDUixNQUFNLFdBQVcsQ0FBQztBQUVuQixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUNMLGVBQWUsRUFFZixPQUFPLEVBRVAsYUFBYSxFQUNiLFFBQVEsRUFDUixZQUFZLEVBQ1osS0FBSyxFQUNMLEVBQUUsRUFDRixJQUFJLEVBQ0wsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLG9CQUFvQixFQUNwQixNQUFNLEVBQ04sS0FBSyxFQUNM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TUFBTTtnQkFNRyxXQUFXO3NCQUFwQixNQUFNO2dCQUVHLFFBQVE7c0JBQWpCLE1BQU07Z0JBRUcsaUJBQWlCO3NCQUExQixNQUFNO2dCQUVHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFFRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBRUcsTUFBTTtzQkFBZixNQUFNO2dCQUVHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFFRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBRUcsd0JBQXdCO3NCQUFqQyxNQUFNO2dCQUUyQixlQUFlO3NCQUFoRCxlQUFlO3VCQUFDLGVBQWU7Z0JBR2hDLGFBQWE7c0JBRFosWUFBWTt1QkFBQyxzQkFBc0I7Z0JBR0csZUFBZTtzQkFBckQsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUdyQyx1QkFBdUI7c0JBRHRCLFNBQVM7dUJBQUMseUJBQXlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFHckMsVUFBVTtzQkFBbkQsWUFBWTt1QkFBQywwQkFBMEI7Z0JBc0VtQixNQUFNO3NCQUFoRSxZQUFZO3VCQUFDLGFBQWEsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBSWpELFFBQVE7c0JBRFAsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2RrSGVhZGVyQ2VsbCwgQ2RrVGFibGUgfSBmcm9tICdAYW5ndWxhci9jZGsvdGFibGUnO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgVmlld0NoaWxkLFxuICBWaWV3Q2hpbGRyZW4sXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIGZvcndhcmRSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IElJZGVudGlmaWVkLCBJUmVzdWx0TGlzdCwgUGFnaW5nIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHtcbiAgcGFyc2VJbnQgYXMgX3BhcnNlSW50LFxuICBjYXN0QXJyYXksXG4gIGZsb3csXG4gIGdldCxcbiAgaW5kZXhPZixcbiAgaXNFbXB0eSxcbiAgaXNOaWwsXG4gIHVuaW9uLFxuICB1bmlxQnksXG4gIHdpdGhvdXRcbn0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEJzRHJvcGRvd25EaXJlY3RpdmUgfSBmcm9tICduZ3gtYm9vdHN0cmFwL2Ryb3Bkb3duJztcbmltcG9ydCB7IEJzTW9kYWxTZXJ2aWNlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIE9ic2VydmFibGUsXG4gIFN1YmplY3QsXG4gIFVuYXJ5RnVuY3Rpb24sXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGZvcmtKb2luLFxuICBpc09ic2VydmFibGUsXG4gIG1lcmdlLFxuICBvZixcbiAgcGlwZVxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGNvbWJpbmVMYXRlc3RXaXRoLFxuICBjb25jYXRNYXAsXG4gIGRlYm91bmNlVGltZSxcbiAgZGVsYXksXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBmaWx0ZXIsXG4gIGZpcnN0LFxuICBtYXAsXG4gIG1lcmdlTWFwLFxuICBzdGFydFdpdGgsXG4gIHN3aXRjaE1hcCxcbiAgdGFrZSxcbiAgdGFrZVVudGlsLFxuICB0YXBcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlIH0gZnJvbSAnLi4vYWxlcnQvYWxlcnQuc2VydmljZSc7XG5pbXBvcnQgeyBFbXB0eVN0YXRlQ29udGV4dERpcmVjdGl2ZSB9IGZyb20gJy4uL2NvbW1vbi9lbXB0eS1zdGF0ZS9lbXB0eS1zdGF0ZS1jb250ZXh0LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyB0b09ic2VydmFibGUgfSBmcm9tICcuLi9jb21tb24vZXh0ZW5zaW9uLWhvb2tzJztcbmltcG9ydCB7IExvYWRNb3JlQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tbW9uL2xvYWQtbW9yZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTG9hZE1vcmVNb2RlIH0gZnJvbSAnLi4vY29tbW9uL2xvYWQtbW9yZS5tb2RlbCc7XG5pbXBvcnQgeyBnZXR0ZXh0IH0gZnJvbSAnLi4vaTE4bi9nZXR0ZXh0JztcbmltcG9ydCB7IFBvcG92ZXJDb25maXJtQnV0dG9ucywgUG9wb3ZlckNvbmZpcm1Db21wb25lbnQgfSBmcm9tICcuLi9tb2RhbC9wb3BvdmVyLWNvbmZpcm0uY29tcG9uZW50JztcbmltcG9ydCB7IEdhaW5zaWdodFNlcnZpY2UgfSBmcm9tICcuLi9wcm9kdWN0LWV4cGVyaWVuY2UvZ2FpbnNpZ2h0LnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgUFJPRFVDVF9FWFBFUklFTkNFX0VWRU5UX1NPVVJDRSxcbiAgUHJvZHVjdEV4cGVyaWVuY2VFdmVudCxcbiAgUHJvZHVjdEV4cGVyaWVuY2VFdmVudFNvdXJjZVxufSBmcm9tICcuLi9wcm9kdWN0LWV4cGVyaWVuY2UvcHJvZHVjdC1leHBlcmllbmNlLm1vZGVsJztcbmltcG9ydCB7IEFjdGlvbkNvbnRyb2xzRXh0ZW5zaW9uU2VydmljZSB9IGZyb20gJy4vYWN0aW9uLWNvbnRyb2xzLWV4dGVuc2lvbi5zZXJ2aWNlJztcbmltcG9ydCB7IENlbGxSZW5kZXJlclNwZWMgfSBmcm9tICcuL2NvbHVtbi9jZWxsLXJlbmRlcmVyJztcbmltcG9ydCB7IENvbHVtbkRpcmVjdGl2ZSB9IGZyb20gJy4vY29sdW1uL2NvbHVtbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQ3VzdG9tQ29sdW1uIH0gZnJvbSAnLi9jb2x1bW4vY3VzdG9tLmNvbHVtbic7XG5pbXBvcnQgeyBFeHBhbmRhYmxlUm93Q29sdW1uIH0gZnJvbSAnLi9jb2x1bW4vZXhwYW5kYWJsZS1yb3ctY29sdW1uL2V4cGFuZGFibGUuZGF0YS1ncmlkLWNvbHVtbic7XG5pbXBvcnQgeyBGaWx0ZXJpbmdGb3JtUmVuZGVyZXJTcGVjLCBGaWx0ZXJpbmdNb2RpZmllciB9IGZyb20gJy4vY29sdW1uL2ZpbHRlcmluZy1mb3JtLXJlbmRlcmVyJztcbmltcG9ydCB7IENvbmZpZ3VyZUN1c3RvbUNvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4vY29uZmlndXJlLWN1c3RvbS1jb2x1bW4nO1xuaW1wb3J0IHtcbiAgREFUQV9HUklEX0NPTkZJR1VSQVRJT05fU1RSQVRFR1ksXG4gIERhdGFHcmlkQ29uZmlndXJhdGlvblN0cmF0ZWd5LFxuICBHcmlkQ29uZmlnQ29udGV4dCxcbiAgR3JpZENvbmZpZ1BhcnQsXG4gIEdyaWRFdmVudFR5cGVcbn0gZnJvbSAnLi9kYXRhLWdyaWQtY29uZmlndXJhdGlvbi5tb2RlbCc7XG5pbXBvcnQge1xuICBBY3Rpb25Db250cm9sLFxuICBBY3Rpb25Db250cm9sSG9vayxcbiAgQnVpbHRJbkFjdGlvblR5cGUsXG4gIEJ1bGtBY3Rpb25Db250cm9sLFxuICBDb2x1bW4sXG4gIENvbHVtbkNvbmZpZyxcbiAgQ29sdW1uRGF0YVR5cGUsXG4gIEN1c3RvbUNvbHVtbkNvbmZpZyxcbiAgRGF0YUdyaWQsXG4gIERhdGFTb3VyY2VTdGF0cyxcbiAgRGlzcGxheU9wdGlvbnMsXG4gIEZpbHRlcixcbiAgRmlsdGVyQ2hpcCxcbiAgRmlsdGVyaW5nQWN0aW9uVHlwZSxcbiAgR3JpZENvbmZpZyxcbiAgSGVhZGVyQWN0aW9uQ29udHJvbCxcbiAgUGFnaW5hdGlvbixcbiAgUm93LFxuICBTZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrLFxuICBTb3J0T3JkZXIsXG4gIFNwZWNpYWxDb2x1bW5OYW1lLFxuICBtaW5Db2x1bW5HcmlkVHJhY2tTaXplLFxuICByYXRpb3NCeUNvbHVtblR5cGVzXG59IGZyb20gJy4vZGF0YS1ncmlkLm1vZGVsJztcbmltcG9ydCB7IERhdGFHcmlkU2VydmljZSB9IGZyb20gJy4vZGF0YS1ncmlkLnNlcnZpY2UnO1xuaW1wb3J0IHsgRXhwYW5kYWJsZVJvd0RpcmVjdGl2ZSB9IGZyb20gJy4vZXhwYW5kYWJsZS1yb3cuZGlyZWN0aXZlJztcbmltcG9ydCB7IEdyaWREYXRhU291cmNlIH0gZnJvbSAnLi9ncmlkLWRhdGEtc291cmNlJztcbmltcG9ydCB7IFBYX0FDVElPTlMsIFBYX0VWRU5UX05BTUUgfSBmcm9tICcuL3Byb2R1Y3QtZXhwZXJpZW5jZS5jb25zdGFudHMnO1xuXG5lbnVtIFNvcnRpbmdPcmRlciB7XG4gIEFTQyA9ICdhc2MnLFxuICBERVNDID0gJ2Rlc2MnXG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1kYXRhLWdyaWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS1ncmlkLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDogeyBjbGFzczogJ2QtY29udGVudHMnIH0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IFBST0RVQ1RfRVhQRVJJRU5DRV9FVkVOVF9TT1VSQ0UsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEYXRhR3JpZENvbXBvbmVudClcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgRGF0YUdyaWRDb21wb25lbnRcbiAgaW1wbGVtZW50cyBEYXRhR3JpZCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBQcm9kdWN0RXhwZXJpZW5jZUV2ZW50U291cmNlXG57XG4gIC8qKiBUaGUgdGl0bGUgZm9yIHRoZSBkYXRhIGdyaWQsIGl0J3MgZGlzcGxheWVkIGluIHRoZSBncmlkJ3MgaGVhZGVyLiAqL1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gZ2V0dGV4dCgnSXRlbXMnKTtcbiAgLyoqIFRoZSBsYWJlbCBmb3IgbG9hZCBtb3JlIGJ1dHRvbi4gKi9cbiAgQElucHV0KCkgbG9hZE1vcmVJdGVtc0xhYmVsOiBzdHJpbmcgPSBnZXR0ZXh0KCdMb2FkIG1vcmUgaXRlbXMnKTtcbiAgLyoqIFRoZSBsYWJlbCBmb3IgbG9hZGluZyBpbmRpY2F0b3IuICovXG4gIEBJbnB1dCgpIGxvYWRpbmdJdGVtc0xhYmVsOiBzdHJpbmcgPSBnZXR0ZXh0KCdMb2FkaW5nIGl0ZW1z4oCmJyk7XG4gIC8qKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGV4dCBzZWFyY2ggaW5wdXQgaXMgc2hvd24gaW4gdGhlIGdyaWQncyBoZWFkZXIuICovXG4gIEBJbnB1dCgpIHNob3dTZWFyY2ggPSBmYWxzZTtcbiAgLyoqIFRha2VzIGFuIGV2ZW50IGVtaXR0ZXIuIFdoZW4gYW4gZXZlbnQgaXMgZW1pdHRlZCwgdGhlIGdyaWQgd2lsbCBiZSByZWxvYWRlZC4gKi9cbiAgQElucHV0KCkgcmVmcmVzaDogRXZlbnRFbWl0dGVyPHZvaWQ+O1xuXG4gIGNvbHVtbnM6IENvbHVtbltdID0gW107XG4gIC8qKiBUaGUgbGlzdCBvZiBjb2x1bW5zIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgZ3JpZC4gKi9cbiAgQElucHV0KCdjb2x1bW5zJylcbiAgX2NvbHVtbnM6IENvbHVtbltdO1xuXG4gIGRhdGFTb3VyY2UgPSBuZXcgR3JpZERhdGFTb3VyY2UoKTtcbiAgcm93czogUm93W107XG4gIC8qKiBUaGUgbGlzdCBvZiByb3dzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgZ3JpZCAodXNlZCBmb3IgY2xpZW50IHNpZGUgZGF0YSkuICovXG4gIEBJbnB1dCgncm93cycpXG4gIHNldCBfcm93cyhyb3dzOiBSb3dbXSkge1xuICAgIHRoaXMucm93cyA9IHJvd3MgfHwgW107XG4gIH1cblxuICBmaWx0ZXJpbmdMYWJlbHNQYXJhbXMgPSB7XG4gICAgZmlsdGVyZWRJdGVtc0NvdW50OiAwLFxuICAgIGFsbEl0ZW1zQ291bnQ6IDBcbiAgfTtcblxuICBwYWdpbmF0aW9uOiBQYWdpbmF0aW9uO1xuICBwYWdpbmF0aW9uTGFiZWxQYXJhbXMgPSB7XG4gICAgcGFnZUZpcnN0SXRlbUlkeDogMCxcbiAgICBwYWdlTGFzdEl0ZW1JZHg6IDAsXG4gICAgaXRlbXNUb3RhbDogMFxuICB9O1xuICBsYXN0Q2xpY2tlZFJvdzogUm93O1xuICByZWFkb25seSBwb3NzaWJsZVBhZ2VTaXplczogbnVtYmVyW10gPSBbMjUsIDUwLCAxMDBdO1xuICByZWFkb25seSBtaW5Qb3NzaWJsZVBhZ2VTaXplID0gTWF0aC5taW4oLi4udGhpcy5wb3NzaWJsZVBhZ2VTaXplcyk7XG4gIC8qKiBQYWdpbmF0aW9uIHNldHRpbmdzLCBlLmcuIGFsbG93cyBmb3Igc2V0dGluZyBjdXJyZW50IHBhZ2Ugb3IgcGFnZSBzaXplLiAqL1xuICBASW5wdXQoJ3BhZ2luYXRpb24nKVxuICBzZXQgX3BhZ2luYXRpb24ocGFnaW5hdGlvbjogUGFnaW5hdGlvbikge1xuICAgIHRoaXMucGFnaW5hdGlvbiA9IHBhZ2luYXRpb247XG4gIH1cblxuICBpbmZpbml0ZVNjcm9sbDogTG9hZE1vcmVNb2RlO1xuICAvKiogU2V0cyBsb2FkIG1vcmUgbW9kZS4gKi9cbiAgQElucHV0KCdpbmZpbml0ZVNjcm9sbCcpXG4gIHNldCBfaW5maW5pdGVTY3JvbGwoaW5maW5pdGVTY3JvbGw6IExvYWRNb3JlTW9kZSkge1xuICAgIHRoaXMuaW5maW5pdGVTY3JvbGwgPSBpbmZpbml0ZVNjcm9sbDtcbiAgfVxuXG4gIHNlcnZlclNpZGVEYXRhQ2FsbGJhY2s6IFNlcnZlclNpZGVEYXRhQ2FsbGJhY2s7XG4gIC8qKlxuICAgKiBTZXRzIGEgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSBpbnZva2VkIHdoZW5ldmVyIGRhdGEgbmVlZHMgdG8gYmUgbG9hZGVkIGZyb20gc2VydmVyLlxuICAgKiBUaGUgZnVuY3Rpb24gc2hvdWxkIHRha2UgW1tEYXRhU291cmNlTW9kaWZpZXJdXSBhbmQgcmV0dXJuIFtbU2VydmVyU2lkZURhdGFSZXN1bHRdXS5cbiAgICovXG4gIEBJbnB1dCgnc2VydmVyU2lkZURhdGFDYWxsYmFjaycpXG4gIHNldCBfc2VydmVyU2lkZURhdGFDYWxsYmFjayhzZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrOiBTZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrKSB7XG4gICAgdGhpcy5zZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrID0gc2VydmVyU2lkZURhdGFDYWxsYmFjaztcbiAgfVxuXG4gIHNlbGVjdGFibGUgPSBmYWxzZTtcbiAgLyoqIERldGVybWluZXMgd2hldGhlciBpdGVtcyBjYW4gYmUgc2VsZWN0ZWQgYnkgY2xpY2tpbmcgYSBjaGVja2JveCBpbiB0aGUgZmlyc3QgY29sdW1uLiAqL1xuICBASW5wdXQoJ3NlbGVjdGFibGUnKVxuICBzZXQgX3NlbGVjdGFibGUoc2VsZWN0YWJsZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2VsZWN0YWJsZSA9IHNlbGVjdGFibGU7XG4gIH1cblxuICBzaW5nbGVTZWxlY3Rpb24gPSBmYWxzZTtcbiAgLyoqIFJlc3RyaWN0cyBzZWxlY3Rpb24gdG8gYSBzaW5nbGUgcm93IG9ubHkuIFNlbGVjdGlvbiBjb2x1bW4gZGlzcGxheXMgcmFkaW8gYnV0dG9uIGluc3RlYWQgb2YgY2hlY2tib3hlcyAqL1xuICBASW5wdXQoJ3NpbmdsZVNlbGVjdGlvbicpXG4gIHNldCBfc2luZ2xlU2VsZWN0aW9uKHNpbmdsZVNlbGVjdGlvbjogYm9vbGVhbikge1xuICAgIHRoaXMuc2luZ2xlU2VsZWN0aW9uID0gc2luZ2xlU2VsZWN0aW9uO1xuICB9XG5cbiAgc2VsZWN0aW9uUHJpbWFyeUtleSA9ICdpZCc7XG4gIC8qKiBEZXRlcm1pbmVzIHdoaWNoIGl0ZW0ncyBwcm9wZXJ0eSB3aWxsIGJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggc2VsZWN0aW9uIHN0YXR1cy4gKi9cbiAgQElucHV0KCdzZWxlY3Rpb25QcmltYXJ5S2V5JylcbiAgc2V0IF9zZWxlY3Rpb25QcmltYXJ5S2V5KHNlbGVjdGlvblByaW1hcnlLZXk6IHN0cmluZykge1xuICAgIHRoaXMuc2VsZWN0aW9uUHJpbWFyeUtleSA9IHNlbGVjdGlvblByaW1hcnlLZXk7XG4gIH1cblxuICBkaXNwbGF5T3B0aW9uczogRGlzcGxheU9wdGlvbnMgPSB7XG4gICAgc3RyaXBlZDogdHJ1ZSxcbiAgICBib3JkZXJlZDogZmFsc2UsXG4gICAgZ3JpZEhlYWRlcjogdHJ1ZSxcbiAgICBmaWx0ZXI6IHRydWUsXG4gICAgaG92ZXI6IHRydWVcbiAgfTtcbiAgLyoqIFNldHMgZGlzcGxheSBvcHRpb25zLiAqL1xuICBASW5wdXQoJ2Rpc3BsYXlPcHRpb25zJylcbiAgc2V0IF9kaXNwbGF5T3B0aW9ucyhkaXNwbGF5T3B0aW9uczogRGlzcGxheU9wdGlvbnMpIHtcbiAgICB0aGlzLmRpc3BsYXlPcHRpb25zID0geyAuLi50aGlzLmRpc3BsYXlPcHRpb25zLCAuLi5kaXNwbGF5T3B0aW9ucyB9O1xuICB9XG5cbiAgYWN0aW9uQ29udHJvbHM6IEFjdGlvbkNvbnRyb2xbXSA9IFtdO1xuICAvKiogU2V0cyBhY3Rpb24gY29udHJvbHMgKGFjdGlvbnMgYXZhaWxhYmxlIGZvciBpbmRpdmlkdWFsIGl0ZW1zKS4gKi9cbiAgQElucHV0KCdhY3Rpb25Db250cm9scycpXG4gIHNldCBfYWN0aW9uQ29udHJvbHMoYWN0aW9uQ29udHJvbHM6IEFjdGlvbkNvbnRyb2xbXSkge1xuICAgIHRoaXMuYWN0aW9uQ29udHJvbHNJbnB1dCQubmV4dChhY3Rpb25Db250cm9scyk7XG4gIH1cblxuICBidWxrQWN0aW9uQ29udHJvbHM6IEJ1bGtBY3Rpb25Db250cm9sW107XG4gIC8qKiBTZXRzIGJ1bGsgYWN0aW9uIGNvbnRyb2xzIChhY3Rpb25zIGF2YWlsYWJsZSBmb3IgaXRlbXMgc2VsZWN0ZWQgYnkgdXNlcikuICovXG4gIEBJbnB1dCgnYnVsa0FjdGlvbkNvbnRyb2xzJylcbiAgc2V0IF9idWxrQWN0aW9uQ29udHJvbHMoYnVsa0FjdGlvbkNvbnRyb2xzOiBCdWxrQWN0aW9uQ29udHJvbFtdKSB7XG4gICAgdGhpcy5idWxrQWN0aW9uQ29udHJvbHMgPSBidWxrQWN0aW9uQ29udHJvbHMgfHwgW107XG4gIH1cblxuICBoZWFkZXJBY3Rpb25Db250cm9sczogSGVhZGVyQWN0aW9uQ29udHJvbFtdO1xuICAvKiogU2V0cyBoZWFkZXIgYWN0aW9uIGNvbnRyb2xzIChhY3Rpb25zIGF2YWlsYWJsZSBmcm9tIGRhdGEgZ3JpZCBoZWFkZXIpLiAqL1xuICBASW5wdXQoJ2hlYWRlckFjdGlvbkNvbnRyb2xzJylcbiAgc2V0IF9oZWFkZXJBY3Rpb25Db250cm9scyhoZWFkZXJBY3Rpb25Db250cm9sczogSGVhZGVyQWN0aW9uQ29udHJvbFtdKSB7XG4gICAgdGhpcy5oZWFkZXJBY3Rpb25Db250cm9scyA9IGhlYWRlckFjdGlvbkNvbnRyb2xzIHx8IFtdO1xuICB9XG5cbiAgLyoqIFNldHMgaW5pdGlhbCBzZWFyY2ggdGV4dC4gKi9cbiAgQElucHV0KClcbiAgc2VhcmNoVGV4dCA9ICcnO1xuXG4gIC8qKiBEZXRlcm1pbmVzIGlmIGN1c3RvbSBjb2x1bW5zIGJ1dHRvbiB3aWxsIGJlIGVuYWJsZWQuICovXG4gIEBJbnB1dCgpXG4gIGNvbmZpZ3VyZUNvbHVtbnNFbmFibGVkID0gdHJ1ZTtcblxuICAvKiogU2hvd3MgdGhlIHdhcm5pbmcgZm9yIHRoZSBzdWItYXNzZXRzIGNvdW50ZXIgKi9cbiAgQElucHV0KClcbiAgc2hvd0NvdW50ZXJXYXJuaW5nID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGNsYXNzIG5hbWUgdXNlZCBmb3IgYWN0aXZlIHJvd3MgKGxhc3QgY2xpY2tlZCkuXG4gICAqIFNldCBlbXB0eSBzdHJpbmcgdG8gZGlzYWJsZSBhcHBlbmRpbmcgYWN0aXZlIGNsYXNzIHRvIGdyaWQgcm93cy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGFjdGl2ZUNsYXNzTmFtZSA9ICdhY3RpdmUnO1xuXG4gIC8qKiBEZXRlcm1pbmVzIGlmIHRoZSByb3dzIG9mIHRoZSBkYXRhIGdyaWQgd2lsbCBiZSBleHBhbmRhYmxlLlxuICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAqIC0gYE5PTkVgIC0gbm8gZXhwYW5kYWJsZSByb3dzIChkZWZhdWx0IHZhbHVlKVxuICAgKiAtIGBTWU5DYCAtIGFkZGl0aW9uYWwgY29sdW1uIHdpdGggZXhwYW5kIGJ1dHRvbiBpcyBkaXNwbGF5ZWQgYW5kIGV4cGFuZGFibGUgcm93cyBhcmUgZXhwYW5kaW5nIHN5bmNocm9ub3VzbHkgd2hlbiBidXR0b24gaXMgY2xpY2tlZFxuICAgKiAtIGBBU1lOQ2AgLSBhZGRpdGlvbmFsIGNvbHVtbiB3aXRoIGV4cGFuZCBidXR0b24gaXMgZGlzcGxheWVkIGFuZCBleHBhbmRhYmxlIHJvd3MgYXJlIGV4cGFuZGluZyBhc3luY2hyb25vdXNseSB3aGVuIGJ1dHRvbiBpcyBjbGlja2VkXG4gICAqL1xuICBASW5wdXQoKSBleHBhbmRhYmxlUm93czogJ05PTkUnIHwgJ1NZTkMnIHwgJ0FTWU5DJyA9ICdOT05FJztcblxuICAvKiogRGV0ZXJtaW5lcyBpZiB0aGUgUmVsb2FkIGJ1dHRvbiB3aWxsIGJlIGhpZGRlbi4gKi9cbiAgQElucHV0KCkgaGlkZVJlbG9hZCA9IGZhbHNlO1xuXG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIG1vdXNlIGlzIG92ZXIgYSByb3cuICovXG4gIEBPdXRwdXQoKSByb3dNb3VzZU92ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPG9iamVjdD4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gbW91c2UgbGVhdmVzIGEgcm93LiAqL1xuICBAT3V0cHV0KCkgcm93TW91c2VMZWF2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8b2JqZWN0PigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBhIHJvdyBpcyBjbGlja2VkLiAqL1xuICBAT3V0cHV0KCkgcm93Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPG9iamVjdD4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gZ3JpZCdzIGNvbmZpZ3VyYXRpb24gaXMgY2hhbmdlZC4gKi9cbiAgQE91dHB1dCgpIG9uQ29uZmlnQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxHcmlkQ29uZmlnPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgYmVmb3JlIHRoZSBmaWx0ZXIgaXMgYXBwbGllZC4gKi9cbiAgQE91dHB1dCgpIG9uQmVmb3JlRmlsdGVyID0gbmV3IEV2ZW50RW1pdHRlcjxvYmplY3Q+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCBiZWZvcmUgdGhlIHNlYXJjaCBpcyBwZXJmb3JtZWQuICovXG4gIEBPdXRwdXQoKSBvbkJlZm9yZVNlYXJjaCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBhIGZpbHRlciBpcyBhcHBsaWVkIGluIGEgY29sdW1uLiAqL1xuICBAT3V0cHV0KCkgb25GaWx0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICBjb2x1bW5OYW1lPzogc3RyaW5nO1xuICAgIGRyb3Bkb3duPzogQnNEcm9wZG93bkRpcmVjdGl2ZTtcbiAgICBmaWx0ZXJpbmdNb2RpZmllcj86IEZpbHRlcjtcbiAgfT4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gaXRlbXMgc2VsZWN0aW9uIGNoYW5nZXMuIFRoZSBhcnJheSBjb250YWlucyBrZXlzIG9mIHNlbGVjdGVkIGl0ZW1zIChrZXkgcHJvcGVydHkgaXMgZGVmaW5lZCBieSBgc2VsZWN0aW9uUHJpbWFyeUtleWApLiAqL1xuICBAT3V0cHV0KCkgaXRlbXNTZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZ1tdPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiByZWxvYWQgYnV0dG9uIGlzIGNsaWNrZWQuICovXG4gIEBPdXRwdXQoKSBvblJlbG9hZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gYSBjdXN0b20gY29sdW1uIGlzIGFkZGVkICovXG4gIEBPdXRwdXQoKSBvbkFkZEN1c3RvbUNvbHVtbiA9IG5ldyBFdmVudEVtaXR0ZXI8Q3VzdG9tQ29sdW1uQ29uZmlnPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBhIGN1c3RvbSBjb2x1bW4gaXMgcmVtb3ZlZCAqL1xuICBAT3V0cHV0KCkgb25SZW1vdmVDdXN0b21Db2x1bW4gPSBuZXcgRXZlbnRFbWl0dGVyPENvbHVtbj4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IGFmdGVyIHRoZSBjb2x1bW4gZmlsdGVyIGhhcyBiZWVuIHJlc2V0ICovXG4gIEBPdXRwdXQoKSBvbkNvbHVtbkZpbHRlclJlc2V0ID0gbmV3IEV2ZW50RW1pdHRlcjxDb2x1bW4+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIGNvbHVtbiBzb3J0aW5nIGhhcyBiZWVuIGNoYW5nZWQgKi9cbiAgQE91dHB1dCgpIG9uU29ydCA9IG5ldyBFdmVudEVtaXR0ZXI8R3JpZENvbmZpZz4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gcGFnZSBzaXplIGhhcyBiZWVuIGNoYW5nZWQgKi9cbiAgQE91dHB1dCgpIG9uUGFnZVNpemVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEdyaWRDb25maWc+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIGNvbHVtbiBvcmRlciBoYXMgYmVlbiBjaGFuZ2VkICovXG4gIEBPdXRwdXQoKSBvbkNvbHVtblJlb3JkZXJlZCA9IG5ldyBFdmVudEVtaXR0ZXI8R3JpZENvbmZpZz4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gY29sdW1uIG9yZGVyIGhhcyBiZWVuIGNoYW5nZWQgKi9cbiAgQE91dHB1dCgpIG9uQ29sdW1uVmlzaWJpbGl0eUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8R3JpZENvbmZpZz4oKTtcblxuICBAQ29udGVudENoaWxkcmVuKENvbHVtbkRpcmVjdGl2ZSkgY29sdW1uUmVuZGVyZXJzOiBRdWVyeUxpc3Q8Q29sdW1uRGlyZWN0aXZlPjtcblxuICBAQ29udGVudENoaWxkKEV4cGFuZGFibGVSb3dEaXJlY3RpdmUpXG4gIGV4cGFuZGFibGVSb3c6IEV4cGFuZGFibGVSb3dEaXJlY3RpdmU7XG5cbiAgQFZpZXdDaGlsZCgnc2Nyb2xsJywgeyBzdGF0aWM6IHRydWUgfSkgc2Nyb2xsQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuXG4gIEBWaWV3Q2hpbGQoJ2luZmluaXRlU2Nyb2xsQ29udGFpbmVyJywgeyBzdGF0aWM6IGZhbHNlLCByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXG4gIGluZmluaXRlU2Nyb2xsQ29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gIEBDb250ZW50Q2hpbGQoRW1wdHlTdGF0ZUNvbnRleHREaXJlY3RpdmUpIGVtcHR5U3RhdGU6IEVtcHR5U3RhdGVDb250ZXh0RGlyZWN0aXZlO1xuXG4gIGxvYWRNb3JlQ29tcG9uZW50OiBMb2FkTW9yZUNvbXBvbmVudDtcblxuICBjb2x1bW5OYW1lcyA9IFtdO1xuXG4gIHN0eWxlcyA9IHtcbiAgICB0YWJsZUN1cnNvcjogJ2F1dG8nLFxuICAgIGdyaWRUZW1wbGF0ZUNvbHVtbnM6IHVuZGVmaW5lZCxcbiAgICBncmlkSW5maW5pdGVTY3JvbGxDb2x1bW46IHVuZGVmaW5lZFxuICB9O1xuXG4gIHNlYXJjaFRleHQkID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIGZpbHRlcmluZ0FwcGxpZWQgPSBmYWxzZTtcbiAgY29sdW1uc1dpdGhGaWx0ZXJzQXBwbGllZDogQ29sdW1uW10gPSBbXTtcblxuICB0b3RhbFBhZ2VzQ291bnQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KEluZmluaXR5KTtcbiAgaGlkZVBhZ2luYXRpb24kID0gdGhpcy50b3RhbFBhZ2VzQ291bnQkLnBpcGUoXG4gICAgbWFwKHRvdGFsUGFnZXNDb3VudCA9PiB0b3RhbFBhZ2VzQ291bnQgPD0gMSksXG4gICAgZGVsYXkoMCkgLy8gcHJldmVudHMgRXhwcmVzc2lvbkNoYW5nZWRBZnRlckl0SGFzQmVlbkNoZWNrZWRFcnJvclxuICApO1xuXG4gIHNlbGVjdGVkSXRlbUlkczogc3RyaW5nW10gPSBbXTtcbiAgY3VycmVudFBhZ2VTZWxlY3Rpb25TdGF0ZSA9IHtcbiAgICBhbGxTZWxlY3RlZDogZmFsc2UsXG4gICAgYWxsRGVzZWxlY3RlZDogdHJ1ZVxuICB9O1xuXG4gIGJ1aWx0SW5BY3Rpb25UeXBlID0ge1xuICAgIEVkaXQ6IEJ1aWx0SW5BY3Rpb25UeXBlLkVkaXQsXG4gICAgRGVsZXRlOiBCdWlsdEluQWN0aW9uVHlwZS5EZWxldGUsXG4gICAgRXhwb3J0OiBCdWlsdEluQWN0aW9uVHlwZS5FeHBvcnRcbiAgfTtcblxuICBjb25maXJtUmVtb3ZlQ29sdW1uQnV0dG9uczogUG9wb3ZlckNvbmZpcm1CdXR0b25zW10gPSBbXG4gICAge1xuICAgICAgbGFiZWw6IGdldHRleHQoJ0NhbmNlbCcpLFxuICAgICAgYWN0aW9uOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoZmFsc2UpXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogZ2V0dGV4dCgnUmVtb3ZlYGNvbHVtbix2ZXJiYCcpLFxuICAgICAgc3RhdHVzOiAnZGFuZ2VyJyxcbiAgICAgIGFjdGlvbjogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHRydWUpXG4gICAgfVxuICBdO1xuXG4gIGlzQ29uZmlnQ29udGV4dEtub3duID0gZmFsc2U7XG4gIGVtcHR5U3RhdGVDb250ZXh0JDogT2JzZXJ2YWJsZTxEYXRhU291cmNlU3RhdHM+O1xuXG4gIC8qKlxuICAgKiBBIG1hcCBvZiByb3dzIHdoaWNoIGhhdmUgYmVlbiBleHBhbmRlZC5cbiAgICovXG4gIGV4cGFuZGVkUm93czogTWFwPFJvdywgeyB2aXNpYmxlJDogU3ViamVjdDxib29sZWFuPiB8IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiB9PiA9IG5ldyBNYXAoKTtcblxuICAvKiogUHJvZHVjdCBleHBlcmllbmNlIGNvbnN0YW50cyBkZWNsYXJhdGlvbnMgKi9cbiAgcHJvZHVjdEV4cGVyaWVuY2VFdmVudDogUHJvZHVjdEV4cGVyaWVuY2VFdmVudCA9IHsgZXZlbnROYW1lOiBQWF9FVkVOVF9OQU1FIH07XG4gIFBYX0FDVElPTlMgPSBQWF9BQ1RJT05TO1xuXG4gIHJlYWRvbmx5IHNvcnRDb2x1bW5UaXRsZSA9IGdldHRleHQoJ1NvcnQgY29sdW1uIFwie3sgbmFtZSB9fVwiJyk7XG5cbiAgcmVzaXplSGFuZGxlTW91c2VEb3duJCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBldmVudDogTW91c2VFdmVudDsgdGFyZ2V0Q29sdW1uTmFtZTogc3RyaW5nIH0+KCk7XG4gIHJlc2l6ZUhhbmRsZUNvbnRhaW5lck1vdXNlTW92ZSQgPSBuZXcgRXZlbnRFbWl0dGVyPE1vdXNlRXZlbnQ+KCk7XG4gIHJlc2l6ZUhhbmRsZUNvbnRhaW5lck1vdXNlVXAkID0gbmV3IEV2ZW50RW1pdHRlcjxNb3VzZUV2ZW50PigpO1xuXG4gIGZpbHRlcnNIZWxwUG9wb3Zlckh0bWw6IHN0cmluZyA9IGdldHRleHQoJ0NsaWNrIHRoZSBjb2x1bW4gaGVhZGVycyB0byBhcHBseSBmaWx0ZXJzLicpO1xuXG4gIHByaXZhdGUgaGVhZGVyQmVpbmdSZXNpemVkOiB7XG4gICAgY29sdW1uTmFtZTogc3RyaW5nO1xuICAgIGVsOiBIVE1MRWxlbWVudDtcbiAgfTtcbiAgQFZpZXdDaGlsZHJlbihDZGtIZWFkZXJDZWxsLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgcHJpdmF0ZSB0aFJlZnM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcbiAgcHJpdmF0ZSB0aEVsczogSFRNTEVsZW1lbnRbXTtcblxuICBAVmlld0NoaWxkKENka1RhYmxlLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgdGFibGVSZWY6IENka1RhYmxlPGFueT47XG5cbiAgcHJpdmF0ZSByZWNyZWF0ZUxvYWRNb3JlQ29tcG9uZW50OiBib29sZWFuO1xuXG4gIHByaXZhdGUgY29sdW1uc0luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBkZWZhdWx0Q29sdW1uczogQ29sdW1uW10gPSBbXTtcblxuICBwcml2YXRlIHJlbG9hZENvbmZpZ3VyYXRpb24kOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcblxuICBwcml2YXRlIGFjdGlvbkNvbnRyb2xzSW5wdXQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBY3Rpb25Db250cm9sW10+KFtdKTtcblxuICBwcml2YXRlIHVuc3Vic2NyaWJlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSBtYW51YWxTZWFyY2gkID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuXG4gIHByaXZhdGUgbGFzdE1hbnVhbFNlYXJjaFZhbHVlID0gJyc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBTRUFSQ0hfREVCT1VOQ0VfVElNRSA9IDUwMDtcblxuICAvKipcbiAgICogRXZlbnQgZW1pdHRlciwgdGFraW5nIGJvb2xlYW4gdmFsdWVzIHVzZWQgZm9yIGxvYWRpbmcgZGF0YSBncmlkIGRhdGEgd2l0aCBkZWJvdW5jZS5cbiAgICogRGVmYXVsdCB2YWx1ZSBpcyBzZXQgdG8gZmFsc2UuIFNldCB0byB0cnVlIGlmIGRhdGEgZ3JpZCBpcyB1c2luZyBpbmZpbml0ZSBzY3JvbGwgYW5kIHBhZ2Ugc2hvdWxkIGJlIHJlbG9hZGVkLlxuICAgKiBUaGlzIGlzIHVzZWQgdG8gYXZvaWQgaGF2aW5nIG11bHRpcGxlIHRoaXMubG9hZERhdGEoKSBmdW5jdGlvbiBjYWxscy5cbiAgICovXG4gIHByaXZhdGUgdHJpZ2dlckxvYWREYXRhID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpXG4gICAgQEluamVjdChEQVRBX0dSSURfQ09ORklHVVJBVElPTl9TVFJBVEVHWSlcbiAgICBwdWJsaWMgY29uZmlndXJhdGlvblN0cmF0ZWd5OiBEYXRhR3JpZENvbmZpZ3VyYXRpb25TdHJhdGVneSxcbiAgICBwcml2YXRlIGRhdGFHcmlkU2VydmljZTogRGF0YUdyaWRTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgcHJpdmF0ZSBnYWluc2lnaHRTZXJ2aWNlOiBHYWluc2lnaHRTZXJ2aWNlLFxuICAgIHByaXZhdGUgYnNNb2RhbFNlcnZpY2U6IEJzTW9kYWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWxlcnRTZXJ2aWNlOiBBbGVydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhY3Rpb25Db250cm9sc1NlcnZpY2U6IEFjdGlvbkNvbnRyb2xzRXh0ZW5zaW9uU2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVxuICApIHtcbiAgICB0aGlzLnRyaWdnZXJMb2FkRGF0YS5waXBlKGRlYm91bmNlVGltZSgxKSwgdGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSkuc3Vic2NyaWJlKHJlbG9hZCA9PiB7XG4gICAgICB0aGlzLmxvYWREYXRhKHJlbG9hZCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlbG9hZENvbmZpZ3VyYXRpb24kXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5Py5nZXRDb25maWckKCkgPz8gb2YobnVsbCkpLFxuICAgICAgICB0YXAoY29uZmlnID0+IHtcbiAgICAgICAgICB0aGlzLnNldENvbHVtbnMoY29uZmlnKTtcbiAgICAgICAgICB0aGlzLnNldFBhZ2VTaXplKGNvbmZpZyk7XG4gICAgICAgICAgdGhpcy50cmlnZ2VyTG9hZERhdGEuZW1pdCghIXRoaXMuaW5maW5pdGVTY3JvbGwpO1xuICAgICAgICB9KSxcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuZGF0YVNvdXJjZS5zdGF0cyQpLFxuICAgICAgICB0YXAoc3RhdHMgPT4ge1xuICAgICAgICAgIHRoaXMuY3JlYXRlTG9hZE1vcmVDb21wb25lbnQoc3RhdHMpO1xuICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nTGFiZWxzUGFyYW1zKHN0YXRzKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVBhZ2luYXRpb25MYWJlbFBhcmFtcyhzdGF0cyk7XG4gICAgICAgICAgdGhpcy51cGRhdGVQYWdpbmF0aW9uV2hlbk5vRGV2aWNlc0xhc3RQYWdlKHN0YXRzKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaXNDb25maWdDb250ZXh0S25vd24gPSAhIXRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5Py5pc0NvbnRleHRLbm93bigpO1xuXG4gICAgdGhpcy5zZXR1cFNlYXJjaE9ic2VydmFibGVzKCk7XG5cbiAgICBpZiAodGhpcy5zZWxlY3RhYmxlKSB7XG4gICAgICBjb21iaW5lTGF0ZXN0KHRoaXMuZGF0YVNvdXJjZS5kYXRhJCwgdGhpcy5pdGVtc1NlbGVjdC5hc09ic2VydmFibGUoKSlcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSlcbiAgICAgICAgLnN1YnNjcmliZSgoW2RhdGFdKSA9PiB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFBhZ2VFbXB0eSA9IGRhdGEubGVuZ3RoID09PSAwO1xuXG4gICAgICAgICAgdGhpcy5jdXJyZW50UGFnZVNlbGVjdGlvblN0YXRlID0ge1xuICAgICAgICAgICAgYWxsU2VsZWN0ZWQ6IGN1cnJlbnRQYWdlRW1wdHkgPyBmYWxzZSA6IGRhdGEuZXZlcnkoaXRlbSA9PiB0aGlzLmlzSXRlbVNlbGVjdGVkKGl0ZW0pKSxcbiAgICAgICAgICAgIGFsbERlc2VsZWN0ZWQ6IGN1cnJlbnRQYWdlRW1wdHkgPyB0cnVlIDogZGF0YS5ldmVyeShpdGVtID0+ICF0aGlzLmlzSXRlbVNlbGVjdGVkKGl0ZW0pKVxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMucmVsb2FkQ29uZmlndXJhdGlvbiQubmV4dCgpO1xuXG4gICAgdGhpcy5hY3Rpb25Db250cm9sc1NlcnZpY2UuaXRlbXMkXG4gICAgICAucGlwZShcbiAgICAgICAgc3RhcnRXaXRoKFtdKSxcbiAgICAgICAgc3dpdGNoTWFwKChob29rczogQWN0aW9uQ29udHJvbEhvb2tbXSkgPT5cbiAgICAgICAgICBmb3JrSm9pbihcbiAgICAgICAgICAgIGhvb2tzLm1hcChob29rID0+XG4gICAgICAgICAgICAgIHRvT2JzZXJ2YWJsZShcbiAgICAgICAgICAgICAgICBob29rPy5tYXRjaGVzR3JpZFxuICAgICAgICAgICAgICAgICAgPyB0aGlzLnNhZmVseUludm9rZU1hdGNoZXIoXG4gICAgICAgICAgICAgICAgICAgICAgaG9vay5tYXRjaGVzR3JpZCxcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdXRlLFxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5Py5nZXRDb250ZXh0KClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgOiBmYWxzZVxuICAgICAgICAgICAgICApLnBpcGUobWFwKG1hdGNoZXMgPT4gKHsgaG9vaywgbWF0Y2hlcyB9KSkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKS5waXBlKHN0YXJ0V2l0aChbXSkpXG4gICAgICAgICksXG4gICAgICAgIG1hcCgoaG9va3M6IEFycmF5PHsgaG9vazogQWN0aW9uQ29udHJvbEhvb2s7IG1hdGNoZXM6IGJvb2xlYW4gfT4pID0+XG4gICAgICAgICAgaG9va3MuZmlsdGVyKGhvb2sgPT4gaG9vay5tYXRjaGVzKS5tYXAoaG9vayA9PiBob29rLmhvb2spXG4gICAgICAgICksXG4gICAgICAgIG1hcCgoaG9va3M6IEFjdGlvbkNvbnRyb2xIb29rW10pID0+XG4gICAgICAgICAgaG9va3MucmVkdWNlKChhY3Rpb25Db250cm9sczogQWN0aW9uQ29udHJvbFtdLCBjdXJyZW50SG9vazogQWN0aW9uQ29udHJvbEhvb2spID0+IHtcbiAgICAgICAgICAgIHJldHVybiBbLi4uYWN0aW9uQ29udHJvbHMsIC4uLmNhc3RBcnJheShjdXJyZW50SG9vay5hY3Rpb25Db250cm9scyldO1xuICAgICAgICAgIH0sIFtdKVxuICAgICAgICApLFxuICAgICAgICBjb21iaW5lTGF0ZXN0V2l0aCh0aGlzLmFjdGlvbkNvbnRyb2xzSW5wdXQkKSxcbiAgICAgICAgdGFwKFxuICAgICAgICAgIChbaG9va0NvbnRyb2xzLCBpbnB1dENvbnRyb2xzXSkgPT5cbiAgICAgICAgICAgICh0aGlzLmFjdGlvbkNvbnRyb2xzID0gWy4uLmlucHV0Q29udHJvbHMsIC4uLmhvb2tDb250cm9sc10pXG4gICAgICAgICksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIGlmICh0aGlzLnJlZnJlc2gpIHtcbiAgICAgIHRoaXMucmVmcmVzaC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuY2FuY2VsKCk7XG4gICAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnByb2Nlc3NBbmRQZXJzaXN0Q29uZmlnQ2hhbmdlKCk7XG4gICAgdGhpcy51cGRhdGVDb2x1bW5zKCk7XG5cbiAgICAvLyBSZXNldHRpbmcgdGhlIHN0YXRzIHNpemUgdG8gMCB3aGVuIG1hbmFnZWQgb2JqZWN0cyBhcmUgZGVsZXRlZCBidXQgc2l6aW5nIG5vdCB5ZXQgdXBkYXRlZFxuICAgIC8vIFRPRE8gcmVtb3ZlIGFmdGVyIE1UTS02MDIyNiBpcyByZXNvbHZlZFxuICAgIHRoaXMuZW1wdHlTdGF0ZUNvbnRleHQkID0gY29tYmluZUxhdGVzdChbdGhpcy5kYXRhU291cmNlLnN0YXRzJCwgdGhpcy5kYXRhU291cmNlLmRhdGEkXSkucGlwZShcbiAgICAgIG1hcCgoW3N0YXRzLCBkYXRhXSkgPT4ge1xuICAgICAgICBpZiAoc3RhdHMuZmlsdGVyZWRTaXplID09PSAxICYmIGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHsgLi4uc3RhdHMsIHNpemU6IDAsIGZpbHRlcmVkU2l6ZTogMCB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGF0cztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHNldEV4cGFuZGFibGVSb3dWaXNpYmxlKHJvdzogUm93LCBzdWNjZXNzOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgIHRoaXMuZXhwYW5kZWRSb3dzLmdldChyb3cpLnZpc2libGUkLm5leHQodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXhwYW5kZWRSb3dzLmdldChyb3cpLnZpc2libGUkLm5leHQoZmFsc2UpO1xuICAgICAgdGhpcy5leHBhbmRlZFJvd3MuZGVsZXRlKHJvdyk7XG4gICAgICB0aGlzLnRhYmxlUmVmLnJlbmRlclJvd3MoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhldmVudCkge1xuICAgIGlmIChcbiAgICAgICgoIWV2ZW50Ll9hY3Rpb25Db250cm9scyAmJiAhZXZlbnQuc2VhcmNoVGV4dCkgfHwgZXZlbnQuX2FjdGlvbkNvbnRyb2xzPy5maXJzdENoYW5nZSkgJiZcbiAgICAgIHRoaXMuY29sdW1uc0luaXRpYWxpemVkXG4gICAgKSB7XG4gICAgICBjb25zdCByZWxvYWQgPSAhIWV2ZW50Ll9pbmZpbml0ZVNjcm9sbD8uY3VycmVudFZhbHVlICYmICFldmVudC5faW5maW5pdGVTY3JvbGw/LmZpcnN0Q2hhbmdlO1xuICAgICAgdGhpcy50cmlnZ2VyTG9hZERhdGEuZW1pdChyZWxvYWQpO1xuICAgIH1cbiAgICBpZiAoISFldmVudC5fY29sdW1ucyAmJiAhZXZlbnQuX2NvbHVtbnMuZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMucmVsb2FkQ29uZmlndXJhdGlvbiQubmV4dCgpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUNvbHVtbnMoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnVwZGF0ZUdyaWRDb2x1bW5zU2l6ZSgpO1xuICAgIHRoaXMudXBkYXRlVGhFbHMoKTtcbiAgICB0aGlzLnNldHVwUmVzaXplSGFuZGxlKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlJC5uZXh0KCk7XG4gICAgdGhpcy51bnN1YnNjcmliZSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIGV4cGFuZChyb3c6IFJvdykge1xuICAgIGNvbnN0IGlzU3luY0V4cGFuZCA9IHRoaXMuZXhwYW5kYWJsZVJvd3MgPT09ICdTWU5DJztcbiAgICBsZXQgdmlzaWJsZVN1YmplY3Q6IFN1YmplY3Q8Ym9vbGVhbj4gfCBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj47XG4gICAgaWYgKGlzU3luY0V4cGFuZCkge1xuICAgICAgdmlzaWJsZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2aXNpYmxlU3ViamVjdCA9IG5ldyBTdWJqZWN0KCk7XG4gICAgfVxuICAgIHRoaXMuZXhwYW5kZWRSb3dzLnNldChyb3csIHsgdmlzaWJsZSQ6IHZpc2libGVTdWJqZWN0IH0pO1xuICAgIHRoaXMudGFibGVSZWYucmVuZGVyUm93cygpO1xuICAgIHJldHVybiB2aXNpYmxlU3ViamVjdDtcbiAgfVxuXG4gIGNvbGxhcHNlKHJvdzogUm93KTogdm9pZCB7XG4gICAgdGhpcy5leHBhbmRlZFJvd3MuZGVsZXRlKHJvdyk7XG4gICAgdGhpcy50YWJsZVJlZi5yZW5kZXJSb3dzKCk7XG4gIH1cblxuICBpc1Jvd0V4cGFuZGVkID0gKF8sIHJvdzogUm93KTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuICEhdGhpcy5leHBhbmRlZFJvd3MuZ2V0KHJvdyk7XG4gIH07XG5cbiAgc2V0Q29sdW1ucyhjb25maWc6IEdyaWRDb25maWcpIHtcbiAgICBpZiAoISF0aGlzLmNvbmZpZ3VyYXRpb25TdHJhdGVneSAmJiAhaXNFbXB0eSh0aGlzLl9jb2x1bW5zKSkge1xuICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5kYXRhR3JpZFNlcnZpY2UuYXBwbHlDb25maWdUb0NvbHVtbnMoY29uZmlnLCB0aGlzLl9jb2x1bW5zKTtcbiAgICAgIHRoaXMuY29sdW1uc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5fY29sdW1ucyB8fCBbXTtcbiAgICAgIHRoaXMuY29sdW1uc0luaXRpYWxpemVkID0gdGhpcy5jb2x1bW5zSW5pdGlhbGl6ZWQgfHwgISF0aGlzLl9jb2x1bW5zO1xuICAgIH1cblxuICAgIHRoaXMuZGVmYXVsdENvbHVtbnMgPSB0aGlzLmNvbHVtbnMgfHwgW107XG4gICAgdGhpcy51cGRhdGVDb2x1bW5zKCk7XG4gIH1cblxuICBzZXRQYWdlU2l6ZShjb25maWc6IEdyaWRDb25maWcpIHtcbiAgICBpZiAoISFjb25maWc/LnBhZ2luYXRpb24pIHtcbiAgICAgIHRoaXMucGFnaW5hdGlvbiA9IHtcbiAgICAgICAgLi4udGhpcy5wYWdpbmF0aW9uLFxuICAgICAgICBwYWdlU2l6ZTogY29uZmlnLnBhZ2luYXRpb24ucGFnZVNpemVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgcGFnZVNpemUgPSBnZXQodGhpcy5wYWdpbmF0aW9uLCAncGFnZVNpemUnKTtcbiAgICBpZiAoXG4gICAgICB0aGlzLnBhZ2luYXRpb24gJiZcbiAgICAgICF0aGlzLnBvc3NpYmxlUGFnZVNpemVzLmZpbmQocG9zc2libGVQYWdlU2l6ZSA9PiBwb3NzaWJsZVBhZ2VTaXplID09PSBwYWdlU2l6ZSlcbiAgICApIHtcbiAgICAgIHRoaXMucGFnaW5hdGlvbiA9IHsgLi4udGhpcy5wYWdpbmF0aW9uLCBwYWdlU2l6ZTogdGhpcy5taW5Qb3NzaWJsZVBhZ2VTaXplIH07XG4gICAgfVxuICB9XG5cbiAgb3BlbkN1c3RvbUNvbHVtbk1vZGFsKCk6IHZvaWQge1xuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5ic01vZGFsU2VydmljZS5zaG93KENvbmZpZ3VyZUN1c3RvbUNvbHVtbkNvbXBvbmVudCwge1xuICAgICAgY2xhc3M6ICdtb2RhbC1zbScsXG4gICAgICBhcmlhRGVzY3JpYmVkYnk6ICdtb2RhbC1ib2R5JyxcbiAgICAgIGFyaWFMYWJlbGxlZEJ5OiAnbW9kYWwtdGl0bGUnLFxuICAgICAgaWdub3JlQmFja2Ryb3BDbGljazogdHJ1ZSxcbiAgICAgIGluaXRpYWxTdGF0ZToge1xuICAgICAgICBjb2x1bW5zOiB0aGlzLmNvbHVtbnNcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIG1vZGFsUmVmLmNvbnRlbnQub25BZGRDdXN0b21Db2x1bW5cbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKGN1c3RvbUNvbHVtbkNvbmZpZzogQ3VzdG9tQ29sdW1uQ29uZmlnKSA9PiB7XG4gICAgICAgICAgY29uc3QgZmlyc3RGaXhlZENvbHVtUG9zaXRpb24gPSB0aGlzLmNvbHVtbnMuaW5kZXhPZihcbiAgICAgICAgICAgIHRoaXMuY29sdW1ucy5maW5kKGNvbHVtbiA9PiBjb2x1bW4ucG9zaXRpb25GaXhlZClcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuY29sdW1ucy5zcGxpY2UoXG4gICAgICAgICAgICBmaXJzdEZpeGVkQ29sdW1Qb3NpdGlvbiA+IC0xID8gZmlyc3RGaXhlZENvbHVtUG9zaXRpb24gOiB0aGlzLmNvbHVtbnMubGVuZ3RoLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIG5ldyBDdXN0b21Db2x1bW4oY3VzdG9tQ29sdW1uQ29uZmlnKVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy51cGRhdGVDb2x1bW5zKCk7XG4gICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoe1xuICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkFERF9DVVNUT01fQ09MVU1OLFxuICAgICAgICAgICAgY29sdW1uOiBjdXN0b21Db2x1bW5Db25maWcuaGVhZGVyIHx8IGN1c3RvbUNvbHVtbkNvbmZpZy5uYW1lXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlVW50aWwobW9kYWxSZWYub25IaWRkZW4pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHRoaXMub25BZGRDdXN0b21Db2x1bW4uZW1pdChldmVudCkpO1xuICB9XG5cbiAgYXN5bmMgcmVtb3ZlQ3VzdG9tQ29sdW1uKFxuICAgIHBvQ29uZmlybTogUG9wb3ZlckNvbmZpcm1Db21wb25lbnQsXG4gICAgY29sdW1uOiBDb2x1bW4sXG4gICAgZGRDb25maWd1cmVDb2x1bW5zOiBCc0Ryb3Bkb3duRGlyZWN0aXZlXG4gICkge1xuICAgIGRkQ29uZmlndXJlQ29sdW1ucy5hdXRvQ2xvc2UgPSBmYWxzZTtcbiAgICBwb0NvbmZpcm0ubWVzc2FnZSA9IGdldHRleHQoJ0RvIHlvdSB3YW50IHRvIHJlbW92ZSB0aGlzIGNvbHVtbj8nKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVtb3ZlOiBib29sZWFuID0gYXdhaXQgcG9Db25maXJtLnNob3codGhpcy5jb25maXJtUmVtb3ZlQ29sdW1uQnV0dG9ucyk7XG4gICAgICBpZiAocmVtb3ZlKSB7XG4gICAgICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoY29sID0+IGNvbD8ubmFtZSAhPT0gY29sdW1uPy5uYW1lKTtcbiAgICAgICAgdGhpcy51cGRhdGVDb2x1bW5zKCk7XG4gICAgICAgIHRoaXMub25SZW1vdmVDdXN0b21Db2x1bW4uZW1pdChjb2x1bW4pO1xuICAgICAgICB0aGlzLnRyaWdnZXJFdmVudCh7XG4gICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLlJFTU9WRV9DVVNUT01fQ09MVU1OLFxuICAgICAgICAgIGNvbHVtbjogY29sdW1uLmhlYWRlciB8fCBjb2x1bW4ubmFtZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGUpO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4gKGRkQ29uZmlndXJlQ29sdW1ucy5hdXRvQ2xvc2UgPSB0cnVlKSwgMCk7XG4gIH1cblxuICBhc3luYyByZW1vdmVGaWx0ZXIoZmlsdGVyOiBQYXJ0aWFsPEZpbHRlckNoaXA+KSB7XG4gICAgY29uc3QgZmlsdGVyaW5nTW9kaWZpZXIgPSBmaWx0ZXIuZXh0ZXJuYWxGaWx0ZXJRdWVyeVxuICAgICAgPyB7IGV4dGVybmFsRmlsdGVyUXVlcnk6IGZpbHRlci5leHRlcm5hbEZpbHRlclF1ZXJ5IH1cbiAgICAgIDogeyBmaWx0ZXJQcmVkaWNhdGU6IGZpbHRlci5maWx0ZXJQcmVkaWNhdGUgfTtcbiAgICB0aGlzLm9uQmVmb3JlRmlsdGVyLmVtaXQoe1xuICAgICAgY29sdW1uTmFtZTogZmlsdGVyLmNvbHVtbk5hbWUsXG4gICAgICBkcm9wZG93bjogdW5kZWZpbmVkLFxuICAgICAgZmlsdGVyaW5nTW9kaWZpZXJcbiAgICB9KTtcbiAgICBpZiAoXG4gICAgICAoZmlsdGVyLmV4dGVybmFsRmlsdGVyUXVlcnkgJiYgIXRoaXMuY2hlY2tJZkFueVZhbHVlc0V4aXN0KGZpbHRlci5leHRlcm5hbEZpbHRlclF1ZXJ5KSkgfHxcbiAgICAgIGZpbHRlci5maWx0ZXJQcmVkaWNhdGVcbiAgICApIHtcbiAgICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nKFtmaWx0ZXIuY29sdW1uTmFtZV0sIHtcbiAgICAgICAgdHlwZTogRmlsdGVyaW5nQWN0aW9uVHlwZS5SZXNldEZpbHRlclxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMub25GaWx0ZXIuZW1pdCh7IGNvbHVtbk5hbWU6IGZpbHRlci5jb2x1bW5OYW1lIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZUZpbHRlcmluZyhbZmlsdGVyLmNvbHVtbk5hbWVdLCB7XG4gICAgICAgIHR5cGU6IEZpbHRlcmluZ0FjdGlvblR5cGUuQXBwbHlGaWx0ZXIsXG4gICAgICAgIHBheWxvYWQ6IHsgZmlsdGVyaW5nTW9kaWZpZXIgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLm9uRmlsdGVyLmVtaXQoe1xuICAgICAgICBjb2x1bW5OYW1lOiBmaWx0ZXIuY29sdW1uTmFtZSxcbiAgICAgICAgZHJvcGRvd246IHVuZGVmaW5lZCxcbiAgICAgICAgZmlsdGVyaW5nTW9kaWZpZXJcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMudHJpZ2dlckV2ZW50KHtcbiAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5SRU1PVkVfRklMVEVSLFxuICAgICAgY29sdW1uOiBmaWx0ZXIuY29sdW1uTmFtZSxcbiAgICAgIGZpbHRlcmluZ01vZGlmaWVyXG4gICAgfSk7XG4gIH1cblxuICB0cmFja0J5TmFtZShpbmRleCwgaXRlbSkge1xuICAgIHJldHVybiBpdGVtLm5hbWU7XG4gIH1cblxuICByZXNvbHZlQ2VsbFZhbHVlKHJvdywgcGF0aCkge1xuICAgIHJldHVybiBmbG93KFtcbiAgICAgIHggPT4gdGhpcy5kYXRhU291cmNlLnJlc29sdmVWYWx1ZSh4LCBwYXRoKSxcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5yZXNvbHZlRnVuY3Rpb24sXG4gICAgICB0aGlzLmRhdGFTb3VyY2Uubm9ybWFsaXplTmlsXG4gICAgXSkocm93KTtcbiAgfVxuXG4gIGNoYW5nZVNvcnRPcmRlcihjb2x1bW5OYW1lKSB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5zLmZpbmQoKHsgbmFtZSB9KSA9PiBuYW1lID09PSBjb2x1bW5OYW1lKTtcblxuICAgIGlmIChjb2x1bW4pIHtcbiAgICAgIGNvbnN0IHsgc29ydE9yZGVyIH0gPSBjb2x1bW47XG5cbiAgICAgIGlmICghc29ydE9yZGVyKSB7XG4gICAgICAgIHRoaXMudXBkYXRlU29ydGluZyhbY29sdW1uTmFtZV0sIFNvcnRpbmdPcmRlci5BU0MpO1xuICAgICAgfSBlbHNlIGlmIChzb3J0T3JkZXIgPT09IFNvcnRpbmdPcmRlci5BU0MpIHtcbiAgICAgICAgdGhpcy51cGRhdGVTb3J0aW5nKFtjb2x1bW5OYW1lXSwgU29ydGluZ09yZGVyLkRFU0MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy51cGRhdGVTb3J0aW5nKFtjb2x1bW5OYW1lXSwgJycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVNvcnRpbmcoY29sdW1uTmFtZXM6IHN0cmluZ1tdLCBzb3J0T3JkZXI6IFNvcnRPcmRlcikge1xuICAgIHRoaXMudHJpZ2dlckV2ZW50KHtcbiAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5DSEFOR0VfU09SVElOR19PUkRFUixcbiAgICAgIGNvbHVtbnM6IGNvbHVtbk5hbWVzLFxuICAgICAgc29ydE9yZGVyOiBzb3J0T3JkZXIgPT09ICcnID8gJ25vbmUnIDogc29ydE9yZGVyXG4gICAgfSk7XG5cbiAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmNvbHVtbnMubWFwKChjb2x1bW4pOiBDb2x1bW4gPT4ge1xuICAgICAgaWYgKGNvbHVtbk5hbWVzLmluY2x1ZGVzKGNvbHVtbi5uYW1lKSkge1xuICAgICAgICByZXR1cm4geyAuLi5jb2x1bW4sIHNvcnRPcmRlciB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29sdW1uO1xuICAgIH0pO1xuICAgIHRoaXMuZW1pdENvbmZpZ0NoYW5nZSgnc29ydCcpO1xuXG4gICAgdGhpcy5yZWxvYWQoKTtcbiAgfVxuXG4gIGFwcGx5RmlsdGVyKGNvbHVtbk5hbWUsIGRyb3Bkb3duLCBmaWx0ZXJpbmdNb2RpZmllcikge1xuICAgIHRoaXMudHJpZ2dlckV2ZW50KHtcbiAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5BUFBMWV9GSUxURVIsXG4gICAgICBjb2x1bW46IGNvbHVtbk5hbWUsXG4gICAgICBmaWx0ZXJpbmdNb2RpZmllclxuICAgIH0pO1xuICAgIHRoaXMub25CZWZvcmVGaWx0ZXIuZW1pdCh7IGNvbHVtbk5hbWUsIGRyb3Bkb3duLCBmaWx0ZXJpbmdNb2RpZmllciB9KTtcbiAgICB0aGlzLnVwZGF0ZUZpbHRlcmluZyhbY29sdW1uTmFtZV0sIHtcbiAgICAgIHR5cGU6IEZpbHRlcmluZ0FjdGlvblR5cGUuQXBwbHlGaWx0ZXIsXG4gICAgICBwYXlsb2FkOiB7IGZpbHRlcmluZ01vZGlmaWVyIH1cbiAgICB9KTtcbiAgICBkcm9wZG93bi5oaWRlKCk7XG4gICAgdGhpcy5vbkZpbHRlci5lbWl0KHsgY29sdW1uTmFtZSwgZHJvcGRvd24sIGZpbHRlcmluZ01vZGlmaWVyIH0pO1xuICB9XG5cbiAgcmVzZXRGaWx0ZXIoY29sdW1uTmFtZSwgZHJvcGRvd24pIHtcbiAgICB0aGlzLnRyaWdnZXJFdmVudCh7IGFjdGlvbjogUFhfQUNUSU9OUy5SRVNFVF9GSUxURVIsIGNvbHVtbjogY29sdW1uTmFtZSB9KTtcbiAgICB0aGlzLnVwZGF0ZUZpbHRlcmluZyhbY29sdW1uTmFtZV0sIHsgdHlwZTogRmlsdGVyaW5nQWN0aW9uVHlwZS5SZXNldEZpbHRlciB9KTtcbiAgICBkcm9wZG93bi5oaWRlKCk7XG4gICAgdGhpcy5vbkZpbHRlci5lbWl0KHsgY29sdW1uTmFtZSwgZHJvcGRvd24gfSk7XG4gIH1cblxuICBjbGVhckZpbHRlcnMocmVsb2FkID0gdHJ1ZSkge1xuICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nKFxuICAgICAgdGhpcy5jb2x1bW5zLm1hcCgoeyBuYW1lIH0pID0+IG5hbWUpLFxuICAgICAge1xuICAgICAgICB0eXBlOiBGaWx0ZXJpbmdBY3Rpb25UeXBlLlJlc2V0RmlsdGVyXG4gICAgICB9LFxuICAgICAgcmVsb2FkXG4gICAgKTtcbiAgICB0aGlzLm9uRmlsdGVyLmVtaXQoe30pO1xuICAgIHRoaXMudHJpZ2dlckV2ZW50KHsgYWN0aW9uOiBQWF9BQ1RJT05TLkNMRUFSX0ZJTFRFUiB9KTtcbiAgfVxuXG4gIHVwZGF0ZUZpbHRlcmluZyhcbiAgICBjb2x1bW5OYW1lczogc3RyaW5nW10sXG4gICAgYWN0aW9uOiB7XG4gICAgICB0eXBlOiBGaWx0ZXJpbmdBY3Rpb25UeXBlO1xuICAgICAgcGF5bG9hZD86IHsgZmlsdGVyaW5nTW9kaWZpZXI6IEZpbHRlcmluZ01vZGlmaWVyIH07XG4gICAgfSxcbiAgICByZWxvYWQgPSB0cnVlXG4gICkge1xuICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1ucy5tYXAoY29sdW1uID0+IHtcbiAgICAgIGlmIChjb2x1bW5OYW1lcy5pbmNsdWRlcyhjb2x1bW4ubmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgICAgLi4uKGFjdGlvbi50eXBlID09PSBGaWx0ZXJpbmdBY3Rpb25UeXBlLkFwcGx5RmlsdGVyXG4gICAgICAgICAgICA/IGFjdGlvbi5wYXlsb2FkLmZpbHRlcmluZ01vZGlmaWVyXG4gICAgICAgICAgICA6IHRoaXMub25SZXNldEZpbHRlckFjdGlvbihjb2x1bW4pKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICB9KTtcblxuICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nQXBwbGllZCgpO1xuXG4gICAgaWYgKHJlbG9hZCkge1xuICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVGaWx0ZXJpbmdBcHBsaWVkKCkge1xuICAgIHRoaXMuY29sdW1uc1dpdGhGaWx0ZXJzQXBwbGllZCA9IHRoaXMuY29sdW1ucy5maWx0ZXIodGhpcy5pc0NvbHVtbkZpbHRlcmluZ0FwcGxpZWQpO1xuICAgIHRoaXMuZmlsdGVyaW5nQXBwbGllZCA9IHRoaXMuY29sdW1uc1dpdGhGaWx0ZXJzQXBwbGllZC5sZW5ndGggPiAwO1xuXG4gICAgdGhpcy5maWx0ZXJzSGVscFBvcG92ZXJIdG1sID0gdGhpcy5maWx0ZXJpbmdBcHBsaWVkXG4gICAgICA/IGdldHRleHQoXG4gICAgICAgICAgJ0NsaWNrIHRoZSBjb2x1bW4gaGVhZGVycyB0byBhcHBseSBmaWx0ZXJzLiBDbGljayA8Yj5BY3RpdmUgZmlsdGVyczwvYj4gYnV0dG9uIHRvIG1hbmFnZSBhcHBsaWVkIGZpbHRlcnMuJ1xuICAgICAgICApXG4gICAgICA6IGdldHRleHQoJ0NsaWNrIHRoZSBjb2x1bW4gaGVhZGVycyB0byBhcHBseSBmaWx0ZXJzLicpO1xuICB9XG5cbiAgaXNDb2x1bW5GaWx0ZXJpbmdBcHBsaWVkKGNvbHVtbjogQ29sdW1uKTogYm9vbGVhbiB7XG4gICAgY29uc3QgeyBmaWx0ZXJhYmxlLCBmaWx0ZXJQcmVkaWNhdGUsIGV4dGVybmFsRmlsdGVyUXVlcnkgfSA9IGNvbHVtbjtcblxuICAgIHJldHVybiAhIShmaWx0ZXJhYmxlICYmIChmaWx0ZXJQcmVkaWNhdGUgfHwgZXh0ZXJuYWxGaWx0ZXJRdWVyeSkpO1xuICB9XG5cbiAgdXBkYXRlUGFnaW5hdGlvbih7IGl0ZW1zUGVyUGFnZSwgcGFnZSB9KSB7XG4gICAgY29uc3QgY29uZmlnQ2hhbmdlZCA9IHRoaXMucGFnaW5hdGlvbj8ucGFnZVNpemUgIT09IGl0ZW1zUGVyUGFnZTtcbiAgICB0aGlzLnBhZ2luYXRpb24gPSB7IC4uLnRoaXMucGFnaW5hdGlvbiwgcGFnZVNpemU6IGl0ZW1zUGVyUGFnZSwgY3VycmVudFBhZ2U6IHBhZ2UgfTtcbiAgICB0aGlzLmxvYWREYXRhKCk7XG4gICAgaWYgKGNvbmZpZ0NoYW5nZWQpIHtcbiAgICAgIHRoaXMuZW1pdENvbmZpZ0NoYW5nZSgncGFnaW5hdGlvbicpO1xuICAgIH1cbiAgICB0aGlzLnRyaWdnZXJFdmVudCh7IGFjdGlvbjogUFhfQUNUSU9OUy5DSEFOR0VfUEFHSU5BVElPTiwgaXRlbXNQZXJQYWdlLCBwYWdlIH0pO1xuICB9XG5cbiAgY2xpY2tSZWxvYWQoKSB7XG4gICAgdGhpcy5zZWFyY2hUZXh0ID0gJyc7XG4gICAgdGhpcy5yZWxvYWQoKTtcbiAgICB0aGlzLm9uUmVsb2FkLm5leHQoKTtcbiAgICB0aGlzLnRyaWdnZXJFdmVudCh7IGFjdGlvbjogUFhfQUNUSU9OUy5SRUxPQUQgfSk7XG4gIH1cblxuICByZWxvYWQocmVkaXJlY3QgPSB0cnVlKSB7XG4gICAgdGhpcy5wYWdpbmF0aW9uID0ge1xuICAgICAgLi4udGhpcy5wYWdpbmF0aW9uLFxuICAgICAgY3VycmVudFBhZ2U6IHJlZGlyZWN0ID8gMSA6IHRoaXMucGFnaW5hdGlvbi5jdXJyZW50UGFnZVxuICAgIH07XG4gICAgdGhpcy5yZWNyZWF0ZUxvYWRNb3JlQ29tcG9uZW50ID0gdHJ1ZTtcbiAgICB0aGlzLmxvYWREYXRhKHRydWUpO1xuICAgIHRoaXMuc2Nyb2xsVG9Ub3AoKTtcbiAgfVxuXG4gIGxvYWROZXh0UGFnZSgpOiBQcm9taXNlPElSZXN1bHRMaXN0PG9iamVjdD4+IHtcbiAgICB0aGlzLnBhZ2luYXRpb24gPSB7IC4uLnRoaXMucGFnaW5hdGlvbiwgY3VycmVudFBhZ2U6IHRoaXMucGFnaW5hdGlvbi5uZXh0UGFnZSB9O1xuXG4gICAgdGhpcy5sb2FkRGF0YSgpO1xuXG4gICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5yZXN1bHRMaXN0JFxuICAgICAgLnBpcGUodGFrZSgxKSkgLy8gaW4gb3JkZXIgZm9yIGB0b1Byb21pc2VgIHRvIHdvcmssIHRoZSBvYnNlcnZhYmxlIG5lZWRzIHRvIGNvbXBsZXRlXG4gICAgICAudG9Qcm9taXNlKClcbiAgICAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ucmVzdWx0LFxuICAgICAgICAgIHBhZ2luZzoge1xuICAgICAgICAgICAgLi4ucmVzdWx0LnBhZ2luZyxcbiAgICAgICAgICAgIG5leHQ6IHRoaXMubG9hZE5leHRQYWdlLmJpbmQodGhpcylcbiAgICAgICAgICB9XG4gICAgICAgIH0gYXMgSVJlc3VsdExpc3Q8b2JqZWN0PjtcbiAgICAgIH0pO1xuICB9XG5cbiAgZ2V0Q2VsbFJlbmRlcmVyU3BlYyh7IHZhbHVlLCByb3csIGNvbHVtbk5hbWUgfSk6IENlbGxSZW5kZXJlclNwZWMge1xuICAgIHJldHVybiB0aGlzLl9nZXRDZWxsUmVuZGVyZXJTcGVjKHsgdHlwZTogJ0NFTEwnLCB2YWx1ZSwgcm93LCBjb2x1bW5OYW1lIH0pO1xuICB9XG5cbiAgZ2V0SGVhZGVyQ2VsbFJlbmRlcmVyU3BlYyh7IHZhbHVlLCBjb2x1bW5OYW1lIH0pOiBDZWxsUmVuZGVyZXJTcGVjIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0Q2VsbFJlbmRlcmVyU3BlYyh7IHR5cGU6ICdIRUFERVInLCB2YWx1ZSwgcm93OiB1bmRlZmluZWQsIGNvbHVtbk5hbWUgfSk7XG4gIH1cblxuICBnZXRGaWx0ZXJpbmdGb3JtUmVuZGVyZXJTcGVjKHsgY29sdW1uLCBkcm9wZG93biB9KTogRmlsdGVyaW5nRm9ybVJlbmRlcmVyU3BlYyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlbmRlcmVyOlxuICAgICAgICBnZXQodGhpcy5nZXRDb2x1bW5SZW5kZXJlcihjb2x1bW4pLCAnZmlsdGVyaW5nRm9ybVJlbmRlcmVyRGVmLnRlbXBsYXRlJykgfHxcbiAgICAgICAgY29sdW1uLmZpbHRlcmluZ0Zvcm1SZW5kZXJlckNvbXBvbmVudCxcbiAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgcHJvcGVydHk6IGNvbHVtbixcbiAgICAgICAgYXBwbHlGaWx0ZXI6IHRoaXMuYXBwbHlGaWx0ZXIuYmluZCh0aGlzLCBjb2x1bW4ubmFtZSwgZHJvcGRvd24pLFxuICAgICAgICByZXNldEZpbHRlcjogdGhpcy5yZXNldEZpbHRlci5iaW5kKHRoaXMsIGNvbHVtbi5uYW1lLCBkcm9wZG93bilcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgc2V0QWxsSXRlbXNTZWxlY3RlZChzZWxlY3RlZCkge1xuICAgIHRoaXMuZGF0YVNvdXJjZS5zZWxlY3Rpb24kXG4gICAgICAucGlwZShmaXJzdCgpKVxuICAgICAgLnN1YnNjcmliZSgoeyBmaWx0ZXJlZERhdGFJZHMgfSkgPT4gdGhpcy5zZXRJdGVtc1NlbGVjdGVkKGZpbHRlcmVkRGF0YUlkcywgc2VsZWN0ZWQpKTtcbiAgfVxuXG4gIHNldEFsbEl0ZW1zSW5DdXJyZW50UGFnZVNlbGVjdGVkKHNlbGVjdGVkKSB7XG4gICAgdGhpcy5kYXRhU291cmNlLmRhdGEkLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKGRhdGEgPT4gdGhpcy5zZXRJdGVtc1NlbGVjdGVkKGRhdGEsIHNlbGVjdGVkKSk7XG4gIH1cblxuICBzZXRJdGVtc1NlbGVjdGVkKGl0ZW1zOiBhbnksIHNlbGVjdGVkKSB7XG4gICAgY29uc3QgaXRlbUlkcyA9IGl0ZW1zLm1hcCgoaXRlbTogb2JqZWN0IHwgc3RyaW5nKSA9PlxuICAgICAgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnID8gaXRlbVt0aGlzLnNlbGVjdGlvblByaW1hcnlLZXldIDogaXRlbVxuICAgICk7XG5cbiAgICB0aGlzLnNlbGVjdGVkSXRlbUlkcyA9IHNlbGVjdGVkXG4gICAgICA/IHVuaW9uKHRoaXMuc2VsZWN0ZWRJdGVtSWRzLCBpdGVtSWRzKVxuICAgICAgOiB3aXRob3V0KHRoaXMuc2VsZWN0ZWRJdGVtSWRzLCAuLi5pdGVtSWRzKTtcbiAgICB0aGlzLml0ZW1zU2VsZWN0LmVtaXQodGhpcy5zZWxlY3RlZEl0ZW1JZHMpO1xuICB9XG5cbiAgY2hhbmdlU2VsZWN0ZWRJdGVtKGl0ZW06IGFueSkge1xuICAgIHRoaXMuc2VsZWN0ZWRJdGVtSWRzID0gW2l0ZW1bdGhpcy5zZWxlY3Rpb25QcmltYXJ5S2V5XV07XG4gICAgdGhpcy5pdGVtc1NlbGVjdC5lbWl0KHRoaXMuc2VsZWN0ZWRJdGVtSWRzKTtcbiAgfVxuXG4gIGNhbmNlbCgpIHtcbiAgICB0aGlzLnNlbGVjdGVkSXRlbUlkcyA9IFtdO1xuICAgIHRoaXMuaXRlbXNTZWxlY3QuZW1pdCh0aGlzLnNlbGVjdGVkSXRlbUlkcyk7XG4gIH1cblxuICBpc0l0ZW1TZWxlY3RlZChpdGVtKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJdGVtSWRzLmluY2x1ZGVzKGl0ZW1bdGhpcy5zZWxlY3Rpb25QcmltYXJ5S2V5XSk7XG4gIH1cblxuICBvbkNvbHVtbkRyb3AoeyBwcmV2aW91c0luZGV4LCBjdXJyZW50SW5kZXggfSkge1xuICAgIGNvbnN0IGRpZmZlcmVudEluZGV4ID0gcHJldmlvdXNJbmRleCAhPT0gY3VycmVudEluZGV4O1xuXG4gICAgaWYgKGRpZmZlcmVudEluZGV4KSB7XG4gICAgICB0aGlzLnRyaWdnZXJFdmVudCh7XG4gICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5SRU9SREVSX0NPTFVNTlMsXG4gICAgICAgIGNvbHVtbjogdGhpcy5jb2x1bW5OYW1lc1twcmV2aW91c0luZGV4XVxuICAgICAgfSk7XG4gICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnMuc3BsaWNlKHByZXZpb3VzSW5kZXgsIDEpO1xuICAgICAgdGhpcy5jb2x1bW5zLnNwbGljZShjdXJyZW50SW5kZXgsIDAsIGNvbHVtblswXSk7XG4gICAgICB0aGlzLmVtaXRDb25maWdDaGFuZ2UoJ3Jlb3JkZXJDb2x1bW4nKTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUNvbHVtbk5hbWVzKCk7XG4gICAgdGhpcy51cGRhdGVHcmlkQ29sdW1uc1NpemUoKTtcbiAgfVxuXG4gIHVwZGF0ZUdyaWRDb2x1bW5zU2l6ZSgpIHtcbiAgICB0aGlzLnN0eWxlcyA9IHtcbiAgICAgIC4uLnRoaXMuc3R5bGVzLFxuICAgICAgZ3JpZFRlbXBsYXRlQ29sdW1uczogdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFN0eWxlKFxuICAgICAgICB0aGlzLmNvbHVtbnNcbiAgICAgICAgICAuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4udmlzaWJsZSlcbiAgICAgICAgICAubWFwKCh7IGdyaWRUcmFja1NpemUgfSkgPT4gZ3JpZFRyYWNrU2l6ZSlcbiAgICAgICAgICAuam9pbignICcpXG4gICAgICApLFxuICAgICAgZ3JpZEluZmluaXRlU2Nyb2xsQ29sdW1uOiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0U3R5bGUoYDEgLyAtMWApXG4gICAgfTtcbiAgfVxuXG4gIHVwZGF0ZVRoRWxzKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy50aEVscyA9IHRoaXMudGhSZWZzXG4gICAgICAgID8gdGhpcy50aFJlZnMudG9BcnJheSgpLm1hcCgoeyBuYXRpdmVFbGVtZW50IH0pID0+IG5hdGl2ZUVsZW1lbnQpXG4gICAgICAgIDogW107XG4gICAgfSwgMCk7XG4gIH1cblxuICAvLyBUbyBiZSByZW1vdmVkIHdoZW4gY29sdW1ucyBhcmUgdHJhbnNmb3JtZWQgdG8gb2JzZXJ2YWJsZXMuXG4gIGlzRHJvcERvd25QbGFjZWRSaWdodChjb2x1bW46IENvbHVtbikge1xuICAgIHJldHVybiAoXG4gICAgICBpbmRleE9mKFxuICAgICAgICB0aGlzLmNvbHVtbnMuZmlsdGVyKGMgPT4gYy52aXNpYmxlKSxcbiAgICAgICAgY29sdW1uXG4gICAgICApID5cbiAgICAgIHRoaXMuY29sdW1ucy5maWx0ZXIoYyA9PiBjLnZpc2libGUpLmxlbmd0aCAvIDJcbiAgICApO1xuICB9XG5cbiAgZW1pdENvbmZpZ0NoYW5nZShldmVudFR5cGU/OiBHcmlkRXZlbnRUeXBlKSB7XG4gICAgaWYgKHRoaXMuY29sdW1uc0luaXRpYWxpemVkKSB7XG4gICAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb2x1bW5zLm1hcCh0aGlzLm1hcENvbHVtblRvQ29uZmlnLmJpbmQodGhpcykpO1xuICAgICAgY29uc3QgY29uZmlnID0geyBjb2x1bW5zLCBwYWdpbmF0aW9uOiB0aGlzLnBhZ2luYXRpb24gfTtcbiAgICAgIHRoaXMub25Db25maWdDaGFuZ2UuZW1pdChjb25maWcpO1xuICAgICAgc3dpdGNoIChldmVudFR5cGUpIHtcbiAgICAgICAgY2FzZSAnc29ydCc6XG4gICAgICAgICAgdGhpcy5vblNvcnQuZW1pdChjb25maWcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdwYWdpbmF0aW9uJzpcbiAgICAgICAgICB0aGlzLm9uUGFnZVNpemVDaGFuZ2UuZW1pdChjb25maWcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyZW9yZGVyQ29sdW1uJzpcbiAgICAgICAgICB0aGlzLm9uQ29sdW1uUmVvcmRlcmVkLmVtaXQoY29uZmlnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY2hhbmdlQ29sdW1uVmlzaWJpbGl0eSc6XG4gICAgICAgICAgdGhpcy5vbkNvbHVtblZpc2liaWxpdHlDaGFuZ2UuZW1pdChjb25maWcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRyaWdnZXJFdmVudChldmVudERhdGEpIHtcbiAgICB0aGlzLmdhaW5zaWdodFNlcnZpY2UudHJpZ2dlckV2ZW50KHRoaXMucHJvZHVjdEV4cGVyaWVuY2VFdmVudD8uZXZlbnROYW1lIHx8IFBYX0VWRU5UX05BTUUsIHtcbiAgICAgIC4uLnRoaXMucHJvZHVjdEV4cGVyaWVuY2VFdmVudD8uZGF0YSxcbiAgICAgIC4uLmV2ZW50RGF0YVxuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlQ2xpY2socm93OiBSb3cpIHtcbiAgICB0aGlzLmxhc3RDbGlja2VkUm93ID0gcm93O1xuICAgIHRoaXMucm93Q2xpY2suZW1pdChyb3cpO1xuICB9XG5cbiAgcGVyZm9ybVNlYXJjaChzZWFyY2hUZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFRleHQgPSBzZWFyY2hUZXh0O1xuICAgIHRoaXMubWFudWFsU2VhcmNoJC5uZXh0KHNlYXJjaFRleHQpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cFNlYXJjaE9ic2VydmFibGVzKCk6IHZvaWQge1xuICAgIGNvbnN0IGF1dG9TZWFyY2gkID0gdGhpcy5zZWFyY2hUZXh0JC5waXBlKFxuICAgICAgZGVib3VuY2VUaW1lKHRoaXMuU0VBUkNIX0RFQk9VTkNFX1RJTUUpLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgIGZpbHRlcih2YWx1ZSA9PiB2YWx1ZSAhPT0gdGhpcy5sYXN0TWFudWFsU2VhcmNoVmFsdWUpLFxuICAgICAgdGFwKHZhbHVlID0+IHtcbiAgICAgICAgdGhpcy5sYXN0TWFudWFsU2VhcmNoVmFsdWUgPSB2YWx1ZTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnN0IG1hbnVhbFNlYXJjaCQgPSB0aGlzLm1hbnVhbFNlYXJjaCQucGlwZShcbiAgICAgIGZpbHRlcih2YWx1ZSA9PiB2YWx1ZS50cmltKCkgIT09ICcnKSxcbiAgICAgIHRhcCh2YWx1ZSA9PiB7XG4gICAgICAgIHRoaXMubGFzdE1hbnVhbFNlYXJjaFZhbHVlID0gdmFsdWU7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBtZXJnZShhdXRvU2VhcmNoJCwgbWFudWFsU2VhcmNoJClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpLFxuICAgICAgICB0YXAoc2VhcmNoVGV4dCA9PiB7XG4gICAgICAgICAgdGhpcy5zZWFyY2hUZXh0ID0gc2VhcmNoVGV4dDtcbiAgICAgICAgICB0aGlzLm9uQmVmb3JlU2VhcmNoLmVtaXQoc2VhcmNoVGV4dCk7XG4gICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoe1xuICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLlNFQVJDSCxcbiAgICAgICAgICAgIHNlYXJjaElucHV0OiBzZWFyY2hUZXh0XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvblJlc2V0RmlsdGVyQWN0aW9uKGNvbHVtbjogQ29sdW1uKSB7XG4gICAgdGhpcy5vbkNvbHVtbkZpbHRlclJlc2V0LmVtaXQoY29sdW1uKTtcbiAgICByZXR1cm4ge1xuICAgICAgZmlsdGVyUHJlZGljYXRlOiB1bmRlZmluZWQsXG4gICAgICBleHRlcm5hbEZpbHRlclF1ZXJ5OiB1bmRlZmluZWRcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBtYXBDb2x1bW5Ub0NvbmZpZyhjb2x1bW46IENvbHVtbik6IENvbHVtbkNvbmZpZyB8IEN1c3RvbUNvbHVtbkNvbmZpZyB7XG4gICAgbGV0IGNvbmZpZztcbiAgICBpZiAoY29sdW1uLmN1c3RvbSkge1xuICAgICAgY29uc3QgeyB2aXNpYmxlLCBzb3J0T3JkZXIsIG5hbWUsIGV4dGVybmFsRmlsdGVyUXVlcnksIGhlYWRlciwgcGF0aCB9ID0gY29sdW1uO1xuICAgICAgY29uZmlnID0ge1xuICAgICAgICB2aXNpYmxlLFxuICAgICAgICBzb3J0T3JkZXIsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGZpbHRlcjogeyBleHRlcm5hbEZpbHRlclF1ZXJ5IH0sXG4gICAgICAgIGhlYWRlcixcbiAgICAgICAgcGF0aCxcbiAgICAgICAgY3VzdG9tOiB0cnVlXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB7IHZpc2libGUsIHNvcnRPcmRlciwgbmFtZSwgZXh0ZXJuYWxGaWx0ZXJRdWVyeSB9ID0gY29sdW1uO1xuICAgICAgY29uZmlnID0geyB2aXNpYmxlLCBzb3J0T3JkZXIsIG5hbWUsIGZpbHRlcjogeyBleHRlcm5hbEZpbHRlclF1ZXJ5IH0gfTtcbiAgICB9XG5cbiAgICBpZiAoaXNFbXB0eShjb25maWc/LmZpbHRlcj8uZXh0ZXJuYWxGaWx0ZXJRdWVyeSkpIHtcbiAgICAgIGRlbGV0ZSBjb25maWcuZmlsdGVyO1xuICAgIH1cblxuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBwcml2YXRlIGxvYWREYXRhKHJlbG9hZCA9IGZhbHNlKSB7XG4gICAgY29uc3Qge1xuICAgICAgcm93cyxcbiAgICAgIGNvbHVtbnMsXG4gICAgICBwYWdpbmF0aW9uLFxuICAgICAgc2VhcmNoVGV4dCxcbiAgICAgIHNlcnZlclNpZGVEYXRhQ2FsbGJhY2ssXG4gICAgICBzZWxlY3RhYmxlLFxuICAgICAgc2VsZWN0aW9uUHJpbWFyeUtleSxcbiAgICAgIGluZmluaXRlU2Nyb2xsXG4gICAgfSA9IHRoaXM7XG5cbiAgICB0aGlzLmRhdGFTb3VyY2UubG9hZERhdGEoe1xuICAgICAgcm93cyxcbiAgICAgIGNvbHVtbnMsXG4gICAgICBwYWdpbmF0aW9uLFxuICAgICAgc2VhcmNoVGV4dCxcbiAgICAgIHNlcnZlclNpZGVEYXRhQ2FsbGJhY2ssXG4gICAgICBzZWxlY3RhYmxlLFxuICAgICAgc2VsZWN0aW9uUHJpbWFyeUtleSxcbiAgICAgIGluZmluaXRlU2Nyb2xsLFxuICAgICAgcmVsb2FkXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNvbHVtbnMoKSB7XG4gICAgY29uc3Qgc3BlY2lhbENvbHVtbiA9IHtcbiAgICAgIHNvcnRhYmxlOiBmYWxzZSxcbiAgICAgIHBvc2l0aW9uRml4ZWQ6IHRydWVcbiAgICB9O1xuICAgIGNvbnN0IHNlbGVjdGlvbkNvbHVtbiA9IHRoaXMuc2VsZWN0YWJsZVxuICAgICAgPyB7XG4gICAgICAgICAgLi4uc3BlY2lhbENvbHVtbixcbiAgICAgICAgICBuYW1lOiB0aGlzLnNpbmdsZVNlbGVjdGlvbiA/IFNwZWNpYWxDb2x1bW5OYW1lLlJhZGlvQnV0dG9uIDogU3BlY2lhbENvbHVtbk5hbWUuQ2hlY2tib3gsXG4gICAgICAgICAgZ3JpZFRyYWNrU2l6ZTogJzMycHgnXG4gICAgICAgIH1cbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGFjdGlvbnNDb2x1bW4gPVxuICAgICAgdGhpcy5hY3Rpb25Db250cm9scz8ubGVuZ3RoID4gMFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLnNwZWNpYWxDb2x1bW4sXG4gICAgICAgICAgICBuYW1lOiBTcGVjaWFsQ29sdW1uTmFtZS5BY3Rpb25zLFxuICAgICAgICAgICAgZ3JpZFRyYWNrU2l6ZTogJ21pbm1heCg0MHB4LCBhdXRvKSdcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgZXhwYW5kYWJsZVJvd3NDb2x1bW4gPSB0aGlzLmV4cGFuZGFibGVSb3dzICE9PSAnTk9ORScgPyBuZXcgRXhwYW5kYWJsZVJvd0NvbHVtbigpIDogbnVsbDtcbiAgICBjb25zdCBjb2x1bW5zID0gW2V4cGFuZGFibGVSb3dzQ29sdW1uLCBzZWxlY3Rpb25Db2x1bW4sIC4uLnRoaXMuY29sdW1ucywgYWN0aW9uc0NvbHVtbl1cbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5tYXAodGhpcy53aXRoQ29sdW1uRGVmYXVsdHMpO1xuXG4gICAgdGhpcy5jb2x1bW5zID0gdW5pcUJ5KGNvbHVtbnMsICduYW1lJyk7XG4gICAgdGhpcy51cGRhdGVDb2x1bW5OYW1lcygpO1xuICAgIHRoaXMudXBkYXRlR3JpZENvbHVtbnNTaXplKCk7XG4gICAgdGhpcy51cGRhdGVUaEVscygpO1xuICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nQXBwbGllZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0lmQW55VmFsdWVzRXhpc3Qob2JqLCByZXN1bHRzID0gW10pIHtcbiAgICBpZiAob2JqICYmIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKG9iaikuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygb2JqW2tleV0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgdGhpcy5jaGVja0lmQW55VmFsdWVzRXhpc3Qob2JqW2tleV0sIHJlc3VsdHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdHMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzLnNvbWUodmFsID0+ICEhdmFsKTtcbiAgfVxuXG4gIHByaXZhdGUgd2l0aENvbHVtbkRlZmF1bHRzKGNvbHVtbik6IENvbHVtbiB7XG4gICAgY29uc3QgZGF0YVR5cGUgPSBjb2x1bW4uZGF0YVR5cGUgfHwgQ29sdW1uRGF0YVR5cGUuVGV4dFNob3J0O1xuICAgIGNvbnN0IHsgaGVhZGVyQ1NTQ2xhc3NOYW1lLCBjZWxsQ1NTQ2xhc3NOYW1lIH0gPSBjb2x1bW47XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgIHBvc2l0aW9uRml4ZWQ6IGZhbHNlLFxuICAgICAgcmVzaXphYmxlOiB0cnVlLFxuICAgICAgc29ydGFibGU6IHRydWUsXG4gICAgICBzb3J0T3JkZXI6ICcnLFxuICAgICAgZmlsdGVyYWJsZTogZmFsc2UsXG4gICAgICAuLi5jb2x1bW4sXG4gICAgICBkYXRhVHlwZSxcbiAgICAgIGdyaWRUcmFja1NpemU6XG4gICAgICAgIGNvbHVtbi5ncmlkVHJhY2tTaXplIHx8XG4gICAgICAgIGBtaW5tYXgoJHttaW5Db2x1bW5HcmlkVHJhY2tTaXplfXB4LCAke3JhdGlvc0J5Q29sdW1uVHlwZXNbZGF0YVR5cGVdfWZyKWAsXG4gICAgICBoZWFkZXJDU1NDbGFzc05hbWU6XG4gICAgICAgICh0eXBlb2YgaGVhZGVyQ1NTQ2xhc3NOYW1lID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gaGVhZGVyQ1NTQ2xhc3NOYW1lLnNwbGl0KCcgJylcbiAgICAgICAgICA6IGhlYWRlckNTU0NsYXNzTmFtZSkgfHwgW10sXG4gICAgICBjZWxsQ1NTQ2xhc3NOYW1lOlxuICAgICAgICAodHlwZW9mIGNlbGxDU1NDbGFzc05hbWUgPT09ICdzdHJpbmcnID8gY2VsbENTU0NsYXNzTmFtZS5zcGxpdCgnICcpIDogY2VsbENTU0NsYXNzTmFtZSkgfHxcbiAgICAgICAgW11cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb2x1bW5OYW1lcygpIHtcbiAgICB0aGlzLmNvbHVtbk5hbWVzID0gdGhpcy5jb2x1bW5zLm1hcCgoeyBuYW1lIH0pID0+IG5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cFJlc2l6ZUhhbmRsZSgpIHtcbiAgICBjb25zdCByZXNpemVIYW5kbGVEcmFnJCA9IHRoaXMucmVzaXplSGFuZGxlTW91c2VEb3duJC5waXBlKFxuICAgICAgdGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSxcbiAgICAgIHRhcCgoKSA9PiB0aGlzLmNsZWFyTW91c2VIaWdobGlnaHRzKCkpLFxuICAgICAgbWVyZ2VNYXAoKHsgZXZlbnQsIHRhcmdldENvbHVtbk5hbWUgfSkgPT4ge1xuICAgICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmNvbHVtbnMubWFwKGNvbHVtbiA9PiB7XG4gICAgICAgICAgaWYgKGNvbHVtbi5uYW1lID09PSB0YXJnZXRDb2x1bW5OYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgICAgICAgIGhlYWRlckNTU0NsYXNzTmFtZTogdW5pb24oY29sdW1uLmhlYWRlckNTU0NsYXNzTmFtZSwgWydoZWFkZXItLWJlaW5nLXJlc2l6ZWQnXSlcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5oZWFkZXJCZWluZ1Jlc2l6ZWQgPSB7XG4gICAgICAgICAgY29sdW1uTmFtZTogdGFyZ2V0Q29sdW1uTmFtZSxcbiAgICAgICAgICBlbDogKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCk/LnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnRcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnN0eWxlcyA9IHtcbiAgICAgICAgICAuLi50aGlzLnN0eWxlcyxcbiAgICAgICAgICB0YWJsZUN1cnNvcjogJ2NvbC1yZXNpemUnXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucmVzaXplSGFuZGxlQ29udGFpbmVyTW91c2VNb3ZlJC5waXBlKFxuICAgICAgICAgIHRhcCgoKSA9PiB0aGlzLmNsZWFyTW91c2VIaWdobGlnaHRzKCkpLFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLnJlc2l6ZUhhbmRsZUNvbnRhaW5lck1vdXNlVXAkKVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgcmVzaXplSGFuZGxlRHJhZyQuc3Vic2NyaWJlKChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5jb2x1bW5zLm1hcCgoY29sdW1uLCBpKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaGVhZGVyQmVpbmdSZXNpemVkICYmIGNvbHVtbi5uYW1lID09PSB0aGlzLmhlYWRlckJlaW5nUmVzaXplZC5jb2x1bW5OYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBzY3JvbGxDb250YWluZXJEaXY6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudDtcblxuICAgICAgICAgICAgLy8gUmVhZCBzY3JvbGxDb250YWluZXJFbCdzIG9mZnNldCBsZWZ0IHJlbGF0aXZlIHRvIHRoZSBkb2N1bWVudC5cbiAgICAgICAgICAgIGNvbnN0IGhvcml6b250YWxPZmZzZXQgPSBzY3JvbGxDb250YWluZXJEaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtcblxuICAgICAgICAgICAgLy8gQWRqdXN0IHdpdGggdGhlIHNjcm9sbENvbnRhaW5lckVsIGhvcml6b250YWwgc2Nyb2xsIHBvc2l0aW9uLlxuICAgICAgICAgICAgY29uc3QgaG9yaXpvbnRhbFNjcm9sbE9mZnNldCA9IHNjcm9sbENvbnRhaW5lckRpdi5zY3JvbGxMZWZ0IC0gaG9yaXpvbnRhbE9mZnNldDtcblxuICAgICAgICAgICAgLy8gUmVhZCBsZWZ0IG9mZnNldCBvZiB0aGUgcmVzaXplZCBoZWFkZXIuXG4gICAgICAgICAgICBjb25zdCBoZWFkZXJPZmZzZXRMZWZ0ID0gdGhpcy5oZWFkZXJCZWluZ1Jlc2l6ZWQuZWwub2Zmc2V0TGVmdCB8fCAwO1xuXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGRlc2lyZWQgd2lkdGguXG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IGhvcml6b250YWxTY3JvbGxPZmZzZXQgKyBldmVudC5jbGllbnRYIC0gaGVhZGVyT2Zmc2V0TGVmdDtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4uY29sdW1uLFxuICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGNvbHVtbiBvYmplY3Qgd2l0aCB0aGUgbmV3IHNpemUgdmFsdWUsIGVuZm9yY2Ugb3VyIG1pbmltdW0gc2l6ZS5cbiAgICAgICAgICAgICAgZ3JpZFRyYWNrU2l6ZTogYCR7TWF0aC5tYXgobWluQ29sdW1uR3JpZFRyYWNrU2l6ZSwgd2lkdGgpfXB4YFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBGb3IgdGhlIG90aGVyIGhlYWRlcnMgd2hpY2ggZG9uJ3QgaGF2ZSBhIHNldCB3aWR0aCwgZml4IGl0IHRvIHRoZWlyIGNvbXB1dGVkIHdpZHRoLlxuICAgICAgICAgIGlmIChjb2x1bW4uZ3JpZFRyYWNrU2l6ZS5zdGFydHNXaXRoKCdtaW5tYXgnKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4uY29sdW1uLFxuICAgICAgICAgICAgICAvLyBpc24ndCBmaXhlZCB5ZXQgKGl0IHdvdWxkIGJlIGEgcHggdmFsdWUpXG4gICAgICAgICAgICAgIGdyaWRUcmFja1NpemU6IGAke19wYXJzZUludCh0aGlzLnRoRWxzW2ldLmNsaWVudFdpZHRoKX1weGBcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLypcbiAgICAgICAgICogVXBkYXRlIHRoZSBjb2x1bW4gc2l6ZXMuXG4gICAgICAgICAqIE5vdGU6IGdyaWQtdGVtcGxhdGUtY29sdW1ucyBzZXRzIHRoZSB3aWR0aCBmb3IgYWxsIGNvbHVtbnMgaW4gb25lIHZhbHVlLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy51cGRhdGVHcmlkQ29sdW1uc1NpemUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5yZXNpemVIYW5kbGVDb250YWluZXJNb3VzZVVwJC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5oZWFkZXJCZWluZ1Jlc2l6ZWQpIHtcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5jb2x1bW5zLm1hcChjb2x1bW4gPT4ge1xuICAgICAgICAgIGlmIChjb2x1bW4ubmFtZSA9PT0gdGhpcy5oZWFkZXJCZWluZ1Jlc2l6ZWQuY29sdW1uTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4uY29sdW1uLFxuICAgICAgICAgICAgICBoZWFkZXJDU1NDbGFzc05hbWU6IHdpdGhvdXQoY29sdW1uLmhlYWRlckNTU0NsYXNzTmFtZSwgJ2hlYWRlci0tYmVpbmctcmVzaXplZCcpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb2x1bW47XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmhlYWRlckJlaW5nUmVzaXplZCA9IHVuZGVmaW5lZDtcblxuICAgICAgICB0aGlzLnN0eWxlcyA9IHtcbiAgICAgICAgICAuLi50aGlzLnN0eWxlcyxcbiAgICAgICAgICB0YWJsZUN1cnNvcjogJ2F1dG8nXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyTW91c2VIaWdobGlnaHRzKCkge1xuICAgIGlmICh3aW5kb3cuZ2V0U2VsZWN0aW9uKSB7XG4gICAgICB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0Q2VsbFJlbmRlcmVyU3BlYyh7IHR5cGUsIHZhbHVlLCByb3csIGNvbHVtbk5hbWUgfSk6IENlbGxSZW5kZXJlclNwZWMge1xuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY29sdW1ucy5maW5kKCh7IG5hbWUgfSkgPT4gbmFtZSA9PT0gY29sdW1uTmFtZSk7XG4gICAgY29uc3QgY29sdW1uUmVuZGVyZXIgPSB0aGlzLmdldENvbHVtblJlbmRlcmVyKGNvbHVtbik7XG4gICAgY29uc3QgcmVuZGVyZXJUZW1wbGF0ZSA9IGdldChcbiAgICAgIGNvbHVtblJlbmRlcmVyLFxuICAgICAgYCR7dHlwZSA9PT0gJ0hFQURFUicgPyAnaGVhZGVyQ2VsbFJlbmRlcmVyRGVmJyA6ICdjZWxsUmVuZGVyZXJEZWYnfS50ZW1wbGF0ZWBcbiAgICApO1xuXG4gICAgY29uc3QgeyBjZWxsUmVuZGVyZXJDb21wb25lbnQsIGhlYWRlckNlbGxSZW5kZXJlckNvbXBvbmVudCB9ID0gY29sdW1uO1xuICAgIGNvbnN0IHJlbmRlcmVyQ29tcG9uZW50ID1cbiAgICAgIHR5cGUgPT09ICdIRUFERVInID8gaGVhZGVyQ2VsbFJlbmRlcmVyQ29tcG9uZW50IDogY2VsbFJlbmRlcmVyQ29tcG9uZW50O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlbmRlcmVyOiByZW5kZXJlclRlbXBsYXRlIHx8IHJlbmRlcmVyQ29tcG9uZW50LFxuICAgICAgY29udGV4dDoge1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgaXRlbTogcm93LFxuICAgICAgICBwcm9wZXJ0eTogY29sdW1uXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29sdW1uUmVuZGVyZXIoY29sdW1uKTogQ29sdW1uRGlyZWN0aXZlIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5SZW5kZXJlcnMudG9BcnJheSgpLmZpbmQoKHsgbmFtZSB9KSA9PiBuYW1lID09PSBjb2x1bW4ubmFtZSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUZpbHRlcmluZ0xhYmVsc1BhcmFtcyhzdGF0czogRGF0YVNvdXJjZVN0YXRzKSB7XG4gICAgdGhpcy5maWx0ZXJpbmdMYWJlbHNQYXJhbXMgPSB7XG4gICAgICBmaWx0ZXJlZEl0ZW1zQ291bnQ6IHN0YXRzLmZpbHRlcmVkU2l6ZSxcbiAgICAgIGFsbEl0ZW1zQ291bnQ6IHN0YXRzLnNpemVcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVQYWdpbmF0aW9uTGFiZWxQYXJhbXMoc3RhdHM6IERhdGFTb3VyY2VTdGF0cykge1xuICAgIGlmIChzdGF0cy5uZXh0UGFnZSkge1xuICAgICAgdGhpcy5wYWdpbmF0aW9uID0geyAuLi50aGlzLnBhZ2luYXRpb24sIG5leHRQYWdlOiBzdGF0cy5uZXh0UGFnZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHBhZ2VGaXJzdEl0ZW1JZHggPSAoc3RhdHMuY3VycmVudFBhZ2UgLSAxKSAqIHN0YXRzLmZpcnN0UGFnZVNpemUgKyAxO1xuICAgIHRoaXMucGFnaW5hdGlvbkxhYmVsUGFyYW1zID0ge1xuICAgICAgcGFnZUZpcnN0SXRlbUlkeCxcbiAgICAgIHBhZ2VMYXN0SXRlbUlkeDogcGFnZUZpcnN0SXRlbUlkeCArIChzdGF0cy5jdXJyZW50UGFnZVNpemUgLSAxKSxcbiAgICAgIGl0ZW1zVG90YWw6IHN0YXRzLmZpbHRlcmVkU2l6ZVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVBhZ2luYXRpb25XaGVuTm9EZXZpY2VzTGFzdFBhZ2Uoc3RhdHM6IERhdGFTb3VyY2VTdGF0cykge1xuICAgIGlmICghc3RhdHMubmV4dFBhZ2UgJiYgc3RhdHMuY3VycmVudFBhZ2VTaXplID09PSAwICYmIHN0YXRzLnNpemUgPiAwKSB7XG4gICAgICB0aGlzLnBhZ2luYXRpb24gPSB7XG4gICAgICAgIC4uLnRoaXMucGFnaW5hdGlvbixcbiAgICAgICAgY3VycmVudFBhZ2U6IHRoaXMucGFnaW5hdGlvbi5jdXJyZW50UGFnZSAtIDEsXG4gICAgICAgIG5leHRQYWdlOiBudWxsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTG9hZE1vcmVDb21wb25lbnQoc3RhdHM6IERhdGFTb3VyY2VTdGF0cykge1xuICAgIGlmIChcbiAgICAgIHRoaXMuaW5maW5pdGVTY3JvbGwgJiZcbiAgICAgIHN0YXRzICYmXG4gICAgICBzdGF0cy5uZXh0UGFnZSAmJlxuICAgICAgKCF0aGlzLmxvYWRNb3JlQ29tcG9uZW50IHx8IHRoaXMucmVjcmVhdGVMb2FkTW9yZUNvbXBvbmVudClcbiAgICApIHtcbiAgICAgIHRoaXMucmVjcmVhdGVMb2FkTW9yZUNvbXBvbmVudCA9IGZhbHNlO1xuICAgICAgdGhpcy5pbmZpbml0ZVNjcm9sbENvbnRhaW5lci5jbGVhcigpO1xuICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gdGhpcy5pbmZpbml0ZVNjcm9sbENvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoTG9hZE1vcmVDb21wb25lbnQpO1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBjb21wb25lbnRSZWYuaW5zdGFuY2UgYXMgTG9hZE1vcmVDb21wb25lbnQ7XG4gICAgICBpbnN0YW5jZS51c2VJbnRlcnNlY3Rpb24gPSB0aGlzLmluZmluaXRlU2Nyb2xsID09PSAnYXV0bycgfHwgdGhpcy5pbmZpbml0ZVNjcm9sbCA9PT0gJ2hpZGRlbic7XG4gICAgICBpbnN0YW5jZS5oaWRkZW4gPSB0aGlzLmluZmluaXRlU2Nyb2xsID09PSAnaGlkZGVuJztcbiAgICAgIGluc3RhbmNlLnBhZ2luZyA9IHtcbiAgICAgICAgbmV4dFBhZ2U6IHN0YXRzLm5leHRQYWdlLFxuICAgICAgICBuZXh0OiB0aGlzLmxvYWROZXh0UGFnZS5iaW5kKHRoaXMpXG4gICAgICB9IGFzIFBhZ2luZzxJSWRlbnRpZmllZD47XG4gICAgICBpbnN0YW5jZS5sb2FkTmV4dExhYmVsID0gdGhpcy5sb2FkTW9yZUl0ZW1zTGFiZWw7XG4gICAgICBpbnN0YW5jZS5sb2FkaW5nTGFiZWwgPSB0aGlzLmxvYWRpbmdJdGVtc0xhYmVsO1xuICAgICAgdGhpcy5sb2FkTW9yZUNvbXBvbmVudCA9IGluc3RhbmNlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5sb2FkTW9yZUNvbXBvbmVudCAmJiAhc3RhdHMubmV4dFBhZ2UpIHtcbiAgICAgIHRoaXMubG9hZE1vcmVDb21wb25lbnQucGFnaW5nID0ge1xuICAgICAgICBuZXh0UGFnZTogbnVsbFxuICAgICAgfSBhcyBQYWdpbmc8SUlkZW50aWZpZWQ+O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2Nyb2xsVG9Ub3AoKSB7XG4gICAgaWYgKHRoaXMuaW5maW5pdGVTY3JvbGwpIHtcbiAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NBbmRQZXJzaXN0Q29uZmlnQ2hhbmdlKCkge1xuICAgIG1lcmdlKFxuICAgICAgbWVyZ2UoXG4gICAgICAgIHRoaXMub25Tb3J0LFxuICAgICAgICB0aGlzLm9uUGFnZVNpemVDaGFuZ2UsXG4gICAgICAgIHRoaXMub25Db2x1bW5SZW9yZGVyZWQsXG4gICAgICAgIHRoaXMub25Db2x1bW5WaXNpYmlsaXR5Q2hhbmdlXG4gICAgICApLnBpcGUobWFwKGNvbmZpZyA9PiBjb25maWcuY29sdW1ucykpLFxuICAgICAgbWVyZ2UodGhpcy5vbkFkZEN1c3RvbUNvbHVtbiwgdGhpcy5vblJlbW92ZUN1c3RvbUNvbHVtbikucGlwZShcbiAgICAgICAgbWFwKCgpID0+ICh0aGlzLmNvbHVtbnMgfHwgW10pLm1hcCh0aGlzLm1hcENvbHVtblRvQ29uZmlnLmJpbmQodGhpcykpKVxuICAgICAgKSxcbiAgICAgIHRoaXMub25GaWx0ZXIucGlwZShcbiAgICAgICAgbWFwKCh7IGNvbHVtbk5hbWUsIGZpbHRlcmluZ01vZGlmaWVyIH0pID0+XG4gICAgICAgICAgdGhpcy5jb2x1bW5zLm1hcCh0aGlzLm1hcENvbHVtblRvQ29uZmlnLmJpbmQodGhpcykpLm1hcCgoY29sdW1uOiBDb2x1bW5Db25maWcpID0+IHtcbiAgICAgICAgICAgIGlmIChpc05pbChjb2x1bW5OYW1lKSkge1xuICAgICAgICAgICAgICBkZWxldGUgY29sdW1uLmZpbHRlcjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sdW1uLm5hbWUgPT09IGNvbHVtbk5hbWUpIHtcbiAgICAgICAgICAgICAgaWYgKGlzRW1wdHkoZmlsdGVyaW5nTW9kaWZpZXIpKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGNvbHVtbi5maWx0ZXI7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29sdW1uLmZpbHRlciA9IGZpbHRlcmluZ01vZGlmaWVyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjb2x1bW47XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgIClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKGNvbHVtbnM6IEFycmF5PENvbHVtbkNvbmZpZyB8IEN1c3RvbUNvbHVtbkNvbmZpZz4pID0+ICh7XG4gICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICBwYWdpbmF0aW9uOiB7IHBhZ2VTaXplOiB0aGlzLnBhZ2luYXRpb24ucGFnZVNpemUgfVxuICAgICAgICB9KSksXG4gICAgICAgIGZpbHRlcigoKSA9PiAhIXRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5KSxcbiAgICAgICAgdGhpcy50cmltRmlsdGVyQ29uZmlnUGlwZSgpLFxuICAgICAgICB0aGlzLnRyaW1Tb3J0Q29uZmlnUGlwZSgpLFxuICAgICAgICB0aGlzLnRyaW1DdXN0b21Db2x1bW5Db25maWdQaXBlKCksXG4gICAgICAgIHRoaXMuaWdub3JlQ29sdW1uT3JkZXJQaXBlKCksXG4gICAgICAgIHRoaXMuaWdub3JlQ29sdW1uVmlzaWJpbGl0eVBpcGUoKSxcbiAgICAgICAgY29uY2F0TWFwKChjb25maWc6IEdyaWRDb25maWcpID0+IHRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5LnNhdmVDb25maWckKGNvbmZpZykpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIHRyaW1GaWx0ZXJDb25maWdQaXBlKCk6IFVuYXJ5RnVuY3Rpb248T2JzZXJ2YWJsZTxHcmlkQ29uZmlnPiwgT2JzZXJ2YWJsZTxHcmlkQ29uZmlnPj4ge1xuICAgIHJldHVybiBwaXBlKFxuICAgICAgdGhpcy5jaGVja0V2ZW50UGlwZSgnZmlsdGVyJywgY29uZmlnID0+IHtcbiAgICAgICAgY29uZmlnLmNvbHVtbnMgPSAoY29uZmlnLmNvbHVtbnMgfHwgW10pLm1hcChjb2wgPT4ge1xuICAgICAgICAgIGRlbGV0ZSBjb2wuZmlsdGVyO1xuICAgICAgICAgIHJldHVybiBjb2w7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHRyaW1Tb3J0Q29uZmlnUGlwZSgpOiBVbmFyeUZ1bmN0aW9uPE9ic2VydmFibGU8R3JpZENvbmZpZz4sIE9ic2VydmFibGU8R3JpZENvbmZpZz4+IHtcbiAgICByZXR1cm4gcGlwZShcbiAgICAgIHRoaXMuY2hlY2tFdmVudFBpcGUoJ3NvcnQnLCBjb25maWcgPT4ge1xuICAgICAgICBjb25maWcuY29sdW1ucyA9IChjb25maWcuY29sdW1ucyB8fCBbXSkubWFwKGNvbCA9PiB7XG4gICAgICAgICAgY29sLnNvcnRPcmRlciA9ICcnO1xuICAgICAgICAgIHJldHVybiBjb2w7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHRyaW1DdXN0b21Db2x1bW5Db25maWdQaXBlKCk6IFVuYXJ5RnVuY3Rpb248XG4gICAgT2JzZXJ2YWJsZTxHcmlkQ29uZmlnPixcbiAgICBPYnNlcnZhYmxlPEdyaWRDb25maWc+XG4gID4ge1xuICAgIHJldHVybiBwaXBlKFxuICAgICAgdGhpcy5jaGVja0V2ZW50UGlwZSgnY3VzdG9tQ29sdW1ucycsIGNvbmZpZyA9PiB7XG4gICAgICAgIGNvbmZpZy5jb2x1bW5zID0gKGNvbmZpZy5jb2x1bW5zIHx8IFtdKS5maWx0ZXIoKGNvbDogQ3VzdG9tQ29sdW1uQ29uZmlnKSA9PiAhY29sLmN1c3RvbSk7XG5cbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaWdub3JlQ29sdW1uT3JkZXJQaXBlKCk6IFVuYXJ5RnVuY3Rpb248T2JzZXJ2YWJsZTxHcmlkQ29uZmlnPiwgT2JzZXJ2YWJsZTxHcmlkQ29uZmlnPj4ge1xuICAgIHJldHVybiBwaXBlKFxuICAgICAgdGhpcy5jaGVja0V2ZW50UGlwZSgnb3JkZXInLCBjb25maWcgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uU3RyYXRlZ3kuZ2V0Q29uZmlnJCgpLnBpcGUoXG4gICAgICAgICAgbWFwKG9sZENvbmZpZyA9PiB7XG4gICAgICAgICAgICBjb25zdCBvbGRDb2x1bW5zOiBDb2x1bW5Db25maWdbXSA9XG4gICAgICAgICAgICAgIG9sZENvbmZpZz8uY29sdW1ucyB8fCAodGhpcy5kZWZhdWx0Q29sdW1ucyBhcyBDb2x1bW5Db25maWdbXSk7XG4gICAgICAgICAgICAvLyBjaGVjayBpZiBjdXN0b20gY29sdW1ucyBoYXZlIGJlZW4gYWRkZWRcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbnNBZGRlZCA9IChjb25maWcuY29sdW1ucyB8fCBbXSkuZmlsdGVyKFxuICAgICAgICAgICAgICBjb2wgPT4gIW9sZENvbHVtbnMuZmluZChvbGQgPT4gb2xkLm5hbWUgPT09IGNvbC5uYW1lKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uZmlnLmNvbHVtbnMgPSBbXG4gICAgICAgICAgICAgIC4uLm9sZENvbHVtbnMubWFwKG9sZENvbCA9PlxuICAgICAgICAgICAgICAgIChjb25maWcuY29sdW1ucyB8fCBbXSkuZmluZChuZXdDb2wgPT4gbmV3Q29sLm5hbWUgPT09IG9sZENvbC5uYW1lKVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAuLi5jb2x1bW5zQWRkZWRcbiAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaWdub3JlQ29sdW1uVmlzaWJpbGl0eVBpcGUoKTogVW5hcnlGdW5jdGlvbjxcbiAgICBPYnNlcnZhYmxlPEdyaWRDb25maWc+LFxuICAgIE9ic2VydmFibGU8R3JpZENvbmZpZz5cbiAgPiB7XG4gICAgcmV0dXJuIHBpcGUoXG4gICAgICB0aGlzLmNoZWNrRXZlbnRQaXBlKCd2aXNpYmlsaXR5JywgY29uZmlnID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5LmdldENvbmZpZyQoKS5waXBlKFxuICAgICAgICAgIG1hcChvbGRDb25maWcgPT4ge1xuICAgICAgICAgICAgY29uZmlnLmNvbHVtbnMgPSAoY29uZmlnLmNvbHVtbnMgfHwgW10pLm1hcChuZXdDb2wgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBjb2x1bW5zOiBDb2x1bW5Db25maWdbXSA9XG4gICAgICAgICAgICAgICAgb2xkQ29uZmlnPy5jb2x1bW5zIHx8ICh0aGlzLmRlZmF1bHRDb2x1bW5zIGFzIENvbHVtbkNvbmZpZ1tdKTtcbiAgICAgICAgICAgICAgY29uc3Qgb2xkQ29sID0gY29sdW1ucy5maW5kKChjb2w6IGFueSkgPT4gbmV3Q29sLm5hbWUgPT09IGNvbC5uYW1lKTtcbiAgICAgICAgICAgICAgbmV3Q29sLnZpc2libGUgPSBvbGRDb2w/LnZpc2libGUgPz8gdHJ1ZTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ld0NvbDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrRXZlbnRQaXBlKFxuICAgIGNvbmZpZ1BhcnQ6IEdyaWRDb25maWdQYXJ0LFxuICAgIHRyaW1FdmVudERhdGFGbjogKGNvbmZpZzogR3JpZENvbmZpZykgPT4gR3JpZENvbmZpZyB8IE9ic2VydmFibGU8R3JpZENvbmZpZz5cbiAgKTogVW5hcnlGdW5jdGlvbjxPYnNlcnZhYmxlPEdyaWRDb25maWc+LCBPYnNlcnZhYmxlPEdyaWRDb25maWc+PiB7XG4gICAgcmV0dXJuIHBpcGUoXG4gICAgICBjb25jYXRNYXAoKGNvbmZpZzogR3JpZENvbmZpZykgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlQ29uZmlnRmlsdGVyXG4gICAgICAgICAgLmNhbGwodGhpcywgY29uZmlnUGFydClcbiAgICAgICAgICAucGlwZShtYXAoa2VlcEV2ZW50RGF0YSA9PiAoeyBjb25maWcsIGtlZXBFdmVudERhdGEgfSkpKTtcbiAgICAgIH0pLFxuICAgICAgbWFwKCh7IGNvbmZpZywga2VlcEV2ZW50RGF0YSB9KSA9PlxuICAgICAgICBrZWVwRXZlbnREYXRhID8gY29uZmlnIDogdHJpbUV2ZW50RGF0YUZuLmNhbGwodGhpcywgY29uZmlnKVxuICAgICAgKSxcbiAgICAgIGNvbmNhdE1hcChjb25maWcgPT4gKGlzT2JzZXJ2YWJsZShjb25maWcpID8gY29uZmlnIDogb2YoY29uZmlnKSkgYXMgT2JzZXJ2YWJsZTxHcmlkQ29uZmlnPilcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlQ29uZmlnRmlsdGVyKGNvbmZpZ1BhcnQ6IEdyaWRDb25maWdQYXJ0KTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgbGV0IHJlc3VsdDogYm9vbGVhbiB8IE9ic2VydmFibGU8Ym9vbGVhbj4gfCBQcm9taXNlPGJvb2xlYW4+O1xuICAgIGNvbnN0IHZhbHVlT3JGbiA9IHRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5LmdldENvbnRleHQoKT8uY29uZmlnRmlsdGVyPy5bY29uZmlnUGFydF07XG4gICAgaWYgKHR5cGVvZiB2YWx1ZU9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJlc3VsdCA9IHZhbHVlT3JGbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSB2YWx1ZU9yRm47XG4gICAgfVxuICAgIHJldHVybiB0b09ic2VydmFibGUocmVzdWx0ID8/IHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBzYWZlbHlJbnZva2VNYXRjaGVyKFxuICAgIG1hdGNoZXNGbjogKFxuICAgICAgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgY29udGV4dD86IEdyaWRDb25maWdDb250ZXh0XG4gICAgKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPiB8IE9ic2VydmFibGU8Ym9vbGVhbj4sXG4gICAgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIGNvbnRleHQ/OiBHcmlkQ29uZmlnQ29udGV4dFxuICApIHtcbiAgICBpZiAobWF0Y2hlc0ZuKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbWF0Y2hlc0ZuKHJvdXRlLCBjb250ZXh0KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cInRhYmxlLWRhdGEtZ3JpZC1zY3JvbGxcIlxuICAjc2Nyb2xsXG4gIFtuZ0NsYXNzXT1cIntcbiAgICAndGFibGUtZGF0YS1ncmlkX19vdmVybGF5JzogKGRhdGFTb3VyY2UubG9hZGluZyQgfCBhc3luYykgJiYgIWxvYWRNb3JlQ29tcG9uZW50Py5pc0xvYWRpbmdcbiAgfVwiXG4gIGRhdGEtY3k9XCJjOHktZGF0YS1ncmlkLS10YWJsZS1kYXRhLWdyaWQtc2Nyb2xsXCJcbj5cbiAgPGRpdlxuICAgIGNsYXNzPVwidGFibGUtZGF0YS1ncmlkX19sb2FkaW5nLS13cmFwcGVyXCJcbiAgICAqbmdJZj1cIihkYXRhU291cmNlLmxvYWRpbmckIHwgYXN5bmMpICYmICFsb2FkTW9yZUNvbXBvbmVudD8uaXNMb2FkaW5nXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1kYXRhLWdyaWRfX2xvYWRpbmctLWxvYWRlclwiPlxuICAgICAgPGM4eS1sb2FkaW5nXG4gICAgICAgIGxheW91dD1cImFwcGxpY2F0aW9uXCJcbiAgICAgICAgW21lc3NhZ2VdPVwibG9hZGluZ0l0ZW1zTGFiZWxcIlxuICAgICAgPjwvYzh5LWxvYWRpbmc+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXZcbiAgICBjbGFzcz1cInRhYmxlLWRhdGEtZ3JpZC1oZWFkZXIgc2VwYXJhdG9yIGxhcmdlLXBhZGRpbmdcIlxuICAgICpuZ0lmPVwiZGlzcGxheU9wdGlvbnMuZ3JpZEhlYWRlclwiXG4gID5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImg0XCJcbiAgICAgIFtuZ0NsYXNzXT1cInsgJ20tci0xNic6ICEhdGl0bGUgfVwiXG4gICAgPlxuICAgICAge3sgdGl0bGUgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2Rpdj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkaXNwbGF5T3B0aW9ucy5maWx0ZXJcIj5cbiAgICAgIDxzcGFuICpuZ0lmPVwiIWZpbHRlcmluZ0FwcGxpZWRcIj5cbiAgICAgICAgPHNtYWxsXG4gICAgICAgICAgY2xhc3M9XCJtLXItNFwiXG4gICAgICAgICAgKm5nSWY9XCIhIWZpbHRlcmluZ0xhYmVsc1BhcmFtcy5hbGxJdGVtc0NvdW50XCJcbiAgICAgICAgICBuZ05vbkJpbmRhYmxlXG4gICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgW3RyYW5zbGF0ZVBhcmFtc109XCJmaWx0ZXJpbmdMYWJlbHNQYXJhbXNcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgZmlsdGVyZWRJdGVtc0NvdW50IH19IG9mIHt7IGFsbEl0ZW1zQ291bnQgfX0gaXRlbXNcbiAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBjbGFzcz1cImxhYmVsIGxhYmVsLWRlZmF1bHQgbS1yLTRcIlxuICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICA+XG4gICAgICAgICAgTm8gZmlsdGVyc1xuICAgICAgICA8L3NwYW4+XG4gICAgICA8L3NwYW4+XG4gICAgICA8c3BhblxuICAgICAgICBjbGFzcz1cImQtZmxleCBhLWktY2VudGVyXCJcbiAgICAgICAgKm5nSWY9XCJmaWx0ZXJpbmdBcHBsaWVkXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiEhZmlsdGVyaW5nTGFiZWxzUGFyYW1zLmFsbEl0ZW1zQ291bnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYS1pLWNlbnRlclwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiYWRnZS1pbmZvIG0tci00XCI+XG4gICAgICAgICAgICAgIHt7IChkYXRhU291cmNlLnN0YXRzJCB8IGFzeW5jKS5maWx0ZXJlZFNpemUgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzbWFsbFxuICAgICAgICAgICAgICBuZ05vbkJpbmRhYmxlXG4gICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICBbdHJhbnNsYXRlUGFyYW1zXT1cImZpbHRlcmluZ0xhYmVsc1BhcmFtc1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIG9mIHt7IGFsbEl0ZW1zQ291bnQgfX0gaXRlbXNcbiAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJkcm9wZG93blwiXG4gICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tIGxlZnRcIlxuICAgICAgICAgIGRyb3Bkb3duXG4gICAgICAgICAgI2RkRmlsdGVycz1cImJzLWRyb3Bkb3duXCJcbiAgICAgICAgICBbY2RrVHJhcEZvY3VzXT1cImRkRmlsdGVycy5pc09wZW5cIlxuICAgICAgICAgIFtpbnNpZGVDbGlja109XCJ0cnVlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbSBtLWwtOFwiXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdBY3RpdmUgZmlsdGVycycgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgYXJpYS1oYXNwb3B1cD1cInRydWVcIlxuICAgICAgICAgICAgZHJvcGRvd25Ub2dnbGVcbiAgICAgICAgICAgIGRhdGEtY3k9XCJjOHktZGF0YS1ncmlkLS1maWx0ZXJzXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICBjbGFzcz1cIm0tci00XCJcbiAgICAgICAgICAgICAgYzh5SWNvbj1cImZpbHRlclwiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgPHNwYW4+e3sgJ0FjdGl2ZSBmaWx0ZXJzJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmFkZ2Utc3lzdGVtXCI+XG4gICAgICAgICAgICAgIHt7IGNvbHVtbnNXaXRoRmlsdGVyc0FwcGxpZWQubGVuZ3RoIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIlxuICAgICAgICAgICAgKmRyb3Bkb3duTWVudVxuICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGEtZ3JpZF9fZHJvcGRvd24gYmctbGV2ZWwtMFwiPlxuICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LXVuc3R5bGVkIG0tMFwiPlxuICAgICAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zV2l0aEZpbHRlcnNBcHBsaWVkOyBsZXQgbGFzdCA9IGxhc3RcIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc2VwYXJhdG9yLWJvdHRvbSc6ICFsYXN0IH1cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWhlYWRlciBzdGlja3ktdG9wIHRleHQtdHJ1bmNhdGUgbm8tYm9yZGVyLXRvcCBwLWItMFwiXG4gICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAoY29sdW1uLmhlYWRlciB8IHRyYW5zbGF0ZSkgfHwgY29sdW1uLm5hbWUgfX1cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgKGNvbHVtbi5oZWFkZXIgfCB0cmFuc2xhdGUpIHx8IGNvbHVtbi5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBib3JkZXJsZXNzIGQtZmxleCBkLWNvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZ3JvdXBlZEZpbHRlckNoaXBzIG9mIGNvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICB8IG1hcFRvRmlsdGVyQ2hpcHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhc3luY1xuICAgICAgICAgICAgICAgICAgICAgICAgICB8IGdyb3VwZWRGaWx0ZXJDaGlwcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmaXJzdCA9IGZpcnN0XG4gICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdwLXQtMCc6IGZpcnN0IH1cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPHBcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic21hbGwgcC1iLTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJncm91cGVkRmlsdGVyQ2hpcHMubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdyb3VwZWRGaWx0ZXJDaGlwcy5sYWJlbCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGEtaS1jZW50ZXIgZ2FwLTQgZmxleC13cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRhZyB0YWctLWluZm8gY2hpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjaGlwIG9mIGdyb3VwZWRGaWx0ZXJDaGlwcy5jaGlwc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4teHMgYnRuLWNsZWFuIHRleHQtMTAgbS1yLTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ1JlbW92ZSBmaWx0ZXInIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlRmlsdGVyKGNoaXAucmVtb3ZlKCkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWN5PVwiYzh5LWRhdGEtZ3JpZC0tcmVtb3ZlLWNoaXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cInRpbWVzXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY2hpcC5kaXNwbGF5VmFsdWUgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIHNlcGFyYXRvci10b3Agc3RpY2t5LWJvdHRvbVwiPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1kZWZhdWx0XCJcbiAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdDbGVhciBhbGwgZmlsdGVycycgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhckZpbHRlcnMoKVwiXG4gICAgICAgICAgICAgICAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLWNsZWFyLWZpbHRlcnNcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgJ0NsZWFyIGFsbCBmaWx0ZXJzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvc3Bhbj5cblxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImJ0bi1oZWxwIGJ0bi1oZWxwLS1zbSBoaWRkZW4teHMgaGlkZGVuLXNtXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInSGVscCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICBbcG9wb3Zlcl09XCJmaWx0ZXJzSGVscFBvcG92ZXJcIlxuICAgICAgICBwbGFjZW1lbnQ9XCJyaWdodFwiXG4gICAgICAgIHRyaWdnZXJzPVwiZm9jdXNcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgKm5nSWY9XCJkaXNwbGF5T3B0aW9ucy5maWx0ZXJcIlxuICAgICAgICBkYXRhLWN5PVwiZGF0YS1ncmlkLS1oZWxwLWZpbHRlcnNcIlxuICAgICAgPlxuICAgICAgICA8aSBjOHlJY29uPVwicXVlc3Rpb24tY2lyY2xlLW9cIj48L2k+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjZmlsdGVyc0hlbHBQb3BvdmVyPlxuICAgICAgICA8ZGl2IFtpbm5lckh0bWxdPVwiZmlsdGVyc0hlbHBQb3BvdmVySHRtbCB8IHRyYW5zbGF0ZVwiPjwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImJ0bi1jbGVhbiB0ZXh0LXByaW1hcnkgaGlkZGVuLXhzIGhpZGRlbi1zbVwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0hlbHAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgcG9wb3Zlcj1cInt7ICdUaGUgY291bnRlciBmb3IgdGhlIHRvdGFsIG51bWJlciBvZiBpdGVtcyBtaWdodCBiZSBpbmFjY3VyYXRlLicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICBwbGFjZW1lbnQ9XCJyaWdodFwiXG4gICAgICAgIHRyaWdnZXJzPVwiZm9jdXNcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgKm5nSWY9XCJzaG93Q291bnRlcldhcm5pbmdcIlxuICAgICAgPlxuICAgICAgICA8aSBjOHlJY29uPVwid2FybmluZ1wiPjwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPGRpdiBjbGFzcz1cIm0tbC1hdXRvXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiYnRuYmFyIGQtZmxleCBhLWktY2VudGVyXCI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgaGVhZGVyQWN0aW9uQ29udHJvbCBvZiBoZWFkZXJBY3Rpb25Db250cm9scyB8IHZpc2libGVDb250cm9scyB8IGFzeW5jXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaGVhZGVyQWN0aW9uQ29udHJvbC50ZW1wbGF0ZTsgZWxzZSBjdXN0b21UZW1wbGF0ZVwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cImJ0bmJhci1idG4gYnRuLWxpbmtcIlxuICAgICAgICAgICAgICB0aXRsZT1cInt7IGhlYWRlckFjdGlvbkNvbnRyb2wudGV4dCB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiaGVhZGVyQWN0aW9uQ29udHJvbC5jYWxsYmFjaygpXCJcbiAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkNVU1RPTV9BQ1RJT04sXG4gICAgICAgICAgICAgICAgY3VzdG9tQWN0aW9uTmFtZTogaGVhZGVyQWN0aW9uQ29udHJvbC50ZXh0LFxuICAgICAgICAgICAgICAgIHR5cGU6IGhlYWRlckFjdGlvbkNvbnRyb2wudHlwZVxuICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm0tci00XCJcbiAgICAgICAgICAgICAgICBbYzh5SWNvbl09XCJoZWFkZXJBY3Rpb25Db250cm9sLmljb25cIlxuICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICA8c3Bhbj57eyBoZWFkZXJBY3Rpb25Db250cm9sLnRleHQgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2N1c3RvbVRlbXBsYXRlPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIGhlYWRlckFjdGlvbkNvbnRyb2wudGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgY29udGV4dDogeyBoZWFkZXJBY3Rpb25Db250cm9sOiBoZWFkZXJBY3Rpb25Db250cm9sIH1cbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJkcm9wZG93blwiXG4gICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tIGxlZnRcIlxuICAgICAgICAgICpuZ0lmPVwiY29uZmlndXJlQ29sdW1uc0VuYWJsZWRcIlxuICAgICAgICAgIGRyb3Bkb3duXG4gICAgICAgICAgI2RkQ29uZmlndXJlQ29sdW1ucz1cImJzLWRyb3Bkb3duXCJcbiAgICAgICAgICBbY2RrVHJhcEZvY3VzXT1cImRkQ29uZmlndXJlQ29sdW1ucy5pc09wZW5cIlxuICAgICAgICAgIFtpbnNpZGVDbGlja109XCJ0cnVlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwiYnRuYmFyLWJ0blwiXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdDb25maWd1cmUgY29sdW1ucycgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBkYXRhLWN5PVwiZGF0YS1ncmlkLS1jdXN0b20tY29sdW1uLWJ0blwiXG4gICAgICAgICAgICBkcm9wZG93blRvZ2dsZVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgIGNsYXNzPVwibS1yLTRcIlxuICAgICAgICAgICAgICBjOHlJY29uPVwiY29sdW1uc1wiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgPHNwYW4+e3sgJ0NvbmZpZ3VyZSBjb2x1bW5zJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDx1bFxuICAgICAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1tZW51IGRhdGEtZ3JpZF9fZHJvcGRvd25cIlxuICAgICAgICAgICAgKmRyb3Bkb3duTWVudVxuICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJsaXN0LWdyb3VwIG0tMFwiXG4gICAgICAgICAgICAgICAgY2RrRHJvcExpc3RcbiAgICAgICAgICAgICAgICAoY2RrRHJvcExpc3REcm9wcGVkKT1cIm9uQ29sdW1uRHJvcCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uc1wiXG4gICAgICAgICAgICAgICAgICBjZGtEcmFnXG4gICAgICAgICAgICAgICAgICBjZGtEcmFnTG9ja0F4aXM9XCJ5XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbHVtbi5wb3NpdGlvbkZpeGVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gZHJhZ2dhYmxlLWFmdGVyIHAtMCBhLWktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImM4eS1jaGVja2JveCBwLWwtMTZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAoY29sdW1uLmhlYWRlciB8IHRyYW5zbGF0ZSkgfHwgY29sdW1uLm5hbWUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1jeV09XCInZGF0YS1ncmlkLS1jdXN0b20tY29sdW1uLWhlYWRlci0nICsgY29sdW1uLmhlYWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY29sdW1uLnZpc2libGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUdyaWRDb2x1bW5zU2l6ZSgpOyBlbWl0Q29uZmlnQ2hhbmdlKCdjaGFuZ2VDb2x1bW5WaXNpYmlsaXR5JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkNIQU5HRV9WSVNJQklMSVRZLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogIWNvbHVtbi52aXNpYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IChjb2x1bW4uaGVhZGVyIHwgdHJhbnNsYXRlKSB8fCBjb2x1bW4ubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kb3Qgc2hvd09uSG92ZXIgbWF4LXdpZHRoLWZpdCBhLWktY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1JlbW92ZWBjb2x1bW4sdmVyYmAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXA9XCJ7eyAnUmVtb3ZlYGNvbHVtbix2ZXJiYCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50PVwibGVmdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUN1c3RvbUNvbHVtbihwb0NvbmZpcm0sIGNvbHVtbiwgZGRDb25maWd1cmVDb2x1bW5zKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi5jdXN0b21cIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxjOHktcG9wb3Zlci1jb25maXJtXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInQ29uZmlybSByZW1vdmFsJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJzPVwiZm9jdXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2VtZW50XT1cIidsZWZ0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICNwb0NvbmZpcm1cbiAgICAgICAgICAgICAgICAgICAgICAgID48L2M4eS1wb3BvdmVyLWNvbmZpcm0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjOHlJY29uPVwibWludXMtY2lyY2xlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1jeT1cImRhdGEtZ3JpZC0tY3VzdG9tLWNvbHVtbi1yZW1vdmUtYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICBjbGFzcz1cInAtOCBzdGlja3ktYm90dG9tIHNlcGFyYXRvci10b3BcIlxuICAgICAgICAgICAgICAqbmdJZj1cImlzQ29uZmlnQ29udGV4dEtub3duXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1ibG9ja1wiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnQWRkIGN1c3RvbSBjb2x1bW4nIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBkYXRhLWN5PVwiZGF0YS1ncmlkLS1hZGQtY3VzdG9tLWNvbHVtblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5DdXN0b21Db2x1bW5Nb2RhbCgpOyBkZENvbmZpZ3VyZUNvbHVtbnMuaGlkZSgpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cIm0tci00XCJcbiAgICAgICAgICAgICAgICAgIGM4eUljb249XCJwbHVzLWNpcmNsZVwiXG4gICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyAnQWRkIGN1c3RvbSBjb2x1bW4nIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiYnRuYmFyLWJ0biBidG4tbGlua1wiXG4gICAgICAgICAgdGl0bGU9XCJ7eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgKm5nSWY9XCIhaGlkZVJlbG9hZFwiXG4gICAgICAgICAgZGF0YS1jeT1cImRhdGEtZ3JpZC0tcmVsb2FkLWJ0blwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRhdGFTb3VyY2UubG9hZGluZyQgfCBhc3luY1wiXG4gICAgICAgICAgKGNsaWNrKT1cImNsaWNrUmVsb2FkKClcIlxuICAgICAgICA+XG4gICAgICAgICAgPGlcbiAgICAgICAgICAgIGNsYXNzPVwibS1yLTRcIlxuICAgICAgICAgICAgYzh5SWNvbj1cInJlZnJlc2hcIlxuICAgICAgICAgID48L2k+XG4gICAgICAgICAgPHNwYW4+e3sgJ1JlbG9hZCcgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLXNlYXJjaCBtLWwtc20tMTYgZGF0YS1ncmlkX19zZWFyY2gtaW5wdXRcIlxuICAgICAgICAgICpuZ0lmPVwiIXNlcnZlclNpZGVEYXRhQ2FsbGJhY2sgfHwgc2hvd1NlYXJjaFwiXG4gICAgICAgID5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ1NlYXJjaOKApicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgdHlwZT1cInNlYXJjaFwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaFRleHRcIlxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2VhcmNoVGV4dCQuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgcGVyZm9ybVNlYXJjaChzZWFyY2hUZXh0KVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYWRkb25cIj5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgIGM4eUljb249XCJzZWFyY2hcIlxuICAgICAgICAgICAgICAqbmdJZj1cInNlYXJjaFRleHQubGVuZ3RoID09PSAwXCJcbiAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICBjbGFzcz1cInBvaW50ZXJcIlxuICAgICAgICAgICAgICBjOHlJY29uPVwidGltZXNcIlxuICAgICAgICAgICAgICAqbmdJZj1cInNlYXJjaFRleHQubGVuZ3RoID4gMFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWFyY2hUZXh0ID0gJyc7IHNlYXJjaFRleHQkLmVtaXQoJycpXCJcbiAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7IGFjdGlvbjogUFhfQUNUSU9OUy5DTEVBUl9TRUFSQ0ggfVwiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwidGFibGUtZGF0YS1ncmlkLWhlYWRlci1idWxrLWFjdGlvbnMgYW5pbWF0ZWQgc2xpZGVJbkRvd24gZmFzdFwiXG4gICAgICBkYXRhLWN5PVwidGFibGUtZGF0YS1ncmlkLWhlYWRlci1idWxrLWFjdGlvbnNcIlxuICAgICAgKm5nSWY9XCJzZWxlY3RlZEl0ZW1JZHMubGVuZ3RoICE9PSAwXCJcbiAgICA+XG4gICAgICA8aDQ+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nUGx1cmFsXT1cInNlbGVjdGVkSXRlbUlkcy5sZW5ndGhcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgbmdQbHVyYWxDYXNlPVwiPTFcIj5cbiAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT4xIHNlbGVjdGVkIGl0ZW0uPC9zcGFuPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIG5nUGx1cmFsQ2FzZT1cIm90aGVyXCI+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBuZ05vbkJpbmRhYmxlXG4gICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICBbdHJhbnNsYXRlUGFyYW1zXT1cInsgY291bnQ6IHNlbGVjdGVkSXRlbUlkcy5sZW5ndGggfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGNvdW50IH19IHNlbGVjdGVkIGl0ZW1zLlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8YnIgY2xhc3M9XCJ2aXNpYmxlLXhzXCIgLz5cbiAgICAgICAgPHNtYWxsICpuZ0lmPVwiIXNlcnZlclNpZGVEYXRhQ2FsbGJhY2sgJiYgc2VsZWN0ZWRJdGVtSWRzLmxlbmd0aCA+PSBwYWdpbmF0aW9uLnBhZ2VTaXplXCI+XG4gICAgICAgICAgPGFcbiAgICAgICAgICAgIGNsYXNzPVwiaW50ZXJhY3RcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNldEFsbEl0ZW1zU2VsZWN0ZWQodHJ1ZSlcIlxuICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cInsgYWN0aW9uOiBQWF9BQ1RJT05TLlNFTEVDVF9BTExfSVRFTVMgfVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgbmdOb25CaW5kYWJsZVxuICAgICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgW3RyYW5zbGF0ZVBhcmFtc109XCJ7IGNvdW50OiAoZGF0YVNvdXJjZS5zdGF0cyQgfCBhc3luYykuZmlsdGVyZWRTaXplIH1cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBTZWxlY3QgYWxsIHt7IGNvdW50IH19IGl0ZW1zXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L3NtYWxsPlxuICAgICAgPC9oND5cbiAgICAgIDxkaXYgY2xhc3M9XCJtLWwtYXV0b1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuYmFyIGQtZmxleFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICBsZXQgYnVsa0FjdGlvbkNvbnRyb2wgb2YgYnVsa0FjdGlvbkNvbnRyb2xzIHwgdmlzaWJsZUNvbnRyb2xzOiBzZWxlY3RlZEl0ZW1JZHMgfCBhc3luY1xuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJidWxrQWN0aW9uQ29udHJvbC50eXBlXCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bmJhci1idG5cIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0V4cG9ydCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJidWxrQWN0aW9uQ29udHJvbC5jYWxsYmFjayhzZWxlY3RlZEl0ZW1JZHMsIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImJ1aWx0SW5BY3Rpb25UeXBlLkV4cG9ydFwiXG4gICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwieyBhY3Rpb246IFBYX0FDVElPTlMuQlVMS19FWFBPUlQgfVwiXG4gICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwic2lnbi1vdXRcIj48L2k+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgJ0V4cG9ydCcgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bmJhci1idG5cIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0RlbGV0ZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJidWxrQWN0aW9uQ29udHJvbC5jYWxsYmFjayhzZWxlY3RlZEl0ZW1JZHMsIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImJ1aWx0SW5BY3Rpb25UeXBlLkRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwieyBhY3Rpb246IFBYX0FDVElPTlMuQlVMS19ERUxFVEUgfVwiXG4gICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwiZGVsZXRlXCI+PC9pPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7ICdEZWxldGUnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG5iYXItYnRuXCJcbiAgICAgICAgICAgICAgICB0aXRsZT1cInt7IGJ1bGtBY3Rpb25Db250cm9sLnRleHQgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJidWxrQWN0aW9uQ29udHJvbC5jYWxsYmFjayhzZWxlY3RlZEl0ZW1JZHMsIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgKm5nU3dpdGNoRGVmYXVsdFxuICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5CVUxLX0NVU1RPTV9BQ1RJT04sXG4gICAgICAgICAgICAgICAgICBjdXN0b21BY3Rpb25OYW1lOiBidWxrQWN0aW9uQ29udHJvbC50ZXh0XG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImJ1bGtBY3Rpb25Db250cm9sLmljb25DbGFzc2VzXCJcbiAgICAgICAgICAgICAgICAgIGM4eUljb249XCJ7eyBidWxrQWN0aW9uQ29udHJvbC5pY29uIH19XCJcbiAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IGJ1bGtBY3Rpb25Db250cm9sLnRleHQgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cImJ0bmJhci1idG5cIlxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnQ2FuY2VsJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJjYW5jZWwoKVwiXG4gICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5CVUxLX0NBTkNFTFxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIGM4eUljb249XCJ0aW1lc1wiPjwvaT5cbiAgICAgICAgICAgIDxzcGFuPnt7ICdDYW5jZWwnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8dGFibGVcbiAgICBjbGFzcz1cInRhYmxlIHRhYmxlLWZpbHRlcmVkLXNvcnRlZCB0YWJsZS1kYXRhLWdyaWQgbGFyZ2UtcGFkZGluZ1wiXG4gICAgW2NsYXNzLnRhYmxlLXN0cmlwZWRdPVwiZGlzcGxheU9wdGlvbnMuc3RyaXBlZFwiXG4gICAgW2NsYXNzLnRhYmxlLWJvcmRlcmVkXT1cImRpc3BsYXlPcHRpb25zLmJvcmRlcmVkXCJcbiAgICBbY2xhc3MudGFibGUtaG92ZXJdPVwiZGlzcGxheU9wdGlvbnMuaG92ZXJcIlxuICAgIFtjbGFzcy50YWJsZS1kYXRhLWdyaWQtd2l0aC1jaGVja2JveGVzXT1cInNlbGVjdGFibGVcIlxuICAgIFtjbGFzcy50YWJsZS1kYXRhLWdyaWQtd2l0aC1hY3Rpb25zXT1cImFjdGlvbkNvbnRyb2xzLmxlbmd0aCA+IDBcIlxuICAgIFtzdHlsZS5ncmlkLXRlbXBsYXRlLWNvbHVtbnNdPVwic3R5bGVzLmdyaWRUZW1wbGF0ZUNvbHVtbnNcIlxuICAgIGNkay10YWJsZVxuICAgIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIlxuICAgIFttdWx0aVRlbXBsYXRlRGF0YVJvd3NdPVwidHJ1ZVwiXG4gICAgKG1vdXNlbW92ZSk9XCJyZXNpemVIYW5kbGVDb250YWluZXJNb3VzZU1vdmUkLmVtaXQoJGV2ZW50KVwiXG4gICAgKG1vdXNldXApPVwicmVzaXplSGFuZGxlQ29udGFpbmVyTW91c2VVcCQuZW1pdCgkZXZlbnQpXCJcbiAgICBkYXRhLWN5PVwiYzh5LWRhdGEtZ3JpZC0tdGFibGVcIlxuICA+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5TmFtZVwiXG4gICAgICBbY2RrQ29sdW1uRGVmXT1cImNvbHVtbi5uYW1lXCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb2x1bW4ubmFtZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY2hlY2tib3gnXCI+XG4gICAgICAgICAgPHRoXG4gICAgICAgICAgICBjZGstaGVhZGVyLWNlbGxcbiAgICAgICAgICAgICpjZGtIZWFkZXJDZWxsRGVmXG4gICAgICAgICAgICBkYXRhLXR5cGU9XCJpY29uXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjOHktY2hlY2tib3hcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1NlbGVjdGVkJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiY3VycmVudFBhZ2VTZWxlY3Rpb25TdGF0ZS5hbGxTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJcbiAgICAgICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGFnZVNlbGVjdGlvblN0YXRlLmFsbFNlbGVjdGVkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBhZ2VTZWxlY3Rpb25TdGF0ZS5hbGxEZXNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldEFsbEl0ZW1zSW5DdXJyZW50UGFnZVNlbGVjdGVkKCRldmVudC50YXJnZXQuY2hlY2tlZClcIlxuICAgICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cInsgYWN0aW9uOiBQWF9BQ1RJT05TLlNFTEVDVF9BTExfSVRFTVMgfVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RoPlxuXG4gICAgICAgICAgPHRkXG4gICAgICAgICAgICBjZGstY2VsbFxuICAgICAgICAgICAgKmNka0NlbGxEZWY9XCJsZXQgcm93XCJcbiAgICAgICAgICAgIGRhdGEtdHlwZT1cImljb25cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImM4eS1jaGVja2JveFwiPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidTZWxlY3RlZCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNJdGVtU2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZXRJdGVtc1NlbGVjdGVkKFtyb3ddLCAkZXZlbnQudGFyZ2V0LmNoZWNrZWQpXCJcbiAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuU0VMRUNUX0lURU0sXG4gICAgICAgICAgICAgICAgICBpZDogcm93LmlkXG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncmFkaW8tYnV0dG9uJ1wiPlxuICAgICAgICAgIDx0aFxuICAgICAgICAgICAgY2RrLWhlYWRlci1jZWxsXG4gICAgICAgICAgICAqY2RrSGVhZGVyQ2VsbERlZlxuICAgICAgICAgICAgZGF0YS10eXBlPVwiaWNvblwiXG4gICAgICAgICAgPjwvdGg+XG5cbiAgICAgICAgICA8dGRcbiAgICAgICAgICAgIGNkay1jZWxsXG4gICAgICAgICAgICAqY2RrQ2VsbERlZj1cImxldCByb3dcIlxuICAgICAgICAgICAgZGF0YS10eXBlPVwiaWNvblwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYzh5LXJhZGlvXCI+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1NlbGVjdGVkJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgbmFtZT1cInNlbGVjdC1yb3dcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJyYWRpb1wiXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNJdGVtU2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjaGFuZ2VTZWxlY3RlZEl0ZW0ocm93KVwiXG4gICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLlNFTEVDVF9JVEVNLFxuICAgICAgICAgICAgICAgICAgaWQ6IHJvdy5pZFxuICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJjOHktZGF0YS1ncmlkLS1yYWRpb1wiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2FjdGlvbnMnXCI+XG4gICAgICAgICAgPHRoXG4gICAgICAgICAgICBjZGstaGVhZGVyLWNlbGxcbiAgICAgICAgICAgICpjZGtIZWFkZXJDZWxsRGVmXG4gICAgICAgICAgICBkYXRhLXR5cGU9XCJpY29uXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtbWVkaXVtIHNyLW9ubHlcIj57eyAnQWN0aW9ucycgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgICAgPC90aD5cblxuICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgY2RrLWNlbGxcbiAgICAgICAgICAgICpjZGtDZWxsRGVmPVwibGV0IHJvd1wiXG4gICAgICAgICAgICBkYXRhLXR5cGU9XCJpY29uXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgIGxldCBhY3Rpb25Db250cm9sIG9mIGFjdGlvbkNvbnRyb2xzXG4gICAgICAgICAgICAgICAgICB8IHZpc2libGVDb250cm9sczogcm93XG4gICAgICAgICAgICAgICAgICB8IGFzeW5jXG4gICAgICAgICAgICAgICAgICB8IHNsaWNlOiAwIDogKChhY3Rpb25Db250cm9scyB8IHZpc2libGVDb250cm9sczogcm93IHwgYXN5bmMpPy5sZW5ndGggPiAyID8gMSA6IDIpXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImFjdGlvbkNvbnRyb2wudHlwZVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kb3RcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInRWRpdCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgdG9vbHRpcD1cInt7ICdFZGl0JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImJ1aWx0SW5BY3Rpb25UeXBlLkVkaXRcIlxuICAgICAgICAgICAgICAgICAgW2RlbGF5XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aW9uQ29udHJvbC5jYWxsYmFjayhyb3csIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuRURJVF9JVEVNLFxuICAgICAgICAgICAgICAgICAgICBpZDogcm93LmlkXG4gICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJjOHktZGF0YS1ncmlkLS1lZGl0LWJ1dHRvbi1pbi1yb3dcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJwZW5jaWxcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZG90IGJ0bi1kb3QtLWRhbmdlciBzaG93T25Ib3ZlclwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidEZWxldGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIHRvb2x0aXA9XCJ7eyAnRGVsZXRlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgW2RlbGF5XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aW9uQ29udHJvbC5jYWxsYmFjayhyb3csIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiYnVpbHRJbkFjdGlvblR5cGUuRGVsZXRlXCJcbiAgICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkRFTEVURV9JVEVNLFxuICAgICAgICAgICAgICAgICAgICBpZDogcm93LmlkXG4gICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgICAgICBkYXRhLWN5PVwiYzh5LWRhdGEtZ3JpZC0tcmVtb3ZlLWJ1dHRvbi1pbi1yb3dcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJkZWxldGVcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZG90XCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGFjdGlvbkNvbnRyb2wuaWNvbiA/IGFjdGlvbkNvbnRyb2wudGV4dCA6ICcnKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICB0b29sdGlwPVwie3sgKGFjdGlvbkNvbnRyb2wuaWNvbiA/IGFjdGlvbkNvbnRyb2wudGV4dCA6ICcnKSB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBzaG93T25Ib3ZlcjogYWN0aW9uQ29udHJvbC5zaG93T25Ib3ZlciB9XCJcbiAgICAgICAgICAgICAgICAgIFtkZWxheV09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoRGVmYXVsdFxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGlvbkNvbnRyb2wuY2FsbGJhY2socm93LCByZWxvYWQuYmluZCh0aGlzKSlcIlxuICAgICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuQ1VTVE9NX0FDVElPTl9JVEVNLFxuICAgICAgICAgICAgICAgICAgICBjdXN0b21BY3Rpb25OYW1lOiBhY3Rpb25Db250cm9sLnRleHQsXG4gICAgICAgICAgICAgICAgICAgIGlkOiByb3cuaWRcbiAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtY3ldPVwiJ2M4eS1kYXRhLWdyaWQtLWJ1dHRvbi1pbi1yb3ctLScgKyBhY3Rpb25Db250cm9sLnRleHRcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgIGM4eUljb249XCJ7eyBhY3Rpb25Db250cm9sLmljb24gfX1cIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJhY3Rpb25Db250cm9sLmljb25DbGFzc2VzXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJhY3Rpb25Db250cm9sLmljb25cIlxuICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWFjdGlvbkNvbnRyb2wuaWNvblwiPnt7IGFjdGlvbkNvbnRyb2wudGV4dCB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgJ20tbC1hdXRvIG92ZXJmbG93LXZpc2libGUnOlxuICAgICAgICAgICAgICAgICAgKGFjdGlvbkNvbnRyb2xzIHwgdmlzaWJsZUNvbnRyb2xzOiByb3cgfCBhc3luYyk/Lmxlbmd0aCA+IDJcbiAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b20gcmlnaHRcIlxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgIGRyb3Bkb3duXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIoYWN0aW9uQ29udHJvbHMgfCB2aXNpYmxlQ29udHJvbHM6IHJvdyB8IGFzeW5jKT8ubGVuZ3RoID4gMlwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLXRvZ2dsZSBjOHktZHJvcGRvd25cIlxuICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnQWN0aW9ucycgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgYXJpYS1oYXNwb3B1cD1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBkYXRhLWN5PVwiYzh5LWRhdGEtZ3JpZC0tcm93LWFjdGlvbnMtZHJvcGRvd25cIlxuICAgICAgICAgICAgICAgICAgZHJvcGRvd25Ub2dnbGVcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwiZWxsaXBzaXMtdlwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8dWxcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24tbWVudSBkcm9wZG93bi1tZW51LXJpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICpkcm9wZG93bk1lbnVcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGFjdGlvbkNvbnRyb2wgb2YgYWN0aW9uQ29udHJvbHNcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgdmlzaWJsZUNvbnRyb2xzOiByb3dcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgYXN5bmNcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgc2xpY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoKGFjdGlvbkNvbnRyb2xzIHwgdmlzaWJsZUNvbnRyb2xzOiByb3cgfCBhc3luYyk/Lmxlbmd0aCA+IDIgPyAxIDogMilcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiYWN0aW9uQ29udHJvbC50eXBlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnRWRpdCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiYnVpbHRJbkFjdGlvblR5cGUuRWRpdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aW9uQ29udHJvbC5jYWxsYmFjayhyb3csIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5FRElUX0lURU0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiByb3cuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwicGVuY2lsXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0VkaXQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnRGVsZXRlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJidWlsdEluQWN0aW9uVHlwZS5EZWxldGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGlvbkNvbnRyb2wuY2FsbGJhY2socm93LCByZWxvYWQuYmluZCh0aGlzKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuREVMRVRFX0lURU0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiByb3cuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwiZGVsZXRlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0RlbGV0ZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdFeHBvcnQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImJ1aWx0SW5BY3Rpb25UeXBlLkV4cG9ydFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aW9uQ29udHJvbC5jYWxsYmFjayhyb3csIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5FWFBPUlRfSVRFTSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHJvdy5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJkYXRhLWV4cG9ydFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdFeHBvcnQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyBhY3Rpb25Db250cm9sLnRleHQgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hEZWZhdWx0XG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aW9uQ29udHJvbC5jYWxsYmFjayhyb3csIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuQ1VTVE9NX0FDVElPTl9JVEVNLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21BY3Rpb25OYW1lOiBhY3Rpb25Db250cm9sLnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiByb3cuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGM4eUljb249XCJ7eyBhY3Rpb25Db250cm9sLmljb24gfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJhY3Rpb25Db250cm9sLmljb25DbGFzc2VzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBhY3Rpb25Db250cm9sLnRleHQgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxuICAgICAgICAgIDx0aFxuICAgICAgICAgICAgW2NsYXNzLnNvcnRlZF09XCJjb2x1bW4uc29ydE9yZGVyXCJcbiAgICAgICAgICAgIFtjbGFzcy5maWx0ZXJlZF09XCJjb2x1bW4gfCBtYXA6IGlzQ29sdW1uRmlsdGVyaW5nQXBwbGllZFwiXG4gICAgICAgICAgICBbY2xhc3MuaGlkZGVuXT1cIiFjb2x1bW4udmlzaWJsZVwiXG4gICAgICAgICAgICBjZGstaGVhZGVyLWNlbGxcbiAgICAgICAgICAgICpjZGtIZWFkZXJDZWxsRGVmXG4gICAgICAgICAgICBbbmdDbGFzc109XCJjb2x1bW4uaGVhZGVyQ1NTQ2xhc3NOYW1lXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdHlwZV09XCJjb2x1bW4uZGF0YVR5cGVcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb2x1bW4uaGVhZGVyIHwgdHJhbnNsYXRlKSB8fCBjb2x1bW4ubmFtZVwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiIWNvbHVtbi5maWx0ZXJhYmxlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lOiBjb2x1bW4ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogKGNvbHVtbi5oZWFkZXIgfCB0cmFuc2xhdGUpIHx8IGNvbHVtbi5uYW1lXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIF0gfCBtYXA6IGdldEhlYWRlckNlbGxSZW5kZXJlclNwZWMgOiB0aGlzIGFzIGNlbGxSZW5kZXJlclNwZWNcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGM4eS1jZWxsLXJlbmRlcmVyIFtzcGVjXT1cImNlbGxSZW5kZXJlclNwZWNcIj48L2M4eS1jZWxsLXJlbmRlcmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIGlzRHJvcERvd25QbGFjZWRSaWdodCB0byBiZSByZW1vdmVkIHdoZW4gY29sdW1ucyBhcmUgdHJhbnNmb3JtZWQgdG8gb2JzZXJ2YWJsZXMuIC0tPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tIHt7IGlzRHJvcERvd25QbGFjZWRSaWdodChjb2x1bW4pID8gJ3JpZ2h0JyA6ICdsZWZ0JyB9fVwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLmZpbHRlcmFibGVcIlxuICAgICAgICAgICAgICBkcm9wZG93blxuICAgICAgICAgICAgICAjZ3JpZEhlYWRlckRyb3Bkb3duPVwiYnMtZHJvcGRvd25cIlxuICAgICAgICAgICAgICBbY2RrVHJhcEZvY3VzXT1cImdyaWRIZWFkZXJEcm9wZG93bi5pc09wZW5cIlxuICAgICAgICAgICAgICBbaW5zaWRlQ2xpY2tdPVwidHJ1ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1oZWFkZXJcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCIoY29sdW1uLmhlYWRlciB8IHRyYW5zbGF0ZSkgfHwgY29sdW1uLm5hbWVcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtY3ldPVwiJ2RhdGEtZ3JpZC0taGVhZGVyLWJ0bi0tJyArIGNvbHVtbi5oZWFkZXJcIlxuICAgICAgICAgICAgICAgIGRyb3Bkb3duVG9nZ2xlXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uTmFtZTogY29sdW1uLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogKGNvbHVtbi5oZWFkZXIgfCB0cmFuc2xhdGUpIHx8IGNvbHVtbi5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdIHwgbWFwOiBnZXRIZWFkZXJDZWxsUmVuZGVyZXJTcGVjIDogdGhpcyBhcyBjZWxsUmVuZGVyZXJTcGVjXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxjOHktY2VsbC1yZW5kZXJlclxuICAgICAgICAgICAgICAgICAgICBkYXRhLWN5PVwiYzh5LWRhdGEtZ3JpZC0tYzh5LWNlbGwtcmVuZGVyZXJcIlxuICAgICAgICAgICAgICAgICAgICBbc3BlY109XCJjZWxsUmVuZGVyZXJTcGVjXCJcbiAgICAgICAgICAgICAgICAgID48L2M4eS1jZWxsLXJlbmRlcmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICBjOHlJY29uPVwiZmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0ZpbHRlcicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgIDwhLS0gaXNEcm9wRG93blBsYWNlZFJpZ2h0IHRvIGJlIHJlbW92ZWQgd2hlbiBjb2x1bW5zIGFyZSB0cmFuc2Zvcm1lZCB0byBvYnNlcnZhYmxlcy4gLS0+XG4gICAgICAgICAgICAgIDx1bFxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24tbWVudVwiXG4gICAgICAgICAgICAgICAgKmRyb3Bkb3duTWVudVxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2Ryb3Bkb3duLW1lbnUtcmlnaHQtZ3JpZCc6IGlzRHJvcERvd25QbGFjZWRSaWdodChjb2x1bW4pIH1cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiZGF0YS1ncmlkX19kcm9wZG93blwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3Bkb3duOiBncmlkSGVhZGVyRHJvcGRvd25cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBdIHwgbWFwOiBnZXRGaWx0ZXJpbmdGb3JtUmVuZGVyZXJTcGVjIDogdGhpcyBhcyBmaWx0ZXJpbmdGb3JtUmVuZGVyZXJTcGVjXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxjOHktZmlsdGVyaW5nLWZvcm0tcmVuZGVyZXJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJnLWNvbXBvbmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgW3NwZWNdPVwiZmlsdGVyaW5nRm9ybVJlbmRlcmVyU3BlY1wiXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLWM4eS1maWx0ZXJpbmctZm9ybS1yZW5kZXJlclwiXG4gICAgICAgICAgICAgICAgICAgID48L2M4eS1maWx0ZXJpbmctZm9ybS1yZW5kZXJlcj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1zb3J0XCJcbiAgICAgICAgICAgICAgW3N0eWxlXT1cInsgJ21hcmdpbi1sZWZ0JzogIWNvbHVtbi5maWx0ZXJhYmxlICYmIGNvbHVtbi5zb3J0YWJsZSA/ICctMjBweCcgOiBudWxsIH1cIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwic29ydENvbHVtblRpdGxlIHwgdHJhbnNsYXRlOiB7IG5hbWU6IGNvbHVtbi5oZWFkZXIgfCB0cmFuc2xhdGUgfVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi5zb3J0YWJsZVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VTb3J0T3JkZXIoY29sdW1uLm5hbWUpXCJcbiAgICAgICAgICAgICAgZGF0YS1jeT1cImNoYW5nZS1zb3J0LW9yZGVyXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29sdW1uLnNvcnRPcmRlclwiPlxuICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICBjOHlJY29uPVwibG9uZy1hcnJvdy11cFwiXG4gICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ2FzYydcIlxuICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgIGM4eUljb249XCJsb25nLWFycm93LWRvd25cIlxuICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cIidkZXNjJ1wiXG4gICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgYzh5SWNvbj1cImV4Y2hhbmdlXCJcbiAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaERlZmF1bHRcbiAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBjbGFzcz1cInJlc2l6ZS1oYW5kbGVcIlxuICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi5yZXNpemFibGVcIlxuICAgICAgICAgICAgICAobW91c2Vkb3duKT1cIlxuICAgICAgICAgICAgICAgIHJlc2l6ZUhhbmRsZU1vdXNlRG93biQuZW1pdCh7IGV2ZW50OiAkZXZlbnQsIHRhcmdldENvbHVtbk5hbWU6IGNvbHVtbi5uYW1lIH0pXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+PC9zcGFuPlxuICAgICAgICAgIDwvdGg+XG5cbiAgICAgICAgICA8dGRcbiAgICAgICAgICAgIFtjbGFzcy5oaWRkZW5dPVwiIWNvbHVtbi52aXNpYmxlXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtY2VsbC10aXRsZV09XCJjb2x1bW4uaGVhZGVyIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIGNkay1jZWxsXG4gICAgICAgICAgICAqY2RrQ2VsbERlZj1cImxldCByb3dcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29sdW1uLmNlbGxDU1NDbGFzc05hbWVcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1jeV09XCInZGF0YS1ncmlkLS0nICsgY29sdW1uLmhlYWRlclwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXR5cGVdPVwiY29sdW1uLmRhdGFUeXBlXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcmVzb2x2ZUNlbGxWYWx1ZShyb3csIGNvbHVtbi5wYXRoKSxcbiAgICAgICAgICAgICAgICAgICAgcm93OiByb3csXG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbk5hbWU6IGNvbHVtbi5uYW1lXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXSB8IG1hcDogZ2V0Q2VsbFJlbmRlcmVyU3BlYyA6IHRoaXMgYXMgY2VsbFJlbmRlcmVyU3BlY1xuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8Yzh5LWNlbGwtcmVuZGVyZXIgW3NwZWNdPVwiY2VsbFJlbmRlcmVyU3BlY1wiPjwvYzh5LWNlbGwtcmVuZGVyZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciBjZGtDb2x1bW5EZWY9XCJpbmZpbml0ZVNjcm9sbEZvb3RlclwiPlxuICAgICAgPHRkXG4gICAgICAgIFtzdHlsZS5ncmlkLWNvbHVtbl09XCJzdHlsZXMuZ3JpZEluZmluaXRlU2Nyb2xsQ29sdW1uXCJcbiAgICAgICAgY2RrLWZvb3Rlci1jZWxsXG4gICAgICAgICpjZGtGb290ZXJDZWxsRGVmXG4gICAgICA+XG4gICAgICAgIDx0ZW1wbGF0ZSAjaW5maW5pdGVTY3JvbGxDb250YWluZXI+PC90ZW1wbGF0ZT5cbiAgICAgIDwvdGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8dHJcbiAgICAgIGNkay1oZWFkZXItcm93XG4gICAgICAqY2RrSGVhZGVyUm93RGVmPVwiY29sdW1uTmFtZXNcIlxuICAgID48L3RyPlxuXG4gICAgPHRyXG4gICAgICBkYXRhLWN5PVwiYzh5LWRhdGEtZ3JpZC0tcm93LWluLWRhdGEtZ3JpZFwiXG4gICAgICBjZGstcm93XG4gICAgICAqY2RrUm93RGVmPVwibGV0IHJvdzsgY29sdW1uczogY29sdW1uTmFtZXM7IGxldCBpZHggPSBkYXRhSW5kZXhcIlxuICAgICAgW25nQ2xhc3NdPVwiW1xuICAgICAgICBhY3RpdmVDbGFzc05hbWUgJiYgcm93ID09PSBsYXN0Q2xpY2tlZFJvdyA/IGFjdGl2ZUNsYXNzTmFtZSA6ICcnLFxuICAgICAgICBpZHggJSAyID09PSAwID8gJ2V2ZW4nIDogJ29kZCdcbiAgICAgIF1cIlxuICAgICAgKG1vdXNlb3Zlcik9XCJyb3dNb3VzZU92ZXIuZW1pdChyb3cpXCJcbiAgICAgIChtb3VzZWxlYXZlKT1cInJvd01vdXNlTGVhdmUuZW1pdChyb3cpXCJcbiAgICAgIChjbGljayk9XCJoYW5kbGVDbGljayhyb3cpXCJcbiAgICA+PC90cj5cblxuICAgIDx0clxuICAgICAgY2xhc3M9XCJleHBhbmRlZC1yb3dcIlxuICAgICAgW25nQ2xhc3NdPVwieyBoaWRkZW46ICEoZXhwYW5kZWRSb3dzLmdldChyb3cpLnZpc2libGUkIHwgYXN5bmMpIH1cIlxuICAgICAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLWV4cGFuZGVkLXJvdy1pbi1kYXRhLWdyaWRcIlxuICAgICAgY2RrLXJvd1xuICAgICAgKmNka1Jvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IFsnZXhwYW5kZWQtcm93J107IHdoZW46IGlzUm93RXhwYW5kZWRcIlxuICAgID48L3RyPlxuXG4gICAgPG5nLWNvbnRhaW5lciBjZGtDb2x1bW5EZWY9XCJleHBhbmRlZC1yb3dcIj5cbiAgICAgIDx0ZFxuICAgICAgICBbc3R5bGUuZ3JpZC1jb2x1bW5dPVwic3R5bGVzLmdyaWRJbmZpbml0ZVNjcm9sbENvbHVtblwiXG4gICAgICAgIGNkay1jZWxsXG4gICAgICAgICpjZGtDZWxsRGVmPVwibGV0IHJvd1wiXG4gICAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgZXhwYW5kYWJsZVJvdz8udGVtcGxhdGU7XG4gICAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAgICRpbXBsaWNpdDogcm93LFxuICAgICAgICAgICAgICBhc3luY1JlbmRlclN1Y2Nlc3M6IHNldEV4cGFuZGFibGVSb3dWaXNpYmxlLmJpbmQodGhpcywgcm93LCB0cnVlKSxcbiAgICAgICAgICAgICAgYXN5bmNSZW5kZXJGYWlsOiBzZXRFeHBhbmRhYmxlUm93VmlzaWJsZS5iaW5kKHRoaXMsIHJvdywgZmFsc2UpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXI+XG4gICAgICA8dHJcbiAgICAgICAgW25nQ2xhc3NdPVwieyBoaWRkZW46ICFpbmZpbml0ZVNjcm9sbCB9XCJcbiAgICAgICAgY2RrLWZvb3Rlci1yb3dcbiAgICAgICAgKmNka0Zvb3RlclJvd0RlZj1cIlsnaW5maW5pdGVTY3JvbGxGb290ZXInXVwiXG4gICAgICA+PC90cj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC90YWJsZT5cblxuICA8ZGl2XG4gICAgY2xhc3M9XCJkLWZsZXggbS0wIHAtdC00MCBwLWItNDBcIlxuICAgICpuZ0lmPVwiXG4gICAgICAhKGRhdGFTb3VyY2UubG9hZGluZyQgfCBhc3luYykgJiZcbiAgICAgICgoZGF0YVNvdXJjZS5zdGF0cyQgfCBhc3luYykuZmlsdGVyZWRTaXplID09PSAwIHx8IChkYXRhU291cmNlLmRhdGEkIHwgYXN5bmMpLmxlbmd0aCA9PT0gMClcbiAgICBcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cImNvbC1sZy0zIGNvbC1zbS00IG0tbC1hdXRvIG0tci1hdXRvXCI+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJjOHktdWktZW1wdHktc3RhdGUsIC5jOHktZW1wdHktc3RhdGVcIj48L25nLWNvbnRlbnQ+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgZW1wdHlTdGF0ZT8udGVtcGxhdGVSZWY7XG4gICAgICAgICAgY29udGV4dDogeyAkaW1wbGljaXQ6IGVtcHR5U3RhdGVDb250ZXh0JCB8IGFzeW5jIH1cbiAgICAgICAgXCJcbiAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdlxuICAgIGNsYXNzPVwidGFibGUtZGF0YS1ncmlkLWZvb3RlciBzZXBhcmF0b3IgbGFyZ2UtcGFkZGluZ1wiXG4gICAgKm5nSWY9XCJwYWdpbmF0aW9uICYmICFpbmZpbml0ZVNjcm9sbFwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTQgbm8tZ3V0dGVyXCI+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiY291bnRlciBwLXQtOCBwLWItOFwiXG4gICAgICAgICpuZ0lmPVwiKGRhdGFTb3VyY2Uuc3RhdHMkIHwgYXN5bmMpLmN1cnJlbnRQYWdlU2l6ZSA+IDBcIlxuICAgICAgICBkYXRhLWN5PVwiZGF0YS1ncmlkLS1jb3VudGVyXCJcbiAgICAgID5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBjbGFzcz1cInRleHQtbXV0ZWRcIlxuICAgICAgICAgIG5nTm9uQmluZGFibGVcbiAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICBbdHJhbnNsYXRlUGFyYW1zXT1cInBhZ2luYXRpb25MYWJlbFBhcmFtc1wiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBwYWdlRmlyc3RJdGVtSWR4IH19IC0ge3sgcGFnZUxhc3RJdGVtSWR4IH19IG9mIHt7IGl0ZW1zVG90YWwgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTQgbm8tZ3V0dGVyIHRleHQtY2VudGVyXCI+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZm9ybS1ncm91cCBmb3JtLWlubGluZSBwLXQtOCBwLWItOFwiXG4gICAgICAgICpuZ0lmPVwiKGRhdGFTb3VyY2Uuc3RhdHMkIHwgYXN5bmMpLmZpbHRlcmVkU2l6ZSA+IG1pblBvc3NpYmxlUGFnZVNpemVcIlxuICAgICAgPlxuICAgICAgICA8bGFiZWxcbiAgICAgICAgICBjbGFzcz1cIm0tci00XCJcbiAgICAgICAgICBmb3I9XCJmaWx0ZXJlZFNpemVcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgJ0l0ZW1zIHBlciBwYWdlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYzh5LXNlbGVjdC13cmFwcGVyXCI+XG4gICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgaWQ9XCJmaWx0ZXJlZFNpemVcIlxuICAgICAgICAgICAgZGF0YS1jeT1cImRhdGEtZ3JpZC0tcGFnZXNpemUtb3B0aW9uc1wiXG4gICAgICAgICAgICBbbmdNb2RlbF09XCJwYWdpbmF0aW9uLnBhZ2VTaXplXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIlxuICAgICAgICAgICAgICB1cGRhdGVQYWdpbmF0aW9uKHsgaXRlbXNQZXJQYWdlOiAkZXZlbnQsIHBhZ2U6IHBhZ2luYXRpb24uY3VycmVudFBhZ2UgfSlcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgcGFnZVNpemUgb2YgcG9zc2libGVQYWdlU2l6ZXNcIlxuICAgICAgICAgICAgICBbbmdWYWx1ZV09XCJwYWdlU2l6ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IHBhZ2VTaXplIH19XG4gICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNCBuby1ndXR0ZXIgdGV4dC1yaWdodFwiPlxuICAgICAgPHBhZ2luYXRpb25cbiAgICAgICAgW2NsYXNzLmhpZGRlbl09XCJoaWRlUGFnaW5hdGlvbiQgfCBhc3luY1wiXG4gICAgICAgIGNsYXNzPVwicC10LTggcC1iLThcIlxuICAgICAgICAqbmdJZj1cIihkYXRhU291cmNlLnN0YXRzJCB8IGFzeW5jKS5maWx0ZXJlZFNpemUgPiAwXCJcbiAgICAgICAgW25nTW9kZWxdPVwicGFnaW5hdGlvbi5jdXJyZW50UGFnZVwiXG4gICAgICAgIChwYWdlQ2hhbmdlZCk9XCJ1cGRhdGVQYWdpbmF0aW9uKCRldmVudClcIlxuICAgICAgICBbdG90YWxJdGVtc109XCIoZGF0YVNvdXJjZS5zdGF0cyQgfCBhc3luYykuZmlsdGVyZWRTaXplXCJcbiAgICAgICAgW2l0ZW1zUGVyUGFnZV09XCJwYWdpbmF0aW9uLnBhZ2VTaXplXCJcbiAgICAgICAgKG51bVBhZ2VzKT1cInRvdGFsUGFnZXNDb3VudCQubmV4dCgkZXZlbnQpXCJcbiAgICAgICAgW21heFNpemVdPVwiNVwiXG4gICAgICAgIFtib3VuZGFyeUxpbmtzXT1cImZhbHNlXCJcbiAgICAgICAgcHJldmlvdXNUZXh0PVwiUHJldmlvdXNcIlxuICAgICAgICBuZXh0VGV4dD1cIk5leHRcIlxuICAgICAgPjwvcGFnaW5hdGlvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
1222
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1ncmlkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvZGF0YS1ncmlkL2RhdGEtZ3JpZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9jb3JlL2RhdGEtZ3JpZC9kYXRhLWdyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM3RCxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBQ2YsVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsRUFDVCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVixNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVqRCxPQUFPLEVBQ0wsUUFBUSxJQUFJLFNBQVMsRUFDckIsU0FBUyxFQUNULElBQUksRUFDSixHQUFHLEVBQ0gsT0FBTyxFQUNQLE9BQU8sRUFDUCxLQUFLLEVBQ0wsS0FBSyxFQUNMLE1BQU0sRUFDTixPQUFPLEVBQ1IsTUFBTSxXQUFXLENBQUM7QUFFbkIsT0FBTyxFQUNMLGVBQWUsRUFFZixPQUFPLEVBRVAsYUFBYSxFQUNiLFFBQVEsRUFDUixZQUFZLEVBQ1osS0FBSyxFQUNMLEVBQUUsRUFDRixJQUFJLEVBQ0wsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLG9CQUFvQixFQUNwQixNQUFNLEVBQ04sS0FBSyxFQUNMLEdBQUcsRUFDSCxRQUFRLEVBQ1IsU0FBUyxFQUNULFNB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USxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFHckMsdUJBQXVCO3NCQUR0QixTQUFTO3VCQUFDLHlCQUF5QixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBR3JDLFVBQVU7c0JBQW5ELFlBQVk7dUJBQUMsMEJBQTBCO2dCQXNFbUIsTUFBTTtzQkFBaEUsWUFBWTt1QkFBQyxhQUFhLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUlqRCxRQUFRO3NCQURQLFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENka0hlYWRlckNlbGwsIENka1RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3RhYmxlJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NoaWxkcmVuLFxuICBWaWV3Q29udGFpbmVyUmVmLFxuICBmb3J3YXJkUmVmLFxuICBpbmplY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IElJZGVudGlmaWVkLCBJUmVzdWx0TGlzdCwgUGFnaW5nIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHtcbiAgcGFyc2VJbnQgYXMgX3BhcnNlSW50LFxuICBjYXN0QXJyYXksXG4gIGZsb3csXG4gIGdldCxcbiAgaW5kZXhPZixcbiAgaXNFbXB0eSxcbiAgaXNOaWwsXG4gIHVuaW9uLFxuICB1bmlxQnksXG4gIHdpdGhvdXRcbn0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEJzRHJvcGRvd25EaXJlY3RpdmUgfSBmcm9tICduZ3gtYm9vdHN0cmFwL2Ryb3Bkb3duJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgT2JzZXJ2YWJsZSxcbiAgU3ViamVjdCxcbiAgVW5hcnlGdW5jdGlvbixcbiAgY29tYmluZUxhdGVzdCxcbiAgZm9ya0pvaW4sXG4gIGlzT2JzZXJ2YWJsZSxcbiAgbWVyZ2UsXG4gIG9mLFxuICBwaXBlXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgY29tYmluZUxhdGVzdFdpdGgsXG4gIGNvbmNhdE1hcCxcbiAgZGVib3VuY2VUaW1lLFxuICBkZWxheSxcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gIGZpbHRlcixcbiAgZmlyc3QsXG4gIG1hcCxcbiAgbWVyZ2VNYXAsXG4gIHN0YXJ0V2l0aCxcbiAgc3dpdGNoTWFwLFxuICB0YWtlLFxuICB0YWtlVW50aWwsXG4gIHRhcFxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBBbGVydFNlcnZpY2UgfSBmcm9tICcuLi9hbGVydC9hbGVydC5zZXJ2aWNlJztcbmltcG9ydCB7IEVtcHR5U3RhdGVDb250ZXh0RGlyZWN0aXZlIH0gZnJvbSAnLi4vY29tbW9uL2VtcHR5LXN0YXRlL2VtcHR5LXN0YXRlLWNvbnRleHQuZGlyZWN0aXZlJztcbmltcG9ydCB7IHRvT2JzZXJ2YWJsZSB9IGZyb20gJy4uL2NvbW1vbi9leHRlbnNpb24taG9va3MnO1xuaW1wb3J0IHsgTG9hZE1vcmVDb21wb25lbnQgfSBmcm9tICcuLi9jb21tb24vbG9hZC1tb3JlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMb2FkTW9yZU1vZGUgfSBmcm9tICcuLi9jb21tb24vbG9hZC1tb3JlLm1vZGVsJztcbmltcG9ydCB7IGdldHRleHQgfSBmcm9tICcuLi9pMThuL2dldHRleHQnO1xuaW1wb3J0IHsgUG9wb3ZlckNvbmZpcm1CdXR0b25zLCBQb3BvdmVyQ29uZmlybUNvbXBvbmVudCB9IGZyb20gJy4uL21vZGFsL3BvcG92ZXItY29uZmlybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2FpbnNpZ2h0U2VydmljZSB9IGZyb20gJy4uL3Byb2R1Y3QtZXhwZXJpZW5jZS9nYWluc2lnaHQuc2VydmljZSc7XG5pbXBvcnQge1xuICBQUk9EVUNUX0VYUEVSSUVOQ0VfRVZFTlRfU09VUkNFLFxuICBQcm9kdWN0RXhwZXJpZW5jZUV2ZW50LFxuICBQcm9kdWN0RXhwZXJpZW5jZUV2ZW50U291cmNlXG59IGZyb20gJy4uL3Byb2R1Y3QtZXhwZXJpZW5jZS9wcm9kdWN0LWV4cGVyaWVuY2UubW9kZWwnO1xuaW1wb3J0IHsgQWN0aW9uQ29udHJvbHNFeHRlbnNpb25TZXJ2aWNlIH0gZnJvbSAnLi9hY3Rpb24tY29udHJvbHMtZXh0ZW5zaW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2VsbFJlbmRlcmVyU3BlYyB9IGZyb20gJy4vY29sdW1uL2NlbGwtcmVuZGVyZXInO1xuaW1wb3J0IHsgQ29sdW1uRGlyZWN0aXZlIH0gZnJvbSAnLi9jb2x1bW4vY29sdW1uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBFeHBhbmRhYmxlUm93Q29sdW1uIH0gZnJvbSAnLi9jb2x1bW4vZXhwYW5kYWJsZS1yb3ctY29sdW1uL2V4cGFuZGFibGUuZGF0YS1ncmlkLWNvbHVtbic7XG5pbXBvcnQgeyBGaWx0ZXJpbmdGb3JtUmVuZGVyZXJTcGVjLCBGaWx0ZXJpbmdNb2RpZmllciB9IGZyb20gJy4vY29sdW1uL2ZpbHRlcmluZy1mb3JtLXJlbmRlcmVyJztcbmltcG9ydCB7XG4gIERBVEFfR1JJRF9DT05GSUdVUkFUSU9OX1NUUkFURUdZLFxuICBEYXRhR3JpZENvbmZpZ3VyYXRpb25TdHJhdGVneSxcbiAgR3JpZENvbmZpZ0NvbnRleHQsXG4gIEdyaWRDb25maWdQYXJ0LFxuICBHcmlkRXZlbnRUeXBlXG59IGZyb20gJy4vZGF0YS1ncmlkLWNvbmZpZ3VyYXRpb24ubW9kZWwnO1xuaW1wb3J0IHtcbiAgQWN0aW9uQ29udHJvbCxcbiAgQWN0aW9uQ29udHJvbEhvb2ssXG4gIEJ1aWx0SW5BY3Rpb25UeXBlLFxuICBCdWxrQWN0aW9uQ29udHJvbCxcbiAgQ29sdW1uLFxuICBDb2x1bW5Db25maWcsXG4gIENvbHVtbkRhdGFUeXBlLFxuICBDdXN0b21Db2x1bW5Db25maWcsXG4gIERhdGFHcmlkLFxuICBEYXRhU291cmNlU3RhdHMsXG4gIERpc3BsYXlPcHRpb25zLFxuICBGaWx0ZXIsXG4gIEZpbHRlckNoaXAsXG4gIEZpbHRlcmluZ0FjdGlvblR5cGUsXG4gIEdyaWRDb25maWcsXG4gIEhlYWRlckFjdGlvbkNvbnRyb2wsXG4gIFBhZ2luYXRpb24sXG4gIFJvdyxcbiAgU2VydmVyU2lkZURhdGFDYWxsYmFjayxcbiAgU29ydE9yZGVyLFxuICBTcGVjaWFsQ29sdW1uTmFtZSxcbiAgbWluQ29sdW1uR3JpZFRyYWNrU2l6ZSxcbiAgcmF0aW9zQnlDb2x1bW5UeXBlc1xufSBmcm9tICcuL2RhdGEtZ3JpZC5tb2RlbCc7XG5pbXBvcnQgeyBEYXRhR3JpZFNlcnZpY2UgfSBmcm9tICcuL2RhdGEtZ3JpZC5zZXJ2aWNlJztcbmltcG9ydCB7IEV4cGFuZGFibGVSb3dEaXJlY3RpdmUgfSBmcm9tICcuL2V4cGFuZGFibGUtcm93LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBHcmlkRGF0YVNvdXJjZSB9IGZyb20gJy4vZ3JpZC1kYXRhLXNvdXJjZSc7XG5pbXBvcnQgeyBQWF9BQ1RJT05TLCBQWF9FVkVOVF9OQU1FIH0gZnJvbSAnLi9wcm9kdWN0LWV4cGVyaWVuY2UuY29uc3RhbnRzJztcbmltcG9ydCB7IEN1c3RvbUNvbHVtbiB9IGZyb20gJy4vY29sdW1uL2N1c3RvbS5jb2x1bW4nO1xuaW1wb3J0IHsgQ3VzdG9tQ29sdW1uU2VydmljZSB9IGZyb20gJy4vY29uZmlndXJlLWN1c3RvbS1jb2x1bW4vY29uZmlndXJlLWN1c3RvbS1jb2x1bW4uc2VydmljZSc7XG5cbmVudW0gU29ydGluZ09yZGVyIHtcbiAgQVNDID0gJ2FzYycsXG4gIERFU0MgPSAnZGVzYydcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LWRhdGEtZ3JpZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRhLWdyaWQuY29tcG9uZW50Lmh0bWwnLFxuICBob3N0OiB7IGNsYXNzOiAnZC1jb250ZW50cycgfSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogUFJPRFVDVF9FWFBFUklFTkNFX0VWRU5UX1NPVVJDRSxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERhdGFHcmlkQ29tcG9uZW50KVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBEYXRhR3JpZENvbXBvbmVudFxuICBpbXBsZW1lbnRzIERhdGFHcmlkLCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIFByb2R1Y3RFeHBlcmllbmNlRXZlbnRTb3VyY2VcbntcbiAgLyoqIFRoZSB0aXRsZSBmb3IgdGhlIGRhdGEgZ3JpZCwgaXQncyBkaXNwbGF5ZWQgaW4gdGhlIGdyaWQncyBoZWFkZXIuICovXG4gIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmcgPSBnZXR0ZXh0KCdJdGVtcycpO1xuICAvKiogVGhlIGxhYmVsIGZvciBsb2FkIG1vcmUgYnV0dG9uLiAqL1xuICBASW5wdXQoKSBsb2FkTW9yZUl0ZW1zTGFiZWw6IHN0cmluZyA9IGdldHRleHQoJ0xvYWQgbW9yZSBpdGVtcycpO1xuICAvKiogVGhlIGxhYmVsIGZvciBsb2FkaW5nIGluZGljYXRvci4gKi9cbiAgQElucHV0KCkgbG9hZGluZ0l0ZW1zTGFiZWw6IHN0cmluZyA9IGdldHRleHQoJ0xvYWRpbmcgaXRlbXPigKYnKTtcbiAgLyoqIERldGVybWluZXMgd2hldGhlciB0ZXh0IHNlYXJjaCBpbnB1dCBpcyBzaG93biBpbiB0aGUgZ3JpZCdzIGhlYWRlci4gKi9cbiAgQElucHV0KCkgc2hvd1NlYXJjaCA9IGZhbHNlO1xuICAvKiogVGFrZXMgYW4gZXZlbnQgZW1pdHRlci4gV2hlbiBhbiBldmVudCBpcyBlbWl0dGVkLCB0aGUgZ3JpZCB3aWxsIGJlIHJlbG9hZGVkLiAqL1xuICBASW5wdXQoKSByZWZyZXNoOiBFdmVudEVtaXR0ZXI8dm9pZD47XG5cbiAgY29sdW1uczogQ29sdW1uW10gPSBbXTtcbiAgLyoqIFRoZSBsaXN0IG9mIGNvbHVtbnMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBncmlkLiAqL1xuICBASW5wdXQoJ2NvbHVtbnMnKVxuICBfY29sdW1uczogQ29sdW1uW107XG5cbiAgZGF0YVNvdXJjZSA9IG5ldyBHcmlkRGF0YVNvdXJjZSgpO1xuICByb3dzOiBSb3dbXTtcbiAgLyoqIFRoZSBsaXN0IG9mIHJvd3MgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBncmlkICh1c2VkIGZvciBjbGllbnQgc2lkZSBkYXRhKS4gKi9cbiAgQElucHV0KCdyb3dzJylcbiAgc2V0IF9yb3dzKHJvd3M6IFJvd1tdKSB7XG4gICAgdGhpcy5yb3dzID0gcm93cyB8fCBbXTtcbiAgfVxuXG4gIGZpbHRlcmluZ0xhYmVsc1BhcmFtcyA9IHtcbiAgICBmaWx0ZXJlZEl0ZW1zQ291bnQ6IDAsXG4gICAgYWxsSXRlbXNDb3VudDogMFxuICB9O1xuXG4gIHBhZ2luYXRpb246IFBhZ2luYXRpb247XG4gIHBhZ2luYXRpb25MYWJlbFBhcmFtcyA9IHtcbiAgICBwYWdlRmlyc3RJdGVtSWR4OiAwLFxuICAgIHBhZ2VMYXN0SXRlbUlkeDogMCxcbiAgICBpdGVtc1RvdGFsOiAwXG4gIH07XG4gIGxhc3RDbGlja2VkUm93OiBSb3c7XG4gIHJlYWRvbmx5IHBvc3NpYmxlUGFnZVNpemVzOiBudW1iZXJbXSA9IFsyNSwgNTAsIDEwMF07XG4gIHJlYWRvbmx5IG1pblBvc3NpYmxlUGFnZVNpemUgPSBNYXRoLm1pbiguLi50aGlzLnBvc3NpYmxlUGFnZVNpemVzKTtcbiAgLyoqIFBhZ2luYXRpb24gc2V0dGluZ3MsIGUuZy4gYWxsb3dzIGZvciBzZXR0aW5nIGN1cnJlbnQgcGFnZSBvciBwYWdlIHNpemUuICovXG4gIEBJbnB1dCgncGFnaW5hdGlvbicpXG4gIHNldCBfcGFnaW5hdGlvbihwYWdpbmF0aW9uOiBQYWdpbmF0aW9uKSB7XG4gICAgdGhpcy5wYWdpbmF0aW9uID0gcGFnaW5hdGlvbjtcbiAgfVxuXG4gIGluZmluaXRlU2Nyb2xsOiBMb2FkTW9yZU1vZGU7XG4gIC8qKiBTZXRzIGxvYWQgbW9yZSBtb2RlLiAqL1xuICBASW5wdXQoJ2luZmluaXRlU2Nyb2xsJylcbiAgc2V0IF9pbmZpbml0ZVNjcm9sbChpbmZpbml0ZVNjcm9sbDogTG9hZE1vcmVNb2RlKSB7XG4gICAgdGhpcy5pbmZpbml0ZVNjcm9sbCA9IGluZmluaXRlU2Nyb2xsO1xuICB9XG5cbiAgc2VydmVyU2lkZURhdGFDYWxsYmFjazogU2VydmVyU2lkZURhdGFDYWxsYmFjaztcbiAgLyoqXG4gICAqIFNldHMgYSBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIGludm9rZWQgd2hlbmV2ZXIgZGF0YSBuZWVkcyB0byBiZSBsb2FkZWQgZnJvbSBzZXJ2ZXIuXG4gICAqIFRoZSBmdW5jdGlvbiBzaG91bGQgdGFrZSBbW0RhdGFTb3VyY2VNb2RpZmllcl1dIGFuZCByZXR1cm4gW1tTZXJ2ZXJTaWRlRGF0YVJlc3VsdF1dLlxuICAgKi9cbiAgQElucHV0KCdzZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrJylcbiAgc2V0IF9zZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrKHNlcnZlclNpZGVEYXRhQ2FsbGJhY2s6IFNlcnZlclNpZGVEYXRhQ2FsbGJhY2spIHtcbiAgICB0aGlzLnNlcnZlclNpZGVEYXRhQ2FsbGJhY2sgPSBzZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrO1xuICB9XG5cbiAgc2VsZWN0YWJsZSA9IGZhbHNlO1xuICAvKiogRGV0ZXJtaW5lcyB3aGV0aGVyIGl0ZW1zIGNhbiBiZSBzZWxlY3RlZCBieSBjbGlja2luZyBhIGNoZWNrYm94IGluIHRoZSBmaXJzdCBjb2x1bW4uICovXG4gIEBJbnB1dCgnc2VsZWN0YWJsZScpXG4gIHNldCBfc2VsZWN0YWJsZShzZWxlY3RhYmxlOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZWxlY3RhYmxlID0gc2VsZWN0YWJsZTtcbiAgfVxuXG4gIHNpbmdsZVNlbGVjdGlvbiA9IGZhbHNlO1xuICAvKiogUmVzdHJpY3RzIHNlbGVjdGlvbiB0byBhIHNpbmdsZSByb3cgb25seS4gU2VsZWN0aW9uIGNvbHVtbiBkaXNwbGF5cyByYWRpbyBidXR0b24gaW5zdGVhZCBvZiBjaGVja2JveGVzICovXG4gIEBJbnB1dCgnc2luZ2xlU2VsZWN0aW9uJylcbiAgc2V0IF9zaW5nbGVTZWxlY3Rpb24oc2luZ2xlU2VsZWN0aW9uOiBib29sZWFuKSB7XG4gICAgdGhpcy5zaW5nbGVTZWxlY3Rpb24gPSBzaW5nbGVTZWxlY3Rpb247XG4gIH1cblxuICBzZWxlY3Rpb25QcmltYXJ5S2V5ID0gJ2lkJztcbiAgLyoqIERldGVybWluZXMgd2hpY2ggaXRlbSdzIHByb3BlcnR5IHdpbGwgYmUgdXNlZCB0byBkaXN0aW5ndWlzaCBzZWxlY3Rpb24gc3RhdHVzLiAqL1xuICBASW5wdXQoJ3NlbGVjdGlvblByaW1hcnlLZXknKVxuICBzZXQgX3NlbGVjdGlvblByaW1hcnlLZXkoc2VsZWN0aW9uUHJpbWFyeUtleTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZWxlY3Rpb25QcmltYXJ5S2V5ID0gc2VsZWN0aW9uUHJpbWFyeUtleTtcbiAgfVxuXG4gIGRpc3BsYXlPcHRpb25zOiBEaXNwbGF5T3B0aW9ucyA9IHtcbiAgICBzdHJpcGVkOiB0cnVlLFxuICAgIGJvcmRlcmVkOiBmYWxzZSxcbiAgICBncmlkSGVhZGVyOiB0cnVlLFxuICAgIGZpbHRlcjogdHJ1ZSxcbiAgICBob3ZlcjogdHJ1ZVxuICB9O1xuICAvKiogU2V0cyBkaXNwbGF5IG9wdGlvbnMuICovXG4gIEBJbnB1dCgnZGlzcGxheU9wdGlvbnMnKVxuICBzZXQgX2Rpc3BsYXlPcHRpb25zKGRpc3BsYXlPcHRpb25zOiBEaXNwbGF5T3B0aW9ucykge1xuICAgIHRoaXMuZGlzcGxheU9wdGlvbnMgPSB7IC4uLnRoaXMuZGlzcGxheU9wdGlvbnMsIC4uLmRpc3BsYXlPcHRpb25zIH07XG4gIH1cblxuICBhY3Rpb25Db250cm9sczogQWN0aW9uQ29udHJvbFtdID0gW107XG4gIC8qKiBTZXRzIGFjdGlvbiBjb250cm9scyAoYWN0aW9ucyBhdmFpbGFibGUgZm9yIGluZGl2aWR1YWwgaXRlbXMpLiAqL1xuICBASW5wdXQoJ2FjdGlvbkNvbnRyb2xzJylcbiAgc2V0IF9hY3Rpb25Db250cm9scyhhY3Rpb25Db250cm9sczogQWN0aW9uQ29udHJvbFtdKSB7XG4gICAgdGhpcy5hY3Rpb25Db250cm9sc0lucHV0JC5uZXh0KGFjdGlvbkNvbnRyb2xzKTtcbiAgfVxuXG4gIGJ1bGtBY3Rpb25Db250cm9sczogQnVsa0FjdGlvbkNvbnRyb2xbXTtcbiAgLyoqIFNldHMgYnVsayBhY3Rpb24gY29udHJvbHMgKGFjdGlvbnMgYXZhaWxhYmxlIGZvciBpdGVtcyBzZWxlY3RlZCBieSB1c2VyKS4gKi9cbiAgQElucHV0KCdidWxrQWN0aW9uQ29udHJvbHMnKVxuICBzZXQgX2J1bGtBY3Rpb25Db250cm9scyhidWxrQWN0aW9uQ29udHJvbHM6IEJ1bGtBY3Rpb25Db250cm9sW10pIHtcbiAgICB0aGlzLmJ1bGtBY3Rpb25Db250cm9scyA9IGJ1bGtBY3Rpb25Db250cm9scyB8fCBbXTtcbiAgfVxuXG4gIGhlYWRlckFjdGlvbkNvbnRyb2xzOiBIZWFkZXJBY3Rpb25Db250cm9sW107XG4gIC8qKiBTZXRzIGhlYWRlciBhY3Rpb24gY29udHJvbHMgKGFjdGlvbnMgYXZhaWxhYmxlIGZyb20gZGF0YSBncmlkIGhlYWRlcikuICovXG4gIEBJbnB1dCgnaGVhZGVyQWN0aW9uQ29udHJvbHMnKVxuICBzZXQgX2hlYWRlckFjdGlvbkNvbnRyb2xzKGhlYWRlckFjdGlvbkNvbnRyb2xzOiBIZWFkZXJBY3Rpb25Db250cm9sW10pIHtcbiAgICB0aGlzLmhlYWRlckFjdGlvbkNvbnRyb2xzID0gaGVhZGVyQWN0aW9uQ29udHJvbHMgfHwgW107XG4gIH1cblxuICAvKiogU2V0cyBpbml0aWFsIHNlYXJjaCB0ZXh0LiAqL1xuICBASW5wdXQoKVxuICBzZWFyY2hUZXh0ID0gJyc7XG5cbiAgLyoqIERldGVybWluZXMgaWYgY3VzdG9tIGNvbHVtbnMgYnV0dG9uIHdpbGwgYmUgZW5hYmxlZC4gKi9cbiAgQElucHV0KClcbiAgY29uZmlndXJlQ29sdW1uc0VuYWJsZWQgPSB0cnVlO1xuXG4gIC8qKiBTaG93cyB0aGUgd2FybmluZyBmb3IgdGhlIHN1Yi1hc3NldHMgY291bnRlciAqL1xuICBASW5wdXQoKVxuICBzaG93Q291bnRlcldhcm5pbmcgPSBmYWxzZTtcblxuICAvKipcbiAgICogU2V0cyB0aGUgY2xhc3MgbmFtZSB1c2VkIGZvciBhY3RpdmUgcm93cyAobGFzdCBjbGlja2VkKS5cbiAgICogU2V0IGVtcHR5IHN0cmluZyB0byBkaXNhYmxlIGFwcGVuZGluZyBhY3RpdmUgY2xhc3MgdG8gZ3JpZCByb3dzLlxuICAgKi9cbiAgQElucHV0KClcbiAgYWN0aXZlQ2xhc3NOYW1lID0gJ2FjdGl2ZSc7XG5cbiAgLyoqIERldGVybWluZXMgaWYgdGhlIHJvd3Mgb2YgdGhlIGRhdGEgZ3JpZCB3aWxsIGJlIGV4cGFuZGFibGUuXG4gICAqIFBvc3NpYmxlIHZhbHVlczpcbiAgICogLSBgTk9ORWAgLSBubyBleHBhbmRhYmxlIHJvd3MgKGRlZmF1bHQgdmFsdWUpXG4gICAqIC0gYFNZTkNgIC0gYWRkaXRpb25hbCBjb2x1bW4gd2l0aCBleHBhbmQgYnV0dG9uIGlzIGRpc3BsYXllZCBhbmQgZXhwYW5kYWJsZSByb3dzIGFyZSBleHBhbmRpbmcgc3luY2hyb25vdXNseSB3aGVuIGJ1dHRvbiBpcyBjbGlja2VkXG4gICAqIC0gYEFTWU5DYCAtIGFkZGl0aW9uYWwgY29sdW1uIHdpdGggZXhwYW5kIGJ1dHRvbiBpcyBkaXNwbGF5ZWQgYW5kIGV4cGFuZGFibGUgcm93cyBhcmUgZXhwYW5kaW5nIGFzeW5jaHJvbm91c2x5IHdoZW4gYnV0dG9uIGlzIGNsaWNrZWRcbiAgICovXG4gIEBJbnB1dCgpIGV4cGFuZGFibGVSb3dzOiAnTk9ORScgfCAnU1lOQycgfCAnQVNZTkMnID0gJ05PTkUnO1xuXG4gIC8qKiBEZXRlcm1pbmVzIGlmIHRoZSBSZWxvYWQgYnV0dG9uIHdpbGwgYmUgaGlkZGVuLiAqL1xuICBASW5wdXQoKSBoaWRlUmVsb2FkID0gZmFsc2U7XG5cbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gbW91c2UgaXMgb3ZlciBhIHJvdy4gKi9cbiAgQE91dHB1dCgpIHJvd01vdXNlT3ZlciA9IG5ldyBFdmVudEVtaXR0ZXI8b2JqZWN0PigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBtb3VzZSBsZWF2ZXMgYSByb3cuICovXG4gIEBPdXRwdXQoKSByb3dNb3VzZUxlYXZlID0gbmV3IEV2ZW50RW1pdHRlcjxvYmplY3Q+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIGEgcm93IGlzIGNsaWNrZWQuICovXG4gIEBPdXRwdXQoKSByb3dDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8b2JqZWN0PigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBncmlkJ3MgY29uZmlndXJhdGlvbiBpcyBjaGFuZ2VkLiAqL1xuICBAT3V0cHV0KCkgb25Db25maWdDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEdyaWRDb25maWc+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCBiZWZvcmUgdGhlIGZpbHRlciBpcyBhcHBsaWVkLiAqL1xuICBAT3V0cHV0KCkgb25CZWZvcmVGaWx0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPG9iamVjdD4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IGJlZm9yZSB0aGUgc2VhcmNoIGlzIHBlcmZvcm1lZC4gKi9cbiAgQE91dHB1dCgpIG9uQmVmb3JlU2VhcmNoID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIGEgZmlsdGVyIGlzIGFwcGxpZWQgaW4gYSBjb2x1bW4uICovXG4gIEBPdXRwdXQoKSBvbkZpbHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8e1xuICAgIGNvbHVtbk5hbWU/OiBzdHJpbmc7XG4gICAgZHJvcGRvd24/OiBCc0Ryb3Bkb3duRGlyZWN0aXZlO1xuICAgIGZpbHRlcmluZ01vZGlmaWVyPzogRmlsdGVyO1xuICB9PigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBpdGVtcyBzZWxlY3Rpb24gY2hhbmdlcy4gVGhlIGFycmF5IGNvbnRhaW5zIGtleXMgb2Ygc2VsZWN0ZWQgaXRlbXMgKGtleSBwcm9wZXJ0eSBpcyBkZWZpbmVkIGJ5IGBzZWxlY3Rpb25QcmltYXJ5S2V5YCkuICovXG4gIEBPdXRwdXQoKSBpdGVtc1NlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nW10+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIHJlbG9hZCBidXR0b24gaXMgY2xpY2tlZC4gKi9cbiAgQE91dHB1dCgpIG9uUmVsb2FkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBhIGN1c3RvbSBjb2x1bW4gaXMgYWRkZWQgKi9cbiAgQE91dHB1dCgpIG9uQWRkQ3VzdG9tQ29sdW1uID0gbmV3IEV2ZW50RW1pdHRlcjxDdXN0b21Db2x1bW5Db25maWc+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIGEgY3VzdG9tIGNvbHVtbiBpcyByZW1vdmVkICovXG4gIEBPdXRwdXQoKSBvblJlbW92ZUN1c3RvbUNvbHVtbiA9IG5ldyBFdmVudEVtaXR0ZXI8Q29sdW1uPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgYWZ0ZXIgdGhlIGNvbHVtbiBmaWx0ZXIgaGFzIGJlZW4gcmVzZXQgKi9cbiAgQE91dHB1dCgpIG9uQ29sdW1uRmlsdGVyUmVzZXQgPSBuZXcgRXZlbnRFbWl0dGVyPENvbHVtbj4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gY29sdW1uIHNvcnRpbmcgaGFzIGJlZW4gY2hhbmdlZCAqL1xuICBAT3V0cHV0KCkgb25Tb3J0ID0gbmV3IEV2ZW50RW1pdHRlcjxHcmlkQ29uZmlnPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBwYWdlIHNpemUgaGFzIGJlZW4gY2hhbmdlZCAqL1xuICBAT3V0cHV0KCkgb25QYWdlU2l6ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8R3JpZENvbmZpZz4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gY29sdW1uIG9yZGVyIGhhcyBiZWVuIGNoYW5nZWQgKi9cbiAgQE91dHB1dCgpIG9uQ29sdW1uUmVvcmRlcmVkID0gbmV3IEV2ZW50RW1pdHRlcjxHcmlkQ29uZmlnPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBjb2x1bW4gb3JkZXIgaGFzIGJlZW4gY2hhbmdlZCAqL1xuICBAT3V0cHV0KCkgb25Db2x1bW5WaXNpYmlsaXR5Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxHcmlkQ29uZmlnPigpO1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oQ29sdW1uRGlyZWN0aXZlKSBjb2x1bW5SZW5kZXJlcnM6IFF1ZXJ5TGlzdDxDb2x1bW5EaXJlY3RpdmU+O1xuXG4gIEBDb250ZW50Q2hpbGQoRXhwYW5kYWJsZVJvd0RpcmVjdGl2ZSlcbiAgZXhwYW5kYWJsZVJvdzogRXhwYW5kYWJsZVJvd0RpcmVjdGl2ZTtcblxuICBAVmlld0NoaWxkKCdzY3JvbGwnLCB7IHN0YXRpYzogdHJ1ZSB9KSBzY3JvbGxDb250YWluZXI6IEVsZW1lbnRSZWY7XG5cbiAgQFZpZXdDaGlsZCgnaW5maW5pdGVTY3JvbGxDb250YWluZXInLCB7IHN0YXRpYzogZmFsc2UsIHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcbiAgaW5maW5pdGVTY3JvbGxDb250YWluZXI6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgQENvbnRlbnRDaGlsZChFbXB0eVN0YXRlQ29udGV4dERpcmVjdGl2ZSkgZW1wdHlTdGF0ZTogRW1wdHlTdGF0ZUNvbnRleHREaXJlY3RpdmU7XG5cbiAgbG9hZE1vcmVDb21wb25lbnQ6IExvYWRNb3JlQ29tcG9uZW50O1xuXG4gIGNvbHVtbk5hbWVzID0gW107XG5cbiAgc3R5bGVzID0ge1xuICAgIHRhYmxlQ3Vyc29yOiAnYXV0bycsXG4gICAgZ3JpZFRlbXBsYXRlQ29sdW1uczogdW5kZWZpbmVkLFxuICAgIGdyaWRJbmZpbml0ZVNjcm9sbENvbHVtbjogdW5kZWZpbmVkXG4gIH07XG5cbiAgc2VhcmNoVGV4dCQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgZmlsdGVyaW5nQXBwbGllZCA9IGZhbHNlO1xuICBjb2x1bW5zV2l0aEZpbHRlcnNBcHBsaWVkOiBDb2x1bW5bXSA9IFtdO1xuXG4gIHRvdGFsUGFnZXNDb3VudCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oSW5maW5pdHkpO1xuICBoaWRlUGFnaW5hdGlvbiQgPSB0aGlzLnRvdGFsUGFnZXNDb3VudCQucGlwZShcbiAgICBtYXAodG90YWxQYWdlc0NvdW50ID0+IHRvdGFsUGFnZXNDb3VudCA8PSAxKSxcbiAgICBkZWxheSgwKSAvLyBwcmV2ZW50cyBFeHByZXNzaW9uQ2hhbmdlZEFmdGVySXRIYXNCZWVuQ2hlY2tlZEVycm9yXG4gICk7XG5cbiAgc2VsZWN0ZWRJdGVtSWRzOiBzdHJpbmdbXSA9IFtdO1xuICBjdXJyZW50UGFnZVNlbGVjdGlvblN0YXRlID0ge1xuICAgIGFsbFNlbGVjdGVkOiBmYWxzZSxcbiAgICBhbGxEZXNlbGVjdGVkOiB0cnVlXG4gIH07XG5cbiAgYnVpbHRJbkFjdGlvblR5cGUgPSB7XG4gICAgRWRpdDogQnVpbHRJbkFjdGlvblR5cGUuRWRpdCxcbiAgICBEZWxldGU6IEJ1aWx0SW5BY3Rpb25UeXBlLkRlbGV0ZSxcbiAgICBFeHBvcnQ6IEJ1aWx0SW5BY3Rpb25UeXBlLkV4cG9ydFxuICB9O1xuXG4gIGNvbmZpcm1SZW1vdmVDb2x1bW5CdXR0b25zOiBQb3BvdmVyQ29uZmlybUJ1dHRvbnNbXSA9IFtcbiAgICB7XG4gICAgICBsYWJlbDogZ2V0dGV4dCgnQ2FuY2VsJyksXG4gICAgICBhY3Rpb246ICgpID0+IFByb21pc2UucmVzb2x2ZShmYWxzZSlcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiBnZXR0ZXh0KCdSZW1vdmVgY29sdW1uLHZlcmJgJyksXG4gICAgICBzdGF0dXM6ICdkYW5nZXInLFxuICAgICAgYWN0aW9uOiAoKSA9PiBQcm9taXNlLnJlc29sdmUodHJ1ZSlcbiAgICB9XG4gIF07XG5cbiAgaXNDb25maWdDb250ZXh0S25vd24gPSBmYWxzZTtcbiAgZW1wdHlTdGF0ZUNvbnRleHQkOiBPYnNlcnZhYmxlPERhdGFTb3VyY2VTdGF0cz47XG5cbiAgLyoqXG4gICAqIEEgbWFwIG9mIHJvd3Mgd2hpY2ggaGF2ZSBiZWVuIGV4cGFuZGVkLlxuICAgKi9cbiAgZXhwYW5kZWRSb3dzOiBNYXA8Um93LCB7IHZpc2libGUkOiBTdWJqZWN0PGJvb2xlYW4+IHwgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+IH0+ID0gbmV3IE1hcCgpO1xuXG4gIC8qKiBQcm9kdWN0IGV4cGVyaWVuY2UgY29uc3RhbnRzIGRlY2xhcmF0aW9ucyAqL1xuICBwcm9kdWN0RXhwZXJpZW5jZUV2ZW50OiBQcm9kdWN0RXhwZXJpZW5jZUV2ZW50ID0geyBldmVudE5hbWU6IFBYX0VWRU5UX05BTUUgfTtcbiAgUFhfQUNUSU9OUyA9IFBYX0FDVElPTlM7XG5cbiAgcmVhZG9ubHkgc29ydENvbHVtblRpdGxlID0gZ2V0dGV4dCgnU29ydCBjb2x1bW4gXCJ7eyBuYW1lIH19XCInKTtcblxuICByZXNpemVIYW5kbGVNb3VzZURvd24kID0gbmV3IEV2ZW50RW1pdHRlcjx7IGV2ZW50OiBNb3VzZUV2ZW50OyB0YXJnZXRDb2x1bW5OYW1lOiBzdHJpbmcgfT4oKTtcbiAgcmVzaXplSGFuZGxlQ29udGFpbmVyTW91c2VNb3ZlJCA9IG5ldyBFdmVudEVtaXR0ZXI8TW91c2VFdmVudD4oKTtcbiAgcmVzaXplSGFuZGxlQ29udGFpbmVyTW91c2VVcCQgPSBuZXcgRXZlbnRFbWl0dGVyPE1vdXNlRXZlbnQ+KCk7XG5cbiAgZmlsdGVyc0hlbHBQb3BvdmVySHRtbDogc3RyaW5nID0gZ2V0dGV4dCgnQ2xpY2sgdGhlIGNvbHVtbiBoZWFkZXJzIHRvIGFwcGx5IGZpbHRlcnMuJyk7XG5cbiAgcHJpdmF0ZSBoZWFkZXJCZWluZ1Jlc2l6ZWQ6IHtcbiAgICBjb2x1bW5OYW1lOiBzdHJpbmc7XG4gICAgZWw6IEhUTUxFbGVtZW50O1xuICB9O1xuICBAVmlld0NoaWxkcmVuKENka0hlYWRlckNlbGwsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBwcml2YXRlIHRoUmVmczogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuICBwcml2YXRlIHRoRWxzOiBIVE1MRWxlbWVudFtdO1xuXG4gIEBWaWV3Q2hpbGQoQ2RrVGFibGUsIHsgc3RhdGljOiBmYWxzZSB9KVxuICB0YWJsZVJlZjogQ2RrVGFibGU8YW55PjtcblxuICBwcml2YXRlIHJlY3JlYXRlTG9hZE1vcmVDb21wb25lbnQ6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBjb2x1bW5zSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIGRlZmF1bHRDb2x1bW5zOiBDb2x1bW5bXSA9IFtdO1xuXG4gIHByaXZhdGUgcmVsb2FkQ29uZmlndXJhdGlvbiQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xuXG4gIHByaXZhdGUgYWN0aW9uQ29udHJvbHNJbnB1dCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEFjdGlvbkNvbnRyb2xbXT4oW10pO1xuXG4gIHByaXZhdGUgdW5zdWJzY3JpYmUkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBwcml2YXRlIG1hbnVhbFNlYXJjaCQgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSBsYXN0TWFudWFsU2VhcmNoVmFsdWUgPSAnJztcblxuICBwcml2YXRlIHJlYWRvbmx5IFNFQVJDSF9ERUJPVU5DRV9USU1FID0gNTAwO1xuXG4gIHByaXZhdGUgY3VzdG9tQ29sdW1uU2VydmljZSA9IGluamVjdChDdXN0b21Db2x1bW5TZXJ2aWNlKTtcblxuICAvKipcbiAgICogRXZlbnQgZW1pdHRlciwgdGFraW5nIGJvb2xlYW4gdmFsdWVzIHVzZWQgZm9yIGxvYWRpbmcgZGF0YSBncmlkIGRhdGEgd2l0aCBkZWJvdW5jZS5cbiAgICogRGVmYXVsdCB2YWx1ZSBpcyBzZXQgdG8gZmFsc2UuIFNldCB0byB0cnVlIGlmIGRhdGEgZ3JpZCBpcyB1c2luZyBpbmZpbml0ZSBzY3JvbGwgYW5kIHBhZ2Ugc2hvdWxkIGJlIHJlbG9hZGVkLlxuICAgKiBUaGlzIGlzIHVzZWQgdG8gYXZvaWQgaGF2aW5nIG11bHRpcGxlIHRoaXMubG9hZERhdGEoKSBmdW5jdGlvbiBjYWxscy5cbiAgICovXG4gIHByaXZhdGUgdHJpZ2dlckxvYWREYXRhID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpXG4gICAgQEluamVjdChEQVRBX0dSSURfQ09ORklHVVJBVElPTl9TVFJBVEVHWSlcbiAgICBwdWJsaWMgY29uZmlndXJhdGlvblN0cmF0ZWd5OiBEYXRhR3JpZENvbmZpZ3VyYXRpb25TdHJhdGVneSxcbiAgICBwcml2YXRlIGRhdGFHcmlkU2VydmljZTogRGF0YUdyaWRTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgcHJpdmF0ZSBnYWluc2lnaHRTZXJ2aWNlOiBHYWluc2lnaHRTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWxlcnRTZXJ2aWNlOiBBbGVydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhY3Rpb25Db250cm9sc1NlcnZpY2U6IEFjdGlvbkNvbnRyb2xzRXh0ZW5zaW9uU2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVxuICApIHtcbiAgICB0aGlzLnRyaWdnZXJMb2FkRGF0YS5waXBlKGRlYm91bmNlVGltZSgxKSwgdGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSkuc3Vic2NyaWJlKHJlbG9hZCA9PiB7XG4gICAgICB0aGlzLmxvYWREYXRhKHJlbG9hZCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlbG9hZENvbmZpZ3VyYXRpb24kXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5Py5nZXRDb25maWckKCkgPz8gb2YobnVsbCkpLFxuICAgICAgICB0YXAoY29uZmlnID0+IHtcbiAgICAgICAgICB0aGlzLnNldENvbHVtbnMoY29uZmlnKTtcbiAgICAgICAgICB0aGlzLnNldFBhZ2VTaXplKGNvbmZpZyk7XG4gICAgICAgICAgdGhpcy50cmlnZ2VyTG9hZERhdGEuZW1pdCghIXRoaXMuaW5maW5pdGVTY3JvbGwpO1xuICAgICAgICB9KSxcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuZGF0YVNvdXJjZS5zdGF0cyQpLFxuICAgICAgICB0YXAoc3RhdHMgPT4ge1xuICAgICAgICAgIHRoaXMuY3JlYXRlTG9hZE1vcmVDb21wb25lbnQoc3RhdHMpO1xuICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nTGFiZWxzUGFyYW1zKHN0YXRzKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVBhZ2luYXRpb25MYWJlbFBhcmFtcyhzdGF0cyk7XG4gICAgICAgICAgdGhpcy51cGRhdGVQYWdpbmF0aW9uV2hlbk5vRGV2aWNlc0xhc3RQYWdlKHN0YXRzKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaXNDb25maWdDb250ZXh0S25vd24gPSAhIXRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5Py5pc0NvbnRleHRLbm93bigpO1xuXG4gICAgdGhpcy5zZXR1cFNlYXJjaE9ic2VydmFibGVzKCk7XG5cbiAgICBpZiAodGhpcy5zZWxlY3RhYmxlKSB7XG4gICAgICBjb21iaW5lTGF0ZXN0KHRoaXMuZGF0YVNvdXJjZS5kYXRhJCwgdGhpcy5pdGVtc1NlbGVjdC5hc09ic2VydmFibGUoKSlcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSlcbiAgICAgICAgLnN1YnNjcmliZSgoW2RhdGFdKSA9PiB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFBhZ2VFbXB0eSA9IGRhdGEubGVuZ3RoID09PSAwO1xuXG4gICAgICAgICAgdGhpcy5jdXJyZW50UGFnZVNlbGVjdGlvblN0YXRlID0ge1xuICAgICAgICAgICAgYWxsU2VsZWN0ZWQ6IGN1cnJlbnRQYWdlRW1wdHkgPyBmYWxzZSA6IGRhdGEuZXZlcnkoaXRlbSA9PiB0aGlzLmlzSXRlbVNlbGVjdGVkKGl0ZW0pKSxcbiAgICAgICAgICAgIGFsbERlc2VsZWN0ZWQ6IGN1cnJlbnRQYWdlRW1wdHkgPyB0cnVlIDogZGF0YS5ldmVyeShpdGVtID0+ICF0aGlzLmlzSXRlbVNlbGVjdGVkKGl0ZW0pKVxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMucmVsb2FkQ29uZmlndXJhdGlvbiQubmV4dCgpO1xuXG4gICAgdGhpcy5hY3Rpb25Db250cm9sc1NlcnZpY2UuaXRlbXMkXG4gICAgICAucGlwZShcbiAgICAgICAgc3RhcnRXaXRoKFtdKSxcbiAgICAgICAgc3dpdGNoTWFwKChob29rczogQWN0aW9uQ29udHJvbEhvb2tbXSkgPT5cbiAgICAgICAgICBmb3JrSm9pbihcbiAgICAgICAgICAgIGhvb2tzLm1hcChob29rID0+XG4gICAgICAgICAgICAgIHRvT2JzZXJ2YWJsZShcbiAgICAgICAgICAgICAgICBob29rPy5tYXRjaGVzR3JpZFxuICAgICAgICAgICAgICAgICAgPyB0aGlzLnNhZmVseUludm9rZU1hdGNoZXIoXG4gICAgICAgICAgICAgICAgICAgICAgaG9vay5tYXRjaGVzR3JpZCxcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdXRlLFxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5Py5nZXRDb250ZXh0KClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgOiBmYWxzZVxuICAgICAgICAgICAgICApLnBpcGUobWFwKG1hdGNoZXMgPT4gKHsgaG9vaywgbWF0Y2hlcyB9KSkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKS5waXBlKHN0YXJ0V2l0aChbXSkpXG4gICAgICAgICksXG4gICAgICAgIG1hcCgoaG9va3M6IEFycmF5PHsgaG9vazogQWN0aW9uQ29udHJvbEhvb2s7IG1hdGNoZXM6IGJvb2xlYW4gfT4pID0+XG4gICAgICAgICAgaG9va3MuZmlsdGVyKGhvb2sgPT4gaG9vay5tYXRjaGVzKS5tYXAoaG9vayA9PiBob29rLmhvb2spXG4gICAgICAgICksXG4gICAgICAgIG1hcCgoaG9va3M6IEFjdGlvbkNvbnRyb2xIb29rW10pID0+XG4gICAgICAgICAgaG9va3MucmVkdWNlKChhY3Rpb25Db250cm9sczogQWN0aW9uQ29udHJvbFtdLCBjdXJyZW50SG9vazogQWN0aW9uQ29udHJvbEhvb2spID0+IHtcbiAgICAgICAgICAgIHJldHVybiBbLi4uYWN0aW9uQ29udHJvbHMsIC4uLmNhc3RBcnJheShjdXJyZW50SG9vay5hY3Rpb25Db250cm9scyldO1xuICAgICAgICAgIH0sIFtdKVxuICAgICAgICApLFxuICAgICAgICBjb21iaW5lTGF0ZXN0V2l0aCh0aGlzLmFjdGlvbkNvbnRyb2xzSW5wdXQkKSxcbiAgICAgICAgdGFwKFxuICAgICAgICAgIChbaG9va0NvbnRyb2xzLCBpbnB1dENvbnRyb2xzXSkgPT5cbiAgICAgICAgICAgICh0aGlzLmFjdGlvbkNvbnRyb2xzID0gWy4uLmlucHV0Q29udHJvbHMsIC4uLmhvb2tDb250cm9sc10pXG4gICAgICAgICksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIGlmICh0aGlzLnJlZnJlc2gpIHtcbiAgICAgIHRoaXMucmVmcmVzaC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuY2FuY2VsKCk7XG4gICAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnByb2Nlc3NBbmRQZXJzaXN0Q29uZmlnQ2hhbmdlKCk7XG4gICAgdGhpcy51cGRhdGVDb2x1bW5zKCk7XG5cbiAgICAvLyBSZXNldHRpbmcgdGhlIHN0YXRzIHNpemUgdG8gMCB3aGVuIG1hbmFnZWQgb2JqZWN0cyBhcmUgZGVsZXRlZCBidXQgc2l6aW5nIG5vdCB5ZXQgdXBkYXRlZFxuICAgIC8vIFRPRE8gcmVtb3ZlIGFmdGVyIE1UTS02MDIyNiBpcyByZXNvbHZlZFxuICAgIHRoaXMuZW1wdHlTdGF0ZUNvbnRleHQkID0gY29tYmluZUxhdGVzdChbdGhpcy5kYXRhU291cmNlLnN0YXRzJCwgdGhpcy5kYXRhU291cmNlLmRhdGEkXSkucGlwZShcbiAgICAgIG1hcCgoW3N0YXRzLCBkYXRhXSkgPT4ge1xuICAgICAgICBpZiAoc3RhdHMuZmlsdGVyZWRTaXplID09PSAxICYmIGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHsgLi4uc3RhdHMsIHNpemU6IDAsIGZpbHRlcmVkU2l6ZTogMCB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGF0cztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHNldEV4cGFuZGFibGVSb3dWaXNpYmxlKHJvdzogUm93LCBzdWNjZXNzOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgIHRoaXMuZXhwYW5kZWRSb3dzLmdldChyb3cpLnZpc2libGUkLm5leHQodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXhwYW5kZWRSb3dzLmdldChyb3cpLnZpc2libGUkLm5leHQoZmFsc2UpO1xuICAgICAgdGhpcy5leHBhbmRlZFJvd3MuZGVsZXRlKHJvdyk7XG4gICAgICB0aGlzLnRhYmxlUmVmLnJlbmRlclJvd3MoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhldmVudCkge1xuICAgIGlmIChcbiAgICAgICgoIWV2ZW50Ll9hY3Rpb25Db250cm9scyAmJiAhZXZlbnQuc2VhcmNoVGV4dCkgfHwgZXZlbnQuX2FjdGlvbkNvbnRyb2xzPy5maXJzdENoYW5nZSkgJiZcbiAgICAgIHRoaXMuY29sdW1uc0luaXRpYWxpemVkXG4gICAgKSB7XG4gICAgICBjb25zdCByZWxvYWQgPSAhIWV2ZW50Ll9pbmZpbml0ZVNjcm9sbD8uY3VycmVudFZhbHVlICYmICFldmVudC5faW5maW5pdGVTY3JvbGw/LmZpcnN0Q2hhbmdlO1xuICAgICAgdGhpcy50cmlnZ2VyTG9hZERhdGEuZW1pdChyZWxvYWQpO1xuICAgIH1cbiAgICBpZiAoISFldmVudC5fY29sdW1ucyAmJiAhZXZlbnQuX2NvbHVtbnMuZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMucmVsb2FkQ29uZmlndXJhdGlvbiQubmV4dCgpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUNvbHVtbnMoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnVwZGF0ZUdyaWRDb2x1bW5zU2l6ZSgpO1xuICAgIHRoaXMudXBkYXRlVGhFbHMoKTtcbiAgICB0aGlzLnNldHVwUmVzaXplSGFuZGxlKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlJC5uZXh0KCk7XG4gICAgdGhpcy51bnN1YnNjcmliZSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIGV4cGFuZChyb3c6IFJvdykge1xuICAgIGNvbnN0IGlzU3luY0V4cGFuZCA9IHRoaXMuZXhwYW5kYWJsZVJvd3MgPT09ICdTWU5DJztcbiAgICBsZXQgdmlzaWJsZVN1YmplY3Q6IFN1YmplY3Q8Ym9vbGVhbj4gfCBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj47XG4gICAgaWYgKGlzU3luY0V4cGFuZCkge1xuICAgICAgdmlzaWJsZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2aXNpYmxlU3ViamVjdCA9IG5ldyBTdWJqZWN0KCk7XG4gICAgfVxuICAgIHRoaXMuZXhwYW5kZWRSb3dzLnNldChyb3csIHsgdmlzaWJsZSQ6IHZpc2libGVTdWJqZWN0IH0pO1xuICAgIHRoaXMudGFibGVSZWYucmVuZGVyUm93cygpO1xuICAgIHJldHVybiB2aXNpYmxlU3ViamVjdDtcbiAgfVxuXG4gIGNvbGxhcHNlKHJvdzogUm93KTogdm9pZCB7XG4gICAgdGhpcy5leHBhbmRlZFJvd3MuZGVsZXRlKHJvdyk7XG4gICAgdGhpcy50YWJsZVJlZi5yZW5kZXJSb3dzKCk7XG4gIH1cblxuICBpc1Jvd0V4cGFuZGVkID0gKF8sIHJvdzogUm93KTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuICEhdGhpcy5leHBhbmRlZFJvd3MuZ2V0KHJvdyk7XG4gIH07XG5cbiAgc2V0Q29sdW1ucyhjb25maWc6IEdyaWRDb25maWcpIHtcbiAgICBpZiAoISF0aGlzLmNvbmZpZ3VyYXRpb25TdHJhdGVneSAmJiAhaXNFbXB0eSh0aGlzLl9jb2x1bW5zKSkge1xuICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5kYXRhR3JpZFNlcnZpY2UuYXBwbHlDb25maWdUb0NvbHVtbnMoY29uZmlnLCB0aGlzLl9jb2x1bW5zKTtcbiAgICAgIHRoaXMuY29sdW1uc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5fY29sdW1ucyB8fCBbXTtcbiAgICAgIHRoaXMuY29sdW1uc0luaXRpYWxpemVkID0gdGhpcy5jb2x1bW5zSW5pdGlhbGl6ZWQgfHwgISF0aGlzLl9jb2x1bW5zO1xuICAgIH1cblxuICAgIHRoaXMuZGVmYXVsdENvbHVtbnMgPSB0aGlzLmNvbHVtbnMgfHwgW107XG4gICAgdGhpcy51cGRhdGVDb2x1bW5zKCk7XG4gIH1cblxuICBzZXRQYWdlU2l6ZShjb25maWc6IEdyaWRDb25maWcpIHtcbiAgICBpZiAoISFjb25maWc/LnBhZ2luYXRpb24pIHtcbiAgICAgIHRoaXMucGFnaW5hdGlvbiA9IHtcbiAgICAgICAgLi4udGhpcy5wYWdpbmF0aW9uLFxuICAgICAgICBwYWdlU2l6ZTogY29uZmlnLnBhZ2luYXRpb24ucGFnZVNpemVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgcGFnZVNpemUgPSBnZXQodGhpcy5wYWdpbmF0aW9uLCAncGFnZVNpemUnKTtcbiAgICBpZiAoXG4gICAgICB0aGlzLnBhZ2luYXRpb24gJiZcbiAgICAgICF0aGlzLnBvc3NpYmxlUGFnZVNpemVzLmZpbmQocG9zc2libGVQYWdlU2l6ZSA9PiBwb3NzaWJsZVBhZ2VTaXplID09PSBwYWdlU2l6ZSlcbiAgICApIHtcbiAgICAgIHRoaXMucGFnaW5hdGlvbiA9IHsgLi4udGhpcy5wYWdpbmF0aW9uLCBwYWdlU2l6ZTogdGhpcy5taW5Qb3NzaWJsZVBhZ2VTaXplIH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb3BlbkN1c3RvbUNvbHVtbigpIHtcbiAgICBhd2FpdCB0aGlzLmN1c3RvbUNvbHVtblNlcnZpY2Uub3BlbkN1c3RvbUNvbHVtbnModGhpcy5jb2x1bW5zLCBjb25maWcgPT4ge1xuICAgICAgY29uc3QgZmlyc3RGaXhlZCA9IHRoaXMuY29sdW1ucy5maW5kSW5kZXgoYyA9PiBjLnBvc2l0aW9uRml4ZWQpO1xuICAgICAgY29uc3QgaWR4ID0gZmlyc3RGaXhlZCA+IC0xID8gZmlyc3RGaXhlZCA6IHRoaXMuY29sdW1ucy5sZW5ndGg7XG4gICAgICB0aGlzLmNvbHVtbnMuc3BsaWNlKGlkeCwgMCwgbmV3IEN1c3RvbUNvbHVtbihjb25maWcpKTtcbiAgICAgIHRoaXMudXBkYXRlQ29sdW1ucygpO1xuICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoe1xuICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuQUREX0NVU1RPTV9DT0xVTU4sXG4gICAgICAgIGNvbHVtbjogY29uZmlnLmhlYWRlciB8fCBjb25maWcubmFtZVxuICAgICAgfSk7XG4gICAgICB0aGlzLm9uQWRkQ3VzdG9tQ29sdW1uLmVtaXQoY29uZmlnKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHJlbW92ZUN1c3RvbUNvbHVtbihcbiAgICBwb0NvbmZpcm06IFBvcG92ZXJDb25maXJtQ29tcG9uZW50LFxuICAgIGNvbHVtbjogQ29sdW1uLFxuICAgIGRkQ29uZmlndXJlQ29sdW1uczogQnNEcm9wZG93bkRpcmVjdGl2ZVxuICApIHtcbiAgICBkZENvbmZpZ3VyZUNvbHVtbnMuYXV0b0Nsb3NlID0gZmFsc2U7XG4gICAgcG9Db25maXJtLm1lc3NhZ2UgPSBnZXR0ZXh0KCdEbyB5b3Ugd2FudCB0byByZW1vdmUgdGhpcyBjb2x1bW4/Jyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlbW92ZTogYm9vbGVhbiA9IGF3YWl0IHBvQ29uZmlybS5zaG93KHRoaXMuY29uZmlybVJlbW92ZUNvbHVtbkJ1dHRvbnMpO1xuICAgICAgaWYgKHJlbW92ZSkge1xuICAgICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2w/Lm5hbWUgIT09IGNvbHVtbj8ubmFtZSk7XG4gICAgICAgIHRoaXMudXBkYXRlQ29sdW1ucygpO1xuICAgICAgICB0aGlzLm9uUmVtb3ZlQ3VzdG9tQ29sdW1uLmVtaXQoY29sdW1uKTtcbiAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoe1xuICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5SRU1PVkVfQ1VTVE9NX0NPTFVNTixcbiAgICAgICAgICBjb2x1bW46IGNvbHVtbi5oZWFkZXIgfHwgY29sdW1uLm5hbWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkU2VydmVyRmFpbHVyZShlKTtcbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IChkZENvbmZpZ3VyZUNvbHVtbnMuYXV0b0Nsb3NlID0gdHJ1ZSksIDApO1xuICB9XG5cbiAgYXN5bmMgcmVtb3ZlRmlsdGVyKGZpbHRlcjogUGFydGlhbDxGaWx0ZXJDaGlwPikge1xuICAgIGNvbnN0IGZpbHRlcmluZ01vZGlmaWVyID0gZmlsdGVyLmV4dGVybmFsRmlsdGVyUXVlcnlcbiAgICAgID8geyBleHRlcm5hbEZpbHRlclF1ZXJ5OiBmaWx0ZXIuZXh0ZXJuYWxGaWx0ZXJRdWVyeSB9XG4gICAgICA6IHsgZmlsdGVyUHJlZGljYXRlOiBmaWx0ZXIuZmlsdGVyUHJlZGljYXRlIH07XG4gICAgdGhpcy5vbkJlZm9yZUZpbHRlci5lbWl0KHtcbiAgICAgIGNvbHVtbk5hbWU6IGZpbHRlci5jb2x1bW5OYW1lLFxuICAgICAgZHJvcGRvd246IHVuZGVmaW5lZCxcbiAgICAgIGZpbHRlcmluZ01vZGlmaWVyXG4gICAgfSk7XG4gICAgaWYgKFxuICAgICAgKGZpbHRlci5leHRlcm5hbEZpbHRlclF1ZXJ5ICYmICF0aGlzLmNoZWNrSWZBbnlWYWx1ZXNFeGlzdChmaWx0ZXIuZXh0ZXJuYWxGaWx0ZXJRdWVyeSkpIHx8XG4gICAgICBmaWx0ZXIuZmlsdGVyUHJlZGljYXRlXG4gICAgKSB7XG4gICAgICB0aGlzLnVwZGF0ZUZpbHRlcmluZyhbZmlsdGVyLmNvbHVtbk5hbWVdLCB7XG4gICAgICAgIHR5cGU6IEZpbHRlcmluZ0FjdGlvblR5cGUuUmVzZXRGaWx0ZXJcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLm9uRmlsdGVyLmVtaXQoeyBjb2x1bW5OYW1lOiBmaWx0ZXIuY29sdW1uTmFtZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGRhdGVGaWx0ZXJpbmcoW2ZpbHRlci5jb2x1bW5OYW1lXSwge1xuICAgICAgICB0eXBlOiBGaWx0ZXJpbmdBY3Rpb25UeXBlLkFwcGx5RmlsdGVyLFxuICAgICAgICBwYXlsb2FkOiB7IGZpbHRlcmluZ01vZGlmaWVyIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5vbkZpbHRlci5lbWl0KHtcbiAgICAgICAgY29sdW1uTmFtZTogZmlsdGVyLmNvbHVtbk5hbWUsXG4gICAgICAgIGRyb3Bkb3duOiB1bmRlZmluZWQsXG4gICAgICAgIGZpbHRlcmluZ01vZGlmaWVyXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnRyaWdnZXJFdmVudCh7XG4gICAgICBhY3Rpb246IFBYX0FDVElPTlMuUkVNT1ZFX0ZJTFRFUixcbiAgICAgIGNvbHVtbjogZmlsdGVyLmNvbHVtbk5hbWUsXG4gICAgICBmaWx0ZXJpbmdNb2RpZmllclxuICAgIH0pO1xuICB9XG5cbiAgdHJhY2tCeU5hbWUoaW5kZXgsIGl0ZW0pIHtcbiAgICByZXR1cm4gaXRlbS5uYW1lO1xuICB9XG5cbiAgcmVzb2x2ZUNlbGxWYWx1ZShyb3csIHBhdGgpIHtcbiAgICByZXR1cm4gZmxvdyhbXG4gICAgICB4ID0+IHRoaXMuZGF0YVNvdXJjZS5yZXNvbHZlVmFsdWUoeCwgcGF0aCksXG4gICAgICB0aGlzLmRhdGFTb3VyY2UucmVzb2x2ZUZ1bmN0aW9uLFxuICAgICAgdGhpcy5kYXRhU291cmNlLm5vcm1hbGl6ZU5pbFxuICAgIF0pKHJvdyk7XG4gIH1cblxuICBjaGFuZ2VTb3J0T3JkZXIoY29sdW1uTmFtZSkge1xuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY29sdW1ucy5maW5kKCh7IG5hbWUgfSkgPT4gbmFtZSA9PT0gY29sdW1uTmFtZSk7XG5cbiAgICBpZiAoY29sdW1uKSB7XG4gICAgICBjb25zdCB7IHNvcnRPcmRlciB9ID0gY29sdW1uO1xuXG4gICAgICBpZiAoIXNvcnRPcmRlcikge1xuICAgICAgICB0aGlzLnVwZGF0ZVNvcnRpbmcoW2NvbHVtbk5hbWVdLCBTb3J0aW5nT3JkZXIuQVNDKTtcbiAgICAgIH0gZWxzZSBpZiAoc29ydE9yZGVyID09PSBTb3J0aW5nT3JkZXIuQVNDKSB7XG4gICAgICAgIHRoaXMudXBkYXRlU29ydGluZyhbY29sdW1uTmFtZV0sIFNvcnRpbmdPcmRlci5ERVNDKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudXBkYXRlU29ydGluZyhbY29sdW1uTmFtZV0sICcnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB1cGRhdGVTb3J0aW5nKGNvbHVtbk5hbWVzOiBzdHJpbmdbXSwgc29ydE9yZGVyOiBTb3J0T3JkZXIpIHtcbiAgICB0aGlzLnRyaWdnZXJFdmVudCh7XG4gICAgICBhY3Rpb246IFBYX0FDVElPTlMuQ0hBTkdFX1NPUlRJTkdfT1JERVIsXG4gICAgICBjb2x1bW5zOiBjb2x1bW5OYW1lcyxcbiAgICAgIHNvcnRPcmRlcjogc29ydE9yZGVyID09PSAnJyA/ICdub25lJyA6IHNvcnRPcmRlclxuICAgIH0pO1xuXG4gICAgdGhpcy5jb2x1bW5zID0gdGhpcy5jb2x1bW5zLm1hcCgoY29sdW1uKTogQ29sdW1uID0+IHtcbiAgICAgIGlmIChjb2x1bW5OYW1lcy5pbmNsdWRlcyhjb2x1bW4ubmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uY29sdW1uLCBzb3J0T3JkZXIgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICB9KTtcbiAgICB0aGlzLmVtaXRDb25maWdDaGFuZ2UoJ3NvcnQnKTtcblxuICAgIHRoaXMucmVsb2FkKCk7XG4gIH1cblxuICBhcHBseUZpbHRlcihjb2x1bW5OYW1lLCBkcm9wZG93biwgZmlsdGVyaW5nTW9kaWZpZXIpIHtcbiAgICB0aGlzLnRyaWdnZXJFdmVudCh7XG4gICAgICBhY3Rpb246IFBYX0FDVElPTlMuQVBQTFlfRklMVEVSLFxuICAgICAgY29sdW1uOiBjb2x1bW5OYW1lLFxuICAgICAgZmlsdGVyaW5nTW9kaWZpZXJcbiAgICB9KTtcbiAgICB0aGlzLm9uQmVmb3JlRmlsdGVyLmVtaXQoeyBjb2x1bW5OYW1lLCBkcm9wZG93biwgZmlsdGVyaW5nTW9kaWZpZXIgfSk7XG4gICAgdGhpcy51cGRhdGVGaWx0ZXJpbmcoW2NvbHVtbk5hbWVdLCB7XG4gICAgICB0eXBlOiBGaWx0ZXJpbmdBY3Rpb25UeXBlLkFwcGx5RmlsdGVyLFxuICAgICAgcGF5bG9hZDogeyBmaWx0ZXJpbmdNb2RpZmllciB9XG4gICAgfSk7XG4gICAgZHJvcGRvd24uaGlkZSgpO1xuICAgIHRoaXMub25GaWx0ZXIuZW1pdCh7IGNvbHVtbk5hbWUsIGRyb3Bkb3duLCBmaWx0ZXJpbmdNb2RpZmllciB9KTtcbiAgfVxuXG4gIHJlc2V0RmlsdGVyKGNvbHVtbk5hbWUsIGRyb3Bkb3duKSB7XG4gICAgdGhpcy50cmlnZ2VyRXZlbnQoeyBhY3Rpb246IFBYX0FDVElPTlMuUkVTRVRfRklMVEVSLCBjb2x1bW46IGNvbHVtbk5hbWUgfSk7XG4gICAgdGhpcy51cGRhdGVGaWx0ZXJpbmcoW2NvbHVtbk5hbWVdLCB7IHR5cGU6IEZpbHRlcmluZ0FjdGlvblR5cGUuUmVzZXRGaWx0ZXIgfSk7XG4gICAgZHJvcGRvd24uaGlkZSgpO1xuICAgIHRoaXMub25GaWx0ZXIuZW1pdCh7IGNvbHVtbk5hbWUsIGRyb3Bkb3duIH0pO1xuICB9XG5cbiAgY2xlYXJGaWx0ZXJzKHJlbG9hZCA9IHRydWUpIHtcbiAgICB0aGlzLnVwZGF0ZUZpbHRlcmluZyhcbiAgICAgIHRoaXMuY29sdW1ucy5tYXAoKHsgbmFtZSB9KSA9PiBuYW1lKSxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogRmlsdGVyaW5nQWN0aW9uVHlwZS5SZXNldEZpbHRlclxuICAgICAgfSxcbiAgICAgIHJlbG9hZFxuICAgICk7XG4gICAgdGhpcy5vbkZpbHRlci5lbWl0KHt9KTtcbiAgICB0aGlzLnRyaWdnZXJFdmVudCh7IGFjdGlvbjogUFhfQUNUSU9OUy5DTEVBUl9GSUxURVIgfSk7XG4gIH1cblxuICB1cGRhdGVGaWx0ZXJpbmcoXG4gICAgY29sdW1uTmFtZXM6IHN0cmluZ1tdLFxuICAgIGFjdGlvbjoge1xuICAgICAgdHlwZTogRmlsdGVyaW5nQWN0aW9uVHlwZTtcbiAgICAgIHBheWxvYWQ/OiB7IGZpbHRlcmluZ01vZGlmaWVyOiBGaWx0ZXJpbmdNb2RpZmllciB9O1xuICAgIH0sXG4gICAgcmVsb2FkID0gdHJ1ZVxuICApIHtcbiAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmNvbHVtbnMubWFwKGNvbHVtbiA9PiB7XG4gICAgICBpZiAoY29sdW1uTmFtZXMuaW5jbHVkZXMoY29sdW1uLm5hbWUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uY29sdW1uLFxuICAgICAgICAgIC4uLihhY3Rpb24udHlwZSA9PT0gRmlsdGVyaW5nQWN0aW9uVHlwZS5BcHBseUZpbHRlclxuICAgICAgICAgICAgPyBhY3Rpb24ucGF5bG9hZC5maWx0ZXJpbmdNb2RpZmllclxuICAgICAgICAgICAgOiB0aGlzLm9uUmVzZXRGaWx0ZXJBY3Rpb24oY29sdW1uKSlcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb2x1bW47XG4gICAgfSk7XG5cbiAgICB0aGlzLnVwZGF0ZUZpbHRlcmluZ0FwcGxpZWQoKTtcblxuICAgIGlmIChyZWxvYWQpIHtcbiAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlRmlsdGVyaW5nQXBwbGllZCgpIHtcbiAgICB0aGlzLmNvbHVtbnNXaXRoRmlsdGVyc0FwcGxpZWQgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKHRoaXMuaXNDb2x1bW5GaWx0ZXJpbmdBcHBsaWVkKTtcbiAgICB0aGlzLmZpbHRlcmluZ0FwcGxpZWQgPSB0aGlzLmNvbHVtbnNXaXRoRmlsdGVyc0FwcGxpZWQubGVuZ3RoID4gMDtcblxuICAgIHRoaXMuZmlsdGVyc0hlbHBQb3BvdmVySHRtbCA9IHRoaXMuZmlsdGVyaW5nQXBwbGllZFxuICAgICAgPyBnZXR0ZXh0KFxuICAgICAgICAgICdDbGljayB0aGUgY29sdW1uIGhlYWRlcnMgdG8gYXBwbHkgZmlsdGVycy4gQ2xpY2sgPGI+QWN0aXZlIGZpbHRlcnM8L2I+IGJ1dHRvbiB0byBtYW5hZ2UgYXBwbGllZCBmaWx0ZXJzLidcbiAgICAgICAgKVxuICAgICAgOiBnZXR0ZXh0KCdDbGljayB0aGUgY29sdW1uIGhlYWRlcnMgdG8gYXBwbHkgZmlsdGVycy4nKTtcbiAgfVxuXG4gIGlzQ29sdW1uRmlsdGVyaW5nQXBwbGllZChjb2x1bW46IENvbHVtbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHsgZmlsdGVyYWJsZSwgZmlsdGVyUHJlZGljYXRlLCBleHRlcm5hbEZpbHRlclF1ZXJ5IH0gPSBjb2x1bW47XG5cbiAgICByZXR1cm4gISEoZmlsdGVyYWJsZSAmJiAoZmlsdGVyUHJlZGljYXRlIHx8IGV4dGVybmFsRmlsdGVyUXVlcnkpKTtcbiAgfVxuXG4gIHVwZGF0ZVBhZ2luYXRpb24oeyBpdGVtc1BlclBhZ2UsIHBhZ2UgfSkge1xuICAgIGNvbnN0IGNvbmZpZ0NoYW5nZWQgPSB0aGlzLnBhZ2luYXRpb24/LnBhZ2VTaXplICE9PSBpdGVtc1BlclBhZ2U7XG4gICAgdGhpcy5wYWdpbmF0aW9uID0geyAuLi50aGlzLnBhZ2luYXRpb24sIHBhZ2VTaXplOiBpdGVtc1BlclBhZ2UsIGN1cnJlbnRQYWdlOiBwYWdlIH07XG4gICAgdGhpcy5sb2FkRGF0YSgpO1xuICAgIGlmIChjb25maWdDaGFuZ2VkKSB7XG4gICAgICB0aGlzLmVtaXRDb25maWdDaGFuZ2UoJ3BhZ2luYXRpb24nKTtcbiAgICB9XG4gICAgdGhpcy50cmlnZ2VyRXZlbnQoeyBhY3Rpb246IFBYX0FDVElPTlMuQ0hBTkdFX1BBR0lOQVRJT04sIGl0ZW1zUGVyUGFnZSwgcGFnZSB9KTtcbiAgfVxuXG4gIGNsaWNrUmVsb2FkKCkge1xuICAgIHRoaXMuc2VhcmNoVGV4dCA9ICcnO1xuICAgIHRoaXMucmVsb2FkKCk7XG4gICAgdGhpcy5vblJlbG9hZC5uZXh0KCk7XG4gICAgdGhpcy50cmlnZ2VyRXZlbnQoeyBhY3Rpb246IFBYX0FDVElPTlMuUkVMT0FEIH0pO1xuICB9XG5cbiAgcmVsb2FkKHJlZGlyZWN0ID0gdHJ1ZSkge1xuICAgIHRoaXMucGFnaW5hdGlvbiA9IHtcbiAgICAgIC4uLnRoaXMucGFnaW5hdGlvbixcbiAgICAgIGN1cnJlbnRQYWdlOiByZWRpcmVjdCA/IDEgOiB0aGlzLnBhZ2luYXRpb24uY3VycmVudFBhZ2VcbiAgICB9O1xuICAgIHRoaXMucmVjcmVhdGVMb2FkTW9yZUNvbXBvbmVudCA9IHRydWU7XG4gICAgdGhpcy5sb2FkRGF0YSh0cnVlKTtcbiAgICB0aGlzLnNjcm9sbFRvVG9wKCk7XG4gIH1cblxuICBsb2FkTmV4dFBhZ2UoKTogUHJvbWlzZTxJUmVzdWx0TGlzdDxvYmplY3Q+PiB7XG4gICAgdGhpcy5wYWdpbmF0aW9uID0geyAuLi50aGlzLnBhZ2luYXRpb24sIGN1cnJlbnRQYWdlOiB0aGlzLnBhZ2luYXRpb24ubmV4dFBhZ2UgfTtcblxuICAgIHRoaXMubG9hZERhdGEoKTtcblxuICAgIHJldHVybiB0aGlzLmRhdGFTb3VyY2UucmVzdWx0TGlzdCRcbiAgICAgIC5waXBlKHRha2UoMSkpIC8vIGluIG9yZGVyIGZvciBgdG9Qcm9taXNlYCB0byB3b3JrLCB0aGUgb2JzZXJ2YWJsZSBuZWVkcyB0byBjb21wbGV0ZVxuICAgICAgLnRvUHJvbWlzZSgpXG4gICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgICBwYWdpbmc6IHtcbiAgICAgICAgICAgIC4uLnJlc3VsdC5wYWdpbmcsXG4gICAgICAgICAgICBuZXh0OiB0aGlzLmxvYWROZXh0UGFnZS5iaW5kKHRoaXMpXG4gICAgICAgICAgfVxuICAgICAgICB9IGFzIElSZXN1bHRMaXN0PG9iamVjdD47XG4gICAgICB9KTtcbiAgfVxuXG4gIGdldENlbGxSZW5kZXJlclNwZWMoeyB2YWx1ZSwgcm93LCBjb2x1bW5OYW1lIH0pOiBDZWxsUmVuZGVyZXJTcGVjIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0Q2VsbFJlbmRlcmVyU3BlYyh7IHR5cGU6ICdDRUxMJywgdmFsdWUsIHJvdywgY29sdW1uTmFtZSB9KTtcbiAgfVxuXG4gIGdldEhlYWRlckNlbGxSZW5kZXJlclNwZWMoeyB2YWx1ZSwgY29sdW1uTmFtZSB9KTogQ2VsbFJlbmRlcmVyU3BlYyB7XG4gICAgcmV0dXJuIHRoaXMuX2dldENlbGxSZW5kZXJlclNwZWMoeyB0eXBlOiAnSEVBREVSJywgdmFsdWUsIHJvdzogdW5kZWZpbmVkLCBjb2x1bW5OYW1lIH0pO1xuICB9XG5cbiAgZ2V0RmlsdGVyaW5nRm9ybVJlbmRlcmVyU3BlYyh7IGNvbHVtbiwgZHJvcGRvd24gfSk6IEZpbHRlcmluZ0Zvcm1SZW5kZXJlclNwZWMge1xuICAgIHJldHVybiB7XG4gICAgICByZW5kZXJlcjpcbiAgICAgICAgZ2V0KHRoaXMuZ2V0Q29sdW1uUmVuZGVyZXIoY29sdW1uKSwgJ2ZpbHRlcmluZ0Zvcm1SZW5kZXJlckRlZi50ZW1wbGF0ZScpIHx8XG4gICAgICAgIGNvbHVtbi5maWx0ZXJpbmdGb3JtUmVuZGVyZXJDb21wb25lbnQsXG4gICAgICBjb250ZXh0OiB7XG4gICAgICAgIHByb3BlcnR5OiBjb2x1bW4sXG4gICAgICAgIGFwcGx5RmlsdGVyOiB0aGlzLmFwcGx5RmlsdGVyLmJpbmQodGhpcywgY29sdW1uLm5hbWUsIGRyb3Bkb3duKSxcbiAgICAgICAgcmVzZXRGaWx0ZXI6IHRoaXMucmVzZXRGaWx0ZXIuYmluZCh0aGlzLCBjb2x1bW4ubmFtZSwgZHJvcGRvd24pXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHNldEFsbEl0ZW1zU2VsZWN0ZWQoc2VsZWN0ZWQpIHtcbiAgICB0aGlzLmRhdGFTb3VyY2Uuc2VsZWN0aW9uJFxuICAgICAgLnBpcGUoZmlyc3QoKSlcbiAgICAgIC5zdWJzY3JpYmUoKHsgZmlsdGVyZWREYXRhSWRzIH0pID0+IHRoaXMuc2V0SXRlbXNTZWxlY3RlZChmaWx0ZXJlZERhdGFJZHMsIHNlbGVjdGVkKSk7XG4gIH1cblxuICBzZXRBbGxJdGVtc0luQ3VycmVudFBhZ2VTZWxlY3RlZChzZWxlY3RlZCkge1xuICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhJC5waXBlKGZpcnN0KCkpLnN1YnNjcmliZShkYXRhID0+IHRoaXMuc2V0SXRlbXNTZWxlY3RlZChkYXRhLCBzZWxlY3RlZCkpO1xuICB9XG5cbiAgc2V0SXRlbXNTZWxlY3RlZChpdGVtczogYW55LCBzZWxlY3RlZCkge1xuICAgIGNvbnN0IGl0ZW1JZHMgPSBpdGVtcy5tYXAoKGl0ZW06IG9iamVjdCB8IHN0cmluZykgPT5cbiAgICAgIHR5cGVvZiBpdGVtID09PSAnb2JqZWN0JyA/IGl0ZW1bdGhpcy5zZWxlY3Rpb25QcmltYXJ5S2V5XSA6IGl0ZW1cbiAgICApO1xuXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1JZHMgPSBzZWxlY3RlZFxuICAgICAgPyB1bmlvbih0aGlzLnNlbGVjdGVkSXRlbUlkcywgaXRlbUlkcylcbiAgICAgIDogd2l0aG91dCh0aGlzLnNlbGVjdGVkSXRlbUlkcywgLi4uaXRlbUlkcyk7XG4gICAgdGhpcy5pdGVtc1NlbGVjdC5lbWl0KHRoaXMuc2VsZWN0ZWRJdGVtSWRzKTtcbiAgfVxuXG4gIGNoYW5nZVNlbGVjdGVkSXRlbShpdGVtOiBhbnkpIHtcbiAgICB0aGlzLnNlbGVjdGVkSXRlbUlkcyA9IFtpdGVtW3RoaXMuc2VsZWN0aW9uUHJpbWFyeUtleV1dO1xuICAgIHRoaXMuaXRlbXNTZWxlY3QuZW1pdCh0aGlzLnNlbGVjdGVkSXRlbUlkcyk7XG4gIH1cblxuICBjYW5jZWwoKSB7XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1JZHMgPSBbXTtcbiAgICB0aGlzLml0ZW1zU2VsZWN0LmVtaXQodGhpcy5zZWxlY3RlZEl0ZW1JZHMpO1xuICB9XG5cbiAgaXNJdGVtU2VsZWN0ZWQoaXRlbSkge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSXRlbUlkcy5pbmNsdWRlcyhpdGVtW3RoaXMuc2VsZWN0aW9uUHJpbWFyeUtleV0pO1xuICB9XG5cbiAgb25Db2x1bW5Ecm9wKHsgcHJldmlvdXNJbmRleCwgY3VycmVudEluZGV4IH0pIHtcbiAgICBjb25zdCBkaWZmZXJlbnRJbmRleCA9IHByZXZpb3VzSW5kZXggIT09IGN1cnJlbnRJbmRleDtcblxuICAgIGlmIChkaWZmZXJlbnRJbmRleCkge1xuICAgICAgdGhpcy50cmlnZ2VyRXZlbnQoe1xuICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuUkVPUkRFUl9DT0xVTU5TLFxuICAgICAgICBjb2x1bW46IHRoaXMuY29sdW1uTmFtZXNbcHJldmlvdXNJbmRleF1cbiAgICAgIH0pO1xuICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5zLnNwbGljZShwcmV2aW91c0luZGV4LCAxKTtcbiAgICAgIHRoaXMuY29sdW1ucy5zcGxpY2UoY3VycmVudEluZGV4LCAwLCBjb2x1bW5bMF0pO1xuICAgICAgdGhpcy5lbWl0Q29uZmlnQ2hhbmdlKCdyZW9yZGVyQ29sdW1uJyk7XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVDb2x1bW5OYW1lcygpO1xuICAgIHRoaXMudXBkYXRlR3JpZENvbHVtbnNTaXplKCk7XG4gIH1cblxuICB1cGRhdGVHcmlkQ29sdW1uc1NpemUoKSB7XG4gICAgdGhpcy5zdHlsZXMgPSB7XG4gICAgICAuLi50aGlzLnN0eWxlcyxcbiAgICAgIGdyaWRUZW1wbGF0ZUNvbHVtbnM6IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RTdHlsZShcbiAgICAgICAgdGhpcy5jb2x1bW5zXG4gICAgICAgICAgLmZpbHRlcihjb2x1bW4gPT4gY29sdW1uLnZpc2libGUpXG4gICAgICAgICAgLm1hcCgoeyBncmlkVHJhY2tTaXplIH0pID0+IGdyaWRUcmFja1NpemUpXG4gICAgICAgICAgLmpvaW4oJyAnKVxuICAgICAgKSxcbiAgICAgIGdyaWRJbmZpbml0ZVNjcm9sbENvbHVtbjogdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFN0eWxlKGAxIC8gLTFgKVxuICAgIH07XG4gIH1cblxuICB1cGRhdGVUaEVscygpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudGhFbHMgPSB0aGlzLnRoUmVmc1xuICAgICAgICA/IHRoaXMudGhSZWZzLnRvQXJyYXkoKS5tYXAoKHsgbmF0aXZlRWxlbWVudCB9KSA9PiBuYXRpdmVFbGVtZW50KVxuICAgICAgICA6IFtdO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLy8gVG8gYmUgcmVtb3ZlZCB3aGVuIGNvbHVtbnMgYXJlIHRyYW5zZm9ybWVkIHRvIG9ic2VydmFibGVzLlxuICBpc0Ryb3BEb3duUGxhY2VkUmlnaHQoY29sdW1uOiBDb2x1bW4pIHtcbiAgICByZXR1cm4gKFxuICAgICAgaW5kZXhPZihcbiAgICAgICAgdGhpcy5jb2x1bW5zLmZpbHRlcihjID0+IGMudmlzaWJsZSksXG4gICAgICAgIGNvbHVtblxuICAgICAgKSA+XG4gICAgICB0aGlzLmNvbHVtbnMuZmlsdGVyKGMgPT4gYy52aXNpYmxlKS5sZW5ndGggLyAyXG4gICAgKTtcbiAgfVxuXG4gIGVtaXRDb25maWdDaGFuZ2UoZXZlbnRUeXBlPzogR3JpZEV2ZW50VHlwZSkge1xuICAgIGlmICh0aGlzLmNvbHVtbnNJbml0aWFsaXplZCkge1xuICAgICAgY29uc3QgY29sdW1ucyA9IHRoaXMuY29sdW1ucy5tYXAodGhpcy5tYXBDb2x1bW5Ub0NvbmZpZy5iaW5kKHRoaXMpKTtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHsgY29sdW1ucywgcGFnaW5hdGlvbjogdGhpcy5wYWdpbmF0aW9uIH07XG4gICAgICB0aGlzLm9uQ29uZmlnQ2hhbmdlLmVtaXQoY29uZmlnKTtcbiAgICAgIHN3aXRjaCAoZXZlbnRUeXBlKSB7XG4gICAgICAgIGNhc2UgJ3NvcnQnOlxuICAgICAgICAgIHRoaXMub25Tb3J0LmVtaXQoY29uZmlnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncGFnaW5hdGlvbic6XG4gICAgICAgICAgdGhpcy5vblBhZ2VTaXplQ2hhbmdlLmVtaXQoY29uZmlnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncmVvcmRlckNvbHVtbic6XG4gICAgICAgICAgdGhpcy5vbkNvbHVtblJlb3JkZXJlZC5lbWl0KGNvbmZpZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2NoYW5nZUNvbHVtblZpc2liaWxpdHknOlxuICAgICAgICAgIHRoaXMub25Db2x1bW5WaXNpYmlsaXR5Q2hhbmdlLmVtaXQoY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0cmlnZ2VyRXZlbnQoZXZlbnREYXRhKSB7XG4gICAgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLnRyaWdnZXJFdmVudCh0aGlzLnByb2R1Y3RFeHBlcmllbmNlRXZlbnQ/LmV2ZW50TmFtZSB8fCBQWF9FVkVOVF9OQU1FLCB7XG4gICAgICAuLi50aGlzLnByb2R1Y3RFeHBlcmllbmNlRXZlbnQ/LmRhdGEsXG4gICAgICAuLi5ldmVudERhdGFcbiAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZUNsaWNrKHJvdzogUm93KSB7XG4gICAgdGhpcy5sYXN0Q2xpY2tlZFJvdyA9IHJvdztcbiAgICB0aGlzLnJvd0NsaWNrLmVtaXQocm93KTtcbiAgfVxuXG4gIHBlcmZvcm1TZWFyY2goc2VhcmNoVGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hUZXh0ID0gc2VhcmNoVGV4dDtcbiAgICB0aGlzLm1hbnVhbFNlYXJjaCQubmV4dChzZWFyY2hUZXh0KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBTZWFyY2hPYnNlcnZhYmxlcygpOiB2b2lkIHtcbiAgICBjb25zdCBhdXRvU2VhcmNoJCA9IHRoaXMuc2VhcmNoVGV4dCQucGlwZShcbiAgICAgIGRlYm91bmNlVGltZSh0aGlzLlNFQVJDSF9ERUJPVU5DRV9USU1FKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICBmaWx0ZXIodmFsdWUgPT4gdmFsdWUgIT09IHRoaXMubGFzdE1hbnVhbFNlYXJjaFZhbHVlKSxcbiAgICAgIHRhcCh2YWx1ZSA9PiB7XG4gICAgICAgIHRoaXMubGFzdE1hbnVhbFNlYXJjaFZhbHVlID0gdmFsdWU7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCBtYW51YWxTZWFyY2gkID0gdGhpcy5tYW51YWxTZWFyY2gkLnBpcGUoXG4gICAgICBmaWx0ZXIodmFsdWUgPT4gdmFsdWUudHJpbSgpICE9PSAnJyksXG4gICAgICB0YXAodmFsdWUgPT4ge1xuICAgICAgICB0aGlzLmxhc3RNYW51YWxTZWFyY2hWYWx1ZSA9IHZhbHVlO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgbWVyZ2UoYXV0b1NlYXJjaCQsIG1hbnVhbFNlYXJjaCQpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSxcbiAgICAgICAgdGFwKHNlYXJjaFRleHQgPT4ge1xuICAgICAgICAgIHRoaXMuc2VhcmNoVGV4dCA9IHNlYXJjaFRleHQ7XG4gICAgICAgICAgdGhpcy5vbkJlZm9yZVNlYXJjaC5lbWl0KHNlYXJjaFRleHQpO1xuICAgICAgICAgIHRoaXMudHJpZ2dlckV2ZW50KHtcbiAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5TRUFSQ0gsXG4gICAgICAgICAgICBzZWFyY2hJbnB1dDogc2VhcmNoVGV4dFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgb25SZXNldEZpbHRlckFjdGlvbihjb2x1bW46IENvbHVtbikge1xuICAgIHRoaXMub25Db2x1bW5GaWx0ZXJSZXNldC5lbWl0KGNvbHVtbik7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbHRlclByZWRpY2F0ZTogdW5kZWZpbmVkLFxuICAgICAgZXh0ZXJuYWxGaWx0ZXJRdWVyeTogdW5kZWZpbmVkXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgbWFwQ29sdW1uVG9Db25maWcoY29sdW1uOiBDb2x1bW4pOiBDb2x1bW5Db25maWcgfCBDdXN0b21Db2x1bW5Db25maWcge1xuICAgIGxldCBjb25maWc7XG4gICAgaWYgKGNvbHVtbi5jdXN0b20pIHtcbiAgICAgIGNvbnN0IHsgdmlzaWJsZSwgc29ydE9yZGVyLCBuYW1lLCBleHRlcm5hbEZpbHRlclF1ZXJ5LCBoZWFkZXIsIHBhdGggfSA9IGNvbHVtbjtcbiAgICAgIGNvbmZpZyA9IHtcbiAgICAgICAgdmlzaWJsZSxcbiAgICAgICAgc29ydE9yZGVyLFxuICAgICAgICBuYW1lLFxuICAgICAgICBmaWx0ZXI6IHsgZXh0ZXJuYWxGaWx0ZXJRdWVyeSB9LFxuICAgICAgICBoZWFkZXIsXG4gICAgICAgIHBhdGgsXG4gICAgICAgIGN1c3RvbTogdHJ1ZVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgeyB2aXNpYmxlLCBzb3J0T3JkZXIsIG5hbWUsIGV4dGVybmFsRmlsdGVyUXVlcnkgfSA9IGNvbHVtbjtcbiAgICAgIGNvbmZpZyA9IHsgdmlzaWJsZSwgc29ydE9yZGVyLCBuYW1lLCBmaWx0ZXI6IHsgZXh0ZXJuYWxGaWx0ZXJRdWVyeSB9IH07XG4gICAgfVxuXG4gICAgaWYgKGlzRW1wdHkoY29uZmlnPy5maWx0ZXI/LmV4dGVybmFsRmlsdGVyUXVlcnkpKSB7XG4gICAgICBkZWxldGUgY29uZmlnLmZpbHRlcjtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkRGF0YShyZWxvYWQgPSBmYWxzZSkge1xuICAgIGNvbnN0IHtcbiAgICAgIHJvd3MsXG4gICAgICBjb2x1bW5zLFxuICAgICAgcGFnaW5hdGlvbixcbiAgICAgIHNlYXJjaFRleHQsXG4gICAgICBzZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrLFxuICAgICAgc2VsZWN0YWJsZSxcbiAgICAgIHNlbGVjdGlvblByaW1hcnlLZXksXG4gICAgICBpbmZpbml0ZVNjcm9sbFxuICAgIH0gPSB0aGlzO1xuXG4gICAgdGhpcy5kYXRhU291cmNlLmxvYWREYXRhKHtcbiAgICAgIHJvd3MsXG4gICAgICBjb2x1bW5zLFxuICAgICAgcGFnaW5hdGlvbixcbiAgICAgIHNlYXJjaFRleHQsXG4gICAgICBzZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrLFxuICAgICAgc2VsZWN0YWJsZSxcbiAgICAgIHNlbGVjdGlvblByaW1hcnlLZXksXG4gICAgICBpbmZpbml0ZVNjcm9sbCxcbiAgICAgIHJlbG9hZFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb2x1bW5zKCkge1xuICAgIGNvbnN0IHNwZWNpYWxDb2x1bW4gPSB7XG4gICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICBwb3NpdGlvbkZpeGVkOiB0cnVlXG4gICAgfTtcbiAgICBjb25zdCBzZWxlY3Rpb25Db2x1bW4gPSB0aGlzLnNlbGVjdGFibGVcbiAgICAgID8ge1xuICAgICAgICAgIC4uLnNwZWNpYWxDb2x1bW4sXG4gICAgICAgICAgbmFtZTogdGhpcy5zaW5nbGVTZWxlY3Rpb24gPyBTcGVjaWFsQ29sdW1uTmFtZS5SYWRpb0J1dHRvbiA6IFNwZWNpYWxDb2x1bW5OYW1lLkNoZWNrYm94LFxuICAgICAgICAgIGdyaWRUcmFja1NpemU6ICczMnB4J1xuICAgICAgICB9XG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBhY3Rpb25zQ29sdW1uID1cbiAgICAgIHRoaXMuYWN0aW9uQ29udHJvbHM/Lmxlbmd0aCA+IDBcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5zcGVjaWFsQ29sdW1uLFxuICAgICAgICAgICAgbmFtZTogU3BlY2lhbENvbHVtbk5hbWUuQWN0aW9ucyxcbiAgICAgICAgICAgIGdyaWRUcmFja1NpemU6ICdtaW5tYXgoNDBweCwgYXV0byknXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGV4cGFuZGFibGVSb3dzQ29sdW1uID0gdGhpcy5leHBhbmRhYmxlUm93cyAhPT0gJ05PTkUnID8gbmV3IEV4cGFuZGFibGVSb3dDb2x1bW4oKSA6IG51bGw7XG4gICAgY29uc3QgY29sdW1ucyA9IFtleHBhbmRhYmxlUm93c0NvbHVtbiwgc2VsZWN0aW9uQ29sdW1uLCAuLi50aGlzLmNvbHVtbnMsIGFjdGlvbnNDb2x1bW5dXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAubWFwKHRoaXMud2l0aENvbHVtbkRlZmF1bHRzKTtcblxuICAgIHRoaXMuY29sdW1ucyA9IHVuaXFCeShjb2x1bW5zLCAnbmFtZScpO1xuICAgIHRoaXMudXBkYXRlQ29sdW1uTmFtZXMoKTtcbiAgICB0aGlzLnVwZGF0ZUdyaWRDb2x1bW5zU2l6ZSgpO1xuICAgIHRoaXMudXBkYXRlVGhFbHMoKTtcbiAgICB0aGlzLnVwZGF0ZUZpbHRlcmluZ0FwcGxpZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tJZkFueVZhbHVlc0V4aXN0KG9iaiwgcmVzdWx0cyA9IFtdKSB7XG4gICAgaWYgKG9iaiAmJiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICBPYmplY3QuZW50cmllcyhvYmopLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIG9ialtrZXldID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHRoaXMuY2hlY2tJZkFueVZhbHVlc0V4aXN0KG9ialtrZXldLCByZXN1bHRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHRzLnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cy5zb21lKHZhbCA9PiAhIXZhbCk7XG4gIH1cblxuICBwcml2YXRlIHdpdGhDb2x1bW5EZWZhdWx0cyhjb2x1bW4pOiBDb2x1bW4ge1xuICAgIGNvbnN0IGRhdGFUeXBlID0gY29sdW1uLmRhdGFUeXBlIHx8IENvbHVtbkRhdGFUeXBlLlRleHRTaG9ydDtcbiAgICBjb25zdCB7IGhlYWRlckNTU0NsYXNzTmFtZSwgY2VsbENTU0NsYXNzTmFtZSB9ID0gY29sdW1uO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICBwb3NpdGlvbkZpeGVkOiBmYWxzZSxcbiAgICAgIHJlc2l6YWJsZTogdHJ1ZSxcbiAgICAgIHNvcnRhYmxlOiB0cnVlLFxuICAgICAgc29ydE9yZGVyOiAnJyxcbiAgICAgIGZpbHRlcmFibGU6IGZhbHNlLFxuICAgICAgLi4uY29sdW1uLFxuICAgICAgZGF0YVR5cGUsXG4gICAgICBncmlkVHJhY2tTaXplOlxuICAgICAgICBjb2x1bW4uZ3JpZFRyYWNrU2l6ZSB8fFxuICAgICAgICBgbWlubWF4KCR7bWluQ29sdW1uR3JpZFRyYWNrU2l6ZX1weCwgJHtyYXRpb3NCeUNvbHVtblR5cGVzW2RhdGFUeXBlXX1mcilgLFxuICAgICAgaGVhZGVyQ1NTQ2xhc3NOYW1lOlxuICAgICAgICAodHlwZW9mIGhlYWRlckNTU0NsYXNzTmFtZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICA/IGhlYWRlckNTU0NsYXNzTmFtZS5zcGxpdCgnICcpXG4gICAgICAgICAgOiBoZWFkZXJDU1NDbGFzc05hbWUpIHx8IFtdLFxuICAgICAgY2VsbENTU0NsYXNzTmFtZTpcbiAgICAgICAgKHR5cGVvZiBjZWxsQ1NTQ2xhc3NOYW1lID09PSAnc3RyaW5nJyA/IGNlbGxDU1NDbGFzc05hbWUuc3BsaXQoJyAnKSA6IGNlbGxDU1NDbGFzc05hbWUpIHx8XG4gICAgICAgIFtdXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ29sdW1uTmFtZXMoKSB7XG4gICAgdGhpcy5jb2x1bW5OYW1lcyA9IHRoaXMuY29sdW1ucy5tYXAoKHsgbmFtZSB9KSA9PiBuYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBSZXNpemVIYW5kbGUoKSB7XG4gICAgY29uc3QgcmVzaXplSGFuZGxlRHJhZyQgPSB0aGlzLnJlc2l6ZUhhbmRsZU1vdXNlRG93biQucGlwZShcbiAgICAgIHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCksXG4gICAgICB0YXAoKCkgPT4gdGhpcy5jbGVhck1vdXNlSGlnaGxpZ2h0cygpKSxcbiAgICAgIG1lcmdlTWFwKCh7IGV2ZW50LCB0YXJnZXRDb2x1bW5OYW1lIH0pID0+IHtcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5jb2x1bW5zLm1hcChjb2x1bW4gPT4ge1xuICAgICAgICAgIGlmIChjb2x1bW4ubmFtZSA9PT0gdGFyZ2V0Q29sdW1uTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4uY29sdW1uLFxuICAgICAgICAgICAgICBoZWFkZXJDU1NDbGFzc05hbWU6IHVuaW9uKGNvbHVtbi5oZWFkZXJDU1NDbGFzc05hbWUsIFsnaGVhZGVyLS1iZWluZy1yZXNpemVkJ10pXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb2x1bW47XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuaGVhZGVyQmVpbmdSZXNpemVkID0ge1xuICAgICAgICAgIGNvbHVtbk5hbWU6IHRhcmdldENvbHVtbk5hbWUsXG4gICAgICAgICAgZWw6IChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpPy5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5zdHlsZXMgPSB7XG4gICAgICAgICAgLi4udGhpcy5zdHlsZXMsXG4gICAgICAgICAgdGFibGVDdXJzb3I6ICdjb2wtcmVzaXplJ1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB0aGlzLnJlc2l6ZUhhbmRsZUNvbnRhaW5lck1vdXNlTW92ZSQucGlwZShcbiAgICAgICAgICB0YXAoKCkgPT4gdGhpcy5jbGVhck1vdXNlSGlnaGxpZ2h0cygpKSxcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5yZXNpemVIYW5kbGVDb250YWluZXJNb3VzZVVwJClcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHJlc2l6ZUhhbmRsZURyYWckLnN1YnNjcmliZSgoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1ucy5tYXAoKGNvbHVtbiwgaSkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmhlYWRlckJlaW5nUmVzaXplZCAmJiBjb2x1bW4ubmFtZSA9PT0gdGhpcy5oZWFkZXJCZWluZ1Jlc2l6ZWQuY29sdW1uTmFtZSkge1xuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsQ29udGFpbmVyRGl2OiBIVE1MRGl2RWxlbWVudCA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgIC8vIFJlYWQgc2Nyb2xsQ29udGFpbmVyRWwncyBvZmZzZXQgbGVmdCByZWxhdGl2ZSB0byB0aGUgZG9jdW1lbnQuXG4gICAgICAgICAgICBjb25zdCBob3Jpem9udGFsT2Zmc2V0ID0gc2Nyb2xsQ29udGFpbmVyRGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG5cbiAgICAgICAgICAgIC8vIEFkanVzdCB3aXRoIHRoZSBzY3JvbGxDb250YWluZXJFbCBob3Jpem9udGFsIHNjcm9sbCBwb3NpdGlvbi5cbiAgICAgICAgICAgIGNvbnN0IGhvcml6b250YWxTY3JvbGxPZmZzZXQgPSBzY3JvbGxDb250YWluZXJEaXYuc2Nyb2xsTGVmdCAtIGhvcml6b250YWxPZmZzZXQ7XG5cbiAgICAgICAgICAgIC8vIFJlYWQgbGVmdCBvZmZzZXQgb2YgdGhlIHJlc2l6ZWQgaGVhZGVyLlxuICAgICAgICAgICAgY29uc3QgaGVhZGVyT2Zmc2V0TGVmdCA9IHRoaXMuaGVhZGVyQmVpbmdSZXNpemVkLmVsLm9mZnNldExlZnQgfHwgMDtcblxuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBkZXNpcmVkIHdpZHRoLlxuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSBob3Jpem9udGFsU2Nyb2xsT2Zmc2V0ICsgZXZlbnQuY2xpZW50WCAtIGhlYWRlck9mZnNldExlZnQ7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLmNvbHVtbixcbiAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBjb2x1bW4gb2JqZWN0IHdpdGggdGhlIG5ldyBzaXplIHZhbHVlLCBlbmZvcmNlIG91ciBtaW5pbXVtIHNpemUuXG4gICAgICAgICAgICAgIGdyaWRUcmFja1NpemU6IGAke01hdGgubWF4KG1pbkNvbHVtbkdyaWRUcmFja1NpemUsIHdpZHRoKX1weGBcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRm9yIHRoZSBvdGhlciBoZWFkZXJzIHdoaWNoIGRvbid0IGhhdmUgYSBzZXQgd2lkdGgsIGZpeCBpdCB0byB0aGVpciBjb21wdXRlZCB3aWR0aC5cbiAgICAgICAgICBpZiAoY29sdW1uLmdyaWRUcmFja1NpemUuc3RhcnRzV2l0aCgnbWlubWF4JykpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLmNvbHVtbixcbiAgICAgICAgICAgICAgLy8gaXNuJ3QgZml4ZWQgeWV0IChpdCB3b3VsZCBiZSBhIHB4IHZhbHVlKVxuICAgICAgICAgICAgICBncmlkVHJhY2tTaXplOiBgJHtfcGFyc2VJbnQodGhpcy50aEVsc1tpXS5jbGllbnRXaWR0aCl9cHhgXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb2x1bW47XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qXG4gICAgICAgICAqIFVwZGF0ZSB0aGUgY29sdW1uIHNpemVzLlxuICAgICAgICAgKiBOb3RlOiBncmlkLXRlbXBsYXRlLWNvbHVtbnMgc2V0cyB0aGUgd2lkdGggZm9yIGFsbCBjb2x1bW5zIGluIG9uZSB2YWx1ZS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudXBkYXRlR3JpZENvbHVtbnNTaXplKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMucmVzaXplSGFuZGxlQ29udGFpbmVyTW91c2VVcCQucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaGVhZGVyQmVpbmdSZXNpemVkKSB7XG4gICAgICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1ucy5tYXAoY29sdW1uID0+IHtcbiAgICAgICAgICBpZiAoY29sdW1uLm5hbWUgPT09IHRoaXMuaGVhZGVyQmVpbmdSZXNpemVkLmNvbHVtbk5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLmNvbHVtbixcbiAgICAgICAgICAgICAgaGVhZGVyQ1NTQ2xhc3NOYW1lOiB3aXRob3V0KGNvbHVtbi5oZWFkZXJDU1NDbGFzc05hbWUsICdoZWFkZXItLWJlaW5nLXJlc2l6ZWQnKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY29sdW1uO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5oZWFkZXJCZWluZ1Jlc2l6ZWQgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgdGhpcy5zdHlsZXMgPSB7XG4gICAgICAgICAgLi4udGhpcy5zdHlsZXMsXG4gICAgICAgICAgdGFibGVDdXJzb3I6ICdhdXRvJ1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhck1vdXNlSGlnaGxpZ2h0cygpIHtcbiAgICBpZiAod2luZG93LmdldFNlbGVjdGlvbikge1xuICAgICAgd2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2dldENlbGxSZW5kZXJlclNwZWMoeyB0eXBlLCB2YWx1ZSwgcm93LCBjb2x1bW5OYW1lIH0pOiBDZWxsUmVuZGVyZXJTcGVjIHtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZCgoeyBuYW1lIH0pID0+IG5hbWUgPT09IGNvbHVtbk5hbWUpO1xuICAgIGNvbnN0IGNvbHVtblJlbmRlcmVyID0gdGhpcy5nZXRDb2x1bW5SZW5kZXJlcihjb2x1bW4pO1xuICAgIGNvbnN0IHJlbmRlcmVyVGVtcGxhdGUgPSBnZXQoXG4gICAgICBjb2x1bW5SZW5kZXJlcixcbiAgICAgIGAke3R5cGUgPT09ICdIRUFERVInID8gJ2hlYWRlckNlbGxSZW5kZXJlckRlZicgOiAnY2VsbFJlbmRlcmVyRGVmJ30udGVtcGxhdGVgXG4gICAgKTtcblxuICAgIGNvbnN0IHsgY2VsbFJlbmRlcmVyQ29tcG9uZW50LCBoZWFkZXJDZWxsUmVuZGVyZXJDb21wb25lbnQgfSA9IGNvbHVtbjtcbiAgICBjb25zdCByZW5kZXJlckNvbXBvbmVudCA9XG4gICAgICB0eXBlID09PSAnSEVBREVSJyA/IGhlYWRlckNlbGxSZW5kZXJlckNvbXBvbmVudCA6IGNlbGxSZW5kZXJlckNvbXBvbmVudDtcblxuICAgIHJldHVybiB7XG4gICAgICByZW5kZXJlcjogcmVuZGVyZXJUZW1wbGF0ZSB8fCByZW5kZXJlckNvbXBvbmVudCxcbiAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGl0ZW06IHJvdyxcbiAgICAgICAgcHJvcGVydHk6IGNvbHVtblxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldENvbHVtblJlbmRlcmVyKGNvbHVtbik6IENvbHVtbkRpcmVjdGl2ZSB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1uUmVuZGVyZXJzLnRvQXJyYXkoKS5maW5kKCh7IG5hbWUgfSkgPT4gbmFtZSA9PT0gY29sdW1uLm5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVGaWx0ZXJpbmdMYWJlbHNQYXJhbXMoc3RhdHM6IERhdGFTb3VyY2VTdGF0cykge1xuICAgIHRoaXMuZmlsdGVyaW5nTGFiZWxzUGFyYW1zID0ge1xuICAgICAgZmlsdGVyZWRJdGVtc0NvdW50OiBzdGF0cy5maWx0ZXJlZFNpemUsXG4gICAgICBhbGxJdGVtc0NvdW50OiBzdGF0cy5zaXplXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUGFnaW5hdGlvbkxhYmVsUGFyYW1zKHN0YXRzOiBEYXRhU291cmNlU3RhdHMpIHtcbiAgICBpZiAoc3RhdHMubmV4dFBhZ2UpIHtcbiAgICAgIHRoaXMucGFnaW5hdGlvbiA9IHsgLi4udGhpcy5wYWdpbmF0aW9uLCBuZXh0UGFnZTogc3RhdHMubmV4dFBhZ2UgfTtcbiAgICB9XG5cbiAgICBjb25zdCBwYWdlRmlyc3RJdGVtSWR4ID0gKHN0YXRzLmN1cnJlbnRQYWdlIC0gMSkgKiBzdGF0cy5maXJzdFBhZ2VTaXplICsgMTtcbiAgICB0aGlzLnBhZ2luYXRpb25MYWJlbFBhcmFtcyA9IHtcbiAgICAgIHBhZ2VGaXJzdEl0ZW1JZHgsXG4gICAgICBwYWdlTGFzdEl0ZW1JZHg6IHBhZ2VGaXJzdEl0ZW1JZHggKyAoc3RhdHMuY3VycmVudFBhZ2VTaXplIC0gMSksXG4gICAgICBpdGVtc1RvdGFsOiBzdGF0cy5maWx0ZXJlZFNpemVcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVQYWdpbmF0aW9uV2hlbk5vRGV2aWNlc0xhc3RQYWdlKHN0YXRzOiBEYXRhU291cmNlU3RhdHMpIHtcbiAgICBpZiAoIXN0YXRzLm5leHRQYWdlICYmIHN0YXRzLmN1cnJlbnRQYWdlU2l6ZSA9PT0gMCAmJiBzdGF0cy5zaXplID4gMCkge1xuICAgICAgdGhpcy5wYWdpbmF0aW9uID0ge1xuICAgICAgICAuLi50aGlzLnBhZ2luYXRpb24sXG4gICAgICAgIGN1cnJlbnRQYWdlOiB0aGlzLnBhZ2luYXRpb24uY3VycmVudFBhZ2UgLSAxLFxuICAgICAgICBuZXh0UGFnZTogbnVsbFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUxvYWRNb3JlQ29tcG9uZW50KHN0YXRzOiBEYXRhU291cmNlU3RhdHMpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmluZmluaXRlU2Nyb2xsICYmXG4gICAgICBzdGF0cyAmJlxuICAgICAgc3RhdHMubmV4dFBhZ2UgJiZcbiAgICAgICghdGhpcy5sb2FkTW9yZUNvbXBvbmVudCB8fCB0aGlzLnJlY3JlYXRlTG9hZE1vcmVDb21wb25lbnQpXG4gICAgKSB7XG4gICAgICB0aGlzLnJlY3JlYXRlTG9hZE1vcmVDb21wb25lbnQgPSBmYWxzZTtcbiAgICAgIHRoaXMuaW5maW5pdGVTY3JvbGxDb250YWluZXIuY2xlYXIoKTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMuaW5maW5pdGVTY3JvbGxDb250YWluZXIuY3JlYXRlQ29tcG9uZW50KExvYWRNb3JlQ29tcG9uZW50KTtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gY29tcG9uZW50UmVmLmluc3RhbmNlIGFzIExvYWRNb3JlQ29tcG9uZW50O1xuICAgICAgaW5zdGFuY2UudXNlSW50ZXJzZWN0aW9uID0gdGhpcy5pbmZpbml0ZVNjcm9sbCA9PT0gJ2F1dG8nIHx8IHRoaXMuaW5maW5pdGVTY3JvbGwgPT09ICdoaWRkZW4nO1xuICAgICAgaW5zdGFuY2UuaGlkZGVuID0gdGhpcy5pbmZpbml0ZVNjcm9sbCA9PT0gJ2hpZGRlbic7XG4gICAgICBpbnN0YW5jZS5wYWdpbmcgPSB7XG4gICAgICAgIG5leHRQYWdlOiBzdGF0cy5uZXh0UGFnZSxcbiAgICAgICAgbmV4dDogdGhpcy5sb2FkTmV4dFBhZ2UuYmluZCh0aGlzKVxuICAgICAgfSBhcyBQYWdpbmc8SUlkZW50aWZpZWQ+O1xuICAgICAgaW5zdGFuY2UubG9hZE5leHRMYWJlbCA9IHRoaXMubG9hZE1vcmVJdGVtc0xhYmVsO1xuICAgICAgaW5zdGFuY2UubG9hZGluZ0xhYmVsID0gdGhpcy5sb2FkaW5nSXRlbXNMYWJlbDtcbiAgICAgIHRoaXMubG9hZE1vcmVDb21wb25lbnQgPSBpbnN0YW5jZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubG9hZE1vcmVDb21wb25lbnQgJiYgIXN0YXRzLm5leHRQYWdlKSB7XG4gICAgICB0aGlzLmxvYWRNb3JlQ29tcG9uZW50LnBhZ2luZyA9IHtcbiAgICAgICAgbmV4dFBhZ2U6IG51bGxcbiAgICAgIH0gYXMgUGFnaW5nPElJZGVudGlmaWVkPjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNjcm9sbFRvVG9wKCkge1xuICAgIGlmICh0aGlzLmluZmluaXRlU2Nyb2xsKSB7XG4gICAgICB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IDA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzQW5kUGVyc2lzdENvbmZpZ0NoYW5nZSgpIHtcbiAgICBtZXJnZShcbiAgICAgIG1lcmdlKFxuICAgICAgICB0aGlzLm9uU29ydCxcbiAgICAgICAgdGhpcy5vblBhZ2VTaXplQ2hhbmdlLFxuICAgICAgICB0aGlzLm9uQ29sdW1uUmVvcmRlcmVkLFxuICAgICAgICB0aGlzLm9uQ29sdW1uVmlzaWJpbGl0eUNoYW5nZVxuICAgICAgKS5waXBlKG1hcChjb25maWcgPT4gY29uZmlnLmNvbHVtbnMpKSxcbiAgICAgIG1lcmdlKHRoaXMub25BZGRDdXN0b21Db2x1bW4sIHRoaXMub25SZW1vdmVDdXN0b21Db2x1bW4pLnBpcGUoXG4gICAgICAgIG1hcCgoKSA9PiAodGhpcy5jb2x1bW5zIHx8IFtdKS5tYXAodGhpcy5tYXBDb2x1bW5Ub0NvbmZpZy5iaW5kKHRoaXMpKSlcbiAgICAgICksXG4gICAgICB0aGlzLm9uRmlsdGVyLnBpcGUoXG4gICAgICAgIG1hcCgoeyBjb2x1bW5OYW1lLCBmaWx0ZXJpbmdNb2RpZmllciB9KSA9PlxuICAgICAgICAgIHRoaXMuY29sdW1ucy5tYXAodGhpcy5tYXBDb2x1bW5Ub0NvbmZpZy5iaW5kKHRoaXMpKS5tYXAoKGNvbHVtbjogQ29sdW1uQ29uZmlnKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNOaWwoY29sdW1uTmFtZSkpIHtcbiAgICAgICAgICAgICAgZGVsZXRlIGNvbHVtbi5maWx0ZXI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbHVtbi5uYW1lID09PSBjb2x1bW5OYW1lKSB7XG4gICAgICAgICAgICAgIGlmIChpc0VtcHR5KGZpbHRlcmluZ01vZGlmaWVyKSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBjb2x1bW4uZmlsdGVyO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbHVtbi5maWx0ZXIgPSBmaWx0ZXJpbmdNb2RpZmllcjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gY29sdW1uO1xuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChjb2x1bW5zOiBBcnJheTxDb2x1bW5Db25maWcgfCBDdXN0b21Db2x1bW5Db25maWc+KSA9PiAoe1xuICAgICAgICAgIGNvbHVtbnMsXG4gICAgICAgICAgcGFnaW5hdGlvbjogeyBwYWdlU2l6ZTogdGhpcy5wYWdpbmF0aW9uLnBhZ2VTaXplIH1cbiAgICAgICAgfSkpLFxuICAgICAgICBmaWx0ZXIoKCkgPT4gISF0aGlzLmNvbmZpZ3VyYXRpb25TdHJhdGVneSksXG4gICAgICAgIHRoaXMudHJpbUZpbHRlckNvbmZpZ1BpcGUoKSxcbiAgICAgICAgdGhpcy50cmltU29ydENvbmZpZ1BpcGUoKSxcbiAgICAgICAgdGhpcy50cmltQ3VzdG9tQ29sdW1uQ29uZmlnUGlwZSgpLFxuICAgICAgICB0aGlzLmlnbm9yZUNvbHVtbk9yZGVyUGlwZSgpLFxuICAgICAgICB0aGlzLmlnbm9yZUNvbHVtblZpc2liaWxpdHlQaXBlKCksXG4gICAgICAgIGNvbmNhdE1hcCgoY29uZmlnOiBHcmlkQ29uZmlnKSA9PiB0aGlzLmNvbmZpZ3VyYXRpb25TdHJhdGVneS5zYXZlQ29uZmlnJChjb25maWcpKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSB0cmltRmlsdGVyQ29uZmlnUGlwZSgpOiBVbmFyeUZ1bmN0aW9uPE9ic2VydmFibGU8R3JpZENvbmZpZz4sIE9ic2VydmFibGU8R3JpZENvbmZpZz4+IHtcbiAgICByZXR1cm4gcGlwZShcbiAgICAgIHRoaXMuY2hlY2tFdmVudFBpcGUoJ2ZpbHRlcicsIGNvbmZpZyA9PiB7XG4gICAgICAgIGNvbmZpZy5jb2x1bW5zID0gKGNvbmZpZy5jb2x1bW5zIHx8IFtdKS5tYXAoY29sID0+IHtcbiAgICAgICAgICBkZWxldGUgY29sLmZpbHRlcjtcbiAgICAgICAgICByZXR1cm4gY29sO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSB0cmltU29ydENvbmZpZ1BpcGUoKTogVW5hcnlGdW5jdGlvbjxPYnNlcnZhYmxlPEdyaWRDb25maWc+LCBPYnNlcnZhYmxlPEdyaWRDb25maWc+PiB7XG4gICAgcmV0dXJuIHBpcGUoXG4gICAgICB0aGlzLmNoZWNrRXZlbnRQaXBlKCdzb3J0JywgY29uZmlnID0+IHtcbiAgICAgICAgY29uZmlnLmNvbHVtbnMgPSAoY29uZmlnLmNvbHVtbnMgfHwgW10pLm1hcChjb2wgPT4ge1xuICAgICAgICAgIGNvbC5zb3J0T3JkZXIgPSAnJztcbiAgICAgICAgICByZXR1cm4gY29sO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSB0cmltQ3VzdG9tQ29sdW1uQ29uZmlnUGlwZSgpOiBVbmFyeUZ1bmN0aW9uPFxuICAgIE9ic2VydmFibGU8R3JpZENvbmZpZz4sXG4gICAgT2JzZXJ2YWJsZTxHcmlkQ29uZmlnPlxuICA+IHtcbiAgICByZXR1cm4gcGlwZShcbiAgICAgIHRoaXMuY2hlY2tFdmVudFBpcGUoJ2N1c3RvbUNvbHVtbnMnLCBjb25maWcgPT4ge1xuICAgICAgICBjb25maWcuY29sdW1ucyA9IChjb25maWcuY29sdW1ucyB8fCBbXSkuZmlsdGVyKChjb2w6IEN1c3RvbUNvbHVtbkNvbmZpZykgPT4gIWNvbC5jdXN0b20pO1xuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGlnbm9yZUNvbHVtbk9yZGVyUGlwZSgpOiBVbmFyeUZ1bmN0aW9uPE9ic2VydmFibGU8R3JpZENvbmZpZz4sIE9ic2VydmFibGU8R3JpZENvbmZpZz4+IHtcbiAgICByZXR1cm4gcGlwZShcbiAgICAgIHRoaXMuY2hlY2tFdmVudFBpcGUoJ29yZGVyJywgY29uZmlnID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5LmdldENvbmZpZyQoKS5waXBlKFxuICAgICAgICAgIG1hcChvbGRDb25maWcgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb2xkQ29sdW1uczogQ29sdW1uQ29uZmlnW10gPVxuICAgICAgICAgICAgICBvbGRDb25maWc/LmNvbHVtbnMgfHwgKHRoaXMuZGVmYXVsdENvbHVtbnMgYXMgQ29sdW1uQ29uZmlnW10pO1xuICAgICAgICAgICAgLy8gY2hlY2sgaWYgY3VzdG9tIGNvbHVtbnMgaGF2ZSBiZWVuIGFkZGVkXG4gICAgICAgICAgICBjb25zdCBjb2x1bW5zQWRkZWQgPSAoY29uZmlnLmNvbHVtbnMgfHwgW10pLmZpbHRlcihcbiAgICAgICAgICAgICAgY29sID0+ICFvbGRDb2x1bW5zLmZpbmQob2xkID0+IG9sZC5uYW1lID09PSBjb2wubmFtZSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbmZpZy5jb2x1bW5zID0gW1xuICAgICAgICAgICAgICAuLi5vbGRDb2x1bW5zLm1hcChvbGRDb2wgPT5cbiAgICAgICAgICAgICAgICAoY29uZmlnLmNvbHVtbnMgfHwgW10pLmZpbmQobmV3Q29sID0+IG5ld0NvbC5uYW1lID09PSBvbGRDb2wubmFtZSlcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgLi4uY29sdW1uc0FkZGVkXG4gICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGlnbm9yZUNvbHVtblZpc2liaWxpdHlQaXBlKCk6IFVuYXJ5RnVuY3Rpb248XG4gICAgT2JzZXJ2YWJsZTxHcmlkQ29uZmlnPixcbiAgICBPYnNlcnZhYmxlPEdyaWRDb25maWc+XG4gID4ge1xuICAgIHJldHVybiBwaXBlKFxuICAgICAgdGhpcy5jaGVja0V2ZW50UGlwZSgndmlzaWJpbGl0eScsIGNvbmZpZyA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZ3VyYXRpb25TdHJhdGVneS5nZXRDb25maWckKCkucGlwZShcbiAgICAgICAgICBtYXAob2xkQ29uZmlnID0+IHtcbiAgICAgICAgICAgIGNvbmZpZy5jb2x1bW5zID0gKGNvbmZpZy5jb2x1bW5zIHx8IFtdKS5tYXAobmV3Q29sID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgY29sdW1uczogQ29sdW1uQ29uZmlnW10gPVxuICAgICAgICAgICAgICAgIG9sZENvbmZpZz8uY29sdW1ucyB8fCAodGhpcy5kZWZhdWx0Q29sdW1ucyBhcyBDb2x1bW5Db25maWdbXSk7XG4gICAgICAgICAgICAgIGNvbnN0IG9sZENvbCA9IGNvbHVtbnMuZmluZCgoY29sOiBhbnkpID0+IG5ld0NvbC5uYW1lID09PSBjb2wubmFtZSk7XG4gICAgICAgICAgICAgIG5ld0NvbC52aXNpYmxlID0gb2xkQ29sPy52aXNpYmxlID8/IHRydWU7XG4gICAgICAgICAgICAgIHJldHVybiBuZXdDb2w7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0V2ZW50UGlwZShcbiAgICBjb25maWdQYXJ0OiBHcmlkQ29uZmlnUGFydCxcbiAgICB0cmltRXZlbnREYXRhRm46IChjb25maWc6IEdyaWRDb25maWcpID0+IEdyaWRDb25maWcgfCBPYnNlcnZhYmxlPEdyaWRDb25maWc+XG4gICk6IFVuYXJ5RnVuY3Rpb248T2JzZXJ2YWJsZTxHcmlkQ29uZmlnPiwgT2JzZXJ2YWJsZTxHcmlkQ29uZmlnPj4ge1xuICAgIHJldHVybiBwaXBlKFxuICAgICAgY29uY2F0TWFwKChjb25maWc6IEdyaWRDb25maWcpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZUNvbmZpZ0ZpbHRlclxuICAgICAgICAgIC5jYWxsKHRoaXMsIGNvbmZpZ1BhcnQpXG4gICAgICAgICAgLnBpcGUobWFwKGtlZXBFdmVudERhdGEgPT4gKHsgY29uZmlnLCBrZWVwRXZlbnREYXRhIH0pKSk7XG4gICAgICB9KSxcbiAgICAgIG1hcCgoeyBjb25maWcsIGtlZXBFdmVudERhdGEgfSkgPT5cbiAgICAgICAga2VlcEV2ZW50RGF0YSA/IGNvbmZpZyA6IHRyaW1FdmVudERhdGFGbi5jYWxsKHRoaXMsIGNvbmZpZylcbiAgICAgICksXG4gICAgICBjb25jYXRNYXAoY29uZmlnID0+IChpc09ic2VydmFibGUoY29uZmlnKSA/IGNvbmZpZyA6IG9mKGNvbmZpZykpIGFzIE9ic2VydmFibGU8R3JpZENvbmZpZz4pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZUNvbmZpZ0ZpbHRlcihjb25maWdQYXJ0OiBHcmlkQ29uZmlnUGFydCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gfCBPYnNlcnZhYmxlPGJvb2xlYW4+IHwgUHJvbWlzZTxib29sZWFuPjtcbiAgICBjb25zdCB2YWx1ZU9yRm4gPSB0aGlzLmNvbmZpZ3VyYXRpb25TdHJhdGVneS5nZXRDb250ZXh0KCk/LmNvbmZpZ0ZpbHRlcj8uW2NvbmZpZ1BhcnRdO1xuICAgIGlmICh0eXBlb2YgdmFsdWVPckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXN1bHQgPSB2YWx1ZU9yRm4oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gdmFsdWVPckZuO1xuICAgIH1cbiAgICByZXR1cm4gdG9PYnNlcnZhYmxlKHJlc3VsdCA/PyB0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgc2FmZWx5SW52b2tlTWF0Y2hlcihcbiAgICBtYXRjaGVzRm46IChcbiAgICAgIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgIGNvbnRleHQ/OiBHcmlkQ29uZmlnQ29udGV4dFxuICAgICkgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4gfCBPYnNlcnZhYmxlPGJvb2xlYW4+LFxuICAgIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBjb250ZXh0PzogR3JpZENvbmZpZ0NvbnRleHRcbiAgKSB7XG4gICAgaWYgKG1hdGNoZXNGbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1hdGNoZXNGbihyb3V0ZSwgY29udGV4dCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJ0YWJsZS1kYXRhLWdyaWQtc2Nyb2xsXCJcbiAgI3Njcm9sbFxuICBbbmdDbGFzc109XCJ7XG4gICAgJ3RhYmxlLWRhdGEtZ3JpZF9fb3ZlcmxheSc6IChkYXRhU291cmNlLmxvYWRpbmckIHwgYXN5bmMpICYmICFsb2FkTW9yZUNvbXBvbmVudD8uaXNMb2FkaW5nXG4gIH1cIlxuICBkYXRhLWN5PVwiYzh5LWRhdGEtZ3JpZC0tdGFibGUtZGF0YS1ncmlkLXNjcm9sbFwiXG4+XG4gIDxkaXZcbiAgICBjbGFzcz1cInRhYmxlLWRhdGEtZ3JpZF9fbG9hZGluZy0td3JhcHBlclwiXG4gICAgKm5nSWY9XCIoZGF0YVNvdXJjZS5sb2FkaW5nJCB8IGFzeW5jKSAmJiAhbG9hZE1vcmVDb21wb25lbnQ/LmlzTG9hZGluZ1wiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwidGFibGUtZGF0YS1ncmlkX19sb2FkaW5nLS1sb2FkZXJcIj5cbiAgICAgIDxjOHktbG9hZGluZ1xuICAgICAgICBsYXlvdXQ9XCJhcHBsaWNhdGlvblwiXG4gICAgICAgIFttZXNzYWdlXT1cImxvYWRpbmdJdGVtc0xhYmVsXCJcbiAgICAgID48L2M4eS1sb2FkaW5nPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2XG4gICAgY2xhc3M9XCJ0YWJsZS1kYXRhLWdyaWQtaGVhZGVyIHNlcGFyYXRvciBsYXJnZS1wYWRkaW5nXCJcbiAgICAqbmdJZj1cImRpc3BsYXlPcHRpb25zLmdyaWRIZWFkZXJcIlxuICA+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJoNFwiXG4gICAgICBbbmdDbGFzc109XCJ7ICdtLXItMTYnOiAhIXRpdGxlIH1cIlxuICAgID5cbiAgICAgIHt7IHRpdGxlIHwgdHJhbnNsYXRlIH19XG4gICAgPC9kaXY+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGlzcGxheU9wdGlvbnMuZmlsdGVyXCI+XG4gICAgICA8c3BhbiAqbmdJZj1cIiFmaWx0ZXJpbmdBcHBsaWVkXCI+XG4gICAgICAgIDxzbWFsbFxuICAgICAgICAgIGNsYXNzPVwibS1yLTRcIlxuICAgICAgICAgICpuZ0lmPVwiISFmaWx0ZXJpbmdMYWJlbHNQYXJhbXMuYWxsSXRlbXNDb3VudFwiXG4gICAgICAgICAgbmdOb25CaW5kYWJsZVxuICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgIFt0cmFuc2xhdGVQYXJhbXNdPVwiZmlsdGVyaW5nTGFiZWxzUGFyYW1zXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGZpbHRlcmVkSXRlbXNDb3VudCB9fSBvZiB7eyBhbGxJdGVtc0NvdW50IH19IGl0ZW1zXG4gICAgICAgIDwvc21hbGw+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgY2xhc3M9XCJsYWJlbCBsYWJlbC1kZWZhdWx0IG0tci00XCJcbiAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgPlxuICAgICAgICAgIE5vIGZpbHRlcnNcbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9zcGFuPlxuICAgICAgPHNwYW5cbiAgICAgICAgY2xhc3M9XCJkLWZsZXggYS1pLWNlbnRlclwiXG4gICAgICAgICpuZ0lmPVwiZmlsdGVyaW5nQXBwbGllZFwiXG4gICAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhIWZpbHRlcmluZ0xhYmVsc1BhcmFtcy5hbGxJdGVtc0NvdW50XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImEtaS1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmFkZ2UtaW5mbyBtLXItNFwiPlxuICAgICAgICAgICAgICB7eyAoZGF0YVNvdXJjZS5zdGF0cyQgfCBhc3luYykuZmlsdGVyZWRTaXplIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8c21hbGxcbiAgICAgICAgICAgICAgbmdOb25CaW5kYWJsZVxuICAgICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgW3RyYW5zbGF0ZVBhcmFtc109XCJmaWx0ZXJpbmdMYWJlbHNQYXJhbXNcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBvZiB7eyBhbGxJdGVtc0NvdW50IH19IGl0ZW1zXG4gICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd25cIlxuICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbSBsZWZ0XCJcbiAgICAgICAgICBkcm9wZG93blxuICAgICAgICAgICNkZEZpbHRlcnM9XCJicy1kcm9wZG93blwiXG4gICAgICAgICAgW2Nka1RyYXBGb2N1c109XCJkZEZpbHRlcnMuaXNPcGVuXCJcbiAgICAgICAgICBbaW5zaWRlQ2xpY2tdPVwidHJ1ZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBidG4tc20gbS1sLThcIlxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnQWN0aXZlIGZpbHRlcnMnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCJcbiAgICAgICAgICAgIGRyb3Bkb3duVG9nZ2xlXG4gICAgICAgICAgICBkYXRhLWN5PVwiYzh5LWRhdGEtZ3JpZC0tZmlsdGVyc1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgY2xhc3M9XCJtLXItNFwiXG4gICAgICAgICAgICAgIGM4eUljb249XCJmaWx0ZXJcIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgIDxzcGFuPnt7ICdBY3RpdmUgZmlsdGVycycgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGJhZGdlLXN5c3RlbVwiPlxuICAgICAgICAgICAgICB7eyBjb2x1bW5zV2l0aEZpbHRlcnNBcHBsaWVkLmxlbmd0aCB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1tZW51XCJcbiAgICAgICAgICAgICpkcm9wZG93bk1lbnVcbiAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRhLWdyaWRfX2Ryb3Bkb3duIGJnLWxldmVsLTBcIj5cbiAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC11bnN0eWxlZCBtLTBcIj5cbiAgICAgICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uc1dpdGhGaWx0ZXJzQXBwbGllZDsgbGV0IGxhc3QgPSBsYXN0XCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NlcGFyYXRvci1ib3R0b20nOiAhbGFzdCB9XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1oZWFkZXIgc3RpY2t5LXRvcCB0ZXh0LXRydW5jYXRlIG5vLWJvcmRlci10b3AgcC1iLTBcIlxuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgKGNvbHVtbi5oZWFkZXIgfCB0cmFuc2xhdGUpIHx8IGNvbHVtbi5uYW1lIH19XCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IChjb2x1bW4uaGVhZGVyIHwgdHJhbnNsYXRlKSB8fCBjb2x1bW4ubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYm9yZGVybGVzcyBkLWZsZXggZC1jb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGdyb3VwZWRGaWx0ZXJDaGlwcyBvZiBjb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfCBtYXBUb0ZpbHRlckNoaXBzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXN5bmNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfCBncm91cGVkRmlsdGVyQ2hpcHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmlyc3QgPSBmaXJzdFxuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAncC10LTAnOiBmaXJzdCB9XCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxwXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNtYWxsIHAtYi00XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ3JvdXBlZEZpbHRlckNoaXBzLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBncm91cGVkRmlsdGVyQ2hpcHMubGFiZWwgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhLWktY2VudGVyIGdhcC00IGZsZXgtd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0YWcgdGFnLS1pbmZvIGNoaXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY2hpcCBvZiBncm91cGVkRmlsdGVyQ2hpcHMuY2hpcHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXhzIGJ0bi1jbGVhbiB0ZXh0LTEwIG0tci00XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdSZW1vdmUgZmlsdGVyJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUZpbHRlcihjaGlwLnJlbW92ZSgpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLXJlbW92ZS1jaGlwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJ0aW1lc1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNoaXAuZGlzcGxheVZhbHVlIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBzZXBhcmF0b3ItdG9wIHN0aWNreS1ib3R0b21cIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tZGVmYXVsdFwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnQ2xlYXIgYWxsIGZpbHRlcnMnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJGaWx0ZXJzKClcIlxuICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJjOHktZGF0YS1ncmlkLS1jbGVhci1maWx0ZXJzXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7ICdDbGVhciBhbGwgZmlsdGVycycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3NwYW4+XG5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJidG4taGVscCBidG4taGVscC0tc20gaGlkZGVuLXhzIGhpZGRlbi1zbVwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0hlbHAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgW3BvcG92ZXJdPVwiZmlsdGVyc0hlbHBQb3BvdmVyXCJcbiAgICAgICAgcGxhY2VtZW50PVwicmlnaHRcIlxuICAgICAgICB0cmlnZ2Vycz1cImZvY3VzXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICpuZ0lmPVwiZGlzcGxheU9wdGlvbnMuZmlsdGVyXCJcbiAgICAgICAgZGF0YS1jeT1cImRhdGEtZ3JpZC0taGVscC1maWx0ZXJzXCJcbiAgICAgID5cbiAgICAgICAgPGkgYzh5SWNvbj1cInF1ZXN0aW9uLWNpcmNsZS1vXCI+PC9pPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8bmctdGVtcGxhdGUgI2ZpbHRlcnNIZWxwUG9wb3Zlcj5cbiAgICAgICAgPGRpdiBbaW5uZXJIdG1sXT1cImZpbHRlcnNIZWxwUG9wb3Zlckh0bWwgfCB0cmFuc2xhdGVcIj48L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJidG4tY2xlYW4gdGV4dC1wcmltYXJ5IGhpZGRlbi14cyBoaWRkZW4tc21cIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidIZWxwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIHBvcG92ZXI9XCJ7eyAnVGhlIGNvdW50ZXIgZm9yIHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgbWlnaHQgYmUgaW5hY2N1cmF0ZS4nIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgcGxhY2VtZW50PVwicmlnaHRcIlxuICAgICAgICB0cmlnZ2Vycz1cImZvY3VzXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICpuZ0lmPVwic2hvd0NvdW50ZXJXYXJuaW5nXCJcbiAgICAgID5cbiAgICAgICAgPGkgYzh5SWNvbj1cIndhcm5pbmdcIj48L2k+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxkaXYgY2xhc3M9XCJtLWwtYXV0b1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImJ0bmJhciBkLWZsZXggYS1pLWNlbnRlclwiPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGhlYWRlckFjdGlvbkNvbnRyb2wgb2YgaGVhZGVyQWN0aW9uQ29udHJvbHMgfCB2aXNpYmxlQ29udHJvbHMgfCBhc3luY1wiXG4gICAgICAgID5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWhlYWRlckFjdGlvbkNvbnRyb2wudGVtcGxhdGU7IGVsc2UgY3VzdG9tVGVtcGxhdGVcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJidG5iYXItYnRuIGJ0bi1saW5rXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJ7eyBoZWFkZXJBY3Rpb25Db250cm9sLnRleHQgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImhlYWRlckFjdGlvbkNvbnRyb2wuY2FsbGJhY2soKVwiXG4gICAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5DVVNUT01fQUNUSU9OLFxuICAgICAgICAgICAgICAgIGN1c3RvbUFjdGlvbk5hbWU6IGhlYWRlckFjdGlvbkNvbnRyb2wudGV4dCxcbiAgICAgICAgICAgICAgICB0eXBlOiBoZWFkZXJBY3Rpb25Db250cm9sLnR5cGVcbiAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtLXItNFwiXG4gICAgICAgICAgICAgICAgW2M4eUljb25dPVwiaGVhZGVyQWN0aW9uQ29udHJvbC5pY29uXCJcbiAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgPHNwYW4+e3sgaGVhZGVyQWN0aW9uQ29udHJvbC50ZXh0IHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNjdXN0b21UZW1wbGF0ZT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICBoZWFkZXJBY3Rpb25Db250cm9sLnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHsgaGVhZGVyQWN0aW9uQ29udHJvbDogaGVhZGVyQWN0aW9uQ29udHJvbCB9XG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd25cIlxuICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbSBsZWZ0XCJcbiAgICAgICAgICAqbmdJZj1cImNvbmZpZ3VyZUNvbHVtbnNFbmFibGVkXCJcbiAgICAgICAgICBkcm9wZG93blxuICAgICAgICAgICNkZENvbmZpZ3VyZUNvbHVtbnM9XCJicy1kcm9wZG93blwiXG4gICAgICAgICAgW2Nka1RyYXBGb2N1c109XCJkZENvbmZpZ3VyZUNvbHVtbnMuaXNPcGVuXCJcbiAgICAgICAgICBbaW5zaWRlQ2xpY2tdPVwidHJ1ZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cImJ0bmJhci1idG5cIlxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnQ29uZmlndXJlIGNvbHVtbnMnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgZGF0YS1jeT1cImRhdGEtZ3JpZC0tY3VzdG9tLWNvbHVtbi1idG5cIlxuICAgICAgICAgICAgZHJvcGRvd25Ub2dnbGVcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICBjbGFzcz1cIm0tci00XCJcbiAgICAgICAgICAgICAgYzh5SWNvbj1cImNvbHVtbnNcIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgIDxzcGFuPnt7ICdDb25maWd1cmUgY29sdW1ucycgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8dWxcbiAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24tbWVudSBkYXRhLWdyaWRfX2Ryb3Bkb3duXCJcbiAgICAgICAgICAgICpkcm9wZG93bk1lbnVcbiAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwibGlzdC1ncm91cCBtLTBcIlxuICAgICAgICAgICAgICAgIGNka0Ryb3BMaXN0XG4gICAgICAgICAgICAgICAgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJvbkNvbHVtbkRyb3AoJGV2ZW50KVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnNcIlxuICAgICAgICAgICAgICAgICAgY2RrRHJhZ1xuICAgICAgICAgICAgICAgICAgY2RrRHJhZ0xvY2tBeGlzPVwieVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb2x1bW4ucG9zaXRpb25GaXhlZFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGRyYWdnYWJsZS1hZnRlciBwLTAgYS1pLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjOHktY2hlY2tib3ggcC1sLTE2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgKGNvbHVtbi5oZWFkZXIgfCB0cmFuc2xhdGUpIHx8IGNvbHVtbi5uYW1lIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtY3ldPVwiJ2RhdGEtZ3JpZC0tY3VzdG9tLWNvbHVtbi1oZWFkZXItJyArIGNvbHVtbi5oZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbHVtbi52aXNpYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVHcmlkQ29sdW1uc1NpemUoKTsgZW1pdENvbmZpZ0NoYW5nZSgnY2hhbmdlQ29sdW1uVmlzaWJpbGl0eScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5DSEFOR0VfVklTSUJJTElUWSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtbi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2libGU6ICFjb2x1bW4udmlzaWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyAoY29sdW1uLmhlYWRlciB8IHRyYW5zbGF0ZSkgfHwgY29sdW1uLm5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZG90IHNob3dPbkhvdmVyIG1heC13aWR0aC1maXQgYS1pLWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidSZW1vdmVgY29sdW1uLHZlcmJgJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwPVwie3sgJ1JlbW92ZWBjb2x1bW4sdmVyYmAnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cImxlZnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVDdXN0b21Db2x1bW4ocG9Db25maXJtLCBjb2x1bW4sIGRkQ29uZmlndXJlQ29sdW1ucylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4uY3VzdG9tXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8Yzh5LXBvcG92ZXItY29uZmlybVxuICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0NvbmZpcm0gcmVtb3ZhbCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2Vycz1cImZvY3VzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlbWVudF09XCInbGVmdCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAjcG9Db25maXJtXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9jOHktcG9wb3Zlci1jb25maXJtPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYzh5SWNvbj1cIm1pbnVzLWNpcmNsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJkYXRhLWdyaWQtLWN1c3RvbS1jb2x1bW4tcmVtb3ZlLWJ0blwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgY2xhc3M9XCJwLTggc3RpY2t5LWJvdHRvbSBzZXBhcmF0b3ItdG9wXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc0NvbmZpZ0NvbnRleHRLbm93blwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBidG4tYmxvY2tcIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0FkZCBjdXN0b20gY29sdW1uJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgZGF0YS1jeT1cImRhdGEtZ3JpZC0tYWRkLWN1c3RvbS1jb2x1bW5cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuQ3VzdG9tQ29sdW1uKCk7IGRkQ29uZmlndXJlQ29sdW1ucy5oaWRlKClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwibS1yLTRcIlxuICAgICAgICAgICAgICAgICAgYzh5SWNvbj1cInBsdXMtY2lyY2xlXCJcbiAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7ICdBZGQgY3VzdG9tIGNvbHVtbicgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJidG5iYXItYnRuIGJ0bi1saW5rXCJcbiAgICAgICAgICB0aXRsZT1cInt7ICdSZWxvYWQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAqbmdJZj1cIiFoaWRlUmVsb2FkXCJcbiAgICAgICAgICBkYXRhLWN5PVwiZGF0YS1ncmlkLS1yZWxvYWQtYnRuXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGF0YVNvdXJjZS5sb2FkaW5nJCB8IGFzeW5jXCJcbiAgICAgICAgICAoY2xpY2spPVwiY2xpY2tSZWxvYWQoKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8aVxuICAgICAgICAgICAgY2xhc3M9XCJtLXItNFwiXG4gICAgICAgICAgICBjOHlJY29uPVwicmVmcmVzaFwiXG4gICAgICAgICAgPjwvaT5cbiAgICAgICAgICA8c3Bhbj57eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiaW5wdXQtZ3JvdXAgaW5wdXQtZ3JvdXAtc2VhcmNoIG0tbC1zbS0xNiBkYXRhLWdyaWRfX3NlYXJjaC1pbnB1dFwiXG4gICAgICAgICAgKm5nSWY9XCIhc2VydmVyU2lkZURhdGFDYWxsYmFjayB8fCBzaG93U2VhcmNoXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnU2VhcmNo4oCmJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICB0eXBlPVwic2VhcmNoXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoVGV4dFwiXG4gICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzZWFyY2hUZXh0JC5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBwZXJmb3JtU2VhcmNoKHNlYXJjaFRleHQpXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1hZGRvblwiPlxuICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgYzh5SWNvbj1cInNlYXJjaFwiXG4gICAgICAgICAgICAgICpuZ0lmPVwic2VhcmNoVGV4dC5sZW5ndGggPT09IDBcIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgIGNsYXNzPVwicG9pbnRlclwiXG4gICAgICAgICAgICAgIGM4eUljb249XCJ0aW1lc1wiXG4gICAgICAgICAgICAgICpuZ0lmPVwic2VhcmNoVGV4dC5sZW5ndGggPiAwXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlYXJjaFRleHQgPSAnJzsgc2VhcmNoVGV4dCQuZW1pdCgnJylcIlxuICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cInsgYWN0aW9uOiBQWF9BQ1RJT05TLkNMRUFSX1NFQVJDSCB9XCJcbiAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJ0YWJsZS1kYXRhLWdyaWQtaGVhZGVyLWJ1bGstYWN0aW9ucyBhbmltYXRlZCBzbGlkZUluRG93biBmYXN0XCJcbiAgICAgIGRhdGEtY3k9XCJ0YWJsZS1kYXRhLWdyaWQtaGVhZGVyLWJ1bGstYWN0aW9uc1wiXG4gICAgICAqbmdJZj1cInNlbGVjdGVkSXRlbUlkcy5sZW5ndGggIT09IDBcIlxuICAgID5cbiAgICAgIDxoND5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdQbHVyYWxdPVwic2VsZWN0ZWRJdGVtSWRzLmxlbmd0aFwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuZ1BsdXJhbENhc2U9XCI9MVwiPlxuICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPjEgc2VsZWN0ZWQgaXRlbS48L3NwYW4+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgbmdQbHVyYWxDYXNlPVwib3RoZXJcIj5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgIG5nTm9uQmluZGFibGVcbiAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgIFt0cmFuc2xhdGVQYXJhbXNdPVwieyBjb3VudDogc2VsZWN0ZWRJdGVtSWRzLmxlbmd0aCB9XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgY291bnQgfX0gc2VsZWN0ZWQgaXRlbXMuXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxiciBjbGFzcz1cInZpc2libGUteHNcIiAvPlxuICAgICAgICA8c21hbGwgKm5nSWY9XCIhc2VydmVyU2lkZURhdGFDYWxsYmFjayAmJiBzZWxlY3RlZEl0ZW1JZHMubGVuZ3RoID49IHBhZ2luYXRpb24ucGFnZVNpemVcIj5cbiAgICAgICAgICA8YVxuICAgICAgICAgICAgY2xhc3M9XCJpbnRlcmFjdFwiXG4gICAgICAgICAgICAoY2xpY2spPVwic2V0QWxsSXRlbXNTZWxlY3RlZCh0cnVlKVwiXG4gICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwieyBhY3Rpb246IFBYX0FDVElPTlMuU0VMRUNUX0FMTF9JVEVNUyB9XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBuZ05vbkJpbmRhYmxlXG4gICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICBbdHJhbnNsYXRlUGFyYW1zXT1cInsgY291bnQ6IChkYXRhU291cmNlLnN0YXRzJCB8IGFzeW5jKS5maWx0ZXJlZFNpemUgfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIFNlbGVjdCBhbGwge3sgY291bnQgfX0gaXRlbXNcbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvc21hbGw+XG4gICAgICA8L2g0PlxuICAgICAgPGRpdiBjbGFzcz1cIm0tbC1hdXRvXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJidG5iYXIgZC1mbGV4XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgIGxldCBidWxrQWN0aW9uQ29udHJvbCBvZiBidWxrQWN0aW9uQ29udHJvbHMgfCB2aXNpYmxlQ29udHJvbHM6IHNlbGVjdGVkSXRlbUlkcyB8IGFzeW5jXG4gICAgICAgICAgICBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImJ1bGtBY3Rpb25Db250cm9sLnR5cGVcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuYmFyLWJ0blwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnRXhwb3J0JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImJ1bGtBY3Rpb25Db250cm9sLmNhbGxiYWNrKHNlbGVjdGVkSXRlbUlkcywgcmVsb2FkLmJpbmQodGhpcykpXCJcbiAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiYnVpbHRJbkFjdGlvblR5cGUuRXhwb3J0XCJcbiAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7IGFjdGlvbjogUFhfQUNUSU9OUy5CVUxLX0VYUE9SVCB9XCJcbiAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJzaWduLW91dFwiPjwvaT5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyAnRXhwb3J0JyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuYmFyLWJ0blwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnRGVsZXRlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImJ1bGtBY3Rpb25Db250cm9sLmNhbGxiYWNrKHNlbGVjdGVkSXRlbUlkcywgcmVsb2FkLmJpbmQodGhpcykpXCJcbiAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiYnVpbHRJbkFjdGlvblR5cGUuRGVsZXRlXCJcbiAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7IGFjdGlvbjogUFhfQUNUSU9OUy5CVUxLX0RFTEVURSB9XCJcbiAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJkZWxldGVcIj48L2k+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgJ0RlbGV0ZScgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bmJhci1idG5cIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgYnVsa0FjdGlvbkNvbnRyb2wudGV4dCB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImJ1bGtBY3Rpb25Db250cm9sLmNhbGxiYWNrKHNlbGVjdGVkSXRlbUlkcywgcmVsb2FkLmJpbmQodGhpcykpXCJcbiAgICAgICAgICAgICAgICAqbmdTd2l0Y2hEZWZhdWx0XG4gICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkJVTEtfQ1VTVE9NX0FDVElPTixcbiAgICAgICAgICAgICAgICAgIGN1c3RvbUFjdGlvbk5hbWU6IGJ1bGtBY3Rpb25Db250cm9sLnRleHRcbiAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiYnVsa0FjdGlvbkNvbnRyb2wuaWNvbkNsYXNzZXNcIlxuICAgICAgICAgICAgICAgICAgYzh5SWNvbj1cInt7IGJ1bGtBY3Rpb25Db250cm9sLmljb24gfX1cIlxuICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgYnVsa0FjdGlvbkNvbnRyb2wudGV4dCB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwiYnRuYmFyLWJ0blwiXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdDYW5jZWwnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNhbmNlbCgpXCJcbiAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkJVTEtfQ0FOQ0VMXG4gICAgICAgICAgICB9XCJcbiAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGkgYzh5SWNvbj1cInRpbWVzXCI+PC9pPlxuICAgICAgICAgICAgPHNwYW4+e3sgJ0NhbmNlbCcgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDx0YWJsZVxuICAgIGNsYXNzPVwidGFibGUgdGFibGUtZmlsdGVyZWQtc29ydGVkIHRhYmxlLWRhdGEtZ3JpZCBsYXJnZS1wYWRkaW5nXCJcbiAgICBbY2xhc3MudGFibGUtc3RyaXBlZF09XCJkaXNwbGF5T3B0aW9ucy5zdHJpcGVkXCJcbiAgICBbY2xhc3MudGFibGUtYm9yZGVyZWRdPVwiZGlzcGxheU9wdGlvbnMuYm9yZGVyZWRcIlxuICAgIFtjbGFzcy50YWJsZS1ob3Zlcl09XCJkaXNwbGF5T3B0aW9ucy5ob3ZlclwiXG4gICAgW2NsYXNzLnRhYmxlLWRhdGEtZ3JpZC13aXRoLWNoZWNrYm94ZXNdPVwic2VsZWN0YWJsZVwiXG4gICAgW2NsYXNzLnRhYmxlLWRhdGEtZ3JpZC13aXRoLWFjdGlvbnNdPVwiYWN0aW9uQ29udHJvbHMubGVuZ3RoID4gMFwiXG4gICAgW3N0eWxlLmdyaWQtdGVtcGxhdGUtY29sdW1uc109XCJzdHlsZXMuZ3JpZFRlbXBsYXRlQ29sdW1uc1wiXG4gICAgY2RrLXRhYmxlXG4gICAgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiXG4gICAgW211bHRpVGVtcGxhdGVEYXRhUm93c109XCJ0cnVlXCJcbiAgICAobW91c2Vtb3ZlKT1cInJlc2l6ZUhhbmRsZUNvbnRhaW5lck1vdXNlTW92ZSQuZW1pdCgkZXZlbnQpXCJcbiAgICAobW91c2V1cCk9XCJyZXNpemVIYW5kbGVDb250YWluZXJNb3VzZVVwJC5lbWl0KCRldmVudClcIlxuICAgIGRhdGEtY3k9XCJjOHktZGF0YS1ncmlkLS10YWJsZVwiXG4gID5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlOYW1lXCJcbiAgICAgIFtjZGtDb2x1bW5EZWZdPVwiY29sdW1uLm5hbWVcIlxuICAgID5cbiAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbHVtbi5uYW1lXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjaGVja2JveCdcIj5cbiAgICAgICAgICA8dGhcbiAgICAgICAgICAgIGNkay1oZWFkZXItY2VsbFxuICAgICAgICAgICAgKmNka0hlYWRlckNlbGxEZWZcbiAgICAgICAgICAgIGRhdGEtdHlwZT1cImljb25cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImM4eS1jaGVja2JveFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInU2VsZWN0ZWQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJjdXJyZW50UGFnZVNlbGVjdGlvblN0YXRlLmFsbFNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cIlxuICAgICAgICAgICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYWdlU2VsZWN0aW9uU3RhdGUuYWxsU2VsZWN0ZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGFnZVNlbGVjdGlvblN0YXRlLmFsbERlc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0QWxsSXRlbXNJbkN1cnJlbnRQYWdlU2VsZWN0ZWQoJGV2ZW50LnRhcmdldC5jaGVja2VkKVwiXG4gICAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwieyBhY3Rpb246IFBYX0FDVElPTlMuU0VMRUNUX0FMTF9JVEVNUyB9XCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvdGg+XG5cbiAgICAgICAgICA8dGRcbiAgICAgICAgICAgIGNkay1jZWxsXG4gICAgICAgICAgICAqY2RrQ2VsbERlZj1cImxldCByb3dcIlxuICAgICAgICAgICAgZGF0YS10eXBlPVwiaWNvblwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYzh5LWNoZWNrYm94XCI+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1NlbGVjdGVkJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0l0ZW1TZWxlY3RlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldEl0ZW1zU2VsZWN0ZWQoW3Jvd10sICRldmVudC50YXJnZXQuY2hlY2tlZClcIlxuICAgICAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5TRUxFQ1RfSVRFTSxcbiAgICAgICAgICAgICAgICAgIGlkOiByb3cuaWRcbiAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICBkYXRhLWN5PVwiYzh5LWRhdGEtZ3JpZC0tY2hlY2tib3hcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidyYWRpby1idXR0b24nXCI+XG4gICAgICAgICAgPHRoXG4gICAgICAgICAgICBjZGstaGVhZGVyLWNlbGxcbiAgICAgICAgICAgICpjZGtIZWFkZXJDZWxsRGVmXG4gICAgICAgICAgICBkYXRhLXR5cGU9XCJpY29uXCJcbiAgICAgICAgICA+PC90aD5cblxuICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgY2RrLWNlbGxcbiAgICAgICAgICAgICpjZGtDZWxsRGVmPVwibGV0IHJvd1wiXG4gICAgICAgICAgICBkYXRhLXR5cGU9XCJpY29uXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjOHktcmFkaW9cIj5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInU2VsZWN0ZWQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBuYW1lPVwic2VsZWN0LXJvd1wiXG4gICAgICAgICAgICAgICAgdHlwZT1cInJhZGlvXCJcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0l0ZW1TZWxlY3RlZChyb3cpXCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImNoYW5nZVNlbGVjdGVkSXRlbShyb3cpXCJcbiAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuU0VMRUNUX0lURU0sXG4gICAgICAgICAgICAgICAgICBpZDogcm93LmlkXG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLXJhZGlvXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYWN0aW9ucydcIj5cbiAgICAgICAgICA8dGhcbiAgICAgICAgICAgIGNkay1oZWFkZXItY2VsbFxuICAgICAgICAgICAgKmNka0hlYWRlckNlbGxEZWZcbiAgICAgICAgICAgIGRhdGEtdHlwZT1cImljb25cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1tZWRpdW0gc3Itb25seVwiPnt7ICdBY3Rpb25zJyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICAgICAgICA8L3RoPlxuXG4gICAgICAgICAgPHRkXG4gICAgICAgICAgICBjZGstY2VsbFxuICAgICAgICAgICAgKmNka0NlbGxEZWY9XCJsZXQgcm93XCJcbiAgICAgICAgICAgIGRhdGEtdHlwZT1cImljb25cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgbGV0IGFjdGlvbkNvbnRyb2wgb2YgYWN0aW9uQ29udHJvbHNcbiAgICAgICAgICAgICAgICAgIHwgdmlzaWJsZUNvbnRyb2xzOiByb3dcbiAgICAgICAgICAgICAgICAgIHwgYXN5bmNcbiAgICAgICAgICAgICAgICAgIHwgc2xpY2U6IDAgOiAoKGFjdGlvbkNvbnRyb2xzIHwgdmlzaWJsZUNvbnRyb2xzOiByb3cgfCBhc3luYyk/Lmxlbmd0aCA+IDIgPyAxIDogMilcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiYWN0aW9uQ29udHJvbC50eXBlXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRvdFwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidFZGl0JyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICB0b29sdGlwPVwie3sgJ0VkaXQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiYnVpbHRJbkFjdGlvblR5cGUuRWRpdFwiXG4gICAgICAgICAgICAgICAgICBbZGVsYXldPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3Rpb25Db250cm9sLmNhbGxiYWNrKHJvdywgcmVsb2FkLmJpbmQodGhpcykpXCJcbiAgICAgICAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5FRElUX0lURU0sXG4gICAgICAgICAgICAgICAgICAgIGlkOiByb3cuaWRcbiAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLWVkaXQtYnV0dG9uLWluLXJvd1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cInBlbmNpbFwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kb3QgYnRuLWRvdC0tZGFuZ2VyIHNob3dPbkhvdmVyXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0RlbGV0ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgdG9vbHRpcD1cInt7ICdEZWxldGUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBbZGVsYXldPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3Rpb25Db250cm9sLmNhbGxiYWNrKHJvdywgcmVsb2FkLmJpbmQodGhpcykpXCJcbiAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJidWlsdEluQWN0aW9uVHlwZS5EZWxldGVcIlxuICAgICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuREVMRVRFX0lURU0sXG4gICAgICAgICAgICAgICAgICAgIGlkOiByb3cuaWRcbiAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJjOHktZGF0YS1ncmlkLS1yZW1vdmUtYnV0dG9uLWluLXJvd1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cImRlbGV0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kb3RcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoYWN0aW9uQ29udHJvbC5pY29uID8gYWN0aW9uQ29udHJvbC50ZXh0IDogJycpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIHRvb2x0aXA9XCJ7eyAoYWN0aW9uQ29udHJvbC5pY29uID8gYWN0aW9uQ29udHJvbC50ZXh0IDogJycpIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7IHNob3dPbkhvdmVyOiBhY3Rpb25Db250cm9sLnNob3dPbkhvdmVyIH1cIlxuICAgICAgICAgICAgICAgICAgW2RlbGF5XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hEZWZhdWx0XG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aW9uQ29udHJvbC5jYWxsYmFjayhyb3csIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5DVVNUT01fQUNUSU9OX0lURU0sXG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbUFjdGlvbk5hbWU6IGFjdGlvbkNvbnRyb2wudGV4dCxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHJvdy5pZFxuICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1jeV09XCInYzh5LWRhdGEtZ3JpZC0tYnV0dG9uLWluLXJvdy0tJyArIGFjdGlvbkNvbnRyb2wudGV4dFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgYzh5SWNvbj1cInt7IGFjdGlvbkNvbnRyb2wuaWNvbiB9fVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImFjdGlvbkNvbnRyb2wuaWNvbkNsYXNzZXNcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImFjdGlvbkNvbnRyb2wuaWNvblwiXG4gICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhYWN0aW9uQ29udHJvbC5pY29uXCI+e3sgYWN0aW9uQ29udHJvbC50ZXh0IHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAnbS1sLWF1dG8gb3ZlcmZsb3ctdmlzaWJsZSc6XG4gICAgICAgICAgICAgICAgICAoYWN0aW9uQ29udHJvbHMgfCB2aXNpYmxlQ29udHJvbHM6IHJvdyB8IGFzeW5jKT8ubGVuZ3RoID4gMlxuICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd25cIlxuICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbSByaWdodFwiXG4gICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgZHJvcGRvd25cbiAgICAgICAgICAgICAgICAqbmdJZj1cIihhY3Rpb25Db250cm9scyB8IHZpc2libGVDb250cm9sczogcm93IHwgYXN5bmMpPy5sZW5ndGggPiAyXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24tdG9nZ2xlIGM4eS1kcm9wZG93blwiXG4gICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdBY3Rpb25zJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJjOHktZGF0YS1ncmlkLS1yb3ctYWN0aW9ucy1kcm9wZG93blwiXG4gICAgICAgICAgICAgICAgICBkcm9wZG93blRvZ2dsZVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJlbGxpcHNpcy12XCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDx1bFxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1tZW51IGRyb3Bkb3duLW1lbnUtcmlnaHRcIlxuICAgICAgICAgICAgICAgICAgKmRyb3Bkb3duTWVudVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgYWN0aW9uQ29udHJvbCBvZiBhY3Rpb25Db250cm9sc1xuICAgICAgICAgICAgICAgICAgICAgICAgfCB2aXNpYmxlQ29udHJvbHM6IHJvd1xuICAgICAgICAgICAgICAgICAgICAgICAgfCBhc3luY1xuICAgICAgICAgICAgICAgICAgICAgICAgfCBzbGljZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgoYWN0aW9uQ29udHJvbHMgfCB2aXNpYmxlQ29udHJvbHM6IHJvdyB8IGFzeW5jKT8ubGVuZ3RoID4gMiA/IDEgOiAyKVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJhY3Rpb25Db250cm9sLnR5cGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdFZGl0JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJidWlsdEluQWN0aW9uVHlwZS5FZGl0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3Rpb25Db250cm9sLmNhbGxiYWNrKHJvdywgcmVsb2FkLmJpbmQodGhpcykpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkVESVRfSVRFTSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHJvdy5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJwZW5jaWxcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAnRWRpdCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdEZWxldGUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImJ1aWx0SW5BY3Rpb25UeXBlLkRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aW9uQ29udHJvbC5jYWxsYmFjayhyb3csIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5ERUxFVEVfSVRFTSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHJvdy5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJkZWxldGVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAnRGVsZXRlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0V4cG9ydCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiYnVpbHRJbkFjdGlvblR5cGUuRXhwb3J0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3Rpb25Db250cm9sLmNhbGxiYWNrKHJvdywgcmVsb2FkLmJpbmQodGhpcykpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkVYUE9SVF9JVEVNLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogcm93LmlkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cImRhdGEtZXhwb3J0XCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0V4cG9ydCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7IGFjdGlvbkNvbnRyb2wudGV4dCB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaERlZmF1bHRcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3Rpb25Db250cm9sLmNhbGxiYWNrKHJvdywgcmVsb2FkLmJpbmQodGhpcykpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5DVVNUT01fQUNUSU9OX0lURU0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbUFjdGlvbk5hbWU6IGFjdGlvbkNvbnRyb2wudGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHJvdy5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYzh5SWNvbj1cInt7IGFjdGlvbkNvbnRyb2wuaWNvbiB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImFjdGlvbkNvbnRyb2wuaWNvbkNsYXNzZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGFjdGlvbkNvbnRyb2wudGV4dCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XG4gICAgICAgICAgPHRoXG4gICAgICAgICAgICBbY2xhc3Muc29ydGVkXT1cImNvbHVtbi5zb3J0T3JkZXJcIlxuICAgICAgICAgICAgW2NsYXNzLmZpbHRlcmVkXT1cImNvbHVtbiB8IG1hcDogaXNDb2x1bW5GaWx0ZXJpbmdBcHBsaWVkXCJcbiAgICAgICAgICAgIFtjbGFzcy5oaWRkZW5dPVwiIWNvbHVtbi52aXNpYmxlXCJcbiAgICAgICAgICAgIGNkay1oZWFkZXItY2VsbFxuICAgICAgICAgICAgKmNka0hlYWRlckNlbGxEZWZcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbHVtbi5oZWFkZXJDU1NDbGFzc05hbWVcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS10eXBlXT1cImNvbHVtbi5kYXRhVHlwZVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiKGNvbHVtbi5oZWFkZXIgfCB0cmFuc2xhdGUpIHx8IGNvbHVtbi5uYW1lXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCIhY29sdW1uLmZpbHRlcmFibGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk5hbWU6IGNvbHVtbi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAoY29sdW1uLmhlYWRlciB8IHRyYW5zbGF0ZSkgfHwgY29sdW1uLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgXSB8IG1hcDogZ2V0SGVhZGVyQ2VsbFJlbmRlcmVyU3BlYyA6IHRoaXMgYXMgY2VsbFJlbmRlcmVyU3BlY1xuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8Yzh5LWNlbGwtcmVuZGVyZXIgW3NwZWNdPVwiY2VsbFJlbmRlcmVyU3BlY1wiPjwvYzh5LWNlbGwtcmVuZGVyZXI+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gaXNEcm9wRG93blBsYWNlZFJpZ2h0IHRvIGJlIHJlbW92ZWQgd2hlbiBjb2x1bW5zIGFyZSB0cmFuc2Zvcm1lZCB0byBvYnNlcnZhYmxlcy4gLS0+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd25cIlxuICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b20ge3sgaXNEcm9wRG93blBsYWNlZFJpZ2h0KGNvbHVtbikgPyAncmlnaHQnIDogJ2xlZnQnIH19XCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4uZmlsdGVyYWJsZVwiXG4gICAgICAgICAgICAgIGRyb3Bkb3duXG4gICAgICAgICAgICAgICNncmlkSGVhZGVyRHJvcGRvd249XCJicy1kcm9wZG93blwiXG4gICAgICAgICAgICAgIFtjZGtUcmFwRm9jdXNdPVwiZ3JpZEhlYWRlckRyb3Bkb3duLmlzT3BlblwiXG4gICAgICAgICAgICAgIFtpbnNpZGVDbGlja109XCJ0cnVlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWhlYWRlclwiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb2x1bW4uaGVhZGVyIHwgdHJhbnNsYXRlKSB8fCBjb2x1bW4ubmFtZVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1jeV09XCInZGF0YS1ncmlkLS1oZWFkZXItYnRuLS0nICsgY29sdW1uLmhlYWRlclwiXG4gICAgICAgICAgICAgICAgZHJvcGRvd25Ub2dnbGVcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lOiBjb2x1bW4ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAoY29sdW1uLmhlYWRlciB8IHRyYW5zbGF0ZSkgfHwgY29sdW1uLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0gfCBtYXA6IGdldEhlYWRlckNlbGxSZW5kZXJlclNwZWMgOiB0aGlzIGFzIGNlbGxSZW5kZXJlclNwZWNcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGM4eS1jZWxsLXJlbmRlcmVyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJjOHktZGF0YS1ncmlkLS1jOHktY2VsbC1yZW5kZXJlclwiXG4gICAgICAgICAgICAgICAgICAgIFtzcGVjXT1cImNlbGxSZW5kZXJlclNwZWNcIlxuICAgICAgICAgICAgICAgICAgPjwvYzh5LWNlbGwtcmVuZGVyZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgIGM4eUljb249XCJmaWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnRmlsdGVyJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgPCEtLSBpc0Ryb3BEb3duUGxhY2VkUmlnaHQgdG8gYmUgcmVtb3ZlZCB3aGVuIGNvbHVtbnMgYXJlIHRyYW5zZm9ybWVkIHRvIG9ic2VydmFibGVzLiAtLT5cbiAgICAgICAgICAgICAgPHVsXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1tZW51XCJcbiAgICAgICAgICAgICAgICAqZHJvcGRvd25NZW51XG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnZHJvcGRvd24tbWVudS1yaWdodC1ncmlkJzogaXNEcm9wRG93blBsYWNlZFJpZ2h0KGNvbHVtbikgfVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJkYXRhLWdyaWRfX2Ryb3Bkb3duXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcGRvd246IGdyaWRIZWFkZXJEcm9wZG93blxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIF0gfCBtYXA6IGdldEZpbHRlcmluZ0Zvcm1SZW5kZXJlclNwZWMgOiB0aGlzIGFzIGZpbHRlcmluZ0Zvcm1SZW5kZXJlclNwZWNcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGM4eS1maWx0ZXJpbmctZm9ybS1yZW5kZXJlclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYmctY29tcG9uZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICBbc3BlY109XCJmaWx0ZXJpbmdGb3JtUmVuZGVyZXJTcGVjXCJcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhLWN5PVwiYzh5LWRhdGEtZ3JpZC0tYzh5LWZpbHRlcmluZy1mb3JtLXJlbmRlcmVyXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvYzh5LWZpbHRlcmluZy1mb3JtLXJlbmRlcmVyPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuLXNvcnRcIlxuICAgICAgICAgICAgICBbc3R5bGVdPVwieyAnbWFyZ2luLWxlZnQnOiAhY29sdW1uLmZpbHRlcmFibGUgJiYgY29sdW1uLnNvcnRhYmxlID8gJy0yMHB4JyA6IG51bGwgfVwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCJzb3J0Q29sdW1uVGl0bGUgfCB0cmFuc2xhdGU6IHsgbmFtZTogY29sdW1uLmhlYWRlciB8IHRyYW5zbGF0ZSB9XCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLnNvcnRhYmxlXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImNoYW5nZVNvcnRPcmRlcihjb2x1bW4ubmFtZSlcIlxuICAgICAgICAgICAgICBkYXRhLWN5PVwiY2hhbmdlLXNvcnQtb3JkZXJcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb2x1bW4uc29ydE9yZGVyXCI+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgIGM4eUljb249XCJsb25nLWFycm93LXVwXCJcbiAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCInYXNjJ1wiXG4gICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgYzh5SWNvbj1cImxvbmctYXJyb3ctZG93blwiXG4gICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ2Rlc2MnXCJcbiAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICBjOHlJY29uPVwiZXhjaGFuZ2VcIlxuICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoRGVmYXVsdFxuICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgIGNsYXNzPVwicmVzaXplLWhhbmRsZVwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLnJlc2l6YWJsZVwiXG4gICAgICAgICAgICAgIChtb3VzZWRvd24pPVwiXG4gICAgICAgICAgICAgICAgcmVzaXplSGFuZGxlTW91c2VEb3duJC5lbWl0KHsgZXZlbnQ6ICRldmVudCwgdGFyZ2V0Q29sdW1uTmFtZTogY29sdW1uLm5hbWUgfSlcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID48L3NwYW4+XG4gICAgICAgICAgPC90aD5cblxuICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgW2NsYXNzLmhpZGRlbl09XCIhY29sdW1uLnZpc2libGVcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1jZWxsLXRpdGxlXT1cImNvbHVtbi5oZWFkZXIgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgY2RrLWNlbGxcbiAgICAgICAgICAgICpjZGtDZWxsRGVmPVwibGV0IHJvd1wiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJjb2x1bW4uY2VsbENTU0NsYXNzTmFtZVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWN5XT1cIidkYXRhLWdyaWQtLScgKyBjb2x1bW4uaGVhZGVyXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdHlwZV09XCJjb2x1bW4uZGF0YVR5cGVcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiByZXNvbHZlQ2VsbFZhbHVlKHJvdywgY29sdW1uLnBhdGgpLFxuICAgICAgICAgICAgICAgICAgICByb3c6IHJvdyxcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uTmFtZTogY29sdW1uLm5hbWVcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdIHwgbWFwOiBnZXRDZWxsUmVuZGVyZXJTcGVjIDogdGhpcyBhcyBjZWxsUmVuZGVyZXJTcGVjXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxjOHktY2VsbC1yZW5kZXJlciBbc3BlY109XCJjZWxsUmVuZGVyZXJTcGVjXCI+PC9jOHktY2VsbC1yZW5kZXJlcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGFpbmVyIGNka0NvbHVtbkRlZj1cImluZmluaXRlU2Nyb2xsRm9vdGVyXCI+XG4gICAgICA8dGRcbiAgICAgICAgW3N0eWxlLmdyaWQtY29sdW1uXT1cInN0eWxlcy5ncmlkSW5maW5pdGVTY3JvbGxDb2x1bW5cIlxuICAgICAgICBjZGstZm9vdGVyLWNlbGxcbiAgICAgICAgKmNka0Zvb3RlckNlbGxEZWZcbiAgICAgID5cbiAgICAgICAgPHRlbXBsYXRlICNpbmZpbml0ZVNjcm9sbENvbnRhaW5lcj48L3RlbXBsYXRlPlxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDx0clxuICAgICAgY2RrLWhlYWRlci1yb3dcbiAgICAgICpjZGtIZWFkZXJSb3dEZWY9XCJjb2x1bW5OYW1lc1wiXG4gICAgPjwvdHI+XG5cbiAgICA8dHJcbiAgICAgIGRhdGEtY3k9XCJjOHktZGF0YS1ncmlkLS1yb3ctaW4tZGF0YS1ncmlkXCJcbiAgICAgIGNkay1yb3dcbiAgICAgICpjZGtSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBjb2x1bW5OYW1lczsgbGV0IGlkeCA9IGRhdGFJbmRleFwiXG4gICAgICBbbmdDbGFzc109XCJbXG4gICAgICAgIGFjdGl2ZUNsYXNzTmFtZSAmJiByb3cgPT09IGxhc3RDbGlja2VkUm93ID8gYWN0aXZlQ2xhc3NOYW1lIDogJycsXG4gICAgICAgIGlkeCAlIDIgPT09IDAgPyAnZXZlbicgOiAnb2RkJ1xuICAgICAgXVwiXG4gICAgICAobW91c2VvdmVyKT1cInJvd01vdXNlT3Zlci5lbWl0KHJvdylcIlxuICAgICAgKG1vdXNlbGVhdmUpPVwicm93TW91c2VMZWF2ZS5lbWl0KHJvdylcIlxuICAgICAgKGNsaWNrKT1cImhhbmRsZUNsaWNrKHJvdylcIlxuICAgID48L3RyPlxuXG4gICAgPHRyXG4gICAgICBjbGFzcz1cImV4cGFuZGVkLXJvd1wiXG4gICAgICBbbmdDbGFzc109XCJ7IGhpZGRlbjogIShleHBhbmRlZFJvd3MuZ2V0KHJvdykudmlzaWJsZSQgfCBhc3luYykgfVwiXG4gICAgICBkYXRhLWN5PVwiYzh5LWRhdGEtZ3JpZC0tZXhwYW5kZWQtcm93LWluLWRhdGEtZ3JpZFwiXG4gICAgICBjZGstcm93XG4gICAgICAqY2RrUm93RGVmPVwibGV0IHJvdzsgY29sdW1uczogWydleHBhbmRlZC1yb3cnXTsgd2hlbjogaXNSb3dFeHBhbmRlZFwiXG4gICAgPjwvdHI+XG5cbiAgICA8bmctY29udGFpbmVyIGNka0NvbHVtbkRlZj1cImV4cGFuZGVkLXJvd1wiPlxuICAgICAgPHRkXG4gICAgICAgIFtzdHlsZS5ncmlkLWNvbHVtbl09XCJzdHlsZXMuZ3JpZEluZmluaXRlU2Nyb2xsQ29sdW1uXCJcbiAgICAgICAgY2RrLWNlbGxcbiAgICAgICAgKmNka0NlbGxEZWY9XCJsZXQgcm93XCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICBleHBhbmRhYmxlUm93Py50ZW1wbGF0ZTtcbiAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgJGltcGxpY2l0OiByb3csXG4gICAgICAgICAgICAgIGFzeW5jUmVuZGVyU3VjY2Vzczogc2V0RXhwYW5kYWJsZVJvd1Zpc2libGUuYmluZCh0aGlzLCByb3csIHRydWUpLFxuICAgICAgICAgICAgICBhc3luY1JlbmRlckZhaWw6IHNldEV4cGFuZGFibGVSb3dWaXNpYmxlLmJpbmQodGhpcywgcm93LCBmYWxzZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBcIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgIDx0clxuICAgICAgICBbbmdDbGFzc109XCJ7IGhpZGRlbjogIWluZmluaXRlU2Nyb2xsIH1cIlxuICAgICAgICBjZGstZm9vdGVyLXJvd1xuICAgICAgICAqY2RrRm9vdGVyUm93RGVmPVwiWydpbmZpbml0ZVNjcm9sbEZvb3RlciddXCJcbiAgICAgID48L3RyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L3RhYmxlPlxuXG4gIDxkaXZcbiAgICBjbGFzcz1cImQtZmxleCBtLTAgcC10LTQwIHAtYi00MFwiXG4gICAgKm5nSWY9XCJcbiAgICAgICEoZGF0YVNvdXJjZS5sb2FkaW5nJCB8IGFzeW5jKSAmJlxuICAgICAgKChkYXRhU291cmNlLnN0YXRzJCB8IGFzeW5jKS5maWx0ZXJlZFNpemUgPT09IDAgfHwgKGRhdGFTb3VyY2UuZGF0YSQgfCBhc3luYykubGVuZ3RoID09PSAwKVxuICAgIFwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTMgY29sLXNtLTQgbS1sLWF1dG8gbS1yLWF1dG9cIj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImM4eS11aS1lbXB0eS1zdGF0ZSwgLmM4eS1lbXB0eS1zdGF0ZVwiPjwvbmctY29udGVudD5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICBlbXB0eVN0YXRlPy50ZW1wbGF0ZVJlZjtcbiAgICAgICAgICBjb250ZXh0OiB7ICRpbXBsaWNpdDogZW1wdHlTdGF0ZUNvbnRleHQkIHwgYXN5bmMgfVxuICAgICAgICBcIlxuICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2XG4gICAgY2xhc3M9XCJ0YWJsZS1kYXRhLWdyaWQtZm9vdGVyIHNlcGFyYXRvciBsYXJnZS1wYWRkaW5nXCJcbiAgICAqbmdJZj1cInBhZ2luYXRpb24gJiYgIWluZmluaXRlU2Nyb2xsXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNCBuby1ndXR0ZXJcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJjb3VudGVyIHAtdC04IHAtYi04XCJcbiAgICAgICAgKm5nSWY9XCIoZGF0YVNvdXJjZS5zdGF0cyQgfCBhc3luYykuY3VycmVudFBhZ2VTaXplID4gMFwiXG4gICAgICAgIGRhdGEtY3k9XCJkYXRhLWdyaWQtLWNvdW50ZXJcIlxuICAgICAgPlxuICAgICAgICA8c3BhblxuICAgICAgICAgIGNsYXNzPVwidGV4dC1tdXRlZFwiXG4gICAgICAgICAgbmdOb25CaW5kYWJsZVxuICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgIFt0cmFuc2xhdGVQYXJhbXNdPVwicGFnaW5hdGlvbkxhYmVsUGFyYW1zXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IHBhZ2VGaXJzdEl0ZW1JZHggfX0gLSB7eyBwYWdlTGFzdEl0ZW1JZHggfX0gb2Yge3sgaXRlbXNUb3RhbCB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNCBuby1ndXR0ZXIgdGV4dC1jZW50ZXJcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJmb3JtLWdyb3VwIGZvcm0taW5saW5lIHAtdC04IHAtYi04XCJcbiAgICAgICAgKm5nSWY9XCIoZGF0YVNvdXJjZS5zdGF0cyQgfCBhc3luYykuZmlsdGVyZWRTaXplID4gbWluUG9zc2libGVQYWdlU2l6ZVwiXG4gICAgICA+XG4gICAgICAgIDxsYWJlbFxuICAgICAgICAgIGNsYXNzPVwibS1yLTRcIlxuICAgICAgICAgIGZvcj1cImZpbHRlcmVkU2l6ZVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyAnSXRlbXMgcGVyIHBhZ2UnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjOHktc2VsZWN0LXdyYXBwZXJcIj5cbiAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICBpZD1cImZpbHRlcmVkU2l6ZVwiXG4gICAgICAgICAgICBkYXRhLWN5PVwiZGF0YS1ncmlkLS1wYWdlc2l6ZS1vcHRpb25zXCJcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cInBhZ2luYXRpb24ucGFnZVNpemVcIlxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiXG4gICAgICAgICAgICAgIHVwZGF0ZVBhZ2luYXRpb24oeyBpdGVtc1BlclBhZ2U6ICRldmVudCwgcGFnZTogcGFnaW5hdGlvbi5jdXJyZW50UGFnZSB9KVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBwYWdlU2l6ZSBvZiBwb3NzaWJsZVBhZ2VTaXplc1wiXG4gICAgICAgICAgICAgIFtuZ1ZhbHVlXT1cInBhZ2VTaXplXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgcGFnZVNpemUgfX1cbiAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImNvbC1zbS00IG5vLWd1dHRlciB0ZXh0LXJpZ2h0XCI+XG4gICAgICA8cGFnaW5hdGlvblxuICAgICAgICBbY2xhc3MuaGlkZGVuXT1cImhpZGVQYWdpbmF0aW9uJCB8IGFzeW5jXCJcbiAgICAgICAgY2xhc3M9XCJwLXQtOCBwLWItOFwiXG4gICAgICAgICpuZ0lmPVwiKGRhdGFTb3VyY2Uuc3RhdHMkIHwgYXN5bmMpLmZpbHRlcmVkU2l6ZSA+IDBcIlxuICAgICAgICBbbmdNb2RlbF09XCJwYWdpbmF0aW9uLmN1cnJlbnRQYWdlXCJcbiAgICAgICAgKHBhZ2VDaGFuZ2VkKT1cInVwZGF0ZVBhZ2luYXRpb24oJGV2ZW50KVwiXG4gICAgICAgIFt0b3RhbEl0ZW1zXT1cIihkYXRhU291cmNlLnN0YXRzJCB8IGFzeW5jKS5maWx0ZXJlZFNpemVcIlxuICAgICAgICBbaXRlbXNQZXJQYWdlXT1cInBhZ2luYXRpb24ucGFnZVNpemVcIlxuICAgICAgICAobnVtUGFnZXMpPVwidG90YWxQYWdlc0NvdW50JC5uZXh0KCRldmVudClcIlxuICAgICAgICBbbWF4U2l6ZV09XCI1XCJcbiAgICAgICAgW2JvdW5kYXJ5TGlua3NdPVwiZmFsc2VcIlxuICAgICAgICBwcmV2aW91c1RleHQ9XCJQcmV2aW91c1wiXG4gICAgICAgIG5leHRUZXh0PVwiTmV4dFwiXG4gICAgICA+PC9wYWdpbmF0aW9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19