@alfresco/adf-process-services-cloud 8.1.0-16500060130 → 8.1.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.
- package/bundles/assets/adf-process-services-cloud/i18n/de.json +0 -3
- package/bundles/assets/adf-process-services-cloud/i18n/es.json +0 -3
- package/bundles/assets/adf-process-services-cloud/i18n/fr.json +0 -3
- package/bundles/assets/adf-process-services-cloud/i18n/it.json +0 -3
- package/bundles/assets/adf-process-services-cloud/i18n/pl.json +0 -3
- package/bundles/assets/adf-process-services-cloud/i18n/pt.json +0 -3
- package/fesm2022/adf-process-services-cloud.mjs +490 -410
- package/fesm2022/adf-process-services-cloud.mjs.map +1 -1
- package/lib/app/services/apps-process-cloud.service.d.ts +2 -2
- package/lib/form/components/widgets/display-rich-text/display-rich-text.widget.scss +0 -1
- package/lib/process/start-process/components/start-process-cloud.component.d.ts +0 -1
- package/lib/process/start-process/components/start-process-cloud.component.scss +4 -0
- package/lib/process/start-process/services/start-process-cloud.service.d.ts +1 -0
- package/lib/process-services-cloud.module.d.ts +2 -1
- package/lib/screen/components/screen-cloud/screen-cloud.component.d.ts +1 -1
- package/lib/screen/public-api.d.ts +3 -1
- package/lib/screen/services/provide-screen.d.ts +37 -0
- package/lib/{services → screen/services}/screen-rendering.service.d.ts +29 -0
- package/lib/services/public-api.d.ts +0 -1
- package/lib/task/task-filters/components/base-task-filters-cloud.component.d.ts +1 -1
- package/lib/task/task-filters/components/edit-task-filters/base-edit-task-filter-cloud.component.d.ts +1 -1
- package/lib/task/task-list/components/base-task-list-cloud.component.d.ts +1 -1
- package/package.json +4 -6
- package/esm2022/adf-process-services-cloud.mjs +0 -5
- package/esm2022/lib/app/app-list-cloud.module.mjs +0 -20
- package/esm2022/lib/app/components/app-details-cloud/app-details-cloud.component.mjs +0 -67
- package/esm2022/lib/app/components/app-list-cloud/app-list-cloud.component.mjs +0 -125
- package/esm2022/lib/app/models/application-instance.model.mjs +0 -24
- package/esm2022/lib/app/public-api.mjs +0 -22
- package/esm2022/lib/app/services/apps-process-cloud.service.mjs +0 -97
- package/esm2022/lib/common/date-range-filter/date-range-filter.component.mjs +0 -163
- package/esm2022/lib/common/date-range-filter/date-range-filter.service.mjs +0 -97
- package/esm2022/lib/common/index.mjs +0 -18
- package/esm2022/lib/common/interface/environment.interface.mjs +0 -18
- package/esm2022/lib/common/interface/index.mjs +0 -18
- package/esm2022/lib/common/interface/public-api.mjs +0 -18
- package/esm2022/lib/common/public-api.mjs +0 -19
- package/esm2022/lib/form/components/cloud-form-rendering.service.mjs +0 -57
- package/esm2022/lib/form/components/form-cloud-custom-outcomes.component.mjs +0 -31
- package/esm2022/lib/form/components/form-cloud.component.mjs +0 -420
- package/esm2022/lib/form/components/form-definition-selector-cloud.component.mjs +0 -53
- package/esm2022/lib/form/components/spinner/form-spinner.component.mjs +0 -35
- package/esm2022/lib/form/components/widgets/attach-file/attach-file-cloud-widget.component.mjs +0 -249
- package/esm2022/lib/form/components/widgets/attach-file/file-properties-table/file-properties-table-cloud.component.mjs +0 -136
- package/esm2022/lib/form/components/widgets/data-table/data-table-adapter.widget.mjs +0 -107
- package/esm2022/lib/form/components/widgets/data-table/data-table.widget.mjs +0 -120
- package/esm2022/lib/form/components/widgets/data-table/helpers/data-table-path-parser.helper.mjs +0 -122
- package/esm2022/lib/form/components/widgets/date/date-cloud.widget.mjs +0 -189
- package/esm2022/lib/form/components/widgets/display-external-property/display-external-property.widget.mjs +0 -85
- package/esm2022/lib/form/components/widgets/display-rich-text/display-rich-text.widget.mjs +0 -80
- package/esm2022/lib/form/components/widgets/dropdown/dropdown-cloud.widget.mjs +0 -464
- package/esm2022/lib/form/components/widgets/dropdown/validators.mjs +0 -29
- package/esm2022/lib/form/components/widgets/file-viewer/file-viewer.widget.mjs +0 -46
- package/esm2022/lib/form/components/widgets/group/group-cloud.widget.mjs +0 -82
- package/esm2022/lib/form/components/widgets/people/people-cloud.widget.mjs +0 -91
- package/esm2022/lib/form/components/widgets/properties-viewer/properties-viewer-wrapper/properties-viewer-wrapper.component.mjs +0 -81
- package/esm2022/lib/form/components/widgets/properties-viewer/properties-viewer.widget.mjs +0 -53
- package/esm2022/lib/form/components/widgets/radio-buttons/radio-buttons-cloud.schema.mjs +0 -86
- package/esm2022/lib/form/components/widgets/radio-buttons/radio-buttons-cloud.widget.mjs +0 -116
- package/esm2022/lib/form/components/widgets/upload/upload-cloud.widget.mjs +0 -187
- package/esm2022/lib/form/form-cloud.module.mjs +0 -99
- package/esm2022/lib/form/models/form-cloud-representation.model.mjs +0 -48
- package/esm2022/lib/form/models/task-variable-cloud.model.mjs +0 -28
- package/esm2022/lib/form/public-api.mjs +0 -44
- package/esm2022/lib/form/services/content-cloud-node-selector.service.mjs +0 -120
- package/esm2022/lib/form/services/display-mode.service.mjs +0 -146
- package/esm2022/lib/form/services/form-cloud.service.interface.mjs +0 -18
- package/esm2022/lib/form/services/form-cloud.service.mjs +0 -201
- package/esm2022/lib/form/services/form-definition-selector-cloud.service.interface.mjs +0 -18
- package/esm2022/lib/form/services/form-definition-selector-cloud.service.mjs +0 -51
- package/esm2022/lib/form/services/form-utils.service.mjs +0 -37
- package/esm2022/lib/form/services/process-cloud-content.service.mjs +0 -71
- package/esm2022/lib/form/services/spinner/form-cloud-spinner.service.mjs +0 -52
- package/esm2022/lib/group/components/group-cloud.component.mjs +0 -423
- package/esm2022/lib/group/group-cloud.module.mjs +0 -33
- package/esm2022/lib/group/models/identity-group.model.mjs +0 -18
- package/esm2022/lib/group/public-api.mjs +0 -21
- package/esm2022/lib/group/services/identity-group.service.mjs +0 -89
- package/esm2022/lib/models/application-version.model.mjs +0 -21
- package/esm2022/lib/models/constant-values.type.mjs +0 -18
- package/esm2022/lib/models/data-column-custom-data.mjs +0 -18
- package/esm2022/lib/models/date-cloud-filter.model.mjs +0 -31
- package/esm2022/lib/models/date-format-cloud.model.mjs +0 -18
- package/esm2022/lib/models/engine-event-cloud.model.mjs +0 -18
- package/esm2022/lib/models/filter-cloud-model.mjs +0 -128
- package/esm2022/lib/models/process-definition-cloud.model.mjs +0 -32
- package/esm2022/lib/models/process-instance-variable.model.mjs +0 -18
- package/esm2022/lib/models/process-variable-filter.model.mjs +0 -18
- package/esm2022/lib/models/task-cloud.model.mjs +0 -23
- package/esm2022/lib/models/task-list-sorting.model.mjs +0 -40
- package/esm2022/lib/models/variable-definition.mjs +0 -18
- package/esm2022/lib/people/components/people-cloud.component.mjs +0 -498
- package/esm2022/lib/people/models/identity-user.model.mjs +0 -18
- package/esm2022/lib/people/people-cloud.module.mjs +0 -33
- package/esm2022/lib/people/public-api.mjs +0 -21
- package/esm2022/lib/people/services/identity-user.service.mjs +0 -119
- package/esm2022/lib/process/process-cloud.module.mjs +0 -40
- package/esm2022/lib/process/process-filters/components/edit-process-filter/edit-process-filter-cloud.component.mjs +0 -801
- package/esm2022/lib/process/process-filters/components/process-filter-dialog/process-filter-dialog-cloud.component.mjs +0 -58
- package/esm2022/lib/process/process-filters/components/process-filters/process-filters-cloud.component.mjs +0 -292
- package/esm2022/lib/process/process-filters/models/process-filter-cloud.model.mjs +0 -170
- package/esm2022/lib/process/process-filters/process-filters-cloud.module.mjs +0 -44
- package/esm2022/lib/process/process-filters/public-api.mjs +0 -23
- package/esm2022/lib/process/process-filters/services/process-filter-cloud.service.mjs +0 -408
- package/esm2022/lib/process/process-header/components/process-header-cloud.component.mjs +0 -137
- package/esm2022/lib/process/process-header/process-header-cloud.module.mjs +0 -33
- package/esm2022/lib/process/process-header/public-api.mjs +0 -19
- package/esm2022/lib/process/process-list/components/process-list-cloud.component.mjs +0 -593
- package/esm2022/lib/process/process-list/datatable/process-list-datatable-adapter.mjs +0 -31
- package/esm2022/lib/process/process-list/models/perocess-instance-cloud-view.model.mjs +0 -18
- package/esm2022/lib/process/process-list/models/process-cloud-preferences.mjs +0 -24
- package/esm2022/lib/process/process-list/models/process-cloud-preset.model.mjs +0 -37
- package/esm2022/lib/process/process-list/models/process-cloud-query-request.model.mjs +0 -107
- package/esm2022/lib/process/process-list/models/process-list-sorting.model.mjs +0 -40
- package/esm2022/lib/process/process-list/process-list-cloud.module.mjs +0 -45
- package/esm2022/lib/process/process-list/public-api.mjs +0 -25
- package/esm2022/lib/process/process-list/services/process-list-cloud.service.mjs +0 -253
- package/esm2022/lib/process/process-list/services/process-task-list-cloud.service.mjs +0 -109
- package/esm2022/lib/process/public-api.mjs +0 -23
- package/esm2022/lib/process/services/process-cloud.service.mjs +0 -105
- package/esm2022/lib/process/start-process/components/start-process-cloud.component.mjs +0 -465
- package/esm2022/lib/process/start-process/models/process-instance-cloud.model.mjs +0 -18
- package/esm2022/lib/process/start-process/models/process-payload-cloud.model.mjs +0 -26
- package/esm2022/lib/process/start-process/models/process-with-form-payload-cloud.model.mjs +0 -26
- package/esm2022/lib/process/start-process/public-api.mjs +0 -21
- package/esm2022/lib/process/start-process/services/start-process-cloud.service.mjs +0 -125
- package/esm2022/lib/process-services-cloud.module.mjs +0 -98
- package/esm2022/lib/providers.mjs +0 -45
- package/esm2022/lib/screen/components/screen-cloud/screen-cloud.component.mjs +0 -186
- package/esm2022/lib/screen/models/screen-cloud.model.mjs +0 -18
- package/esm2022/lib/screen/public-api.mjs +0 -18
- package/esm2022/lib/services/base-cloud.service.mjs +0 -83
- package/esm2022/lib/services/cloud-token.service.mjs +0 -23
- package/esm2022/lib/services/form-fields.interfaces.mjs +0 -55
- package/esm2022/lib/services/local-preference-cloud.service.mjs +0 -122
- package/esm2022/lib/services/notification-cloud.service.mjs +0 -45
- package/esm2022/lib/services/preference-cloud.interface.mjs +0 -18
- package/esm2022/lib/services/public-api.mjs +0 -28
- package/esm2022/lib/services/screen-rendering.service.mjs +0 -30
- package/esm2022/lib/services/task-list-cloud.service.interface.mjs +0 -18
- package/esm2022/lib/services/user-preference-cloud.service.mjs +0 -105
- package/esm2022/lib/services/variable-mapper.sevice.mjs +0 -77
- package/esm2022/lib/services/web-socket.service.mjs +0 -146
- package/esm2022/lib/task/models/start-task-cloud-request.model.mjs +0 -32
- package/esm2022/lib/task/models/task-details-cloud.model.mjs +0 -26
- package/esm2022/lib/task/models/task.model.mjs +0 -23
- package/esm2022/lib/task/public-api.mjs +0 -26
- package/esm2022/lib/task/services/task-cloud.service.mjs +0 -272
- package/esm2022/lib/task/task-cloud.module.mjs +0 -45
- package/esm2022/lib/task/task-filters/components/base-task-filters-cloud.component.mjs +0 -59
- package/esm2022/lib/task/task-filters/components/edit-task-filters/base-edit-task-filter-cloud.component.mjs +0 -467
- package/esm2022/lib/task/task-filters/components/edit-task-filters/edit-service-task-filter/edit-service-task-filter-cloud.component.mjs +0 -205
- package/esm2022/lib/task/task-filters/components/edit-task-filters/edit-task-filter/edit-task-filter-cloud.component.mjs +0 -317
- package/esm2022/lib/task/task-filters/components/service-task-filters/service-task-filters-cloud.component.mjs +0 -146
- package/esm2022/lib/task/task-filters/components/task-assignment-filter/task-assignment-filter.component.mjs +0 -142
- package/esm2022/lib/task/task-filters/components/task-filter-dialog/task-filter-dialog-cloud.component.mjs +0 -72
- package/esm2022/lib/task/task-filters/components/task-filters/task-filters-cloud.component.mjs +0 -255
- package/esm2022/lib/task/task-filters/models/filter-cloud.model.mjs +0 -207
- package/esm2022/lib/task/task-filters/public-api.mjs +0 -27
- package/esm2022/lib/task/task-filters/services/service-task-filter-cloud.service.mjs +0 -283
- package/esm2022/lib/task/task-filters/services/task-filter-cloud.service.mjs +0 -392
- package/esm2022/lib/task/task-filters/task-filters-cloud.module.mjs +0 -56
- package/esm2022/lib/task/task-form/components/task-form-cloud/task-form-cloud.component.mjs +0 -231
- package/esm2022/lib/task/task-form/components/user-task-cloud/complete-task/complete-task.directive.mjs +0 -89
- package/esm2022/lib/task/task-form/components/user-task-cloud/user-task-cloud.component.mjs +0 -309
- package/esm2022/lib/task/task-form/components/user-task-cloud-buttons/claim-task/claim-task-cloud.directive.mjs +0 -101
- package/esm2022/lib/task/task-form/components/user-task-cloud-buttons/unclaim-task/unclaim-task-cloud.directive.mjs +0 -87
- package/esm2022/lib/task/task-form/components/user-task-cloud-buttons/user-task-cloud-buttons.component.mjs +0 -85
- package/esm2022/lib/task/task-form/public-api.mjs +0 -21
- package/esm2022/lib/task/task-form/task-form.module.mjs +0 -36
- package/esm2022/lib/task/task-header/components/task-header-cloud.component.mjs +0 -280
- package/esm2022/lib/task/task-header/public-api.mjs +0 -19
- package/esm2022/lib/task/task-header/task-header-cloud.module.mjs +0 -33
- package/esm2022/lib/task/task-list/components/base-task-list-cloud.component.mjs +0 -331
- package/esm2022/lib/task/task-list/components/service-task-list/service-task-list-cloud.component.mjs +0 -115
- package/esm2022/lib/task/task-list/components/task-list/datatable/task-list-datatable-adapter.mjs +0 -31
- package/esm2022/lib/task/task-list/components/task-list/task-list-cloud.component.mjs +0 -389
- package/esm2022/lib/task/task-list/models/service-task-cloud.model.mjs +0 -18
- package/esm2022/lib/task/task-list/models/task-cloud-view.model.mjs +0 -18
- package/esm2022/lib/task/task-list/public-api.mjs +0 -23
- package/esm2022/lib/task/task-list/services/service-task-list-cloud.service.mjs +0 -115
- package/esm2022/lib/task/task-list/services/task-list-cloud.service.mjs +0 -178
- package/esm2022/lib/task/task-list/task-list-cloud.module.mjs +0 -35
- package/esm2022/lib/types.mjs +0 -18
- package/esm2022/public-api.mjs +0 -40
- /package/lib/screen/{models → components/screen-cloud}/screen-cloud.model.d.ts +0 -0
|
@@ -1,801 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved.
|
|
4
|
-
*
|
|
5
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
-
* you may not use this file except in compliance with the License.
|
|
7
|
-
* You may obtain a copy of the License at
|
|
8
|
-
*
|
|
9
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
-
*
|
|
11
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
-
* See the License for the specific language governing permissions and
|
|
15
|
-
* limitations under the License.
|
|
16
|
-
*/
|
|
17
|
-
import { Component, DestroyRef, EventEmitter, inject, Input, Output, ViewEncapsulation } from '@angular/core';
|
|
18
|
-
import { FormBuilder, ReactiveFormsModule } from '@angular/forms';
|
|
19
|
-
import { DateAdapter } from '@angular/material/core';
|
|
20
|
-
import { MatDialog } from '@angular/material/dialog';
|
|
21
|
-
import { debounceTime, filter, finalize, switchMap, tap } from 'rxjs/operators';
|
|
22
|
-
import { AppsProcessCloudService } from '../../../../app/services/apps-process-cloud.service';
|
|
23
|
-
import { ProcessFilterCloudModel } from '../../models/process-filter-cloud.model';
|
|
24
|
-
import { DateFnsUtils, IconComponent, TranslationService, UserPreferencesService, UserPreferenceValues } from '@alfresco/adf-core';
|
|
25
|
-
import { ProcessFilterCloudService } from '../../services/process-filter-cloud.service';
|
|
26
|
-
import { ProcessFilterDialogCloudComponent } from '../process-filter-dialog/process-filter-dialog-cloud.component';
|
|
27
|
-
import { ProcessCloudService } from '../../../services/process-cloud.service';
|
|
28
|
-
import { DateCloudFilterType } from '../../../../models/date-cloud-filter.model';
|
|
29
|
-
import { endOfDay, isValid, startOfDay } from 'date-fns';
|
|
30
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
31
|
-
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
|
|
32
|
-
import { TranslatePipe } from '@ngx-translate/core';
|
|
33
|
-
import { MatButtonModule } from '@angular/material/button';
|
|
34
|
-
import { NgForOf, NgIf } from '@angular/common';
|
|
35
|
-
import { MatExpansionModule } from '@angular/material/expansion';
|
|
36
|
-
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
37
|
-
import { MatSelectModule } from '@angular/material/select';
|
|
38
|
-
import { MatInputModule } from '@angular/material/input';
|
|
39
|
-
import { MatDatepickerModule } from '@angular/material/datepicker';
|
|
40
|
-
import { MatIconModule } from '@angular/material/icon';
|
|
41
|
-
import { DateRangeFilterComponent } from '../../../../common/date-range-filter/date-range-filter.component';
|
|
42
|
-
import { PeopleCloudComponent } from '../../../../people/components/people-cloud.component';
|
|
43
|
-
import * as i0 from "@angular/core";
|
|
44
|
-
import * as i1 from "@angular/forms";
|
|
45
|
-
import * as i2 from "@angular/material/dialog";
|
|
46
|
-
import * as i3 from "@angular/material/core";
|
|
47
|
-
import * as i4 from "@alfresco/adf-core";
|
|
48
|
-
import * as i5 from "../../services/process-filter-cloud.service";
|
|
49
|
-
import * as i6 from "../../../../app/services/apps-process-cloud.service";
|
|
50
|
-
import * as i7 from "../../../services/process-cloud.service";
|
|
51
|
-
import * as i8 from "@angular/material/progress-spinner";
|
|
52
|
-
import * as i9 from "@angular/material/button";
|
|
53
|
-
import * as i10 from "@angular/material/expansion";
|
|
54
|
-
import * as i11 from "@angular/material/form-field";
|
|
55
|
-
import * as i12 from "@angular/material/select";
|
|
56
|
-
import * as i13 from "@angular/material/input";
|
|
57
|
-
import * as i14 from "@angular/material/datepicker";
|
|
58
|
-
import * as i15 from "@angular/material/icon";
|
|
59
|
-
export const PROCESS_FILTER_ACTION_SAVE = 'save';
|
|
60
|
-
export const PROCESS_FILTER_ACTION_SAVE_AS = 'saveAs';
|
|
61
|
-
export const PROCESS_FILTER_ACTION_DELETE = 'delete';
|
|
62
|
-
export const PROCESS_FILTER_ACTION_SAVE_DEFAULT = 'saveDefaultFilter';
|
|
63
|
-
export const PROCESS_FILTER_ACTION_RESTORE = 'restoreDefaultFilter';
|
|
64
|
-
const DEFAULT_PROCESS_FILTER_PROPERTIES = ['status', 'sort', 'order', 'lastModified'];
|
|
65
|
-
const DEFAULT_SORT_PROPERTIES = ['id', 'name', 'status', 'startDate'];
|
|
66
|
-
const DEFAULT_ACTIONS = ['save', 'saveAs', 'delete'];
|
|
67
|
-
export class EditProcessFilterCloudComponent {
|
|
68
|
-
get processFilter() {
|
|
69
|
-
return this._filter;
|
|
70
|
-
}
|
|
71
|
-
/** Process filter */
|
|
72
|
-
set processFilter(value) {
|
|
73
|
-
const isChanged = this.isFilterChanged(this._filter, value);
|
|
74
|
-
this._filter = value;
|
|
75
|
-
if (value?.appName) {
|
|
76
|
-
this.appName = value.appName;
|
|
77
|
-
}
|
|
78
|
-
if (value?.id) {
|
|
79
|
-
this.id = value.id;
|
|
80
|
-
}
|
|
81
|
-
if (value?.environmentId) {
|
|
82
|
-
this.environmentId = value.environmentId;
|
|
83
|
-
}
|
|
84
|
-
this.processFilterProperties = this.createAndFilterProperties();
|
|
85
|
-
this.processFilterActions = this.createAndFilterActions();
|
|
86
|
-
this.buildForm(this.processFilterProperties);
|
|
87
|
-
if (isChanged) {
|
|
88
|
-
this.filterChange.emit(value);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
constructor(formBuilder, dialog, dateAdapter, userPreferencesService, translateService, processFilterCloudService, appsProcessCloudService, processCloudService) {
|
|
92
|
-
this.formBuilder = formBuilder;
|
|
93
|
-
this.dialog = dialog;
|
|
94
|
-
this.dateAdapter = dateAdapter;
|
|
95
|
-
this.userPreferencesService = userPreferencesService;
|
|
96
|
-
this.translateService = translateService;
|
|
97
|
-
this.processFilterCloudService = processFilterCloudService;
|
|
98
|
-
this.appsProcessCloudService = appsProcessCloudService;
|
|
99
|
-
this.processCloudService = processCloudService;
|
|
100
|
-
/** The name of the application. */
|
|
101
|
-
this.appName = '';
|
|
102
|
-
/** roles to filter the apps */
|
|
103
|
-
this.role = '';
|
|
104
|
-
/** List of process filter properties to display */
|
|
105
|
-
this.filterProperties = DEFAULT_PROCESS_FILTER_PROPERTIES;
|
|
106
|
-
/** List of sort properties to display. */
|
|
107
|
-
this.sortProperties = DEFAULT_SORT_PROPERTIES;
|
|
108
|
-
/** List of sort actions. */
|
|
109
|
-
this.actions = DEFAULT_ACTIONS;
|
|
110
|
-
/** List of environments. */
|
|
111
|
-
this.environmentList = [];
|
|
112
|
-
/** Toggles editing of process filter actions. */
|
|
113
|
-
this.showFilterActions = true;
|
|
114
|
-
/** Toggles editing of the process filter title. */
|
|
115
|
-
this.showTitle = true;
|
|
116
|
-
/** Toggles the appearance of the process filter name . */
|
|
117
|
-
this.showProcessFilterName = true;
|
|
118
|
-
/** Emitted when a process instance filter property changes. */
|
|
119
|
-
this.filterChange = new EventEmitter();
|
|
120
|
-
/** Emitted when a filter action occurs i.e Save, SaveAs, Delete. */
|
|
121
|
-
this.action = new EventEmitter();
|
|
122
|
-
this.filterHasBeenChanged = false;
|
|
123
|
-
this.status = [
|
|
124
|
-
{ value: '', label: 'ADF_CLOUD_PROCESS_FILTERS.STATUS.ALL' },
|
|
125
|
-
{ value: 'RUNNING', label: 'ADF_CLOUD_PROCESS_FILTERS.STATUS.RUNNING' },
|
|
126
|
-
{ value: 'SUSPENDED', label: 'ADF_CLOUD_PROCESS_FILTERS.STATUS.SUSPENDED' },
|
|
127
|
-
{ value: 'CANCELLED', label: 'ADF_CLOUD_PROCESS_FILTERS.STATUS.CANCELLED' },
|
|
128
|
-
{ value: 'COMPLETED', label: 'ADF_CLOUD_PROCESS_FILTERS.STATUS.COMPLETED' }
|
|
129
|
-
];
|
|
130
|
-
this.directions = [
|
|
131
|
-
{ value: 'ASC', label: 'ADF_CLOUD_PROCESS_FILTERS.DIRECTION.ASCENDING' },
|
|
132
|
-
{ value: 'DESC', label: 'ADF_CLOUD_PROCESS_FILTERS.DIRECTION.DESCENDING' }
|
|
133
|
-
];
|
|
134
|
-
this.actionDisabledForDefault = [PROCESS_FILTER_ACTION_SAVE, PROCESS_FILTER_ACTION_DELETE];
|
|
135
|
-
this.applicationNames = [];
|
|
136
|
-
this.allProcessDefinitionNamesOption = {
|
|
137
|
-
label: 'ADF_CLOUD_PROCESS_FILTERS.STATUS.ALL',
|
|
138
|
-
value: ''
|
|
139
|
-
};
|
|
140
|
-
this.processDefinitionNames = [];
|
|
141
|
-
this.processFilterProperties = [];
|
|
142
|
-
this.processFilterActions = [];
|
|
143
|
-
this.toggleFilterActions = false;
|
|
144
|
-
this.appVersionOptions = [];
|
|
145
|
-
this.initiatorOptions = [];
|
|
146
|
-
this.isLoading = false;
|
|
147
|
-
this.destroyRef = inject(DestroyRef);
|
|
148
|
-
}
|
|
149
|
-
ngOnInit() {
|
|
150
|
-
this.userPreferencesService
|
|
151
|
-
.select(UserPreferenceValues.Locale)
|
|
152
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
153
|
-
.subscribe((locale) => this.dateAdapter.setLocale(locale));
|
|
154
|
-
}
|
|
155
|
-
ngOnChanges(changes) {
|
|
156
|
-
const id = changes['id'];
|
|
157
|
-
if (id && id.currentValue !== id.previousValue) {
|
|
158
|
-
this.retrieveProcessFilterAndBuildForm();
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
filterTracker(_index, item) {
|
|
162
|
-
return item.key;
|
|
163
|
-
}
|
|
164
|
-
buildForm(processFilterProperties) {
|
|
165
|
-
this.editProcessFilterForm = this.formBuilder.group(this.getFormControlsConfig(processFilterProperties));
|
|
166
|
-
this.onFilterChange();
|
|
167
|
-
}
|
|
168
|
-
getFormControlsConfig(processFilterProperties) {
|
|
169
|
-
const properties = processFilterProperties.map((property) => {
|
|
170
|
-
if (property.attributes) {
|
|
171
|
-
return this.getAttributesControlConfig(property);
|
|
172
|
-
}
|
|
173
|
-
else {
|
|
174
|
-
return { [property.key]: property.value };
|
|
175
|
-
}
|
|
176
|
-
});
|
|
177
|
-
return properties.reduce((result, current) => Object.assign(result, current), {});
|
|
178
|
-
}
|
|
179
|
-
get lastModifiedFrom() {
|
|
180
|
-
return this.editProcessFilterForm.get('lastModifiedFrom');
|
|
181
|
-
}
|
|
182
|
-
get lastModifiedTo() {
|
|
183
|
-
return this.editProcessFilterForm.get('lastModifiedTo');
|
|
184
|
-
}
|
|
185
|
-
get completedDateType() {
|
|
186
|
-
return this.editProcessFilterForm.get('completedDateType');
|
|
187
|
-
}
|
|
188
|
-
getAttributesControlConfig(property) {
|
|
189
|
-
return Object.values(property.attributes).reduce((result, key) => {
|
|
190
|
-
result[key] = property.value[key];
|
|
191
|
-
return result;
|
|
192
|
-
}, {});
|
|
193
|
-
}
|
|
194
|
-
/**
|
|
195
|
-
* Fetches process instance filter by application name and filter id and creates filter properties, build form
|
|
196
|
-
*/
|
|
197
|
-
retrieveProcessFilterAndBuildForm() {
|
|
198
|
-
this.isLoading = true;
|
|
199
|
-
this.processFilterCloudService
|
|
200
|
-
.getFilterById(this.appName, this.id)
|
|
201
|
-
.pipe(finalize(() => (this.isLoading = false)))
|
|
202
|
-
.subscribe((response) => {
|
|
203
|
-
this.filterHasBeenChanged = false;
|
|
204
|
-
this.processFilter = new ProcessFilterCloudModel(Object.assign({}, response || {}, this.processFilter || {}));
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
/**
|
|
208
|
-
* Check process instance filter changes
|
|
209
|
-
*/
|
|
210
|
-
onFilterChange() {
|
|
211
|
-
if (this.filterChangeSub) {
|
|
212
|
-
this.filterChangeSub.unsubscribe();
|
|
213
|
-
this.filterChangeSub = null;
|
|
214
|
-
}
|
|
215
|
-
this.filterChangeSub = this.editProcessFilterForm.valueChanges
|
|
216
|
-
.pipe(debounceTime(500), filter(() => this.isFormValid()), takeUntilDestroyed(this.destroyRef))
|
|
217
|
-
.subscribe((formValues) => {
|
|
218
|
-
this.setLastModifiedFromFilter(formValues);
|
|
219
|
-
this.setLastModifiedToFilter(formValues);
|
|
220
|
-
const newValue = new ProcessFilterCloudModel(Object.assign({}, this.processFilter, formValues));
|
|
221
|
-
const changed = !this.compareFilters(newValue, this.processFilter);
|
|
222
|
-
this.filterHasBeenChanged = changed;
|
|
223
|
-
if (changed) {
|
|
224
|
-
this._filter = newValue;
|
|
225
|
-
this.filterChange.emit(newValue);
|
|
226
|
-
}
|
|
227
|
-
});
|
|
228
|
-
}
|
|
229
|
-
createAndFilterProperties() {
|
|
230
|
-
this.checkMandatoryFilterProperties();
|
|
231
|
-
if (this.filterProperties.includes('appName')) {
|
|
232
|
-
this.getDeployedApplications();
|
|
233
|
-
}
|
|
234
|
-
if (this.filterProperties.includes('processDefinitionName')) {
|
|
235
|
-
this.getProcessDefinitions();
|
|
236
|
-
}
|
|
237
|
-
if (this.filterProperties.includes('appVersionMultiple')) {
|
|
238
|
-
this.getAppVersionOptions();
|
|
239
|
-
}
|
|
240
|
-
if (this.filterProperties.includes('initiator')) {
|
|
241
|
-
this.initiatorOptions = this.processFilter.initiator
|
|
242
|
-
? this.processFilter.initiator.split(',').map((username) => Object.assign({}, { username }))
|
|
243
|
-
: [];
|
|
244
|
-
}
|
|
245
|
-
const defaultProperties = this.createProcessFilterProperties(this.processFilter);
|
|
246
|
-
let filteredProperties = defaultProperties.filter((filterProperty) => this.isValidProperty(this.filterProperties, filterProperty.key));
|
|
247
|
-
if (!this.filterProperties.includes('sort')) {
|
|
248
|
-
filteredProperties = filteredProperties.filter((property) => property.key !== 'order');
|
|
249
|
-
}
|
|
250
|
-
if (this.filterProperties.includes('lastModified')) {
|
|
251
|
-
filteredProperties = [...filteredProperties, ...this.createLastModifiedProperty(this.processFilter)];
|
|
252
|
-
}
|
|
253
|
-
return filteredProperties;
|
|
254
|
-
}
|
|
255
|
-
checkMandatoryFilterProperties() {
|
|
256
|
-
if (this.filterProperties === undefined || this.filterProperties.length === 0) {
|
|
257
|
-
this.filterProperties = DEFAULT_PROCESS_FILTER_PROPERTIES;
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
isValidProperty(filterProperties, key) {
|
|
261
|
-
return filterProperties ? filterProperties.indexOf(key) >= 0 : true;
|
|
262
|
-
}
|
|
263
|
-
get createSortProperties() {
|
|
264
|
-
this.checkMandatorySortProperties();
|
|
265
|
-
const defaultSortProperties = this.createProcessSortProperties();
|
|
266
|
-
return defaultSortProperties.filter((sortProperty) => this.isValidProperty(this.sortProperties, sortProperty.key));
|
|
267
|
-
}
|
|
268
|
-
getAppVersionOptions() {
|
|
269
|
-
this.processCloudService.getApplicationVersions(this.appName).subscribe((appVersions) => {
|
|
270
|
-
this.appVersionOptions.length = 0;
|
|
271
|
-
appVersions.forEach((appVersion) => {
|
|
272
|
-
this.appVersionOptions.push({ label: appVersion.entry.version, value: appVersion.entry.version });
|
|
273
|
-
});
|
|
274
|
-
});
|
|
275
|
-
}
|
|
276
|
-
checkMandatorySortProperties() {
|
|
277
|
-
if (this.sortProperties === undefined || this.sortProperties.length === 0) {
|
|
278
|
-
this.sortProperties = DEFAULT_SORT_PROPERTIES;
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
createAndFilterActions() {
|
|
282
|
-
this.checkMandatoryActions();
|
|
283
|
-
const actions = this.createFilterActions();
|
|
284
|
-
return actions.filter((action) => this.isValidAction(this.actions, action));
|
|
285
|
-
}
|
|
286
|
-
checkMandatoryActions() {
|
|
287
|
-
if (this.actions === undefined || this.actions.length === 0) {
|
|
288
|
-
this.actions = DEFAULT_ACTIONS;
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
isValidAction(actions, action) {
|
|
292
|
-
return actions ? actions.indexOf(action.actionType) >= 0 : true;
|
|
293
|
-
}
|
|
294
|
-
isFormValid() {
|
|
295
|
-
return this.editProcessFilterForm.valid;
|
|
296
|
-
}
|
|
297
|
-
getPropertyController(property) {
|
|
298
|
-
return this.editProcessFilterForm.get(property.key);
|
|
299
|
-
}
|
|
300
|
-
onDateChanged(newDateValue, dateProperty) {
|
|
301
|
-
if (newDateValue) {
|
|
302
|
-
const controller = this.getPropertyController(dateProperty);
|
|
303
|
-
let date = newDateValue;
|
|
304
|
-
if (typeof newDateValue === 'string') {
|
|
305
|
-
date = DateFnsUtils.parseDate(newDateValue, 'dd/MM/yyyy');
|
|
306
|
-
}
|
|
307
|
-
if (isValid(date)) {
|
|
308
|
-
controller.setValue(date);
|
|
309
|
-
controller.setErrors(null);
|
|
310
|
-
}
|
|
311
|
-
else {
|
|
312
|
-
controller.setValue(date);
|
|
313
|
-
controller.setErrors({ invalid: true });
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
onDateTypeChange(dateType, property) {
|
|
318
|
-
this.editProcessFilterForm.get(property.attributes.dateType).setValue(dateType);
|
|
319
|
-
}
|
|
320
|
-
onDateRangeFilterChanged(dateRange, property) {
|
|
321
|
-
this.editProcessFilterForm.get(property.attributes?.from).setValue(dateRange.startDate ? dateRange.startDate : null);
|
|
322
|
-
this.editProcessFilterForm.get(property.attributes?.to).setValue(dateRange.endDate ? dateRange.endDate : null);
|
|
323
|
-
this.editProcessFilterForm.get(property.attributes.dateType).setValue(DateCloudFilterType.RANGE);
|
|
324
|
-
}
|
|
325
|
-
onChangedUser(users, processProperty) {
|
|
326
|
-
this.getPropertyController(processProperty).setValue(users.map((user) => user.username).join(','));
|
|
327
|
-
}
|
|
328
|
-
hasError(property) {
|
|
329
|
-
const controller = this.getPropertyController(property);
|
|
330
|
-
return !!controller.errors?.invalid;
|
|
331
|
-
}
|
|
332
|
-
compareFilters(editedQuery, currentQuery) {
|
|
333
|
-
return JSON.stringify(editedQuery).toLowerCase() === JSON.stringify(currentQuery).toLowerCase();
|
|
334
|
-
}
|
|
335
|
-
getDeployedApplications() {
|
|
336
|
-
this.appsProcessCloudService.getDeployedApplicationsByStatus('DEPLOYED', this.role).subscribe((applications) => {
|
|
337
|
-
if (applications && applications.length > 0) {
|
|
338
|
-
this.applicationNames.length = 0;
|
|
339
|
-
applications.map((application) => {
|
|
340
|
-
this.applicationNames.push({
|
|
341
|
-
label: this.appsProcessCloudService.getApplicationLabel(application, this.environmentList),
|
|
342
|
-
value: application.name
|
|
343
|
-
});
|
|
344
|
-
});
|
|
345
|
-
}
|
|
346
|
-
});
|
|
347
|
-
}
|
|
348
|
-
getProcessDefinitions() {
|
|
349
|
-
this.processCloudService.getProcessDefinitions(this.appName).subscribe((processDefinitions) => {
|
|
350
|
-
if (processDefinitions && processDefinitions.length > 0) {
|
|
351
|
-
this.processDefinitionNames.length = 0;
|
|
352
|
-
this.processDefinitionNames.push(this.allProcessDefinitionNamesOption);
|
|
353
|
-
processDefinitions.map((processDefinition) => {
|
|
354
|
-
this.processDefinitionNames.push({ label: processDefinition.name, value: processDefinition.name });
|
|
355
|
-
});
|
|
356
|
-
}
|
|
357
|
-
});
|
|
358
|
-
}
|
|
359
|
-
executeFilterActions(event, action) {
|
|
360
|
-
if (action.actionType === PROCESS_FILTER_ACTION_SAVE) {
|
|
361
|
-
this.save(action);
|
|
362
|
-
}
|
|
363
|
-
else if (action.actionType === PROCESS_FILTER_ACTION_SAVE_AS) {
|
|
364
|
-
this.saveAs(action);
|
|
365
|
-
}
|
|
366
|
-
else if (action.actionType === PROCESS_FILTER_ACTION_DELETE) {
|
|
367
|
-
this.delete(action);
|
|
368
|
-
}
|
|
369
|
-
else if (action.actionType === PROCESS_FILTER_ACTION_SAVE_DEFAULT) {
|
|
370
|
-
this.save(action);
|
|
371
|
-
}
|
|
372
|
-
else if (action.actionType === PROCESS_FILTER_ACTION_RESTORE) {
|
|
373
|
-
this.reset(action);
|
|
374
|
-
}
|
|
375
|
-
event.stopPropagation();
|
|
376
|
-
}
|
|
377
|
-
save(saveAction) {
|
|
378
|
-
this.processFilterCloudService.updateFilter(this.processFilter).subscribe(() => {
|
|
379
|
-
saveAction.filter = this.processFilter;
|
|
380
|
-
this.filterHasBeenChanged = false;
|
|
381
|
-
this.action.emit(saveAction);
|
|
382
|
-
});
|
|
383
|
-
}
|
|
384
|
-
/**
|
|
385
|
-
* Delete a process instance filter
|
|
386
|
-
*
|
|
387
|
-
* @param deleteAction filter action
|
|
388
|
-
*/
|
|
389
|
-
delete(deleteAction) {
|
|
390
|
-
this.processFilterCloudService
|
|
391
|
-
.deleteFilter(this.processFilter)
|
|
392
|
-
.pipe(filter((filters) => {
|
|
393
|
-
deleteAction.filter = this.processFilter;
|
|
394
|
-
this.action.emit(deleteAction);
|
|
395
|
-
return filters.length === 0;
|
|
396
|
-
}), switchMap(() => this.restoreDefaultProcessFilters()))
|
|
397
|
-
.subscribe(() => { });
|
|
398
|
-
}
|
|
399
|
-
/**
|
|
400
|
-
* Save As a process instance filter
|
|
401
|
-
*
|
|
402
|
-
* @param saveAsAction filter action
|
|
403
|
-
*/
|
|
404
|
-
saveAs(saveAsAction) {
|
|
405
|
-
const dialogRef = this.dialog.open(ProcessFilterDialogCloudComponent, {
|
|
406
|
-
data: {
|
|
407
|
-
name: this.translateService.instant(this.processFilter.name)
|
|
408
|
-
},
|
|
409
|
-
height: 'auto',
|
|
410
|
-
minWidth: '30%'
|
|
411
|
-
});
|
|
412
|
-
dialogRef.afterClosed().subscribe((result) => {
|
|
413
|
-
if (result && result.action === ProcessFilterDialogCloudComponent.ACTION_SAVE) {
|
|
414
|
-
const filterId = Math.random().toString(36).substring(2, 9);
|
|
415
|
-
const filterKey = this.getSanitizeFilterName(result.name);
|
|
416
|
-
const newFilter = {
|
|
417
|
-
name: result.name,
|
|
418
|
-
icon: result.icon,
|
|
419
|
-
id: filterId,
|
|
420
|
-
key: 'custom-' + filterKey
|
|
421
|
-
};
|
|
422
|
-
const resultFilter = Object.assign({}, this.processFilter, newFilter);
|
|
423
|
-
this.processFilterCloudService.addFilter(resultFilter).subscribe(() => {
|
|
424
|
-
saveAsAction.filter = resultFilter;
|
|
425
|
-
this.filterHasBeenChanged = false;
|
|
426
|
-
this.action.emit(saveAsAction);
|
|
427
|
-
});
|
|
428
|
-
}
|
|
429
|
-
});
|
|
430
|
-
}
|
|
431
|
-
reset(resetAction) {
|
|
432
|
-
this.processFilterCloudService
|
|
433
|
-
.resetProcessFilterToDefaults(this.appName, this.processFilter)
|
|
434
|
-
.pipe(tap((filters) => {
|
|
435
|
-
resetAction.filter = filters.find((defaultFilter) => defaultFilter.name === this.processFilter.name) || this.processFilter;
|
|
436
|
-
this.action.emit(resetAction);
|
|
437
|
-
}), switchMap(() => this.restoreDefaultProcessFilters()))
|
|
438
|
-
.subscribe(() => { });
|
|
439
|
-
}
|
|
440
|
-
/**
|
|
441
|
-
* Get sanitized filter name
|
|
442
|
-
*
|
|
443
|
-
* @param filterName filter name
|
|
444
|
-
* @returns sanitized filter name
|
|
445
|
-
*/
|
|
446
|
-
getSanitizeFilterName(filterName) {
|
|
447
|
-
const nameWithHyphen = this.replaceSpaceWithHyphen(filterName.trim());
|
|
448
|
-
return nameWithHyphen.toLowerCase();
|
|
449
|
-
}
|
|
450
|
-
/**
|
|
451
|
-
* Return name with hyphen
|
|
452
|
-
*
|
|
453
|
-
* @param name name
|
|
454
|
-
* @returns updated value
|
|
455
|
-
*/
|
|
456
|
-
replaceSpaceWithHyphen(name) {
|
|
457
|
-
const regExt = new RegExp(' ', 'g');
|
|
458
|
-
return name.replace(regExt, '-');
|
|
459
|
-
}
|
|
460
|
-
restoreDefaultProcessFilters() {
|
|
461
|
-
return this.processFilterCloudService.getProcessFilters(this.appName);
|
|
462
|
-
}
|
|
463
|
-
onExpand() {
|
|
464
|
-
this.toggleFilterActions = true;
|
|
465
|
-
}
|
|
466
|
-
onClose() {
|
|
467
|
-
this.toggleFilterActions = false;
|
|
468
|
-
}
|
|
469
|
-
isDisabledAction(action) {
|
|
470
|
-
return this.processFilterCloudService.isDefaultFilter(this.processFilter.name) && this.actionDisabledForDefault.includes(action.actionType)
|
|
471
|
-
? true
|
|
472
|
-
: this.hasFilterChanged(action);
|
|
473
|
-
}
|
|
474
|
-
hasFilterChanged(action) {
|
|
475
|
-
return action.actionType === PROCESS_FILTER_ACTION_SAVE || action.actionType === PROCESS_FILTER_ACTION_SAVE_AS
|
|
476
|
-
? !this.filterHasBeenChanged
|
|
477
|
-
: false;
|
|
478
|
-
}
|
|
479
|
-
setLastModifiedToFilter(formValues) {
|
|
480
|
-
if (isValid(formValues.lastModifiedTo)) {
|
|
481
|
-
formValues.lastModifiedTo = endOfDay(formValues.lastModifiedTo);
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
setLastModifiedFromFilter(formValues) {
|
|
485
|
-
if (isValid(formValues.lastModifiedFrom)) {
|
|
486
|
-
formValues.lastModifiedFrom = startOfDay(formValues.lastModifiedFrom);
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
createFilterActions() {
|
|
490
|
-
return [
|
|
491
|
-
{
|
|
492
|
-
actionType: PROCESS_FILTER_ACTION_SAVE,
|
|
493
|
-
icon: 'adf:save',
|
|
494
|
-
tooltip: 'ADF_CLOUD_EDIT_PROCESS_FILTER.TOOL_TIP.SAVE'
|
|
495
|
-
},
|
|
496
|
-
{
|
|
497
|
-
actionType: PROCESS_FILTER_ACTION_SAVE_AS,
|
|
498
|
-
icon: 'adf:save-as',
|
|
499
|
-
tooltip: 'ADF_CLOUD_EDIT_PROCESS_FILTER.TOOL_TIP.SAVE_AS'
|
|
500
|
-
},
|
|
501
|
-
{
|
|
502
|
-
actionType: PROCESS_FILTER_ACTION_DELETE,
|
|
503
|
-
icon: 'delete',
|
|
504
|
-
tooltip: 'ADF_CLOUD_EDIT_PROCESS_FILTER.TOOL_TIP.DELETE'
|
|
505
|
-
},
|
|
506
|
-
{
|
|
507
|
-
actionType: PROCESS_FILTER_ACTION_SAVE_DEFAULT,
|
|
508
|
-
icon: 'adf:save',
|
|
509
|
-
tooltip: 'ADF_CLOUD_EDIT_PROCESS_FILTER.TOOL_TIP.SAVE'
|
|
510
|
-
},
|
|
511
|
-
{
|
|
512
|
-
actionType: PROCESS_FILTER_ACTION_RESTORE,
|
|
513
|
-
icon: 'settings_backup_restore',
|
|
514
|
-
tooltip: 'ADF_CLOUD_EDIT_PROCESS_FILTER.TOOL_TIP.RESTORE'
|
|
515
|
-
}
|
|
516
|
-
];
|
|
517
|
-
}
|
|
518
|
-
createLastModifiedProperty(filterModel) {
|
|
519
|
-
return [
|
|
520
|
-
{
|
|
521
|
-
label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.LAST_MODIFIED_DATE_FORM',
|
|
522
|
-
type: 'date',
|
|
523
|
-
key: 'lastModifiedFrom',
|
|
524
|
-
value: filterModel.lastModifiedFrom
|
|
525
|
-
},
|
|
526
|
-
{
|
|
527
|
-
label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.LAST_MODIFIED_TO',
|
|
528
|
-
type: 'date',
|
|
529
|
-
key: 'lastModifiedTo',
|
|
530
|
-
value: filterModel.lastModifiedTo
|
|
531
|
-
}
|
|
532
|
-
];
|
|
533
|
-
}
|
|
534
|
-
createProcessSortProperties() {
|
|
535
|
-
return [
|
|
536
|
-
{
|
|
537
|
-
label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.ID',
|
|
538
|
-
key: 'id',
|
|
539
|
-
value: 'id'
|
|
540
|
-
},
|
|
541
|
-
{
|
|
542
|
-
label: 'EnvironmentId',
|
|
543
|
-
key: 'environmentId',
|
|
544
|
-
value: 'environmentId'
|
|
545
|
-
},
|
|
546
|
-
{
|
|
547
|
-
label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.PROCESS_NAME',
|
|
548
|
-
key: 'name',
|
|
549
|
-
value: 'name'
|
|
550
|
-
},
|
|
551
|
-
{
|
|
552
|
-
label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.START_DATE',
|
|
553
|
-
key: 'startDate',
|
|
554
|
-
value: 'startDate'
|
|
555
|
-
},
|
|
556
|
-
{
|
|
557
|
-
label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.STATUS',
|
|
558
|
-
key: 'status',
|
|
559
|
-
value: 'status'
|
|
560
|
-
},
|
|
561
|
-
{
|
|
562
|
-
label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.STARTED_BY',
|
|
563
|
-
key: 'initiator',
|
|
564
|
-
value: 'initiator'
|
|
565
|
-
},
|
|
566
|
-
{
|
|
567
|
-
label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.APP_NAME',
|
|
568
|
-
key: 'appName',
|
|
569
|
-
value: 'appName'
|
|
570
|
-
},
|
|
571
|
-
{
|
|
572
|
-
label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.APP_VERSION',
|
|
573
|
-
key: 'appVersion',
|
|
574
|
-
value: 'appVersion'
|
|
575
|
-
},
|
|
576
|
-
{
|
|
577
|
-
label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.MAIN_PROCESS_ID',
|
|
578
|
-
key: 'parentId',
|
|
579
|
-
value: 'parentId'
|
|
580
|
-
},
|
|
581
|
-
{
|
|
582
|
-
label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.PROCESS_INS_ID',
|
|
583
|
-
key: 'processInstanceId',
|
|
584
|
-
value: 'processInstanceId'
|
|
585
|
-
},
|
|
586
|
-
{
|
|
587
|
-
label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.PROCESS_DEF_ID',
|
|
588
|
-
key: 'processDefinitionId',
|
|
589
|
-
value: 'processDefinitionId'
|
|
590
|
-
},
|
|
591
|
-
{
|
|
592
|
-
label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.PROCESS_DEF_NAME',
|
|
593
|
-
key: 'processDefinitionName',
|
|
594
|
-
value: 'processDefinitionName'
|
|
595
|
-
},
|
|
596
|
-
{
|
|
597
|
-
label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.PROCESS_DEF_KEY',
|
|
598
|
-
key: 'processDefinitionKey',
|
|
599
|
-
value: 'processDefinitionKey'
|
|
600
|
-
},
|
|
601
|
-
{
|
|
602
|
-
label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.LAST_MODIFIED',
|
|
603
|
-
key: 'lastModified',
|
|
604
|
-
value: 'lastModified'
|
|
605
|
-
},
|
|
606
|
-
{
|
|
607
|
-
label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.BUSINESS_KEY',
|
|
608
|
-
key: 'businessKey',
|
|
609
|
-
value: 'businessKey'
|
|
610
|
-
}
|
|
611
|
-
];
|
|
612
|
-
}
|
|
613
|
-
isFilterChanged(oldValue, newValue) {
|
|
614
|
-
const oldJson = JSON.stringify(this.processFilterCloudService.writeQueryParams(oldValue || {}, this.filterProperties));
|
|
615
|
-
const newJson = JSON.stringify(this.processFilterCloudService.writeQueryParams(newValue || {}, this.filterProperties));
|
|
616
|
-
return oldJson !== newJson;
|
|
617
|
-
}
|
|
618
|
-
createProcessFilterProperties(filterModel) {
|
|
619
|
-
const appVersionMultiple = [];
|
|
620
|
-
if (filterModel.appVersion) {
|
|
621
|
-
appVersionMultiple.push(Array.isArray(filterModel.appVersion) ? filterModel.appVersion.map((entry) => entry.toString()) : `${filterModel.appVersion}`);
|
|
622
|
-
}
|
|
623
|
-
return [
|
|
624
|
-
{
|
|
625
|
-
label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.APP_NAME',
|
|
626
|
-
type: 'select',
|
|
627
|
-
key: 'appName',
|
|
628
|
-
value: filterModel.appName || '',
|
|
629
|
-
options: this.applicationNames
|
|
630
|
-
},
|
|
631
|
-
{
|
|
632
|
-
label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.APP_VERSION',
|
|
633
|
-
type: 'number',
|
|
634
|
-
key: 'appVersion',
|
|
635
|
-
value: filterModel.appVersion
|
|
636
|
-
},
|
|
637
|
-
{
|
|
638
|
-
label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.APP_VERSION',
|
|
639
|
-
type: 'multi-select',
|
|
640
|
-
key: 'appVersionMultiple',
|
|
641
|
-
value: appVersionMultiple,
|
|
642
|
-
options: this.appVersionOptions
|
|
643
|
-
},
|
|
644
|
-
{
|
|
645
|
-
label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.PROCESS_INS_ID',
|
|
646
|
-
type: 'text',
|
|
647
|
-
key: 'processInstanceId',
|
|
648
|
-
value: filterModel.processInstanceId || ''
|
|
649
|
-
},
|
|
650
|
-
{
|
|
651
|
-
label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.MAIN_PROCESS_ID',
|
|
652
|
-
type: 'text',
|
|
653
|
-
key: 'parentId',
|
|
654
|
-
value: filterModel.parentId
|
|
655
|
-
},
|
|
656
|
-
{
|
|
657
|
-
label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.PROCESS_NAME',
|
|
658
|
-
type: 'text',
|
|
659
|
-
key: 'processName',
|
|
660
|
-
value: filterModel.processName || ''
|
|
661
|
-
},
|
|
662
|
-
{
|
|
663
|
-
label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.PROCESS_DEF_NAME',
|
|
664
|
-
type: 'select',
|
|
665
|
-
key: 'processDefinitionName',
|
|
666
|
-
value: filterModel.processDefinitionName || '',
|
|
667
|
-
options: this.processDefinitionNames
|
|
668
|
-
},
|
|
669
|
-
{
|
|
670
|
-
label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.STATUS',
|
|
671
|
-
type: 'select',
|
|
672
|
-
key: 'status',
|
|
673
|
-
value: filterModel.status || this.status[0].value,
|
|
674
|
-
options: this.status
|
|
675
|
-
},
|
|
676
|
-
{
|
|
677
|
-
label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.PROCESS_DEF_ID',
|
|
678
|
-
type: 'text',
|
|
679
|
-
key: 'processDefinitionId',
|
|
680
|
-
value: filterModel.processDefinitionId || ''
|
|
681
|
-
},
|
|
682
|
-
{
|
|
683
|
-
label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.PROCESS_DEF_KEY',
|
|
684
|
-
type: 'text',
|
|
685
|
-
key: 'processDefinitionKey',
|
|
686
|
-
value: filterModel.processDefinitionKey || ''
|
|
687
|
-
},
|
|
688
|
-
{
|
|
689
|
-
label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.SORT',
|
|
690
|
-
type: 'select',
|
|
691
|
-
key: 'sort',
|
|
692
|
-
value: filterModel.sort || this.createSortProperties[0].value,
|
|
693
|
-
options: this.createSortProperties
|
|
694
|
-
},
|
|
695
|
-
{
|
|
696
|
-
label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.DIRECTION',
|
|
697
|
-
type: 'select',
|
|
698
|
-
key: 'order',
|
|
699
|
-
value: filterModel.order || this.directions[0].value,
|
|
700
|
-
options: this.directions
|
|
701
|
-
},
|
|
702
|
-
{
|
|
703
|
-
label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.COMPLETED_DATE',
|
|
704
|
-
type: 'date',
|
|
705
|
-
key: 'completedDate',
|
|
706
|
-
value: filterModel.completedDate || false
|
|
707
|
-
},
|
|
708
|
-
{
|
|
709
|
-
label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.STARTED_BY',
|
|
710
|
-
type: 'people',
|
|
711
|
-
key: 'initiator',
|
|
712
|
-
value: filterModel.initiator,
|
|
713
|
-
selectionMode: 'multiple'
|
|
714
|
-
},
|
|
715
|
-
{
|
|
716
|
-
label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.COMPLETED_DATE',
|
|
717
|
-
type: 'date-range',
|
|
718
|
-
key: 'completedDateRange',
|
|
719
|
-
attributes: { dateType: 'completedDateType', from: '_completedFrom', to: '_completedTo' },
|
|
720
|
-
value: {
|
|
721
|
-
completedDateType: filterModel.completedDateType || null,
|
|
722
|
-
_completedFrom: filterModel.completedFrom || null,
|
|
723
|
-
_completedTo: filterModel.completedTo || null
|
|
724
|
-
}
|
|
725
|
-
},
|
|
726
|
-
{
|
|
727
|
-
label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.STARTED_DATE',
|
|
728
|
-
type: 'date-range',
|
|
729
|
-
key: 'startedDateRange',
|
|
730
|
-
attributes: { dateType: 'startedDateType', from: '_startFrom', to: '_startTo' },
|
|
731
|
-
value: {
|
|
732
|
-
startedDateType: filterModel.startedDateType || null,
|
|
733
|
-
_startFrom: filterModel.startFrom || null,
|
|
734
|
-
_startTo: filterModel.startTo || null
|
|
735
|
-
}
|
|
736
|
-
},
|
|
737
|
-
{
|
|
738
|
-
label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.SUSPENDED_DATE',
|
|
739
|
-
type: 'date-range',
|
|
740
|
-
key: 'suspendedDateRange',
|
|
741
|
-
attributes: { dateType: 'suspendedDateType', from: '_suspendedFrom', to: '_suspendedTo' },
|
|
742
|
-
value: {
|
|
743
|
-
suspendedDateType: filterModel.suspendedDateType || null,
|
|
744
|
-
_suspendedFrom: filterModel.suspendedFrom || null,
|
|
745
|
-
_suspendedTo: filterModel.suspendedTo || null
|
|
746
|
-
}
|
|
747
|
-
}
|
|
748
|
-
];
|
|
749
|
-
}
|
|
750
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EditProcessFilterCloudComponent, deps: [{ token: i1.FormBuilder }, { token: i2.MatDialog }, { token: i3.DateAdapter }, { token: i4.UserPreferencesService }, { token: i4.TranslationService }, { token: i5.ProcessFilterCloudService }, { token: i6.AppsProcessCloudService }, { token: i7.ProcessCloudService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
751
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: EditProcessFilterCloudComponent, isStandalone: true, selector: "adf-cloud-edit-process-filter", inputs: { appName: "appName", role: "role", id: "id", filterProperties: "filterProperties", sortProperties: "sortProperties", actions: "actions", environmentId: "environmentId", environmentList: "environmentList", showFilterActions: "showFilterActions", showTitle: "showTitle", showProcessFilterName: "showProcessFilterName", processFilter: "processFilter" }, outputs: { filterChange: "filterChange", action: "action" }, usesOnChanges: true, ngImport: i0, template: "<mat-accordion [hideToggle]=\"isLoading\" class=\"adf-edit-process-filter\">\n <mat-expansion-panel (afterExpand)=\"onExpand()\" (closed)=\"onClose()\">\n <mat-expansion-panel-header *ngIf=\"processFilter\" id=\"adf-edit-process-filter-expansion-header\" class=\"adf-edit-process-filter-header\">\n <ng-container *ngIf=\"!isLoading; else loadingTemplate\">\n <mat-panel-title *ngIf=\"showProcessFilterName\" id=\"adf-edit-process-filter-title-id\" class=\"adf-edit-process-filter-header__title\">\n {{processFilter.name | translate}}</mat-panel-title>\n <mat-panel-description class=\"adf-edit-process-filter-header__description\" id=\"adf-edit-process-filter-sub-title-id\">\n <span *ngIf=\"showTitle\"> {{ 'ADF_CLOUD_EDIT_PROCESS_FILTER.TITLE' | translate}}</span>\n <div *ngIf=\"showFilterActions\" class=\"adf-cloud-edit-process-filter-actions\">\n <ng-container *ngIf=\"toggleFilterActions\">\n <button *ngFor=\"let filterAction of processFilterActions\"\n mat-icon-button\n [title]=\"filterAction.tooltip | translate\"\n [attr.data-automation-id]=\"'adf-filter-action-' + filterAction.actionType\"\n [disabled]=\"isDisabledAction(filterAction)\"\n (click)=\"executeFilterActions($event, filterAction)\">\n <adf-icon [value]=\"filterAction.icon\" />\n </button>\n </ng-container>\n </div>\n </mat-panel-description>\n </ng-container>\n <ng-template #loadingTemplate>\n <div class=\"adf-cloud-edit-process-filter-loading-margin\">\n <mat-spinner [diameter]=\"30\" />\n </div>\n </ng-template>\n </mat-expansion-panel-header>\n <ng-container *ngIf=\"!isLoading\">\n <form [formGroup]=\"editProcessFilterForm\" *ngIf=\"editProcessFilterForm\" class=\"adf-edit-process-filter-content\">\n <div class=\"adf-edit-process-filter-form\">\n <ng-container *ngFor=\"let processFilterProperty of processFilterProperties; trackBy: filterTracker\">\n <mat-form-field [floatLabel]=\"'auto'\" *ngIf=\"processFilterProperty.type === 'select'\" [attr.data-automation-id]=\"processFilterProperty.key\">\n <mat-label class=\"adf-edit-process-filter-content__select-label\">{{processFilterProperty.label | translate}}</mat-label>\n <mat-select\n [formControlName]=\"processFilterProperty.key\"\n [attr.data-automation-id]=\"'adf-cloud-edit-process-property-' + processFilterProperty.key\">\n <mat-option\n *ngFor=\"let propertyOption of processFilterProperty.options\"\n [value]=\"propertyOption.value\"\n [attr.data-automation-id]=\"'adf-cloud-edit-process-property-options-' + processFilterProperty.key\"\n >{{ propertyOption.label | translate }}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field [floatLabel]=\"'auto'\" *ngIf=\"processFilterProperty.type === 'multi-select'\" [attr.data-automation-id]=\"processFilterProperty.key\">\n <mat-label class=\"adf-edit-process-filter-content__select-label\">{{processFilterProperty.label | translate}}</mat-label>\n <mat-select\n [formControlName]=\"processFilterProperty.key\"\n [attr.data-automation-id]=\"'adf-cloud-edit-process-property-' + processFilterProperty.key\"\n [multiple]=\"true\">\n <mat-option *ngFor=\"let propertyOption of processFilterProperty.options\" [value]=\"propertyOption.value\" [attr.data-automation-id]=\"'adf-cloud-edit-process-property-options-' + processFilterProperty.key\">\n {{ propertyOption.label | translate }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field [floatLabel]=\"'auto'\" *ngIf=\"processFilterProperty.type === 'text'\" [attr.data-automation-id]=\"processFilterProperty.key\">\n <mat-label class=\"adf-edit-process-filter-content__text-label\">{{processFilterProperty.label | translate}}</mat-label>\n <input matInput\n [formControlName]=\"processFilterProperty.key\"\n type=\"text\"\n [attr.data-automation-id]=\"'adf-cloud-edit-process-property-' + processFilterProperty.key\"/>\n </mat-form-field>\n <mat-form-field [floatLabel]=\"'auto'\" *ngIf=\"processFilterProperty.type === 'number'\" [attr.data-automation-id]=\"processFilterProperty.key\">\n <input matInput\n [formControlName]=\"processFilterProperty.key\"\n type=\"number\" min=\"0\"\n placeholder=\"{{processFilterProperty.label | translate}}\"\n [attr.data-automation-id]=\"'adf-cloud-edit-process-property-' + processFilterProperty.key\"/>\n </mat-form-field>\n <mat-form-field [floatLabel]=\"'auto'\" *ngIf=\"processFilterProperty.type === 'date'\" [attr.data-automation-id]=\"processFilterProperty.key\">\n <mat-label>{{processFilterProperty.label | translate}}</mat-label>\n <input\n matInput\n [formControlName]=\"processFilterProperty.key\"\n (keyup)=\"onDateChanged($any($event).target.value, processFilterProperty)\"\n (dateChange)=\"onDateChanged($event.value, processFilterProperty)\"\n [matDatepicker]=\"dateController\"\n placeholder=\"{{processFilterProperty.label | translate}}\"\n [attr.data-automation-id]=\"'adf-cloud-edit-process-property-' + processFilterProperty.key\">\n <mat-datepicker-toggle\n matSuffix [for]=\"dateController\"\n [attr.data-automation-id]=\"'adf-cloud-edit-process-property-date-toggle-' + processFilterProperty.key\" />\n <mat-datepicker #dateController [attr.data-automation-id]=\"'adf-cloud-edit-process-property-date-picker-' + processFilterProperty.key\" />\n <div class=\"adf-edit-process-filter-date-error-container\">\n <div *ngIf=\"hasError(processFilterProperty)\">\n <div class=\"adf-error-text\">{{'ADF_CLOUD_EDIT_PROCESS_FILTER.ERROR.DATE' | translate}}</div>\n <mat-icon class=\"adf-error-icon\">warning</mat-icon>\n </div>\n </div>\n </mat-form-field>\n\n <adf-cloud-date-range-filter *ngIf=\"processFilterProperty.type === 'date-range'\"\n [processFilterProperty]=\"processFilterProperty\"\n [options]=\"processFilterProperty.dateFilterOptions\"\n (dateTypeChange)=\"onDateTypeChange($event, processFilterProperty)\"\n (dateChanged)=\"onDateRangeFilterChanged($event, processFilterProperty)\" />\n <adf-cloud-people\n *ngIf=\"processFilterProperty.type === 'people'\"\n [preSelectUsers]=\"initiatorOptions\"\n [title]=\"processFilterProperty.label\"\n [validate]=\"true\"\n [appName]=\"appName\"\n [mode]=\"processFilterProperty.selectionMode\"\n (changedUsers)=\"onChangedUser($event, processFilterProperty)\" />\n </ng-container>\n </div>\n </form>\n </ng-container>\n </mat-expansion-panel>\n</mat-accordion>\n", styles: [".adf-edit-process-filter-date-error-container{position:absolute;height:20px;margin-top:12px;width:100%}.adf-edit-process-filter-date-error-container>div{display:flex;flex-flow:row;justify-content:flex-start}.adf-edit-process-filter-date-error-container .adf-error-text{padding-right:8px;height:16px;font-size:var(--theme-caption-font-size);line-height:1.33;color:var(--theme-warn-color);width:auto}.adf-edit-process-filter-date-error-container .adf-error-icon{font-size:var(--theme-subheading-2-font-size);color:var(--theme-warn-color)}.adf-cloud-edit-process-filter-loading-margin{margin-left:calc((100% - 100px)/2);margin-right:calc((100% - 100px)/2)}.adf-edit-process-filter-form{flex-flow:row wrap;display:flex;max-width:100%;place-content:stretch flex-start;align-items:stretch}.adf-edit-process-filter-form :not(:last-child){margin-right:10px}.adf-edit-process-filter-form mat-form-field,.adf-edit-process-filter-form adf-cloud-people{flex:1 1 23%;max-width:23%}@media (max-width: 599.9px){.adf-edit-process-filter-form{flex-flow:column}.adf-edit-process-filter-form :not(:last-child){margin-bottom:10px;margin-right:0}}.adf-edit-process-filter-header{height:48px}.adf-edit-process-filter-header__title{color:var(--adf-theme-foreground-text-color)}.adf-edit-process-filter-header__description{color:var(--adf-theme-foreground-secondary-text-color);place-content:center space-between}.adf-edit-process-filter-content__text-label,.adf-edit-process-filter-content__select-label{color:var(--adf-theme-foreground-secondary-text-color)}\n"], dependencies: [{ kind: "component", type: IconComponent, selector: "adf-icon", inputs: ["color", "fontSet", "value"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i8.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "directive", type: i10.MatAccordion, selector: "mat-accordion", inputs: ["hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i10.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i10.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i10.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "directive", type: i10.MatExpansionPanelDescription, selector: "mat-panel-description" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i11.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i11.MatLabel, selector: "mat-label" }, { kind: "directive", type: i11.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i12.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i3.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i13.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i14.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i14.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i14.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i15.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: DateRangeFilterComponent, selector: "adf-cloud-date-range-filter", inputs: ["processFilterProperty", "options"], outputs: ["dateChanged", "dateTypeChange"] }, { kind: "component", type: PeopleCloudComponent, selector: "adf-cloud-people", inputs: ["label", "appName", "mode", "roles", "validate", "readOnly", "required", "preSelectUsers", "excludedUsers", "groupsRestriction", "userChipsCtrl", "searchUserCtrl", "title", "placeholder", "hideInputOnSingleSelection", "formFieldAppearance", "formFieldSubscriptSizing", "showErrors", "showFullNameOnHover"], outputs: ["selectUser", "removeUser", "changedUsers", "warning"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
752
|
-
}
|
|
753
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EditProcessFilterCloudComponent, decorators: [{
|
|
754
|
-
type: Component,
|
|
755
|
-
args: [{ selector: 'adf-cloud-edit-process-filter', standalone: true, imports: [
|
|
756
|
-
IconComponent,
|
|
757
|
-
MatProgressSpinnerModule,
|
|
758
|
-
TranslatePipe,
|
|
759
|
-
MatButtonModule,
|
|
760
|
-
NgForOf,
|
|
761
|
-
NgIf,
|
|
762
|
-
MatExpansionModule,
|
|
763
|
-
MatFormFieldModule,
|
|
764
|
-
MatSelectModule,
|
|
765
|
-
ReactiveFormsModule,
|
|
766
|
-
MatInputModule,
|
|
767
|
-
MatDatepickerModule,
|
|
768
|
-
MatIconModule,
|
|
769
|
-
DateRangeFilterComponent,
|
|
770
|
-
PeopleCloudComponent
|
|
771
|
-
], encapsulation: ViewEncapsulation.None, template: "<mat-accordion [hideToggle]=\"isLoading\" class=\"adf-edit-process-filter\">\n <mat-expansion-panel (afterExpand)=\"onExpand()\" (closed)=\"onClose()\">\n <mat-expansion-panel-header *ngIf=\"processFilter\" id=\"adf-edit-process-filter-expansion-header\" class=\"adf-edit-process-filter-header\">\n <ng-container *ngIf=\"!isLoading; else loadingTemplate\">\n <mat-panel-title *ngIf=\"showProcessFilterName\" id=\"adf-edit-process-filter-title-id\" class=\"adf-edit-process-filter-header__title\">\n {{processFilter.name | translate}}</mat-panel-title>\n <mat-panel-description class=\"adf-edit-process-filter-header__description\" id=\"adf-edit-process-filter-sub-title-id\">\n <span *ngIf=\"showTitle\"> {{ 'ADF_CLOUD_EDIT_PROCESS_FILTER.TITLE' | translate}}</span>\n <div *ngIf=\"showFilterActions\" class=\"adf-cloud-edit-process-filter-actions\">\n <ng-container *ngIf=\"toggleFilterActions\">\n <button *ngFor=\"let filterAction of processFilterActions\"\n mat-icon-button\n [title]=\"filterAction.tooltip | translate\"\n [attr.data-automation-id]=\"'adf-filter-action-' + filterAction.actionType\"\n [disabled]=\"isDisabledAction(filterAction)\"\n (click)=\"executeFilterActions($event, filterAction)\">\n <adf-icon [value]=\"filterAction.icon\" />\n </button>\n </ng-container>\n </div>\n </mat-panel-description>\n </ng-container>\n <ng-template #loadingTemplate>\n <div class=\"adf-cloud-edit-process-filter-loading-margin\">\n <mat-spinner [diameter]=\"30\" />\n </div>\n </ng-template>\n </mat-expansion-panel-header>\n <ng-container *ngIf=\"!isLoading\">\n <form [formGroup]=\"editProcessFilterForm\" *ngIf=\"editProcessFilterForm\" class=\"adf-edit-process-filter-content\">\n <div class=\"adf-edit-process-filter-form\">\n <ng-container *ngFor=\"let processFilterProperty of processFilterProperties; trackBy: filterTracker\">\n <mat-form-field [floatLabel]=\"'auto'\" *ngIf=\"processFilterProperty.type === 'select'\" [attr.data-automation-id]=\"processFilterProperty.key\">\n <mat-label class=\"adf-edit-process-filter-content__select-label\">{{processFilterProperty.label | translate}}</mat-label>\n <mat-select\n [formControlName]=\"processFilterProperty.key\"\n [attr.data-automation-id]=\"'adf-cloud-edit-process-property-' + processFilterProperty.key\">\n <mat-option\n *ngFor=\"let propertyOption of processFilterProperty.options\"\n [value]=\"propertyOption.value\"\n [attr.data-automation-id]=\"'adf-cloud-edit-process-property-options-' + processFilterProperty.key\"\n >{{ propertyOption.label | translate }}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field [floatLabel]=\"'auto'\" *ngIf=\"processFilterProperty.type === 'multi-select'\" [attr.data-automation-id]=\"processFilterProperty.key\">\n <mat-label class=\"adf-edit-process-filter-content__select-label\">{{processFilterProperty.label | translate}}</mat-label>\n <mat-select\n [formControlName]=\"processFilterProperty.key\"\n [attr.data-automation-id]=\"'adf-cloud-edit-process-property-' + processFilterProperty.key\"\n [multiple]=\"true\">\n <mat-option *ngFor=\"let propertyOption of processFilterProperty.options\" [value]=\"propertyOption.value\" [attr.data-automation-id]=\"'adf-cloud-edit-process-property-options-' + processFilterProperty.key\">\n {{ propertyOption.label | translate }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field [floatLabel]=\"'auto'\" *ngIf=\"processFilterProperty.type === 'text'\" [attr.data-automation-id]=\"processFilterProperty.key\">\n <mat-label class=\"adf-edit-process-filter-content__text-label\">{{processFilterProperty.label | translate}}</mat-label>\n <input matInput\n [formControlName]=\"processFilterProperty.key\"\n type=\"text\"\n [attr.data-automation-id]=\"'adf-cloud-edit-process-property-' + processFilterProperty.key\"/>\n </mat-form-field>\n <mat-form-field [floatLabel]=\"'auto'\" *ngIf=\"processFilterProperty.type === 'number'\" [attr.data-automation-id]=\"processFilterProperty.key\">\n <input matInput\n [formControlName]=\"processFilterProperty.key\"\n type=\"number\" min=\"0\"\n placeholder=\"{{processFilterProperty.label | translate}}\"\n [attr.data-automation-id]=\"'adf-cloud-edit-process-property-' + processFilterProperty.key\"/>\n </mat-form-field>\n <mat-form-field [floatLabel]=\"'auto'\" *ngIf=\"processFilterProperty.type === 'date'\" [attr.data-automation-id]=\"processFilterProperty.key\">\n <mat-label>{{processFilterProperty.label | translate}}</mat-label>\n <input\n matInput\n [formControlName]=\"processFilterProperty.key\"\n (keyup)=\"onDateChanged($any($event).target.value, processFilterProperty)\"\n (dateChange)=\"onDateChanged($event.value, processFilterProperty)\"\n [matDatepicker]=\"dateController\"\n placeholder=\"{{processFilterProperty.label | translate}}\"\n [attr.data-automation-id]=\"'adf-cloud-edit-process-property-' + processFilterProperty.key\">\n <mat-datepicker-toggle\n matSuffix [for]=\"dateController\"\n [attr.data-automation-id]=\"'adf-cloud-edit-process-property-date-toggle-' + processFilterProperty.key\" />\n <mat-datepicker #dateController [attr.data-automation-id]=\"'adf-cloud-edit-process-property-date-picker-' + processFilterProperty.key\" />\n <div class=\"adf-edit-process-filter-date-error-container\">\n <div *ngIf=\"hasError(processFilterProperty)\">\n <div class=\"adf-error-text\">{{'ADF_CLOUD_EDIT_PROCESS_FILTER.ERROR.DATE' | translate}}</div>\n <mat-icon class=\"adf-error-icon\">warning</mat-icon>\n </div>\n </div>\n </mat-form-field>\n\n <adf-cloud-date-range-filter *ngIf=\"processFilterProperty.type === 'date-range'\"\n [processFilterProperty]=\"processFilterProperty\"\n [options]=\"processFilterProperty.dateFilterOptions\"\n (dateTypeChange)=\"onDateTypeChange($event, processFilterProperty)\"\n (dateChanged)=\"onDateRangeFilterChanged($event, processFilterProperty)\" />\n <adf-cloud-people\n *ngIf=\"processFilterProperty.type === 'people'\"\n [preSelectUsers]=\"initiatorOptions\"\n [title]=\"processFilterProperty.label\"\n [validate]=\"true\"\n [appName]=\"appName\"\n [mode]=\"processFilterProperty.selectionMode\"\n (changedUsers)=\"onChangedUser($event, processFilterProperty)\" />\n </ng-container>\n </div>\n </form>\n </ng-container>\n </mat-expansion-panel>\n</mat-accordion>\n", styles: [".adf-edit-process-filter-date-error-container{position:absolute;height:20px;margin-top:12px;width:100%}.adf-edit-process-filter-date-error-container>div{display:flex;flex-flow:row;justify-content:flex-start}.adf-edit-process-filter-date-error-container .adf-error-text{padding-right:8px;height:16px;font-size:var(--theme-caption-font-size);line-height:1.33;color:var(--theme-warn-color);width:auto}.adf-edit-process-filter-date-error-container .adf-error-icon{font-size:var(--theme-subheading-2-font-size);color:var(--theme-warn-color)}.adf-cloud-edit-process-filter-loading-margin{margin-left:calc((100% - 100px)/2);margin-right:calc((100% - 100px)/2)}.adf-edit-process-filter-form{flex-flow:row wrap;display:flex;max-width:100%;place-content:stretch flex-start;align-items:stretch}.adf-edit-process-filter-form :not(:last-child){margin-right:10px}.adf-edit-process-filter-form mat-form-field,.adf-edit-process-filter-form adf-cloud-people{flex:1 1 23%;max-width:23%}@media (max-width: 599.9px){.adf-edit-process-filter-form{flex-flow:column}.adf-edit-process-filter-form :not(:last-child){margin-bottom:10px;margin-right:0}}.adf-edit-process-filter-header{height:48px}.adf-edit-process-filter-header__title{color:var(--adf-theme-foreground-text-color)}.adf-edit-process-filter-header__description{color:var(--adf-theme-foreground-secondary-text-color);place-content:center space-between}.adf-edit-process-filter-content__text-label,.adf-edit-process-filter-content__select-label{color:var(--adf-theme-foreground-secondary-text-color)}\n"] }]
|
|
772
|
-
}], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.MatDialog }, { type: i3.DateAdapter }, { type: i4.UserPreferencesService }, { type: i4.TranslationService }, { type: i5.ProcessFilterCloudService }, { type: i6.AppsProcessCloudService }, { type: i7.ProcessCloudService }], propDecorators: { appName: [{
|
|
773
|
-
type: Input
|
|
774
|
-
}], role: [{
|
|
775
|
-
type: Input
|
|
776
|
-
}], id: [{
|
|
777
|
-
type: Input
|
|
778
|
-
}], filterProperties: [{
|
|
779
|
-
type: Input
|
|
780
|
-
}], sortProperties: [{
|
|
781
|
-
type: Input
|
|
782
|
-
}], actions: [{
|
|
783
|
-
type: Input
|
|
784
|
-
}], environmentId: [{
|
|
785
|
-
type: Input
|
|
786
|
-
}], environmentList: [{
|
|
787
|
-
type: Input
|
|
788
|
-
}], showFilterActions: [{
|
|
789
|
-
type: Input
|
|
790
|
-
}], showTitle: [{
|
|
791
|
-
type: Input
|
|
792
|
-
}], showProcessFilterName: [{
|
|
793
|
-
type: Input
|
|
794
|
-
}], filterChange: [{
|
|
795
|
-
type: Output
|
|
796
|
-
}], action: [{
|
|
797
|
-
type: Output
|
|
798
|
-
}], processFilter: [{
|
|
799
|
-
type: Input
|
|
800
|
-
}] } });
|
|
801
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdC1wcm9jZXNzLWZpbHRlci1jbG91ZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWIvcHJvY2Vzcy1zZXJ2aWNlcy1jbG91ZC9zcmMvbGliL3Byb2Nlc3MvcHJvY2Vzcy1maWx0ZXJzL2NvbXBvbmVudHMvZWRpdC1wcm9jZXNzLWZpbHRlci9lZGl0LXByb2Nlc3MtZmlsdGVyLWNsb3VkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9wcm9jZXNzLXNlcnZpY2VzLWNsb3VkL3NyYy9saWIvcHJvY2Vzcy9wcm9jZXNzLWZpbHRlcnMvY29tcG9uZW50cy9lZGl0LXByb2Nlc3MtZmlsdGVyL2VkaXQtcHJvY2Vzcy1maWx0ZXItY2xvdWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBaUIsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEosT0FBTyxFQUFtQixXQUFXLEVBQTBCLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0csT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWhGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQzlGLE9BQU8sRUFFSCx1QkFBdUIsRUFJMUIsTUFBTSx5Q0FBeUMsQ0FBQztBQUNqRCxPQUFPLEVBQUUsWUFBWSxFQUFF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QkFERCxLQUFLO2dCQUtOLGdCQUFnQjtzQkFEZixLQUFLO2dCQUtOLGNBQWM7c0JBRGIsS0FBSztnQkFLTixPQUFPO3NCQUROLEtBQUs7Z0JBS04sYUFBYTtzQkFEWixLQUFLO2dCQUtOLGVBQWU7c0JBRGQsS0FBSztnQkFLTixpQkFBaUI7c0JBRGhCLEtBQUs7Z0JBS04sU0FBUztzQkFEUixLQUFLO2dCQUtOLHFCQUFxQjtzQkFEcEIsS0FBSztnQkFLTixZQUFZO3NCQURYLE1BQU07Z0JBS1AsTUFBTTtzQkFETCxNQUFNO2dCQVlILGFBQWE7c0JBRGhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgwqkgMjAwNS0yMDI1IEh5bGFuZCBTb2Z0d2FyZSwgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCwgRGVzdHJveVJlZiwgRXZlbnRFbWl0dGVyLCBpbmplY3QsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERhdGVBZGFwdGVyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmaWx0ZXIsIGZpbmFsaXplLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQXBwc1Byb2Nlc3NDbG91ZFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9hcHAvc2VydmljZXMvYXBwcy1wcm9jZXNzLWNsb3VkLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgICBQcm9jZXNzRmlsdGVyQWN0aW9uLFxuICAgIFByb2Nlc3NGaWx0ZXJDbG91ZE1vZGVsLFxuICAgIFByb2Nlc3NGaWx0ZXJPcHRpb25zLFxuICAgIFByb2Nlc3NGaWx0ZXJQcm9wZXJ0aWVzLFxuICAgIFByb2Nlc3NTb3J0RmlsdGVyUHJvcGVydHlcbn0gZnJvbSAnLi4vLi4vbW9kZWxzL3Byb2Nlc3MtZmlsdGVyLWNsb3VkLm1vZGVsJztcbmltcG9ydCB7IERhdGVGbnNVdGlscywgSWNvbkNvbXBvbmVudCwgVHJhbnNsYXRpb25TZXJ2aWNlLCBVc2VyUHJlZmVyZW5jZXNTZXJ2aWNlLCBVc2VyUHJlZmVyZW5jZVZhbHVlcyB9IGZyb20gJ0BhbGZyZXNjby9hZGYtY29yZSc7XG5pbXBvcnQgeyBQcm9jZXNzRmlsdGVyQ2xvdWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcHJvY2Vzcy1maWx0ZXItY2xvdWQuc2VydmljZSc7XG5pbXBvcnQgeyBQcm9jZXNzRmlsdGVyRGlhbG9nQ2xvdWRDb21wb25lbnQgfSBmcm9tICcuLi9wcm9jZXNzLWZpbHRlci1kaWFsb2cvcHJvY2Vzcy1maWx0ZXItZGlhbG9nLWNsb3VkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQcm9jZXNzQ2xvdWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcHJvY2Vzcy1jbG91ZC5zZXJ2aWNlJztcbmltcG9ydCB7IERhdGVDbG91ZEZpbHRlclR5cGUsIERhdGVSYW5nZUZpbHRlciB9IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscy9kYXRlLWNsb3VkLWZpbHRlci5tb2RlbCc7XG5pbXBvcnQgeyBJZGVudGl0eVVzZXJNb2RlbCB9IGZyb20gJy4uLy4uLy4uLy4uL3Blb3BsZS9tb2RlbHMvaWRlbnRpdHktdXNlci5tb2RlbCc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudCB9IGZyb20gJy4uLy4uLy4uLy4uL2NvbW1vbi9pbnRlcmZhY2UvZW52aXJvbm1lbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IGVuZE9mRGF5LCBpc1ZhbGlkLCBzdGFydE9mRGF5IH0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3Mtc3Bpbm5lcic7XG5pbXBvcnQgeyBUcmFuc2xhdGVQaXBlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTmdGb3JPZiwgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBNYXRFeHBhbnNpb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9leHBhbnNpb24nO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRTZWxlY3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBNYXREYXRlcGlja2VyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBEYXRlUmFuZ2VGaWx0ZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9jb21tb24vZGF0ZS1yYW5nZS1maWx0ZXIvZGF0ZS1yYW5nZS1maWx0ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFBlb3BsZUNsb3VkQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vcGVvcGxlL2NvbXBvbmVudHMvcGVvcGxlLWNsb3VkLmNvbXBvbmVudCc7XG5cbmV4cG9ydCBjb25zdCBQUk9DRVNTX0ZJTFRFUl9BQ1RJT05fU0FWRSA9ICdzYXZlJztcbmV4cG9ydCBjb25zdCBQUk9DRVNTX0ZJTFRFUl9BQ1RJT05fU0FWRV9BUyA9ICdzYXZlQXMnO1xuZXhwb3J0IGNvbnN0IFBST0NFU1NfRklMVEVSX0FDVElPTl9ERUxFVEUgPSAnZGVsZXRlJztcbmV4cG9ydCBjb25zdCBQUk9DRVNTX0ZJTFRFUl9BQ1RJT05fU0FWRV9ERUZBVUxUID0gJ3NhdmVEZWZhdWx0RmlsdGVyJztcbmV4cG9ydCBjb25zdCBQUk9DRVNTX0ZJTFRFUl9BQ1RJT05fUkVTVE9SRSA9ICdyZXN0b3JlRGVmYXVsdEZpbHRlcic7XG5jb25zdCBERUZBVUxUX1BST0NFU1NfRklMVEVSX1BST1BFUlRJRVMgPSBbJ3N0YXR1cycsICdzb3J0JywgJ29yZGVyJywgJ2xhc3RNb2RpZmllZCddO1xuY29uc3QgREVGQVVMVF9TT1JUX1BST1BFUlRJRVMgPSBbJ2lkJywgJ25hbWUnLCAnc3RhdHVzJywgJ3N0YXJ0RGF0ZSddO1xuY29uc3QgREVGQVVMVF9BQ1RJT05TID0gWydzYXZlJywgJ3NhdmVBcycsICdkZWxldGUnXTtcblxuZXhwb3J0IGludGVyZmFjZSBEcm9wZG93bk9wdGlvbiB7XG4gICAgdmFsdWU6IHN0cmluZztcbiAgICBsYWJlbDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUHJvY2Vzc0ZpbHRlckZvcm1Qcm9wcyB7XG4gICAgYXBwTmFtZT86IEZvcm1Db250cm9sPHN0cmluZz47XG4gICAgYXBwVmVyc2lvbj86IEZvcm1Db250cm9sPG51bWJlciB8IG51bWJlcltdPjtcbiAgICBwcm9jZXNzRGVmaW5pdGlvbk5hbWU/OiBGb3JtQ29udHJvbDxzdHJpbmc+O1xuICAgIGxhc3RNb2RpZmllZEZyb20/OiBGb3JtQ29udHJvbDxEYXRlPjtcbiAgICBsYXN0TW9kaWZpZWRUbz86IEZvcm1Db250cm9sPERhdGU+O1xuICAgIHN0YXR1cz86IEZvcm1Db250cm9sPHN0cmluZz47XG4gICAgb3JkZXI/OiBGb3JtQ29udHJvbDxzdHJpbmc+O1xuICAgIHNvcnQ/OiBGb3JtQ29udHJvbDxzdHJpbmc+O1xuICAgIGNvbXBsZXRlZERhdGVUeXBlPzogRm9ybUNvbnRyb2w8RGF0ZUNsb3VkRmlsdGVyVHlwZT47XG4gICAgW3g6IHN0cmluZ106IEZvcm1Db250cm9sPHVua25vd24+O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FkZi1jbG91ZC1lZGl0LXByb2Nlc3MtZmlsdGVyJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgSWNvbkNvbXBvbmVudCxcbiAgICAgICAgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlLFxuICAgICAgICBUcmFuc2xhdGVQaXBlLFxuICAgICAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgICAgIE5nRm9yT2YsXG4gICAgICAgIE5nSWYsXG4gICAgICAgIE1hdEV4cGFuc2lvbk1vZHVsZSxcbiAgICAgICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxuICAgICAgICBNYXRTZWxlY3RNb2R1bGUsXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgICAgIE1hdElucHV0TW9kdWxlLFxuICAgICAgICBNYXREYXRlcGlja2VyTW9kdWxlLFxuICAgICAgICBNYXRJY29uTW9kdWxlLFxuICAgICAgICBEYXRlUmFuZ2VGaWx0ZXJDb21wb25lbnQsXG4gICAgICAgIFBlb3BsZUNsb3VkQ29tcG9uZW50XG4gICAgXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZWRpdC1wcm9jZXNzLWZpbHRlci1jbG91ZC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZWRpdC1wcm9jZXNzLWZpbHRlci1jbG91ZC5jb21wb25lbnQuc2NzcyddLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgRWRpdFByb2Nlc3NGaWx0ZXJDbG91ZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgICAvKiogVGhlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgYXBwTmFtZTogc3RyaW5nID0gJyc7XG5cbiAgICAvKiogcm9sZXMgdG8gZmlsdGVyIHRoZSBhcHBzICovXG4gICAgQElucHV0KClcbiAgICByb2xlOiBzdHJpbmcgPSAnJztcblxuICAgIC8qKiBJZCBvZiB0aGUgcHJvY2VzcyBpbnN0YW5jZSBmaWx0ZXIuICovXG4gICAgQElucHV0KClcbiAgICBpZDogc3RyaW5nO1xuXG4gICAgLyoqIExpc3Qgb2YgcHJvY2VzcyBmaWx0ZXIgcHJvcGVydGllcyB0byBkaXNwbGF5ICovXG4gICAgQElucHV0KClcbiAgICBmaWx0ZXJQcm9wZXJ0aWVzID0gREVGQVVMVF9QUk9DRVNTX0ZJTFRFUl9QUk9QRVJUSUVTO1xuXG4gICAgLyoqIExpc3Qgb2Ygc29ydCBwcm9wZXJ0aWVzIHRvIGRpc3BsYXkuICovXG4gICAgQElucHV0KClcbiAgICBzb3J0UHJvcGVydGllcyA9IERFRkFVTFRfU09SVF9QUk9QRVJUSUVTO1xuXG4gICAgLyoqIExpc3Qgb2Ygc29ydCBhY3Rpb25zLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgYWN0aW9ucyA9IERFRkFVTFRfQUNUSU9OUztcblxuICAgIC8qKiBFbnZpcm9ubWVudCBJRCBvZiB0aGUgYXBwbGljYXRpb24uICovXG4gICAgQElucHV0KClcbiAgICBlbnZpcm9ubWVudElkOiBzdHJpbmc7XG5cbiAgICAvKiogTGlzdCBvZiBlbnZpcm9ubWVudHMuICovXG4gICAgQElucHV0KClcbiAgICBlbnZpcm9ubWVudExpc3Q6IEVudmlyb25tZW50W10gPSBbXTtcblxuICAgIC8qKiBUb2dnbGVzIGVkaXRpbmcgb2YgcHJvY2VzcyBmaWx0ZXIgYWN0aW9ucy4gKi9cbiAgICBASW5wdXQoKVxuICAgIHNob3dGaWx0ZXJBY3Rpb25zID0gdHJ1ZTtcblxuICAgIC8qKiBUb2dnbGVzIGVkaXRpbmcgb2YgdGhlIHByb2Nlc3MgZmlsdGVyIHRpdGxlLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2hvd1RpdGxlID0gdHJ1ZTtcblxuICAgIC8qKiBUb2dnbGVzIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSBwcm9jZXNzIGZpbHRlciBuYW1lIC4gKi9cbiAgICBASW5wdXQoKVxuICAgIHNob3dQcm9jZXNzRmlsdGVyTmFtZSA9IHRydWU7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIGEgcHJvY2VzcyBpbnN0YW5jZSBmaWx0ZXIgcHJvcGVydHkgY2hhbmdlcy4gKi9cbiAgICBAT3V0cHV0KClcbiAgICBmaWx0ZXJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFByb2Nlc3NGaWx0ZXJDbG91ZE1vZGVsPigpO1xuXG4gICAgLyoqIEVtaXR0ZWQgd2hlbiBhIGZpbHRlciBhY3Rpb24gb2NjdXJzIGkuZSBTYXZlLCBTYXZlQXMsIERlbGV0ZS4gKi9cbiAgICBAT3V0cHV0KClcbiAgICBhY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPFByb2Nlc3NGaWx0ZXJBY3Rpb24+KCk7XG5cbiAgICBwcml2YXRlIF9maWx0ZXI6IFByb2Nlc3NGaWx0ZXJDbG91ZE1vZGVsO1xuICAgIHByb3RlY3RlZCBmaWx0ZXJIYXNCZWVuQ2hhbmdlZCA9IGZhbHNlO1xuXG4gICAgZ2V0IHByb2Nlc3NGaWx0ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXI7XG4gICAgfVxuXG4gICAgLyoqIFByb2Nlc3MgZmlsdGVyICovXG4gICAgQElucHV0KClcbiAgICBzZXQgcHJvY2Vzc0ZpbHRlcih2YWx1ZTogUHJvY2Vzc0ZpbHRlckNsb3VkTW9kZWwpIHtcbiAgICAgICAgY29uc3QgaXNDaGFuZ2VkID0gdGhpcy5pc0ZpbHRlckNoYW5nZWQodGhpcy5fZmlsdGVyLCB2YWx1ZSk7XG5cbiAgICAgICAgdGhpcy5fZmlsdGVyID0gdmFsdWU7XG5cbiAgICAgICAgaWYgKHZhbHVlPy5hcHBOYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmFwcE5hbWUgPSB2YWx1ZS5hcHBOYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlPy5pZCkge1xuICAgICAgICAgICAgdGhpcy5pZCA9IHZhbHVlLmlkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlPy5lbnZpcm9ubWVudElkKSB7XG4gICAgICAgICAgICB0aGlzLmVudmlyb25tZW50SWQgPSB2YWx1ZS5lbnZpcm9ubWVudElkO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wcm9jZXNzRmlsdGVyUHJvcGVydGllcyA9IHRoaXMuY3JlYXRlQW5kRmlsdGVyUHJvcGVydGllcygpO1xuICAgICAgICB0aGlzLnByb2Nlc3NGaWx0ZXJBY3Rpb25zID0gdGhpcy5jcmVhdGVBbmRGaWx0ZXJBY3Rpb25zKCk7XG4gICAgICAgIHRoaXMuYnVpbGRGb3JtKHRoaXMucHJvY2Vzc0ZpbHRlclByb3BlcnRpZXMpO1xuXG4gICAgICAgIGlmIChpc0NoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyQ2hhbmdlLmVtaXQodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdHVzOiBBcnJheTxEcm9wZG93bk9wdGlvbj4gPSBbXG4gICAgICAgIHsgdmFsdWU6ICcnLCBsYWJlbDogJ0FERl9DTE9VRF9QUk9DRVNTX0ZJTFRFUlMuU1RBVFVTLkFMTCcgfSxcbiAgICAgICAgeyB2YWx1ZTogJ1JVTk5JTkcnLCBsYWJlbDogJ0FERl9DTE9VRF9QUk9DRVNTX0ZJTFRFUlMuU1RBVFVTLlJVTk5JTkcnIH0sXG4gICAgICAgIHsgdmFsdWU6ICdTVVNQRU5ERUQnLCBsYWJlbDogJ0FERl9DTE9VRF9QUk9DRVNTX0ZJTFRFUlMuU1RBVFVTLlNVU1BFTkRFRCcgfSxcbiAgICAgICAgeyB2YWx1ZTogJ0NBTkNFTExFRCcsIGxhYmVsOiAnQURGX0NMT1VEX1BST0NFU1NfRklMVEVSUy5TVEFUVVMuQ0FOQ0VMTEVEJyB9LFxuICAgICAgICB7IHZhbHVlOiAnQ09NUExFVEVEJywgbGFiZWw6ICdBREZfQ0xPVURfUFJPQ0VTU19GSUxURVJTLlNUQVRVUy5DT01QTEVURUQnIH1cbiAgICBdO1xuICAgIGRpcmVjdGlvbnM6IEFycmF5PERyb3Bkb3duT3B0aW9uPiA9IFtcbiAgICAgICAgeyB2YWx1ZTogJ0FTQycsIGxhYmVsOiAnQURGX0NMT1VEX1BST0NFU1NfRklMVEVSUy5ESVJFQ1RJT04uQVNDRU5ESU5HJyB9LFxuICAgICAgICB7IHZhbHVlOiAnREVTQycsIGxhYmVsOiAnQURGX0NMT1VEX1BST0NFU1NfRklMVEVSUy5ESVJFQ1RJT04uREVTQ0VORElORycgfVxuICAgIF07XG4gICAgYWN0aW9uRGlzYWJsZWRGb3JEZWZhdWx0ID0gW1BST0NFU1NfRklMVEVSX0FDVElPTl9TQVZFLCBQUk9DRVNTX0ZJTFRFUl9BQ1RJT05fREVMRVRFXTtcbiAgICBhcHBsaWNhdGlvbk5hbWVzOiBhbnlbXSA9IFtdO1xuICAgIGFsbFByb2Nlc3NEZWZpbml0aW9uTmFtZXNPcHRpb246IERyb3Bkb3duT3B0aW9uID0ge1xuICAgICAgICBsYWJlbDogJ0FERl9DTE9VRF9QUk9DRVNTX0ZJTFRFUlMuU1RBVFVTLkFMTCcsXG4gICAgICAgIHZhbHVlOiAnJ1xuICAgIH07XG4gICAgcHJvY2Vzc0RlZmluaXRpb25OYW1lczogYW55W10gPSBbXTtcbiAgICBlZGl0UHJvY2Vzc0ZpbHRlckZvcm06IEZvcm1Hcm91cDxQcm9jZXNzRmlsdGVyRm9ybVByb3BzPjtcbiAgICBwcm9jZXNzRmlsdGVyUHJvcGVydGllczogUHJvY2Vzc0ZpbHRlclByb3BlcnRpZXNbXSA9IFtdO1xuICAgIHByb2Nlc3NGaWx0ZXJBY3Rpb25zOiBQcm9jZXNzRmlsdGVyQWN0aW9uW10gPSBbXTtcbiAgICB0b2dnbGVGaWx0ZXJBY3Rpb25zOiBib29sZWFuID0gZmFsc2U7XG4gICAgYXBwVmVyc2lvbk9wdGlvbnM6IFByb2Nlc3NGaWx0ZXJPcHRpb25zW10gPSBbXTtcbiAgICBpbml0aWF0b3JPcHRpb25zOiBJZGVudGl0eVVzZXJNb2RlbFtdID0gW107XG5cbiAgICBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwcml2YXRlIGZpbHRlckNoYW5nZVN1YjogU3Vic2NyaXB0aW9uO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxuICAgICAgICBwdWJsaWMgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgICAgIHByaXZhdGUgZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyPERhdGU+LFxuICAgICAgICBwcml2YXRlIHVzZXJQcmVmZXJlbmNlc1NlcnZpY2U6IFVzZXJQcmVmZXJlbmNlc1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRpb25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHByb2Nlc3NGaWx0ZXJDbG91ZFNlcnZpY2U6IFByb2Nlc3NGaWx0ZXJDbG91ZFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgYXBwc1Byb2Nlc3NDbG91ZFNlcnZpY2U6IEFwcHNQcm9jZXNzQ2xvdWRTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHByb2Nlc3NDbG91ZFNlcnZpY2U6IFByb2Nlc3NDbG91ZFNlcnZpY2VcbiAgICApIHt9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy51c2VyUHJlZmVyZW5jZXNTZXJ2aWNlXG4gICAgICAgICAgICAuc2VsZWN0KFVzZXJQcmVmZXJlbmNlVmFsdWVzLkxvY2FsZSlcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgobG9jYWxlKSA9PiB0aGlzLmRhdGVBZGFwdGVyLnNldExvY2FsZShsb2NhbGUpKTtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgICAgIGNvbnN0IGlkID0gY2hhbmdlc1snaWQnXTtcbiAgICAgICAgaWYgKGlkICYmIGlkLmN1cnJlbnRWYWx1ZSAhPT0gaWQucHJldmlvdXNWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5yZXRyaWV2ZVByb2Nlc3NGaWx0ZXJBbmRCdWlsZEZvcm0oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmaWx0ZXJUcmFja2VyKF9pbmRleDogbnVtYmVyLCBpdGVtOiBQcm9jZXNzRmlsdGVyUHJvcGVydGllcykge1xuICAgICAgICByZXR1cm4gaXRlbS5rZXk7XG4gICAgfVxuXG4gICAgYnVpbGRGb3JtKHByb2Nlc3NGaWx0ZXJQcm9wZXJ0aWVzOiBQcm9jZXNzRmlsdGVyUHJvcGVydGllc1tdKSB7XG4gICAgICAgIHRoaXMuZWRpdFByb2Nlc3NGaWx0ZXJGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh0aGlzLmdldEZvcm1Db250cm9sc0NvbmZpZyhwcm9jZXNzRmlsdGVyUHJvcGVydGllcykpO1xuICAgICAgICB0aGlzLm9uRmlsdGVyQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgZ2V0Rm9ybUNvbnRyb2xzQ29uZmlnKHByb2Nlc3NGaWx0ZXJQcm9wZXJ0aWVzOiBQcm9jZXNzRmlsdGVyUHJvcGVydGllc1tdKTogYW55IHtcbiAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IHByb2Nlc3NGaWx0ZXJQcm9wZXJ0aWVzLm1hcCgocHJvcGVydHkpID0+IHtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5hdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlc0NvbnRyb2xDb25maWcocHJvcGVydHkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBbcHJvcGVydHkua2V5XTogcHJvcGVydHkudmFsdWUgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzLnJlZHVjZSgocmVzdWx0LCBjdXJyZW50KSA9PiBPYmplY3QuYXNzaWduKHJlc3VsdCwgY3VycmVudCksIHt9KTtcbiAgICB9XG5cbiAgICBnZXQgbGFzdE1vZGlmaWVkRnJvbSgpOiBBYnN0cmFjdENvbnRyb2w8RGF0ZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0UHJvY2Vzc0ZpbHRlckZvcm0uZ2V0KCdsYXN0TW9kaWZpZWRGcm9tJyk7XG4gICAgfVxuXG4gICAgZ2V0IGxhc3RNb2RpZmllZFRvKCk6IEFic3RyYWN0Q29udHJvbDxEYXRlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRQcm9jZXNzRmlsdGVyRm9ybS5nZXQoJ2xhc3RNb2RpZmllZFRvJyk7XG4gICAgfVxuXG4gICAgZ2V0IGNvbXBsZXRlZERhdGVUeXBlKCk6IEFic3RyYWN0Q29udHJvbDxEYXRlQ2xvdWRGaWx0ZXJUeXBlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRQcm9jZXNzRmlsdGVyRm9ybS5nZXQoJ2NvbXBsZXRlZERhdGVUeXBlJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRBdHRyaWJ1dGVzQ29udHJvbENvbmZpZyhwcm9wZXJ0eTogUHJvY2Vzc0ZpbHRlclByb3BlcnRpZXMpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMocHJvcGVydHkuYXR0cmlidXRlcykucmVkdWNlKChyZXN1bHQsIGtleSkgPT4ge1xuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBwcm9wZXJ0eS52YWx1ZVtrZXldO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSwge30pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZldGNoZXMgcHJvY2VzcyBpbnN0YW5jZSBmaWx0ZXIgYnkgYXBwbGljYXRpb24gbmFtZSBhbmQgZmlsdGVyIGlkIGFuZCBjcmVhdGVzIGZpbHRlciBwcm9wZXJ0aWVzLCBidWlsZCBmb3JtXG4gICAgICovXG4gICAgcmV0cmlldmVQcm9jZXNzRmlsdGVyQW5kQnVpbGRGb3JtKCkge1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMucHJvY2Vzc0ZpbHRlckNsb3VkU2VydmljZVxuICAgICAgICAgICAgLmdldEZpbHRlckJ5SWQodGhpcy5hcHBOYW1lLCB0aGlzLmlkKVxuICAgICAgICAgICAgLnBpcGUoZmluYWxpemUoKCkgPT4gKHRoaXMuaXNMb2FkaW5nID0gZmFsc2UpKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJIYXNCZWVuQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0ZpbHRlciA9IG5ldyBQcm9jZXNzRmlsdGVyQ2xvdWRNb2RlbChPYmplY3QuYXNzaWduKHt9LCByZXNwb25zZSB8fCB7fSwgdGhpcy5wcm9jZXNzRmlsdGVyIHx8IHt9KSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBwcm9jZXNzIGluc3RhbmNlIGZpbHRlciBjaGFuZ2VzXG4gICAgICovXG4gICAgb25GaWx0ZXJDaGFuZ2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmZpbHRlckNoYW5nZVN1Yikge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJDaGFuZ2VTdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyQ2hhbmdlU3ViID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlsdGVyQ2hhbmdlU3ViID0gdGhpcy5lZGl0UHJvY2Vzc0ZpbHRlckZvcm0udmFsdWVDaGFuZ2VzXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUoNTAwKSxcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5pc0Zvcm1WYWxpZCgpKSxcbiAgICAgICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZm9ybVZhbHVlczogUGFydGlhbDxQcm9jZXNzRmlsdGVyQ2xvdWRNb2RlbD4pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldExhc3RNb2RpZmllZEZyb21GaWx0ZXIoZm9ybVZhbHVlcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRMYXN0TW9kaWZpZWRUb0ZpbHRlcihmb3JtVmFsdWVzKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gbmV3IFByb2Nlc3NGaWx0ZXJDbG91ZE1vZGVsKE9iamVjdC5hc3NpZ24oe30sIHRoaXMucHJvY2Vzc0ZpbHRlciwgZm9ybVZhbHVlcykpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5nZWQgPSAhdGhpcy5jb21wYXJlRmlsdGVycyhuZXdWYWx1ZSwgdGhpcy5wcm9jZXNzRmlsdGVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckhhc0JlZW5DaGFuZ2VkID0gY2hhbmdlZDtcblxuICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpbHRlciA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckNoYW5nZS5lbWl0KG5ld1ZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjcmVhdGVBbmRGaWx0ZXJQcm9wZXJ0aWVzKCk6IFByb2Nlc3NGaWx0ZXJQcm9wZXJ0aWVzW10ge1xuICAgICAgICB0aGlzLmNoZWNrTWFuZGF0b3J5RmlsdGVyUHJvcGVydGllcygpO1xuXG4gICAgICAgIGlmICh0aGlzLmZpbHRlclByb3BlcnRpZXMuaW5jbHVkZXMoJ2FwcE5hbWUnKSkge1xuICAgICAgICAgICAgdGhpcy5nZXREZXBsb3llZEFwcGxpY2F0aW9ucygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyUHJvcGVydGllcy5pbmNsdWRlcygncHJvY2Vzc0RlZmluaXRpb25OYW1lJykpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0UHJvY2Vzc0RlZmluaXRpb25zKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5maWx0ZXJQcm9wZXJ0aWVzLmluY2x1ZGVzKCdhcHBWZXJzaW9uTXVsdGlwbGUnKSkge1xuICAgICAgICAgICAgdGhpcy5nZXRBcHBWZXJzaW9uT3B0aW9ucygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyUHJvcGVydGllcy5pbmNsdWRlcygnaW5pdGlhdG9yJykpIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhdG9yT3B0aW9ucyA9IHRoaXMucHJvY2Vzc0ZpbHRlci5pbml0aWF0b3JcbiAgICAgICAgICAgICAgICA/IHRoaXMucHJvY2Vzc0ZpbHRlci5pbml0aWF0b3Iuc3BsaXQoJywnKS5tYXAoKHVzZXJuYW1lKSA9PiBPYmplY3QuYXNzaWduKHt9LCB7IHVzZXJuYW1lIH0pKVxuICAgICAgICAgICAgICAgIDogW107XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWZhdWx0UHJvcGVydGllcyA9IHRoaXMuY3JlYXRlUHJvY2Vzc0ZpbHRlclByb3BlcnRpZXModGhpcy5wcm9jZXNzRmlsdGVyKTtcbiAgICAgICAgbGV0IGZpbHRlcmVkUHJvcGVydGllcyA9IGRlZmF1bHRQcm9wZXJ0aWVzLmZpbHRlcigoZmlsdGVyUHJvcGVydHkpID0+IHRoaXMuaXNWYWxpZFByb3BlcnR5KHRoaXMuZmlsdGVyUHJvcGVydGllcywgZmlsdGVyUHJvcGVydHkua2V5KSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmZpbHRlclByb3BlcnRpZXMuaW5jbHVkZXMoJ3NvcnQnKSkge1xuICAgICAgICAgICAgZmlsdGVyZWRQcm9wZXJ0aWVzID0gZmlsdGVyZWRQcm9wZXJ0aWVzLmZpbHRlcigocHJvcGVydHkpID0+IHByb3BlcnR5LmtleSAhPT0gJ29yZGVyJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5maWx0ZXJQcm9wZXJ0aWVzLmluY2x1ZGVzKCdsYXN0TW9kaWZpZWQnKSkge1xuICAgICAgICAgICAgZmlsdGVyZWRQcm9wZXJ0aWVzID0gWy4uLmZpbHRlcmVkUHJvcGVydGllcywgLi4udGhpcy5jcmVhdGVMYXN0TW9kaWZpZWRQcm9wZXJ0eSh0aGlzLnByb2Nlc3NGaWx0ZXIpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaWx0ZXJlZFByb3BlcnRpZXM7XG4gICAgfVxuXG4gICAgY2hlY2tNYW5kYXRvcnlGaWx0ZXJQcm9wZXJ0aWVzKCkge1xuICAgICAgICBpZiAodGhpcy5maWx0ZXJQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgfHwgdGhpcy5maWx0ZXJQcm9wZXJ0aWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJQcm9wZXJ0aWVzID0gREVGQVVMVF9QUk9DRVNTX0ZJTFRFUl9QUk9QRVJUSUVTO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1ZhbGlkUHJvcGVydHkoZmlsdGVyUHJvcGVydGllczogc3RyaW5nW10sIGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmaWx0ZXJQcm9wZXJ0aWVzID8gZmlsdGVyUHJvcGVydGllcy5pbmRleE9mKGtleSkgPj0gMCA6IHRydWU7XG4gICAgfVxuXG4gICAgZ2V0IGNyZWF0ZVNvcnRQcm9wZXJ0aWVzKCk6IFByb2Nlc3NGaWx0ZXJPcHRpb25zW10ge1xuICAgICAgICB0aGlzLmNoZWNrTWFuZGF0b3J5U29ydFByb3BlcnRpZXMoKTtcbiAgICAgICAgY29uc3QgZGVmYXVsdFNvcnRQcm9wZXJ0aWVzID0gdGhpcy5jcmVhdGVQcm9jZXNzU29ydFByb3BlcnRpZXMoKTtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRTb3J0UHJvcGVydGllcy5maWx0ZXIoKHNvcnRQcm9wZXJ0eSkgPT4gdGhpcy5pc1ZhbGlkUHJvcGVydHkodGhpcy5zb3J0UHJvcGVydGllcywgc29ydFByb3BlcnR5LmtleSkpO1xuICAgIH1cblxuICAgIGdldEFwcFZlcnNpb25PcHRpb25zKCkge1xuICAgICAgICB0aGlzLnByb2Nlc3NDbG91ZFNlcnZpY2UuZ2V0QXBwbGljYXRpb25WZXJzaW9ucyh0aGlzLmFwcE5hbWUpLnN1YnNjcmliZSgoYXBwVmVyc2lvbnMpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYXBwVmVyc2lvbk9wdGlvbnMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgIGFwcFZlcnNpb25zLmZvckVhY2goKGFwcFZlcnNpb24pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcFZlcnNpb25PcHRpb25zLnB1c2goeyBsYWJlbDogYXBwVmVyc2lvbi5lbnRyeS52ZXJzaW9uLCB2YWx1ZTogYXBwVmVyc2lvbi5lbnRyeS52ZXJzaW9uIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNoZWNrTWFuZGF0b3J5U29ydFByb3BlcnRpZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLnNvcnRQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgfHwgdGhpcy5zb3J0UHJvcGVydGllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuc29ydFByb3BlcnRpZXMgPSBERUZBVUxUX1NPUlRfUFJPUEVSVElFUztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNyZWF0ZUFuZEZpbHRlckFjdGlvbnMoKSB7XG4gICAgICAgIHRoaXMuY2hlY2tNYW5kYXRvcnlBY3Rpb25zKCk7XG4gICAgICAgIGNvbnN0IGFjdGlvbnMgPSB0aGlzLmNyZWF0ZUZpbHRlckFjdGlvbnMoKTtcbiAgICAgICAgcmV0dXJuIGFjdGlvbnMuZmlsdGVyKChhY3Rpb24pID0+IHRoaXMuaXNWYWxpZEFjdGlvbih0aGlzLmFjdGlvbnMsIGFjdGlvbikpO1xuICAgIH1cblxuICAgIGNoZWNrTWFuZGF0b3J5QWN0aW9ucygpIHtcbiAgICAgICAgaWYgKHRoaXMuYWN0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuYWN0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9ucyA9IERFRkFVTFRfQUNUSU9OUztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaXNWYWxpZEFjdGlvbihhY3Rpb25zOiBzdHJpbmdbXSwgYWN0aW9uOiBQcm9jZXNzRmlsdGVyQWN0aW9uKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBhY3Rpb25zID8gYWN0aW9ucy5pbmRleE9mKGFjdGlvbi5hY3Rpb25UeXBlKSA+PSAwIDogdHJ1ZTtcbiAgICB9XG5cbiAgICBpc0Zvcm1WYWxpZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdFByb2Nlc3NGaWx0ZXJGb3JtLnZhbGlkO1xuICAgIH1cblxuICAgIGdldFByb3BlcnR5Q29udHJvbGxlcihwcm9wZXJ0eTogUHJvY2Vzc0ZpbHRlclByb3BlcnRpZXMpOiBBYnN0cmFjdENvbnRyb2wge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0UHJvY2Vzc0ZpbHRlckZvcm0uZ2V0KHByb3BlcnR5LmtleSk7XG4gICAgfVxuXG4gICAgb25EYXRlQ2hhbmdlZChuZXdEYXRlVmFsdWU6IERhdGUgfCBzdHJpbmcsIGRhdGVQcm9wZXJ0eTogUHJvY2Vzc0ZpbHRlclByb3BlcnRpZXMpIHtcbiAgICAgICAgaWYgKG5ld0RhdGVWYWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbGxlciA9IHRoaXMuZ2V0UHJvcGVydHlDb250cm9sbGVyKGRhdGVQcm9wZXJ0eSk7XG5cbiAgICAgICAgICAgIGxldCBkYXRlID0gbmV3RGF0ZVZhbHVlO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG5ld0RhdGVWYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBkYXRlID0gRGF0ZUZuc1V0aWxzLnBhcnNlRGF0ZShuZXdEYXRlVmFsdWUsICdkZC9NTS95eXl5Jyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc1ZhbGlkKGRhdGUpKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5zZXRWYWx1ZShkYXRlKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnNldEVycm9ycyhudWxsKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5zZXRWYWx1ZShkYXRlKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnNldEVycm9ycyh7IGludmFsaWQ6IHRydWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkRhdGVUeXBlQ2hhbmdlKGRhdGVUeXBlOiBEYXRlQ2xvdWRGaWx0ZXJUeXBlLCBwcm9wZXJ0eTogUHJvY2Vzc0ZpbHRlclByb3BlcnRpZXMpIHtcbiAgICAgICAgdGhpcy5lZGl0UHJvY2Vzc0ZpbHRlckZvcm0uZ2V0KHByb3BlcnR5LmF0dHJpYnV0ZXMuZGF0ZVR5cGUpLnNldFZhbHVlKGRhdGVUeXBlKTtcbiAgICB9XG5cbiAgICBvbkRhdGVSYW5nZUZpbHRlckNoYW5nZWQoZGF0ZVJhbmdlOiBEYXRlUmFuZ2VGaWx0ZXIsIHByb3BlcnR5OiBQcm9jZXNzRmlsdGVyUHJvcGVydGllcykge1xuICAgICAgICB0aGlzLmVkaXRQcm9jZXNzRmlsdGVyRm9ybS5nZXQocHJvcGVydHkuYXR0cmlidXRlcz8uZnJvbSkuc2V0VmFsdWUoZGF0ZVJhbmdlLnN0YXJ0RGF0ZSA/IGRhdGVSYW5nZS5zdGFydERhdGUgOiBudWxsKTtcbiAgICAgICAgdGhpcy5lZGl0UHJvY2Vzc0ZpbHRlckZvcm0uZ2V0KHByb3BlcnR5LmF0dHJpYnV0ZXM/LnRvKS5zZXRWYWx1ZShkYXRlUmFuZ2UuZW5kRGF0ZSA/IGRhdGVSYW5nZS5lbmREYXRlIDogbnVsbCk7XG4gICAgICAgIHRoaXMuZWRpdFByb2Nlc3NGaWx0ZXJGb3JtLmdldChwcm9wZXJ0eS5hdHRyaWJ1dGVzLmRhdGVUeXBlKS5zZXRWYWx1ZShEYXRlQ2xvdWRGaWx0ZXJUeXBlLlJBTkdFKTtcbiAgICB9XG5cbiAgICBvbkNoYW5nZWRVc2VyKHVzZXJzOiBJZGVudGl0eVVzZXJNb2RlbFtdLCBwcm9jZXNzUHJvcGVydHk6IFByb2Nlc3NGaWx0ZXJQcm9wZXJ0aWVzKSB7XG4gICAgICAgIHRoaXMuZ2V0UHJvcGVydHlDb250cm9sbGVyKHByb2Nlc3NQcm9wZXJ0eSkuc2V0VmFsdWUodXNlcnMubWFwKCh1c2VyKSA9PiB1c2VyLnVzZXJuYW1lKS5qb2luKCcsJykpO1xuICAgIH1cblxuICAgIGhhc0Vycm9yKHByb3BlcnR5OiBQcm9jZXNzRmlsdGVyUHJvcGVydGllcyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBjb250cm9sbGVyID0gdGhpcy5nZXRQcm9wZXJ0eUNvbnRyb2xsZXIocHJvcGVydHkpO1xuICAgICAgICByZXR1cm4gISFjb250cm9sbGVyLmVycm9ycz8uaW52YWxpZDtcbiAgICB9XG5cbiAgICBjb21wYXJlRmlsdGVycyhlZGl0ZWRRdWVyeTogUHJvY2Vzc0ZpbHRlckNsb3VkTW9kZWwsIGN1cnJlbnRRdWVyeTogUHJvY2Vzc0ZpbHRlckNsb3VkTW9kZWwpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGVkaXRlZFF1ZXJ5KS50b0xvd2VyQ2FzZSgpID09PSBKU09OLnN0cmluZ2lmeShjdXJyZW50UXVlcnkpLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgZ2V0RGVwbG95ZWRBcHBsaWNhdGlvbnMoKSB7XG4gICAgICAgIHRoaXMuYXBwc1Byb2Nlc3NDbG91ZFNlcnZpY2UuZ2V0RGVwbG95ZWRBcHBsaWNhdGlvbnNCeVN0YXR1cygnREVQTE9ZRUQnLCB0aGlzLnJvbGUpLnN1YnNjcmliZSgoYXBwbGljYXRpb25zKSA9PiB7XG4gICAgICAgICAgICBpZiAoYXBwbGljYXRpb25zICYmIGFwcGxpY2F0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBsaWNhdGlvbk5hbWVzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgYXBwbGljYXRpb25zLm1hcCgoYXBwbGljYXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBsaWNhdGlvbk5hbWVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuYXBwc1Byb2Nlc3NDbG91ZFNlcnZpY2UuZ2V0QXBwbGljYXRpb25MYWJlbChhcHBsaWNhdGlvbiwgdGhpcy5lbnZpcm9ubWVudExpc3QpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGFwcGxpY2F0aW9uLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldFByb2Nlc3NEZWZpbml0aW9ucygpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzQ2xvdWRTZXJ2aWNlLmdldFByb2Nlc3NEZWZpbml0aW9ucyh0aGlzLmFwcE5hbWUpLnN1YnNjcmliZSgocHJvY2Vzc0RlZmluaXRpb25zKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvY2Vzc0RlZmluaXRpb25zICYmIHByb2Nlc3NEZWZpbml0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzRGVmaW5pdGlvbk5hbWVzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzRGVmaW5pdGlvbk5hbWVzLnB1c2godGhpcy5hbGxQcm9jZXNzRGVmaW5pdGlvbk5hbWVzT3B0aW9uKTtcbiAgICAgICAgICAgICAgICBwcm9jZXNzRGVmaW5pdGlvbnMubWFwKChwcm9jZXNzRGVmaW5pdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NEZWZpbml0aW9uTmFtZXMucHVzaCh7IGxhYmVsOiBwcm9jZXNzRGVmaW5pdGlvbi5uYW1lLCB2YWx1ZTogcHJvY2Vzc0RlZmluaXRpb24ubmFtZSB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZXhlY3V0ZUZpbHRlckFjdGlvbnMoZXZlbnQ6IEV2ZW50LCBhY3Rpb246IFByb2Nlc3NGaWx0ZXJBY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgaWYgKGFjdGlvbi5hY3Rpb25UeXBlID09PSBQUk9DRVNTX0ZJTFRFUl9BQ1RJT05fU0FWRSkge1xuICAgICAgICAgICAgdGhpcy5zYXZlKGFjdGlvbik7XG4gICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmFjdGlvblR5cGUgPT09IFBST0NFU1NfRklMVEVSX0FDVElPTl9TQVZFX0FTKSB7XG4gICAgICAgICAgICB0aGlzLnNhdmVBcyhhY3Rpb24pO1xuICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5hY3Rpb25UeXBlID09PSBQUk9DRVNTX0ZJTFRFUl9BQ1RJT05fREVMRVRFKSB7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZShhY3Rpb24pO1xuICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5hY3Rpb25UeXBlID09PSBQUk9DRVNTX0ZJTFRFUl9BQ1RJT05fU0FWRV9ERUZBVUxUKSB7XG4gICAgICAgICAgICB0aGlzLnNhdmUoYWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uYWN0aW9uVHlwZSA9PT0gUFJPQ0VTU19GSUxURVJfQUNUSU9OX1JFU1RPUkUpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXQoYWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICBzYXZlKHNhdmVBY3Rpb246IFByb2Nlc3NGaWx0ZXJBY3Rpb24pIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzRmlsdGVyQ2xvdWRTZXJ2aWNlLnVwZGF0ZUZpbHRlcih0aGlzLnByb2Nlc3NGaWx0ZXIpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBzYXZlQWN0aW9uLmZpbHRlciA9IHRoaXMucHJvY2Vzc0ZpbHRlcjtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVySGFzQmVlbkNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uLmVtaXQoc2F2ZUFjdGlvbik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBhIHByb2Nlc3MgaW5zdGFuY2UgZmlsdGVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGVsZXRlQWN0aW9uIGZpbHRlciBhY3Rpb25cbiAgICAgKi9cbiAgICBkZWxldGUoZGVsZXRlQWN0aW9uOiBQcm9jZXNzRmlsdGVyQWN0aW9uKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc0ZpbHRlckNsb3VkU2VydmljZVxuICAgICAgICAgICAgLmRlbGV0ZUZpbHRlcih0aGlzLnByb2Nlc3NGaWx0ZXIpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKGZpbHRlcnMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlQWN0aW9uLmZpbHRlciA9IHRoaXMucHJvY2Vzc0ZpbHRlcjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3Rpb24uZW1pdChkZWxldGVBY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsdGVycy5sZW5ndGggPT09IDA7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMucmVzdG9yZURlZmF1bHRQcm9jZXNzRmlsdGVycygpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7fSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2F2ZSBBcyBhIHByb2Nlc3MgaW5zdGFuY2UgZmlsdGVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2F2ZUFzQWN0aW9uIGZpbHRlciBhY3Rpb25cbiAgICAgKi9cbiAgICBzYXZlQXMoc2F2ZUFzQWN0aW9uOiBQcm9jZXNzRmlsdGVyQWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oUHJvY2Vzc0ZpbHRlckRpYWxvZ0Nsb3VkQ29tcG9uZW50LCB7XG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgbmFtZTogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodGhpcy5wcm9jZXNzRmlsdGVyLm5hbWUpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaGVpZ2h0OiAnYXV0bycsXG4gICAgICAgICAgICBtaW5XaWR0aDogJzMwJSdcbiAgICAgICAgfSk7XG4gICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5hY3Rpb24gPT09IFByb2Nlc3NGaWx0ZXJEaWFsb2dDbG91ZENvbXBvbmVudC5BQ1RJT05fU0FWRSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcklkID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcktleSA9IHRoaXMuZ2V0U2FuaXRpemVGaWx0ZXJOYW1lKHJlc3VsdC5uYW1lKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdGaWx0ZXIgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHJlc3VsdC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBpY29uOiByZXN1bHQuaWNvbixcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGZpbHRlcklkLFxuICAgICAgICAgICAgICAgICAgICBrZXk6ICdjdXN0b20tJyArIGZpbHRlcktleVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0RmlsdGVyOiBQcm9jZXNzRmlsdGVyQ2xvdWRNb2RlbCA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMucHJvY2Vzc0ZpbHRlciwgbmV3RmlsdGVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NGaWx0ZXJDbG91ZFNlcnZpY2UuYWRkRmlsdGVyKHJlc3VsdEZpbHRlcikuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2F2ZUFzQWN0aW9uLmZpbHRlciA9IHJlc3VsdEZpbHRlcjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJIYXNCZWVuQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbi5lbWl0KHNhdmVBc0FjdGlvbik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlc2V0KHJlc2V0QWN0aW9uOiBQcm9jZXNzRmlsdGVyQWN0aW9uKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc0ZpbHRlckNsb3VkU2VydmljZVxuICAgICAgICAgICAgLnJlc2V0UHJvY2Vzc0ZpbHRlclRvRGVmYXVsdHModGhpcy5hcHBOYW1lLCB0aGlzLnByb2Nlc3NGaWx0ZXIpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICB0YXAoKGZpbHRlcnMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzZXRBY3Rpb24uZmlsdGVyID0gZmlsdGVycy5maW5kKChkZWZhdWx0RmlsdGVyKSA9PiBkZWZhdWx0RmlsdGVyLm5hbWUgPT09IHRoaXMucHJvY2Vzc0ZpbHRlci5uYW1lKSB8fCB0aGlzLnByb2Nlc3NGaWx0ZXI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9uLmVtaXQocmVzZXRBY3Rpb24pO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLnJlc3RvcmVEZWZhdWx0UHJvY2Vzc0ZpbHRlcnMoKSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge30pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBzYW5pdGl6ZWQgZmlsdGVyIG5hbWVcbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWx0ZXJOYW1lIGZpbHRlciBuYW1lXG4gICAgICogQHJldHVybnMgc2FuaXRpemVkIGZpbHRlciBuYW1lXG4gICAgICovXG4gICAgZ2V0U2FuaXRpemVGaWx0ZXJOYW1lKGZpbHRlck5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IG5hbWVXaXRoSHlwaGVuID0gdGhpcy5yZXBsYWNlU3BhY2VXaXRoSHlwaGVuKGZpbHRlck5hbWUudHJpbSgpKTtcbiAgICAgICAgcmV0dXJuIG5hbWVXaXRoSHlwaGVuLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIG5hbWUgd2l0aCBoeXBoZW5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIG5hbWVcbiAgICAgKiBAcmV0dXJucyB1cGRhdGVkIHZhbHVlXG4gICAgICovXG4gICAgcmVwbGFjZVNwYWNlV2l0aEh5cGhlbihuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCByZWdFeHQgPSBuZXcgUmVnRXhwKCcgJywgJ2cnKTtcbiAgICAgICAgcmV0dXJuIG5hbWUucmVwbGFjZShyZWdFeHQsICctJyk7XG4gICAgfVxuXG4gICAgcmVzdG9yZURlZmF1bHRQcm9jZXNzRmlsdGVycygpOiBPYnNlcnZhYmxlPFByb2Nlc3NGaWx0ZXJDbG91ZE1vZGVsW10+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0ZpbHRlckNsb3VkU2VydmljZS5nZXRQcm9jZXNzRmlsdGVycyh0aGlzLmFwcE5hbWUpO1xuICAgIH1cblxuICAgIG9uRXhwYW5kKCkge1xuICAgICAgICB0aGlzLnRvZ2dsZUZpbHRlckFjdGlvbnMgPSB0cnVlO1xuICAgIH1cblxuICAgIG9uQ2xvc2UoKSB7XG4gICAgICAgIHRoaXMudG9nZ2xlRmlsdGVyQWN0aW9ucyA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlzRGlzYWJsZWRBY3Rpb24oYWN0aW9uOiBQcm9jZXNzRmlsdGVyQWN0aW9uKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NGaWx0ZXJDbG91ZFNlcnZpY2UuaXNEZWZhdWx0RmlsdGVyKHRoaXMucHJvY2Vzc0ZpbHRlci5uYW1lKSAmJiB0aGlzLmFjdGlvbkRpc2FibGVkRm9yRGVmYXVsdC5pbmNsdWRlcyhhY3Rpb24uYWN0aW9uVHlwZSlcbiAgICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgICAgOiB0aGlzLmhhc0ZpbHRlckNoYW5nZWQoYWN0aW9uKTtcbiAgICB9XG5cbiAgICBoYXNGaWx0ZXJDaGFuZ2VkKGFjdGlvbjogUHJvY2Vzc0ZpbHRlckFjdGlvbik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gYWN0aW9uLmFjdGlvblR5cGUgPT09IFBST0NFU1NfRklMVEVSX0FDVElPTl9TQVZFIHx8IGFjdGlvbi5hY3Rpb25UeXBlID09PSBQUk9DRVNTX0ZJTFRFUl9BQ1RJT05fU0FWRV9BU1xuICAgICAgICAgICAgPyAhdGhpcy5maWx0ZXJIYXNCZWVuQ2hhbmdlZFxuICAgICAgICAgICAgOiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldExhc3RNb2RpZmllZFRvRmlsdGVyKGZvcm1WYWx1ZXM6IFBhcnRpYWw8UHJvY2Vzc0ZpbHRlckNsb3VkTW9kZWw+KSB7XG4gICAgICAgIGlmIChpc1ZhbGlkKGZvcm1WYWx1ZXMubGFzdE1vZGlmaWVkVG8pKSB7XG4gICAgICAgICAgICBmb3JtVmFsdWVzLmxhc3RNb2RpZmllZFRvID0gZW5kT2ZEYXkoZm9ybVZhbHVlcy5sYXN0TW9kaWZpZWRUbyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldExhc3RNb2RpZmllZEZyb21GaWx0ZXIoZm9ybVZhbHVlczogUGFydGlhbDxQcm9jZXNzRmlsdGVyQ2xvdWRNb2RlbD4pIHtcbiAgICAgICAgaWYgKGlzVmFsaWQoZm9ybVZhbHVlcy5sYXN0TW9kaWZpZWRGcm9tKSkge1xuICAgICAgICAgICAgZm9ybVZhbHVlcy5sYXN0TW9kaWZpZWRGcm9tID0gc3RhcnRPZkRheShmb3JtVmFsdWVzLmxhc3RNb2RpZmllZEZyb20pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXJBY3Rpb25zKCk6IFByb2Nlc3NGaWx0ZXJBY3Rpb25bXSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uVHlwZTogUFJPQ0VTU19GSUxURVJfQUNUSU9OX1NBVkUsXG4gICAgICAgICAgICAgICAgaWNvbjogJ2FkZjpzYXZlJyxcbiAgICAgICAgICAgICAgICB0b29sdGlwOiAnQURGX0NMT1VEX0VESVRfUFJPQ0VTU19GSUxURVIuVE9PTF9USVAuU0FWRSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uVHlwZTogUFJPQ0VTU19GSUxURVJfQUNUSU9OX1NBVkVfQVMsXG4gICAgICAgICAgICAgICAgaWNvbjogJ2FkZjpzYXZlLWFzJyxcbiAgICAgICAgICAgICAgICB0b29sdGlwOiAnQURGX0NMT1VEX0VESVRfUFJPQ0VTU19GSUxURVIuVE9PTF9USVAuU0FWRV9BUydcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uVHlwZTogUFJPQ0VTU19GSUxURVJfQUNUSU9OX0RFTEVURSxcbiAgICAgICAgICAgICAgICBpY29uOiAnZGVsZXRlJyxcbiAgICAgICAgICAgICAgICB0b29sdGlwOiAnQURGX0NMT1VEX0VESVRfUFJPQ0VTU19GSUxURVIuVE9PTF9USVAuREVMRVRFJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb25UeXBlOiBQUk9DRVNTX0ZJTFRFUl9BQ1RJT05fU0FWRV9ERUZBVUxULFxuICAgICAgICAgICAgICAgIGljb246ICdhZGY6c2F2ZScsXG4gICAgICAgICAgICAgICAgdG9vbHRpcDogJ0FERl9DTE9VRF9FRElUX1BST0NFU1NfRklMVEVSLlRPT0xfVElQLlNBVkUnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvblR5cGU6IFBST0NFU1NfRklMVEVSX0FDVElPTl9SRVNUT1JFLFxuICAgICAgICAgICAgICAgIGljb246ICdzZXR0aW5nc19iYWNrdXBfcmVzdG9yZScsXG4gICAgICAgICAgICAgICAgdG9vbHRpcDogJ0FERl9DTE9VRF9FRElUX1BST0NFU1NfRklMVEVSLlRPT0xfVElQLlJFU1RPUkUnXG4gICAgICAgICAgICB9XG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVMYXN0TW9kaWZpZWRQcm9wZXJ0eShmaWx0ZXJNb2RlbDogUHJvY2Vzc0ZpbHRlckNsb3VkTW9kZWwpOiBQcm9jZXNzRmlsdGVyUHJvcGVydGllc1tdIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0FERl9DTE9VRF9FRElUX1BST0NFU1NfRklMVEVSLkxBQkVMLkxBU1RfTU9ESUZJRURfREFURV9GT1JNJyxcbiAgICAgICAgICAgICAgICB0eXBlOiAnZGF0ZScsXG4gICAgICAgICAgICAgICAga2V5OiAnbGFzdE1vZGlmaWVkRnJvbScsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZpbHRlck1vZGVsLmxhc3RNb2RpZmllZEZyb21cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdBREZfQ0xPVURfRURJVF9QUk9DRVNTX0ZJTFRFUi5MQUJFTC5MQVNUX01PRElGSUVEX1RPJyxcbiAgICAgICAgICAgICAgICB0eXBlOiAnZGF0ZScsXG4gICAgICAgICAgICAgICAga2V5OiAnbGFzdE1vZGlmaWVkVG8nLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmaWx0ZXJNb2RlbC5sYXN0TW9kaWZpZWRUb1xuICAgICAgICAgICAgfVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlUHJvY2Vzc1NvcnRQcm9wZXJ0aWVzKCk6IFByb2Nlc3NTb3J0RmlsdGVyUHJvcGVydHlbXSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdBREZfQ0xPVURfRURJVF9QUk9DRVNTX0ZJTFRFUi5MQUJFTC5JRCcsXG4gICAgICAgICAgICAgICAga2V5OiAnaWQnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnaWQnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnRW52aXJvbm1lbnRJZCcsXG4gICAgICAgICAgICAgICAga2V5OiAnZW52aXJvbm1lbnRJZCcsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICdlbnZpcm9ubWVudElkJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0FERl9DTE9VRF9FRElUX1BST0NFU1NfRklMVEVSLkxBQkVMLlBST0NFU1NfTkFNRScsXG4gICAgICAgICAgICAgICAga2V5OiAnbmFtZScsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICduYW1lJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0FERl9DTE9VRF9FRElUX1BST0NFU1NfRklMVEVSLkxBQkVMLlNUQVJUX0RBVEUnLFxuICAgICAgICAgICAgICAgIGtleTogJ3N0YXJ0RGF0ZScsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICdzdGFydERhdGUnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnQURGX0NMT1VEX0VESVRfUFJPQ0VTU19GSUxURVIuTEFCRUwuU1RBVFVTJyxcbiAgICAgICAgICAgICAgICBrZXk6ICdzdGF0dXMnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnc3RhdHVzJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0FERl9DTE9VRF9FRElUX1BST0NFU1NfRklMVEVSLkxBQkVMLlNUQVJURURfQlknLFxuICAgICAgICAgICAgICAgIGtleTogJ2luaXRpYXRvcicsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICdpbml0aWF0b3InXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnQURGX0NMT1VEX0VESVRfUFJPQ0VTU19GSUxURVIuTEFCRUwuQVBQX05BTUUnLFxuICAgICAgICAgICAgICAgIGtleTogJ2FwcE5hbWUnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnYXBwTmFtZSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdBREZfQ0xPVURfRURJVF9QUk9DRVNTX0ZJTFRFUi5MQUJFTC5BUFBfVkVSU0lPTicsXG4gICAgICAgICAgICAgICAga2V5OiAnYXBwVmVyc2lvbicsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICdhcHBWZXJzaW9uJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0FERl9DTE9VRF9FRElUX1BST0NFU1NfRklMVEVSLkxBQkVMLk1BSU5fUFJPQ0VTU19JRCcsXG4gICAgICAgICAgICAgICAga2V5OiAncGFyZW50SWQnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAncGFyZW50SWQnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnQURGX0NMT1VEX0VESVRfUFJPQ0VTU19GSUxURVIuTEFCRUwuUFJPQ0VTU19JTlNfSUQnLFxuICAgICAgICAgICAgICAgIGtleTogJ3Byb2Nlc3NJbnN0YW5jZUlkJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJ3Byb2Nlc3NJbnN0YW5jZUlkJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0FERl9DTE9VRF9FRElUX1BST0NFU1NfRklMVEVSLkxBQkVMLlBST0NFU1NfREVGX0lEJyxcbiAgICAgICAgICAgICAgICBrZXk6ICdwcm9jZXNzRGVmaW5pdGlvbklkJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJ3Byb2Nlc3NEZWZpbml0aW9uSWQnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnQURGX0NMT1VEX0VESVRfUFJPQ0VTU19GSUxURVIuTEFCRUwuUFJPQ0VTU19ERUZfTkFNRScsXG4gICAgICAgICAgICAgICAga2V5OiAncHJvY2Vzc0RlZmluaXRpb25OYW1lJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJ3Byb2Nlc3NEZWZpbml0aW9uTmFtZSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdBREZfQ0xPVURfRURJVF9QUk9DRVNTX0ZJTFRFUi5MQUJFTC5QUk9DRVNTX0RFRl9LRVknLFxuICAgICAgICAgICAgICAgIGtleTogJ3Byb2Nlc3NEZWZpbml0aW9uS2V5JyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogJ3Byb2Nlc3NEZWZpbml0aW9uS2V5J1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0FERl9DTE9VRF9FRElUX1BST0NFU1NfRklMVEVSLkxBQkVMLkxBU1RfTU9ESUZJRUQnLFxuICAgICAgICAgICAgICAgIGtleTogJ2xhc3RNb2RpZmllZCcsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICdsYXN0TW9kaWZpZWQnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnQURGX0NMT1VEX0VESVRfUFJPQ0VTU19GSUxURVIuTEFCRUwuQlVTSU5FU1NfS0VZJyxcbiAgICAgICAgICAgICAgICBrZXk6ICdidXNpbmVzc0tleScsXG4gICAgICAgICAgICAgICAgdmFsdWU6ICdidXNpbmVzc0tleSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzRmlsdGVyQ2hhbmdlZChvbGRWYWx1ZTogUHJvY2Vzc0ZpbHRlckNsb3VkTW9kZWwsIG5ld1ZhbHVlOiBQcm9jZXNzRmlsdGVyQ2xvdWRNb2RlbCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBvbGRKc29uID0gSlNPTi5zdHJpbmdpZnkodGhpcy5wcm9jZXNzRmlsdGVyQ2xvdWRTZXJ2aWNlLndyaXRlUXVlcnlQYXJhbXMob2xkVmFsdWUgfHwge30sIHRoaXMuZmlsdGVyUHJvcGVydGllcykpO1xuICAgICAgICBjb25zdCBuZXdKc29uID0gSlNPTi5zdHJpbmdpZnkodGhpcy5wcm9jZXNzRmlsdGVyQ2xvdWRTZXJ2aWNlLndyaXRlUXVlcnlQYXJhbXMobmV3VmFsdWUgfHwge30sIHRoaXMuZmlsdGVyUHJvcGVydGllcykpO1xuXG4gICAgICAgIHJldHVybiBvbGRKc29uICE9PSBuZXdKc29uO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlUHJvY2Vzc0ZpbHRlclByb3BlcnRpZXMoZmlsdGVyTW9kZWw6IFByb2Nlc3NGaWx0ZXJDbG91ZE1vZGVsKTogUHJvY2Vzc0ZpbHRlclByb3BlcnRpZXNbXSB7XG4gICAgICAgIGNvbnN0IGFwcFZlcnNpb25NdWx0aXBsZSA9IFtdO1xuXG4gICAgICAgIGlmIChmaWx0ZXJNb2RlbC5hcHBWZXJzaW9uKSB7XG4gICAgICAgICAgICBhcHBWZXJzaW9uTXVsdGlwbGUucHVzaChcbiAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KGZpbHRlck1vZGVsLmFwcFZlcnNpb24pID8gZmlsdGVyTW9kZWwuYXBwVmVyc2lvbi5tYXAoKGVudHJ5KSA9PiBlbnRyeS50b1N0cmluZygpKSA6IGAke2ZpbHRlck1vZGVsLmFwcFZlcnNpb259YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdBREZfQ0xPVURfRURJVF9QUk9DRVNTX0ZJTFRFUi5MQUJFTC5BUFBfTkFNRScsXG4gICAgICAgICAgICAgICAgdHlwZTogJ3NlbGVjdCcsXG4gICAgICAgICAgICAgICAga2V5OiAnYXBwTmFtZScsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZpbHRlck1vZGVsLmFwcE5hbWUgfHwgJycsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5hcHBsaWNhdGlvbk5hbWVzXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnQURGX0NMT1VEX0VESVRfUFJPQ0VTU19GSUxURVIuTEFCRUwuQVBQX1ZFUlNJT04nLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgICAgICAgICAgIGtleTogJ2FwcFZlcnNpb24nLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmaWx0ZXJNb2RlbC5hcHBWZXJzaW9uXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnQURGX0NMT1VEX0VESVRfUFJPQ0VTU19GSUxURVIuTEFCRUwuQVBQX1ZFUlNJT04nLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdtdWx0aS1zZWxlY3QnLFxuICAgICAgICAgICAgICAgIGtleTogJ2FwcFZlcnNpb25NdWx0aXBsZScsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGFwcFZlcnNpb25NdWx0aXBsZSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiB0aGlzLmFwcFZlcnNpb25PcHRpb25zXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnQURGX0NMT1VEX0VESVRfUFJPQ0VTU19GSUxURVIuTEFCRUwuUFJPQ0VTU19JTlNfSUQnLFxuICAgICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgICBrZXk6ICdwcm9jZXNzSW5zdGFuY2VJZCcsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZpbHRlck1vZGVsLnByb2Nlc3NJbnN0YW5jZUlkIHx8ICcnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnQURGX0NMT1VEX0VESVRfUFJPQ0VTU19GSUxURVIuTEFCRUwuTUFJTl9QUk9DRVNTX0lEJyxcbiAgICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgICAga2V5OiAncGFyZW50SWQnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmaWx0ZXJNb2RlbC5wYXJlbnRJZFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0FERl9DTE9VRF9FRElUX1BST0NFU1NfRklMVEVSLkxBQkVMLlBST0NFU1NfTkFNRScsXG4gICAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICAgIGtleTogJ3Byb2Nlc3NOYW1lJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZmlsdGVyTW9kZWwucHJvY2Vzc05hbWUgfHwgJydcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdBREZfQ0xPVURfRURJVF9QUk9DRVNTX0ZJTFRFUi5MQUJFTC5QUk9DRVNTX0RFRl9OQU1FJyxcbiAgICAgICAgICAgICAgICB0eXBlOiAnc2VsZWN0JyxcbiAgICAgICAgICAgICAgICBrZXk6ICdwcm9jZXNzRGVmaW5pdGlvbk5hbWUnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmaWx0ZXJNb2RlbC5wcm9jZXNzRGVmaW5pdGlvbk5hbWUgfHwgJycsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5wcm9jZXNzRGVmaW5pdGlvbk5hbWVzXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnQURGX0NMT1VEX0VESVRfUFJPQ0VTU19GSUxURVIuTEFCRUwuU1RBVFVTJyxcbiAgICAgICAgICAgICAgICB0eXBlOiAnc2VsZWN0JyxcbiAgICAgICAgICAgICAgICBrZXk6ICdzdGF0dXMnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmaWx0ZXJNb2RlbC5zdGF0dXMgfHwgdGhpcy5zdGF0dXNbMF0udmFsdWUsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5zdGF0dXNcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdBREZfQ0xPVURfRURJVF9QUk9DRVNTX0ZJTFRFUi5MQUJFTC5QUk9DRVNTX0RFRl9JRCcsXG4gICAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICAgIGtleTogJ3Byb2Nlc3NEZWZpbml0aW9uSWQnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmaWx0ZXJNb2RlbC5wcm9jZXNzRGVmaW5pdGlvbklkIHx8ICcnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnQURGX0NMT1VEX0VESVRfUFJPQ0VTU19GSUxURVIuTEFCRUwuUFJPQ0VTU19ERUZfS0VZJyxcbiAgICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgICAga2V5OiAncHJvY2Vzc0RlZmluaXRpb25LZXknLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmaWx0ZXJNb2RlbC5wcm9jZXNzRGVmaW5pdGlvbktleSB8fCAnJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0FERl9DTE9VRF9FRElUX1BST0NFU1NfRklMVEVSLkxBQkVMLlNPUlQnLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdzZWxlY3QnLFxuICAgICAgICAgICAgICAgIGtleTogJ3NvcnQnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmaWx0ZXJNb2RlbC5zb3J0IHx8IHRoaXMuY3JlYXRlU29ydFByb3BlcnRpZXNbMF0udmFsdWUsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5jcmVhdGVTb3J0UHJvcGVydGllc1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0FERl9DTE9VRF9FRElUX1BST0NFU1NfRklMVEVSLkxBQkVMLkRJUkVDVElPTicsXG4gICAgICAgICAgICAgICAgdHlwZTogJ3NlbGVjdCcsXG4gICAgICAgICAgICAgICAga2V5OiAnb3JkZXInLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBmaWx0ZXJNb2RlbC5vcmRlciB8fCB0aGlzLmRpcmVjdGlvbnNbMF0udmFsdWUsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5kaXJlY3Rpb25zXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnQURGX0NMT1VEX0VESVRfUFJPQ0VTU19GSUxURVIuTEFCRUwuQ09NUExFVEVEX0RBVEUnLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdkYXRlJyxcbiAgICAgICAgICAgICAgICBrZXk6ICdjb21wbGV0ZWREYXRlJyxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZmlsdGVyTW9kZWwuY29tcGxldGVkRGF0ZSB8fCBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0FERl9DTE9VRF9FRElUX1BST0NFU1NfRklMVEVSLkxBQkVMLlNUQVJURURfQlknLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdwZW9wbGUnLFxuICAgICAgICAgICAgICAgIGtleTogJ2luaXRpYXRvcicsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGZpbHRlck1vZGVsLmluaXRpYXRvcixcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25Nb2RlOiAnbXVsdGlwbGUnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnQURGX0NMT1VEX0VESVRfUFJPQ0VTU19GSUxURVIuTEFCRUwuQ09NUExFVEVEX0RBVEUnLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdkYXRlLXJhbmdlJyxcbiAgICAgICAgICAgICAgICBrZXk6ICdjb21wbGV0ZWREYXRlUmFuZ2UnLFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHsgZGF0ZVR5cGU6ICdjb21wbGV0ZWREYXRlVHlwZScsIGZyb206ICdfY29tcGxldGVkRnJvbScsIHRvOiAnX2NvbXBsZXRlZFRvJyB9LFxuICAgICAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZERhdGVUeXBlOiBmaWx0ZXJNb2RlbC5jb21wbGV0ZWREYXRlVHlwZSB8fCBudWxsLFxuICAgICAgICAgICAgICAgICAgICBfY29tcGxldGVkRnJvbTogZmlsdGVyTW9kZWwuY29tcGxldGVkRnJvbSB8fCBudWxsLFxuICAgICAgICAgICAgICAgICAgICBfY29tcGxldGVkVG86IGZpbHRlck1vZGVsLmNvbXBsZXRlZFRvIHx8IG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnQURGX0NMT1VEX0VESVRfUFJPQ0VTU19GSUxURVIuTEFCRUwuU1RBUlRFRF9EQVRFJyxcbiAgICAgICAgICAgICAgICB0eXBlOiAnZGF0ZS1yYW5nZScsXG4gICAgICAgICAgICAgICAga2V5OiAnc3RhcnRlZERhdGVSYW5nZScsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogeyBkYXRlVHlwZTogJ3N0YXJ0ZWREYXRlVHlwZScsIGZyb206ICdfc3RhcnRGcm9tJywgdG86ICdfc3RhcnRUbycgfSxcbiAgICAgICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgICAgICBzdGFydGVkRGF0ZVR5cGU6IGZpbHRlck1vZGVsLnN0YXJ0ZWREYXRlVHlwZSB8fCBudWxsLFxuICAgICAgICAgICAgICAgICAgICBfc3RhcnRGcm9tOiBmaWx0ZXJNb2RlbC5zdGFydEZyb20gfHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgX3N0YXJ0VG86IGZpbHRlck1vZGVsLnN0YXJ0VG8gfHwgbnVsbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdBREZfQ0xPVURfRURJVF9QUk9DRVNTX0ZJTFRFUi5MQUJFTC5TVVNQRU5ERURfREFURScsXG4gICAgICAgICAgICAgICAgdHlwZTogJ2RhdGUtcmFuZ2UnLFxuICAgICAgICAgICAgICAgIGtleTogJ3N1c3BlbmRlZERhdGVSYW5nZScsXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczogeyBkYXRlVHlwZTogJ3N1c3BlbmRlZERhdGVUeXBlJywgZnJvbTogJ19zdXNwZW5kZWRGcm9tJywgdG86ICdfc3VzcGVuZGVkVG8nIH0sXG4gICAgICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgc3VzcGVuZGVkRGF0ZVR5cGU6IGZpbHRlck1vZGVsLnN1c3BlbmRlZERhdGVUeXBlIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIF9zdXNwZW5kZWRGcm9tOiBmaWx0ZXJNb2RlbC5zdXNwZW5kZWRGcm9tIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIF9zdXNwZW5kZWRUbzogZmlsdGVyTW9kZWwuc3VzcGVuZGVkVG8gfHwgbnVsbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgXTtcbiAgICB9XG59XG4iLCI8bWF0LWFjY29yZGlvbiBbaGlkZVRvZ2dsZV09XCJpc0xvYWRpbmdcIiBjbGFzcz1cImFkZi1lZGl0LXByb2Nlc3MtZmlsdGVyXCI+XG4gICAgPG1hdC1leHBhbnNpb24tcGFuZWwgKGFmdGVyRXhwYW5kKT1cIm9uRXhwYW5kKClcIiAoY2xvc2VkKT1cIm9uQ2xvc2UoKVwiPlxuICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIgKm5nSWY9XCJwcm9jZXNzRmlsdGVyXCIgaWQ9XCJhZGYtZWRpdC1wcm9jZXNzLWZpbHRlci1leHBhbnNpb24taGVhZGVyXCIgY2xhc3M9XCJhZGYtZWRpdC1wcm9jZXNzLWZpbHRlci1oZWFkZXJcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNMb2FkaW5nOyBlbHNlIGxvYWRpbmdUZW1wbGF0ZVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtcGFuZWwtdGl0bGUgKm5nSWY9XCJzaG93UHJvY2Vzc0ZpbHRlck5hbWVcIiBpZD1cImFkZi1lZGl0LXByb2Nlc3MtZmlsdGVyLXRpdGxlLWlkXCIgY2xhc3M9XCJhZGYtZWRpdC1wcm9jZXNzLWZpbHRlci1oZWFkZXJfX3RpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7cHJvY2Vzc0ZpbHRlci5uYW1lIHwgdHJhbnNsYXRlfX08L21hdC1wYW5lbC10aXRsZT5cbiAgICAgICAgICAgICAgICA8bWF0LXBhbmVsLWRlc2NyaXB0aW9uICBjbGFzcz1cImFkZi1lZGl0LXByb2Nlc3MtZmlsdGVyLWhlYWRlcl9fZGVzY3JpcHRpb25cIiBpZD1cImFkZi1lZGl0LXByb2Nlc3MtZmlsdGVyLXN1Yi10aXRsZS1pZFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNob3dUaXRsZVwiPiB7eyAnQURGX0NMT1VEX0VESVRfUFJPQ0VTU19GSUxURVIuVElUTEUnIHwgdHJhbnNsYXRlfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93RmlsdGVyQWN0aW9uc1wiIGNsYXNzPVwiYWRmLWNsb3VkLWVkaXQtcHJvY2Vzcy1maWx0ZXItYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRvZ2dsZUZpbHRlckFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0Zvcj1cImxldCBmaWx0ZXJBY3Rpb24gb2YgcHJvY2Vzc0ZpbHRlckFjdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiZmlsdGVyQWN0aW9uLnRvb2x0aXAgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1hdXRvbWF0aW9uLWlkXT1cIidhZGYtZmlsdGVyLWFjdGlvbi0nICsgZmlsdGVyQWN0aW9uLmFjdGlvblR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRBY3Rpb24oZmlsdGVyQWN0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZXhlY3V0ZUZpbHRlckFjdGlvbnMoJGV2ZW50LCBmaWx0ZXJBY3Rpb24pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhZGYtaWNvbiBbdmFsdWVdPVwiZmlsdGVyQWN0aW9uLmljb25cIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbWF0LXBhbmVsLWRlc2NyaXB0aW9uPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2xvYWRpbmdUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRmLWNsb3VkLWVkaXQtcHJvY2Vzcy1maWx0ZXItbG9hZGluZy1tYXJnaW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1zcGlubmVyIFtkaWFtZXRlcl09XCIzMFwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTG9hZGluZ1wiPlxuICAgICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJlZGl0UHJvY2Vzc0ZpbHRlckZvcm1cIiAqbmdJZj1cImVkaXRQcm9jZXNzRmlsdGVyRm9ybVwiIGNsYXNzPVwiYWRmLWVkaXQtcHJvY2Vzcy1maWx0ZXItY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZGYtZWRpdC1wcm9jZXNzLWZpbHRlci1mb3JtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHByb2Nlc3NGaWx0ZXJQcm9wZXJ0eSBvZiBwcm9jZXNzRmlsdGVyUHJvcGVydGllczsgdHJhY2tCeTogZmlsdGVyVHJhY2tlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIFtmbG9hdExhYmVsXT1cIidhdXRvJ1wiICpuZ0lmPVwicHJvY2Vzc0ZpbHRlclByb3BlcnR5LnR5cGUgPT09ICdzZWxlY3QnXCIgW2F0dHIuZGF0YS1hdXRvbWF0aW9uLWlkXT1cInByb2Nlc3NGaWx0ZXJQcm9wZXJ0eS5rZXlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsIGNsYXNzPVwiYWRmLWVkaXQtcHJvY2Vzcy1maWx0ZXItY29udGVudF9fc2VsZWN0LWxhYmVsXCI+e3twcm9jZXNzRmlsdGVyUHJvcGVydHkubGFiZWwgfCB0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwicHJvY2Vzc0ZpbHRlclByb3BlcnR5LmtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtYXV0b21hdGlvbi1pZF09XCInYWRmLWNsb3VkLWVkaXQtcHJvY2Vzcy1wcm9wZXJ0eS0nICsgcHJvY2Vzc0ZpbHRlclByb3BlcnR5LmtleVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHByb3BlcnR5T3B0aW9uIG9mIHByb2Nlc3NGaWx0ZXJQcm9wZXJ0eS5vcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJwcm9wZXJ0eU9wdGlvbi52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWF1dG9tYXRpb24taWRdPVwiJ2FkZi1jbG91ZC1lZGl0LXByb2Nlc3MtcHJvcGVydHktb3B0aW9ucy0nICsgcHJvY2Vzc0ZpbHRlclByb3BlcnR5LmtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID57eyBwcm9wZXJ0eU9wdGlvbi5sYWJlbCB8IHRyYW5zbGF0ZSB9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIFtmbG9hdExhYmVsXT1cIidhdXRvJ1wiICpuZ0lmPVwicHJvY2Vzc0ZpbHRlclByb3BlcnR5LnR5cGUgPT09ICdtdWx0aS1zZWxlY3QnXCIgW2F0dHIuZGF0YS1hdXRvbWF0aW9uLWlkXT1cInByb2Nlc3NGaWx0ZXJQcm9wZXJ0eS5rZXlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsIGNsYXNzPVwiYWRmLWVkaXQtcHJvY2Vzcy1maWx0ZXItY29udGVudF9fc2VsZWN0LWxhYmVsXCI+e3twcm9jZXNzRmlsdGVyUHJvcGVydHkubGFiZWwgfCB0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwicHJvY2Vzc0ZpbHRlclByb3BlcnR5LmtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtYXV0b21hdGlvbi1pZF09XCInYWRmLWNsb3VkLWVkaXQtcHJvY2Vzcy1wcm9wZXJ0eS0nICsgcHJvY2Vzc0ZpbHRlclByb3BlcnR5LmtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttdWx0aXBsZV09XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBwcm9wZXJ0eU9wdGlvbiBvZiBwcm9jZXNzRmlsdGVyUHJvcGVydHkub3B0aW9uc1wiIFt2YWx1ZV09XCJwcm9wZXJ0eU9wdGlvbi52YWx1ZVwiIFthdHRyLmRhdGEtYXV0b21hdGlvbi1pZF09XCInYWRmLWNsb3VkLWVkaXQtcHJvY2Vzcy1wcm9wZXJ0eS1vcHRpb25zLScgKyBwcm9jZXNzRmlsdGVyUHJvcGVydHkua2V5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBwcm9wZXJ0eU9wdGlvbi5sYWJlbCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBbZmxvYXRMYWJlbF09XCInYXV0bydcIiAqbmdJZj1cInByb2Nlc3NGaWx0ZXJQcm9wZXJ0eS50eXBlID09PSAndGV4dCdcIiBbYXR0ci5kYXRhLWF1dG9tYXRpb24taWRdPVwicHJvY2Vzc0ZpbHRlclByb3BlcnR5LmtleVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJhZGYtZWRpdC1wcm9jZXNzLWZpbHRlci1jb250ZW50X190ZXh0LWxhYmVsXCI+e3twcm9jZXNzRmlsdGVyUHJvcGVydHkubGFiZWwgfCB0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cInByb2Nlc3NGaWx0ZXJQcm9wZXJ0eS5rZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtYXV0b21hdGlvbi1pZF09XCInYWRmLWNsb3VkLWVkaXQtcHJvY2Vzcy1wcm9wZXJ0eS0nICsgcHJvY2Vzc0ZpbHRlclByb3BlcnR5LmtleVwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgW2Zsb2F0TGFiZWxdPVwiJ2F1dG8nXCIgKm5nSWY9XCJwcm9jZXNzRmlsdGVyUHJvcGVydHkudHlwZSA9PT0gJ251bWJlcidcIiBbYXR0ci5kYXRhLWF1dG9tYXRpb24taWRdPVwicHJvY2Vzc0ZpbHRlclByb3BlcnR5LmtleVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cInByb2Nlc3NGaWx0ZXJQcm9wZXJ0eS5rZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCIgbWluPVwiMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3twcm9jZXNzRmlsdGVyUHJvcGVydHkubGFiZWwgfCB0cmFuc2xhdGV9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtYXV0b21hdGlvbi1pZF09XCInYWRmLWNsb3VkLWVkaXQtcHJvY2Vzcy1wcm9wZXJ0eS0nICsgcHJvY2Vzc0ZpbHRlclByb3BlcnR5LmtleVwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgW2Zsb2F0TGFiZWxdPVwiJ2F1dG8nXCIgKm5nSWY9XCJwcm9jZXNzRmlsdGVyUHJvcGVydHkudHlwZSA9PT0gJ2RhdGUnXCIgW2F0dHIuZGF0YS1hdXRvbWF0aW9uLWlkXT1cInByb2Nlc3NGaWx0ZXJQcm9wZXJ0eS5rZXlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPnt7cHJvY2Vzc0ZpbHRlclByb3BlcnR5LmxhYmVsIHwgdHJhbnNsYXRlfX08L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9jZXNzRmlsdGVyUHJvcGVydHkua2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleXVwKT1cIm9uRGF0ZUNoYW5nZWQoJGFueSgkZXZlbnQpLnRhcmdldC52YWx1ZSwgcHJvY2Vzc0ZpbHRlclByb3BlcnR5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRlQ2hhbmdlKT1cIm9uRGF0ZUNoYW5nZWQoJGV2ZW50LnZhbHVlLCBwcm9jZXNzRmlsdGVyUHJvcGVydHkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdERhdGVwaWNrZXJdPVwiZGF0ZUNvbnRyb2xsZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7cHJvY2Vzc0ZpbHRlclByb3BlcnR5LmxhYmVsIHwgdHJhbnNsYXRlfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWF1dG9tYXRpb24taWRdPVwiJ2FkZi1jbG91ZC1lZGl0LXByb2Nlc3MtcHJvcGVydHktJyArIHByb2Nlc3NGaWx0ZXJQcm9wZXJ0eS5rZXlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFN1ZmZpeCBbZm9yXT1cImRhdGVDb250cm9sbGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWF1dG9tYXRpb24taWRdPVwiJ2FkZi1jbG91ZC1lZGl0LXByb2Nlc3MtcHJvcGVydHktZGF0ZS10b2dnbGUtJyArIHByb2Nlc3NGaWx0ZXJQcm9wZXJ0eS5rZXlcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlciAjZGF0ZUNvbnRyb2xsZXIgW2F0dHIuZGF0YS1hdXRvbWF0aW9uLWlkXT1cIidhZGYtY2xvdWQtZWRpdC1wcm9jZXNzLXByb3BlcnR5LWRhdGUtcGlja2VyLScgKyBwcm9jZXNzRmlsdGVyUHJvcGVydHkua2V5XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRmLWVkaXQtcHJvY2Vzcy1maWx0ZXItZGF0ZS1lcnJvci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImhhc0Vycm9yKHByb2Nlc3NGaWx0ZXJQcm9wZXJ0eSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZGYtZXJyb3ItdGV4dFwiPnt7J0FERl9DTE9VRF9FRElUX1BST0NFU1NfRklMVEVSLkVSUk9SLkRBVEUnIHwgdHJhbnNsYXRlfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImFkZi1lcnJvci1pY29uXCI+d2FybmluZzwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGFkZi1jbG91ZC1kYXRlLXJhbmdlLWZpbHRlciAqbmdJZj1cInByb2Nlc3NGaWx0ZXJQcm9wZXJ0eS50eXBlID09PSAnZGF0ZS1yYW5nZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9jZXNzRmlsdGVyUHJvcGVydHldPVwicHJvY2Vzc0ZpbHRlclByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJwcm9jZXNzRmlsdGVyUHJvcGVydHkuZGF0ZUZpbHRlck9wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRlVHlwZUNoYW5nZSk9XCJvbkRhdGVUeXBlQ2hhbmdlKCRldmVudCwgcHJvY2Vzc0ZpbHRlclByb3BlcnR5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRhdGVDaGFuZ2VkKT1cIm9uRGF0ZVJhbmdlRmlsdGVyQ2hhbmdlZCgkZXZlbnQsIHByb2Nlc3NGaWx0ZXJQcm9wZXJ0eSlcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGFkZi1jbG91ZC1wZW9wbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInByb2Nlc3NGaWx0ZXJQcm9wZXJ0eS50eXBlID09PSAncGVvcGxlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ByZVNlbGVjdFVzZXJzXT1cImluaXRpYXRvck9wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJwcm9jZXNzRmlsdGVyUHJvcGVydHkubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0ZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXBwTmFtZV09XCJhcHBOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbW9kZV09XCJwcm9jZXNzRmlsdGVyUHJvcGVydHkuc2VsZWN0aW9uTW9kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZWRVc2Vycyk9XCJvbkNoYW5nZWRVc2VyKCRldmVudCwgcHJvY2Vzc0ZpbHRlclByb3BlcnR5KVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L21hdC1leHBhbnNpb24tcGFuZWw+XG48L21hdC1hY2NvcmRpb24+XG4iXX0=
|