@c8y/ngx-components 1017.0.148 → 1017.0.150

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -8,7 +8,7 @@ export const MESSAGES = {
8
8
  }
9
9
  },
10
10
  '^Wrong proof of possession verification code used for tenant (.+?). Certificate (.+?), usage not granted.$': {
11
- gettext: gettext('Could not confirm the ownership of {{ fingerprint }} certificate: invalid proof of possession verification code provided, sign unsigned verification code with private key.'),
11
+ gettext: gettext('Could not confirm the ownership of {{ fingerprint }} certificate: invalid proof of possession verification code provided, sign verification code with private key.'),
12
12
  placeholders: {
13
13
  tenant: '$1',
14
14
  fingerprint: '$2'
@@ -22,4 +22,4 @@ export const MESSAGES = {
22
22
  }
23
23
  }
24
24
  };
25
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0dGVybi1tZXNzYWdlcy5kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHJ1c3RlZC1jZXJ0aWZpY2F0ZXMvcGF0dGVybi1tZXNzYWdlcy5kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9DQUFvQztBQUNwQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFOUMsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHO0lBQ3RCLG1EQUFtRCxFQUFFO1FBQ25ELE9BQU8sRUFBRSxPQUFPLENBQUMsK0NBQStDLENBQUM7UUFDakUsWUFBWSxFQUFFO1lBQ1osV0FBVyxFQUFFLElBQUk7U0FDbEI7S0FDRjtJQUNELDRHQUE0RyxFQUMxRztRQUNFLE9BQU8sRUFBRSxPQUFPLENBQ2QsNktBQTZLLENBQzlLO1FBQ0QsWUFBWSxFQUFFO1lBQ1osTUFBTSxFQUFFLElBQUk7WUFDWixXQUFXLEVBQUUsSUFBSTtTQUNsQjtLQUNGO0lBQ0gsNkdBQTZHLEVBQzNHO1FBQ0UsT0FBTyxFQUFFLE9BQU8sQ0FDZCx5SkFBeUosQ0FDMUo7UUFDRCxZQUFZLEVBQUU7WUFDWixNQUFNLEVBQUUsSUFBSTtZQUNaLFdBQVcsRUFBRSxJQUFJO1NBQ2xCO0tBQ0Y7Q0FDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGU6bWF4LWxpbmUtbGVuZ3RoICovXG5pbXBvcnQgeyBnZXR0ZXh0IH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5cbmV4cG9ydCBjb25zdCBNRVNTQUdFUyA9IHtcbiAgJ15DYW5ub3QgZmluZCBjZXJ0aWZpY2F0ZSB3aXRoIGZpbmdlcnByaW50ICguKz8pLiQnOiB7XG4gICAgZ2V0dGV4dDogZ2V0dGV4dCgnQ291bGQgbm90IGZpbmQge3sgZmluZ2VycHJpbnQgfX0gY2VydGlmaWNhdGUuJyksXG4gICAgcGxhY2Vob2xkZXJzOiB7XG4gICAgICBmaW5nZXJwcmludDogJyQxJ1xuICAgIH1cbiAgfSxcbiAgJ15Xcm9uZyBwcm9vZiBvZiBwb3NzZXNzaW9uIHZlcmlmaWNhdGlvbiBjb2RlIHVzZWQgZm9yIHRlbmFudCAoLis/KS4gQ2VydGlmaWNhdGUgKC4rPyksIHVzYWdlIG5vdCBncmFudGVkLiQnOlxuICAgIHtcbiAgICAgIGdldHRleHQ6IGdldHRleHQoXG4gICAgICAgICdDb3VsZCBub3QgY29uZmlybSB0aGUgb3duZXJzaGlwIG9mIHt7IGZpbmdlcnByaW50IH19IGNlcnRpZmljYXRlOiBpbnZhbGlkIHByb29mIG9mIHBvc3Nlc3Npb24gdmVyaWZpY2F0aW9uIGNvZGUgcHJvdmlkZWQsIHNpZ24gdW5zaWduZWQgdmVyaWZpY2F0aW9uIGNvZGUgd2l0aCBwcml2YXRlIGtleS4nXG4gICAgICApLFxuICAgICAgcGxhY2Vob2xkZXJzOiB7XG4gICAgICAgIHRlbmFudDogJyQxJyxcbiAgICAgICAgZmluZ2VycHJpbnQ6ICckMidcbiAgICAgIH1cbiAgICB9LFxuICAnXlByb29mIG9mIHBvc3Nlc3Npb24gdmVyaWZpY2F0aW9uIGNvZGUgdXNlZCBmb3IgdGVuYW50ICguKz8pIGV4cGlyZWQuIENlcnRpZmljYXRlICguKz8pLCB1c2FnZSBub3QgZ3JhbnRlZC4nOlxuICAgIHtcbiAgICAgIGdldHRleHQ6IGdldHRleHQoXG4gICAgICAgICdDb3VsZCBub3QgY29uZmlybSB0aGUgb3duZXJzaGlwIG9mIHt7IGZpbmdlcnByaW50IH19IGNlcnRpZmljYXRlOiBwcm9vZiBvZiBwb3NzZXNzaW9uIHZlcmlmaWNhdGlvbiBjb2RlIGhhcyBleHBpcmVkLCBnZW5lcmF0ZSBhIG5ldyBjb2RlIGFuZCB0cnkgYWdhaW4uJ1xuICAgICAgKSxcbiAgICAgIHBsYWNlaG9sZGVyczoge1xuICAgICAgICB0ZW5hbnQ6ICckMScsXG4gICAgICAgIGZpbmdlcnByaW50OiAnJDInXG4gICAgICB9XG4gICAgfVxufTtcbiJdfQ==
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0dGVybi1tZXNzYWdlcy5kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHJ1c3RlZC1jZXJ0aWZpY2F0ZXMvcGF0dGVybi1tZXNzYWdlcy5kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9DQUFvQztBQUNwQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFOUMsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHO0lBQ3RCLG1EQUFtRCxFQUFFO1FBQ25ELE9BQU8sRUFBRSxPQUFPLENBQUMsK0NBQStDLENBQUM7UUFDakUsWUFBWSxFQUFFO1lBQ1osV0FBVyxFQUFFLElBQUk7U0FDbEI7S0FDRjtJQUNELDRHQUE0RyxFQUMxRztRQUNFLE9BQU8sRUFBRSxPQUFPLENBQ2Qsb0tBQW9LLENBQ3JLO1FBQ0QsWUFBWSxFQUFFO1lBQ1osTUFBTSxFQUFFLElBQUk7WUFDWixXQUFXLEVBQUUsSUFBSTtTQUNsQjtLQUNGO0lBQ0gsNkdBQTZHLEVBQzNHO1FBQ0UsT0FBTyxFQUFFLE9BQU8sQ0FDZCx5SkFBeUosQ0FDMUo7UUFDRCxZQUFZLEVBQUU7WUFDWixNQUFNLEVBQUUsSUFBSTtZQUNaLFdBQVcsRUFBRSxJQUFJO1NBQ2xCO0tBQ0Y7Q0FDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGU6bWF4LWxpbmUtbGVuZ3RoICovXG5pbXBvcnQgeyBnZXR0ZXh0IH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5cbmV4cG9ydCBjb25zdCBNRVNTQUdFUyA9IHtcbiAgJ15DYW5ub3QgZmluZCBjZXJ0aWZpY2F0ZSB3aXRoIGZpbmdlcnByaW50ICguKz8pLiQnOiB7XG4gICAgZ2V0dGV4dDogZ2V0dGV4dCgnQ291bGQgbm90IGZpbmQge3sgZmluZ2VycHJpbnQgfX0gY2VydGlmaWNhdGUuJyksXG4gICAgcGxhY2Vob2xkZXJzOiB7XG4gICAgICBmaW5nZXJwcmludDogJyQxJ1xuICAgIH1cbiAgfSxcbiAgJ15Xcm9uZyBwcm9vZiBvZiBwb3NzZXNzaW9uIHZlcmlmaWNhdGlvbiBjb2RlIHVzZWQgZm9yIHRlbmFudCAoLis/KS4gQ2VydGlmaWNhdGUgKC4rPyksIHVzYWdlIG5vdCBncmFudGVkLiQnOlxuICAgIHtcbiAgICAgIGdldHRleHQ6IGdldHRleHQoXG4gICAgICAgICdDb3VsZCBub3QgY29uZmlybSB0aGUgb3duZXJzaGlwIG9mIHt7IGZpbmdlcnByaW50IH19IGNlcnRpZmljYXRlOiBpbnZhbGlkIHByb29mIG9mIHBvc3Nlc3Npb24gdmVyaWZpY2F0aW9uIGNvZGUgcHJvdmlkZWQsIHNpZ24gdmVyaWZpY2F0aW9uIGNvZGUgd2l0aCBwcml2YXRlIGtleS4nXG4gICAgICApLFxuICAgICAgcGxhY2Vob2xkZXJzOiB7XG4gICAgICAgIHRlbmFudDogJyQxJyxcbiAgICAgICAgZmluZ2VycHJpbnQ6ICckMidcbiAgICAgIH1cbiAgICB9LFxuICAnXlByb29mIG9mIHBvc3Nlc3Npb24gdmVyaWZpY2F0aW9uIGNvZGUgdXNlZCBmb3IgdGVuYW50ICguKz8pIGV4cGlyZWQuIENlcnRpZmljYXRlICguKz8pLCB1c2FnZSBub3QgZ3JhbnRlZC4nOlxuICAgIHtcbiAgICAgIGdldHRleHQ6IGdldHRleHQoXG4gICAgICAgICdDb3VsZCBub3QgY29uZmlybSB0aGUgb3duZXJzaGlwIG9mIHt7IGZpbmdlcnByaW50IH19IGNlcnRpZmljYXRlOiBwcm9vZiBvZiBwb3NzZXNzaW9uIHZlcmlmaWNhdGlvbiBjb2RlIGhhcyBleHBpcmVkLCBnZW5lcmF0ZSBhIG5ldyBjb2RlIGFuZCB0cnkgYWdhaW4uJ1xuICAgICAgKSxcbiAgICAgIHBsYWNlaG9sZGVyczoge1xuICAgICAgICB0ZW5hbnQ6ICckMScsXG4gICAgICAgIGZpbmdlcnByaW50OiAnJDInXG4gICAgICB9XG4gICAgfVxufTtcbiJdfQ==
@@ -144,9 +144,9 @@ export class TrustedCertificatesComponent {
144
144
  }
145
145
  }
146
146
  TrustedCertificatesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: TrustedCertificatesComponent, deps: [{ token: i1.BsModalService }, { token: i2.AlertService }, { token: i3.TrustedCertificateService }, { token: i2.ModalService }, { token: i4.TranslateService }, { token: i2.ClipboardService }], target: i0.ɵɵFactoryTarget.Component });
147
- TrustedCertificatesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: TrustedCertificatesComponent, selector: "c8y-trusted-certificates", ngImport: i0, template: "<c8y-title>{{ 'Trusted certificates' | translate }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n label=\"{{ 'Management' | translate }}\"\n icon=\"c8y-management\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n label=\"{{ 'Trusted certificates' | translate }}\"\n icon=\"certificate\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n title=\"{{ 'Add trusted certificate' | translate }}\"\n class=\"btn btn-link\"\n (click)=\"addTrustedCertificate()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add trusted certificate' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n title=\"{{ 'Reload' | translate }}\"\n class=\"btn btn-link\"\n (click)=\"loadTrustedCertificates()\"\n >\n <i c8yIcon=\"refresh\" [ngClass]=\"{ 'icon-spin': reloading | async }\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/users-guide/device-management/#trusted-certificates\"></c8y-help>\n\n<c8y-ui-empty-state\n *ngIf=\"(trustedCertificates | async)?.data.length === 0\"\n [icon]=\"'certificate'\"\n [title]=\"'No trusted certificates to display.' | translate\"\n [subtitle]=\"'Add your first certificate by clicking below.' | translate\"\n>\n <button\n title=\"{{ 'Add trusted certificate' | translate }}\"\n (click)=\"addTrustedCertificate()\"\n class=\"btn btn-primary\"\n >\n {{ 'Add trusted certificate' | translate }}\n </button>\n</c8y-ui-empty-state>\n\n<c8y-list-group class=\"m-b-24\">\n <div\n *ngIf=\"(trustedCertificates | async)?.data.length > 0\"\n class=\"page-sticky-header hidden-xs c8y-list__item c8y-list__item--empty-actions\"\n >\n <div class=\"c8y-list__item__block\">\n <div class=\"c8y-list__item__icon\">\n <i c8yIcon=\"certificate\" class=\"invisible\"></i>\n </div>\n <div class=\"c8y-list__item__body\">\n <div class=\"content-flex-60\">\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\" {{ 'Certificate' | translate }} \">\n {{ 'Certificate' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\"{{ 'Status' | translate }}\">\n {{ 'Status' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\"{{ 'Algorithm' | translate }}\">\n {{ 'Algorithm' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\"{{ 'Expiration date' | translate }}\">\n {{ 'Expiration date' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\" {{ 'Auto registration' | translate }}\">\n {{ 'Auto registration' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\" {{ 'Proof of possession' | translate }}\">\n {{ 'Proof of possession' | translate }}\n </span>\n </div>\n </div>\n </div>\n <div class=\"c8y-list__item__actions\"></div>\n </div>\n </div>\n\n <c8y-li\n *c8yFor=\"\n let trustedCertificate of trustedCertificates | async;\n let i = index;\n pipe: sortByExpirationDateAsc;\n loadMore: 'none'\n \"\n #listItem\n >\n <c8y-li-icon>\n <i c8yIcon=\"certificate\"></i>\n </c8y-li-icon>\n\n <c8y-li-body class=\"content-flex-60\">\n <div class=\"col-2\">\n <button\n class=\"btn-clean text-truncate\"\n title=\"{{ trustedCertificate.name }}\"\n (click)=\"listItem.toggleCollapsed()\"\n >\n {{ trustedCertificate.name }}\n </button>\n </div>\n <div class=\"col-2\">\n <div class=\"visible-xs p-8\"></div>\n <button\n type=\"button\"\n class=\"btn c8y-btn-checkbox--inline\"\n name=\"certificateStatus\"\n [(ngModel)]=\"trustedCertificate.status\"\n btnCheckbox\n btnCheckboxTrue=\"ENABLED\"\n btnCheckboxFalse=\"DISABLED\"\n (ngModelChange)=\"updateCertificate(trustedCertificate, { status: $event })\"\n >\n <small\n title=\"{{ 'Disabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'DISABLED'\"\n >\n {{ 'Disabled`trusted certificate status`' | translate }}\n </small>\n <small\n title=\"{{ 'Enabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'ENABLED'\"\n >\n {{ 'Enabled`trusted certificate status`' | translate }}\n </small>\n </button>\n <div class=\"visible-xs p-8\"></div>\n </div>\n <div class=\"col-2\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Algorithm' | translate }}: {{ trustedCertificate.algorithmName }}\"\n >\n <span class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\" translate>Algorithm</span>\n {{ trustedCertificate.algorithmName }}\n </div>\n </div>\n\n <div class=\"col-2\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Expiration date' | translate }}: {{ trustedCertificate.notAfter | c8yDate }}\"\n >\n <span class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\" translate>\n Expiration date\n </span>\n <small [ngClass]=\"highlightDependingOnExpirationStatus(trustedCertificate)\">\n <i\n c8yIcon=\"calendar\"\n class=\"m-r-4\"\n *ngIf=\"!highlightDependingOnExpirationStatus(trustedCertificate)\"\n ></i>\n <i\n c8yIcon=\"warning\"\n class=\"m-r-4\"\n *ngIf=\"highlightDependingOnExpirationStatus(trustedCertificate)\"\n ></i>\n <span>{{ trustedCertificate.notAfter | c8yDate }}</span>\n </small>\n </div>\n </div>\n <div class=\"col-2\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-t-8 m-r-4 visible-xs-inline\">\n {{ 'Auto registration' | translate }}\n </span>\n <span\n *ngIf=\"trustedCertificate.autoRegistrationEnabled\"\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Enabled`auto registration`' | translate\n }}\"\n >\n {{ 'Enabled`auto registration`' | translate }}\n </span>\n <span\n *ngIf=\"!trustedCertificate.autoRegistrationEnabled\"\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Disabled`auto registration`' | translate\n }}\"\n >\n {{ 'Disabled`auto registration`' | translate }}\n </span>\n </div>\n </div>\n <div class=\"col-2 d-flex\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-t-8 m-r-4 visible-xs-inline\">\n {{ 'Proof of possession' | translate }}\n </span>\n <span\n *ngIf=\"trustedCertificate.proofOfPossessionValid\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n >\n <div class=\"icon-flex\">\n <i c8yIcon=\"success\" class=\"text-success\"></i>\n {{ 'Complete`proof of possession`' | translate }}\n </div>\n </span>\n <span\n *ngIf=\"!trustedCertificate.proofOfPossessionValid\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n >\n <div class=\"icon-flex\">\n <i c8yIcon=\"warning\" class=\"text-warning\"></i>\n {{ 'Incomplete`proof of possession`' | translate }}\n </div>\n </span>\n </div>\n <button\n class=\"m-l-auto btn-dot btn-dot--danger btn showOnHover m-r-8\"\n (click)=\"deleteTrustedCertificate(trustedCertificate)\"\n type=\"button\"\n tooltip=\"{{ 'Delete' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Delete' | translate\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n </div>\n </c8y-li-body>\n\n <c8y-li-collapse>\n <div class=\"p-t-16 p-b-16\">\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Certificate name' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n type=\"text\"\n class=\"form-control\"\n [(ngModel)]=\"trustedCertificate.name\"\n required\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n title=\"{{ 'Update certificate name' | translate }}\"\n (click)=\"\n updateCertificate(trustedCertificate, { name: trustedCertificate.name })\n \"\n class=\"btn btn-primary\"\n [disabled]=\"!trustedCertificate.name\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-1\"></div>\n <div class=\"col-md-7\">\n <c8y-form-group>\n <label for=\"certInPemFormat\" class=\"control-label\" translate>Certificate</label>\n <textarea\n class=\"form-control no-resize\"\n id=\"certInPemFormat\"\n name=\"certInPemFormat\"\n type=\"text\"\n rows=\"7\"\n readonly\n [(ngModel)]=\"trustedCertificate.certInPemFormat\"\n ></textarea>\n </c8y-form-group>\n <c8y-form-group>\n <label title=\"{{ 'Auto registration' | translate }}\" class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"trustedCertificate.autoRegistrationEnabled\"\n (ngModelChange)=\"\n updateCertificate(trustedCertificate, { autoRegistrationEnabled: $event })\n \"\n />\n <span></span>\n <span>{{ 'Auto registration' | translate }}</span>\n </label>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-4\">\n <div class=\"legend form-block\" translate>Additional properties</div>\n <ul class=\"list-unstyled\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Algorithm' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.algorithmName }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Version' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.version }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Valid from' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.notBefore | c8yDate }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Issuer' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.issuer }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Expiration date' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.notAfter | c8yDate }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Serial number' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.serialNumber }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Subject`of a certificate`' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.subject }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"col-md-1\"></div>\n <div class=\"col-md-7\">\n <div class=\"legend form-block\">\n {{ 'Proof of possession' | translate }}\n <button\n type=\"button\"\n class=\"btn-help btn-help--sm\"\n popover=\"{{ PROOF_OF_POSSESSION_POPOVER | translate }}\"\n [attr.aria-label]=\"'Help' | translate\"\n triggers=\"focus\"\n container=\"body\"\n placement=\"right\"\n ></button>\n </div>\n <div *ngIf=\"trustedCertificate.proofOfPossessionValid\">\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n class=\"icon-flex\"\n >\n <i c8yIcon=\"success\" class=\"text-success\"></i>\n {{ 'Complete`proof of possession`' | translate }}\n </span>\n </div>\n <div *ngIf=\"!trustedCertificate.proofOfPossessionValid\">\n <div class=\"row m-b-16\">\n <div class=\"col-md-6\">\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n class=\"icon-flex\"\n >\n <i c8yIcon=\"warning\" class=\"text-warning\"></i>\n {{ 'Incomplete`proof of possession`' | translate }}\n </span>\n </div>\n <div class=\"col-md-6 col-lg-6 text-right-md\">\n <span class=\"text-label-small m-r-4\">\n {{ 'Verification code expires/expired on' | translate }}\n </span>\n {{\n (trustedCertificate.proofOfPossessionVerificationCodeUsableUntil | c8yDate) ||\n '---'\n }}\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-6 col-lg-6\">\n <c8y-form-group>\n <label for=\"unsignedVerificationCode\" class=\"control-label\" translate>\n Unsigned verification code\n </label>\n <textarea\n class=\"form-control no-resize\"\n name=\"unsignedVerificationCode\"\n id=\"unsignedVerificationCode\"\n readonly\n type=\"text\"\n rows=\"5\"\n [(ngModel)]=\"trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n ></textarea>\n </c8y-form-group>\n <div class=\"d-flex\">\n <button\n title=\"{{ 'Regenerate unsigned verification code' | translate }}\"\n class=\"btn btn-primary btn-sm\"\n (click)=\"regenerateUnsignedVerificationCode(trustedCertificate)\"\n >\n {{ 'Regenerate`unsigned verification code`' | translate }}\n </button>\n\n <button\n class=\"btn btn-sm btn-default m-l-auto m-r-0\"\n tooltip=\"{{ 'Copy to clipboard' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Copy to clipboard' | translate\"\n [disabled]=\"!trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n (click)=\"copyUnsignedVerificationCodeToClipboard(trustedCertificate)\"\n >\n <i c8yIcon=\"clipboard\"></i>\n </button>\n <button\n class=\"btn btn-default btn-sm\"\n tooltip=\"{{ 'Download as file' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Download as file' | translate\"\n [disabled]=\"!trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n (click)=\"downloadUnsignedVerificationCode(trustedCertificate)\"\n >\n <i c8yIcon=\"download\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"col-md-6 col-lg-6\">\n <c8y-form-group>\n <label for=\"signedVerificationCode\" class=\"control-label\">\n {{ 'Signed verification code' | translate }}\n <button\n type=\"button\"\n class=\"btn-help btn-help--sm\"\n popover=\"{{ SIGNED_VERIFICATION_CODE_POPOVER | translate }}\"\n [attr.aria-label]=\"'Help' | translate\"\n container=\"body\"\n placement=\"top\"\n ></button>\n </label>\n <textarea\n class=\"form-control no-resize\"\n name=\"signedVerificationCode\"\n id=\"signedVerificationCode\"\n type=\"text\"\n rows=\"5\"\n [(ngModel)]=\"signedVerificationCode\"\n ></textarea>\n </c8y-form-group>\n <div class=\"d-flex\">\n <button\n title=\"{{ 'Verify signed verification code' | translate }}\"\n class=\"btn btn-primary btn-sm\"\n (click)=\"\n verifySignedVerificationCode(trustedCertificate, signedVerificationCode)\n \"\n [disabled]=\"!signedVerificationCode\"\n >\n {{ 'Verify`signed verification code`' | translate }}\n </button>\n <button\n class=\"btn btn-sm btn-default m-l-auto\"\n tooltip=\"{{ 'Upload file' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Upload file' | translate\"\n (click)=\"fileInput.click()\"\n >\n <i c8yIcon=\"upload\"></i>\n </button>\n <input #fileInput type=\"file\" (change)=\"onFileInput($event)\" class=\"hidden\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </c8y-li-collapse>\n </c8y-li>\n</c8y-list-group>\n", dependencies: [{ kind: "component", type: i2.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId"] }, { kind: "component", type: i2.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i2.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "component", type: i2.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount"] }, { kind: "component", type: i2.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "directive", type: i6.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: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.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: "component", type: i2.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i2.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "emptyActions", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i2.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i2.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: i2.ListItemCollapseComponent, selector: "c8y-list-item-collapse, c8y-li-collapse", inputs: ["collapseWay"] }, { kind: "component", type: i2.HelpComponent, selector: "c8y-help", inputs: ["src", "isCollapsed", "priority", "icon"] }, { kind: "directive", type: i7.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: i8.ButtonCheckboxDirective, selector: "[btnCheckbox]", inputs: ["btnCheckboxTrue", "btnCheckboxFalse"] }, { kind: "directive", type: i9.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: i2.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.DatePipe, name: "c8yDate" }] });
147
+ TrustedCertificatesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: TrustedCertificatesComponent, selector: "c8y-trusted-certificates", ngImport: i0, template: "<c8y-title>{{ 'Trusted certificates' | translate }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n label=\"{{ 'Management' | translate }}\"\n icon=\"c8y-management\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n label=\"{{ 'Trusted certificates' | translate }}\"\n icon=\"certificate\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n title=\"{{ 'Add trusted certificate' | translate }}\"\n class=\"btn btn-link\"\n (click)=\"addTrustedCertificate()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add trusted certificate' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n title=\"{{ 'Reload' | translate }}\"\n class=\"btn btn-link\"\n (click)=\"loadTrustedCertificates()\"\n >\n <i c8yIcon=\"refresh\" [ngClass]=\"{ 'icon-spin': reloading | async }\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/users-guide/device-management/#trusted-certificates\"></c8y-help>\n\n<c8y-ui-empty-state\n *ngIf=\"(trustedCertificates | async)?.data.length === 0\"\n [icon]=\"'certificate'\"\n [title]=\"'No trusted certificates to display.' | translate\"\n [subtitle]=\"'Add your first certificate by clicking below.' | translate\"\n>\n <button\n title=\"{{ 'Add trusted certificate' | translate }}\"\n (click)=\"addTrustedCertificate()\"\n class=\"btn btn-primary\"\n >\n {{ 'Add trusted certificate' | translate }}\n </button>\n</c8y-ui-empty-state>\n\n<c8y-list-group class=\"m-b-24\">\n <div\n *ngIf=\"(trustedCertificates | async)?.data.length > 0\"\n class=\"page-sticky-header hidden-xs c8y-list__item c8y-list__item--empty-actions\"\n >\n <div class=\"c8y-list__item__block\">\n <div class=\"c8y-list__item__icon\">\n <i c8yIcon=\"certificate\" class=\"invisible\"></i>\n </div>\n <div class=\"c8y-list__item__body\">\n <div class=\"content-flex-60\">\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\" {{ 'Certificate' | translate }} \">\n {{ 'Certificate' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\"{{ 'Status' | translate }}\">\n {{ 'Status' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\"{{ 'Algorithm' | translate }}\">\n {{ 'Algorithm' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\"{{ 'Expiration date' | translate }}\">\n {{ 'Expiration date' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\" {{ 'Auto registration' | translate }}\">\n {{ 'Auto registration' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\" {{ 'Proof of possession' | translate }}\">\n {{ 'Proof of possession' | translate }}\n </span>\n </div>\n </div>\n </div>\n <div class=\"c8y-list__item__actions\"></div>\n </div>\n </div>\n\n <c8y-li\n *c8yFor=\"\n let trustedCertificate of trustedCertificates | async;\n let i = index;\n pipe: sortByExpirationDateAsc;\n loadMore: 'none'\n \"\n #listItem\n >\n <c8y-li-icon>\n <i c8yIcon=\"certificate\"></i>\n </c8y-li-icon>\n\n <c8y-li-body class=\"content-flex-60\">\n <div class=\"col-2\">\n <button\n class=\"btn-clean text-truncate\"\n title=\"{{ trustedCertificate.name }}\"\n (click)=\"listItem.toggleCollapsed()\"\n >\n {{ trustedCertificate.name }}\n </button>\n </div>\n <div class=\"col-2\">\n <div class=\"visible-xs p-8\"></div>\n <button\n type=\"button\"\n class=\"btn c8y-btn-checkbox--inline\"\n name=\"certificateStatus\"\n [(ngModel)]=\"trustedCertificate.status\"\n btnCheckbox\n btnCheckboxTrue=\"ENABLED\"\n btnCheckboxFalse=\"DISABLED\"\n (ngModelChange)=\"updateCertificate(trustedCertificate, { status: $event })\"\n >\n <small\n title=\"{{ 'Disabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'DISABLED'\"\n >\n {{ 'Disabled`trusted certificate status`' | translate }}\n </small>\n <small\n title=\"{{ 'Enabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'ENABLED'\"\n >\n {{ 'Enabled`trusted certificate status`' | translate }}\n </small>\n </button>\n <div class=\"visible-xs p-8\"></div>\n </div>\n <div class=\"col-2\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Algorithm' | translate }}: {{ trustedCertificate.algorithmName }}\"\n >\n <span class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\" translate>Algorithm</span>\n {{ trustedCertificate.algorithmName }}\n </div>\n </div>\n\n <div class=\"col-2\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Expiration date' | translate }}: {{ trustedCertificate.notAfter | c8yDate }}\"\n >\n <span class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\" translate>\n Expiration date\n </span>\n <small [ngClass]=\"highlightDependingOnExpirationStatus(trustedCertificate)\">\n <i\n c8yIcon=\"calendar\"\n class=\"m-r-4\"\n *ngIf=\"!highlightDependingOnExpirationStatus(trustedCertificate)\"\n ></i>\n <i\n c8yIcon=\"warning\"\n class=\"m-r-4\"\n *ngIf=\"highlightDependingOnExpirationStatus(trustedCertificate)\"\n ></i>\n <span>{{ trustedCertificate.notAfter | c8yDate }}</span>\n </small>\n </div>\n </div>\n <div class=\"col-2\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-t-8 m-r-4 visible-xs-inline\">\n {{ 'Auto registration' | translate }}\n </span>\n <span\n *ngIf=\"trustedCertificate.autoRegistrationEnabled\"\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Enabled`auto registration`' | translate\n }}\"\n >\n {{ 'Enabled`auto registration`' | translate }}\n </span>\n <span\n *ngIf=\"!trustedCertificate.autoRegistrationEnabled\"\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Disabled`auto registration`' | translate\n }}\"\n >\n {{ 'Disabled`auto registration`' | translate }}\n </span>\n </div>\n </div>\n <div class=\"col-2 d-flex\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-t-8 m-r-4 visible-xs-inline\">\n {{ 'Proof of possession' | translate }}\n </span>\n <span\n *ngIf=\"trustedCertificate.proofOfPossessionValid\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n >\n <div class=\"icon-flex\">\n <i c8yIcon=\"success\" class=\"text-success\"></i>\n {{ 'Complete`proof of possession`' | translate }}\n </div>\n </span>\n <span\n *ngIf=\"!trustedCertificate.proofOfPossessionValid\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n >\n <div class=\"icon-flex\">\n <i c8yIcon=\"warning\" class=\"text-warning\"></i>\n {{ 'Incomplete`proof of possession`' | translate }}\n </div>\n </span>\n </div>\n <button\n class=\"m-l-auto btn-dot btn-dot--danger btn showOnHover m-r-8\"\n (click)=\"deleteTrustedCertificate(trustedCertificate)\"\n type=\"button\"\n tooltip=\"{{ 'Delete' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Delete' | translate\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n </div>\n </c8y-li-body>\n\n <c8y-li-collapse>\n <div class=\"p-t-16 p-b-16\">\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Certificate name' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n type=\"text\"\n class=\"form-control\"\n [(ngModel)]=\"trustedCertificate.name\"\n required\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n title=\"{{ 'Update certificate name' | translate }}\"\n (click)=\"\n updateCertificate(trustedCertificate, { name: trustedCertificate.name })\n \"\n class=\"btn btn-primary\"\n [disabled]=\"!trustedCertificate.name\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-1\"></div>\n <div class=\"col-md-7\">\n <c8y-form-group>\n <label for=\"certInPemFormat\" class=\"control-label\" translate>Certificate</label>\n <textarea\n class=\"form-control no-resize\"\n id=\"certInPemFormat\"\n name=\"certInPemFormat\"\n type=\"text\"\n rows=\"7\"\n readonly\n [(ngModel)]=\"trustedCertificate.certInPemFormat\"\n ></textarea>\n </c8y-form-group>\n <c8y-form-group>\n <label title=\"{{ 'Auto registration' | translate }}\" class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"trustedCertificate.autoRegistrationEnabled\"\n (ngModelChange)=\"\n updateCertificate(trustedCertificate, { autoRegistrationEnabled: $event })\n \"\n />\n <span></span>\n <span>{{ 'Auto registration' | translate }}</span>\n </label>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-4\">\n <div class=\"legend form-block\" translate>Additional properties</div>\n <ul class=\"list-unstyled\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Algorithm' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.algorithmName }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Version' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.version }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Valid from' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.notBefore | c8yDate }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Issuer' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.issuer }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Expiration date' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.notAfter | c8yDate }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Serial number' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.serialNumber }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Subject`of a certificate`' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.subject }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"col-md-1\"></div>\n <div class=\"col-md-7\">\n <div class=\"legend form-block\">\n {{ 'Proof of possession' | translate }}\n <button\n type=\"button\"\n class=\"btn-help btn-help--sm\"\n popover=\"{{ PROOF_OF_POSSESSION_POPOVER | translate }}\"\n [attr.aria-label]=\"'Help' | translate\"\n triggers=\"focus\"\n container=\"body\"\n placement=\"right\"\n ></button>\n </div>\n <div *ngIf=\"trustedCertificate.proofOfPossessionValid\">\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n class=\"icon-flex\"\n >\n <i c8yIcon=\"success\" class=\"text-success\"></i>\n {{ 'Complete`proof of possession`' | translate }}\n </span>\n </div>\n <div *ngIf=\"!trustedCertificate.proofOfPossessionValid\">\n <div class=\"row m-b-16\">\n <div class=\"col-md-6\">\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n class=\"icon-flex\"\n >\n <i c8yIcon=\"warning\" class=\"text-warning\"></i>\n {{ 'Incomplete`proof of possession`' | translate }}\n </span>\n </div>\n <div class=\"col-md-6 col-lg-6 text-right-md\">\n <span class=\"text-label-small m-r-4\">\n {{ 'Verification code expires/expired on' | translate }}\n </span>\n {{\n (trustedCertificate.proofOfPossessionVerificationCodeUsableUntil | c8yDate) ||\n '---'\n }}\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-6 col-lg-6\">\n <c8y-form-group>\n <label for=\"unsignedVerificationCode\" class=\"control-label\" translate>\n Verification code\n </label>\n <textarea\n class=\"form-control no-resize\"\n name=\"unsignedVerificationCode\"\n id=\"unsignedVerificationCode\"\n readonly\n type=\"text\"\n rows=\"5\"\n [(ngModel)]=\"trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n ></textarea>\n </c8y-form-group>\n <div class=\"d-flex\">\n <button\n title=\"{{ 'Regenerate verification code' | translate }}\"\n class=\"btn btn-primary btn-sm\"\n (click)=\"regenerateUnsignedVerificationCode(trustedCertificate)\"\n >\n {{ 'Regenerate`verification code`' | translate }}\n </button>\n\n <button\n class=\"btn btn-sm btn-default m-l-auto m-r-0\"\n tooltip=\"{{ 'Copy to clipboard' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Copy to clipboard' | translate\"\n [disabled]=\"!trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n (click)=\"copyUnsignedVerificationCodeToClipboard(trustedCertificate)\"\n >\n <i c8yIcon=\"clipboard\"></i>\n </button>\n <button\n class=\"btn btn-default btn-sm\"\n tooltip=\"{{ 'Download as file' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Download as file' | translate\"\n [disabled]=\"!trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n (click)=\"downloadUnsignedVerificationCode(trustedCertificate)\"\n >\n <i c8yIcon=\"download\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"col-md-6 col-lg-6\">\n <c8y-form-group>\n <label for=\"signedVerificationCode\" class=\"control-label\">\n {{ 'Signed verification code' | translate }}\n <button\n type=\"button\"\n class=\"btn-help btn-help--sm\"\n popover=\"{{ SIGNED_VERIFICATION_CODE_POPOVER | translate }}\"\n [attr.aria-label]=\"'Help' | translate\"\n container=\"body\"\n placement=\"top\"\n ></button>\n </label>\n <textarea\n class=\"form-control no-resize\"\n name=\"signedVerificationCode\"\n id=\"signedVerificationCode\"\n type=\"text\"\n rows=\"5\"\n [(ngModel)]=\"signedVerificationCode\"\n ></textarea>\n </c8y-form-group>\n <div class=\"d-flex\">\n <button\n title=\"{{ 'Verify signed verification code' | translate }}\"\n class=\"btn btn-primary btn-sm\"\n (click)=\"\n verifySignedVerificationCode(trustedCertificate, signedVerificationCode)\n \"\n [disabled]=\"!signedVerificationCode\"\n >\n {{ 'Verify`signed verification code`' | translate }}\n </button>\n <button\n class=\"btn btn-sm btn-default m-l-auto\"\n tooltip=\"{{ 'Upload file' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Upload file' | translate\"\n (click)=\"fileInput.click()\"\n >\n <i c8yIcon=\"upload\"></i>\n </button>\n <input #fileInput type=\"file\" (change)=\"onFileInput($event)\" class=\"hidden\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </c8y-li-collapse>\n </c8y-li>\n</c8y-list-group>\n", dependencies: [{ kind: "component", type: i2.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId"] }, { kind: "component", type: i2.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i2.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "component", type: i2.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount"] }, { kind: "component", type: i2.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "directive", type: i6.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: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.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: "component", type: i2.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i2.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "emptyActions", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i2.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i2.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: i2.ListItemCollapseComponent, selector: "c8y-list-item-collapse, c8y-li-collapse", inputs: ["collapseWay"] }, { kind: "component", type: i2.HelpComponent, selector: "c8y-help", inputs: ["src", "isCollapsed", "priority", "icon"] }, { kind: "directive", type: i7.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: i8.ButtonCheckboxDirective, selector: "[btnCheckbox]", inputs: ["btnCheckboxTrue", "btnCheckboxFalse"] }, { kind: "directive", type: i9.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: i2.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.DatePipe, name: "c8yDate" }] });
148
148
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: TrustedCertificatesComponent, decorators: [{
149
149
  type: Component,
150
- args: [{ selector: 'c8y-trusted-certificates', template: "<c8y-title>{{ 'Trusted certificates' | translate }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n label=\"{{ 'Management' | translate }}\"\n icon=\"c8y-management\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n label=\"{{ 'Trusted certificates' | translate }}\"\n icon=\"certificate\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n title=\"{{ 'Add trusted certificate' | translate }}\"\n class=\"btn btn-link\"\n (click)=\"addTrustedCertificate()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add trusted certificate' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n title=\"{{ 'Reload' | translate }}\"\n class=\"btn btn-link\"\n (click)=\"loadTrustedCertificates()\"\n >\n <i c8yIcon=\"refresh\" [ngClass]=\"{ 'icon-spin': reloading | async }\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/users-guide/device-management/#trusted-certificates\"></c8y-help>\n\n<c8y-ui-empty-state\n *ngIf=\"(trustedCertificates | async)?.data.length === 0\"\n [icon]=\"'certificate'\"\n [title]=\"'No trusted certificates to display.' | translate\"\n [subtitle]=\"'Add your first certificate by clicking below.' | translate\"\n>\n <button\n title=\"{{ 'Add trusted certificate' | translate }}\"\n (click)=\"addTrustedCertificate()\"\n class=\"btn btn-primary\"\n >\n {{ 'Add trusted certificate' | translate }}\n </button>\n</c8y-ui-empty-state>\n\n<c8y-list-group class=\"m-b-24\">\n <div\n *ngIf=\"(trustedCertificates | async)?.data.length > 0\"\n class=\"page-sticky-header hidden-xs c8y-list__item c8y-list__item--empty-actions\"\n >\n <div class=\"c8y-list__item__block\">\n <div class=\"c8y-list__item__icon\">\n <i c8yIcon=\"certificate\" class=\"invisible\"></i>\n </div>\n <div class=\"c8y-list__item__body\">\n <div class=\"content-flex-60\">\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\" {{ 'Certificate' | translate }} \">\n {{ 'Certificate' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\"{{ 'Status' | translate }}\">\n {{ 'Status' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\"{{ 'Algorithm' | translate }}\">\n {{ 'Algorithm' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\"{{ 'Expiration date' | translate }}\">\n {{ 'Expiration date' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\" {{ 'Auto registration' | translate }}\">\n {{ 'Auto registration' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\" {{ 'Proof of possession' | translate }}\">\n {{ 'Proof of possession' | translate }}\n </span>\n </div>\n </div>\n </div>\n <div class=\"c8y-list__item__actions\"></div>\n </div>\n </div>\n\n <c8y-li\n *c8yFor=\"\n let trustedCertificate of trustedCertificates | async;\n let i = index;\n pipe: sortByExpirationDateAsc;\n loadMore: 'none'\n \"\n #listItem\n >\n <c8y-li-icon>\n <i c8yIcon=\"certificate\"></i>\n </c8y-li-icon>\n\n <c8y-li-body class=\"content-flex-60\">\n <div class=\"col-2\">\n <button\n class=\"btn-clean text-truncate\"\n title=\"{{ trustedCertificate.name }}\"\n (click)=\"listItem.toggleCollapsed()\"\n >\n {{ trustedCertificate.name }}\n </button>\n </div>\n <div class=\"col-2\">\n <div class=\"visible-xs p-8\"></div>\n <button\n type=\"button\"\n class=\"btn c8y-btn-checkbox--inline\"\n name=\"certificateStatus\"\n [(ngModel)]=\"trustedCertificate.status\"\n btnCheckbox\n btnCheckboxTrue=\"ENABLED\"\n btnCheckboxFalse=\"DISABLED\"\n (ngModelChange)=\"updateCertificate(trustedCertificate, { status: $event })\"\n >\n <small\n title=\"{{ 'Disabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'DISABLED'\"\n >\n {{ 'Disabled`trusted certificate status`' | translate }}\n </small>\n <small\n title=\"{{ 'Enabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'ENABLED'\"\n >\n {{ 'Enabled`trusted certificate status`' | translate }}\n </small>\n </button>\n <div class=\"visible-xs p-8\"></div>\n </div>\n <div class=\"col-2\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Algorithm' | translate }}: {{ trustedCertificate.algorithmName }}\"\n >\n <span class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\" translate>Algorithm</span>\n {{ trustedCertificate.algorithmName }}\n </div>\n </div>\n\n <div class=\"col-2\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Expiration date' | translate }}: {{ trustedCertificate.notAfter | c8yDate }}\"\n >\n <span class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\" translate>\n Expiration date\n </span>\n <small [ngClass]=\"highlightDependingOnExpirationStatus(trustedCertificate)\">\n <i\n c8yIcon=\"calendar\"\n class=\"m-r-4\"\n *ngIf=\"!highlightDependingOnExpirationStatus(trustedCertificate)\"\n ></i>\n <i\n c8yIcon=\"warning\"\n class=\"m-r-4\"\n *ngIf=\"highlightDependingOnExpirationStatus(trustedCertificate)\"\n ></i>\n <span>{{ trustedCertificate.notAfter | c8yDate }}</span>\n </small>\n </div>\n </div>\n <div class=\"col-2\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-t-8 m-r-4 visible-xs-inline\">\n {{ 'Auto registration' | translate }}\n </span>\n <span\n *ngIf=\"trustedCertificate.autoRegistrationEnabled\"\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Enabled`auto registration`' | translate\n }}\"\n >\n {{ 'Enabled`auto registration`' | translate }}\n </span>\n <span\n *ngIf=\"!trustedCertificate.autoRegistrationEnabled\"\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Disabled`auto registration`' | translate\n }}\"\n >\n {{ 'Disabled`auto registration`' | translate }}\n </span>\n </div>\n </div>\n <div class=\"col-2 d-flex\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-t-8 m-r-4 visible-xs-inline\">\n {{ 'Proof of possession' | translate }}\n </span>\n <span\n *ngIf=\"trustedCertificate.proofOfPossessionValid\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n >\n <div class=\"icon-flex\">\n <i c8yIcon=\"success\" class=\"text-success\"></i>\n {{ 'Complete`proof of possession`' | translate }}\n </div>\n </span>\n <span\n *ngIf=\"!trustedCertificate.proofOfPossessionValid\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n >\n <div class=\"icon-flex\">\n <i c8yIcon=\"warning\" class=\"text-warning\"></i>\n {{ 'Incomplete`proof of possession`' | translate }}\n </div>\n </span>\n </div>\n <button\n class=\"m-l-auto btn-dot btn-dot--danger btn showOnHover m-r-8\"\n (click)=\"deleteTrustedCertificate(trustedCertificate)\"\n type=\"button\"\n tooltip=\"{{ 'Delete' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Delete' | translate\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n </div>\n </c8y-li-body>\n\n <c8y-li-collapse>\n <div class=\"p-t-16 p-b-16\">\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Certificate name' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n type=\"text\"\n class=\"form-control\"\n [(ngModel)]=\"trustedCertificate.name\"\n required\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n title=\"{{ 'Update certificate name' | translate }}\"\n (click)=\"\n updateCertificate(trustedCertificate, { name: trustedCertificate.name })\n \"\n class=\"btn btn-primary\"\n [disabled]=\"!trustedCertificate.name\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-1\"></div>\n <div class=\"col-md-7\">\n <c8y-form-group>\n <label for=\"certInPemFormat\" class=\"control-label\" translate>Certificate</label>\n <textarea\n class=\"form-control no-resize\"\n id=\"certInPemFormat\"\n name=\"certInPemFormat\"\n type=\"text\"\n rows=\"7\"\n readonly\n [(ngModel)]=\"trustedCertificate.certInPemFormat\"\n ></textarea>\n </c8y-form-group>\n <c8y-form-group>\n <label title=\"{{ 'Auto registration' | translate }}\" class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"trustedCertificate.autoRegistrationEnabled\"\n (ngModelChange)=\"\n updateCertificate(trustedCertificate, { autoRegistrationEnabled: $event })\n \"\n />\n <span></span>\n <span>{{ 'Auto registration' | translate }}</span>\n </label>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-4\">\n <div class=\"legend form-block\" translate>Additional properties</div>\n <ul class=\"list-unstyled\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Algorithm' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.algorithmName }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Version' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.version }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Valid from' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.notBefore | c8yDate }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Issuer' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.issuer }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Expiration date' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.notAfter | c8yDate }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Serial number' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.serialNumber }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Subject`of a certificate`' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.subject }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"col-md-1\"></div>\n <div class=\"col-md-7\">\n <div class=\"legend form-block\">\n {{ 'Proof of possession' | translate }}\n <button\n type=\"button\"\n class=\"btn-help btn-help--sm\"\n popover=\"{{ PROOF_OF_POSSESSION_POPOVER | translate }}\"\n [attr.aria-label]=\"'Help' | translate\"\n triggers=\"focus\"\n container=\"body\"\n placement=\"right\"\n ></button>\n </div>\n <div *ngIf=\"trustedCertificate.proofOfPossessionValid\">\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n class=\"icon-flex\"\n >\n <i c8yIcon=\"success\" class=\"text-success\"></i>\n {{ 'Complete`proof of possession`' | translate }}\n </span>\n </div>\n <div *ngIf=\"!trustedCertificate.proofOfPossessionValid\">\n <div class=\"row m-b-16\">\n <div class=\"col-md-6\">\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n class=\"icon-flex\"\n >\n <i c8yIcon=\"warning\" class=\"text-warning\"></i>\n {{ 'Incomplete`proof of possession`' | translate }}\n </span>\n </div>\n <div class=\"col-md-6 col-lg-6 text-right-md\">\n <span class=\"text-label-small m-r-4\">\n {{ 'Verification code expires/expired on' | translate }}\n </span>\n {{\n (trustedCertificate.proofOfPossessionVerificationCodeUsableUntil | c8yDate) ||\n '---'\n }}\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-6 col-lg-6\">\n <c8y-form-group>\n <label for=\"unsignedVerificationCode\" class=\"control-label\" translate>\n Unsigned verification code\n </label>\n <textarea\n class=\"form-control no-resize\"\n name=\"unsignedVerificationCode\"\n id=\"unsignedVerificationCode\"\n readonly\n type=\"text\"\n rows=\"5\"\n [(ngModel)]=\"trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n ></textarea>\n </c8y-form-group>\n <div class=\"d-flex\">\n <button\n title=\"{{ 'Regenerate unsigned verification code' | translate }}\"\n class=\"btn btn-primary btn-sm\"\n (click)=\"regenerateUnsignedVerificationCode(trustedCertificate)\"\n >\n {{ 'Regenerate`unsigned verification code`' | translate }}\n </button>\n\n <button\n class=\"btn btn-sm btn-default m-l-auto m-r-0\"\n tooltip=\"{{ 'Copy to clipboard' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Copy to clipboard' | translate\"\n [disabled]=\"!trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n (click)=\"copyUnsignedVerificationCodeToClipboard(trustedCertificate)\"\n >\n <i c8yIcon=\"clipboard\"></i>\n </button>\n <button\n class=\"btn btn-default btn-sm\"\n tooltip=\"{{ 'Download as file' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Download as file' | translate\"\n [disabled]=\"!trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n (click)=\"downloadUnsignedVerificationCode(trustedCertificate)\"\n >\n <i c8yIcon=\"download\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"col-md-6 col-lg-6\">\n <c8y-form-group>\n <label for=\"signedVerificationCode\" class=\"control-label\">\n {{ 'Signed verification code' | translate }}\n <button\n type=\"button\"\n class=\"btn-help btn-help--sm\"\n popover=\"{{ SIGNED_VERIFICATION_CODE_POPOVER | translate }}\"\n [attr.aria-label]=\"'Help' | translate\"\n container=\"body\"\n placement=\"top\"\n ></button>\n </label>\n <textarea\n class=\"form-control no-resize\"\n name=\"signedVerificationCode\"\n id=\"signedVerificationCode\"\n type=\"text\"\n rows=\"5\"\n [(ngModel)]=\"signedVerificationCode\"\n ></textarea>\n </c8y-form-group>\n <div class=\"d-flex\">\n <button\n title=\"{{ 'Verify signed verification code' | translate }}\"\n class=\"btn btn-primary btn-sm\"\n (click)=\"\n verifySignedVerificationCode(trustedCertificate, signedVerificationCode)\n \"\n [disabled]=\"!signedVerificationCode\"\n >\n {{ 'Verify`signed verification code`' | translate }}\n </button>\n <button\n class=\"btn btn-sm btn-default m-l-auto\"\n tooltip=\"{{ 'Upload file' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Upload file' | translate\"\n (click)=\"fileInput.click()\"\n >\n <i c8yIcon=\"upload\"></i>\n </button>\n <input #fileInput type=\"file\" (change)=\"onFileInput($event)\" class=\"hidden\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </c8y-li-collapse>\n </c8y-li>\n</c8y-list-group>\n" }]
150
+ args: [{ selector: 'c8y-trusted-certificates', template: "<c8y-title>{{ 'Trusted certificates' | translate }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n label=\"{{ 'Management' | translate }}\"\n icon=\"c8y-management\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n label=\"{{ 'Trusted certificates' | translate }}\"\n icon=\"certificate\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n title=\"{{ 'Add trusted certificate' | translate }}\"\n class=\"btn btn-link\"\n (click)=\"addTrustedCertificate()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add trusted certificate' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n title=\"{{ 'Reload' | translate }}\"\n class=\"btn btn-link\"\n (click)=\"loadTrustedCertificates()\"\n >\n <i c8yIcon=\"refresh\" [ngClass]=\"{ 'icon-spin': reloading | async }\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/users-guide/device-management/#trusted-certificates\"></c8y-help>\n\n<c8y-ui-empty-state\n *ngIf=\"(trustedCertificates | async)?.data.length === 0\"\n [icon]=\"'certificate'\"\n [title]=\"'No trusted certificates to display.' | translate\"\n [subtitle]=\"'Add your first certificate by clicking below.' | translate\"\n>\n <button\n title=\"{{ 'Add trusted certificate' | translate }}\"\n (click)=\"addTrustedCertificate()\"\n class=\"btn btn-primary\"\n >\n {{ 'Add trusted certificate' | translate }}\n </button>\n</c8y-ui-empty-state>\n\n<c8y-list-group class=\"m-b-24\">\n <div\n *ngIf=\"(trustedCertificates | async)?.data.length > 0\"\n class=\"page-sticky-header hidden-xs c8y-list__item c8y-list__item--empty-actions\"\n >\n <div class=\"c8y-list__item__block\">\n <div class=\"c8y-list__item__icon\">\n <i c8yIcon=\"certificate\" class=\"invisible\"></i>\n </div>\n <div class=\"c8y-list__item__body\">\n <div class=\"content-flex-60\">\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\" {{ 'Certificate' | translate }} \">\n {{ 'Certificate' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\"{{ 'Status' | translate }}\">\n {{ 'Status' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\"{{ 'Algorithm' | translate }}\">\n {{ 'Algorithm' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\"{{ 'Expiration date' | translate }}\">\n {{ 'Expiration date' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\" {{ 'Auto registration' | translate }}\">\n {{ 'Auto registration' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\" {{ 'Proof of possession' | translate }}\">\n {{ 'Proof of possession' | translate }}\n </span>\n </div>\n </div>\n </div>\n <div class=\"c8y-list__item__actions\"></div>\n </div>\n </div>\n\n <c8y-li\n *c8yFor=\"\n let trustedCertificate of trustedCertificates | async;\n let i = index;\n pipe: sortByExpirationDateAsc;\n loadMore: 'none'\n \"\n #listItem\n >\n <c8y-li-icon>\n <i c8yIcon=\"certificate\"></i>\n </c8y-li-icon>\n\n <c8y-li-body class=\"content-flex-60\">\n <div class=\"col-2\">\n <button\n class=\"btn-clean text-truncate\"\n title=\"{{ trustedCertificate.name }}\"\n (click)=\"listItem.toggleCollapsed()\"\n >\n {{ trustedCertificate.name }}\n </button>\n </div>\n <div class=\"col-2\">\n <div class=\"visible-xs p-8\"></div>\n <button\n type=\"button\"\n class=\"btn c8y-btn-checkbox--inline\"\n name=\"certificateStatus\"\n [(ngModel)]=\"trustedCertificate.status\"\n btnCheckbox\n btnCheckboxTrue=\"ENABLED\"\n btnCheckboxFalse=\"DISABLED\"\n (ngModelChange)=\"updateCertificate(trustedCertificate, { status: $event })\"\n >\n <small\n title=\"{{ 'Disabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'DISABLED'\"\n >\n {{ 'Disabled`trusted certificate status`' | translate }}\n </small>\n <small\n title=\"{{ 'Enabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'ENABLED'\"\n >\n {{ 'Enabled`trusted certificate status`' | translate }}\n </small>\n </button>\n <div class=\"visible-xs p-8\"></div>\n </div>\n <div class=\"col-2\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Algorithm' | translate }}: {{ trustedCertificate.algorithmName }}\"\n >\n <span class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\" translate>Algorithm</span>\n {{ trustedCertificate.algorithmName }}\n </div>\n </div>\n\n <div class=\"col-2\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Expiration date' | translate }}: {{ trustedCertificate.notAfter | c8yDate }}\"\n >\n <span class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\" translate>\n Expiration date\n </span>\n <small [ngClass]=\"highlightDependingOnExpirationStatus(trustedCertificate)\">\n <i\n c8yIcon=\"calendar\"\n class=\"m-r-4\"\n *ngIf=\"!highlightDependingOnExpirationStatus(trustedCertificate)\"\n ></i>\n <i\n c8yIcon=\"warning\"\n class=\"m-r-4\"\n *ngIf=\"highlightDependingOnExpirationStatus(trustedCertificate)\"\n ></i>\n <span>{{ trustedCertificate.notAfter | c8yDate }}</span>\n </small>\n </div>\n </div>\n <div class=\"col-2\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-t-8 m-r-4 visible-xs-inline\">\n {{ 'Auto registration' | translate }}\n </span>\n <span\n *ngIf=\"trustedCertificate.autoRegistrationEnabled\"\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Enabled`auto registration`' | translate\n }}\"\n >\n {{ 'Enabled`auto registration`' | translate }}\n </span>\n <span\n *ngIf=\"!trustedCertificate.autoRegistrationEnabled\"\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Disabled`auto registration`' | translate\n }}\"\n >\n {{ 'Disabled`auto registration`' | translate }}\n </span>\n </div>\n </div>\n <div class=\"col-2 d-flex\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-t-8 m-r-4 visible-xs-inline\">\n {{ 'Proof of possession' | translate }}\n </span>\n <span\n *ngIf=\"trustedCertificate.proofOfPossessionValid\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n >\n <div class=\"icon-flex\">\n <i c8yIcon=\"success\" class=\"text-success\"></i>\n {{ 'Complete`proof of possession`' | translate }}\n </div>\n </span>\n <span\n *ngIf=\"!trustedCertificate.proofOfPossessionValid\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n >\n <div class=\"icon-flex\">\n <i c8yIcon=\"warning\" class=\"text-warning\"></i>\n {{ 'Incomplete`proof of possession`' | translate }}\n </div>\n </span>\n </div>\n <button\n class=\"m-l-auto btn-dot btn-dot--danger btn showOnHover m-r-8\"\n (click)=\"deleteTrustedCertificate(trustedCertificate)\"\n type=\"button\"\n tooltip=\"{{ 'Delete' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Delete' | translate\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n </div>\n </c8y-li-body>\n\n <c8y-li-collapse>\n <div class=\"p-t-16 p-b-16\">\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Certificate name' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n type=\"text\"\n class=\"form-control\"\n [(ngModel)]=\"trustedCertificate.name\"\n required\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n title=\"{{ 'Update certificate name' | translate }}\"\n (click)=\"\n updateCertificate(trustedCertificate, { name: trustedCertificate.name })\n \"\n class=\"btn btn-primary\"\n [disabled]=\"!trustedCertificate.name\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-1\"></div>\n <div class=\"col-md-7\">\n <c8y-form-group>\n <label for=\"certInPemFormat\" class=\"control-label\" translate>Certificate</label>\n <textarea\n class=\"form-control no-resize\"\n id=\"certInPemFormat\"\n name=\"certInPemFormat\"\n type=\"text\"\n rows=\"7\"\n readonly\n [(ngModel)]=\"trustedCertificate.certInPemFormat\"\n ></textarea>\n </c8y-form-group>\n <c8y-form-group>\n <label title=\"{{ 'Auto registration' | translate }}\" class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"trustedCertificate.autoRegistrationEnabled\"\n (ngModelChange)=\"\n updateCertificate(trustedCertificate, { autoRegistrationEnabled: $event })\n \"\n />\n <span></span>\n <span>{{ 'Auto registration' | translate }}</span>\n </label>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-4\">\n <div class=\"legend form-block\" translate>Additional properties</div>\n <ul class=\"list-unstyled\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Algorithm' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.algorithmName }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Version' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.version }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Valid from' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.notBefore | c8yDate }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Issuer' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.issuer }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Expiration date' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.notAfter | c8yDate }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Serial number' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.serialNumber }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Subject`of a certificate`' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.subject }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"col-md-1\"></div>\n <div class=\"col-md-7\">\n <div class=\"legend form-block\">\n {{ 'Proof of possession' | translate }}\n <button\n type=\"button\"\n class=\"btn-help btn-help--sm\"\n popover=\"{{ PROOF_OF_POSSESSION_POPOVER | translate }}\"\n [attr.aria-label]=\"'Help' | translate\"\n triggers=\"focus\"\n container=\"body\"\n placement=\"right\"\n ></button>\n </div>\n <div *ngIf=\"trustedCertificate.proofOfPossessionValid\">\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n class=\"icon-flex\"\n >\n <i c8yIcon=\"success\" class=\"text-success\"></i>\n {{ 'Complete`proof of possession`' | translate }}\n </span>\n </div>\n <div *ngIf=\"!trustedCertificate.proofOfPossessionValid\">\n <div class=\"row m-b-16\">\n <div class=\"col-md-6\">\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n class=\"icon-flex\"\n >\n <i c8yIcon=\"warning\" class=\"text-warning\"></i>\n {{ 'Incomplete`proof of possession`' | translate }}\n </span>\n </div>\n <div class=\"col-md-6 col-lg-6 text-right-md\">\n <span class=\"text-label-small m-r-4\">\n {{ 'Verification code expires/expired on' | translate }}\n </span>\n {{\n (trustedCertificate.proofOfPossessionVerificationCodeUsableUntil | c8yDate) ||\n '---'\n }}\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-6 col-lg-6\">\n <c8y-form-group>\n <label for=\"unsignedVerificationCode\" class=\"control-label\" translate>\n Verification code\n </label>\n <textarea\n class=\"form-control no-resize\"\n name=\"unsignedVerificationCode\"\n id=\"unsignedVerificationCode\"\n readonly\n type=\"text\"\n rows=\"5\"\n [(ngModel)]=\"trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n ></textarea>\n </c8y-form-group>\n <div class=\"d-flex\">\n <button\n title=\"{{ 'Regenerate verification code' | translate }}\"\n class=\"btn btn-primary btn-sm\"\n (click)=\"regenerateUnsignedVerificationCode(trustedCertificate)\"\n >\n {{ 'Regenerate`verification code`' | translate }}\n </button>\n\n <button\n class=\"btn btn-sm btn-default m-l-auto m-r-0\"\n tooltip=\"{{ 'Copy to clipboard' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Copy to clipboard' | translate\"\n [disabled]=\"!trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n (click)=\"copyUnsignedVerificationCodeToClipboard(trustedCertificate)\"\n >\n <i c8yIcon=\"clipboard\"></i>\n </button>\n <button\n class=\"btn btn-default btn-sm\"\n tooltip=\"{{ 'Download as file' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Download as file' | translate\"\n [disabled]=\"!trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n (click)=\"downloadUnsignedVerificationCode(trustedCertificate)\"\n >\n <i c8yIcon=\"download\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"col-md-6 col-lg-6\">\n <c8y-form-group>\n <label for=\"signedVerificationCode\" class=\"control-label\">\n {{ 'Signed verification code' | translate }}\n <button\n type=\"button\"\n class=\"btn-help btn-help--sm\"\n popover=\"{{ SIGNED_VERIFICATION_CODE_POPOVER | translate }}\"\n [attr.aria-label]=\"'Help' | translate\"\n container=\"body\"\n placement=\"top\"\n ></button>\n </label>\n <textarea\n class=\"form-control no-resize\"\n name=\"signedVerificationCode\"\n id=\"signedVerificationCode\"\n type=\"text\"\n rows=\"5\"\n [(ngModel)]=\"signedVerificationCode\"\n ></textarea>\n </c8y-form-group>\n <div class=\"d-flex\">\n <button\n title=\"{{ 'Verify signed verification code' | translate }}\"\n class=\"btn btn-primary btn-sm\"\n (click)=\"\n verifySignedVerificationCode(trustedCertificate, signedVerificationCode)\n \"\n [disabled]=\"!signedVerificationCode\"\n >\n {{ 'Verify`signed verification code`' | translate }}\n </button>\n <button\n class=\"btn btn-sm btn-default m-l-auto\"\n tooltip=\"{{ 'Upload file' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Upload file' | translate\"\n (click)=\"fileInput.click()\"\n >\n <i c8yIcon=\"upload\"></i>\n </button>\n <input #fileInput type=\"file\" (change)=\"onFileInput($event)\" class=\"hidden\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </c8y-li-collapse>\n </c8y-li>\n</c8y-list-group>\n" }]
151
151
  }], ctorParameters: function () { return [{ type: i1.BsModalService }, { type: i2.AlertService }, { type: i3.TrustedCertificateService }, { type: i2.ModalService }, { type: i4.TranslateService }, { type: i2.ClipboardService }]; } });
152
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ1c3RlZC1jZXJ0aWZpY2F0ZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHJ1c3RlZC1jZXJ0aWZpY2F0ZXMvdHJ1c3RlZC1jZXJ0aWZpY2F0ZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vdHJ1c3RlZC1jZXJ0aWZpY2F0ZXMvdHJ1c3RlZC1jZXJ0aWZpY2F0ZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEcsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDckYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBdUIseUJBQXlCLEVBQWUsTUFBTSxhQUFhLENBQUM7QUFDMUYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUN6RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7Ozs7Ozs7Ozs7O0FBTW5DLE1BQU0sT0FBTyw0QkFBNEI7SUF1QnZDLFlBQ1UsT0FBdUIsRUFDdkIsWUFBMEIsRUFDMUIseUJBQW9ELEVBQ3BELFlBQTBCLEVBQzFCLGdCQUFrQyxFQUNsQyxnQkFBa0M7UUFMbEMsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFDdkIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsOEJBQXlCLEdBQXpCLHlCQUF5QixDQUEyQjtRQUNwRCxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUE1QjVDLGdDQUEyQixHQUFHLE9BQU8sQ0FDbkMsc0pBQXNKLENBQ3ZKLENBQUM7UUFDRixxQ0FBZ0MsR0FBRyxPQUFPLENBQ3hDLDRJQUE0SSxDQUM3SSxDQUFDO1FBRUYsY0FBUyxHQUE2QixJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqRSxXQUFNLEdBQTBCLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFELHdCQUFtQixHQUFpRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDbEYsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQ3BDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxFQUM5QyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FDdEMsQ0FBQztRQUNGLDRCQUF1QixHQUFHLElBQUksQ0FDNUIsR0FBRyxDQUFDLENBQUMsT0FBOEIsRUFBRSxFQUFFO1lBQ3JDLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQyxDQUNILENBQUM7SUFXQyxDQUFDO0lBRUosS0FBSyxDQUFDLFFBQVE7UUFDWixNQUFNLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxLQUFLLENBQUMsdUJBQXVCO1FBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELHNCQUFzQjtRQUNwQixNQUFNLE1BQU0sR0FBVztZQUNyQixRQUFRLEVBQUUsSUFBSTtZQUNkLGNBQWMsRUFBRSxJQUFJO1NBQ3JCLENBQUM7UUFDRixPQUFPLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELEtBQUssQ0FBQyxxQkFBcUI7UUFDekIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsOEJBQThCLEVBQUU7WUFDOUQsS0FBSyxFQUFFLFVBQVU7WUFDakIsZUFBZSxFQUFFLGdDQUFnQztZQUNqRCxjQUFjLEVBQUUsMEJBQTBCO1lBQzFDLG1CQUFtQixFQUFFLElBQUk7U0FDMUIsQ0FBQyxDQUFDLE9BQXlDLENBQUM7UUFDN0MsSUFBSTtZQUNGLE1BQU0sS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUNuQixLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ3BCO1FBQUMsT0FBTyxFQUFFLEVBQUU7WUFDWCxhQUFhO1NBQ2Q7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLHdCQUF3QixDQUFDLFdBQVc7UUFDeEMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFDcEQsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQzlCLHdFQUF3RSxDQUN6RSxDQUFDO1FBQ0YsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDekQsTUFBTSxlQUFlLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQztRQUN6QyxNQUFNLElBQUksR0FBRztZQUNYLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQzlDLGVBQWU7YUFDaEIsQ0FBQztZQUNGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO1NBQzdDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRVosSUFBSTtZQUNGLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdkYsTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNyRSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDO1lBQzNELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDcEI7UUFBQyxPQUFPLEVBQUUsRUFBRTtZQUNYLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDeEM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLGlCQUFpQixDQUNyQixrQkFBdUMsRUFDdkMsWUFBMEM7UUFFMUMsSUFBSTtZQUNGLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixDQUFDLE1BQU0sQ0FBQztnQkFDMUMsV0FBVyxFQUFFLGtCQUFrQixDQUFDLFdBQVc7Z0JBQzNDLEdBQUcsWUFBWTthQUNoQixDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO1NBQzFEO1FBQUMsT0FBTyxFQUFFLEVBQUU7WUFDWCxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3hDO0lBQ0gsQ0FBQztJQUVELG9DQUFvQyxDQUFDLElBQXlCO1FBQzVELE1BQU0sYUFBYSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxVQUFVO1FBQzFELE1BQU0sY0FBYyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDNUMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLGFBQWEsQ0FBQztRQUM5RCxNQUFNLGlCQUFpQixHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM1RCxNQUFNLE9BQU8sR0FBRyxpQkFBaUIsR0FBRyxjQUFjLENBQUM7UUFDbkQsTUFBTSx1QkFBdUIsR0FBRyxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FBQztRQUNyRSxJQUFJLE9BQU8sRUFBRTtZQUNYLE9BQU8sYUFBYSxDQUFDO1NBQ3RCO1FBQ0QsSUFBSSx1QkFBdUIsRUFBRTtZQUMzQixPQUFPLGNBQWMsQ0FBQztTQUN2QjtRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELGtDQUFrQyxDQUFDLGtCQUF1QztRQUN4RSxJQUFJLENBQUMseUJBQXlCLENBQUMsNkJBQTZCLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxJQUFJLENBQ25GLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFO1lBQ1gsTUFBTSxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDLENBQUM7UUFDdkUsQ0FBQyxFQUNELEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FDN0MsQ0FBQztJQUNKLENBQUM7SUFFRCw0QkFBNEIsQ0FDMUIsa0JBQXVDLEVBQ3ZDLHNCQUE4QjtRQUU5QixJQUFJLENBQUMseUJBQXlCO2FBQzNCLDRCQUE0QixDQUFDLGtCQUFrQixFQUFFLHNCQUFzQixDQUFDO2FBQ3hFLElBQUksQ0FDSCxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRTtZQUNYLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsb0NBQW9DLENBQUMsQ0FBQyxDQUFDO1FBQzNFLENBQUMsRUFDRCxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQzdDLENBQUM7SUFDTixDQUFDO0lBRUQsZ0NBQWdDLENBQUMsa0JBQXVDO1FBQ3RFLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsa0JBQWtCLENBQUMseUNBQXlDLENBQUMsQ0FBQyxDQUFDO1FBQ3RGLE1BQU0sUUFBUSxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQztRQUN6QyxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsUUFBUSxNQUFNLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsdUNBQXVDLENBQUMsa0JBQXVDO1FBQzdFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMseUNBQXlDLENBQUMsQ0FBQztJQUNoRyxDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQUs7UUFDZixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQzNCLE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7UUFDaEMsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUU7WUFDbkIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxNQUFnQixDQUFDO1FBQ3hELENBQUMsQ0FBQztRQUNGLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7O3lIQWpLVSw0QkFBNEI7NkdBQTVCLDRCQUE0QixnRUNmekMsZ2hwQkFxZ0JBOzJGRHRmYSw0QkFBNEI7a0JBSnhDLFNBQVM7K0JBQ0UsMEJBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFsZXJ0U2VydmljZSwgQ2xpcGJvYXJkU2VydmljZSwgZ2V0dGV4dCwgTW9kYWxTZXJ2aWNlLCBTdGF0dXMgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IEFkZFRydXN0ZWRDZXJ0aWZpY2F0ZUNvbXBvbmVudCB9IGZyb20gJy4vYWRkLXRydXN0ZWQtY2VydGlmaWNhdGUuY29tcG9uZW50JztcbmltcG9ydCB7IEJzTW9kYWxTZXJ2aWNlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XG5pbXBvcnQgeyBJVHJ1c3RlZENlcnRpZmljYXRlLCBUcnVzdGVkQ2VydGlmaWNhdGVTZXJ2aWNlLCBJUmVzdWx0TGlzdCB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IHRhcCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgcGlwZSwgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBzYXZlQXMgfSBmcm9tICdmaWxlLXNhdmVyJztcbmltcG9ydCB7IGFzc2lnbiB9IGZyb20gJ2xvZGFzaC1lcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS10cnVzdGVkLWNlcnRpZmljYXRlcycsXG4gIHRlbXBsYXRlVXJsOiAnLi90cnVzdGVkLWNlcnRpZmljYXRlcy5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgVHJ1c3RlZENlcnRpZmljYXRlc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIFBST09GX09GX1BPU1NFU1NJT05fUE9QT1ZFUiA9IGdldHRleHQoXG4gICAgJ1wiUHJvb2Ygb2YgcG9zc2Vzc2lvblwiIGlzIGEgc2VjdXJpdHkgbWV0aG9kIHVzZWQgdG8gcHJvdmUgdGhhdCB3aG9ldmVyIHNlbmRzIGEgbWVzc2FnZSBpcyBhbHNvIGluIHRoZSBwb3NzZXNzaW9uIG9mIHRoZSBwYXJ0aWN1bGFyIGNyeXB0b2dyYXBoaWMga2V5LidcbiAgKTtcbiAgU0lHTkVEX1ZFUklGSUNBVElPTl9DT0RFX1BPUE9WRVIgPSBnZXR0ZXh0KFxuICAgICdVc2UgdGhlIGZvbGxvd2luZyBvcGVuc3NsIGNvbW1hbmQgdG8gY3JlYXRlIHRoZSBzaWduZWQgdmVyaWZpY2F0aW9uIGNvZGU6IG9wZW5zc2wgZGdzdCAtc2hhMjU2IC1zaWduIDxwcml2YXRlLmtleT4gPHZlcmlmaWNhdGlvbl9jb2RlLnR4dD4nXG4gICk7XG5cbiAgcmVsb2FkaW5nOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgcmVsb2FkOiBCZWhhdmlvclN1YmplY3Q8dm9pZD4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KG51bGwpO1xuICB0cnVzdGVkQ2VydGlmaWNhdGVzOiBPYnNlcnZhYmxlPElSZXN1bHRMaXN0PElUcnVzdGVkQ2VydGlmaWNhdGU+PiA9IHRoaXMucmVsb2FkLnBpcGUoXG4gICAgdGFwKCgpID0+IHRoaXMucmVsb2FkaW5nLm5leHQodHJ1ZSkpLFxuICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmdldFRydXN0ZWRDZXJ0aWZpY2F0ZXMoKSksXG4gICAgdGFwKCgpID0+IHRoaXMucmVsb2FkaW5nLm5leHQoZmFsc2UpKVxuICApO1xuICBzb3J0QnlFeHBpcmF0aW9uRGF0ZUFzYyA9IHBpcGUoXG4gICAgdGFwKChyZXN1bHRzOiBJVHJ1c3RlZENlcnRpZmljYXRlW10pID0+IHtcbiAgICAgIHJldHVybiByZXN1bHRzLnNvcnQoKG4xLCBuMikgPT4gbjEubm90QWZ0ZXIubG9jYWxlQ29tcGFyZShuMi5ub3RBZnRlcikpO1xuICAgIH0pXG4gICk7XG5cbiAgc2lnbmVkVmVyaWZpY2F0aW9uQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYnNNb2RhbDogQnNNb2RhbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcbiAgICBwcml2YXRlIHRydXN0ZWRDZXJ0aWZpY2F0ZVNlcnZpY2U6IFRydXN0ZWRDZXJ0aWZpY2F0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE1vZGFsU2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjbGlwYm9hcmRTZXJ2aWNlOiBDbGlwYm9hcmRTZXJ2aWNlXG4gICkge31cblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICBhd2FpdCB0aGlzLmxvYWRUcnVzdGVkQ2VydGlmaWNhdGVzKCk7XG4gIH1cblxuICBhc3luYyBsb2FkVHJ1c3RlZENlcnRpZmljYXRlcygpIHtcbiAgICB0aGlzLnJlbG9hZC5uZXh0KCk7XG4gIH1cblxuICBnZXRUcnVzdGVkQ2VydGlmaWNhdGVzKCkge1xuICAgIGNvbnN0IGZpbHRlcjogb2JqZWN0ID0ge1xuICAgICAgcGFnZVNpemU6IDEwMDAsXG4gICAgICB3aXRoVG90YWxQYWdlczogdHJ1ZVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMudHJ1c3RlZENlcnRpZmljYXRlU2VydmljZS5saXN0KGZpbHRlcik7XG4gIH1cblxuICBhc3luYyBhZGRUcnVzdGVkQ2VydGlmaWNhdGUoKSB7XG4gICAgY29uc3QgbW9kYWwgPSB0aGlzLmJzTW9kYWwuc2hvdyhBZGRUcnVzdGVkQ2VydGlmaWNhdGVDb21wb25lbnQsIHtcbiAgICAgIGNsYXNzOiAnbW9kYWwtc20nLFxuICAgICAgYXJpYURlc2NyaWJlZGJ5OiAnYWRkQ2VydGlmaWNhdGVNb2RhbERlc2NyaXB0aW9uJyxcbiAgICAgIGFyaWFMYWJlbGxlZEJ5OiAnYWRkQ2VydGlmaWNhdGVNb2RhbFRpdGxlJyxcbiAgICAgIGlnbm9yZUJhY2tkcm9wQ2xpY2s6IHRydWVcbiAgICB9KS5jb250ZW50IGFzIEFkZFRydXN0ZWRDZXJ0aWZpY2F0ZUNvbXBvbmVudDtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbW9kYWwucmVzdWx0O1xuICAgICAgbW9kYWwuY2xvc2UoKTtcbiAgICAgIHRoaXMucmVsb2FkLm5leHQoKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVRydXN0ZWRDZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZSkge1xuICAgIGNvbnN0IHRpdGxlID0gZ2V0dGV4dCgnRGVsZXRlIHRydXN0ZWQgY2VydGlmaWNhdGUnKTtcbiAgICBjb25zdCBjb25maXJtYXRpb25UZXh0ID0gZ2V0dGV4dChcbiAgICAgICdZb3UgYXJlIGFib3V0IHRvIGRlbGV0ZSBhIHRydXN0ZWQgY2VydGlmaWNhdGUgXCJ7eyBjZXJ0aWZpY2F0ZU5hbWUgfX1cIi4nXG4gICAgKTtcbiAgICBjb25zdCBmaW5hbFF1ZXN0aW9uID0gZ2V0dGV4dCgnRG8geW91IHdhbnQgdG8gcHJvY2VlZD8nKTtcbiAgICBjb25zdCBjZXJ0aWZpY2F0ZU5hbWUgPSBjZXJ0aWZpY2F0ZS5uYW1lO1xuICAgIGNvbnN0IGJvZHkgPSBbXG4gICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChjb25maXJtYXRpb25UZXh0LCB7XG4gICAgICAgIGNlcnRpZmljYXRlTmFtZVxuICAgICAgfSksXG4gICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChmaW5hbFF1ZXN0aW9uKVxuICAgIF0uam9pbignICcpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMubW9kYWxTZXJ2aWNlLmNvbmZpcm0odGl0bGUsIGJvZHksIFN0YXR1cy5EQU5HRVIsIHsgb2s6IGdldHRleHQoJ0RlbGV0ZScpIH0pO1xuICAgICAgYXdhaXQgdGhpcy50cnVzdGVkQ2VydGlmaWNhdGVTZXJ2aWNlLmRlbGV0ZShjZXJ0aWZpY2F0ZS5maW5nZXJwcmludCk7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5zdWNjZXNzKGdldHRleHQoJ0NlcnRpZmljYXRlIGRlbGV0ZWQuJykpO1xuICAgICAgdGhpcy5yZWxvYWQubmV4dCgpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGV4KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyB1cGRhdGVDZXJ0aWZpY2F0ZShcbiAgICB0cnVzdGVkQ2VydGlmaWNhdGU6IElUcnVzdGVkQ2VydGlmaWNhdGUsXG4gICAgdXBkYXRpbmdQYXJ0OiBQYXJ0aWFsPElUcnVzdGVkQ2VydGlmaWNhdGU+XG4gICkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnRydXN0ZWRDZXJ0aWZpY2F0ZVNlcnZpY2UudXBkYXRlKHtcbiAgICAgICAgZmluZ2VycHJpbnQ6IHRydXN0ZWRDZXJ0aWZpY2F0ZS5maW5nZXJwcmludCxcbiAgICAgICAgLi4udXBkYXRpbmdQYXJ0XG4gICAgICB9KTtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnN1Y2Nlc3MoZ2V0dGV4dCgnQ2VydGlmaWNhdGUgc2F2ZWQuJykpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGV4KTtcbiAgICB9XG4gIH1cblxuICBoaWdobGlnaHREZXBlbmRpbmdPbkV4cGlyYXRpb25TdGF0dXMoaXRlbTogSVRydXN0ZWRDZXJ0aWZpY2F0ZSkge1xuICAgIGNvbnN0IHdhcm5pbmdPZmZzZXQgPSAyNCAqIDYwICogNjAgKiAxMDAwICogOTA7IC8vIDkwIGRheXNcbiAgICBjb25zdCB0b2RheVRpbWVzdGFtcCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIGNvbnN0IHdhcm5pbmdUaW1lc3RhbXAgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSArIHdhcm5pbmdPZmZzZXQ7XG4gICAgY29uc3Qgbm90QWZ0ZXJUaW1lc3RhbXAgPSBuZXcgRGF0ZShpdGVtLm5vdEFmdGVyKS5nZXRUaW1lKCk7XG4gICAgY29uc3QgZXhwaXJlZCA9IG5vdEFmdGVyVGltZXN0YW1wIDwgdG9kYXlUaW1lc3RhbXA7XG4gICAgY29uc3QgZXhwaXJlc0luTGVzc1RoYW45MERheXMgPSBub3RBZnRlclRpbWVzdGFtcCA8IHdhcm5pbmdUaW1lc3RhbXA7XG4gICAgaWYgKGV4cGlyZWQpIHtcbiAgICAgIHJldHVybiAndGV4dC1kYW5nZXInO1xuICAgIH1cbiAgICBpZiAoZXhwaXJlc0luTGVzc1RoYW45MERheXMpIHtcbiAgICAgIHJldHVybiAndGV4dC13YXJuaW5nJztcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcmVnZW5lcmF0ZVVuc2lnbmVkVmVyaWZpY2F0aW9uQ29kZSh0cnVzdGVkQ2VydGlmaWNhdGU6IElUcnVzdGVkQ2VydGlmaWNhdGUpIHtcbiAgICB0aGlzLnRydXN0ZWRDZXJ0aWZpY2F0ZVNlcnZpY2UucmVnZW5lcmF0ZVBvUFZlcmlmaWNhdGlvbkNvZGUodHJ1c3RlZENlcnRpZmljYXRlKS50aGVuKFxuICAgICAgKHsgZGF0YSB9KSA9PiB7XG4gICAgICAgIGFzc2lnbih0cnVzdGVkQ2VydGlmaWNhdGUsIGRhdGEpO1xuICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5zdWNjZXNzKGdldHRleHQoJ1ZlcmlmaWNhdGlvbiBjb2RlIHJlZ2VuZXJhdGVkLicpKTtcbiAgICAgIH0sXG4gICAgICBleCA9PiB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGV4KVxuICAgICk7XG4gIH1cblxuICB2ZXJpZnlTaWduZWRWZXJpZmljYXRpb25Db2RlKFxuICAgIHRydXN0ZWRDZXJ0aWZpY2F0ZTogSVRydXN0ZWRDZXJ0aWZpY2F0ZSxcbiAgICBzaWduZWRWZXJpZmljYXRpb25Db2RlOiBzdHJpbmdcbiAgKSB7XG4gICAgdGhpcy50cnVzdGVkQ2VydGlmaWNhdGVTZXJ2aWNlXG4gICAgICAudmVyaWZ5U2lnbmVkVmVyaWZpY2F0aW9uQ29kZSh0cnVzdGVkQ2VydGlmaWNhdGUsIHNpZ25lZFZlcmlmaWNhdGlvbkNvZGUpXG4gICAgICAudGhlbihcbiAgICAgICAgKHsgZGF0YSB9KSA9PiB7XG4gICAgICAgICAgYXNzaWduKHRydXN0ZWRDZXJ0aWZpY2F0ZSwgZGF0YSk7XG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2Uuc3VjY2VzcyhnZXR0ZXh0KCdTaWduZWQgdmVyaWZpY2F0aW9uIGNvZGUgdmVyaWZpZWQuJykpO1xuICAgICAgICB9LFxuICAgICAgICBleCA9PiB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGV4KVxuICAgICAgKTtcbiAgfVxuXG4gIGRvd25sb2FkVW5zaWduZWRWZXJpZmljYXRpb25Db2RlKHRydXN0ZWRDZXJ0aWZpY2F0ZTogSVRydXN0ZWRDZXJ0aWZpY2F0ZSkge1xuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbdHJ1c3RlZENlcnRpZmljYXRlLnByb29mT2ZQb3NzZXNzaW9uVW5zaWduZWRWZXJpZmljYXRpb25Db2RlXSk7XG4gICAgY29uc3QgZmlsZU5hbWUgPSB0cnVzdGVkQ2VydGlmaWNhdGUubmFtZTtcbiAgICBzYXZlQXMoYmxvYiwgYCR7ZmlsZU5hbWV9LnR4dGApO1xuICB9XG5cbiAgY29weVVuc2lnbmVkVmVyaWZpY2F0aW9uQ29kZVRvQ2xpcGJvYXJkKHRydXN0ZWRDZXJ0aWZpY2F0ZTogSVRydXN0ZWRDZXJ0aWZpY2F0ZSkge1xuICAgIHRoaXMuY2xpcGJvYXJkU2VydmljZS53cml0ZVRleHQodHJ1c3RlZENlcnRpZmljYXRlLnByb29mT2ZQb3NzZXNzaW9uVW5zaWduZWRWZXJpZmljYXRpb25Db2RlKTtcbiAgfVxuXG4gIG9uRmlsZUlucHV0KGV2ZW50KSB7XG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQ7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xuICAgICAgdGhpcy5zaWduZWRWZXJpZmljYXRpb25Db2RlID0gcmVhZGVyLnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgfTtcbiAgICByZWFkZXIucmVhZEFzVGV4dChpbnB1dC5maWxlc1swXSk7XG4gIH1cbn1cbiIsIjxjOHktdGl0bGU+e3sgJ1RydXN0ZWQgY2VydGlmaWNhdGVzJyB8IHRyYW5zbGF0ZSB9fTwvYzh5LXRpdGxlPlxuXG48Yzh5LWJyZWFkY3J1bWI+XG4gIDxjOHktYnJlYWRjcnVtYi1pdGVtXG4gICAgbGFiZWw9XCJ7eyAnTWFuYWdlbWVudCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgIGljb249XCJjOHktbWFuYWdlbWVudFwiXG4gID48L2M4eS1icmVhZGNydW1iLWl0ZW0+XG4gIDxjOHktYnJlYWRjcnVtYi1pdGVtXG4gICAgbGFiZWw9XCJ7eyAnVHJ1c3RlZCBjZXJ0aWZpY2F0ZXMnIHwgdHJhbnNsYXRlIH19XCJcbiAgICBpY29uPVwiY2VydGlmaWNhdGVcIlxuICA+PC9jOHktYnJlYWRjcnVtYi1pdGVtPlxuPC9jOHktYnJlYWRjcnVtYj5cblxuPGM4eS1hY3Rpb24tYmFyLWl0ZW0gW3BsYWNlbWVudF09XCIncmlnaHQnXCI+XG4gIDxidXR0b25cbiAgICB0aXRsZT1cInt7ICdBZGQgdHJ1c3RlZCBjZXJ0aWZpY2F0ZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgIGNsYXNzPVwiYnRuIGJ0bi1saW5rXCJcbiAgICAoY2xpY2spPVwiYWRkVHJ1c3RlZENlcnRpZmljYXRlKClcIlxuICA+XG4gICAgPGkgYzh5SWNvbj1cInBsdXMtY2lyY2xlXCI+PC9pPlxuICAgIHt7ICdBZGQgdHJ1c3RlZCBjZXJ0aWZpY2F0ZScgfCB0cmFuc2xhdGUgfX1cbiAgPC9idXR0b24+XG48L2M4eS1hY3Rpb24tYmFyLWl0ZW0+XG5cbjxjOHktYWN0aW9uLWJhci1pdGVtIFtwbGFjZW1lbnRdPVwiJ3JpZ2h0J1wiPlxuICA8YnV0dG9uXG4gICAgdGl0bGU9XCJ7eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgY2xhc3M9XCJidG4gYnRuLWxpbmtcIlxuICAgIChjbGljayk9XCJsb2FkVHJ1c3RlZENlcnRpZmljYXRlcygpXCJcbiAgPlxuICAgIDxpIGM4eUljb249XCJyZWZyZXNoXCIgW25nQ2xhc3NdPVwieyAnaWNvbi1zcGluJzogcmVsb2FkaW5nIHwgYXN5bmMgfVwiPjwvaT5cbiAgICB7eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fVxuICA8L2J1dHRvbj5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuPGM4eS1oZWxwIHNyYz1cIi91c2Vycy1ndWlkZS9kZXZpY2UtbWFuYWdlbWVudC8jdHJ1c3RlZC1jZXJ0aWZpY2F0ZXNcIj48L2M4eS1oZWxwPlxuXG48Yzh5LXVpLWVtcHR5LXN0YXRlXG4gICpuZ0lmPVwiKHRydXN0ZWRDZXJ0aWZpY2F0ZXMgfCBhc3luYyk/LmRhdGEubGVuZ3RoID09PSAwXCJcbiAgW2ljb25dPVwiJ2NlcnRpZmljYXRlJ1wiXG4gIFt0aXRsZV09XCInTm8gdHJ1c3RlZCBjZXJ0aWZpY2F0ZXMgdG8gZGlzcGxheS4nIHwgdHJhbnNsYXRlXCJcbiAgW3N1YnRpdGxlXT1cIidBZGQgeW91ciBmaXJzdCBjZXJ0aWZpY2F0ZSBieSBjbGlja2luZyBiZWxvdy4nIHwgdHJhbnNsYXRlXCJcbj5cbiAgPGJ1dHRvblxuICAgIHRpdGxlPVwie3sgJ0FkZCB0cnVzdGVkIGNlcnRpZmljYXRlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgKGNsaWNrKT1cImFkZFRydXN0ZWRDZXJ0aWZpY2F0ZSgpXCJcbiAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiXG4gID5cbiAgICB7eyAnQWRkIHRydXN0ZWQgY2VydGlmaWNhdGUnIHwgdHJhbnNsYXRlIH19XG4gIDwvYnV0dG9uPlxuPC9jOHktdWktZW1wdHktc3RhdGU+XG5cbjxjOHktbGlzdC1ncm91cCBjbGFzcz1cIm0tYi0yNFwiPlxuICA8ZGl2XG4gICAgKm5nSWY9XCIodHJ1c3RlZENlcnRpZmljYXRlcyB8IGFzeW5jKT8uZGF0YS5sZW5ndGggPiAwXCJcbiAgICBjbGFzcz1cInBhZ2Utc3RpY2t5LWhlYWRlciBoaWRkZW4teHMgYzh5LWxpc3RfX2l0ZW0gYzh5LWxpc3RfX2l0ZW0tLWVtcHR5LWFjdGlvbnNcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cImM4eS1saXN0X19pdGVtX19ibG9ja1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImM4eS1saXN0X19pdGVtX19pY29uXCI+XG4gICAgICAgIDxpIGM4eUljb249XCJjZXJ0aWZpY2F0ZVwiIGNsYXNzPVwiaW52aXNpYmxlXCI+PC9pPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiYzh5LWxpc3RfX2l0ZW1fX2JvZHlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtZmxleC02MFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCIgdGl0bGU9XCIge3sgJ0NlcnRpZmljYXRlJyB8IHRyYW5zbGF0ZSB9fSBcIj5cbiAgICAgICAgICAgICAge3sgJ0NlcnRpZmljYXRlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCIgdGl0bGU9XCJ7eyAnU3RhdHVzJyB8IHRyYW5zbGF0ZSB9fVwiPlxuICAgICAgICAgICAgICB7eyAnU3RhdHVzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCIgdGl0bGU9XCJ7eyAnQWxnb3JpdGhtJyB8IHRyYW5zbGF0ZSB9fVwiPlxuICAgICAgICAgICAgICB7eyAnQWxnb3JpdGhtJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCIgdGl0bGU9XCJ7eyAnRXhwaXJhdGlvbiBkYXRlJyB8IHRyYW5zbGF0ZSB9fVwiPlxuICAgICAgICAgICAgICB7eyAnRXhwaXJhdGlvbiBkYXRlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCIgdGl0bGU9XCIge3sgJ0F1dG8gcmVnaXN0cmF0aW9uJyB8IHRyYW5zbGF0ZSB9fVwiPlxuICAgICAgICAgICAgICB7eyAnQXV0byByZWdpc3RyYXRpb24nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIiB0aXRsZT1cIiB7eyAnUHJvb2Ygb2YgcG9zc2Vzc2lvbicgfCB0cmFuc2xhdGUgfX1cIj5cbiAgICAgICAgICAgICAge3sgJ1Byb29mIG9mIHBvc3Nlc3Npb24nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiYzh5LWxpc3RfX2l0ZW1fX2FjdGlvbnNcIj48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGM4eS1saVxuICAgICpjOHlGb3I9XCJcbiAgICAgIGxldCB0cnVzdGVkQ2VydGlmaWNhdGUgb2YgdHJ1c3RlZENlcnRpZmljYXRlcyB8IGFzeW5jO1xuICAgICAgbGV0IGkgPSBpbmRleDtcbiAgICAgIHBpcGU6IHNvcnRCeUV4cGlyYXRpb25EYXRlQXNjO1xuICAgICAgbG9hZE1vcmU6ICdub25lJ1xuICAgIFwiXG4gICAgI2xpc3RJdGVtXG4gID5cbiAgICA8Yzh5LWxpLWljb24+XG4gICAgICA8aSBjOHlJY29uPVwiY2VydGlmaWNhdGVcIj48L2k+XG4gICAgPC9jOHktbGktaWNvbj5cblxuICAgIDxjOHktbGktYm9keSBjbGFzcz1cImNvbnRlbnQtZmxleC02MFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC0yXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzcz1cImJ0bi1jbGVhbiB0ZXh0LXRydW5jYXRlXCJcbiAgICAgICAgICB0aXRsZT1cInt7IHRydXN0ZWRDZXJ0aWZpY2F0ZS5uYW1lIH19XCJcbiAgICAgICAgICAoY2xpY2spPVwibGlzdEl0ZW0udG9nZ2xlQ29sbGFwc2VkKClcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgdHJ1c3RlZENlcnRpZmljYXRlLm5hbWUgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidmlzaWJsZS14cyBwLThcIj48L2Rpdj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiYnRuIGM4eS1idG4tY2hlY2tib3gtLWlubGluZVwiXG4gICAgICAgICAgbmFtZT1cImNlcnRpZmljYXRlU3RhdHVzXCJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cInRydXN0ZWRDZXJ0aWZpY2F0ZS5zdGF0dXNcIlxuICAgICAgICAgIGJ0bkNoZWNrYm94XG4gICAgICAgICAgYnRuQ2hlY2tib3hUcnVlPVwiRU5BQkxFRFwiXG4gICAgICAgICAgYnRuQ2hlY2tib3hGYWxzZT1cIkRJU0FCTEVEXCJcbiAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVDZXJ0aWZpY2F0ZSh0cnVzdGVkQ2VydGlmaWNhdGUsIHsgc3RhdHVzOiAkZXZlbnQgfSlcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNtYWxsXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdEaXNhYmxlZGB0cnVzdGVkIGNlcnRpZmljYXRlIHN0YXR1c2AnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIFtoaWRkZW5dPVwidHJ1c3RlZENlcnRpZmljYXRlLnN0YXR1cyAhPT0gJ0RJU0FCTEVEJ1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgJ0Rpc2FibGVkYHRydXN0ZWQgY2VydGlmaWNhdGUgc3RhdHVzYCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgIDxzbWFsbFxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnRW5hYmxlZGB0cnVzdGVkIGNlcnRpZmljYXRlIHN0YXR1c2AnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIFtoaWRkZW5dPVwidHJ1c3RlZENlcnRpZmljYXRlLnN0YXR1cyAhPT0gJ0VOQUJMRUQnXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyAnRW5hYmxlZGB0cnVzdGVkIGNlcnRpZmljYXRlIHN0YXR1c2AnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2aXNpYmxlLXhzIHAtOFwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTJcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiXG4gICAgICAgICAgdGl0bGU9XCJ7eyAnQWxnb3JpdGhtJyB8IHRyYW5zbGF0ZSB9fToge3sgdHJ1c3RlZENlcnRpZmljYXRlLmFsZ29yaXRobU5hbWUgfX1cIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsIG0tdC04IG0tci04IHZpc2libGUteHMtaW5saW5lXCIgdHJhbnNsYXRlPkFsZ29yaXRobTwvc3Bhbj5cbiAgICAgICAgICB7eyB0cnVzdGVkQ2VydGlmaWNhdGUuYWxnb3JpdGhtTmFtZSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTJcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiXG4gICAgICAgICAgdGl0bGU9XCJ7eyAnRXhwaXJhdGlvbiBkYXRlJyB8IHRyYW5zbGF0ZSB9fToge3sgdHJ1c3RlZENlcnRpZmljYXRlLm5vdEFmdGVyIHwgYzh5RGF0ZSB9fVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbGFiZWwtc21hbGwgbS10LTggbS1yLTggdmlzaWJsZS14cy1pbmxpbmVcIiB0cmFuc2xhdGU+XG4gICAgICAgICAgICBFeHBpcmF0aW9uIGRhdGVcbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNtYWxsIFtuZ0NsYXNzXT1cImhpZ2hsaWdodERlcGVuZGluZ09uRXhwaXJhdGlvblN0YXR1cyh0cnVzdGVkQ2VydGlmaWNhdGUpXCI+XG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICBjOHlJY29uPVwiY2FsZW5kYXJcIlxuICAgICAgICAgICAgICBjbGFzcz1cIm0tci00XCJcbiAgICAgICAgICAgICAgKm5nSWY9XCIhaGlnaGxpZ2h0RGVwZW5kaW5nT25FeHBpcmF0aW9uU3RhdHVzKHRydXN0ZWRDZXJ0aWZpY2F0ZSlcIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgIGM4eUljb249XCJ3YXJuaW5nXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJtLXItNFwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiaGlnaGxpZ2h0RGVwZW5kaW5nT25FeHBpcmF0aW9uU3RhdHVzKHRydXN0ZWRDZXJ0aWZpY2F0ZSlcIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgIDxzcGFuPnt7IHRydXN0ZWRDZXJ0aWZpY2F0ZS5ub3RBZnRlciB8IGM4eURhdGUgfX08L3NwYW4+XG4gICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1sYWJlbC1zbWFsbCBtLXQtOCBtLXItNCB2aXNpYmxlLXhzLWlubGluZVwiPlxuICAgICAgICAgICAge3sgJ0F1dG8gcmVnaXN0cmF0aW9uJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgKm5nSWY9XCJ0cnVzdGVkQ2VydGlmaWNhdGUuYXV0b1JlZ2lzdHJhdGlvbkVuYWJsZWRcIlxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnQXV0byByZWdpc3RyYXRpb24nIHwgdHJhbnNsYXRlIH19OiAge3tcbiAgICAgICAgICAgICAgJ0VuYWJsZWRgYXV0byByZWdpc3RyYXRpb25gJyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7ICdFbmFibGVkYGF1dG8gcmVnaXN0cmF0aW9uYCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICpuZ0lmPVwiIXRydXN0ZWRDZXJ0aWZpY2F0ZS5hdXRvUmVnaXN0cmF0aW9uRW5hYmxlZFwiXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdBdXRvIHJlZ2lzdHJhdGlvbicgfCB0cmFuc2xhdGUgfX06ICB7e1xuICAgICAgICAgICAgICAnRGlzYWJsZWRgYXV0byByZWdpc3RyYXRpb25gJyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7ICdEaXNhYmxlZGBhdXRvIHJlZ2lzdHJhdGlvbmAnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC0yIGQtZmxleFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1sYWJlbC1zbWFsbCBtLXQtOCBtLXItNCB2aXNpYmxlLXhzLWlubGluZVwiPlxuICAgICAgICAgICAge3sgJ1Byb29mIG9mIHBvc3Nlc3Npb24nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAqbmdJZj1cInRydXN0ZWRDZXJ0aWZpY2F0ZS5wcm9vZk9mUG9zc2Vzc2lvblZhbGlkXCJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ1Byb29mIG9mIHBvc3Nlc3Npb24nIHwgdHJhbnNsYXRlIH19OiAge3tcbiAgICAgICAgICAgICAgJ0NvbXBsZXRlYHByb29mIG9mIHBvc3Nlc3Npb25gJyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpY29uLWZsZXhcIj5cbiAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cInN1Y2Nlc3NcIiBjbGFzcz1cInRleHQtc3VjY2Vzc1wiPjwvaT5cbiAgICAgICAgICAgICAge3sgJ0NvbXBsZXRlYHByb29mIG9mIHBvc3Nlc3Npb25gJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAqbmdJZj1cIiF0cnVzdGVkQ2VydGlmaWNhdGUucHJvb2ZPZlBvc3Nlc3Npb25WYWxpZFwiXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdQcm9vZiBvZiBwb3NzZXNzaW9uJyB8IHRyYW5zbGF0ZSB9fTogIHt7XG4gICAgICAgICAgICAgICdJbmNvbXBsZXRlYHByb29mIG9mIHBvc3Nlc3Npb25gJyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpY29uLWZsZXhcIj5cbiAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cIndhcm5pbmdcIiBjbGFzcz1cInRleHQtd2FybmluZ1wiPjwvaT5cbiAgICAgICAgICAgICAge3sgJ0luY29tcGxldGVgcHJvb2Ygb2YgcG9zc2Vzc2lvbmAnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJtLWwtYXV0byBidG4tZG90IGJ0bi1kb3QtLWRhbmdlciBidG4gc2hvd09uSG92ZXIgbS1yLThcIlxuICAgICAgICAgIChjbGljayk9XCJkZWxldGVUcnVzdGVkQ2VydGlmaWNhdGUodHJ1c3RlZENlcnRpZmljYXRlKVwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgdG9vbHRpcD1cInt7ICdEZWxldGUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICBbZGVsYXldPVwiNTAwXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidEZWxldGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpIGM4eUljb249XCJkZWxldGVcIj48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9jOHktbGktYm9keT5cblxuICAgIDxjOHktbGktY29sbGFwc2U+XG4gICAgICA8ZGl2IGNsYXNzPVwicC10LTE2IHAtYi0xNlwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+XG4gICAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICB7eyAnQ2VydGlmaWNhdGUgbmFtZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLWVkaXRhYmxlXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInRydXN0ZWRDZXJ0aWZpY2F0ZS5uYW1lXCJcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWJ0blwiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdVcGRhdGUgY2VydGlmaWNhdGUgbmFtZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ2VydGlmaWNhdGUodHJ1c3RlZENlcnRpZmljYXRlLCB7IG5hbWU6IHRydXN0ZWRDZXJ0aWZpY2F0ZS5uYW1lIH0pXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiF0cnVzdGVkQ2VydGlmaWNhdGUubmFtZVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdTYXZlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTFcIj48L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTdcIj5cbiAgICAgICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNlcnRJblBlbUZvcm1hdFwiIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiIHRyYW5zbGF0ZT5DZXJ0aWZpY2F0ZTwvbGFiZWw+XG4gICAgICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIG5vLXJlc2l6ZVwiXG4gICAgICAgICAgICAgICAgaWQ9XCJjZXJ0SW5QZW1Gb3JtYXRcIlxuICAgICAgICAgICAgICAgIG5hbWU9XCJjZXJ0SW5QZW1Gb3JtYXRcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICByb3dzPVwiN1wiXG4gICAgICAgICAgICAgICAgcmVhZG9ubHlcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInRydXN0ZWRDZXJ0aWZpY2F0ZS5jZXJ0SW5QZW1Gb3JtYXRcIlxuICAgICAgICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICAgIDxsYWJlbCB0aXRsZT1cInt7ICdBdXRvIHJlZ2lzdHJhdGlvbicgfCB0cmFuc2xhdGUgfX1cIiBjbGFzcz1cImM4eS1jaGVja2JveFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidHJ1c3RlZENlcnRpZmljYXRlLmF1dG9SZWdpc3RyYXRpb25FbmFibGVkXCJcbiAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIlxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVDZXJ0aWZpY2F0ZSh0cnVzdGVkQ2VydGlmaWNhdGUsIHsgYXV0b1JlZ2lzdHJhdGlvbkVuYWJsZWQ6ICRldmVudCB9KVxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyAnQXV0byByZWdpc3RyYXRpb24nIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQgZm9ybS1ibG9ja1wiIHRyYW5zbGF0ZT5BZGRpdGlvbmFsIHByb3BlcnRpZXM8L2Rpdj5cbiAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtdW5zdHlsZWRcIj5cbiAgICAgICAgICAgICAgPGxpIGNsYXNzPVwicC10LTQgcC1iLTQgZC1mbGV4IHNlcGFyYXRvci1ib3R0b20gZmxleC13cmFwXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic21hbGwgbS1iLTAgbS1yLTggYS1zLXN0YXJ0IGZsZXgtZ3Jvd1wiPlxuICAgICAgICAgICAgICAgICAge3sgJ0FsZ29yaXRobScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibS1sLWF1dG8gdGV4dC1icmVhay13b3JkXCI+XG4gICAgICAgICAgICAgICAgICB7eyB0cnVzdGVkQ2VydGlmaWNhdGUuYWxnb3JpdGhtTmFtZSB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPGxpIGNsYXNzPVwicC10LTQgcC1iLTQgZC1mbGV4IHNlcGFyYXRvci1ib3R0b20gZmxleC13cmFwXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic21hbGwgbS1iLTAgbS1yLTggYS1zLXN0YXJ0IGZsZXgtZ3Jvd1wiPlxuICAgICAgICAgICAgICAgICAge3sgJ1ZlcnNpb24nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm0tbC1hdXRvIHRleHQtYnJlYWstd29yZFwiPlxuICAgICAgICAgICAgICAgICAge3sgdHJ1c3RlZENlcnRpZmljYXRlLnZlcnNpb24gfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIDxsaSBjbGFzcz1cInAtdC00IHAtYi00IGQtZmxleCBzZXBhcmF0b3ItYm90dG9tIGZsZXgtd3JhcFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInNtYWxsIG0tYi0wIG0tci04IGEtcy1zdGFydCBmbGV4LWdyb3dcIj5cbiAgICAgICAgICAgICAgICAgIHt7ICdWYWxpZCBmcm9tJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtLWwtYXV0byB0ZXh0LWJyZWFrLXdvcmRcIj5cbiAgICAgICAgICAgICAgICAgIHt7IHRydXN0ZWRDZXJ0aWZpY2F0ZS5ub3RCZWZvcmUgfCBjOHlEYXRlIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJwLXQtNCBwLWItNCBkLWZsZXggc2VwYXJhdG9yLWJvdHRvbSBmbGV4LXdyYXBcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzbWFsbCBtLWItMCBtLXItOCBhLXMtc3RhcnQgZmxleC1ncm93XCI+XG4gICAgICAgICAgICAgICAgICB7eyAnSXNzdWVyJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtLWwtYXV0byB0ZXh0LWJyZWFrLXdvcmRcIj5cbiAgICAgICAgICAgICAgICAgIHt7IHRydXN0ZWRDZXJ0aWZpY2F0ZS5pc3N1ZXIgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIDxsaSBjbGFzcz1cInAtdC00IHAtYi00IGQtZmxleCBzZXBhcmF0b3ItYm90dG9tIGZsZXgtd3JhcFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInNtYWxsIG0tYi0wIG0tci04IGEtcy1zdGFydCBmbGV4LWdyb3dcIj5cbiAgICAgICAgICAgICAgICAgIHt7ICdFeHBpcmF0aW9uIGRhdGUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm0tbC1hdXRvIHRleHQtYnJlYWstd29yZFwiPlxuICAgICAgICAgICAgICAgICAge3sgdHJ1c3RlZENlcnRpZmljYXRlLm5vdEFmdGVyIHwgYzh5RGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPGxpIGNsYXNzPVwicC10LTQgcC1iLTQgZC1mbGV4IHNlcGFyYXRvci1ib3R0b20gZmxleC13cmFwXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic21hbGwgbS1iLTAgbS1yLTggYS1zLXN0YXJ0IGZsZXgtZ3Jvd1wiPlxuICAgICAgICAgICAgICAgICAge3sgJ1NlcmlhbCBudW1iZXInIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm0tbC1hdXRvIHRleHQtYnJlYWstd29yZFwiPlxuICAgICAgICAgICAgICAgICAge3sgdHJ1c3RlZENlcnRpZmljYXRlLnNlcmlhbE51bWJlciB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPGxpIGNsYXNzPVwicC10LTQgcC1iLTQgZC1mbGV4IHNlcGFyYXRvci1ib3R0b20gZmxleC13cmFwXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic21hbGwgbS1iLTAgbS1yLTggYS1zLXN0YXJ0IGZsZXgtZ3Jvd1wiPlxuICAgICAgICAgICAgICAgICAge3sgJ1N1YmplY3Rgb2YgYSBjZXJ0aWZpY2F0ZWAnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm0tbC1hdXRvIHRleHQtYnJlYWstd29yZFwiPlxuICAgICAgICAgICAgICAgICAge3sgdHJ1c3RlZENlcnRpZmljYXRlLnN1YmplY3QgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMVwiPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtN1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZCBmb3JtLWJsb2NrXCI+XG4gICAgICAgICAgICAgIHt7ICdQcm9vZiBvZiBwb3NzZXNzaW9uJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4taGVscCBidG4taGVscC0tc21cIlxuICAgICAgICAgICAgICAgIHBvcG92ZXI9XCJ7eyBQUk9PRl9PRl9QT1NTRVNTSU9OX1BPUE9WRVIgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0hlbHAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICB0cmlnZ2Vycz1cImZvY3VzXCJcbiAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJyaWdodFwiXG4gICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInRydXN0ZWRDZXJ0aWZpY2F0ZS5wcm9vZk9mUG9zc2Vzc2lvblZhbGlkXCI+XG4gICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnUHJvb2Ygb2YgcG9zc2Vzc2lvbicgfCB0cmFuc2xhdGUgfX06ICB7e1xuICAgICAgICAgICAgICAgICAgJ0NvbXBsZXRlYHByb29mIG9mIHBvc3Nlc3Npb25gJyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIH19XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImljb24tZmxleFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwic3VjY2Vzc1wiIGNsYXNzPVwidGV4dC1zdWNjZXNzXCI+PC9pPlxuICAgICAgICAgICAgICAgIHt7ICdDb21wbGV0ZWBwcm9vZiBvZiBwb3NzZXNzaW9uYCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIXRydXN0ZWRDZXJ0aWZpY2F0ZS5wcm9vZk9mUG9zc2Vzc2lvblZhbGlkXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbS1iLTE2XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XG4gICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdQcm9vZiBvZiBwb3NzZXNzaW9uJyB8IHRyYW5zbGF0ZSB9fTogIHt7XG4gICAgICAgICAgICAgICAgICAgICAgJ0luY29tcGxldGVgcHJvb2Ygb2YgcG9zc2Vzc2lvbmAnIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgICAgIH19XCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpY29uLWZsZXhcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwid2FybmluZ1wiIGNsYXNzPVwidGV4dC13YXJuaW5nXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICB7eyAnSW5jb21wbGV0ZWBwcm9vZiBvZiBwb3NzZXNzaW9uYCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTYgY29sLWxnLTYgdGV4dC1yaWdodC1tZFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsIG0tci00XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdWZXJpZmljYXRpb24gY29kZSBleHBpcmVzL2V4cGlyZWQgb24nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAodHJ1c3RlZENlcnRpZmljYXRlLnByb29mT2ZQb3NzZXNzaW9uVmVyaWZpY2F0aW9uQ29kZVVzYWJsZVVudGlsIHwgYzh5RGF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAnLS0tJ1xuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTYgY29sLWxnLTZcIj5cbiAgICAgICAgICAgICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInVuc2lnbmVkVmVyaWZpY2F0aW9uQ29kZVwiIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiIHRyYW5zbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICBVbnNpZ25lZCB2ZXJpZmljYXRpb24gY29kZVxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBuby1yZXNpemVcIlxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJ1bnNpZ25lZFZlcmlmaWNhdGlvbkNvZGVcIlxuICAgICAgICAgICAgICAgICAgICAgIGlkPVwidW5zaWduZWRWZXJpZmljYXRpb25Db2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICByZWFkb25seVxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICByb3dzPVwiNVwiXG4gICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ0cnVzdGVkQ2VydGlmaWNhdGUucHJvb2ZPZlBvc3Nlc3Npb25VbnNpZ25lZFZlcmlmaWNhdGlvbkNvZGVcIlxuICAgICAgICAgICAgICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdSZWdlbmVyYXRlIHVuc2lnbmVkIHZlcmlmaWNhdGlvbiBjb2RlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLXNtXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVnZW5lcmF0ZVVuc2lnbmVkVmVyaWZpY2F0aW9uQ29kZSh0cnVzdGVkQ2VydGlmaWNhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIHt7ICdSZWdlbmVyYXRlYHVuc2lnbmVkIHZlcmlmaWNhdGlvbiBjb2RlYCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tZGVmYXVsdCBtLWwtYXV0byBtLXItMFwiXG4gICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcD1cInt7ICdDb3B5IHRvIGNsaXBib2FyZCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgIFtkZWxheV09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0NvcHkgdG8gY2xpcGJvYXJkJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiF0cnVzdGVkQ2VydGlmaWNhdGUucHJvb2ZPZlBvc3Nlc3Npb25VbnNpZ25lZFZlcmlmaWNhdGlvbkNvZGVcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb3B5VW5zaWduZWRWZXJpZmljYXRpb25Db2RlVG9DbGlwYm9hcmQodHJ1c3RlZENlcnRpZmljYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwiY2xpcGJvYXJkXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbVwiXG4gICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcD1cInt7ICdEb3dubG9hZCBhcyBmaWxlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2RlbGF5XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInRG93bmxvYWQgYXMgZmlsZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhdHJ1c3RlZENlcnRpZmljYXRlLnByb29mT2ZQb3NzZXNzaW9uVW5zaWduZWRWZXJpZmljYXRpb25Db2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZG93bmxvYWRVbnNpZ25lZFZlcmlmaWNhdGlvbkNvZGUodHJ1c3RlZENlcnRpZmljYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwiZG93bmxvYWRcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTYgY29sLWxnLTZcIj5cbiAgICAgICAgICAgICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNpZ25lZFZlcmlmaWNhdGlvbkNvZGVcIiBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyAnU2lnbmVkIHZlcmlmaWNhdGlvbiBjb2RlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4taGVscCBidG4taGVscC0tc21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgcG9wb3Zlcj1cInt7IFNJR05FRF9WRVJJRklDQVRJT05fQ09ERV9QT1BPVkVSIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0hlbHAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIG5vLXJlc2l6ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZT1cInNpZ25lZFZlcmlmaWNhdGlvbkNvZGVcIlxuICAgICAgICAgICAgICAgICAgICAgIGlkPVwic2lnbmVkVmVyaWZpY2F0aW9uQ29kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgIHJvd3M9XCI1XCJcbiAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNpZ25lZFZlcmlmaWNhdGlvbkNvZGVcIlxuICAgICAgICAgICAgICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdWZXJpZnkgc2lnbmVkIHZlcmlmaWNhdGlvbiBjb2RlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLXNtXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB2ZXJpZnlTaWduZWRWZXJpZmljYXRpb25Db2RlKHRydXN0ZWRDZXJ0aWZpY2F0ZSwgc2lnbmVkVmVyaWZpY2F0aW9uQ29kZSlcbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhc2lnbmVkVmVyaWZpY2F0aW9uQ29kZVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICB7eyAnVmVyaWZ5YHNpZ25lZCB2ZXJpZmljYXRpb24gY29kZWAnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1kZWZhdWx0IG0tbC1hdXRvXCJcbiAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwPVwie3sgJ1VwbG9hZCBmaWxlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2RlbGF5XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInVXBsb2FkIGZpbGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZmlsZUlucHV0LmNsaWNrKClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cInVwbG9hZFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCAjZmlsZUlucHV0IHR5cGU9XCJmaWxlXCIgKGNoYW5nZSk9XCJvbkZpbGVJbnB1dCgkZXZlbnQpXCIgY2xhc3M9XCJoaWRkZW5cIiAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9jOHktbGktY29sbGFwc2U+XG4gIDwvYzh5LWxpPlxuPC9jOHktbGlzdC1ncm91cD5cbiJdfQ==
152
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ1c3RlZC1jZXJ0aWZpY2F0ZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHJ1c3RlZC1jZXJ0aWZpY2F0ZXMvdHJ1c3RlZC1jZXJ0aWZpY2F0ZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vdHJ1c3RlZC1jZXJ0aWZpY2F0ZXMvdHJ1c3RlZC1jZXJ0aWZpY2F0ZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEcsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDckYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBdUIseUJBQXlCLEVBQWUsTUFBTSxhQUFhLENBQUM7QUFDMUYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUN6RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7Ozs7Ozs7Ozs7O0FBTW5DLE1BQU0sT0FBTyw0QkFBNEI7SUF1QnZDLFlBQ1UsT0FBdUIsRUFDdkIsWUFBMEIsRUFDMUIseUJBQW9ELEVBQ3BELFlBQTBCLEVBQzFCLGdCQUFrQyxFQUNsQyxnQkFBa0M7UUFMbEMsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFDdkIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFD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cG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFsZXJ0U2VydmljZSwgQ2xpcGJvYXJkU2VydmljZSwgZ2V0dGV4dCwgTW9kYWxTZXJ2aWNlLCBTdGF0dXMgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IEFkZFRydXN0ZWRDZXJ0aWZpY2F0ZUNvbXBvbmVudCB9IGZyb20gJy4vYWRkLXRydXN0ZWQtY2VydGlmaWNhdGUuY29tcG9uZW50JztcbmltcG9ydCB7IEJzTW9kYWxTZXJ2aWNlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XG5pbXBvcnQgeyBJVHJ1c3RlZENlcnRpZmljYXRlLCBUcnVzdGVkQ2VydGlmaWNhdGVTZXJ2aWNlLCBJUmVzdWx0TGlzdCB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IHRhcCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgcGlwZSwgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBzYXZlQXMgfSBmcm9tICdmaWxlLXNhdmVyJztcbmltcG9ydCB7IGFzc2lnbiB9IGZyb20gJ2xvZGFzaC1lcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS10cnVzdGVkLWNlcnRpZmljYXRlcycsXG4gIHRlbXBsYXRlVXJsOiAnLi90cnVzdGVkLWNlcnRpZmljYXRlcy5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgVHJ1c3RlZENlcnRpZmljYXRlc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIFBST09GX09GX1BPU1NFU1NJT05fUE9QT1ZFUiA9IGdldHRleHQoXG4gICAgJ1wiUHJvb2Ygb2YgcG9zc2Vzc2lvblwiIGlzIGEgc2VjdXJpdHkgbWV0aG9kIHVzZWQgdG8gcHJvdmUgdGhhdCB3aG9ldmVyIHNlbmRzIGEgbWVzc2FnZSBpcyBhbHNvIGluIHRoZSBwb3NzZXNzaW9uIG9mIHRoZSBwYXJ0aWN1bGFyIGNyeXB0b2dyYXBoaWMga2V5LidcbiAgKTtcbiAgU0lHTkVEX1ZFUklGSUNBVElPTl9DT0RFX1BPUE9WRVIgPSBnZXR0ZXh0KFxuICAgICdVc2UgdGhlIGZvbGxvd2luZyBvcGVuc3NsIGNvbW1hbmQgdG8gY3JlYXRlIHRoZSBzaWduZWQgdmVyaWZpY2F0aW9uIGNvZGU6IG9wZW5zc2wgZGdzdCAtc2hhMjU2IC1zaWduIDxwcml2YXRlLmtleT4gPHZlcmlmaWNhdGlvbl9jb2RlLnR4dD4nXG4gICk7XG5cbiAgcmVsb2FkaW5nOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgcmVsb2FkOiBCZWhhdmlvclN1YmplY3Q8dm9pZD4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KG51bGwpO1xuICB0cnVzdGVkQ2VydGlmaWNhdGVzOiBPYnNlcnZhYmxlPElSZXN1bHRMaXN0PElUcnVzdGVkQ2VydGlmaWNhdGU+PiA9IHRoaXMucmVsb2FkLnBpcGUoXG4gICAgdGFwKCgpID0+IHRoaXMucmVsb2FkaW5nLm5leHQodHJ1ZSkpLFxuICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmdldFRydXN0ZWRDZXJ0aWZpY2F0ZXMoKSksXG4gICAgdGFwKCgpID0+IHRoaXMucmVsb2FkaW5nLm5leHQoZmFsc2UpKVxuICApO1xuICBzb3J0QnlFeHBpcmF0aW9uRGF0ZUFzYyA9IHBpcGUoXG4gICAgdGFwKChyZXN1bHRzOiBJVHJ1c3RlZENlcnRpZmljYXRlW10pID0+IHtcbiAgICAgIHJldHVybiByZXN1bHRzLnNvcnQoKG4xLCBuMikgPT4gbjEubm90QWZ0ZXIubG9jYWxlQ29tcGFyZShuMi5ub3RBZnRlcikpO1xuICAgIH0pXG4gICk7XG5cbiAgc2lnbmVkVmVyaWZpY2F0aW9uQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYnNNb2RhbDogQnNNb2RhbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcbiAgICBwcml2YXRlIHRydXN0ZWRDZXJ0aWZpY2F0ZVNlcnZpY2U6IFRydXN0ZWRDZXJ0aWZpY2F0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE1vZGFsU2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjbGlwYm9hcmRTZXJ2aWNlOiBDbGlwYm9hcmRTZXJ2aWNlXG4gICkge31cblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICBhd2FpdCB0aGlzLmxvYWRUcnVzdGVkQ2VydGlmaWNhdGVzKCk7XG4gIH1cblxuICBhc3luYyBsb2FkVHJ1c3RlZENlcnRpZmljYXRlcygpIHtcbiAgICB0aGlzLnJlbG9hZC5uZXh0KCk7XG4gIH1cblxuICBnZXRUcnVzdGVkQ2VydGlmaWNhdGVzKCkge1xuICAgIGNvbnN0IGZpbHRlcjogb2JqZWN0ID0ge1xuICAgICAgcGFnZVNpemU6IDEwMDAsXG4gICAgICB3aXRoVG90YWxQYWdlczogdHJ1ZVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMudHJ1c3RlZENlcnRpZmljYXRlU2VydmljZS5saXN0KGZpbHRlcik7XG4gIH1cblxuICBhc3luYyBhZGRUcnVzdGVkQ2VydGlmaWNhdGUoKSB7XG4gICAgY29uc3QgbW9kYWwgPSB0aGlzLmJzTW9kYWwuc2hvdyhBZGRUcnVzdGVkQ2VydGlmaWNhdGVDb21wb25lbnQsIHtcbiAgICAgIGNsYXNzOiAnbW9kYWwtc20nLFxuICAgICAgYXJpYURlc2NyaWJlZGJ5OiAnYWRkQ2VydGlmaWNhdGVNb2RhbERlc2NyaXB0aW9uJyxcbiAgICAgIGFyaWFMYWJlbGxlZEJ5OiAnYWRkQ2VydGlmaWNhdGVNb2RhbFRpdGxlJyxcbiAgICAgIGlnbm9yZUJhY2tkcm9wQ2xpY2s6IHRydWVcbiAgICB9KS5jb250ZW50IGFzIEFkZFRydXN0ZWRDZXJ0aWZpY2F0ZUNvbXBvbmVudDtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbW9kYWwucmVzdWx0O1xuICAgICAgbW9kYWwuY2xvc2UoKTtcbiAgICAgIHRoaXMucmVsb2FkLm5leHQoKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVRydXN0ZWRDZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZSkge1xuICAgIGNvbnN0IHRpdGxlID0gZ2V0dGV4dCgnRGVsZXRlIHRydXN0ZWQgY2VydGlmaWNhdGUnKTtcbiAgICBjb25zdCBjb25maXJtYXRpb25UZXh0ID0gZ2V0dGV4dChcbiAgICAgICdZb3UgYXJlIGFib3V0IHRvIGRlbGV0ZSBhIHRydXN0ZWQgY2VydGlmaWNhdGUgXCJ7eyBjZXJ0aWZpY2F0ZU5hbWUgfX1cIi4nXG4gICAgKTtcbiAgICBjb25zdCBmaW5hbFF1ZXN0aW9uID0gZ2V0dGV4dCgnRG8geW91IHdhbnQgdG8gcHJvY2VlZD8nKTtcbiAgICBjb25zdCBjZXJ0aWZpY2F0ZU5hbWUgPSBjZXJ0aWZpY2F0ZS5uYW1lO1xuICAgIGNvbnN0IGJvZHkgPSBbXG4gICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChjb25maXJtYXRpb25UZXh0LCB7XG4gICAgICAgIGNlcnRpZmljYXRlTmFtZVxuICAgICAgfSksXG4gICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChmaW5hbFF1ZXN0aW9uKVxuICAgIF0uam9pbignICcpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMubW9kYWxTZXJ2aWNlLmNvbmZpcm0odGl0bGUsIGJvZHksIFN0YXR1cy5EQU5HRVIsIHsgb2s6IGdldHRleHQoJ0RlbGV0ZScpIH0pO1xuICAgICAgYXdhaXQgdGhpcy50cnVzdGVkQ2VydGlmaWNhdGVTZXJ2aWNlLmRlbGV0ZShjZXJ0aWZpY2F0ZS5maW5nZXJwcmludCk7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5zdWNjZXNzKGdldHRleHQoJ0NlcnRpZmljYXRlIGRlbGV0ZWQuJykpO1xuICAgICAgdGhpcy5yZWxvYWQubmV4dCgpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGV4KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyB1cGRhdGVDZXJ0aWZpY2F0ZShcbiAgICB0cnVzdGVkQ2VydGlmaWNhdGU6IElUcnVzdGVkQ2VydGlmaWNhdGUsXG4gICAgdXBkYXRpbmdQYXJ0OiBQYXJ0aWFsPElUcnVzdGVkQ2VydGlmaWNhdGU+XG4gICkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnRydXN0ZWRDZXJ0aWZpY2F0ZVNlcnZpY2UudXBkYXRlKHtcbiAgICAgICAgZmluZ2VycHJpbnQ6IHRydXN0ZWRDZXJ0aWZpY2F0ZS5maW5nZXJwcmludCxcbiAgICAgICAgLi4udXBkYXRpbmdQYXJ0XG4gICAgICB9KTtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnN1Y2Nlc3MoZ2V0dGV4dCgnQ2VydGlmaWNhdGUgc2F2ZWQuJykpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGV4KTtcbiAgICB9XG4gIH1cblxuICBoaWdobGlnaHREZXBlbmRpbmdPbkV4cGlyYXRpb25TdGF0dXMoaXRlbTogSVRydXN0ZWRDZXJ0aWZpY2F0ZSkge1xuICAgIGNvbnN0IHdhcm5pbmdPZmZzZXQgPSAyNCAqIDYwICogNjAgKiAxMDAwICogOTA7IC8vIDkwIGRheXNcbiAgICBjb25zdCB0b2RheVRpbWVzdGFtcCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIGNvbnN0IHdhcm5pbmdUaW1lc3RhbXAgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSArIHdhcm5pbmdPZmZzZXQ7XG4gICAgY29uc3Qgbm90QWZ0ZXJUaW1lc3RhbXAgPSBuZXcgRGF0ZShpdGVtLm5vdEFmdGVyKS5nZXRUaW1lKCk7XG4gICAgY29uc3QgZXhwaXJlZCA9IG5vdEFmdGVyVGltZXN0YW1wIDwgdG9kYXlUaW1lc3RhbXA7XG4gICAgY29uc3QgZXhwaXJlc0luTGVzc1RoYW45MERheXMgPSBub3RBZnRlclRpbWVzdGFtcCA8IHdhcm5pbmdUaW1lc3RhbXA7XG4gICAgaWYgKGV4cGlyZWQpIHtcbiAgICAgIHJldHVybiAndGV4dC1kYW5nZXInO1xuICAgIH1cbiAgICBpZiAoZXhwaXJlc0luTGVzc1RoYW45MERheXMpIHtcbiAgICAgIHJldHVybiAndGV4dC13YXJuaW5nJztcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcmVnZW5lcmF0ZVVuc2lnbmVkVmVyaWZpY2F0aW9uQ29kZSh0cnVzdGVkQ2VydGlmaWNhdGU6IElUcnVzdGVkQ2VydGlmaWNhdGUpIHtcbiAgICB0aGlzLnRydXN0ZWRDZXJ0aWZpY2F0ZVNlcnZpY2UucmVnZW5lcmF0ZVBvUFZlcmlmaWNhdGlvbkNvZGUodHJ1c3RlZENlcnRpZmljYXRlKS50aGVuKFxuICAgICAgKHsgZGF0YSB9KSA9PiB7XG4gICAgICAgIGFzc2lnbih0cnVzdGVkQ2VydGlmaWNhdGUsIGRhdGEpO1xuICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5zdWNjZXNzKGdldHRleHQoJ1ZlcmlmaWNhdGlvbiBjb2RlIHJlZ2VuZXJhdGVkLicpKTtcbiAgICAgIH0sXG4gICAgICBleCA9PiB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGV4KVxuICAgICk7XG4gIH1cblxuICB2ZXJpZnlTaWduZWRWZXJpZmljYXRpb25Db2RlKFxuICAgIHRydXN0ZWRDZXJ0aWZpY2F0ZTogSVRydXN0ZWRDZXJ0aWZpY2F0ZSxcbiAgICBzaWduZWRWZXJpZmljYXRpb25Db2RlOiBzdHJpbmdcbiAgKSB7XG4gICAgdGhpcy50cnVzdGVkQ2VydGlmaWNhdGVTZXJ2aWNlXG4gICAgICAudmVyaWZ5U2lnbmVkVmVyaWZpY2F0aW9uQ29kZSh0cnVzdGVkQ2VydGlmaWNhdGUsIHNpZ25lZFZlcmlmaWNhdGlvbkNvZGUpXG4gICAgICAudGhlbihcbiAgICAgICAgKHsgZGF0YSB9KSA9PiB7XG4gICAgICAgICAgYXNzaWduKHRydXN0ZWRDZXJ0aWZpY2F0ZSwgZGF0YSk7XG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2Uuc3VjY2VzcyhnZXR0ZXh0KCdTaWduZWQgdmVyaWZpY2F0aW9uIGNvZGUgdmVyaWZpZWQuJykpO1xuICAgICAgICB9LFxuICAgICAgICBleCA9PiB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGV4KVxuICAgICAgKTtcbiAgfVxuXG4gIGRvd25sb2FkVW5zaWduZWRWZXJpZmljYXRpb25Db2RlKHRydXN0ZWRDZXJ0aWZpY2F0ZTogSVRydXN0ZWRDZXJ0aWZpY2F0ZSkge1xuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbdHJ1c3RlZENlcnRpZmljYXRlLnByb29mT2ZQb3NzZXNzaW9uVW5zaWduZWRWZXJpZmljYXRpb25Db2RlXSk7XG4gICAgY29uc3QgZmlsZU5hbWUgPSB0cnVzdGVkQ2VydGlmaWNhdGUubmFtZTtcbiAgICBzYXZlQXMoYmxvYiwgYCR7ZmlsZU5hbWV9LnR4dGApO1xuICB9XG5cbiAgY29weVVuc2lnbmVkVmVyaWZpY2F0aW9uQ29kZVRvQ2xpcGJvYXJkKHRydXN0ZWRDZXJ0aWZpY2F0ZTogSVRydXN0ZWRDZXJ0aWZpY2F0ZSkge1xuICAgIHRoaXMuY2xpcGJvYXJkU2VydmljZS53cml0ZVRleHQodHJ1c3RlZENlcnRpZmljYXRlLnByb29mT2ZQb3NzZXNzaW9uVW5zaWduZWRWZXJpZmljYXRpb25Db2RlKTtcbiAgfVxuXG4gIG9uRmlsZUlucHV0KGV2ZW50KSB7XG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQ7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xuICAgICAgdGhpcy5zaWduZWRWZXJpZmljYXRpb25Db2RlID0gcmVhZGVyLnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgfTtcbiAgICByZWFkZXIucmVhZEFzVGV4dChpbnB1dC5maWxlc1swXSk7XG4gIH1cbn1cbiIsIjxjOHktdGl0bGU+e3sgJ1RydXN0ZWQgY2VydGlmaWNhdGVzJyB8IHRyYW5zbGF0ZSB9fTwvYzh5LXRpdGxlPlxuXG48Yzh5LWJyZWFkY3J1bWI+XG4gIDxjOHktYnJlYWRjcnVtYi1pdGVtXG4gICAgbGFiZWw9XCJ7eyAnTWFuYWdlbWVudCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgIGljb249XCJjOHktbWFuYWdlbWVudFwiXG4gID48L2M4eS1icmVhZGNydW1iLWl0ZW0+XG4gIDxjOHktYnJlYWRjcnVtYi1pdGVtXG4gICAgbGFiZWw9XCJ7eyAnVHJ1c3RlZCBjZXJ0aWZpY2F0ZXMnIHwgdHJhbnNsYXRlIH19XCJcbiAgICBpY29uPVwiY2VydGlmaWNhdGVcIlxuICA+PC9jOHktYnJlYWRjcnVtYi1pdGVtPlxuPC9jOHktYnJlYWRjcnVtYj5cblxuPGM4eS1hY3Rpb24tYmFyLWl0ZW0gW3BsYWNlbWVudF09XCIncmlnaHQnXCI+XG4gIDxidXR0b25cbiAgICB0aXRsZT1cInt7ICdBZGQgdHJ1c3RlZCBjZXJ0aWZpY2F0ZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgIGNsYXNzPVwiYnRuIGJ0bi1saW5rXCJcbiAgICAoY2xpY2spPVwiYWRkVHJ1c3RlZENlcnRpZmljYXRlKClcIlxuICA+XG4gICAgPGkgYzh5SWNvbj1cInBsdXMtY2lyY2xlXCI+PC9pPlxuICAgIHt7ICdBZGQgdHJ1c3RlZCBjZXJ0aWZpY2F0ZScgfCB0cmFuc2xhdGUgfX1cbiAgPC9idXR0b24+XG48L2M4eS1hY3Rpb24tYmFyLWl0ZW0+XG5cbjxjOHktYWN0aW9uLWJhci1pdGVtIFtwbGFjZW1lbnRdPVwiJ3JpZ2h0J1wiPlxuICA8YnV0dG9uXG4gICAgdGl0bGU9XCJ7eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgY2xhc3M9XCJidG4gYnRuLWxpbmtcIlxuICAgIChjbGljayk9XCJsb2FkVHJ1c3RlZENlcnRpZmljYXRlcygpXCJcbiAgPlxuICAgIDxpIGM4eUljb249XCJyZWZyZXNoXCIgW25nQ2xhc3NdPVwieyAnaWNvbi1zcGluJzogcmVsb2FkaW5nIHwgYXN5bmMgfVwiPjwvaT5cbiAgICB7eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fVxuICA8L2J1dHRvbj5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuPGM4eS1oZWxwIHNyYz1cIi91c2Vycy1ndWlkZS9kZXZpY2UtbWFuYWdlbWVudC8jdHJ1c3RlZC1jZXJ0aWZpY2F0ZXNcIj48L2M4eS1oZWxwPlxuXG48Yzh5LXVpLWVtcHR5LXN0YXRlXG4gICpuZ0lmPVwiKHRydXN0ZWRDZXJ0aWZpY2F0ZXMgfCBhc3luYyk/LmRhdGEubGVuZ3RoID09PSAwXCJcbiAgW2ljb25dPVwiJ2NlcnRpZmljYXRlJ1wiXG4gIFt0aXRsZV09XCInTm8gdHJ1c3RlZCBjZXJ0aWZpY2F0ZXMgdG8gZGlzcGxheS4nIHwgdHJhbnNsYXRlXCJcbiAgW3N1YnRpdGxlXT1cIidBZGQgeW91ciBmaXJzdCBjZXJ0aWZpY2F0ZSBieSBjbGlja2luZyBiZWxvdy4nIHwgdHJhbnNsYXRlXCJcbj5cbiAgPGJ1dHRvblxuICAgIHRpdGxlPVwie3sgJ0FkZCB0cnVzdGVkIGNlcnRpZmljYXRlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgKGNsaWNrKT1cImFkZFRydXN0ZWRDZXJ0aWZpY2F0ZSgpXCJcbiAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiXG4gID5cbiAgICB7eyAnQWRkIHRydXN0ZWQgY2VydGlmaWNhdGUnIHwgdHJhbnNsYXRlIH19XG4gIDwvYnV0dG9uPlxuPC9jOHktdWktZW1wdHktc3RhdGU+XG5cbjxjOHktbGlzdC1ncm91cCBjbGFzcz1cIm0tYi0yNFwiPlxuICA8ZGl2XG4gICAgKm5nSWY9XCIodHJ1c3RlZENlcnRpZmljYXRlcyB8IGFzeW5jKT8uZGF0YS5sZW5ndGggPiAwXCJcbiAgICBjbGFzcz1cInBhZ2Utc3RpY2t5LWhlYWRlciBoaWRkZW4teHMgYzh5LWxpc3RfX2l0ZW0gYzh5LWxpc3RfX2l0ZW0tLWVtcHR5LWFjdGlvbnNcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cImM4eS1saXN0X19pdGVtX19ibG9ja1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImM4eS1saXN0X19pdGVtX19pY29uXCI+XG4gICAgICAgIDxpIGM4eUljb249XCJjZXJ0aWZpY2F0ZVwiIGNsYXNzPVwiaW52aXNpYmxlXCI+PC9pPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiYzh5LWxpc3RfX2l0ZW1fX2JvZHlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtZmxleC02MFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCIgdGl0bGU9XCIge3sgJ0NlcnRpZmljYXRlJyB8IHRyYW5zbGF0ZSB9fSBcIj5cbiAgICAgICAgICAgICAge3sgJ0NlcnRpZmljYXRlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCIgdGl0bGU9XCJ7eyAnU3RhdHVzJyB8IHRyYW5zbGF0ZSB9fVwiPlxuICAgICAgICAgICAgICB7eyAnU3RhdHVzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCIgdGl0bGU9XCJ7eyAnQWxnb3JpdGhtJyB8IHRyYW5zbGF0ZSB9fVwiPlxuICAgICAgICAgICAgICB7eyAnQWxnb3JpdGhtJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCIgdGl0bGU9XCJ7eyAnRXhwaXJhdGlvbiBkYXRlJyB8IHRyYW5zbGF0ZSB9fVwiPlxuICAgICAgICAgICAgICB7eyAnRXhwaXJhdGlvbiBkYXRlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCIgdGl0bGU9XCIge3sgJ0F1dG8gcmVnaXN0cmF0aW9uJyB8IHRyYW5zbGF0ZSB9fVwiPlxuICAgICAgICAgICAgICB7eyAnQXV0byByZWdpc3RyYXRpb24nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIiB0aXRsZT1cIiB7eyAnUHJvb2Ygb2YgcG9zc2Vzc2lvbicgfCB0cmFuc2xhdGUgfX1cIj5cbiAgICAgICAgICAgICAge3sgJ1Byb29mIG9mIHBvc3Nlc3Npb24nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiYzh5LWxpc3RfX2l0ZW1fX2FjdGlvbnNcIj48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGM4eS1saVxuICAgICpjOHlGb3I9XCJcbiAgICAgIGxldCB0cnVzdGVkQ2VydGlmaWNhdGUgb2YgdHJ1c3RlZENlcnRpZmljYXRlcyB8IGFzeW5jO1xuICAgICAgbGV0IGkgPSBpbmRleDtcbiAgICAgIHBpcGU6IHNvcnRCeUV4cGlyYXRpb25EYXRlQXNjO1xuICAgICAgbG9hZE1vcmU6ICdub25lJ1xuICAgIFwiXG4gICAgI2xpc3RJdGVtXG4gID5cbiAgICA8Yzh5LWxpLWljb24+XG4gICAgICA8aSBjOHlJY29uPVwiY2VydGlmaWNhdGVcIj48L2k+XG4gICAgPC9jOHktbGktaWNvbj5cblxuICAgIDxjOHktbGktYm9keSBjbGFzcz1cImNvbnRlbnQtZmxleC02MFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC0yXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzcz1cImJ0bi1jbGVhbiB0ZXh0LXRydW5jYXRlXCJcbiAgICAgICAgICB0aXRsZT1cInt7IHRydXN0ZWRDZXJ0aWZpY2F0ZS5uYW1lIH19XCJcbiAgICAgICAgICAoY2xpY2spPVwibGlzdEl0ZW0udG9nZ2xlQ29sbGFwc2VkKClcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgdHJ1c3RlZENlcnRpZmljYXRlLm5hbWUgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidmlzaWJsZS14cyBwLThcIj48L2Rpdj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiYnRuIGM4eS1idG4tY2hlY2tib3gtLWlubGluZVwiXG4gICAgICAgICAgbmFtZT1cImNlcnRpZmljYXRlU3RhdHVzXCJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cInRydXN0ZWRDZXJ0aWZpY2F0ZS5zdGF0dXNcIlxuICAgICAgICAgIGJ0bkNoZWNrYm94XG4gICAgICAgICAgYnRuQ2hlY2tib3hUcnVlPVwiRU5BQkxFRFwiXG4gICAgICAgICAgYnRuQ2hlY2tib3hGYWxzZT1cIkRJU0FCTEVEXCJcbiAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVDZXJ0aWZpY2F0ZSh0cnVzdGVkQ2VydGlmaWNhdGUsIHsgc3RhdHVzOiAkZXZlbnQgfSlcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNtYWxsXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdEaXNhYmxlZGB0cnVzdGVkIGNlcnRpZmljYXRlIHN0YXR1c2AnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIFtoaWRkZW5dPVwidHJ1c3RlZENlcnRpZmljYXRlLnN0YXR1cyAhPT0gJ0RJU0FCTEVEJ1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgJ0Rpc2FibGVkYHRydXN0ZWQgY2VydGlmaWNhdGUgc3RhdHVzYCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgIDxzbWFsbFxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnRW5hYmxlZGB0cnVzdGVkIGNlcnRpZmljYXRlIHN0YXR1c2AnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIFtoaWRkZW5dPVwidHJ1c3RlZENlcnRpZmljYXRlLnN0YXR1cyAhPT0gJ0VOQUJMRUQnXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyAnRW5hYmxlZGB0cnVzdGVkIGNlcnRpZmljYXRlIHN0YXR1c2AnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2aXNpYmxlLXhzIHAtOFwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTJcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiXG4gICAgICAgICAgdGl0bGU9XCJ7eyAnQWxnb3JpdGhtJyB8IHRyYW5zbGF0ZSB9fToge3sgdHJ1c3RlZENlcnRpZmljYXRlLmFsZ29yaXRobU5hbWUgfX1cIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsIG0tdC04IG0tci04IHZpc2libGUteHMtaW5saW5lXCIgdHJhbnNsYXRlPkFsZ29yaXRobTwvc3Bhbj5cbiAgICAgICAgICB7eyB0cnVzdGVkQ2VydGlmaWNhdGUuYWxnb3JpdGhtTmFtZSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTJcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiXG4gICAgICAgICAgdGl0bGU9XCJ7eyAnRXhwaXJhdGlvbiBkYXRlJyB8IHRyYW5zbGF0ZSB9fToge3sgdHJ1c3RlZENlcnRpZmljYXRlLm5vdEFmdGVyIHwgYzh5RGF0ZSB9fVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbGFiZWwtc21hbGwgbS10LTggbS1yLTggdmlzaWJsZS14cy1pbmxpbmVcIiB0cmFuc2xhdGU+XG4gICAgICAgICAgICBFeHBpcmF0aW9uIGRhdGVcbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNtYWxsIFtuZ0NsYXNzXT1cImhpZ2hsaWdodERlcGVuZGluZ09uRXhwaXJhdGlvblN0YXR1cyh0cnVzdGVkQ2VydGlmaWNhdGUpXCI+XG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICBjOHlJY29uPVwiY2FsZW5kYXJcIlxuICAgICAgICAgICAgICBjbGFzcz1cIm0tci00XCJcbiAgICAgICAgICAgICAgKm5nSWY9XCIhaGlnaGxpZ2h0RGVwZW5kaW5nT25FeHBpcmF0aW9uU3RhdHVzKHRydXN0ZWRDZXJ0aWZpY2F0ZSlcIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgIGM4eUljb249XCJ3YXJuaW5nXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJtLXItNFwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiaGlnaGxpZ2h0RGVwZW5kaW5nT25FeHBpcmF0aW9uU3RhdHVzKHRydXN0ZWRDZXJ0aWZpY2F0ZSlcIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgIDxzcGFuPnt7IHRydXN0ZWRDZXJ0aWZpY2F0ZS5ub3RBZnRlciB8IGM4eURhdGUgfX08L3NwYW4+XG4gICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1sYWJlbC1zbWFsbCBtLXQtOCBtLXItNCB2aXNpYmxlLXhzLWlubGluZVwiPlxuICAgICAgICAgICAge3sgJ0F1dG8gcmVnaXN0cmF0aW9uJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgKm5nSWY9XCJ0cnVzdGVkQ2VydGlmaWNhdGUuYXV0b1JlZ2lzdHJhdGlvbkVuYWJsZWRcIlxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnQXV0byByZWdpc3RyYXRpb24nIHwgdHJhbnNsYXRlIH19OiAge3tcbiAgICAgICAgICAgICAgJ0VuYWJsZWRgYXV0byByZWdpc3RyYXRpb25gJyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7ICdFbmFibGVkYGF1dG8gcmVnaXN0cmF0aW9uYCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICpuZ0lmPVwiIXRydXN0ZWRDZXJ0aWZpY2F0ZS5hdXRvUmVnaXN0cmF0aW9uRW5hYmxlZFwiXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdBdXRvIHJlZ2lzdHJhdGlvbicgfCB0cmFuc2xhdGUgfX06ICB7e1xuICAgICAgICAgICAgICAnRGlzYWJsZWRgYXV0byByZWdpc3RyYXRpb25gJyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7ICdEaXNhYmxlZGBhdXRvIHJlZ2lzdHJhdGlvbmAnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC0yIGQtZmxleFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1sYWJlbC1zbWFsbCBtLXQtOCBtLXItNCB2aXNpYmxlLXhzLWlubGluZVwiPlxuICAgICAgICAgICAge3sgJ1Byb29mIG9mIHBvc3Nlc3Npb24nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAqbmdJZj1cInRydXN0ZWRDZXJ0aWZpY2F0ZS5wcm9vZk9mUG9zc2Vzc2lvblZhbGlkXCJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ1Byb29mIG9mIHBvc3Nlc3Npb24nIHwgdHJhbnNsYXRlIH19OiAge3tcbiAgICAgICAgICAgICAgJ0NvbXBsZXRlYHByb29mIG9mIHBvc3Nlc3Npb25gJyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpY29uLWZsZXhcIj5cbiAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cInN1Y2Nlc3NcIiBjbGFzcz1cInRleHQtc3VjY2Vzc1wiPjwvaT5cbiAgICAgICAgICAgICAge3sgJ0NvbXBsZXRlYHByb29mIG9mIHBvc3Nlc3Npb25gJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAqbmdJZj1cIiF0cnVzdGVkQ2VydGlmaWNhdGUucHJvb2ZPZlBvc3Nlc3Npb25WYWxpZFwiXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdQcm9vZiBvZiBwb3NzZXNzaW9uJyB8IHRyYW5zbGF0ZSB9fTogIHt7XG4gICAgICAgICAgICAgICdJbmNvbXBsZXRlYHByb29mIG9mIHBvc3Nlc3Npb25gJyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpY29uLWZsZXhcIj5cbiAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cIndhcm5pbmdcIiBjbGFzcz1cInRleHQtd2FybmluZ1wiPjwvaT5cbiAgICAgICAgICAgICAge3sgJ0luY29tcGxldGVgcHJvb2Ygb2YgcG9zc2Vzc2lvbmAnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJtLWwtYXV0byBidG4tZG90IGJ0bi1kb3QtLWRhbmdlciBidG4gc2hvd09uSG92ZXIgbS1yLThcIlxuICAgICAgICAgIChjbGljayk9XCJkZWxldGVUcnVzdGVkQ2VydGlmaWNhdGUodHJ1c3RlZENlcnRpZmljYXRlKVwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgdG9vbHRpcD1cInt7ICdEZWxldGUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICBbZGVsYXldPVwiNTAwXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidEZWxldGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpIGM4eUljb249XCJkZWxldGVcIj48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9jOHktbGktYm9keT5cblxuICAgIDxjOHktbGktY29sbGFwc2U+XG4gICAgICA8ZGl2IGNsYXNzPVwicC10LTE2IHAtYi0xNlwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+XG4gICAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICB7eyAnQ2VydGlmaWNhdGUgbmFtZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLWVkaXRhYmxlXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInRydXN0ZWRDZXJ0aWZpY2F0ZS5uYW1lXCJcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWJ0blwiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdVcGRhdGUgY2VydGlmaWNhdGUgbmFtZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ2VydGlmaWNhdGUodHJ1c3RlZENlcnRpZmljYXRlLCB7IG5hbWU6IHRydXN0ZWRDZXJ0aWZpY2F0ZS5uYW1lIH0pXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiF0cnVzdGVkQ2VydGlmaWNhdGUubmFtZVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdTYXZlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTFcIj48L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTdcIj5cbiAgICAgICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNlcnRJblBlbUZvcm1hdFwiIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiIHRyYW5zbGF0ZT5DZXJ0aWZpY2F0ZTwvbGFiZWw+XG4gICAgICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIG5vLXJlc2l6ZVwiXG4gICAgICAgICAgICAgICAgaWQ9XCJjZXJ0SW5QZW1Gb3JtYXRcIlxuICAgICAgICAgICAgICAgIG5hbWU9XCJjZXJ0SW5QZW1Gb3JtYXRcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICByb3dzPVwiN1wiXG4gICAgICAgICAgICAgICAgcmVhZG9ubHlcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInRydXN0ZWRDZXJ0aWZpY2F0ZS5jZXJ0SW5QZW1Gb3JtYXRcIlxuICAgICAgICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICAgIDxsYWJlbCB0aXRsZT1cInt7ICdBdXRvIHJlZ2lzdHJhdGlvbicgfCB0cmFuc2xhdGUgfX1cIiBjbGFzcz1cImM4eS1jaGVja2JveFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidHJ1c3RlZENlcnRpZmljYXRlLmF1dG9SZWdpc3RyYXRpb25FbmFibGVkXCJcbiAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIlxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVDZXJ0aWZpY2F0ZSh0cnVzdGVkQ2VydGlmaWNhdGUsIHsgYXV0b1JlZ2lzdHJhdGlvbkVuYWJsZWQ6ICRldmVudCB9KVxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyAnQXV0byByZWdpc3RyYXRpb24nIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQgZm9ybS1ibG9ja1wiIHRyYW5zbGF0ZT5BZGRpdGlvbmFsIHByb3BlcnRpZXM8L2Rpdj5cbiAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtdW5zdHlsZWRcIj5cbiAgICAgICAgICAgICAgPGxpIGNsYXNzPVwicC10LTQgcC1iLTQgZC1mbGV4IHNlcGFyYXRvci1ib3R0b20gZmxleC13cmFwXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic21hbGwgbS1iLTAgbS1yLTggYS1zLXN0YXJ0IGZsZXgtZ3Jvd1wiPlxuICAgICAgICAgICAgICAgICAge3sgJ0FsZ29yaXRobScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibS1sLWF1dG8gdGV4dC1icmVhay13b3JkXCI+XG4gICAgICAgICAgICAgICAgICB7eyB0cnVzdGVkQ2VydGlmaWNhdGUuYWxnb3JpdGhtTmFtZSB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPGxpIGNsYXNzPVwicC10LTQgcC1iLTQgZC1mbGV4IHNlcGFyYXRvci1ib3R0b20gZmxleC13cmFwXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic21hbGwgbS1iLTAgbS1yLTggYS1zLXN0YXJ0IGZsZXgtZ3Jvd1wiPlxuICAgICAgICAgICAgICAgICAge3sgJ1ZlcnNpb24nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm0tbC1hdXRvIHRleHQtYnJlYWstd29yZFwiPlxuICAgICAgICAgICAgICAgICAge3sgdHJ1c3RlZENlcnRpZmljYXRlLnZlcnNpb24gfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIDxsaSBjbGFzcz1cInAtdC00IHAtYi00IGQtZmxleCBzZXBhcmF0b3ItYm90dG9tIGZsZXgtd3JhcFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInNtYWxsIG0tYi0wIG0tci04IGEtcy1zdGFydCBmbGV4LWdyb3dcIj5cbiAgICAgICAgICAgICAgICAgIHt7ICdWYWxpZCBmcm9tJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtLWwtYXV0byB0ZXh0LWJyZWFrLXdvcmRcIj5cbiAgICAgICAgICAgICAgICAgIHt7IHRydXN0ZWRDZXJ0aWZpY2F0ZS5ub3RCZWZvcmUgfCBjOHlEYXRlIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJwLXQtNCBwLWItNCBkLWZsZXggc2VwYXJhdG9yLWJvdHRvbSBmbGV4LXdyYXBcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzbWFsbCBtLWItMCBtLXItOCBhLXMtc3RhcnQgZmxleC1ncm93XCI+XG4gICAgICAgICAgICAgICAgICB7eyAnSXNzdWVyJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtLWwtYXV0byB0ZXh0LWJyZWFrLXdvcmRcIj5cbiAgICAgICAgICAgICAgICAgIHt7IHRydXN0ZWRDZXJ0aWZpY2F0ZS5pc3N1ZXIgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIDxsaSBjbGFzcz1cInAtdC00IHAtYi00IGQtZmxleCBzZXBhcmF0b3ItYm90dG9tIGZsZXgtd3JhcFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInNtYWxsIG0tYi0wIG0tci04IGEtcy1zdGFydCBmbGV4LWdyb3dcIj5cbiAgICAgICAgICAgICAgICAgIHt7ICdFeHBpcmF0aW9uIGRhdGUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm0tbC1hdXRvIHRleHQtYnJlYWstd29yZFwiPlxuICAgICAgICAgICAgICAgICAge3sgdHJ1c3RlZENlcnRpZmljYXRlLm5vdEFmdGVyIHwgYzh5RGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPGxpIGNsYXNzPVwicC10LTQgcC1iLTQgZC1mbGV4IHNlcGFyYXRvci1ib3R0b20gZmxleC13cmFwXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic21hbGwgbS1iLTAgbS1yLTggYS1zLXN0YXJ0IGZsZXgtZ3Jvd1wiPlxuICAgICAgICAgICAgICAgICAge3sgJ1NlcmlhbCBudW1iZXInIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm0tbC1hdXRvIHRleHQtYnJlYWstd29yZFwiPlxuICAgICAgICAgICAgICAgICAge3sgdHJ1c3RlZENlcnRpZmljYXRlLnNlcmlhbE51bWJlciB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPGxpIGNsYXNzPVwicC10LTQgcC1iLTQgZC1mbGV4IHNlcGFyYXRvci1ib3R0b20gZmxleC13cmFwXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic21hbGwgbS1iLTAgbS1yLTggYS1zLXN0YXJ0IGZsZXgtZ3Jvd1wiPlxuICAgICAgICAgICAgICAgICAge3sgJ1N1YmplY3Rgb2YgYSBjZXJ0aWZpY2F0ZWAnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm0tbC1hdXRvIHRleHQtYnJlYWstd29yZFwiPlxuICAgICAgICAgICAgICAgICAge3sgdHJ1c3RlZENlcnRpZmljYXRlLnN1YmplY3QgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMVwiPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtN1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZCBmb3JtLWJsb2NrXCI+XG4gICAgICAgICAgICAgIHt7ICdQcm9vZiBvZiBwb3NzZXNzaW9uJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4taGVscCBidG4taGVscC0tc21cIlxuICAgICAgICAgICAgICAgIHBvcG92ZXI9XCJ7eyBQUk9PRl9PRl9QT1NTRVNTSU9OX1BPUE9WRVIgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0hlbHAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICB0cmlnZ2Vycz1cImZvY3VzXCJcbiAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJyaWdodFwiXG4gICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInRydXN0ZWRDZXJ0aWZpY2F0ZS5wcm9vZk9mUG9zc2Vzc2lvblZhbGlkXCI+XG4gICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnUHJvb2Ygb2YgcG9zc2Vzc2lvbicgfCB0cmFuc2xhdGUgfX06ICB7e1xuICAgICAgICAgICAgICAgICAgJ0NvbXBsZXRlYHByb29mIG9mIHBvc3Nlc3Npb25gJyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIH19XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImljb24tZmxleFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwic3VjY2Vzc1wiIGNsYXNzPVwidGV4dC1zdWNjZXNzXCI+PC9pPlxuICAgICAgICAgICAgICAgIHt7ICdDb21wbGV0ZWBwcm9vZiBvZiBwb3NzZXNzaW9uYCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIXRydXN0ZWRDZXJ0aWZpY2F0ZS5wcm9vZk9mUG9zc2Vzc2lvblZhbGlkXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbS1iLTE2XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XG4gICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdQcm9vZiBvZiBwb3NzZXNzaW9uJyB8IHRyYW5zbGF0ZSB9fTogIHt7XG4gICAgICAgICAgICAgICAgICAgICAgJ0luY29tcGxldGVgcHJvb2Ygb2YgcG9zc2Vzc2lvbmAnIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgICAgIH19XCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpY29uLWZsZXhcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwid2FybmluZ1wiIGNsYXNzPVwidGV4dC13YXJuaW5nXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICB7eyAnSW5jb21wbGV0ZWBwcm9vZiBvZiBwb3NzZXNzaW9uYCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTYgY29sLWxnLTYgdGV4dC1yaWdodC1tZFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsIG0tci00XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdWZXJpZmljYXRpb24gY29kZSBleHBpcmVzL2V4cGlyZWQgb24nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAodHJ1c3RlZENlcnRpZmljYXRlLnByb29mT2ZQb3NzZXNzaW9uVmVyaWZpY2F0aW9uQ29kZVVzYWJsZVVudGlsIHwgYzh5RGF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAnLS0tJ1xuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTYgY29sLWxnLTZcIj5cbiAgICAgICAgICAgICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInVuc2lnbmVkVmVyaWZpY2F0aW9uQ29kZVwiIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiIHRyYW5zbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICBWZXJpZmljYXRpb24gY29kZVxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBuby1yZXNpemVcIlxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJ1bnNpZ25lZFZlcmlmaWNhdGlvbkNvZGVcIlxuICAgICAgICAgICAgICAgICAgICAgIGlkPVwidW5zaWduZWRWZXJpZmljYXRpb25Db2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICByZWFkb25seVxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICByb3dzPVwiNVwiXG4gICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ0cnVzdGVkQ2VydGlmaWNhdGUucHJvb2ZPZlBvc3Nlc3Npb25VbnNpZ25lZFZlcmlmaWNhdGlvbkNvZGVcIlxuICAgICAgICAgICAgICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdSZWdlbmVyYXRlIHZlcmlmaWNhdGlvbiBjb2RlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLXNtXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVnZW5lcmF0ZVVuc2lnbmVkVmVyaWZpY2F0aW9uQ29kZSh0cnVzdGVkQ2VydGlmaWNhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIHt7ICdSZWdlbmVyYXRlYHZlcmlmaWNhdGlvbiBjb2RlYCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tZGVmYXVsdCBtLWwtYXV0byBtLXItMFwiXG4gICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcD1cInt7ICdDb3B5IHRvIGNsaXBib2FyZCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgIFtkZWxheV09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0NvcHkgdG8gY2xpcGJvYXJkJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiF0cnVzdGVkQ2VydGlmaWNhdGUucHJvb2ZPZlBvc3Nlc3Npb25VbnNpZ25lZFZlcmlmaWNhdGlvbkNvZGVcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb3B5VW5zaWduZWRWZXJpZmljYXRpb25Db2RlVG9DbGlwYm9hcmQodHJ1c3RlZENlcnRpZmljYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwiY2xpcGJvYXJkXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbVwiXG4gICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcD1cInt7ICdEb3dubG9hZCBhcyBmaWxlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2RlbGF5XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInRG93bmxvYWQgYXMgZmlsZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhdHJ1c3RlZENlcnRpZmljYXRlLnByb29mT2ZQb3NzZXNzaW9uVW5zaWduZWRWZXJpZmljYXRpb25Db2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZG93bmxvYWRVbnNpZ25lZFZlcmlmaWNhdGlvbkNvZGUodHJ1c3RlZENlcnRpZmljYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwiZG93bmxvYWRcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTYgY29sLWxnLTZcIj5cbiAgICAgICAgICAgICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNpZ25lZFZlcmlmaWNhdGlvbkNvZGVcIiBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyAnU2lnbmVkIHZlcmlmaWNhdGlvbiBjb2RlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4taGVscCBidG4taGVscC0tc21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgcG9wb3Zlcj1cInt7IFNJR05FRF9WRVJJRklDQVRJT05fQ09ERV9QT1BPVkVSIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0hlbHAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIG5vLXJlc2l6ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZT1cInNpZ25lZFZlcmlmaWNhdGlvbkNvZGVcIlxuICAgICAgICAgICAgICAgICAgICAgIGlkPVwic2lnbmVkVmVyaWZpY2F0aW9uQ29kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgIHJvd3M9XCI1XCJcbiAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNpZ25lZFZlcmlmaWNhdGlvbkNvZGVcIlxuICAgICAgICAgICAgICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdWZXJpZnkgc2lnbmVkIHZlcmlmaWNhdGlvbiBjb2RlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLXNtXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB2ZXJpZnlTaWduZWRWZXJpZmljYXRpb25Db2RlKHRydXN0ZWRDZXJ0aWZpY2F0ZSwgc2lnbmVkVmVyaWZpY2F0aW9uQ29kZSlcbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhc2lnbmVkVmVyaWZpY2F0aW9uQ29kZVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICB7eyAnVmVyaWZ5YHNpZ25lZCB2ZXJpZmljYXRpb24gY29kZWAnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1kZWZhdWx0IG0tbC1hdXRvXCJcbiAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwPVwie3sgJ1VwbG9hZCBmaWxlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2RlbGF5XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInVXBsb2FkIGZpbGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZmlsZUlucHV0LmNsaWNrKClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cInVwbG9hZFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCAjZmlsZUlucHV0IHR5cGU9XCJmaWxlXCIgKGNoYW5nZSk9XCJvbkZpbGVJbnB1dCgkZXZlbnQpXCIgY2xhc3M9XCJoaWRkZW5cIiAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9jOHktbGktY29sbGFwc2U+XG4gIDwvYzh5LWxpPlxuPC9jOHktbGlzdC1ncm91cD5cbiJdfQ==