@sunbird-cb/cbp-ai 0.0.1
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/README.md +24 -0
- package/esm2022/lib/ai-cbp-routing.module.mjs +56 -0
- package/esm2022/lib/ai-cbp.component.mjs +14 -0
- package/esm2022/lib/ai-cbp.module.mjs +263 -0
- package/esm2022/lib/ai-cbp.service.mjs +14 -0
- package/esm2022/lib/components/add-course/add-course.component.mjs +444 -0
- package/esm2022/lib/components/add-designation/add-designation.component.mjs +460 -0
- package/esm2022/lib/components/add-personalisation/add-personalisation.component.mjs +33 -0
- package/esm2022/lib/components/approval-request-form/approval-request-form.component.mjs +392 -0
- package/esm2022/lib/components/approval-requests/approval-requests.component.mjs +398 -0
- package/esm2022/lib/components/dashboard/dashboard.component.mjs +265 -0
- package/esm2022/lib/components/delete-role-mapping/delete-role-mapping.component.mjs +53 -0
- package/esm2022/lib/components/delete-role-mapping-popup/delete-role-mapping-popup.component.mjs +39 -0
- package/esm2022/lib/components/edit-cbp-plan/edit-cbp-plan.component.mjs +699 -0
- package/esm2022/lib/components/gap-analysis-recommended-course/gap-analysis-recommended-course.component.mjs +188 -0
- package/esm2022/lib/components/generate-course-recommendation/generate-course-recommendation.component.mjs +1949 -0
- package/esm2022/lib/components/list-popup/list-popup.component.mjs +32 -0
- package/esm2022/lib/components/review-request/review-request.component.mjs +138 -0
- package/esm2022/lib/components/role-mapping-generation/role-mapping-generation.component.mjs +1082 -0
- package/esm2022/lib/components/role-mapping-list/role-mapping-list.component.mjs +714 -0
- package/esm2022/lib/components/suggest-more-courses/suggest-more-courses.component.mjs +370 -0
- package/esm2022/lib/components/update-designation-hierarchy/update-designation-hierarchy.component.mjs +235 -0
- package/esm2022/lib/components/view-cbp-plan/view-cbp-plan.component.mjs +125 -0
- package/esm2022/lib/components/view-course-recommendation/view-course-recommendation.component.mjs +397 -0
- package/esm2022/lib/components/view-final-cbp-plan/view-final-cbp-plan.component.mjs +883 -0
- package/esm2022/lib/modules/initial-screen/initial-screen.component.mjs +127 -0
- package/esm2022/lib/modules/shared/constant/app.constant.mjs +2036 -0
- package/esm2022/lib/modules/shared/directives/clickoutside.directive.mjs +38 -0
- package/esm2022/lib/modules/shared/directives/directive.module.mjs +21 -0
- package/esm2022/lib/modules/shared/pipes/order-by-name.pipe.mjs +23 -0
- package/esm2022/lib/modules/shared/services/event.service.mjs +24 -0
- package/esm2022/lib/modules/shared/services/events.mjs +125 -0
- package/esm2022/lib/modules/shared/services/init.service.mjs +41 -0
- package/esm2022/lib/modules/shared/services/role-mapping.service.mjs +261 -0
- package/esm2022/lib/modules/shared/services/shared.service.mjs +869 -0
- package/esm2022/lib/modules/upload-document-page/progress-dialog/progress-dialog.component.mjs +53 -0
- package/esm2022/lib/modules/upload-document-page/upload-dialog/upload-dialog.component.mjs +186 -0
- package/esm2022/lib/modules/upload-document-page/upload-document-page.component.mjs +367 -0
- package/esm2022/lib/pipe-public-URL/pipe-public-URL.module.mjs +20 -0
- package/esm2022/lib/pipe-public-URL/pipe-public-URL.pipe.mjs +23 -0
- package/esm2022/public-api.mjs +14 -0
- package/esm2022/sunbird-cb-cbp-ai.mjs +5 -0
- package/fesm2022/sunbird-cb-cbp-ai.mjs +12952 -0
- package/fesm2022/sunbird-cb-cbp-ai.mjs.map +1 -0
- package/index.d.ts +6 -0
- package/lib/ai-cbp-routing.module.d.ts +8 -0
- package/lib/ai-cbp-routing.module.d.ts.map +1 -0
- package/lib/ai-cbp.component.d.ts +7 -0
- package/lib/ai-cbp.component.d.ts.map +1 -0
- package/lib/ai-cbp.module.d.ts +68 -0
- package/lib/ai-cbp.module.d.ts.map +1 -0
- package/lib/ai-cbp.service.d.ts +7 -0
- package/lib/ai-cbp.service.d.ts.map +1 -0
- package/lib/components/add-course/add-course.component.d.ts +67 -0
- package/lib/components/add-course/add-course.component.d.ts.map +1 -0
- package/lib/components/add-designation/add-designation.component.d.ts +52 -0
- package/lib/components/add-designation/add-designation.component.d.ts.map +1 -0
- package/lib/components/add-personalisation/add-personalisation.component.d.ts +16 -0
- package/lib/components/add-personalisation/add-personalisation.component.d.ts.map +1 -0
- package/lib/components/approval-request-form/approval-request-form.component.d.ts +48 -0
- package/lib/components/approval-request-form/approval-request-form.component.d.ts.map +1 -0
- package/lib/components/approval-requests/approval-requests.component.d.ts +80 -0
- package/lib/components/approval-requests/approval-requests.component.d.ts.map +1 -0
- package/lib/components/dashboard/dashboard.component.d.ts +55 -0
- package/lib/components/dashboard/dashboard.component.d.ts.map +1 -0
- package/lib/components/delete-role-mapping/delete-role-mapping.component.d.ts +18 -0
- package/lib/components/delete-role-mapping/delete-role-mapping.component.d.ts.map +1 -0
- package/lib/components/delete-role-mapping-popup/delete-role-mapping-popup.component.d.ts +18 -0
- package/lib/components/delete-role-mapping-popup/delete-role-mapping-popup.component.d.ts.map +1 -0
- package/lib/components/edit-cbp-plan/edit-cbp-plan.component.d.ts +94 -0
- package/lib/components/edit-cbp-plan/edit-cbp-plan.component.d.ts.map +1 -0
- package/lib/components/gap-analysis-recommended-course/gap-analysis-recommended-course.component.d.ts +35 -0
- package/lib/components/gap-analysis-recommended-course/gap-analysis-recommended-course.component.d.ts.map +1 -0
- package/lib/components/generate-course-recommendation/generate-course-recommendation.component.d.ts +198 -0
- package/lib/components/generate-course-recommendation/generate-course-recommendation.component.d.ts.map +1 -0
- package/lib/components/list-popup/list-popup.component.d.ts +13 -0
- package/lib/components/list-popup/list-popup.component.d.ts.map +1 -0
- package/lib/components/review-request/review-request.component.d.ts +39 -0
- package/lib/components/review-request/review-request.component.d.ts.map +1 -0
- package/lib/components/role-mapping-generation/role-mapping-generation.component.d.ts +99 -0
- package/lib/components/role-mapping-generation/role-mapping-generation.component.d.ts.map +1 -0
- package/lib/components/role-mapping-list/role-mapping-list.component.d.ts +83 -0
- package/lib/components/role-mapping-list/role-mapping-list.component.d.ts.map +1 -0
- package/lib/components/suggest-more-courses/suggest-more-courses.component.d.ts +48 -0
- package/lib/components/suggest-more-courses/suggest-more-courses.component.d.ts.map +1 -0
- package/lib/components/update-designation-hierarchy/update-designation-hierarchy.component.d.ts +41 -0
- package/lib/components/update-designation-hierarchy/update-designation-hierarchy.component.d.ts.map +1 -0
- package/lib/components/view-cbp-plan/view-cbp-plan.component.d.ts +29 -0
- package/lib/components/view-cbp-plan/view-cbp-plan.component.d.ts.map +1 -0
- package/lib/components/view-course-recommendation/view-course-recommendation.component.d.ts +49 -0
- package/lib/components/view-course-recommendation/view-course-recommendation.component.d.ts.map +1 -0
- package/lib/components/view-final-cbp-plan/view-final-cbp-plan.component.d.ts +73 -0
- package/lib/components/view-final-cbp-plan/view-final-cbp-plan.component.d.ts.map +1 -0
- package/lib/modules/initial-screen/initial-screen.component.d.ts +85 -0
- package/lib/modules/initial-screen/initial-screen.component.d.ts.map +1 -0
- package/lib/modules/shared/constant/app.constant.d.ts +457 -0
- package/lib/modules/shared/constant/app.constant.d.ts.map +1 -0
- package/lib/modules/shared/directives/clickoutside.directive.d.ts +13 -0
- package/lib/modules/shared/directives/clickoutside.directive.d.ts.map +1 -0
- package/lib/modules/shared/directives/directive.module.d.ts +8 -0
- package/lib/modules/shared/directives/directive.module.d.ts.map +1 -0
- package/lib/modules/shared/pipes/order-by-name.pipe.d.ts +8 -0
- package/lib/modules/shared/pipes/order-by-name.pipe.d.ts.map +1 -0
- package/lib/modules/shared/services/event.service.d.ts +12 -0
- package/lib/modules/shared/services/event.service.d.ts.map +1 -0
- package/lib/modules/shared/services/events.d.ts +200 -0
- package/lib/modules/shared/services/events.d.ts.map +1 -0
- package/lib/modules/shared/services/init.service.d.ts +13 -0
- package/lib/modules/shared/services/init.service.d.ts.map +1 -0
- package/lib/modules/shared/services/role-mapping.service.d.ts +21 -0
- package/lib/modules/shared/services/role-mapping.service.d.ts.map +1 -0
- package/lib/modules/shared/services/shared.service.d.ts +108 -0
- package/lib/modules/shared/services/shared.service.d.ts.map +1 -0
- package/lib/modules/upload-document-page/progress-dialog/progress-dialog.component.d.ts +14 -0
- package/lib/modules/upload-document-page/progress-dialog/progress-dialog.component.d.ts.map +1 -0
- package/lib/modules/upload-document-page/upload-dialog/upload-dialog.component.d.ts +29 -0
- package/lib/modules/upload-document-page/upload-dialog/upload-dialog.component.d.ts.map +1 -0
- package/lib/modules/upload-document-page/upload-document-page.component.d.ts +64 -0
- package/lib/modules/upload-document-page/upload-document-page.component.d.ts.map +1 -0
- package/lib/pipe-public-URL/pipe-public-URL.module.d.ts +9 -0
- package/lib/pipe-public-URL/pipe-public-URL.module.d.ts.map +1 -0
- package/lib/pipe-public-URL/pipe-public-URL.pipe.d.ts +11 -0
- package/lib/pipe-public-URL/pipe-public-URL.pipe.d.ts.map +1 -0
- package/package.json +28 -0
- package/public-api.d.ts +11 -0
- package/public-api.d.ts.map +1 -0
- package/sunbird-cb-cbp-ai-0.0.1.tgz +0 -0
- package/sunbird-cb-cbp-ai.d.ts.map +1 -0
|
@@ -0,0 +1,1082 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
|
|
2
|
+
import { MatTableDataSource } from '@angular/material/table';
|
|
3
|
+
import { Validators } from '@angular/forms';
|
|
4
|
+
import html2pdf from 'html2pdf.js';
|
|
5
|
+
import { DeleteRoleMappingPopupComponent } from '../delete-role-mapping-popup/delete-role-mapping-popup.component';
|
|
6
|
+
import { interval, of, concat, Subject } from 'rxjs';
|
|
7
|
+
import { switchMap, takeWhile, tap } from 'rxjs/operators';
|
|
8
|
+
import { takeUntil } from 'rxjs/operators';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "../../modules/shared/services/event.service";
|
|
11
|
+
import * as i2 from "../../modules/shared/services/shared.service";
|
|
12
|
+
import * as i3 from "@angular/forms";
|
|
13
|
+
import * as i4 from "@angular/material/snack-bar";
|
|
14
|
+
import * as i5 from "@angular/material/dialog";
|
|
15
|
+
import * as i6 from "../../modules/shared/services/role-mapping.service";
|
|
16
|
+
import * as i7 from "@angular/router";
|
|
17
|
+
import * as i8 from "@angular/common";
|
|
18
|
+
import * as i9 from "@angular/material/legacy-card";
|
|
19
|
+
import * as i10 from "@angular/material/legacy-form-field";
|
|
20
|
+
import * as i11 from "@angular/material/legacy-button";
|
|
21
|
+
import * as i12 from "@angular/material/icon";
|
|
22
|
+
import * as i13 from "@angular/material/legacy-radio";
|
|
23
|
+
import * as i14 from "@angular/material/legacy-select";
|
|
24
|
+
import * as i15 from "@angular/material/legacy-core";
|
|
25
|
+
import * as i16 from "@angular/material/progress-spinner";
|
|
26
|
+
export class RoleMappingGenerationComponent {
|
|
27
|
+
constructor(eventSvc, sharedService, fb, snackBar, dialog, roleMappingService, router) {
|
|
28
|
+
this.eventSvc = eventSvc;
|
|
29
|
+
this.sharedService = sharedService;
|
|
30
|
+
this.fb = fb;
|
|
31
|
+
this.snackBar = snackBar;
|
|
32
|
+
this.dialog = dialog;
|
|
33
|
+
this.roleMappingService = roleMappingService;
|
|
34
|
+
this.router = router;
|
|
35
|
+
this.loginStatusFlag = false;
|
|
36
|
+
this.title = 'sunbird-cb-staticweb';
|
|
37
|
+
this.selectedValue = '';
|
|
38
|
+
this.searchText = '';
|
|
39
|
+
this.displayedColumns = ['RequestId', 'title', 'requestor', 'requestType',
|
|
40
|
+
'requestStatus', 'assignee', 'requestedOn', 'interests', 'action'];
|
|
41
|
+
this.selectedMinistryType = 'ministry';
|
|
42
|
+
this.ministryData = [];
|
|
43
|
+
this.ministryFullData = [];
|
|
44
|
+
this.disableBtn = true;
|
|
45
|
+
this.sectorData = [
|
|
46
|
+
{
|
|
47
|
+
value: 'Women and child development'
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
value: 'Rural development'
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
value: 'Urban development'
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
value: 'Healthcare'
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
value: 'Agriculture'
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
value: 'Others'
|
|
63
|
+
}
|
|
64
|
+
];
|
|
65
|
+
this.departmentData = [];
|
|
66
|
+
this.loading = false;
|
|
67
|
+
this.maxFileSizeMB = 25;
|
|
68
|
+
this.allowedTypes = [
|
|
69
|
+
'application/pdf',
|
|
70
|
+
'application/msword',
|
|
71
|
+
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
|
72
|
+
'application/vnd.ms-excel',
|
|
73
|
+
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
|
74
|
+
'text/plain'
|
|
75
|
+
];
|
|
76
|
+
this.uploadError = null;
|
|
77
|
+
this.uploadedFile = null;
|
|
78
|
+
this.login = false;
|
|
79
|
+
this.cbpFinalObj = {};
|
|
80
|
+
this.selectedMinistryId = '';
|
|
81
|
+
this.chunks = [];
|
|
82
|
+
this.fullJson = '';
|
|
83
|
+
this.currentProcessingStage = '';
|
|
84
|
+
this.processingStages = [
|
|
85
|
+
'Initializing CBP Plan generation...',
|
|
86
|
+
'Analyzing departmental competency requirements...',
|
|
87
|
+
'Processing work order specifications and role definitions...',
|
|
88
|
+
'Generating detailed roles & resposibilities...',
|
|
89
|
+
'Generating detailed competencies...',
|
|
90
|
+
'Validating role mapping and finalizing the CBP Plan'
|
|
91
|
+
];
|
|
92
|
+
this.successRoleMapping = new EventEmitter();
|
|
93
|
+
this.alreadyAvailableRoleMapping = new EventEmitter();
|
|
94
|
+
this.loginSuccess = new EventEmitter();
|
|
95
|
+
this.selectedMinistryObj = '';
|
|
96
|
+
this.loginUserOrgIds = [];
|
|
97
|
+
this.panelOpen = false;
|
|
98
|
+
this.departmentPanelOpen = false;
|
|
99
|
+
this.filteredList = [];
|
|
100
|
+
this.filteredDepartmentList = [];
|
|
101
|
+
this.originalMinistryData = [];
|
|
102
|
+
this.apiLoading = false;
|
|
103
|
+
this.firstApiResponse = null;
|
|
104
|
+
this.documents = [];
|
|
105
|
+
this.disableUploadDocument = true;
|
|
106
|
+
this.disableUploadDocumentOriginal = true;
|
|
107
|
+
this.destroy$ = new Subject();
|
|
108
|
+
this.router.routeReuseStrategy.shouldReuseRoute = () => false;
|
|
109
|
+
this.dataSource = new MatTableDataSource([]);
|
|
110
|
+
this.isMaintenancePage = window.location.href.includes('/maintenance');
|
|
111
|
+
}
|
|
112
|
+
ngOnInit() {
|
|
113
|
+
this.login = this.sharedService.checkIfLogin();
|
|
114
|
+
this.cbpFinalObj = this.sharedService.getCBPPlanLocalStorage();
|
|
115
|
+
if (this.cbpFinalObj && this.cbpFinalObj?.ministry && this.cbpFinalObj?.ministry?.sbOrgType) {
|
|
116
|
+
this.editMinistryForm();
|
|
117
|
+
// this.getMinistryData()
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
if (this.login) {
|
|
121
|
+
this.getMinistryData();
|
|
122
|
+
}
|
|
123
|
+
this.roleMappingForm = this.fb.group({
|
|
124
|
+
ministryType: ['ministry', Validators.required],
|
|
125
|
+
ministry: [null, Validators.required],
|
|
126
|
+
sectors: [[]],
|
|
127
|
+
departments: [[]],
|
|
128
|
+
additionalDetails: [''],
|
|
129
|
+
additional_document: []
|
|
130
|
+
});
|
|
131
|
+
this.roleMappingForm.get('sectors')?.setValue([]);
|
|
132
|
+
this.roleMappingForm.get('ministryType')?.valueChanges.subscribe(type => {
|
|
133
|
+
this.roleMappingForm.reset({
|
|
134
|
+
ministryType: type,
|
|
135
|
+
ministry: null,
|
|
136
|
+
sectors: [],
|
|
137
|
+
departments: [],
|
|
138
|
+
additionalDetails: '',
|
|
139
|
+
additional_document: []
|
|
140
|
+
});
|
|
141
|
+
if (type === 'state') {
|
|
142
|
+
this.roleMappingForm.get('departments')?.setValidators([Validators.required]);
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
this.roleMappingForm.get('departments')?.clearValidators();
|
|
146
|
+
this.roleMappingForm.get('departments')?.setValue([]);
|
|
147
|
+
}
|
|
148
|
+
this.roleMappingForm.get('departments')?.updateValueAndValidity();
|
|
149
|
+
});
|
|
150
|
+
this.roleMappingForm.statusChanges.subscribe((status) => {
|
|
151
|
+
let hasUploadDocuments = false;
|
|
152
|
+
this.router.events.subscribe(() => {
|
|
153
|
+
hasUploadDocuments =
|
|
154
|
+
this.router.url.includes('/upload-documents');
|
|
155
|
+
});
|
|
156
|
+
if (!hasUploadDocuments) {
|
|
157
|
+
this.sharedService.checkRoleMappingFormValidation.next(status);
|
|
158
|
+
}
|
|
159
|
+
if (status === 'VALID') {
|
|
160
|
+
this.disableUploadDocument = false;
|
|
161
|
+
this.disableUploadDocumentOriginal = false;
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
this.disableUploadDocument = true;
|
|
165
|
+
this.disableUploadDocumentOriginal = true;
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
getUploadedDocuments() {
|
|
171
|
+
const formData = this.roleMappingForm.value;
|
|
172
|
+
this.apiLoading = true;
|
|
173
|
+
let reqBody = {
|
|
174
|
+
state_center_id: formData.ministry,
|
|
175
|
+
include_summary: true,
|
|
176
|
+
skip: 0,
|
|
177
|
+
limit: 200
|
|
178
|
+
};
|
|
179
|
+
if (formData?.departments) {
|
|
180
|
+
reqBody['department_id'] = formData?.departments;
|
|
181
|
+
}
|
|
182
|
+
this.apiLoading = true;
|
|
183
|
+
this.sharedService.getUploadedDocuments(reqBody).subscribe((res) => {
|
|
184
|
+
if (res && res?.items && res?.items?.length) {
|
|
185
|
+
this.apiLoading = false;
|
|
186
|
+
this.documents = res?.items;
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
this.documents = [];
|
|
190
|
+
this.apiLoading = false;
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
async editMinistryForm() {
|
|
195
|
+
if (this.cbpFinalObj?.ministry.sbOrgType === 'ministry') {
|
|
196
|
+
this.selectedMinistryType = this.cbpFinalObj?.ministry.sbOrgType;
|
|
197
|
+
await this.getMinistryData();
|
|
198
|
+
if (this.cbpFinalObj?.ministry?.sbOrgType) {
|
|
199
|
+
await this.sharedService.getCenterBasedDepartment(this.cbpFinalObj?.ministry?.identifier).subscribe((res) => {
|
|
200
|
+
if (res?.length) {
|
|
201
|
+
this.departmentData = res;
|
|
202
|
+
this.filteredDepartmentList = res;
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
this.snackBar.open('No Department Found for Selected Ministry', 'X', {
|
|
206
|
+
duration: 3000,
|
|
207
|
+
panelClass: ['snackbar-error']
|
|
208
|
+
});
|
|
209
|
+
this.sharedService.cbpPlanFinalObj['department_name'] = '';
|
|
210
|
+
this.sharedService.cbpPlanFinalObj['departments'] = '';
|
|
211
|
+
localStorage.setItem('cbpPlanFinalObj', JSON.stringify(this.sharedService.cbpPlanFinalObj));
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
this.roleMappingForm = this.fb.group({
|
|
216
|
+
ministryType: [this.selectedMinistryType, Validators.required],
|
|
217
|
+
ministry: [this.cbpFinalObj?.ministry?.identifier, Validators.required],
|
|
218
|
+
sectors: [[]],
|
|
219
|
+
departments: [this.cbpFinalObj?.departments],
|
|
220
|
+
additionalDetails: ['']
|
|
221
|
+
});
|
|
222
|
+
this.roleMappingForm.statusChanges.subscribe((status) => {
|
|
223
|
+
let hasUploadDocuments = false;
|
|
224
|
+
this.router.events.subscribe(() => {
|
|
225
|
+
hasUploadDocuments =
|
|
226
|
+
this.router.url.includes('/upload-documents');
|
|
227
|
+
});
|
|
228
|
+
if (!hasUploadDocuments) {
|
|
229
|
+
this.sharedService.checkRoleMappingFormValidation.next(status);
|
|
230
|
+
}
|
|
231
|
+
if (status === 'VALID') {
|
|
232
|
+
this.disableUploadDocument = false;
|
|
233
|
+
this.disableUploadDocumentOriginal = false;
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
this.disableUploadDocument = true;
|
|
237
|
+
this.disableUploadDocumentOriginal = true;
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
// this.roleMappingForm.get('sectors')?.setValue([]);
|
|
241
|
+
// this.roleMappingForm.get('ministryType')?.valueChanges.subscribe(type => {
|
|
242
|
+
// this.roleMappingForm.reset({
|
|
243
|
+
// ministryType: type, // Keep the changed value
|
|
244
|
+
// ministry: null,
|
|
245
|
+
// sectors: [],
|
|
246
|
+
// departments: [],
|
|
247
|
+
// additionalDetails: ''
|
|
248
|
+
// });
|
|
249
|
+
// if (type === 'state') {
|
|
250
|
+
// this.roleMappingForm.get('departments')?.setValidators([Validators.required]);
|
|
251
|
+
// } else {
|
|
252
|
+
// this.roleMappingForm.get('departments')?.clearValidators();
|
|
253
|
+
// this.roleMappingForm.get('departments')?.setValue([]);
|
|
254
|
+
// }
|
|
255
|
+
// this.roleMappingForm.get('departments')?.updateValueAndValidity();
|
|
256
|
+
// });
|
|
257
|
+
if (this.ministryData && this.ministryData.length) {
|
|
258
|
+
this.selectedMinistryId = this.cbpFinalObj?.ministry?.identifier;
|
|
259
|
+
}
|
|
260
|
+
//this.onGenerateRoleMapping()
|
|
261
|
+
}
|
|
262
|
+
else if (this.cbpFinalObj?.ministry?.sbOrgType === 'state') {
|
|
263
|
+
this.selectedMinistryType = this.cbpFinalObj?.ministry?.sbOrgType;
|
|
264
|
+
await this.getMinistryData();
|
|
265
|
+
await this.sharedService.getDepartmentList(this.cbpFinalObj?.ministry?.identifier).subscribe((res) => {
|
|
266
|
+
this.departmentData = res;
|
|
267
|
+
this.filteredDepartmentList = res;
|
|
268
|
+
console.log('this.filteredDepartmentList --', this.filteredDepartmentList);
|
|
269
|
+
});
|
|
270
|
+
if (this.ministryData && this.ministryData.length) {
|
|
271
|
+
this.selectedMinistryId = this.cbpFinalObj?.ministry?.identifier;
|
|
272
|
+
}
|
|
273
|
+
this.roleMappingForm = this.fb.group({
|
|
274
|
+
ministryType: [this.selectedMinistryType, Validators.required],
|
|
275
|
+
ministry: [this.cbpFinalObj?.ministry?.identifier, Validators.required],
|
|
276
|
+
sectors: [[]],
|
|
277
|
+
departments: [this.cbpFinalObj?.departments],
|
|
278
|
+
additionalDetails: [this.cbpFinalObj?.additionalDetails]
|
|
279
|
+
});
|
|
280
|
+
this.roleMappingForm.statusChanges.subscribe((status) => {
|
|
281
|
+
let hasUploadDocuments = false;
|
|
282
|
+
this.router.events.subscribe(() => {
|
|
283
|
+
hasUploadDocuments =
|
|
284
|
+
this.router.url.includes('/upload-documents');
|
|
285
|
+
});
|
|
286
|
+
if (!hasUploadDocuments) {
|
|
287
|
+
this.sharedService.checkRoleMappingFormValidation.next(status);
|
|
288
|
+
}
|
|
289
|
+
if (status === 'VALID') {
|
|
290
|
+
this.disableUploadDocument = false;
|
|
291
|
+
this.disableUploadDocumentOriginal = false;
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
this.disableUploadDocument = true;
|
|
295
|
+
this.disableUploadDocumentOriginal = true;
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
// this.roleMappingForm.get('sectors')?.setValue([]);
|
|
299
|
+
// this.roleMappingForm.get('ministryType')?.valueChanges.subscribe(type => {
|
|
300
|
+
// this.roleMappingForm.reset({
|
|
301
|
+
// ministryType: type, // Keep the changed value
|
|
302
|
+
// ministry: null,
|
|
303
|
+
// sectors: [],
|
|
304
|
+
// departments: [],
|
|
305
|
+
// additionalDetails: ''
|
|
306
|
+
// });
|
|
307
|
+
// if (type === 'state') {
|
|
308
|
+
// this.roleMappingForm.get('departments')?.setValidators([Validators.required]);
|
|
309
|
+
// } else {
|
|
310
|
+
// this.roleMappingForm.get('departments')?.clearValidators();
|
|
311
|
+
// this.roleMappingForm.get('departments')?.setValue([]);
|
|
312
|
+
// }
|
|
313
|
+
// this.roleMappingForm.get('departments')?.updateValueAndValidity();
|
|
314
|
+
// });
|
|
315
|
+
console.log('this.ministryData', this.ministryData);
|
|
316
|
+
if (this.ministryData && this.ministryData.length) {
|
|
317
|
+
this.selectedMinistryId = this.cbpFinalObj?.ministry?.identifier;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
this.originalFormValues = this.roleMappingForm.getRawValue();
|
|
321
|
+
this.getUploadedDocuments();
|
|
322
|
+
}
|
|
323
|
+
ngOnChanges() {
|
|
324
|
+
this.login = this.loginStatusFlag;
|
|
325
|
+
}
|
|
326
|
+
getChangedFields(original, current) {
|
|
327
|
+
const changedKeys = [];
|
|
328
|
+
for (const key in original) {
|
|
329
|
+
if (!original.hasOwnProperty(key))
|
|
330
|
+
continue;
|
|
331
|
+
const originalValue = original[key];
|
|
332
|
+
const currentValue = current[key];
|
|
333
|
+
// For arrays and objects, use JSON.stringify (or lodash isEqual for deep comparison)
|
|
334
|
+
const isEqual = typeof originalValue === 'object'
|
|
335
|
+
? JSON.stringify(originalValue) === JSON.stringify(currentValue)
|
|
336
|
+
: originalValue === currentValue;
|
|
337
|
+
if (!isEqual) {
|
|
338
|
+
changedKeys.push(key);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
return changedKeys;
|
|
342
|
+
}
|
|
343
|
+
onGenerateRoleMapping() {
|
|
344
|
+
const currentFormValues = this.roleMappingForm.getRawValue();
|
|
345
|
+
const formData = new FormData();
|
|
346
|
+
formData.append('ministryType', currentFormValues.ministryType);
|
|
347
|
+
formData.append('ministry', currentFormValues.ministry);
|
|
348
|
+
formData.append('sectors', JSON.stringify(currentFormValues.sectors));
|
|
349
|
+
formData.append('departments', JSON.stringify(currentFormValues.departments));
|
|
350
|
+
formData.append('additionalDetails', currentFormValues.additionalDetails || '');
|
|
351
|
+
const file = this.uploadedFile || this.roleMappingForm.get('additional_document')?.value;
|
|
352
|
+
console.log('file', file);
|
|
353
|
+
if (file) {
|
|
354
|
+
formData.append('additional_document', file);
|
|
355
|
+
}
|
|
356
|
+
this.sharedService.cbpPlanFinalObj['departments'] = currentFormValues?.departments;
|
|
357
|
+
const departmentName = this.departmentData.find(u => u.identifier === currentFormValues.departments);
|
|
358
|
+
this.sharedService.cbpPlanFinalObj['department_name'] = departmentName?.orgName;
|
|
359
|
+
const selectedMinistry = this.ministryData.find(item => item.identifier === currentFormValues.ministry);
|
|
360
|
+
this.selectedMinistryObj = selectedMinistry;
|
|
361
|
+
this.sharedService.cbpPlanFinalObj['ministry'] = selectedMinistry;
|
|
362
|
+
localStorage.setItem('cbpPlanFinalObj', JSON.stringify(this.sharedService.cbpPlanFinalObj));
|
|
363
|
+
console.log('this.roleMappingForm', this.roleMappingForm);
|
|
364
|
+
console.log('formData--', formData);
|
|
365
|
+
for (const pair of formData.entries()) {
|
|
366
|
+
console.log(`${pair[0]}:`, pair[1]);
|
|
367
|
+
}
|
|
368
|
+
const changedFields = this.getChangedFields(this.originalFormValues, currentFormValues);
|
|
369
|
+
if (changedFields.length > 0 || (file && file.size > 0)) {
|
|
370
|
+
console.log('changedFields', changedFields);
|
|
371
|
+
console.log('Changed fields:', changedFields);
|
|
372
|
+
if (changedFields.includes('additionalDetails') && this.roleMappingForm.value.additionalDetails?.trim() || (file && file.size > 0)) {
|
|
373
|
+
const dialogRef = this.dialog.open(DeleteRoleMappingPopupComponent, {
|
|
374
|
+
width: '400px',
|
|
375
|
+
data: '',
|
|
376
|
+
panelClass: 'view-cbp-plan-popup',
|
|
377
|
+
minHeight: '300px',
|
|
378
|
+
maxHeight: '80vh',
|
|
379
|
+
disableClose: true // Optional: prevent closing with outside click
|
|
380
|
+
});
|
|
381
|
+
dialogRef.afterClosed().subscribe(result => {
|
|
382
|
+
alert(result);
|
|
383
|
+
if (result === 'saved') {
|
|
384
|
+
console.log('Changes saved!');
|
|
385
|
+
this.loading = true;
|
|
386
|
+
this.sharedService.deleteRoleMappingByStateAndDepartment(this.roleMappingForm.value.ministry, this.roleMappingForm.value.departments).subscribe({
|
|
387
|
+
next: (res) => {
|
|
388
|
+
// Success handling
|
|
389
|
+
console.log('Success:', res);
|
|
390
|
+
this.loading = false;
|
|
391
|
+
this.firstApiResponse = [];
|
|
392
|
+
this.generateFinalRoleMapping();
|
|
393
|
+
},
|
|
394
|
+
error: (error) => {
|
|
395
|
+
this.firstApiResponse = [];
|
|
396
|
+
this.snackBar.open(error?.error?.detail, 'X', {
|
|
397
|
+
duration: 3000,
|
|
398
|
+
panelClass: ['snackbar-error']
|
|
399
|
+
});
|
|
400
|
+
this.loading = false;
|
|
401
|
+
// this.generateFinalRoleMapping()
|
|
402
|
+
}
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
else {
|
|
406
|
+
this.generateFinalRoleMapping();
|
|
407
|
+
}
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
else {
|
|
411
|
+
this.generateFinalRoleMapping();
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
else {
|
|
415
|
+
this.generateFinalRoleMapping();
|
|
416
|
+
console.log('No changes detected.');
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
getMinistryData() {
|
|
420
|
+
this.apiLoading = true;
|
|
421
|
+
this.sharedService.getMinistryData(this.selectedMinistryType).subscribe((data) => {
|
|
422
|
+
console.log('data--', data);
|
|
423
|
+
this.ministryFullData = data;
|
|
424
|
+
this.apiLoading = false;
|
|
425
|
+
this.ministryData = [];
|
|
426
|
+
if (this.selectedMinistryType === 'ministry') {
|
|
427
|
+
data.forEach((item) => {
|
|
428
|
+
if (item?.sbOrgType === 'ministry') {
|
|
429
|
+
this.ministryData.push(item);
|
|
430
|
+
}
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
else if (this.selectedMinistryType === 'state') {
|
|
434
|
+
data.forEach((item) => {
|
|
435
|
+
if (item?.sbOrgType === 'state') {
|
|
436
|
+
this.ministryData.push(item);
|
|
437
|
+
}
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
this.getUserProfileData();
|
|
441
|
+
});
|
|
442
|
+
}
|
|
443
|
+
async onMinistryTypeChange(event) {
|
|
444
|
+
console.log('event', event);
|
|
445
|
+
if (this.login) {
|
|
446
|
+
await this.getMinistryData();
|
|
447
|
+
}
|
|
448
|
+
this.sharedService.cbpPlanFinalObj['ministryType'] = event.value;
|
|
449
|
+
this.sharedService.cbpPlanFinalObj['role_mapping_generation'] = [];
|
|
450
|
+
this.selectedMinistryType = event.value;
|
|
451
|
+
localStorage.setItem('cbpPlanFinalObj', JSON.stringify(this.sharedService.cbpPlanFinalObj));
|
|
452
|
+
this.ministryData = [];
|
|
453
|
+
if (event?.value === 'state') {
|
|
454
|
+
this.roleMappingForm.get('ministry')?.setValue(null);
|
|
455
|
+
this.roleMappingForm.get('sectors')?.setValue([]);
|
|
456
|
+
this.roleMappingForm.get('departments')?.setValue([]);
|
|
457
|
+
this.ministryFullData.forEach((item) => {
|
|
458
|
+
if (item?.type === 'state') {
|
|
459
|
+
this.ministryData.push(item);
|
|
460
|
+
}
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
else if (event?.value === 'ministry') {
|
|
464
|
+
this.roleMappingForm.get('ministry')?.setValue(null);
|
|
465
|
+
this.roleMappingForm.get('sectors')?.setValue([]);
|
|
466
|
+
this.roleMappingForm.get('departments')?.setValue([]);
|
|
467
|
+
this.ministryFullData.forEach((item) => {
|
|
468
|
+
if (item?.type === 'central') {
|
|
469
|
+
this.ministryData.push(item);
|
|
470
|
+
}
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
this.sharedService.cbpPlanFinalObj['ministry'] = '';
|
|
474
|
+
this.sharedService.cbpPlanFinalObj['department_name'] = '';
|
|
475
|
+
this.sharedService.cbpPlanFinalObj['departments'] = '';
|
|
476
|
+
localStorage.setItem('cbpPlanFinalObj', JSON.stringify(this.sharedService.cbpPlanFinalObj));
|
|
477
|
+
// this.roleMappingForm.reset()
|
|
478
|
+
if (!this.sharedService.cbpPlanFinalObj?.ministry) {
|
|
479
|
+
this.roleMappingForm.setErrors({ invalid: true });
|
|
480
|
+
setTimeout(() => {
|
|
481
|
+
this.roleMappingForm.updateValueAndValidity();
|
|
482
|
+
this.disableUploadDocument = true;
|
|
483
|
+
this.disableUploadDocumentOriginal = true;
|
|
484
|
+
}, 5000);
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
onMinistryChange(event) {
|
|
488
|
+
const selectedMinistryId = event.value;
|
|
489
|
+
console.log('Selected Ministry ID:', selectedMinistryId);
|
|
490
|
+
this.departmentData = [];
|
|
491
|
+
// You can access the selected object if needed
|
|
492
|
+
const selectedMinistry = this.ministryData.find(item => item.identifier === selectedMinistryId);
|
|
493
|
+
this.selectedMinistryObj = selectedMinistry;
|
|
494
|
+
console.log('Selected Ministry:', selectedMinistry);
|
|
495
|
+
``;
|
|
496
|
+
this.sharedService.cbpPlanFinalObj['ministry'] = selectedMinistry;
|
|
497
|
+
this.sharedService.cbpPlanFinalObj['role_mapping_generation'] = [];
|
|
498
|
+
localStorage.setItem('cbpPlanFinalObj', JSON.stringify(this.sharedService.cbpPlanFinalObj));
|
|
499
|
+
if (selectedMinistryId && this.selectedMinistryType === 'state') {
|
|
500
|
+
this.sharedService.getDepartmentList(selectedMinistryId).subscribe((res) => {
|
|
501
|
+
this.departmentData = res;
|
|
502
|
+
this.filteredDepartmentList = res;
|
|
503
|
+
});
|
|
504
|
+
}
|
|
505
|
+
if (selectedMinistryId && this.selectedMinistryType === 'ministry') {
|
|
506
|
+
this.sharedService.getCenterBasedDepartment(selectedMinistryId).subscribe((res) => {
|
|
507
|
+
if (res?.length) {
|
|
508
|
+
this.departmentData = res;
|
|
509
|
+
this.filteredDepartmentList = res;
|
|
510
|
+
}
|
|
511
|
+
else {
|
|
512
|
+
this.snackBar.open('No Department Found for Selected Ministry', 'X', {
|
|
513
|
+
duration: 3000,
|
|
514
|
+
panelClass: ['snackbar-error']
|
|
515
|
+
});
|
|
516
|
+
this.sharedService.cbpPlanFinalObj['department_name'] = '';
|
|
517
|
+
this.sharedService.cbpPlanFinalObj['departments'] = '';
|
|
518
|
+
localStorage.setItem('cbpPlanFinalObj', JSON.stringify(this.sharedService.cbpPlanFinalObj));
|
|
519
|
+
}
|
|
520
|
+
});
|
|
521
|
+
}
|
|
522
|
+
this.getUploadedDocuments();
|
|
523
|
+
}
|
|
524
|
+
searchData() {
|
|
525
|
+
}
|
|
526
|
+
applyFilter() {
|
|
527
|
+
}
|
|
528
|
+
downloadPDF() {
|
|
529
|
+
const element = this.pdfContent.nativeElement;
|
|
530
|
+
const options = {
|
|
531
|
+
margin: 0.5,
|
|
532
|
+
filename: 'CBP_Plan.pdf',
|
|
533
|
+
image: { type: 'jpeg', quality: 0.98 },
|
|
534
|
+
html2canvas: {
|
|
535
|
+
scale: 2,
|
|
536
|
+
useCORS: true, // Important for external images/icons
|
|
537
|
+
},
|
|
538
|
+
jsPDF: {
|
|
539
|
+
unit: 'in',
|
|
540
|
+
format: 'a4',
|
|
541
|
+
orientation: 'portrait'
|
|
542
|
+
}
|
|
543
|
+
};
|
|
544
|
+
html2pdf().from(element).set(options).save();
|
|
545
|
+
}
|
|
546
|
+
onFileChange(event) {
|
|
547
|
+
const files = event.target.files;
|
|
548
|
+
const maxFiles = 3;
|
|
549
|
+
const control = this.roleMappingForm.get('additional_document');
|
|
550
|
+
// Always clear control first (prevents old valid value)
|
|
551
|
+
control?.reset();
|
|
552
|
+
control?.setErrors(null);
|
|
553
|
+
this.uploadedFile = [];
|
|
554
|
+
this.uploadError = null;
|
|
555
|
+
if (!files || files.length === 0)
|
|
556
|
+
return;
|
|
557
|
+
// Limit check
|
|
558
|
+
if (files.length > maxFiles) {
|
|
559
|
+
this.uploadError = `You can upload a maximum of ${maxFiles} files`;
|
|
560
|
+
control?.setErrors({ maxFiles: true });
|
|
561
|
+
control?.markAsDirty();
|
|
562
|
+
control?.markAsTouched();
|
|
563
|
+
control?.updateValueAndValidity();
|
|
564
|
+
return;
|
|
565
|
+
}
|
|
566
|
+
const validFiles = [];
|
|
567
|
+
const invalidFiles = [];
|
|
568
|
+
const maxBytes = this.maxFileSizeMB * 1024 * 1024;
|
|
569
|
+
for (let i = 0; i < files.length; i++) {
|
|
570
|
+
const file = files[i];
|
|
571
|
+
// Size check
|
|
572
|
+
if (file.size > maxBytes) {
|
|
573
|
+
invalidFiles.push(`${file.name} (exceeds ${this.maxFileSizeMB}MB)`);
|
|
574
|
+
continue;
|
|
575
|
+
}
|
|
576
|
+
// Type check
|
|
577
|
+
if (!this.allowedTypes.includes(file.type)) {
|
|
578
|
+
invalidFiles.push(`${file.name} (invalid type)`);
|
|
579
|
+
continue;
|
|
580
|
+
}
|
|
581
|
+
validFiles.push(file);
|
|
582
|
+
}
|
|
583
|
+
// ❌ NO valid files → form MUST BE invalid
|
|
584
|
+
if (validFiles.length === 0) {
|
|
585
|
+
this.uploadError = `Invalid file(s): ${invalidFiles.join(', ')}`;
|
|
586
|
+
control?.setValue(null);
|
|
587
|
+
control?.setErrors({ invalidFiles: true });
|
|
588
|
+
control?.markAsDirty();
|
|
589
|
+
control?.markAsTouched();
|
|
590
|
+
control?.updateValueAndValidity({ onlySelf: true, emitEvent: true });
|
|
591
|
+
this.roleMappingForm.setErrors({ invalid: true });
|
|
592
|
+
this.roleMappingForm.markAllAsTouched();
|
|
593
|
+
setTimeout(() => {
|
|
594
|
+
this.roleMappingForm.updateValueAndValidity();
|
|
595
|
+
}, 5000);
|
|
596
|
+
return;
|
|
597
|
+
}
|
|
598
|
+
// ✔ At least ONE valid file → form should be VALID
|
|
599
|
+
this.uploadedFile = validFiles;
|
|
600
|
+
if (invalidFiles.length > 0) {
|
|
601
|
+
this.uploadError = `Some files were skipped: ${invalidFiles.join(', ')}`;
|
|
602
|
+
}
|
|
603
|
+
control?.setValue(validFiles);
|
|
604
|
+
control?.setErrors(null);
|
|
605
|
+
control?.markAsDirty();
|
|
606
|
+
control?.markAsTouched();
|
|
607
|
+
control?.updateValueAndValidity({ onlySelf: true, emitEvent: true });
|
|
608
|
+
}
|
|
609
|
+
loginStatus(event) {
|
|
610
|
+
if (event) {
|
|
611
|
+
this.login = true;
|
|
612
|
+
this.loginSuccess.emit(true);
|
|
613
|
+
this.selectedMinistryType = 'ministry';
|
|
614
|
+
this.getMinistryData();
|
|
615
|
+
}
|
|
616
|
+
else {
|
|
617
|
+
this.login = false;
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
generateFinalRoleMapping() {
|
|
621
|
+
this.apiLoading = true;
|
|
622
|
+
if (!this.roleMappingForm.valid) {
|
|
623
|
+
this.roleMappingForm.markAllAsTouched();
|
|
624
|
+
return;
|
|
625
|
+
}
|
|
626
|
+
const currentFormValues = this.roleMappingForm.getRawValue();
|
|
627
|
+
let formUploadData = new FormData();
|
|
628
|
+
// Ministry selection
|
|
629
|
+
const selectedMinistry = this.ministryData.find(item => item.identifier === currentFormValues.ministry);
|
|
630
|
+
this.selectedMinistryObj = selectedMinistry;
|
|
631
|
+
// Append base fields
|
|
632
|
+
formUploadData.append('state_center_id', currentFormValues.ministry || '');
|
|
633
|
+
formUploadData.append('state_center_name', selectedMinistry?.orgName || '');
|
|
634
|
+
if (currentFormValues.departments) {
|
|
635
|
+
formUploadData.append('department_id', currentFormValues.departments);
|
|
636
|
+
}
|
|
637
|
+
if (currentFormValues.additionalDetails) {
|
|
638
|
+
formUploadData.append('instruction', currentFormValues.additionalDetails);
|
|
639
|
+
}
|
|
640
|
+
// Get uploaded file(s)
|
|
641
|
+
const files = this.uploadedFile || this.roleMappingForm.get('additional_document')?.value;
|
|
642
|
+
console.log('Files selected:', files);
|
|
643
|
+
// Append single or multiple files
|
|
644
|
+
if (files) {
|
|
645
|
+
if (Array.isArray(files)) {
|
|
646
|
+
files.forEach((file) => {
|
|
647
|
+
formUploadData.append('additional_document', file, file.name);
|
|
648
|
+
});
|
|
649
|
+
}
|
|
650
|
+
else {
|
|
651
|
+
formUploadData.append('additional_document', files, files.name);
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
// Debug: print FormData
|
|
655
|
+
console.log("FormData Debug:");
|
|
656
|
+
formUploadData.forEach((value, key) => {
|
|
657
|
+
if (value instanceof File) {
|
|
658
|
+
console.log(`${key}: FILE -> ${value.name} (${value.size} bytes)`);
|
|
659
|
+
}
|
|
660
|
+
else {
|
|
661
|
+
console.log(`${key}: ${value}`);
|
|
662
|
+
}
|
|
663
|
+
});
|
|
664
|
+
// Build request body for polling API
|
|
665
|
+
let req = {
|
|
666
|
+
state_center_id: currentFormValues.ministry,
|
|
667
|
+
instruction: currentFormValues.additionalDetails,
|
|
668
|
+
state_center_name: selectedMinistry?.orgName
|
|
669
|
+
};
|
|
670
|
+
if (this.selectedMinistryType === 'state' || currentFormValues.departments) {
|
|
671
|
+
const departmentName = this.departmentData.find(d => d.identifier === currentFormValues.departments);
|
|
672
|
+
req.department_id = currentFormValues.departments || '';
|
|
673
|
+
req.department_name = departmentName?.orgName || '';
|
|
674
|
+
}
|
|
675
|
+
// Polling API
|
|
676
|
+
concat(of(null), // 🔥 immediate first emission
|
|
677
|
+
interval(5000) // ⏱ subsequent polling every 5s
|
|
678
|
+
)
|
|
679
|
+
.pipe(takeUntil(this.destroy$), switchMap(() => this.sharedService.generateRoleMapping(req, files)), tap(data => {
|
|
680
|
+
if (!this.firstApiResponse) {
|
|
681
|
+
this.firstApiResponse = data; // 👈 store first response
|
|
682
|
+
console.log('First API response:', this.firstApiResponse);
|
|
683
|
+
}
|
|
684
|
+
else {
|
|
685
|
+
this.loading = true;
|
|
686
|
+
}
|
|
687
|
+
}), takeWhile((data) => data?.status !== 'COMPLETED', true))
|
|
688
|
+
.subscribe(data => {
|
|
689
|
+
console.log('role mapping data--', data);
|
|
690
|
+
if (this.firstApiResponse?.is_existing) {
|
|
691
|
+
this.apiLoading = false;
|
|
692
|
+
this.destroy$.next(); // 🛑 stop polling
|
|
693
|
+
this.destroy$.complete();
|
|
694
|
+
const dialogRef = this.dialog.open(DeleteRoleMappingPopupComponent, {
|
|
695
|
+
width: '400px',
|
|
696
|
+
data: '',
|
|
697
|
+
panelClass: 'view-cbp-plan-popup',
|
|
698
|
+
minHeight: '300px',
|
|
699
|
+
maxHeight: '80vh',
|
|
700
|
+
disableClose: true // Optional: prevent closing with outside click
|
|
701
|
+
});
|
|
702
|
+
dialogRef.afterClosed().subscribe(result => {
|
|
703
|
+
if (result === 'saved') {
|
|
704
|
+
console.log('Changes saved!');
|
|
705
|
+
this.loading = true;
|
|
706
|
+
this.sharedService.deleteRoleMappingByStateAndDepartment(this.roleMappingForm.value.ministry, this.roleMappingForm.value.departments).subscribe({
|
|
707
|
+
next: (res) => {
|
|
708
|
+
// Success handling
|
|
709
|
+
console.log('Success:', res);
|
|
710
|
+
this.loading = false;
|
|
711
|
+
this.firstApiResponse = [];
|
|
712
|
+
this.generateFinalRoleMapping();
|
|
713
|
+
},
|
|
714
|
+
error: (error) => {
|
|
715
|
+
this.snackBar.open(error?.error?.detail, 'X', {
|
|
716
|
+
duration: 3000,
|
|
717
|
+
panelClass: ['snackbar-error']
|
|
718
|
+
});
|
|
719
|
+
this.firstApiResponse = [];
|
|
720
|
+
this.loading = false;
|
|
721
|
+
// this.generateFinalRoleMapping()
|
|
722
|
+
}
|
|
723
|
+
});
|
|
724
|
+
}
|
|
725
|
+
else if (result === 'button') {
|
|
726
|
+
this.loading = false;
|
|
727
|
+
// this.generateFinalRoleMapping()
|
|
728
|
+
// this.router.navigate(['/']);
|
|
729
|
+
const currentUrl = this.router.url;
|
|
730
|
+
// this.router.navigateByUrl('/', { skipLocationChange: true }).then(() => {
|
|
731
|
+
// this.router.navigateByUrl(currentUrl);
|
|
732
|
+
// });
|
|
733
|
+
this.sharedService.cbpPlanFinalObj['role_mapping_generation'] =
|
|
734
|
+
data?.role_mappings;
|
|
735
|
+
localStorage.setItem('cbpPlanFinalObj', JSON.stringify(this.sharedService.cbpPlanFinalObj));
|
|
736
|
+
this.successRoleMapping.emit(this.roleMappingForm);
|
|
737
|
+
this.router.navigate(['/ai/list'], {
|
|
738
|
+
onSameUrlNavigation: 'reload'
|
|
739
|
+
});
|
|
740
|
+
// window.location.reload()
|
|
741
|
+
}
|
|
742
|
+
else {
|
|
743
|
+
this.loading = false;
|
|
744
|
+
}
|
|
745
|
+
});
|
|
746
|
+
}
|
|
747
|
+
else if (data?.status === 'COMPLETED') {
|
|
748
|
+
this.loading = false;
|
|
749
|
+
this.sharedService.cbpPlanFinalObj['role_mapping_generation'] =
|
|
750
|
+
data?.role_mappings;
|
|
751
|
+
localStorage.setItem('cbpPlanFinalObj', JSON.stringify(this.sharedService.cbpPlanFinalObj));
|
|
752
|
+
this.successRoleMapping.emit(this.roleMappingForm);
|
|
753
|
+
this.snackBar.open('CBP Plan generated successfully!', 'X', {
|
|
754
|
+
duration: 3000,
|
|
755
|
+
panelClass: ['snackbar-success']
|
|
756
|
+
});
|
|
757
|
+
this.router.navigate(['/ai/']);
|
|
758
|
+
}
|
|
759
|
+
});
|
|
760
|
+
}
|
|
761
|
+
generateFinalRoleMappingWithStream() {
|
|
762
|
+
this.loading = true;
|
|
763
|
+
console.log('roleMappingForm', this.roleMappingForm);
|
|
764
|
+
if (this.roleMappingForm.valid) {
|
|
765
|
+
const formData = this.roleMappingForm.value;
|
|
766
|
+
const currentFormValues = this.roleMappingForm.getRawValue();
|
|
767
|
+
let formUploadData = new FormData();
|
|
768
|
+
// formUploadData.append('ministryType', currentFormValues.ministryType);
|
|
769
|
+
// formUploadData.append('ministry', currentFormValues.ministry);
|
|
770
|
+
// formUploadData.append('sectors', JSON.stringify(currentFormValues.sectors));
|
|
771
|
+
// formUploadData.append('departments', JSON.stringify(currentFormValues.departments));
|
|
772
|
+
formUploadData.append('state_center_id', currentFormValues.ministry || '');
|
|
773
|
+
formUploadData.append('state_center_name', currentFormValues.ministry || '');
|
|
774
|
+
if (currentFormValues.departments) {
|
|
775
|
+
formUploadData.append('department_id', currentFormValues.departments || '');
|
|
776
|
+
}
|
|
777
|
+
if (currentFormValues.additionalDetails) {
|
|
778
|
+
formUploadData.append('instruction', currentFormValues.additionalDetails || '');
|
|
779
|
+
}
|
|
780
|
+
const file = this.uploadedFile || this.roleMappingForm.get('additional_document')?.value;
|
|
781
|
+
console.log('file', file);
|
|
782
|
+
if (file) {
|
|
783
|
+
formUploadData.append('additional_document', file);
|
|
784
|
+
}
|
|
785
|
+
console.log('this.roleMappingForm', this.roleMappingForm);
|
|
786
|
+
console.log('formUploadData--', formUploadData);
|
|
787
|
+
for (const pair of formUploadData.entries()) {
|
|
788
|
+
console.log(`${pair[0]}:`, pair[1]);
|
|
789
|
+
}
|
|
790
|
+
console.log('Form submitted:', formData);
|
|
791
|
+
let sectors = Array.isArray(formData.sectors) ? formData.sectors.join(', ') : '';
|
|
792
|
+
this.sharedService.cbpPlanFinalObj['sectors'] = formData.sectors;
|
|
793
|
+
// Submit logic here
|
|
794
|
+
let req = {
|
|
795
|
+
"state_center_id": formData.ministry,
|
|
796
|
+
"instruction": formData.additionalDetails
|
|
797
|
+
};
|
|
798
|
+
if (this.selectedMinistryType === 'state' || formData.departments) {
|
|
799
|
+
req['department_id'] = formData.departments ? formData.departments : '';
|
|
800
|
+
this.sharedService.cbpPlanFinalObj['departments'] = formData.departments ? formData.departments : '';
|
|
801
|
+
const departmentName = this.departmentData.find(u => u.identifier === formData.departments);
|
|
802
|
+
this.sharedService.cbpPlanFinalObj['department_name'] = departmentName;
|
|
803
|
+
this.sharedService.cbpPlanFinalObj['additionalDetails'] = formData.additionalDetails;
|
|
804
|
+
console.log(departmentName);
|
|
805
|
+
}
|
|
806
|
+
this.sharedService.cbpPlanFinalObj['ministryType'] = this.selectedMinistryType;
|
|
807
|
+
if (req) {
|
|
808
|
+
this.chunks = [];
|
|
809
|
+
this.fullJson = '';
|
|
810
|
+
this.parsedData = null;
|
|
811
|
+
this.currentProcessingStage = this.processingStages[0];
|
|
812
|
+
this.roleMappingService.generateRoleMapping(req, this.uploadedFile || null, (chunk) => {
|
|
813
|
+
this.chunks.push(chunk);
|
|
814
|
+
console.log('Received chunk:', chunk, 'Total chunks:', this.chunks.length);
|
|
815
|
+
// Update processing stage based on chunk count
|
|
816
|
+
this.updateProcessingStage();
|
|
817
|
+
// Trigger change detection to update the UI
|
|
818
|
+
setTimeout(() => { }, 0);
|
|
819
|
+
}, () => {
|
|
820
|
+
console.log('Stream started');
|
|
821
|
+
this.currentProcessingStage = this.processingStages[0];
|
|
822
|
+
}, () => this.onStreamEnd(), (err) => {
|
|
823
|
+
console.error('Stream failed:', err);
|
|
824
|
+
this.handleStreamError(err);
|
|
825
|
+
});
|
|
826
|
+
}
|
|
827
|
+
localStorage.setItem('cbpPlanFinalObj', JSON.stringify(this.sharedService.cbpPlanFinalObj));
|
|
828
|
+
}
|
|
829
|
+
else {
|
|
830
|
+
this.roleMappingForm.markAllAsTouched();
|
|
831
|
+
}
|
|
832
|
+
}
|
|
833
|
+
updateProcessingStage() {
|
|
834
|
+
const chunkCount = this.chunks.length;
|
|
835
|
+
let stageIndex = 0;
|
|
836
|
+
// Much slower stage progression - stages stay much longer
|
|
837
|
+
if (chunkCount <= 8) {
|
|
838
|
+
stageIndex = 0; // Initializing - stays for first 8 chunks
|
|
839
|
+
}
|
|
840
|
+
else if (chunkCount <= 20) {
|
|
841
|
+
stageIndex = 1; // Analyzing competency requirements - 12 chunks
|
|
842
|
+
}
|
|
843
|
+
else if (chunkCount <= 35) {
|
|
844
|
+
stageIndex = 2; // Processing work order - 15 chunks
|
|
845
|
+
}
|
|
846
|
+
else if (chunkCount <= 55) {
|
|
847
|
+
stageIndex = 3; // Generating role mappings - 20 chunks
|
|
848
|
+
}
|
|
849
|
+
else if (chunkCount <= 75) {
|
|
850
|
+
stageIndex = 4; // Computing final recommendations - 20 chunks
|
|
851
|
+
}
|
|
852
|
+
else {
|
|
853
|
+
stageIndex = 5; // Finalizing CBP Plan - 75+ chunks
|
|
854
|
+
}
|
|
855
|
+
this.currentProcessingStage = this.processingStages[stageIndex];
|
|
856
|
+
}
|
|
857
|
+
getProgressPercentage() {
|
|
858
|
+
const chunkCount = this.chunks.length;
|
|
859
|
+
if (chunkCount === 0)
|
|
860
|
+
return 0;
|
|
861
|
+
// Much slower and smoother progress calculation
|
|
862
|
+
let percentage = 0;
|
|
863
|
+
if (chunkCount <= 15) {
|
|
864
|
+
// First 15 chunks = 0-25% (very slow start)
|
|
865
|
+
percentage = (chunkCount / 15) * 25;
|
|
866
|
+
}
|
|
867
|
+
else if (chunkCount <= 35) {
|
|
868
|
+
// Next 20 chunks = 25-50% (slow early progress)
|
|
869
|
+
percentage = 25 + ((chunkCount - 15) / 20) * 25;
|
|
870
|
+
}
|
|
871
|
+
else if (chunkCount <= 60) {
|
|
872
|
+
// Next 25 chunks = 50-75% (steady middle progress)
|
|
873
|
+
percentage = 50 + ((chunkCount - 35) / 25) * 25;
|
|
874
|
+
}
|
|
875
|
+
else if (chunkCount <= 100) {
|
|
876
|
+
// Next 40 chunks = 75-90% (slower final approach)
|
|
877
|
+
percentage = 75 + ((chunkCount - 60) / 40) * 15;
|
|
878
|
+
}
|
|
879
|
+
else {
|
|
880
|
+
// Beyond 100 chunks = 90-95% (very slow final progression)
|
|
881
|
+
percentage = 90 + Math.min(((chunkCount - 100) / 50) * 5, 5);
|
|
882
|
+
}
|
|
883
|
+
return Math.round(percentage);
|
|
884
|
+
}
|
|
885
|
+
onStreamEnd() {
|
|
886
|
+
this.currentProcessingStage = 'Completing CBP Plan generation...';
|
|
887
|
+
// Show 100% completion briefly before finishing
|
|
888
|
+
setTimeout(() => {
|
|
889
|
+
this.fullJson = this.chunks.join('');
|
|
890
|
+
const cleaned = this.fullJson.replace(/^```json\n/, '').replace(/```$/, '');
|
|
891
|
+
try {
|
|
892
|
+
this.parsedData = JSON.parse(cleaned);
|
|
893
|
+
console.log('Parsed data:', this.parsedData);
|
|
894
|
+
// Handle successful completion
|
|
895
|
+
this.loading = false;
|
|
896
|
+
this.sharedService.cbpPlanFinalObj['role_mapping_generation'] = this.parsedData;
|
|
897
|
+
this.successRoleMapping.emit(this.roleMappingForm);
|
|
898
|
+
this.snackBar.open('CBP Plan generated successfully!', 'X', {
|
|
899
|
+
duration: 3000,
|
|
900
|
+
panelClass: ['snackbar-success']
|
|
901
|
+
});
|
|
902
|
+
}
|
|
903
|
+
catch (e) {
|
|
904
|
+
console.error('JSON parse error:', e);
|
|
905
|
+
this.loading = false;
|
|
906
|
+
this.snackBar.open('Failed to generate CBP Plan. Please try again.', 'X', {
|
|
907
|
+
duration: 3000,
|
|
908
|
+
panelClass: ['snackbar-error']
|
|
909
|
+
});
|
|
910
|
+
}
|
|
911
|
+
}, 500);
|
|
912
|
+
}
|
|
913
|
+
// Helper method to get progress percentage including completion state
|
|
914
|
+
getDisplayProgressPercentage() {
|
|
915
|
+
if (this.currentProcessingStage === 'Completing CBP Plan generation...') {
|
|
916
|
+
return 100;
|
|
917
|
+
}
|
|
918
|
+
return this.getProgressPercentage();
|
|
919
|
+
}
|
|
920
|
+
// Handle streaming errors, especially "Role mapping already exists"
|
|
921
|
+
handleStreamError(err) {
|
|
922
|
+
console.log('Error details:', err);
|
|
923
|
+
// Check if this is the "Role mapping already exists" error
|
|
924
|
+
if (err?.isExistingRoleMapping || (err?.detail && err.detail.includes('Role mapping already exists'))) {
|
|
925
|
+
this.currentProcessingStage = 'Loading existing role mapping...';
|
|
926
|
+
// Call the appropriate Get role mapping API based on ministry type
|
|
927
|
+
const formData = this.roleMappingForm.value;
|
|
928
|
+
const stateCenter = formData.ministry;
|
|
929
|
+
const departmentId = formData.departments;
|
|
930
|
+
if (this.selectedMinistryType === 'state' && departmentId) {
|
|
931
|
+
// Call Get role mapping by state center and department
|
|
932
|
+
this.sharedService.getRoleMappingByStateCenterAndDepartment(stateCenter, departmentId).subscribe({
|
|
933
|
+
next: (res) => {
|
|
934
|
+
console.log('Existing role mapping loaded:', res);
|
|
935
|
+
this.loading = false;
|
|
936
|
+
this.sharedService.cbpPlanFinalObj['role_mapping_generation'] = res;
|
|
937
|
+
this.snackBar.open('Existing role mapping loaded successfully!', 'X', {
|
|
938
|
+
duration: 3000,
|
|
939
|
+
panelClass: ['snackbar-success']
|
|
940
|
+
});
|
|
941
|
+
this.alreadyAvailableRoleMapping.emit(this.roleMappingForm);
|
|
942
|
+
},
|
|
943
|
+
error: (error) => {
|
|
944
|
+
console.error('Failed to load existing role mapping:', error);
|
|
945
|
+
this.loading = false;
|
|
946
|
+
this.snackBar.open('Failed to load existing role mapping. Please try again.', 'X', {
|
|
947
|
+
duration: 3000,
|
|
948
|
+
panelClass: ['snackbar-error']
|
|
949
|
+
});
|
|
950
|
+
}
|
|
951
|
+
});
|
|
952
|
+
}
|
|
953
|
+
else {
|
|
954
|
+
// Call Get role mapping by state center only
|
|
955
|
+
this.sharedService.getRoleMappingByStateCenter(stateCenter).subscribe({
|
|
956
|
+
next: (res) => {
|
|
957
|
+
console.log('Existing role mapping loaded:', res);
|
|
958
|
+
this.loading = false;
|
|
959
|
+
this.sharedService.cbpPlanFinalObj['role_mapping_generation'] = res;
|
|
960
|
+
this.snackBar.open('Existing role mapping loaded successfully!', 'X', {
|
|
961
|
+
duration: 3000,
|
|
962
|
+
panelClass: ['snackbar-success']
|
|
963
|
+
});
|
|
964
|
+
this.alreadyAvailableRoleMapping.emit(this.roleMappingForm);
|
|
965
|
+
},
|
|
966
|
+
error: (error) => {
|
|
967
|
+
console.error('Failed to load existing role mapping:', error);
|
|
968
|
+
this.loading = false;
|
|
969
|
+
this.snackBar.open('Failed to load existing role mapping. Please try again.', 'X', {
|
|
970
|
+
duration: 3000,
|
|
971
|
+
panelClass: ['snackbar-error']
|
|
972
|
+
});
|
|
973
|
+
}
|
|
974
|
+
});
|
|
975
|
+
}
|
|
976
|
+
}
|
|
977
|
+
else {
|
|
978
|
+
// Handle other streaming errors
|
|
979
|
+
this.loading = false;
|
|
980
|
+
const errorMessage = err?.detail || 'Stream failed. Please try again.';
|
|
981
|
+
this.snackBar.open(errorMessage, 'X', {
|
|
982
|
+
duration: 3000,
|
|
983
|
+
panelClass: ['snackbar-error']
|
|
984
|
+
});
|
|
985
|
+
}
|
|
986
|
+
}
|
|
987
|
+
removeFile(index) {
|
|
988
|
+
if (!this.uploadedFile || this.uploadedFile.length === 0)
|
|
989
|
+
return;
|
|
990
|
+
// Remove one file at the given index
|
|
991
|
+
this.uploadedFile.splice(index, 1);
|
|
992
|
+
// Update form control value
|
|
993
|
+
this.roleMappingForm.get('additional_document')?.setValue(this.uploadedFile);
|
|
994
|
+
this.roleMappingForm.get('additional_document')?.updateValueAndValidity();
|
|
995
|
+
// Clear errors if no files left
|
|
996
|
+
if (this.uploadedFile.length === 0) {
|
|
997
|
+
this.uploadError = '';
|
|
998
|
+
const input = document.getElementById('uploadDoc');
|
|
999
|
+
if (input)
|
|
1000
|
+
input.value = '';
|
|
1001
|
+
}
|
|
1002
|
+
}
|
|
1003
|
+
getUserProfileData() {
|
|
1004
|
+
this.sharedService.getUserProfile().subscribe((data) => {
|
|
1005
|
+
console.log('data--', data);
|
|
1006
|
+
localStorage.setItem('userProfile', JSON.stringify(data));
|
|
1007
|
+
this.loginUserOrgIds = data?.organization_ids;
|
|
1008
|
+
let filteredMinistryData = [];
|
|
1009
|
+
this.ministryFullData.map((item) => {
|
|
1010
|
+
if (this.loginUserOrgIds.indexOf(item?.identifier) > -1) {
|
|
1011
|
+
filteredMinistryData.push(item);
|
|
1012
|
+
}
|
|
1013
|
+
});
|
|
1014
|
+
this.ministryData = filteredMinistryData;
|
|
1015
|
+
this.originalMinistryData = filteredMinistryData;
|
|
1016
|
+
this.filteredList = filteredMinistryData;
|
|
1017
|
+
});
|
|
1018
|
+
}
|
|
1019
|
+
onOpened(opened) {
|
|
1020
|
+
this.panelOpen = opened;
|
|
1021
|
+
}
|
|
1022
|
+
onOpenedDepartment(opened) {
|
|
1023
|
+
this.departmentPanelOpen = opened;
|
|
1024
|
+
}
|
|
1025
|
+
filterData(event) {
|
|
1026
|
+
if (event && event.target && event.target.value) {
|
|
1027
|
+
const s = event.target.value.toLowerCase();
|
|
1028
|
+
this.filteredList = this.ministryData.filter(x => x.orgName.toLowerCase().includes(s));
|
|
1029
|
+
}
|
|
1030
|
+
else {
|
|
1031
|
+
this.filteredList = this.ministryData;
|
|
1032
|
+
}
|
|
1033
|
+
}
|
|
1034
|
+
filterDepartmentData(event) {
|
|
1035
|
+
if (event && event.target && event.target.value) {
|
|
1036
|
+
const s = event.target.value.toLowerCase();
|
|
1037
|
+
this.filteredDepartmentList = this.departmentData.filter(x => x.orgName.toLowerCase().includes(s));
|
|
1038
|
+
}
|
|
1039
|
+
else {
|
|
1040
|
+
this.filteredDepartmentList = this.departmentData;
|
|
1041
|
+
}
|
|
1042
|
+
}
|
|
1043
|
+
ngOnDestroy() {
|
|
1044
|
+
this.selectedMinistryId = '';
|
|
1045
|
+
this.roleMappingForm.reset();
|
|
1046
|
+
}
|
|
1047
|
+
onDepartmentChange() {
|
|
1048
|
+
const formData = this.roleMappingForm.value;
|
|
1049
|
+
this.sharedService.cbpPlanFinalObj['departments'] = formData.departments ? formData.departments : '';
|
|
1050
|
+
this.cbpFinalObj = this.sharedService.getCBPPlanLocalStorage();
|
|
1051
|
+
if (this.cbpFinalObj && this.cbpFinalObj?.ministry && this.cbpFinalObj?.ministry?.sbOrgType) {
|
|
1052
|
+
this.cbpFinalObj['departments'] = formData.departments ? formData.departments : '';
|
|
1053
|
+
}
|
|
1054
|
+
const selectedMinistry = this.ministryData.find(item => item.identifier === formData.ministry);
|
|
1055
|
+
this.sharedService.cbpPlanFinalObj['ministry'] = selectedMinistry;
|
|
1056
|
+
const departmentName = this.departmentData.find(u => u.identifier === formData.departments);
|
|
1057
|
+
this.sharedService.cbpPlanFinalObj['department_name'] = departmentName?.orgName;
|
|
1058
|
+
localStorage.setItem('cbpPlanFinalObj', JSON.stringify(this.sharedService.cbpPlanFinalObj));
|
|
1059
|
+
this.getUploadedDocuments();
|
|
1060
|
+
}
|
|
1061
|
+
goToUploadDocument() {
|
|
1062
|
+
this.router.navigate(['/ai/upload-documents']);
|
|
1063
|
+
}
|
|
1064
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RoleMappingGenerationComponent, deps: [{ token: i1.EventService }, { token: i2.SharedService }, { token: i3.FormBuilder }, { token: i4.MatSnackBar }, { token: i5.MatDialog }, { token: i6.RoleMappingService }, { token: i7.Router }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1065
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: RoleMappingGenerationComponent, selector: "app-role-mapping-generation", inputs: { loginStatusFlag: "loginStatusFlag" }, outputs: { successRoleMapping: "successRoleMapping", alreadyAvailableRoleMapping: "alreadyAvailableRoleMapping", loginSuccess: "loginSuccess" }, viewQueries: [{ propertyName: "pdfContent", first: true, predicate: ["pdfContent"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"container\">\n <!-- <input class=\"btn-active\" type=\"button\" value=\"Download as PDF\" (click)=\"downloadPDF()\" /> -->\n <div class=\"logo-container\" *ngIf=\"login\">\n <div>\n <span class=\"ai-loader-icon-medium\"><img src=\"assets/icons/ai-loader.gif\"></span>\n </div>\n <div>\n <h2 class=\"highlight-ai\">\n <span>iGOT AI Driven CBP</span>\n </h2>\n </div>\n <!-- <div class=\"sub-heading\">\n <p>Build Your Capacity With Customized Role Mapping</p>\n </div> -->\n </div>\n <mat-card *ngIf=\"login\" class=\"mt-2\" [formGroup]=\"roleMappingForm\">\n <div class=\"depatment-container\">\n<!-- <div class=\"section-header\">-->\n<!-- <div class=\"sub-heading\">-->\n<!-- <p>Choose Your Department</p>-->\n<!-- </div>-->\n<!-- </div>-->\n\n <div class=\"radio-group mt-4\">\n <mat-radio-group class=\"radio-btn-group\" formControlName=\"ministryType\"\n [(ngModel)]=\"selectedMinistryType\" (change)=\"onMinistryTypeChange($event)\">\n\n <!-- Left radio button -->\n <mat-radio-button value=\"ministry\" class=\"radio-btn left-radio\">\n <span class=\"radio-label\">\n <!-- <mat-icon class=\"radio-icon\" [ngClass]=\"selectedMinistryType === 'center'? 'checked-label':''\">domain</mat-icon> -->\n <span [ngClass]=\"selectedMinistryType === 'ministry'? 'checked-label':''\">Centre</span>\n </span>\n </mat-radio-button>\n\n <!-- Right radio button -->\n <mat-radio-button value=\"state\" class=\"radio-btn right-radio\">\n <span class=\"radio-label\">\n <!-- <mat-icon class=\"radio-icon\" [ngClass]=\"selectedMinistryType === 'state'? 'checked-label':''\">location_on</mat-icon> -->\n <span [ngClass]=\"selectedMinistryType === 'state'? 'checked-label':''\">State</span>\n </span>\n </mat-radio-button>\n\n </mat-radio-group>\n </div>\n <div class=\"mt-4\">\n \n <label class=\"label\">\n <span *ngIf=\"selectedMinistryType === 'ministry'\">Ministry</span>\n <span *ngIf=\"selectedMinistryType === 'state'\">State</span>\n </label>\n <div class=\"mt-2 search-box-with-select\">\n \n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px; border: 1px solid #ccc;width: 100%;\">\n <mat-select\n panelClass=\"select-with-search\"\n [placeholder]=\"selectedMinistryType === 'ministry' ? 'Select Ministry/ Department':'Select State'\"\n (selectionChange)=\"onMinistryChange($event)\" formControlName=\"ministry\"\n style=\"border-radius: 25px; background: white; width:100%\" \n (openedChange)=\"onOpened($event)\">\n <div class=\"search-wrapper\" *ngIf=\"panelOpen\">\n <input\n type=\"text\"\n placeholder=\"Search...\"\n (input)=\"filterData($event)\"\n class=\"search-input\"\n (keydown.space)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </div>\n <mat-option [value]=\"item?.identifier\" *ngFor=\"let item of filteredList\" [selected]=\"selectedMinistryId === item?.identifier\">{{item?.orgName}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div class=\"mt-4\" *ngIf=\"departmentData?.length\">\n <label class=\"label\">Department</label>\n <div class=\"mt-2\">\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px;border: 1px solid #ccc;\">\n <mat-select panelClass=\"select-with-search\" placeholder=\"Select Department\" formControlName=\"departments\"\n style=\"border-radius: 25px; background: white;\" (selectionChange)=\"onDepartmentChange()\" (openedChange)=\"onOpenedDepartment($event)\">\n <div class=\"search-wrapper\" *ngIf=\"departmentPanelOpen\">\n <input\n type=\"text\"\n placeholder=\"Search...\"\n (input)=\"filterDepartmentData($event)\"\n class=\"search-input\"\n (keydown.space)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </div>\n <mat-option [value]=\"item?.identifier\"\n *ngFor=\"let item of filteredDepartmentList\">{{item?.orgName}}</mat-option>\n\n </mat-select>\n </mat-form-field>\n </div>\n\n </div>\n <!-- <div class=\"mt-4\">\n <label class=\"label\">Sector</label>\n <div>\n <mat-form-field appearance=\"fill\" style=\"background: white; border-radius: 25px; padding: 0 12px;\">\n <mat-select placeholder=\"Select Sector\" multiple formControlName=\"sectors\"\n style=\"border-radius: 25px; background: white;\">\n <mat-option [value]=\"item?.value\"\n *ngFor=\"let item of sectorData\">{{item?.value}}</mat-option>\n\n </mat-select>\n </mat-form-field>\n </div>\n\n </div> -->\n <!-- *ngIf=\"roleMappingForm.get('ministryType')?.value === 'state'\" -->\n <div class=\"mt-4 additional-details\">\n <textarea rows=\"5\" placeholder=\"Additional details\" formControlName=\"additionalDetails\"></textarea>\n </div>\n <div class=\"mt-4\">\n \n <button [ngClass]=\"disableUploadDocument ? 'btn-active-primary-disable':'btn-active-primary'\" class=\"\"\n [disabled]=\"disableUploadDocument\" mat-raised-button color=\"primary\"\n (click)=\"goToUploadDocument()\">\n <mat-icon>upload</mat-icon> Manage Documents\n </button>\n </div>\n <!-- *ngIf=\"roleMappingForm.get('ministryType')?.value === 'state'\" -->\n <!-- <div class=\"mt-4 section\" >\n <div class=\"sub-heading\">\n <p>Upload Document (PDF)</p>\n </div>\n <div class=\"file-upload-wrapper\">\n <label for=\"uploadDoc\" class=\"file-upload-label\">\n <span class=\"file-upload-icon\">\uD83D\uDCCE</span>\n <span *ngIf=\"!uploadedFile || uploadedFile.length === 0\">\n Choose up to 3 files (PDF/TXT)\n </span>\n <div *ngIf=\"uploadedFile?.length > 0\" class=\"file-list\">\n <div *ngFor=\"let file of uploadedFile; let i = index\" class=\"file-item\">\n {{ file.name }}\n <span class=\"remove-file-icon\" (click)=\"removeFile(i);$event.preventDefault()\">\n <mat-icon>close</mat-icon>\n </span>\n </div>\n </div>\n </label>\n <input\n id=\"uploadDoc\"\n type=\"file\"\n multiple\n (change)=\"onFileChange($event)\"\n hidden\n /> \n\n <small class=\"file-upload-hint\">Max file size: {{maxFileSizeMB}}MB</small>\n\n <input id=\"uploadDoc\" multiple type=\"file\" (change)=\"onFileChange($event)\"\n accept=\".pdf,.doc,.docx,.xls,.xlsx,.txt\" class=\"file-upload-input\" />\n\n <div *ngIf=\"uploadError\" class=\"error\">{{ uploadError }}</div>\n </div>\n </div> -->\n <!-- *ngIf=\"roleMappingForm.get('ministryType')?.value === 'state'\" -->\n <!-- <div class=\"mt-2 section\">\n <div class=\"disclaimer-text\">\n <p>Disclaimer: Please do not upload any confidential documents. </p>\n </div>\n </div> -->\n <div class=\"mt-2\" *ngIf=\"documents?.length < 1 && !(roleMappingForm?.invalid)\">\n <p><span style=\"font-size: .875rem;font-weight: bold;\">Note: </span><span class=\"error\">Please Upload atleast 1 Document.</span></p>\n </div>\n <div class=\"mt-4\" >\n <input [disabled]=\"roleMappingForm?.invalid || (roleMappingForm.get('ministryType')?.value === 'state' && !roleMappingForm.get('departments')?.value) || loading || documents?.length < 1\"\n [ngClass]=\"roleMappingForm?.invalid || (roleMappingForm.get('ministryType')?.value === 'state' && !roleMappingForm.get('departments')?.value) || loading || documents?.length < 1 ? 'btn-disable':'btn-active'\" \n type=\"button\" \n [value]=\"loading ? 'Generating CBP...' : 'Generate CBP'\"\n (click)=\"onGenerateRoleMapping()\" />\n </div>\n </div>\n </mat-card>\n \n</div>\n<div *ngIf=\"!login\">\n <app-login (success)=\"loginStatus($event)\"></app-login>\n </div>\n\n<div class=\"overlay-loader\" *ngIf=\"apiLoading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>\n\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <div class=\"loading-content\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n <div class=\"loading-text mt-3\">\n <p class=\"main-message\">{{ currentProcessingStage || 'Preparing CBP Plan generation...' }}</p>\n <div class=\"progress-details\">\n <div class=\"progress-indicator\" *ngIf=\"chunks.length > 0\">\n <div class=\"progress-bar-container\">\n <div class=\"progress-bar\" \n [style.width.%]=\"getDisplayProgressPercentage()\">\n </div>\n </div>\n <small class=\"progress-text\">{{ getDisplayProgressPercentage() }}% Complete</small>\n </div>\n <small class=\"time-estimate\">\n Real-time streaming in progress. This may take 2-3 minutes.\n </small>\n </div>\n </div>\n </div>\n</div>\n", styles: [".container{width:40%}.sub-heading p{color:#000;font-family:Montserrat;font-size:18px;font-style:normal;font-weight:600;line-height:normal}.radio-btn-group{display:flex;justify-content:space-between;border-radius:8px;padding:12px 16px;align-items:center;max-width:600px;margin:0 auto;gap:20px}.radio-btn{flex:1;display:flex;align-items:center;justify-content:center;padding:10px;border-radius:6px;transition:background-color .3s ease}.radio-btn,.radio-btn:hover{background-color:#eef2f7}.radio-label{display:flex;align-items:center;gap:6px;font-weight:500;font-size:16px}.radio-icon{font-size:24px;color:gray}.radio-label{color:#000;font-family:Lato;font-size:18px;font-style:normal;font-weight:400;line-height:normal}.label{color:var(--Body-Text-Body-Color, #212529);font-family:Lato;font-size:18px;font-style:normal;font-weight:700;line-height:150%}::ng-deep mat-form-field{background-color:#fff!important;border-radius:25px!important;padding-left:12px;padding-right:12px;height:42px;width:100%}::ng-deep mat-select{border-radius:25px!important;background-color:#fff!important}::ng-deep .mat-select-panel{background-color:#fff!important}::ng-deep .mat-select-panel .mat-option{border-radius:0!important}::ng-deep mat-form-field .mat-form-field-underline{display:none!important}::ng-deep mat-select .mat-select-placeholder{color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}::ng-deep mat-select .mat-select-value-text{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;line-height:normal!important;padding-top:0!important;padding-bottom:0!important}::ng-deep mat-select .mat-select-value{display:flex!important;align-items:center!important;height:100%!important}.additional-details textarea{display:flex;padding:16px 16px 0;flex-direction:column;align-items:flex-start;gap:10px;flex:1 0 0;align-self:stretch;width:100%;color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;border:none;outline:none;resize:none;box-shadow:none;border-radius:4px;border:1px solid #ccc}.section-header{display:flex;flex-direction:row;align-items:center;justify-content:center}.btn-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.4;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-active{border-radius:var(--Radius-Full-Round, 9999999px);opacity:1;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-group{display:flex;flex-direction:row;justify-content:space-between}.pl-2{padding-left:10px}.search-filter-section{display:flex;flex-direction:row;justify-content:space-between}.search .rsearch{position:relative}.search .search-icon{position:absolute;top:15px;font-size:20px;left:10px}.search .sinput{border-radius:4px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato}.select-map-route-container{display:flex;flex-direction:row}.selected-mapping-route p{color:#1b4ca1;font-family:Lato;font-size:20px;font-style:normal;font-weight:400;line-height:normal;text-decoration-line:underline;text-decoration-style:solid;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font}.edit-plan{display:flex;padding:4px;justify-content:center;align-items:center;gap:8px;border-radius:4px;background:#1b4ca129;color:#1b4ca1;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;margin-left:10px}.search-container{display:flex;flex-direction:row}.course-container{display:flex;width:100%;padding:16px;flex-direction:column;align-items:flex-start;gap:24px;grid-row:2/span 1;grid-column:1/span 1;border-radius:12px;border:1px solid var(--borders-black-border-16-black, rgba(0, 0, 0, .16));background:#fff}.course-header{display:flex;flex-direction:row;justify-content:space-between;width:100%}.course-pill{display:flex;height:24px;padding:8px;align-items:center;gap:4px;border-radius:16px;border:1px solid var(--borders-border-fill-focussed-4-light-100, #EF951E);background:#fefaf4}.ai-recommened-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #1B4CA1;background:#1b4ca129}.igot-platform-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #EF951E;background:#ef951e29}.course-title{color:var(--Primary-KB-Primary-Light, #1B4CA1);font-family:Montserrat;font-size:20px;font-style:normal;font-weight:600;line-height:30px}.course-desc{color:#0009;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.relevancy,.competencies-matched{color:var(--accessbility-shades-with-opacity-kb-greys-black-60, rgba(0, 0, 0, .6));font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;align-items:center}.percentage{color:#1d8923;font-family:Lato;font-size:14px;font-style:normal;font-weight:800;line-height:normal}.relevancy-container,.competencies-matched-container{display:flex;flex-direction:row;align-items:center}.dash{padding:0 5px}::ng-deep .mat-radio-checked .mat-radio-inner-circle{background:#1b4ca1!important}.course-list-container{display:flex;flex-wrap:wrap;gap:16px}.course-list-item{flex:0 0 48%;box-sizing:border-box;border:1px solid #ccc;padding:16px;background-color:#fff;border-radius:8px}.checked-course-container{display:flex}.ml-2{margin-left:8px}::ng-deep .mat-checkbox-checked .mat-checkbox-background{background:#1b4ca1!important}.ai-recommened-pill-text,.igot-platform-pill-text{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:700;line-height:normal}.course-pill-text{color:var(--accessbility-shades-without-opacity-kb-greys-black-87, #212121);text-align:center;font-family:Poppins;font-size:12px;font-style:normal;font-weight:400;line-height:normal}.ai-loader-icon img,.igot-platform-icon img{width:15.714px;height:15.714px;flex-shrink:0}.competency-container{display:flex}.outside-layer{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #F8B861;background:#fde8cc;width:132px}.suggest-courses-header{display:flex;flex-direction:row;justify-content:space-between}.suggest-course-control{display:flex;flex-direction:row}.course-card-container{width:172px;border-radius:3.307px;border:.827px solid var(--borders-border-8-black, rgba(0, 0, 0, .08));background-color:#fff}.highlight-ai{font-family:Montserrat;font-size:28px;font-style:normal;font-weight:600;line-height:normal;background:linear-gradient(90deg,#3b27ff,#2de3d6);background-clip:text;-webkit-background-clip:text;color:transparent;-webkit-text-fill-color:transparent;display:inline-block}.ai-loader-icon-medium img{width:60px;height:60px;flex-shrink:0}.overlay-loader{position:fixed;top:0;left:0;width:100vw;height:100vh;background:#ffffffbf;z-index:9999;display:flex;justify-content:center;align-items:center}.overlay-loader .loading-content{display:flex;flex-direction:column;align-items:center;text-align:center;background:#fff;padding:2rem;border-radius:8px;box-shadow:0 4px 12px #00000026}.overlay-loader .loading-content .loading-text{color:#1b4ca1;font-family:Lato,sans-serif;min-width:300px}.overlay-loader .loading-content .loading-text .main-message{margin:0 0 16px;font-size:18px;font-weight:600;text-align:center}.overlay-loader .loading-content .loading-text .progress-details{margin-top:16px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator{margin-bottom:12px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container{width:100%;height:8px;background-color:#e0e0e0;border-radius:4px;overflow:hidden;margin-bottom:8px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container .progress-bar{height:100%;background:linear-gradient(90deg,#1b4ca1,#2563eb);border-radius:4px;transition:width .5s ease-in-out}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-text{font-size:14px;font-weight:500;color:#1b4ca1;display:block;text-align:center}.overlay-loader .loading-content .loading-text .progress-details .time-estimate{color:#666;font-size:12px;font-style:italic;display:block;text-align:center;margin-top:8px}::ng-deep mat-option .mat-option-text{font-size:16px;color:#000;font-family:Lato}:host ::ng-deep mat-select .mat-select-placeholder{font-size:16px}:host mat-select .mat-select-value-text{font-size:16px!important}.logo-container{display:flex;justify-content:center;align-items:center;flex-direction:column}.depatment-container{background:#fff;border:1px solid rgba(27,76,161,.12);padding:5%;box-shadow:0 4px 6px #0000001a,0 8px 20px #00000026;border-radius:8px}.checked-label{color:#1b4ca1}.file-upload-wrapper{position:relative;margin:16px 0}.file-upload-label{display:inline-flex;align-items:center;padding:10px 16px;background-color:#1b4ca1;color:#fff;font-weight:500;cursor:pointer;transition:background-color .3s;-webkit-user-select:none;user-select:none;border-radius:8px}.file-upload-label:hover{background-color:#1b4ca1}.file-upload-icon{margin-right:8px;font-size:18px}.file-upload-input{display:none}.error{color:red;margin-top:6px;font-size:.875rem}.file-upload-hint{display:block;font-size:1rem;color:#000;font-family:Lato;font-size:14px;margin-top:4px;margin-bottom:8px}.disclaimer-text p{font-size:16px;font-family:Lato;font-weight:400}.mat-select-panel .search-wrapper{width:100%!important;box-sizing:border-box;padding:8px;position:sticky;top:0;z-index:2;background:#fff}.search-input{width:100%;padding:6px 10px;border:1px solid #ccc;border-radius:6px;outline:none;box-sizing:border-box}.mat-select-panel mat-option{padding-top:10px}::ng-deep .mat-select-panel-wrap{overflow:visible!important;padding:0;margin-top:42px}::ng-deep .mat-select-panel{border:1px solid #ccc!important;box-sizing:border-box;max-height:250px}::ng-deep .select-with-search.mat-select-panel{padding-top:0;overflow:auto}::ng-deep .select-with-search .search-wrapper{position:sticky;top:0;z-index:10;background:#fff;padding:8px;border-bottom:1px solid #e0e0e0}::ng-deep .select-with-search .search-input{width:100%;padding:6px 10px;border:1px solid #ccc;border-radius:6px;outline:none;box-sizing:border-box}::ng-deep .select-with-search mat-option:first-of-type{margin-top:4px}.btn-active-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.5;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-active-primary{border-radius:var(--Radius-Full-Round, 9999999px);opacity:1;background:var(--Primary-KB-Primary-Light, #fff);color:#1b4ca1;text-align:center;border:1px solid #1B4CA1!important;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-active-primary-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.5;background:var(--Primary-KB-Primary-Light, #fff);color:#1b4ca1;text-align:center;border:1px solid #1B4CA1!important;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}\n"], dependencies: [{ kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i9.MatLegacyCard, selector: "mat-card", exportAs: ["matCard"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i10.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i11.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i12.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i13.MatLegacyRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { kind: "component", type: i13.MatLegacyRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { kind: "component", type: i14.MatLegacySelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i15.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i16.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] }); }
|
|
1066
|
+
}
|
|
1067
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RoleMappingGenerationComponent, decorators: [{
|
|
1068
|
+
type: Component,
|
|
1069
|
+
args: [{ selector: 'app-role-mapping-generation', template: "<div class=\"container\">\n <!-- <input class=\"btn-active\" type=\"button\" value=\"Download as PDF\" (click)=\"downloadPDF()\" /> -->\n <div class=\"logo-container\" *ngIf=\"login\">\n <div>\n <span class=\"ai-loader-icon-medium\"><img src=\"assets/icons/ai-loader.gif\"></span>\n </div>\n <div>\n <h2 class=\"highlight-ai\">\n <span>iGOT AI Driven CBP</span>\n </h2>\n </div>\n <!-- <div class=\"sub-heading\">\n <p>Build Your Capacity With Customized Role Mapping</p>\n </div> -->\n </div>\n <mat-card *ngIf=\"login\" class=\"mt-2\" [formGroup]=\"roleMappingForm\">\n <div class=\"depatment-container\">\n<!-- <div class=\"section-header\">-->\n<!-- <div class=\"sub-heading\">-->\n<!-- <p>Choose Your Department</p>-->\n<!-- </div>-->\n<!-- </div>-->\n\n <div class=\"radio-group mt-4\">\n <mat-radio-group class=\"radio-btn-group\" formControlName=\"ministryType\"\n [(ngModel)]=\"selectedMinistryType\" (change)=\"onMinistryTypeChange($event)\">\n\n <!-- Left radio button -->\n <mat-radio-button value=\"ministry\" class=\"radio-btn left-radio\">\n <span class=\"radio-label\">\n <!-- <mat-icon class=\"radio-icon\" [ngClass]=\"selectedMinistryType === 'center'? 'checked-label':''\">domain</mat-icon> -->\n <span [ngClass]=\"selectedMinistryType === 'ministry'? 'checked-label':''\">Centre</span>\n </span>\n </mat-radio-button>\n\n <!-- Right radio button -->\n <mat-radio-button value=\"state\" class=\"radio-btn right-radio\">\n <span class=\"radio-label\">\n <!-- <mat-icon class=\"radio-icon\" [ngClass]=\"selectedMinistryType === 'state'? 'checked-label':''\">location_on</mat-icon> -->\n <span [ngClass]=\"selectedMinistryType === 'state'? 'checked-label':''\">State</span>\n </span>\n </mat-radio-button>\n\n </mat-radio-group>\n </div>\n <div class=\"mt-4\">\n \n <label class=\"label\">\n <span *ngIf=\"selectedMinistryType === 'ministry'\">Ministry</span>\n <span *ngIf=\"selectedMinistryType === 'state'\">State</span>\n </label>\n <div class=\"mt-2 search-box-with-select\">\n \n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px; border: 1px solid #ccc;width: 100%;\">\n <mat-select\n panelClass=\"select-with-search\"\n [placeholder]=\"selectedMinistryType === 'ministry' ? 'Select Ministry/ Department':'Select State'\"\n (selectionChange)=\"onMinistryChange($event)\" formControlName=\"ministry\"\n style=\"border-radius: 25px; background: white; width:100%\" \n (openedChange)=\"onOpened($event)\">\n <div class=\"search-wrapper\" *ngIf=\"panelOpen\">\n <input\n type=\"text\"\n placeholder=\"Search...\"\n (input)=\"filterData($event)\"\n class=\"search-input\"\n (keydown.space)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </div>\n <mat-option [value]=\"item?.identifier\" *ngFor=\"let item of filteredList\" [selected]=\"selectedMinistryId === item?.identifier\">{{item?.orgName}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n <div class=\"mt-4\" *ngIf=\"departmentData?.length\">\n <label class=\"label\">Department</label>\n <div class=\"mt-2\">\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px;border: 1px solid #ccc;\">\n <mat-select panelClass=\"select-with-search\" placeholder=\"Select Department\" formControlName=\"departments\"\n style=\"border-radius: 25px; background: white;\" (selectionChange)=\"onDepartmentChange()\" (openedChange)=\"onOpenedDepartment($event)\">\n <div class=\"search-wrapper\" *ngIf=\"departmentPanelOpen\">\n <input\n type=\"text\"\n placeholder=\"Search...\"\n (input)=\"filterDepartmentData($event)\"\n class=\"search-input\"\n (keydown.space)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </div>\n <mat-option [value]=\"item?.identifier\"\n *ngFor=\"let item of filteredDepartmentList\">{{item?.orgName}}</mat-option>\n\n </mat-select>\n </mat-form-field>\n </div>\n\n </div>\n <!-- <div class=\"mt-4\">\n <label class=\"label\">Sector</label>\n <div>\n <mat-form-field appearance=\"fill\" style=\"background: white; border-radius: 25px; padding: 0 12px;\">\n <mat-select placeholder=\"Select Sector\" multiple formControlName=\"sectors\"\n style=\"border-radius: 25px; background: white;\">\n <mat-option [value]=\"item?.value\"\n *ngFor=\"let item of sectorData\">{{item?.value}}</mat-option>\n\n </mat-select>\n </mat-form-field>\n </div>\n\n </div> -->\n <!-- *ngIf=\"roleMappingForm.get('ministryType')?.value === 'state'\" -->\n <div class=\"mt-4 additional-details\">\n <textarea rows=\"5\" placeholder=\"Additional details\" formControlName=\"additionalDetails\"></textarea>\n </div>\n <div class=\"mt-4\">\n \n <button [ngClass]=\"disableUploadDocument ? 'btn-active-primary-disable':'btn-active-primary'\" class=\"\"\n [disabled]=\"disableUploadDocument\" mat-raised-button color=\"primary\"\n (click)=\"goToUploadDocument()\">\n <mat-icon>upload</mat-icon> Manage Documents\n </button>\n </div>\n <!-- *ngIf=\"roleMappingForm.get('ministryType')?.value === 'state'\" -->\n <!-- <div class=\"mt-4 section\" >\n <div class=\"sub-heading\">\n <p>Upload Document (PDF)</p>\n </div>\n <div class=\"file-upload-wrapper\">\n <label for=\"uploadDoc\" class=\"file-upload-label\">\n <span class=\"file-upload-icon\">\uD83D\uDCCE</span>\n <span *ngIf=\"!uploadedFile || uploadedFile.length === 0\">\n Choose up to 3 files (PDF/TXT)\n </span>\n <div *ngIf=\"uploadedFile?.length > 0\" class=\"file-list\">\n <div *ngFor=\"let file of uploadedFile; let i = index\" class=\"file-item\">\n {{ file.name }}\n <span class=\"remove-file-icon\" (click)=\"removeFile(i);$event.preventDefault()\">\n <mat-icon>close</mat-icon>\n </span>\n </div>\n </div>\n </label>\n <input\n id=\"uploadDoc\"\n type=\"file\"\n multiple\n (change)=\"onFileChange($event)\"\n hidden\n /> \n\n <small class=\"file-upload-hint\">Max file size: {{maxFileSizeMB}}MB</small>\n\n <input id=\"uploadDoc\" multiple type=\"file\" (change)=\"onFileChange($event)\"\n accept=\".pdf,.doc,.docx,.xls,.xlsx,.txt\" class=\"file-upload-input\" />\n\n <div *ngIf=\"uploadError\" class=\"error\">{{ uploadError }}</div>\n </div>\n </div> -->\n <!-- *ngIf=\"roleMappingForm.get('ministryType')?.value === 'state'\" -->\n <!-- <div class=\"mt-2 section\">\n <div class=\"disclaimer-text\">\n <p>Disclaimer: Please do not upload any confidential documents. </p>\n </div>\n </div> -->\n <div class=\"mt-2\" *ngIf=\"documents?.length < 1 && !(roleMappingForm?.invalid)\">\n <p><span style=\"font-size: .875rem;font-weight: bold;\">Note: </span><span class=\"error\">Please Upload atleast 1 Document.</span></p>\n </div>\n <div class=\"mt-4\" >\n <input [disabled]=\"roleMappingForm?.invalid || (roleMappingForm.get('ministryType')?.value === 'state' && !roleMappingForm.get('departments')?.value) || loading || documents?.length < 1\"\n [ngClass]=\"roleMappingForm?.invalid || (roleMappingForm.get('ministryType')?.value === 'state' && !roleMappingForm.get('departments')?.value) || loading || documents?.length < 1 ? 'btn-disable':'btn-active'\" \n type=\"button\" \n [value]=\"loading ? 'Generating CBP...' : 'Generate CBP'\"\n (click)=\"onGenerateRoleMapping()\" />\n </div>\n </div>\n </mat-card>\n \n</div>\n<div *ngIf=\"!login\">\n <app-login (success)=\"loginStatus($event)\"></app-login>\n </div>\n\n<div class=\"overlay-loader\" *ngIf=\"apiLoading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>\n\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <div class=\"loading-content\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n <div class=\"loading-text mt-3\">\n <p class=\"main-message\">{{ currentProcessingStage || 'Preparing CBP Plan generation...' }}</p>\n <div class=\"progress-details\">\n <div class=\"progress-indicator\" *ngIf=\"chunks.length > 0\">\n <div class=\"progress-bar-container\">\n <div class=\"progress-bar\" \n [style.width.%]=\"getDisplayProgressPercentage()\">\n </div>\n </div>\n <small class=\"progress-text\">{{ getDisplayProgressPercentage() }}% Complete</small>\n </div>\n <small class=\"time-estimate\">\n Real-time streaming in progress. This may take 2-3 minutes.\n </small>\n </div>\n </div>\n </div>\n</div>\n", styles: [".container{width:40%}.sub-heading p{color:#000;font-family:Montserrat;font-size:18px;font-style:normal;font-weight:600;line-height:normal}.radio-btn-group{display:flex;justify-content:space-between;border-radius:8px;padding:12px 16px;align-items:center;max-width:600px;margin:0 auto;gap:20px}.radio-btn{flex:1;display:flex;align-items:center;justify-content:center;padding:10px;border-radius:6px;transition:background-color .3s ease}.radio-btn,.radio-btn:hover{background-color:#eef2f7}.radio-label{display:flex;align-items:center;gap:6px;font-weight:500;font-size:16px}.radio-icon{font-size:24px;color:gray}.radio-label{color:#000;font-family:Lato;font-size:18px;font-style:normal;font-weight:400;line-height:normal}.label{color:var(--Body-Text-Body-Color, #212529);font-family:Lato;font-size:18px;font-style:normal;font-weight:700;line-height:150%}::ng-deep mat-form-field{background-color:#fff!important;border-radius:25px!important;padding-left:12px;padding-right:12px;height:42px;width:100%}::ng-deep mat-select{border-radius:25px!important;background-color:#fff!important}::ng-deep .mat-select-panel{background-color:#fff!important}::ng-deep .mat-select-panel .mat-option{border-radius:0!important}::ng-deep mat-form-field .mat-form-field-underline{display:none!important}::ng-deep mat-select .mat-select-placeholder{color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}::ng-deep mat-select .mat-select-value-text{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;line-height:normal!important;padding-top:0!important;padding-bottom:0!important}::ng-deep mat-select .mat-select-value{display:flex!important;align-items:center!important;height:100%!important}.additional-details textarea{display:flex;padding:16px 16px 0;flex-direction:column;align-items:flex-start;gap:10px;flex:1 0 0;align-self:stretch;width:100%;color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;border:none;outline:none;resize:none;box-shadow:none;border-radius:4px;border:1px solid #ccc}.section-header{display:flex;flex-direction:row;align-items:center;justify-content:center}.btn-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.4;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-active{border-radius:var(--Radius-Full-Round, 9999999px);opacity:1;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-group{display:flex;flex-direction:row;justify-content:space-between}.pl-2{padding-left:10px}.search-filter-section{display:flex;flex-direction:row;justify-content:space-between}.search .rsearch{position:relative}.search .search-icon{position:absolute;top:15px;font-size:20px;left:10px}.search .sinput{border-radius:4px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato}.select-map-route-container{display:flex;flex-direction:row}.selected-mapping-route p{color:#1b4ca1;font-family:Lato;font-size:20px;font-style:normal;font-weight:400;line-height:normal;text-decoration-line:underline;text-decoration-style:solid;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font}.edit-plan{display:flex;padding:4px;justify-content:center;align-items:center;gap:8px;border-radius:4px;background:#1b4ca129;color:#1b4ca1;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;margin-left:10px}.search-container{display:flex;flex-direction:row}.course-container{display:flex;width:100%;padding:16px;flex-direction:column;align-items:flex-start;gap:24px;grid-row:2/span 1;grid-column:1/span 1;border-radius:12px;border:1px solid var(--borders-black-border-16-black, rgba(0, 0, 0, .16));background:#fff}.course-header{display:flex;flex-direction:row;justify-content:space-between;width:100%}.course-pill{display:flex;height:24px;padding:8px;align-items:center;gap:4px;border-radius:16px;border:1px solid var(--borders-border-fill-focussed-4-light-100, #EF951E);background:#fefaf4}.ai-recommened-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #1B4CA1;background:#1b4ca129}.igot-platform-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #EF951E;background:#ef951e29}.course-title{color:var(--Primary-KB-Primary-Light, #1B4CA1);font-family:Montserrat;font-size:20px;font-style:normal;font-weight:600;line-height:30px}.course-desc{color:#0009;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.relevancy,.competencies-matched{color:var(--accessbility-shades-with-opacity-kb-greys-black-60, rgba(0, 0, 0, .6));font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;align-items:center}.percentage{color:#1d8923;font-family:Lato;font-size:14px;font-style:normal;font-weight:800;line-height:normal}.relevancy-container,.competencies-matched-container{display:flex;flex-direction:row;align-items:center}.dash{padding:0 5px}::ng-deep .mat-radio-checked .mat-radio-inner-circle{background:#1b4ca1!important}.course-list-container{display:flex;flex-wrap:wrap;gap:16px}.course-list-item{flex:0 0 48%;box-sizing:border-box;border:1px solid #ccc;padding:16px;background-color:#fff;border-radius:8px}.checked-course-container{display:flex}.ml-2{margin-left:8px}::ng-deep .mat-checkbox-checked .mat-checkbox-background{background:#1b4ca1!important}.ai-recommened-pill-text,.igot-platform-pill-text{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:700;line-height:normal}.course-pill-text{color:var(--accessbility-shades-without-opacity-kb-greys-black-87, #212121);text-align:center;font-family:Poppins;font-size:12px;font-style:normal;font-weight:400;line-height:normal}.ai-loader-icon img,.igot-platform-icon img{width:15.714px;height:15.714px;flex-shrink:0}.competency-container{display:flex}.outside-layer{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #F8B861;background:#fde8cc;width:132px}.suggest-courses-header{display:flex;flex-direction:row;justify-content:space-between}.suggest-course-control{display:flex;flex-direction:row}.course-card-container{width:172px;border-radius:3.307px;border:.827px solid var(--borders-border-8-black, rgba(0, 0, 0, .08));background-color:#fff}.highlight-ai{font-family:Montserrat;font-size:28px;font-style:normal;font-weight:600;line-height:normal;background:linear-gradient(90deg,#3b27ff,#2de3d6);background-clip:text;-webkit-background-clip:text;color:transparent;-webkit-text-fill-color:transparent;display:inline-block}.ai-loader-icon-medium img{width:60px;height:60px;flex-shrink:0}.overlay-loader{position:fixed;top:0;left:0;width:100vw;height:100vh;background:#ffffffbf;z-index:9999;display:flex;justify-content:center;align-items:center}.overlay-loader .loading-content{display:flex;flex-direction:column;align-items:center;text-align:center;background:#fff;padding:2rem;border-radius:8px;box-shadow:0 4px 12px #00000026}.overlay-loader .loading-content .loading-text{color:#1b4ca1;font-family:Lato,sans-serif;min-width:300px}.overlay-loader .loading-content .loading-text .main-message{margin:0 0 16px;font-size:18px;font-weight:600;text-align:center}.overlay-loader .loading-content .loading-text .progress-details{margin-top:16px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator{margin-bottom:12px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container{width:100%;height:8px;background-color:#e0e0e0;border-radius:4px;overflow:hidden;margin-bottom:8px}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-bar-container .progress-bar{height:100%;background:linear-gradient(90deg,#1b4ca1,#2563eb);border-radius:4px;transition:width .5s ease-in-out}.overlay-loader .loading-content .loading-text .progress-details .progress-indicator .progress-text{font-size:14px;font-weight:500;color:#1b4ca1;display:block;text-align:center}.overlay-loader .loading-content .loading-text .progress-details .time-estimate{color:#666;font-size:12px;font-style:italic;display:block;text-align:center;margin-top:8px}::ng-deep mat-option .mat-option-text{font-size:16px;color:#000;font-family:Lato}:host ::ng-deep mat-select .mat-select-placeholder{font-size:16px}:host mat-select .mat-select-value-text{font-size:16px!important}.logo-container{display:flex;justify-content:center;align-items:center;flex-direction:column}.depatment-container{background:#fff;border:1px solid rgba(27,76,161,.12);padding:5%;box-shadow:0 4px 6px #0000001a,0 8px 20px #00000026;border-radius:8px}.checked-label{color:#1b4ca1}.file-upload-wrapper{position:relative;margin:16px 0}.file-upload-label{display:inline-flex;align-items:center;padding:10px 16px;background-color:#1b4ca1;color:#fff;font-weight:500;cursor:pointer;transition:background-color .3s;-webkit-user-select:none;user-select:none;border-radius:8px}.file-upload-label:hover{background-color:#1b4ca1}.file-upload-icon{margin-right:8px;font-size:18px}.file-upload-input{display:none}.error{color:red;margin-top:6px;font-size:.875rem}.file-upload-hint{display:block;font-size:1rem;color:#000;font-family:Lato;font-size:14px;margin-top:4px;margin-bottom:8px}.disclaimer-text p{font-size:16px;font-family:Lato;font-weight:400}.mat-select-panel .search-wrapper{width:100%!important;box-sizing:border-box;padding:8px;position:sticky;top:0;z-index:2;background:#fff}.search-input{width:100%;padding:6px 10px;border:1px solid #ccc;border-radius:6px;outline:none;box-sizing:border-box}.mat-select-panel mat-option{padding-top:10px}::ng-deep .mat-select-panel-wrap{overflow:visible!important;padding:0;margin-top:42px}::ng-deep .mat-select-panel{border:1px solid #ccc!important;box-sizing:border-box;max-height:250px}::ng-deep .select-with-search.mat-select-panel{padding-top:0;overflow:auto}::ng-deep .select-with-search .search-wrapper{position:sticky;top:0;z-index:10;background:#fff;padding:8px;border-bottom:1px solid #e0e0e0}::ng-deep .select-with-search .search-input{width:100%;padding:6px 10px;border:1px solid #ccc;border-radius:6px;outline:none;box-sizing:border-box}::ng-deep .select-with-search mat-option:first-of-type{margin-top:4px}.btn-active-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.5;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-active-primary{border-radius:var(--Radius-Full-Round, 9999999px);opacity:1;background:var(--Primary-KB-Primary-Light, #fff);color:#1b4ca1;text-align:center;border:1px solid #1B4CA1!important;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}.btn-active-primary-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.5;background:var(--Primary-KB-Primary-Light, #fff);color:#1b4ca1;text-align:center;border:1px solid #1B4CA1!important;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:48px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100%}\n"] }]
|
|
1070
|
+
}], ctorParameters: function () { return [{ type: i1.EventService }, { type: i2.SharedService }, { type: i3.FormBuilder }, { type: i4.MatSnackBar }, { type: i5.MatDialog }, { type: i6.RoleMappingService }, { type: i7.Router }]; }, propDecorators: { pdfContent: [{
|
|
1071
|
+
type: ViewChild,
|
|
1072
|
+
args: ['pdfContent', { static: false }]
|
|
1073
|
+
}], loginStatusFlag: [{
|
|
1074
|
+
type: Input
|
|
1075
|
+
}], successRoleMapping: [{
|
|
1076
|
+
type: Output
|
|
1077
|
+
}], alreadyAvailableRoleMapping: [{
|
|
1078
|
+
type: Output
|
|
1079
|
+
}], loginSuccess: [{
|
|
1080
|
+
type: Output
|
|
1081
|
+
}] } });
|
|
1082
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZS1tYXBwaW5nLWdlbmVyYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvcm9sZS1tYXBwaW5nLWdlbmVyYXRpb24vcm9sZS1tYXBwaW5nLWdlbmVyYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvcm9sZS1tYXBwaW5nLWdlbmVyYXRpb24vcm9sZS1tYXBwaW5nLWdlbmVyYXRpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFnQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBdUMsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFakYsT0FBTyxRQUFRLE1BQU0sYUFBYSxDQUFDO0FBQ25DLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLGtFQUFrRSxDQUFDO0FBRW5ILE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBaUIsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBVTNDLE1BQU0sT0FBTyw4QkFBOEI7SUFrRnpDLFlBQ1UsUUFBc0IsRUFDdkIsYUFBNEIsRUFDM0IsRUFBZSxFQUNmLFFBQXFCLEVBQ3RCLE1BQWlCLEVB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TUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdFRhYmxlRGF0YVNvdXJjZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInO1xuaW1wb3J0IGh0bWwycGRmIGZyb20gJ2h0bWwycGRmLmpzJztcbmltcG9ydCB7IERlbGV0ZVJvbGVNYXBwaW5nUG9wdXBDb21wb25lbnQgfSBmcm9tICcuLi9kZWxldGUtcm9sZS1tYXBwaW5nLXBvcHVwL2RlbGV0ZS1yb2xlLW1hcHBpbmctcG9wdXAuY29tcG9uZW50JztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBpbnRlcnZhbCwgb2YsIGNvbmNhdCwgUmVwbGF5U3ViamVjdCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgc3dpdGNoTWFwLCB0YWtlV2hpbGUsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBTaGFyZWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbW9kdWxlcy9zaGFyZWQvc2VydmljZXMvc2hhcmVkLnNlcnZpY2UnO1xuaW1wb3J0IHsgUm9sZU1hcHBpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbW9kdWxlcy9zaGFyZWQvc2VydmljZXMvcm9sZS1tYXBwaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgRXZlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbW9kdWxlcy9zaGFyZWQvc2VydmljZXMvZXZlbnQuc2VydmljZSc7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcm9sZS1tYXBwaW5nLWdlbmVyYXRpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vcm9sZS1tYXBwaW5nLWdlbmVyYXRpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9yb2xlLW1hcHBpbmctZ2VuZXJhdGlvbi5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFJvbGVNYXBwaW5nR2VuZXJhdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkKCdwZGZDb250ZW50JywgeyBzdGF0aWM6IGZhbHNlIH0pIHBkZkNvbnRlbnQhOiBFbGVtZW50UmVmO1xuICBcbiAgQElucHV0KCkgbG9naW5TdGF0dXNGbGFnID0gZmFsc2VcbiAgdGl0bGUgPSAnc3VuYmlyZC1jYi1zdGF0aWN3ZWInO1xuICBpc01haW50ZW5hbmNlUGFnZTogYW55XG4gIHNlbGVjdGVkVmFsdWUgPSAnJ1xuICBzZWFyY2hUZXh0ID0gJydcbiAgZGF0YVNvdXJjZTogYW55XG4gIGRpc3BsYXllZENvbHVtbnM6IHN0cmluZ1tdID0gWydSZXF1ZXN0SWQnLCAndGl0bGUnLCAncmVxdWVzdG9yJywgJ3JlcXVlc3RUeXBlJyxcbiAgICAncmVxdWVzdFN0YXR1cycsICdhc3NpZ25lZScsICdyZXF1ZXN0ZWRPbicsICdpbnRlcmVzdHMnLCAnYWN0aW9uJ11cbiAgc2VsZWN0ZWRNaW5pc3RyeVR5cGU6IHN0cmluZyA9ICdtaW5pc3RyeSc7XG4gIG1pbmlzdHJ5RGF0YTogYW55ID0gW11cbiAgbWluaXN0cnlGdWxsRGF0YTogYW55ID0gW11cbiAgcm9sZU1hcHBpbmdGb3JtITogRm9ybUdyb3VwO1xuICBkaXNhYmxlQnRuID0gdHJ1ZVxuICBzZWN0b3JEYXRhID0gW1xuICAgIHtcbiAgICAgIHZhbHVlOiAnV29tZW4gYW5kIGNoaWxkIGRldmVsb3BtZW50J1xuICAgIH0sXG4gICAge1xuICAgICAgdmFsdWU6ICdSdXJhbCBkZXZlbG9wbWVudCdcbiAgICB9LFxuICAgIHtcbiAgICAgIHZhbHVlOiAnVXJiYW4gZGV2ZWxvcG1lbnQnXG4gICAgfSxcbiAgICB7XG4gICAgICB2YWx1ZTogJ0hlYWx0aGNhcmUnXG4gICAgfSxcbiAgICB7XG4gICAgICB2YWx1ZTogJ0FncmljdWx0dXJlJ1xuICAgIH0sXG4gICAge1xuICAgICAgdmFsdWU6ICdPdGhlcnMnXG4gICAgfVxuXG4gIF1cbiAgZGVwYXJ0bWVudERhdGEgPSBbXVxuICBsb2FkaW5nID0gZmFsc2VcbiAgbWF4RmlsZVNpemVNQiA9IDI1O1xuICBhbGxvd2VkVHlwZXMgPSBbXG4gICAgJ2FwcGxpY2F0aW9uL3BkZicsXG4gICAgJ2FwcGxpY2F0aW9uL21zd29yZCcsXG4gICAgJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLmRvY3VtZW50JyxcbiAgICAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsJyxcbiAgICAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQnLFxuICAgICd0ZXh0L3BsYWluJ1xuICBdO1xuICB1cGxvYWRFcnJvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHVwbG9hZGVkRmlsZTogRmlsZVtdIHwgbnVsbCA9IG51bGw7XG4gIGxvZ2luID0gZmFsc2VcbiAgY2JwRmluYWxPYmo6IGFueSA9IHt9XG4gIHNlbGVjdGVkTWluaXN0cnlJZCA9ICcnXG4gIG9yaWdpbmFsRm9ybVZhbHVlczogYW55XG4gIGNodW5rczogc3RyaW5nW10gPSBbXTtcbiAgZnVsbEpzb246IHN0cmluZyA9ICcnO1xuICBwYXJzZWREYXRhOiBhbnk7XG4gIGN1cnJlbnRQcm9jZXNzaW5nU3RhZ2U6IHN0cmluZyA9ICcnO1xuICBwcm9jZXNzaW5nU3RhZ2VzID0gW1xuICAgICdJbml0aWFsaXppbmcgQ0JQIFBsYW4gZ2VuZXJhdGlvbi4uLicsXG4gICAgJ0FuYWx5emluZyBkZXBhcnRtZW50YWwgY29tcGV0ZW5jeSByZXF1aXJlbWVudHMuLi4nLFxuICAgICdQcm9jZXNzaW5nIHdvcmsgb3JkZXIgc3BlY2lmaWNhdGlvbnMgYW5kIHJvbGUgZGVmaW5pdGlvbnMuLi4nLFxuICAgICdHZW5lcmF0aW5nIGRldGFpbGVkIHJvbGVzICYgcmVzcG9zaWJpbGl0aWVzLi4uJyxcbiAgICAnR2VuZXJhdGluZyBkZXRhaWxlZCBjb21wZXRlbmNpZXMuLi4nLFxuICAgICdWYWxpZGF0aW5nIHJvbGUgbWFwcGluZyAgYW5kIGZpbmFsaXppbmcgdGhlIENCUCBQbGFuJ1xuICBdO1xuICBAT3V0cHV0KCkgc3VjY2Vzc1JvbGVNYXBwaW5nID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KClcbiAgQE91dHB1dCgpIGFscmVhZHlBdmFpbGFibGVSb2xlTWFwcGluZyA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpXG4gIEBPdXRwdXQoKSBsb2dpblN1Y2Nlc3MgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKVxuICBzZWxlY3RlZE1pbmlzdHJ5T2JqOiBhbnkgPSAnJ1xuICBsb2dpblVzZXJPcmdJZHMgPSBbXVxuICBwYW5lbE9wZW4gPSBmYWxzZTtcbiAgZGVwYXJ0bWVudFBhbmVsT3BlbiA9IGZhbHNlXG4gIGZpbHRlcmVkTGlzdCA9IFtdO1xuICBmaWx0ZXJlZERlcGFydG1lbnRMaXN0ID0gW107XG4gIG9yaWdpbmFsTWluaXN0cnlEYXRhID0gW11cbiAgYXBpTG9hZGluZyA9IGZhbHNlXG4gIGZpcnN0QXBpUmVzcG9uc2U6IGFueSA9IG51bGxcbiAgZG9jdW1lbnRzID0gW11cbiAgZGlzYWJsZVVwbG9hZERvY3VtZW50ID0gdHJ1ZVxuICBkaXNhYmxlVXBsb2FkRG9jdW1lbnRPcmlnaW5hbCA9IHRydWVcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZXZlbnRTdmM6IEV2ZW50U2VydmljZSxcbiAgICBwdWJsaWMgc2hhcmVkU2VydmljZTogU2hhcmVkU2VydmljZSxcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIHNuYWNrQmFyOiBNYXRTbmFja0JhcixcbiAgICBwdWJsaWMgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHVibGljIHJvbGVNYXBwaW5nU2VydmljZTogUm9sZU1hcHBpbmdTZXJ2aWNlLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXJcbiAgKSB7XG4gICAgdGhpcy5yb3V0ZXIucm91dGVSZXVzZVN0cmF0ZWd5LnNob3VsZFJldXNlUm91dGUgPSAoKSA9PiBmYWxzZTtcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlPGFueT4oW10pXG4gICAgdGhpcy5pc01haW50ZW5hbmNlUGFnZSA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCcvbWFpbnRlbmFuY2UnKVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG5cbiAgICB0aGlzLmxvZ2luID0gdGhpcy5zaGFyZWRTZXJ2aWNlLmNoZWNrSWZMb2dpbigpXG5cbiAgICB0aGlzLmNicEZpbmFsT2JqID0gdGhpcy5zaGFyZWRTZXJ2aWNlLmdldENCUFBsYW5Mb2NhbFN0b3JhZ2UoKVxuICAgIGlmICh0aGlzLmNicEZpbmFsT2JqICYmIHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5ICYmIHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5Py5zYk9yZ1R5cGUpIHtcblxuXG4gICAgICB0aGlzLmVkaXRNaW5pc3RyeUZvcm0oKVxuICAgICAgLy8gdGhpcy5nZXRNaW5pc3RyeURhdGEoKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5sb2dpbikge1xuICAgICAgICB0aGlzLmdldE1pbmlzdHJ5RGF0YSgpXG4gICAgICB9XG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICBtaW5pc3RyeVR5cGU6IFsnbWluaXN0cnknLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgbWluaXN0cnk6IFtudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgc2VjdG9yczogW1tdXSxcbiAgICAgICAgZGVwYXJ0bWVudHM6IFtbXV0sIC8vIHNob3duIG9ubHkgaWYgbWluaXN0cnlUeXBlID09ICdzdGF0ZSdcbiAgICAgICAgYWRkaXRpb25hbERldGFpbHM6IFsnJ10sXG4gICAgICAgIGFkZGl0aW9uYWxfZG9jdW1lbnQ6IFtdXG4gICAgICB9KTtcbiAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnc2VjdG9ycycpPy5zZXRWYWx1ZShbXSk7XG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ21pbmlzdHJ5VHlwZScpPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHR5cGUgPT4ge1xuICAgICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5yZXNldCh7XG4gICAgICAgICAgbWluaXN0cnlUeXBlOiB0eXBlLCAvLyBLZWVwIHRoZSBjaGFuZ2VkIHZhbHVlXG4gICAgICAgICAgbWluaXN0cnk6IG51bGwsXG4gICAgICAgICAgc2VjdG9yczogW10sXG4gICAgICAgICAgZGVwYXJ0bWVudHM6IFtdLFxuICAgICAgICAgIGFkZGl0aW9uYWxEZXRhaWxzOiAnJyxcbiAgICAgICAgICBhZGRpdGlvbmFsX2RvY3VtZW50OiBbXVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdzdGF0ZScpIHtcbiAgICAgICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ2RlcGFydG1lbnRzJyk/LnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWRdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ2RlcGFydG1lbnRzJyk/LmNsZWFyVmFsaWRhdG9ycygpO1xuICAgICAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnZGVwYXJ0bWVudHMnKT8uc2V0VmFsdWUoW10pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnZGVwYXJ0bWVudHMnKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5zdGF0dXNDaGFuZ2VzLnN1YnNjcmliZSgoc3RhdHVzOiBhbnkpID0+IHtcbiAgICAgICAgbGV0IGhhc1VwbG9hZERvY3VtZW50cyA9IGZhbHNlXG4gICAgICAgIHRoaXMucm91dGVyLmV2ZW50cy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGhhc1VwbG9hZERvY3VtZW50cyA9XG4gICAgICAgICAgICB0aGlzLnJvdXRlci51cmwuaW5jbHVkZXMoJy91cGxvYWQtZG9jdW1lbnRzJyk7XG5cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghaGFzVXBsb2FkRG9jdW1lbnRzKSB7XG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNoZWNrUm9sZU1hcHBpbmdGb3JtVmFsaWRhdGlvbi5uZXh0KHN0YXR1cyk7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0dXMgPT09ICdWQUxJRCcpIHtcbiAgICAgICAgICB0aGlzLmRpc2FibGVVcGxvYWREb2N1bWVudCA9IGZhbHNlXG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnRPcmlnaW5hbCA9IGZhbHNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnQgPSB0cnVlXG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnRPcmlnaW5hbCA9IHRydWVcbiAgICAgICAgfVxuXG4gICAgICB9KTtcbiAgICB9XG5cblxuXG5cblxuXG4gIH1cblxuICBnZXRVcGxvYWRlZERvY3VtZW50cygpIHtcbiAgICBjb25zdCBmb3JtRGF0YSA9IHRoaXMucm9sZU1hcHBpbmdGb3JtLnZhbHVlO1xuICAgIHRoaXMuYXBpTG9hZGluZyA9IHRydWVcbiAgICBsZXQgcmVxQm9keSA9IHtcbiAgICAgIHN0YXRlX2NlbnRlcl9pZDogZm9ybURhdGEubWluaXN0cnksXG4gICAgICBpbmNsdWRlX3N1bW1hcnk6IHRydWUsXG4gICAgICBza2lwOiAwLFxuICAgICAgbGltaXQ6IDIwMFxuICAgIH1cbiAgICBpZiAoZm9ybURhdGE/LmRlcGFydG1lbnRzKSB7XG4gICAgICByZXFCb2R5WydkZXBhcnRtZW50X2lkJ10gPSBmb3JtRGF0YT8uZGVwYXJ0bWVudHNcbiAgICB9XG4gICAgdGhpcy5hcGlMb2FkaW5nID0gdHJ1ZVxuXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFVwbG9hZGVkRG9jdW1lbnRzKHJlcUJvZHkpLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICBpZiAocmVzICYmIHJlcz8uaXRlbXMgJiYgcmVzPy5pdGVtcz8ubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuYXBpTG9hZGluZyA9IGZhbHNlXG4gICAgICAgIHRoaXMuZG9jdW1lbnRzID0gcmVzPy5pdGVtc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kb2N1bWVudHMgPSBbXVxuICAgICAgICB0aGlzLmFwaUxvYWRpbmcgPSBmYWxzZVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBhc3luYyBlZGl0TWluaXN0cnlGb3JtKCkge1xuICAgIGlmICh0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeS5zYk9yZ1R5cGUgPT09ICdtaW5pc3RyeScpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRNaW5pc3RyeVR5cGUgPSB0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeS5zYk9yZ1R5cGVcbiAgICAgIGF3YWl0IHRoaXMuZ2V0TWluaXN0cnlEYXRhKClcbiAgICAgIGlmICh0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeT8uc2JPcmdUeXBlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2hhcmVkU2VydmljZS5nZXRDZW50ZXJCYXNlZERlcGFydG1lbnQodGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnk/LmlkZW50aWZpZXIpLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICAgICAgaWYgKHJlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmRlcGFydG1lbnREYXRhID0gcmVzXG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkRGVwYXJ0bWVudExpc3QgPSByZXNcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdObyBEZXBhcnRtZW50IEZvdW5kIGZvciBTZWxlY3RlZCBNaW5pc3RyeScsICdYJywge1xuICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ2RlcGFydG1lbnRfbmFtZSddID0gJydcbiAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ2RlcGFydG1lbnRzJ10gPSAnJ1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NicFBsYW5GaW5hbE9iaicsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmopKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgbWluaXN0cnlUeXBlOiBbdGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgIG1pbmlzdHJ5OiBbdGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnk/LmlkZW50aWZpZXIsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICBzZWN0b3JzOiBbW11dLFxuICAgICAgICBkZXBhcnRtZW50czogW3RoaXMuY2JwRmluYWxPYmo/LmRlcGFydG1lbnRzXSwgLy8gc2hvd24gb25seSBpZiBtaW5pc3RyeVR5cGUgPT0gJ3N0YXRlJ1xuICAgICAgICBhZGRpdGlvbmFsRGV0YWlsczogWycnXVxuICAgICAgfSk7XG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5zdGF0dXNDaGFuZ2VzLnN1YnNjcmliZSgoc3RhdHVzOiBhbnkpID0+IHtcbiAgICAgICAgbGV0IGhhc1VwbG9hZERvY3VtZW50cyA9IGZhbHNlXG4gICAgICAgIHRoaXMucm91dGVyLmV2ZW50cy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGhhc1VwbG9hZERvY3VtZW50cyA9XG4gICAgICAgICAgICB0aGlzLnJvdXRlci51cmwuaW5jbHVkZXMoJy91cGxvYWQtZG9jdW1lbnRzJyk7XG5cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghaGFzVXBsb2FkRG9jdW1lbnRzKSB7XG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNoZWNrUm9sZU1hcHBpbmdGb3JtVmFsaWRhdGlvbi5uZXh0KHN0YXR1cyk7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0dXMgPT09ICdWQUxJRCcpIHtcbiAgICAgICAgICB0aGlzLmRpc2FibGVVcGxvYWREb2N1bWVudCA9IGZhbHNlXG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnRPcmlnaW5hbCA9IGZhbHNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnQgPSB0cnVlXG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnRPcmlnaW5hbCA9IHRydWVcbiAgICAgICAgfVxuXG4gICAgICB9KTtcblxuICAgICAgLy8gdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdzZWN0b3JzJyk/LnNldFZhbHVlKFtdKTtcbiAgICAgIC8vIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnbWluaXN0cnlUeXBlJyk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodHlwZSA9PiB7XG4gICAgICAvLyAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLnJlc2V0KHtcbiAgICAgIC8vICAgICBtaW5pc3RyeVR5cGU6IHR5cGUsIC8vIEtlZXAgdGhlIGNoYW5nZWQgdmFsdWVcbiAgICAgIC8vICAgICBtaW5pc3RyeTogbnVsbCxcbiAgICAgIC8vICAgICBzZWN0b3JzOiBbXSxcbiAgICAgIC8vICAgICBkZXBhcnRtZW50czogW10sXG4gICAgICAvLyAgICAgYWRkaXRpb25hbERldGFpbHM6ICcnXG4gICAgICAvLyAgIH0pO1xuICAgICAgLy8gICBpZiAodHlwZSA9PT0gJ3N0YXRlJykge1xuICAgICAgLy8gICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnZGVwYXJ0bWVudHMnKT8uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZF0pO1xuICAgICAgLy8gICB9IGVsc2Uge1xuICAgICAgLy8gICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnZGVwYXJ0bWVudHMnKT8uY2xlYXJWYWxpZGF0b3JzKCk7XG4gICAgICAvLyAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdkZXBhcnRtZW50cycpPy5zZXRWYWx1ZShbXSk7XG4gICAgICAvLyAgIH1cbiAgICAgIC8vICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdkZXBhcnRtZW50cycpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAvLyB9KTtcblxuICAgICAgaWYgKHRoaXMubWluaXN0cnlEYXRhICYmIHRoaXMubWluaXN0cnlEYXRhLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkTWluaXN0cnlJZCA9IHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5Py5pZGVudGlmaWVyXG4gICAgICB9XG5cbiAgICAgIC8vdGhpcy5vbkdlbmVyYXRlUm9sZU1hcHBpbmcoKVxuICAgIH0gZWxzZSBpZiAodGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnk/LnNiT3JnVHlwZSA9PT0gJ3N0YXRlJykge1xuICAgICAgdGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSA9IHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5Py5zYk9yZ1R5cGVcbiAgICAgIGF3YWl0IHRoaXMuZ2V0TWluaXN0cnlEYXRhKClcbiAgICAgIGF3YWl0IHRoaXMuc2hhcmVkU2VydmljZS5nZXREZXBhcnRtZW50TGlzdCh0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeT8uaWRlbnRpZmllcikuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgICAgdGhpcy5kZXBhcnRtZW50RGF0YSA9IHJlc1xuICAgICAgICB0aGlzLmZpbHRlcmVkRGVwYXJ0bWVudExpc3QgPSByZXNcbiAgICAgICAgY29uc29sZS5sb2coJ3RoaXMuZmlsdGVyZWREZXBhcnRtZW50TGlzdCAtLScsIHRoaXMuZmlsdGVyZWREZXBhcnRtZW50TGlzdClcbiAgICAgIH0pXG4gICAgICBpZiAodGhpcy5taW5pc3RyeURhdGEgJiYgdGhpcy5taW5pc3RyeURhdGEubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRNaW5pc3RyeUlkID0gdGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnk/LmlkZW50aWZpZXJcbiAgICAgIH1cbiAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAgIG1pbmlzdHJ5VHlwZTogW3RoaXMuc2VsZWN0ZWRNaW5pc3RyeVR5cGUsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICBtaW5pc3RyeTogW3RoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5Py5pZGVudGlmaWVyLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgc2VjdG9yczogW1tdXSxcbiAgICAgICAgZGVwYXJ0bWVudHM6IFt0aGlzLmNicEZpbmFsT2JqPy5kZXBhcnRtZW50c10sIC8vIHNob3duIG9ubHkgaWYgbWluaXN0cnlUeXBlID09ICdzdGF0ZSdcbiAgICAgICAgYWRkaXRpb25hbERldGFpbHM6IFt0aGlzLmNicEZpbmFsT2JqPy5hZGRpdGlvbmFsRGV0YWlsc11cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5zdGF0dXNDaGFuZ2VzLnN1YnNjcmliZSgoc3RhdHVzOiBhbnkpID0+IHtcbiAgICAgICAgbGV0IGhhc1VwbG9hZERvY3VtZW50cyA9IGZhbHNlXG4gICAgICAgIHRoaXMucm91dGVyLmV2ZW50cy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGhhc1VwbG9hZERvY3VtZW50cyA9XG4gICAgICAgICAgICB0aGlzLnJvdXRlci51cmwuaW5jbHVkZXMoJy91cGxvYWQtZG9jdW1lbnRzJyk7XG5cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghaGFzVXBsb2FkRG9jdW1lbnRzKSB7XG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNoZWNrUm9sZU1hcHBpbmdGb3JtVmFsaWRhdGlvbi5uZXh0KHN0YXR1cyk7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0dXMgPT09ICdWQUxJRCcpIHtcbiAgICAgICAgICB0aGlzLmRpc2FibGVVcGxvYWREb2N1bWVudCA9IGZhbHNlXG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnRPcmlnaW5hbCA9IGZhbHNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnQgPSB0cnVlXG4gICAgICAgICAgdGhpcy5kaXNhYmxlVXBsb2FkRG9jdW1lbnRPcmlnaW5hbCA9IHRydWVcbiAgICAgICAgfVxuXG4gICAgICB9KTtcblxuICAgICAgLy8gdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdzZWN0b3JzJyk/LnNldFZhbHVlKFtdKTtcbiAgICAgIC8vIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnbWluaXN0cnlUeXBlJyk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodHlwZSA9PiB7XG4gICAgICAvLyAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLnJlc2V0KHtcbiAgICAgIC8vICAgICBtaW5pc3RyeVR5cGU6IHR5cGUsIC8vIEtlZXAgdGhlIGNoYW5nZWQgdmFsdWVcbiAgICAgIC8vICAgICBtaW5pc3RyeTogbnVsbCxcbiAgICAgIC8vICAgICBzZWN0b3JzOiBbXSxcbiAgICAgIC8vICAgICBkZXBhcnRtZW50czogW10sXG4gICAgICAvLyAgICAgYWRkaXRpb25hbERldGFpbHM6ICcnXG4gICAgICAvLyAgIH0pO1xuICAgICAgLy8gICBpZiAodHlwZSA9PT0gJ3N0YXRlJykge1xuICAgICAgLy8gICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnZGVwYXJ0bWVudHMnKT8uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZF0pO1xuICAgICAgLy8gICB9IGVsc2Uge1xuICAgICAgLy8gICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnZGVwYXJ0bWVudHMnKT8uY2xlYXJWYWxpZGF0b3JzKCk7XG4gICAgICAvLyAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdkZXBhcnRtZW50cycpPy5zZXRWYWx1ZShbXSk7XG4gICAgICAvLyAgIH1cbiAgICAgIC8vICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdkZXBhcnRtZW50cycpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAvLyB9KTtcbiAgICAgIGNvbnNvbGUubG9nKCd0aGlzLm1pbmlzdHJ5RGF0YScsIHRoaXMubWluaXN0cnlEYXRhKVxuICAgICAgaWYgKHRoaXMubWluaXN0cnlEYXRhICYmIHRoaXMubWluaXN0cnlEYXRhLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkTWluaXN0cnlJZCA9IHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5Py5pZGVudGlmaWVyXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMub3JpZ2luYWxGb3JtVmFsdWVzID0gdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0UmF3VmFsdWUoKTtcbiAgICB0aGlzLmdldFVwbG9hZGVkRG9jdW1lbnRzKClcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCkge1xuICAgIHRoaXMubG9naW4gPSB0aGlzLmxvZ2luU3RhdHVzRmxhZ1xuXG4gIH1cblxuICBnZXRDaGFuZ2VkRmllbGRzKG9yaWdpbmFsOiBhbnksIGN1cnJlbnQ6IGFueSk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjaGFuZ2VkS2V5czogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3Qga2V5IGluIG9yaWdpbmFsKSB7XG4gICAgICBpZiAoIW9yaWdpbmFsLmhhc093blByb3BlcnR5KGtleSkpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBvcmlnaW5hbFZhbHVlID0gb3JpZ2luYWxba2V5XTtcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRba2V5XTtcblxuICAgICAgLy8gRm9yIGFycmF5cyBhbmQgb2JqZWN0cywgdXNlIEpTT04uc3RyaW5naWZ5IChvciBsb2Rhc2ggaXNFcXVhbCBmb3IgZGVlcCBjb21wYXJpc29uKVxuICAgICAgY29uc3QgaXNFcXVhbCA9XG4gICAgICAgIHR5cGVvZiBvcmlnaW5hbFZhbHVlID09PSAnb2JqZWN0J1xuICAgICAgICAgID8gSlNPTi5zdHJpbmdpZnkob3JpZ2luYWxWYWx1ZSkgPT09IEpTT04uc3RyaW5naWZ5KGN1cnJlbnRWYWx1ZSlcbiAgICAgICAgICA6IG9yaWdpbmFsVmFsdWUgPT09IGN1cnJlbnRWYWx1ZTtcblxuICAgICAgaWYgKCFpc0VxdWFsKSB7XG4gICAgICAgIGNoYW5nZWRLZXlzLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2hhbmdlZEtleXM7XG4gIH1cblxuICBvbkdlbmVyYXRlUm9sZU1hcHBpbmcoKTogYW55IHtcblxuICAgIGNvbnN0IGN1cnJlbnRGb3JtVmFsdWVzID0gdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0UmF3VmFsdWUoKTtcbiAgICBjb25zdCBmb3JtRGF0YTogYW55ID0gbmV3IEZvcm1EYXRhKCk7XG5cbiAgICBmb3JtRGF0YS5hcHBlbmQoJ21pbmlzdHJ5VHlwZScsIGN1cnJlbnRGb3JtVmFsdWVzLm1pbmlzdHJ5VHlwZSk7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdtaW5pc3RyeScsIGN1cnJlbnRGb3JtVmFsdWVzLm1pbmlzdHJ5KTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ3NlY3RvcnMnLCBKU09OLnN0cmluZ2lmeShjdXJyZW50Rm9ybVZhbHVlcy5zZWN0b3JzKSk7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdkZXBhcnRtZW50cycsIEpTT04uc3RyaW5naWZ5KGN1cnJlbnRGb3JtVmFsdWVzLmRlcGFydG1lbnRzKSk7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdhZGRpdGlvbmFsRGV0YWlscycsIGN1cnJlbnRGb3JtVmFsdWVzLmFkZGl0aW9uYWxEZXRhaWxzIHx8ICcnKTtcbiAgICBjb25zdCBmaWxlOiBGaWxlID0gdGhpcy51cGxvYWRlZEZpbGUgfHwgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdhZGRpdGlvbmFsX2RvY3VtZW50Jyk/LnZhbHVlO1xuICAgIGNvbnNvbGUubG9nKCdmaWxlJywgZmlsZSlcbiAgICBpZiAoZmlsZSkge1xuICAgICAgZm9ybURhdGEuYXBwZW5kKCdhZGRpdGlvbmFsX2RvY3VtZW50JywgZmlsZSk7XG4gICAgfVxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ2RlcGFydG1lbnRzJ10gPSBjdXJyZW50Rm9ybVZhbHVlcz8uZGVwYXJ0bWVudHNcbiAgICBjb25zdCBkZXBhcnRtZW50TmFtZSA9IHRoaXMuZGVwYXJ0bWVudERhdGEuZmluZCh1ID0+IHUuaWRlbnRpZmllciA9PT0gY3VycmVudEZvcm1WYWx1ZXMuZGVwYXJ0bWVudHMpO1xuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ2RlcGFydG1lbnRfbmFtZSddID0gZGVwYXJ0bWVudE5hbWU/Lm9yZ05hbWVcbiAgICBjb25zdCBzZWxlY3RlZE1pbmlzdHJ5ID0gdGhpcy5taW5pc3RyeURhdGEuZmluZChpdGVtID0+XG4gICAgICBpdGVtLmlkZW50aWZpZXIgPT09IGN1cnJlbnRGb3JtVmFsdWVzLm1pbmlzdHJ5XG4gICAgKTtcblxuICAgIHRoaXMuc2VsZWN0ZWRNaW5pc3RyeU9iaiA9IHNlbGVjdGVkTWluaXN0cnk7XG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsnbWluaXN0cnknXSA9IHNlbGVjdGVkTWluaXN0cnlcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2JwUGxhbkZpbmFsT2JqJywgSlNPTi5zdHJpbmdpZnkodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iaikpXG4gICAgY29uc29sZS5sb2coJ3RoaXMucm9sZU1hcHBpbmdGb3JtJywgdGhpcy5yb2xlTWFwcGluZ0Zvcm0pXG4gICAgY29uc29sZS5sb2coJ2Zvcm1EYXRhLS0nLCBmb3JtRGF0YSlcbiAgICBmb3IgKGNvbnN0IHBhaXIgb2YgZm9ybURhdGEuZW50cmllcygpKSB7XG4gICAgICBjb25zb2xlLmxvZyhgJHtwYWlyWzBdfTpgLCBwYWlyWzFdKTtcbiAgICB9XG5cblxuICAgIGNvbnN0IGNoYW5nZWRGaWVsZHMgPSB0aGlzLmdldENoYW5nZWRGaWVsZHModGhpcy5vcmlnaW5hbEZvcm1WYWx1ZXMsIGN1cnJlbnRGb3JtVmFsdWVzKTtcblxuICAgIGlmIChjaGFuZ2VkRmllbGRzLmxlbmd0aCA+IDAgfHwgKGZpbGUgJiYgZmlsZS5zaXplID4gMCkpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdjaGFuZ2VkRmllbGRzJywgY2hhbmdlZEZpZWxkcylcbiAgICAgIGNvbnNvbGUubG9nKCdDaGFuZ2VkIGZpZWxkczonLCBjaGFuZ2VkRmllbGRzKTtcbiAgICAgIGlmIChjaGFuZ2VkRmllbGRzLmluY2x1ZGVzKCdhZGRpdGlvbmFsRGV0YWlscycpICYmIHRoaXMucm9sZU1hcHBpbmdGb3JtLnZhbHVlLmFkZGl0aW9uYWxEZXRhaWxzPy50cmltKCkgfHwgKGZpbGUgJiYgZmlsZS5zaXplID4gMCkpIHtcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihEZWxldGVSb2xlTWFwcGluZ1BvcHVwQ29tcG9uZW50LCB7XG4gICAgICAgICAgd2lkdGg6ICc0MDBweCcsXG4gICAgICAgICAgZGF0YTogJycsXG4gICAgICAgICAgcGFuZWxDbGFzczogJ3ZpZXctY2JwLXBsYW4tcG9wdXAnLFxuICAgICAgICAgIG1pbkhlaWdodDogJzMwMHB4JywgICAgICAgICAgLy8gU2V0IG1pbmltdW0gaGVpZ2h0XG4gICAgICAgICAgbWF4SGVpZ2h0OiAnODB2aCcsICAgICAgICAgICAvLyBQcmV2ZW50IGl0IGZyb20gZ29pbmcgYmV5b25kIHZpZXdwb3J0XG4gICAgICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlIC8vIE9wdGlvbmFsOiBwcmV2ZW50IGNsb3Npbmcgd2l0aCBvdXRzaWRlIGNsaWNrXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgICAgIGFsZXJ0KHJlc3VsdClcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSAnc2F2ZWQnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnQ2hhbmdlcyBzYXZlZCEnKTtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWVcbiAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5kZWxldGVSb2xlTWFwcGluZ0J5U3RhdGVBbmREZXBhcnRtZW50KHRoaXMucm9sZU1hcHBpbmdGb3JtLnZhbHVlLm1pbmlzdHJ5LCB0aGlzLnJvbGVNYXBwaW5nRm9ybS52YWx1ZS5kZXBhcnRtZW50cykuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFN1Y2Nlc3MgaGFuZGxpbmdcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnU3VjY2VzczonLCByZXMpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5maXJzdEFwaVJlc3BvbnNlID0gW11cbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRmluYWxSb2xlTWFwcGluZygpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcnN0QXBpUmVzcG9uc2UgPSBbXVxuICAgICAgICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihlcnJvcj8uZXJyb3I/LmRldGFpbCwgJ1gnLCB7XG4gICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItZXJyb3InXVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5nZW5lcmF0ZUZpbmFsUm9sZU1hcHBpbmcoKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUZpbmFsUm9sZU1hcHBpbmcoKVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmdlbmVyYXRlRmluYWxSb2xlTWFwcGluZygpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVGaW5hbFJvbGVNYXBwaW5nKClcbiAgICAgIGNvbnNvbGUubG9nKCdObyBjaGFuZ2VzIGRldGVjdGVkLicpO1xuICAgIH1cblxuICB9XG5cblxuICBnZXRNaW5pc3RyeURhdGEoKSB7XG4gICAgdGhpcy5hcGlMb2FkaW5nID0gdHJ1ZVxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRNaW5pc3RyeURhdGEodGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSkuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCdkYXRhLS0nLCBkYXRhKVxuICAgICAgdGhpcy5taW5pc3RyeUZ1bGxEYXRhID0gZGF0YVxuICAgICAgdGhpcy5hcGlMb2FkaW5nID0gZmFsc2VcbiAgICAgIHRoaXMubWluaXN0cnlEYXRhID0gW11cbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlID09PSAnbWluaXN0cnknKSB7XG4gICAgICAgIGRhdGEuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChpdGVtPy5zYk9yZ1R5cGUgPT09ICdtaW5pc3RyeScpIHtcbiAgICAgICAgICAgIHRoaXMubWluaXN0cnlEYXRhLnB1c2goaXRlbSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRNaW5pc3RyeVR5cGUgPT09ICdzdGF0ZScpIHtcbiAgICAgICAgZGF0YS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgaWYgKGl0ZW0/LnNiT3JnVHlwZSA9PT0gJ3N0YXRlJykge1xuICAgICAgICAgICAgdGhpcy5taW5pc3RyeURhdGEucHVzaChpdGVtKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5nZXRVc2VyUHJvZmlsZURhdGEoKVxuICAgIH0pXG4gIH1cblxuICBhc3luYyBvbk1pbmlzdHJ5VHlwZUNoYW5nZShldmVudCkge1xuICAgIGNvbnNvbGUubG9nKCdldmVudCcsIGV2ZW50KVxuXG4gICAgaWYgKHRoaXMubG9naW4pIHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0TWluaXN0cnlEYXRhKClcbiAgICB9XG5cbiAgIFxuXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsnbWluaXN0cnlUeXBlJ10gPSBldmVudC52YWx1ZVxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ3JvbGVfbWFwcGluZ19nZW5lcmF0aW9uJ10gPSBbXVxuICAgIHRoaXMuc2VsZWN0ZWRNaW5pc3RyeVR5cGUgPSBldmVudC52YWx1ZVxuXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NicFBsYW5GaW5hbE9iaicsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmopKVxuICAgIHRoaXMubWluaXN0cnlEYXRhID0gW11cbiAgICBpZiAoZXZlbnQ/LnZhbHVlID09PSAnc3RhdGUnKSB7XG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ21pbmlzdHJ5Jyk/LnNldFZhbHVlKG51bGwpO1xuICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdzZWN0b3JzJyk/LnNldFZhbHVlKFtdKTtcbiAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnZGVwYXJ0bWVudHMnKT8uc2V0VmFsdWUoW10pO1xuICAgICAgdGhpcy5taW5pc3RyeUZ1bGxEYXRhLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKGl0ZW0/LnR5cGUgPT09ICdzdGF0ZScpIHtcbiAgICAgICAgICB0aGlzLm1pbmlzdHJ5RGF0YS5wdXNoKGl0ZW0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSBlbHNlIGlmIChldmVudD8udmFsdWUgPT09ICdtaW5pc3RyeScpIHtcbiAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnbWluaXN0cnknKT8uc2V0VmFsdWUobnVsbCk7XG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ3NlY3RvcnMnKT8uc2V0VmFsdWUoW10pO1xuICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0KCdkZXBhcnRtZW50cycpPy5zZXRWYWx1ZShbXSk7XG4gICAgICB0aGlzLm1pbmlzdHJ5RnVsbERhdGEuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoaXRlbT8udHlwZSA9PT0gJ2NlbnRyYWwnKSB7XG4gICAgICAgICAgdGhpcy5taW5pc3RyeURhdGEucHVzaChpdGVtKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICBcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydtaW5pc3RyeSddID0gJydcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydkZXBhcnRtZW50X25hbWUnXSA9ICcnXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsnZGVwYXJ0bWVudHMnXSA9ICcnXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NicFBsYW5GaW5hbE9iaicsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmopKVxuICAgIC8vIHRoaXMucm9sZU1hcHBpbmdGb3JtLnJlc2V0KClcbiAgICBpZiAoIXRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmo/Lm1pbmlzdHJ5KSB7XG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5zZXRFcnJvcnMoeyBpbnZhbGlkOiB0cnVlIH0pO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgIHRoaXMuZGlzYWJsZVVwbG9hZERvY3VtZW50ID0gdHJ1ZVxuICAgICAgICAgIHRoaXMuZGlzYWJsZVVwbG9hZERvY3VtZW50T3JpZ2luYWwgPSB0cnVlXG4gICAgICB9LCA1MDAwKVxuICAgIH1cbiAgfVxuXG4gIG9uTWluaXN0cnlDaGFuZ2UoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IHNlbGVjdGVkTWluaXN0cnlJZCA9IGV2ZW50LnZhbHVlO1xuICAgIGNvbnNvbGUubG9nKCdTZWxlY3RlZCBNaW5pc3RyeSBJRDonLCBzZWxlY3RlZE1pbmlzdHJ5SWQpO1xuICAgIHRoaXMuZGVwYXJ0bWVudERhdGEgPSBbXVxuICAgIC8vIFlvdSBjYW4gYWNjZXNzIHRoZSBzZWxlY3RlZCBvYmplY3QgaWYgbmVlZGVkXG4gICAgY29uc3Qgc2VsZWN0ZWRNaW5pc3RyeSA9IHRoaXMubWluaXN0cnlEYXRhLmZpbmQoaXRlbSA9PiBpdGVtLmlkZW50aWZpZXIgPT09IHNlbGVjdGVkTWluaXN0cnlJZCk7XG4gICAgdGhpcy5zZWxlY3RlZE1pbmlzdHJ5T2JqID0gc2VsZWN0ZWRNaW5pc3RyeVxuICAgIGNvbnNvbGUubG9nKCdTZWxlY3RlZCBNaW5pc3RyeTonLCBzZWxlY3RlZE1pbmlzdHJ5KTsgYGBcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydtaW5pc3RyeSddID0gc2VsZWN0ZWRNaW5pc3RyeVxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ3JvbGVfbWFwcGluZ19nZW5lcmF0aW9uJ10gPSBbXVxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYnBQbGFuRmluYWxPYmonLCBKU09OLnN0cmluZ2lmeSh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqKSlcbiAgICBpZiAoc2VsZWN0ZWRNaW5pc3RyeUlkICYmIHRoaXMuc2VsZWN0ZWRNaW5pc3RyeVR5cGUgPT09ICdzdGF0ZScpIHtcbiAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXREZXBhcnRtZW50TGlzdChzZWxlY3RlZE1pbmlzdHJ5SWQpLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICAgIHRoaXMuZGVwYXJ0bWVudERhdGEgPSByZXNcbiAgICAgICAgdGhpcy5maWx0ZXJlZERlcGFydG1lbnRMaXN0ID0gcmVzXG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAoc2VsZWN0ZWRNaW5pc3RyeUlkICYmIHRoaXMuc2VsZWN0ZWRNaW5pc3RyeVR5cGUgPT09ICdtaW5pc3RyeScpIHtcbiAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRDZW50ZXJCYXNlZERlcGFydG1lbnQoc2VsZWN0ZWRNaW5pc3RyeUlkKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgICBpZiAocmVzPy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmRlcGFydG1lbnREYXRhID0gcmVzXG4gICAgICAgICAgdGhpcy5maWx0ZXJlZERlcGFydG1lbnRMaXN0ID0gcmVzXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdObyBEZXBhcnRtZW50IEZvdW5kIGZvciBTZWxlY3RlZCBNaW5pc3RyeScsICdYJywge1xuICAgICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgICBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLWVycm9yJ11cbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydkZXBhcnRtZW50X25hbWUnXSA9ICcnXG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsnZGVwYXJ0bWVudHMnXSA9ICcnXG4gICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NicFBsYW5GaW5hbE9iaicsIEpTT04uc3RyaW5naWZ5KHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmopKVxuICAgICAgICB9XG5cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdGhpcy5nZXRVcGxvYWRlZERvY3VtZW50cygpXG4gIH1cblxuICBzZWFyY2hEYXRhKCkge1xuXG4gIH1cblxuICBhcHBseUZpbHRlcigpIHtcblxuICB9XG5cbiAgZG93bmxvYWRQREYoKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMucGRmQ29udGVudC5uYXRpdmVFbGVtZW50O1xuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIG1hcmdpbjogMC41LFxuICAgICAgZmlsZW5hbWU6ICdDQlBfUGxhbi5wZGYnLFxuICAgICAgaW1hZ2U6IHsgdHlwZTogJ2pwZWcnLCBxdWFsaXR5OiAwLjk4IH0sXG4gICAgICBodG1sMmNhbnZhczoge1xuICAgICAgICBzY2FsZTogMixcbiAgICAgICAgdXNlQ09SUzogdHJ1ZSwgIC8vIEltcG9ydGFudCBmb3IgZXh0ZXJuYWwgaW1hZ2VzL2ljb25zXG4gICAgICB9LFxuICAgICAganNQREY6IHtcbiAgICAgICAgdW5pdDogJ2luJyxcbiAgICAgICAgZm9ybWF0OiAnYTQnLFxuICAgICAgICBvcmllbnRhdGlvbjogJ3BvcnRyYWl0J1xuICAgICAgfVxuICAgIH07XG5cbiAgICBodG1sMnBkZigpLmZyb20oZWxlbWVudCkuc2V0KG9wdGlvbnMpLnNhdmUoKTtcblxuICB9XG5cbiAgb25GaWxlQ2hhbmdlKGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCBmaWxlczogRmlsZUxpc3QgPSBldmVudC50YXJnZXQuZmlsZXM7XG4gICAgY29uc3QgbWF4RmlsZXMgPSAzO1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ2FkZGl0aW9uYWxfZG9jdW1lbnQnKTtcblxuICAgIC8vIEFsd2F5cyBjbGVhciBjb250cm9sIGZpcnN0IChwcmV2ZW50cyBvbGQgdmFsaWQgdmFsdWUpXG4gICAgY29udHJvbD8ucmVzZXQoKTtcbiAgICBjb250cm9sPy5zZXRFcnJvcnMobnVsbCk7XG4gICAgdGhpcy51cGxvYWRlZEZpbGUgPSBbXTtcbiAgICB0aGlzLnVwbG9hZEVycm9yID0gbnVsbDtcblxuICAgIGlmICghZmlsZXMgfHwgZmlsZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAvLyBMaW1pdCBjaGVja1xuICAgIGlmIChmaWxlcy5sZW5ndGggPiBtYXhGaWxlcykge1xuICAgICAgdGhpcy51cGxvYWRFcnJvciA9IGBZb3UgY2FuIHVwbG9hZCBhIG1heGltdW0gb2YgJHttYXhGaWxlc30gZmlsZXNgO1xuICAgICAgY29udHJvbD8uc2V0RXJyb3JzKHsgbWF4RmlsZXM6IHRydWUgfSk7XG4gICAgICBjb250cm9sPy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgY29udHJvbD8ubWFya0FzVG91Y2hlZCgpO1xuICAgICAgY29udHJvbD8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkRmlsZXM6IEZpbGVbXSA9IFtdO1xuICAgIGNvbnN0IGludmFsaWRGaWxlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBtYXhCeXRlcyA9IHRoaXMubWF4RmlsZVNpemVNQiAqIDEwMjQgKiAxMDI0O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZmlsZSA9IGZpbGVzW2ldO1xuXG4gICAgICAvLyBTaXplIGNoZWNrXG4gICAgICBpZiAoZmlsZS5zaXplID4gbWF4Qnl0ZXMpIHtcbiAgICAgICAgaW52YWxpZEZpbGVzLnB1c2goYCR7ZmlsZS5uYW1lfSAoZXhjZWVkcyAke3RoaXMubWF4RmlsZVNpemVNQn1NQilgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFR5cGUgY2hlY2tcbiAgICAgIGlmICghdGhpcy5hbGxvd2VkVHlwZXMuaW5jbHVkZXMoZmlsZS50eXBlKSkge1xuICAgICAgICBpbnZhbGlkRmlsZXMucHVzaChgJHtmaWxlLm5hbWV9IChpbnZhbGlkIHR5cGUpYCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YWxpZEZpbGVzLnB1c2goZmlsZSk7XG4gICAgfVxuXG4gICAgLy8g4p2MIE5PIHZhbGlkIGZpbGVzIOKGkiBmb3JtIE1VU1QgQkUgaW52YWxpZFxuICAgIGlmICh2YWxpZEZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy51cGxvYWRFcnJvciA9IGBJbnZhbGlkIGZpbGUocyk6ICR7aW52YWxpZEZpbGVzLmpvaW4oJywgJyl9YDtcblxuICAgICAgY29udHJvbD8uc2V0VmFsdWUobnVsbCk7XG4gICAgICBjb250cm9sPy5zZXRFcnJvcnMoeyBpbnZhbGlkRmlsZXM6IHRydWUgfSk7XG4gICAgICBjb250cm9sPy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgY29udHJvbD8ubWFya0FzVG91Y2hlZCgpO1xuICAgICAgY29udHJvbD8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IG9ubHlTZWxmOiB0cnVlLCBlbWl0RXZlbnQ6IHRydWUgfSk7XG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5zZXRFcnJvcnMoeyBpbnZhbGlkOiB0cnVlIH0pO1xuICAgICAgdGhpcy5yb2xlTWFwcGluZ0Zvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgIH0sIDUwMDApXG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDinJQgQXQgbGVhc3QgT05FIHZhbGlkIGZpbGUg4oaSIGZvcm0gc2hvdWxkIGJlIFZBTElEXG4gICAgdGhpcy51cGxvYWRlZEZpbGUgPSB2YWxpZEZpbGVzO1xuXG4gICAgaWYgKGludmFsaWRGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnVwbG9hZEVycm9yID0gYFNvbWUgZmlsZXMgd2VyZSBza2lwcGVkOiAke2ludmFsaWRGaWxlcy5qb2luKCcsICcpfWA7XG4gICAgfVxuXG4gICAgY29udHJvbD8uc2V0VmFsdWUodmFsaWRGaWxlcyk7XG4gICAgY29udHJvbD8uc2V0RXJyb3JzKG51bGwpO1xuICAgIGNvbnRyb2w/Lm1hcmtBc0RpcnR5KCk7XG4gICAgY29udHJvbD8ubWFya0FzVG91Y2hlZCgpO1xuICAgIGNvbnRyb2w/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBvbmx5U2VsZjogdHJ1ZSwgZW1pdEV2ZW50OiB0cnVlIH0pO1xuICB9XG5cblxuXG5cblxuXG4gIGxvZ2luU3RhdHVzKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICB0aGlzLmxvZ2luID0gdHJ1ZVxuICAgICAgdGhpcy5sb2dpblN1Y2Nlc3MuZW1pdCh0cnVlKVxuICAgICAgdGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSA9ICdtaW5pc3RyeSdcblxuICAgICAgdGhpcy5nZXRNaW5pc3RyeURhdGEoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvZ2luID0gZmFsc2VcbiAgICB9XG4gIH1cblxuICBnZW5lcmF0ZUZpbmFsUm9sZU1hcHBpbmcoKSB7XG4gICAgdGhpcy5hcGlMb2FkaW5nID0gdHJ1ZTtcblxuICAgIGlmICghdGhpcy5yb2xlTWFwcGluZ0Zvcm0udmFsaWQpIHtcbiAgICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLm1hcmtBbGxBc1RvdWNoZWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50Rm9ybVZhbHVlcyA9IHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldFJhd1ZhbHVlKCk7XG4gICAgbGV0IGZvcm1VcGxvYWREYXRhID0gbmV3IEZvcm1EYXRhKCk7XG5cbiAgICAvLyBNaW5pc3RyeSBzZWxlY3Rpb25cbiAgICBjb25zdCBzZWxlY3RlZE1pbmlzdHJ5ID0gdGhpcy5taW5pc3RyeURhdGEuZmluZChpdGVtID0+XG4gICAgICBpdGVtLmlkZW50aWZpZXIgPT09IGN1cnJlbnRGb3JtVmFsdWVzLm1pbmlzdHJ5XG4gICAgKTtcblxuICAgIHRoaXMuc2VsZWN0ZWRNaW5pc3RyeU9iaiA9IHNlbGVjdGVkTWluaXN0cnk7XG5cbiAgICAvLyBBcHBlbmQgYmFzZSBmaWVsZHNcbiAgICBmb3JtVXBsb2FkRGF0YS5hcHBlbmQoJ3N0YXRlX2NlbnRlcl9pZCcsIGN1cnJlbnRGb3JtVmFsdWVzLm1pbmlzdHJ5IHx8ICcnKTtcbiAgICBmb3JtVXBsb2FkRGF0YS5hcHBlbmQoJ3N0YXRlX2NlbnRlcl9uYW1lJywgc2VsZWN0ZWRNaW5pc3RyeT8ub3JnTmFtZSB8fCAnJyk7XG5cbiAgICBpZiAoY3VycmVudEZvcm1WYWx1ZXMuZGVwYXJ0bWVudHMpIHtcbiAgICAgIGZvcm1VcGxvYWREYXRhLmFwcGVuZCgnZGVwYXJ0bWVudF9pZCcsIGN1cnJlbnRGb3JtVmFsdWVzLmRlcGFydG1lbnRzKTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudEZvcm1WYWx1ZXMuYWRkaXRpb25hbERldGFpbHMpIHtcbiAgICAgIGZvcm1VcGxvYWREYXRhLmFwcGVuZCgnaW5zdHJ1Y3Rpb24nLCBjdXJyZW50Rm9ybVZhbHVlcy5hZGRpdGlvbmFsRGV0YWlscyk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHVwbG9hZGVkIGZpbGUocylcbiAgICBjb25zdCBmaWxlczogRmlsZSB8IEZpbGVbXSA9XG4gICAgICB0aGlzLnVwbG9hZGVkRmlsZSB8fCB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ2FkZGl0aW9uYWxfZG9jdW1lbnQnKT8udmFsdWU7XG5cbiAgICBjb25zb2xlLmxvZygnRmlsZXMgc2VsZWN0ZWQ6JywgZmlsZXMpO1xuXG4gICAgLy8gQXBwZW5kIHNpbmdsZSBvciBtdWx0aXBsZSBmaWxlc1xuICAgIGlmIChmaWxlcykge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmlsZXMpKSB7XG4gICAgICAgIGZpbGVzLmZvckVhY2goKGZpbGU6IEZpbGUpID0+IHtcbiAgICAgICAgICBmb3JtVXBsb2FkRGF0YS5hcHBlbmQoJ2FkZGl0aW9uYWxfZG9jdW1lbnQnLCBmaWxlLCBmaWxlLm5hbWUpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvcm1VcGxvYWREYXRhLmFwcGVuZCgnYWRkaXRpb25hbF9kb2N1bWVudCcsIGZpbGVzLCBmaWxlcy5uYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWJ1ZzogcHJpbnQgRm9ybURhdGFcbiAgICBjb25zb2xlLmxvZyhcIkZvcm1EYXRhIERlYnVnOlwiKTtcbiAgICBmb3JtVXBsb2FkRGF0YS5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAke2tleX06IEZJTEUgLT4gJHt2YWx1ZS5uYW1lfSAoJHt2YWx1ZS5zaXplfSBieXRlcylgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAke2tleX06ICR7dmFsdWV9YCk7XG4gICAgICB9XG4gICAgfSk7XG5cblxuICAgIC8vIEJ1aWxkIHJlcXVlc3QgYm9keSBmb3IgcG9sbGluZyBBUElcbiAgICBsZXQgcmVxOiBhbnkgPSB7XG4gICAgICBzdGF0ZV9jZW50ZXJfaWQ6IGN1cnJlbnRGb3JtVmFsdWVzLm1pbmlzdHJ5LFxuICAgICAgaW5zdHJ1Y3Rpb246IGN1cnJlbnRGb3JtVmFsdWVzLmFkZGl0aW9uYWxEZXRhaWxzLFxuICAgICAgc3RhdGVfY2VudGVyX25hbWU6IHNlbGVjdGVkTWluaXN0cnk/Lm9yZ05hbWVcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRNaW5pc3RyeVR5cGUgPT09ICdzdGF0ZScgfHwgY3VycmVudEZvcm1WYWx1ZXMuZGVwYXJ0bWVudHMpIHtcbiAgICAgIGNvbnN0IGRlcGFydG1lbnROYW1lID0gdGhpcy5kZXBhcnRtZW50RGF0YS5maW5kKFxuICAgICAgICBkID0+IGQuaWRlbnRpZmllciA9PT0gY3VycmVudEZvcm1WYWx1ZXMuZGVwYXJ0bWVudHNcbiAgICAgICk7XG5cbiAgICAgIHJlcS5kZXBhcnRtZW50X2lkID0gY3VycmVudEZvcm1WYWx1ZXMuZGVwYXJ0bWVudHMgfHwgJyc7XG4gICAgICByZXEuZGVwYXJ0bWVudF9uYW1lID0gZGVwYXJ0bWVudE5hbWU/Lm9yZ05hbWUgfHwgJyc7XG4gICAgfVxuXG5cblxuICAgIC8vIFBvbGxpbmcgQVBJXG4gICAgY29uY2F0KFxuICAgICAgb2YobnVsbCksICAgICAgICAgICAgICAvLyDwn5SlIGltbWVkaWF0ZSBmaXJzdCBlbWlzc2lvblxuICAgICAgaW50ZXJ2YWwoNTAwMCkgICAgICAgICAvLyDij7Egc3Vic2VxdWVudCBwb2xsaW5nIGV2ZXJ5IDVzXG4gICAgKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuc2hhcmVkU2VydmljZS5nZW5lcmF0ZVJvbGVNYXBwaW5nKHJlcSwgZmlsZXMpKSxcbiAgICAgICAgdGFwKGRhdGEgPT4ge1xuICAgICAgICAgIGlmICghdGhpcy5maXJzdEFwaVJlc3BvbnNlKSB7XG4gICAgICAgICAgICB0aGlzLmZpcnN0QXBpUmVzcG9uc2UgPSBkYXRhOyAvLyDwn5GIIHN0b3JlIGZpcnN0IHJlc3BvbnNlXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRmlyc3QgQVBJIHJlc3BvbnNlOicsIHRoaXMuZmlyc3RBcGlSZXNwb25zZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlV2hpbGUoKGRhdGE6IGFueSkgPT4gZGF0YT8uc3RhdHVzICE9PSAnQ09NUExFVEVEJywgdHJ1ZSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdyb2xlIG1hcHBpbmcgZGF0YS0tJywgZGF0YSlcbiAgICAgICAgaWYgKHRoaXMuZmlyc3RBcGlSZXNwb25zZT8uaXNfZXhpc3RpbmcpIHtcbiAgICAgICAgICB0aGlzLmFwaUxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTsgICAvLyDwn5uRIHN0b3AgcG9sbGluZ1xuICAgICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKERlbGV0ZVJvbGVNYXBwaW5nUG9wdXBDb21wb25lbnQsIHtcbiAgICAgICAgICAgIHdpZHRoOiAnNDAwcHgnLFxuICAgICAgICAgICAgZGF0YTogJycsXG4gICAgICAgICAgICBwYW5lbENsYXNzOiAndmlldy1jYnAtcGxhbi1wb3B1cCcsXG4gICAgICAgICAgICBtaW5IZWlnaHQ6ICczMDBweCcsICAgICAgICAgIC8vIFNldCBtaW5pbXVtIGhlaWdodFxuICAgICAgICAgICAgbWF4SGVpZ2h0OiAnODB2aCcsICAgICAgICAgICAvLyBQcmV2ZW50IGl0IGZyb20gZ29pbmcgYmV5b25kIHZpZXdwb3J0XG4gICAgICAgICAgICBkaXNhYmxlQ2xvc2U6IHRydWUgLy8gT3B0aW9uYWw6IHByZXZlbnQgY2xvc2luZyB3aXRoIG91dHNpZGUgY2xpY2tcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gJ3NhdmVkJykge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQ2hhbmdlcyBzYXZlZCEnKTtcblxuICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlXG4gICAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5kZWxldGVSb2xlTWFwcGluZ0J5U3RhdGVBbmREZXBhcnRtZW50KHRoaXMucm9sZU1hcHBpbmdGb3JtLnZhbHVlLm1pbmlzdHJ5LCB0aGlzLnJvbGVNYXBwaW5nRm9ybS52YWx1ZS5kZXBhcnRtZW50cykuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAvLyBTdWNjZXNzIGhhbmRsaW5nXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnU3VjY2VzczonLCByZXMpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgIHRoaXMuZmlyc3RBcGlSZXNwb25zZSA9IFtdXG4gICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlRmluYWxSb2xlTWFwcGluZygpXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oZXJyb3I/LmVycm9yPy5kZXRhaWwsICdYJywge1xuICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICAgICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZmlyc3RBcGlSZXNwb25zZSA9IFtdXG4gICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgLy8gdGhpcy5nZW5lcmF0ZUZpbmFsUm9sZU1hcHBpbmcoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PT0gJ2J1dHRvbicpIHtcbiAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICAgICAgLy8gdGhpcy5nZW5lcmF0ZUZpbmFsUm9sZU1hcHBpbmcoKVxuICAgICAgICAgICAgICAvLyB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy8nXSk7XG4gICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRVcmwgPSB0aGlzLnJvdXRlci51cmw7XG5cbiAgICAgICAgICAgICAgLy8gdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCgnLycsIHsgc2tpcExvY2F0aW9uQ2hhbmdlOiB0cnVlIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAvLyAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwoY3VycmVudFVybCk7XG4gICAgICAgICAgICAgIC8vIH0pO1xuICAgICAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydyb2xlX21hcHBpbmdfZ2VuZXJhdGlvbiddID1cbiAgICAgICAgICAgICAgICBkYXRhPy5yb2xlX21hcHBpbmdzO1xuXG4gICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgICAgICAgICAgICdjYnBQbGFuRmluYWxPYmonLFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmopXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgdGhpcy5zdWNjZXNzUm9sZU1hcHBpbmcuZW1pdCh0aGlzLnJvbGVNYXBwaW5nRm9ybSk7XG4gICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2FpL2xpc3QnXSwge1xuICAgICAgICAgICAgICAgIG9uU2FtZVVybE5hdmlnYXRpb246ICdyZWxvYWQnXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAvLyB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkYXRhPy5zdGF0dXMgPT09ICdDT01QTEVURUQnKSB7XG4gICAgICAgICAgXG4gICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydyb2xlX21hcHBpbmdfZ2VuZXJhdGlvbiddID1cbiAgICAgICAgICAgIGRhdGE/LnJvbGVfbWFwcGluZ3M7XG5cbiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgICAgICAgICdjYnBQbGFuRmluYWxPYmonLFxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iailcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgdGhpcy5zdWNjZXNzUm9sZU1hcHBpbmcuZW1pdCh0aGlzLnJvbGVNYXBwaW5nRm9ybSk7XG5cbiAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ0NCUCBQbGFuIGdlbmVyYXRlZCBzdWNjZXNzZnVsbHkhJywgJ1gnLCB7XG4gICAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItc3VjY2VzcyddXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9haS8nXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cblxuICBnZW5lcmF0ZUZpbmFsUm9sZU1hcHBpbmdXaXRoU3RyZWFtKCkge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgY29uc29sZS5sb2coJ3JvbGVNYXBwaW5nRm9ybScsIHRoaXMucm9sZU1hcHBpbmdGb3JtKVxuICAgIGlmICh0aGlzLnJvbGVNYXBwaW5nRm9ybS52YWxpZCkge1xuICAgICAgY29uc3QgZm9ybURhdGEgPSB0aGlzLnJvbGVNYXBwaW5nRm9ybS52YWx1ZTtcbiAgICAgIGNvbnN0IGN1cnJlbnRGb3JtVmFsdWVzID0gdGhpcy5yb2xlTWFwcGluZ0Zvcm0uZ2V0UmF3VmFsdWUoKTtcbiAgICAgIGxldCBmb3JtVXBsb2FkRGF0YTogYW55ID0gbmV3IEZvcm1EYXRhKCk7XG5cbiAgICAgIC8vIGZvcm1VcGxvYWREYXRhLmFwcGVuZCgnbWluaXN0cnlUeXBlJywgY3VycmVudEZvcm1WYWx1ZXMubWluaXN0cnlUeXBlKTtcbiAgICAgIC8vIGZvcm1VcGxvYWREYXRhLmFwcGVuZCgnbWluaXN0cnknLCBjdXJyZW50Rm9ybVZhbHVlcy5taW5pc3RyeSk7XG4gICAgICAvLyBmb3JtVXBsb2FkRGF0YS5hcHBlbmQoJ3NlY3RvcnMnLCBKU09OLnN0cmluZ2lmeShjdXJyZW50Rm9ybVZhbHVlcy5zZWN0b3JzKSk7XG4gICAgICAvLyBmb3JtVXBsb2FkRGF0YS5hcHBlbmQoJ2RlcGFydG1lbnRzJywgSlNPTi5zdHJpbmdpZnkoY3VycmVudEZvcm1WYWx1ZXMuZGVwYXJ0bWVudHMpKTtcbiAgICAgIGZvcm1VcGxvYWREYXRhLmFwcGVuZCgnc3RhdGVfY2VudGVyX2lkJywgY3VycmVudEZvcm1WYWx1ZXMubWluaXN0cnkgfHwgJycpO1xuICAgICAgZm9ybVVwbG9hZERhdGEuYXBwZW5kKCdzdGF0ZV9jZW50ZXJfbmFtZScsIGN1cnJlbnRGb3JtVmFsdWVzLm1pbmlzdHJ5IHx8ICcnKTtcblxuICAgICAgaWYgKGN1cnJlbnRGb3JtVmFsdWVzLmRlcGFydG1lbnRzKSB7XG4gICAgICAgIGZvcm1VcGxvYWREYXRhLmFwcGVuZCgnZGVwYXJ0bWVudF9pZCcsIGN1cnJlbnRGb3JtVmFsdWVzLmRlcGFydG1lbnRzIHx8ICcnKTtcbiAgICAgIH1cbiAgICAgIGlmIChjdXJyZW50Rm9ybVZhbHVlcy5hZGRpdGlvbmFsRGV0YWlscykge1xuICAgICAgICBmb3JtVXBsb2FkRGF0YS5hcHBlbmQoJ2luc3RydWN0aW9uJywgY3VycmVudEZvcm1WYWx1ZXMuYWRkaXRpb25hbERldGFpbHMgfHwgJycpO1xuICAgICAgfVxuICAgICAgY29uc3QgZmlsZTogRmlsZSA9IHRoaXMudXBsb2FkZWRGaWxlIHx8IHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnYWRkaXRpb25hbF9kb2N1bWVudCcpPy52YWx1ZTtcbiAgICAgIGNvbnNvbGUubG9nKCdmaWxlJywgZmlsZSlcbiAgICAgIGlmIChmaWxlKSB7XG4gICAgICAgIGZvcm1VcGxvYWREYXRhLmFwcGVuZCgnYWRkaXRpb25hbF9kb2N1bWVudCcsIGZpbGUpO1xuICAgICAgfVxuICAgICAgY29uc29sZS5sb2coJ3RoaXMucm9sZU1hcHBpbmdGb3JtJywgdGhpcy5yb2xlTWFwcGluZ0Zvcm0pXG4gICAgICBjb25zb2xlLmxvZygnZm9ybVVwbG9hZERhdGEtLScsIGZvcm1VcGxvYWREYXRhKVxuICAgICAgZm9yIChjb25zdCBwYWlyIG9mIGZvcm1VcGxvYWREYXRhLmVudHJpZXMoKSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgJHtwYWlyWzBdfTpgLCBwYWlyWzFdKTtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUubG9nKCdGb3JtIHN1Ym1pdHRlZDonLCBmb3JtRGF0YSk7XG4gICAgICBsZXQgc2VjdG9ycyA9IEFycmF5LmlzQXJyYXkoZm9ybURhdGEuc2VjdG9ycykgPyBmb3JtRGF0YS5zZWN0b3JzLmpvaW4oJywgJykgOiAnJ1xuICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsnc2VjdG9ycyddID0gZm9ybURhdGEuc2VjdG9yc1xuICAgICAgLy8gU3VibWl0IGxvZ2ljIGhlcmVcbiAgICAgIGxldCByZXEgPSB7XG4gICAgICAgIFwic3RhdGVfY2VudGVyX2lkXCI6IGZvcm1EYXRhLm1pbmlzdHJ5LFxuICAgICAgICBcImluc3RydWN0aW9uXCI6IGZvcm1EYXRhLmFkZGl0aW9uYWxEZXRhaWxzXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSA9PT0gJ3N0YXRlJyB8fCBmb3JtRGF0YS5kZXBhcnRtZW50cykge1xuICAgICAgICByZXFbJ2RlcGFydG1lbnRfaWQnXSA9IGZvcm1EYXRhLmRlcGFydG1lbnRzID8gZm9ybURhdGEuZGVwYXJ0bWVudHMgOiAnJ1xuICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydkZXBhcnRtZW50cyddID0gZm9ybURhdGEuZGVwYXJ0bWVudHMgPyBmb3JtRGF0YS5kZXBhcnRtZW50cyA6ICcnXG5cblxuICAgICAgICBjb25zdCBkZXBhcnRtZW50TmFtZSA9IHRoaXMuZGVwYXJ0bWVudERhdGEuZmluZCh1ID0+IHUuaWRlbnRpZmllciA9PT0gZm9ybURhdGEuZGVwYXJ0bWVudHMpO1xuICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydkZXBhcnRtZW50X25hbWUnXSA9IGRlcGFydG1lbnROYW1lXG4gICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ2FkZGl0aW9uYWxEZXRhaWxzJ10gPSBmb3JtRGF0YS5hZGRpdGlvbmFsRGV0YWlsc1xuICAgICAgICBjb25zb2xlLmxvZyhkZXBhcnRtZW50TmFtZSk7XG5cbiAgICAgIH1cbiAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ21pbmlzdHJ5VHlwZSddID0gdGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZVxuXG4gICAgICBpZiAocmVxKSB7XG4gICAgICAgIHRoaXMuY2h1bmtzID0gW107XG4gICAgICAgIHRoaXMuZnVsbEpzb24gPSAnJztcbiAgICAgICAgdGhpcy5wYXJzZWREYXRhID0gbnVsbDtcbiAgICAgICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gdGhpcy5wcm9jZXNzaW5nU3RhZ2VzWzBdO1xuICAgICAgICB0aGlzLnJvbGVNYXBwaW5nU2VydmljZS5nZW5lcmF0ZVJvbGVNYXBwaW5nKFxuICAgICAgICAgIHJlcSxcbiAgICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZSB8fCBudWxsLFxuICAgICAgICAgIChjaHVuaykgPT4ge1xuICAgICAgICAgICAgdGhpcy5jaHVua3MucHVzaChjaHVuaylcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdSZWNlaXZlZCBjaHVuazonLCBjaHVuaywgJ1RvdGFsIGNodW5rczonLCB0aGlzLmNodW5rcy5sZW5ndGgpXG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSBwcm9jZXNzaW5nIHN0YWdlIGJhc2VkIG9uIGNodW5rIGNvdW50XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVByb2Nlc3NpbmdTdGFnZSgpO1xuXG4gICAgICAgICAgICAvLyBUcmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gdG8gdXBkYXRlIHRoZSBVSVxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IH0sIDApO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1N0cmVhbSBzdGFydGVkJylcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFByb2Nlc3NpbmdTdGFnZSA9IHRoaXMucHJvY2Vzc2luZ1N0YWdlc1swXTtcbiAgICAgICAgICB9LFxuICAgICAgICAgICgpID0+IHRoaXMub25TdHJlYW1FbmQoKSxcbiAgICAgICAgICAoZXJyKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdTdHJlYW0gZmFpbGVkOicsIGVycilcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlU3RyZWFtRXJyb3IoZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYnBQbGFuRmluYWxPYmonLCBKU09OLnN0cmluZ2lmeSh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqKSlcblxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlUHJvY2Vzc2luZ1N0YWdlKCkge1xuICAgIGNvbnN0IGNodW5rQ291bnQgPSB0aGlzLmNodW5rcy5sZW5ndGg7XG4gICAgbGV0IHN0YWdlSW5kZXggPSAwO1xuXG4gICAgLy8gTXVjaCBzbG93ZXIgc3RhZ2UgcHJvZ3Jlc3Npb24gLSBzdGFnZXMgc3RheSBtdWNoIGxvbmdlclxuICAgIGlmIChjaHVua0NvdW50IDw9IDgpIHtcbiAgICAgIHN0YWdlSW5kZXggPSAwOyAvLyBJbml0aWFsaXppbmcgLSBzdGF5cyBmb3IgZmlyc3QgOCBjaHVua3NcbiAgICB9IGVsc2UgaWYgKGNodW5rQ291bnQgPD0gMjApIHtcbiAgICAgIHN0YWdlSW5kZXggPSAxOyAvLyBBbmFseXppbmcgY29tcGV0ZW5jeSByZXF1aXJlbWVudHMgLSAxMiBjaHVua3NcbiAgICB9IGVsc2UgaWYgKGNodW5rQ291bnQgPD0gMzUpIHtcbiAgICAgIHN0YWdlSW5kZXggPSAyOyAvLyBQcm9jZXNzaW5nIHdvcmsgb3JkZXIgLSAxNSBjaHVua3NcbiAgICB9IGVsc2UgaWYgKGNodW5rQ291bnQgPD0gNTUpIHtcbiAgICAgIHN0YWdlSW5kZXggPSAzOyAvLyBHZW5lcmF0aW5nIHJvbGUgbWFwcGluZ3MgLSAyMCBjaHVua3NcbiAgICB9IGVsc2UgaWYgKGNodW5rQ291bnQgPD0gNzUpIHtcbiAgICAgIHN0YWdlSW5kZXggPSA0OyAvLyBDb21wdXRpbmcgZmluYWwgcmVjb21tZW5kYXRpb25zIC0gMjAgY2h1bmtzXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YWdlSW5kZXggPSA1OyAvLyBGaW5hbGl6aW5nIENCUCBQbGFuIC0gNzUrIGNodW5rc1xuICAgIH1cblxuICAgIHRoaXMuY3VycmVudFByb2Nlc3NpbmdTdGFnZSA9IHRoaXMucHJvY2Vzc2luZ1N0YWdlc1tzdGFnZUluZGV4XTtcbiAgfVxuXG4gIGdldFByb2dyZXNzUGVyY2VudGFnZSgpOiBudW1iZXIge1xuICAgIGNvbnN0IGNodW5rQ291bnQgPSB0aGlzLmNodW5rcy5sZW5ndGg7XG4gICAgaWYgKGNodW5rQ291bnQgPT09IDApIHJldHVybiAwO1xuXG4gICAgLy8gTXVjaCBzbG93ZXIgYW5kIHNtb290aGVyIHByb2dyZXNzIGNhbGN1bGF0aW9uXG4gICAgbGV0IHBlcmNlbnRhZ2UgPSAwO1xuXG4gICAgaWYgKGNodW5rQ291bnQgPD0gMTUpIHtcbiAgICAgIC8vIEZpcnN0IDE1IGNodW5rcyA9IDAtMjUlICh2ZXJ5IHNsb3cgc3RhcnQpXG4gICAgICBwZXJjZW50YWdlID0gKGNodW5rQ291bnQgLyAxNSkgKiAyNTtcbiAgICB9IGVsc2UgaWYgKGNodW5rQ291bnQgPD0gMzUpIHtcbiAgICAgIC8vIE5leHQgMjAgY2h1bmtzID0gMjUtNTAlIChzbG93IGVhcmx5IHByb2dyZXNzKVxuICAgICAgcGVyY2VudGFnZSA9IDI1ICsgKChjaHVua0NvdW50IC0gMTUpIC8gMjApICogMjU7XG4gICAgfSBlbHNlIGlmIChjaHVua0NvdW50IDw9IDYwKSB7XG4gICAgICAvLyBOZXh0IDI1IGNodW5rcyA9IDUwLTc1JSAoc3RlYWR5IG1pZGRsZSBwcm9ncmVzcylcbiAgICAgIHBlcmNlbnRhZ2UgPSA1MCArICgoY2h1bmtDb3VudCAtIDM1KSAvIDI1KSAqIDI1O1xuICAgIH0gZWxzZSBpZiAoY2h1bmtDb3VudCA8PSAxMDApIHtcbiAgICAgIC8vIE5leHQgNDAgY2h1bmtzID0gNzUtOTAlIChzbG93ZXIgZmluYWwgYXBwcm9hY2gpXG4gICAgICBwZXJjZW50YWdlID0gNzUgKyAoKGNodW5rQ291bnQgLSA2MCkgLyA0MCkgKiAxNTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQmV5b25kIDEwMCBjaHVua3MgPSA5MC05NSUgKHZlcnkgc2xvdyBmaW5hbCBwcm9ncmVzc2lvbilcbiAgICAgIHBlcmNlbnRhZ2UgPSA5MCArIE1hdGgubWluKCgoY2h1bmtDb3VudCAtIDEwMCkgLyA1MCkgKiA1LCA1KTtcbiAgICB9XG5cbiAgICByZXR1cm4gTWF0aC5yb3VuZChwZXJjZW50YWdlKTtcbiAgfVxuXG4gIG9uU3RyZWFtRW5kKCkge1xuICAgIHRoaXMuY3VycmVudFByb2Nlc3NpbmdTdGFnZSA9ICdDb21wbGV0aW5nIENCUCBQbGFuIGdlbmVyYXRpb24uLi4nO1xuXG4gICAgLy8gU2hvdyAxMDAlIGNvbXBsZXRpb24gYnJpZWZseSBiZWZvcmUgZmluaXNoaW5nXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmZ1bGxKc29uID0gdGhpcy5jaHVua3Muam9pbignJyk7XG4gICAgICBjb25zdCBjbGVhbmVkID0gdGhpcy5mdWxsSnNvbi5yZXBsYWNlKC9eYGBganNvblxcbi8sICcnKS5yZXBsYWNlKC9gYGAkLywgJycpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5wYXJzZWREYXRhID0gSlNPTi5wYXJzZShjbGVhbmVkKTtcbiAgICAgICAgY29uc29sZS5sb2coJ1BhcnNlZCBkYXRhOicsIHRoaXMucGFyc2VkRGF0YSk7XG5cbiAgICAgICAgLy8gSGFuZGxlIHN1Y2Nlc3NmdWwgY29tcGxldGlvblxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsncm9sZV9tYXBwaW5nX2dlbmVyYXRpb24nXSA9IHRoaXMucGFyc2VkRGF0YTtcbiAgICAgICAgdGhpcy5zdWNjZXNzUm9sZU1hcHBpbmcuZW1pdCh0aGlzLnJvbGVNYXBwaW5nRm9ybSk7XG5cbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdDQlAgUGxhbiBnZW5lcmF0ZWQgc3VjY2Vzc2Z1bGx5IScsICdYJywge1xuICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItc3VjY2VzcyddXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdKU09OIHBhcnNlIGVycm9yOicsIGUpO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdGYWlsZWQgdG8gZ2VuZXJhdGUgQ0JQIFBsYW4uIFBsZWFzZSB0cnkgYWdhaW4uJywgJ1gnLCB7XG4gICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIDUwMCk7XG4gIH1cblxuICAvLyBIZWxwZXIgbWV0aG9kIHRvIGdldCBwcm9ncmVzcyBwZXJjZW50YWdlIGluY2x1ZGluZyBjb21wbGV0aW9uIHN0YXRlXG4gIGdldERpc3BsYXlQcm9ncmVzc1BlcmNlbnRhZ2UoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID09PSAnQ29tcGxldGluZyBDQlAgUGxhbiBnZW5lcmF0aW9uLi4uJykge1xuICAgICAgcmV0dXJuIDEwMDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvZ3Jlc3NQZXJjZW50YWdlKCk7XG4gIH1cblxuICAvLyBIYW5kbGUgc3RyZWFtaW5nIGVycm9ycywgZXNwZWNpYWxseSBcIlJvbGUgbWFwcGluZyBhbHJlYWR5IGV4aXN0c1wiXG4gIGhhbmRsZVN0cmVhbUVycm9yKGVycjogYW55KSB7XG4gICAgY29uc29sZS5sb2coJ0Vycm9yIGRldGFpbHM6JywgZXJyKTtcblxuICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgdGhlIFwiUm9sZSBtYXBwaW5nIGFscmVhZHkgZXhpc3RzXCIgZXJyb3JcbiAgICBpZiAoZXJyPy5pc0V4aXN0aW5nUm9sZU1hcHBpbmcgfHwgKGVycj8uZGV0YWlsICYmIGVyci5kZXRhaWwuaW5jbHVkZXMoJ1JvbGUgbWFwcGluZyBhbHJlYWR5IGV4aXN0cycpKSkge1xuICAgICAgdGhpcy5jdXJyZW50UHJvY2Vzc2luZ1N0YWdlID0gJ0xvYWRpbmcgZXhpc3Rpbmcgcm9sZSBtYXBwaW5nLi4uJztcblxuICAgICAgLy8gQ2FsbCB0aGUgYXBwcm9wcmlhdGUgR2V0IHJvbGUgbWFwcGluZyBBUEkgYmFzZWQgb24gbWluaXN0cnkgdHlwZVxuICAgICAgY29uc3QgZm9ybURhdGEgPSB0aGlzLnJvbGVNYXBwaW5nRm9ybS52YWx1ZTtcbiAgICAgIGNvbnN0IHN0YXRlQ2VudGVyID0gZm9ybURhdGEubWluaXN0cnk7XG4gICAgICBjb25zdCBkZXBhcnRtZW50SWQgPSBmb3JtRGF0YS5kZXBhcnRtZW50cztcblxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRNaW5pc3RyeVR5cGUgPT09ICdzdGF0ZScgJiYgZGVwYXJ0bWVudElkKSB7XG4gICAgICAgIC8vIENhbGwgR2V0IHJvbGUgbWFwcGluZyBieSBzdGF0ZSBjZW50ZXIgYW5kIGRlcGFydG1lbnRcbiAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJvbGVNYXBwaW5nQnlTdGF0ZUNlbnRlckFuZERlcGFydG1lbnQoc3RhdGVDZW50ZXIsIGRlcGFydG1lbnRJZCkuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRXhpc3Rpbmcgcm9sZSBtYXBwaW5nIGxvYWRlZDonLCByZXMpO1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydyb2xlX21hcHBpbmdfZ2VuZXJhdGlvbiddID0gcmVzO1xuICAgICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdFeGlzdGluZyByb2xlIG1hcHBpbmcgbG9hZGVkIHN1Y2Nlc3NmdWxseSEnLCAnWCcsIHtcbiAgICAgICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItc3VjY2VzcyddXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuYWxyZWFkeUF2YWlsYWJsZVJvbGVNYXBwaW5nLmVtaXQodGhpcy5yb2xlTWFwcGluZ0Zvcm0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgZXhpc3Rpbmcgcm9sZSBtYXBwaW5nOicsIGVycm9yKTtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdGYWlsZWQgdG8gbG9hZCBleGlzdGluZyByb2xlIG1hcHBpbmcuIFBsZWFzZSB0cnkgYWdhaW4uJywgJ1gnLCB7XG4gICAgICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgICAgICBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLWVycm9yJ11cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDYWxsIEdldCByb2xlIG1hcHBpbmcgYnkgc3RhdGUgY2VudGVyIG9ubHlcbiAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJvbGVNYXBwaW5nQnlTdGF0ZUNlbnRlcihzdGF0ZUNlbnRlcikuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRXhpc3Rpbmcgcm9sZSBtYXBwaW5nIGxvYWRlZDonLCByZXMpO1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqWydyb2xlX21hcHBpbmdfZ2VuZXJhdGlvbiddID0gcmVzO1xuICAgICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdFeGlzdGluZyByb2xlIG1hcHBpbmcgbG9hZGVkIHN1Y2Nlc3NmdWxseSEnLCAnWCcsIHtcbiAgICAgICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItc3VjY2VzcyddXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuYWxyZWFkeUF2YWlsYWJsZVJvbGVNYXBwaW5nLmVtaXQodGhpcy5yb2xlTWFwcGluZ0Zvcm0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgZXhpc3Rpbmcgcm9sZSBtYXBwaW5nOicsIGVycm9yKTtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdGYWlsZWQgdG8gbG9hZCBleGlzdGluZyByb2xlIG1hcHBpbmcuIFBsZWFzZSB0cnkgYWdhaW4uJywgJ1gnLCB7XG4gICAgICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgICAgICBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLWVycm9yJ11cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEhhbmRsZSBvdGhlciBzdHJlYW1pbmcgZXJyb3JzXG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycj8uZGV0YWlsIHx8ICdTdHJlYW0gZmFpbGVkLiBQbGVhc2UgdHJ5IGFnYWluLic7XG4gICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oZXJyb3JNZXNzYWdlLCAnWCcsIHtcbiAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItZXJyb3InXVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJlbW92ZUZpbGUoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy51cGxvYWRlZEZpbGUgfHwgdGhpcy51cGxvYWRlZEZpbGUubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAvLyBSZW1vdmUgb25lIGZpbGUgYXQgdGhlIGdpdmVuIGluZGV4XG4gICAgdGhpcy51cGxvYWRlZEZpbGUuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2wgdmFsdWVcbiAgICB0aGlzLnJvbGVNYXBwaW5nRm9ybS5nZXQoJ2FkZGl0aW9uYWxfZG9jdW1lbnQnKT8uc2V0VmFsdWUodGhpcy51cGxvYWRlZEZpbGUpO1xuICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLmdldCgnYWRkaXRpb25hbF9kb2N1bWVudCcpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG5cbiAgICAvLyBDbGVhciBlcnJvcnMgaWYgbm8gZmlsZXMgbGVmdFxuICAgIGlmICh0aGlzLnVwbG9hZGVkRmlsZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMudXBsb2FkRXJyb3IgPSAnJztcbiAgICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwbG9hZERvYycpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICBpZiAoaW5wdXQpIGlucHV0LnZhbHVlID0gJyc7XG4gICAgfVxuICB9XG5cblxuICBnZXRVc2VyUHJvZmlsZURhdGEoKSB7XG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFVzZXJQcm9maWxlKCkuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZygnZGF0YS0tJywgZGF0YSlcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd1c2VyUHJvZmlsZScsIEpTT04uc3RyaW5naWZ5KGRhdGEpKVxuICAgICAgdGhpcy5sb2dpblVzZXJPcmdJZHMgPSBkYXRhPy5vcmdhbml6YXRpb25faWRzXG4gICAgICBsZXQgZmlsdGVyZWRNaW5pc3RyeURhdGEgPSBbXVxuICAgICAgdGhpcy5taW5pc3RyeUZ1bGxEYXRhLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5sb2dpblVzZXJPcmdJZHMuaW5kZXhPZihpdGVtPy5pZGVudGlmaWVyKSA+IC0xKSB7XG4gICAgICAgICAgZmlsdGVyZWRNaW5pc3RyeURhdGEucHVzaChpdGVtKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICB0aGlzLm1pbmlzdHJ5RGF0YSA9IGZpbHRlcmVkTWluaXN0cnlEYXRhXG4gICAgICB0aGlzLm9yaWdpbmFsTWluaXN0cnlEYXRhID0gZmlsdGVyZWRNaW5pc3RyeURhdGFcbiAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gZmlsdGVyZWRNaW5pc3RyeURhdGE7XG4gICAgfSlcbiAgfVxuXG4gIG9uT3BlbmVkKG9wZW5lZDogYm9vbGVhbikge1xuICAgIHRoaXMucGFuZWxPcGVuID0gb3BlbmVkO1xuICB9XG5cbiAgb25PcGVuZWREZXBhcnRtZW50KG9wZW5lZDogYm9vbGVhbikge1xuICAgIHRoaXMuZGVwYXJ0bWVudFBhbmVsT3BlbiA9IG9wZW5lZFxuICB9XG5cbiAgZmlsdGVyRGF0YShldmVudCkge1xuICAgIGlmIChldmVudCAmJiBldmVudC50YXJnZXQgJiYgZXZlbnQudGFyZ2V0LnZhbHVlKSB7XG4gICAgICBjb25zdCBzID0gZXZlbnQudGFyZ2V0LnZhbHVlLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gdGhpcy5taW5pc3RyeURhdGEuZmlsdGVyKHggPT5cbiAgICAgICAgeC5vcmdOYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocylcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gdGhpcy5taW5pc3RyeURhdGFcbiAgICB9XG5cbiAgfVxuXG4gIGZpbHRlckRlcGFydG1lbnREYXRhKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50LnRhcmdldCAmJiBldmVudC50YXJnZXQudmFsdWUpIHtcbiAgICAgIGNvbnN0IHMgPSBldmVudC50YXJnZXQudmFsdWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgdGhpcy5maWx0ZXJlZERlcGFydG1lbnRMaXN0ID0gdGhpcy5kZXBhcnRtZW50RGF0YS5maWx0ZXIoeCA9PlxuICAgICAgICB4Lm9yZ05hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maWx0ZXJlZERlcGFydG1lbnRMaXN0ID0gdGhpcy5kZXBhcnRtZW50RGF0YVxuICAgIH1cblxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zZWxlY3RlZE1pbmlzdHJ5SWQgPSAnJ1xuICAgIHRoaXMucm9sZU1hcHBpbmdGb3JtLnJlc2V0KClcbiAgfVxuXG4gIG9uRGVwYXJ0bWVudENoYW5nZSgpIHtcbiAgICBjb25zdCBmb3JtRGF0YSA9IHRoaXMucm9sZU1hcHBpbmdGb3JtLnZhbHVlO1xuXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsnZGVwYXJ0bWVudHMnXSA9IGZvcm1EYXRhLmRlcGFydG1lbnRzID8gZm9ybURhdGEuZGVwYXJ0bWVudHMgOiAnJ1xuICAgIHRoaXMuY2JwRmluYWxPYmogPSB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0Q0JQUGxhbkxvY2FsU3RvcmFnZSgpXG4gICAgaWYgKHRoaXMuY2JwRmluYWxPYmogJiYgdGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnkgJiYgdGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnk/LnNiT3JnVHlwZSkge1xuICAgICAgdGhpcy5jYnBGaW5hbE9ialsnZGVwYXJ0bWVudHMnXSA9IGZvcm1EYXRhLmRlcGFydG1lbnRzID8gZm9ybURhdGEuZGVwYXJ0bWVudHMgOiAnJ1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdGVkTWluaXN0cnkgPSB0aGlzLm1pbmlzdHJ5RGF0YS5maW5kKGl0ZW0gPT4gaXRlbS5pZGVudGlmaWVyID09PSBmb3JtRGF0YS5taW5pc3RyeSk7XG5cblxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ21pbmlzdHJ5J10gPSBzZWxlY3RlZE1pbmlzdHJ5XG5cbiAgICBjb25zdCBkZXBhcnRtZW50TmFtZSA9IHRoaXMuZGVwYXJ0bWVudERhdGEuZmluZCh1ID0+IHUuaWRlbnRpZmllciA9PT0gZm9ybURhdGEuZGVwYXJ0bWVudHMpO1xuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ2RlcGFydG1lbnRfbmFtZSddID0gZGVwYXJ0bWVudE5hbWU/Lm9yZ05hbWVcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2JwUGxhbkZpbmFsT2JqJywgSlNPTi5zdHJpbmdpZnkodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iaikpXG4gICAgdGhpcy5nZXRVcGxvYWRlZERvY3VtZW50cygpXG4gIH1cblxuICAgZ29Ub1VwbG9hZERvY3VtZW50KCkge1xuICAgXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvYWkvdXBsb2FkLWRvY3VtZW50cyddKTtcbiAgICBcbiAgfVxuXG5cblxufVxuXG5cblxuIiwiPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiPlxuICAgIDwhLS0gPGlucHV0IGNsYXNzPVwiYnRuLWFjdGl2ZVwiIHR5cGU9XCJidXR0b25cIiB2YWx1ZT1cIkRvd25sb2FkIGFzIFBERlwiIChjbGljayk9XCJkb3dubG9hZFBERigpXCIgLz4gLS0+XG4gICAgPGRpdiBjbGFzcz1cImxvZ28tY29udGFpbmVyXCIgKm5nSWY9XCJsb2dpblwiPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1sb2FkZXItaWNvbi1tZWRpdW1cIj48aW1nIHNyYz1cImFzc2V0cy9pY29ucy9haS1sb2FkZXIuZ2lmXCI+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxoMiBjbGFzcz1cImhpZ2hsaWdodC1haVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPmlHT1QgQUkgRHJpdmVuIENCUDwvc3Bhbj5cbiAgICAgICAgICAgIDwvaDI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJzdWItaGVhZGluZ1wiPlxuICAgICAgICAgICAgPHA+QnVpbGQgWW91ciBDYXBhY2l0eSBXaXRoIEN1c3RvbWl6ZWQgUm9sZSBNYXBwaW5nPC9wPlxuICAgICAgICA8L2Rpdj4gLS0+XG4gICAgPC9kaXY+XG4gICAgPG1hdC1jYXJkICpuZ0lmPVwibG9naW5cIiBjbGFzcz1cIm10LTJcIiBbZm9ybUdyb3VwXT1cInJvbGVNYXBwaW5nRm9ybVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGVwYXRtZW50LWNvbnRhaW5lclwiPlxuPCEtLSAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWhlYWRlclwiPi0tPlxuPCEtLSAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWhlYWRpbmdcIj4tLT5cbjwhLS0gICAgICAgICAgICAgICAgICAgIDxwPkNob29zZSBZb3VyIERlcGFydG1lbnQ8L3A+LS0+XG48IS0tICAgICAgICAgICAgICAgIDwvZGl2Pi0tPlxuPCEtLSAgICAgICAgICAgIDwvZGl2Pi0tPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8tZ3JvdXAgbXQtNFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtcmFkaW8tZ3JvdXAgY2xhc3M9XCJyYWRpby1idG4tZ3JvdXBcIiBmb3JtQ29udHJvbE5hbWU9XCJtaW5pc3RyeVR5cGVcIlxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkTWluaXN0cnlUeXBlXCIgKGNoYW5nZSk9XCJvbk1pbmlzdHJ5VHlwZUNoYW5nZSgkZXZlbnQpXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBMZWZ0IHJhZGlvIGJ1dHRvbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gdmFsdWU9XCJtaW5pc3RyeVwiIGNsYXNzPVwicmFkaW8tYnRuIGxlZnQtcmFkaW9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmFkaW8tbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtaWNvbiBjbGFzcz1cInJhZGlvLWljb25cIiBbbmdDbGFzc109XCJzZWxlY3RlZE1pbmlzdHJ5VHlwZSA9PT0gJ2NlbnRlcic/ICdjaGVja2VkLWxhYmVsJzonJ1wiPmRvbWFpbjwvbWF0LWljb24+ICAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCJzZWxlY3RlZE1pbmlzdHJ5VHlwZSA9PT0gJ21pbmlzdHJ5Jz8gJ2NoZWNrZWQtbGFiZWwnOicnXCI+Q2VudHJlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1yYWRpby1idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBSaWdodCByYWRpbyBidXR0b24gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIHZhbHVlPVwic3RhdGVcIiBjbGFzcz1cInJhZGlvLWJ0biByaWdodC1yYWRpb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyYWRpby1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1pY29uIGNsYXNzPVwicmFkaW8taWNvblwiIFtuZ0NsYXNzXT1cInNlbGVjdGVkTWluaXN0cnlUeXBlID09PSAnc3RhdGUnPyAnY2hlY2tlZC1sYWJlbCc6JydcIj5sb2NhdGlvbl9vbjwvbWF0LWljb24+ICAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCJzZWxlY3RlZE1pbmlzdHJ5VHlwZSA9PT0gJ3N0YXRlJz8gJ2NoZWNrZWQtbGFiZWwnOicnXCI+U3RhdGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXJhZGlvLWJ1dHRvbj5cblxuICAgICAgICAgICAgICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNFwiPlxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2VsZWN0ZWRNaW5pc3RyeVR5cGUgPT09ICdtaW5pc3RyeSdcIj5NaW5pc3RyeTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzZWxlY3RlZE1pbmlzdHJ5VHlwZSA9PT0gJ3N0YXRlJ1wiPlN0YXRlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTIgc2VhcmNoLWJveC13aXRoLXNlbGVjdFwiPlxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJmaWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDogd2hpdGU7IGJvcmRlci1yYWRpdXM6IDI1cHg7IHBhZGRpbmc6IDAgMTJweDsgYm9yZGVyOiAxcHggc29saWQgI2NjYzt3aWR0aDogMTAwJTtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICBwYW5lbENsYXNzPVwic2VsZWN0LXdpdGgtc2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwic2VsZWN0ZWRNaW5pc3RyeVR5cGUgPT09ICdtaW5pc3RyeScgPyAnU2VsZWN0IE1pbmlzdHJ5LyBEZXBhcnRtZW50JzonU2VsZWN0IFN0YXRlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvbk1pbmlzdHJ5Q2hhbmdlKCRldmVudClcIiBmb3JtQ29udHJvbE5hbWU9XCJtaW5pc3RyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJib3JkZXItcmFkaXVzOiAyNXB4OyBiYWNrZ3JvdW5kOiB3aGl0ZTsgd2lkdGg6MTAwJVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcGVuZWRDaGFuZ2UpPVwib25PcGVuZWQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtd3JhcHBlclwiICpuZ0lmPVwicGFuZWxPcGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2guLi5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cImZpbHRlckRhdGEoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlYXJjaC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIml0ZW0/LmlkZW50aWZpZXJcIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaWx0ZXJlZExpc3RcIiBbc2VsZWN0ZWRdPVwic2VsZWN0ZWRNaW5pc3RyeUlkID09PSBpdGVtPy5pZGVudGlmaWVyXCI+e3tpdGVtPy5vcmdOYW1lfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCIgKm5nSWY9XCJkZXBhcnRtZW50RGF0YT8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWxcIj5EZXBhcnRtZW50PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cImZpbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiB3aGl0ZTsgYm9yZGVyLXJhZGl1czogMjVweDsgcGFkZGluZzogMCAxMnB4O2JvcmRlcjogMXB4IHNvbGlkICNjY2M7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBwYW5lbENsYXNzPVwic2VsZWN0LXdpdGgtc2VhcmNoXCIgcGxhY2Vob2xkZXI9XCJTZWxlY3QgRGVwYXJ0bWVudFwiIGZvcm1Db250cm9sTmFtZT1cImRlcGFydG1lbnRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImJvcmRlci1yYWRpdXM6IDI1cHg7IGJhY2tncm91bmQ6IHdoaXRlO1wiICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uRGVwYXJ0bWVudENoYW5nZSgpXCIgKG9wZW5lZENoYW5nZSk9XCJvbk9wZW5lZERlcGFydG1lbnQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtd3JhcHBlclwiICpuZ0lmPVwiZGVwYXJ0bWVudFBhbmVsT3BlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoLi4uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJmaWx0ZXJEZXBhcnRtZW50RGF0YSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2VhcmNoLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiaXRlbT8uaWRlbnRpZmllclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpbHRlcmVkRGVwYXJ0bWVudExpc3RcIj57e2l0ZW0/Lm9yZ05hbWV9fTwvbWF0LW9wdGlvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cIm10LTRcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsXCI+U2VjdG9yPC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJmaWxsXCIgc3R5bGU9XCJiYWNrZ3JvdW5kOiB3aGl0ZTsgYm9yZGVyLXJhZGl1czogMjVweDsgcGFkZGluZzogMCAxMnB4O1wiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBwbGFjZWhvbGRlcj1cIlNlbGVjdCBTZWN0b3JcIiBtdWx0aXBsZSBmb3JtQ29udHJvbE5hbWU9XCJzZWN0b3JzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYm9yZGVyLXJhZGl1czogMjVweDsgYmFja2dyb3VuZDogd2hpdGU7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiaXRlbT8udmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIHNlY3RvckRhdGFcIj57e2l0ZW0/LnZhbHVlfX08L21hdC1vcHRpb24+XG5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICA8IS0tICpuZ0lmPVwicm9sZU1hcHBpbmdGb3JtLmdldCgnbWluaXN0cnlUeXBlJyk/LnZhbHVlID09PSAnc3RhdGUnXCIgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNCBhZGRpdGlvbmFsLWRldGFpbHNcIj5cbiAgICAgICAgICAgICAgICA8dGV4dGFyZWEgcm93cz1cIjVcIiBwbGFjZWhvbGRlcj1cIkFkZGl0aW9uYWwgZGV0YWlsc1wiIGZvcm1Db250cm9sTmFtZT1cImFkZGl0aW9uYWxEZXRhaWxzXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCI+XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gW25nQ2xhc3NdPVwiZGlzYWJsZVVwbG9hZERvY3VtZW50ID8gJ2J0bi1hY3RpdmUtcHJpbWFyeS1kaXNhYmxlJzonYnRuLWFjdGl2ZS1wcmltYXJ5J1wiIGNsYXNzPVwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlVXBsb2FkRG9jdW1lbnRcIiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImdvVG9VcGxvYWREb2N1bWVudCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+dXBsb2FkPC9tYXQtaWNvbj4gTWFuYWdlIERvY3VtZW50c1xuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gKm5nSWY9XCJyb2xlTWFwcGluZ0Zvcm0uZ2V0KCdtaW5pc3RyeVR5cGUnKT8udmFsdWUgPT09ICdzdGF0ZSdcIiAtLT5cbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cIm10LTQgc2VjdGlvblwiID5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWhlYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgPHA+VXBsb2FkIERvY3VtZW50IChQREYpPC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlLXVwbG9hZC13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJ1cGxvYWREb2NcIiBjbGFzcz1cImZpbGUtdXBsb2FkLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbGUtdXBsb2FkLWljb25cIj7wn5OOPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhdXBsb2FkZWRGaWxlIHx8IHVwbG9hZGVkRmlsZS5sZW5ndGggPT09IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hvb3NlIHVwIHRvIDMgZmlsZXMgKFBERi9UWFQpXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidXBsb2FkZWRGaWxlPy5sZW5ndGggPiAwXCIgY2xhc3M9XCJmaWxlLWxpc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZmlsZSBvZiB1cGxvYWRlZEZpbGU7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cImZpbGUtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZpbGUubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVtb3ZlLWZpbGUtaWNvblwiIChjbGljayk9XCJyZW1vdmVGaWxlKGkpOyRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ1cGxvYWREb2NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25GaWxlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuXG4gICAgICAgICAgICAgICAgICAgICAgLz4gICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiZmlsZS11cGxvYWQtaGludFwiPk1heCBmaWxlIHNpemU6IHt7bWF4RmlsZVNpemVNQn19TUI8L3NtYWxsPlxuXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cInVwbG9hZERvY1wiIG11bHRpcGxlIHR5cGU9XCJmaWxlXCIgKGNoYW5nZSk9XCJvbkZpbGVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhY2NlcHQ9XCIucGRmLC5kb2MsLmRvY3gsLnhscywueGxzeCwudHh0XCIgY2xhc3M9XCJmaWxlLXVwbG9hZC1pbnB1dFwiIC8+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInVwbG9hZEVycm9yXCIgY2xhc3M9XCJlcnJvclwiPnt7IHVwbG9hZEVycm9yIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICA8IS0tICpuZ0lmPVwicm9sZU1hcHBpbmdGb3JtLmdldCgnbWluaXN0cnlUeXBlJyk/LnZhbHVlID09PSAnc3RhdGUnXCIgLS0+XG4gICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJtdC0yIHNlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlzY2xhaW1lci10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxwPkRpc2NsYWltZXI6IFBsZWFzZSBkbyBub3QgdXBsb2FkIGFueSBjb25maWRlbnRpYWwgZG9jdW1lbnRzLiA8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMlwiICpuZ0lmPVwiZG9jdW1lbnRzPy5sZW5ndGggPCAxICYmICEocm9sZU1hcHBpbmdGb3JtPy5pbnZhbGlkKVwiPlxuICAgICAgICAgICAgICAgPHA+PHNwYW4gc3R5bGU9XCJmb250LXNpemU6IC44NzVyZW07Zm9udC13ZWlnaHQ6IGJvbGQ7XCI+Tm90ZTogPC9zcGFuPjxzcGFuIGNsYXNzPVwiZXJyb3JcIj5QbGVhc2UgVXBsb2FkIGF0bGVhc3QgMSBEb2N1bWVudC48L3NwYW4+PC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNFwiID5cbiAgICAgICAgICAgICAgICA8aW5wdXQgW2Rpc2FibGVkXT1cInJvbGVNYXBwaW5nRm9ybT8uaW52YWxpZCB8fCAocm9sZU1hcHBpbmdGb3JtLmdldCgnbWluaXN0cnlUeXBlJyk/LnZhbHVlID09PSAnc3RhdGUnICYmICFyb2xlTWFwcGluZ0Zvcm0uZ2V0KCdkZXBhcnRtZW50cycpPy52YWx1ZSkgfHwgbG9hZGluZyB8fCBkb2N1bWVudHM/Lmxlbmd0aCA8IDFcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb2xlTWFwcGluZ0Zvcm0/LmludmFsaWQgfHwgKHJvbGVNYXBwaW5nRm9ybS5nZXQoJ21pbmlzdHJ5VHlwZScpPy52YWx1ZSA9PT0gJ3N0YXRlJyAmJiAhcm9sZU1hcHBpbmdGb3JtLmdldCgnZGVwYXJ0bWVudHMnKT8udmFsdWUpIHx8IGxvYWRpbmcgfHwgZG9jdW1lbnRzPy5sZW5ndGggPCAxID8gJ2J0bi1kaXNhYmxlJzonYnRuLWFjdGl2ZSdcIiBcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIFxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwibG9hZGluZyA/ICdHZW5lcmF0aW5nIENCUC4uLicgOiAnR2VuZXJhdGUgQ0JQJ1wiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkdlbmVyYXRlUm9sZU1hcHBpbmcoKVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9tYXQtY2FyZD5cbiAgICBcbjwvZGl2PlxuPGRpdiAqbmdJZj1cIiFsb2dpblwiPlxuICAgICAgICA8YXBwLWxvZ2luIChzdWNjZXNzKT1cImxvZ2luU3RhdHVzKCRldmVudClcIj48L2FwcC1sb2dpbj5cbiAgICA8L2Rpdj5cblxuPGRpdiBjbGFzcz1cIm92ZXJsYXktbG9hZGVyXCIgKm5nSWY9XCJhcGlMb2FkaW5nXCI+XG4gICAgPG1hdC1zcGlubmVyIGRpYW1ldGVyPVwiNTBcIj48L21hdC1zcGlubmVyPlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJvdmVybGF5LWxvYWRlclwiICpuZ0lmPVwibG9hZGluZ1wiPlxuICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nLWNvbnRlbnRcIj5cbiAgICAgICAgPG1hdC1zcGlubmVyIGRpYW1ldGVyPVwiNTBcIj48L21hdC1zcGlubmVyPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9hZGluZy10ZXh0IG10LTNcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwibWFpbi1tZXNzYWdlXCI+e3sgY3VycmVudFByb2Nlc3NpbmdTdGFnZSB8fCAnUHJlcGFyaW5nIENCUCBQbGFuIGdlbmVyYXRpb24uLi4nIH19PC9wPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWRldGFpbHNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtaW5kaWNhdG9yXCIgKm5nSWY9XCJjaHVua3MubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhclwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGguJV09XCJnZXREaXNwbGF5UHJvZ3Jlc3NQZXJjZW50YWdlKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwicHJvZ3Jlc3MtdGV4dFwiPnt7IGdldERpc3BsYXlQcm9ncmVzc1BlcmNlbnRhZ2UoKSB9fSUgQ29tcGxldGU8L3NtYWxsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRpbWUtZXN0aW1hdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgUmVhbC10aW1lIHN0cmVhbWluZyBpbiBwcm9ncmVzcy4gVGhpcyBtYXkgdGFrZSAyLTMgbWludXRlcy5cbiAgICAgICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|