@unifylib/ui-lib 1.0.3 → 1.1.4
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/esm2022/iq-ui-lib.mjs +5 -0
- package/esm2022/lib/base-model/SearchStrConfig.mjs +11 -0
- package/esm2022/lib/base-model/api-response.mjs +2 -0
- package/esm2022/lib/base-model/audit-log-entry.mjs +3 -0
- package/esm2022/lib/base-model/button-action-settings.mjs +16 -0
- package/esm2022/lib/base-model/column-def.model.mjs +28 -0
- package/esm2022/lib/base-model/do-action-request.mjs +8 -0
- package/esm2022/lib/base-model/field-action.mjs +6 -0
- package/esm2022/lib/base-model/field-filter.model.mjs +3 -0
- package/esm2022/lib/base-model/field-info.mjs +57 -0
- package/esm2022/lib/base-model/field-predicate.model.mjs +10 -0
- package/esm2022/lib/base-model/filter-request.mjs +13 -0
- package/esm2022/lib/base-model/filter.model.mjs +25 -0
- package/esm2022/lib/base-model/get-items-list.mjs +10 -0
- package/esm2022/lib/base-model/index.mjs +12 -0
- package/esm2022/lib/base-model/items-total.model.mjs +8 -0
- package/esm2022/lib/base-model/line-item.model.mjs +11 -0
- package/esm2022/lib/base-model/lookupItem.mjs +16 -0
- package/esm2022/lib/base-model/page-info.mjs +17 -0
- package/esm2022/lib/base-model/report-request.model.mjs +17 -0
- package/esm2022/lib/base-model/response-envelop.model.mjs +10 -0
- package/esm2022/lib/base-model/snack-message.model.mjs +11 -0
- package/esm2022/lib/base-model/table-column.interface.mjs +2 -0
- package/esm2022/lib/base-model/table-page-user-action.interface.mjs +21 -0
- package/esm2022/lib/base-model/workflow/workflow-steps.model.mjs +9 -0
- package/esm2022/lib/base-model/workflow/workflow.model.mjs +42 -0
- package/esm2022/lib/components/action-comment/action-comment.component.mjs +101 -0
- package/esm2022/lib/components/action-confirmation/action-confirmation.component.mjs +55 -0
- package/esm2022/lib/components/activity-report-form/activity-report-form.component.mjs +499 -0
- package/esm2022/lib/components/advanced-filter/field-filter/field-filter.component.mjs +41 -0
- package/esm2022/lib/components/advanced-filter/filter-builder/filter-builder.component.mjs +162 -0
- package/esm2022/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.mjs +70 -0
- package/esm2022/lib/components/audit-log-list/audit-log.component.mjs +99 -0
- package/esm2022/lib/components/auto-complete/auto-complete.component.mjs +292 -0
- package/esm2022/lib/components/base-form/base-form.component.mjs +297 -0
- package/esm2022/lib/components/base-form-canvas/base-form-canvas.component.mjs +591 -0
- package/esm2022/lib/components/base-input-dialog/base-input-dialog.component.mjs +72 -0
- package/esm2022/lib/components/base-table/base-table.component.mjs +514 -0
- package/esm2022/lib/components/button-actions/button-actions.component.mjs +70 -0
- package/esm2022/lib/components/editable-base-table/editable-base-table.component.mjs +496 -0
- package/esm2022/lib/components/equation-builder/equation-builder.component.mjs +112 -0
- package/esm2022/lib/components/item-line-editor/item-line-editor.component.mjs +299 -0
- package/esm2022/lib/components/multi-auto-complete/multi-auto-complete.component.mjs +278 -0
- package/esm2022/lib/components/paginator/paginator.component.mjs +91 -0
- package/esm2022/lib/components/report-details-dialog/report-details-dialog.component.mjs +102 -0
- package/esm2022/lib/components/report-form/report-form.component.mjs +498 -0
- package/esm2022/lib/components/search-bar/search-bar.component.mjs +62 -0
- package/esm2022/lib/components/section-form-canvas/section-form-canvas.component.mjs +81 -0
- package/esm2022/lib/components/shared/action-button/action-button.component.mjs +59 -0
- package/esm2022/lib/components/shared/action-card/action-card.component.mjs +93 -0
- package/esm2022/lib/components/shared/attachment-uploader/attachment-uploader.component.mjs +70 -0
- package/esm2022/lib/components/shared-list/shared-list.component.mjs +47 -0
- package/esm2022/lib/components/snackbar-static/snackbar-static.component.mjs +43 -0
- package/esm2022/lib/components/title-bar/title-bar.component.mjs +119 -0
- package/esm2022/lib/services/backend-service.mjs +240 -0
- package/esm2022/lib/services/index.mjs +4 -0
- package/esm2022/lib/services/top-panel.mjs +22 -0
- package/esm2022/lib/services/trigger-form.service.mjs +17 -0
- package/esm2022/lib/utils/base-utils.mjs +97 -0
- package/esm2022/lib/validators/date-range-validator.mjs +27 -0
- package/esm2022/lib/validators/index.mjs +4 -0
- package/esm2022/lib/validators/match-list.validator.mjs +9 -0
- package/esm2022/lib/validators/multi-email-validator.mjs +13 -0
- package/esm2022/public-api.mjs +29 -0
- package/esm2022/q-btech-ui-lib.mjs +5 -0
- package/esm2022/unifylib-ui-lib.mjs +5 -0
- package/fesm2022/iq-ui-lib.mjs +5625 -0
- package/fesm2022/iq-ui-lib.mjs.map +1 -0
- package/fesm2022/q-btech-ui-lib.mjs +5619 -0
- package/fesm2022/q-btech-ui-lib.mjs.map +1 -0
- package/fesm2022/unifylib-ui-lib.mjs +5625 -0
- package/fesm2022/unifylib-ui-lib.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/base-model/SearchStrConfig.d.ts +8 -0
- package/{src/lib/base-model/api-response.ts → lib/base-model/api-response.d.ts} +5 -7
- package/lib/base-model/audit-log-entry.d.ts +7 -0
- package/lib/base-model/button-action-settings.d.ts +15 -0
- package/lib/base-model/column-def.model.d.ts +11 -0
- package/lib/base-model/do-action-request.d.ts +10 -0
- package/lib/base-model/field-action.d.ts +6 -0
- package/lib/base-model/field-filter.model.d.ts +7 -0
- package/lib/base-model/field-info.d.ts +53 -0
- package/lib/base-model/field-predicate.model.d.ts +7 -0
- package/lib/base-model/filter-request.d.ts +15 -0
- package/lib/base-model/filter.model.d.ts +22 -0
- package/lib/base-model/get-items-list.d.ts +21 -0
- package/lib/base-model/index.d.ts +11 -0
- package/lib/base-model/items-total.model.d.ts +6 -0
- package/lib/base-model/line-item.model.d.ts +9 -0
- package/lib/base-model/lookupItem.d.ts +13 -0
- package/{src/lib/base-model/page-info.ts → lib/base-model/page-info.d.ts} +25 -24
- package/lib/base-model/report-request.model.d.ts +18 -0
- package/lib/base-model/response-envelop.model.d.ts +8 -0
- package/lib/base-model/snack-message.model.d.ts +7 -0
- package/lib/base-model/table-column.interface.d.ts +28 -0
- package/lib/base-model/table-page-user-action.interface.d.ts +14 -0
- package/lib/base-model/workflow/workflow-steps.model.d.ts +7 -0
- package/lib/base-model/workflow/workflow.model.d.ts +13 -0
- package/lib/components/action-comment/action-comment.component.d.ts +32 -0
- package/lib/components/action-confirmation/action-confirmation.component.d.ts +19 -0
- package/lib/components/activity-report-form/activity-report-form.component.d.ts +93 -0
- package/lib/components/advanced-filter/field-filter/field-filter.component.d.ts +20 -0
- package/lib/components/advanced-filter/filter-builder/filter-builder.component.d.ts +28 -0
- package/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.d.ts +25 -0
- package/lib/components/audit-log-list/audit-log.component.d.ts +36 -0
- package/lib/components/auto-complete/auto-complete.component.d.ts +51 -0
- package/lib/components/base-form/base-form.component.d.ts +59 -0
- package/lib/components/base-form-canvas/base-form-canvas.component.d.ts +124 -0
- package/lib/components/base-input-dialog/base-input-dialog.component.d.ts +23 -0
- package/lib/components/base-table/base-table.component.d.ts +128 -0
- package/lib/components/button-actions/button-actions.component.d.ts +17 -0
- package/lib/components/editable-base-table/editable-base-table.component.d.ts +106 -0
- package/lib/components/equation-builder/equation-builder.component.d.ts +23 -0
- package/lib/components/item-line-editor/item-line-editor.component.d.ts +64 -0
- package/lib/components/multi-auto-complete/multi-auto-complete.component.d.ts +51 -0
- package/lib/components/paginator/paginator.component.d.ts +26 -0
- package/lib/components/report-details-dialog/report-details-dialog.component.d.ts +34 -0
- package/lib/components/report-form/report-form.component.d.ts +92 -0
- package/lib/components/search-bar/search-bar.component.d.ts +29 -0
- package/lib/components/section-form-canvas/section-form-canvas.component.d.ts +27 -0
- package/lib/components/shared/action-button/action-button.component.d.ts +17 -0
- package/lib/components/shared/action-card/action-card.component.d.ts +37 -0
- package/lib/components/shared/attachment-uploader/attachment-uploader.component.d.ts +16 -0
- package/lib/components/shared-list/shared-list.component.d.ts +21 -0
- package/lib/components/snackbar-static/snackbar-static.component.d.ts +15 -0
- package/lib/components/title-bar/title-bar.component.d.ts +42 -0
- package/lib/services/backend-service.d.ts +59 -0
- package/{src/lib/services/index.ts → lib/services/index.d.ts} +1 -1
- package/lib/services/top-panel.d.ts +8 -0
- package/lib/services/trigger-form.service.d.ts +7 -0
- package/lib/utils/base-utils.d.ts +13 -0
- package/lib/validators/date-range-validator.d.ts +2 -0
- package/lib/validators/match-list.validator.d.ts +4 -0
- package/lib/validators/multi-email-validator.d.ts +6 -0
- package/package.json +19 -4
- package/{src/public-api.ts → public-api.d.ts} +22 -18
- package/ng-package.json +0 -7
- package/src/lib/base-model/SearchStrConfig.ts +0 -12
- package/src/lib/base-model/audit-log-entry.ts +0 -7
- package/src/lib/base-model/button-action-settings.ts +0 -25
- package/src/lib/base-model/column-def.model.ts +0 -34
- package/src/lib/base-model/do-action-request.ts +0 -11
- package/src/lib/base-model/field-action.ts +0 -7
- package/src/lib/base-model/field-filter.model.ts +0 -14
- package/src/lib/base-model/field-info.ts +0 -98
- package/src/lib/base-model/field-predicate.model.ts +0 -7
- package/src/lib/base-model/filter-request.ts +0 -27
- package/src/lib/base-model/filter.model.ts +0 -49
- package/src/lib/base-model/get-items-list.ts +0 -24
- package/src/lib/base-model/index.ts +0 -11
- package/src/lib/base-model/lookupItem.ts +0 -21
- package/src/lib/base-model/null-snackmessage.ts +0 -9
- package/src/lib/base-model/report-request.model.ts +0 -33
- package/src/lib/base-model/response-envelop.model.ts +0 -15
- package/src/lib/base-model/snack-message.model.ts +0 -14
- package/src/lib/base-model/snackmessage-interface.ts +0 -7
- package/src/lib/base-model/table-column.interface.ts +0 -29
- package/src/lib/base-model/table-page-user-action.interface.ts +0 -33
- package/src/lib/base-model/workflow/workflow-steps.model.ts +0 -9
- package/src/lib/base-model/workflow/workflow.model.ts +0 -52
- package/src/lib/components/action-confirmation/action-confirmation.component.css +0 -34
- package/src/lib/components/action-confirmation/action-confirmation.component.html +0 -18
- package/src/lib/components/action-confirmation/action-confirmation.component.spec.ts +0 -23
- package/src/lib/components/action-confirmation/action-confirmation.component.ts +0 -58
- package/src/lib/components/activity-report-form/activity-report-form.component.html +0 -109
- package/src/lib/components/activity-report-form/activity-report-form.component.scss +0 -0
- package/src/lib/components/activity-report-form/activity-report-form.component.spec.ts +0 -25
- package/src/lib/components/activity-report-form/activity-report-form.component.ts +0 -605
- package/src/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.css +0 -51
- package/src/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.html +0 -23
- package/src/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.spec.ts +0 -23
- package/src/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.ts +0 -69
- package/src/lib/components/audit-log-list/audit-log.component.html +0 -23
- package/src/lib/components/audit-log-list/audit-log.component.scss +0 -0
- package/src/lib/components/audit-log-list/audit-log.component.spec.ts +0 -25
- package/src/lib/components/audit-log-list/audit-log.component.ts +0 -116
- package/src/lib/components/auto-complete/auto-complete.component.css +0 -14
- package/src/lib/components/auto-complete/auto-complete.component.html +0 -29
- package/src/lib/components/auto-complete/auto-complete.component.spec.ts +0 -23
- package/src/lib/components/auto-complete/auto-complete.component.ts +0 -330
- package/src/lib/components/base-form/base-form.component.html +0 -58
- package/src/lib/components/base-form/base-form.component.scss +0 -0
- package/src/lib/components/base-form/base-form.component.spec.ts +0 -25
- package/src/lib/components/base-form/base-form.component.ts +0 -305
- package/src/lib/components/base-form-canvas/base-form-canvas.component.css +0 -22
- package/src/lib/components/base-form-canvas/base-form-canvas.component.html +0 -1006
- package/src/lib/components/base-form-canvas/base-form-canvas.component.spec.ts +0 -23
- package/src/lib/components/base-form-canvas/base-form-canvas.component.ts +0 -573
- package/src/lib/components/base-input-dialog/base-input-dialog.component.css +0 -0
- package/src/lib/components/base-input-dialog/base-input-dialog.component.html +0 -42
- package/src/lib/components/base-input-dialog/base-input-dialog.component.spec.ts +0 -23
- package/src/lib/components/base-input-dialog/base-input-dialog.component.ts +0 -78
- package/src/lib/components/base-table/base-table.component.html +0 -242
- package/src/lib/components/base-table/base-table.component.scss +0 -31
- package/src/lib/components/base-table/base-table.component.spec.ts +0 -25
- package/src/lib/components/base-table/base-table.component.ts +0 -568
- package/src/lib/components/button-actions/button-actions.component.html +0 -28
- package/src/lib/components/button-actions/button-actions.component.scss +0 -6
- package/src/lib/components/button-actions/button-actions.component.spec.ts +0 -23
- package/src/lib/components/button-actions/button-actions.component.ts +0 -72
- package/src/lib/components/editable-base-table/editable-base-table.component.html +0 -372
- package/src/lib/components/editable-base-table/editable-base-table.component.scss +0 -44
- package/src/lib/components/editable-base-table/editable-base-table.component.spec.ts +0 -25
- package/src/lib/components/editable-base-table/editable-base-table.component.ts +0 -570
- package/src/lib/components/equation-builder/equation-builder.component.css +0 -0
- package/src/lib/components/equation-builder/equation-builder.component.html +0 -31
- package/src/lib/components/equation-builder/equation-builder.component.spec.ts +0 -23
- package/src/lib/components/equation-builder/equation-builder.component.ts +0 -121
- package/src/lib/components/multi-auto-complete/multi-auto-complete.component.css +0 -11
- package/src/lib/components/multi-auto-complete/multi-auto-complete.component.html +0 -38
- package/src/lib/components/multi-auto-complete/multi-auto-complete.component.spec.ts +0 -23
- package/src/lib/components/multi-auto-complete/multi-auto-complete.component.ts +0 -317
- package/src/lib/components/paginator/paginator.component.css +0 -25
- package/src/lib/components/paginator/paginator.component.html +0 -34
- package/src/lib/components/paginator/paginator.component.ts +0 -94
- package/src/lib/components/rejection-comment/action-comment.component.css +0 -33
- package/src/lib/components/rejection-comment/action-comment.component.html +0 -46
- package/src/lib/components/rejection-comment/action-comment.component.spec.ts +0 -23
- package/src/lib/components/rejection-comment/action-comment.component.ts +0 -86
- package/src/lib/components/report-details-dialog/report-details-dialog.component.css +0 -17
- package/src/lib/components/report-details-dialog/report-details-dialog.component.html +0 -16
- package/src/lib/components/report-details-dialog/report-details-dialog.component.spec.ts +0 -23
- package/src/lib/components/report-details-dialog/report-details-dialog.component.ts +0 -113
- package/src/lib/components/report-form/report-form.component.html +0 -94
- package/src/lib/components/report-form/report-form.component.scss +0 -0
- package/src/lib/components/report-form/report-form.component.spec.ts +0 -25
- package/src/lib/components/report-form/report-form.component.ts +0 -588
- package/src/lib/components/search-bar/search-bar.component.html +0 -62
- package/src/lib/components/search-bar/search-bar.component.scss +0 -8
- package/src/lib/components/search-bar/search-bar.component.spec.ts +0 -25
- package/src/lib/components/search-bar/search-bar.component.ts +0 -70
- package/src/lib/components/shared/attachment-uploader/attachment-uploader.component.css +0 -54
- package/src/lib/components/shared/attachment-uploader/attachment-uploader.component.html +0 -22
- package/src/lib/components/shared/attachment-uploader/attachment-uploader.component.spec.ts +0 -23
- package/src/lib/components/shared/attachment-uploader/attachment-uploader.component.ts +0 -45
- package/src/lib/components/shared-list/shared-list.component.css +0 -0
- package/src/lib/components/shared-list/shared-list.component.html +0 -17
- package/src/lib/components/shared-list/shared-list.component.spec.ts +0 -23
- package/src/lib/components/shared-list/shared-list.component.ts +0 -53
- package/src/lib/components/title-bar/title-bar.component.css +0 -0
- package/src/lib/components/title-bar/title-bar.component.css.map +0 -1
- package/src/lib/components/title-bar/title-bar.component.html +0 -31
- package/src/lib/components/title-bar/title-bar.component.scss +0 -23
- package/src/lib/components/title-bar/title-bar.component.spec.ts +0 -23
- package/src/lib/components/title-bar/title-bar.component.ts +0 -119
- package/src/lib/services/backend-service.ts +0 -286
- package/src/lib/services/top-panel.ts +0 -17
- package/src/lib/services/trigger-form.service.ts +0 -11
- package/src/lib/share-module/shared-module.ts +0 -10
- package/src/lib/styles/invoiceq-theme.scss +0 -252
- package/src/lib/styles/styles.scss +0 -1723
- package/src/lib/utils/base-utils.ts +0 -102
- package/src/lib/validators/date-range-validator.ts +0 -31
- package/src/lib/validators/match-list.validator.ts +0 -10
- package/src/lib/validators/multi-email-validator.ts +0 -15
- package/tsconfig.lib.json +0 -15
- package/tsconfig.lib.prod.json +0 -11
- package/tsconfig.spec.json +0 -15
- /package/{src/lib/validators/index.ts → lib/validators/index.d.ts} +0 -0
|
@@ -0,0 +1,498 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import { EMPTY_PAGE_INFO } from "../../base-model/page-info";
|
|
3
|
+
import { TranslateModule } from "@ngx-translate/core";
|
|
4
|
+
import { formatDate, NgForOf, NgIf } from "@angular/common";
|
|
5
|
+
import { MatMenu, MatMenuItem, MatMenuTrigger } from "@angular/material/menu";
|
|
6
|
+
import { MatButton, MatButtonModule } from "@angular/material/button";
|
|
7
|
+
import { BaseTableComponent } from "../base-table/base-table.component";
|
|
8
|
+
import { MatIconModule } from "@angular/material/icon";
|
|
9
|
+
import { FilterRequest } from "../../base-model/filter-request";
|
|
10
|
+
import { ReportRequest } from "../../base-model/report-request.model";
|
|
11
|
+
import { Filter } from "../../base-model/filter.model";
|
|
12
|
+
import { TitleBarComponent } from "../title-bar/title-bar.component";
|
|
13
|
+
import { BaseFormCanvasComponent } from "../base-form-canvas/base-form-canvas.component";
|
|
14
|
+
import ClassicEditor from "@ckeditor/ckeditor5-build-classic";
|
|
15
|
+
import { DRILL_DOWN_ACTION, JUNIOR_DOWN_ACTION, SnackMessage } from "../../base-model";
|
|
16
|
+
import { ReportDetailsDialogComponent } from "../report-details-dialog/report-details-dialog.component";
|
|
17
|
+
import { cloneDeep } from 'lodash';
|
|
18
|
+
import { MatTooltip } from "@angular/material/tooltip";
|
|
19
|
+
import * as i0 from "@angular/core";
|
|
20
|
+
import * as i1 from "@ngx-translate/core";
|
|
21
|
+
import * as i2 from "../../services/backend-service";
|
|
22
|
+
import * as i3 from "@angular/router";
|
|
23
|
+
import * as i4 from "@angular/cdk/bidi";
|
|
24
|
+
import * as i5 from "@angular/material/dialog";
|
|
25
|
+
import * as i6 from "@angular/forms";
|
|
26
|
+
import * as i7 from "@angular/material/button";
|
|
27
|
+
import * as i8 from "@angular/material/icon";
|
|
28
|
+
const NON_REPORT_COLUMNS = ['listAction', 'button', 'checkbox'];
|
|
29
|
+
export class ReportFormComponent {
|
|
30
|
+
constructor(translateService, backendService, activatedRoute, injector, router, route, directionality, dialog, fb) {
|
|
31
|
+
this.translateService = translateService;
|
|
32
|
+
this.backendService = backendService;
|
|
33
|
+
this.activatedRoute = activatedRoute;
|
|
34
|
+
this.injector = injector;
|
|
35
|
+
this.router = router;
|
|
36
|
+
this.route = route;
|
|
37
|
+
this.directionality = directionality;
|
|
38
|
+
this.dialog = dialog;
|
|
39
|
+
this.fb = fb;
|
|
40
|
+
this.showDetails = [];
|
|
41
|
+
this.showExtractButton = true;
|
|
42
|
+
this.columns = [];
|
|
43
|
+
this.userAction = new EventEmitter();
|
|
44
|
+
this.activeLevel = 1;
|
|
45
|
+
this.isEditable = true;
|
|
46
|
+
this.fields = [];
|
|
47
|
+
this.pageInfo = EMPTY_PAGE_INFO;
|
|
48
|
+
this.drillDownPageInfo = EMPTY_PAGE_INFO;
|
|
49
|
+
this.drillDownColumns = [];
|
|
50
|
+
this.juniorPageInfo = EMPTY_PAGE_INFO;
|
|
51
|
+
this.juniorColumns = [];
|
|
52
|
+
this.columnsDefinition = [];
|
|
53
|
+
this.types = ["pdf", "csv", "xlsx"];
|
|
54
|
+
this.searchStr = '';
|
|
55
|
+
this.errors = [];
|
|
56
|
+
this.reloadData = false;
|
|
57
|
+
this.backButtonEnabled = true;
|
|
58
|
+
this.reportRequest = new ReportRequest({});
|
|
59
|
+
this.childReportRequest = new ReportRequest({});
|
|
60
|
+
this.juniorReportRequest = new ReportRequest({});
|
|
61
|
+
this.readyToSearch = false;
|
|
62
|
+
this.disableExportAction = false;
|
|
63
|
+
ClassicEditor.defaultConfig = {
|
|
64
|
+
toolbar: {
|
|
65
|
+
items: ['heading', '|', 'bold', 'italic', '|', 'bulletedList', 'numberedList']
|
|
66
|
+
},
|
|
67
|
+
image: {
|
|
68
|
+
toolbar: ['imageStyle:side', '|', 'imageTextAlternative']
|
|
69
|
+
},
|
|
70
|
+
table: {
|
|
71
|
+
contentToolbar: ['tableColumn', 'tableRow', 'mergeTableCells']
|
|
72
|
+
},
|
|
73
|
+
language: 'en'
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
ngOnInit() {
|
|
77
|
+
this.currentDirection = this.directionality.value;
|
|
78
|
+
this.directionality.change.subscribe((value) => {
|
|
79
|
+
this.currentDirection = value;
|
|
80
|
+
});
|
|
81
|
+
this.activatedRoute.data.subscribe(data => {
|
|
82
|
+
this.pageInfo = data['pageInfo'];
|
|
83
|
+
this.pageSize = this.pageInfo.pageSize ?? 10;
|
|
84
|
+
this.filterRequest = new FilterRequest(this.pageSize);
|
|
85
|
+
data['pageInfo'].lazyLoadData = true;
|
|
86
|
+
this.drillDownPageInfo = data['drillDownPageInfo'];
|
|
87
|
+
this.drillDownColumns = data['drillDownColumns']?.filter(c => c.property !== 'selectItem');
|
|
88
|
+
this.hideDrillDownButton = data['hideDrillDownButton'] ?? false;
|
|
89
|
+
this.juniorPageInfo = data['juniorPageInfo'];
|
|
90
|
+
this.juniorColumns = data['juniorColumns'];
|
|
91
|
+
this.columnsDefinition = data['columnsDefinition'].filter(c => (this.drillDownPageInfo && this.drillDownColumns || (!NON_REPORT_COLUMNS.includes(c.type))));
|
|
92
|
+
this.fields = data['fields'];
|
|
93
|
+
if (data['enrichDrillDownReportRequest']) {
|
|
94
|
+
this.enrichDrillDownReportRequest = data['enrichDrillDownReportRequest'](this.injector);
|
|
95
|
+
}
|
|
96
|
+
if (data['enrichJuniorReportRequest']) {
|
|
97
|
+
this.enrichJuniorReportRequest = data['enrichJuniorReportRequest'](this.injector);
|
|
98
|
+
}
|
|
99
|
+
if (data['enrichHyperLinkReportRequest']) {
|
|
100
|
+
this.enrichHyperLinkReportRequest = data['enrichHyperLinkReportRequest'](this.injector);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
this.route.queryParamMap.subscribe(params => {
|
|
104
|
+
const isComparisonReport = params.get('comparisonReport') === 'true';
|
|
105
|
+
if (isComparisonReport) {
|
|
106
|
+
const comparisonStr = sessionStorage.getItem('comparisonReportPageInfo');
|
|
107
|
+
if (comparisonStr) {
|
|
108
|
+
const comparisonData = JSON.parse(comparisonStr);
|
|
109
|
+
this.pageInfo.lazyLoadData = comparisonData.lazyLoadData ?? false;
|
|
110
|
+
this.activeLevel = comparisonData.activeLevel ?? 2;
|
|
111
|
+
this.isEditable = false;
|
|
112
|
+
this.backButtonEnabled = false;
|
|
113
|
+
this.drillDownPageInfo = comparisonData.drillDownPageInfo;
|
|
114
|
+
this.drillDownColumns = comparisonData.drillDownColumns;
|
|
115
|
+
this.reportForm = this.fb.group({
|
|
116
|
+
directorate: [[]],
|
|
117
|
+
fromDate: [''],
|
|
118
|
+
toDate: [''],
|
|
119
|
+
sector: [''],
|
|
120
|
+
});
|
|
121
|
+
this.reportForm.patchValue(comparisonData.form);
|
|
122
|
+
this.fields = this.fields.filter(c => c.type !== 'checkbox');
|
|
123
|
+
const reportRequest = comparisonData.reportRequest;
|
|
124
|
+
this.childReportRequest = this.backendService.buildReportRequest(this.drillDownColumns, `${this.drillDownPageInfo.labelsSection}.${this.drillDownPageInfo.id}`, reportRequest, '', this.drillDownPageInfo, 'LANDSCAPE');
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
// ngOnChanges({item, errors, fields}: SimpleChanges): void {
|
|
130
|
+
// // errors?.currentValue?.forEach((msg: FieldMessage) => {
|
|
131
|
+
// // this.backendService.parentForm.get(msg.fieldName)?.setErrors({serverError: msg.message});
|
|
132
|
+
// // });
|
|
133
|
+
// // if (fields?.currentValue && !fields.isFirstChange()){
|
|
134
|
+
// // this.buildForm();
|
|
135
|
+
// // }
|
|
136
|
+
// // this.buildForm();
|
|
137
|
+
// }
|
|
138
|
+
isMatchHeight() {
|
|
139
|
+
return this.pageInfo.pageHeight === 'match';
|
|
140
|
+
}
|
|
141
|
+
doAction(type) {
|
|
142
|
+
if (this.backendService.parentForm.valid) {
|
|
143
|
+
this.reloadData = !this.reloadData;
|
|
144
|
+
const filterRequest = new FilterRequest(this.pageSize);
|
|
145
|
+
filterRequest.filters = [];
|
|
146
|
+
let paramsString = [];
|
|
147
|
+
this.fields.filter(x => x.type !== 'spacer').forEach(f => {
|
|
148
|
+
if (this.getParamValue(f) != null && this.getParamValue(f).toString().trim() !== '') {
|
|
149
|
+
if (f.type === 'multi-select' || f.type === 'lookup') {
|
|
150
|
+
// do not filter if this field as cascading for another one and the other one got selected values
|
|
151
|
+
const childFieldIdx = this.fields.findIndex(field => field.cascadedBy === f.property);
|
|
152
|
+
if (childFieldIdx > -1 && this.backendService.parentForm.get(this.fields[childFieldIdx].property)?.value?.length > 0) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
const idz = [];
|
|
156
|
+
const param = [];
|
|
157
|
+
if (this.backendService.parentForm.get(f.property)?.value && Array.isArray(this.backendService.parentForm.get(f.property)?.value)
|
|
158
|
+
&& this.backendService.parentForm.get(f.property)?.value.length > 0) {
|
|
159
|
+
this.backendService.parentForm.get(f.property)?.value.forEach((a) => {
|
|
160
|
+
if (f.flattenBySubAttribute) {
|
|
161
|
+
idz.push(a[f.flattenBySubAttribute]);
|
|
162
|
+
param.push(a[f.flattenBySubAttribute]);
|
|
163
|
+
}
|
|
164
|
+
else if (this.fields.find(s => s.property === 'terminalId')) {
|
|
165
|
+
idz.push(a.channelId);
|
|
166
|
+
param.push(a.englishName);
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
idz.push(a.id);
|
|
170
|
+
param.push(a.englishName);
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
filterRequest.filters?.push(new Filter({
|
|
174
|
+
id: f.property, fieldName: f.property, label: this.translateService.instant(f.label),
|
|
175
|
+
filterType: 'FILED_FILTER', operator: f.filterOperator,
|
|
176
|
+
valueObject: idz
|
|
177
|
+
}));
|
|
178
|
+
paramsString.push(this.translateService.instant(f.label) + ' : ' + param.join(','));
|
|
179
|
+
}
|
|
180
|
+
else if (this.backendService.parentForm.get(f.property)?.value && f.flattenBySubAttribute) {
|
|
181
|
+
filterRequest.filters?.push(new Filter({
|
|
182
|
+
id: f.property, fieldName: f.property, label: this.translateService.instant(f.label),
|
|
183
|
+
filterType: 'FILED_FILTER', operator: f.filterOperator,
|
|
184
|
+
valueObject: this.getParamValue(f)[f.flattenBySubAttribute]
|
|
185
|
+
}));
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
if (this.backendService.parentForm.get(f.property)?.value !== null &&
|
|
190
|
+
this.backendService.parentForm.get(f.property)?.value !== undefined &&
|
|
191
|
+
this.backendService.parentForm.get(f.property)?.value !== "") {
|
|
192
|
+
filterRequest.filters?.push(new Filter({
|
|
193
|
+
id: f.property, fieldName: f.property, label: this.translateService.instant(f.label),
|
|
194
|
+
filterType: 'FILED_FILTER', operator: f.filterOperator,
|
|
195
|
+
valueObject: this.getParamValue(f)
|
|
196
|
+
}));
|
|
197
|
+
}
|
|
198
|
+
paramsString.push(this.translateService.instant(f.label) + ' : ' + this.getParamValueLabel(f));
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
const reportRequest = this.backendService.buildReportRequest(this.columnsDefinition, this.pageInfo.labelsSection + '.' + this.pageInfo.id, filterRequest, type, this.pageInfo, 'LANDSCAPE');
|
|
203
|
+
reportRequest.searchStr = paramsString.join(' , ');
|
|
204
|
+
this.reportRequest = reportRequest;
|
|
205
|
+
// this.activeLevel = 1;
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
this.backendService.topPanelMessage$.next(new SnackMessage('INVALID_REPORT_FORM', true, 'error'));
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
getParamValue(f) {
|
|
212
|
+
if (f.type === 'date' && this.backendService.parentForm.get(f.property)?.value) {
|
|
213
|
+
return formatDate(this.backendService.parentForm.get(f.property)?.value, 'yyyy-MM-dd', 'en_US');
|
|
214
|
+
}
|
|
215
|
+
else if (f.type === 'checkbox') {
|
|
216
|
+
return !!this.backendService.parentForm.get(f.property)?.value;
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
return this.backendService.parentForm.get(f.property)?.value;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
getParamValueLabel(f) {
|
|
223
|
+
if (f.type === 'checkbox') {
|
|
224
|
+
return this.backendService.parentForm.get(f.property)?.value ? this.translateService.instant('yes') : this.translateService.instant('no');
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
return this.backendService.parentForm.get(f.property)?.value;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
getTitle() {
|
|
231
|
+
const pageInfoMap = {
|
|
232
|
+
1: this.pageInfo,
|
|
233
|
+
2: this.drillDownPageInfo,
|
|
234
|
+
3: this.juniorPageInfo
|
|
235
|
+
};
|
|
236
|
+
const currentInfo = pageInfoMap[this.activeLevel] || this.pageInfo;
|
|
237
|
+
return `${currentInfo.labelsSection}.${currentInfo.id}`;
|
|
238
|
+
}
|
|
239
|
+
updateForm($event) {
|
|
240
|
+
this.reportForm = $event;
|
|
241
|
+
this.backendService.parentForm = $event;
|
|
242
|
+
this.setupDependentFieldWatchers();
|
|
243
|
+
this.backendService.parentForm.valueChanges.subscribe(x => {
|
|
244
|
+
this.readyToSearch = this.backendService.parentForm.valid;
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
setupDependentFieldWatchers() {
|
|
248
|
+
this.fields
|
|
249
|
+
.filter(field => field.lookupFilterList && field.lookupFilterList.length > 0)
|
|
250
|
+
.forEach(field => {
|
|
251
|
+
const dependentFields = field.lookupFilterList.map(f => f.fieldName);
|
|
252
|
+
dependentFields.forEach(dependentFieldName => {
|
|
253
|
+
const dependentControl = this.reportForm.get(dependentFieldName);
|
|
254
|
+
if (dependentControl) {
|
|
255
|
+
dependentControl.valueChanges.subscribe(() => {
|
|
256
|
+
const targetControl = this.reportForm.get(field.property);
|
|
257
|
+
if (targetControl) {
|
|
258
|
+
targetControl.setValue([]);
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
});
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
isValidForm() {
|
|
266
|
+
return this.readyToSearch;
|
|
267
|
+
}
|
|
268
|
+
emitUserAction($event) {
|
|
269
|
+
$event.pageInfo = this.pageInfo;
|
|
270
|
+
this.doADrillDownAction($event);
|
|
271
|
+
}
|
|
272
|
+
emitHyperLinkAction($event) {
|
|
273
|
+
if (!this.shouldProcessEventItem($event.item))
|
|
274
|
+
return;
|
|
275
|
+
const item = $event.item;
|
|
276
|
+
this.prepareDialogReportRequest(item);
|
|
277
|
+
const reportRequest = this.buildDialogReportRequest();
|
|
278
|
+
reportRequest.filterRequest.pageIndex = 0;
|
|
279
|
+
const dialogRef = this.dialog.open(ReportDetailsDialogComponent, {
|
|
280
|
+
data: {
|
|
281
|
+
pageInfo: this.juniorPageInfo,
|
|
282
|
+
request: reportRequest,
|
|
283
|
+
columns: this.juniorColumns,
|
|
284
|
+
item,
|
|
285
|
+
},
|
|
286
|
+
height: '50vw',
|
|
287
|
+
maxWidth: '120vw',
|
|
288
|
+
direction: this.currentDirection,
|
|
289
|
+
disableClose: false,
|
|
290
|
+
});
|
|
291
|
+
dialogRef.afterOpened().subscribe(() => this.doHyperLinkAction($event));
|
|
292
|
+
dialogRef.afterClosed().subscribe(() => { });
|
|
293
|
+
}
|
|
294
|
+
prepareDialogReportRequest(item) {
|
|
295
|
+
this.dialogReportRequest = cloneDeep(this.reportRequest);
|
|
296
|
+
this.dialogReportRequest.filterRequest = { filters: [] };
|
|
297
|
+
this.addStandardFilters(item);
|
|
298
|
+
this.addOrReplaceFilter('isec1', 'iSec', item['isec_value']);
|
|
299
|
+
this.addFilterType();
|
|
300
|
+
}
|
|
301
|
+
addStandardFilters(item) {
|
|
302
|
+
const standardFilters = [
|
|
303
|
+
{ key: 'period', value: item['period'] },
|
|
304
|
+
{ key: 'year', value: item['year'] },
|
|
305
|
+
{ key: 'sector', value: item['sectorCode'] },
|
|
306
|
+
{ key: 'directorate', value: item['directorateCode'] },
|
|
307
|
+
{ key: 'subTaxRate', value: item['tax_rate_code'] },
|
|
308
|
+
];
|
|
309
|
+
standardFilters.forEach(({ key, value }) => this.dialogReportRequest.filterRequest.filters.push(this.createFilter(key, key, value)));
|
|
310
|
+
}
|
|
311
|
+
addFilterType() {
|
|
312
|
+
const isTax = this.dialogReportRequest.actionKey?.toLowerCase().includes('tax');
|
|
313
|
+
const filterType = isTax ? 'TAX' : 'VALUE';
|
|
314
|
+
this.dialogReportRequest.filterRequest.filters.push(this.createFilter('filterType', 'filterType', filterType));
|
|
315
|
+
}
|
|
316
|
+
buildDialogReportRequest() {
|
|
317
|
+
return this.backendService.buildReportRequest(this.juniorColumns, `${this.juniorPageInfo.labelsSection}.${this.juniorPageInfo.id}`, { ...this.dialogReportRequest.filterRequest }, '', this.juniorPageInfo, 'LANDSCAPE');
|
|
318
|
+
}
|
|
319
|
+
createFilter(key, fieldName, value) {
|
|
320
|
+
return new Filter({
|
|
321
|
+
key,
|
|
322
|
+
fieldName,
|
|
323
|
+
label: '',
|
|
324
|
+
filterType: 'FILED_FILTER',
|
|
325
|
+
operator: 'EQUALS',
|
|
326
|
+
valueObject: value,
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
addOrReplaceFilter(id, fieldName, value) {
|
|
330
|
+
const filter = new Filter({
|
|
331
|
+
id,
|
|
332
|
+
fieldName,
|
|
333
|
+
label: '',
|
|
334
|
+
filterType: 'FILED_FILTER',
|
|
335
|
+
operator: 'EQUALS',
|
|
336
|
+
valueObject: value,
|
|
337
|
+
});
|
|
338
|
+
const filters = this.dialogReportRequest.filterRequest.filters;
|
|
339
|
+
const existingIndex = filters.findIndex((f) => f.id === id);
|
|
340
|
+
if (existingIndex !== -1) {
|
|
341
|
+
filters.splice(existingIndex, 1, filter);
|
|
342
|
+
}
|
|
343
|
+
else {
|
|
344
|
+
filters.push(filter);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
emitJuniorAction($event) {
|
|
348
|
+
const juniorAction = JUNIOR_DOWN_ACTION;
|
|
349
|
+
juniorAction.pageInfo = this.drillDownPageInfo;
|
|
350
|
+
this.doJuniorAction($event);
|
|
351
|
+
}
|
|
352
|
+
drillDown() {
|
|
353
|
+
const drilldownaction = DRILL_DOWN_ACTION;
|
|
354
|
+
drilldownaction.pageInfo = this.drillDownPageInfo;
|
|
355
|
+
this.doADrillDownAction(drilldownaction);
|
|
356
|
+
}
|
|
357
|
+
doJuniorAction($event) {
|
|
358
|
+
if (this.juniorColumns && this.juniorPageInfo) {
|
|
359
|
+
if (this.enrichJuniorReportRequest) {
|
|
360
|
+
if (this.activeLevel === 2) {
|
|
361
|
+
this.isEditable = false;
|
|
362
|
+
this.disableExportAction = this.juniorPageInfo.hideReportsExtractButton || false;
|
|
363
|
+
this.juniorReportRequest = this.backendService.buildReportRequest(this.juniorColumns, this.juniorPageInfo.labelsSection + '.' + this.juniorPageInfo.id, this.reportRequest.filterRequest, '', this.juniorPageInfo, 'LANDSCAPE');
|
|
364
|
+
this.enrichJuniorReportRequest($event, this.juniorReportRequest);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
this.activeLevel = this.activeLevel + 1;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
doADrillDownAction($event) {
|
|
371
|
+
if (this.drillDownColumns && this.drillDownPageInfo) {
|
|
372
|
+
if (this.enrichDrillDownReportRequest) {
|
|
373
|
+
if (this.activeLevel === 1) {
|
|
374
|
+
this.isEditable = false;
|
|
375
|
+
this.childReportRequest = this.backendService.buildReportRequest(this.drillDownColumns, this.drillDownPageInfo.labelsSection + '.' + this.drillDownPageInfo.id, this.reportRequest.filterRequest, '', this.drillDownPageInfo, 'LANDSCAPE');
|
|
376
|
+
this.disableExportAction = this.drillDownPageInfo.hideReportsExtractButton || false;
|
|
377
|
+
this.enrichDrillDownReportRequest($event, this.childReportRequest);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
this.activeLevel = this.activeLevel + 1;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
doHyperLinkAction($event) {
|
|
384
|
+
if (this.enrichHyperLinkReportRequest) {
|
|
385
|
+
this.juniorReportRequest = this.backendService.buildReportRequest(this.juniorColumns, this.juniorPageInfo.labelsSection + '.' + this.juniorPageInfo.id, this.dialogReportRequest.filterRequest, '', this.juniorPageInfo, 'LANDSCAPE');
|
|
386
|
+
this.disableExportAction = this.juniorPageInfo.hideReportsExtractButton || false;
|
|
387
|
+
this.enrichHyperLinkReportRequest($event, this.juniorReportRequest);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
extractReport(reportType) {
|
|
391
|
+
if (this.activeLevel === 1) {
|
|
392
|
+
this.reportRequest.reportType = reportType;
|
|
393
|
+
this.backendService.downloadReport(this.reportRequest, this.pageInfo.apiUri);
|
|
394
|
+
}
|
|
395
|
+
else if (this.activeLevel === 2) {
|
|
396
|
+
this.childReportRequest.reportType = reportType;
|
|
397
|
+
this.backendService.downloadReport(this.childReportRequest, this.drillDownPageInfo.apiUri);
|
|
398
|
+
}
|
|
399
|
+
else if (this.activeLevel === 3) {
|
|
400
|
+
this.juniorReportRequest.reportType = reportType;
|
|
401
|
+
this.backendService.downloadReport(this.juniorReportRequest, this.juniorPageInfo.apiUri);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
goUp() {
|
|
405
|
+
this.isEditable = true;
|
|
406
|
+
this.activeLevel = this.activeLevel - 1;
|
|
407
|
+
this.doAction(this.x);
|
|
408
|
+
this.reloadData = true;
|
|
409
|
+
if (this.activeLevel > 1) {
|
|
410
|
+
this.isEditable = false;
|
|
411
|
+
}
|
|
412
|
+
this.disableExportAction = false;
|
|
413
|
+
}
|
|
414
|
+
drillDownEnabled() {
|
|
415
|
+
return this.drillDownPageInfo && !this.hideDrillDownButton && !this.getIsEmptyList();
|
|
416
|
+
}
|
|
417
|
+
drillDownLabel() {
|
|
418
|
+
return `${this.pageInfo.labelsSection}.drillDownLabel`;
|
|
419
|
+
}
|
|
420
|
+
getIsEmptyList() {
|
|
421
|
+
return this.backendService.isEmptyItems || this.disableExportAction === true;
|
|
422
|
+
}
|
|
423
|
+
clear() {
|
|
424
|
+
const currentUrl = this.router.url;
|
|
425
|
+
this.router.navigateByUrl('/', { skipLocationChange: true }).then(() => {
|
|
426
|
+
this.router.navigate([currentUrl]);
|
|
427
|
+
});
|
|
428
|
+
// if (this.reportForm) {
|
|
429
|
+
// this.reportForm.reset();
|
|
430
|
+
//
|
|
431
|
+
// this.fields.forEach(field => {
|
|
432
|
+
// if (field.type === 'lookup' || field.type === 'multi-select') {
|
|
433
|
+
// const control = this.reportForm.get(field.property);
|
|
434
|
+
// if (control) {
|
|
435
|
+
// control.setValue([]);
|
|
436
|
+
// }
|
|
437
|
+
// }
|
|
438
|
+
// });
|
|
439
|
+
// }
|
|
440
|
+
}
|
|
441
|
+
isFormEmpty() {
|
|
442
|
+
if (!this.reportForm || !this.reportForm.value) {
|
|
443
|
+
return true;
|
|
444
|
+
}
|
|
445
|
+
return Object.values(this.reportForm.value).every(value => {
|
|
446
|
+
if (value === null || value === undefined || value === '') {
|
|
447
|
+
return true;
|
|
448
|
+
}
|
|
449
|
+
return Array.isArray(value) && value.length === 0;
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
shouldProcessEventItem(item) {
|
|
453
|
+
const groupByProp = this.pageInfo?.groupByProperty;
|
|
454
|
+
const groupByValues = this.pageInfo?.groupByValue;
|
|
455
|
+
if (!groupByProp || !groupByValues || !item[groupByProp]) {
|
|
456
|
+
return true;
|
|
457
|
+
}
|
|
458
|
+
const value = item[groupByProp].toString();
|
|
459
|
+
return !groupByValues.some(v => value.includes(v) && value.length >= v.length);
|
|
460
|
+
}
|
|
461
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ReportFormComponent, deps: [{ token: i1.TranslateService }, { token: i2.BackendService }, { token: i3.ActivatedRoute }, { token: i0.Injector }, { token: i3.Router }, { token: i3.ActivatedRoute }, { token: i4.Directionality }, { token: i5.MatDialog }, { token: i6.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
462
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ReportFormComponent, isStandalone: true, selector: "app-report-form", inputs: { showDetails: "showDetails", showExtractButton: "showExtractButton", columns: "columns", actionRequestCallback: "actionRequestCallback", enrichDrillDownReportRequest: "enrichDrillDownReportRequest", enrichHyperLinkReportRequest: "enrichHyperLinkReportRequest", enrichJuniorReportRequest: "enrichJuniorReportRequest" }, outputs: { userAction: "userAction" }, ngImport: i0, template: "<div class=\"column full-width\">\r\n\r\n <div class=\"row align-start-center\" style=\"margin-bottom: 10px;\">\r\n <app-title-bar [pageTitle]=\"getTitle()\" [newAction]=\"false\"></app-title-bar>\r\n\r\n <mat-icon\r\n *ngIf=\"pageInfo?.hasHint\"\r\n [matTooltip]=\"pageInfo.labelsSection + '.hint' | translate\"\r\n matTooltipPosition=\"right\"\r\n color=\"primary\"\r\n class=\"hint-icon\"\r\n matTooltipClass=\"custom-tooltip\">\r\n help_outline\r\n </mat-icon>\r\n </div>\r\n\r\n <app-base-form-canvas\r\n [pageInfo]=\"pageInfo\"\r\n [fields]=\"fields\"\r\n [editable]=\"isEditable\"\r\n [errors]=\"errors\"\r\n [item]=\"this.reportForm?.value || {}\"\r\n (formUpdated)=\"updateForm($event)\"\r\n ></app-base-form-canvas>\r\n\r\n <br><br>\r\n\r\n <div class=\"column\">\r\n <div class=\"row gap-10 responsive-row\">\r\n <button *ngIf=\"activeLevel === 1\" color=\"primary\" mat-flat-button (click)=\"doAction(x)\" [disabled]=\"!isValidForm()\" id=\"report-generate-btn\">\r\n {{ 'REPORTS.generate' | translate }}\r\n </button>\r\n\r\n <button mat-raised-button [matMenuTriggerFor]=\"menu\" [disabled]=\"getIsEmptyList()\" color=\"primary\" id=\"report-extract-trigger\">\r\n {{ 'extract' | translate }}\r\n <mat-icon class=\"expand_more actionButton__expand\">expand_more</mat-icon>\r\n </button>\r\n\r\n <button mat-flat-button (click)=\"clear()\" [disabled]=\"isFormEmpty() || activeLevel > 1\" id=\"report-clear-btn\">\r\n {{ 'REPORTS.clear' | translate }}\r\n </button>\r\n\r\n <button *ngIf=\"activeLevel === 1 && drillDownEnabled()\" color=\"warn\" mat-flat-button (click)=\"drillDown()\" id=\"report-drilldown-btn\">\r\n {{ drillDownLabel() | translate }}\r\n </button>\r\n\r\n <button *ngIf=\"activeLevel > 1 && backButtonEnabled\" color=\"warn\" mat-flat-button (click)=\"goUp()\" id=\"report-up-btn\">\r\n {{ 'REPORTS.up' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"activeLevel >= 1\" class=\"main-form-canvas row align-start-start responsive-table\" style=\"margin-top: 3vh;\">\r\n <div class=\"column full-width\">\r\n <app-base-table\r\n *ngIf=\"activeLevel === 1\"\r\n [pageInfo]=\"pageInfo\"\r\n [columns]=\"columnsDefinition\"\r\n [enforceRefresh]=\"reloadData\"\r\n id=\"parent\"\r\n [reportRequest]=\"reportRequest\"\r\n (userAction)=\"emitUserAction($event)\"\r\n (hyperLinkAction)=\"emitHyperLinkAction($event)\">\r\n </app-base-table>\r\n\r\n <app-base-table\r\n *ngIf=\"activeLevel === 2\"\r\n [pageInfo]=\"drillDownPageInfo\"\r\n [columns]=\"drillDownColumns\"\r\n id=\"child\"\r\n [reportRequest]=\"childReportRequest\"\r\n (userAction)=\"emitJuniorAction($event)\"\r\n (hyperLinkAction)=\"emitHyperLinkAction($event)\">\r\n </app-base-table>\r\n\r\n <app-base-table\r\n *ngIf=\"activeLevel === 3\"\r\n [pageInfo]=\"juniorPageInfo\"\r\n [columns]=\"juniorColumns\"\r\n id=\"junior\"\r\n [reportRequest]=\"juniorReportRequest\">\r\n </app-base-table>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n\r\n<mat-menu #menu=\"matMenu\">\r\n <button type=\"button\" mat-menu-item *ngFor=\"let type of types\" (click)=\"extractReport(type)\" [attr.id]=\"'report-extract-item-' + type\">\r\n {{ type }}\r\n </button>\r\n</mat-menu>\r\n", styles: [".column{display:flex;flex-direction:column;width:100%}.row{display:flex;flex-direction:row;width:100%}.align-start-center{align-items:center;justify-content:flex-start}.align-start-start{align-items:flex-start;justify-content:flex-start}.gap-10>*+*{margin-left:10px}.full-width{width:100%}.hint-icon{cursor:pointer;margin-left:10px}.responsive-row{flex-wrap:wrap}@media (max-width: 960px){.responsive-row{flex-direction:column;align-items:flex-start}}@media (max-width: 600px){.responsive-table{justify-content:center}}\n"], dependencies: [{ kind: "component", type: TitleBarComponent, selector: "app-title-bar", inputs: ["pageTitle", "showExtractButton", "totalElements", "titleMode", "subTitle", "statusDesc", "newAction", "extraButton", "showDetails", "showImport", "showButton", "extraData", "titleCorporateAdmin", "hideBackButton", "buttons"], outputs: ["newActionClicked", "extraButtonClicked", "extractReport", "buttonClicked"] }, { kind: "component", type: BaseFormCanvasComponent, selector: "app-base-form-canvas", inputs: ["pageInfo", "currency", "fields", "errors", "workflowEditableFields", "isWorkflowEditableManaged", "supportingAttributes", "editable", "emitOnValueChanges", "item", "equationSuggestedFields", "currentEquationValue"], outputs: ["attachmentEmitter", "actionEmitter", "formUpdated", "hyperTextEvent", "currentEquationValueChange"] }, { kind: "component", type: MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: BaseTableComponent, selector: "app-base-table", inputs: ["filterFields", "noDataFoundIcon", "noDataFoundTitle", "noDataFoundSubtitle", "pageInfo", "enablePagination", "data", "listAction", "columns", "filters", "pathParam", "extraButton", "enforceRefresh", "isPending", "trigger", "reportRequest", "separateEndpointData", "manageablePages", "totalPagesCount", "currentPageIndex", "customizedData"], outputs: ["pageChange", "userAction", "hyperLinkAction", "extraAction", "selectedColumn", "listActionClicked", "showDialog", "clickRoutePage"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] }); }
|
|
463
|
+
}
|
|
464
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ReportFormComponent, decorators: [{
|
|
465
|
+
type: Component,
|
|
466
|
+
args: [{ selector: 'app-report-form', standalone: true, imports: [
|
|
467
|
+
TitleBarComponent,
|
|
468
|
+
BaseFormCanvasComponent,
|
|
469
|
+
MatMenu,
|
|
470
|
+
MatMenuItem,
|
|
471
|
+
NgForOf,
|
|
472
|
+
MatMenuTrigger,
|
|
473
|
+
MatButtonModule,
|
|
474
|
+
TranslateModule,
|
|
475
|
+
BaseTableComponent,
|
|
476
|
+
NgIf,
|
|
477
|
+
MatIconModule,
|
|
478
|
+
MatButton,
|
|
479
|
+
MatTooltip
|
|
480
|
+
], template: "<div class=\"column full-width\">\r\n\r\n <div class=\"row align-start-center\" style=\"margin-bottom: 10px;\">\r\n <app-title-bar [pageTitle]=\"getTitle()\" [newAction]=\"false\"></app-title-bar>\r\n\r\n <mat-icon\r\n *ngIf=\"pageInfo?.hasHint\"\r\n [matTooltip]=\"pageInfo.labelsSection + '.hint' | translate\"\r\n matTooltipPosition=\"right\"\r\n color=\"primary\"\r\n class=\"hint-icon\"\r\n matTooltipClass=\"custom-tooltip\">\r\n help_outline\r\n </mat-icon>\r\n </div>\r\n\r\n <app-base-form-canvas\r\n [pageInfo]=\"pageInfo\"\r\n [fields]=\"fields\"\r\n [editable]=\"isEditable\"\r\n [errors]=\"errors\"\r\n [item]=\"this.reportForm?.value || {}\"\r\n (formUpdated)=\"updateForm($event)\"\r\n ></app-base-form-canvas>\r\n\r\n <br><br>\r\n\r\n <div class=\"column\">\r\n <div class=\"row gap-10 responsive-row\">\r\n <button *ngIf=\"activeLevel === 1\" color=\"primary\" mat-flat-button (click)=\"doAction(x)\" [disabled]=\"!isValidForm()\" id=\"report-generate-btn\">\r\n {{ 'REPORTS.generate' | translate }}\r\n </button>\r\n\r\n <button mat-raised-button [matMenuTriggerFor]=\"menu\" [disabled]=\"getIsEmptyList()\" color=\"primary\" id=\"report-extract-trigger\">\r\n {{ 'extract' | translate }}\r\n <mat-icon class=\"expand_more actionButton__expand\">expand_more</mat-icon>\r\n </button>\r\n\r\n <button mat-flat-button (click)=\"clear()\" [disabled]=\"isFormEmpty() || activeLevel > 1\" id=\"report-clear-btn\">\r\n {{ 'REPORTS.clear' | translate }}\r\n </button>\r\n\r\n <button *ngIf=\"activeLevel === 1 && drillDownEnabled()\" color=\"warn\" mat-flat-button (click)=\"drillDown()\" id=\"report-drilldown-btn\">\r\n {{ drillDownLabel() | translate }}\r\n </button>\r\n\r\n <button *ngIf=\"activeLevel > 1 && backButtonEnabled\" color=\"warn\" mat-flat-button (click)=\"goUp()\" id=\"report-up-btn\">\r\n {{ 'REPORTS.up' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"activeLevel >= 1\" class=\"main-form-canvas row align-start-start responsive-table\" style=\"margin-top: 3vh;\">\r\n <div class=\"column full-width\">\r\n <app-base-table\r\n *ngIf=\"activeLevel === 1\"\r\n [pageInfo]=\"pageInfo\"\r\n [columns]=\"columnsDefinition\"\r\n [enforceRefresh]=\"reloadData\"\r\n id=\"parent\"\r\n [reportRequest]=\"reportRequest\"\r\n (userAction)=\"emitUserAction($event)\"\r\n (hyperLinkAction)=\"emitHyperLinkAction($event)\">\r\n </app-base-table>\r\n\r\n <app-base-table\r\n *ngIf=\"activeLevel === 2\"\r\n [pageInfo]=\"drillDownPageInfo\"\r\n [columns]=\"drillDownColumns\"\r\n id=\"child\"\r\n [reportRequest]=\"childReportRequest\"\r\n (userAction)=\"emitJuniorAction($event)\"\r\n (hyperLinkAction)=\"emitHyperLinkAction($event)\">\r\n </app-base-table>\r\n\r\n <app-base-table\r\n *ngIf=\"activeLevel === 3\"\r\n [pageInfo]=\"juniorPageInfo\"\r\n [columns]=\"juniorColumns\"\r\n id=\"junior\"\r\n [reportRequest]=\"juniorReportRequest\">\r\n </app-base-table>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n\r\n<mat-menu #menu=\"matMenu\">\r\n <button type=\"button\" mat-menu-item *ngFor=\"let type of types\" (click)=\"extractReport(type)\" [attr.id]=\"'report-extract-item-' + type\">\r\n {{ type }}\r\n </button>\r\n</mat-menu>\r\n", styles: [".column{display:flex;flex-direction:column;width:100%}.row{display:flex;flex-direction:row;width:100%}.align-start-center{align-items:center;justify-content:flex-start}.align-start-start{align-items:flex-start;justify-content:flex-start}.gap-10>*+*{margin-left:10px}.full-width{width:100%}.hint-icon{cursor:pointer;margin-left:10px}.responsive-row{flex-wrap:wrap}@media (max-width: 960px){.responsive-row{flex-direction:column;align-items:flex-start}}@media (max-width: 600px){.responsive-table{justify-content:center}}\n"] }]
|
|
481
|
+
}], ctorParameters: () => [{ type: i1.TranslateService }, { type: i2.BackendService }, { type: i3.ActivatedRoute }, { type: i0.Injector }, { type: i3.Router }, { type: i3.ActivatedRoute }, { type: i4.Directionality }, { type: i5.MatDialog }, { type: i6.FormBuilder }], propDecorators: { showDetails: [{
|
|
482
|
+
type: Input
|
|
483
|
+
}], showExtractButton: [{
|
|
484
|
+
type: Input
|
|
485
|
+
}], columns: [{
|
|
486
|
+
type: Input
|
|
487
|
+
}], actionRequestCallback: [{
|
|
488
|
+
type: Input
|
|
489
|
+
}], enrichDrillDownReportRequest: [{
|
|
490
|
+
type: Input
|
|
491
|
+
}], enrichHyperLinkReportRequest: [{
|
|
492
|
+
type: Input
|
|
493
|
+
}], enrichJuniorReportRequest: [{
|
|
494
|
+
type: Input
|
|
495
|
+
}], userAction: [{
|
|
496
|
+
type: Output
|
|
497
|
+
}] } });
|
|
498
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW52b2ljZXEvdWktbGliL3NyYy9saWIvY29tcG9uZW50cy9yZXBvcnQtZm9ybS9yZXBvcnQtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL3JlcG9ydC1mb3JtL3JlcG9ydC1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBMEIsU0FBUyxFQUFFLFlBQVksRUFBWSxLQUFLLEVBQVUsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRWhILE9BQU8sRUFBQyxlQUFlLEVBQVcsTUFBTSw0QkFBNEIsQ0FBQztBQUdyRSxPQUFPLEVBQUMsZUFBZSxFQUFtQixNQUFNLHFCQUFxQixDQUFDO0FBSXRFLE9BQU8sRUFBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzFELE9BQU8sRUFBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQzVFLE9BQU8sRUFBQyxTQUFTLEVBQUUsZUFBZSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDcEUsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDdEUsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUM5RCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sdUNBQXVDLENBQUM7QUFDcEUsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGtDQUFr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QkFBbUI7a0JBckIvQixTQUFTOytCQUNJLGlCQUFpQixjQUNmLElBQUksV0FDVDt3QkFDUCxpQkFBaUI7d0JBQ2pCLHVCQUF1Qjt3QkFDdkIsT0FBTzt3QkFDUCxXQUFXO3dCQUNYLE9BQU87d0JBQ1AsY0FBYzt3QkFDZCxlQUFlO3dCQUNmLGVBQWU7d0JBQ2Ysa0JBQWtCO3dCQUNsQixJQUFJO3dCQUNKLGFBQWE7d0JBQ2IsU0FBUzt3QkFDVCxVQUFVO3FCQUNYO3VTQU1DLFdBQVc7c0JBRFYsS0FBSztnQkFJTixpQkFBaUI7c0JBRGhCLEtBQUs7Z0JBSU4sT0FBTztzQkFETixLQUFLO2dCQUdHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFDRyw0QkFBNEI7c0JBQXBDLEtBQUs7Z0JBQ0csNEJBQTRCO3NCQUFwQyxLQUFLO2dCQUNHLHlCQUF5QjtzQkFBakMsS0FBSztnQkFHTixVQUFVO3NCQURULE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5qZWN0b3IsIElucHV0LCBPbkluaXQsIE91dHB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7RmllbGRJbmZvfSBmcm9tIFwiLi4vLi4vYmFzZS1tb2RlbC9maWVsZC1pbmZvXCI7XHJcbmltcG9ydCB7RU1QVFlfUEFHRV9JTkZPLCBQYWdlSW5mb30gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWwvcGFnZS1pbmZvXCI7XHJcbmltcG9ydCB7VGFibGVDb2x1bW59IGZyb20gXCIuLi8uLi9iYXNlLW1vZGVsL3RhYmxlLWNvbHVtbi5pbnRlcmZhY2VcIjtcclxuaW1wb3J0IHtGaWVsZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9iYXNlLW1vZGVsL2FwaS1yZXNwb25zZVwiO1xyXG5pbXBvcnQge1RyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZX0gZnJvbSBcIkBuZ3gtdHJhbnNsYXRlL2NvcmVcIjtcclxuaW1wb3J0IHtCYWNrZW5kU2VydmljZX0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL2JhY2tlbmQtc2VydmljZVwiO1xyXG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlLCBSb3V0ZXJ9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcclxuaW1wb3J0IHtGb3JtQnVpbGRlciwgRm9ybUdyb3VwfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHtmb3JtYXREYXRlLCBOZ0Zvck9mLCBOZ0lmfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcbmltcG9ydCB7TWF0TWVudSwgTWF0TWVudUl0ZW0sIE1hdE1lbnVUcmlnZ2VyfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudVwiO1xyXG5pbXBvcnQge01hdEJ1dHRvbiwgTWF0QnV0dG9uTW9kdWxlfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uXCI7XHJcbmltcG9ydCB7QmFzZVRhYmxlQ29tcG9uZW50fSBmcm9tIFwiLi4vYmFzZS10YWJsZS9iYXNlLXRhYmxlLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge01hdEljb25Nb2R1bGV9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9pY29uXCI7XHJcbmltcG9ydCB7RmlsdGVyUmVxdWVzdH0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWwvZmlsdGVyLXJlcXVlc3RcIjtcclxuaW1wb3J0IHtSZXBvcnRSZXF1ZXN0fSBmcm9tIFwiLi4vLi4vYmFzZS1tb2RlbC9yZXBvcnQtcmVxdWVzdC5tb2RlbFwiO1xyXG5pbXBvcnQge0ZpbHRlcn0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWwvZmlsdGVyLm1vZGVsXCI7XHJcbmltcG9ydCB7VGl0bGVCYXJDb21wb25lbnR9IGZyb20gXCIuLi90aXRsZS1iYXIvdGl0bGUtYmFyLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge0Jhc2VGb3JtQ2FudmFzQ29tcG9uZW50fSBmcm9tIFwiLi4vYmFzZS1mb3JtLWNhbnZhcy9iYXNlLWZvcm0tY2FudmFzLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgQ2xhc3NpY0VkaXRvciBmcm9tIFwiQGNrZWRpdG9yL2NrZWRpdG9yNS1idWlsZC1jbGFzc2ljXCI7XHJcbmltcG9ydCB7RFJJTExfRE9XTl9BQ1RJT04sIEpVTklPUl9ET1dOX0FDVElPTiwgU25hY2tNZXNzYWdlLCBUYWJsZVBhZ2VVc2VyQWN0aW9ufSBmcm9tIFwiLi4vLi4vYmFzZS1tb2RlbFwiO1xyXG5pbXBvcnQge30gZnJvbSBcIi4uL2F1ZGl0LWxvZy1kZXRhaWxzLWRpYWxvZy9hdWRpdC1sb2ctZGV0YWlscy1kaWFsb2cuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7TWF0RGlhbG9nfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nXCI7XHJcbmltcG9ydCB7UmVwb3J0RGV0YWlsc0RpYWxvZ0NvbXBvbmVudH0gZnJvbSBcIi4uL3JlcG9ydC1kZXRhaWxzLWRpYWxvZy9yZXBvcnQtZGV0YWlscy1kaWFsb2cuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IGNsb25lRGVlcCB9IGZyb20gJ2xvZGFzaCc7XHJcbmltcG9ydCB7TWF0VG9vbHRpcH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXBcIjtcclxuaW1wb3J0IHtEaXJlY3Rpb25hbGl0eX0gZnJvbSBcIkBhbmd1bGFyL2Nkay9iaWRpXCI7XHJcblxyXG5cclxuY29uc3QgTk9OX1JFUE9SVF9DT0xVTU5TID0gWydsaXN0QWN0aW9uJywgJ2J1dHRvbicsICdjaGVja2JveCddO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2FwcC1yZXBvcnQtZm9ybScsXHJcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIFRpdGxlQmFyQ29tcG9uZW50LFxyXG4gICAgQmFzZUZvcm1DYW52YXNDb21wb25lbnQsXHJcbiAgICBNYXRNZW51LFxyXG4gICAgTWF0TWVudUl0ZW0sXHJcbiAgICBOZ0Zvck9mLFxyXG4gICAgTWF0TWVudVRyaWdnZXIsXHJcbiAgICBNYXRCdXR0b25Nb2R1bGUsXHJcbiAgICBUcmFuc2xhdGVNb2R1bGUsXHJcbiAgICBCYXNlVGFibGVDb21wb25lbnQsXHJcbiAgICBOZ0lmLFxyXG4gICAgTWF0SWNvbk1vZHVsZSxcclxuICAgIE1hdEJ1dHRvbixcclxuICAgIE1hdFRvb2x0aXBcclxuICBdLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL3JlcG9ydC1mb3JtLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsOiAnLi9yZXBvcnQtZm9ybS5jb21wb25lbnQuc2NzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIFJlcG9ydEZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gICAgQElucHV0KClcclxuICAgIHNob3dEZXRhaWxzIDogYW55ID0gW107XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHNob3dFeHRyYWN0QnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgY29sdW1uczogVGFibGVDb2x1bW48YW55PltdID1bXTtcclxuXHJcbiAgICBASW5wdXQoKSBhY3Rpb25SZXF1ZXN0Q2FsbGJhY2shOiAoYWN0aW9uUmVxdWVzdDogVGFibGVQYWdlVXNlckFjdGlvbikgPT4gVGFibGVQYWdlVXNlckFjdGlvbjtcclxuICAgIEBJbnB1dCgpIGVucmljaERyaWxsRG93blJlcG9ydFJlcXVlc3QhOiAoYWN0aW9uUmVxdWVzdDogVGFibGVQYWdlVXNlckFjdGlvbiwgcmVwb3J0UmVxdWVzdDogUmVwb3J0UmVxdWVzdCkgPT4gVGFibGVQYWdlVXNlckFjdGlvbjtcclxuICAgIEBJbnB1dCgpIGVucmljaEh5cGVyTGlua1JlcG9ydFJlcXVlc3QhOiAoYWN0aW9uUmVxdWVzdDogVGFibGVQYWdlVXNlckFjdGlvbiwgcmVwb3J0UmVxdWVzdDogUmVwb3J0UmVxdWVzdCkgPT4gVGFibGVQYWdlVXNlckFjdGlvbjtcclxuICAgIEBJbnB1dCgpIGVucmljaEp1bmlvclJlcG9ydFJlcXVlc3QhOiAoYWN0aW9uUmVxdWVzdDogVGFibGVQYWdlVXNlckFjdGlvbiwgcmVwb3J0UmVxdWVzdDogUmVwb3J0UmVxdWVzdCkgPT4gVGFibGVQYWdlVXNlckFjdGlvbjtcclxuXHJcbiAgICBAT3V0cHV0KClcclxuICAgIHVzZXJBY3Rpb246IEV2ZW50RW1pdHRlcjxUYWJsZVBhZ2VVc2VyQWN0aW9uPiA9IG5ldyBFdmVudEVtaXR0ZXI8VGFibGVQYWdlVXNlckFjdGlvbj4oKTtcclxuICAgIGFjdGl2ZUxldmVsOiBudW1iZXIgPSAxO1xyXG5cclxuICAgIHByaXZhdGUgZmlsdGVyUmVxdWVzdDogRmlsdGVyUmVxdWVzdDtcclxuICAgIHg6IGFueTtcclxuICAgIGlzRWRpdGFibGU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgZmllbGRzOiBGaWVsZEluZm9bXSA9IFtdO1xyXG4gICAgcGFnZUluZm86IFBhZ2VJbmZvID0gRU1QVFlfUEFHRV9JTkZPO1xyXG4gICAgZHJpbGxEb3duUGFnZUluZm86IFBhZ2VJbmZvID0gRU1QVFlfUEFHRV9JTkZPO1xyXG4gICAgZHJpbGxEb3duQ29sdW1uczogVGFibGVDb2x1bW48YW55PltdID0gW107XHJcbiAgICBoaWRlRHJpbGxEb3duQnV0dG9uOiBmYWxzZTtcclxuXHJcbiAgICBqdW5pb3JQYWdlSW5mbzogUGFnZUluZm8gPSBFTVBUWV9QQUdFX0lORk87XHJcbiAgICBqdW5pb3JDb2x1bW5zOiBUYWJsZUNvbHVtbjxhbnk+W10gPSBbXTtcclxuXHJcbiAgICBjb2x1bW5zRGVmaW5pdGlvbjogVGFibGVDb2x1bW48YW55PltdID0gW107XHJcbiAgICB0eXBlczogc3RyaW5nW10gPSBbXCJwZGZcIiwgXCJjc3ZcIiwgXCJ4bHN4XCJdXHJcbiAgICBzZWFyY2hTdHI6IHN0cmluZyA9ICcnO1xyXG5cclxuICAgIGVycm9yczogRmllbGRNZXNzYWdlW10gPSBbXTtcclxuXHJcbiAgICByZWxvYWREYXRhOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBiYWNrQnV0dG9uRW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG5cclxuICAgIHJlcG9ydFJlcXVlc3Q6IFJlcG9ydFJlcXVlc3QgPSBuZXcgUmVwb3J0UmVxdWVzdCh7fSk7XHJcbiAgICBjaGlsZFJlcG9ydFJlcXVlc3Q6IFJlcG9ydFJlcXVlc3QgPSBuZXcgUmVwb3J0UmVxdWVzdCh7fSk7XHJcbiAgICBqdW5pb3JSZXBvcnRSZXF1ZXN0OiBSZXBvcnRSZXF1ZXN0ID0gbmV3IFJlcG9ydFJlcXVlc3Qoe30pO1xyXG4gICAgcHVibGljIHJlcG9ydEZvcm06IEZvcm1Hcm91cDtcclxuICAgIHJlYWR5VG9TZWFyY2ggPSBmYWxzZTtcclxuICAgIHByaXZhdGUgcGFnZVNpemU6IGFueTtcclxuICAgIHByaXZhdGUgZGlhbG9nUmVwb3J0UmVxdWVzdDogYW55O1xyXG4gICAgY3VycmVudERpcmVjdGlvbjogJ2x0cicgfCAncnRsJztcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgICAgcHVibGljIGJhY2tlbmRTZXJ2aWNlOiBCYWNrZW5kU2VydmljZSxcclxuICAgICAgICAgICAgICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICAgICAgICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICAgICAgICAgICAgICBwcml2YXRlIGRpcmVjdGlvbmFsaXR5OiBEaXJlY3Rpb25hbGl0eSxcclxuICAgICAgICAgICAgICAgIHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZyxcclxuICAgICAgICAgICAgICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyKSB7XHJcbiAgICAgICBDbGFzc2ljRWRpdG9yLmRlZmF1bHRDb25maWcgPSB7XHJcbiAgICAgICAgICAgIHRvb2xiYXI6IHtcclxuICAgICAgICAgICAgICAgIGl0ZW1zOiBbJ2hlYWRpbmcnLCAnfCcsICdib2xkJywgJ2l0YWxpYycsICd8JywgJ2J1bGxldGVkTGlzdCcsICdudW1iZXJlZExpc3QnXVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBpbWFnZToge1xyXG4gICAgICAgICAgICAgICAgdG9vbGJhcjogWydpbWFnZVN0eWxlOnNpZGUnLCAnfCcsICdpbWFnZVRleHRBbHRlcm5hdGl2ZSddXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRhYmxlOiB7XHJcbiAgICAgICAgICAgICAgICBjb250ZW50VG9vbGJhcjogWyAndGFibGVDb2x1bW4nLCAndGFibGVSb3cnLCAnbWVyZ2VUYWJsZUNlbGxzJyBdXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGxhbmd1YWdlOiAnZW4nXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBkaXNhYmxlRXhwb3J0QWN0aW9uIDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICB0aGlzLmN1cnJlbnREaXJlY3Rpb24gPSB0aGlzLmRpcmVjdGlvbmFsaXR5LnZhbHVlO1xyXG4gICAgICB0aGlzLmRpcmVjdGlvbmFsaXR5LmNoYW5nZS5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50RGlyZWN0aW9uID0gdmFsdWU7XHJcbiAgICAgIH0pXHJcblxyXG4gICAgICB0aGlzLmFjdGl2YXRlZFJvdXRlLmRhdGEuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgIHRoaXMucGFnZUluZm8gPSBkYXRhWydwYWdlSW5mbyddO1xyXG4gICAgICAgIHRoaXMucGFnZVNpemUgPSB0aGlzLnBhZ2VJbmZvLnBhZ2VTaXplID8/IDEwO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyUmVxdWVzdCA9IG5ldyBGaWx0ZXJSZXF1ZXN0KHRoaXMucGFnZVNpemUpO1xyXG4gICAgICAgIGRhdGFbJ3BhZ2VJbmZvJ10ubGF6eUxvYWREYXRhID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmRyaWxsRG93blBhZ2VJbmZvID0gZGF0YVsnZHJpbGxEb3duUGFnZUluZm8nXTtcclxuICAgICAgICB0aGlzLmRyaWxsRG93bkNvbHVtbnMgPSBkYXRhWydkcmlsbERvd25Db2x1bW5zJ10/LmZpbHRlcihjID0+IGMucHJvcGVydHkgIT09ICdzZWxlY3RJdGVtJyk7XHJcbiAgICAgICAgdGhpcy5oaWRlRHJpbGxEb3duQnV0dG9uID0gZGF0YVsnaGlkZURyaWxsRG93bkJ1dHRvbiddID8/IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuanVuaW9yUGFnZUluZm8gPSBkYXRhWydqdW5pb3JQYWdlSW5mbyddO1xyXG4gICAgICAgIHRoaXMuanVuaW9yQ29sdW1ucyA9IGRhdGFbJ2p1bmlvckNvbHVtbnMnXTtcclxuICAgICAgICB0aGlzLmNvbHVtbnNEZWZpbml0aW9uID0gZGF0YVsnY29sdW1uc0RlZmluaXRpb24nXS5maWx0ZXIoYyA9PiAodGhpcy5kcmlsbERvd25QYWdlSW5mbyAmJiB0aGlzLmRyaWxsRG93bkNvbHVtbnMgfHwgKCFOT05fUkVQT1JUX0NPTFVNTlMuaW5jbHVkZXMoYy50eXBlKSkpKTtcclxuICAgICAgICB0aGlzLmZpZWxkcyA9IGRhdGFbJ2ZpZWxkcyddO1xyXG4gICAgICAgIGlmIChkYXRhWydlbnJpY2hEcmlsbERvd25SZXBvcnRSZXF1ZXN0J10pIHtcclxuICAgICAgICAgIHRoaXMuZW5yaWNoRHJpbGxEb3duUmVwb3J0UmVxdWVzdCA9IGRhdGFbJ2VucmljaERyaWxsRG93blJlcG9ydFJlcXVlc3QnXSh0aGlzLmluamVjdG9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRhdGFbJ2VucmljaEp1bmlvclJlcG9ydFJlcXVlc3QnXSkge1xyXG4gICAgICAgICAgdGhpcy5lbnJpY2hKdW5pb3JSZXBvcnRSZXF1ZXN0ID0gZGF0YVsnZW5yaWNoSnVuaW9yUmVwb3J0UmVxdWVzdCddKHRoaXMuaW5qZWN0b3IpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGRhdGFbJ2VucmljaEh5cGVyTGlua1JlcG9ydFJlcXVlc3QnXSkge1xyXG4gICAgICAgICAgdGhpcy5lbnJpY2hIeXBlckxpbmtSZXBvcnRSZXF1ZXN0ID0gZGF0YVsnZW5yaWNoSHlwZXJMaW5rUmVwb3J0UmVxdWVzdCddKHRoaXMuaW5qZWN0b3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMucm91dGUucXVlcnlQYXJhbU1hcC5zdWJzY3JpYmUocGFyYW1zID0+IHtcclxuICAgICAgICBjb25zdCBpc0NvbXBhcmlzb25SZXBvcnQgPSBwYXJhbXMuZ2V0KCdjb21wYXJpc29uUmVwb3J0JykgPT09ICd0cnVlJztcclxuXHJcbiAgICAgICAgaWYgKGlzQ29tcGFyaXNvblJlcG9ydCkge1xyXG4gICAgICAgICAgY29uc3QgY29tcGFyaXNvblN0ciA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2NvbXBhcmlzb25SZXBvcnRQYWdlSW5mbycpO1xyXG5cclxuICAgICAgICAgIGlmIChjb21wYXJpc29uU3RyKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbXBhcmlzb25EYXRhID0gSlNPTi5wYXJzZShjb21wYXJpc29uU3RyKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucGFnZUluZm8ubGF6eUxvYWREYXRhID0gY29tcGFyaXNvbkRhdGEubGF6eUxvYWREYXRhID8/IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUxldmVsID0gY29tcGFyaXNvbkRhdGEuYWN0aXZlTGV2ZWwgPz8gMjtcclxuICAgICAgICAgICAgdGhpcy5pc0VkaXRhYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuYmFja0J1dHRvbkVuYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5kcmlsbERvd25QYWdlSW5mbyA9IGNvbXBhcmlzb25EYXRhLmRyaWxsRG93blBhZ2VJbmZvO1xyXG4gICAgICAgICAgICB0aGlzLmRyaWxsRG93bkNvbHVtbnMgPSBjb21wYXJpc29uRGF0YS5kcmlsbERvd25Db2x1bW5zO1xyXG4gICAgICAgICAgICB0aGlzLnJlcG9ydEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICAgICAgICBkaXJlY3RvcmF0ZTogW1tdXSxcclxuICAgICAgICAgICAgICBmcm9tRGF0ZTogWycnXSxcclxuICAgICAgICAgICAgICB0b0RhdGU6IFsnJ10sXHJcbiAgICAgICAgICAgICAgc2VjdG9yOiBbJyddLFxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVwb3J0Rm9ybS5wYXRjaFZhbHVlKGNvbXBhcmlzb25EYXRhLmZvcm0pXHJcbiAgICAgICAgICAgIHRoaXMuZmllbGRzID0gdGhpcy5maWVsZHMuZmlsdGVyKGMgPT4gYy50eXBlICE9PSAnY2hlY2tib3gnKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJlcG9ydFJlcXVlc3QgPSBjb21wYXJpc29uRGF0YS5yZXBvcnRSZXF1ZXN0O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jaGlsZFJlcG9ydFJlcXVlc3QgPSB0aGlzLmJhY2tlbmRTZXJ2aWNlLmJ1aWxkUmVwb3J0UmVxdWVzdChcclxuICAgICAgICAgICAgICB0aGlzLmRyaWxsRG93bkNvbHVtbnMsXHJcbiAgICAgICAgICAgICAgYCR7dGhpcy5kcmlsbERvd25QYWdlSW5mby5sYWJlbHNTZWN0aW9ufS4ke3RoaXMuZHJpbGxEb3duUGFnZUluZm8uaWR9YCxcclxuICAgICAgICAgICAgICByZXBvcnRSZXF1ZXN0LFxyXG4gICAgICAgICAgICAgICcnLFxyXG4gICAgICAgICAgICAgIHRoaXMuZHJpbGxEb3duUGFnZUluZm8sXHJcbiAgICAgICAgICAgICAgJ0xBTkRTQ0FQRSdcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgIC8vIG5nT25DaGFuZ2VzKHtpdGVtLCBlcnJvcnMsIGZpZWxkc306IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIC8vICAgICAvLyBlcnJvcnM/LmN1cnJlbnRWYWx1ZT8uZm9yRWFjaCgobXNnOiBGaWVsZE1lc3NhZ2UpID0+IHtcclxuICAgIC8vICAgICAvLyAgICAgdGhpcy5iYWNrZW5kU2VydmljZS5wYXJlbnRGb3JtLmdldChtc2cuZmllbGROYW1lKT8uc2V0RXJyb3JzKHtzZXJ2ZXJFcnJvcjogbXNnLm1lc3NhZ2V9KTtcclxuICAgIC8vICAgICAvLyB9KTtcclxuICAgIC8vICAgICAvLyBpZiAoZmllbGRzPy5jdXJyZW50VmFsdWUgJiYgIWZpZWxkcy5pc0ZpcnN0Q2hhbmdlKCkpe1xyXG4gICAgLy8gICAgIC8vICAgICB0aGlzLmJ1aWxkRm9ybSgpO1xyXG4gICAgLy8gICAgIC8vIH1cclxuICAgIC8vICAgICAvLyB0aGlzLmJ1aWxkRm9ybSgpO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIGlzTWF0Y2hIZWlnaHQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGFnZUluZm8ucGFnZUhlaWdodCA9PT0gJ21hdGNoJztcclxuICAgIH1cclxuXHJcblxyXG4gICAgZG9BY3Rpb24odHlwZTogc3RyaW5nKSB7XHJcbiAgICAgIGlmICh0aGlzLmJhY2tlbmRTZXJ2aWNlLnBhcmVudEZvcm0udmFsaWQpIHtcclxuICAgICAgICB0aGlzLnJlbG9hZERhdGEgPSAhdGhpcy5yZWxvYWREYXRhO1xyXG4gICAgICAgIGNvbnN0IGZpbHRlclJlcXVlc3Q6IEZpbHRlclJlcXVlc3QgPSBuZXcgRmlsdGVyUmVxdWVzdCh0aGlzLnBhZ2VTaXplKTtcclxuICAgICAgICBmaWx0ZXJSZXF1ZXN0LmZpbHRlcnMgPSBbXTtcclxuICAgICAgICBsZXQgcGFyYW1zU3RyaW5nOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICAgIHRoaXMuZmllbGRzLmZpbHRlcih4ID0+IHgudHlwZSAhPT0gJ3NwYWNlcicpLmZvckVhY2goZiA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5nZXRQYXJhbVZhbHVlKGYpICE9IG51bGwgJiYgdGhpcy5nZXRQYXJhbVZhbHVlKGYpLnRvU3RyaW5nKCkudHJpbSgpICE9PSAnJylcclxuICAgICAgICAgIHtcclxuICAgICAgICAgIGlmIChmLnR5cGUgPT09ICdtdWx0aS1zZWxlY3QnIHx8IGYudHlwZSA9PT0gJ2xvb2t1cCcpIHtcclxuICAgICAgICAgICAgLy8gZG8gbm90IGZpbHRlciBpZiB0aGlzIGZpZWxkIGFzIGNhc2NhZGluZyBmb3IgYW5vdGhlciBvbmUgYW5kIHRoZSBvdGhlciBvbmUgZ290IHNlbGVjdGVkIHZhbHVlc1xyXG4gICAgICAgICAgICBjb25zdCBjaGlsZEZpZWxkSWR4ID0gdGhpcy5maWVsZHMuZmluZEluZGV4KGZpZWxkID0+IGZpZWxkLmNhc2NhZGVkQnkgPT09IGYucHJvcGVydHkpO1xyXG4gICAgICAgICAgICBpZiAoY2hpbGRGaWVsZElkeCA+IC0xICYmIHRoaXMuYmFja2VuZFNlcnZpY2UucGFyZW50Rm9ybS5nZXQodGhpcy5maWVsZHNbY2hpbGRGaWVsZElkeF0ucHJvcGVydHkpPy52YWx1ZT8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBpZHo6IG51bWJlcltdID0gW107XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5iYWNrZW5kU2VydmljZS5wYXJlbnRGb3JtLmdldChmLnByb3BlcnR5KT8udmFsdWUgJiYgQXJyYXkuaXNBcnJheSh0aGlzLmJhY2tlbmRTZXJ2aWNlLnBhcmVudEZvcm0uZ2V0KGYucHJvcGVydHkpPy52YWx1ZSlcclxuICAgICAgICAgICAgICAmJiB0aGlzLmJhY2tlbmRTZXJ2aWNlLnBhcmVudEZvcm0uZ2V0KGYucHJvcGVydHkpPy52YWx1ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5iYWNrZW5kU2VydmljZS5wYXJlbnRGb3JtLmdldChmLnByb3BlcnR5KT8udmFsdWUuZm9yRWFjaCgoYToge1xyXG4gICAgICAgICAgICAgICAgY2hhbm5lbElkOiBudW1iZXI7XHJcbiAgICAgICAgICAgICAgICBlbmdsaXNoTmFtZTogc3RyaW5nO1xyXG4gICAgICAgICAgICAgICAgaWQ6IG51bWJlcjtcclxuICAgICAgICAgICAgICB9KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZi5mbGF0dGVuQnlTdWJBdHRyaWJ1dGUpIHtcclxuICAgICAgICAgICAgICAgICAgaWR6LnB1c2goYVtmLmZsYXR0ZW5CeVN1YkF0dHJpYnV0ZV0pO1xyXG4gICAgICAgICAgICAgICAgICBwYXJhbS5wdXNoKGFbZi5mbGF0dGVuQnlTdWJBdHRyaWJ1dGVdKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5maWVsZHMuZmluZChzID0+IHMucHJvcGVydHkgPT09ICd0ZXJtaW5hbElkJykpIHtcclxuICAgICAgICAgICAgICAgICAgaWR6LnB1c2goYS5jaGFubmVsSWQpO1xyXG4gICAgICAgICAgICAgICAgICBwYXJhbS5wdXNoKGEuZW5nbGlzaE5hbWUpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgaWR6LnB1c2goYS5pZCk7XHJcbiAgICAgICAgICAgICAgICAgIHBhcmFtLnB1c2goYS5lbmdsaXNoTmFtZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICBmaWx0ZXJSZXF1ZXN0LmZpbHRlcnM/LnB1c2gobmV3IEZpbHRlcih7XHJcbiAgICAgICAgICAgICAgICBpZDogZi5wcm9wZXJ0eSwgZmllbGROYW1lOiBmLnByb3BlcnR5LCBsYWJlbDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoZi5sYWJlbCksXHJcbiAgICAgICAgICAgICAgICBmaWx0ZXJUeXBlOiAnRklMRURfRklMVEVSJywgb3BlcmF0b3I6IGYuZmlsdGVyT3BlcmF0b3IsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZU9iamVjdDogaWR6XHJcbiAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgIHBhcmFtc1N0cmluZy5wdXNoKHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGYubGFiZWwpICsgJyA6ICcgKyBwYXJhbS5qb2luKCcsJykpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYmFja2VuZFNlcnZpY2UucGFyZW50Rm9ybS5nZXQoZi5wcm9wZXJ0eSk/LnZhbHVlICYmIGYuZmxhdHRlbkJ5U3ViQXR0cmlidXRlKSB7XHJcbiAgICAgICAgICAgICAgZmlsdGVyUmVxdWVzdC5maWx0ZXJzPy5wdXNoKG5ldyBGaWx0ZXIoe1xyXG4gICAgICAgICAgICAgICAgaWQ6IGYucHJvcGVydHksIGZpZWxkTmFtZTogZi5wcm9wZXJ0eSwgbGFiZWw6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGYubGFiZWwpLFxyXG4gICAgICAgICAgICAgICAgZmlsdGVyVHlwZTogJ0ZJTEVEX0ZJTFRFUicsIG9wZXJhdG9yOiBmLmZpbHRlck9wZXJhdG9yLFxyXG4gICAgICAgICAgICAgICAgdmFsdWVPYmplY3Q6IHRoaXMuZ2V0UGFyYW1WYWx1ZShmKVtmLmZsYXR0ZW5CeVN1YkF0dHJpYnV0ZV1cclxuICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmJhY2tlbmRTZXJ2aWNlLnBhcmVudEZvcm0uZ2V0KGYucHJvcGVydHkpPy52YWx1ZSAhPT0gbnVsbCAmJlxyXG4gICAgICAgICAgICAgIHRoaXMuYmFja2VuZFNlcnZpY2UucGFyZW50Rm9ybS5nZXQoZi5wcm9wZXJ0eSk/LnZhbHVlICE9PSB1bmRlZmluZWQgJiZcclxuICAgICAgICAgICAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlLnBhcmVudEZvcm0uZ2V0KGYucHJvcGVydHkpPy52YWx1ZSAhPT0gXCJcIikge1xyXG4gICAgICAgICAgICAgIGZpbHRlclJlcXVlc3QuZmlsdGVycz8ucHVzaChuZXcgRmlsdGVyKHtcclxuICAgICAgICAgICAgICAgIGlkOiBmLnByb3BlcnR5LCBmaWVsZE5hbWU6IGYucHJvcGVydHksIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChmLmxhYmVsKSxcclxuICAgICAgICAgICAgICAgIGZpbHRlclR5cGU6ICdGSUxFRF9GSUxURVInLCBvcGVyYXRvcjogZi5maWx0ZXJPcGVyYXRvcixcclxuICAgICAgICAgICAgICAgIHZhbHVlT2JqZWN0OiB0aGlzLmdldFBhcmFtVmFsdWUoZilcclxuICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcGFyYW1zU3RyaW5nLnB1c2godGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoZi5sYWJlbCkgKyAnIDogJyArIHRoaXMuZ2V0UGFyYW1WYWx1ZUxhYmVsKGYpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9fSlcclxuICAgICAgICBjb25zdCByZXBvcnRSZXF1ZXN0ID0gdGhpcy5iYWNrZW5kU2VydmljZS5idWlsZFJlcG9ydFJlcXVlc3QodGhpcy5jb2x1bW5zRGVmaW5pdGlvbiwgdGhpcy5wYWdlSW5mby5sYWJlbHNTZWN0aW9uICsgJy4nICsgdGhpcy5wYWdlSW5mby5pZCxcclxuICAgICAgICAgIGZpbHRlclJlcXVlc3QsIHR5cGUsIHRoaXMucGFnZUluZm8sICdMQU5EU0NBUEUnKTtcclxuICAgICAgICByZXBvcnRSZXF1ZXN0LnNlYXJjaFN0ciA9IHBhcmFtc1N0cmluZy5qb2luKCcgLCAnKTtcclxuICAgICAgICB0aGlzLnJlcG9ydFJlcXVlc3QgPSByZXBvcnRSZXF1ZXN0O1xyXG4gICAgICAgIC8vIHRoaXMuYWN0aXZlTGV2ZWwgPSAxO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuYmFja2VuZFNlcnZpY2UudG9wUGFuZWxNZXNzYWdlJC5uZXh0KG5ldyBTbmFja01lc3NhZ2UoJ0lOVkFMSURfUkVQT1JUX0ZPUk0nLCB0cnVlLCAnZXJyb3InKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFBhcmFtVmFsdWUoZjogRmllbGRJbmZvKSB7XHJcbiAgICAgICAgaWYgKGYudHlwZSA9PT0gJ2RhdGUnICYmIHRoaXMuYmFja2VuZFNlcnZpY2UucGFyZW50Rm9ybS5nZXQoZi5wcm9wZXJ0eSk/LnZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXREYXRlKHRoaXMuYmFja2VuZFNlcnZpY2UucGFyZW50Rm9ybS5nZXQoZi5wcm9wZXJ0eSk/LnZhbHVlLCAneXl5eS1NTS1kZCcsICdlbl9VUycpXHJcbiAgICAgICAgfWVsc2UgaWYgKGYudHlwZSA9PT0gJ2NoZWNrYm94Jykge1xyXG4gICAgICAgICAgICByZXR1cm4gISF0aGlzLmJhY2tlbmRTZXJ2aWNlLnBhcmVudEZvcm0uZ2V0KGYucHJvcGVydHkpPy52YWx1ZTtcclxuICAgICAgICB9ZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJhY2tlbmRTZXJ2aWNlLnBhcmVudEZvcm0uZ2V0KGYucHJvcGVydHkpPy52YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRQYXJhbVZhbHVlTGFiZWwoZjogRmllbGRJbmZvKSB7XHJcbiAgICAgICAgaWYgKGYudHlwZSA9PT0gJ2NoZWNrYm94Jykge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5iYWNrZW5kU2VydmljZS5wYXJlbnRGb3JtLmdldChmLnByb3BlcnR5KT8udmFsdWUgPyB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgneWVzJykgOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnbm8nKTtcclxuICAgICAgICB9ZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJhY2tlbmRTZXJ2aWNlLnBhcmVudEZvcm0uZ2V0KGYucHJvcGVydHkpPy52YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gIGdldFRpdGxlKCkge1xyXG4gICAgY29uc3QgcGFnZUluZm9NYXAgPSB7XHJcbiAgICAgIDE6IHRoaXMucGFnZUluZm8sXHJcbiAgICAgIDI6IHRoaXMuZHJpbGxEb3duUGFnZUluZm8sXHJcbiAgICAgIDM6IHRoaXMuanVuaW9yUGFnZUluZm9cclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgY3VycmVudEluZm8gPSBwYWdlSW5mb01hcFt0aGlzLmFjdGl2ZUxldmVsXSB8fCB0aGlzLnBhZ2VJbmZvO1xyXG4gICAgcmV0dXJuIGAke2N1cnJlbnRJbmZvLmxhYmVsc1NlY3Rpb259LiR7Y3VycmVudEluZm8uaWR9YDtcclxuICB9XHJcblxyXG4gICAgdXBkYXRlRm9ybSgkZXZlbnQ6IEZvcm1Hcm91cCkge1xyXG4gICAgICB0aGlzLnJlcG9ydEZvcm0gPSAkZXZlbnQ7XHJcbiAgICAgIHRoaXMuYmFja2VuZFNlcnZpY2UucGFyZW50Rm9ybSA9ICRldmVudDtcclxuXHJcbiAgICAgIHRoaXMuc2V0dXBEZXBlbmRlbnRGaWVsZFdhdGNoZXJzKCk7XHJcblxyXG4gICAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlLnBhcmVudEZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSh4ID0+IHtcclxuICAgICAgICAgIHRoaXMucmVhZHlUb1NlYXJjaCA9IHRoaXMuYmFja2VuZFNlcnZpY2UucGFyZW50Rm9ybS52YWxpZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICBwcml2YXRlIHNldHVwRGVwZW5kZW50RmllbGRXYXRjaGVycygpIHtcclxuICAgIHRoaXMuZmllbGRzXHJcbiAgICAgIC5maWx0ZXIoZmllbGQgPT4gZmllbGQubG9va3VwRmlsdGVyTGlzdCAmJiBmaWVsZC5sb29rdXBGaWx0ZXJMaXN0Lmxlbmd0aCA+IDApXHJcbiAgICAgIC5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgICBjb25zdCBkZXBlbmRlbnRGaWVsZHMgPSBmaWVsZC5sb29rdXBGaWx0ZXJMaXN0Lm1hcChmID0+IGYuZmllbGROYW1lKTtcclxuXHJcbiAgICAgICAgZGVwZW5kZW50RmllbGRzLmZvckVhY2goZGVwZW5kZW50RmllbGROYW1lID0+IHtcclxuICAgICAgICAgIGNvbnN0IGRlcGVuZGVudENvbnRyb2wgPSB0aGlzLnJlcG9ydEZvcm0uZ2V0KGRlcGVuZGVudEZpZWxkTmFtZSk7XHJcbiAgICAgICAgICBpZiAoZGVwZW5kZW50Q29udHJvbCkge1xyXG4gICAgICAgICAgICBkZXBlbmRlbnRDb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHRhcmdldENvbnRyb2wgPSB0aGlzLnJlcG9ydEZvcm0uZ2V0KGZpZWxkLnByb3BlcnR5KTtcclxuICAgICAgICAgICAgICBpZiAodGFyZ2V0Q29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0Q29udHJvbC5zZXRWYWx1ZShbXSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBpc1ZhbGlkRm9ybSgpIHtcclxuICAgICAgcmV0dXJuIHRoaXMucmVhZHlUb1NlYXJjaCA7XHJcblxyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gIGVtaXRVc2VyQWN0aW9uKCRldmVudDogVGFibGVQYWdlVXNlckFjdGlvbikge1xyXG4gICAgJGV2ZW50LnBhZ2VJbmZvID0gdGhpcy5wYWdlSW5mbztcclxuICAgIHRoaXMuZG9BRHJpbGxEb3duQWN0aW9uKCRldmVudCk7XHJcbiAgfVxyXG5cclxuICBlbWl0SHlwZXJMaW5rQWN0aW9uKCRldmVudDogVGFibGVQYWdlVXNlckFjdGlvbikge1xyXG4gICAgaWYgKCF0aGlzLnNob3VsZFByb2Nlc3NFdmVudEl0ZW0oJGV2ZW50Lml0ZW0pKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgaXRlbSA9ICRldmVudC5pdGVtO1xyXG4gICAgdGhpcy5wcmVwYXJlRGlhbG9nUmVwb3J0UmVxdWVzdChpdGVtKTtcclxuICAgIGNvbnN0IHJlcG9ydFJlcXVlc3QgPSB0aGlzLmJ1aWxkRGlhbG9nUmVwb3J0UmVxdWVzdCgpO1xyXG4gICAgcmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LnBhZ2VJbmRleCA9IDBcclxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oUmVwb3J0RGV0YWlsc0RpYWxvZ0NvbXBvbmVudCwge1xyXG4gICAgICBkYXRhOiB7XHJcbiAgICAgICAgcGFnZUluZm86IHRoaXMuanVuaW9yUGFnZUluZm8sXHJcbiAgICAgICAgcmVxdWVzdDogcmVwb3J0UmVxdWVzdCxcclxuICAgICAgICBjb2x1bW5zOiB0aGlzLmp1bmlvckNvbHVtbnMsXHJcbiAgICAgICAgaXRlbSxcclxuICAgICAgfSxcclxuICAgICAgaGVpZ2h0OiAnNTB2dycsXHJcbiAgICAgIG1heFdpZHRoOiAnMTIwdncnLFxyXG4gICAgICBkaXJlY3Rpb246IHRoaXMuY3VycmVudERpcmVjdGlvbixcclxuICAgICAgZGlzYWJsZUNsb3NlOiBmYWxzZSxcclxuICAgIH0pO1xyXG5cclxuICAgIGRpYWxvZ1JlZi5hZnRlck9wZW5lZCgpLnN1YnNjcmliZSgoKSA9PiB0aGlzLmRvSHlwZXJMaW5rQWN0aW9uKCRldmVudCkpO1xyXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKCgpID0+IHt9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcHJlcGFyZURpYWxvZ1JlcG9ydFJlcXVlc3QoaXRlbTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmRpYWxvZ1JlcG9ydFJlcXVlc3QgPSBjbG9uZURlZXAodGhpcy5yZXBvcnRSZXF1ZXN0KTtcclxuICAgIHRoaXMuZGlhbG9nUmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0ID0geyBmaWx0ZXJzOiBbXSB9O1xyXG5cclxuICAgIHRoaXMuYWRkU3RhbmRhcmRGaWx0ZXJzKGl0ZW0pO1xyXG4gICAgdGhpcy5hZGRPclJlcGxhY2VGaWx0ZXIoJ2lzZWMxJywgJ2lTZWMnLCBpdGVtWydpc2VjX3ZhbHVlJ10pO1xyXG4gICAgdGhpcy5hZGRGaWx0ZXJUeXBlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZFN0YW5kYXJkRmlsdGVycyhpdGVtOiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IHN0YW5kYXJkRmlsdGVycyA9IFtcclxuICAgICAgeyBrZXk6ICdwZXJpb2QnLCB2YWx1ZTogaXRlbVsncGVyaW9kJ10gfSxcclxuICAgICAgeyBrZXk6ICd5ZWFyJywgdmFsdWU6IGl0ZW1bJ3llYXInXSB9LFxyXG4gICAgICB7IGtleTogJ3NlY3RvcicsIHZhbHVlOiBpdGVtWydzZWN0b3JDb2RlJ10gfSxcclxuICAgICAgeyBrZXk6ICdkaXJlY3RvcmF0ZScsIHZhbHVlOiBpdGVtWydkaXJlY3RvcmF0ZUNvZGUnXSB9LFxyXG4gICAgICB7IGtleTogJ3N1YlRheFJhdGUnLCB2YWx1ZTogaXRlbVsndGF4X3JhdGVfY29kZSddIH0sXHJcbiAgICBdO1xyXG5cclxuICAgIHN0YW5kYXJkRmlsdGVycy5mb3JFYWNoKCh7IGtleSwgdmFsdWUgfSkgPT5cclxuICAgICAgdGhpcy5kaWFsb2dSZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QuZmlsdGVycy5wdXNoKFxyXG4gICAgICAgIHRoaXMuY3JlYXRlRmlsdGVyKGtleSwga2V5LCB2YWx1ZSlcclxuICAgICAgKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWRkRmlsdGVyVHlwZSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlzVGF4ID0gdGhpcy5kaWFsb2dSZXBvcnRSZXF1ZXN0LmFjdGlvbktleT8udG9Mb3dlckNhc2UoKS5pbmNsdWRlcygndGF4Jyk7XHJcbiAgICBjb25zdCBmaWx0ZXJUeXBlID0gaXNUYXggPyAnVEFYJyA6ICdWQUxVRSc7XHJcblxyXG4gICAgdGhpcy5kaWFsb2dSZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QuZmlsdGVycy5wdXNoKFxyXG4gICAgICB0aGlzLmNyZWF0ZUZpbHRlcignZmlsdGVyVHlwZScsICdmaWx0ZXJUeXBlJywgZmlsdGVyVHlwZSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkRGlhbG9nUmVwb3J0UmVxdWVzdCgpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuYmFja2VuZFNlcnZpY2UuYnVpbGRSZXBvcnRSZXF1ZXN0KFxyXG4gICAgICB0aGlzLmp1bmlvckNvbHVtbnMsXHJcbiAgICAgIGAke3RoaXMuanVuaW9yUGFnZUluZm8ubGFiZWxzU2VjdGlvbn0uJHt0aGlzLmp1bmlvclBhZ2VJbmZvLmlkfWAsXHJcbiAgICAgIHsgLi4udGhpcy5kaWFsb2dSZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QgfSxcclxuICAgICAgJycsXHJcbiAgICAgIHRoaXMuanVuaW9yUGFnZUluZm8sXHJcbiAgICAgICdMQU5EU0NBUEUnXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVGaWx0ZXIoa2V5OiBzdHJpbmcsIGZpZWxkTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogRmlsdGVyIHtcclxuICAgIHJldHVybiBuZXcgRmlsdGVyKHtcclxuICAgICAga2V5LFxyXG4gICAgICBmaWVsZE5hbWUsXHJcbiAgICAgIGxhYmVsOiAnJyxcclxuICAgICAgZmlsdGVyVHlwZTogJ0ZJTEVEX0ZJTFRFUicsXHJcbiAgICAgIG9wZXJhdG9yOiAnRVFVQUxTJyxcclxuICAgICAgdmFsdWVPYmplY3Q6IHZhbHVlLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZE9yUmVwbGFjZUZpbHRlcihpZDogc3RyaW5nLCBmaWVsZE5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgZmlsdGVyID0gbmV3IEZpbHRlcih7XHJcbiAgICAgIGlkLFxyXG4gICAgICBmaWVsZE5hbWUsXHJcbiAgICAgIGxhYmVsOiAnJyxcclxuICAgICAgZmlsdGVyVHlwZTogJ0ZJTEVEX0ZJTFRFUicsXHJcbiAgICAgIG9wZXJhdG9yOiAnRVFVQUxTJyxcclxuICAgICAgdmFsdWVPYmplY3Q6IHZhbHVlLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgZmlsdGVycyA9IHRoaXMuZGlhbG9nUmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LmZpbHRlcnM7XHJcbiAgICBjb25zdCBleGlzdGluZ0luZGV4ID0gZmlsdGVycy5maW5kSW5kZXgoKGY6IEZpbHRlcikgPT4gZi5pZCA9PT0gaWQpO1xyXG5cclxuICAgIGlmIChleGlzdGluZ0luZGV4ICE9PSAtMSkge1xyXG4gICAgICBmaWx0ZXJzLnNwbGljZShleGlzdGluZ0luZGV4LCAxLCBmaWx0ZXIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZmlsdGVycy5wdXNoKGZpbHRlcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIGVtaXRKdW5pb3JBY3Rpb24oJGV2ZW50OiBUYWJsZVBhZ2VVc2VyQWN0aW9uKSB7XHJcbiAgICBjb25zdCBqdW5pb3JBY3Rpb24gPSBKVU5JT1JfRE9XTl9BQ1RJT047XHJcbiAgICBqdW5pb3JBY3Rpb24ucGFnZUluZm8gPSB0aGlzLmRyaWxsRG93blBhZ2VJbmZvO1xyXG4gICAgdGhpcy5kb0p1bmlvckFjdGlvbigkZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgZHJpbGxEb3duKCkge1xyXG4gICAgY29uc3QgZHJpbGxkb3duYWN0aW9uID0gRFJJTExfRE9XTl9BQ1RJT047XHJcbiAgICBkcmlsbGRvd25hY3Rpb24ucGFnZUluZm8gPSB0aGlzLmRyaWxsRG93blBhZ2VJbmZvO1xyXG4gICAgdGhpcy5kb0FEcmlsbERvd25BY3Rpb24oZHJpbGxkb3duYWN0aW9uKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZG9KdW5pb3JBY3Rpb24oJGV2ZW50OiBUYWJsZVBhZ2VVc2VyQWN0aW9uKSB7XHJcbiAgICBpZiAodGhpcy5qdW5pb3JDb2x1bW5zICYmIHRoaXMuanVuaW9yUGFnZUluZm8pIHtcclxuICAgICAgaWYgKHRoaXMuZW5yaWNoSnVuaW9yUmVwb3J0UmVxdWVzdCkge1xyXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUxldmVsID09PSAyKSB7XHJcbiAgICAgICAgICB0aGlzLmlzRWRpdGFibGUgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuZGlzYWJsZUV4cG9ydEFjdGlvbiA9IHRoaXMuanVuaW9yUGFnZUluZm8uaGlkZVJlcG9ydHNFeHRyYWN0QnV0dG9uIHx8IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5qdW5pb3JSZXBvcnRSZXF1ZXN0ID0gdGhpcy5iYWNrZW5kU2VydmljZS5idWlsZFJlcG9ydFJlcXVlc3QodGhpcy5qdW5pb3JDb2x1bW5zLFxyXG4gICAgICAgICAgICB0aGlzLmp1bmlvclBhZ2VJbmZvLmxhYmVsc1NlY3Rpb24gKyAnLicgKyB0aGlzLmp1bmlvclBhZ2VJbmZvLmlkLFxyXG4gICAgICAgICAgICB0aGlzLnJlcG9ydFJlcXVlc3QuZmlsdGVyUmVxdWVzdCwgJycsIHRoaXMuanVuaW9yUGFnZUluZm8sICdMQU5EU0NBUEUnKTtcclxuICAgICAgICAgIHRoaXMuZW5yaWNoSnVuaW9yUmVwb3J0UmVxdWVzdCgkZXZlbnQsIHRoaXMuanVuaW9yUmVwb3J0UmVxdWVzdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuYWN0aXZlTGV2ZWwgPSB0aGlzLmFjdGl2ZUxldmVsICsxO1xyXG4gICAgfVxyXG4gIH1cclxuICBwcml2YXRlIGRvQURyaWxsRG93bkFjdGlvbigkZXZlbnQ6IFRhYmxlUGFnZVVzZXJBY3Rpb24pIHtcclxuICAgIGlmICh0aGlzLmRyaWxsRG93bkNvbHVtbnMgJiYgdGhpcy5kcmlsbERvd25QYWdlSW5mbykge1xyXG4gICAgICBpZiAodGhpcy5lbnJpY2hEcmlsbERvd25SZXBvcnRSZXF1ZXN0KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlTGV2ZWwgPT09IDEpIHtcclxuICAgICAgICAgIHRoaXMuaXNFZGl0YWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5jaGlsZFJlcG9ydFJlcXVlc3QgPSB0aGlzLmJhY2tlbmRTZXJ2aWNlLmJ1aWxkUmVwb3J0UmVxdWVzdCh0aGlzLmRyaWxsRG93bkNvbHVtbnMsXHJcbiAgICAgICAgICAgIHRoaXMuZHJpbGxEb3duUGFnZUluZm8ubGFiZWxzU2VjdGlvbiArICcuJyArIHRoaXMuZHJpbGxEb3duUGFnZUluZm8uaWQsXHJcbiAgICAgICAgICAgIHRoaXMucmVwb3J0UmVxdWVzdC5maWx0ZXJSZXF1ZXN0LCAnJywgdGhpcy5kcmlsbERvd25QYWdlSW5mbywgJ0xBTkRTQ0FQRScpO1xyXG4gICAgICAgICAgdGhpcy5kaXNhYmxlRXhwb3J0QWN0aW9uID0gdGhpcy5kcmlsbERvd25QYWdlSW5mby5oaWRlUmVwb3J0c0V4dHJhY3RCdXR0b24gfHwgZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmVucmljaERyaWxsRG93blJlcG9ydFJlcXVlc3QoJGV2ZW50LCB0aGlzLmNoaWxkUmVwb3J0UmVxdWVzdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuYWN0aXZlTGV2ZWwgPSB0aGlzLmFjdGl2ZUxldmVsICsxO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkb0h5cGVyTGlua0FjdGlvbigkZXZlbnQ6IFRhYmxlUGFnZVVzZXJBY3Rpb24pIHtcclxuICAgIGlmICh0aGlzLmVucmljaEh5cGVyTGlua1JlcG9ydFJlcXVlc3QpIHtcclxuICAgICAgICAgIHRoaXMuanVuaW9yUmVwb3J0UmVxdWVzdCA9IHRoaXMuYmFja2VuZFNlcnZpY2UuYnVpbGRSZXBvcnRSZXF1ZXN0KHRoaXMuanVuaW9yQ29sdW1ucyxcclxuICAgICAgICAgICAgdGhpcy5qdW5pb3JQYWdlSW5mby5sYWJlbHNTZWN0aW9uICsgJy4nICsgdGhpcy5qdW5pb3JQYWdlSW5mby5pZCxcclxuICAgICAgICAgICAgdGhpcy5kaWFsb2dSZXBvcnRSZXF1ZXN0LmZpbHRlclJlcXVlc3QsICcnLCB0aGlzLmp1bmlvclBhZ2VJbmZvLCAnTEFORFNDQVBFJyk7XHJcbiAgICAgICAgICB0aGlzLmRpc2FibGVFeHBvcnRBY3Rpb24gPSB0aGlzLmp1bmlvclBhZ2VJbmZvLmhpZGVSZXBvcnRzRXh0cmFjdEJ1dHRvbiB8fCBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuZW5yaWNoSHlwZXJMaW5rUmVwb3J0UmVxdWVzdCgkZXZlbnQsIHRoaXMuanVuaW9yUmVwb3J0UmVxdWVzdCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBleHRyYWN0UmVwb3J0KHJlcG9ydFR5cGU6IGFueSkge1xyXG4gICAgICBpZiAodGhpcy5hY3RpdmVMZXZlbCA9PT0gMSkge1xyXG4gICAgICAgIHRoaXMucmVwb3J0UmVxdWVzdC5yZXBvcnRUeXBlID0gcmVwb3J0VHlwZTtcclxuICAgICAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlLmRvd25sb2FkUmVwb3J0KHRoaXMucmVwb3J0UmVxdWVzdCwgdGhpcy5wYWdlSW5mby5hcGlVcmkgKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLmFjdGl2ZUxldmVsID09PSAyKSB7XHJcbiAgICAgICAgdGhpcy5jaGlsZFJlcG9ydFJlcXVlc3QucmVwb3J0VHlwZSA9IHJlcG9ydFR5cGU7XHJcbiAgICAgICAgdGhpcy5iYWNrZW5kU2VydmljZS5kb3dubG9hZFJlcG9ydCh0aGlzLmNoaWxkUmVwb3J0UmVxdWVzdCwgdGhpcy5kcmlsbERvd25QYWdlSW5mby5hcGlVcmkgKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLmFjdGl2ZUxldmVsID09PSAzKSB7XHJcbiAgICAgICAgdGhpcy5qdW5pb3JSZXBvcnRSZXF1ZXN0LnJlcG9ydFR5cGUgPSByZXBvcnRUeXBlO1xyXG4gICAgICAgIHRoaXMuYmFja2VuZFNlcnZpY2UuZG93bmxvYWRSZXBvcnQodGhpcy5qdW5pb3JSZXBvcnRSZXF1ZXN0LCB0aGlzLmp1bmlvclBhZ2VJbmZvLmFwaVVyaSApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gIGdvVXAoKSB7XHJcbiAgICB0aGlzLmlzRWRpdGFibGUgPSB0cnVlO1xyXG4gICAgdGhpcy5hY3RpdmVMZXZlbCA9IHRoaXMuYWN0aXZlTGV2ZWwgLTE7XHJcbiAgICB0aGlzLmRvQWN0aW9uKHRoaXMueCk7XHJcbiAgICB0aGlzLnJlbG9hZERhdGEgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMuYWN0aXZlTGV2ZWwgPjEpIHtcclxuICAgICAgdGhpcy5pc0VkaXRhYmxlID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICB0aGlzLmRpc2FibGVFeHBvcnRBY3Rpb24gPSBmYWxzZVxyXG4gIH1cclxuXHJcbiAgZHJpbGxEb3duRW5hYmxlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLmRyaWxsRG93blBhZ2VJbmZvICYmICF0aGlzLmhpZGVEcmlsbERvd25CdXR0b24gJiYgIXRoaXMuZ2V0SXNFbXB0eUxpc3QoKTtcclxuICB9XHJcblxyXG4gIGRyaWxsRG93bkxhYmVsKCkge1xyXG4gICAgcmV0dXJuIGAke3RoaXMucGFnZUluZm8ubGFiZWxzU2VjdGlvbn0uZHJpbGxEb3duTGFiZWxgIDtcclxuICB9XHJcbiAgZ2V0SXNFbXB0eUxpc3QoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5iYWNrZW5kU2VydmljZS5pc0VtcHR5SXRlbXMgfHwgdGhpcy5kaXNhYmxlRXhwb3J0QWN0aW9uID09PSB0cnVlO1xyXG4gIH1cclxuICBjbGVhcigpIHtcclxuICAgIGNvbnN0IGN1cnJlbnRVcmwgPSB0aGlzLnJvdXRlci51cmw7XHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKCcvJywgeyBza2lwTG9jYXRpb25DaGFuZ2U6IHRydWUgfSkudGhlbigoKSA9PiB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtjdXJyZW50VXJsXSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBpZiAodGhpcy5yZXBvcnRGb3JtKSB7XHJcbiAgICAvLyAgIHRoaXMucmVwb3J0Rm9ybS5yZXNldCgpO1xyXG4gICAgLy9cclxuICAgIC8vICAgdGhpcy5maWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgICAvLyAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdsb29rdXAnIHx8IGZpZWxkLnR5cGUgPT09ICdtdWx0aS1zZWxlY3QnKSB7XHJcbiAgICAvLyAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5yZXBvcnRGb3JtLmdldChmaWVsZC5wcm9wZXJ0eSk7XHJcbiAgICAvLyAgICAgICBpZiAoY29udHJvbCkge1xyXG4gICAgLy8gICAgICAgICBjb250cm9sLnNldFZhbHVlKFtdKTtcclxuICAgIC8vICAgICAgIH1cclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgIH0pO1xyXG4gICAgLy8gfVxyXG5cclxuICB9XHJcblxyXG5cclxuICBpc0Zvcm1FbXB0eSgpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5yZXBvcnRGb3JtIHx8ICF0aGlzLnJlcG9ydEZvcm0udmFsdWUpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5yZXBvcnRGb3JtLnZhbHVlKS5ldmVyeSh2YWx1ZSA9PiB7XHJcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSAnJykge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDA7XHJcblxyXG5cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2hvdWxkUHJvY2Vzc0V2ZW50SXRlbShpdGVtOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGdyb3VwQnlQcm9wID0gdGhpcy5wYWdlSW5mbz8uZ3JvdXBCeVByb3BlcnR5O1xyXG4gICAgY29uc3QgZ3JvdXBCeVZhbHVlcyA9IHRoaXMucGFnZUluZm8/Lmdyb3VwQnlWYWx1ZTtcclxuXHJcbiAgICBpZiAoIWdyb3VwQnlQcm9wIHx8ICFncm91cEJ5VmFsdWVzIHx8ICFpdGVtW2dyb3VwQnlQcm9wXSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB2YWx1ZSA9IGl0ZW1bZ3JvdXBCeVByb3BdLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgcmV0dXJuICFncm91cEJ5VmFsdWVzLnNvbWUodiA9PiB2YWx1ZS5pbmNsdWRlcyh2KSAmJiB2YWx1ZS5sZW5ndGggPj0gdi5sZW5ndGgpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiY29sdW1uIGZ1bGwtd2lkdGhcIj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1zdGFydC1jZW50ZXJcIiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDEwcHg7XCI+XHJcbiAgICA8YXBwLXRpdGxlLWJhciBbcGFnZVRpdGxlXT1cImdldFRpdGxlKClcIiBbbmV3QWN0aW9uXT1cImZhbHNlXCI+PC9hcHAtdGl0bGUtYmFyPlxyXG5cclxuICAgIDxtYXQtaWNvblxyXG4gICAgICAqbmdJZj1cInBhZ2VJbmZvPy5oYXNIaW50XCJcclxuICAgICAgW21hdFRvb2x0aXBdPVwicGFnZUluZm8ubGFiZWxzU2VjdGlvbiArICcuaGludCcgfCB0cmFuc2xhdGVcIlxyXG4gICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJyaWdodFwiXHJcbiAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgIGNsYXNzPVwiaGludC1pY29uXCJcclxuICAgICAgbWF0VG9vbHRpcENsYXNzPVwiY3VzdG9tLXRvb2x0aXBcIj5cclxuICAgICAgaGVscF9vdXRsaW5lXHJcbiAgICA8L21hdC1pY29uPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8YXBwLWJhc2UtZm9ybS1jYW52YXNcclxuICAgIFtwYWdlSW5mb109XCJwYWdlSW5mb1wiXHJcbiAgICBbZmllbGRzXT1cImZpZWxkc1wiXHJcbiAgICBbZWRpdGFibGVdPVwiaXNFZGl0YWJsZVwiXHJcbiAgICBbZXJyb3JzXT1cImVycm9yc1wiXHJcbiAgICBbaXRlbV09XCJ0aGlzLnJlcG9ydEZvcm0/LnZhbHVlIHx8IHt9XCJcclxuICAgIChmb3JtVXBkYXRlZCk9XCJ1cGRhdGVGb3JtKCRldmVudClcIlxyXG4gID48L2FwcC1iYXNlLWZvcm0tY2FudmFzPlxyXG5cclxuICA8YnI+PGJyPlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiY29sdW1uXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93IGdhcC0xMCByZXNwb25zaXZlLXJvd1wiPlxyXG4gICAgICA8YnV0dG9uICpuZ0lmPVwiYWN0aXZlTGV2ZWwgPT09IDFcIiBjb2xvcj1cInByaW1hcnlcIiBtYXQtZmxhdC1idXR0b24gKGNsaWNrKT1cImRvQWN0aW9uKHgpXCIgW2Rpc2FibGVkXT1cIiFpc1ZhbGlkRm9ybSgpXCIgaWQ9XCJyZXBvcnQtZ2VuZXJhdGUtYnRuXCI+XHJcbiAgICAgICAge3sgJ1JFUE9SVFMuZ2VuZXJhdGUnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudVwiIFtkaXNhYmxlZF09XCJnZXRJc0VtcHR5TGlzdCgpXCIgY29sb3I9XCJwcmltYXJ5XCIgaWQ9XCJyZXBvcnQtZXh0cmFjdC10cmlnZ2VyXCI+XHJcbiAgICAgICAge3sgJ2V4dHJhY3QnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiZXhwYW5kX21vcmUgYWN0aW9uQnV0dG9uX19leHBhbmRcIj5leHBhbmRfbW9yZTwvbWF0LWljb24+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgPGJ1dHRvbiBtYXQtZmxhdC1idXR0b24gKGNsaWNrKT1cImNsZWFyKClcIiBbZGlzYWJsZWRdPVwiaXNGb3JtRW1wdHkoKSB8fCBhY3RpdmVMZXZlbCA+IDFcIiBpZD1cInJlcG9ydC1jbGVhci1idG5cIj5cclxuICAgICAgICB7eyAnUkVQT1JUUy5jbGVhcicgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICA8YnV0dG9uICpuZ0lmPVwiYWN0aXZlTGV2ZWwgPT09IDEgJiYgZHJpbGxEb3duRW5hYmxlZCgpXCIgY29sb3I9XCJ3YXJuXCIgbWF0LWZsYXQtYnV0dG9uIChjbGljayk9XCJkcmlsbERvd24oKVwiIGlkPVwicmVwb3J0LWRyaWxsZG93bi1idG5cIj5cclxuICAgICAgICB7eyBkcmlsbERvd25MYWJlbCgpIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgPGJ1dHRvbiAqbmdJZj1cImFjdGl2ZUxldmVsID4gMSAmJiBiYWNrQnV0dG9uRW5hYmxlZFwiIGNvbG9yPVwid2FyblwiIG1hdC1mbGF0LWJ1dHRvbiAoY2xpY2spPVwiZ29VcCgpXCIgaWQ9XCJyZXBvcnQtdXAtYnRuXCI+XHJcbiAgICAgICAge3sgJ1JFUE9SVFMudXAnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgKm5nSWY9XCJhY3RpdmVMZXZlbCA+PSAxXCIgY2xhc3M9XCJtYWluLWZvcm0tY2FudmFzIHJvdyBhbGlnbi1zdGFydC1zdGFydCByZXNwb25zaXZlLXRhYmxlXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAzdmg7XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sdW1uIGZ1bGwtd2lkdGhcIj5cclxuICAgICAgPGFwcC1iYXNlLXRhYmxlXHJcbiAgICAgICAgKm5nSWY9XCJhY3RpdmVMZXZlbCA9PT0gMVwiXHJcbiAgICAgICAgW3BhZ2VJbmZvXT1cInBhZ2VJbmZvXCJcclxuICAgICAgICBbY29sdW1uc109XCJjb2x1bW5zRGVmaW5pdGlvblwiXHJcbiAgICAgICAgW2VuZm9yY2VSZWZyZXNoXT1cInJlbG9hZERhdGFcIlxyXG4gICAgICAgIGlkPVwicGFyZW50XCJcclxuICAgICAgICBbcmVwb3J0UmVxdWVzdF09XCJyZXBvcnRSZXF1ZXN0XCJcclxuICAgICAgICAodXNlckFjdGlvbik9XCJlbWl0VXNlckFjdGlvbigkZXZlbnQpXCJcclxuICAgICAgICAoaHlwZXJMaW5rQWN0aW9uKT1cImVtaXRIeXBlckxpbmtBY3Rpb24oJGV2ZW50KVwiPlxyXG4gICAgICA8L2FwcC1iYXNlLXRhYmxlPlxyXG5cclxuICAgICAgPGFwcC1iYXNlLXRhYmxlXHJcbiAgICAgICAgKm5nSWY9XCJhY3RpdmVMZXZlbCA9PT0gMlwiXHJcbiAgICAgICAgW3BhZ2VJbmZvXT1cImRyaWxsRG93blBhZ2VJbmZvXCJcclxuICAgICAgICBbY29sdW1uc109XCJkcmlsbERvd25Db2x1bW5zXCJcclxuICAgICAgICBpZD1cImNoaWxkXCJcclxuICAgICAgICBbcmVwb3J0UmVxdWVzdF09XCJjaGlsZFJlcG9ydFJlcXVlc3RcIlxyXG4gICAgICAgICh1c2VyQWN0aW9uKT1cImVtaXRKdW5pb3JBY3Rpb24oJGV2ZW50KVwiXHJcbiAgICAgICAgKGh5cGVyTGlua0FjdGlvbik9XCJlbWl0SHlwZXJMaW5rQWN0aW9uKCRldmVudClcIj5cclxuICAgICAgPC9hcHAtYmFzZS10YWJsZT5cclxuXHJcbiAgICAgIDxhcHAtYmFzZS10YWJsZVxyXG4gICAgICAgICpuZ0lmPVwiYWN0aXZlTGV2ZWwgPT09IDNcIlxyXG4gICAgICAgIFtwYWdlSW5mb109XCJqdW5pb3JQYWdlSW5mb1wiXHJcbiAgICAgICAgW2NvbHVtbnNdPVwianVuaW9yQ29sdW1uc1wiXHJcbiAgICAgICAgaWQ9XCJqdW5pb3JcIlxyXG4gICAgICAgIFtyZXBvcnRSZXF1ZXN0XT1cImp1bmlvclJlcG9ydFJlcXVlc3RcIj5cclxuICAgICAgPC9hcHAtYmFzZS10YWJsZT5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuPC9kaXY+XHJcblxyXG48bWF0LW1lbnUgI21lbnU9XCJtYXRNZW51XCI+XHJcbiAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LW1lbnUtaXRlbSAqbmdGb3I9XCJsZXQgdHlwZSBvZiB0eXBlc1wiIChjbGljayk9XCJleHRyYWN0UmVwb3J0KHR5cGUpXCIgW2F0dHIuaWRdPVwiJ3JlcG9ydC1leHRyYWN0LWl0ZW0tJyArIHR5cGVcIj5cclxuICAgIHt7IHR5cGUgfX1cclxuICA8L2J1dHRvbj5cclxuPC9tYXQtbWVudT5cclxuIl19
|