@c8y/ngx-components 1020.29.0 → 1020.33.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 (54) hide show
  1. package/bookmarks/bookmarks.service.d.ts +3 -2
  2. package/bookmarks/bookmarks.service.d.ts.map +1 -1
  3. package/context-dashboard/context-dashboard.service.d.ts.map +1 -1
  4. package/core/common/common.module.d.ts +2 -2
  5. package/core/common/humanize-app-name.model.d.ts +2 -2
  6. package/core/common/humanize-app-name.pipe.d.ts.map +1 -1
  7. package/core/dashboard/dashboard.model.d.ts +1 -0
  8. package/core/dashboard/dashboard.model.d.ts.map +1 -1
  9. package/core/dashboard/widgets-dashboard.component.d.ts +1 -0
  10. package/core/dashboard/widgets-dashboard.component.d.ts.map +1 -1
  11. package/core/data-grid/data-grid.model.d.ts +1 -1
  12. package/core/data-grid/data-grid.model.d.ts.map +1 -1
  13. package/core/data-grid/visible-controls.pipe.d.ts +3 -2
  14. package/core/data-grid/visible-controls.pipe.d.ts.map +1 -1
  15. package/esm2022/bookmarks/bookmarks.service.mjs +9 -7
  16. package/esm2022/context-dashboard/context-dashboard.service.mjs +6 -3
  17. package/esm2022/core/common/common.module.mjs +3 -3
  18. package/esm2022/core/common/humanize-app-name.model.mjs +3 -3
  19. package/esm2022/core/common/humanize-app-name.pipe.mjs +6 -5
  20. package/esm2022/core/dashboard/dashboard.model.mjs +2 -2
  21. package/esm2022/core/dashboard/widgets-dashboard.component.mjs +12 -3
  22. package/esm2022/core/data-grid/data-grid.component.mjs +3 -3
  23. package/esm2022/core/data-grid/data-grid.model.mjs +1 -1
  24. package/esm2022/core/data-grid/visible-controls.pipe.mjs +5 -4
  25. package/esm2022/core/docs/defaults.items.mjs +2 -2
  26. package/esm2022/protocol-opcua/opcua-device-protocol-data-reporting.component.mjs +3 -3
  27. package/esm2022/widgets/definitions/device-management-welcome/index.mjs +2 -2
  28. package/esm2022/widgets/implementations/info-gauge/info-gauge-widget-view/info-gauge-widget-view.component.mjs +22 -5
  29. package/fesm2022/c8y-ngx-components-bookmarks.mjs +7 -5
  30. package/fesm2022/c8y-ngx-components-bookmarks.mjs.map +1 -1
  31. package/fesm2022/c8y-ngx-components-context-dashboard.mjs +5 -2
  32. package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  33. package/fesm2022/c8y-ngx-components-protocol-opcua.mjs +2 -2
  34. package/fesm2022/c8y-ngx-components-protocol-opcua.mjs.map +1 -1
  35. package/fesm2022/c8y-ngx-components-widgets-definitions-device-management-welcome.mjs +1 -1
  36. package/fesm2022/c8y-ngx-components-widgets-definitions-device-management-welcome.mjs.map +1 -1
  37. package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs +24 -9
  38. package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs.map +1 -1
  39. package/fesm2022/c8y-ngx-components.mjs +27 -17
  40. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  41. package/locales/de.po +6 -0
  42. package/locales/es.po +6 -0
  43. package/locales/fr.po +6 -0
  44. package/locales/ja_JP.po +6 -0
  45. package/locales/locales.pot +12 -9
  46. package/locales/nl.po +6 -0
  47. package/locales/pl.po +6 -0
  48. package/locales/pt_BR.po +6 -0
  49. package/package.json +1 -1
  50. package/widgets/definitions/device-management-welcome/index.d.ts +1 -1
  51. package/widgets/definitions/device-management-welcome/index.d.ts.map +1 -1
  52. package/widgets/device-management/index.d.ts +1 -1
  53. package/widgets/implementations/info-gauge/info-gauge-widget-view/info-gauge-widget-view.component.d.ts +5 -1
  54. package/widgets/implementations/info-gauge/info-gauge-widget-view/info-gauge-widget-view.component.d.ts.map +1 -1
@@ -1086,7 +1086,7 @@ export class DataGridComponent {
1086
1086
  provide: PRODUCT_EXPERIENCE_EVENT_SOURCE,
1087
1087
  useExisting: forwardRef(() => DataGridComponent)
1088
1088
  }
1089
- ], 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=\"p-relative p-l-4 p-r-16\">\n <span class=\"badge badge-system p-absolute\">\n {{ columnsWithFiltersApplied.length }}\n </span>\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=\"label label-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 *ngFor=\"let headerActionControl of headerActionControls | visibleControls\">\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 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 (input)=\"searchText$.emit($event.target.value)\"\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 *ngFor=\"let bulkActionControl of bulkActionControls | visibleControls\">\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 [class]=\"bulkActionControl.iconClasses\" c8yIcon=\"{{ bulkActionControl.icon }}\"></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 | slice: 0 : ((actionControls | visibleControls: row)?.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 *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': (actionControls | visibleControls: row)?.length > 2\n }\"\n >\n <div\n class=\"dropdown\"\n placement=\"bottom right\"\n container=\"body\"\n dropdown\n *ngIf=\"(actionControls | visibleControls: row)?.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 | slice: ((actionControls | visibleControls: row)?.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 c8yIcon=\"{{ actionControl.icon }}\"></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 [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"], 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"], 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" }] }); }
1089
+ ], 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=\"p-relative p-l-4 p-r-16\">\n <span class=\"badge badge-system p-absolute\">\n {{ columnsWithFiltersApplied.length }}\n </span>\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=\"label label-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 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 (input)=\"searchText$.emit($event.target.value)\"\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 *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 c8yIcon=\"{{ actionControl.icon }}\"></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 [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"], 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"], 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" }] }); }
1090
1090
  }
1091
1091
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: DataGridComponent, decorators: [{
1092
1092
  type: Component,
@@ -1095,7 +1095,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
1095
1095
  provide: PRODUCT_EXPERIENCE_EVENT_SOURCE,
1096
1096
  useExisting: forwardRef(() => DataGridComponent)
1097
1097
  }
1098
- ], 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=\"p-relative p-l-4 p-r-16\">\n <span class=\"badge badge-system p-absolute\">\n {{ columnsWithFiltersApplied.length }}\n </span>\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=\"label label-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 *ngFor=\"let headerActionControl of headerActionControls | visibleControls\">\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 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 (input)=\"searchText$.emit($event.target.value)\"\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 *ngFor=\"let bulkActionControl of bulkActionControls | visibleControls\">\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 [class]=\"bulkActionControl.iconClasses\" c8yIcon=\"{{ bulkActionControl.icon }}\"></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 | slice: 0 : ((actionControls | visibleControls: row)?.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 *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': (actionControls | visibleControls: row)?.length > 2\n }\"\n >\n <div\n class=\"dropdown\"\n placement=\"bottom right\"\n container=\"body\"\n dropdown\n *ngIf=\"(actionControls | visibleControls: row)?.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 | slice: ((actionControls | visibleControls: row)?.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 c8yIcon=\"{{ actionControl.icon }}\"></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 [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" }]
1098
+ ], 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=\"p-relative p-l-4 p-r-16\">\n <span class=\"badge badge-system p-absolute\">\n {{ columnsWithFiltersApplied.length }}\n </span>\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=\"label label-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 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 (input)=\"searchText$.emit($event.target.value)\"\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 *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 c8yIcon=\"{{ actionControl.icon }}\"></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 [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" }]
1099
1099
  }], ctorParameters: () => [{ type: undefined, decorators: [{
1100
1100
  type: Optional
1101
1101
  }, {
@@ -1211,4 +1211,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
1211
1211
  type: ViewChild,
1212
1212
  args: [CdkTable, { static: false }]
1213
1213
  }] } });
1214
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1ncmlkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvZGF0YS1ncmlkL2RhdGEtZ3JpZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9jb3JlL2RhdGEtZ3JpZC9kYXRhLWdyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM3RCxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBQ2YsVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsRUFDVCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWpELE9BQU8sRUFDTCxRQUFRLElBQUksU0FBUyxFQUNyQixTQUFTLEVBQ1QsSUFBSSxFQUNKLEdBQUcsRUFDSCxPQUFPLEVBQ1AsT0FBTyxFQUNQLEtBQUssRUFDTCxLQUFLLEVBQ0wsTUFBTSxFQUNOLE9BQU8sRUFDUixNQUFNLFdBQVcsQ0FBQztBQUVuQixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUNMLGVBQWUsRUFFZixPQUFPLEVBRVAsYUFBYSxFQUNiLFFBQVEsRUFDUixZQUFZLEVBQ1osS0FBSyxFQUNMLEVBQUUsRUFDRixJQUFJLEVBQ0wsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLG9CQUFvQixFQUNwQixNQUFNLEVBQ04sS0FBSyxFQUNM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QixNQUFNO2dCQUVHLFFBQVE7c0JBQWpCLE1BQU07Z0JBRUcsY0FBYztzQkFBdkIsTUFBTTtnQkFFRyxjQUFjO3NCQUF2QixNQUFNO2dCQUVHLGNBQWM7c0JBQXZCLE1BQU07Z0JBRUcsUUFBUTtzQkFBakIsTUFBTTtnQkFNRyxXQUFXO3NCQUFwQixNQUFNO2dCQUVHLFFBQVE7c0JBQWpCLE1BQU07Z0JBRUcsaUJBQWlCO3NCQUExQixNQUFNO2dCQUVHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFFRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBRUcsTUFBTTtzQkFBZixNQUFNO2dCQUVHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFFRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBRUcsd0JBQXdCO3NCQUFqQyxNQUFNO2dCQUUyQixlQUFlO3NCQUFoRCxlQUFlO3VCQUFDLGVBQWU7Z0JBR2hDLGFBQWE7c0JBRFosWUFBWTt1QkFBQyxzQkFBc0I7Z0JBR0csZUFBZTtzQkFBckQsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUdyQyx1QkFBdUI7c0JBRHRCLFNBQVM7dUJBQUMseUJBQXlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFHckMsVUFBVTtzQkFBbkQsWUFBWTt1QkFBQywwQkFBMEI7Z0JBc0VtQixNQUFNO3NCQUFoRSxZQUFZO3VCQUFDLGFBQWEsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBSWpELFFBQVE7c0JBRFAsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2RrSGVhZGVyQ2VsbCwgQ2RrVGFibGUgfSBmcm9tICdAYW5ndWxhci9jZGsvdGFibGUnO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgVmlld0NoaWxkLFxuICBWaWV3Q2hpbGRyZW4sXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIGZvcndhcmRSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IElJZGVudGlmaWVkLCBJUmVzdWx0TGlzdCwgUGFnaW5nIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHtcbiAgcGFyc2VJbnQgYXMgX3BhcnNlSW50LFxuICBjYXN0QXJyYXksXG4gIGZsb3csXG4gIGdldCxcbiAgaW5kZXhPZixcbiAgaXNFbXB0eSxcbiAgaXNOaWwsXG4gIHVuaW9uLFxuICB1bmlxQnksXG4gIHdpdGhvdXRcbn0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEJzRHJvcGRvd25EaXJlY3RpdmUgfSBmcm9tICduZ3gtYm9vdHN0cmFwL2Ryb3Bkb3duJztcbmltcG9ydCB7IEJzTW9kYWxTZXJ2aWNlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIE9ic2VydmFibGUsXG4gIFN1YmplY3QsXG4gIFVuYXJ5RnVuY3Rpb24sXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGZvcmtKb2luLFxuICBpc09ic2VydmFibGUsXG4gIG1lcmdlLFxuICBvZixcbiAgcGlwZVxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGNvbWJpbmVMYXRlc3RXaXRoLFxuICBjb25jYXRNYXAsXG4gIGRlYm91bmNlVGltZSxcbiAgZGVsYXksXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBmaWx0ZXIsXG4gIGZpcnN0LFxuICBtYXAsXG4gIG1lcmdlTWFwLFxuICBzdGFydFdpdGgsXG4gIHN3aXRjaE1hcCxcbiAgdGFrZSxcbiAgdGFrZVVudGlsLFxuICB0YXBcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlIH0gZnJvbSAnLi4vYWxlcnQvYWxlcnQuc2VydmljZSc7XG5pbXBvcnQgeyBFbXB0eVN0YXRlQ29udGV4dERpcmVjdGl2ZSB9IGZyb20gJy4uL2NvbW1vbi9lbXB0eS1zdGF0ZS9lbXB0eS1zdGF0ZS1jb250ZXh0LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyB0b09ic2VydmFibGUgfSBmcm9tICcuLi9jb21tb24vZXh0ZW5zaW9uLWhvb2tzJztcbmltcG9ydCB7IExvYWRNb3JlQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tbW9uL2xvYWQtbW9yZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTG9hZE1vcmVNb2RlIH0gZnJvbSAnLi4vY29tbW9uL2xvYWQtbW9yZS5tb2RlbCc7XG5pbXBvcnQgeyBnZXR0ZXh0IH0gZnJvbSAnLi4vaTE4bi9nZXR0ZXh0JztcbmltcG9ydCB7IFBvcG92ZXJDb25maXJtQnV0dG9ucywgUG9wb3ZlckNvbmZpcm1Db21wb25lbnQgfSBmcm9tICcuLi9tb2RhbC9wb3BvdmVyLWNvbmZpcm0uY29tcG9uZW50JztcbmltcG9ydCB7IEdhaW5zaWdodFNlcnZpY2UgfSBmcm9tICcuLi9wcm9kdWN0LWV4cGVyaWVuY2UvZ2FpbnNpZ2h0LnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgUFJPRFVDVF9FWFBFUklFTkNFX0VWRU5UX1NPVVJDRSxcbiAgUHJvZHVjdEV4cGVyaWVuY2VFdmVudCxcbiAgUHJvZHVjdEV4cGVyaWVuY2VFdmVudFNvdXJjZVxufSBmcm9tICcuLi9wcm9kdWN0LWV4cGVyaWVuY2UvcHJvZHVjdC1leHBlcmllbmNlLm1vZGVsJztcbmltcG9ydCB7IEFjdGlvbkNvbnRyb2xzRXh0ZW5zaW9uU2VydmljZSB9IGZyb20gJy4vYWN0aW9uLWNvbnRyb2xzLWV4dGVuc2lvbi5zZXJ2aWNlJztcbmltcG9ydCB7IENlbGxSZW5kZXJlclNwZWMgfSBmcm9tICcuL2NvbHVtbi9jZWxsLXJlbmRlcmVyJztcbmltcG9ydCB7IENvbHVtbkRpcmVjdGl2ZSB9IGZyb20gJy4vY29sdW1uL2NvbHVtbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQ3VzdG9tQ29sdW1uIH0gZnJvbSAnLi9jb2x1bW4vY3VzdG9tLmNvbHVtbic7XG5pbXBvcnQgeyBFeHBhbmRhYmxlUm93Q29sdW1uIH0gZnJvbSAnLi9jb2x1bW4vZXhwYW5kYWJsZS1yb3ctY29sdW1uL2V4cGFuZGFibGUuZGF0YS1ncmlkLWNvbHVtbic7XG5pbXBvcnQgeyBGaWx0ZXJpbmdGb3JtUmVuZGVyZXJTcGVjLCBGaWx0ZXJpbmdNb2RpZmllciB9IGZyb20gJy4vY29sdW1uL2ZpbHRlcmluZy1mb3JtLXJlbmRlcmVyJztcbmltcG9ydCB7IENvbmZpZ3VyZUN1c3RvbUNvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4vY29uZmlndXJlLWN1c3RvbS1jb2x1bW4nO1xuaW1wb3J0IHtcbiAgREFUQV9HUklEX0NPTkZJR1VSQVRJT05fU1RSQVRFR1ksXG4gIERhdGFHcmlkQ29uZmlndXJhdGlvblN0cmF0ZWd5LFxuICBHcmlkQ29uZmlnQ29udGV4dCxcbiAgR3JpZENvbmZpZ1BhcnQsXG4gIEdyaWRFdmVudFR5cGVcbn0gZnJvbSAnLi9kYXRhLWdyaWQtY29uZmlndXJhdGlvbi5tb2RlbCc7XG5pbXBvcnQge1xuICBBY3Rpb25Db250cm9sLFxuICBBY3Rpb25Db250cm9sSG9vayxcbiAgQnVpbHRJbkFjdGlvblR5cGUsXG4gIEJ1bGtBY3Rpb25Db250cm9sLFxuICBDb2x1bW4sXG4gIENvbHVtbkNvbmZpZyxcbiAgQ29sdW1uRGF0YVR5cGUsXG4gIEN1c3RvbUNvbHVtbkNvbmZpZyxcbiAgRGF0YUdyaWQsXG4gIERhdGFTb3VyY2VTdGF0cyxcbiAgRGlzcGxheU9wdGlvbnMsXG4gIEZpbHRlcixcbiAgRmlsdGVyQ2hpcCxcbiAgRmlsdGVyaW5nQWN0aW9uVHlwZSxcbiAgR3JpZENvbmZpZyxcbiAgSGVhZGVyQWN0aW9uQ29udHJvbCxcbiAgUGFnaW5hdGlvbixcbiAgUm93LFxuICBTZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrLFxuICBTb3J0T3JkZXIsXG4gIFNwZWNpYWxDb2x1bW5OYW1lLFxuICBtaW5Db2x1bW5HcmlkVHJhY2tTaXplLFxuICByYXRpb3NCeUNvbHVtblR5cGVzXG59IGZyb20gJy4vZGF0YS1ncmlkLm1vZGVsJztcbmltcG9ydCB7IERhdGFHcmlkU2VydmljZSB9IGZyb20gJy4vZGF0YS1ncmlkLnNlcnZpY2UnO1xuaW1wb3J0IHsgRXhwYW5kYWJsZVJvd0RpcmVjdGl2ZSB9IGZyb20gJy4vZXhwYW5kYWJsZS1yb3cuZGlyZWN0aXZlJztcbmltcG9ydCB7IEdyaWREYXRhU291cmNlIH0gZnJvbSAnLi9ncmlkLWRhdGEtc291cmNlJztcbmltcG9ydCB7IFBYX0FDVElPTlMsIFBYX0VWRU5UX05BTUUgfSBmcm9tICcuL3Byb2R1Y3QtZXhwZXJpZW5jZS5jb25zdGFudHMnO1xuXG5lbnVtIFNvcnRpbmdPcmRlciB7XG4gIEFTQyA9ICdhc2MnLFxuICBERVNDID0gJ2Rlc2MnXG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1kYXRhLWdyaWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS1ncmlkLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDogeyBjbGFzczogJ2QtY29udGVudHMnIH0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IFBST0RVQ1RfRVhQRVJJRU5DRV9FVkVOVF9TT1VSQ0UsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEYXRhR3JpZENvbXBvbmVudClcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgRGF0YUdyaWRDb21wb25lbnRcbiAgaW1wbGVtZW50cyBEYXRhR3JpZCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBQcm9kdWN0RXhwZXJpZW5jZUV2ZW50U291cmNlXG57XG4gIC8qKiBUaGUgdGl0bGUgZm9yIHRoZSBkYXRhIGdyaWQsIGl0J3MgZGlzcGxheWVkIGluIHRoZSBncmlkJ3MgaGVhZGVyLiAqL1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gZ2V0dGV4dCgnSXRlbXMnKTtcbiAgLyoqIFRoZSBsYWJlbCBmb3IgbG9hZCBtb3JlIGJ1dHRvbi4gKi9cbiAgQElucHV0KCkgbG9hZE1vcmVJdGVtc0xhYmVsOiBzdHJpbmcgPSBnZXR0ZXh0KCdMb2FkIG1vcmUgaXRlbXMnKTtcbiAgLyoqIFRoZSBsYWJlbCBmb3IgbG9hZGluZyBpbmRpY2F0b3IuICovXG4gIEBJbnB1dCgpIGxvYWRpbmdJdGVtc0xhYmVsOiBzdHJpbmcgPSBnZXR0ZXh0KCdMb2FkaW5nIGl0ZW1z4oCmJyk7XG4gIC8qKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGV4dCBzZWFyY2ggaW5wdXQgaXMgc2hvd24gaW4gdGhlIGdyaWQncyBoZWFkZXIuICovXG4gIEBJbnB1dCgpIHNob3dTZWFyY2ggPSBmYWxzZTtcbiAgLyoqIFRha2VzIGFuIGV2ZW50IGVtaXR0ZXIuIFdoZW4gYW4gZXZlbnQgaXMgZW1pdHRlZCwgdGhlIGdyaWQgd2lsbCBiZSByZWxvYWRlZC4gKi9cbiAgQElucHV0KCkgcmVmcmVzaDogRXZlbnRFbWl0dGVyPHZvaWQ+O1xuXG4gIGNvbHVtbnM6IENvbHVtbltdID0gW107XG4gIC8qKiBUaGUgbGlzdCBvZiBjb2x1bW5zIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgZ3JpZC4gKi9cbiAgQElucHV0KCdjb2x1bW5zJylcbiAgX2NvbHVtbnM6IENvbHVtbltdO1xuXG4gIGRhdGFTb3VyY2UgPSBuZXcgR3JpZERhdGFTb3VyY2UoKTtcbiAgcm93czogUm93W107XG4gIC8qKiBUaGUgbGlzdCBvZiByb3dzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgZ3JpZCAodXNlZCBmb3IgY2xpZW50IHNpZGUgZGF0YSkuICovXG4gIEBJbnB1dCgncm93cycpXG4gIHNldCBfcm93cyhyb3dzOiBSb3dbXSkge1xuICAgIHRoaXMucm93cyA9IHJvd3MgfHwgW107XG4gIH1cblxuICBmaWx0ZXJpbmdMYWJlbHNQYXJhbXMgPSB7XG4gICAgZmlsdGVyZWRJdGVtc0NvdW50OiAwLFxuICAgIGFsbEl0ZW1zQ291bnQ6IDBcbiAgfTtcblxuICBwYWdpbmF0aW9uOiBQYWdpbmF0aW9uO1xuICBwYWdpbmF0aW9uTGFiZWxQYXJhbXMgPSB7XG4gICAgcGFnZUZpcnN0SXRlbUlkeDogMCxcbiAgICBwYWdlTGFzdEl0ZW1JZHg6IDAsXG4gICAgaXRlbXNUb3RhbDogMFxuICB9O1xuICBsYXN0Q2xpY2tlZFJvdzogUm93O1xuICByZWFkb25seSBwb3NzaWJsZVBhZ2VTaXplczogbnVtYmVyW10gPSBbMjUsIDUwLCAxMDBdO1xuICByZWFkb25seSBtaW5Qb3NzaWJsZVBhZ2VTaXplID0gTWF0aC5taW4oLi4udGhpcy5wb3NzaWJsZVBhZ2VTaXplcyk7XG4gIC8qKiBQYWdpbmF0aW9uIHNldHRpbmdzLCBlLmcuIGFsbG93cyBmb3Igc2V0dGluZyBjdXJyZW50IHBhZ2Ugb3IgcGFnZSBzaXplLiAqL1xuICBASW5wdXQoJ3BhZ2luYXRpb24nKVxuICBzZXQgX3BhZ2luYXRpb24ocGFnaW5hdGlvbjogUGFnaW5hdGlvbikge1xuICAgIHRoaXMucGFnaW5hdGlvbiA9IHBhZ2luYXRpb247XG4gIH1cblxuICBpbmZpbml0ZVNjcm9sbDogTG9hZE1vcmVNb2RlO1xuICAvKiogU2V0cyBsb2FkIG1vcmUgbW9kZS4gKi9cbiAgQElucHV0KCdpbmZpbml0ZVNjcm9sbCcpXG4gIHNldCBfaW5maW5pdGVTY3JvbGwoaW5maW5pdGVTY3JvbGw6IExvYWRNb3JlTW9kZSkge1xuICAgIHRoaXMuaW5maW5pdGVTY3JvbGwgPSBpbmZpbml0ZVNjcm9sbDtcbiAgfVxuXG4gIHNlcnZlclNpZGVEYXRhQ2FsbGJhY2s6IFNlcnZlclNpZGVEYXRhQ2FsbGJhY2s7XG4gIC8qKlxuICAgKiBTZXRzIGEgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSBpbnZva2VkIHdoZW5ldmVyIGRhdGEgbmVlZHMgdG8gYmUgbG9hZGVkIGZyb20gc2VydmVyLlxuICAgKiBUaGUgZnVuY3Rpb24gc2hvdWxkIHRha2UgW1tEYXRhU291cmNlTW9kaWZpZXJdXSBhbmQgcmV0dXJuIFtbU2VydmVyU2lkZURhdGFSZXN1bHRdXS5cbiAgICovXG4gIEBJbnB1dCgnc2VydmVyU2lkZURhdGFDYWxsYmFjaycpXG4gIHNldCBfc2VydmVyU2lkZURhdGFDYWxsYmFjayhzZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrOiBTZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrKSB7XG4gICAgdGhpcy5zZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrID0gc2VydmVyU2lkZURhdGFDYWxsYmFjaztcbiAgfVxuXG4gIHNlbGVjdGFibGUgPSBmYWxzZTtcbiAgLyoqIERldGVybWluZXMgd2hldGhlciBpdGVtcyBjYW4gYmUgc2VsZWN0ZWQgYnkgY2xpY2tpbmcgYSBjaGVja2JveCBpbiB0aGUgZmlyc3QgY29sdW1uLiAqL1xuICBASW5wdXQoJ3NlbGVjdGFibGUnKVxuICBzZXQgX3NlbGVjdGFibGUoc2VsZWN0YWJsZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2VsZWN0YWJsZSA9IHNlbGVjdGFibGU7XG4gIH1cblxuICBzaW5nbGVTZWxlY3Rpb24gPSBmYWxzZTtcbiAgLyoqIFJlc3RyaWN0cyBzZWxlY3Rpb24gdG8gYSBzaW5nbGUgcm93IG9ubHkuIFNlbGVjdGlvbiBjb2x1bW4gZGlzcGxheXMgcmFkaW8gYnV0dG9uIGluc3RlYWQgb2YgY2hlY2tib3hlcyAqL1xuICBASW5wdXQoJ3NpbmdsZVNlbGVjdGlvbicpXG4gIHNldCBfc2luZ2xlU2VsZWN0aW9uKHNpbmdsZVNlbGVjdGlvbjogYm9vbGVhbikge1xuICAgIHRoaXMuc2luZ2xlU2VsZWN0aW9uID0gc2luZ2xlU2VsZWN0aW9uO1xuICB9XG5cbiAgc2VsZWN0aW9uUHJpbWFyeUtleSA9ICdpZCc7XG4gIC8qKiBEZXRlcm1pbmVzIHdoaWNoIGl0ZW0ncyBwcm9wZXJ0eSB3aWxsIGJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggc2VsZWN0aW9uIHN0YXR1cy4gKi9cbiAgQElucHV0KCdzZWxlY3Rpb25QcmltYXJ5S2V5JylcbiAgc2V0IF9zZWxlY3Rpb25QcmltYXJ5S2V5KHNlbGVjdGlvblByaW1hcnlLZXk6IHN0cmluZykge1xuICAgIHRoaXMuc2VsZWN0aW9uUHJpbWFyeUtleSA9IHNlbGVjdGlvblByaW1hcnlLZXk7XG4gIH1cblxuICBkaXNwbGF5T3B0aW9uczogRGlzcGxheU9wdGlvbnMgPSB7XG4gICAgc3RyaXBlZDogdHJ1ZSxcbiAgICBib3JkZXJlZDogZmFsc2UsXG4gICAgZ3JpZEhlYWRlcjogdHJ1ZSxcbiAgICBmaWx0ZXI6IHRydWUsXG4gICAgaG92ZXI6IHRydWVcbiAgfTtcbiAgLyoqIFNldHMgZGlzcGxheSBvcHRpb25zLiAqL1xuICBASW5wdXQoJ2Rpc3BsYXlPcHRpb25zJylcbiAgc2V0IF9kaXNwbGF5T3B0aW9ucyhkaXNwbGF5T3B0aW9uczogRGlzcGxheU9wdGlvbnMpIHtcbiAgICB0aGlzLmRpc3BsYXlPcHRpb25zID0geyAuLi50aGlzLmRpc3BsYXlPcHRpb25zLCAuLi5kaXNwbGF5T3B0aW9ucyB9O1xuICB9XG5cbiAgYWN0aW9uQ29udHJvbHM6IEFjdGlvbkNvbnRyb2xbXSA9IFtdO1xuICAvKiogU2V0cyBhY3Rpb24gY29udHJvbHMgKGFjdGlvbnMgYXZhaWxhYmxlIGZvciBpbmRpdmlkdWFsIGl0ZW1zKS4gKi9cbiAgQElucHV0KCdhY3Rpb25Db250cm9scycpXG4gIHNldCBfYWN0aW9uQ29udHJvbHMoYWN0aW9uQ29udHJvbHM6IEFjdGlvbkNvbnRyb2xbXSkge1xuICAgIHRoaXMuYWN0aW9uQ29udHJvbHNJbnB1dCQubmV4dChhY3Rpb25Db250cm9scyk7XG4gIH1cblxuICBidWxrQWN0aW9uQ29udHJvbHM6IEJ1bGtBY3Rpb25Db250cm9sW107XG4gIC8qKiBTZXRzIGJ1bGsgYWN0aW9uIGNvbnRyb2xzIChhY3Rpb25zIGF2YWlsYWJsZSBmb3IgaXRlbXMgc2VsZWN0ZWQgYnkgdXNlcikuICovXG4gIEBJbnB1dCgnYnVsa0FjdGlvbkNvbnRyb2xzJylcbiAgc2V0IF9idWxrQWN0aW9uQ29udHJvbHMoYnVsa0FjdGlvbkNvbnRyb2xzOiBCdWxrQWN0aW9uQ29udHJvbFtdKSB7XG4gICAgdGhpcy5idWxrQWN0aW9uQ29udHJvbHMgPSBidWxrQWN0aW9uQ29udHJvbHMgfHwgW107XG4gIH1cblxuICBoZWFkZXJBY3Rpb25Db250cm9sczogSGVhZGVyQWN0aW9uQ29udHJvbFtdO1xuICAvKiogU2V0cyBoZWFkZXIgYWN0aW9uIGNvbnRyb2xzIChhY3Rpb25zIGF2YWlsYWJsZSBmcm9tIGRhdGEgZ3JpZCBoZWFkZXIpLiAqL1xuICBASW5wdXQoJ2hlYWRlckFjdGlvbkNvbnRyb2xzJylcbiAgc2V0IF9oZWFkZXJBY3Rpb25Db250cm9scyhoZWFkZXJBY3Rpb25Db250cm9sczogSGVhZGVyQWN0aW9uQ29udHJvbFtdKSB7XG4gICAgdGhpcy5oZWFkZXJBY3Rpb25Db250cm9scyA9IGhlYWRlckFjdGlvbkNvbnRyb2xzIHx8IFtdO1xuICB9XG5cbiAgLyoqIFNldHMgaW5pdGlhbCBzZWFyY2ggdGV4dC4gKi9cbiAgQElucHV0KClcbiAgc2VhcmNoVGV4dCA9ICcnO1xuXG4gIC8qKiBEZXRlcm1pbmVzIGlmIGN1c3RvbSBjb2x1bW5zIGJ1dHRvbiB3aWxsIGJlIGVuYWJsZWQuICovXG4gIEBJbnB1dCgpXG4gIGNvbmZpZ3VyZUNvbHVtbnNFbmFibGVkID0gdHJ1ZTtcblxuICAvKiogU2hvd3MgdGhlIHdhcm5pbmcgZm9yIHRoZSBzdWItYXNzZXRzIGNvdW50ZXIgKi9cbiAgQElucHV0KClcbiAgc2hvd0NvdW50ZXJXYXJuaW5nID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGNsYXNzIG5hbWUgdXNlZCBmb3IgYWN0aXZlIHJvd3MgKGxhc3QgY2xpY2tlZCkuXG4gICAqIFNldCBlbXB0eSBzdHJpbmcgdG8gZGlzYWJsZSBhcHBlbmRpbmcgYWN0aXZlIGNsYXNzIHRvIGdyaWQgcm93cy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGFjdGl2ZUNsYXNzTmFtZSA9ICdhY3RpdmUnO1xuXG4gIC8qKiBEZXRlcm1pbmVzIGlmIHRoZSByb3dzIG9mIHRoZSBkYXRhIGdyaWQgd2lsbCBiZSBleHBhbmRhYmxlLlxuICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAqIC0gYE5PTkVgIC0gbm8gZXhwYW5kYWJsZSByb3dzIChkZWZhdWx0IHZhbHVlKVxuICAgKiAtIGBTWU5DYCAtIGFkZGl0aW9uYWwgY29sdW1uIHdpdGggZXhwYW5kIGJ1dHRvbiBpcyBkaXNwbGF5ZWQgYW5kIGV4cGFuZGFibGUgcm93cyBhcmUgZXhwYW5kaW5nIHN5bmNocm9ub3VzbHkgd2hlbiBidXR0b24gaXMgY2xpY2tlZFxuICAgKiAtIGBBU1lOQ2AgLSBhZGRpdGlvbmFsIGNvbHVtbiB3aXRoIGV4cGFuZCBidXR0b24gaXMgZGlzcGxheWVkIGFuZCBleHBhbmRhYmxlIHJvd3MgYXJlIGV4cGFuZGluZyBhc3luY2hyb25vdXNseSB3aGVuIGJ1dHRvbiBpcyBjbGlja2VkXG4gICAqL1xuICBASW5wdXQoKSBleHBhbmRhYmxlUm93czogJ05PTkUnIHwgJ1NZTkMnIHwgJ0FTWU5DJyA9ICdOT05FJztcblxuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBtb3VzZSBpcyBvdmVyIGEgcm93LiAqL1xuICBAT3V0cHV0KCkgcm93TW91c2VPdmVyID0gbmV3IEV2ZW50RW1pdHRlcjxvYmplY3Q+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIG1vdXNlIGxlYXZlcyBhIHJvdy4gKi9cbiAgQE91dHB1dCgpIHJvd01vdXNlTGVhdmUgPSBuZXcgRXZlbnRFbWl0dGVyPG9iamVjdD4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gYSByb3cgaXMgY2xpY2tlZC4gKi9cbiAgQE91dHB1dCgpIHJvd0NsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxvYmplY3Q+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIGdyaWQncyBjb25maWd1cmF0aW9uIGlzIGNoYW5nZWQuICovXG4gIEBPdXRwdXQoKSBvbkNvbmZpZ0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8R3JpZENvbmZpZz4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IGJlZm9yZSB0aGUgZmlsdGVyIGlzIGFwcGxpZWQuICovXG4gIEBPdXRwdXQoKSBvbkJlZm9yZUZpbHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8b2JqZWN0PigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgYmVmb3JlIHRoZSBzZWFyY2ggaXMgcGVyZm9ybWVkLiAqL1xuICBAT3V0cHV0KCkgb25CZWZvcmVTZWFyY2ggPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gYSBmaWx0ZXIgaXMgYXBwbGllZCBpbiBhIGNvbHVtbi4gKi9cbiAgQE91dHB1dCgpIG9uRmlsdGVyID0gbmV3IEV2ZW50RW1pdHRlcjx7XG4gICAgY29sdW1uTmFtZT86IHN0cmluZztcbiAgICBkcm9wZG93bj86IEJzRHJvcGRvd25EaXJlY3RpdmU7XG4gICAgZmlsdGVyaW5nTW9kaWZpZXI/OiBGaWx0ZXI7XG4gIH0+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIGl0ZW1zIHNlbGVjdGlvbiBjaGFuZ2VzLiBUaGUgYXJyYXkgY29udGFpbnMga2V5cyBvZiBzZWxlY3RlZCBpdGVtcyAoa2V5IHByb3BlcnR5IGlzIGRlZmluZWQgYnkgYHNlbGVjdGlvblByaW1hcnlLZXlgKS4gKi9cbiAgQE91dHB1dCgpIGl0ZW1zU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmdbXT4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gcmVsb2FkIGJ1dHRvbiBpcyBjbGlja2VkLiAqL1xuICBAT3V0cHV0KCkgb25SZWxvYWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIGEgY3VzdG9tIGNvbHVtbiBpcyBhZGRlZCAqL1xuICBAT3V0cHV0KCkgb25BZGRDdXN0b21Db2x1bW4gPSBuZXcgRXZlbnRFbWl0dGVyPEN1c3RvbUNvbHVtbkNvbmZpZz4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gYSBjdXN0b20gY29sdW1uIGlzIHJlbW92ZWQgKi9cbiAgQE91dHB1dCgpIG9uUmVtb3ZlQ3VzdG9tQ29sdW1uID0gbmV3IEV2ZW50RW1pdHRlcjxDb2x1bW4+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCBhZnRlciB0aGUgY29sdW1uIGZpbHRlciBoYXMgYmVlbiByZXNldCAqL1xuICBAT3V0cHV0KCkgb25Db2x1bW5GaWx0ZXJSZXNldCA9IG5ldyBFdmVudEVtaXR0ZXI8Q29sdW1uPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBjb2x1bW4gc29ydGluZyBoYXMgYmVlbiBjaGFuZ2VkICovXG4gIEBPdXRwdXQoKSBvblNvcnQgPSBuZXcgRXZlbnRFbWl0dGVyPEdyaWRDb25maWc+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIHBhZ2Ugc2l6ZSBoYXMgYmVlbiBjaGFuZ2VkICovXG4gIEBPdXRwdXQoKSBvblBhZ2VTaXplQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxHcmlkQ29uZmlnPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBjb2x1bW4gb3JkZXIgaGFzIGJlZW4gY2hhbmdlZCAqL1xuICBAT3V0cHV0KCkgb25Db2x1bW5SZW9yZGVyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEdyaWRDb25maWc+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIGNvbHVtbiBvcmRlciBoYXMgYmVlbiBjaGFuZ2VkICovXG4gIEBPdXRwdXQoKSBvbkNvbHVtblZpc2liaWxpdHlDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEdyaWRDb25maWc+KCk7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihDb2x1bW5EaXJlY3RpdmUpIGNvbHVtblJlbmRlcmVyczogUXVlcnlMaXN0PENvbHVtbkRpcmVjdGl2ZT47XG5cbiAgQENvbnRlbnRDaGlsZChFeHBhbmRhYmxlUm93RGlyZWN0aXZlKVxuICBleHBhbmRhYmxlUm93OiBFeHBhbmRhYmxlUm93RGlyZWN0aXZlO1xuXG4gIEBWaWV3Q2hpbGQoJ3Njcm9sbCcsIHsgc3RhdGljOiB0cnVlIH0pIHNjcm9sbENvbnRhaW5lcjogRWxlbWVudFJlZjtcblxuICBAVmlld0NoaWxkKCdpbmZpbml0ZVNjcm9sbENvbnRhaW5lcicsIHsgc3RhdGljOiBmYWxzZSwgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxuICBpbmZpbml0ZVNjcm9sbENvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZjtcblxuICBAQ29udGVudENoaWxkKEVtcHR5U3RhdGVDb250ZXh0RGlyZWN0aXZlKSBlbXB0eVN0YXRlOiBFbXB0eVN0YXRlQ29udGV4dERpcmVjdGl2ZTtcblxuICBsb2FkTW9yZUNvbXBvbmVudDogTG9hZE1vcmVDb21wb25lbnQ7XG5cbiAgY29sdW1uTmFtZXMgPSBbXTtcblxuICBzdHlsZXMgPSB7XG4gICAgdGFibGVDdXJzb3I6ICdhdXRvJyxcbiAgICBncmlkVGVtcGxhdGVDb2x1bW5zOiB1bmRlZmluZWQsXG4gICAgZ3JpZEluZmluaXRlU2Nyb2xsQ29sdW1uOiB1bmRlZmluZWRcbiAgfTtcblxuICBzZWFyY2hUZXh0JCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBmaWx0ZXJpbmdBcHBsaWVkID0gZmFsc2U7XG4gIGNvbHVtbnNXaXRoRmlsdGVyc0FwcGxpZWQ6IENvbHVtbltdID0gW107XG5cbiAgdG90YWxQYWdlc0NvdW50JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPihJbmZpbml0eSk7XG4gIGhpZGVQYWdpbmF0aW9uJCA9IHRoaXMudG90YWxQYWdlc0NvdW50JC5waXBlKFxuICAgIG1hcCh0b3RhbFBhZ2VzQ291bnQgPT4gdG90YWxQYWdlc0NvdW50IDw9IDEpLFxuICAgIGRlbGF5KDApIC8vIHByZXZlbnRzIEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXJyb3JcbiAgKTtcblxuICBzZWxlY3RlZEl0ZW1JZHM6IHN0cmluZ1tdID0gW107XG4gIGN1cnJlbnRQYWdlU2VsZWN0aW9uU3RhdGUgPSB7XG4gICAgYWxsU2VsZWN0ZWQ6IGZhbHNlLFxuICAgIGFsbERlc2VsZWN0ZWQ6IHRydWVcbiAgfTtcblxuICBidWlsdEluQWN0aW9uVHlwZSA9IHtcbiAgICBFZGl0OiBCdWlsdEluQWN0aW9uVHlwZS5FZGl0LFxuICAgIERlbGV0ZTogQnVpbHRJbkFjdGlvblR5cGUuRGVsZXRlLFxuICAgIEV4cG9ydDogQnVpbHRJbkFjdGlvblR5cGUuRXhwb3J0XG4gIH07XG5cbiAgY29uZmlybVJlbW92ZUNvbHVtbkJ1dHRvbnM6IFBvcG92ZXJDb25maXJtQnV0dG9uc1tdID0gW1xuICAgIHtcbiAgICAgIGxhYmVsOiBnZXR0ZXh0KCdDYW5jZWwnKSxcbiAgICAgIGFjdGlvbjogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKVxuICAgIH0sXG4gICAge1xuICAgICAgbGFiZWw6IGdldHRleHQoJ1JlbW92ZWBjb2x1bW4sdmVyYmAnKSxcbiAgICAgIHN0YXR1czogJ2RhbmdlcicsXG4gICAgICBhY3Rpb246ICgpID0+IFByb21pc2UucmVzb2x2ZSh0cnVlKVxuICAgIH1cbiAgXTtcblxuICBpc0NvbmZpZ0NvbnRleHRLbm93biA9IGZhbHNlO1xuICBlbXB0eVN0YXRlQ29udGV4dCQ6IE9ic2VydmFibGU8RGF0YVNvdXJjZVN0YXRzPjtcblxuICAvKipcbiAgICogQSBtYXAgb2Ygcm93cyB3aGljaCBoYXZlIGJlZW4gZXhwYW5kZWQuXG4gICAqL1xuICBleHBhbmRlZFJvd3M6IE1hcDxSb3csIHsgdmlzaWJsZSQ6IFN1YmplY3Q8Ym9vbGVhbj4gfCBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gfT4gPSBuZXcgTWFwKCk7XG5cbiAgLyoqIFByb2R1Y3QgZXhwZXJpZW5jZSBjb25zdGFudHMgZGVjbGFyYXRpb25zICovXG4gIHByb2R1Y3RFeHBlcmllbmNlRXZlbnQ6IFByb2R1Y3RFeHBlcmllbmNlRXZlbnQgPSB7IGV2ZW50TmFtZTogUFhfRVZFTlRfTkFNRSB9O1xuICBQWF9BQ1RJT05TID0gUFhfQUNUSU9OUztcblxuICByZWFkb25seSBzb3J0Q29sdW1uVGl0bGUgPSBnZXR0ZXh0KCdTb3J0IGNvbHVtbiBcInt7IG5hbWUgfX1cIicpO1xuXG4gIHJlc2l6ZUhhbmRsZU1vdXNlRG93biQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZXZlbnQ6IE1vdXNlRXZlbnQ7IHRhcmdldENvbHVtbk5hbWU6IHN0cmluZyB9PigpO1xuICByZXNpemVIYW5kbGVDb250YWluZXJNb3VzZU1vdmUkID0gbmV3IEV2ZW50RW1pdHRlcjxNb3VzZUV2ZW50PigpO1xuICByZXNpemVIYW5kbGVDb250YWluZXJNb3VzZVVwJCA9IG5ldyBFdmVudEVtaXR0ZXI8TW91c2VFdmVudD4oKTtcblxuICBmaWx0ZXJzSGVscFBvcG92ZXJIdG1sOiBzdHJpbmcgPSBnZXR0ZXh0KCdDbGljayB0aGUgY29sdW1uIGhlYWRlcnMgdG8gYXBwbHkgZmlsdGVycy4nKTtcblxuICBwcml2YXRlIGhlYWRlckJlaW5nUmVzaXplZDoge1xuICAgIGNvbHVtbk5hbWU6IHN0cmluZztcbiAgICBlbDogSFRNTEVsZW1lbnQ7XG4gIH07XG4gIEBWaWV3Q2hpbGRyZW4oQ2RrSGVhZGVyQ2VsbCwgeyByZWFkOiBFbGVtZW50UmVmIH0pIHByaXZhdGUgdGhSZWZzOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG4gIHByaXZhdGUgdGhFbHM6IEhUTUxFbGVtZW50W107XG5cbiAgQFZpZXdDaGlsZChDZGtUYWJsZSwgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHRhYmxlUmVmOiBDZGtUYWJsZTxhbnk+O1xuXG4gIHByaXZhdGUgcmVjcmVhdGVMb2FkTW9yZUNvbXBvbmVudDogYm9vbGVhbjtcblxuICBwcml2YXRlIGNvbHVtbnNJbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgZGVmYXVsdENvbHVtbnM6IENvbHVtbltdID0gW107XG5cbiAgcHJpdmF0ZSByZWxvYWRDb25maWd1cmF0aW9uJDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgcHJpdmF0ZSBhY3Rpb25Db250cm9sc0lucHV0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QWN0aW9uQ29udHJvbFtdPihbXSk7XG5cbiAgcHJpdmF0ZSB1bnN1YnNjcmliZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgU0VBUkNIX0RFQk9VTkNFX1RJTUUgPSA1MDA7XG5cbiAgLyoqXG4gICAqIEV2ZW50IGVtaXR0ZXIsIHRha2luZyBib29sZWFuIHZhbHVlcyB1c2VkIGZvciBsb2FkaW5nIGRhdGEgZ3JpZCBkYXRhIHdpdGggZGVib3VuY2UuXG4gICAqIERlZmF1bHQgdmFsdWUgaXMgc2V0IHRvIGZhbHNlLiBTZXQgdG8gdHJ1ZSBpZiBkYXRhIGdyaWQgaXMgdXNpbmcgaW5maW5pdGUgc2Nyb2xsIGFuZCBwYWdlIHNob3VsZCBiZSByZWxvYWRlZC5cbiAgICogVGhpcyBpcyB1c2VkIHRvIGF2b2lkIGhhdmluZyBtdWx0aXBsZSB0aGlzLmxvYWREYXRhKCkgZnVuY3Rpb24gY2FsbHMuXG4gICAqL1xuICBwcml2YXRlIHRyaWdnZXJMb2FkRGF0YSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBAT3B0aW9uYWwoKVxuICAgIEBJbmplY3QoREFUQV9HUklEX0NPTkZJR1VSQVRJT05fU1RSQVRFR1kpXG4gICAgcHVibGljIGNvbmZpZ3VyYXRpb25TdHJhdGVneTogRGF0YUdyaWRDb25maWd1cmF0aW9uU3RyYXRlZ3ksXG4gICAgcHJpdmF0ZSBkYXRhR3JpZFNlcnZpY2U6IERhdGFHcmlkU2VydmljZSxcbiAgICBwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyLFxuICAgIHByaXZhdGUgZ2FpbnNpZ2h0U2VydmljZTogR2FpbnNpZ2h0U2VydmljZSxcbiAgICBwcml2YXRlIGJzTW9kYWxTZXJ2aWNlOiBCc01vZGFsU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWN0aW9uQ29udHJvbHNTZXJ2aWNlOiBBY3Rpb25Db250cm9sc0V4dGVuc2lvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGVcbiAgKSB7XG4gICAgdGhpcy50cmlnZ2VyTG9hZERhdGEucGlwZShkZWJvdW5jZVRpbWUoMSksIHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpLnN1YnNjcmliZShyZWxvYWQgPT4ge1xuICAgICAgdGhpcy5sb2FkRGF0YShyZWxvYWQpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5yZWxvYWRDb25maWd1cmF0aW9uJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmNvbmZpZ3VyYXRpb25TdHJhdGVneT8uZ2V0Q29uZmlnJCgpID8/IG9mKG51bGwpKSxcbiAgICAgICAgdGFwKGNvbmZpZyA9PiB7XG4gICAgICAgICAgdGhpcy5zZXRDb2x1bW5zKGNvbmZpZyk7XG4gICAgICAgICAgdGhpcy5zZXRQYWdlU2l6ZShjb25maWcpO1xuICAgICAgICAgIHRoaXMudHJpZ2dlckxvYWREYXRhLmVtaXQoISF0aGlzLmluZmluaXRlU2Nyb2xsKTtcbiAgICAgICAgfSksXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmRhdGFTb3VyY2Uuc3RhdHMkKSxcbiAgICAgICAgdGFwKHN0YXRzID0+IHtcbiAgICAgICAgICB0aGlzLmNyZWF0ZUxvYWRNb3JlQ29tcG9uZW50KHN0YXRzKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcmluZ0xhYmVsc1BhcmFtcyhzdGF0cyk7XG4gICAgICAgICAgdGhpcy51cGRhdGVQYWdpbmF0aW9uTGFiZWxQYXJhbXMoc3RhdHMpO1xuICAgICAgICAgIHRoaXMudXBkYXRlUGFnaW5hdGlvbldoZW5Ob0RldmljZXNMYXN0UGFnZShzdGF0cyk7XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmlzQ29uZmlnQ29udGV4dEtub3duID0gISF0aGlzLmNvbmZpZ3VyYXRpb25TdHJhdGVneT8uaXNDb250ZXh0S25vd24oKTtcblxuICAgIHRoaXMuc2VhcmNoVGV4dCRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpLFxuICAgICAgICBkZWJvdW5jZVRpbWUodGhpcy5TRUFSQ0hfREVCT1VOQ0VfVElNRSksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgIHRhcChzZWFyY2hUZXh0ID0+IHtcbiAgICAgICAgICB0aGlzLnNlYXJjaFRleHQgPSBzZWFyY2hUZXh0O1xuICAgICAgICAgIHRoaXMub25CZWZvcmVTZWFyY2guZW1pdCh0aGlzLnNlYXJjaFRleHQpO1xuICAgICAgICAgIHRoaXMudHJpZ2dlckV2ZW50KHtcbiAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5TRUFSQ0gsXG4gICAgICAgICAgICBzZWFyY2hJbnB1dDogc2VhcmNoVGV4dFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgICB9KTtcblxuICAgIGlmICh0aGlzLnNlbGVjdGFibGUpIHtcbiAgICAgIGNvbWJpbmVMYXRlc3QodGhpcy5kYXRhU291cmNlLmRhdGEkLCB0aGlzLml0ZW1zU2VsZWN0LmFzT2JzZXJ2YWJsZSgpKVxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpKVxuICAgICAgICAuc3Vic2NyaWJlKChbZGF0YV0pID0+IHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50UGFnZUVtcHR5ID0gZGF0YS5sZW5ndGggPT09IDA7XG5cbiAgICAgICAgICB0aGlzLmN1cnJlbnRQYWdlU2VsZWN0aW9uU3RhdGUgPSB7XG4gICAgICAgICAgICBhbGxTZWxlY3RlZDogY3VycmVudFBhZ2VFbXB0eSA/IGZhbHNlIDogZGF0YS5ldmVyeShpdGVtID0+IHRoaXMuaXNJdGVtU2VsZWN0ZWQoaXRlbSkpLFxuICAgICAgICAgICAgYWxsRGVzZWxlY3RlZDogY3VycmVudFBhZ2VFbXB0eSA/IHRydWUgOiBkYXRhLmV2ZXJ5KGl0ZW0gPT4gIXRoaXMuaXNJdGVtU2VsZWN0ZWQoaXRlbSkpXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5yZWxvYWRDb25maWd1cmF0aW9uJC5uZXh0KCk7XG5cbiAgICB0aGlzLmFjdGlvbkNvbnRyb2xzU2VydmljZS5pdGVtcyRcbiAgICAgIC5waXBlKFxuICAgICAgICBzdGFydFdpdGgoW10pLFxuICAgICAgICBzd2l0Y2hNYXAoKGhvb2tzOiBBY3Rpb25Db250cm9sSG9va1tdKSA9PlxuICAgICAgICAgIGZvcmtKb2luKFxuICAgICAgICAgICAgaG9va3MubWFwKGhvb2sgPT5cbiAgICAgICAgICAgICAgdG9PYnNlcnZhYmxlKFxuICAgICAgICAgICAgICAgIGhvb2s/Lm1hdGNoZXNHcmlkXG4gICAgICAgICAgICAgICAgICA/IHRoaXMuc2FmZWx5SW52b2tlTWF0Y2hlcihcbiAgICAgICAgICAgICAgICAgICAgICBob29rLm1hdGNoZXNHcmlkLFxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm91dGUsXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uU3RyYXRlZ3k/LmdldENvbnRleHQoKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICA6IGZhbHNlXG4gICAgICAgICAgICAgICkucGlwZShtYXAobWF0Y2hlcyA9PiAoeyBob29rLCBtYXRjaGVzIH0pKSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApLnBpcGUoc3RhcnRXaXRoKFtdKSlcbiAgICAgICAgKSxcbiAgICAgICAgbWFwKChob29rczogQXJyYXk8eyBob29rOiBBY3Rpb25Db250cm9sSG9vazsgbWF0Y2hlczogYm9vbGVhbiB9PikgPT5cbiAgICAgICAgICBob29rcy5maWx0ZXIoaG9vayA9PiBob29rLm1hdGNoZXMpLm1hcChob29rID0+IGhvb2suaG9vaylcbiAgICAgICAgKSxcbiAgICAgICAgbWFwKChob29rczogQWN0aW9uQ29udHJvbEhvb2tbXSkgPT5cbiAgICAgICAgICBob29rcy5yZWR1Y2UoKGFjdGlvbkNvbnRyb2xzOiBBY3Rpb25Db250cm9sW10sIGN1cnJlbnRIb29rOiBBY3Rpb25Db250cm9sSG9vaykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFsuLi5hY3Rpb25Db250cm9scywgLi4uY2FzdEFycmF5KGN1cnJlbnRIb29rLmFjdGlvbkNvbnRyb2xzKV07XG4gICAgICAgICAgfSwgW10pXG4gICAgICAgICksXG4gICAgICAgIGNvbWJpbmVMYXRlc3RXaXRoKHRoaXMuYWN0aW9uQ29udHJvbHNJbnB1dCQpLFxuICAgICAgICB0YXAoXG4gICAgICAgICAgKFtob29rQ29udHJvbHMsIGlucHV0Q29udHJvbHNdKSA9PlxuICAgICAgICAgICAgKHRoaXMuYWN0aW9uQ29udHJvbHMgPSBbLi4uaW5wdXRDb250cm9scywgLi4uaG9va0NvbnRyb2xzXSlcbiAgICAgICAgKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgaWYgKHRoaXMucmVmcmVzaCkge1xuICAgICAgdGhpcy5yZWZyZXNoLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5jYW5jZWwoKTtcbiAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMucHJvY2Vzc0FuZFBlcnNpc3RDb25maWdDaGFuZ2UoKTtcbiAgICB0aGlzLnVwZGF0ZUNvbHVtbnMoKTtcblxuICAgIC8vIFJlc2V0dGluZyB0aGUgc3RhdHMgc2l6ZSB0byAwIHdoZW4gbWFuYWdlZCBvYmplY3RzIGFyZSBkZWxldGVkIGJ1dCBzaXppbmcgbm90IHlldCB1cGRhdGVkXG4gICAgLy8gVE9ETyByZW1vdmUgYWZ0ZXIgTVRNLTYwMjI2IGlzIHJlc29sdmVkXG4gICAgdGhpcy5lbXB0eVN0YXRlQ29udGV4dCQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmRhdGFTb3VyY2Uuc3RhdHMkLCB0aGlzLmRhdGFTb3VyY2UuZGF0YSRdKS5waXBlKFxuICAgICAgbWFwKChbc3RhdHMsIGRhdGFdKSA9PiB7XG4gICAgICAgIGlmIChzdGF0cy5maWx0ZXJlZFNpemUgPT09IDEgJiYgZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4geyAuLi5zdGF0cywgc2l6ZTogMCwgZmlsdGVyZWRTaXplOiAwIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YXRzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgc2V0RXhwYW5kYWJsZVJvd1Zpc2libGUocm93OiBSb3csIHN1Y2Nlc3M6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgdGhpcy5leHBhbmRlZFJvd3MuZ2V0KHJvdykudmlzaWJsZSQubmV4dCh0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5leHBhbmRlZFJvd3MuZ2V0KHJvdykudmlzaWJsZSQubmV4dChmYWxzZSk7XG4gICAgICB0aGlzLmV4cGFuZGVkUm93cy5kZWxldGUocm93KTtcbiAgICAgIHRoaXMudGFibGVSZWYucmVuZGVyUm93cygpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGV2ZW50KSB7XG4gICAgaWYgKFxuICAgICAgKCghZXZlbnQuX2FjdGlvbkNvbnRyb2xzICYmICFldmVudC5zZWFyY2hUZXh0KSB8fCBldmVudC5fYWN0aW9uQ29udHJvbHM/LmZpcnN0Q2hhbmdlKSAmJlxuICAgICAgdGhpcy5jb2x1bW5zSW5pdGlhbGl6ZWRcbiAgICApIHtcbiAgICAgIGNvbnN0IHJlbG9hZCA9ICEhZXZlbnQuX2luZmluaXRlU2Nyb2xsPy5jdXJyZW50VmFsdWUgJiYgIWV2ZW50Ll9pbmZpbml0ZVNjcm9sbD8uZmlyc3RDaGFuZ2U7XG4gICAgICB0aGlzLnRyaWdnZXJMb2FkRGF0YS5lbWl0KHJlbG9hZCk7XG4gICAgfVxuICAgIGlmICghIWV2ZW50Ll9jb2x1bW5zICYmICFldmVudC5fY29sdW1ucy5maXJzdENoYW5nZSkge1xuICAgICAgdGhpcy5yZWxvYWRDb25maWd1cmF0aW9uJC5uZXh0KCk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlQ29sdW1ucygpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMudXBkYXRlR3JpZENvbHVtbnNTaXplKCk7XG4gICAgdGhpcy51cGRhdGVUaEVscygpO1xuICAgIHRoaXMuc2V0dXBSZXNpemVIYW5kbGUoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMudW5zdWJzY3JpYmUkLm5leHQoKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlJC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgZXhwYW5kKHJvdzogUm93KSB7XG4gICAgY29uc3QgaXNTeW5jRXhwYW5kID0gdGhpcy5leHBhbmRhYmxlUm93cyA9PT0gJ1NZTkMnO1xuICAgIGxldCB2aXNpYmxlU3ViamVjdDogU3ViamVjdDxib29sZWFuPiB8IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPjtcbiAgICBpZiAoaXNTeW5jRXhwYW5kKSB7XG4gICAgICB2aXNpYmxlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3QodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZpc2libGVTdWJqZWN0ID0gbmV3IFN1YmplY3QoKTtcbiAgICB9XG4gICAgdGhpcy5leHBhbmRlZFJvd3Muc2V0KHJvdywgeyB2aXNpYmxlJDogdmlzaWJsZVN1YmplY3QgfSk7XG4gICAgdGhpcy50YWJsZVJlZi5yZW5kZXJSb3dzKCk7XG4gICAgcmV0dXJuIHZpc2libGVTdWJqZWN0O1xuICB9XG5cbiAgY29sbGFwc2Uocm93OiBSb3cpOiB2b2lkIHtcbiAgICB0aGlzLmV4cGFuZGVkUm93cy5kZWxldGUocm93KTtcbiAgICB0aGlzLnRhYmxlUmVmLnJlbmRlclJvd3MoKTtcbiAgfVxuXG4gIGlzUm93RXhwYW5kZWQgPSAoXywgcm93OiBSb3cpOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gISF0aGlzLmV4cGFuZGVkUm93cy5nZXQocm93KTtcbiAgfTtcblxuICBzZXRDb2x1bW5zKGNvbmZpZzogR3JpZENvbmZpZykge1xuICAgIGlmICghIXRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5ICYmICFpc0VtcHR5KHRoaXMuX2NvbHVtbnMpKSB7XG4gICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmRhdGFHcmlkU2VydmljZS5hcHBseUNvbmZpZ1RvQ29sdW1ucyhjb25maWcsIHRoaXMuX2NvbHVtbnMpO1xuICAgICAgdGhpcy5jb2x1bW5zSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLl9jb2x1bW5zIHx8IFtdO1xuICAgICAgdGhpcy5jb2x1bW5zSW5pdGlhbGl6ZWQgPSB0aGlzLmNvbHVtbnNJbml0aWFsaXplZCB8fCAhIXRoaXMuX2NvbHVtbnM7XG4gICAgfVxuXG4gICAgdGhpcy5kZWZhdWx0Q29sdW1ucyA9IHRoaXMuY29sdW1ucyB8fCBbXTtcbiAgICB0aGlzLnVwZGF0ZUNvbHVtbnMoKTtcbiAgfVxuXG4gIHNldFBhZ2VTaXplKGNvbmZpZzogR3JpZENvbmZpZykge1xuICAgIGlmICghIWNvbmZpZz8ucGFnaW5hdGlvbikge1xuICAgICAgdGhpcy5wYWdpbmF0aW9uID0ge1xuICAgICAgICAuLi50aGlzLnBhZ2luYXRpb24sXG4gICAgICAgIHBhZ2VTaXplOiBjb25maWcucGFnaW5hdGlvbi5wYWdlU2l6ZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBwYWdlU2l6ZSA9IGdldCh0aGlzLnBhZ2luYXRpb24sICdwYWdlU2l6ZScpO1xuICAgIGlmIChcbiAgICAgIHRoaXMucGFnaW5hdGlvbiAmJlxuICAgICAgIXRoaXMucG9zc2libGVQYWdlU2l6ZXMuZmluZChwb3NzaWJsZVBhZ2VTaXplID0+IHBvc3NpYmxlUGFnZVNpemUgPT09IHBhZ2VTaXplKVxuICAgICkge1xuICAgICAgdGhpcy5wYWdpbmF0aW9uID0geyAuLi50aGlzLnBhZ2luYXRpb24sIHBhZ2VTaXplOiB0aGlzLm1pblBvc3NpYmxlUGFnZVNpemUgfTtcbiAgICB9XG4gIH1cblxuICBvcGVuQ3VzdG9tQ29sdW1uTW9kYWwoKTogdm9pZCB7XG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLmJzTW9kYWxTZXJ2aWNlLnNob3coQ29uZmlndXJlQ3VzdG9tQ29sdW1uQ29tcG9uZW50LCB7XG4gICAgICBjbGFzczogJ21vZGFsLXNtJyxcbiAgICAgIGFyaWFEZXNjcmliZWRieTogJ21vZGFsLWJvZHknLFxuICAgICAgYXJpYUxhYmVsbGVkQnk6ICdtb2RhbC10aXRsZScsXG4gICAgICBpZ25vcmVCYWNrZHJvcENsaWNrOiB0cnVlLFxuICAgICAgaW5pdGlhbFN0YXRlOiB7XG4gICAgICAgIGNvbHVtbnM6IHRoaXMuY29sdW1uc1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbW9kYWxSZWYuY29udGVudC5vbkFkZEN1c3RvbUNvbHVtblxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoY3VzdG9tQ29sdW1uQ29uZmlnOiBDdXN0b21Db2x1bW5Db25maWcpID0+IHtcbiAgICAgICAgICBjb25zdCBmaXJzdEZpeGVkQ29sdW1Qb3NpdGlvbiA9IHRoaXMuY29sdW1ucy5pbmRleE9mKFxuICAgICAgICAgICAgdGhpcy5jb2x1bW5zLmZpbmQoY29sdW1uID0+IGNvbHVtbi5wb3NpdGlvbkZpeGVkKVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5jb2x1bW5zLnNwbGljZShcbiAgICAgICAgICAgIGZpcnN0Rml4ZWRDb2x1bVBvc2l0aW9uID4gLTEgPyBmaXJzdEZpeGVkQ29sdW1Qb3NpdGlvbiA6IHRoaXMuY29sdW1ucy5sZW5ndGgsXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgbmV3IEN1c3RvbUNvbHVtbihjdXN0b21Db2x1bW5Db25maWcpXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbnMoKTtcbiAgICAgICAgICB0aGlzLnRyaWdnZXJFdmVudCh7XG4gICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuQUREX0NVU1RPTV9DT0xVTU4sXG4gICAgICAgICAgICBjb2x1bW46IGN1c3RvbUNvbHVtbkNvbmZpZy5oZWFkZXIgfHwgY3VzdG9tQ29sdW1uQ29uZmlnLm5hbWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbChtb2RhbFJlZi5vbkhpZGRlbilcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4gdGhpcy5vbkFkZEN1c3RvbUNvbHVtbi5lbWl0KGV2ZW50KSk7XG4gIH1cblxuICBhc3luYyByZW1vdmVDdXN0b21Db2x1bW4oXG4gICAgcG9Db25maXJtOiBQb3BvdmVyQ29uZmlybUNvbXBvbmVudCxcbiAgICBjb2x1bW46IENvbHVtbixcbiAgICBkZENvbmZpZ3VyZUNvbHVtbnM6IEJzRHJvcGRvd25EaXJlY3RpdmVcbiAgKSB7XG4gICAgZGRDb25maWd1cmVDb2x1bW5zLmF1dG9DbG9zZSA9IGZhbHNlO1xuICAgIHBvQ29uZmlybS5tZXNzYWdlID0gZ2V0dGV4dCgnRG8geW91IHdhbnQgdG8gcmVtb3ZlIHRoaXMgY29sdW1uPycpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZW1vdmU6IGJvb2xlYW4gPSBhd2FpdCBwb0NvbmZpcm0uc2hvdyh0aGlzLmNvbmZpcm1SZW1vdmVDb2x1bW5CdXR0b25zKTtcbiAgICAgIGlmIChyZW1vdmUpIHtcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sPy5uYW1lICE9PSBjb2x1bW4/Lm5hbWUpO1xuICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbnMoKTtcbiAgICAgICAgdGhpcy5vblJlbW92ZUN1c3RvbUNvbHVtbi5lbWl0KGNvbHVtbik7XG4gICAgICAgIHRoaXMudHJpZ2dlckV2ZW50KHtcbiAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuUkVNT1ZFX0NVU1RPTV9DT0xVTU4sXG4gICAgICAgICAgY29sdW1uOiBjb2x1bW4uaGVhZGVyIHx8IGNvbHVtbi5uYW1lXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZFNlcnZlckZhaWx1cmUoZSk7XG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiAoZGRDb25maWd1cmVDb2x1bW5zLmF1dG9DbG9zZSA9IHRydWUpLCAwKTtcbiAgfVxuXG4gIGFzeW5jIHJlbW92ZUZpbHRlcihmaWx0ZXI6IFBhcnRpYWw8RmlsdGVyQ2hpcD4pIHtcbiAgICBjb25zdCBmaWx0ZXJpbmdNb2RpZmllciA9IGZpbHRlci5leHRlcm5hbEZpbHRlclF1ZXJ5XG4gICAgICA/IHsgZXh0ZXJuYWxGaWx0ZXJRdWVyeTogZmlsdGVyLmV4dGVybmFsRmlsdGVyUXVlcnkgfVxuICAgICAgOiB7IGZpbHRlclByZWRpY2F0ZTogZmlsdGVyLmZpbHRlclByZWRpY2F0ZSB9O1xuICAgIHRoaXMub25CZWZvcmVGaWx0ZXIuZW1pdCh7XG4gICAgICBjb2x1bW5OYW1lOiBmaWx0ZXIuY29sdW1uTmFtZSxcbiAgICAgIGRyb3Bkb3duOiB1bmRlZmluZWQsXG4gICAgICBmaWx0ZXJpbmdNb2RpZmllclxuICAgIH0pO1xuICAgIGlmIChcbiAgICAgIChmaWx0ZXIuZXh0ZXJuYWxGaWx0ZXJRdWVyeSAmJiAhdGhpcy5jaGVja0lmQW55VmFsdWVzRXhpc3QoZmlsdGVyLmV4dGVybmFsRmlsdGVyUXVlcnkpKSB8fFxuICAgICAgZmlsdGVyLmZpbHRlclByZWRpY2F0ZVxuICAgICkge1xuICAgICAgdGhpcy51cGRhdGVGaWx0ZXJpbmcoW2ZpbHRlci5jb2x1bW5OYW1lXSwge1xuICAgICAgICB0eXBlOiBGaWx0ZXJpbmdBY3Rpb25UeXBlLlJlc2V0RmlsdGVyXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5vbkZpbHRlci5lbWl0KHsgY29sdW1uTmFtZTogZmlsdGVyLmNvbHVtbk5hbWUgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nKFtmaWx0ZXIuY29sdW1uTmFtZV0sIHtcbiAgICAgICAgdHlwZTogRmlsdGVyaW5nQWN0aW9uVHlwZS5BcHBseUZpbHRlcixcbiAgICAgICAgcGF5bG9hZDogeyBmaWx0ZXJpbmdNb2RpZmllciB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMub25GaWx0ZXIuZW1pdCh7XG4gICAgICAgIGNvbHVtbk5hbWU6IGZpbHRlci5jb2x1bW5OYW1lLFxuICAgICAgICBkcm9wZG93bjogdW5kZWZpbmVkLFxuICAgICAgICBmaWx0ZXJpbmdNb2RpZmllclxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy50cmlnZ2VyRXZlbnQoe1xuICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLlJFTU9WRV9GSUxURVIsXG4gICAgICBjb2x1bW46IGZpbHRlci5jb2x1bW5OYW1lLFxuICAgICAgZmlsdGVyaW5nTW9kaWZpZXJcbiAgICB9KTtcbiAgfVxuXG4gIHRyYWNrQnlOYW1lKGluZGV4LCBpdGVtKSB7XG4gICAgcmV0dXJuIGl0ZW0ubmFtZTtcbiAgfVxuXG4gIHJlc29sdmVDZWxsVmFsdWUocm93LCBwYXRoKSB7XG4gICAgcmV0dXJuIGZsb3coW1xuICAgICAgeCA9PiB0aGlzLmRhdGFTb3VyY2UucmVzb2x2ZVZhbHVlKHgsIHBhdGgpLFxuICAgICAgdGhpcy5kYXRhU291cmNlLnJlc29sdmVGdW5jdGlvbixcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5ub3JtYWxpemVOaWxcbiAgICBdKShyb3cpO1xuICB9XG5cbiAgY2hhbmdlU29ydE9yZGVyKGNvbHVtbk5hbWUpIHtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZCgoeyBuYW1lIH0pID0+IG5hbWUgPT09IGNvbHVtbk5hbWUpO1xuXG4gICAgaWYgKGNvbHVtbikge1xuICAgICAgY29uc3QgeyBzb3J0T3JkZXIgfSA9IGNvbHVtbjtcblxuICAgICAgaWYgKCFzb3J0T3JkZXIpIHtcbiAgICAgICAgdGhpcy51cGRhdGVTb3J0aW5nKFtjb2x1bW5OYW1lXSwgU29ydGluZ09yZGVyLkFTQyk7XG4gICAgICB9IGVsc2UgaWYgKHNvcnRPcmRlciA9PT0gU29ydGluZ09yZGVyLkFTQykge1xuICAgICAgICB0aGlzLnVwZGF0ZVNvcnRpbmcoW2NvbHVtbk5hbWVdLCBTb3J0aW5nT3JkZXIuREVTQyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVwZGF0ZVNvcnRpbmcoW2NvbHVtbk5hbWVdLCAnJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlU29ydGluZyhjb2x1bW5OYW1lczogc3RyaW5nW10sIHNvcnRPcmRlcjogU29ydE9yZGVyKSB7XG4gICAgdGhpcy50cmlnZ2VyRXZlbnQoe1xuICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkNIQU5HRV9TT1JUSU5HX09SREVSLFxuICAgICAgY29sdW1uczogY29sdW1uTmFtZXMsXG4gICAgICBzb3J0T3JkZXI6IHNvcnRPcmRlciA9PT0gJycgPyAnbm9uZScgOiBzb3J0T3JkZXJcbiAgICB9KTtcblxuICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1ucy5tYXAoKGNvbHVtbik6IENvbHVtbiA9PiB7XG4gICAgICBpZiAoY29sdW1uTmFtZXMuaW5jbHVkZXMoY29sdW1uLm5hbWUpKSB7XG4gICAgICAgIHJldHVybiB7IC4uLmNvbHVtbiwgc29ydE9yZGVyIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb2x1bW47XG4gICAgfSk7XG4gICAgdGhpcy5lbWl0Q29uZmlnQ2hhbmdlKCdzb3J0Jyk7XG5cbiAgICB0aGlzLnJlbG9hZCgpO1xuICB9XG5cbiAgYXBwbHlGaWx0ZXIoY29sdW1uTmFtZSwgZHJvcGRvd24sIGZpbHRlcmluZ01vZGlmaWVyKSB7XG4gICAgdGhpcy50cmlnZ2VyRXZlbnQoe1xuICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkFQUExZX0ZJTFRFUixcbiAgICAgIGNvbHVtbjogY29sdW1uTmFtZSxcbiAgICAgIGZpbHRlcmluZ01vZGlmaWVyXG4gICAgfSk7XG4gICAgdGhpcy5vbkJlZm9yZUZpbHRlci5lbWl0KHsgY29sdW1uTmFtZSwgZHJvcGRvd24sIGZpbHRlcmluZ01vZGlmaWVyIH0pO1xuICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nKFtjb2x1bW5OYW1lXSwge1xuICAgICAgdHlwZTogRmlsdGVyaW5nQWN0aW9uVHlwZS5BcHBseUZpbHRlcixcbiAgICAgIHBheWxvYWQ6IHsgZmlsdGVyaW5nTW9kaWZpZXIgfVxuICAgIH0pO1xuICAgIGRyb3Bkb3duLmhpZGUoKTtcbiAgICB0aGlzLm9uRmlsdGVyLmVtaXQoeyBjb2x1bW5OYW1lLCBkcm9wZG93biwgZmlsdGVyaW5nTW9kaWZpZXIgfSk7XG4gIH1cblxuICByZXNldEZpbHRlcihjb2x1bW5OYW1lLCBkcm9wZG93bikge1xuICAgIHRoaXMudHJpZ2dlckV2ZW50KHsgYWN0aW9uOiBQWF9BQ1RJT05TLlJFU0VUX0ZJTFRFUiwgY29sdW1uOiBjb2x1bW5OYW1lIH0pO1xuICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nKFtjb2x1bW5OYW1lXSwgeyB0eXBlOiBGaWx0ZXJpbmdBY3Rpb25UeXBlLlJlc2V0RmlsdGVyIH0pO1xuICAgIGRyb3Bkb3duLmhpZGUoKTtcbiAgICB0aGlzLm9uRmlsdGVyLmVtaXQoeyBjb2x1bW5OYW1lLCBkcm9wZG93biB9KTtcbiAgfVxuXG4gIGNsZWFyRmlsdGVycyhyZWxvYWQgPSB0cnVlKSB7XG4gICAgdGhpcy51cGRhdGVGaWx0ZXJpbmcoXG4gICAgICB0aGlzLmNvbHVtbnMubWFwKCh7IG5hbWUgfSkgPT4gbmFtZSksXG4gICAgICB7XG4gICAgICAgIHR5cGU6IEZpbHRlcmluZ0FjdGlvblR5cGUuUmVzZXRGaWx0ZXJcbiAgICAgIH0sXG4gICAgICByZWxvYWRcbiAgICApO1xuICAgIHRoaXMub25GaWx0ZXIuZW1pdCh7fSk7XG4gICAgdGhpcy50cmlnZ2VyRXZlbnQoeyBhY3Rpb246IFBYX0FDVElPTlMuQ0xFQVJfRklMVEVSIH0pO1xuICB9XG5cbiAgdXBkYXRlRmlsdGVyaW5nKFxuICAgIGNvbHVtbk5hbWVzOiBzdHJpbmdbXSxcbiAgICBhY3Rpb246IHtcbiAgICAgIHR5cGU6IEZpbHRlcmluZ0FjdGlvblR5cGU7XG4gICAgICBwYXlsb2FkPzogeyBmaWx0ZXJpbmdNb2RpZmllcjogRmlsdGVyaW5nTW9kaWZpZXIgfTtcbiAgICB9LFxuICAgIHJlbG9hZCA9IHRydWVcbiAgKSB7XG4gICAgdGhpcy5jb2x1bW5zID0gdGhpcy5jb2x1bW5zLm1hcChjb2x1bW4gPT4ge1xuICAgICAgaWYgKGNvbHVtbk5hbWVzLmluY2x1ZGVzKGNvbHVtbi5uYW1lKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmNvbHVtbixcbiAgICAgICAgICAuLi4oYWN0aW9uLnR5cGUgPT09IEZpbHRlcmluZ0FjdGlvblR5cGUuQXBwbHlGaWx0ZXJcbiAgICAgICAgICAgID8gYWN0aW9uLnBheWxvYWQuZmlsdGVyaW5nTW9kaWZpZXJcbiAgICAgICAgICAgIDogdGhpcy5vblJlc2V0RmlsdGVyQWN0aW9uKGNvbHVtbikpXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gY29sdW1uO1xuICAgIH0pO1xuXG4gICAgdGhpcy51cGRhdGVGaWx0ZXJpbmdBcHBsaWVkKCk7XG5cbiAgICBpZiAocmVsb2FkKSB7XG4gICAgICB0aGlzLnJlbG9hZCgpO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUZpbHRlcmluZ0FwcGxpZWQoKSB7XG4gICAgdGhpcy5jb2x1bW5zV2l0aEZpbHRlcnNBcHBsaWVkID0gdGhpcy5jb2x1bW5zLmZpbHRlcih0aGlzLmlzQ29sdW1uRmlsdGVyaW5nQXBwbGllZCk7XG4gICAgdGhpcy5maWx0ZXJpbmdBcHBsaWVkID0gdGhpcy5jb2x1bW5zV2l0aEZpbHRlcnNBcHBsaWVkLmxlbmd0aCA+IDA7XG5cbiAgICB0aGlzLmZpbHRlcnNIZWxwUG9wb3Zlckh0bWwgPSB0aGlzLmZpbHRlcmluZ0FwcGxpZWRcbiAgICAgID8gZ2V0dGV4dChcbiAgICAgICAgICAnQ2xpY2sgdGhlIGNvbHVtbiBoZWFkZXJzIHRvIGFwcGx5IGZpbHRlcnMuIENsaWNrIDxiPkFjdGl2ZSBmaWx0ZXJzPC9iPiBidXR0b24gdG8gbWFuYWdlIGFwcGxpZWQgZmlsdGVycy4nXG4gICAgICAgIClcbiAgICAgIDogZ2V0dGV4dCgnQ2xpY2sgdGhlIGNvbHVtbiBoZWFkZXJzIHRvIGFwcGx5IGZpbHRlcnMuJyk7XG4gIH1cblxuICBpc0NvbHVtbkZpbHRlcmluZ0FwcGxpZWQoY29sdW1uOiBDb2x1bW4pOiBib29sZWFuIHtcbiAgICBjb25zdCB7IGZpbHRlcmFibGUsIGZpbHRlclByZWRpY2F0ZSwgZXh0ZXJuYWxGaWx0ZXJRdWVyeSB9ID0gY29sdW1uO1xuXG4gICAgcmV0dXJuICEhKGZpbHRlcmFibGUgJiYgKGZpbHRlclByZWRpY2F0ZSB8fCBleHRlcm5hbEZpbHRlclF1ZXJ5KSk7XG4gIH1cblxuICB1cGRhdGVQYWdpbmF0aW9uKHsgaXRlbXNQZXJQYWdlLCBwYWdlIH0pIHtcbiAgICBjb25zdCBjb25maWdDaGFuZ2VkID0gdGhpcy5wYWdpbmF0aW9uPy5wYWdlU2l6ZSAhPT0gaXRlbXNQZXJQYWdlO1xuICAgIHRoaXMucGFnaW5hdGlvbiA9IHsgLi4udGhpcy5wYWdpbmF0aW9uLCBwYWdlU2l6ZTogaXRlbXNQZXJQYWdlLCBjdXJyZW50UGFnZTogcGFnZSB9O1xuICAgIHRoaXMubG9hZERhdGEoKTtcbiAgICBpZiAoY29uZmlnQ2hhbmdlZCkge1xuICAgICAgdGhpcy5lbWl0Q29uZmlnQ2hhbmdlKCdwYWdpbmF0aW9uJyk7XG4gICAgfVxuICAgIHRoaXMudHJpZ2dlckV2ZW50KHsgYWN0aW9uOiBQWF9BQ1RJT05TLkNIQU5HRV9QQUdJTkFUSU9OLCBpdGVtc1BlclBhZ2UsIHBhZ2UgfSk7XG4gIH1cblxuICBjbGlja1JlbG9hZCgpIHtcbiAgICB0aGlzLnNlYXJjaFRleHQgPSAnJztcbiAgICB0aGlzLnJlbG9hZCgpO1xuICAgIHRoaXMub25SZWxvYWQubmV4dCgpO1xuICAgIHRoaXMudHJpZ2dlckV2ZW50KHsgYWN0aW9uOiBQWF9BQ1RJT05TLlJFTE9BRCB9KTtcbiAgfVxuXG4gIHJlbG9hZChyZWRpcmVjdCA9IHRydWUpIHtcbiAgICB0aGlzLnBhZ2luYXRpb24gPSB7XG4gICAgICAuLi50aGlzLnBhZ2luYXRpb24sXG4gICAgICBjdXJyZW50UGFnZTogcmVkaXJlY3QgPyAxIDogdGhpcy5wYWdpbmF0aW9uLmN1cnJlbnRQYWdlXG4gICAgfTtcbiAgICB0aGlzLnJlY3JlYXRlTG9hZE1vcmVDb21wb25lbnQgPSB0cnVlO1xuICAgIHRoaXMubG9hZERhdGEodHJ1ZSk7XG4gICAgdGhpcy5zY3JvbGxUb1RvcCgpO1xuICB9XG5cbiAgbG9hZE5leHRQYWdlKCk6IFByb21pc2U8SVJlc3VsdExpc3Q8b2JqZWN0Pj4ge1xuICAgIHRoaXMucGFnaW5hdGlvbiA9IHsgLi4udGhpcy5wYWdpbmF0aW9uLCBjdXJyZW50UGFnZTogdGhpcy5wYWdpbmF0aW9uLm5leHRQYWdlIH07XG5cbiAgICB0aGlzLmxvYWREYXRhKCk7XG5cbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlLnJlc3VsdExpc3QkXG4gICAgICAucGlwZSh0YWtlKDEpKSAvLyBpbiBvcmRlciBmb3IgYHRvUHJvbWlzZWAgdG8gd29yaywgdGhlIG9ic2VydmFibGUgbmVlZHMgdG8gY29tcGxldGVcbiAgICAgIC50b1Byb21pc2UoKVxuICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgICAgcGFnaW5nOiB7XG4gICAgICAgICAgICAuLi5yZXN1bHQucGFnaW5nLFxuICAgICAgICAgICAgbmV4dDogdGhpcy5sb2FkTmV4dFBhZ2UuYmluZCh0aGlzKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBhcyBJUmVzdWx0TGlzdDxvYmplY3Q+O1xuICAgICAgfSk7XG4gIH1cblxuICBnZXRDZWxsUmVuZGVyZXJTcGVjKHsgdmFsdWUsIHJvdywgY29sdW1uTmFtZSB9KTogQ2VsbFJlbmRlcmVyU3BlYyB7XG4gICAgcmV0dXJuIHRoaXMuX2dldENlbGxSZW5kZXJlclNwZWMoeyB0eXBlOiAnQ0VMTCcsIHZhbHVlLCByb3csIGNvbHVtbk5hbWUgfSk7XG4gIH1cblxuICBnZXRIZWFkZXJDZWxsUmVuZGVyZXJTcGVjKHsgdmFsdWUsIGNvbHVtbk5hbWUgfSk6IENlbGxSZW5kZXJlclNwZWMge1xuICAgIHJldHVybiB0aGlzLl9nZXRDZWxsUmVuZGVyZXJTcGVjKHsgdHlwZTogJ0hFQURFUicsIHZhbHVlLCByb3c6IHVuZGVmaW5lZCwgY29sdW1uTmFtZSB9KTtcbiAgfVxuXG4gIGdldEZpbHRlcmluZ0Zvcm1SZW5kZXJlclNwZWMoeyBjb2x1bW4sIGRyb3Bkb3duIH0pOiBGaWx0ZXJpbmdGb3JtUmVuZGVyZXJTcGVjIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVuZGVyZXI6XG4gICAgICAgIGdldCh0aGlzLmdldENvbHVtblJlbmRlcmVyKGNvbHVtbiksICdmaWx0ZXJpbmdGb3JtUmVuZGVyZXJEZWYudGVtcGxhdGUnKSB8fFxuICAgICAgICBjb2x1bW4uZmlsdGVyaW5nRm9ybVJlbmRlcmVyQ29tcG9uZW50LFxuICAgICAgY29udGV4dDoge1xuICAgICAgICBwcm9wZXJ0eTogY29sdW1uLFxuICAgICAgICBhcHBseUZpbHRlcjogdGhpcy5hcHBseUZpbHRlci5iaW5kKHRoaXMsIGNvbHVtbi5uYW1lLCBkcm9wZG93biksXG4gICAgICAgIHJlc2V0RmlsdGVyOiB0aGlzLnJlc2V0RmlsdGVyLmJpbmQodGhpcywgY29sdW1uLm5hbWUsIGRyb3Bkb3duKVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzZXRBbGxJdGVtc1NlbGVjdGVkKHNlbGVjdGVkKSB7XG4gICAgdGhpcy5kYXRhU291cmNlLnNlbGVjdGlvbiRcbiAgICAgIC5waXBlKGZpcnN0KCkpXG4gICAgICAuc3Vic2NyaWJlKCh7IGZpbHRlcmVkRGF0YUlkcyB9KSA9PiB0aGlzLnNldEl0ZW1zU2VsZWN0ZWQoZmlsdGVyZWREYXRhSWRzLCBzZWxlY3RlZCkpO1xuICB9XG5cbiAgc2V0QWxsSXRlbXNJbkN1cnJlbnRQYWdlU2VsZWN0ZWQoc2VsZWN0ZWQpIHtcbiAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSQucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoZGF0YSA9PiB0aGlzLnNldEl0ZW1zU2VsZWN0ZWQoZGF0YSwgc2VsZWN0ZWQpKTtcbiAgfVxuXG4gIHNldEl0ZW1zU2VsZWN0ZWQoaXRlbXM6IGFueSwgc2VsZWN0ZWQpIHtcbiAgICBjb25zdCBpdGVtSWRzID0gaXRlbXMubWFwKChpdGVtOiBvYmplY3QgfCBzdHJpbmcpID0+XG4gICAgICB0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgPyBpdGVtW3RoaXMuc2VsZWN0aW9uUHJpbWFyeUtleV0gOiBpdGVtXG4gICAgKTtcblxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtSWRzID0gc2VsZWN0ZWRcbiAgICAgID8gdW5pb24odGhpcy5zZWxlY3RlZEl0ZW1JZHMsIGl0ZW1JZHMpXG4gICAgICA6IHdpdGhvdXQodGhpcy5zZWxlY3RlZEl0ZW1JZHMsIC4uLml0ZW1JZHMpO1xuICAgIHRoaXMuaXRlbXNTZWxlY3QuZW1pdCh0aGlzLnNlbGVjdGVkSXRlbUlkcyk7XG4gIH1cblxuICBjaGFuZ2VTZWxlY3RlZEl0ZW0oaXRlbTogYW55KSB7XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1JZHMgPSBbaXRlbVt0aGlzLnNlbGVjdGlvblByaW1hcnlLZXldXTtcbiAgICB0aGlzLml0ZW1zU2VsZWN0LmVtaXQodGhpcy5zZWxlY3RlZEl0ZW1JZHMpO1xuICB9XG5cbiAgY2FuY2VsKCkge1xuICAgIHRoaXMuc2VsZWN0ZWRJdGVtSWRzID0gW107XG4gICAgdGhpcy5pdGVtc1NlbGVjdC5lbWl0KHRoaXMuc2VsZWN0ZWRJdGVtSWRzKTtcbiAgfVxuXG4gIGlzSXRlbVNlbGVjdGVkKGl0ZW0pIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEl0ZW1JZHMuaW5jbHVkZXMoaXRlbVt0aGlzLnNlbGVjdGlvblByaW1hcnlLZXldKTtcbiAgfVxuXG4gIG9uQ29sdW1uRHJvcCh7IHByZXZpb3VzSW5kZXgsIGN1cnJlbnRJbmRleCB9KSB7XG4gICAgY29uc3QgZGlmZmVyZW50SW5kZXggPSBwcmV2aW91c0luZGV4ICE9PSBjdXJyZW50SW5kZXg7XG5cbiAgICBpZiAoZGlmZmVyZW50SW5kZXgpIHtcbiAgICAgIHRoaXMudHJpZ2dlckV2ZW50KHtcbiAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLlJFT1JERVJfQ09MVU1OUyxcbiAgICAgICAgY29sdW1uOiB0aGlzLmNvbHVtbk5hbWVzW3ByZXZpb3VzSW5kZXhdXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY29sdW1ucy5zcGxpY2UocHJldmlvdXNJbmRleCwgMSk7XG4gICAgICB0aGlzLmNvbHVtbnMuc3BsaWNlKGN1cnJlbnRJbmRleCwgMCwgY29sdW1uWzBdKTtcbiAgICAgIHRoaXMuZW1pdENvbmZpZ0NoYW5nZSgncmVvcmRlckNvbHVtbicpO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlQ29sdW1uTmFtZXMoKTtcbiAgICB0aGlzLnVwZGF0ZUdyaWRDb2x1bW5zU2l6ZSgpO1xuICB9XG5cbiAgdXBkYXRlR3JpZENvbHVtbnNTaXplKCkge1xuICAgIHRoaXMuc3R5bGVzID0ge1xuICAgICAgLi4udGhpcy5zdHlsZXMsXG4gICAgICBncmlkVGVtcGxhdGVDb2x1bW5zOiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0U3R5bGUoXG4gICAgICAgIHRoaXMuY29sdW1uc1xuICAgICAgICAgIC5maWx0ZXIoY29sdW1uID0+IGNvbHVtbi52aXNpYmxlKVxuICAgICAgICAgIC5tYXAoKHsgZ3JpZFRyYWNrU2l6ZSB9KSA9PiBncmlkVHJhY2tTaXplKVxuICAgICAgICAgIC5qb2luKCcgJylcbiAgICAgICksXG4gICAgICBncmlkSW5maW5pdGVTY3JvbGxDb2x1bW46IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RTdHlsZShgMSAvIC0xYClcbiAgICB9O1xuICB9XG5cbiAgdXBkYXRlVGhFbHMoKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnRoRWxzID0gdGhpcy50aFJlZnNcbiAgICAgICAgPyB0aGlzLnRoUmVmcy50b0FycmF5KCkubWFwKCh7IG5hdGl2ZUVsZW1lbnQgfSkgPT4gbmF0aXZlRWxlbWVudClcbiAgICAgICAgOiBbXTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8vIFRvIGJlIHJlbW92ZWQgd2hlbiBjb2x1bW5zIGFyZSB0cmFuc2Zvcm1lZCB0byBvYnNlcnZhYmxlcy5cbiAgaXNEcm9wRG93blBsYWNlZFJpZ2h0KGNvbHVtbjogQ29sdW1uKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGluZGV4T2YoXG4gICAgICAgIHRoaXMuY29sdW1ucy5maWx0ZXIoYyA9PiBjLnZpc2libGUpLFxuICAgICAgICBjb2x1bW5cbiAgICAgICkgPlxuICAgICAgdGhpcy5jb2x1bW5zLmZpbHRlcihjID0+IGMudmlzaWJsZSkubGVuZ3RoIC8gMlxuICAgICk7XG4gIH1cblxuICBlbWl0Q29uZmlnQ2hhbmdlKGV2ZW50VHlwZT86IEdyaWRFdmVudFR5cGUpIHtcbiAgICBpZiAodGhpcy5jb2x1bW5zSW5pdGlhbGl6ZWQpIHtcbiAgICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbHVtbnMubWFwKHRoaXMubWFwQ29sdW1uVG9Db25maWcuYmluZCh0aGlzKSk7XG4gICAgICBjb25zdCBjb25maWcgPSB7IGNvbHVtbnMsIHBhZ2luYXRpb246IHRoaXMucGFnaW5hdGlvbiB9O1xuICAgICAgdGhpcy5vbkNvbmZpZ0NoYW5nZS5lbWl0KGNvbmZpZyk7XG4gICAgICBzd2l0Y2ggKGV2ZW50VHlwZSkge1xuICAgICAgICBjYXNlICdzb3J0JzpcbiAgICAgICAgICB0aGlzLm9uU29ydC5lbWl0KGNvbmZpZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3BhZ2luYXRpb24nOlxuICAgICAgICAgIHRoaXMub25QYWdlU2l6ZUNoYW5nZS5lbWl0KGNvbmZpZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3Jlb3JkZXJDb2x1bW4nOlxuICAgICAgICAgIHRoaXMub25Db2x1bW5SZW9yZGVyZWQuZW1pdChjb25maWcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdjaGFuZ2VDb2x1bW5WaXNpYmlsaXR5JzpcbiAgICAgICAgICB0aGlzLm9uQ29sdW1uVmlzaWJpbGl0eUNoYW5nZS5lbWl0KGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdHJpZ2dlckV2ZW50KGV2ZW50RGF0YSkge1xuICAgIHRoaXMuZ2FpbnNpZ2h0U2VydmljZS50cmlnZ2VyRXZlbnQodGhpcy5wcm9kdWN0RXhwZXJpZW5jZUV2ZW50Py5ldmVudE5hbWUgfHwgUFhfRVZFTlRfTkFNRSwge1xuICAgICAgLi4udGhpcy5wcm9kdWN0RXhwZXJpZW5jZUV2ZW50Py5kYXRhLFxuICAgICAgLi4uZXZlbnREYXRhXG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVDbGljayhyb3c6IFJvdykge1xuICAgIHRoaXMubGFzdENsaWNrZWRSb3cgPSByb3c7XG4gICAgdGhpcy5yb3dDbGljay5lbWl0KHJvdyk7XG4gIH1cblxuICBwcml2YXRlIG9uUmVzZXRGaWx0ZXJBY3Rpb24oY29sdW1uOiBDb2x1bW4pIHtcbiAgICB0aGlzLm9uQ29sdW1uRmlsdGVyUmVzZXQuZW1pdChjb2x1bW4pO1xuICAgIHJldHVybiB7XG4gICAgICBmaWx0ZXJQcmVkaWNhdGU6IHVuZGVmaW5lZCxcbiAgICAgIGV4dGVybmFsRmlsdGVyUXVlcnk6IHVuZGVmaW5lZFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIG1hcENvbHVtblRvQ29uZmlnKGNvbHVtbjogQ29sdW1uKTogQ29sdW1uQ29uZmlnIHwgQ3VzdG9tQ29sdW1uQ29uZmlnIHtcbiAgICBsZXQgY29uZmlnO1xuICAgIGlmIChjb2x1bW4uY3VzdG9tKSB7XG4gICAgICBjb25zdCB7IHZpc2libGUsIHNvcnRPcmRlciwgbmFtZSwgZXh0ZXJuYWxGaWx0ZXJRdWVyeSwgaGVhZGVyLCBwYXRoIH0gPSBjb2x1bW47XG4gICAgICBjb25maWcgPSB7XG4gICAgICAgIHZpc2libGUsXG4gICAgICAgIHNvcnRPcmRlcixcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZmlsdGVyOiB7IGV4dGVybmFsRmlsdGVyUXVlcnkgfSxcbiAgICAgICAgaGVhZGVyLFxuICAgICAgICBwYXRoLFxuICAgICAgICBjdXN0b206IHRydWVcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHsgdmlzaWJsZSwgc29ydE9yZGVyLCBuYW1lLCBleHRlcm5hbEZpbHRlclF1ZXJ5IH0gPSBjb2x1bW47XG4gICAgICBjb25maWcgPSB7IHZpc2libGUsIHNvcnRPcmRlciwgbmFtZSwgZmlsdGVyOiB7IGV4dGVybmFsRmlsdGVyUXVlcnkgfSB9O1xuICAgIH1cblxuICAgIGlmIChpc0VtcHR5KGNvbmZpZz8uZmlsdGVyPy5leHRlcm5hbEZpbHRlclF1ZXJ5KSkge1xuICAgICAgZGVsZXRlIGNvbmZpZy5maWx0ZXI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuXG4gIHByaXZhdGUgbG9hZERhdGEocmVsb2FkID0gZmFsc2UpIHtcbiAgICBjb25zdCB7XG4gICAgICByb3dzLFxuICAgICAgY29sdW1ucyxcbiAgICAgIHBhZ2luYXRpb24sXG4gICAgICBzZWFyY2hUZXh0LFxuICAgICAgc2VydmVyU2lkZURhdGFDYWxsYmFjayxcbiAgICAgIHNlbGVjdGFibGUsXG4gICAgICBzZWxlY3Rpb25QcmltYXJ5S2V5LFxuICAgICAgaW5maW5pdGVTY3JvbGxcbiAgICB9ID0gdGhpcztcblxuICAgIHRoaXMuZGF0YVNvdXJjZS5sb2FkRGF0YSh7XG4gICAgICByb3dzLFxuICAgICAgY29sdW1ucyxcbiAgICAgIHBhZ2luYXRpb24sXG4gICAgICBzZWFyY2hUZXh0LFxuICAgICAgc2VydmVyU2lkZURhdGFDYWxsYmFjayxcbiAgICAgIHNlbGVjdGFibGUsXG4gICAgICBzZWxlY3Rpb25QcmltYXJ5S2V5LFxuICAgICAgaW5maW5pdGVTY3JvbGwsXG4gICAgICByZWxvYWRcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ29sdW1ucygpIHtcbiAgICBjb25zdCBzcGVjaWFsQ29sdW1uID0ge1xuICAgICAgc29ydGFibGU6IGZhbHNlLFxuICAgICAgcG9zaXRpb25GaXhlZDogdHJ1ZVxuICAgIH07XG4gICAgY29uc3Qgc2VsZWN0aW9uQ29sdW1uID0gdGhpcy5zZWxlY3RhYmxlXG4gICAgICA/IHtcbiAgICAgICAgICAuLi5zcGVjaWFsQ29sdW1uLFxuICAgICAgICAgIG5hbWU6IHRoaXMuc2luZ2xlU2VsZWN0aW9uID8gU3BlY2lhbENvbHVtbk5hbWUuUmFkaW9CdXR0b24gOiBTcGVjaWFsQ29sdW1uTmFtZS5DaGVja2JveCxcbiAgICAgICAgICBncmlkVHJhY2tTaXplOiAnMzJweCdcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgYWN0aW9uc0NvbHVtbiA9XG4gICAgICB0aGlzLmFjdGlvbkNvbnRyb2xzPy5sZW5ndGggPiAwXG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uc3BlY2lhbENvbHVtbixcbiAgICAgICAgICAgIG5hbWU6IFNwZWNpYWxDb2x1bW5OYW1lLkFjdGlvbnMsXG4gICAgICAgICAgICBncmlkVHJhY2tTaXplOiAnbWlubWF4KDQwcHgsIGF1dG8pJ1xuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBleHBhbmRhYmxlUm93c0NvbHVtbiA9IHRoaXMuZXhwYW5kYWJsZVJvd3MgIT09ICdOT05FJyA/IG5ldyBFeHBhbmRhYmxlUm93Q29sdW1uKCkgOiBudWxsO1xuICAgIGNvbnN0IGNvbHVtbnMgPSBbZXhwYW5kYWJsZVJvd3NDb2x1bW4sIHNlbGVjdGlvbkNvbHVtbiwgLi4udGhpcy5jb2x1bW5zLCBhY3Rpb25zQ29sdW1uXVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLm1hcCh0aGlzLndpdGhDb2x1bW5EZWZhdWx0cyk7XG5cbiAgICB0aGlzLmNvbHVtbnMgPSB1bmlxQnkoY29sdW1ucywgJ25hbWUnKTtcbiAgICB0aGlzLnVwZGF0ZUNvbHVtbk5hbWVzKCk7XG4gICAgdGhpcy51cGRhdGVHcmlkQ29sdW1uc1NpemUoKTtcbiAgICB0aGlzLnVwZGF0ZVRoRWxzKCk7XG4gICAgdGhpcy51cGRhdGVGaWx0ZXJpbmdBcHBsaWVkKCk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrSWZBbnlWYWx1ZXNFeGlzdChvYmosIHJlc3VsdHMgPSBbXSkge1xuICAgIGlmIChvYmogJiYgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgICAgT2JqZWN0LmVudHJpZXMob2JqKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBvYmpba2V5XSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB0aGlzLmNoZWNrSWZBbnlWYWx1ZXNFeGlzdChvYmpba2V5XSwgcmVzdWx0cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdHMuc29tZSh2YWwgPT4gISF2YWwpO1xuICB9XG5cbiAgcHJpdmF0ZSB3aXRoQ29sdW1uRGVmYXVsdHMoY29sdW1uKTogQ29sdW1uIHtcbiAgICBjb25zdCBkYXRhVHlwZSA9IGNvbHVtbi5kYXRhVHlwZSB8fCBDb2x1bW5EYXRhVHlwZS5UZXh0U2hvcnQ7XG4gICAgY29uc3QgeyBoZWFkZXJDU1NDbGFzc05hbWUsIGNlbGxDU1NDbGFzc05hbWUgfSA9IGNvbHVtbjtcblxuICAgIHJldHVybiB7XG4gICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgcG9zaXRpb25GaXhlZDogZmFsc2UsXG4gICAgICByZXNpemFibGU6IHRydWUsXG4gICAgICBzb3J0YWJsZTogdHJ1ZSxcbiAgICAgIHNvcnRPcmRlcjogJycsXG4gICAgICBmaWx0ZXJhYmxlOiBmYWxzZSxcbiAgICAgIC4uLmNvbHVtbixcbiAgICAgIGRhdGFUeXBlLFxuICAgICAgZ3JpZFRyYWNrU2l6ZTpcbiAgICAgICAgY29sdW1uLmdyaWRUcmFja1NpemUgfHxcbiAgICAgICAgYG1pbm1heCgke21pbkNvbHVtbkdyaWRUcmFja1NpemV9cHgsICR7cmF0aW9zQnlDb2x1bW5UeXBlc1tkYXRhVHlwZV19ZnIpYCxcbiAgICAgIGhlYWRlckNTU0NsYXNzTmFtZTpcbiAgICAgICAgKHR5cGVvZiBoZWFkZXJDU1NDbGFzc05hbWUgPT09ICdzdHJpbmcnXG4gICAgICAgICAgPyBoZWFkZXJDU1NDbGFzc05hbWUuc3BsaXQoJyAnKVxuICAgICAgICAgIDogaGVhZGVyQ1NTQ2xhc3NOYW1lKSB8fCBbXSxcbiAgICAgIGNlbGxDU1NDbGFzc05hbWU6XG4gICAgICAgICh0eXBlb2YgY2VsbENTU0NsYXNzTmFtZSA9PT0gJ3N0cmluZycgPyBjZWxsQ1NTQ2xhc3NOYW1lLnNwbGl0KCcgJykgOiBjZWxsQ1NTQ2xhc3NOYW1lKSB8fFxuICAgICAgICBbXVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNvbHVtbk5hbWVzKCkge1xuICAgIHRoaXMuY29sdW1uTmFtZXMgPSB0aGlzLmNvbHVtbnMubWFwKCh7IG5hbWUgfSkgPT4gbmFtZSk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwUmVzaXplSGFuZGxlKCkge1xuICAgIGNvbnN0IHJlc2l6ZUhhbmRsZURyYWckID0gdGhpcy5yZXNpemVIYW5kbGVNb3VzZURvd24kLnBpcGUoXG4gICAgICB0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpLFxuICAgICAgdGFwKCgpID0+IHRoaXMuY2xlYXJNb3VzZUhpZ2hsaWdodHMoKSksXG4gICAgICBtZXJnZU1hcCgoeyBldmVudCwgdGFyZ2V0Q29sdW1uTmFtZSB9KSA9PiB7XG4gICAgICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1ucy5tYXAoY29sdW1uID0+IHtcbiAgICAgICAgICBpZiAoY29sdW1uLm5hbWUgPT09IHRhcmdldENvbHVtbk5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLmNvbHVtbixcbiAgICAgICAgICAgICAgaGVhZGVyQ1NTQ2xhc3NOYW1lOiB1bmlvbihjb2x1bW4uaGVhZGVyQ1NTQ2xhc3NOYW1lLCBbJ2hlYWRlci0tYmVpbmctcmVzaXplZCddKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY29sdW1uO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmhlYWRlckJlaW5nUmVzaXplZCA9IHtcbiAgICAgICAgICBjb2x1bW5OYW1lOiB0YXJnZXRDb2x1bW5OYW1lLFxuICAgICAgICAgIGVsOiAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KT8ucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuc3R5bGVzID0ge1xuICAgICAgICAgIC4uLnRoaXMuc3R5bGVzLFxuICAgICAgICAgIHRhYmxlQ3Vyc29yOiAnY29sLXJlc2l6ZSdcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gdGhpcy5yZXNpemVIYW5kbGVDb250YWluZXJNb3VzZU1vdmUkLnBpcGUoXG4gICAgICAgICAgdGFwKCgpID0+IHRoaXMuY2xlYXJNb3VzZUhpZ2hsaWdodHMoKSksXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMucmVzaXplSGFuZGxlQ29udGFpbmVyTW91c2VVcCQpXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICByZXNpemVIYW5kbGVEcmFnJC5zdWJzY3JpYmUoKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmNvbHVtbnMubWFwKChjb2x1bW4sIGkpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5oZWFkZXJCZWluZ1Jlc2l6ZWQgJiYgY29sdW1uLm5hbWUgPT09IHRoaXMuaGVhZGVyQmVpbmdSZXNpemVkLmNvbHVtbk5hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbENvbnRhaW5lckRpdjogSFRNTERpdkVsZW1lbnQgPSB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xuXG4gICAgICAgICAgICAvLyBSZWFkIHNjcm9sbENvbnRhaW5lckVsJ3Mgb2Zmc2V0IGxlZnQgcmVsYXRpdmUgdG8gdGhlIGRvY3VtZW50LlxuICAgICAgICAgICAgY29uc3QgaG9yaXpvbnRhbE9mZnNldCA9IHNjcm9sbENvbnRhaW5lckRpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xuXG4gICAgICAgICAgICAvLyBBZGp1c3Qgd2l0aCB0aGUgc2Nyb2xsQ29udGFpbmVyRWwgaG9yaXpvbnRhbCBzY3JvbGwgcG9zaXRpb24uXG4gICAgICAgICAgICBjb25zdCBob3Jpem9udGFsU2Nyb2xsT2Zmc2V0ID0gc2Nyb2xsQ29udGFpbmVyRGl2LnNjcm9sbExlZnQgLSBob3Jpem9udGFsT2Zmc2V0O1xuXG4gICAgICAgICAgICAvLyBSZWFkIGxlZnQgb2Zmc2V0IG9mIHRoZSByZXNpemVkIGhlYWRlci5cbiAgICAgICAgICAgIGNvbnN0IGhlYWRlck9mZnNldExlZnQgPSB0aGlzLmhlYWRlckJlaW5nUmVzaXplZC5lbC5vZmZzZXRMZWZ0IHx8IDA7XG5cbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgZGVzaXJlZCB3aWR0aC5cbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gaG9yaXpvbnRhbFNjcm9sbE9mZnNldCArIGV2ZW50LmNsaWVudFggLSBoZWFkZXJPZmZzZXRMZWZ0O1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgY29sdW1uIG9iamVjdCB3aXRoIHRoZSBuZXcgc2l6ZSB2YWx1ZSwgZW5mb3JjZSBvdXIgbWluaW11bSBzaXplLlxuICAgICAgICAgICAgICBncmlkVHJhY2tTaXplOiBgJHtNYXRoLm1heChtaW5Db2x1bW5HcmlkVHJhY2tTaXplLCB3aWR0aCl9cHhgXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEZvciB0aGUgb3RoZXIgaGVhZGVycyB3aGljaCBkb24ndCBoYXZlIGEgc2V0IHdpZHRoLCBmaXggaXQgdG8gdGhlaXIgY29tcHV0ZWQgd2lkdGguXG4gICAgICAgICAgaWYgKGNvbHVtbi5ncmlkVHJhY2tTaXplLnN0YXJ0c1dpdGgoJ21pbm1heCcpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgICAgICAgIC8vIGlzbid0IGZpeGVkIHlldCAoaXQgd291bGQgYmUgYSBweCB2YWx1ZSlcbiAgICAgICAgICAgICAgZ3JpZFRyYWNrU2l6ZTogYCR7X3BhcnNlSW50KHRoaXMudGhFbHNbaV0uY2xpZW50V2lkdGgpfXB4YFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY29sdW1uO1xuICAgICAgICB9KTtcblxuICAgICAgICAvKlxuICAgICAgICAgKiBVcGRhdGUgdGhlIGNvbHVtbiBzaXplcy5cbiAgICAgICAgICogTm90ZTogZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zIHNldHMgdGhlIHdpZHRoIGZvciBhbGwgY29sdW1ucyBpbiBvbmUgdmFsdWUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnVwZGF0ZUdyaWRDb2x1bW5zU2l6ZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlc2l6ZUhhbmRsZUNvbnRhaW5lck1vdXNlVXAkLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmhlYWRlckJlaW5nUmVzaXplZCkge1xuICAgICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmNvbHVtbnMubWFwKGNvbHVtbiA9PiB7XG4gICAgICAgICAgaWYgKGNvbHVtbi5uYW1lID09PSB0aGlzLmhlYWRlckJlaW5nUmVzaXplZC5jb2x1bW5OYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgICAgICAgIGhlYWRlckNTU0NsYXNzTmFtZTogd2l0aG91dChjb2x1bW4uaGVhZGVyQ1NTQ2xhc3NOYW1lLCAnaGVhZGVyLS1iZWluZy1yZXNpemVkJylcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaGVhZGVyQmVpbmdSZXNpemVkID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHRoaXMuc3R5bGVzID0ge1xuICAgICAgICAgIC4uLnRoaXMuc3R5bGVzLFxuICAgICAgICAgIHRhYmxlQ3Vyc29yOiAnYXV0bydcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJNb3VzZUhpZ2hsaWdodHMoKSB7XG4gICAgaWYgKHdpbmRvdy5nZXRTZWxlY3Rpb24pIHtcbiAgICAgIHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9nZXRDZWxsUmVuZGVyZXJTcGVjKHsgdHlwZSwgdmFsdWUsIHJvdywgY29sdW1uTmFtZSB9KTogQ2VsbFJlbmRlcmVyU3BlYyB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5zLmZpbmQoKHsgbmFtZSB9KSA9PiBuYW1lID09PSBjb2x1bW5OYW1lKTtcbiAgICBjb25zdCBjb2x1bW5SZW5kZXJlciA9IHRoaXMuZ2V0Q29sdW1uUmVuZGVyZXIoY29sdW1uKTtcbiAgICBjb25zdCByZW5kZXJlclRlbXBsYXRlID0gZ2V0KFxuICAgICAgY29sdW1uUmVuZGVyZXIsXG4gICAgICBgJHt0eXBlID09PSAnSEVBREVSJyA/ICdoZWFkZXJDZWxsUmVuZGVyZXJEZWYnIDogJ2NlbGxSZW5kZXJlckRlZid9LnRlbXBsYXRlYFxuICAgICk7XG5cbiAgICBjb25zdCB7IGNlbGxSZW5kZXJlckNvbXBvbmVudCwgaGVhZGVyQ2VsbFJlbmRlcmVyQ29tcG9uZW50IH0gPSBjb2x1bW47XG4gICAgY29uc3QgcmVuZGVyZXJDb21wb25lbnQgPVxuICAgICAgdHlwZSA9PT0gJ0hFQURFUicgPyBoZWFkZXJDZWxsUmVuZGVyZXJDb21wb25lbnQgOiBjZWxsUmVuZGVyZXJDb21wb25lbnQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcmVuZGVyZXI6IHJlbmRlcmVyVGVtcGxhdGUgfHwgcmVuZGVyZXJDb21wb25lbnQsXG4gICAgICBjb250ZXh0OiB7XG4gICAgICAgIHZhbHVlLFxuICAgICAgICBpdGVtOiByb3csXG4gICAgICAgIHByb3BlcnR5OiBjb2x1bW5cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb2x1bW5SZW5kZXJlcihjb2x1bW4pOiBDb2x1bW5EaXJlY3RpdmUge1xuICAgIHJldHVybiB0aGlzLmNvbHVtblJlbmRlcmVycy50b0FycmF5KCkuZmluZCgoeyBuYW1lIH0pID0+IG5hbWUgPT09IGNvbHVtbi5uYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRmlsdGVyaW5nTGFiZWxzUGFyYW1zKHN0YXRzOiBEYXRhU291cmNlU3RhdHMpIHtcbiAgICB0aGlzLmZpbHRlcmluZ0xhYmVsc1BhcmFtcyA9IHtcbiAgICAgIGZpbHRlcmVkSXRlbXNDb3VudDogc3RhdHMuZmlsdGVyZWRTaXplLFxuICAgICAgYWxsSXRlbXNDb3VudDogc3RhdHMuc2l6ZVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVBhZ2luYXRpb25MYWJlbFBhcmFtcyhzdGF0czogRGF0YVNvdXJjZVN0YXRzKSB7XG4gICAgaWYgKHN0YXRzLm5leHRQYWdlKSB7XG4gICAgICB0aGlzLnBhZ2luYXRpb24gPSB7IC4uLnRoaXMucGFnaW5hdGlvbiwgbmV4dFBhZ2U6IHN0YXRzLm5leHRQYWdlIH07XG4gICAgfVxuXG4gICAgY29uc3QgcGFnZUZpcnN0SXRlbUlkeCA9IChzdGF0cy5jdXJyZW50UGFnZSAtIDEpICogc3RhdHMuZmlyc3RQYWdlU2l6ZSArIDE7XG4gICAgdGhpcy5wYWdpbmF0aW9uTGFiZWxQYXJhbXMgPSB7XG4gICAgICBwYWdlRmlyc3RJdGVtSWR4LFxuICAgICAgcGFnZUxhc3RJdGVtSWR4OiBwYWdlRmlyc3RJdGVtSWR4ICsgKHN0YXRzLmN1cnJlbnRQYWdlU2l6ZSAtIDEpLFxuICAgICAgaXRlbXNUb3RhbDogc3RhdHMuZmlsdGVyZWRTaXplXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUGFnaW5hdGlvbldoZW5Ob0RldmljZXNMYXN0UGFnZShzdGF0czogRGF0YVNvdXJjZVN0YXRzKSB7XG4gICAgaWYgKCFzdGF0cy5uZXh0UGFnZSAmJiBzdGF0cy5jdXJyZW50UGFnZVNpemUgPT09IDAgJiYgc3RhdHMuc2l6ZSA+IDApIHtcbiAgICAgIHRoaXMucGFnaW5hdGlvbiA9IHtcbiAgICAgICAgLi4udGhpcy5wYWdpbmF0aW9uLFxuICAgICAgICBjdXJyZW50UGFnZTogdGhpcy5wYWdpbmF0aW9uLmN1cnJlbnRQYWdlIC0gMSxcbiAgICAgICAgbmV4dFBhZ2U6IG51bGxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVMb2FkTW9yZUNvbXBvbmVudChzdGF0czogRGF0YVNvdXJjZVN0YXRzKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pbmZpbml0ZVNjcm9sbCAmJlxuICAgICAgc3RhdHMgJiZcbiAgICAgIHN0YXRzLm5leHRQYWdlICYmXG4gICAgICAoIXRoaXMubG9hZE1vcmVDb21wb25lbnQgfHwgdGhpcy5yZWNyZWF0ZUxvYWRNb3JlQ29tcG9uZW50KVxuICAgICkge1xuICAgICAgdGhpcy5yZWNyZWF0ZUxvYWRNb3JlQ29tcG9uZW50ID0gZmFsc2U7XG4gICAgICB0aGlzLmluZmluaXRlU2Nyb2xsQ29udGFpbmVyLmNsZWFyKCk7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSB0aGlzLmluZmluaXRlU2Nyb2xsQ29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChMb2FkTW9yZUNvbXBvbmVudCk7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IGNvbXBvbmVudFJlZi5pbnN0YW5jZSBhcyBMb2FkTW9yZUNvbXBvbmVudDtcbiAgICAgIGluc3RhbmNlLnVzZUludGVyc2VjdGlvbiA9IHRoaXMuaW5maW5pdGVTY3JvbGwgPT09ICdhdXRvJyB8fCB0aGlzLmluZmluaXRlU2Nyb2xsID09PSAnaGlkZGVuJztcbiAgICAgIGluc3RhbmNlLmhpZGRlbiA9IHRoaXMuaW5maW5pdGVTY3JvbGwgPT09ICdoaWRkZW4nO1xuICAgICAgaW5zdGFuY2UucGFnaW5nID0ge1xuICAgICAgICBuZXh0UGFnZTogc3RhdHMubmV4dFBhZ2UsXG4gICAgICAgIG5leHQ6IHRoaXMubG9hZE5leHRQYWdlLmJpbmQodGhpcylcbiAgICAgIH0gYXMgUGFnaW5nPElJZGVudGlmaWVkPjtcbiAgICAgIGluc3RhbmNlLmxvYWROZXh0TGFiZWwgPSB0aGlzLmxvYWRNb3JlSXRlbXNMYWJlbDtcbiAgICAgIGluc3RhbmNlLmxvYWRpbmdMYWJlbCA9IHRoaXMubG9hZGluZ0l0ZW1zTGFiZWw7XG4gICAgICB0aGlzLmxvYWRNb3JlQ29tcG9uZW50ID0gaW5zdGFuY2U7XG4gICAgfSBlbHNlIGlmICh0aGlzLmxvYWRNb3JlQ29tcG9uZW50ICYmICFzdGF0cy5uZXh0UGFnZSkge1xuICAgICAgdGhpcy5sb2FkTW9yZUNvbXBvbmVudC5wYWdpbmcgPSB7XG4gICAgICAgIG5leHRQYWdlOiBudWxsXG4gICAgICB9IGFzIFBhZ2luZzxJSWRlbnRpZmllZD47XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzY3JvbGxUb1RvcCgpIHtcbiAgICBpZiAodGhpcy5pbmZpbml0ZVNjcm9sbCkge1xuICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc0FuZFBlcnNpc3RDb25maWdDaGFuZ2UoKSB7XG4gICAgbWVyZ2UoXG4gICAgICBtZXJnZShcbiAgICAgICAgdGhpcy5vblNvcnQsXG4gICAgICAgIHRoaXMub25QYWdlU2l6ZUNoYW5nZSxcbiAgICAgICAgdGhpcy5vbkNvbHVtblJlb3JkZXJlZCxcbiAgICAgICAgdGhpcy5vbkNvbHVtblZpc2liaWxpdHlDaGFuZ2VcbiAgICAgICkucGlwZShtYXAoY29uZmlnID0+IGNvbmZpZy5jb2x1bW5zKSksXG4gICAgICBtZXJnZSh0aGlzLm9uQWRkQ3VzdG9tQ29sdW1uLCB0aGlzLm9uUmVtb3ZlQ3VzdG9tQ29sdW1uKS5waXBlKFxuICAgICAgICBtYXAoKCkgPT4gKHRoaXMuY29sdW1ucyB8fCBbXSkubWFwKHRoaXMubWFwQ29sdW1uVG9Db25maWcuYmluZCh0aGlzKSkpXG4gICAgICApLFxuICAgICAgdGhpcy5vbkZpbHRlci5waXBlKFxuICAgICAgICBtYXAoKHsgY29sdW1uTmFtZSwgZmlsdGVyaW5nTW9kaWZpZXIgfSkgPT5cbiAgICAgICAgICB0aGlzLmNvbHVtbnMubWFwKHRoaXMubWFwQ29sdW1uVG9Db25maWcuYmluZCh0aGlzKSkubWFwKChjb2x1bW46IENvbHVtbkNvbmZpZykgPT4ge1xuICAgICAgICAgICAgaWYgKGlzTmlsKGNvbHVtbk5hbWUpKSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSBjb2x1bW4uZmlsdGVyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4ubmFtZSA9PT0gY29sdW1uTmFtZSkge1xuICAgICAgICAgICAgICBpZiAoaXNFbXB0eShmaWx0ZXJpbmdNb2RpZmllcikpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgY29sdW1uLmZpbHRlcjtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb2x1bW4uZmlsdGVyID0gZmlsdGVyaW5nTW9kaWZpZXI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoY29sdW1uczogQXJyYXk8Q29sdW1uQ29uZmlnIHwgQ3VzdG9tQ29sdW1uQ29uZmlnPikgPT4gKHtcbiAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgIHBhZ2luYXRpb246IHsgcGFnZVNpemU6IHRoaXMucGFnaW5hdGlvbi5wYWdlU2l6ZSB9XG4gICAgICAgIH0pKSxcbiAgICAgICAgZmlsdGVyKCgpID0+ICEhdGhpcy5jb25maWd1cmF0aW9uU3RyYXRlZ3kpLFxuICAgICAgICB0aGlzLnRyaW1GaWx0ZXJDb25maWdQaXBlKCksXG4gICAgICAgIHRoaXMudHJpbVNvcnRDb25maWdQaXBlKCksXG4gICAgICAgIHRoaXMudHJpbUN1c3RvbUNvbHVtbkNvbmZpZ1BpcGUoKSxcbiAgICAgICAgdGhpcy5pZ25vcmVDb2x1bW5PcmRlclBpcGUoKSxcbiAgICAgICAgdGhpcy5pZ25vcmVDb2x1bW5WaXNpYmlsaXR5UGlwZSgpLFxuICAgICAgICBjb25jYXRNYXAoKGNvbmZpZzogR3JpZENvbmZpZykgPT4gdGhpcy5jb25maWd1cmF0aW9uU3RyYXRlZ3kuc2F2ZUNvbmZpZyQoY29uZmlnKSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgdHJpbUZpbHRlckNvbmZpZ1BpcGUoKTogVW5hcnlGdW5jdGlvbjxPYnNlcnZhYmxlPEdyaWRDb25maWc+LCBPYnNlcnZhYmxlPEdyaWRDb25maWc+PiB7XG4gICAgcmV0dXJuIHBpcGUoXG4gICAgICB0aGlzLmNoZWNrRXZlbnRQaXBlKCdmaWx0ZXInLCBjb25maWcgPT4ge1xuICAgICAgICBjb25maWcuY29sdW1ucyA9IChjb25maWcuY29sdW1ucyB8fCBbXSkubWFwKGNvbCA9PiB7XG4gICAgICAgICAgZGVsZXRlIGNvbC5maWx0ZXI7XG4gICAgICAgICAgcmV0dXJuIGNvbDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgdHJpbVNvcnRDb25maWdQaXBlKCk6IFVuYXJ5RnVuY3Rpb248T2JzZXJ2YWJsZTxHcmlkQ29uZmlnPiwgT2JzZXJ2YWJsZTxHcmlkQ29uZmlnPj4ge1xuICAgIHJldHVybiBwaXBlKFxuICAgICAgdGhpcy5jaGVja0V2ZW50UGlwZSgnc29ydCcsIGNvbmZpZyA9PiB7XG4gICAgICAgIGNvbmZpZy5jb2x1bW5zID0gKGNvbmZpZy5jb2x1bW5zIHx8IFtdKS5tYXAoY29sID0+IHtcbiAgICAgICAgICBjb2wuc29ydE9yZGVyID0gJyc7XG4gICAgICAgICAgcmV0dXJuIGNvbDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgdHJpbUN1c3RvbUNvbHVtbkNvbmZpZ1BpcGUoKTogVW5hcnlGdW5jdGlvbjxcbiAgICBPYnNlcnZhYmxlPEdyaWRDb25maWc+LFxuICAgIE9ic2VydmFibGU8R3JpZENvbmZpZz5cbiAgPiB7XG4gICAgcmV0dXJuIHBpcGUoXG4gICAgICB0aGlzLmNoZWNrRXZlbnRQaXBlKCdjdXN0b21Db2x1bW5zJywgY29uZmlnID0+IHtcbiAgICAgICAgY29uZmlnLmNvbHVtbnMgPSAoY29uZmlnLmNvbHVtbnMgfHwgW10pLmZpbHRlcigoY29sOiBDdXN0b21Db2x1bW5Db25maWcpID0+ICFjb2wuY3VzdG9tKTtcblxuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpZ25vcmVDb2x1bW5PcmRlclBpcGUoKTogVW5hcnlGdW5jdGlvbjxPYnNlcnZhYmxlPEdyaWRDb25maWc+LCBPYnNlcnZhYmxlPEdyaWRDb25maWc+PiB7XG4gICAgcmV0dXJuIHBpcGUoXG4gICAgICB0aGlzLmNoZWNrRXZlbnRQaXBlKCdvcmRlcicsIGNvbmZpZyA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZ3VyYXRpb25TdHJhdGVneS5nZXRDb25maWckKCkucGlwZShcbiAgICAgICAgICBtYXAob2xkQ29uZmlnID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9sZENvbHVtbnM6IENvbHVtbkNvbmZpZ1tdID1cbiAgICAgICAgICAgICAgb2xkQ29uZmlnPy5jb2x1bW5zIHx8ICh0aGlzLmRlZmF1bHRDb2x1bW5zIGFzIENvbHVtbkNvbmZpZ1tdKTtcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIGN1c3RvbSBjb2x1bW5zIGhhdmUgYmVlbiBhZGRlZFxuICAgICAgICAgICAgY29uc3QgY29sdW1uc0FkZGVkID0gKGNvbmZpZy5jb2x1bW5zIHx8IFtdKS5maWx0ZXIoXG4gICAgICAgICAgICAgIGNvbCA9PiAhb2xkQ29sdW1ucy5maW5kKG9sZCA9PiBvbGQubmFtZSA9PT0gY29sLm5hbWUpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25maWcuY29sdW1ucyA9IFtcbiAgICAgICAgICAgICAgLi4ub2xkQ29sdW1ucy5tYXAob2xkQ29sID0+XG4gICAgICAgICAgICAgICAgKGNvbmZpZy5jb2x1bW5zIHx8IFtdKS5maW5kKG5ld0NvbCA9PiBuZXdDb2wubmFtZSA9PT0gb2xkQ29sLm5hbWUpXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIC4uLmNvbHVtbnNBZGRlZFxuICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpZ25vcmVDb2x1bW5WaXNpYmlsaXR5UGlwZSgpOiBVbmFyeUZ1bmN0aW9uPFxuICAgIE9ic2VydmFibGU8R3JpZENvbmZpZz4sXG4gICAgT2JzZXJ2YWJsZTxHcmlkQ29uZmlnPlxuICA+IHtcbiAgICByZXR1cm4gcGlwZShcbiAgICAgIHRoaXMuY2hlY2tFdmVudFBpcGUoJ3Zpc2liaWxpdHknLCBjb25maWcgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uU3RyYXRlZ3kuZ2V0Q29uZmlnJCgpLnBpcGUoXG4gICAgICAgICAgbWFwKG9sZENvbmZpZyA9PiB7XG4gICAgICAgICAgICBjb25maWcuY29sdW1ucyA9IChjb25maWcuY29sdW1ucyB8fCBbXSkubWFwKG5ld0NvbCA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbHVtbnM6IENvbHVtbkNvbmZpZ1tdID1cbiAgICAgICAgICAgICAgICBvbGRDb25maWc/LmNvbHVtbnMgfHwgKHRoaXMuZGVmYXVsdENvbHVtbnMgYXMgQ29sdW1uQ29uZmlnW10pO1xuICAgICAgICAgICAgICBjb25zdCBvbGRDb2wgPSBjb2x1bW5zLmZpbmQoKGNvbDogYW55KSA9PiBuZXdDb2wubmFtZSA9PT0gY29sLm5hbWUpO1xuICAgICAgICAgICAgICBuZXdDb2wudmlzaWJsZSA9IG9sZENvbD8udmlzaWJsZSA/PyB0cnVlO1xuICAgICAgICAgICAgICByZXR1cm4gbmV3Q29sO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tFdmVudFBpcGUoXG4gICAgY29uZmlnUGFydDogR3JpZENvbmZpZ1BhcnQsXG4gICAgdHJpbUV2ZW50RGF0YUZuOiAoY29uZmlnOiBHcmlkQ29uZmlnKSA9PiBHcmlkQ29uZmlnIHwgT2JzZXJ2YWJsZTxHcmlkQ29uZmlnPlxuICApOiBVbmFyeUZ1bmN0aW9uPE9ic2VydmFibGU8R3JpZENvbmZpZz4sIE9ic2VydmFibGU8R3JpZENvbmZpZz4+IHtcbiAgICByZXR1cm4gcGlwZShcbiAgICAgIGNvbmNhdE1hcCgoY29uZmlnOiBHcmlkQ29uZmlnKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc29sdmVDb25maWdGaWx0ZXJcbiAgICAgICAgICAuY2FsbCh0aGlzLCBjb25maWdQYXJ0KVxuICAgICAgICAgIC5waXBlKG1hcChrZWVwRXZlbnREYXRhID0+ICh7IGNvbmZpZywga2VlcEV2ZW50RGF0YSB9KSkpO1xuICAgICAgfSksXG4gICAgICBtYXAoKHsgY29uZmlnLCBrZWVwRXZlbnREYXRhIH0pID0+XG4gICAgICAgIGtlZXBFdmVudERhdGEgPyBjb25maWcgOiB0cmltRXZlbnREYXRhRm4uY2FsbCh0aGlzLCBjb25maWcpXG4gICAgICApLFxuICAgICAgY29uY2F0TWFwKGNvbmZpZyA9PiAoaXNPYnNlcnZhYmxlKGNvbmZpZykgPyBjb25maWcgOiBvZihjb25maWcpKSBhcyBPYnNlcnZhYmxlPEdyaWRDb25maWc+KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVDb25maWdGaWx0ZXIoY29uZmlnUGFydDogR3JpZENvbmZpZ1BhcnQpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuIHwgT2JzZXJ2YWJsZTxib29sZWFuPiB8IFByb21pc2U8Ym9vbGVhbj47XG4gICAgY29uc3QgdmFsdWVPckZuID0gdGhpcy5jb25maWd1cmF0aW9uU3RyYXRlZ3kuZ2V0Q29udGV4dCgpPy5jb25maWdGaWx0ZXI/Lltjb25maWdQYXJ0XTtcbiAgICBpZiAodHlwZW9mIHZhbHVlT3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmVzdWx0ID0gdmFsdWVPckZuKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IHZhbHVlT3JGbjtcbiAgICB9XG4gICAgcmV0dXJuIHRvT2JzZXJ2YWJsZShyZXN1bHQgPz8gdHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIHNhZmVseUludm9rZU1hdGNoZXIoXG4gICAgbWF0Y2hlc0ZuOiAoXG4gICAgICByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgICBjb250ZXh0PzogR3JpZENvbmZpZ0NvbnRleHRcbiAgICApID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+IHwgT2JzZXJ2YWJsZTxib29sZWFuPixcbiAgICByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgY29udGV4dD86IEdyaWRDb25maWdDb250ZXh0XG4gICkge1xuICAgIGlmIChtYXRjaGVzRm4pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtYXRjaGVzRm4ocm91dGUsIGNvbnRleHQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwidGFibGUtZGF0YS1ncmlkLXNjcm9sbFwiXG4gICNzY3JvbGxcbiAgW25nQ2xhc3NdPVwie1xuICAgICd0YWJsZS1kYXRhLWdyaWRfX292ZXJsYXknOiAoZGF0YVNvdXJjZS5sb2FkaW5nJCB8IGFzeW5jKSAmJiAhbG9hZE1vcmVDb21wb25lbnQ/LmlzTG9hZGluZ1xuICB9XCJcbiAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLXRhYmxlLWRhdGEtZ3JpZC1zY3JvbGxcIlxuPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJ0YWJsZS1kYXRhLWdyaWRfX2xvYWRpbmctLXdyYXBwZXJcIlxuICAgICpuZ0lmPVwiKGRhdGFTb3VyY2UubG9hZGluZyQgfCBhc3luYykgJiYgIWxvYWRNb3JlQ29tcG9uZW50Py5pc0xvYWRpbmdcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cInRhYmxlLWRhdGEtZ3JpZF9fbG9hZGluZy0tbG9hZGVyXCI+XG4gICAgICA8Yzh5LWxvYWRpbmdcbiAgICAgICAgbGF5b3V0PVwiYXBwbGljYXRpb25cIlxuICAgICAgICBbbWVzc2FnZV09XCJsb2FkaW5nSXRlbXNMYWJlbFwiXG4gICAgICA+PC9jOHktbG9hZGluZz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdlxuICAgIGNsYXNzPVwidGFibGUtZGF0YS1ncmlkLWhlYWRlciBzZXBhcmF0b3IgbGFyZ2UtcGFkZGluZ1wiXG4gICAgKm5nSWY9XCJkaXNwbGF5T3B0aW9ucy5ncmlkSGVhZGVyXCJcbiAgPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiaDRcIlxuICAgICAgW25nQ2xhc3NdPVwieyAnbS1yLTE2JzogISF0aXRsZSB9XCJcbiAgICA+XG4gICAgICB7eyB0aXRsZSB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvZGl2PlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRpc3BsYXlPcHRpb25zLmZpbHRlclwiPlxuICAgICAgPHNwYW4gKm5nSWY9XCIhZmlsdGVyaW5nQXBwbGllZFwiPlxuICAgICAgICA8c21hbGxcbiAgICAgICAgICBjbGFzcz1cIm0tci00XCJcbiAgICAgICAgICAqbmdJZj1cIiEhZmlsdGVyaW5nTGFiZWxzUGFyYW1zLmFsbEl0ZW1zQ291bnRcIlxuICAgICAgICAgIG5nTm9uQmluZGFibGVcbiAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICBbdHJhbnNsYXRlUGFyYW1zXT1cImZpbHRlcmluZ0xhYmVsc1BhcmFtc1wiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBmaWx0ZXJlZEl0ZW1zQ291bnQgfX0gb2Yge3sgYWxsSXRlbXNDb3VudCB9fSBpdGVtc1xuICAgICAgICA8L3NtYWxsPlxuICAgICAgICA8c3BhblxuICAgICAgICAgIGNsYXNzPVwibGFiZWwgbGFiZWwtZGVmYXVsdCBtLXItNFwiXG4gICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgID5cbiAgICAgICAgICBObyBmaWx0ZXJzXG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxzcGFuXG4gICAgICAgIGNsYXNzPVwiZC1mbGV4IGEtaS1jZW50ZXJcIlxuICAgICAgICAqbmdJZj1cImZpbHRlcmluZ0FwcGxpZWRcIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiISFmaWx0ZXJpbmdMYWJlbHNQYXJhbXMuYWxsSXRlbXNDb3VudFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhLWktY2VudGVyXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGJhZGdlLWluZm8gbS1yLTRcIj5cbiAgICAgICAgICAgICAge3sgKGRhdGFTb3VyY2Uuc3RhdHMkIHwgYXN5bmMpLmZpbHRlcmVkU2l6ZSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNtYWxsXG4gICAgICAgICAgICAgIG5nTm9uQmluZGFibGVcbiAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgIFt0cmFuc2xhdGVQYXJhbXNdPVwiZmlsdGVyaW5nTGFiZWxzUGFyYW1zXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgb2Yge3sgYWxsSXRlbXNDb3VudCB9fSBpdGVtc1xuICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duXCJcbiAgICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b20gbGVmdFwiXG4gICAgICAgICAgZHJvcGRvd25cbiAgICAgICAgICAjZGRGaWx0ZXJzPVwiYnMtZHJvcGRvd25cIlxuICAgICAgICAgIFtjZGtUcmFwRm9jdXNdPVwiZGRGaWx0ZXJzLmlzT3BlblwiXG4gICAgICAgICAgW2luc2lkZUNsaWNrXT1cInRydWVcIlxuICAgICAgICA+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIG0tbC04XCJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ0FjdGl2ZSBmaWx0ZXJzJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiXG4gICAgICAgICAgICBkcm9wZG93blRvZ2dsZVxuICAgICAgICAgICAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLWZpbHRlcnNcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgIGNsYXNzPVwibS1yLTRcIlxuICAgICAgICAgICAgICBjOHlJY29uPVwiZmlsdGVyXCJcbiAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICA8c3Bhbj57eyAnQWN0aXZlIGZpbHRlcnMnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwLXJlbGF0aXZlIHAtbC00IHAtci0xNlwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGJhZGdlLXN5c3RlbSBwLWFic29sdXRlXCI+XG4gICAgICAgICAgICAgICAge3sgY29sdW1uc1dpdGhGaWx0ZXJzQXBwbGllZC5sZW5ndGggfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1tZW51XCJcbiAgICAgICAgICAgICpkcm9wZG93bk1lbnVcbiAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRhLWdyaWRfX2Ryb3Bkb3duIGJnLWxldmVsLTBcIj5cbiAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC11bnN0eWxlZCBtLTBcIj5cbiAgICAgICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uc1dpdGhGaWx0ZXJzQXBwbGllZDsgbGV0IGxhc3QgPSBsYXN0XCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NlcGFyYXRvci1ib3R0b20nOiAhbGFzdCB9XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1oZWFkZXIgc3RpY2t5LXRvcCB0ZXh0LXRydW5jYXRlIG5vLWJvcmRlci10b3AgcC1iLTBcIlxuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgKGNvbHVtbi5oZWFkZXIgfCB0cmFuc2xhdGUpIHx8IGNvbHVtbi5uYW1lIH19XCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IChjb2x1bW4uaGVhZGVyIHwgdHJhbnNsYXRlKSB8fCBjb2x1bW4ubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYm9yZGVybGVzcyBkLWZsZXggZC1jb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGdyb3VwZWRGaWx0ZXJDaGlwcyBvZiBjb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfCBtYXBUb0ZpbHRlckNoaXBzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXN5bmNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfCBncm91cGVkRmlsdGVyQ2hpcHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmlyc3QgPSBmaXJzdFxuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAncC10LTAnOiBmaXJzdCB9XCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxwXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNtYWxsIHAtYi00XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ3JvdXBlZEZpbHRlckNoaXBzLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBncm91cGVkRmlsdGVyQ2hpcHMubGFiZWwgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhLWktY2VudGVyIGdhcC00IGZsZXgtd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsYWJlbCBsYWJlbC1pbmZvIGNoaXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY2hpcCBvZiBncm91cGVkRmlsdGVyQ2hpcHMuY2hpcHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXhzIGJ0bi1jbGVhbiB0ZXh0LTEwIG0tci00XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdSZW1vdmUgZmlsdGVyJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUZpbHRlcihjaGlwLnJlbW92ZSgpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLXJlbW92ZS1jaGlwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJ0aW1lc1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNoaXAuZGlzcGxheVZhbHVlIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBzZXBhcmF0b3ItdG9wIHN0aWNreS1ib3R0b21cIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tZGVmYXVsdFwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnQ2xlYXIgYWxsIGZpbHRlcnMnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJGaWx0ZXJzKClcIlxuICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJjOHktZGF0YS1ncmlkLS1jbGVhci1maWx0ZXJzXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7ICdDbGVhciBhbGwgZmlsdGVycycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3NwYW4+XG5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJidG4taGVscCBidG4taGVscC0tc20gaGlkZGVuLXhzIGhpZGRlbi1zbVwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0hlbHAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgW3BvcG92ZXJdPVwiZmlsdGVyc0hlbHBQb3BvdmVyXCJcbiAgICAgICAgcGxhY2VtZW50PVwicmlnaHRcIlxuICAgICAgICB0cmlnZ2Vycz1cImZvY3VzXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICpuZ0lmPVwiZGlzcGxheU9wdGlvbnMuZmlsdGVyXCJcbiAgICAgICAgZGF0YS1jeT1cImRhdGEtZ3JpZC0taGVscC1maWx0ZXJzXCJcbiAgICAgID5cbiAgICAgICAgPGkgYzh5SWNvbj1cInF1ZXN0aW9uLWNpcmNsZS1vXCI+PC9pPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8bmctdGVtcGxhdGUgI2ZpbHRlcnNIZWxwUG9wb3Zlcj5cbiAgICAgICAgPGRpdiBbaW5uZXJIdG1sXT1cImZpbHRlcnNIZWxwUG9wb3Zlckh0bWwgfCB0cmFuc2xhdGVcIj48L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJidG4tY2xlYW4gdGV4dC1wcmltYXJ5IGhpZGRlbi14cyBoaWRkZW4tc21cIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidIZWxwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIHBvcG92ZXI9XCJ7eyAnVGhlIGNvdW50ZXIgZm9yIHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgbWlnaHQgYmUgaW5hY2N1cmF0ZS4nIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgcGxhY2VtZW50PVwicmlnaHRcIlxuICAgICAgICB0cmlnZ2Vycz1cImZvY3VzXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICpuZ0lmPVwic2hvd0NvdW50ZXJXYXJuaW5nXCJcbiAgICAgID5cbiAgICAgICAgPGkgYzh5SWNvbj1cIndhcm5pbmdcIj48L2k+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxkaXYgY2xhc3M9XCJtLWwtYXV0b1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImJ0bmJhciBkLWZsZXggYS1pLWNlbnRlclwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBoZWFkZXJBY3Rpb25Db250cm9sIG9mIGhlYWRlckFjdGlvbkNvbnRyb2xzIHwgdmlzaWJsZUNvbnRyb2xzXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFoZWFkZXJBY3Rpb25Db250cm9sLnRlbXBsYXRlOyBlbHNlIGN1c3RvbVRlbXBsYXRlXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuYmFyLWJ0biBidG4tbGlua1wiXG4gICAgICAgICAgICAgIHRpdGxlPVwie3sgaGVhZGVyQWN0aW9uQ29udHJvbC50ZXh0IHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJoZWFkZXJBY3Rpb25Db250cm9sLmNhbGxiYWNrKClcIlxuICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuQ1VTVE9NX0FDVElPTixcbiAgICAgICAgICAgICAgICBjdXN0b21BY3Rpb25OYW1lOiBoZWFkZXJBY3Rpb25Db250cm9sLnRleHQsXG4gICAgICAgICAgICAgICAgdHlwZTogaGVhZGVyQWN0aW9uQ29udHJvbC50eXBlXG4gICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgIGNsYXNzPVwibS1yLTRcIlxuICAgICAgICAgICAgICAgIFtjOHlJY29uXT1cImhlYWRlckFjdGlvbkNvbnRyb2wuaWNvblwiXG4gICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgIDxzcGFuPnt7IGhlYWRlckFjdGlvbkNvbnRyb2wudGV4dCB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY3VzdG9tVGVtcGxhdGU+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgaGVhZGVyQWN0aW9uQ29udHJvbC50ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiB7IGhlYWRlckFjdGlvbkNvbnRyb2w6IGhlYWRlckFjdGlvbkNvbnRyb2wgfVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duXCJcbiAgICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b20gbGVmdFwiXG4gICAgICAgICAgKm5nSWY9XCJjb25maWd1cmVDb2x1bW5zRW5hYmxlZFwiXG4gICAgICAgICAgZHJvcGRvd25cbiAgICAgICAgICAjZGRDb25maWd1cmVDb2x1bW5zPVwiYnMtZHJvcGRvd25cIlxuICAgICAgICAgIFtjZGtUcmFwRm9jdXNdPVwiZGRDb25maWd1cmVDb2x1bW5zLmlzT3BlblwiXG4gICAgICAgICAgW2luc2lkZUNsaWNrXT1cInRydWVcIlxuICAgICAgICA+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJidG5iYXItYnRuXCJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ0NvbmZpZ3VyZSBjb2x1bW5zJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGRhdGEtY3k9XCJkYXRhLWdyaWQtLWN1c3RvbS1jb2x1bW4tYnRuXCJcbiAgICAgICAgICAgIGRyb3Bkb3duVG9nZ2xlXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgY2xhc3M9XCJtLXItNFwiXG4gICAgICAgICAgICAgIGM4eUljb249XCJjb2x1bW5zXCJcbiAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICA8c3Bhbj57eyAnQ29uZmlndXJlIGNvbHVtbnMnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPHVsXG4gICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLW1lbnUgZGF0YS1ncmlkX19kcm9wZG93blwiXG4gICAgICAgICAgICAqZHJvcGRvd25NZW51XG4gICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImxpc3QtZ3JvdXAgbS0wXCJcbiAgICAgICAgICAgICAgICBjZGtEcm9wTGlzdFxuICAgICAgICAgICAgICAgIChjZGtEcm9wTGlzdERyb3BwZWQpPVwib25Db2x1bW5Ecm9wKCRldmVudClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zXCJcbiAgICAgICAgICAgICAgICAgIGNka0RyYWdcbiAgICAgICAgICAgICAgICAgIGNka0RyYWdMb2NrQXhpcz1cInlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29sdW1uLnBvc2l0aW9uRml4ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBkcmFnZ2FibGUtYWZ0ZXIgcC0wIGEtaS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYzh5LWNoZWNrYm94IHAtbC0xNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7IChjb2x1bW4uaGVhZGVyIHwgdHJhbnNsYXRlKSB8fCBjb2x1bW4ubmFtZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWN5XT1cIidkYXRhLWdyaWQtLWN1c3RvbS1jb2x1bW4taGVhZGVyLScgKyBjb2x1bW4uaGVhZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjb2x1bW4udmlzaWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlR3JpZENvbHVtbnNTaXplKCk7IGVtaXRDb25maWdDaGFuZ2UoJ2NoYW5nZUNvbHVtblZpc2liaWxpdHknKVxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuQ0hBTkdFX1ZJU0lCSUxJVFksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlOiAhY29sdW1uLnZpc2libGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgKGNvbHVtbi5oZWFkZXIgfCB0cmFuc2xhdGUpIHx8IGNvbHVtbi5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRvdCBzaG93T25Ib3ZlciBtYXgtd2lkdGgtZml0IGEtaS1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInUmVtb3ZlYGNvbHVtbix2ZXJiYCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcD1cInt7ICdSZW1vdmVgY29sdW1uLHZlcmJgJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJsZWZ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlQ3VzdG9tQ29sdW1uKHBvQ29uZmlybSwgY29sdW1uLCBkZENvbmZpZ3VyZUNvbHVtbnMpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLmN1c3RvbVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGM4eS1wb3BvdmVyLWNvbmZpcm1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidDb25maXJtIHJlbW92YWwnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcnM9XCJmb2N1c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZW1lbnRdPVwiJ2xlZnQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgI3BvQ29uZmlybVxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvYzh5LXBvcG92ZXItY29uZmlybT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGM4eUljb249XCJtaW51cy1jaXJjbGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWN5PVwiZGF0YS1ncmlkLS1jdXN0b20tY29sdW1uLXJlbW92ZS1idG5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgIGNsYXNzPVwicC04IHN0aWNreS1ib3R0b20gc2VwYXJhdG9yLXRvcFwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiaXNDb25maWdDb250ZXh0S25vd25cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLWJsb2NrXCJcbiAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdBZGQgY3VzdG9tIGNvbHVtbicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJkYXRhLWdyaWQtLWFkZC1jdXN0b20tY29sdW1uXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkN1c3RvbUNvbHVtbk1vZGFsKCk7IGRkQ29uZmlndXJlQ29sdW1ucy5oaWRlKClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwibS1yLTRcIlxuICAgICAgICAgICAgICAgICAgYzh5SWNvbj1cInBsdXMtY2lyY2xlXCJcbiAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7ICdBZGQgY3VzdG9tIGNvbHVtbicgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJidG5iYXItYnRuIGJ0bi1saW5rXCJcbiAgICAgICAgICB0aXRsZT1cInt7ICdSZWxvYWQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBkYXRhLWN5PVwiZGF0YS1ncmlkLS1yZWxvYWQtYnRuXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGF0YVNvdXJjZS5sb2FkaW5nJCB8IGFzeW5jXCJcbiAgICAgICAgICAoY2xpY2spPVwiY2xpY2tSZWxvYWQoKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8aVxuICAgICAgICAgICAgY2xhc3M9XCJtLXItNFwiXG4gICAgICAgICAgICBjOHlJY29uPVwicmVmcmVzaFwiXG4gICAgICAgICAgPjwvaT5cbiAgICAgICAgICA8c3Bhbj57eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiaW5wdXQtZ3JvdXAgaW5wdXQtZ3JvdXAtc2VhcmNoIG0tbC1zbS0xNiBkYXRhLWdyaWRfX3NlYXJjaC1pbnB1dFwiXG4gICAgICAgICAgKm5nSWY9XCIhc2VydmVyU2lkZURhdGFDYWxsYmFjayB8fCBzaG93U2VhcmNoXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnU2VhcmNo4oCmJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICB0eXBlPVwic2VhcmNoXCJcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cInNlYXJjaFRleHRcIlxuICAgICAgICAgICAgKGlucHV0KT1cInNlYXJjaFRleHQkLmVtaXQoJGV2ZW50LnRhcmdldC52YWx1ZSlcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWFkZG9uXCI+XG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICBjOHlJY29uPVwic2VhcmNoXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJzZWFyY2hUZXh0Lmxlbmd0aCA9PT0gMFwiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgY2xhc3M9XCJwb2ludGVyXCJcbiAgICAgICAgICAgICAgYzh5SWNvbj1cInRpbWVzXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJzZWFyY2hUZXh0Lmxlbmd0aCA+IDBcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VhcmNoVGV4dCA9ICcnOyBzZWFyY2hUZXh0JC5lbWl0KCcnKVwiXG4gICAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwieyBhY3Rpb246IFBYX0FDVElPTlMuQ0xFQVJfU0VBUkNIIH1cIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInRhYmxlLWRhdGEtZ3JpZC1oZWFkZXItYnVsay1hY3Rpb25zIGFuaW1hdGVkIHNsaWRlSW5Eb3duIGZhc3RcIlxuICAgICAgZGF0YS1jeT1cInRhYmxlLWRhdGEtZ3JpZC1oZWFkZXItYnVsay1hY3Rpb25zXCJcbiAgICAgICpuZ0lmPVwic2VsZWN0ZWRJdGVtSWRzLmxlbmd0aCAhPT0gMFwiXG4gICAgPlxuICAgICAgPGg0PlxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1BsdXJhbF09XCJzZWxlY3RlZEl0ZW1JZHMubGVuZ3RoXCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIG5nUGx1cmFsQ2FzZT1cIj0xXCI+XG4gICAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+MSBzZWxlY3RlZCBpdGVtLjwvc3Bhbj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuZ1BsdXJhbENhc2U9XCJvdGhlclwiPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgbmdOb25CaW5kYWJsZVxuICAgICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgW3RyYW5zbGF0ZVBhcmFtc109XCJ7IGNvdW50OiBzZWxlY3RlZEl0ZW1JZHMubGVuZ3RoIH1cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBjb3VudCB9fSBzZWxlY3RlZCBpdGVtcy5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPGJyIGNsYXNzPVwidmlzaWJsZS14c1wiIC8+XG4gICAgICAgIDxzbWFsbCAqbmdJZj1cIiFzZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrICYmIHNlbGVjdGVkSXRlbUlkcy5sZW5ndGggPj0gcGFnaW5hdGlvbi5wYWdlU2l6ZVwiPlxuICAgICAgICAgIDxhXG4gICAgICAgICAgICBjbGFzcz1cImludGVyYWN0XCJcbiAgICAgICAgICAgIChjbGljayk9XCJzZXRBbGxJdGVtc1NlbGVjdGVkKHRydWUpXCJcbiAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7IGFjdGlvbjogUFhfQUNUSU9OUy5TRUxFQ1RfQUxMX0lURU1TIH1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgIG5nTm9uQmluZGFibGVcbiAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgIFt0cmFuc2xhdGVQYXJhbXNdPVwieyBjb3VudDogKGRhdGFTb3VyY2Uuc3RhdHMkIHwgYXN5bmMpLmZpbHRlcmVkU2l6ZSB9XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgU2VsZWN0IGFsbCB7eyBjb3VudCB9fSBpdGVtc1xuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9zbWFsbD5cbiAgICAgIDwvaDQ+XG4gICAgICA8ZGl2IGNsYXNzPVwibS1sLWF1dG9cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJ0bmJhciBkLWZsZXhcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBidWxrQWN0aW9uQ29udHJvbCBvZiBidWxrQWN0aW9uQ29udHJvbHMgfCB2aXNpYmxlQ29udHJvbHNcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImJ1bGtBY3Rpb25Db250cm9sLnR5cGVcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuYmFyLWJ0blwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnRXhwb3J0JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImJ1bGtBY3Rpb25Db250cm9sLmNhbGxiYWNrKHNlbGVjdGVkSXRlbUlkcywgcmVsb2FkLmJpbmQodGhpcykpXCJcbiAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiYnVpbHRJbkFjdGlvblR5cGUuRXhwb3J0XCJcbiAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7IGFjdGlvbjogUFhfQUNUSU9OUy5CVUxLX0VYUE9SVCB9XCJcbiAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJzaWduLW91dFwiPjwvaT5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyAnRXhwb3J0JyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuYmFyLWJ0blwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnRGVsZXRlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImJ1bGtBY3Rpb25Db250cm9sLmNhbGxiYWNrKHNlbGVjdGVkSXRlbUlkcywgcmVsb2FkLmJpbmQodGhpcykpXCJcbiAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiYnVpbHRJbkFjdGlvblR5cGUuRGVsZXRlXCJcbiAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7IGFjdGlvbjogUFhfQUNUSU9OUy5CVUxLX0RFTEVURSB9XCJcbiAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJkZWxldGVcIj48L2k+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgJ0RlbGV0ZScgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bmJhci1idG5cIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgYnVsa0FjdGlvbkNvbnRyb2wudGV4dCB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImJ1bGtBY3Rpb25Db250cm9sLmNhbGxiYWNrKHNlbGVjdGVkSXRlbUlkcywgcmVsb2FkLmJpbmQodGhpcykpXCJcbiAgICAgICAgICAgICAgICAqbmdTd2l0Y2hEZWZhdWx0XG4gICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkJVTEtfQ1VTVE9NX0FDVElPTixcbiAgICAgICAgICAgICAgICAgIGN1c3RvbUFjdGlvbk5hbWU6IGJ1bGtBY3Rpb25Db250cm9sLnRleHRcbiAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpIFtjbGFzc109XCJidWxrQWN0aW9uQ29udHJvbC5pY29uQ2xhc3Nlc1wiIGM4eUljb249XCJ7eyBidWxrQWN0aW9uQ29udHJvbC5pY29uIH19XCI+PC9pPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IGJ1bGtBY3Rpb25Db250cm9sLnRleHQgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cImJ0bmJhci1idG5cIlxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnQ2FuY2VsJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJjYW5jZWwoKVwiXG4gICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5CVUxLX0NBTkNFTFxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIGM4eUljb249XCJ0aW1lc1wiPjwvaT5cbiAgICAgICAgICAgIDxzcGFuPnt7ICdDYW5jZWwnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8dGFibGVcbiAgICBjbGFzcz1cInRhYmxlIHRhYmxlLWZpbHRlcmVkLXNvcnRlZCB0YWJsZS1kYXRhLWdyaWQgbGFyZ2UtcGFkZGluZ1wiXG4gICAgW2NsYXNzLnRhYmxlLXN0cmlwZWRdPVwiZGlzcGxheU9wdGlvbnMuc3RyaXBlZFwiXG4gICAgW2NsYXNzLnRhYmxlLWJvcmRlcmVkXT1cImRpc3BsYXlPcHRpb25zLmJvcmRlcmVkXCJcbiAgICBbY2xhc3MudGFibGUtaG92ZXJdPVwiZGlzcGxheU9wdGlvbnMuaG92ZXJcIlxuICAgIFtjbGFzcy50YWJsZS1kYXRhLWdyaWQtd2l0aC1jaGVja2JveGVzXT1cInNlbGVjdGFibGVcIlxuICAgIFtjbGFzcy50YWJsZS1kYXRhLWdyaWQtd2l0aC1hY3Rpb25zXT1cImFjdGlvbkNvbnRyb2xzLmxlbmd0aCA+IDBcIlxuICAgIFtzdHlsZS5ncmlkLXRlbXBsYXRlLWNvbHVtbnNdPVwic3R5bGVzLmdyaWRUZW1wbGF0ZUNvbHVtbnNcIlxuICAgIGNkay10YWJsZVxuICAgIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIlxuICAgIFttdWx0aVRlbXBsYXRlRGF0YVJvd3NdPVwidHJ1ZVwiXG4gICAgKG1vdXNlbW92ZSk9XCJyZXNpemVIYW5kbGVDb250YWluZXJNb3VzZU1vdmUkLmVtaXQoJGV2ZW50KVwiXG4gICAgKG1vdXNldXApPVwicmVzaXplSGFuZGxlQ29udGFpbmVyTW91c2VVcCQuZW1pdCgkZXZlbnQpXCJcbiAgICBkYXRhLWN5PVwiYzh5LWRhdGEtZ3JpZC0tdGFibGVcIlxuICA+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5TmFtZVwiXG4gICAgICBbY2RrQ29sdW1uRGVmXT1cImNvbHVtbi5uYW1lXCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb2x1bW4ubmFtZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY2hlY2tib3gnXCI+XG4gICAgICAgICAgPHRoXG4gICAgICAgICAgICBjZGstaGVhZGVyLWNlbGxcbiAgICAgICAgICAgICpjZGtIZWFkZXJDZWxsRGVmXG4gICAgICAgICAgICBkYXRhLXR5cGU9XCJpY29uXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjOHktY2hlY2tib3hcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1NlbGVjdGVkJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiY3VycmVudFBhZ2VTZWxlY3Rpb25TdGF0ZS5hbGxTZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJcbiAgICAgICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGFnZVNlbGVjdGlvblN0YXRlLmFsbFNlbGVjdGVkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBhZ2VTZWxlY3Rpb25TdGF0ZS5hbGxEZXNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldEFsbEl0ZW1zSW5DdXJyZW50UGFnZVNlbGVjdGVkKCRldmVudC50YXJnZXQuY2hlY2tlZClcIlxuICAgICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cInsgYWN0aW9uOiBQWF9BQ1RJT05TLlNFTEVDVF9BTExfSVRFTVMgfVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RoPlxuXG4gICAgICAgICAgPHRkXG4gICAgICAgICAgICBjZGstY2VsbFxuICAgICAgICAgICAgKmNka0NlbGxEZWY9XCJsZXQgcm93XCJcbiAgICAgICAgICAgIGRhdGEtdHlwZT1cImljb25cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImM4eS1jaGVja2JveFwiPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidTZWxlY3RlZCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNJdGVtU2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZXRJdGVtc1NlbGVjdGVkKFtyb3ddLCAkZXZlbnQudGFyZ2V0LmNoZWNrZWQpXCJcbiAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuU0VMRUNUX0lURU0sXG4gICAgICAgICAgICAgICAgICBpZDogcm93LmlkXG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncmFkaW8tYnV0dG9uJ1wiPlxuICAgICAgICAgIDx0aFxuICAgICAgICAgICAgY2RrLWhlYWRlci1jZWxsXG4gICAgICAgICAgICAqY2RrSGVhZGVyQ2VsbERlZlxuICAgICAgICAgICAgZGF0YS10eXBlPVwiaWNvblwiXG4gICAgICAgICAgPjwvdGg+XG5cbiAgICAgICAgICA8dGRcbiAgICAgICAgICAgIGNkay1jZWxsXG4gICAgICAgICAgICAqY2RrQ2VsbERlZj1cImxldCByb3dcIlxuICAgICAgICAgICAgZGF0YS10eXBlPVwiaWNvblwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYzh5LXJhZGlvXCI+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1NlbGVjdGVkJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgbmFtZT1cInNlbGVjdC1yb3dcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJyYWRpb1wiXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNJdGVtU2VsZWN0ZWQocm93KVwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjaGFuZ2VTZWxlY3RlZEl0ZW0ocm93KVwiXG4gICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLlNFTEVDVF9JVEVNLFxuICAgICAgICAgICAgICAgICAgaWQ6IHJvdy5pZFxuICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJjOHktZGF0YS1ncmlkLS1yYWRpb1wiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2FjdGlvbnMnXCI+XG4gICAgICAgICAgPHRoXG4gICAgICAgICAgICBjZGstaGVhZGVyLWNlbGxcbiAgICAgICAgICAgICpjZGtIZWFkZXJDZWxsRGVmXG4gICAgICAgICAgICBkYXRhLXR5cGU9XCJpY29uXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtbWVkaXVtIHNyLW9ubHlcIj57eyAnQWN0aW9ucycgfCB0cmFuc2xhdGUgfX08L3A+XG4gICAgICAgICAgPC90aD5cblxuICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgY2RrLWNlbGxcbiAgICAgICAgICAgICpjZGtDZWxsRGVmPVwibGV0IHJvd1wiXG4gICAgICAgICAgICBkYXRhLXR5cGU9XCJpY29uXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgIGxldCBhY3Rpb25Db250cm9sIG9mIGFjdGlvbkNvbnRyb2xzXG4gICAgICAgICAgICAgICAgICB8IHZpc2libGVDb250cm9sczogcm93XG4gICAgICAgICAgICAgICAgICB8IHNsaWNlOiAwIDogKChhY3Rpb25Db250cm9scyB8IHZpc2libGVDb250cm9sczogcm93KT8ubGVuZ3RoID4gMiA/IDEgOiAyKVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJhY3Rpb25Db250cm9sLnR5cGVcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZG90XCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0VkaXQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIHRvb2x0aXA9XCJ7eyAnRWRpdCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJidWlsdEluQWN0aW9uVHlwZS5FZGl0XCJcbiAgICAgICAgICAgICAgICAgIFtkZWxheV09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGlvbkNvbnRyb2wuY2FsbGJhY2socm93LCByZWxvYWQuYmluZCh0aGlzKSlcIlxuICAgICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkVESVRfSVRFTSxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHJvdy5pZFxuICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICBkYXRhLWN5PVwiYzh5LWRhdGEtZ3JpZC0tZWRpdC1idXR0b24taW4tcm93XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwicGVuY2lsXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRvdCBidG4tZG90LS1kYW5nZXIgc2hvd09uSG92ZXJcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInRGVsZXRlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICB0b29sdGlwPVwie3sgJ0RlbGV0ZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIFtkZWxheV09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGlvbkNvbnRyb2wuY2FsbGJhY2socm93LCByZWxvYWQuYmluZCh0aGlzKSlcIlxuICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImJ1aWx0SW5BY3Rpb25UeXBlLkRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5ERUxFVEVfSVRFTSxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHJvdy5pZFxuICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgICAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLXJlbW92ZS1idXR0b24taW4tcm93XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwiZGVsZXRlXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRvdFwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIihhY3Rpb25Db250cm9sLmljb24gPyBhY3Rpb25Db250cm9sLnRleHQgOiAnJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgdG9vbHRpcD1cInt7IChhY3Rpb25Db250cm9sLmljb24gPyBhY3Rpb25Db250cm9sLnRleHQgOiAnJykgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgc2hvd09uSG92ZXI6IGFjdGlvbkNvbnRyb2wuc2hvd09uSG92ZXIgfVwiXG4gICAgICAgICAgICAgICAgICBbZGVsYXldPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaERlZmF1bHRcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3Rpb25Db250cm9sLmNhbGxiYWNrKHJvdywgcmVsb2FkLmJpbmQodGhpcykpXCJcbiAgICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkNVU1RPTV9BQ1RJT05fSVRFTSxcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tQWN0aW9uTmFtZTogYWN0aW9uQ29udHJvbC50ZXh0LFxuICAgICAgICAgICAgICAgICAgICBpZDogcm93LmlkXG4gICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWN5XT1cIidjOHktZGF0YS1ncmlkLS1idXR0b24taW4tcm93LS0nICsgYWN0aW9uQ29udHJvbC50ZXh0XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICBjOHlJY29uPVwie3sgYWN0aW9uQ29udHJvbC5pY29uIH19XCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJhY3Rpb25Db250cm9sLmljb25cIlxuICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWFjdGlvbkNvbnRyb2wuaWNvblwiPnt7IGFjdGlvbkNvbnRyb2wudGV4dCB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgJ20tbC1hdXRvIG92ZXJmbG93LXZpc2libGUnOiAoYWN0aW9uQ29udHJvbHMgfCB2aXNpYmxlQ29udHJvbHM6IHJvdyk/Lmxlbmd0aCA+IDJcbiAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b20gcmlnaHRcIlxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgIGRyb3Bkb3duXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIoYWN0aW9uQ29udHJvbHMgfCB2aXNpYmxlQ29udHJvbHM6IHJvdyk/Lmxlbmd0aCA+IDJcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkcm9wZG93bi10b2dnbGUgYzh5LWRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0FjdGlvbnMnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLXJvdy1hY3Rpb25zLWRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgICAgIGRyb3Bkb3duVG9nZ2xlXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cImVsbGlwc2lzLXZcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPHVsXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLW1lbnUgZHJvcGRvd24tbWVudS1yaWdodFwiXG4gICAgICAgICAgICAgICAgICAqZHJvcGRvd25NZW51XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgICAgICAgIGxldCBhY3Rpb25Db250cm9sIG9mIGFjdGlvbkNvbnRyb2xzXG4gICAgICAgICAgICAgICAgICAgICAgICB8IHZpc2libGVDb250cm9sczogcm93XG4gICAgICAgICAgICAgICAgICAgICAgICB8IHNsaWNlOiAoKGFjdGlvbkNvbnRyb2xzIHwgdmlzaWJsZUNvbnRyb2xzOiByb3cpPy5sZW5ndGggPiAyID8gMSA6IDIpXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImFjdGlvbkNvbnRyb2wudHlwZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0VkaXQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImJ1aWx0SW5BY3Rpb25UeXBlLkVkaXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGlvbkNvbnRyb2wuY2FsbGJhY2socm93LCByZWxvYWQuYmluZCh0aGlzKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuRURJVF9JVEVNLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogcm93LmlkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cInBlbmNpbFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdFZGl0JyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0RlbGV0ZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiYnVpbHRJbkFjdGlvblR5cGUuRGVsZXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3Rpb25Db250cm9sLmNhbGxiYWNrKHJvdywgcmVsb2FkLmJpbmQodGhpcykpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkRFTEVURV9JVEVNLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogcm93LmlkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cImRlbGV0ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdEZWxldGUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnRXhwb3J0JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJidWlsdEluQWN0aW9uVHlwZS5FeHBvcnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGlvbkNvbnRyb2wuY2FsbGJhY2socm93LCByZWxvYWQuYmluZCh0aGlzKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuRVhQT1JUX0lURU0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiByb3cuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwiZGF0YS1leHBvcnRcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAnRXhwb3J0JyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgYWN0aW9uQ29udHJvbC50ZXh0IHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoRGVmYXVsdFxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGlvbkNvbnRyb2wuY2FsbGJhY2socm93LCByZWxvYWQuYmluZCh0aGlzKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkNVU1RPTV9BQ1RJT05fSVRFTSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tQWN0aW9uTmFtZTogYWN0aW9uQ29udHJvbC50ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogcm93LmlkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwie3sgYWN0aW9uQ29udHJvbC5pY29uIH19XCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgYWN0aW9uQ29udHJvbC50ZXh0IHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdD5cbiAgICAgICAgICA8dGhcbiAgICAgICAgICAgIFtjbGFzcy5zb3J0ZWRdPVwiY29sdW1uLnNvcnRPcmRlclwiXG4gICAgICAgICAgICBbY2xhc3MuZmlsdGVyZWRdPVwiY29sdW1uIHwgbWFwOiBpc0NvbHVtbkZpbHRlcmluZ0FwcGxpZWRcIlxuICAgICAgICAgICAgW2NsYXNzLmhpZGRlbl09XCIhY29sdW1uLnZpc2libGVcIlxuICAgICAgICAgICAgY2RrLWhlYWRlci1jZWxsXG4gICAgICAgICAgICAqY2RrSGVhZGVyQ2VsbERlZlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29sdW1uLmhlYWRlckNTU0NsYXNzTmFtZVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXR5cGVdPVwiY29sdW1uLmRhdGFUeXBlXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIFt0aXRsZV09XCIoY29sdW1uLmhlYWRlciB8IHRyYW5zbGF0ZSkgfHwgY29sdW1uLm5hbWVcIlxuICAgICAgICAgICAgICAqbmdJZj1cIiFjb2x1bW4uZmlsdGVyYWJsZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgY29sdW1uTmFtZTogY29sdW1uLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IChjb2x1bW4uaGVhZGVyIHwgdHJhbnNsYXRlKSB8fCBjb2x1bW4ubmFtZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBdIHwgbWFwOiBnZXRIZWFkZXJDZWxsUmVuZGVyZXJTcGVjIDogdGhpcyBhcyBjZWxsUmVuZGVyZXJTcGVjXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxjOHktY2VsbC1yZW5kZXJlciBbc3BlY109XCJjZWxsUmVuZGVyZXJTcGVjXCI+PC9jOHktY2VsbC1yZW5kZXJlcj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBpc0Ryb3BEb3duUGxhY2VkUmlnaHQgdG8gYmUgcmVtb3ZlZCB3aGVuIGNvbHVtbnMgYXJlIHRyYW5zZm9ybWVkIHRvIG9ic2VydmFibGVzLiAtLT5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJkcm9wZG93blwiXG4gICAgICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbSB7eyBpc0Ryb3BEb3duUGxhY2VkUmlnaHQoY29sdW1uKSA/ICdyaWdodCcgOiAnbGVmdCcgfX1cIlxuICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi5maWx0ZXJhYmxlXCJcbiAgICAgICAgICAgICAgZHJvcGRvd25cbiAgICAgICAgICAgICAgI2dyaWRIZWFkZXJEcm9wZG93bj1cImJzLWRyb3Bkb3duXCJcbiAgICAgICAgICAgICAgW2Nka1RyYXBGb2N1c109XCJncmlkSGVhZGVyRHJvcGRvd24uaXNPcGVuXCJcbiAgICAgICAgICAgICAgW2luc2lkZUNsaWNrXT1cInRydWVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4taGVhZGVyXCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiKGNvbHVtbi5oZWFkZXIgfCB0cmFuc2xhdGUpIHx8IGNvbHVtbi5uYW1lXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWN5XT1cIidkYXRhLWdyaWQtLWhlYWRlci1idG4tLScgKyBjb2x1bW4uaGVhZGVyXCJcbiAgICAgICAgICAgICAgICBkcm9wZG93blRvZ2dsZVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk5hbWU6IGNvbHVtbi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IChjb2x1bW4uaGVhZGVyIHwgdHJhbnNsYXRlKSB8fCBjb2x1bW4ubmFtZVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSB8IG1hcDogZ2V0SGVhZGVyQ2VsbFJlbmRlcmVyU3BlYyA6IHRoaXMgYXMgY2VsbFJlbmRlcmVyU3BlY1xuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8Yzh5LWNlbGwtcmVuZGVyZXJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLWM4eS1jZWxsLXJlbmRlcmVyXCJcbiAgICAgICAgICAgICAgICAgICAgW3NwZWNdPVwiY2VsbFJlbmRlcmVyU3BlY1wiXG4gICAgICAgICAgICAgICAgICA+PC9jOHktY2VsbC1yZW5kZXJlcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgYzh5SWNvbj1cImZpbHRlclwiXG4gICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdGaWx0ZXInIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICA8IS0tIGlzRHJvcERvd25QbGFjZWRSaWdodCB0byBiZSByZW1vdmVkIHdoZW4gY29sdW1ucyBhcmUgdHJhbnNmb3JtZWQgdG8gb2JzZXJ2YWJsZXMuIC0tPlxuICAgICAgICAgICAgICA8dWxcbiAgICAgICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIlxuICAgICAgICAgICAgICAgICpkcm9wZG93bk1lbnVcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdkcm9wZG93bi1tZW51LXJpZ2h0LWdyaWQnOiBpc0Ryb3BEb3duUGxhY2VkUmlnaHQoY29sdW1uKSB9XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImRhdGEtZ3JpZF9fZHJvcGRvd25cIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wZG93bjogZ3JpZEhlYWRlckRyb3Bkb3duXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgXSB8IG1hcDogZ2V0RmlsdGVyaW5nRm9ybVJlbmRlcmVyU3BlYyA6IHRoaXMgYXMgZmlsdGVyaW5nRm9ybVJlbmRlcmVyU3BlY1xuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8Yzh5LWZpbHRlcmluZy1mb3JtLXJlbmRlcmVyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJiZy1jb21wb25lbnRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtzcGVjXT1cImZpbHRlcmluZ0Zvcm1SZW5kZXJlclNwZWNcIlxuICAgICAgICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJjOHktZGF0YS1ncmlkLS1jOHktZmlsdGVyaW5nLWZvcm0tcmVuZGVyZXJcIlxuICAgICAgICAgICAgICAgICAgICA+PC9jOHktZmlsdGVyaW5nLWZvcm0tcmVuZGVyZXI+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJidG4tc29ydFwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCJzb3J0Q29sdW1uVGl0bGUgfCB0cmFuc2xhdGU6IHsgbmFtZTogY29sdW1uLmhlYWRlciB8IHRyYW5zbGF0ZSB9XCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLnNvcnRhYmxlXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImNoYW5nZVNvcnRPcmRlcihjb2x1bW4ubmFtZSlcIlxuICAgICAgICAgICAgICBkYXRhLWN5PVwiY2hhbmdlLXNvcnQtb3JkZXJcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb2x1bW4uc29ydE9yZGVyXCI+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgIGM4eUljb249XCJsb25nLWFycm93LXVwXCJcbiAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCInYXNjJ1wiXG4gICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgYzh5SWNvbj1cImxvbmctYXJyb3ctZG93blwiXG4gICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ2Rlc2MnXCJcbiAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICBjOHlJY29uPVwiZXhjaGFuZ2VcIlxuICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoRGVmYXVsdFxuICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgIGNsYXNzPVwicmVzaXplLWhhbmRsZVwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLnJlc2l6YWJsZVwiXG4gICAgICAgICAgICAgIChtb3VzZWRvd24pPVwiXG4gICAgICAgICAgICAgICAgcmVzaXplSGFuZGxlTW91c2VEb3duJC5lbWl0KHsgZXZlbnQ6ICRldmVudCwgdGFyZ2V0Q29sdW1uTmFtZTogY29sdW1uLm5hbWUgfSlcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID48L3NwYW4+XG4gICAgICAgICAgPC90aD5cblxuICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgW2NsYXNzLmhpZGRlbl09XCIhY29sdW1uLnZpc2libGVcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1jZWxsLXRpdGxlXT1cImNvbHVtbi5oZWFkZXIgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgY2RrLWNlbGxcbiAgICAgICAgICAgICpjZGtDZWxsRGVmPVwibGV0IHJvd1wiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJjb2x1bW4uY2VsbENTU0NsYXNzTmFtZVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWN5XT1cIidkYXRhLWdyaWQtLScgKyBjb2x1bW4uaGVhZGVyXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdHlwZV09XCJjb2x1bW4uZGF0YVR5cGVcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiByZXNvbHZlQ2VsbFZhbHVlKHJvdywgY29sdW1uLnBhdGgpLFxuICAgICAgICAgICAgICAgICAgICByb3c6IHJvdyxcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uTmFtZTogY29sdW1uLm5hbWVcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdIHwgbWFwOiBnZXRDZWxsUmVuZGVyZXJTcGVjIDogdGhpcyBhcyBjZWxsUmVuZGVyZXJTcGVjXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxjOHktY2VsbC1yZW5kZXJlciBbc3BlY109XCJjZWxsUmVuZGVyZXJTcGVjXCI+PC9jOHktY2VsbC1yZW5kZXJlcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGFpbmVyIGNka0NvbHVtbkRlZj1cImluZmluaXRlU2Nyb2xsRm9vdGVyXCI+XG4gICAgICA8dGRcbiAgICAgICAgW3N0eWxlLmdyaWQtY29sdW1uXT1cInN0eWxlcy5ncmlkSW5maW5pdGVTY3JvbGxDb2x1bW5cIlxuICAgICAgICBjZGstZm9vdGVyLWNlbGxcbiAgICAgICAgKmNka0Zvb3RlckNlbGxEZWZcbiAgICAgID5cbiAgICAgICAgPHRlbXBsYXRlICNpbmZpbml0ZVNjcm9sbENvbnRhaW5lcj48L3RlbXBsYXRlPlxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDx0clxuICAgICAgY2RrLWhlYWRlci1yb3dcbiAgICAgICpjZGtIZWFkZXJSb3dEZWY9XCJjb2x1bW5OYW1lc1wiXG4gICAgPjwvdHI+XG5cbiAgICA8dHJcbiAgICAgIGRhdGEtY3k9XCJjOHktZGF0YS1ncmlkLS1yb3ctaW4tZGF0YS1ncmlkXCJcbiAgICAgIGNkay1yb3dcbiAgICAgICpjZGtSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBjb2x1bW5OYW1lczsgbGV0IGlkeCA9IGRhdGFJbmRleFwiXG4gICAgICBbbmdDbGFzc109XCJbXG4gICAgICAgIGFjdGl2ZUNsYXNzTmFtZSAmJiByb3cgPT09IGxhc3RDbGlja2VkUm93ID8gYWN0aXZlQ2xhc3NOYW1lIDogJycsXG4gICAgICAgIGlkeCAlIDIgPT09IDAgPyAnZXZlbicgOiAnb2RkJ1xuICAgICAgXVwiXG4gICAgICAobW91c2VvdmVyKT1cInJvd01vdXNlT3Zlci5lbWl0KHJvdylcIlxuICAgICAgKG1vdXNlbGVhdmUpPVwicm93TW91c2VMZWF2ZS5lbWl0KHJvdylcIlxuICAgICAgKGNsaWNrKT1cImhhbmRsZUNsaWNrKHJvdylcIlxuICAgID48L3RyPlxuXG4gICAgPHRyXG4gICAgICBjbGFzcz1cImV4cGFuZGVkLXJvd1wiXG4gICAgICBbbmdDbGFzc109XCJ7IGhpZGRlbjogIShleHBhbmRlZFJvd3MuZ2V0KHJvdykudmlzaWJsZSQgfCBhc3luYykgfVwiXG4gICAgICBkYXRhLWN5PVwiYzh5LWRhdGEtZ3JpZC0tZXhwYW5kZWQtcm93LWluLWRhdGEtZ3JpZFwiXG4gICAgICBjZGstcm93XG4gICAgICAqY2RrUm93RGVmPVwibGV0IHJvdzsgY29sdW1uczogWydleHBhbmRlZC1yb3cnXTsgd2hlbjogaXNSb3dFeHBhbmRlZFwiXG4gICAgPjwvdHI+XG5cbiAgICA8bmctY29udGFpbmVyIGNka0NvbHVtbkRlZj1cImV4cGFuZGVkLXJvd1wiPlxuICAgICAgPHRkXG4gICAgICAgIFtzdHlsZS5ncmlkLWNvbHVtbl09XCJzdHlsZXMuZ3JpZEluZmluaXRlU2Nyb2xsQ29sdW1uXCJcbiAgICAgICAgY2RrLWNlbGxcbiAgICAgICAgKmNka0NlbGxEZWY9XCJsZXQgcm93XCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICBleHBhbmRhYmxlUm93Py50ZW1wbGF0ZTtcbiAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgJGltcGxpY2l0OiByb3csXG4gICAgICAgICAgICAgIGFzeW5jUmVuZGVyU3VjY2Vzczogc2V0RXhwYW5kYWJsZVJvd1Zpc2libGUuYmluZCh0aGlzLCByb3csIHRydWUpLFxuICAgICAgICAgICAgICBhc3luY1JlbmRlckZhaWw6IHNldEV4cGFuZGFibGVSb3dWaXNpYmxlLmJpbmQodGhpcywgcm93LCBmYWxzZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBcIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgIDx0clxuICAgICAgICBbbmdDbGFzc109XCJ7IGhpZGRlbjogIWluZmluaXRlU2Nyb2xsIH1cIlxuICAgICAgICBjZGstZm9vdGVyLXJvd1xuICAgICAgICAqY2RrRm9vdGVyUm93RGVmPVwiWydpbmZpbml0ZVNjcm9sbEZvb3RlciddXCJcbiAgICAgID48L3RyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L3RhYmxlPlxuXG4gIDxkaXZcbiAgICBjbGFzcz1cImQtZmxleCBtLTAgcC10LTQwIHAtYi00MFwiXG4gICAgKm5nSWY9XCJcbiAgICAgICEoZGF0YVNvdXJjZS5sb2FkaW5nJCB8IGFzeW5jKSAmJlxuICAgICAgKChkYXRhU291cmNlLnN0YXRzJCB8IGFzeW5jKS5maWx0ZXJlZFNpemUgPT09IDAgfHwgKGRhdGFTb3VyY2UuZGF0YSQgfCBhc3luYykubGVuZ3RoID09PSAwKVxuICAgIFwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTMgY29sLXNtLTQgbS1sLWF1dG8gbS1yLWF1dG9cIj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImM4eS11aS1lbXB0eS1zdGF0ZSwgLmM4eS1lbXB0eS1zdGF0ZVwiPjwvbmctY29udGVudD5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICBlbXB0eVN0YXRlPy50ZW1wbGF0ZVJlZjtcbiAgICAgICAgICBjb250ZXh0OiB7ICRpbXBsaWNpdDogZW1wdHlTdGF0ZUNvbnRleHQkIHwgYXN5bmMgfVxuICAgICAgICBcIlxuICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2XG4gICAgY2xhc3M9XCJ0YWJsZS1kYXRhLWdyaWQtZm9vdGVyIHNlcGFyYXRvciBsYXJnZS1wYWRkaW5nXCJcbiAgICAqbmdJZj1cInBhZ2luYXRpb24gJiYgIWluZmluaXRlU2Nyb2xsXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNCBuby1ndXR0ZXJcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJjb3VudGVyIHAtdC04IHAtYi04XCJcbiAgICAgICAgKm5nSWY9XCIoZGF0YVNvdXJjZS5zdGF0cyQgfCBhc3luYykuY3VycmVudFBhZ2VTaXplID4gMFwiXG4gICAgICAgIGRhdGEtY3k9XCJkYXRhLWdyaWQtLWNvdW50ZXJcIlxuICAgICAgPlxuICAgICAgICA8c3BhblxuICAgICAgICAgIGNsYXNzPVwidGV4dC1tdXRlZFwiXG4gICAgICAgICAgbmdOb25CaW5kYWJsZVxuICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgIFt0cmFuc2xhdGVQYXJhbXNdPVwicGFnaW5hdGlvbkxhYmVsUGFyYW1zXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IHBhZ2VGaXJzdEl0ZW1JZHggfX0gLSB7eyBwYWdlTGFzdEl0ZW1JZHggfX0gb2Yge3sgaXRlbXNUb3RhbCB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNCBuby1ndXR0ZXIgdGV4dC1jZW50ZXJcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJmb3JtLWdyb3VwIGZvcm0taW5saW5lIHAtdC04IHAtYi04XCJcbiAgICAgICAgKm5nSWY9XCIoZGF0YVNvdXJjZS5zdGF0cyQgfCBhc3luYykuZmlsdGVyZWRTaXplID4gbWluUG9zc2libGVQYWdlU2l6ZVwiXG4gICAgICA+XG4gICAgICAgIDxsYWJlbFxuICAgICAgICAgIGNsYXNzPVwibS1yLTRcIlxuICAgICAgICAgIGZvcj1cImZpbHRlcmVkU2l6ZVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyAnSXRlbXMgcGVyIHBhZ2UnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjOHktc2VsZWN0LXdyYXBwZXJcIj5cbiAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICBpZD1cImZpbHRlcmVkU2l6ZVwiXG4gICAgICAgICAgICBkYXRhLWN5PVwiZGF0YS1ncmlkLS1wYWdlc2l6ZS1vcHRpb25zXCJcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cInBhZ2luYXRpb24ucGFnZVNpemVcIlxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiXG4gICAgICAgICAgICAgIHVwZGF0ZVBhZ2luYXRpb24oeyBpdGVtc1BlclBhZ2U6ICRldmVudCwgcGFnZTogcGFnaW5hdGlvbi5jdXJyZW50UGFnZSB9KVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBwYWdlU2l6ZSBvZiBwb3NzaWJsZVBhZ2VTaXplc1wiXG4gICAgICAgICAgICAgIFtuZ1ZhbHVlXT1cInBhZ2VTaXplXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgcGFnZVNpemUgfX1cbiAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImNvbC1zbS00IG5vLWd1dHRlciB0ZXh0LXJpZ2h0XCI+XG4gICAgICA8cGFnaW5hdGlvblxuICAgICAgICBbY2xhc3MuaGlkZGVuXT1cImhpZGVQYWdpbmF0aW9uJCB8IGFzeW5jXCJcbiAgICAgICAgY2xhc3M9XCJwLXQtOCBwLWItOFwiXG4gICAgICAgICpuZ0lmPVwiKGRhdGFTb3VyY2Uuc3RhdHMkIHwgYXN5bmMpLmZpbHRlcmVkU2l6ZSA+IDBcIlxuICAgICAgICBbbmdNb2RlbF09XCJwYWdpbmF0aW9uLmN1cnJlbnRQYWdlXCJcbiAgICAgICAgKHBhZ2VDaGFuZ2VkKT1cInVwZGF0ZVBhZ2luYXRpb24oJGV2ZW50KVwiXG4gICAgICAgIFt0b3RhbEl0ZW1zXT1cIihkYXRhU291cmNlLnN0YXRzJCB8IGFzeW5jKS5maWx0ZXJlZFNpemVcIlxuICAgICAgICBbaXRlbXNQZXJQYWdlXT1cInBhZ2luYXRpb24ucGFnZVNpemVcIlxuICAgICAgICAobnVtUGFnZXMpPVwidG90YWxQYWdlc0NvdW50JC5uZXh0KCRldmVudClcIlxuICAgICAgICBbbWF4U2l6ZV09XCI1XCJcbiAgICAgICAgW2JvdW5kYXJ5TGlua3NdPVwiZmFsc2VcIlxuICAgICAgICBwcmV2aW91c1RleHQ9XCJQcmV2aW91c1wiXG4gICAgICAgIG5leHRUZXh0PVwiTmV4dFwiXG4gICAgICA+PC9wYWdpbmF0aW9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
1214
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1ncmlkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvZGF0YS1ncmlkL2RhdGEtZ3JpZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9jb3JlL2RhdGEtZ3JpZC9kYXRhLWdyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM3RCxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBQ2YsVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsRUFDVCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWpELE9BQU8sRUFDTCxRQUFRLElBQUksU0FBUyxFQUNyQixTQUFTLEVBQ1QsSUFBSSxFQUNKLEdBQUcsRUFDSCxPQUFPLEVBQ1AsT0FBTyxFQUNQLEtBQUssRUFDTCxLQUFLLEVBQ0wsTUFBTSxFQUNOLE9BQU8sRUFDUixNQUFNLFdBQVcsQ0FBQztBQUVuQixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUNMLGVBQWUsRUFFZixPQUFPLEVBRVAsYUFBYSxFQUNiLFFBQVEsRUFDUixZQUFZLEVBQ1osS0FBSyxFQUNMLEVBQUUsRUFDRixJQUFJLEVBQ0wsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLG9CQUFvQixFQUNwQixNQUFNLEVBQ04sS0FBSyxFQUNM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QixNQUFNO2dCQUVHLFFBQVE7c0JBQWpCLE1BQU07Z0JBRUcsY0FBYztzQkFBdkIsTUFBTTtnQkFFRyxjQUFjO3NCQUF2QixNQUFNO2dCQUVHLGNBQWM7c0JBQXZCLE1BQU07Z0JBRUcsUUFBUTtzQkFBakIsTUFBTTtnQkFNRyxXQUFXO3NCQUFwQixNQUFNO2dCQUVHLFFBQVE7c0JBQWpCLE1BQU07Z0JBRUcsaUJBQWlCO3NCQUExQixNQUFNO2dCQUVHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFFRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBRUcsTUFBTTtzQkFBZixNQUFNO2dCQUVHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFFRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBRUcsd0JBQXdCO3NCQUFqQyxNQUFNO2dCQUUyQixlQUFlO3NCQUFoRCxlQUFlO3VCQUFDLGVBQWU7Z0JBR2hDLGFBQWE7c0JBRFosWUFBWTt1QkFBQyxzQkFBc0I7Z0JBR0csZUFBZTtzQkFBckQsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUdyQyx1QkFBdUI7c0JBRHRCLFNBQVM7dUJBQUMseUJBQXlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFHckMsVUFBVTtzQkFBbkQsWUFBWTt1QkFBQywwQkFBMEI7Z0JBc0VtQixNQUFNO3NCQUFoRSxZQUFZO3VCQUFDLGFBQWEsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBSWpELFFBQVE7c0JBRFAsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2RrSGVhZGVyQ2VsbCwgQ2RrVGFibGUgfSBmcm9tICdAYW5ndWxhci9jZGsvdGFibGUnO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgVmlld0NoaWxkLFxuICBWaWV3Q2hpbGRyZW4sXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIGZvcndhcmRSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IElJZGVudGlmaWVkLCBJUmVzdWx0TGlzdCwgUGFnaW5nIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHtcbiAgcGFyc2VJbnQgYXMgX3BhcnNlSW50LFxuICBjYXN0QXJyYXksXG4gIGZsb3csXG4gIGdldCxcbiAgaW5kZXhPZixcbiAgaXNFbXB0eSxcbiAgaXNOaWwsXG4gIHVuaW9uLFxuICB1bmlxQnksXG4gIHdpdGhvdXRcbn0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEJzRHJvcGRvd25EaXJlY3RpdmUgfSBmcm9tICduZ3gtYm9vdHN0cmFwL2Ryb3Bkb3duJztcbmltcG9ydCB7IEJzTW9kYWxTZXJ2aWNlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIE9ic2VydmFibGUsXG4gIFN1YmplY3QsXG4gIFVuYXJ5RnVuY3Rpb24sXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGZvcmtKb2luLFxuICBpc09ic2VydmFibGUsXG4gIG1lcmdlLFxuICBvZixcbiAgcGlwZVxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGNvbWJpbmVMYXRlc3RXaXRoLFxuICBjb25jYXRNYXAsXG4gIGRlYm91bmNlVGltZSxcbiAgZGVsYXksXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICBmaWx0ZXIsXG4gIGZpcnN0LFxuICBtYXAsXG4gIG1lcmdlTWFwLFxuICBzdGFydFdpdGgsXG4gIHN3aXRjaE1hcCxcbiAgdGFrZSxcbiAgdGFrZVVudGlsLFxuICB0YXBcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlIH0gZnJvbSAnLi4vYWxlcnQvYWxlcnQuc2VydmljZSc7XG5pbXBvcnQgeyBFbXB0eVN0YXRlQ29udGV4dERpcmVjdGl2ZSB9IGZyb20gJy4uL2NvbW1vbi9lbXB0eS1zdGF0ZS9lbXB0eS1zdGF0ZS1jb250ZXh0LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyB0b09ic2VydmFibGUgfSBmcm9tICcuLi9jb21tb24vZXh0ZW5zaW9uLWhvb2tzJztcbmltcG9ydCB7IExvYWRNb3JlQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tbW9uL2xvYWQtbW9yZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTG9hZE1vcmVNb2RlIH0gZnJvbSAnLi4vY29tbW9uL2xvYWQtbW9yZS5tb2RlbCc7XG5pbXBvcnQgeyBnZXR0ZXh0IH0gZnJvbSAnLi4vaTE4bi9nZXR0ZXh0JztcbmltcG9ydCB7IFBvcG92ZXJDb25maXJtQnV0dG9ucywgUG9wb3ZlckNvbmZpcm1Db21wb25lbnQgfSBmcm9tICcuLi9tb2RhbC9wb3BvdmVyLWNvbmZpcm0uY29tcG9uZW50JztcbmltcG9ydCB7IEdhaW5zaWdodFNlcnZpY2UgfSBmcm9tICcuLi9wcm9kdWN0LWV4cGVyaWVuY2UvZ2FpbnNpZ2h0LnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgUFJPRFVDVF9FWFBFUklFTkNFX0VWRU5UX1NPVVJDRSxcbiAgUHJvZHVjdEV4cGVyaWVuY2VFdmVudCxcbiAgUHJvZHVjdEV4cGVyaWVuY2VFdmVudFNvdXJjZVxufSBmcm9tICcuLi9wcm9kdWN0LWV4cGVyaWVuY2UvcHJvZHVjdC1leHBlcmllbmNlLm1vZGVsJztcbmltcG9ydCB7IEFjdGlvbkNvbnRyb2xzRXh0ZW5zaW9uU2VydmljZSB9IGZyb20gJy4vYWN0aW9uLWNvbnRyb2xzLWV4dGVuc2lvbi5zZXJ2aWNlJztcbmltcG9ydCB7IENlbGxSZW5kZXJlclNwZWMgfSBmcm9tICcuL2NvbHVtbi9jZWxsLXJlbmRlcmVyJztcbmltcG9ydCB7IENvbHVtbkRpcmVjdGl2ZSB9IGZyb20gJy4vY29sdW1uL2NvbHVtbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQ3VzdG9tQ29sdW1uIH0gZnJvbSAnLi9jb2x1bW4vY3VzdG9tLmNvbHVtbic7XG5pbXBvcnQgeyBFeHBhbmRhYmxlUm93Q29sdW1uIH0gZnJvbSAnLi9jb2x1bW4vZXhwYW5kYWJsZS1yb3ctY29sdW1uL2V4cGFuZGFibGUuZGF0YS1ncmlkLWNvbHVtbic7XG5pbXBvcnQgeyBGaWx0ZXJpbmdGb3JtUmVuZGVyZXJTcGVjLCBGaWx0ZXJpbmdNb2RpZmllciB9IGZyb20gJy4vY29sdW1uL2ZpbHRlcmluZy1mb3JtLXJlbmRlcmVyJztcbmltcG9ydCB7IENvbmZpZ3VyZUN1c3RvbUNvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4vY29uZmlndXJlLWN1c3RvbS1jb2x1bW4nO1xuaW1wb3J0IHtcbiAgREFUQV9HUklEX0NPTkZJR1VSQVRJT05fU1RSQVRFR1ksXG4gIERhdGFHcmlkQ29uZmlndXJhdGlvblN0cmF0ZWd5LFxuICBHcmlkQ29uZmlnQ29udGV4dCxcbiAgR3JpZENvbmZpZ1BhcnQsXG4gIEdyaWRFdmVudFR5cGVcbn0gZnJvbSAnLi9kYXRhLWdyaWQtY29uZmlndXJhdGlvbi5tb2RlbCc7XG5pbXBvcnQge1xuICBBY3Rpb25Db250cm9sLFxuICBBY3Rpb25Db250cm9sSG9vayxcbiAgQnVpbHRJbkFjdGlvblR5cGUsXG4gIEJ1bGtBY3Rpb25Db250cm9sLFxuICBDb2x1bW4sXG4gIENvbHVtbkNvbmZpZyxcbiAgQ29sdW1uRGF0YVR5cGUsXG4gIEN1c3RvbUNvbHVtbkNvbmZpZyxcbiAgRGF0YUdyaWQsXG4gIERhdGFTb3VyY2VTdGF0cyxcbiAgRGlzcGxheU9wdGlvbnMsXG4gIEZpbHRlcixcbiAgRmlsdGVyQ2hpcCxcbiAgRmlsdGVyaW5nQWN0aW9uVHlwZSxcbiAgR3JpZENvbmZpZyxcbiAgSGVhZGVyQWN0aW9uQ29udHJvbCxcbiAgUGFnaW5hdGlvbixcbiAgUm93LFxuICBTZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrLFxuICBTb3J0T3JkZXIsXG4gIFNwZWNpYWxDb2x1bW5OYW1lLFxuICBtaW5Db2x1bW5HcmlkVHJhY2tTaXplLFxuICByYXRpb3NCeUNvbHVtblR5cGVzXG59IGZyb20gJy4vZGF0YS1ncmlkLm1vZGVsJztcbmltcG9ydCB7IERhdGFHcmlkU2VydmljZSB9IGZyb20gJy4vZGF0YS1ncmlkLnNlcnZpY2UnO1xuaW1wb3J0IHsgRXhwYW5kYWJsZVJvd0RpcmVjdGl2ZSB9IGZyb20gJy4vZXhwYW5kYWJsZS1yb3cuZGlyZWN0aXZlJztcbmltcG9ydCB7IEdyaWREYXRhU291cmNlIH0gZnJvbSAnLi9ncmlkLWRhdGEtc291cmNlJztcbmltcG9ydCB7IFBYX0FDVElPTlMsIFBYX0VWRU5UX05BTUUgfSBmcm9tICcuL3Byb2R1Y3QtZXhwZXJpZW5jZS5jb25zdGFudHMnO1xuXG5lbnVtIFNvcnRpbmdPcmRlciB7XG4gIEFTQyA9ICdhc2MnLFxuICBERVNDID0gJ2Rlc2MnXG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1kYXRhLWdyaWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS1ncmlkLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDogeyBjbGFzczogJ2QtY29udGVudHMnIH0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IFBST0RVQ1RfRVhQRVJJRU5DRV9FVkVOVF9TT1VSQ0UsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEYXRhR3JpZENvbXBvbmVudClcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgRGF0YUdyaWRDb21wb25lbnRcbiAgaW1wbGVtZW50cyBEYXRhR3JpZCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBQcm9kdWN0RXhwZXJpZW5jZUV2ZW50U291cmNlXG57XG4gIC8qKiBUaGUgdGl0bGUgZm9yIHRoZSBkYXRhIGdyaWQsIGl0J3MgZGlzcGxheWVkIGluIHRoZSBncmlkJ3MgaGVhZGVyLiAqL1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gZ2V0dGV4dCgnSXRlbXMnKTtcbiAgLyoqIFRoZSBsYWJlbCBmb3IgbG9hZCBtb3JlIGJ1dHRvbi4gKi9cbiAgQElucHV0KCkgbG9hZE1vcmVJdGVtc0xhYmVsOiBzdHJpbmcgPSBnZXR0ZXh0KCdMb2FkIG1vcmUgaXRlbXMnKTtcbiAgLyoqIFRoZSBsYWJlbCBmb3IgbG9hZGluZyBpbmRpY2F0b3IuICovXG4gIEBJbnB1dCgpIGxvYWRpbmdJdGVtc0xhYmVsOiBzdHJpbmcgPSBnZXR0ZXh0KCdMb2FkaW5nIGl0ZW1z4oCmJyk7XG4gIC8qKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGV4dCBzZWFyY2ggaW5wdXQgaXMgc2hvd24gaW4gdGhlIGdyaWQncyBoZWFkZXIuICovXG4gIEBJbnB1dCgpIHNob3dTZWFyY2ggPSBmYWxzZTtcbiAgLyoqIFRha2VzIGFuIGV2ZW50IGVtaXR0ZXIuIFdoZW4gYW4gZXZlbnQgaXMgZW1pdHRlZCwgdGhlIGdyaWQgd2lsbCBiZSByZWxvYWRlZC4gKi9cbiAgQElucHV0KCkgcmVmcmVzaDogRXZlbnRFbWl0dGVyPHZvaWQ+O1xuXG4gIGNvbHVtbnM6IENvbHVtbltdID0gW107XG4gIC8qKiBUaGUgbGlzdCBvZiBjb2x1bW5zIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgZ3JpZC4gKi9cbiAgQElucHV0KCdjb2x1bW5zJylcbiAgX2NvbHVtbnM6IENvbHVtbltdO1xuXG4gIGRhdGFTb3VyY2UgPSBuZXcgR3JpZERhdGFTb3VyY2UoKTtcbiAgcm93czogUm93W107XG4gIC8qKiBUaGUgbGlzdCBvZiByb3dzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgZ3JpZCAodXNlZCBmb3IgY2xpZW50IHNpZGUgZGF0YSkuICovXG4gIEBJbnB1dCgncm93cycpXG4gIHNldCBfcm93cyhyb3dzOiBSb3dbXSkge1xuICAgIHRoaXMucm93cyA9IHJvd3MgfHwgW107XG4gIH1cblxuICBmaWx0ZXJpbmdMYWJlbHNQYXJhbXMgPSB7XG4gICAgZmlsdGVyZWRJdGVtc0NvdW50OiAwLFxuICAgIGFsbEl0ZW1zQ291bnQ6IDBcbiAgfTtcblxuICBwYWdpbmF0aW9uOiBQYWdpbmF0aW9uO1xuICBwYWdpbmF0aW9uTGFiZWxQYXJhbXMgPSB7XG4gICAgcGFnZUZpcnN0SXRlbUlkeDogMCxcbiAgICBwYWdlTGFzdEl0ZW1JZHg6IDAsXG4gICAgaXRlbXNUb3RhbDogMFxuICB9O1xuICBsYXN0Q2xpY2tlZFJvdzogUm93O1xuICByZWFkb25seSBwb3NzaWJsZVBhZ2VTaXplczogbnVtYmVyW10gPSBbMjUsIDUwLCAxMDBdO1xuICByZWFkb25seSBtaW5Qb3NzaWJsZVBhZ2VTaXplID0gTWF0aC5taW4oLi4udGhpcy5wb3NzaWJsZVBhZ2VTaXplcyk7XG4gIC8qKiBQYWdpbmF0aW9uIHNldHRpbmdzLCBlLmcuIGFsbG93cyBmb3Igc2V0dGluZyBjdXJyZW50IHBhZ2Ugb3IgcGFnZSBzaXplLiAqL1xuICBASW5wdXQoJ3BhZ2luYXRpb24nKVxuICBzZXQgX3BhZ2luYXRpb24ocGFnaW5hdGlvbjogUGFnaW5hdGlvbikge1xuICAgIHRoaXMucGFnaW5hdGlvbiA9IHBhZ2luYXRpb247XG4gIH1cblxuICBpbmZpbml0ZVNjcm9sbDogTG9hZE1vcmVNb2RlO1xuICAvKiogU2V0cyBsb2FkIG1vcmUgbW9kZS4gKi9cbiAgQElucHV0KCdpbmZpbml0ZVNjcm9sbCcpXG4gIHNldCBfaW5maW5pdGVTY3JvbGwoaW5maW5pdGVTY3JvbGw6IExvYWRNb3JlTW9kZSkge1xuICAgIHRoaXMuaW5maW5pdGVTY3JvbGwgPSBpbmZpbml0ZVNjcm9sbDtcbiAgfVxuXG4gIHNlcnZlclNpZGVEYXRhQ2FsbGJhY2s6IFNlcnZlclNpZGVEYXRhQ2FsbGJhY2s7XG4gIC8qKlxuICAgKiBTZXRzIGEgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSBpbnZva2VkIHdoZW5ldmVyIGRhdGEgbmVlZHMgdG8gYmUgbG9hZGVkIGZyb20gc2VydmVyLlxuICAgKiBUaGUgZnVuY3Rpb24gc2hvdWxkIHRha2UgW1tEYXRhU291cmNlTW9kaWZpZXJdXSBhbmQgcmV0dXJuIFtbU2VydmVyU2lkZURhdGFSZXN1bHRdXS5cbiAgICovXG4gIEBJbnB1dCgnc2VydmVyU2lkZURhdGFDYWxsYmFjaycpXG4gIHNldCBfc2VydmVyU2lkZURhdGFDYWxsYmFjayhzZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrOiBTZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrKSB7XG4gICAgdGhpcy5zZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrID0gc2VydmVyU2lkZURhdGFDYWxsYmFjaztcbiAgfVxuXG4gIHNlbGVjdGFibGUgPSBmYWxzZTtcbiAgLyoqIERldGVybWluZXMgd2hldGhlciBpdGVtcyBjYW4gYmUgc2VsZWN0ZWQgYnkgY2xpY2tpbmcgYSBjaGVja2JveCBpbiB0aGUgZmlyc3QgY29sdW1uLiAqL1xuICBASW5wdXQoJ3NlbGVjdGFibGUnKVxuICBzZXQgX3NlbGVjdGFibGUoc2VsZWN0YWJsZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2VsZWN0YWJsZSA9IHNlbGVjdGFibGU7XG4gIH1cblxuICBzaW5nbGVTZWxlY3Rpb24gPSBmYWxzZTtcbiAgLyoqIFJlc3RyaWN0cyBzZWxlY3Rpb24gdG8gYSBzaW5nbGUgcm93IG9ubHkuIFNlbGVjdGlvbiBjb2x1bW4gZGlzcGxheXMgcmFkaW8gYnV0dG9uIGluc3RlYWQgb2YgY2hlY2tib3hlcyAqL1xuICBASW5wdXQoJ3NpbmdsZVNlbGVjdGlvbicpXG4gIHNldCBfc2luZ2xlU2VsZWN0aW9uKHNpbmdsZVNlbGVjdGlvbjogYm9vbGVhbikge1xuICAgIHRoaXMuc2luZ2xlU2VsZWN0aW9uID0gc2luZ2xlU2VsZWN0aW9uO1xuICB9XG5cbiAgc2VsZWN0aW9uUHJpbWFyeUtleSA9ICdpZCc7XG4gIC8qKiBEZXRlcm1pbmVzIHdoaWNoIGl0ZW0ncyBwcm9wZXJ0eSB3aWxsIGJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggc2VsZWN0aW9uIHN0YXR1cy4gKi9cbiAgQElucHV0KCdzZWxlY3Rpb25QcmltYXJ5S2V5JylcbiAgc2V0IF9zZWxlY3Rpb25QcmltYXJ5S2V5KHNlbGVjdGlvblByaW1hcnlLZXk6IHN0cmluZykge1xuICAgIHRoaXMuc2VsZWN0aW9uUHJpbWFyeUtleSA9IHNlbGVjdGlvblByaW1hcnlLZXk7XG4gIH1cblxuICBkaXNwbGF5T3B0aW9uczogRGlzcGxheU9wdGlvbnMgPSB7XG4gICAgc3RyaXBlZDogdHJ1ZSxcbiAgICBib3JkZXJlZDogZmFsc2UsXG4gICAgZ3JpZEhlYWRlcjogdHJ1ZSxcbiAgICBmaWx0ZXI6IHRydWUsXG4gICAgaG92ZXI6IHRydWVcbiAgfTtcbiAgLyoqIFNldHMgZGlzcGxheSBvcHRpb25zLiAqL1xuICBASW5wdXQoJ2Rpc3BsYXlPcHRpb25zJylcbiAgc2V0IF9kaXNwbGF5T3B0aW9ucyhkaXNwbGF5T3B0aW9uczogRGlzcGxheU9wdGlvbnMpIHtcbiAgICB0aGlzLmRpc3BsYXlPcHRpb25zID0geyAuLi50aGlzLmRpc3BsYXlPcHRpb25zLCAuLi5kaXNwbGF5T3B0aW9ucyB9O1xuICB9XG5cbiAgYWN0aW9uQ29udHJvbHM6IEFjdGlvbkNvbnRyb2xbXSA9IFtdO1xuICAvKiogU2V0cyBhY3Rpb24gY29udHJvbHMgKGFjdGlvbnMgYXZhaWxhYmxlIGZvciBpbmRpdmlkdWFsIGl0ZW1zKS4gKi9cbiAgQElucHV0KCdhY3Rpb25Db250cm9scycpXG4gIHNldCBfYWN0aW9uQ29udHJvbHMoYWN0aW9uQ29udHJvbHM6IEFjdGlvbkNvbnRyb2xbXSkge1xuICAgIHRoaXMuYWN0aW9uQ29udHJvbHNJbnB1dCQubmV4dChhY3Rpb25Db250cm9scyk7XG4gIH1cblxuICBidWxrQWN0aW9uQ29udHJvbHM6IEJ1bGtBY3Rpb25Db250cm9sW107XG4gIC8qKiBTZXRzIGJ1bGsgYWN0aW9uIGNvbnRyb2xzIChhY3Rpb25zIGF2YWlsYWJsZSBmb3IgaXRlbXMgc2VsZWN0ZWQgYnkgdXNlcikuICovXG4gIEBJbnB1dCgnYnVsa0FjdGlvbkNvbnRyb2xzJylcbiAgc2V0IF9idWxrQWN0aW9uQ29udHJvbHMoYnVsa0FjdGlvbkNvbnRyb2xzOiBCdWxrQWN0aW9uQ29udHJvbFtdKSB7XG4gICAgdGhpcy5idWxrQWN0aW9uQ29udHJvbHMgPSBidWxrQWN0aW9uQ29udHJvbHMgfHwgW107XG4gIH1cblxuICBoZWFkZXJBY3Rpb25Db250cm9sczogSGVhZGVyQWN0aW9uQ29udHJvbFtdO1xuICAvKiogU2V0cyBoZWFkZXIgYWN0aW9uIGNvbnRyb2xzIChhY3Rpb25zIGF2YWlsYWJsZSBmcm9tIGRhdGEgZ3JpZCBoZWFkZXIpLiAqL1xuICBASW5wdXQoJ2hlYWRlckFjdGlvbkNvbnRyb2xzJylcbiAgc2V0IF9oZWFkZXJBY3Rpb25Db250cm9scyhoZWFkZXJBY3Rpb25Db250cm9sczogSGVhZGVyQWN0aW9uQ29udHJvbFtdKSB7XG4gICAgdGhpcy5oZWFkZXJBY3Rpb25Db250cm9scyA9IGhlYWRlckFjdGlvbkNvbnRyb2xzIHx8IFtdO1xuICB9XG5cbiAgLyoqIFNldHMgaW5pdGlhbCBzZWFyY2ggdGV4dC4gKi9cbiAgQElucHV0KClcbiAgc2VhcmNoVGV4dCA9ICcnO1xuXG4gIC8qKiBEZXRlcm1pbmVzIGlmIGN1c3RvbSBjb2x1bW5zIGJ1dHRvbiB3aWxsIGJlIGVuYWJsZWQuICovXG4gIEBJbnB1dCgpXG4gIGNvbmZpZ3VyZUNvbHVtbnNFbmFibGVkID0gdHJ1ZTtcblxuICAvKiogU2hvd3MgdGhlIHdhcm5pbmcgZm9yIHRoZSBzdWItYXNzZXRzIGNvdW50ZXIgKi9cbiAgQElucHV0KClcbiAgc2hvd0NvdW50ZXJXYXJuaW5nID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGNsYXNzIG5hbWUgdXNlZCBmb3IgYWN0aXZlIHJvd3MgKGxhc3QgY2xpY2tlZCkuXG4gICAqIFNldCBlbXB0eSBzdHJpbmcgdG8gZGlzYWJsZSBhcHBlbmRpbmcgYWN0aXZlIGNsYXNzIHRvIGdyaWQgcm93cy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGFjdGl2ZUNsYXNzTmFtZSA9ICdhY3RpdmUnO1xuXG4gIC8qKiBEZXRlcm1pbmVzIGlmIHRoZSByb3dzIG9mIHRoZSBkYXRhIGdyaWQgd2lsbCBiZSBleHBhbmRhYmxlLlxuICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAqIC0gYE5PTkVgIC0gbm8gZXhwYW5kYWJsZSByb3dzIChkZWZhdWx0IHZhbHVlKVxuICAgKiAtIGBTWU5DYCAtIGFkZGl0aW9uYWwgY29sdW1uIHdpdGggZXhwYW5kIGJ1dHRvbiBpcyBkaXNwbGF5ZWQgYW5kIGV4cGFuZGFibGUgcm93cyBhcmUgZXhwYW5kaW5nIHN5bmNocm9ub3VzbHkgd2hlbiBidXR0b24gaXMgY2xpY2tlZFxuICAgKiAtIGBBU1lOQ2AgLSBhZGRpdGlvbmFsIGNvbHVtbiB3aXRoIGV4cGFuZCBidXR0b24gaXMgZGlzcGxheWVkIGFuZCBleHBhbmRhYmxlIHJvd3MgYXJlIGV4cGFuZGluZyBhc3luY2hyb25vdXNseSB3aGVuIGJ1dHRvbiBpcyBjbGlja2VkXG4gICAqL1xuICBASW5wdXQoKSBleHBhbmRhYmxlUm93czogJ05PTkUnIHwgJ1NZTkMnIHwgJ0FTWU5DJyA9ICdOT05FJztcblxuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBtb3VzZSBpcyBvdmVyIGEgcm93LiAqL1xuICBAT3V0cHV0KCkgcm93TW91c2VPdmVyID0gbmV3IEV2ZW50RW1pdHRlcjxvYmplY3Q+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIG1vdXNlIGxlYXZlcyBhIHJvdy4gKi9cbiAgQE91dHB1dCgpIHJvd01vdXNlTGVhdmUgPSBuZXcgRXZlbnRFbWl0dGVyPG9iamVjdD4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gYSByb3cgaXMgY2xpY2tlZC4gKi9cbiAgQE91dHB1dCgpIHJvd0NsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxvYmplY3Q+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIGdyaWQncyBjb25maWd1cmF0aW9uIGlzIGNoYW5nZWQuICovXG4gIEBPdXRwdXQoKSBvbkNvbmZpZ0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8R3JpZENvbmZpZz4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IGJlZm9yZSB0aGUgZmlsdGVyIGlzIGFwcGxpZWQuICovXG4gIEBPdXRwdXQoKSBvbkJlZm9yZUZpbHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8b2JqZWN0PigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgYmVmb3JlIHRoZSBzZWFyY2ggaXMgcGVyZm9ybWVkLiAqL1xuICBAT3V0cHV0KCkgb25CZWZvcmVTZWFyY2ggPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gYSBmaWx0ZXIgaXMgYXBwbGllZCBpbiBhIGNvbHVtbi4gKi9cbiAgQE91dHB1dCgpIG9uRmlsdGVyID0gbmV3IEV2ZW50RW1pdHRlcjx7XG4gICAgY29sdW1uTmFtZT86IHN0cmluZztcbiAgICBkcm9wZG93bj86IEJzRHJvcGRvd25EaXJlY3RpdmU7XG4gICAgZmlsdGVyaW5nTW9kaWZpZXI/OiBGaWx0ZXI7XG4gIH0+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIGl0ZW1zIHNlbGVjdGlvbiBjaGFuZ2VzLiBUaGUgYXJyYXkgY29udGFpbnMga2V5cyBvZiBzZWxlY3RlZCBpdGVtcyAoa2V5IHByb3BlcnR5IGlzIGRlZmluZWQgYnkgYHNlbGVjdGlvblByaW1hcnlLZXlgKS4gKi9cbiAgQE91dHB1dCgpIGl0ZW1zU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmdbXT4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gcmVsb2FkIGJ1dHRvbiBpcyBjbGlja2VkLiAqL1xuICBAT3V0cHV0KCkgb25SZWxvYWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIGEgY3VzdG9tIGNvbHVtbiBpcyBhZGRlZCAqL1xuICBAT3V0cHV0KCkgb25BZGRDdXN0b21Db2x1bW4gPSBuZXcgRXZlbnRFbWl0dGVyPEN1c3RvbUNvbHVtbkNvbmZpZz4oKTtcbiAgLyoqIEVtaXRzIGFuIGV2ZW50IHdoZW4gYSBjdXN0b20gY29sdW1uIGlzIHJlbW92ZWQgKi9cbiAgQE91dHB1dCgpIG9uUmVtb3ZlQ3VzdG9tQ29sdW1uID0gbmV3IEV2ZW50RW1pdHRlcjxDb2x1bW4+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCBhZnRlciB0aGUgY29sdW1uIGZpbHRlciBoYXMgYmVlbiByZXNldCAqL1xuICBAT3V0cHV0KCkgb25Db2x1bW5GaWx0ZXJSZXNldCA9IG5ldyBFdmVudEVtaXR0ZXI8Q29sdW1uPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBjb2x1bW4gc29ydGluZyBoYXMgYmVlbiBjaGFuZ2VkICovXG4gIEBPdXRwdXQoKSBvblNvcnQgPSBuZXcgRXZlbnRFbWl0dGVyPEdyaWRDb25maWc+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIHBhZ2Ugc2l6ZSBoYXMgYmVlbiBjaGFuZ2VkICovXG4gIEBPdXRwdXQoKSBvblBhZ2VTaXplQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxHcmlkQ29uZmlnPigpO1xuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBjb2x1bW4gb3JkZXIgaGFzIGJlZW4gY2hhbmdlZCAqL1xuICBAT3V0cHV0KCkgb25Db2x1bW5SZW9yZGVyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEdyaWRDb25maWc+KCk7XG4gIC8qKiBFbWl0cyBhbiBldmVudCB3aGVuIGNvbHVtbiBvcmRlciBoYXMgYmVlbiBjaGFuZ2VkICovXG4gIEBPdXRwdXQoKSBvbkNvbHVtblZpc2liaWxpdHlDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEdyaWRDb25maWc+KCk7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihDb2x1bW5EaXJlY3RpdmUpIGNvbHVtblJlbmRlcmVyczogUXVlcnlMaXN0PENvbHVtbkRpcmVjdGl2ZT47XG5cbiAgQENvbnRlbnRDaGlsZChFeHBhbmRhYmxlUm93RGlyZWN0aXZlKVxuICBleHBhbmRhYmxlUm93OiBFeHBhbmRhYmxlUm93RGlyZWN0aXZlO1xuXG4gIEBWaWV3Q2hpbGQoJ3Njcm9sbCcsIHsgc3RhdGljOiB0cnVlIH0pIHNjcm9sbENvbnRhaW5lcjogRWxlbWVudFJlZjtcblxuICBAVmlld0NoaWxkKCdpbmZpbml0ZVNjcm9sbENvbnRhaW5lcicsIHsgc3RhdGljOiBmYWxzZSwgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxuICBpbmZpbml0ZVNjcm9sbENvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZjtcblxuICBAQ29udGVudENoaWxkKEVtcHR5U3RhdGVDb250ZXh0RGlyZWN0aXZlKSBlbXB0eVN0YXRlOiBFbXB0eVN0YXRlQ29udGV4dERpcmVjdGl2ZTtcblxuICBsb2FkTW9yZUNvbXBvbmVudDogTG9hZE1vcmVDb21wb25lbnQ7XG5cbiAgY29sdW1uTmFtZXMgPSBbXTtcblxuICBzdHlsZXMgPSB7XG4gICAgdGFibGVDdXJzb3I6ICdhdXRvJyxcbiAgICBncmlkVGVtcGxhdGVDb2x1bW5zOiB1bmRlZmluZWQsXG4gICAgZ3JpZEluZmluaXRlU2Nyb2xsQ29sdW1uOiB1bmRlZmluZWRcbiAgfTtcblxuICBzZWFyY2hUZXh0JCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBmaWx0ZXJpbmdBcHBsaWVkID0gZmFsc2U7XG4gIGNvbHVtbnNXaXRoRmlsdGVyc0FwcGxpZWQ6IENvbHVtbltdID0gW107XG5cbiAgdG90YWxQYWdlc0NvdW50JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPihJbmZpbml0eSk7XG4gIGhpZGVQYWdpbmF0aW9uJCA9IHRoaXMudG90YWxQYWdlc0NvdW50JC5waXBlKFxuICAgIG1hcCh0b3RhbFBhZ2VzQ291bnQgPT4gdG90YWxQYWdlc0NvdW50IDw9IDEpLFxuICAgIGRlbGF5KDApIC8vIHByZXZlbnRzIEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXJyb3JcbiAgKTtcblxuICBzZWxlY3RlZEl0ZW1JZHM6IHN0cmluZ1tdID0gW107XG4gIGN1cnJlbnRQYWdlU2VsZWN0aW9uU3RhdGUgPSB7XG4gICAgYWxsU2VsZWN0ZWQ6IGZhbHNlLFxuICAgIGFsbERlc2VsZWN0ZWQ6IHRydWVcbiAgfTtcblxuICBidWlsdEluQWN0aW9uVHlwZSA9IHtcbiAgICBFZGl0OiBCdWlsdEluQWN0aW9uVHlwZS5FZGl0LFxuICAgIERlbGV0ZTogQnVpbHRJbkFjdGlvblR5cGUuRGVsZXRlLFxuICAgIEV4cG9ydDogQnVpbHRJbkFjdGlvblR5cGUuRXhwb3J0XG4gIH07XG5cbiAgY29uZmlybVJlbW92ZUNvbHVtbkJ1dHRvbnM6IFBvcG92ZXJDb25maXJtQnV0dG9uc1tdID0gW1xuICAgIHtcbiAgICAgIGxhYmVsOiBnZXR0ZXh0KCdDYW5jZWwnKSxcbiAgICAgIGFjdGlvbjogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKVxuICAgIH0sXG4gICAge1xuICAgICAgbGFiZWw6IGdldHRleHQoJ1JlbW92ZWBjb2x1bW4sdmVyYmAnKSxcbiAgICAgIHN0YXR1czogJ2RhbmdlcicsXG4gICAgICBhY3Rpb246ICgpID0+IFByb21pc2UucmVzb2x2ZSh0cnVlKVxuICAgIH1cbiAgXTtcblxuICBpc0NvbmZpZ0NvbnRleHRLbm93biA9IGZhbHNlO1xuICBlbXB0eVN0YXRlQ29udGV4dCQ6IE9ic2VydmFibGU8RGF0YVNvdXJjZVN0YXRzPjtcblxuICAvKipcbiAgICogQSBtYXAgb2Ygcm93cyB3aGljaCBoYXZlIGJlZW4gZXhwYW5kZWQuXG4gICAqL1xuICBleHBhbmRlZFJvd3M6IE1hcDxSb3csIHsgdmlzaWJsZSQ6IFN1YmplY3Q8Ym9vbGVhbj4gfCBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gfT4gPSBuZXcgTWFwKCk7XG5cbiAgLyoqIFByb2R1Y3QgZXhwZXJpZW5jZSBjb25zdGFudHMgZGVjbGFyYXRpb25zICovXG4gIHByb2R1Y3RFeHBlcmllbmNlRXZlbnQ6IFByb2R1Y3RFeHBlcmllbmNlRXZlbnQgPSB7IGV2ZW50TmFtZTogUFhfRVZFTlRfTkFNRSB9O1xuICBQWF9BQ1RJT05TID0gUFhfQUNUSU9OUztcblxuICByZWFkb25seSBzb3J0Q29sdW1uVGl0bGUgPSBnZXR0ZXh0KCdTb3J0IGNvbHVtbiBcInt7IG5hbWUgfX1cIicpO1xuXG4gIHJlc2l6ZUhhbmRsZU1vdXNlRG93biQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZXZlbnQ6IE1vdXNlRXZlbnQ7IHRhcmdldENvbHVtbk5hbWU6IHN0cmluZyB9PigpO1xuICByZXNpemVIYW5kbGVDb250YWluZXJNb3VzZU1vdmUkID0gbmV3IEV2ZW50RW1pdHRlcjxNb3VzZUV2ZW50PigpO1xuICByZXNpemVIYW5kbGVDb250YWluZXJNb3VzZVVwJCA9IG5ldyBFdmVudEVtaXR0ZXI8TW91c2VFdmVudD4oKTtcblxuICBmaWx0ZXJzSGVscFBvcG92ZXJIdG1sOiBzdHJpbmcgPSBnZXR0ZXh0KCdDbGljayB0aGUgY29sdW1uIGhlYWRlcnMgdG8gYXBwbHkgZmlsdGVycy4nKTtcblxuICBwcml2YXRlIGhlYWRlckJlaW5nUmVzaXplZDoge1xuICAgIGNvbHVtbk5hbWU6IHN0cmluZztcbiAgICBlbDogSFRNTEVsZW1lbnQ7XG4gIH07XG4gIEBWaWV3Q2hpbGRyZW4oQ2RrSGVhZGVyQ2VsbCwgeyByZWFkOiBFbGVtZW50UmVmIH0pIHByaXZhdGUgdGhSZWZzOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG4gIHByaXZhdGUgdGhFbHM6IEhUTUxFbGVtZW50W107XG5cbiAgQFZpZXdDaGlsZChDZGtUYWJsZSwgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHRhYmxlUmVmOiBDZGtUYWJsZTxhbnk+O1xuXG4gIHByaXZhdGUgcmVjcmVhdGVMb2FkTW9yZUNvbXBvbmVudDogYm9vbGVhbjtcblxuICBwcml2YXRlIGNvbHVtbnNJbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgZGVmYXVsdENvbHVtbnM6IENvbHVtbltdID0gW107XG5cbiAgcHJpdmF0ZSByZWxvYWRDb25maWd1cmF0aW9uJDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgcHJpdmF0ZSBhY3Rpb25Db250cm9sc0lucHV0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QWN0aW9uQ29udHJvbFtdPihbXSk7XG5cbiAgcHJpdmF0ZSB1bnN1YnNjcmliZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgU0VBUkNIX0RFQk9VTkNFX1RJTUUgPSA1MDA7XG5cbiAgLyoqXG4gICAqIEV2ZW50IGVtaXR0ZXIsIHRha2luZyBib29sZWFuIHZhbHVlcyB1c2VkIGZvciBsb2FkaW5nIGRhdGEgZ3JpZCBkYXRhIHdpdGggZGVib3VuY2UuXG4gICAqIERlZmF1bHQgdmFsdWUgaXMgc2V0IHRvIGZhbHNlLiBTZXQgdG8gdHJ1ZSBpZiBkYXRhIGdyaWQgaXMgdXNpbmcgaW5maW5pdGUgc2Nyb2xsIGFuZCBwYWdlIHNob3VsZCBiZSByZWxvYWRlZC5cbiAgICogVGhpcyBpcyB1c2VkIHRvIGF2b2lkIGhhdmluZyBtdWx0aXBsZSB0aGlzLmxvYWREYXRhKCkgZnVuY3Rpb24gY2FsbHMuXG4gICAqL1xuICBwcml2YXRlIHRyaWdnZXJMb2FkRGF0YSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBAT3B0aW9uYWwoKVxuICAgIEBJbmplY3QoREFUQV9HUklEX0NPTkZJR1VSQVRJT05fU1RSQVRFR1kpXG4gICAgcHVibGljIGNvbmZpZ3VyYXRpb25TdHJhdGVneTogRGF0YUdyaWRDb25maWd1cmF0aW9uU3RyYXRlZ3ksXG4gICAgcHJpdmF0ZSBkYXRhR3JpZFNlcnZpY2U6IERhdGFHcmlkU2VydmljZSxcbiAgICBwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyLFxuICAgIHByaXZhdGUgZ2FpbnNpZ2h0U2VydmljZTogR2FpbnNpZ2h0U2VydmljZSxcbiAgICBwcml2YXRlIGJzTW9kYWxTZXJ2aWNlOiBCc01vZGFsU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWN0aW9uQ29udHJvbHNTZXJ2aWNlOiBBY3Rpb25Db250cm9sc0V4dGVuc2lvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGVcbiAgKSB7XG4gICAgdGhpcy50cmlnZ2VyTG9hZERhdGEucGlwZShkZWJvdW5jZVRpbWUoMSksIHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpLnN1YnNjcmliZShyZWxvYWQgPT4ge1xuICAgICAgdGhpcy5sb2FkRGF0YShyZWxvYWQpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5yZWxvYWRDb25maWd1cmF0aW9uJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmNvbmZpZ3VyYXRpb25TdHJhdGVneT8uZ2V0Q29uZmlnJCgpID8/IG9mKG51bGwpKSxcbiAgICAgICAgdGFwKGNvbmZpZyA9PiB7XG4gICAgICAgICAgdGhpcy5zZXRDb2x1bW5zKGNvbmZpZyk7XG4gICAgICAgICAgdGhpcy5zZXRQYWdlU2l6ZShjb25maWcpO1xuICAgICAgICAgIHRoaXMudHJpZ2dlckxvYWREYXRhLmVtaXQoISF0aGlzLmluZmluaXRlU2Nyb2xsKTtcbiAgICAgICAgfSksXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmRhdGFTb3VyY2Uuc3RhdHMkKSxcbiAgICAgICAgdGFwKHN0YXRzID0+IHtcbiAgICAgICAgICB0aGlzLmNyZWF0ZUxvYWRNb3JlQ29tcG9uZW50KHN0YXRzKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcmluZ0xhYmVsc1BhcmFtcyhzdGF0cyk7XG4gICAgICAgICAgdGhpcy51cGRhdGVQYWdpbmF0aW9uTGFiZWxQYXJhbXMoc3RhdHMpO1xuICAgICAgICAgIHRoaXMudXBkYXRlUGFnaW5hdGlvbldoZW5Ob0RldmljZXNMYXN0UGFnZShzdGF0cyk7XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmlzQ29uZmlnQ29udGV4dEtub3duID0gISF0aGlzLmNvbmZpZ3VyYXRpb25TdHJhdGVneT8uaXNDb250ZXh0S25vd24oKTtcblxuICAgIHRoaXMuc2VhcmNoVGV4dCRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpLFxuICAgICAgICBkZWJvdW5jZVRpbWUodGhpcy5TRUFSQ0hfREVCT1VOQ0VfVElNRSksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgIHRhcChzZWFyY2hUZXh0ID0+IHtcbiAgICAgICAgICB0aGlzLnNlYXJjaFRleHQgPSBzZWFyY2hUZXh0O1xuICAgICAgICAgIHRoaXMub25CZWZvcmVTZWFyY2guZW1pdCh0aGlzLnNlYXJjaFRleHQpO1xuICAgICAgICAgIHRoaXMudHJpZ2dlckV2ZW50KHtcbiAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5TRUFSQ0gsXG4gICAgICAgICAgICBzZWFyY2hJbnB1dDogc2VhcmNoVGV4dFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMucmVsb2FkKCk7XG4gICAgICB9KTtcblxuICAgIGlmICh0aGlzLnNlbGVjdGFibGUpIHtcbiAgICAgIGNvbWJpbmVMYXRlc3QodGhpcy5kYXRhU291cmNlLmRhdGEkLCB0aGlzLml0ZW1zU2VsZWN0LmFzT2JzZXJ2YWJsZSgpKVxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpKVxuICAgICAgICAuc3Vic2NyaWJlKChbZGF0YV0pID0+IHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50UGFnZUVtcHR5ID0gZGF0YS5sZW5ndGggPT09IDA7XG5cbiAgICAgICAgICB0aGlzLmN1cnJlbnRQYWdlU2VsZWN0aW9uU3RhdGUgPSB7XG4gICAgICAgICAgICBhbGxTZWxlY3RlZDogY3VycmVudFBhZ2VFbXB0eSA/IGZhbHNlIDogZGF0YS5ldmVyeShpdGVtID0+IHRoaXMuaXNJdGVtU2VsZWN0ZWQoaXRlbSkpLFxuICAgICAgICAgICAgYWxsRGVzZWxlY3RlZDogY3VycmVudFBhZ2VFbXB0eSA/IHRydWUgOiBkYXRhLmV2ZXJ5KGl0ZW0gPT4gIXRoaXMuaXNJdGVtU2VsZWN0ZWQoaXRlbSkpXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5yZWxvYWRDb25maWd1cmF0aW9uJC5uZXh0KCk7XG5cbiAgICB0aGlzLmFjdGlvbkNvbnRyb2xzU2VydmljZS5pdGVtcyRcbiAgICAgIC5waXBlKFxuICAgICAgICBzdGFydFdpdGgoW10pLFxuICAgICAgICBzd2l0Y2hNYXAoKGhvb2tzOiBBY3Rpb25Db250cm9sSG9va1tdKSA9PlxuICAgICAgICAgIGZvcmtKb2luKFxuICAgICAgICAgICAgaG9va3MubWFwKGhvb2sgPT5cbiAgICAgICAgICAgICAgdG9PYnNlcnZhYmxlKFxuICAgICAgICAgICAgICAgIGhvb2s/Lm1hdGNoZXNHcmlkXG4gICAgICAgICAgICAgICAgICA/IHRoaXMuc2FmZWx5SW52b2tlTWF0Y2hlcihcbiAgICAgICAgICAgICAgICAgICAgICBob29rLm1hdGNoZXNHcmlkLFxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm91dGUsXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uU3RyYXRlZ3k/LmdldENvbnRleHQoKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICA6IGZhbHNlXG4gICAgICAgICAgICAgICkucGlwZShtYXAobWF0Y2hlcyA9PiAoeyBob29rLCBtYXRjaGVzIH0pKSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApLnBpcGUoc3RhcnRXaXRoKFtdKSlcbiAgICAgICAgKSxcbiAgICAgICAgbWFwKChob29rczogQXJyYXk8eyBob29rOiBBY3Rpb25Db250cm9sSG9vazsgbWF0Y2hlczogYm9vbGVhbiB9PikgPT5cbiAgICAgICAgICBob29rcy5maWx0ZXIoaG9vayA9PiBob29rLm1hdGNoZXMpLm1hcChob29rID0+IGhvb2suaG9vaylcbiAgICAgICAgKSxcbiAgICAgICAgbWFwKChob29rczogQWN0aW9uQ29udHJvbEhvb2tbXSkgPT5cbiAgICAgICAgICBob29rcy5yZWR1Y2UoKGFjdGlvbkNvbnRyb2xzOiBBY3Rpb25Db250cm9sW10sIGN1cnJlbnRIb29rOiBBY3Rpb25Db250cm9sSG9vaykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFsuLi5hY3Rpb25Db250cm9scywgLi4uY2FzdEFycmF5KGN1cnJlbnRIb29rLmFjdGlvbkNvbnRyb2xzKV07XG4gICAgICAgICAgfSwgW10pXG4gICAgICAgICksXG4gICAgICAgIGNvbWJpbmVMYXRlc3RXaXRoKHRoaXMuYWN0aW9uQ29udHJvbHNJbnB1dCQpLFxuICAgICAgICB0YXAoXG4gICAgICAgICAgKFtob29rQ29udHJvbHMsIGlucHV0Q29udHJvbHNdKSA9PlxuICAgICAgICAgICAgKHRoaXMuYWN0aW9uQ29udHJvbHMgPSBbLi4uaW5wdXRDb250cm9scywgLi4uaG9va0NvbnRyb2xzXSlcbiAgICAgICAgKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgaWYgKHRoaXMucmVmcmVzaCkge1xuICAgICAgdGhpcy5yZWZyZXNoLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5jYW5jZWwoKTtcbiAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMucHJvY2Vzc0FuZFBlcnNpc3RDb25maWdDaGFuZ2UoKTtcbiAgICB0aGlzLnVwZGF0ZUNvbHVtbnMoKTtcblxuICAgIC8vIFJlc2V0dGluZyB0aGUgc3RhdHMgc2l6ZSB0byAwIHdoZW4gbWFuYWdlZCBvYmplY3RzIGFyZSBkZWxldGVkIGJ1dCBzaXppbmcgbm90IHlldCB1cGRhdGVkXG4gICAgLy8gVE9ETyByZW1vdmUgYWZ0ZXIgTVRNLTYwMjI2IGlzIHJlc29sdmVkXG4gICAgdGhpcy5lbXB0eVN0YXRlQ29udGV4dCQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmRhdGFTb3VyY2Uuc3RhdHMkLCB0aGlzLmRhdGFTb3VyY2UuZGF0YSRdKS5waXBlKFxuICAgICAgbWFwKChbc3RhdHMsIGRhdGFdKSA9PiB7XG4gICAgICAgIGlmIChzdGF0cy5maWx0ZXJlZFNpemUgPT09IDEgJiYgZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4geyAuLi5zdGF0cywgc2l6ZTogMCwgZmlsdGVyZWRTaXplOiAwIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YXRzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgc2V0RXhwYW5kYWJsZVJvd1Zpc2libGUocm93OiBSb3csIHN1Y2Nlc3M6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgdGhpcy5leHBhbmRlZFJvd3MuZ2V0KHJvdykudmlzaWJsZSQubmV4dCh0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5leHBhbmRlZFJvd3MuZ2V0KHJvdykudmlzaWJsZSQubmV4dChmYWxzZSk7XG4gICAgICB0aGlzLmV4cGFuZGVkUm93cy5kZWxldGUocm93KTtcbiAgICAgIHRoaXMudGFibGVSZWYucmVuZGVyUm93cygpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGV2ZW50KSB7XG4gICAgaWYgKFxuICAgICAgKCghZXZlbnQuX2FjdGlvbkNvbnRyb2xzICYmICFldmVudC5zZWFyY2hUZXh0KSB8fCBldmVudC5fYWN0aW9uQ29udHJvbHM/LmZpcnN0Q2hhbmdlKSAmJlxuICAgICAgdGhpcy5jb2x1bW5zSW5pdGlhbGl6ZWRcbiAgICApIHtcbiAgICAgIGNvbnN0IHJlbG9hZCA9ICEhZXZlbnQuX2luZmluaXRlU2Nyb2xsPy5jdXJyZW50VmFsdWUgJiYgIWV2ZW50Ll9pbmZpbml0ZVNjcm9sbD8uZmlyc3RDaGFuZ2U7XG4gICAgICB0aGlzLnRyaWdnZXJMb2FkRGF0YS5lbWl0KHJlbG9hZCk7XG4gICAgfVxuICAgIGlmICghIWV2ZW50Ll9jb2x1bW5zICYmICFldmVudC5fY29sdW1ucy5maXJzdENoYW5nZSkge1xuICAgICAgdGhpcy5yZWxvYWRDb25maWd1cmF0aW9uJC5uZXh0KCk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlQ29sdW1ucygpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMudXBkYXRlR3JpZENvbHVtbnNTaXplKCk7XG4gICAgdGhpcy51cGRhdGVUaEVscygpO1xuICAgIHRoaXMuc2V0dXBSZXNpemVIYW5kbGUoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMudW5zdWJzY3JpYmUkLm5leHQoKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlJC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgZXhwYW5kKHJvdzogUm93KSB7XG4gICAgY29uc3QgaXNTeW5jRXhwYW5kID0gdGhpcy5leHBhbmRhYmxlUm93cyA9PT0gJ1NZTkMnO1xuICAgIGxldCB2aXNpYmxlU3ViamVjdDogU3ViamVjdDxib29sZWFuPiB8IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPjtcbiAgICBpZiAoaXNTeW5jRXhwYW5kKSB7XG4gICAgICB2aXNpYmxlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3QodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZpc2libGVTdWJqZWN0ID0gbmV3IFN1YmplY3QoKTtcbiAgICB9XG4gICAgdGhpcy5leHBhbmRlZFJvd3Muc2V0KHJvdywgeyB2aXNpYmxlJDogdmlzaWJsZVN1YmplY3QgfSk7XG4gICAgdGhpcy50YWJsZVJlZi5yZW5kZXJSb3dzKCk7XG4gICAgcmV0dXJuIHZpc2libGVTdWJqZWN0O1xuICB9XG5cbiAgY29sbGFwc2Uocm93OiBSb3cpOiB2b2lkIHtcbiAgICB0aGlzLmV4cGFuZGVkUm93cy5kZWxldGUocm93KTtcbiAgICB0aGlzLnRhYmxlUmVmLnJlbmRlclJvd3MoKTtcbiAgfVxuXG4gIGlzUm93RXhwYW5kZWQgPSAoXywgcm93OiBSb3cpOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gISF0aGlzLmV4cGFuZGVkUm93cy5nZXQocm93KTtcbiAgfTtcblxuICBzZXRDb2x1bW5zKGNvbmZpZzogR3JpZENvbmZpZykge1xuICAgIGlmICghIXRoaXMuY29uZmlndXJhdGlvblN0cmF0ZWd5ICYmICFpc0VtcHR5KHRoaXMuX2NvbHVtbnMpKSB7XG4gICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmRhdGFHcmlkU2VydmljZS5hcHBseUNvbmZpZ1RvQ29sdW1ucyhjb25maWcsIHRoaXMuX2NvbHVtbnMpO1xuICAgICAgdGhpcy5jb2x1bW5zSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLl9jb2x1bW5zIHx8IFtdO1xuICAgICAgdGhpcy5jb2x1bW5zSW5pdGlhbGl6ZWQgPSB0aGlzLmNvbHVtbnNJbml0aWFsaXplZCB8fCAhIXRoaXMuX2NvbHVtbnM7XG4gICAgfVxuXG4gICAgdGhpcy5kZWZhdWx0Q29sdW1ucyA9IHRoaXMuY29sdW1ucyB8fCBbXTtcbiAgICB0aGlzLnVwZGF0ZUNvbHVtbnMoKTtcbiAgfVxuXG4gIHNldFBhZ2VTaXplKGNvbmZpZzogR3JpZENvbmZpZykge1xuICAgIGlmICghIWNvbmZpZz8ucGFnaW5hdGlvbikge1xuICAgICAgdGhpcy5wYWdpbmF0aW9uID0ge1xuICAgICAgICAuLi50aGlzLnBhZ2luYXRpb24sXG4gICAgICAgIHBhZ2VTaXplOiBjb25maWcucGFnaW5hdGlvbi5wYWdlU2l6ZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBwYWdlU2l6ZSA9IGdldCh0aGlzLnBhZ2luYXRpb24sICdwYWdlU2l6ZScpO1xuICAgIGlmIChcbiAgICAgIHRoaXMucGFnaW5hdGlvbiAmJlxuICAgICAgIXRoaXMucG9zc2libGVQYWdlU2l6ZXMuZmluZChwb3NzaWJsZVBhZ2VTaXplID0+IHBvc3NpYmxlUGFnZVNpemUgPT09IHBhZ2VTaXplKVxuICAgICkge1xuICAgICAgdGhpcy5wYWdpbmF0aW9uID0geyAuLi50aGlzLnBhZ2luYXRpb24sIHBhZ2VTaXplOiB0aGlzLm1pblBvc3NpYmxlUGFnZVNpemUgfTtcbiAgICB9XG4gIH1cblxuICBvcGVuQ3VzdG9tQ29sdW1uTW9kYWwoKTogdm9pZCB7XG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLmJzTW9kYWxTZXJ2aWNlLnNob3coQ29uZmlndXJlQ3VzdG9tQ29sdW1uQ29tcG9uZW50LCB7XG4gICAgICBjbGFzczogJ21vZGFsLXNtJyxcbiAgICAgIGFyaWFEZXNjcmliZWRieTogJ21vZGFsLWJvZHknLFxuICAgICAgYXJpYUxhYmVsbGVkQnk6ICdtb2RhbC10aXRsZScsXG4gICAgICBpZ25vcmVCYWNrZHJvcENsaWNrOiB0cnVlLFxuICAgICAgaW5pdGlhbFN0YXRlOiB7XG4gICAgICAgIGNvbHVtbnM6IHRoaXMuY29sdW1uc1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbW9kYWxSZWYuY29udGVudC5vbkFkZEN1c3RvbUNvbHVtblxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoY3VzdG9tQ29sdW1uQ29uZmlnOiBDdXN0b21Db2x1bW5Db25maWcpID0+IHtcbiAgICAgICAgICBjb25zdCBmaXJzdEZpeGVkQ29sdW1Qb3NpdGlvbiA9IHRoaXMuY29sdW1ucy5pbmRleE9mKFxuICAgICAgICAgICAgdGhpcy5jb2x1bW5zLmZpbmQoY29sdW1uID0+IGNvbHVtbi5wb3NpdGlvbkZpeGVkKVxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5jb2x1bW5zLnNwbGljZShcbiAgICAgICAgICAgIGZpcnN0Rml4ZWRDb2x1bVBvc2l0aW9uID4gLTEgPyBmaXJzdEZpeGVkQ29sdW1Qb3NpdGlvbiA6IHRoaXMuY29sdW1ucy5sZW5ndGgsXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgbmV3IEN1c3RvbUNvbHVtbihjdXN0b21Db2x1bW5Db25maWcpXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbnMoKTtcbiAgICAgICAgICB0aGlzLnRyaWdnZXJFdmVudCh7XG4gICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuQUREX0NVU1RPTV9DT0xVTU4sXG4gICAgICAgICAgICBjb2x1bW46IGN1c3RvbUNvbHVtbkNvbmZpZy5oZWFkZXIgfHwgY3VzdG9tQ29sdW1uQ29uZmlnLm5hbWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbChtb2RhbFJlZi5vbkhpZGRlbilcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4gdGhpcy5vbkFkZEN1c3RvbUNvbHVtbi5lbWl0KGV2ZW50KSk7XG4gIH1cblxuICBhc3luYyByZW1vdmVDdXN0b21Db2x1bW4oXG4gICAgcG9Db25maXJtOiBQb3BvdmVyQ29uZmlybUNvbXBvbmVudCxcbiAgICBjb2x1bW46IENvbHVtbixcbiAgICBkZENvbmZpZ3VyZUNvbHVtbnM6IEJzRHJvcGRvd25EaXJlY3RpdmVcbiAgKSB7XG4gICAgZGRDb25maWd1cmVDb2x1bW5zLmF1dG9DbG9zZSA9IGZhbHNlO1xuICAgIHBvQ29uZmlybS5tZXNzYWdlID0gZ2V0dGV4dCgnRG8geW91IHdhbnQgdG8gcmVtb3ZlIHRoaXMgY29sdW1uPycpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZW1vdmU6IGJvb2xlYW4gPSBhd2FpdCBwb0NvbmZpcm0uc2hvdyh0aGlzLmNvbmZpcm1SZW1vdmVDb2x1bW5CdXR0b25zKTtcbiAgICAgIGlmIChyZW1vdmUpIHtcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sPy5uYW1lICE9PSBjb2x1bW4/Lm5hbWUpO1xuICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbnMoKTtcbiAgICAgICAgdGhpcy5vblJlbW92ZUN1c3RvbUNvbHVtbi5lbWl0KGNvbHVtbik7XG4gICAgICAgIHRoaXMudHJpZ2dlckV2ZW50KHtcbiAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuUkVNT1ZFX0NVU1RPTV9DT0xVTU4sXG4gICAgICAgICAgY29sdW1uOiBjb2x1bW4uaGVhZGVyIHx8IGNvbHVtbi5uYW1lXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZFNlcnZlckZhaWx1cmUoZSk7XG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiAoZGRDb25maWd1cmVDb2x1bW5zLmF1dG9DbG9zZSA9IHRydWUpLCAwKTtcbiAgfVxuXG4gIGFzeW5jIHJlbW92ZUZpbHRlcihmaWx0ZXI6IFBhcnRpYWw8RmlsdGVyQ2hpcD4pIHtcbiAgICBjb25zdCBmaWx0ZXJpbmdNb2RpZmllciA9IGZpbHRlci5leHRlcm5hbEZpbHRlclF1ZXJ5XG4gICAgICA/IHsgZXh0ZXJuYWxGaWx0ZXJRdWVyeTogZmlsdGVyLmV4dGVybmFsRmlsdGVyUXVlcnkgfVxuICAgICAgOiB7IGZpbHRlclByZWRpY2F0ZTogZmlsdGVyLmZpbHRlclByZWRpY2F0ZSB9O1xuICAgIHRoaXMub25CZWZvcmVGaWx0ZXIuZW1pdCh7XG4gICAgICBjb2x1bW5OYW1lOiBmaWx0ZXIuY29sdW1uTmFtZSxcbiAgICAgIGRyb3Bkb3duOiB1bmRlZmluZWQsXG4gICAgICBmaWx0ZXJpbmdNb2RpZmllclxuICAgIH0pO1xuICAgIGlmIChcbiAgICAgIChmaWx0ZXIuZXh0ZXJuYWxGaWx0ZXJRdWVyeSAmJiAhdGhpcy5jaGVja0lmQW55VmFsdWVzRXhpc3QoZmlsdGVyLmV4dGVybmFsRmlsdGVyUXVlcnkpKSB8fFxuICAgICAgZmlsdGVyLmZpbHRlclByZWRpY2F0ZVxuICAgICkge1xuICAgICAgdGhpcy51cGRhdGVGaWx0ZXJpbmcoW2ZpbHRlci5jb2x1bW5OYW1lXSwge1xuICAgICAgICB0eXBlOiBGaWx0ZXJpbmdBY3Rpb25UeXBlLlJlc2V0RmlsdGVyXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5vbkZpbHRlci5lbWl0KHsgY29sdW1uTmFtZTogZmlsdGVyLmNvbHVtbk5hbWUgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nKFtmaWx0ZXIuY29sdW1uTmFtZV0sIHtcbiAgICAgICAgdHlwZTogRmlsdGVyaW5nQWN0aW9uVHlwZS5BcHBseUZpbHRlcixcbiAgICAgICAgcGF5bG9hZDogeyBmaWx0ZXJpbmdNb2RpZmllciB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMub25GaWx0ZXIuZW1pdCh7XG4gICAgICAgIGNvbHVtbk5hbWU6IGZpbHRlci5jb2x1bW5OYW1lLFxuICAgICAgICBkcm9wZG93bjogdW5kZWZpbmVkLFxuICAgICAgICBmaWx0ZXJpbmdNb2RpZmllclxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy50cmlnZ2VyRXZlbnQoe1xuICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLlJFTU9WRV9GSUxURVIsXG4gICAgICBjb2x1bW46IGZpbHRlci5jb2x1bW5OYW1lLFxuICAgICAgZmlsdGVyaW5nTW9kaWZpZXJcbiAgICB9KTtcbiAgfVxuXG4gIHRyYWNrQnlOYW1lKGluZGV4LCBpdGVtKSB7XG4gICAgcmV0dXJuIGl0ZW0ubmFtZTtcbiAgfVxuXG4gIHJlc29sdmVDZWxsVmFsdWUocm93LCBwYXRoKSB7XG4gICAgcmV0dXJuIGZsb3coW1xuICAgICAgeCA9PiB0aGlzLmRhdGFTb3VyY2UucmVzb2x2ZVZhbHVlKHgsIHBhdGgpLFxuICAgICAgdGhpcy5kYXRhU291cmNlLnJlc29sdmVGdW5jdGlvbixcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5ub3JtYWxpemVOaWxcbiAgICBdKShyb3cpO1xuICB9XG5cbiAgY2hhbmdlU29ydE9yZGVyKGNvbHVtbk5hbWUpIHtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZCgoeyBuYW1lIH0pID0+IG5hbWUgPT09IGNvbHVtbk5hbWUpO1xuXG4gICAgaWYgKGNvbHVtbikge1xuICAgICAgY29uc3QgeyBzb3J0T3JkZXIgfSA9IGNvbHVtbjtcblxuICAgICAgaWYgKCFzb3J0T3JkZXIpIHtcbiAgICAgICAgdGhpcy51cGRhdGVTb3J0aW5nKFtjb2x1bW5OYW1lXSwgU29ydGluZ09yZGVyLkFTQyk7XG4gICAgICB9IGVsc2UgaWYgKHNvcnRPcmRlciA9PT0gU29ydGluZ09yZGVyLkFTQykge1xuICAgICAgICB0aGlzLnVwZGF0ZVNvcnRpbmcoW2NvbHVtbk5hbWVdLCBTb3J0aW5nT3JkZXIuREVTQyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVwZGF0ZVNvcnRpbmcoW2NvbHVtbk5hbWVdLCAnJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlU29ydGluZyhjb2x1bW5OYW1lczogc3RyaW5nW10sIHNvcnRPcmRlcjogU29ydE9yZGVyKSB7XG4gICAgdGhpcy50cmlnZ2VyRXZlbnQoe1xuICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkNIQU5HRV9TT1JUSU5HX09SREVSLFxuICAgICAgY29sdW1uczogY29sdW1uTmFtZXMsXG4gICAgICBzb3J0T3JkZXI6IHNvcnRPcmRlciA9PT0gJycgPyAnbm9uZScgOiBzb3J0T3JkZXJcbiAgICB9KTtcblxuICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1ucy5tYXAoKGNvbHVtbik6IENvbHVtbiA9PiB7XG4gICAgICBpZiAoY29sdW1uTmFtZXMuaW5jbHVkZXMoY29sdW1uLm5hbWUpKSB7XG4gICAgICAgIHJldHVybiB7IC4uLmNvbHVtbiwgc29ydE9yZGVyIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb2x1bW47XG4gICAgfSk7XG4gICAgdGhpcy5lbWl0Q29uZmlnQ2hhbmdlKCdzb3J0Jyk7XG5cbiAgICB0aGlzLnJlbG9hZCgpO1xuICB9XG5cbiAgYXBwbHlGaWx0ZXIoY29sdW1uTmFtZSwgZHJvcGRvd24sIGZpbHRlcmluZ01vZGlmaWVyKSB7XG4gICAgdGhpcy50cmlnZ2VyRXZlbnQoe1xuICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkFQUExZX0ZJTFRFUixcbiAgICAgIGNvbHVtbjogY29sdW1uTmFtZSxcbiAgICAgIGZpbHRlcmluZ01vZGlmaWVyXG4gICAgfSk7XG4gICAgdGhpcy5vbkJlZm9yZUZpbHRlci5lbWl0KHsgY29sdW1uTmFtZSwgZHJvcGRvd24sIGZpbHRlcmluZ01vZGlmaWVyIH0pO1xuICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nKFtjb2x1bW5OYW1lXSwge1xuICAgICAgdHlwZTogRmlsdGVyaW5nQWN0aW9uVHlwZS5BcHBseUZpbHRlcixcbiAgICAgIHBheWxvYWQ6IHsgZmlsdGVyaW5nTW9kaWZpZXIgfVxuICAgIH0pO1xuICAgIGRyb3Bkb3duLmhpZGUoKTtcbiAgICB0aGlzLm9uRmlsdGVyLmVtaXQoeyBjb2x1bW5OYW1lLCBkcm9wZG93biwgZmlsdGVyaW5nTW9kaWZpZXIgfSk7XG4gIH1cblxuICByZXNldEZpbHRlcihjb2x1bW5OYW1lLCBkcm9wZG93bikge1xuICAgIHRoaXMudHJpZ2dlckV2ZW50KHsgYWN0aW9uOiBQWF9BQ1RJT05TLlJFU0VUX0ZJTFRFUiwgY29sdW1uOiBjb2x1bW5OYW1lIH0pO1xuICAgIHRoaXMudXBkYXRlRmlsdGVyaW5nKFtjb2x1bW5OYW1lXSwgeyB0eXBlOiBGaWx0ZXJpbmdBY3Rpb25UeXBlLlJlc2V0RmlsdGVyIH0pO1xuICAgIGRyb3Bkb3duLmhpZGUoKTtcbiAgICB0aGlzLm9uRmlsdGVyLmVtaXQoeyBjb2x1bW5OYW1lLCBkcm9wZG93biB9KTtcbiAgfVxuXG4gIGNsZWFyRmlsdGVycyhyZWxvYWQgPSB0cnVlKSB7XG4gICAgdGhpcy51cGRhdGVGaWx0ZXJpbmcoXG4gICAgICB0aGlzLmNvbHVtbnMubWFwKCh7IG5hbWUgfSkgPT4gbmFtZSksXG4gICAgICB7XG4gICAgICAgIHR5cGU6IEZpbHRlcmluZ0FjdGlvblR5cGUuUmVzZXRGaWx0ZXJcbiAgICAgIH0sXG4gICAgICByZWxvYWRcbiAgICApO1xuICAgIHRoaXMub25GaWx0ZXIuZW1pdCh7fSk7XG4gICAgdGhpcy50cmlnZ2VyRXZlbnQoeyBhY3Rpb246IFBYX0FDVElPTlMuQ0xFQVJfRklMVEVSIH0pO1xuICB9XG5cbiAgdXBkYXRlRmlsdGVyaW5nKFxuICAgIGNvbHVtbk5hbWVzOiBzdHJpbmdbXSxcbiAgICBhY3Rpb246IHtcbiAgICAgIHR5cGU6IEZpbHRlcmluZ0FjdGlvblR5cGU7XG4gICAgICBwYXlsb2FkPzogeyBmaWx0ZXJpbmdNb2RpZmllcjogRmlsdGVyaW5nTW9kaWZpZXIgfTtcbiAgICB9LFxuICAgIHJlbG9hZCA9IHRydWVcbiAgKSB7XG4gICAgdGhpcy5jb2x1bW5zID0gdGhpcy5jb2x1bW5zLm1hcChjb2x1bW4gPT4ge1xuICAgICAgaWYgKGNvbHVtbk5hbWVzLmluY2x1ZGVzKGNvbHVtbi5uYW1lKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmNvbHVtbixcbiAgICAgICAgICAuLi4oYWN0aW9uLnR5cGUgPT09IEZpbHRlcmluZ0FjdGlvblR5cGUuQXBwbHlGaWx0ZXJcbiAgICAgICAgICAgID8gYWN0aW9uLnBheWxvYWQuZmlsdGVyaW5nTW9kaWZpZXJcbiAgICAgICAgICAgIDogdGhpcy5vblJlc2V0RmlsdGVyQWN0aW9uKGNvbHVtbikpXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gY29sdW1uO1xuICAgIH0pO1xuXG4gICAgdGhpcy51cGRhdGVGaWx0ZXJpbmdBcHBsaWVkKCk7XG5cbiAgICBpZiAocmVsb2FkKSB7XG4gICAgICB0aGlzLnJlbG9hZCgpO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUZpbHRlcmluZ0FwcGxpZWQoKSB7XG4gICAgdGhpcy5jb2x1bW5zV2l0aEZpbHRlcnNBcHBsaWVkID0gdGhpcy5jb2x1bW5zLmZpbHRlcih0aGlzLmlzQ29sdW1uRmlsdGVyaW5nQXBwbGllZCk7XG4gICAgdGhpcy5maWx0ZXJpbmdBcHBsaWVkID0gdGhpcy5jb2x1bW5zV2l0aEZpbHRlcnNBcHBsaWVkLmxlbmd0aCA+IDA7XG5cbiAgICB0aGlzLmZpbHRlcnNIZWxwUG9wb3Zlckh0bWwgPSB0aGlzLmZpbHRlcmluZ0FwcGxpZWRcbiAgICAgID8gZ2V0dGV4dChcbiAgICAgICAgICAnQ2xpY2sgdGhlIGNvbHVtbiBoZWFkZXJzIHRvIGFwcGx5IGZpbHRlcnMuIENsaWNrIDxiPkFjdGl2ZSBmaWx0ZXJzPC9iPiBidXR0b24gdG8gbWFuYWdlIGFwcGxpZWQgZmlsdGVycy4nXG4gICAgICAgIClcbiAgICAgIDogZ2V0dGV4dCgnQ2xpY2sgdGhlIGNvbHVtbiBoZWFkZXJzIHRvIGFwcGx5IGZpbHRlcnMuJyk7XG4gIH1cblxuICBpc0NvbHVtbkZpbHRlcmluZ0FwcGxpZWQoY29sdW1uOiBDb2x1bW4pOiBib29sZWFuIHtcbiAgICBjb25zdCB7IGZpbHRlcmFibGUsIGZpbHRlclByZWRpY2F0ZSwgZXh0ZXJuYWxGaWx0ZXJRdWVyeSB9ID0gY29sdW1uO1xuXG4gICAgcmV0dXJuICEhKGZpbHRlcmFibGUgJiYgKGZpbHRlclByZWRpY2F0ZSB8fCBleHRlcm5hbEZpbHRlclF1ZXJ5KSk7XG4gIH1cblxuICB1cGRhdGVQYWdpbmF0aW9uKHsgaXRlbXNQZXJQYWdlLCBwYWdlIH0pIHtcbiAgICBjb25zdCBjb25maWdDaGFuZ2VkID0gdGhpcy5wYWdpbmF0aW9uPy5wYWdlU2l6ZSAhPT0gaXRlbXNQZXJQYWdlO1xuICAgIHRoaXMucGFnaW5hdGlvbiA9IHsgLi4udGhpcy5wYWdpbmF0aW9uLCBwYWdlU2l6ZTogaXRlbXNQZXJQYWdlLCBjdXJyZW50UGFnZTogcGFnZSB9O1xuICAgIHRoaXMubG9hZERhdGEoKTtcbiAgICBpZiAoY29uZmlnQ2hhbmdlZCkge1xuICAgICAgdGhpcy5lbWl0Q29uZmlnQ2hhbmdlKCdwYWdpbmF0aW9uJyk7XG4gICAgfVxuICAgIHRoaXMudHJpZ2dlckV2ZW50KHsgYWN0aW9uOiBQWF9BQ1RJT05TLkNIQU5HRV9QQUdJTkFUSU9OLCBpdGVtc1BlclBhZ2UsIHBhZ2UgfSk7XG4gIH1cblxuICBjbGlja1JlbG9hZCgpIHtcbiAgICB0aGlzLnNlYXJjaFRleHQgPSAnJztcbiAgICB0aGlzLnJlbG9hZCgpO1xuICAgIHRoaXMub25SZWxvYWQubmV4dCgpO1xuICAgIHRoaXMudHJpZ2dlckV2ZW50KHsgYWN0aW9uOiBQWF9BQ1RJT05TLlJFTE9BRCB9KTtcbiAgfVxuXG4gIHJlbG9hZChyZWRpcmVjdCA9IHRydWUpIHtcbiAgICB0aGlzLnBhZ2luYXRpb24gPSB7XG4gICAgICAuLi50aGlzLnBhZ2luYXRpb24sXG4gICAgICBjdXJyZW50UGFnZTogcmVkaXJlY3QgPyAxIDogdGhpcy5wYWdpbmF0aW9uLmN1cnJlbnRQYWdlXG4gICAgfTtcbiAgICB0aGlzLnJlY3JlYXRlTG9hZE1vcmVDb21wb25lbnQgPSB0cnVlO1xuICAgIHRoaXMubG9hZERhdGEodHJ1ZSk7XG4gICAgdGhpcy5zY3JvbGxUb1RvcCgpO1xuICB9XG5cbiAgbG9hZE5leHRQYWdlKCk6IFByb21pc2U8SVJlc3VsdExpc3Q8b2JqZWN0Pj4ge1xuICAgIHRoaXMucGFnaW5hdGlvbiA9IHsgLi4udGhpcy5wYWdpbmF0aW9uLCBjdXJyZW50UGFnZTogdGhpcy5wYWdpbmF0aW9uLm5leHRQYWdlIH07XG5cbiAgICB0aGlzLmxvYWREYXRhKCk7XG5cbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlLnJlc3VsdExpc3QkXG4gICAgICAucGlwZSh0YWtlKDEpKSAvLyBpbiBvcmRlciBmb3IgYHRvUHJvbWlzZWAgdG8gd29yaywgdGhlIG9ic2VydmFibGUgbmVlZHMgdG8gY29tcGxldGVcbiAgICAgIC50b1Byb21pc2UoKVxuICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgICAgcGFnaW5nOiB7XG4gICAgICAgICAgICAuLi5yZXN1bHQucGFnaW5nLFxuICAgICAgICAgICAgbmV4dDogdGhpcy5sb2FkTmV4dFBhZ2UuYmluZCh0aGlzKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBhcyBJUmVzdWx0TGlzdDxvYmplY3Q+O1xuICAgICAgfSk7XG4gIH1cblxuICBnZXRDZWxsUmVuZGVyZXJTcGVjKHsgdmFsdWUsIHJvdywgY29sdW1uTmFtZSB9KTogQ2VsbFJlbmRlcmVyU3BlYyB7XG4gICAgcmV0dXJuIHRoaXMuX2dldENlbGxSZW5kZXJlclNwZWMoeyB0eXBlOiAnQ0VMTCcsIHZhbHVlLCByb3csIGNvbHVtbk5hbWUgfSk7XG4gIH1cblxuICBnZXRIZWFkZXJDZWxsUmVuZGVyZXJTcGVjKHsgdmFsdWUsIGNvbHVtbk5hbWUgfSk6IENlbGxSZW5kZXJlclNwZWMge1xuICAgIHJldHVybiB0aGlzLl9nZXRDZWxsUmVuZGVyZXJTcGVjKHsgdHlwZTogJ0hFQURFUicsIHZhbHVlLCByb3c6IHVuZGVmaW5lZCwgY29sdW1uTmFtZSB9KTtcbiAgfVxuXG4gIGdldEZpbHRlcmluZ0Zvcm1SZW5kZXJlclNwZWMoeyBjb2x1bW4sIGRyb3Bkb3duIH0pOiBGaWx0ZXJpbmdGb3JtUmVuZGVyZXJTcGVjIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVuZGVyZXI6XG4gICAgICAgIGdldCh0aGlzLmdldENvbHVtblJlbmRlcmVyKGNvbHVtbiksICdmaWx0ZXJpbmdGb3JtUmVuZGVyZXJEZWYudGVtcGxhdGUnKSB8fFxuICAgICAgICBjb2x1bW4uZmlsdGVyaW5nRm9ybVJlbmRlcmVyQ29tcG9uZW50LFxuICAgICAgY29udGV4dDoge1xuICAgICAgICBwcm9wZXJ0eTogY29sdW1uLFxuICAgICAgICBhcHBseUZpbHRlcjogdGhpcy5hcHBseUZpbHRlci5iaW5kKHRoaXMsIGNvbHVtbi5uYW1lLCBkcm9wZG93biksXG4gICAgICAgIHJlc2V0RmlsdGVyOiB0aGlzLnJlc2V0RmlsdGVyLmJpbmQodGhpcywgY29sdW1uLm5hbWUsIGRyb3Bkb3duKVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzZXRBbGxJdGVtc1NlbGVjdGVkKHNlbGVjdGVkKSB7XG4gICAgdGhpcy5kYXRhU291cmNlLnNlbGVjdGlvbiRcbiAgICAgIC5waXBlKGZpcnN0KCkpXG4gICAgICAuc3Vic2NyaWJlKCh7IGZpbHRlcmVkRGF0YUlkcyB9KSA9PiB0aGlzLnNldEl0ZW1zU2VsZWN0ZWQoZmlsdGVyZWREYXRhSWRzLCBzZWxlY3RlZCkpO1xuICB9XG5cbiAgc2V0QWxsSXRlbXNJbkN1cnJlbnRQYWdlU2VsZWN0ZWQoc2VsZWN0ZWQpIHtcbiAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSQucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoZGF0YSA9PiB0aGlzLnNldEl0ZW1zU2VsZWN0ZWQoZGF0YSwgc2VsZWN0ZWQpKTtcbiAgfVxuXG4gIHNldEl0ZW1zU2VsZWN0ZWQoaXRlbXM6IGFueSwgc2VsZWN0ZWQpIHtcbiAgICBjb25zdCBpdGVtSWRzID0gaXRlbXMubWFwKChpdGVtOiBvYmplY3QgfCBzdHJpbmcpID0+XG4gICAgICB0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgPyBpdGVtW3RoaXMuc2VsZWN0aW9uUHJpbWFyeUtleV0gOiBpdGVtXG4gICAgKTtcblxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtSWRzID0gc2VsZWN0ZWRcbiAgICAgID8gdW5pb24odGhpcy5zZWxlY3RlZEl0ZW1JZHMsIGl0ZW1JZHMpXG4gICAgICA6IHdpdGhvdXQodGhpcy5zZWxlY3RlZEl0ZW1JZHMsIC4uLml0ZW1JZHMpO1xuICAgIHRoaXMuaXRlbXNTZWxlY3QuZW1pdCh0aGlzLnNlbGVjdGVkSXRlbUlkcyk7XG4gIH1cblxuICBjaGFuZ2VTZWxlY3RlZEl0ZW0oaXRlbTogYW55KSB7XG4gICAgdGhpcy5zZWxlY3RlZEl0ZW1JZHMgPSBbaXRlbVt0aGlzLnNlbGVjdGlvblByaW1hcnlLZXldXTtcbiAgICB0aGlzLml0ZW1zU2VsZWN0LmVtaXQodGhpcy5zZWxlY3RlZEl0ZW1JZHMpO1xuICB9XG5cbiAgY2FuY2VsKCkge1xuICAgIHRoaXMuc2VsZWN0ZWRJdGVtSWRzID0gW107XG4gICAgdGhpcy5pdGVtc1NlbGVjdC5lbWl0KHRoaXMuc2VsZWN0ZWRJdGVtSWRzKTtcbiAgfVxuXG4gIGlzSXRlbVNlbGVjdGVkKGl0ZW0pIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEl0ZW1JZHMuaW5jbHVkZXMoaXRlbVt0aGlzLnNlbGVjdGlvblByaW1hcnlLZXldKTtcbiAgfVxuXG4gIG9uQ29sdW1uRHJvcCh7IHByZXZpb3VzSW5kZXgsIGN1cnJlbnRJbmRleCB9KSB7XG4gICAgY29uc3QgZGlmZmVyZW50SW5kZXggPSBwcmV2aW91c0luZGV4ICE9PSBjdXJyZW50SW5kZXg7XG5cbiAgICBpZiAoZGlmZmVyZW50SW5kZXgpIHtcbiAgICAgIHRoaXMudHJpZ2dlckV2ZW50KHtcbiAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLlJFT1JERVJfQ09MVU1OUyxcbiAgICAgICAgY29sdW1uOiB0aGlzLmNvbHVtbk5hbWVzW3ByZXZpb3VzSW5kZXhdXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY29sdW1ucy5zcGxpY2UocHJldmlvdXNJbmRleCwgMSk7XG4gICAgICB0aGlzLmNvbHVtbnMuc3BsaWNlKGN1cnJlbnRJbmRleCwgMCwgY29sdW1uWzBdKTtcbiAgICAgIHRoaXMuZW1pdENvbmZpZ0NoYW5nZSgncmVvcmRlckNvbHVtbicpO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlQ29sdW1uTmFtZXMoKTtcbiAgICB0aGlzLnVwZGF0ZUdyaWRDb2x1bW5zU2l6ZSgpO1xuICB9XG5cbiAgdXBkYXRlR3JpZENvbHVtbnNTaXplKCkge1xuICAgIHRoaXMuc3R5bGVzID0ge1xuICAgICAgLi4udGhpcy5zdHlsZXMsXG4gICAgICBncmlkVGVtcGxhdGVDb2x1bW5zOiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0U3R5bGUoXG4gICAgICAgIHRoaXMuY29sdW1uc1xuICAgICAgICAgIC5maWx0ZXIoY29sdW1uID0+IGNvbHVtbi52aXNpYmxlKVxuICAgICAgICAgIC5tYXAoKHsgZ3JpZFRyYWNrU2l6ZSB9KSA9PiBncmlkVHJhY2tTaXplKVxuICAgICAgICAgIC5qb2luKCcgJylcbiAgICAgICksXG4gICAgICBncmlkSW5maW5pdGVTY3JvbGxDb2x1bW46IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RTdHlsZShgMSAvIC0xYClcbiAgICB9O1xuICB9XG5cbiAgdXBkYXRlVGhFbHMoKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnRoRWxzID0gdGhpcy50aFJlZnNcbiAgICAgICAgPyB0aGlzLnRoUmVmcy50b0FycmF5KCkubWFwKCh7IG5hdGl2ZUVsZW1lbnQgfSkgPT4gbmF0aXZlRWxlbWVudClcbiAgICAgICAgOiBbXTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8vIFRvIGJlIHJlbW92ZWQgd2hlbiBjb2x1bW5zIGFyZSB0cmFuc2Zvcm1lZCB0byBvYnNlcnZhYmxlcy5cbiAgaXNEcm9wRG93blBsYWNlZFJpZ2h0KGNvbHVtbjogQ29sdW1uKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGluZGV4T2YoXG4gICAgICAgIHRoaXMuY29sdW1ucy5maWx0ZXIoYyA9PiBjLnZpc2libGUpLFxuICAgICAgICBjb2x1bW5cbiAgICAgICkgPlxuICAgICAgdGhpcy5jb2x1bW5zLmZpbHRlcihjID0+IGMudmlzaWJsZSkubGVuZ3RoIC8gMlxuICAgICk7XG4gIH1cblxuICBlbWl0Q29uZmlnQ2hhbmdlKGV2ZW50VHlwZT86IEdyaWRFdmVudFR5cGUpIHtcbiAgICBpZiAodGhpcy5jb2x1bW5zSW5pdGlhbGl6ZWQpIHtcbiAgICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbHVtbnMubWFwKHRoaXMubWFwQ29sdW1uVG9Db25maWcuYmluZCh0aGlzKSk7XG4gICAgICBjb25zdCBjb25maWcgPSB7IGNvbHVtbnMsIHBhZ2luYXRpb246IHRoaXMucGFnaW5hdGlvbiB9O1xuICAgICAgdGhpcy5vbkNvbmZpZ0NoYW5nZS5lbWl0KGNvbmZpZyk7XG4gICAgICBzd2l0Y2ggKGV2ZW50VHlwZSkge1xuICAgICAgICBjYXNlICdzb3J0JzpcbiAgICAgICAgICB0aGlzLm9uU29ydC5lbWl0KGNvbmZpZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3BhZ2luYXRpb24nOlxuICAgICAgICAgIHRoaXMub25QYWdlU2l6ZUNoYW5nZS5lbWl0KGNvbmZpZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3Jlb3JkZXJDb2x1bW4nOlxuICAgICAgICAgIHRoaXMub25Db2x1bW5SZW9yZGVyZWQuZW1pdChjb25maWcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdjaGFuZ2VDb2x1bW5WaXNpYmlsaXR5JzpcbiAgICAgICAgICB0aGlzLm9uQ29sdW1uVmlzaWJpbGl0eUNoYW5nZS5lbWl0KGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdHJpZ2dlckV2ZW50KGV2ZW50RGF0YSkge1xuICAgIHRoaXMuZ2FpbnNpZ2h0U2VydmljZS50cmlnZ2VyRXZlbnQodGhpcy5wcm9kdWN0RXhwZXJpZW5jZUV2ZW50Py5ldmVudE5hbWUgfHwgUFhfRVZFTlRfTkFNRSwge1xuICAgICAgLi4udGhpcy5wcm9kdWN0RXhwZXJpZW5jZUV2ZW50Py5kYXRhLFxuICAgICAgLi4uZXZlbnREYXRhXG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVDbGljayhyb3c6IFJvdykge1xuICAgIHRoaXMubGFzdENsaWNrZWRSb3cgPSByb3c7XG4gICAgdGhpcy5yb3dDbGljay5lbWl0KHJvdyk7XG4gIH1cblxuICBwcml2YXRlIG9uUmVzZXRGaWx0ZXJBY3Rpb24oY29sdW1uOiBDb2x1bW4pIHtcbiAgICB0aGlzLm9uQ29sdW1uRmlsdGVyUmVzZXQuZW1pdChjb2x1bW4pO1xuICAgIHJldHVybiB7XG4gICAgICBmaWx0ZXJQcmVkaWNhdGU6IHVuZGVmaW5lZCxcbiAgICAgIGV4dGVybmFsRmlsdGVyUXVlcnk6IHVuZGVmaW5lZFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIG1hcENvbHVtblRvQ29uZmlnKGNvbHVtbjogQ29sdW1uKTogQ29sdW1uQ29uZmlnIHwgQ3VzdG9tQ29sdW1uQ29uZmlnIHtcbiAgICBsZXQgY29uZmlnO1xuICAgIGlmIChjb2x1bW4uY3VzdG9tKSB7XG4gICAgICBjb25zdCB7IHZpc2libGUsIHNvcnRPcmRlciwgbmFtZSwgZXh0ZXJuYWxGaWx0ZXJRdWVyeSwgaGVhZGVyLCBwYXRoIH0gPSBjb2x1bW47XG4gICAgICBjb25maWcgPSB7XG4gICAgICAgIHZpc2libGUsXG4gICAgICAgIHNvcnRPcmRlcixcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZmlsdGVyOiB7IGV4dGVybmFsRmlsdGVyUXVlcnkgfSxcbiAgICAgICAgaGVhZGVyLFxuICAgICAgICBwYXRoLFxuICAgICAgICBjdXN0b206IHRydWVcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHsgdmlzaWJsZSwgc29ydE9yZGVyLCBuYW1lLCBleHRlcm5hbEZpbHRlclF1ZXJ5IH0gPSBjb2x1bW47XG4gICAgICBjb25maWcgPSB7IHZpc2libGUsIHNvcnRPcmRlciwgbmFtZSwgZmlsdGVyOiB7IGV4dGVybmFsRmlsdGVyUXVlcnkgfSB9O1xuICAgIH1cblxuICAgIGlmIChpc0VtcHR5KGNvbmZpZz8uZmlsdGVyPy5leHRlcm5hbEZpbHRlclF1ZXJ5KSkge1xuICAgICAgZGVsZXRlIGNvbmZpZy5maWx0ZXI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuXG4gIHByaXZhdGUgbG9hZERhdGEocmVsb2FkID0gZmFsc2UpIHtcbiAgICBjb25zdCB7XG4gICAgICByb3dzLFxuICAgICAgY29sdW1ucyxcbiAgICAgIHBhZ2luYXRpb24sXG4gICAgICBzZWFyY2hUZXh0LFxuICAgICAgc2VydmVyU2lkZURhdGFDYWxsYmFjayxcbiAgICAgIHNlbGVjdGFibGUsXG4gICAgICBzZWxlY3Rpb25QcmltYXJ5S2V5LFxuICAgICAgaW5maW5pdGVTY3JvbGxcbiAgICB9ID0gdGhpcztcblxuICAgIHRoaXMuZGF0YVNvdXJjZS5sb2FkRGF0YSh7XG4gICAgICByb3dzLFxuICAgICAgY29sdW1ucyxcbiAgICAgIHBhZ2luYXRpb24sXG4gICAgICBzZWFyY2hUZXh0LFxuICAgICAgc2VydmVyU2lkZURhdGFDYWxsYmFjayxcbiAgICAgIHNlbGVjdGFibGUsXG4gICAgICBzZWxlY3Rpb25QcmltYXJ5S2V5LFxuICAgICAgaW5maW5pdGVTY3JvbGwsXG4gICAgICByZWxvYWRcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ29sdW1ucygpIHtcbiAgICBjb25zdCBzcGVjaWFsQ29sdW1uID0ge1xuICAgICAgc29ydGFibGU6IGZhbHNlLFxuICAgICAgcG9zaXRpb25GaXhlZDogdHJ1ZVxuICAgIH07XG4gICAgY29uc3Qgc2VsZWN0aW9uQ29sdW1uID0gdGhpcy5zZWxlY3RhYmxlXG4gICAgICA/IHtcbiAgICAgICAgICAuLi5zcGVjaWFsQ29sdW1uLFxuICAgICAgICAgIG5hbWU6IHRoaXMuc2luZ2xlU2VsZWN0aW9uID8gU3BlY2lhbENvbHVtbk5hbWUuUmFkaW9CdXR0b24gOiBTcGVjaWFsQ29sdW1uTmFtZS5DaGVja2JveCxcbiAgICAgICAgICBncmlkVHJhY2tTaXplOiAnMzJweCdcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgYWN0aW9uc0NvbHVtbiA9XG4gICAgICB0aGlzLmFjdGlvbkNvbnRyb2xzPy5sZW5ndGggPiAwXG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uc3BlY2lhbENvbHVtbixcbiAgICAgICAgICAgIG5hbWU6IFNwZWNpYWxDb2x1bW5OYW1lLkFjdGlvbnMsXG4gICAgICAgICAgICBncmlkVHJhY2tTaXplOiAnbWlubWF4KDQwcHgsIGF1dG8pJ1xuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBleHBhbmRhYmxlUm93c0NvbHVtbiA9IHRoaXMuZXhwYW5kYWJsZVJvd3MgIT09ICdOT05FJyA/IG5ldyBFeHBhbmRhYmxlUm93Q29sdW1uKCkgOiBudWxsO1xuICAgIGNvbnN0IGNvbHVtbnMgPSBbZXhwYW5kYWJsZVJvd3NDb2x1bW4sIHNlbGVjdGlvbkNvbHVtbiwgLi4udGhpcy5jb2x1bW5zLCBhY3Rpb25zQ29sdW1uXVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLm1hcCh0aGlzLndpdGhDb2x1bW5EZWZhdWx0cyk7XG5cbiAgICB0aGlzLmNvbHVtbnMgPSB1bmlxQnkoY29sdW1ucywgJ25hbWUnKTtcbiAgICB0aGlzLnVwZGF0ZUNvbHVtbk5hbWVzKCk7XG4gICAgdGhpcy51cGRhdGVHcmlkQ29sdW1uc1NpemUoKTtcbiAgICB0aGlzLnVwZGF0ZVRoRWxzKCk7XG4gICAgdGhpcy51cGRhdGVGaWx0ZXJpbmdBcHBsaWVkKCk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrSWZBbnlWYWx1ZXNFeGlzdChvYmosIHJlc3VsdHMgPSBbXSkge1xuICAgIGlmIChvYmogJiYgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgICAgT2JqZWN0LmVudHJpZXMob2JqKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBvYmpba2V5XSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB0aGlzLmNoZWNrSWZBbnlWYWx1ZXNFeGlzdChvYmpba2V5XSwgcmVzdWx0cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdHMuc29tZSh2YWwgPT4gISF2YWwpO1xuICB9XG5cbiAgcHJpdmF0ZSB3aXRoQ29sdW1uRGVmYXVsdHMoY29sdW1uKTogQ29sdW1uIHtcbiAgICBjb25zdCBkYXRhVHlwZSA9IGNvbHVtbi5kYXRhVHlwZSB8fCBDb2x1bW5EYXRhVHlwZS5UZXh0U2hvcnQ7XG4gICAgY29uc3QgeyBoZWFkZXJDU1NDbGFzc05hbWUsIGNlbGxDU1NDbGFzc05hbWUgfSA9IGNvbHVtbjtcblxuICAgIHJldHVybiB7XG4gICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgcG9zaXRpb25GaXhlZDogZmFsc2UsXG4gICAgICByZXNpemFibGU6IHRydWUsXG4gICAgICBzb3J0YWJsZTogdHJ1ZSxcbiAgICAgIHNvcnRPcmRlcjogJycsXG4gICAgICBmaWx0ZXJhYmxlOiBmYWxzZSxcbiAgICAgIC4uLmNvbHVtbixcbiAgICAgIGRhdGFUeXBlLFxuICAgICAgZ3JpZFRyYWNrU2l6ZTpcbiAgICAgICAgY29sdW1uLmdyaWRUcmFja1NpemUgfHxcbiAgICAgICAgYG1pbm1heCgke21pbkNvbHVtbkdyaWRUcmFja1NpemV9cHgsICR7cmF0aW9zQnlDb2x1bW5UeXBlc1tkYXRhVHlwZV19ZnIpYCxcbiAgICAgIGhlYWRlckNTU0NsYXNzTmFtZTpcbiAgICAgICAgKHR5cGVvZiBoZWFkZXJDU1NDbGFzc05hbWUgPT09ICdzdHJpbmcnXG4gICAgICAgICAgPyBoZWFkZXJDU1NDbGFzc05hbWUuc3BsaXQoJyAnKVxuICAgICAgICAgIDogaGVhZGVyQ1NTQ2xhc3NOYW1lKSB8fCBbXSxcbiAgICAgIGNlbGxDU1NDbGFzc05hbWU6XG4gICAgICAgICh0eXBlb2YgY2VsbENTU0NsYXNzTmFtZSA9PT0gJ3N0cmluZycgPyBjZWxsQ1NTQ2xhc3NOYW1lLnNwbGl0KCcgJykgOiBjZWxsQ1NTQ2xhc3NOYW1lKSB8fFxuICAgICAgICBbXVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNvbHVtbk5hbWVzKCkge1xuICAgIHRoaXMuY29sdW1uTmFtZXMgPSB0aGlzLmNvbHVtbnMubWFwKCh7IG5hbWUgfSkgPT4gbmFtZSk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwUmVzaXplSGFuZGxlKCkge1xuICAgIGNvbnN0IHJlc2l6ZUhhbmRsZURyYWckID0gdGhpcy5yZXNpemVIYW5kbGVNb3VzZURvd24kLnBpcGUoXG4gICAgICB0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpLFxuICAgICAgdGFwKCgpID0+IHRoaXMuY2xlYXJNb3VzZUhpZ2hsaWdodHMoKSksXG4gICAgICBtZXJnZU1hcCgoeyBldmVudCwgdGFyZ2V0Q29sdW1uTmFtZSB9KSA9PiB7XG4gICAgICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1ucy5tYXAoY29sdW1uID0+IHtcbiAgICAgICAgICBpZiAoY29sdW1uLm5hbWUgPT09IHRhcmdldENvbHVtbk5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLmNvbHVtbixcbiAgICAgICAgICAgICAgaGVhZGVyQ1NTQ2xhc3NOYW1lOiB1bmlvbihjb2x1bW4uaGVhZGVyQ1NTQ2xhc3NOYW1lLCBbJ2hlYWRlci0tYmVpbmctcmVzaXplZCddKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY29sdW1uO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmhlYWRlckJlaW5nUmVzaXplZCA9IHtcbiAgICAgICAgICBjb2x1bW5OYW1lOiB0YXJnZXRDb2x1bW5OYW1lLFxuICAgICAgICAgIGVsOiAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KT8ucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuc3R5bGVzID0ge1xuICAgICAgICAgIC4uLnRoaXMuc3R5bGVzLFxuICAgICAgICAgIHRhYmxlQ3Vyc29yOiAnY29sLXJlc2l6ZSdcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gdGhpcy5yZXNpemVIYW5kbGVDb250YWluZXJNb3VzZU1vdmUkLnBpcGUoXG4gICAgICAgICAgdGFwKCgpID0+IHRoaXMuY2xlYXJNb3VzZUhpZ2hsaWdodHMoKSksXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMucmVzaXplSGFuZGxlQ29udGFpbmVyTW91c2VVcCQpXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICByZXNpemVIYW5kbGVEcmFnJC5zdWJzY3JpYmUoKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmNvbHVtbnMubWFwKChjb2x1bW4sIGkpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5oZWFkZXJCZWluZ1Jlc2l6ZWQgJiYgY29sdW1uLm5hbWUgPT09IHRoaXMuaGVhZGVyQmVpbmdSZXNpemVkLmNvbHVtbk5hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbENvbnRhaW5lckRpdjogSFRNTERpdkVsZW1lbnQgPSB0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xuXG4gICAgICAgICAgICAvLyBSZWFkIHNjcm9sbENvbnRhaW5lckVsJ3Mgb2Zmc2V0IGxlZnQgcmVsYXRpdmUgdG8gdGhlIGRvY3VtZW50LlxuICAgICAgICAgICAgY29uc3QgaG9yaXpvbnRhbE9mZnNldCA9IHNjcm9sbENvbnRhaW5lckRpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xuXG4gICAgICAgICAgICAvLyBBZGp1c3Qgd2l0aCB0aGUgc2Nyb2xsQ29udGFpbmVyRWwgaG9yaXpvbnRhbCBzY3JvbGwgcG9zaXRpb24uXG4gICAgICAgICAgICBjb25zdCBob3Jpem9udGFsU2Nyb2xsT2Zmc2V0ID0gc2Nyb2xsQ29udGFpbmVyRGl2LnNjcm9sbExlZnQgLSBob3Jpem9udGFsT2Zmc2V0O1xuXG4gICAgICAgICAgICAvLyBSZWFkIGxlZnQgb2Zmc2V0IG9mIHRoZSByZXNpemVkIGhlYWRlci5cbiAgICAgICAgICAgIGNvbnN0IGhlYWRlck9mZnNldExlZnQgPSB0aGlzLmhlYWRlckJlaW5nUmVzaXplZC5lbC5vZmZzZXRMZWZ0IHx8IDA7XG5cbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgZGVzaXJlZCB3aWR0aC5cbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gaG9yaXpvbnRhbFNjcm9sbE9mZnNldCArIGV2ZW50LmNsaWVudFggLSBoZWFkZXJPZmZzZXRMZWZ0O1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgY29sdW1uIG9iamVjdCB3aXRoIHRoZSBuZXcgc2l6ZSB2YWx1ZSwgZW5mb3JjZSBvdXIgbWluaW11bSBzaXplLlxuICAgICAgICAgICAgICBncmlkVHJhY2tTaXplOiBgJHtNYXRoLm1heChtaW5Db2x1bW5HcmlkVHJhY2tTaXplLCB3aWR0aCl9cHhgXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEZvciB0aGUgb3RoZXIgaGVhZGVycyB3aGljaCBkb24ndCBoYXZlIGEgc2V0IHdpZHRoLCBmaXggaXQgdG8gdGhlaXIgY29tcHV0ZWQgd2lkdGguXG4gICAgICAgICAgaWYgKGNvbHVtbi5ncmlkVHJhY2tTaXplLnN0YXJ0c1dpdGgoJ21pbm1heCcpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgICAgICAgIC8vIGlzbid0IGZpeGVkIHlldCAoaXQgd291bGQgYmUgYSBweCB2YWx1ZSlcbiAgICAgICAgICAgICAgZ3JpZFRyYWNrU2l6ZTogYCR7X3BhcnNlSW50KHRoaXMudGhFbHNbaV0uY2xpZW50V2lkdGgpfXB4YFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY29sdW1uO1xuICAgICAgICB9KTtcblxuICAgICAgICAvKlxuICAgICAgICAgKiBVcGRhdGUgdGhlIGNvbHVtbiBzaXplcy5cbiAgICAgICAgICogTm90ZTogZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zIHNldHMgdGhlIHdpZHRoIGZvciBhbGwgY29sdW1ucyBpbiBvbmUgdmFsdWUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnVwZGF0ZUdyaWRDb2x1bW5zU2l6ZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlc2l6ZUhhbmRsZUNvbnRhaW5lck1vdXNlVXAkLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmhlYWRlckJlaW5nUmVzaXplZCkge1xuICAgICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLmNvbHVtbnMubWFwKGNvbHVtbiA9PiB7XG4gICAgICAgICAgaWYgKGNvbHVtbi5uYW1lID09PSB0aGlzLmhlYWRlckJlaW5nUmVzaXplZC5jb2x1bW5OYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgICAgICAgIGhlYWRlckNTU0NsYXNzTmFtZTogd2l0aG91dChjb2x1bW4uaGVhZGVyQ1NTQ2xhc3NOYW1lLCAnaGVhZGVyLS1iZWluZy1yZXNpemVkJylcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaGVhZGVyQmVpbmdSZXNpemVkID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHRoaXMuc3R5bGVzID0ge1xuICAgICAgICAgIC4uLnRoaXMuc3R5bGVzLFxuICAgICAgICAgIHRhYmxlQ3Vyc29yOiAnYXV0bydcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJNb3VzZUhpZ2hsaWdodHMoKSB7XG4gICAgaWYgKHdpbmRvdy5nZXRTZWxlY3Rpb24pIHtcbiAgICAgIHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9nZXRDZWxsUmVuZGVyZXJTcGVjKHsgdHlwZSwgdmFsdWUsIHJvdywgY29sdW1uTmFtZSB9KTogQ2VsbFJlbmRlcmVyU3BlYyB7XG4gICAgY29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5zLmZpbmQoKHsgbmFtZSB9KSA9PiBuYW1lID09PSBjb2x1bW5OYW1lKTtcbiAgICBjb25zdCBjb2x1bW5SZW5kZXJlciA9IHRoaXMuZ2V0Q29sdW1uUmVuZGVyZXIoY29sdW1uKTtcbiAgICBjb25zdCByZW5kZXJlclRlbXBsYXRlID0gZ2V0KFxuICAgICAgY29sdW1uUmVuZGVyZXIsXG4gICAgICBgJHt0eXBlID09PSAnSEVBREVSJyA/ICdoZWFkZXJDZWxsUmVuZGVyZXJEZWYnIDogJ2NlbGxSZW5kZXJlckRlZid9LnRlbXBsYXRlYFxuICAgICk7XG5cbiAgICBjb25zdCB7IGNlbGxSZW5kZXJlckNvbXBvbmVudCwgaGVhZGVyQ2VsbFJlbmRlcmVyQ29tcG9uZW50IH0gPSBjb2x1bW47XG4gICAgY29uc3QgcmVuZGVyZXJDb21wb25lbnQgPVxuICAgICAgdHlwZSA9PT0gJ0hFQURFUicgPyBoZWFkZXJDZWxsUmVuZGVyZXJDb21wb25lbnQgOiBjZWxsUmVuZGVyZXJDb21wb25lbnQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcmVuZGVyZXI6IHJlbmRlcmVyVGVtcGxhdGUgfHwgcmVuZGVyZXJDb21wb25lbnQsXG4gICAgICBjb250ZXh0OiB7XG4gICAgICAgIHZhbHVlLFxuICAgICAgICBpdGVtOiByb3csXG4gICAgICAgIHByb3BlcnR5OiBjb2x1bW5cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb2x1bW5SZW5kZXJlcihjb2x1bW4pOiBDb2x1bW5EaXJlY3RpdmUge1xuICAgIHJldHVybiB0aGlzLmNvbHVtblJlbmRlcmVycy50b0FycmF5KCkuZmluZCgoeyBuYW1lIH0pID0+IG5hbWUgPT09IGNvbHVtbi5uYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRmlsdGVyaW5nTGFiZWxzUGFyYW1zKHN0YXRzOiBEYXRhU291cmNlU3RhdHMpIHtcbiAgICB0aGlzLmZpbHRlcmluZ0xhYmVsc1BhcmFtcyA9IHtcbiAgICAgIGZpbHRlcmVkSXRlbXNDb3VudDogc3RhdHMuZmlsdGVyZWRTaXplLFxuICAgICAgYWxsSXRlbXNDb3VudDogc3RhdHMuc2l6ZVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVBhZ2luYXRpb25MYWJlbFBhcmFtcyhzdGF0czogRGF0YVNvdXJjZVN0YXRzKSB7XG4gICAgaWYgKHN0YXRzLm5leHRQYWdlKSB7XG4gICAgICB0aGlzLnBhZ2luYXRpb24gPSB7IC4uLnRoaXMucGFnaW5hdGlvbiwgbmV4dFBhZ2U6IHN0YXRzLm5leHRQYWdlIH07XG4gICAgfVxuXG4gICAgY29uc3QgcGFnZUZpcnN0SXRlbUlkeCA9IChzdGF0cy5jdXJyZW50UGFnZSAtIDEpICogc3RhdHMuZmlyc3RQYWdlU2l6ZSArIDE7XG4gICAgdGhpcy5wYWdpbmF0aW9uTGFiZWxQYXJhbXMgPSB7XG4gICAgICBwYWdlRmlyc3RJdGVtSWR4LFxuICAgICAgcGFnZUxhc3RJdGVtSWR4OiBwYWdlRmlyc3RJdGVtSWR4ICsgKHN0YXRzLmN1cnJlbnRQYWdlU2l6ZSAtIDEpLFxuICAgICAgaXRlbXNUb3RhbDogc3RhdHMuZmlsdGVyZWRTaXplXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUGFnaW5hdGlvbldoZW5Ob0RldmljZXNMYXN0UGFnZShzdGF0czogRGF0YVNvdXJjZVN0YXRzKSB7XG4gICAgaWYgKCFzdGF0cy5uZXh0UGFnZSAmJiBzdGF0cy5jdXJyZW50UGFnZVNpemUgPT09IDAgJiYgc3RhdHMuc2l6ZSA+IDApIHtcbiAgICAgIHRoaXMucGFnaW5hdGlvbiA9IHtcbiAgICAgICAgLi4udGhpcy5wYWdpbmF0aW9uLFxuICAgICAgICBjdXJyZW50UGFnZTogdGhpcy5wYWdpbmF0aW9uLmN1cnJlbnRQYWdlIC0gMSxcbiAgICAgICAgbmV4dFBhZ2U6IG51bGxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVMb2FkTW9yZUNvbXBvbmVudChzdGF0czogRGF0YVNvdXJjZVN0YXRzKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pbmZpbml0ZVNjcm9sbCAmJlxuICAgICAgc3RhdHMgJiZcbiAgICAgIHN0YXRzLm5leHRQYWdlICYmXG4gICAgICAoIXRoaXMubG9hZE1vcmVDb21wb25lbnQgfHwgdGhpcy5yZWNyZWF0ZUxvYWRNb3JlQ29tcG9uZW50KVxuICAgICkge1xuICAgICAgdGhpcy5yZWNyZWF0ZUxvYWRNb3JlQ29tcG9uZW50ID0gZmFsc2U7XG4gICAgICB0aGlzLmluZmluaXRlU2Nyb2xsQ29udGFpbmVyLmNsZWFyKCk7XG4gICAgICBjb25zdCBjb21wb25lbnRSZWYgPSB0aGlzLmluZmluaXRlU2Nyb2xsQ29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChMb2FkTW9yZUNvbXBvbmVudCk7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IGNvbXBvbmVudFJlZi5pbnN0YW5jZSBhcyBMb2FkTW9yZUNvbXBvbmVudDtcbiAgICAgIGluc3RhbmNlLnVzZUludGVyc2VjdGlvbiA9IHRoaXMuaW5maW5pdGVTY3JvbGwgPT09ICdhdXRvJyB8fCB0aGlzLmluZmluaXRlU2Nyb2xsID09PSAnaGlkZGVuJztcbiAgICAgIGluc3RhbmNlLmhpZGRlbiA9IHRoaXMuaW5maW5pdGVTY3JvbGwgPT09ICdoaWRkZW4nO1xuICAgICAgaW5zdGFuY2UucGFnaW5nID0ge1xuICAgICAgICBuZXh0UGFnZTogc3RhdHMubmV4dFBhZ2UsXG4gICAgICAgIG5leHQ6IHRoaXMubG9hZE5leHRQYWdlLmJpbmQodGhpcylcbiAgICAgIH0gYXMgUGFnaW5nPElJZGVudGlmaWVkPjtcbiAgICAgIGluc3RhbmNlLmxvYWROZXh0TGFiZWwgPSB0aGlzLmxvYWRNb3JlSXRlbXNMYWJlbDtcbiAgICAgIGluc3RhbmNlLmxvYWRpbmdMYWJlbCA9IHRoaXMubG9hZGluZ0l0ZW1zTGFiZWw7XG4gICAgICB0aGlzLmxvYWRNb3JlQ29tcG9uZW50ID0gaW5zdGFuY2U7XG4gICAgfSBlbHNlIGlmICh0aGlzLmxvYWRNb3JlQ29tcG9uZW50ICYmICFzdGF0cy5uZXh0UGFnZSkge1xuICAgICAgdGhpcy5sb2FkTW9yZUNvbXBvbmVudC5wYWdpbmcgPSB7XG4gICAgICAgIG5leHRQYWdlOiBudWxsXG4gICAgICB9IGFzIFBhZ2luZzxJSWRlbnRpZmllZD47XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzY3JvbGxUb1RvcCgpIHtcbiAgICBpZiAodGhpcy5pbmZpbml0ZVNjcm9sbCkge1xuICAgICAgdGhpcy5zY3JvbGxDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc0FuZFBlcnNpc3RDb25maWdDaGFuZ2UoKSB7XG4gICAgbWVyZ2UoXG4gICAgICBtZXJnZShcbiAgICAgICAgdGhpcy5vblNvcnQsXG4gICAgICAgIHRoaXMub25QYWdlU2l6ZUNoYW5nZSxcbiAgICAgICAgdGhpcy5vbkNvbHVtblJlb3JkZXJlZCxcbiAgICAgICAgdGhpcy5vbkNvbHVtblZpc2liaWxpdHlDaGFuZ2VcbiAgICAgICkucGlwZShtYXAoY29uZmlnID0+IGNvbmZpZy5jb2x1bW5zKSksXG4gICAgICBtZXJnZSh0aGlzLm9uQWRkQ3VzdG9tQ29sdW1uLCB0aGlzLm9uUmVtb3ZlQ3VzdG9tQ29sdW1uKS5waXBlKFxuICAgICAgICBtYXAoKCkgPT4gKHRoaXMuY29sdW1ucyB8fCBbXSkubWFwKHRoaXMubWFwQ29sdW1uVG9Db25maWcuYmluZCh0aGlzKSkpXG4gICAgICApLFxuICAgICAgdGhpcy5vbkZpbHRlci5waXBlKFxuICAgICAgICBtYXAoKHsgY29sdW1uTmFtZSwgZmlsdGVyaW5nTW9kaWZpZXIgfSkgPT5cbiAgICAgICAgICB0aGlzLmNvbHVtbnMubWFwKHRoaXMubWFwQ29sdW1uVG9Db25maWcuYmluZCh0aGlzKSkubWFwKChjb2x1bW46IENvbHVtbkNvbmZpZykgPT4ge1xuICAgICAgICAgICAgaWYgKGlzTmlsKGNvbHVtbk5hbWUpKSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSBjb2x1bW4uZmlsdGVyO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4ubmFtZSA9PT0gY29sdW1uTmFtZSkge1xuICAgICAgICAgICAgICBpZiAoaXNFbXB0eShmaWx0ZXJpbmdNb2RpZmllcikpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgY29sdW1uLmZpbHRlcjtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb2x1bW4uZmlsdGVyID0gZmlsdGVyaW5nTW9kaWZpZXI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApXG4gICAgKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoY29sdW1uczogQXJyYXk8Q29sdW1uQ29uZmlnIHwgQ3VzdG9tQ29sdW1uQ29uZmlnPikgPT4gKHtcbiAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgIHBhZ2luYXRpb246IHsgcGFnZVNpemU6IHRoaXMucGFnaW5hdGlvbi5wYWdlU2l6ZSB9XG4gICAgICAgIH0pKSxcbiAgICAgICAgZmlsdGVyKCgpID0+ICEhdGhpcy5jb25maWd1cmF0aW9uU3RyYXRlZ3kpLFxuICAgICAgICB0aGlzLnRyaW1GaWx0ZXJDb25maWdQaXBlKCksXG4gICAgICAgIHRoaXMudHJpbVNvcnRDb25maWdQaXBlKCksXG4gICAgICAgIHRoaXMudHJpbUN1c3RvbUNvbHVtbkNvbmZpZ1BpcGUoKSxcbiAgICAgICAgdGhpcy5pZ25vcmVDb2x1bW5PcmRlclBpcGUoKSxcbiAgICAgICAgdGhpcy5pZ25vcmVDb2x1bW5WaXNpYmlsaXR5UGlwZSgpLFxuICAgICAgICBjb25jYXRNYXAoKGNvbmZpZzogR3JpZENvbmZpZykgPT4gdGhpcy5jb25maWd1cmF0aW9uU3RyYXRlZ3kuc2F2ZUNvbmZpZyQoY29uZmlnKSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgdHJpbUZpbHRlckNvbmZpZ1BpcGUoKTogVW5hcnlGdW5jdGlvbjxPYnNlcnZhYmxlPEdyaWRDb25maWc+LCBPYnNlcnZhYmxlPEdyaWRDb25maWc+PiB7XG4gICAgcmV0dXJuIHBpcGUoXG4gICAgICB0aGlzLmNoZWNrRXZlbnRQaXBlKCdmaWx0ZXInLCBjb25maWcgPT4ge1xuICAgICAgICBjb25maWcuY29sdW1ucyA9IChjb25maWcuY29sdW1ucyB8fCBbXSkubWFwKGNvbCA9PiB7XG4gICAgICAgICAgZGVsZXRlIGNvbC5maWx0ZXI7XG4gICAgICAgICAgcmV0dXJuIGNvbDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgdHJpbVNvcnRDb25maWdQaXBlKCk6IFVuYXJ5RnVuY3Rpb248T2JzZXJ2YWJsZTxHcmlkQ29uZmlnPiwgT2JzZXJ2YWJsZTxHcmlkQ29uZmlnPj4ge1xuICAgIHJldHVybiBwaXBlKFxuICAgICAgdGhpcy5jaGVja0V2ZW50UGlwZSgnc29ydCcsIGNvbmZpZyA9PiB7XG4gICAgICAgIGNvbmZpZy5jb2x1bW5zID0gKGNvbmZpZy5jb2x1bW5zIHx8IFtdKS5tYXAoY29sID0+IHtcbiAgICAgICAgICBjb2wuc29ydE9yZGVyID0gJyc7XG4gICAgICAgICAgcmV0dXJuIGNvbDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgdHJpbUN1c3RvbUNvbHVtbkNvbmZpZ1BpcGUoKTogVW5hcnlGdW5jdGlvbjxcbiAgICBPYnNlcnZhYmxlPEdyaWRDb25maWc+LFxuICAgIE9ic2VydmFibGU8R3JpZENvbmZpZz5cbiAgPiB7XG4gICAgcmV0dXJuIHBpcGUoXG4gICAgICB0aGlzLmNoZWNrRXZlbnRQaXBlKCdjdXN0b21Db2x1bW5zJywgY29uZmlnID0+IHtcbiAgICAgICAgY29uZmlnLmNvbHVtbnMgPSAoY29uZmlnLmNvbHVtbnMgfHwgW10pLmZpbHRlcigoY29sOiBDdXN0b21Db2x1bW5Db25maWcpID0+ICFjb2wuY3VzdG9tKTtcblxuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpZ25vcmVDb2x1bW5PcmRlclBpcGUoKTogVW5hcnlGdW5jdGlvbjxPYnNlcnZhYmxlPEdyaWRDb25maWc+LCBPYnNlcnZhYmxlPEdyaWRDb25maWc+PiB7XG4gICAgcmV0dXJuIHBpcGUoXG4gICAgICB0aGlzLmNoZWNrRXZlbnRQaXBlKCdvcmRlcicsIGNvbmZpZyA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZ3VyYXRpb25TdHJhdGVneS5nZXRDb25maWckKCkucGlwZShcbiAgICAgICAgICBtYXAob2xkQ29uZmlnID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9sZENvbHVtbnM6IENvbHVtbkNvbmZpZ1tdID1cbiAgICAgICAgICAgICAgb2xkQ29uZmlnPy5jb2x1bW5zIHx8ICh0aGlzLmRlZmF1bHRDb2x1bW5zIGFzIENvbHVtbkNvbmZpZ1tdKTtcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIGN1c3RvbSBjb2x1bW5zIGhhdmUgYmVlbiBhZGRlZFxuICAgICAgICAgICAgY29uc3QgY29sdW1uc0FkZGVkID0gKGNvbmZpZy5jb2x1bW5zIHx8IFtdKS5maWx0ZXIoXG4gICAgICAgICAgICAgIGNvbCA9PiAhb2xkQ29sdW1ucy5maW5kKG9sZCA9PiBvbGQubmFtZSA9PT0gY29sLm5hbWUpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25maWcuY29sdW1ucyA9IFtcbiAgICAgICAgICAgICAgLi4ub2xkQ29sdW1ucy5tYXAob2xkQ29sID0+XG4gICAgICAgICAgICAgICAgKGNvbmZpZy5jb2x1bW5zIHx8IFtdKS5maW5kKG5ld0NvbCA9PiBuZXdDb2wubmFtZSA9PT0gb2xkQ29sLm5hbWUpXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIC4uLmNvbHVtbnNBZGRlZFxuICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpZ25vcmVDb2x1bW5WaXNpYmlsaXR5UGlwZSgpOiBVbmFyeUZ1bmN0aW9uPFxuICAgIE9ic2VydmFibGU8R3JpZENvbmZpZz4sXG4gICAgT2JzZXJ2YWJsZTxHcmlkQ29uZmlnPlxuICA+IHtcbiAgICByZXR1cm4gcGlwZShcbiAgICAgIHRoaXMuY2hlY2tFdmVudFBpcGUoJ3Zpc2liaWxpdHknLCBjb25maWcgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uU3RyYXRlZ3kuZ2V0Q29uZmlnJCgpLnBpcGUoXG4gICAgICAgICAgbWFwKG9sZENvbmZpZyA9PiB7XG4gICAgICAgICAgICBjb25maWcuY29sdW1ucyA9IChjb25maWcuY29sdW1ucyB8fCBbXSkubWFwKG5ld0NvbCA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbHVtbnM6IENvbHVtbkNvbmZpZ1tdID1cbiAgICAgICAgICAgICAgICBvbGRDb25maWc/LmNvbHVtbnMgfHwgKHRoaXMuZGVmYXVsdENvbHVtbnMgYXMgQ29sdW1uQ29uZmlnW10pO1xuICAgICAgICAgICAgICBjb25zdCBvbGRDb2wgPSBjb2x1bW5zLmZpbmQoKGNvbDogYW55KSA9PiBuZXdDb2wubmFtZSA9PT0gY29sLm5hbWUpO1xuICAgICAgICAgICAgICBuZXdDb2wudmlzaWJsZSA9IG9sZENvbD8udmlzaWJsZSA/PyB0cnVlO1xuICAgICAgICAgICAgICByZXR1cm4gbmV3Q29sO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tFdmVudFBpcGUoXG4gICAgY29uZmlnUGFydDogR3JpZENvbmZpZ1BhcnQsXG4gICAgdHJpbUV2ZW50RGF0YUZuOiAoY29uZmlnOiBHcmlkQ29uZmlnKSA9PiBHcmlkQ29uZmlnIHwgT2JzZXJ2YWJsZTxHcmlkQ29uZmlnPlxuICApOiBVbmFyeUZ1bmN0aW9uPE9ic2VydmFibGU8R3JpZENvbmZpZz4sIE9ic2VydmFibGU8R3JpZENvbmZpZz4+IHtcbiAgICByZXR1cm4gcGlwZShcbiAgICAgIGNvbmNhdE1hcCgoY29uZmlnOiBHcmlkQ29uZmlnKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc29sdmVDb25maWdGaWx0ZXJcbiAgICAgICAgICAuY2FsbCh0aGlzLCBjb25maWdQYXJ0KVxuICAgICAgICAgIC5waXBlKG1hcChrZWVwRXZlbnREYXRhID0+ICh7IGNvbmZpZywga2VlcEV2ZW50RGF0YSB9KSkpO1xuICAgICAgfSksXG4gICAgICBtYXAoKHsgY29uZmlnLCBrZWVwRXZlbnREYXRhIH0pID0+XG4gICAgICAgIGtlZXBFdmVudERhdGEgPyBjb25maWcgOiB0cmltRXZlbnREYXRhRm4uY2FsbCh0aGlzLCBjb25maWcpXG4gICAgICApLFxuICAgICAgY29uY2F0TWFwKGNvbmZpZyA9PiAoaXNPYnNlcnZhYmxlKGNvbmZpZykgPyBjb25maWcgOiBvZihjb25maWcpKSBhcyBPYnNlcnZhYmxlPEdyaWRDb25maWc+KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVDb25maWdGaWx0ZXIoY29uZmlnUGFydDogR3JpZENvbmZpZ1BhcnQpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuIHwgT2JzZXJ2YWJsZTxib29sZWFuPiB8IFByb21pc2U8Ym9vbGVhbj47XG4gICAgY29uc3QgdmFsdWVPckZuID0gdGhpcy5jb25maWd1cmF0aW9uU3RyYXRlZ3kuZ2V0Q29udGV4dCgpPy5jb25maWdGaWx0ZXI/Lltjb25maWdQYXJ0XTtcbiAgICBpZiAodHlwZW9mIHZhbHVlT3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmVzdWx0ID0gdmFsdWVPckZuKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IHZhbHVlT3JGbjtcbiAgICB9XG4gICAgcmV0dXJuIHRvT2JzZXJ2YWJsZShyZXN1bHQgPz8gdHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIHNhZmVseUludm9rZU1hdGNoZXIoXG4gICAgbWF0Y2hlc0ZuOiAoXG4gICAgICByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgICBjb250ZXh0PzogR3JpZENvbmZpZ0NvbnRleHRcbiAgICApID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+IHwgT2JzZXJ2YWJsZTxib29sZWFuPixcbiAgICByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgY29udGV4dD86IEdyaWRDb25maWdDb250ZXh0XG4gICkge1xuICAgIGlmIChtYXRjaGVzRm4pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtYXRjaGVzRm4ocm91dGUsIGNvbnRleHQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwidGFibGUtZGF0YS1ncmlkLXNjcm9sbFwiXG4gICNzY3JvbGxcbiAgW25nQ2xhc3NdPVwie1xuICAgICd0YWJsZS1kYXRhLWdyaWRfX292ZXJsYXknOiAoZGF0YVNvdXJjZS5sb2FkaW5nJCB8IGFzeW5jKSAmJiAhbG9hZE1vcmVDb21wb25lbnQ/LmlzTG9hZGluZ1xuICB9XCJcbiAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLXRhYmxlLWRhdGEtZ3JpZC1zY3JvbGxcIlxuPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJ0YWJsZS1kYXRhLWdyaWRfX2xvYWRpbmctLXdyYXBwZXJcIlxuICAgICpuZ0lmPVwiKGRhdGFTb3VyY2UubG9hZGluZyQgfCBhc3luYykgJiYgIWxvYWRNb3JlQ29tcG9uZW50Py5pc0xvYWRpbmdcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cInRhYmxlLWRhdGEtZ3JpZF9fbG9hZGluZy0tbG9hZGVyXCI+XG4gICAgICA8Yzh5LWxvYWRpbmdcbiAgICAgICAgbGF5b3V0PVwiYXBwbGljYXRpb25cIlxuICAgICAgICBbbWVzc2FnZV09XCJsb2FkaW5nSXRlbXNMYWJlbFwiXG4gICAgICA+PC9jOHktbG9hZGluZz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdlxuICAgIGNsYXNzPVwidGFibGUtZGF0YS1ncmlkLWhlYWRlciBzZXBhcmF0b3IgbGFyZ2UtcGFkZGluZ1wiXG4gICAgKm5nSWY9XCJkaXNwbGF5T3B0aW9ucy5ncmlkSGVhZGVyXCJcbiAgPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiaDRcIlxuICAgICAgW25nQ2xhc3NdPVwieyAnbS1yLTE2JzogISF0aXRsZSB9XCJcbiAgICA+XG4gICAgICB7eyB0aXRsZSB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvZGl2PlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRpc3BsYXlPcHRpb25zLmZpbHRlclwiPlxuICAgICAgPHNwYW4gKm5nSWY9XCIhZmlsdGVyaW5nQXBwbGllZFwiPlxuICAgICAgICA8c21hbGxcbiAgICAgICAgICBjbGFzcz1cIm0tci00XCJcbiAgICAgICAgICAqbmdJZj1cIiEhZmlsdGVyaW5nTGFiZWxzUGFyYW1zLmFsbEl0ZW1zQ291bnRcIlxuICAgICAgICAgIG5nTm9uQmluZGFibGVcbiAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICBbdHJhbnNsYXRlUGFyYW1zXT1cImZpbHRlcmluZ0xhYmVsc1BhcmFtc1wiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBmaWx0ZXJlZEl0ZW1zQ291bnQgfX0gb2Yge3sgYWxsSXRlbXNDb3VudCB9fSBpdGVtc1xuICAgICAgICA8L3NtYWxsPlxuICAgICAgICA8c3BhblxuICAgICAgICAgIGNsYXNzPVwibGFiZWwgbGFiZWwtZGVmYXVsdCBtLXItNFwiXG4gICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgID5cbiAgICAgICAgICBObyBmaWx0ZXJzXG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxzcGFuXG4gICAgICAgIGNsYXNzPVwiZC1mbGV4IGEtaS1jZW50ZXJcIlxuICAgICAgICAqbmdJZj1cImZpbHRlcmluZ0FwcGxpZWRcIlxuICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiISFmaWx0ZXJpbmdMYWJlbHNQYXJhbXMuYWxsSXRlbXNDb3VudFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhLWktY2VudGVyXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGJhZGdlLWluZm8gbS1yLTRcIj5cbiAgICAgICAgICAgICAge3sgKGRhdGFTb3VyY2Uuc3RhdHMkIHwgYXN5bmMpLmZpbHRlcmVkU2l6ZSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNtYWxsXG4gICAgICAgICAgICAgIG5nTm9uQmluZGFibGVcbiAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgIFt0cmFuc2xhdGVQYXJhbXNdPVwiZmlsdGVyaW5nTGFiZWxzUGFyYW1zXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgb2Yge3sgYWxsSXRlbXNDb3VudCB9fSBpdGVtc1xuICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duXCJcbiAgICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b20gbGVmdFwiXG4gICAgICAgICAgZHJvcGRvd25cbiAgICAgICAgICAjZGRGaWx0ZXJzPVwiYnMtZHJvcGRvd25cIlxuICAgICAgICAgIFtjZGtUcmFwRm9jdXNdPVwiZGRGaWx0ZXJzLmlzT3BlblwiXG4gICAgICAgICAgW2luc2lkZUNsaWNrXT1cInRydWVcIlxuICAgICAgICA+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIG0tbC04XCJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ0FjdGl2ZSBmaWx0ZXJzJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiXG4gICAgICAgICAgICBkcm9wZG93blRvZ2dsZVxuICAgICAgICAgICAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLWZpbHRlcnNcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgIGNsYXNzPVwibS1yLTRcIlxuICAgICAgICAgICAgICBjOHlJY29uPVwiZmlsdGVyXCJcbiAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICA8c3Bhbj57eyAnQWN0aXZlIGZpbHRlcnMnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwLXJlbGF0aXZlIHAtbC00IHAtci0xNlwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlIGJhZGdlLXN5c3RlbSBwLWFic29sdXRlXCI+XG4gICAgICAgICAgICAgICAge3sgY29sdW1uc1dpdGhGaWx0ZXJzQXBwbGllZC5sZW5ndGggfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1tZW51XCJcbiAgICAgICAgICAgICpkcm9wZG93bk1lbnVcbiAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRhLWdyaWRfX2Ryb3Bkb3duIGJnLWxldmVsLTBcIj5cbiAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC11bnN0eWxlZCBtLTBcIj5cbiAgICAgICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uc1dpdGhGaWx0ZXJzQXBwbGllZDsgbGV0IGxhc3QgPSBsYXN0XCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NlcGFyYXRvci1ib3R0b20nOiAhbGFzdCB9XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1oZWFkZXIgc3RpY2t5LXRvcCB0ZXh0LXRydW5jYXRlIG5vLWJvcmRlci10b3AgcC1iLTBcIlxuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgKGNvbHVtbi5oZWFkZXIgfCB0cmFuc2xhdGUpIHx8IGNvbHVtbi5uYW1lIH19XCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IChjb2x1bW4uaGVhZGVyIHwgdHJhbnNsYXRlKSB8fCBjb2x1bW4ubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYm9yZGVybGVzcyBkLWZsZXggZC1jb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGdyb3VwZWRGaWx0ZXJDaGlwcyBvZiBjb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfCBtYXBUb0ZpbHRlckNoaXBzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXN5bmNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfCBncm91cGVkRmlsdGVyQ2hpcHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmlyc3QgPSBmaXJzdFxuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAncC10LTAnOiBmaXJzdCB9XCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxwXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNtYWxsIHAtYi00XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ3JvdXBlZEZpbHRlckNoaXBzLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBncm91cGVkRmlsdGVyQ2hpcHMubGFiZWwgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhLWktY2VudGVyIGdhcC00IGZsZXgtd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJsYWJlbCBsYWJlbC1pbmZvIGNoaXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY2hpcCBvZiBncm91cGVkRmlsdGVyQ2hpcHMuY2hpcHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXhzIGJ0bi1jbGVhbiB0ZXh0LTEwIG0tci00XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdSZW1vdmUgZmlsdGVyJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUZpbHRlcihjaGlwLnJlbW92ZSgpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1jeT1cImM4eS1kYXRhLWdyaWQtLXJlbW92ZS1jaGlwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJ0aW1lc1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+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+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBidG4tYmxvY2tcIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0FkZCBjdXN0b20gY29sdW1uJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgZGF0YS1jeT1cImRhdGEtZ3JpZC0tYWRkLWN1c3RvbS1jb2x1bW5cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuQ3VzdG9tQ29sdW1uTW9kYWwoKTsgZGRDb25maWd1cmVDb2x1bW5zLmhpZGUoKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtLXItNFwiXG4gICAgICAgICAgICAgICAgICBjOHlJY29uPVwicGx1cy1jaXJjbGVcIlxuICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgJ0FkZCBjdXN0b20gY29sdW1uJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzcz1cImJ0bmJhci1idG4gYnRuLWxpbmtcIlxuICAgICAgICAgIHRpdGxlPVwie3sgJ1JlbG9hZCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGRhdGEtY3k9XCJkYXRhLWdyaWQtLXJlbG9hZC1idG5cIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJkYXRhU291cmNlLmxvYWRpbmckIHwgYXN5bmNcIlxuICAgICAgICAgIChjbGljayk9XCJjbGlja1JlbG9hZCgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpXG4gICAgICAgICAgICBjbGFzcz1cIm0tci00XCJcbiAgICAgICAgICAgIGM4eUljb249XCJyZWZyZXNoXCJcbiAgICAgICAgICA+PC9pPlxuICAgICAgICAgIDxzcGFuPnt7ICdSZWxvYWQnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJpbnB1dC1ncm91cCBpbnB1dC1ncm91cC1zZWFyY2ggbS1sLXNtLTE2IGRhdGEtZ3JpZF9fc2VhcmNoLWlucHV0XCJcbiAgICAgICAgICAqbmdJZj1cIiFzZXJ2ZXJTaWRlRGF0YUNhbGxiYWNrIHx8IHNob3dTZWFyY2hcIlxuICAgICAgICA+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdTZWFyY2jigKYnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIHR5cGU9XCJzZWFyY2hcIlxuICAgICAgICAgICAgW25nTW9kZWxdPVwic2VhcmNoVGV4dFwiXG4gICAgICAgICAgICAoaW5wdXQpPVwic2VhcmNoVGV4dCQuZW1pdCgkZXZlbnQudGFyZ2V0LnZhbHVlKVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYWRkb25cIj5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgIGM4eUljb249XCJzZWFyY2hcIlxuICAgICAgICAgICAgICAqbmdJZj1cInNlYXJjaFRleHQubGVuZ3RoID09PSAwXCJcbiAgICAgICAgICAgID48L2k+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/IGFjdGlvbkNvbnRyb2wudGV4dCA6ICcnKSB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBzaG93T25Ib3ZlcjogYWN0aW9uQ29udHJvbC5zaG93T25Ib3ZlciB9XCJcbiAgICAgICAgICAgICAgICAgIFtkZWxheV09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoRGVmYXVsdFxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGlvbkNvbnRyb2wuY2FsbGJhY2socm93LCByZWxvYWQuYmluZCh0aGlzKSlcIlxuICAgICAgICAgICAgICAgICAgW2FjdGlvbkRhdGFdPVwie1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFBYX0FDVElPTlMuQ1VTVE9NX0FDVElPTl9JVEVNLFxuICAgICAgICAgICAgICAgICAgICBjdXN0b21BY3Rpb25OYW1lOiBhY3Rpb25Db250cm9sLnRleHQsXG4gICAgICAgICAgICAgICAgICAgIGlkOiByb3cuaWRcbiAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgYzh5UHJvZHVjdEV4cGVyaWVuY2VcbiAgICAgICAgICAgICAgICAgIGluaGVyaXRcbiAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtY3ldPVwiJ2M4eS1kYXRhLWdyaWQtLWJ1dHRvbi1pbi1yb3ctLScgKyBhY3Rpb25Db250cm9sLnRleHRcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgIGM4eUljb249XCJ7eyBhY3Rpb25Db250cm9sLmljb24gfX1cIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImFjdGlvbkNvbnRyb2wuaWNvblwiXG4gICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhYWN0aW9uQ29udHJvbC5pY29uXCI+e3sgYWN0aW9uQ29udHJvbC50ZXh0IHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAnbS1sLWF1dG8gb3ZlcmZsb3ctdmlzaWJsZSc6XG4gICAgICAgICAgICAgICAgICAoYWN0aW9uQ29udHJvbHMgfCB2aXNpYmxlQ29udHJvbHM6IHJvdyB8IGFzeW5jKT8ubGVuZ3RoID4gMlxuICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd25cIlxuICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbSByaWdodFwiXG4gICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgZHJvcGRvd25cbiAgICAgICAgICAgICAgICAqbmdJZj1cIihhY3Rpb25Db250cm9scyB8IHZpc2libGVDb250cm9sczogcm93IHwgYXN5bmMpPy5sZW5ndGggPiAyXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd24tdG9nZ2xlIGM4eS1kcm9wZG93blwiXG4gICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdBY3Rpb25zJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJjOHktZGF0YS1ncmlkLS1yb3ctYWN0aW9ucy1kcm9wZG93blwiXG4gICAgICAgICAgICAgICAgICBkcm9wZG93blRvZ2dsZVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJlbGxpcHNpcy12XCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDx1bFxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1tZW51IGRyb3Bkb3duLW1lbnUtcmlnaHRcIlxuICAgICAgICAgICAgICAgICAgKmRyb3Bkb3duTWVudVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICBsZXQgYWN0aW9uQ29udHJvbCBvZiBhY3Rpb25Db250cm9sc1xuICAgICAgICAgICAgICAgICAgICAgICAgfCB2aXNpYmxlQ29udHJvbHM6IHJvd1xuICAgICAgICAgICAgICAgICAgICAgICAgfCBhc3luY1xuICAgICAgICAgICAgICAgICAgICAgICAgfCBzbGljZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgoYWN0aW9uQ29udHJvbHMgfCB2aXNpYmxlQ29udHJvbHM6IHJvdyB8IGFzeW5jKT8ubGVuZ3RoID4gMiA/IDEgOiAyKVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJhY3Rpb25Db250cm9sLnR5cGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdFZGl0JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJidWlsdEluQWN0aW9uVHlwZS5FZGl0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3Rpb25Db250cm9sLmNhbGxiYWNrKHJvdywgcmVsb2FkLmJpbmQodGhpcykpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkVESVRfSVRFTSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHJvdy5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJwZW5jaWxcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAnRWRpdCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdEZWxldGUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImJ1aWx0SW5BY3Rpb25UeXBlLkRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aW9uQ29udHJvbC5jYWxsYmFjayhyb3csIHJlbG9hZC5iaW5kKHRoaXMpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5ERUxFVEVfSVRFTSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHJvdy5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjOHlQcm9kdWN0RXhwZXJpZW5jZVxuICAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdFxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJkZWxldGVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAnRGVsZXRlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0V4cG9ydCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiYnVpbHRJbkFjdGlvblR5cGUuRXhwb3J0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3Rpb25Db250cm9sLmNhbGxiYWNrKHJvdywgcmVsb2FkLmJpbmQodGhpcykpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthY3Rpb25EYXRhXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBQWF9BQ1RJT05TLkVYUE9SVF9JVEVNLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogcm93LmlkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cImRhdGEtZXhwb3J0XCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0V4cG9ydCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7IGFjdGlvbkNvbnRyb2wudGV4dCB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1N3aXRjaERlZmF1bHRcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3Rpb25Db250cm9sLmNhbGxiYWNrKHJvdywgcmVsb2FkLmJpbmQodGhpcykpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGM4eVByb2R1Y3RFeHBlcmllbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmhlcml0XG4gICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uRGF0YV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogUFhfQUNUSU9OUy5DVVNUT01fQUNUSU9OX0lURU0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbUFjdGlvbk5hbWU6IGFjdGlvbkNvbnRyb2wudGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHJvdy5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cInt7IGFjdGlvbkNvbnRyb2wuaWNvbiB9fVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGFjdGlvbkNvbnRyb2wudGV4dCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XG4gICAgICAgICAgPHRoXG4gICAgICAgICAgICBbY2xhc3Muc29ydGVkXT1cImNvbHVtbi5zb3J0T3JkZXJcIlxuICAgICAgICAgICAgW2NsYXNzLmZpbHRlcmVkXT1cImNvbHVtbiB8IG1hcDogaXNDb2x1bW5GaWx0ZXJpbmdBcHBsaWVkXCJcbiAgICAgICAgICAgIFtjbGFzcy5oaWRkZW5dPVwiIWNvbHVtbi52aXNpYmxlXCJcbiAgICAgICAgICAgIGNkay1oZWFkZXItY2VsbFxuICAgICAgICAgICAgKmNka0hlYWRlckNlbGxEZWZcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbHVtbi5oZWFkZXJDU1NDbGFzc05hbWVcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS10eXBlXT1cImNvbHVtbi5kYXRhVHlwZVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiKGNvbHVtbi5oZWFkZXIgfCB0cmFuc2xhdGUpIHx8IGNvbHVtbi5uYW1lXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCIhY29sdW1uLmZpbHRlcmFibGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk5hbWU6IGNvbHVtbi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAoY29sdW1uLmhlYWRlciB8IHRyYW5zbGF0ZSkgfHwgY29sdW1uLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgXSB8IG1hcDogZ2V0SGVhZGVyQ2VsbFJlbmRlcmVyU3BlYyA6IHRoaXMgYXMgY2VsbFJlbmRlcmVyU3BlY1xuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8Yzh5LWNlbGwtcmVuZGVyZXIgW3NwZWNdPVwiY2VsbFJlbmRlcmVyU3BlY1wiPjwvYzh5LWNlbGwtcmVuZGVyZXI+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gaXNEcm9wRG93blBsYWNlZFJpZ2h0IHRvIGJlIHJlbW92ZWQgd2hlbiBjb2x1bW5zIGFyZSB0cmFuc2Zvcm1lZCB0byBvYnNlcnZhYmxlcy4gLS0+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd25cIlxuICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b20ge3sgaXNEcm9wRG93blBsYWNlZFJpZ2h0KGNvbHVtbikgPyAncmlnaHQnIDogJ2xlZnQnIH19XCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4uZmlsdGVyYWJsZVwiXG4gICAgICAgICAgICAgIGRyb3Bkb3duXG4gICAgICAgICAgICAgICNncmlkSGVhZGVyRHJvcGRvd249XCJicy1kcm9wZG93blwiXG4gICAgICAgICAgICAgIFtjZGtUcmFwRm9jdXNdPVwiZ3JpZEhlYWRlckRyb3Bkb3duLmlzT3BlblwiXG4gICAgICAgICAgICAgIFtpbnNpZGVDbGlja109XCJ0cnVlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWhlYWRlclwiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cIihjb2x1bW4uaGVhZGVyIHwgdHJhbnNsYXRlKSB8fCBjb2x1bW4ubmFtZVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1jeV09XCInZGF0YS1ncmlkLS1oZWFkZXItYnRuLS0nICsgY29sdW1uLmhlYWRlclwiXG4gICAgICAgICAgICAgICAgZHJvcGRvd25Ub2dnbGVcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lOiBjb2x1bW4ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAoY29sdW1uLmhlYWRlciB8IHRyYW5zbGF0ZSkgfHwgY29sdW1uLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0gfCBtYXA6IGdldEhlYWRlckNlbGxSZW5kZXJlclNwZWMgOiB0aGlzIGFzIGNlbGxSZW5kZXJlclNwZWNcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGM4eS1jZWxsLXJlbmRlcmVyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtY3k9XCJjOHktZGF0YS1ncmlkLS1jOHktY2VsbC1yZW5kZXJlclwiXG4gICAgICAgICAgICAgICAgICAgIFtzcGVjXT1cImNlbGxSZW5kZXJlclNwZWNcIlxuICAgICAgICAgICAgICAgICAgPjwvYzh5LWNlbGwtcmVuZGVyZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgIGM4eUljb249XCJmaWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnRmlsdGVyJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgPCEtLSBpc0Ryb3BEb3duUGxhY2VkUmlnaHQgdG8gYmUgcmVtb3ZlZCB3aGVuIGNvbHVtbnMgYXJlIHRyYW5zZm9ybWVkIHRvIG9ic2VydmFibGVzLiAtLT5cbiAgICAgICAgICAgICAgPHVsXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1tZW51XCJcbiAgICAgICAgICAgICAgICAqZHJvcGRvd25NZW51XG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnZHJvcGRvd24tbWVudS1yaWdodC1ncmlkJzogaXNEcm9wRG93blBsYWNlZFJpZ2h0KGNvbHVtbikgfVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJkYXRhLWdyaWRfX2Ryb3Bkb3duXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcGRvd246IGdyaWRIZWFkZXJEcm9wZG93blxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIF0gfCBtYXA6IGdldEZpbHRlcmluZ0Zvcm1SZW5kZXJlclNwZWMgOiB0aGlzIGFzIGZpbHRlcmluZ0Zvcm1SZW5kZXJlclNwZWNcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGM4eS1maWx0ZXJpbmctZm9ybS1yZW5kZXJlclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYmctY29tcG9uZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICBbc3BlY109XCJmaWx0ZXJpbmdGb3JtUmVuZGVyZXJTcGVjXCJcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhLWN5PVwiYzh5LWRhdGEtZ3JpZC0tYzh5LWZpbHRlcmluZy1mb3JtLXJlbmRlcmVyXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvYzh5LWZpbHRlcmluZy1mb3JtLXJlbmRlcmVyPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuLXNvcnRcIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwic29ydENvbHVtblRpdGxlIHwgdHJhbnNsYXRlOiB7IG5hbWU6IGNvbHVtbi5oZWFkZXIgfCB0cmFuc2xhdGUgfVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi5zb3J0YWJsZVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VTb3J0T3JkZXIoY29sdW1uLm5hbWUpXCJcbiAgICAgICAgICAgICAgZGF0YS1jeT1cImNoYW5nZS1zb3J0LW9yZGVyXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29sdW1uLnNvcnRPcmRlclwiPlxuICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICBjOHlJY29uPVwibG9uZy1hcnJvdy11cFwiXG4gICAgICAgICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ2FzYydcIlxuICAgICAgICAgICAgICAgID48L2k+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==