@valtimo/dossier 12.12.0 → 12.14.0

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.
@@ -120,11 +120,12 @@ export class DossierDetailComponent extends PendingChangesComponent {
120
120
  ...status,
121
121
  tagType: InternalCaseStatusUtils.getTagTypeFromInternalCaseStatusColor(status.color),
122
122
  }));
123
- this.caseTags$ = this.documentDefinitionName$.pipe(filter(documentDefinitionName => !!documentDefinitionName), switchMap(documentDefinitionName => this._caseTags$), map(tag => tag &&
123
+ this.caseTags$ = this.documentDefinitionName$.pipe(filter(documentDefinitionName => !!documentDefinitionName), switchMap(() => this._caseTags$), map(tag => tag &&
124
124
  tag.map(caseTag => ({
125
125
  ...caseTag,
126
126
  tagType: CaseTagsUtils.getTagTypeFromCaseTagColor(caseTag.color),
127
127
  }))));
128
+ this.hasCaseTags$ = this._caseTags$.pipe(map(caseTags => Array.isArray(caseTags) && caseTags.length > 0));
128
129
  this.userId$ = of(this.keyCloakService.isLoggedIn()).pipe(switchMap(() => this.keyCloakService.loadUserProfile()), map(profile => profile?.id));
129
130
  this.isAssigning$ = new BehaviorSubject(false);
130
131
  this.isAssignedToCurrentUser$ = combineLatest([
@@ -152,6 +153,7 @@ export class DossierDetailComponent extends PendingChangesComponent {
152
153
  this.noTabsConfigured$ = new BehaviorSubject(false);
153
154
  this.showNoAccess$ = new BehaviorSubject(false);
154
155
  this.compactMode$ = this.pageHeaderService.compactMode$;
156
+ this.smallTitle$ = this.pageHeaderService.smallTitle$;
155
157
  this.tabHorizontalOverflowDisabled = this.dossierTabService.tabHorizontalOverflowDisabled;
156
158
  this.showTaskList$ = this.dossierTabService.showTaskList$;
157
159
  this._activeTabName$ = new BehaviorSubject(null);
@@ -175,12 +177,14 @@ export class DossierDetailComponent extends PendingChangesComponent {
175
177
  this.setDocumentStyle();
176
178
  this.enableResetOnBackNavigation();
177
179
  this.openWidgetProcessSubscription();
180
+ this.openSmallTitleSubscription();
178
181
  }
179
182
  ngOnDestroy() {
180
183
  this.breadcrumbService.clearSecondBreadcrumb();
181
184
  this.pageTitleService.enableReset();
182
185
  this.removeDocumentStyle();
183
186
  this._subscriptions.unsubscribe();
187
+ this.pageHeaderService.disableSmallTitle();
184
188
  }
185
189
  getAllAssociatedProcessDefinitions() {
186
190
  this._subscriptions.add(combineLatest([
@@ -457,12 +461,22 @@ export class DossierDetailComponent extends PendingChangesComponent {
457
461
  ? DOSSIER_DETAIL_START_PROCESS_DROPDOWN_WIDTH.medium
458
462
  : DOSSIER_DETAIL_START_PROCESS_DROPDOWN_WIDTH.large);
459
463
  }
464
+ openSmallTitleSubscription() {
465
+ this._subscriptions.add(combineLatest([this.hasCaseTags$, this.compactMode$]).subscribe(([hasCaseTags, compactMode]) => {
466
+ if (!compactMode && hasCaseTags) {
467
+ this.pageHeaderService.enableSmallTitle();
468
+ }
469
+ else {
470
+ this.pageHeaderService.disableSmallTitle();
471
+ }
472
+ }));
473
+ }
460
474
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DossierDetailComponent, deps: [{ token: i1.BreadcrumbService }, { token: i2.CaseStatusService }, { token: i1.CdsThemeService }, { token: i0.ComponentFactoryResolver }, { token: i3.ConfigService }, { token: i2.DocumentService }, { token: i4.DossierDetailLayoutService }, { token: i4.DossierService }, { token: i4.DossierTabService }, { token: i5.IconService }, { token: i6.KeycloakService }, { token: i7.NGXLogger }, { token: i5.NotificationService }, { token: i1.PageHeaderService }, { token: i1.PageTitleService }, { token: i8.PermissionService }, { token: i9.TranslateService }, { token: i0.Renderer2 }, { token: i10.ActivatedRoute }, { token: i10.Router }, { token: i11.WidgetsService }, { token: i12.UserProviderService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }
461
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: DossierDetailComponent, selector: "valtimo-dossier-detail", providers: [DossierTabService, DossierDetailLayoutService, NotificationService], viewQueries: [{ propertyName: "supportingProcessStart", first: true, predicate: ["supportingProcessStartModal"], descendants: true }, { propertyName: "viewContainerRef", first: true, predicate: ["tabContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "_tabContentContainer", first: true, predicate: ["tabContentContainer"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n<div\n class=\"main-content\"\n [ngClass]=\"{'main-content--no-horizontal-overflow': tabHorizontalOverflowDisabled()}\"\n>\n <div class=\"container-fluid\">\n <ng-container *ngIf=\"caseTags$ | async as caseTags\">\n @if (caseTags && caseTags.length > 0) {\n <div class=\"spacing-case-tags\">\n @for (tag of caseTags; track tag) {\n <cds-tag size=\"sm\" [type]=\"tag.tagType\">\n {{ tag.title }}\n </cds-tag>\n }\n </div>\n }\n </ng-container>\n\n <ng-container *ngTemplateOutlet=\"tabs\"></ng-container>\n\n <ng-template #tabs>\n <ng-container *ngIf=\"{activeTab: activeTab$ | async} as obs\">\n <cds-tabs *ngIf=\"tabLoader\" type=\"inline\" class=\"case-detail-tabs\">\n <cds-tab\n *ngFor=\"let tab of tabLoader.tabs\"\n [active]=\"tab.name === (activeTabName$ | async)\"\n heading=\"{{ tab | tabTranslate | async }}\"\n (selected)=\"onTabSelected(tab, obs.activeTab)\"\n ></cds-tab>\n </cds-tabs>\n </ng-container>\n </ng-template>\n <div\n #tabContentContainer\n class=\"tab-content-container\"\n [ngClass]=\"{\n 'tab-content-container--dark': isDarkMode$ | async,\n 'tab-content-container--compact': compactMode$ | async,\n }\"\n *ngIf=\"{\n noTabsConfigured: noTabsConfigured$ | async,\n showTaskList: showTaskList$ | async,\n showNoAccess: showNoAccess$ | async,\n dossierDetailLayout: dossierDetailLayout$ | async,\n openTaskAndProcessLinkInModal: openTaskAndProcessLinkInModal$ | async,\n taskAndProcessLinkOpenedInPanel: taskAndProcessLinkOpenedInPanel$ | async,\n } as tabContentObs\"\n >\n <as-split\n direction=\"horizontal\"\n [disabled]=\"!tabContentObs.dossierDetailLayout.widthAdjustable\"\n [gutterSize]=\"DOSSIER_DETAIL_GUTTER_SIZE\"\n [unit]=\"tabContentObs.dossierDetailLayout.unit\"\n >\n <as-split-area\n [size]=\"tabContentObs.dossierDetailLayout.leftPanelWidth\"\n [minSize]=\"tabContentObs.dossierDetailLayout.leftPanelMinWidth\"\n [maxSize]=\"tabContentObs.dossierDetailLayout.leftPanelMaxWidth\"\n >\n <div\n class=\"card-body bg-white p-5 position-relative tab-container\"\n [class.tab-container--compact]=\"compactMode$ | async\"\n >\n <div *ngIf=\"loadingTabs$ | async\" class=\"loading-container\">\n <cds-loading></cds-loading>\n </div>\n\n <valtimo-no-results\n *ngIf=\"tabContentObs.showNoAccess\"\n description=\"{{ 'dossier.noAccess.description' | translate }}\"\n title=\"{{ 'dossier.noAccess.title' | translate }}\"\n illustration=\"valtimo-layout/img/emptystate-not-authorised.svg\"\n >\n </valtimo-no-results>\n\n <valtimo-no-results\n *ngIf=\"tabContentObs.noTabsConfigured\"\n [description]=\"'dossier.tabs.noResultsDescription' | translate\"\n [title]=\"'dossier.tabs.noResults' | translate\"\n ></valtimo-no-results>\n\n <ng-template #tabContainer></ng-template>\n\n <div class=\"clearfix\"></div>\n </div>\n </as-split-area>\n\n <as-split-area\n *ngIf=\"tabContentObs.dossierDetailLayout.showRightPanel\"\n [size]=\"tabContentObs.dossierDetailLayout.rightPanelWidth\"\n [minSize]=\"tabContentObs.dossierDetailLayout.rightPanelMinWidth\"\n [maxSize]=\"tabContentObs.dossierDetailLayout.rightPanelMaxWidth\"\n >\n @if (tabContentObs.showTaskList) {\n <div class=\"task-panel\">\n @if (!tabContentObs.taskAndProcessLinkOpenedInPanel) {\n <valtimo-dossier-detail-task-list\n [openTaskAndProcessLinkInModal]=\"tabContentObs.openTaskAndProcessLinkInModal\"\n (taskClickEvent)=\"onTaskClickEvent($event)\"\n (formSubmitEvent)=\"onFormSubmitEvent()\"\n ></valtimo-dossier-detail-task-list>\n }\n\n @if (tabContentObs.taskAndProcessLinkOpenedInPanel) {\n <valtimo-dossier-detail-task-detail\n [taskAndProcessLink]=\"tabContentObs.taskAndProcessLinkOpenedInPanel\"\n (activeChange)=\"onActiveChangeEvent($event)\"\n (closeEvent)=\"onTaskDetailsClose()\"\n (formSubmit)=\"onFormSubmitEvent()\"\n >\n </valtimo-dossier-detail-task-detail>\n }\n </div>\n }\n </as-split-area>\n </as-split>\n </div>\n </div>\n\n <valtimo-dossier-supporting-process-start-modal\n [isAdmin]=\"isAdmin$ | async\"\n (formSubmit)=\"tabLoader.refreshView()\"\n #supportingProcessStartModal\n ></valtimo-dossier-supporting-process-start-modal>\n</div>\n\n<ng-template\n #caseDetailHeader\n let-canHaveAssignee=\"canHaveAssignee\"\n let-document=\"document\"\n let-canAssign=\"canAssign\"\n>\n <div class=\"row\" *ngIf=\"(customDossierHeaderItems || []).length > 0\">\n <span\n *ngFor=\"let item of customDossierHeaderItems\"\n [ngClass]=\"{\n h1: item.textSize === 'xl',\n h2: item.textSize === 'lg',\n h3: item.textSize === 'md',\n h4: item.textSize === 'sm',\n h5: item.textSize === 'xs',\n }\"\n class=\"mb-0 mt-0 align-self-end col-xl-{{ item.columnSize }} col-lg-{{\n item.columnSize * 2\n }} {{ item.customClass }}\"\n >\n <span *ngIf=\"item.label\">{{ item.label | translate }}</span>\n\n <span *ngIf=\"item.label && item.value\">: </span>\n\n <strong>{{ item.value }}</strong>\n </span>\n </div>\n\n <ng-container\n *ngTemplateOutlet=\"\n caseDetailAssignee;\n context: {canHaveAssignee: canHaveAssignee, document: document, canAssign: canAssign}\n \"\n ></ng-container>\n</ng-template>\n\n<ng-template\n #caseDetailAssignee\n let-canHaveAssignee=\"canHaveAssignee\"\n let-document=\"document\"\n let-canAssign=\"canAssign\"\n>\n <div *ngIf=\"canHaveAssignee && document\">\n <valtimo-dossier-assign-user\n *ngIf=\"canAssignLoaded$ | async\"\n [assigneeFullName]=\"document?.assigneeFullName\"\n [assigneeId]=\"document.assigneeId\"\n [documentId]=\"document.id\"\n [hasPermission]=\"canAssign\"\n (assignmentOfDocumentChanged)=\"assignmentOfDocumentChanged()\"\n ></valtimo-dossier-assign-user>\n </div>\n</ng-template>\n\n<ng-template #claimButton let-canClaim=\"canClaim\" let-canHaveAssignee=\"canHaveAssignee\">\n <cds-overflow-menu-option\n *ngIf=\"canClaim && canHaveAssignee\"\n [disabled]=\"(isAssigning$ | async) || (isAssignedToCurrentUser$ | async)\"\n (click)=\"claimAssignee()\"\n >\n {{ 'dossier.claimAssigneeCase' | translate }}\n </cds-overflow-menu-option>\n</ng-template>\n\n<ng-template #unassignButton let-canHaveAssignee=\"canHaveAssignee\" let-assigneeId=\"assigneeId\">\n <cds-overflow-menu-option\n *ngIf=\"canHaveAssignee\"\n [disabled]=\"!assigneeId\"\n (selected)=\"unassignAssignee()\"\n >\n {{ 'assignDocument.remove' | translate }}\n </cds-overflow-menu-option>\n</ng-template>\n\n<ng-template #deleteButton let-canDelete=\"canDelete\">\n <cds-overflow-menu-option\n *ngIf=\"canDelete\"\n [disabled]=\"isDeleting$ | async\"\n (click)=\"deleteDocument()\"\n type=\"danger\"\n >\n {{ 'dossier.delete.delete' | translate }}\n </cds-overflow-menu-option>\n</ng-template>\n\n<ng-template #customStartTrigger>\n <button\n [size]=\"(compactMode$ | async) ? 'sm' : 'lg'\"\n cdsButton=\"primary\"\n [disabled]=\"processDocumentDefinitions.length === 0\"\n [ngbTooltip]=\"processDocumentDefinitions.length === 0 ? 'No action' : null\"\n >\n {{ 'dossier.startSubProcess' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"chevron--down\" size=\"16\"></svg>\n </button>\n</ng-template>\n\n<valtimo-confirmation-modal\n confirmButtonTextTranslationKey=\"dossier.delete.confirm\"\n confirmButtonType=\"danger\"\n contentTranslationKey=\"dossier.delete.description\"\n [showModalSubject$]=\"showDeleteModal$\"\n titleTranslationKey=\"dossier.delete.delete\"\n (confirmEvent)=\"onConfirmDelete()\"\n></valtimo-confirmation-modal>\n\n<ng-container renderInPageHeader [fullWidth]=\"true\">\n <ng-template>\n <div\n class=\"dossier-actions\"\n [ngClass]=\"{'--compact': compactMode$ | async}\"\n *ngIf=\"{\n assigneeId: assigneeId$ | async,\n canAssign: canAssign$ | async,\n canClaim: canClaim$ | async,\n canHaveAssignee: canHaveAssignee$ | async,\n canDelete: canDelete$ | async,\n document: document$ | async,\n caseStatus: caseStatus$ | async,\n } as obs\"\n >\n <div\n class=\"dossier-status-assign-custom-title\"\n [ngClass]=\"{'--compact': compactMode$ | async}\"\n >\n @if (obs.caseStatus) {\n <cds-tag size=\"sm\" [type]=\"obs.caseStatus.tagType\" [title]=\"obs.caseStatus.title\">{{\n obs.caseStatus.title\n }}</cds-tag>\n }\n\n <div class=\"dossier-assign-user\" [ngClass]=\"{'--compact': compactMode$ | async}\">\n <ng-container\n *ngTemplateOutlet=\"\n caseDetailAssignee;\n context: {\n canHaveAssignee: obs.canHaveAssignee,\n document: obs.document,\n canAssign: obs.canAssign,\n }\n \"\n ></ng-container>\n </div>\n\n <ng-container *ngTemplateOutlet=\"caseDetailHeader\"></ng-container>\n </div>\n\n <div class=\"buttons-container\">\n <cds-overflow-menu\n [ngClass]=\"{'--compact': compactMode$ | async}\"\n *ngIf=\"obs.canHaveAssignee || obs.canDelete\"\n flip=\"true\"\n [offset]=\"(compactMode$ | async) ? {y: 48, x: -4} : {y: 48, x: 4}\"\n class=\"overflow-button assign-overflow\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n claimButton;\n context: {canClaim: obs.canClaim, canHaveAssignee: obs.canHaveAssignee}\n \"\n >\n </ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n unassignButton;\n context: {canHaveAssignee: obs.canHaveAssignee, assigneeId: obs.assigneeId}\n \"\n >\n </ng-container>\n <ng-container *ngTemplateOutlet=\"deleteButton; context: {canDelete: obs.canDelete}\">\n </ng-container>\n </cds-overflow-menu>\n\n <cds-overflow-menu\n valtimoCdsOverflowButton\n [ngClass]=\"{'--compact': compactMode$ | async}\"\n [width]=\"dropdownWidth$ | async\"\n [customTrigger]=\"customStartTrigger\"\n [offset]=\"{y: 48, x: 35}\"\n class=\"overflow-button case-detail-overflow\"\n >\n <cds-overflow-menu-option\n *ngFor=\"let processDocumentDefinition of processDocumentDefinitions\"\n [attr.title]=\"processDocumentDefinition.displayName\"\n (click)=\"startProcess(processDocumentDefinition)\"\n >\n {{ processDocumentDefinition.displayName }}\n </cds-overflow-menu-option>\n </cds-overflow-menu>\n </div>\n </div>\n </ng-template>\n</ng-container>\n", styles: [".main-content{overflow:hidden;padding-bottom:0}.main-content--no-horizontal-overflow{overflow-x:hidden}.tab-container{height:min-content;min-height:300px;overflow-y:auto;max-height:calc(100vh - 226px);overflow-x:hidden}.tab-container--compact{max-height:calc(100vh - 176px)}.tab-container:has(>.tab--no-margin){padding:0!important}.tab-container:has(>.tab--no-min-height){min-height:unset}.tab-container:has(>.tab--no-background){background:transparent!important}.tab-content-container{overflow:hidden;display:flex;gap:32px;overflow:auto;margin-bottom:16px;max-height:calc(100vh - 226px)}.tab-content-container--compact{max-height:calc(100vh - 176px)}.loading-container{display:flex;justify-content:center;flex-direction:row}.dossier-detail-page-header{display:flex;width:100%;justify-content:flex-start;padding-bottom:5px}.dossier-detail-page-header ::ng-deep .cds--tag{margin:0}.case-detail-tabs{display:flex;margin-bottom:24px}.case-detail-tabs cds-tab{display:none!important}.cds--overflow-menu-options{margin-top:32px}.assign-overflow{margin-right:8px}.buttons-container{display:flex;flex-direction:row}.dossier-actions{display:flex;width:100%;justify-content:space-between;align-items:flex-end;padding-bottom:4px}.dossier-actions.--compact{padding-bottom:0;align-items:flex-start}.dossier-actions ::ng-deep .version-selection{width:160px}.dossier-actions ::ng-deep .version-selection .cds--list-box__selection{display:none}.dossier-status-assign-custom-title{display:flex;gap:16px;align-items:flex-end}.dossier-status-assign-custom-title .cds--tag{margin:0;overflow:hidden;text-overflow:ellipsis;line-height:24px;display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;max-width:100%}.dossier-status-assign-custom-title.--compact{align-items:center}.task-panel{width:100%;transition:height .15s ease-in-out}:host ::ng-deep .container-fluid{height:100%!important;width:100%!important;margin:0!important;padding:0!important}::ng-deep .tab-content-container .as-split-gutter{background-color:transparent!important;--_as-gutter-icon-disabled: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/wcAAgEBAYcDngAAAAAASUVORK5CYII=);--_as-gutter-icon-horizontal: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAABQJJREFUeF7dWll22zAMpNwzlM5xmpMlOVl6mzrKHexWm8UFy4xIp+/FP3mxQWAwWAiRGsJ3/gwhhJvt4CRCfgCtosYhDOHm4SlW7rZyq9t/R7GsZoYQDhCA89UIrzakKuQtpRTiHv03ycJB3t8KuU9AByNfw5dWJpj1h5YABmGRsvgufzsSG21NEwGWUrv5yiuZb31yMZoAAjBFPqBdor9G0vpwu2+PBgE6TK/q0pUxxiwZxnE0SefkE0sHWQUygGG3ll0c2tGNn+M0DiSfHDlHQBu2rffoWgBWPRHWIUreM654li5bMwDQBIhI9naHFgVQCSS2PHliWlLm0/YsMrcwK6ISp1QGANhzG7XFDj2gUFr8yzrkydOJ6CyACBB1lIWkbPyeQ2UQ2ZKxksCLft4EaWqB/AshHCdg0b/1gB7wJB1QBrQ0ml4E2MMyFgxJ6iABuEGdgCUeZVQm+fQ7fhfAsflzAKFLS1G2ptmMwUpDl1oyAGxo2fw2hHBzjpsm+XiO2TGQF1GWACJGfecAjHmgCTZum/lQfezQTZ3L7z+g3goc2xGtFT86A0qLh5pgjPF13aLmv9aHdYiVn8uMwFNixQlYqVuNvayK3sZxNElgHarlP6duo2bpOcbXWxheVhkTj7Tv4ATsTG/OL6CG8DZ+KCQMIcSf6HnAAo8hrAjGRpIblLxveDm8/q4YC6fT6flyufzWBhXGoTWd4QOUp6enX9fr9X2od6SFhJlTu4FBGZA5n+jbnddZjPG8nz8lo222ItHJEraRICAAMmG6rPGb2FTjedqHsET+4/Lbu+phHWLlJ/g+Cd4gpJDgp71HHzAHFCqOEFCSULjrNkaxw2rO/zidnv/MNY99WIcY+TKufibUmOcSEB5IxLTHXLal2FG4h83VPzET1h6wUxDP8fXfJW5V8xuQhqFwVtGNgDuQ6Yo367Pb9ixdjVckVE1QS/0ekZhybRw/zMZblkBpd1sMPIdJkAsClF2ghQQPYJYBQjp5BKCBEHD4JZDi6bED3AebRDFbAp58Ski3JrgphQcgozEwXZ2dBH3nZ2Bq5KcyahuEgO1wIWBnyIuoS5hA9pHIp01dnANSdlvKwXWocRC6Pw/U70MBozCQAWI5JKDF5wFrtk8uR6XKYQibnL9dr+/CjgA5v81AamMFByTTmOhQp56hPw5/vrrvx61euz2gZKfHgcj98bUkgjo/WJCxeMrJFyQgR8ocQcGnwqsJpgSK8pymTPeIThus4DKwBKWJFNsFklEcOT9ApyFADswAQJMiwkaUldeQ7ZTKDWf79tsSgIasDwGduro1CbY+hVqZgpJ1SA5L6bQHMJNjOy19MsCgBiNgV8DK+1GxSXoYAcMwhNttOedPIZTPAhm8bQ6Anx57ZMBGgfHuXs6yuEANBBtR/2bIjzkj8bAMSIYU+KLDaoKSU8KFCOP7LAsTcDTZ2jPAfrUWf3VGnwdo1pgF5xiz9yhazwOExwfv9suEm2XArJwNtSP/+AxgwlHL1iVwiAUdhEaAxhtLWGbZDEbPEiCyhHWIla93KO7AvMoAwre7bW5jxCAfwaHnoa4N3gVU5X2RthX0gdVNBPhDZnYgzMH7ImKbCOA8wnfsVO+jeUgIEHfYFUs7jHYNLN2YvJkBXwYaNuQIwnp2cgoCag3LN1Z2+EwfwCVPLPAOJ1n05oDt9x5oRR37Pb72s/e+kU81L/EXSRwjcUdkvjUAAAAASUVORK5CYII=)}::ng-deep .tab-content-container .as-split-gutter-icon{background-repeat:no-repeat;background-size:16px 16px}::ng-deep .tab-content-container--dark .as-split-gutter{--_as-gutter-icon-horizontal: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAABPlJREFUeF7tm1tW3DAMhu2+krCmdmWlKytrIuGV9HjixDddfjkOtOd0XmAGWZfPsiw7g3fVyzvntvpD9H01+JIuwCamX5YKf9VfmCVaDze2S2fXIDG+CGC8YsrqMCvDFDmHZYCeI5gE6LietD2LlNb6uQAQTLWfCDTLmLpOIfoRvxEZydZn+pH7+vdlAEJyoIwIwDIrFtk7C2TyA/Po9gxY1zVWrN2haZq85FqS3zEF+YET3qi6rFzjfAR0yGkBwQA0wyFU75zf5MaOBYDoR2YGDigqY+U7HOKHlAsFiQOXqax+JYCYBGJr32ZAB+lEpxwc3i1nDcDWtBUYPjN8p35VBxf/4/MQUI7lqAGPzwjYBQDv3PQ0+Ue/CjV/sODp8+UiyNE7XLHO6EM+Dg4/ntBdAI69zdIqBlgTlDldADLN9a7R551cDot0kDPNbn40AIh6LSS4DS0Be9jJg7sAXPHJfBZojbXriMscGgDvvhUYmRGEes6iocJiyVejWdelYDPNk5cquhnAxVSAlgDZQG/7bUqKjvZEDqgdYwaAzQsrVQHowFkPqd5bA4LlO1ytp+zoFM0Ml2V5CYPmeX78lF7v67rla8B6GpynKZxnxBfmD03MvASCMe/9z+DRtm2/SAiZLXRGqcapbYTaICB/BHwggN1wbuzQSUHI3UQBHPqo+wPO/7dlefkWJ0PyR0ofEIAjg49Z8GOe51fOCAYgIcPkd2vLsnz33v+ubadJ0TZw8Fqcmnkk+CBjCahHXodQ49mhHGjUDJCDf37Vjmn54Sa4MuxGaL/weWzDdggJigjgDL7KpG3bxLTPmY/PALqa90JgAahpf/ohb8jjAfAlrQdCCSDG0gRPxCiHzf81XwKUVA1M7gDwbojbspsM4GZea3jov5cFp6cGoHYRFCWE5FthQwKAGCnLS9vD6UXwXbnIRpGUcsH3D6JxI2sADwFHwEnqAI4HKW0AB07ci6QDXgLHELUIghPxbxRBBukICDuAZMCaAbu8XnLf1K4wzBjdGYpzSUGI66ntBQg/8QzYB+PyyW18++sAEHvu8wSY02IbosyONaBTPj7XO6/F+SxVzgPKRooWlN7l0A0g+i0tGXrmvdu2D/qYTrBgO0GKG3ocRlrhB/jm6a13zR2i8GAk+BOOw/lmy95RMIlgAlAvh4ex5/ll5CUndYMkJfGNFyL84sCuoHa3tSVQW9HkGxjeueUNv6Krx7dbTO5R/J1FARSQ9X3d8gyh13RSZAYA9iOcmHkJWO1ZA+LkRdbaRAlO3wogKL/+/YDZl5cuFQogC/P4k/j+mx0AYVDyYVQGWDMPlbcDQDVHOREA1DmGDAgv7emA0bEofgmAmn3euXUpT3d9Z4G+4PRR+6PR9oigRqarPiT6ng4nBzRguCe0ZJEBatyqQGvkfw249VtiHTNSzdGZAddVESmW1YBDv5bSpoxBnOZkst7h6jISx5sCEltnJFp7KKkG3KNfPQvULluB2UMuR1zaBiXjB08+IJr4FQA9c3gDgNINKSDK4SCff67VjEsZEI+Cl3Scg3vwA4cU6uu0bRL3d4k3ZEDm3mAoY2YqdX7BvVsA2OJW9qlhUe+KQvObX1DYANS+2iIdHArR0bArgXfUBoAMoewopH9ROd3oBmcZiMkOANA3sXUq9mm5Pqrvq7IYXLo3Vs713ao7WRAZ8NULfTACRd0fdjtUcYyr1cIAAAAASUVORK5CYII=)}.spacing-case-tags{margin-bottom:10px}\n"], dependencies: [{ kind: "directive", type: i13.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i13.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i13.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i13.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i14.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type: i5.Loading, selector: "cds-loading, ibm-loading", inputs: ["title", "isActive", "size", "overlay"] }, { kind: "directive", type: i5.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i5.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "component", type: i1.ConfirmationModalComponent, selector: "valtimo-confirmation-modal", inputs: ["titleTranslationKey", "title", "content", "contentTranslationKey", "confirmButtonText", "confirmButtonTextTranslationKey", "confirmButtonType", "showOptionalButton", "optionalButtonText", "optionalButtonTextTranslationKey", "optionalButtonType", "cancelButtonText", "cancelButtonTextTranslationKey", "cancelButtonType", "showModalSubject$", "outputOnConfirm", "outputOnOptional", "spacerAfterCancelButton"], outputs: ["confirmEvent", "optionalEvent", "cancelEvent"] }, { kind: "component", type: i5.Tabs, selector: "cds-tabs, ibm-tabs", inputs: ["position", "cacheActive", "followFocus", "isNavigation", "ariaLabel", "ariaLabelledby", "type", "theme", "skeleton"] }, { kind: "component", type: i5.Tab, selector: "cds-tab, ibm-tab", inputs: ["heading", "title", "context", "active", "disabled", "tabIndex", "id", "cacheActive", "tabContent", "templateContext"], outputs: ["selected"] }, { kind: "component", type: i1.CarbonNoResultsComponent, selector: "valtimo-no-results", inputs: ["action", "description", "illustration", "title", "smallPadding", "collapseVertically", "alwaysRenderVertically"] }, { kind: "directive", type: i1.RenderInPageHeaderDirective, selector: "[renderInPageHeader]", inputs: ["fullWidth"] }, { kind: "component", type: i5.Tag, selector: "cds-tag, ibm-tag", inputs: ["type", "size", "class"] }, { kind: "component", type: i5.OverflowMenu, selector: "cds-overflow-menu, ibm-overflow-menu", inputs: ["buttonLabel", "flip", "placement", "open", "customTrigger", "offset", "wrapperClass", "triggerClass"], outputs: ["openChange"] }, { kind: "component", type: i5.OverflowMenuOption, selector: "cds-overflow-menu-option, ibm-overflow-menu-option", inputs: ["divider", "type", "disabled", "href", "target", "innerClass"], outputs: ["selected"] }, { kind: "directive", type: i1.ValtimoCdsOverflowButtonDirective, selector: "[valtimoCdsOverflowButton]", inputs: ["width"] }, { kind: "component", type: i15.DossierDetailTaskListComponent, selector: "valtimo-dossier-detail-task-list", inputs: ["openTaskAndProcessLinkInModal"], outputs: ["taskClickEvent", "formSubmitEvent"] }, { kind: "component", type: i16.DossierDetailsTaskDetailComponent, selector: "valtimo-dossier-detail-task-detail", inputs: ["taskAndProcessLink"], outputs: ["closeEvent", "assignmentOfTaskChanged", "activeChange", "formSubmit"] }, { kind: "component", type: i17.SplitComponent, selector: "as-split", inputs: ["gutterSize", "gutterStep", "disabled", "gutterClickDeltaPx", "direction", "dir", "unit", "gutterAriaLabel", "restrictMove", "useTransition", "gutterDblClickDuration"], outputs: ["gutterClick", "gutterDblClick", "dragStart", "dragEnd", "transitionEnd"], exportAs: ["asSplit"] }, { kind: "component", type: i17.SplitAreaComponent, selector: "as-split-area", inputs: ["size", "minSize", "maxSize", "lockSize", "visible"], exportAs: ["asSplitArea"] }, { kind: "component", type: i18.DossierSupportingProcessStartModalComponent, selector: "valtimo-dossier-supporting-process-start-modal", inputs: ["isAdmin"], outputs: ["formSubmit"] }, { kind: "component", type: i19.DossierAssignUserComponent, selector: "valtimo-dossier-assign-user", inputs: ["documentId", "assigneeId", "assigneeFullName", "hasPermission"], outputs: ["assignmentOfDocumentChanged"] }, { kind: "pipe", type: i13.AsyncPipe, name: "async" }, { kind: "pipe", type: i9.TranslatePipe, name: "translate" }, { kind: "pipe", type: i20.TabTranslatePipe, name: "tabTranslate" }] }); }
475
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: DossierDetailComponent, selector: "valtimo-dossier-detail", providers: [DossierTabService, DossierDetailLayoutService, NotificationService], viewQueries: [{ propertyName: "supportingProcessStart", first: true, predicate: ["supportingProcessStartModal"], descendants: true }, { propertyName: "viewContainerRef", first: true, predicate: ["tabContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "_tabContentContainer", first: true, predicate: ["tabContentContainer"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n<div\n class=\"main-content\"\n [ngClass]=\"{'main-content--no-horizontal-overflow': tabHorizontalOverflowDisabled()}\"\n>\n <div class=\"container-fluid\">\n <ng-container *ngIf=\"caseTags$ | async as caseTags\">\n @if (caseTags && caseTags.length > 0) {\n <div class=\"case-tags\">\n @for (tag of caseTags; track tag) {\n <cds-tag size=\"sm\" [type]=\"tag.tagType\">\n {{ tag.title }}\n </cds-tag>\n }\n </div>\n }\n </ng-container>\n\n <ng-container *ngTemplateOutlet=\"tabs\"></ng-container>\n\n <ng-template #tabs>\n <ng-container *ngIf=\"{activeTab: activeTab$ | async} as obs\">\n <cds-tabs *ngIf=\"tabLoader\" type=\"inline\" class=\"case-detail-tabs\">\n <cds-tab\n *ngFor=\"let tab of tabLoader.tabs\"\n [active]=\"tab.name === (activeTabName$ | async)\"\n heading=\"{{ tab | tabTranslate | async }}\"\n (selected)=\"onTabSelected(tab, obs.activeTab)\"\n ></cds-tab>\n </cds-tabs>\n </ng-container>\n </ng-template>\n <div\n #tabContentContainer\n class=\"tab-content-container\"\n [ngClass]=\"{\n 'tab-content-container--dark': isDarkMode$ | async,\n 'tab-content-container--compact': compactMode$ | async,\n }\"\n *ngIf=\"{\n noTabsConfigured: noTabsConfigured$ | async,\n showTaskList: showTaskList$ | async,\n showNoAccess: showNoAccess$ | async,\n dossierDetailLayout: dossierDetailLayout$ | async,\n openTaskAndProcessLinkInModal: openTaskAndProcessLinkInModal$ | async,\n taskAndProcessLinkOpenedInPanel: taskAndProcessLinkOpenedInPanel$ | async,\n } as tabContentObs\"\n >\n <as-split\n direction=\"horizontal\"\n [disabled]=\"!tabContentObs.dossierDetailLayout.widthAdjustable\"\n [gutterSize]=\"DOSSIER_DETAIL_GUTTER_SIZE\"\n [unit]=\"tabContentObs.dossierDetailLayout.unit\"\n >\n <as-split-area\n [size]=\"tabContentObs.dossierDetailLayout.leftPanelWidth\"\n [minSize]=\"tabContentObs.dossierDetailLayout.leftPanelMinWidth\"\n [maxSize]=\"tabContentObs.dossierDetailLayout.leftPanelMaxWidth\"\n >\n <div\n class=\"card-body bg-white p-5 position-relative tab-container\"\n [class.tab-container--compact]=\"compactMode$ | async\"\n >\n <div *ngIf=\"loadingTabs$ | async\" class=\"loading-container\">\n <cds-loading></cds-loading>\n </div>\n\n <valtimo-no-results\n *ngIf=\"tabContentObs.showNoAccess\"\n description=\"{{ 'dossier.noAccess.description' | translate }}\"\n title=\"{{ 'dossier.noAccess.title' | translate }}\"\n illustration=\"valtimo-layout/img/emptystate-not-authorised.svg\"\n >\n </valtimo-no-results>\n\n <valtimo-no-results\n *ngIf=\"tabContentObs.noTabsConfigured\"\n [description]=\"'dossier.tabs.noResultsDescription' | translate\"\n [title]=\"'dossier.tabs.noResults' | translate\"\n ></valtimo-no-results>\n\n <ng-template #tabContainer></ng-template>\n\n <div class=\"clearfix\"></div>\n </div>\n </as-split-area>\n\n <as-split-area\n *ngIf=\"tabContentObs.dossierDetailLayout.showRightPanel\"\n [size]=\"tabContentObs.dossierDetailLayout.rightPanelWidth\"\n [minSize]=\"tabContentObs.dossierDetailLayout.rightPanelMinWidth\"\n [maxSize]=\"tabContentObs.dossierDetailLayout.rightPanelMaxWidth\"\n >\n @if (tabContentObs.showTaskList) {\n <div class=\"task-panel\">\n @if (!tabContentObs.taskAndProcessLinkOpenedInPanel) {\n <valtimo-dossier-detail-task-list\n [openTaskAndProcessLinkInModal]=\"tabContentObs.openTaskAndProcessLinkInModal\"\n (taskClickEvent)=\"onTaskClickEvent($event)\"\n (formSubmitEvent)=\"onFormSubmitEvent()\"\n ></valtimo-dossier-detail-task-list>\n }\n\n @if (tabContentObs.taskAndProcessLinkOpenedInPanel) {\n <valtimo-dossier-detail-task-detail\n [taskAndProcessLink]=\"tabContentObs.taskAndProcessLinkOpenedInPanel\"\n (activeChange)=\"onActiveChangeEvent($event)\"\n (closeEvent)=\"onTaskDetailsClose()\"\n (formSubmit)=\"onFormSubmitEvent()\"\n >\n </valtimo-dossier-detail-task-detail>\n }\n </div>\n }\n </as-split-area>\n </as-split>\n </div>\n </div>\n\n <valtimo-dossier-supporting-process-start-modal\n [isAdmin]=\"isAdmin$ | async\"\n (formSubmit)=\"tabLoader.refreshView()\"\n #supportingProcessStartModal\n ></valtimo-dossier-supporting-process-start-modal>\n</div>\n\n<ng-template\n #caseDetailHeader\n let-canHaveAssignee=\"canHaveAssignee\"\n let-document=\"document\"\n let-canAssign=\"canAssign\"\n>\n <div class=\"row\" *ngIf=\"(customDossierHeaderItems || []).length > 0\">\n <span\n *ngFor=\"let item of customDossierHeaderItems\"\n [ngClass]=\"{\n h1: item.textSize === 'xl',\n h2: item.textSize === 'lg',\n h3: item.textSize === 'md',\n h4: item.textSize === 'sm',\n h5: item.textSize === 'xs',\n }\"\n class=\"mb-0 mt-0 align-self-end col-xl-{{ item.columnSize }} col-lg-{{\n item.columnSize * 2\n }} {{ item.customClass }}\"\n >\n <span *ngIf=\"item.label\">{{ item.label | translate }}</span>\n\n <span *ngIf=\"item.label && item.value\">: </span>\n\n <strong>{{ item.value }}</strong>\n </span>\n </div>\n\n <ng-container\n *ngTemplateOutlet=\"\n caseDetailAssignee;\n context: {canHaveAssignee: canHaveAssignee, document: document, canAssign: canAssign}\n \"\n ></ng-container>\n</ng-template>\n\n<ng-template\n #caseDetailAssignee\n let-canHaveAssignee=\"canHaveAssignee\"\n let-document=\"document\"\n let-canAssign=\"canAssign\"\n>\n <div *ngIf=\"canHaveAssignee && document\">\n <valtimo-dossier-assign-user\n *ngIf=\"canAssignLoaded$ | async\"\n [assigneeFullName]=\"document?.assigneeFullName\"\n [assigneeId]=\"document.assigneeId\"\n [documentId]=\"document.id\"\n [hasPermission]=\"canAssign\"\n (assignmentOfDocumentChanged)=\"assignmentOfDocumentChanged()\"\n ></valtimo-dossier-assign-user>\n </div>\n</ng-template>\n\n<ng-template #claimButton let-canClaim=\"canClaim\" let-canHaveAssignee=\"canHaveAssignee\">\n <cds-overflow-menu-option\n *ngIf=\"canClaim && canHaveAssignee\"\n [disabled]=\"(isAssigning$ | async) || (isAssignedToCurrentUser$ | async)\"\n (click)=\"claimAssignee()\"\n >\n {{ 'dossier.claimAssigneeCase' | translate }}\n </cds-overflow-menu-option>\n</ng-template>\n\n<ng-template #unassignButton let-canHaveAssignee=\"canHaveAssignee\" let-assigneeId=\"assigneeId\">\n <cds-overflow-menu-option\n *ngIf=\"canHaveAssignee\"\n [disabled]=\"!assigneeId\"\n (selected)=\"unassignAssignee()\"\n >\n {{ 'assignDocument.remove' | translate }}\n </cds-overflow-menu-option>\n</ng-template>\n\n<ng-template #deleteButton let-canDelete=\"canDelete\">\n <cds-overflow-menu-option\n *ngIf=\"canDelete\"\n [disabled]=\"isDeleting$ | async\"\n (click)=\"deleteDocument()\"\n type=\"danger\"\n >\n {{ 'dossier.delete.delete' | translate }}\n </cds-overflow-menu-option>\n</ng-template>\n\n<ng-template #customStartTrigger>\n <button\n [size]=\"(compactMode$ | async) ? 'sm' : 'lg'\"\n cdsButton=\"primary\"\n [disabled]=\"processDocumentDefinitions.length === 0\"\n [ngbTooltip]=\"processDocumentDefinitions.length === 0 ? 'No action' : null\"\n >\n {{ 'dossier.startSubProcess' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"chevron--down\" size=\"16\"></svg>\n </button>\n</ng-template>\n\n<valtimo-confirmation-modal\n confirmButtonTextTranslationKey=\"dossier.delete.confirm\"\n confirmButtonType=\"danger\"\n contentTranslationKey=\"dossier.delete.description\"\n [showModalSubject$]=\"showDeleteModal$\"\n titleTranslationKey=\"dossier.delete.delete\"\n (confirmEvent)=\"onConfirmDelete()\"\n></valtimo-confirmation-modal>\n\n<ng-container renderInPageHeader [fullWidth]=\"true\">\n <ng-template>\n <div\n class=\"dossier-actions\"\n [ngClass]=\"{\n 'dossier-actions--compact': compactMode$ | async,\n 'dossier-actions--small-title': smallTitle$ | async,\n }\"\n *ngIf=\"{\n assigneeId: assigneeId$ | async,\n canAssign: canAssign$ | async,\n canClaim: canClaim$ | async,\n canHaveAssignee: canHaveAssignee$ | async,\n canDelete: canDelete$ | async,\n document: document$ | async,\n caseStatus: caseStatus$ | async,\n } as obs\"\n >\n <div\n class=\"dossier-status-assign-custom-title\"\n [ngClass]=\"{'--compact': compactMode$ | async}\"\n >\n @if (obs.caseStatus) {\n <cds-tag size=\"sm\" [type]=\"obs.caseStatus.tagType\" [title]=\"obs.caseStatus.title\">{{\n obs.caseStatus.title\n }}</cds-tag>\n }\n\n <div class=\"dossier-assign-user\" [ngClass]=\"{'--compact': compactMode$ | async}\">\n <ng-container\n *ngTemplateOutlet=\"\n caseDetailAssignee;\n context: {\n canHaveAssignee: obs.canHaveAssignee,\n document: obs.document,\n canAssign: obs.canAssign,\n }\n \"\n ></ng-container>\n </div>\n\n <ng-container *ngTemplateOutlet=\"caseDetailHeader\"></ng-container>\n </div>\n\n <div class=\"buttons-container\">\n <cds-overflow-menu\n [ngClass]=\"{'--compact': compactMode$ | async}\"\n *ngIf=\"obs.canHaveAssignee || obs.canDelete\"\n flip=\"true\"\n [offset]=\"(compactMode$ | async) ? {y: 48, x: -4} : {y: 48, x: 4}\"\n class=\"overflow-button assign-overflow\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n claimButton;\n context: {canClaim: obs.canClaim, canHaveAssignee: obs.canHaveAssignee}\n \"\n >\n </ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n unassignButton;\n context: {canHaveAssignee: obs.canHaveAssignee, assigneeId: obs.assigneeId}\n \"\n >\n </ng-container>\n <ng-container *ngTemplateOutlet=\"deleteButton; context: {canDelete: obs.canDelete}\">\n </ng-container>\n </cds-overflow-menu>\n\n <cds-overflow-menu\n valtimoCdsOverflowButton\n [ngClass]=\"{'--compact': compactMode$ | async}\"\n [width]=\"dropdownWidth$ | async\"\n [customTrigger]=\"customStartTrigger\"\n [offset]=\"{y: 48, x: 35}\"\n class=\"overflow-button case-detail-overflow\"\n >\n <cds-overflow-menu-option\n *ngFor=\"let processDocumentDefinition of processDocumentDefinitions\"\n [attr.title]=\"processDocumentDefinition.displayName\"\n (click)=\"startProcess(processDocumentDefinition)\"\n >\n {{ processDocumentDefinition.displayName }}\n </cds-overflow-menu-option>\n </cds-overflow-menu>\n </div>\n </div>\n </ng-template>\n</ng-container>\n", styles: [".main-content{overflow:hidden;padding-bottom:0}.main-content--no-horizontal-overflow{overflow-x:hidden}.tab-container{height:min-content;min-height:300px;overflow-y:auto;max-height:calc(100vh - 226px);overflow-x:hidden}.tab-container--compact{max-height:calc(100vh - 176px)}.tab-container:has(>.tab--no-margin){padding:0!important}.tab-container:has(>.tab--no-min-height){min-height:unset}.tab-container:has(>.tab--no-background){background:transparent!important}.tab-content-container{overflow:hidden;display:flex;gap:32px;overflow:auto;margin-bottom:16px;max-height:calc(100vh - 226px)}.tab-content-container--compact{max-height:calc(100vh - 176px)}.loading-container{display:flex;justify-content:center;flex-direction:row}.dossier-detail-page-header{display:flex;width:100%;justify-content:flex-start;padding-bottom:5px}.dossier-detail-page-header ::ng-deep .cds--tag{margin:0}.case-detail-tabs{display:flex;margin-bottom:24px}.case-detail-tabs cds-tab{display:none!important}.cds--overflow-menu-options{margin-top:32px}.assign-overflow{margin-right:8px}.buttons-container{display:flex;flex-direction:row}.dossier-actions{display:flex;width:100%;justify-content:space-between;align-items:flex-end;padding-bottom:4px}.dossier-actions--compact,.dossier-actions--small-title{padding-bottom:0;align-items:flex-start}.dossier-actions ::ng-deep .version-selection{width:160px}.dossier-actions ::ng-deep .version-selection .cds--list-box__selection{display:none}.dossier-status-assign-custom-title{display:flex;gap:16px;align-items:flex-end}.dossier-status-assign-custom-title .cds--tag{margin:0;overflow:hidden;text-overflow:ellipsis;line-height:24px;display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;max-width:100%}.dossier-status-assign-custom-title.--compact{align-items:center}.task-panel{width:100%;transition:height .15s ease-in-out}:host ::ng-deep .container-fluid{height:100%!important;width:100%!important;margin:0!important;padding:0!important}::ng-deep .tab-content-container .as-split-gutter{background-color:transparent!important;--_as-gutter-icon-disabled: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/wcAAgEBAYcDngAAAAAASUVORK5CYII=);--_as-gutter-icon-horizontal: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAABQJJREFUeF7dWll22zAMpNwzlM5xmpMlOVl6mzrKHexWm8UFy4xIp+/FP3mxQWAwWAiRGsJ3/gwhhJvt4CRCfgCtosYhDOHm4SlW7rZyq9t/R7GsZoYQDhCA89UIrzakKuQtpRTiHv03ycJB3t8KuU9AByNfw5dWJpj1h5YABmGRsvgufzsSG21NEwGWUrv5yiuZb31yMZoAAjBFPqBdor9G0vpwu2+PBgE6TK/q0pUxxiwZxnE0SefkE0sHWQUygGG3ll0c2tGNn+M0DiSfHDlHQBu2rffoWgBWPRHWIUreM654li5bMwDQBIhI9naHFgVQCSS2PHliWlLm0/YsMrcwK6ISp1QGANhzG7XFDj2gUFr8yzrkydOJ6CyACBB1lIWkbPyeQ2UQ2ZKxksCLft4EaWqB/AshHCdg0b/1gB7wJB1QBrQ0ml4E2MMyFgxJ6iABuEGdgCUeZVQm+fQ7fhfAsflzAKFLS1G2ptmMwUpDl1oyAGxo2fw2hHBzjpsm+XiO2TGQF1GWACJGfecAjHmgCTZum/lQfezQTZ3L7z+g3goc2xGtFT86A0qLh5pgjPF13aLmv9aHdYiVn8uMwFNixQlYqVuNvayK3sZxNElgHarlP6duo2bpOcbXWxheVhkTj7Tv4ATsTG/OL6CG8DZ+KCQMIcSf6HnAAo8hrAjGRpIblLxveDm8/q4YC6fT6flyufzWBhXGoTWd4QOUp6enX9fr9X2od6SFhJlTu4FBGZA5n+jbnddZjPG8nz8lo222ItHJEraRICAAMmG6rPGb2FTjedqHsET+4/Lbu+phHWLlJ/g+Cd4gpJDgp71HHzAHFCqOEFCSULjrNkaxw2rO/zidnv/MNY99WIcY+TKufibUmOcSEB5IxLTHXLal2FG4h83VPzET1h6wUxDP8fXfJW5V8xuQhqFwVtGNgDuQ6Yo367Pb9ixdjVckVE1QS/0ekZhybRw/zMZblkBpd1sMPIdJkAsClF2ghQQPYJYBQjp5BKCBEHD4JZDi6bED3AebRDFbAp58Ski3JrgphQcgozEwXZ2dBH3nZ2Bq5KcyahuEgO1wIWBnyIuoS5hA9pHIp01dnANSdlvKwXWocRC6Pw/U70MBozCQAWI5JKDF5wFrtk8uR6XKYQibnL9dr+/CjgA5v81AamMFByTTmOhQp56hPw5/vrrvx61euz2gZKfHgcj98bUkgjo/WJCxeMrJFyQgR8ocQcGnwqsJpgSK8pymTPeIThus4DKwBKWJFNsFklEcOT9ApyFADswAQJMiwkaUldeQ7ZTKDWf79tsSgIasDwGduro1CbY+hVqZgpJ1SA5L6bQHMJNjOy19MsCgBiNgV8DK+1GxSXoYAcMwhNttOedPIZTPAhm8bQ6Anx57ZMBGgfHuXs6yuEANBBtR/2bIjzkj8bAMSIYU+KLDaoKSU8KFCOP7LAsTcDTZ2jPAfrUWf3VGnwdo1pgF5xiz9yhazwOExwfv9suEm2XArJwNtSP/+AxgwlHL1iVwiAUdhEaAxhtLWGbZDEbPEiCyhHWIla93KO7AvMoAwre7bW5jxCAfwaHnoa4N3gVU5X2RthX0gdVNBPhDZnYgzMH7ImKbCOA8wnfsVO+jeUgIEHfYFUs7jHYNLN2YvJkBXwYaNuQIwnp2cgoCag3LN1Z2+EwfwCVPLPAOJ1n05oDt9x5oRR37Pb72s/e+kU81L/EXSRwjcUdkvjUAAAAASUVORK5CYII=)}::ng-deep .tab-content-container .as-split-gutter-icon{background-repeat:no-repeat;background-size:16px 16px}::ng-deep .tab-content-container--dark .as-split-gutter{--_as-gutter-icon-horizontal: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAABPlJREFUeF7tm1tW3DAMhu2+krCmdmWlKytrIuGV9HjixDddfjkOtOd0XmAGWZfPsiw7g3fVyzvntvpD9H01+JIuwCamX5YKf9VfmCVaDze2S2fXIDG+CGC8YsrqMCvDFDmHZYCeI5gE6LietD2LlNb6uQAQTLWfCDTLmLpOIfoRvxEZydZn+pH7+vdlAEJyoIwIwDIrFtk7C2TyA/Po9gxY1zVWrN2haZq85FqS3zEF+YET3qi6rFzjfAR0yGkBwQA0wyFU75zf5MaOBYDoR2YGDigqY+U7HOKHlAsFiQOXqax+JYCYBGJr32ZAB+lEpxwc3i1nDcDWtBUYPjN8p35VBxf/4/MQUI7lqAGPzwjYBQDv3PQ0+Ue/CjV/sODp8+UiyNE7XLHO6EM+Dg4/ntBdAI69zdIqBlgTlDldADLN9a7R551cDot0kDPNbn40AIh6LSS4DS0Be9jJg7sAXPHJfBZojbXriMscGgDvvhUYmRGEes6iocJiyVejWdelYDPNk5cquhnAxVSAlgDZQG/7bUqKjvZEDqgdYwaAzQsrVQHowFkPqd5bA4LlO1ytp+zoFM0Ml2V5CYPmeX78lF7v67rla8B6GpynKZxnxBfmD03MvASCMe/9z+DRtm2/SAiZLXRGqcapbYTaICB/BHwggN1wbuzQSUHI3UQBHPqo+wPO/7dlefkWJ0PyR0ofEIAjg49Z8GOe51fOCAYgIcPkd2vLsnz33v+ubadJ0TZw8Fqcmnkk+CBjCahHXodQ49mhHGjUDJCDf37Vjmn54Sa4MuxGaL/weWzDdggJigjgDL7KpG3bxLTPmY/PALqa90JgAahpf/ohb8jjAfAlrQdCCSDG0gRPxCiHzf81XwKUVA1M7gDwbojbspsM4GZea3jov5cFp6cGoHYRFCWE5FthQwKAGCnLS9vD6UXwXbnIRpGUcsH3D6JxI2sADwFHwEnqAI4HKW0AB07ci6QDXgLHELUIghPxbxRBBukICDuAZMCaAbu8XnLf1K4wzBjdGYpzSUGI66ntBQg/8QzYB+PyyW18++sAEHvu8wSY02IbosyONaBTPj7XO6/F+SxVzgPKRooWlN7l0A0g+i0tGXrmvdu2D/qYTrBgO0GKG3ocRlrhB/jm6a13zR2i8GAk+BOOw/lmy95RMIlgAlAvh4ex5/ll5CUndYMkJfGNFyL84sCuoHa3tSVQW9HkGxjeueUNv6Krx7dbTO5R/J1FARSQ9X3d8gyh13RSZAYA9iOcmHkJWO1ZA+LkRdbaRAlO3wogKL/+/YDZl5cuFQogC/P4k/j+mx0AYVDyYVQGWDMPlbcDQDVHOREA1DmGDAgv7emA0bEofgmAmn3euXUpT3d9Z4G+4PRR+6PR9oigRqarPiT6ng4nBzRguCe0ZJEBatyqQGvkfw249VtiHTNSzdGZAddVESmW1YBDv5bSpoxBnOZkst7h6jISx5sCEltnJFp7KKkG3KNfPQvULluB2UMuR1zaBiXjB08+IJr4FQA9c3gDgNINKSDK4SCff67VjEsZEI+Cl3Scg3vwA4cU6uu0bRL3d4k3ZEDm3mAoY2YqdX7BvVsA2OJW9qlhUe+KQvObX1DYANS+2iIdHArR0bArgXfUBoAMoewopH9ROd3oBmcZiMkOANA3sXUq9mm5Pqrvq7IYXLo3Vs713ao7WRAZ8NULfTACRd0fdjtUcYyr1cIAAAAASUVORK5CYII=)}.case-tags{margin-bottom:16px}\n"], dependencies: [{ kind: "directive", type: i13.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i13.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i13.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i13.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i14.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type: i5.Loading, selector: "cds-loading, ibm-loading", inputs: ["title", "isActive", "size", "overlay"] }, { kind: "directive", type: i5.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i5.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "component", type: i1.ConfirmationModalComponent, selector: "valtimo-confirmation-modal", inputs: ["titleTranslationKey", "title", "content", "contentTranslationKey", "confirmButtonText", "confirmButtonTextTranslationKey", "confirmButtonType", "showOptionalButton", "optionalButtonText", "optionalButtonTextTranslationKey", "optionalButtonType", "cancelButtonText", "cancelButtonTextTranslationKey", "cancelButtonType", "showModalSubject$", "outputOnConfirm", "outputOnOptional", "spacerAfterCancelButton"], outputs: ["confirmEvent", "optionalEvent", "cancelEvent"] }, { kind: "component", type: i5.Tabs, selector: "cds-tabs, ibm-tabs", inputs: ["position", "cacheActive", "followFocus", "isNavigation", "ariaLabel", "ariaLabelledby", "type", "theme", "skeleton"] }, { kind: "component", type: i5.Tab, selector: "cds-tab, ibm-tab", inputs: ["heading", "title", "context", "active", "disabled", "tabIndex", "id", "cacheActive", "tabContent", "templateContext"], outputs: ["selected"] }, { kind: "component", type: i1.CarbonNoResultsComponent, selector: "valtimo-no-results", inputs: ["action", "description", "illustration", "title", "smallPadding", "collapseVertically", "alwaysRenderVertically"] }, { kind: "directive", type: i1.RenderInPageHeaderDirective, selector: "[renderInPageHeader]", inputs: ["fullWidth"] }, { kind: "component", type: i5.Tag, selector: "cds-tag, ibm-tag", inputs: ["type", "size", "class"] }, { kind: "component", type: i5.OverflowMenu, selector: "cds-overflow-menu, ibm-overflow-menu", inputs: ["buttonLabel", "flip", "placement", "open", "customTrigger", "offset", "wrapperClass", "triggerClass"], outputs: ["openChange"] }, { kind: "component", type: i5.OverflowMenuOption, selector: "cds-overflow-menu-option, ibm-overflow-menu-option", inputs: ["divider", "type", "disabled", "href", "target", "innerClass"], outputs: ["selected"] }, { kind: "directive", type: i1.ValtimoCdsOverflowButtonDirective, selector: "[valtimoCdsOverflowButton]", inputs: ["width"] }, { kind: "component", type: i15.DossierDetailTaskListComponent, selector: "valtimo-dossier-detail-task-list", inputs: ["openTaskAndProcessLinkInModal"], outputs: ["taskClickEvent", "formSubmitEvent"] }, { kind: "component", type: i16.DossierDetailsTaskDetailComponent, selector: "valtimo-dossier-detail-task-detail", inputs: ["taskAndProcessLink"], outputs: ["closeEvent", "assignmentOfTaskChanged", "activeChange", "formSubmit"] }, { kind: "component", type: i17.SplitComponent, selector: "as-split", inputs: ["gutterSize", "gutterStep", "disabled", "gutterClickDeltaPx", "direction", "dir", "unit", "gutterAriaLabel", "restrictMove", "useTransition", "gutterDblClickDuration"], outputs: ["gutterClick", "gutterDblClick", "dragStart", "dragEnd", "transitionEnd"], exportAs: ["asSplit"] }, { kind: "component", type: i17.SplitAreaComponent, selector: "as-split-area", inputs: ["size", "minSize", "maxSize", "lockSize", "visible"], exportAs: ["asSplitArea"] }, { kind: "component", type: i18.DossierSupportingProcessStartModalComponent, selector: "valtimo-dossier-supporting-process-start-modal", inputs: ["isAdmin"], outputs: ["formSubmit"] }, { kind: "component", type: i19.DossierAssignUserComponent, selector: "valtimo-dossier-assign-user", inputs: ["documentId", "assigneeId", "assigneeFullName", "hasPermission"], outputs: ["assignmentOfDocumentChanged"] }, { kind: "pipe", type: i13.AsyncPipe, name: "async" }, { kind: "pipe", type: i9.TranslatePipe, name: "translate" }, { kind: "pipe", type: i20.TabTranslatePipe, name: "tabTranslate" }] }); }
462
476
  }
463
477
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DossierDetailComponent, decorators: [{
464
478
  type: Component,
465
- args: [{ selector: 'valtimo-dossier-detail', providers: [DossierTabService, DossierDetailLayoutService, NotificationService], template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n<div\n class=\"main-content\"\n [ngClass]=\"{'main-content--no-horizontal-overflow': tabHorizontalOverflowDisabled()}\"\n>\n <div class=\"container-fluid\">\n <ng-container *ngIf=\"caseTags$ | async as caseTags\">\n @if (caseTags && caseTags.length > 0) {\n <div class=\"spacing-case-tags\">\n @for (tag of caseTags; track tag) {\n <cds-tag size=\"sm\" [type]=\"tag.tagType\">\n {{ tag.title }}\n </cds-tag>\n }\n </div>\n }\n </ng-container>\n\n <ng-container *ngTemplateOutlet=\"tabs\"></ng-container>\n\n <ng-template #tabs>\n <ng-container *ngIf=\"{activeTab: activeTab$ | async} as obs\">\n <cds-tabs *ngIf=\"tabLoader\" type=\"inline\" class=\"case-detail-tabs\">\n <cds-tab\n *ngFor=\"let tab of tabLoader.tabs\"\n [active]=\"tab.name === (activeTabName$ | async)\"\n heading=\"{{ tab | tabTranslate | async }}\"\n (selected)=\"onTabSelected(tab, obs.activeTab)\"\n ></cds-tab>\n </cds-tabs>\n </ng-container>\n </ng-template>\n <div\n #tabContentContainer\n class=\"tab-content-container\"\n [ngClass]=\"{\n 'tab-content-container--dark': isDarkMode$ | async,\n 'tab-content-container--compact': compactMode$ | async,\n }\"\n *ngIf=\"{\n noTabsConfigured: noTabsConfigured$ | async,\n showTaskList: showTaskList$ | async,\n showNoAccess: showNoAccess$ | async,\n dossierDetailLayout: dossierDetailLayout$ | async,\n openTaskAndProcessLinkInModal: openTaskAndProcessLinkInModal$ | async,\n taskAndProcessLinkOpenedInPanel: taskAndProcessLinkOpenedInPanel$ | async,\n } as tabContentObs\"\n >\n <as-split\n direction=\"horizontal\"\n [disabled]=\"!tabContentObs.dossierDetailLayout.widthAdjustable\"\n [gutterSize]=\"DOSSIER_DETAIL_GUTTER_SIZE\"\n [unit]=\"tabContentObs.dossierDetailLayout.unit\"\n >\n <as-split-area\n [size]=\"tabContentObs.dossierDetailLayout.leftPanelWidth\"\n [minSize]=\"tabContentObs.dossierDetailLayout.leftPanelMinWidth\"\n [maxSize]=\"tabContentObs.dossierDetailLayout.leftPanelMaxWidth\"\n >\n <div\n class=\"card-body bg-white p-5 position-relative tab-container\"\n [class.tab-container--compact]=\"compactMode$ | async\"\n >\n <div *ngIf=\"loadingTabs$ | async\" class=\"loading-container\">\n <cds-loading></cds-loading>\n </div>\n\n <valtimo-no-results\n *ngIf=\"tabContentObs.showNoAccess\"\n description=\"{{ 'dossier.noAccess.description' | translate }}\"\n title=\"{{ 'dossier.noAccess.title' | translate }}\"\n illustration=\"valtimo-layout/img/emptystate-not-authorised.svg\"\n >\n </valtimo-no-results>\n\n <valtimo-no-results\n *ngIf=\"tabContentObs.noTabsConfigured\"\n [description]=\"'dossier.tabs.noResultsDescription' | translate\"\n [title]=\"'dossier.tabs.noResults' | translate\"\n ></valtimo-no-results>\n\n <ng-template #tabContainer></ng-template>\n\n <div class=\"clearfix\"></div>\n </div>\n </as-split-area>\n\n <as-split-area\n *ngIf=\"tabContentObs.dossierDetailLayout.showRightPanel\"\n [size]=\"tabContentObs.dossierDetailLayout.rightPanelWidth\"\n [minSize]=\"tabContentObs.dossierDetailLayout.rightPanelMinWidth\"\n [maxSize]=\"tabContentObs.dossierDetailLayout.rightPanelMaxWidth\"\n >\n @if (tabContentObs.showTaskList) {\n <div class=\"task-panel\">\n @if (!tabContentObs.taskAndProcessLinkOpenedInPanel) {\n <valtimo-dossier-detail-task-list\n [openTaskAndProcessLinkInModal]=\"tabContentObs.openTaskAndProcessLinkInModal\"\n (taskClickEvent)=\"onTaskClickEvent($event)\"\n (formSubmitEvent)=\"onFormSubmitEvent()\"\n ></valtimo-dossier-detail-task-list>\n }\n\n @if (tabContentObs.taskAndProcessLinkOpenedInPanel) {\n <valtimo-dossier-detail-task-detail\n [taskAndProcessLink]=\"tabContentObs.taskAndProcessLinkOpenedInPanel\"\n (activeChange)=\"onActiveChangeEvent($event)\"\n (closeEvent)=\"onTaskDetailsClose()\"\n (formSubmit)=\"onFormSubmitEvent()\"\n >\n </valtimo-dossier-detail-task-detail>\n }\n </div>\n }\n </as-split-area>\n </as-split>\n </div>\n </div>\n\n <valtimo-dossier-supporting-process-start-modal\n [isAdmin]=\"isAdmin$ | async\"\n (formSubmit)=\"tabLoader.refreshView()\"\n #supportingProcessStartModal\n ></valtimo-dossier-supporting-process-start-modal>\n</div>\n\n<ng-template\n #caseDetailHeader\n let-canHaveAssignee=\"canHaveAssignee\"\n let-document=\"document\"\n let-canAssign=\"canAssign\"\n>\n <div class=\"row\" *ngIf=\"(customDossierHeaderItems || []).length > 0\">\n <span\n *ngFor=\"let item of customDossierHeaderItems\"\n [ngClass]=\"{\n h1: item.textSize === 'xl',\n h2: item.textSize === 'lg',\n h3: item.textSize === 'md',\n h4: item.textSize === 'sm',\n h5: item.textSize === 'xs',\n }\"\n class=\"mb-0 mt-0 align-self-end col-xl-{{ item.columnSize }} col-lg-{{\n item.columnSize * 2\n }} {{ item.customClass }}\"\n >\n <span *ngIf=\"item.label\">{{ item.label | translate }}</span>\n\n <span *ngIf=\"item.label && item.value\">: </span>\n\n <strong>{{ item.value }}</strong>\n </span>\n </div>\n\n <ng-container\n *ngTemplateOutlet=\"\n caseDetailAssignee;\n context: {canHaveAssignee: canHaveAssignee, document: document, canAssign: canAssign}\n \"\n ></ng-container>\n</ng-template>\n\n<ng-template\n #caseDetailAssignee\n let-canHaveAssignee=\"canHaveAssignee\"\n let-document=\"document\"\n let-canAssign=\"canAssign\"\n>\n <div *ngIf=\"canHaveAssignee && document\">\n <valtimo-dossier-assign-user\n *ngIf=\"canAssignLoaded$ | async\"\n [assigneeFullName]=\"document?.assigneeFullName\"\n [assigneeId]=\"document.assigneeId\"\n [documentId]=\"document.id\"\n [hasPermission]=\"canAssign\"\n (assignmentOfDocumentChanged)=\"assignmentOfDocumentChanged()\"\n ></valtimo-dossier-assign-user>\n </div>\n</ng-template>\n\n<ng-template #claimButton let-canClaim=\"canClaim\" let-canHaveAssignee=\"canHaveAssignee\">\n <cds-overflow-menu-option\n *ngIf=\"canClaim && canHaveAssignee\"\n [disabled]=\"(isAssigning$ | async) || (isAssignedToCurrentUser$ | async)\"\n (click)=\"claimAssignee()\"\n >\n {{ 'dossier.claimAssigneeCase' | translate }}\n </cds-overflow-menu-option>\n</ng-template>\n\n<ng-template #unassignButton let-canHaveAssignee=\"canHaveAssignee\" let-assigneeId=\"assigneeId\">\n <cds-overflow-menu-option\n *ngIf=\"canHaveAssignee\"\n [disabled]=\"!assigneeId\"\n (selected)=\"unassignAssignee()\"\n >\n {{ 'assignDocument.remove' | translate }}\n </cds-overflow-menu-option>\n</ng-template>\n\n<ng-template #deleteButton let-canDelete=\"canDelete\">\n <cds-overflow-menu-option\n *ngIf=\"canDelete\"\n [disabled]=\"isDeleting$ | async\"\n (click)=\"deleteDocument()\"\n type=\"danger\"\n >\n {{ 'dossier.delete.delete' | translate }}\n </cds-overflow-menu-option>\n</ng-template>\n\n<ng-template #customStartTrigger>\n <button\n [size]=\"(compactMode$ | async) ? 'sm' : 'lg'\"\n cdsButton=\"primary\"\n [disabled]=\"processDocumentDefinitions.length === 0\"\n [ngbTooltip]=\"processDocumentDefinitions.length === 0 ? 'No action' : null\"\n >\n {{ 'dossier.startSubProcess' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"chevron--down\" size=\"16\"></svg>\n </button>\n</ng-template>\n\n<valtimo-confirmation-modal\n confirmButtonTextTranslationKey=\"dossier.delete.confirm\"\n confirmButtonType=\"danger\"\n contentTranslationKey=\"dossier.delete.description\"\n [showModalSubject$]=\"showDeleteModal$\"\n titleTranslationKey=\"dossier.delete.delete\"\n (confirmEvent)=\"onConfirmDelete()\"\n></valtimo-confirmation-modal>\n\n<ng-container renderInPageHeader [fullWidth]=\"true\">\n <ng-template>\n <div\n class=\"dossier-actions\"\n [ngClass]=\"{'--compact': compactMode$ | async}\"\n *ngIf=\"{\n assigneeId: assigneeId$ | async,\n canAssign: canAssign$ | async,\n canClaim: canClaim$ | async,\n canHaveAssignee: canHaveAssignee$ | async,\n canDelete: canDelete$ | async,\n document: document$ | async,\n caseStatus: caseStatus$ | async,\n } as obs\"\n >\n <div\n class=\"dossier-status-assign-custom-title\"\n [ngClass]=\"{'--compact': compactMode$ | async}\"\n >\n @if (obs.caseStatus) {\n <cds-tag size=\"sm\" [type]=\"obs.caseStatus.tagType\" [title]=\"obs.caseStatus.title\">{{\n obs.caseStatus.title\n }}</cds-tag>\n }\n\n <div class=\"dossier-assign-user\" [ngClass]=\"{'--compact': compactMode$ | async}\">\n <ng-container\n *ngTemplateOutlet=\"\n caseDetailAssignee;\n context: {\n canHaveAssignee: obs.canHaveAssignee,\n document: obs.document,\n canAssign: obs.canAssign,\n }\n \"\n ></ng-container>\n </div>\n\n <ng-container *ngTemplateOutlet=\"caseDetailHeader\"></ng-container>\n </div>\n\n <div class=\"buttons-container\">\n <cds-overflow-menu\n [ngClass]=\"{'--compact': compactMode$ | async}\"\n *ngIf=\"obs.canHaveAssignee || obs.canDelete\"\n flip=\"true\"\n [offset]=\"(compactMode$ | async) ? {y: 48, x: -4} : {y: 48, x: 4}\"\n class=\"overflow-button assign-overflow\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n claimButton;\n context: {canClaim: obs.canClaim, canHaveAssignee: obs.canHaveAssignee}\n \"\n >\n </ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n unassignButton;\n context: {canHaveAssignee: obs.canHaveAssignee, assigneeId: obs.assigneeId}\n \"\n >\n </ng-container>\n <ng-container *ngTemplateOutlet=\"deleteButton; context: {canDelete: obs.canDelete}\">\n </ng-container>\n </cds-overflow-menu>\n\n <cds-overflow-menu\n valtimoCdsOverflowButton\n [ngClass]=\"{'--compact': compactMode$ | async}\"\n [width]=\"dropdownWidth$ | async\"\n [customTrigger]=\"customStartTrigger\"\n [offset]=\"{y: 48, x: 35}\"\n class=\"overflow-button case-detail-overflow\"\n >\n <cds-overflow-menu-option\n *ngFor=\"let processDocumentDefinition of processDocumentDefinitions\"\n [attr.title]=\"processDocumentDefinition.displayName\"\n (click)=\"startProcess(processDocumentDefinition)\"\n >\n {{ processDocumentDefinition.displayName }}\n </cds-overflow-menu-option>\n </cds-overflow-menu>\n </div>\n </div>\n </ng-template>\n</ng-container>\n", styles: [".main-content{overflow:hidden;padding-bottom:0}.main-content--no-horizontal-overflow{overflow-x:hidden}.tab-container{height:min-content;min-height:300px;overflow-y:auto;max-height:calc(100vh - 226px);overflow-x:hidden}.tab-container--compact{max-height:calc(100vh - 176px)}.tab-container:has(>.tab--no-margin){padding:0!important}.tab-container:has(>.tab--no-min-height){min-height:unset}.tab-container:has(>.tab--no-background){background:transparent!important}.tab-content-container{overflow:hidden;display:flex;gap:32px;overflow:auto;margin-bottom:16px;max-height:calc(100vh - 226px)}.tab-content-container--compact{max-height:calc(100vh - 176px)}.loading-container{display:flex;justify-content:center;flex-direction:row}.dossier-detail-page-header{display:flex;width:100%;justify-content:flex-start;padding-bottom:5px}.dossier-detail-page-header ::ng-deep .cds--tag{margin:0}.case-detail-tabs{display:flex;margin-bottom:24px}.case-detail-tabs cds-tab{display:none!important}.cds--overflow-menu-options{margin-top:32px}.assign-overflow{margin-right:8px}.buttons-container{display:flex;flex-direction:row}.dossier-actions{display:flex;width:100%;justify-content:space-between;align-items:flex-end;padding-bottom:4px}.dossier-actions.--compact{padding-bottom:0;align-items:flex-start}.dossier-actions ::ng-deep .version-selection{width:160px}.dossier-actions ::ng-deep .version-selection .cds--list-box__selection{display:none}.dossier-status-assign-custom-title{display:flex;gap:16px;align-items:flex-end}.dossier-status-assign-custom-title .cds--tag{margin:0;overflow:hidden;text-overflow:ellipsis;line-height:24px;display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;max-width:100%}.dossier-status-assign-custom-title.--compact{align-items:center}.task-panel{width:100%;transition:height .15s ease-in-out}:host ::ng-deep .container-fluid{height:100%!important;width:100%!important;margin:0!important;padding:0!important}::ng-deep .tab-content-container .as-split-gutter{background-color:transparent!important;--_as-gutter-icon-disabled: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/wcAAgEBAYcDngAAAAAASUVORK5CYII=);--_as-gutter-icon-horizontal: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAABQJJREFUeF7dWll22zAMpNwzlM5xmpMlOVl6mzrKHexWm8UFy4xIp+/FP3mxQWAwWAiRGsJ3/gwhhJvt4CRCfgCtosYhDOHm4SlW7rZyq9t/R7GsZoYQDhCA89UIrzakKuQtpRTiHv03ycJB3t8KuU9AByNfw5dWJpj1h5YABmGRsvgufzsSG21NEwGWUrv5yiuZb31yMZoAAjBFPqBdor9G0vpwu2+PBgE6TK/q0pUxxiwZxnE0SefkE0sHWQUygGG3ll0c2tGNn+M0DiSfHDlHQBu2rffoWgBWPRHWIUreM654li5bMwDQBIhI9naHFgVQCSS2PHliWlLm0/YsMrcwK6ISp1QGANhzG7XFDj2gUFr8yzrkydOJ6CyACBB1lIWkbPyeQ2UQ2ZKxksCLft4EaWqB/AshHCdg0b/1gB7wJB1QBrQ0ml4E2MMyFgxJ6iABuEGdgCUeZVQm+fQ7fhfAsflzAKFLS1G2ptmMwUpDl1oyAGxo2fw2hHBzjpsm+XiO2TGQF1GWACJGfecAjHmgCTZum/lQfezQTZ3L7z+g3goc2xGtFT86A0qLh5pgjPF13aLmv9aHdYiVn8uMwFNixQlYqVuNvayK3sZxNElgHarlP6duo2bpOcbXWxheVhkTj7Tv4ATsTG/OL6CG8DZ+KCQMIcSf6HnAAo8hrAjGRpIblLxveDm8/q4YC6fT6flyufzWBhXGoTWd4QOUp6enX9fr9X2od6SFhJlTu4FBGZA5n+jbnddZjPG8nz8lo222ItHJEraRICAAMmG6rPGb2FTjedqHsET+4/Lbu+phHWLlJ/g+Cd4gpJDgp71HHzAHFCqOEFCSULjrNkaxw2rO/zidnv/MNY99WIcY+TKufibUmOcSEB5IxLTHXLal2FG4h83VPzET1h6wUxDP8fXfJW5V8xuQhqFwVtGNgDuQ6Yo367Pb9ixdjVckVE1QS/0ekZhybRw/zMZblkBpd1sMPIdJkAsClF2ghQQPYJYBQjp5BKCBEHD4JZDi6bED3AebRDFbAp58Ski3JrgphQcgozEwXZ2dBH3nZ2Bq5KcyahuEgO1wIWBnyIuoS5hA9pHIp01dnANSdlvKwXWocRC6Pw/U70MBozCQAWI5JKDF5wFrtk8uR6XKYQibnL9dr+/CjgA5v81AamMFByTTmOhQp56hPw5/vrrvx61euz2gZKfHgcj98bUkgjo/WJCxeMrJFyQgR8ocQcGnwqsJpgSK8pymTPeIThus4DKwBKWJFNsFklEcOT9ApyFADswAQJMiwkaUldeQ7ZTKDWf79tsSgIasDwGduro1CbY+hVqZgpJ1SA5L6bQHMJNjOy19MsCgBiNgV8DK+1GxSXoYAcMwhNttOedPIZTPAhm8bQ6Anx57ZMBGgfHuXs6yuEANBBtR/2bIjzkj8bAMSIYU+KLDaoKSU8KFCOP7LAsTcDTZ2jPAfrUWf3VGnwdo1pgF5xiz9yhazwOExwfv9suEm2XArJwNtSP/+AxgwlHL1iVwiAUdhEaAxhtLWGbZDEbPEiCyhHWIla93KO7AvMoAwre7bW5jxCAfwaHnoa4N3gVU5X2RthX0gdVNBPhDZnYgzMH7ImKbCOA8wnfsVO+jeUgIEHfYFUs7jHYNLN2YvJkBXwYaNuQIwnp2cgoCag3LN1Z2+EwfwCVPLPAOJ1n05oDt9x5oRR37Pb72s/e+kU81L/EXSRwjcUdkvjUAAAAASUVORK5CYII=)}::ng-deep .tab-content-container .as-split-gutter-icon{background-repeat:no-repeat;background-size:16px 16px}::ng-deep .tab-content-container--dark .as-split-gutter{--_as-gutter-icon-horizontal: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAABPlJREFUeF7tm1tW3DAMhu2+krCmdmWlKytrIuGV9HjixDddfjkOtOd0XmAGWZfPsiw7g3fVyzvntvpD9H01+JIuwCamX5YKf9VfmCVaDze2S2fXIDG+CGC8YsrqMCvDFDmHZYCeI5gE6LietD2LlNb6uQAQTLWfCDTLmLpOIfoRvxEZydZn+pH7+vdlAEJyoIwIwDIrFtk7C2TyA/Po9gxY1zVWrN2haZq85FqS3zEF+YET3qi6rFzjfAR0yGkBwQA0wyFU75zf5MaOBYDoR2YGDigqY+U7HOKHlAsFiQOXqax+JYCYBGJr32ZAB+lEpxwc3i1nDcDWtBUYPjN8p35VBxf/4/MQUI7lqAGPzwjYBQDv3PQ0+Ue/CjV/sODp8+UiyNE7XLHO6EM+Dg4/ntBdAI69zdIqBlgTlDldADLN9a7R551cDot0kDPNbn40AIh6LSS4DS0Be9jJg7sAXPHJfBZojbXriMscGgDvvhUYmRGEes6iocJiyVejWdelYDPNk5cquhnAxVSAlgDZQG/7bUqKjvZEDqgdYwaAzQsrVQHowFkPqd5bA4LlO1ytp+zoFM0Ml2V5CYPmeX78lF7v67rla8B6GpynKZxnxBfmD03MvASCMe/9z+DRtm2/SAiZLXRGqcapbYTaICB/BHwggN1wbuzQSUHI3UQBHPqo+wPO/7dlefkWJ0PyR0ofEIAjg49Z8GOe51fOCAYgIcPkd2vLsnz33v+ubadJ0TZw8Fqcmnkk+CBjCahHXodQ49mhHGjUDJCDf37Vjmn54Sa4MuxGaL/weWzDdggJigjgDL7KpG3bxLTPmY/PALqa90JgAahpf/ohb8jjAfAlrQdCCSDG0gRPxCiHzf81XwKUVA1M7gDwbojbspsM4GZea3jov5cFp6cGoHYRFCWE5FthQwKAGCnLS9vD6UXwXbnIRpGUcsH3D6JxI2sADwFHwEnqAI4HKW0AB07ci6QDXgLHELUIghPxbxRBBukICDuAZMCaAbu8XnLf1K4wzBjdGYpzSUGI66ntBQg/8QzYB+PyyW18++sAEHvu8wSY02IbosyONaBTPj7XO6/F+SxVzgPKRooWlN7l0A0g+i0tGXrmvdu2D/qYTrBgO0GKG3ocRlrhB/jm6a13zR2i8GAk+BOOw/lmy95RMIlgAlAvh4ex5/ll5CUndYMkJfGNFyL84sCuoHa3tSVQW9HkGxjeueUNv6Krx7dbTO5R/J1FARSQ9X3d8gyh13RSZAYA9iOcmHkJWO1ZA+LkRdbaRAlO3wogKL/+/YDZl5cuFQogC/P4k/j+mx0AYVDyYVQGWDMPlbcDQDVHOREA1DmGDAgv7emA0bEofgmAmn3euXUpT3d9Z4G+4PRR+6PR9oigRqarPiT6ng4nBzRguCe0ZJEBatyqQGvkfw249VtiHTNSzdGZAddVESmW1YBDv5bSpoxBnOZkst7h6jISx5sCEltnJFp7KKkG3KNfPQvULluB2UMuR1zaBiXjB08+IJr4FQA9c3gDgNINKSDK4SCff67VjEsZEI+Cl3Scg3vwA4cU6uu0bRL3d4k3ZEDm3mAoY2YqdX7BvVsA2OJW9qlhUe+KQvObX1DYANS+2iIdHArR0bArgXfUBoAMoewopH9ROd3oBmcZiMkOANA3sXUq9mm5Pqrvq7IYXLo3Vs713ao7WRAZ8NULfTACRd0fdjtUcYyr1cIAAAAASUVORK5CYII=)}.spacing-case-tags{margin-bottom:10px}\n"] }]
479
+ args: [{ selector: 'valtimo-dossier-detail', providers: [DossierTabService, DossierDetailLayoutService, NotificationService], template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n<div\n class=\"main-content\"\n [ngClass]=\"{'main-content--no-horizontal-overflow': tabHorizontalOverflowDisabled()}\"\n>\n <div class=\"container-fluid\">\n <ng-container *ngIf=\"caseTags$ | async as caseTags\">\n @if (caseTags && caseTags.length > 0) {\n <div class=\"case-tags\">\n @for (tag of caseTags; track tag) {\n <cds-tag size=\"sm\" [type]=\"tag.tagType\">\n {{ tag.title }}\n </cds-tag>\n }\n </div>\n }\n </ng-container>\n\n <ng-container *ngTemplateOutlet=\"tabs\"></ng-container>\n\n <ng-template #tabs>\n <ng-container *ngIf=\"{activeTab: activeTab$ | async} as obs\">\n <cds-tabs *ngIf=\"tabLoader\" type=\"inline\" class=\"case-detail-tabs\">\n <cds-tab\n *ngFor=\"let tab of tabLoader.tabs\"\n [active]=\"tab.name === (activeTabName$ | async)\"\n heading=\"{{ tab | tabTranslate | async }}\"\n (selected)=\"onTabSelected(tab, obs.activeTab)\"\n ></cds-tab>\n </cds-tabs>\n </ng-container>\n </ng-template>\n <div\n #tabContentContainer\n class=\"tab-content-container\"\n [ngClass]=\"{\n 'tab-content-container--dark': isDarkMode$ | async,\n 'tab-content-container--compact': compactMode$ | async,\n }\"\n *ngIf=\"{\n noTabsConfigured: noTabsConfigured$ | async,\n showTaskList: showTaskList$ | async,\n showNoAccess: showNoAccess$ | async,\n dossierDetailLayout: dossierDetailLayout$ | async,\n openTaskAndProcessLinkInModal: openTaskAndProcessLinkInModal$ | async,\n taskAndProcessLinkOpenedInPanel: taskAndProcessLinkOpenedInPanel$ | async,\n } as tabContentObs\"\n >\n <as-split\n direction=\"horizontal\"\n [disabled]=\"!tabContentObs.dossierDetailLayout.widthAdjustable\"\n [gutterSize]=\"DOSSIER_DETAIL_GUTTER_SIZE\"\n [unit]=\"tabContentObs.dossierDetailLayout.unit\"\n >\n <as-split-area\n [size]=\"tabContentObs.dossierDetailLayout.leftPanelWidth\"\n [minSize]=\"tabContentObs.dossierDetailLayout.leftPanelMinWidth\"\n [maxSize]=\"tabContentObs.dossierDetailLayout.leftPanelMaxWidth\"\n >\n <div\n class=\"card-body bg-white p-5 position-relative tab-container\"\n [class.tab-container--compact]=\"compactMode$ | async\"\n >\n <div *ngIf=\"loadingTabs$ | async\" class=\"loading-container\">\n <cds-loading></cds-loading>\n </div>\n\n <valtimo-no-results\n *ngIf=\"tabContentObs.showNoAccess\"\n description=\"{{ 'dossier.noAccess.description' | translate }}\"\n title=\"{{ 'dossier.noAccess.title' | translate }}\"\n illustration=\"valtimo-layout/img/emptystate-not-authorised.svg\"\n >\n </valtimo-no-results>\n\n <valtimo-no-results\n *ngIf=\"tabContentObs.noTabsConfigured\"\n [description]=\"'dossier.tabs.noResultsDescription' | translate\"\n [title]=\"'dossier.tabs.noResults' | translate\"\n ></valtimo-no-results>\n\n <ng-template #tabContainer></ng-template>\n\n <div class=\"clearfix\"></div>\n </div>\n </as-split-area>\n\n <as-split-area\n *ngIf=\"tabContentObs.dossierDetailLayout.showRightPanel\"\n [size]=\"tabContentObs.dossierDetailLayout.rightPanelWidth\"\n [minSize]=\"tabContentObs.dossierDetailLayout.rightPanelMinWidth\"\n [maxSize]=\"tabContentObs.dossierDetailLayout.rightPanelMaxWidth\"\n >\n @if (tabContentObs.showTaskList) {\n <div class=\"task-panel\">\n @if (!tabContentObs.taskAndProcessLinkOpenedInPanel) {\n <valtimo-dossier-detail-task-list\n [openTaskAndProcessLinkInModal]=\"tabContentObs.openTaskAndProcessLinkInModal\"\n (taskClickEvent)=\"onTaskClickEvent($event)\"\n (formSubmitEvent)=\"onFormSubmitEvent()\"\n ></valtimo-dossier-detail-task-list>\n }\n\n @if (tabContentObs.taskAndProcessLinkOpenedInPanel) {\n <valtimo-dossier-detail-task-detail\n [taskAndProcessLink]=\"tabContentObs.taskAndProcessLinkOpenedInPanel\"\n (activeChange)=\"onActiveChangeEvent($event)\"\n (closeEvent)=\"onTaskDetailsClose()\"\n (formSubmit)=\"onFormSubmitEvent()\"\n >\n </valtimo-dossier-detail-task-detail>\n }\n </div>\n }\n </as-split-area>\n </as-split>\n </div>\n </div>\n\n <valtimo-dossier-supporting-process-start-modal\n [isAdmin]=\"isAdmin$ | async\"\n (formSubmit)=\"tabLoader.refreshView()\"\n #supportingProcessStartModal\n ></valtimo-dossier-supporting-process-start-modal>\n</div>\n\n<ng-template\n #caseDetailHeader\n let-canHaveAssignee=\"canHaveAssignee\"\n let-document=\"document\"\n let-canAssign=\"canAssign\"\n>\n <div class=\"row\" *ngIf=\"(customDossierHeaderItems || []).length > 0\">\n <span\n *ngFor=\"let item of customDossierHeaderItems\"\n [ngClass]=\"{\n h1: item.textSize === 'xl',\n h2: item.textSize === 'lg',\n h3: item.textSize === 'md',\n h4: item.textSize === 'sm',\n h5: item.textSize === 'xs',\n }\"\n class=\"mb-0 mt-0 align-self-end col-xl-{{ item.columnSize }} col-lg-{{\n item.columnSize * 2\n }} {{ item.customClass }}\"\n >\n <span *ngIf=\"item.label\">{{ item.label | translate }}</span>\n\n <span *ngIf=\"item.label && item.value\">: </span>\n\n <strong>{{ item.value }}</strong>\n </span>\n </div>\n\n <ng-container\n *ngTemplateOutlet=\"\n caseDetailAssignee;\n context: {canHaveAssignee: canHaveAssignee, document: document, canAssign: canAssign}\n \"\n ></ng-container>\n</ng-template>\n\n<ng-template\n #caseDetailAssignee\n let-canHaveAssignee=\"canHaveAssignee\"\n let-document=\"document\"\n let-canAssign=\"canAssign\"\n>\n <div *ngIf=\"canHaveAssignee && document\">\n <valtimo-dossier-assign-user\n *ngIf=\"canAssignLoaded$ | async\"\n [assigneeFullName]=\"document?.assigneeFullName\"\n [assigneeId]=\"document.assigneeId\"\n [documentId]=\"document.id\"\n [hasPermission]=\"canAssign\"\n (assignmentOfDocumentChanged)=\"assignmentOfDocumentChanged()\"\n ></valtimo-dossier-assign-user>\n </div>\n</ng-template>\n\n<ng-template #claimButton let-canClaim=\"canClaim\" let-canHaveAssignee=\"canHaveAssignee\">\n <cds-overflow-menu-option\n *ngIf=\"canClaim && canHaveAssignee\"\n [disabled]=\"(isAssigning$ | async) || (isAssignedToCurrentUser$ | async)\"\n (click)=\"claimAssignee()\"\n >\n {{ 'dossier.claimAssigneeCase' | translate }}\n </cds-overflow-menu-option>\n</ng-template>\n\n<ng-template #unassignButton let-canHaveAssignee=\"canHaveAssignee\" let-assigneeId=\"assigneeId\">\n <cds-overflow-menu-option\n *ngIf=\"canHaveAssignee\"\n [disabled]=\"!assigneeId\"\n (selected)=\"unassignAssignee()\"\n >\n {{ 'assignDocument.remove' | translate }}\n </cds-overflow-menu-option>\n</ng-template>\n\n<ng-template #deleteButton let-canDelete=\"canDelete\">\n <cds-overflow-menu-option\n *ngIf=\"canDelete\"\n [disabled]=\"isDeleting$ | async\"\n (click)=\"deleteDocument()\"\n type=\"danger\"\n >\n {{ 'dossier.delete.delete' | translate }}\n </cds-overflow-menu-option>\n</ng-template>\n\n<ng-template #customStartTrigger>\n <button\n [size]=\"(compactMode$ | async) ? 'sm' : 'lg'\"\n cdsButton=\"primary\"\n [disabled]=\"processDocumentDefinitions.length === 0\"\n [ngbTooltip]=\"processDocumentDefinitions.length === 0 ? 'No action' : null\"\n >\n {{ 'dossier.startSubProcess' | translate }}\n\n <svg class=\"cds--btn__icon\" cdsIcon=\"chevron--down\" size=\"16\"></svg>\n </button>\n</ng-template>\n\n<valtimo-confirmation-modal\n confirmButtonTextTranslationKey=\"dossier.delete.confirm\"\n confirmButtonType=\"danger\"\n contentTranslationKey=\"dossier.delete.description\"\n [showModalSubject$]=\"showDeleteModal$\"\n titleTranslationKey=\"dossier.delete.delete\"\n (confirmEvent)=\"onConfirmDelete()\"\n></valtimo-confirmation-modal>\n\n<ng-container renderInPageHeader [fullWidth]=\"true\">\n <ng-template>\n <div\n class=\"dossier-actions\"\n [ngClass]=\"{\n 'dossier-actions--compact': compactMode$ | async,\n 'dossier-actions--small-title': smallTitle$ | async,\n }\"\n *ngIf=\"{\n assigneeId: assigneeId$ | async,\n canAssign: canAssign$ | async,\n canClaim: canClaim$ | async,\n canHaveAssignee: canHaveAssignee$ | async,\n canDelete: canDelete$ | async,\n document: document$ | async,\n caseStatus: caseStatus$ | async,\n } as obs\"\n >\n <div\n class=\"dossier-status-assign-custom-title\"\n [ngClass]=\"{'--compact': compactMode$ | async}\"\n >\n @if (obs.caseStatus) {\n <cds-tag size=\"sm\" [type]=\"obs.caseStatus.tagType\" [title]=\"obs.caseStatus.title\">{{\n obs.caseStatus.title\n }}</cds-tag>\n }\n\n <div class=\"dossier-assign-user\" [ngClass]=\"{'--compact': compactMode$ | async}\">\n <ng-container\n *ngTemplateOutlet=\"\n caseDetailAssignee;\n context: {\n canHaveAssignee: obs.canHaveAssignee,\n document: obs.document,\n canAssign: obs.canAssign,\n }\n \"\n ></ng-container>\n </div>\n\n <ng-container *ngTemplateOutlet=\"caseDetailHeader\"></ng-container>\n </div>\n\n <div class=\"buttons-container\">\n <cds-overflow-menu\n [ngClass]=\"{'--compact': compactMode$ | async}\"\n *ngIf=\"obs.canHaveAssignee || obs.canDelete\"\n flip=\"true\"\n [offset]=\"(compactMode$ | async) ? {y: 48, x: -4} : {y: 48, x: 4}\"\n class=\"overflow-button assign-overflow\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n claimButton;\n context: {canClaim: obs.canClaim, canHaveAssignee: obs.canHaveAssignee}\n \"\n >\n </ng-container>\n <ng-container\n *ngTemplateOutlet=\"\n unassignButton;\n context: {canHaveAssignee: obs.canHaveAssignee, assigneeId: obs.assigneeId}\n \"\n >\n </ng-container>\n <ng-container *ngTemplateOutlet=\"deleteButton; context: {canDelete: obs.canDelete}\">\n </ng-container>\n </cds-overflow-menu>\n\n <cds-overflow-menu\n valtimoCdsOverflowButton\n [ngClass]=\"{'--compact': compactMode$ | async}\"\n [width]=\"dropdownWidth$ | async\"\n [customTrigger]=\"customStartTrigger\"\n [offset]=\"{y: 48, x: 35}\"\n class=\"overflow-button case-detail-overflow\"\n >\n <cds-overflow-menu-option\n *ngFor=\"let processDocumentDefinition of processDocumentDefinitions\"\n [attr.title]=\"processDocumentDefinition.displayName\"\n (click)=\"startProcess(processDocumentDefinition)\"\n >\n {{ processDocumentDefinition.displayName }}\n </cds-overflow-menu-option>\n </cds-overflow-menu>\n </div>\n </div>\n </ng-template>\n</ng-container>\n", styles: [".main-content{overflow:hidden;padding-bottom:0}.main-content--no-horizontal-overflow{overflow-x:hidden}.tab-container{height:min-content;min-height:300px;overflow-y:auto;max-height:calc(100vh - 226px);overflow-x:hidden}.tab-container--compact{max-height:calc(100vh - 176px)}.tab-container:has(>.tab--no-margin){padding:0!important}.tab-container:has(>.tab--no-min-height){min-height:unset}.tab-container:has(>.tab--no-background){background:transparent!important}.tab-content-container{overflow:hidden;display:flex;gap:32px;overflow:auto;margin-bottom:16px;max-height:calc(100vh - 226px)}.tab-content-container--compact{max-height:calc(100vh - 176px)}.loading-container{display:flex;justify-content:center;flex-direction:row}.dossier-detail-page-header{display:flex;width:100%;justify-content:flex-start;padding-bottom:5px}.dossier-detail-page-header ::ng-deep .cds--tag{margin:0}.case-detail-tabs{display:flex;margin-bottom:24px}.case-detail-tabs cds-tab{display:none!important}.cds--overflow-menu-options{margin-top:32px}.assign-overflow{margin-right:8px}.buttons-container{display:flex;flex-direction:row}.dossier-actions{display:flex;width:100%;justify-content:space-between;align-items:flex-end;padding-bottom:4px}.dossier-actions--compact,.dossier-actions--small-title{padding-bottom:0;align-items:flex-start}.dossier-actions ::ng-deep .version-selection{width:160px}.dossier-actions ::ng-deep .version-selection .cds--list-box__selection{display:none}.dossier-status-assign-custom-title{display:flex;gap:16px;align-items:flex-end}.dossier-status-assign-custom-title .cds--tag{margin:0;overflow:hidden;text-overflow:ellipsis;line-height:24px;display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;max-width:100%}.dossier-status-assign-custom-title.--compact{align-items:center}.task-panel{width:100%;transition:height .15s ease-in-out}:host ::ng-deep .container-fluid{height:100%!important;width:100%!important;margin:0!important;padding:0!important}::ng-deep .tab-content-container .as-split-gutter{background-color:transparent!important;--_as-gutter-icon-disabled: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/wcAAgEBAYcDngAAAAAASUVORK5CYII=);--_as-gutter-icon-horizontal: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAABQJJREFUeF7dWll22zAMpNwzlM5xmpMlOVl6mzrKHexWm8UFy4xIp+/FP3mxQWAwWAiRGsJ3/gwhhJvt4CRCfgCtosYhDOHm4SlW7rZyq9t/R7GsZoYQDhCA89UIrzakKuQtpRTiHv03ycJB3t8KuU9AByNfw5dWJpj1h5YABmGRsvgufzsSG21NEwGWUrv5yiuZb31yMZoAAjBFPqBdor9G0vpwu2+PBgE6TK/q0pUxxiwZxnE0SefkE0sHWQUygGG3ll0c2tGNn+M0DiSfHDlHQBu2rffoWgBWPRHWIUreM654li5bMwDQBIhI9naHFgVQCSS2PHliWlLm0/YsMrcwK6ISp1QGANhzG7XFDj2gUFr8yzrkydOJ6CyACBB1lIWkbPyeQ2UQ2ZKxksCLft4EaWqB/AshHCdg0b/1gB7wJB1QBrQ0ml4E2MMyFgxJ6iABuEGdgCUeZVQm+fQ7fhfAsflzAKFLS1G2ptmMwUpDl1oyAGxo2fw2hHBzjpsm+XiO2TGQF1GWACJGfecAjHmgCTZum/lQfezQTZ3L7z+g3goc2xGtFT86A0qLh5pgjPF13aLmv9aHdYiVn8uMwFNixQlYqVuNvayK3sZxNElgHarlP6duo2bpOcbXWxheVhkTj7Tv4ATsTG/OL6CG8DZ+KCQMIcSf6HnAAo8hrAjGRpIblLxveDm8/q4YC6fT6flyufzWBhXGoTWd4QOUp6enX9fr9X2od6SFhJlTu4FBGZA5n+jbnddZjPG8nz8lo222ItHJEraRICAAMmG6rPGb2FTjedqHsET+4/Lbu+phHWLlJ/g+Cd4gpJDgp71HHzAHFCqOEFCSULjrNkaxw2rO/zidnv/MNY99WIcY+TKufibUmOcSEB5IxLTHXLal2FG4h83VPzET1h6wUxDP8fXfJW5V8xuQhqFwVtGNgDuQ6Yo367Pb9ixdjVckVE1QS/0ekZhybRw/zMZblkBpd1sMPIdJkAsClF2ghQQPYJYBQjp5BKCBEHD4JZDi6bED3AebRDFbAp58Ski3JrgphQcgozEwXZ2dBH3nZ2Bq5KcyahuEgO1wIWBnyIuoS5hA9pHIp01dnANSdlvKwXWocRC6Pw/U70MBozCQAWI5JKDF5wFrtk8uR6XKYQibnL9dr+/CjgA5v81AamMFByTTmOhQp56hPw5/vrrvx61euz2gZKfHgcj98bUkgjo/WJCxeMrJFyQgR8ocQcGnwqsJpgSK8pymTPeIThus4DKwBKWJFNsFklEcOT9ApyFADswAQJMiwkaUldeQ7ZTKDWf79tsSgIasDwGduro1CbY+hVqZgpJ1SA5L6bQHMJNjOy19MsCgBiNgV8DK+1GxSXoYAcMwhNttOedPIZTPAhm8bQ6Anx57ZMBGgfHuXs6yuEANBBtR/2bIjzkj8bAMSIYU+KLDaoKSU8KFCOP7LAsTcDTZ2jPAfrUWf3VGnwdo1pgF5xiz9yhazwOExwfv9suEm2XArJwNtSP/+AxgwlHL1iVwiAUdhEaAxhtLWGbZDEbPEiCyhHWIla93KO7AvMoAwre7bW5jxCAfwaHnoa4N3gVU5X2RthX0gdVNBPhDZnYgzMH7ImKbCOA8wnfsVO+jeUgIEHfYFUs7jHYNLN2YvJkBXwYaNuQIwnp2cgoCag3LN1Z2+EwfwCVPLPAOJ1n05oDt9x5oRR37Pb72s/e+kU81L/EXSRwjcUdkvjUAAAAASUVORK5CYII=)}::ng-deep .tab-content-container .as-split-gutter-icon{background-repeat:no-repeat;background-size:16px 16px}::ng-deep .tab-content-container--dark .as-split-gutter{--_as-gutter-icon-horizontal: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAABPlJREFUeF7tm1tW3DAMhu2+krCmdmWlKytrIuGV9HjixDddfjkOtOd0XmAGWZfPsiw7g3fVyzvntvpD9H01+JIuwCamX5YKf9VfmCVaDze2S2fXIDG+CGC8YsrqMCvDFDmHZYCeI5gE6LietD2LlNb6uQAQTLWfCDTLmLpOIfoRvxEZydZn+pH7+vdlAEJyoIwIwDIrFtk7C2TyA/Po9gxY1zVWrN2haZq85FqS3zEF+YET3qi6rFzjfAR0yGkBwQA0wyFU75zf5MaOBYDoR2YGDigqY+U7HOKHlAsFiQOXqax+JYCYBGJr32ZAB+lEpxwc3i1nDcDWtBUYPjN8p35VBxf/4/MQUI7lqAGPzwjYBQDv3PQ0+Ue/CjV/sODp8+UiyNE7XLHO6EM+Dg4/ntBdAI69zdIqBlgTlDldADLN9a7R551cDot0kDPNbn40AIh6LSS4DS0Be9jJg7sAXPHJfBZojbXriMscGgDvvhUYmRGEes6iocJiyVejWdelYDPNk5cquhnAxVSAlgDZQG/7bUqKjvZEDqgdYwaAzQsrVQHowFkPqd5bA4LlO1ytp+zoFM0Ml2V5CYPmeX78lF7v67rla8B6GpynKZxnxBfmD03MvASCMe/9z+DRtm2/SAiZLXRGqcapbYTaICB/BHwggN1wbuzQSUHI3UQBHPqo+wPO/7dlefkWJ0PyR0ofEIAjg49Z8GOe51fOCAYgIcPkd2vLsnz33v+ubadJ0TZw8Fqcmnkk+CBjCahHXodQ49mhHGjUDJCDf37Vjmn54Sa4MuxGaL/weWzDdggJigjgDL7KpG3bxLTPmY/PALqa90JgAahpf/ohb8jjAfAlrQdCCSDG0gRPxCiHzf81XwKUVA1M7gDwbojbspsM4GZea3jov5cFp6cGoHYRFCWE5FthQwKAGCnLS9vD6UXwXbnIRpGUcsH3D6JxI2sADwFHwEnqAI4HKW0AB07ci6QDXgLHELUIghPxbxRBBukICDuAZMCaAbu8XnLf1K4wzBjdGYpzSUGI66ntBQg/8QzYB+PyyW18++sAEHvu8wSY02IbosyONaBTPj7XO6/F+SxVzgPKRooWlN7l0A0g+i0tGXrmvdu2D/qYTrBgO0GKG3ocRlrhB/jm6a13zR2i8GAk+BOOw/lmy95RMIlgAlAvh4ex5/ll5CUndYMkJfGNFyL84sCuoHa3tSVQW9HkGxjeueUNv6Krx7dbTO5R/J1FARSQ9X3d8gyh13RSZAYA9iOcmHkJWO1ZA+LkRdbaRAlO3wogKL/+/YDZl5cuFQogC/P4k/j+mx0AYVDyYVQGWDMPlbcDQDVHOREA1DmGDAgv7emA0bEofgmAmn3euXUpT3d9Z4G+4PRR+6PR9oigRqarPiT6ng4nBzRguCe0ZJEBatyqQGvkfw249VtiHTNSzdGZAddVESmW1YBDv5bSpoxBnOZkst7h6jISx5sCEltnJFp7KKkG3KNfPQvULluB2UMuR1zaBiXjB08+IJr4FQA9c3gDgNINKSDK4SCff67VjEsZEI+Cl3Scg3vwA4cU6uu0bRL3d4k3ZEDm3mAoY2YqdX7BvVsA2OJW9qlhUe+KQvObX1DYANS+2iIdHArR0bArgXfUBoAMoewopH9ROd3oBmcZiMkOANA3sXUq9mm5Pqrvq7IYXLo3Vs713ao7WRAZ8NULfTACRd0fdjtUcYyr1cIAAAAASUVORK5CYII=)}.case-tags{margin-bottom:16px}\n"] }]
466
480
  }], ctorParameters: () => [{ type: i1.BreadcrumbService }, { type: i2.CaseStatusService }, { type: i1.CdsThemeService }, { type: i0.ComponentFactoryResolver }, { type: i3.ConfigService }, { type: i2.DocumentService }, { type: i4.DossierDetailLayoutService }, { type: i4.DossierService }, { type: i4.DossierTabService }, { type: i5.IconService }, { type: i6.KeycloakService }, { type: i7.NGXLogger }, { type: i5.NotificationService }, { type: i1.PageHeaderService }, { type: i1.PageTitleService }, { type: i8.PermissionService }, { type: i9.TranslateService }, { type: i0.Renderer2 }, { type: i10.ActivatedRoute }, { type: i10.Router }, { type: i11.WidgetsService }, { type: i12.UserProviderService }, { type: Document, decorators: [{
467
481
  type: Inject,
468
482
  args: [DOCUMENT]
@@ -476,4 +490,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
476
490
  type: ViewChild,
477
491
  args: ['tabContentContainer']
478
492
  }] } });
479
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9zc2llci1kZXRhaWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby9kb3NzaWVyL3NyYy9saWIvY29tcG9uZW50cy9kb3NzaWVyLWRldGFpbC9kb3NzaWVyLWRldGFpbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0aW1vL2Rvc3NpZXIvc3JjL2xpYi9jb21wb25lbnRzL2Rvc3NpZXItZGV0YWlsL2Rvc3NpZXItZGV0YWlsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFFTCxTQUFTLEVBR1QsTUFBTSxFQUdOLFNBQVMsRUFDVCxnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFpQixlQUFlLEVBQTJCLE1BQU0saUJBQWlCLENBQUM7QUFDMUYsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUc1QyxPQUFPLEVBRUwsZ0JBQWdCLEVBRWhCLGtCQUFrQixFQUdsQix1QkFBdUIsR0FDeEIsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QixPQUFPLEVBR0wsYUFBYSxFQUliLHVCQUF1QixHQUV4QixNQUFNLG1CQUFtQixDQUFDO0FBSTNCLE9BQU8sRUFBYyxtQkFBbUIsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBRTNFLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUU1QixPQUFPLEVBQUMsZUFBZSxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFjLEVBQUUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRSxNQUFNLE1BQU0sQ0FBQztBQUMxSSxP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aEIsQ0FBQyxDQUFDLDJDQUEyQyxDQUFDLE1BQU07Z0JBQ3BELENBQUMsQ0FBQywyQ0FBMkMsQ0FBQyxLQUFLLENBQ3hELENBQUM7SUFDSixDQUFDOytHQS9tQlUsc0JBQXNCLDBzQkFtUHZCLFFBQVE7bUdBblBQLHNCQUFzQixpREFGdEIsQ0FBQyxpQkFBaUIsRUFBRSwwQkFBMEIsRUFBRSxtQkFBbUIsQ0FBQywrT0FTN0MsZ0JBQWdCLGtLQzFGcEQsKytYQThVQTs7NEZEM1BhLHNCQUFzQjtrQkFObEMsU0FBUzsrQkFDRSx3QkFBd0IsYUFHdkIsQ0FBQyxpQkFBaUIsRUFBRSwwQkFBMEIsRUFBRSxtQkFBbUIsQ0FBQzs7MEJBcVA1RSxNQUFNOzJCQUFDLFFBQVE7eUNBOU9sQixzQkFBc0I7c0JBRHJCLFNBQVM7dUJBQUMsNkJBQTZCO2dCQUl4QyxnQkFBZ0I7c0JBRGYsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUM7Z0JBSWxDLG9CQUFvQjtzQkFEcEMsU0FBUzt1QkFBQyxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMTUtMjAyNCBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHtET0NVTUVOVH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICBFbGVtZW50UmVmLFxuICBJbmplY3QsXG4gIE9uRGVzdHJveSxcbiAgUmVuZGVyZXIyLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZSwgTmF2aWdhdGlvblN0YXJ0LCBQYXJhbU1hcCwgUGFyYW1zLCBSb3V0ZXJ9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge0NoZXZyb25Eb3duMTZ9IGZyb20gJ0BjYXJib24vaWNvbnMnO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7UGVybWlzc2lvblNlcnZpY2V9IGZyb20gJ0B2YWx0aW1vL2FjY2Vzcy1jb250cm9sJztcbmltcG9ydCB7XG4gIEJyZWFkY3J1bWJTZXJ2aWNlLFxuICBDQVJCT05fQ09OU1RBTlRTLFxuICBDZHNUaGVtZVNlcnZpY2UsXG4gIEN1cnJlbnRDYXJib25UaGVtZSxcbiAgUGFnZUhlYWRlclNlcnZpY2UsXG4gIFBhZ2VUaXRsZVNlcnZpY2UsXG4gIFBlbmRpbmdDaGFuZ2VzQ29tcG9uZW50LFxufSBmcm9tICdAdmFsdGltby9jb21wb25lbnRzJztcbmltcG9ydCB7Q29uZmlnU2VydmljZX0gZnJvbSAnQHZhbHRpbW8vY29uZmlnJztcbmltcG9ydCB7XG4gIENhc2VTdGF0dXNTZXJ2aWNlLFxuICBDYXNlVGFnLFxuICBDYXNlVGFnc1V0aWxzLFxuICBEb2N1bWVudCBhcyBWYWx0aW1vRG9jdW1lbnQsXG4gIERvY3VtZW50U2VydmljZSxcbiAgSW50ZXJuYWxDYXNlU3RhdHVzLFxuICBJbnRlcm5hbENhc2VTdGF0dXNVdGlscyxcbiAgUHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbixcbn0gZnJvbSAnQHZhbHRpbW8vZG9jdW1lbnQnO1xuaW1wb3J0IHtUYXNrV2l0aFByb2Nlc3NMaW5rfSBmcm9tICdAdmFsdGltby9wcm9jZXNzLWxpbmsnO1xuaW1wb3J0IHtVc2VyUHJvdmlkZXJTZXJ2aWNlfSBmcm9tICdAdmFsdGltby9zZWN1cml0eSc7XG5pbXBvcnQge0ludGVybWVkaWF0ZVN1Ym1pc3Npb259IGZyb20gJ0B2YWx0aW1vL3Rhc2snO1xuaW1wb3J0IHtJY29uU2VydmljZSwgTm90aWZpY2F0aW9uU2VydmljZX0gZnJvbSAnY2FyYm9uLWNvbXBvbmVudHMtYW5ndWxhcic7XG5pbXBvcnQge0tleWNsb2FrU2VydmljZX0gZnJvbSAna2V5Y2xvYWstYW5ndWxhcic7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQge05HWExvZ2dlcn0gZnJvbSAnbmd4LWxvZ2dlcic7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgZmlsdGVyLCBtYXAsIE9ic2VydmFibGUsIG9mLCBzdGFydFdpdGgsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgc3dpdGNoTWFwLCB0YWtlLCB0YXAsfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIERPU1NJRVJfREVUQUlMX0RFRkFVTFRfRElTUExBWV9TSVpFLFxuICBET1NTSUVSX0RFVEFJTF9ERUZBVUxUX0RJU1BMQVlfVFlQRSxcbiAgRE9TU0lFUl9ERVRBSUxfR1VUVEVSX1NJWkUsXG4gIERPU1NJRVJfREVUQUlMX1NUQVJUX1BST0NFU1NfRFJPUERPV05fV0lEVEgsXG59IGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQge1RhYkltcGwsIFRhYkxvYWRlckltcGx9IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQge1xuICBDQU5fQVNTSUdOX0NBU0VfUEVSTUlTU0lPTixcbiAgQ0FOX0NMQUlNX0NBU0VfUEVSTUlTU0lPTixcbiAgQ0FOX0RFTEVURV9DQVNFX1BFUk1JU1NJT04sXG4gIENBTl9WSUVXX0NBU0VfUEVSTUlTU0lPTixcbiAgRE9TU0lFUl9ERVRBSUxfUEVSTUlTU0lPTl9SRVNPVVJDRSxcbn0gZnJvbSAnLi4vLi4vcGVybWlzc2lvbnMnO1xuaW1wb3J0IHtEb3NzaWVyRGV0YWlsTGF5b3V0U2VydmljZSwgRG9zc2llclNlcnZpY2UsIERvc3NpZXJUYWJTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcyc7XG5pbXBvcnQge0Rvc3NpZXJTdXBwb3J0aW5nUHJvY2Vzc1N0YXJ0TW9kYWxDb21wb25lbnR9IGZyb20gJy4uL2Rvc3NpZXItc3VwcG9ydGluZy1wcm9jZXNzLXN0YXJ0LW1vZGFsL2Rvc3NpZXItc3VwcG9ydGluZy1wcm9jZXNzLXN0YXJ0LW1vZGFsLmNvbXBvbmVudCc7XG5pbXBvcnQge1dpZGdldHNTZXJ2aWNlfSBmcm9tICcuL3RhYi93aWRnZXRzL3dpZGdldHMuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbHRpbW8tZG9zc2llci1kZXRhaWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vZG9zc2llci1kZXRhaWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kb3NzaWVyLWRldGFpbC5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtEb3NzaWVyVGFiU2VydmljZSwgRG9zc2llckRldGFpbExheW91dFNlcnZpY2UsIE5vdGlmaWNhdGlvblNlcnZpY2VdLFxufSlcbmV4cG9ydCBjbGFzcyBEb3NzaWVyRGV0YWlsQ29tcG9uZW50XG4gIGV4dGVuZHMgUGVuZGluZ0NoYW5nZXNDb21wb25lbnRcbiAgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3lcbntcbiAgQFZpZXdDaGlsZCgnc3VwcG9ydGluZ1Byb2Nlc3NTdGFydE1vZGFsJylcbiAgc3VwcG9ydGluZ1Byb2Nlc3NTdGFydDogRG9zc2llclN1cHBvcnRpbmdQcm9jZXNzU3RhcnRNb2RhbENvbXBvbmVudDtcblxuICBAVmlld0NoaWxkKCd0YWJDb250YWluZXInLCB7cmVhZDogVmlld0NvbnRhaW5lclJlZn0pXG4gIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgQFZpZXdDaGlsZCgndGFiQ29udGVudENvbnRhaW5lcicpXG4gIHByaXZhdGUgcmVhZG9ubHkgX3RhYkNvbnRlbnRDb250YWluZXIhOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICBwdWJsaWMgY3VzdG9tRG9zc2llckhlYWRlckl0ZW1zOiBBcnJheTxhbnk+ID0gW107XG4gIHB1YmxpYyBkb2N1bWVudDogVmFsdGltb0RvY3VtZW50IHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBkb2N1bWVudERlZmluaXRpb25OYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBkb2N1bWVudERlZmluaXRpb25OYW1lVGl0bGU6IHN0cmluZztcbiAgcHVibGljIGRvY3VtZW50SWQ6IHN0cmluZztcbiAgcHVibGljIHByb2Nlc3NEZWZpbml0aW9uTGlzdEZpZWxkczogQXJyYXk8YW55PiA9IFtdO1xuICBwdWJsaWMgcHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbnM6IChQcm9jZXNzRG9jdW1lbnREZWZpbml0aW9uICYge2Rpc3BsYXlOYW1lPzogc3RyaW5nfSlbXSA9IFtdO1xuICBwdWJsaWMgdGFiTG9hZGVyOiBUYWJMb2FkZXJJbXBsIHwgbnVsbCA9IG51bGw7XG5cbiAgcHVibGljIHJlYWRvbmx5IGFzc2lnbmVlSWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcbiAgcHVibGljIHJlYWRvbmx5IGN1cnJlbnRJbnRlcm1lZGlhdGVTYXZlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SW50ZXJtZWRpYXRlU3VibWlzc2lvbiB8IG51bGw+KFxuICAgIG51bGxcbiAgKTtcbiAgcHVibGljIHJlYWRvbmx5IGlzQWRtaW4kOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy51c2VyUHJvdmlkZXJTZXJ2aWNlXG4gICAgLmdldFVzZXJTdWJqZWN0KClcbiAgICAucGlwZShtYXAodXNlcklkZW50aXR5ID0+IHVzZXJJZGVudGl0eT8ucm9sZXM/LmluY2x1ZGVzKCdST0xFX0FETUlOJykpKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgdGFza0FuZFByb2Nlc3NMaW5rT3BlbmVkSW5QYW5lbCQgPVxuICAgIHRoaXMuZG9zc2llckRldGFpbExheW91dFNlcnZpY2UudGFza0FuZFByb2Nlc3NMaW5rT3BlbmVkSW5QYW5lbCQ7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfY2FzZVN0YXR1c0tleSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZyB8IG51bGwgfCAnTk9UX0FWQUlMQUJMRSc+KG51bGwpO1xuICBwcml2YXRlIHJlYWRvbmx5IF90YXNrUGFuZWxUb2dnbGUgPSB0aGlzLmNvbmZpZ1NlcnZpY2UuZmVhdHVyZVRvZ2dsZXM/LmVuYWJsZVRhc2tQYW5lbDtcblxuICBwdWJsaWMgcmVhZG9ubHkgZHJvcGRvd25XaWR0aCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oXG4gICAgRE9TU0lFUl9ERVRBSUxfU1RBUlRfUFJPQ0VTU19EUk9QRE9XTl9XSURUSC5zbWFsbFxuICApO1xuICBwdWJsaWMgcmVhZG9ubHkgY2FzZVN0YXR1c0tleSQ6IE9ic2VydmFibGU8c3RyaW5nIHwgJ05PVF9BVkFJTEFCTEUnPiA9IHRoaXMuX2Nhc2VTdGF0dXNLZXkkLnBpcGUoXG4gICAgZmlsdGVyKGtleSA9PiAhIWtleSlcbiAgKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgX2Nhc2VUYWdzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q2FzZVRhZ1tdIHwgbnVsbD4obnVsbCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IHNob3dEZWxldGVNb2RhbCQ6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuXG4gIHB1YmxpYyByZWFkb25seSBjYW5WaWV3JDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMucm91dGUucGFyYW1NYXAucGlwZShcbiAgICBzd2l0Y2hNYXAoKHBhcmFtczogUGFyYW1NYXApID0+XG4gICAgICB0aGlzLnBlcm1pc3Npb25TZXJ2aWNlLnJlcXVlc3RQZXJtaXNzaW9uKENBTl9WSUVXX0NBU0VfUEVSTUlTU0lPTiwge1xuICAgICAgICByZXNvdXJjZTogRE9TU0lFUl9ERVRBSUxfUEVSTUlTU0lPTl9SRVNPVVJDRS5qc29uU2NoZW1hRG9jdW1lbnQsXG4gICAgICAgIGlkZW50aWZpZXI6IHBhcmFtcy5nZXQoJ2RvY3VtZW50SWQnKSA/PyAnJyxcbiAgICAgIH0pXG4gICAgKVxuICApO1xuXG4gIHB1YmxpYyByZWFkb25seSBkb2N1bWVudCQ6IE9ic2VydmFibGU8VmFsdGltb0RvY3VtZW50IHwgbnVsbD4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmRvc3NpZXJTZXJ2aWNlLnJlZnJlc2hEb2N1bWVudCQsXG4gICAgdGhpcy5jYW5WaWV3JCxcbiAgXSkucGlwZShcbiAgICBmaWx0ZXIoKFtfLCBjYW5WaWV3XSkgPT4gY2FuVmlldyksXG4gICAgc3dpdGNoTWFwKCgpID0+IHRoaXMucm91dGUucGFyYW1zKSxcbiAgICBtYXAoKHBhcmFtczogUGFyYW1zKSA9PiBwYXJhbXM/LmRvY3VtZW50SWQpLFxuICAgIHN3aXRjaE1hcCgoZG9jdW1lbnRJZDogc3RyaW5nKSA9PlxuICAgICAgZG9jdW1lbnRJZCA/IHRoaXMuZG9jdW1lbnRTZXJ2aWNlLmdldERvY3VtZW50KHRoaXMuZG9jdW1lbnRJZCkgOiBvZihudWxsKVxuICAgICksXG4gICAgdGFwKChkb2N1bWVudDogVmFsdGltb0RvY3VtZW50IHwgbnVsbCkgPT4ge1xuICAgICAgaWYgKGRvY3VtZW50KSB7XG4gICAgICAgIHRoaXMuYXNzaWduZWVJZCQubmV4dChkb2N1bWVudC5hc3NpZ25lZUlkKTtcbiAgICAgICAgdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50O1xuICAgICAgICB0aGlzLl9jYXNlU3RhdHVzS2V5JC5uZXh0KGRvY3VtZW50Py5pbnRlcm5hbFN0YXR1cyB8fCAnTk9UX0FWQUlMQUJMRScpO1xuICAgICAgICB0aGlzLl9jYXNlVGFncyQubmV4dChkb2N1bWVudD8uY2FzZVRhZ3MgfHwgbnVsbCk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuY29uZmlnU2VydmljZS5jb25maWcuY3VzdG9tRG9zc2llckhlYWRlcj8uaGFzT3duUHJvcGVydHkoXG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50RGVmaW5pdGlvbk5hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICkgJiZcbiAgICAgICAgICB0aGlzLmN1c3RvbURvc3NpZXJIZWFkZXJJdGVtcy5sZW5ndGggPT09IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZy5jdXN0b21Eb3NzaWVySGVhZGVyW1xuICAgICAgICAgICAgdGhpcy5kb2N1bWVudERlZmluaXRpb25OYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICBdPy5mb3JFYWNoKGl0ZW0gPT4gdGhpcy5nZXRDdXN0b21Eb3NzaWVySGVhZGVySXRlbShpdGVtKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICApO1xuXG4gIHB1YmxpYyByZWFkb25seSBkb2N1bWVudERlZmluaXRpb25OYW1lJDogT2JzZXJ2YWJsZTxzdHJpbmc+ID0gdGhpcy5yb3V0ZS5wYXJhbXMucGlwZShcbiAgICBtYXAocGFyYW1zID0+IHBhcmFtcy5kb2N1bWVudERlZmluaXRpb25OYW1lIHx8ICcnKVxuICApO1xuXG4gIHB1YmxpYyByZWFkb25seSBjYXNlU3RhdHVzJDogT2JzZXJ2YWJsZTxJbnRlcm5hbENhc2VTdGF0dXMgfCB1bmRlZmluZWQ+ID1cbiAgICB0aGlzLmRvY3VtZW50RGVmaW5pdGlvbk5hbWUkLnBpcGUoXG4gICAgICBmaWx0ZXIoZG9jdW1lbnREZWZpbml0aW9uTmFtZSA9PiAhIWRvY3VtZW50RGVmaW5pdGlvbk5hbWUpLFxuICAgICAgc3dpdGNoTWFwKGRvY3VtZW50RGVmaW5pdGlvbk5hbWUgPT5cbiAgICAgICAgY29tYmluZUxhdGVzdChbXG4gICAgICAgICAgdGhpcy5jYXNlU3RhdHVzU2VydmljZS5nZXRJbnRlcm5hbENhc2VTdGF0dXNlcyhkb2N1bWVudERlZmluaXRpb25OYW1lKSxcbiAgICAgICAgICB0aGlzLmNhc2VTdGF0dXNLZXkkLFxuICAgICAgICBdKVxuICAgICAgKSxcbiAgICAgIG1hcChcbiAgICAgICAgKFtzdGF0dXNlcywga2V5XSkgPT4ga2V5ICE9PSAnTk9UX0FWQUlMQUJMRScgJiYgc3RhdHVzZXMuZmluZChzdGF0dXMgPT4gc3RhdHVzPy5rZXkgPT09IGtleSlcbiAgICAgICksXG4gICAgICBtYXAoXG4gICAgICAgIHN0YXR1cyA9PlxuICAgICAgICAgIHN0YXR1cyAmJiB7XG4gICAgICAgICAgICAuLi5zdGF0dXMsXG4gICAgICAgICAgICB0YWdUeXBlOiBJbnRlcm5hbENhc2VTdGF0dXNVdGlscy5nZXRUYWdUeXBlRnJvbUludGVybmFsQ2FzZVN0YXR1c0NvbG9yKHN0YXR1cy5jb2xvciksXG4gICAgICAgICAgfVxuICAgICAgKVxuICAgICk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGNhc2VUYWdzJDogT2JzZXJ2YWJsZTxDYXNlVGFnW10gfCB1bmRlZmluZWQ+ID0gdGhpcy5kb2N1bWVudERlZmluaXRpb25OYW1lJC5waXBlKFxuICAgIGZpbHRlcihkb2N1bWVudERlZmluaXRpb25OYW1lID0+ICEhZG9jdW1lbnREZWZpbml0aW9uTmFtZSksXG4gICAgc3dpdGNoTWFwKGRvY3VtZW50RGVmaW5pdGlvbk5hbWUgPT4gdGhpcy5fY2FzZVRhZ3MkKSxcbiAgICBtYXAoXG4gICAgICB0YWcgPT5cbiAgICAgICAgdGFnICYmXG4gICAgICAgIHRhZy5tYXAoY2FzZVRhZyA9PiAoe1xuICAgICAgICAgIC4uLmNhc2VUYWcsXG4gICAgICAgICAgdGFnVHlwZTogQ2FzZVRhZ3NVdGlscy5nZXRUYWdUeXBlRnJvbUNhc2VUYWdDb2xvcihjYXNlVGFnLmNvbG9yKSxcbiAgICAgICAgfSkpXG4gICAgKVxuICApO1xuXG4gIHB1YmxpYyByZWFkb25seSB1c2VySWQkOiBPYnNlcnZhYmxlPHN0cmluZyB8IHVuZGVmaW5lZD4gPSBvZihcbiAgICB0aGlzLmtleUNsb2FrU2VydmljZS5pc0xvZ2dlZEluKClcbiAgKS5waXBlKFxuICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmtleUNsb2FrU2VydmljZS5sb2FkVXNlclByb2ZpbGUoKSksXG4gICAgbWFwKHByb2ZpbGUgPT4gcHJvZmlsZT8uaWQpXG4gICk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGlzQXNzaWduaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgcmVhZG9ubHkgaXNBc3NpZ25lZFRvQ3VycmVudFVzZXIkOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5hc3NpZ25lZUlkJCxcbiAgICB0aGlzLnVzZXJJZCQsXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbYXNzaWduZWVJZCwgdXNlcklkXSkgPT4gISFhc3NpZ25lZUlkICYmICEhdXNlcklkICYmIGFzc2lnbmVlSWQgPT09IHVzZXJJZCksXG4gICAgc3RhcnRXaXRoKHRydWUpXG4gICk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGNhbkhhdmVBc3NpZ25lZSQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmRvY3VtZW50RGVmaW5pdGlvbk5hbWUkLnBpcGUoXG4gICAgc3dpdGNoTWFwKGRvY3VtZW50RGVmaW5pdGlvbk5hbWUgPT5cbiAgICAgIHRoaXMuZG9jdW1lbnRTZXJ2aWNlLmdldENhc2VTZXR0aW5ncyhkb2N1bWVudERlZmluaXRpb25OYW1lKVxuICAgICksXG4gICAgbWFwKGNhc2VTZXR0aW5ncyA9PiBjYXNlU2V0dGluZ3M/LmNhbkhhdmVBc3NpZ25lZSlcbiAgKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgY2FuQXNzaWduTG9hZGVkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgcmVhZG9ubHkgY2FuQXNzaWduJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMucm91dGUucGFyYW1NYXAucGlwZShcbiAgICBzd2l0Y2hNYXAoKHBhcmFtczogUGFyYW1NYXApID0+XG4gICAgICB0aGlzLnBlcm1pc3Npb25TZXJ2aWNlLnJlcXVlc3RQZXJtaXNzaW9uKENBTl9BU1NJR05fQ0FTRV9QRVJNSVNTSU9OLCB7XG4gICAgICAgIHJlc291cmNlOiBET1NTSUVSX0RFVEFJTF9QRVJNSVNTSU9OX1JFU09VUkNFLmpzb25TY2hlbWFEb2N1bWVudCxcbiAgICAgICAgaWRlbnRpZmllcjogcGFyYW1zLmdldCgnZG9jdW1lbnRJZCcpID8/ICcnLFxuICAgICAgfSlcbiAgICApLFxuICAgIHRhcCgoKSA9PiB7XG4gICAgICB0aGlzLmNhbkFzc2lnbkxvYWRlZCQubmV4dCh0cnVlKTtcbiAgICB9KVxuICApO1xuXG4gIHB1YmxpYyByZWFkb25seSBjYW5DbGFpbSQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLnJvdXRlLnBhcmFtTWFwLnBpcGUoXG4gICAgc3dpdGNoTWFwKChwYXJhbXM6IFBhcmFtTWFwKSA9PlxuICAgICAgdGhpcy5wZXJtaXNzaW9uU2VydmljZS5yZXF1ZXN0UGVybWlzc2lvbihDQU5fQ0xBSU1fQ0FTRV9QRVJNSVNTSU9OLCB7XG4gICAgICAgIHJlc291cmNlOiBET1NTSUVSX0RFVEFJTF9QRVJNSVNTSU9OX1JFU09VUkNFLmpzb25TY2hlbWFEb2N1bWVudCxcbiAgICAgICAgaWRlbnRpZmllcjogcGFyYW1zLmdldCgnZG9jdW1lbnRJZCcpID8/ICcnLFxuICAgICAgfSlcbiAgICApXG4gICk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGlzRGVsZXRpbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHB1YmxpYyByZWFkb25seSBjYW5EZWxldGUkOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5yb3V0ZS5wYXJhbU1hcC5waXBlKFxuICAgIHN3aXRjaE1hcCgocGFyYW1zOiBQYXJhbU1hcCkgPT5cbiAgICAgIHRoaXMucGVybWlzc2lvblNlcnZpY2UucmVxdWVzdFBlcm1pc3Npb24oQ0FOX0RFTEVURV9DQVNFX1BFUk1JU1NJT04sIHtcbiAgICAgICAgcmVzb3VyY2U6IERPU1NJRVJfREVUQUlMX1BFUk1JU1NJT05fUkVTT1VSQ0UuanNvblNjaGVtYURvY3VtZW50LFxuICAgICAgICBpZGVudGlmaWVyOiBwYXJhbXMuZ2V0KCdkb2N1bWVudElkJykgPz8gJycsXG4gICAgICB9KVxuICAgIClcbiAgKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgbG9hZGluZ1RhYnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcbiAgcHVibGljIHJlYWRvbmx5IG5vVGFic0NvbmZpZ3VyZWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHB1YmxpYyByZWFkb25seSBzaG93Tm9BY2Nlc3MkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHB1YmxpYyBhY3RpdmVUYWIkOiBPYnNlcnZhYmxlPFRhYkltcGw+O1xuXG4gIHB1YmxpYyByZWFkb25seSBjb21wYWN0TW9kZSQgPSB0aGlzLnBhZ2VIZWFkZXJTZXJ2aWNlLmNvbXBhY3RNb2RlJDtcblxuICBwdWJsaWMgcmVhZG9ubHkgdGFiSG9yaXpvbnRhbE92ZXJmbG93RGlzYWJsZWQgPVxuICAgIHRoaXMuZG9zc2llclRhYlNlcnZpY2UudGFiSG9yaXpvbnRhbE92ZXJmbG93RGlzYWJsZWQ7XG5cbiAgcHVibGljIHJlYWRvbmx5IHNob3dUYXNrTGlzdCQgPSB0aGlzLmRvc3NpZXJUYWJTZXJ2aWNlLnNob3dUYXNrTGlzdCQ7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfYWN0aXZlVGFiTmFtZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBwdWJsaWMgZ2V0IGFjdGl2ZVRhYk5hbWUkKCk6IE9ic2VydmFibGU8c3RyaW5nIHwgbnVsbD4ge1xuICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFt0aGlzLnJvdXRlLnBhcmFtTWFwLCB0aGlzLl9hY3RpdmVUYWJOYW1lJF0pLnBpcGUoXG4gICAgICBtYXAoKFtwYXJhbU1hcCwgYWN0aXZlVGFiTmFtZV0pID0+XG4gICAgICAgICFhY3RpdmVUYWJOYW1lID8gKHBhcmFtTWFwLmdldCgndGFiJykgPz8gbnVsbCkgOiBhY3RpdmVUYWJOYW1lXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBET1NTSUVSX0RFVEFJTF9HVVRURVJfU0laRSA9IERPU1NJRVJfREVUQUlMX0dVVFRFUl9TSVpFO1xuXG4gIHB1YmxpYyByZWFkb25seSBkb3NzaWVyRGV0YWlsTGF5b3V0JCA9IHRoaXMuZG9zc2llckRldGFpbExheW91dFNlcnZpY2UuZG9zc2llckRldGFpbExheW91dCQ7XG5cbiAgcHVibGljIHJlYWRvbmx5IG9wZW5UYXNrQW5kUHJvY2Vzc0xpbmtJbk1vZGFsJCA9IG5ldyBTdWJqZWN0PFRhc2tXaXRoUHJvY2Vzc0xpbms+KCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGlzRGFya01vZGUkID0gdGhpcy5jZHNUaGVtZVNlcnZpY2UuY3VycmVudFRoZW1lJC5waXBlKFxuICAgIG1hcChjdXJyZW50VGhlbWUgPT4gY3VycmVudFRoZW1lID09PSBDdXJyZW50Q2FyYm9uVGhlbWUuRzkwKVxuICApO1xuXG4gIHByaXZhdGUgX3NuYXBzaG90OiBQYXJhbU1hcDtcbiAgcHJpdmF0ZSBfaW5pdGlhbFRhYk5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBfYWN0aXZlQ2hhbmdlID0gZmFsc2U7XG4gIHByaXZhdGUgX29sZFRhYk5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBfcGVuZGluZ1RhYjogVGFiSW1wbDtcbiAgcHJpdmF0ZSBfb2JzZXJ2ZXIhOiBSZXNpemVPYnNlcnZlcjtcbiAgcHJpdmF0ZSBfdGFic0luaXQgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBfc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJyZWFkY3J1bWJTZXJ2aWNlOiBCcmVhZGNydW1iU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhc2VTdGF0dXNTZXJ2aWNlOiBDYXNlU3RhdHVzU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkc1RoZW1lU2VydmljZTogQ2RzVGhlbWVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25maWdTZXJ2aWNlOiBDb25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZG9jdW1lbnRTZXJ2aWNlOiBEb2N1bWVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBkb3NzaWVyRGV0YWlsTGF5b3V0U2VydmljZTogRG9zc2llckRldGFpbExheW91dFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBkb3NzaWVyU2VydmljZTogRG9zc2llclNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBkb3NzaWVyVGFiU2VydmljZTogRG9zc2llclRhYlNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBpY29uU2VydmljZTogSWNvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBrZXlDbG9ha1NlcnZpY2U6IEtleWNsb2FrU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogTkdYTG9nZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhZ2VIZWFkZXJTZXJ2aWNlOiBQYWdlSGVhZGVyU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhZ2VUaXRsZVNlcnZpY2U6IFBhZ2VUaXRsZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBwZXJtaXNzaW9uU2VydmljZTogUGVybWlzc2lvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgd2lkZ2V0c1NlcnZpY2U6IFdpZGdldHNTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdXNlclByb3ZpZGVyU2VydmljZTogVXNlclByb3ZpZGVyU2VydmljZSxcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIHJlYWRvbmx5IGh0bWxEb2N1bWVudDogRG9jdW1lbnRcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9zbmFwc2hvdCA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1NYXA7XG4gICAgdGhpcy5kb2N1bWVudERlZmluaXRpb25OYW1lID0gdGhpcy5fc25hcHNob3QuZ2V0KCdkb2N1bWVudERlZmluaXRpb25OYW1lJykgfHwgJyc7XG4gICAgdGhpcy5kb2N1bWVudElkID0gdGhpcy5fc25hcHNob3QuZ2V0KCdkb2N1bWVudElkJykgfHwgJyc7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdFRhYkxvYWRlcigpO1xuICAgIHRoaXMuaW5pdEJyZWFkY3J1bWIoKTtcbiAgICB0aGlzLm9wZW5XaWR0aE9ic2VydmVyKCk7XG4gICAgdGhpcy5wYWdlVGl0bGVTZXJ2aWNlLmRpc2FibGVSZXNldCgpO1xuICAgIHRoaXMuaWNvblNlcnZpY2UucmVnaXN0ZXJBbGwoW0NoZXZyb25Eb3duMTZdKTtcbiAgICB0aGlzLnNldERvY3VtZW50U3R5bGUoKTtcbiAgICB0aGlzLmVuYWJsZVJlc2V0T25CYWNrTmF2aWdhdGlvbigpO1xuICAgIHRoaXMub3BlbldpZGdldFByb2Nlc3NTdWJzY3JpcHRpb24oKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmJyZWFkY3J1bWJTZXJ2aWNlLmNsZWFyU2Vjb25kQnJlYWRjcnVtYigpO1xuICAgIHRoaXMucGFnZVRpdGxlU2VydmljZS5lbmFibGVSZXNldCgpO1xuICAgIHRoaXMucmVtb3ZlRG9jdW1lbnRTdHlsZSgpO1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBbGxBc3NvY2lhdGVkUHJvY2Vzc0RlZmluaXRpb25zKCk6IHZvaWQge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgY29tYmluZUxhdGVzdChbXG4gICAgICAgIHRoaXMuZG9jdW1lbnRTZXJ2aWNlLmZpbmRQcm9jZXNzRG9jdW1lbnREZWZpbml0aW9uc0ZvckRvY3VtZW50KHRoaXMuZG9jdW1lbnRJZCwge1xuICAgICAgICAgIHN0YXJ0YWJsZUJ5VXNlcjogdHJ1ZSxcbiAgICAgICAgfSksXG4gICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5zdHJlYW0oJ2tleScpLFxuICAgICAgXSkuc3Vic2NyaWJlKChbcHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbnNdKSA9PiB7XG4gICAgICAgIHRoaXMucHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbnMgPSB0aGlzLm1hcFByb2Nlc3NEb2N1bWVudERlZmluaXRpb25zKFxuICAgICAgICAgIHByb2Nlc3NEb2N1bWVudERlZmluaXRpb25zXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc2V0UHJvY2Vzc0Ryb3Bkb3duV2lkdGgoKTtcblxuICAgICAgICB0aGlzLnByb2Nlc3NEZWZpbml0aW9uTGlzdEZpZWxkcyA9IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBrZXk6ICdwcm9jZXNzTmFtZScsXG4gICAgICAgICAgICBsYWJlbDogJ1Byb2NlcycsXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGFydFByb2Nlc3MocHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbjogUHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbik6IHZvaWQge1xuICAgIHRoaXMuc3VwcG9ydGluZ1Byb2Nlc3NTdGFydC5vcGVuTW9kYWwocHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbiwgdGhpcy5kb2N1bWVudElkKTtcbiAgfVxuXG4gIHB1YmxpYyBvcGVuV2lkZ2V0UHJvY2Vzc1N1YnNjcmlwdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMud2lkZ2V0c1NlcnZpY2Uuc3RhcnRQcm9jZXNzRXZlbnRcbiAgICAgICAgLnBpcGUoc3dpdGNoTWFwKCgpID0+IHRoaXMud2lkZ2V0c1NlcnZpY2UuYWN0aXZlUHJvY2VzcyQpKVxuICAgICAgICAuc3Vic2NyaWJlKChwcm9jZXNzRG9jdW1lbnREZWZpbml0aW9uczogUHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbltdKSA9PiB7XG4gICAgICAgICAgdGhpcy5zdGFydFByb2Nlc3MocHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbnNbMF0pO1xuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgY2xhaW1Bc3NpZ25lZSgpOiB2b2lkIHtcbiAgICB0aGlzLmlzQXNzaWduaW5nJC5uZXh0KHRydWUpO1xuXG4gICAgdGhpcy51c2VySWQkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgc3dpdGNoTWFwKCh1c2VySWQ6IHN0cmluZyB8IHVuZGVmaW5lZCkgPT5cbiAgICAgICAgICB0aGlzLmRvY3VtZW50U2VydmljZS5hc3NpZ25IYW5kbGVyVG9Eb2N1bWVudCh0aGlzLmRvY3VtZW50SWQsIHVzZXJJZCA/PyAnJylcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICB0aGlzLmlzQXNzaWduaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLmRvc3NpZXJTZXJ2aWNlLnJlZnJlc2goKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICB0aGlzLmlzQXNzaWduaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnU29tZXRoaW5nIHdlbnQgd3Jvbmcgd2hpbGUgYXNzaWduaW5nIHVzZXIgdG8gY2FzZScpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgdW5hc3NpZ25Bc3NpZ25lZSgpOiB2b2lkIHtcbiAgICB0aGlzLmlzQXNzaWduaW5nJC5uZXh0KHRydWUpO1xuXG4gICAgdGhpcy51c2VySWQkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgc3dpdGNoTWFwKCh1c2VySWQ6IHN0cmluZyB8IHVuZGVmaW5lZCkgPT5cbiAgICAgICAgICB0aGlzLmRvY3VtZW50U2VydmljZS51bmFzc2lnbkhhbmRsZXJGcm9tRG9jdW1lbnQodGhpcy5kb2N1bWVudElkKVxuICAgICAgICApXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKCk6IHZvaWQgPT4ge1xuICAgICAgICAgIHRoaXMuaXNBc3NpZ25pbmckLm5leHQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMuZG9zc2llclNlcnZpY2UucmVmcmVzaCgpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKCk6IHZvaWQgPT4ge1xuICAgICAgICAgIHRoaXMuaXNBc3NpZ25pbmckLm5leHQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdTb21ldGhpbmcgd2VudCB3cm9uZyB3aGlsZSB1bmFzc2lnbmluZyB1c2VyIGZyb20gY2FzZScpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlRG9jdW1lbnQoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93RGVsZXRlTW9kYWwkLm5leHQodHJ1ZSk7XG4gIH1cblxuICBwdWJsaWMgb25Db25maXJtRGVsZXRlKCk6IHZvaWQge1xuICAgIHRoaXMuaXNEZWxldGluZyQubmV4dCh0cnVlKTtcbiAgICB0aGlzLmRvY3VtZW50U2VydmljZS5kZWxldGVEb2N1bWVudCh0aGlzLmRvY3VtZW50SWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuaXNEZWxldGluZyQubmV4dChmYWxzZSk7XG4gICAgICAgIHRoaXMuc2hvd0RlbGV0ZU1vZGFsJC5uZXh0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2AvZG9zc2llcnMvJHt0aGlzLmRvY3VtZW50RGVmaW5pdGlvbk5hbWV9YF0pO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuaXNEZWxldGluZyQubmV4dChmYWxzZSk7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdTb21ldGhpbmcgd2VudCB3cm9uZyB3aGlsZSBkZWxldGluZyB0aGUgY2FzZScpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBvblRhc2tDbGlja0V2ZW50KHRhc2tQcm9jZXNzTGlua1Jlc3VsdDogVGFza1dpdGhQcm9jZXNzTGluayk6IHZvaWQge1xuICAgIGlmICghdGFza1Byb2Nlc3NMaW5rUmVzdWx0LnByb2Nlc3NMaW5rQWN0aXZpdHlSZXN1bHQpIHtcbiAgICAgIHRoaXMuaXNBZG1pbiQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoaXNBZG1pbiA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlTm9UYXNrUHJvY2Vzc0xpbmsoaXNBZG1pbik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkaXNwbGF5VHlwZSA9XG4gICAgICB0YXNrUHJvY2Vzc0xpbmtSZXN1bHQucHJvY2Vzc0xpbmtBY3Rpdml0eVJlc3VsdC5wcm9wZXJ0aWVzLmZvcm1EaXNwbGF5VHlwZSB8fFxuICAgICAgRE9TU0lFUl9ERVRBSUxfREVGQVVMVF9ESVNQTEFZX1RZUEU7XG4gICAgY29uc3Qgc2l6ZSA9XG4gICAgICB0YXNrUHJvY2Vzc0xpbmtSZXN1bHQucHJvY2Vzc0xpbmtBY3Rpdml0eVJlc3VsdC5wcm9wZXJ0aWVzLmZvcm1TaXplIHx8XG4gICAgICBET1NTSUVSX0RFVEFJTF9ERUZBVUxUX0RJU1BMQVlfU0laRTtcblxuICAgIHRoaXMuZG9zc2llckRldGFpbExheW91dFNlcnZpY2Uuc2V0Rm9ybURpc3BsYXlTaXplKHNpemUpO1xuICAgIHRoaXMuZG9zc2llckRldGFpbExheW91dFNlcnZpY2Uuc2V0Rm9ybURpc3BsYXlUeXBlKGRpc3BsYXlUeXBlKTtcblxuICAgIGlmIChkaXNwbGF5VHlwZSA9PT0gJ3BhbmVsJyAmJiAhIXRoaXMuX3Rhc2tQYW5lbFRvZ2dsZSkge1xuICAgICAgdGhpcy5kb3NzaWVyRGV0YWlsTGF5b3V0U2VydmljZS5zZXRUYXNrQW5kUHJvY2Vzc0xpbmtPcGVuZWRJblBhbmVsKHRhc2tQcm9jZXNzTGlua1Jlc3VsdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3BlblRhc2tBbmRQcm9jZXNzTGlua0luTW9kYWwkLm5leHQoey4uLnRhc2tQcm9jZXNzTGlua1Jlc3VsdH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvblRhc2tEZXRhaWxzQ2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5kb3NzaWVyRGV0YWlsTGF5b3V0U2VydmljZS5zZXRUYXNrQW5kUHJvY2Vzc0xpbmtPcGVuZWRJblBhbmVsKG51bGwpO1xuICB9XG5cbiAgcHVibGljIG9uQWN0aXZlQ2hhbmdlRXZlbnQoZXZlbnQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9hY3RpdmVDaGFuZ2UgPSBldmVudDtcbiAgfVxuXG4gIHB1YmxpYyBvblRhYlNlbGVjdGVkKHRhYjogVGFiSW1wbCwgYWN0aXZlVGFiOiBUYWJJbXBsKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRhYkxvYWRlcikgcmV0dXJuO1xuXG4gICAgaWYgKCF0aGlzLl90YWJzSW5pdCkge1xuICAgICAgdGhpcy5fdGFic0luaXQgPSB0cnVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX29sZFRhYk5hbWUgPSBhY3RpdmVUYWIubmFtZTtcbiAgICB0aGlzLl9wZW5kaW5nVGFiID0gdGFiO1xuICAgIHRoaXMuX2FjdGl2ZVRhYk5hbWUkLm5leHQodGFiLm5hbWUpO1xuICAgIHRoaXMucGVuZGluZ0NoYW5nZXMgPVxuICAgICAgdGFiLmNvbnRlbnRLZXkgPT09ICdzdW1tYXJ5JyA/IGZhbHNlIDogIXRhYi5zaG93VGFza3MgJiYgdGhpcy5fYWN0aXZlQ2hhbmdlO1xuXG4gICAgaWYgKHRoaXMucGVuZGluZ0NoYW5nZXMpIHtcbiAgICAgIHRoaXMudGFiTG9hZGVyLnJlcGxhY2VVcmxTdGF0ZSh0YWIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGFiLnNob3dUYXNrcykgdGhpcy5vcGVuVGFza0FuZFByb2Nlc3NMaW5rSW5Nb2RhbCQubmV4dChudWxsKTtcbiAgICB0aGlzLnRhYkxvYWRlci5sb2FkKHRhYik7XG4gICAgdGhpcy5zZXREb2N1bWVudFN0eWxlKCk7XG4gIH1cblxuICBwdWJsaWMgb25Gb3JtU3VibWl0RXZlbnQoKTogdm9pZCB7XG4gICAgdGhpcy5kb3NzaWVyRGV0YWlsTGF5b3V0U2VydmljZS5zZXRUYXNrQW5kUHJvY2Vzc0xpbmtPcGVuZWRJblBhbmVsKG51bGwpO1xuXG4gICAgaWYgKCF0aGlzLnRhYkxvYWRlcikgcmV0dXJuO1xuICAgIHRoaXMudGFiTG9hZGVyLnJlZnJlc2hWaWV3KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Db25maXJtUmVkaXJlY3QoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRhYkxvYWRlciB8fCAhdGhpcy5fcGVuZGluZ1RhYikgcmV0dXJuO1xuICAgIHRoaXMuX2FjdGl2ZUNoYW5nZSA9IGZhbHNlO1xuICAgIHRoaXMuX2FjdGl2ZVRhYk5hbWUkLm5leHQodGhpcy5fcGVuZGluZ1RhYi5uYW1lKTtcbiAgICB0aGlzLnRhYkxvYWRlci5sb2FkKHRoaXMuX3BlbmRpbmdUYWIpO1xuICAgIHRoaXMuZG9zc2llckRldGFpbExheW91dFNlcnZpY2Uuc2V0VGFza0FuZFByb2Nlc3NMaW5rT3BlbmVkSW5QYW5lbChudWxsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkNhbmNlbFJlZGlyZWN0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50YWJMb2FkZXIpIHJldHVybjtcbiAgICB0aGlzLl9hY3RpdmVUYWJOYW1lJC5uZXh0KHRoaXMuX29sZFRhYk5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0QnJlYWRjcnVtYigpOiB2b2lkIHtcbiAgICB0aGlzLmRvY3VtZW50U2VydmljZVxuICAgICAgLmdldERvY3VtZW50RGVmaW5pdGlvbih0aGlzLmRvY3VtZW50RGVmaW5pdGlvbk5hbWUpXG4gICAgICAuc3Vic2NyaWJlKGRlZmluaXRpb24gPT4ge1xuICAgICAgICB0aGlzLmRvY3VtZW50RGVmaW5pdGlvbk5hbWVUaXRsZSA9IGRlZmluaXRpb24uc2NoZW1hLnRpdGxlO1xuICAgICAgICB0aGlzLnNldEJyZWFkY3J1bWIoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0VGFiTG9hZGVyKCk6IHZvaWQge1xuICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuZG9zc2llclRhYlNlcnZpY2UudGFicyQsIHRoaXMuY2FuVmlldyRdKVxuICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgIC5zdWJzY3JpYmUoKFt0YWJzLCBjYW5WaWV3XSkgPT4ge1xuICAgICAgICBpZiAoY2FuVmlldykge1xuICAgICAgICAgIGlmICh0YWJzPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9pbml0aWFsVGFiTmFtZSA9IHRoaXMuX3NuYXBzaG90LmdldCgndGFiJykgPz8gJyc7XG4gICAgICAgICAgICB0aGlzLnRhYkxvYWRlciA9IG5ldyBUYWJMb2FkZXJJbXBsKFxuICAgICAgICAgICAgICB0YWJzLFxuICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICAgICAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLFxuICAgICAgICAgICAgICB0aGlzLnJvdXRlcixcbiAgICAgICAgICAgICAgdGhpcy5yb3V0ZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMudGFiTG9hZGVyLmluaXRpYWwodGhpcy5faW5pdGlhbFRhYk5hbWUpO1xuICAgICAgICAgICAgdGhpcy5kb3NzaWVyVGFiU2VydmljZS5zZXRUYWJMb2FkZXIodGhpcy50YWJMb2FkZXIpO1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nVGFicyQubmV4dChmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVRhYiQgPSB0aGlzLnRhYkxvYWRlci5hY3RpdmVUYWIkO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm5vVGFic0NvbmZpZ3VyZWQkLm5leHQodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdUYWJzJC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmdldEFsbEFzc29jaWF0ZWRQcm9jZXNzRGVmaW5pdGlvbnMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNob3dOb0FjY2VzcyQubmV4dCh0cnVlKTtcbiAgICAgICAgICB0aGlzLmxvYWRpbmdUYWJzJC5uZXh0KGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXNzaWdubWVudE9mRG9jdW1lbnRDaGFuZ2VkKCk6IHZvaWQge1xuICAgIHRoaXMuZG9zc2llclNlcnZpY2UucmVmcmVzaCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDdXN0b21Eb3NzaWVySGVhZGVySXRlbShpdGVtKTogdm9pZCB7XG4gICAgdGhpcy5jdXN0b21Eb3NzaWVySGVhZGVySXRlbXMucHVzaCh7XG4gICAgICBsYWJlbDogaXRlbVsnbGFiZWxUcmFuc2xhdGlvbktleSddIHx8ICcnLFxuICAgICAgY29sdW1uU2l6ZTogaXRlbVsnY29sdW1uU2l6ZSddIHx8IDMsXG4gICAgICB0ZXh0U2l6ZTogaXRlbVsndGV4dFNpemUnXSB8fCAnbWQnLFxuICAgICAgY3VzdG9tQ2xhc3M6IGl0ZW1bJ2N1c3RvbUNsYXNzJ10gfHwgJycsXG4gICAgICBtb2RpZmllcjogaXRlbVsnbW9kaWZpZXInXSB8fCAnJyxcbiAgICAgIHZhbHVlOiBpdGVtWydwcm9wZXJ0eVBhdGhzJ10/LnJlZHVjZShcbiAgICAgICAgKHByZXYsIGN1cnIpID0+IHByZXYgKyB0aGlzLmdldFN0cmluZ0Zyb21Eb2N1bWVudFBhdGgoaXRlbSwgY3VyciksXG4gICAgICAgICcnXG4gICAgICApLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdHJpbmdGcm9tRG9jdW1lbnRQYXRoKGl0ZW0sIHBhdGgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHByZWZpeCA9IGl0ZW1bJ3Byb3BlcnR5UGF0aHMnXS5pbmRleE9mKHBhdGgpID4gMCA/ICcgJyA6ICcnO1xuICAgIGxldCBzdHJpbmcgPSB0aGlzLmdldE5lc3RlZFByb3BlcnR5KHRoaXMuZG9jdW1lbnQuY29udGVudCwgcGF0aCwgaXRlbVsnbm9WYWx1ZVRleHQnXSkgfHwgJyc7XG4gICAgY29uc3QgZGF0ZUZvcm1hdHMgPSBbbW9tZW50LklTT184NjAxLCAnTU0tREQtWVlZWScsICdERC1NTS1ZWVlZJywgJ1lZWVktTU0tREQnXTtcbiAgICBzd2l0Y2ggKGl0ZW1bJ21vZGlmaWVyJ10pIHtcbiAgICAgIGNhc2UgJ2FnZSc6IHtcbiAgICAgICAgaWYgKG1vbWVudChzdHJpbmcsIGRhdGVGb3JtYXRzLCB0cnVlKS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICBzdHJpbmcgPSBtb21lbnQoKS5kaWZmKHN0cmluZywgJ3llYXJzJyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGlmIChtb21lbnQoc3RyaW5nLCBkYXRlRm9ybWF0cywgdHJ1ZSkuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgc3RyaW5nID0gbW9tZW50KHN0cmluZykuZm9ybWF0KCdERC1NTS1ZWVlZJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHByZWZpeCArIHN0cmluZztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TmVzdGVkUHJvcGVydHkob2JqOiBhbnksIHBhdGg6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiAoXG4gICAgICBwYXRoLnNwbGl0KCcuJykucmVkdWNlKChjdXJyZW50T2JqZWN0LCBrZXkpID0+IGN1cnJlbnRPYmplY3Q/LltrZXldLCBvYmopIHx8IGRlZmF1bHRWYWx1ZVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNldEJyZWFkY3J1bWIoKTogdm9pZCB7XG4gICAgdGhpcy5icmVhZGNydW1iU2VydmljZS5zZXRTZWNvbmRCcmVhZGNydW1iKHtcbiAgICAgIHJvdXRlOiBbYC9kb3NzaWVycy8ke3RoaXMuZG9jdW1lbnREZWZpbml0aW9uTmFtZX1gXSxcbiAgICAgIGNvbnRlbnQ6IHRoaXMuZG9jdW1lbnREZWZpbml0aW9uTmFtZVRpdGxlLFxuICAgICAgaHJlZjogYC9kb3NzaWVycy8ke3RoaXMuZG9jdW1lbnREZWZpbml0aW9uTmFtZX1gLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuV2lkdGhPYnNlcnZlcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3RhYkNvbnRlbnRDb250YWluZXIubmF0aXZlRWxlbWVudCkgcmV0dXJuO1xuXG4gICAgdGhpcy5fb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoZXZlbnQgPT4ge1xuICAgICAgdGhpcy5vYnNlcnZlck11dGF0aW9uKGV2ZW50KTtcbiAgICB9KTtcbiAgICB0aGlzLl9vYnNlcnZlci5vYnNlcnZlKHRoaXMuX3RhYkNvbnRlbnRDb250YWluZXIubmF0aXZlRWxlbWVudCk7XG4gIH1cblxuICBwcml2YXRlIG9ic2VydmVyTXV0YXRpb24oZXZlbnQ6IEFycmF5PFJlc2l6ZU9ic2VydmVyRW50cnk+KTogdm9pZCB7XG4gICAgY29uc3QgZWxlbWVudFdpZHRoID0gZXZlbnRbMF0/LmJvcmRlckJveFNpemVbMF0/LmlubGluZVNpemU7XG5cbiAgICBpZiAodHlwZW9mIGVsZW1lbnRXaWR0aCA9PT0gJ251bWJlcicgJiYgZWxlbWVudFdpZHRoICE9PSAwKSB7XG4gICAgICB0aGlzLmRvc3NpZXJEZXRhaWxMYXlvdXRTZXJ2aWNlLnNldFRhYkNvbnRlbnRDb250YWluZXJXaWR0aChlbGVtZW50V2lkdGgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0RG9jdW1lbnRTdHlsZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuaHRtbERvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdodG1sJylbMF0sICdodG1sLS1maXhlZCcpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVEb2N1bWVudFN0eWxlKCk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5odG1sRG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2h0bWwnKVswXSwgJ2h0bWwtLWZpeGVkJyk7XG4gIH1cblxuICBwcml2YXRlIGVuYWJsZVJlc2V0T25CYWNrTmF2aWdhdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMucm91dGVyLmV2ZW50c1xuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaWx0ZXIoXG4gICAgICAgICAgICBldmVudCA9PiBldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25TdGFydCAmJiBldmVudC5uYXZpZ2F0aW9uVHJpZ2dlciA9PT0gJ3BvcHN0YXRlJ1xuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnBhZ2VUaXRsZVNlcnZpY2UuZW5hYmxlUmVzZXQoKTtcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVOb1Rhc2tQcm9jZXNzTGluayhpc0FkbWluOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnNob3dBY3Rpb25hYmxlKHtcbiAgICAgIHR5cGU6ICd3YXJuaW5nJyxcbiAgICAgIGxvd0NvbnRyYXN0OiB0cnVlLFxuICAgICAgdGl0bGU6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdkb3NzaWVyLm5vTGlua2VkUHJvY2Vzc05vdGlmaWNhdGlvbicpLFxuICAgICAgLi4uKGlzQWRtaW4gJiYge1xuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGV4dDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ2Rvc3NpZXIuY29uZmlndXJlJyksXG4gICAgICAgICAgICBjbGljazogKCkgPT4gdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvcHJvY2Vzcy1saW5rcyddKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSksXG4gICAgICBkdXJhdGlvbjogQ0FSQk9OX0NPTlNUQU5UUy5ub3RpZmljYXRpb25EdXJhdGlvbixcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbWFwUHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbnMoXG4gICAgcHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbnM6IFByb2Nlc3NEb2N1bWVudERlZmluaXRpb25bXVxuICApOiAoUHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbiAmIHtkaXNwbGF5TmFtZTogc3RyaW5nfSlbXSB7XG4gICAgcmV0dXJuIHByb2Nlc3NEb2N1bWVudERlZmluaXRpb25zLm1hcChcbiAgICAgIChwcm9jZXNzRG9jb3VtZW50RGVmaW5pdGlvbjogUHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbikgPT4gKHtcbiAgICAgICAgLi4ucHJvY2Vzc0RvY291bWVudERlZmluaXRpb24sXG4gICAgICAgIGRpc3BsYXlOYW1lOlxuICAgICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHByb2Nlc3NEb2NvdW1lbnREZWZpbml0aW9uPy5pZD8ucHJvY2Vzc0RlZmluaXRpb25LZXkpICE9PVxuICAgICAgICAgIHByb2Nlc3NEb2NvdW1lbnREZWZpbml0aW9uPy5pZD8ucHJvY2Vzc0RlZmluaXRpb25LZXlcbiAgICAgICAgICAgID8gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQocHJvY2Vzc0RvY291bWVudERlZmluaXRpb24uaWQucHJvY2Vzc0RlZmluaXRpb25LZXkpXG4gICAgICAgICAgICA6IHByb2Nlc3NEb2NvdW1lbnREZWZpbml0aW9uLnByb2Nlc3NOYW1lLFxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRQcm9jZXNzRHJvcGRvd25XaWR0aCgpOiB2b2lkIHtcbiAgICBjb25zdCBsb25nZXN0TmFtZSA9IHRoaXMucHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbnMucmVkdWNlKFxuICAgICAgKGFjYywgY3VycikgPT5cbiAgICAgICAgISFjdXJyLmRpc3BsYXlOYW1lICYmIGN1cnIuZGlzcGxheU5hbWUubGVuZ3RoID4gYWNjID8gY3Vyci5kaXNwbGF5TmFtZS5sZW5ndGggOiBhY2MsXG4gICAgICAwXG4gICAgKTtcblxuICAgIHRoaXMuZHJvcGRvd25XaWR0aCQubmV4dChcbiAgICAgIGxvbmdlc3ROYW1lIDwgMjBcbiAgICAgICAgPyBET1NTSUVSX0RFVEFJTF9TVEFSVF9QUk9DRVNTX0RST1BET1dOX1dJRFRILnNtYWxsXG4gICAgICAgIDogbG9uZ2VzdE5hbWUgPCA0MFxuICAgICAgICAgID8gRE9TU0lFUl9ERVRBSUxfU1RBUlRfUFJPQ0VTU19EUk9QRE9XTl9XSURUSC5tZWRpdW1cbiAgICAgICAgICA6IERPU1NJRVJfREVUQUlMX1NUQVJUX1BST0NFU1NfRFJPUERPV05fV0lEVEgubGFyZ2VcbiAgICApO1xuICB9XG59XG4iLCI8IS0tXG4gIH4gQ29weXJpZ2h0IDIwMTUtMjAyNCBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gIH5cbiAgfiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIH5cbiAgfiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gIH5cbiAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAgLS0+XG48ZGl2XG4gIGNsYXNzPVwibWFpbi1jb250ZW50XCJcbiAgW25nQ2xhc3NdPVwieydtYWluLWNvbnRlbnQtLW5vLWhvcml6b250YWwtb3ZlcmZsb3cnOiB0YWJIb3Jpem9udGFsT3ZlcmZsb3dEaXNhYmxlZCgpfVwiXG4+XG4gIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2FzZVRhZ3MkIHwgYXN5bmMgYXMgY2FzZVRhZ3NcIj5cbiAgICAgIEBpZiAoY2FzZVRhZ3MgJiYgY2FzZVRhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwic3BhY2luZy1jYXNlLXRhZ3NcIj5cbiAgICAgICAgICBAZm9yICh0YWcgb2YgY2FzZVRhZ3M7IHRyYWNrIHRhZykge1xuICAgICAgICAgICAgPGNkcy10YWcgc2l6ZT1cInNtXCIgW3R5cGVdPVwidGFnLnRhZ1R5cGVcIj5cbiAgICAgICAgICAgICAge3sgdGFnLnRpdGxlIH19XG4gICAgICAgICAgICA8L2Nkcy10YWc+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0YWJzXCI+PC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctdGVtcGxhdGUgI3RhYnM+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwie2FjdGl2ZVRhYjogYWN0aXZlVGFiJCB8IGFzeW5jfSBhcyBvYnNcIj5cbiAgICAgICAgPGNkcy10YWJzICpuZ0lmPVwidGFiTG9hZGVyXCIgdHlwZT1cImlubGluZVwiIGNsYXNzPVwiY2FzZS1kZXRhaWwtdGFic1wiPlxuICAgICAgICAgIDxjZHMtdGFiXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgdGFiIG9mIHRhYkxvYWRlci50YWJzXCJcbiAgICAgICAgICAgIFthY3RpdmVdPVwidGFiLm5hbWUgPT09IChhY3RpdmVUYWJOYW1lJCB8IGFzeW5jKVwiXG4gICAgICAgICAgICBoZWFkaW5nPVwie3sgdGFiIHwgdGFiVHJhbnNsYXRlIHwgYXN5bmMgfX1cIlxuICAgICAgICAgICAgKHNlbGVjdGVkKT1cIm9uVGFiU2VsZWN0ZWQodGFiLCBvYnMuYWN0aXZlVGFiKVwiXG4gICAgICAgICAgPjwvY2RzLXRhYj5cbiAgICAgICAgPC9jZHMtdGFicz5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPGRpdlxuICAgICAgI3RhYkNvbnRlbnRDb250YWluZXJcbiAgICAgIGNsYXNzPVwidGFiLWNvbnRlbnQtY29udGFpbmVyXCJcbiAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgJ3RhYi1jb250ZW50LWNvbnRhaW5lci0tZGFyayc6IGlzRGFya01vZGUkIHwgYXN5bmMsXG4gICAgICAgICd0YWItY29udGVudC1jb250YWluZXItLWNvbXBhY3QnOiBjb21wYWN0TW9kZSQgfCBhc3luYyxcbiAgICAgIH1cIlxuICAgICAgKm5nSWY9XCJ7XG4gICAgICAgIG5vVGFic0NvbmZpZ3VyZWQ6IG5vVGFic0NvbmZpZ3VyZWQkIHwgYXN5bmMsXG4gICAgICAgIHNob3dUYXNrTGlzdDogc2hvd1Rhc2tMaXN0JCB8IGFzeW5jLFxuICAgICAgICBzaG93Tm9BY2Nlc3M6IHNob3dOb0FjY2VzcyQgfCBhc3luYyxcbiAgICAgICAgZG9zc2llckRldGFpbExheW91dDogZG9zc2llckRldGFpbExheW91dCQgfCBhc3luYyxcbiAgICAgICAgb3BlblRhc2tBbmRQcm9jZXNzTGlua0luTW9kYWw6IG9wZW5UYXNrQW5kUHJvY2Vzc0xpbmtJbk1vZGFsJCB8IGFzeW5jLFxuICAgICAgICB0YXNrQW5kUHJvY2Vzc0xpbmtPcGVuZWRJblBhbmVsOiB0YXNrQW5kUHJvY2Vzc0xpbmtPcGVuZWRJblBhbmVsJCB8IGFzeW5jLFxuICAgICAgfSBhcyB0YWJDb250ZW50T2JzXCJcbiAgICA+XG4gICAgICA8YXMtc3BsaXRcbiAgICAgICAgZGlyZWN0aW9uPVwiaG9yaXpvbnRhbFwiXG4gICAgICAgIFtkaXNhYmxlZF09XCIhdGFiQ29udGVudE9icy5kb3NzaWVyRGV0YWlsTGF5b3V0LndpZHRoQWRqdXN0YWJsZVwiXG4gICAgICAgIFtndXR0ZXJTaXplXT1cIkRPU1NJRVJfREVUQUlMX0dVVFRFUl9TSVpFXCJcbiAgICAgICAgW3VuaXRdPVwidGFiQ29udGVudE9icy5kb3NzaWVyRGV0YWlsTGF5b3V0LnVuaXRcIlxuICAgICAgPlxuICAgICAgICA8YXMtc3BsaXQtYXJlYVxuICAgICAgICAgIFtzaXplXT1cInRhYkNvbnRlbnRPYnMuZG9zc2llckRldGFpbExheW91dC5sZWZ0UGFuZWxXaWR0aFwiXG4gICAgICAgICAgW21pblNpemVdPVwidGFiQ29udGVudE9icy5kb3NzaWVyRGV0YWlsTGF5b3V0LmxlZnRQYW5lbE1pbldpZHRoXCJcbiAgICAgICAgICBbbWF4U2l6ZV09XCJ0YWJDb250ZW50T2JzLmRvc3NpZXJEZXRhaWxMYXlvdXQubGVmdFBhbmVsTWF4V2lkdGhcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJjYXJkLWJvZHkgYmctd2hpdGUgcC01IHBvc2l0aW9uLXJlbGF0aXZlIHRhYi1jb250YWluZXJcIlxuICAgICAgICAgICAgW2NsYXNzLnRhYi1jb250YWluZXItLWNvbXBhY3RdPVwiY29tcGFjdE1vZGUkIHwgYXN5bmNcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJsb2FkaW5nVGFicyQgfCBhc3luY1wiIGNsYXNzPVwibG9hZGluZy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPGNkcy1sb2FkaW5nPjwvY2RzLWxvYWRpbmc+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPHZhbHRpbW8tbm8tcmVzdWx0c1xuICAgICAgICAgICAgICAqbmdJZj1cInRhYkNvbnRlbnRPYnMuc2hvd05vQWNjZXNzXCJcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb249XCJ7eyAnZG9zc2llci5ub0FjY2Vzcy5kZXNjcmlwdGlvbicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICB0aXRsZT1cInt7ICdkb3NzaWVyLm5vQWNjZXNzLnRpdGxlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIGlsbHVzdHJhdGlvbj1cInZhbHRpbW8tbGF5b3V0L2ltZy9lbXB0eXN0YXRlLW5vdC1hdXRob3Jpc2VkLnN2Z1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L3ZhbHRpbW8tbm8tcmVzdWx0cz5cblxuICAgICAgICAgICAgPHZhbHRpbW8tbm8tcmVzdWx0c1xuICAgICAgICAgICAgICAqbmdJZj1cInRhYkNvbnRlbnRPYnMubm9UYWJzQ29uZmlndXJlZFwiXG4gICAgICAgICAgICAgIFtkZXNjcmlwdGlvbl09XCInZG9zc2llci50YWJzLm5vUmVzdWx0c0Rlc2NyaXB0aW9uJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCInZG9zc2llci50YWJzLm5vUmVzdWx0cycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPjwvdmFsdGltby1uby1yZXN1bHRzPlxuXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3RhYkNvbnRhaW5lcj48L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xlYXJmaXhcIj48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9hcy1zcGxpdC1hcmVhPlxuXG4gICAgICAgIDxhcy1zcGxpdC1hcmVhXG4gICAgICAgICAgKm5nSWY9XCJ0YWJDb250ZW50T2JzLmRvc3NpZXJEZXRhaWxMYXlvdXQuc2hvd1JpZ2h0UGFuZWxcIlxuICAgICAgICAgIFtzaXplXT1cInRhYkNvbnRlbnRPYnMuZG9zc2llckRldGFpbExheW91dC5yaWdodFBhbmVsV2lkdGhcIlxuICAgICAgICAgIFttaW5TaXplXT1cInRhYkNvbnRlbnRPYnMuZG9zc2llckRldGFpbExheW91dC5yaWdodFBhbmVsTWluV2lkdGhcIlxuICAgICAgICAgIFttYXhTaXplXT1cInRhYkNvbnRlbnRPYnMuZG9zc2llckRldGFpbExheW91dC5yaWdodFBhbmVsTWF4V2lkdGhcIlxuICAgICAgICA+XG4gICAgICAgICAgQGlmICh0YWJDb250ZW50T2JzLnNob3dUYXNrTGlzdCkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhc2stcGFuZWxcIj5cbiAgICAgICAgICAgICAgQGlmICghdGFiQ29udGVudE9icy50YXNrQW5kUHJvY2Vzc0xpbmtPcGVuZWRJblBhbmVsKSB7XG4gICAgICAgICAgICAgICAgPHZhbHRpbW8tZG9zc2llci1kZXRhaWwtdGFzay1saXN0XG4gICAgICAgICAgICAgICAgICBbb3BlblRhc2tBbmRQcm9jZXNzTGlua0luTW9kYWxdPVwidGFiQ29udGVudE9icy5vcGVuVGFza0FuZFByb2Nlc3NMaW5rSW5Nb2RhbFwiXG4gICAgICAgICAgICAgICAgICAodGFza0NsaWNrRXZlbnQpPVwib25UYXNrQ2xpY2tFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIChmb3JtU3VibWl0RXZlbnQpPVwib25Gb3JtU3VibWl0RXZlbnQoKVwiXG4gICAgICAgICAgICAgICAgPjwvdmFsdGltby1kb3NzaWVyLWRldGFpbC10YXNrLWxpc3Q+XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBAaWYgKHRhYkNvbnRlbnRPYnMudGFza0FuZFByb2Nlc3NMaW5rT3BlbmVkSW5QYW5lbCkge1xuICAgICAgICAgICAgICAgIDx2YWx0aW1vLWRvc3NpZXItZGV0YWlsLXRhc2stZGV0YWlsXG4gICAgICAgICAgICAgICAgICBbdGFza0FuZFByb2Nlc3NMaW5rXT1cInRhYkNvbnRlbnRPYnMudGFza0FuZFByb2Nlc3NMaW5rT3BlbmVkSW5QYW5lbFwiXG4gICAgICAgICAgICAgICAgICAoYWN0aXZlQ2hhbmdlKT1cIm9uQWN0aXZlQ2hhbmdlRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAoY2xvc2VFdmVudCk9XCJvblRhc2tEZXRhaWxzQ2xvc2UoKVwiXG4gICAgICAgICAgICAgICAgICAoZm9ybVN1Ym1pdCk9XCJvbkZvcm1TdWJtaXRFdmVudCgpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPC92YWx0aW1vLWRvc3NpZXItZGV0YWlsLXRhc2stZGV0YWlsPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvYXMtc3BsaXQtYXJlYT5cbiAgICAgIDwvYXMtc3BsaXQ+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDx2YWx0aW1vLWRvc3NpZXItc3VwcG9ydGluZy1wcm9jZXNzLXN0YXJ0LW1vZGFsXG4gICAgW2lzQWRtaW5dPVwiaXNBZG1pbiQgfCBhc3luY1wiXG4gICAgKGZvcm1TdWJtaXQpPVwidGFiTG9hZGVyLnJlZnJlc2hWaWV3KClcIlxuICAgICNzdXBwb3J0aW5nUHJvY2Vzc1N0YXJ0TW9kYWxcbiAgPjwvdmFsdGltby1kb3NzaWVyLXN1cHBvcnRpbmctcHJvY2Vzcy1zdGFydC1tb2RhbD5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGVcbiAgI2Nhc2VEZXRhaWxIZWFkZXJcbiAgbGV0LWNhbkhhdmVBc3NpZ25lZT1cImNhbkhhdmVBc3NpZ25lZVwiXG4gIGxldC1kb2N1bWVudD1cImRvY3VtZW50XCJcbiAgbGV0LWNhbkFzc2lnbj1cImNhbkFzc2lnblwiXG4+XG4gIDxkaXYgY2xhc3M9XCJyb3dcIiAqbmdJZj1cIihjdXN0b21Eb3NzaWVySGVhZGVySXRlbXMgfHwgW10pLmxlbmd0aCA+IDBcIj5cbiAgICA8c3BhblxuICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgY3VzdG9tRG9zc2llckhlYWRlckl0ZW1zXCJcbiAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgaDE6IGl0ZW0udGV4dFNpemUgPT09ICd4bCcsXG4gICAgICAgIGgyOiBpdGVtLnRleHRTaXplID09PSAnbGcnLFxuICAgICAgICBoMzogaXRlbS50ZXh0U2l6ZSA9PT0gJ21kJyxcbiAgICAgICAgaDQ6IGl0ZW0udGV4dFNpemUgPT09ICdzbScsXG4gICAgICAgIGg1OiBpdGVtLnRleHRTaXplID09PSAneHMnLFxuICAgICAgfVwiXG4gICAgICBjbGFzcz1cIm1iLTAgbXQtMCBhbGlnbi1zZWxmLWVuZCBjb2wteGwte3sgaXRlbS5jb2x1bW5TaXplIH19IGNvbC1sZy17e1xuICAgICAgICBpdGVtLmNvbHVtblNpemUgKiAyXG4gICAgICB9fSB7eyBpdGVtLmN1c3RvbUNsYXNzIH19XCJcbiAgICA+XG4gICAgICA8c3BhbiAqbmdJZj1cIml0ZW0ubGFiZWxcIj57eyBpdGVtLmxhYmVsIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuXG4gICAgICA8c3BhbiAqbmdJZj1cIml0ZW0ubGFiZWwgJiYgaXRlbS52YWx1ZVwiPjogPC9zcGFuPlxuXG4gICAgICA8c3Ryb25nPnt7IGl0ZW0udmFsdWUgfX08L3N0cm9uZz5cbiAgICA8L3NwYW4+XG4gIDwvZGl2PlxuXG4gIDxuZy1jb250YWluZXJcbiAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgY2FzZURldGFpbEFzc2lnbmVlO1xuICAgICAgY29udGV4dDoge2NhbkhhdmVBc3NpZ25lZTogY2FuSGF2ZUFzc2lnbmVlLCBkb2N1bWVudDogZG9jdW1lbnQsIGNhbkFzc2lnbjogY2FuQXNzaWdufVxuICAgIFwiXG4gID48L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZVxuICAjY2FzZURldGFpbEFzc2lnbmVlXG4gIGxldC1jYW5IYXZlQXNzaWduZWU9XCJjYW5IYXZlQXNzaWduZWVcIlxuICBsZXQtZG9jdW1lbnQ9XCJkb2N1bWVudFwiXG4gIGxldC1jYW5Bc3NpZ249XCJjYW5Bc3NpZ25cIlxuPlxuICA8ZGl2ICpuZ0lmPVwiY2FuSGF2ZUFzc2lnbmVlICYmIGRvY3VtZW50XCI+XG4gICAgPHZhbHRpbW8tZG9zc2llci1hc3NpZ24tdXNlclxuICAgICAgKm5nSWY9XCJjYW5Bc3NpZ25Mb2FkZWQkIHwgYXN5bmNcIlxuICAgICAgW2Fzc2lnbmVlRnVsbE5hbWVdPVwiZG9jdW1lbnQ/LmFzc2lnbmVlRnVsbE5hbWVcIlxuICAgICAgW2Fzc2lnbmVlSWRdPVwiZG9jdW1lbnQuYXNzaWduZWVJZFwiXG4gICAgICBbZG9jdW1lbnRJZF09XCJkb2N1bWVudC5pZFwiXG4gICAgICBbaGFzUGVybWlzc2lvbl09XCJjYW5Bc3NpZ25cIlxuICAgICAgKGFzc2lnbm1lbnRPZkRvY3VtZW50Q2hhbmdlZCk9XCJhc3NpZ25tZW50T2ZEb2N1bWVudENoYW5nZWQoKVwiXG4gICAgPjwvdmFsdGltby1kb3NzaWVyLWFzc2lnbi11c2VyPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjY2xhaW1CdXR0b24gbGV0LWNhbkNsYWltPVwiY2FuQ2xhaW1cIiBsZXQtY2FuSGF2ZUFzc2lnbmVlPVwiY2FuSGF2ZUFzc2lnbmVlXCI+XG4gIDxjZHMtb3ZlcmZsb3ctbWVudS1vcHRpb25cbiAgICAqbmdJZj1cImNhbkNsYWltICYmIGNhbkhhdmVBc3NpZ25lZVwiXG4gICAgW2Rpc2FibGVkXT1cIihpc0Fzc2lnbmluZyQgfCBhc3luYykgfHwgKGlzQXNzaWduZWRUb0N1cnJlbnRVc2VyJCB8IGFzeW5jKVwiXG4gICAgKGNsaWNrKT1cImNsYWltQXNzaWduZWUoKVwiXG4gID5cbiAgICB7eyAnZG9zc2llci5jbGFpbUFzc2lnbmVlQ2FzZScgfCB0cmFuc2xhdGUgfX1cbiAgPC9jZHMtb3ZlcmZsb3ctbWVudS1vcHRpb24+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3VuYXNzaWduQnV0dG9uIGxldC1jYW5IYXZlQXNzaWduZWU9XCJjYW5IYXZlQXNzaWduZWVcIiBsZXQtYXNzaWduZWVJZD1cImFzc2lnbmVlSWRcIj5cbiAgPGNkcy1vdmVyZmxvdy1tZW51LW9wdGlvblxuICAgICpuZ0lmPVwiY2FuSGF2ZUFzc2lnbmVlXCJcbiAgICBbZGlzYWJsZWRdPVwiIWFzc2lnbmVlSWRcIlxuICAgIChzZWxlY3RlZCk9XCJ1bmFzc2lnbkFzc2lnbmVlKClcIlxuICA+XG4gICAge3sgJ2Fzc2lnbkRvY3VtZW50LnJlbW92ZScgfCB0cmFuc2xhdGUgfX1cbiAgPC9jZHMtb3ZlcmZsb3ctbWVudS1vcHRpb24+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlbGV0ZUJ1dHRvbiBsZXQtY2FuRGVsZXRlPVwiY2FuRGVsZXRlXCI+XG4gIDxjZHMtb3ZlcmZsb3ctbWVudS1vcHRpb25cbiAgICAqbmdJZj1cImNhbkRlbGV0ZVwiXG4gICAgW2Rpc2FibGVkXT1cImlzRGVsZXRpbmckIHwgYXN5bmNcIlxuICAgIChjbGljayk9XCJkZWxldGVEb2N1bWVudCgpXCJcbiAgICB0eXBlPVwiZGFuZ2VyXCJcbiAgPlxuICAgIHt7ICdkb3NzaWVyLmRlbGV0ZS5kZWxldGUnIHwgdHJhbnNsYXRlIH19XG4gIDwvY2RzLW92ZXJmbG93LW1lbnUtb3B0aW9uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNjdXN0b21TdGFydFRyaWdnZXI+XG4gIDxidXR0b25cbiAgICBbc2l6ZV09XCIoY29tcGFjdE1vZGUkIHwgYXN5bmMpID8gJ3NtJyA6ICdsZydcIlxuICAgIGNkc0J1dHRvbj1cInByaW1hcnlcIlxuICAgIFtkaXNhYmxlZF09XCJwcm9jZXNzRG9jdW1lbnREZWZpbml0aW9ucy5sZW5ndGggPT09IDBcIlxuICAgIFtuZ2JUb29sdGlwXT1cInByb2Nlc3NEb2N1bWVudERlZmluaXRpb25zLmxlbmd0aCA9PT0gMCA/ICdObyBhY3Rpb24nIDogbnVsbFwiXG4gID5cbiAgICB7eyAnZG9zc2llci5zdGFydFN1YlByb2Nlc3MnIHwgdHJhbnNsYXRlIH19XG5cbiAgICA8c3ZnIGNsYXNzPVwiY2RzLS1idG5fX2ljb25cIiBjZHNJY29uPVwiY2hldnJvbi0tZG93blwiIHNpemU9XCIxNlwiPjwvc3ZnPlxuICA8L2J1dHRvbj5cbjwvbmctdGVtcGxhdGU+XG5cbjx2YWx0aW1vLWNvbmZpcm1hdGlvbi1tb2RhbFxuICBjb25maXJtQnV0dG9uVGV4dFRyYW5zbGF0aW9uS2V5PVwiZG9zc2llci5kZWxldGUuY29uZmlybVwiXG4gIGNvbmZpcm1CdXR0b25UeXBlPVwiZGFuZ2VyXCJcbiAgY29udGVudFRyYW5zbGF0aW9uS2V5PVwiZG9zc2llci5kZWxldGUuZGVzY3JpcHRpb25cIlxuICBbc2hvd01vZGFsU3ViamVjdCRdPVwic2hvd0RlbGV0ZU1vZGFsJFwiXG4gIHRpdGxlVHJhbnNsYXRpb25LZXk9XCJkb3NzaWVyLmRlbGV0ZS5kZWxldGVcIlxuICAoY29uZmlybUV2ZW50KT1cIm9uQ29uZmlybURlbGV0ZSgpXCJcbj48L3ZhbHRpbW8tY29uZmlybWF0aW9uLW1vZGFsPlxuXG48bmctY29udGFpbmVyIHJlbmRlckluUGFnZUhlYWRlciBbZnVsbFdpZHRoXT1cInRydWVcIj5cbiAgPG5nLXRlbXBsYXRlPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiZG9zc2llci1hY3Rpb25zXCJcbiAgICAgIFtuZ0NsYXNzXT1cInsnLS1jb21wYWN0JzogY29tcGFjdE1vZGUkIHwgYXN5bmN9XCJcbiAgICAgICpuZ0lmPVwie1xuICAgICAgICBhc3NpZ25lZUlkOiBhc3NpZ25lZUlkJCB8IGFzeW5jLFxuICAgICAgICBjYW5Bc3NpZ246IGNhbkFzc2lnbiQgfCBhc3luYyxcbiAgICAgICAgY2FuQ2xhaW06IGNhbkNsYWltJCB8IGFzeW5jLFxuICAgICAgICBjYW5IYXZlQXNzaWduZWU6IGNhbkhhdmVBc3NpZ25lZSQgfCBhc3luYyxcbiAgICAgICAgY2FuRGVsZXRlOiBjYW5EZWxldGUkIHwgYXN5bmMsXG4gICAgICAgIGRvY3VtZW50OiBkb2N1bWVudCQgfCBhc3luYyxcbiAgICAgICAgY2FzZVN0YXR1czogY2FzZVN0YXR1cyQgfCBhc3luYyxcbiAgICAgIH0gYXMgb2JzXCJcbiAgICA+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZG9zc2llci1zdGF0dXMtYXNzaWduLWN1c3RvbS10aXRsZVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInsnLS1jb21wYWN0JzogY29tcGFjdE1vZGUkIHwgYXN5bmN9XCJcbiAgICAgID5cbiAgICAgICAgQGlmIChvYnMuY2FzZVN0YXR1cykge1xuICAgICAgICAgIDxjZHMtdGFnIHNpemU9XCJzbVwiIFt0eXBlXT1cIm9icy5jYXNlU3RhdHVzLnRhZ1R5cGVcIiBbdGl0bGVdPVwib2JzLmNhc2VTdGF0dXMudGl0bGVcIj57e1xuICAgICAgICAgICAgb2JzLmNhc2VTdGF0dXMudGl0bGVcbiAgICAgICAgICB9fTwvY2RzLXRhZz5cbiAgICAgICAgfVxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkb3NzaWVyLWFzc2lnbi11c2VyXCIgW25nQ2xhc3NdPVwieyctLWNvbXBhY3QnOiBjb21wYWN0TW9kZSQgfCBhc3luY31cIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICBjYXNlRGV0YWlsQXNzaWduZWU7XG4gICAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICBjYW5IYXZlQXNzaWduZWU6IG9icy5jYW5IYXZlQXNzaWduZWUsXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQ6IG9icy5kb2N1bWVudCxcbiAgICAgICAgICAgICAgICBjYW5Bc3NpZ246IG9icy5jYW5Bc3NpZ24sXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2FzZURldGFpbEhlYWRlclwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJidXR0b25zLWNvbnRhaW5lclwiPlxuICAgICAgICA8Y2RzLW92ZXJmbG93LW1lbnVcbiAgICAgICAgICBbbmdDbGFzc109XCJ7Jy0tY29tcGFjdCc6IGNvbXBhY3RNb2RlJCB8IGFzeW5jfVwiXG4gICAgICAgICAgKm5nSWY9XCJvYnMuY2FuSGF2ZUFzc2lnbmVlIHx8IG9icy5jYW5EZWxldGVcIlxuICAgICAgICAgIGZsaXA9XCJ0cnVlXCJcbiAgICAgICAgICBbb2Zmc2V0XT1cIihjb21wYWN0TW9kZSQgfCBhc3luYykgPyB7eTogNDgsIHg6IC00fSA6IHt5OiA0OCwgeDogNH1cIlxuICAgICAgICAgIGNsYXNzPVwib3ZlcmZsb3ctYnV0dG9uIGFzc2lnbi1vdmVyZmxvd1wiXG4gICAgICAgID5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICBjbGFpbUJ1dHRvbjtcbiAgICAgICAgICAgICAgY29udGV4dDoge2NhbkNsYWltOiBvYnMuY2FuQ2xhaW0sIGNhbkhhdmVBc3NpZ25lZTogb2JzLmNhbkhhdmVBc3NpZ25lZX1cbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgIHVuYXNzaWduQnV0dG9uO1xuICAgICAgICAgICAgICBjb250ZXh0OiB7Y2FuSGF2ZUFzc2lnbmVlOiBvYnMuY2FuSGF2ZUFzc2lnbmVlLCBhc3NpZ25lZUlkOiBvYnMuYXNzaWduZWVJZH1cbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkZWxldGVCdXR0b247IGNvbnRleHQ6IHtjYW5EZWxldGU6IG9icy5jYW5EZWxldGV9XCI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvY2RzLW92ZXJmbG93LW1lbnU+XG5cbiAgICAgICAgPGNkcy1vdmVyZmxvdy1tZW51XG4gICAgICAgICAgdmFsdGltb0Nkc092ZXJmbG93QnV0dG9uXG4gICAgICAgICAgW25nQ2xhc3NdPVwieyctLWNvbXBhY3QnOiBjb21wYWN0TW9kZSQgfCBhc3luY31cIlxuICAgICAgICAgIFt3aWR0aF09XCJkcm9wZG93bldpZHRoJCB8IGFzeW5jXCJcbiAgICAgICAgICBbY3VzdG9tVHJpZ2dlcl09XCJjdXN0b21TdGFydFRyaWdnZXJcIlxuICAgICAgICAgIFtvZmZzZXRdPVwie3k6IDQ4LCB4OiAzNX1cIlxuICAgICAgICAgIGNsYXNzPVwib3ZlcmZsb3ctYnV0dG9uIGNhc2UtZGV0YWlsLW92ZXJmbG93XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxjZHMtb3ZlcmZsb3ctbWVudS1vcHRpb25cbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBwcm9jZXNzRG9jdW1lbnREZWZpbml0aW9uIG9mIHByb2Nlc3NEb2N1bWVudERlZmluaXRpb25zXCJcbiAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cInByb2Nlc3NEb2N1bWVudERlZmluaXRpb24uZGlzcGxheU5hbWVcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInN0YXJ0UHJvY2Vzcyhwcm9jZXNzRG9jdW1lbnREZWZpbml0aW9uKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgcHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbi5kaXNwbGF5TmFtZSB9fVxuICAgICAgICAgIDwvY2RzLW92ZXJmbG93LW1lbnUtb3B0aW9uPlxuICAgICAgICA8L2Nkcy1vdmVyZmxvdy1tZW51PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==
493
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9zc2llci1kZXRhaWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby9kb3NzaWVyL3NyYy9saWIvY29tcG9uZW50cy9kb3NzaWVyLWRldGFpbC9kb3NzaWVyLWRldGFpbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0aW1vL2Rvc3NpZXIvc3JjL2xpYi9jb21wb25lbnRzL2Rvc3NpZXItZGV0YWlsL2Rvc3NpZXItZGV0YWlsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFFTCxTQUFTLEVBR1QsTUFBTSxFQUdOLFNBQVMsRUFDVCxnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFpQixlQUFlLEVBQTJCLE1BQU0saUJBQWlCLENBQUM7QUFDMUYsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUc1QyxPQUFPLEVBRUwsZ0JBQWdCLEVBRWhCLGtCQUFrQixFQUdsQix1QkFBdUIsR0FDeEIsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QixPQUFPLEVBR0wsYUFBYSxFQUliLHVCQUF1QixHQUV4QixNQUFNLG1CQUFtQixDQUFDO0FBSTNCLE9BQU8sRUFBYyxtQkFBbUIsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBRTNFLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUU1QixPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFDYixNQUFNLEVBQ04sR0FBRyxFQUVILEVBQUUsRUFDRixTQUFTLEVBQ1QsT0FBTyxFQUNQLFlBQVksRUFDWixTQUFTLEVBQ1QsSUFBSSxFQUNKLEdBQUcsR0FDSixNQUFNLE1BQU0sQ0FBQztBQUNkLE9B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QixFQUFFLDBCQUEwQixFQUFFLG1CQUFtQixDQUFDOzswQkE0UDVFLE1BQU07MkJBQUMsUUFBUTt5Q0FyUGxCLHNCQUFzQjtzQkFEckIsU0FBUzt1QkFBQyw2QkFBNkI7Z0JBSXhDLGdCQUFnQjtzQkFEZixTQUFTO3VCQUFDLGNBQWMsRUFBRSxFQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBQztnQkFJbEMsb0JBQW9CO3NCQURwQyxTQUFTO3VCQUFDLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAxNS0yMDI0IFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQge0RPQ1VNRU5UfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gIEVsZW1lbnRSZWYsXG4gIEluamVjdCxcbiAgT25EZXN0cm95LFxuICBSZW5kZXJlcjIsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlLCBOYXZpZ2F0aW9uU3RhcnQsIFBhcmFtTWFwLCBQYXJhbXMsIFJvdXRlcn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7Q2hldnJvbkRvd24xNn0gZnJvbSAnQGNhcmJvbi9pY29ucyc7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtQZXJtaXNzaW9uU2VydmljZX0gZnJvbSAnQHZhbHRpbW8vYWNjZXNzLWNvbnRyb2wnO1xuaW1wb3J0IHtcbiAgQnJlYWRjcnVtYlNlcnZpY2UsXG4gIENBUkJPTl9DT05TVEFOVFMsXG4gIENkc1RoZW1lU2VydmljZSxcbiAgQ3VycmVudENhcmJvblRoZW1lLFxuICBQYWdlSGVhZGVyU2VydmljZSxcbiAgUGFnZVRpdGxlU2VydmljZSxcbiAgUGVuZGluZ0NoYW5nZXNDb21wb25lbnQsXG59IGZyb20gJ0B2YWx0aW1vL2NvbXBvbmVudHMnO1xuaW1wb3J0IHtDb25maWdTZXJ2aWNlfSBmcm9tICdAdmFsdGltby9jb25maWcnO1xuaW1wb3J0IHtcbiAgQ2FzZVN0YXR1c1NlcnZpY2UsXG4gIENhc2VUYWcsXG4gIENhc2VUYWdzVXRpbHMsXG4gIERvY3VtZW50IGFzIFZhbHRpbW9Eb2N1bWVudCxcbiAgRG9jdW1lbnRTZXJ2aWNlLFxuICBJbnRlcm5hbENhc2VTdGF0dXMsXG4gIEludGVybmFsQ2FzZVN0YXR1c1V0aWxzLFxuICBQcm9jZXNzRG9jdW1lbnREZWZpbml0aW9uLFxufSBmcm9tICdAdmFsdGltby9kb2N1bWVudCc7XG5pbXBvcnQge1Rhc2tXaXRoUHJvY2Vzc0xpbmt9IGZyb20gJ0B2YWx0aW1vL3Byb2Nlc3MtbGluayc7XG5pbXBvcnQge1VzZXJQcm92aWRlclNlcnZpY2V9IGZyb20gJ0B2YWx0aW1vL3NlY3VyaXR5JztcbmltcG9ydCB7SW50ZXJtZWRpYXRlU3VibWlzc2lvbn0gZnJvbSAnQHZhbHRpbW8vdGFzayc7XG5pbXBvcnQge0ljb25TZXJ2aWNlLCBOb3RpZmljYXRpb25TZXJ2aWNlfSBmcm9tICdjYXJib24tY29tcG9uZW50cy1hbmd1bGFyJztcbmltcG9ydCB7S2V5Y2xvYWtTZXJ2aWNlfSBmcm9tICdrZXljbG9hay1hbmd1bGFyJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7TkdYTG9nZ2VyfSBmcm9tICduZ3gtbG9nZ2VyJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgY29tYmluZUxhdGVzdCxcbiAgZmlsdGVyLFxuICBtYXAsXG4gIE9ic2VydmFibGUsXG4gIG9mLFxuICBzdGFydFdpdGgsXG4gIFN1YmplY3QsXG4gIFN1YnNjcmlwdGlvbixcbiAgc3dpdGNoTWFwLFxuICB0YWtlLFxuICB0YXAsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgRE9TU0lFUl9ERVRBSUxfREVGQVVMVF9ESVNQTEFZX1NJWkUsXG4gIERPU1NJRVJfREVUQUlMX0RFRkFVTFRfRElTUExBWV9UWVBFLFxuICBET1NTSUVSX0RFVEFJTF9HVVRURVJfU0laRSxcbiAgRE9TU0lFUl9ERVRBSUxfU1RBUlRfUFJPQ0VTU19EUk9QRE9XTl9XSURUSCxcbn0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCB7VGFiSW1wbCwgVGFiTG9hZGVySW1wbH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7XG4gIENBTl9BU1NJR05fQ0FTRV9QRVJNSVNTSU9OLFxuICBDQU5fQ0xBSU1fQ0FTRV9QRVJNSVNTSU9OLFxuICBDQU5fREVMRVRFX0NBU0VfUEVSTUlTU0lPTixcbiAgQ0FOX1ZJRVdfQ0FTRV9QRVJNSVNTSU9OLFxuICBET1NTSUVSX0RFVEFJTF9QRVJNSVNTSU9OX1JFU09VUkNFLFxufSBmcm9tICcuLi8uLi9wZXJtaXNzaW9ucyc7XG5pbXBvcnQge0Rvc3NpZXJEZXRhaWxMYXlvdXRTZXJ2aWNlLCBEb3NzaWVyU2VydmljZSwgRG9zc2llclRhYlNlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcbmltcG9ydCB7RG9zc2llclN1cHBvcnRpbmdQcm9jZXNzU3RhcnRNb2RhbENvbXBvbmVudH0gZnJvbSAnLi4vZG9zc2llci1zdXBwb3J0aW5nLXByb2Nlc3Mtc3RhcnQtbW9kYWwvZG9zc2llci1zdXBwb3J0aW5nLXByb2Nlc3Mtc3RhcnQtbW9kYWwuY29tcG9uZW50JztcbmltcG9ydCB7V2lkZ2V0c1NlcnZpY2V9IGZyb20gJy4vdGFiL3dpZGdldHMvd2lkZ2V0cy5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsdGltby1kb3NzaWVyLWRldGFpbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9kb3NzaWVyLWRldGFpbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Rvc3NpZXItZGV0YWlsLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW0Rvc3NpZXJUYWJTZXJ2aWNlLCBEb3NzaWVyRGV0YWlsTGF5b3V0U2VydmljZSwgTm90aWZpY2F0aW9uU2VydmljZV0sXG59KVxuZXhwb3J0IGNsYXNzIERvc3NpZXJEZXRhaWxDb21wb25lbnRcbiAgZXh0ZW5kcyBQZW5kaW5nQ2hhbmdlc0NvbXBvbmVudFxuICBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveVxue1xuICBAVmlld0NoaWxkKCdzdXBwb3J0aW5nUHJvY2Vzc1N0YXJ0TW9kYWwnKVxuICBzdXBwb3J0aW5nUHJvY2Vzc1N0YXJ0OiBEb3NzaWVyU3VwcG9ydGluZ1Byb2Nlc3NTdGFydE1vZGFsQ29tcG9uZW50O1xuXG4gIEBWaWV3Q2hpbGQoJ3RhYkNvbnRhaW5lcicsIHtyZWFkOiBWaWV3Q29udGFpbmVyUmVmfSlcbiAgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZjtcblxuICBAVmlld0NoaWxkKCd0YWJDb250ZW50Q29udGFpbmVyJylcbiAgcHJpdmF0ZSByZWFkb25seSBfdGFiQ29udGVudENvbnRhaW5lciE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG4gIHB1YmxpYyBjdXN0b21Eb3NzaWVySGVhZGVySXRlbXM6IEFycmF5PGFueT4gPSBbXTtcbiAgcHVibGljIGRvY3VtZW50OiBWYWx0aW1vRG9jdW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIGRvY3VtZW50RGVmaW5pdGlvbk5hbWU6IHN0cmluZztcbiAgcHVibGljIGRvY3VtZW50RGVmaW5pdGlvbk5hbWVUaXRsZTogc3RyaW5nO1xuICBwdWJsaWMgZG9jdW1lbnRJZDogc3RyaW5nO1xuICBwdWJsaWMgcHJvY2Vzc0RlZmluaXRpb25MaXN0RmllbGRzOiBBcnJheTxhbnk+ID0gW107XG4gIHB1YmxpYyBwcm9jZXNzRG9jdW1lbnREZWZpbml0aW9uczogKFByb2Nlc3NEb2N1bWVudERlZmluaXRpb24gJiB7ZGlzcGxheU5hbWU/OiBzdHJpbmd9KVtdID0gW107XG4gIHB1YmxpYyB0YWJMb2FkZXI6IFRhYkxvYWRlckltcGwgfCBudWxsID0gbnVsbDtcblxuICBwdWJsaWMgcmVhZG9ubHkgYXNzaWduZWVJZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xuICBwdWJsaWMgcmVhZG9ubHkgY3VycmVudEludGVybWVkaWF0ZVNhdmUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJbnRlcm1lZGlhdGVTdWJtaXNzaW9uIHwgbnVsbD4oXG4gICAgbnVsbFxuICApO1xuICBwdWJsaWMgcmVhZG9ubHkgaXNBZG1pbiQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLnVzZXJQcm92aWRlclNlcnZpY2VcbiAgICAuZ2V0VXNlclN1YmplY3QoKVxuICAgIC5waXBlKG1hcCh1c2VySWRlbnRpdHkgPT4gdXNlcklkZW50aXR5Py5yb2xlcz8uaW5jbHVkZXMoJ1JPTEVfQURNSU4nKSkpO1xuXG4gIHB1YmxpYyByZWFkb25seSB0YXNrQW5kUHJvY2Vzc0xpbmtPcGVuZWRJblBhbmVsJCA9XG4gICAgdGhpcy5kb3NzaWVyRGV0YWlsTGF5b3V0U2VydmljZS50YXNrQW5kUHJvY2Vzc0xpbmtPcGVuZWRJblBhbmVsJDtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9jYXNlU3RhdHVzS2V5JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nIHwgbnVsbCB8ICdOT1RfQVZBSUxBQkxFJz4obnVsbCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3Rhc2tQYW5lbFRvZ2dsZSA9IHRoaXMuY29uZmlnU2VydmljZS5mZWF0dXJlVG9nZ2xlcz8uZW5hYmxlVGFza1BhbmVsO1xuXG4gIHB1YmxpYyByZWFkb25seSBkcm9wZG93bldpZHRoJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPihcbiAgICBET1NTSUVSX0RFVEFJTF9TVEFSVF9QUk9DRVNTX0RST1BET1dOX1dJRFRILnNtYWxsXG4gICk7XG4gIHB1YmxpYyByZWFkb25seSBjYXNlU3RhdHVzS2V5JDogT2JzZXJ2YWJsZTxzdHJpbmcgfCAnTk9UX0FWQUlMQUJMRSc+ID0gdGhpcy5fY2FzZVN0YXR1c0tleSQucGlwZShcbiAgICBmaWx0ZXIoa2V5ID0+ICEha2V5KVxuICApO1xuXG4gIHB1YmxpYyByZWFkb25seSBfY2FzZVRhZ3MkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDYXNlVGFnW10gfCBudWxsPihudWxsKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgc2hvd0RlbGV0ZU1vZGFsJDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGNhblZpZXckOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5yb3V0ZS5wYXJhbU1hcC5waXBlKFxuICAgIHN3aXRjaE1hcCgocGFyYW1zOiBQYXJhbU1hcCkgPT5cbiAgICAgIHRoaXMucGVybWlzc2lvblNlcnZpY2UucmVxdWVzdFBlcm1pc3Npb24oQ0FOX1ZJRVdfQ0FTRV9QRVJNSVNTSU9OLCB7XG4gICAgICAgIHJlc291cmNlOiBET1NTSUVSX0RFVEFJTF9QRVJNSVNTSU9OX1JFU09VUkNFLmpzb25TY2hlbWFEb2N1bWVudCxcbiAgICAgICAgaWRlbnRpZmllcjogcGFyYW1zLmdldCgnZG9jdW1lbnRJZCcpID8/ICcnLFxuICAgICAgfSlcbiAgICApXG4gICk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGRvY3VtZW50JDogT2JzZXJ2YWJsZTxWYWx0aW1vRG9jdW1lbnQgfCBudWxsPiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuZG9zc2llclNlcnZpY2UucmVmcmVzaERvY3VtZW50JCxcbiAgICB0aGlzLmNhblZpZXckLFxuICBdKS5waXBlKFxuICAgIGZpbHRlcigoW18sIGNhblZpZXddKSA9PiBjYW5WaWV3KSxcbiAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5yb3V0ZS5wYXJhbXMpLFxuICAgIG1hcCgocGFyYW1zOiBQYXJhbXMpID0+IHBhcmFtcz8uZG9jdW1lbnRJZCksXG4gICAgc3dpdGNoTWFwKChkb2N1bWVudElkOiBzdHJpbmcpID0+XG4gICAgICBkb2N1bWVudElkID8gdGhpcy5kb2N1bWVudFNlcnZpY2UuZ2V0RG9jdW1lbnQodGhpcy5kb2N1bWVudElkKSA6IG9mKG51bGwpXG4gICAgKSxcbiAgICB0YXAoKGRvY3VtZW50OiBWYWx0aW1vRG9jdW1lbnQgfCBudWxsKSA9PiB7XG4gICAgICBpZiAoZG9jdW1lbnQpIHtcbiAgICAgICAgdGhpcy5hc3NpZ25lZUlkJC5uZXh0KGRvY3VtZW50LmFzc2lnbmVlSWQpO1xuICAgICAgICB0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQ7XG4gICAgICAgIHRoaXMuX2Nhc2VTdGF0dXNLZXkkLm5leHQoZG9jdW1lbnQ/LmludGVybmFsU3RhdHVzIHx8ICdOT1RfQVZBSUxBQkxFJyk7XG4gICAgICAgIHRoaXMuX2Nhc2VUYWdzJC5uZXh0KGRvY3VtZW50Py5jYXNlVGFncyB8fCBudWxsKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZy5jdXN0b21Eb3NzaWVySGVhZGVyPy5oYXNPd25Qcm9wZXJ0eShcbiAgICAgICAgICAgIHRoaXMuZG9jdW1lbnREZWZpbml0aW9uTmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgKSAmJlxuICAgICAgICAgIHRoaXMuY3VzdG9tRG9zc2llckhlYWRlckl0ZW1zLmxlbmd0aCA9PT0gMFxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnLmN1c3RvbURvc3NpZXJIZWFkZXJbXG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50RGVmaW5pdGlvbk5hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAgIF0/LmZvckVhY2goaXRlbSA9PiB0aGlzLmdldEN1c3RvbURvc3NpZXJIZWFkZXJJdGVtKGl0ZW0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gICk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGRvY3VtZW50RGVmaW5pdGlvbk5hbWUkOiBPYnNlcnZhYmxlPHN0cmluZz4gPSB0aGlzLnJvdXRlLnBhcmFtcy5waXBlKFxuICAgIG1hcChwYXJhbXMgPT4gcGFyYW1zLmRvY3VtZW50RGVmaW5pdGlvbk5hbWUgfHwgJycpXG4gICk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGNhc2VTdGF0dXMkOiBPYnNlcnZhYmxlPEludGVybmFsQ2FzZVN0YXR1cyB8IHVuZGVmaW5lZD4gPVxuICAgIHRoaXMuZG9jdW1lbnREZWZpbml0aW9uTmFtZSQucGlwZShcbiAgICAgIGZpbHRlcihkb2N1bWVudERlZmluaXRpb25OYW1lID0+ICEhZG9jdW1lbnREZWZpbml0aW9uTmFtZSksXG4gICAgICBzd2l0Y2hNYXAoZG9jdW1lbnREZWZpbml0aW9uTmFtZSA9PlxuICAgICAgICBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgICB0aGlzLmNhc2VTdGF0dXNTZXJ2aWNlLmdldEludGVybmFsQ2FzZVN0YXR1c2VzKGRvY3VtZW50RGVmaW5pdGlvbk5hbWUpLFxuICAgICAgICAgIHRoaXMuY2FzZVN0YXR1c0tleSQsXG4gICAgICAgIF0pXG4gICAgICApLFxuICAgICAgbWFwKFxuICAgICAgICAoW3N0YXR1c2VzLCBrZXldKSA9PiBrZXkgIT09ICdOT1RfQVZBSUxBQkxFJyAmJiBzdGF0dXNlcy5maW5kKHN0YXR1cyA9PiBzdGF0dXM/LmtleSA9PT0ga2V5KVxuICAgICAgKSxcbiAgICAgIG1hcChcbiAgICAgICAgc3RhdHVzID0+XG4gICAgICAgICAgc3RhdHVzICYmIHtcbiAgICAgICAgICAgIC4uLnN0YXR1cyxcbiAgICAgICAgICAgIHRhZ1R5cGU6IEludGVybmFsQ2FzZVN0YXR1c1V0aWxzLmdldFRhZ1R5cGVGcm9tSW50ZXJuYWxDYXNlU3RhdHVzQ29sb3Ioc3RhdHVzLmNvbG9yKSxcbiAgICAgICAgICB9XG4gICAgICApXG4gICAgKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgY2FzZVRhZ3MkOiBPYnNlcnZhYmxlPENhc2VUYWdbXSB8IHVuZGVmaW5lZD4gPSB0aGlzLmRvY3VtZW50RGVmaW5pdGlvbk5hbWUkLnBpcGUoXG4gICAgZmlsdGVyKGRvY3VtZW50RGVmaW5pdGlvbk5hbWUgPT4gISFkb2N1bWVudERlZmluaXRpb25OYW1lKSxcbiAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5fY2FzZVRhZ3MkKSxcbiAgICBtYXAoXG4gICAgICB0YWcgPT5cbiAgICAgICAgdGFnICYmXG4gICAgICAgIHRhZy5tYXAoY2FzZVRhZyA9PiAoe1xuICAgICAgICAgIC4uLmNhc2VUYWcsXG4gICAgICAgICAgdGFnVHlwZTogQ2FzZVRhZ3NVdGlscy5nZXRUYWdUeXBlRnJvbUNhc2VUYWdDb2xvcihjYXNlVGFnLmNvbG9yKSxcbiAgICAgICAgfSkpXG4gICAgKVxuICApO1xuXG4gIHB1YmxpYyByZWFkb25seSBoYXNDYXNlVGFncyQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLl9jYXNlVGFncyQucGlwZShcbiAgICBtYXAoY2FzZVRhZ3MgPT4gQXJyYXkuaXNBcnJheShjYXNlVGFncykgJiYgY2FzZVRhZ3MubGVuZ3RoID4gMClcbiAgKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgdXNlcklkJDogT2JzZXJ2YWJsZTxzdHJpbmcgfCB1bmRlZmluZWQ+ID0gb2YoXG4gICAgdGhpcy5rZXlDbG9ha1NlcnZpY2UuaXNMb2dnZWRJbigpXG4gICkucGlwZShcbiAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5rZXlDbG9ha1NlcnZpY2UubG9hZFVzZXJQcm9maWxlKCkpLFxuICAgIG1hcChwcm9maWxlID0+IHByb2ZpbGU/LmlkKVxuICApO1xuXG4gIHB1YmxpYyByZWFkb25seSBpc0Fzc2lnbmluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIHJlYWRvbmx5IGlzQXNzaWduZWRUb0N1cnJlbnRVc2VyJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuYXNzaWduZWVJZCQsXG4gICAgdGhpcy51c2VySWQkLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2Fzc2lnbmVlSWQsIHVzZXJJZF0pID0+ICEhYXNzaWduZWVJZCAmJiAhIXVzZXJJZCAmJiBhc3NpZ25lZUlkID09PSB1c2VySWQpLFxuICAgIHN0YXJ0V2l0aCh0cnVlKVxuICApO1xuXG4gIHB1YmxpYyByZWFkb25seSBjYW5IYXZlQXNzaWduZWUkOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5kb2N1bWVudERlZmluaXRpb25OYW1lJC5waXBlKFxuICAgIHN3aXRjaE1hcChkb2N1bWVudERlZmluaXRpb25OYW1lID0+XG4gICAgICB0aGlzLmRvY3VtZW50U2VydmljZS5nZXRDYXNlU2V0dGluZ3MoZG9jdW1lbnREZWZpbml0aW9uTmFtZSlcbiAgICApLFxuICAgIG1hcChjYXNlU2V0dGluZ3MgPT4gY2FzZVNldHRpbmdzPy5jYW5IYXZlQXNzaWduZWUpXG4gICk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGNhbkFzc2lnbkxvYWRlZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIHJlYWRvbmx5IGNhbkFzc2lnbiQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLnJvdXRlLnBhcmFtTWFwLnBpcGUoXG4gICAgc3dpdGNoTWFwKChwYXJhbXM6IFBhcmFtTWFwKSA9PlxuICAgICAgdGhpcy5wZXJtaXNzaW9uU2VydmljZS5yZXF1ZXN0UGVybWlzc2lvbihDQU5fQVNTSUdOX0NBU0VfUEVSTUlTU0lPTiwge1xuICAgICAgICByZXNvdXJjZTogRE9TU0lFUl9ERVRBSUxfUEVSTUlTU0lPTl9SRVNPVVJDRS5qc29uU2NoZW1hRG9jdW1lbnQsXG4gICAgICAgIGlkZW50aWZpZXI6IHBhcmFtcy5nZXQoJ2RvY3VtZW50SWQnKSA/PyAnJyxcbiAgICAgIH0pXG4gICAgKSxcbiAgICB0YXAoKCkgPT4ge1xuICAgICAgdGhpcy5jYW5Bc3NpZ25Mb2FkZWQkLm5leHQodHJ1ZSk7XG4gICAgfSlcbiAgKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgY2FuQ2xhaW0kOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5yb3V0ZS5wYXJhbU1hcC5waXBlKFxuICAgIHN3aXRjaE1hcCgocGFyYW1zOiBQYXJhbU1hcCkgPT5cbiAgICAgIHRoaXMucGVybWlzc2lvblNlcnZpY2UucmVxdWVzdFBlcm1pc3Npb24oQ0FOX0NMQUlNX0NBU0VfUEVSTUlTU0lPTiwge1xuICAgICAgICByZXNvdXJjZTogRE9TU0lFUl9ERVRBSUxfUEVSTUlTU0lPTl9SRVNPVVJDRS5qc29uU2NoZW1hRG9jdW1lbnQsXG4gICAgICAgIGlkZW50aWZpZXI6IHBhcmFtcy5nZXQoJ2RvY3VtZW50SWQnKSA/PyAnJyxcbiAgICAgIH0pXG4gICAgKVxuICApO1xuXG4gIHB1YmxpYyByZWFkb25seSBpc0RlbGV0aW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgcmVhZG9ubHkgY2FuRGVsZXRlJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMucm91dGUucGFyYW1NYXAucGlwZShcbiAgICBzd2l0Y2hNYXAoKHBhcmFtczogUGFyYW1NYXApID0+XG4gICAgICB0aGlzLnBlcm1pc3Npb25TZXJ2aWNlLnJlcXVlc3RQZXJtaXNzaW9uKENBTl9ERUxFVEVfQ0FTRV9QRVJNSVNTSU9OLCB7XG4gICAgICAgIHJlc291cmNlOiBET1NTSUVSX0RFVEFJTF9QRVJNSVNTSU9OX1JFU09VUkNFLmpzb25TY2hlbWFEb2N1bWVudCxcbiAgICAgICAgaWRlbnRpZmllcjogcGFyYW1zLmdldCgnZG9jdW1lbnRJZCcpID8/ICcnLFxuICAgICAgfSlcbiAgICApXG4gICk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGxvYWRpbmdUYWJzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG4gIHB1YmxpYyByZWFkb25seSBub1RhYnNDb25maWd1cmVkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgcmVhZG9ubHkgc2hvd05vQWNjZXNzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgYWN0aXZlVGFiJDogT2JzZXJ2YWJsZTxUYWJJbXBsPjtcblxuICBwdWJsaWMgcmVhZG9ubHkgY29tcGFjdE1vZGUkID0gdGhpcy5wYWdlSGVhZGVyU2VydmljZS5jb21wYWN0TW9kZSQ7XG5cbiAgcHVibGljIHJlYWRvbmx5IHNtYWxsVGl0bGUkID0gdGhpcy5wYWdlSGVhZGVyU2VydmljZS5zbWFsbFRpdGxlJDtcblxuICBwdWJsaWMgcmVhZG9ubHkgdGFiSG9yaXpvbnRhbE92ZXJmbG93RGlzYWJsZWQgPVxuICAgIHRoaXMuZG9zc2llclRhYlNlcnZpY2UudGFiSG9yaXpvbnRhbE92ZXJmbG93RGlzYWJsZWQ7XG5cbiAgcHVibGljIHJlYWRvbmx5IHNob3dUYXNrTGlzdCQgPSB0aGlzLmRvc3NpZXJUYWJTZXJ2aWNlLnNob3dUYXNrTGlzdCQ7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfYWN0aXZlVGFiTmFtZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBwdWJsaWMgZ2V0IGFjdGl2ZVRhYk5hbWUkKCk6IE9ic2VydmFibGU8c3RyaW5nIHwgbnVsbD4ge1xuICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFt0aGlzLnJvdXRlLnBhcmFtTWFwLCB0aGlzLl9hY3RpdmVUYWJOYW1lJF0pLnBpcGUoXG4gICAgICBtYXAoKFtwYXJhbU1hcCwgYWN0aXZlVGFiTmFtZV0pID0+XG4gICAgICAgICFhY3RpdmVUYWJOYW1lID8gKHBhcmFtTWFwLmdldCgndGFiJykgPz8gbnVsbCkgOiBhY3RpdmVUYWJOYW1lXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBET1NTSUVSX0RFVEFJTF9HVVRURVJfU0laRSA9IERPU1NJRVJfREVUQUlMX0dVVFRFUl9TSVpFO1xuXG4gIHB1YmxpYyByZWFkb25seSBkb3NzaWVyRGV0YWlsTGF5b3V0JCA9IHRoaXMuZG9zc2llckRldGFpbExheW91dFNlcnZpY2UuZG9zc2llckRldGFpbExheW91dCQ7XG5cbiAgcHVibGljIHJlYWRvbmx5IG9wZW5UYXNrQW5kUHJvY2Vzc0xpbmtJbk1vZGFsJCA9IG5ldyBTdWJqZWN0PFRhc2tXaXRoUHJvY2Vzc0xpbms+KCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGlzRGFya01vZGUkID0gdGhpcy5jZHNUaGVtZVNlcnZpY2UuY3VycmVudFRoZW1lJC5waXBlKFxuICAgIG1hcChjdXJyZW50VGhlbWUgPT4gY3VycmVudFRoZW1lID09PSBDdXJyZW50Q2FyYm9uVGhlbWUuRzkwKVxuICApO1xuXG4gIHByaXZhdGUgX3NuYXBzaG90OiBQYXJhbU1hcDtcbiAgcHJpdmF0ZSBfaW5pdGlhbFRhYk5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBfYWN0aXZlQ2hhbmdlID0gZmFsc2U7XG4gIHByaXZhdGUgX29sZFRhYk5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBfcGVuZGluZ1RhYjogVGFiSW1wbDtcbiAgcHJpdmF0ZSBfb2JzZXJ2ZXIhOiBSZXNpemVPYnNlcnZlcjtcbiAgcHJpdmF0ZSBfdGFic0luaXQgPSBmYWxzZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9zdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYnJlYWRjcnVtYlNlcnZpY2U6IEJyZWFkY3J1bWJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2FzZVN0YXR1c1NlcnZpY2U6IENhc2VTdGF0dXNTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2RzVGhlbWVTZXJ2aWNlOiBDZHNUaGVtZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZ1NlcnZpY2U6IENvbmZpZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudFNlcnZpY2U6IERvY3VtZW50U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRvc3NpZXJEZXRhaWxMYXlvdXRTZXJ2aWNlOiBEb3NzaWVyRGV0YWlsTGF5b3V0U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRvc3NpZXJTZXJ2aWNlOiBEb3NzaWVyU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRvc3NpZXJUYWJTZXJ2aWNlOiBEb3NzaWVyVGFiU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGljb25TZXJ2aWNlOiBJY29uU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGtleUNsb2FrU2VydmljZTogS2V5Y2xvYWtTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBOR1hMb2dnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFnZUhlYWRlclNlcnZpY2U6IFBhZ2VIZWFkZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFnZVRpdGxlU2VydmljZTogUGFnZVRpdGxlU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBlcm1pc3Npb25TZXJ2aWNlOiBQZXJtaXNzaW9uU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSB3aWRnZXRzU2VydmljZTogV2lkZ2V0c1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSB1c2VyUHJvdmlkZXJTZXJ2aWNlOiBVc2VyUHJvdmlkZXJTZXJ2aWNlLFxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgcmVhZG9ubHkgaHRtbERvY3VtZW50OiBEb2N1bWVudFxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX3NuYXBzaG90ID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbU1hcDtcbiAgICB0aGlzLmRvY3VtZW50RGVmaW5pdGlvbk5hbWUgPSB0aGlzLl9zbmFwc2hvdC5nZXQoJ2RvY3VtZW50RGVmaW5pdGlvbk5hbWUnKSB8fCAnJztcbiAgICB0aGlzLmRvY3VtZW50SWQgPSB0aGlzLl9zbmFwc2hvdC5nZXQoJ2RvY3VtZW50SWQnKSB8fCAnJztcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pbml0VGFiTG9hZGVyKCk7XG4gICAgdGhpcy5pbml0QnJlYWRjcnVtYigpO1xuICAgIHRoaXMub3BlbldpZHRoT2JzZXJ2ZXIoKTtcbiAgICB0aGlzLnBhZ2VUaXRsZVNlcnZpY2UuZGlzYWJsZVJlc2V0KCk7XG4gICAgdGhpcy5pY29uU2VydmljZS5yZWdpc3RlckFsbChbQ2hldnJvbkRvd24xNl0pO1xuICAgIHRoaXMuc2V0RG9jdW1lbnRTdHlsZSgpO1xuICAgIHRoaXMuZW5hYmxlUmVzZXRPbkJhY2tOYXZpZ2F0aW9uKCk7XG4gICAgdGhpcy5vcGVuV2lkZ2V0UHJvY2Vzc1N1YnNjcmlwdGlvbigpO1xuICAgIHRoaXMub3BlblNtYWxsVGl0bGVTdWJzY3JpcHRpb24oKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmJyZWFkY3J1bWJTZXJ2aWNlLmNsZWFyU2Vjb25kQnJlYWRjcnVtYigpO1xuICAgIHRoaXMucGFnZVRpdGxlU2VydmljZS5lbmFibGVSZXNldCgpO1xuICAgIHRoaXMucmVtb3ZlRG9jdW1lbnRTdHlsZSgpO1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnBhZ2VIZWFkZXJTZXJ2aWNlLmRpc2FibGVTbWFsbFRpdGxlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWxsQXNzb2NpYXRlZFByb2Nlc3NEZWZpbml0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgICB0aGlzLmRvY3VtZW50U2VydmljZS5maW5kUHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbnNGb3JEb2N1bWVudCh0aGlzLmRvY3VtZW50SWQsIHtcbiAgICAgICAgICBzdGFydGFibGVCeVVzZXI6IHRydWUsXG4gICAgICAgIH0pLFxuICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc3RyZWFtKCdrZXknKSxcbiAgICAgIF0pLnN1YnNjcmliZSgoW3Byb2Nlc3NEb2N1bWVudERlZmluaXRpb25zXSkgPT4ge1xuICAgICAgICB0aGlzLnByb2Nlc3NEb2N1bWVudERlZmluaXRpb25zID0gdGhpcy5tYXBQcm9jZXNzRG9jdW1lbnREZWZpbml0aW9ucyhcbiAgICAgICAgICBwcm9jZXNzRG9jdW1lbnREZWZpbml0aW9uc1xuICAgICAgICApO1xuICAgICAgICB0aGlzLnNldFByb2Nlc3NEcm9wZG93bldpZHRoKCk7XG5cbiAgICAgICAgdGhpcy5wcm9jZXNzRGVmaW5pdGlvbkxpc3RGaWVsZHMgPSBbXG4gICAgICAgICAge1xuICAgICAgICAgICAga2V5OiAncHJvY2Vzc05hbWUnLFxuICAgICAgICAgICAgbGFiZWw6ICdQcm9jZXMnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgc3RhcnRQcm9jZXNzKHByb2Nlc3NEb2N1bWVudERlZmluaXRpb246IFByb2Nlc3NEb2N1bWVudERlZmluaXRpb24pOiB2b2lkIHtcbiAgICB0aGlzLnN1cHBvcnRpbmdQcm9jZXNzU3RhcnQub3Blbk1vZGFsKHByb2Nlc3NEb2N1bWVudERlZmluaXRpb24sIHRoaXMuZG9jdW1lbnRJZCk7XG4gIH1cblxuICBwdWJsaWMgb3BlbldpZGdldFByb2Nlc3NTdWJzY3JpcHRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLndpZGdldHNTZXJ2aWNlLnN0YXJ0UHJvY2Vzc0V2ZW50XG4gICAgICAgIC5waXBlKHN3aXRjaE1hcCgoKSA9PiB0aGlzLndpZGdldHNTZXJ2aWNlLmFjdGl2ZVByb2Nlc3MkKSlcbiAgICAgICAgLnN1YnNjcmliZSgocHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbnM6IFByb2Nlc3NEb2N1bWVudERlZmluaXRpb25bXSkgPT4ge1xuICAgICAgICAgIHRoaXMuc3RhcnRQcm9jZXNzKHByb2Nlc3NEb2N1bWVudERlZmluaXRpb25zWzBdKTtcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGNsYWltQXNzaWduZWUoKTogdm9pZCB7XG4gICAgdGhpcy5pc0Fzc2lnbmluZyQubmV4dCh0cnVlKTtcblxuICAgIHRoaXMudXNlcklkJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIHN3aXRjaE1hcCgodXNlcklkOiBzdHJpbmcgfCB1bmRlZmluZWQpID0+XG4gICAgICAgICAgdGhpcy5kb2N1bWVudFNlcnZpY2UuYXNzaWduSGFuZGxlclRvRG9jdW1lbnQodGhpcy5kb2N1bWVudElkLCB1c2VySWQgPz8gJycpXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgdGhpcy5pc0Fzc2lnbmluZyQubmV4dChmYWxzZSk7XG4gICAgICAgICAgdGhpcy5kb3NzaWVyU2VydmljZS5yZWZyZXNoKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgdGhpcy5pc0Fzc2lnbmluZyQubmV4dChmYWxzZSk7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ1NvbWV0aGluZyB3ZW50IHdyb25nIHdoaWxlIGFzc2lnbmluZyB1c2VyIHRvIGNhc2UnKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHVuYXNzaWduQXNzaWduZWUoKTogdm9pZCB7XG4gICAgdGhpcy5pc0Fzc2lnbmluZyQubmV4dCh0cnVlKTtcblxuICAgIHRoaXMudXNlcklkJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIHN3aXRjaE1hcCgodXNlcklkOiBzdHJpbmcgfCB1bmRlZmluZWQpID0+XG4gICAgICAgICAgdGhpcy5kb2N1bWVudFNlcnZpY2UudW5hc3NpZ25IYW5kbGVyRnJvbURvY3VtZW50KHRoaXMuZG9jdW1lbnRJZClcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICB0aGlzLmlzQXNzaWduaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLmRvc3NpZXJTZXJ2aWNlLnJlZnJlc2goKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICB0aGlzLmlzQXNzaWduaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnU29tZXRoaW5nIHdlbnQgd3Jvbmcgd2hpbGUgdW5hc3NpZ25pbmcgdXNlciBmcm9tIGNhc2UnKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGRlbGV0ZURvY3VtZW50KCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0RlbGV0ZU1vZGFsJC5uZXh0KHRydWUpO1xuICB9XG5cbiAgcHVibGljIG9uQ29uZmlybURlbGV0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmlzRGVsZXRpbmckLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5kb2N1bWVudFNlcnZpY2UuZGVsZXRlRG9jdW1lbnQodGhpcy5kb2N1bWVudElkKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmlzRGVsZXRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgICB0aGlzLnNob3dEZWxldGVNb2RhbCQubmV4dChmYWxzZSk7XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtgL2Rvc3NpZXJzLyR7dGhpcy5kb2N1bWVudERlZmluaXRpb25OYW1lfWBdKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmlzRGVsZXRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnU29tZXRoaW5nIHdlbnQgd3Jvbmcgd2hpbGUgZGVsZXRpbmcgdGhlIGNhc2UnKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgb25UYXNrQ2xpY2tFdmVudCh0YXNrUHJvY2Vzc0xpbmtSZXN1bHQ6IFRhc2tXaXRoUHJvY2Vzc0xpbmspOiB2b2lkIHtcbiAgICBpZiAoIXRhc2tQcm9jZXNzTGlua1Jlc3VsdC5wcm9jZXNzTGlua0FjdGl2aXR5UmVzdWx0KSB7XG4gICAgICB0aGlzLmlzQWRtaW4kLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKGlzQWRtaW4gPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZU5vVGFza1Byb2Nlc3NMaW5rKGlzQWRtaW4pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGlzcGxheVR5cGUgPVxuICAgICAgdGFza1Byb2Nlc3NMaW5rUmVzdWx0LnByb2Nlc3NMaW5rQWN0aXZpdHlSZXN1bHQucHJvcGVydGllcy5mb3JtRGlzcGxheVR5cGUgfHxcbiAgICAgIERPU1NJRVJfREVUQUlMX0RFRkFVTFRfRElTUExBWV9UWVBFO1xuICAgIGNvbnN0IHNpemUgPVxuICAgICAgdGFza1Byb2Nlc3NMaW5rUmVzdWx0LnByb2Nlc3NMaW5rQWN0aXZpdHlSZXN1bHQucHJvcGVydGllcy5mb3JtU2l6ZSB8fFxuICAgICAgRE9TU0lFUl9ERVRBSUxfREVGQVVMVF9ESVNQTEFZX1NJWkU7XG5cbiAgICB0aGlzLmRvc3NpZXJEZXRhaWxMYXlvdXRTZXJ2aWNlLnNldEZvcm1EaXNwbGF5U2l6ZShzaXplKTtcbiAgICB0aGlzLmRvc3NpZXJEZXRhaWxMYXlvdXRTZXJ2aWNlLnNldEZvcm1EaXNwbGF5VHlwZShkaXNwbGF5VHlwZSk7XG5cbiAgICBpZiAoZGlzcGxheVR5cGUgPT09ICdwYW5lbCcgJiYgISF0aGlzLl90YXNrUGFuZWxUb2dnbGUpIHtcbiAgICAgIHRoaXMuZG9zc2llckRldGFpbExheW91dFNlcnZpY2Uuc2V0VGFza0FuZFByb2Nlc3NMaW5rT3BlbmVkSW5QYW5lbCh0YXNrUHJvY2Vzc0xpbmtSZXN1bHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wZW5UYXNrQW5kUHJvY2Vzc0xpbmtJbk1vZGFsJC5uZXh0KHsuLi50YXNrUHJvY2Vzc0xpbmtSZXN1bHR9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25UYXNrRGV0YWlsc0Nsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuZG9zc2llckRldGFpbExheW91dFNlcnZpY2Uuc2V0VGFza0FuZFByb2Nlc3NMaW5rT3BlbmVkSW5QYW5lbChudWxsKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkFjdGl2ZUNoYW5nZUV2ZW50KGV2ZW50OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5fYWN0aXZlQ2hhbmdlID0gZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgb25UYWJTZWxlY3RlZCh0YWI6IFRhYkltcGwsIGFjdGl2ZVRhYjogVGFiSW1wbCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50YWJMb2FkZXIpIHJldHVybjtcblxuICAgIGlmICghdGhpcy5fdGFic0luaXQpIHtcbiAgICAgIHRoaXMuX3RhYnNJbml0ID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9vbGRUYWJOYW1lID0gYWN0aXZlVGFiLm5hbWU7XG4gICAgdGhpcy5fcGVuZGluZ1RhYiA9IHRhYjtcbiAgICB0aGlzLl9hY3RpdmVUYWJOYW1lJC5uZXh0KHRhYi5uYW1lKTtcbiAgICB0aGlzLnBlbmRpbmdDaGFuZ2VzID1cbiAgICAgIHRhYi5jb250ZW50S2V5ID09PSAnc3VtbWFyeScgPyBmYWxzZSA6ICF0YWIuc2hvd1Rhc2tzICYmIHRoaXMuX2FjdGl2ZUNoYW5nZTtcblxuICAgIGlmICh0aGlzLnBlbmRpbmdDaGFuZ2VzKSB7XG4gICAgICB0aGlzLnRhYkxvYWRlci5yZXBsYWNlVXJsU3RhdGUodGFiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRhYi5zaG93VGFza3MpIHRoaXMub3BlblRhc2tBbmRQcm9jZXNzTGlua0luTW9kYWwkLm5leHQobnVsbCk7XG4gICAgdGhpcy50YWJMb2FkZXIubG9hZCh0YWIpO1xuICAgIHRoaXMuc2V0RG9jdW1lbnRTdHlsZSgpO1xuICB9XG5cbiAgcHVibGljIG9uRm9ybVN1Ym1pdEV2ZW50KCk6IHZvaWQge1xuICAgIHRoaXMuZG9zc2llckRldGFpbExheW91dFNlcnZpY2Uuc2V0VGFza0FuZFByb2Nlc3NMaW5rT3BlbmVkSW5QYW5lbChudWxsKTtcblxuICAgIGlmICghdGhpcy50YWJMb2FkZXIpIHJldHVybjtcbiAgICB0aGlzLnRhYkxvYWRlci5yZWZyZXNoVmlldygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQ29uZmlybVJlZGlyZWN0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50YWJMb2FkZXIgfHwgIXRoaXMuX3BlbmRpbmdUYWIpIHJldHVybjtcbiAgICB0aGlzLl9hY3RpdmVDaGFuZ2UgPSBmYWxzZTtcbiAgICB0aGlzLl9hY3RpdmVUYWJOYW1lJC5uZXh0KHRoaXMuX3BlbmRpbmdUYWIubmFtZSk7XG4gICAgdGhpcy50YWJMb2FkZXIubG9hZCh0aGlzLl9wZW5kaW5nVGFiKTtcbiAgICB0aGlzLmRvc3NpZXJEZXRhaWxMYXlvdXRTZXJ2aWNlLnNldFRhc2tBbmRQcm9jZXNzTGlua09wZW5lZEluUGFuZWwobnVsbCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25DYW5jZWxSZWRpcmVjdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGFiTG9hZGVyKSByZXR1cm47XG4gICAgdGhpcy5fYWN0aXZlVGFiTmFtZSQubmV4dCh0aGlzLl9vbGRUYWJOYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdEJyZWFkY3J1bWIoKTogdm9pZCB7XG4gICAgdGhpcy5kb2N1bWVudFNlcnZpY2VcbiAgICAgIC5nZXREb2N1bWVudERlZmluaXRpb24odGhpcy5kb2N1bWVudERlZmluaXRpb25OYW1lKVxuICAgICAgLnN1YnNjcmliZShkZWZpbml0aW9uID0+IHtcbiAgICAgICAgdGhpcy5kb2N1bWVudERlZmluaXRpb25OYW1lVGl0bGUgPSBkZWZpbml0aW9uLnNjaGVtYS50aXRsZTtcbiAgICAgICAgdGhpcy5zZXRCcmVhZGNydW1iKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFRhYkxvYWRlcigpOiB2b2lkIHtcbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLmRvc3NpZXJUYWJTZXJ2aWNlLnRhYnMkLCB0aGlzLmNhblZpZXckXSlcbiAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKChbdGFicywgY2FuVmlld10pID0+IHtcbiAgICAgICAgaWYgKGNhblZpZXcpIHtcbiAgICAgICAgICBpZiAodGFicz8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5faW5pdGlhbFRhYk5hbWUgPSB0aGlzLl9zbmFwc2hvdC5nZXQoJ3RhYicpID8/ICcnO1xuICAgICAgICAgICAgdGhpcy50YWJMb2FkZXIgPSBuZXcgVGFiTG9hZGVySW1wbChcbiAgICAgICAgICAgICAgdGFicyxcbiAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgICAgICAgICAgIHRoaXMudmlld0NvbnRhaW5lclJlZixcbiAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIsXG4gICAgICAgICAgICAgIHRoaXMucm91dGVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnRhYkxvYWRlci5pbml0aWFsKHRoaXMuX2luaXRpYWxUYWJOYW1lKTtcbiAgICAgICAgICAgIHRoaXMuZG9zc2llclRhYlNlcnZpY2Uuc2V0VGFiTG9hZGVyKHRoaXMudGFiTG9hZGVyKTtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ1RhYnMkLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVUYWIkID0gdGhpcy50YWJMb2FkZXIuYWN0aXZlVGFiJDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ub1RhYnNDb25maWd1cmVkJC5uZXh0KHRydWUpO1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nVGFicyQubmV4dChmYWxzZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5nZXRBbGxBc3NvY2lhdGVkUHJvY2Vzc0RlZmluaXRpb25zKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zaG93Tm9BY2Nlc3MkLm5leHQodHJ1ZSk7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nVGFicyQubmV4dChmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzc2lnbm1lbnRPZkRvY3VtZW50Q2hhbmdlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmRvc3NpZXJTZXJ2aWNlLnJlZnJlc2goKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q3VzdG9tRG9zc2llckhlYWRlckl0ZW0oaXRlbSk6IHZvaWQge1xuICAgIHRoaXMuY3VzdG9tRG9zc2llckhlYWRlckl0ZW1zLnB1c2goe1xuICAgICAgbGFiZWw6IGl0ZW1bJ2xhYmVsVHJhbnNsYXRpb25LZXknXSB8fCAnJyxcbiAgICAgIGNvbHVtblNpemU6IGl0ZW1bJ2NvbHVtblNpemUnXSB8fCAzLFxuICAgICAgdGV4dFNpemU6IGl0ZW1bJ3RleHRTaXplJ10gfHwgJ21kJyxcbiAgICAgIGN1c3RvbUNsYXNzOiBpdGVtWydjdXN0b21DbGFzcyddIHx8ICcnLFxuICAgICAgbW9kaWZpZXI6IGl0ZW1bJ21vZGlmaWVyJ10gfHwgJycsXG4gICAgICB2YWx1ZTogaXRlbVsncHJvcGVydHlQYXRocyddPy5yZWR1Y2UoXG4gICAgICAgIChwcmV2LCBjdXJyKSA9PiBwcmV2ICsgdGhpcy5nZXRTdHJpbmdGcm9tRG9jdW1lbnRQYXRoKGl0ZW0sIGN1cnIpLFxuICAgICAgICAnJ1xuICAgICAgKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3RyaW5nRnJvbURvY3VtZW50UGF0aChpdGVtLCBwYXRoKTogc3RyaW5nIHtcbiAgICBjb25zdCBwcmVmaXggPSBpdGVtWydwcm9wZXJ0eVBhdGhzJ10uaW5kZXhPZihwYXRoKSA+IDAgPyAnICcgOiAnJztcbiAgICBsZXQgc3RyaW5nID0gdGhpcy5nZXROZXN0ZWRQcm9wZXJ0eSh0aGlzLmRvY3VtZW50LmNvbnRlbnQsIHBhdGgsIGl0ZW1bJ25vVmFsdWVUZXh0J10pIHx8ICcnO1xuICAgIGNvbnN0IGRhdGVGb3JtYXRzID0gW21vbWVudC5JU09fODYwMSwgJ01NLURELVlZWVknLCAnREQtTU0tWVlZWScsICdZWVlZLU1NLUREJ107XG4gICAgc3dpdGNoIChpdGVtWydtb2RpZmllciddKSB7XG4gICAgICBjYXNlICdhZ2UnOiB7XG4gICAgICAgIGlmIChtb21lbnQoc3RyaW5nLCBkYXRlRm9ybWF0cywgdHJ1ZSkuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgc3RyaW5nID0gbW9tZW50KCkuZGlmZihzdHJpbmcsICd5ZWFycycpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBpZiAobW9tZW50KHN0cmluZywgZGF0ZUZvcm1hdHMsIHRydWUpLmlzVmFsaWQoKSkge1xuICAgICAgICAgIHN0cmluZyA9IG1vbWVudChzdHJpbmcpLmZvcm1hdCgnREQtTU0tWVlZWScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwcmVmaXggKyBzdHJpbmc7XG4gIH1cblxuICBwcml2YXRlIGdldE5lc3RlZFByb3BlcnR5KG9iajogYW55LCBwYXRoOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogYW55KTogYW55IHtcbiAgICByZXR1cm4gKFxuICAgICAgcGF0aC5zcGxpdCgnLicpLnJlZHVjZSgoY3VycmVudE9iamVjdCwga2V5KSA9PiBjdXJyZW50T2JqZWN0Py5ba2V5XSwgb2JqKSB8fCBkZWZhdWx0VmFsdWVcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRCcmVhZGNydW1iKCk6IHZvaWQge1xuICAgIHRoaXMuYnJlYWRjcnVtYlNlcnZpY2Uuc2V0U2Vjb25kQnJlYWRjcnVtYih7XG4gICAgICByb3V0ZTogW2AvZG9zc2llcnMvJHt0aGlzLmRvY3VtZW50RGVmaW5pdGlvbk5hbWV9YF0sXG4gICAgICBjb250ZW50OiB0aGlzLmRvY3VtZW50RGVmaW5pdGlvbk5hbWVUaXRsZSxcbiAgICAgIGhyZWY6IGAvZG9zc2llcnMvJHt0aGlzLmRvY3VtZW50RGVmaW5pdGlvbk5hbWV9YCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgb3BlbldpZHRoT2JzZXJ2ZXIoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl90YWJDb250ZW50Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQpIHJldHVybjtcblxuICAgIHRoaXMuX29ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKGV2ZW50ID0+IHtcbiAgICAgIHRoaXMub2JzZXJ2ZXJNdXRhdGlvbihldmVudCk7XG4gICAgfSk7XG4gICAgdGhpcy5fb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLl90YWJDb250ZW50Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBvYnNlcnZlck11dGF0aW9uKGV2ZW50OiBBcnJheTxSZXNpemVPYnNlcnZlckVudHJ5Pik6IHZvaWQge1xuICAgIGNvbnN0IGVsZW1lbnRXaWR0aCA9IGV2ZW50WzBdPy5ib3JkZXJCb3hTaXplWzBdPy5pbmxpbmVTaXplO1xuXG4gICAgaWYgKHR5cGVvZiBlbGVtZW50V2lkdGggPT09ICdudW1iZXInICYmIGVsZW1lbnRXaWR0aCAhPT0gMCkge1xuICAgICAgdGhpcy5kb3NzaWVyRGV0YWlsTGF5b3V0U2VydmljZS5zZXRUYWJDb250ZW50Q29udGFpbmVyV2lkdGgoZWxlbWVudFdpZHRoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldERvY3VtZW50U3R5bGUoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmh0bWxEb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaHRtbCcpWzBdLCAnaHRtbC0tZml4ZWQnKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlRG9jdW1lbnRTdHlsZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuaHRtbERvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdodG1sJylbMF0sICdodG1sLS1maXhlZCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbmFibGVSZXNldE9uQmFja05hdmlnYXRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnJvdXRlci5ldmVudHNcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKFxuICAgICAgICAgICAgZXZlbnQgPT4gZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uU3RhcnQgJiYgZXZlbnQubmF2aWdhdGlvblRyaWdnZXIgPT09ICdwb3BzdGF0ZSdcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5wYWdlVGl0bGVTZXJ2aWNlLmVuYWJsZVJlc2V0KCk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTm9UYXNrUHJvY2Vzc0xpbmsoaXNBZG1pbjogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93QWN0aW9uYWJsZSh7XG4gICAgICB0eXBlOiAnd2FybmluZycsXG4gICAgICBsb3dDb250cmFzdDogdHJ1ZSxcbiAgICAgIHRpdGxlOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnZG9zc2llci5ub0xpbmtlZFByb2Nlc3NOb3RpZmljYXRpb24nKSxcbiAgICAgIC4uLihpc0FkbWluICYmIHtcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRleHQ6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdkb3NzaWVyLmNvbmZpZ3VyZScpLFxuICAgICAgICAgICAgY2xpY2s6ICgpID0+IHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL3Byb2Nlc3MtbGlua3MnXSksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgICAgZHVyYXRpb246IENBUkJPTl9DT05TVEFOVFMubm90aWZpY2F0aW9uRHVyYXRpb24sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG1hcFByb2Nlc3NEb2N1bWVudERlZmluaXRpb25zKFxuICAgIHByb2Nlc3NEb2N1bWVudERlZmluaXRpb25zOiBQcm9jZXNzRG9jdW1lbnREZWZpbml0aW9uW11cbiAgKTogKFByb2Nlc3NEb2N1bWVudERlZmluaXRpb24gJiB7ZGlzcGxheU5hbWU6IHN0cmluZ30pW10ge1xuICAgIHJldHVybiBwcm9jZXNzRG9jdW1lbnREZWZpbml0aW9ucy5tYXAoXG4gICAgICAocHJvY2Vzc0RvY291bWVudERlZmluaXRpb246IFByb2Nlc3NEb2N1bWVudERlZmluaXRpb24pID0+ICh7XG4gICAgICAgIC4uLnByb2Nlc3NEb2NvdW1lbnREZWZpbml0aW9uLFxuICAgICAgICBkaXNwbGF5TmFtZTpcbiAgICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChwcm9jZXNzRG9jb3VtZW50RGVmaW5pdGlvbj8uaWQ/LnByb2Nlc3NEZWZpbml0aW9uS2V5KSAhPT1cbiAgICAgICAgICBwcm9jZXNzRG9jb3VtZW50RGVmaW5pdGlvbj8uaWQ/LnByb2Nlc3NEZWZpbml0aW9uS2V5XG4gICAgICAgICAgICA/IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHByb2Nlc3NEb2NvdW1lbnREZWZpbml0aW9uLmlkLnByb2Nlc3NEZWZpbml0aW9uS2V5KVxuICAgICAgICAgICAgOiBwcm9jZXNzRG9jb3VtZW50RGVmaW5pdGlvbi5wcm9jZXNzTmFtZSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0UHJvY2Vzc0Ryb3Bkb3duV2lkdGgoKTogdm9pZCB7XG4gICAgY29uc3QgbG9uZ2VzdE5hbWUgPSB0aGlzLnByb2Nlc3NEb2N1bWVudERlZmluaXRpb25zLnJlZHVjZShcbiAgICAgIChhY2MsIGN1cnIpID0+XG4gICAgICAgICEhY3Vyci5kaXNwbGF5TmFtZSAmJiBjdXJyLmRpc3BsYXlOYW1lLmxlbmd0aCA+IGFjYyA/IGN1cnIuZGlzcGxheU5hbWUubGVuZ3RoIDogYWNjLFxuICAgICAgMFxuICAgICk7XG5cbiAgICB0aGlzLmRyb3Bkb3duV2lkdGgkLm5leHQoXG4gICAgICBsb25nZXN0TmFtZSA8IDIwXG4gICAgICAgID8gRE9TU0lFUl9ERVRBSUxfU1RBUlRfUFJPQ0VTU19EUk9QRE9XTl9XSURUSC5zbWFsbFxuICAgICAgICA6IGxvbmdlc3ROYW1lIDwgNDBcbiAgICAgICAgICA/IERPU1NJRVJfREVUQUlMX1NUQVJUX1BST0NFU1NfRFJPUERPV05fV0lEVEgubWVkaXVtXG4gICAgICAgICAgOiBET1NTSUVSX0RFVEFJTF9TVEFSVF9QUk9DRVNTX0RST1BET1dOX1dJRFRILmxhcmdlXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgb3BlblNtYWxsVGl0bGVTdWJzY3JpcHRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLmhhc0Nhc2VUYWdzJCwgdGhpcy5jb21wYWN0TW9kZSRdKS5zdWJzY3JpYmUoXG4gICAgICAgIChbaGFzQ2FzZVRhZ3MsIGNvbXBhY3RNb2RlXSkgPT4ge1xuICAgICAgICAgIGlmICghY29tcGFjdE1vZGUgJiYgaGFzQ2FzZVRhZ3MpIHtcbiAgICAgICAgICAgIHRoaXMucGFnZUhlYWRlclNlcnZpY2UuZW5hYmxlU21hbGxUaXRsZSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBhZ2VIZWFkZXJTZXJ2aWNlLmRpc2FibGVTbWFsbFRpdGxlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApXG4gICAgKTtcbiAgfVxufVxuIiwiPCEtLVxuICB+IENvcHlyaWdodCAyMDE1LTIwMjQgUml0ZW5zZSBCViwgdGhlIE5ldGhlcmxhbmRzLlxuICB+XG4gIH4gTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICB+XG4gIH4gaHR0cHM6Ly9qb2ludXAuZWMuZXVyb3BhLmV1L2NvbGxlY3Rpb24vZXVwbC9ldXBsLXRleHQtZXVwbC0xMlxuICB+XG4gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBiYXNpcyxcbiAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gIC0tPlxuPGRpdlxuICBjbGFzcz1cIm1haW4tY29udGVudFwiXG4gIFtuZ0NsYXNzXT1cInsnbWFpbi1jb250ZW50LS1uby1ob3Jpem9udGFsLW92ZXJmbG93JzogdGFiSG9yaXpvbnRhbE92ZXJmbG93RGlzYWJsZWQoKX1cIlxuPlxuICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNhc2VUYWdzJCB8IGFzeW5jIGFzIGNhc2VUYWdzXCI+XG4gICAgICBAaWYgKGNhc2VUYWdzICYmIGNhc2VUYWdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhc2UtdGFnc1wiPlxuICAgICAgICAgIEBmb3IgKHRhZyBvZiBjYXNlVGFnczsgdHJhY2sgdGFnKSB7XG4gICAgICAgICAgICA8Y2RzLXRhZyBzaXplPVwic21cIiBbdHlwZV09XCJ0YWcudGFnVHlwZVwiPlxuICAgICAgICAgICAgICB7eyB0YWcudGl0bGUgfX1cbiAgICAgICAgICAgIDwvY2RzLXRhZz5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRhYnNcIj48L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy10ZW1wbGF0ZSAjdGFicz5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ7YWN0aXZlVGFiOiBhY3RpdmVUYWIkIHwgYXN5bmN9IGFzIG9ic1wiPlxuICAgICAgICA8Y2RzLXRhYnMgKm5nSWY9XCJ0YWJMb2FkZXJcIiB0eXBlPVwiaW5saW5lXCIgY2xhc3M9XCJjYXNlLWRldGFpbC10YWJzXCI+XG4gICAgICAgICAgPGNkcy10YWJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCB0YWIgb2YgdGFiTG9hZGVyLnRhYnNcIlxuICAgICAgICAgICAgW2FjdGl2ZV09XCJ0YWIubmFtZSA9PT0gKGFjdGl2ZVRhYk5hbWUkIHwgYXN5bmMpXCJcbiAgICAgICAgICAgIGhlYWRpbmc9XCJ7eyB0YWIgfCB0YWJUcmFuc2xhdGUgfCBhc3luYyB9fVwiXG4gICAgICAgICAgICAoc2VsZWN0ZWQpPVwib25UYWJTZWxlY3RlZCh0YWIsIG9icy5hY3RpdmVUYWIpXCJcbiAgICAgICAgICA+PC9jZHMtdGFiPlxuICAgICAgICA8L2Nkcy10YWJzPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8ZGl2XG4gICAgICAjdGFiQ29udGVudENvbnRhaW5lclxuICAgICAgY2xhc3M9XCJ0YWItY29udGVudC1jb250YWluZXJcIlxuICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAndGFiLWNvbnRlbnQtY29udGFpbmVyLS1kYXJrJzogaXNEYXJrTW9kZSQgfCBhc3luYyxcbiAgICAgICAgJ3RhYi1jb250ZW50LWNvbnRhaW5lci0tY29tcGFjdCc6IGNvbXBhY3RNb2RlJCB8IGFzeW5jLFxuICAgICAgfVwiXG4gICAgICAqbmdJZj1cIntcbiAgICAgICAgbm9UYWJzQ29uZmlndXJlZDogbm9UYWJzQ29uZmlndXJlZCQgfCBhc3luYyxcbiAgICAgICAgc2hvd1Rhc2tMaXN0OiBzaG93VGFza0xpc3QkIHwgYXN5bmMsXG4gICAgICAgIHNob3dOb0FjY2Vzczogc2hvd05vQWNjZXNzJCB8IGFzeW5jLFxuICAgICAgICBkb3NzaWVyRGV0YWlsTGF5b3V0OiBkb3NzaWVyRGV0YWlsTGF5b3V0JCB8IGFzeW5jLFxuICAgICAgICBvcGVuVGFza0FuZFByb2Nlc3NMaW5rSW5Nb2RhbDogb3BlblRhc2tBbmRQcm9jZXNzTGlua0luTW9kYWwkIHwgYXN5bmMsXG4gICAgICAgIHRhc2tBbmRQcm9jZXNzTGlua09wZW5lZEluUGFuZWw6IHRhc2tBbmRQcm9jZXNzTGlua09wZW5lZEluUGFuZWwkIHwgYXN5bmMsXG4gICAgICB9IGFzIHRhYkNvbnRlbnRPYnNcIlxuICAgID5cbiAgICAgIDxhcy1zcGxpdFxuICAgICAgICBkaXJlY3Rpb249XCJob3Jpem9udGFsXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIiF0YWJDb250ZW50T2JzLmRvc3NpZXJEZXRhaWxMYXlvdXQud2lkdGhBZGp1c3RhYmxlXCJcbiAgICAgICAgW2d1dHRlclNpemVdPVwiRE9TU0lFUl9ERVRBSUxfR1VUVEVSX1NJWkVcIlxuICAgICAgICBbdW5pdF09XCJ0YWJDb250ZW50T2JzLmRvc3NpZXJEZXRhaWxMYXlvdXQudW5pdFwiXG4gICAgICA+XG4gICAgICAgIDxhcy1zcGxpdC1hcmVhXG4gICAgICAgICAgW3NpemVdPVwidGFiQ29udGVudE9icy5kb3NzaWVyRGV0YWlsTGF5b3V0LmxlZnRQYW5lbFdpZHRoXCJcbiAgICAgICAgICBbbWluU2l6ZV09XCJ0YWJDb250ZW50T2JzLmRvc3NpZXJEZXRhaWxMYXlvdXQubGVmdFBhbmVsTWluV2lkdGhcIlxuICAgICAgICAgIFttYXhTaXplXT1cInRhYkNvbnRlbnRPYnMuZG9zc2llckRldGFpbExheW91dC5sZWZ0UGFuZWxNYXhXaWR0aFwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImNhcmQtYm9keSBiZy13aGl0ZSBwLTUgcG9zaXRpb24tcmVsYXRpdmUgdGFiLWNvbnRhaW5lclwiXG4gICAgICAgICAgICBbY2xhc3MudGFiLWNvbnRhaW5lci0tY29tcGFjdF09XCJjb21wYWN0TW9kZSQgfCBhc3luY1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImxvYWRpbmdUYWJzJCB8IGFzeW5jXCIgY2xhc3M9XCJsb2FkaW5nLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICA8Y2RzLWxvYWRpbmc+PC9jZHMtbG9hZGluZz5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8dmFsdGltby1uby1yZXN1bHRzXG4gICAgICAgICAgICAgICpuZ0lmPVwidGFiQ29udGVudE9icy5zaG93Tm9BY2Nlc3NcIlxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbj1cInt7ICdkb3NzaWVyLm5vQWNjZXNzLmRlc2NyaXB0aW9uJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIHRpdGxlPVwie3sgJ2Rvc3NpZXIubm9BY2Nlc3MudGl0bGUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgaWxsdXN0cmF0aW9uPVwidmFsdGltby1sYXlvdXQvaW1nL2VtcHR5c3RhdGUtbm90LWF1dGhvcmlzZWQuc3ZnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvdmFsdGltby1uby1yZXN1bHRzPlxuXG4gICAgICAgICAgICA8dmFsdGltby1uby1yZXN1bHRzXG4gICAgICAgICAgICAgICpuZ0lmPVwidGFiQ29udGVudE9icy5ub1RhYnNDb25maWd1cmVkXCJcbiAgICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXT1cIidkb3NzaWVyLnRhYnMubm9SZXN1bHRzRGVzY3JpcHRpb24nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIidkb3NzaWVyLnRhYnMubm9SZXN1bHRzJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICA+PC92YWx0aW1vLW5vLXJlc3VsdHM+XG5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjdGFiQ29udGFpbmVyPjwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGVhcmZpeFwiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2FzLXNwbGl0LWFyZWE+XG5cbiAgICAgICAgPGFzLXNwbGl0LWFyZWFcbiAgICAgICAgICAqbmdJZj1cInRhYkNvbnRlbnRPYnMuZG9zc2llckRldGFpbExheW91dC5zaG93UmlnaHRQYW5lbFwiXG4gICAgICAgICAgW3NpemVdPVwidGFiQ29udGVudE9icy5kb3NzaWVyRGV0YWlsTGF5b3V0LnJpZ2h0UGFuZWxXaWR0aFwiXG4gICAgICAgICAgW21pblNpemVdPVwidGFiQ29udGVudE9icy5kb3NzaWVyRGV0YWlsTGF5b3V0LnJpZ2h0UGFuZWxNaW5XaWR0aFwiXG4gICAgICAgICAgW21heFNpemVdPVwidGFiQ29udGVudE9icy5kb3NzaWVyRGV0YWlsTGF5b3V0LnJpZ2h0UGFuZWxNYXhXaWR0aFwiXG4gICAgICAgID5cbiAgICAgICAgICBAaWYgKHRhYkNvbnRlbnRPYnMuc2hvd1Rhc2tMaXN0KSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFzay1wYW5lbFwiPlxuICAgICAgICAgICAgICBAaWYgKCF0YWJDb250ZW50T2JzLnRhc2tBbmRQcm9jZXNzTGlua09wZW5lZEluUGFuZWwpIHtcbiAgICAgICAgICAgICAgICA8dmFsdGltby1kb3NzaWVyLWRldGFpbC10YXNrLWxpc3RcbiAgICAgICAgICAgICAgICAgIFtvcGVuVGFza0FuZFByb2Nlc3NMaW5rSW5Nb2RhbF09XCJ0YWJDb250ZW50T2JzLm9wZW5UYXNrQW5kUHJvY2Vzc0xpbmtJbk1vZGFsXCJcbiAgICAgICAgICAgICAgICAgICh0YXNrQ2xpY2tFdmVudCk9XCJvblRhc2tDbGlja0V2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgKGZvcm1TdWJtaXRFdmVudCk9XCJvbkZvcm1TdWJtaXRFdmVudCgpXCJcbiAgICAgICAgICAgICAgICA+PC92YWx0aW1vLWRvc3NpZXItZGV0YWlsLXRhc2stbGlzdD5cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIEBpZiAodGFiQ29udGVudE9icy50YXNrQW5kUHJvY2Vzc0xpbmtPcGVuZWRJblBhbmVsKSB7XG4gICAgICAgICAgICAgICAgPHZhbHRpbW8tZG9zc2llci1kZXRhaWwtdGFzay1kZXRhaWxcbiAgICAgICAgICAgICAgICAgIFt0YXNrQW5kUHJvY2Vzc0xpbmtdPVwidGFiQ29udGVudE9icy50YXNrQW5kUHJvY2Vzc0xpbmtPcGVuZWRJblBhbmVsXCJcbiAgICAgICAgICAgICAgICAgIChhY3RpdmVDaGFuZ2UpPVwib25BY3RpdmVDaGFuZ2VFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIChjbG9zZUV2ZW50KT1cIm9uVGFza0RldGFpbHNDbG9zZSgpXCJcbiAgICAgICAgICAgICAgICAgIChmb3JtU3VibWl0KT1cIm9uRm9ybVN1Ym1pdEV2ZW50KClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8L3ZhbHRpbW8tZG9zc2llci1kZXRhaWwtdGFzay1kZXRhaWw+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9hcy1zcGxpdC1hcmVhPlxuICAgICAgPC9hcy1zcGxpdD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPHZhbHRpbW8tZG9zc2llci1zdXBwb3J0aW5nLXByb2Nlc3Mtc3RhcnQtbW9kYWxcbiAgICBbaXNBZG1pbl09XCJpc0FkbWluJCB8IGFzeW5jXCJcbiAgICAoZm9ybVN1Ym1pdCk9XCJ0YWJMb2FkZXIucmVmcmVzaFZpZXcoKVwiXG4gICAgI3N1cHBvcnRpbmdQcm9jZXNzU3RhcnRNb2RhbFxuICA+PC92YWx0aW1vLWRvc3NpZXItc3VwcG9ydGluZy1wcm9jZXNzLXN0YXJ0LW1vZGFsPlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZVxuICAjY2FzZURldGFpbEhlYWRlclxuICBsZXQtY2FuSGF2ZUFzc2lnbmVlPVwiY2FuSGF2ZUFzc2lnbmVlXCJcbiAgbGV0LWRvY3VtZW50PVwiZG9jdW1lbnRcIlxuICBsZXQtY2FuQXNzaWduPVwiY2FuQXNzaWduXCJcbj5cbiAgPGRpdiBjbGFzcz1cInJvd1wiICpuZ0lmPVwiKGN1c3RvbURvc3NpZXJIZWFkZXJJdGVtcyB8fCBbXSkubGVuZ3RoID4gMFwiPlxuICAgIDxzcGFuXG4gICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBjdXN0b21Eb3NzaWVySGVhZGVySXRlbXNcIlxuICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICBoMTogaXRlbS50ZXh0U2l6ZSA9PT0gJ3hsJyxcbiAgICAgICAgaDI6IGl0ZW0udGV4dFNpemUgPT09ICdsZycsXG4gICAgICAgIGgzOiBpdGVtLnRleHRTaXplID09PSAnbWQnLFxuICAgICAgICBoNDogaXRlbS50ZXh0U2l6ZSA9PT0gJ3NtJyxcbiAgICAgICAgaDU6IGl0ZW0udGV4dFNpemUgPT09ICd4cycsXG4gICAgICB9XCJcbiAgICAgIGNsYXNzPVwibWItMCBtdC0wIGFsaWduLXNlbGYtZW5kIGNvbC14bC17eyBpdGVtLmNvbHVtblNpemUgfX0gY29sLWxnLXt7XG4gICAgICAgIGl0ZW0uY29sdW1uU2l6ZSAqIDJcbiAgICAgIH19IHt7IGl0ZW0uY3VzdG9tQ2xhc3MgfX1cIlxuICAgID5cbiAgICAgIDxzcGFuICpuZ0lmPVwiaXRlbS5sYWJlbFwiPnt7IGl0ZW0ubGFiZWwgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG5cbiAgICAgIDxzcGFuICpuZ0lmPVwiaXRlbS5sYWJlbCAmJiBpdGVtLnZhbHVlXCI+OiA8L3NwYW4+XG5cbiAgICAgIDxzdHJvbmc+e3sgaXRlbS52YWx1ZSB9fTwvc3Ryb25nPlxuICAgIDwvc3Bhbj5cbiAgPC9kaXY+XG5cbiAgPG5nLWNvbnRhaW5lclxuICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICBjYXNlRGV0YWlsQXNzaWduZWU7XG4gICAgICBjb250ZXh0OiB7Y2FuSGF2ZUFzc2lnbmVlOiBjYW5IYXZlQXNzaWduZWUsIGRvY3VtZW50OiBkb2N1bWVudCwgY2FuQXNzaWduOiBjYW5Bc3NpZ259XG4gICAgXCJcbiAgPjwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlXG4gICNjYXNlRGV0YWlsQXNzaWduZWVcbiAgbGV0LWNhbkhhdmVBc3NpZ25lZT1cImNhbkhhdmVBc3NpZ25lZVwiXG4gIGxldC1kb2N1bWVudD1cImRvY3VtZW50XCJcbiAgbGV0LWNhbkFzc2lnbj1cImNhbkFzc2lnblwiXG4+XG4gIDxkaXYgKm5nSWY9XCJjYW5IYXZlQXNzaWduZWUgJiYgZG9jdW1lbnRcIj5cbiAgICA8dmFsdGltby1kb3NzaWVyLWFzc2lnbi11c2VyXG4gICAgICAqbmdJZj1cImNhbkFzc2lnbkxvYWRlZCQgfCBhc3luY1wiXG4gICAgICBbYXNzaWduZWVGdWxsTmFtZV09XCJkb2N1bWVudD8uYXNzaWduZWVGdWxsTmFtZVwiXG4gICAgICBbYXNzaWduZWVJZF09XCJkb2N1bWVudC5hc3NpZ25lZUlkXCJcbiAgICAgIFtkb2N1bWVudElkXT1cImRvY3VtZW50LmlkXCJcbiAgICAgIFtoYXNQZXJtaXNzaW9uXT1cImNhbkFzc2lnblwiXG4gICAgICAoYXNzaWdubWVudE9mRG9jdW1lbnRDaGFuZ2VkKT1cImFzc2lnbm1lbnRPZkRvY3VtZW50Q2hhbmdlZCgpXCJcbiAgICA+PC92YWx0aW1vLWRvc3NpZXItYXNzaWduLXVzZXI+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNjbGFpbUJ1dHRvbiBsZXQtY2FuQ2xhaW09XCJjYW5DbGFpbVwiIGxldC1jYW5IYXZlQXNzaWduZWU9XCJjYW5IYXZlQXNzaWduZWVcIj5cbiAgPGNkcy1vdmVyZmxvdy1tZW51LW9wdGlvblxuICAgICpuZ0lmPVwiY2FuQ2xhaW0gJiYgY2FuSGF2ZUFzc2lnbmVlXCJcbiAgICBbZGlzYWJsZWRdPVwiKGlzQXNzaWduaW5nJCB8IGFzeW5jKSB8fCAoaXNBc3NpZ25lZFRvQ3VycmVudFVzZXIkIHwgYXN5bmMpXCJcbiAgICAoY2xpY2spPVwiY2xhaW1Bc3NpZ25lZSgpXCJcbiAgPlxuICAgIHt7ICdkb3NzaWVyLmNsYWltQXNzaWduZWVDYXNlJyB8IHRyYW5zbGF0ZSB9fVxuICA8L2Nkcy1vdmVyZmxvdy1tZW51LW9wdGlvbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjdW5hc3NpZ25CdXR0b24gbGV0LWNhbkhhdmVBc3NpZ25lZT1cImNhbkhhdmVBc3NpZ25lZVwiIGxldC1hc3NpZ25lZUlkPVwiYXNzaWduZWVJZFwiPlxuICA8Y2RzLW92ZXJmbG93LW1lbnUtb3B0aW9uXG4gICAgKm5nSWY9XCJjYW5IYXZlQXNzaWduZWVcIlxuICAgIFtkaXNhYmxlZF09XCIhYXNzaWduZWVJZFwiXG4gICAgKHNlbGVjdGVkKT1cInVuYXNzaWduQXNzaWduZWUoKVwiXG4gID5cbiAgICB7eyAnYXNzaWduRG9jdW1lbnQucmVtb3ZlJyB8IHRyYW5zbGF0ZSB9fVxuICA8L2Nkcy1vdmVyZmxvdy1tZW51LW9wdGlvbj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVsZXRlQnV0dG9uIGxldC1jYW5EZWxldGU9XCJjYW5EZWxldGVcIj5cbiAgPGNkcy1vdmVyZmxvdy1tZW51LW9wdGlvblxuICAgICpuZ0lmPVwiY2FuRGVsZXRlXCJcbiAgICBbZGlzYWJsZWRdPVwiaXNEZWxldGluZyQgfCBhc3luY1wiXG4gICAgKGNsaWNrKT1cImRlbGV0ZURvY3VtZW50KClcIlxuICAgIHR5cGU9XCJkYW5nZXJcIlxuICA+XG4gICAge3sgJ2Rvc3NpZXIuZGVsZXRlLmRlbGV0ZScgfCB0cmFuc2xhdGUgfX1cbiAgPC9jZHMtb3ZlcmZsb3ctbWVudS1vcHRpb24+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2N1c3RvbVN0YXJ0VHJpZ2dlcj5cbiAgPGJ1dHRvblxuICAgIFtzaXplXT1cIihjb21wYWN0TW9kZSQgfCBhc3luYykgPyAnc20nIDogJ2xnJ1wiXG4gICAgY2RzQnV0dG9uPVwicHJpbWFyeVwiXG4gICAgW2Rpc2FibGVkXT1cInByb2Nlc3NEb2N1bWVudERlZmluaXRpb25zLmxlbmd0aCA9PT0gMFwiXG4gICAgW25nYlRvb2x0aXBdPVwicHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbnMubGVuZ3RoID09PSAwID8gJ05vIGFjdGlvbicgOiBudWxsXCJcbiAgPlxuICAgIHt7ICdkb3NzaWVyLnN0YXJ0U3ViUHJvY2VzcycgfCB0cmFuc2xhdGUgfX1cblxuICAgIDxzdmcgY2xhc3M9XCJjZHMtLWJ0bl9faWNvblwiIGNkc0ljb249XCJjaGV2cm9uLS1kb3duXCIgc2l6ZT1cIjE2XCI+PC9zdmc+XG4gIDwvYnV0dG9uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPHZhbHRpbW8tY29uZmlybWF0aW9uLW1vZGFsXG4gIGNvbmZpcm1CdXR0b25UZXh0VHJhbnNsYXRpb25LZXk9XCJkb3NzaWVyLmRlbGV0ZS5jb25maXJtXCJcbiAgY29uZmlybUJ1dHRvblR5cGU9XCJkYW5nZXJcIlxuICBjb250ZW50VHJhbnNsYXRpb25LZXk9XCJkb3NzaWVyLmRlbGV0ZS5kZXNjcmlwdGlvblwiXG4gIFtzaG93TW9kYWxTdWJqZWN0JF09XCJzaG93RGVsZXRlTW9kYWwkXCJcbiAgdGl0bGVUcmFuc2xhdGlvbktleT1cImRvc3NpZXIuZGVsZXRlLmRlbGV0ZVwiXG4gIChjb25maXJtRXZlbnQpPVwib25Db25maXJtRGVsZXRlKClcIlxuPjwvdmFsdGltby1jb25maXJtYXRpb24tbW9kYWw+XG5cbjxuZy1jb250YWluZXIgcmVuZGVySW5QYWdlSGVhZGVyIFtmdWxsV2lkdGhdPVwidHJ1ZVwiPlxuICA8bmctdGVtcGxhdGU+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJkb3NzaWVyLWFjdGlvbnNcIlxuICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAnZG9zc2llci1hY3Rpb25zLS1jb21wYWN0JzogY29tcGFjdE1vZGUkIHwgYXN5bmMsXG4gICAgICAgICdkb3NzaWVyLWFjdGlvbnMtLXNtYWxsLXRpdGxlJzogc21hbGxUaXRsZSQgfCBhc3luYyxcbiAgICAgIH1cIlxuICAgICAgKm5nSWY9XCJ7XG4gICAgICAgIGFzc2lnbmVlSWQ6IGFzc2lnbmVlSWQkIHwgYXN5bmMsXG4gICAgICAgIGNhbkFzc2lnbjogY2FuQXNzaWduJCB8IGFzeW5jLFxuICAgICAgICBjYW5DbGFpbTogY2FuQ2xhaW0kIHwgYXN5bmMsXG4gICAgICAgIGNhbkhhdmVBc3NpZ25lZTogY2FuSGF2ZUFzc2lnbmVlJCB8IGFzeW5jLFxuICAgICAgICBjYW5EZWxldGU6IGNhbkRlbGV0ZSQgfCBhc3luYyxcbiAgICAgICAgZG9jdW1lbnQ6IGRvY3VtZW50JCB8IGFzeW5jLFxuICAgICAgICBjYXNlU3RhdHVzOiBjYXNlU3RhdHVzJCB8IGFzeW5jLFxuICAgICAgfSBhcyBvYnNcIlxuICAgID5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJkb3NzaWVyLXN0YXR1cy1hc3NpZ24tY3VzdG9tLXRpdGxlXCJcbiAgICAgICAgW25nQ2xhc3NdPVwieyctLWNvbXBhY3QnOiBjb21wYWN0TW9kZSQgfCBhc3luY31cIlxuICAgICAgPlxuICAgICAgICBAaWYgKG9icy5jYXNlU3RhdHVzKSB7XG4gICAgICAgICAgPGNkcy10YWcgc2l6ZT1cInNtXCIgW3R5cGVdPVwib2JzLmNhc2VTdGF0dXMudGFnVHlwZVwiIFt0aXRsZV09XCJvYnMuY2FzZVN0YXR1cy50aXRsZVwiPnt7XG4gICAgICAgICAgICBvYnMuY2FzZVN0YXR1cy50aXRsZVxuICAgICAgICAgIH19PC9jZHMtdGFnPlxuICAgICAgICB9XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRvc3NpZXItYXNzaWduLXVzZXJcIiBbbmdDbGFzc109XCJ7Jy0tY29tcGFjdCc6IGNvbXBhY3RNb2RlJCB8IGFzeW5jfVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgIGNhc2VEZXRhaWxBc3NpZ25lZTtcbiAgICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAgIGNhbkhhdmVBc3NpZ25lZTogb2JzLmNhbkhhdmVBc3NpZ25lZSxcbiAgICAgICAgICAgICAgICBkb2N1bWVudDogb2JzLmRvY3VtZW50LFxuICAgICAgICAgICAgICAgIGNhbkFzc2lnbjogb2JzLmNhbkFzc2lnbixcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjYXNlRGV0YWlsSGVhZGVyXCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvbnMtY29udGFpbmVyXCI+XG4gICAgICAgIDxjZHMtb3ZlcmZsb3ctbWVudVxuICAgICAgICAgIFtuZ0NsYXNzXT1cInsnLS1jb21wYWN0JzogY29tcGFjdE1vZGUkIHwgYXN5bmN9XCJcbiAgICAgICAgICAqbmdJZj1cIm9icy5jYW5IYXZlQXNzaWduZWUgfHwgb2JzLmNhbkRlbGV0ZVwiXG4gICAgICAgICAgZmxpcD1cInRydWVcIlxuICAgICAgICAgIFtvZmZzZXRdPVwiKGNvbXBhY3RNb2RlJCB8IGFzeW5jKSA/IHt5OiA0OCwgeDogLTR9IDoge3k6IDQ4LCB4OiA0fVwiXG4gICAgICAgICAgY2xhc3M9XCJvdmVyZmxvdy1idXR0b24gYXNzaWduLW92ZXJmbG93XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgIGNsYWltQnV0dG9uO1xuICAgICAgICAgICAgICBjb250ZXh0OiB7Y2FuQ2xhaW06IG9icy5jYW5DbGFpbSwgY2FuSGF2ZUFzc2lnbmVlOiBvYnMuY2FuSGF2ZUFzc2lnbmVlfVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgdW5hc3NpZ25CdXR0b247XG4gICAgICAgICAgICAgIGNvbnRleHQ6IHtjYW5IYXZlQXNzaWduZWU6IG9icy5jYW5IYXZlQXNzaWduZWUsIGFzc2lnbmVlSWQ6IG9icy5hc3NpZ25lZUlkfVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRlbGV0ZUJ1dHRvbjsgY29udGV4dDoge2NhbkRlbGV0ZTogb2JzLmNhbkRlbGV0ZX1cIj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9jZHMtb3ZlcmZsb3ctbWVudT5cblxuICAgICAgICA8Y2RzLW92ZXJmbG93LW1lbnVcbiAgICAgICAgICB2YWx0aW1vQ2RzT3ZlcmZsb3dCdXR0b25cbiAgICAgICAgICBbbmdDbGFzc109XCJ7Jy0tY29tcGFjdCc6IGNvbXBhY3RNb2RlJCB8IGFzeW5jfVwiXG4gICAgICAgICAgW3dpZHRoXT1cImRyb3Bkb3duV2lkdGgkIHwgYXN5bmNcIlxuICAgICAgICAgIFtjdXN0b21UcmlnZ2VyXT1cImN1c3RvbVN0YXJ0VHJpZ2dlclwiXG4gICAgICAgICAgW29mZnNldF09XCJ7eTogNDgsIHg6IDM1fVwiXG4gICAgICAgICAgY2xhc3M9XCJvdmVyZmxvdy1idXR0b24gY2FzZS1kZXRhaWwtb3ZlcmZsb3dcIlxuICAgICAgICA+XG4gICAgICAgICAgPGNkcy1vdmVyZmxvdy1tZW51LW9wdGlvblxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IHByb2Nlc3NEb2N1bWVudERlZmluaXRpb24gb2YgcHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbnNcIlxuICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwicHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbi5kaXNwbGF5TmFtZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwic3RhcnRQcm9jZXNzKHByb2Nlc3NEb2N1bWVudERlZmluaXRpb24pXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBwcm9jZXNzRG9jdW1lbnREZWZpbml0aW9uLmRpc3BsYXlOYW1lIH19XG4gICAgICAgICAgPC9jZHMtb3ZlcmZsb3ctbWVudS1vcHRpb24+XG4gICAgICAgIDwvY2RzLW92ZXJmbG93LW1lbnU+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvbmctY29udGFpbmVyPlxuIl19