@ieeesa-npm/tenants 0.4.4 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/esm2022/ieeesa-npm-tenants.mjs +5 -0
  2. package/esm2022/lib/assets/constants.json +454 -0
  3. package/esm2022/lib/assets/tenant-validations.mjs +17 -0
  4. package/esm2022/lib/components/create-modify-group-type/create-modify-group-type.component.mjs +476 -0
  5. package/esm2022/lib/components/create-modify-role/create-modify-role.component.mjs +279 -0
  6. package/esm2022/lib/components/create-tenant-application/create-tenant-application.component.mjs +512 -0
  7. package/esm2022/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.mjs +391 -0
  8. package/esm2022/lib/components/tenant-basic-details/tenant-basic-details.component.mjs +94 -0
  9. package/esm2022/lib/components/view-tenant-details/view-tenant-details.component.mjs +733 -0
  10. package/esm2022/lib/components/view-tenant-group-types/view-tenant-group-types.component.mjs +194 -0
  11. package/esm2022/lib/components/view-tenants-list/view-tenants-list.component.mjs +335 -0
  12. package/esm2022/lib/models/app-type-config.model.mjs +2 -0
  13. package/esm2022/lib/models/app-type.model.mjs +7 -0
  14. package/esm2022/lib/models/create-group-type-config.model.mjs +22 -0
  15. package/esm2022/lib/models/create-group-type.model.mjs +2 -0
  16. package/esm2022/lib/models/feature-permission-id.model.mjs +8 -0
  17. package/esm2022/lib/models/features.model.mjs +2 -0
  18. package/esm2022/lib/models/permission-type.model.mjs +12 -0
  19. package/esm2022/lib/models/role-menu-action.model.mjs +7 -0
  20. package/esm2022/lib/models/role-type.model.mjs +2 -0
  21. package/esm2022/lib/models/roles-and-permissions-table-type.model.mjs +7 -0
  22. package/esm2022/lib/models/roles-and-permissions.model.mjs +2 -0
  23. package/esm2022/lib/models/route-config.model.mjs +2 -0
  24. package/esm2022/lib/models/table-column-schema-view-tenant-list.model.mjs +16 -0
  25. package/esm2022/lib/models/tenant-function-type.model.mjs +12 -0
  26. package/esm2022/lib/models/tenant.model.mjs +2 -0
  27. package/esm2022/lib/models/tenants-permission.model.mjs +2 -0
  28. package/esm2022/lib/models/update-tenant-status.model.mjs +2 -0
  29. package/esm2022/lib/models/view-tenant-group-types.model.mjs +11 -0
  30. package/esm2022/lib/services/tenant-applications.service.mjs +618 -0
  31. package/esm2022/lib/services/tenant-permissions-map.service.mjs +36 -0
  32. package/esm2022/lib/services/tenant-permissions.service.mjs +38 -0
  33. package/esm2022/lib/tenant-applications.component.mjs +14 -0
  34. package/esm2022/lib/tenant-applications.module.mjs +16 -0
  35. package/esm2022/public-api.mjs +36 -0
  36. package/fesm2022/ieeesa-npm-tenants.mjs +4233 -0
  37. package/fesm2022/ieeesa-npm-tenants.mjs.map +1 -0
  38. package/index.d.ts +5 -0
  39. package/lib/assets/tenant-validations.d.ts +15 -0
  40. package/lib/components/create-modify-group-type/create-modify-group-type.component.d.ts +129 -0
  41. package/lib/components/create-modify-role/create-modify-role.component.d.ts +103 -0
  42. package/lib/components/create-tenant-application/create-tenant-application.component.d.ts +128 -0
  43. package/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.d.ts +106 -0
  44. package/lib/components/tenant-basic-details/tenant-basic-details.component.d.ts +471 -0
  45. package/lib/components/view-tenant-details/view-tenant-details.component.d.ts +223 -0
  46. package/lib/components/view-tenant-group-types/view-tenant-group-types.component.d.ts +63 -0
  47. package/lib/components/view-tenants-list/view-tenants-list.component.d.ts +134 -0
  48. package/lib/models/app-type-config.model.d.ts +14 -0
  49. package/lib/models/app-type.model.d.ts +4 -0
  50. package/lib/models/create-group-type-config.model.d.ts +16 -0
  51. package/lib/models/create-group-type.model.d.ts +49 -0
  52. package/lib/models/feature-permission-id.model.d.ts +4 -0
  53. package/lib/models/features.model.d.ts +15 -0
  54. package/lib/models/permission-type.model.d.ts +8 -0
  55. package/lib/models/role-menu-action.model.d.ts +4 -0
  56. package/lib/models/role-type.model.d.ts +27 -0
  57. package/lib/models/roles-and-permissions-table-type.model.d.ts +4 -0
  58. package/lib/models/roles-and-permissions.model.d.ts +119 -0
  59. package/lib/models/route-config.model.d.ts +4 -0
  60. package/lib/models/table-column-schema-view-tenant-list.model.d.ts +20 -0
  61. package/lib/models/tenant-function-type.model.d.ts +9 -0
  62. package/lib/models/tenant.model.d.ts +51 -0
  63. package/lib/models/tenants-permission.model.d.ts +9 -0
  64. package/lib/models/update-tenant-status.model.d.ts +14 -0
  65. package/lib/models/view-tenant-group-types.model.d.ts +29 -0
  66. package/lib/services/tenant-applications.service.d.ts +399 -0
  67. package/lib/services/tenant-permissions-map.service.d.ts +13 -0
  68. package/lib/services/tenant-permissions.service.d.ts +22 -0
  69. package/lib/tenant-applications.component.d.ts +5 -0
  70. package/lib/tenant-applications.module.d.ts +6 -0
  71. package/package.json +25 -12
  72. package/{src/public-api.ts → public-api.d.ts} +32 -40
  73. package/.eslintrc.json +0 -31
  74. package/ng-package.json +0 -8
  75. package/src/lib/assets/constants.json +0 -454
  76. package/src/lib/assets/tenant-validations.ts +0 -18
  77. package/src/lib/assets/tenants-mock.ts +0 -1240
  78. package/src/lib/components/create-modify-group-type/create-modify-group-type.component.html +0 -15
  79. package/src/lib/components/create-modify-group-type/create-modify-group-type.component.scss +0 -44
  80. package/src/lib/components/create-modify-group-type/create-modify-group-type.component.spec.ts +0 -574
  81. package/src/lib/components/create-modify-group-type/create-modify-group-type.component.ts +0 -602
  82. package/src/lib/components/create-modify-role/create-modify-role.component.html +0 -15
  83. package/src/lib/components/create-modify-role/create-modify-role.component.scss +0 -83
  84. package/src/lib/components/create-modify-role/create-modify-role.component.spec.ts +0 -346
  85. package/src/lib/components/create-modify-role/create-modify-role.component.ts +0 -321
  86. package/src/lib/components/create-tenant-application/create-tenant-application.component.html +0 -18
  87. package/src/lib/components/create-tenant-application/create-tenant-application.component.scss +0 -73
  88. package/src/lib/components/create-tenant-application/create-tenant-application.component.spec.ts +0 -775
  89. package/src/lib/components/create-tenant-application/create-tenant-application.component.ts +0 -638
  90. package/src/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.html +0 -22
  91. package/src/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.scss +0 -79
  92. package/src/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.spec.ts +0 -716
  93. package/src/lib/components/roles-and-permissions-mapping/roles-and-permissions-mapping.component.ts +0 -504
  94. package/src/lib/components/tenant-basic-details/tenant-basic-details.component.html +0 -44
  95. package/src/lib/components/tenant-basic-details/tenant-basic-details.component.scss +0 -16
  96. package/src/lib/components/tenant-basic-details/tenant-basic-details.component.spec.ts +0 -115
  97. package/src/lib/components/tenant-basic-details/tenant-basic-details.component.ts +0 -109
  98. package/src/lib/components/view-tenant-details/view-tenant-details.component.html +0 -195
  99. package/src/lib/components/view-tenant-details/view-tenant-details.component.scss +0 -163
  100. package/src/lib/components/view-tenant-details/view-tenant-details.component.spec.ts +0 -1221
  101. package/src/lib/components/view-tenant-details/view-tenant-details.component.ts +0 -876
  102. package/src/lib/components/view-tenant-group-types/view-tenant-group-types.component.html +0 -10
  103. package/src/lib/components/view-tenant-group-types/view-tenant-group-types.component.scss +0 -44
  104. package/src/lib/components/view-tenant-group-types/view-tenant-group-types.component.spec.ts +0 -410
  105. package/src/lib/components/view-tenant-group-types/view-tenant-group-types.component.ts +0 -219
  106. package/src/lib/components/view-tenants-list/view-tenants-list.component.html +0 -32
  107. package/src/lib/components/view-tenants-list/view-tenants-list.component.scss +0 -35
  108. package/src/lib/components/view-tenants-list/view-tenants-list.component.spec.ts +0 -464
  109. package/src/lib/components/view-tenants-list/view-tenants-list.component.ts +0 -388
  110. package/src/lib/models/app-type-config.model.ts +0 -14
  111. package/src/lib/models/app-type.model.ts +0 -5
  112. package/src/lib/models/create-group-type-config.model.ts +0 -18
  113. package/src/lib/models/create-group-type.model.ts +0 -46
  114. package/src/lib/models/feature-permission-id.model.ts +0 -6
  115. package/src/lib/models/features.model.ts +0 -15
  116. package/src/lib/models/form-status.model.ts +0 -5
  117. package/src/lib/models/permission-type.model.ts +0 -9
  118. package/src/lib/models/role-menu-action.model.ts +0 -5
  119. package/src/lib/models/role-type.model.ts +0 -34
  120. package/src/lib/models/roles-and-permissions-table-type.model.ts +0 -5
  121. package/src/lib/models/roles-and-permissions.model.ts +0 -113
  122. package/src/lib/models/route-config.model.ts +0 -4
  123. package/src/lib/models/table-column-schema-view-tenant-list.model.ts +0 -21
  124. package/src/lib/models/tenant-function-type.model.ts +0 -10
  125. package/src/lib/models/tenant.model.ts +0 -47
  126. package/src/lib/models/tenants-permission.model.ts +0 -9
  127. package/src/lib/models/update-tenant-status.model.ts +0 -12
  128. package/src/lib/models/view-tenant-group-types.model.ts +0 -34
  129. package/src/lib/services/tenant-applications.service.spec.ts +0 -1245
  130. package/src/lib/services/tenant-applications.service.ts +0 -798
  131. package/src/lib/services/tenant-permissions-map.service.spec.ts +0 -25
  132. package/src/lib/services/tenant-permissions-map.service.ts +0 -28
  133. package/src/lib/services/tenant-permissions.service.spec.ts +0 -62
  134. package/src/lib/services/tenant-permissions.service.ts +0 -49
  135. package/src/lib/tenant-applications.component.html +0 -0
  136. package/src/lib/tenant-applications.component.scss +0 -0
  137. package/src/lib/tenant-applications.component.spec.ts +0 -28
  138. package/src/lib/tenant-applications.component.ts +0 -12
  139. package/src/lib/tenant-applications.module.ts +0 -8
  140. package/tsconfig.lib.json +0 -14
  141. package/tsconfig.lib.prod.json +0 -10
  142. package/tsconfig.spec.json +0 -14
@@ -0,0 +1,733 @@
1
+ import { Component, Input, ViewEncapsulation, } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { AlertType, ModalType } from '@ieeesa-npm/models';
4
+ import { ModalComponent, SlideToggleComponent, AlignType, ModalConfirmationComponent, IconButtonComponent, TableColumnType, AccordionComponent, AccordionDetails, DataTableComponent } from '@ieeesa-npm/presentation';
5
+ import { MatButtonModule } from '@angular/material/button';
6
+ import { Subject, takeUntil } from 'rxjs';
7
+ import * as screenText from '../../assets/constants.json';
8
+ import { RouterModule } from '@angular/router';
9
+ import { MatDividerModule } from '@angular/material/divider';
10
+ import { TenantFunctionType } from '../../models/tenant-function-type.model';
11
+ import { CreateTenantApplicationComponent } from '../create-tenant-application/create-tenant-application.component';
12
+ import { FeaturePermissionId } from '../../models/feature-permission-id.model';
13
+ import { TenantBasicDetailsComponent } from '../tenant-basic-details/tenant-basic-details.component';
14
+ import { PermissionType } from '../../models/permission-type.model';
15
+ import { CreateModifyRoleComponent } from '../create-modify-role/create-modify-role.component';
16
+ import { RoleMenuAction } from '../../models/role-menu-action.model';
17
+ import { RolesAndPermissionsMappingComponent } from '../roles-and-permissions-mapping/roles-and-permissions-mapping.component';
18
+ import { ViewTenantGroupTypesComponent } from '../view-tenant-group-types/view-tenant-group-types.component';
19
+ import { CreateModifyGroupTypeComponent } from '../create-modify-group-type/create-modify-group-type.component';
20
+ import * as i0 from "@angular/core";
21
+ import * as i1 from "@angular/material/dialog";
22
+ import * as i2 from "@ieeesa-npm/presentation";
23
+ import * as i3 from "../../services/tenant-applications.service";
24
+ import * as i4 from "@ieeesa-npm/utility";
25
+ import * as i5 from "@ieeesa-npm/shared";
26
+ import * as i6 from "@angular/router";
27
+ import * as i7 from "@angular/common";
28
+ import * as i8 from "@angular/material/divider";
29
+ import * as i9 from "@angular/material/button";
30
+ export class ViewTenantDetailsComponent {
31
+ constructor(
32
+ // eslint-disable-next-line no-unused-vars
33
+ dialog,
34
+ // eslint-disable-next-line no-unused-vars
35
+ breakpointObserverService,
36
+ // eslint-disable-next-line no-unused-vars
37
+ tenantAppService,
38
+ // eslint-disable-next-line no-unused-vars
39
+ globalErrorHandlerService,
40
+ // eslint-disable-next-line no-unused-vars
41
+ sharedService,
42
+ // eslint-disable-next-line no-unused-vars
43
+ activatedRoute) {
44
+ this.dialog = dialog;
45
+ this.breakpointObserverService = breakpointObserverService;
46
+ this.tenantAppService = tenantAppService;
47
+ this.globalErrorHandlerService = globalErrorHandlerService;
48
+ this.sharedService = sharedService;
49
+ this.activatedRoute = activatedRoute;
50
+ this.destroy$ = new Subject();
51
+ this.isMobileView = false;
52
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
53
+ this.constants = screenText;
54
+ this.tenantLabels = this.constants?.viewTenants?.label;
55
+ this.slideToggleOption = {
56
+ id: 1,
57
+ label: this.constants?.viewTenants?.label?.active,
58
+ checked: true,
59
+ disabled: false,
60
+ };
61
+ this.editButton = this.constants?.viewTenants?.buttons;
62
+ this.accordionInfoList = JSON.parse(JSON.stringify(this.constants?.viewTenants?.tenantAccordionInfo));
63
+ this.appId = '';
64
+ this.iconSize = this.constants?.viewRolesAndPermissions?.columnActionIconSize;
65
+ this.rolesAndPermissionsTableCaption = this.constants?.viewRolesAndPermissions?.tableCaption;
66
+ this.rolesAndPermissionsTableHeaderName = this.constants?.viewRolesAndPermissions?.tableColumnsHeaderText;
67
+ this.rolesAndPermissionsTableSupportMessage = this.constants?.viewRolesAndPermissions?.scrollbarSupportMessage;
68
+ this.permissionsColumnClassNumber = 1;
69
+ this.menuItems = this.constants?.viewRolesAndPermissions?.columnActionMenuItems;
70
+ this.columnSchema = [];
71
+ this.tableData = [];
72
+ this.isRolesAndPermissionsExpanded = false;
73
+ this.paginatorConfig = {
74
+ recordsPerPage: this.constants?.viewRolesAndPermissions?.pageSizeOptions[0],
75
+ pageSizeOptions: this.constants?.viewRolesAndPermissions?.pageSizeOptions,
76
+ totalRecords: 0,
77
+ };
78
+ this.rolesAndPermissionsClassName = '.ieeesa-view-tenant-info__roles-and-permissions';
79
+ this.headerElementClassName = '.ieeesa-header';
80
+ this.tableActions = {
81
+ isPaginationNeeded: true,
82
+ };
83
+ this.accordionDetails = AccordionDetails;
84
+ this.isBasicDetailsExpanded = false;
85
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
86
+ this.createGroupTypeScreenTexts = this.constants?.createGroupType;
87
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
88
+ this.editTenantScreenTexts = this.constants?.editTenant;
89
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
90
+ this.deleteRoleScreenTexts = this.constants?.deleteRole;
91
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
92
+ this.mapRolesAndPermissionsScreenTexts = this.constants?.mapRolesAndPermissions;
93
+ this.alignmentType = AlignType;
94
+ this.permissionType = PermissionType;
95
+ this.createRoleScreenTexts = this.constants?.createRole;
96
+ this.selectedRoleInfo = {
97
+ roleId: '',
98
+ roleName: '',
99
+ };
100
+ this.isGroupTypesExpanded = false;
101
+ this.roleTypeOptions = [];
102
+ this.breakpointObserverService
103
+ .getBreakpoint()
104
+ .pipe(takeUntil(this.destroy$))
105
+ .subscribe((result) => {
106
+ this.isMobileView = result?.matches;
107
+ });
108
+ }
109
+ /**
110
+ * Initializes view tenant details component.
111
+ * @return -returns nothing
112
+ * @memberof ViewTenantDetailsComponent
113
+ */
114
+ ngOnInit() {
115
+ this.tenantDetails =
116
+ this.tenantAppService?.getSelectedTenantInformation();
117
+ this.slideToggleOption.checked = this.tenantDetails?.status;
118
+ this.slideToggleOption.label = this.tenantDetails?.status
119
+ ? this.tenantLabels?.active
120
+ : this.tenantLabels?.inactive;
121
+ this.routePaths = this.routePaths ?? this.constants?.routeConfigPath;
122
+ this.viewTenantsRouteUrl = `/${this.routePaths?.viewTenants}`;
123
+ this.tenantAppService?.setAppConfig(this.apiBaseURL, this.userPermissions);
124
+ this.userTenantsPermissions = this.tenantAppService?.filterPermission(this.userPermissions);
125
+ this.appId = this.tenantAppService.getSelectedTenantInformation()
126
+ ?.appId;
127
+ this.tablePagination = {
128
+ offset: 0,
129
+ pageSize: this.paginatorConfig.pageSizeOptions[0],
130
+ };
131
+ this.getApplicationTypes();
132
+ this.activatedRoute?.queryParams
133
+ ?.pipe(takeUntil(this.destroy$))
134
+ ?.subscribe((params) => {
135
+ this.appId = params['id'];
136
+ this.getTenantDetails(this.appId);
137
+ });
138
+ }
139
+ /**
140
+ * Gets the selected tenant details from server.
141
+ * @memberof ViewTenantDetailsComponent
142
+ */
143
+ getTenantDetails(appId) {
144
+ this.tenantAppService
145
+ .getTenantDetails(appId)
146
+ .pipe(takeUntil(this.destroy$))
147
+ .subscribe({
148
+ next: (response) => {
149
+ if (response?.status) {
150
+ this.tenantDetails = response?.body;
151
+ this.tenantAppService.setSelectedTenantInformation(this.tenantDetails);
152
+ this.slideToggleOption.checked = this.tenantDetails
153
+ .status;
154
+ this.slideToggleOption.label = this.tenantDetails.status
155
+ ? this.tenantLabels?.active
156
+ : this.tenantLabels?.inactive;
157
+ const features = this.tenantDetails.features;
158
+ features.map((feature) => {
159
+ if (feature?.featureId ===
160
+ FeaturePermissionId.MEETINGS_AND_EVENTS ||
161
+ feature?.featureId === FeaturePermissionId.BALLOTS)
162
+ this.accordionInfoList.push({
163
+ id: this.accordionInfoList.length + 1,
164
+ isDisabled: false,
165
+ title: feature?.featureName,
166
+ });
167
+ });
168
+ }
169
+ },
170
+ error: (error) => {
171
+ this.sharedService.handleErrors(error, this.constants?.viewTenants.errors);
172
+ },
173
+ });
174
+ }
175
+ /**
176
+ * Display the corresponding tenant basic or feature details based on selected accordion.
177
+ * @param {AccordionInfo} accordionInfo
178
+ * @param {boolean} expanded
179
+ * @memberof ViewTenantDetailsComponent
180
+ */
181
+ showTenantDetails(accordionInfo, expanded) {
182
+ const accordionId = accordionInfo.id;
183
+ switch (accordionId) {
184
+ case 1: {
185
+ this.isBasicDetailsExpanded = expanded;
186
+ if (expanded) {
187
+ this.getApplicationTypes();
188
+ }
189
+ break;
190
+ }
191
+ case 2: {
192
+ this.isRolesAndPermissionsExpanded = expanded;
193
+ if (expanded) {
194
+ this.columnSchema = [];
195
+ this.paginatorConfig.recordsPerPage =
196
+ this.constants?.viewRolesAndPermissions?.pageSizeOptions[0];
197
+ this.tablePagination.offset = 0;
198
+ this.tablePagination.pageSize = this.paginatorConfig.recordsPerPage;
199
+ this.getRolesAndInitializeTableSchema();
200
+ }
201
+ break;
202
+ }
203
+ case 3: {
204
+ this.isGroupTypesExpanded = expanded;
205
+ break;
206
+ }
207
+ }
208
+ }
209
+ /**
210
+ * Fetches the configured roles of the selected tenant and creates the column schema.
211
+ * @memberof ViewTenantDetailsComponent
212
+ */
213
+ getRolesAndInitializeTableSchema() {
214
+ this.tenantAppService
215
+ .getRoles(this.appId)
216
+ .pipe(takeUntil(this.destroy$))
217
+ .subscribe({
218
+ next: (response) => {
219
+ if (response?.status) {
220
+ this.getRolesAndPermissionsAndInitializeTableView({
221
+ payload: {
222
+ offset: this.tablePagination.offset,
223
+ pageSize: this.tablePagination.pageSize,
224
+ },
225
+ });
226
+ const rolesList = this.tenantAppService.sortRolesByRoleType(response?.body);
227
+ this.tenantAppService.setRolesInfo(rolesList);
228
+ const cellValue = this.constants.viewRolesAndPermissions.tableCellValue;
229
+ this.columnSchema = [
230
+ {
231
+ id: 0,
232
+ columnDef: 'permissions',
233
+ heading: this.constants.viewRolesAndPermissions.tableColumn
234
+ .permissions,
235
+ columnType: TableColumnType.TEXT,
236
+ cellData: (rolesAndPermissions) => rolesAndPermissions.permission,
237
+ isStickyColumn: true,
238
+ },
239
+ ];
240
+ rolesList.map((role, index) => {
241
+ this.columnSchema.push({
242
+ id: index + 1,
243
+ columnDef: role.roleId,
244
+ heading: role.roleName,
245
+ columnType: TableColumnType.TEXT,
246
+ hasColumnActions: true,
247
+ cellData: (rolesAndPermissions) => {
248
+ return rolesAndPermissions.roleIdsList.find((roleId) => role.roleId === roleId)
249
+ ? cellValue.yes
250
+ : cellValue.no;
251
+ },
252
+ });
253
+ });
254
+ }
255
+ },
256
+ error: (error) => {
257
+ this.sharedService.handleErrors(error, this.constants?.viewTenants?.errors);
258
+ },
259
+ });
260
+ }
261
+ /**
262
+ * Fetches the roles and permissions mappings for the selected tenant and and initialize table view.
263
+ * @param {GetRolesAndPermissionsPayload} payload
264
+ * @memberof ViewTenantDetailsComponent
265
+ */
266
+ getRolesAndPermissionsAndInitializeTableView(payload) {
267
+ this.tenantAppService
268
+ .getRolesAndPermissionsMappings(this.appId, payload)
269
+ .pipe(takeUntil(this.destroy$))
270
+ .subscribe({
271
+ next: (response) => {
272
+ if (response?.status) {
273
+ this.tableData = [];
274
+ this.paginatorConfig.totalRecords = response?.body
275
+ ?.totalRecords;
276
+ const rolesAndPermissionsList = response?.body
277
+ ?.rolePermissionDetails;
278
+ rolesAndPermissionsList.map((permission) => {
279
+ let roleIdsList = [];
280
+ roleIdsList = permission.roleList.map((role) => role.roleId);
281
+ this.tableData.push({
282
+ permission: permission.permissionName,
283
+ roleIdsList: roleIdsList,
284
+ });
285
+ });
286
+ }
287
+ },
288
+ error: (error) => {
289
+ this.sharedService.handleErrors(error, this.constants?.viewTenants?.errors);
290
+ },
291
+ });
292
+ }
293
+ /**
294
+ * Fetch the roles and permissions records based on offset and page size while the pagination changes.
295
+ * @param {PageEvent} pageEvent
296
+ * @memberof ViewTenantDetailsComponent
297
+ */
298
+ onTablePaginationChange(pageEvent) {
299
+ this.tablePagination = {
300
+ offset: pageEvent.pageIndex,
301
+ pageSize: pageEvent.pageSize,
302
+ };
303
+ this.getRolesAndPermissionsAndInitializeTableView({
304
+ payload: {
305
+ offset: pageEvent.pageIndex,
306
+ pageSize: pageEvent.pageSize,
307
+ },
308
+ });
309
+ }
310
+ /**
311
+ * Captures the selected role's information and performs edit or delete action basis on the selected menu item.
312
+ * @param {TableColumnMenuInfo} roleMenuInfo
313
+ * @memberof ViewTenantDetailsComponent
314
+ */
315
+ onRoleMenuClick(roleMenuInfo) {
316
+ this.selectedRoleInfo.roleId = roleMenuInfo?.tableColumnInfo?.columnDef;
317
+ this.selectedRoleInfo.roleName = roleMenuInfo?.tableColumnInfo?.heading;
318
+ this.tenantAppService?.setSelectedRoleInformation(this.selectedRoleInfo);
319
+ if (roleMenuInfo?.menuActionInfo?.id === RoleMenuAction.DELETE_ROLE) {
320
+ this.openDeleteRoleModal();
321
+ }
322
+ else if (roleMenuInfo?.menuActionInfo?.id === RoleMenuAction.EDIT_ROLE) {
323
+ this.openEditRoleForm();
324
+ }
325
+ }
326
+ /**
327
+ * Keeps track of the accordion based on the element's ID in DOM tree.
328
+ * @memberof ViewTenantDetailsComponent
329
+ */
330
+ trackByAccordionFn(index, item) {
331
+ return item?.id;
332
+ }
333
+ /**
334
+ * Gets the role types and updates the form control.
335
+ * @memberof ViewTenantDetailsComponent
336
+ */
337
+ getRoleTypes() {
338
+ const payload = {
339
+ payload: {
340
+ appId: this.tenantDetails?.appId,
341
+ configFieldName: 'role_type',
342
+ },
343
+ };
344
+ this.tenantAppService
345
+ .getRoleTypes(payload)
346
+ .pipe(takeUntil(this.destroy$))
347
+ .subscribe({
348
+ next: (response) => {
349
+ if (response?.status) {
350
+ this.roleTypeOptions = this.tenantAppService.getRoleTypeOptions(response?.body);
351
+ this.tenantAppService?.setRoleTypeOption(this.roleTypeOptions);
352
+ if (this.functionType === TenantFunctionType.CREATE_ROLE) {
353
+ this.openCreateRoleForm();
354
+ }
355
+ }
356
+ },
357
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
358
+ error: (error) => {
359
+ this.sharedService.handleErrors(error, this.createRoleScreenTexts?.errors);
360
+ },
361
+ });
362
+ }
363
+ /**
364
+ * Sets the dialog options for create role modal and calls openModal method.
365
+ * @return -returns nothing
366
+ * @memberof ViewTenantDetailsComponent
367
+ */
368
+ openCreateRoleForm() {
369
+ this.tenantAppService?.setTenantFunctionType(TenantFunctionType?.CREATE_ROLE);
370
+ this.functionType = TenantFunctionType.CREATE_ROLE;
371
+ if (this.roleTypeOptions.length > 0) {
372
+ const dialogOptions = {
373
+ heading: this.constants?.createRole?.heading,
374
+ isCloseNeeded: true,
375
+ componentReference: CreateModifyRoleComponent,
376
+ modalType: ModalType.FORM,
377
+ };
378
+ this.openModal(dialogOptions, 'ieeesa-create-modify-role');
379
+ }
380
+ else {
381
+ this.getRoleTypes();
382
+ }
383
+ }
384
+ /**
385
+ * Sets the dialog options for create group type modal and calls openModal method.
386
+ * @return -returns nothing
387
+ * @memberof ViewTenantDetailsComponent
388
+ */
389
+ openCreateGroupTypeForm() {
390
+ this.tenantAppService?.setTenantFunctionType(TenantFunctionType?.CREATE_GROUP_TYPE);
391
+ this.functionType = TenantFunctionType.CREATE_GROUP_TYPE;
392
+ const dialogOptions = {
393
+ heading: this.constants?.createGroupType?.heading,
394
+ isCloseNeeded: true,
395
+ componentReference: CreateModifyGroupTypeComponent,
396
+ modalType: ModalType.FORM,
397
+ };
398
+ this.openModal(dialogOptions, 'ieeesa-create-modify-group-type');
399
+ }
400
+ /**
401
+ * Sets the dialog options for edit role modal and calls openModal method.
402
+ * @return -returns nothing
403
+ * @memberof ViewTenantDetailsComponent
404
+ */
405
+ openEditRoleForm() {
406
+ this.tenantAppService?.setTenantFunctionType(TenantFunctionType?.EDIT_ROLE);
407
+ this.functionType = TenantFunctionType.EDIT_ROLE;
408
+ const dialogOptions = {
409
+ heading: this.selectedRoleInfo?.roleName,
410
+ isCloseNeeded: true,
411
+ componentReference: CreateModifyRoleComponent,
412
+ modalType: ModalType.FORM,
413
+ };
414
+ this.openModal(dialogOptions, 'ieeesa-create-modify-role');
415
+ }
416
+ /**
417
+ * Sets the dialog options for edit tenant modal and calls openModal method.
418
+ * @return -returns nothing
419
+ * @memberof ViewTenantDetailsComponent
420
+ */
421
+ openEditTenantForm() {
422
+ this.tenantAppService?.setTenantFunctionType(TenantFunctionType?.EDIT);
423
+ this.functionType = TenantFunctionType.EDIT;
424
+ const dialogOptions = {
425
+ heading: this.tenantDetails?.appTitle,
426
+ isCloseNeeded: true,
427
+ componentReference: CreateTenantApplicationComponent,
428
+ modalType: ModalType.FORM,
429
+ };
430
+ this.openModal(dialogOptions, 'ieeesa-edit-tenant');
431
+ }
432
+ /**
433
+ * Opens modal component with received params and handles form submission success and errors.
434
+ * @param {*} dialogOptions
435
+ * @param {string} [className]
436
+ * @return -returns nothing
437
+ * @memberof ViewTenantsDetailsComponent
438
+ */
439
+ openModal(
440
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
441
+ dialogOptions, className) {
442
+ className = className ?? '';
443
+ this.dialogRef = this.dialog?.open(ModalComponent, {
444
+ data: dialogOptions,
445
+ width: '',
446
+ panelClass: ['ieeesa-modal-dialog', className],
447
+ ariaModal: true,
448
+ });
449
+ this.dialogRef?.componentInstance?.submitFormResponse
450
+ .pipe(takeUntil(this.destroy$))
451
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, no-unused-vars
452
+ .subscribe((result) => {
453
+ this.dialogRef?.close();
454
+ switch (this.functionType) {
455
+ case TenantFunctionType?.EDIT: {
456
+ this.sharedService.showAlertMessage(AlertType?.SUCCESS, `${this.tenantDetails?.appTitle} ${this.editTenantScreenTexts?.message?.success?.submission}`);
457
+ this.tenantDetails = {
458
+ ...this.tenantAppService.getSelectedTenantInformation(),
459
+ };
460
+ break;
461
+ }
462
+ case TenantFunctionType?.CREATE_ROLE: {
463
+ const promptMessage = this.createRoleScreenTexts?.message?.success;
464
+ const roleInfo = this.tenantAppService?.getNewlyCreatedRoleInfo();
465
+ this.sharedService.showAlertMessage(AlertType?.SUCCESS, `${promptMessage?.submission1} ${roleInfo?.roleName} ${promptMessage?.submission2} ${this.tenantDetails?.appTitle}. ${promptMessage?.submission3}`);
466
+ this.getRolesAndInitializeTableSchema();
467
+ break;
468
+ }
469
+ case TenantFunctionType?.EDIT_ROLE: {
470
+ const promptMessage = this.createRoleScreenTexts?.message?.success;
471
+ const roleInfo = this.tenantAppService?.getNewlyCreatedRoleInfo();
472
+ this.sharedService.showAlertMessage(AlertType?.SUCCESS, `${roleInfo?.roleName} ${promptMessage?.modify} ${this.tenantDetails?.appTitle}.`);
473
+ this.getRolesAndInitializeTableSchema();
474
+ break;
475
+ }
476
+ case TenantFunctionType?.CREATE_GROUP_TYPE: {
477
+ this.sharedService.showAlertMessage(AlertType?.SUCCESS, `${this.createGroupTypeScreenTexts?.message?.success?.submissionPart1} ${this.tenantAppService.newlyCreatedGroupType.configFieldValue.name} ${this.createGroupTypeScreenTexts?.message?.success?.submissionPart2} ${this.tenantDetails?.appTitle}. `);
478
+ this.tenantAppService.isGroupTypeAddedOrModified.next(true);
479
+ break;
480
+ }
481
+ }
482
+ });
483
+ this.dialogRef?.componentInstance?.formCancel
484
+ .pipe(takeUntil(this.destroy$))
485
+ .subscribe(() => {
486
+ this.dialogRef?.close();
487
+ if (this.tenantAppService.getTenantFunctionType() ===
488
+ TenantFunctionType.MAP_PERMISSION_AND_ROLE)
489
+ this.getRolesAndInitializeTableSchema();
490
+ });
491
+ this.dialogRef?.componentInstance?.modalConfirm
492
+ .pipe(takeUntil(this.destroy$))
493
+ .subscribe(() => {
494
+ if (this.tenantAppService.getTenantFunctionType() ===
495
+ TenantFunctionType.MAP_PERMISSION_AND_ROLE)
496
+ this.getRolesAndInitializeTableSchema();
497
+ });
498
+ }
499
+ /**
500
+ * Calls openTenantStatusConfirmationModal to change the status of tenant on slide toggle change.
501
+ * @param {SlideToggleOption} slideToggleOption
502
+ * @memberof ViewTenantDetailsComponent
503
+ */
504
+ onSlideToggleChange(slideToggleOption) {
505
+ this.openTenantStatusConfirmationModal(slideToggleOption?.checked);
506
+ }
507
+ /**
508
+ * Opens the confirmation modal to inactivate/reactivate the tenant.
509
+ * @param {boolean} isActivate
510
+ * @memberof ViewTenantDetailsComponent
511
+ */
512
+ openTenantStatusConfirmationModal(isActivate) {
513
+ const confirmationInfo = this.constants?.viewTenants?.confirmationInfo;
514
+ const statusText = isActivate
515
+ ? confirmationInfo?.promptMessageActivate
516
+ : confirmationInfo?.promptMessageInactivate;
517
+ const updateTenantStatusModalOptions = {
518
+ leftButtonLabel: confirmationInfo?.leftButtonLabel,
519
+ rightButtonLabel: confirmationInfo?.rightButtonLabel,
520
+ promptMessage: `${confirmationInfo?.promptMessage} ${statusText} ${this.tenantDetails?.appTitle}?`,
521
+ actionButtonAlign: this.alignmentType?.MIDDLE,
522
+ };
523
+ this.dialogRef = this.dialog?.open(ModalConfirmationComponent, {
524
+ data: updateTenantStatusModalOptions,
525
+ width: 'auto',
526
+ autoFocus: 'dialog',
527
+ ariaLabel: confirmationInfo?.ariaLabel?.alert,
528
+ });
529
+ this.dialogRef
530
+ .afterClosed()
531
+ .pipe(takeUntil(this.destroy$))
532
+ .subscribe((result) => {
533
+ if (result) {
534
+ this.updateTenantStatus(isActivate);
535
+ }
536
+ else {
537
+ this.setSlideToggleStatus(isActivate);
538
+ }
539
+ });
540
+ }
541
+ /**
542
+ * Opens the map permissions and roles modal.
543
+ * @memberof ViewTenantDetailsComponent
544
+ * @returns {void}
545
+ */
546
+ openMapRolesAndPermissionsForm() {
547
+ this.tenantAppService?.setTenantFunctionType(TenantFunctionType?.MAP_PERMISSION_AND_ROLE);
548
+ const dialogOptions = {
549
+ heading: this.mapRolesAndPermissionsScreenTexts.heading,
550
+ isCloseNeeded: true,
551
+ modalType: ModalType.FORM,
552
+ componentReference: RolesAndPermissionsMappingComponent,
553
+ };
554
+ this.openModal(dialogOptions, 'ieeesa-map-permissions-and-roles');
555
+ }
556
+ /**
557
+ * Updates the tenant status to the server using http request and display success/error message based on request response (success or failure).
558
+ * @param {boolean} isActivate
559
+ * @memberof ViewTenantDetailsComponent
560
+ */
561
+ updateTenantStatus(isActivate) {
562
+ const updateTenantStatusRequestPayload = {
563
+ payload: {
564
+ appId: this.tenantDetails?.appId,
565
+ status: isActivate,
566
+ },
567
+ };
568
+ this.tenantAppService
569
+ .updateTenantStatus(updateTenantStatusRequestPayload)
570
+ .pipe(takeUntil(this.destroy$))
571
+ .subscribe({
572
+ next: (res) => {
573
+ this.dialogRef?.close();
574
+ if (res?.status) {
575
+ this.slideToggleOption.label = isActivate
576
+ ? this.tenantLabels?.active
577
+ : this.tenantLabels?.inactive;
578
+ this.tenantDetails.status = isActivate;
579
+ this.tenantDetails = Object.assign({}, this.tenantDetails);
580
+ }
581
+ },
582
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
583
+ error: (error) => {
584
+ this.setSlideToggleStatus(isActivate);
585
+ this.sharedService.handleErrors(error, this.constants?.viewTenants?.errors);
586
+ },
587
+ });
588
+ }
589
+ /**
590
+ * Sets slide toggle checked status and label.
591
+ * @param {boolean} isActivate
592
+ * @memberof ViewTenantDetailsComponent
593
+ */
594
+ setSlideToggleStatus(isActivate) {
595
+ this.slideToggleOption.checked = !isActivate;
596
+ this.slideToggleOption.label = !isActivate
597
+ ? this.tenantLabels?.active
598
+ : this.tenantLabels?.inactive;
599
+ }
600
+ /**
601
+ * Gets the application/tenant types.
602
+ * @memberof ViewTenantDetailsComponent
603
+ */
604
+ getApplicationTypes() {
605
+ this.tenantAppService
606
+ .getApplicationTypes()
607
+ .pipe(takeUntil(this.destroy$))
608
+ .subscribe({
609
+ next: (response) => {
610
+ if (response?.status) {
611
+ this.appTypeOptions =
612
+ this.tenantAppService.getApplicationTypeOptions(response?.body);
613
+ this.tenantAppService.setApplicationType(this.appTypeOptions);
614
+ }
615
+ },
616
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
617
+ error: (error) => {
618
+ this.sharedService.handleErrors(error, this.constants?.viewTenants?.errors);
619
+ },
620
+ });
621
+ }
622
+ /**
623
+ * Validates permission based access for provided feature.
624
+ * @param {PermissionType} permissionType
625
+ * @return {boolean}
626
+ * @memberof ViewTenantDetailsComponent
627
+ */
628
+ validateAccess(permissionType) {
629
+ return this.tenantAppService.validateAccess(permissionType, this.userTenantsPermissions);
630
+ }
631
+ /**
632
+ * Posts the details of the role to be deleted to the server using http request and display success/error message based on request response (success or failure).
633
+ * @memberof ViewTenantDetailsComponent
634
+ */
635
+ deleteRole() {
636
+ const deleteRoleRequestPayload = {
637
+ payload: {
638
+ appId: this.tenantDetails?.appId,
639
+ roleId: this.selectedRoleInfo?.roleId,
640
+ },
641
+ };
642
+ this.tenantAppService
643
+ .deleteRole(deleteRoleRequestPayload)
644
+ .pipe(takeUntil(this.destroy$))
645
+ .subscribe({
646
+ next: (res) => {
647
+ if (res?.status) {
648
+ this.sharedService.showAlertMessage(AlertType?.SUCCESS, `${this.selectedRoleInfo?.roleName} ${this.deleteRoleScreenTexts?.message?.success?.submission} ${this.tenantDetails?.appTitle}.`);
649
+ this.getRolesAndInitializeTableSchema();
650
+ }
651
+ },
652
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
653
+ error: (error) => {
654
+ this.sharedService.handleErrors(error, this.constants?.viewTenants?.errors);
655
+ },
656
+ });
657
+ }
658
+ /**
659
+ * Sets the role menu HTMLElement.
660
+ * @param {HTMLElement} menuButton
661
+ * @memberof ViewTenantDetailsComponent
662
+ */
663
+ selectedRoleMenuElement(menuButton) {
664
+ this.roleMenuElement = menuButton;
665
+ }
666
+ /**
667
+ * Opens the confirmation modal to get user confirmation to delete the role.
668
+ * @memberof ViewTenantDetailsComponent
669
+ */
670
+ openDeleteRoleModal() {
671
+ const confirmationInfo = this.constants?.viewTenants?.confirmationInfo;
672
+ const deleteRoleModalOptions = {
673
+ leftButtonLabel: confirmationInfo?.leftButtonLabel,
674
+ rightButtonLabel: confirmationInfo?.rightButtonLabel,
675
+ promptMessage: `${confirmationInfo?.deleteRoleConfirmationMessage} ${this.selectedRoleInfo?.roleName}? ${confirmationInfo?.deleteRolePromptMessage} ${this.tenantDetails?.appTitle}.`,
676
+ actionButtonAlign: this.alignmentType?.MIDDLE,
677
+ };
678
+ this.dialogRef = this.dialog?.open(ModalConfirmationComponent, {
679
+ data: deleteRoleModalOptions,
680
+ width: '25%',
681
+ panelClass: [
682
+ 'ieeesa-modal-confirm-dialog',
683
+ 'ieeesa-delete-role-confirm-dialog',
684
+ ],
685
+ autoFocus: 'dialog',
686
+ ariaLabel: confirmationInfo?.ariaLabel?.alert,
687
+ });
688
+ this.dialogRef
689
+ .afterClosed()
690
+ .pipe(takeUntil(this.destroy$))
691
+ .subscribe((result) => {
692
+ if (result) {
693
+ this.deleteRole();
694
+ }
695
+ else
696
+ this.roleMenuElement?.focus();
697
+ });
698
+ }
699
+ /**
700
+ * Performs necessary cleanup tasks, such as unsubscribing from subscription when the component is being destroyed.
701
+ * @memberof ViewTenantDetailsComponent
702
+ */
703
+ ngOnDestroy() {
704
+ this.roleTypeOptions = [];
705
+ this.tenantAppService?.setRoleTypeOption(this.roleTypeOptions);
706
+ this.destroy$?.next(true);
707
+ this.destroy$?.unsubscribe();
708
+ }
709
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ViewTenantDetailsComponent, deps: [{ token: i1.MatDialog }, { token: i2.BreakpointObserverService }, { token: i3.TenantApplicationsService }, { token: i4.GlobalErrorHandlerService }, { token: i5.SharedService }, { token: i6.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
710
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ViewTenantDetailsComponent, isStandalone: true, selector: "ieeesa-view-tenant-details", inputs: { apiBaseURL: "apiBaseURL", userPermissions: "userPermissions", routePaths: "routePaths" }, ngImport: i0, template: "<div\r\n class=\"ieeesa-view-tenant-info px-4 pb-4\"\r\n [ngClass]=\"\r\n isMobileView\r\n ? 'ieeesa-view-tenant-info--bg-white'\r\n : 'ieeesa-view-tenant-info--bg-blue'\r\n \"\r\n>\r\n <div\r\n class=\"d-flex justify-content-between gap-lg-4 gap-md-3 gap-sm-2 gap-3\"\r\n [ngClass]=\"isMobileView ? 'flex-column gap-2 pb-3' : 'align-item-center'\"\r\n >\r\n <div\r\n class=\"d-flex gap-lg-4 gap-md-3 gap-sm-3 gap-3 ps-0 align-items-md-center align-items-xl-center\"\r\n [ngClass]=\"isMobileView ? 'flex-column' : ''\"\r\n >\r\n <p\r\n class=\"mb-0 ieeesa-headline-lg-32 py-3\"\r\n [ngClass]=\"isMobileView ? '' : 'ieeesa-view-tenant-info--title'\"\r\n >\r\n {{ tenantDetails?.appTitle }}\r\n </p>\r\n <div class=\"d-flex gap-lg-2 gap-md-2 gap-sm-2 gap-2\">\r\n <span\r\n class=\"mb-0 ieeesa-title-sm-14 mt-1\"\r\n [ngClass]=\"isMobileView ? 'p-0' : 'ieeesa-view-tenant-info--app-id'\"\r\n >\r\n {{ tenantLabels?.appId }}:\r\n </span>\r\n {{ tenantDetails?.appId }}\r\n <ng-container *ngIf=\"tenantDetails?.appId !== tenantLabels?.saAppId\">\r\n <mat-divider [vertical]=\"true\"></mat-divider>\r\n <span\r\n class=\"mb-0 mt-1 ieeesa-title-sm-14 ieeesa-view-tenant-info--app-status\"\r\n [ngClass]=\"isMobileView ? 'p-0' : ''\"\r\n >\r\n {{ tenantLabels?.status }}:\r\n </span>\r\n <ieeesa-slide-toggle\r\n [slideToggle]=\"slideToggleOption\"\r\n (slideToggleChange)=\"onSlideToggleChange($event)\"\r\n ></ieeesa-slide-toggle>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <a\r\n class=\"ieeesa-btn-label-lg-bold-16 text-decoration-none mt-lg-3 mt-xl-6 p-sm-0 p-md-0\"\r\n href=\"javascript:void(0)\"\r\n rel=\"noopener noreferrer\"\r\n [routerLink]=\"viewTenantsRouteUrl\"\r\n [ngClass]=\"\r\n isMobileView\r\n ? 'ieeesa-view-tenant-info--link-mobile'\r\n : 'ieeesa-view-tenant-info--link'\r\n \"\r\n >{{ tenantLabels?.viewAllApps }}</a\r\n >\r\n </div>\r\n <div\r\n class=\"ieeesa-view-tenant-info__accordion ieeesa-view-tenant-info__accordion--blue-bg\"\r\n [ngClass]=\"isMobileView ? 'ieeesa-view-tenant-info__accordion--info' : ''\"\r\n >\r\n <ng-container\r\n *ngFor=\"\r\n let accordionInfo of accordionInfoList;\r\n trackBy: trackByAccordionFn\r\n \"\r\n >\r\n <ng-container [ngSwitch]=\"accordionInfo.id\">\r\n <ng-container *ngSwitchCase=\"accordionDetails.BASIC_DETAILS\">\r\n <ieeesa-accordion\r\n [accordionInfo]=\"accordionInfo\"\r\n class=\"ieeesa-view-tenant-info__accordion-info\"\r\n (accordionOpened)=\"showTenantDetails(accordionInfo, $event)\"\r\n >\r\n <ieeesa-icon-button\r\n *ngIf=\"\r\n isBasicDetailsExpanded &&\r\n validateAccess(permissionType.MANAGE_TENANT)\r\n \"\r\n actions\r\n class=\"ieeesa-button\"\r\n [iconButton]=\"editButton\"\r\n (iconButtonClick)=\"openEditTenantForm()\"\r\n ></ieeesa-icon-button>\r\n <ng-container component *ngIf=\"isBasicDetailsExpanded\">\r\n <ieeesa-tenant-basic-details\r\n [tenantDetails]=\"tenantDetails\"\r\n ></ieeesa-tenant-basic-details>\r\n </ng-container>\r\n </ieeesa-accordion>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"accordionDetails.ROLES_AND_PERMISSIONS\">\r\n <ieeesa-accordion\r\n [accordionInfo]=\"accordionInfo\"\r\n class=\"ieeesa-view-tenant-info__roles-and-permissions\"\r\n (accordionOpened)=\"showTenantDetails(accordionInfo, $event)\"\r\n >\r\n <div\r\n actions\r\n *ngIf=\"isRolesAndPermissionsExpanded\"\r\n class=\"d-flex gap-3\"\r\n [ngClass]=\"\r\n isMobileView ? 'mb-3 px-4' : 'ieeesa-view-tenant-info__actions'\r\n \"\r\n >\r\n <button\r\n mat-button\r\n class=\"mat-tertiary-button\"\r\n [ngClass]=\"isMobileView ? 'p-0' : 'px-2 py-2'\"\r\n (click)=\"openCreateRoleForm()\"\r\n *ngIf=\"validateAccess(permissionType.MANAGE_TENANT)\"\r\n >\r\n {{\r\n constants.viewRolesAndPermissions.actionButtonLabels.addRole\r\n }}\r\n </button>\r\n <button\r\n mat-button\r\n class=\"mat-tertiary-button\"\r\n (click)=\"openMapRolesAndPermissionsForm()\"\r\n [ngClass]=\"isMobileView ? 'p-0' : 'px-2 py-2'\"\r\n >\r\n {{\r\n constants.viewRolesAndPermissions.actionButtonLabels\r\n .mapPermissionsRoles\r\n }}\r\n </button>\r\n </div>\r\n <ng-container component *ngIf=\"isRolesAndPermissionsExpanded\">\r\n <mat-divider\r\n class=\"ieeesa-view-tenant-info__roles-and-permissions__divider\"\r\n ></mat-divider>\r\n <ieeesa-data-table\r\n *ngIf=\"columnSchema.length\"\r\n [tableDataInfo]=\"tableData\"\r\n [headerElementClassName]=\"headerElementClassName\"\r\n [columnSchemaInfo]=\"columnSchema\"\r\n [caption]=\"rolesAndPermissionsTableCaption\"\r\n [paginatorConfig]=\"paginatorConfig\"\r\n [tableActions]=\"tableActions\"\r\n [isScrollSupportMessageNeeded]=\"true\"\r\n [tableColumnActionMenuSize]=\"iconSize\"\r\n [tableColumnActions]=\"menuItems\"\r\n [customStickyHeaderNeeded]=\"true\"\r\n [tableColumnsHeaderText]=\"rolesAndPermissionsTableHeaderName\"\r\n [scrollbarSupportMessage]=\"\r\n rolesAndPermissionsTableSupportMessage\r\n \"\r\n [verticalColumnHeaderNumber]=\"permissionsColumnClassNumber\"\r\n (paginationChange)=\"onTablePaginationChange($event)\"\r\n (tableColumnMenuActionClick)=\"onRoleMenuClick($event)\"\r\n (tableColumnMenuToggleButton)=\"selectedRoleMenuElement($event)\"\r\n ></ieeesa-data-table>\r\n </ng-container>\r\n </ieeesa-accordion>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"accordionDetails.GROUP_TYPES\">\r\n <ieeesa-accordion\r\n [accordionInfo]=\"accordionInfo\"\r\n class=\"ieeesa-view-tenant-info__group-types\"\r\n (accordionOpened)=\"showTenantDetails(accordionInfo, $event)\"\r\n >\r\n <div\r\n actions\r\n *ngIf=\"isGroupTypesExpanded\"\r\n class=\"d-flex gap-3\"\r\n [ngClass]=\"\r\n isMobileView ? 'mb-3 px-4' : 'ieeesa-view-tenant-info__actions'\r\n \"\r\n >\r\n <button\r\n mat-button\r\n class=\"mat-tertiary-button p-2\"\r\n *ngIf=\"validateAccess(permissionType.MANAGE_TENANT)\"\r\n (click)=\"openCreateGroupTypeForm()\"\r\n >\r\n {{ constants.viewGroupTypes.actionButtonLabels.addGroupType }}\r\n </button>\r\n </div>\r\n <ng-container component *ngIf=\"isGroupTypesExpanded\">\r\n <ieeesa-view-tenant-group-types></ieeesa-view-tenant-group-types>\r\n </ng-container>\r\n </ieeesa-accordion>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ieeesa-accordion\r\n [accordionInfo]=\"accordionInfo\"\r\n (accordionOpened)=\"showTenantDetails(accordionInfo, $event)\"\r\n ></ieeesa-accordion>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n</div>\r\n", styles: [".ieeesa-subtitle{text-align:left;font-family:Calibri Regular;font-size:1.5625rem;letter-spacing:0;color:#000;opacity:1}.ieeesa-body{text-align:left;font-family:Calibri Regular;font-size:1.25rem;letter-spacing:0;color:#000;opacity:1}.ieeesa-display-lg-57{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:3.5625rem;line-height:64px;color:#000;letter-spacing:0}.ieeesa-display-md-45{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.813rem;line-height:52px;color:#000;letter-spacing:0}.ieeesa-display-md-47{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.9375rem;line-height:52px;color:#000;letter-spacing:0}.ieeesa-display-sm-38{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.375rem;line-height:44px;color:#000;letter-spacing:0}.ieeesa-headline-lg-32{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2rem;line-height:40px;color:#000;letter-spacing:0}.ieeesa-headline-lg-34{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.125rem;line-height:40px;color:#000;letter-spacing:0}.ieeesa-headline-md-30{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.875rem;line-height:36px;color:#000;letter-spacing:0}.ieeesa-headline-sm-24{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.5rem;line-height:32px;color:#00629b;letter-spacing:0}.ieeesa-headline-sm-26{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.625rem;line-height:32px;color:#000;letter-spacing:0}.ieeesa-title-lg-bold-24{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:0}.ieeesa-title-lg-24{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:0}.ieeesa-title-md-18{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.009375em}.ieeesa-title-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-title-sm-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-label-lg-bold-16{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-label-lg-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-btn-label-lg-bold-16{font-family:Calibri Regular;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#00629b;letter-spacing:.00625em}.ieeesa-label-md-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.03125em}.ieeesa-label-sm-13{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.8125rem;line-height:16px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-bold-16{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-bold-18{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-18{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-md-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:20px;color:#1c1b1f;letter-spacing:.015625em}.ieeesa-body-md-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.015625em}.ieeesa-body-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-body-sm-12{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.75rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-body-color-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:18px;color:#49454f;letter-spacing:.025em}.ieeesa-body-sm-bold-14{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-title-inter-lg-bold-24{font-family:Inter Bold;font-style:normal;font-weight:700;font-size:1.5rem;line-height:29px;color:#000;letter-spacing:0}.mat-mdc-button.mat-mdc-button-base.mat-primary-button,.mat-mdc-button.mat-mdc-button-base.mat-secondary-button,.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button,.mat-mdc-button.mat-mdc-button-base.mat-text-button{min-width:103px;width:auto;min-height:40px;height:auto;border-radius:3px;text-align:center;padding:.625em 1.5em;border:none;font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.mat-mdc-button.mat-mdc-button-base>.mat-icon{margin-right:11px}.mat-mdc-button.mat-mdc-button-base.mat-primary-button{background-color:#00629b;color:#fff}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:focus{background:#1f75a7}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:hover{background-color:#003e65}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:active{background-color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:disabled{background-color:#1c1b1f1f}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button{color:#fff;background:#a7a8aa;box-shadow:0 1px 2px #0000004d,0 2px 6px 2px #00000026}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:hover{background:#a7a8aa}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:focus{background:#f0f5f9}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:active{background:#1d192b1f}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:disabled{background:#1c1b1f1f;color:#1c1b1f;opacity:.38}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button{background-color:#fff;border:1px solid #00629b;color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:hover{background-color:#6750a414}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:focus{background-color:#f0f5f9}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:active{background:#6750a41f}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:disabled{border:1px solid rgba(28,27,31,.12);color:#1c1b1f;opacity:.38}.mat-mdc-button.mat-mdc-button-base.mat-text-button{color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-text-button:hover,.mat-mdc-button.mat-mdc-button-base.mat-text-button:active{background:#6750a414}.mat-mdc-button.mat-mdc-button-base.mat-text-button:disabled{color:#1c1b1f;opacity:.38}.ieeesa-text-button{color:#cac4d0;background:none;border:none}.ieeesa-view-more-or-less-button{border:none;background:none;text-decoration:underline;color:#00629b}.flex-align-center{display:flex;align-items:center;justify-content:center}.mat-button-toggle-checked{background-color:#a7a8aa}.mat-button-toggle-checked .mat-button-toggle-label-content:before{font-family:\"Font Awesome 5 Free\";font-weight:900;content:\"\\f00c\";padding-right:.5625em}.mat-button-toggle-group .mat-button-toggle-label-content{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#1c1b1f;letter-spacing:.00625em}.no-bg-color-btn{color:#00629b;border-radius:3px;border:1px solid #00629b;min-height:40px;height:auto}@media (max-width: 768px){.mat-button-toggle-group .mat-button-toggle-label-content{max-width:8ch;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;position:relative}}.cdk-overlay-pane .mat-mdc-tooltip .mdc-tooltip__surface{color:#525252;padding:6px 12px;font-family:Calibri Regular;font-size:1rem;border:1px solid #cac4d0;background:#fff;box-shadow:0 4px 8px #00000040;max-width:unset!important}.cdk-overlay-pane .mat-mdc-option .mdc-list-item__primary-text{font-family:Calibri Regular!important}.cdk-overlay-pane.ieeesa-modal-confirm-dialog,.cdk-overlay-pane.ieeesa-modal-dialog,.cdk-overlay-pane.ieeesa-alert-dialog{width:100%;min-width:312px}.mat-mdc-form-field{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:24px;color:#49454f;letter-spacing:.03125em}.ieeesa-cancel-modal-confirm-dialog{width:25vw!important}.ieeesa-cancel-modal-confirm-dialog .ieeesa-confirmation{padding:1.5em 1.5em 1em}.ieeesa-cancel-modal-confirm-dialog .ieeesa-confirmation .mat-mdc-dialog-content{text-align:center;padding:0 0 1em!important}.mat-mdc-button,.mat-mdc-outlined-button{--mat-mdc-button-persistent-ripple-color: unset}@media (max-width: 768px){.ieeesa-cancel-modal-confirm-dialog{width:90vw!important}}.ieeesa-wrapper-border{border:1px solid #b2b7be;border-top:none;padding:1.5em;border-radius:0 0 4px 4px}.ieeesa-view-tenant-info{background-color:#f2f2f2}.ieeesa-view-tenant-info--bg-white{background-color:#fff;padding:1em 1.5em 0}.ieeesa-view-tenant-info__actions{top:15px;margin-right:20px;position:absolute;right:0}.ieeesa-view-tenant-info--title,.ieeesa-view-tenant-info--action{padding:.75em 0}.ieeesa-view-tenant-info--link{padding:1em .75em 1.3em 0!important}.ieeesa-view-tenant-info--link-mobile{max-width:-moz-fit-content;max-width:fit-content}.ieeesa-view-tenant-info--app-id,.ieeesa-view-tenant-info--app-status{color:#49454f}.ieeesa-view-tenant-info__accordion{background-color:#fff;box-shadow:0 1px 4px #00000040,0 4px #00b5e2 inset;padding:1.5em .75em}.ieeesa-view-tenant-info__accordion--bg-white{background-color:#fff;box-shadow:none}.ieeesa-view-tenant-info__accordion--info{padding:1em 1em 1.5em}.ieeesa-view-tenant-info__accordion-info .mat-accordion .mat-expansion-panel-spacing.mat-expanded{position:relative}.ieeesa-view-tenant-info__accordion-info .mat-accordion .mat-expansion-panel-body{padding:1.5em 1.5em 1.5em 2.25em}.ieeesa-view-tenant-info__accordion-info .ieeesa-button{position:absolute;top:1.25em;right:0}.ieeesa-view-tenant-info__accordion-info .ieeesa-button svg{width:1.3em!important;height:1.3em!important}.ieeesa-view-tenant-info .mat-divider-vertical{margin:0;height:1.4em;color:#cac4d0;width:.063em;border-right-color:#cac4d0}.ieeesa-view-tenant-info .ieeesa-slide-toggle-field .mat-mdc-slide-toggle .mdc-label{color:#000!important}.ieeesa-view-tenant-info__roles-and-permissions .ieeesa-accordion .mat-accordion .mat-expansion-panel-spacing.mat-expanded{position:relative}.ieeesa-view-tenant-info__roles-and-permissions__divider{margin-top:12px!important;margin-bottom:16px!important;border-top:1px solid #ccd2da!important}.ieeesa-view-tenant-info__roles-and-permissions .mat-mdc-header-cell{white-space:nowrap}.ieeesa-view-tenant-info__roles-and-permissions .mat-expansion-panel-body,.ieeesa-view-tenant-info__roles-and-permissions .ieeesa-data-table{padding-left:0;padding-right:0}.ieeesa-view-tenant-info__roles-and-permissions .ieeesa-data-table .mat-column-permissions{min-width:12.5em;padding:16px!important}.ieeesa-view-tenant-info__roles-and-permissions .ieeesa-data-table__content{margin-top:0!important}.ieeesa-view-tenant-info__roles-and-permissions .ieeesa-data-table__column-menu .mat-mdc-icon-button.mat-mdc-button-base{padding:6px;width:24px;height:24px}.ieeesa-view-tenant-info__roles-and-permissions .ieeesa-data-table__columns-header-text{padding:8px 16px;background:#dae9f1;box-shadow:0 1px #dce3e9 inset}.ieeesa-view-tenant-info__roles-and-permissions .mat-mdc-paginator-container{padding:0;flex-wrap:nowrap}.ieeesa-view-tenant-info__roles-and-permissions .mdc-notched-outline__trailing,.ieeesa-view-tenant-info__roles-and-permissions .mdc-notched-outline__notch,.ieeesa-view-tenant-info__roles-and-permissions .mdc-notched-outline__leading{border:none!important}.ieeesa-view-tenant-info__roles-and-permissions .mat-mdc-paginator-page-size,.ieeesa-view-tenant-info__roles-and-permissions .mat-mdc-paginator-page-size-label,.ieeesa-view-tenant-info__roles-and-permissions .mat-mdc-paginator-page-size-select,.ieeesa-view-tenant-info__roles-and-permissions .mat-mdc-paginator-range-label{margin:0}.ieeesa-view-tenant-info__roles-and-permissions .at-mdc-select-min-line,.ieeesa-view-tenant-info__roles-and-permissions .mat-mdc-paginator-range-label{color:#1c1d1e}.ieeesa-view-tenant-info__roles-and-permissions .mat-mdc-paginator-page-size-label{position:relative;color:#63666a;left:2em}.ieeesa-view-tenant-info__group-types .ieeesa-accordion .mat-accordion .mat-expansion-panel-spacing.mat-expanded{position:relative}.ieeesa-view-tenant-info__group-types .mat-mdc-header-cell{white-space:nowrap}.ieeesa-view-tenant-info__group-types .mat-expansion-panel-body,.ieeesa-view-tenant-info__group-types .ieeesa-data-table{padding-left:0;padding-right:0}.ieeesa-menu__item:not(:last-of-type){margin-bottom:0!important}.ieeesa-menu .mat-mdc-menu-item{min-height:35px!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i7.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i7.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i6.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: SlideToggleComponent, selector: "ieeesa-slide-toggle", inputs: ["formControlName", "slideToggle", "isDisabled", "canShowIcon"], outputs: ["slideToggleChange"] }, { kind: "component", type: AccordionComponent, selector: "ieeesa-accordion", inputs: ["accordionInfo"], outputs: ["accordionOpened"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i8.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: TenantBasicDetailsComponent, selector: "ieeesa-tenant-basic-details", inputs: ["tenantDetails"] }, { kind: "component", type: IconButtonComponent, selector: "ieeesa-icon-button", inputs: ["iconButton", "isLabelNeeded"], outputs: ["iconButtonClick"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i9.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: DataTableComponent, selector: "ieeesa-data-table", inputs: ["tableDataInfo", "nestedTableDataInfo", "columnSchemaInfo", "nestedTableColumnSchemaInfo", "tableActions", "hasNestedTable", "tableColumnActions", "tableColumnActionMenuSize", "tableRowActions", "nestedTableRowActions", "caption", "viewAll", "paginatorConfig", "nestedPaginatorConfig", "legends", "pageIndex", "pageSize", "searchPlaceHolderText", "rowEditButton", "rowDeleteButton", "tableEditButton", "tableDeleteButton", "rowExpandButton", "rowCollapseButton", "isNestedTableHeaderNeeded", "addButton", "defaultColumnSortDirection", "defaultSortedColumn", "isClearSortNeeded", "filters", "selectedFilterOptions", "appliedFilterOptions", "searchType", "className", "searchSupportMessage", "inbuiltSortingNeeded", "isCellTextOverflowEllipsis", "isTableHeaderNeeded", "tableColumnsHeaderText", "verticalColumnHeaderNumber", "scrollbarSupportMessage", "isScrollSupportMessageNeeded", "isStickyHeaderNeeded", "customStickyHeaderNeeded", "headerElementClassName", "minCharToSearch", "searchResultMessage", "rowMenuActionIcon", "canDisableCheckbox", "isEllipsisRequiredForLink"], outputs: ["rowSelected", "selectedRowToEdit", "selectedRowToDelete", "selectedRowsToDelete", "rowLink", "addRow", "columnDataOnRowLinkClick", "menuActionClick", "selectActionMenu", "paginationChange", "selectedFilter", "removeFilteredOption", "filteredOptions", "searchedValue", "sortChange", "selectedRowsInfo", "rowExpansionClick", "tableColumnMenuActionClick", "tableColumnMenuToggleButton", "rowSlideToggle"] }, { kind: "component", type: ViewTenantGroupTypesComponent, selector: "ieeesa-view-tenant-group-types" }], encapsulation: i0.ViewEncapsulation.None }); }
711
+ }
712
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ViewTenantDetailsComponent, decorators: [{
713
+ type: Component,
714
+ args: [{ selector: 'ieeesa-view-tenant-details', standalone: true, imports: [
715
+ CommonModule,
716
+ RouterModule,
717
+ SlideToggleComponent,
718
+ AccordionComponent,
719
+ MatDividerModule,
720
+ TenantBasicDetailsComponent,
721
+ IconButtonComponent,
722
+ MatButtonModule,
723
+ DataTableComponent,
724
+ ViewTenantGroupTypesComponent,
725
+ ], encapsulation: ViewEncapsulation.None, template: "<div\r\n class=\"ieeesa-view-tenant-info px-4 pb-4\"\r\n [ngClass]=\"\r\n isMobileView\r\n ? 'ieeesa-view-tenant-info--bg-white'\r\n : 'ieeesa-view-tenant-info--bg-blue'\r\n \"\r\n>\r\n <div\r\n class=\"d-flex justify-content-between gap-lg-4 gap-md-3 gap-sm-2 gap-3\"\r\n [ngClass]=\"isMobileView ? 'flex-column gap-2 pb-3' : 'align-item-center'\"\r\n >\r\n <div\r\n class=\"d-flex gap-lg-4 gap-md-3 gap-sm-3 gap-3 ps-0 align-items-md-center align-items-xl-center\"\r\n [ngClass]=\"isMobileView ? 'flex-column' : ''\"\r\n >\r\n <p\r\n class=\"mb-0 ieeesa-headline-lg-32 py-3\"\r\n [ngClass]=\"isMobileView ? '' : 'ieeesa-view-tenant-info--title'\"\r\n >\r\n {{ tenantDetails?.appTitle }}\r\n </p>\r\n <div class=\"d-flex gap-lg-2 gap-md-2 gap-sm-2 gap-2\">\r\n <span\r\n class=\"mb-0 ieeesa-title-sm-14 mt-1\"\r\n [ngClass]=\"isMobileView ? 'p-0' : 'ieeesa-view-tenant-info--app-id'\"\r\n >\r\n {{ tenantLabels?.appId }}:\r\n </span>\r\n {{ tenantDetails?.appId }}\r\n <ng-container *ngIf=\"tenantDetails?.appId !== tenantLabels?.saAppId\">\r\n <mat-divider [vertical]=\"true\"></mat-divider>\r\n <span\r\n class=\"mb-0 mt-1 ieeesa-title-sm-14 ieeesa-view-tenant-info--app-status\"\r\n [ngClass]=\"isMobileView ? 'p-0' : ''\"\r\n >\r\n {{ tenantLabels?.status }}:\r\n </span>\r\n <ieeesa-slide-toggle\r\n [slideToggle]=\"slideToggleOption\"\r\n (slideToggleChange)=\"onSlideToggleChange($event)\"\r\n ></ieeesa-slide-toggle>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <a\r\n class=\"ieeesa-btn-label-lg-bold-16 text-decoration-none mt-lg-3 mt-xl-6 p-sm-0 p-md-0\"\r\n href=\"javascript:void(0)\"\r\n rel=\"noopener noreferrer\"\r\n [routerLink]=\"viewTenantsRouteUrl\"\r\n [ngClass]=\"\r\n isMobileView\r\n ? 'ieeesa-view-tenant-info--link-mobile'\r\n : 'ieeesa-view-tenant-info--link'\r\n \"\r\n >{{ tenantLabels?.viewAllApps }}</a\r\n >\r\n </div>\r\n <div\r\n class=\"ieeesa-view-tenant-info__accordion ieeesa-view-tenant-info__accordion--blue-bg\"\r\n [ngClass]=\"isMobileView ? 'ieeesa-view-tenant-info__accordion--info' : ''\"\r\n >\r\n <ng-container\r\n *ngFor=\"\r\n let accordionInfo of accordionInfoList;\r\n trackBy: trackByAccordionFn\r\n \"\r\n >\r\n <ng-container [ngSwitch]=\"accordionInfo.id\">\r\n <ng-container *ngSwitchCase=\"accordionDetails.BASIC_DETAILS\">\r\n <ieeesa-accordion\r\n [accordionInfo]=\"accordionInfo\"\r\n class=\"ieeesa-view-tenant-info__accordion-info\"\r\n (accordionOpened)=\"showTenantDetails(accordionInfo, $event)\"\r\n >\r\n <ieeesa-icon-button\r\n *ngIf=\"\r\n isBasicDetailsExpanded &&\r\n validateAccess(permissionType.MANAGE_TENANT)\r\n \"\r\n actions\r\n class=\"ieeesa-button\"\r\n [iconButton]=\"editButton\"\r\n (iconButtonClick)=\"openEditTenantForm()\"\r\n ></ieeesa-icon-button>\r\n <ng-container component *ngIf=\"isBasicDetailsExpanded\">\r\n <ieeesa-tenant-basic-details\r\n [tenantDetails]=\"tenantDetails\"\r\n ></ieeesa-tenant-basic-details>\r\n </ng-container>\r\n </ieeesa-accordion>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"accordionDetails.ROLES_AND_PERMISSIONS\">\r\n <ieeesa-accordion\r\n [accordionInfo]=\"accordionInfo\"\r\n class=\"ieeesa-view-tenant-info__roles-and-permissions\"\r\n (accordionOpened)=\"showTenantDetails(accordionInfo, $event)\"\r\n >\r\n <div\r\n actions\r\n *ngIf=\"isRolesAndPermissionsExpanded\"\r\n class=\"d-flex gap-3\"\r\n [ngClass]=\"\r\n isMobileView ? 'mb-3 px-4' : 'ieeesa-view-tenant-info__actions'\r\n \"\r\n >\r\n <button\r\n mat-button\r\n class=\"mat-tertiary-button\"\r\n [ngClass]=\"isMobileView ? 'p-0' : 'px-2 py-2'\"\r\n (click)=\"openCreateRoleForm()\"\r\n *ngIf=\"validateAccess(permissionType.MANAGE_TENANT)\"\r\n >\r\n {{\r\n constants.viewRolesAndPermissions.actionButtonLabels.addRole\r\n }}\r\n </button>\r\n <button\r\n mat-button\r\n class=\"mat-tertiary-button\"\r\n (click)=\"openMapRolesAndPermissionsForm()\"\r\n [ngClass]=\"isMobileView ? 'p-0' : 'px-2 py-2'\"\r\n >\r\n {{\r\n constants.viewRolesAndPermissions.actionButtonLabels\r\n .mapPermissionsRoles\r\n }}\r\n </button>\r\n </div>\r\n <ng-container component *ngIf=\"isRolesAndPermissionsExpanded\">\r\n <mat-divider\r\n class=\"ieeesa-view-tenant-info__roles-and-permissions__divider\"\r\n ></mat-divider>\r\n <ieeesa-data-table\r\n *ngIf=\"columnSchema.length\"\r\n [tableDataInfo]=\"tableData\"\r\n [headerElementClassName]=\"headerElementClassName\"\r\n [columnSchemaInfo]=\"columnSchema\"\r\n [caption]=\"rolesAndPermissionsTableCaption\"\r\n [paginatorConfig]=\"paginatorConfig\"\r\n [tableActions]=\"tableActions\"\r\n [isScrollSupportMessageNeeded]=\"true\"\r\n [tableColumnActionMenuSize]=\"iconSize\"\r\n [tableColumnActions]=\"menuItems\"\r\n [customStickyHeaderNeeded]=\"true\"\r\n [tableColumnsHeaderText]=\"rolesAndPermissionsTableHeaderName\"\r\n [scrollbarSupportMessage]=\"\r\n rolesAndPermissionsTableSupportMessage\r\n \"\r\n [verticalColumnHeaderNumber]=\"permissionsColumnClassNumber\"\r\n (paginationChange)=\"onTablePaginationChange($event)\"\r\n (tableColumnMenuActionClick)=\"onRoleMenuClick($event)\"\r\n (tableColumnMenuToggleButton)=\"selectedRoleMenuElement($event)\"\r\n ></ieeesa-data-table>\r\n </ng-container>\r\n </ieeesa-accordion>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"accordionDetails.GROUP_TYPES\">\r\n <ieeesa-accordion\r\n [accordionInfo]=\"accordionInfo\"\r\n class=\"ieeesa-view-tenant-info__group-types\"\r\n (accordionOpened)=\"showTenantDetails(accordionInfo, $event)\"\r\n >\r\n <div\r\n actions\r\n *ngIf=\"isGroupTypesExpanded\"\r\n class=\"d-flex gap-3\"\r\n [ngClass]=\"\r\n isMobileView ? 'mb-3 px-4' : 'ieeesa-view-tenant-info__actions'\r\n \"\r\n >\r\n <button\r\n mat-button\r\n class=\"mat-tertiary-button p-2\"\r\n *ngIf=\"validateAccess(permissionType.MANAGE_TENANT)\"\r\n (click)=\"openCreateGroupTypeForm()\"\r\n >\r\n {{ constants.viewGroupTypes.actionButtonLabels.addGroupType }}\r\n </button>\r\n </div>\r\n <ng-container component *ngIf=\"isGroupTypesExpanded\">\r\n <ieeesa-view-tenant-group-types></ieeesa-view-tenant-group-types>\r\n </ng-container>\r\n </ieeesa-accordion>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ieeesa-accordion\r\n [accordionInfo]=\"accordionInfo\"\r\n (accordionOpened)=\"showTenantDetails(accordionInfo, $event)\"\r\n ></ieeesa-accordion>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n</div>\r\n", styles: [".ieeesa-subtitle{text-align:left;font-family:Calibri Regular;font-size:1.5625rem;letter-spacing:0;color:#000;opacity:1}.ieeesa-body{text-align:left;font-family:Calibri Regular;font-size:1.25rem;letter-spacing:0;color:#000;opacity:1}.ieeesa-display-lg-57{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:3.5625rem;line-height:64px;color:#000;letter-spacing:0}.ieeesa-display-md-45{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.813rem;line-height:52px;color:#000;letter-spacing:0}.ieeesa-display-md-47{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.9375rem;line-height:52px;color:#000;letter-spacing:0}.ieeesa-display-sm-38{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.375rem;line-height:44px;color:#000;letter-spacing:0}.ieeesa-headline-lg-32{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2rem;line-height:40px;color:#000;letter-spacing:0}.ieeesa-headline-lg-34{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:2.125rem;line-height:40px;color:#000;letter-spacing:0}.ieeesa-headline-md-30{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.875rem;line-height:36px;color:#000;letter-spacing:0}.ieeesa-headline-sm-24{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.5rem;line-height:32px;color:#00629b;letter-spacing:0}.ieeesa-headline-sm-26{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.625rem;line-height:32px;color:#000;letter-spacing:0}.ieeesa-title-lg-bold-24{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:0}.ieeesa-title-lg-24{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.5rem;line-height:28px;color:#000;letter-spacing:0}.ieeesa-title-md-18{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.009375em}.ieeesa-title-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-title-sm-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-label-lg-bold-16{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-label-lg-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.ieeesa-btn-label-lg-bold-16{font-family:Calibri Regular;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#00629b;letter-spacing:.00625em}.ieeesa-label-md-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.03125em}.ieeesa-label-sm-13{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.8125rem;line-height:16px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-bold-16{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-bold-18{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-lg-18{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1.125rem;line-height:24px;color:#000;letter-spacing:.03125em}.ieeesa-body-md-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:20px;color:#1c1b1f;letter-spacing:.015625em}.ieeesa-body-md-16{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:20px;color:#000;letter-spacing:.015625em}.ieeesa-body-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-body-sm-12{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.75rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-body-color-sm-14{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:.875rem;line-height:18px;color:#49454f;letter-spacing:.025em}.ieeesa-body-sm-bold-14{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:.875rem;line-height:16px;color:#000;letter-spacing:.025em}.ieeesa-title-inter-lg-bold-24{font-family:Inter Bold;font-style:normal;font-weight:700;font-size:1.5rem;line-height:29px;color:#000;letter-spacing:0}.mat-mdc-button.mat-mdc-button-base.mat-primary-button,.mat-mdc-button.mat-mdc-button-base.mat-secondary-button,.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button,.mat-mdc-button.mat-mdc-button-base.mat-text-button{min-width:103px;width:auto;min-height:40px;height:auto;border-radius:3px;text-align:center;padding:.625em 1.5em;border:none;font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#000;letter-spacing:.00625em}.mat-mdc-button.mat-mdc-button-base>.mat-icon{margin-right:11px}.mat-mdc-button.mat-mdc-button-base.mat-primary-button{background-color:#00629b;color:#fff}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:focus{background:#1f75a7}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:hover{background-color:#003e65}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:active{background-color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-primary-button:disabled{background-color:#1c1b1f1f}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button{color:#fff;background:#a7a8aa;box-shadow:0 1px 2px #0000004d,0 2px 6px 2px #00000026}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:hover{background:#a7a8aa}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:focus{background:#f0f5f9}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:active{background:#1d192b1f}.mat-mdc-button.mat-mdc-button-base.mat-secondary-button:disabled{background:#1c1b1f1f;color:#1c1b1f;opacity:.38}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button{background-color:#fff;border:1px solid #00629b;color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:hover{background-color:#6750a414}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:focus{background-color:#f0f5f9}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:active{background:#6750a41f}.mat-mdc-button.mat-mdc-button-base.mat-tertiary-button:disabled{border:1px solid rgba(28,27,31,.12);color:#1c1b1f;opacity:.38}.mat-mdc-button.mat-mdc-button-base.mat-text-button{color:#00629b}.mat-mdc-button.mat-mdc-button-base.mat-text-button:hover,.mat-mdc-button.mat-mdc-button-base.mat-text-button:active{background:#6750a414}.mat-mdc-button.mat-mdc-button-base.mat-text-button:disabled{color:#1c1b1f;opacity:.38}.ieeesa-text-button{color:#cac4d0;background:none;border:none}.ieeesa-view-more-or-less-button{border:none;background:none;text-decoration:underline;color:#00629b}.flex-align-center{display:flex;align-items:center;justify-content:center}.mat-button-toggle-checked{background-color:#a7a8aa}.mat-button-toggle-checked .mat-button-toggle-label-content:before{font-family:\"Font Awesome 5 Free\";font-weight:900;content:\"\\f00c\";padding-right:.5625em}.mat-button-toggle-group .mat-button-toggle-label-content{font-family:Calibri Bold;font-style:normal;font-weight:700;font-size:1rem;line-height:20px;color:#1c1b1f;letter-spacing:.00625em}.no-bg-color-btn{color:#00629b;border-radius:3px;border:1px solid #00629b;min-height:40px;height:auto}@media (max-width: 768px){.mat-button-toggle-group .mat-button-toggle-label-content{max-width:8ch;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;position:relative}}.cdk-overlay-pane .mat-mdc-tooltip .mdc-tooltip__surface{color:#525252;padding:6px 12px;font-family:Calibri Regular;font-size:1rem;border:1px solid #cac4d0;background:#fff;box-shadow:0 4px 8px #00000040;max-width:unset!important}.cdk-overlay-pane .mat-mdc-option .mdc-list-item__primary-text{font-family:Calibri Regular!important}.cdk-overlay-pane.ieeesa-modal-confirm-dialog,.cdk-overlay-pane.ieeesa-modal-dialog,.cdk-overlay-pane.ieeesa-alert-dialog{width:100%;min-width:312px}.mat-mdc-form-field{font-family:Calibri Regular;font-style:normal;font-weight:400;font-size:1rem;line-height:24px;color:#49454f;letter-spacing:.03125em}.ieeesa-cancel-modal-confirm-dialog{width:25vw!important}.ieeesa-cancel-modal-confirm-dialog .ieeesa-confirmation{padding:1.5em 1.5em 1em}.ieeesa-cancel-modal-confirm-dialog .ieeesa-confirmation .mat-mdc-dialog-content{text-align:center;padding:0 0 1em!important}.mat-mdc-button,.mat-mdc-outlined-button{--mat-mdc-button-persistent-ripple-color: unset}@media (max-width: 768px){.ieeesa-cancel-modal-confirm-dialog{width:90vw!important}}.ieeesa-wrapper-border{border:1px solid #b2b7be;border-top:none;padding:1.5em;border-radius:0 0 4px 4px}.ieeesa-view-tenant-info{background-color:#f2f2f2}.ieeesa-view-tenant-info--bg-white{background-color:#fff;padding:1em 1.5em 0}.ieeesa-view-tenant-info__actions{top:15px;margin-right:20px;position:absolute;right:0}.ieeesa-view-tenant-info--title,.ieeesa-view-tenant-info--action{padding:.75em 0}.ieeesa-view-tenant-info--link{padding:1em .75em 1.3em 0!important}.ieeesa-view-tenant-info--link-mobile{max-width:-moz-fit-content;max-width:fit-content}.ieeesa-view-tenant-info--app-id,.ieeesa-view-tenant-info--app-status{color:#49454f}.ieeesa-view-tenant-info__accordion{background-color:#fff;box-shadow:0 1px 4px #00000040,0 4px #00b5e2 inset;padding:1.5em .75em}.ieeesa-view-tenant-info__accordion--bg-white{background-color:#fff;box-shadow:none}.ieeesa-view-tenant-info__accordion--info{padding:1em 1em 1.5em}.ieeesa-view-tenant-info__accordion-info .mat-accordion .mat-expansion-panel-spacing.mat-expanded{position:relative}.ieeesa-view-tenant-info__accordion-info .mat-accordion .mat-expansion-panel-body{padding:1.5em 1.5em 1.5em 2.25em}.ieeesa-view-tenant-info__accordion-info .ieeesa-button{position:absolute;top:1.25em;right:0}.ieeesa-view-tenant-info__accordion-info .ieeesa-button svg{width:1.3em!important;height:1.3em!important}.ieeesa-view-tenant-info .mat-divider-vertical{margin:0;height:1.4em;color:#cac4d0;width:.063em;border-right-color:#cac4d0}.ieeesa-view-tenant-info .ieeesa-slide-toggle-field .mat-mdc-slide-toggle .mdc-label{color:#000!important}.ieeesa-view-tenant-info__roles-and-permissions .ieeesa-accordion .mat-accordion .mat-expansion-panel-spacing.mat-expanded{position:relative}.ieeesa-view-tenant-info__roles-and-permissions__divider{margin-top:12px!important;margin-bottom:16px!important;border-top:1px solid #ccd2da!important}.ieeesa-view-tenant-info__roles-and-permissions .mat-mdc-header-cell{white-space:nowrap}.ieeesa-view-tenant-info__roles-and-permissions .mat-expansion-panel-body,.ieeesa-view-tenant-info__roles-and-permissions .ieeesa-data-table{padding-left:0;padding-right:0}.ieeesa-view-tenant-info__roles-and-permissions .ieeesa-data-table .mat-column-permissions{min-width:12.5em;padding:16px!important}.ieeesa-view-tenant-info__roles-and-permissions .ieeesa-data-table__content{margin-top:0!important}.ieeesa-view-tenant-info__roles-and-permissions .ieeesa-data-table__column-menu .mat-mdc-icon-button.mat-mdc-button-base{padding:6px;width:24px;height:24px}.ieeesa-view-tenant-info__roles-and-permissions .ieeesa-data-table__columns-header-text{padding:8px 16px;background:#dae9f1;box-shadow:0 1px #dce3e9 inset}.ieeesa-view-tenant-info__roles-and-permissions .mat-mdc-paginator-container{padding:0;flex-wrap:nowrap}.ieeesa-view-tenant-info__roles-and-permissions .mdc-notched-outline__trailing,.ieeesa-view-tenant-info__roles-and-permissions .mdc-notched-outline__notch,.ieeesa-view-tenant-info__roles-and-permissions .mdc-notched-outline__leading{border:none!important}.ieeesa-view-tenant-info__roles-and-permissions .mat-mdc-paginator-page-size,.ieeesa-view-tenant-info__roles-and-permissions .mat-mdc-paginator-page-size-label,.ieeesa-view-tenant-info__roles-and-permissions .mat-mdc-paginator-page-size-select,.ieeesa-view-tenant-info__roles-and-permissions .mat-mdc-paginator-range-label{margin:0}.ieeesa-view-tenant-info__roles-and-permissions .at-mdc-select-min-line,.ieeesa-view-tenant-info__roles-and-permissions .mat-mdc-paginator-range-label{color:#1c1d1e}.ieeesa-view-tenant-info__roles-and-permissions .mat-mdc-paginator-page-size-label{position:relative;color:#63666a;left:2em}.ieeesa-view-tenant-info__group-types .ieeesa-accordion .mat-accordion .mat-expansion-panel-spacing.mat-expanded{position:relative}.ieeesa-view-tenant-info__group-types .mat-mdc-header-cell{white-space:nowrap}.ieeesa-view-tenant-info__group-types .mat-expansion-panel-body,.ieeesa-view-tenant-info__group-types .ieeesa-data-table{padding-left:0;padding-right:0}.ieeesa-menu__item:not(:last-of-type){margin-bottom:0!important}.ieeesa-menu .mat-mdc-menu-item{min-height:35px!important}\n"] }]
726
+ }], ctorParameters: function () { return [{ type: i1.MatDialog }, { type: i2.BreakpointObserverService }, { type: i3.TenantApplicationsService }, { type: i4.GlobalErrorHandlerService }, { type: i5.SharedService }, { type: i6.ActivatedRoute }]; }, propDecorators: { apiBaseURL: [{
727
+ type: Input
728
+ }], userPermissions: [{
729
+ type: Input
730
+ }], routePaths: [{
731
+ type: Input
732
+ }] } });
733
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlldy10ZW5hbnQtZGV0YWlscy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90ZW5hbnRzL3NyYy9saWIvY29tcG9uZW50cy92aWV3LXRlbmFudC1kZXRhaWxzL3ZpZXctdGVuYW50LWRldGFpbHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGVuYW50cy9zcmMvbGliL2NvbXBvbmVudHMvdmlldy10ZW5hbnQtZGV0YWlscy92aWV3LXRlbmFudC1kZXRhaWxzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUdMLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxRCxPQUFPLEVBRUwsY0FBYyxFQUdkLG9CQUFvQixFQUVwQixTQUFTLEVBQ1QsMEJBQTBCLEVBQzFCLG1CQUFtQixFQUtuQixlQUFlLEVBQ2Ysa0JBQWtCLEVBQ2xCLGdCQUFnQixFQUNoQixrQkFBa0IsRUFHbkIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUMsT0FBTyxLQUFLLFVBQVUsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRCxPQUFPLEVBQTBCLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBYTdELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzdFLE9B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QWUsNFFBQ2Ysa0JBQWtCLHdoREFDbEIsNkJBQTZCOzs0RkFNcEIsMEJBQTBCO2tCQXBCdEMsU0FBUzsrQkFFRSw0QkFBNEIsY0FDMUIsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osWUFBWTt3QkFDWixvQkFBb0I7d0JBQ3BCLGtCQUFrQjt3QkFDbEIsZ0JBQWdCO3dCQUNoQiwyQkFBMkI7d0JBQzNCLG1CQUFtQjt3QkFDbkIsZUFBZTt3QkFDZixrQkFBa0I7d0JBQ2xCLDZCQUE2QjtxQkFDOUIsaUJBR2MsaUJBQWlCLENBQUMsSUFBSTtpUkFJNUIsVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBHbG9iYWxFcnJvckhhbmRsZXJTZXJ2aWNlIH0gZnJvbSAnQGllZWVzYS1ucG0vdXRpbGl0eSc7XHJcbmltcG9ydCB7IEFsZXJ0VHlwZSwgTW9kYWxUeXBlIH0gZnJvbSAnQGllZWVzYS1ucG0vbW9kZWxzJztcclxuaW1wb3J0IHtcclxuICBBY2NvcmRpb25JbmZvLFxyXG4gIE1vZGFsQ29tcG9uZW50LFxyXG4gIE1lbnUsXHJcbiAgUGFnaW5hdG9yQ29uZmlnLFxyXG4gIFNsaWRlVG9nZ2xlQ29tcG9uZW50LFxyXG4gIFRhYmxlQWN0aW9ucyxcclxuICBBbGlnblR5cGUsXHJcbiAgTW9kYWxDb25maXJtYXRpb25Db21wb25lbnQsXHJcbiAgSWNvbkJ1dHRvbkNvbXBvbmVudCxcclxuICBSYWRpb09wdGlvbixcclxuICBJY29uQnV0dG9uLFxyXG4gIFNsaWRlVG9nZ2xlT3B0aW9uLFxyXG4gIFRhYmxlQ29sdW1uU2NoZW1hLFxyXG4gIFRhYmxlQ29sdW1uVHlwZSxcclxuICBBY2NvcmRpb25Db21wb25lbnQsXHJcbiAgQWNjb3JkaW9uRGV0YWlscyxcclxuICBEYXRhVGFibGVDb21wb25lbnQsXHJcbiAgVGFibGVDb2x1bW5NZW51SW5mbyxcclxuICBCcmVha3BvaW50T2JzZXJ2ZXJTZXJ2aWNlXHJcbn0gZnJvbSAnQGllZWVzYS1ucG0vcHJlc2VudGF0aW9uJztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCAqIGFzIHNjcmVlblRleHQgZnJvbSAnLi4vLi4vYXNzZXRzL2NvbnN0YW50cy5qc29uJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFBhcmFtcywgUm91dGVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgTWF0RGl2aWRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpdmlkZXInO1xyXG5pbXBvcnQgeyBUZW5hbnRBcHBsaWNhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGVuYW50LWFwcGxpY2F0aW9ucy5zZXJ2aWNlJztcclxuaW1wb3J0IHtcclxuICBUZW5hbnRzUGVybWlzc2lvbnMsXHJcbiAgVXNlclBlcm1pc3Npb24sXHJcbn0gZnJvbSAnLi4vLi4vbW9kZWxzL3RlbmFudHMtcGVybWlzc2lvbi5tb2RlbCc7XHJcbmltcG9ydCB7IFNoYXJlZFNlcnZpY2UgfSBmcm9tICdAaWVlZXNhLW5wbS9zaGFyZWQnO1xyXG5pbXBvcnQgeyBUZW5hbnRzUm91dGVzQ29uZmlnIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3JvdXRlLWNvbmZpZy5tb2RlbCc7XHJcbmltcG9ydCB7IEZlYXR1cmVzIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2ZlYXR1cmVzLm1vZGVsJztcclxuaW1wb3J0IHtcclxuICBUZW5hbnRCYXNpY0luZm8sXHJcbiAgVGVuYW50RGV0YWlsc1Jlc3BvbnNlLFxyXG59IGZyb20gJy4uLy4uL21vZGVscy90ZW5hbnQubW9kZWwnO1xyXG5pbXBvcnQgeyBUZW5hbnRGdW5jdGlvblR5cGUgfSBmcm9tICcuLi8uLi9tb2RlbHMvdGVuYW50LWZ1bmN0aW9uLXR5cGUubW9kZWwnO1xyXG5pbXBvcnQgeyBDcmVhdGVUZW5hbnRBcHBsaWNhdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL2NyZWF0ZS10ZW5hbnQtYXBwbGljYXRpb24vY3JlYXRlLXRlbmFudC1hcHBsaWNhdGlvbi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBQYWdlRXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xyXG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQge1xyXG4gIFVwZGF0ZVRlbmFudFN0YXR1c1JlcXVlc3RQYXlsb2FkLFxyXG4gIFVwZGF0ZVRlbmFudFN0YXR1c1Jlc3BvbnNlLFxyXG59IGZyb20gJy4uLy4uL21vZGVscy91cGRhdGUtdGVuYW50LXN0YXR1cy5tb2RlbCc7XHJcbmltcG9ydCB7IEZlYXR1cmVQZXJtaXNzaW9uSWQgfSBmcm9tICcuLi8uLi9tb2RlbHMvZmVhdHVyZS1wZXJtaXNzaW9uLWlkLm1vZGVsJztcclxuaW1wb3J0IHtcclxuICBBcHBUeXBlQ29uZmlnLFxyXG4gIEdldEFwcFR5cGVzUmVzcG9uc2UsXHJcbn0gZnJvbSAnLi4vLi4vbW9kZWxzL2FwcC10eXBlLWNvbmZpZy5tb2RlbCc7XHJcbmltcG9ydCB7IFRlbmFudEJhc2ljRGV0YWlsc0NvbXBvbmVudCB9IGZyb20gJy4uL3RlbmFudC1iYXNpYy1kZXRhaWxzL3RlbmFudC1iYXNpYy1kZXRhaWxzLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7XHJcbiAgR2V0Um9sZXNBbmRQZXJtaXNzaW9uc1BheWxvYWQsXHJcbiAgR2V0Um9sZXNBbmRQZXJtaXNzaW9uc1Jlc3BvbnNlLFxyXG4gIEdldFJvbGVzUmVzcG9uc2UsXHJcbiAgUm9sZSxcclxuICBSb2xlc0FuZFBlcm1pc3Npb25zTWFwcGluZyxcclxuICBSb2xlc0FuZFBlcm1pc3Npb25zLFxyXG4gIERlbGV0ZVJvbGVSZXF1ZXN0UGF5bG9hZCxcclxuICBEZWxldGVSb2xlUmVzcG9uc2UsXHJcbiAgUGFnaW5hdGlvbkluZm8sXHJcbiAgUm9sZURldGFpbHMsXHJcbn0gZnJvbSAnLi4vLi4vbW9kZWxzL3JvbGVzLWFuZC1wZXJtaXNzaW9ucy5tb2RlbCc7XHJcbmltcG9ydCB7IFBlcm1pc3Npb25UeXBlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3Blcm1pc3Npb24tdHlwZS5tb2RlbCc7XHJcbmltcG9ydCB7IENyZWF0ZU1vZGlmeVJvbGVDb21wb25lbnQgfSBmcm9tICcuLi9jcmVhdGUtbW9kaWZ5LXJvbGUvY3JlYXRlLW1vZGlmeS1yb2xlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFJvbGVNZW51QWN0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3JvbGUtbWVudS1hY3Rpb24ubW9kZWwnO1xyXG5pbXBvcnQgeyBSb2xlc0FuZFBlcm1pc3Npb25zTWFwcGluZ0NvbXBvbmVudCB9IGZyb20gJy4uL3JvbGVzLWFuZC1wZXJtaXNzaW9ucy1tYXBwaW5nL3JvbGVzLWFuZC1wZXJtaXNzaW9ucy1tYXBwaW5nLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFZpZXdUZW5hbnRHcm91cFR5cGVzQ29tcG9uZW50IH0gZnJvbSAnLi4vdmlldy10ZW5hbnQtZ3JvdXAtdHlwZXMvdmlldy10ZW5hbnQtZ3JvdXAtdHlwZXMuY29tcG9uZW50JztcclxuaW1wb3J0IHtcclxuICBHZXRSb2xlVHlwZXNQYXlsb2FkLFxyXG4gIFJvbGVUeXBlQ29uZmlndXJhdGlvbixcclxuICBSb2xlVHlwZU9wdGlvbixcclxuICBSb2xlVHlwZVJlc3BvbnNlLFxyXG59IGZyb20gJy4uLy4uL21vZGVscy9yb2xlLXR5cGUubW9kZWwnO1xyXG5pbXBvcnQgeyBDcmVhdGVNb2RpZnlHcm91cFR5cGVDb21wb25lbnQgfSBmcm9tICcuLi9jcmVhdGUtbW9kaWZ5LWdyb3VwLXR5cGUvY3JlYXRlLW1vZGlmeS1ncm91cC10eXBlLmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxyXG4gIHNlbGVjdG9yOiAnaWVlZXNhLXZpZXctdGVuYW50LWRldGFpbHMnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgUm91dGVyTW9kdWxlLFxyXG4gICAgU2xpZGVUb2dnbGVDb21wb25lbnQsXHJcbiAgICBBY2NvcmRpb25Db21wb25lbnQsXHJcbiAgICBNYXREaXZpZGVyTW9kdWxlLFxyXG4gICAgVGVuYW50QmFzaWNEZXRhaWxzQ29tcG9uZW50LFxyXG4gICAgSWNvbkJ1dHRvbkNvbXBvbmVudCxcclxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcclxuICAgIERhdGFUYWJsZUNvbXBvbmVudCxcclxuICAgIFZpZXdUZW5hbnRHcm91cFR5cGVzQ29tcG9uZW50LFxyXG4gIF0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3ZpZXctdGVuYW50LWRldGFpbHMuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3ZpZXctdGVuYW50LWRldGFpbHMuY29tcG9uZW50LnNjc3MnXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVmlld1RlbmFudERldGFpbHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgZGVzdHJveSQ6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG4gIEBJbnB1dCgpIGFwaUJhc2VVUkwhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgdXNlclBlcm1pc3Npb25zITogVXNlclBlcm1pc3Npb25bXTtcclxuICBASW5wdXQoKSByb3V0ZVBhdGhzITogVGVuYW50c1JvdXRlc0NvbmZpZztcclxuICBpc01vYmlsZVZpZXcgPSBmYWxzZTtcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIGNvbnN0YW50czogYW55ID0gc2NyZWVuVGV4dDtcclxuICB0ZW5hbnRMYWJlbHMgPSB0aGlzLmNvbnN0YW50cz8udmlld1RlbmFudHM/LmxhYmVsO1xyXG4gIHNsaWRlVG9nZ2xlT3B0aW9uID0ge1xyXG4gICAgaWQ6IDEsXHJcbiAgICBsYWJlbDogdGhpcy5jb25zdGFudHM/LnZpZXdUZW5hbnRzPy5sYWJlbD8uYWN0aXZlLFxyXG4gICAgY2hlY2tlZDogdHJ1ZSxcclxuICAgIGRpc2FibGVkOiBmYWxzZSxcclxuICB9O1xyXG4gIGVkaXRCdXR0b246IEljb25CdXR0b24gPSB0aGlzLmNvbnN0YW50cz8udmlld1RlbmFudHM/LmJ1dHRvbnM7XHJcbiAgdGVuYW50RGV0YWlscyE6IFRlbmFudEJhc2ljSW5mbztcclxuICBhY2NvcmRpb25JbmZvTGlzdDogQWNjb3JkaW9uSW5mb1tdID0gSlNPTi5wYXJzZShcclxuICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuY29uc3RhbnRzPy52aWV3VGVuYW50cz8udGVuYW50QWNjb3JkaW9uSW5mbylcclxuICApO1xyXG4gIGFwcElkID0gJyc7XHJcbiAgaWNvblNpemUgPSB0aGlzLmNvbnN0YW50cz8udmlld1JvbGVzQW5kUGVybWlzc2lvbnM/LmNvbHVtbkFjdGlvbkljb25TaXplO1xyXG4gIHJvbGVzQW5kUGVybWlzc2lvbnNUYWJsZUNhcHRpb24gPVxyXG4gICAgdGhpcy5jb25zdGFudHM/LnZpZXdSb2xlc0FuZFBlcm1pc3Npb25zPy50YWJsZUNhcHRpb247XHJcbiAgcm9sZXNBbmRQZXJtaXNzaW9uc1RhYmxlSGVhZGVyTmFtZSA9XHJcbiAgICB0aGlzLmNvbnN0YW50cz8udmlld1JvbGVzQW5kUGVybWlzc2lvbnM/LnRhYmxlQ29sdW1uc0hlYWRlclRleHQ7XHJcbiAgcm9sZXNBbmRQZXJtaXNzaW9uc1RhYmxlU3VwcG9ydE1lc3NhZ2UgPVxyXG4gICAgdGhpcy5jb25zdGFudHM/LnZpZXdSb2xlc0FuZFBlcm1pc3Npb25zPy5zY3JvbGxiYXJTdXBwb3J0TWVzc2FnZTtcclxuICBwZXJtaXNzaW9uc0NvbHVtbkNsYXNzTnVtYmVyID0gMTtcclxuICBtZW51SXRlbXM6IE1lbnVbXSA9XHJcbiAgICB0aGlzLmNvbnN0YW50cz8udmlld1JvbGVzQW5kUGVybWlzc2lvbnM/LmNvbHVtbkFjdGlvbk1lbnVJdGVtcztcclxuICBjb2x1bW5TY2hlbWE6IFRhYmxlQ29sdW1uU2NoZW1hW10gPSBbXTtcclxuICB0YWJsZURhdGE6IFJvbGVzQW5kUGVybWlzc2lvbnNbXSA9IFtdO1xyXG4gIGlzUm9sZXNBbmRQZXJtaXNzaW9uc0V4cGFuZGVkID0gZmFsc2U7XHJcbiAgcGFnaW5hdG9yQ29uZmlnOiBQYWdpbmF0b3JDb25maWcgPSB7XHJcbiAgICByZWNvcmRzUGVyUGFnZTogdGhpcy5jb25zdGFudHM/LnZpZXdSb2xlc0FuZFBlcm1pc3Npb25zPy5wYWdlU2l6ZU9wdGlvbnNbMF0sXHJcbiAgICBwYWdlU2l6ZU9wdGlvbnM6IHRoaXMuY29uc3RhbnRzPy52aWV3Um9sZXNBbmRQZXJtaXNzaW9ucz8ucGFnZVNpemVPcHRpb25zLFxyXG4gICAgdG90YWxSZWNvcmRzOiAwLFxyXG4gIH07XHJcbiAgdGFibGVQYWdpbmF0aW9uITogUGFnaW5hdGlvbkluZm87XHJcbiAgcm9sZXNBbmRQZXJtaXNzaW9uc0NsYXNzTmFtZSA9XHJcbiAgICAnLmllZWVzYS12aWV3LXRlbmFudC1pbmZvX19yb2xlcy1hbmQtcGVybWlzc2lvbnMnO1xyXG4gIGhlYWRlckVsZW1lbnRDbGFzc05hbWUgPSAnLmllZWVzYS1oZWFkZXInO1xyXG4gIHRhYmxlQWN0aW9uczogVGFibGVBY3Rpb25zID0ge1xyXG4gICAgaXNQYWdpbmF0aW9uTmVlZGVkOiB0cnVlLFxyXG4gIH07XHJcbiAgdmlld1RlbmFudHNSb3V0ZVVybCE6IHN0cmluZztcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIGRpYWxvZ1JlZjogYW55O1xyXG4gIGFjY29yZGlvbkRldGFpbHMgPSBBY2NvcmRpb25EZXRhaWxzO1xyXG4gIGFwcFR5cGVPcHRpb25zITogUmFkaW9PcHRpb25bXTtcclxuICBpc0Jhc2ljRGV0YWlsc0V4cGFuZGVkID0gZmFsc2U7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBjcmVhdGVHcm91cFR5cGVTY3JlZW5UZXh0czogYW55ID0gdGhpcy5jb25zdGFudHM/LmNyZWF0ZUdyb3VwVHlwZTtcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gIGVkaXRUZW5hbnRTY3JlZW5UZXh0czogYW55ID0gdGhpcy5jb25zdGFudHM/LmVkaXRUZW5hbnQ7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBkZWxldGVSb2xlU2NyZWVuVGV4dHM6IGFueSA9IHRoaXMuY29uc3RhbnRzPy5kZWxldGVSb2xlO1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgbWFwUm9sZXNBbmRQZXJtaXNzaW9uc1NjcmVlblRleHRzOiBhbnkgPVxyXG4gICAgdGhpcy5jb25zdGFudHM/Lm1hcFJvbGVzQW5kUGVybWlzc2lvbnM7XHJcbiAgYWxpZ25tZW50VHlwZSA9IEFsaWduVHlwZTtcclxuICB1c2VyVGVuYW50c1Blcm1pc3Npb25zITogVGVuYW50c1Blcm1pc3Npb25zW107XHJcbiAgcGVybWlzc2lvblR5cGUgPSBQZXJtaXNzaW9uVHlwZTtcclxuICBmdW5jdGlvblR5cGUhOiBUZW5hbnRGdW5jdGlvblR5cGU7XHJcbiAgY3JlYXRlUm9sZVNjcmVlblRleHRzID0gdGhpcy5jb25zdGFudHM/LmNyZWF0ZVJvbGU7XHJcbiAgcm9sZU1lbnVFbGVtZW50ITogSFRNTEVsZW1lbnQ7XHJcbiAgc2VsZWN0ZWRSb2xlSW5mbzogUm9sZURldGFpbHMgPSB7XHJcbiAgICByb2xlSWQ6ICcnLFxyXG4gICAgcm9sZU5hbWU6ICcnLFxyXG4gIH07XHJcbiAgaXNHcm91cFR5cGVzRXhwYW5kZWQgPSBmYWxzZTtcclxuICByb2xlVHlwZU9wdGlvbnM6IFJvbGVUeXBlT3B0aW9uW10gPSBbXTtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gICAgcHVibGljIGRpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXHJcbiAgICBwcml2YXRlIGJyZWFrcG9pbnRPYnNlcnZlclNlcnZpY2U6IEJyZWFrcG9pbnRPYnNlcnZlclNlcnZpY2UsXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuICAgIHByaXZhdGUgdGVuYW50QXBwU2VydmljZTogVGVuYW50QXBwbGljYXRpb25zU2VydmljZSxcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gICAgcHVibGljIGdsb2JhbEVycm9ySGFuZGxlclNlcnZpY2U6IEdsb2JhbEVycm9ySGFuZGxlclNlcnZpY2UsXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcclxuICAgIHByaXZhdGUgc2hhcmVkU2VydmljZTogU2hhcmVkU2VydmljZSxcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGVcclxuICApIHtcclxuICAgIHRoaXMuYnJlYWtwb2ludE9ic2VydmVyU2VydmljZVxyXG4gICAgICAuZ2V0QnJlYWtwb2ludCgpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgocmVzdWx0OiB7IG1hdGNoZXM6IGJvb2xlYW4gfSkgPT4ge1xyXG4gICAgICAgIHRoaXMuaXNNb2JpbGVWaWV3ID0gcmVzdWx0Py5tYXRjaGVzO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluaXRpYWxpemVzIHZpZXcgdGVuYW50IGRldGFpbHMgY29tcG9uZW50LlxyXG4gICAqIEByZXR1cm4gLXJldHVybnMgbm90aGluZ1xyXG4gICAqIEBtZW1iZXJvZiBWaWV3VGVuYW50RGV0YWlsc0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy50ZW5hbnREZXRhaWxzID1cclxuICAgICAgdGhpcy50ZW5hbnRBcHBTZXJ2aWNlPy5nZXRTZWxlY3RlZFRlbmFudEluZm9ybWF0aW9uKCkgYXMgVGVuYW50QmFzaWNJbmZvO1xyXG4gICAgdGhpcy5zbGlkZVRvZ2dsZU9wdGlvbi5jaGVja2VkID0gdGhpcy50ZW5hbnREZXRhaWxzPy5zdGF0dXMgYXMgYm9vbGVhbjtcclxuICAgIHRoaXMuc2xpZGVUb2dnbGVPcHRpb24ubGFiZWwgPSB0aGlzLnRlbmFudERldGFpbHM/LnN0YXR1c1xyXG4gICAgICA/IHRoaXMudGVuYW50TGFiZWxzPy5hY3RpdmVcclxuICAgICAgOiB0aGlzLnRlbmFudExhYmVscz8uaW5hY3RpdmU7XHJcbiAgICB0aGlzLnJvdXRlUGF0aHMgPSB0aGlzLnJvdXRlUGF0aHMgPz8gdGhpcy5jb25zdGFudHM/LnJvdXRlQ29uZmlnUGF0aDtcclxuICAgIHRoaXMudmlld1RlbmFudHNSb3V0ZVVybCA9IGAvJHt0aGlzLnJvdXRlUGF0aHM/LnZpZXdUZW5hbnRzfWA7XHJcbiAgICB0aGlzLnRlbmFudEFwcFNlcnZpY2U/LnNldEFwcENvbmZpZyh0aGlzLmFwaUJhc2VVUkwsIHRoaXMudXNlclBlcm1pc3Npb25zKTtcclxuICAgIHRoaXMudXNlclRlbmFudHNQZXJtaXNzaW9ucyA9IHRoaXMudGVuYW50QXBwU2VydmljZT8uZmlsdGVyUGVybWlzc2lvbihcclxuICAgICAgdGhpcy51c2VyUGVybWlzc2lvbnNcclxuICAgICk7XHJcbiAgICB0aGlzLmFwcElkID0gdGhpcy50ZW5hbnRBcHBTZXJ2aWNlLmdldFNlbGVjdGVkVGVuYW50SW5mb3JtYXRpb24oKVxyXG4gICAgICA/LmFwcElkIGFzIHN0cmluZztcclxuICAgIHRoaXMudGFibGVQYWdpbmF0aW9uID0ge1xyXG4gICAgICBvZmZzZXQ6IDAsXHJcbiAgICAgIHBhZ2VTaXplOiB0aGlzLnBhZ2luYXRvckNvbmZpZy5wYWdlU2l6ZU9wdGlvbnNbMF0sXHJcbiAgICB9O1xyXG4gICAgdGhpcy5nZXRBcHBsaWNhdGlvblR5cGVzKCk7XHJcbiAgICB0aGlzLmFjdGl2YXRlZFJvdXRlPy5xdWVyeVBhcmFtc1xyXG4gICAgICA/LnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICA/LnN1YnNjcmliZSgocGFyYW1zOiBQYXJhbXMpID0+IHtcclxuICAgICAgICB0aGlzLmFwcElkID0gcGFyYW1zWydpZCddO1xyXG4gICAgICAgIHRoaXMuZ2V0VGVuYW50RGV0YWlscyh0aGlzLmFwcElkKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdldHMgdGhlIHNlbGVjdGVkIHRlbmFudCBkZXRhaWxzIGZyb20gc2VydmVyLlxyXG4gICAqIEBtZW1iZXJvZiBWaWV3VGVuYW50RGV0YWlsc0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIGdldFRlbmFudERldGFpbHMoYXBwSWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy50ZW5hbnRBcHBTZXJ2aWNlXHJcbiAgICAgIC5nZXRUZW5hbnREZXRhaWxzKGFwcElkKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXNwb25zZTogVGVuYW50RGV0YWlsc1Jlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzcG9uc2U/LnN0YXR1cykge1xyXG4gICAgICAgICAgICB0aGlzLnRlbmFudERldGFpbHMgPSByZXNwb25zZT8uYm9keSBhcyBUZW5hbnRCYXNpY0luZm87XHJcbiAgICAgICAgICAgIHRoaXMudGVuYW50QXBwU2VydmljZS5zZXRTZWxlY3RlZFRlbmFudEluZm9ybWF0aW9uKFxyXG4gICAgICAgICAgICAgIHRoaXMudGVuYW50RGV0YWlsc1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLnNsaWRlVG9nZ2xlT3B0aW9uLmNoZWNrZWQgPSB0aGlzLnRlbmFudERldGFpbHNcclxuICAgICAgICAgICAgICAuc3RhdHVzIGFzIGJvb2xlYW47XHJcbiAgICAgICAgICAgIHRoaXMuc2xpZGVUb2dnbGVPcHRpb24ubGFiZWwgPSB0aGlzLnRlbmFudERldGFpbHMuc3RhdHVzXHJcbiAgICAgICAgICAgICAgPyB0aGlzLnRlbmFudExhYmVscz8uYWN0aXZlXHJcbiAgICAgICAgICAgICAgOiB0aGlzLnRlbmFudExhYmVscz8uaW5hY3RpdmU7XHJcbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVzID0gdGhpcy50ZW5hbnREZXRhaWxzLmZlYXR1cmVzIGFzIEZlYXR1cmVzW107XHJcbiAgICAgICAgICAgIGZlYXR1cmVzLm1hcCgoZmVhdHVyZTogRmVhdHVyZXMpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICBmZWF0dXJlPy5mZWF0dXJlSWQgPT09XHJcbiAgICAgICAgICAgICAgICAgIEZlYXR1cmVQZXJtaXNzaW9uSWQuTUVFVElOR1NfQU5EX0VWRU5UUyB8fFxyXG4gICAgICAgICAgICAgICAgZmVhdHVyZT8uZmVhdHVyZUlkID09PSBGZWF0dXJlUGVybWlzc2lvbklkLkJBTExPVFNcclxuICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjY29yZGlvbkluZm9MaXN0LnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICBpZDogdGhpcy5hY2NvcmRpb25JbmZvTGlzdC5sZW5ndGggKyAxLFxyXG4gICAgICAgICAgICAgICAgICBpc0Rpc2FibGVkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgdGl0bGU6IGZlYXR1cmU/LmZlYXR1cmVOYW1lLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmhhbmRsZUVycm9ycyhcclxuICAgICAgICAgICAgZXJyb3IsXHJcbiAgICAgICAgICAgIHRoaXMuY29uc3RhbnRzPy52aWV3VGVuYW50cy5lcnJvcnNcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEaXNwbGF5IHRoZSBjb3JyZXNwb25kaW5nIHRlbmFudCBiYXNpYyBvciBmZWF0dXJlIGRldGFpbHMgYmFzZWQgb24gc2VsZWN0ZWQgYWNjb3JkaW9uLlxyXG4gICAqIEBwYXJhbSB7QWNjb3JkaW9uSW5mb30gYWNjb3JkaW9uSW5mb1xyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXhwYW5kZWRcclxuICAgKiBAbWVtYmVyb2YgVmlld1RlbmFudERldGFpbHNDb21wb25lbnRcclxuICAgKi9cclxuICBzaG93VGVuYW50RGV0YWlscyhhY2NvcmRpb25JbmZvOiBBY2NvcmRpb25JbmZvLCBleHBhbmRlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgY29uc3QgYWNjb3JkaW9uSWQgPSBhY2NvcmRpb25JbmZvLmlkIGFzIG51bWJlcjtcclxuICAgIHN3aXRjaCAoYWNjb3JkaW9uSWQpIHtcclxuICAgICAgY2FzZSAxOiB7XHJcbiAgICAgICAgdGhpcy5pc0Jhc2ljRGV0YWlsc0V4cGFuZGVkID0gZXhwYW5kZWQ7XHJcbiAgICAgICAgaWYgKGV4cGFuZGVkKSB7XHJcbiAgICAgICAgICB0aGlzLmdldEFwcGxpY2F0aW9uVHlwZXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSAyOiB7XHJcbiAgICAgICAgdGhpcy5pc1JvbGVzQW5kUGVybWlzc2lvbnNFeHBhbmRlZCA9IGV4cGFuZGVkO1xyXG4gICAgICAgIGlmIChleHBhbmRlZCkge1xyXG4gICAgICAgICAgdGhpcy5jb2x1bW5TY2hlbWEgPSBbXTtcclxuICAgICAgICAgIHRoaXMucGFnaW5hdG9yQ29uZmlnLnJlY29yZHNQZXJQYWdlID1cclxuICAgICAgICAgICAgdGhpcy5jb25zdGFudHM/LnZpZXdSb2xlc0FuZFBlcm1pc3Npb25zPy5wYWdlU2l6ZU9wdGlvbnNbMF07XHJcbiAgICAgICAgICB0aGlzLnRhYmxlUGFnaW5hdGlvbi5vZmZzZXQgPSAwO1xyXG4gICAgICAgICAgdGhpcy50YWJsZVBhZ2luYXRpb24ucGFnZVNpemUgPSB0aGlzLnBhZ2luYXRvckNvbmZpZy5yZWNvcmRzUGVyUGFnZTtcclxuICAgICAgICAgIHRoaXMuZ2V0Um9sZXNBbmRJbml0aWFsaXplVGFibGVTY2hlbWEoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgY2FzZSAzOiB7XHJcbiAgICAgICAgdGhpcy5pc0dyb3VwVHlwZXNFeHBhbmRlZCA9IGV4cGFuZGVkO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEZldGNoZXMgdGhlIGNvbmZpZ3VyZWQgcm9sZXMgb2YgdGhlIHNlbGVjdGVkIHRlbmFudCBhbmQgY3JlYXRlcyB0aGUgY29sdW1uIHNjaGVtYS5cclxuICAgKiBAbWVtYmVyb2YgVmlld1RlbmFudERldGFpbHNDb21wb25lbnRcclxuICAgKi9cclxuICBnZXRSb2xlc0FuZEluaXRpYWxpemVUYWJsZVNjaGVtYSgpOiB2b2lkIHtcclxuICAgIHRoaXMudGVuYW50QXBwU2VydmljZVxyXG4gICAgICAuZ2V0Um9sZXModGhpcy5hcHBJZClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzcG9uc2U6IEdldFJvbGVzUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIGlmIChyZXNwb25zZT8uc3RhdHVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Um9sZXNBbmRQZXJtaXNzaW9uc0FuZEluaXRpYWxpemVUYWJsZVZpZXcoe1xyXG4gICAgICAgICAgICAgIHBheWxvYWQ6IHtcclxuICAgICAgICAgICAgICAgIG9mZnNldDogdGhpcy50YWJsZVBhZ2luYXRpb24ub2Zmc2V0LFxyXG4gICAgICAgICAgICAgICAgcGFnZVNpemU6IHRoaXMudGFibGVQYWdpbmF0aW9uLnBhZ2VTaXplLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBjb25zdCByb2xlc0xpc3QgPSB0aGlzLnRlbmFudEFwcFNlcnZpY2Uuc29ydFJvbGVzQnlSb2xlVHlwZShcclxuICAgICAgICAgICAgICByZXNwb25zZT8uYm9keSBhcyBSb2xlW11cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy50ZW5hbnRBcHBTZXJ2aWNlLnNldFJvbGVzSW5mbyhyb2xlc0xpc3QpO1xyXG4gICAgICAgICAgICBjb25zdCBjZWxsVmFsdWUgPVxyXG4gICAgICAgICAgICAgIHRoaXMuY29uc3RhbnRzLnZpZXdSb2xlc0FuZFBlcm1pc3Npb25zLnRhYmxlQ2VsbFZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLmNvbHVtblNjaGVtYSA9IFtcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZDogMCxcclxuICAgICAgICAgICAgICAgIGNvbHVtbkRlZjogJ3Blcm1pc3Npb25zJyxcclxuICAgICAgICAgICAgICAgIGhlYWRpbmc6XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuY29uc3RhbnRzLnZpZXdSb2xlc0FuZFBlcm1pc3Npb25zLnRhYmxlQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgLnBlcm1pc3Npb25zLFxyXG4gICAgICAgICAgICAgICAgY29sdW1uVHlwZTogVGFibGVDb2x1bW5UeXBlLlRFWFQsXHJcbiAgICAgICAgICAgICAgICBjZWxsRGF0YTogKHJvbGVzQW5kUGVybWlzc2lvbnM6IFJvbGVzQW5kUGVybWlzc2lvbnMpID0+XHJcbiAgICAgICAgICAgICAgICAgIHJvbGVzQW5kUGVybWlzc2lvbnMucGVybWlzc2lvbixcclxuICAgICAgICAgICAgICAgIGlzU3RpY2t5Q29sdW1uOiB0cnVlLFxyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIF07XHJcbiAgICAgICAgICAgIHJvbGVzTGlzdC5tYXAoKHJvbGU6IFJvbGUsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5jb2x1bW5TY2hlbWEucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBpZDogaW5kZXggKyAxLFxyXG4gICAgICAgICAgICAgICAgY29sdW1uRGVmOiByb2xlLnJvbGVJZCxcclxuICAgICAgICAgICAgICAgIGhlYWRpbmc6IHJvbGUucm9sZU5hbWUsXHJcbiAgICAgICAgICAgICAgICBjb2x1bW5UeXBlOiBUYWJsZUNvbHVtblR5cGUuVEVYVCxcclxuICAgICAgICAgICAgICAgIGhhc0NvbHVtbkFjdGlvbnM6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBjZWxsRGF0YTogKHJvbGVzQW5kUGVybWlzc2lvbnM6IFJvbGVzQW5kUGVybWlzc2lvbnMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvbGVzQW5kUGVybWlzc2lvbnMucm9sZUlkc0xpc3QuZmluZChcclxuICAgICAgICAgICAgICAgICAgICAocm9sZUlkOiBzdHJpbmcpID0+IHJvbGUucm9sZUlkID09PSByb2xlSWRcclxuICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgID8gY2VsbFZhbHVlLnllc1xyXG4gICAgICAgICAgICAgICAgICAgIDogY2VsbFZhbHVlLm5vO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuaGFuZGxlRXJyb3JzKFxyXG4gICAgICAgICAgICBlcnJvcixcclxuICAgICAgICAgICAgdGhpcy5jb25zdGFudHM/LnZpZXdUZW5hbnRzPy5lcnJvcnNcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEZldGNoZXMgdGhlIHJvbGVzIGFuZCBwZXJtaXNzaW9ucyBtYXBwaW5ncyBmb3IgdGhlIHNlbGVjdGVkIHRlbmFudCBhbmQgYW5kIGluaXRpYWxpemUgdGFibGUgdmlldy5cclxuICAgKiBAcGFyYW0ge0dldFJvbGVzQW5kUGVybWlzc2lvbnNQYXlsb2FkfSBwYXlsb2FkXHJcbiAgICogQG1lbWJlcm9mIFZpZXdUZW5hbnREZXRhaWxzQ29tcG9uZW50XHJcbiAgICovXHJcbiAgZ2V0Um9sZXNBbmRQZXJtaXNzaW9uc0FuZEluaXRpYWxpemVUYWJsZVZpZXcoXHJcbiAgICBwYXlsb2FkOiBHZXRSb2xlc0FuZFBlcm1pc3Npb25zUGF5bG9hZFxyXG4gICk6IHZvaWQge1xyXG4gICAgdGhpcy50ZW5hbnRBcHBTZXJ2aWNlXHJcbiAgICAgIC5nZXRSb2xlc0FuZFBlcm1pc3Npb25zTWFwcGluZ3ModGhpcy5hcHBJZCwgcGF5bG9hZClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzcG9uc2U6IEdldFJvbGVzQW5kUGVybWlzc2lvbnNSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3BvbnNlPy5zdGF0dXMpIHtcclxuICAgICAgICAgICAgdGhpcy50YWJsZURhdGEgPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3JDb25maWcudG90YWxSZWNvcmRzID0gcmVzcG9uc2U/LmJvZHlcclxuICAgICAgICAgICAgICA/LnRvdGFsUmVjb3JkcyBhcyBudW1iZXI7XHJcbiAgICAgICAgICAgIGNvbnN0IHJvbGVzQW5kUGVybWlzc2lvbnNMaXN0ID0gcmVzcG9uc2U/LmJvZHlcclxuICAgICAgICAgICAgICA/LnJvbGVQZXJtaXNzaW9uRGV0YWlscyBhcyBSb2xlc0FuZFBlcm1pc3Npb25zTWFwcGluZ1tdO1xyXG4gICAgICAgICAgICByb2xlc0FuZFBlcm1pc3Npb25zTGlzdC5tYXAoKHBlcm1pc3Npb24pID0+IHtcclxuICAgICAgICAgICAgICBsZXQgcm9sZUlkc0xpc3Q6IHN0cmluZ1tdID0gW107XHJcbiAgICAgICAgICAgICAgcm9sZUlkc0xpc3QgPSBwZXJtaXNzaW9uLnJvbGVMaXN0Lm1hcCgocm9sZSkgPT4gcm9sZS5yb2xlSWQpO1xyXG4gICAgICAgICAgICAgIHRoaXMudGFibGVEYXRhLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgcGVybWlzc2lvbjogcGVybWlzc2lvbi5wZXJtaXNzaW9uTmFtZSxcclxuICAgICAgICAgICAgICAgIHJvbGVJZHNMaXN0OiByb2xlSWRzTGlzdCxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuaGFuZGxlRXJyb3JzKFxyXG4gICAgICAgICAgICBlcnJvcixcclxuICAgICAgICAgICAgdGhpcy5jb25zdGFudHM/LnZpZXdUZW5hbnRzPy5lcnJvcnNcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEZldGNoIHRoZSByb2xlcyBhbmQgcGVybWlzc2lvbnMgcmVjb3JkcyBiYXNlZCBvbiBvZmZzZXQgYW5kIHBhZ2Ugc2l6ZSB3aGlsZSB0aGUgcGFnaW5hdGlvbiBjaGFuZ2VzLlxyXG4gICAqIEBwYXJhbSB7UGFnZUV2ZW50fSBwYWdlRXZlbnRcclxuICAgKiBAbWVtYmVyb2YgVmlld1RlbmFudERldGFpbHNDb21wb25lbnRcclxuICAgKi9cclxuICBvblRhYmxlUGFnaW5hdGlvbkNoYW5nZShwYWdlRXZlbnQ6IFBhZ2VFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy50YWJsZVBhZ2luYXRpb24gPSB7XHJcbiAgICAgIG9mZnNldDogcGFnZUV2ZW50LnBhZ2VJbmRleCxcclxuICAgICAgcGFnZVNpemU6IHBhZ2VFdmVudC5wYWdlU2l6ZSxcclxuICAgIH07XHJcbiAgICB0aGlzLmdldFJvbGVzQW5kUGVybWlzc2lvbnNBbmRJbml0aWFsaXplVGFibGVWaWV3KHtcclxuICAgICAgcGF5bG9hZDoge1xyXG4gICAgICAgIG9mZnNldDogcGFnZUV2ZW50LnBhZ2VJbmRleCxcclxuICAgICAgICBwYWdlU2l6ZTogcGFnZUV2ZW50LnBhZ2VTaXplLFxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIENhcHR1cmVzIHRoZSBzZWxlY3RlZCByb2xlJ3MgaW5mb3JtYXRpb24gYW5kIHBlcmZvcm1zIGVkaXQgb3IgZGVsZXRlIGFjdGlvbiBiYXNpcyBvbiB0aGUgc2VsZWN0ZWQgbWVudSBpdGVtLlxyXG4gICAqIEBwYXJhbSB7VGFibGVDb2x1bW5NZW51SW5mb30gcm9sZU1lbnVJbmZvXHJcbiAgICogQG1lbWJlcm9mIFZpZXdUZW5hbnREZXRhaWxzQ29tcG9uZW50XHJcbiAgICovXHJcbiAgb25Sb2xlTWVudUNsaWNrKHJvbGVNZW51SW5mbzogVGFibGVDb2x1bW5NZW51SW5mbykge1xyXG4gICAgdGhpcy5zZWxlY3RlZFJvbGVJbmZvLnJvbGVJZCA9IHJvbGVNZW51SW5mbz8udGFibGVDb2x1bW5JbmZvPy5jb2x1bW5EZWY7XHJcbiAgICB0aGlzLnNlbGVjdGVkUm9sZUluZm8ucm9sZU5hbWUgPSByb2xlTWVudUluZm8/LnRhYmxlQ29sdW1uSW5mbz8uaGVhZGluZztcclxuICAgIHRoaXMudGVuYW50QXBwU2VydmljZT8uc2V0U2VsZWN0ZWRSb2xlSW5mb3JtYXRpb24odGhpcy5zZWxlY3RlZFJvbGVJbmZvKTtcclxuICAgIGlmIChyb2xlTWVudUluZm8/Lm1lbnVBY3Rpb25JbmZvPy5pZCA9PT0gUm9sZU1lbnVBY3Rpb24uREVMRVRFX1JPTEUpIHtcclxuICAgICAgdGhpcy5vcGVuRGVsZXRlUm9sZU1vZGFsKCk7XHJcbiAgICB9IGVsc2UgaWYgKHJvbGVNZW51SW5mbz8ubWVudUFjdGlvbkluZm8/LmlkID09PSBSb2xlTWVudUFjdGlvbi5FRElUX1JPTEUpIHtcclxuICAgICAgdGhpcy5vcGVuRWRpdFJvbGVGb3JtKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEtlZXBzIHRyYWNrIG9mIHRoZSBhY2NvcmRpb24gYmFzZWQgb24gdGhlIGVsZW1lbnQncyBJRCBpbiBET00gdHJlZS5cclxuICAgKiBAbWVtYmVyb2YgVmlld1RlbmFudERldGFpbHNDb21wb25lbnRcclxuICAgKi9cclxuICB0cmFja0J5QWNjb3JkaW9uRm4oaW5kZXg6IG51bWJlciwgaXRlbTogQWNjb3JkaW9uSW5mbyk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gaXRlbT8uaWQgYXMgbnVtYmVyO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBHZXRzIHRoZSByb2xlIHR5cGVzIGFuZCB1cGRhdGVzIHRoZSBmb3JtIGNvbnRyb2wuXHJcbiAgICogQG1lbWJlcm9mIFZpZXdUZW5hbnREZXRhaWxzQ29tcG9uZW50XHJcbiAgICovXHJcbiAgZ2V0Um9sZVR5cGVzKCk6IHZvaWQge1xyXG4gICAgY29uc3QgcGF5bG9hZDogR2V0Um9sZVR5cGVzUGF5bG9hZCA9IHtcclxuICAgICAgcGF5bG9hZDoge1xyXG4gICAgICAgIGFwcElkOiB0aGlzLnRlbmFudERldGFpbHM/LmFwcElkIGFzIHN0cmluZyxcclxuICAgICAgICBjb25maWdGaWVsZE5hbWU6ICdyb2xlX3R5cGUnLFxyXG4gICAgICB9LFxyXG4gICAgfTtcclxuICAgIHRoaXMudGVuYW50QXBwU2VydmljZVxyXG4gICAgICAuZ2V0Um9sZVR5cGVzKHBheWxvYWQpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlc3BvbnNlOiBSb2xlVHlwZVJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzcG9uc2U/LnN0YXR1cykge1xyXG4gICAgICAgICAgICB0aGlzLnJvbGVUeXBlT3B0aW9ucyA9IHRoaXMudGVuYW50QXBwU2VydmljZS5nZXRSb2xlVHlwZU9wdGlvbnMoXHJcbiAgICAgICAgICAgICAgcmVzcG9uc2U/LmJvZHkgYXMgUm9sZVR5cGVDb25maWd1cmF0aW9uW11cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy50ZW5hbnRBcHBTZXJ2aWNlPy5zZXRSb2xlVHlwZU9wdGlvbih0aGlzLnJvbGVUeXBlT3B0aW9ucyk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZ1bmN0aW9uVHlwZSA9PT0gVGVuYW50RnVuY3Rpb25UeXBlLkNSRUFURV9ST0xFKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5vcGVuQ3JlYXRlUm9sZUZvcm0oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgICBlcnJvcjogKGVycm9yOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5oYW5kbGVFcnJvcnMoXHJcbiAgICAgICAgICAgIGVycm9yLFxyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVJvbGVTY3JlZW5UZXh0cz8uZXJyb3JzXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSBkaWFsb2cgb3B0aW9ucyBmb3IgY3JlYXRlIHJvbGUgbW9kYWwgYW5kIGNhbGxzIG9wZW5Nb2RhbCBtZXRob2QuXHJcbiAgICogQHJldHVybiAtcmV0dXJucyBub3RoaW5nXHJcbiAgICogQG1lbWJlcm9mIFZpZXdUZW5hbnREZXRhaWxzQ29tcG9uZW50XHJcbiAgICovXHJcbiAgb3BlbkNyZWF0ZVJvbGVGb3JtKCk6IHZvaWQge1xyXG4gICAgdGhpcy50ZW5hbnRBcHBTZXJ2aWNlPy5zZXRUZW5hbnRGdW5jdGlvblR5cGUoXHJcbiAgICAgIFRlbmFudEZ1bmN0aW9uVHlwZT8uQ1JFQVRFX1JPTEVcclxuICAgICk7XHJcbiAgICB0aGlzLmZ1bmN0aW9uVHlwZSA9IFRlbmFudEZ1bmN0aW9uVHlwZS5DUkVBVEVfUk9MRTtcclxuICAgIGlmICh0aGlzLnJvbGVUeXBlT3B0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IGRpYWxvZ09wdGlvbnMgPSB7XHJcbiAgICAgICAgaGVhZGluZzogdGhpcy5jb25zdGFudHM/LmNyZWF0ZVJvbGU/LmhlYWRpbmcsXHJcbiAgICAgICAgaXNDbG9zZU5lZWRlZDogdHJ1ZSxcclxuICAgICAgICBjb21wb25lbnRSZWZlcmVuY2U6IENyZWF0ZU1vZGlmeVJvbGVDb21wb25lbnQsXHJcbiAgICAgICAgbW9kYWxUeXBlOiBNb2RhbFR5cGUuRk9STSxcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5vcGVuTW9kYWwoZGlhbG9nT3B0aW9ucywgJ2llZWVzYS1jcmVhdGUtbW9kaWZ5LXJvbGUnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZ2V0Um9sZVR5cGVzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIGRpYWxvZyBvcHRpb25zIGZvciBjcmVhdGUgZ3JvdXAgdHlwZSBtb2RhbCBhbmQgY2FsbHMgb3Blbk1vZGFsIG1ldGhvZC5cclxuICAgKiBAcmV0dXJuIC1yZXR1cm5zIG5vdGhpbmdcclxuICAgKiBAbWVtYmVyb2YgVmlld1RlbmFudERldGFpbHNDb21wb25lbnRcclxuICAgKi9cclxuICBvcGVuQ3JlYXRlR3JvdXBUeXBlRm9ybSgpOiB2b2lkIHtcclxuICAgIHRoaXMudGVuYW50QXBwU2VydmljZT8uc2V0VGVuYW50RnVuY3Rpb25UeXBlKFxyXG4gICAgICBUZW5hbnRGdW5jdGlvblR5cGU/LkNSRUFURV9HUk9VUF9UWVBFXHJcbiAgICApO1xyXG4gICAgdGhpcy5mdW5jdGlvblR5cGUgPSBUZW5hbnRGdW5jdGlvblR5cGUuQ1JFQVRFX0dST1VQX1RZUEU7XHJcbiAgICBjb25zdCBkaWFsb2dPcHRpb25zID0ge1xyXG4gICAgICBoZWFkaW5nOiB0aGlzLmNvbnN0YW50cz8uY3JlYXRlR3JvdXBUeXBlPy5oZWFkaW5nLFxyXG4gICAgICBpc0Nsb3NlTmVlZGVkOiB0cnVlLFxyXG4gICAgICBjb21wb25lbnRSZWZlcmVuY2U6IENyZWF0ZU1vZGlmeUdyb3VwVHlwZUNvbXBvbmVudCxcclxuICAgICAgbW9kYWxUeXBlOiBNb2RhbFR5cGUuRk9STSxcclxuICAgIH07XHJcbiAgICB0aGlzLm9wZW5Nb2RhbChkaWFsb2dPcHRpb25zLCAnaWVlZXNhLWNyZWF0ZS1tb2RpZnktZ3JvdXAtdHlwZScpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSBkaWFsb2cgb3B0aW9ucyBmb3IgZWRpdCByb2xlIG1vZGFsIGFuZCBjYWxscyBvcGVuTW9kYWwgbWV0aG9kLlxyXG4gICAqIEByZXR1cm4gLXJldHVybnMgbm90aGluZ1xyXG4gICAqIEBtZW1iZXJvZiBWaWV3VGVuYW50RGV0YWlsc0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIG9wZW5FZGl0Um9sZUZvcm0oKTogdm9pZCB7XHJcbiAgICB0aGlzLnRlbmFudEFwcFNlcnZpY2U/LnNldFRlbmFudEZ1bmN0aW9uVHlwZShUZW5hbnRGdW5jdGlvblR5cGU/LkVESVRfUk9MRSk7XHJcbiAgICB0aGlzLmZ1bmN0aW9uVHlwZSA9IFRlbmFudEZ1bmN0aW9uVHlwZS5FRElUX1JPTEU7XHJcbiAgICBjb25zdCBkaWFsb2dPcHRpb25zID0ge1xyXG4gICAgICBoZWFkaW5nOiB0aGlzLnNlbGVjdGVkUm9sZUluZm8/LnJvbGVOYW1lLFxyXG4gICAgICBpc0Nsb3NlTmVlZGVkOiB0cnVlLFxyXG4gICAgICBjb21wb25lbnRSZWZlcmVuY2U6IENyZWF0ZU1vZGlmeVJvbGVDb21wb25lbnQsXHJcbiAgICAgIG1vZGFsVHlwZTogTW9kYWxUeXBlLkZPUk0sXHJcbiAgICB9O1xyXG4gICAgdGhpcy5vcGVuTW9kYWwoZGlhbG9nT3B0aW9ucywgJ2llZWVzYS1jcmVhdGUtbW9kaWZ5LXJvbGUnKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgZGlhbG9nIG9wdGlvbnMgZm9yIGVkaXQgdGVuYW50IG1vZGFsIGFuZCBjYWxscyBvcGVuTW9kYWwgbWV0aG9kLlxyXG4gICAqIEByZXR1cm4gLXJldHVybnMgbm90aGluZ1xyXG4gICAqIEBtZW1iZXJvZiBWaWV3VGVuYW50RGV0YWlsc0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIG9wZW5FZGl0VGVuYW50Rm9ybSgpOiB2b2lkIHtcclxuICAgIHRoaXMudGVuYW50QXBwU2VydmljZT8uc2V0VGVuYW50RnVuY3Rpb25UeXBlKFRlbmFudEZ1bmN0aW9uVHlwZT8uRURJVCk7XHJcbiAgICB0aGlzLmZ1bmN0aW9uVHlwZSA9IFRlbmFudEZ1bmN0aW9uVHlwZS5FRElUO1xyXG4gICAgY29uc3QgZGlhbG9nT3B0aW9ucyA9IHtcclxuICAgICAgaGVhZGluZzogdGhpcy50ZW5hbnREZXRhaWxzPy5hcHBUaXRsZSxcclxuICAgICAgaXNDbG9zZU5lZWRlZDogdHJ1ZSxcclxuICAgICAgY29tcG9uZW50UmVmZXJlbmNlOiBDcmVhdGVUZW5hbnRBcHBsaWNhdGlvbkNvbXBvbmVudCxcclxuICAgICAgbW9kYWxUeXBlOiBNb2RhbFR5cGUuRk9STSxcclxuICAgIH07XHJcbiAgICB0aGlzLm9wZW5Nb2RhbChkaWFsb2dPcHRpb25zLCAnaWVlZXNhLWVkaXQtdGVuYW50Jyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPcGVucyBtb2RhbCBjb21wb25lbnQgd2l0aCByZWNlaXZlZCBwYXJhbXMgYW5kIGhhbmRsZXMgZm9ybSBzdWJtaXNzaW9uIHN1Y2Nlc3MgYW5kIGVycm9ycy5cclxuICAgKiBAcGFyYW0geyp9IGRpYWxvZ09wdGlvbnNcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2NsYXNzTmFtZV1cclxuICAgKiBAcmV0dXJuIC1yZXR1cm5zIG5vdGhpbmdcclxuICAgKiBAbWVtYmVyb2YgVmlld1RlbmFudHNEZXRhaWxzQ29tcG9uZW50XHJcbiAgICovXHJcbiAgb3Blbk1vZGFsKFxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgIGRpYWxvZ09wdGlvbnM6IGFueSxcclxuICAgIGNsYXNzTmFtZT86IHN0cmluZ1xyXG4gICk6IHZvaWQge1xyXG4gICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lID8/ICcnO1xyXG4gICAgdGhpcy5kaWFsb2dSZWYgPSB0aGlzLmRpYWxvZz8ub3BlbihNb2RhbENvbXBvbmVudCwge1xyXG4gICAgICBkYXRhOiBkaWFsb2dPcHRpb25zLFxyXG4gICAgICB3aWR0aDogJycsXHJcbiAgICAgIHBhbmVsQ2xhc3M6IFsnaWVlZXNhLW1vZGFsLWRpYWxvZycsIGNsYXNzTmFtZV0sXHJcbiAgICAgIGFyaWFNb2RhbDogdHJ1ZSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5kaWFsb2dSZWY/LmNvbXBvbmVudEluc3RhbmNlPy5zdWJtaXRGb3JtUmVzcG9uc2VcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBuby11bnVzZWQtdmFyc1xyXG4gICAgICAuc3Vic2NyaWJlKChyZXN1bHQ6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGlhbG9nUmVmPy5jbG9zZSgpO1xyXG4gICAgICAgIHN3aXRjaCAodGhpcy5mdW5jdGlvblR5cGUpIHtcclxuICAgICAgICAgIGNhc2UgVGVuYW50RnVuY3Rpb25UeXBlPy5FRElUOiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5zaG93QWxlcnRNZXNzYWdlKFxyXG4gICAgICAgICAgICAgIEFsZXJ0VHlwZT8uU1VDQ0VTUyxcclxuICAgICAgICAgICAgICBgJHt0aGlzLnRlbmFudERldGFpbHM/LmFwcFRpdGxlfSAke3RoaXMuZWRpdFRlbmFudFNjcmVlblRleHRzPy5tZXNzYWdlPy5zdWNjZXNzPy5zdWJtaXNzaW9ufWBcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy50ZW5hbnREZXRhaWxzID0ge1xyXG4gICAgICAgICAgICAgIC4uLih0aGlzLnRlbmFudEFwcFNlcnZpY2UuZ2V0U2VsZWN0ZWRUZW5hbnRJbmZvcm1hdGlvbigpIGFzIFRlbmFudEJhc2ljSW5mbyksXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY2FzZSBUZW5hbnRGdW5jdGlvblR5cGU/LkNSRUFURV9ST0xFOiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHByb21wdE1lc3NhZ2UgPSB0aGlzLmNyZWF0ZVJvbGVTY3JlZW5UZXh0cz8ubWVzc2FnZT8uc3VjY2VzcztcclxuICAgICAgICAgICAgY29uc3Qgcm9sZUluZm8gPSB0aGlzLnRlbmFudEFwcFNlcnZpY2U/LmdldE5ld2x5Q3JlYXRlZFJvbGVJbmZvKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5zaG93QWxlcnRNZXNzYWdlKFxyXG4gICAgICAgICAgICAgIEFsZXJ0VHlwZT8uU1VDQ0VTUyxcclxuICAgICAgICAgICAgICBgJHtwcm9tcHRNZXNzYWdlPy5zdWJtaXNzaW9uMX0gJHtyb2xlSW5mbz8ucm9sZU5hbWV9ICR7cHJvbXB0TWVzc2FnZT8uc3VibWlzc2lvbjJ9ICR7dGhpcy50ZW5hbnREZXRhaWxzPy5hcHBUaXRsZX0uICR7cHJvbXB0TWVzc2FnZT8uc3VibWlzc2lvbjN9YFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLmdldFJvbGVzQW5kSW5pdGlhbGl6ZVRhYmxlU2NoZW1hKCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY2FzZSBUZW5hbnRGdW5jdGlvblR5cGU/LkVESVRfUk9MRToge1xyXG4gICAgICAgICAgICBjb25zdCBwcm9tcHRNZXNzYWdlID0gdGhpcy5jcmVhdGVSb2xlU2NyZWVuVGV4dHM/Lm1lc3NhZ2U/LnN1Y2Nlc3M7XHJcbiAgICAgICAgICAgIGNvbnN0IHJvbGVJbmZvID0gdGhpcy50ZW5hbnRBcHBTZXJ2aWNlPy5nZXROZXdseUNyZWF0ZWRSb2xlSW5mbygpO1xyXG4gICAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2Uuc2hvd0FsZXJ0TWVzc2FnZShcclxuICAgICAgICAgICAgICBBbGVydFR5cGU/LlNVQ0NFU1MsXHJcbiAgICAgICAgICAgICAgYCR7cm9sZUluZm8/LnJvbGVOYW1lfSAke3Byb21wdE1lc3NhZ2U/Lm1vZGlmeX0gJHt0aGlzLnRlbmFudERldGFpbHM/LmFwcFRpdGxlfS5gXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Um9sZXNBbmRJbml0aWFsaXplVGFibGVTY2hlbWEoKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjYXNlIFRlbmFudEZ1bmN0aW9uVHlwZT8uQ1JFQVRFX0dST1VQX1RZUEU6IHtcclxuICAgICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnNob3dBbGVydE1lc3NhZ2UoXHJcbiAgICAgICAgICAgICAgQWxlcnRUeXBlPy5TVUNDRVNTLFxyXG4gICAgICAgICAgICAgIGAke3RoaXMuY3JlYXRlR3JvdXBUeXBlU2NyZWVuVGV4dHM/Lm1lc3NhZ2U/LnN1Y2Nlc3M/LnN1Ym1pc3Npb25QYXJ0MX0gJHt0aGlzLnRlbmFudEFwcFNlcnZpY2UubmV3bHlDcmVhdGVkR3JvdXBUeXBlLmNvbmZpZ0ZpZWxkVmFsdWUubmFtZX0gJHt0aGlzLmNyZWF0ZUdyb3VwVHlwZVNjcmVlblRleHRzPy5tZXNzYWdlPy5zdWNjZXNzPy5zdWJtaXNzaW9uUGFydDJ9ICR7dGhpcy50ZW5hbnREZXRhaWxzPy5hcHBUaXRsZX0uIGBcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy50ZW5hbnRBcHBTZXJ2aWNlLmlzR3JvdXBUeXBlQWRkZWRPck1vZGlmaWVkLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB0aGlzLmRpYWxvZ1JlZj8uY29tcG9uZW50SW5zdGFuY2U/LmZvcm1DYW5jZWxcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLmRpYWxvZ1JlZj8uY2xvc2UoKTtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICB0aGlzLnRlbmFudEFwcFNlcnZpY2UuZ2V0VGVuYW50RnVuY3Rpb25UeXBlKCkgPT09XHJcbiAgICAgICAgICBUZW5hbnRGdW5jdGlvblR5cGUuTUFQX1BFUk1JU1NJT05fQU5EX1JPTEVcclxuICAgICAgICApXHJcbiAgICAgICAgICB0aGlzLmdldFJvbGVzQW5kSW5pdGlhbGl6ZVRhYmxlU2NoZW1hKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy5kaWFsb2dSZWY/LmNvbXBvbmVudEluc3RhbmNlPy5tb2RhbENvbmZpcm1cclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICB0aGlzLnRlbmFudEFwcFNlcnZpY2UuZ2V0VGVuYW50RnVuY3Rpb25UeXBlKCkgPT09XHJcbiAgICAgICAgICBUZW5hbnRGdW5jdGlvblR5cGUuTUFQX1BFUk1JU1NJT05fQU5EX1JPTEVcclxuICAgICAgICApXHJcbiAgICAgICAgICB0aGlzLmdldFJvbGVzQW5kSW5pdGlhbGl6ZVRhYmxlU2NoZW1hKCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBDYWxscyBvcGVuVGVuYW50U3RhdHVzQ29uZmlybWF0aW9uTW9kYWwgdG8gY2hhbmdlIHRoZSBzdGF0dXMgb2YgdGVuYW50IG9uIHNsaWRlIHRvZ2dsZSBjaGFuZ2UuXHJcbiAgICogQHBhcmFtIHtTbGlkZVRvZ2dsZU9wdGlvbn0gc2xpZGVUb2dnbGVPcHRpb25cclxuICAgKiBAbWVtYmVyb2YgVmlld1RlbmFudERldGFpbHNDb21wb25lbnRcclxuICAgKi9cclxuICBvblNsaWRlVG9nZ2xlQ2hhbmdlKHNsaWRlVG9nZ2xlT3B0aW9uOiBTbGlkZVRvZ2dsZU9wdGlvbik6IHZvaWQge1xyXG4gICAgdGhpcy5vcGVuVGVuYW50U3RhdHVzQ29uZmlybWF0aW9uTW9kYWwoc2xpZGVUb2dnbGVPcHRpb24/LmNoZWNrZWQpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBPcGVucyB0aGUgY29uZmlybWF0aW9uIG1vZGFsIHRvIGluYWN0aXZhdGUvcmVhY3RpdmF0ZSB0aGUgdGVuYW50LlxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNBY3RpdmF0ZVxyXG4gICAqIEBtZW1iZXJvZiBWaWV3VGVuYW50RGV0YWlsc0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIG9wZW5UZW5hbnRTdGF0dXNDb25maXJtYXRpb25Nb2RhbChpc0FjdGl2YXRlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBjb25zdCBjb25maXJtYXRpb25JbmZvID0gdGhpcy5jb25zdGFudHM/LnZpZXdUZW5hbnRzPy5jb25maXJtYXRpb25JbmZvO1xyXG4gICAgY29uc3Qgc3RhdHVzVGV4dCA9IGlzQWN0aXZhdGVcclxuICAgICAgPyBjb25maXJtYXRpb25JbmZvPy5wcm9tcHRNZXNzYWdlQWN0aXZhdGVcclxuICAgICAgOiBjb25maXJtYXRpb25JbmZvPy5wcm9tcHRNZXNzYWdlSW5hY3RpdmF0ZTtcclxuICAgIGNvbnN0IHVwZGF0ZVRlbmFudFN0YXR1c01vZGFsT3B0aW9ucyA9IHtcclxuICAgICAgbGVmdEJ1dHRvbkxhYmVsOiBjb25maXJtYXRpb25JbmZvPy5sZWZ0QnV0dG9uTGFiZWwsXHJcbiAgICAgIHJpZ2h0QnV0dG9uTGFiZWw6IGNvbmZpcm1hdGlvbkluZm8/LnJpZ2h0QnV0dG9uTGFiZWwsXHJcbiAgICAgIHByb21wdE1lc3NhZ2U6IGAke2NvbmZpcm1hdGlvbkluZm8/LnByb21wdE1lc3NhZ2V9ICR7c3RhdHVzVGV4dH0gJHt0aGlzLnRlbmFudERldGFpbHM/LmFwcFRpdGxlfT9gLFxyXG4gICAgICBhY3Rpb25CdXR0b25BbGlnbjogdGhpcy5hbGlnbm1lbnRUeXBlPy5NSURETEUsXHJcbiAgICB9O1xyXG4gICAgdGhpcy5kaWFsb2dSZWYgPSB0aGlzLmRpYWxvZz8ub3BlbihNb2RhbENvbmZpcm1hdGlvbkNvbXBvbmVudCwge1xyXG4gICAgICBkYXRhOiB1cGRhdGVUZW5hbnRTdGF0dXNNb2RhbE9wdGlvbnMsXHJcbiAgICAgIHdpZHRoOiAnYXV0bycsXHJcbiAgICAgIGF1dG9Gb2N1czogJ2RpYWxvZycsXHJcbiAgICAgIGFyaWFMYWJlbDogY29uZmlybWF0aW9uSW5mbz8uYXJpYUxhYmVsPy5hbGVydCxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5kaWFsb2dSZWZcclxuICAgICAgLmFmdGVyQ2xvc2VkKClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXN1bHQ6IGJvb2xlYW4pID0+IHtcclxuICAgICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZVRlbmFudFN0YXR1cyhpc0FjdGl2YXRlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5zZXRTbGlkZVRvZ2dsZVN0YXR1cyhpc0FjdGl2YXRlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBPcGVucyB0aGUgbWFwIHBlcm1pc3Npb25zIGFuZCByb2xlcyBtb2RhbC5cclxuICAgKiBAbWVtYmVyb2YgVmlld1RlbmFudERldGFpbHNDb21wb25lbnRcclxuICAgKiBAcmV0dXJucyB7dm9pZH1cclxuICAgKi9cclxuICBvcGVuTWFwUm9sZXNBbmRQZXJtaXNzaW9uc0Zvcm0oKTogdm9pZCB7XHJcbiAgICB0aGlzLnRlbmFudEFwcFNlcnZpY2U/LnNldFRlbmFudEZ1bmN0aW9uVHlwZShcclxuICAgICAgVGVuYW50RnVuY3Rpb25UeXBlPy5NQVBfUEVSTUlTU0lPTl9BTkRfUk9MRVxyXG4gICAgKTtcclxuICAgIGNvbnN0IGRpYWxvZ09wdGlvbnMgPSB7XHJcbiAgICAgIGhlYWRpbmc6IHRoaXMubWFwUm9sZXNBbmRQZXJtaXNzaW9uc1NjcmVlblRleHRzLmhlYWRpbmcsXHJcbiAgICAgIGlzQ2xvc2VOZWVkZWQ6IHRydWUsXHJcbiAgICAgIG1vZGFsVHlwZTogTW9kYWxUeXBlLkZPUk0sXHJcbiAgICAgIGNvbXBvbmVudFJlZmVyZW5jZTogUm9sZXNBbmRQZXJtaXNzaW9uc01hcHBpbmdDb21wb25lbnQsXHJcbiAgICB9O1xyXG4gICAgdGhpcy5vcGVuTW9kYWwoZGlhbG9nT3B0aW9ucywgJ2llZWVzYS1tYXAtcGVybWlzc2lvbnMtYW5kLXJvbGVzJyk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZXMgdGhlIHRlbmFudCBzdGF0dXMgdG8gdGhlIHNlcnZlciB1c2luZyBodHRwIHJlcXVlc3QgYW5kIGRpc3BsYXkgc3VjY2Vzcy9lcnJvciBtZXNzYWdlIGJhc2VkIG9uIHJlcXVlc3QgcmVzcG9uc2UgKHN1Y2Nlc3Mgb3IgZmFpbHVyZSkuXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBpc0FjdGl2YXRlXHJcbiAgICogQG1lbWJlcm9mIFZpZXdUZW5hbnREZXRhaWxzQ29tcG9uZW50XHJcbiAgICovXHJcbiAgdXBkYXRlVGVuYW50U3RhdHVzKGlzQWN0aXZhdGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGNvbnN0IHVwZGF0ZVRlbmFudFN0YXR1c1JlcXVlc3RQYXlsb2FkOiBVcGRhdGVUZW5hbnRTdGF0dXNSZXF1ZXN0UGF5bG9hZCA9IHtcclxuICAgICAgcGF5bG9hZDoge1xyXG4gICAgICAgIGFwcElkOiB0aGlzLnRlbmFudERldGFpbHM/LmFwcElkLFxyXG4gICAgICAgIHN0YXR1czogaXNBY3RpdmF0ZSxcclxuICAgICAgfSxcclxuICAgIH07XHJcbiAgICB0aGlzLnRlbmFudEFwcFNlcnZpY2VcclxuICAgICAgLnVwZGF0ZVRlbmFudFN0YXR1cyh1cGRhdGVUZW5hbnRTdGF0dXNSZXF1ZXN0UGF5bG9hZClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBVcGRhdGVUZW5hbnRTdGF0dXNSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kaWFsb2dSZWY/LmNsb3NlKCk7XHJcbiAgICAgICAgICBpZiAocmVzPy5zdGF0dXMpIHtcclxuICAgICAgICAgICAgdGhpcy5zbGlkZVRvZ2dsZU9wdGlvbi5sYWJlbCA9IGlzQWN0aXZhdGVcclxuICAgICAgICAgICAgICA/IHRoaXMudGVuYW50TGFiZWxzPy5hY3RpdmVcclxuICAgICAgICAgICAgICA6IHRoaXMudGVuYW50TGFiZWxzPy5pbmFjdGl2ZTtcclxuICAgICAgICAgICAgdGhpcy50ZW5hbnREZXRhaWxzLnN0YXR1cyA9IGlzQWN0aXZhdGU7XHJcbiAgICAgICAgICAgIHRoaXMudGVuYW50RGV0YWlscyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMudGVuYW50RGV0YWlscyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxyXG4gICAgICAgIGVycm9yOiAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zZXRTbGlkZVRvZ2dsZVN0YXR1cyhpc0FjdGl2YXRlKTtcclxuICAgICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5oYW5kbGVFcnJvcnMoXHJcbiAgICAgICAgICAgIGVycm9yLFxyXG4gICAgICAgICAgICB0aGlzLmNvbnN0YW50cz8udmlld1RlbmFudHM/LmVycm9yc1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogU2V0cyBzbGlkZSB0b2dnbGUgY2hlY2tlZCBzdGF0dXMgYW5kIGxhYmVsLlxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNBY3RpdmF0ZVxyXG4gICAqIEBtZW1iZXJvZiBWaWV3VGVuYW50RGV0YWlsc0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIHNldFNsaWRlVG9nZ2xlU3RhdHVzKGlzQWN0aXZhdGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuc2xpZGVUb2dnbGVPcHRpb24uY2hlY2tlZCA9ICFpc0FjdGl2YXRlO1xyXG4gICAgdGhpcy5zbGlkZVRvZ2dsZU9wdGlvbi5sYWJlbCA9ICFpc0FjdGl2YXRlXHJcbiAgICAgID8gdGhpcy50ZW5hbnRMYWJlbHM/LmFjdGl2ZVxyXG4gICAgICA6IHRoaXMudGVuYW50TGFiZWxzPy5pbmFjdGl2ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgdGhlIGFwcGxpY2F0aW9uL3RlbmFudCB0eXBlcy5cclxuICAgKiBAbWVtYmVyb2YgVmlld1RlbmFudERldGFpbHNDb21wb25lbnRcclxuICAgKi9cclxuICBnZXRBcHBsaWNhdGlvblR5cGVzKCk6IHZvaWQge1xyXG4gICAgdGhpcy50ZW5hbnRBcHBTZXJ2aWNlXHJcbiAgICAgIC5nZXRBcHBsaWNhdGlvblR5cGVzKClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzcG9uc2U6IEdldEFwcFR5cGVzUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIGlmIChyZXNwb25zZT8uc3RhdHVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXBwVHlwZU9wdGlvbnMgPVxyXG4gICAgICAgICAgICAgIHRoaXMudGVuYW50QXBwU2VydmljZS5nZXRBcHBsaWNhdGlvblR5cGVPcHRpb25zKFxyXG4gICAgICAgICAgICAgICAgcmVzcG9uc2U/LmJvZHkgYXMgQXBwVHlwZUNvbmZpZ1tdXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy50ZW5hbnRBcHBTZXJ2aWNlLnNldEFwcGxpY2F0aW9uVHlwZShcclxuICAgICAgICAgICAgICB0aGlzLmFwcFR5cGVPcHRpb25zIGFzIFJhZGlvT3B0aW9uW11cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgICAgZXJyb3I6IChlcnJvcjogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuaGFuZGxlRXJyb3JzKFxyXG4gICAgICAgICAgICBlcnJvcixcclxuICAgICAgICAgICAgdGhpcy5jb25zdGFudHM/LnZpZXdUZW5hbnRzPy5lcnJvcnNcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFZhbGlkYXRlcyBwZXJtaXNzaW9uIGJhc2VkIGFjY2VzcyBmb3IgcHJvdmlkZWQgZmVhdHVyZS5cclxuICAgKiBAcGFyYW0ge1Blcm1pc3Npb25UeXBlfSBwZXJtaXNzaW9uVHlwZVxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICogQG1lbWJlcm9mIFZpZXdUZW5hbnREZXRhaWxzQ29tcG9uZW50XHJcbiAgICovXHJcbiAgdmFsaWRhdGVBY2Nlc3MocGVybWlzc2lvblR5cGU6IFBlcm1pc3Npb25UeXBlKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW5hbnRBcHBTZXJ2aWNlLnZhbGlkYXRlQWNjZXNzKFxyXG4gICAgICBwZXJtaXNzaW9uVHlwZSxcclxuICAgICAgdGhpcy51c2VyVGVuYW50c1Blcm1pc3Npb25zXHJcbiAgICApO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBQb3N0cyB0aGUgZGV0YWlscyBvZiB0aGUgcm9sZSB0byBiZSBkZWxldGVkIHRvIHRoZSBzZXJ2ZXIgdXNpbmcgaHR0cCByZXF1ZXN0IGFuZCBkaXNwbGF5IHN1Y2Nlc3MvZXJyb3IgbWVzc2FnZSBiYXNlZCBvbiByZXF1ZXN0IHJlc3BvbnNlIChzdWNjZXNzIG9yIGZhaWx1cmUpLlxyXG4gICAqIEBtZW1iZXJvZiBWaWV3VGVuYW50RGV0YWlsc0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIGRlbGV0ZVJvbGUoKTogdm9pZCB7XHJcbiAgICBjb25zdCBkZWxldGVSb2xlUmVxdWVzdFBheWxvYWQ6IERlbGV0ZVJvbGVSZXF1ZXN0UGF5bG9hZCA9IHtcclxuICAgICAgcGF5bG9hZDoge1xyXG4gICAgICAgIGFwcElkOiB0aGlzLnRlbmFudERldGFpbHM/LmFwcElkLFxyXG4gICAgICAgIHJvbGVJZDogdGhpcy5zZWxlY3RlZFJvbGVJbmZvPy5yb2xlSWQsXHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG4gICAgdGhpcy50ZW5hbnRBcHBTZXJ2aWNlXHJcbiAgICAgIC5kZWxldGVSb2xlKGRlbGV0ZVJvbGVSZXF1ZXN0UGF5bG9hZClcclxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzOiBEZWxldGVSb2xlUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIGlmIChyZXM/LnN0YXR1cykge1xyXG4gICAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2Uuc2hvd0FsZXJ0TWVzc2FnZShcclxuICAgICAgICAgICAgICBBbGVydFR5cGU/LlNVQ0NFU1MsXHJcbiAgICAgICAgICAgICAgYCR7dGhpcy5zZWxlY3RlZFJvbGVJbmZvPy5yb2xlTmFtZX0gJHt0aGlzLmRlbGV0ZVJvbGVTY3JlZW5UZXh0cz8ubWVzc2FnZT8uc3VjY2Vzcz8uc3VibWlzc2lvbn0gJHt0aGlzLnRlbmFudERldGFpbHM/LmFwcFRpdGxlfS5gXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Um9sZXNBbmRJbml0aWFsaXplVGFibGVTY2hlbWEoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgICAgZXJyb3I6IChlcnJvcjogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuaGFuZGxlRXJyb3JzKFxyXG4gICAgICAgICAgICBlcnJvcixcclxuICAgICAgICAgICAgdGhpcy5jb25zdGFudHM/LnZpZXdUZW5hbnRzPy5lcnJvcnNcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIHJvbGUgbWVudSBIVE1MRWxlbWVudC5cclxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBtZW51QnV0dG9uXHJcbiAgICogQG1lbWJlcm9mIFZpZXdUZW5hbnREZXRhaWxzQ29tcG9uZW50XHJcbiAgICovXHJcbiAgc2VsZWN0ZWRSb2xlTWVudUVsZW1lbnQobWVudUJ1dHRvbjogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgIHRoaXMucm9sZU1lbnVFbGVtZW50ID0gbWVudUJ1dHRvbjtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogT3BlbnMgdGhlIGNvbmZpcm1hdGlvbiBtb2RhbCB0byBnZXQgdXNlciBjb25maXJtYXRpb24gdG8gZGVsZXRlIHRoZSByb2xlLlxyXG4gICAqIEBtZW1iZXJvZiBWaWV3VGVuYW50RGV0YWlsc0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIG9wZW5EZWxldGVSb2xlTW9kYWwoKTogdm9pZCB7XHJcbiAgICBjb25zdCBjb25maXJtYXRpb25JbmZvID0gdGhpcy5jb25zdGFudHM/LnZpZXdUZW5hbnRzPy5jb25maXJtYXRpb25JbmZvO1xyXG4gICAgY29uc3QgZGVsZXRlUm9sZU1vZGFsT3B0aW9ucyA9IHtcclxuICAgICAgbGVmdEJ1dHRvbkxhYmVsOiBjb25maXJtYXRpb25JbmZvPy5sZWZ0QnV0dG9uTGFiZWwsXHJcbiAgICAgIHJpZ2h0QnV0dG9uTGFiZWw6IGNvbmZpcm1hdGlvbkluZm8/LnJpZ2h0QnV0dG9uTGFiZWwsXHJcbiAgICAgIHByb21wdE1lc3NhZ2U6IGAke2NvbmZpcm1hdGlvbkluZm8/LmRlbGV0ZVJvbGVDb25maXJtYXRpb25NZXNzYWdlfSAke3RoaXMuc2VsZWN0ZWRSb2xlSW5mbz8ucm9sZU5hbWV9PyAke2NvbmZpcm1hdGlvbkluZm8/LmRlbGV0ZVJvbGVQcm9tcHRNZXNzYWdlfSAke3RoaXMudGVuYW50RGV0YWlscz8uYXBwVGl0bGV9LmAsXHJcbiAgICAgIGFjdGlvbkJ1dHRvbkFsaWduOiB0aGlzLmFsaWdubWVudFR5cGU/Lk1JRERMRSxcclxuICAgIH07XHJcbiAgICB0aGlzLmRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nPy5vcGVuKE1vZGFsQ29uZmlybWF0aW9uQ29tcG9uZW50LCB7XHJcbiAgICAgIGRhdGE6IGRlbGV0ZVJvbGVNb2RhbE9wdGlvbnMsXHJcbiAgICAgIHdpZHRoOiAnMjUlJyxcclxuICAgICAgcGFuZWxDbGFzczogW1xyXG4gICAgICAgICdpZWVlc2EtbW9kYWwtY29uZmlybS1kaWFsb2cnLFxyXG4gICAgICAgICdpZWVlc2EtZGVsZXRlLXJvbGUtY29uZmlybS1kaWFsb2cnLFxyXG4gICAgICBdLFxyXG4gICAgICBhdXRvRm9jdXM6ICdkaWFsb2cnLFxyXG4gICAgICBhcmlhTGFiZWw6IGNvbmZpcm1hdGlvbkluZm8/LmFyaWFMYWJlbD8uYWxlcnQsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuZGlhbG9nUmVmXHJcbiAgICAgIC5hZnRlckNsb3NlZCgpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSgocmVzdWx0OiBib29sZWFuKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgdGhpcy5kZWxldGVSb2xlKCk7XHJcbiAgICAgICAgfSBlbHNlIHRoaXMucm9sZU1lbnVFbGVtZW50Py5mb2N1cygpO1xyXG4gICAgICB9KTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUGVyZm9ybXMgbmVjZXNzYXJ5IGNsZWFudXAgdGFza3MsIHN1Y2ggYXMgdW5zdWJzY3JpYmluZyBmcm9tIHN1YnNjcmlwdGlvbiB3aGVuIHRoZSBjb21wb25lbnQgaXMgYmVpbmcgZGVzdHJveWVkLlxyXG4gICAqIEBtZW1iZXJvZiBWaWV3VGVuYW50RGV0YWlsc0NvbXBvbmVudFxyXG4gICAqL1xyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5yb2xlVHlwZU9wdGlvbnMgPSBbXTtcclxuICAgIHRoaXMudGVuYW50QXBwU2VydmljZT8uc2V0Um9sZVR5cGVPcHRpb24odGhpcy5yb2xlVHlwZU9wdGlvbnMpO1xyXG4gICAgdGhpcy5kZXN0cm95JD8ubmV4dCh0cnVlKTtcclxuICAgIHRoaXMuZGVzdHJveSQ/LnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXZcclxuICBjbGFzcz1cImllZWVzYS12aWV3LXRlbmFudC1pbmZvIHB4LTQgcGItNFwiXHJcbiAgW25nQ2xhc3NdPVwiXHJcbiAgICBpc01vYmlsZVZpZXdcclxuICAgICAgPyAnaWVlZXNhLXZpZXctdGVuYW50LWluZm8tLWJnLXdoaXRlJ1xyXG4gICAgICA6ICdpZWVlc2Etdmlldy10ZW5hbnQtaW5mby0tYmctYmx1ZSdcclxuICBcIlxyXG4+XHJcbiAgPGRpdlxyXG4gICAgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gZ2FwLWxnLTQgZ2FwLW1kLTMgZ2FwLXNtLTIgZ2FwLTNcIlxyXG4gICAgW25nQ2xhc3NdPVwiaXNNb2JpbGVWaWV3ID8gJ2ZsZXgtY29sdW1uIGdhcC0yIHBiLTMnIDogJ2FsaWduLWl0ZW0tY2VudGVyJ1wiXHJcbiAgPlxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cImQtZmxleCBnYXAtbGctNCBnYXAtbWQtMyBnYXAtc20tMyBnYXAtMyBwcy0wIGFsaWduLWl0ZW1zLW1kLWNlbnRlciBhbGlnbi1pdGVtcy14bC1jZW50ZXJcIlxyXG4gICAgICBbbmdDbGFzc109XCJpc01vYmlsZVZpZXcgPyAnZmxleC1jb2x1bW4nIDogJydcIlxyXG4gICAgPlxyXG4gICAgICA8cFxyXG4gICAgICAgIGNsYXNzPVwibWItMCBpZWVlc2EtaGVhZGxpbmUtbGctMzIgcHktM1wiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwiaXNNb2JpbGVWaWV3ID8gJycgOiAnaWVlZXNhLXZpZXctdGVuYW50LWluZm8tLXRpdGxlJ1wiXHJcbiAgICAgID5cclxuICAgICAgICB7eyB0ZW5hbnREZXRhaWxzPy5hcHBUaXRsZSB9fVxyXG4gICAgICA8L3A+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLWxnLTIgZ2FwLW1kLTIgZ2FwLXNtLTIgZ2FwLTJcIj5cclxuICAgICAgICA8c3BhblxyXG4gICAgICAgICAgY2xhc3M9XCJtYi0wIGllZWVzYS10aXRsZS1zbS0xNCBtdC0xXCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cImlzTW9iaWxlVmlldyA/ICdwLTAnIDogJ2llZWVzYS12aWV3LXRlbmFudC1pbmZvLS1hcHAtaWQnXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyB0ZW5hbnRMYWJlbHM/LmFwcElkIH19OlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgICB7eyB0ZW5hbnREZXRhaWxzPy5hcHBJZCB9fVxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0ZW5hbnREZXRhaWxzPy5hcHBJZCAhPT0gdGVuYW50TGFiZWxzPy5zYUFwcElkXCI+XHJcbiAgICAgICAgICA8bWF0LWRpdmlkZXIgW3ZlcnRpY2FsXT1cInRydWVcIj48L21hdC1kaXZpZGVyPlxyXG4gICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgY2xhc3M9XCJtYi0wIG10LTEgaWVlZXNhLXRpdGxlLXNtLTE0IGllZWVzYS12aWV3LXRlbmFudC1pbmZvLS1hcHAtc3RhdHVzXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiaXNNb2JpbGVWaWV3ID8gJ3AtMCcgOiAnJ1wiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7IHRlbmFudExhYmVscz8uc3RhdHVzIH19OlxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPGllZWVzYS1zbGlkZS10b2dnbGVcclxuICAgICAgICAgICAgW3NsaWRlVG9nZ2xlXT1cInNsaWRlVG9nZ2xlT3B0aW9uXCJcclxuICAgICAgICAgICAgKHNsaWRlVG9nZ2xlQ2hhbmdlKT1cIm9uU2xpZGVUb2dnbGVDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICA+PC9pZWVlc2Etc2xpZGUtdG9nZ2xlPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGFcclxuICAgICAgY2xhc3M9XCJpZWVlc2EtYnRuLWxhYmVsLWxnLWJvbGQtMTYgdGV4dC1kZWNvcmF0aW9uLW5vbmUgbXQtbGctMyBtdC14bC02IHAtc20tMCBwLW1kLTBcIlxyXG4gICAgICBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCJcclxuICAgICAgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiXHJcbiAgICAgIFtyb3V0ZXJMaW5rXT1cInZpZXdUZW5hbnRzUm91dGVVcmxcIlxyXG4gICAgICBbbmdDbGFzc109XCJcclxuICAgICAgICBpc01vYmlsZVZpZXdcclxuICAgICAgICAgID8gJ2llZWVzYS12aWV3LXRlbmFudC1pbmZvLS1saW5rLW1vYmlsZSdcclxuICAgICAgICAgIDogJ2llZWVzYS12aWV3LXRlbmFudC1pbmZvLS1saW5rJ1xyXG4gICAgICBcIlxyXG4gICAgICA+e3sgdGVuYW50TGFiZWxzPy52aWV3QWxsQXBwcyB9fTwvYVxyXG4gICAgPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXZcclxuICAgIGNsYXNzPVwiaWVlZXNhLXZpZXctdGVuYW50LWluZm9fX2FjY29yZGlvbiBpZWVlc2Etdmlldy10ZW5hbnQtaW5mb19fYWNjb3JkaW9uLS1ibHVlLWJnXCJcclxuICAgIFtuZ0NsYXNzXT1cImlzTW9iaWxlVmlldyA/ICdpZWVlc2Etdmlldy10ZW5hbnQtaW5mb19fYWNjb3JkaW9uLS1pbmZvJyA6ICcnXCJcclxuICA+XHJcbiAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICpuZ0Zvcj1cIlxyXG4gICAgICAgIGxldCBhY2NvcmRpb25JbmZvIG9mIGFjY29yZGlvbkluZm9MaXN0O1xyXG4gICAgICAgIHRyYWNrQnk6IHRyYWNrQnlBY2NvcmRpb25GblxyXG4gICAgICBcIlxyXG4gICAgPlxyXG4gICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJhY2NvcmRpb25JbmZvLmlkXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiYWNjb3JkaW9uRGV0YWlscy5CQVNJQ19ERVRBSUxTXCI+XHJcbiAgICAgICAgICA8aWVlZXNhLWFjY29yZGlvblxyXG4gICAgICAgICAgICBbYWNjb3JkaW9uSW5mb109XCJhY2NvcmRpb25JbmZvXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJpZWVlc2Etdmlldy10ZW5hbnQtaW5mb19fYWNjb3JkaW9uLWluZm9cIlxyXG4gICAgICAgICAgICAoYWNjb3JkaW9uT3BlbmVkKT1cInNob3dUZW5hbnREZXRhaWxzKGFjY29yZGlvbkluZm8sICRldmVudClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aWVlZXNhLWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgIGlzQmFzaWNEZXRhaWxzRXhwYW5kZWQgJiZcclxuICAgICAgICAgICAgICAgIHZhbGlkYXRlQWNjZXNzKHBlcm1pc3Npb25UeXBlLk1BTkFHRV9URU5BTlQpXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICBhY3Rpb25zXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJpZWVlc2EtYnV0dG9uXCJcclxuICAgICAgICAgICAgICBbaWNvbkJ1dHRvbl09XCJlZGl0QnV0dG9uXCJcclxuICAgICAgICAgICAgICAoaWNvbkJ1dHRvbkNsaWNrKT1cIm9wZW5FZGl0VGVuYW50Rm9ybSgpXCJcclxuICAgICAgICAgICAgPjwvaWVlZXNhLWljb24tYnV0dG9uPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyIGNvbXBvbmVudCAqbmdJZj1cImlzQmFzaWNEZXRhaWxzRXhwYW5kZWRcIj5cclxuICAgICAgICAgICAgICA8aWVlZXNhLXRlbmFudC1iYXNpYy1kZXRhaWxzXHJcbiAgICAgICAgICAgICAgICBbdGVuYW50RGV0YWlsc109XCJ0ZW5hbnREZXRhaWxzXCJcclxuICAgICAgICAgICAgICA+PC9pZWVlc2EtdGVuYW50LWJhc2ljLWRldGFpbHM+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9pZWVlc2EtYWNjb3JkaW9uPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cImFjY29yZGlvbkRldGFpbHMuUk9MRVNfQU5EX1BFUk1JU1NJT05TXCI+XHJcbiAgICAgICAgICA8aWVlZXNhLWFjY29yZGlvblxyXG4gICAgICAgICAgICBbYWNjb3JkaW9uSW5mb109XCJhY2NvcmRpb25JbmZvXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJpZWVlc2Etdmlldy10ZW5hbnQtaW5mb19fcm9sZXMtYW5kLXBlcm1pc3Npb25zXCJcclxuICAgICAgICAgICAgKGFjY29yZGlvbk9wZW5lZCk9XCJzaG93VGVuYW50RGV0YWlscyhhY2NvcmRpb25JbmZvLCAkZXZlbnQpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgIGFjdGlvbnNcclxuICAgICAgICAgICAgICAqbmdJZj1cImlzUm9sZXNBbmRQZXJtaXNzaW9uc0V4cGFuZGVkXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cImQtZmxleCBnYXAtM1wiXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiXHJcbiAgICAgICAgICAgICAgICBpc01vYmlsZVZpZXcgPyAnbWItMyBweC00JyA6ICdpZWVlc2Etdmlldy10ZW5hbnQtaW5mb19fYWN0aW9ucydcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgbWF0LWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtYXQtdGVydGlhcnktYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImlzTW9iaWxlVmlldyA/ICdwLTAnIDogJ3B4LTIgcHktMidcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5DcmVhdGVSb2xlRm9ybSgpXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwidmFsaWRhdGVBY2Nlc3MocGVybWlzc2lvblR5cGUuTUFOQUdFX1RFTkFOVClcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIHt7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0YW50cy52aWV3Um9sZXNBbmRQZXJtaXNzaW9ucy5hY3Rpb25CdXR0b25MYWJlbHMuYWRkUm9sZVxyXG4gICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICBtYXQtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdC10ZXJ0aWFyeS1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5NYXBSb2xlc0FuZFBlcm1pc3Npb25zRm9ybSgpXCJcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImlzTW9iaWxlVmlldyA/ICdwLTAnIDogJ3B4LTIgcHktMidcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIHt7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0YW50cy52aWV3Um9sZXNBbmRQZXJtaXNzaW9ucy5hY3Rpb25CdXR0b25MYWJlbHNcclxuICAgICAgICAgICAgICAgICAgICAubWFwUGVybWlzc2lvbnNSb2xlc1xyXG4gICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgY29tcG9uZW50ICpuZ0lmPVwiaXNSb2xlc0FuZFBlcm1pc3Npb25zRXhwYW5kZWRcIj5cclxuICAgICAgICAgICAgICA8bWF0LWRpdmlkZXJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaWVlZXNhLXZpZXctdGVuYW50LWluZm9fX3JvbGVzLWFuZC1wZXJtaXNzaW9uc19fZGl2aWRlclwiXHJcbiAgICAgICAgICAgICAgPjwvbWF0LWRpdmlkZXI+XHJcbiAgICAgICAgICAgICAgPGllZWVzYS1kYXRhLXRhYmxlXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtblNjaGVtYS5sZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgW3RhYmxlRGF0YUluZm9dPVwidGFibGVEYXRhXCJcclxuICAgICAgICAgICAgICAgIFtoZWFkZXJFbGVtZW50Q2xhc3NOYW1lXT1cImhlYWRlckVsZW1lbnRDbGFzc05hbWVcIlxyXG4gICAgICAgICAgICAgICAgW2NvbHVtblNjaGVtYUluZm9dPVwiY29sdW1uU2NoZW1hXCJcclxuICAgICAgICAgICAgICAgIFtjYXB0aW9uXT1cInJvbGVzQW5kUGVybWlzc2lvbnNUYWJsZUNhcHRpb25cIlxyXG4gICAgICAgICAgICAgICAgW3BhZ2luYXRvckNvbmZpZ109XCJwYWdpbmF0b3JDb25maWdcIlxyXG4gICAgICAgICAgICAgICAgW3RhYmxlQWN0aW9uc109XCJ0YWJsZUFjdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgW2lzU2Nyb2xsU3VwcG9ydE1lc3NhZ2VOZWVkZWRdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICBbdGFibGVDb2x1bW5BY3Rpb25NZW51U2l6ZV09XCJpY29uU2l6ZVwiXHJcbiAgICAgICAgICAgICAgICBbdGFibGVDb2x1bW5BY3Rpb25zXT1cIm1lbnVJdGVtc1wiXHJcbiAgICAgICAgICAgICAgICBbY3VzdG9tU3RpY2t5SGVhZGVyTmVlZGVkXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgW3RhYmxlQ29sdW1uc0hlYWRlclRleHRdPVwicm9sZXNBbmRQZXJtaXNzaW9uc1RhYmxlSGVhZGVyTmFtZVwiXHJcbiAgICAgICAgICAgICAgICBbc2Nyb2xsYmFyU3VwcG9ydE1lc3NhZ2VdPVwiXHJcbiAgICAgICAgICAgICAgICAgIHJvbGVzQW5kUGVybWlzc2lvbnNUYWJsZVN1cHBvcnRNZXNzYWdlXHJcbiAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgW3ZlcnRpY2FsQ29sdW1uSGVhZGVyTnVtYmVyXT1cInBlcm1pc3Npb25zQ29sdW1uQ2xhc3NOdW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgKHBhZ2luYXRpb25DaGFuZ2UpPVwib25UYWJsZVBhZ2luYXRpb25DaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAodGFibGVDb2x1bW5NZW51QWN0aW9uQ2xpY2spPVwib25Sb2xlTWVudUNsaWNrKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKHRhYmxlQ29sdW1uTWVudVRvZ2dsZUJ1dHRvbik9XCJzZWxlY3RlZFJvbGVNZW51RWxlbWVudCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICA+PC9pZWVlc2EtZGF0YS10YWJsZT5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L2llZWVzYS1hY2NvcmRpb24+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiYWNjb3JkaW9uRGV0YWlscy5HUk9VUF9UWVBFU1wiPlxyXG4gICAgICAgICAgPGllZWVzYS1hY2NvcmRpb25cclxuICAgICAgICAgICAgW2FjY29yZGlvbkluZm9dPVwiYWNjb3JkaW9uSW5mb1wiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiaWVlZXNhLXZpZXctdGVuYW50LWluZm9fX2dyb3VwLXR5cGVzXCJcclxuICAgICAgICAgICAgKGFjY29yZGlvbk9wZW5lZCk9XCJzaG93VGVuYW50RGV0YWlscyhhY2NvcmRpb25JbmZvLCAkZXZlbnQpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgIGFjdGlvbnNcclxuICAgICAgICAgICAgICAqbmdJZj1cImlzR3JvdXBUeXBlc0V4cGFuZGVkXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cImQtZmxleCBnYXAtM1wiXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiXHJcbiAgICAgICAgICAgICAgICBpc01vYmlsZVZpZXcgPyAnbWItMyBweC00JyA6ICdpZWVlc2Etdmlldy10ZW5hbnQtaW5mb19fYWN0aW9ucydcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgbWF0LWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtYXQtdGVydGlhcnktYnV0dG9uIHAtMlwiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInZhbGlkYXRlQWNjZXNzKHBlcm1pc3Npb25UeXBlLk1BTkFHRV9URU5BTlQpXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuQ3JlYXRlR3JvdXBUeXBlRm9ybSgpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB7eyBjb25zdGFudHMudmlld0dyb3VwVHlwZXMuYWN0aW9uQnV0dG9uTGFiZWxzLmFkZEdyb3VwVHlwZSB9fVxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBjb21wb25lbnQgKm5nSWY9XCJpc0dyb3VwVHlwZXNFeHBhbmRlZFwiPlxyXG4gICAgICAgICAgICAgIDxpZWVlc2Etdmlldy10ZW5hbnQtZ3JvdXAtdHlwZXM+PC9pZWVlc2Etdmlldy10ZW5hbnQtZ3JvdXAtdHlwZXM+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9pZWVlc2EtYWNjb3JkaW9uPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdD5cclxuICAgICAgICAgIDxpZWVlc2EtYWNjb3JkaW9uXHJcbiAgICAgICAgICAgIFthY2NvcmRpb25JbmZvXT1cImFjY29yZGlvbkluZm9cIlxyXG4gICAgICAgICAgICAoYWNjb3JkaW9uT3BlbmVkKT1cInNob3dUZW5hbnREZXRhaWxzKGFjY29yZGlvbkluZm8sICRldmVudClcIlxyXG4gICAgICAgICAgPjwvaWVlZXNhLWFjY29yZGlvbj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==