@impartner/design-components 2.0.1 → 2.1.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.
- package/README.md +2 -1
- package/esm2022/lib/badge/badge.component.mjs +17 -1
- package/esm2022/lib/datetime-picker/components/datepicker-nav/datepicker-nav.component.mjs +105 -0
- package/esm2022/lib/datetime-picker/components/datepicker-nav/index.mjs +2 -0
- package/esm2022/lib/datetime-picker/components/datepicker-template-host/datepicker-template-host.component.mjs +30 -0
- package/esm2022/lib/datetime-picker/components/datepicker-template-host/index.mjs +2 -0
- package/esm2022/lib/datetime-picker/components/datetime-picker/datetime-picker.component.mjs +370 -0
- package/esm2022/lib/datetime-picker/components/datetime-picker/index.mjs +2 -0
- package/esm2022/lib/datetime-picker/components/datetime-picker-input/datetime-picker-input.component.mjs +367 -0
- package/esm2022/lib/datetime-picker/components/datetime-picker-input/index.mjs +2 -0
- package/esm2022/lib/datetime-picker/components/datetime-picker-input-footer/datetime-picker-input-footer.component.mjs +68 -0
- package/esm2022/lib/datetime-picker/components/datetime-picker-input-footer/index.mjs +2 -0
- package/esm2022/lib/datetime-picker/components/index.mjs +6 -0
- package/esm2022/lib/datetime-picker/constants/datetime-picker-defaults.mjs +12 -0
- package/esm2022/lib/datetime-picker/constants/index.mjs +2 -0
- package/esm2022/lib/datetime-picker/datetime-picker.module.mjs +22 -0
- package/esm2022/lib/datetime-picker/index.mjs +4 -0
- package/esm2022/lib/datetime-picker/services/datetime-formatter/datetime-formatter.service.mjs +40 -0
- package/esm2022/lib/datetime-picker/services/datetime-formatter/index.mjs +2 -0
- package/esm2022/lib/datetime-picker/services/index.mjs +2 -0
- package/esm2022/lib/datetime-picker/types/datetime-picker-value.interface.mjs +2 -0
- package/esm2022/lib/datetime-picker/types/index.mjs +2 -0
- package/esm2022/lib/design-components.module.mjs +20 -7
- package/esm2022/lib/form-field/component/directives/corner-hint.directive.mjs +15 -0
- package/esm2022/lib/form-field/component/directives/error.directive.mjs +27 -0
- package/esm2022/lib/form-field/component/directives/form-root.directive.mjs +93 -0
- package/esm2022/lib/form-field/component/directives/hint.directive.mjs +25 -0
- package/esm2022/lib/form-field/component/directives/index.mjs +25 -0
- package/esm2022/lib/form-field/component/directives/label.directive.mjs +15 -0
- package/esm2022/lib/form-field/component/directives/prefix.directive.mjs +25 -0
- package/esm2022/lib/form-field/component/directives/suffix.directive.mjs +25 -0
- package/esm2022/lib/form-field/component/form-field.component.mjs +131 -0
- package/esm2022/lib/form-field/component/form-field.module.mjs +24 -0
- package/esm2022/lib/form-field/component/index.mjs +4 -0
- package/esm2022/lib/form-field/controls/checkbox/checkbox.component.mjs +14 -6
- package/esm2022/lib/form-field/controls/checkbox/checkbox.module.mjs +4 -7
- package/esm2022/lib/form-field/controls/index.mjs +2 -1
- package/esm2022/lib/form-field/controls/input/input.directive.mjs +4 -3
- package/esm2022/lib/form-field/controls/radio/radio-button/radio-button.component.mjs +6 -4
- package/esm2022/lib/form-field/controls/radio/radio-group/radio-group.directive.mjs +4 -3
- package/esm2022/lib/form-field/controls/radio/radio.module.mjs +4 -7
- package/esm2022/lib/form-field/controls/select/index.mjs +6 -3
- package/esm2022/lib/form-field/controls/select/interfaces/index.mjs +2 -0
- package/esm2022/lib/form-field/controls/select/interfaces/select-option.interface.mjs +2 -0
- package/esm2022/lib/form-field/controls/select/option/index.mjs +2 -2
- package/esm2022/lib/form-field/controls/select/option/select-option.component.mjs +33 -128
- package/esm2022/lib/form-field/controls/select/option-display/index.mjs +2 -0
- package/esm2022/lib/form-field/controls/select/option-display/select-option-display.component.mjs +162 -0
- package/esm2022/lib/form-field/controls/select/option-group/index.mjs +2 -0
- package/esm2022/lib/form-field/controls/select/option-group/select-option-group.component.mjs +35 -0
- package/esm2022/lib/form-field/controls/select/option-parent.mjs +2 -1
- package/esm2022/lib/form-field/controls/select/select.component.mjs +348 -148
- package/esm2022/lib/form-field/controls/select/select.module.mjs +20 -13
- package/esm2022/lib/form-field/controls/select/value-tags-display/index.mjs +2 -0
- package/esm2022/lib/form-field/controls/select/value-tags-display/select-value-tags-display.component.mjs +91 -0
- package/esm2022/lib/form-field/controls/shared/toggle/components/toggle-input/toggle-input.component.mjs +3 -3
- package/esm2022/lib/form-field/controls/shared/toggle/toggle.component.mjs +19 -3
- package/esm2022/lib/form-field/controls/shared/toggle/toggle.module.mjs +4 -6
- package/esm2022/lib/form-field/controls/tag-select/index.mjs +2 -0
- package/esm2022/lib/form-field/controls/tag-select/tag-select.component.mjs +146 -0
- package/esm2022/lib/form-field/impdc-forms.mjs +2 -3
- package/esm2022/lib/form-field/impdc-forms.module.mjs +32 -47
- package/esm2022/lib/form-field/shared/error-state.mixin.mjs +1 -1
- package/esm2022/lib/icon/icon.component.mjs +12 -5
- package/esm2022/lib/index.mjs +3 -1
- package/esm2022/lib/pagination/pagination.component.mjs +6 -6
- package/esm2022/lib/select-icon/select-icon.component.mjs +6 -6
- package/esm2022/lib/select-icon/select-icon.module.mjs +5 -1
- package/esm2022/lib/table/containers/table.component.mjs +3 -3
- package/esm2022/lib/tag/index.mjs +2 -0
- package/esm2022/lib/tag/tag.component.mjs +104 -0
- package/esm2022/lib/text-highlight/text-highlight.component.mjs +52 -37
- package/esm2022/lib/text-highlight/text-highlight.module.mjs +4 -6
- package/fesm2022/impartner-design-components.mjs +5620 -3983
- package/fesm2022/impartner-design-components.mjs.map +1 -1
- package/lib/badge/badge.component.d.ts +15 -1
- package/lib/datetime-picker/components/datepicker-nav/datepicker-nav.component.d.ts +31 -0
- package/lib/datetime-picker/components/datepicker-nav/index.d.ts +1 -0
- package/lib/datetime-picker/components/datepicker-template-host/datepicker-template-host.component.d.ts +14 -0
- package/lib/datetime-picker/components/datepicker-template-host/index.d.ts +1 -0
- package/lib/datetime-picker/components/datetime-picker/datetime-picker.component.d.ts +157 -0
- package/lib/datetime-picker/components/datetime-picker/index.d.ts +1 -0
- package/lib/datetime-picker/components/datetime-picker-input/datetime-picker-input.component.d.ts +160 -0
- package/lib/datetime-picker/components/datetime-picker-input/index.d.ts +1 -0
- package/lib/datetime-picker/components/datetime-picker-input-footer/datetime-picker-input-footer.component.d.ts +24 -0
- package/lib/datetime-picker/components/datetime-picker-input-footer/index.d.ts +1 -0
- package/lib/datetime-picker/components/index.d.ts +5 -0
- package/lib/datetime-picker/constants/datetime-picker-defaults.d.ts +4 -0
- package/lib/datetime-picker/constants/index.d.ts +1 -0
- package/lib/datetime-picker/datetime-picker.module.d.ts +8 -0
- package/lib/datetime-picker/index.d.ts +4 -0
- package/lib/datetime-picker/services/datetime-formatter/datetime-formatter.service.d.ts +20 -0
- package/lib/datetime-picker/services/datetime-formatter/index.d.ts +1 -0
- package/lib/datetime-picker/services/index.d.ts +1 -0
- package/lib/datetime-picker/types/datetime-picker-value.interface.d.ts +5 -0
- package/lib/datetime-picker/types/index.d.ts +1 -0
- package/lib/design-components.module.d.ts +14 -12
- package/lib/form-field/{directives → component/directives}/corner-hint.directive.d.ts +1 -1
- package/lib/form-field/{directives → component/directives}/error.directive.d.ts +1 -1
- package/lib/form-field/{directives → component/directives}/form-root.directive.d.ts +2 -2
- package/lib/form-field/{directives → component/directives}/hint.directive.d.ts +1 -1
- package/lib/form-field/component/directives/index.d.ts +15 -0
- package/lib/form-field/{directives → component/directives}/label.directive.d.ts +1 -1
- package/lib/form-field/{directives → component/directives}/prefix.directive.d.ts +1 -1
- package/lib/form-field/{directives → component/directives}/suffix.directive.d.ts +1 -1
- package/lib/form-field/{form-field.component.d.ts → component/form-field.component.d.ts} +3 -5
- package/lib/form-field/component/form-field.module.d.ts +14 -0
- package/lib/form-field/component/index.d.ts +3 -0
- package/lib/form-field/controls/checkbox/checkbox.component.d.ts +6 -2
- package/lib/form-field/controls/checkbox/checkbox.module.d.ts +1 -3
- package/lib/form-field/controls/index.d.ts +1 -0
- package/lib/form-field/controls/input/input.directive.d.ts +2 -2
- package/lib/form-field/controls/radio/radio-button/radio-button.component.d.ts +1 -1
- package/lib/form-field/controls/radio/radio-group/radio-group.directive.d.ts +2 -2
- package/lib/form-field/controls/radio/radio.module.d.ts +1 -3
- package/lib/form-field/controls/select/index.d.ts +6 -2
- package/lib/form-field/controls/select/interfaces/index.d.ts +1 -0
- package/lib/form-field/controls/select/interfaces/select-option.interface.d.ts +6 -0
- package/lib/form-field/controls/select/option/index.d.ts +1 -1
- package/lib/form-field/controls/select/option/select-option.component.d.ts +10 -49
- package/lib/form-field/controls/select/option-display/index.d.ts +1 -0
- package/lib/form-field/controls/select/option-display/select-option-display.component.d.ts +64 -0
- package/lib/form-field/controls/select/option-group/index.d.ts +1 -0
- package/lib/form-field/controls/select/option-group/select-option-group.component.d.ts +11 -0
- package/lib/form-field/controls/select/option-parent.d.ts +12 -1
- package/lib/form-field/controls/select/select.component.d.ts +113 -51
- package/lib/form-field/controls/select/select.module.d.ts +5 -6
- package/lib/form-field/controls/select/value-tags-display/index.d.ts +1 -0
- package/lib/form-field/controls/select/value-tags-display/select-value-tags-display.component.d.ts +46 -0
- package/lib/form-field/controls/shared/toggle/components/toggle-input/toggle-input.component.d.ts +1 -1
- package/lib/form-field/controls/shared/toggle/toggle.component.d.ts +4 -1
- package/lib/form-field/controls/shared/toggle/toggle.module.d.ts +1 -2
- package/lib/form-field/controls/tag-select/index.d.ts +1 -0
- package/lib/form-field/controls/tag-select/tag-select.component.d.ts +43 -0
- package/lib/form-field/impdc-forms.d.ts +1 -2
- package/lib/form-field/impdc-forms.module.d.ts +8 -14
- package/lib/form-field/shared/error-state.mixin.d.ts +4 -4
- package/lib/icon/icon.component.d.ts +5 -3
- package/lib/index.d.ts +2 -0
- package/lib/select-icon/select-icon.module.d.ts +4 -3
- package/lib/tag/index.d.ts +1 -0
- package/lib/tag/tag.component.d.ts +54 -0
- package/lib/text-highlight/text-highlight.component.d.ts +12 -6
- package/lib/text-highlight/text-highlight.module.d.ts +1 -2
- package/package.json +2 -2
- package/esm2022/lib/form-field/directives/corner-hint.directive.mjs +0 -14
- package/esm2022/lib/form-field/directives/error.directive.mjs +0 -26
- package/esm2022/lib/form-field/directives/form-root.directive.mjs +0 -91
- package/esm2022/lib/form-field/directives/hint.directive.mjs +0 -24
- package/esm2022/lib/form-field/directives/index.mjs +0 -8
- package/esm2022/lib/form-field/directives/label.directive.mjs +0 -14
- package/esm2022/lib/form-field/directives/prefix.directive.mjs +0 -24
- package/esm2022/lib/form-field/directives/suffix.directive.mjs +0 -24
- package/esm2022/lib/form-field/form-field.component.mjs +0 -132
- package/lib/form-field/directives/index.d.ts +0 -7
|
@@ -352,11 +352,11 @@ export class TableComponent {
|
|
|
352
352
|
}
|
|
353
353
|
}
|
|
354
354
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: TableComponent, deps: [{ token: i1.DatePipe }, { token: i1.PercentPipe }, { token: i1.DecimalPipe }, { token: i0.ChangeDetectorRef }, { token: i2.BrandedDirective, host: true, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
355
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.0.1", type: TableComponent, selector: "impdc-table", inputs: { loading: "loading", columnDefs: "columnDefs", striped: "striped", canSelectRows: "canSelectRows", canSelectAllRows: "canSelectAllRows", selectPlaceholder: "selectPlaceholder", sortColumnIndex: "sortColumnIndex", sortDirection: "sortDirection", tableData: "tableData", selectedRowIds: "selectedRowIds", customCellComponents: "customCellComponents" }, outputs: { rowSelect: "rowSelect", sortBy: "sortBy", linkClick: "linkClick", rowActionClick: "rowActionClick", inputChange: "inputChange" }, queries: [{ propertyName: "paginationComponent", first: true, predicate: PaginationComponent, descendants: true }, { propertyName: "bulkActions", first: true, predicate: TableBulkActionsComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (tableData) {\n<table impdcTable [striped]=\"striped\">\n <thead>\n @if (!!bulkActions) {\n <tr>\n <th [attr.colspan]=\"tableSpan\" scope=\"col\" class=\"bulk-action-column\">\n <ng-content select=\"impdc-table-bulk-actions\"></ng-content>\n <ng-content select=\"[impdcTableBulkActions]\"></ng-content>\n </th>\n </tr>\n }\n <tr>\n @if (canSelectRows) {\n <th\n scope=\"col\"\n [ngClass]=\"{\n 'heading-below-bulk-actions': !!bulkActions\n }\">\n @if (canSelectAllRows) {\n <div>\n <impdc-checkbox\n ngModel\n [checked]=\"allSelected\"\n [indeterminate]=\"someSelected\"\n (change)=\"handleSelectAll($event)\"></impdc-checkbox>\n </div>\n }\n </th>\n } @for (columnDef of columnDefs; track columnDef; let columnIndex =\n $index) {\n <th\n scope=\"col\"\n [ngClass]=\"{\n 'sorted-column': isSortedColumn(columnIndex),\n 'sortable-column': columnDef.sorted,\n 'heading-below-bulk-actions': !!bulkActions\n }\"\n (click)=\"handleSort(columnIndex)\">\n <impdc-column-heading\n [isSortable]=\"columnDef.sorted || false\"\n [columnIndex]=\"columnIndex\"\n [sortColumnIndex]=\"sortColumnIndex\"\n [direction]=\"sortDirection\"\n [text]=\"columnDef.title\"\n (sort)=\"handleSort($event)\">\n </impdc-column-heading>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (loading) {\n <tr>\n <td [attr.colspan]=\"tableSpan\" class=\"data-loading\">\n <impdc-spinner></impdc-spinner>\n </td>\n </tr>\n } @else { @for (row of tableData; track row; let rowIndex = $index) {\n <tr>\n @if (canSelectRows) {\n <td>\n <div class=\"select-column\">\n <impdc-checkbox\n [ngModel]=\"isRowSelected(row.id)\"\n (change)=\"handleRowSelect($event, row.id)\"></impdc-checkbox>\n </div>\n </td>\n }\n <td\n *ngFor=\"let columnDef of columnDefs; index as colIndex; last as isLast\"\n [ngClass]=\"{\n 'col-no-padding': !!columnDef.noPadding,\n 'actions-column': columnDef.columnType === cellType.Actions\n }\">\n <div>\n @switch (columnDef.columnType) { @case (cellType.Badge) {\n <span>\n <impdc-badge\n [text]=\"getStringValue(colIndex, row)\"\n [theme]=\"getTheme(columnDef, row)\">\n </impdc-badge>\n </span>\n } @case (cellType.Link) {\n <span (click)=\"handleLinkClick(colIndex, row)\">\n @if (!branded) {\n <a>\n {{ getValue(colIndex, row) }}\n </a>\n } @else {\n <a impdcBranded>\n {{ getValue(colIndex, row) }}\n </a>\n }\n </span>\n } @case (cellType.Url) {\n <span>\n @if (!branded) {\n <a target=\"_blank\" [attr.href]=\"getValue(colIndex, row)\">\n {{ getValue(colIndex, row) }}\n </a>\n } @else {\n <a\n impdcBranded\n target=\"_blank\"\n [attr.href]=\"getValue(colIndex, row)\">\n {{ getValue(colIndex, row) }}\n </a>\n }\n </span>\n } @case (cellType.Email) {\n <span>\n @if (!branded) {\n <a\n target=\"_blank\"\n [attr.href]=\"'mailto:' + getValue(colIndex, row)\">\n {{ getValue(colIndex, row) }}\n </a>\n } @else {\n <a impdcBranded [attr.href]=\"getMailToValue(colIndex, row)\">\n {{ getValue(colIndex, row) }}\n </a>\n }\n </span>\n } @case (cellType.Input) {\n <span>\n <input\n impdcInput\n type=\"text\"\n class=\"{{ getCellColor(columnDef, row) }}\"\n [ngModel]=\"getValue(colIndex, row)\"\n (ngModelChange)=\"\n handleCellValueChange(colIndex, rowIndex, $event)\n \" />\n </span>\n } @case (cellType.Boolean) {\n <span>\n @if (columnDef.disabled && getValue(colIndex, row) === 'true') {\n <span\n impdc-icon\n name=\"check\"\n class=\"{{ getCellColor(columnDef, row) }}\"></span>\n } @else if (!columnDef.disabled) {\n <impdc-checkbox\n [checked]=\"getValue(colIndex, row) === 'true'\"\n [isSwitch]=\"true\"\n (change)=\"\n handleCellValueChange(colIndex, rowIndex, $event.checked)\n \"></impdc-checkbox>\n }\n </span>\n } @case (cellType.SingleSelect) {\n <span>\n <impdc-select\n [ngModel]=\"getValue(colIndex, row)\"\n [disabled]=\"columnDef.disabled || false\"\n [placeholder]=\"selectPlaceholder\"\n (selectionChange)=\"\n handleCellValueChange(colIndex, rowIndex, $event.value)\n \">\n @if (selectPlaceholder) {\n <impdc-select-option value [label]=\"selectPlaceholder\">\n </impdc-select-option>\n } @for (value of (columnDef.values || []); track value) {\n <impdc-select-option\n [value]=\"value.value\"\n [label]=\"value.label\"></impdc-select-option>\n }\n </impdc-select>\n </span>\n } @case (cellType.MultiSelect) {\n <span>\n <impdc-select\n [ngModel]=\"getValue(colIndex, row)\"\n [disabled]=\"columnDef.disabled || false\"\n [placeholder]=\"selectPlaceholder\"\n multiple=\"true\"\n (selectionChange)=\"\n handleCellValueChange(colIndex, rowIndex, $event.value)\n \">\n @for (value of (columnDef.values || []); track value) {\n <impdc-select-option\n [value]=\"value.value\"\n [label]=\"value.label\"></impdc-select-option>\n }\n </impdc-select>\n </span>\n } @case (cellType.CellRender) {\n <span class=\"{{ getCellColor(columnDef, row) }}\">\n <ng-template\n impdcTableInjectComponent\n [columnDef]=\"columnDef\"\n [rowItem]=\"row\"\n [customCellComponents]=\"customCellComponents || {}\"\n [value]=\"getRawValue(colIndex, row)\"></ng-template>\n </span>\n } @case (cellType.Icon) {\n <span>\n <span\n impdc-icon\n [name]=\"columnDef.iconName\"\n class=\"{{ getCellColor(columnDef, row) }}\"></span>\n </span>\n } @case (cellType.Actions) {\n <span>\n <!-- will always return 'true', but needed to satisfy the type engine -->\n @if (columnDefIsActions(columnDef)) {\n <impdc-row-actions\n [columnDef]=\"columnDef\"\n [rowItem]=\"row\"\n [lastColumn]=\"isLast\"\n (actionClick)=\"\n handleActionClick(colIndex, row, $event)\n \"></impdc-row-actions>\n }\n </span>\n } @default {\n <span class=\"{{ getCellColor(columnDef, row) }}\">\n {{ getValue(colIndex, row) }}\n </span>\n } }\n </div>\n </td>\n </tr>\n } @empty {\n <tr>\n <td [attr.colspan]=\"tableSpan\" class=\"no-data\">\n <ng-content select=\"[noData]\"></ng-content>\n </td>\n </tr>\n } }\n </tbody>\n <tfoot>\n @if (paginationComponent) {\n <tr>\n <td [attr.colspan]=\"tableSpan\">\n <ng-content\n select=\"impdc-pagination, div[impdc-pagination]\"></ng-content>\n </td>\n </tr>\n }\n </tfoot>\n</table>\n}\n", styles: [".bulk-action-container{display:flex;flex-direction:row;border:1px solid var(--impd-color-gray-200);border-top-left-radius:.6rem;border-top-right-radius:.6rem;border-bottom:0px}.bulk-action-container .bulk-action-checkbox{padding:1.6rem 2rem}.bulk-action-container .bulk-actions{display:flex;flex-direction:row;gap:.4rem}.col-no-padding{padding:0!important}.data-loading{height:var(--impd-size-80);vertical-align:middle;text-align:center}.no-data{vertical-align:middle;text-align:center}.select-row{display:flex;height:var(--impd-size-4);align-items:center;justify-items:end;border-radius:var(--impd-border-radius-default)}.heading-with-checkbox{padding-left:5px;padding-right:10px}.actions-column{width:.1%;white-space:nowrap}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.BrandedDirective, selector: "[impdcBranded]" }, { kind: "component", type: i4.IconComponent, selector: "impdc-icon, [impdc-icon]", inputs: ["name", "theme", "size"] }, { kind: "component", type: i5.CheckboxComponent, selector: "impdc-checkbox", inputs: ["tabIndex", "id", "label", "description", "isSwitch", "switchIcons", "inline", "checked", "indeterminate", "disabled", "errorStateMatcher", "required"], outputs: ["change", "indeterminateChange"], exportAs: ["impdcCheckControl"] }, { kind: "component", type: i6.SelectOptionComponent, selector: "impdc-select-option", inputs: ["value", "label", "id", "disabled"], outputs: ["onSelectionChange"] }, { kind: "component", type: i7.SelectComponent, selector: "impdc-select", inputs: ["disabled", "tabIndex", "placeholder", "required", "multiple", "compareWith", "errorStateMatcher", "value", "id"], outputs: ["selectionChange", "valueChange"], exportAs: ["impdcSelect"] }, { kind: "directive", type: i8.InputDirective, selector: "input[impdcInput], textarea[impdcInput], select[impdcNativeSelect]", inputs: ["disabled", "id", "type", "required", "readonly", "errorStateMatcher", "value"], exportAs: ["impdcInput"] }, { kind: "directive", type: i9.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: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i10.SpinnerComponent, selector: "impdc-spinner, div[impdc-spinner]", inputs: ["accessibilityText"] }, { kind: "component", type: i11.BadgeComponent, selector: "impdc-badge, [impdc-badge]", inputs: ["text", "icon", "theme", "size", "hideBg", "rounded", "dismissable"], outputs: ["dismiss"] }, { kind: "directive", type: i12.TableDirective, selector: "table[impdcTable]", inputs: ["striped"] }, { kind: "component", type: i13.ColumnHeadingComponent, selector: "impdc-column-heading", inputs: ["isSortable", "columnIndex", "sortColumnIndex", "direction", "text"], outputs: ["sort"] }, { kind: "directive", type: i14.TableInjectComponentDirective, selector: "[impdcTableInjectComponent]", inputs: ["columnDef", "value", "rowItem", "customCellComponents"] }, { kind: "component", type: i15.RowActionsComponent, selector: "impdc-row-actions", inputs: ["columnDef", "rowItem", "lastColumn"], outputs: ["actionClick"] }] }); }
|
|
355
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.0.1", type: TableComponent, selector: "impdc-table", inputs: { loading: "loading", columnDefs: "columnDefs", striped: "striped", canSelectRows: "canSelectRows", canSelectAllRows: "canSelectAllRows", selectPlaceholder: "selectPlaceholder", sortColumnIndex: "sortColumnIndex", sortDirection: "sortDirection", tableData: "tableData", selectedRowIds: "selectedRowIds", customCellComponents: "customCellComponents" }, outputs: { rowSelect: "rowSelect", sortBy: "sortBy", linkClick: "linkClick", rowActionClick: "rowActionClick", inputChange: "inputChange" }, queries: [{ propertyName: "paginationComponent", first: true, predicate: PaginationComponent, descendants: true }, { propertyName: "bulkActions", first: true, predicate: TableBulkActionsComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (tableData) {\n<table impdcTable [striped]=\"striped\">\n <thead>\n @if (!!bulkActions) {\n <tr>\n <th [attr.colspan]=\"tableSpan\" scope=\"col\" class=\"bulk-action-column\">\n <ng-content select=\"impdc-table-bulk-actions\"></ng-content>\n <ng-content select=\"[impdcTableBulkActions]\"></ng-content>\n </th>\n </tr>\n }\n <tr>\n @if (canSelectRows) {\n <th\n scope=\"col\"\n [ngClass]=\"{\n 'heading-below-bulk-actions': !!bulkActions\n }\">\n @if (canSelectAllRows) {\n <div>\n <impdc-checkbox\n ngModel\n [checked]=\"allSelected\"\n [indeterminate]=\"someSelected\"\n (change)=\"handleSelectAll($event)\"></impdc-checkbox>\n </div>\n }\n </th>\n } @for (columnDef of columnDefs; track columnDef; let columnIndex =\n $index) {\n <th\n scope=\"col\"\n [ngClass]=\"{\n 'sorted-column': isSortedColumn(columnIndex),\n 'sortable-column': columnDef.sorted,\n 'heading-below-bulk-actions': !!bulkActions\n }\"\n (click)=\"handleSort(columnIndex)\">\n <impdc-column-heading\n [isSortable]=\"columnDef.sorted || false\"\n [columnIndex]=\"columnIndex\"\n [sortColumnIndex]=\"sortColumnIndex\"\n [direction]=\"sortDirection\"\n [text]=\"columnDef.title\"\n (sort)=\"handleSort($event)\">\n </impdc-column-heading>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (loading) {\n <tr>\n <td [attr.colspan]=\"tableSpan\" class=\"data-loading\">\n <impdc-spinner></impdc-spinner>\n </td>\n </tr>\n } @else { @for (row of tableData; track row; let rowIndex = $index) {\n <tr>\n @if (canSelectRows) {\n <td>\n <div class=\"select-column\">\n <impdc-checkbox\n [ngModel]=\"isRowSelected(row.id)\"\n (change)=\"handleRowSelect($event, row.id)\"></impdc-checkbox>\n </div>\n </td>\n }\n <td\n *ngFor=\"let columnDef of columnDefs; index as colIndex; last as isLast\"\n [ngClass]=\"{\n 'col-no-padding': !!columnDef.noPadding,\n 'actions-column': columnDef.columnType === cellType.Actions\n }\">\n <div>\n @switch (columnDef.columnType) { @case (cellType.Badge) {\n <span>\n <impdc-badge\n [text]=\"getStringValue(colIndex, row)\"\n [theme]=\"getTheme(columnDef, row)\">\n </impdc-badge>\n </span>\n } @case (cellType.Link) {\n <span (click)=\"handleLinkClick(colIndex, row)\">\n @if (!branded) {\n <a>\n {{ getValue(colIndex, row) }}\n </a>\n } @else {\n <a impdcBranded>\n {{ getValue(colIndex, row) }}\n </a>\n }\n </span>\n } @case (cellType.Url) {\n <span>\n @if (!branded) {\n <a target=\"_blank\" [attr.href]=\"getValue(colIndex, row)\">\n {{ getValue(colIndex, row) }}\n </a>\n } @else {\n <a\n impdcBranded\n target=\"_blank\"\n [attr.href]=\"getValue(colIndex, row)\">\n {{ getValue(colIndex, row) }}\n </a>\n }\n </span>\n } @case (cellType.Email) {\n <span>\n @if (!branded) {\n <a\n target=\"_blank\"\n [attr.href]=\"'mailto:' + getValue(colIndex, row)\">\n {{ getValue(colIndex, row) }}\n </a>\n } @else {\n <a impdcBranded [attr.href]=\"getMailToValue(colIndex, row)\">\n {{ getValue(colIndex, row) }}\n </a>\n }\n </span>\n } @case (cellType.Input) {\n <span>\n <input\n impdcInput\n type=\"text\"\n class=\"{{ getCellColor(columnDef, row) }}\"\n [ngModel]=\"getValue(colIndex, row)\"\n (ngModelChange)=\"\n handleCellValueChange(colIndex, rowIndex, $event)\n \" />\n </span>\n } @case (cellType.Boolean) {\n <span>\n @if (columnDef.disabled && getValue(colIndex, row) === 'true') {\n <span\n impdc-icon\n name=\"check\"\n class=\"{{ getCellColor(columnDef, row) }}\"></span>\n } @else if (!columnDef.disabled) {\n <impdc-checkbox\n [checked]=\"getValue(colIndex, row) === 'true'\"\n [isSwitch]=\"true\"\n (change)=\"\n handleCellValueChange(colIndex, rowIndex, $event.checked)\n \"></impdc-checkbox>\n }\n </span>\n } @case (cellType.SingleSelect) {\n <span>\n <impdc-select\n [ngModel]=\"getValue(colIndex, row)\"\n [disabled]=\"columnDef.disabled || false\"\n [placeholder]=\"selectPlaceholder\"\n allowClear=\"true\"\n (selectionChange)=\"\n handleCellValueChange(colIndex, rowIndex, $event.value)\n \">\n @for (value of (columnDef.values || []); track value) {\n <impdc-select-option\n [value]=\"value.value\"\n [label]=\"value.label\"></impdc-select-option>\n }\n </impdc-select>\n </span>\n } @case (cellType.MultiSelect) {\n <span>\n <impdc-select\n [ngModel]=\"getValue(colIndex, row)\"\n [disabled]=\"columnDef.disabled || false\"\n [placeholder]=\"selectPlaceholder\"\n multiple=\"true\"\n (selectionChange)=\"\n handleCellValueChange(colIndex, rowIndex, $event.value)\n \">\n @for (value of (columnDef.values || []); track value) {\n <impdc-select-option\n [value]=\"value.value\"\n [label]=\"value.label\"></impdc-select-option>\n }\n </impdc-select>\n </span>\n } @case (cellType.CellRender) {\n <span class=\"{{ getCellColor(columnDef, row) }}\">\n <ng-template\n impdcTableInjectComponent\n [columnDef]=\"columnDef\"\n [rowItem]=\"row\"\n [customCellComponents]=\"customCellComponents || {}\"\n [value]=\"getRawValue(colIndex, row)\"></ng-template>\n </span>\n } @case (cellType.Icon) {\n <span>\n <span\n impdc-icon\n [name]=\"columnDef.iconName\"\n class=\"{{ getCellColor(columnDef, row) }}\"></span>\n </span>\n } @case (cellType.Actions) {\n <span>\n <!-- will always return 'true', but needed to satisfy the type engine -->\n @if (columnDefIsActions(columnDef)) {\n <impdc-row-actions\n [columnDef]=\"columnDef\"\n [rowItem]=\"row\"\n [lastColumn]=\"isLast\"\n (actionClick)=\"\n handleActionClick(colIndex, row, $event)\n \"></impdc-row-actions>\n }\n </span>\n } @default {\n <span class=\"{{ getCellColor(columnDef, row) }}\">\n {{ getValue(colIndex, row) }}\n </span>\n } }\n </div>\n </td>\n </tr>\n } @empty {\n <tr>\n <td [attr.colspan]=\"tableSpan\" class=\"no-data\">\n <ng-content select=\"[noData]\"></ng-content>\n </td>\n </tr>\n } }\n </tbody>\n <tfoot>\n @if (paginationComponent) {\n <tr>\n <td [attr.colspan]=\"tableSpan\">\n <ng-content\n select=\"impdc-pagination, div[impdc-pagination]\"></ng-content>\n </td>\n </tr>\n }\n </tfoot>\n</table>\n}\n", styles: [".bulk-action-container{display:flex;flex-direction:row;border:1px solid var(--impd-color-gray-200);border-top-left-radius:.6rem;border-top-right-radius:.6rem;border-bottom:0px}.bulk-action-container .bulk-action-checkbox{padding:1.6rem 2rem}.bulk-action-container .bulk-actions{display:flex;flex-direction:row;gap:.4rem}.col-no-padding{padding:0!important}.data-loading{height:var(--impd-size-80);vertical-align:middle;text-align:center}.no-data{vertical-align:middle;text-align:center}.select-row{display:flex;height:var(--impd-size-4);align-items:center;justify-items:end;border-radius:var(--impd-border-radius-default)}.heading-with-checkbox{padding-left:5px;padding-right:10px}.actions-column{width:.1%;white-space:nowrap}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.BrandedDirective, selector: "[impdcBranded]" }, { kind: "component", type: i4.IconComponent, selector: "impdc-icon, [impdc-icon]", inputs: ["name", "theme", "size"] }, { kind: "component", type: i5.CheckboxComponent, selector: "impdc-checkbox", inputs: ["tabIndex", "id", "label", "description", "isSwitch", "switchIcons", "inline", "layout", "checked", "indeterminate", "disabled", "errorStateMatcher", "required"], outputs: ["change", "indeterminateChange"], exportAs: ["impdcCheckControl"] }, { kind: "component", type: i6.SelectOptionComponent, selector: "impdc-select-option", inputs: ["value", "label", "disabled"] }, { kind: "component", type: i7.SelectComponent, selector: "impdc-select", inputs: ["disabled", "tabIndex", "search", "placeholder", "required", "compareWith", "dropdownContainer", "errorStateMatcher", "allowClear", "multiple", "multipleDisplay"], outputs: ["selectionChange", "valueChange", "searchTextChanges"], exportAs: ["impdcSelect"] }, { kind: "directive", type: i8.InputDirective, selector: "input[impdcInput], textarea[impdcInput], select[impdcNativeSelect]", inputs: ["disabled", "id", "type", "required", "readonly", "errorStateMatcher", "value"], exportAs: ["impdcInput"] }, { kind: "directive", type: i9.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: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i10.SpinnerComponent, selector: "impdc-spinner, div[impdc-spinner]", inputs: ["accessibilityText"] }, { kind: "component", type: i11.BadgeComponent, selector: "impdc-badge, [impdc-badge]", inputs: ["text", "icon", "theme", "size", "hideBg", "rounded", "dismissable"], outputs: ["dismiss"] }, { kind: "directive", type: i12.TableDirective, selector: "table[impdcTable]", inputs: ["striped"] }, { kind: "component", type: i13.ColumnHeadingComponent, selector: "impdc-column-heading", inputs: ["isSortable", "columnIndex", "sortColumnIndex", "direction", "text"], outputs: ["sort"] }, { kind: "directive", type: i14.TableInjectComponentDirective, selector: "[impdcTableInjectComponent]", inputs: ["columnDef", "value", "rowItem", "customCellComponents"] }, { kind: "component", type: i15.RowActionsComponent, selector: "impdc-row-actions", inputs: ["columnDef", "rowItem", "lastColumn"], outputs: ["actionClick"] }] }); }
|
|
356
356
|
}
|
|
357
357
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: TableComponent, decorators: [{
|
|
358
358
|
type: Component,
|
|
359
|
-
args: [{ selector: 'impdc-table', template: "@if (tableData) {\n<table impdcTable [striped]=\"striped\">\n <thead>\n @if (!!bulkActions) {\n <tr>\n <th [attr.colspan]=\"tableSpan\" scope=\"col\" class=\"bulk-action-column\">\n <ng-content select=\"impdc-table-bulk-actions\"></ng-content>\n <ng-content select=\"[impdcTableBulkActions]\"></ng-content>\n </th>\n </tr>\n }\n <tr>\n @if (canSelectRows) {\n <th\n scope=\"col\"\n [ngClass]=\"{\n 'heading-below-bulk-actions': !!bulkActions\n }\">\n @if (canSelectAllRows) {\n <div>\n <impdc-checkbox\n ngModel\n [checked]=\"allSelected\"\n [indeterminate]=\"someSelected\"\n (change)=\"handleSelectAll($event)\"></impdc-checkbox>\n </div>\n }\n </th>\n } @for (columnDef of columnDefs; track columnDef; let columnIndex =\n $index) {\n <th\n scope=\"col\"\n [ngClass]=\"{\n 'sorted-column': isSortedColumn(columnIndex),\n 'sortable-column': columnDef.sorted,\n 'heading-below-bulk-actions': !!bulkActions\n }\"\n (click)=\"handleSort(columnIndex)\">\n <impdc-column-heading\n [isSortable]=\"columnDef.sorted || false\"\n [columnIndex]=\"columnIndex\"\n [sortColumnIndex]=\"sortColumnIndex\"\n [direction]=\"sortDirection\"\n [text]=\"columnDef.title\"\n (sort)=\"handleSort($event)\">\n </impdc-column-heading>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (loading) {\n <tr>\n <td [attr.colspan]=\"tableSpan\" class=\"data-loading\">\n <impdc-spinner></impdc-spinner>\n </td>\n </tr>\n } @else { @for (row of tableData; track row; let rowIndex = $index) {\n <tr>\n @if (canSelectRows) {\n <td>\n <div class=\"select-column\">\n <impdc-checkbox\n [ngModel]=\"isRowSelected(row.id)\"\n (change)=\"handleRowSelect($event, row.id)\"></impdc-checkbox>\n </div>\n </td>\n }\n <td\n *ngFor=\"let columnDef of columnDefs; index as colIndex; last as isLast\"\n [ngClass]=\"{\n 'col-no-padding': !!columnDef.noPadding,\n 'actions-column': columnDef.columnType === cellType.Actions\n }\">\n <div>\n @switch (columnDef.columnType) { @case (cellType.Badge) {\n <span>\n <impdc-badge\n [text]=\"getStringValue(colIndex, row)\"\n [theme]=\"getTheme(columnDef, row)\">\n </impdc-badge>\n </span>\n } @case (cellType.Link) {\n <span (click)=\"handleLinkClick(colIndex, row)\">\n @if (!branded) {\n <a>\n {{ getValue(colIndex, row) }}\n </a>\n } @else {\n <a impdcBranded>\n {{ getValue(colIndex, row) }}\n </a>\n }\n </span>\n } @case (cellType.Url) {\n <span>\n @if (!branded) {\n <a target=\"_blank\" [attr.href]=\"getValue(colIndex, row)\">\n {{ getValue(colIndex, row) }}\n </a>\n } @else {\n <a\n impdcBranded\n target=\"_blank\"\n [attr.href]=\"getValue(colIndex, row)\">\n {{ getValue(colIndex, row) }}\n </a>\n }\n </span>\n } @case (cellType.Email) {\n <span>\n @if (!branded) {\n <a\n target=\"_blank\"\n [attr.href]=\"'mailto:' + getValue(colIndex, row)\">\n {{ getValue(colIndex, row) }}\n </a>\n } @else {\n <a impdcBranded [attr.href]=\"getMailToValue(colIndex, row)\">\n {{ getValue(colIndex, row) }}\n </a>\n }\n </span>\n } @case (cellType.Input) {\n <span>\n <input\n impdcInput\n type=\"text\"\n class=\"{{ getCellColor(columnDef, row) }}\"\n [ngModel]=\"getValue(colIndex, row)\"\n (ngModelChange)=\"\n handleCellValueChange(colIndex, rowIndex, $event)\n \" />\n </span>\n } @case (cellType.Boolean) {\n <span>\n @if (columnDef.disabled && getValue(colIndex, row) === 'true') {\n <span\n impdc-icon\n name=\"check\"\n class=\"{{ getCellColor(columnDef, row) }}\"></span>\n } @else if (!columnDef.disabled) {\n <impdc-checkbox\n [checked]=\"getValue(colIndex, row) === 'true'\"\n [isSwitch]=\"true\"\n (change)=\"\n handleCellValueChange(colIndex, rowIndex, $event.checked)\n \"></impdc-checkbox>\n }\n </span>\n } @case (cellType.SingleSelect) {\n <span>\n <impdc-select\n [ngModel]=\"getValue(colIndex, row)\"\n [disabled]=\"columnDef.disabled || false\"\n [placeholder]=\"selectPlaceholder\"\n (selectionChange)=\"\n handleCellValueChange(colIndex, rowIndex, $event.value)\n \">\n @
|
|
359
|
+
args: [{ selector: 'impdc-table', template: "@if (tableData) {\n<table impdcTable [striped]=\"striped\">\n <thead>\n @if (!!bulkActions) {\n <tr>\n <th [attr.colspan]=\"tableSpan\" scope=\"col\" class=\"bulk-action-column\">\n <ng-content select=\"impdc-table-bulk-actions\"></ng-content>\n <ng-content select=\"[impdcTableBulkActions]\"></ng-content>\n </th>\n </tr>\n }\n <tr>\n @if (canSelectRows) {\n <th\n scope=\"col\"\n [ngClass]=\"{\n 'heading-below-bulk-actions': !!bulkActions\n }\">\n @if (canSelectAllRows) {\n <div>\n <impdc-checkbox\n ngModel\n [checked]=\"allSelected\"\n [indeterminate]=\"someSelected\"\n (change)=\"handleSelectAll($event)\"></impdc-checkbox>\n </div>\n }\n </th>\n } @for (columnDef of columnDefs; track columnDef; let columnIndex =\n $index) {\n <th\n scope=\"col\"\n [ngClass]=\"{\n 'sorted-column': isSortedColumn(columnIndex),\n 'sortable-column': columnDef.sorted,\n 'heading-below-bulk-actions': !!bulkActions\n }\"\n (click)=\"handleSort(columnIndex)\">\n <impdc-column-heading\n [isSortable]=\"columnDef.sorted || false\"\n [columnIndex]=\"columnIndex\"\n [sortColumnIndex]=\"sortColumnIndex\"\n [direction]=\"sortDirection\"\n [text]=\"columnDef.title\"\n (sort)=\"handleSort($event)\">\n </impdc-column-heading>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @if (loading) {\n <tr>\n <td [attr.colspan]=\"tableSpan\" class=\"data-loading\">\n <impdc-spinner></impdc-spinner>\n </td>\n </tr>\n } @else { @for (row of tableData; track row; let rowIndex = $index) {\n <tr>\n @if (canSelectRows) {\n <td>\n <div class=\"select-column\">\n <impdc-checkbox\n [ngModel]=\"isRowSelected(row.id)\"\n (change)=\"handleRowSelect($event, row.id)\"></impdc-checkbox>\n </div>\n </td>\n }\n <td\n *ngFor=\"let columnDef of columnDefs; index as colIndex; last as isLast\"\n [ngClass]=\"{\n 'col-no-padding': !!columnDef.noPadding,\n 'actions-column': columnDef.columnType === cellType.Actions\n }\">\n <div>\n @switch (columnDef.columnType) { @case (cellType.Badge) {\n <span>\n <impdc-badge\n [text]=\"getStringValue(colIndex, row)\"\n [theme]=\"getTheme(columnDef, row)\">\n </impdc-badge>\n </span>\n } @case (cellType.Link) {\n <span (click)=\"handleLinkClick(colIndex, row)\">\n @if (!branded) {\n <a>\n {{ getValue(colIndex, row) }}\n </a>\n } @else {\n <a impdcBranded>\n {{ getValue(colIndex, row) }}\n </a>\n }\n </span>\n } @case (cellType.Url) {\n <span>\n @if (!branded) {\n <a target=\"_blank\" [attr.href]=\"getValue(colIndex, row)\">\n {{ getValue(colIndex, row) }}\n </a>\n } @else {\n <a\n impdcBranded\n target=\"_blank\"\n [attr.href]=\"getValue(colIndex, row)\">\n {{ getValue(colIndex, row) }}\n </a>\n }\n </span>\n } @case (cellType.Email) {\n <span>\n @if (!branded) {\n <a\n target=\"_blank\"\n [attr.href]=\"'mailto:' + getValue(colIndex, row)\">\n {{ getValue(colIndex, row) }}\n </a>\n } @else {\n <a impdcBranded [attr.href]=\"getMailToValue(colIndex, row)\">\n {{ getValue(colIndex, row) }}\n </a>\n }\n </span>\n } @case (cellType.Input) {\n <span>\n <input\n impdcInput\n type=\"text\"\n class=\"{{ getCellColor(columnDef, row) }}\"\n [ngModel]=\"getValue(colIndex, row)\"\n (ngModelChange)=\"\n handleCellValueChange(colIndex, rowIndex, $event)\n \" />\n </span>\n } @case (cellType.Boolean) {\n <span>\n @if (columnDef.disabled && getValue(colIndex, row) === 'true') {\n <span\n impdc-icon\n name=\"check\"\n class=\"{{ getCellColor(columnDef, row) }}\"></span>\n } @else if (!columnDef.disabled) {\n <impdc-checkbox\n [checked]=\"getValue(colIndex, row) === 'true'\"\n [isSwitch]=\"true\"\n (change)=\"\n handleCellValueChange(colIndex, rowIndex, $event.checked)\n \"></impdc-checkbox>\n }\n </span>\n } @case (cellType.SingleSelect) {\n <span>\n <impdc-select\n [ngModel]=\"getValue(colIndex, row)\"\n [disabled]=\"columnDef.disabled || false\"\n [placeholder]=\"selectPlaceholder\"\n allowClear=\"true\"\n (selectionChange)=\"\n handleCellValueChange(colIndex, rowIndex, $event.value)\n \">\n @for (value of (columnDef.values || []); track value) {\n <impdc-select-option\n [value]=\"value.value\"\n [label]=\"value.label\"></impdc-select-option>\n }\n </impdc-select>\n </span>\n } @case (cellType.MultiSelect) {\n <span>\n <impdc-select\n [ngModel]=\"getValue(colIndex, row)\"\n [disabled]=\"columnDef.disabled || false\"\n [placeholder]=\"selectPlaceholder\"\n multiple=\"true\"\n (selectionChange)=\"\n handleCellValueChange(colIndex, rowIndex, $event.value)\n \">\n @for (value of (columnDef.values || []); track value) {\n <impdc-select-option\n [value]=\"value.value\"\n [label]=\"value.label\"></impdc-select-option>\n }\n </impdc-select>\n </span>\n } @case (cellType.CellRender) {\n <span class=\"{{ getCellColor(columnDef, row) }}\">\n <ng-template\n impdcTableInjectComponent\n [columnDef]=\"columnDef\"\n [rowItem]=\"row\"\n [customCellComponents]=\"customCellComponents || {}\"\n [value]=\"getRawValue(colIndex, row)\"></ng-template>\n </span>\n } @case (cellType.Icon) {\n <span>\n <span\n impdc-icon\n [name]=\"columnDef.iconName\"\n class=\"{{ getCellColor(columnDef, row) }}\"></span>\n </span>\n } @case (cellType.Actions) {\n <span>\n <!-- will always return 'true', but needed to satisfy the type engine -->\n @if (columnDefIsActions(columnDef)) {\n <impdc-row-actions\n [columnDef]=\"columnDef\"\n [rowItem]=\"row\"\n [lastColumn]=\"isLast\"\n (actionClick)=\"\n handleActionClick(colIndex, row, $event)\n \"></impdc-row-actions>\n }\n </span>\n } @default {\n <span class=\"{{ getCellColor(columnDef, row) }}\">\n {{ getValue(colIndex, row) }}\n </span>\n } }\n </div>\n </td>\n </tr>\n } @empty {\n <tr>\n <td [attr.colspan]=\"tableSpan\" class=\"no-data\">\n <ng-content select=\"[noData]\"></ng-content>\n </td>\n </tr>\n } }\n </tbody>\n <tfoot>\n @if (paginationComponent) {\n <tr>\n <td [attr.colspan]=\"tableSpan\">\n <ng-content\n select=\"impdc-pagination, div[impdc-pagination]\"></ng-content>\n </td>\n </tr>\n }\n </tfoot>\n</table>\n}\n", styles: [".bulk-action-container{display:flex;flex-direction:row;border:1px solid var(--impd-color-gray-200);border-top-left-radius:.6rem;border-top-right-radius:.6rem;border-bottom:0px}.bulk-action-container .bulk-action-checkbox{padding:1.6rem 2rem}.bulk-action-container .bulk-actions{display:flex;flex-direction:row;gap:.4rem}.col-no-padding{padding:0!important}.data-loading{height:var(--impd-size-80);vertical-align:middle;text-align:center}.no-data{vertical-align:middle;text-align:center}.select-row{display:flex;height:var(--impd-size-4);align-items:center;justify-items:end;border-radius:var(--impd-border-radius-default)}.heading-with-checkbox{padding-left:5px;padding-right:10px}.actions-column{width:.1%;white-space:nowrap}\n"] }]
|
|
360
360
|
}], ctorParameters: () => [{ type: i1.DatePipe }, { type: i1.PercentPipe }, { type: i1.DecimalPipe }, { type: i0.ChangeDetectorRef }, { type: i2.BrandedDirective, decorators: [{
|
|
361
361
|
type: Optional
|
|
362
362
|
}, {
|
|
@@ -400,4 +400,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.1", ngImpor
|
|
|
400
400
|
}], inputChange: [{
|
|
401
401
|
type: Output
|
|
402
402
|
}] } });
|
|
403
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduLWNvbXBvbmVudHMvc3JjL2xpYi90YWJsZS9jb250YWluZXJzL3RhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1jb21wb25lbnRzL3NyYy9saWIvdGFibGUvY29udGFpbmVycy90YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osSUFBSSxFQUNKLEtBQUssRUFFTCxRQUFRLEVBQ1IsTUFBTSxFQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxHQUFHLElBQUksY0FBYyxFQUFFLEdBQUcsSUFBSSxjQUFjLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDdEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTlDLE9BQU8sRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFheEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRTFEOzs7R0FHRztBQU1ILE1BQU0sT0FBTyxjQUFjO0lBb0J6Qjs7T0FFRztJQUNILElBQW9CLGFBQWEsQ0FBQyxLQUFjO1FBQzlDLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO0lBQzlCLENB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SUFBSSxFQUFFLENBQUM7U0FDcEI7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLE9BQU8sRUFBRSxDQUFDO1NBQ1g7SUFDSCxDQUFDOzhHQXZiVSxjQUFjO2tHQUFkLGNBQWMseWxCQXFHWCxtQkFBbUIsOEVBSW5CLHlCQUF5QixxRUN0SnpDLG9oUUFtUEE7OzJGRHRNYSxjQUFjO2tCQUwxQixTQUFTOytCQUNFLGFBQWE7OzBCQXlKcEIsUUFBUTs7MEJBQUksSUFBSTt5Q0FqSkgsT0FBTztzQkFBdEIsS0FBSztnQkFTVSxVQUFVO3NCQUF6QixLQUFLO2dCQUtVLE9BQU87c0JBQXRCLEtBQUs7Z0JBS2MsYUFBYTtzQkFBaEMsS0FBSztnQkFXSyxnQkFBZ0I7c0JBRDFCLEtBQUs7Z0JBWVUsaUJBQWlCO3NCQUFoQyxLQUFLO2dCQUtVLGVBQWU7c0JBQTlCLEtBQUs7Z0JBS1UsYUFBYTtzQkFBNUIsS0FBSztnQkFLVSxTQUFTO3NCQUF4QixLQUFLO2dCQU1LLGNBQWM7c0JBRHhCLEtBQUs7Z0JBWVUsb0JBQW9CO3NCQUFuQyxLQUFLO2dCQUtvQixTQUFTO3NCQUFsQyxNQUFNO2dCQUttQixNQUFNO3NCQUEvQixNQUFNO2dCQUttQixTQUFTO3NCQUFsQyxNQUFNO2dCQUttQixjQUFjO3NCQUF2QyxNQUFNO2dCQUtBLG1CQUFtQjtzQkFEekIsWUFBWTt1QkFBQyxtQkFBbUI7Z0JBSzFCLFdBQVc7c0JBRGpCLFlBQVk7dUJBQUMseUJBQXlCO2dCQU9iLFdBQVc7c0JBQXBDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRlUGlwZSwgRGVjaW1hbFBpcGUsIFBlcmNlbnRQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZ2V0IGFzIGdldE5lc3RlZFZhbHVlLCBzZXQgYXMgc2V0TmVzdGVkVmFsdWUgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBERUJPVU5DRV9USU1FLCBTT1JUX0NPTFVNTl9JTkRFWCB9IGZyb20gJy4uL2NvbnN0YW50cy9pbmRleCc7XG5pbXBvcnQgeyBUYWJsZUNvbHVtblR5cGUgfSBmcm9tICcuLi9lbnVtZXJhdGlvbnMvaW5kZXgnO1xuaW1wb3J0IHtcbiAgSUN1c3RvbUNlbGxSZW5kZXJlckNvbXBvbmVudHMsXG4gIElTb3J0QnlQYXlsb2FkLFxuICBJVGFibGVBY3Rpb25zQ29sdW1uRGVmLFxuICBJVGFibGVFdmVudFBheWxvYWQsXG4gIElUYWJsZVJvd0FjdGlvblBheWxvYWQsXG4gIElUYWJsZVJvd0l0ZW0sXG4gIElUYWJsZVJvd0l0ZW1WYWx1ZSxcbiAgSVRhYmxlUm93SXRlbVZhbHVlVHlwZXMsXG4gIFRhYmxlQ29sdW1uRGVmXG59IGZyb20gJy4uL2ludGVyZmFjZXMvaW5kZXgnO1xuaW1wb3J0IHsgQ2hlY2tib3hDaGFuZ2VFdmVudCB9IGZyb20gJy4uLy4uL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgVGFibGVUaGVtZUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcnMnO1xuaW1wb3J0IHsgQ29tcG9uZW50VGhlbWUgfSBmcm9tICcuLi8uLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBCcmFuZGVkRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vYnJhbmRpbmcnO1xuaW1wb3J0IHsgUGFnaW5hdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3BhZ2luYXRpb24nO1xuaW1wb3J0IHsgVGFibGVCdWxrQWN0aW9uc0NvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMnO1xuXG4vKipcbiAqIFRoZSBgVGFibGVDb21wb25lbnRgIChgPGltcGRjLXRhYmxlYCkgaXMgYSBkYXRhIHRhYmxlIGNvbXBvbmVudC5cbiAqIFRvIHVzZSwgaW1wb3J0IGBUYWJsZU1vZHVsZWAgZnJvbSBgQGltcGFydG5lci9kZXNpZ24tY29tcG9uZW50c2AuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ltcGRjLXRhYmxlJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB0YWJsZSBkYXRhIGlzIGN1cnJlbnRseSBiZWluZyBsb2FkZWQuIFRoZSBgPGltcGRjLXNwaW5uZXI+YCB3aWxsIHNob3cgaWYgZGF0YSBpcyBsb2FkaW5nLlxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIGxvYWRpbmcgPSBmYWxzZTtcblxuICAvKipcbiAgICogVGhlIHZpc2libGUgY29sdW1ucyBvZiB0aGUgdGFibGUuICBFYWNoIGBJVGFibGVDb2x1bW5EZWZgIGRlZmluZXMgcHJvcGVydGllcyByZWdhcmRpbmcgdGhlIGRpc3BsYXksIGZvcm1hdHRpbmcgYW5kIGludGVyYWN0aW9uIG9mIHRoZSBjb2x1bW4ncyBjZWxscy5cbiAgICogQ29sdW1uL2NlbGwgY29sb3IgcHJlY2VkZW5jZSBpczpcbiAgICogMSkgYGZpZWxkQ29sb3JgIC0gYWxsb3dzIGFuIGBJVGFibGVDb2x1bW5EZWZgIHRvIGRlbGVnYXRlIHRoZSByZXNwb25zaWJpbGl0eSBvZiBjZWxsIGNvbG9yIHRvIGFuIGBJVGFibGVSb3dJdGVtYCBwcm9wZXJ0eS5cbiAgICogMikgYGNvbG9yR2V0dGVyYC0gYWxsb3dzIGFuIGBJVGFibGVDb2x1bW5EZWZgIHRvIGRlbGVnYXRlIHRoZSByZXNwb25zaWJpbGl0eSBvZiBjZWxsIGNvbG9yIHRvIGEgZnVuY3Rpb24gb2YgdGhlIGBJVGFibGVSb3dJdGVtYCBkZXRlcm1pbmVkIGJ5IHRoZSBkZXZlbG9wZXIuXG4gICAqIDMpIGBjb2xvcmAgLSBhIHByb3BlcnR5IG9mIGFuIGBJVGFibGVDb2x1bW5EZWZgLlxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIGNvbHVtbkRlZnM6IFRhYmxlQ29sdW1uRGVmW10gPSBbXTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgdGFibGUgaXMgc3RyaXBlZC5cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBzdHJpcGVkID0gdHJ1ZTtcblxuICAvKipcbiAgICogV2hldGhlciBpbmRpdmlkdWFsIHJvd3MgY2FuIGJlIHNlbGVjdGVkLiBXaWxsIGJlIGB0cnVlYCBpZiBleHBsaWNpdGx5IHNldCB0byBgdHJ1ZWAgb3IgYGNhblNlbGVjdEFsbFJvd3NgIGlzIGB0cnVlYC5cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBzZXQgY2FuU2VsZWN0Um93cyh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2NhblNlbGVjdFJvd3MgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNhblNlbGVjdFJvd3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2FuU2VsZWN0QWxsUm93cyB8fCB0aGlzLl9jYW5TZWxlY3RSb3dzIHx8ICEhdGhpcy5idWxrQWN0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGFsbCByb3dzIGNhbiBiZSBzZWxlY3RlZCBhdCBvbmNlLiBXaWxsIGJlIGB0cnVlYCBpZiBleHBsaWNpdGx5IHNldCB0byBgdHJ1ZWAgb3IgaWYgYFRhYmxlQnVsa0FjdGlvbnNDb21wb25lbnRgIGlzIGNvbnRlbnQgcHJvamVjdGVkLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBjYW5TZWxlY3RBbGxSb3dzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fY2FuU2VsZWN0QWxsUm93cyA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBjYW5TZWxlY3RBbGxSb3dzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9jYW5TZWxlY3RBbGxSb3dzIHx8ICEhdGhpcy5idWxrQWN0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcGxhY2Vob2xkZXIgdGV4dCBhbmQgZW1wdHkgdmFsdWUgZGlzcGxheSB0ZXh0IGZvciBgPGltcGRjLXNlbGVjdD5gIGluc3RhbmNlcyBpbiBjZWxscyB3aXRoIGEgYElUYWJsZUNvbHVtbkRlZmAgYGNvbHVtblR5cGVgID0gYFNpbmdsZVNlbGVjdGAgb3IgYE11bHRpU2VsZWN0YC5cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBzZWxlY3RQbGFjZWhvbGRlciA9ICcnO1xuXG4gIC8qKlxuICAgKiBUaGUgYGNvbHVtbkRlZnNgIGluZGV4IG9mIHRoZSBjdXJyZW50bHkgc29ydGVkIGNvbHVtbi5cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBzb3J0Q29sdW1uSW5kZXggPSBTT1JUX0NPTFVNTl9JTkRFWDtcblxuICAvKipcbiAgICogVGhlIGRpcmVjdGlvbiBvZiB0aGUgY3VycmVudGx5IHNvcnRlZCBjb2x1bW4uXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgc29ydERpcmVjdGlvbjogJ2FzYycgfCAnZGVzYycgPSAnYXNjJztcblxuICAvKipcbiAgICogVGhlIHRhYmxlIHJvdyBkYXRhIGFzIGFuIGFycmF5IG9mIGBJVGFibGVSb3dJdGVtYC5cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyB0YWJsZURhdGE6IElUYWJsZVJvd0l0ZW1bXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBjdXJyZW50bHkgc2VsZWN0ZWQgSURzIGZyb20gdGhlIGB0YWJsZURhdGFgIGlucHV0LiAgQXJyYXkgbXVzdCBiZSBvZiB0eXBlIGAoc3RyaW5nIHwgbnVtYmVyKVtdYC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgc2VsZWN0ZWRSb3dJZHModmFsdWU6IChzdHJpbmcgfCBudW1iZXIpW10pIHtcbiAgICB0aGlzLl9zZWxlY3RlZFJvd0lkcyA9IFsuLi52YWx1ZV07XG4gIH1cbiAgcHVibGljIGdldCBzZWxlY3RlZFJvd0lkcygpOiAoc3RyaW5nIHwgbnVtYmVyKVtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuX3NlbGVjdGVkUm93SWRzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gY2VsbCByZW5kZXJlciBjb21wb25lbnRzIGF2YWlsYWJsZSB0byBiZSB1c2VkIGluIHRoZSB0YWJsZSBpbnN0YW5jZS5cbiAgICogRm9yIGEgZ2l2ZW4gYElUYWJsZUNvbHVtbkRlZmAgaW4gdGhlIGBjb2x1bW5EZWZzYCBpbnB1dCwgdGhlIGBjZWxsUmVuZGVyZXJDb21wb25lbnRgIHByb3BlcnR5IHNob3VsZCBiZSBzZXQgdG8gdGhlIGtleSBvZiB0aGUgcmVnaXN0ZXJlZCBjb21wb25lbnQgaW4gdGhpcyBpbnB1dC5cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBjdXN0b21DZWxsQ29tcG9uZW50cz86IElDdXN0b21DZWxsUmVuZGVyZXJDb21wb25lbnRzO1xuXG4gIC8qKlxuICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gb25lIG9yIG11bHRpcGxlIHJvd3MgYXJlIHNlbGVjdGVkLiBFbWl0cyBgKHN0cmluZyB8IG51bWJlcilbXWAgcGF5bG9hZC5cbiAgICovXG4gIEBPdXRwdXQoKSBwdWJsaWMgcmVhZG9ubHkgcm93U2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjwoc3RyaW5nIHwgbnVtYmVyKVtdPigpO1xuXG4gIC8qKlxuICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gYSBjb2x1bW4gaXMgc29ydGVkLiBFbWl0cyBgSVNvcnRCeVBheWxvYWRgIHBheWxvYWQuXG4gICAqL1xuICBAT3V0cHV0KCkgcHVibGljIHJlYWRvbmx5IHNvcnRCeSA9IG5ldyBFdmVudEVtaXR0ZXI8SVNvcnRCeVBheWxvYWQ+KCk7XG5cbiAgLyoqXG4gICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiBhIHJvdyBsaW5rIGlzIGNsaWNrZWQuIEVtaXRzIGBJVGFibGVFdmVudFBheWxvYWRgIHBheWxvYWQuXG4gICAqL1xuICBAT3V0cHV0KCkgcHVibGljIHJlYWRvbmx5IGxpbmtDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8SVRhYmxlRXZlbnRQYXlsb2FkPigpO1xuXG4gIC8qKlxuICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gYSByb3cgYWN0aW9uIGlzIGNsaWNrZWQuIEVtaXRzIGFuIGBJVGFibGVSb3dBY3Rpb25QYXlsb2FkYCBwYXlsb2FkLlxuICAgKi9cbiAgQE91dHB1dCgpIHB1YmxpYyByZWFkb25seSByb3dBY3Rpb25DbGljayA9XG4gICAgbmV3IEV2ZW50RW1pdHRlcjxJVGFibGVSb3dBY3Rpb25QYXlsb2FkPigpO1xuXG4gIC8qKiBAaWdub3JlICovXG4gIEBDb250ZW50Q2hpbGQoUGFnaW5hdGlvbkNvbXBvbmVudClcbiAgcHVibGljIHBhZ2luYXRpb25Db21wb25lbnQ/OiBQYWdpbmF0aW9uQ29tcG9uZW50ID0gdW5kZWZpbmVkO1xuXG4gIC8qKiBAaWdub3JlICovXG4gIEBDb250ZW50Q2hpbGQoVGFibGVCdWxrQWN0aW9uc0NvbXBvbmVudClcbiAgcHVibGljIGJ1bGtBY3Rpb25zPzogVGFibGVCdWxrQWN0aW9uc0NvbXBvbmVudCA9IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogRXZlbnQgZW1pdHRlZCB3aGVuIGEgcm93IGlucHV0IHZhbHVlIGlzIGNoYW5nZWQuIEVtaXR0ZWQgY2VsbHMgb2YgYGNvbHVtblR5cGVgIGBTaW5nbFNlbGVjdGAsIGBNdWx0aVNlbGVjdGAsIGBJbnB1dGAsIGBCb29sZWFuYCBvciBgSWNvbmAuXG4gICAqIE5vdCBlbWl0dGVkIGlmIGNvbHVtbiBkZWZpbml0aW9uIHByb3BlcnR5IGBkaXNhYmxlZGAgPSBgdHJ1ZWAuIEVtaXRzIGBJVGFibGVFdmVudFBheWxvYWRgIHBheWxvYWQuXG4gICAqL1xuICBAT3V0cHV0KCkgcHVibGljIHJlYWRvbmx5IGlucHV0Q2hhbmdlID1cbiAgICBuZXcgRXZlbnRFbWl0dGVyPElUYWJsZUV2ZW50UGF5bG9hZD4oKTtcblxuICAvKiogQGlnbm9yZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2VsbFR5cGUgPSBUYWJsZUNvbHVtblR5cGU7XG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyBhbGxTZWxlY3RlZCA9IHRydWU7XG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyBnZXQgc29tZVNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAhIXRoaXMuX3NlbGVjdGVkUm93SWRzICYmXG4gICAgICB0aGlzLl9zZWxlY3RlZFJvd0lkcy5sZW5ndGggPiAwICYmXG4gICAgICAhIXRoaXMudGFibGVEYXRhICYmXG4gICAgICB0aGlzLnRhYmxlRGF0YS5sZW5ndGggPiAwICYmXG4gICAgICB0aGlzLl9zZWxlY3RlZFJvd0lkcy5sZW5ndGggPCB0aGlzLnRhYmxlRGF0YS5sZW5ndGhcbiAgICApO1xuICB9XG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyByZWFkb25seSBicmFuZGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIGdldCB0YWJsZVNwYW4oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jYW5TZWxlY3RSb3dzXG4gICAgICA/IHRoaXMuY29sdW1uRGVmcy5sZW5ndGggKyAxXG4gICAgICA6IHRoaXMuY29sdW1uRGVmcy5sZW5ndGg7XG4gIH1cblxuICBwcml2YXRlIF9jYW5TZWxlY3RSb3dzID0gZmFsc2U7XG4gIHByaXZhdGUgX2NhblNlbGVjdEFsbFJvd3MgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc2VsZWN0ZWRSb3dJZHM6IChzdHJpbmcgfCBudW1iZXIpW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBfaW5wdXRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPElUYWJsZUV2ZW50UGF5bG9hZD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kYXRlUGlwZTogRGF0ZVBpcGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcGVyY2VudFBpcGU6IFBlcmNlbnRQaXBlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2RlY21pYWxQaXBlOiBEZWNpbWFsUGlwZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQE9wdGlvbmFsKCkgQEhvc3QoKSBwcml2YXRlIF9icmFuZGVkOiBCcmFuZGVkRGlyZWN0aXZlXG4gICkge1xuICAgIHRoaXMuYnJhbmRlZCA9IF9icmFuZGVkID8gdHJ1ZSA6IGZhbHNlO1xuICAgIHRoaXMuX2lucHV0Q2hhbmdlXG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoREVCT1VOQ0VfVElNRSkpXG4gICAgICAuc3Vic2NyaWJlKHRoaXMuaW5wdXRDaGFuZ2UpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZFJvd0lkcyddIHx8IGNoYW5nZXNbJ3RhYmxlRGF0YSddKSB7XG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLnRhYmxlRGF0YSB8fFxuICAgICAgICAhdGhpcy50YWJsZURhdGEubGVuZ3RoIHx8XG4gICAgICAgICF0aGlzLnNlbGVjdGVkUm93SWRzIHx8XG4gICAgICAgICF0aGlzLnNlbGVjdGVkUm93SWRzLmxlbmd0aFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuYWxsU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYWxsU2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkUm93SWRzLmxlbmd0aCA+PSB0aGlzLnRhYmxlRGF0YS5sZW5ndGg7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldE1haWxUb1ZhbHVlKFxuICAgIGNvbHVtbkluZGV4OiBudW1iZXIsXG4gICAgY3VycmVudFJvdzogSVRhYmxlUm93SXRlbVxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgY29sdW1uVHlwZSwgdHJ1bmNhdGVkOiB0cnVuY2F0ZWQgfSA9XG4gICAgICB0aGlzLl9nZXRDb2x1bW5EZWZCeUluZGV4KGNvbHVtbkluZGV4KTtcbiAgICBsZXQgdmFsdWUgPSB0aGlzLl9nZXRWYWx1ZShjb2x1bW5JbmRleCwgY3VycmVudFJvdyk7XG5cbiAgICBpZiAoY29sdW1uVHlwZSAhPT0gVGFibGVDb2x1bW5UeXBlLkVtYWlsKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgICB9XG4gICAgdmFsdWUgPSB2YWx1ZSA/IGBtYWlsdG86JHt2YWx1ZX1gIDogdmFsdWU7XG5cbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdHJpbmdWYWx1ZShcbiAgICBjb2x1bW5JbmRleDogbnVtYmVyLFxuICAgIGN1cnJlbnRSb3c6IElUYWJsZVJvd0l0ZW1cbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoY29sdW1uSW5kZXgsIGN1cnJlbnRSb3cpO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUuam9pbignOycpO1xuICAgIH1cblxuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGdldFZhbHVlKFxuICAgIGNvbHVtbkluZGV4OiBudW1iZXIsXG4gICAgY3VycmVudFJvdzogSVRhYmxlUm93SXRlbVxuICApOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgY29uc3QgeyBjb2x1bW5UeXBlLCB0cnVuY2F0ZWQ6IHRydW5jYXRlZCB9ID1cbiAgICAgIHRoaXMuX2dldENvbHVtbkRlZkJ5SW5kZXgoY29sdW1uSW5kZXgpO1xuICAgIGxldCB2YWx1ZSA9IHRoaXMuX2dldFZhbHVlKGNvbHVtbkluZGV4LCBjdXJyZW50Um93KTtcblxuICAgIHN3aXRjaCAoY29sdW1uVHlwZSkge1xuICAgICAgY2FzZSBUYWJsZUNvbHVtblR5cGUuRGVjaW1hbDoge1xuICAgICAgICB2YWx1ZSA9IHRoaXMuX2RlY21pYWxQaXBlLnRyYW5zZm9ybShOdW1iZXIodmFsdWUpIHx8IDApIHx8ICcnO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgVGFibGVDb2x1bW5UeXBlLkRhdGU6IHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICBjb25zdCB2YWxpZERhdGUgPSBkYXRlIGluc3RhbmNlb2YgRGF0ZSAmJiAhaXNOYU4oZGF0ZS5nZXRUaW1lKCkpO1xuICAgICAgICB2YWx1ZSA9IHZhbGlkRGF0ZVxuICAgICAgICAgID8gdGhpcy5fZGF0ZVBpcGUudHJhbnNmb3JtKGRhdGUsICdNTS9kZC95eXl5JykgfHwgJydcbiAgICAgICAgICA6IFN0cmluZyh2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBUYWJsZUNvbHVtblR5cGUuRGF0ZVRpbWU6IHtcbiAgICAgICAgY29uc3QgZGF0ZVRpbWUgPSBuZXcgRGF0ZShTdHJpbmcodmFsdWUpKTtcbiAgICAgICAgY29uc3QgdmFsaWREYXRlVGltZSA9XG4gICAgICAgICAgZGF0ZVRpbWUgaW5zdGFuY2VvZiBEYXRlICYmICFpc05hTihkYXRlVGltZS5nZXRUaW1lKCkpO1xuICAgICAgICB2YWx1ZSA9IHZhbGlkRGF0ZVRpbWVcbiAgICAgICAgICA/IHRoaXMuX2RhdGVQaXBlLnRyYW5zZm9ybShkYXRlVGltZSwgJ01NL2RkL3l5eXkgaDptbTpzcyBhJykgfHwgJydcbiAgICAgICAgICA6IFN0cmluZyh2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBUYWJsZUNvbHVtblR5cGUuTGluazoge1xuICAgICAgICB2YWx1ZSA9IFN0cmluZyh2YWx1ZSkucmVwbGFjZSgvKF5cXHcrOnxeKVxcL1xcLy8sICcnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFRhYmxlQ29sdW1uVHlwZS5QZXJjZW50YWdlOiB7XG4gICAgICAgIHZhbHVlID0gdGhpcy5fcGVyY2VudFBpcGUudHJhbnNmb3JtKE51bWJlcih2YWx1ZSkgfHwgMCkgfHwgJyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBUYWJsZUNvbHVtblR5cGUuVXJsOiB7XG4gICAgICAgIGlmICghLyhodHRwKHM/KSk6XFwvXFwvL2kudGVzdChTdHJpbmcodmFsdWUpKSkge1xuICAgICAgICAgIHZhbHVlID0gYGh0dHBzOi8vJHt2YWx1ZX1gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBUYWJsZUNvbHVtblR5cGUuVGV4dDoge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmpvaW4oJzsgJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRydW5jYXRlZCkge1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRydW5jYXRlU3RyaW5nID0gKHN0cmluZyA9ICcnLCBtYXhMZW5ndGggPSB0cnVuY2F0ZWQpID0+XG4gICAgICAgICAgc3RyaW5nLmxlbmd0aCA+IG1heExlbmd0aFxuICAgICAgICAgICAgPyBgJHtzdHJpbmcuc3Vic3RyaW5nKDAsIG1heExlbmd0aCl94oCmYFxuICAgICAgICAgICAgOiBzdHJpbmc7XG5cbiAgICAgICAgISF0cnVuY2F0ZWRcbiAgICAgICAgICA/ICh2YWx1ZSA9IHRydW5jYXRlU3RyaW5nKFN0cmluZyh2YWx1ZSksIHRydW5jYXRlZCkpXG4gICAgICAgICAgOiB2YWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFRhYmxlQ29sdW1uVHlwZS5NdWx0aVNlbGVjdDpcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnNwbGl0KCc7Jyk/Lm1hcCh2ID0+IHYudHJpbSgpKSB8fCBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UmF3VmFsdWUoXG4gICAgY29sdW1uSW5kZXg6IG51bWJlcixcbiAgICBjdXJyZW50Um93OiBJVGFibGVSb3dJdGVtXG4gICk6IElUYWJsZVJvd0l0ZW1WYWx1ZVR5cGVzPElUYWJsZVJvd0l0ZW1WYWx1ZT4ge1xuICAgIGNvbnN0IHsgZmllbGQgfSA9IHRoaXMuX2dldENvbHVtbkRlZkJ5SW5kZXgoY29sdW1uSW5kZXgpO1xuXG4gICAgaWYgKCFmaWVsZCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50Um93W2ZpZWxkXSB8fCAnJztcbiAgfVxuXG4gIHB1YmxpYyBnZXRDZWxsQ29sb3IoXG4gICAgY29sdW1uRGVmaW5pdGlvbjogVGFibGVDb2x1bW5EZWYsXG4gICAgaXRlbTogSVRhYmxlUm93SXRlbVxuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBUYWJsZVRoZW1lSGVscGVyLmdldENlbGxDb2xvcihjb2x1bW5EZWZpbml0aW9uLCBpdGVtKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUaGVtZShcbiAgICBjb2x1bW5EZWZpbml0aW9uOiBUYWJsZUNvbHVtbkRlZixcbiAgICBpdGVtOiBJVGFibGVSb3dJdGVtXG4gICk6IENvbXBvbmVudFRoZW1lIHtcbiAgICByZXR1cm4gKFxuICAgICAgVGFibGVUaGVtZUhlbHBlci5nZXRUaGVtZShjb2x1bW5EZWZpbml0aW9uLCBpdGVtKSB8fFxuICAgICAgQ29tcG9uZW50VGhlbWUuUHJpbWFyeVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgaXNTb3J0ZWRDb2x1bW4oY29sdW1uSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjb2x1bW5JbmRleCA9PT0gdGhpcy5zb3J0Q29sdW1uSW5kZXg7XG4gIH1cblxuICBwdWJsaWMgaXNSb3dTZWxlY3RlZChpZDogc3RyaW5nIHwgbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRSb3dJZHMuaW5jbHVkZXMoaWQpO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZVNlbGVjdEFsbChldmVudDogQ2hlY2tib3hDaGFuZ2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5TZWxlY3RBbGxSb3dzIHx8ICF0aGlzLnRhYmxlRGF0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudC5jaGVja2VkKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZFJvd0lkcyA9IHRoaXMudGFibGVEYXRhPy5tYXAocm93ID0+IHJvdy5pZCkgfHwgW107XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3NlbGVjdGVkUm93SWRzID0gW107XG4gICAgfVxuXG4gICAgdGhpcy5fc2VsZWN0ZWRSb3dJZHMuc29ydCgpO1xuICAgIHRoaXMuYWxsU2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkUm93SWRzLmxlbmd0aCA+PSB0aGlzLnRhYmxlRGF0YS5sZW5ndGg7XG5cbiAgICB0aGlzLnJvd1NlbGVjdC5lbWl0KHRoaXMuc2VsZWN0ZWRSb3dJZHMpO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZVNvcnQoY29sdW1uSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChjb2x1bW5JbmRleCA9PT0gdGhpcy5zb3J0Q29sdW1uSW5kZXgpIHtcbiAgICAgIHRoaXMuc29ydERpcmVjdGlvbiA9IHRoaXMuc29ydERpcmVjdGlvbiA9PT0gJ2FzYycgPyAnZGVzYycgOiAnYXNjJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zb3J0Q29sdW1uSW5kZXggPSBjb2x1bW5JbmRleDtcbiAgICAgIHRoaXMuc29ydERpcmVjdGlvbiA9ICdhc2MnO1xuICAgIH1cblxuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5fZ2V0Q29sdW1uRGVmQnlJbmRleChjb2x1bW5JbmRleCkuZmllbGQgfHwgJyc7XG5cbiAgICB0aGlzLnNvcnRCeS5lbWl0KHtcbiAgICAgIGNvbHVtbkluZGV4LFxuICAgICAgZmllbGQsXG4gICAgICBkaXJlY3Rpb246IHRoaXMuc29ydERpcmVjdGlvblxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZVJvd1NlbGVjdChcbiAgICBldmVudDogQ2hlY2tib3hDaGFuZ2VFdmVudCxcbiAgICByb3dJZDogbnVtYmVyIHwgc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5TZWxlY3RSb3dzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LmNoZWNrZWQgJiYgIXRoaXMuX3NlbGVjdGVkUm93SWRzLmluY2x1ZGVzKHJvd0lkKSkge1xuICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dJZHMucHVzaChyb3dJZCk7XG4gICAgfSBlbHNlIGlmICghZXZlbnQuY2hlY2tlZCAmJiB0aGlzLl9zZWxlY3RlZFJvd0lkcy5pbmNsdWRlcyhyb3dJZCkpIHtcbiAgICAgIGNvbnN0IGlkeCA9IHRoaXMuX3NlbGVjdGVkUm93SWRzLmluZGV4T2Yocm93SWQpO1xuICAgICAgaWYgKGlkeCA+IC0xKSB7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkUm93SWRzLnNwbGljZShpZHgsIDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9zZWxlY3RlZFJvd0lkcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGVkUm93SWRzLnNvcnQoKTtcbiAgICB9XG5cbiAgICB0aGlzLmFsbFNlbGVjdGVkID0gdGhpcy5zZWxlY3RlZFJvd0lkcy5sZW5ndGggPj0gdGhpcy50YWJsZURhdGEubGVuZ3RoO1xuICAgIHRoaXMucm93U2VsZWN0LmVtaXQodGhpcy5zZWxlY3RlZFJvd0lkcyk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlQ2VsbFZhbHVlQ2hhbmdlKFxuICAgIGNvbHVtbkluZGV4OiBudW1iZXIsXG4gICAgcm93SW5kZXg6IG51bWJlcixcbiAgICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IHN0cmluZ1tdXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHsgZmllbGQsIGNvbHVtblR5cGUgfSA9IHRoaXMuX2dldENvbHVtbkRlZkJ5SW5kZXgoY29sdW1uSW5kZXgpO1xuICAgIGxldCBjdXJyZW50VmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBzdHJpbmdbXSA9IHZhbHVlO1xuXG4gICAgaWYgKGNvbHVtblR5cGUgIT09IFRhYmxlQ29sdW1uVHlwZS5Cb29sZWFuICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgY3VycmVudFZhbHVlID0gaXNOYU4oTnVtYmVyKHZhbHVlKSkgPyB2YWx1ZSA6IE51bWJlcih2YWx1ZSk7XG4gICAgfVxuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLnRhYmxlRGF0YVtyb3dJbmRleF07XG5cbiAgICBzZXROZXN0ZWRWYWx1ZShpdGVtLCBTdHJpbmcoZmllbGQpLCBjdXJyZW50VmFsdWUpO1xuXG4gICAgdGhpcy5faW5wdXRDaGFuZ2UuZW1pdCh7XG4gICAgICBjb2x1bW5JbmRleCxcbiAgICAgIGl0ZW0sXG4gICAgICB2YWx1ZTogY3VycmVudFZhbHVlXG4gICAgfSk7XG5cbiAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlTGlua0NsaWNrKGNvbHVtbkluZGV4OiBudW1iZXIsIGl0ZW06IElUYWJsZVJvd0l0ZW0pOiB2b2lkIHtcbiAgICB0aGlzLmxpbmtDbGljay5lbWl0KHtcbiAgICAgIGl0ZW0sXG4gICAgICBjb2x1bW5JbmRleFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZUFjdGlvbkNsaWNrKFxuICAgIGNvbHVtbkluZGV4OiBudW1iZXIsXG4gICAgaXRlbTogSVRhYmxlUm93SXRlbSxcbiAgICBhY3Rpb25BcGlOYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgdGhpcy5yb3dBY3Rpb25DbGljay5lbWl0KHtcbiAgICAgIGl0ZW0sXG4gICAgICBjb2x1bW5JbmRleCxcbiAgICAgIGFjdGlvbkFwaU5hbWVcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb2x1bW5EZWZJc0FjdGlvbnMoXG4gICAgY29sdW1uRGVmOiBUYWJsZUNvbHVtbkRlZjxhbnk+XG4gICk6IGNvbHVtbkRlZiBpcyBJVGFibGVBY3Rpb25zQ29sdW1uRGVmPGFueT4ge1xuICAgIHJldHVybiBjb2x1bW5EZWYuY29sdW1uVHlwZSA9PT0gVGFibGVDb2x1bW5UeXBlLkFjdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIF9nZXRDb2x1bW5EZWZCeUluZGV4KGNvbHVtbkluZGV4OiBudW1iZXIpOiBUYWJsZUNvbHVtbkRlZiB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1uRGVmc1tjb2x1bW5JbmRleF07XG4gIH1cblxuICBwcml2YXRlIF9nZXRWYWx1ZShcbiAgICBjb2x1bW5JbmRleDogbnVtYmVyLFxuICAgIGN1cnJlbnRSb3c6IElUYWJsZVJvd0l0ZW1cbiAgKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGZpZWxkLCB2YWx1ZUdldHRlciB9ID0gdGhpcy5fZ2V0Q29sdW1uRGVmQnlJbmRleChjb2x1bW5JbmRleCk7XG5cbiAgICAgIGNvbnN0IHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSA9IHZhbHVlR2V0dGVyXG4gICAgICAgID8gdmFsdWVHZXR0ZXIoY3VycmVudFJvdylcbiAgICAgICAgOiAoZ2V0TmVzdGVkVmFsdWUoY3VycmVudFJvdywgU3RyaW5nKGZpZWxkKSwgJycpIGFzIHN0cmluZyB8IHN0cmluZ1tdKTtcblxuICAgICAgcmV0dXJuIHZhbHVlIHx8ICcnO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cbn1cbiIsIkBpZiAodGFibGVEYXRhKSB7XG48dGFibGUgaW1wZGNUYWJsZSBbc3RyaXBlZF09XCJzdHJpcGVkXCI+XG4gIDx0aGVhZD5cbiAgICBAaWYgKCEhYnVsa0FjdGlvbnMpIHtcbiAgICA8dHI+XG4gICAgICA8dGggW2F0dHIuY29sc3Bhbl09XCJ0YWJsZVNwYW5cIiBzY29wZT1cImNvbFwiIGNsYXNzPVwiYnVsay1hY3Rpb24tY29sdW1uXCI+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImltcGRjLXRhYmxlLWJ1bGstYWN0aW9uc1wiPjwvbmctY29udGVudD5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2ltcGRjVGFibGVCdWxrQWN0aW9uc11cIj48L25nLWNvbnRlbnQ+XG4gICAgICA8L3RoPlxuICAgIDwvdHI+XG4gICAgfVxuICAgIDx0cj5cbiAgICAgIEBpZiAoY2FuU2VsZWN0Um93cykge1xuICAgICAgPHRoXG4gICAgICAgIHNjb3BlPVwiY29sXCJcbiAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICdoZWFkaW5nLWJlbG93LWJ1bGstYWN0aW9ucyc6ICEhYnVsa0FjdGlvbnNcbiAgICAgICAgfVwiPlxuICAgICAgICBAaWYgKGNhblNlbGVjdEFsbFJvd3MpIHtcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8aW1wZGMtY2hlY2tib3hcbiAgICAgICAgICAgIG5nTW9kZWxcbiAgICAgICAgICAgIFtjaGVja2VkXT1cImFsbFNlbGVjdGVkXCJcbiAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cInNvbWVTZWxlY3RlZFwiXG4gICAgICAgICAgICAoY2hhbmdlKT1cImhhbmRsZVNlbGVjdEFsbCgkZXZlbnQpXCI+PC9pbXBkYy1jaGVja2JveD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvdGg+XG4gICAgICB9IEBmb3IgKGNvbHVtbkRlZiBvZiBjb2x1bW5EZWZzOyB0cmFjayBjb2x1bW5EZWY7IGxldCBjb2x1bW5JbmRleCA9XG4gICAgICAkaW5kZXgpIHtcbiAgICAgIDx0aFxuICAgICAgICBzY29wZT1cImNvbFwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAnc29ydGVkLWNvbHVtbic6IGlzU29ydGVkQ29sdW1uKGNvbHVtbkluZGV4KSxcbiAgICAgICAgICAnc29ydGFibGUtY29sdW1uJzogY29sdW1uRGVmLnNvcnRlZCxcbiAgICAgICAgICAnaGVhZGluZy1iZWxvdy1idWxrLWFjdGlvbnMnOiAhIWJ1bGtBY3Rpb25zXG4gICAgICAgIH1cIlxuICAgICAgICAoY2xpY2spPVwiaGFuZGxlU29ydChjb2x1bW5JbmRleClcIj5cbiAgICAgICAgPGltcGRjLWNvbHVtbi1oZWFkaW5nXG4gICAgICAgICAgW2lzU29ydGFibGVdPVwiY29sdW1uRGVmLnNvcnRlZCB8fCBmYWxzZVwiXG4gICAgICAgICAgW2NvbHVtbkluZGV4XT1cImNvbHVtbkluZGV4XCJcbiAgICAgICAgICBbc29ydENvbHVtbkluZGV4XT1cInNvcnRDb2x1bW5JbmRleFwiXG4gICAgICAgICAgW2RpcmVjdGlvbl09XCJzb3J0RGlyZWN0aW9uXCJcbiAgICAgICAgICBbdGV4dF09XCJjb2x1bW5EZWYudGl0bGVcIlxuICAgICAgICAgIChzb3J0KT1cImhhbmRsZVNvcnQoJGV2ZW50KVwiPlxuICAgICAgICA8L2ltcGRjLWNvbHVtbi1oZWFkaW5nPlxuICAgICAgPC90aD5cbiAgICAgIH1cbiAgICA8L3RyPlxuICA8L3RoZWFkPlxuICA8dGJvZHk+XG4gICAgQGlmIChsb2FkaW5nKSB7XG4gICAgPHRyPlxuICAgICAgPHRkIFthdHRyLmNvbHNwYW5dPVwidGFibGVTcGFuXCIgY2xhc3M9XCJkYXRhLWxvYWRpbmdcIj5cbiAgICAgICAgPGltcGRjLXNwaW5uZXI+PC9pbXBkYy1zcGlubmVyPlxuICAgICAgPC90ZD5cbiAgICA8L3RyPlxuICAgIH0gQGVsc2UgeyBAZm9yIChyb3cgb2YgdGFibGVEYXRhOyB0cmFjayByb3c7IGxldCByb3dJbmRleCA9ICRpbmRleCkge1xuICAgIDx0cj5cbiAgICAgIEBpZiAoY2FuU2VsZWN0Um93cykge1xuICAgICAgPHRkPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0LWNvbHVtblwiPlxuICAgICAgICAgIDxpbXBkYy1jaGVja2JveFxuICAgICAgICAgICAgW25nTW9kZWxdPVwiaXNSb3dTZWxlY3RlZChyb3cuaWQpXCJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlUm93U2VsZWN0KCRldmVudCwgcm93LmlkKVwiPjwvaW1wZGMtY2hlY2tib3g+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC90ZD5cbiAgICAgIH1cbiAgICAgIDx0ZFxuICAgICAgICAqbmdGb3I9XCJsZXQgY29sdW1uRGVmIG9mIGNvbHVtbkRlZnM7IGluZGV4IGFzIGNvbEluZGV4OyBsYXN0IGFzIGlzTGFzdFwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAnY29sLW5vLXBhZGRpbmcnOiAhIWNvbHVtbkRlZi5ub1BhZGRpbmcsXG4gICAgICAgICAgJ2FjdGlvbnMtY29sdW1uJzogY29sdW1uRGVmLmNvbHVtblR5cGUgPT09IGNlbGxUeXBlLkFjdGlvbnNcbiAgICAgICAgfVwiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIEBzd2l0Y2ggKGNvbHVtbkRlZi5jb2x1bW5UeXBlKSB7IEBjYXNlIChjZWxsVHlwZS5CYWRnZSkge1xuICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgPGltcGRjLWJhZGdlXG4gICAgICAgICAgICAgIFt0ZXh0XT1cImdldFN0cmluZ1ZhbHVlKGNvbEluZGV4LCByb3cpXCJcbiAgICAgICAgICAgICAgW3RoZW1lXT1cImdldFRoZW1lKGNvbHVtbkRlZiwgcm93KVwiPlxuICAgICAgICAgICAgPC9pbXBkYy1iYWRnZT5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgfSBAY2FzZSAoY2VsbFR5cGUuTGluaykge1xuICAgICAgICAgIDxzcGFuIChjbGljayk9XCJoYW5kbGVMaW5rQ2xpY2soY29sSW5kZXgsIHJvdylcIj5cbiAgICAgICAgICAgIEBpZiAoIWJyYW5kZWQpIHtcbiAgICAgICAgICAgIDxhPlxuICAgICAgICAgICAgICB7eyBnZXRWYWx1ZShjb2xJbmRleCwgcm93KSB9fVxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8YSBpbXBkY0JyYW5kZWQ+XG4gICAgICAgICAgICAgIHt7IGdldFZhbHVlKGNvbEluZGV4LCByb3cpIH19XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIH0gQGNhc2UgKGNlbGxUeXBlLlVybCkge1xuICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgQGlmICghYnJhbmRlZCkge1xuICAgICAgICAgICAgPGEgdGFyZ2V0PVwiX2JsYW5rXCIgW2F0dHIuaHJlZl09XCJnZXRWYWx1ZShjb2xJbmRleCwgcm93KVwiPlxuICAgICAgICAgICAgICB7eyBnZXRWYWx1ZShjb2xJbmRleCwgcm93KSB9fVxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8YVxuICAgICAgICAgICAgICBpbXBkY0JyYW5kZWRcbiAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgW2F0dHIuaHJlZl09XCJnZXRWYWx1ZShjb2xJbmRleCwgcm93KVwiPlxuICAgICAgICAgICAgICB7eyBnZXRWYWx1ZShjb2xJbmRleCwgcm93KSB9fVxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICB9IEBjYXNlIChjZWxsVHlwZS5FbWFpbCkge1xuICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgQGlmICghYnJhbmRlZCkge1xuICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgW2F0dHIuaHJlZl09XCInbWFpbHRvOicgKyBnZXRWYWx1ZShjb2xJbmRleCwgcm93KVwiPlxuICAgICAgICAgICAgICB7eyBnZXRWYWx1ZShjb2xJbmRleCwgcm93KSB9fVxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8YSBpbXBkY0JyYW5kZWQgW2F0dHIuaHJlZl09XCJnZXRNYWlsVG9WYWx1ZShjb2xJbmRleCwgcm93KVwiPlxuICAgICAgICAgICAgICB7eyBnZXRWYWx1ZShjb2xJbmRleCwgcm93KSB9fVxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICB9IEBjYXNlIChjZWxsVHlwZS5JbnB1dCkge1xuICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIGltcGRjSW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBjbGFzcz1cInt7IGdldENlbGxDb2xvcihjb2x1bW5EZWYsIHJvdykgfX1cIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJnZXRWYWx1ZShjb2xJbmRleCwgcm93KVwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIlxuICAgICAgICAgICAgICAgIGhhbmRsZUNlbGxWYWx1ZUNoYW5nZShjb2xJbmRleCwgcm93SW5kZXgsICRldmVudClcbiAgICAgICAgICAgICAgXCIgLz5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgfSBAY2FzZSAoY2VsbFR5cGUuQm9vbGVhbikge1xuICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgQGlmIChjb2x1bW5EZWYuZGlzYWJsZWQgJiYgZ2V0VmFsdWUoY29sSW5kZXgsIHJvdykgPT09ICd0cnVlJykge1xuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgaW1wZGMtaWNvblxuICAgICAgICAgICAgICBuYW1lPVwiY2hlY2tcIlxuICAgICAgICAgICAgICBjbGFzcz1cInt7IGdldENlbGxDb2xvcihjb2x1bW5EZWYsIHJvdykgfX1cIj48L3NwYW4+XG4gICAgICAgICAgICB9IEBlbHNlIGlmICghY29sdW1uRGVmLmRpc2FibGVkKSB7XG4gICAgICAgICAgICA8aW1wZGMtY2hlY2tib3hcbiAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiZ2V0VmFsdWUoY29sSW5kZXgsIHJvdykgPT09ICd0cnVlJ1wiXG4gICAgICAgICAgICAgIFtpc1N3aXRjaF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJcbiAgICAgICAgICAgICAgICBoYW5kbGVDZWxsVmFsdWVDaGFuZ2UoY29sSW5kZXgsIHJvd0luZGV4LCAkZXZlbnQuY2hlY2tlZClcbiAgICAgICAgICAgICAgXCI+PC9pbXBkYy1jaGVja2JveD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgfSBAY2FzZSAoY2VsbFR5cGUuU2luZ2xlU2VsZWN0KSB7XG4gICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICA8aW1wZGMtc2VsZWN0XG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdldFZhbHVlKGNvbEluZGV4LCByb3cpXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbHVtbkRlZi5kaXNhYmxlZCB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJzZWxlY3RQbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiXG4gICAgICAgICAgICAgICAgaGFuZGxlQ2VsbFZhbHVlQ2hhbmdlKGNvbEluZGV4LCByb3dJbmRleCwgJGV2ZW50LnZhbHVlKVxuICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgQGlmIChzZWxlY3RQbGFjZWhvbGRlcikge1xuICAgICAgICAgICAgICA8aW1wZGMtc2VsZWN0LW9wdGlvbiB2YWx1ZSBbbGFiZWxdPVwic2VsZWN0UGxhY2Vob2xkZXJcIj5cbiAgICAgICAgICAgICAgPC9pbXBkYy1zZWxlY3Qtb3B0aW9uPlxuICAgICAgICAgICAgICB9IEBmb3IgKHZhbHVlIG9mIChjb2x1bW5EZWYudmFsdWVzIHx8IFtdKTsgdHJhY2sgdmFsdWUpIHtcbiAgICAgICAgICAgICAgPGltcGRjLXNlbGVjdC1vcHRpb25cbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwidmFsdWUudmFsdWVcIlxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJ2YWx1ZS5sYWJlbFwiPjwvaW1wZGMtc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9pbXBkYy1zZWxlY3Q+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIH0gQGNhc2UgKGNlbGxUeXBlLk11bHRpU2VsZWN0KSB7XG4gICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICA8aW1wZGMtc2VsZWN0XG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdldFZhbHVlKGNvbEluZGV4LCByb3cpXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbHVtbkRlZi5kaXNhYmxlZCB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJzZWxlY3RQbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgIG11bHRpcGxlPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiXG4gICAgICAgICAgICAgICAgaGFuZGxlQ2VsbFZhbHVlQ2hhbmdlKGNvbEluZGV4LCByb3dJbmRleCwgJGV2ZW50LnZhbHVlKVxuICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgQGZvciAodmFsdWUgb2YgKGNvbHVtbkRlZi52YWx1ZXMgfHwgW10pOyB0cmFjayB2YWx1ZSkge1xuICAgICAgICAgICAgICA8aW1wZGMtc2VsZWN0LW9wdGlvblxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZS52YWx1ZVwiXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cInZhbHVlLmxhYmVsXCI+PC9pbXBkYy1zZWxlY3Qtb3B0aW9uPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2ltcGRjLXNlbGVjdD5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgfSBAY2FzZSAoY2VsbFR5cGUuQ2VsbFJlbmRlcikge1xuICAgICAgICAgIDxzcGFuIGNsYXNzPVwie3sgZ2V0Q2VsbENvbG9yKGNvbHVtbkRlZiwgcm93KSB9fVwiPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgIGltcGRjVGFibGVJbmplY3RDb21wb25lbnRcbiAgICAgICAgICAgICAgW2NvbHVtbkRlZl09XCJjb2x1bW5EZWZcIlxuICAgICAgICAgICAgICBbcm93SXRlbV09XCJyb3dcIlxuICAgICAgICAgICAgICBbY3VzdG9tQ2VsbENvbXBvbmVudHNdPVwiY3VzdG9tQ2VsbENvbXBvbmVudHMgfHwge31cIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwiZ2V0UmF3VmFsdWUoY29sSW5kZXgsIHJvdylcIj48L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICB9IEBjYXNlIChjZWxsVHlwZS5JY29uKSB7XG4gICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBpbXBkYy1pY29uXG4gICAgICAgICAgICAgIFtuYW1lXT1cImNvbHVtbkRlZi5pY29uTmFtZVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwie3sgZ2V0Q2VsbENvbG9yKGNvbHVtbkRlZiwgcm93KSB9fVwiPjwvc3Bhbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgfSBAY2FzZSAoY2VsbFR5cGUuQWN0aW9ucykge1xuICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgPCEtLSB3aWxsIGFsd2F5cyByZXR1cm4gJ3RydWUnLCBidXQgbmVlZGVkIHRvIHNhdGlzZnkgdGhlIHR5cGUgZW5naW5lIC0tPlxuICAgICAgICAgICAgQGlmIChjb2x1bW5EZWZJc0FjdGlvbnMoY29sdW1uRGVmKSkge1xuICAgICAgICAgICAgPGltcGRjLXJvdy1hY3Rpb25zXG4gICAgICAgICAgICAgIFtjb2x1bW5EZWZdPVwiY29sdW1uRGVmXCJcbiAgICAgICAgICAgICAgW3Jvd0l0ZW1dPVwicm93XCJcbiAgICAgICAgICAgICAgW2xhc3RDb2x1bW5dPVwiaXNMYXN0XCJcbiAgICAgICAgICAgICAgKGFjdGlvbkNsaWNrKT1cIlxuICAgICAgICAgICAgICAgIGhhbmRsZUFjdGlvbkNsaWNrKGNvbEluZGV4LCByb3csICRldmVudClcbiAgICAgICAgICAgICAgXCI+PC9pbXBkYy1yb3ctYWN0aW9ucz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgfSBAZGVmYXVsdCB7XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ7eyBnZXRDZWxsQ29sb3IoY29sdW1uRGVmLCByb3cpIH19XCI+XG4gICAgICAgICAgICB7eyBnZXRWYWx1ZShjb2xJbmRleCwgcm93KSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICB9IH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3RkPlxuICAgIDwvdHI+XG4gICAgfSBAZW1wdHkge1xuICAgIDx0cj5cbiAgICAgIDx0ZCBbYXR0ci5jb2xzcGFuXT1cInRhYmxlU3BhblwiIGNsYXNzPVwibm8tZGF0YVwiPlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbbm9EYXRhXVwiPjwvbmctY29udGVudD5cbiAgICAgIDwvdGQ+XG4gICAgPC90cj5cbiAgICB9IH1cbiAgPC90Ym9keT5cbiAgPHRmb290PlxuICAgIEBpZiAocGFnaW5hdGlvbkNvbXBvbmVudCkge1xuICAgIDx0cj5cbiAgICAgIDx0ZCBbYXR0ci5jb2xzcGFuXT1cInRhYmxlU3BhblwiPlxuICAgICAgICA8bmctY29udGVudFxuICAgICAgICAgIHNlbGVjdD1cImltcGRjLXBhZ2luYXRpb24sIGRpdltpbXBkYy1wYWdpbmF0aW9uXVwiPjwvbmctY29udGVudD5cbiAgICAgIDwvdGQ+XG4gICAgPC90cj5cbiAgICB9XG4gIDwvdGZvb3Q+XG48L3RhYmxlPlxufVxuIl19
|
|
403
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduLWNvbXBvbmVudHMvc3JjL2xpYi90YWJsZS9jb250YWluZXJzL3RhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1jb21wb25lbnRzL3NyYy9saWIvdGFibGUvY29udGFpbmVycy90YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osSUFBSSxFQUNKLEtBQUssRUFFTCxRQUFRLEVBQ1IsTUFBTSxFQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxHQUFHLElBQUksY0FBYyxFQUFFLEdBQUcsSUFBSSxjQUFjLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDdEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTlDLE9BQU8sRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFheEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRTFEOzs7R0FHRztBQU1ILE1BQU0sT0FBTyxjQUFjO0lBb0J6Qjs7T0FFRztJQUNILElBQW9CLGFBQWEsQ0FBQyxLQUFjO1FBQzlDLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO0lBQzlCLENB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SUFBSSxFQUFFLENBQUM7U0FDcEI7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLE9BQU8sRUFBRSxDQUFDO1NBQ1g7SUFDSCxDQUFDOzhHQXZiVSxjQUFjO2tHQUFkLGNBQWMseWxCQXFHWCxtQkFBbUIsOEVBSW5CLHlCQUF5QixxRUN0SnpDLDY1UEFpUEE7OzJGRHBNYSxjQUFjO2tCQUwxQixTQUFTOytCQUNFLGFBQWE7OzBCQXlKcEIsUUFBUTs7MEJBQUksSUFBSTt5Q0FqSkgsT0FBTztzQkFBdEIsS0FBSztnQkFTVSxVQUFVO3NCQUF6QixLQUFLO2dCQUtVLE9BQU87c0JBQXRCLEtBQUs7Z0JBS2MsYUFBYTtzQkFBaEMsS0FBSztnQkFXSyxnQkFBZ0I7c0JBRDFCLEtBQUs7Z0JBWVUsaUJBQWlCO3NCQUFoQyxLQUFLO2dCQUtVLGVBQWU7c0JBQTlCLEtBQUs7Z0JBS1UsYUFBYTtzQkFBNUIsS0FBSztnQkFLVSxTQUFTO3NCQUF4QixLQUFLO2dCQU1LLGNBQWM7c0JBRHhCLEtBQUs7Z0JBWVUsb0JBQW9CO3NCQUFuQyxLQUFLO2dCQUtvQixTQUFTO3NCQUFsQyxNQUFNO2dCQUttQixNQUFNO3NCQUEvQixNQUFNO2dCQUttQixTQUFTO3NCQUFsQyxNQUFNO2dCQUttQixjQUFjO3NCQUF2QyxNQUFNO2dCQUtBLG1CQUFtQjtzQkFEekIsWUFBWTt1QkFBQyxtQkFBbUI7Z0JBSzFCLFdBQVc7c0JBRGpCLFlBQVk7dUJBQUMseUJBQXlCO2dCQU9iLFdBQVc7c0JBQXBDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRlUGlwZSwgRGVjaW1hbFBpcGUsIFBlcmNlbnRQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZ2V0IGFzIGdldE5lc3RlZFZhbHVlLCBzZXQgYXMgc2V0TmVzdGVkVmFsdWUgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBERUJPVU5DRV9USU1FLCBTT1JUX0NPTFVNTl9JTkRFWCB9IGZyb20gJy4uL2NvbnN0YW50cy9pbmRleCc7XG5pbXBvcnQgeyBUYWJsZUNvbHVtblR5cGUgfSBmcm9tICcuLi9lbnVtZXJhdGlvbnMvaW5kZXgnO1xuaW1wb3J0IHtcbiAgSUN1c3RvbUNlbGxSZW5kZXJlckNvbXBvbmVudHMsXG4gIElTb3J0QnlQYXlsb2FkLFxuICBJVGFibGVBY3Rpb25zQ29sdW1uRGVmLFxuICBJVGFibGVFdmVudFBheWxvYWQsXG4gIElUYWJsZVJvd0FjdGlvblBheWxvYWQsXG4gIElUYWJsZVJvd0l0ZW0sXG4gIElUYWJsZVJvd0l0ZW1WYWx1ZSxcbiAgSVRhYmxlUm93SXRlbVZhbHVlVHlwZXMsXG4gIFRhYmxlQ29sdW1uRGVmXG59IGZyb20gJy4uL2ludGVyZmFjZXMvaW5kZXgnO1xuaW1wb3J0IHsgQ2hlY2tib3hDaGFuZ2VFdmVudCB9IGZyb20gJy4uLy4uL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgVGFibGVUaGVtZUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcnMnO1xuaW1wb3J0IHsgQ29tcG9uZW50VGhlbWUgfSBmcm9tICcuLi8uLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBCcmFuZGVkRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vYnJhbmRpbmcnO1xuaW1wb3J0IHsgUGFnaW5hdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3BhZ2luYXRpb24nO1xuaW1wb3J0IHsgVGFibGVCdWxrQWN0aW9uc0NvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMnO1xuXG4vKipcbiAqIFRoZSBgVGFibGVDb21wb25lbnRgIChgPGltcGRjLXRhYmxlYCkgaXMgYSBkYXRhIHRhYmxlIGNvbXBvbmVudC5cbiAqIFRvIHVzZSwgaW1wb3J0IGBUYWJsZU1vZHVsZWAgZnJvbSBgQGltcGFydG5lci9kZXNpZ24tY29tcG9uZW50c2AuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ltcGRjLXRhYmxlJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB0YWJsZSBkYXRhIGlzIGN1cnJlbnRseSBiZWluZyBsb2FkZWQuIFRoZSBgPGltcGRjLXNwaW5uZXI+YCB3aWxsIHNob3cgaWYgZGF0YSBpcyBsb2FkaW5nLlxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIGxvYWRpbmcgPSBmYWxzZTtcblxuICAvKipcbiAgICogVGhlIHZpc2libGUgY29sdW1ucyBvZiB0aGUgdGFibGUuICBFYWNoIGBJVGFibGVDb2x1bW5EZWZgIGRlZmluZXMgcHJvcGVydGllcyByZWdhcmRpbmcgdGhlIGRpc3BsYXksIGZvcm1hdHRpbmcgYW5kIGludGVyYWN0aW9uIG9mIHRoZSBjb2x1bW4ncyBjZWxscy5cbiAgICogQ29sdW1uL2NlbGwgY29sb3IgcHJlY2VkZW5jZSBpczpcbiAgICogMSkgYGZpZWxkQ29sb3JgIC0gYWxsb3dzIGFuIGBJVGFibGVDb2x1bW5EZWZgIHRvIGRlbGVnYXRlIHRoZSByZXNwb25zaWJpbGl0eSBvZiBjZWxsIGNvbG9yIHRvIGFuIGBJVGFibGVSb3dJdGVtYCBwcm9wZXJ0eS5cbiAgICogMikgYGNvbG9yR2V0dGVyYC0gYWxsb3dzIGFuIGBJVGFibGVDb2x1bW5EZWZgIHRvIGRlbGVnYXRlIHRoZSByZXNwb25zaWJpbGl0eSBvZiBjZWxsIGNvbG9yIHRvIGEgZnVuY3Rpb24gb2YgdGhlIGBJVGFibGVSb3dJdGVtYCBkZXRlcm1pbmVkIGJ5IHRoZSBkZXZlbG9wZXIuXG4gICAqIDMpIGBjb2xvcmAgLSBhIHByb3BlcnR5IG9mIGFuIGBJVGFibGVDb2x1bW5EZWZgLlxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIGNvbHVtbkRlZnM6IFRhYmxlQ29sdW1uRGVmW10gPSBbXTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgdGFibGUgaXMgc3RyaXBlZC5cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBzdHJpcGVkID0gdHJ1ZTtcblxuICAvKipcbiAgICogV2hldGhlciBpbmRpdmlkdWFsIHJvd3MgY2FuIGJlIHNlbGVjdGVkLiBXaWxsIGJlIGB0cnVlYCBpZiBleHBsaWNpdGx5IHNldCB0byBgdHJ1ZWAgb3IgYGNhblNlbGVjdEFsbFJvd3NgIGlzIGB0cnVlYC5cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBzZXQgY2FuU2VsZWN0Um93cyh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2NhblNlbGVjdFJvd3MgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNhblNlbGVjdFJvd3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2FuU2VsZWN0QWxsUm93cyB8fCB0aGlzLl9jYW5TZWxlY3RSb3dzIHx8ICEhdGhpcy5idWxrQWN0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGFsbCByb3dzIGNhbiBiZSBzZWxlY3RlZCBhdCBvbmNlLiBXaWxsIGJlIGB0cnVlYCBpZiBleHBsaWNpdGx5IHNldCB0byBgdHJ1ZWAgb3IgaWYgYFRhYmxlQnVsa0FjdGlvbnNDb21wb25lbnRgIGlzIGNvbnRlbnQgcHJvamVjdGVkLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBjYW5TZWxlY3RBbGxSb3dzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fY2FuU2VsZWN0QWxsUm93cyA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBjYW5TZWxlY3RBbGxSb3dzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9jYW5TZWxlY3RBbGxSb3dzIHx8ICEhdGhpcy5idWxrQWN0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcGxhY2Vob2xkZXIgdGV4dCBhbmQgZW1wdHkgdmFsdWUgZGlzcGxheSB0ZXh0IGZvciBgPGltcGRjLXNlbGVjdD5gIGluc3RhbmNlcyBpbiBjZWxscyB3aXRoIGEgYElUYWJsZUNvbHVtbkRlZmAgYGNvbHVtblR5cGVgID0gYFNpbmdsZVNlbGVjdGAgb3IgYE11bHRpU2VsZWN0YC5cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBzZWxlY3RQbGFjZWhvbGRlciA9ICcnO1xuXG4gIC8qKlxuICAgKiBUaGUgYGNvbHVtbkRlZnNgIGluZGV4IG9mIHRoZSBjdXJyZW50bHkgc29ydGVkIGNvbHVtbi5cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBzb3J0Q29sdW1uSW5kZXggPSBTT1JUX0NPTFVNTl9JTkRFWDtcblxuICAvKipcbiAgICogVGhlIGRpcmVjdGlvbiBvZiB0aGUgY3VycmVudGx5IHNvcnRlZCBjb2x1bW4uXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgc29ydERpcmVjdGlvbjogJ2FzYycgfCAnZGVzYycgPSAnYXNjJztcblxuICAvKipcbiAgICogVGhlIHRhYmxlIHJvdyBkYXRhIGFzIGFuIGFycmF5IG9mIGBJVGFibGVSb3dJdGVtYC5cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyB0YWJsZURhdGE6IElUYWJsZVJvd0l0ZW1bXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBjdXJyZW50bHkgc2VsZWN0ZWQgSURzIGZyb20gdGhlIGB0YWJsZURhdGFgIGlucHV0LiAgQXJyYXkgbXVzdCBiZSBvZiB0eXBlIGAoc3RyaW5nIHwgbnVtYmVyKVtdYC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgc2VsZWN0ZWRSb3dJZHModmFsdWU6IChzdHJpbmcgfCBudW1iZXIpW10pIHtcbiAgICB0aGlzLl9zZWxlY3RlZFJvd0lkcyA9IFsuLi52YWx1ZV07XG4gIH1cbiAgcHVibGljIGdldCBzZWxlY3RlZFJvd0lkcygpOiAoc3RyaW5nIHwgbnVtYmVyKVtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuX3NlbGVjdGVkUm93SWRzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gY2VsbCByZW5kZXJlciBjb21wb25lbnRzIGF2YWlsYWJsZSB0byBiZSB1c2VkIGluIHRoZSB0YWJsZSBpbnN0YW5jZS5cbiAgICogRm9yIGEgZ2l2ZW4gYElUYWJsZUNvbHVtbkRlZmAgaW4gdGhlIGBjb2x1bW5EZWZzYCBpbnB1dCwgdGhlIGBjZWxsUmVuZGVyZXJDb21wb25lbnRgIHByb3BlcnR5IHNob3VsZCBiZSBzZXQgdG8gdGhlIGtleSBvZiB0aGUgcmVnaXN0ZXJlZCBjb21wb25lbnQgaW4gdGhpcyBpbnB1dC5cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBjdXN0b21DZWxsQ29tcG9uZW50cz86IElDdXN0b21DZWxsUmVuZGVyZXJDb21wb25lbnRzO1xuXG4gIC8qKlxuICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gb25lIG9yIG11bHRpcGxlIHJvd3MgYXJlIHNlbGVjdGVkLiBFbWl0cyBgKHN0cmluZyB8IG51bWJlcilbXWAgcGF5bG9hZC5cbiAgICovXG4gIEBPdXRwdXQoKSBwdWJsaWMgcmVhZG9ubHkgcm93U2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjwoc3RyaW5nIHwgbnVtYmVyKVtdPigpO1xuXG4gIC8qKlxuICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gYSBjb2x1bW4gaXMgc29ydGVkLiBFbWl0cyBgSVNvcnRCeVBheWxvYWRgIHBheWxvYWQuXG4gICAqL1xuICBAT3V0cHV0KCkgcHVibGljIHJlYWRvbmx5IHNvcnRCeSA9IG5ldyBFdmVudEVtaXR0ZXI8SVNvcnRCeVBheWxvYWQ+KCk7XG5cbiAgLyoqXG4gICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiBhIHJvdyBsaW5rIGlzIGNsaWNrZWQuIEVtaXRzIGBJVGFibGVFdmVudFBheWxvYWRgIHBheWxvYWQuXG4gICAqL1xuICBAT3V0cHV0KCkgcHVibGljIHJlYWRvbmx5IGxpbmtDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8SVRhYmxlRXZlbnRQYXlsb2FkPigpO1xuXG4gIC8qKlxuICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gYSByb3cgYWN0aW9uIGlzIGNsaWNrZWQuIEVtaXRzIGFuIGBJVGFibGVSb3dBY3Rpb25QYXlsb2FkYCBwYXlsb2FkLlxuICAgKi9cbiAgQE91dHB1dCgpIHB1YmxpYyByZWFkb25seSByb3dBY3Rpb25DbGljayA9XG4gICAgbmV3IEV2ZW50RW1pdHRlcjxJVGFibGVSb3dBY3Rpb25QYXlsb2FkPigpO1xuXG4gIC8qKiBAaWdub3JlICovXG4gIEBDb250ZW50Q2hpbGQoUGFnaW5hdGlvbkNvbXBvbmVudClcbiAgcHVibGljIHBhZ2luYXRpb25Db21wb25lbnQ/OiBQYWdpbmF0aW9uQ29tcG9uZW50ID0gdW5kZWZpbmVkO1xuXG4gIC8qKiBAaWdub3JlICovXG4gIEBDb250ZW50Q2hpbGQoVGFibGVCdWxrQWN0aW9uc0NvbXBvbmVudClcbiAgcHVibGljIGJ1bGtBY3Rpb25zPzogVGFibGVCdWxrQWN0aW9uc0NvbXBvbmVudCA9IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogRXZlbnQgZW1pdHRlZCB3aGVuIGEgcm93IGlucHV0IHZhbHVlIGlzIGNoYW5nZWQuIEVtaXR0ZWQgY2VsbHMgb2YgYGNvbHVtblR5cGVgIGBTaW5nbFNlbGVjdGAsIGBNdWx0aVNlbGVjdGAsIGBJbnB1dGAsIGBCb29sZWFuYCBvciBgSWNvbmAuXG4gICAqIE5vdCBlbWl0dGVkIGlmIGNvbHVtbiBkZWZpbml0aW9uIHByb3BlcnR5IGBkaXNhYmxlZGAgPSBgdHJ1ZWAuIEVtaXRzIGBJVGFibGVFdmVudFBheWxvYWRgIHBheWxvYWQuXG4gICAqL1xuICBAT3V0cHV0KCkgcHVibGljIHJlYWRvbmx5IGlucHV0Q2hhbmdlID1cbiAgICBuZXcgRXZlbnRFbWl0dGVyPElUYWJsZUV2ZW50UGF5bG9hZD4oKTtcblxuICAvKiogQGlnbm9yZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2VsbFR5cGUgPSBUYWJsZUNvbHVtblR5cGU7XG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyBhbGxTZWxlY3RlZCA9IHRydWU7XG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyBnZXQgc29tZVNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAhIXRoaXMuX3NlbGVjdGVkUm93SWRzICYmXG4gICAgICB0aGlzLl9zZWxlY3RlZFJvd0lkcy5sZW5ndGggPiAwICYmXG4gICAgICAhIXRoaXMudGFibGVEYXRhICYmXG4gICAgICB0aGlzLnRhYmxlRGF0YS5sZW5ndGggPiAwICYmXG4gICAgICB0aGlzLl9zZWxlY3RlZFJvd0lkcy5sZW5ndGggPCB0aGlzLnRhYmxlRGF0YS5sZW5ndGhcbiAgICApO1xuICB9XG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyByZWFkb25seSBicmFuZGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIGdldCB0YWJsZVNwYW4oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jYW5TZWxlY3RSb3dzXG4gICAgICA/IHRoaXMuY29sdW1uRGVmcy5sZW5ndGggKyAxXG4gICAgICA6IHRoaXMuY29sdW1uRGVmcy5sZW5ndGg7XG4gIH1cblxuICBwcml2YXRlIF9jYW5TZWxlY3RSb3dzID0gZmFsc2U7XG4gIHByaXZhdGUgX2NhblNlbGVjdEFsbFJvd3MgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc2VsZWN0ZWRSb3dJZHM6IChzdHJpbmcgfCBudW1iZXIpW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBfaW5wdXRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPElUYWJsZUV2ZW50UGF5bG9hZD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kYXRlUGlwZTogRGF0ZVBpcGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcGVyY2VudFBpcGU6IFBlcmNlbnRQaXBlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2RlY21pYWxQaXBlOiBEZWNpbWFsUGlwZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQE9wdGlvbmFsKCkgQEhvc3QoKSBwcml2YXRlIF9icmFuZGVkOiBCcmFuZGVkRGlyZWN0aXZlXG4gICkge1xuICAgIHRoaXMuYnJhbmRlZCA9IF9icmFuZGVkID8gdHJ1ZSA6IGZhbHNlO1xuICAgIHRoaXMuX2lucHV0Q2hhbmdlXG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoREVCT1VOQ0VfVElNRSkpXG4gICAgICAuc3Vic2NyaWJlKHRoaXMuaW5wdXRDaGFuZ2UpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZFJvd0lkcyddIHx8IGNoYW5nZXNbJ3RhYmxlRGF0YSddKSB7XG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLnRhYmxlRGF0YSB8fFxuICAgICAgICAhdGhpcy50YWJsZURhdGEubGVuZ3RoIHx8XG4gICAgICAgICF0aGlzLnNlbGVjdGVkUm93SWRzIHx8XG4gICAgICAgICF0aGlzLnNlbGVjdGVkUm93SWRzLmxlbmd0aFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuYWxsU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYWxsU2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkUm93SWRzLmxlbmd0aCA+PSB0aGlzLnRhYmxlRGF0YS5sZW5ndGg7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldE1haWxUb1ZhbHVlKFxuICAgIGNvbHVtbkluZGV4OiBudW1iZXIsXG4gICAgY3VycmVudFJvdzogSVRhYmxlUm93SXRlbVxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgY29sdW1uVHlwZSwgdHJ1bmNhdGVkOiB0cnVuY2F0ZWQgfSA9XG4gICAgICB0aGlzLl9nZXRDb2x1bW5EZWZCeUluZGV4KGNvbHVtbkluZGV4KTtcbiAgICBsZXQgdmFsdWUgPSB0aGlzLl9nZXRWYWx1ZShjb2x1bW5JbmRleCwgY3VycmVudFJvdyk7XG5cbiAgICBpZiAoY29sdW1uVHlwZSAhPT0gVGFibGVDb2x1bW5UeXBlLkVtYWlsKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgICB9XG4gICAgdmFsdWUgPSB2YWx1ZSA/IGBtYWlsdG86JHt2YWx1ZX1gIDogdmFsdWU7XG5cbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdHJpbmdWYWx1ZShcbiAgICBjb2x1bW5JbmRleDogbnVtYmVyLFxuICAgIGN1cnJlbnRSb3c6IElUYWJsZVJvd0l0ZW1cbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoY29sdW1uSW5kZXgsIGN1cnJlbnRSb3cpO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUuam9pbignOycpO1xuICAgIH1cblxuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGdldFZhbHVlKFxuICAgIGNvbHVtbkluZGV4OiBudW1iZXIsXG4gICAgY3VycmVudFJvdzogSVRhYmxlUm93SXRlbVxuICApOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgY29uc3QgeyBjb2x1bW5UeXBlLCB0cnVuY2F0ZWQ6IHRydW5jYXRlZCB9ID1cbiAgICAgIHRoaXMuX2dldENvbHVtbkRlZkJ5SW5kZXgoY29sdW1uSW5kZXgpO1xuICAgIGxldCB2YWx1ZSA9IHRoaXMuX2dldFZhbHVlKGNvbHVtbkluZGV4LCBjdXJyZW50Um93KTtcblxuICAgIHN3aXRjaCAoY29sdW1uVHlwZSkge1xuICAgICAgY2FzZSBUYWJsZUNvbHVtblR5cGUuRGVjaW1hbDoge1xuICAgICAgICB2YWx1ZSA9IHRoaXMuX2RlY21pYWxQaXBlLnRyYW5zZm9ybShOdW1iZXIodmFsdWUpIHx8IDApIHx8ICcnO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgVGFibGVDb2x1bW5UeXBlLkRhdGU6IHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICBjb25zdCB2YWxpZERhdGUgPSBkYXRlIGluc3RhbmNlb2YgRGF0ZSAmJiAhaXNOYU4oZGF0ZS5nZXRUaW1lKCkpO1xuICAgICAgICB2YWx1ZSA9IHZhbGlkRGF0ZVxuICAgICAgICAgID8gdGhpcy5fZGF0ZVBpcGUudHJhbnNmb3JtKGRhdGUsICdNTS9kZC95eXl5JykgfHwgJydcbiAgICAgICAgICA6IFN0cmluZyh2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBUYWJsZUNvbHVtblR5cGUuRGF0ZVRpbWU6IHtcbiAgICAgICAgY29uc3QgZGF0ZVRpbWUgPSBuZXcgRGF0ZShTdHJpbmcodmFsdWUpKTtcbiAgICAgICAgY29uc3QgdmFsaWREYXRlVGltZSA9XG4gICAgICAgICAgZGF0ZVRpbWUgaW5zdGFuY2VvZiBEYXRlICYmICFpc05hTihkYXRlVGltZS5nZXRUaW1lKCkpO1xuICAgICAgICB2YWx1ZSA9IHZhbGlkRGF0ZVRpbWVcbiAgICAgICAgICA/IHRoaXMuX2RhdGVQaXBlLnRyYW5zZm9ybShkYXRlVGltZSwgJ01NL2RkL3l5eXkgaDptbTpzcyBhJykgfHwgJydcbiAgICAgICAgICA6IFN0cmluZyh2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBUYWJsZUNvbHVtblR5cGUuTGluazoge1xuICAgICAgICB2YWx1ZSA9IFN0cmluZyh2YWx1ZSkucmVwbGFjZSgvKF5cXHcrOnxeKVxcL1xcLy8sICcnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFRhYmxlQ29sdW1uVHlwZS5QZXJjZW50YWdlOiB7XG4gICAgICAgIHZhbHVlID0gdGhpcy5fcGVyY2VudFBpcGUudHJhbnNmb3JtKE51bWJlcih2YWx1ZSkgfHwgMCkgfHwgJyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBUYWJsZUNvbHVtblR5cGUuVXJsOiB7XG4gICAgICAgIGlmICghLyhodHRwKHM/KSk6XFwvXFwvL2kudGVzdChTdHJpbmcodmFsdWUpKSkge1xuICAgICAgICAgIHZhbHVlID0gYGh0dHBzOi8vJHt2YWx1ZX1gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBUYWJsZUNvbHVtblR5cGUuVGV4dDoge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmpvaW4oJzsgJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRydW5jYXRlZCkge1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRydW5jYXRlU3RyaW5nID0gKHN0cmluZyA9ICcnLCBtYXhMZW5ndGggPSB0cnVuY2F0ZWQpID0+XG4gICAgICAgICAgc3RyaW5nLmxlbmd0aCA+IG1heExlbmd0aFxuICAgICAgICAgICAgPyBgJHtzdHJpbmcuc3Vic3RyaW5nKDAsIG1heExlbmd0aCl94oCmYFxuICAgICAgICAgICAgOiBzdHJpbmc7XG5cbiAgICAgICAgISF0cnVuY2F0ZWRcbiAgICAgICAgICA/ICh2YWx1ZSA9IHRydW5jYXRlU3RyaW5nKFN0cmluZyh2YWx1ZSksIHRydW5jYXRlZCkpXG4gICAgICAgICAgOiB2YWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFRhYmxlQ29sdW1uVHlwZS5NdWx0aVNlbGVjdDpcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnNwbGl0KCc7Jyk/Lm1hcCh2ID0+IHYudHJpbSgpKSB8fCBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UmF3VmFsdWUoXG4gICAgY29sdW1uSW5kZXg6IG51bWJlcixcbiAgICBjdXJyZW50Um93OiBJVGFibGVSb3dJdGVtXG4gICk6IElUYWJsZVJvd0l0ZW1WYWx1ZVR5cGVzPElUYWJsZVJvd0l0ZW1WYWx1ZT4ge1xuICAgIGNvbnN0IHsgZmllbGQgfSA9IHRoaXMuX2dldENvbHVtbkRlZkJ5SW5kZXgoY29sdW1uSW5kZXgpO1xuXG4gICAgaWYgKCFmaWVsZCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50Um93W2ZpZWxkXSB8fCAnJztcbiAgfVxuXG4gIHB1YmxpYyBnZXRDZWxsQ29sb3IoXG4gICAgY29sdW1uRGVmaW5pdGlvbjogVGFibGVDb2x1bW5EZWYsXG4gICAgaXRlbTogSVRhYmxlUm93SXRlbVxuICApOiBzdHJpbmcge1xuICAgIHJldHVybiBUYWJsZVRoZW1lSGVscGVyLmdldENlbGxDb2xvcihjb2x1bW5EZWZpbml0aW9uLCBpdGVtKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUaGVtZShcbiAgICBjb2x1bW5EZWZpbml0aW9uOiBUYWJsZUNvbHVtbkRlZixcbiAgICBpdGVtOiBJVGFibGVSb3dJdGVtXG4gICk6IENvbXBvbmVudFRoZW1lIHtcbiAgICByZXR1cm4gKFxuICAgICAgVGFibGVUaGVtZUhlbHBlci5nZXRUaGVtZShjb2x1bW5EZWZpbml0aW9uLCBpdGVtKSB8fFxuICAgICAgQ29tcG9uZW50VGhlbWUuUHJpbWFyeVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgaXNTb3J0ZWRDb2x1bW4oY29sdW1uSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjb2x1bW5JbmRleCA9PT0gdGhpcy5zb3J0Q29sdW1uSW5kZXg7XG4gIH1cblxuICBwdWJsaWMgaXNSb3dTZWxlY3RlZChpZDogc3RyaW5nIHwgbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRSb3dJZHMuaW5jbHVkZXMoaWQpO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZVNlbGVjdEFsbChldmVudDogQ2hlY2tib3hDaGFuZ2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5TZWxlY3RBbGxSb3dzIHx8ICF0aGlzLnRhYmxlRGF0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudC5jaGVja2VkKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZFJvd0lkcyA9IHRoaXMudGFibGVEYXRhPy5tYXAocm93ID0+IHJvdy5pZCkgfHwgW107XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3NlbGVjdGVkUm93SWRzID0gW107XG4gICAgfVxuXG4gICAgdGhpcy5fc2VsZWN0ZWRSb3dJZHMuc29ydCgpO1xuICAgIHRoaXMuYWxsU2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkUm93SWRzLmxlbmd0aCA+PSB0aGlzLnRhYmxlRGF0YS5sZW5ndGg7XG5cbiAgICB0aGlzLnJvd1NlbGVjdC5lbWl0KHRoaXMuc2VsZWN0ZWRSb3dJZHMpO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZVNvcnQoY29sdW1uSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChjb2x1bW5JbmRleCA9PT0gdGhpcy5zb3J0Q29sdW1uSW5kZXgpIHtcbiAgICAgIHRoaXMuc29ydERpcmVjdGlvbiA9IHRoaXMuc29ydERpcmVjdGlvbiA9PT0gJ2FzYycgPyAnZGVzYycgOiAnYXNjJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zb3J0Q29sdW1uSW5kZXggPSBjb2x1bW5JbmRleDtcbiAgICAgIHRoaXMuc29ydERpcmVjdGlvbiA9ICdhc2MnO1xuICAgIH1cblxuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5fZ2V0Q29sdW1uRGVmQnlJbmRleChjb2x1bW5JbmRleCkuZmllbGQgfHwgJyc7XG5cbiAgICB0aGlzLnNvcnRCeS5lbWl0KHtcbiAgICAgIGNvbHVtbkluZGV4LFxuICAgICAgZmllbGQsXG4gICAgICBkaXJlY3Rpb246IHRoaXMuc29ydERpcmVjdGlvblxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZVJvd1NlbGVjdChcbiAgICBldmVudDogQ2hlY2tib3hDaGFuZ2VFdmVudCxcbiAgICByb3dJZDogbnVtYmVyIHwgc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5TZWxlY3RSb3dzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LmNoZWNrZWQgJiYgIXRoaXMuX3NlbGVjdGVkUm93SWRzLmluY2x1ZGVzKHJvd0lkKSkge1xuICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dJZHMucHVzaChyb3dJZCk7XG4gICAgfSBlbHNlIGlmICghZXZlbnQuY2hlY2tlZCAmJiB0aGlzLl9zZWxlY3RlZFJvd0lkcy5pbmNsdWRlcyhyb3dJZCkpIHtcbiAgICAgIGNvbnN0IGlkeCA9IHRoaXMuX3NlbGVjdGVkUm93SWRzLmluZGV4T2Yocm93SWQpO1xuICAgICAgaWYgKGlkeCA+IC0xKSB7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkUm93SWRzLnNwbGljZShpZHgsIDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9zZWxlY3RlZFJvd0lkcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGVkUm93SWRzLnNvcnQoKTtcbiAgICB9XG5cbiAgICB0aGlzLmFsbFNlbGVjdGVkID0gdGhpcy5zZWxlY3RlZFJvd0lkcy5sZW5ndGggPj0gdGhpcy50YWJsZURhdGEubGVuZ3RoO1xuICAgIHRoaXMucm93U2VsZWN0LmVtaXQodGhpcy5zZWxlY3RlZFJvd0lkcyk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlQ2VsbFZhbHVlQ2hhbmdlKFxuICAgIGNvbHVtbkluZGV4OiBudW1iZXIsXG4gICAgcm93SW5kZXg6IG51bWJlcixcbiAgICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IHN0cmluZ1tdXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHsgZmllbGQsIGNvbHVtblR5cGUgfSA9IHRoaXMuX2dldENvbHVtbkRlZkJ5SW5kZXgoY29sdW1uSW5kZXgpO1xuICAgIGxldCBjdXJyZW50VmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBzdHJpbmdbXSA9IHZhbHVlO1xuXG4gICAgaWYgKGNvbHVtblR5cGUgIT09IFRhYmxlQ29sdW1uVHlwZS5Cb29sZWFuICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgY3VycmVudFZhbHVlID0gaXNOYU4oTnVtYmVyKHZhbHVlKSkgPyB2YWx1ZSA6IE51bWJlcih2YWx1ZSk7XG4gICAgfVxuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLnRhYmxlRGF0YVtyb3dJbmRleF07XG5cbiAgICBzZXROZXN0ZWRWYWx1ZShpdGVtLCBTdHJpbmcoZmllbGQpLCBjdXJyZW50VmFsdWUpO1xuXG4gICAgdGhpcy5faW5wdXRDaGFuZ2UuZW1pdCh7XG4gICAgICBjb2x1bW5JbmRleCxcbiAgICAgIGl0ZW0sXG4gICAgICB2YWx1ZTogY3VycmVudFZhbHVlXG4gICAgfSk7XG5cbiAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlTGlua0NsaWNrKGNvbHVtbkluZGV4OiBudW1iZXIsIGl0ZW06IElUYWJsZVJvd0l0ZW0pOiB2b2lkIHtcbiAgICB0aGlzLmxpbmtDbGljay5lbWl0KHtcbiAgICAgIGl0ZW0sXG4gICAgICBjb2x1bW5JbmRleFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZUFjdGlvbkNsaWNrKFxuICAgIGNvbHVtbkluZGV4OiBudW1iZXIsXG4gICAgaXRlbTogSVRhYmxlUm93SXRlbSxcbiAgICBhY3Rpb25BcGlOYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgdGhpcy5yb3dBY3Rpb25DbGljay5lbWl0KHtcbiAgICAgIGl0ZW0sXG4gICAgICBjb2x1bW5JbmRleCxcbiAgICAgIGFjdGlvbkFwaU5hbWVcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb2x1bW5EZWZJc0FjdGlvbnMoXG4gICAgY29sdW1uRGVmOiBUYWJsZUNvbHVtbkRlZjxhbnk+XG4gICk6IGNvbHVtbkRlZiBpcyBJVGFibGVBY3Rpb25zQ29sdW1uRGVmPGFueT4ge1xuICAgIHJldHVybiBjb2x1bW5EZWYuY29sdW1uVHlwZSA9PT0gVGFibGVDb2x1bW5UeXBlLkFjdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIF9nZXRDb2x1bW5EZWZCeUluZGV4KGNvbHVtbkluZGV4OiBudW1iZXIpOiBUYWJsZUNvbHVtbkRlZiB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1uRGVmc1tjb2x1bW5JbmRleF07XG4gIH1cblxuICBwcml2YXRlIF9nZXRWYWx1ZShcbiAgICBjb2x1bW5JbmRleDogbnVtYmVyLFxuICAgIGN1cnJlbnRSb3c6IElUYWJsZVJvd0l0ZW1cbiAgKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGZpZWxkLCB2YWx1ZUdldHRlciB9ID0gdGhpcy5fZ2V0Q29sdW1uRGVmQnlJbmRleChjb2x1bW5JbmRleCk7XG5cbiAgICAgIGNvbnN0IHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSA9IHZhbHVlR2V0dGVyXG4gICAgICAgID8gdmFsdWVHZXR0ZXIoY3VycmVudFJvdylcbiAgICAgICAgOiAoZ2V0TmVzdGVkVmFsdWUoY3VycmVudFJvdywgU3RyaW5nKGZpZWxkKSwgJycpIGFzIHN0cmluZyB8IHN0cmluZ1tdKTtcblxuICAgICAgcmV0dXJuIHZhbHVlIHx8ICcnO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cbn1cbiIsIkBpZiAodGFibGVEYXRhKSB7XG48dGFibGUgaW1wZGNUYWJsZSBbc3RyaXBlZF09XCJzdHJpcGVkXCI+XG4gIDx0aGVhZD5cbiAgICBAaWYgKCEhYnVsa0FjdGlvbnMpIHtcbiAgICA8dHI+XG4gICAgICA8dGggW2F0dHIuY29sc3Bhbl09XCJ0YWJsZVNwYW5cIiBzY29wZT1cImNvbFwiIGNsYXNzPVwiYnVsay1hY3Rpb24tY29sdW1uXCI+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cImltcGRjLXRhYmxlLWJ1bGstYWN0aW9uc1wiPjwvbmctY29udGVudD5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2ltcGRjVGFibGVCdWxrQWN0aW9uc11cIj48L25nLWNvbnRlbnQ+XG4gICAgICA8L3RoPlxuICAgIDwvdHI+XG4gICAgfVxuICAgIDx0cj5cbiAgICAgIEBpZiAoY2FuU2VsZWN0Um93cykge1xuICAgICAgPHRoXG4gICAgICAgIHNjb3BlPVwiY29sXCJcbiAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICdoZWFkaW5nLWJlbG93LWJ1bGstYWN0aW9ucyc6ICEhYnVsa0FjdGlvbnNcbiAgICAgICAgfVwiPlxuICAgICAgICBAaWYgKGNhblNlbGVjdEFsbFJvd3MpIHtcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8aW1wZGMtY2hlY2tib3hcbiAgICAgICAgICAgIG5nTW9kZWxcbiAgICAgICAgICAgIFtjaGVja2VkXT1cImFsbFNlbGVjdGVkXCJcbiAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cInNvbWVTZWxlY3RlZFwiXG4gICAgICAgICAgICAoY2hhbmdlKT1cImhhbmRsZVNlbGVjdEFsbCgkZXZlbnQpXCI+PC9pbXBkYy1jaGVja2JveD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvdGg+XG4gICAgICB9IEBmb3IgKGNvbHVtbkRlZiBvZiBjb2x1bW5EZWZzOyB0cmFjayBjb2x1bW5EZWY7IGxldCBjb2x1bW5JbmRleCA9XG4gICAgICAkaW5kZXgpIHtcbiAgICAgIDx0aFxuICAgICAgICBzY29wZT1cImNvbFwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAnc29ydGVkLWNvbHVtbic6IGlzU29ydGVkQ29sdW1uKGNvbHVtbkluZGV4KSxcbiAgICAgICAgICAnc29ydGFibGUtY29sdW1uJzogY29sdW1uRGVmLnNvcnRlZCxcbiAgICAgICAgICAnaGVhZGluZy1iZWxvdy1idWxrLWFjdGlvbnMnOiAhIWJ1bGtBY3Rpb25zXG4gICAgICAgIH1cIlxuICAgICAgICAoY2xpY2spPVwiaGFuZGxlU29ydChjb2x1bW5JbmRleClcIj5cbiAgICAgICAgPGltcGRjLWNvbHVtbi1oZWFkaW5nXG4gICAgICAgICAgW2lzU29ydGFibGVdPVwiY29sdW1uRGVmLnNvcnRlZCB8fCBmYWxzZVwiXG4gICAgICAgICAgW2NvbHVtbkluZGV4XT1cImNvbHVtbkluZGV4XCJcbiAgICAgICAgICBbc29ydENvbHVtbkluZGV4XT1cInNvcnRDb2x1bW5JbmRleFwiXG4gICAgICAgICAgW2RpcmVjdGlvbl09XCJzb3J0RGlyZWN0aW9uXCJcbiAgICAgICAgICBbdGV4dF09XCJjb2x1bW5EZWYudGl0bGVcIlxuICAgICAgICAgIChzb3J0KT1cImhhbmRsZVNvcnQoJGV2ZW50KVwiPlxuICAgICAgICA8L2ltcGRjLWNvbHVtbi1oZWFkaW5nPlxuICAgICAgPC90aD5cbiAgICAgIH1cbiAgICA8L3RyPlxuICA8L3RoZWFkPlxuICA8dGJvZHk+XG4gICAgQGlmIChsb2FkaW5nKSB7XG4gICAgPHRyPlxuICAgICAgPHRkIFthdHRyLmNvbHNwYW5dPVwidGFibGVTcGFuXCIgY2xhc3M9XCJkYXRhLWxvYWRpbmdcIj5cbiAgICAgICAgPGltcGRjLXNwaW5uZXI+PC9pbXBkYy1zcGlubmVyPlxuICAgICAgPC90ZD5cbiAgICA8L3RyPlxuICAgIH0gQGVsc2UgeyBAZm9yIChyb3cgb2YgdGFibGVEYXRhOyB0cmFjayByb3c7IGxldCByb3dJbmRleCA9ICRpbmRleCkge1xuICAgIDx0cj5cbiAgICAgIEBpZiAoY2FuU2VsZWN0Um93cykge1xuICAgICAgPHRkPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0LWNvbHVtblwiPlxuICAgICAgICAgIDxpbXBkYy1jaGVja2JveFxuICAgICAgICAgICAgW25nTW9kZWxdPVwiaXNSb3dTZWxlY3RlZChyb3cuaWQpXCJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlUm93U2VsZWN0KCRldmVudCwgcm93LmlkKVwiPjwvaW1wZGMtY2hlY2tib3g+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC90ZD5cbiAgICAgIH1cbiAgICAgIDx0ZFxuICAgICAgICAqbmdGb3I9XCJsZXQgY29sdW1uRGVmIG9mIGNvbHVtbkRlZnM7IGluZGV4IGFzIGNvbEluZGV4OyBsYXN0IGFzIGlzTGFzdFwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAnY29sLW5vLXBhZGRpbmcnOiAhIWNvbHVtbkRlZi5ub1BhZGRpbmcsXG4gICAgICAgICAgJ2FjdGlvbnMtY29sdW1uJzogY29sdW1uRGVmLmNvbHVtblR5cGUgPT09IGNlbGxUeXBlLkFjdGlvbnNcbiAgICAgICAgfVwiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIEBzd2l0Y2ggKGNvbHVtbkRlZi5jb2x1bW5UeXBlKSB7IEBjYXNlIChjZWxsVHlwZS5CYWRnZSkge1xuICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgPGltcGRjLWJhZGdlXG4gICAgICAgICAgICAgIFt0ZXh0XT1cImdldFN0cmluZ1ZhbHVlKGNvbEluZGV4LCByb3cpXCJcbiAgICAgICAgICAgICAgW3RoZW1lXT1cImdldFRoZW1lKGNvbHVtbkRlZiwgcm93KVwiPlxuICAgICAgICAgICAgPC9pbXBkYy1iYWRnZT5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgfSBAY2FzZSAoY2VsbFR5cGUuTGluaykge1xuICAgICAgICAgIDxzcGFuIChjbGljayk9XCJoYW5kbGVMaW5rQ2xpY2soY29sSW5kZXgsIHJvdylcIj5cbiAgICAgICAgICAgIEBpZiAoIWJyYW5kZWQpIHtcbiAgICAgICAgICAgIDxhPlxuICAgICAgICAgICAgICB7eyBnZXRWYWx1ZShjb2xJbmRleCwgcm93KSB9fVxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8YSBpbXBkY0JyYW5kZWQ+XG4gICAgICAgICAgICAgIHt7IGdldFZhbHVlKGNvbEluZGV4LCByb3cpIH19XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIH0gQGNhc2UgKGNlbGxUeXBlLlVybCkge1xuICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgQGlmICghYnJhbmRlZCkge1xuICAgICAgICAgICAgPGEgdGFyZ2V0PVwiX2JsYW5rXCIgW2F0dHIuaHJlZl09XCJnZXRWYWx1ZShjb2xJbmRleCwgcm93KVwiPlxuICAgICAgICAgICAgICB7eyBnZXRWYWx1ZShjb2xJbmRleCwgcm93KSB9fVxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8YVxuICAgICAgICAgICAgICBpbXBkY0JyYW5kZWRcbiAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgW2F0dHIuaHJlZl09XCJnZXRWYWx1ZShjb2xJbmRleCwgcm93KVwiPlxuICAgICAgICAgICAgICB7eyBnZXRWYWx1ZShjb2xJbmRleCwgcm93KSB9fVxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICB9IEBjYXNlIChjZWxsVHlwZS5FbWFpbCkge1xuICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgQGlmICghYnJhbmRlZCkge1xuICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgW2F0dHIuaHJlZl09XCInbWFpbHRvOicgKyBnZXRWYWx1ZShjb2xJbmRleCwgcm93KVwiPlxuICAgICAgICAgICAgICB7eyBnZXRWYWx1ZShjb2xJbmRleCwgcm93KSB9fVxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8YSBpbXBkY0JyYW5kZWQgW2F0dHIuaHJlZl09XCJnZXRNYWlsVG9WYWx1ZShjb2xJbmRleCwgcm93KVwiPlxuICAgICAgICAgICAgICB7eyBnZXRWYWx1ZShjb2xJbmRleCwgcm93KSB9fVxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICB9IEBjYXNlIChjZWxsVHlwZS5JbnB1dCkge1xuICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIGltcGRjSW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBjbGFzcz1cInt7IGdldENlbGxDb2xvcihjb2x1bW5EZWYsIHJvdykgfX1cIlxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJnZXRWYWx1ZShjb2xJbmRleCwgcm93KVwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIlxuICAgICAgICAgICAgICAgIGhhbmRsZUNlbGxWYWx1ZUNoYW5nZShjb2xJbmRleCwgcm93SW5kZXgsICRldmVudClcbiAgICAgICAgICAgICAgXCIgLz5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgfSBAY2FzZSAoY2VsbFR5cGUuQm9vbGVhbikge1xuICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgQGlmIChjb2x1bW5EZWYuZGlzYWJsZWQgJiYgZ2V0VmFsdWUoY29sSW5kZXgsIHJvdykgPT09ICd0cnVlJykge1xuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgaW1wZGMtaWNvblxuICAgICAgICAgICAgICBuYW1lPVwiY2hlY2tcIlxuICAgICAgICAgICAgICBjbGFzcz1cInt7IGdldENlbGxDb2xvcihjb2x1bW5EZWYsIHJvdykgfX1cIj48L3NwYW4+XG4gICAgICAgICAgICB9IEBlbHNlIGlmICghY29sdW1uRGVmLmRpc2FibGVkKSB7XG4gICAgICAgICAgICA8aW1wZGMtY2hlY2tib3hcbiAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiZ2V0VmFsdWUoY29sSW5kZXgsIHJvdykgPT09ICd0cnVlJ1wiXG4gICAgICAgICAgICAgIFtpc1N3aXRjaF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJcbiAgICAgICAgICAgICAgICBoYW5kbGVDZWxsVmFsdWVDaGFuZ2UoY29sSW5kZXgsIHJvd0luZGV4LCAkZXZlbnQuY2hlY2tlZClcbiAgICAgICAgICAgICAgXCI+PC9pbXBkYy1jaGVja2JveD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgfSBAY2FzZSAoY2VsbFR5cGUuU2luZ2xlU2VsZWN0KSB7XG4gICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICA8aW1wZGMtc2VsZWN0XG4gICAgICAgICAgICAgIFtuZ01vZGVsXT1cImdldFZhbHVlKGNvbEluZGV4LCByb3cpXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbHVtbkRlZi5kaXNhYmxlZCB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJzZWxlY3RQbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgIGFsbG93Q2xlYXI9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJcbiAgICAgICAgICAgICAgICBoYW5kbGVDZWxsVmFsdWVDaGFuZ2UoY29sSW5kZXgsIHJvd0luZGV4LCAkZXZlbnQudmFsdWUpXG4gICAgICAgICAgICAgIFwiPlxuICAgICAgICAgICAgICBAZm9yICh2YWx1ZSBvZiAoY29sdW1uRGVmLnZhbHVlcyB8fCBbXSk7IHRyYWNrIHZhbHVlKSB7XG4gICAgICAgICAgICAgIDxpbXBkYy1zZWxlY3Qtb3B0aW9uXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cInZhbHVlLnZhbHVlXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwidmFsdWUubGFiZWxcIj48L2ltcGRjLXNlbGVjdC1vcHRpb24+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvaW1wZGMtc2VsZWN0PlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICB9IEBjYXNlIChjZWxsVHlwZS5NdWx0aVNlbGVjdCkge1xuICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgPGltcGRjLXNlbGVjdFxuICAgICAgICAgICAgICBbbmdNb2RlbF09XCJnZXRWYWx1ZShjb2xJbmRleCwgcm93KVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW5EZWYuZGlzYWJsZWQgfHwgZmFsc2VcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwic2VsZWN0UGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICBtdWx0aXBsZT1cInRydWVcIlxuICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIlxuICAgICAgICAgICAgICAgIGhhbmRsZUNlbGxWYWx1ZUNoYW5nZShjb2xJbmRleCwgcm93SW5kZXgsICRldmVudC52YWx1ZSlcbiAgICAgICAgICAgICAgXCI+XG4gICAgICAgICAgICAgIEBmb3IgKHZhbHVlIG9mIChjb2x1bW5EZWYudmFsdWVzIHx8IFtdKTsgdHJhY2sgdmFsdWUpIHtcbiAgICAgICAgICAgICAgPGltcGRjLXNlbGVjdC1vcHRpb25cbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwidmFsdWUudmFsdWVcIlxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJ2YWx1ZS5sYWJlbFwiPjwvaW1wZGMtc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9pbXBkYy1zZWxlY3Q+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIH0gQGNhc2UgKGNlbGxUeXBlLkNlbGxSZW5kZXIpIHtcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInt7IGdldENlbGxDb2xvcihjb2x1bW5EZWYsIHJvdykgfX1cIj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICBpbXBkY1RhYmxlSW5qZWN0Q29tcG9uZW50XG4gICAgICAgICAgICAgIFtjb2x1bW5EZWZdPVwiY29sdW1uRGVmXCJcbiAgICAgICAgICAgICAgW3Jvd0l0ZW1dPVwicm93XCJcbiAgICAgICAgICAgICAgW2N1c3RvbUNlbGxDb21wb25lbnRzXT1cImN1c3RvbUNlbGxDb21wb25lbnRzIHx8IHt9XCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cImdldFJhd1ZhbHVlKGNvbEluZGV4LCByb3cpXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgfSBAY2FzZSAoY2VsbFR5cGUuSWNvbikge1xuICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgaW1wZGMtaWNvblxuICAgICAgICAgICAgICBbbmFtZV09XCJjb2x1bW5EZWYuaWNvbk5hbWVcIlxuICAgICAgICAgICAgICBjbGFzcz1cInt7IGdldENlbGxDb2xvcihjb2x1bW5EZWYsIHJvdykgfX1cIj48L3NwYW4+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIH0gQGNhc2UgKGNlbGxUeXBlLkFjdGlvbnMpIHtcbiAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgIDwhLS0gd2lsbCBhbHdheXMgcmV0dXJuICd0cnVlJywgYnV0IG5lZWRlZCB0byBzYXRpc2Z5IHRoZSB0eXBlIGVuZ2luZSAtLT5cbiAgICAgICAgICAgIEBpZiAoY29sdW1uRGVmSXNBY3Rpb25zKGNvbHVtbkRlZikpIHtcbiAgICAgICAgICAgIDxpbXBkYy1yb3ctYWN0aW9uc1xuICAgICAgICAgICAgICBbY29sdW1uRGVmXT1cImNvbHVtbkRlZlwiXG4gICAgICAgICAgICAgIFtyb3dJdGVtXT1cInJvd1wiXG4gICAgICAgICAgICAgIFtsYXN0Q29sdW1uXT1cImlzTGFzdFwiXG4gICAgICAgICAgICAgIChhY3Rpb25DbGljayk9XCJcbiAgICAgICAgICAgICAgICBoYW5kbGVBY3Rpb25DbGljayhjb2xJbmRleCwgcm93LCAkZXZlbnQpXG4gICAgICAgICAgICAgIFwiPjwvaW1wZGMtcm93LWFjdGlvbnM+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIH0gQGRlZmF1bHQge1xuICAgICAgICAgIDxzcGFuIGNsYXNzPVwie3sgZ2V0Q2VsbENvbG9yKGNvbHVtbkRlZiwgcm93KSB9fVwiPlxuICAgICAgICAgICAge3sgZ2V0VmFsdWUoY29sSW5kZXgsIHJvdykgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgfSB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC90ZD5cbiAgICA8L3RyPlxuICAgIH0gQGVtcHR5IHtcbiAgICA8dHI+XG4gICAgICA8dGQgW2F0dHIuY29sc3Bhbl09XCJ0YWJsZVNwYW5cIiBjbGFzcz1cIm5vLWRhdGFcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW25vRGF0YV1cIj48L25nLWNvbnRlbnQ+XG4gICAgICA8L3RkPlxuICAgIDwvdHI+XG4gICAgfSB9XG4gIDwvdGJvZHk+XG4gIDx0Zm9vdD5cbiAgICBAaWYgKHBhZ2luYXRpb25Db21wb25lbnQpIHtcbiAgICA8dHI+XG4gICAgICA8dGQgW2F0dHIuY29sc3Bhbl09XCJ0YWJsZVNwYW5cIj5cbiAgICAgICAgPG5nLWNvbnRlbnRcbiAgICAgICAgICBzZWxlY3Q9XCJpbXBkYy1wYWdpbmF0aW9uLCBkaXZbaW1wZGMtcGFnaW5hdGlvbl1cIj48L25nLWNvbnRlbnQ+XG4gICAgICA8L3RkPlxuICAgIDwvdHI+XG4gICAgfVxuICA8L3Rmb290PlxuPC90YWJsZT5cbn1cbiJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export * from './tag.component';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ24tY29tcG9uZW50cy9zcmMvbGliL3RhZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGlCQUFpQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi90YWcuY29tcG9uZW50JztcbiJdfQ==
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { Attribute, ChangeDetectionStrategy, Component, EventEmitter, HostBinding, Input, Output, booleanAttribute, numberAttribute } from '@angular/core';
|
|
2
|
+
import { IconModule } from '../icon';
|
|
3
|
+
import { mixinDisabled, mixinTabIndex } from '../form-field/shared';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "../icon/icon.component";
|
|
6
|
+
const _TagComponentBase = mixinTabIndex(mixinDisabled(class {
|
|
7
|
+
}));
|
|
8
|
+
/**
|
|
9
|
+
* Tags are interactive elements that can be added to UI objects to label, categorize, organize, and filter.
|
|
10
|
+
* They can be added and removed by users. Tags are used in multi-select inputs.
|
|
11
|
+
*
|
|
12
|
+
* Don’t use Tags to communicate the status of an object or the result of an action (like Enabled, Deleted,
|
|
13
|
+
* Submitted, Error...) — use badges instead.
|
|
14
|
+
*/
|
|
15
|
+
export class TagComponent extends _TagComponentBase {
|
|
16
|
+
get themeClass() {
|
|
17
|
+
switch (this.theme) {
|
|
18
|
+
case 'outline':
|
|
19
|
+
return 'impdc-tag--theme-outline';
|
|
20
|
+
case 'inverse':
|
|
21
|
+
return 'impdc-tag--theme-inverse';
|
|
22
|
+
case 'default':
|
|
23
|
+
default:
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
constructor(tabIndex) {
|
|
28
|
+
super();
|
|
29
|
+
/**
|
|
30
|
+
* Color theme to be used when rendering the tag.
|
|
31
|
+
*/
|
|
32
|
+
this.theme = 'default';
|
|
33
|
+
/**
|
|
34
|
+
* Whether to use fully rounded borders for tag, granting a "pill"-like appearance.
|
|
35
|
+
*/
|
|
36
|
+
this.rounded = false;
|
|
37
|
+
/**
|
|
38
|
+
* Where to include an interactable button inside of the tag, whose interactions can be listened
|
|
39
|
+
* for via the `(buttonClick)` event output.
|
|
40
|
+
*/
|
|
41
|
+
this.withButton = false;
|
|
42
|
+
/**
|
|
43
|
+
* The FontAwesome icon to be displayed inside of the button when `withButton` is set to `true`. Value may be
|
|
44
|
+
* just a icon name, or optionally an icon name and specific FontAwesome theme/face.
|
|
45
|
+
*/
|
|
46
|
+
this.buttonIcon = {
|
|
47
|
+
name: 'times',
|
|
48
|
+
theme: 'light'
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Event output for button events triggered when `withButton` is set to `true`.
|
|
52
|
+
*/
|
|
53
|
+
this.buttonClick = new EventEmitter();
|
|
54
|
+
this.tabIndex = parseInt(tabIndex ?? '') || 0;
|
|
55
|
+
}
|
|
56
|
+
get buttonIconName() {
|
|
57
|
+
return typeof this.buttonIcon === 'string'
|
|
58
|
+
? this.buttonIcon
|
|
59
|
+
: this.buttonIcon.name;
|
|
60
|
+
}
|
|
61
|
+
get buttonIconTheme() {
|
|
62
|
+
return typeof this.buttonIcon !== 'string'
|
|
63
|
+
? this.buttonIcon.theme
|
|
64
|
+
: 'solid';
|
|
65
|
+
}
|
|
66
|
+
handleButtonClick(evt) {
|
|
67
|
+
evt.preventDefault();
|
|
68
|
+
evt.stopPropagation();
|
|
69
|
+
this.buttonClick.emit(evt);
|
|
70
|
+
}
|
|
71
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: TagComponent, deps: [{ token: 'tabindex', attribute: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
72
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.0.1", type: TagComponent, isStandalone: true, selector: "impdc-tag", inputs: { disabled: ["disabled", "disabled", booleanAttribute], tabIndex: ["tabIndex", "tabIndex", numberAttribute], theme: "theme", rounded: ["rounded", "rounded", booleanAttribute], withButton: ["withButton", "withButton", booleanAttribute], buttonIcon: "buttonIcon" }, outputs: { buttonClick: "buttonClick" }, host: { properties: { "attr.tabindex": "tabIndex", "class.impdc-tag--rounded": "this.rounded", "class": "this.themeClass" } }, exportAs: ["impdcTag"], usesInheritance: true, ngImport: i0, template: "<span class=\"impdc-tag--text\"><ng-content></ng-content></span>\n@if (withButton) {\n<button\n type=\"button\"\n class=\"impdc-tag--button\"\n [disabled]=\"disabled\"\n (click)=\"handleButtonClick($event)\">\n <impdc-icon size=\"12\" [name]=\"buttonIconName\" [theme]=\"buttonIconTheme\" />\n</button>\n}\n", styles: [":host{--impdc-tag--bg: var(--impd-color-gray-200);--impdc-tag--border-color: var(--impd-color-gray-200);--impdc-tag--color: var(--impd-color-gray-800);--impdc-tag--button-border-radius: .3rem;--impdc-tag--button-bg-hover: var(--impd-color-gray-300);--impdc-tag--button-bg-active: var(--impd-color-gray-400);--impdc-tag--button-color: var(--impd-color-gray-500);--impdc-tag--button-color-hover: var(--impd-color-gray-600);--impdc-tag--border-radius: var(--impd-border-radius-default);--impdc-tag--font-size: var(--impd-font-size-xs);background-color:var(--impdc-tag--bg);color:var(--impdc-tag--color);display:inline-flex;flex-wrap:nowrap;align-items:center;justify-content:center;font-size:var(--impdc-tag--font-size);font-weight:var(--impd-font-weight-medium);line-height:var(--impd-size-4);height:var(--impd-size-5);border:1px solid var(--impdc-tag--border-color);border-radius:var(--impdc-tag--border-radius)}:host:focus{border-color:var(--impdc-tag--bg);outline:1px solid var(--impd-color-motion-blue-500)}:host.impdc-tag--rounded{--impdc-tag--border-radius: var(--impd-border-radius-full);--impdc-tag--button-border-radius: var(--impd-border-radius-full)}:host.impdc-tag--theme-outline{--impdc-tag--bg: var(--impd-color-white);--impdc-tag--border-color: var(--impd-color-gray-300);--impdc-tag--color: var(--impd-color-gray-600);--impdc-tag--button-bg-hover: var(--impd-color-gray-200);--impdc-tag--button-bg-active: var(--impd-color-gray-300)}:host.impdc-tag--theme-inverse{--impdc-tag--bg: var(--impd-color-gray-800);--impdc-tag--border-color: var(--impd-color-gray-800);--impdc-tag--color: var(--impd-color-gray-100);--impdc-tag--button-bg-hover: var(--impd-color-gray-600);--impdc-tag--button-bg-active: var(--impd-color-gray-500);--impdc-tag--button-color: var(--impd-color-gray-400);--impdc-tag--button-color-hover: var(--impd-color-gray-300)}.impdc-tag--text{text-align:center;padding-left:var(--impd-size-2);white-space:nowrap}.impdc-tag--text:only-child{padding-right:var(--impd-size-2)}.impdc-tag--button{display:inline-flex;align-items:center;justify-content:center;background-color:transparent;border-radius:var(--impdc-tag--button-border-radius);border:1px solid transparent;color:var(--impdc-tag--button-color);width:1.8rem;height:1.8rem;margin-left:var(--impd-size-0_5)}.impdc-tag--button:hover{background-color:var(--impdc-tag--button-bg-hover);color:var(--impdc-tag--button-color-hover)}.impdc-tag--button:active{background-color:var(--impdc-tag--button-bg-active);color:var(--impdc-tag--button-color-hover)}.impdc-tag--button:focus{outline:1px solid var(--impd-color-motion-blue-500)}.impdc-tag--button ::ng-deep impdc-icon>i{transform:translateY(4%)}\n"], dependencies: [{ kind: "ngmodule", type: IconModule }, { kind: "component", type: i1.IconComponent, selector: "impdc-icon, [impdc-icon]", inputs: ["name", "theme", "size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
73
|
+
}
|
|
74
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: TagComponent, decorators: [{
|
|
75
|
+
type: Component,
|
|
76
|
+
args: [{ standalone: true, imports: [IconModule], selector: 'impdc-tag', exportAs: 'impdcTag', inputs: [
|
|
77
|
+
{ name: 'disabled', transform: booleanAttribute },
|
|
78
|
+
{ name: 'tabIndex', transform: numberAttribute }
|
|
79
|
+
], host: {
|
|
80
|
+
'[attr.tabindex]': 'tabIndex'
|
|
81
|
+
}, changeDetection: ChangeDetectionStrategy.OnPush, template: "<span class=\"impdc-tag--text\"><ng-content></ng-content></span>\n@if (withButton) {\n<button\n type=\"button\"\n class=\"impdc-tag--button\"\n [disabled]=\"disabled\"\n (click)=\"handleButtonClick($event)\">\n <impdc-icon size=\"12\" [name]=\"buttonIconName\" [theme]=\"buttonIconTheme\" />\n</button>\n}\n", styles: [":host{--impdc-tag--bg: var(--impd-color-gray-200);--impdc-tag--border-color: var(--impd-color-gray-200);--impdc-tag--color: var(--impd-color-gray-800);--impdc-tag--button-border-radius: .3rem;--impdc-tag--button-bg-hover: var(--impd-color-gray-300);--impdc-tag--button-bg-active: var(--impd-color-gray-400);--impdc-tag--button-color: var(--impd-color-gray-500);--impdc-tag--button-color-hover: var(--impd-color-gray-600);--impdc-tag--border-radius: var(--impd-border-radius-default);--impdc-tag--font-size: var(--impd-font-size-xs);background-color:var(--impdc-tag--bg);color:var(--impdc-tag--color);display:inline-flex;flex-wrap:nowrap;align-items:center;justify-content:center;font-size:var(--impdc-tag--font-size);font-weight:var(--impd-font-weight-medium);line-height:var(--impd-size-4);height:var(--impd-size-5);border:1px solid var(--impdc-tag--border-color);border-radius:var(--impdc-tag--border-radius)}:host:focus{border-color:var(--impdc-tag--bg);outline:1px solid var(--impd-color-motion-blue-500)}:host.impdc-tag--rounded{--impdc-tag--border-radius: var(--impd-border-radius-full);--impdc-tag--button-border-radius: var(--impd-border-radius-full)}:host.impdc-tag--theme-outline{--impdc-tag--bg: var(--impd-color-white);--impdc-tag--border-color: var(--impd-color-gray-300);--impdc-tag--color: var(--impd-color-gray-600);--impdc-tag--button-bg-hover: var(--impd-color-gray-200);--impdc-tag--button-bg-active: var(--impd-color-gray-300)}:host.impdc-tag--theme-inverse{--impdc-tag--bg: var(--impd-color-gray-800);--impdc-tag--border-color: var(--impd-color-gray-800);--impdc-tag--color: var(--impd-color-gray-100);--impdc-tag--button-bg-hover: var(--impd-color-gray-600);--impdc-tag--button-bg-active: var(--impd-color-gray-500);--impdc-tag--button-color: var(--impd-color-gray-400);--impdc-tag--button-color-hover: var(--impd-color-gray-300)}.impdc-tag--text{text-align:center;padding-left:var(--impd-size-2);white-space:nowrap}.impdc-tag--text:only-child{padding-right:var(--impd-size-2)}.impdc-tag--button{display:inline-flex;align-items:center;justify-content:center;background-color:transparent;border-radius:var(--impdc-tag--button-border-radius);border:1px solid transparent;color:var(--impdc-tag--button-color);width:1.8rem;height:1.8rem;margin-left:var(--impd-size-0_5)}.impdc-tag--button:hover{background-color:var(--impdc-tag--button-bg-hover);color:var(--impdc-tag--button-color-hover)}.impdc-tag--button:active{background-color:var(--impdc-tag--button-bg-active);color:var(--impdc-tag--button-color-hover)}.impdc-tag--button:focus{outline:1px solid var(--impd-color-motion-blue-500)}.impdc-tag--button ::ng-deep impdc-icon>i{transform:translateY(4%)}\n"] }]
|
|
82
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
83
|
+
type: Attribute,
|
|
84
|
+
args: ['tabindex']
|
|
85
|
+
}] }], propDecorators: { theme: [{
|
|
86
|
+
type: Input
|
|
87
|
+
}], rounded: [{
|
|
88
|
+
type: HostBinding,
|
|
89
|
+
args: ['class.impdc-tag--rounded']
|
|
90
|
+
}, {
|
|
91
|
+
type: Input,
|
|
92
|
+
args: [{ transform: booleanAttribute }]
|
|
93
|
+
}], withButton: [{
|
|
94
|
+
type: Input,
|
|
95
|
+
args: [{ transform: booleanAttribute }]
|
|
96
|
+
}], buttonIcon: [{
|
|
97
|
+
type: Input
|
|
98
|
+
}], buttonClick: [{
|
|
99
|
+
type: Output
|
|
100
|
+
}], themeClass: [{
|
|
101
|
+
type: HostBinding,
|
|
102
|
+
args: ['class']
|
|
103
|
+
}] } });
|
|
104
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFnLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1jb21wb25lbnRzL3NyYy9saWIvdGFnL3RhZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ24tY29tcG9uZW50cy9zcmMvbGliL3RhZy90YWcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixXQUFXLEVBQ1gsS0FBSyxFQUNMLE1BQU0sRUFDTixnQkFBZ0IsRUFDaEIsZUFBZSxFQUNoQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRXJDLE9BQU8sRUFHTCxhQUFhLEVBQ2IsYUFBYSxFQUNkLE1BQU0sc0JBQXNCLENBQUM7OztBQUk5QixNQUFNLGlCQUFpQixHQUFHLGFBQWEsQ0FBQyxhQUFhLENBQUM7Q0FBUSxDQUFDLENBQUMsQ0FBQztBQUVqRTs7Ozs7O0dBTUc7QUFrQkgsTUFBTSxPQUFPLFlBQ1gsU0FBUSxpQkFBaUI7SUF5Q3pCLElBQ1csVUFBVTtRQUNuQixRQUFRLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDbEIsS0FBSyxTQUFTO2dCQUNaLE9BQU8sMEJBQTBCLENBQUM7WUFFcEMsS0FBSyxTQUFTO2dCQUNaLE9BQU8sMEJBQTBCLENBQUM7WUFFcEMsS0FBSyxTQUFTLENBQUM7WUFDZjtnQkFDRSxPQUFPLElBQUksQ0FBQztTQUNmO0lBQ0gsQ0FBQztJQUVELFlBQW1DLFFBQWlCO1FBQ2xELEtBQUssRUFBRSxDQUFDO1FBdERWOztXQUVHO1FBRUksVUFBSyxHQUFhLFNBQVMsQ0FBQztRQUVuQzs7V0FFRztRQUdJLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFFdkI7OztXQUdHO1FBRUksZUFBVSxHQUFHLEtBQUssQ0FBQztRQUUxQjs7O1dBR0c7UUFFSSxlQUFVLEdBRTRDO1lBQzNELElBQUksRUFBRSxPQUFPO1lBQ2IsS0FBSyxFQUFFLE9BQU87U0FDZixDQUFDO1FBRUY7O1dBRUc7UUFFYSxnQkFBVyxHQUF3QixJQUFJLFlBQVksRUFBUyxDQUFDO1FBbUIzRSxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCxJQUFjLGNBQWM7UUFDMUIsT0FBTyxPQUFPLElBQUksQ0FBQyxVQUFVLEtBQUssUUFBUTtZQUN4QyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVU7WUFDakIsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFjLGVBQWU7UUFDM0IsT0FBTyxPQUFPLElBQUksQ0FBQyxVQUFVLEtBQUssUUFBUTtZQUN4QyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLO1lBQ3ZCLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDZCxDQUFDO0lBRVMsaUJBQWlCLENBQUMsR0FBVTtRQUNwQyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDckIsR0FBRyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRXRCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLENBQUM7OEdBL0VVLFlBQVksa0JBeURBLFVBQVU7a0dBekR0QixZQUFZLDBGQVZVLGdCQUFnQixzQ0FDaEIsZUFBZSxtREF1QjVCLGdCQUFnQiw0Q0FPaEIsZ0JBQWdCLDhRQ3JFdEMsMFRBVUEsMnFGRHVCWSxVQUFVOzsyRkFlVCxZQUFZO2tCQWpCeEIsU0FBUztpQ0FDSSxJQUFJLFdBQ1AsQ0FBQyxVQUFVLENBQUMsWUFDWCxXQUFXLFlBQ1gsVUFBVSxVQUVaO3dCQUNOLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7d0JBQ2pELEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFO3FCQUNqRCxRQUNLO3dCQUNKLGlCQUFpQixFQUFFLFVBQVU7cUJBQzlCLG1CQUdnQix1QkFBdUIsQ0FBQyxNQUFNOzswQkEyRGxDLFNBQVM7MkJBQUMsVUFBVTt5Q0FqRDFCLEtBQUs7c0JBRFgsS0FBSztnQkFRQyxPQUFPO3NCQUZiLFdBQVc7dUJBQUMsMEJBQTBCOztzQkFDdEMsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFRL0IsVUFBVTtzQkFEaEIsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFRL0IsVUFBVTtzQkFEaEIsS0FBSztnQkFZVSxXQUFXO3NCQUQxQixNQUFNO2dCQUlJLFVBQVU7c0JBRHBCLFdBQVc7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEF0dHJpYnV0ZSxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0QmluZGluZyxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgbnVtYmVyQXR0cmlidXRlXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSWNvbk1vZHVsZSB9IGZyb20gJy4uL2ljb24nO1xuaW1wb3J0IHsgRm9udEF3ZXNvbWVJY29uLCBGb250QXdlc29tZUljb25UaGVtZSB9IGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICBDYW5EaXNhYmxlLFxuICBIYXNUYWJJbmRleCxcbiAgbWl4aW5EaXNhYmxlZCxcbiAgbWl4aW5UYWJJbmRleFxufSBmcm9tICcuLi9mb3JtLWZpZWxkL3NoYXJlZCc7XG5cbmV4cG9ydCB0eXBlIFRhZ1RoZW1lID0gJ2RlZmF1bHQnIHwgJ291dGxpbmUnIHwgJ2ludmVyc2UnO1xuXG5jb25zdCBfVGFnQ29tcG9uZW50QmFzZSA9IG1peGluVGFiSW5kZXgobWl4aW5EaXNhYmxlZChjbGFzcyB7fSkpO1xuXG4vKipcbiAqIFRhZ3MgYXJlIGludGVyYWN0aXZlIGVsZW1lbnRzIHRoYXQgY2FuIGJlIGFkZGVkIHRvIFVJIG9iamVjdHMgdG8gbGFiZWwsIGNhdGVnb3JpemUsIG9yZ2FuaXplLCBhbmQgZmlsdGVyLlxuICogVGhleSBjYW4gYmUgYWRkZWQgYW5kIHJlbW92ZWQgYnkgdXNlcnMuIFRhZ3MgYXJlIHVzZWQgaW4gbXVsdGktc2VsZWN0IGlucHV0cy5cbiAqXG4gKiBEb27igJl0IHVzZSBUYWdzIHRvIGNvbW11bmljYXRlIHRoZSBzdGF0dXMgb2YgYW4gb2JqZWN0IG9yIHRoZSByZXN1bHQgb2YgYW4gYWN0aW9uIChsaWtlIEVuYWJsZWQsIERlbGV0ZWQsXG4gKiBTdWJtaXR0ZWQsIEVycm9yLi4uKSDigJQgdXNlIGJhZGdlcyBpbnN0ZWFkLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0ljb25Nb2R1bGVdLFxuICBzZWxlY3RvcjogJ2ltcGRjLXRhZycsXG4gIGV4cG9ydEFzOiAnaW1wZGNUYWcnLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWlucHV0cy1tZXRhZGF0YS1wcm9wZXJ0eVxuICBpbnB1dHM6IFtcbiAgICB7IG5hbWU6ICdkaXNhYmxlZCcsIHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9LFxuICAgIHsgbmFtZTogJ3RhYkluZGV4JywgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfVxuICBdLFxuICBob3N0OiB7XG4gICAgJ1thdHRyLnRhYmluZGV4XSc6ICd0YWJJbmRleCdcbiAgfSxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhZy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi90YWcuY29tcG9uZW50LnNjc3MnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBUYWdDb21wb25lbnRcbiAgZXh0ZW5kcyBfVGFnQ29tcG9uZW50QmFzZVxuICBpbXBsZW1lbnRzIENhbkRpc2FibGUsIEhhc1RhYkluZGV4XG57XG4gIC8qKlxuICAgKiBDb2xvciB0aGVtZSB0byBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIHRoZSB0YWcuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgdGhlbWU6IFRhZ1RoZW1lID0gJ2RlZmF1bHQnO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVzZSBmdWxseSByb3VuZGVkIGJvcmRlcnMgZm9yIHRhZywgZ3JhbnRpbmcgYSBcInBpbGxcIi1saWtlIGFwcGVhcmFuY2UuXG4gICAqL1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmltcGRjLXRhZy0tcm91bmRlZCcpXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICBwdWJsaWMgcm91bmRlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBXaGVyZSB0byBpbmNsdWRlIGFuIGludGVyYWN0YWJsZSBidXR0b24gaW5zaWRlIG9mIHRoZSB0YWcsIHdob3NlIGludGVyYWN0aW9ucyBjYW4gYmUgbGlzdGVuZWRcbiAgICogZm9yIHZpYSB0aGUgYChidXR0b25DbGljaylgIGV2ZW50IG91dHB1dC5cbiAgICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICBwdWJsaWMgd2l0aEJ1dHRvbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBUaGUgRm9udEF3ZXNvbWUgaWNvbiB0byBiZSBkaXNwbGF5ZWQgaW5zaWRlIG9mIHRoZSBidXR0b24gd2hlbiBgd2l0aEJ1dHRvbmAgaXMgc2V0IHRvIGB0cnVlYC4gVmFsdWUgbWF5IGJlXG4gICAqIGp1c3QgYSBpY29uIG5hbWUsIG9yIG9wdGlvbmFsbHkgYW4gaWNvbiBuYW1lIGFuZCBzcGVjaWZpYyBGb250QXdlc29tZSB0aGVtZS9mYWNlLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGJ1dHRvbkljb246XG4gICAgfCBGb250QXdlc29tZUljb25cbiAgICB8IHsgbmFtZTogRm9udEF3ZXNvbWVJY29uOyB0aGVtZTogRm9udEF3ZXNvbWVJY29uVGhlbWUgfSA9IHtcbiAgICBuYW1lOiAndGltZXMnLFxuICAgIHRoZW1lOiAnbGlnaHQnXG4gIH07XG5cbiAgLyoqXG4gICAqIEV2ZW50IG91dHB1dCBmb3IgYnV0dG9uIGV2ZW50cyB0cmlnZ2VyZWQgd2hlbiBgd2l0aEJ1dHRvbmAgaXMgc2V0IHRvIGB0cnVlYC5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgcmVhZG9ubHkgYnV0dG9uQ2xpY2s6IEV2ZW50RW1pdHRlcjxFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50PigpO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICBwdWJsaWMgZ2V0IHRoZW1lQ2xhc3MoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgc3dpdGNoICh0aGlzLnRoZW1lKSB7XG4gICAgICBjYXNlICdvdXRsaW5lJzpcbiAgICAgICAgcmV0dXJuICdpbXBkYy10YWctLXRoZW1lLW91dGxpbmUnO1xuXG4gICAgICBjYXNlICdpbnZlcnNlJzpcbiAgICAgICAgcmV0dXJuICdpbXBkYy10YWctLXRoZW1lLWludmVyc2UnO1xuXG4gICAgICBjYXNlICdkZWZhdWx0JzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKEBBdHRyaWJ1dGUoJ3RhYmluZGV4JykgdGFiSW5kZXg/OiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMudGFiSW5kZXggPSBwYXJzZUludCh0YWJJbmRleCA/PyAnJykgfHwgMDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgYnV0dG9uSWNvbk5hbWUoKTogRm9udEF3ZXNvbWVJY29uIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMuYnV0dG9uSWNvbiA9PT0gJ3N0cmluZydcbiAgICAgID8gdGhpcy5idXR0b25JY29uXG4gICAgICA6IHRoaXMuYnV0dG9uSWNvbi5uYW1lO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBidXR0b25JY29uVGhlbWUoKTogRm9udEF3ZXNvbWVJY29uVGhlbWUge1xuICAgIHJldHVybiB0eXBlb2YgdGhpcy5idXR0b25JY29uICE9PSAnc3RyaW5nJ1xuICAgICAgPyB0aGlzLmJ1dHRvbkljb24udGhlbWVcbiAgICAgIDogJ3NvbGlkJztcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVCdXR0b25DbGljayhldnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgdGhpcy5idXR0b25DbGljay5lbWl0KGV2dCk7XG4gIH1cbn1cbiIsIjxzcGFuIGNsYXNzPVwiaW1wZGMtdGFnLS10ZXh0XCI+PG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50Pjwvc3Bhbj5cbkBpZiAod2l0aEJ1dHRvbikge1xuPGJ1dHRvblxuICB0eXBlPVwiYnV0dG9uXCJcbiAgY2xhc3M9XCJpbXBkYy10YWctLWJ1dHRvblwiXG4gIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gIChjbGljayk9XCJoYW5kbGVCdXR0b25DbGljaygkZXZlbnQpXCI+XG4gIDxpbXBkYy1pY29uIHNpemU9XCIxMlwiIFtuYW1lXT1cImJ1dHRvbkljb25OYW1lXCIgW3RoZW1lXT1cImJ1dHRvbkljb25UaGVtZVwiIC8+XG48L2J1dHRvbj5cbn1cbiJdfQ==
|