UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

116 lines 51.6 kB
// tslint:disable:no-string-literal import { Component, Input } from '@angular/core'; import { gettext } from '@c8y/ngx-components'; import { isEmpty } from 'lodash-es'; import { ControlContainer, NgForm } from '@angular/forms'; import { TfaStrategy, TenantLoginOptionType } from '@c8y/client'; import * as i0 from "@angular/core"; import * as i1 from "@c8y/ngx-components"; import * as i2 from "@angular/common"; import * as i3 from "@angular/forms"; import * as i4 from "ngx-bootstrap/popover"; var TfaStateEnum; (function (TfaStateEnum) { TfaStateEnum[TfaStateEnum["TFA_UNDEFINED_BY_SYSTEM"] = 0] = "TFA_UNDEFINED_BY_SYSTEM"; TfaStateEnum[TfaStateEnum["TFA_ENFORCED_FOR_GROUP"] = 1] = "TFA_ENFORCED_FOR_GROUP"; TfaStateEnum[TfaStateEnum["TFA_ENABLED_BY_SYSTEM"] = 2] = "TFA_ENABLED_BY_SYSTEM"; TfaStateEnum[TfaStateEnum["TFA_ENFORCED_BY_SYSTEM"] = 3] = "TFA_ENFORCED_BY_SYSTEM"; })(TfaStateEnum || (TfaStateEnum = {})); export class TfaSettingsComponent { constructor() { this.preferredLoginOptionType = TenantLoginOptionType.BASIC; this.tfaStateEnum = TfaStateEnum; this.tfaStrategyEnum = TfaStrategy; this.tenantLoginOptionTypeEnum = TenantLoginOptionType; this.TOTP_REQUIRES_OAUTH_POPOVER = gettext('TOTP requires OAI-Secure login mode.'); this.SMS_APP_NOT_SUBSCRIBED_POPOVER = gettext('SMS strategy requires messaging application to be subscribed.'); this.TFA_IS_ENFORCED_BY_SYSTEM_POPOVER = gettext('The setting is enforced on the platform level.'); this.TFA_IS_ENABLED_BY_SYSTEM_POPOVER = gettext('The setting is enabled on the platform level.'); this.TOKEN_VALIDITY_DETERMINED_BY_JWT_POPOVER = gettext("In OAI-Secure login mode, the token's validity limit is determined by the JWT token and cannot be edited here."); this.TFA_IS_ENABLED_BY_ENFORCE_FOR_GROUP_POPOVER = gettext('The setting is enabled on the platform level because it is enforced for particular roles.'); } ngOnChanges(changes) { if (changes.authConfiguration && changes.authConfiguration.currentValue) { this.smsGatewayAvailable = changes.authConfiguration.currentValue.smsGatewayAvailable; this.preferredLoginOptionType = changes.authConfiguration.currentValue.preferredLoginOptionType; } } ngDoCheck() { if (this.preferredLoginOptionType !== this.authConfiguration.preferredLoginOptionType) { this.preferredLoginOptionType = this.authConfiguration.preferredLoginOptionType; this.tenantTfaStrategy = this.tfaBySmsCanBeSet ? TfaStrategy.SMS : TfaStrategy.TOTP; } } get tenantTfaTokenValidity() { return this.authConfiguration.tenantOptions['two-factor-authentication']['token.validity']; } set tenantTfaTokenValidity(value) { this.authConfiguration.tenantOptions['two-factor-authentication']['token.validity'] = value; } get tenantTfaPinValidity() { return this.authConfiguration.tenantOptions['two-factor-authentication']['pin.validity']; } set tenantTfaPinValidity(value) { this.authConfiguration.tenantOptions['two-factor-authentication']['pin.validity'] = value; } get tenantTfaEnabled() { return this.authConfiguration.tenantOptions['two-factor-authentication']['enabled']; } set tenantTfaEnabled(value) { this.authConfiguration.tenantOptions['two-factor-authentication']['enabled'] = value; } get tenantTfaEnforced() { return this.authConfiguration.tenantOptions['two-factor-authentication']['enforced']; } set tenantTfaEnforced(value) { this.authConfiguration.tenantOptions['two-factor-authentication']['enforced'] = value; } get tenantTfaStrategy() { return this.authConfiguration.tenantOptions['two-factor-authentication']['strategy']; } set tenantTfaStrategy(value) { this.authConfiguration.tenantOptions['two-factor-authentication']['strategy'] = value; } get systemTfaEnforcedGroup() { return this.authConfiguration.systemOptions['two-factor-authentication']['enforced.group']; } get systemTfaTenantScopeSettingEnabled() { return this.authConfiguration.systemOptions['two-factor-authentication']['tenant-scope-settings.enabled']; } get systemTfaEnabled() { return this.authConfiguration.systemOptions['two-factor-authentication']['enabled']; } get systemTfaEnforced() { return this.authConfiguration.systemOptions['two-factor-authentication']['enforced']; } get tfaState() { if (this.systemTfaEnforced) { return this.tfaStateEnum.TFA_ENFORCED_BY_SYSTEM; } if (!isEmpty(this.systemTfaEnforcedGroup)) { return this.tfaStateEnum.TFA_ENFORCED_FOR_GROUP; } if (this.systemTfaEnabled) { return this.tfaStateEnum.TFA_ENABLED_BY_SYSTEM; } return this.tfaStateEnum.TFA_UNDEFINED_BY_SYSTEM; } get tfaBySmsCanBeSet() { return ((this.tfaState !== this.tfaStateEnum.TFA_UNDEFINED_BY_SYSTEM || this.tenantTfaEnabled) && this.smsGatewayAvailable); } get tfaByTotpCanBeSet() { return ((this.tfaState !== this.tfaStateEnum.TFA_UNDEFINED_BY_SYSTEM || this.tenantTfaEnabled) && this.preferredLoginOptionType === TenantLoginOptionType.OAUTH2_INTERNAL); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TfaSettingsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TfaSettingsComponent, selector: "c8y-auth-tfa", inputs: { authConfiguration: "authConfiguration" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"card-block separator-top\"\n *ngIf=\"preferredLoginOptionType !== tenantLoginOptionTypeEnum.OAUTH2\"\n>\n <div class=\"col-sm-2\">\n <div class=\"h4 text-normal text-right text-left-xs\">\n {{ 'Two-factor authentication' | translate }}\n </div>\n </div>\n\n <div class=\"col-sm-9\">\n <c8y-form-group>\n <label\n class=\"c8y-switch\"\n title=\"{{ 'Enable two-factor authentication' | translate }}\"\n *ngIf=\"\n tfaState === tfaStateEnum.TFA_UNDEFINED_BY_SYSTEM;\n else enabledOrEnforcedOnSystemLevelTemplate\n \"\n >\n <input type=\"checkbox\" [(ngModel)]=\"tenantTfaEnabled\" name=\"tenantTfaEnabled\" />\n <span></span>\n <span>{{ 'Enable' | translate }}</span>\n </label>\n\n <ng-template #enabledOrEnforcedOnSystemLevelTemplate>\n <div [ngSwitch]=\"tfaState\">\n <span *ngSwitchCase=\"tfaStateEnum.TFA_ENABLED_BY_SYSTEM\">\n {{ 'Two-factor authentication is enabled on all users' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ TFA_IS_ENABLED_BY_SYSTEM_POPOVER | translate }}\"\n placement=\"bottom\"\n triggers=\"focus\"\n ></button>\n </span>\n <div *ngSwitchCase=\"tfaStateEnum.TFA_ENFORCED_BY_SYSTEM\">\n <span>\n {{ 'Two-factor authentication is enforced on all users' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ TFA_IS_ENFORCED_BY_SYSTEM_POPOVER | translate }}\"\n placement=\"bottom\"\n triggers=\"focus\"\n ></button>\n </span>\n </div>\n <div *ngSwitchCase=\"tfaStateEnum.TFA_ENFORCED_FOR_GROUP\">\n <span>\n <span translate [translateParams]=\"{ role: systemTfaEnforcedGroup }\" ngNonBindable>\n Two-factor authentication is enabled on all users and enforced on users with role\n {{ role }}.\n </span>\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ TFA_IS_ENABLED_BY_ENFORCE_FOR_GROUP_POPOVER | translate }}\"\n placement=\"bottom\"\n triggers=\"focus\"\n ></button>\n </span>\n </div>\n </div>\n </ng-template>\n </c8y-form-group>\n\n <fieldset *ngIf=\"tfaBySmsCanBeSet || tfaByTotpCanBeSet\">\n <div class=\"row\">\n <c8y-form-group class=\"col-sm-6\">\n <label title=\"{{ 'TFA strategy' | translate }}\">\n {{ 'TFA strategy' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ SMS_APP_NOT_SUBSCRIBED_POPOVER | translate }}\"\n placement=\"bottom\"\n triggers=\"focus\"\n *ngIf=\"!tfaBySmsCanBeSet\"\n ></button>\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ TOTP_REQUIRES_OAUTH_POPOVER | translate }}\"\n placement=\"bottom\"\n triggers=\"focus\"\n *ngIf=\"!tfaByTotpCanBeSet\"\n ></button>\n </label>\n\n <div class=\"c8y-select-wrapper\">\n <select\n [attr.aria-label]=\"'TFA' | translate\"\n class=\"form-control\"\n [(ngModel)]=\"tenantTfaStrategy\"\n name=\"tenantTfaStrategy\"\n >\n <option value=\"{{ tfaStrategyEnum.SMS }}\" translate [disabled]=\"!tfaBySmsCanBeSet\">\n SMS based\n </option>\n <option value=\"{{ tfaStrategyEnum.TOTP }}\" translate [disabled]=\"!tfaByTotpCanBeSet\">\n TOTP\n </option>\n </select>\n <span></span>\n </div>\n </c8y-form-group>\n </div>\n\n <div\n class=\"row\"\n *ngIf=\"\n tenantTfaStrategy === tfaStrategyEnum.TOTP &&\n tfaState !== tfaStateEnum.TFA_ENFORCED_BY_SYSTEM\n \"\n >\n <label title=\"{{ 'Enforcement' | translate }}\">{{ 'Enforcement' | translate }}</label>\n <div class=\"form-control-static\">\n <label\n title=\"{{ 'Enforce two-factor authentication on all users' | translate }}\"\n class=\"c8y-switch\"\n >\n <input type=\"checkbox\" name=\"tenantTfaEnforced\" [(ngModel)]=\"tenantTfaEnforced\" />\n <span></span>\n <span>{{ 'Enforce two-factor authentication on all users' | translate }}</span>\n </label>\n </div>\n </div>\n\n <div class=\"row\" *ngIf=\"tenantTfaStrategy === tfaStrategyEnum.SMS\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label title=\"{{ 'Token validity limit' | translate }}\">\n {{ 'Token validity limit' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ TFA_IS_ENFORCED_BY_SYSTEM_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n *ngIf=\"!systemTfaTenantScopeSettingEnabled\"\n ></button>\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ TOKEN_VALIDITY_DETERMINED_BY_JWT_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n *ngIf=\"\n systemTfaTenantScopeSettingEnabled &&\n preferredLoginOptionType === tenantLoginOptionTypeEnum.OAUTH2_INTERNAL\n \"\n ></button>\n </label>\n <div class=\"input-group\">\n <input\n type=\"number\"\n class=\"form-control text-right\"\n name=\"tenantTfaTokenValidity\"\n [(ngModel)]=\"tenantTfaTokenValidity\"\n [disabled]=\"\n !systemTfaTenantScopeSettingEnabled ||\n preferredLoginOptionType === tenantLoginOptionTypeEnum.OAUTH2_INTERNAL\n \"\n [required]=\"systemTfaTenantScopeSettingEnabled\"\n [max]=\"999999\"\n [min]=\"0\"\n />\n <span class=\"input-group-addon\" translate>minutes</span>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label title=\"{{ 'Verification code validity limit' | translate }}\">\n {{ 'Verification code validity limit' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ TFA_IS_ENFORCED_BY_SYSTEM_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n *ngIf=\"!systemTfaTenantScopeSettingEnabled\"\n ></button>\n </label>\n <div class=\"input-group\">\n <input\n type=\"number\"\n class=\"form-control text-right\"\n name=\"tenantTfaPinValidity\"\n [(ngModel)]=\"tenantTfaPinValidity\"\n [disabled]=\"!systemTfaTenantScopeSettingEnabled\"\n [required]=\"systemTfaTenantScopeSettingEnabled\"\n [max]=\"999999\"\n [min]=\"0\"\n />\n <span class=\"input-group-addon\" translate>minutes</span>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n <div\n *ngIf=\"\n preferredLoginOptionType !== tenantLoginOptionTypeEnum.OAUTH2_INTERNAL &&\n !smsGatewayAvailable\n \"\n >\n <div class=\"alert alert-warning\">\n <strong>{{ 'None of TFA strategy can be set.' | translate }}</strong>\n <br />\n {{ SMS_APP_NOT_SUBSCRIBED_POPOVER | translate }}\n <br />\n {{ TOTP_REQUIRES_OAUTH_POPOVER | translate }}\n </div>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1.MinValidationDirective, selector: "[min]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidationDirective, selector: "[max]", inputs: ["max"] }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.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: i3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i3.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i1.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i1.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i4.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: i1.C8yTranslatePipe, name: "translate" }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TfaSettingsComponent, decorators: [{ type: Component, args: [{ selector: 'c8y-auth-tfa', viewProviders: [{ provide: ControlContainer, useExisting: NgForm }], template: "<div\n class=\"card-block separator-top\"\n *ngIf=\"preferredLoginOptionType !== tenantLoginOptionTypeEnum.OAUTH2\"\n>\n <div class=\"col-sm-2\">\n <div class=\"h4 text-normal text-right text-left-xs\">\n {{ 'Two-factor authentication' | translate }}\n </div>\n </div>\n\n <div class=\"col-sm-9\">\n <c8y-form-group>\n <label\n class=\"c8y-switch\"\n title=\"{{ 'Enable two-factor authentication' | translate }}\"\n *ngIf=\"\n tfaState === tfaStateEnum.TFA_UNDEFINED_BY_SYSTEM;\n else enabledOrEnforcedOnSystemLevelTemplate\n \"\n >\n <input type=\"checkbox\" [(ngModel)]=\"tenantTfaEnabled\" name=\"tenantTfaEnabled\" />\n <span></span>\n <span>{{ 'Enable' | translate }}</span>\n </label>\n\n <ng-template #enabledOrEnforcedOnSystemLevelTemplate>\n <div [ngSwitch]=\"tfaState\">\n <span *ngSwitchCase=\"tfaStateEnum.TFA_ENABLED_BY_SYSTEM\">\n {{ 'Two-factor authentication is enabled on all users' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ TFA_IS_ENABLED_BY_SYSTEM_POPOVER | translate }}\"\n placement=\"bottom\"\n triggers=\"focus\"\n ></button>\n </span>\n <div *ngSwitchCase=\"tfaStateEnum.TFA_ENFORCED_BY_SYSTEM\">\n <span>\n {{ 'Two-factor authentication is enforced on all users' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ TFA_IS_ENFORCED_BY_SYSTEM_POPOVER | translate }}\"\n placement=\"bottom\"\n triggers=\"focus\"\n ></button>\n </span>\n </div>\n <div *ngSwitchCase=\"tfaStateEnum.TFA_ENFORCED_FOR_GROUP\">\n <span>\n <span translate [translateParams]=\"{ role: systemTfaEnforcedGroup }\" ngNonBindable>\n Two-factor authentication is enabled on all users and enforced on users with role\n {{ role }}.\n </span>\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ TFA_IS_ENABLED_BY_ENFORCE_FOR_GROUP_POPOVER | translate }}\"\n placement=\"bottom\"\n triggers=\"focus\"\n ></button>\n </span>\n </div>\n </div>\n </ng-template>\n </c8y-form-group>\n\n <fieldset *ngIf=\"tfaBySmsCanBeSet || tfaByTotpCanBeSet\">\n <div class=\"row\">\n <c8y-form-group class=\"col-sm-6\">\n <label title=\"{{ 'TFA strategy' | translate }}\">\n {{ 'TFA strategy' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ SMS_APP_NOT_SUBSCRIBED_POPOVER | translate }}\"\n placement=\"bottom\"\n triggers=\"focus\"\n *ngIf=\"!tfaBySmsCanBeSet\"\n ></button>\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ TOTP_REQUIRES_OAUTH_POPOVER | translate }}\"\n placement=\"bottom\"\n triggers=\"focus\"\n *ngIf=\"!tfaByTotpCanBeSet\"\n ></button>\n </label>\n\n <div class=\"c8y-select-wrapper\">\n <select\n [attr.aria-label]=\"'TFA' | translate\"\n class=\"form-control\"\n [(ngModel)]=\"tenantTfaStrategy\"\n name=\"tenantTfaStrategy\"\n >\n <option value=\"{{ tfaStrategyEnum.SMS }}\" translate [disabled]=\"!tfaBySmsCanBeSet\">\n SMS based\n </option>\n <option value=\"{{ tfaStrategyEnum.TOTP }}\" translate [disabled]=\"!tfaByTotpCanBeSet\">\n TOTP\n </option>\n </select>\n <span></span>\n </div>\n </c8y-form-group>\n </div>\n\n <div\n class=\"row\"\n *ngIf=\"\n tenantTfaStrategy === tfaStrategyEnum.TOTP &&\n tfaState !== tfaStateEnum.TFA_ENFORCED_BY_SYSTEM\n \"\n >\n <label title=\"{{ 'Enforcement' | translate }}\">{{ 'Enforcement' | translate }}</label>\n <div class=\"form-control-static\">\n <label\n title=\"{{ 'Enforce two-factor authentication on all users' | translate }}\"\n class=\"c8y-switch\"\n >\n <input type=\"checkbox\" name=\"tenantTfaEnforced\" [(ngModel)]=\"tenantTfaEnforced\" />\n <span></span>\n <span>{{ 'Enforce two-factor authentication on all users' | translate }}</span>\n </label>\n </div>\n </div>\n\n <div class=\"row\" *ngIf=\"tenantTfaStrategy === tfaStrategyEnum.SMS\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label title=\"{{ 'Token validity limit' | translate }}\">\n {{ 'Token validity limit' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ TFA_IS_ENFORCED_BY_SYSTEM_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n *ngIf=\"!systemTfaTenantScopeSettingEnabled\"\n ></button>\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ TOKEN_VALIDITY_DETERMINED_BY_JWT_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n *ngIf=\"\n systemTfaTenantScopeSettingEnabled &&\n preferredLoginOptionType === tenantLoginOptionTypeEnum.OAUTH2_INTERNAL\n \"\n ></button>\n </label>\n <div class=\"input-group\">\n <input\n type=\"number\"\n class=\"form-control text-right\"\n name=\"tenantTfaTokenValidity\"\n [(ngModel)]=\"tenantTfaTokenValidity\"\n [disabled]=\"\n !systemTfaTenantScopeSettingEnabled ||\n preferredLoginOptionType === tenantLoginOptionTypeEnum.OAUTH2_INTERNAL\n \"\n [required]=\"systemTfaTenantScopeSettingEnabled\"\n [max]=\"999999\"\n [min]=\"0\"\n />\n <span class=\"input-group-addon\" translate>minutes</span>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label title=\"{{ 'Verification code validity limit' | translate }}\">\n {{ 'Verification code validity limit' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ TFA_IS_ENFORCED_BY_SYSTEM_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n *ngIf=\"!systemTfaTenantScopeSettingEnabled\"\n ></button>\n </label>\n <div class=\"input-group\">\n <input\n type=\"number\"\n class=\"form-control text-right\"\n name=\"tenantTfaPinValidity\"\n [(ngModel)]=\"tenantTfaPinValidity\"\n [disabled]=\"!systemTfaTenantScopeSettingEnabled\"\n [required]=\"systemTfaTenantScopeSettingEnabled\"\n [max]=\"999999\"\n [min]=\"0\"\n />\n <span class=\"input-group-addon\" translate>minutes</span>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n <div\n *ngIf=\"\n preferredLoginOptionType !== tenantLoginOptionTypeEnum.OAUTH2_INTERNAL &&\n !smsGatewayAvailable\n \"\n >\n <div class=\"alert alert-warning\">\n <strong>{{ 'None of TFA strategy can be set.' | translate }}</strong>\n <br />\n {{ SMS_APP_NOT_SUBSCRIBED_POPOVER | translate }}\n <br />\n {{ TOTP_REQUIRES_OAUTH_POPOVER | translate }}\n </div>\n </div>\n </div>\n</div>\n" }] }], propDecorators: { authConfiguration: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGZhLXNldHRpbmdzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2F1dGgtY29uZmlndXJhdGlvbi9iYXNpYy1zZXR0aW5ncy90ZmEtc2V0dGluZ3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vYXV0aC1jb25maWd1cmF0aW9uL2Jhc2ljLXNldHRpbmdzL3RmYS1zZXR0aW5ncy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxtQ0FBbUM7QUFDbkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sYUFBYSxDQUFDOzs7Ozs7QUFHakUsSUFBSyxZQUtKO0FBTEQsV0FBSyxZQUFZO0lBQ2YscUZBQXVCLENBQUE7SUFDdkIsbUZBQXNCLENBQUE7SUFDdEIsaUZBQXFCLENBQUE7SUFDckIsbUZBQXNCLENBQUE7QUFDeEIsQ0FBQyxFQUxJLFlBQVksS0FBWixZQUFZLFFBS2hCO0FBT0QsTUFBTSxPQUFPLG9CQUFvQjtJQUxqQztRQVNFLDZCQUF3QixHQUEwQixxQkFBcUIsQ0FBQyxLQUFLLENBQUM7UUFJOUUsaUJBQVksR0FBRyxZQUFZLENBQUM7UUFDNUIsb0JBQWUsR0FBRyxXQUFXLENBQUM7UUFDOUIsOEJBQXlCLEdBQUcscUJBQXFCLENBQUM7UUFFbEQsZ0NBQTJCLEdBQUcsT0FBTyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7UUFDOUUsbUNBQThCLEdBQUcsT0FBTyxDQUN0QywrREFBK0QsQ0FDaEUsQ0FBQztRQUVGLHND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LGdCQUFnQixDQUFDO1lBQ3RGLElBQUksQ0FBQyxtQkFBbUIsQ0FDekIsQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFJLGlCQUFpQjtRQUNuQixPQUFPLENBQ0wsQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsdUJBQXVCLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDO1lBQ3RGLElBQUksQ0FBQyx3QkFBd0IsS0FBSyxxQkFBcUIsQ0FBQyxlQUFlLENBQ3hFLENBQUM7SUFDSixDQUFDOytHQTVIVSxvQkFBb0I7bUdBQXBCLG9CQUFvQiw2SENwQmpDLDR0UkFtT0EsOG5HRGpOaUIsQ0FBQyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUM7OzRGQUV4RCxvQkFBb0I7a0JBTGhDLFNBQVM7K0JBQ0UsY0FBYyxpQkFFVCxDQUFDLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBQzs4QkFJbkUsaUJBQWlCO3NCQURoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLy8gdHNsaW50OmRpc2FibGU6bm8tc3RyaW5nLWxpdGVyYWxcbmltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGdldHRleHQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IGlzRW1wdHkgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQ29udHJvbENvbnRhaW5lciwgTmdGb3JtIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgVGZhU3RyYXRlZ3ksIFRlbmFudExvZ2luT3B0aW9uVHlwZSB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IEF1dGhDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9hdXRoLWNvbmZpZ3VyYXRpb24ubW9kZWwnO1xuXG5lbnVtIFRmYVN0YXRlRW51bSB7XG4gIFRGQV9VTkRFRklORURfQllfU1lTVEVNLFxuICBURkFfRU5GT1JDRURfRk9SX0dST1VQLFxuICBURkFfRU5BQkxFRF9CWV9TWVNURU0sXG4gIFRGQV9FTkZPUkNFRF9CWV9TWVNURU1cbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LWF1dGgtdGZhJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RmYS1zZXR0aW5ncy5jb21wb25lbnQuaHRtbCcsXG4gIHZpZXdQcm92aWRlcnM6IFt7IHByb3ZpZGU6IENvbnRyb2xDb250YWluZXIsIHVzZUV4aXN0aW5nOiBOZ0Zvcm0gfV1cbn0pXG5leHBvcnQgY2xhc3MgVGZhU2V0dGluZ3NDb21wb25lbnQge1xuICBASW5wdXQoKVxuICBhdXRoQ29uZmlndXJhdGlvbjogQXV0aENvbmZpZ3VyYXRpb247XG5cbiAgcHJlZmVycmVkTG9naW5PcHRpb25UeXBlOiBUZW5hbnRMb2dpbk9wdGlvblR5cGUgPSBUZW5hbnRMb2dpbk9wdGlvblR5cGUuQkFTSUM7XG5cbiAgc21zR2F0ZXdheUF2YWlsYWJsZTogYm9vbGVhbjtcblxuICB0ZmFTdGF0ZUVudW0gPSBUZmFTdGF0ZUVudW07XG4gIHRmYVN0cmF0ZWd5RW51bSA9IFRmYVN0cmF0ZWd5O1xuICB0ZW5hbnRMb2dpbk9wdGlvblR5cGVFbnVtID0gVGVuYW50TG9naW5PcHRpb25UeXBlO1xuXG4gIFRPVFBfUkVRVUlSRVNfT0FVVEhfUE9QT1ZFUiA9IGdldHRleHQoJ1RPVFAgcmVxdWlyZXMgT0FJLVNlY3VyZSBsb2dpbiBtb2RlLicpO1xuICBTTVNfQVBQX05PVF9TVUJTQ1JJQkVEX1BPUE9WRVIgPSBnZXR0ZXh0KFxuICAgICdTTVMgc3RyYXRlZ3kgcmVxdWlyZXMgbWVzc2FnaW5nIGFwcGxpY2F0aW9uIHRvIGJlIHN1YnNjcmliZWQuJ1xuICApO1xuXG4gIFRGQV9JU19FTkZPUkNFRF9CWV9TWVNURU1fUE9QT1ZFUiA9IGdldHRleHQoJ1RoZSBzZXR0aW5nIGlzIGVuZm9yY2VkIG9uIHRoZSBwbGF0Zm9ybSBsZXZlbC4nKTtcbiAgVEZBX0lTX0VOQUJMRURfQllfU1lTVEVNX1BPUE9WRVIgPSBnZXR0ZXh0KCdUaGUgc2V0dGluZyBpcyBlbmFibGVkIG9uIHRoZSBwbGF0Zm9ybSBsZXZlbC4nKTtcbiAgVE9LRU5fVkFMSURJVFlfREVURVJNSU5FRF9CWV9KV1RfUE9QT1ZFUiA9IGdldHRleHQoXG4gICAgXCJJbiBPQUktU2VjdXJlIGxvZ2luIG1vZGUsIHRoZSB0b2tlbidzIHZhbGlkaXR5IGxpbWl0IGlzIGRldGVybWluZWQgYnkgdGhlIEpXVCB0b2tlbiBhbmQgY2Fubm90IGJlIGVkaXRlZCBoZXJlLlwiXG4gICk7XG4gIFRGQV9JU19FTkFCTEVEX0JZX0VORk9SQ0VfRk9SX0dST1VQX1BPUE9WRVIgPSBnZXR0ZXh0KFxuICAgICdUaGUgc2V0dGluZyBpcyBlbmFibGVkIG9uIHRoZSBwbGF0Zm9ybSBsZXZlbCBiZWNhdXNlIGl0IGlzIGVuZm9yY2VkIGZvciBwYXJ0aWN1bGFyIHJvbGVzLidcbiAgKTtcblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXMuYXV0aENvbmZpZ3VyYXRpb24gJiYgY2hhbmdlcy5hdXRoQ29uZmlndXJhdGlvbi5jdXJyZW50VmFsdWUpIHtcbiAgICAgIHRoaXMuc21zR2F0ZXdheUF2YWlsYWJsZSA9IGNoYW5nZXMuYXV0aENvbmZpZ3VyYXRpb24uY3VycmVudFZhbHVlLnNtc0dhdGV3YXlBdmFpbGFibGU7XG4gICAgICB0aGlzLnByZWZlcnJlZExvZ2luT3B0aW9uVHlwZSA9XG4gICAgICAgIGNoYW5nZXMuYXV0aENvbmZpZ3VyYXRpb24uY3VycmVudFZhbHVlLnByZWZlcnJlZExvZ2luT3B0aW9uVHlwZTtcbiAgICB9XG4gIH1cblxuICBuZ0RvQ2hlY2soKSB7XG4gICAgaWYgKHRoaXMucHJlZmVycmVkTG9naW5PcHRpb25UeXBlICE9PSB0aGlzLmF1dGhDb25maWd1cmF0aW9uLnByZWZlcnJlZExvZ2luT3B0aW9uVHlwZSkge1xuICAgICAgdGhpcy5wcmVmZXJyZWRMb2dpbk9wdGlvblR5cGUgPSB0aGlzLmF1dGhDb25maWd1cmF0aW9uLnByZWZlcnJlZExvZ2luT3B0aW9uVHlwZTtcbiAgICAgIHRoaXMudGVuYW50VGZhU3RyYXRlZ3kgPSB0aGlzLnRmYUJ5U21zQ2FuQmVTZXQgPyBUZmFTdHJhdGVneS5TTVMgOiBUZmFTdHJhdGVneS5UT1RQO1xuICAgIH1cbiAgfVxuXG4gIGdldCB0ZW5hbnRUZmFUb2tlblZhbGlkaXR5KCkge1xuICAgIHJldHVybiB0aGlzLmF1dGhDb25maWd1cmF0aW9uLnRlbmFudE9wdGlvbnNbJ3R3by1mYWN0b3ItYXV0aGVudGljYXRpb24nXVsndG9rZW4udmFsaWRpdHknXTtcbiAgfVxuXG4gIHNldCB0ZW5hbnRUZmFUb2tlblZhbGlkaXR5KHZhbHVlKSB7XG4gICAgdGhpcy5hdXRoQ29uZmlndXJhdGlvbi50ZW5hbnRPcHRpb25zWyd0d28tZmFjdG9yLWF1dGhlbnRpY2F0aW9uJ11bJ3Rva2VuLnZhbGlkaXR5J10gPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCB0ZW5hbnRUZmFQaW5WYWxpZGl0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5hdXRoQ29uZmlndXJhdGlvbi50ZW5hbnRPcHRpb25zWyd0d28tZmFjdG9yLWF1dGhlbnRpY2F0aW9uJ11bJ3Bpbi52YWxpZGl0eSddO1xuICB9XG5cbiAgc2V0IHRlbmFudFRmYVBpblZhbGlkaXR5KHZhbHVlKSB7XG4gICAgdGhpcy5hdXRoQ29uZmlndXJhdGlvbi50ZW5hbnRPcHRpb25zWyd0d28tZmFjdG9yLWF1dGhlbnRpY2F0aW9uJ11bJ3Bpbi52YWxpZGl0eSddID0gdmFsdWU7XG4gIH1cblxuICBnZXQgdGVuYW50VGZhRW5hYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5hdXRoQ29uZmlndXJhdGlvbi50ZW5hbnRPcHRpb25zWyd0d28tZmFjdG9yLWF1dGhlbnRpY2F0aW9uJ11bJ2VuYWJsZWQnXTtcbiAgfVxuXG4gIHNldCB0ZW5hbnRUZmFFbmFibGVkKHZhbHVlKSB7XG4gICAgdGhpcy5hdXRoQ29uZmlndXJhdGlvbi50ZW5hbnRPcHRpb25zWyd0d28tZmFjdG9yLWF1dGhlbnRpY2F0aW9uJ11bJ2VuYWJsZWQnXSA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IHRlbmFudFRmYUVuZm9yY2VkKCkge1xuICAgIHJldHVybiB0aGlzLmF1dGhDb25maWd1cmF0aW9uLnRlbmFudE9wdGlvbnNbJ3R3by1mYWN0b3ItYXV0aGVudGljYXRpb24nXVsnZW5mb3JjZWQnXTtcbiAgfVxuXG4gIHNldCB0ZW5hbnRUZmFFbmZvcmNlZCh2YWx1ZSkge1xuICAgIHRoaXMuYXV0aENvbmZpZ3VyYXRpb24udGVuYW50T3B0aW9uc1sndHdvLWZhY3Rvci1hdXRoZW50aWNhdGlvbiddWydlbmZvcmNlZCddID0gdmFsdWU7XG4gIH1cblxuICBnZXQgdGVuYW50VGZhU3RyYXRlZ3koKSB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aENvbmZpZ3VyYXRpb24udGVuYW50T3B0aW9uc1sndHdvLWZhY3Rvci1hdXRoZW50aWNhdGlvbiddWydzdHJhdGVneSddO1xuICB9XG5cbiAgc2V0IHRlbmFudFRmYVN0cmF0ZWd5KHZhbHVlKSB7XG4gICAgdGhpcy5hdXRoQ29uZmlndXJhdGlvbi50ZW5hbnRPcHRpb25zWyd0d28tZmFjdG9yLWF1dGhlbnRpY2F0aW9uJ11bJ3N0cmF0ZWd5J10gPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBzeXN0ZW1UZmFFbmZvcmNlZEdyb3VwKCkge1xuICAgIHJldHVybiB0aGlzLmF1dGhDb25maWd1cmF0aW9uLnN5c3RlbU9wdGlvbnNbJ3R3by1mYWN0b3ItYXV0aGVudGljYXRpb24nXVsnZW5mb3JjZWQuZ3JvdXAnXTtcbiAgfVxuXG4gIGdldCBzeXN0ZW1UZmFUZW5hbnRTY29wZVNldHRpbmdFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmF1dGhDb25maWd1cmF0aW9uLnN5c3RlbU9wdGlvbnNbJ3R3by1mYWN0b3ItYXV0aGVudGljYXRpb24nXVtcbiAgICAgICd0ZW5hbnQtc2NvcGUtc2V0dGluZ3MuZW5hYmxlZCdcbiAgICBdO1xuICB9XG5cbiAgZ2V0IHN5c3RlbVRmYUVuYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aENvbmZpZ3VyYXRpb24uc3lzdGVtT3B0aW9uc1sndHdvLWZhY3Rvci1hdXRoZW50aWNhdGlvbiddWydlbmFibGVkJ107XG4gIH1cblxuICBnZXQgc3lzdGVtVGZhRW5mb3JjZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aENvbmZpZ3VyYXRpb24uc3lzdGVtT3B0aW9uc1sndHdvLWZhY3Rvci1hdXRoZW50aWNhdGlvbiddWydlbmZvcmNlZCddO1xuICB9XG5cbiAgZ2V0IHRmYVN0YXRlKCkge1xuICAgIGlmICh0aGlzLnN5c3RlbVRmYUVuZm9yY2VkKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZmFTdGF0ZUVudW0uVEZBX0VORk9SQ0VEX0JZX1NZU1RFTTtcbiAgICB9XG4gICAgaWYgKCFpc0VtcHR5KHRoaXMuc3lzdGVtVGZhRW5mb3JjZWRHcm91cCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnRmYVN0YXRlRW51bS5URkFfRU5GT1JDRURfRk9SX0dST1VQO1xuICAgIH1cbiAgICBpZiAodGhpcy5zeXN0ZW1UZmFFbmFibGVkKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZmFTdGF0ZUVudW0uVEZBX0VOQUJMRURfQllfU1lTVEVNO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50ZmFTdGF0ZUVudW0uVEZBX1VOREVGSU5FRF9CWV9TWVNURU07XG4gIH1cblxuICBnZXQgdGZhQnlTbXNDYW5CZVNldCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgKHRoaXMudGZhU3RhdGUgIT09IHRoaXMudGZhU3RhdGVFbnVtLlRGQV9VTkRFRklORURfQllfU1lTVEVNIHx8IHRoaXMudGVuYW50VGZhRW5hYmxlZCkgJiZcbiAgICAgIHRoaXMuc21zR2F0ZXdheUF2YWlsYWJsZVxuICAgICk7XG4gIH1cblxuICBnZXQgdGZhQnlUb3RwQ2FuQmVTZXQoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICh0aGlzLnRmYVN0YXRlICE9PSB0aGlzLnRmYVN0YXRlRW51bS5URkFfVU5ERUZJTkVEX0JZX1NZU1RFTSB8fCB0aGlzLnRlbmFudFRmYUVuYWJsZWQpICYmXG4gICAgICB0aGlzLnByZWZlcnJlZExvZ2luT3B0aW9uVHlwZSA9PT0gVGVuYW50TG9naW5PcHRpb25UeXBlLk9BVVRIMl9JTlRFUk5BTFxuICAgICk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJjYXJkLWJsb2NrIHNlcGFyYXRvci10b3BcIlxuICAqbmdJZj1cInByZWZlcnJlZExvZ2luT3B0aW9uVHlwZSAhPT0gdGVuYW50TG9naW5PcHRpb25UeXBlRW51bS5PQVVUSDJcIlxuPlxuICA8ZGl2IGNsYXNzPVwiY29sLXNtLTJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaDQgdGV4dC1ub3JtYWwgdGV4dC1yaWdodCB0ZXh0LWxlZnQteHNcIj5cbiAgICAgIHt7ICdUd28tZmFjdG9yIGF1dGhlbnRpY2F0aW9uJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiY29sLXNtLTlcIj5cbiAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICA8bGFiZWxcbiAgICAgICAgY2xhc3M9XCJjOHktc3dpdGNoXCJcbiAgICAgICAgdGl0bGU9XCJ7eyAnRW5hYmxlIHR3by1mYWN0b3IgYXV0aGVudGljYXRpb24nIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICB0ZmFTdGF0ZSA9PT0gdGZhU3RhdGVFbnVtLlRGQV9VTkRFRklORURfQllfU1lTVEVNO1xuICAgICAgICAgIGVsc2UgZW5hYmxlZE9yRW5mb3JjZWRPblN5c3RlbUxldmVsVGVtcGxhdGVcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwidGVuYW50VGZhRW5hYmxlZFwiIG5hbWU9XCJ0ZW5hbnRUZmFFbmFibGVkXCIgLz5cbiAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICA8c3Bhbj57eyAnRW5hYmxlJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgIDwvbGFiZWw+XG5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjZW5hYmxlZE9yRW5mb3JjZWRPblN5c3RlbUxldmVsVGVtcGxhdGU+XG4gICAgICAgIDxkaXYgW25nU3dpdGNoXT1cInRmYVN0YXRlXCI+XG4gICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cInRmYVN0YXRlRW51bS5URkFfRU5BQkxFRF9CWV9TWVNURU1cIj5cbiAgICAgICAgICAgIHt7ICdUd28tZmFjdG9yIGF1dGhlbnRpY2F0aW9uIGlzIGVuYWJsZWQgb24gYWxsIHVzZXJzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1oZWxwIGJ0bi1oZWxwLS1zbVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidIZWxwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIHBvcG92ZXI9XCJ7eyBURkFfSVNfRU5BQkxFRF9CWV9TWVNURU1fUE9QT1ZFUiB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbVwiXG4gICAgICAgICAgICAgIHRyaWdnZXJzPVwiZm9jdXNcIlxuICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJ0ZmFTdGF0ZUVudW0uVEZBX0VORk9SQ0VEX0JZX1NZU1RFTVwiPlxuICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgIHt7ICdUd28tZmFjdG9yIGF1dGhlbnRpY2F0aW9uIGlzIGVuZm9yY2VkIG9uIGFsbCB1c2VycycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWhlbHAgYnRuLWhlbHAtLXNtXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidIZWxwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgcG9wb3Zlcj1cInt7IFRGQV9JU19FTkZPUkNFRF9CWV9TWVNURU1fUE9QT1ZFUiB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tXCJcbiAgICAgICAgICAgICAgICB0cmlnZ2Vycz1cImZvY3VzXCJcbiAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cInRmYVN0YXRlRW51bS5URkFfRU5GT1JDRURfRk9SX0dST1VQXCI+XG4gICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlIFt0cmFuc2xhdGVQYXJhbXNdPVwieyByb2xlOiBzeXN0ZW1UZmFFbmZvcmNlZEdyb3VwIH1cIiBuZ05vbkJpbmRhYmxlPlxuICAgICAgICAgICAgICAgIFR3by1mYWN0b3IgYXV0aGVudGljYXRpb24gaXMgZW5hYmxlZCBvbiBhbGwgdXNlcnMgYW5kIGVuZm9yY2VkIG9uIHVzZXJzIHdpdGggcm9sZVxuICAgICAgICAgICAgICAgIHt7IHJvbGUgfX0uXG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWhlbHAgYnRuLWhlbHAtLXNtXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidIZWxwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgcG9wb3Zlcj1cInt7IFRGQV9JU19FTkFCTEVEX0JZX0VORk9SQ0VfRk9SX0dST1VQX1BPUE9WRVIgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbVwiXG4gICAgICAgICAgICAgICAgdHJpZ2dlcnM9XCJmb2N1c1wiXG4gICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG5cbiAgICA8ZmllbGRzZXQgKm5nSWY9XCJ0ZmFCeVNtc0NhbkJlU2V0IHx8IHRmYUJ5VG90cENhbkJlU2V0XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgIDxjOHktZm9ybS1ncm91cCBjbGFzcz1cImNvbC1zbS02XCI+XG4gICAgICAgICAgPGxhYmVsIHRpdGxlPVwie3sgJ1RGQSBzdHJhdGVneScgfCB0cmFuc2xhdGUgfX1cIj5cbiAgICAgICAgICAgIHt7ICdURkEgc3RyYXRlZ3knIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWhlbHAgYnRuLWhlbHAtLXNtXCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0hlbHAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgcG9wb3Zlcj1cInt7IFNNU19BUFBfTk9UX1NVQlNDUklCRURfUE9QT1ZFUiB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbVwiXG4gICAgICAgICAgICAgIHRyaWdnZXJzPVwiZm9jdXNcIlxuICAgICAgICAgICAgICAqbmdJZj1cIiF0ZmFCeVNtc0NhbkJlU2V0XCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJidG4taGVscCBidG4taGVscC0tc21cIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInSGVscCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICBwb3BvdmVyPVwie3sgVE9UUF9SRVFVSVJFU19PQVVUSF9QT1BPVkVSIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tXCJcbiAgICAgICAgICAgICAgdHJpZ2dlcnM9XCJmb2N1c1wiXG4gICAgICAgICAgICAgICpuZ0lmPVwiIXRmYUJ5VG90cENhbkJlU2V0XCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICA8L2xhYmVsPlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImM4eS1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidURkEnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInRlbmFudFRmYVN0cmF0ZWd5XCJcbiAgICAgICAgICAgICAgbmFtZT1cInRlbmFudFRmYVN0cmF0ZWd5XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInt7IHRmYVN0cmF0ZWd5RW51bS5TTVMgfX1cIiB0cmFuc2xhdGUgW2Rpc2FibGVkXT1cIiF0ZmFCeVNtc0NhbkJlU2V0XCI+XG4gICAgICAgICAgICAgICAgU01TIGJhc2VkXG4gICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwie3sgdGZhU3RyYXRlZ3lFbnVtLlRPVFAgfX1cIiB0cmFuc2xhdGUgW2Rpc2FibGVkXT1cIiF0ZmFCeVRvdHBDYW5CZVNldFwiPlxuICAgICAgICAgICAgICAgIFRPVFBcbiAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwicm93XCJcbiAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICB0ZW5hbnRUZmFTdHJhdGVneSA9PT0gdGZhU3RyYXRlZ3lFbnVtLlRPVFAgJiZcbiAgICAgICAgICB0ZmFTdGF0ZSAhPT0gdGZhU3RhdGVFbnVtLlRGQV9FTkZPUkNFRF9CWV9TWVNURU1cbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAgPGxhYmVsIHRpdGxlPVwie3sgJ0VuZm9yY2VtZW50JyB8IHRyYW5zbGF0ZSB9fVwiPnt7ICdFbmZvcmNlbWVudCcgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jb250cm9sLXN0YXRpY1wiPlxuICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnRW5mb3JjZSB0d28tZmFjdG9yIGF1dGhlbnRpY2F0aW9uIG9uIGFsbCB1c2VycycgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgY2xhc3M9XCJjOHktc3dpdGNoXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgbmFtZT1cInRlbmFudFRmYUVuZm9yY2VkXCIgWyhuZ01vZGVsKV09XCJ0ZW5hbnRUZmFFbmZvcmNlZFwiIC8+XG4gICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICA8c3Bhbj57eyAnRW5mb3JjZSB0d28tZmFjdG9yIGF1dGhlbnRpY2F0aW9uIG9uIGFsbCB1c2VycycgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInJvd1wiICpuZ0lmPVwidGVuYW50VGZhU3RyYXRlZ3kgPT09IHRmYVN0cmF0ZWd5RW51bS5TTVNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS02XCI+XG4gICAgICAgICAgPGM4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgPGxhYmVsIHRpdGxlPVwie3sgJ1Rva2VuIHZhbGlkaXR5IGxpbWl0JyB8IHRyYW5zbGF0ZSB9fVwiPlxuICAgICAgICAgICAgICB7eyAnVG9rZW4gdmFsaWRpdHkgbGltaXQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1oZWxwIGJ0bi1oZWxwLS1zbVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInSGVscCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIHBvcG92ZXI9XCJ7eyBURkFfSVNfRU5GT1JDRURfQllfU1lTVEVNX1BPUE9WRVIgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cInJpZ2h0XCJcbiAgICAgICAgICAgICAgICB0cmlnZ2Vycz1cImZvY3VzXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIiFzeXN0ZW1UZmFUZW5hbnRTY29wZVNldHRpbmdFbmFibGVkXCJcbiAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4taGVscCBidG4taGVscC0tc21cIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0hlbHAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBwb3BvdmVyPVwie3sgVE9LRU5fVkFMSURJVFlfREVURVJNSU5FRF9CWV9KV1RfUE9QT1ZFUiB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50PVwicmlnaHRcIlxuICAgICAgICAgICAgICAgIHRyaWdnZXJzPVwiZm9jdXNcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICBzeXN0ZW1UZmFUZW5hbnRTY29wZVNldHRpbmdFbmFibGVkICYmXG4gICAgICAgICAgICAgICAgICBwcmVmZXJyZWRMb2dpbk9wdGlvblR5cGUgPT09IHRlbmFudExvZ2luT3B0aW9uVHlwZUVudW0uT0FVVEgyX0lOVEVSTkFMXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCB0ZXh0LXJpZ2h0XCJcbiAgICAgICAgICAgICAgICBuYW1lPVwidGVuYW50VGZhVG9rZW5WYWxpZGl0eVwiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ0ZW5hbnRUZmFUb2tlblZhbGlkaXR5XCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgICAgICAhc3lzdGVtVGZhVGVuYW50U2NvcGVTZXR0aW5nRW5hYmxlZCB8fFxuICAgICAgICAgICAgICAgICAgcHJlZmVycmVkTG9naW5PcHRpb25UeXBlID09PSB0ZW5hbnRMb2dpbk9wdGlvblR5cGVFbnVtLk9BVVRIMl9JTlRFUk5BTFxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cInN5c3RlbVRmYVRlbmFudFNjb3BlU2V0dGluZ0VuYWJsZWRcIlxuICAgICAgICAgICAgICAgIFttYXhdPVwiOTk5OTk5XCJcbiAgICAgICAgICAgICAgICBbbWluXT1cIjBcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlucHV0LWdyb3VwLWFkZG9uXCIgdHJhbnNsYXRlPm1pbnV0ZXM8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS02XCI+XG4gICAgICAgICAgPGM4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgPGxhYmVsIHRpdGxlPVwie3sgJ1ZlcmlmaWNhdGlvbiBjb2RlIHZhbGlkaXR5IGxpbWl0JyB8IHRyYW5zbGF0ZSB9fVwiPlxuICAgICAgICAgICAgICB7eyAnVmVyaWZpY2F0aW9uIGNvZGUgdmFsaWRpdHkgbGltaXQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1oZWxwIGJ0bi1oZWxwLS1zbVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInSGVscCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIHBvcG92ZXI9XCJ7eyBURkFfSVNfRU5GT1JDRURfQllfU1lTVEVNX1BPUE9WRVIgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cInJpZ2h0XCJcbiAgICAgICAgICAgICAgICB0cmlnZ2Vycz1cImZvY3VzXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIiFze