@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.
Files changed (128) hide show
  1. package/README.md +24 -0
  2. package/esm2022/lib/ai-cbp-routing.module.mjs +56 -0
  3. package/esm2022/lib/ai-cbp.component.mjs +14 -0
  4. package/esm2022/lib/ai-cbp.module.mjs +263 -0
  5. package/esm2022/lib/ai-cbp.service.mjs +14 -0
  6. package/esm2022/lib/components/add-course/add-course.component.mjs +444 -0
  7. package/esm2022/lib/components/add-designation/add-designation.component.mjs +460 -0
  8. package/esm2022/lib/components/add-personalisation/add-personalisation.component.mjs +33 -0
  9. package/esm2022/lib/components/approval-request-form/approval-request-form.component.mjs +392 -0
  10. package/esm2022/lib/components/approval-requests/approval-requests.component.mjs +398 -0
  11. package/esm2022/lib/components/dashboard/dashboard.component.mjs +265 -0
  12. package/esm2022/lib/components/delete-role-mapping/delete-role-mapping.component.mjs +53 -0
  13. package/esm2022/lib/components/delete-role-mapping-popup/delete-role-mapping-popup.component.mjs +39 -0
  14. package/esm2022/lib/components/edit-cbp-plan/edit-cbp-plan.component.mjs +699 -0
  15. package/esm2022/lib/components/gap-analysis-recommended-course/gap-analysis-recommended-course.component.mjs +188 -0
  16. package/esm2022/lib/components/generate-course-recommendation/generate-course-recommendation.component.mjs +1949 -0
  17. package/esm2022/lib/components/list-popup/list-popup.component.mjs +32 -0
  18. package/esm2022/lib/components/review-request/review-request.component.mjs +138 -0
  19. package/esm2022/lib/components/role-mapping-generation/role-mapping-generation.component.mjs +1082 -0
  20. package/esm2022/lib/components/role-mapping-list/role-mapping-list.component.mjs +714 -0
  21. package/esm2022/lib/components/suggest-more-courses/suggest-more-courses.component.mjs +370 -0
  22. package/esm2022/lib/components/update-designation-hierarchy/update-designation-hierarchy.component.mjs +235 -0
  23. package/esm2022/lib/components/view-cbp-plan/view-cbp-plan.component.mjs +125 -0
  24. package/esm2022/lib/components/view-course-recommendation/view-course-recommendation.component.mjs +397 -0
  25. package/esm2022/lib/components/view-final-cbp-plan/view-final-cbp-plan.component.mjs +883 -0
  26. package/esm2022/lib/modules/initial-screen/initial-screen.component.mjs +127 -0
  27. package/esm2022/lib/modules/shared/constant/app.constant.mjs +2036 -0
  28. package/esm2022/lib/modules/shared/directives/clickoutside.directive.mjs +38 -0
  29. package/esm2022/lib/modules/shared/directives/directive.module.mjs +21 -0
  30. package/esm2022/lib/modules/shared/pipes/order-by-name.pipe.mjs +23 -0
  31. package/esm2022/lib/modules/shared/services/event.service.mjs +24 -0
  32. package/esm2022/lib/modules/shared/services/events.mjs +125 -0
  33. package/esm2022/lib/modules/shared/services/init.service.mjs +41 -0
  34. package/esm2022/lib/modules/shared/services/role-mapping.service.mjs +261 -0
  35. package/esm2022/lib/modules/shared/services/shared.service.mjs +869 -0
  36. package/esm2022/lib/modules/upload-document-page/progress-dialog/progress-dialog.component.mjs +53 -0
  37. package/esm2022/lib/modules/upload-document-page/upload-dialog/upload-dialog.component.mjs +186 -0
  38. package/esm2022/lib/modules/upload-document-page/upload-document-page.component.mjs +367 -0
  39. package/esm2022/lib/pipe-public-URL/pipe-public-URL.module.mjs +20 -0
  40. package/esm2022/lib/pipe-public-URL/pipe-public-URL.pipe.mjs +23 -0
  41. package/esm2022/public-api.mjs +14 -0
  42. package/esm2022/sunbird-cb-cbp-ai.mjs +5 -0
  43. package/fesm2022/sunbird-cb-cbp-ai.mjs +12952 -0
  44. package/fesm2022/sunbird-cb-cbp-ai.mjs.map +1 -0
  45. package/index.d.ts +6 -0
  46. package/lib/ai-cbp-routing.module.d.ts +8 -0
  47. package/lib/ai-cbp-routing.module.d.ts.map +1 -0
  48. package/lib/ai-cbp.component.d.ts +7 -0
  49. package/lib/ai-cbp.component.d.ts.map +1 -0
  50. package/lib/ai-cbp.module.d.ts +68 -0
  51. package/lib/ai-cbp.module.d.ts.map +1 -0
  52. package/lib/ai-cbp.service.d.ts +7 -0
  53. package/lib/ai-cbp.service.d.ts.map +1 -0
  54. package/lib/components/add-course/add-course.component.d.ts +67 -0
  55. package/lib/components/add-course/add-course.component.d.ts.map +1 -0
  56. package/lib/components/add-designation/add-designation.component.d.ts +52 -0
  57. package/lib/components/add-designation/add-designation.component.d.ts.map +1 -0
  58. package/lib/components/add-personalisation/add-personalisation.component.d.ts +16 -0
  59. package/lib/components/add-personalisation/add-personalisation.component.d.ts.map +1 -0
  60. package/lib/components/approval-request-form/approval-request-form.component.d.ts +48 -0
  61. package/lib/components/approval-request-form/approval-request-form.component.d.ts.map +1 -0
  62. package/lib/components/approval-requests/approval-requests.component.d.ts +80 -0
  63. package/lib/components/approval-requests/approval-requests.component.d.ts.map +1 -0
  64. package/lib/components/dashboard/dashboard.component.d.ts +55 -0
  65. package/lib/components/dashboard/dashboard.component.d.ts.map +1 -0
  66. package/lib/components/delete-role-mapping/delete-role-mapping.component.d.ts +18 -0
  67. package/lib/components/delete-role-mapping/delete-role-mapping.component.d.ts.map +1 -0
  68. package/lib/components/delete-role-mapping-popup/delete-role-mapping-popup.component.d.ts +18 -0
  69. package/lib/components/delete-role-mapping-popup/delete-role-mapping-popup.component.d.ts.map +1 -0
  70. package/lib/components/edit-cbp-plan/edit-cbp-plan.component.d.ts +94 -0
  71. package/lib/components/edit-cbp-plan/edit-cbp-plan.component.d.ts.map +1 -0
  72. package/lib/components/gap-analysis-recommended-course/gap-analysis-recommended-course.component.d.ts +35 -0
  73. package/lib/components/gap-analysis-recommended-course/gap-analysis-recommended-course.component.d.ts.map +1 -0
  74. package/lib/components/generate-course-recommendation/generate-course-recommendation.component.d.ts +198 -0
  75. package/lib/components/generate-course-recommendation/generate-course-recommendation.component.d.ts.map +1 -0
  76. package/lib/components/list-popup/list-popup.component.d.ts +13 -0
  77. package/lib/components/list-popup/list-popup.component.d.ts.map +1 -0
  78. package/lib/components/review-request/review-request.component.d.ts +39 -0
  79. package/lib/components/review-request/review-request.component.d.ts.map +1 -0
  80. package/lib/components/role-mapping-generation/role-mapping-generation.component.d.ts +99 -0
  81. package/lib/components/role-mapping-generation/role-mapping-generation.component.d.ts.map +1 -0
  82. package/lib/components/role-mapping-list/role-mapping-list.component.d.ts +83 -0
  83. package/lib/components/role-mapping-list/role-mapping-list.component.d.ts.map +1 -0
  84. package/lib/components/suggest-more-courses/suggest-more-courses.component.d.ts +48 -0
  85. package/lib/components/suggest-more-courses/suggest-more-courses.component.d.ts.map +1 -0
  86. package/lib/components/update-designation-hierarchy/update-designation-hierarchy.component.d.ts +41 -0
  87. package/lib/components/update-designation-hierarchy/update-designation-hierarchy.component.d.ts.map +1 -0
  88. package/lib/components/view-cbp-plan/view-cbp-plan.component.d.ts +29 -0
  89. package/lib/components/view-cbp-plan/view-cbp-plan.component.d.ts.map +1 -0
  90. package/lib/components/view-course-recommendation/view-course-recommendation.component.d.ts +49 -0
  91. package/lib/components/view-course-recommendation/view-course-recommendation.component.d.ts.map +1 -0
  92. package/lib/components/view-final-cbp-plan/view-final-cbp-plan.component.d.ts +73 -0
  93. package/lib/components/view-final-cbp-plan/view-final-cbp-plan.component.d.ts.map +1 -0
  94. package/lib/modules/initial-screen/initial-screen.component.d.ts +85 -0
  95. package/lib/modules/initial-screen/initial-screen.component.d.ts.map +1 -0
  96. package/lib/modules/shared/constant/app.constant.d.ts +457 -0
  97. package/lib/modules/shared/constant/app.constant.d.ts.map +1 -0
  98. package/lib/modules/shared/directives/clickoutside.directive.d.ts +13 -0
  99. package/lib/modules/shared/directives/clickoutside.directive.d.ts.map +1 -0
  100. package/lib/modules/shared/directives/directive.module.d.ts +8 -0
  101. package/lib/modules/shared/directives/directive.module.d.ts.map +1 -0
  102. package/lib/modules/shared/pipes/order-by-name.pipe.d.ts +8 -0
  103. package/lib/modules/shared/pipes/order-by-name.pipe.d.ts.map +1 -0
  104. package/lib/modules/shared/services/event.service.d.ts +12 -0
  105. package/lib/modules/shared/services/event.service.d.ts.map +1 -0
  106. package/lib/modules/shared/services/events.d.ts +200 -0
  107. package/lib/modules/shared/services/events.d.ts.map +1 -0
  108. package/lib/modules/shared/services/init.service.d.ts +13 -0
  109. package/lib/modules/shared/services/init.service.d.ts.map +1 -0
  110. package/lib/modules/shared/services/role-mapping.service.d.ts +21 -0
  111. package/lib/modules/shared/services/role-mapping.service.d.ts.map +1 -0
  112. package/lib/modules/shared/services/shared.service.d.ts +108 -0
  113. package/lib/modules/shared/services/shared.service.d.ts.map +1 -0
  114. package/lib/modules/upload-document-page/progress-dialog/progress-dialog.component.d.ts +14 -0
  115. package/lib/modules/upload-document-page/progress-dialog/progress-dialog.component.d.ts.map +1 -0
  116. package/lib/modules/upload-document-page/upload-dialog/upload-dialog.component.d.ts +29 -0
  117. package/lib/modules/upload-document-page/upload-dialog/upload-dialog.component.d.ts.map +1 -0
  118. package/lib/modules/upload-document-page/upload-document-page.component.d.ts +64 -0
  119. package/lib/modules/upload-document-page/upload-document-page.component.d.ts.map +1 -0
  120. package/lib/pipe-public-URL/pipe-public-URL.module.d.ts +9 -0
  121. package/lib/pipe-public-URL/pipe-public-URL.module.d.ts.map +1 -0
  122. package/lib/pipe-public-URL/pipe-public-URL.pipe.d.ts +11 -0
  123. package/lib/pipe-public-URL/pipe-public-URL.pipe.d.ts.map +1 -0
  124. package/package.json +28 -0
  125. package/public-api.d.ts +11 -0
  126. package/public-api.d.ts.map +1 -0
  127. package/sunbird-cb-cbp-ai-0.0.1.tgz +0 -0
  128. package/sunbird-cb-cbp-ai.d.ts.map +1 -0
@@ -0,0 +1,265 @@
1
+ import { Component } from '@angular/core';
2
+ import moment from 'moment';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/forms";
5
+ import * as i2 from "../../modules/shared/services/shared.service";
6
+ import * as i3 from "@angular/material/snack-bar";
7
+ import * as i4 from "@angular/router";
8
+ import * as i5 from "@angular/common";
9
+ import * as i6 from "@angular/material/legacy-card";
10
+ import * as i7 from "@angular/material/legacy-form-field";
11
+ import * as i8 from "@angular/material/legacy-input";
12
+ import * as i9 from "@angular/material/icon";
13
+ import * as i10 from "@angular/material/legacy-select";
14
+ import * as i11 from "@angular/material/legacy-core";
15
+ import * as i12 from "ngx-daterangepicker-material";
16
+ export class DashboardComponent {
17
+ constructor(fb, sharedService, snackBar, router) {
18
+ this.fb = fb;
19
+ this.sharedService = sharedService;
20
+ this.snackBar = snackBar;
21
+ this.router = router;
22
+ this.isSuperAdmin = false;
23
+ this.selected = {
24
+ startDate: moment().subtract(3, 'month'),
25
+ endDate: moment()
26
+ };
27
+ this.ministriesList = [
28
+ { id: 1, name: 'Ministry A' },
29
+ { id: 2, name: 'Ministry B' },
30
+ { id: 3, name: 'Ministry C' }
31
+ ];
32
+ this.departmentsList = [
33
+ { id: 1, name: 'Dept X' },
34
+ { id: 2, name: 'Dept Y' },
35
+ { id: 3, name: 'Dept Z' }
36
+ ];
37
+ this.selectedMinistryType = 'ministry';
38
+ this.selectedMinistryId = '';
39
+ this.panelOpen = false;
40
+ this.departmentPanelOpen = false;
41
+ this.filteredList = [];
42
+ this.filteredDepartmentList = [];
43
+ this.ministryData = [];
44
+ this.ministryFullData = [];
45
+ this.departmentData = [];
46
+ this.selectedMinistryObj = {};
47
+ this.apiLoading = false;
48
+ this.loginUserOrgIds = [];
49
+ this.dashboardResponseObj = {};
50
+ this.cbpFinalObj = {};
51
+ }
52
+ ngOnInit() {
53
+ this.userProfile = JSON.parse(localStorage.getItem('userProfile') || '{}');
54
+ this.isSuperAdmin = this.userProfile?.role_info?.role_name === 'Super Admin'
55
+ && this.userProfile?.role_info?.is_active;
56
+ this.loginUserOrgIds = this.userProfile?.organization_ids;
57
+ this.cbpFinalObj = this.sharedService.getCBPPlanLocalStorage();
58
+ console.log('this.cbpFinalObj--', this.cbpFinalObj);
59
+ // Initialize the form without disabling anything
60
+ this.filtersForm = this.fb.group({
61
+ centreState: [''],
62
+ ministries: [[]],
63
+ departments: [[]],
64
+ dateRange: [{ startDate: moment().subtract(3, 'month'), endDate: moment() }]
65
+ });
66
+ if (this.cbpFinalObj) {
67
+ let event = { value: this.cbpFinalObj?.ministry?.sbOrgType };
68
+ let ministryEvent = { value: this.cbpFinalObj?.ministry?.identifier };
69
+ this.onMinistryTypeChange(event);
70
+ this.onMinistryChange(ministryEvent);
71
+ setTimeout(() => {
72
+ this.filtersForm.patchValue({
73
+ centreState: this.selectedMinistryType,
74
+ ministries: [this.cbpFinalObj?.ministry?.identifier],
75
+ departments: [this.cbpFinalObj?.departments]
76
+ });
77
+ }, 1000);
78
+ }
79
+ // Dynamically enable controls if super admin
80
+ if (this.isSuperAdmin) {
81
+ this.filtersForm.get('centreState')?.enable();
82
+ this.filtersForm.get('ministries')?.enable();
83
+ this.filtersForm.get('departments')?.enable();
84
+ }
85
+ else {
86
+ // optionally disable for non-super-admin
87
+ this.filtersForm.get('centreState')?.disable();
88
+ this.filtersForm.get('ministries')?.disable();
89
+ this.filtersForm.get('departments')?.disable();
90
+ }
91
+ // Trigger API call on filter change
92
+ this.filtersForm.valueChanges.subscribe(val => {
93
+ this.getDashboardData(val);
94
+ });
95
+ }
96
+ getDashboardData(val) {
97
+ console.log('val', val);
98
+ let dateRangePayload = null;
99
+ if (val.dateRange && val.dateRange.startDate && val.dateRange.endDate) {
100
+ dateRangePayload = {
101
+ from: moment(val.dateRange.startDate).format('YYYY-MM-DD'),
102
+ to: moment(val.dateRange.endDate).format('YYYY-MM-DD')
103
+ };
104
+ }
105
+ let payload = {
106
+ ministries: val?.ministries,
107
+ date_range: dateRangePayload
108
+ };
109
+ if (val?.departments?.length) {
110
+ payload['departments'] = val?.departments;
111
+ }
112
+ if (this.isSuperAdmin) {
113
+ this.dashboardData = {};
114
+ this.sharedService.getDashboardAdmin(payload).subscribe((res) => {
115
+ console.log('res from admin', res);
116
+ Object.assign(this.dashboardData, res); // merge data
117
+ console.log('this.dashboardData after admin', this.dashboardData);
118
+ });
119
+ this.sharedService.getDashboardGapAnalysisAdmin(payload).subscribe((res) => {
120
+ console.log('res from gap analysis', res);
121
+ Object.assign(this.dashboardData, res); // merge data
122
+ console.log('this.dashboardData after gap analysis', this.dashboardData);
123
+ });
124
+ }
125
+ else {
126
+ this.dashboardData = {};
127
+ this.sharedService.getDashboardPublic(payload).subscribe((res) => {
128
+ Object.assign(this.dashboardData, res);
129
+ });
130
+ this.sharedService.getDashboardGapAnalysisPublic(payload).subscribe((res) => {
131
+ Object.assign(this.dashboardData, res);
132
+ });
133
+ }
134
+ console.log('this.dashboardData', this.dashboardData);
135
+ }
136
+ onOpened(opened) {
137
+ this.panelOpen = opened;
138
+ }
139
+ onOpenedDepartment(opened) {
140
+ this.departmentPanelOpen = opened;
141
+ }
142
+ filterData(event) {
143
+ if (event && event.target && event.target.value) {
144
+ const s = event.target.value.toLowerCase();
145
+ this.filteredList = this.ministryData.filter(x => x.orgName.toLowerCase().includes(s));
146
+ }
147
+ else {
148
+ this.filteredList = this.ministryData;
149
+ }
150
+ }
151
+ filterDepartmentData(event) {
152
+ if (event && event.target && event.target.value) {
153
+ const s = event.target.value.toLowerCase();
154
+ this.filteredDepartmentList = this.departmentData.filter(x => x.orgName.toLowerCase().includes(s));
155
+ }
156
+ else {
157
+ this.filteredDepartmentList = this.departmentData;
158
+ }
159
+ }
160
+ onMinistryChange(event) {
161
+ const selectedMinistryId = event.value;
162
+ console.log('Selected Ministry ID:', selectedMinistryId);
163
+ this.departmentData = [];
164
+ // You can access the selected object if needed
165
+ const selectedMinistry = this.ministryData.find(item => item.identifier === selectedMinistryId);
166
+ this.selectedMinistryObj = selectedMinistry;
167
+ if (selectedMinistryId && this.selectedMinistryType === 'state') {
168
+ this.sharedService.getDepartmentList(selectedMinistryId).subscribe((res) => {
169
+ this.departmentData = res;
170
+ this.filteredDepartmentList = res;
171
+ });
172
+ }
173
+ if (selectedMinistryId && this.selectedMinistryType === 'ministry') {
174
+ this.sharedService.getCenterBasedDepartment(selectedMinistryId).subscribe((res) => {
175
+ if (res?.length) {
176
+ this.departmentData = res;
177
+ this.filteredDepartmentList = res;
178
+ }
179
+ else {
180
+ this.snackBar.open('No Department Found for Selected Ministry', 'X', {
181
+ duration: 3000,
182
+ panelClass: ['snackbar-error']
183
+ });
184
+ }
185
+ });
186
+ }
187
+ }
188
+ onDepartmentChange() {
189
+ const formData = this.filtersForm.value;
190
+ const selectedMinistry = this.ministryData.find(item => item.identifier === formData.ministry);
191
+ this.sharedService.cbpPlanFinalObj['ministry'] = selectedMinistry;
192
+ const departmentName = this.departmentData.find(u => u.identifier === formData.departments);
193
+ this.sharedService.cbpPlanFinalObj['department_name'] = departmentName?.orgName;
194
+ }
195
+ async onMinistryTypeChange(event) {
196
+ console.log('event', event);
197
+ this.selectedMinistryType = event.value;
198
+ await this.getMinistryData();
199
+ this.ministryData = [];
200
+ if (event?.value === 'state') {
201
+ this.filtersForm.patchValue({
202
+ centreState: this.selectedMinistryType,
203
+ ministries: [],
204
+ departments: []
205
+ });
206
+ this.ministryFullData.forEach((item) => {
207
+ if (item?.type === 'state') {
208
+ this.ministryData.push(item);
209
+ }
210
+ });
211
+ }
212
+ else if (event?.value === 'ministry') {
213
+ this.ministryFullData.forEach((item) => {
214
+ if (item?.type === 'central') {
215
+ this.ministryData.push(item);
216
+ }
217
+ });
218
+ }
219
+ this.filtersForm.patchValue({
220
+ centreState: this.selectedMinistryType,
221
+ ministries: [],
222
+ departments: []
223
+ });
224
+ }
225
+ getMinistryData() {
226
+ this.apiLoading = true;
227
+ this.sharedService.getMinistryData(this.selectedMinistryType).subscribe((data) => {
228
+ console.log('data--', data);
229
+ this.ministryFullData = data;
230
+ this.apiLoading = false;
231
+ this.ministryData = [];
232
+ let filteredMinistryData = [];
233
+ this.ministryFullData.map((item) => {
234
+ if (this.loginUserOrgIds.indexOf(item?.identifier) > -1) {
235
+ filteredMinistryData.push(item);
236
+ }
237
+ this.filteredList = filteredMinistryData;
238
+ });
239
+ if (this.selectedMinistryType === 'ministry') {
240
+ data.forEach((item) => {
241
+ if (item?.sbOrgType === 'ministry') {
242
+ this.ministryData.push(item);
243
+ }
244
+ });
245
+ }
246
+ else if (this.selectedMinistryType === 'state') {
247
+ data.forEach((item) => {
248
+ if (item?.sbOrgType === 'state') {
249
+ this.ministryData.push(item);
250
+ }
251
+ });
252
+ }
253
+ });
254
+ }
255
+ routeToInitial() {
256
+ this.router.navigate(['/ai/initial']);
257
+ }
258
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DashboardComponent, deps: [{ token: i1.FormBuilder }, { token: i2.SharedService }, { token: i3.MatSnackBar }, { token: i4.Router }], target: i0.ɵɵFactoryTarget.Component }); }
259
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DashboardComponent, selector: "app-dashboard", ngImport: i0, template: "<div class=\"dashboard-wrapper\">\n <div class=\"header\">\n <div class=\"sub-heading mt-10 mb-10 cursor-pointer\">\n <p (click)=\"routeToInitial()\"><mat-icon style=\"vertical-align: middle;\">arrow_back</mat-icon><span\n class=\"pl-10\">Back to Role Mapping Generation</span></p>\n </div>\n\n </div>\n <div class=\"dashboard-container\">\n\n <!-- FILTERS SECTION -->\n <form [formGroup]=\"filtersForm\" class=\"filters-form\">\n\n <mat-card class=\"filters-card\">\n <div class=\"filters-header\">\n <mat-icon>filter_list</mat-icon>\n <span>Filters</span>\n </div>\n\n <div class=\"filters-row\">\n <div>\n <label>Centre / State </label>\n <!-- Centre / State -->\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px; border: 1px solid #ccc;width: 100%;\">\n\n <mat-select formControlName=\"centreState\" [disabled]=\"!isSuperAdmin\"\n (selectionChange)=\"onMinistryTypeChange($event)\">\n <mat-option value=\"\">Select Center/State</mat-option>\n <mat-option value=\"ministry\">Center</mat-option>\n <mat-option value=\"state\">State</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div>\n <label>Ministry </label>\n <!-- Centre / State -->\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 panelClass=\"select-with-search\" [disabled]=\"!isSuperAdmin\" multiple\n [placeholder]=\"selectedMinistryType === 'ministry' ? 'Select Ministry/ Department':'Select State'\"\n (selectionChange)=\"onMinistryChange($event)\" formControlName=\"ministries\"\n style=\"border-radius: 25px; background: white; width:100%\"\n (openedChange)=\"onOpened($event)\">\n <div class=\"search-wrapper\" *ngIf=\"panelOpen\">\n <input type=\"text\" placeholder=\"Search...\" (input)=\"filterData($event)\"\n class=\"search-input\" (keydown.space)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </div>\n <mat-option [value]=\"item?.identifier\" *ngFor=\"let item of filteredList\"\n [selected]=\"selectedMinistryId === item?.identifier\">{{item?.orgName}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div>\n <label>Department</label>\n <!-- Centre / State -->\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\"\n [disabled]=\"!isSuperAdmin\" multiple formControlName=\"departments\"\n style=\"border-radius: 25px; background: white;\" (selectionChange)=\"onDepartmentChange()\"\n (openedChange)=\"onOpenedDepartment($event)\">\n <div class=\"search-wrapper\" *ngIf=\"departmentPanelOpen\">\n <input type=\"text\" placeholder=\"Search...\" (input)=\"filterDepartmentData($event)\"\n class=\"search-input\" (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 <!-- Date Range -->\n <div>\n <label>Date Range </label>\n <mat-form-field appearance=\"outline\">\n\n <input matInput ngxDaterangepickerMd formControlName=\"dateRange\" style=\"margin:10px\"\n placeholder=\"Select date range\" [autoApply]=\"true\" [linkedCalendars]=\"true\"\n [locale]=\"{ format: 'DD MMM YYYY' }\" />\n </mat-form-field>\n </div>\n\n\n </div>\n </mat-card>\n </form>\n\n <!-- OVERVIEW METRICS -->\n <h2 class=\"section-title\">\n <mat-icon>dashboard</mat-icon>\n Overview Metrics\n </h2>\n\n <div class=\"card-grid\">\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">States/Ministries which generated Role Mapping</p>\n <h2>{{this.dashboardData?.ministry_count}}</h2>\n <p class=\"card-subtitle\">At least 1 designation/role mapping</p>\n </div>\n <mat-icon class=\"icon primary\">public</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Departments which generated Role Mapping</p>\n <h2>{{this.dashboardData?.department_count}}</h2>\n <p class=\"card-subtitle\">At least 1 designation/role mapping</p>\n </div>\n <mat-icon class=\"icon teal\">apartment</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Total Capacity Building Plans Created</p>\n <h2>{{this.dashboardData?.total_cbp_plan_count}}</h2>\n </div>\n <mat-icon class=\"icon green\">description</mat-icon>\n </div>\n </mat-card>\n\n </div>\n\n <!-- COMPETENCIES -->\n <h2 class=\"section-title\">\n <mat-icon>psychology</mat-icon>\n Competencies Recommended\n </h2>\n\n <div class=\"card-grid\">\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Behavioral Competencies</p>\n <h2>{{this.dashboardData?.behavioral_competencies_count}}</h2>\n </div>\n <mat-icon class=\"icon purple\">psychology</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Functional Competencies</p>\n <h2>{{this.dashboardData?.functional_competencies_count}}</h2>\n </div>\n <mat-icon class=\"icon teal\">settings</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Domain Competencies</p>\n <h2>{{this.dashboardData?.domain_competencies_count}}</h2>\n </div>\n <mat-icon class=\"icon orange\">tune</mat-icon>\n </div>\n </mat-card>\n\n </div>\n\n <!-- DOCUMENTS -->\n <h2 class=\"section-title\">\n <mat-icon>menu_book</mat-icon>\n Documents & Course Recommendations\n </h2>\n\n <div class=\"card-grid\">\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Total Documents Uploaded</p>\n <h2>{{this.dashboardData?.total_documents}}</h2>\n <p class=\"card-subtitle\">Min 1, Max 10 per role mapping</p>\n </div>\n <mat-icon class=\"icon amber\">upload_file</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Role Mappings with Course Recommendations</p>\n <h2>{{this.dashboardData?.role_mappings_with_recommendations}}</h2>\n <p class=\"card-subtitle\">8500 of 50,000 role mappings</p>\n </div>\n <mat-icon class=\"icon green\">menu_book</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Course Recommendations Saved</p>\n <h2>{{this.dashboardData?.saved_recommended_courses_count}}</h2>\n <p class=\"card-subtitle\">{{this.dashboardData?.saved_recommended_courses_count}} of 8500\n recommendations</p>\n </div>\n <mat-icon class=\"icon teal\">save</mat-icon>\n </div>\n </mat-card>\n\n </div>\n\n <!-- GAP ANALYSIS -->\n <div class=\"gap-section\">\n <h2 class=\"section-title warning\">\n <mat-icon>warning</mat-icon>\n Gap Analysis\n </h2>\n\n <div class=\"card-grid\">\n\n <mat-card class=\"metric-card warning-bg\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Competencies Without Courses</p>\n <h2>{{this.dashboardData?.competencies_without_courses}}</h2>\n <p class=\"card-subtitle\">Unique competencies with no identified courses</p>\n </div>\n <mat-icon class=\"icon red\">cancel</mat-icon>\n </div>\n </mat-card>\n\n <!-- <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Manually Added Courses</p>\n <h2>-</h2>\n <p class=\"card-subtitle\">Competencies with user-added courses</p>\n </div>\n <mat-icon class=\"icon green\">add_circle</mat-icon>\n </div>\n </mat-card> -->\n\n </div>\n\n <div class=\"card-grid mt-2\">\n\n <mat-card class=\"metric-card warning-bg\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Behavioral Competencies Without Courses</p>\n <h2>{{this.dashboardData?.behavioral_without_courses}}</h2>\n </div>\n <mat-icon class=\"icon red\">cancel</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Functional Competencies Without Courses</p>\n <h2>{{this.dashboardData?.functional_without_courses}}</h2>\n </div>\n <mat-icon class=\"icon red\">cancel</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Domain Competencies Without Courses</p>\n <h2>{{this.dashboardData?.domain_without_courses}}</h2>\n </div>\n <mat-icon class=\"icon red\">cancel</mat-icon>\n </div>\n </mat-card>\n\n </div>\n </div>\n\n <!-- OVERVIEW METRICS -->\n <h2 class=\"section-title\">\n <mat-icon>dashboard</mat-icon>\n Users and Role Mapping Metrics\n </h2>\n\n <div class=\"card-grid\">\n\n <mat-card class=\"metric-card\" *ngIf=\"!isSuperAdmin\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Unique Users (Credentials)</p>\n <h2>{{this.dashboardData?.total_users}}</h2>\n </div>\n <mat-icon class=\"icon primary\">public</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\" *ngIf=\"!isSuperAdmin\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Unique Users with Role Mappings</p>\n <h2>{{this.dashboardData?.users_with_role_mappings}}</h2>\n <p class=\"card-subtitle\">Generated atleast 1 role mapping</p>\n </div>\n <mat-icon class=\"icon teal\">apartment</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Total Designation/Role Mappings Generated</p>\n <h2>{{this.dashboardData?.total_role_mappings}}</h2>\n </div>\n <mat-icon class=\"icon green\">description</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Unique Role Mappings</p>\n <h2>{{this.dashboardData?.unique_role_mappings}}</h2>\n <p class=\"card-subtitle\">10,000 unique of 50,000 total</p>\n </div>\n <mat-icon class=\"icon teal\">apartment</mat-icon>\n </div>\n </mat-card>\n\n </div>\n </div>\n</div>", styles: [".dashboard-wrapper{background:transparent;min-height:100vh;padding:24px 10px;margin:0 30px 0 60px}.dashboard-container{max-width:auto;margin:0 auto}.section-title{display:flex;align-items:center;gap:10px;font-size:18px;font-weight:600;color:#000;margin:20px 0}.card-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:32px}.metric-card{padding:24px;border-radius:12px;box-shadow:none;border:1px solid #e5e7eb}.card-content{display:flex;justify-content:space-between;align-items:center}.card-title{font-size:14px;color:#6b7280;margin-bottom:6px}.metric-card h2{font-size:28px;font-weight:700;color:#000;margin:0}.card-subtitle{font-size:12px;color:#9ca3af;margin-top:6px}.icon{font-size:28px;width:40px;height:40px;border-radius:8px;display:flex;align-items:center;justify-content:center}.primary{color:#2563eb}.teal{color:#059669}.green{color:#16a34a}.purple{color:#9333ea}.orange{color:#f97316}.amber{color:#f59e0b}.red,.section-title.warning{color:#dc2626}.warning-card{background:#fdeaea;border:1px solid #f5c2c7}.filters-card{padding:20px 24px;border-radius:12px;border:1px solid #e5e7eb;box-shadow:none}.filters-header{display:flex;align-items:center;gap:8px;font-weight:600;margin-bottom:16px}.filters-row{display:flex;gap:24px;flex-wrap:wrap}.filters-row mat-form-field{flex:1;min-width:220px}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline{color:#ccc}:host ::ng-deep .mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:#1b4ca1;border-color:#1b4ca1!important}::ng-deep .select-search-panel .mat-option.mat-selected:not(.mat-option-disabled){background-color:#1b4ca1!important;color:#fff!important}:host ::ng-deep .mat-form-field-appearance-outline{border-radius:25px;border:1px solid #ccc}:host ::ng-deep .mat-form-field-focused .mat-form-field-appearance-outline{border-color:#1b4ca1!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-start{border-radius:25px 0 0 25px;border:none!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-end{border-right:none!important;border:none!important;border-radius:0 25px 25px 0}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-gap{border:none!important;border-radius:25px}:host::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix{background-color:transparent!important}.dashboard-container .mat-card{background-color:#fff}.gap-title{color:#b91c1c}.gap-section{background-color:#d926621a;padding:10px;border-radius:12px;border:1px solid #f5c2c7;margin:16px 0}.gap-card{background-color:#d926621a;border:1px solid #f8d7da}.gap-card h2{color:#dc2626}@media (max-width: 1200px){.card-grid{grid-template-columns:repeat(2,1fr)}}@media (max-width: 768px){.card-grid{grid-template-columns:1fr}}.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}::ng-deep .md-drppicker.ltr{min-width:500px!important}.sub-heading p{color:#000;font-family:Montserrat;font-size:18px;font-style:normal;font-weight:600;line-height:normal}.mb-10{margin-bottom:10px}.cursor-pointer{cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.MatLegacyCard, selector: "mat-card", exportAs: ["matCard"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i7.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.MatLegacySelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i11.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i12.DaterangepickerDirective, selector: "input[ngxDaterangepickerMd]", inputs: ["minDate", "maxDate", "autoApply", "alwaysShowCalendars", "showCustomRangeLabel", "linkedCalendars", "dateLimit", "singleDatePicker", "showWeekNumbers", "showISOWeekNumbers", "showDropdowns", "isInvalidDate", "isCustomDate", "isTooltipDate", "showClearButton", "customRangeDirection", "ranges", "opens", "drops", "firstMonthDayClass", "lastMonthDayClass", "emptyWeekRowClass", "emptyWeekColumnClass", "firstDayOfNextMonthClass", "lastDayOfPreviousMonthClass", "keepCalendarOpeningWithRange", "showRangeLabelOnInput", "showCancel", "lockStartDate", "timePicker", "timePicker24Hour", "timePickerIncrement", "timePickerSeconds", "closeOnAutoApply", "endKeyHolder", "startKey", "locale", "endKey"], outputs: ["change", "rangeClicked", "datesUpdated", "startDateChanged", "endDateChanged", "clearClicked"] }] }); }
260
+ }
261
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DashboardComponent, decorators: [{
262
+ type: Component,
263
+ args: [{ selector: 'app-dashboard', template: "<div class=\"dashboard-wrapper\">\n <div class=\"header\">\n <div class=\"sub-heading mt-10 mb-10 cursor-pointer\">\n <p (click)=\"routeToInitial()\"><mat-icon style=\"vertical-align: middle;\">arrow_back</mat-icon><span\n class=\"pl-10\">Back to Role Mapping Generation</span></p>\n </div>\n\n </div>\n <div class=\"dashboard-container\">\n\n <!-- FILTERS SECTION -->\n <form [formGroup]=\"filtersForm\" class=\"filters-form\">\n\n <mat-card class=\"filters-card\">\n <div class=\"filters-header\">\n <mat-icon>filter_list</mat-icon>\n <span>Filters</span>\n </div>\n\n <div class=\"filters-row\">\n <div>\n <label>Centre / State </label>\n <!-- Centre / State -->\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px; border: 1px solid #ccc;width: 100%;\">\n\n <mat-select formControlName=\"centreState\" [disabled]=\"!isSuperAdmin\"\n (selectionChange)=\"onMinistryTypeChange($event)\">\n <mat-option value=\"\">Select Center/State</mat-option>\n <mat-option value=\"ministry\">Center</mat-option>\n <mat-option value=\"state\">State</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div>\n <label>Ministry </label>\n <!-- Centre / State -->\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 panelClass=\"select-with-search\" [disabled]=\"!isSuperAdmin\" multiple\n [placeholder]=\"selectedMinistryType === 'ministry' ? 'Select Ministry/ Department':'Select State'\"\n (selectionChange)=\"onMinistryChange($event)\" formControlName=\"ministries\"\n style=\"border-radius: 25px; background: white; width:100%\"\n (openedChange)=\"onOpened($event)\">\n <div class=\"search-wrapper\" *ngIf=\"panelOpen\">\n <input type=\"text\" placeholder=\"Search...\" (input)=\"filterData($event)\"\n class=\"search-input\" (keydown.space)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </div>\n <mat-option [value]=\"item?.identifier\" *ngFor=\"let item of filteredList\"\n [selected]=\"selectedMinistryId === item?.identifier\">{{item?.orgName}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div>\n <label>Department</label>\n <!-- Centre / State -->\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\"\n [disabled]=\"!isSuperAdmin\" multiple formControlName=\"departments\"\n style=\"border-radius: 25px; background: white;\" (selectionChange)=\"onDepartmentChange()\"\n (openedChange)=\"onOpenedDepartment($event)\">\n <div class=\"search-wrapper\" *ngIf=\"departmentPanelOpen\">\n <input type=\"text\" placeholder=\"Search...\" (input)=\"filterDepartmentData($event)\"\n class=\"search-input\" (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 <!-- Date Range -->\n <div>\n <label>Date Range </label>\n <mat-form-field appearance=\"outline\">\n\n <input matInput ngxDaterangepickerMd formControlName=\"dateRange\" style=\"margin:10px\"\n placeholder=\"Select date range\" [autoApply]=\"true\" [linkedCalendars]=\"true\"\n [locale]=\"{ format: 'DD MMM YYYY' }\" />\n </mat-form-field>\n </div>\n\n\n </div>\n </mat-card>\n </form>\n\n <!-- OVERVIEW METRICS -->\n <h2 class=\"section-title\">\n <mat-icon>dashboard</mat-icon>\n Overview Metrics\n </h2>\n\n <div class=\"card-grid\">\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">States/Ministries which generated Role Mapping</p>\n <h2>{{this.dashboardData?.ministry_count}}</h2>\n <p class=\"card-subtitle\">At least 1 designation/role mapping</p>\n </div>\n <mat-icon class=\"icon primary\">public</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Departments which generated Role Mapping</p>\n <h2>{{this.dashboardData?.department_count}}</h2>\n <p class=\"card-subtitle\">At least 1 designation/role mapping</p>\n </div>\n <mat-icon class=\"icon teal\">apartment</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Total Capacity Building Plans Created</p>\n <h2>{{this.dashboardData?.total_cbp_plan_count}}</h2>\n </div>\n <mat-icon class=\"icon green\">description</mat-icon>\n </div>\n </mat-card>\n\n </div>\n\n <!-- COMPETENCIES -->\n <h2 class=\"section-title\">\n <mat-icon>psychology</mat-icon>\n Competencies Recommended\n </h2>\n\n <div class=\"card-grid\">\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Behavioral Competencies</p>\n <h2>{{this.dashboardData?.behavioral_competencies_count}}</h2>\n </div>\n <mat-icon class=\"icon purple\">psychology</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Functional Competencies</p>\n <h2>{{this.dashboardData?.functional_competencies_count}}</h2>\n </div>\n <mat-icon class=\"icon teal\">settings</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Domain Competencies</p>\n <h2>{{this.dashboardData?.domain_competencies_count}}</h2>\n </div>\n <mat-icon class=\"icon orange\">tune</mat-icon>\n </div>\n </mat-card>\n\n </div>\n\n <!-- DOCUMENTS -->\n <h2 class=\"section-title\">\n <mat-icon>menu_book</mat-icon>\n Documents & Course Recommendations\n </h2>\n\n <div class=\"card-grid\">\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Total Documents Uploaded</p>\n <h2>{{this.dashboardData?.total_documents}}</h2>\n <p class=\"card-subtitle\">Min 1, Max 10 per role mapping</p>\n </div>\n <mat-icon class=\"icon amber\">upload_file</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Role Mappings with Course Recommendations</p>\n <h2>{{this.dashboardData?.role_mappings_with_recommendations}}</h2>\n <p class=\"card-subtitle\">8500 of 50,000 role mappings</p>\n </div>\n <mat-icon class=\"icon green\">menu_book</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Course Recommendations Saved</p>\n <h2>{{this.dashboardData?.saved_recommended_courses_count}}</h2>\n <p class=\"card-subtitle\">{{this.dashboardData?.saved_recommended_courses_count}} of 8500\n recommendations</p>\n </div>\n <mat-icon class=\"icon teal\">save</mat-icon>\n </div>\n </mat-card>\n\n </div>\n\n <!-- GAP ANALYSIS -->\n <div class=\"gap-section\">\n <h2 class=\"section-title warning\">\n <mat-icon>warning</mat-icon>\n Gap Analysis\n </h2>\n\n <div class=\"card-grid\">\n\n <mat-card class=\"metric-card warning-bg\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Competencies Without Courses</p>\n <h2>{{this.dashboardData?.competencies_without_courses}}</h2>\n <p class=\"card-subtitle\">Unique competencies with no identified courses</p>\n </div>\n <mat-icon class=\"icon red\">cancel</mat-icon>\n </div>\n </mat-card>\n\n <!-- <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Manually Added Courses</p>\n <h2>-</h2>\n <p class=\"card-subtitle\">Competencies with user-added courses</p>\n </div>\n <mat-icon class=\"icon green\">add_circle</mat-icon>\n </div>\n </mat-card> -->\n\n </div>\n\n <div class=\"card-grid mt-2\">\n\n <mat-card class=\"metric-card warning-bg\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Behavioral Competencies Without Courses</p>\n <h2>{{this.dashboardData?.behavioral_without_courses}}</h2>\n </div>\n <mat-icon class=\"icon red\">cancel</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Functional Competencies Without Courses</p>\n <h2>{{this.dashboardData?.functional_without_courses}}</h2>\n </div>\n <mat-icon class=\"icon red\">cancel</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Domain Competencies Without Courses</p>\n <h2>{{this.dashboardData?.domain_without_courses}}</h2>\n </div>\n <mat-icon class=\"icon red\">cancel</mat-icon>\n </div>\n </mat-card>\n\n </div>\n </div>\n\n <!-- OVERVIEW METRICS -->\n <h2 class=\"section-title\">\n <mat-icon>dashboard</mat-icon>\n Users and Role Mapping Metrics\n </h2>\n\n <div class=\"card-grid\">\n\n <mat-card class=\"metric-card\" *ngIf=\"!isSuperAdmin\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Unique Users (Credentials)</p>\n <h2>{{this.dashboardData?.total_users}}</h2>\n </div>\n <mat-icon class=\"icon primary\">public</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\" *ngIf=\"!isSuperAdmin\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Unique Users with Role Mappings</p>\n <h2>{{this.dashboardData?.users_with_role_mappings}}</h2>\n <p class=\"card-subtitle\">Generated atleast 1 role mapping</p>\n </div>\n <mat-icon class=\"icon teal\">apartment</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Total Designation/Role Mappings Generated</p>\n <h2>{{this.dashboardData?.total_role_mappings}}</h2>\n </div>\n <mat-icon class=\"icon green\">description</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Unique Role Mappings</p>\n <h2>{{this.dashboardData?.unique_role_mappings}}</h2>\n <p class=\"card-subtitle\">10,000 unique of 50,000 total</p>\n </div>\n <mat-icon class=\"icon teal\">apartment</mat-icon>\n </div>\n </mat-card>\n\n </div>\n </div>\n</div>", styles: [".dashboard-wrapper{background:transparent;min-height:100vh;padding:24px 10px;margin:0 30px 0 60px}.dashboard-container{max-width:auto;margin:0 auto}.section-title{display:flex;align-items:center;gap:10px;font-size:18px;font-weight:600;color:#000;margin:20px 0}.card-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:32px}.metric-card{padding:24px;border-radius:12px;box-shadow:none;border:1px solid #e5e7eb}.card-content{display:flex;justify-content:space-between;align-items:center}.card-title{font-size:14px;color:#6b7280;margin-bottom:6px}.metric-card h2{font-size:28px;font-weight:700;color:#000;margin:0}.card-subtitle{font-size:12px;color:#9ca3af;margin-top:6px}.icon{font-size:28px;width:40px;height:40px;border-radius:8px;display:flex;align-items:center;justify-content:center}.primary{color:#2563eb}.teal{color:#059669}.green{color:#16a34a}.purple{color:#9333ea}.orange{color:#f97316}.amber{color:#f59e0b}.red,.section-title.warning{color:#dc2626}.warning-card{background:#fdeaea;border:1px solid #f5c2c7}.filters-card{padding:20px 24px;border-radius:12px;border:1px solid #e5e7eb;box-shadow:none}.filters-header{display:flex;align-items:center;gap:8px;font-weight:600;margin-bottom:16px}.filters-row{display:flex;gap:24px;flex-wrap:wrap}.filters-row mat-form-field{flex:1;min-width:220px}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline{color:#ccc}:host ::ng-deep .mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:#1b4ca1;border-color:#1b4ca1!important}::ng-deep .select-search-panel .mat-option.mat-selected:not(.mat-option-disabled){background-color:#1b4ca1!important;color:#fff!important}:host ::ng-deep .mat-form-field-appearance-outline{border-radius:25px;border:1px solid #ccc}:host ::ng-deep .mat-form-field-focused .mat-form-field-appearance-outline{border-color:#1b4ca1!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-start{border-radius:25px 0 0 25px;border:none!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-end{border-right:none!important;border:none!important;border-radius:0 25px 25px 0}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-gap{border:none!important;border-radius:25px}:host::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix{background-color:transparent!important}.dashboard-container .mat-card{background-color:#fff}.gap-title{color:#b91c1c}.gap-section{background-color:#d926621a;padding:10px;border-radius:12px;border:1px solid #f5c2c7;margin:16px 0}.gap-card{background-color:#d926621a;border:1px solid #f8d7da}.gap-card h2{color:#dc2626}@media (max-width: 1200px){.card-grid{grid-template-columns:repeat(2,1fr)}}@media (max-width: 768px){.card-grid{grid-template-columns:1fr}}.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}::ng-deep .md-drppicker.ltr{min-width:500px!important}.sub-heading p{color:#000;font-family:Montserrat;font-size:18px;font-style:normal;font-weight:600;line-height:normal}.mb-10{margin-bottom:10px}.cursor-pointer{cursor:pointer}\n"] }]
264
+ }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.SharedService }, { type: i3.MatSnackBar }, { type: i4.Router }]; } });
265
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFzaGJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcnkvc3VuYmlyZC1jYi9jYnAtYWkvc3JjL2xpYi9jb21wb25lbnRzL2Rhc2hib2FyZC9kYXNoYm9hcmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvZGFzaGJvYXJkL2Rhc2hib2FyZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBTWxELE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUFNNUIsTUFBTSxPQUFPLGtCQUFrQjtJQW1DN0IsWUFBb0IsRUFBZSxFQUFVLGFBQTRCLEVBQVUsUUFBcUIsRUFBUyxNQUFjO1FBQTNHLE9BQUUsR0FBRixFQUFFLENBQWE7UUFBVSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQWE7UUFBUyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBakMvSCxpQkFBWSxHQUFHLEtBQUssQ0FBQTtRQUNwQixhQUFRLEdBQVE7WUFDZCxTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUM7WUFDeEMsT0FBTyxFQUFFLE1BQU0sRUFBRTtTQUNsQixDQUFDO1FBRUYsbUJBQWMsR0FBRztZQUNmLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFO1lBQzdCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFO1lBQzdCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFO1NBQzlCLENBQUM7UUFFRixvQkFBZSxHQUFHO1lBQ2hC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QUNILENBQUMsQ0FBQyxDQUFBO2FBQ0g7aUJBQU0sSUFBSSxJQUFJLENBQUMsb0JBQW9CLEtBQUssT0FBTyxFQUFFO2dCQUNoRCxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7b0JBQ3BCLElBQUksSUFBSSxFQUFFLFNBQVMsS0FBSyxPQUFPLEVBQUU7d0JBQy9CLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO3FCQUM3QjtnQkFDSCxDQUFDLENBQUMsQ0FBQTthQUNIO1FBQ0gsQ0FBQyxDQUFDLENBQUE7SUFHSixDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUN4QyxDQUFDOytHQS9RVSxrQkFBa0I7bUdBQWxCLGtCQUFrQixxRENaL0IscXhlQWlWTTs7NEZEclVPLGtCQUFrQjtrQkFMOUIsU0FBUzsrQkFDRSxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFNoYXJlZFNlcnZpY2UgfSBmcm9tICcuLi8uLi9tb2R1bGVzL3NoYXJlZC9zZXJ2aWNlcy9zaGFyZWQuc2VydmljZSc7XG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc25hY2stYmFyJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZGFzaGJvYXJkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Rhc2hib2FyZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Rhc2hib2FyZC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIERhc2hib2FyZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHVzZXJQcm9maWxlOiBhbnlcbiAgaXNTdXBlckFkbWluID0gZmFsc2VcbiAgc2VsZWN0ZWQ6IGFueSA9IHtcbiAgICBzdGFydERhdGU6IG1vbWVudCgpLnN1YnRyYWN0KDMsICdtb250aCcpLFxuICAgIGVuZERhdGU6IG1vbWVudCgpXG4gIH07XG4gIGZpbHRlcnNGb3JtITogRm9ybUdyb3VwO1xuICBtaW5pc3RyaWVzTGlzdCA9IFtcbiAgICB7IGlkOiAxLCBuYW1lOiAnTWluaXN0cnkgQScgfSxcbiAgICB7IGlkOiAyLCBuYW1lOiAnTWluaXN0cnkgQicgfSxcbiAgICB7IGlkOiAzLCBuYW1lOiAnTWluaXN0cnkgQycgfVxuICBdO1xuXG4gIGRlcGFydG1lbnRzTGlzdCA9IFtcbiAgICB7IGlkOiAxLCBuYW1lOiAnRGVwdCBYJyB9LFxuICAgIHsgaWQ6IDIsIG5hbWU6ICdEZXB0IFknIH0sXG4gICAgeyBpZDogMywgbmFtZTogJ0RlcHQgWicgfVxuICBdO1xuICBzZWxlY3RlZE1pbmlzdHJ5VHlwZSA9ICdtaW5pc3RyeSdcbiAgc2VsZWN0ZWRNaW5pc3RyeUlkID0gJydcbiAgcGFuZWxPcGVuID0gZmFsc2U7XG4gIGRlcGFydG1lbnRQYW5lbE9wZW4gPSBmYWxzZVxuICBmaWx0ZXJlZExpc3QgPSBbXTtcbiAgZmlsdGVyZWREZXBhcnRtZW50TGlzdCA9IFtdO1xuICBtaW5pc3RyeURhdGE6IGFueSA9IFtdXG4gIG1pbmlzdHJ5RnVsbERhdGE6IGFueSA9IFtdXG4gIGRlcGFydG1lbnREYXRhID0gW11cbiAgc2VsZWN0ZWRNaW5pc3RyeU9iaiA9IHt9XG4gIGFwaUxvYWRpbmcgPSBmYWxzZVxuICBsb2dpblVzZXJPcmdJZHMgPSBbXVxuICBkYXNoYm9hcmREYXRhOiBhbnlcbiAgZ2FwQW5hbHlzaXNEYXRhOiBhbnlcbiAgZGFzaGJvYXJkUmVzcG9uc2VPYmogPSB7fVxuICBjYnBGaW5hbE9iajogYW55ID0ge31cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsIHByaXZhdGUgc2hhcmVkU2VydmljZTogU2hhcmVkU2VydmljZSwgcHJpdmF0ZSBzbmFja0JhcjogTWF0U25hY2tCYXIsIHB1YmxpYyByb3V0ZXI6IFJvdXRlcikgeyB9XG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMudXNlclByb2ZpbGUgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VyUHJvZmlsZScpIHx8ICd7fScpO1xuICAgIHRoaXMuaXNTdXBlckFkbWluID0gdGhpcy51c2VyUHJvZmlsZT8ucm9sZV9pbmZvPy5yb2xlX25hbWUgPT09ICdTdXBlciBBZG1pbidcbiAgICAgICYmIHRoaXMudXNlclByb2ZpbGU/LnJvbGVfaW5mbz8uaXNfYWN0aXZlO1xuICAgIHRoaXMubG9naW5Vc2VyT3JnSWRzID0gdGhpcy51c2VyUHJvZmlsZT8ub3JnYW5pemF0aW9uX2lkc1xuXG4gICAgdGhpcy5jYnBGaW5hbE9iaiA9IHRoaXMuc2hhcmVkU2VydmljZS5nZXRDQlBQbGFuTG9jYWxTdG9yYWdlKClcbiAgICBjb25zb2xlLmxvZygndGhpcy5jYnBGaW5hbE9iai0tJywgdGhpcy5jYnBGaW5hbE9iailcblxuXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgZm9ybSB3aXRob3V0IGRpc2FibGluZyBhbnl0aGluZ1xuICAgIHRoaXMuZmlsdGVyc0Zvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGNlbnRyZVN0YXRlOiBbJyddLFxuICAgICAgbWluaXN0cmllczogW1tdXSxcbiAgICAgIGRlcGFydG1lbnRzOiBbW11dLFxuICAgICAgZGF0ZVJhbmdlOiBbeyBzdGFydERhdGU6IG1vbWVudCgpLnN1YnRyYWN0KDMsICdtb250aCcpLCBlbmREYXRlOiBtb21lbnQoKSB9XVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuY2JwRmluYWxPYmopIHtcbiAgICAgIGxldCBldmVudCA9IHt2YWx1ZTp0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeT8uc2JPcmdUeXBlfVxuICAgICAgbGV0IG1pbmlzdHJ5RXZlbnQgPSB7dmFsdWU6IHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5Py5pZGVudGlmaWVyfVxuXG4gICAgICB0aGlzLm9uTWluaXN0cnlUeXBlQ2hhbmdlKGV2ZW50KVxuICAgICAgdGhpcy5vbk1pbmlzdHJ5Q2hhbmdlKG1pbmlzdHJ5RXZlbnQpXG4gICAgICBzZXRUaW1lb3V0KCgpPT57XG4gICAgICAgIHRoaXMuZmlsdGVyc0Zvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgIGNlbnRyZVN0YXRlOiB0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlLFxuICAgICAgICBtaW5pc3RyaWVzOiBbdGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnk/LmlkZW50aWZpZXJdLFxuICAgICAgICBkZXBhcnRtZW50czogW3RoaXMuY2JwRmluYWxPYmo/LmRlcGFydG1lbnRzXVxuICAgICAgfSk7XG4gICAgICB9LDEwMDApXG4gICAgICBcbiAgICAgIFxuICAgIH1cblxuICAgIC8vIER5bmFtaWNhbGx5IGVuYWJsZSBjb250cm9scyBpZiBzdXBlciBhZG1pblxuICAgIGlmICh0aGlzLmlzU3VwZXJBZG1pbikge1xuICAgICAgdGhpcy5maWx0ZXJzRm9ybS5nZXQoJ2NlbnRyZVN0YXRlJyk/LmVuYWJsZSgpO1xuICAgICAgdGhpcy5maWx0ZXJzRm9ybS5nZXQoJ21pbmlzdHJpZXMnKT8uZW5hYmxlKCk7XG4gICAgICB0aGlzLmZpbHRlcnNGb3JtLmdldCgnZGVwYXJ0bWVudHMnKT8uZW5hYmxlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG9wdGlvbmFsbHkgZGlzYWJsZSBmb3Igbm9uLXN1cGVyLWFkbWluXG4gICAgICB0aGlzLmZpbHRlcnNGb3JtLmdldCgnY2VudHJlU3RhdGUnKT8uZGlzYWJsZSgpO1xuICAgICAgdGhpcy5maWx0ZXJzRm9ybS5nZXQoJ21pbmlzdHJpZXMnKT8uZGlzYWJsZSgpO1xuICAgICAgdGhpcy5maWx0ZXJzRm9ybS5nZXQoJ2RlcGFydG1lbnRzJyk/LmRpc2FibGUoKTtcbiAgICB9XG5cbiAgICAvLyBUcmlnZ2VyIEFQSSBjYWxsIG9uIGZpbHRlciBjaGFuZ2VcbiAgICB0aGlzLmZpbHRlcnNGb3JtLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodmFsID0+IHtcbiAgICAgIHRoaXMuZ2V0RGFzaGJvYXJkRGF0YSh2YWwpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0RGFzaGJvYXJkRGF0YSh2YWwpIHtcblxuICAgIGNvbnNvbGUubG9nKCd2YWwnLCB2YWwpXG4gICAgbGV0IGRhdGVSYW5nZVBheWxvYWQgPSBudWxsO1xuICAgIGlmICh2YWwuZGF0ZVJhbmdlICYmIHZhbC5kYXRlUmFuZ2Uuc3RhcnREYXRlICYmIHZhbC5kYXRlUmFuZ2UuZW5kRGF0ZSkge1xuICAgICAgZGF0ZVJhbmdlUGF5bG9hZCA9IHtcbiAgICAgICAgZnJvbTogbW9tZW50KHZhbC5kYXRlUmFuZ2Uuc3RhcnREYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQnKSxcbiAgICAgICAgdG86IG1vbWVudCh2YWwuZGF0ZVJhbmdlLmVuZERhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpXG4gICAgICB9O1xuICAgIH1cbiAgICBsZXQgcGF5bG9hZCA9IHtcbiAgICAgIG1pbmlzdHJpZXM6IHZhbD8ubWluaXN0cmllcyxcbiAgICAgIGRhdGVfcmFuZ2U6IGRhdGVSYW5nZVBheWxvYWRcblxuICAgIH1cbiAgICBpZiAodmFsPy5kZXBhcnRtZW50cz8ubGVuZ3RoKSB7XG4gICAgICBwYXlsb2FkWydkZXBhcnRtZW50cyddID0gdmFsPy5kZXBhcnRtZW50c1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1N1cGVyQWRtaW4pIHtcbiAgICAgIHRoaXMuZGFzaGJvYXJkRGF0YSA9IHt9O1xuXG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0RGFzaGJvYXJkQWRtaW4ocGF5bG9hZCkuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ3JlcyBmcm9tIGFkbWluJywgcmVzKTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLmRhc2hib2FyZERhdGEsIHJlcyk7IC8vIG1lcmdlIGRhdGFcbiAgICAgICAgY29uc29sZS5sb2coJ3RoaXMuZGFzaGJvYXJkRGF0YSBhZnRlciBhZG1pbicsIHRoaXMuZGFzaGJvYXJkRGF0YSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldERhc2hib2FyZEdhcEFuYWx5c2lzQWRtaW4ocGF5bG9hZCkuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ3JlcyBmcm9tIGdhcCBhbmFseXNpcycsIHJlcyk7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5kYXNoYm9hcmREYXRhLCByZXMpOyAvLyBtZXJnZSBkYXRhXG4gICAgICAgIGNvbnNvbGUubG9nKCd0aGlzLmRhc2hib2FyZERhdGEgYWZ0ZXIgZ2FwIGFuYWx5c2lzJywgdGhpcy5kYXNoYm9hcmREYXRhKTtcbiAgICAgIH0pO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGFzaGJvYXJkRGF0YSA9IHt9O1xuXG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0RGFzaGJvYXJkUHVibGljKHBheWxvYWQpLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5kYXNoYm9hcmREYXRhLCByZXMpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXREYXNoYm9hcmRHYXBBbmFseXNpc1B1YmxpYyhwYXlsb2FkKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuZGFzaGJvYXJkRGF0YSwgcmVzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZygndGhpcy5kYXNoYm9hcmREYXRhJywgdGhpcy5kYXNoYm9hcmREYXRhKVxuICB9XG4gIG9uT3BlbmVkKG9wZW5lZDogYm9vbGVhbikge1xuICAgIHRoaXMucGFuZWxPcGVuID0gb3BlbmVkO1xuICB9XG5cbiAgb25PcGVuZWREZXBhcnRtZW50KG9wZW5lZDogYm9vbGVhbikge1xuICAgIHRoaXMuZGVwYXJ0bWVudFBhbmVsT3BlbiA9IG9wZW5lZFxuICB9XG5cbiAgZmlsdGVyRGF0YShldmVudCkge1xuICAgIGlmIChldmVudCAmJiBldmVudC50YXJnZXQgJiYgZXZlbnQudGFyZ2V0LnZhbHVlKSB7XG4gICAgICBjb25zdCBzID0gZXZlbnQudGFyZ2V0LnZhbHVlLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gdGhpcy5taW5pc3RyeURhdGEuZmlsdGVyKHggPT5cbiAgICAgICAgeC5vcmdOYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocylcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gdGhpcy5taW5pc3RyeURhdGFcbiAgICB9XG5cbiAgfVxuXG4gIGZpbHRlckRlcGFydG1lbnREYXRhKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50LnRhcmdldCAmJiBldmVudC50YXJnZXQudmFsdWUpIHtcbiAgICAgIGNvbnN0IHMgPSBldmVudC50YXJnZXQudmFsdWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgdGhpcy5maWx0ZXJlZERlcGFydG1lbnRMaXN0ID0gdGhpcy5kZXBhcnRtZW50RGF0YS5maWx0ZXIoeCA9PlxuICAgICAgICB4Lm9yZ05hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maWx0ZXJlZERlcGFydG1lbnRMaXN0ID0gdGhpcy5kZXBhcnRtZW50RGF0YVxuICAgIH1cblxuICB9XG5cbiAgb25NaW5pc3RyeUNoYW5nZShldmVudDogYW55KSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRNaW5pc3RyeUlkID0gZXZlbnQudmFsdWU7XG4gICAgY29uc29sZS5sb2coJ1NlbGVjdGVkIE1pbmlzdHJ5IElEOicsIHNlbGVjdGVkTWluaXN0cnlJZCk7XG4gICAgdGhpcy5kZXBhcnRtZW50RGF0YSA9IFtdXG4gICAgLy8gWW91IGNhbiBhY2Nlc3MgdGhlIHNlbGVjdGVkIG9iamVjdCBpZiBuZWVkZWRcbiAgICBjb25zdCBzZWxlY3RlZE1pbmlzdHJ5ID0gdGhpcy5taW5pc3RyeURhdGEuZmluZChpdGVtID0+IGl0ZW0uaWRlbnRpZmllciA9PT0gc2VsZWN0ZWRNaW5pc3RyeUlkKTtcbiAgICB0aGlzLnNlbGVjdGVkTWluaXN0cnlPYmogPSBzZWxlY3RlZE1pbmlzdHJ5XG4gICAgaWYgKHNlbGVjdGVkTWluaXN0cnlJZCAmJiB0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlID09PSAnc3RhdGUnKSB7XG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0RGVwYXJ0bWVudExpc3Qoc2VsZWN0ZWRNaW5pc3RyeUlkKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgICB0aGlzLmRlcGFydG1lbnREYXRhID0gcmVzXG4gICAgICAgIHRoaXMuZmlsdGVyZWREZXBhcnRtZW50TGlzdCA9IHJlc1xuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKHNlbGVjdGVkTWluaXN0cnlJZCAmJiB0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlID09PSAnbWluaXN0cnknKSB7XG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0Q2VudGVyQmFzZWREZXBhcnRtZW50KHNlbGVjdGVkTWluaXN0cnlJZCkuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgICAgaWYgKHJlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5kZXBhcnRtZW50RGF0YSA9IHJlc1xuICAgICAgICAgIHRoaXMuZmlsdGVyZWREZXBhcnRtZW50TGlzdCA9IHJlc1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbignTm8gRGVwYXJ0bWVudCBGb3VuZCBmb3IgU2VsZWN0ZWQgTWluaXN0cnknLCAnWCcsIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBvbkRlcGFydG1lbnRDaGFuZ2UoKSB7XG4gICAgY29uc3QgZm9ybURhdGEgPSB0aGlzLmZpbHRlcnNGb3JtLnZhbHVlO1xuICAgIGNvbnN0IHNlbGVjdGVkTWluaXN0cnkgPSB0aGlzLm1pbmlzdHJ5RGF0YS5maW5kKGl0ZW0gPT4gaXRlbS5pZGVudGlmaWVyID09PSBmb3JtRGF0YS5taW5pc3RyeSk7XG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsnbWluaXN0cnknXSA9IHNlbGVjdGVkTWluaXN0cnlcbiAgICBjb25zdCBkZXBhcnRtZW50TmFtZSA9IHRoaXMuZGVwYXJ0bWVudERhdGEuZmluZCh1ID0+IHUuaWRlbnRpZmllciA9PT0gZm9ybURhdGEuZGVwYXJ0bWVudHMpO1xuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ2RlcGFydG1lbnRfbmFtZSddID0gZGVwYXJ0bWVudE5hbWU/Lm9yZ05hbWVcbiAgfVxuXG4gIGFzeW5jIG9uTWluaXN0cnlUeXBlQ2hhbmdlKGV2ZW50KSB7XG4gICAgY29uc29sZS5sb2coJ2V2ZW50JywgZXZlbnQpXG4gICAgdGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSA9IGV2ZW50LnZhbHVlXG4gICAgYXdhaXQgdGhpcy5nZXRNaW5pc3RyeURhdGEoKVxuICAgIHRoaXMubWluaXN0cnlEYXRhID0gW11cbiAgICBpZiAoZXZlbnQ/LnZhbHVlID09PSAnc3RhdGUnKSB7XG4gICAgICB0aGlzLmZpbHRlcnNGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICBjZW50cmVTdGF0ZTogdGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSxcbiAgICAgICAgbWluaXN0cmllczogW10sXG4gICAgICAgIGRlcGFydG1lbnRzOiBbXVxuICAgICAgfSk7XG4gICAgICB0aGlzLm1pbmlzdHJ5RnVsbERhdGEuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoaXRlbT8udHlwZSA9PT0gJ3N0YXRlJykge1xuICAgICAgICAgIHRoaXMubWluaXN0cnlEYXRhLnB1c2goaXRlbSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9IGVsc2UgaWYgKGV2ZW50Py52YWx1ZSA9PT0gJ21pbmlzdHJ5Jykge1xuICAgICAgdGhpcy5taW5pc3RyeUZ1bGxEYXRhLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKGl0ZW0/LnR5cGUgPT09ICdjZW50cmFsJykge1xuICAgICAgICAgIHRoaXMubWluaXN0cnlEYXRhLnB1c2goaXRlbSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIFxuICAgIH1cbiAgICB0aGlzLmZpbHRlcnNGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICBjZW50cmVTdGF0ZTogdGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSxcbiAgICAgICAgbWluaXN0cmllczogW10sXG4gICAgICAgIGRlcGFydG1lbnRzOiBbXVxuICAgICAgfSk7XG4gIH1cblxuICBnZXRNaW5pc3RyeURhdGEoKSB7XG4gICAgdGhpcy5hcGlMb2FkaW5nID0gdHJ1ZVxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRNaW5pc3RyeURhdGEodGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSkuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCdkYXRhLS0nLCBkYXRhKVxuICAgICAgdGhpcy5taW5pc3RyeUZ1bGxEYXRhID0gZGF0YVxuICAgICAgdGhpcy5hcGlMb2FkaW5nID0gZmFsc2VcbiAgICAgIHRoaXMubWluaXN0cnlEYXRhID0gW11cbiAgICAgIGxldCBmaWx0ZXJlZE1pbmlzdHJ5RGF0YSA9IFtdXG4gICAgICB0aGlzLm1pbmlzdHJ5RnVsbERhdGEubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmxvZ2luVXNlck9yZ0lkcy5pbmRleE9mKGl0ZW0/LmlkZW50aWZpZXIpID4gLTEpIHtcbiAgICAgICAgICBmaWx0ZXJlZE1pbmlzdHJ5RGF0YS5wdXNoKGl0ZW0pXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maWx0ZXJlZExpc3QgPSBmaWx0ZXJlZE1pbmlzdHJ5RGF0YTtcbiAgICAgIH0pXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSA9PT0gJ21pbmlzdHJ5Jykge1xuICAgICAgICBkYXRhLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoaXRlbT8uc2JPcmdUeXBlID09PSAnbWluaXN0cnknKSB7XG4gICAgICAgICAgICB0aGlzLm1pbmlzdHJ5RGF0YS5wdXNoKGl0ZW0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlID09PSAnc3RhdGUnKSB7XG4gICAgICAgIGRhdGEuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChpdGVtPy5zYk9yZ1R5cGUgPT09ICdzdGF0ZScpIHtcbiAgICAgICAgICAgIHRoaXMubWluaXN0cnlEYXRhLnB1c2goaXRlbSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcblxuXG4gIH1cblxuICByb3V0ZVRvSW5pdGlhbCgpIHtcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9haS9pbml0aWFsJ10pO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZGFzaGJvYXJkLXdyYXBwZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdWItaGVhZGluZyBtdC0xMCBtYi0xMCBjdXJzb3ItcG9pbnRlclwiPlxuICAgICAgICAgICAgPHAgKGNsaWNrKT1cInJvdXRlVG9Jbml0aWFsKClcIj48bWF0LWljb24gc3R5bGU9XCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1wiPmFycm93X2JhY2s8L21hdC1pY29uPjxzcGFuXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicGwtMTBcIj5CYWNrIHRvIFJvbGUgTWFwcGluZyBHZW5lcmF0aW9uPC9zcGFuPjwvcD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZGFzaGJvYXJkLWNvbnRhaW5lclwiPlxuXG4gICAgICAgIDwhLS0gRklMVEVSUyBTRUNUSU9OIC0tPlxuICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZpbHRlcnNGb3JtXCIgY2xhc3M9XCJmaWx0ZXJzLWZvcm1cIj5cblxuICAgICAgICAgICAgPG1hdC1jYXJkIGNsYXNzPVwiZmlsdGVycy1jYXJkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbHRlcnMtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5maWx0ZXJfbGlzdDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPkZpbHRlcnM8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVycy1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5DZW50cmUgLyBTdGF0ZSA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDZW50cmUgLyBTdGF0ZSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwiZmlsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiB3aGl0ZTsgYm9yZGVyLXJhZGl1czogMjVweDsgcGFkZGluZzogMCAxMnB4OyBib3JkZXI6IDFweCBzb2xpZCAjY2NjO3dpZHRoOiAxMDAlO1wiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiY2VudHJlU3RhdGVcIiBbZGlzYWJsZWRdPVwiIWlzU3VwZXJBZG1pblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25NaW5pc3RyeVR5cGVDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlwiPlNlbGVjdCBDZW50ZXIvU3RhdGU8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwibWluaXN0cnlcIj5DZW50ZXI8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwic3RhdGVcIj5TdGF0ZTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5NaW5pc3RyeSA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDZW50cmUgLyBTdGF0ZSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwiZmlsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiB3aGl0ZTsgYm9yZGVyLXJhZGl1czogMjVweDsgcGFkZGluZzogMCAxMnB4OyBib3JkZXI6IDFweCBzb2xpZCAjY2NjO3dpZHRoOiAxMDAlO1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IHBhbmVsQ2xhc3M9XCJzZWxlY3Qtd2l0aC1zZWFyY2hcIiBbZGlzYWJsZWRdPVwiIWlzU3VwZXJBZG1pblwiIG11bHRpcGxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJzZWxlY3RlZE1pbmlzdHJ5VHlwZSA9PT0gJ21pbmlzdHJ5JyA/ICdTZWxlY3QgTWluaXN0cnkvIERlcGFydG1lbnQnOidTZWxlY3QgU3RhdGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvbk1pbmlzdHJ5Q2hhbmdlKCRldmVudClcIiBmb3JtQ29udHJvbE5hbWU9XCJtaW5pc3RyaWVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJib3JkZXItcmFkaXVzOiAyNXB4OyBiYWNrZ3JvdW5kOiB3aGl0ZTsgd2lkdGg6MTAwJVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcGVuZWRDaGFuZ2UpPVwib25PcGVuZWQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLXdyYXBwZXJcIiAqbmdJZj1cInBhbmVsT3BlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJTZWFyY2guLi5cIiAoaW5wdXQpPVwiZmlsdGVyRGF0YSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlYXJjaC1pbnB1dFwiIChrZXlkb3duLnNwYWNlKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiaXRlbT8uaWRlbnRpZmllclwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpbHRlcmVkTGlzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwic2VsZWN0ZWRNaW5pc3RyeUlkID09PSBpdGVtPy5pZGVudGlmaWVyXCI+e3tpdGVtPy5vcmdOYW1lfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+RGVwYXJ0bWVudDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENlbnRyZSAvIFN0YXRlIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJmaWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6IHdoaXRlOyBib3JkZXItcmFkaXVzOiAyNXB4OyBwYWRkaW5nOiAwIDEycHg7Ym9yZGVyOiAxcHggc29saWQgI2NjYztcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBwYW5lbENsYXNzPVwic2VsZWN0LXdpdGgtc2VhcmNoXCIgcGxhY2Vob2xkZXI9XCJTZWxlY3QgRGVwYXJ0bWVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNTdXBlckFkbWluXCIgbXVsdGlwbGUgZm9ybUNvbnRyb2xOYW1lPVwiZGVwYXJ0bWVudHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImJvcmRlci1yYWRpdXM6IDI1cHg7IGJhY2tncm91bmQ6IHdoaXRlO1wiIChzZWxlY3Rpb25DaGFuZ2UpPVwib25EZXBhcnRtZW50Q2hhbmdlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3BlbmVkQ2hhbmdlKT1cIm9uT3BlbmVkRGVwYXJ0bWVudCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtd3JhcHBlclwiICpuZ0lmPVwiZGVwYXJ0bWVudFBhbmVsT3BlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJTZWFyY2guLi5cIiAoaW5wdXQpPVwiZmlsdGVyRGVwYXJ0bWVudERhdGEoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWFyY2gtaW5wdXRcIiAoa2V5ZG93bi5zcGFjZSk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIml0ZW0/LmlkZW50aWZpZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmlsdGVyZWREZXBhcnRtZW50TGlzdFwiPnt7aXRlbT8ub3JnTmFtZX19PC9tYXQtb3B0aW9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBEYXRlIFJhbmdlIC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPkRhdGUgUmFuZ2UgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IG5neERhdGVyYW5nZXBpY2tlck1kIGZvcm1Db250cm9sTmFtZT1cImRhdGVSYW5nZVwiIHN0eWxlPVwibWFyZ2luOjEwcHhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBkYXRlIHJhbmdlXCIgW2F1dG9BcHBseV09XCJ0cnVlXCIgW2xpbmtlZENhbGVuZGFyc109XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xvY2FsZV09XCJ7IGZvcm1hdDogJ0REIE1NTSBZWVlZJyB9XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbWF0LWNhcmQ+XG4gICAgICAgIDwvZm9ybT5cblxuICAgICAgICA8IS0tIE9WRVJWSUVXIE1FVFJJQ1MgLS0+XG4gICAgICAgIDxoMiBjbGFzcz1cInNlY3Rpb24tdGl0bGVcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbj5kYXNoYm9hcmQ8L21hdC1pY29uPlxuICAgICAgICAgICAgT3ZlcnZpZXcgTWV0cmljc1xuICAgICAgICA8L2gyPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWdyaWRcIj5cblxuICAgICAgICAgICAgPG1hdC1jYXJkIGNsYXNzPVwibWV0cmljLWNhcmRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNhcmQtdGl0bGVcIj5TdGF0ZXMvTWluaXN0cmllcyB3aGljaCBnZW5lcmF0ZWQgUm9sZSBNYXBwaW5nPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGgyPnt7dGhpcy5kYXNoYm9hcmREYXRhPy5taW5pc3RyeV9jb3VudH19PC9oMj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FyZC1zdWJ0aXRsZVwiPkF0IGxlYXN0IDEgZGVzaWduYXRpb24vcm9sZSBtYXBwaW5nPC9wPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaWNvbiBwcmltYXJ5XCI+cHVibGljPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbWF0LWNhcmQ+XG5cbiAgICAgICAgICAgIDxtYXQtY2FyZCBjbGFzcz1cIm1ldHJpYy1jYXJkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjYXJkLXRpdGxlXCI+RGVwYXJ0bWVudHMgd2hpY2ggZ2VuZXJhdGVkIFJvbGUgTWFwcGluZzwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMj57e3RoaXMuZGFzaGJvYXJkRGF0YT8uZGVwYXJ0bWVudF9jb3VudH19PC9oMj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FyZC1zdWJ0aXRsZVwiPkF0IGxlYXN0IDEgZGVzaWduYXRpb24vcm9sZSBtYXBwaW5nPC9wPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaWNvbiB0ZWFsXCI+YXBhcnRtZW50PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbWF0LWNhcmQ+XG5cbiAgICAgICAgICAgIDxtYXQtY2FyZCBjbGFzcz1cIm1ldHJpYy1jYXJkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjYXJkLXRpdGxlXCI+VG90YWwgQ2FwYWNpdHkgQnVpbGRpbmcgUGxhbnMgQ3JlYXRlZDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMj57e3RoaXMuZGFzaGJvYXJkRGF0YT8udG90YWxfY2JwX3BsYW5fY291bnR9fTwvaDI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uIGdyZWVuXCI+ZGVzY3JpcHRpb248L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9tYXQtY2FyZD5cblxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIENPTVBFVEVOQ0lFUyAtLT5cbiAgICAgICAgPGgyIGNsYXNzPVwic2VjdGlvbi10aXRsZVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPnBzeWNob2xvZ3k8L21hdC1pY29uPlxuICAgICAgICAgICAgQ29tcGV0ZW5jaWVzIFJlY29tbWVuZGVkXG4gICAgICAgIDwvaDI+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtZ3JpZFwiPlxuXG4gICAgICAgICAgICA8bWF0LWNhcmQgY2xhc3M9XCJtZXRyaWMtY2FyZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FyZC10aXRsZVwiPkJlaGF2aW9yYWwgQ29tcGV0ZW5jaWVzPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGgyPnt7dGhpcy5kYXNoYm9hcmREYXRhPy5iZWhhdmlvcmFsX2NvbXBldGVuY2llc19jb3VudH19PC9oMj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImljb24gcHVycGxlXCI+cHN5Y2hvbG9neTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L21hdC1jYXJkPlxuXG4gICAgICAgICAgICA8bWF0LWNhcmQgY2xhc3M9XCJtZXRyaWMtY2FyZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FyZC10aXRsZVwiPkZ1bmN0aW9uYWwgQ29tcGV0ZW5jaWVzPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGgyPnt7dGhpcy5kYXNoYm9hcmREYXRhPy5mdW5jdGlvbmFsX2NvbXBldGVuY2llc19jb3VudH19PC9oMj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImljb24gdGVhbFwiPnNldHRpbmdzPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbWF0LWNhcmQ+XG5cbiAgICAgICAgICAgIDxtYXQtY2FyZCBjbGFzcz1cIm1ldHJpYy1jYXJkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjYXJkLXRpdGxlXCI+RG9tYWluIENvbXBldGVuY2llczwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMj57e3RoaXMuZGFzaGJvYXJkRGF0YT8uZG9tYWluX2NvbXBldGVuY2llc19jb3VudH19PC9oMj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImljb24gb3JhbmdlXCI+dHVuZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L21hdC1jYXJkPlxuXG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gRE9DVU1FTlRTIC0tPlxuICAgICAgICA8aDIgY2xhc3M9XCJzZWN0aW9uLXRpdGxlXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+bWVudV9ib29rPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIERvY3VtZW50cyAmIENvdXJzZSBSZWNvbW1lbmRhdGlvbnNcbiAgICAgICAgPC9oMj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ncmlkXCI+XG5cbiAgICAgICAgICAgIDxtYXQtY2FyZCBjbGFzcz1cIm1ldHJpYy1jYXJkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjYXJkLXRpdGxlXCI+VG90YWwgRG9jdW1lbnRzIFVwbG9hZGVkPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGgyPnt7dGhpcy5kYXNoYm9hcmREYXRhPy50b3RhbF9kb2N1bWVudHN9fTwvaDI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNhcmQtc3VidGl0bGVcIj5NaW4gMSwgTWF4IDEwIHBlciByb2xlIG1hcHBpbmc8L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uIGFtYmVyXCI+dXBsb2FkX2ZpbGU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9tYXQtY2FyZD5cblxuICAgICAgICAgICAgPG1hdC1jYXJkIGNsYXNzPVwibWV0cmljLWNhcmRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNhcmQtdGl0bGVcIj5Sb2xlIE1hcHBpbmdzIHdpdGggQ291cnNlIFJlY29tbWVuZGF0aW9uczwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMj57e3RoaXMuZGFzaGJvYXJkRGF0YT8ucm9sZV9tYXBwaW5nc193aXRoX3JlY29tbWVuZGF0aW9uc319PC9oMj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FyZC1zdWJ0aXRsZVwiPjg1MDAgb2YgNTAsMDAwIHJvbGUgbWFwcGluZ3M8L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uIGdyZWVuXCI+bWVudV9ib29rPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbWF0LWNhcmQ+XG5cbiAgICAgICAgICAgIDxtYXQtY2FyZCBjbGFzcz1cIm1ldHJpYy1jYXJkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjYXJkLXRpdGxlXCI+Q291cnNlIFJlY29tbWVuZGF0aW9ucyBTYXZlZDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMj57e3RoaXMuZGFzaGJvYXJkRGF0YT8uc2F2ZWRfcmVjb21tZW5kZWRfY291cnNlc19jb3VudH19PC9oMj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FyZC1zdWJ0aXRsZVwiPnt7dGhpcy5kYXNoYm9hcmREYXRhPy5zYXZlZF9yZWNvbW1lbmRlZF9jb3Vyc2VzX2NvdW50fX0gb2YgODUwMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29tbWVuZGF0aW9uczwvcD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImljb24gdGVhbFwiPnNhdmU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9tYXQtY2FyZD5cblxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIEdBUCBBTkFMWVNJUyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImdhcC1zZWN0aW9uXCI+XG4gICAgICAgICAgICA8aDIgY2xhc3M9XCJzZWN0aW9uLXRpdGxlIHdhcm5pbmdcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+d2FybmluZzwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgR2FwIEFuYWx5c2lzXG4gICAgICAgICAgICA8L2gyPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ncmlkXCI+XG5cbiAgICAgICAgICAgICAgICA8bWF0LWNhcmQgY2xhc3M9XCJtZXRyaWMtY2FyZCB3YXJuaW5nLWJnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjYXJkLXRpdGxlXCI+Q29tcGV0ZW5jaWVzIFdpdGhvdXQgQ291cnNlczwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDI+e3t0aGlzLmRhc2hib2FyZERhdGE/LmNvbXBldGVuY2llc193aXRob3V0X2NvdXJzZXN9fTwvaDI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjYXJkLXN1YnRpdGxlXCI+VW5pcXVlIGNvbXBldGVuY2llcyB3aXRoIG5vIGlkZW50aWZpZWQgY291cnNlczwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaWNvbiByZWRcIj5jYW5jZWw8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L21hdC1jYXJkPlxuXG4gICAgICAgICAgICAgICAgPCEtLSA8bWF0LWNhcmQgY2xhc3M9XCJtZXRyaWMtY2FyZFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FyZC10aXRsZVwiPk1hbnVhbGx5IEFkZGVkIENvdXJzZXM8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyPi08L2gyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FyZC1zdWJ0aXRsZVwiPkNvbXBldGVuY2llcyB3aXRoIHVzZXItYWRkZWQgY291cnNlczwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaWNvbiBncmVlblwiPmFkZF9jaXJjbGU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L21hdC1jYXJkPiAtLT5cblxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWdyaWQgbXQtMlwiPlxuXG4gICAgICAgICAgICAgICAgPG1hdC1jYXJkIGNsYXNzPVwibWV0cmljLWNhcmQgd2FybmluZy1iZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FyZC10aXRsZVwiPkJlaGF2aW9yYWwgQ29tcGV0ZW5jaWVzIFdpdGhvdXQgQ291cnNlczwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDI+e3t0aGlzLmRhc2hib2FyZERhdGE/LmJlaGF2aW9yYWxfd2l0aG91dF9jb3Vyc2VzfX08L2gyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uIHJlZFwiPmNhbmNlbDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQ+XG5cbiAgICAgICAgICAgICAgICA8bWF0LWNhcmQgY2xhc3M9XCJtZXRyaWMtY2FyZFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FyZC10aXRsZVwiPkZ1bmN0aW9uYWwgQ29tcGV0ZW5jaWVzIFdpdGhvdXQgQ291cnNlczwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDI+e3t0aGlzLmRhc2hib2FyZERhdGE/LmZ1bmN0aW9uYWxfd2l0aG91dF9jb3Vyc2VzfX08L2gyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uIHJlZFwiPmNhbmNlbDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQ+XG5cbiAgICAgICAgICAgICAgICA8bWF0LWNhcmQgY2xhc3M9XCJtZXRyaWMtY2FyZFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FyZC10aXRsZVwiPkRvbWFpbiBDb21wZXRlbmNpZXMgV2l0aG91dCBDb3Vyc2VzPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMj57e3RoaXMuZGFzaGJvYXJkRGF0YT8uZG9tYWluX3dpdGhvdXRfY291cnNlc319PC9oMj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaWNvbiByZWRcIj5jYW5jZWw8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L21hdC1jYXJkPlxuXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBPVkVSVklFVyBNRVRSSUNTIC0tPlxuICAgICAgICA8aDIgY2xhc3M9XCJzZWN0aW9uLXRpdGxlXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+ZGFzaGJvYXJkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIFVzZXJzIGFuZCBSb2xlIE1hcHBpbmcgTWV0cmljc1xuICAgICAgICA8L2gyPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWdyaWRcIj5cblxuICAgICAgICAgICAgPG1hdC1jYXJkIGNsYXNzPVwibWV0cmljLWNhcmRcIiAqbmdJZj1cIiFpc1N1cGVyQWRtaW5cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNhcmQtdGl0bGVcIj5VbmlxdWUgVXNlcnMgKENyZWRlbnRpYWxzKTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMj57e3RoaXMuZGFzaGJvYXJkRGF0YT8udG90YWxfdXNlcnN9fTwvaDI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uIHByaW1hcnlcIj5wdWJsaWM8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9tYXQtY2FyZD5cblxuICAgICAgICAgICAgPG1hdC1jYXJkIGNsYXNzPVwibWV0cmljLWNhcmRcIiAqbmdJZj1cIiFpc1N1cGVyQWRtaW5cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNhcmQtdGl0bGVcIj5VbmlxdWUgVXNlcnMgd2l0aCBSb2xlIE1hcHBpbmdzPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGgyPnt7dGhpcy5kYXNoYm9hcmREYXRhPy51c2Vyc193aXRoX3JvbGVfbWFwcGluZ3N9fTwvaDI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNhcmQtc3VidGl0bGVcIj5HZW5lcmF0ZWQgYXRsZWFzdCAxIHJvbGUgbWFwcGluZzwvcD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImljb24gdGVhbFwiPmFwYXJ0bWVudDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L21hdC1jYXJkPlxuXG4gICAgICAgICAgICA8bWF0LWNhcmQgY2xhc3M9XCJtZXRyaWMtY2FyZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FyZC10aXRsZVwiPlRvdGFsIERlc2lnbmF0aW9uL1JvbGUgTWFwcGluZ3MgR2VuZXJhdGVkPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGgyPnt7dGhpcy5kYXNoYm9hcmREYXRhPy50b3RhbF9yb2xlX21hcHBpbmdzfX08L2gyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaWNvbiBncmVlblwiPmRlc2NyaXB0aW9uPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbWF0LWNhcmQ+XG5cbiAgICAgICAgICAgIDxtYXQtY2FyZCBjbGFzcz1cIm1ldHJpYy1jYXJkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjYXJkLXRpdGxlXCI+VW5pcXVlIFJvbGUgTWFwcGluZ3M8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aDI+e3t0aGlzLmRhc2hib2FyZERhdGE/LnVuaXF1ZV9yb2xlX21hcHBpbmdzfX08L2gyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjYXJkLXN1YnRpdGxlXCI+MTAsMDAwIHVuaXF1ZSBvZiA1MCwwMDAgdG90YWw8L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uIHRlYWxcIj5hcGFydG1lbnQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9tYXQtY2FyZD5cblxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PiJdfQ==
@@ -0,0 +1,53 @@
1
+ import { MAT_DIALOG_DATA } from '@angular/material/dialog';
2
+ import { Component, Inject } from '@angular/core';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/material/dialog";
5
+ import * as i2 from "../../modules/shared/services/shared.service";
6
+ import * as i3 from "@angular/material/snack-bar";
7
+ import * as i4 from "@angular/common";
8
+ import * as i5 from "@angular/material/icon";
9
+ import * as i6 from "@angular/material/progress-spinner";
10
+ export class DeleteRoleMappingComponent {
11
+ constructor(dialogRef, data, sharedService, snackBar) {
12
+ this.dialogRef = dialogRef;
13
+ this.data = data;
14
+ this.sharedService = sharedService;
15
+ this.snackBar = snackBar;
16
+ this.loading = false;
17
+ this.planData = data;
18
+ }
19
+ deleteRoleMapping() {
20
+ // this.sharedService.deleteRoleMapping(this.planData.id).subscribe(()=>{
21
+ // this.dialogRef.close('saved')
22
+ // })
23
+ this.sharedService.deleteRoleMapping(this.planData.id).subscribe({
24
+ next: () => {
25
+ this.dialogRef.close('saved');
26
+ this.snackBar.open('Role Mapping Deleted successfully', 'X', {
27
+ duration: 3000,
28
+ panelClass: ['snackbar-success']
29
+ });
30
+ },
31
+ error: (error) => {
32
+ this.dialogRef.close();
33
+ this.snackBar.open(error?.error?.detail, 'X', {
34
+ duration: 3000,
35
+ panelClass: ['snackbar-error']
36
+ });
37
+ }
38
+ });
39
+ }
40
+ cancel() {
41
+ this.dialogRef.close();
42
+ }
43
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DeleteRoleMappingComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }, { token: i2.SharedService }, { token: i3.MatSnackBar }], target: i0.ɵɵFactoryTarget.Component }); }
44
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DeleteRoleMappingComponent, selector: "app-delete-role-mapping", ngImport: i0, template: "<div class=\"view-cbp-plan\">\n <div class=\"popup-container\">\n <div class=\"popup-header\">\n <div>\n <div class=\"heading\">Delete Role Mapping</div>\n </div>\n <div class=\"cursor-pointer\" (click)=\"cancel()\">\n <mat-icon>close</mat-icon>\n </div>\n </div>\n <div class=\"section-container mt-4\">\n <div class=\"progress-icon\">\n <img src=\"assets/icons/info.svg\" style=\"scale: 2;margin: 10px;\">\n </div>\n <div class=\"heading\">\n <div>Delete Role Mapping</div>\n </div>\n <div class=\"\">\n <div>Are You Sure to Delete Selected Role Mapping</div>\n </div>\n\n </div>\n <div class=\"popup-footer mt-4\">\n <div>\n <input class=\"btn-active\" type=\"button\" value=\"No\" (click)=\"cancel()\" />\n </div>\n <div>\n <input class=\"btn-active\" type=\"button\" value=\"Yes\" (click)=\"deleteRoleMapping()\" />\n </div>\n </div>\n </div>\n</div>\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>", styles: [".container{margin:10px auto}.sub-heading p{color:#000;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.radio-label{color:#000;font-family:Lato;font-size:16px;font-style:normal;font-weight:400;line-height:normal}.radio-btn-group{display:flex;width:32px;height:32px;padding:2px;gap:10px}.label{color:var(--Body-Text-Body-Color, #212529);font-family:Lato;font-size:14px;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:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;resize:none}.section-header{display:flex;flex-direction:row;align-items:center;justify-content:space-between}.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:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100px}.btn-group{display:flex;flex-direction:row;justify-content:space-between}.pl-2{padding-left:5px}.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:32px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato;width:800px}.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;justify-content:space-between;flex-direction:row}.outside-layer-total{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #1B4CA1;background:#edf1f8;width:132px}.outside-layer-functional{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #E24577;background:#f8d2de;width:132px}.outside-layer-domain{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #7B47A4;background:#dfd3e9;width:132px}.outside-layer-behavioral{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}.inside-layer{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:400;line-height:normal}.count{color:#1b4ca1;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.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:24px;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:40px;height:40px;flex-shrink:0}.heading{color:#000;font-family:Montserrat;font-size:20px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0}.progress-popup{display:flex;flex-direction:column;justify-content:center;align-items:center}.progress-popup .desc{color:#000000de;text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.behavioural-pill{display:flex;padding:0 8px;justify-content:center;align-items:center;gap:10px;border-radius:99px;border:1px solid #F8B861;background:linear-gradient(0deg,#f8b86152 0% 100%),#fff;margin:5px 0}.functional-pill{display:flex;padding:0 8px;justify-content:center;align-items:center;gap:10px;border-radius:99px;border:1px solid #E24577;background:linear-gradient(0deg,#e245773d 0% 100%),#fff;margin:5px 0}.domain-pill{display:flex;padding:0 8px;justify-content:center;align-items:center;gap:10px;border-radius:99px;border:1px solid #7B47A4;background:linear-gradient(0deg,#7b47a43d 0% 100%),#fff;margin:5px 0}.popup-header{display:flex;flex-direction:row;justify-content:space-between}.popup-footer{display:flex;flex-direction:row;justify-content:center}.view-cbp-plan{margin:10px;padding:10px}.view-cbp-plan-popup{padding:24px;max-height:70vh;overflow-y:auto}.section{border-radius:8px;background:#1b4ca114;padding:16px}.popup-header{display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid #ddd;font-weight:700;flex-shrink:0}.popup-footer{display:flex;justify-content:center;gap:16px;padding:16px 24px;background-color:#fff;flex-shrink:0;position:sticky;bottom:0}.section-container{overflow-y:auto;flex:1 1 auto;display:flex;flex-direction:column;justify-content:center;align-items:center}.competency-list{display:flex;flex-direction:row;gap:16px}.competency-text{color:#000;font-family:Lato;font-size:10px;font-style:normal;font-weight:700;line-height:normal}.competency-sub-heading{color:#1b4ca1;font-family:Montserrat;font-size:12px;font-style:normal;font-weight:600;line-height:normal}.cursor-pointer{cursor:pointer}.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:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100px}.custom-textarea{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.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}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i6.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] }); }
45
+ }
46
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DeleteRoleMappingComponent, decorators: [{
47
+ type: Component,
48
+ args: [{ selector: 'app-delete-role-mapping', template: "<div class=\"view-cbp-plan\">\n <div class=\"popup-container\">\n <div class=\"popup-header\">\n <div>\n <div class=\"heading\">Delete Role Mapping</div>\n </div>\n <div class=\"cursor-pointer\" (click)=\"cancel()\">\n <mat-icon>close</mat-icon>\n </div>\n </div>\n <div class=\"section-container mt-4\">\n <div class=\"progress-icon\">\n <img src=\"assets/icons/info.svg\" style=\"scale: 2;margin: 10px;\">\n </div>\n <div class=\"heading\">\n <div>Delete Role Mapping</div>\n </div>\n <div class=\"\">\n <div>Are You Sure to Delete Selected Role Mapping</div>\n </div>\n\n </div>\n <div class=\"popup-footer mt-4\">\n <div>\n <input class=\"btn-active\" type=\"button\" value=\"No\" (click)=\"cancel()\" />\n </div>\n <div>\n <input class=\"btn-active\" type=\"button\" value=\"Yes\" (click)=\"deleteRoleMapping()\" />\n </div>\n </div>\n </div>\n</div>\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>", styles: [".container{margin:10px auto}.sub-heading p{color:#000;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.radio-label{color:#000;font-family:Lato;font-size:16px;font-style:normal;font-weight:400;line-height:normal}.radio-btn-group{display:flex;width:32px;height:32px;padding:2px;gap:10px}.label{color:var(--Body-Text-Body-Color, #212529);font-family:Lato;font-size:14px;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:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;resize:none}.section-header{display:flex;flex-direction:row;align-items:center;justify-content:space-between}.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:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100px}.btn-group{display:flex;flex-direction:row;justify-content:space-between}.pl-2{padding-left:5px}.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:32px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato;width:800px}.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;justify-content:space-between;flex-direction:row}.outside-layer-total{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #1B4CA1;background:#edf1f8;width:132px}.outside-layer-functional{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #E24577;background:#f8d2de;width:132px}.outside-layer-domain{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #7B47A4;background:#dfd3e9;width:132px}.outside-layer-behavioral{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}.inside-layer{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:400;line-height:normal}.count{color:#1b4ca1;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.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:24px;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:40px;height:40px;flex-shrink:0}.heading{color:#000;font-family:Montserrat;font-size:20px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0}.progress-popup{display:flex;flex-direction:column;justify-content:center;align-items:center}.progress-popup .desc{color:#000000de;text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.behavioural-pill{display:flex;padding:0 8px;justify-content:center;align-items:center;gap:10px;border-radius:99px;border:1px solid #F8B861;background:linear-gradient(0deg,#f8b86152 0% 100%),#fff;margin:5px 0}.functional-pill{display:flex;padding:0 8px;justify-content:center;align-items:center;gap:10px;border-radius:99px;border:1px solid #E24577;background:linear-gradient(0deg,#e245773d 0% 100%),#fff;margin:5px 0}.domain-pill{display:flex;padding:0 8px;justify-content:center;align-items:center;gap:10px;border-radius:99px;border:1px solid #7B47A4;background:linear-gradient(0deg,#7b47a43d 0% 100%),#fff;margin:5px 0}.popup-header{display:flex;flex-direction:row;justify-content:space-between}.popup-footer{display:flex;flex-direction:row;justify-content:center}.view-cbp-plan{margin:10px;padding:10px}.view-cbp-plan-popup{padding:24px;max-height:70vh;overflow-y:auto}.section{border-radius:8px;background:#1b4ca114;padding:16px}.popup-header{display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid #ddd;font-weight:700;flex-shrink:0}.popup-footer{display:flex;justify-content:center;gap:16px;padding:16px 24px;background-color:#fff;flex-shrink:0;position:sticky;bottom:0}.section-container{overflow-y:auto;flex:1 1 auto;display:flex;flex-direction:column;justify-content:center;align-items:center}.competency-list{display:flex;flex-direction:row;gap:16px}.competency-text{color:#000;font-family:Lato;font-size:10px;font-style:normal;font-weight:700;line-height:normal}.competency-sub-heading{color:#1b4ca1;font-family:Montserrat;font-size:12px;font-style:normal;font-weight:600;line-height:normal}.cursor-pointer{cursor:pointer}.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:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none;width:100px}.custom-textarea{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.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}\n"] }]
49
+ }], ctorParameters: function () { return [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
50
+ type: Inject,
51
+ args: [MAT_DIALOG_DATA]
52
+ }] }, { type: i2.SharedService }, { type: i3.MatSnackBar }]; } });
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZXRlLXJvbGUtbWFwcGluZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvY2JwLWFpL3NyYy9saWIvY29tcG9uZW50cy9kZWxldGUtcm9sZS1tYXBwaW5nL2RlbGV0ZS1yb2xlLW1hcHBpbmcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvZGVsZXRlLXJvbGUtbWFwcGluZy9kZWxldGUtcm9sZS1tYXBwaW5nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQWdCLE1BQU0sMEJBQTBCLENBQUM7QUFDekUsT0FBTyxFQUFxQixTQUFTLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDOzs7Ozs7OztBQVU3RSxNQUFNLE9BQU8sMEJBQTBCO0lBSXJDLFlBQW9CLFNBQW1ELEVBQ3JDLElBQVMsRUFBVSxhQUE0QixFQUN2RSxRQUFvQjtRQUZWLGNBQVMsR0FBVCxTQUFTLENBQTBDO1FBQ3JDLFNBQUksR0FBSixJQUFJLENBQUs7UUFBVSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUN2RSxhQUFRLEdBQVIsUUFBUSxDQUFZO1FBSjlCLFlBQU8sR0FBRyxLQUFLLENBQUE7UUFLWCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQTtJQUN0QixDQUFDO0lBRUgsaUJBQWlCO1FBQ2YseUVBQXlFO1FBQ3pFLGtDQUFrQztRQUNsQyxLQUFLO1FBQ0wsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUMvRCxJQUFJLEVBQUUsR0FBRyxFQUFFO2dCQUNULElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFBO2dCQUM3QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsRUFBRSxHQUFHLEVBQUU7b0JBQzNELFFBQVEsRUFBRSxJQUFJO29CQUNkLFVBQVUsRUFBRSxDQUFDLGtCQUFrQixDQUFDO2lCQUNqQyxDQUFDLENBQUM7WUFDTCxDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ2YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtnQkFDdEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFO29CQUM1QyxRQUFRLEVBQUUsSUFBSTtvQkFDZCxVQUFVLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDL0IsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUVMLENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUN4QixDQUFDOytHQW5DVSwwQkFBMEIsOENBSzNCLGVBQWU7bUdBTGQsMEJBQTBCLCtEQ1h2Qyx1dkNBa0NNOzs0RkR2Qk8sMEJBQTBCO2tCQUx0QyxTQUFTOytCQUNFLHlCQUF5Qjs7MEJBU2hDLE1BQU07MkJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEluamVjdCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBGb3JtQXJyYXksIFZhbGlkYXRvcnMsIEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInO1xuaW1wb3J0IHsgU2hhcmVkU2VydmljZSB9IGZyb20gJy4uLy4uL21vZHVsZXMvc2hhcmVkL3NlcnZpY2VzL3NoYXJlZC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWRlbGV0ZS1yb2xlLW1hcHBpbmcnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGVsZXRlLXJvbGUtbWFwcGluZy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RlbGV0ZS1yb2xlLW1hcHBpbmcuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBEZWxldGVSb2xlTWFwcGluZ0NvbXBvbmVudCB7XG5cbiAgbG9hZGluZyA9IGZhbHNlXG4gIHBsYW5EYXRhOmFueVxuICBjb25zdHJ1Y3RvciggcHVibGljIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPERlbGV0ZVJvbGVNYXBwaW5nQ29tcG9uZW50PixcbiAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHVibGljIGRhdGE6IGFueSwgcHJpdmF0ZSBzaGFyZWRTZXJ2aWNlOiBTaGFyZWRTZXJ2aWNlLFxuICAgIHByaXZhdGUgc25hY2tCYXI6TWF0U25hY2tCYXIpIHtcbiAgICAgIHRoaXMucGxhbkRhdGEgPSBkYXRhXG4gICAgfVxuXG4gIGRlbGV0ZVJvbGVNYXBwaW5nKCkge1xuICAgIC8vIHRoaXMuc2hhcmVkU2VydmljZS5kZWxldGVSb2xlTWFwcGluZyh0aGlzLnBsYW5EYXRhLmlkKS5zdWJzY3JpYmUoKCk9PntcbiAgICAvLyAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCdzYXZlZCcpXG4gICAgLy8gfSlcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZGVsZXRlUm9sZU1hcHBpbmcodGhpcy5wbGFuRGF0YS5pZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoJ3NhdmVkJylcbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdSb2xlIE1hcHBpbmcgRGVsZXRlZCBzdWNjZXNzZnVsbHknLCAnWCcsIHtcbiAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLXN1Y2Nlc3MnXVxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKClcbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKGVycm9yPy5lcnJvcj8uZGV0YWlsLCAnWCcsIHtcbiAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLWVycm9yJ11cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gIH1cblxuICBjYW5jZWwoKSB7XG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoKVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwidmlldy1jYnAtcGxhblwiPlxuICAgIDxkaXYgY2xhc3M9XCJwb3B1cC1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBvcHVwLWhlYWRlclwiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGluZ1wiPkRlbGV0ZSBSb2xlIE1hcHBpbmc8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImNhbmNlbCgpXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24tY29udGFpbmVyIG10LTRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1pY29uXCI+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCJhc3NldHMvaWNvbnMvaW5mby5zdmdcIiBzdHlsZT1cInNjYWxlOiAyO21hcmdpbjogMTBweDtcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRpbmdcIj5cbiAgICAgICAgICAgICAgICA8ZGl2PkRlbGV0ZSBSb2xlIE1hcHBpbmc8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPlxuICAgICAgICAgICAgICAgIDxkaXY+QXJlIFlvdSBTdXJlIHRvIERlbGV0ZSBTZWxlY3RlZCBSb2xlIE1hcHBpbmc8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicG9wdXAtZm9vdGVyIG10LTRcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiYnRuLWFjdGl2ZVwiIHR5cGU9XCJidXR0b25cIiB2YWx1ZT1cIk5vXCIgKGNsaWNrKT1cImNhbmNlbCgpXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJidG4tYWN0aXZlXCIgdHlwZT1cImJ1dHRvblwiIHZhbHVlPVwiWWVzXCIgKGNsaWNrKT1cImRlbGV0ZVJvbGVNYXBwaW5nKClcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwib3ZlcmxheS1sb2FkZXJcIiAqbmdJZj1cImxvYWRpbmdcIj5cbiAgICA8bWF0LXNwaW5uZXIgZGlhbWV0ZXI9XCI1MFwiPjwvbWF0LXNwaW5uZXI+XG48L2Rpdj4iXX0=