UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

43 lines 55.4 kB
import { __decorate, __metadata } from "tslib";
import { Component, Input } from '@angular/core';
import { gettext, memoize } from '@c8y/ngx-components';
import { ControlContainer, NgForm } from '@angular/forms';
import { algorithmTypeConfig, CertificateType, certificateTypeConfig } from './signature-configuration.model';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
import * as i2 from "@c8y/ngx-components";
import * as i3 from "@angular/common";
import * as i4 from "ngx-bootstrap/tooltip";
import * as i5 from "ngx-bootstrap/popover";
import * as i6 from "ngx-bootstrap/datepicker";
export class SignatureConfigurationComponent {
    constructor(controlContainer) {
        this.controlContainer = controlContainer;
        this.certificateType = CertificateType;
        this.certificateTypes = certificateTypeConfig;
        this.algorithmTypes = algorithmTypeConfig;
        this.CERTIFICATE_ID_FIELD_POPOVER = gettext('This is the name of the field in the token whose value will be used to select one of the certificates below which has matching "Certificate ID value".');
    }
    shouldShow(field) {
        return field in this.templateModel;
    }
    removeCustomCertificate(customCertificate) {
        this.templateModel.signatureVerificationConfig.manual.removeCustomCertificate(customCertificate);
        this.controlContainer.control.markAsDirty();
    }
    static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SignatureConfigurationComponent, deps: [{ token: i1.ControlContainer }], target: i0.ɵɵFactoryTarget.Component }); }
    static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SignatureConfigurationComponent, selector: "c8y-sso-signature-configuration", inputs: { templateModel: "templateModel" }, ngImport: i0, template: "<div class=\"p-24\">\n  <div class=\"row\">\n    <div class=\"col-xs-12 col-sm-3 col-md-2\">\n      <div\n        class=\"h4 text-normal text-right text-left-xs\"\n        translate\n      >\n        Signature verification\n      </div>\n    </div>\n    <div class=\"col-xs-12 col-sm-9 col-md-10 col-lg-9\">\n      <div\n        *ngIf=\"shouldShow('certificateType')\"\n        class=\"form-group p-relative\"\n      >\n        <div class=\"row\">\n          <div class=\"col-sm-6\">\n            <label\n              for=\"certificateType\"\n              class=\"control-label\"\n              translate\n            >\n              Verifier\n            </label>\n            <div class=\"c8y-select-wrapper\">\n              <select\n                class=\"form-control\"\n                id=\"certificateType\"\n                name=\"certificateType\"\n                [(ngModel)]=\"templateModel.signatureVerificationConfig.certificateTypeChosen\"\n              >\n                <option\n                  *ngFor=\"let certificateType of certificateTypes | keyvalue\"\n                  [ngValue]=\"certificateType.key\"\n                >\n                  {{ certificateType.value.label | translate }}\n                </option>\n              </select>\n              <span></span>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div\n        id=\"adfs\"\n        *ngIf=\"\n          templateModel.signatureVerificationConfig.certificateTypeChosen === certificateType.ADFS\n        \"\n        class=\"row\"\n      >\n        <div class=\"col-sm-6\">\n          <c8y-form-group>\n            <label\n              for=\"adfsManifestUrl\"\n              class=\"control-label\"\n              translate\n            >\n              ADFS manifest URL\n            </label>\n            <input\n              type=\"url\"\n              class=\"form-control\"\n              required\n              [placeholder]=\"\n                'e.g. {{ example }}'\n                  | translate\n                    : {\n                        example: 'https://adfs.tenant.com/federationmetadata/federationmetadata.xml'\n                      }\n              \"\n              [(ngModel)]=\"templateModel.signatureVerificationConfig.adfsManifest.manifestUrl\"\n              name=\"adfsManifestUrl\"\n              id=\"adfsManifestUrl\"\n            />\n          </c8y-form-group>\n        </div>\n      </div>\n\n      <div\n        id=\"add\"\n        *ngIf=\"\n          templateModel.signatureVerificationConfig.certificateTypeChosen === certificateType.AZURE\n        \"\n      >\n        <div class=\"row\">\n          <div class=\"col-sm-6\">\n            <c8y-form-group>\n              <label\n                for=\"publicKeyDiscoveryUrl\"\n                class=\"control-label\"\n                translate\n              >\n                Public key discovery URL\n              </label>\n              <input\n                type=\"url\"\n                id=\"publicKeyDiscoveryUrl\"\n                class=\"form-control\"\n                required\n                [placeholder]=\"\n                  'e.g. {{ example }}'\n                    | translate\n                      : { example: 'https://login.microsoftonline.de/tenant/discovery/keys' }\n                \"\n                name=\"publicKeyDiscoveryUrl\"\n                [(ngModel)]=\"templateModel.signatureVerificationConfig.aad.publicKeyDiscoveryUrl\"\n              />\n            </c8y-form-group>\n          </div>\n        </div>\n      </div>\n\n      <div\n        id=\"jwks\"\n        *ngIf=\"\n          templateModel.signatureVerificationConfig.certificateTypeChosen === certificateType.JWKS\n        \"\n      >\n        <div class=\"row\">\n          <div class=\"col-sm-6\">\n            <c8y-form-group>\n              <label\n                for=\"jwksPublicKeyDiscoveryUrl\"\n                class=\"control-label\"\n                translate\n              >\n                JWKS URL\n              </label>\n              <input\n                type=\"url\"\n                class=\"form-control\"\n                id=\"jwksPublicKeyDiscoveryUrl\"\n                required\n                [placeholder]=\"\n                  'e.g. {{ example }}' | translate: { example: 'http://www.example.com/' }\n                \"\n                name=\"jwksUri\"\n                [(ngModel)]=\"templateModel.signatureVerificationConfig.jwks.jwksUri\"\n              />\n            </c8y-form-group>\n          </div>\n        </div>\n      </div>\n\n      <div\n        id=\"manual\"\n        *ngIf=\"\n          templateModel.signatureVerificationConfig.certificateTypeChosen === certificateType.CUSTOM\n        \"\n      >\n        <fieldset\n          class=\"c8y-fieldset p-24\"\n          *ngIf=\"templateModel.signatureVerificationConfig.manual.customCertificates.length > 1\"\n        >\n          <legend>\n            {{ 'Manual' | translate }}\n          </legend>\n          <div class=\"row\">\n            <div class=\"col-md-6\">\n              <label\n                for=\"certIdField\"\n                class=\"control-label\"\n              >\n                {{ 'Certificate ID field' | translate }}\n                <button\n                  class=\"btn-help btn-help--sm\"\n                  type=\"button\"\n                  [attr.aria-label]=\"'Help' | translate\"\n                  popover=\"{{ CERTIFICATE_ID_FIELD_POPOVER | translate }}\"\n                  placement=\"right\"\n                  triggers=\"focus\"\n                ></button>\n              </label>\n              <input\n                type=\"text\"\n                class=\"form-control\"\n                name=\"certIdField\"\n                id=\"certIdField\"\n                [(ngModel)]=\"templateModel.signatureVerificationConfig.manual.certIdField\"\n                required\n              />\n            </div>\n          </div>\n        </fieldset>\n\n        <fieldset class=\"c8y-fieldset p-24\">\n          <legend>\n            {{ 'Certificates' | translate }}\n          </legend>\n          <fieldset\n            class=\"c8y-fieldset p-16\"\n            *ngFor=\"\n              let customCertificate of templateModel.signatureVerificationConfig.manual\n                .customCertificates;\n              index as crtIndex\n            \"\n          >\n            <div class=\"row\">\n              <div\n                class=\"col-sm-6\"\n                *ngIf=\"\n                  templateModel.signatureVerificationConfig.manual.customCertificates.length > 1\n                \"\n              >\n                <c8y-form-group>\n                  <label\n                    [for]=\"'customCertificateValue' + crtIndex\"\n                    class=\"control-label\"\n                    translate\n                  >\n                    Certificate ID value\n                  </label>\n                  <input\n                    [name]=\"'customCertificateValue' + crtIndex\"\n                    [id]=\"'customCertificateValue' + crtIndex\"\n                    type=\"text\"\n                    class=\"form-control\"\n                    [(ngModel)]=\"customCertificate.key\"\n                    required\n                  />\n                </c8y-form-group>\n              </div>\n              <div class=\"col-sm-6\">\n                <c8y-form-group>\n                  <label class=\"control-label\">\n                    {{ 'Type' | translate }}\n                  </label>\n                  <label\n                    title=\"{{ algorithmType.value.label | translate }}\"\n                    class=\"c8y-radio input-sm\"\n                    *ngFor=\"let algorithmType of algorithmTypes | keyvalue; index as algIndex\"\n                  >\n                    <input\n                      type=\"radio\"\n                      [name]=\"'alg' + crtIndex + algIndex\"\n                      [value]=\"algorithmType.key\"\n                      [(ngModel)]=\"customCertificate.alg\"\n                    />\n                    <span></span>\n                    <span>{{ algorithmType.value.label | translate }}</span>\n                  </label>\n                </c8y-form-group>\n              </div>\n            </div>\n\n            <div class=\"row\">\n              <div class=\"col-md-5\">\n                <c8y-form-group>\n                  <label\n                    class=\"control-label\"\n                    [for]=\"'publicKey' + crtIndex\"\n                    *ngIf=\"customCertificate.alg === algorithmTypes.PCKS.value\"\n                    translate\n                  >\n                    Certificate in PEM format\n                  </label>\n                  <label\n                    class=\"control-label\"\n                    [for]=\"'publicKey' + crtIndex\"\n                    *ngIf=\"customCertificate.alg === algorithmTypes.RSA.value\"\n                    translate\n                  >\n                    Public key in PEM format\n                  </label>\n                  <input\n                    [name]=\"'publicKey' + crtIndex\"\n                    [id]=\"'publicKey' + crtIndex\"\n                    type=\"text\"\n                    class=\"form-control\"\n                    [(ngModel)]=\"customCertificate.publicKey\"\n                    required\n                  />\n                </c8y-form-group>\n              </div>\n              <div class=\"col-md-3\">\n                <div class=\"form-group datepicker\">\n                  <c8y-form-group>\n                    <label\n                      [for]=\"'validFromPicker' + crtIndex\"\n                      class=\"control-label\"\n                    >\n                      {{ 'Valid from' | translate }}\n                    </label>\n                    <input\n                      [name]=\"'validFromPicker' + crtIndex\"\n                      [id]=\"'validFromPicker' + crtIndex\"\n                      [(ngModel)]=\"customCertificate.validFrom\"\n                      class=\"form-control\"\n                      [attr.aria-label]=\"'Date from' | translate\"\n                      placeholder=\"{{ 'Date from' | translate }}\"\n                      [bsConfig]=\"{ customTodayClass: 'today', adaptivePosition: true }\"\n                      [maxDate]=\"customCertificate.validTill\"\n                      bsDatepicker\n                      required\n                    />\n                  </c8y-form-group>\n                </div>\n              </div>\n              <div class=\"col-md-3\">\n                <div class=\"form-group datepicker\">\n                  <c8y-form-group>\n                    <label\n                      [for]=\"'validTillPicker' + crtIndex\"\n                      class=\"control-label\"\n                    >\n                      {{ 'Valid till' | translate }}\n                    </label>\n                    <input\n                      [name]=\"'validTillPicker' + crtIndex\"\n                      [id]=\"'validTillPicker' + crtIndex\"\n                      [(ngModel)]=\"customCertificate.validTill\"\n                      class=\"form-control\"\n                      placeholder=\"{{ 'Date to' | translate }}\"\n                      [attr.aria-label]=\"'Date to' | translate\"\n                      [bsConfig]=\"{ customTodayClass: 'today', adaptivePosition: true }\"\n                      bsDatepicker\n                      [minDate]=\"customCertificate.validFrom\"\n                      required\n                    />\n                  </c8y-form-group>\n                </div>\n              </div>\n              <div\n                class=\"col-md-1\"\n                *ngIf=\"\n                  templateModel.signatureVerificationConfig.manual.customCertificates.length > 1\n                \"\n              >\n                <label>&nbsp;</label>\n                <button\n                  class=\"btn btn-danger btn-sm visible-xs visible-sm\"\n                  type=\"button\"\n                  title=\"{{ 'Delete certificate' | translate }}\"\n                  (click)=\"removeCustomCertificate(customCertificate)\"\n                >\n                  <i\n                    c8yIcon=\"minus-circle\"\n                    class=\"m-r-4\"\n                  ></i>\n                  <span>{{ 'Delete certificate' | translate }}</span>\n                </button>\n\n                <button\n                  class=\"btn btn-dot btn-dot--danger visible-md visible-lg\"\n                  type=\"button\"\n                  tooltip=\"{{ 'Delete certificate' | translate }}\"\n                  placement=\"top\"\n                  [adaptivePosition]=\"false\"\n                  [attr.aria-label]=\"'Delete certificate' | translate\"\n                  [delay]=\"300\"\n                  (click)=\"removeCustomCertificate(customCertificate)\"\n                >\n                  <i c8yIcon=\"minus-circle\"></i>\n                </button>\n              </div>\n            </div>\n          </fieldset>\n          <button\n            class=\"btn btn-default m-t-8\"\n            type=\"button\"\n            title=\"{{ 'Add certificate' | translate }}\"\n            (click)=\"templateModel.signatureVerificationConfig.manual.addCustomCertificate()\"\n            name=\"addCertificate\"\n          >\n            <i\n              c8yIcon=\"plus-circle\"\n              class=\"m-r-4\"\n            ></i>\n            <span>{{ 'Add certificate' | translate }}</span>\n          </button>\n        </fieldset>\n      </div>\n    </div>\n  </div>\n</div>\n", dependencies: [{ kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.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: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i2.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i2.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i4.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "directive", type: i5.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "directive", type: i6.BsDatepickerDirective, selector: "[bsDatepicker]", inputs: ["placement", "triggers", "outsideClick", "container", "outsideEsc", "isDisabled", "minDate", "maxDate", "minMode", "daysDisabled", "datesDisabled", "datesEnabled", "dateCustomClasses", "dateTooltipTexts", "isOpen", "bsValue", "bsConfig"], outputs: ["onShown", "onHidden", "bsValueChange"], exportAs: ["bsDatepicker"] }, { kind: "directive", type: i6.BsDatepickerInputDirective, selector: "input[bsDatepicker]" }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i3.KeyValuePipe, name: "keyvalue" }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] }); }
}
__decorate([
    memoize(),
    __metadata("design:type", Function),
    __metadata("design:paramtypes", [String]),
    __metadata("design:returntype", void 0)
], SignatureConfigurationComponent.prototype, "shouldShow", null);
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SignatureConfigurationComponent, decorators: [{
            type: Component,
            args: [{ selector: 'c8y-sso-signature-configuration', viewProviders: [{ provide: ControlContainer, useExisting: NgForm }], template: "<div class=\"p-24\">\n  <div class=\"row\">\n    <div class=\"col-xs-12 col-sm-3 col-md-2\">\n      <div\n        class=\"h4 text-normal text-right text-left-xs\"\n        translate\n      >\n        Signature verification\n      </div>\n    </div>\n    <div class=\"col-xs-12 col-sm-9 col-md-10 col-lg-9\">\n      <div\n        *ngIf=\"shouldShow('certificateType')\"\n        class=\"form-group p-relative\"\n      >\n        <div class=\"row\">\n          <div class=\"col-sm-6\">\n            <label\n              for=\"certificateType\"\n              class=\"control-label\"\n              translate\n            >\n              Verifier\n            </label>\n            <div class=\"c8y-select-wrapper\">\n              <select\n                class=\"form-control\"\n                id=\"certificateType\"\n                name=\"certificateType\"\n                [(ngModel)]=\"templateModel.signatureVerificationConfig.certificateTypeChosen\"\n              >\n                <option\n                  *ngFor=\"let certificateType of certificateTypes | keyvalue\"\n                  [ngValue]=\"certificateType.key\"\n                >\n                  {{ certificateType.value.label | translate }}\n                </option>\n              </select>\n              <span></span>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div\n        id=\"adfs\"\n        *ngIf=\"\n          templateModel.signatureVerificationConfig.certificateTypeChosen === certificateType.ADFS\n        \"\n        class=\"row\"\n      >\n        <div class=\"col-sm-6\">\n          <c8y-form-group>\n            <label\n              for=\"adfsManifestUrl\"\n              class=\"control-label\"\n              translate\n            >\n              ADFS manifest URL\n            </label>\n            <input\n              type=\"url\"\n              class=\"form-control\"\n              required\n              [placeholder]=\"\n                'e.g. {{ example }}'\n                  | translate\n                    : {\n                        example: 'https://adfs.tenant.com/federationmetadata/federationmetadata.xml'\n                      }\n              \"\n              [(ngModel)]=\"templateModel.signatureVerificationConfig.adfsManifest.manifestUrl\"\n              name=\"adfsManifestUrl\"\n              id=\"adfsManifestUrl\"\n            />\n          </c8y-form-group>\n        </div>\n      </div>\n\n      <div\n        id=\"add\"\n        *ngIf=\"\n          templateModel.signatureVerificationConfig.certificateTypeChosen === certificateType.AZURE\n        \"\n      >\n        <div class=\"row\">\n          <div class=\"col-sm-6\">\n            <c8y-form-group>\n              <label\n                for=\"publicKeyDiscoveryUrl\"\n                class=\"control-label\"\n                translate\n              >\n                Public key discovery URL\n              </label>\n              <input\n                type=\"url\"\n                id=\"publicKeyDiscoveryUrl\"\n                class=\"form-control\"\n                required\n                [placeholder]=\"\n                  'e.g. {{ example }}'\n                    | translate\n                      : { example: 'https://login.microsoftonline.de/tenant/discovery/keys' }\n                \"\n                name=\"publicKeyDiscoveryUrl\"\n                [(ngModel)]=\"templateModel.signatureVerificationConfig.aad.publicKeyDiscoveryUrl\"\n              />\n            </c8y-form-group>\n          </div>\n        </div>\n      </div>\n\n      <div\n        id=\"jwks\"\n        *ngIf=\"\n          templateModel.signatureVerificationConfig.certificateTypeChosen === certificateType.JWKS\n        \"\n      >\n        <div class=\"row\">\n          <div class=\"col-sm-6\">\n            <c8y-form-group>\n              <label\n                for=\"jwksPublicKeyDiscoveryUrl\"\n                class=\"control-label\"\n                translate\n              >\n                JWKS URL\n              </label>\n              <input\n                type=\"url\"\n                class=\"form-control\"\n                id=\"jwksPublicKeyDiscoveryUrl\"\n                required\n                [placeholder]=\"\n                  'e.g. {{ example }}' | translate: { example: 'http://www.example.com/' }\n                \"\n                name=\"jwksUri\"\n                [(ngModel)]=\"templateModel.signatureVerificationConfig.jwks.jwksUri\"\n              />\n            </c8y-form-group>\n          </div>\n        </div>\n      </div>\n\n      <div\n        id=\"manual\"\n        *ngIf=\"\n          templateModel.signatureVerificationConfig.certificateTypeChosen === certificateType.CUSTOM\n        \"\n      >\n        <fieldset\n          class=\"c8y-fieldset p-24\"\n          *ngIf=\"templateModel.signatureVerificationConfig.manual.customCertificates.length > 1\"\n        >\n          <legend>\n            {{ 'Manual' | translate }}\n          </legend>\n          <div class=\"row\">\n            <div class=\"col-md-6\">\n              <label\n                for=\"certIdField\"\n                class=\"control-label\"\n              >\n                {{ 'Certificate ID field' | translate }}\n                <button\n                  class=\"btn-help btn-help--sm\"\n                  type=\"button\"\n                  [attr.aria-label]=\"'Help' | translate\"\n                  popover=\"{{ CERTIFICATE_ID_FIELD_POPOVER | translate }}\"\n                  placement=\"right\"\n                  triggers=\"focus\"\n                ></button>\n              </label>\n              <input\n                type=\"text\"\n                class=\"form-control\"\n                name=\"certIdField\"\n                id=\"certIdField\"\n                [(ngModel)]=\"templateModel.signatureVerificationConfig.manual.certIdField\"\n                required\n              />\n            </div>\n          </div>\n        </fieldset>\n\n        <fieldset class=\"c8y-fieldset p-24\">\n          <legend>\n            {{ 'Certificates' | translate }}\n          </legend>\n          <fieldset\n            class=\"c8y-fieldset p-16\"\n            *ngFor=\"\n              let customCertificate of templateModel.signatureVerificationConfig.manual\n                .customCertificates;\n              index as crtIndex\n            \"\n          >\n            <div class=\"row\">\n              <div\n                class=\"col-sm-6\"\n                *ngIf=\"\n                  templateModel.signatureVerificationConfig.manual.customCertificates.length > 1\n                \"\n              >\n                <c8y-form-group>\n                  <label\n                    [for]=\"'customCertificateValue' + crtIndex\"\n                    class=\"control-label\"\n                    translate\n                  >\n                    Certificate ID value\n                  </label>\n                  <input\n                    [name]=\"'customCertificateValue' + crtIndex\"\n                    [id]=\"'customCertificateValue' + crtIndex\"\n                    type=\"text\"\n                    class=\"form-control\"\n                    [(ngModel)]=\"customCertificate.key\"\n                    required\n                  />\n                </c8y-form-group>\n              </div>\n              <div class=\"col-sm-6\">\n                <c8y-form-group>\n                  <label class=\"control-label\">\n                    {{ 'Type' | translate }}\n                  </label>\n                  <label\n                    title=\"{{ algorithmType.value.label | translate }}\"\n                    class=\"c8y-radio input-sm\"\n                    *ngFor=\"let algorithmType of algorithmTypes | keyvalue; index as algIndex\"\n                  >\n                    <input\n                      type=\"radio\"\n                      [name]=\"'alg' + crtIndex + algIndex\"\n                      [value]=\"algorithmType.key\"\n                      [(ngModel)]=\"customCertificate.alg\"\n                    />\n                    <span></span>\n                    <span>{{ algorithmType.value.label | translate }}</span>\n                  </label>\n                </c8y-form-group>\n              </div>\n            </div>\n\n            <div class=\"row\">\n              <div class=\"col-md-5\">\n                <c8y-form-group>\n                  <label\n                    class=\"control-label\"\n                    [for]=\"'publicKey' + crtIndex\"\n                    *ngIf=\"customCertificate.alg === algorithmTypes.PCKS.value\"\n                    translate\n                  >\n                    Certificate in PEM format\n                  </label>\n                  <label\n                    class=\"control-label\"\n                    [for]=\"'publicKey' + crtIndex\"\n                    *ngIf=\"customCertificate.alg === algorithmTypes.RSA.value\"\n                    translate\n                  >\n                    Public key in PEM format\n                  </label>\n                  <input\n                    [name]=\"'publicKey' + crtIndex\"\n                    [id]=\"'publicKey' + crtIndex\"\n                    type=\"text\"\n                    class=\"form-control\"\n                    [(ngModel)]=\"customCertificate.publicKey\"\n                    required\n                  />\n                </c8y-form-group>\n              </div>\n              <div class=\"col-md-3\">\n                <div class=\"form-group datepicker\">\n                  <c8y-form-group>\n                    <label\n                      [for]=\"'validFromPicker' + crtIndex\"\n                      class=\"control-label\"\n                    >\n                      {{ 'Valid from' | translate }}\n                    </label>\n                    <input\n                      [name]=\"'validFromPicker' + crtIndex\"\n                      [id]=\"'validFromPicker' + crtIndex\"\n                      [(ngModel)]=\"customCertificate.validFrom\"\n                      class=\"form-control\"\n                      [attr.aria-label]=\"'Date from' | translate\"\n                      placeholder=\"{{ 'Date from' | translate }}\"\n                      [bsConfig]=\"{ customTodayClass: 'today', adaptivePosition: true }\"\n                      [maxDate]=\"customCertificate.validTill\"\n                      bsDatepicker\n                      required\n                    />\n                  </c8y-form-group>\n                </div>\n              </div>\n              <div class=\"col-md-3\">\n                <div class=\"form-group datepicker\">\n                  <c8y-form-group>\n                    <label\n                      [for]=\"'validTillPicker' + crtIndex\"\n                      class=\"control-label\"\n                    >\n                      {{ 'Valid till' | translate }}\n                    </label>\n                    <input\n                      [name]=\"'validTillPicker' + crtIndex\"\n                      [id]=\"'validTillPicker' + crtIndex\"\n                      [(ngModel)]=\"customCertificate.validTill\"\n                      class=\"form-control\"\n                      placeholder=\"{{ 'Date to' | translate }}\"\n                      [attr.aria-label]=\"'Date to' | translate\"\n                      [bsConfig]=\"{ customTodayClass: 'today', adaptivePosition: true }\"\n                      bsDatepicker\n                      [minDate]=\"customCertificate.validFrom\"\n                      required\n                    />\n                  </c8y-form-group>\n                </div>\n              </div>\n              <div\n                class=\"col-md-1\"\n                *ngIf=\"\n                  templateModel.signatureVerificationConfig.manual.customCertificates.length > 1\n                \"\n              >\n                <label>&nbsp;</label>\n                <button\n                  class=\"btn btn-danger btn-sm visible-xs visible-sm\"\n                  type=\"button\"\n                  title=\"{{ 'Delete certificate' | translate }}\"\n                  (click)=\"removeCustomCertificate(customCertificate)\"\n                >\n                  <i\n                    c8yIcon=\"minus-circle\"\n                    class=\"m-r-4\"\n                  ></i>\n                  <span>{{ 'Delete certificate' | translate }}</span>\n                </button>\n\n                <button\n                  class=\"btn btn-dot btn-dot--danger visible-md visible-lg\"\n                  type=\"button\"\n                  tooltip=\"{{ 'Delete certificate' | translate }}\"\n                  placement=\"top\"\n                  [adaptivePosition]=\"false\"\n                  [attr.aria-label]=\"'Delete certificate' | translate\"\n                  [delay]=\"300\"\n                  (click)=\"removeCustomCertificate(customCertificate)\"\n                >\n                  <i c8yIcon=\"minus-circle\"></i>\n                </button>\n              </div>\n            </div>\n          </fieldset>\n          <button\n            class=\"btn btn-default m-t-8\"\n            type=\"button\"\n            title=\"{{ 'Add certificate' | translate }}\"\n            (click)=\"templateModel.signatureVerificationConfig.manual.addCustomCertificate()\"\n            name=\"addCertificate\"\n          >\n            <i\n              c8yIcon=\"plus-circle\"\n              class=\"m-r-4\"\n            ></i>\n            <span>{{ 'Add certificate' | translate }}</span>\n          </button>\n        </fieldset>\n      </div>\n    </div>\n  </div>\n</div>\n" }]
        }], ctorParameters: () => [{ type: i1.ControlContainer }], propDecorators: { templateModel: [{
                type: Input
            }], shouldShow: [] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmF0dXJlLWNvbmZpZ3VyYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vYXV0aC1jb25maWd1cmF0aW9uL3Nzby1jb25maWd1cmF0aW9uL3RlbXBsYXRlLXBhcnRzL3NpZ25hdHVyZS1jb25maWd1cmF0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL2F1dGgtY29uZmlndXJhdGlvbi9zc28tY29uZmlndXJhdGlvbi90ZW1wbGF0ZS1wYXJ0cy9zaWduYXR1cmUtY29uZmlndXJhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUQsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixlQUFlLEVBQ2YscUJBQXFCLEVBRXRCLE1BQU0saUNBQWlDLENBQUM7Ozs7Ozs7O0FBT3pDLE1BQU0sT0FBTywrQkFBK0I7SUFZMUMsWUFBc0IsZ0JBQWtDO1FBQWxDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFUeEQsb0JBQWUsR0FBRyxlQUFlLENBQUM7UUFDbEMscUJBQWdCLEdBQUcscUJBQXFCLENBQUM7UUFFekMsbUJBQWMsR0FBRyxtQkFBbUIsQ0FBQztRQUVyQyxpQ0FBNEIsR0FBRyxPQUFPLENBQ3BDLHdKQUF3SixDQUN6SixDQUFDO0lBRXlELENBQUM7SUFHNUQsVUFBVSxDQUFDLEtBQWE7UUFDdEIsT0FBTyxLQUFLLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUNyQyxDQUFDO0lBRUQsdUJBQXVCLENBQUMsaUJBQW9DO1FBQzFELElBQUksQ0FBQyxhQUFhLENBQUMsMkJBQTJCLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUMzRSxpQkFBaUIsQ0FDbEIsQ0FBQztRQUNGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDOUMsQ0FBQzsrR0F4QlUsK0JBQStCO21HQUEvQiwrQkFBK0IsbUhDZjVDLGcyYUF1WEEsaWtIRDFXaUIsQ0FBQyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUM7O0FBaUJuRTtJQURDLE9BQU8sRUFBRTs7OztpRUFHVDs0RkFqQlUsK0JBQStCO2tCQUwzQyxTQUFTOytCQUNFLGlDQUFpQyxpQkFFNUIsQ0FBQyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLENBQUM7cUZBRzFELGFBQWE7c0JBQXJCLEtBQUs7Z0JBY04sVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGdldHRleHQsIG1lbW9pemUgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IENvbnRyb2xDb250YWluZXIsIE5nRm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIGFsZ29yaXRobVR5cGVDb25maWcsXG4gIENlcnRpZmljYXRlVHlwZSxcbiAgY2VydGlmaWNhdGVUeXBlQ29uZmlnLFxuICBDdXN0b21DZXJ0aWZpY2F0ZVxufSBmcm9tICcuL3NpZ25hdHVyZS1jb25maWd1cmF0aW9uLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LXNzby1zaWduYXR1cmUtY29uZmlndXJhdGlvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zaWduYXR1cmUtY29uZmlndXJhdGlvbi5jb21wb25lbnQuaHRtbCcsXG4gIHZpZXdQcm92aWRlcnM6IFt7IHByb3ZpZGU6IENvbnRyb2xDb250YWluZXIsIHVzZUV4aXN0aW5nOiBOZ0Zvcm0gfV1cbn0pXG5leHBvcnQgY2xhc3MgU2lnbmF0dXJlQ29uZmlndXJhdGlvbkNvbXBvbmVudCB7XG4gIEBJbnB1dCgpIHRlbXBsYXRlTW9kZWw7XG5cbiAgY2VydGlmaWNhdGVUeXBlID0gQ2VydGlmaWNhdGVUeXBlO1xuICBjZXJ0aWZpY2F0ZVR5cGVzID0gY2VydGlmaWNhdGVUeXBlQ29uZmlnO1xuXG4gIGFsZ29yaXRobVR5cGVzID0gYWxnb3JpdGhtVHlwZUNvbmZpZztcblxuICBDRVJUSUZJQ0FURV9JRF9GSUVMRF9QT1BPVkVSID0gZ2V0dGV4dChcbiAgICAnVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgZmllbGQgaW4gdGhlIHRva2VuIHdob3NlIHZhbHVlIHdpbGwgYmUgdXNlZCB0byBzZWxlY3Qgb25lIG9mIHRoZSBjZXJ0aWZpY2F0ZXMgYmVsb3cgd2hpY2ggaGFzIG1hdGNoaW5nIFwiQ2VydGlmaWNhdGUgSUQgdmFsdWVcIi4nXG4gICk7XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGNvbnRyb2xDb250YWluZXI6IENvbnRyb2xDb250YWluZXIpIHt9XG5cbiAgQG1lbW9pemUoKVxuICBzaG91bGRTaG93KGZpZWxkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZmllbGQgaW4gdGhpcy50ZW1wbGF0ZU1vZGVsO1xuICB9XG5cbiAgcmVtb3ZlQ3VzdG9tQ2VydGlmaWNhdGUoY3VzdG9tQ2VydGlmaWNhdGU6IEN1c3RvbUNlcnRpZmljYXRlKSB7XG4gICAgdGhpcy50ZW1wbGF0ZU1vZGVsLnNpZ25hdHVyZVZlcmlmaWNhdGlvbkNvbmZpZy5tYW51YWwucmVtb3ZlQ3VzdG9tQ2VydGlmaWNhdGUoXG4gICAgICBjdXN0b21DZXJ0aWZpY2F0ZVxuICAgICk7XG4gICAgdGhpcy5jb250cm9sQ29udGFpbmVyLmNvbnRyb2wubWFya0FzRGlydHkoKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInAtMjRcIj5cbiAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wteHMtMTIgY29sLXNtLTMgY29sLW1kLTJcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJoNCB0ZXh0LW5vcm1hbCB0ZXh0LXJpZ2h0IHRleHQtbGVmdC14c1wiXG4gICAgICAgIHRyYW5zbGF0ZVxuICAgICAgPlxuICAgICAgICBTaWduYXR1cmUgdmVyaWZpY2F0aW9uXG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLXhzLTEyIGNvbC1zbS05IGNvbC1tZC0xMCBjb2wtbGctOVwiPlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cInNob3VsZFNob3coJ2NlcnRpZmljYXRlVHlwZScpXCJcbiAgICAgICAgY2xhc3M9XCJmb3JtLWdyb3VwIHAtcmVsYXRpdmVcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS02XCI+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgZm9yPVwiY2VydGlmaWNhdGVUeXBlXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjb250cm9sLWxhYmVsXCJcbiAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIFZlcmlmaWVyXG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImM4eS1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgIGlkPVwiY2VydGlmaWNhdGVUeXBlXCJcbiAgICAgICAgICAgICAgICBuYW1lPVwiY2VydGlmaWNhdGVUeXBlXCJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInRlbXBsYXRlTW9kZWwuc2lnbmF0dXJlVmVyaWZpY2F0aW9uQ29uZmlnLmNlcnRpZmljYXRlVHlwZUNob3NlblwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY2VydGlmaWNhdGVUeXBlIG9mIGNlcnRpZmljYXRlVHlwZXMgfCBrZXl2YWx1ZVwiXG4gICAgICAgICAgICAgICAgICBbbmdWYWx1ZV09XCJjZXJ0aWZpY2F0ZVR5cGUua2V5XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7eyBjZXJ0aWZpY2F0ZVR5cGUudmFsdWUubGFiZWwgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICBpZD1cImFkZnNcIlxuICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgIHRlbXBsYXRlTW9kZWwuc2lnbmF0dXJlVmVyaWZpY2F0aW9uQ29uZmlnLmNlcnRpZmljYXRlVHlwZUNob3NlbiA9PT0gY2VydGlmaWNhdGVUeXBlLkFERlNcbiAgICAgICAgXCJcbiAgICAgICAgY2xhc3M9XCJyb3dcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTZcIj5cbiAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgZm9yPVwiYWRmc01hbmlmZXN0VXJsXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjb250cm9sLWxhYmVsXCJcbiAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIEFERlMgbWFuaWZlc3QgVVJMXG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJ1cmxcIlxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJcbiAgICAgICAgICAgICAgICAnZS5nLiB7eyBleGFtcGxlIH19J1xuICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleGFtcGxlOiAnaHR0cHM6Ly9hZGZzLnRlbmFudC5jb20vZmVkZXJhdGlvbm1ldGFkYXRhL2ZlZGVyYXRpb25tZXRhZGF0YS54bWwnXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInRlbXBsYXRlTW9kZWwuc2lnbmF0dXJlVmVyaWZpY2F0aW9uQ29uZmlnLmFkZnNNYW5pZmVzdC5tYW5pZmVzdFVybFwiXG4gICAgICAgICAgICAgIG5hbWU9XCJhZGZzTWFuaWZlc3RVcmxcIlxuICAgICAgICAgICAgICBpZD1cImFkZnNNYW5pZmVzdFVybFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgaWQ9XCJhZGRcIlxuICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgIHRlbXBsYXRlTW9kZWwuc2lnbmF0dXJlVmVyaWZpY2F0aW9uQ29uZmlnLmNlcnRpZmljYXRlVHlwZUNob3NlbiA9PT0gY2VydGlmaWNhdGVUeXBlLkFaVVJFXG4gICAgICAgIFwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTZcIj5cbiAgICAgICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgZm9yPVwicHVibGljS2V5RGlzY292ZXJ5VXJsXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIlxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgUHVibGljIGtleSBkaXNjb3ZlcnkgVVJMXG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJ1cmxcIlxuICAgICAgICAgICAgICAgIGlkPVwicHVibGljS2V5RGlzY292ZXJ5VXJsXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiXG4gICAgICAgICAgICAgICAgICAnZS5nLiB7eyBleGFtcGxlIH19J1xuICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgIDogeyBleGFtcGxlOiAnaHR0cHM6Ly9sb2dpbi5taWNyb3NvZnRvbmxpbmUuZGUvdGVuYW50L2Rpc2NvdmVyeS9rZXlzJyB9XG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBuYW1lPVwicHVibGljS2V5RGlzY292ZXJ5VXJsXCJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInRlbXBsYXRlTW9kZWwuc2lnbmF0dXJlVmVyaWZpY2F0aW9uQ29uZmlnLmFhZC5wdWJsaWNLZXlEaXNjb3ZlcnlVcmxcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdlxuICAgICAgICBpZD1cImp3a3NcIlxuICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgIHRlbXBsYXRlTW9kZWwuc2lnbmF0dXJlVmVyaWZpY2F0aW9uQ29uZmlnLmNlcnRpZmljYXRlVHlwZUNob3NlbiA9PT0gY2VydGlmaWNhdGVUeXBlLkpXS1NcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNlwiPlxuICAgICAgICAgICAgPGM4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICBmb3I9XCJqd2tzUHVibGljS2V5RGlzY292ZXJ5VXJsXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIlxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgSldLUyBVUkxcbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cInVybFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgIGlkPVwiandrc1B1YmxpY0tleURpc2NvdmVyeVVybFwiXG4gICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiXG4gICAgICAgICAgICAgICAgICAnZS5nLiB7eyBleGFtcGxlIH19JyB8IHRyYW5zbGF0ZTogeyBleGFtcGxlOiAnaHR0cDovL3d3dy5leGFtcGxlLmNvbS8nIH1cbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIG5hbWU9XCJqd2tzVXJpXCJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInRlbXBsYXRlTW9kZWwuc2lnbmF0dXJlVmVyaWZpY2F0aW9uQ29uZmlnLmp3a3Muandrc1VyaVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgIGlkPVwibWFudWFsXCJcbiAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICB0ZW1wbGF0ZU1vZGVsLnNpZ25hdHVyZVZlcmlmaWNhdGlvbkNvbmZpZy5jZXJ0aWZpY2F0ZVR5cGVDaG9zZW4gPT09IGNlcnRpZmljYXRlVHlwZS5DVVNUT01cbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAgPGZpZWxkc2V0XG4gICAgICAgICAgY2xhc3M9XCJjOHktZmllbGRzZXQgcC0yNFwiXG4gICAgICAgICAgKm5nSWY9XCJ0ZW1wbGF0ZU1vZGVsLnNpZ25hdHVyZVZlcmlmaWNhdGlvbkNvbmZpZy5tYW51YWwuY3VzdG9tQ2VydGlmaWNhdGVzLmxlbmd0aCA+IDFcIlxuICAgICAgICA+XG4gICAgICAgICAgPGxlZ2VuZD5cbiAgICAgICAgICAgIHt7ICdNYW51YWwnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9sZWdlbmQ+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XG4gICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgIGZvcj1cImNlcnRJZEZpZWxkXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgJ0NlcnRpZmljYXRlIElEIGZpZWxkJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWhlbHAgYnRuLWhlbHAtLXNtXCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInSGVscCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgcG9wb3Zlcj1cInt7IENFUlRJRklDQVRFX0lEX0ZJRUxEX1BPUE9WRVIgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgcGxhY2VtZW50PVwicmlnaHRcIlxuICAgICAgICAgICAgICAgICAgdHJpZ2dlcnM9XCJmb2N1c1wiXG4gICAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgIG5hbWU9XCJjZXJ0SWRGaWVsZFwiXG4gICAgICAgICAgICAgICAgaWQ9XCJjZXJ0SWRGaWVsZFwiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ0ZW1wbGF0ZU1vZGVsLnNpZ25hdHVyZVZlcmlmaWNhdGlvbkNvbmZpZy5tYW51YWwuY2VydElkRmllbGRcIlxuICAgICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9maWVsZHNldD5cblxuICAgICAgICA8ZmllbGRzZXQgY2xhc3M9XCJjOHktZmllbGRzZXQgcC0yNFwiPlxuICAgICAgICAgIDxsZWdlbmQ+XG4gICAgICAgICAgICB7eyAnQ2VydGlmaWNhdGVzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvbGVnZW5kPlxuICAgICAgICAgIDxmaWVsZHNldFxuICAgICAgICAgICAgY2xhc3M9XCJjOHktZmllbGRzZXQgcC0xNlwiXG4gICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgbGV0IGN1c3RvbUNlcnRpZmljYXRlIG9mIHRlbXBsYXRlTW9kZWwuc2lnbmF0dXJlVmVyaWZpY2F0aW9uQ29uZmlnLm1hbnVhbFxuICAgICAgICAgICAgICAgIC5jdXN0b21DZXJ0aWZpY2F0ZXM7XG4gICAgICAgICAgICAgIGluZGV4IGFzIGNydEluZGV4XG4gICAgICAgICAgICBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLXNtLTZcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICB0ZW1wbGF0ZU1vZGVsLnNpZ25hdHVyZVZlcmlmaWNhdGlvbkNvbmZpZy5tYW51YWwuY3VzdG9tQ2VydGlmaWNhdGVzLmxlbmd0aCA+IDFcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGM4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIFtmb3JdPVwiJ2N1c3RvbUNlcnRpZmljYXRlVmFsdWUnICsgY3J0SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGUgSUQgdmFsdWVcbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiJ2N1c3RvbUNlcnRpZmljYXRlVmFsdWUnICsgY3J0SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICBbaWRdPVwiJ2N1c3RvbUNlcnRpZmljYXRlVmFsdWUnICsgY3J0SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjdXN0b21DZXJ0aWZpY2F0ZS5rZXlcIlxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS02XCI+XG4gICAgICAgICAgICAgICAgPGM4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyAnVHlwZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyBhbGdvcml0aG1UeXBlLnZhbHVlLmxhYmVsIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjOHktcmFkaW8gaW5wdXQtc21cIlxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgYWxnb3JpdGhtVHlwZSBvZiBhbGdvcml0aG1UeXBlcyB8IGtleXZhbHVlOyBpbmRleCBhcyBhbGdJbmRleFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJyYWRpb1wiXG4gICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiJ2FsZycgKyBjcnRJbmRleCArIGFsZ0luZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiYWxnb3JpdGhtVHlwZS5rZXlcIlxuICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY3VzdG9tQ2VydGlmaWNhdGUuYWxnXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBhbGdvcml0aG1UeXBlLnZhbHVlLmxhYmVsIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNVwiPlxuICAgICAgICAgICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICBbZm9yXT1cIidwdWJsaWNLZXknICsgY3J0SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImN1c3RvbUNlcnRpZmljYXRlLmFsZyA9PT0gYWxnb3JpdGhtVHlwZXMuUENLUy52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZSBpbiBQRU0gZm9ybWF0XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgIFtmb3JdPVwiJ3B1YmxpY0tleScgKyBjcnRJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY3VzdG9tQ2VydGlmaWNhdGUuYWxnID09PSBhbGdvcml0aG1UeXBlcy5SU0EudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgUHVibGljIGtleSBpbiBQRU0gZm9ybWF0XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIidwdWJsaWNLZXknICsgY3J0SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICBbaWRdPVwiJ3B1YmxpY0tleScgKyBjcnRJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImN1c3RvbUNlcnRpZmljYXRlLnB1YmxpY0tleVwiXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBkYXRlcGlja2VyXCI+XG4gICAgICAgICAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICAgIFtmb3JdPVwiJ3ZhbGlkRnJvbVBpY2tlcicgKyBjcnRJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb250cm9sLWxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIHt7ICdWYWxpZCBmcm9tJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCIndmFsaWRGcm9tUGlja2VyJyArIGNydEluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiJ3ZhbGlkRnJvbVBpY2tlcicgKyBjcnRJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjdXN0b21DZXJ0aWZpY2F0ZS52YWxpZEZyb21cIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidEYXRlIGZyb20nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdEYXRlIGZyb20nIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICBbYnNDb25maWddPVwieyBjdXN0b21Ub2RheUNsYXNzOiAndG9kYXknLCBhZGFwdGl2ZVBvc2l0aW9uOiB0cnVlIH1cIlxuICAgICAgICAgICAgICAgICAgICAgIFttYXhEYXRlXT1cImN1c3RvbUNlcnRpZmljYXRlLnZhbGlkVGlsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgYnNEYXRlcGlja2VyXG4gICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBkYXRlcGlja2VyXCI+XG4gICAgICAgICAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICAgIFtmb3JdPVwiJ3ZhbGlkVGlsbFBpY2tlcicgKyBjcnRJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb250cm9sLWxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIHt7ICdWYWxpZCB0aWxsJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCIndmFsaWRUaWxsUGlja2VyJyArIGNydEluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiJ3ZhbGlkVGlsbFBpY2tlcicgKyBjcnRJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjdXN0b21DZXJ0aWZpY2F0ZS52YWxpZFRpbGxcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdEYXRlIHRvJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInRGF0ZSB0bycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtic0NvbmZpZ109XCJ7IGN1c3RvbVRvZGF5Q2xhc3M6ICd0b2RheScsIGFkYXB0aXZlUG9zaXRpb246IHRydWUgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgYnNEYXRlcGlja2VyXG4gICAgICAgICAgICAgICAgICAgICAgW21pbkRhdGVdPVwiY3VzdG9tQ2VydGlmaWNhdGUudmFsaWRGcm9tXCJcbiAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1tZC0xXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgdGVtcGxhdGVNb2RlbC5zaWduYXR1cmVWZXJpZmljYXRpb25Db25maWcubWFudWFsLmN1c3RvbUNlcnRpZmljYXRlcy5sZW5ndGggPiAxXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxsYWJlbD4mbmJzcDs8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXIgYnRuLXNtIHZpc2libGUteHMgdmlzaWJsZS1zbVwiXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0RlbGV0ZSBjZXJ0aWZpY2F0ZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUN1c3RvbUNlcnRpZmljYXRlKGN1c3RvbUNlcnRpZmljYXRlKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgYzh5SWNvbj1cIm1pbnVzLWNpcmNsZVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibS1yLTRcIlxuICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7ICdEZWxldGUgY2VydGlmaWNhdGUnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRvdCBidG4tZG90LS1kYW5nZXIgdmlzaWJsZS1tZCB2aXNpYmxlLWxnXCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgdG9vbHRpcD1cInt7ICdEZWxldGUgY2VydGlmaWNhdGUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cInRvcFwiXG4gICAgICAgICAgICAgICAgICBbYWRhcHRpdmVQb3NpdGlvbl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidEZWxldGUgY2VydGlmaWNhdGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIFtkZWxheV09XCIzMDBcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUN1c3RvbUNlcnRpZmljYXRlKGN1c3RvbUNlcnRpZmljYXRlKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cIm1pbnVzLWNpcmNsZVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IG0tdC04XCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnQWRkIGNlcnRpZmljYXRlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAoY2xpY2spPVwidGVtcGxhdGVNb2RlbC5zaWduYXR1cmVWZXJpZmljYXRpb25Db25maWcubWFudWFsLmFkZEN1c3RvbUNlcnRpZmljYXRlKClcIlxuICAgICAgICAgICAgbmFtZT1cImFkZENlcnRpZmljYXRlXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICBjOHlJY29uPVwicGx1cy1jaXJjbGVcIlxuICAgICAgICAgICAgICBjbGFzcz1cIm0tci00XCJcbiAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICA8c3Bhbj57eyAnQWRkIGNlcnRpZmljYXRlJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9maWVsZHNldD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19