@bnsights/bbsf-admin-portal 1.0.0 → 1.0.5

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 (155) hide show
  1. package/bnsights-bbsf-admin-portal-1.0.5.tgz +0 -0
  2. package/bundles/bnsights-bbsf-admin-portal.umd.js +19694 -20386
  3. package/bundles/bnsights-bbsf-admin-portal.umd.js.map +1 -1
  4. package/esm2015/lib/Pages/_layout/components/aside/aside-menu/aside-menu.component.js +2 -2
  5. package/esm2015/lib/Pages/account/account-routing.module.js +3 -1
  6. package/esm2015/lib/Pages/account/account.component.js +15 -6
  7. package/esm2015/lib/Pages/account/account.module.js +16 -8
  8. package/esm2015/lib/Pages/account/forgot-password/forgot-password.component.js +48 -0
  9. package/esm2015/lib/Pages/configurations/configuration/configuration.component.js +392 -387
  10. package/esm2015/lib/Pages/core/authentication/auth.service.js +1 -2
  11. package/esm2015/lib/Pages/departments/department/department.component.js +59 -98
  12. package/esm2015/lib/Pages/departments/department-info/department-info.component.js +85 -94
  13. package/esm2015/lib/Pages/departments/departments.module.js +4 -1
  14. package/esm2015/lib/Pages/helpCenter/help-center/help-center.component.js +224 -223
  15. package/esm2015/lib/Pages/helpCenter/help-center-secondlevel/help-center-secondlevel.component.js +137 -146
  16. package/esm2015/lib/Pages/helpCenter/help-center-thirdlevel/help-center-thirdlevel.component.js +136 -153
  17. package/esm2015/lib/Pages/home/home.component.js +32 -26
  18. package/esm2015/lib/Pages/home/home.module.js +5 -10
  19. package/esm2015/lib/Pages/impersonation-rules/impersonation-rules/impersonation-rules.component.js +336 -317
  20. package/esm2015/lib/Pages/jobs/jobs/jobs.component.js +168 -227
  21. package/esm2015/lib/Pages/license/license/license.component.js +68 -99
  22. package/esm2015/lib/Pages/localizations/localizations.component.js +378 -341
  23. package/esm2015/lib/Pages/logs/log/log.component.js +18 -27
  24. package/esm2015/lib/Pages/lookups/lookup/lookup.component.js +297 -288
  25. package/esm2015/lib/Pages/lookups/lookup-group/lookup-group.component.js +143 -165
  26. package/esm2015/lib/Pages/lookups/lookup-item/lookup-item.component.js +234 -233
  27. package/esm2015/lib/Pages/lookups/lookups-routing.module.js +2 -2
  28. package/esm2015/lib/Pages/notifications/add/add.component.js +83 -76
  29. package/esm2015/lib/Pages/notifications/edit/edit.component.js +60 -63
  30. package/esm2015/lib/Pages/notifications/edit-email/edit-email.component.js +128 -126
  31. package/esm2015/lib/Pages/notifications/edit-sms/edit-sms.component.js +87 -85
  32. package/esm2015/lib/Pages/notifications/master-layouts/master-layouts.component.js +57 -58
  33. package/esm2015/lib/Pages/notifications/notifications-routing.module.js +1 -3
  34. package/esm2015/lib/Pages/notifications/notifications.module.js +3 -4
  35. package/esm2015/lib/Pages/notifications/template-info/template-info.component.js +232 -228
  36. package/esm2015/lib/Pages/notifications/templates/templates.component.js +347 -310
  37. package/esm2015/lib/Pages/providers/provider/provider.component.js +54 -52
  38. package/esm2015/lib/Pages/publicHolidays/public-holiday/public-holiday.component.js +268 -270
  39. package/esm2015/lib/Pages/roles/permission-set-info/permission-set-info.component.js +136 -152
  40. package/esm2015/lib/Pages/roles/permissions/permissions.component.js +182 -218
  41. package/esm2015/lib/Pages/roles/permissionsets/permissionsets.component.js +219 -254
  42. package/esm2015/lib/Pages/sectors/department-info/department-info.component.js +134 -142
  43. package/esm2015/lib/Pages/sectors/sector/sector.component.js +127 -144
  44. package/esm2015/lib/Pages/sectors/sector-info/sector-info.component.js +123 -139
  45. package/esm2015/lib/Pages/shared/Enums/ConfigurationScope.js +8 -0
  46. package/esm2015/lib/Pages/shared/Enums/ConfigurationType.js +8 -0
  47. package/esm2015/lib/Pages/shared/Enums/ConfigurationValueSource.js +6 -0
  48. package/esm2015/lib/Pages/shared/Enums/ParticipantType.js +8 -0
  49. package/esm2015/lib/Pages/shared/Services/AccountService.service.js +21 -0
  50. package/esm2015/lib/Pages/shared/Services/ConfigurationsService.service.js +15 -12
  51. package/esm2015/lib/Pages/shared/Services/DepartmentService.service.js +5 -8
  52. package/esm2015/lib/Pages/shared/Services/EmailHeaderAndFooterTemplateService.Service.js +10 -9
  53. package/esm2015/lib/Pages/shared/Services/HelpCenterService.service.js +10 -7
  54. package/esm2015/lib/Pages/shared/Services/ImpersonationRuleService.service.js +14 -8
  55. package/esm2015/lib/Pages/shared/Services/LicenseService.service.js +3 -3
  56. package/esm2015/lib/Pages/shared/Services/LogsService.js +1 -1
  57. package/esm2015/lib/Pages/shared/Services/LookupGroupsService.service.js +11 -5
  58. package/esm2015/lib/Pages/shared/Services/LookupService.service.js +31 -15
  59. package/esm2015/lib/Pages/shared/Services/PermissionSetService.service.js +18 -8
  60. package/esm2015/lib/Pages/shared/Services/PermissionsService.service.js +12 -9
  61. package/esm2015/lib/Pages/shared/Services/PublicHolidayService.service.js +9 -3
  62. package/esm2015/lib/Pages/shared/Services/SectorService.service.js +18 -13
  63. package/esm2015/lib/Pages/shared/Services/TemplateService.service.js +36 -29
  64. package/esm2015/lib/Pages/shared/Services/localizationsService.service .js +23 -13
  65. package/esm2015/lib/Pages/shared/Services/provider.service.js +5 -7
  66. package/esm2015/lib/Pages/shared/Services/userService.service.js +10 -2
  67. package/esm2015/lib/Pages/shared/models/AccountModels/forgotPasswordModel.js +6 -0
  68. package/esm2015/lib/Pages/shared/models/ConfigurationModels/ConfigurationModel.js +1 -1
  69. package/esm2015/lib/Pages/shared/models/DepartmentModels/DepartmentUsersIDRequestModel.js +1 -1
  70. package/esm2015/lib/Pages/shared/models/ImpersonationRuleModels/ImpersonationRuleModel.js +1 -1
  71. package/esm2015/lib/Pages/shared/models/Lookups/LookupItem.js +1 -1
  72. package/esm2015/lib/Pages/shared/models/Lookups/LookupModel.js +1 -2
  73. package/esm2015/lib/Pages/shared/models/PermissionsModels/PermissionSetUsersIDRequestModel.js +1 -1
  74. package/esm2015/lib/Pages/shared/models/SectorModels/SectorDepartmentModel.js +1 -1
  75. package/esm2015/lib/Pages/users/users.component.js +398 -409
  76. package/esm2015/lib/masterlayout-routing.module.js +5 -4
  77. package/esm2015/lib/masterlayout.component.js +22 -32
  78. package/esm2015/lib/masterlayout.module.js +25 -19
  79. package/fesm2015/bnsights-bbsf-admin-portal.js +17295 -17401
  80. package/fesm2015/bnsights-bbsf-admin-portal.js.map +1 -1
  81. package/lib/Pages/account/account.component.d.ts +5 -1
  82. package/lib/Pages/account/account.module.d.ts +8 -6
  83. package/lib/Pages/account/forgot-password/forgot-password.component.d.ts +20 -0
  84. package/lib/Pages/configurations/configuration/configuration.component.d.ts +39 -31
  85. package/lib/Pages/departments/department/department.component.d.ts +19 -15
  86. package/lib/Pages/departments/department-info/department-info.component.d.ts +31 -28
  87. package/lib/Pages/helpCenter/help-center/help-center.component.d.ts +34 -32
  88. package/lib/Pages/helpCenter/help-center-secondlevel/help-center-secondlevel.component.d.ts +31 -34
  89. package/lib/Pages/helpCenter/help-center-thirdlevel/help-center-thirdlevel.component.d.ts +30 -35
  90. package/lib/Pages/home/home.component.d.ts +4 -4
  91. package/lib/Pages/impersonation-rules/impersonation-rules/impersonation-rules.component.d.ts +43 -42
  92. package/lib/Pages/jobs/jobs/jobs.component.d.ts +56 -62
  93. package/lib/Pages/license/license/license.component.d.ts +25 -23
  94. package/lib/Pages/localizations/localizations.component.d.ts +77 -65
  95. package/lib/Pages/logs/log/log.component.d.ts +7 -11
  96. package/lib/Pages/lookups/lookup/lookup.component.d.ts +64 -59
  97. package/lib/Pages/lookups/lookup-group/lookup-group.component.d.ts +44 -45
  98. package/lib/Pages/lookups/lookup-item/lookup-item.component.d.ts +62 -56
  99. package/lib/Pages/notifications/add/add.component.d.ts +13 -11
  100. package/lib/Pages/notifications/edit/edit.component.d.ts +14 -14
  101. package/lib/Pages/notifications/edit-email/edit-email.component.d.ts +18 -20
  102. package/lib/Pages/notifications/edit-sms/edit-sms.component.d.ts +15 -16
  103. package/lib/Pages/notifications/master-layouts/master-layouts.component.d.ts +24 -25
  104. package/lib/Pages/notifications/notifications.module.d.ts +15 -16
  105. package/lib/Pages/notifications/template-info/template-info.component.d.ts +32 -32
  106. package/lib/Pages/notifications/templates/templates.component.d.ts +54 -46
  107. package/lib/Pages/providers/provider/provider.component.d.ts +13 -12
  108. package/lib/Pages/publicHolidays/public-holiday/public-holiday.component.d.ts +29 -27
  109. package/lib/Pages/roles/permission-set-info/permission-set-info.component.d.ts +39 -40
  110. package/lib/Pages/roles/permissions/permissions.component.d.ts +49 -54
  111. package/lib/Pages/roles/permissionsets/permissionsets.component.d.ts +53 -55
  112. package/lib/Pages/sectors/department-info/department-info.component.d.ts +41 -44
  113. package/lib/Pages/sectors/sector/sector.component.d.ts +35 -33
  114. package/lib/Pages/sectors/sector-info/sector-info.component.d.ts +40 -44
  115. package/lib/Pages/shared/Enums/ConfigurationScope.d.ts +5 -0
  116. package/lib/Pages/shared/Enums/ConfigurationType.d.ts +6 -0
  117. package/lib/Pages/shared/Enums/ConfigurationValueSource.d.ts +4 -0
  118. package/lib/Pages/shared/Enums/ParticipantType.d.ts +6 -0
  119. package/lib/Pages/shared/Services/AccountService.service.d.ts +10 -0
  120. package/lib/Pages/shared/Services/ConfigurationsService.service.d.ts +7 -8
  121. package/lib/Pages/shared/Services/DepartmentService.service.d.ts +2 -2
  122. package/lib/Pages/shared/Services/EmailHeaderAndFooterTemplateService.Service.d.ts +5 -5
  123. package/lib/Pages/shared/Services/HelpCenterService.service.d.ts +2 -1
  124. package/lib/Pages/shared/Services/ImpersonationRuleService.service.d.ts +5 -5
  125. package/lib/Pages/shared/Services/LicenseService.service.d.ts +2 -2
  126. package/lib/Pages/shared/Services/LookupGroupsService.service.d.ts +4 -4
  127. package/lib/Pages/shared/Services/LookupService.service.d.ts +14 -11
  128. package/lib/Pages/shared/Services/PermissionSetService.service.d.ts +8 -7
  129. package/lib/Pages/shared/Services/PermissionsService.service.d.ts +5 -6
  130. package/lib/Pages/shared/Services/PublicHolidayService.service.d.ts +2 -2
  131. package/lib/Pages/shared/Services/SectorService.service.d.ts +7 -7
  132. package/lib/Pages/shared/Services/TemplateService.service.d.ts +20 -19
  133. package/lib/Pages/shared/Services/localizationsService.service .d.ts +12 -11
  134. package/lib/Pages/shared/Services/provider.service.d.ts +1 -1
  135. package/lib/Pages/shared/Services/userService.service.d.ts +2 -0
  136. package/lib/Pages/shared/models/AccountModels/forgotPasswordModel.d.ts +3 -0
  137. package/lib/Pages/shared/models/ConfigurationModels/ConfigurationModel.d.ts +0 -1
  138. package/lib/Pages/shared/models/DepartmentModels/DepartmentUsersIDRequestModel.d.ts +1 -1
  139. package/lib/Pages/shared/models/ImpersonationRuleModels/ImpersonationRuleModel.d.ts +0 -2
  140. package/lib/Pages/shared/models/Lookups/LookupModel.d.ts +1 -1
  141. package/lib/Pages/shared/models/PermissionsModels/PermissionSetUsersIDRequestModel.d.ts +1 -1
  142. package/lib/Pages/shared/models/SectorModels/SectorDepartmentModel.d.ts +1 -1
  143. package/lib/Pages/users/users.component.d.ts +54 -68
  144. package/lib/masterlayout.component.d.ts +4 -5
  145. package/lib/masterlayout.module.d.ts +8 -9
  146. package/package.json +5 -3
  147. package/src/lib/assets/sass/core/components/_variables.scss +1 -1
  148. package/src/lib/assets/sass/custom-styles-rtl.scss +5 -0
  149. package/src/lib/assets/sass/custom-styles.scss +153 -0
  150. package/src/lib/assets/sass/style-rtl.scss +2 -0
  151. package/src/lib/assets/sass/style.scss +2 -2
  152. package/bnsights-bbsf-admin-portal-0.0.1.tgz +0 -0
  153. package/bnsights-bbsf-admin-portal-1.0.0.tgz +0 -0
  154. package/esm2015/lib/Pages/notifications/edit-template/edit-template.component.js +0 -35
  155. package/lib/Pages/notifications/edit-template/edit-template.component.d.ts +0 -35
@@ -1,161 +1,46 @@
1
- import { __awaiter, __decorate } from "tslib";
2
1
  import { Component, ViewChild } from '@angular/core';
3
2
  import { FormGroup } from '@angular/forms';
4
- import { DropdownOptions, EnglishArabicDTO, FilterItem, FilterType, InputType, MultiLingualTextBoxOptions, PagingOptions, TextBoxOptions } from '@bnsights/bbsf-controls';
5
- import { BlockUI } from 'ng-block-ui';
3
+ import { ConfirmationModalOptions, DropdownOptions, EnglishArabicDTO, FilterItem, FilterType, FormOptions, InputType, MultiLingualTextBoxOptions, PagingOptions, TextBoxOptions } from '@bnsights/bbsf-controls';
6
4
  import { PageInfoService } from '../../../_metronic/core/services/page-info.service';
7
5
  import { PermissionSetModel } from '../../shared/models/PermissionsModels/PermissionSetModel';
8
- import { UsersIDRequestModel } from '../../shared/models/UserModels/UsersIDRequestModel';
9
6
  import * as i0 from "@angular/core";
10
7
  import * as i1 from "../../../_metronic/core/services/page-info.service";
11
8
  import * as i2 from "@bnsights/bbsf-utilities";
12
- import * as i3 from "../../shared/Services/data.service";
13
- import * as i4 from "../../shared/Services/PermissionSetService.service";
14
- import * as i5 from "@ng-bootstrap/ng-bootstrap";
15
- import * as i6 from "ng-block-ui";
16
- import * as i7 from "@bnsights/bbsf-controls";
17
- import * as i8 from "@angular/material/menu";
18
- import * as i9 from "../../empty-data/empty-data.component";
19
- import * as i10 from "@angular/common";
20
- import * as i11 from "@angular/forms";
21
- import * as i12 from "@angular/router";
22
- import * as i13 from "ng-inline-svg";
9
+ import * as i3 from "../../shared/Services/PermissionSetService.service";
10
+ import * as i4 from "@ng-bootstrap/ng-bootstrap";
11
+ import * as i5 from "ng-block-ui";
12
+ import * as i6 from "@bnsights/bbsf-controls";
13
+ import * as i7 from "@angular/material/menu";
14
+ import * as i8 from "../../empty-data/empty-data.component";
15
+ import * as i9 from "@angular/common";
16
+ import * as i10 from "@angular/router";
17
+ import * as i11 from "ng-inline-svg";
23
18
  export class PermissionsetsComponent {
24
- constructor(pageInfoService, utilityService, bbsfTranslateService, environmentService, dataServices, authService, PermissionSetService, modalService) {
19
+ constructor(pageInfoService, utilityService, environmentService, permissionSetService, modalService, requestHandlerService) {
25
20
  this.pageInfoService = pageInfoService;
26
21
  this.utilityService = utilityService;
27
- this.bbsfTranslateService = bbsfTranslateService;
28
22
  this.environmentService = environmentService;
29
- this.dataServices = dataServices;
30
- this.authService = authService;
31
- this.PermissionSetService = PermissionSetService;
23
+ this.permissionSetService = permissionSetService;
32
24
  this.modalService = modalService;
33
- this.SubheaderTitle = this.utilityService.getResourceValue('PermissionSets');
34
- this.ShowToolbar = true;
35
- this.ShowbreadCrumb = false;
36
- this.ApiUrl = "/api/admin/PermissionSets/";
37
- this.PermissionList = [];
38
- this.OrganizationList = [];
25
+ this.requestHandlerService = requestHandlerService;
26
+ //Page requirements
27
+ this.ApiUrl = this.permissionSetService.ApiUrl;
28
+ this.permissionList = [];
29
+ this.organizationList = [];
39
30
  this.filterForm = new FormGroup({});
40
- this.PermissionSetForm = new FormGroup({});
31
+ this.permissionSetForm = new FormGroup({});
41
32
  this.showFilter = false;
42
- this.PermissionSetPagingResult = [];
43
- this.IsFilterLoaded = false;
33
+ this.permissionSetPagingResult = [];
34
+ this.filteredPermissionSetPagingResult = [];
35
+ this.isFilterLoaded = false;
44
36
  //Add Model Controls
45
- this.AddPermissionSetForm = new FormGroup({});
37
+ this.addPermissionSetForm = new FormGroup({});
46
38
  //Edit Model Controls
47
- this.EditPermissionSetForm = new FormGroup({});
48
- //delete Model Controls
49
- this.deletePermissionSetList = [];
50
- this.language = "";
51
- this.ShowPageContent = false;
52
- }
53
- ngOnInit() {
54
- return __awaiter(this, void 0, void 0, function* () {
55
- this.ShowPageContent = true;
56
- PageInfoService.PageTitle = this.utilityService.getResourceValue("PermissionSets");
57
- PageInfoService.PageBreadcrumbs = [
58
- { title: this.utilityService.getResourceValue("Home"), path: '/Admin/Home', isSeparator: false, isActive: false },
59
- { title: '', path: '', isSeparator: true, isActive: false }
60
- ];
61
- this.pageInfoService.calculateTitle();
62
- this.pageInfoService.calculateBreadcrumbs();
63
- this.bbsfTranslateService.onLangChange.subscribe((event) => {
64
- this.ShowPageContent = false;
65
- this.language = event.lang;
66
- this.ngOnInit();
67
- });
68
- this.language = yield this.utilityService.getCurrentLanguage();
69
- this.ProductionMode = this.environmentService.getProductionMode();
70
- this.LoadDropdownLists();
71
- });
72
- }
73
- LoadDropdownLists() {
74
- this.PermissionSetService.Loaddropdowns().subscribe((result) => {
75
- let DropdownsResponseModel = result;
76
- this.OrganizationList = DropdownsResponseModel["organizationList"];
77
- this.PermissionList = DropdownsResponseModel["permissionList"];
78
- // TextBox inti
79
- this.searchTextBox = new TextBoxOptions();
80
- this.searchTextBox.Name = "searchTextBox";
81
- this.searchTextBox.HideLabel = true;
82
- this.searchTextBox.Type = InputType.Text;
83
- this.searchTextBox.Placeholder = this.utilityService.getResourceValue("SearchByName");
84
- this.TextInputFilter = new FilterItem();
85
- this.TextInputFilter.FormControlName = "searchTextBox";
86
- this.TextInputFilter.ActionParameterName = "searchText";
87
- this.TextInputFilter.IsFormControl = true;
88
- this.TextInputFilter.FilterType = FilterType.TextBox;
89
- this.PermissionSetPaging = new PagingOptions();
90
- this.PermissionSetPaging.ActionPostURL = this.environmentService.getApiUrl() + this.ApiUrl + 'GetPermissionSetsByFilter';
91
- this.PermissionSetPaging.OnKeyPressFiltersControlNames = ["searchTextBox"];
92
- this.PermissionSetPaging.Filters = [this.TextInputFilter];
93
- this.PermissionSetPaging.ValidationToken = this.authService.authorizationHeaderValue();
94
- this.IsFilterLoaded = true;
95
- });
96
- }
97
- ReinitializePermissionSetPaging() {
98
- let element = this.input;
99
- element.ReinitializePaging();
100
- }
101
- UpdatePermissionSetPaging() {
102
- let element = this.input;
103
- element.UpdatePaging();
104
- }
105
- setPermissionSetListResult(result) {
106
- console.log(result);
107
- this.PermissionSetPagingResult = result;
108
- this.ShowPageContent = true;
109
- this.utilityService.stopBlockUI();
110
- }
111
- resetFilters() {
112
- this.PermissionSetForm.controls["searchTextBox"].setValue(null);
113
- let element = this.input;
114
- element.ReinitializePaging();
115
- }
116
- showAddPermissionSetModal(addPermissionSetModal) {
117
- this.utilityService.startBlockUI();
118
- this.AddPermissionSetForm = new FormGroup({});
119
- this.MultiLingualName = new MultiLingualTextBoxOptions();
120
- this.MultiLingualName.Name = "Name";
121
- this.MultiLingualName.ArabicLabelKey = "NameInArabic";
122
- this.MultiLingualName.EnglishLabelKey = "NameInEnglish";
123
- this.MultiLingualName.IsRequired = true;
124
- this.MultiLingualName.Value = null;
125
- this.ActiveDirectoryGroup = new TextBoxOptions();
126
- this.ActiveDirectoryGroup.Name = "ActiveDirectoryGroup";
127
- this.ActiveDirectoryGroup.LabelKey = "ActiveDirectoryGroup";
128
- this.ActiveDirectoryGroup.Type = InputType.Text;
129
- this.ActiveDirectoryGroup.Value = null;
130
- this.SysName = new TextBoxOptions();
131
- this.SysName.Name = "SysName";
132
- this.SysName.LabelKey = "SysName";
133
- this.SysName.Type = InputType.Text;
134
- this.SysName.Value = null;
135
- this.Permissions = new DropdownOptions();
136
- this.Permissions.Name = "Permissions";
137
- this.Permissions.LabelKey = "Permissions";
138
- this.Permissions.SelectedItems = null;
139
- this.Permissions.DataSource = this.PermissionList;
140
- this.Permissions.SingleSelection = false;
141
- this.Permissions.AllowSearchFilter = true;
142
- this.Organization = new DropdownOptions();
143
- this.Organization.Name = "Organization";
144
- this.Organization.LabelKey = "Organization";
145
- this.Organization.SelectedItems = null;
146
- this.Organization.DataSource = this.OrganizationList;
147
- this.Organization.SingleSelection = true;
148
- this.Organization.AllowSearchFilter = true;
149
- this.Organization.IsRequired = true;
150
- this.modalService.open(addPermissionSetModal);
151
- this.utilityService.stopBlockUI();
152
- }
153
- addPermissionSet() {
154
- if (this.AddPermissionSetForm.invalid) {
155
- return;
156
- }
157
- else {
158
- let ResultModel = this.AddPermissionSetForm.value;
39
+ this.editPermissionSetForm = new FormGroup({});
40
+ this.deleteControlLoaded = false;
41
+ this.getAddPermissionSetModel = () => {
42
+ let paramArray = [];
43
+ let ResultModel = this.addPermissionSetForm.value;
159
44
  let AddPermissionSetModel = new PermissionSetModel();
160
45
  if (this.ProductionMode == false)
161
46
  AddPermissionSetModel.SysName = ResultModel.SysName;
@@ -170,68 +55,17 @@ export class PermissionsetsComponent {
170
55
  }
171
56
  }
172
57
  AddPermissionSetModel.PermissionIDs = Ids;
173
- this.PermissionSetService.AddPermissionSet(AddPermissionSetModel).subscribe((result) => {
174
- this.modalService.dismissAll();
175
- let element = this.input;
176
- element.ReinitializePaging();
177
- }, (error) => {
178
- });
179
- }
180
- }
181
- showEditPermissionSetModal(PermissionSet, editPermissionSetModal) {
182
- this.utilityService.startBlockUI();
183
- this.EditPermissionSetForm = new FormGroup({});
184
- let Name = new EnglishArabicDTO();
185
- Name.Arabic = PermissionSet.name.arabic;
186
- Name.English = PermissionSet.name.english;
187
- this.EditMultiLingualName = new MultiLingualTextBoxOptions();
188
- this.EditMultiLingualName.Name = "Name";
189
- this.EditMultiLingualName.ArabicLabelKey = "NameInArabic";
190
- this.EditMultiLingualName.EnglishLabelKey = "NameInEnglish";
191
- this.EditMultiLingualName.IsRequired = true;
192
- this.EditMultiLingualName.Value = Name;
193
- this.PermissionSetId = PermissionSet.id;
194
- this.EditActiveDirectoryGroup = new TextBoxOptions();
195
- this.EditActiveDirectoryGroup.Name = "ActiveDirectoryGroup";
196
- this.EditActiveDirectoryGroup.LabelKey = "ActiveDirectoryGroup";
197
- this.EditActiveDirectoryGroup.Type = InputType.Text;
198
- this.EditActiveDirectoryGroup.Value = PermissionSet.activeDirectoryGroup;
199
- this.EditSysName = new TextBoxOptions();
200
- this.EditSysName.Name = "SysName";
201
- this.EditSysName.LabelKey = "SysName";
202
- this.EditSysName.Type = InputType.Text;
203
- this.EditSysName.Value = PermissionSet.sysName;
204
- let selectedPermissionList = [];
205
- for (let index = 0; index < PermissionSet.permissionIDs.length; index++) {
206
- const Permission = this.PermissionList.filter((item) => { return parseInt(item.key) == PermissionSet.permissionIDs[index]; }).map((item) => item.key)[0];
207
- selectedPermissionList.push(Permission);
208
- }
209
- this.EditPermissions = new DropdownOptions();
210
- this.EditPermissions.Name = "Permissions";
211
- this.EditPermissions.LabelKey = "Permissions";
212
- this.EditPermissions.SelectedItems = selectedPermissionList;
213
- this.EditPermissions.DataSource = this.PermissionList;
214
- this.EditPermissions.SingleSelection = false;
215
- this.EditPermissions.AllowSearchFilter = true;
216
- this.EditOrganization = new DropdownOptions();
217
- this.EditOrganization.Name = "Organization";
218
- this.EditOrganization.LabelKey = "Organization";
219
- this.EditOrganization.SelectedItems = this.OrganizationList.filter((item) => { return parseInt(item.key) == PermissionSet.organizationID; }).map((item) => item.key)[0];
220
- this.EditOrganization.DataSource = this.OrganizationList;
221
- this.EditOrganization.SingleSelection = true;
222
- this.EditOrganization.AllowSearchFilter = true;
223
- this.EditOrganization.IsRequired = true;
224
- this.modalService.open(editPermissionSetModal);
225
- this.utilityService.stopBlockUI();
226
- }
227
- editPermissionSet() {
228
- if (this.EditPermissionSetForm.invalid) {
229
- return;
230
- }
231
- else {
232
- let ResultModel = this.EditPermissionSetForm.value;
58
+ paramArray.push(AddPermissionSetModel);
59
+ return paramArray;
60
+ };
61
+ this.getAddPermissionSetFunction = (AddModel) => {
62
+ return this.permissionSetService.addPermissionSet(AddModel);
63
+ };
64
+ this.getEditPermissionSetModel = () => {
65
+ let paramArray = [];
66
+ let ResultModel = this.editPermissionSetForm.value;
233
67
  let EditPermissionSetModel = new PermissionSetModel();
234
- EditPermissionSetModel.Id = this.PermissionSetId;
68
+ EditPermissionSetModel.Id = this.editPermissionSetId;
235
69
  EditPermissionSetModel.Name.Arabic = ResultModel.Name.ArabicValue;
236
70
  EditPermissionSetModel.Name.English = ResultModel.Name.EnglishValue;
237
71
  if (this.ProductionMode == false)
@@ -245,72 +79,203 @@ export class PermissionsetsComponent {
245
79
  }
246
80
  }
247
81
  EditPermissionSetModel.PermissionIDs = Ids;
248
- this.PermissionSetService.EditPermissionSet(EditPermissionSetModel).subscribe((result) => {
249
- this.modalService.dismissAll();
250
- let element = this.input;
251
- element.UpdatePaging();
252
- }, (error) => {
253
- });
254
- }
82
+ paramArray.push(EditPermissionSetModel);
83
+ return paramArray;
84
+ };
85
+ this.getEditPermissionSetFunction = (EditPermissionSetModel) => {
86
+ return this.permissionSetService.editPermissionSet(EditPermissionSetModel);
87
+ };
88
+ this.deletePermissionSet = (id) => {
89
+ return this.permissionSetService.deletePermissionSet(id);
90
+ };
91
+ }
92
+ ngOnInit() {
93
+ //Page header (breadcrumb and title)
94
+ PageInfoService.PageTitle = this.utilityService.getResourceValue("PermissionSets");
95
+ PageInfoService.PageBreadcrumbs = [
96
+ { title: this.utilityService.getResourceValue("Home"), path: '/Admin/Home', isSeparator: false, isActive: false },
97
+ { title: '', path: '', isSeparator: true, isActive: false }
98
+ ];
99
+ this.pageInfoService.calculateTitle();
100
+ this.pageInfoService.calculateBreadcrumbs();
101
+ this.ProductionMode = this.environmentService.getProductionMode();
102
+ //initialize page
103
+ this.initializePage();
255
104
  }
256
- showDeletePermissionSetModal(Resource, deletePermissionSetModal) {
105
+ //initialize page
106
+ initializePage() {
107
+ this.permissionSetService.loadDropdown().subscribe((result) => {
108
+ let dropdownResponseModel = result;
109
+ this.organizationList = dropdownResponseModel["organizationList"];
110
+ this.permissionList = dropdownResponseModel["permissionList"];
111
+ // TextBox inti
112
+ this.searchTextBox = new TextBoxOptions();
113
+ this.searchTextBox.Name = "searchTextBox";
114
+ this.searchTextBox.HideLabel = true;
115
+ this.searchTextBox.Type = InputType.Text;
116
+ this.searchTextBox.Placeholder = this.utilityService.getResourceValue("SearchByName");
117
+ this.textInputFilter = new FilterItem();
118
+ this.textInputFilter.FormControlName = "searchTextBox";
119
+ this.textInputFilter.ActionParameterName = "searchText";
120
+ this.textInputFilter.IsFormControl = true;
121
+ this.textInputFilter.FilterType = FilterType.TextBox;
122
+ this.permissionSetPaging = new PagingOptions();
123
+ this.permissionSetPaging.ActionPostURL = this.ApiUrl + 'GetPermissionSetsByFilter';
124
+ this.permissionSetPaging.OnKeyPressFiltersControlNames = ["searchTextBox"];
125
+ this.permissionSetPaging.Filters = [this.textInputFilter];
126
+ this.isFilterLoaded = true;
127
+ });
128
+ }
129
+ //Paging functions
130
+ setPermissionSetListResult(result) {
131
+ this.permissionSetPagingResult = result;
132
+ this.filteredPermissionSetPagingResult = this.permissionSetPagingResult;
133
+ }
134
+ //Filter functions
135
+ resetFilters() {
136
+ this.permissionSetForm.controls["searchTextBox"].setValue(null);
137
+ let element = this.pagingElement;
138
+ element.ReinitializePaging();
139
+ }
140
+ ///////////// Start add PermissionSet Part//////////////////////
141
+ showAddPermissionSetModal(AddPermissionSetModal) {
257
142
  this.utilityService.startBlockUI();
258
- this.deletePermissionSetList = [];
259
- this.deletePermissionSetList.push(Resource);
260
- this.modalService.open(deletePermissionSetModal);
143
+ this.addPermissionSetForm = new FormGroup({});
144
+ this.addPermissionSetFormOptions = new FormOptions();
145
+ this.addPermissionSetFormOptions.FormGroup = this.addPermissionSetForm;
146
+ this.addPermissionSetFormOptions.GetModelFunction = this.getAddPermissionSetModel;
147
+ this.addPermissionSetFormOptions.ServiceSubmitFunction = this.getAddPermissionSetFunction;
148
+ this.addPermissionSetFormOptions.PagingReference = this.pagingElement;
149
+ this.multiLingualName = new MultiLingualTextBoxOptions();
150
+ this.multiLingualName.Name = "Name";
151
+ this.multiLingualName.ArabicLabelKey = "NameInArabic";
152
+ this.multiLingualName.EnglishLabelKey = "NameInEnglish";
153
+ this.multiLingualName.IsRequired = true;
154
+ this.multiLingualName.Value = null;
155
+ this.activeDirectoryGroup = new TextBoxOptions();
156
+ this.activeDirectoryGroup.Name = "ActiveDirectoryGroup";
157
+ this.activeDirectoryGroup.LabelKey = "ActiveDirectoryGroup";
158
+ this.activeDirectoryGroup.Type = InputType.Text;
159
+ this.activeDirectoryGroup.Value = null;
160
+ this.sysName = new TextBoxOptions();
161
+ this.sysName.Name = "SysName";
162
+ this.sysName.LabelKey = "SysName";
163
+ this.sysName.Type = InputType.Text;
164
+ this.sysName.Value = null;
165
+ this.permissions = new DropdownOptions();
166
+ this.permissions.Name = "Permissions";
167
+ this.permissions.LabelKey = "Permissions";
168
+ this.permissions.SelectedItems = null;
169
+ this.permissions.DataSource = this.permissionList;
170
+ this.permissions.SingleSelection = false;
171
+ this.permissions.AllowSearchFilter = true;
172
+ this.organization = new DropdownOptions();
173
+ this.organization.Name = "Organization";
174
+ this.organization.LabelKey = "Organization";
175
+ this.organization.SelectedItems = null;
176
+ this.organization.DataSource = this.organizationList;
177
+ this.organization.SingleSelection = true;
178
+ this.organization.AllowSearchFilter = true;
179
+ this.organization.IsRequired = true;
180
+ this.modalService.open(AddPermissionSetModal);
261
181
  this.utilityService.stopBlockUI();
262
182
  }
263
- deletePermissionSet() {
264
- let UsersIDModel = new UsersIDRequestModel();
265
- for (let index = 0; index < this.deletePermissionSetList.length; index++) {
266
- const element = this.deletePermissionSetList[index];
267
- UsersIDModel.UsersIDs.push(element.id);
268
- }
269
- this.PermissionSetService.DeletePermissionSet(UsersIDModel).subscribe((result) => {
270
- let data = result;
271
- if (!data.val) {
272
- this.utilityService.notifyErrorMessage(this.utilityService.getResourceValue("CannotDeletePermissionSetHasUsers"));
183
+ //////////// End of add PermissionSet part///////////////////////
184
+ ///////////Start of PermissionSet part//////////////////////
185
+ showEditPermissionSetModal(permissionSetID, editPermissionSetModal) {
186
+ this.editPermissionSetForm = new FormGroup({});
187
+ this.editPermissionSetFormOptions = new FormOptions();
188
+ this.editPermissionSetFormOptions.FormGroup = this.editPermissionSetForm;
189
+ this.editPermissionSetFormOptions.GetModelFunction = this.getEditPermissionSetModel;
190
+ this.editPermissionSetFormOptions.ServiceSubmitFunction = this.getEditPermissionSetFunction;
191
+ this.editPermissionSetFormOptions.PagingReference = this.pagingElement;
192
+ this.permissionSetService.getPermissionSet(permissionSetID).subscribe((result) => {
193
+ let PermissionSet = result.model;
194
+ let name = new EnglishArabicDTO();
195
+ name.Arabic = PermissionSet.name.arabic;
196
+ name.English = PermissionSet.name.english;
197
+ this.editMultiLingualName = new MultiLingualTextBoxOptions();
198
+ this.editMultiLingualName.Name = "Name";
199
+ this.editMultiLingualName.ArabicLabelKey = "NameInArabic";
200
+ this.editMultiLingualName.EnglishLabelKey = "NameInEnglish";
201
+ this.editMultiLingualName.IsRequired = true;
202
+ this.editMultiLingualName.Value = name;
203
+ this.editPermissionSetId = PermissionSet.id;
204
+ this.editActiveDirectoryGroup = new TextBoxOptions();
205
+ this.editActiveDirectoryGroup.Name = "ActiveDirectoryGroup";
206
+ this.editActiveDirectoryGroup.LabelKey = "ActiveDirectoryGroup";
207
+ this.editActiveDirectoryGroup.Type = InputType.Text;
208
+ this.editActiveDirectoryGroup.Value = PermissionSet.activeDirectoryGroup;
209
+ this.editSysName = new TextBoxOptions();
210
+ this.editSysName.Name = "SysName";
211
+ this.editSysName.LabelKey = "SysName";
212
+ this.editSysName.Type = InputType.Text;
213
+ this.editSysName.Value = PermissionSet.sysName;
214
+ let selectedPermissionList = [];
215
+ for (let index = 0; index < PermissionSet.permissionIDs.length; index++) {
216
+ const Permission = this.permissionList.filter((item) => { return parseInt(item.key) == PermissionSet.permissionIDs[index]; }).map((item) => item.key)[0];
217
+ selectedPermissionList.push(Permission);
273
218
  }
274
- else {
275
- this.utilityService.notifySuccessMessage();
276
- }
277
- this.deletePermissionSetList = [];
278
- this.modalService.dismissAll();
279
- let element = this.input;
280
- element.ReinitializePaging();
281
- }, (error) => {
219
+ this.editPermissions = new DropdownOptions();
220
+ this.editPermissions.Name = "Permissions";
221
+ this.editPermissions.LabelKey = "Permissions";
222
+ this.editPermissions.SelectedItems = selectedPermissionList;
223
+ this.editPermissions.DataSource = this.permissionList;
224
+ this.editPermissions.SingleSelection = false;
225
+ this.editPermissions.AllowSearchFilter = true;
226
+ this.editOrganization = new DropdownOptions();
227
+ this.editOrganization.Name = "Organization";
228
+ this.editOrganization.LabelKey = "Organization";
229
+ this.editOrganization.SelectedItems = this.organizationList.filter((item) => { return parseInt(item.key) == PermissionSet.organizationID; }).map((item) => item.key)[0];
230
+ this.editOrganization.DataSource = this.organizationList;
231
+ this.editOrganization.SingleSelection = true;
232
+ this.editOrganization.AllowSearchFilter = true;
233
+ this.editOrganization.IsRequired = true;
234
+ this.modalService.open(editPermissionSetModal);
282
235
  });
283
236
  }
284
- SaveName(name) {
285
- let Name = {
286
- English: name.english,
287
- Arabic: name.arabic,
288
- };
289
- localStorage.setItem("PermissionSetName", JSON.stringify(Name));
237
+ ///////////End of edit PermissionSet part//////////////////////
238
+ ///////////Start of delete PermissionSet part//////////////////////
239
+ showDeletePermissionSetModal(PermissionSetId) {
240
+ this.deleteControlLoaded = false;
241
+ this.deletedPermissionSetId = PermissionSetId;
242
+ //array sent to service function
243
+ let paramArray = [];
244
+ paramArray.push(this.deletedPermissionSetId);
245
+ this.deleteConfirmationOptions = new ConfirmationModalOptions();
246
+ this.deleteConfirmationOptions.ServiceSubmitFunction = this.deletePermissionSet;
247
+ this.deleteConfirmationOptions.ServiceSubmitModel = paramArray;
248
+ this.deleteConfirmationOptions.PagingReference = this.pagingElement;
249
+ this.deleteControlLoaded = true;
250
+ setTimeout(() => {
251
+ this.ConfirmationModalControl.showModal();
252
+ }, 200);
253
+ }
254
+ ///////////End of delete PermissionSet part//////////////////////
255
+ filterPermissionSetList(searchValue) {
256
+ if (searchValue)
257
+ this.filteredPermissionSetPagingResult = this.permissionSetPagingResult.filter(item => item.permissionSetName.toLowerCase().includes(searchValue.toLowerCase()));
258
+ else
259
+ this.filteredPermissionSetPagingResult = this.permissionSetPagingResult;
260
+ }
261
+ ///////////Destroy Observable //////////////////////
262
+ ngOnDestroy() {
263
+ this.requestHandlerService.destroyHandler();
290
264
  }
291
265
  }
292
- PermissionsetsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: PermissionsetsComponent, deps: [{ token: i1.PageInfoService }, { token: i2.UtilityService }, { token: i2.BBSFTranslateService }, { token: i2.EnvironmentService }, { token: i3.DataSecretService }, { token: i2.AuthService }, { token: i4.PermissionSetService }, { token: i5.NgbModal }], target: i0.ɵɵFactoryTarget.Component });
293
- PermissionsetsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.13", type: PermissionsetsComponent, selector: "lib-permissionsets", viewQueries: [{ propertyName: "input", first: true, predicate: ["PermissionSetPagingViewElement"], descendants: true }, { propertyName: "ClosePermissionSetModal", first: true, predicate: ["ClosePermissionSetModal"], descendants: true }, { propertyName: "CloseEditPermissionSetModal", first: true, predicate: ["CloseEditPermissionSetModal"], descendants: true }, { propertyName: "CloseDeletePermissionSetModal", first: true, predicate: ["CloseDeletePermissionSetModal"], descendants: true }], ngImport: i0, template: "<block-ui>\r\n <!-- Subheader -->\r\n <!-- Page Content -->\r\n <div [ngStyle]=\"{'display': ShowPageContent==true?'block':'none'}\" class=\"container-fluid\">\r\n <div class=\"card card-custom-h\">\r\n <div class=\"card-header border-0 pt-5\">\r\n <div class=\"card-title align-items-start flex-column\" *ngIf=\"IsFilterLoaded\">\r\n <form [formGroup]=\"PermissionSetForm\">\r\n <BBSF-TextBox [options]=\"searchTextBox\" [group]=\"PermissionSetForm\"></BBSF-TextBox>\r\n </form>\r\n </div>\r\n <div class=\"card-toolbar\">\r\n <!-- begin::Menu -->\r\n\r\n <button type=\"button\" class=\"btn btn-sm btn-primary\" title=\"Add\" (click)=\"showAddPermissionSetModal(AddPermissionSetModal)\">\r\n <i class=\"fas fa-plus me-1\"></i>\r\n {{utilityService.getResourceValue(\"Add\")}}\r\n </button>\r\n\r\n <!-- end::Menu -->\r\n </div>\r\n </div>\r\n <div class=\"card-body py-3\">\r\n <div class=\"table-responsive\">\r\n <!--begin::Permission list-->\r\n <table class=\"table align-middle table-row-dashed fs-6 gy-5 dataTable no-footer\">\r\n <thead>\r\n <tr class=\"text-start text-gray-400 fw-bolder fs-7 text-uppercase gs-0\">\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"Name\")}}</th>\r\n <th class=\"min-w-150px\" *ngIf=\"!ProductionMode\">{{utilityService.getResourceValue(\"SysName\")}}</th>\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"UsersCount\")}}</th>\r\n <th class=\"min-w-50px\">{{utilityService.getResourceValue(\"Action\")}}</th>\r\n </tr>\r\n </thead>\r\n <tbody id=\"listingContainer\" class=\"fw-bold text-gray-600 border-0\">\r\n\r\n <tr *ngFor=\"let PermissionSet of PermissionSetPagingResult\">\r\n\r\n <td>\r\n <a href=\"javascript:void(0)\" *ngIf=\"language=='en'\" (click)=\"SaveName(PermissionSet.name)\" [routerLink]=\"['/Admin/Roles/PermissionSetInfo',PermissionSet.id]\" routerLinkActive=\"router-link-active\"\r\n class=\"text-dark\">{{PermissionSet.name.english}}</a>\r\n\r\n <a href=\"javascript:void(0)\" *ngIf=\"language=='ar'\" (click)=\"SaveName(PermissionSet.name)\" [routerLink]=\"['/Admin/Roles/PermissionSetInfo',PermissionSet.id]\" routerLinkActive=\"router-link-active\"\r\n class=\"text-dark\">{{PermissionSet.name.arabic}}</a>\r\n\r\n </td>\r\n <td *ngIf=\"!ProductionMode\">{{PermissionSet.sysName}}</td>\r\n <td>{{PermissionSet.usersCount}}</td>\r\n <td>\r\n <div>\r\n <button mat-button [matMenuTriggerFor]=\"menu\" class=\"btn btn-sm btn-icon btn-light btn-active-light-primary\">\r\n <i class=\"fa fa-ellipsis-h\" aria-hidden=\"true\"></i>\r\n </button>\r\n <mat-menu #menu=\"matMenu\">\r\n <a class=\"drop-item px-3\" ngbDropdownItem\r\n (click)=\"showEditPermissionSetModal(PermissionSet,EditPermissionSetModal)\">\r\n <span class=\"drop-link px-3\">{{utilityService.getResourceValue(\"Edit\")}}</span>\r\n </a>\r\n <a ngbDropdownItem class=\"drop-item px-3\"\r\n (click)=\"showDeletePermissionSetModal(PermissionSet,deletePermissionSetModal)\">\r\n <span class=\"drop-link px-3\">{{utilityService.getResourceValue(\"Delete\")}}</span>\r\n </a>\r\n </mat-menu>\r\n </div>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"PermissionSetPagingResult.length == 0\">\r\n <td [attr.colspan]=\"ProductionMode ? '3' : '4'\">\r\n <lib-empty-data></lib-empty-data>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <!--end::Permission list-->\r\n </div>\r\n\r\n </div>\r\n <div class=\"card-footer border-0\">\r\n <BBSF-Paging (Items)=\"setPermissionSetListResult($event)\" *ngIf=\"IsFilterLoaded\"\r\n [options]=\"PermissionSetPaging\" [group]=\"PermissionSetForm\" #PermissionSetPagingViewElement>\r\n </BBSF-Paging>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n <!-- Add Modal -->\r\n <ng-template #AddPermissionSetModal let-modal>\r\n <div class=\"modal-header pb-0 border-0 justify-content-end\">\r\n <h5 class=\"modal-title\" id=\"exampleModalLabel\"></h5>\r\n <button type=\"button\" data-dismiss=\"modal\" aria-label=\"Close\" (click)=\"modal.dismiss()\" class=\"btn btn-sm btn-icon btn-active-color-primary\">\r\n <span class=\"svg-icon svg-icon-1\">\r\n <span [inlineSVG]=\"'./src/assets/images/arr061.svg'\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body scroll-y px-10 px-lg-15 pt-0 pb-15\">\r\n <div class=\"mb-13 text-center\">\r\n <h1 class=\"mb-3\">{{utilityService.getResourceValue(\"AddPermissionSet\")}}</h1>\r\n </div>\r\n <form [formGroup]=\"AddPermissionSetForm\" (ngSubmit)=\"addPermissionSet()\">\r\n <BBSF-MultiLingualTextBox [options]=\"MultiLingualName\" [group]=\"AddPermissionSetForm\"></BBSF-MultiLingualTextBox>\r\n <BBSF-TextBox [options]=\"ActiveDirectoryGroup\" [group]=\"AddPermissionSetForm\">\r\n </BBSF-TextBox>\r\n <BBSF-TextBox *ngIf=\"!ProductionMode\" [options]=\"SysName\" [group]=\"AddPermissionSetForm\">\r\n </BBSF-TextBox>\r\n <BBSF-DropdownList [options]=\"Permissions\" [group]=\"AddPermissionSetForm\">\r\n </BBSF-DropdownList>\r\n <BBSF-DropdownList [options]=\"Organization\" [group]=\"AddPermissionSetForm\">\r\n </BBSF-DropdownList>\r\n <div class=\"text-center pt-7\">\r\n <button type=\"button\" #ClosePermissionSetModal id=\"ClosePermissionSetModal\" data-dismiss=\"modal\" aria-label=\"Close\" class=\"btn btn-light me-3 btn-sm\" (click)=\"modal.dismiss()\">{{utilityService.getResourceValue(\"CancelLabel\")}} </button>\r\n <button type=\"submit\" class=\"btn btn-primary btn-sm\">{{utilityService.getResourceValue(\"SaveLabel\")}}</button>\r\n </div>\r\n </form>\r\n\r\n </div>\r\n </ng-template>\r\n\r\n\r\n\r\n <!-- Edit Modal -->\r\n <ng-template #EditPermissionSetModal let-modal>\r\n <div class=\"modal-header pb-0 border-0 justify-content-end\">\r\n <h5 class=\"modal-title\" id=\"exampleModalLabel\"></h5>\r\n <button type=\"button\" data-dismiss=\"modal\" aria-label=\"Close\" (click)=\"modal.dismiss()\" class=\"btn btn-sm btn-icon btn-active-color-primary\">\r\n <span class=\"svg-icon svg-icon-1\">\r\n <span [inlineSVG]=\"'./src/assets/images/arr061.svg'\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body scroll-y px-10 px-lg-15 pt-0 pb-15\">\r\n <div class=\"mb-13 text-center\">\r\n <h1 class=\"mb-3\">{{utilityService.getResourceValue(\"EditPermissionSet\")}}</h1>\r\n </div>\r\n <form [formGroup]=\"EditPermissionSetForm\" (ngSubmit)=\"editPermissionSet()\">\r\n <BBSF-MultiLingualTextBox [options]=\"EditMultiLingualName\" [group]=\"EditPermissionSetForm\"></BBSF-MultiLingualTextBox>\r\n <BBSF-TextBox [options]=\"EditActiveDirectoryGroup\" [group]=\"EditPermissionSetForm\">\r\n </BBSF-TextBox>\r\n <div *ngIf=\"!ProductionMode\">\r\n <BBSF-TextBox [options]=\"EditSysName\" [group]=\"EditPermissionSetForm\">\r\n </BBSF-TextBox>\r\n </div>\r\n <BBSF-DropdownList [options]=\"EditPermissions\" [group]=\"EditPermissionSetForm\">\r\n </BBSF-DropdownList>\r\n <BBSF-DropdownList [options]=\"EditOrganization\" [group]=\"EditPermissionSetForm\">\r\n </BBSF-DropdownList>\r\n <div class=\"text-center pt-7\">\r\n <button type=\"button\" #CloseEditPermissionSetModal id=\"CloseEditPermissionSetModal\" data-dismiss=\"modal\" aria-label=\"Close\" class=\"btn btn-light me-3 btn-sm\" (click)=\"modal.dismiss()\">{{utilityService.getResourceValue(\"CancelLabel\")}} </button>\r\n <button type=\"submit\" class=\"btn btn-primary btn-sm\">{{utilityService.getResourceValue(\"SaveLabel\")}}</button>\r\n </div>\r\n </form>\r\n\r\n </div>\r\n </ng-template>\r\n\r\n\r\n\r\n <!-- Delete Modal -->\r\n <ng-template #deletePermissionSetModal let-modal>\r\n <div class=\"modal-header pb-0 border-0 justify-content-end\">\r\n <h5 class=\"modal-title\" id=\"exampleModalLabel\"></h5>\r\n <button type=\"button\" data-dismiss=\"modal\" aria-label=\"Close\" class=\"btn btn-sm btn-icon btn-active-color-primary\" (click)=\"modal.dismiss()\">\r\n <span class=\"svg-icon svg-icon-1\">\r\n <span [inlineSVG]=\"'./src/assets/images/arr061.svg'\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body scroll-y px-10 px-lg-15 pt-0 pb-15\">\r\n <div class=\"mb-13 text-center\">\r\n <h1 class=\"mb-3\">{{utilityService.getResourceValue(\"Delete\")}} {{utilityService.getResourceValue(\"PermissionSet\")}}</h1>\r\n </div>\r\n <div class=\"notice d-flex bg-light-danger rounded border-danger border border-dashed mb-10 p-6\">\r\n <span class=\"svg-icon svg-icon-2tx svg-icon-danger me-4\">\r\n <span [inlineSVG]=\"'./src/assets/images/gen044.svg'\"></span>\r\n </span>\r\n\r\n <div class=\"d-flex flex-stack flex-grow-1\">\r\n <div class=\"fw-bold\">\r\n <div class=\"fs-6 text-gray-700\">\r\n {{utilityService.getResourceValue(\"Delete_Question\")}}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"text-center pt-7\">\r\n <button #CloseDeletePermissionSetModal id=\"CloseDeletePermissionSetModal\" type=\"button\"\r\n class=\"btn btn-light btn-sm me-3 \" data-dismiss=\"modal\" (click)=\"modal.dismiss()\">\r\n {{utilityService.getResourceValue(\"CancelLabel\")}}\r\n </button>\r\n <button type=\"button\" (click)=\"deletePermissionSet()\"\r\n class=\"btn btn-light-danger btn-sm \">\r\n {{utilityService.getResourceValue(\"Delete\")}}\r\n </button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n\r\n", components: [{ type: i6.BlockUIComponent, selector: "block-ui", inputs: ["name", "template", "message", "delayStart", "delayStop"] }, { type: i7.ɵd, selector: "BBSF-TextBox", inputs: ["group", "options"], outputs: ["OnChange"] }, { type: i8.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { type: i9.EmptyDataComponent, selector: "lib-empty-data", inputs: ["Message", "ShowImage", "ImgURL"] }, { type: i7.ɵs, selector: "BBSF-Paging", inputs: ["options", "group"], outputs: ["Items"] }, { type: i7.ɵc, selector: "BBSF-MultiLingualTextBox", inputs: ["group", "options"], outputs: ["OnChange"] }, { type: i7.ɵh, selector: "BBSF-DropdownList", inputs: ["group", "options"], outputs: ["OnChange", "onClear"] }], directives: [{ type: i10.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i11.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i11.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i11.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i12.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["routerLink", "target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo"] }, { type: i12.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "routerLinkActive"], exportAs: ["routerLinkActive"] }, { type: i8.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["matMenuTriggerRestoreFocus", "mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { type: i5.NgbDropdownItem, selector: "[ngbDropdownItem]", inputs: ["disabled"] }, { type: i13.InlineSVGDirective, selector: "[inlineSVG]", inputs: ["resolveSVGUrl", "replaceContents", "prepend", "injectComponent", "cacheSVG", "forceEvalStyles", "evalScripts", "inlineSVG", "setSVGAttributes", "removeSVGAttributes", "fallbackImgUrl", "onSVGLoaded"], outputs: ["onSVGInserted", "onSVGFailed"] }] });
294
- __decorate([
295
- BlockUI()
296
- ], PermissionsetsComponent.prototype, "blockUI", void 0);
266
+ PermissionsetsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: PermissionsetsComponent, deps: [{ token: i1.PageInfoService }, { token: i2.UtilityService }, { token: i2.EnvironmentService }, { token: i3.PermissionSetService }, { token: i4.NgbModal }, { token: i2.RequestHandlerService }], target: i0.ɵɵFactoryTarget.Component });
267
+ PermissionsetsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.13", type: PermissionsetsComponent, selector: "lib-permissionsets", viewQueries: [{ propertyName: "pagingElement", first: true, predicate: ["PermissionSetPagingViewElement"], descendants: true }, { propertyName: "ConfirmationModalControl", first: true, predicate: ["ConfirmationModalControl"], descendants: true }], ngImport: i0, template: "<block-ui>\r\n <!-- Subheader -->\r\n <!-- Page Content -->\r\n <div class=\"container-fluid\">\r\n <div class=\"card card-custom-h\">\r\n <div class=\"card-header border-0 pt-5\">\r\n <div class=\"card-title align-items-start flex-column\" *ngIf=\"isFilterLoaded\">\r\n <BBSF-TextBox [options]=\"searchTextBox\" (OnChange)=\"filterPermissionSetList($event)\" [group]=\"permissionSetForm\"></BBSF-TextBox>\r\n \r\n </div>\r\n <div class=\"card-toolbar\">\r\n <!-- begin::Menu -->\r\n\r\n <button type=\"button\" class=\"btn btn-sm btn-primary\" title=\"Add\" (click)=\"showAddPermissionSetModal(AddPermissionSetModal)\">\r\n <i class=\"fas fa-plus me-1\"></i>\r\n {{utilityService.getResourceValue(\"Add\")}}\r\n </button>\r\n\r\n <!-- end::Menu -->\r\n </div>\r\n </div>\r\n <div class=\"card-body py-3\">\r\n <div class=\"table-responsive\">\r\n <!--begin::Permission list-->\r\n <table class=\"table align-middle table-row-dashed fs-6 gy-5 dataTable no-footer\">\r\n <thead>\r\n <tr class=\"text-start text-gray-400 fw-bolder fs-7 text-uppercase gs-0\">\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"Name\")}}</th>\r\n <th class=\"min-w-150px\" *ngIf=\"!ProductionMode\">{{utilityService.getResourceValue(\"SysName\")}}</th>\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"UsersCount\")}}</th>\r\n <th class=\"min-w-50px\">{{utilityService.getResourceValue(\"Action\")}}</th>\r\n </tr>\r\n </thead>\r\n <tbody id=\"listingContainer\" class=\"fw-bold text-gray-600 border-0\">\r\n\r\n <tr *ngFor=\"let PermissionSet of filteredPermissionSetPagingResult\">\r\n\r\n <td>\r\n <a href=\"javascript:void(0)\" [routerLink]=\"['/Admin/Roles/PermissionSetInfo',PermissionSet.permsetIDEnc]\" routerLinkActive=\"router-link-active\"\r\n class=\"text-dark\">{{PermissionSet.permissionSetName}}</a>\r\n\r\n\r\n </td>\r\n <td *ngIf=\"!ProductionMode\">{{PermissionSet.sysName}}</td>\r\n <td>{{PermissionSet.usersCount}}</td>\r\n <td>\r\n <div>\r\n <button mat-button [matMenuTriggerFor]=\"menu\" class=\"btn btn-sm btn-icon btn-light btn-active-light-primary\">\r\n <i class=\"fa fa-ellipsis-h\" aria-hidden=\"true\"></i>\r\n </button>\r\n <mat-menu #menu=\"matMenu\">\r\n <a class=\"drop-item px-3\" ngbDropdownItem\r\n (click)=\"showEditPermissionSetModal(PermissionSet.permsetIDEnc,EditPermissionSetModal)\">\r\n <span class=\"drop-link px-3\">{{utilityService.getResourceValue(\"Edit\")}}</span>\r\n </a>\r\n <a ngbDropdownItem class=\"drop-item px-3\"\r\n (click)=\"showDeletePermissionSetModal(PermissionSet.permsetIDEnc)\">\r\n <span class=\"drop-link px-3\">{{utilityService.getResourceValue(\"Delete\")}}</span>\r\n </a>\r\n </mat-menu>\r\n </div>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"filteredPermissionSetPagingResult.length == 0\">\r\n <td [attr.colspan]=\"ProductionMode ? '3' : '4'\">\r\n <lib-empty-data></lib-empty-data>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <!--end::Permission list-->\r\n </div>\r\n\r\n </div>\r\n <div class=\"card-footer border-0\">\r\n <BBSF-Paging (Items)=\"setPermissionSetListResult($event)\" *ngIf=\"isFilterLoaded\"\r\n [options]=\"permissionSetPaging\" [group]=\"permissionSetForm\" #PermissionSetPagingViewElement>\r\n </BBSF-Paging>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n <!-- Add Modal -->\r\n <ng-template #AddPermissionSetModal let-modal>\r\n <div class=\"modal-header pb-0 border-0 justify-content-end\">\r\n <h5 class=\"modal-title\" id=\"exampleModalLabel\"></h5>\r\n <button type=\"button\" data-dismiss=\"modal\" aria-label=\"Close\" (click)=\"modal.dismiss()\" class=\"btn btn-sm btn-icon btn-active-color-primary\">\r\n <span class=\"svg-icon svg-icon-1\">\r\n <span [inlineSVG]=\"'./src/assets/images/arr061.svg'\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body scroll-y px-10 px-lg-15 pt-0 pb-15\">\r\n <div class=\"mb-13 text-center\">\r\n <h1 class=\"mb-3\">{{utilityService.getResourceValue(\"AddPermissionSet\")}}</h1>\r\n </div>\r\n <BBSF-Form [options]=\"addPermissionSetFormOptions\">\r\n <BBSF-MultiLingualTextBox [options]=\"multiLingualName\" [group]=\"addPermissionSetForm\"></BBSF-MultiLingualTextBox>\r\n <BBSF-TextBox [options]=\"activeDirectoryGroup\" [group]=\"addPermissionSetForm\">\r\n </BBSF-TextBox>\r\n <BBSF-TextBox *ngIf=\"!ProductionMode\" [options]=\"sysName\" [group]=\"addPermissionSetForm\">\r\n </BBSF-TextBox>\r\n <BBSF-DropdownList [options]=\"permissions\" [group]=\"addPermissionSetForm\">\r\n </BBSF-DropdownList>\r\n <BBSF-DropdownList [options]=\"organization\" [group]=\"addPermissionSetForm\">\r\n </BBSF-DropdownList>\r\n <div class=\"text-center pt-7\">\r\n <button type=\"button\" #ClosePermissionSetModal id=\"ClosePermissionSetModal\" data-dismiss=\"modal\" aria-label=\"Close\" class=\"btn btn-light me-3 btn-sm\" (click)=\"modal.dismiss()\">{{utilityService.getResourceValue(\"CancelLabel\")}} </button>\r\n <button type=\"submit\" class=\"btn btn-primary btn-sm\">{{utilityService.getResourceValue(\"SaveLabel\")}}</button>\r\n </div>\r\n </BBSF-Form>\r\n\r\n </div>\r\n </ng-template>\r\n\r\n\r\n\r\n <!-- Edit Modal -->\r\n <ng-template #EditPermissionSetModal let-modal>\r\n <div class=\"modal-header pb-0 border-0 justify-content-end\">\r\n <h5 class=\"modal-title\" id=\"exampleModalLabel\"></h5>\r\n <button type=\"button\" data-dismiss=\"modal\" aria-label=\"Close\" (click)=\"modal.dismiss()\" class=\"btn btn-sm btn-icon btn-active-color-primary\">\r\n <span class=\"svg-icon svg-icon-1\">\r\n <span [inlineSVG]=\"'./src/assets/images/arr061.svg'\"></span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body scroll-y px-10 px-lg-15 pt-0 pb-15\">\r\n <div class=\"mb-13 text-center\">\r\n <h1 class=\"mb-3\">{{utilityService.getResourceValue(\"EditPermissionSet\")}}</h1>\r\n </div>\r\n <BBSF-Form [options]=\"editPermissionSetFormOptions\">\r\n <BBSF-MultiLingualTextBox [options]=\"editMultiLingualName\" [group]=\"editPermissionSetForm\"></BBSF-MultiLingualTextBox>\r\n <BBSF-TextBox [options]=\"editActiveDirectoryGroup\" [group]=\"editPermissionSetForm\">\r\n </BBSF-TextBox>\r\n <div *ngIf=\"!ProductionMode\">\r\n <BBSF-TextBox [options]=\"editSysName\" [group]=\"editPermissionSetForm\">\r\n </BBSF-TextBox>\r\n </div>\r\n <BBSF-DropdownList [options]=\"editPermissions\" [group]=\"editPermissionSetForm\">\r\n </BBSF-DropdownList>\r\n <BBSF-DropdownList [options]=\"editOrganization\" [group]=\"editPermissionSetForm\">\r\n </BBSF-DropdownList>\r\n <div class=\"text-center pt-7\">\r\n <button type=\"button\" #CloseEditPermissionSetModal id=\"CloseEditPermissionSetModal\" data-dismiss=\"modal\" aria-label=\"Close\" class=\"btn btn-light me-3 btn-sm\" (click)=\"modal.dismiss()\">{{utilityService.getResourceValue(\"CancelLabel\")}} </button>\r\n <button type=\"submit\" class=\"btn btn-primary btn-sm\">{{utilityService.getResourceValue(\"SaveLabel\")}}</button>\r\n </div>\r\n </BBSF-Form>\r\n\r\n </div>\r\n </ng-template>\r\n\r\n\r\n <!--delete Modal-->\r\n <BBSF-ConfirmationModal *ngIf=\"deleteControlLoaded\" [options]=\"deleteConfirmationOptions\" id=\"ConfirmationModalControl\"\r\n #ConfirmationModalControl></BBSF-ConfirmationModal>\r\n ", components: [{ type: i5.BlockUIComponent, selector: "block-ui", inputs: ["name", "template", "message", "delayStart", "delayStop"] }, { type: i6.ɵd, selector: "BBSF-TextBox", inputs: ["group", "options"], outputs: ["OnChange"] }, { type: i7.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { type: i8.EmptyDataComponent, selector: "lib-empty-data", inputs: ["Message", "ShowImage", "ImgURL"] }, { type: i6.ɵs, selector: "BBSF-Paging", inputs: ["options", "group"], outputs: ["Items"] }, { type: i6.ɵv, selector: "BBSF-Form", inputs: ["options"] }, { type: i6.ɵc, selector: "BBSF-MultiLingualTextBox", inputs: ["group", "options"], outputs: ["OnChange"] }, { type: i6.ɵh, selector: "BBSF-DropdownList", inputs: ["group", "options"], outputs: ["OnChange", "onClear"] }, { type: i6.ɵw, selector: "BBSF-ConfirmationModal", inputs: ["options"] }], directives: [{ type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i10.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["routerLink", "target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo"] }, { type: i10.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "routerLinkActive"], exportAs: ["routerLinkActive"] }, { type: i7.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["matMenuTriggerRestoreFocus", "mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { type: i4.NgbDropdownItem, selector: "[ngbDropdownItem]", inputs: ["disabled"] }, { type: i11.InlineSVGDirective, selector: "[inlineSVG]", inputs: ["resolveSVGUrl", "replaceContents", "prepend", "injectComponent", "cacheSVG", "forceEvalStyles", "evalScripts", "inlineSVG", "setSVGAttributes", "removeSVGAttributes", "fallbackImgUrl", "onSVGLoaded"], outputs: ["onSVGInserted", "onSVGFailed"] }] });
297
268
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: PermissionsetsComponent, decorators: [{
298
269
  type: Component,
299
270
  args: [{
300
271
  selector: 'lib-permissionsets',
301
272
  templateUrl: './permissionsets.component.html'
302
273
  }]
303
- }], ctorParameters: function () { return [{ type: i1.PageInfoService }, { type: i2.UtilityService }, { type: i2.BBSFTranslateService }, { type: i2.EnvironmentService }, { type: i3.DataSecretService }, { type: i2.AuthService }, { type: i4.PermissionSetService }, { type: i5.NgbModal }]; }, propDecorators: { input: [{
274
+ }], ctorParameters: function () { return [{ type: i1.PageInfoService }, { type: i2.UtilityService }, { type: i2.EnvironmentService }, { type: i3.PermissionSetService }, { type: i4.NgbModal }, { type: i2.RequestHandlerService }]; }, propDecorators: { pagingElement: [{
304
275
  type: ViewChild,
305
276
  args: ['PermissionSetPagingViewElement', { static: false }]
306
- }], ClosePermissionSetModal: [{
307
- type: ViewChild,
308
- args: ['ClosePermissionSetModal', { static: false }]
309
- }], CloseEditPermissionSetModal: [{
310
- type: ViewChild,
311
- args: ['CloseEditPermissionSetModal', { static: false }]
312
- }], CloseDeletePermissionSetModal: [{
277
+ }], ConfirmationModalControl: [{
313
278
  type: ViewChild,
314
- args: ['CloseDeletePermissionSetModal', { static: false }]
315
- }], blockUI: [] } });
316
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbnNldHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmJzZi1hZG1pbi1wb3J0YWwvc3JjL2xpYi9QYWdlcy9yb2xlcy9wZXJtaXNzaW9uc2V0cy9wZXJtaXNzaW9uc2V0cy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYnNmLWFkbWluLXBvcnRhbC9zcmMvbGliL1BhZ2VzL3JvbGVzL3Blcm1pc3Npb25zZXRzL3Blcm1pc3Npb25zZXRzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFzQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsMEJBQTBCLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzFLLE9BQU8sRUFBRSxPQUFPLEVBQWEsTUFBTSxhQUFhLENBQUM7QUFDakQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBEQUEwRCxDQUFDO0FBQzlGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9EQUFvRCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUFXekYsTUFBTSxPQUFPLHVCQUF1QjtJQStDbEMsWUFBb0IsZUFBK0IsRUFBUyxjQUE2QixFQUFTLG9CQUF5QyxFQUFTLGtCQUFxQyxFQUFTLFlBQStCLEVBQVUsV0FBd0IsRUFBVSxvQkFBMEMsRUFBVSxZQUFzQjtRQUFuVSxvQkFBZSxHQUFmLGVBQWUsQ0FBZ0I7UUFBUyxtQkFBYyxHQUFkLGNBQWMs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LEdBQUcsSUFBSSxDQUFDLEtBQVksQ0FBQztZQUNoQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMvQixDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUViLENBQUMsQ0FBQyxDQUFBO0lBRUosQ0FBQztJQUVELFFBQVEsQ0FBQyxJQUFJO1FBQ1gsSUFBSSxJQUFJLEdBQUc7WUFDUCxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1NBQ3RCLENBQUM7UUFDRixZQUFZLENBQUMsT0FBTyxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNwRSxDQUFDOztxSEF6VVksdUJBQXVCO3lHQUF2Qix1QkFBdUIsc2lCQ2pCcEMsbTdVQXdNQTtBRDNJYTtJQUFWLE9BQU8sRUFBRTt3REFBb0I7NEZBNUNuQix1QkFBdUI7a0JBSm5DLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLG9CQUFvQjtvQkFDOUIsV0FBVyxFQUFFLGlDQUFpQztpQkFDL0M7MlRBa0JpRSxLQUFLO3NCQUFwRSxTQUFTO3VCQUFDLGdDQUFnQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFVTCx1QkFBdUI7c0JBQS9FLFNBQVM7dUJBQUMseUJBQXlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQVVNLDJCQUEyQjtzQkFBdkYsU0FBUzt1QkFBQyw2QkFBNkIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBSUksNkJBQTZCO3NCQUEzRixTQUFTO3VCQUFDLCtCQUErQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFHbEQsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBEcm9wZG93bk9wdGlvbnMsIEVuZ2xpc2hBcmFiaWNEVE8sIEZpbHRlckl0ZW0sIEZpbHRlclR5cGUsIElucHV0VHlwZSwgTXVsdGlMaW5ndWFsVGV4dEJveE9wdGlvbnMsIFBhZ2luZ09wdGlvbnMsIFRleHRCb3hPcHRpb25zIH0gZnJvbSAnQGJuc2lnaHRzL2Jic2YtY29udHJvbHMnO1xyXG5pbXBvcnQgeyBCbG9ja1VJLCBOZ0Jsb2NrVUkgfSBmcm9tICduZy1ibG9jay11aSc7XHJcbmltcG9ydCB7IFBhZ2VJbmZvU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL19tZXRyb25pYy9jb3JlL3NlcnZpY2VzL3BhZ2UtaW5mby5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUGVybWlzc2lvblNldE1vZGVsIH0gZnJvbSAnLi4vLi4vc2hhcmVkL21vZGVscy9QZXJtaXNzaW9uc01vZGVscy9QZXJtaXNzaW9uU2V0TW9kZWwnO1xyXG5pbXBvcnQgeyBVc2Vyc0lEUmVxdWVzdE1vZGVsIH0gZnJvbSAnLi4vLi4vc2hhcmVkL21vZGVscy9Vc2VyTW9kZWxzL1VzZXJzSURSZXF1ZXN0TW9kZWwnO1xyXG5pbXBvcnQgeyBEYXRhU2VjcmV0U2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9TZXJ2aWNlcy9kYXRhLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQZXJtaXNzaW9uU2V0U2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9TZXJ2aWNlcy9QZXJtaXNzaW9uU2V0U2VydmljZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTmdiTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XHJcbmltcG9ydCB7IEF1dGhTZXJ2aWNlLCBVdGlsaXR5U2VydmljZSwgQkJTRlRyYW5zbGF0ZVNlcnZpY2UsIEVudmlyb25tZW50U2VydmljZSB9IGZyb20gJ0BibnNpZ2h0cy9iYnNmLXV0aWxpdGllcyc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItcGVybWlzc2lvbnNldHMnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9wZXJtaXNzaW9uc2V0cy5jb21wb25lbnQuaHRtbCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFBlcm1pc3Npb25zZXRzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBTdWJoZWFkZXJUaXRsZSA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZSgnUGVybWlzc2lvblNldHMnKTtcclxuICBcclxuXHJcbiAgU2hvd1Rvb2xiYXIgPSB0cnVlOyBTaG93YnJlYWRDcnVtYiA9IGZhbHNlO1xyXG4gIEFwaVVybCA9IFwiL2FwaS9hZG1pbi9QZXJtaXNzaW9uU2V0cy9cIlxyXG4gIHNlYXJjaFRleHRCb3g6IFRleHRCb3hPcHRpb25zO1xyXG4gIFBlcm1pc3Npb25MaXN0ID0gW107XHJcbiAgT3JnYW5pemF0aW9uTGlzdCA9IFtdO1xyXG4gIGZpbHRlckZvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuICBQZXJtaXNzaW9uU2V0Rm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gIHNob3dGaWx0ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBQZXJtaXNzaW9uU2V0UGFnaW5nUmVzdWx0OiBhbnlbXSA9IFtdO1xyXG4gIFBlcm1pc3Npb25TZXRQYWdpbmc6IFBhZ2luZ09wdGlvbnM7XHJcbiAgVGV4dElucHV0RmlsdGVyOiBGaWx0ZXJJdGVtO1xyXG4gIElzRmlsdGVyTG9hZGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgUHJvZHVjdGlvbk1vZGU6IGJvb2xlYW47XHJcbiAgQFZpZXdDaGlsZCgnUGVybWlzc2lvblNldFBhZ2luZ1ZpZXdFbGVtZW50JywgeyBzdGF0aWM6IGZhbHNlIH0pIGlucHV0OiBFbGVtZW50UmVmO1xyXG5cclxuXHJcbiAgLy9BZGQgTW9kZWwgQ29udHJvbHNcclxuICBBZGRQZXJtaXNzaW9uU2V0Rm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gIE11bHRpTGluZ3VhbE5hbWU6TXVsdGlMaW5ndWFsVGV4dEJveE9wdGlvbnNcclxuICBTeXNOYW1lOiBUZXh0Qm94T3B0aW9ucztcclxuICBBY3RpdmVEaXJlY3RvcnlHcm91cDogVGV4dEJveE9wdGlvbnM7XHJcbiAgUGVybWlzc2lvbnM6IERyb3Bkb3duT3B0aW9ucztcclxuICBPcmdhbml6YXRpb246IERyb3Bkb3duT3B0aW9ucztcclxuICBAVmlld0NoaWxkKCdDbG9zZVBlcm1pc3Npb25TZXRNb2RhbCcsIHsgc3RhdGljOiBmYWxzZSB9KSBDbG9zZVBlcm1pc3Npb25TZXRNb2RhbDogRWxlbWVudFJlZjtcclxuXHJcbiAgLy9FZGl0IE1vZGVsIENvbnRyb2xzXHJcbiAgRWRpdFBlcm1pc3Npb25TZXRGb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcbiAgRWRpdE11bHRpTGluZ3VhbE5hbWU6TXVsdGlMaW5ndWFsVGV4dEJveE9wdGlvbnNcclxuICBFZGl0U3lzTmFtZTogVGV4dEJveE9wdGlvbnM7XHJcbiAgRWRpdEFjdGl2ZURpcmVjdG9yeUdyb3VwOiBUZXh0Qm94T3B0aW9ucztcclxuICBFZGl0UGVybWlzc2lvbnM6IERyb3Bkb3duT3B0aW9ucztcclxuICBFZGl0T3JnYW5pemF0aW9uOiBEcm9wZG93bk9wdGlvbnM7XHJcbiAgUGVybWlzc2lvblNldElkOiBudW1iZXI7XHJcbiAgQFZpZXdDaGlsZCgnQ2xvc2VFZGl0UGVybWlzc2lvblNldE1vZGFsJywgeyBzdGF0aWM6IGZhbHNlIH0pIENsb3NlRWRpdFBlcm1pc3Npb25TZXRNb2RhbDogRWxlbWVudFJlZjtcclxuXHJcbiAgLy9kZWxldGUgIE1vZGVsIENvbnRyb2xzXHJcbiAgZGVsZXRlUGVybWlzc2lvblNldExpc3Q6IGFueVtdID0gW11cclxuICBAVmlld0NoaWxkKCdDbG9zZURlbGV0ZVBlcm1pc3Npb25TZXRNb2RhbCcsIHsgc3RhdGljOiBmYWxzZSB9KSBDbG9zZURlbGV0ZVBlcm1pc3Npb25TZXRNb2RhbDogRWxlbWVudFJlZjtcclxuICBsYW5ndWFnZTpzdHJpbmc9XCJcIlxyXG4gIC8vIERlY29yYXRvciB3aXJlcyB1cCBibG9ja1VJIGluc3RhbmNlXHJcbiAgQEJsb2NrVUkoKSBibG9ja1VJOiBOZ0Jsb2NrVUk7XHJcbiAgU2hvd1BhZ2VDb250ZW50OmJvb2xlYW49ZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcGFnZUluZm9TZXJ2aWNlOlBhZ2VJbmZvU2VydmljZSwgcHVibGljIHV0aWxpdHlTZXJ2aWNlOlV0aWxpdHlTZXJ2aWNlLHByaXZhdGUgYmJzZlRyYW5zbGF0ZVNlcnZpY2U6QkJTRlRyYW5zbGF0ZVNlcnZpY2UscHJpdmF0ZSBlbnZpcm9ubWVudFNlcnZpY2U6RW52aXJvbm1lbnRTZXJ2aWNlLHByaXZhdGUgZGF0YVNlcnZpY2VzOiBEYXRhU2VjcmV0U2VydmljZSwgcHJpdmF0ZSBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsIHByaXZhdGUgUGVybWlzc2lvblNldFNlcnZpY2U6IFBlcm1pc3Npb25TZXRTZXJ2aWNlLCBwcml2YXRlIG1vZGFsU2VydmljZTogTmdiTW9kYWwpIHtcclxuICB9XHJcblxyXG4gIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5TaG93UGFnZUNvbnRlbnQ9dHJ1ZTtcclxuICAgIFBhZ2VJbmZvU2VydmljZS5QYWdlVGl0bGU9dGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiUGVybWlzc2lvblNldHNcIilcclxuICAgIFBhZ2VJbmZvU2VydmljZS5QYWdlQnJlYWRjcnVtYnM9W1xyXG4gICAgICAge3RpdGxlOiB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJIb21lXCIpICwgcGF0aDogJy9BZG1pbi9Ib21lJywgaXNTZXBhcmF0b3I6IGZhbHNlLCBpc0FjdGl2ZTogZmFsc2V9LFxyXG4gICAgICAge3RpdGxlOiAnJywgcGF0aDogJycsIGlzU2VwYXJhdG9yOiB0cnVlLCBpc0FjdGl2ZTogZmFsc2V9XHJcblxyXG4gICAgXTtcclxuICAgIFxyXG4gICAgdGhpcy5wYWdlSW5mb1NlcnZpY2UuY2FsY3VsYXRlVGl0bGUoKTtcclxuICAgIHRoaXMucGFnZUluZm9TZXJ2aWNlLmNhbGN1bGF0ZUJyZWFkY3J1bWJzKCk7XHJcbiAgICB0aGlzLmJic2ZUcmFuc2xhdGVTZXJ2aWNlLm9uTGFuZ0NoYW5nZS5zdWJzY3JpYmUoKGV2ZW50KT0+e1xyXG4gICAgICB0aGlzLlNob3dQYWdlQ29udGVudD1mYWxzZTtcclxuICAgICAgdGhpcy5sYW5ndWFnZSA9IGV2ZW50Lmxhbmc7XHJcbiAgICAgIHRoaXMubmdPbkluaXQoKTtcclxuICAgIH0pXHJcbiAgICB0aGlzLmxhbmd1YWdlID0gIGF3YWl0IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0Q3VycmVudExhbmd1YWdlKCk7XHJcbiAgICB0aGlzLlByb2R1Y3Rpb25Nb2RlID0gdGhpcy5lbnZpcm9ubWVudFNlcnZpY2UuZ2V0UHJvZHVjdGlvbk1vZGUoKVxyXG4gICAgdGhpcy5Mb2FkRHJvcGRvd25MaXN0cygpO1xyXG4gIH1cclxuIFxyXG4gXHJcbiAgTG9hZERyb3Bkb3duTGlzdHMoKSB7XHJcblxyXG4gICAgdGhpcy5QZXJtaXNzaW9uU2V0U2VydmljZS5Mb2FkZHJvcGRvd25zKCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcclxuICAgICAgbGV0IERyb3Bkb3duc1Jlc3BvbnNlTW9kZWwgPSByZXN1bHQ7XHJcbiAgICAgIHRoaXMuT3JnYW5pemF0aW9uTGlzdCA9IERyb3Bkb3duc1Jlc3BvbnNlTW9kZWxbXCJvcmdhbml6YXRpb25MaXN0XCJdO1xyXG4gICAgICB0aGlzLlBlcm1pc3Npb25MaXN0ID0gRHJvcGRvd25zUmVzcG9uc2VNb2RlbFtcInBlcm1pc3Npb25MaXN0XCJdO1xyXG4gICAgICAvLyBUZXh0Qm94IGludGlcclxuICAgICAgdGhpcy5zZWFyY2hUZXh0Qm94ID0gbmV3IFRleHRCb3hPcHRpb25zKCk7XHJcbiAgICAgIHRoaXMuc2VhcmNoVGV4dEJveC5OYW1lID0gXCJzZWFyY2hUZXh0Qm94XCJcclxuICAgICAgdGhpcy5zZWFyY2hUZXh0Qm94LkhpZGVMYWJlbCA9IHRydWU7XHJcbiAgICAgIHRoaXMuc2VhcmNoVGV4dEJveC5UeXBlID0gSW5wdXRUeXBlLlRleHRcclxuICAgICAgdGhpcy5zZWFyY2hUZXh0Qm94LlBsYWNlaG9sZGVyID0gdGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiU2VhcmNoQnlOYW1lXCIpO1xyXG5cclxuICAgICAgdGhpcy5UZXh0SW5wdXRGaWx0ZXIgPSBuZXcgRmlsdGVySXRlbSgpO1xyXG4gICAgICB0aGlzLlRleHRJbnB1dEZpbHRlci5Gb3JtQ29udHJvbE5hbWUgPSBcInNlYXJjaFRleHRCb3hcIlxyXG4gICAgICB0aGlzLlRleHRJbnB1dEZpbHRlci5BY3Rpb25QYXJhbWV0ZXJOYW1lID0gXCJzZWFyY2hUZXh0XCJcclxuICAgICAgdGhpcy5UZXh0SW5wdXRGaWx0ZXIuSXNGb3JtQ29udHJvbCA9IHRydWVcclxuICAgICAgdGhpcy5UZXh0SW5wdXRGaWx0ZXIuRmlsdGVyVHlwZSA9IEZpbHRlclR5cGUuVGV4dEJveFxyXG5cclxuICAgICAgdGhpcy5QZXJtaXNzaW9uU2V0UGFnaW5nID0gbmV3IFBhZ2luZ09wdGlvbnMoKTtcclxuICAgICAgdGhpcy5QZXJtaXNzaW9uU2V0UGFnaW5nLkFjdGlvblBvc3RVUkwgPSB0aGlzLmVudmlyb25tZW50U2VydmljZS5nZXRBcGlVcmwoKSArIHRoaXMuQXBpVXJsICsgJ0dldFBlcm1pc3Npb25TZXRzQnlGaWx0ZXInO1xyXG4gICAgICB0aGlzLlBlcm1pc3Npb25TZXRQYWdpbmcuT25LZXlQcmVzc0ZpbHRlcnNDb250cm9sTmFtZXMgPSBbXCJzZWFyY2hUZXh0Qm94XCJdXHJcbiAgICAgIHRoaXMuUGVybWlzc2lvblNldFBhZ2luZy5GaWx0ZXJzID0gW3RoaXMuVGV4dElucHV0RmlsdGVyXVxyXG4gICAgICB0aGlzLlBlcm1pc3Npb25TZXRQYWdpbmcuVmFsaWRhdGlvblRva2VuID0gdGhpcy5hdXRoU2VydmljZS5hdXRob3JpemF0aW9uSGVhZGVyVmFsdWUoKVxyXG4gICAgICB0aGlzLklzRmlsdGVyTG9hZGVkID0gdHJ1ZTtcclxuICAgICAgIFxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIFJlaW5pdGlhbGl6ZVBlcm1pc3Npb25TZXRQYWdpbmcoKSB7XHJcbiAgICBsZXQgZWxlbWVudCA9IHRoaXMuaW5wdXQgYXMgYW55O1xyXG4gICAgZWxlbWVudC5SZWluaXRpYWxpemVQYWdpbmcoKTtcclxuICB9XHJcblxyXG4gIFVwZGF0ZVBlcm1pc3Npb25TZXRQYWdpbmcoKSB7XHJcbiAgICBsZXQgZWxlbWVudCA9IHRoaXMuaW5wdXQgYXMgYW55O1xyXG4gICAgZWxlbWVudC5VcGRhdGVQYWdpbmcoKTtcclxuICB9XHJcblxyXG4gIHNldFBlcm1pc3Npb25TZXRMaXN0UmVzdWx0KHJlc3VsdCkge1xyXG4gICAgY29uc29sZS5sb2cocmVzdWx0KTtcclxuICAgIHRoaXMuUGVybWlzc2lvblNldFBhZ2luZ1Jlc3VsdCA9IHJlc3VsdFxyXG4gICAgdGhpcy5TaG93UGFnZUNvbnRlbnQ9dHJ1ZTtcclxuICAgIHRoaXMudXRpbGl0eVNlcnZpY2Uuc3RvcEJsb2NrVUkoKVxyXG4gIH1cclxuXHJcbiAgcmVzZXRGaWx0ZXJzKCkge1xyXG4gICAgdGhpcy5QZXJtaXNzaW9uU2V0Rm9ybS5jb250cm9sc1tcInNlYXJjaFRleHRCb3hcIl0uc2V0VmFsdWUobnVsbCk7XHJcbiAgICBsZXQgZWxlbWVudCA9IHRoaXMuaW5wdXQgYXMgYW55O1xyXG4gICAgZWxlbWVudC5SZWluaXRpYWxpemVQYWdpbmcoKTtcclxuICB9XHJcblxyXG4gIHNob3dBZGRQZXJtaXNzaW9uU2V0TW9kYWwoYWRkUGVybWlzc2lvblNldE1vZGFsKSB7XHJcbiAgICB0aGlzLnV0aWxpdHlTZXJ2aWNlLnN0YXJ0QmxvY2tVSSgpO1xyXG4gICAgdGhpcy5BZGRQZXJtaXNzaW9uU2V0Rm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG5cclxuICAgIHRoaXMuTXVsdGlMaW5ndWFsTmFtZSA9IG5ldyBNdWx0aUxpbmd1YWxUZXh0Qm94T3B0aW9ucygpO1xyXG4gICAgdGhpcy5NdWx0aUxpbmd1YWxOYW1lLk5hbWUgPSBcIk5hbWVcIjtcclxuICAgIHRoaXMuTXVsdGlMaW5ndWFsTmFtZS5BcmFiaWNMYWJlbEtleSA9IFwiTmFtZUluQXJhYmljXCI7XHJcbiAgICB0aGlzLk11bHRpTGluZ3VhbE5hbWUuRW5nbGlzaExhYmVsS2V5ID0gXCJOYW1lSW5FbmdsaXNoXCI7XHJcbiAgICB0aGlzLk11bHRpTGluZ3VhbE5hbWUuSXNSZXF1aXJlZCA9IHRydWU7XHJcbiAgICB0aGlzLk11bHRpTGluZ3VhbE5hbWUuVmFsdWUgPSBudWxsO1xyXG5cclxuICAgIHRoaXMuQWN0aXZlRGlyZWN0b3J5R3JvdXAgPSBuZXcgVGV4dEJveE9wdGlvbnMoKTtcclxuICAgIHRoaXMuQWN0aXZlRGlyZWN0b3J5R3JvdXAuTmFtZSA9IFwiQWN0aXZlRGlyZWN0b3J5R3JvdXBcIjtcclxuICAgIHRoaXMuQWN0aXZlRGlyZWN0b3J5R3JvdXAuTGFiZWxLZXkgPSBcIkFjdGl2ZURpcmVjdG9yeUdyb3VwXCI7XHJcbiAgICB0aGlzLkFjdGl2ZURpcmVjdG9yeUdyb3VwLlR5cGUgPSBJbnB1dFR5cGUuVGV4dDtcclxuICAgIHRoaXMuQWN0aXZlRGlyZWN0b3J5R3JvdXAuVmFsdWUgPSBudWxsO1xyXG5cclxuXHJcbiAgICB0aGlzLlN5c05hbWUgPSBuZXcgVGV4dEJveE9wdGlvbnMoKTtcclxuICAgIHRoaXMuU3lzTmFtZS5OYW1lID0gXCJTeXNOYW1lXCI7XHJcbiAgICB0aGlzLlN5c05hbWUuTGFiZWxLZXkgPSBcIlN5c05hbWVcIjtcclxuICAgIHRoaXMuU3lzTmFtZS5UeXBlID0gSW5wdXRUeXBlLlRleHQ7XHJcbiAgICB0aGlzLlN5c05hbWUuVmFsdWUgPSBudWxsO1xyXG5cclxuICAgIHRoaXMuUGVybWlzc2lvbnMgPSBuZXcgRHJvcGRvd25PcHRpb25zKCk7XHJcbiAgICB0aGlzLlBlcm1pc3Npb25zLk5hbWUgPSBcIlBlcm1pc3Npb25zXCJcclxuICAgIHRoaXMuUGVybWlzc2lvbnMuTGFiZWxLZXkgPSBcIlBlcm1pc3Npb25zXCJcclxuICAgIHRoaXMuUGVybWlzc2lvbnMuU2VsZWN0ZWRJdGVtcyA9IG51bGw7XHJcbiAgICB0aGlzLlBlcm1pc3Npb25zLkRhdGFTb3VyY2UgPSB0aGlzLlBlcm1pc3Npb25MaXN0XHJcbiAgICB0aGlzLlBlcm1pc3Npb25zLlNpbmdsZVNlbGVjdGlvbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5QZXJtaXNzaW9ucy5BbGxvd1NlYXJjaEZpbHRlciA9IHRydWU7XHJcblxyXG5cclxuICAgIHRoaXMuT3JnYW5pemF0aW9uID0gbmV3IERyb3Bkb3duT3B0aW9ucygpO1xyXG4gICAgdGhpcy5Pcmdhbml6YXRpb24uTmFtZSA9IFwiT3JnYW5pemF0aW9uXCJcclxuICAgIHRoaXMuT3JnYW5pemF0aW9uLkxhYmVsS2V5ID0gXCJPcmdhbml6YXRpb25cIlxyXG4gICAgdGhpcy5Pcmdhbml6YXRpb24uU2VsZWN0ZWRJdGVtcyA9IG51bGw7XHJcbiAgICB0aGlzLk9yZ2FuaXphdGlvbi5EYXRhU291cmNlID0gdGhpcy5Pcmdhbml6YXRpb25MaXN0XHJcbiAgICB0aGlzLk9yZ2FuaXphdGlvbi5TaW5nbGVTZWxlY3Rpb24gPSB0cnVlO1xyXG4gICAgdGhpcy5Pcmdhbml6YXRpb24uQWxsb3dTZWFyY2hGaWx0ZXIgPSB0cnVlO1xyXG4gICAgdGhpcy5Pcmdhbml6YXRpb24uSXNSZXF1aXJlZCA9IHRydWU7XHJcblxyXG4gICAgdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihhZGRQZXJtaXNzaW9uU2V0TW9kYWwpO1xyXG4gICAgdGhpcy51dGlsaXR5U2VydmljZS5zdG9wQmxvY2tVSSgpO1xyXG4gIH1cclxuXHJcbiAgYWRkUGVybWlzc2lvblNldCgpIHtcclxuICAgIGlmICh0aGlzLkFkZFBlcm1pc3Npb25TZXRGb3JtLmludmFsaWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBSZXN1bHRNb2RlbCA9IHRoaXMuQWRkUGVybWlzc2lvblNldEZvcm0udmFsdWU7XHJcbiAgICAgIGxldCBBZGRQZXJtaXNzaW9uU2V0TW9kZWw6UGVybWlzc2lvblNldE1vZGVsPSBuZXcgUGVybWlzc2lvblNldE1vZGVsKCkgO1xyXG4gICAgICBpZiAodGhpcy5Qcm9kdWN0aW9uTW9kZSA9PSBmYWxzZSlcclxuICAgICAgICBBZGRQZXJtaXNzaW9uU2V0TW9kZWwuU3lzTmFtZSA9IFJlc3VsdE1vZGVsLlN5c05hbWU7XHJcbiAgICAgIEFkZFBlcm1pc3Npb25TZXRNb2RlbC5OYW1lLkFyYWJpYyA9IFJlc3VsdE1vZGVsLk5hbWUuQXJhYmljVmFsdWU7XHJcbiAgICAgIEFkZFBlcm1pc3Npb25TZXRNb2RlbC5OYW1lLkVuZ2xpc2ggPSBSZXN1bHRNb2RlbC5OYW1lLkVuZ2xpc2hWYWx1ZTtcclxuICAgIFxyXG4gICAgICBBZGRQZXJtaXNzaW9uU2V0TW9kZWwuT3JnYW5pemF0aW9uSUQgPSBOdW1iZXIoUmVzdWx0TW9kZWwuT3JnYW5pemF0aW9uKTtcclxuICAgICAgbGV0IElkcyA9IFtdO1xyXG4gICAgICBpZiAoUmVzdWx0TW9kZWwuUGVybWlzc2lvbnMgIT0gbnVsbCkge1xyXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBSZXN1bHRNb2RlbC5QZXJtaXNzaW9ucy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBSZXN1bHRNb2RlbC5QZXJtaXNzaW9uc1tpbmRleF07XHJcbiAgICAgICAgICBJZHMucHVzaChOdW1iZXIoZWxlbWVudCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBBZGRQZXJtaXNzaW9uU2V0TW9kZWwuUGVybWlzc2lvbklEcyA9SWRzO1xyXG4gICAgICB0aGlzLlBlcm1pc3Npb25TZXRTZXJ2aWNlLkFkZFBlcm1pc3Npb25TZXQoQWRkUGVybWlzc2lvblNldE1vZGVsKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgIHRoaXMubW9kYWxTZXJ2aWNlLmRpc21pc3NBbGwoKTtcclxuICAgICAgICBsZXQgZWxlbWVudCA9IHRoaXMuaW5wdXQgYXMgYW55O1xyXG4gICAgICAgIGVsZW1lbnQuUmVpbml0aWFsaXplUGFnaW5nKCk7XHJcbiAgICAgIH0sIChlcnJvcikgPT4ge1xyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIHNob3dFZGl0UGVybWlzc2lvblNldE1vZGFsKFBlcm1pc3Npb25TZXQ6IGFueSwgZWRpdFBlcm1pc3Npb25TZXRNb2RhbCkge1xyXG4gICAgdGhpcy51dGlsaXR5U2VydmljZS5zdGFydEJsb2NrVUkoKTtcclxuICAgIHRoaXMuRWRpdFBlcm1pc3Npb25TZXRGb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcblxyXG4gICAgbGV0IE5hbWU9bmV3IEVuZ2xpc2hBcmFiaWNEVE8oKTtcclxuICAgIE5hbWUuQXJhYmljPVBlcm1pc3Npb25TZXQubmFtZS5hcmFiaWM7XHJcbiAgICBOYW1lLkVuZ2xpc2g9UGVybWlzc2lvblNldC5uYW1lLmVuZ2xpc2g7XHJcblxyXG4gICAgdGhpcy5FZGl0TXVsdGlMaW5ndWFsTmFtZSA9IG5ldyBNdWx0aUxpbmd1YWxUZXh0Qm94T3B0aW9ucygpO1xyXG4gICAgdGhpcy5FZGl0TXVsdGlMaW5ndWFsTmFtZS5OYW1lID0gXCJOYW1lXCI7XHJcbiAgICB0aGlzLkVkaXRNdWx0aUxpbmd1YWxOYW1lLkFyYWJpY0xhYmVsS2V5ID0gXCJOYW1lSW5BcmFiaWNcIjtcclxuICAgIHRoaXMuRWRpdE11bHRpTGluZ3VhbE5hbWUuRW5nbGlzaExhYmVsS2V5ID0gXCJOYW1lSW5FbmdsaXNoXCI7XHJcbiAgICB0aGlzLkVkaXRNdWx0aUxpbmd1YWxOYW1lLklzUmVxdWlyZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5FZGl0TXVsdGlMaW5ndWFsTmFtZS5WYWx1ZSA9IE5hbWU7XHJcblxyXG4gICAgdGhpcy5QZXJtaXNzaW9uU2V0SWQgPSBQZXJtaXNzaW9uU2V0LmlkXHJcblxyXG4gICAgdGhpcy5FZGl0QWN0aXZlRGlyZWN0b3J5R3JvdXAgPSBuZXcgVGV4dEJveE9wdGlvbnMoKTtcclxuICAgIHRoaXMuRWRpdEFjdGl2ZURpcmVjdG9yeUdyb3VwLk5hbWUgPSBcIkFjdGl2ZURpcmVjdG9yeUdyb3VwXCI7XHJcbiAgICB0aGlzLkVkaXRBY3RpdmVEaXJlY3RvcnlHcm91cC5MYWJlbEtleSA9IFwiQWN0aXZlRGlyZWN0b3J5R3JvdXBcIjtcclxuICAgIHRoaXMuRWRpdEFjdGl2ZURpcmVjdG9yeUdyb3VwLlR5cGUgPSBJbnB1dFR5cGUuVGV4dDtcclxuICAgIHRoaXMuRWRpdEFjdGl2ZURpcmVjdG9yeUdyb3VwLlZhbHVlID0gUGVybWlzc2lvblNldC5hY3RpdmVEaXJlY3RvcnlHcm91cDtcclxuXHJcblxyXG4gICAgdGhpcy5FZGl0U3lzTmFtZSA9IG5ldyBUZXh0Qm94T3B0aW9ucygpO1xyXG4gICAgdGhpcy5FZGl0U3lzTmFtZS5OYW1lID0gXCJTeXNOYW1lXCI7XHJcbiAgICB0aGlzLkVkaXRTeXNOYW1lLkxhYmVsS2V5ID0gXCJTeXNOYW1lXCI7XHJcbiAgICB0aGlzLkVkaXRTeXNOYW1lLlR5cGUgPSBJbnB1dFR5cGUuVGV4dDtcclxuICAgIHRoaXMuRWRpdFN5c05hbWUuVmFsdWUgPSBQZXJtaXNzaW9uU2V0LnN5c05hbWU7XHJcblxyXG5cclxuICAgIGxldCBzZWxlY3RlZFBlcm1pc3Npb25MaXN0ID0gW107XHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgUGVybWlzc2lvblNldC5wZXJtaXNzaW9uSURzLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICBjb25zdCBQZXJtaXNzaW9uID0gdGhpcy5QZXJtaXNzaW9uTGlzdC5maWx0ZXIoKGl0ZW0pID0+IHsgcmV0dXJuIHBhcnNlSW50KGl0ZW0ua2V5KSA9PSBQZXJtaXNzaW9uU2V0LnBlcm1pc3Npb25JRHNbaW5kZXhdOyB9KS5tYXAoKGl0ZW0pID0+IGl0ZW0ua2V5KVswXTtcclxuICAgICAgc2VsZWN0ZWRQZXJtaXNzaW9uTGlzdC5wdXNoKFBlcm1pc3Npb24pXHJcbiAgICB9XHJcbiAgICB0aGlzLkVkaXRQZXJtaXNzaW9ucyA9IG5ldyBEcm9wZG93bk9wdGlvbnMoKTtcclxuICAgIHRoaXMuRWRpdFBlcm1pc3Npb25zLk5hbWUgPSBcIlBlcm1pc3Npb25zXCJcclxuICAgIHRoaXMuRWRpdFBlcm1pc3Npb25zLkxhYmVsS2V5ID0gXCJQZXJtaXNzaW9uc1wiXHJcbiAgICB0aGlzLkVkaXRQZXJtaXNzaW9ucy5TZWxlY3RlZEl0ZW1zID0gc2VsZWN0ZWRQZXJtaXNzaW9uTGlzdDtcclxuICAgIHRoaXMuRWRpdFBlcm1pc3Npb25zLkRhdGFTb3VyY2UgPSB0aGlzLlBlcm1pc3Npb25MaXN0XHJcbiAgICB0aGlzLkVkaXRQZXJtaXNzaW9ucy5TaW5nbGVTZWxlY3Rpb24gPSBmYWxzZTtcclxuICAgIHRoaXMuRWRpdFBlcm1pc3Npb25zLkFsbG93U2VhcmNoRmlsdGVyID0gdHJ1ZTtcclxuXHJcbiAgICB0aGlzLkVkaXRPcmdhbml6YXRpb24gPSBuZXcgRHJvcGRvd25PcHRpb25zKCk7XHJcbiAgICB0aGlzLkVkaXRPcmdhbml6YXRpb24uTmFtZSA9IFwiT3JnYW5pemF0aW9uXCJcclxuICAgIHRoaXMuRWRpdE9yZ2FuaXphdGlvbi5MYWJlbEtleSA9IFwiT3JnYW5pemF0aW9uXCJcclxuICAgIHRoaXMuRWRpdE9yZ2FuaXphdGlvbi5TZWxlY3RlZEl0ZW1zID0gdGhpcy5Pcmdhbml6YXRpb25MaXN0LmZpbHRlcigoaXRlbSkgPT4geyByZXR1cm4gcGFyc2VJbnQoaXRlbS5rZXkpID09IFBlcm1pc3Npb25TZXQub3JnYW5pemF0aW9uSUQ7IH0pLm1hcCgoaXRlbSkgPT4gaXRlbS5rZXkpWzBdO1xyXG4gICAgdGhpcy5FZGl0T3JnYW5pemF0aW9uLkRhdGFTb3VyY2UgPSB0aGlzLk9yZ2FuaXphdGlvbkxpc3RcclxuICAgIHRoaXMuRWRpdE9yZ2FuaXphdGlvbi5TaW5nbGVTZWxlY3Rpb24gPSB0cnVlO1xyXG4gICAgdGhpcy5FZGl0T3JnYW5pemF0aW9uLkFsbG93U2VhcmNoRmlsdGVyID0gdHJ1ZTtcclxuICAgIHRoaXMuRWRpdE9yZ2FuaXphdGlvbi5Jc1JlcXVpcmVkID0gdHJ1ZTtcclxuXHJcbiAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKGVkaXRQZXJtaXNzaW9uU2V0TW9kYWwpO1xyXG4gICAgdGhpcy51dGlsaXR5U2VydmljZS5zdG9wQmxvY2tVSSgpO1xyXG5cclxuICB9XHJcblxyXG4gIGVkaXRQZXJtaXNzaW9uU2V0KCkge1xyXG4gICAgaWYgKHRoaXMuRWRpdFBlcm1pc3Npb25TZXRGb3JtLmludmFsaWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGxldCBSZXN1bHRNb2RlbCA9IHRoaXMuRWRpdFBlcm1pc3Npb25TZXRGb3JtLnZhbHVlO1xyXG4gICAgICBsZXQgRWRpdFBlcm1pc3Npb25TZXRNb2RlbDpQZXJtaXNzaW9uU2V0TW9kZWw9IG5ldyBQZXJtaXNzaW9uU2V0TW9kZWwoKTtcclxuICAgICAgRWRpdFBlcm1pc3Npb25TZXRNb2RlbC5JZCA9IHRoaXMuUGVybWlzc2lvblNldElkO1xyXG4gICAgICBFZGl0UGVybWlzc2lvblNldE1vZGVsLk5hbWUuQXJhYmljID0gUmVzdWx0TW9kZWwuTmFtZS5BcmFiaWNWYWx1ZTtcclxuICAgICAgRWRpdFBlcm1pc3Npb25TZXRNb2RlbC5OYW1lLkVuZ2xpc2ggPSBSZXN1bHRNb2RlbC5OYW1lLkVuZ2xpc2hWYWx1ZTtcclxuICAgICAgaWYgKHRoaXMuUHJvZHVjdGlvbk1vZGUgPT0gZmFsc2UpXHJcbiAgICAgICAgRWRpdFBlcm1pc3Npb25TZXRNb2RlbC5TeXNOYW1lID0gUmVzdWx0TW9kZWwuU3lkTmFtZTtcclxuICAgICAgRWRpdFBlcm1pc3Npb25TZXRNb2RlbC5Pcmdhbml6YXRpb25JRCA9IE51bWJlcihSZXN1bHRNb2RlbC5Pcmdhbml6YXRpb24pO1xyXG4gICAgICBsZXQgSWRzID0gW107XHJcbiAgICAgIGlmIChSZXN1bHRNb2RlbC5QZXJtaXNzaW9ucyAhPSBudWxsKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IFJlc3VsdE1vZGVsLlBlcm1pc3Npb25zLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IFJlc3VsdE1vZGVsLlBlcm1pc3Npb25zW2luZGV4XTtcclxuICAgICAgICAgIElkcy5wdXNoKE51bWJlcihlbGVtZW50KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIEVkaXRQZXJtaXNzaW9uU2V0TW9kZWwuUGVybWlzc2lvbklEcyA9SWRzO1xyXG4gICAgICB0aGlzLlBlcm1pc3Npb25TZXRTZXJ2aWNlLkVkaXRQZXJtaXNzaW9uU2V0KEVkaXRQZXJtaXNzaW9uU2V0TW9kZWwpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2UuZGlzbWlzc0FsbCgpO1xyXG4gICAgICAgIGxldCBlbGVtZW50ID0gdGhpcy5pbnB1dCBhcyBhbnk7XHJcbiAgICAgICAgZWxlbWVudC5VcGRhdGVQYWdpbmcoKTtcclxuICAgICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaG93RGVsZXRlUGVybWlzc2lvblNldE1vZGFsKFJlc291cmNlOiBhbnksZGVsZXRlUGVybWlzc2lvblNldE1vZGFsKSB7XHJcbiAgICB0aGlzLnV0aWxpdHlTZXJ2aWNlLnN0YXJ0QmxvY2tVSSgpO1xyXG4gICAgdGhpcy5kZWxldGVQZXJtaXNzaW9uU2V0TGlzdCA9IFtdXHJcbiAgICB0aGlzLmRlbGV0ZVBlcm1pc3Npb25TZXRMaXN0LnB1c2goUmVzb3VyY2UpO1xyXG4gICAgdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihkZWxldGVQZXJtaXNzaW9uU2V0TW9kYWwpO1xyXG4gICAgdGhpcy51dGlsaXR5U2VydmljZS5zdG9wQmxvY2tVSSgpO1xyXG5cclxuICB9XHJcblxyXG4gIGRlbGV0ZVBlcm1pc3Npb25TZXQoKSB7XHJcbiAgICBsZXQgIFVzZXJzSURNb2RlbDpVc2Vyc0lEUmVxdWVzdE1vZGVsPSBuZXcgVXNlcnNJRFJlcXVlc3RNb2RlbCgpIDtcclxuICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5kZWxldGVQZXJtaXNzaW9uU2V0TGlzdC5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmRlbGV0ZVBlcm1pc3Npb25TZXRMaXN0W2luZGV4XTtcclxuICAgICAgIFVzZXJzSURNb2RlbC5Vc2Vyc0lEcy5wdXNoKGVsZW1lbnQuaWQpXHJcbiAgICAgICBcclxuICAgICB9XHJcbiAgICB0aGlzLlBlcm1pc3Npb25TZXRTZXJ2aWNlLkRlbGV0ZVBlcm1pc3Npb25TZXQoVXNlcnNJRE1vZGVsKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xyXG4gICAgICBsZXQgZGF0YSA9IHJlc3VsdCBhcyBhbnk7XHJcbiAgICAgIGlmICghZGF0YS52YWwpIHtcclxuICAgICAgICB0aGlzLnV0aWxpdHlTZXJ2aWNlLm5vdGlmeUVycm9yTWVzc2FnZSh0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJDYW5ub3REZWxldGVQZXJtaXNzaW9uU2V0SGFzVXNlcnNcIikpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMudXRpbGl0eVNlcnZpY2Uubm90aWZ5U3VjY2Vzc01lc3NhZ2UoKVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZGVsZXRlUGVybWlzc2lvblNldExpc3QgPSBbXTtcclxuICAgICAgdGhpcy5tb2RhbFNlcnZpY2UuZGlzbWlzc0FsbCgpO1xyXG4gICAgICBsZXQgZWxlbWVudCA9IHRoaXMuaW5wdXQgYXMgYW55O1xyXG4gICAgICBlbGVtZW50LlJlaW5pdGlhbGl6ZVBhZ2luZygpO1xyXG4gICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICAgIFxyXG4gICAgfSlcclxuXHJcbiAgfVxyXG5cclxuICBTYXZlTmFtZShuYW1lKSB7XHJcbiAgICBsZXQgTmFtZSA9IHtcclxuICAgICAgICBFbmdsaXNoOiBuYW1lLmVuZ2xpc2gsXHJcbiAgICAgICAgQXJhYmljOiBuYW1lLmFyYWJpYyxcclxuICAgIH07XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcIlBlcm1pc3Npb25TZXROYW1lXCIsIEpTT04uc3RyaW5naWZ5KE5hbWUpKTtcclxufVxyXG5cclxufVxyXG4iLCI8YmxvY2stdWk+XHJcbiAgPCEtLSBTdWJoZWFkZXIgLS0+XHJcbiAgPCEtLSBQYWdlIENvbnRlbnQgLS0+XHJcbiAgPGRpdiBbbmdTdHlsZV09XCJ7J2Rpc3BsYXknOiBTaG93UGFnZUNvbnRlbnQ9PXRydWU/J2Jsb2NrJzonbm9uZSd9XCIgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNhcmQtY3VzdG9tLWhcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIGJvcmRlci0wIHB0LTVcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC10aXRsZSBhbGlnbi1pdGVtcy1zdGFydCBmbGV4LWNvbHVtblwiICpuZ0lmPVwiSXNGaWx0ZXJMb2FkZWRcIj5cclxuICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiUGVybWlzc2lvblNldEZvcm1cIj5cclxuICAgICAgICAgICAgPEJCU0YtVGV4dEJveCBbb3B0aW9uc109XCJzZWFyY2hUZXh0Qm94XCIgW2dyb3VwXT1cIlBlcm1pc3Npb25TZXRGb3JtXCI+PC9CQlNGLVRleHRCb3g+XHJcbiAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtdG9vbGJhclwiPlxyXG4gICAgICAgICAgPCEtLSBiZWdpbjo6TWVudSAtLT5cclxuXHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXByaW1hcnlcIiB0aXRsZT1cIkFkZFwiIChjbGljayk9XCJzaG93QWRkUGVybWlzc2lvblNldE1vZGFsKEFkZFBlcm1pc3Npb25TZXRNb2RhbClcIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtcGx1cyBtZS0xXCI+PC9pPlxyXG4gICAgICAgICAgICB7e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJBZGRcIil9fVxyXG4gICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgPCEtLSBlbmQ6Ok1lbnUgLS0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHB5LTNcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxyXG4gICAgICAgICAgPCEtLWJlZ2luOjpQZXJtaXNzaW9uIGxpc3QtLT5cclxuICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIGFsaWduLW1pZGRsZSB0YWJsZS1yb3ctZGFzaGVkIGZzLTYgZ3ktNSBkYXRhVGFibGUgbm8tZm9vdGVyXCI+XHJcbiAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJ0ZXh0LXN0YXJ0IHRleHQtZ3JheS00MDAgZnctYm9sZGVyIGZzLTcgdGV4dC11cHBlcmNhc2UgZ3MtMFwiPlxyXG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwibWluLXctMTUwcHhcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJOYW1lXCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwibWluLXctMTUwcHhcIiAqbmdJZj1cIiFQcm9kdWN0aW9uTW9kZVwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlN5c05hbWVcIil9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJtaW4tdy0xNTBweFwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlVzZXJzQ291bnRcIil9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJtaW4tdy01MHB4XCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiQWN0aW9uXCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgIDx0Ym9keSBpZD1cImxpc3RpbmdDb250YWluZXJcIiBjbGFzcz1cImZ3LWJvbGQgdGV4dC1ncmF5LTYwMCBib3JkZXItMFwiPlxyXG5cclxuICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IFBlcm1pc3Npb25TZXQgb2YgUGVybWlzc2lvblNldFBhZ2luZ1Jlc3VsdFwiPlxyXG5cclxuICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiICpuZ0lmPVwibGFuZ3VhZ2U9PSdlbidcIiAoY2xpY2spPVwiU2F2ZU5hbWUoUGVybWlzc2lvblNldC5uYW1lKVwiIFtyb3V0ZXJMaW5rXT1cIlsnL0FkbWluL1JvbGVzL1Blcm1pc3Npb25TZXRJbmZvJyxQZXJtaXNzaW9uU2V0LmlkXVwiIHJvdXRlckxpbmtBY3RpdmU9XCJyb3V0ZXItbGluay1hY3RpdmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtZGFya1wiPnt7UGVybWlzc2lvblNldC5uYW1lLmVuZ2xpc2h9fTwvYT5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIiAqbmdJZj1cImxhbmd1YWdlPT0nYXInXCIgKGNsaWNrKT1cIlNhdmVOYW1lKFBlcm1pc3Npb25TZXQubmFtZSlcIiBbcm91dGVyTGlua109XCJbJy9BZG1pbi9Sb2xlcy9QZXJtaXNzaW9uU2V0SW5mbycsUGVybWlzc2lvblNldC5pZF1cIiByb3V0ZXJMaW5rQWN0aXZlPVwicm91dGVyLWxpbmstYWN0aXZlXCJcclxuICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWRhcmtcIj57e1Blcm1pc3Npb25TZXQubmFtZS5hcmFiaWN9fTwvYT5cclxuXHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiIVByb2R1Y3Rpb25Nb2RlXCI+e3tQZXJtaXNzaW9uU2V0LnN5c05hbWV9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8dGQ+e3tQZXJtaXNzaW9uU2V0LnVzZXJzQ291bnR9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJtZW51XCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1pY29uIGJ0bi1saWdodCBidG4tYWN0aXZlLWxpZ2h0LXByaW1hcnlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZWxsaXBzaXMtaFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LW1lbnUgI21lbnU9XCJtYXRNZW51XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRyb3AtaXRlbSBweC0zXCIgbmdiRHJvcGRvd25JdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd0VkaXRQZXJtaXNzaW9uU2V0TW9kYWwoUGVybWlzc2lvblNldCxFZGl0UGVybWlzc2lvblNldE1vZGFsKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRyb3AtbGluayBweC0zXCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiRWRpdFwiKX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGEgbmdiRHJvcGRvd25JdGVtIGNsYXNzPVwiZHJvcC1pdGVtIHB4LTNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dEZWxldGVQZXJtaXNzaW9uU2V0TW9kYWwoUGVybWlzc2lvblNldCxkZWxldGVQZXJtaXNzaW9uU2V0TW9kYWwpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHJvcC1saW5rIHB4LTNcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJEZWxldGVcIil9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICA8dHIgKm5nSWY9XCJQZXJtaXNzaW9uU2V0UGFnaW5nUmVzdWx0Lmxlbmd0aCA9PSAwXCI+XHJcbiAgICAgICAgICAgICAgICA8dGQgW2F0dHIuY29sc3Bhbl09XCJQcm9kdWN0aW9uTW9kZSA/ICczJyA6ICc0J1wiPlxyXG4gICAgICAgICAgICAgICAgICA8bGliLWVtcHR5LWRhdGE+PC9saWItZW1wdHktZGF0YT5cclxuICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICA8IS0tZW5kOjpQZXJtaXNzaW9uIGxpc3QtLT5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1mb290ZXIgYm9yZGVyLTBcIj5cclxuICAgICAgICA8QkJTRi1QYWdpbmcgKEl0ZW1zKT1cInNldFBlcm1pc3Npb25TZXRMaXN0UmVzdWx0KCRldmVudClcIiAqbmdJZj1cIklzRmlsdGVyTG9hZGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiUGVybWlzc2lvblNldFBhZ2luZ1wiIFtncm91cF09XCJQZXJtaXNzaW9uU2V0Rm9ybVwiICNQZXJtaXNzaW9uU2V0UGFnaW5nVmlld0VsZW1lbnQ+XHJcbiAgICAgICAgPC9CQlNGLVBhZ2luZz5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgPC9kaXY+XHJcblxyXG5cclxuICA8IS0tIEFkZCBNb2RhbCAtLT5cclxuICA8bmctdGVtcGxhdGUgI0FkZFBlcm1pc3Npb25TZXRNb2RhbCBsZXQtbW9kYWw+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyIHBiLTAgYm9yZGVyLTAganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgICA8aDUgY2xhc3M9XCJtb2RhbC10aXRsZVwiIGlkPVwiZXhhbXBsZU1vZGFsTGFiZWxcIj48L2g1PlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiIChjbGljayk9XCJtb2RhbC5kaXNtaXNzKClcIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWljb24gYnRuLWFjdGl2ZS1jb2xvci1wcmltYXJ5XCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzdmctaWNvbiBzdmctaWNvbi0xXCI+XHJcbiAgICAgICAgICA8c3BhbiBbaW5saW5lU1ZHXT1cIicuL3NyYy9hc3NldHMvaW1hZ2VzL2FycjA2MS5zdmcnXCI+PC9zcGFuPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IHNjcm9sbC15IHB4LTEwIHB4LWxnLTE1IHB0LTAgcGItMTVcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTEzIHRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgPGgxIGNsYXNzPVwibWItM1wiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkFkZFBlcm1pc3Npb25TZXRcIil9fTwvaDE+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cIkFkZFBlcm1pc3Npb25TZXRGb3JtXCIgKG5nU3VibWl0KT1cImFkZFBlcm1pc3Npb25TZXQoKVwiPlxyXG4gICAgICAgIDxCQlNGLU11bHRpTGluZ3VhbFRleHRCb3ggW29wdGlvbnNdPVwiTXVsdGlMaW5ndWFsTmFtZVwiIFtncm91cF09XCJBZGRQZXJtaXNzaW9uU2V0Rm9ybVwiPjwvQkJTRi1NdWx0aUxpbmd1YWxUZXh0Qm94PlxyXG4gICAgICAgIDxCQlNGLVRleHRCb3ggW29wdGlvbnNdPVwiQWN0aXZlRGlyZWN0b3J5R3JvdXBcIiBbZ3JvdXBdPVwiQWRkUGVybWlzc2lvblNldEZvcm1cIj5cclxuICAgICAgICA8L0JCU0YtVGV4dEJveD5cclxuICAgICAgICA8QkJTRi1UZXh0Qm94ICpuZ0lmPVwiIVByb2R1Y3Rpb25Nb2RlXCIgW29wdGlvbnNdPVwiU3lzTmFtZVwiIFtncm91cF09XCJBZGRQZXJtaXNzaW9uU2V0Rm9ybVwiPlxyXG4gICAgICAgIDwvQkJTRi1UZXh0Qm94PlxyXG4gICAgICAgIDxCQlNGLURyb3Bkb3duTGlzdCBbb3B0aW9uc109XCJQZXJtaXNzaW9uc1wiIFtncm91cF09XCJBZGRQZXJtaXNzaW9uU2V0Rm9ybVwiPlxyXG4gICAgICAgIDwvQkJTRi1Ecm9wZG93bkxpc3Q+XHJcbiAgICAgICAgPEJCU0YtRHJvcGRvd25MaXN0IFtvcHRpb25zXT1cIk9yZ2FuaXphdGlvblwiIFtncm91cF09XCJBZGRQZXJtaXNzaW9uU2V0Rm9ybVwiPlxyXG4gICAgICAgIDwvQkJTRi1Ecm9wZG93bkxpc3Q+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIHB0LTdcIj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiICNDbG9zZVBlcm1pc3Npb25TZXRNb2RhbCBpZD1cIkNsb3NlUGVybWlzc2lvblNldE1vZGFsXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiBjbGFzcz1cImJ0biBidG4tbGlnaHQgbWUtMyBidG4tc21cIiAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygpXCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiQ2FuY2VsTGFiZWxcIil9fSA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1zbVwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlNhdmVMYWJlbFwiKX19PC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZm9ybT5cclxuXHJcbiAgICA8L2Rpdj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG5cclxuXHJcblxyXG4gIDwhLS0gRWRpdCBNb2RhbCAtLT5cclxuICA8bmctdGVtcGxhdGUgI0VkaXRQZXJtaXNzaW9uU2V0TW9kYWwgbGV0LW1vZGFsPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlciBwYi0wIGJvcmRlci0wIGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cImV4YW1wbGVNb2RhbExhYmVsXCI+PC9oNT5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygpXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1pY29uIGJ0bi1hY3RpdmUtY29sb3ItcHJpbWFyeVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic3ZnLWljb24gc3ZnLWljb24tMVwiPlxyXG4gICAgICAgICAgPHNwYW4gW2lubGluZVNWR109XCInLi9zcmMvYXNzZXRzL2ltYWdlcy9hcnIwNjEuc3ZnJ1wiPjwvc3Bhbj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBzY3JvbGwteSBweC0xMCBweC1sZy0xNSBwdC0wIHBiLTE1XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0xMyB0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgIDxoMSBjbGFzcz1cIm1iLTNcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJFZGl0UGVybWlzc2lvblNldFwiKX19PC9oMT5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiRWRpdFBlcm1pc3Npb25TZXRGb3JtXCIgKG5nU3VibWl0KT1cImVkaXRQZXJtaXNzaW9uU2V0KClcIj5cclxuICAgICAgICA8QkJTRi1NdWx0aUxpbmd1YWxUZXh0Qm94IFtvcHRpb25zXT1cIkVkaXRNdWx0aUxpbmd1YWxOYW1lXCIgW2dyb3VwXT1cIkVkaXRQZXJtaXNzaW9uU2V0Rm9ybVwiPjwvQkJTRi1NdWx0aUxpbmd1YWxUZXh0Qm94PlxyXG4gICAgICAgIDxCQlNGLVRleHRCb3ggW29wdGlvbnNdPVwiRWRpdEFjdGl2ZURpcmVjdG9yeUdyb3VwXCIgW2dyb3VwXT1cIkVkaXRQZXJtaXNzaW9uU2V0Rm9ybVwiPlxyXG4gICAgICAgIDwvQkJTRi1UZXh0Qm94PlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCIhUHJvZHVjdGlvbk1vZGVcIj5cclxuICAgICAgICAgIDxCQlNGLVRleHRCb3ggW29wdGlvbnNdPVwiRWRpdFN5c05hbWVcIiBbZ3JvdXBdPVwiRWRpdFBlcm1pc3Npb25TZXRGb3JtXCI+XHJcbiAgICAgICAgICA8L0JCU0YtVGV4dEJveD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8QkJTRi1Ecm9wZG93bkxpc3QgW29wdGlvbnNdPVwiRWRpdFBlcm1pc3Npb25zXCIgW2dyb3VwXT1cIkVkaXRQZXJtaXNzaW9uU2V0Rm9ybVwiPlxyXG4gICAgICAgIDwvQkJTRi1Ecm9wZG93bkxpc3Q+XHJcbiAgICAgICAgPEJCU0YtRHJvcGRvd25MaXN0IFtvcHRpb25zXT1cIkVkaXRPcmdhbml6YXRpb25cIiBbZ3JvdXBdPVwiRWRpdFBlcm1pc3Npb25TZXRGb3JtXCI+XHJcbiAgICAgICAgPC9CQlNGLURyb3Bkb3duTGlzdD5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgcHQtN1wiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgI0Nsb3NlRWRpdFBlcm1pc3Npb25TZXRNb2RhbCBpZD1cIkNsb3NlRWRpdFBlcm1pc3Npb25TZXRNb2RhbFwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IG1lLTMgYnRuLXNtXCIgKGNsaWNrKT1cIm1vZGFsLmRpc21pc3MoKVwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkNhbmNlbExhYmVsXCIpfX0gPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc21cIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJTYXZlTGFiZWxcIil9fTwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Zvcm0+XHJcblxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcblxyXG5cclxuICA8IS0tIERlbGV0ZSAgTW9kYWwgLS0+XHJcbiAgPG5nLXRlbXBsYXRlICNkZWxldGVQZXJtaXNzaW9uU2V0TW9kYWwgbGV0LW1vZGFsPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlciBwYi0wIGJvcmRlci0wIGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cImV4YW1wbGVNb2RhbExhYmVsXCI+PC9oNT5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWljb24gYnRuLWFjdGl2ZS1jb2xvci1wcmltYXJ5XCIgKGNsaWNrKT1cIm1vZGFsLmRpc21pc3MoKVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic3ZnLWljb24gc3ZnLWljb24tMVwiPlxyXG4gICAgICAgICAgPHNwYW4gW2lubGluZVNWR109XCInLi9zcmMvYXNzZXRzL2ltYWdlcy9hcnIwNjEuc3ZnJ1wiPjwvc3Bhbj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBzY3JvbGwteSBweC0xMCBweC1sZy0xNSBwdC0wIHBiLTE1XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0xMyB0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgIDxoMSBjbGFzcz1cIm1iLTNcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJEZWxldGVcIil9fSB7e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJQZXJtaXNzaW9uU2V0XCIpfX08L2gxPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm5vdGljZSBkLWZsZXggYmctbGlnaHQtZGFuZ2VyIHJvdW5kZWQgYm9yZGVyLWRhbmdlciBib3JkZXIgYm9yZGVyLWRhc2hlZCBtYi0xMCBwLTZcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInN2Zy1pY29uIHN2Zy1pY29uLTJ0eCBzdmctaWNvbi1kYW5nZXIgbWUtNFwiPlxyXG4gICAgICAgICAgPHNwYW4gW2lubGluZVNWR109XCInLi9zcmMvYXNzZXRzL2ltYWdlcy9nZW4wNDQuc3ZnJ1wiPjwvc3Bhbj5cclxuICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1zdGFjayBmbGV4LWdyb3ctMVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LWJvbGRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZzLTYgdGV4dC1ncmF5LTcwMFwiPlxyXG4gICAgICAgICAgICAgIHt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkRlbGV0ZV9RdWVzdGlvblwiKX19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgcHQtN1wiPlxyXG4gICAgICAgIDxidXR0b24gI0Nsb3NlRGVsZXRlUGVybWlzc2lvblNldE1vZGFsIGlkPVwiQ2xvc2VEZWxldGVQZXJtaXNzaW9uU2V0TW9kYWxcIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBidG4tc20gbWUtMyBcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIChjbGljayk9XCJtb2RhbC5kaXNtaXNzKClcIj5cclxuICAgICAgICAgIHt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkNhbmNlbExhYmVsXCIpfX1cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZGVsZXRlUGVybWlzc2lvblNldCgpXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1saWdodC1kYW5nZXIgYnRuLXNtIFwiPlxyXG4gICAgICAgICAge3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiRGVsZXRlXCIpfX1cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG5cclxuXHJcbiJdfQ==
279
+ args: ['ConfirmationModalControl', { static: false }]
280
+ }] } });
281
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbnNldHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmJzZi1hZG1pbi1wb3J0YWwvc3JjL2xpYi9QYWdlcy9yb2xlcy9wZXJtaXNzaW9uc2V0cy9wZXJtaXNzaW9uc2V0cy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYnNmLWFkbWluLXBvcnRhbC9zcmMvbGliL1BhZ2VzL3JvbGVzL3Blcm1pc3Npb25zZXRzL3Blcm1pc3Npb25zZXRzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsU0FBUyxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSwwQkFBMEIsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDak4sT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBEQUEwRCxDQUFDOzs7Ozs7Ozs7Ozs7O0FBYTlGLE1BQU0sT0FBTyx1QkFBdUI7SUFnRGxDLFlBQ1UsZUFBZ0MsRUFDaEMsY0FBOEIsRUFDOUIsa0JBQXNDLEVBQ3RDLG9CQUEwQyxFQUMxQyxZQUFzQixFQUN0QixxQkFBMkM7UUFMM0Msb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5Qix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3RDLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDMUMsaUJBQVksR0FB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Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgQ29uZmlybWF0aW9uTW9kYWxPcHRpb25zLCBEcm9wZG93bk9wdGlvbnMsIEVuZ2xpc2hBcmFiaWNEVE8sIEZpbHRlckl0ZW0sIEZpbHRlclR5cGUsIEZvcm1PcHRpb25zLCBJbnB1dFR5cGUsIE11bHRpTGluZ3VhbFRleHRCb3hPcHRpb25zLCBQYWdpbmdPcHRpb25zLCBUZXh0Qm94T3B0aW9ucyB9IGZyb20gJ0BibnNpZ2h0cy9iYnNmLWNvbnRyb2xzJztcclxuaW1wb3J0IHsgUGFnZUluZm9TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vX21ldHJvbmljL2NvcmUvc2VydmljZXMvcGFnZS1pbmZvLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQZXJtaXNzaW9uU2V0TW9kZWwgfSBmcm9tICcuLi8uLi9zaGFyZWQvbW9kZWxzL1Blcm1pc3Npb25zTW9kZWxzL1Blcm1pc3Npb25TZXRNb2RlbCc7XHJcbmltcG9ydCB7IE5nYk1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xyXG5pbXBvcnQgeyAgVXRpbGl0eVNlcnZpY2UsIEVudmlyb25tZW50U2VydmljZSwgUmVxdWVzdEhhbmRsZXJTZXJ2aWNlIH0gZnJvbSAnQGJuc2lnaHRzL2Jic2YtdXRpbGl0aWVzJztcclxuaW1wb3J0IHsgUGFnaW5nQ29tcG9uZW50IH0gZnJvbSAnQGJuc2lnaHRzL2Jic2YtY29udHJvbHMvbGliL2NvbnRyb2xzL1BhZ2luZy9QYWdpbmcuY29tcG9uZW50JztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBQZXJtaXNzaW9uU2V0U2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9TZXJ2aWNlcy9QZXJtaXNzaW9uU2V0U2VydmljZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29uZmlybWF0aW9uTW9kYWxDb21wb25lbnQgfSBmcm9tICdAYm5zaWdodHMvYmJzZi1jb250cm9scy9saWIvY29udHJvbHMvQ29uZmlybWF0aW9uTW9kYWwvQ29uZmlybWF0aW9uTW9kYWwuY29tcG9uZW50JztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1wZXJtaXNzaW9uc2V0cycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3Blcm1pc3Npb25zZXRzLmNvbXBvbmVudC5odG1sJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgUGVybWlzc2lvbnNldHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsT25EZXN0cm95IHtcclxuICAvL1BhZ2UgcmVxdWlyZW1lbnRzXHJcbiAgQXBpVXJsID0gdGhpcy5wZXJtaXNzaW9uU2V0U2VydmljZS5BcGlVcmxcclxuICBQcm9kdWN0aW9uTW9kZTogYm9vbGVhbjtcclxuXHJcblxyXG4gIC8vRmlsdGVyIGFuZCBwYWdpbmcgY29tcG9uZW50c1xyXG4gIHNlYXJjaFRleHRCb3g6IFRleHRCb3hPcHRpb25zO1xyXG4gIHBlcm1pc3Npb25MaXN0ID0gW107XHJcbiAgb3JnYW5pemF0aW9uTGlzdCA9IFtdO1xyXG4gIGZpbHRlckZvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuICBwZXJtaXNzaW9uU2V0Rm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gIHNob3dGaWx0ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwZXJtaXNzaW9uU2V0UGFnaW5nUmVzdWx0OiBhbnlbXSA9IFtdO1xyXG4gIGZpbHRlcmVkUGVybWlzc2lvblNldFBhZ2luZ1Jlc3VsdDogYW55W10gPSBbXTtcclxuICBwZXJtaXNzaW9uU2V0UGFnaW5nOiBQYWdpbmdPcHRpb25zO1xyXG4gIHRleHRJbnB1dEZpbHRlcjogRmlsdGVySXRlbTtcclxuICBpc0ZpbHRlckxvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBWaWV3Q2hpbGQoJ1Blcm1pc3Npb25TZXRQYWdpbmdWaWV3RWxlbWVudCcsIHsgc3RhdGljOiBmYWxzZSB9KSBwYWdpbmdFbGVtZW50OiBQYWdpbmdDb21wb25lbnQ7XHJcblxyXG5cclxuICAvL0FkZCBNb2RlbCBDb250cm9sc1xyXG4gIGFkZFBlcm1pc3Npb25TZXRGb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcbiAgYWRkUGVybWlzc2lvblNldEZvcm1PcHRpb25zOiBGb3JtT3B0aW9uc1xyXG4gIG11bHRpTGluZ3VhbE5hbWU6IE11bHRpTGluZ3VhbFRleHRCb3hPcHRpb25zXHJcbiAgc3lzTmFtZTogVGV4dEJveE9wdGlvbnM7XHJcbiAgYWN0aXZlRGlyZWN0b3J5R3JvdXA6IFRleHRCb3hPcHRpb25zO1xyXG4gIHBlcm1pc3Npb25zOiBEcm9wZG93bk9wdGlvbnM7XHJcbiAgb3JnYW5pemF0aW9uOiBEcm9wZG93bk9wdGlvbnM7XHJcblxyXG4gIC8vRWRpdCBNb2RlbCBDb250cm9sc1xyXG4gIGVkaXRQZXJtaXNzaW9uU2V0Rm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gIGVkaXRQZXJtaXNzaW9uU2V0Rm9ybU9wdGlvbnM6IEZvcm1PcHRpb25zXHJcbiAgZWRpdE11bHRpTGluZ3VhbE5hbWU6IE11bHRpTGluZ3VhbFRleHRCb3hPcHRpb25zXHJcbiAgZWRpdFN5c05hbWU6IFRleHRCb3hPcHRpb25zO1xyXG4gIGVkaXRBY3RpdmVEaXJlY3RvcnlHcm91cDogVGV4dEJveE9wdGlvbnM7XHJcbiAgZWRpdFBlcm1pc3Npb25zOiBEcm9wZG93bk9wdGlvbnM7XHJcbiAgZWRpdE9yZ2FuaXphdGlvbjogRHJvcGRvd25PcHRpb25zO1xyXG4gIHBlcm1pc3Npb25TZXRJZDogc3RyaW5nO1xyXG4gIGVkaXRQZXJtaXNzaW9uU2V0SWQ6IG51bWJlcjtcclxuXHJcbiAgLy9kZWxldGUgIE1vZGVsIENvbnRyb2xzXHJcbiAgZGVsZXRlZFBlcm1pc3Npb25TZXRJZDogc3RyaW5nO1xyXG4gIGRlbGV0ZUNvbmZpcm1hdGlvbk9wdGlvbnM6IENvbmZpcm1hdGlvbk1vZGFsT3B0aW9ucztcclxuICBkZWxldGVDb250cm9sTG9hZGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQFZpZXdDaGlsZCgnQ29uZmlybWF0aW9uTW9kYWxDb250cm9sJywgeyBzdGF0aWM6IGZhbHNlIH0pIENvbmZpcm1hdGlvbk1vZGFsQ29udHJvbDogQ29uZmlybWF0aW9uTW9kYWxDb21wb25lbnQ7XHJcblxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcGFnZUluZm9TZXJ2aWNlOiBQYWdlSW5mb1NlcnZpY2UsXHJcbiAgICBwdWJsaWMgIHV0aWxpdHlTZXJ2aWNlOiBVdGlsaXR5U2VydmljZSxcclxuICAgIHByaXZhdGUgZW52aXJvbm1lbnRTZXJ2aWNlOiBFbnZpcm9ubWVudFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHBlcm1pc3Npb25TZXRTZXJ2aWNlOiBQZXJtaXNzaW9uU2V0U2VydmljZSxcclxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCxcclxuICAgIHByaXZhdGUgcmVxdWVzdEhhbmRsZXJTZXJ2aWNlOlJlcXVlc3RIYW5kbGVyU2VydmljZVxyXG4gICkge1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICAvL1BhZ2UgaGVhZGVyIChicmVhZGNydW1iIGFuZCB0aXRsZSlcclxuICAgIFBhZ2VJbmZvU2VydmljZS5QYWdlVGl0bGUgPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJQZXJtaXNzaW9uU2V0c1wiKVxyXG4gICAgUGFnZUluZm9TZXJ2aWNlLlBhZ2VCcmVhZGNydW1icyA9IFtcclxuICAgICAgeyB0aXRsZTogdGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiSG9tZVwiKSwgcGF0aDogJy9BZG1pbi9Ib21lJywgaXNTZXBhcmF0b3I6IGZhbHNlLCBpc0FjdGl2ZTogZmFsc2UgfSxcclxuICAgICAgeyB0aXRsZTogJycsIHBhdGg6ICcnLCBpc1NlcGFyYXRvcjogdHJ1ZSwgaXNBY3RpdmU6IGZhbHNlIH1cclxuICAgIF07XHJcbiAgICB0aGlzLnBhZ2VJbmZvU2VydmljZS5jYWxjdWxhdGVUaXRsZSgpO1xyXG4gICAgdGhpcy5wYWdlSW5mb1NlcnZpY2UuY2FsY3VsYXRlQnJlYWRjcnVtYnMoKTtcclxuICAgIHRoaXMuUHJvZHVjdGlvbk1vZGUgPSB0aGlzLmVudmlyb25tZW50U2VydmljZS5nZXRQcm9kdWN0aW9uTW9kZSgpXHJcbiAgICAvL2luaXRpYWxpemUgcGFnZVxyXG4gICAgdGhpcy5pbml0aWFsaXplUGFnZSgpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vaW5pdGlhbGl6ZSBwYWdlXHJcbiAgaW5pdGlhbGl6ZVBhZ2UoKSB7XHJcbiAgICB0aGlzLnBlcm1pc3Npb25TZXRTZXJ2aWNlLmxvYWREcm9wZG93bigpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XHJcbiAgICAgIGxldCBkcm9wZG93blJlc3BvbnNlTW9kZWwgPSByZXN1bHQ7XHJcbiAgICAgIHRoaXMub3JnYW5pemF0aW9uTGlzdCA9IGRyb3Bkb3duUmVzcG9uc2VNb2RlbFtcIm9yZ2FuaXphdGlvbkxpc3RcIl07XHJcbiAgICAgIHRoaXMucGVybWlzc2lvbkxpc3QgPSBkcm9wZG93blJlc3BvbnNlTW9kZWxbXCJwZXJtaXNzaW9uTGlzdFwiXTtcclxuICAgICAgLy8gVGV4dEJveCBpbnRpXHJcbiAgICAgIHRoaXMuc2VhcmNoVGV4dEJveCA9IG5ldyBUZXh0Qm94T3B0aW9ucygpO1xyXG4gICAgICB0aGlzLnNlYXJjaFRleHRCb3guTmFtZSA9IFwic2VhcmNoVGV4dEJveFwiXHJcbiAgICAgIHRoaXMuc2VhcmNoVGV4dEJveC5IaWRlTGFiZWwgPSB0cnVlO1xyXG4gICAgICB0aGlzLnNlYXJjaFRleHRCb3guVHlwZSA9IElucHV0VHlwZS5UZXh0XHJcbiAgICAgIHRoaXMuc2VhcmNoVGV4dEJveC5QbGFjZWhvbGRlciA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlNlYXJjaEJ5TmFtZVwiKTtcclxuXHJcbiAgICAgIHRoaXMudGV4dElucHV0RmlsdGVyID0gbmV3IEZpbHRlckl0ZW0oKTtcclxuICAgICAgdGhpcy50ZXh0SW5wdXRGaWx0ZXIuRm9ybUNvbnRyb2xOYW1lID0gXCJzZWFyY2hUZXh0Qm94XCJcclxuICAgICAgdGhpcy50ZXh0SW5wdXRGaWx0ZXIuQWN0aW9uUGFyYW1ldGVyTmFtZSA9IFwic2VhcmNoVGV4dFwiXHJcbiAgICAgIHRoaXMudGV4dElucHV0RmlsdGVyLklzRm9ybUNvbnRyb2wgPSB0cnVlXHJcbiAgICAgIHRoaXMudGV4dElucHV0RmlsdGVyLkZpbHRlclR5cGUgPSBGaWx0ZXJUeXBlLlRleHRCb3hcclxuXHJcbiAgICAgIHRoaXMucGVybWlzc2lvblNldFBhZ2luZyA9IG5ldyBQYWdpbmdPcHRpb25zKCk7XHJcbiAgICAgIHRoaXMucGVybWlzc2lvblNldFBhZ2luZy5BY3Rpb25Qb3N0VVJMID0gdGhpcy5BcGlVcmwgKyAnR2V0UGVybWlzc2lvblNldHNCeUZpbHRlcic7XHJcbiAgICAgIHRoaXMucGVybWlzc2lvblNldFBhZ2luZy5PbktleVByZXNzRmlsdGVyc0NvbnRyb2xOYW1lcyA9IFtcInNlYXJjaFRleHRCb3hcIl1cclxuICAgICAgdGhpcy5wZXJtaXNzaW9uU2V0UGFnaW5nLkZpbHRlcnMgPSBbdGhpcy50ZXh0SW5wdXRGaWx0ZXJdXHJcbiAgICAgIHRoaXMuaXNGaWx0ZXJMb2FkZWQgPSB0cnVlO1xyXG5cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICAvL1BhZ2luZyBmdW5jdGlvbnNcclxuICBzZXRQZXJtaXNzaW9uU2V0TGlzdFJlc3VsdChyZXN1bHQpIHtcclxuICAgIHRoaXMucGVybWlzc2lvblNldFBhZ2luZ1Jlc3VsdCA9IHJlc3VsdFxyXG4gICAgdGhpcy5maWx0ZXJlZFBlcm1pc3Npb25TZXRQYWdpbmdSZXN1bHQgPSB0aGlzLnBlcm1pc3Npb25TZXRQYWdpbmdSZXN1bHQ7XHJcblxyXG4gIH1cclxuXHJcbiAgLy9GaWx0ZXIgZnVuY3Rpb25zXHJcbiAgcmVzZXRGaWx0ZXJzKCkge1xyXG4gICAgdGhpcy5wZXJtaXNzaW9uU2V0Rm9ybS5jb250cm9sc1tcInNlYXJjaFRleHRCb3hcIl0uc2V0VmFsdWUobnVsbCk7XHJcbiAgICBsZXQgZWxlbWVudCA9IHRoaXMucGFnaW5nRWxlbWVudCBhcyBhbnk7XHJcbiAgICBlbGVtZW50LlJlaW5pdGlhbGl6ZVBhZ2luZygpO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICAvLy8vLy8vLy8vLy8vIFN0YXJ0IGFkZCBQZXJtaXNzaW9uU2V0IFBhcnQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgc2hvd0FkZFBlcm1pc3Npb25TZXRNb2RhbChBZGRQZXJtaXNzaW9uU2V0TW9kYWwpIHtcclxuICAgIHRoaXMudXRpbGl0eVNlcnZpY2Uuc3RhcnRCbG9ja1VJKCk7XHJcbiAgICB0aGlzLmFkZFBlcm1pc3Npb25TZXRGb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcblxyXG4gICAgdGhpcy5hZGRQZXJtaXNzaW9uU2V0Rm9ybU9wdGlvbnMgPSBuZXcgRm9ybU9wdGlvbnMoKTtcclxuICAgIHRoaXMuYWRkUGVybWlzc2lvblNldEZvcm1PcHRpb25zLkZvcm1Hcm91cCA9IHRoaXMuYWRkUGVybWlzc2lvblNldEZvcm1cclxuICAgIHRoaXMuYWRkUGVybWlzc2lvblNldEZvcm1PcHRpb25zLkdldE1vZGVsRnVuY3Rpb24gPSB0aGlzLmdldEFkZFBlcm1pc3Npb25TZXRNb2RlbDtcclxuICAgIHRoaXMuYWRkUGVybWlzc2lvblNldEZvcm1PcHRpb25zLlNlcnZpY2VTdWJtaXRGdW5jdGlvbiA9IHRoaXMuZ2V0QWRkUGVybWlzc2lvblNldEZ1bmN0aW9uO1xyXG4gICAgdGhpcy5hZGRQZXJtaXNzaW9uU2V0Rm9ybU9wdGlvbnMuUGFnaW5nUmVmZXJlbmNlID0gdGhpcy5wYWdpbmdFbGVtZW50XHJcblxyXG4gICAgdGhpcy5tdWx0aUxpbmd1YWxOYW1lID0gbmV3IE11bHRpTGluZ3VhbFRleHRCb3hPcHRpb25zKCk7XHJcbiAgICB0aGlzLm11bHRpTGluZ3VhbE5hbWUuTmFtZSA9IFwiTmFtZVwiO1xyXG4gICAgdGhpcy5tdWx0aUxpbmd1YWxOYW1lLkFyYWJpY0xhYmVsS2V5ID0gXCJOYW1lSW5BcmFiaWNcIjtcclxuICAgIHRoaXMubXVsdGlMaW5ndWFsTmFtZS5FbmdsaXNoTGFiZWxLZXkgPSBcIk5hbWVJbkVuZ2xpc2hcIjtcclxuICAgIHRoaXMubXVsdGlMaW5ndWFsTmFtZS5Jc1JlcXVpcmVkID0gdHJ1ZTtcclxuICAgIHRoaXMubXVsdGlMaW5ndWFsTmFtZS5WYWx1ZSA9IG51bGw7XHJcblxyXG4gICAgdGhpcy5hY3RpdmVEaXJlY3RvcnlHcm91cCA9IG5ldyBUZXh0Qm94T3B0aW9ucygpO1xyXG4gICAgdGhpcy5hY3RpdmVEaXJlY3RvcnlHcm91cC5OYW1lID0gXCJBY3RpdmVEaXJlY3RvcnlHcm91cFwiO1xyXG4gICAgdGhpcy5hY3RpdmVEaXJlY3RvcnlHcm91cC5MYWJlbEtleSA9IFwiQWN0aXZlRGlyZWN0b3J5R3JvdXBcIjtcclxuICAgIHRoaXMuYWN0aXZlRGlyZWN0b3J5R3JvdXAuVHlwZSA9IElucHV0VHlwZS5UZXh0O1xyXG4gICAgdGhpcy5hY3RpdmVEaXJlY3RvcnlHcm91cC5WYWx1ZSA9IG51bGw7XHJcblxyXG5cclxuICAgIHRoaXMuc3lzTmFtZSA9IG5ldyBUZXh0Qm94T3B0aW9ucygpO1xyXG4gICAgdGhpcy5zeXNOYW1lLk5hbWUgPSBcIlN5c05hbWVcIjtcclxuICAgIHRoaXMuc3lzTmFtZS5MYWJlbEtleSA9IFwiU3lzTmFtZVwiO1xyXG4gICAgdGhpcy5zeXNOYW1lLlR5cGUgPSBJbnB1dFR5cGUuVGV4dDtcclxuICAgIHRoaXMuc3lzTmFtZS5WYWx1ZSA9IG51bGw7XHJcblxyXG4gICAgdGhpcy5wZXJtaXNzaW9ucyA9IG5ldyBEcm9wZG93bk9wdGlvbnMoKTtcclxuICAgIHRoaXMucGVybWlzc2lvbnMuTmFtZSA9IFwiUGVybWlzc2lvbnNcIlxyXG4gICAgdGhpcy5wZXJtaXNzaW9ucy5MYWJlbEtleSA9IFwiUGVybWlzc2lvbnNcIlxyXG4gICAgdGhpcy5wZXJtaXNzaW9ucy5TZWxlY3RlZEl0ZW1zID0gbnVsbDtcclxuICAgIHRoaXMucGVybWlzc2lvbnMuRGF0YVNvdXJjZSA9IHRoaXMucGVybWlzc2lvbkxpc3RcclxuICAgIHRoaXMucGVybWlzc2lvbnMuU2luZ2xlU2VsZWN0aW9uID0gZmFsc2U7XHJcbiAgICB0aGlzLnBlcm1pc3Npb25zLkFsbG93U2VhcmNoRmlsdGVyID0gdHJ1ZTtcclxuXHJcblxyXG4gICAgdGhpcy5vcmdhbml6YXRpb24gPSBuZXcgRHJvcGRvd25PcHRpb25zKCk7XHJcbiAgICB0aGlzLm9yZ2FuaXphdGlvbi5OYW1lID0gXCJPcmdhbml6YXRpb25cIlxyXG4gICAgdGhpcy5vcmdhbml6YXRpb24uTGFiZWxLZXkgPSBcIk9yZ2FuaXphdGlvblwiXHJcbiAgICB0aGlzLm9yZ2FuaXphdGlvbi5TZWxlY3RlZEl0ZW1zID0gbnVsbDtcclxuICAgIHRoaXMub3JnYW5pemF0aW9uLkRhdGFTb3VyY2UgPSB0aGlzLm9yZ2FuaXphdGlvbkxpc3RcclxuICAgIHRoaXMub3JnYW5pemF0aW9uLlNpbmdsZVNlbGVjdGlvbiA9IHRydWU7XHJcbiAgICB0aGlzLm9yZ2FuaXphdGlvbi5BbGxvd1NlYXJjaEZpbHRlciA9IHRydWU7XHJcbiAgICB0aGlzLm9yZ2FuaXphdGlvbi5Jc1JlcXVpcmVkID0gdHJ1ZTtcclxuXHJcbiAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKEFkZFBlcm1pc3Npb25TZXRNb2RhbCk7XHJcbiAgICB0aGlzLnV0aWxpdHlTZXJ2aWNlLnN0b3BCbG9ja1VJKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgZ2V0QWRkUGVybWlzc2lvblNldE1vZGVsID0gKCkgPT4ge1xyXG4gICAgbGV0IHBhcmFtQXJyYXk6IGFueVtdID0gW107XHJcbiAgICBsZXQgUmVzdWx0TW9kZWwgPSB0aGlzLmFkZFBlcm1pc3Npb25TZXRGb3JtLnZhbHVlO1xyXG4gICAgbGV0IEFkZFBlcm1pc3Npb25TZXRNb2RlbDogUGVybWlzc2lvblNldE1vZGVsID0gbmV3IFBlcm1pc3Npb25TZXRNb2RlbCgpO1xyXG4gICAgaWYgKHRoaXMuUHJvZHVjdGlvbk1vZGUgPT0gZmFsc2UpXHJcbiAgICAgIEFkZFBlcm1pc3Npb25TZXRNb2RlbC5TeXNOYW1lID0gUmVzdWx0TW9kZWwuU3lzTmFtZTtcclxuICAgIEFkZFBlcm1pc3Npb25TZXRNb2RlbC5OYW1lLkFyYWJpYyA9IFJlc3VsdE1vZGVsLk5hbWUuQXJhYmljVmFsdWU7XHJcbiAgICBBZGRQZXJtaXNzaW9uU2V0TW9kZWwuTmFtZS5FbmdsaXNoID0gUmVzdWx0TW9kZWwuTmFtZS5FbmdsaXNoVmFsdWU7XHJcbiAgICBBZGRQZXJtaXNzaW9uU2V0TW9kZWwuT3JnYW5pemF0aW9uSUQgPSBOdW1iZXIoUmVzdWx0TW9kZWwuT3JnYW5pemF0aW9uKTtcclxuICAgIGxldCBJZHMgPSBbXTtcclxuICAgIGlmIChSZXN1bHRNb2RlbC5QZXJtaXNzaW9ucyAhPSBudWxsKSB7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBSZXN1bHRNb2RlbC5QZXJtaXNzaW9ucy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gUmVzdWx0TW9kZWwuUGVybWlzc2lvbnNbaW5kZXhdO1xyXG4gICAgICAgIElkcy5wdXNoKE51bWJlcihlbGVtZW50KSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIEFkZFBlcm1pc3Npb25TZXRNb2RlbC5QZXJtaXNzaW9uSURzID0gSWRzO1xyXG5cclxuICAgIHBhcmFtQXJyYXkucHVzaChBZGRQZXJtaXNzaW9uU2V0TW9kZWwpO1xyXG4gICAgcmV0dXJuIHBhcmFtQXJyYXk7XHJcbiAgfVxyXG5cclxuICBnZXRBZGRQZXJtaXNzaW9uU2V0RnVuY3Rpb24gPSAoQWRkTW9kZWwpOiBPYnNlcnZhYmxlPGFueT4gPT4ge1xyXG4gICAgcmV0dXJuIHRoaXMucGVybWlzc2lvblNldFNlcnZpY2UuYWRkUGVybWlzc2lvblNldChBZGRNb2RlbCk7XHJcbiAgfVxyXG4gIC8vLy8vLy8vLy8vLyBFbmQgb2YgYWRkIFBlcm1pc3Npb25TZXQgcGFydC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcblxyXG4gIFxyXG4gIC8vLy8vLy8vLy8vU3RhcnQgb2YgUGVybWlzc2lvblNldCBwYXJ0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG4gIHNob3dFZGl0UGVybWlzc2lvblNldE1vZGFsKHBlcm1pc3Npb25TZXRJRDogc3RyaW5nLCBlZGl0UGVybWlzc2lvblNldE1vZGFsKSB7XHJcblxyXG4gICAgdGhpcy5lZGl0UGVybWlzc2lvblNldEZvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuXHJcbiAgICB0aGlzLmVkaXRQZXJtaXNzaW9uU2V0Rm9ybU9wdGlvbnMgPSBuZXcgRm9ybU9wdGlvbnMoKTtcclxuICAgIHRoaXMuZWRpdFBlcm1pc3Npb25TZXRGb3JtT3B0aW9ucy5Gb3JtR3JvdXAgPSB0aGlzLmVkaXRQZXJtaXNzaW9uU2V0Rm9ybVxyXG4gICAgdGhpcy5lZGl0UGVybWlzc2lvblNldEZvcm1PcHRpb25zLkdldE1vZGVsRnVuY3Rpb24gPSB0aGlzLmdldEVkaXRQZXJtaXNzaW9uU2V0TW9kZWw7XHJcbiAgICB0aGlzLmVkaXRQZXJtaXNzaW9uU2V0Rm9ybU9wdGlvbnMuU2VydmljZVN1Ym1pdEZ1bmN0aW9uID0gdGhpcy5nZXRFZGl0UGVybWlzc2lvblNldEZ1bmN0aW9uO1xyXG4gICAgdGhpcy5lZGl0UGVybWlzc2lvblNldEZvcm1PcHRpb25zLlBhZ2luZ1JlZmVyZW5jZSA9IHRoaXMucGFnaW5nRWxlbWVudFxyXG5cclxuXHJcbiAgICB0aGlzLnBlcm1pc3Npb25TZXRTZXJ2aWNlLmdldFBlcm1pc3Npb25TZXQocGVybWlzc2lvblNldElEKS5zdWJzY3JpYmUoKHJlc3VsdDogYW55KSA9PiB7XHJcbiAgICAgIGxldCBQZXJtaXNzaW9uU2V0ID0gcmVzdWx0Lm1vZGVsIGFzIGFueTtcclxuICAgICAgbGV0IG5hbWUgPSBuZXcgRW5nbGlzaEFyYWJpY0RUTygpO1xyXG4gICAgICBuYW1lLkFyYWJpYyA9IFBlcm1pc3Npb25TZXQubmFtZS5hcmFiaWM7XHJcbiAgICAgIG5hbWUuRW5nbGlzaCA9IFBlcm1pc3Npb25TZXQubmFtZS5lbmdsaXNoO1xyXG5cclxuICAgICAgdGhpcy5lZGl0TXVsdGlMaW5ndWFsTmFtZSA9IG5ldyBNdWx0aUxpbmd1YWxUZXh0Qm94T3B0aW9ucygpO1xyXG4gICAgICB0aGlzLmVkaXRNdWx0aUxpbmd1YWxOYW1lLk5hbWUgPSBcIk5hbWVcIjtcclxuICAgICAgdGhpcy5lZGl0TXVsdGlMaW5ndWFsTmFtZS5BcmFiaWNMYWJlbEtleSA9IFwiTmFtZUluQXJhYmljXCI7XHJcbiAgICAgIHRoaXMuZWRpdE11bHRpTGluZ3VhbE5hbWUuRW5nbGlzaExhYmVsS2V5ID0gXCJOYW1lSW5FbmdsaXNoXCI7XHJcbiAgICAgIHRoaXMuZWRpdE11bHRpTGluZ3VhbE5hbWUuSXNSZXF1aXJlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuZWRpdE11bHRpTGluZ3VhbE5hbWUuVmFsdWUgPSBuYW1lO1xyXG4gIFxyXG4gICAgICB0aGlzLmVkaXRQZXJtaXNzaW9uU2V0SWQgPSBQZXJtaXNzaW9uU2V0LmlkXHJcbiAgXHJcbiAgICAgIHRoaXMuZWRpdEFjdGl2ZURpcmVjdG9yeUdyb3VwID0gbmV3IFRleHRCb3hPcHRpb25zKCk7XHJcbiAgICAgIHRoaXMuZWRpdEFjdGl2ZURpcmVjdG9yeUdyb3VwLk5hbWUgPSBcIkFjdGl2ZURpcmVjdG9yeUdyb3VwXCI7XHJcbiAgICAgIHRoaXMuZWRpdEFjdGl2ZURpcmVjdG9yeUdyb3VwLkxhYmVsS2V5ID0gXCJBY3RpdmVEaXJlY3RvcnlHcm91cFwiO1xyXG4gICAgICB0aGlzLmVkaXRBY3RpdmVEaXJlY3RvcnlHcm91cC5UeXBlID0gSW5wdXRUeXBlLlRleHQ7XHJcbiAgICAgIHRoaXMuZWRpdEFjdGl2ZURpcmVjdG9yeUdyb3VwLlZhbHVlID0gUGVybWlzc2lvblNldC5hY3RpdmVEaXJlY3RvcnlHcm91cDtcclxuXHJcbiAgICAgIHRoaXMuZWRpdFN5c05hbWUgPSBuZXcgVGV4dEJveE9wdGlvbnMoKTtcclxuICAgICAgdGhpcy5lZGl0U3lzTmFtZS5OYW1lID0gXCJTeXNOYW1lXCI7XHJcbiAgICAgIHRoaXMuZWRpdFN5c05hbWUuTGFiZWxLZXkgPSBcIlN5c05hbWVcIjtcclxuICAgICAgdGhpcy5lZGl0U3lzTmFtZS5UeXBlID0gSW5wdXRUeXBlLlRleHQ7XHJcbiAgICAgIHRoaXMuZWRpdFN5c05hbWUuVmFsdWUgPSBQZXJtaXNzaW9uU2V0LnN5c05hbWU7XHJcbiAgXHJcbiAgICAgIGxldCBzZWxlY3RlZFBlcm1pc3Npb25MaXN0ID0gW107XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBQZXJtaXNzaW9uU2V0LnBlcm1pc3Npb25JRHMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgY29uc3QgUGVybWlzc2lvbiA9IHRoaXMucGVybWlzc2lvbkxpc3QuZmlsdGVyKChpdGVtKSA9PiB7IHJldHVybiBwYXJzZUludChpdGVtLmtleSkgPT0gUGVybWlzc2lvblNldC5wZXJtaXNzaW9uSURzW2luZGV4XTsgfSkubWFwKChpdGVtKSA9PiBpdGVtLmtleSlbMF07XHJcbiAgICAgICAgc2VsZWN0ZWRQZXJtaXNzaW9uTGlzdC5wdXNoKFBlcm1pc3Npb24pXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuZWRpdFBlcm1pc3Npb25zID0gbmV3IERyb3Bkb3duT3B0aW9ucygpO1xyXG4gICAgICB0aGlzLmVkaXRQZXJtaXNzaW9ucy5OYW1lID0gXCJQZXJtaXNzaW9uc1wiXHJcbiAgICAgIHRoaXMuZWRpdFBlcm1pc3Npb25zLkxhYmVsS2V5ID0gXCJQZXJtaXNzaW9uc1wiXHJcbiAgICAgIHRoaXMuZWRpdFBlcm1pc3Npb25zLlNlbGVjdGVkSXRlbXMgPSBzZWxlY3RlZFBlcm1pc3Npb25MaXN0O1xyXG4gICAgICB0aGlzLmVkaXRQZXJtaXNzaW9ucy5EYXRhU291cmNlID0gdGhpcy5wZXJtaXNzaW9uTGlzdFxyXG4gICAgICB0aGlzLmVkaXRQZXJtaXNzaW9ucy5TaW5nbGVTZWxlY3Rpb24gPSBmYWxzZTtcclxuICAgICAgdGhpcy5lZGl0UGVybWlzc2lvbnMuQWxsb3dTZWFyY2hGaWx0ZXIgPSB0cnVlO1xyXG4gIFxyXG4gICAgICB0aGlzLmVkaXRPcmdhbml6YXRpb24gPSBuZXcgRHJvcGRvd25PcHRpb25zKCk7XHJcbiAgICAgIHRoaXMuZWRpdE9yZ2FuaXphdGlvbi5OYW1lID0gXCJPcmdhbml6YXRpb25cIlxyXG4gICAgICB0aGlzLmVkaXRPcmdhbml6YXRpb24uTGFiZWxLZXkgPSBcIk9yZ2FuaXphdGlvblwiXHJcbiAgICAgIHRoaXMuZWRpdE9yZ2FuaXphdGlvbi5TZWxlY3RlZEl0ZW1zID0gdGhpcy5vcmdhbml6YXRpb25MaXN0LmZpbHRlcigoaXRlbSkgPT4geyByZXR1cm4gcGFyc2VJbnQoaXRlbS5rZXkpID09IFBlcm1pc3Npb25TZXQub3JnYW5pemF0aW9uSUQ7IH0pLm1hcCgoaXRlbSkgPT4gaXRlbS5rZXkpWzBdO1xyXG4gICAgICB0aGlzLmVkaXRPcmdhbml6YXRpb24uRGF0YVNvdXJjZSA9IHRoaXMub3JnYW5pemF0aW9uTGlzdFxyXG4gICAgICB0aGlzLmVkaXRPcmdhbml6YXRpb24uU2luZ2xlU2VsZWN0aW9uID0gdHJ1ZTtcclxuICAgICAgdGhpcy5lZGl0T3JnYW5pemF0aW9uLkFsbG93U2VhcmNoRmlsdGVyID0gdHJ1ZTtcclxuICAgICAgdGhpcy5lZGl0T3JnYW5pemF0aW9uLklzUmVxdWlyZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKGVkaXRQZXJtaXNzaW9uU2V0TW9kYWwpO1xyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuICBcclxuICBnZXRFZGl0UGVybWlzc2lvblNldE1vZGVsID0gKCkgPT4ge1xyXG4gICAgbGV0IHBhcmFtQXJyYXk6IGFueVtdID0gW107XHJcbiAgICBsZXQgUmVzdWx0TW9kZWwgPSB0aGlzLmVkaXRQZXJtaXNzaW9uU2V0Rm9ybS52YWx1ZTtcclxuICAgICAgbGV0IEVkaXRQZXJtaXNzaW9uU2V0TW9kZWw6IFBlcm1pc3Npb25TZXRNb2RlbCA9IG5ldyBQZXJtaXNzaW9uU2V0TW9kZWwoKTtcclxuICAgICAgRWRpdFBlcm1pc3Npb25TZXRNb2RlbC5JZCA9IHRoaXMuZWRpdFBlcm1pc3Npb25TZXRJZDtcclxuICAgICAgRWRpdFBlcm1pc3Npb25TZXRNb2RlbC5OYW1lLkFyYWJpYyA9IFJlc3VsdE1vZGVsLk5hbWUuQXJhYmljVmFsdWU7XHJcbiAgICAgIEVkaXRQZXJtaXNzaW9uU2V0TW9kZWwuTmFtZS5FbmdsaXNoID0gUmVzdWx0TW9kZWwuTmFtZS5FbmdsaXNoVmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLlByb2R1Y3Rpb25Nb2RlID09IGZhbHNlKVxyXG4gICAgICAgIEVkaXRQZXJtaXNzaW9uU2V0TW9kZWwuU3lzTmFtZSA9IFJlc3VsdE1vZGVsLlN5ZE5hbWU7XHJcbiAgICAgIEVkaXRQZXJtaXNzaW9uU2V0TW9kZWwuT3JnYW5pemF0aW9uSUQgPSBOdW1iZXIoUmVzdWx0TW9kZWwuT3JnYW5pemF0aW9uKTtcclxuICAgICAgbGV0IElkcyA9IFtdO1xyXG4gICAgICBpZiAoUmVzdWx0TW9kZWwuUGVybWlzc2lvbnMgIT0gbnVsbCkge1xyXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBSZXN1bHRNb2RlbC5QZXJtaXNzaW9ucy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBSZXN1bHRNb2RlbC5QZXJtaXNzaW9uc1tpbmRleF07XHJcbiAgICAgICAgICBJZHMucHVzaChOdW1iZXIoZWxlbWVudCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBFZGl0UGVybWlzc2lvblNldE1vZGVsLlBlcm1pc3Npb25JRHMgPSBJZHM7XHJcbiAgICBwYXJhbUFycmF5LnB1c2goRWRpdFBlcm1pc3Npb25TZXRNb2RlbCk7XHJcbiAgICByZXR1cm4gcGFyYW1BcnJheTtcclxuICB9XHJcblxyXG4gIGdldEVkaXRQZXJtaXNzaW9uU2V0RnVuY3Rpb24gPSAoRWRpdFBlcm1pc3Npb25TZXRNb2RlbCk6IE9ic2VydmFibGU8YW55PiA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5wZXJtaXNzaW9uU2V0U2VydmljZS5lZGl0UGVybWlzc2lvblNldChFZGl0UGVybWlzc2lvblNldE1vZGVsKVxyXG4gIH1cclxuICAvLy8vLy8vLy8vL0VuZCBvZiBlZGl0IFBlcm1pc3Npb25TZXQgcGFydC8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuXHJcblxyXG4gICAvLy8vLy8vLy8vL1N0YXJ0IG9mIGRlbGV0ZSBQZXJtaXNzaW9uU2V0IHBhcnQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgIHNob3dEZWxldGVQZXJtaXNzaW9uU2V0TW9kYWwoUGVybWlzc2lvblNldElkOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuZGVsZXRlQ29udHJvbExvYWRlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5kZWxldGVkUGVybWlzc2lvblNldElkID0gUGVybWlzc2lvblNldElkO1xyXG4gICAgLy9hcnJheSBzZW50IHRvIHNlcnZpY2UgZnVuY3Rpb25cclxuICAgIGxldCBwYXJhbUFycmF5OiBhbnlbXSA9IFtdO1xyXG4gICAgcGFyYW1BcnJheS5wdXNoKHRoaXMuZGVsZXRlZFBlcm1pc3Npb25TZXRJZCk7XHJcblxyXG4gICAgdGhpcy5kZWxldGVDb25maXJtYXRpb25PcHRpb25zID0gbmV3IENvbmZpcm1hdGlvbk1vZGFsT3B0aW9ucygpO1xyXG4gICAgdGhpcy5kZWxldGVDb25maXJtYXRpb25PcHRpb25zLlNlcnZpY2VTdWJtaXRGdW5jdGlvbiA9IHRoaXMuZGVsZXRlUGVybWlzc2lvblNldDtcclxuICAgIHRoaXMuZGVsZXRlQ29uZmlybWF0aW9uT3B0aW9ucy5TZXJ2aWNlU3VibWl0TW9kZWwgPSBwYXJhbUFycmF5O1xyXG4gICAgdGhpcy5kZWxldGVDb25maXJtYXRpb25PcHRpb25zLlBhZ2luZ1JlZmVyZW5jZSA9IHRoaXMucGFnaW5nRWxlbWVudDtcclxuXHJcbiAgICB0aGlzLmRlbGV0ZUNvbnRyb2xMb2FkZWQgPSB0cnVlO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuQ29uZmlybWF0aW9uTW9kYWxDb250cm9sLnNob3dNb2RhbCgpO1xyXG4gICAgfSwgMjAwKTtcclxuICB9XHJcblxyXG4gIGRlbGV0ZVBlcm1pc3Npb25TZXQgPSAoaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5wZXJtaXNzaW9uU2V0U2VydmljZS5kZWxldGVQZXJtaXNzaW9uU2V0KGlkKVxyXG4gIH1cclxuICAgLy8vLy8vLy8vLy9FbmQgb2YgZGVsZXRlIFBlcm1pc3Npb25TZXQgcGFydC8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuXHJcbiAgIGZpbHRlclBlcm1pc3Npb25TZXRMaXN0KHNlYXJjaFZhbHVlKXtcclxuICAgIGlmKHNlYXJjaFZhbHVlKVxyXG4gICAgdGhpcy5maWx0ZXJlZFBlcm1pc3Npb25TZXRQYWdpbmdSZXN1bHQ9IHRoaXMucGVybWlzc2lvblNldFBhZ2luZ1Jlc3VsdC5maWx0ZXIoaXRlbSA9PiBpdGVtLnBlcm1pc3Npb25TZXROYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVmFsdWUudG9Mb3dlckNhc2UoKSkpO1xyXG4gICAgZWxzZVxyXG4gICAgdGhpcy5maWx0ZXJlZFBlcm1pc3Npb25TZXRQYWdpbmdSZXN1bHQ9IHRoaXMucGVybWlzc2lvblNldFBhZ2luZ1Jlc3VsdFxyXG4gIH1cclxuXHJcbiAgLy8vLy8vLy8vLy9EZXN0cm95IE9ic2VydmFibGUgLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5yZXF1ZXN0SGFuZGxlclNlcnZpY2UuZGVzdHJveUhhbmRsZXIoKTtcclxuICB9XHJcblxyXG5cclxuXHJcbiBcclxuXHJcblxyXG59XHJcbiIsIjxibG9jay11aT5cclxuICA8IS0tIFN1YmhlYWRlciAtLT5cclxuICA8IS0tIFBhZ2UgQ29udGVudCAtLT5cclxuICA8ZGl2ICBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhcmQgY2FyZC1jdXN0b20taFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgYm9yZGVyLTAgcHQtNVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLXRpdGxlIGFsaWduLWl0ZW1zLXN0YXJ0IGZsZXgtY29sdW1uXCIgKm5nSWY9XCJpc0ZpbHRlckxvYWRlZFwiPlxyXG4gICAgICAgICAgPEJCU0YtVGV4dEJveCBbb3B0aW9uc109XCJzZWFyY2hUZXh0Qm94XCIgKE9uQ2hhbmdlKT1cImZpbHRlclBlcm1pc3Npb25TZXRMaXN0KCRldmVudClcIiBbZ3JvdXBdPVwicGVybWlzc2lvblNldEZvcm1cIj48L0JCU0YtVGV4dEJveD5cclxuICAgICAgIFxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLXRvb2xiYXJcIj5cclxuICAgICAgICAgIDwhLS0gYmVnaW46Ok1lbnUgLS0+XHJcblxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1wcmltYXJ5XCIgdGl0bGU9XCJBZGRcIiAoY2xpY2spPVwic2hvd0FkZFBlcm1pc3Npb25TZXRNb2RhbChBZGRQZXJtaXNzaW9uU2V0TW9kYWwpXCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXBsdXMgbWUtMVwiPjwvaT5cclxuICAgICAgICAgICAge3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiQWRkXCIpfX1cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgIDwhLS0gZW5kOjpNZW51IC0tPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBweS0zXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmVcIj5cclxuICAgICAgICAgIDwhLS1iZWdpbjo6UGVybWlzc2lvbiBsaXN0LS0+XHJcbiAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBhbGlnbi1taWRkbGUgdGFibGUtcm93LWRhc2hlZCBmcy02IGd5LTUgZGF0YVRhYmxlIG5vLWZvb3RlclwiPlxyXG4gICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgPHRyIGNsYXNzPVwidGV4dC1zdGFydCB0ZXh0LWdyYXktNDAwIGZ3LWJvbGRlciBmcy03IHRleHQtdXBwZXJjYXNlIGdzLTBcIj5cclxuICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cIm1pbi13LTE1MHB4XCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiTmFtZVwiKX19PC90aD5cclxuICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cIm1pbi13LTE1MHB4XCIgKm5nSWY9XCIhUHJvZHVjdGlvbk1vZGVcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJTeXNOYW1lXCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwibWluLXctMTUwcHhcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJVc2Vyc0NvdW50XCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwibWluLXctNTBweFwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkFjdGlvblwiKX19PC90aD5cclxuICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICA8dGJvZHkgaWQ9XCJsaXN0aW5nQ29udGFpbmVyXCIgY2xhc3M9XCJmdy1ib2xkIHRleHQtZ3JheS02MDAgYm9yZGVyLTBcIj5cclxuXHJcbiAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBQZXJtaXNzaW9uU2V0IG9mIGZpbHRlcmVkUGVybWlzc2lvblNldFBhZ2luZ1Jlc3VsdFwiPlxyXG5cclxuICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiIFtyb3V0ZXJMaW5rXT1cIlsnL0FkbWluL1JvbGVzL1Blcm1pc3Npb25TZXRJbmZvJyxQZXJtaXNzaW9uU2V0LnBlcm1zZXRJREVuY11cIiByb3V0ZXJMaW5rQWN0aXZlPVwicm91dGVyLWxpbmstYWN0aXZlXCJcclxuICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWRhcmtcIj57e1Blcm1pc3Npb25TZXQucGVybWlzc2lvblNldE5hbWV9fTwvYT5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFQcm9kdWN0aW9uTW9kZVwiPnt7UGVybWlzc2lvblNldC5zeXNOYW1lfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgPHRkPnt7UGVybWlzc2lvblNldC51c2Vyc0NvdW50fX08L3RkPlxyXG4gICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudVwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4taWNvbiBidG4tbGlnaHQgYnRuLWFjdGl2ZS1saWdodC1wcmltYXJ5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWVsbGlwc2lzLWhcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1tZW51ICNtZW51PVwibWF0TWVudVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkcm9wLWl0ZW0gcHgtM1wiIG5nYkRyb3Bkb3duSXRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dFZGl0UGVybWlzc2lvblNldE1vZGFsKFBlcm1pc3Npb25TZXQucGVybXNldElERW5jLEVkaXRQZXJtaXNzaW9uU2V0TW9kYWwpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHJvcC1saW5rIHB4LTNcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJFZGl0XCIpfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8YSBuZ2JEcm9wZG93bkl0ZW0gY2xhc3M9XCJkcm9wLWl0ZW0gcHgtM1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd0RlbGV0ZVBlcm1pc3Npb25TZXRNb2RhbChQZXJtaXNzaW9uU2V0LnBlcm1zZXRJREVuYylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkcm9wLWxpbmsgcHgtM1wiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkRlbGV0ZVwiKX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LW1lbnU+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgIDx0ciAqbmdJZj1cImZpbHRlcmVkUGVybWlzc2lvblNldFBhZ2luZ1Jlc3VsdC5sZW5ndGggPT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgPHRkIFthdHRyLmNvbHNwYW5dPVwiUHJvZHVjdGlvbk1vZGUgPyAnMycgOiAnNCdcIj5cclxuICAgICAgICAgICAgICAgICAgPGxpYi1lbXB0eS1kYXRhPjwvbGliLWVtcHR5LWRhdGE+XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgPCEtLWVuZDo6UGVybWlzc2lvbiBsaXN0LS0+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQtZm9vdGVyIGJvcmRlci0wXCI+XHJcbiAgICAgICAgPEJCU0YtUGFnaW5nIChJdGVtcyk9XCJzZXRQZXJtaXNzaW9uU2V0TGlzdFJlc3VsdCgkZXZlbnQpXCIgKm5nSWY9XCJpc0ZpbHRlckxvYWRlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cInBlcm1pc3Npb25TZXRQYWdpbmdcIiBbZ3JvdXBdPVwicGVybWlzc2lvblNldEZvcm1cIiAjUGVybWlzc2lvblNldFBhZ2luZ1ZpZXdFbGVtZW50PlxyXG4gICAgICAgIDwvQkJTRi1QYWdpbmc+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gIDwvZGl2PlxyXG5cclxuXHJcbiAgPCEtLSBBZGQgTW9kYWwgLS0+XHJcbiAgPG5nLXRlbXBsYXRlICNBZGRQZXJtaXNzaW9uU2V0TW9kYWwgbGV0LW1vZGFsPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlciBwYi0wIGJvcmRlci0wIGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cImV4YW1wbGVNb2RhbExhYmVsXCI+PC9oNT5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygpXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1pY29uIGJ0bi1hY3RpdmUtY29sb3ItcHJpbWFyeVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic3ZnLWljb24gc3ZnLWljb24tMVwiPlxyXG4gICAgICAgICAgPHNwYW4gW2lubGluZVNWR109XCInLi9zcmMvYXNzZXRzL2ltYWdlcy9hcnIwNjEuc3ZnJ1wiPjwvc3Bhbj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBzY3JvbGwteSBweC0xMCBweC1sZy0xNSBwdC0wIHBiLTE1XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0xMyB0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgIDxoMSBjbGFzcz1cIm1iLTNcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJBZGRQZXJtaXNzaW9uU2V0XCIpfX08L2gxPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPEJCU0YtRm9ybSBbb3B0aW9uc109XCJhZGRQZXJtaXNzaW9uU2V0Rm9ybU9wdGlvbnNcIj5cclxuICAgICAgICA8QkJTRi1NdWx0aUxpbmd1YWxUZXh0Qm94IFtvcHRpb25zXT1cIm11bHRpTGluZ3VhbE5hbWVcIiBbZ3JvdXBdPVwiYWRkUGVybWlzc2lvblNldEZvcm1cIj48L0JCU0YtTXVsdGlMaW5ndWFsVGV4dEJveD5cclxuICAgICAgICA8QkJTRi1UZXh0Qm94IFtvcHRpb25zXT1cImFjdGl2ZURpcmVjdG9yeUdyb3VwXCIgW2dyb3VwXT1cImFkZFBlcm1pc3Npb25TZXRGb3JtXCI+XHJcbiAgICAgICAgPC9CQlNGLVRleHRCb3g+XHJcbiAgICAgICAgPEJCU0YtVGV4dEJveCAqbmdJZj1cIiFQcm9kdWN0aW9uTW9kZVwiIFtvcHRpb25zXT1cInN5c05hbWVcIiBbZ3JvdXBdPVwiYWRkUGVybWlzc2lvblNldEZvcm1cIj5cclxuICAgICAgICA8L0JCU0YtVGV4dEJveD5cclxuICAgICAgICA8QkJTRi1Ecm9wZG93bkxpc3QgW29wdGlvbnNdPVwicGVybWlzc2lvbnNcIiBbZ3JvdXBdPVwiYWRkUGVybWlzc2lvblNldEZvcm1cIj5cclxuICAgICAgICA8L0JCU0YtRHJvcGRvd25MaXN0PlxyXG4gICAgICAgIDxCQlNGLURyb3Bkb3duTGlzdCBbb3B0aW9uc109XCJvcmdhbml6YXRpb25cIiBbZ3JvdXBdPVwiYWRkUGVybWlzc2lvblNldEZvcm1cIj5cclxuICAgICAgICA8L0JCU0YtRHJvcGRvd25MaXN0PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciBwdC03XCI+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAjQ2xvc2VQZXJtaXNzaW9uU2V0TW9kYWwgaWQ9XCJDbG9zZVBlcm1pc3Npb25TZXRNb2RhbFwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IG1lLTMgYnRuLXNtXCIgKGNsaWNrKT1cIm1vZGFsLmRpc21pc3MoKVwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkNhbmNlbExhYmVsXCIpfX0gPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc21cIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJTYXZlTGFiZWxcIil9fTwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L0JCU0YtRm9ybT5cclxuXHJcbiAgICA8L2Rpdj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG5cclxuXHJcblxyXG4gIDwhLS0gRWRpdCBNb2RhbCAtLT5cclxuICA8bmctdGVtcGxhdGUgI0VkaXRQZXJtaXNzaW9uU2V0TW9kYWwgbGV0LW1vZGFsPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlciBwYi0wIGJvcmRlci0wIGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cImV4YW1wbGVNb2RhbExhYmVsXCI+PC9oNT5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygpXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1pY29uIGJ0bi1hY3RpdmUtY29sb3ItcHJpbWFyeVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic3ZnLWljb24gc3ZnLWljb24tMVwiPlxyXG4gICAgICAgICAgPHNwYW4gW2lubGluZVNWR109XCInLi9zcmMvYXNzZXRzL2ltYWdlcy9hcnIwNjEuc3ZnJ1wiPjwvc3Bhbj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBzY3JvbGwteSBweC0xMCBweC1sZy0xNSBwdC0wIHBiLTE1XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0xMyB0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgIDxoMSBjbGFzcz1cIm1iLTNcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJFZGl0UGVybWlzc2lvblNldFwiKX19PC9oMT5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxCQlNGLUZvcm0gW29wdGlvbnNdPVwiZWRpdFBlcm1pc3Npb25TZXRGb3JtT3B0aW9uc1wiPlxyXG4gICAgICAgIDxCQlNGLU11bHRpTGluZ3VhbFRleHRCb3ggW29wdGlvbnNdPVwiZWRpdE11bHRpTGluZ3VhbE5hbWVcIiBbZ3JvdXBdPVwiZWRpdFBlcm1pc3Npb25TZXRGb3JtXCI+PC9CQlNGLU11bHRpTGluZ3VhbFRleHRCb3g+XHJcbiAgICAgICAgPEJCU0YtVGV4dEJveCBbb3B0aW9uc109XCJlZGl0QWN0aXZlRGlyZWN0b3J5R3JvdXBcIiBbZ3JvdXBdPVwiZWRpdFBlcm1pc3Npb25TZXRGb3JtXCI+XHJcbiAgICAgICAgPC9CQlNGLVRleHRCb3g+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIiFQcm9kdWN0aW9uTW9kZVwiPlxyXG4gICAgICAgICAgPEJCU0YtVGV4dEJveCBbb3B0aW9uc109XCJlZGl0U3lzTmFtZVwiIFtncm91cF09XCJlZGl0UGVybWlzc2lvblNldEZvcm1cIj5cclxuICAgICAgICAgIDwvQkJTRi1UZXh0Qm94PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxCQlNGLURyb3Bkb3duTGlzdCBbb3B0aW9uc109XCJlZGl0UGVybWlzc2lvbnNcIiBbZ3JvdXBdPVwiZWRpdFBlcm1pc3Npb25TZXRGb3JtXCI+XHJcbiAgICAgICAgPC9CQlNGLURyb3Bkb3duTGlzdD5cclxuICAgICAgICA8QkJTRi1Ecm9wZG93bkxpc3QgW29wdGlvbnNdPVwiZWRpdE9yZ2FuaXphdGlvblwiIFtncm91cF09XCJlZGl0UGVybWlzc2lvblNldEZvcm1cIj5cclxuICAgICAgICA8L0JCU0YtRHJvcGRvd25MaXN0PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciBwdC03XCI+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAjQ2xvc2VFZGl0UGVybWlzc2lvblNldE1vZGFsIGlkPVwiQ2xvc2VFZGl0UGVybWlzc2lvblNldE1vZGFsXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiBjbGFzcz1cImJ0biBidG4tbGlnaHQgbWUtMyBidG4tc21cIiAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygpXCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiQ2FuY2VsTGFiZWxcIil9fSA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1zbVwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlNhdmVMYWJlbFwiKX19PC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvQkJTRi1Gb3JtPlxyXG5cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcblxyXG5cclxuIDwhLS1kZWxldGUgTW9kYWwtLT5cclxuIDxCQlNGLUNvbmZpcm1hdGlvbk1vZGFsICpuZ0lmPVwiZGVsZXRlQ29udHJvbExvYWRlZFwiIFtvcHRpb25zXT1cImRlbGV0ZUNvbmZpcm1hdGlvbk9wdGlvbnNcIiBpZD1cIkNvbmZpcm1hdGlvbk1vZGFsQ29udHJvbFwiXHJcbiAjQ29uZmlybWF0aW9uTW9kYWxDb250cm9sPjwvQkJTRi1Db25maXJtYXRpb25Nb2RhbD5cclxuICJdfQ==