UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

68 lines 25.6 kB
import { CdkStep } from '@angular/cdk/stepper'; import { Component } from '@angular/core'; import { C8yStepper } from '../stepper/stepper.component'; import { SetupComponent } from './setup.component'; import { gettext } from '../i18n/gettext'; import * as i0 from "@angular/core"; import * as i1 from "../stepper/stepper.component"; import * as i2 from "@angular/cdk/stepper"; import * as i3 from "./setup.component"; import * as i4 from "../common/icon.directive"; import * as i5 from "../i18n/c8y-translate.directive"; import * as i6 from "@angular/common"; import * as i7 from "../common/operation-result.component"; import * as i8 from "../i18n/c8y-translate.pipe"; export class SetupCompletedComponent { constructor(stepper, step, setup) { this.stepper = stepper; this.step = step; this.setup = setup; this.status = 'done'; this.STEP_LABEL = gettext('Step'); this.isVerified = false; } ngOnInit() { this.stepperSelectionChangeSubscription = this.stepper.selectionChange.subscribe(({ selectedIndex }) => { this.verify(selectedIndex); }); } ngOnDestroy() { this.stepperSelectionChangeSubscription.unsubscribe(); } verify(selectedIndex) { const isLastStep = this.stepper.steps.length - 1 === selectedIndex; if (isLastStep || this.isVerified) { // set the last step to completed this.getOverallStatus(); this.setup.verify(); this.isVerified = true; } } start() { this.setup.finish(); } back() { this.stepper.previous(); } gotoStep(index) { this.stepper.selectedIndex = index; } getOverallStatus() { const validSteps = this.setup.steps.slice(0, this.setup.steps.length - 1); this.status = 'done'; if (validSteps.find(step => !step.completed && step.required)) { this.status = 'error'; } else if (validSteps.find(step => !step.completed && !step.required)) { this.status = 'warning'; } this.step.state = this.status; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SetupCompletedComponent, deps: [{ token: i1.C8yStepper }, { token: i2.CdkStep }, { token: i3.SetupComponent }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SetupCompletedComponent, selector: "c8y-setup-completed", host: { classAttribute: "d-contents" }, ngImport: i0, template: "<div class=\"container-fluid flex-no-shrink fit-w\">\n <div class=\"row separator-bottom\">\n <div class=\"col-md-8 col-md-offset-2 col-lg-6 col-lg-offset-3 p-t-24 p-l-16 p-r-16\">\n <h3 translate class=\"text-medium l-h-base\" data-cy=\"c8y-setup--completed-header-title\">Summary</h3>\n <p translate class=\"lead text-normal p-t-8 p-b-8\">\n Verify the setup result. If any step is not finished but required, you need to ensure that\n you have finished the step.\n </p>\n </div>\n </div>\n</div>\n<div class=\"inner-scroll flex-grow\">\n <div class=\"container-fluid fit-w p-t-16\">\n <div class=\"row\">\n <div class=\"col-md-8 col-md-offset-2 col-lg-6 col-lg-offset-3\">\n <div class=\"text-center\" [ngSwitch]=\"status\">\n <c8y-operation-result\n *ngSwitchCase=\"'done'\"\n text=\"{{ 'Setup completed' | translate }}\"\n [size]=\"120\"\n [vertical]=\"true\"\n type=\"success\"\n ></c8y-operation-result>\n <c8y-operation-result\n *ngSwitchCase=\"'warning'\"\n text=\"{{ 'Setup completed with warnings' | translate }}\"\n [size]=\"120\"\n [vertical]=\"true\"\n type=\"warning\"\n ></c8y-operation-result>\n <c8y-operation-result\n *ngSwitchCase=\"'error'\"\n text=\"{{ 'Setup not completed' | translate }}\"\n [size]=\"120\"\n [vertical]=\"true\"\n type=\"error\"\n ></c8y-operation-result>\n </div>\n <ul class=\"list-unstyled m-t-16 separator-top\">\n <li\n class=\"p-t-4 p-b-4 d-flex a-i-center separator-bottom text-nowrap l-h-1\"\n *ngFor=\"let step of setup.steps.slice(0, setup.steps.length - 1)\"\n (click)=\"gotoStep(step.index)\"\n style=\"cursor: pointer\"\n >\n <span *ngIf=\"step.label\">\n <span\n class=\"dot small m-r-4 l-h-1\"\n [ngClass]=\"{\n 'dot-success': step.completed,\n 'dot-error': !step.completed && step.required,\n 'dot-warning': !step.completed && !step.required\n }\"\n >\n {{ step.index + 1 }}\n </span>\n {{ step.label || (STEP_LABEL | translate) + ' ' }}\n </span>\n <span *ngIf=\"!step.label\">\n <span translate>Step</span>\n {{ ' ' + (step.index + 1) }}\n </span>\n <span class=\"m-l-auto icon-20 l-h-1\">\n <i\n *ngIf=\"step.completed\"\n [c8yIcon]=\"'success'\"\n class=\"text-success\"\n [title]=\"'Completed' | translate\"\n ></i>\n <i\n *ngIf=\"!step.completed && step.required\"\n [c8yIcon]=\"'error'\"\n class=\"text-danger\"\n [title]=\"\n 'Not completed and required. Go to the step and fulfill the setup.' | translate\n \"\n ></i>\n <i\n *ngIf=\"!step.completed && !step.required\"\n [c8yIcon]=\"'warning'\"\n class=\"text-warning\"\n [title]=\"'This step was not completed but it is also not required.' | translate\"\n ></i>\n </span>\n </li>\n </ul>\n </div>\n </div>\n </div>\n</div>\n<div class=\"card-footer separator d-flex j-c-center\">\n <button\n translate\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"back()\"\n *ngIf=\"stepper.selectedIndex !== 0\"\n [disabled]=\"\n setup.currentSetupState === setup.setupState.FINALIZING ||\n setup.currentSetupState === setup.setupState.RELOADING\n \"\n >\n Back\n </button>\n <button\n class=\"btn btn-primary\"\n type=\"button\"\n data-cy=\"c8y-setup-completed--done-button\"\n (click)=\"start()\"\n [disabled]=\"\n status === 'error' ||\n setup.currentSetupState === setup.setupState.FINALIZING ||\n setup.currentSetupState === setup.setupState.RELOADING\n \"\n [ngClass]=\"{\n 'btn-pending':\n setup.currentSetupState === setup.setupState.FINALIZING ||\n setup.currentSetupState === setup.setupState.RELOADING\n }\"\n >\n <span *ngIf=\"setup.currentSetupState === setup.setupState.WIZARD\" translate>\n Save and reload\n </span>\n <span *ngIf=\"setup.currentSetupState === setup.setupState.FINALIZING\" translate>\n Getting things ready\u2026\n </span>\n <span *ngIf=\"setup.currentSetupState === setup.setupState.RELOADING\" translate>\n Done. Reloading the application.\n </span>\n </button>\n</div>\n", dependencies: [{ kind: "directive", type: i4.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i5.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i6.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i7.OperationResultComponent, selector: "c8y-operation-result", inputs: ["text", "vertical", "size", "type"] }, { kind: "pipe", type: i8.C8yTranslatePipe, name: "translate" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SetupCompletedComponent, decorators: [{ type: Component, args: [{ selector: 'c8y-setup-completed', host: { class: 'd-contents' }, template: "<div class=\"container-fluid flex-no-shrink fit-w\">\n <div class=\"row separator-bottom\">\n <div class=\"col-md-8 col-md-offset-2 col-lg-6 col-lg-offset-3 p-t-24 p-l-16 p-r-16\">\n <h3 translate class=\"text-medium l-h-base\" data-cy=\"c8y-setup--completed-header-title\">Summary</h3>\n <p translate class=\"lead text-normal p-t-8 p-b-8\">\n Verify the setup result. If any step is not finished but required, you need to ensure that\n you have finished the step.\n </p>\n </div>\n </div>\n</div>\n<div class=\"inner-scroll flex-grow\">\n <div class=\"container-fluid fit-w p-t-16\">\n <div class=\"row\">\n <div class=\"col-md-8 col-md-offset-2 col-lg-6 col-lg-offset-3\">\n <div class=\"text-center\" [ngSwitch]=\"status\">\n <c8y-operation-result\n *ngSwitchCase=\"'done'\"\n text=\"{{ 'Setup completed' | translate }}\"\n [size]=\"120\"\n [vertical]=\"true\"\n type=\"success\"\n ></c8y-operation-result>\n <c8y-operation-result\n *ngSwitchCase=\"'warning'\"\n text=\"{{ 'Setup completed with warnings' | translate }}\"\n [size]=\"120\"\n [vertical]=\"true\"\n type=\"warning\"\n ></c8y-operation-result>\n <c8y-operation-result\n *ngSwitchCase=\"'error'\"\n text=\"{{ 'Setup not completed' | translate }}\"\n [size]=\"120\"\n [vertical]=\"true\"\n type=\"error\"\n ></c8y-operation-result>\n </div>\n <ul class=\"list-unstyled m-t-16 separator-top\">\n <li\n class=\"p-t-4 p-b-4 d-flex a-i-center separator-bottom text-nowrap l-h-1\"\n *ngFor=\"let step of setup.steps.slice(0, setup.steps.length - 1)\"\n (click)=\"gotoStep(step.index)\"\n style=\"cursor: pointer\"\n >\n <span *ngIf=\"step.label\">\n <span\n class=\"dot small m-r-4 l-h-1\"\n [ngClass]=\"{\n 'dot-success': step.completed,\n 'dot-error': !step.completed && step.required,\n 'dot-warning': !step.completed && !step.required\n }\"\n >\n {{ step.index + 1 }}\n </span>\n {{ step.label || (STEP_LABEL | translate) + ' ' }}\n </span>\n <span *ngIf=\"!step.label\">\n <span translate>Step</span>\n {{ ' ' + (step.index + 1) }}\n </span>\n <span class=\"m-l-auto icon-20 l-h-1\">\n <i\n *ngIf=\"step.completed\"\n [c8yIcon]=\"'success'\"\n class=\"text-success\"\n [title]=\"'Completed' | translate\"\n ></i>\n <i\n *ngIf=\"!step.completed && step.required\"\n [c8yIcon]=\"'error'\"\n class=\"text-danger\"\n [title]=\"\n 'Not completed and required. Go to the step and fulfill the setup.' | translate\n \"\n ></i>\n <i\n *ngIf=\"!step.completed && !step.required\"\n [c8yIcon]=\"'warning'\"\n class=\"text-warning\"\n [title]=\"'This step was not completed but it is also not required.' | translate\"\n ></i>\n </span>\n </li>\n </ul>\n </div>\n </div>\n </div>\n</div>\n<div class=\"card-footer separator d-flex j-c-center\">\n <button\n translate\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"back()\"\n *ngIf=\"stepper.selectedIndex !== 0\"\n [disabled]=\"\n setup.currentSetupState === setup.setupState.FINALIZING ||\n setup.currentSetupState === setup.setupState.RELOADING\n \"\n >\n Back\n </button>\n <button\n class=\"btn btn-primary\"\n type=\"button\"\n data-cy=\"c8y-setup-completed--done-button\"\n (click)=\"start()\"\n [disabled]=\"\n status === 'error' ||\n setup.currentSetupState === setup.setupState.FINALIZING ||\n setup.currentSetupState === setup.setupState.RELOADING\n \"\n [ngClass]=\"{\n 'btn-pending':\n setup.currentSetupState === setup.setupState.FINALIZING ||\n setup.currentSetupState === setup.setupState.RELOADING\n }\"\n >\n <span *ngIf=\"setup.currentSetupState === setup.setupState.WIZARD\" translate>\n Save and reload\n </span>\n <span *ngIf=\"setup.currentSetupState === setup.setupState.FINALIZING\" translate>\n Getting things ready\u2026\n </span>\n <span *ngIf=\"setup.currentSetupState === setup.setupState.RELOADING\" translate>\n Done. Reloading the application.\n </span>\n </button>\n</div>\n" }] }], ctorParameters: () => [{ type: i1.C8yStepper }, { type: i2.CdkStep }, { type: i3.SetupComponent }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXAtY29tcGxldGVkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvc2V0dXAvc2V0dXAtY29tcGxldGVkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL2NvcmUvc2V0dXAvc2V0dXAtY29tcGxldGVkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7OztBQU8xQyxNQUFNLE9BQU8sdUJBQXVCO0lBTWxDLFlBQW1CLE9BQW1CLEVBQVMsSUFBYSxFQUFTLEtBQXFCO1FBQXZFLFlBQU8sR0FBUCxPQUFPLENBQVk7UUFBUyxTQUFJLEdBQUosSUFBSSxDQUFTO1FBQVMsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUFMMUYsV0FBTSxHQUFpQyxNQUFNLENBQUM7UUFDckMsZUFBVSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QixlQUFVLEdBQUcsS0FBSyxDQUFDO0lBR2tFLENBQUM7SUFFOUYsUUFBUTtRQUNOLElBQUksQ0FBQyxrQ0FBa0MsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQzlFLENBQUMsRUFBRSxhQUFhLEVBQUUsRUFBRSxFQUFFO1lBQ3BCLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDN0IsQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN4RCxDQUFDO0lBRUQsTUFBTSxDQUFDLGFBQWE7UUFDbEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsS0FBSyxhQUFhLENBQUM7UUFDbkUsSUFBSSxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2xDLGlDQUFpQztZQUNqQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSztRQUNILElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQUk7UUFDRixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxRQUFRLENBQUMsS0FBSztRQUNaLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUNyQyxDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFFLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUM5RCxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQztRQUN4QixDQUFDO2FBQU0sSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDdEUsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7UUFDMUIsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDaEMsQ0FBQzsrR0FuRFUsdUJBQXVCO21HQUF2Qix1QkFBdUIsbUdDWnBDLHN3SkFtSUE7OzRGRHZIYSx1QkFBdUI7a0JBTG5DLFNBQVM7K0JBQ0UscUJBQXFCLFFBRXpCLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENka1N0ZXAgfSBmcm9tICdAYW5ndWxhci9jZGsvc3RlcHBlcic7XG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDOHlTdGVwcGVyIH0gZnJvbSAnLi4vc3RlcHBlci9zdGVwcGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZXR1cENvbXBvbmVudCB9IGZyb20gJy4vc2V0dXAuY29tcG9uZW50JztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZ2V0dGV4dCB9IGZyb20gJy4uL2kxOG4vZ2V0dGV4dCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1zZXR1cC1jb21wbGV0ZWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vc2V0dXAtY29tcGxldGVkLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDogeyBjbGFzczogJ2QtY29udGVudHMnIH1cbn0pXG5leHBvcnQgY2xhc3MgU2V0dXBDb21wbGV0ZWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHN0YXR1czogJ2RvbmUnIHwgJ3dhcm5pbmcnIHwgJ2Vycm9yJyA9ICdkb25lJztcbiAgcmVhZG9ubHkgU1RFUF9MQUJFTCA9IGdldHRleHQoJ1N0ZXAnKTtcbiAgcHJpdmF0ZSBpc1ZlcmlmaWVkID0gZmFsc2U7XG4gIHByaXZhdGUgc3RlcHBlclNlbGVjdGlvbkNoYW5nZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBzdGVwcGVyOiBDOHlTdGVwcGVyLCBwdWJsaWMgc3RlcDogQ2RrU3RlcCwgcHVibGljIHNldHVwOiBTZXR1cENvbXBvbmVudCkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnN0ZXBwZXJTZWxlY3Rpb25DaGFuZ2VTdWJzY3JpcHRpb24gPSB0aGlzLnN0ZXBwZXIuc2VsZWN0aW9uQ2hhbmdlLnN1YnNjcmliZShcbiAgICAgICh7IHNlbGVjdGVkSW5kZXggfSkgPT4ge1xuICAgICAgICB0aGlzLnZlcmlmeShzZWxlY3RlZEluZGV4KTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdGVwcGVyU2VsZWN0aW9uQ2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICB2ZXJpZnkoc2VsZWN0ZWRJbmRleCkge1xuICAgIGNvbnN0IGlzTGFzdFN0ZXAgPSB0aGlzLnN0ZXBwZXIuc3RlcHMubGVuZ3RoIC0gMSA9PT0gc2VsZWN0ZWRJbmRleDtcbiAgICBpZiAoaXNMYXN0U3RlcCB8fCB0aGlzLmlzVmVyaWZpZWQpIHtcbiAgICAgIC8vIHNldCB0aGUgbGFzdCBzdGVwIHRvIGNvbXBsZXRlZFxuICAgICAgdGhpcy5nZXRPdmVyYWxsU3RhdHVzKCk7XG4gICAgICB0aGlzLnNldHVwLnZlcmlmeSgpO1xuICAgICAgdGhpcy5pc1ZlcmlmaWVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBzdGFydCgpIHtcbiAgICB0aGlzLnNldHVwLmZpbmlzaCgpO1xuICB9XG5cbiAgYmFjaygpIHtcbiAgICB0aGlzLnN0ZXBwZXIucHJldmlvdXMoKTtcbiAgfVxuXG4gIGdvdG9TdGVwKGluZGV4KSB7XG4gICAgdGhpcy5zdGVwcGVyLnNlbGVjdGVkSW5kZXggPSBpbmRleDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3ZlcmFsbFN0YXR1cygpIHtcbiAgICBjb25zdCB2YWxpZFN0ZXBzID0gdGhpcy5zZXR1cC5zdGVwcy5zbGljZSgwLCB0aGlzLnNldHVwLnN0ZXBzLmxlbmd0aCAtIDEpO1xuICAgIHRoaXMuc3RhdHVzID0gJ2RvbmUnO1xuICAgIGlmICh2YWxpZFN0ZXBzLmZpbmQoc3RlcCA9PiAhc3RlcC5jb21wbGV0ZWQgJiYgc3RlcC5yZXF1aXJlZCkpIHtcbiAgICAgIHRoaXMuc3RhdHVzID0gJ2Vycm9yJztcbiAgICB9IGVsc2UgaWYgKHZhbGlkU3RlcHMuZmluZChzdGVwID0+ICFzdGVwLmNvbXBsZXRlZCAmJiAhc3RlcC5yZXF1aXJlZCkpIHtcbiAgICAgIHRoaXMuc3RhdHVzID0gJ3dhcm5pbmcnO1xuICAgIH1cbiAgICB0aGlzLnN0ZXAuc3RhdGUgPSB0aGlzLnN0YXR1cztcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZCBmbGV4LW5vLXNocmluayBmaXQtd1wiPlxuICA8ZGl2IGNsYXNzPVwicm93IHNlcGFyYXRvci1ib3R0b21cIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTggY29sLW1kLW9mZnNldC0yIGNvbC1sZy02IGNvbC1sZy1vZmZzZXQtMyBwLXQtMjQgcC1sLTE2IHAtci0xNlwiPlxuICAgICAgPGgzIHRyYW5zbGF0ZSBjbGFzcz1cInRleHQtbWVkaXVtIGwtaC1iYXNlXCIgZGF0YS1jeT1cImM4eS1zZXR1cC0tY29tcGxldGVkLWhlYWRlci10aXRsZVwiPlN1bW1hcnk8L2gzPlxuICAgICAgPHAgdHJhbnNsYXRlIGNsYXNzPVwibGVhZCB0ZXh0LW5vcm1hbCBwLXQtOCBwLWItOFwiPlxuICAgICAgICBWZXJpZnkgdGhlIHNldHVwIHJlc3VsdC4gSWYgYW55IHN0ZXAgaXMgbm90IGZpbmlzaGVkIGJ1dCByZXF1aXJlZCwgeW91IG5lZWQgdG8gZW5zdXJlIHRoYXRcbiAgICAgICAgeW91IGhhdmUgZmluaXNoZWQgdGhlIHN0ZXAuXG4gICAgICA8L3A+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwiaW5uZXItc2Nyb2xsIGZsZXgtZ3Jvd1wiPlxuICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkIGZpdC13IHAtdC0xNlwiPlxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtOCBjb2wtbWQtb2Zmc2V0LTIgY29sLWxnLTYgY29sLWxnLW9mZnNldC0zXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiIFtuZ1N3aXRjaF09XCJzdGF0dXNcIj5cbiAgICAgICAgICA8Yzh5LW9wZXJhdGlvbi1yZXN1bHRcbiAgICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCInZG9uZSdcIlxuICAgICAgICAgICAgdGV4dD1cInt7ICdTZXR1cCBjb21wbGV0ZWQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIFtzaXplXT1cIjEyMFwiXG4gICAgICAgICAgICBbdmVydGljYWxdPVwidHJ1ZVwiXG4gICAgICAgICAgICB0eXBlPVwic3VjY2Vzc1wiXG4gICAgICAgICAgPjwvYzh5LW9wZXJhdGlvbi1yZXN1bHQ+XG4gICAgICAgICAgPGM4eS1vcGVyYXRpb24tcmVzdWx0XG4gICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ3dhcm5pbmcnXCJcbiAgICAgICAgICAgIHRleHQ9XCJ7eyAnU2V0dXAgY29tcGxldGVkIHdpdGggd2FybmluZ3MnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIFtzaXplXT1cIjEyMFwiXG4gICAgICAgICAgICBbdmVydGljYWxdPVwidHJ1ZVwiXG4gICAgICAgICAgICB0eXBlPVwid2FybmluZ1wiXG4gICAgICAgICAgPjwvYzh5LW9wZXJhdGlvbi1yZXN1bHQ+XG4gICAgICAgICAgPGM4eS1vcGVyYXRpb24tcmVzdWx0XG4gICAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiJ2Vycm9yJ1wiXG4gICAgICAgICAgICB0ZXh0PVwie3sgJ1NldHVwIG5vdCBjb21wbGV0ZWQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIFtzaXplXT1cIjEyMFwiXG4gICAgICAgICAgICBbdmVydGljYWxdPVwidHJ1ZVwiXG4gICAgICAgICAgICB0eXBlPVwiZXJyb3JcIlxuICAgICAgICAgID48L2M4eS1vcGVyYXRpb24tcmVzdWx0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHVsIGNsYXNzPVwibGlzdC11bnN0eWxlZCBtLXQtMTYgc2VwYXJhdG9yLXRvcFwiPlxuICAgICAgICAgIDxsaVxuICAgICAgICAgICAgY2xhc3M9XCJwLXQtNCBwLWItNCBkLWZsZXggYS1pLWNlbnRlciBzZXBhcmF0b3ItYm90dG9tIHRleHQtbm93cmFwIGwtaC0xXCJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBzdGVwIG9mIHNldHVwLnN0ZXBzLnNsaWNlKDAsIHNldHVwLnN0ZXBzLmxlbmd0aCAtIDEpXCJcbiAgICAgICAgICAgIChjbGljayk9XCJnb3RvU3RlcChzdGVwLmluZGV4KVwiXG4gICAgICAgICAgICBzdHlsZT1cImN1cnNvcjogcG9pbnRlclwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzdGVwLmxhYmVsXCI+XG4gICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJkb3Qgc21hbGwgbS1yLTQgbC1oLTFcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICdkb3Qtc3VjY2Vzcyc6IHN0ZXAuY29tcGxldGVkLFxuICAgICAgICAgICAgICAgICAgJ2RvdC1lcnJvcic6ICFzdGVwLmNvbXBsZXRlZCAmJiBzdGVwLnJlcXVpcmVkLFxuICAgICAgICAgICAgICAgICAgJ2RvdC13YXJuaW5nJzogIXN0ZXAuY29tcGxldGVkICYmICFzdGVwLnJlcXVpcmVkXG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyBzdGVwLmluZGV4ICsgMSB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIHt7IHN0ZXAubGFiZWwgfHwgKFNURVBfTEFCRUwgfCB0cmFuc2xhdGUpICsgJyAnIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFzdGVwLmxhYmVsXCI+XG4gICAgICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5TdGVwPC9zcGFuPlxuICAgICAgICAgICAgICB7eyAnICcgKyAoc3RlcC5pbmRleCArIDEpIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm0tbC1hdXRvIGljb24tMjAgbC1oLTFcIj5cbiAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAqbmdJZj1cInN0ZXAuY29tcGxldGVkXCJcbiAgICAgICAgICAgICAgICBbYzh5SWNvbl09XCInc3VjY2VzcydcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1zdWNjZXNzXCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0NvbXBsZXRlZCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICpuZ0lmPVwiIXN0ZXAuY29tcGxldGVkICYmIHN0ZXAucmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgIFtjOHlJY29uXT1cIidlcnJvcidcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCJcbiAgICAgICAgICAgICAgICAgICdOb3QgY29tcGxldGVkIGFuZCByZXF1aXJlZC4gR28gdG8gdGhlIHN0ZXAgYW5kIGZ1bGZpbGwgdGhlIHNldHVwLicgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICpuZ0lmPVwiIXN0ZXAuY29tcGxldGVkICYmICFzdGVwLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICBbYzh5SWNvbl09XCInd2FybmluZydcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC13YXJuaW5nXCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ1RoaXMgc3RlcCB3YXMgbm90IGNvbXBsZXRlZCBidXQgaXQgaXMgYWxzbyBub3QgcmVxdWlyZWQuJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgPC91bD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cImNhcmQtZm9vdGVyIHNlcGFyYXRvciBkLWZsZXggai1jLWNlbnRlclwiPlxuICA8YnV0dG9uXG4gICAgdHJhbnNsYXRlXG4gICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIChjbGljayk9XCJiYWNrKClcIlxuICAgICpuZ0lmPVwic3RlcHBlci5zZWxlY3RlZEluZGV4ICE9PSAwXCJcbiAgICBbZGlzYWJsZWRdPVwiXG4gICAgICBzZXR1cC5jdXJyZW50U2V0dXBTdGF0ZSA9PT0gc2V0dXAuc2V0dXBTdGF0ZS5GSU5BTElaSU5HIHx8XG4gICAgICBzZXR1cC5jdXJyZW50U2V0dXBTdGF0ZSA9PT0gc2V0dXAuc2V0dXBTdGF0ZS5SRUxPQURJTkdcbiAgICBcIlxuICA+XG4gICAgQmFja1xuICA8L2J1dHRvbj5cbiAgPGJ1dHRvblxuICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICBkYXRhLWN5PVwiYzh5LXNldHVwLWNvbXBsZXRlZC0tZG9uZS1idXR0b25cIlxuICAgIChjbGljayk9XCJzdGFydCgpXCJcbiAgICBbZGlzYWJsZWRdPVwiXG4gICAgICBzdGF0dXMgPT09ICdlcnJvcicgfHxcbiAgICAgIHNldHVwLmN1cnJlbnRTZXR1cFN0YXRlID09PSBzZXR1cC5zZXR1cFN0YXRlLkZJTkFMSVpJTkcgfHxcbiAgICAgIHNldHVwLmN1cnJlbnRTZXR1cFN0YXRlID09PSBzZXR1cC5zZXR1cFN0YXRlLlJFTE9BRElOR1xuICAgIFwiXG4gICAgW25nQ2xhc3NdPVwie1xuICAgICAgJ2J0bi1wZW5kaW5nJzpcbiAgICAgICAgc2V0dXAuY3VycmVudFNldHVwU3RhdGUgPT09IHNldHVwLnNldHVwU3RhdGUuRklOQUxJWklORyB8fFxuICAgICAgICBzZXR1cC5jdXJyZW50U2V0dXBTdGF0ZSA9PT0gc2V0dXAuc2V0dXBTdGF0ZS5SRUxPQURJTkdcbiAgICB9XCJcbiAgPlxuICAgIDxzcGFuICpuZ0lmPVwic2V0dXAuY3VycmVudFNldHVwU3RhdGUgPT09IHNldHVwLnNldHVwU3RhdGUuV0laQVJEXCIgdHJhbnNsYXRlPlxuICAgICAgU2F2ZSBhbmQgcmVsb2FkXG4gICAgPC9zcGFuPlxuICAgIDxzcGFuICpuZ0lmPVwic2V0dXAuY3VycmVudFNldHVwU3RhdGUgPT09IHNldHVwLnNldHVwU3RhdGUuRklOQUxJWklOR1wiIHRyYW5zbGF0ZT5cbiAgICAgIEdldHRpbmcgdGhpbmdzIHJlYWR54oCmXG4gICAgPC9zcGFuPlxuICAgIDxzcGFuICpuZ0lmPVwic2V0dXAuY3VycmVudFNldHVwU3RhdGUgPT09IHNldHVwLnNldHVwU3RhdGUuUkVMT0FESU5HXCIgdHJhbnNsYXRlPlxuICAgICAgRG9uZS4gUmVsb2FkaW5nIHRoZSBhcHBsaWNhdGlvbi5cbiAgICA8L3NwYW4+XG4gIDwvYnV0dG9uPlxuPC9kaXY+XG4iXX0=