@c8y/ngx-components 1017.0.170 → 1017.0.172
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.
- package/esm2020/trusted-certificates/trusted-certificate.model.mjs +2 -0
- package/esm2020/trusted-certificates/trusted-certificates.component.mjs +7 -7
- package/fesm2015/c8y-ngx-components-trusted-certificates.mjs +6 -6
- package/fesm2015/c8y-ngx-components-trusted-certificates.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-trusted-certificates.mjs +6 -6
- package/fesm2020/c8y-ngx-components-trusted-certificates.mjs.map +1 -1
- package/package.json +2 -2
- package/trusted-certificates/trusted-certificate.model.d.ts +4 -0
- package/trusted-certificates/trusted-certificates.component.d.ts +4 -3
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ1c3RlZC1jZXJ0aWZpY2F0ZS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RydXN0ZWQtY2VydGlmaWNhdGVzL3RydXN0ZWQtY2VydGlmaWNhdGUubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElUcnVzdGVkQ2VydGlmaWNhdGUgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJ1c3RlZENlcnRpZmljYXRlIGV4dGVuZHMgSVRydXN0ZWRDZXJ0aWZpY2F0ZSB7XG4gIHNpZ25lZFZlcmlmaWNhdGlvbkNvZGU/OiBzdHJpbmc7XG59XG4iXX0=
|
|
@@ -118,9 +118,9 @@ export class TrustedCertificatesComponent {
|
|
|
118
118
|
this.alertService.success(gettext('Verification code regenerated.'));
|
|
119
119
|
}, ex => this.alertService.addServerFailure(ex));
|
|
120
120
|
}
|
|
121
|
-
verifySignedVerificationCode(trustedCertificate
|
|
121
|
+
verifySignedVerificationCode(trustedCertificate) {
|
|
122
122
|
this.trustedCertificateService
|
|
123
|
-
.verifySignedVerificationCode(trustedCertificate, signedVerificationCode)
|
|
123
|
+
.verifySignedVerificationCode(trustedCertificate, trustedCertificate.signedVerificationCode)
|
|
124
124
|
.then(({ data }) => {
|
|
125
125
|
assign(trustedCertificate, data);
|
|
126
126
|
this.alertService.success(gettext('Signed verification code verified.'));
|
|
@@ -134,19 +134,19 @@ export class TrustedCertificatesComponent {
|
|
|
134
134
|
copyUnsignedVerificationCodeToClipboard(trustedCertificate) {
|
|
135
135
|
this.clipboardService.writeText(trustedCertificate.proofOfPossessionUnsignedVerificationCode);
|
|
136
136
|
}
|
|
137
|
-
onFileInput(event) {
|
|
137
|
+
onFileInput(event, trustedCertificate) {
|
|
138
138
|
const input = event.target;
|
|
139
139
|
const reader = new FileReader();
|
|
140
140
|
reader.onload = () => {
|
|
141
|
-
|
|
141
|
+
trustedCertificate.signedVerificationCode = reader.result;
|
|
142
142
|
};
|
|
143
143
|
reader.readAsText(input.files[0]);
|
|
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 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" }] });
|
|
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)]=\"trustedCertificate.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)\n \"\n [disabled]=\"!trustedCertificate.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, trustedCertificate)\" 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 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" }]
|
|
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)]=\"trustedCertificate.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)\n \"\n [disabled]=\"!trustedCertificate.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, trustedCertificate)\" 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ1c3RlZC1jZXJ0aWZpY2F0ZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHJ1c3RlZC1jZXJ0aWZpY2F0ZXMvdHJ1c3RlZC1jZXJ0aWZpY2F0ZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vdHJ1c3RlZC1jZXJ0aWZpY2F0ZXMvdHJ1c3RlZC1jZXJ0aWZpY2F0ZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEcsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDckYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBdUIseUJBQXlCLEVBQWUsTUFBTSxhQUFhLENBQUM7QUFDMUYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUN6RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7Ozs7Ozs7Ozs7O0FBTW5DLE1BQU0sT0FBTyw0QkFBNEI7SUF1QnZDLFlBQ1UsT0FBdUIsRUFDdkIsWUFBMEIsRUFDMUIseUJBQW9ELEVBQ3BELFlBQTBCLEVBQzFCLGdCQUFrQyxFQUNsQyxnQkFBa0M7UUFMbEMsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFDdkIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFD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cG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFsZXJ0U2VydmljZSwgQ2xpcGJvYXJkU2VydmljZSwgZ2V0dGV4dCwgTW9kYWxTZXJ2aWNlLCBTdGF0dXMgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IEFkZFRydXN0ZWRDZXJ0aWZpY2F0ZUNvbXBvbmVudCB9IGZyb20gJy4vYWRkLXRydXN0ZWQtY2VydGlmaWNhdGUuY29tcG9uZW50JztcbmltcG9ydCB7IEJzTW9kYWxTZXJ2aWNlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XG5pbXBvcnQgeyBJVHJ1c3RlZENlcnRpZmljYXRlLCBUcnVzdGVkQ2VydGlmaWNhdGVTZXJ2aWNlLCBJUmVzdWx0TGlzdCB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IHRhcCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgcGlwZSwgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBzYXZlQXMgfSBmcm9tICdmaWxlLXNhdmVyJztcbmltcG9ydCB7IGFzc2lnbiB9IGZyb20gJ2xvZGFzaC1lcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS10cnVzdGVkLWNlcnRpZmljYXRlcycsXG4gIHRlbXBsYXRlVXJsOiAnLi90cnVzdGVkLWNlcnRpZmljYXRlcy5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgVHJ1c3RlZENlcnRpZmljYXRlc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIFBST09GX09GX1BPU1NFU1NJT05fUE9QT1ZFUiA9IGdldHRleHQoXG4gICAgJ1wiUHJvb2Ygb2YgcG9zc2Vzc2lvblwiIGlzIGEgc2VjdXJpdHkgbWV0aG9kIHVzZWQgdG8gcHJvdmUgdGhhdCB3aG9ldmVyIHNlbmRzIGEgbWVzc2FnZSBpcyBhbHNvIGluIHRoZSBwb3NzZXNzaW9uIG9mIHRoZSBwYXJ0aWN1bGFyIGNyeXB0b2dyYXBoaWMga2V5LidcbiAgKTtcbiAgU0lHTkVEX1ZFUklGSUNBVElPTl9DT0RFX1BPUE9WRVIgPSBnZXR0ZXh0KFxuICAgICdVc2UgdGhlIGZvbGxvd2luZyBvcGVuc3NsIGNvbW1hbmQgdG8gY3JlYXRlIHRoZSBzaWduZWQgdmVyaWZpY2F0aW9uIGNvZGU6IG9wZW5zc2wgZGdzdCAtc2hhMjU2IC1zaWduIDxwcml2YXRlLmtleT4gPHZlcmlmaWNhdGlvbl9jb2RlLnR4dD4gfCBvcGVuc3NsIGJhc2U2NCAtQSdcbiAgKTtcblxuICByZWxvYWRpbmc6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICByZWxvYWQ6IEJlaGF2aW9yU3ViamVjdDx2b2lkPiA9IG5ldyBCZWhhdmlvclN1YmplY3QobnVsbCk7XG4gIHRydXN0ZWRDZXJ0aWZpY2F0ZXM6IE9ic2VydmFibGU8SVJlc3VsdExpc3Q8SVRydXN0ZWRDZXJ0aWZpY2F0ZT4+ID0gdGhpcy5yZWxvYWQucGlwZShcbiAgICB0YXAoKCkgPT4gdGhpcy5yZWxvYWRpbmcubmV4dCh0cnVlKSksXG4gICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuZ2V0VHJ1c3RlZENlcnRpZmljYXRlcygpKSxcbiAgICB0YXAoKCkgPT4gdGhpcy5yZWxvYWRpbmcubmV4dChmYWxzZSkpXG4gICk7XG4gIHNvcnRCeUV4cGlyYXRpb25EYXRlQXNjID0gcGlwZShcbiAgICB0YXAoKHJlc3VsdHM6IElUcnVzdGVkQ2VydGlmaWNhdGVbXSkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3VsdHMuc29ydCgobjEsIG4yKSA9PiBuMS5ub3RBZnRlci5sb2NhbGVDb21wYXJlKG4yLm5vdEFmdGVyKSk7XG4gICAgfSlcbiAgKTtcblxuICBzaWduZWRWZXJpZmljYXRpb25Db2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBic01vZGFsOiBCc01vZGFsU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJ1c3RlZENlcnRpZmljYXRlU2VydmljZTogVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZSxcbiAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTW9kYWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIGNsaXBib2FyZFNlcnZpY2U6IENsaXBib2FyZFNlcnZpY2VcbiAgKSB7fVxuXG4gIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIGF3YWl0IHRoaXMubG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoKTtcbiAgfVxuXG4gIGFzeW5jIGxvYWRUcnVzdGVkQ2VydGlmaWNhdGVzKCkge1xuICAgIHRoaXMucmVsb2FkLm5leHQoKTtcbiAgfVxuXG4gIGdldFRydXN0ZWRDZXJ0aWZpY2F0ZXMoKSB7XG4gICAgY29uc3QgZmlsdGVyOiBvYmplY3QgPSB7XG4gICAgICBwYWdlU2l6ZTogMTAwMCxcbiAgICAgIHdpdGhUb3RhbFBhZ2VzOiB0cnVlXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy50cnVzdGVkQ2VydGlmaWNhdGVTZXJ2aWNlLmxpc3QoZmlsdGVyKTtcbiAgfVxuXG4gIGFzeW5jIGFkZFRydXN0ZWRDZXJ0aWZpY2F0ZSgpIHtcbiAgICBjb25zdCBtb2RhbCA9IHRoaXMuYnNNb2RhbC5zaG93KEFkZFRydXN0ZWRDZXJ0aWZpY2F0ZUNvbXBvbmVudCwge1xuICAgICAgY2xhc3M6ICdtb2RhbC1zbScsXG4gICAgICBhcmlhRGVzY3JpYmVkYnk6ICdhZGRDZXJ0aWZpY2F0ZU1vZGFsRGVzY3JpcHRpb24nLFxuICAgICAgYXJpYUxhYmVsbGVkQnk6ICdhZGRDZXJ0aWZpY2F0ZU1vZGFsVGl0bGUnLFxuICAgICAgaWdub3JlQmFja2Ryb3BDbGljazogdHJ1ZVxuICAgIH0pLmNvbnRlbnQgYXMgQWRkVHJ1c3RlZENlcnRpZmljYXRlQ29tcG9uZW50O1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBtb2RhbC5yZXN1bHQ7XG4gICAgICBtb2RhbC5jbG9zZSgpO1xuICAgICAgdGhpcy5yZWxvYWQubmV4dCgpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlVHJ1c3RlZENlcnRpZmljYXRlKGNlcnRpZmljYXRlKSB7XG4gICAgY29uc3QgdGl0bGUgPSBnZXR0ZXh0KCdEZWxldGUgdHJ1c3RlZCBjZXJ0aWZpY2F0ZScpO1xuICAgIGNvbnN0IGNvbmZpcm1hdGlvblRleHQgPSBnZXR0ZXh0KFxuICAgICAgJ1lvdSBhcmUgYWJvdXQgdG8gZGVsZXRlIGEgdHJ1c3RlZCBjZXJ0aWZpY2F0ZSBcInt7IGNlcnRpZmljYXRlTmFtZSB9fVwiLidcbiAgICApO1xuICAgIGNvbnN0IGZpbmFsUXVlc3Rpb24gPSBnZXR0ZXh0KCdEbyB5b3Ugd2FudCB0byBwcm9jZWVkPycpO1xuICAgIGNvbnN0IGNlcnRpZmljYXRlTmFtZSA9IGNlcnRpZmljYXRlLm5hbWU7XG4gICAgY29uc3QgYm9keSA9IFtcbiAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGNvbmZpcm1hdGlvblRleHQsIHtcbiAgICAgICAgY2VydGlmaWNhdGVOYW1lXG4gICAgICB9KSxcbiAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGZpbmFsUXVlc3Rpb24pXG4gICAgXS5qb2luKCcgJyk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5tb2RhbFNlcnZpY2UuY29uZmlybSh0aXRsZSwgYm9keSwgU3RhdHVzLkRBTkdFUiwgeyBvazogZ2V0dGV4dCgnRGVsZXRlJykgfSk7XG4gICAgICBhd2FpdCB0aGlzLnRydXN0ZWRDZXJ0aWZpY2F0ZVNlcnZpY2UuZGVsZXRlKGNlcnRpZmljYXRlLmZpbmdlcnByaW50KTtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnN1Y2Nlc3MoZ2V0dGV4dCgnQ2VydGlmaWNhdGUgZGVsZXRlZC4nKSk7XG4gICAgICB0aGlzLnJlbG9hZC5uZXh0KCk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZFNlcnZlckZhaWx1cmUoZXgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUNlcnRpZmljYXRlKFxuICAgIHRydXN0ZWRDZXJ0aWZpY2F0ZTogSVRydXN0ZWRDZXJ0aWZpY2F0ZSxcbiAgICB1cGRhdGluZ1BhcnQ6IFBhcnRpYWw8SVRydXN0ZWRDZXJ0aWZpY2F0ZT5cbiAgKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMudHJ1c3RlZENlcnRpZmljYXRlU2VydmljZS51cGRhdGUoe1xuICAgICAgICBmaW5nZXJwcmludDogdHJ1c3RlZENlcnRpZmljYXRlLmZpbmdlcnByaW50LFxuICAgICAgICAuLi51cGRhdGluZ1BhcnRcbiAgICAgIH0pO1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2Uuc3VjY2VzcyhnZXR0ZXh0KCdDZXJ0aWZpY2F0ZSBzYXZlZC4nKSk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZFNlcnZlckZhaWx1cmUoZXgpO1xuICAgIH1cbiAgfVxuXG4gIGhpZ2hsaWdodERlcGVuZGluZ09uRXhwaXJhdGlvblN0YXR1cyhpdGVtOiBJVHJ1c3RlZENlcnRpZmljYXRlKSB7XG4gICAgY29uc3Qgd2FybmluZ09mZnNldCA9IDI0ICogNjAgKiA2MCAqIDEwMDAgKiA5MDsgLy8gOTAgZGF5c1xuICAgIGNvbnN0IHRvZGF5VGltZXN0YW1wID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgY29uc3Qgd2FybmluZ1RpbWVzdGFtcCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpICsgd2FybmluZ09mZnNldDtcbiAgICBjb25zdCBub3RBZnRlclRpbWVzdGFtcCA9IG5ldyBEYXRlKGl0ZW0ubm90QWZ0ZXIpLmdldFRpbWUoKTtcbiAgICBjb25zdCBleHBpcmVkID0gbm90QWZ0ZXJUaW1lc3RhbXAgPCB0b2RheVRpbWVzdGFtcDtcbiAgICBjb25zdCBleHBpcmVzSW5MZXNzVGhhbjkwRGF5cyA9IG5vdEFmdGVyVGltZXN0YW1wIDwgd2FybmluZ1RpbWVzdGFtcDtcbiAgICBpZiAoZXhwaXJlZCkge1xuICAgICAgcmV0dXJuICd0ZXh0LWRhbmdlcic7XG4gICAgfVxuICAgIGlmIChleHBpcmVzSW5MZXNzVGhhbjkwRGF5cykge1xuICAgICAgcmV0dXJuICd0ZXh0LXdhcm5pbmcnO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICByZWdlbmVyYXRlVW5zaWduZWRWZXJpZmljYXRpb25Db2RlKHRydXN0ZWRDZXJ0aWZpY2F0ZTogSVRydXN0ZWRDZXJ0aWZpY2F0ZSkge1xuICAgIHRoaXMudHJ1c3RlZENlcnRpZmljYXRlU2VydmljZS5yZWdlbmVyYXRlUG9QVmVyaWZpY2F0aW9uQ29kZSh0cnVzdGVkQ2VydGlmaWNhdGUpLnRoZW4oXG4gICAgICAoeyBkYXRhIH0pID0+IHtcbiAgICAgICAgYXNzaWduKHRydXN0ZWRDZXJ0aWZpY2F0ZSwgZGF0YSk7XG4gICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnN1Y2Nlc3MoZ2V0dGV4dCgnVmVyaWZpY2F0aW9uIGNvZGUgcmVnZW5lcmF0ZWQuJykpO1xuICAgICAgfSxcbiAgICAgIGV4ID0+IHRoaXMuYWxlcnRTZXJ2aWNlLmFkZFNlcnZlckZhaWx1cmUoZXgpXG4gICAgKTtcbiAgfVxuXG4gIHZlcmlmeVNpZ25lZFZlcmlmaWNhdGlvbkNvZGUoXG4gICAgdHJ1c3RlZENlcnRpZmljYXRlOiBJVHJ1c3RlZENlcnRpZmljYXRlLFxuICAgIHNpZ25lZFZlcmlmaWNhdGlvbkNvZGU6IHN0cmluZ1xuICApIHtcbiAgICB0aGlzLnRydXN0ZWRDZXJ0aWZpY2F0ZVNlcnZpY2VcbiAgICAgIC52ZXJpZnlTaWduZWRWZXJpZmljYXRpb25Db2RlKHRydXN0ZWRDZXJ0aWZpY2F0ZSwgc2lnbmVkVmVyaWZpY2F0aW9uQ29kZSlcbiAgICAgIC50aGVuKFxuICAgICAgICAoeyBkYXRhIH0pID0+IHtcbiAgICAgICAgICBhc3NpZ24odHJ1c3RlZENlcnRpZmljYXRlLCBkYXRhKTtcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5zdWNjZXNzKGdldHRleHQoJ1NpZ25lZCB2ZXJpZmljYXRpb24gY29kZSB2ZXJpZmllZC4nKSk7XG4gICAgICAgIH0sXG4gICAgICAgIGV4ID0+IHRoaXMuYWxlcnRTZXJ2aWNlLmFkZFNlcnZlckZhaWx1cmUoZXgpXG4gICAgICApO1xuICB9XG5cbiAgZG93bmxvYWRVbnNpZ25lZFZlcmlmaWNhdGlvbkNvZGUodHJ1c3RlZENlcnRpZmljYXRlOiBJVHJ1c3RlZENlcnRpZmljYXRlKSB7XG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFt0cnVzdGVkQ2VydGlmaWNhdGUucHJvb2ZPZlBvc3Nlc3Npb25VbnNpZ25lZFZlcmlmaWNhdGlvbkNvZGVdKTtcbiAgICBjb25zdCBmaWxlTmFtZSA9IHRydXN0ZWRDZXJ0aWZpY2F0ZS5uYW1lO1xuICAgIHNhdmVBcyhibG9iLCBgJHtmaWxlTmFtZX0udHh0YCk7XG4gIH1cblxuICBjb3B5VW5zaWduZWRWZXJpZmljYXRpb25Db2RlVG9DbGlwYm9hcmQodHJ1c3RlZENlcnRpZmljYXRlOiBJVHJ1c3RlZENlcnRpZmljYXRlKSB7XG4gICAgdGhpcy5jbGlwYm9hcmRTZXJ2aWNlLndyaXRlVGV4dCh0cnVzdGVkQ2VydGlmaWNhdGUucHJvb2ZPZlBvc3Nlc3Npb25VbnNpZ25lZFZlcmlmaWNhdGlvbkNvZGUpO1xuICB9XG5cbiAgb25GaWxlSW5wdXQoZXZlbnQpIHtcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldDtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICB0aGlzLnNpZ25lZFZlcmlmaWNhdGlvbkNvZGUgPSByZWFkZXIucmVzdWx0IGFzIHN0cmluZztcbiAgICB9O1xuICAgIHJlYWRlci5yZWFkQXNUZXh0KGlucHV0LmZpbGVzWzBdKTtcbiAgfVxufVxuIiwiPGM4eS10aXRsZT57eyAnVHJ1c3RlZCBjZXJ0aWZpY2F0ZXMnIHwgdHJhbnNsYXRlIH19PC9jOHktdGl0bGU+XG5cbjxjOHktYnJlYWRjcnVtYj5cbiAgPGM4eS1icmVhZGNydW1iLWl0ZW1cbiAgICBsYWJlbD1cInt7ICdNYW5hZ2VtZW50JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgaWNvbj1cImM4eS1tYW5hZ2VtZW50XCJcbiAgPjwvYzh5LWJyZWFkY3J1bWItaXRlbT5cbiAgPGM4eS1icmVhZGNydW1iLWl0ZW1cbiAgICBsYWJlbD1cInt7ICdUcnVzdGVkIGNlcnRpZmljYXRlcycgfCB0cmFuc2xhdGUgfX1cIlxuICAgIGljb249XCJjZXJ0aWZpY2F0ZVwiXG4gID48L2M4eS1icmVhZGNydW1iLWl0ZW0+XG48L2M4eS1icmVhZGNydW1iPlxuXG48Yzh5LWFjdGlvbi1iYXItaXRlbSBbcGxhY2VtZW50XT1cIidyaWdodCdcIj5cbiAgPGJ1dHRvblxuICAgIHRpdGxlPVwie3sgJ0FkZCB0cnVzdGVkIGNlcnRpZmljYXRlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgY2xhc3M9XCJidG4gYnRuLWxpbmtcIlxuICAgIChjbGljayk9XCJhZGRUcnVzdGVkQ2VydGlmaWNhdGUoKVwiXG4gID5cbiAgICA8aSBjOHlJY29uPVwicGx1cy1jaXJjbGVcIj48L2k+XG4gICAge3sgJ0FkZCB0cnVzdGVkIGNlcnRpZmljYXRlJyB8IHRyYW5zbGF0ZSB9fVxuICA8L2J1dHRvbj5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuPGM4eS1hY3Rpb24tYmFyLWl0ZW0gW3BsYWNlbWVudF09XCIncmlnaHQnXCI+XG4gIDxidXR0b25cbiAgICB0aXRsZT1cInt7ICdSZWxvYWQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICBjbGFzcz1cImJ0biBidG4tbGlua1wiXG4gICAgKGNsaWNrKT1cImxvYWRUcnVzdGVkQ2VydGlmaWNhdGVzKClcIlxuICA+XG4gICAgPGkgYzh5SWNvbj1cInJlZnJlc2hcIiBbbmdDbGFzc109XCJ7ICdpY29uLXNwaW4nOiByZWxvYWRpbmcgfCBhc3luYyB9XCI+PC9pPlxuICAgIHt7ICdSZWxvYWQnIHwgdHJhbnNsYXRlIH19XG4gIDwvYnV0dG9uPlxuPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuXG48Yzh5LWhlbHAgc3JjPVwiL3VzZXJzLWd1aWRlL2RldmljZS1tYW5hZ2VtZW50LyN0cnVzdGVkLWNlcnRpZmljYXRlc1wiPjwvYzh5LWhlbHA+XG5cbjxjOHktdWktZW1wdHktc3RhdGVcbiAgKm5nSWY9XCIodHJ1c3RlZENlcnRpZmljYXRlcyB8IGFzeW5jKT8uZGF0YS5sZW5ndGggPT09IDBcIlxuICBbaWNvbl09XCInY2VydGlmaWNhdGUnXCJcbiAgW3RpdGxlXT1cIidObyB0cnVzdGVkIGNlcnRpZmljYXRlcyB0byBkaXNwbGF5LicgfCB0cmFuc2xhdGVcIlxuICBbc3VidGl0bGVdPVwiJ0FkZCB5b3VyIGZpcnN0IGNlcnRpZmljYXRlIGJ5IGNsaWNraW5nIGJlbG93LicgfCB0cmFuc2xhdGVcIlxuPlxuICA8YnV0dG9uXG4gICAgdGl0bGU9XCJ7eyAnQWRkIHRydXN0ZWQgY2VydGlmaWNhdGUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAoY2xpY2spPVwiYWRkVHJ1c3RlZENlcnRpZmljYXRlKClcIlxuICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcbiAgPlxuICAgIHt7ICdBZGQgdHJ1c3RlZCBjZXJ0aWZpY2F0ZScgfCB0cmFuc2xhdGUgfX1cbiAgPC9idXR0b24+XG48L2M4eS11aS1lbXB0eS1zdGF0ZT5cblxuPGM4eS1saXN0LWdyb3VwIGNsYXNzPVwibS1iLTI0XCI+XG4gIDxkaXZcbiAgICAqbmdJZj1cIih0cnVzdGVkQ2VydGlmaWNhdGVzIHwgYXN5bmMpPy5kYXRhLmxlbmd0aCA+IDBcIlxuICAgIGNsYXNzPVwicGFnZS1zdGlja3ktaGVhZGVyIGhpZGRlbi14cyBjOHktbGlzdF9faXRlbSBjOHktbGlzdF9faXRlbS0tZW1wdHktYWN0aW9uc1wiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwiYzh5LWxpc3RfX2l0ZW1fX2Jsb2NrXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiYzh5LWxpc3RfX2l0ZW1fX2ljb25cIj5cbiAgICAgICAgPGkgYzh5SWNvbj1cImNlcnRpZmljYXRlXCIgY2xhc3M9XCJpbnZpc2libGVcIj48L2k+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjOHktbGlzdF9faXRlbV9fYm9keVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGVudC1mbGV4LTYwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIiB0aXRsZT1cIiB7eyAnQ2VydGlmaWNhdGUnIHwgdHJhbnNsYXRlIH19IFwiPlxuICAgICAgICAgICAgICB7eyAnQ2VydGlmaWNhdGUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIiB0aXRsZT1cInt7ICdTdGF0dXMnIHwgdHJhbnNsYXRlIH19XCI+XG4gICAgICAgICAgICAgIHt7ICdTdGF0dXMnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIiB0aXRsZT1cInt7ICdBbGdvcml0aG0nIHwgdHJhbnNsYXRlIH19XCI+XG4gICAgICAgICAgICAgIHt7ICdBbGdvcml0aG0nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIiB0aXRsZT1cInt7ICdFeHBpcmF0aW9uIGRhdGUnIHwgdHJhbnNsYXRlIH19XCI+XG4gICAgICAgICAgICAgIHt7ICdFeHBpcmF0aW9uIGRhdGUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIiB0aXRsZT1cIiB7eyAnQXV0byByZWdpc3RyYXRpb24nIHwgdHJhbnNsYXRlIH19XCI+XG4gICAgICAgICAgICAgIHt7ICdBdXRvIHJlZ2lzdHJhdGlvbicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiIHRpdGxlPVwiIHt7ICdQcm9vZiBvZiBwb3NzZXNzaW9uJyB8IHRyYW5zbGF0ZSB9fVwiPlxuICAgICAgICAgICAgICB7eyAnUHJvb2Ygb2YgcG9zc2Vzc2lvbicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjOHktbGlzdF9faXRlbV9fYWN0aW9uc1wiPjwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8Yzh5LWxpXG4gICAgKmM4eUZvcj1cIlxuICAgICAgbGV0IHRydXN0ZWRDZXJ0aWZpY2F0ZSBvZiB0cnVzdGVkQ2VydGlmaWNhdGVzIHwgYXN5bmM7XG4gICAgICBsZXQgaSA9IGluZGV4O1xuICAgICAgcGlwZTogc29ydEJ5RXhwaXJhdGlvbkRhdGVBc2M7XG4gICAgICBsb2FkTW9yZTogJ25vbmUnXG4gICAgXCJcbiAgICAjbGlzdEl0ZW1cbiAgPlxuICAgIDxjOHktbGktaWNvbj5cbiAgICAgIDxpIGM4eUljb249XCJjZXJ0aWZpY2F0ZVwiPjwvaT5cbiAgICA8L2M4eS1saS1pY29uPlxuXG4gICAgPGM4eS1saS1ib2R5IGNsYXNzPVwiY29udGVudC1mbGV4LTYwXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTJcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiYnRuLWNsZWFuIHRleHQtdHJ1bmNhdGVcIlxuICAgICAgICAgIHRpdGxlPVwie3sgdHJ1c3RlZENlcnRpZmljYXRlLm5hbWUgfX1cIlxuICAgICAgICAgIChjbGljayk9XCJsaXN0SXRlbS50b2dnbGVDb2xsYXBzZWQoKVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyB0cnVzdGVkQ2VydGlmaWNhdGUubmFtZSB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC0yXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2aXNpYmxlLXhzIHAtOFwiPjwvZGl2PlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJidG4gYzh5LWJ0bi1jaGVja2JveC0taW5saW5lXCJcbiAgICAgICAgICBuYW1lPVwiY2VydGlmaWNhdGVTdGF0dXNcIlxuICAgICAgICAgIFsobmdNb2RlbCldPVwidHJ1c3RlZENlcnRpZmljYXRlLnN0YXR1c1wiXG4gICAgICAgICAgYnRuQ2hlY2tib3hcbiAgICAgICAgICBidG5DaGVja2JveFRydWU9XCJFTkFCTEVEXCJcbiAgICAgICAgICBidG5DaGVja2JveEZhbHNlPVwiRElTQUJMRURcIlxuICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZUNlcnRpZmljYXRlKHRydXN0ZWRDZXJ0aWZpY2F0ZSwgeyBzdGF0dXM6ICRldmVudCB9KVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c21hbGxcbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ0Rpc2FibGVkYHRydXN0ZWQgY2VydGlmaWNhdGUgc3RhdHVzYCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgW2hpZGRlbl09XCJ0cnVzdGVkQ2VydGlmaWNhdGUuc3RhdHVzICE9PSAnRElTQUJMRUQnXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyAnRGlzYWJsZWRgdHJ1c3RlZCBjZXJ0aWZpY2F0ZSBzdGF0dXNgJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgPHNtYWxsXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdFbmFibGVkYHRydXN0ZWQgY2VydGlmaWNhdGUgc3RhdHVzYCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgW2hpZGRlbl09XCJ0cnVzdGVkQ2VydGlmaWNhdGUuc3RhdHVzICE9PSAnRU5BQkxFRCdcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7ICdFbmFibGVkYHRydXN0ZWQgY2VydGlmaWNhdGUgc3RhdHVzYCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInZpc2libGUteHMgcC04XCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCJcbiAgICAgICAgICB0aXRsZT1cInt7ICdBbGdvcml0aG0nIHwgdHJhbnNsYXRlIH19OiB7eyB0cnVzdGVkQ2VydGlmaWNhdGUuYWxnb3JpdGhtTmFtZSB9fVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbGFiZWwtc21hbGwgbS10LTggbS1yLTggdmlzaWJsZS14cy1pbmxpbmVcIiB0cmFuc2xhdGU+QWxnb3JpdGhtPC9zcGFuPlxuICAgICAgICAgIHt7IHRydXN0ZWRDZXJ0aWZpY2F0ZS5hbGdvcml0aG1OYW1lIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCJcbiAgICAgICAgICB0aXRsZT1cInt7ICdFeHBpcmF0aW9uIGRhdGUnIHwgdHJhbnNsYXRlIH19OiB7eyB0cnVzdGVkQ2VydGlmaWNhdGUubm90QWZ0ZXIgfCBjOHlEYXRlIH19XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1sYWJlbC1zbWFsbCBtLXQtOCBtLXItOCB2aXNpYmxlLXhzLWlubGluZVwiIHRyYW5zbGF0ZT5cbiAgICAgICAgICAgIEV4cGlyYXRpb24gZGF0ZVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c21hbGwgW25nQ2xhc3NdPVwiaGlnaGxpZ2h0RGVwZW5kaW5nT25FeHBpcmF0aW9uU3RhdHVzKHRydXN0ZWRDZXJ0aWZpY2F0ZSlcIj5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgIGM4eUljb249XCJjYWxlbmRhclwiXG4gICAgICAgICAgICAgIGNsYXNzPVwibS1yLTRcIlxuICAgICAgICAgICAgICAqbmdJZj1cIiFoaWdobGlnaHREZXBlbmRpbmdPbkV4cGlyYXRpb25TdGF0dXModHJ1c3RlZENlcnRpZmljYXRlKVwiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgYzh5SWNvbj1cIndhcm5pbmdcIlxuICAgICAgICAgICAgICBjbGFzcz1cIm0tci00XCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJoaWdobGlnaHREZXBlbmRpbmdPbkV4cGlyYXRpb25TdGF0dXModHJ1c3RlZENlcnRpZmljYXRlKVwiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgPHNwYW4+e3sgdHJ1c3RlZENlcnRpZmljYXRlLm5vdEFmdGVyIHwgYzh5RGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC0yXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsIG0tdC04IG0tci00IHZpc2libGUteHMtaW5saW5lXCI+XG4gICAgICAgICAgICB7eyAnQXV0byByZWdpc3RyYXRpb24nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAqbmdJZj1cInRydXN0ZWRDZXJ0aWZpY2F0ZS5hdXRvUmVnaXN0cmF0aW9uRW5hYmxlZFwiXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdBdXRvIHJlZ2lzdHJhdGlvbicgfCB0cmFuc2xhdGUgfX06ICB7e1xuICAgICAgICAgICAgICAnRW5hYmxlZGBhdXRvIHJlZ2lzdHJhdGlvbmAnIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgJ0VuYWJsZWRgYXV0byByZWdpc3RyYXRpb25gJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgKm5nSWY9XCIhdHJ1c3RlZENlcnRpZmljYXRlLmF1dG9SZWdpc3RyYXRpb25FbmFibGVkXCJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ0F1dG8gcmVnaXN0cmF0aW9uJyB8IHRyYW5zbGF0ZSB9fTogIHt7XG4gICAgICAgICAgICAgICdEaXNhYmxlZGBhdXRvIHJlZ2lzdHJhdGlvbmAnIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgJ0Rpc2FibGVkYGF1dG8gcmVnaXN0cmF0aW9uYCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTIgZC1mbGV4XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsIG0tdC04IG0tci00IHZpc2libGUteHMtaW5saW5lXCI+XG4gICAgICAgICAgICB7eyAnUHJvb2Ygb2YgcG9zc2Vzc2lvbicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICpuZ0lmPVwidHJ1c3RlZENlcnRpZmljYXRlLnByb29mT2ZQb3NzZXNzaW9uVmFsaWRcIlxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnUHJvb2Ygb2YgcG9zc2Vzc2lvbicgfCB0cmFuc2xhdGUgfX06ICB7e1xuICAgICAgICAgICAgICAnQ29tcGxldGVgcHJvb2Ygb2YgcG9zc2Vzc2lvbmAnIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb24tZmxleFwiPlxuICAgICAgICAgICAgICA8aSBjOHlJY29uPVwic3VjY2Vzc1wiIGNsYXNzPVwidGV4dC1zdWNjZXNzXCI+PC9pPlxuICAgICAgICAgICAgICB7eyAnQ29tcGxldGVgcHJvb2Ygb2YgcG9zc2Vzc2lvbmAnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICpuZ0lmPVwiIXRydXN0ZWRDZXJ0aWZpY2F0ZS5wcm9vZk9mUG9zc2Vzc2lvblZhbGlkXCJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ1Byb29mIG9mIHBvc3Nlc3Npb24nIHwgdHJhbnNsYXRlIH19OiAge3tcbiAgICAgICAgICAgICAgJ0luY29tcGxldGVgcHJvb2Ygb2YgcG9zc2Vzc2lvbmAnIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb24tZmxleFwiPlxuICAgICAgICAgICAgICA8aSBjOHlJY29uPVwid2FybmluZ1wiIGNsYXNzPVwidGV4dC13YXJuaW5nXCI+PC9pPlxuICAgICAgICAgICAgICB7eyAnSW5jb21wbGV0ZWBwcm9vZiBvZiBwb3NzZXNzaW9uYCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzcz1cIm0tbC1hdXRvIGJ0bi1kb3QgYnRuLWRvdC0tZGFuZ2VyIGJ0biBzaG93T25Ib3ZlciBtLXItOFwiXG4gICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZVRydXN0ZWRDZXJ0aWZpY2F0ZSh0cnVzdGVkQ2VydGlmaWNhdGUpXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICB0b29sdGlwPVwie3sgJ0RlbGV0ZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgIFtkZWxheV09XCI1MDBcIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0RlbGV0ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICA+XG4gICAgICAgICAgPGkgYzh5SWNvbj1cImRlbGV0ZVwiPjwvaT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2M4eS1saS1ib2R5PlxuXG4gICAgPGM4eS1saS1jb2xsYXBzZT5cbiAgICAgIDxkaXYgY2xhc3M9XCJwLXQtMTYgcC1iLTE2XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cbiAgICAgICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPlxuICAgICAgICAgICAgICAgIHt7ICdDZXJ0aWZpY2F0ZSBuYW1lJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgaW5wdXQtZ3JvdXAtZWRpdGFibGVcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidHJ1c3RlZENlcnRpZmljYXRlLm5hbWVcIlxuICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYnRuXCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ1VwZGF0ZSBjZXJ0aWZpY2F0ZSBuYW1lJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDZXJ0aWZpY2F0ZSh0cnVzdGVkQ2VydGlmaWNhdGUsIHsgbmFtZTogdHJ1c3RlZENlcnRpZmljYXRlLm5hbWUgfSlcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXRydXN0ZWRDZXJ0aWZpY2F0ZS5uYW1lXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge3sgJ1NhdmUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMVwiPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtN1wiPlxuICAgICAgICAgICAgPGM4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY2VydEluUGVtRm9ybWF0XCIgY2xhc3M9XCJjb250cm9sLWxhYmVsXCIgdHJhbnNsYXRlPkNlcnRpZmljYXRlPC9sYWJlbD5cbiAgICAgICAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbm8tcmVzaXplXCJcbiAgICAgICAgICAgICAgICBpZD1cImNlcnRJblBlbUZvcm1hdFwiXG4gICAgICAgICAgICAgICAgbmFtZT1cImNlcnRJblBlbUZvcm1hdFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIHJvd3M9XCI3XCJcbiAgICAgICAgICAgICAgICByZWFkb25seVxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidHJ1c3RlZENlcnRpZmljYXRlLmNlcnRJblBlbUZvcm1hdFwiXG4gICAgICAgICAgICAgID48L3RleHRhcmVhPlxuICAgICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgPGxhYmVsIHRpdGxlPVwie3sgJ0F1dG8gcmVnaXN0cmF0aW9uJyB8IHRyYW5zbGF0ZSB9fVwiIGNsYXNzPVwiYzh5LWNoZWNrYm94XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ0cnVzdGVkQ2VydGlmaWNhdGUuYXV0b1JlZ2lzdHJhdGlvbkVuYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNlcnRpZmljYXRlKHRydXN0ZWRDZXJ0aWZpY2F0ZSwgeyBhdXRvUmVnaXN0cmF0aW9uRW5hYmxlZDogJGV2ZW50IH0pXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7ICdBdXRvIHJlZ2lzdHJhdGlvbicgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZCBmb3JtLWJsb2NrXCIgdHJhbnNsYXRlPkFkZGl0aW9uYWwgcHJvcGVydGllczwvZGl2PlxuICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC11bnN0eWxlZFwiPlxuICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJwLXQtNCBwLWItNCBkLWZsZXggc2VwYXJhdG9yLWJvdHRvbSBmbGV4LXdyYXBcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzbWFsbCBtLWItMCBtLXItOCBhLXMtc3RhcnQgZmxleC1ncm93XCI+XG4gICAgICAgICAgICAgICAgICB7eyAnQWxnb3JpdGhtJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtLWwtYXV0byB0ZXh0LWJyZWFrLXdvcmRcIj5cbiAgICAgICAgICAgICAgICAgIHt7IHRydXN0ZWRDZXJ0aWZpY2F0ZS5hbGdvcml0aG1OYW1lIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJwLXQtNCBwLWItNCBkLWZsZXggc2VwYXJhdG9yLWJvdHRvbSBmbGV4LXdyYXBcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzbWFsbCBtLWItMCBtLXItOCBhLXMtc3RhcnQgZmxleC1ncm93XCI+XG4gICAgICAgICAgICAgICAgICB7eyAnVmVyc2lvbicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibS1sLWF1dG8gdGV4dC1icmVhay13b3JkXCI+XG4gICAgICAgICAgICAgICAgICB7eyB0cnVzdGVkQ2VydGlmaWNhdGUudmVyc2lvbiB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPGxpIGNsYXNzPVwicC10LTQgcC1iLTQgZC1mbGV4IHNlcGFyYXRvci1ib3R0b20gZmxleC13cmFwXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic21hbGwgbS1iLTAgbS1yLTggYS1zLXN0YXJ0IGZsZXgtZ3Jvd1wiPlxuICAgICAgICAgICAgICAgICAge3sgJ1ZhbGlkIGZyb20nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm0tbC1hdXRvIHRleHQtYnJlYWstd29yZFwiPlxuICAgICAgICAgICAgICAgICAge3sgdHJ1c3RlZENlcnRpZmljYXRlLm5vdEJlZm9yZSB8IGM4eURhdGUgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIDxsaSBjbGFzcz1cInAtdC00IHAtYi00IGQtZmxleCBzZXBhcmF0b3ItYm90dG9tIGZsZXgtd3JhcFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInNtYWxsIG0tYi0wIG0tci04IGEtcy1zdGFydCBmbGV4LWdyb3dcIj5cbiAgICAgICAgICAgICAgICAgIHt7ICdJc3N1ZXInIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm0tbC1hdXRvIHRleHQtYnJlYWstd29yZFwiPlxuICAgICAgICAgICAgICAgICAge3sgdHJ1c3RlZENlcnRpZmljYXRlLmlzc3VlciB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPGxpIGNsYXNzPVwicC10LTQgcC1iLTQgZC1mbGV4IHNlcGFyYXRvci1ib3R0b20gZmxleC13cmFwXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic21hbGwgbS1iLTAgbS1yLTggYS1zLXN0YXJ0IGZsZXgtZ3Jvd1wiPlxuICAgICAgICAgICAgICAgICAge3sgJ0V4cGlyYXRpb24gZGF0ZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibS1sLWF1dG8gdGV4dC1icmVhay13b3JkXCI+XG4gICAgICAgICAgICAgICAgICB7eyB0cnVzdGVkQ2VydGlmaWNhdGUubm90QWZ0ZXIgfCBjOHlEYXRlIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJwLXQtNCBwLWItNCBkLWZsZXggc2VwYXJhdG9yLWJvdHRvbSBmbGV4LXdyYXBcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzbWFsbCBtLWItMCBtLXItOCBhLXMtc3RhcnQgZmxleC1ncm93XCI+XG4gICAgICAgICAgICAgICAgICB7eyAnU2VyaWFsIG51bWJlcicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibS1sLWF1dG8gdGV4dC1icmVhay13b3JkXCI+XG4gICAgICAgICAgICAgICAgICB7eyB0cnVzdGVkQ2VydGlmaWNhdGUuc2VyaWFsTnVtYmVyIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJwLXQtNCBwLWItNCBkLWZsZXggc2VwYXJhdG9yLWJvdHRvbSBmbGV4LXdyYXBcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzbWFsbCBtLWItMCBtLXItOCBhLXMtc3RhcnQgZmxleC1ncm93XCI+XG4gICAgICAgICAgICAgICAgICB7eyAnU3ViamVjdGBvZiBhIGNlcnRpZmljYXRlYCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibS1sLWF1dG8gdGV4dC1icmVhay13b3JkXCI+XG4gICAgICAgICAgICAgICAgICB7eyB0cnVzdGVkQ2VydGlmaWNhdGUuc3ViamVjdCB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xXCI+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC03XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kIGZvcm0tYmxvY2tcIj5cbiAgICAgICAgICAgICAge3sgJ1Byb29mIG9mIHBvc3Nlc3Npb24nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1oZWxwIGJ0bi1oZWxwLS1zbVwiXG4gICAgICAgICAgICAgICAgcG9wb3Zlcj1cInt7IFBST09GX09GX1BPU1NFU1NJT05fUE9QT1ZFUiB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInSGVscCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIHRyaWdnZXJzPVwiZm9jdXNcIlxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cInJpZ2h0XCJcbiAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidHJ1c3RlZENlcnRpZmljYXRlLnByb29mT2ZQb3NzZXNzaW9uVmFsaWRcIj5cbiAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdQcm9vZiBvZiBwb3NzZXNzaW9uJyB8IHRyYW5zbGF0ZSB9fTogIHt7XG4gICAgICAgICAgICAgICAgICAnQ29tcGxldGVgcHJvb2Ygb2YgcG9zc2Vzc2lvbmAnIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgfX1cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaWNvbi1mbGV4XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJzdWNjZXNzXCIgY2xhc3M9XCJ0ZXh0LXN1Y2Nlc3NcIj48L2k+XG4gICAgICAgICAgICAgICAge3sgJ0NvbXBsZXRlYHByb29mIG9mIHBvc3Nlc3Npb25gJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhdHJ1c3RlZENlcnRpZmljYXRlLnByb29mT2ZQb3NzZXNzaW9uVmFsaWRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtLWItMTZcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ1Byb29mIG9mIHBvc3Nlc3Npb24nIHwgdHJhbnNsYXRlIH19OiAge3tcbiAgICAgICAgICAgICAgICAgICAgICAnSW5jb21wbGV0ZWBwcm9vZiBvZiBwb3NzZXNzaW9uYCcgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICAgICAgfX1cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImljb24tZmxleFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJ3YXJuaW5nXCIgY2xhc3M9XCJ0ZXh0LXdhcm5pbmdcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdJbmNvbXBsZXRlYHByb29mIG9mIHBvc3Nlc3Npb25gJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNiBjb2wtbGctNiB0ZXh0LXJpZ2h0LW1kXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbGFiZWwtc21hbGwgbS1yLTRcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ1ZlcmlmaWNhdGlvbiBjb2RlIGV4cGlyZXMvZXhwaXJlZCBvbicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICh0cnVzdGVkQ2VydGlmaWNhdGUucHJvb2ZPZlBvc3Nlc3Npb25WZXJpZmljYXRpb25Db2RlVXNhYmxlVW50aWwgfCBjOHlEYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICctLS0nXG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNiBjb2wtbGctNlwiPlxuICAgICAgICAgICAgICAgICAgPGM4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwidW5zaWduZWRWZXJpZmljYXRpb25Db2RlXCIgY2xhc3M9XCJjb250cm9sLWxhYmVsXCIgdHJhbnNsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgIFZlcmlmaWNhdGlvbiBjb2RlXG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIG5vLXJlc2l6ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZT1cInVuc2lnbmVkVmVyaWZpY2F0aW9uQ29kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ1bnNpZ25lZFZlcmlmaWNhdGlvbkNvZGVcIlxuICAgICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgIHJvd3M9XCI1XCJcbiAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInRydXN0ZWRDZXJ0aWZpY2F0ZS5wcm9vZk9mUG9zc2Vzc2lvblVuc2lnbmVkVmVyaWZpY2F0aW9uQ29kZVwiXG4gICAgICAgICAgICAgICAgICAgID48L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ1JlZ2VuZXJhdGUgdmVyaWZpY2F0aW9uIGNvZGUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc21cIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZWdlbmVyYXRlVW5zaWduZWRWZXJpZmljYXRpb25Db2RlKHRydXN0ZWRDZXJ0aWZpY2F0ZSlcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAge3sgJ1JlZ2VuZXJhdGVgdmVyaWZpY2F0aW9uIGNvZGVgJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1kZWZhdWx0IG0tbC1hdXRvIG0tci0wXCJcbiAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwPVwie3sgJ0NvcHkgdG8gY2xpcGJvYXJkJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2RlbGF5XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInQ29weSB0byBjbGlwYm9hcmQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXRydXN0ZWRDZXJ0aWZpY2F0ZS5wcm9vZk9mUG9zc2Vzc2lvblVuc2lnbmVkVmVyaWZpY2F0aW9uQ29kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvcHlVbnNpZ25lZFZlcmlmaWNhdGlvbkNvZGVUb0NsaXBib2FyZCh0cnVzdGVkQ2VydGlmaWNhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJjbGlwYm9hcmRcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNtXCJcbiAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwPVwie3sgJ0Rvd25sb2FkIGFzIGZpbGUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICBbZGVsYXldPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidEb3dubG9hZCBhcyBmaWxlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiF0cnVzdGVkQ2VydGlmaWNhdGUucHJvb2ZPZlBvc3Nlc3Npb25VbnNpZ25lZFZlcmlmaWNhdGlvbkNvZGVcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkb3dubG9hZFVuc2lnbmVkVmVyaWZpY2F0aW9uQ29kZSh0cnVzdGVkQ2VydGlmaWNhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJkb3dubG9hZFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNiBjb2wtbGctNlwiPlxuICAgICAgICAgICAgICAgICAgPGM4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwic2lnbmVkVmVyaWZpY2F0aW9uQ29kZVwiIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7ICdTaWduZWQgdmVyaWZpY2F0aW9uIGNvZGUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1oZWxwIGJ0bi1oZWxwLS1zbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3BvdmVyPVwie3sgU0lHTkVEX1ZFUklGSUNBVElPTl9DT0RFX1BPUE9WRVIgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInSGVscCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJ0b3BcIlxuICAgICAgICAgICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbm8tcmVzaXplXCJcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwic2lnbmVkVmVyaWZpY2F0aW9uQ29kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgaWQ9XCJzaWduZWRWZXJpZmljYXRpb25Db2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgcm93cz1cIjVcIlxuICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2lnbmVkVmVyaWZpY2F0aW9uQ29kZVwiXG4gICAgICAgICAgICAgICAgICAgID48L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ1ZlcmlmeSBzaWduZWQgdmVyaWZpY2F0aW9uIGNvZGUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc21cIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlcmlmeVNpZ25lZFZlcmlmaWNhdGlvbkNvZGUodHJ1c3RlZENlcnRpZmljYXRlLCBzaWduZWRWZXJpZmljYXRpb25Db2RlKVxuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFzaWduZWRWZXJpZmljYXRpb25Db2RlXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIHt7ICdWZXJpZnlgc2lnbmVkIHZlcmlmaWNhdGlvbiBjb2RlYCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tc20gYnRuLWRlZmF1bHQgbS1sLWF1dG9cIlxuICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXA9XCJ7eyAnVXBsb2FkIGZpbGUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICBbZGVsYXldPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidVcGxvYWQgZmlsZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJmaWxlSW5wdXQuY2xpY2soKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwidXBsb2FkXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0ICNmaWxlSW5wdXQgdHlwZT1cImZpbGVcIiAoY2hhbmdlKT1cIm9uRmlsZUlucHV0KCRldmVudClcIiBjbGFzcz1cImhpZGRlblwiIC8+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2M4eS1saS1jb2xsYXBzZT5cbiAgPC9jOHktbGk+XG48L2M4eS1saXN0LWdyb3VwPlxuIl19
|
|
152
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ1c3RlZC1jZXJ0aWZpY2F0ZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHJ1c3RlZC1jZXJ0aWZpY2F0ZXMvdHJ1c3RlZC1jZXJ0aWZpY2F0ZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vdHJ1c3RlZC1jZXJ0aWZpY2F0ZXMvdHJ1c3RlZC1jZXJ0aWZpY2F0ZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEcsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDckYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBb0MseUJBQXlCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDMUYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUN6RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7Ozs7Ozs7Ozs7O0FBT25DLE1BQU0sT0FBTyw0QkFBNEI7SUF1QnZDLFlBQ1UsT0FBdUIsRUFDdkIsWUFBMEIsRUFDMUIseUJBQW9ELEVBQ3BELFlBQTBCLEVBQzFCLGdCQUFrQyxFQUNsQyxnQkFBa0M7UUFMbEMsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFDdkIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFD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WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlLCBDbGlwYm9hcmRTZXJ2aWNlLCBnZXR0ZXh0LCBNb2RhbFNlcnZpY2UsIFN0YXR1cyB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgQWRkVHJ1c3RlZENlcnRpZmljYXRlQ29tcG9uZW50IH0gZnJvbSAnLi9hZGQtdHJ1c3RlZC1jZXJ0aWZpY2F0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnNNb2RhbFNlcnZpY2UgfSBmcm9tICduZ3gtYm9vdHN0cmFwL21vZGFsJztcbmltcG9ydCB7IElSZXN1bHRMaXN0LCBJVHJ1c3RlZENlcnRpZmljYXRlLCBUcnVzdGVkQ2VydGlmaWNhdGVTZXJ2aWNlIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgdGFwLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBwaXBlLCBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHNhdmVBcyB9IGZyb20gJ2ZpbGUtc2F2ZXInO1xuaW1wb3J0IHsgYXNzaWduIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IFRydXN0ZWRDZXJ0aWZpY2F0ZSB9IGZyb20gJy4vdHJ1c3RlZC1jZXJ0aWZpY2F0ZS5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS10cnVzdGVkLWNlcnRpZmljYXRlcycsXG4gIHRlbXBsYXRlVXJsOiAnLi90cnVzdGVkLWNlcnRpZmljYXRlcy5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgVHJ1c3RlZENlcnRpZmljYXRlc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIFBST09GX09GX1BPU1NFU1NJT05fUE9QT1ZFUiA9IGdldHRleHQoXG4gICAgJ1wiUHJvb2Ygb2YgcG9zc2Vzc2lvblwiIGlzIGEgc2VjdXJpdHkgbWV0aG9kIHVzZWQgdG8gcHJvdmUgdGhhdCB3aG9ldmVyIHNlbmRzIGEgbWVzc2FnZSBpcyBhbHNvIGluIHRoZSBwb3NzZXNzaW9uIG9mIHRoZSBwYXJ0aWN1bGFyIGNyeXB0b2dyYXBoaWMga2V5LidcbiAgKTtcbiAgU0lHTkVEX1ZFUklGSUNBVElPTl9DT0RFX1BPUE9WRVIgPSBnZXR0ZXh0KFxuICAgICdVc2UgdGhlIGZvbGxvd2luZyBvcGVuc3NsIGNvbW1hbmQgdG8gY3JlYXRlIHRoZSBzaWduZWQgdmVyaWZpY2F0aW9uIGNvZGU6IG9wZW5zc2wgZGdzdCAtc2hhMjU2IC1zaWduIDxwcml2YXRlLmtleT4gPHZlcmlmaWNhdGlvbl9jb2RlLnR4dD4gfCBvcGVuc3NsIGJhc2U2NCAtQSdcbiAgKTtcblxuICByZWxvYWRpbmc6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICByZWxvYWQ6IEJlaGF2aW9yU3ViamVjdDx2b2lkPiA9IG5ldyBCZWhhdmlvclN1YmplY3QobnVsbCk7XG4gIHRydXN0ZWRDZXJ0aWZpY2F0ZXM6IE9ic2VydmFibGU8SVJlc3VsdExpc3Q8SVRydXN0ZWRDZXJ0aWZpY2F0ZT4+ID0gdGhpcy5yZWxvYWQucGlwZShcbiAgICB0YXAoKCkgPT4gdGhpcy5yZWxvYWRpbmcubmV4dCh0cnVlKSksXG4gICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuZ2V0VHJ1c3RlZENlcnRpZmljYXRlcygpKSxcbiAgICB0YXAoKCkgPT4gdGhpcy5yZWxvYWRpbmcubmV4dChmYWxzZSkpXG4gICk7XG4gIHNvcnRCeUV4cGlyYXRpb25EYXRlQXNjID0gcGlwZShcbiAgICB0YXAoKHJlc3VsdHM6IElUcnVzdGVkQ2VydGlmaWNhdGVbXSkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3VsdHMuc29ydCgobjEsIG4yKSA9PiBuMS5ub3RBZnRlci5sb2NhbGVDb21wYXJlKG4yLm5vdEFmdGVyKSk7XG4gICAgfSlcbiAgKTtcblxuICBzaWduZWRWZXJpZmljYXRpb25Db2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBic01vZGFsOiBCc01vZGFsU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJ1c3RlZENlcnRpZmljYXRlU2VydmljZTogVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZSxcbiAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTW9kYWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIGNsaXBib2FyZFNlcnZpY2U6IENsaXBib2FyZFNlcnZpY2VcbiAgKSB7fVxuXG4gIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIGF3YWl0IHRoaXMubG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoKTtcbiAgfVxuXG4gIGFzeW5jIGxvYWRUcnVzdGVkQ2VydGlmaWNhdGVzKCkge1xuICAgIHRoaXMucmVsb2FkLm5leHQoKTtcbiAgfVxuXG4gIGdldFRydXN0ZWRDZXJ0aWZpY2F0ZXMoKSB7XG4gICAgY29uc3QgZmlsdGVyOiBvYmplY3QgPSB7XG4gICAgICBwYWdlU2l6ZTogMTAwMCxcbiAgICAgIHdpdGhUb3RhbFBhZ2VzOiB0cnVlXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy50cnVzdGVkQ2VydGlmaWNhdGVTZXJ2aWNlLmxpc3QoZmlsdGVyKTtcbiAgfVxuXG4gIGFzeW5jIGFkZFRydXN0ZWRDZXJ0aWZpY2F0ZSgpIHtcbiAgICBjb25zdCBtb2RhbCA9IHRoaXMuYnNNb2RhbC5zaG93KEFkZFRydXN0ZWRDZXJ0aWZpY2F0ZUNvbXBvbmVudCwge1xuICAgICAgY2xhc3M6ICdtb2RhbC1zbScsXG4gICAgICBhcmlhRGVzY3JpYmVkYnk6ICdhZGRDZXJ0aWZpY2F0ZU1vZGFsRGVzY3JpcHRpb24nLFxuICAgICAgYXJpYUxhYmVsbGVkQnk6ICdhZGRDZXJ0aWZpY2F0ZU1vZGFsVGl0bGUnLFxuICAgICAgaWdub3JlQmFja2Ryb3BDbGljazogdHJ1ZVxuICAgIH0pLmNvbnRlbnQgYXMgQWRkVHJ1c3RlZENlcnRpZmljYXRlQ29tcG9uZW50O1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBtb2RhbC5yZXN1bHQ7XG4gICAgICBtb2RhbC5jbG9zZSgpO1xuICAgICAgdGhpcy5yZWxvYWQubmV4dCgpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlVHJ1c3RlZENlcnRpZmljYXRlKGNlcnRpZmljYXRlKSB7XG4gICAgY29uc3QgdGl0bGUgPSBnZXR0ZXh0KCdEZWxldGUgdHJ1c3RlZCBjZXJ0aWZpY2F0ZScpO1xuICAgIGNvbnN0IGNvbmZpcm1hdGlvblRleHQgPSBnZXR0ZXh0KFxuICAgICAgJ1lvdSBhcmUgYWJvdXQgdG8gZGVsZXRlIGEgdHJ1c3RlZCBjZXJ0aWZpY2F0ZSBcInt7IGNlcnRpZmljYXRlTmFtZSB9fVwiLidcbiAgICApO1xuICAgIGNvbnN0IGZpbmFsUXVlc3Rpb24gPSBnZXR0ZXh0KCdEbyB5b3Ugd2FudCB0byBwcm9jZWVkPycpO1xuICAgIGNvbnN0IGNlcnRpZmljYXRlTmFtZSA9IGNlcnRpZmljYXRlLm5hbWU7XG4gICAgY29uc3QgYm9keSA9IFtcbiAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGNvbmZpcm1hdGlvblRleHQsIHtcbiAgICAgICAgY2VydGlmaWNhdGVOYW1lXG4gICAgICB9KSxcbiAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGZpbmFsUXVlc3Rpb24pXG4gICAgXS5qb2luKCcgJyk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5tb2RhbFNlcnZpY2UuY29uZmlybSh0aXRsZSwgYm9keSwgU3RhdHVzLkRBTkdFUiwgeyBvazogZ2V0dGV4dCgnRGVsZXRlJykgfSk7XG4gICAgICBhd2FpdCB0aGlzLnRydXN0ZWRDZXJ0aWZpY2F0ZVNlcnZpY2UuZGVsZXRlKGNlcnRpZmljYXRlLmZpbmdlcnByaW50KTtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnN1Y2Nlc3MoZ2V0dGV4dCgnQ2VydGlmaWNhdGUgZGVsZXRlZC4nKSk7XG4gICAgICB0aGlzLnJlbG9hZC5uZXh0KCk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZFNlcnZlckZhaWx1cmUoZXgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUNlcnRpZmljYXRlKFxuICAgIHRydXN0ZWRDZXJ0aWZpY2F0ZTogSVRydXN0ZWRDZXJ0aWZpY2F0ZSxcbiAgICB1cGRhdGluZ1BhcnQ6IFBhcnRpYWw8SVRydXN0ZWRDZXJ0aWZpY2F0ZT5cbiAgKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMudHJ1c3RlZENlcnRpZmljYXRlU2VydmljZS51cGRhdGUoe1xuICAgICAgICBmaW5nZXJwcmludDogdHJ1c3RlZENlcnRpZmljYXRlLmZpbmdlcnByaW50LFxuICAgICAgICAuLi51cGRhdGluZ1BhcnRcbiAgICAgIH0pO1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2Uuc3VjY2VzcyhnZXR0ZXh0KCdDZXJ0aWZpY2F0ZSBzYXZlZC4nKSk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZFNlcnZlckZhaWx1cmUoZXgpO1xuICAgIH1cbiAgfVxuXG4gIGhpZ2hsaWdodERlcGVuZGluZ09uRXhwaXJhdGlvblN0YXR1cyhpdGVtOiBJVHJ1c3RlZENlcnRpZmljYXRlKSB7XG4gICAgY29uc3Qgd2FybmluZ09mZnNldCA9IDI0ICogNjAgKiA2MCAqIDEwMDAgKiA5MDsgLy8gOTAgZGF5c1xuICAgIGNvbnN0IHRvZGF5VGltZXN0YW1wID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgY29uc3Qgd2FybmluZ1RpbWVzdGFtcCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpICsgd2FybmluZ09mZnNldDtcbiAgICBjb25zdCBub3RBZnRlclRpbWVzdGFtcCA9IG5ldyBEYXRlKGl0ZW0ubm90QWZ0ZXIpLmdldFRpbWUoKTtcbiAgICBjb25zdCBleHBpcmVkID0gbm90QWZ0ZXJUaW1lc3RhbXAgPCB0b2RheVRpbWVzdGFtcDtcbiAgICBjb25zdCBleHBpcmVzSW5MZXNzVGhhbjkwRGF5cyA9IG5vdEFmdGVyVGltZXN0YW1wIDwgd2FybmluZ1RpbWVzdGFtcDtcbiAgICBpZiAoZXhwaXJlZCkge1xuICAgICAgcmV0dXJuICd0ZXh0LWRhbmdlcic7XG4gICAgfVxuICAgIGlmIChleHBpcmVzSW5MZXNzVGhhbjkwRGF5cykge1xuICAgICAgcmV0dXJuICd0ZXh0LXdhcm5pbmcnO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICByZWdlbmVyYXRlVW5zaWduZWRWZXJpZmljYXRpb25Db2RlKHRydXN0ZWRDZXJ0aWZpY2F0ZTogSVRydXN0ZWRDZXJ0aWZpY2F0ZSkge1xuICAgIHRoaXMudHJ1c3RlZENlcnRpZmljYXRlU2VydmljZS5yZWdlbmVyYXRlUG9QVmVyaWZpY2F0aW9uQ29kZSh0cnVzdGVkQ2VydGlmaWNhdGUpLnRoZW4oXG4gICAgICAoeyBkYXRhIH0pID0+IHtcbiAgICAgICAgYXNzaWduKHRydXN0ZWRDZXJ0aWZpY2F0ZSwgZGF0YSk7XG4gICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnN1Y2Nlc3MoZ2V0dGV4dCgnVmVyaWZpY2F0aW9uIGNvZGUgcmVnZW5lcmF0ZWQuJykpO1xuICAgICAgfSxcbiAgICAgIGV4ID0+IHRoaXMuYWxlcnRTZXJ2aWNlLmFkZFNlcnZlckZhaWx1cmUoZXgpXG4gICAgKTtcbiAgfVxuXG4gIHZlcmlmeVNpZ25lZFZlcmlmaWNhdGlvbkNvZGUodHJ1c3RlZENlcnRpZmljYXRlOiBUcnVzdGVkQ2VydGlmaWNhdGUpIHtcbiAgICB0aGlzLnRydXN0ZWRDZXJ0aWZpY2F0ZVNlcnZpY2VcbiAgICAgIC52ZXJpZnlTaWduZWRWZXJpZmljYXRpb25Db2RlKHRydXN0ZWRDZXJ0aWZpY2F0ZSwgdHJ1c3RlZENlcnRpZmljYXRlLnNpZ25lZFZlcmlmaWNhdGlvbkNvZGUpXG4gICAgICAudGhlbihcbiAgICAgICAgKHsgZGF0YSB9KSA9PiB7XG4gICAgICAgICAgYXNzaWduKHRydXN0ZWRDZXJ0aWZpY2F0ZSwgZGF0YSk7XG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2Uuc3VjY2VzcyhnZXR0ZXh0KCdTaWduZWQgdmVyaWZpY2F0aW9uIGNvZGUgdmVyaWZpZWQuJykpO1xuICAgICAgICB9LFxuICAgICAgICBleCA9PiB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGV4KVxuICAgICAgKTtcbiAgfVxuXG4gIGRvd25sb2FkVW5zaWduZWRWZXJpZmljYXRpb25Db2RlKHRydXN0ZWRDZXJ0aWZpY2F0ZTogSVRydXN0ZWRDZXJ0aWZpY2F0ZSkge1xuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbdHJ1c3RlZENlcnRpZmljYXRlLnByb29mT2ZQb3NzZXNzaW9uVW5zaWduZWRWZXJpZmljYXRpb25Db2RlXSk7XG4gICAgY29uc3QgZmlsZU5hbWUgPSB0cnVzdGVkQ2VydGlmaWNhdGUubmFtZTtcbiAgICBzYXZlQXMoYmxvYiwgYCR7ZmlsZU5hbWV9LnR4dGApO1xuICB9XG5cbiAgY29weVVuc2lnbmVkVmVyaWZpY2F0aW9uQ29kZVRvQ2xpcGJvYXJkKHRydXN0ZWRDZXJ0aWZpY2F0ZTogSVRydXN0ZWRDZXJ0aWZpY2F0ZSkge1xuICAgIHRoaXMuY2xpcGJvYXJkU2VydmljZS53cml0ZVRleHQodHJ1c3RlZENlcnRpZmljYXRlLnByb29mT2ZQb3NzZXNzaW9uVW5zaWduZWRWZXJpZmljYXRpb25Db2RlKTtcbiAgfVxuXG4gIG9uRmlsZUlucHV0KGV2ZW50LCB0cnVzdGVkQ2VydGlmaWNhdGU6IFRydXN0ZWRDZXJ0aWZpY2F0ZSkge1xuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0O1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgIHRydXN0ZWRDZXJ0aWZpY2F0ZS5zaWduZWRWZXJpZmljYXRpb25Db2RlID0gcmVhZGVyLnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgfTtcbiAgICByZWFkZXIucmVhZEFzVGV4dChpbnB1dC5maWxlc1swXSk7XG4gIH1cbn1cbiIsIjxjOHktdGl0bGU+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+XG4gICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIG5vLXJlc2l6ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZT1cInNpZ25lZFZlcmlmaWNhdGlvbkNvZGVcIlxuICAgICAgICAgICAgICAgICAgICAgIGlkPVwic2lnbmVkVmVyaWZpY2F0aW9uQ29kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgIHJvd3M9XCI1XCJcbiAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInRydXN0ZWRDZXJ0aWZpY2F0ZS5zaWduZWRWZXJpZmljYXRpb25Db2RlXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnVmVyaWZ5IHNpZ25lZCB2ZXJpZmljYXRpb24gY29kZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1zbVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgdmVyaWZ5U2lnbmVkVmVyaWZpY2F0aW9uQ29kZSh0cnVzdGVkQ2VydGlmaWNhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXRydXN0ZWRDZXJ0aWZpY2F0ZS5zaWduZWRWZXJpZmljYXRpb25Db2RlXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIHt7ICdWZXJpZnlgc2lnbmVkIHZlcmlmaWNhdGlvbiBjb2RlYCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tc20gYnRuLWRlZmF1bHQgbS1sLWF1dG9cIlxuICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXA9XCJ7eyAnVXBsb2FkIGZpbGUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICBbZGVsYXldPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidVcGxvYWQgZmlsZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJmaWxlSW5wdXQuY2xpY2soKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwidXBsb2FkXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0ICNmaWxlSW5wdXQgdHlwZT1cImZpbGVcIiAoY2hhbmdlKT1cIm9uRmlsZUlucHV0KCRldmVudCwgdHJ1c3RlZENlcnRpZmljYXRlKVwiIGNsYXNzPVwiaGlkZGVuXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvYzh5LWxpLWNvbGxhcHNlPlxuICA8L2M4eS1saT5cbjwvYzh5LWxpc3QtZ3JvdXA+XG4iXX0=
|