@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
63 lines • 23.4 kB
JavaScript
import { Component, Input, Output, EventEmitter } from '@angular/core';
import { DASHBOARD_THEME_CLASSES, WIDGET_HEADER_CLASSES } from './context-dashboard.model';
import { gettext } from '@c8y/ngx-components';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@angular/forms";
import * as i3 from "ngx-bootstrap/popover";
import * as i4 from "@c8y/ngx-components";
export class AppearanceSettingsComponent {
constructor() {
this.themeClass = 'dashboard-theme-light';
this.headerClass = 'panel-title-regular';
this.themeClassChange = new EventEmitter();
this.headerClassChange = new EventEmitter();
this.possibleStylingTheme = DASHBOARD_THEME_CLASSES;
this.possibleStylingHeader = WIDGET_HEADER_CLASSES;
this.columns = 1;
this.dashboardDefaultLabel = gettext('Dashboard default');
}
themeClassClick(value) {
value = this.resetToDefault(value, this.themeClass, this.defaultThemeClass);
this.themeClass = value;
this.themeClassChange.emit(value);
}
headerClassClick(value) {
value = this.resetToDefault(value, this.headerClass, this.defaultHeaderClass);
this.headerClass = value;
this.headerClassChange.emit(value);
}
resetToDefault(value, compareTo, defaultValue) {
if (defaultValue && value === compareTo) {
value = defaultValue;
}
return value;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppearanceSettingsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AppearanceSettingsComponent, selector: "c8y-appearance-settings", inputs: { themeClass: "themeClass", headerClass: "headerClass", defaultThemeClass: "defaultThemeClass", defaultHeaderClass: "defaultHeaderClass", dashboardSettings: "dashboardSettings", possibleStylingTheme: "possibleStylingTheme", possibleStylingHeader: "possibleStylingHeader", columns: "columns" }, outputs: { themeClassChange: "themeClassChange", headerClassChange: "headerClassChange" }, ngImport: i0, template: "<div class=\"row\">\n <div class=\"col-md-{{ 12 / columns }} col-xs-12\">\n <fieldset class=\"c8y-fieldset c8y-fieldset--lg\">\n <legend *ngIf=\"dashboardSettings\">{{ 'Default theme' | translate }}</legend>\n <legend *ngIf=\"!dashboardSettings\">{{ 'Theme' | translate }}</legend>\n <ul class=\"list-group\">\n <li\n class=\"list-group-item d-flex a-i-center p-l-0 p-r-0 fit-w\"\n *ngFor=\"let themeClassItem of possibleStylingTheme; let i = index\"\n >\n <div\n class=\"list-item-checkbox\"\n style=\"max-width: calc(100% - 24px)\"\n >\n <label class=\"c8y-radio\">\n <input\n name=\"content\"\n type=\"radio\"\n [id]=\"'groupradiocontentclass' + i\"\n [value]=\"themeClassItem.class\"\n [ngModel]=\"themeClass\"\n (click)=\"themeClassClick(themeClassItem.class)\"\n />\n <span></span>\n <span\n class=\"text-truncate\"\n title=\"{{ themeClassItem.label | translate }}{{\n themeClassItem.class === defaultThemeClass\n ? ' | ' + (dashboardDefaultLabel | translate)\n : ''\n }}\"\n >\n <span>{{ themeClassItem.label | translate }}</span>\n <br />\n <small\n class=\"text-muted\"\n *ngIf=\"themeClassItem.class === defaultThemeClass\"\n >\n {{ dashboardDefaultLabel | translate }}\n </small>\n </span>\n </label>\n </div>\n\n <button\n class=\"btn-help btn-help--sm m-l-auto\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ themeClassItem.description | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </li>\n </ul>\n </fieldset>\n </div>\n <div class=\"col-md-{{ 12 / columns }} col-xs-12\">\n <fieldset class=\"c8y-fieldset c8y-fieldset--lg\">\n <legend *ngIf=\"dashboardSettings\">\n {{ 'Default widget header style' | translate }}\n </legend>\n <legend *ngIf=\"!dashboardSettings\">\n {{ 'Widget header style' | translate }}\n </legend>\n <ul class=\"list-group\">\n <li\n class=\"list-group-item d-flex a-i-center p-l-0 p-r-0\"\n *ngFor=\"let headerClassItem of possibleStylingHeader; let i = index\"\n >\n <div\n class=\"list-item-checkbox\"\n style=\"max-width: calc(100% - 24px)\"\n >\n <label class=\"c8y-radio\">\n <input\n name=\"header\"\n type=\"radio\"\n [id]=\"'groupradioheaderclass' + i\"\n [value]=\"headerClassItem.class\"\n [ngModel]=\"headerClass\"\n (click)=\"headerClassClick(headerClassItem.class)\"\n />\n <span></span>\n <span\n class=\"text-truncate\"\n title=\"{{ headerClassItem.label | translate }}{{\n headerClassItem.class === defaultHeaderClass\n ? ' | ' + (dashboardDefaultLabel | translate)\n : ''\n }}\"\n >\n <span>{{ headerClassItem.label | translate }}</span>\n <br />\n <small\n class=\"text-muted\"\n *ngIf=\"headerClassItem.class === defaultHeaderClass\"\n >\n {{ dashboardDefaultLabel | translate }}\n </small>\n </span>\n </label>\n </div>\n <button\n class=\"btn-help btn-help--sm m-l-auto\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ headerClassItem.description | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </li>\n </ul>\n </fieldset>\n </div>\n <ng-content></ng-content>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.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: i2.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "pipe", type: i4.C8yTranslatePipe, name: "translate" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppearanceSettingsComponent, decorators: [{
type: Component,
args: [{ selector: 'c8y-appearance-settings', template: "<div class=\"row\">\n <div class=\"col-md-{{ 12 / columns }} col-xs-12\">\n <fieldset class=\"c8y-fieldset c8y-fieldset--lg\">\n <legend *ngIf=\"dashboardSettings\">{{ 'Default theme' | translate }}</legend>\n <legend *ngIf=\"!dashboardSettings\">{{ 'Theme' | translate }}</legend>\n <ul class=\"list-group\">\n <li\n class=\"list-group-item d-flex a-i-center p-l-0 p-r-0 fit-w\"\n *ngFor=\"let themeClassItem of possibleStylingTheme; let i = index\"\n >\n <div\n class=\"list-item-checkbox\"\n style=\"max-width: calc(100% - 24px)\"\n >\n <label class=\"c8y-radio\">\n <input\n name=\"content\"\n type=\"radio\"\n [id]=\"'groupradiocontentclass' + i\"\n [value]=\"themeClassItem.class\"\n [ngModel]=\"themeClass\"\n (click)=\"themeClassClick(themeClassItem.class)\"\n />\n <span></span>\n <span\n class=\"text-truncate\"\n title=\"{{ themeClassItem.label | translate }}{{\n themeClassItem.class === defaultThemeClass\n ? ' | ' + (dashboardDefaultLabel | translate)\n : ''\n }}\"\n >\n <span>{{ themeClassItem.label | translate }}</span>\n <br />\n <small\n class=\"text-muted\"\n *ngIf=\"themeClassItem.class === defaultThemeClass\"\n >\n {{ dashboardDefaultLabel | translate }}\n </small>\n </span>\n </label>\n </div>\n\n <button\n class=\"btn-help btn-help--sm m-l-auto\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ themeClassItem.description | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </li>\n </ul>\n </fieldset>\n </div>\n <div class=\"col-md-{{ 12 / columns }} col-xs-12\">\n <fieldset class=\"c8y-fieldset c8y-fieldset--lg\">\n <legend *ngIf=\"dashboardSettings\">\n {{ 'Default widget header style' | translate }}\n </legend>\n <legend *ngIf=\"!dashboardSettings\">\n {{ 'Widget header style' | translate }}\n </legend>\n <ul class=\"list-group\">\n <li\n class=\"list-group-item d-flex a-i-center p-l-0 p-r-0\"\n *ngFor=\"let headerClassItem of possibleStylingHeader; let i = index\"\n >\n <div\n class=\"list-item-checkbox\"\n style=\"max-width: calc(100% - 24px)\"\n >\n <label class=\"c8y-radio\">\n <input\n name=\"header\"\n type=\"radio\"\n [id]=\"'groupradioheaderclass' + i\"\n [value]=\"headerClassItem.class\"\n [ngModel]=\"headerClass\"\n (click)=\"headerClassClick(headerClassItem.class)\"\n />\n <span></span>\n <span\n class=\"text-truncate\"\n title=\"{{ headerClassItem.label | translate }}{{\n headerClassItem.class === defaultHeaderClass\n ? ' | ' + (dashboardDefaultLabel | translate)\n : ''\n }}\"\n >\n <span>{{ headerClassItem.label | translate }}</span>\n <br />\n <small\n class=\"text-muted\"\n *ngIf=\"headerClassItem.class === defaultHeaderClass\"\n >\n {{ dashboardDefaultLabel | translate }}\n </small>\n </span>\n </label>\n </div>\n <button\n class=\"btn-help btn-help--sm m-l-auto\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ headerClassItem.description | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </li>\n </ul>\n </fieldset>\n </div>\n <ng-content></ng-content>\n</div>\n" }]
}], propDecorators: { themeClass: [{
type: Input
}], headerClass: [{
type: Input
}], defaultThemeClass: [{
type: Input
}], defaultHeaderClass: [{
type: Input
}], dashboardSettings: [{
type: Input
}], themeClassChange: [{
type: Output
}], headerClassChange: [{
type: Output
}], possibleStylingTheme: [{
type: Input
}], possibleStylingHeader: [{
type: Input
}], columns: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwZWFyYW5jZS1zZXR0aW5ncy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9jb250ZXh0LWRhc2hib2FyZC9hcHBlYXJhbmNlLXNldHRpbmdzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uL2NvbnRleHQtZGFzaGJvYXJkL2FwcGVhcmFuY2Utc2V0dGluZ3MuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7OztBQU05QyxNQUFNLE9BQU8sMkJBQTJCO0lBSnhDO1FBTUUsZUFBVSxHQUFHLHVCQUF1QixDQUFDO1FBRXJDLGdCQUFXLEdBQUcscUJBQXFCLENBQUM7UUFRcEMscUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUU5QyxzQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBRy9DLHlCQUFvQixHQUFHLHVCQUF1QixDQUFDO1FBRy9DLDBCQUFxQixHQUFHLHFCQUFxQixDQUFDO1FBRzlDLFlBQU8sR0FBVSxDQUFDLENBQUM7UUFFbkIsMEJBQXFCLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUM7S0FvQnREO0lBbEJDLGVBQWUsQ0FBQyxLQUFLO1FBQ25CLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELGdCQUFnQixDQUFDLEtBQUs7UUFDcEIsS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDOUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRU8sY0FBYyxDQUFDLEtBQWEsRUFBRSxTQUFpQixFQUFFLFlBQW9CO1FBQzNFLElBQUksWUFBWSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN4QyxLQUFLLEdBQUcsWUFBWSxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7K0dBNUNVLDJCQUEyQjttR0FBM0IsMkJBQTJCLHdjQ1J4Qyw2d0lBc0hBOzs0RkQ5R2EsMkJBQTJCO2tCQUp2QyxTQUFTOytCQUNFLHlCQUF5Qjs4QkFLbkMsVUFBVTtzQkFEVCxLQUFLO2dCQUdOLFdBQVc7c0JBRFYsS0FBSztnQkFHTixpQkFBaUI7c0JBRGhCLEtBQUs7Z0JBR04sa0JBQWtCO3NCQURqQixLQUFLO2dCQUdOLGlCQUFpQjtzQkFEaEIsS0FBSztnQkFHTixnQkFBZ0I7c0JBRGYsTUFBTTtnQkFHUCxpQkFBaUI7c0JBRGhCLE1BQU07Z0JBSVAsb0JBQW9CO3NCQURuQixLQUFLO2dCQUlOLHFCQUFxQjtzQkFEcEIsS0FBSztnQkFJTixPQUFPO3NCQUROLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgREFTSEJPQVJEX1RIRU1FX0NMQVNTRVMsIFdJREdFVF9IRUFERVJfQ0xBU1NFUyB9IGZyb20gJy4vY29udGV4dC1kYXNoYm9hcmQubW9kZWwnO1xuaW1wb3J0IHsgZ2V0dGV4dCB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktYXBwZWFyYW5jZS1zZXR0aW5ncycsXG4gIHRlbXBsYXRlVXJsOiAnLi9hcHBlYXJhbmNlLXNldHRpbmdzLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBBcHBlYXJhbmNlU2V0dGluZ3NDb21wb25lbnQge1xuICBASW5wdXQoKVxuICB0aGVtZUNsYXNzID0gJ2Rhc2hib2FyZC10aGVtZS1saWdodCc7XG4gIEBJbnB1dCgpXG4gIGhlYWRlckNsYXNzID0gJ3BhbmVsLXRpdGxlLXJlZ3VsYXInO1xuICBASW5wdXQoKVxuICBkZWZhdWx0VGhlbWVDbGFzczogc3RyaW5nO1xuICBASW5wdXQoKVxuICBkZWZhdWx0SGVhZGVyQ2xhc3M6IHN0cmluZztcbiAgQElucHV0KClcbiAgZGFzaGJvYXJkU2V0dGluZ3M6IGJvb2xlYW47XG4gIEBPdXRwdXQoKVxuICB0aGVtZUNsYXNzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKVxuICBoZWFkZXJDbGFzc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIEBJbnB1dCgpXG4gIHBvc3NpYmxlU3R5bGluZ1RoZW1lID0gREFTSEJPQVJEX1RIRU1FX0NMQVNTRVM7XG5cbiAgQElucHV0KClcbiAgcG9zc2libGVTdHlsaW5nSGVhZGVyID0gV0lER0VUX0hFQURFUl9DTEFTU0VTO1xuXG4gIEBJbnB1dCgpXG4gIGNvbHVtbnM6IDEgfCAzID0gMTtcblxuICBkYXNoYm9hcmREZWZhdWx0TGFiZWwgPSBnZXR0ZXh0KCdEYXNoYm9hcmQgZGVmYXVsdCcpO1xuXG4gIHRoZW1lQ2xhc3NDbGljayh2YWx1ZSkge1xuICAgIHZhbHVlID0gdGhpcy5yZXNldFRvRGVmYXVsdCh2YWx1ZSwgdGhpcy50aGVtZUNsYXNzLCB0aGlzLmRlZmF1bHRUaGVtZUNsYXNzKTtcbiAgICB0aGlzLnRoZW1lQ2xhc3MgPSB2YWx1ZTtcbiAgICB0aGlzLnRoZW1lQ2xhc3NDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBoZWFkZXJDbGFzc0NsaWNrKHZhbHVlKSB7XG4gICAgdmFsdWUgPSB0aGlzLnJlc2V0VG9EZWZhdWx0KHZhbHVlLCB0aGlzLmhlYWRlckNsYXNzLCB0aGlzLmRlZmF1bHRIZWFkZXJDbGFzcyk7XG4gICAgdGhpcy5oZWFkZXJDbGFzcyA9IHZhbHVlO1xuICAgIHRoaXMuaGVhZGVyQ2xhc3NDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0VG9EZWZhdWx0KHZhbHVlOiBzdHJpbmcsIGNvbXBhcmVUbzogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IHN0cmluZykge1xuICAgIGlmIChkZWZhdWx0VmFsdWUgJiYgdmFsdWUgPT09IGNvbXBhcmVUbykge1xuICAgICAgdmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInJvd1wiPlxuICA8ZGl2IGNsYXNzPVwiY29sLW1kLXt7IDEyIC8gY29sdW1ucyB9fSBjb2wteHMtMTJcIj5cbiAgICA8ZmllbGRzZXQgY2xhc3M9XCJjOHktZmllbGRzZXQgYzh5LWZpZWxkc2V0LS1sZ1wiPlxuICAgICAgPGxlZ2VuZCAqbmdJZj1cImRhc2hib2FyZFNldHRpbmdzXCI+e3sgJ0RlZmF1bHQgdGhlbWUnIHwgdHJhbnNsYXRlIH19PC9sZWdlbmQ+XG4gICAgICA8bGVnZW5kICpuZ0lmPVwiIWRhc2hib2FyZFNldHRpbmdzXCI+e3sgJ1RoZW1lJyB8IHRyYW5zbGF0ZSB9fTwvbGVnZW5kPlxuICAgICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cFwiPlxuICAgICAgICA8bGlcbiAgICAgICAgICBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBkLWZsZXggYS1pLWNlbnRlciBwLWwtMCBwLXItMCBmaXQtd1wiXG4gICAgICAgICAgKm5nRm9yPVwibGV0IHRoZW1lQ2xhc3NJdGVtIG9mIHBvc3NpYmxlU3R5bGluZ1RoZW1lOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwibGlzdC1pdGVtLWNoZWNrYm94XCJcbiAgICAgICAgICAgIHN0eWxlPVwibWF4LXdpZHRoOiBjYWxjKDEwMCUgLSAyNHB4KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYzh5LXJhZGlvXCI+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIG5hbWU9XCJjb250ZW50XCJcbiAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIlxuICAgICAgICAgICAgICAgIFtpZF09XCInZ3JvdXByYWRpb2NvbnRlbnRjbGFzcycgKyBpXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwidGhlbWVDbGFzc0l0ZW0uY2xhc3NcIlxuICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInRoZW1lQ2xhc3NcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ0aGVtZUNsYXNzQ2xpY2sodGhlbWVDbGFzc0l0ZW0uY2xhc3MpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyB0aGVtZUNsYXNzSXRlbS5sYWJlbCB8IHRyYW5zbGF0ZSB9fXt7XG4gICAgICAgICAgICAgICAgICB0aGVtZUNsYXNzSXRlbS5jbGFzcyA9PT0gZGVmYXVsdFRoZW1lQ2xhc3NcbiAgICAgICAgICAgICAgICAgICAgPyAnIHwgJyArIChkYXNoYm9hcmREZWZhdWx0TGFiZWwgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyB0aGVtZUNsYXNzSXRlbS5sYWJlbCB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgICAgICA8c21hbGxcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1tdXRlZFwiXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cInRoZW1lQ2xhc3NJdGVtLmNsYXNzID09PSBkZWZhdWx0VGhlbWVDbGFzc1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgZGFzaGJvYXJkRGVmYXVsdExhYmVsIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwiYnRuLWhlbHAgYnRuLWhlbHAtLXNtIG0tbC1hdXRvXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0hlbHAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIHBvcG92ZXI9XCJ7eyB0aGVtZUNsYXNzSXRlbS5kZXNjcmlwdGlvbiB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICBwbGFjZW1lbnQ9XCJyaWdodFwiXG4gICAgICAgICAgICB0cmlnZ2Vycz1cImZvY3VzXCJcbiAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICA8L2xpPlxuICAgICAgPC91bD5cbiAgICA8L2ZpZWxkc2V0PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNvbC1tZC17eyAxMiAvIGNvbHVtbnMgfX0gY29sLXhzLTEyXCI+XG4gICAgPGZpZWxkc2V0IGNsYXNzPVwiYzh5LWZpZWxkc2V0IGM4eS1maWVsZHNldC0tbGdcIj5cbiAgICAgIDxsZWdlbmQgKm5nSWY9XCJkYXNoYm9hcmRTZXR0aW5nc1wiPlxuICAgICAgICB7eyAnRGVmYXVsdCB3aWRnZXQgaGVhZGVyIHN0eWxlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9sZWdlbmQ+XG4gICAgICA8bGVnZW5kICpuZ0lmPVwiIWRhc2hib2FyZFNldHRpbmdzXCI+XG4gICAgICAgIHt7ICdXaWRnZXQgaGVhZGVyIHN0eWxlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9sZWdlbmQ+XG4gICAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwXCI+XG4gICAgICAgIDxsaVxuICAgICAgICAgIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGQtZmxleCBhLWktY2VudGVyIHAtbC0wIHAtci0wXCJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgaGVhZGVyQ2xhc3NJdGVtIG9mIHBvc3NpYmxlU3R5bGluZ0hlYWRlcjsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImxpc3QtaXRlbS1jaGVja2JveFwiXG4gICAgICAgICAgICBzdHlsZT1cIm1heC13aWR0aDogY2FsYygxMDAlIC0gMjRweClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImM4eS1yYWRpb1wiPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBuYW1lPVwiaGVhZGVyXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIlxuICAgICAgICAgICAgICAgIFtpZF09XCInZ3JvdXByYWRpb2hlYWRlcmNsYXNzJyArIGlcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJoZWFkZXJDbGFzc0l0ZW0uY2xhc3NcIlxuICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImhlYWRlckNsYXNzXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGVhZGVyQ2xhc3NDbGljayhoZWFkZXJDbGFzc0l0ZW0uY2xhc3MpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyBoZWFkZXJDbGFzc0l0ZW0ubGFiZWwgfCB0cmFuc2xhdGUgfX17e1xuICAgICAgICAgICAgICAgICAgaGVhZGVyQ2xhc3NJdGVtLmNsYXNzID09PSBkZWZhdWx0SGVhZGVyQ2xhc3NcbiAgICAgICAgICAgICAgICAgICAgPyAnIHwgJyArIChkYXNoYm9hcmREZWZhdWx0TGFiZWwgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBoZWFkZXJDbGFzc0l0ZW0ubGFiZWwgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPGJyIC8+XG4gICAgICAgICAgICAgICAgPHNtYWxsXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtbXV0ZWRcIlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJoZWFkZXJDbGFzc0l0ZW0uY2xhc3MgPT09IGRlZmF1bHRIZWFkZXJDbGFzc1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgZGFzaGJvYXJkRGVmYXVsdExhYmVsIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cImJ0bi1oZWxwIGJ0bi1oZWxwLS1zbSBtLWwtYXV0b1wiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidIZWxwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBwb3BvdmVyPVwie3sgaGVhZGVyQ2xhc3NJdGVtLmRlc2NyaXB0aW9uIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIHBsYWNlbWVudD1cInJpZ2h0XCJcbiAgICAgICAgICAgIHRyaWdnZXJzPVwiZm9jdXNcIlxuICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIDwvbGk+XG4gICAgICA8L3VsPlxuICAgIDwvZmllbGRzZXQ+XG4gIDwvZGl2PlxuICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG48L2Rpdj5cbiJdfQ==