@bnsights/bbsf-admin-portal 1.0.3 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/bundles/bnsights-bbsf-admin-portal.umd.js +19591 -20432
  2. package/bundles/bnsights-bbsf-admin-portal.umd.js.map +1 -1
  3. package/esm2015/lib/Pages/_layout/components/aside/aside-menu/aside-menu.component.js +2 -2
  4. package/esm2015/lib/Pages/configurations/configuration/configuration.component.js +407 -421
  5. package/esm2015/lib/Pages/departments/department/department.component.js +45 -83
  6. package/esm2015/lib/Pages/departments/department-info/department-info.component.js +85 -94
  7. package/esm2015/lib/Pages/departments/departments.module.js +4 -1
  8. package/esm2015/lib/Pages/helpCenter/help-center/help-center.component.js +224 -223
  9. package/esm2015/lib/Pages/helpCenter/help-center-secondlevel/help-center-secondlevel.component.js +137 -146
  10. package/esm2015/lib/Pages/helpCenter/help-center-thirdlevel/help-center-thirdlevel.component.js +136 -153
  11. package/esm2015/lib/Pages/home/home.component.js +32 -26
  12. package/esm2015/lib/Pages/home/home.module.js +5 -10
  13. package/esm2015/lib/Pages/impersonation-rules/impersonation-rules/impersonation-rules.component.js +336 -317
  14. package/esm2015/lib/Pages/jobs/jobs/jobs.component.js +168 -227
  15. package/esm2015/lib/Pages/license/license/license.component.js +68 -99
  16. package/esm2015/lib/Pages/localizations/localizations.component.js +379 -341
  17. package/esm2015/lib/Pages/logs/log/log.component.js +18 -27
  18. package/esm2015/lib/Pages/lookups/lookup/lookup.component.js +297 -288
  19. package/esm2015/lib/Pages/lookups/lookup-group/lookup-group.component.js +143 -165
  20. package/esm2015/lib/Pages/lookups/lookup-item/lookup-item.component.js +234 -233
  21. package/esm2015/lib/Pages/lookups/lookups-routing.module.js +2 -2
  22. package/esm2015/lib/Pages/notifications/add/add.component.js +83 -76
  23. package/esm2015/lib/Pages/notifications/edit/edit.component.js +60 -63
  24. package/esm2015/lib/Pages/notifications/edit-email/edit-email.component.js +128 -126
  25. package/esm2015/lib/Pages/notifications/edit-sms/edit-sms.component.js +87 -85
  26. package/esm2015/lib/Pages/notifications/master-layouts/master-layouts.component.js +57 -58
  27. package/esm2015/lib/Pages/notifications/notifications-routing.module.js +1 -3
  28. package/esm2015/lib/Pages/notifications/notifications.module.js +3 -4
  29. package/esm2015/lib/Pages/notifications/template-info/template-info.component.js +232 -228
  30. package/esm2015/lib/Pages/notifications/templates/templates.component.js +347 -310
  31. package/esm2015/lib/Pages/providers/provider/provider.component.js +53 -52
  32. package/esm2015/lib/Pages/publicHolidays/public-holiday/public-holiday.component.js +268 -270
  33. package/esm2015/lib/Pages/roles/permission-set-info/permission-set-info.component.js +136 -152
  34. package/esm2015/lib/Pages/roles/permissions/permissions.component.js +182 -218
  35. package/esm2015/lib/Pages/roles/permissionsets/permissionsets.component.js +219 -254
  36. package/esm2015/lib/Pages/sectors/department-info/department-info.component.js +134 -142
  37. package/esm2015/lib/Pages/sectors/sector/sector.component.js +127 -144
  38. package/esm2015/lib/Pages/sectors/sector-info/sector-info.component.js +123 -139
  39. package/esm2015/lib/Pages/shared/Enums/ParticipantType.js +8 -0
  40. package/esm2015/lib/Pages/shared/Services/ConfigurationsService.service.js +15 -12
  41. package/esm2015/lib/Pages/shared/Services/DepartmentService.service.js +4 -5
  42. package/esm2015/lib/Pages/shared/Services/EmailHeaderAndFooterTemplateService.Service.js +10 -9
  43. package/esm2015/lib/Pages/shared/Services/HelpCenterService.service.js +10 -7
  44. package/esm2015/lib/Pages/shared/Services/ImpersonationRuleService.service.js +14 -8
  45. package/esm2015/lib/Pages/shared/Services/LicenseService.service.js +3 -3
  46. package/esm2015/lib/Pages/shared/Services/LogsService.js +1 -1
  47. package/esm2015/lib/Pages/shared/Services/LookupGroupsService.service.js +11 -5
  48. package/esm2015/lib/Pages/shared/Services/LookupService.service.js +31 -15
  49. package/esm2015/lib/Pages/shared/Services/PermissionSetService.service.js +18 -8
  50. package/esm2015/lib/Pages/shared/Services/PermissionsService.service.js +12 -9
  51. package/esm2015/lib/Pages/shared/Services/PublicHolidayService.service.js +9 -3
  52. package/esm2015/lib/Pages/shared/Services/SectorService.service.js +18 -13
  53. package/esm2015/lib/Pages/shared/Services/TemplateService.service.js +36 -29
  54. package/esm2015/lib/Pages/shared/Services/localizationsService.service .js +23 -13
  55. package/esm2015/lib/Pages/shared/Services/provider.service.js +5 -7
  56. package/esm2015/lib/Pages/shared/Services/userService.service.js +10 -2
  57. package/esm2015/lib/Pages/shared/models/ConfigurationModels/ConfigurationModel.js +1 -1
  58. package/esm2015/lib/Pages/shared/models/DepartmentModels/DepartmentUsersIDRequestModel.js +1 -1
  59. package/esm2015/lib/Pages/shared/models/ImpersonationRuleModels/ImpersonationRuleModel.js +1 -1
  60. package/esm2015/lib/Pages/shared/models/Lookups/LookupItem.js +1 -1
  61. package/esm2015/lib/Pages/shared/models/Lookups/LookupModel.js +1 -2
  62. package/esm2015/lib/Pages/shared/models/PermissionsModels/PermissionSetUsersIDRequestModel.js +1 -1
  63. package/esm2015/lib/Pages/shared/models/SectorModels/SectorDepartmentModel.js +1 -1
  64. package/esm2015/lib/Pages/users/users.component.js +397 -409
  65. package/esm2015/lib/masterlayout-routing.module.js +5 -4
  66. package/esm2015/lib/masterlayout.component.js +23 -32
  67. package/esm2015/lib/masterlayout.module.js +25 -19
  68. package/fesm2015/bnsights-bbsf-admin-portal.js +17328 -17584
  69. package/fesm2015/bnsights-bbsf-admin-portal.js.map +1 -1
  70. package/lib/Pages/configurations/configuration/configuration.component.d.ts +31 -27
  71. package/lib/Pages/departments/department/department.component.d.ts +12 -11
  72. package/lib/Pages/departments/department-info/department-info.component.d.ts +31 -28
  73. package/lib/Pages/helpCenter/help-center/help-center.component.d.ts +34 -32
  74. package/lib/Pages/helpCenter/help-center-secondlevel/help-center-secondlevel.component.d.ts +31 -34
  75. package/lib/Pages/helpCenter/help-center-thirdlevel/help-center-thirdlevel.component.d.ts +30 -35
  76. package/lib/Pages/home/home.component.d.ts +4 -4
  77. package/lib/Pages/impersonation-rules/impersonation-rules/impersonation-rules.component.d.ts +43 -42
  78. package/lib/Pages/jobs/jobs/jobs.component.d.ts +56 -62
  79. package/lib/Pages/license/license/license.component.d.ts +25 -23
  80. package/lib/Pages/localizations/localizations.component.d.ts +77 -65
  81. package/lib/Pages/logs/log/log.component.d.ts +7 -11
  82. package/lib/Pages/lookups/lookup/lookup.component.d.ts +64 -59
  83. package/lib/Pages/lookups/lookup-group/lookup-group.component.d.ts +44 -45
  84. package/lib/Pages/lookups/lookup-item/lookup-item.component.d.ts +62 -56
  85. package/lib/Pages/notifications/add/add.component.d.ts +13 -11
  86. package/lib/Pages/notifications/edit/edit.component.d.ts +14 -14
  87. package/lib/Pages/notifications/edit-email/edit-email.component.d.ts +18 -20
  88. package/lib/Pages/notifications/edit-sms/edit-sms.component.d.ts +15 -16
  89. package/lib/Pages/notifications/master-layouts/master-layouts.component.d.ts +24 -25
  90. package/lib/Pages/notifications/notifications.module.d.ts +15 -16
  91. package/lib/Pages/notifications/template-info/template-info.component.d.ts +32 -32
  92. package/lib/Pages/notifications/templates/templates.component.d.ts +54 -46
  93. package/lib/Pages/providers/provider/provider.component.d.ts +13 -12
  94. package/lib/Pages/publicHolidays/public-holiday/public-holiday.component.d.ts +29 -27
  95. package/lib/Pages/roles/permission-set-info/permission-set-info.component.d.ts +39 -40
  96. package/lib/Pages/roles/permissions/permissions.component.d.ts +49 -54
  97. package/lib/Pages/roles/permissionsets/permissionsets.component.d.ts +53 -55
  98. package/lib/Pages/sectors/department-info/department-info.component.d.ts +41 -44
  99. package/lib/Pages/sectors/sector/sector.component.d.ts +35 -33
  100. package/lib/Pages/sectors/sector-info/sector-info.component.d.ts +40 -44
  101. package/lib/Pages/shared/Enums/ParticipantType.d.ts +6 -0
  102. package/lib/Pages/shared/Services/ConfigurationsService.service.d.ts +7 -8
  103. package/lib/Pages/shared/Services/DepartmentService.service.d.ts +2 -2
  104. package/lib/Pages/shared/Services/EmailHeaderAndFooterTemplateService.Service.d.ts +5 -5
  105. package/lib/Pages/shared/Services/HelpCenterService.service.d.ts +2 -1
  106. package/lib/Pages/shared/Services/ImpersonationRuleService.service.d.ts +5 -5
  107. package/lib/Pages/shared/Services/LicenseService.service.d.ts +2 -2
  108. package/lib/Pages/shared/Services/LookupGroupsService.service.d.ts +4 -4
  109. package/lib/Pages/shared/Services/LookupService.service.d.ts +14 -11
  110. package/lib/Pages/shared/Services/PermissionSetService.service.d.ts +8 -7
  111. package/lib/Pages/shared/Services/PermissionsService.service.d.ts +5 -6
  112. package/lib/Pages/shared/Services/PublicHolidayService.service.d.ts +2 -2
  113. package/lib/Pages/shared/Services/SectorService.service.d.ts +7 -7
  114. package/lib/Pages/shared/Services/TemplateService.service.d.ts +20 -19
  115. package/lib/Pages/shared/Services/localizationsService.service .d.ts +12 -11
  116. package/lib/Pages/shared/Services/provider.service.d.ts +1 -1
  117. package/lib/Pages/shared/Services/userService.service.d.ts +2 -0
  118. package/lib/Pages/shared/models/ConfigurationModels/ConfigurationModel.d.ts +0 -1
  119. package/lib/Pages/shared/models/DepartmentModels/DepartmentUsersIDRequestModel.d.ts +1 -1
  120. package/lib/Pages/shared/models/ImpersonationRuleModels/ImpersonationRuleModel.d.ts +0 -2
  121. package/lib/Pages/shared/models/Lookups/LookupModel.d.ts +1 -1
  122. package/lib/Pages/shared/models/PermissionsModels/PermissionSetUsersIDRequestModel.d.ts +1 -1
  123. package/lib/Pages/shared/models/SectorModels/SectorDepartmentModel.d.ts +1 -1
  124. package/lib/Pages/users/users.component.d.ts +54 -68
  125. package/lib/masterlayout.component.d.ts +4 -5
  126. package/lib/masterlayout.module.d.ts +8 -9
  127. package/package.json +3 -3
  128. package/src/lib/assets/sass/custom-styles.scss +115 -0
  129. package/src/lib/assets/sass/style-rtl.scss +2 -0
  130. package/src/lib/assets/sass/style.scss +2 -2
  131. package/esm2015/lib/Pages/notifications/edit-template/edit-template.component.js +0 -35
  132. package/lib/Pages/notifications/edit-template/edit-template.component.d.ts +0 -35
@@ -1,10 +1,10 @@
1
1
  import { __awaiter } from "tslib";
2
2
  import { Component, ViewChild } from '@angular/core';
3
3
  import { FormGroup } from '@angular/forms';
4
- import { AutocompleteDTO, AutocompleteOptions, CheckBoxOptions, DatePickerOptions, DropdownOptions, FilterItem, FilterType, ForceDirection, InputType, PagingOptions, PickerType, SelectMode, StartView, TextBoxOptions } from '@bnsights/bbsf-controls';
4
+ import { AutocompleteDTO, AutocompleteOptions, CheckBoxOptions, ConfirmationModalOptions, DatePickerOptions, DropdownOptions, FilterItem, FilterType, ForceDirection, FormOptions, InputType, PagingActionMode, PagingOptions, PickerType, SelectMode, StartView, TextBoxOptions } from '@bnsights/bbsf-controls';
5
5
  import { ImpersonationRuleModel } from '../../shared/models/ImpersonationRuleModels/ImpersonationRuleModel';
6
- import { UsersIDRequestModel } from '../../shared/models/UserModels/UsersIDRequestModel';
7
6
  import { PageInfoService } from '../../../_metronic/core/services/page-info.service';
7
+ import { ParticipantType } from '../../shared/Enums/ParticipantType';
8
8
  import * as i0 from "@angular/core";
9
9
  import * as i1 from "@bnsights/bbsf-utilities";
10
10
  import * as i2 from "../../../_metronic/core/services/page-info.service";
@@ -18,7 +18,7 @@ import * as i9 from "@angular/common";
18
18
  import * as i10 from "@angular/forms";
19
19
  import * as i11 from "ng-inline-svg";
20
20
  export class ImpersonationRulesComponent {
21
- constructor(authService, pageInfoService, utilityService, bbsfTranslateService, environmentService, ImpersonationRuleService, modalService) {
21
+ constructor(authService, pageInfoService, utilityService, bbsfTranslateService, environmentService, ImpersonationRuleService, modalService, requestHandlerService) {
22
22
  this.authService = authService;
23
23
  this.pageInfoService = pageInfoService;
24
24
  this.utilityService = utilityService;
@@ -26,33 +26,84 @@ export class ImpersonationRulesComponent {
26
26
  this.environmentService = environmentService;
27
27
  this.ImpersonationRuleService = ImpersonationRuleService;
28
28
  this.modalService = modalService;
29
- this.SubheaderTitle = this.utilityService.getResourceValue('ImpersonationRules');
30
- this.ShowToolbar = true;
31
- this.ShowbreadCrumb = false;
29
+ this.requestHandlerService = requestHandlerService;
30
+ //Page requirements
31
+ this.ShowPageContent = false;
32
32
  this.ApiUrl = "/api/admin/ImpersonationRule/";
33
33
  this.ImpersonationForm = new FormGroup({});
34
- this.showFilter = false;
35
34
  this.ImpersonationPagingResult = [];
35
+ this.clientSidePagingResult = [];
36
36
  this.IsFilterLoaded = false;
37
+ //Required lists
37
38
  this.PermissionSetList = [];
38
39
  this.ParticipantTypeList = [];
39
40
  //Add Model Controls
40
41
  this.AddImpersonationForm = new FormGroup({});
41
- this.ShowSourcePermissionList = false;
42
- this.ShowSourceUserAutoComplete = false;
43
- this.ShowDestinationPermissionList = false;
44
- this.ShowDestinationUserAutoComplete = false;
42
+ this.AddImpersonationFormOptions = new FormOptions;
43
+ this.AddShowSourcePermissionList = false;
44
+ this.AddShowSourceUserAutoComplete = false;
45
+ this.AddShowDestinationPermissionList = false;
46
+ this.AddShowDestinationUserAutoComplete = false;
45
47
  //Edit Model Controls
46
48
  this.EditImpersonationForm = new FormGroup({});
49
+ this.EditImpersonationFormOptions = new FormOptions;
47
50
  this.EditShowSourcePermissionList = false;
48
51
  this.EditShowSourceUserAutoComplete = false;
49
52
  this.EditShowDestinationPermissionList = false;
50
53
  this.EditShowDestinationUserAutoComplete = false;
51
- //delete Model Controls
52
- this.deleteImpersonationList = [];
53
- this.language = "";
54
- // Decorator wires up blockUI instance
55
- this.ShowPageContent = false;
54
+ this.deleteControlLoaded = false;
55
+ this.getAddImpersonationRuleModel = () => {
56
+ let paramArray = [];
57
+ let ResultModel = this.AddImpersonationForm.value;
58
+ let AddModel = new ImpersonationRuleModel();
59
+ AddModel.SourceParticipantDTO.ParticipantTypeItemID = Number(ResultModel.AddSourceParticipantType);
60
+ AddModel.DestinationParticipantDTO.ParticipantTypeItemID = Number(ResultModel.AddDestinationParticipantType);
61
+ AddModel.ExpiresAt = ResultModel.AddExpiresAt;
62
+ AddModel.IsActive = ResultModel.AddIsActive;
63
+ if (ResultModel.AddDestinationUserAutoComplete != null && ResultModel.AddDestinationUserAutoComplete != undefined)
64
+ AddModel.DestinationParticipantDTO.UserID = Number(ResultModel.AddDestinationUserAutoComplete.key);
65
+ else
66
+ AddModel.DestinationParticipantDTO.PermissionSetID = Number(ResultModel.AddDestinationPermissionSetList);
67
+ if (ResultModel.AddSourceUserAutoComplete != null && ResultModel.AddSourceUserAutoComplete != undefined)
68
+ AddModel.SourceParticipantDTO.UserID = Number(ResultModel.AddSourceUserAutoComplete.key);
69
+ else
70
+ AddModel.SourceParticipantDTO.PermissionSetID = Number(ResultModel.AddSourcePermissionSetList);
71
+ paramArray.push(AddModel);
72
+ return paramArray;
73
+ };
74
+ this.getAddImpersonationRuleFunction = (AddModel) => {
75
+ return this.ImpersonationRuleService.addImpersonationRule(AddModel);
76
+ };
77
+ this.getEditImpersonationRuleModel = () => {
78
+ let paramArray = [];
79
+ let ResultModel = this.EditImpersonationForm.value;
80
+ let EditModel = new ImpersonationRuleModel();
81
+ EditModel.ID = this.ImpersonationId;
82
+ EditModel.DestinationParticipantDTO.ID = this.DestinationParticipantId;
83
+ EditModel.SourceParticipantDTO.ID = this.SourceParticipantId;
84
+ EditModel.SourceParticipantDTO.ParticipantTypeItemID = Number(ResultModel.EditSourceParticipantType);
85
+ EditModel.DestinationParticipantDTO.ParticipantTypeItemID = Number(ResultModel.EditDestinationParticipantType);
86
+ EditModel.ExpiresAt = ResultModel.EditExpiresAt;
87
+ EditModel.IsActive = ResultModel.EditIsActive;
88
+ console.log("Data:");
89
+ console.log(ResultModel);
90
+ if (EditModel.DestinationParticipantDTO.ParticipantTypeItemID == ParticipantType.User)
91
+ EditModel.DestinationParticipantDTO.UserID = Number(ResultModel.EditDestinationUserAutoComplete.key);
92
+ else
93
+ EditModel.DestinationParticipantDTO.PermissionSetID = Number(ResultModel.EditDestinationPermissionSetList);
94
+ if (EditModel.SourceParticipantDTO.ParticipantTypeItemID == ParticipantType.User)
95
+ EditModel.SourceParticipantDTO.UserID = Number(ResultModel.EditSourceUserAutoComplete.key);
96
+ else
97
+ EditModel.SourceParticipantDTO.PermissionSetID = Number(ResultModel.EditSourcePermissionSetList);
98
+ paramArray.push(EditModel);
99
+ return paramArray;
100
+ };
101
+ this.getEditImpersonationRuleFunction = (EditModel) => {
102
+ return this.ImpersonationRuleService.editImpersonationRule(EditModel);
103
+ };
104
+ this.deleteImpersonation = (id) => {
105
+ return this.ImpersonationRuleService.deleteImpersonationRule(id);
106
+ };
56
107
  }
57
108
  ngOnInit() {
58
109
  return __awaiter(this, void 0, void 0, function* () {
@@ -65,49 +116,278 @@ export class ImpersonationRulesComponent {
65
116
  this.pageInfoService.calculateTitle();
66
117
  this.pageInfoService.calculateBreadcrumbs();
67
118
  this.bbsfTranslateService.onLangChange.subscribe((event) => {
68
- this.language = event.lang;
69
119
  this.ngOnInit();
70
120
  });
71
- this.language = yield this.utilityService.getCurrentLanguage();
72
- this.ProductionMode = this.environmentService.getProductionMode();
73
- this.LoadDropdownLists();
121
+ this.initializePage();
74
122
  });
75
123
  }
76
- DestinationParticipant(key) {
124
+ initializePage() {
125
+ // TextBox init
126
+ this.searchTextBox = new TextBoxOptions();
127
+ this.searchTextBox.Name = "searchTextBox";
128
+ this.searchTextBox.HideLabel = true;
129
+ this.searchTextBox.Type = InputType.Text;
130
+ this.searchTextBox.Placeholder = this.utilityService.getResourceValue("SearchByName");
131
+ this.TextInputFilter = new FilterItem();
132
+ this.TextInputFilter.FormControlName = "searchTextBox";
133
+ this.TextInputFilter.ActionParameterName = "searchText";
134
+ this.TextInputFilter.IsFormControl = true;
135
+ this.TextInputFilter.FilterType = FilterType.TextBox;
136
+ this.ImpersonationPaging = new PagingOptions();
137
+ this.ImpersonationPaging.ActionPostURL = this.ApiUrl + 'GetImpersonationRuleByFilter';
138
+ this.ImpersonationPaging.OnKeyPressFiltersControlNames = ["searchTextBox"];
139
+ this.ImpersonationPaging.Filters = [this.TextInputFilter];
140
+ this.ImpersonationPaging.ValidationToken = this.authService.authorizationHeaderValue();
141
+ this.IsFilterLoaded = true;
142
+ }
143
+ //Paging functions
144
+ setImpersonationListResult(result) {
145
+ this.ImpersonationPagingResult = result;
146
+ this.clientSidePagingResult = result;
147
+ this.ShowPageContent = true;
148
+ this.utilityService.stopBlockUI();
149
+ }
150
+ searchClientSide(searchValue) {
151
+ if (searchValue)
152
+ this.clientSidePagingResult = this.clientSidePagingResult.filter(function (item) {
153
+ var sourceParticipantName = item.sourceParticipantDTO.participantName;
154
+ var destinationParticipantName = item.destinationParticipantDTO.participantName;
155
+ return (sourceParticipantName.english.toLowerCase().includes(searchValue.toLowerCase())
156
+ || sourceParticipantName.arabic.toLowerCase().includes(searchValue.toLowerCase())
157
+ || destinationParticipantName.arabic.toLowerCase().includes(searchValue.toLowerCase())
158
+ || destinationParticipantName.arabic.toLowerCase().includes(searchValue.toLowerCase()));
159
+ });
160
+ else
161
+ this.clientSidePagingResult = this.ImpersonationPagingResult;
162
+ }
163
+ //Add impersonation rule functions
164
+ showAddImpersonationModal(AddImpersonationModal) {
165
+ this.utilityService.startBlockUI();
166
+ this.ImpersonationRuleService.loadAddDropdowns().subscribe((result) => {
167
+ let DropdownLists = result;
168
+ this.PermissionSetList = DropdownLists.permissionList;
169
+ this.ParticipantTypeList = DropdownLists.participantTypeList;
170
+ this.AddImpersonationForm = new FormGroup({});
171
+ this.AddImpersonationFormOptions = new FormOptions();
172
+ this.AddImpersonationFormOptions.FormGroup = this.AddImpersonationForm;
173
+ this.AddImpersonationFormOptions.GetModelFunction = this.getAddImpersonationRuleModel;
174
+ this.AddImpersonationFormOptions.ServiceSubmitFunction = this.getAddImpersonationRuleFunction;
175
+ this.AddImpersonationFormOptions.PagingReference = this.pagingElement;
176
+ this.AddShowDestinationPermissionList = false;
177
+ this.AddShowDestinationUserAutoComplete = false;
178
+ this.AddShowSourcePermissionList = false;
179
+ this.AddShowSourceUserAutoComplete = false;
180
+ this.AddSourceParticipantType = new DropdownOptions();
181
+ this.AddSourceParticipantType.Name = "AddSourceParticipantType";
182
+ this.AddSourceParticipantType.LabelKey = "SourceParticipantType";
183
+ this.AddSourceParticipantType.SelectedItems = null;
184
+ this.AddSourceParticipantType.DataSource = this.ParticipantTypeList;
185
+ this.AddSourceParticipantType.SingleSelection = true;
186
+ this.AddSourceParticipantType.AllowSearchFilter = true;
187
+ this.AddSourceParticipantType.IsRequired = true;
188
+ this.AddDestinationParticipantType = new DropdownOptions();
189
+ this.AddDestinationParticipantType.Name = "AddDestinationParticipantType";
190
+ this.AddDestinationParticipantType.LabelKey = "DestinationParticipantType";
191
+ this.AddDestinationParticipantType.SelectedItems = null;
192
+ this.AddDestinationParticipantType.DataSource = this.ParticipantTypeList;
193
+ this.AddDestinationParticipantType.SingleSelection = true;
194
+ this.AddDestinationParticipantType.AllowSearchFilter = true;
195
+ this.AddDestinationParticipantType.IsRequired = true;
196
+ this.AddSourcePermissionSetList = new DropdownOptions();
197
+ this.AddSourcePermissionSetList.Name = "AddSourcePermissionSetList";
198
+ this.AddSourcePermissionSetList.LabelKey = "SourcePermissionSetList";
199
+ this.AddSourcePermissionSetList.SelectedItems = null;
200
+ this.AddSourcePermissionSetList.DataSource = this.PermissionSetList;
201
+ this.AddSourcePermissionSetList.SingleSelection = true;
202
+ this.AddSourcePermissionSetList.AllowSearchFilter = true;
203
+ this.AddSourcePermissionSetList.IsRequired = true;
204
+ this.AddDestinationPermissionSetList = new DropdownOptions();
205
+ this.AddDestinationPermissionSetList.Name = "AddDestinationPermissionSetList";
206
+ this.AddDestinationPermissionSetList.LabelValue = "DestinationPermissionSetList";
207
+ this.AddDestinationPermissionSetList.LabelKey = "DestinationPermissionSetList";
208
+ this.AddDestinationPermissionSetList.SelectedItems = null;
209
+ this.AddDestinationPermissionSetList.DataSource = this.PermissionSetList;
210
+ this.AddDestinationPermissionSetList.SingleSelection = true;
211
+ this.AddDestinationPermissionSetList.AllowSearchFilter = true;
212
+ this.AddDestinationPermissionSetList.IsRequired = true;
213
+ this.AddSourceUserAutoComplete = new AutocompleteOptions();
214
+ this.AddSourceUserAutoComplete.Name = "AddSourceUserAutoComplete";
215
+ this.AddSourceUserAutoComplete.LabelKey = "User";
216
+ this.AddSourceUserAutoComplete.Type = InputType.Text;
217
+ this.AddSourceUserAutoComplete.IsRequired = true;
218
+ this.AddSourceUserAutoComplete.Value = null;
219
+ this.AddSourceUserAutoComplete.ForceDirection = ForceDirection.English;
220
+ this.AddSourceUserAutoComplete.ActionURL = this.environmentService.getApiUrl() + this.ApiUrl + "AutoCompleteUser";
221
+ this.AddSourceUserAutoComplete.ValidationToken = this.authService.authorizationHeaderValue();
222
+ this.AddDestinationUserAutoComplete = new AutocompleteOptions();
223
+ this.AddDestinationUserAutoComplete.Name = "AddDestinationUserAutoComplete";
224
+ this.AddDestinationUserAutoComplete.LabelKey = "User";
225
+ this.AddDestinationUserAutoComplete.Type = InputType.Text;
226
+ this.AddDestinationUserAutoComplete.IsRequired = true;
227
+ this.AddDestinationUserAutoComplete.Value = null;
228
+ this.AddDestinationUserAutoComplete.ActionURL = this.environmentService.getApiUrl() + this.ApiUrl + "AutoCompleteUser";
229
+ this.AddDestinationUserAutoComplete.ValidationToken = this.authService.authorizationHeaderValue();
230
+ this.AddIsActive = new CheckBoxOptions();
231
+ this.AddIsActive.Name = "AddIsActive";
232
+ this.AddIsActive.LabelKey = "Active";
233
+ this.AddIsActive.IsDisabled = true;
234
+ this.AddIsActive.Value = true;
235
+ this.AddExpiresAt = new DatePickerOptions();
236
+ this.AddExpiresAt.Name = "AddExpiresAt";
237
+ this.AddExpiresAt.LabelKey = "ExpiresAt";
238
+ this.AddExpiresAt.IsRequired = true;
239
+ this.AddExpiresAt.StartView = StartView.Month;
240
+ this.AddExpiresAt.PickerType = PickerType.Calendar;
241
+ this.AddExpiresAt.SelectMode = SelectMode.Single;
242
+ this.modalService.open(AddImpersonationModal);
243
+ this.utilityService.stopBlockUI();
244
+ });
245
+ }
246
+ addDestinationParticipantOnChange(key) {
77
247
  let sourceItem = this.ParticipantTypeList.filter((item) => { return parseInt(item.key) == key; }).map((item) => item)[0];
78
248
  //console.log(sourceItem)
79
249
  switch (sourceItem.value) {
80
250
  case "PermissionSet":
81
- this.ShowDestinationPermissionList = true;
82
- this.ShowDestinationUserAutoComplete = false;
251
+ this.AddShowDestinationPermissionList = true;
252
+ this.AddShowDestinationUserAutoComplete = false;
83
253
  break;
84
254
  case "User":
85
- this.ShowDestinationPermissionList = false;
86
- this.ShowDestinationUserAutoComplete = true;
255
+ this.AddShowDestinationPermissionList = false;
256
+ this.AddShowDestinationUserAutoComplete = true;
87
257
  break;
88
258
  default:
89
259
  break;
90
260
  }
91
261
  }
92
- SourceParticipant(key) {
262
+ addSourceParticipantOnChange(key) {
93
263
  let sourceItem = this.ParticipantTypeList.filter((item) => { return parseInt(item.key) == key; }).map((item) => item)[0];
94
264
  //console.log(sourceItem)
95
265
  switch (sourceItem.value) {
96
266
  case "PermissionSet":
97
- this.ShowSourcePermissionList = true;
98
- this.ShowSourceUserAutoComplete = false;
267
+ this.AddShowSourcePermissionList = true;
268
+ this.AddShowSourceUserAutoComplete = false;
99
269
  break;
100
270
  case "User":
101
- this.ShowSourcePermissionList = false;
102
- this.ShowSourceUserAutoComplete = true;
271
+ this.AddShowSourcePermissionList = false;
272
+ this.AddShowSourceUserAutoComplete = true;
103
273
  break;
104
274
  default:
105
275
  break;
106
276
  }
107
277
  }
108
- EditDestinationParticipant(key) {
278
+ //Edit impersonation rule functions
279
+ showEditImpersonationModal(impersonationID, impersonationIDEnc, editImpersonationModal) {
280
+ this.ImpersonationId = impersonationID;
281
+ this.ImpersonationRuleService.getEditImpersonationRule(impersonationIDEnc).subscribe((result) => {
282
+ let resultObj = result;
283
+ let impersonation = resultObj.model;
284
+ let lists = resultObj.lists;
285
+ this.PermissionSetList = lists.permissionList;
286
+ this.ParticipantTypeList = lists.participantTypeList;
287
+ this.EditImpersonationForm = new FormGroup({});
288
+ this.EditImpersonationFormOptions = new FormOptions();
289
+ this.EditImpersonationFormOptions.FormGroup = this.EditImpersonationForm;
290
+ this.EditImpersonationFormOptions.GetModelFunction = this.getEditImpersonationRuleModel;
291
+ this.EditImpersonationFormOptions.ServiceSubmitFunction = this.getEditImpersonationRuleFunction;
292
+ this.EditImpersonationFormOptions.PagingReference = this.pagingElement;
293
+ this.EditImpersonationFormOptions.PagingActionMode = PagingActionMode.Update;
294
+ this.EditShowDestinationPermissionList = false;
295
+ this.EditShowDestinationUserAutoComplete = false;
296
+ this.EditShowSourcePermissionList = false;
297
+ this.EditShowSourceUserAutoComplete = false;
298
+ if (impersonation.sourceParticipantDTO.participantTypeItemID != null && impersonation.destinationParticipantDTO.participantTypeItemID) {
299
+ this.editDestinationParticipantOnChange(impersonation.destinationParticipantDTO.participantTypeItemID);
300
+ this.editSourceParticipantOnChange(impersonation.sourceParticipantDTO.participantTypeItemID);
301
+ }
302
+ this.utilityService.startBlockUI();
303
+ this.SourceParticipantId = impersonation.sourceParticipantDTO.id;
304
+ this.DestinationParticipantId = impersonation.destinationParticipantDTO.id;
305
+ this.EditSourceParticipantType = new DropdownOptions();
306
+ this.EditSourceParticipantType.Name = "EditSourceParticipantType";
307
+ this.EditSourceParticipantType.LabelKey = "SourceParticipantType";
308
+ this.EditSourceParticipantType.SelectedItems = this.ParticipantTypeList.filter((item) => { return parseInt(item.key) == impersonation.sourceParticipantDTO.participantTypeItemID; }).map((item) => item.key)[0];
309
+ this.EditSourceParticipantType.DataSource = this.ParticipantTypeList;
310
+ this.EditSourceParticipantType.SingleSelection = true;
311
+ this.EditSourceParticipantType.AllowSearchFilter = true;
312
+ this.EditSourceParticipantType.IsRequired = true;
313
+ this.EditDestinationParticipantType = new DropdownOptions();
314
+ this.EditDestinationParticipantType.Name = "EditDestinationParticipantType";
315
+ this.EditDestinationParticipantType.LabelKey = "DestinationParticipantType";
316
+ this.EditDestinationParticipantType.SelectedItems = this.ParticipantTypeList.filter((item) => { return parseInt(item.key) == impersonation.destinationParticipantDTO.participantTypeItemID; }).map((item) => item.key)[0];
317
+ ;
318
+ this.EditDestinationParticipantType.DataSource = this.ParticipantTypeList;
319
+ this.EditDestinationParticipantType.SingleSelection = true;
320
+ this.EditDestinationParticipantType.AllowSearchFilter = true;
321
+ this.EditDestinationParticipantType.IsRequired = true;
322
+ let sourcePermissionSetSelectedItem;
323
+ let sourceUserModel = new AutocompleteDTO();
324
+ if (impersonation.sourceParticipantDTO.participantTypeItemID == ParticipantType.User) {
325
+ sourceUserModel.key = impersonation.sourceParticipantDTO.userID;
326
+ sourceUserModel.value = impersonation.sourceParticipantDTO.participantNameStr;
327
+ }
328
+ else {
329
+ sourcePermissionSetSelectedItem = this.PermissionSetList.filter((item) => { return parseInt(item.key) == impersonation.sourceParticipantDTO.permissionSetID; }).map((item) => item.key)[0];
330
+ }
331
+ this.EditSourcePermissionSetList = new DropdownOptions();
332
+ this.EditSourcePermissionSetList.Name = "EditSourcePermissionSetList";
333
+ this.EditSourcePermissionSetList.LabelKey = "SourcePermissionSetList";
334
+ this.EditSourcePermissionSetList.SelectedItems = sourcePermissionSetSelectedItem;
335
+ this.EditSourcePermissionSetList.DataSource = this.PermissionSetList;
336
+ this.EditSourcePermissionSetList.SingleSelection = true;
337
+ this.EditSourcePermissionSetList.AllowSearchFilter = true;
338
+ this.EditSourcePermissionSetList.IsRequired = true;
339
+ this.EditSourceUserAutoComplete = new AutocompleteOptions();
340
+ this.EditSourceUserAutoComplete.Name = "EditSourceUserAutoComplete";
341
+ this.EditSourceUserAutoComplete.LabelKey = "User";
342
+ this.EditSourceUserAutoComplete.Type = InputType.Text;
343
+ this.EditSourceUserAutoComplete.IsRequired = true;
344
+ this.EditSourceUserAutoComplete.SelectedValue = sourceUserModel;
345
+ this.EditSourceUserAutoComplete.ActionURL = this.environmentService.getApiUrl() + this.ApiUrl + "AutoCompleteUser";
346
+ this.EditSourceUserAutoComplete.ValidationToken = this.authService.authorizationHeaderValue();
347
+ let destinationPermissionSetSelectedItem;
348
+ let destinationUserModel = new AutocompleteDTO();
349
+ if (impersonation.destinationParticipantDTO.participantTypeItemID == ParticipantType.User) {
350
+ destinationUserModel.key = impersonation.destinationParticipantDTO.userID;
351
+ destinationUserModel.value = impersonation.destinationParticipantDTO.participantNameStr;
352
+ }
353
+ else {
354
+ destinationPermissionSetSelectedItem = this.PermissionSetList.filter((item) => { return parseInt(item.key) == impersonation.destinationParticipantDTO.permissionSetID; }).map((item) => item.key)[0];
355
+ }
356
+ this.EditDestinationPermissionSetList = new DropdownOptions();
357
+ this.EditDestinationPermissionSetList.Name = "EditDestinationPermissionSetList";
358
+ this.EditDestinationPermissionSetList.LabelKey = "DestinationPermissionSetList";
359
+ this.EditDestinationPermissionSetList.SelectedItems = destinationPermissionSetSelectedItem;
360
+ this.EditDestinationPermissionSetList.DataSource = this.PermissionSetList;
361
+ this.EditDestinationPermissionSetList.SingleSelection = true;
362
+ this.EditDestinationPermissionSetList.AllowSearchFilter = true;
363
+ this.EditDestinationPermissionSetList.IsRequired = true;
364
+ this.EditDestinationUserAutoComplete = new AutocompleteOptions();
365
+ this.EditDestinationUserAutoComplete.Name = "EditDestinationUserAutoComplete";
366
+ this.EditDestinationUserAutoComplete.LabelKey = "User";
367
+ this.EditDestinationUserAutoComplete.Type = InputType.Text;
368
+ this.EditDestinationUserAutoComplete.IsRequired = true;
369
+ this.EditDestinationUserAutoComplete.SelectedValue = destinationUserModel;
370
+ this.EditDestinationUserAutoComplete.ActionURL = this.environmentService.getApiUrl() + this.ApiUrl + "AutoCompleteUser";
371
+ this.EditDestinationUserAutoComplete.ValidationToken = this.authService.authorizationHeaderValue();
372
+ this.EditIsActive = new CheckBoxOptions();
373
+ this.EditIsActive.Name = "EditIsActive";
374
+ this.EditIsActive.LabelKey = "Active";
375
+ this.EditIsActive.IsDisabled = true;
376
+ this.EditIsActive.Value = true;
377
+ this.EditExpiresAt = new DatePickerOptions();
378
+ this.EditExpiresAt.Name = "EditExpiresAt";
379
+ this.EditExpiresAt.LabelKey = "ExpiresAt";
380
+ this.EditExpiresAt.IsRequired = true;
381
+ this.EditExpiresAt.Value = impersonation.expiresAt;
382
+ this.EditExpiresAt.StartView = StartView.Month;
383
+ this.EditExpiresAt.PickerType = PickerType.Calendar;
384
+ this.EditExpiresAt.SelectMode = SelectMode.Single;
385
+ this.modalService.open(editImpersonationModal);
386
+ this.utilityService.stopBlockUI();
387
+ });
388
+ }
389
+ editDestinationParticipantOnChange(key) {
109
390
  let sourceItem = this.ParticipantTypeList.filter((item) => { return parseInt(item.key) == key; }).map((item) => item)[0];
110
- //console.log(sourceItem)
111
391
  switch (sourceItem.value) {
112
392
  case "PermissionSet":
113
393
  this.EditShowDestinationPermissionList = true;
@@ -121,9 +401,8 @@ export class ImpersonationRulesComponent {
121
401
  break;
122
402
  }
123
403
  }
124
- EditSourceParticipant(key) {
404
+ editSourceParticipantOnChange(key) {
125
405
  let sourceItem = this.ParticipantTypeList.filter((item) => { return parseInt(item.key) == key; }).map((item) => item)[0];
126
- //console.log(sourceItem)
127
406
  switch (sourceItem.value) {
128
407
  case "PermissionSet":
129
408
  this.EditShowSourcePermissionList = true;
@@ -137,299 +416,39 @@ export class ImpersonationRulesComponent {
137
416
  break;
138
417
  }
139
418
  }
140
- LoadDropdownLists() {
141
- this.ImpersonationRuleService.Loaddropdowns().subscribe((result) => {
142
- let DropdownLists = result;
143
- this.PermissionSetList = DropdownLists.permissionList;
144
- this.ParticipantTypeList = DropdownLists.participantTypeList;
145
- // TextBox inti
146
- this.searchTextBox = new TextBoxOptions();
147
- this.searchTextBox.Name = "searchTextBox";
148
- this.searchTextBox.HideLabel = true;
149
- this.searchTextBox.Type = InputType.Text;
150
- this.searchTextBox.Placeholder = this.utilityService.getResourceValue("SearchByName");
151
- this.TextInputFilter = new FilterItem();
152
- this.TextInputFilter.FormControlName = "searchTextBox";
153
- this.TextInputFilter.ActionParameterName = "searchText";
154
- this.TextInputFilter.IsFormControl = true;
155
- this.TextInputFilter.FilterType = FilterType.TextBox;
156
- this.ImpersonationPaging = new PagingOptions();
157
- this.ImpersonationPaging.ActionPostURL = this.environmentService.getApiUrl() + this.ApiUrl + 'GetImpersonationRuleByFilter';
158
- this.ImpersonationPaging.OnKeyPressFiltersControlNames = ["searchTextBox"];
159
- this.ImpersonationPaging.Filters = [this.TextInputFilter];
160
- this.ImpersonationPaging.ValidationToken = this.authService.authorizationHeaderValue();
161
- this.IsFilterLoaded = true;
162
- });
163
- }
164
- ReinitializeSectorPaging() {
165
- let element = this.input;
166
- element.ReinitializePaging();
167
- }
168
- UpdateSectorPaging() {
169
- let element = this.input;
170
- element.UpdatePaging();
171
- }
172
- setImpersonationListResult(result) {
173
- this.ImpersonationPagingResult = result;
174
- this.ShowPageContent = true;
175
- this.utilityService.stopBlockUI();
176
- }
177
- resetFilters() {
178
- this.ImpersonationForm.controls["searchTextBox"].setValue(null);
179
- let element = this.input;
180
- element.ReinitializePaging();
181
- }
182
- showAddImpersonationModal(AddImpersonationModal) {
183
- this.AddImpersonationForm = new FormGroup({});
184
- this.ShowDestinationPermissionList = false;
185
- this.ShowDestinationUserAutoComplete = false;
186
- this.ShowSourcePermissionList = false;
187
- this.ShowSourceUserAutoComplete = false;
188
- this.utilityService.startBlockUI();
189
- this.SourceParticipantType = new DropdownOptions();
190
- this.SourceParticipantType.Name = "SourceParticipantType";
191
- this.SourceParticipantType.LabelKey = "SourceParticipantType";
192
- this.SourceParticipantType.SelectedItems = null;
193
- this.SourceParticipantType.DataSource = this.ParticipantTypeList;
194
- this.SourceParticipantType.SingleSelection = true;
195
- this.SourceParticipantType.AllowSearchFilter = true;
196
- this.SourceParticipantType.IsRequired = true;
197
- this.DestinationParticipantType = new DropdownOptions();
198
- this.DestinationParticipantType.Name = "DestinationParticipantType";
199
- this.DestinationParticipantType.LabelKey = "DestinationParticipantType";
200
- this.DestinationParticipantType.SelectedItems = null;
201
- this.DestinationParticipantType.DataSource = this.ParticipantTypeList;
202
- this.DestinationParticipantType.SingleSelection = true;
203
- this.DestinationParticipantType.AllowSearchFilter = true;
204
- this.DestinationParticipantType.IsRequired = true;
205
- this.SourcePermissionSetList = new DropdownOptions();
206
- this.SourcePermissionSetList.Name = "SourcePermissionSetList";
207
- this.SourcePermissionSetList.LabelKey = "SourcePermissionSetList";
208
- this.SourcePermissionSetList.SelectedItems = null;
209
- this.SourcePermissionSetList.DataSource = this.PermissionSetList;
210
- this.SourcePermissionSetList.SingleSelection = true;
211
- this.SourcePermissionSetList.AllowSearchFilter = true;
212
- this.SourcePermissionSetList.IsRequired = true;
213
- this.DestinationPermissionSetList = new DropdownOptions();
214
- this.DestinationPermissionSetList.Name = "DestinationPermissionSetList";
215
- this.DestinationPermissionSetList.LabelValue = "DestinationPermissionSetList";
216
- this.DestinationPermissionSetList.LabelKey = "DestinationPermissionSetList";
217
- this.DestinationPermissionSetList.SelectedItems = null;
218
- this.DestinationPermissionSetList.DataSource = this.PermissionSetList;
219
- this.DestinationPermissionSetList.SingleSelection = true;
220
- this.DestinationPermissionSetList.AllowSearchFilter = true;
221
- this.DestinationPermissionSetList.IsRequired = true;
222
- this.SourceUserAutoComplete = new AutocompleteOptions();
223
- this.SourceUserAutoComplete.Name = "SourceUserAutoComplete";
224
- this.SourceUserAutoComplete.LabelKey = "User";
225
- this.SourceUserAutoComplete.Type = InputType.Text;
226
- this.SourceUserAutoComplete.IsRequired = true;
227
- this.SourceUserAutoComplete.Value = null;
228
- this.SourceUserAutoComplete.ForceDirection = ForceDirection.English;
229
- this.SourceUserAutoComplete.ActionURL = this.environmentService.getApiUrl() + this.ApiUrl + "AutoCompleteUser";
230
- this.SourceUserAutoComplete.ValidationToken = this.authService.authorizationHeaderValue();
231
- this.DestinationUserAutoComplete = new AutocompleteOptions();
232
- this.DestinationUserAutoComplete.Name = "DestinationUserAutoComplete";
233
- this.DestinationUserAutoComplete.LabelKey = "User";
234
- this.DestinationUserAutoComplete.Type = InputType.Text;
235
- this.DestinationUserAutoComplete.IsRequired = true;
236
- this.DestinationUserAutoComplete.Value = null;
237
- this.DestinationUserAutoComplete.ActionURL = this.environmentService.getApiUrl() + this.ApiUrl + "AutoCompleteUser";
238
- this.DestinationUserAutoComplete.ValidationToken = this.authService.authorizationHeaderValue();
239
- this.IsActive = new CheckBoxOptions();
240
- this.IsActive.Name = "IsActive";
241
- this.IsActive.LabelKey = "Active";
242
- this.IsActive.IsDisabled = true;
243
- this.IsActive.Value = true;
244
- this.ExpiresAt = new DatePickerOptions();
245
- this.ExpiresAt.Name = "ExpiresAt";
246
- this.ExpiresAt.LabelKey = "ExpiresAt";
247
- this.ExpiresAt.IsRequired = true;
248
- this.ExpiresAt.StartView = StartView.Month;
249
- this.ExpiresAt.PickerType = PickerType.Calendar;
250
- this.ExpiresAt.SelectMode = SelectMode.Single;
251
- this.modalService.open(AddImpersonationModal);
252
- this.utilityService.stopBlockUI();
253
- }
254
- addImpersonation() {
255
- let ResultModel = this.AddImpersonationForm.value;
256
- let AddModel = new ImpersonationRuleModel();
257
- AddModel.SourceParticipantDTO.ParticipantTypeItemID = Number(ResultModel.SourceParticipantType);
258
- AddModel.DestinationParticipantDTO.ParticipantTypeItemID = Number(ResultModel.DestinationParticipantType);
259
- AddModel.ExpiresAt = ResultModel.ExpiresAt;
260
- AddModel.IsActive = ResultModel.IsActive;
261
- if (ResultModel.DestinationUserAutoComplete != null && ResultModel.DestinationUserAutoComplete != undefined)
262
- AddModel.DestinationParticipantDTO.UserID = Number(ResultModel.DestinationUserAutoComplete.key);
263
- AddModel.DestinationParticipantDTO.PermissionSetID = Number(ResultModel.DestinationPermissionSetList);
264
- if (ResultModel.SourceUserAutoComplete != null && ResultModel.SourceUserAutoComplete != undefined)
265
- AddModel.SourceParticipantDTO.UserID = Number(ResultModel.SourceUserAutoComplete.key);
266
- AddModel.SourceParticipantDTO.PermissionSetID = Number(ResultModel.SourcePermissionSetList);
267
- this.ImpersonationRuleService.AddImpersonationRule(AddModel).subscribe((result) => {
268
- this.modalService.dismissAll();
269
- let element = this.input;
270
- element.ReinitializePaging();
271
- }, (error) => {
272
- });
273
- }
274
- showEditImpersonationModal(Impersonation, EditImpersonationModal) {
275
- this.EditImpersonationForm = new FormGroup({});
276
- this.EditShowDestinationPermissionList = false;
277
- this.EditShowDestinationUserAutoComplete = false;
278
- this.EditShowSourcePermissionList = false;
279
- this.EditShowSourceUserAutoComplete = false;
280
- if (Impersonation.sourceParticipantDTO.participantTypeItemID != null && Impersonation.destinationParticipantDTO.participantTypeItemID) {
281
- this.EditDestinationParticipant(Impersonation.destinationParticipantDTO.participantTypeItemID);
282
- this.EditSourceParticipant(Impersonation.sourceParticipantDTO.participantTypeItemID);
283
- }
284
- this.utilityService.startBlockUI();
285
- this.ImpersonationId = Impersonation.id;
286
- this.SourceParticipantId = Impersonation.sourceParticipantDTO.id;
287
- this.DestinationParticipantId = Impersonation.destinationParticipantDTO.id;
288
- this.EditSourceParticipantType = new DropdownOptions();
289
- this.EditSourceParticipantType.Name = "EditSourceParticipantType";
290
- this.EditSourceParticipantType.LabelKey = "SourceParticipantType";
291
- this.EditSourceParticipantType.SelectedItems = this.ParticipantTypeList.filter((item) => { return parseInt(item.key) == Impersonation.sourceParticipantDTO.participantTypeItemID; }).map((item) => item.key)[0];
292
- this.EditSourceParticipantType.DataSource = this.ParticipantTypeList;
293
- this.EditSourceParticipantType.SingleSelection = true;
294
- this.EditSourceParticipantType.AllowSearchFilter = true;
295
- this.EditSourceParticipantType.IsRequired = true;
296
- this.EditDestinationParticipantType = new DropdownOptions();
297
- this.EditDestinationParticipantType.Name = "EditDestinationParticipantType";
298
- this.EditDestinationParticipantType.LabelKey = "DestinationParticipantType";
299
- this.EditDestinationParticipantType.SelectedItems = this.ParticipantTypeList.filter((item) => { return parseInt(item.key) == Impersonation.destinationParticipantDTO.participantTypeItemID; }).map((item) => item.key)[0];
300
- ;
301
- this.EditDestinationParticipantType.DataSource = this.ParticipantTypeList;
302
- this.EditDestinationParticipantType.SingleSelection = true;
303
- this.EditDestinationParticipantType.AllowSearchFilter = true;
304
- this.EditDestinationParticipantType.IsRequired = true;
305
- this.EditSourcePermissionSetList = new DropdownOptions();
306
- this.EditSourcePermissionSetList.Name = "EditSourcePermissionSetList";
307
- this.EditSourcePermissionSetList.LabelKey = "SourcePermissionSetList";
308
- this.EditSourcePermissionSetList.SelectedItems = this.PermissionSetList.filter((item) => { return parseInt(item.key) == Impersonation.sourceParticipantDTO.permissionSetID; }).map((item) => item.key)[0];
309
- ;
310
- this.EditSourcePermissionSetList.DataSource = this.PermissionSetList;
311
- this.EditSourcePermissionSetList.SingleSelection = true;
312
- this.EditSourcePermissionSetList.AllowSearchFilter = true;
313
- this.EditSourcePermissionSetList.IsRequired = true;
314
- this.EditDestinationPermissionSetList = new DropdownOptions();
315
- this.EditDestinationPermissionSetList.Name = "EditDestinationPermissionSetList";
316
- this.EditDestinationPermissionSetList.LabelKey = "DestinationPermissionSetList";
317
- this.EditDestinationPermissionSetList.SelectedItems = this.PermissionSetList.filter((item) => { return parseInt(item.key) == Impersonation.destinationParticipantDTO.permissionSetID; }).map((item) => item.key)[0];
318
- ;
319
- ;
320
- this.EditDestinationPermissionSetList.DataSource = this.PermissionSetList;
321
- this.EditDestinationPermissionSetList.SingleSelection = true;
322
- this.EditDestinationPermissionSetList.AllowSearchFilter = true;
323
- this.EditDestinationPermissionSetList.IsRequired = true;
324
- this.EditSourceUserAutoComplete = new AutocompleteOptions();
325
- this.EditSourceUserAutoComplete.Name = "EditSourceUserAutoComplete";
326
- this.EditSourceUserAutoComplete.LabelKey = "User";
327
- this.EditSourceUserAutoComplete.Type = InputType.Text;
328
- this.EditSourceUserAutoComplete.IsRequired = true;
329
- let model = new AutocompleteDTO();
330
- model.key = Impersonation.sourceParticipantDTO.userID;
331
- model.value = Impersonation.sourceParticipantDTO.participantName.current;
332
- this.EditSourceUserAutoComplete.SelectedValue = model;
333
- this.EditSourceUserAutoComplete.ActionURL = this.environmentService.getApiUrl() + this.ApiUrl + "AutoCompleteUser";
334
- this.EditSourceUserAutoComplete.ValidationToken = this.authService.authorizationHeaderValue();
335
- this.EditDestinationUserAutoComplete = new AutocompleteOptions();
336
- this.EditDestinationUserAutoComplete.Name = "EditDestinationUserAutoComplete";
337
- this.EditDestinationUserAutoComplete.LabelKey = "User";
338
- this.EditDestinationUserAutoComplete.Type = InputType.Text;
339
- this.EditDestinationUserAutoComplete.IsRequired = true;
340
- let DestinationUserModel = new AutocompleteDTO();
341
- DestinationUserModel.key = Impersonation.destinationParticipantDTO.userID;
342
- DestinationUserModel.value = Impersonation.destinationParticipantDTO.participantName.current;
343
- this.EditDestinationUserAutoComplete.SelectedValue = DestinationUserModel;
344
- this.EditDestinationUserAutoComplete.ActionURL = this.environmentService.getApiUrl() + this.ApiUrl + "AutoCompleteUser";
345
- this.EditDestinationUserAutoComplete.ValidationToken = this.authService.authorizationHeaderValue();
346
- this.EditIsActive = new CheckBoxOptions();
347
- this.EditIsActive.Name = "EditIsActive";
348
- this.EditIsActive.LabelKey = "Active";
349
- this.EditIsActive.IsDisabled = true;
350
- this.EditIsActive.Value = true;
351
- this.EditExpiresAt = new DatePickerOptions();
352
- this.EditExpiresAt.Name = "EditExpiresAt";
353
- this.EditExpiresAt.LabelKey = "ExpiresAt";
354
- this.EditExpiresAt.IsRequired = true;
355
- this.EditExpiresAt.Value = Impersonation.expiresAt;
356
- this.EditExpiresAt.StartView = StartView.Month;
357
- this.EditExpiresAt.PickerType = PickerType.Calendar;
358
- this.EditExpiresAt.SelectMode = SelectMode.Single;
359
- this.modalService.open(EditImpersonationModal);
360
- this.utilityService.stopBlockUI();
361
- }
362
- editImpersonation() {
363
- if (this.EditImpersonationForm.invalid) {
364
- return;
365
- }
366
- else {
367
- let ResultModel = this.EditImpersonationForm.value;
368
- let EditModel = new ImpersonationRuleModel();
369
- EditModel.ID = this.ImpersonationId;
370
- EditModel.DestinationParticipantDTO.ID = this.DestinationParticipantId;
371
- EditModel.SourceParticipantDTO.ID = this.SourceParticipantId;
372
- EditModel.SourceParticipantDTO.ParticipantTypeItemID = Number(ResultModel.EditSourceParticipantType);
373
- EditModel.DestinationParticipantDTO.ParticipantTypeItemID = Number(ResultModel.EditDestinationParticipantType);
374
- EditModel.ExpiresAt = ResultModel.EditExpiresAt;
375
- EditModel.IsActive = ResultModel.EditIsActive;
376
- console.log("Data:");
377
- console.log(ResultModel);
378
- if (ResultModel.EditDestinationUserAutoComplete != null && ResultModel.EditDestinationUserAutoComplete != undefined)
379
- EditModel.DestinationParticipantDTO.UserID = Number(ResultModel.EditDestinationUserAutoComplete.key);
380
- EditModel.DestinationParticipantDTO.PermissionSetID = Number(ResultModel.EditDestinationPermissionSetList);
381
- if (ResultModel.EditSourceUserAutoComplete != null && ResultModel.EditSourceUserAutoComplete != undefined)
382
- EditModel.SourceParticipantDTO.UserID = Number(ResultModel.EditSourceUserAutoComplete.key);
383
- EditModel.SourceParticipantDTO.PermissionSetID = Number(ResultModel.EditSourcePermissionSetList);
384
- this.ImpersonationRuleService.EditImpersonationRule(EditModel).subscribe((result) => {
385
- this.modalService.dismissAll();
386
- let element = this.input;
387
- element.UpdatePaging();
388
- }, (error) => {
389
- });
390
- }
391
- }
392
- showDeleteImpersonationModal(Sector, deleteImpersonationModal) {
393
- this.deleteImpersonationList = [];
394
- this.deleteImpersonationList.push(Sector);
395
- this.utilityService.startBlockUI();
396
- this.modalService.open(deleteImpersonationModal);
397
- this.utilityService.stopBlockUI();
419
+ //Delete ImpersonationRule
420
+ showDeleteImpersonationModal(impersonationRuleID) {
421
+ this.deleteImpersonationRuleId = impersonationRuleID;
422
+ //array sent to service function
423
+ let paramArray = [];
424
+ paramArray.push(this.deleteImpersonationRuleId);
425
+ this.DeleteConfirmationOptions = new ConfirmationModalOptions();
426
+ this.DeleteConfirmationOptions.ServiceSubmitFunction = this.deleteImpersonation;
427
+ this.DeleteConfirmationOptions.ServiceSubmitModel = paramArray;
428
+ this.DeleteConfirmationOptions.PagingReference = this.pagingElement;
429
+ this.deleteControlLoaded = true;
430
+ setTimeout(() => {
431
+ this.ConfirmationModalControl.showModal();
432
+ }, 200);
398
433
  }
399
- deleteImpersonation() {
400
- let UsersIDModel = new UsersIDRequestModel();
401
- for (let index = 0; index < this.deleteImpersonationList.length; index++) {
402
- const element = this.deleteImpersonationList[index];
403
- UsersIDModel.UsersIDs.push(element.id);
404
- }
405
- this.ImpersonationRuleService.DeleteImpersonationRule(UsersIDModel).subscribe((result) => {
406
- this.deleteImpersonationList = [];
407
- this.modalService.dismissAll();
408
- let element = this.input;
409
- element.ReinitializePaging();
410
- }, (error) => {
411
- });
434
+ //On destroy
435
+ ngOnDestroy() {
436
+ this.requestHandlerService.destroyHandler();
412
437
  }
413
438
  }
414
- ImpersonationRulesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: ImpersonationRulesComponent, deps: [{ token: i1.AuthService }, { token: i2.PageInfoService }, { token: i1.UtilityService }, { token: i1.BBSFTranslateService }, { token: i1.EnvironmentService }, { token: i3.ImpersonationRuleService }, { token: i4.NgbModal }], target: i0.ɵɵFactoryTarget.Component });
415
- ImpersonationRulesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.13", type: ImpersonationRulesComponent, selector: "lib-impersonation-rules", viewQueries: [{ propertyName: "input", first: true, predicate: ["ImpersonationPagingViewElement"], descendants: true }, { propertyName: "CloseImpersonationModal", first: true, predicate: ["CloseImpersonationModal"], descendants: true }, { propertyName: "CloseEditImpersonationModal", first: true, predicate: ["CloseEditImpersonationModal"], descendants: true }, { propertyName: "CloseDeleteImpersonationModal", first: true, predicate: ["CloseDeleteImpersonationModal"], descendants: true }], ngImport: i0, template: "<block-ui></block-ui>\r\n <!-- Page Content -->\r\n <div *ngIf=\"ShowPageContent\" 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]=\"ImpersonationForm\">\r\n <BBSF-TextBox [options]=\"searchTextBox\" [group]=\"ImpersonationForm\"></BBSF-TextBox>\r\n </form>\r\n </div>\r\n <div class=\"card-toolbar\">\r\n <!-- begin::Menu -->\r\n <button type=\"button\" class=\"btn btn-sm btn-primary\" title=\"Add\" (click)=\"showAddImpersonationModal(AddImpersonationModal)\">\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\r\n <th class=\"min-w-150px\"> [{{utilityService.getResourceValue(\"ParticipantType\")}}]{{utilityService.getResourceValue(\"Source\")}}</th>\r\n <th class=\"min-w-150px\"> [{{utilityService.getResourceValue(\"ParticipantType\")}}]{{utilityService.getResourceValue(\"Destination\")}}</th>\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"ExpiresAt\")}}</th>\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"Active\")}}</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 Impersonation of ImpersonationPagingResult\">\r\n\r\n <td>\r\n <span *ngIf=\"language=='ar'\" class=\"text-dark\">\r\n [{{Impersonation.sourceParticipantDTO.participantTypeItemName.arabic}}] {{Impersonation.sourceParticipantDTO.participantName.arabic}}\r\n </span>\r\n <span *ngIf=\"language=='en'\" class=\"text-dark\">\r\n [{{Impersonation.sourceParticipantDTO.participantTypeItemName.english}}] {{Impersonation.sourceParticipantDTO.participantName.english}}\r\n </span>\r\n\r\n </td>\r\n <td *ngIf=\"language=='ar'\"> [{{Impersonation.destinationParticipantDTO.participantTypeItemName.arabic}}] {{Impersonation.destinationParticipantDTO.participantName.arabic}}</td>\r\n <td *ngIf=\"language=='en'\">[{{Impersonation.destinationParticipantDTO.participantTypeItemName.english}}] {{Impersonation.destinationParticipantDTO.participantName.english}}</td>\r\n\r\n <td>{{Impersonation.expiresAt}}</td>\r\n <td>{{Impersonation.isActive}}</td>\r\n\r\n <td>\r\n\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)=\"showEditImpersonationModal(Impersonation,EditImpersonationModal)\">\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)=\"showDeleteImpersonationModal(Impersonation,deleteImpersonationModal)\">\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=\"ImpersonationPagingResult.length == 0\">\r\n <td colspan=\"5\">\r\n <lib-empty-data></lib-empty-data>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\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)=\"setImpersonationListResult($event)\" *ngIf=\"IsFilterLoaded\"\r\n [options]=\"ImpersonationPaging\" [group]=\"ImpersonationForm\" #ImpersonationPagingViewElement>\r\n </BBSF-Paging>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <!-- Add Modal -->\r\n <ng-template #AddImpersonationModal 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(\"Add\")}} {{utilityService.getResourceValue(\"ImpersonationRule\")}}</h1>\r\n </div>\r\n\r\n <form [formGroup]=\"AddImpersonationForm\" (ngSubmit)=\"addImpersonation()\">\r\n\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <BBSF-DropdownList [options]=\"SourceParticipantType\" (OnChange)=\"SourceParticipant($event)\" [group]=\"AddImpersonationForm\">\r\n </BBSF-DropdownList>\r\n </div>\r\n <div class=\"col-md-12\">\r\n <BBSF-DropdownList [options]=\"SourcePermissionSetList\" *ngIf=\"ShowSourcePermissionList\" [group]=\"AddImpersonationForm\">\r\n </BBSF-DropdownList>\r\n </div>\r\n <div class=\"col-md-12\">\r\n <BBSF-AutocompleteTextBox [options]=\"SourceUserAutoComplete\" *ngIf=\"ShowSourceUserAutoComplete\" [group]=\"AddImpersonationForm\">\r\n </BBSF-AutocompleteTextBox>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <BBSF-DropdownList [options]=\"DestinationParticipantType\" (OnChange)=\"DestinationParticipant($event)\" [group]=\"AddImpersonationForm\">\r\n </BBSF-DropdownList>\r\n </div>\r\n <div class=\"col-md-12\">\r\n <BBSF-DropdownList [options]=\"DestinationPermissionSetList\" *ngIf=\"ShowDestinationPermissionList\" [group]=\"AddImpersonationForm\">\r\n </BBSF-DropdownList>\r\n </div>\r\n <div class=\"col-md-12\">\r\n <BBSF-AutocompleteTextBox [options]=\"DestinationUserAutoComplete\" *ngIf=\"ShowDestinationUserAutoComplete\" [group]=\"AddImpersonationForm\">\r\n </BBSF-AutocompleteTextBox>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <BBSF-CheckBox [options]=\"IsActive\" [group]=\"AddImpersonationForm\">\r\n </BBSF-CheckBox>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <BBSF-DateTimePicker [options]=\"ExpiresAt\" [group]=\"AddImpersonationForm\">\r\n\r\n </BBSF-DateTimePicker>\r\n </div>\r\n </div>\r\n <div class=\"text-center pt-7\">\r\n <button CloseImpersonationModal id=\"CloseImpersonationModal\" type=\"button\" class=\"btn btn-light me-3 btn-sm\"\r\n (click)=\"modal.dismiss()\">\r\n {{utilityService.getResourceValue(\"CancelLabel\")}}\r\n </button>\r\n <button type=\"submit\" class=\"btn btn-primary btn-sm\">{{utilityService.getResourceValue(\"SaveLabel\")}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n </ng-template>\r\n <!--Edit Modal-->\r\n <ng-template #EditImpersonationModal 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(\"Edit\")}} {{utilityService.getResourceValue(\"ImpersonationRule\")}}</h1>\r\n </div>\r\n <form [formGroup]=\"EditImpersonationForm\" (ngSubmit)=\"editImpersonation()\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <BBSF-DropdownList [options]=\"EditSourceParticipantType\" (OnChange)=\"EditSourceParticipant($event)\" [group]=\"EditImpersonationForm\">\r\n </BBSF-DropdownList>\r\n </div>\r\n <div class=\"col-md-12\">\r\n <BBSF-DropdownList [options]=\"EditSourcePermissionSetList\" *ngIf=\"EditShowSourcePermissionList\" [group]=\"EditImpersonationForm\">\r\n </BBSF-DropdownList>\r\n </div>\r\n <div class=\"col-md-12\">\r\n <BBSF-AutocompleteTextBox [options]=\"EditSourceUserAutoComplete\" *ngIf=\"EditShowSourceUserAutoComplete\" [group]=\"EditImpersonationForm\">\r\n </BBSF-AutocompleteTextBox>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <BBSF-DropdownList [options]=\"EditDestinationParticipantType\" (OnChange)=\"EditDestinationParticipant($event)\" [group]=\"EditImpersonationForm\">\r\n </BBSF-DropdownList>\r\n </div>\r\n <div class=\"col-md-12\">\r\n <BBSF-DropdownList [options]=\"EditDestinationPermissionSetList\" *ngIf=\"EditShowDestinationPermissionList\" [group]=\"EditImpersonationForm\">\r\n </BBSF-DropdownList>\r\n </div>\r\n <div class=\"col-md-12\">\r\n <BBSF-AutocompleteTextBox [options]=\"EditDestinationUserAutoComplete\" *ngIf=\"EditShowDestinationUserAutoComplete\" [group]=\"EditImpersonationForm\">\r\n </BBSF-AutocompleteTextBox>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <BBSF-CheckBox [options]=\"EditIsActive\" [group]=\"EditImpersonationForm\">\r\n </BBSF-CheckBox>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <BBSF-DateTimePicker [options]=\"EditExpiresAt\" [group]=\"EditImpersonationForm\">\r\n\r\n </BBSF-DateTimePicker>\r\n </div>\r\n </div>\r\n <div class=\"text-center pt-7\">\r\n <button #CloseEditImpersonationModal id=\"CloseEditImpersonationModal\" 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=\"submit\" class=\"btn btn-primary btn-sm\">{{utilityService.getResourceValue(\"SaveLabel\")}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n </ng-template>\r\n <!--delete Modal-->\r\n <ng-template #deleteImpersonationModal 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(\"ImpersonationRule\")}}</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 #CloseDeleteImpersonationModal id=\"CloseDeleteImpersonationModal\" 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)=\"deleteImpersonation()\"\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", 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.ɵh, selector: "BBSF-DropdownList", inputs: ["group", "options"], outputs: ["OnChange", "onClear"] }, { type: i6.ɵq, selector: "BBSF-AutocompleteTextBox", inputs: ["group", "options"], outputs: ["OnChange"] }, { type: i6.ɵg, selector: "BBSF-CheckBox", inputs: ["group", "options"], outputs: ["OnChange"] }, { type: i6.ɵa, selector: "BBSF-DateTimePicker", inputs: ["group", "options"], outputs: ["OnChange"] }], directives: [{ type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i10.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i10.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { 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"] }] });
439
+ ImpersonationRulesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: ImpersonationRulesComponent, deps: [{ token: i1.AuthService }, { token: i2.PageInfoService }, { token: i1.UtilityService }, { token: i1.BBSFTranslateService }, { token: i1.EnvironmentService }, { token: i3.ImpersonationRuleService }, { token: i4.NgbModal }, { token: i1.RequestHandlerService }], target: i0.ɵɵFactoryTarget.Component });
440
+ ImpersonationRulesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.13", type: ImpersonationRulesComponent, selector: "lib-impersonation-rules", viewQueries: [{ propertyName: "pagingElement", first: true, predicate: ["ImpersonationPagingViewElement"], descendants: true }, { propertyName: "ConfirmationModalControl", first: true, predicate: ["ConfirmationModalControl"], descendants: true }], ngImport: i0, template: "<block-ui></block-ui>\r\n<!-- Page Content -->\r\n<div *ngIf=\"ShowPageContent\" 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]=\"ImpersonationForm\">\r\n <BBSF-TextBox (OnChange)=\"searchClientSide($event)\" [options]=\"searchTextBox\" [group]=\"ImpersonationForm\"></BBSF-TextBox>\r\n </form>\r\n </div>\r\n <div class=\"card-toolbar\">\r\n <!-- begin::Menu -->\r\n <button type=\"button\" class=\"btn btn-sm btn-primary\" title=\"Add\" (click)=\"showAddImpersonationModal(AddImpersonationModal)\">\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\r\n <th class=\"min-w-150px\"> [{{utilityService.getResourceValue(\"ParticipantType\")}}]{{utilityService.getResourceValue(\"Source\")}}</th>\r\n <th class=\"min-w-150px\"> [{{utilityService.getResourceValue(\"ParticipantType\")}}]{{utilityService.getResourceValue(\"Destination\")}}</th>\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"ExpiresAt\")}}</th>\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"Active\")}}</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 Impersonation of clientSidePagingResult\">\r\n\r\n <td>\r\n <span class=\"text-dark\">\r\n [{{Impersonation.sourceParticipantDTO.participantTypeItemNameStr}}] {{Impersonation.sourceParticipantDTO.participantNameStr}}\r\n </span>\r\n\r\n </td>\r\n <td> [{{Impersonation.destinationParticipantDTO.participantTypeItemNameStr}}] {{Impersonation.destinationParticipantDTO.participantNameStr}}</td>\r\n\r\n <td>{{Impersonation.expiresAt}}</td>\r\n <td>{{Impersonation.isActive}}</td>\r\n\r\n <td>\r\n\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)=\"showEditImpersonationModal(Impersonation.id,Impersonation.idEncrypted,EditImpersonationModal)\">\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)=\"showDeleteImpersonationModal(Impersonation.idEncrypted)\">\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=\"clientSidePagingResult.length == 0\">\r\n <td colspan=\"5\">\r\n <lib-empty-data></lib-empty-data>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\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)=\"setImpersonationListResult($event)\" *ngIf=\"IsFilterLoaded\"\r\n [options]=\"ImpersonationPaging\" [group]=\"ImpersonationForm\" #ImpersonationPagingViewElement>\r\n </BBSF-Paging>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n<!-- Add Modal -->\r\n<ng-template #AddImpersonationModal 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(\"Add\")}} {{utilityService.getResourceValue(\"ImpersonationRule\")}}</h1>\r\n </div>\r\n\r\n <BBSF-Form [options]=\"AddImpersonationFormOptions\">\r\n\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <BBSF-DropdownList [options]=\"AddSourceParticipantType\" (OnChange)=\"addSourceParticipantOnChange($event)\" [group]=\"AddImpersonationForm\">\r\n </BBSF-DropdownList>\r\n </div>\r\n <div class=\"col-md-12\">\r\n <BBSF-DropdownList [options]=\"AddSourcePermissionSetList\" *ngIf=\"AddShowSourcePermissionList\" [group]=\"AddImpersonationForm\">\r\n </BBSF-DropdownList>\r\n </div>\r\n <div class=\"col-md-12\">\r\n <BBSF-AutocompleteTextBox [options]=\"AddSourceUserAutoComplete\" *ngIf=\"AddShowSourceUserAutoComplete\" [group]=\"AddImpersonationForm\">\r\n </BBSF-AutocompleteTextBox>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <BBSF-DropdownList [options]=\"AddDestinationParticipantType\" (OnChange)=\"addDestinationParticipantOnChange($event)\" [group]=\"AddImpersonationForm\">\r\n </BBSF-DropdownList>\r\n </div>\r\n <div class=\"col-md-12\">\r\n <BBSF-DropdownList [options]=\"AddDestinationPermissionSetList\" *ngIf=\"AddShowDestinationPermissionList\" [group]=\"AddImpersonationForm\">\r\n </BBSF-DropdownList>\r\n </div>\r\n <div class=\"col-md-12\">\r\n <BBSF-AutocompleteTextBox [options]=\"AddDestinationUserAutoComplete\" *ngIf=\"AddShowDestinationUserAutoComplete\" [group]=\"AddImpersonationForm\">\r\n </BBSF-AutocompleteTextBox>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <BBSF-CheckBox [options]=\"AddIsActive\" [group]=\"AddImpersonationForm\">\r\n </BBSF-CheckBox>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <BBSF-DateTimePicker [options]=\"AddExpiresAt\" [group]=\"AddImpersonationForm\">\r\n\r\n </BBSF-DateTimePicker>\r\n </div>\r\n </div>\r\n <div class=\"text-center pt-7\">\r\n <button CloseImpersonationModal id=\"CloseImpersonationModal\" type=\"button\" class=\"btn btn-light me-3 btn-sm\"\r\n (click)=\"modal.dismiss()\">\r\n {{utilityService.getResourceValue(\"CancelLabel\")}}\r\n </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 </div>\r\n</ng-template>\r\n\r\n<!--Edit Modal-->\r\n<ng-template #EditImpersonationModal 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(\"Edit\")}} {{utilityService.getResourceValue(\"ImpersonationRule\")}}</h1>\r\n </div>\r\n <BBSF-Form [options]=\"EditImpersonationFormOptions\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <BBSF-DropdownList [options]=\"EditSourceParticipantType\" (OnChange)=\"editSourceParticipantOnChange($event)\" [group]=\"EditImpersonationForm\">\r\n </BBSF-DropdownList>\r\n </div>\r\n <div class=\"col-md-12\">\r\n <BBSF-DropdownList [options]=\"EditSourcePermissionSetList\" *ngIf=\"EditShowSourcePermissionList\" [group]=\"EditImpersonationForm\">\r\n </BBSF-DropdownList>\r\n </div>\r\n <div class=\"col-md-12\">\r\n <BBSF-AutocompleteTextBox [options]=\"EditSourceUserAutoComplete\" *ngIf=\"EditShowSourceUserAutoComplete\" [group]=\"EditImpersonationForm\">\r\n </BBSF-AutocompleteTextBox>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <BBSF-DropdownList [options]=\"EditDestinationParticipantType\" (OnChange)=\"editDestinationParticipantOnChange($event)\" [group]=\"EditImpersonationForm\">\r\n </BBSF-DropdownList>\r\n </div>\r\n <div class=\"col-md-12\">\r\n <BBSF-DropdownList [options]=\"EditDestinationPermissionSetList\" *ngIf=\"EditShowDestinationPermissionList\" [group]=\"EditImpersonationForm\">\r\n </BBSF-DropdownList>\r\n </div>\r\n <div class=\"col-md-12\">\r\n <BBSF-AutocompleteTextBox [options]=\"EditDestinationUserAutoComplete\" *ngIf=\"EditShowDestinationUserAutoComplete\" [group]=\"EditImpersonationForm\">\r\n </BBSF-AutocompleteTextBox>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <BBSF-CheckBox [options]=\"EditIsActive\" [group]=\"EditImpersonationForm\">\r\n </BBSF-CheckBox>\r\n </div>\r\n </div>\r\n\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <BBSF-DateTimePicker [options]=\"EditExpiresAt\" [group]=\"EditImpersonationForm\">\r\n\r\n </BBSF-DateTimePicker>\r\n </div>\r\n </div>\r\n <div class=\"text-center pt-7\">\r\n <button #CloseEditImpersonationModal id=\"CloseEditImpersonationModal\" 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=\"submit\" class=\"btn btn-primary btn-sm\">{{utilityService.getResourceValue(\"SaveLabel\")}}</button>\r\n </div>\r\n </BBSF-Form>\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\" #ConfirmationModalControl></BBSF-ConfirmationModal>\r\n\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.ɵh, selector: "BBSF-DropdownList", inputs: ["group", "options"], outputs: ["OnChange", "onClear"] }, { type: i6.ɵq, selector: "BBSF-AutocompleteTextBox", inputs: ["group", "options"], outputs: ["OnChange"] }, { type: i6.ɵg, selector: "BBSF-CheckBox", inputs: ["group", "options"], outputs: ["OnChange"] }, { type: i6.ɵa, selector: "BBSF-DateTimePicker", inputs: ["group", "options"], outputs: ["OnChange"] }, { type: i6.ɵw, selector: "BBSF-ConfirmationModal", inputs: ["options"] }], directives: [{ type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i10.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i10.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { 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"] }] });
416
441
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: ImpersonationRulesComponent, decorators: [{
417
442
  type: Component,
418
443
  args: [{
419
444
  selector: 'lib-impersonation-rules',
420
445
  templateUrl: './impersonation-rules.component.html'
421
446
  }]
422
- }], ctorParameters: function () { return [{ type: i1.AuthService }, { type: i2.PageInfoService }, { type: i1.UtilityService }, { type: i1.BBSFTranslateService }, { type: i1.EnvironmentService }, { type: i3.ImpersonationRuleService }, { type: i4.NgbModal }]; }, propDecorators: { input: [{
447
+ }], ctorParameters: function () { return [{ type: i1.AuthService }, { type: i2.PageInfoService }, { type: i1.UtilityService }, { type: i1.BBSFTranslateService }, { type: i1.EnvironmentService }, { type: i3.ImpersonationRuleService }, { type: i4.NgbModal }, { type: i1.RequestHandlerService }]; }, propDecorators: { pagingElement: [{
423
448
  type: ViewChild,
424
449
  args: ['ImpersonationPagingViewElement', { static: false }]
425
- }], CloseImpersonationModal: [{
426
- type: ViewChild,
427
- args: ['CloseImpersonationModal', { static: false }]
428
- }], CloseEditImpersonationModal: [{
429
- type: ViewChild,
430
- args: ['CloseEditImpersonationModal', { static: false }]
431
- }], CloseDeleteImpersonationModal: [{
450
+ }], ConfirmationModalControl: [{
432
451
  type: ViewChild,
433
- args: ['CloseDeleteImpersonationModal', { static: false }]
452
+ args: ['ConfirmationModalControl', { static: false }]
434
453
  }] } });
435
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wZXJzb25hdGlvbi1ydWxlcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYnNmLWFkbWluLXBvcnRhbC9zcmMvbGliL1BhZ2VzL2ltcGVyc29uYXRpb24tcnVsZXMvaW1wZXJzb25hdGlvbi1ydWxlcy9pbXBlcnNvbmF0aW9uLXJ1bGVzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtYWRtaW4tcG9ydGFsL3NyYy9saWIvUGFnZXMvaW1wZXJzb25hdGlvbi1ydWxlcy9pbXBlcnNvbmF0aW9uLXJ1bGVzL2ltcGVyc29uYXRpb24tcnVsZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXNCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDelAsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0VBQW9FLENBQUM7QUFDNUcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFFekYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9EQUFvRCxDQUFDOzs7Ozs7Ozs7Ozs7O0FBUXJGLE1BQU0sT0FBTywyQkFBMkI7SUFtRXRDLFlBQW9CLFdBQXVCLEVBQVMsZUFBK0IsRUFBUyxjQUE2QixFQUFTLG9CQUF5QyxFQUFTLGtCQUFxQyxFQUFVLHdCQUFrRCxFQUFVLFlBQXNCO1FBQWpTLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQVMsb0JBQWUsR0FBZixlQUFlLENBQWdCO1FBQVMsbUJBQWMsR0FBZCxjQUFjLENBQWU7UUFBUyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXFCO1FBQVMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFtQjtRQUFVLDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBMEI7UUFBVSxpQkFBWSxHQUFaLFlBQVksQ0FBVTtRQWxFclQsbUJBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFHNUUsZ0JBQVcsR0FBRyxJQUFJLENBQUM7UUFBQyxtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUMzQyxXQUFNLEdBQUcsK0JBQStCLENBQUE7UUFHeEMsc0JBQWlCLEdBQUcsSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEMsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUM1Qiw4QkFBeUIsR0FBVSxFQUFFLENBQUM7UUFHdEMsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFFaEMsc0JBQWlCLEdBQU8sRUFBRSxDQUFDO1FBQzNCLHdCQUFtQixHQUFPLEVBQUUsQ0FBQztRQUk3QixvQkFBb0I7UUFDcEIseUJBQW9CLEdBQUcsSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFTekMsNkJBQXdCLEdBQVMsS0FBSyxDQUFDO1FBQ3ZDLCtCQUEwQixHQUFTLEtBQUssQ0FBQztRQUN6QyxrQ0FBNkIsR0FBUyxLQUFLLENBQUM7UUFDNUMsb0NBQStCLEdBQVMsS0FBSyxDQUFDO1FBSTlDLHFCQUFxQjtRQUNyQiwwQkFBcUIsR0FBRyxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQVMxQyxpQ0FBNEIsR0FBUyxLQUFLLENBQUM7UUFDM0MsbUNBQThCLEdBQVMsS0FBSyxDQUFDO1FBQzdDLHNDQUFpQyxHQUFTLEtBQUssQ0FBQztRQUNoRCx3Q0FBbUMsR0FBUyxLQUFLLENBQUM7UUFVbEQsd0JBQXdCO1FBQ3hCLDRCQUF1QixHQUFVLEVBQUUsQ0FBQTtRQUVuQyxhQUFRLEdBQVEsRUFBRSxDQUFBO1FBQ2xCLHNDQUFzQztRQUN0QyxvQkFBZSxHQUFTLEtBQUssQ0FBQztJQUc5QixDQUFDO0lBRUssUUFBUTs7WUFDWixJQUFJLENBQUMsZUFBZSxHQUFDLElBQUksQ0FBQztZQUMxQixlQUFlLENBQUMsU0FBUyxHQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQUMsQ0FBQTtZQUNwRixlQUFlLENBQUMsZUFBZSxHQUFDO2dCQUM3QixFQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFHLElBQUksRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFDO2dCQUNoSCxFQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUM7YUFFM0QsQ0FBQztZQUNGLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFDLEVBQUU7Z0JBQ3hELElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztnQkFDM0IsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLENBQUMsQ0FBQyxDQUFBO1lBQ0YsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMvRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsRUFBRSxDQUFBO1lBQ2pFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzNCLENBQUM7S0FBQTtJQUdELHNCQUFzQixDQUFDLEdBQUc7UUFDeEIsSUFBSSxVQUFVLEdBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLEdBQUcsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEgseUJBQXlCO1FBRTFCLFFBQVEsVUFBVSxDQUFDLEtBQUssRUFBRTtZQUN4QixLQUFLLGVBQWU7Z0JBQ2xCLElBQUksQ0FBQyw2QkFBNkIsR0FBQyxJQUFJLENBQUM7Z0JBQ3hDLElBQUksQ0FBQywrQkFBK0IsR0FBQyxLQUFLLENBQUM7Z0JBSTNDLE1BQU07WUFDTixLQUFLLE1BQU07Z0JBQ1QsSUFBSSxDQUFDLDZCQUE2QixHQUFDLEtBQUssQ0FBQztnQkFDM0MsSUFBSSxDQUFDLCtCQUErQixHQUFDLElBQUksQ0FBQztnQkFJMUMsTUFBTTtZQUVSO2dCQUNFLE1BQU07U0FDVDtJQUVILENBQUM7SUFDRCxpQkFBaUIsQ0FBQyxHQUFHO1FBQ25CLElBQUksVUFBVSxHQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RILHlCQUF5QjtRQUUxQixRQUFRLFVBQVUsQ0FBQyxLQUFLLEVBQUU7WUFDeEIsS0FBSyxlQUFlO2dCQUNsQixJQUFJLENBQUMsd0JBQXdCLEdBQUMsSUFBSSxDQUFDO2dCQUNuQyxJQUFJLENBQUMsMEJBQTBCLEdBQUMsS0FBSyxDQUFDO2dCQUl0QyxNQUFNO1lBQ04sS0FBSyxNQUFNO2dCQUNYLElBQUksQ0FBQyx3QkFBd0IsR0FBQyxLQUFLLENBQUM7Z0JBQ3BDLElBQUksQ0FBQywwQkFBMEIsR0FBQyxJQUFJLENBQUM7Z0JBR3JDLE1BQU07WUFFUjtnQkFDRSxNQUFNO1NBQ1g7SUFDSCxDQUFDO0lBRUQsMEJBQTBCLENBQUMsR0FBRztRQUM1QixJQUFJLFVBQVUsR0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0SCx5QkFBeUI7UUFFMUIsUUFBUSxVQUFVLENBQUMsS0FBSyxFQUFFO1lBQ3hCLEtBQUssZUFBZTtnQkFDbEIsSUFBSSxDQUFDLGlDQUFpQyxHQUFDLElBQUksQ0FBQztnQkFDNUMsSUFBSSxDQUFDLG1DQUFtQyxHQUFDLEtBQUssQ0FBQztnQkFHL0MsTUFBTTtZQUNOLEtBQUssTUFBTTtnQkFDWCxJQUFJLENBQUMsaUNBQWlDLEdBQUMsS0FBSyxDQUFDO2dCQUM3QyxJQUFJLENBQUMsbUNBQW1DLEdBQUMsSUFBSSxDQUFDO2dCQUc5QyxNQUFNO1lBRVI7Z0JBQ0UsTUFBTTtTQUNUO0lBRUgsQ0FBQztJQUNELHFCQUFxQixDQUFDLEdBQUc7UUFDdkIsSUFBSSxVQUFVLEdBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLEdBQUcsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEgseUJBQXlCO1FBRTFCLFFBQVEsVUFBVSxDQUFDLEtBQUssRUFBRTtZQUN4QixLQUFLLGVBQWU7Z0JBQ2xCLElBQUksQ0FBQyw0QkFBNEIsR0FBQyxJQUFJLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyw4QkFBOEIsR0FBQyxLQUFLLENBQUM7Z0JBRTFDLE1BQU07WUFDTixLQUFLLE1BQU07Z0JBQ1gsSUFBSSxDQUFDLDRCQUE0QixHQUFDLEtBQUssQ0FBQztnQkFDeEMsSUFBSSxDQUFDLDhCQUE4QixHQUFDLElBQUksQ0FBQztnQkFFekMsTUFBTTtZQUVSO2dCQUNFLE1BQU07U0FDWDtJQUNELENBQUM7SUFFQyxpQkFBaUI7UUFDZixJQUFJLENBQUMsd0JBQXdCLENBQUMsYUFBYSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDakUsSUFBSSxhQUFhLEdBQUcsTUFBYSxDQUFBO1lBQ2pDLElBQUksQ0FBQyxpQkFBaUIsR0FBQyxhQUFhLENBQUMsY0FBYyxDQUFBO1lBQ25ELElBQUksQ0FBQyxtQkFBbUIsR0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUE7WUFFMUQsZUFBZTtZQUNmLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUMxQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksR0FBRyxlQUFlLENBQUE7WUFDekMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFBO1lBQ25DLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUE7WUFDeEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQTtZQUVyRixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7WUFDeEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFBO1lBQ3RELElBQUksQ0FBQyxlQUFlLENBQUMsbUJBQW1CLEdBQUcsWUFBWSxDQUFBO1lBQ3ZELElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQTtZQUN6QyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFBO1lBRXBELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsOEJBQThCLENBQUM7WUFDNUgsSUFBSSxDQUFDLG1CQUFtQixDQUFDLDZCQUE2QixHQUFHLENBQUMsZUFBZSxDQUFDLENBQUE7WUFDMUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sR0FBRyxDQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQTtZQUMxRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsd0JBQXdCLEVBQUUsQ0FBQTtZQUN0RixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUU3QixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCx3QkFBd0I7UUFDdEIsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQVksQ0FBQztRQUNoQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFZLENBQUM7UUFDaEMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCwwQkFBMEIsQ0FBQyxNQUFNO1FBQy9CLElBQUksQ0FBQyx5QkFBeUIsR0FBRSxNQUFNLENBQUE7UUFDdEMsSUFBSSxDQUFDLGVBQWUsR0FBQyxJQUFJLENBQUM7UUFDMUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUNuQyxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hFLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFZLENBQUM7UUFDaEMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELHlCQUF5QixDQUFDLHFCQUFxQjtRQUM3QyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUE7UUFFN0MsSUFBSSxDQUFDLDZCQUE2QixHQUFDLEtBQUssQ0FBQztRQUN6QyxJQUFJLENBQUMsK0JBQStCLEdBQUMsS0FBSyxDQUFDO1FBQzNDLElBQUksQ0FBQyx3QkFBd0IsR0FBQyxLQUFLLENBQUE7UUFDbkMsSUFBSSxDQUFDLDBCQUEwQixHQUFDLEtBQUssQ0FBQTtRQUNyQyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRW5DLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQ25ELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEdBQUcsdUJBQXVCLENBQUE7UUFDekQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsR0FBRyx1QkFBdUIsQ0FBQTtRQUM3RCxJQUFJLENBQUMscUJBQXFCLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUNoRCxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQTtRQUNoRSxJQUFJLENBQUMscUJBQXFCLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUNsRCxJQUFJLENBQUMscUJBQXFCLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQ3BELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBRTdDLElBQUksQ0FBQywwQkFBMEIsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQ3hELElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLEdBQUcsNEJBQTRCLENBQUE7UUFDbkUsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFFBQVEsR0FBRyw0QkFBNEIsQ0FBQTtRQUN2RSxJQUFJLENBQUMsMEJBQTBCLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUNyRCxJQUFJLENBQUMsMEJBQTBCLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQTtRQUNyRSxJQUFJLENBQUMsMEJBQTBCLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUN2RCxJQUFJLENBQUMsMEJBQTBCLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQ3pELElBQUksQ0FBQywwQkFBMEIsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBRWxELElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQ3JELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEdBQUcseUJBQXlCLENBQUE7UUFDN0QsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsR0FBRyx5QkFBeUIsQ0FBQTtRQUNqRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUNsRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQTtRQUNoRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUNwRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQ3RELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBRS9DLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQzFELElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLEdBQUcsOEJBQThCLENBQUE7UUFDdkUsSUFBSSxDQUFDLDRCQUE0QixDQUFDLFVBQVUsR0FBRyw4QkFBOEIsQ0FBQTtRQUM3RSxJQUFJLENBQUMsNEJBQTRCLENBQUMsUUFBUSxHQUFHLDhCQUE4QixDQUFBO1FBQzNFLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQ3ZELElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFBO1FBQ3JFLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQ3pELElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDM0QsSUFBSSxDQUFDLDRCQUE0QixDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFFcEQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksbUJBQW1CLEVBQUUsQ0FBQztRQUN4RCxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxHQUFHLHdCQUF3QixDQUFDO1FBQzVELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDO1FBQzlDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztRQUNsRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUM5QyxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUN6QyxJQUFJLENBQUMsc0JBQXNCLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUM7UUFDcEUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQTtRQUM5RyxJQUFJLENBQUMsc0JBQXNCLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsd0JBQXdCLEVBQUUsQ0FBQTtRQUV6RixJQUFJLENBQUMsMkJBQTJCLEdBQUcsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1FBQzdELElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEdBQUcsNkJBQTZCLENBQUM7UUFDdEUsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUM7UUFDbkQsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO1FBQ3ZELElBQUksQ0FBQywyQkFBMkIsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ25ELElBQUksQ0FBQywyQkFBMkIsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQzlDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsa0JBQWtCLENBQUE7UUFDbkgsSUFBSSxDQUFDLDJCQUEyQixDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLHdCQUF3QixFQUFFLENBQUE7UUFFOUYsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQTtRQUMvQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUE7UUFDakMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFBO1FBQy9CLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQTtRQUUxQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksaUJBQWlCLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxXQUFXLENBQUE7UUFDakMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFBO1FBQ3JDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQTtRQUNoQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFBO1FBQzFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUE7UUFDL0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEdBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQTtRQUUzQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLENBQUM7SUFFcEMsQ0FBQztJQUVELGdCQUFnQjtRQUVaLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUM7UUFFbEQsSUFBSSxRQUFRLEdBQXlCLElBQUksc0JBQXNCLEVBQUUsQ0FBRTtRQUNuRSxRQUFRLENBQUMsb0JBQW9CLENBQUMscUJBQXFCLEdBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO1FBQzdGLFFBQVEsQ0FBQyx5QkFBeUIsQ0FBQyxxQkFBcUIsR0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLDBCQUEwQixDQUFDLENBQUE7UUFDdkcsUUFBUSxDQUFDLFNBQVMsR0FBQyxXQUFXLENBQUMsU0FBUyxDQUFBO1FBQ3hDLFFBQVEsQ0FBQyxRQUFRLEdBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQTtRQUN0QyxJQUFHLFdBQVcsQ0FBQywyQkFBMkIsSUFBRSxJQUFJLElBQUUsV0FBVyxDQUFDLDJCQUEyQixJQUFFLFNBQVM7WUFDcEcsUUFBUSxDQUFDLHlCQUF5QixDQUFDLE1BQU0sR0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLDJCQUEyQixDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQzdGLFFBQVEsQ0FBQyx5QkFBeUIsQ0FBQyxlQUFlLEdBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFBO1FBQ25HLElBQUcsV0FBVyxDQUFDLHNCQUFzQixJQUFFLElBQUksSUFBRSxXQUFXLENBQUMsc0JBQXNCLElBQUUsU0FBUztZQUMxRixRQUFRLENBQUMsb0JBQW9CLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDckYsUUFBUSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsR0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLHVCQUF1QixDQUFDLENBQUE7UUFFekYsSUFBSSxDQUFDLHdCQUF3QixDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2hGLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDL0IsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQVksQ0FBQztZQUNoQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMvQixDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUViLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUdELDBCQUEwQixDQUFDLGFBQWtCLEVBQUUsc0JBQXNCO1FBQ25FLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUU5QyxJQUFJLENBQUMsaUNBQWlDLEdBQUMsS0FBSyxDQUFDO1FBQzdDLElBQUksQ0FBQyxtQ0FBbUMsR0FBQyxLQUFLLENBQUM7UUFDL0MsSUFBSSxDQUFDLDRCQUE0QixHQUFDLEtBQUssQ0FBQTtRQUN2QyxJQUFJLENBQUMsOEJBQThCLEdBQUMsS0FBSyxDQUFBO1FBRXpDLElBQUksYUFBYSxDQUFDLG9CQUFvQixDQUFDLHFCQUFxQixJQUFFLElBQUksSUFBRSxhQUFhLENBQUMseUJBQXlCLENBQUMscUJBQXFCLEVBQUU7WUFDakksSUFBSSxDQUFDLDBCQUEwQixDQUFDLGFBQWEsQ0FBQyx5QkFBeUIsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBQy9GLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMscUJBQXFCLENBQUMsQ0FBQztTQUN0RjtRQUVELElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFbkMsSUFBSSxDQUFDLGVBQWUsR0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxtQkFBbUIsR0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDO1FBQy9ELElBQUksQ0FBQyx3QkFBd0IsR0FBQyxhQUFhLENBQUMseUJBQXlCLENBQUMsRUFBRSxDQUFDO1FBQ3pFLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQ3ZELElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLEdBQUcsMkJBQTJCLENBQUE7UUFDakUsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFFBQVEsR0FBRyx1QkFBdUIsQ0FBQTtRQUNqRSxJQUFJLENBQUMseUJBQXlCLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxhQUFhLENBQUMsb0JBQW9CLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoTixJQUFJLENBQUMseUJBQXlCLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQTtRQUNwRSxJQUFJLENBQUMseUJBQXlCLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUN0RCxJQUFJLENBQUMseUJBQXlCLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQ3hELElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBRWpELElBQUksQ0FBQyw4QkFBOEIsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQzVELElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLEdBQUcsZ0NBQWdDLENBQUE7UUFDM0UsSUFBSSxDQUFDLDhCQUE4QixDQUFDLFFBQVEsR0FBRyw0QkFBNEIsQ0FBQTtRQUMzRSxJQUFJLENBQUMsOEJBQThCLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxhQUFhLENBQUMseUJBQXlCLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUFBLENBQUM7UUFDM04sSUFBSSxDQUFDLDhCQUE4QixDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUE7UUFDekUsSUFBSSxDQUFDLDhCQUE4QixDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDM0QsSUFBSSxDQUFDLDhCQUE4QixDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUM3RCxJQUFJLENBQUMsOEJBQThCLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUV0RCxJQUFJLENBQUMsMkJBQTJCLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUN6RCxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxHQUFHLDZCQUE2QixDQUFBO1FBQ3JFLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxRQUFRLEdBQUcseUJBQXlCLENBQUE7UUFDckUsSUFBSSxDQUFDLDJCQUEyQixDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksYUFBYSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQUEsQ0FBQztRQUMzTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQTtRQUNwRSxJQUFJLENBQUMsMkJBQTJCLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUN4RCxJQUFJLENBQUMsMkJBQTJCLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQzFELElBQUksQ0FBQywyQkFBMkIsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBRW5ELElBQUksQ0FBQyxnQ0FBZ0MsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQzlELElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxJQUFJLEdBQUcsa0NBQWtDLENBQUE7UUFDL0UsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLFFBQVEsR0FBRyw4QkFBOEIsQ0FBQTtRQUMvRSxJQUFJLENBQUMsZ0NBQWdDLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxhQUFhLENBQUMseUJBQXlCLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFBQSxDQUFDO1FBQUEsQ0FBQztRQUN0TixJQUFJLENBQUMsZ0NBQWdDLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQTtRQUN6RSxJQUFJLENBQUMsZ0NBQWdDLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUM3RCxJQUFJLENBQUMsZ0NBQWdDLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQy9ELElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBRXhELElBQUksQ0FBQywwQkFBMEIsR0FBRyxJQUFJLG1CQUFtQixFQUFFLENBQUM7UUFDNUQsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksR0FBRyw0QkFBNEIsQ0FBQztRQUNwRSxJQUFJLENBQUMsMEJBQTBCLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQztRQUNsRCxJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7UUFDdEQsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFHbEQsSUFBSSxLQUFLLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUNsQyxLQUFLLENBQUMsR0FBRyxHQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUE7UUFDbkQsS0FBSyxDQUFDLEtBQUssR0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQztRQUN2RSxJQUFJLENBQUMsMEJBQTBCLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQTtRQUNyRCxJQUFJLENBQUMsMEJBQTBCLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLGtCQUFrQixDQUFBO1FBQ2xILElBQUksQ0FBQywwQkFBMEIsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyx3QkFBd0IsRUFBRSxDQUFBO1FBRTdGLElBQUksQ0FBQywrQkFBK0IsR0FBRyxJQUFJLG1CQUFtQixFQUFFLENBQUM7UUFDakUsSUFBSSxDQUFDLCtCQUErQixDQUFDLElBQUksR0FBRyxpQ0FBaUMsQ0FBQztRQUM5RSxJQUFJLENBQUMsK0JBQStCLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQztRQUN2RCxJQUFJLENBQUMsK0JBQStCLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7UUFDM0QsSUFBSSxDQUFDLCtCQUErQixDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkQsSUFBSSxvQkFBb0IsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQ2pELG9CQUFvQixDQUFDLEdBQUcsR0FBQyxhQUFhLENBQUMseUJBQXlCLENBQUMsTUFBTSxDQUFBO1FBQ3ZFLG9CQUFvQixDQUFDLEtBQUssR0FBQyxhQUFhLENBQUMseUJBQXlCLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQztRQUUzRixJQUFJLENBQUMsK0JBQStCLENBQUMsYUFBYSxHQUFFLG9CQUFvQixDQUFBO1FBQ3hFLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsa0JBQWtCLENBQUE7UUFDdkgsSUFBSSxDQUFDLCtCQUErQixDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLHdCQUF3QixFQUFFLENBQUE7UUFFbEcsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQzFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxHQUFHLGNBQWMsQ0FBQTtRQUN2QyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUE7UUFDckMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFBO1FBQ25DLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQTtRQUU5QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksaUJBQWlCLEVBQUUsQ0FBQztRQUM3QyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksR0FBRyxlQUFlLENBQUE7UUFDekMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFBO1FBQ3pDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQTtRQUNwQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFBO1FBQ2xELElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUE7UUFDOUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQTtRQUNuRCxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsR0FBQyxVQUFVLENBQUMsTUFBTSxDQUFBO1FBQy9DLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUdwQyxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxFQUFFO1lBQ3RDLE9BQU87U0FDUjthQUNJO1lBQ0gsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQztZQUVuRCxJQUFJLFNBQVMsR0FBeUIsSUFBSSxzQkFBc0IsRUFBRSxDQUFFO1lBQ3BFLFNBQVMsQ0FBQyxFQUFFLEdBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQTtZQUNqQyxTQUFTLENBQUMseUJBQXlCLENBQUMsRUFBRSxHQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQTtZQUNwRSxTQUFTLENBQUMsb0JBQW9CLENBQUMsRUFBRSxHQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQTtZQUMxRCxTQUFTLENBQUMsb0JBQW9CLENBQUMscUJBQXFCLEdBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFBO1lBQ2xHLFNBQVMsQ0FBQyx5QkFBeUIsQ0FBQyxxQkFBcUIsR0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLDhCQUE4QixDQUFDLENBQUE7WUFDNUcsU0FBUyxDQUFDLFNBQVMsR0FBQyxXQUFXLENBQUMsYUFBYSxDQUFBO1lBQzdDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQTtZQUM3QyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3JCLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDekIsSUFBSSxXQUFXLENBQUMsK0JBQStCLElBQUksSUFBSSxJQUFJLFdBQVcsQ0FBQywrQkFBK0IsSUFBSSxTQUFTO2dCQUNqSCxTQUFTLENBQUMseUJBQXlCLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsK0JBQStCLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDdEcsU0FBUyxDQUFDLHlCQUF5QixDQUFDLGVBQWUsR0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLGdDQUFnQyxDQUFDLENBQUE7WUFDeEcsSUFBSSxXQUFXLENBQUMsMEJBQTBCLElBQUksSUFBSSxJQUFJLFdBQVcsQ0FBQywwQkFBMEIsSUFBSSxTQUFTO2dCQUN2RyxTQUFTLENBQUMsb0JBQW9CLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsMEJBQTBCLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDNUYsU0FBUyxDQUFDLG9CQUFvQixDQUFDLGVBQWUsR0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLDJCQUEyQixDQUFDLENBQUE7WUFDOUYsSUFBSSxDQUFDLHdCQUF3QixDQUFDLHFCQUFxQixDQUFFLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUNuRixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUMvQixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBWSxDQUFDO2dCQUNoQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDekIsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDYixDQUFDLENBQUMsQ0FBQTtTQUNIO0lBQ0gsQ0FBQztJQUVELDRCQUE0QixDQUFDLE1BQVcsRUFBRSx3QkFBd0I7UUFDaEUsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEVBQUUsQ0FBQTtRQUNqQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBR3BDLENBQUM7SUFFRCxtQkFBbUI7UUFDakIsSUFBSyxZQUFZLEdBQXNCLElBQUksbUJBQW1CLEVBQUUsQ0FBRTtRQUNqRSxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUN4RSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEQsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1NBRXZDO1FBQ0YsSUFBSSxDQUFDLHdCQUF3QixDQUFDLHVCQUF1QixDQUFDLFlBQVksQ0FBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ3hGLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMvQixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBWSxDQUFDO1lBQ2hDLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQy9CLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1FBRWIsQ0FBQyxDQUFDLENBQUE7SUFFSixDQUFDOzt5SEF2ZlUsMkJBQTJCOzZHQUEzQiwyQkFBMkIsMmlCQ2R4Qyw0c2JBNFFBOzRGRDlQYSwyQkFBMkI7a0JBSnZDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHlCQUF5QjtvQkFDbkMsV0FBVyxFQUFFLHNDQUFzQztpQkFDcEQ7K1JBa0JpRSxLQUFLO3NCQUFwRSxTQUFTO3VCQUFDLGdDQUFnQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFpQkwsdUJBQXVCO3NCQUEvRSxTQUFTO3VCQUFDLHlCQUF5QixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFzQk0sMkJBQTJCO3NCQUF2RixTQUFTO3VCQUFDLDZCQUE2QixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFNSSw2QkFBNkI7c0JBQTNGLFNBQVM7dUJBQUMsK0JBQStCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEF1dG9jb21wbGV0ZURUTywgQXV0b2NvbXBsZXRlT3B0aW9ucywgQ2hlY2tCb3hPcHRpb25zLCBEYXRlUGlja2VyT3B0aW9ucywgRHJvcGRvd25PcHRpb25zLCBGaWx0ZXJJdGVtLCBGaWx0ZXJUeXBlLCBGb3JjZURpcmVjdGlvbiwgSW5wdXRUeXBlLCBQYWdpbmdPcHRpb25zLCBQaWNrZXJUeXBlLCBTZWxlY3RNb2RlLCBTdGFydFZpZXcsIFRleHRCb3hPcHRpb25zIH0gZnJvbSAnQGJuc2lnaHRzL2Jic2YtY29udHJvbHMnO1xyXG5pbXBvcnQgeyBJbXBlcnNvbmF0aW9uUnVsZU1vZGVsIH0gZnJvbSAnLi4vLi4vc2hhcmVkL21vZGVscy9JbXBlcnNvbmF0aW9uUnVsZU1vZGVscy9JbXBlcnNvbmF0aW9uUnVsZU1vZGVsJztcclxuaW1wb3J0IHsgVXNlcnNJRFJlcXVlc3RNb2RlbCB9IGZyb20gJy4uLy4uL3NoYXJlZC9tb2RlbHMvVXNlck1vZGVscy9Vc2Vyc0lEUmVxdWVzdE1vZGVsJztcclxuaW1wb3J0IHsgSW1wZXJzb25hdGlvblJ1bGVTZXJ2aWNlIH0gZnJvbSAnLi8uLi8uLi9zaGFyZWQvU2VydmljZXMvSW1wZXJzb25hdGlvblJ1bGVTZXJ2aWNlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQYWdlSW5mb1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9fbWV0cm9uaWMvY29yZS9zZXJ2aWNlcy9wYWdlLWluZm8uc2VydmljZSc7XHJcbmltcG9ydCB7IE5nYk1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xyXG5pbXBvcnQgeyBBdXRoU2VydmljZSwgVXRpbGl0eVNlcnZpY2UsIEJCU0ZUcmFuc2xhdGVTZXJ2aWNlLCBFbnZpcm9ubWVudFNlcnZpY2UgfSBmcm9tICdAYm5zaWdodHMvYmJzZi11dGlsaXRpZXMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItaW1wZXJzb25hdGlvbi1ydWxlcycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2ltcGVyc29uYXRpb24tcnVsZXMuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBJbXBlcnNvbmF0aW9uUnVsZXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIFN1YmhlYWRlclRpdGxlID0gdGhpcy51dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKCdJbXBlcnNvbmF0aW9uUnVsZXMnKTtcclxuICBcclxuXHJcbiAgU2hvd1Rvb2xiYXIgPSB0cnVlOyBTaG93YnJlYWRDcnVtYiA9IGZhbHNlO1xyXG4gIEFwaVVybCA9IFwiL2FwaS9hZG1pbi9JbXBlcnNvbmF0aW9uUnVsZS9cIlxyXG4gIHNlYXJjaFRleHRCb3g6IFRleHRCb3hPcHRpb25zO1xyXG4gIFRleHRJbnB1dEZpbHRlcjogRmlsdGVySXRlbTtcclxuICBJbXBlcnNvbmF0aW9uRm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gIHNob3dGaWx0ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBJbXBlcnNvbmF0aW9uUGFnaW5nUmVzdWx0OiBhbnlbXSA9IFtdO1xyXG4gIEltcGVyc29uYXRpb25QYWdpbmc6IFBhZ2luZ09wdGlvbnM7XHJcbiAgSW1wZXJzb25hdGlvbkZpbHRlcjogRmlsdGVySXRlbTtcclxuICBJc0ZpbHRlckxvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIFByb2R1Y3Rpb25Nb2RlOiBib29sZWFuO1xyXG4gIFBlcm1pc3Npb25TZXRMaXN0OmFueVtdPVtdO1xyXG4gIFBhcnRpY2lwYW50VHlwZUxpc3Q6YW55W109W107XHJcbiAgQFZpZXdDaGlsZCgnSW1wZXJzb25hdGlvblBhZ2luZ1ZpZXdFbGVtZW50JywgeyBzdGF0aWM6IGZhbHNlIH0pIGlucHV0OiBFbGVtZW50UmVmO1xyXG5cclxuXHJcbiAgLy9BZGQgTW9kZWwgQ29udHJvbHNcclxuICBBZGRJbXBlcnNvbmF0aW9uRm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gIFNvdXJjZVBhcnRpY2lwYW50VHlwZTogRHJvcGRvd25PcHRpb25zO1xyXG4gIERlc3RpbmF0aW9uUGFydGljaXBhbnRUeXBlOiBEcm9wZG93bk9wdGlvbnM7XHJcbiAgU291cmNlUGVybWlzc2lvblNldExpc3Q6IERyb3Bkb3duT3B0aW9ucztcclxuICBEZXN0aW5hdGlvblBlcm1pc3Npb25TZXRMaXN0OiBEcm9wZG93bk9wdGlvbnM7XHJcbiAgU291cmNlVXNlckF1dG9Db21wbGV0ZTogQXV0b2NvbXBsZXRlT3B0aW9ucztcclxuICBEZXN0aW5hdGlvblVzZXJBdXRvQ29tcGxldGU6IEF1dG9jb21wbGV0ZU9wdGlvbnM7XHJcbiAgSXNBY3RpdmU6IENoZWNrQm94T3B0aW9ucztcclxuICBFeHBpcmVzQXQ6IERhdGVQaWNrZXJPcHRpb25zO1xyXG4gIFNob3dTb3VyY2VQZXJtaXNzaW9uTGlzdDpib29sZWFuPWZhbHNlO1xyXG4gIFNob3dTb3VyY2VVc2VyQXV0b0NvbXBsZXRlOmJvb2xlYW49ZmFsc2U7XHJcbiAgU2hvd0Rlc3RpbmF0aW9uUGVybWlzc2lvbkxpc3Q6Ym9vbGVhbj1mYWxzZTtcclxuICBTaG93RGVzdGluYXRpb25Vc2VyQXV0b0NvbXBsZXRlOmJvb2xlYW49ZmFsc2U7XHJcbiAgQFZpZXdDaGlsZCgnQ2xvc2VJbXBlcnNvbmF0aW9uTW9kYWwnLCB7IHN0YXRpYzogZmFsc2UgfSkgQ2xvc2VJbXBlcnNvbmF0aW9uTW9kYWw6IEVsZW1lbnRSZWY7XHJcblxyXG5cclxuICAvL0VkaXQgTW9kZWwgQ29udHJvbHNcclxuICBFZGl0SW1wZXJzb25hdGlvbkZvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuICBFZGl0U291cmNlUGFydGljaXBhbnRUeXBlOiBEcm9wZG93bk9wdGlvbnM7XHJcbiAgRWRpdERlc3RpbmF0aW9uUGFydGljaXBhbnRUeXBlOiBEcm9wZG93bk9wdGlvbnM7XHJcbiAgRWRpdFNvdXJjZVBlcm1pc3Npb25TZXRMaXN0OiBEcm9wZG93bk9wdGlvbnM7XHJcbiAgRWRpdERlc3RpbmF0aW9uUGVybWlzc2lvblNldExpc3Q6IERyb3Bkb3duT3B0aW9ucztcclxuICBFZGl0U291cmNlVXNlckF1dG9Db21wbGV0ZTogQXV0b2NvbXBsZXRlT3B0aW9ucztcclxuICBFZGl0RGVzdGluYXRpb25Vc2VyQXV0b0NvbXBsZXRlOiBBdXRvY29tcGxldGVPcHRpb25zO1xyXG4gIEVkaXRJc0FjdGl2ZTogQ2hlY2tCb3hPcHRpb25zO1xyXG4gIEVkaXRFeHBpcmVzQXQ6IERhdGVQaWNrZXJPcHRpb25zO1xyXG4gIEVkaXRTaG93U291cmNlUGVybWlzc2lvbkxpc3Q6Ym9vbGVhbj1mYWxzZTtcclxuICBFZGl0U2hvd1NvdXJjZVVzZXJBdXRvQ29tcGxldGU6Ym9vbGVhbj1mYWxzZTtcclxuICBFZGl0U2hvd0Rlc3RpbmF0aW9uUGVybWlzc2lvbkxpc3Q6Ym9vbGVhbj1mYWxzZTtcclxuICBFZGl0U2hvd0Rlc3RpbmF0aW9uVXNlckF1dG9Db21wbGV0ZTpib29sZWFuPWZhbHNlO1xyXG4gIEltcGVyc29uYXRpb25JZDogbnVtYmVyO1xyXG4gIFNvdXJjZVBhcnRpY2lwYW50SWQ6IG51bWJlcjtcclxuICBEZXN0aW5hdGlvblBhcnRpY2lwYW50SWQ6IG51bWJlcjtcclxuXHJcblxyXG4gIEBWaWV3Q2hpbGQoJ0Nsb3NlRWRpdEltcGVyc29uYXRpb25Nb2RhbCcsIHsgc3RhdGljOiBmYWxzZSB9KSBDbG9zZUVkaXRJbXBlcnNvbmF0aW9uTW9kYWw6IEVsZW1lbnRSZWY7XHJcblxyXG4gIFxyXG5cclxuICAvL2RlbGV0ZSAgTW9kZWwgQ29udHJvbHNcclxuICBkZWxldGVJbXBlcnNvbmF0aW9uTGlzdDogYW55W10gPSBbXVxyXG4gIEBWaWV3Q2hpbGQoJ0Nsb3NlRGVsZXRlSW1wZXJzb25hdGlvbk1vZGFsJywgeyBzdGF0aWM6IGZhbHNlIH0pIENsb3NlRGVsZXRlSW1wZXJzb25hdGlvbk1vZGFsOiBFbGVtZW50UmVmO1xyXG4gIGxhbmd1YWdlOnN0cmluZz1cIlwiXHJcbiAgLy8gRGVjb3JhdG9yIHdpcmVzIHVwIGJsb2NrVUkgaW5zdGFuY2VcclxuICBTaG93UGFnZUNvbnRlbnQ6Ym9vbGVhbj1mYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBhdXRoU2VydmljZTpBdXRoU2VydmljZSxwcml2YXRlIHBhZ2VJbmZvU2VydmljZTpQYWdlSW5mb1NlcnZpY2UsIHB1YmxpYyB1dGlsaXR5U2VydmljZTpVdGlsaXR5U2VydmljZSxwcml2YXRlIGJic2ZUcmFuc2xhdGVTZXJ2aWNlOkJCU0ZUcmFuc2xhdGVTZXJ2aWNlLHByaXZhdGUgZW52aXJvbm1lbnRTZXJ2aWNlOkVudmlyb25tZW50U2VydmljZSwgcHJpdmF0ZSBJbXBlcnNvbmF0aW9uUnVsZVNlcnZpY2U6IEltcGVyc29uYXRpb25SdWxlU2VydmljZSwgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE5nYk1vZGFsKSB7XHJcbiAgfVxyXG5cclxuICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuU2hvd1BhZ2VDb250ZW50PXRydWU7XHJcbiAgICBQYWdlSW5mb1NlcnZpY2UuUGFnZVRpdGxlPXRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkltcGVyc29uYXRpb25SdWxlc1wiKVxyXG4gICAgUGFnZUluZm9TZXJ2aWNlLlBhZ2VCcmVhZGNydW1icz1bXHJcbiAgICAgICB7dGl0bGU6IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkhvbWVcIikgLCBwYXRoOiAnL0FkbWluL0hvbWUnLCBpc1NlcGFyYXRvcjogZmFsc2UsIGlzQWN0aXZlOiBmYWxzZX0sXHJcbiAgICAgICB7dGl0bGU6ICcnLCBwYXRoOiAnJywgaXNTZXBhcmF0b3I6IHRydWUsIGlzQWN0aXZlOiBmYWxzZX1cclxuXHJcbiAgICBdO1xyXG4gICAgdGhpcy5wYWdlSW5mb1NlcnZpY2UuY2FsY3VsYXRlVGl0bGUoKTtcclxuICAgIHRoaXMucGFnZUluZm9TZXJ2aWNlLmNhbGN1bGF0ZUJyZWFkY3J1bWJzKCk7XHJcbiAgICB0aGlzLmJic2ZUcmFuc2xhdGVTZXJ2aWNlLm9uTGFuZ0NoYW5nZS5zdWJzY3JpYmUoKGV2ZW50KT0+e1xyXG4gICAgICB0aGlzLmxhbmd1YWdlID0gZXZlbnQubGFuZztcclxuICAgICAgdGhpcy5uZ09uSW5pdCgpO1xyXG4gICAgfSlcclxuICAgIHRoaXMubGFuZ3VhZ2UgPSBhd2FpdCB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldEN1cnJlbnRMYW5ndWFnZSgpO1xyXG4gICAgdGhpcy5Qcm9kdWN0aW9uTW9kZSA9IHRoaXMuZW52aXJvbm1lbnRTZXJ2aWNlLmdldFByb2R1Y3Rpb25Nb2RlKClcclxuICAgIHRoaXMuTG9hZERyb3Bkb3duTGlzdHMoKTtcclxuICB9XHJcblxyXG4gIFxyXG4gIERlc3RpbmF0aW9uUGFydGljaXBhbnQoa2V5KXtcclxuICAgIGxldCBzb3VyY2VJdGVtPXRoaXMuUGFydGljaXBhbnRUeXBlTGlzdC5maWx0ZXIoKGl0ZW0pID0+IHsgcmV0dXJuIHBhcnNlSW50KGl0ZW0ua2V5KSA9PSBrZXk7IH0pLm1hcCgoaXRlbSkgPT4gaXRlbSlbMF07XHJcbiAgICAgLy9jb25zb2xlLmxvZyhzb3VyY2VJdGVtKVxyXG5cclxuICAgIHN3aXRjaCAoc291cmNlSXRlbS52YWx1ZSkge1xyXG4gICAgICBjYXNlIFwiUGVybWlzc2lvblNldFwiOlxyXG4gICAgICAgIHRoaXMuU2hvd0Rlc3RpbmF0aW9uUGVybWlzc2lvbkxpc3Q9dHJ1ZTtcclxuICAgICAgICB0aGlzLlNob3dEZXN0aW5hdGlvblVzZXJBdXRvQ29tcGxldGU9ZmFsc2U7XHJcbiAgICAgICAgXHJcblxyXG4gICAgICAgIFxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJVc2VyXCI6XHJcbiAgICAgICAgICB0aGlzLlNob3dEZXN0aW5hdGlvblBlcm1pc3Npb25MaXN0PWZhbHNlO1xyXG4gICAgICAgIHRoaXMuU2hvd0Rlc3RpbmF0aW9uVXNlckF1dG9Db21wbGV0ZT10cnVlO1xyXG4gICAgICAgXHJcblxyXG5cclxuICAgICAgICBicmVhaztcclxuICAgIFxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIFxyXG4gIH1cclxuICBTb3VyY2VQYXJ0aWNpcGFudChrZXkpe1xyXG4gICAgbGV0IHNvdXJjZUl0ZW09dGhpcy5QYXJ0aWNpcGFudFR5cGVMaXN0LmZpbHRlcigoaXRlbSkgPT4geyByZXR1cm4gcGFyc2VJbnQoaXRlbS5rZXkpID09IGtleTsgfSkubWFwKChpdGVtKSA9PiBpdGVtKVswXTtcclxuICAgICAvL2NvbnNvbGUubG9nKHNvdXJjZUl0ZW0pXHJcblxyXG4gICAgc3dpdGNoIChzb3VyY2VJdGVtLnZhbHVlKSB7XHJcbiAgICAgIGNhc2UgXCJQZXJtaXNzaW9uU2V0XCI6XHJcbiAgICAgICAgdGhpcy5TaG93U291cmNlUGVybWlzc2lvbkxpc3Q9dHJ1ZTtcclxuICAgICAgICB0aGlzLlNob3dTb3VyY2VVc2VyQXV0b0NvbXBsZXRlPWZhbHNlO1xyXG4gICAgICAgIFxyXG5cclxuXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBcIlVzZXJcIjpcclxuICAgICAgICB0aGlzLlNob3dTb3VyY2VQZXJtaXNzaW9uTGlzdD1mYWxzZTtcclxuICAgICAgICB0aGlzLlNob3dTb3VyY2VVc2VyQXV0b0NvbXBsZXRlPXRydWU7XHJcbiAgICAgICBcclxuXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICBcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICB9XHJcbn1cclxuXHJcbkVkaXREZXN0aW5hdGlvblBhcnRpY2lwYW50KGtleSl7XHJcbiAgbGV0IHNvdXJjZUl0ZW09dGhpcy5QYXJ0aWNpcGFudFR5cGVMaXN0LmZpbHRlcigoaXRlbSkgPT4geyByZXR1cm4gcGFyc2VJbnQoaXRlbS5rZXkpID09IGtleTsgfSkubWFwKChpdGVtKSA9PiBpdGVtKVswXTtcclxuICAgLy9jb25zb2xlLmxvZyhzb3VyY2VJdGVtKVxyXG5cclxuICBzd2l0Y2ggKHNvdXJjZUl0ZW0udmFsdWUpIHtcclxuICAgIGNhc2UgXCJQZXJtaXNzaW9uU2V0XCI6XHJcbiAgICAgIHRoaXMuRWRpdFNob3dEZXN0aW5hdGlvblBlcm1pc3Npb25MaXN0PXRydWU7XHJcbiAgICAgIHRoaXMuRWRpdFNob3dEZXN0aW5hdGlvblVzZXJBdXRvQ29tcGxldGU9ZmFsc2U7XHJcbiAgICAgXHJcblxyXG4gICAgICBicmVhaztcclxuICAgICAgY2FzZSBcIlVzZXJcIjpcclxuICAgICAgdGhpcy5FZGl0U2hvd0Rlc3RpbmF0aW9uUGVybWlzc2lvbkxpc3Q9ZmFsc2U7XHJcbiAgICAgIHRoaXMuRWRpdFNob3dEZXN0aW5hdGlvblVzZXJBdXRvQ29tcGxldGU9dHJ1ZTtcclxuXHJcblxyXG4gICAgICBicmVhaztcclxuICBcclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIGJyZWFrO1xyXG4gIH1cclxuXHJcbn1cclxuRWRpdFNvdXJjZVBhcnRpY2lwYW50KGtleSl7XHJcbiAgbGV0IHNvdXJjZUl0ZW09dGhpcy5QYXJ0aWNpcGFudFR5cGVMaXN0LmZpbHRlcigoaXRlbSkgPT4geyByZXR1cm4gcGFyc2VJbnQoaXRlbS5rZXkpID09IGtleTsgfSkubWFwKChpdGVtKSA9PiBpdGVtKVswXTtcclxuICAgLy9jb25zb2xlLmxvZyhzb3VyY2VJdGVtKVxyXG5cclxuICBzd2l0Y2ggKHNvdXJjZUl0ZW0udmFsdWUpIHtcclxuICAgIGNhc2UgXCJQZXJtaXNzaW9uU2V0XCI6XHJcbiAgICAgIHRoaXMuRWRpdFNob3dTb3VyY2VQZXJtaXNzaW9uTGlzdD10cnVlO1xyXG4gICAgICB0aGlzLkVkaXRTaG93U291cmNlVXNlckF1dG9Db21wbGV0ZT1mYWxzZTtcclxuICAgICBcclxuICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJVc2VyXCI6XHJcbiAgICAgIHRoaXMuRWRpdFNob3dTb3VyY2VQZXJtaXNzaW9uTGlzdD1mYWxzZTtcclxuICAgICAgdGhpcy5FZGl0U2hvd1NvdXJjZVVzZXJBdXRvQ29tcGxldGU9dHJ1ZTtcclxuXHJcbiAgICAgIGJyZWFrO1xyXG4gIFxyXG4gICAgZGVmYXVsdDpcclxuICAgICAgYnJlYWs7XHJcbn1cclxufVxyXG5cclxuICBMb2FkRHJvcGRvd25MaXN0cygpIHtcclxuICAgIHRoaXMuSW1wZXJzb25hdGlvblJ1bGVTZXJ2aWNlLkxvYWRkcm9wZG93bnMoKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xyXG4gICAgICBsZXQgRHJvcGRvd25MaXN0cyA9IHJlc3VsdCBhcyBhbnlcclxuICAgICAgdGhpcy5QZXJtaXNzaW9uU2V0TGlzdD1Ecm9wZG93bkxpc3RzLnBlcm1pc3Npb25MaXN0XHJcbiAgICAgIHRoaXMuUGFydGljaXBhbnRUeXBlTGlzdD1Ecm9wZG93bkxpc3RzLnBhcnRpY2lwYW50VHlwZUxpc3RcclxuXHJcbiAgICAgIC8vIFRleHRCb3ggaW50aVxyXG4gICAgICB0aGlzLnNlYXJjaFRleHRCb3ggPSBuZXcgVGV4dEJveE9wdGlvbnMoKTtcclxuICAgICAgdGhpcy5zZWFyY2hUZXh0Qm94Lk5hbWUgPSBcInNlYXJjaFRleHRCb3hcIlxyXG4gICAgICB0aGlzLnNlYXJjaFRleHRCb3guSGlkZUxhYmVsID0gdHJ1ZVxyXG4gICAgICB0aGlzLnNlYXJjaFRleHRCb3guVHlwZSA9IElucHV0VHlwZS5UZXh0XHJcbiAgICAgIHRoaXMuc2VhcmNoVGV4dEJveC5QbGFjZWhvbGRlciA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlNlYXJjaEJ5TmFtZVwiKVxyXG5cclxuICAgICAgdGhpcy5UZXh0SW5wdXRGaWx0ZXIgPSBuZXcgRmlsdGVySXRlbSgpO1xyXG4gICAgICB0aGlzLlRleHRJbnB1dEZpbHRlci5Gb3JtQ29udHJvbE5hbWUgPSBcInNlYXJjaFRleHRCb3hcIlxyXG4gICAgICB0aGlzLlRleHRJbnB1dEZpbHRlci5BY3Rpb25QYXJhbWV0ZXJOYW1lID0gXCJzZWFyY2hUZXh0XCJcclxuICAgICAgdGhpcy5UZXh0SW5wdXRGaWx0ZXIuSXNGb3JtQ29udHJvbCA9IHRydWVcclxuICAgICAgdGhpcy5UZXh0SW5wdXRGaWx0ZXIuRmlsdGVyVHlwZSA9IEZpbHRlclR5cGUuVGV4dEJveFxyXG5cclxuICAgICAgdGhpcy5JbXBlcnNvbmF0aW9uUGFnaW5nID0gbmV3IFBhZ2luZ09wdGlvbnMoKTtcclxuICAgICAgdGhpcy5JbXBlcnNvbmF0aW9uUGFnaW5nLkFjdGlvblBvc3RVUkwgPSB0aGlzLmVudmlyb25tZW50U2VydmljZS5nZXRBcGlVcmwoKSArIHRoaXMuQXBpVXJsICsgJ0dldEltcGVyc29uYXRpb25SdWxlQnlGaWx0ZXInO1xyXG4gICAgICB0aGlzLkltcGVyc29uYXRpb25QYWdpbmcuT25LZXlQcmVzc0ZpbHRlcnNDb250cm9sTmFtZXMgPSBbXCJzZWFyY2hUZXh0Qm94XCJdXHJcbiAgICAgIHRoaXMuSW1wZXJzb25hdGlvblBhZ2luZy5GaWx0ZXJzID0gWyB0aGlzLlRleHRJbnB1dEZpbHRlcl1cclxuICAgICAgdGhpcy5JbXBlcnNvbmF0aW9uUGFnaW5nLlZhbGlkYXRpb25Ub2tlbiA9IHRoaXMuYXV0aFNlcnZpY2UuYXV0aG9yaXphdGlvbkhlYWRlclZhbHVlKClcclxuICAgICAgdGhpcy5Jc0ZpbHRlckxvYWRlZCA9IHRydWU7XHJcbiAgICAgIFxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIFJlaW5pdGlhbGl6ZVNlY3RvclBhZ2luZygpIHtcclxuICAgIGxldCBlbGVtZW50ID0gdGhpcy5pbnB1dCBhcyBhbnk7XHJcbiAgICBlbGVtZW50LlJlaW5pdGlhbGl6ZVBhZ2luZygpO1xyXG4gIH1cclxuXHJcbiAgVXBkYXRlU2VjdG9yUGFnaW5nKCkge1xyXG4gICAgbGV0IGVsZW1lbnQgPSB0aGlzLmlucHV0IGFzIGFueTtcclxuICAgIGVsZW1lbnQuVXBkYXRlUGFnaW5nKCk7XHJcbiAgfVxyXG5cclxuICBzZXRJbXBlcnNvbmF0aW9uTGlzdFJlc3VsdChyZXN1bHQpIHtcclxuICAgIHRoaXMuSW1wZXJzb25hdGlvblBhZ2luZ1Jlc3VsdD0gcmVzdWx0XHJcbiAgICB0aGlzLlNob3dQYWdlQ29udGVudD10cnVlO1xyXG4gICAgdGhpcy51dGlsaXR5U2VydmljZS5zdG9wQmxvY2tVSSgpXHJcbiAgfVxyXG5cclxuICByZXNldEZpbHRlcnMoKSB7XHJcbiAgICB0aGlzLkltcGVyc29uYXRpb25Gb3JtLmNvbnRyb2xzW1wic2VhcmNoVGV4dEJveFwiXS5zZXRWYWx1ZShudWxsKTtcclxuICAgIGxldCBlbGVtZW50ID0gdGhpcy5pbnB1dCBhcyBhbnk7XHJcbiAgICBlbGVtZW50LlJlaW5pdGlhbGl6ZVBhZ2luZygpO1xyXG4gIH1cclxuXHJcbiAgc2hvd0FkZEltcGVyc29uYXRpb25Nb2RhbChBZGRJbXBlcnNvbmF0aW9uTW9kYWwpIHtcclxuICAgIHRoaXMuQWRkSW1wZXJzb25hdGlvbkZvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KVxyXG5cclxuICAgIHRoaXMuU2hvd0Rlc3RpbmF0aW9uUGVybWlzc2lvbkxpc3Q9ZmFsc2U7XHJcbiAgICB0aGlzLlNob3dEZXN0aW5hdGlvblVzZXJBdXRvQ29tcGxldGU9ZmFsc2U7XHJcbiAgICB0aGlzLlNob3dTb3VyY2VQZXJtaXNzaW9uTGlzdD1mYWxzZVxyXG4gICAgdGhpcy5TaG93U291cmNlVXNlckF1dG9Db21wbGV0ZT1mYWxzZVxyXG4gICAgdGhpcy51dGlsaXR5U2VydmljZS5zdGFydEJsb2NrVUkoKTtcclxuXHJcbiAgICB0aGlzLlNvdXJjZVBhcnRpY2lwYW50VHlwZSA9IG5ldyBEcm9wZG93bk9wdGlvbnMoKTtcclxuICAgIHRoaXMuU291cmNlUGFydGljaXBhbnRUeXBlLk5hbWUgPSBcIlNvdXJjZVBhcnRpY2lwYW50VHlwZVwiXHJcbiAgICB0aGlzLlNvdXJjZVBhcnRpY2lwYW50VHlwZS5MYWJlbEtleSA9IFwiU291cmNlUGFydGljaXBhbnRUeXBlXCJcclxuICAgIHRoaXMuU291cmNlUGFydGljaXBhbnRUeXBlLlNlbGVjdGVkSXRlbXMgPSBudWxsO1xyXG4gICAgdGhpcy5Tb3VyY2VQYXJ0aWNpcGFudFR5cGUuRGF0YVNvdXJjZSA9IHRoaXMuUGFydGljaXBhbnRUeXBlTGlzdFxyXG4gICAgdGhpcy5Tb3VyY2VQYXJ0aWNpcGFudFR5cGUuU2luZ2xlU2VsZWN0aW9uID0gdHJ1ZTtcclxuICAgIHRoaXMuU291cmNlUGFydGljaXBhbnRUeXBlLkFsbG93U2VhcmNoRmlsdGVyID0gdHJ1ZTtcclxuICAgIHRoaXMuU291cmNlUGFydGljaXBhbnRUeXBlLklzUmVxdWlyZWQgPSB0cnVlO1xyXG5cclxuICAgIHRoaXMuRGVzdGluYXRpb25QYXJ0aWNpcGFudFR5cGUgPSBuZXcgRHJvcGRvd25PcHRpb25zKCk7XHJcbiAgICB0aGlzLkRlc3RpbmF0aW9uUGFydGljaXBhbnRUeXBlLk5hbWUgPSBcIkRlc3RpbmF0aW9uUGFydGljaXBhbnRUeXBlXCJcclxuICAgIHRoaXMuRGVzdGluYXRpb25QYXJ0aWNpcGFudFR5cGUuTGFiZWxLZXkgPSBcIkRlc3RpbmF0aW9uUGFydGljaXBhbnRUeXBlXCJcclxuICAgIHRoaXMuRGVzdGluYXRpb25QYXJ0aWNpcGFudFR5cGUuU2VsZWN0ZWRJdGVtcyA9IG51bGw7XHJcbiAgICB0aGlzLkRlc3RpbmF0aW9uUGFydGljaXBhbnRUeXBlLkRhdGFTb3VyY2UgPSB0aGlzLlBhcnRpY2lwYW50VHlwZUxpc3RcclxuICAgIHRoaXMuRGVzdGluYXRpb25QYXJ0aWNpcGFudFR5cGUuU2luZ2xlU2VsZWN0aW9uID0gdHJ1ZTtcclxuICAgIHRoaXMuRGVzdGluYXRpb25QYXJ0aWNpcGFudFR5cGUuQWxsb3dTZWFyY2hGaWx0ZXIgPSB0cnVlO1xyXG4gICAgdGhpcy5EZXN0aW5hdGlvblBhcnRpY2lwYW50VHlwZS5Jc1JlcXVpcmVkID0gdHJ1ZTtcclxuXHJcbiAgICB0aGlzLlNvdXJjZVBlcm1pc3Npb25TZXRMaXN0ID0gbmV3IERyb3Bkb3duT3B0aW9ucygpO1xyXG4gICAgdGhpcy5Tb3VyY2VQZXJtaXNzaW9uU2V0TGlzdC5OYW1lID0gXCJTb3VyY2VQZXJtaXNzaW9uU2V0TGlzdFwiXHJcbiAgICB0aGlzLlNvdXJjZVBlcm1pc3Npb25TZXRMaXN0LkxhYmVsS2V5ID0gXCJTb3VyY2VQZXJtaXNzaW9uU2V0TGlzdFwiXHJcbiAgICB0aGlzLlNvdXJjZVBlcm1pc3Npb25TZXRMaXN0LlNlbGVjdGVkSXRlbXMgPSBudWxsO1xyXG4gICAgdGhpcy5Tb3VyY2VQZXJtaXNzaW9uU2V0TGlzdC5EYXRhU291cmNlID0gdGhpcy5QZXJtaXNzaW9uU2V0TGlzdFxyXG4gICAgdGhpcy5Tb3VyY2VQZXJtaXNzaW9uU2V0TGlzdC5TaW5nbGVTZWxlY3Rpb24gPSB0cnVlO1xyXG4gICAgdGhpcy5Tb3VyY2VQZXJtaXNzaW9uU2V0TGlzdC5BbGxvd1NlYXJjaEZpbHRlciA9IHRydWU7XHJcbiAgICB0aGlzLlNvdXJjZVBlcm1pc3Npb25TZXRMaXN0LklzUmVxdWlyZWQgPSB0cnVlO1xyXG5cclxuICAgIHRoaXMuRGVzdGluYXRpb25QZXJtaXNzaW9uU2V0TGlzdCA9IG5ldyBEcm9wZG93bk9wdGlvbnMoKTtcclxuICAgIHRoaXMuRGVzdGluYXRpb25QZXJtaXNzaW9uU2V0TGlzdC5OYW1lID0gXCJEZXN0aW5hdGlvblBlcm1pc3Npb25TZXRMaXN0XCJcclxuICAgIHRoaXMuRGVzdGluYXRpb25QZXJtaXNzaW9uU2V0TGlzdC5MYWJlbFZhbHVlID0gXCJEZXN0aW5hdGlvblBlcm1pc3Npb25TZXRMaXN0XCJcclxuICAgIHRoaXMuRGVzdGluYXRpb25QZXJtaXNzaW9uU2V0TGlzdC5MYWJlbEtleSA9IFwiRGVzdGluYXRpb25QZXJtaXNzaW9uU2V0TGlzdFwiXHJcbiAgICB0aGlzLkRlc3RpbmF0aW9uUGVybWlzc2lvblNldExpc3QuU2VsZWN0ZWRJdGVtcyA9IG51bGw7XHJcbiAgICB0aGlzLkRlc3RpbmF0aW9uUGVybWlzc2lvblNldExpc3QuRGF0YVNvdXJjZSA9IHRoaXMuUGVybWlzc2lvblNldExpc3RcclxuICAgIHRoaXMuRGVzdGluYXRpb25QZXJtaXNzaW9uU2V0TGlzdC5TaW5nbGVTZWxlY3Rpb24gPSB0cnVlO1xyXG4gICAgdGhpcy5EZXN0aW5hdGlvblBlcm1pc3Npb25TZXRMaXN0LkFsbG93U2VhcmNoRmlsdGVyID0gdHJ1ZTtcclxuICAgIHRoaXMuRGVzdGluYXRpb25QZXJtaXNzaW9uU2V0TGlzdC5Jc1JlcXVpcmVkID0gdHJ1ZTtcclxuXHJcbiAgICB0aGlzLlNvdXJjZVVzZXJBdXRvQ29tcGxldGUgPSBuZXcgQXV0b2NvbXBsZXRlT3B0aW9ucygpO1xyXG4gICAgdGhpcy5Tb3VyY2VVc2VyQXV0b0NvbXBsZXRlLk5hbWUgPSBcIlNvdXJjZVVzZXJBdXRvQ29tcGxldGVcIjtcclxuICAgIHRoaXMuU291cmNlVXNlckF1dG9Db21wbGV0ZS5MYWJlbEtleSA9IFwiVXNlclwiO1xyXG4gICAgdGhpcy5Tb3VyY2VVc2VyQXV0b0NvbXBsZXRlLlR5cGUgPSBJbnB1dFR5cGUuVGV4dDtcclxuICAgIHRoaXMuU291cmNlVXNlckF1dG9Db21wbGV0ZS5Jc1JlcXVpcmVkID0gdHJ1ZTtcclxuICAgIHRoaXMuU291cmNlVXNlckF1dG9Db21wbGV0ZS5WYWx1ZSA9IG51bGw7XHJcbiAgICB0aGlzLlNvdXJjZVVzZXJBdXRvQ29tcGxldGUuRm9yY2VEaXJlY3Rpb24gPSBGb3JjZURpcmVjdGlvbi5FbmdsaXNoO1xyXG4gICAgdGhpcy5Tb3VyY2VVc2VyQXV0b0NvbXBsZXRlLkFjdGlvblVSTCA9IHRoaXMuZW52aXJvbm1lbnRTZXJ2aWNlLmdldEFwaVVybCgpICsgdGhpcy5BcGlVcmwgKyBcIkF1dG9Db21wbGV0ZVVzZXJcIlxyXG4gICAgdGhpcy5Tb3VyY2VVc2VyQXV0b0NvbXBsZXRlLlZhbGlkYXRpb25Ub2tlbiA9IHRoaXMuYXV0aFNlcnZpY2UuYXV0aG9yaXphdGlvbkhlYWRlclZhbHVlKClcclxuXHJcbiAgICB0aGlzLkRlc3RpbmF0aW9uVXNlckF1dG9Db21wbGV0ZSA9IG5ldyBBdXRvY29tcGxldGVPcHRpb25zKCk7XHJcbiAgICB0aGlzLkRlc3RpbmF0aW9uVXNlckF1dG9Db21wbGV0ZS5OYW1lID0gXCJEZXN0aW5hdGlvblVzZXJBdXRvQ29tcGxldGVcIjtcclxuICAgIHRoaXMuRGVzdGluYXRpb25Vc2VyQXV0b0NvbXBsZXRlLkxhYmVsS2V5ID0gXCJVc2VyXCI7XHJcbiAgICB0aGlzLkRlc3RpbmF0aW9uVXNlckF1dG9Db21wbGV0ZS5UeXBlID0gSW5wdXRUeXBlLlRleHQ7XHJcbiAgICB0aGlzLkRlc3RpbmF0aW9uVXNlckF1dG9Db21wbGV0ZS5Jc1JlcXVpcmVkID0gdHJ1ZTtcclxuICAgIHRoaXMuRGVzdGluYXRpb25Vc2VyQXV0b0NvbXBsZXRlLlZhbHVlID0gbnVsbDtcclxuICAgIHRoaXMuRGVzdGluYXRpb25Vc2VyQXV0b0NvbXBsZXRlLkFjdGlvblVSTCA9IHRoaXMuZW52aXJvbm1lbnRTZXJ2aWNlLmdldEFwaVVybCgpICsgdGhpcy5BcGlVcmwgKyBcIkF1dG9Db21wbGV0ZVVzZXJcIlxyXG4gICAgdGhpcy5EZXN0aW5hdGlvblVzZXJBdXRvQ29tcGxldGUuVmFsaWRhdGlvblRva2VuID0gdGhpcy5hdXRoU2VydmljZS5hdXRob3JpemF0aW9uSGVhZGVyVmFsdWUoKVxyXG4gICAgXHJcbiAgICB0aGlzLklzQWN0aXZlID0gbmV3IENoZWNrQm94T3B0aW9ucygpO1xyXG4gICAgdGhpcy5Jc0FjdGl2ZS5OYW1lID0gXCJJc0FjdGl2ZVwiXHJcbiAgICB0aGlzLklzQWN0aXZlLkxhYmVsS2V5ID0gXCJBY3RpdmVcIlxyXG4gICAgdGhpcy5Jc0FjdGl2ZS5Jc0Rpc2FibGVkID0gdHJ1ZVxyXG4gICAgdGhpcy5Jc0FjdGl2ZS5WYWx1ZSA9IHRydWVcclxuXHJcbiAgICB0aGlzLkV4cGlyZXNBdCA9IG5ldyBEYXRlUGlja2VyT3B0aW9ucygpO1xyXG4gICAgdGhpcy5FeHBpcmVzQXQuTmFtZSA9IFwiRXhwaXJlc0F0XCJcclxuICAgIHRoaXMuRXhwaXJlc0F0LkxhYmVsS2V5ID0gXCJFeHBpcmVzQXRcIlxyXG4gICAgdGhpcy5FeHBpcmVzQXQuSXNSZXF1aXJlZCA9IHRydWVcclxuICAgIHRoaXMuRXhwaXJlc0F0LlN0YXJ0VmlldyA9IFN0YXJ0Vmlldy5Nb250aFxyXG4gICAgdGhpcy5FeHBpcmVzQXQuUGlja2VyVHlwZSA9IFBpY2tlclR5cGUuQ2FsZW5kYXJcclxuICAgIHRoaXMuRXhwaXJlc0F0LlNlbGVjdE1vZGU9U2VsZWN0TW9kZS5TaW5nbGVcclxuXHJcbiAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKEFkZEltcGVyc29uYXRpb25Nb2RhbCk7XHJcbiAgICB0aGlzLnV0aWxpdHlTZXJ2aWNlLnN0b3BCbG9ja1VJKCk7XHJcblxyXG4gIH1cclxuXHJcbiAgYWRkSW1wZXJzb25hdGlvbigpIHtcclxuICBcclxuICAgICAgbGV0IFJlc3VsdE1vZGVsID0gdGhpcy5BZGRJbXBlcnNvbmF0aW9uRm9ybS52YWx1ZTtcclxuXHJcbiAgICAgIGxldCBBZGRNb2RlbDpJbXBlcnNvbmF0aW9uUnVsZU1vZGVsPSBuZXcgSW1wZXJzb25hdGlvblJ1bGVNb2RlbCgpIDtcclxuICAgICAgQWRkTW9kZWwuU291cmNlUGFydGljaXBhbnREVE8uUGFydGljaXBhbnRUeXBlSXRlbUlEPU51bWJlcihSZXN1bHRNb2RlbC5Tb3VyY2VQYXJ0aWNpcGFudFR5cGUpXHJcbiAgICAgIEFkZE1vZGVsLkRlc3RpbmF0aW9uUGFydGljaXBhbnREVE8uUGFydGljaXBhbnRUeXBlSXRlbUlEPU51bWJlcihSZXN1bHRNb2RlbC5EZXN0aW5hdGlvblBhcnRpY2lwYW50VHlwZSlcclxuICAgICAgQWRkTW9kZWwuRXhwaXJlc0F0PVJlc3VsdE1vZGVsLkV4cGlyZXNBdFxyXG4gICAgICBBZGRNb2RlbC5Jc0FjdGl2ZT1SZXN1bHRNb2RlbC5Jc0FjdGl2ZVxyXG4gICAgICBpZihSZXN1bHRNb2RlbC5EZXN0aW5hdGlvblVzZXJBdXRvQ29tcGxldGUhPW51bGwmJlJlc3VsdE1vZGVsLkRlc3RpbmF0aW9uVXNlckF1dG9Db21wbGV0ZSE9dW5kZWZpbmVkKVxyXG4gICAgICBBZGRNb2RlbC5EZXN0aW5hdGlvblBhcnRpY2lwYW50RFRPLlVzZXJJRD1OdW1iZXIoUmVzdWx0TW9kZWwuRGVzdGluYXRpb25Vc2VyQXV0b0NvbXBsZXRlLmtleSlcclxuICAgICAgQWRkTW9kZWwuRGVzdGluYXRpb25QYXJ0aWNpcGFudERUTy5QZXJtaXNzaW9uU2V0SUQ9TnVtYmVyKFJlc3VsdE1vZGVsLkRlc3RpbmF0aW9uUGVybWlzc2lvblNldExpc3QpXHJcbiAgICAgIGlmKFJlc3VsdE1vZGVsLlNvdXJjZVVzZXJBdXRvQ29tcGxldGUhPW51bGwmJlJlc3VsdE1vZGVsLlNvdXJjZVVzZXJBdXRvQ29tcGxldGUhPXVuZGVmaW5lZClcclxuICAgICAgQWRkTW9kZWwuU291cmNlUGFydGljaXBhbnREVE8uVXNlcklEPSAgTnVtYmVyKFJlc3VsdE1vZGVsLlNvdXJjZVVzZXJBdXRvQ29tcGxldGUua2V5KVxyXG4gICAgICBBZGRNb2RlbC5Tb3VyY2VQYXJ0aWNpcGFudERUTy5QZXJtaXNzaW9uU2V0SUQ9TnVtYmVyKFJlc3VsdE1vZGVsLlNvdXJjZVBlcm1pc3Npb25TZXRMaXN0KVxyXG5cclxuICAgICAgdGhpcy5JbXBlcnNvbmF0aW9uUnVsZVNlcnZpY2UuQWRkSW1wZXJzb25hdGlvblJ1bGUoQWRkTW9kZWwpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2UuZGlzbWlzc0FsbCgpO1xyXG4gICAgICAgIGxldCBlbGVtZW50ID0gdGhpcy5pbnB1dCBhcyBhbnk7XHJcbiAgICAgICAgZWxlbWVudC5SZWluaXRpYWxpemVQYWdpbmcoKTtcclxuICAgICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICAgICBcclxuICAgICAgfSlcclxuICB9XHJcblxyXG5cclxuICBzaG93RWRpdEltcGVyc29uYXRpb25Nb2RhbChJbXBlcnNvbmF0aW9uOiBhbnksIEVkaXRJbXBlcnNvbmF0aW9uTW9kYWwpIHtcclxuICAgIHRoaXMuRWRpdEltcGVyc29uYXRpb25Gb3JtID0gbmV3IEZvcm1Hcm91cCh7fSlcclxuXHJcbiAgICB0aGlzLkVkaXRTaG93RGVzdGluYXRpb25QZXJtaXNzaW9uTGlzdD1mYWxzZTtcclxuICAgIHRoaXMuRWRpdFNob3dEZXN0aW5hdGlvblVzZXJBdXRvQ29tcGxldGU9ZmFsc2U7XHJcbiAgICB0aGlzLkVkaXRTaG93U291cmNlUGVybWlzc2lvbkxpc3Q9ZmFsc2VcclxuICAgIHRoaXMuRWRpdFNob3dTb3VyY2VVc2VyQXV0b0NvbXBsZXRlPWZhbHNlXHJcblxyXG4gICAgaWYgKEltcGVyc29uYXRpb24uc291cmNlUGFydGljaXBhbnREVE8ucGFydGljaXBhbnRUeXBlSXRlbUlEIT1udWxsJiZJbXBlcnNvbmF0aW9uLmRlc3RpbmF0aW9uUGFydGljaXBhbnREVE8ucGFydGljaXBhbnRUeXBlSXRlbUlEKSB7XHJcbiAgICAgIHRoaXMuRWRpdERlc3RpbmF0aW9uUGFydGljaXBhbnQoSW1wZXJzb25hdGlvbi5kZXN0aW5hdGlvblBhcnRpY2lwYW50RFRPLnBhcnRpY2lwYW50VHlwZUl0ZW1JRCk7XHJcbiAgICAgIHRoaXMuRWRpdFNvdXJjZVBhcnRpY2lwYW50KEltcGVyc29uYXRpb24uc291cmNlUGFydGljaXBhbnREVE8ucGFydGljaXBhbnRUeXBlSXRlbUlEKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnV0aWxpdHlTZXJ2aWNlLnN0YXJ0QmxvY2tVSSgpO1xyXG5cclxuICAgIHRoaXMuSW1wZXJzb25hdGlvbklkPUltcGVyc29uYXRpb24uaWQ7XHJcbiAgICB0aGlzLlNvdXJjZVBhcnRpY2lwYW50SWQ9SW1wZXJzb25hdGlvbi5zb3VyY2VQYXJ0aWNpcGFudERUTy5pZDtcclxuICAgIHRoaXMuRGVzdGluYXRpb25QYXJ0aWNpcGFudElkPUltcGVyc29uYXRpb24uZGVzdGluYXRpb25QYXJ0aWNpcGFudERUTy5pZDtcclxuICAgIHRoaXMuRWRpdFNvdXJjZVBhcnRpY2lwYW50VHlwZSA9IG5ldyBEcm9wZG93bk9wdGlvbnMoKTtcclxuICAgIHRoaXMuRWRpdFNvdXJjZVBhcnRpY2lwYW50VHlwZS5OYW1lID0gXCJFZGl0U291cmNlUGFydGljaXBhbnRUeXBlXCJcclxuICAgIHRoaXMuRWRpdFNvdXJjZVBhcnRpY2lwYW50VHlwZS5MYWJlbEtleSA9IFwiU291cmNlUGFydGljaXBhbnRUeXBlXCJcclxuICAgIHRoaXMuRWRpdFNvdXJjZVBhcnRpY2lwYW50VHlwZS5TZWxlY3RlZEl0ZW1zID0gdGhpcy5QYXJ0aWNpcGFudFR5cGVMaXN0LmZpbHRlcigoaXRlbSkgPT4geyByZXR1cm4gcGFyc2VJbnQoaXRlbS5rZXkpID09IEltcGVyc29uYXRpb24uc291cmNlUGFydGljaXBhbnREVE8ucGFydGljaXBhbnRUeXBlSXRlbUlEOyB9KS5tYXAoKGl0ZW0pID0+IGl0ZW0ua2V5KVswXTtcclxuICAgIHRoaXMuRWRpdFNvdXJjZVBhcnRpY2lwYW50VHlwZS5EYXRhU291cmNlID0gdGhpcy5QYXJ0aWNpcGFudFR5cGVMaXN0XHJcbiAgICB0aGlzLkVkaXRTb3VyY2VQYXJ0aWNpcGFudFR5cGUuU2luZ2xlU2VsZWN0aW9uID0gdHJ1ZTtcclxuICAgIHRoaXMuRWRpdFNvdXJjZVBhcnRpY2lwYW50VHlwZS5BbGxvd1NlYXJjaEZpbHRlciA9IHRydWU7XHJcbiAgICB0aGlzLkVkaXRTb3VyY2VQYXJ0aWNpcGFudFR5cGUuSXNSZXF1aXJlZCA9IHRydWU7XHJcblxyXG4gICAgdGhpcy5FZGl0RGVzdGluYXRpb25QYXJ0aWNpcGFudFR5cGUgPSBuZXcgRHJvcGRvd25PcHRpb25zKCk7XHJcbiAgICB0aGlzLkVkaXREZXN0aW5hdGlvblBhcnRpY2lwYW50VHlwZS5OYW1lID0gXCJFZGl0RGVzdGluYXRpb25QYXJ0aWNpcGFudFR5cGVcIlxyXG4gICAgdGhpcy5FZGl0RGVzdGluYXRpb25QYXJ0aWNpcGFudFR5cGUuTGFiZWxLZXkgPSBcIkRlc3RpbmF0aW9uUGFydGljaXBhbnRUeXBlXCJcclxuICAgIHRoaXMuRWRpdERlc3RpbmF0aW9uUGFydGljaXBhbnRUeXBlLlNlbGVjdGVkSXRlbXMgPSB0aGlzLlBhcnRpY2lwYW50VHlwZUxpc3QuZmlsdGVyKChpdGVtKSA9PiB7IHJldHVybiBwYXJzZUludChpdGVtLmtleSkgPT0gSW1wZXJzb25hdGlvbi5kZXN0aW5hdGlvblBhcnRpY2lwYW50RFRPLnBhcnRpY2lwYW50VHlwZUl0ZW1JRDsgfSkubWFwKChpdGVtKSA9PiBpdGVtLmtleSlbMF07O1xyXG4gICAgdGhpcy5FZGl0RGVzdGluYXRpb25QYXJ0aWNpcGFudFR5cGUuRGF0YVNvdXJjZSA9IHRoaXMuUGFydGljaXBhbnRUeXBlTGlzdFxyXG4gICAgdGhpcy5FZGl0RGVzdGluYXRpb25QYXJ0aWNpcGFudFR5cGUuU2luZ2xlU2VsZWN0aW9uID0gdHJ1ZTtcclxuICAgIHRoaXMuRWRpdERlc3RpbmF0aW9uUGFydGljaXBhbnRUeXBlLkFsbG93U2VhcmNoRmlsdGVyID0gdHJ1ZTtcclxuICAgIHRoaXMuRWRpdERlc3RpbmF0aW9uUGFydGljaXBhbnRUeXBlLklzUmVxdWlyZWQgPSB0cnVlO1xyXG5cclxuICAgIHRoaXMuRWRpdFNvdXJjZVBlcm1pc3Npb25TZXRMaXN0ID0gbmV3IERyb3Bkb3duT3B0aW9ucygpO1xyXG4gICAgdGhpcy5FZGl0U291cmNlUGVybWlzc2lvblNldExpc3QuTmFtZSA9IFwiRWRpdFNvdXJjZVBlcm1pc3Npb25TZXRMaXN0XCJcclxuICAgIHRoaXMuRWRpdFNvdXJjZVBlcm1pc3Npb25TZXRMaXN0LkxhYmVsS2V5ID0gXCJTb3VyY2VQZXJtaXNzaW9uU2V0TGlzdFwiXHJcbiAgICB0aGlzLkVkaXRTb3VyY2VQZXJtaXNzaW9uU2V0TGlzdC5TZWxlY3RlZEl0ZW1zID0gdGhpcy5QZXJtaXNzaW9uU2V0TGlzdC5maWx0ZXIoKGl0ZW0pID0+IHsgcmV0dXJuIHBhcnNlSW50KGl0ZW0ua2V5KSA9PSBJbXBlcnNvbmF0aW9uLnNvdXJjZVBhcnRpY2lwYW50RFRPLnBlcm1pc3Npb25TZXRJRDsgfSkubWFwKChpdGVtKSA9PiBpdGVtLmtleSlbMF07O1xyXG4gICAgdGhpcy5FZGl0U291cmNlUGVybWlzc2lvblNldExpc3QuRGF0YVNvdXJjZSA9IHRoaXMuUGVybWlzc2lvblNldExpc3RcclxuICAgIHRoaXMuRWRpdFNvdXJjZVBlcm1pc3Npb25TZXRMaXN0LlNpbmdsZVNlbGVjdGlvbiA9IHRydWU7XHJcbiAgICB0aGlzLkVkaXRTb3VyY2VQZXJtaXNzaW9uU2V0TGlzdC5BbGxvd1NlYXJjaEZpbHRlciA9IHRydWU7XHJcbiAgICB0aGlzLkVkaXRTb3VyY2VQZXJtaXNzaW9uU2V0TGlzdC5Jc1JlcXVpcmVkID0gdHJ1ZTtcclxuXHJcbiAgICB0aGlzLkVkaXREZXN0aW5hdGlvblBlcm1pc3Npb25TZXRMaXN0ID0gbmV3IERyb3Bkb3duT3B0aW9ucygpO1xyXG4gICAgdGhpcy5FZGl0RGVzdGluYXRpb25QZXJtaXNzaW9uU2V0TGlzdC5OYW1lID0gXCJFZGl0RGVzdGluYXRpb25QZXJtaXNzaW9uU2V0TGlzdFwiXHJcbiAgICB0aGlzLkVkaXREZXN0aW5hdGlvblBlcm1pc3Npb25TZXRMaXN0LkxhYmVsS2V5ID0gXCJEZXN0aW5hdGlvblBlcm1pc3Npb25TZXRMaXN0XCJcclxuICAgIHRoaXMuRWRpdERlc3RpbmF0aW9uUGVybWlzc2lvblNldExpc3QuU2VsZWN0ZWRJdGVtcyA9IHRoaXMuUGVybWlzc2lvblNldExpc3QuZmlsdGVyKChpdGVtKSA9PiB7IHJldHVybiBwYXJzZUludChpdGVtLmtleSkgPT0gSW1wZXJzb25hdGlvbi5kZXN0aW5hdGlvblBhcnRpY2lwYW50RFRPLnBlcm1pc3Npb25TZXRJRDsgfSkubWFwKChpdGVtKSA9PiBpdGVtLmtleSlbMF07OztcclxuICAgIHRoaXMuRWRpdERlc3RpbmF0aW9uUGVybWlzc2lvblNldExpc3QuRGF0YVNvdXJjZSA9IHRoaXMuUGVybWlzc2lvblNldExpc3RcclxuICAgIHRoaXMuRWRpdERlc3RpbmF0aW9uUGVybWlzc2lvblNldExpc3QuU2luZ2xlU2VsZWN0aW9uID0gdHJ1ZTtcclxuICAgIHRoaXMuRWRpdERlc3RpbmF0aW9uUGVybWlzc2lvblNldExpc3QuQWxsb3dTZWFyY2hGaWx0ZXIgPSB0cnVlO1xyXG4gICAgdGhpcy5FZGl0RGVzdGluYXRpb25QZXJtaXNzaW9uU2V0TGlzdC5Jc1JlcXVpcmVkID0gdHJ1ZTtcclxuXHJcbiAgICB0aGlzLkVkaXRTb3VyY2VVc2VyQXV0b0NvbXBsZXRlID0gbmV3IEF1dG9jb21wbGV0ZU9wdGlvbnMoKTtcclxuICAgIHRoaXMuRWRpdFNvdXJjZVVzZXJBdXRvQ29tcGxldGUuTmFtZSA9IFwiRWRpdFNvdXJjZVVzZXJBdXRvQ29tcGxldGVcIjtcclxuICAgIHRoaXMuRWRpdFNvdXJjZVVzZXJBdXRvQ29tcGxldGUuTGFiZWxLZXkgPSBcIlVzZXJcIjtcclxuICAgIHRoaXMuRWRpdFNvdXJjZVVzZXJBdXRvQ29tcGxldGUuVHlwZSA9IElucHV0VHlwZS5UZXh0O1xyXG4gICAgdGhpcy5FZGl0U291cmNlVXNlckF1dG9Db21wbGV0ZS5Jc1JlcXVpcmVkID0gdHJ1ZTtcclxuXHJcblxyXG4gICAgbGV0IG1vZGVsPSAgbmV3IEF1dG9jb21wbGV0ZURUTygpO1xyXG4gICAgbW9kZWwua2V5PUltcGVyc29uYXRpb24uc291cmNlUGFydGljaXBhbnREVE8udXNlcklEXHJcbiAgICBtb2RlbC52YWx1ZT1JbXBlcnNvbmF0aW9uLnNvdXJjZVBhcnRpY2lwYW50RFRPLnBhcnRpY2lwYW50TmFtZS5jdXJyZW50O1xyXG4gICAgdGhpcy5FZGl0U291cmNlVXNlckF1dG9Db21wbGV0ZS5TZWxlY3RlZFZhbHVlID0gbW9kZWxcclxuICAgIHRoaXMuRWRpdFNvdXJjZVVzZXJBdXRvQ29tcGxldGUuQWN0aW9uVVJMID0gdGhpcy5lbnZpcm9ubWVudFNlcnZpY2UuZ2V0QXBpVXJsKCkgKyB0aGlzLkFwaVVybCArIFwiQXV0b0NvbXBsZXRlVXNlclwiXHJcbiAgICB0aGlzLkVkaXRTb3VyY2VVc2VyQXV0b0NvbXBsZXRlLlZhbGlkYXRpb25Ub2tlbiA9IHRoaXMuYXV0aFNlcnZpY2UuYXV0aG9yaXphdGlvbkhlYWRlclZhbHVlKClcclxuXHJcbiAgICB0aGlzLkVkaXREZXN0aW5hdGlvblVzZXJBdXRvQ29tcGxldGUgPSBuZXcgQXV0b2NvbXBsZXRlT3B0aW9ucygpO1xyXG4gICAgdGhpcy5FZGl0RGVzdGluYXRpb25Vc2VyQXV0b0NvbXBsZXRlLk5hbWUgPSBcIkVkaXREZXN0aW5hdGlvblVzZXJBdXRvQ29tcGxldGVcIjtcclxuICAgIHRoaXMuRWRpdERlc3RpbmF0aW9uVXNlckF1dG9Db21wbGV0ZS5MYWJlbEtleSA9IFwiVXNlclwiO1xyXG4gICAgdGhpcy5FZGl0RGVzdGluYXRpb25Vc2VyQXV0b0NvbXBsZXRlLlR5cGUgPSBJbnB1dFR5cGUuVGV4dDtcclxuICAgIHRoaXMuRWRpdERlc3RpbmF0aW9uVXNlckF1dG9Db21wbGV0ZS5Jc1JlcXVpcmVkID0gdHJ1ZTtcclxuICAgIGxldCBEZXN0aW5hdGlvblVzZXJNb2RlbD0gIG5ldyBBdXRvY29tcGxldGVEVE8oKTtcclxuICAgIERlc3RpbmF0aW9uVXNlck1vZGVsLmtleT1JbXBlcnNvbmF0aW9uLmRlc3RpbmF0aW9uUGFydGljaXBhbnREVE8udXNlcklEXHJcbiAgICBEZXN0aW5hdGlvblVzZXJNb2RlbC52YWx1ZT1JbXBlcnNvbmF0aW9uLmRlc3RpbmF0aW9uUGFydGljaXBhbnREVE8ucGFydGljaXBhbnROYW1lLmN1cnJlbnQ7XHJcbiAgICBcclxuICAgIHRoaXMuRWRpdERlc3RpbmF0aW9uVXNlckF1dG9Db21wbGV0ZS5TZWxlY3RlZFZhbHVlID1EZXN0aW5hdGlvblVzZXJNb2RlbFxyXG4gICAgdGhpcy5FZGl0RGVzdGluYXRpb25Vc2VyQXV0b0NvbXBsZXRlLkFjdGlvblVSTCA9IHRoaXMuZW52aXJvbm1lbnRTZXJ2aWNlLmdldEFwaVVybCgpICsgdGhpcy5BcGlVcmwgKyBcIkF1dG9Db21wbGV0ZVVzZXJcIlxyXG4gICAgdGhpcy5FZGl0RGVzdGluYXRpb25Vc2VyQXV0b0NvbXBsZXRlLlZhbGlkYXRpb25Ub2tlbiA9IHRoaXMuYXV0aFNlcnZpY2UuYXV0aG9yaXphdGlvbkhlYWRlclZhbHVlKClcclxuICAgIFxyXG4gICAgdGhpcy5FZGl0SXNBY3RpdmUgPSBuZXcgQ2hlY2tCb3hPcHRpb25zKCk7XHJcbiAgICB0aGlzLkVkaXRJc0FjdGl2ZS5OYW1lID0gXCJFZGl0SXNBY3RpdmVcIlxyXG4gICAgdGhpcy5FZGl0SXNBY3RpdmUuTGFiZWxLZXkgPSBcIkFjdGl2ZVwiXHJcbiAgICB0aGlzLkVkaXRJc0FjdGl2ZS5Jc0Rpc2FibGVkID0gdHJ1ZVxyXG4gICAgdGhpcy5FZGl0SXNBY3RpdmUuVmFsdWUgPSB0cnVlXHJcblxyXG4gICAgdGhpcy5FZGl0RXhwaXJlc0F0ID0gbmV3IERhdGVQaWNrZXJPcHRpb25zKCk7XHJcbiAgICB0aGlzLkVkaXRFeHBpcmVzQXQuTmFtZSA9IFwiRWRpdEV4cGlyZXNBdFwiXHJcbiAgICB0aGlzLkVkaXRFeHBpcmVzQXQuTGFiZWxLZXkgPSBcIkV4cGlyZXNBdFwiXHJcbiAgICB0aGlzLkVkaXRFeHBpcmVzQXQuSXNSZXF1aXJlZCA9IHRydWVcclxuICAgIHRoaXMuRWRpdEV4cGlyZXNBdC5WYWx1ZSA9IEltcGVyc29uYXRpb24uZXhwaXJlc0F0XHJcbiAgICB0aGlzLkVkaXRFeHBpcmVzQXQuU3RhcnRWaWV3ID0gU3RhcnRWaWV3Lk1vbnRoXHJcbiAgICB0aGlzLkVkaXRFeHBpcmVzQXQuUGlja2VyVHlwZSA9IFBpY2tlclR5cGUuQ2FsZW5kYXJcclxuICAgIHRoaXMuRWRpdEV4cGlyZXNBdC5TZWxlY3RNb2RlPVNlbGVjdE1vZGUuU2luZ2xlXHJcbiAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKEVkaXRJbXBlcnNvbmF0aW9uTW9kYWwpO1xyXG4gICAgdGhpcy51dGlsaXR5U2VydmljZS5zdG9wQmxvY2tVSSgpO1xyXG5cclxuXHJcbiAgfVxyXG5cclxuICBlZGl0SW1wZXJzb25hdGlvbigpIHtcclxuICAgIGlmICh0aGlzLkVkaXRJbXBlcnNvbmF0aW9uRm9ybS5pbnZhbGlkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBsZXQgUmVzdWx0TW9kZWwgPSB0aGlzLkVkaXRJbXBlcnNvbmF0aW9uRm9ybS52YWx1ZTtcclxuXHJcbiAgICAgIGxldCBFZGl0TW9kZWw6SW1wZXJzb25hdGlvblJ1bGVNb2RlbD0gbmV3IEltcGVyc29uYXRpb25SdWxlTW9kZWwoKSA7XHJcbiAgICAgIEVkaXRNb2RlbC5JRD10aGlzLkltcGVyc29uYXRpb25JZFxyXG4gICAgICBFZGl0TW9kZWwuRGVzdGluYXRpb25QYXJ0aWNpcGFudERUTy5JRD10aGlzLkRlc3RpbmF0aW9uUGFydGljaXBhbnRJZFxyXG4gICAgICBFZGl0TW9kZWwuU291cmNlUGFydGljaXBhbnREVE8uSUQ9dGhpcy5Tb3VyY2VQYXJ0aWNpcGFudElkXHJcbiAgICAgIEVkaXRNb2RlbC5Tb3VyY2VQYXJ0aWNpcGFudERUTy5QYXJ0aWNpcGFudFR5cGVJdGVtSUQ9TnVtYmVyKFJlc3VsdE1vZGVsLkVkaXRTb3VyY2VQYXJ0aWNpcGFudFR5cGUpXHJcbiAgICAgIEVkaXRNb2RlbC5EZXN0aW5hdGlvblBhcnRpY2lwYW50RFRPLlBhcnRpY2lwYW50VHlwZUl0ZW1JRD1OdW1iZXIoUmVzdWx0TW9kZWwuRWRpdERlc3RpbmF0aW9uUGFydGljaXBhbnRUeXBlKVxyXG4gICAgICBFZGl0TW9kZWwuRXhwaXJlc0F0PVJlc3VsdE1vZGVsLkVkaXRFeHBpcmVzQXRcclxuICAgICAgRWRpdE1vZGVsLklzQWN0aXZlID0gUmVzdWx0TW9kZWwuRWRpdElzQWN0aXZlXHJcbiAgICAgIGNvbnNvbGUubG9nKFwiRGF0YTpcIik7XHJcbiAgICAgIGNvbnNvbGUubG9nKFJlc3VsdE1vZGVsKTtcclxuICAgICAgaWYgKFJlc3VsdE1vZGVsLkVkaXREZXN0aW5hdGlvblVzZXJBdXRvQ29tcGxldGUgIT0gbnVsbCAmJiBSZXN1bHRNb2RlbC5FZGl0RGVzdGluYXRpb25Vc2VyQXV0b0NvbXBsZXRlICE9IHVuZGVmaW5lZClcclxuICAgICAgICBFZGl0TW9kZWwuRGVzdGluYXRpb25QYXJ0aWNpcGFudERUTy5Vc2VySUQgPSBOdW1iZXIoUmVzdWx0TW9kZWwuRWRpdERlc3RpbmF0aW9uVXNlckF1dG9Db21wbGV0ZS5rZXkpXHJcbiAgICAgIEVkaXRNb2RlbC5EZXN0aW5hdGlvblBhcnRpY2lwYW50RFRPLlBlcm1pc3Npb25TZXRJRD1OdW1iZXIoUmVzdWx0TW9kZWwuRWRpdERlc3RpbmF0aW9uUGVybWlzc2lvblNldExpc3QpXHJcbiAgICAgIGlmIChSZXN1bHRNb2RlbC5FZGl0U291cmNlVXNlckF1dG9Db21wbGV0ZSAhPSBudWxsICYmIFJlc3VsdE1vZGVsLkVkaXRTb3VyY2VVc2VyQXV0b0NvbXBsZXRlICE9IHVuZGVmaW5lZClcclxuICAgICAgICBFZGl0TW9kZWwuU291cmNlUGFydGljaXBhbnREVE8uVXNlcklEID0gTnVtYmVyKFJlc3VsdE1vZGVsLkVkaXRTb3VyY2VVc2VyQXV0b0NvbXBsZXRlLmtleSlcclxuICAgICAgRWRpdE1vZGVsLlNvdXJjZVBhcnRpY2lwYW50RFRPLlBlcm1pc3Npb25TZXRJRD1OdW1iZXIoUmVzdWx0TW9kZWwuRWRpdFNvdXJjZVBlcm1pc3Npb25TZXRMaXN0KVxyXG4gICAgICB0aGlzLkltcGVyc29uYXRpb25SdWxlU2VydmljZS5FZGl0SW1wZXJzb25hdGlvblJ1bGUoIEVkaXRNb2RlbCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcclxuICAgICAgICB0aGlzLm1vZGFsU2VydmljZS5kaXNtaXNzQWxsKCk7XHJcbiAgICAgICAgbGV0IGVsZW1lbnQgPSB0aGlzLmlucHV0IGFzIGFueTtcclxuICAgICAgICBlbGVtZW50LlVwZGF0ZVBhZ2luZygpO1xyXG4gICAgICB9LCAoZXJyb3IpID0+IHtcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNob3dEZWxldGVJbXBlcnNvbmF0aW9uTW9kYWwoU2VjdG9yOiBhbnksIGRlbGV0ZUltcGVyc29uYXRpb25Nb2RhbCkge1xyXG4gICAgdGhpcy5kZWxldGVJbXBlcnNvbmF0aW9uTGlzdCA9IFtdXHJcbiAgICB0aGlzLmRlbGV0ZUltcGVyc29uYXRpb25MaXN0LnB1c2goU2VjdG9yKTtcclxuICAgIHRoaXMudXRpbGl0eVNlcnZpY2Uuc3RhcnRCbG9ja1VJKCk7XHJcbiAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKGRlbGV0ZUltcGVyc29uYXRpb25Nb2RhbCk7XHJcbiAgICB0aGlzLnV0aWxpdHlTZXJ2aWNlLnN0b3BCbG9ja1VJKCk7XHJcblxyXG5cclxuICB9XHJcblxyXG4gIGRlbGV0ZUltcGVyc29uYXRpb24oKSB7XHJcbiAgICBsZXQgIFVzZXJzSURNb2RlbDpVc2Vyc0lEUmVxdWVzdE1vZGVsPSBuZXcgVXNlcnNJRFJlcXVlc3RNb2RlbCgpIDtcclxuICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5kZWxldGVJbXBlcnNvbmF0aW9uTGlzdC5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmRlbGV0ZUltcGVyc29uYXRpb25MaXN0W2luZGV4XTtcclxuICAgICAgIFVzZXJzSURNb2RlbC5Vc2Vyc0lEcy5wdXNoKGVsZW1lbnQuaWQpXHJcbiAgICAgICBcclxuICAgICB9XHJcbiAgICB0aGlzLkltcGVyc29uYXRpb25SdWxlU2VydmljZS5EZWxldGVJbXBlcnNvbmF0aW9uUnVsZShVc2Vyc0lETW9kZWwgKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xyXG4gICAgICB0aGlzLmRlbGV0ZUltcGVyc29uYXRpb25MaXN0ID0gW107XHJcbiAgICAgIHRoaXMubW9kYWxTZXJ2aWNlLmRpc21pc3NBbGwoKTtcclxuICAgICAgbGV0IGVsZW1lbnQgPSB0aGlzLmlucHV0IGFzIGFueTtcclxuICAgICAgZWxlbWVudC5SZWluaXRpYWxpemVQYWdpbmcoKTtcclxuICAgIH0sIChlcnJvcikgPT4ge1xyXG4gICAgICBcclxuICAgIH0pXHJcblxyXG4gIH1cclxuXHJcblxyXG59XHJcbiIsIjxibG9jay11aT48L2Jsb2NrLXVpPlxyXG4gIDwhLS0gUGFnZSBDb250ZW50IC0tPlxyXG4gIDxkaXYgKm5nSWY9XCJTaG93UGFnZUNvbnRlbnRcIiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhcmQgY2FyZC1jdXN0b20taFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgYm9yZGVyLTAgcHQtNVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLXRpdGxlIGFsaWduLWl0ZW1zLXN0YXJ0IGZsZXgtY29sdW1uXCIgKm5nSWY9XCJJc0ZpbHRlckxvYWRlZFwiPlxyXG4gICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJJbXBlcnNvbmF0aW9uRm9ybVwiPlxyXG4gICAgICAgICAgICA8QkJTRi1UZXh0Qm94IFtvcHRpb25zXT1cInNlYXJjaFRleHRCb3hcIiBbZ3JvdXBdPVwiSW1wZXJzb25hdGlvbkZvcm1cIj48L0JCU0YtVGV4dEJveD5cclxuICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC10b29sYmFyXCI+XHJcbiAgICAgICAgICA8IS0tIGJlZ2luOjpNZW51IC0tPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1wcmltYXJ5XCIgdGl0bGU9XCJBZGRcIiAoY2xpY2spPVwic2hvd0FkZEltcGVyc29uYXRpb25Nb2RhbChBZGRJbXBlcnNvbmF0aW9uTW9kYWwpXCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXBsdXMgbWUtMVwiPjwvaT5cclxuICAgICAgICAgICAge3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiQWRkXCIpfX1cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgIDwhLS0gZW5kOjpNZW51IC0tPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBweS0zXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmVcIj5cclxuICAgICAgICAgIDwhLS1iZWdpbjo6UGVybWlzc2lvbiBsaXN0LS0+XHJcbiAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBhbGlnbi1taWRkbGUgdGFibGUtcm93LWRhc2hlZCBmcy02IGd5LTUgZGF0YVRhYmxlIG5vLWZvb3RlclwiPlxyXG4gICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgPHRyIGNsYXNzPVwidGV4dC1zdGFydCB0ZXh0LWdyYXktNDAwIGZ3LWJvbGRlciBmcy03IHRleHQtdXBwZXJjYXNlIGdzLTBcIj5cclxuXHJcbiAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJtaW4tdy0xNTBweFwiPiBbe3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiUGFydGljaXBhbnRUeXBlXCIpfX1de3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiU291cmNlXCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwibWluLXctMTUwcHhcIj4gW3t7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlBhcnRpY2lwYW50VHlwZVwiKX19XXt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkRlc3RpbmF0aW9uXCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwibWluLXctMTUwcHhcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJFeHBpcmVzQXRcIil9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJtaW4tdy0xNTBweFwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkFjdGl2ZVwiKX19PC90aD5cclxuICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cIm1pbi13LTUwcHhcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJBY3Rpb25cIil9fTwvdGg+XHJcbiAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgPHRib2R5IGlkPVwibGlzdGluZ0NvbnRhaW5lclwiIGNsYXNzPVwiZnctYm9sZCB0ZXh0LWdyYXktNjAwIGJvcmRlci0wXCI+XHJcblxyXG4gICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgSW1wZXJzb25hdGlvbiBvZiBJbXBlcnNvbmF0aW9uUGFnaW5nUmVzdWx0XCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImxhbmd1YWdlPT0nYXInXCIgY2xhc3M9XCJ0ZXh0LWRhcmtcIj5cclxuICAgICAgICAgICAgICAgICAgICBbe3tJbXBlcnNvbmF0aW9uLnNvdXJjZVBhcnRpY2lwYW50RFRPLnBhcnRpY2lwYW50VHlwZUl0ZW1OYW1lLmFyYWJpY319XSB7e0ltcGVyc29uYXRpb24uc291cmNlUGFydGljaXBhbnREVE8ucGFydGljaXBhbnROYW1lLmFyYWJpY319XHJcbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJsYW5ndWFnZT09J2VuJ1wiIGNsYXNzPVwidGV4dC1kYXJrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgW3t7SW1wZXJzb25hdGlvbi5zb3VyY2VQYXJ0aWNpcGFudERUTy5wYXJ0aWNpcGFudFR5cGVJdGVtTmFtZS5lbmdsaXNofX1dIHt7SW1wZXJzb25hdGlvbi5zb3VyY2VQYXJ0aWNpcGFudERUTy5wYXJ0aWNpcGFudE5hbWUuZW5nbGlzaH19XHJcbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwibGFuZ3VhZ2U9PSdhcidcIj4gIFt7e0ltcGVyc29uYXRpb24uZGVzdGluYXRpb25QYXJ0aWNpcGFudERUTy5wYXJ0aWNpcGFudFR5cGVJdGVtTmFtZS5hcmFiaWN9fV0ge3tJbXBlcnNvbmF0aW9uLmRlc3RpbmF0aW9uUGFydGljaXBhbnREVE8ucGFydGljaXBhbnROYW1lLmFyYWJpY319PC90ZD5cclxuICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cImxhbmd1YWdlPT0nZW4nXCI+W3t7SW1wZXJzb25hdGlvbi5kZXN0aW5hdGlvblBhcnRpY2lwYW50RFRPLnBhcnRpY2lwYW50VHlwZUl0ZW1OYW1lLmVuZ2xpc2h9fV0ge3tJbXBlcnNvbmF0aW9uLmRlc3RpbmF0aW9uUGFydGljaXBhbnREVE8ucGFydGljaXBhbnROYW1lLmVuZ2xpc2h9fTwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgPHRkPnt7SW1wZXJzb25hdGlvbi5leHBpcmVzQXR9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8dGQ+e3tJbXBlcnNvbmF0aW9uLmlzQWN0aXZlfX08L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgIDx0ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJtZW51XCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1pY29uIGJ0bi1saWdodCBidG4tYWN0aXZlLWxpZ2h0LXByaW1hcnlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZWxsaXBzaXMtaFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LW1lbnUgI21lbnU9XCJtYXRNZW51XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRyb3AtaXRlbSBweC0zXCIgbmdiRHJvcGRvd25JdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd0VkaXRJbXBlcnNvbmF0aW9uTW9kYWwoSW1wZXJzb25hdGlvbixFZGl0SW1wZXJzb25hdGlvbk1vZGFsKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRyb3AtbGluayBweC0zXCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiRWRpdFwiKX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGEgbmdiRHJvcGRvd25JdGVtIGNsYXNzPVwiZHJvcC1pdGVtIHB4LTNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dEZWxldGVJbXBlcnNvbmF0aW9uTW9kYWwoSW1wZXJzb25hdGlvbixkZWxldGVJbXBlcnNvbmF0aW9uTW9kYWwpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZHJvcC1saW5rIHB4LTNcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJEZWxldGVcIil9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICA8dHIgKm5nSWY9XCJJbXBlcnNvbmF0aW9uUGFnaW5nUmVzdWx0Lmxlbmd0aCA9PSAwXCI+XHJcbiAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjVcIj5cclxuICAgICAgICAgICAgICAgICAgPGxpYi1lbXB0eS1kYXRhPjwvbGliLWVtcHR5LWRhdGE+XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICA8L3RhYmxlPlxyXG5cclxuICAgICAgICAgIDwhLS1lbmQ6OlBlcm1pc3Npb24gbGlzdC0tPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWZvb3RlciBib3JkZXItMFwiPlxyXG4gICAgICAgIDxCQlNGLVBhZ2luZyAoSXRlbXMpPVwic2V0SW1wZXJzb25hdGlvbkxpc3RSZXN1bHQoJGV2ZW50KVwiICpuZ0lmPVwiSXNGaWx0ZXJMb2FkZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJJbXBlcnNvbmF0aW9uUGFnaW5nXCIgW2dyb3VwXT1cIkltcGVyc29uYXRpb25Gb3JtXCIgI0ltcGVyc29uYXRpb25QYWdpbmdWaWV3RWxlbWVudD5cclxuICAgICAgICA8L0JCU0YtUGFnaW5nPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICA8L2Rpdj5cclxuICA8IS0tIEFkZCBNb2RhbCAtLT5cclxuICA8bmctdGVtcGxhdGUgI0FkZEltcGVyc29uYXRpb25Nb2RhbCBsZXQtbW9kYWw+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyIHBiLTAgYm9yZGVyLTAganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgICA8aDUgY2xhc3M9XCJtb2RhbC10aXRsZVwiIGlkPVwiZXhhbXBsZU1vZGFsTGFiZWxcIj48L2g1PlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4taWNvbiBidG4tYWN0aXZlLWNvbG9yLXByaW1hcnlcIiAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygpXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzdmctaWNvbiBzdmctaWNvbi0xXCI+XHJcbiAgICAgICAgICA8c3BhbiBbaW5saW5lU1ZHXT1cIicuL3NyYy9hc3NldHMvaW1hZ2VzL2FycjA2MS5zdmcnXCI+PC9zcGFuPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IHNjcm9sbC15IHB4LTEwIHB4LWxnLTE1IHB0LTAgcGItMTVcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTEzIHRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgPGgxIGNsYXNzPVwibWItM1wiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkFkZFwiKX19IHt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkltcGVyc29uYXRpb25SdWxlXCIpfX08L2gxPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiQWRkSW1wZXJzb25hdGlvbkZvcm1cIiAobmdTdWJtaXQpPVwiYWRkSW1wZXJzb25hdGlvbigpXCI+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgPEJCU0YtRHJvcGRvd25MaXN0IFtvcHRpb25zXT1cIlNvdXJjZVBhcnRpY2lwYW50VHlwZVwiIChPbkNoYW5nZSk9XCJTb3VyY2VQYXJ0aWNpcGFudCgkZXZlbnQpXCIgW2dyb3VwXT1cIkFkZEltcGVyc29uYXRpb25Gb3JtXCI+XHJcbiAgICAgICAgICAgIDwvQkJTRi1Ecm9wZG93bkxpc3Q+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgPEJCU0YtRHJvcGRvd25MaXN0IFtvcHRpb25zXT1cIlNvdXJjZVBlcm1pc3Npb25TZXRMaXN0XCIgKm5nSWY9XCJTaG93U291cmNlUGVybWlzc2lvbkxpc3RcIiBbZ3JvdXBdPVwiQWRkSW1wZXJzb25hdGlvbkZvcm1cIj5cclxuICAgICAgICAgICAgPC9CQlNGLURyb3Bkb3duTGlzdD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICA8QkJTRi1BdXRvY29tcGxldGVUZXh0Qm94IFtvcHRpb25zXT1cIlNvdXJjZVVzZXJBdXRvQ29tcGxldGVcIiAqbmdJZj1cIlNob3dTb3VyY2VVc2VyQXV0b0NvbXBsZXRlXCIgW2dyb3VwXT1cIkFkZEltcGVyc29uYXRpb25Gb3JtXCI+XHJcbiAgICAgICAgICAgIDwvQkJTRi1BdXRvY29tcGxldGVUZXh0Qm94PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgPEJCU0YtRHJvcGRvd25MaXN0IFtvcHRpb25zXT1cIkRlc3RpbmF0aW9uUGFydGljaXBhbnRUeXBlXCIgKE9uQ2hhbmdlKT1cIkRlc3RpbmF0aW9uUGFydGljaXBhbnQoJGV2ZW50KVwiIFtncm91cF09XCJBZGRJbXBlcnNvbmF0aW9uRm9ybVwiPlxyXG4gICAgICAgICAgICA8L0JCU0YtRHJvcGRvd25MaXN0PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgIDxCQlNGLURyb3Bkb3duTGlzdCBbb3B0aW9uc109XCJEZXN0aW5hdGlvblBlcm1pc3Npb25TZXRMaXN0XCIgKm5nSWY9XCJTaG93RGVzdGluYXRpb25QZXJtaXNzaW9uTGlzdFwiIFtncm91cF09XCJBZGRJbXBlcnNvbmF0aW9uRm9ybVwiPlxyXG4gICAgICAgICAgICA8L0JCU0YtRHJvcGRvd25MaXN0PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgIDxCQlNGLUF1dG9jb21wbGV0ZVRleHRCb3ggW29wdGlvbnNdPVwiRGVzdGluYXRpb25Vc2VyQXV0b0NvbXBsZXRlXCIgKm5nSWY9XCJTaG93RGVzdGluYXRpb25Vc2VyQXV0b0NvbXBsZXRlXCIgW2dyb3VwXT1cIkFkZEltcGVyc29uYXRpb25Gb3JtXCI+XHJcbiAgICAgICAgICAgIDwvQkJTRi1BdXRvY29tcGxldGVUZXh0Qm94PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICA8QkJTRi1DaGVja0JveCBbb3B0aW9uc109XCJJc0FjdGl2ZVwiIFtncm91cF09XCJBZGRJbXBlcnNvbmF0aW9uRm9ybVwiPlxyXG4gICAgICAgICAgICA8L0JCU0YtQ2hlY2tCb3g+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICA8QkJTRi1EYXRlVGltZVBpY2tlciBbb3B0aW9uc109XCJFeHBpcmVzQXRcIiBbZ3JvdXBdPVwiQWRkSW1wZXJzb25hdGlvbkZvcm1cIj5cclxuXHJcbiAgICAgICAgICAgIDwvQkJTRi1EYXRlVGltZVBpY2tlcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciBwdC03XCI+XHJcbiAgICAgICAgICA8YnV0dG9uIENsb3NlSW1wZXJzb25hdGlvbk1vZGFsIGlkPVwiQ2xvc2VJbXBlcnNvbmF0aW9uTW9kYWxcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IG1lLTMgYnRuLXNtXCJcclxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1vZGFsLmRpc21pc3MoKVwiPlxyXG4gICAgICAgICAgICB7e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJDYW5jZWxMYWJlbFwiKX19XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1zbVwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlNhdmVMYWJlbFwiKX19PC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZm9ybT5cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcbiAgPCEtLUVkaXQgTW9kYWwtLT5cclxuICA8bmctdGVtcGxhdGUgI0VkaXRJbXBlcnNvbmF0aW9uTW9kYWwgbGV0LW1vZGFsPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlciBwYi0wIGJvcmRlci0wIGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cImV4YW1wbGVNb2RhbExhYmVsXCI+PC9oNT5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWljb24gYnRuLWFjdGl2ZS1jb2xvci1wcmltYXJ5XCIgKGNsaWNrKT1cIm1vZGFsLmRpc21pc3MoKVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic3ZnLWljb24gc3ZnLWljb24tMVwiPlxyXG4gICAgICAgICAgPHNwYW4gW2lubGluZVNWR109XCInLi9zcmMvYXNzZXRzL2ltYWdlcy9hcnIwNjEuc3ZnJ1wiPjwvc3Bhbj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBzY3JvbGwteSBweC0xMCBweC1sZy0xNSBwdC0wIHBiLTE1XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0xMyB0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgIDxoMSBjbGFzcz1cIm1iLTNcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJFZGl0XCIpfX0ge3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiSW1wZXJzb25hdGlvblJ1bGVcIil9fTwvaDE+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cIkVkaXRJbXBlcnNvbmF0aW9uRm9ybVwiICAobmdTdWJtaXQpPVwiZWRpdEltcGVyc29uYXRpb24oKVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgPEJCU0YtRHJvcGRvd25MaXN0IFtvcHRpb25zXT1cIkVkaXRTb3VyY2VQYXJ0aWNpcGFudFR5cGVcIiAoT25DaGFuZ2UpPVwiRWRpdFNvdXJjZVBhcnRpY2lwYW50KCRldmVudClcIiBbZ3JvdXBdPVwiRWRpdEltcGVyc29uYXRpb25Gb3JtXCI+XHJcbiAgICAgICAgICAgIDwvQkJTRi1Ecm9wZG93bkxpc3Q+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgPEJCU0YtRHJvcGRvd25MaXN0IFtvcHRpb25zXT1cIkVkaXRTb3VyY2VQZXJtaXNzaW9uU2V0TGlzdFwiICpuZ0lmPVwiRWRpdFNob3dTb3VyY2VQZXJtaXNzaW9uTGlzdFwiIFtncm91cF09XCJFZGl0SW1wZXJzb25hdGlvbkZvcm1cIj5cclxuICAgICAgICAgICAgPC9CQlNGLURyb3Bkb3duTGlzdD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICA8QkJTRi1BdXRvY29tcGxldGVUZXh0Qm94IFtvcHRpb25zXT1cIkVkaXRTb3VyY2VVc2VyQXV0b0NvbXBsZXRlXCIgKm5nSWY9XCJFZGl0U2hvd1NvdXJjZVVzZXJBdXRvQ29tcGxldGVcIiBbZ3JvdXBdPVwiRWRpdEltcGVyc29uYXRpb25Gb3JtXCI+XHJcbiAgICAgICAgICAgIDwvQkJTRi1BdXRvY29tcGxldGVUZXh0Qm94PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICA8QkJTRi1Ecm9wZG93bkxpc3QgW29wdGlvbnNdPVwiRWRpdERlc3RpbmF0aW9uUGFydGljaXBhbnRUeXBlXCIgKE9uQ2hhbmdlKT1cIkVkaXREZXN0aW5hdGlvblBhcnRpY2lwYW50KCRldmVudClcIiBbZ3JvdXBdPVwiRWRpdEltcGVyc29uYXRpb25Gb3JtXCI+XHJcbiAgICAgICAgICAgIDwvQkJTRi1Ecm9wZG93bkxpc3Q+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgPEJCU0YtRHJvcGRvd25MaXN0IFtvcHRpb25zXT1cIkVkaXREZXN0aW5hdGlvblBlcm1pc3Npb25TZXRMaXN0XCIgKm5nSWY9XCJFZGl0U2hvd0Rlc3RpbmF0aW9uUGVybWlzc2lvbkxpc3RcIiBbZ3JvdXBdPVwiRWRpdEltcGVyc29uYXRpb25Gb3JtXCI+XHJcbiAgICAgICAgICAgIDwvQkJTRi1Ecm9wZG93bkxpc3Q+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgPEJCU0YtQXV0b2NvbXBsZXRlVGV4dEJveCBbb3B0aW9uc109XCJFZGl0RGVzdGluYXRpb25Vc2VyQXV0b0NvbXBsZXRlXCIgKm5nSWY9XCJFZGl0U2hvd0Rlc3RpbmF0aW9uVXNlckF1dG9Db21wbGV0ZVwiIFtncm91cF09XCJFZGl0SW1wZXJzb25hdGlvbkZvcm1cIj5cclxuICAgICAgICAgICAgPC9CQlNGLUF1dG9jb21wbGV0ZVRleHRCb3g+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgIDxCQlNGLUNoZWNrQm94IFtvcHRpb25zXT1cIkVkaXRJc0FjdGl2ZVwiIFtncm91cF09XCJFZGl0SW1wZXJzb25hdGlvbkZvcm1cIj5cclxuICAgICAgICAgICAgPC9CQlNGLUNoZWNrQm94PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgPEJCU0YtRGF0ZVRpbWVQaWNrZXIgW29wdGlvbnNdPVwiRWRpdEV4cGlyZXNBdFwiIFtncm91cF09XCJFZGl0SW1wZXJzb25hdGlvbkZvcm1cIj5cclxuXHJcbiAgICAgICAgICAgIDwvQkJTRi1EYXRlVGltZVBpY2tlcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciBwdC03XCI+XHJcbiAgICAgICAgICA8YnV0dG9uICAjQ2xvc2VFZGl0SW1wZXJzb25hdGlvbk1vZGFsIGlkPVwiQ2xvc2VFZGl0SW1wZXJzb25hdGlvbk1vZGFsXCIgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBidG4tc20gIG1lLTNcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIChjbGljayk9XCJtb2RhbC5kaXNtaXNzKClcIj5cclxuICAgICAgICAgICAge3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiQ2FuY2VsTGFiZWxcIil9fVxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc21cIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJTYXZlTGFiZWxcIil9fTwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Zvcm0+XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG4gIDwhLS1kZWxldGUgTW9kYWwtLT5cclxuICA8bmctdGVtcGxhdGUgI2RlbGV0ZUltcGVyc29uYXRpb25Nb2RhbCBsZXQtbW9kYWw+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyIHBiLTAgYm9yZGVyLTAganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgICA8aDUgY2xhc3M9XCJtb2RhbC10aXRsZVwiIGlkPVwiZXhhbXBsZU1vZGFsTGFiZWxcIj48L2g1PlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4taWNvbiBidG4tYWN0aXZlLWNvbG9yLXByaW1hcnlcIiAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygpXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzdmctaWNvbiBzdmctaWNvbi0xXCI+XHJcbiAgICAgICAgICA8c3BhbiBbaW5saW5lU1ZHXT1cIicuL3NyYy9hc3NldHMvaW1hZ2VzL2FycjA2MS5zdmcnXCI+PC9zcGFuPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IHNjcm9sbC15IHB4LTEwIHB4LWxnLTE1IHB0LTAgcGItMTVcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTEzIHRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgPGgxIGNsYXNzPVwibWItM1wiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkRlbGV0ZVwiKX19IHt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkltcGVyc29uYXRpb25SdWxlXCIpfX08L2gxPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm5vdGljZSBkLWZsZXggYmctbGlnaHQtZGFuZ2VyIHJvdW5kZWQgYm9yZGVyLWRhbmdlciBib3JkZXIgYm9yZGVyLWRhc2hlZCBtYi0xMCBwLTZcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInN2Zy1pY29uIHN2Zy1pY29uLTJ0eCBzdmctaWNvbi1kYW5nZXIgbWUtNFwiPlxyXG4gICAgICAgICAgPHNwYW4gW2lubGluZVNWR109XCInLi9zcmMvYXNzZXRzL2ltYWdlcy9nZW4wNDQuc3ZnJ1wiPjwvc3Bhbj5cclxuICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1zdGFjayBmbGV4LWdyb3ctMVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LWJvbGRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZzLTYgdGV4dC1ncmF5LTcwMFwiPlxyXG4gICAgICAgICAgICAgIHt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkRlbGV0ZV9RdWVzdGlvblwiKX19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgcHQtN1wiPlxyXG4gICAgICAgIDxidXR0b24gI0Nsb3NlRGVsZXRlSW1wZXJzb25hdGlvbk1vZGFsIGlkPVwiQ2xvc2VEZWxldGVJbXBlcnNvbmF0aW9uTW9kYWxcIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBidG4tc20gbWUtMyBcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIChjbGljayk9XCJtb2RhbC5kaXNtaXNzKClcIj5cclxuICAgICAgICAgIHt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkNhbmNlbExhYmVsXCIpfX1cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZGVsZXRlSW1wZXJzb25hdGlvbigpXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1saWdodC1kYW5nZXIgYnRuLXNtIFwiPlxyXG4gICAgICAgICAge3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiRGVsZXRlXCIpfX1cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG4iXX0=
454
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wZXJzb25hdGlvbi1ydWxlcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYnNmLWFkbWluLXBvcnRhbC9zcmMvbGliL1BhZ2VzL2ltcGVyc29uYXRpb24tcnVsZXMvaW1wZXJzb25hdGlvbi1ydWxlcy9pbXBlcnNvbmF0aW9uLXJ1bGVzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtYWRtaW4tcG9ydGFsL3NyYy9saWIvUGFnZXMvaW1wZXJzb25hdGlvbi1ydWxlcy9pbXBlcnNvbmF0aW9uLXJ1bGVzL2ltcGVyc29uYXRpb24tcnVsZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSx3QkFBd0IsRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbFQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0VBQW9FLENBQUM7QUFFNUcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBS3JGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7Ozs7Ozs7Ozs7OztBQU9yRSxNQUFNLE9BQU8sMkJBQTJCO0lBNkR0QyxZQUFvQixXQUF3QixFQUFVLGVBQWdDLEVBQVMsY0FBOEIsRUFDbkgs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QUEyQjtrQkFKdkMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUseUJBQXlCO29CQUNuQyxXQUFXLEVBQUUsc0NBQXNDO2lCQUNwRDttVUFjaUUsYUFBYTtzQkFBNUUsU0FBUzt1QkFBQyxnQ0FBZ0MsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBOENKLHdCQUF3QjtzQkFBakYsU0FBUzt1QkFBQywwQkFBMEIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgQXV0b2NvbXBsZXRlRFRPLCBBdXRvY29tcGxldGVPcHRpb25zLCBDaGVja0JveE9wdGlvbnMsIENvbmZpcm1hdGlvbk1vZGFsT3B0aW9ucywgRGF0ZVBpY2tlck9wdGlvbnMsIERyb3Bkb3duT3B0aW9ucywgRmlsdGVySXRlbSwgRmlsdGVyVHlwZSwgRm9yY2VEaXJlY3Rpb24sIEZvcm1PcHRpb25zLCBJbnB1dFR5cGUsIFBhZ2luZ0FjdGlvbk1vZGUsIFBhZ2luZ09wdGlvbnMsIFBpY2tlclR5cGUsIFNlbGVjdE1vZGUsIFN0YXJ0VmlldywgVGV4dEJveE9wdGlvbnMgfSBmcm9tICdAYm5zaWdodHMvYmJzZi1jb250cm9scyc7XHJcbmltcG9ydCB7IEltcGVyc29uYXRpb25SdWxlTW9kZWwgfSBmcm9tICcuLi8uLi9zaGFyZWQvbW9kZWxzL0ltcGVyc29uYXRpb25SdWxlTW9kZWxzL0ltcGVyc29uYXRpb25SdWxlTW9kZWwnO1xyXG5pbXBvcnQgeyBJbXBlcnNvbmF0aW9uUnVsZVNlcnZpY2UgfSBmcm9tICcuLy4uLy4uL3NoYXJlZC9TZXJ2aWNlcy9JbXBlcnNvbmF0aW9uUnVsZVNlcnZpY2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IFBhZ2VJbmZvU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL19tZXRyb25pYy9jb3JlL3NlcnZpY2VzL3BhZ2UtaW5mby5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTmdiTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XHJcbmltcG9ydCB7IEF1dGhTZXJ2aWNlLCBVdGlsaXR5U2VydmljZSwgQkJTRlRyYW5zbGF0ZVNlcnZpY2UsIEVudmlyb25tZW50U2VydmljZSwgUmVxdWVzdEhhbmRsZXJTZXJ2aWNlIH0gZnJvbSAnQGJuc2lnaHRzL2Jic2YtdXRpbGl0aWVzJztcclxuaW1wb3J0IHsgUGFnaW5nQ29tcG9uZW50IH0gZnJvbSAnQGJuc2lnaHRzL2Jic2YtY29udHJvbHMvbGliL2NvbnRyb2xzL1BhZ2luZy9QYWdpbmcuY29tcG9uZW50JztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBQYXJ0aWNpcGFudFR5cGUgfSBmcm9tICcuLi8uLi9zaGFyZWQvRW51bXMvUGFydGljaXBhbnRUeXBlJztcclxuaW1wb3J0IHsgQ29uZmlybWF0aW9uTW9kYWxDb21wb25lbnQgfSBmcm9tICdAYm5zaWdodHMvYmJzZi1jb250cm9scy9saWIvY29udHJvbHMvQ29uZmlybWF0aW9uTW9kYWwvQ29uZmlybWF0aW9uTW9kYWwuY29tcG9uZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWltcGVyc29uYXRpb24tcnVsZXMnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9pbXBlcnNvbmF0aW9uLXJ1bGVzLmNvbXBvbmVudC5odG1sJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgSW1wZXJzb25hdGlvblJ1bGVzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICAvL1BhZ2UgcmVxdWlyZW1lbnRzXHJcbiAgU2hvd1BhZ2VDb250ZW50OiBib29sZWFuID0gZmFsc2U7XHJcbiAgQXBpVXJsID0gXCIvYXBpL2FkbWluL0ltcGVyc29uYXRpb25SdWxlL1wiXHJcblxyXG4gIC8vRmlsdGVyIGFuZCBwYWdpbmcgY29tcG9uZW50c1xyXG4gIHNlYXJjaFRleHRCb3g6IFRleHRCb3hPcHRpb25zO1xyXG4gIFRleHRJbnB1dEZpbHRlcjogRmlsdGVySXRlbTtcclxuICBJbXBlcnNvbmF0aW9uRm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gIEltcGVyc29uYXRpb25QYWdpbmdSZXN1bHQ6IGFueVtdID0gW107XHJcbiAgY2xpZW50U2lkZVBhZ2luZ1Jlc3VsdDogYW55W10gPSBbXTtcclxuICBJbXBlcnNvbmF0aW9uUGFnaW5nOiBQYWdpbmdPcHRpb25zO1xyXG4gIElzRmlsdGVyTG9hZGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQFZpZXdDaGlsZCgnSW1wZXJzb25hdGlvblBhZ2luZ1ZpZXdFbGVtZW50JywgeyBzdGF0aWM6IGZhbHNlIH0pIHBhZ2luZ0VsZW1lbnQ6IFBhZ2luZ0NvbXBvbmVudDtcclxuXHJcbiAgLy9SZXF1aXJlZCBsaXN0c1xyXG4gIFBlcm1pc3Npb25TZXRMaXN0OiBhbnlbXSA9IFtdO1xyXG4gIFBhcnRpY2lwYW50VHlwZUxpc3Q6IGFueVtdID0gW107XHJcblxyXG4gIC8vQWRkIE1vZGVsIENvbnRyb2xzXHJcbiAgQWRkSW1wZXJzb25hdGlvbkZvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuICBBZGRJbXBlcnNvbmF0aW9uRm9ybU9wdGlvbnMgPSBuZXcgRm9ybU9wdGlvbnM7XHJcbiAgQWRkU291cmNlUGFydGljaXBhbnRUeXBlOiBEcm9wZG93bk9wdGlvbnM7XHJcbiAgQWRkRGVzdGluYXRpb25QYXJ0aWNpcGFudFR5cGU6IERyb3Bkb3duT3B0aW9ucztcclxuICBBZGRTb3VyY2VQZXJtaXNzaW9uU2V0TGlzdDogRHJvcGRvd25PcHRpb25zO1xyXG4gIEFkZERlc3RpbmF0aW9uUGVybWlzc2lvblNldExpc3Q6IERyb3Bkb3duT3B0aW9ucztcclxuICBBZGRTb3VyY2VVc2VyQXV0b0NvbXBsZXRlOiBBdXRvY29tcGxldGVPcHRpb25zO1xyXG4gIEFkZERlc3RpbmF0aW9uVXNlckF1dG9Db21wbGV0ZTogQXV0b2NvbXBsZXRlT3B0aW9ucztcclxuICBBZGRJc0FjdGl2ZTogQ2hlY2tCb3hPcHRpb25zO1xyXG4gIEFkZEV4cGlyZXNBdDogRGF0ZVBpY2tlck9wdGlvbnM7XHJcbiAgQWRkU2hvd1NvdXJjZVBlcm1pc3Npb25MaXN0OmJvb2xlYW49ZmFsc2U7XHJcbiAgQWRkU2hvd1NvdXJjZVVzZXJBdXRvQ29tcGxldGU6Ym9vbGVhbj1mYWxzZTtcclxuICBBZGRTaG93RGVzdGluYXRpb25QZXJtaXNzaW9uTGlzdDpib29sZWFuPWZhbHNlO1xyXG4gIEFkZFNob3dEZXN0aW5hdGlvblVzZXJBdXRvQ29tcGxldGU6Ym9vbGVhbj1mYWxzZTtcclxuXHJcblxyXG4gIC8vRWRpdCBNb2RlbCBDb250cm9sc1xyXG4gIEVkaXRJbXBlcnNvbmF0aW9uRm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gIEVkaXRJbXBlcnNvbmF0aW9uRm9ybU9wdGlvbnMgPSBuZXcgRm9ybU9wdGlvbnM7XHJcbiAgRWRpdFNvdXJjZVBhcnRpY2lwYW50VHlwZTogRHJvcGRvd25PcHRpb25zO1xyXG4gIEVkaXREZXN0aW5hdGlvblBhcnRpY2lwYW50VHlwZTogRHJvcGRvd25PcHRpb25zO1xyXG4gIEVkaXRTb3VyY2VQZXJtaXNzaW9uU2V0TGlzdDogRHJvcGRvd25PcHRpb25zO1xyXG4gIEVkaXREZXN0aW5hdGlvblBlcm1pc3Npb25TZXRMaXN0OiBEcm9wZG93bk9wdGlvbnM7XHJcbiAgRWRpdFNvdXJjZVVzZXJBdXRvQ29tcGxldGU6IEF1dG9jb21wbGV0ZU9wdGlvbnM7XHJcbiAgRWRpdERlc3RpbmF0aW9uVXNlckF1dG9Db21wbGV0ZTogQXV0b2NvbXBsZXRlT3B0aW9ucztcclxuICBFZGl0SXNBY3RpdmU6IENoZWNrQm94T3B0aW9ucztcclxuICBFZGl0RXhwaXJlc0F0OiBEYXRlUGlja2VyT3B0aW9ucztcclxuICBFZGl0U2hvd1NvdXJjZVBlcm1pc3Npb25MaXN0OmJvb2xlYW49ZmFsc2U7XHJcbiAgRWRpdFNob3dTb3VyY2VVc2VyQXV0b0NvbXBsZXRlOmJvb2xlYW49ZmFsc2U7XHJcbiAgRWRpdFNob3dEZXN0aW5hdGlvblBlcm1pc3Npb25MaXN0OmJvb2xlYW49ZmFsc2U7XHJcbiAgRWRpdFNob3dEZXN0aW5hdGlvblVzZXJBdXRvQ29tcGxldGU6Ym9vbGVhbj1mYWxzZTtcclxuICBJbXBlcnNvbmF0aW9uSWQ6IG51bWJlcjtcclxuICBTb3VyY2VQYXJ0aWNpcGFudElkOiBudW1iZXI7XHJcbiAgRGVzdGluYXRpb25QYXJ0aWNpcGFudElkOiBudW1iZXI7XHJcblxyXG4gIC8vZGVsZXRlICBNb2RlbCBDb250cm9sc1xyXG4gIGRlbGV0ZUltcGVyc29uYXRpb25SdWxlSWQ6IHN0cmluZztcclxuICBEZWxldGVDb25maXJtYXRpb25PcHRpb25zOiBDb25maXJtYXRpb25Nb2RhbE9wdGlvbnM7XHJcbiAgZGVsZXRlQ29udHJvbExvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBWaWV3Q2hpbGQoJ0NvbmZpcm1hdGlvbk1vZGFsQ29udHJvbCcsIHsgc3RhdGljOiBmYWxzZSB9KSBDb25maXJtYXRpb25Nb2RhbENvbnRyb2w6IENvbmZpcm1hdGlvbk1vZGFsQ29tcG9uZW50O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSwgcHJpdmF0ZSBwYWdlSW5mb1NlcnZpY2U6IFBhZ2VJbmZvU2VydmljZSwgcHVibGljIHV0aWxpdHlTZXJ2aWNlOiBVdGlsaXR5U2VydmljZSxcclxuICAgIHByaXZhdGUgYmJzZlRyYW5zbGF0ZVNlcnZpY2U6IEJCU0ZUcmFuc2xhdGVTZXJ2aWNlLCBwcml2YXRlIGVudmlyb25tZW50U2VydmljZTogRW52aXJvbm1lbnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBJbXBlcnNvbmF0aW9uUnVsZVNlcnZpY2U6IEltcGVyc29uYXRpb25SdWxlU2VydmljZSwgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE5nYk1vZGFsLCBwcml2YXRlIHJlcXVlc3RIYW5kbGVyU2VydmljZTogUmVxdWVzdEhhbmRsZXJTZXJ2aWNlKSB7XHJcbiAgfVxyXG5cclxuICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuU2hvd1BhZ2VDb250ZW50PXRydWU7XHJcbiAgICBQYWdlSW5mb1NlcnZpY2UuUGFnZVRpdGxlPXRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkltcGVyc29uYXRpb25SdWxlc1wiKVxyXG4gICAgUGFnZUluZm9TZXJ2aWNlLlBhZ2VCcmVhZGNydW1icz1bXHJcbiAgICAgICB7dGl0bGU6IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkhvbWVcIikgLCBwYXRoOiAnL0FkbWluL0hvbWUnLCBpc1NlcGFyYXRvcjogZmFsc2UsIGlzQWN0aXZlOiBmYWxzZX0sXHJcbiAgICAgICB7dGl0bGU6ICcnLCBwYXRoOiAnJywgaXNTZXBhcmF0b3I6IHRydWUsIGlzQWN0aXZlOiBmYWxzZX1cclxuXHJcbiAgICBdO1xyXG4gICAgdGhpcy5wYWdlSW5mb1NlcnZpY2UuY2FsY3VsYXRlVGl0bGUoKTtcclxuICAgIHRoaXMucGFnZUluZm9TZXJ2aWNlLmNhbGN1bGF0ZUJyZWFkY3J1bWJzKCk7XHJcbiAgICB0aGlzLmJic2ZUcmFuc2xhdGVTZXJ2aWNlLm9uTGFuZ0NoYW5nZS5zdWJzY3JpYmUoKGV2ZW50KT0+e1xyXG4gICAgICB0aGlzLm5nT25Jbml0KCk7XHJcbiAgICB9KVxyXG4gICAgdGhpcy5pbml0aWFsaXplUGFnZSgpO1xyXG4gIH1cclxuXHJcbiAgaW5pdGlhbGl6ZVBhZ2UoKSB7XHJcbiAgICAvLyBUZXh0Qm94IGluaXRcclxuICAgIHRoaXMuc2VhcmNoVGV4dEJveCA9IG5ldyBUZXh0Qm94T3B0aW9ucygpO1xyXG4gICAgdGhpcy5zZWFyY2hUZXh0Qm94Lk5hbWUgPSBcInNlYXJjaFRleHRCb3hcIlxyXG4gICAgdGhpcy5zZWFyY2hUZXh0Qm94LkhpZGVMYWJlbCA9IHRydWVcclxuICAgIHRoaXMuc2VhcmNoVGV4dEJveC5UeXBlID0gSW5wdXRUeXBlLlRleHRcclxuICAgIHRoaXMuc2VhcmNoVGV4dEJveC5QbGFjZWhvbGRlciA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlNlYXJjaEJ5TmFtZVwiKVxyXG5cclxuICAgIHRoaXMuVGV4dElucHV0RmlsdGVyID0gbmV3IEZpbHRlckl0ZW0oKTtcclxuICAgIHRoaXMuVGV4dElucHV0RmlsdGVyLkZvcm1Db250cm9sTmFtZSA9IFwic2VhcmNoVGV4dEJveFwiXHJcbiAgICB0aGlzLlRleHRJbnB1dEZpbHRlci5BY3Rpb25QYXJhbWV0ZXJOYW1lID0gXCJzZWFyY2hUZXh0XCJcclxuICAgIHRoaXMuVGV4dElucHV0RmlsdGVyLklzRm9ybUNvbnRyb2wgPSB0cnVlXHJcbiAgICB0aGlzLlRleHRJbnB1dEZpbHRlci5GaWx0ZXJUeXBlID0gRmlsdGVyVHlwZS5UZXh0Qm94XHJcblxyXG4gICAgdGhpcy5JbXBlcnNvbmF0aW9uUGFnaW5nID0gbmV3IFBhZ2luZ09wdGlvbnMoKTtcclxuICAgIHRoaXMuSW1wZXJzb25hdGlvblBhZ2luZy5BY3Rpb25Qb3N0VVJMID0gdGhpcy5BcGlVcmwgKyAnR2V0SW1wZXJzb25hdGlvblJ1bGVCeUZpbHRlcic7XHJcbiAgICB0aGlzLkltcGVyc29uYXRpb25QYWdpbmcuT25LZXlQcmVzc0ZpbHRlcnNDb250cm9sTmFtZXMgPSBbXCJzZWFyY2hUZXh0Qm94XCJdXHJcbiAgICB0aGlzLkltcGVyc29uYXRpb25QYWdpbmcuRmlsdGVycyA9IFt0aGlzLlRleHRJbnB1dEZpbHRlcl1cclxuICAgIHRoaXMuSW1wZXJzb25hdGlvblBhZ2luZy5WYWxpZGF0aW9uVG9rZW4gPSB0aGlzLmF1dGhTZXJ2aWNlLmF1dGhvcml6YXRpb25IZWFkZXJWYWx1ZSgpXHJcbiAgICB0aGlzLklzRmlsdGVyTG9hZGVkID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vUGFnaW5nIGZ1bmN0aW9uc1xyXG4gIHNldEltcGVyc29uYXRpb25MaXN0UmVzdWx0KHJlc3VsdCkge1xyXG4gICAgdGhpcy5JbXBlcnNvbmF0aW9uUGFnaW5nUmVzdWx0ID0gcmVzdWx0O1xyXG4gICAgdGhpcy5jbGllbnRTaWRlUGFnaW5nUmVzdWx0ID0gcmVzdWx0O1xyXG4gICAgdGhpcy5TaG93UGFnZUNvbnRlbnQgPSB0cnVlO1xyXG4gICAgdGhpcy51dGlsaXR5U2VydmljZS5zdG9wQmxvY2tVSSgpXHJcbiAgfVxyXG5cclxuICBzZWFyY2hDbGllbnRTaWRlKHNlYXJjaFZhbHVlKSB7XHJcbiAgICBpZiAoc2VhcmNoVmFsdWUpXHJcbiAgICAgIHRoaXMuY2xpZW50U2lkZVBhZ2luZ1Jlc3VsdCA9IHRoaXMuY2xpZW50U2lkZVBhZ2luZ1Jlc3VsdC5maWx0ZXIoXHJcbiAgICAgICAgZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgICAgIHZhciBzb3VyY2VQYXJ0aWNpcGFudE5hbWUgPSBpdGVtLnNvdXJjZVBhcnRpY2lwYW50RFRPLnBhcnRpY2lwYW50TmFtZTtcclxuICAgICAgICAgIHZhciBkZXN0aW5hdGlvblBhcnRpY2lwYW50TmFtZSA9IGl0ZW0uZGVzdGluYXRpb25QYXJ0aWNpcGFudERUTy5wYXJ0aWNpcGFudE5hbWU7XHJcbiAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICBzb3VyY2VQYXJ0aWNpcGFudE5hbWUuZW5nbGlzaC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFZhbHVlLnRvTG93ZXJDYXNlKCkpXHJcbiAgICAgICAgICAgIHx8IHNvdXJjZVBhcnRpY2lwYW50TmFtZS5hcmFiaWMudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hWYWx1ZS50b0xvd2VyQ2FzZSgpKVxyXG4gICAgICAgICAgICB8fCBkZXN0aW5hdGlvblBhcnRpY2lwYW50TmFtZS5hcmFiaWMudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hWYWx1ZS50b0xvd2VyQ2FzZSgpKVxyXG4gICAgICAgICAgICB8fCBkZXN0aW5hdGlvblBhcnRpY2lwYW50TmFtZS5hcmFiaWMudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2hWYWx1ZS50b0xvd2VyQ2FzZSgpKSk7XHJcbiAgICAgICAgfSlcclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5jbGllbnRTaWRlUGFnaW5nUmVzdWx0ID0gdGhpcy5JbXBlcnNvbmF0aW9uUGFnaW5nUmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy9BZGQgaW1wZXJzb25hdGlvbiBydWxlIGZ1bmN0aW9uc1xyXG4gIHNob3dBZGRJbXBlcnNvbmF0aW9uTW9kYWwoQWRkSW1wZXJzb25hdGlvbk1vZGFsKSB7XHJcbiAgICB0aGlzLnV0aWxpdHlTZXJ2aWNlLnN0YXJ0QmxvY2tVSSgpO1xyXG5cclxuICAgIHRoaXMuSW1wZXJzb25hdGlvblJ1bGVTZXJ2aWNlLmxvYWRBZGREcm9wZG93bnMoKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xyXG4gICAgICBsZXQgRHJvcGRvd25MaXN0cyA9IHJlc3VsdCBhcyBhbnk7XHJcbiAgICAgIHRoaXMuUGVybWlzc2lvblNldExpc3QgPSBEcm9wZG93bkxpc3RzLnBlcm1pc3Npb25MaXN0O1xyXG4gICAgICB0aGlzLlBhcnRpY2lwYW50VHlwZUxpc3QgPSBEcm9wZG93bkxpc3RzLnBhcnRpY2lwYW50VHlwZUxpc3Q7XHJcbiAgICAgIHRoaXMuQWRkSW1wZXJzb25hdGlvbkZvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KVxyXG5cclxuICAgICAgdGhpcy5BZGRJbXBlcnNvbmF0aW9uRm9ybU9wdGlvbnMgPSBuZXcgRm9ybU9wdGlvbnMoKTtcclxuICAgICAgdGhpcy5BZGRJbXBlcnNvbmF0aW9uRm9ybU9wdGlvbnMuRm9ybUdyb3VwID0gdGhpcy5BZGRJbXBlcnNvbmF0aW9uRm9ybVxyXG4gICAgICB0aGlzLkFkZEltcGVyc29uYXRpb25Gb3JtT3B0aW9ucy5HZXRNb2RlbEZ1bmN0aW9uID0gdGhpcy5nZXRBZGRJbXBlcnNvbmF0aW9uUnVsZU1vZGVsO1xyXG4gICAgICB0aGlzLkFkZEltcGVyc29uYXRpb25Gb3JtT3B0aW9ucy5TZXJ2aWNlU3VibWl0RnVuY3Rpb24gPSB0aGlzLmdldEFkZEltcGVyc29uYXRpb25SdWxlRnVuY3Rpb247XHJcbiAgICAgIHRoaXMuQWRkSW1wZXJzb25hdGlvbkZvcm1PcHRpb25zLlBhZ2luZ1JlZmVyZW5jZSA9IHRoaXMucGFnaW5nRWxlbWVudFxyXG5cclxuICAgICAgdGhpcy5BZGRTaG93RGVzdGluYXRpb25QZXJtaXNzaW9uTGlzdCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLkFkZFNob3dEZXN0aW5hdGlvblVzZXJBdXRvQ29tcGxldGUgPSBmYWxzZTtcclxuICAgICAgdGhpcy5BZGRTaG93U291cmNlUGVybWlzc2lvbkxpc3QgPSBmYWxzZVxyXG4gICAgICB0aGlzLkFkZFNob3dTb3VyY2VVc2VyQXV0b0NvbXBsZXRlID0gZmFsc2VcclxuXHJcbiAgICAgIHRoaXMuQWRkU291cmNlUGFydGljaXBhbnRUeXBlID0gbmV3IERyb3Bkb3duT3B0aW9ucygpO1xyXG4gICAgICB0aGlzLkFkZFNvdXJjZVBhcnRpY2lwYW50VHlwZS5OYW1lID0gXCJBZGRTb3VyY2VQYXJ0aWNpcGFudFR5cGVcIlxyXG4gICAgICB0aGlzLkFkZFNvdXJjZVBhcnRpY2lwYW50VHlwZS5MYWJlbEtleSA9IFwiU291cmNlUGFydGljaXBhbnRUeXBlXCJcclxuICAgICAgdGhpcy5BZGRTb3VyY2VQYXJ0aWNpcGFudFR5cGUuU2VsZWN0ZWRJdGVtcyA9IG51bGw7XHJcbiAgICAgIHRoaXMuQWRkU291cmNlUGFydGljaXBhbnRUeXBlLkRhdGFTb3VyY2UgPSB0aGlzLlBhcnRpY2lwYW50VHlwZUxpc3RcclxuICAgICAgdGhpcy5BZGRTb3VyY2VQYXJ0aWNpcGFudFR5cGUuU2luZ2xlU2VsZWN0aW9uID0gdHJ1ZTtcclxuICAgICAgdGhpcy5BZGRTb3VyY2VQYXJ0aWNpcGFudFR5cGUuQWxsb3dTZWFyY2hGaWx0ZXIgPSB0cnVlO1xyXG4gICAgICB0aGlzLkFkZFNvdXJjZVBhcnRpY2lwYW50VHlwZS5Jc1JlcXVpcmVkID0gdHJ1ZTtcclxuXHJcbiAgICAgIHRoaXMuQWRkRGVzdGluYXRpb25QYXJ0aWNpcGFudFR5cGUgPSBuZXcgRHJvcGRvd25PcHRpb25zKCk7XHJcbiAgICAgIHRoaXMuQWRkRGVzdGluYXRpb25QYXJ0aWNpcGFudFR5cGUuTmFtZSA9IFwiQWRkRGVzdGluYXRpb25QYXJ0aWNpcGFudFR5cGVcIlxyXG4gICAgICB0aGlzLkFkZERlc3RpbmF0aW9uUGFydGljaXBhbnRUeXBlLkxhYmVsS2V5ID0gXCJEZXN0aW5hdGlvblBhcnRpY2lwYW50VHlwZVwiXHJcbiAgICAgIHRoaXMuQWRkRGVzdGluYXRpb25QYXJ0aWNpcGFudFR5cGUuU2VsZWN0ZWRJdGVtcyA9IG51bGw7XHJcbiAgICAgIHRoaXMuQWRkRGVzdGluYXRpb25QYXJ0aWNpcGFudFR5cGUuRGF0YVNvdXJjZSA9IHRoaXMuUGFydGljaXBhbnRUeXBlTGlzdFxyXG4gICAgICB0aGlzLkFkZERlc3RpbmF0aW9uUGFydGljaXBhbnRUeXBlLlNpbmdsZVNlbGVjdGlvbiA9IHRydWU7XHJcbiAgICAgIHRoaXMuQWRkRGVzdGluYXRpb25QYXJ0aWNpcGFudFR5cGUuQWxsb3dTZWFyY2hGaWx0ZXIgPSB0cnVlO1xyXG4gICAgICB0aGlzLkFkZERlc3RpbmF0aW9uUGFydGljaXBhbnRUeXBlLklzUmVxdWlyZWQgPSB0cnVlO1xyXG5cclxuICAgICAgdGhpcy5BZGRTb3VyY2VQZXJtaXNzaW9uU2V0TGlzdCA9IG5ldyBEcm9wZG93bk9wdGlvbnMoKTtcclxuICAgICAgdGhpcy5BZGRTb3VyY2VQZXJtaXNzaW9uU2V0TGlzdC5OYW1lID0gXCJBZGRTb3VyY2VQZXJtaXNzaW9uU2V0TGlzdFwiXHJcbiAgICAgIHRoaXMuQWRkU291cmNlUGVybWlzc2lvblNldExpc3QuTGFiZWxLZXkgPSBcIlNvdXJjZVBlcm1pc3Npb25TZXRMaXN0XCJcclxuICAgICAgdGhpcy5BZGRTb3VyY2VQZXJtaXNzaW9uU2V0TGlzdC5TZWxlY3RlZEl0ZW1zID0gbnVsbDtcclxuICAgICAgdGhpcy5BZGRTb3VyY2VQZXJtaXNzaW9uU2V0TGlzdC5EYXRhU291cmNlID0gdGhpcy5QZXJtaXNzaW9uU2V0TGlzdFxyXG4gICAgICB0aGlzLkFkZFNvdXJjZVBlcm1pc3Npb25TZXRMaXN0LlNpbmdsZVNlbGVjdGlvbiA9IHRydWU7XHJcbiAgICAgIHRoaXMuQWRkU291cmNlUGVybWlzc2lvblNldExpc3QuQWxsb3dTZWFyY2hGaWx0ZXIgPSB0cnVlO1xyXG4gICAgICB0aGlzLkFkZFNvdXJjZVBlcm1pc3Npb25TZXRMaXN0LklzUmVxdWlyZWQgPSB0cnVlO1xyXG5cclxuICAgICAgdGhpcy5BZGREZXN0aW5hdGlvblBlcm1pc3Npb25TZXRMaXN0ID0gbmV3IERyb3Bkb3duT3B0aW9ucygpO1xyXG4gICAgICB0aGlzLkFkZERlc3RpbmF0aW9uUGVybWlzc2lvblNldExpc3QuTmFtZSA9IFwiQWRkRGVzdGluYXRpb25QZXJtaXNzaW9uU2V0TGlzdFwiXHJcbiAgICAgIHRoaXMuQWRkRGVzdGluYXRpb25QZXJtaXNzaW9uU2V0TGlzdC5MYWJlbFZhbHVlID0gXCJEZXN0aW5hdGlvblBlcm1pc3Npb25TZXRMaXN0XCJcclxuICAgICAgdGhpcy5BZGREZXN0aW5hdGlvblBlcm1pc3Npb25TZXRMaXN0LkxhYmVsS2V5ID0gXCJEZXN0aW5hdGlvblBlcm1pc3Npb25TZXRMaXN0XCJcclxuICAgICAgdGhpcy5BZGREZXN0aW5hdGlvblBlcm1pc3Npb25TZXRMaXN0LlNlbGVjdGVkSXRlbXMgPSBudWxsO1xyXG4gICAgICB0aGlzLkFkZERlc3RpbmF0aW9uUGVybWlzc2lvblNldExpc3QuRGF0YVNvdXJjZSA9IHRoaXMuUGVybWlzc2lvblNldExpc3RcclxuICAgICAgdGhpcy5BZGREZXN0aW5hdGlvblBlcm1pc3Npb25TZXRMaXN0LlNpbmdsZVNlbGVjdGlvbiA9IHRydWU7XHJcbiAgICAgIHRoaXMuQWRkRGVzdGluYXRpb25QZXJtaXNzaW9uU2V0TGlzdC5BbGxvd1NlYXJjaEZpbHRlciA9IHRydWU7XHJcbiAgICAgIHRoaXMuQWRkRGVzdGluYXRpb25QZXJtaXNzaW9uU2V0TGlzdC5Jc1JlcXVpcmVkID0gdHJ1ZTtcclxuXHJcbiAgICAgIHRoaXMuQWRkU291cmNlVXNlckF1dG9Db21wbGV0ZSA9IG5ldyBBdXRvY29tcGxldGVPcHRpb25zKCk7XHJcbiAgICAgIHRoaXMuQWRkU291cmNlVXNlckF1dG9Db21wbGV0ZS5OYW1lID0gXCJBZGRTb3VyY2VVc2VyQXV0b0NvbXBsZXRlXCI7XHJcbiAgICAgIHRoaXMuQWRkU291cmNlVXNlckF1dG9Db21wbGV0ZS5MYWJlbEtleSA9IFwiVXNlclwiO1xyXG4gICAgICB0aGlzLkFkZFNvdXJjZVVzZXJBdXRvQ29tcGxldGUuVHlwZSA9IElucHV0VHlwZS5UZXh0O1xyXG4gICAgICB0aGlzLkFkZFNvdXJjZVVzZXJBdXRvQ29tcGxldGUuSXNSZXF1aXJlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuQWRkU291cmNlVXNlckF1dG9Db21wbGV0ZS5WYWx1ZSA9IG51bGw7XHJcbiAgICAgIHRoaXMuQWRkU291cmNlVXNlckF1dG9Db21wbGV0ZS5Gb3JjZURpcmVjdGlvbiA9IEZvcmNlRGlyZWN0aW9uLkVuZ2xpc2g7XHJcbiAgICAgIHRoaXMuQWRkU291cmNlVXNlckF1dG9Db21wbGV0ZS5BY3Rpb25VUkwgPSB0aGlzLmVudmlyb25tZW50U2VydmljZS5nZXRBcGlVcmwoKSArIHRoaXMuQXBpVXJsICsgXCJBdXRvQ29tcGxldGVVc2VyXCJcclxuICAgICAgdGhpcy5BZGRTb3VyY2VVc2VyQXV0b0NvbXBsZXRlLlZhbGlkYXRpb25Ub2tlbiA9IHRoaXMuYXV0aFNlcnZpY2UuYXV0aG9yaXphdGlvbkhlYWRlclZhbHVlKClcclxuXHJcbiAgICAgIHRoaXMuQWRkRGVzdGluYXRpb25Vc2VyQXV0b0NvbXBsZXRlID0gbmV3IEF1dG9jb21wbGV0ZU9wdGlvbnMoKTtcclxuICAgICAgdGhpcy5BZGREZXN0aW5hdGlvblVzZXJBdXRvQ29tcGxldGUuTmFtZSA9IFwiQWRkRGVzdGluYXRpb25Vc2VyQXV0b0NvbXBsZXRlXCI7XHJcbiAgICAgIHRoaXMuQWRkRGVzdGluYXRpb25Vc2VyQXV0b0NvbXBsZXRlLkxhYmVsS2V5ID0gXCJVc2VyXCI7XHJcbiAgICAgIHRoaXMuQWRkRGVzdGluYXRpb25Vc2VyQXV0b0NvbXBsZXRlLlR5cGUgPSBJbnB1dFR5cGUuVGV4dDtcclxuICAgICAgdGhpcy5BZGREZXN0aW5hdGlvblVzZXJBdXRvQ29tcGxldGUuSXNSZXF1aXJlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuQWRkRGVzdGluYXRpb25Vc2VyQXV0b0NvbXBsZXRlLlZhbHVlID0gbnVsbDtcclxuICAgICAgdGhpcy5BZGREZXN0aW5hdGlvblVzZXJBdXRvQ29tcGxldGUuQWN0aW9uVVJMID0gdGhpcy5lbnZpcm9ubWVudFNlcnZpY2UuZ2V0QXBpVXJsKCkgKyB0aGlzLkFwaVVybCArIFwiQXV0b0NvbXBsZXRlVXNlclwiXHJcbiAgICAgIHRoaXMuQWRkRGVzdGluYXRpb25Vc2VyQXV0b0NvbXBsZXRlLlZhbGlkYXRpb25Ub2tlbiA9IHRoaXMuYXV0aFNlcnZpY2UuYXV0aG9yaXphdGlvbkhlYWRlclZhbHVlKClcclxuXHJcbiAgICAgIHRoaXMuQWRkSXNBY3RpdmUgPSBuZXcgQ2hlY2tCb3hPcHRpb25zKCk7XHJcbiAgICAgIHRoaXMuQWRkSXNBY3RpdmUuTmFtZSA9IFwiQWRkSXNBY3RpdmVcIlxyXG4gICAgICB0aGlzLkFkZElzQWN0aXZlLkxhYmVsS2V5ID0gXCJBY3RpdmVcIlxyXG4gICAgICB0aGlzLkFkZElzQWN0aXZlLklzRGlzYWJsZWQgPSB0cnVlXHJcbiAgICAgIHRoaXMuQWRkSXNBY3RpdmUuVmFsdWUgPSB0cnVlXHJcblxyXG4gICAgICB0aGlzLkFkZEV4cGlyZXNBdCA9IG5ldyBEYXRlUGlja2VyT3B0aW9ucygpO1xyXG4gICAgICB0aGlzLkFkZEV4cGlyZXNBdC5OYW1lID0gXCJBZGRFeHBpcmVzQXRcIlxyXG4gICAgICB0aGlzLkFkZEV4cGlyZXNBdC5MYWJlbEtleSA9IFwiRXhwaXJlc0F0XCJcclxuICAgICAgdGhpcy5BZGRFeHBpcmVzQXQuSXNSZXF1aXJlZCA9IHRydWVcclxuICAgICAgdGhpcy5BZGRFeHBpcmVzQXQuU3RhcnRWaWV3ID0gU3RhcnRWaWV3Lk1vbnRoXHJcbiAgICAgIHRoaXMuQWRkRXhwaXJlc0F0LlBpY2tlclR5cGUgPSBQaWNrZXJUeXBlLkNhbGVuZGFyXHJcbiAgICAgIHRoaXMuQWRkRXhwaXJlc0F0LlNlbGVjdE1vZGUgPSBTZWxlY3RNb2RlLlNpbmdsZVxyXG5cclxuICAgICAgdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihBZGRJbXBlcnNvbmF0aW9uTW9kYWwpO1xyXG4gICAgICB0aGlzLnV0aWxpdHlTZXJ2aWNlLnN0b3BCbG9ja1VJKCk7XHJcbiAgICB9KTtcclxuXHJcblxyXG4gIH1cclxuICBnZXRBZGRJbXBlcnNvbmF0aW9uUnVsZU1vZGVsID0gKCkgPT4ge1xyXG4gICAgbGV0IHBhcmFtQXJyYXk6IGFueVtdID0gW107XHJcbiAgICBsZXQgUmVzdWx0TW9kZWwgPSB0aGlzLkFkZEltcGVyc29uYXRpb25Gb3JtLnZhbHVlO1xyXG5cclxuICAgIGxldCBBZGRNb2RlbDogSW1wZXJzb25hdGlvblJ1bGVNb2RlbCA9IG5ldyBJbXBlcnNvbmF0aW9uUnVsZU1vZGVsKCk7XHJcbiAgICBBZGRNb2RlbC5Tb3VyY2VQYXJ0aWNpcGFudERUTy5QYXJ0aWNpcGFudFR5cGVJdGVtSUQgPSBOdW1iZXIoUmVzdWx0TW9kZWwuQWRkU291cmNlUGFydGljaXBhbnRUeXBlKVxyXG4gICAgQWRkTW9kZWwuRGVzdGluYXRpb25QYXJ0aWNpcGFudERUTy5QYXJ0aWNpcGFudFR5cGVJdGVtSUQgPSBOdW1iZXIoUmVzdWx0TW9kZWwuQWRkRGVzdGluYXRpb25QYXJ0aWNpcGFudFR5cGUpXHJcbiAgICBBZGRNb2RlbC5FeHBpcmVzQXQgPSBSZXN1bHRNb2RlbC5BZGRFeHBpcmVzQXRcclxuICAgIEFkZE1vZGVsLklzQWN0aXZlID0gUmVzdWx0TW9kZWwuQWRkSXNBY3RpdmVcclxuICAgIGlmIChSZXN1bHRNb2RlbC5BZGREZXN0aW5hdGlvblVzZXJBdXRvQ29tcGxldGUgIT0gbnVsbCAmJiBSZXN1bHRNb2RlbC5BZGREZXN0aW5hdGlvblVzZXJBdXRvQ29tcGxldGUgIT0gdW5kZWZpbmVkKVxyXG4gICAgICBBZGRNb2RlbC5EZXN0aW5hdGlvblBhcnRpY2lwYW50RFRPLlVzZXJJRCA9IE51bWJlcihSZXN1bHRNb2RlbC5BZGREZXN0aW5hdGlvblVzZXJBdXRvQ29tcGxldGUua2V5KVxyXG4gICAgZWxzZVxyXG4gICAgICBBZGRNb2RlbC5EZXN0aW5hdGlvblBhcnRpY2lwYW50RFRPLlBlcm1pc3Npb25TZXRJRCA9IE51bWJlcihSZXN1bHRNb2RlbC5BZGREZXN0aW5hdGlvblBlcm1pc3Npb25TZXRMaXN0KVxyXG4gICAgaWYgKFJlc3VsdE1vZGVsLkFkZFNvdXJjZVVzZXJBdXRvQ29tcGxldGUgIT0gbnVsbCAmJiBSZXN1bHRNb2RlbC5BZGRTb3VyY2VVc2VyQXV0b0NvbXBsZXRlICE9IHVuZGVmaW5lZClcclxuICAgICAgQWRkTW9kZWwuU291cmNlUGFydGljaXBhbnREVE8uVXNlcklEID0gTnVtYmVyKFJlc3VsdE1vZGVsLkFkZFNvdXJjZVVzZXJBdXRvQ29tcGxldGUua2V5KVxyXG4gICAgZWxzZVxyXG4gICAgICBBZGRNb2RlbC5Tb3VyY2VQYXJ0aWNpcGFudERUTy5QZXJtaXNzaW9uU2V0SUQgPSBOdW1iZXIoUmVzdWx0TW9kZWwuQWRkU291cmNlUGVybWlzc2lvblNldExpc3QpXHJcbiAgICBwYXJhbUFycmF5LnB1c2goQWRkTW9kZWwpO1xyXG4gICAgcmV0dXJuIHBhcmFtQXJyYXk7XHJcbiAgfVxyXG5cclxuICBnZXRBZGRJbXBlcnNvbmF0aW9uUnVsZUZ1bmN0aW9uID0gKEFkZE1vZGVsKTogT2JzZXJ2YWJsZTxhbnk+ID0+IHtcclxuICAgIHJldHVybiB0aGlzLkltcGVyc29uYXRpb25SdWxlU2VydmljZS5hZGRJbXBlcnNvbmF0aW9uUnVsZShBZGRNb2RlbClcclxuICB9XHJcblxyXG5cclxuICBhZGREZXN0aW5hdGlvblBhcnRpY2lwYW50T25DaGFuZ2Uoa2V5KSB7XHJcbiAgICBsZXQgc291cmNlSXRlbSA9IHRoaXMuUGFydGljaXBhbnRUeXBlTGlzdC5maWx0ZXIoKGl0ZW0pID0+IHsgcmV0dXJuIHBhcnNlSW50KGl0ZW0ua2V5KSA9PSBrZXk7IH0pLm1hcCgoaXRlbSkgPT4gaXRlbSlbMF07XHJcbiAgICAvL2NvbnNvbGUubG9nKHNvdXJjZUl0ZW0pXHJcblxyXG4gICAgc3dpdGNoIChzb3VyY2VJdGVtLnZhbHVlKSB7XHJcbiAgICAgIGNhc2UgXCJQZXJtaXNzaW9uU2V0XCI6XHJcbiAgICAgICAgdGhpcy5BZGRTaG93RGVzdGluYXRpb25QZXJtaXNzaW9uTGlzdCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5BZGRTaG93RGVzdGluYXRpb25Vc2VyQXV0b0NvbXBsZXRlID0gZmFsc2U7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJVc2VyXCI6XHJcbiAgICAgICAgdGhpcy5BZGRTaG93RGVzdGluYXRpb25QZXJtaXNzaW9uTGlzdCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuQWRkU2hvd0Rlc3RpbmF0aW9uVXNlckF1dG9Db21wbGV0ZSA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIGFkZFNvdXJjZVBhcnRpY2lwYW50T25DaGFuZ2Uoa2V5KSB7XHJcbiAgICBsZXQgc291cmNlSXRlbSA9IHRoaXMuUGFydGljaXBhbnRUeXBlTGlzdC5maWx0ZXIoKGl0ZW0pID0+IHsgcmV0dXJuIHBhcnNlSW50KGl0ZW0ua2V5KSA9PSBrZXk7IH0pLm1hcCgoaXRlbSkgPT4gaXRlbSlbMF07XHJcbiAgICAvL2NvbnNvbGUubG9nKHNvdXJjZUl0ZW0pXHJcblxyXG4gICAgc3dpdGNoIChzb3VyY2VJdGVtLnZhbHVlKSB7XHJcbiAgICAgIGNhc2UgXCJQZXJtaXNzaW9uU2V0XCI6XHJcbiAgICAgICAgdGhpcy5BZGRTaG93U291cmNlUGVybWlzc2lvbkxpc3QgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuQWRkU2hvd1NvdXJjZVVzZXJBdXRvQ29tcGxldGUgPSBmYWxzZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcIlVzZXJcIjpcclxuICAgICAgICB0aGlzLkFkZFNob3dTb3VyY2VQZXJtaXNzaW9uTGlzdCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuQWRkU2hvd1NvdXJjZVVzZXJBdXRvQ29tcGxldGUgPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vRWRpdCBpbXBlcnNvbmF0aW9uIHJ1bGUgZnVuY3Rpb25zXHJcbiAgc2hvd0VkaXRJbXBlcnNvbmF0aW9uTW9kYWwoaW1wZXJzb25hdGlvbklEOiBudW1iZXIsIGltcGVyc29uYXRpb25JREVuYzogc3RyaW5nLCBlZGl0SW1wZXJzb25hdGlvbk1vZGFsKSB7XHJcbiAgICB0aGlzLkltcGVyc29uYXRpb25JZCA9IGltcGVyc29uYXRpb25JRDtcclxuXHJcbiAgICB0aGlzLkltcGVyc29uYXRpb25SdWxlU2VydmljZS5nZXRFZGl0SW1wZXJzb25hdGlvblJ1bGUoaW1wZXJzb25hdGlvbklERW5jKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xyXG4gICAgICBsZXQgcmVzdWx0T2JqID0gcmVzdWx0IGFzIGFueTtcclxuICAgICAgbGV0IGltcGVyc29uYXRpb24gPSByZXN1bHRPYmoubW9kZWw7XHJcbiAgICAgIGxldCBsaXN0cyA9IHJlc3VsdE9iai5saXN0cztcclxuICAgICAgdGhpcy5QZXJtaXNzaW9uU2V0TGlzdCA9IGxpc3RzLnBlcm1pc3Npb25MaXN0O1xyXG4gICAgICB0aGlzLlBhcnRpY2lwYW50VHlwZUxpc3QgPSBsaXN0cy5wYXJ0aWNpcGFudFR5cGVMaXN0O1xyXG5cclxuICAgICAgdGhpcy5FZGl0SW1wZXJzb25hdGlvbkZvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KVxyXG5cclxuICAgICAgdGhpcy5FZGl0SW1wZXJzb25hdGlvbkZvcm1PcHRpb25zID0gbmV3IEZvcm1PcHRpb25zKCk7XHJcbiAgICAgIHRoaXMuRWRpdEltcGVyc29uYXRpb25Gb3JtT3B0aW9ucy5Gb3JtR3JvdXAgPSB0aGlzLkVkaXRJbXBlcnNvbmF0aW9uRm9ybVxyXG4gICAgICB0aGlzLkVkaXRJbXBlcnNvbmF0aW9uRm9ybU9wdGlvbnMuR2V0TW9kZWxGdW5jdGlvbiA9IHRoaXMuZ2V0RWRpdEltcGVyc29uYXRpb25SdWxlTW9kZWw7XHJcbiAgICAgIHRoaXMuRWRpdEltcGVyc29uYXRpb25Gb3JtT3B0aW9ucy5TZXJ2aWNlU3VibWl0RnVuY3Rpb24gPSB0aGlzLmdldEVkaXRJbXBlcnNvbmF0aW9uUnVsZUZ1bmN0aW9uO1xyXG4gICAgICB0aGlzLkVkaXRJbXBlcnNvbmF0aW9uRm9ybU9wdGlvbnMuUGFnaW5nUmVmZXJlbmNlID0gdGhpcy5wYWdpbmdFbGVtZW50XHJcbiAgICAgIHRoaXMuRWRpdEltcGVyc29uYXRpb25Gb3JtT3B0aW9ucy5QYWdpbmdBY3Rpb25Nb2RlID0gUGFnaW5nQWN0aW9uTW9kZS5VcGRhdGVcclxuXHJcbiAgICAgIHRoaXMuRWRpdFNob3dEZXN0aW5hdGlvblBlcm1pc3Npb25MaXN0ID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuRWRpdFNob3dEZXN0aW5hdGlvblVzZXJBdXRvQ29tcGxldGUgPSBmYWxzZTtcclxuICAgICAgdGhpcy5FZGl0U2hvd1NvdXJjZVBlcm1pc3Npb25MaXN0ID0gZmFsc2VcclxuICAgICAgdGhpcy5FZGl0U2hvd1NvdXJjZVVzZXJBdXRvQ29tcGxldGUgPSBmYWxzZVxyXG5cclxuICAgICAgaWYgKGltcGVyc29uYXRpb24uc291cmNlUGFydGljaXBhbnREVE8ucGFydGljaXBhbnRUeXBlSXRlbUlEICE9IG51bGwgJiYgaW1wZXJzb25hdGlvbi5kZXN0aW5hdGlvblBhcnRpY2lwYW50RFRPLnBhcnRpY2lwYW50VHlwZUl0ZW1JRCkge1xyXG4gICAgICAgIHRoaXMuZWRpdERlc3RpbmF0aW9uUGFydGljaXBhbnRPbkNoYW5nZShpbXBlcnNvbmF0aW9uLmRlc3RpbmF0aW9uUGFydGljaXBhbnREVE8ucGFydGljaXBhbnRUeXBlSXRlbUlEKTtcclxuICAgICAgICB0aGlzLmVkaXRTb3VyY2VQYXJ0aWNpcGFudE9uQ2hhbmdlKGltcGVyc29uYXRpb24uc291cmNlUGFydGljaXBhbnREVE8ucGFydGljaXBhbnRUeXBlSXRlbUlEKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy51dGlsaXR5U2VydmljZS5zdGFydEJsb2NrVUkoKTtcclxuXHJcbiAgICAgIHRoaXMuU291cmNlUGFydGljaXBhbnRJZCA9IGltcGVyc29uYXRpb24uc291cmNlUGFydGljaXBhbnREVE8uaWQ7XHJcbiAgICAgIHRoaXMuRGVzdGluYXRpb25QYXJ0aWNpcGFudElkID0gaW1wZXJzb25hdGlvbi5kZXN0aW5hdGlvblBhcnRpY2lwYW50RFRPLmlkO1xyXG4gICAgICB0aGlzLkVkaXRTb3VyY2VQYXJ0aWNpcGFudFR5cGUgPSBuZXcgRHJvcGRvd25PcHRpb25zKCk7XHJcbiAgICAgIHRoaXMuRWRpdFNvdXJjZVBhcnRpY2lwYW50VHlwZS5OYW1lID0gXCJFZGl0U291cmNlUGFydGljaXBhbnRUeXBlXCJcclxuICAgICAgdGhpcy5FZGl0U291cmNlUGFydGljaXBhbnRUeXBlLkxhYmVsS2V5ID0gXCJTb3VyY2VQYXJ0aWNpcGFudFR5cGVcIlxyXG4gICAgICB0aGlzLkVkaXRTb3VyY2VQYXJ0aWNpcGFudFR5cGUuU2VsZWN0ZWRJdGVtcyA9IHRoaXMuUGFydGljaXBhbnRUeXBlTGlzdC5maWx0ZXIoKGl0ZW0pID0+IHsgcmV0dXJuIHBhcnNlSW50KGl0ZW0ua2V5KSA9PSBpbXBlcnNvbmF0aW9uLnNvdXJjZVBhcnRpY2lwYW50RFRPLnBhcnRpY2lwYW50VHlwZUl0ZW1JRDsgfSkubWFwKChpdGVtKSA9PiBpdGVtLmtleSlbMF07XHJcbiAgICAgIHRoaXMuRWRpdFNvdXJjZVBhcnRpY2lwYW50VHlwZS5EYXRhU291cmNlID0gdGhpcy5QYXJ0aWNpcGFudFR5cGVMaXN0XHJcbiAgICAgIHRoaXMuRWRpdFNvdXJjZVBhcnRpY2lwYW50VHlwZS5TaW5nbGVTZWxlY3Rpb24gPSB0cnVlO1xyXG4gICAgICB0aGlzLkVkaXRTb3VyY2VQYXJ0aWNpcGFudFR5cGUuQWxsb3dTZWFyY2hGaWx0ZXIgPSB0cnVlO1xyXG4gICAgICB0aGlzLkVkaXRTb3VyY2VQYXJ0aWNpcGFudFR5cGUuSXNSZXF1aXJlZCA9IHRydWU7XHJcblxyXG4gICAgICB0aGlzLkVkaXREZXN0aW5hdGlvblBhcnRpY2lwYW50VHlwZSA9IG5ldyBEcm9wZG93bk9wdGlvbnMoKTtcclxuICAgICAgdGhpcy5FZGl0RGVzdGluYXRpb25QYXJ0aWNpcGFudFR5cGUuTmFtZSA9IFwiRWRpdERlc3RpbmF0aW9uUGFydGljaXBhbnRUeXBlXCJcclxuICAgICAgdGhpcy5FZGl0RGVzdGluYXRpb25QYXJ0aWNpcGFudFR5cGUuTGFiZWxLZXkgPSBcIkRlc3RpbmF0aW9uUGFydGljaXBhbnRUeXBlXCJcclxuICAgICAgdGhpcy5FZGl0RGVzdGluYXRpb25QYXJ0aWNpcGFudFR5cGUuU2VsZWN0ZWRJdGVtcyA9IHRoaXMuUGFydGljaXBhbnRUeXBlTGlzdC5maWx0ZXIoKGl0ZW0pID0+IHsgcmV0dXJuIHBhcnNlSW50KGl0ZW0ua2V5KSA9PSBpbXBlcnNvbmF0aW9uLmRlc3RpbmF0aW9uUGFydGljaXBhbnREVE8ucGFydGljaXBhbnRUeXBlSXRlbUlEOyB9KS5tYXAoKGl0ZW0pID0+IGl0ZW0ua2V5KVswXTs7XHJcbiAgICAgIHRoaXMuRWRpdERlc3RpbmF0aW9uUGFydGljaXBhbnRUeXBlLkRhdGFTb3VyY2UgPSB0aGlzLlBhcnRpY2lwYW50VHlwZUxpc3RcclxuICAgICAgdGhpcy5FZGl0RGVzdGluYXRpb25QYXJ0aWNpcGFudFR5cGUuU2luZ2xlU2VsZWN0aW9uID0gdHJ1ZTtcclxuICAgICAgdGhpcy5FZGl0RGVzdGluYXRpb25QYXJ0aWNpcGFudFR5cGUuQWxsb3dTZWFyY2hGaWx0ZXIgPSB0cnVlO1xyXG4gICAgICB0aGlzLkVkaXREZXN0aW5hdGlvblBhcnRpY2lwYW50VHlwZS5Jc1JlcXVpcmVkID0gdHJ1ZTtcclxuXHJcbiAgICAgIGxldCBzb3VyY2VQZXJtaXNzaW9uU2V0U2VsZWN0ZWRJdGVtO1xyXG4gICAgICBsZXQgc291cmNlVXNlck1vZGVsID0gbmV3IEF1dG9jb21wbGV0ZURUTygpO1xyXG4gICAgICBpZiAoaW1wZXJzb25hdGlvbi5zb3VyY2VQYXJ0aWNpcGFudERUTy5wYXJ0aWNpcGFudFR5cGVJdGVtSUQgPT0gUGFydGljaXBhbnRUeXBlLlVzZXIpIHtcclxuICAgICAgICBzb3VyY2VVc2VyTW9kZWwua2V5ID0gaW1wZXJzb25hdGlvbi5zb3VyY2VQYXJ0aWNpcGFudERUTy51c2VySURcclxuICAgICAgICBzb3VyY2VVc2VyTW9kZWwudmFsdWUgPSBpbXBlcnNvbmF0aW9uLnNvdXJjZVBhcnRpY2lwYW50RFRPLnBhcnRpY2lwYW50TmFtZVN0cjtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBzb3VyY2VQZXJtaXNzaW9uU2V0U2VsZWN0ZWRJdGVtID0gdGhpcy5QZXJtaXNzaW9uU2V0TGlzdC5maWx0ZXIoKGl0ZW0pID0+IHsgcmV0dXJuIHBhcnNlSW50KGl0ZW0ua2V5KSA9PSBpbXBlcnNvbmF0aW9uLnNvdXJjZVBhcnRpY2lwYW50RFRPLnBlcm1pc3Npb25TZXRJRDsgfSkubWFwKChpdGVtKSA9PiBpdGVtLmtleSlbMF07XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5FZGl0U291cmNlUGVybWlzc2lvblNldExpc3QgPSBuZXcgRHJvcGRvd25PcHRpb25zKCk7XHJcbiAgICAgIHRoaXMuRWRpdFNvdXJjZVBlcm1pc3Npb25TZXRMaXN0Lk5hbWUgPSBcIkVkaXRTb3VyY2VQZXJtaXNzaW9uU2V0TGlzdFwiXHJcbiAgICAgIHRoaXMuRWRpdFNvdXJjZVBlcm1pc3Npb25TZXRMaXN0LkxhYmVsS2V5ID0gXCJTb3VyY2VQZXJtaXNzaW9uU2V0TGlzdFwiXHJcbiAgICAgIHRoaXMuRWRpdFNvdXJjZVBlcm1pc3Npb25TZXRMaXN0LlNlbGVjdGVkSXRlbXMgPSBzb3VyY2VQZXJtaXNzaW9uU2V0U2VsZWN0ZWRJdGVtO1xyXG4gICAgICB0aGlzLkVkaXRTb3VyY2VQZXJtaXNzaW9uU2V0TGlzdC5EYXRhU291cmNlID0gdGhpcy5QZXJtaXNzaW9uU2V0TGlzdFxyXG4gICAgICB0aGlzLkVkaXRTb3VyY2VQZXJtaXNzaW9uU2V0TGlzdC5TaW5nbGVTZWxlY3Rpb24gPSB0cnVlO1xyXG4gICAgICB0aGlzLkVkaXRTb3VyY2VQZXJtaXNzaW9uU2V0TGlzdC5BbGxvd1NlYXJjaEZpbHRlciA9IHRydWU7XHJcbiAgICAgIHRoaXMuRWRpdFNvdXJjZVBlcm1pc3Npb25TZXRMaXN0LklzUmVxdWlyZWQgPSB0cnVlO1xyXG5cclxuICAgICAgdGhpcy5FZGl0U291cmNlVXNlckF1dG9Db21wbGV0ZSA9IG5ldyBBdXRvY29tcGxldGVPcHRpb25zKCk7XHJcbiAgICAgIHRoaXMuRWRpdFNvdXJjZVVzZXJBdXRvQ29tcGxldGUuTmFtZSA9IFwiRWRpdFNvdXJjZVVzZXJBdXRvQ29tcGxldGVcIjtcclxuICAgICAgdGhpcy5FZGl0U291cmNlVXNlckF1dG9Db21wbGV0ZS5MYWJlbEtleSA9IFwiVXNlclwiO1xyXG4gICAgICB0aGlzLkVkaXRTb3VyY2VVc2VyQXV0b0NvbXBsZXRlLlR5cGUgPSBJbnB1dFR5cGUuVGV4dDtcclxuICAgICAgdGhpcy5FZGl0U291cmNlVXNlckF1dG9Db21wbGV0ZS5Jc1JlcXVpcmVkID0gdHJ1ZTtcclxuICAgICAgdGhpcy5FZGl0U291cmNlVXNlckF1dG9Db21wbGV0ZS5TZWxlY3RlZFZhbHVlID0gc291cmNlVXNlck1vZGVsO1xyXG4gICAgICB0aGlzLkVkaXRTb3VyY2VVc2VyQXV0b0NvbXBsZXRlLkFjdGlvblVSTCA9IHRoaXMuZW52aXJvbm1lbnRTZXJ2aWNlLmdldEFwaVVybCgpICsgdGhpcy5BcGlVcmwgKyBcIkF1dG9Db21wbGV0ZVVzZXJcIlxyXG4gICAgICB0aGlzLkVkaXRTb3VyY2VVc2VyQXV0b0NvbXBsZXRlLlZhbGlkYXRpb25Ub2tlbiA9IHRoaXMuYXV0aFNlcnZpY2UuYXV0aG9yaXphdGlvbkhlYWRlclZhbHVlKClcclxuXHJcbiAgICAgIGxldCBkZXN0aW5hdGlvblBlcm1pc3Npb25TZXRTZWxlY3RlZEl0ZW07XHJcbiAgICAgIGxldCBkZXN0aW5hdGlvblVzZXJNb2RlbCA9IG5ldyBBdXRvY29tcGxldGVEVE8oKTtcclxuICAgICAgaWYgKGltcGVyc29uYXRpb24uZGVzdGluYXRpb25QYXJ0aWNpcGFudERUTy5wYXJ0aWNpcGFudFR5cGVJdGVtSUQgPT0gUGFydGljaXBhbnRUeXBlLlVzZXIpIHtcclxuICAgICAgICBkZXN0aW5hdGlvblVzZXJNb2RlbC5rZXkgPSBpbXBlcnNvbmF0aW9uLmRlc3RpbmF0aW9uUGFydGljaXBhbnREVE8udXNlcklEXHJcbiAgICAgICAgZGVzdGluYXRpb25Vc2VyTW9kZWwudmFsdWUgPSBpbXBlcnNvbmF0aW9uLmRlc3RpbmF0aW9uUGFydGljaXBhbnREVE8ucGFydGljaXBhbnROYW1lU3RyO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGRlc3RpbmF0aW9uUGVybWlzc2lvblNldFNlbGVjdGVkSXRlbSA9IHRoaXMuUGVybWlzc2lvblNldExpc3QuZmlsdGVyKChpdGVtKSA9PiB7IHJldHVybiBwYXJzZUludChpdGVtLmtleSkgPT0gaW1wZXJzb25hdGlvbi5kZXN0aW5hdGlvblBhcnRpY2lwYW50RFRPLnBlcm1pc3Npb25TZXRJRDsgfSkubWFwKChpdGVtKSA9PiBpdGVtLmtleSlbMF07XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5FZGl0RGVzdGluYXRpb25QZXJtaXNzaW9uU2V0TGlzdCA9IG5ldyBEcm9wZG93bk9wdGlvbnMoKTtcclxuICAgICAgdGhpcy5FZGl0RGVzdGluYXRpb25QZXJtaXNzaW9uU2V0TGlzdC5OYW1lID0gXCJFZGl0RGVzdGluYXRpb25QZXJtaXNzaW9uU2V0TGlzdFwiXHJcbiAgICAgIHRoaXMuRWRpdERlc3RpbmF0aW9uUGVybWlzc2lvblNldExpc3QuTGFiZWxLZXkgPSBcIkRlc3RpbmF0aW9uUGVybWlzc2lvblNldExpc3RcIlxyXG4gICAgICB0aGlzLkVkaXREZXN0aW5hdGlvblBlcm1pc3Npb25TZXRMaXN0LlNlbGVjdGVkSXRlbXMgPSBkZXN0aW5hdGlvblBlcm1pc3Npb25TZXRTZWxlY3RlZEl0ZW1cclxuICAgICAgdGhpcy5FZGl0RGVzdGluYXRpb25QZXJtaXNzaW9uU2V0TGlzdC5EYXRhU291cmNlID0gdGhpcy5QZXJtaXNzaW9uU2V0TGlzdFxyXG4gICAgICB0aGlzLkVkaXREZXN0aW5hdGlvblBlcm1pc3Npb25TZXRMaXN0LlNpbmdsZVNlbGVjdGlvbiA9IHRydWU7XHJcbiAgICAgIHRoaXMuRWRpdERlc3RpbmF0aW9uUGVybWlzc2lvblNldExpc3QuQWxsb3dTZWFyY2hGaWx0ZXIgPSB0cnVlO1xyXG4gICAgICB0aGlzLkVkaXREZXN0aW5hdGlvblBlcm1pc3Npb25TZXRMaXN0LklzUmVxdWlyZWQgPSB0cnVlO1xyXG5cclxuXHJcbiAgICAgIHRoaXMuRWRpdERlc3RpbmF0aW9uVXNlckF1dG9Db21wbGV0ZSA9IG5ldyBBdXRvY29tcGxldGVPcHRpb25zKCk7XHJcbiAgICAgIHRoaXMuRWRpdERlc3RpbmF0aW9uVXNlckF1dG9Db21wbGV0ZS5OYW1lID0gXCJFZGl0RGVzdGluYXRpb25Vc2VyQXV0b0NvbXBsZXRlXCI7XHJcbiAgICAgIHRoaXMuRWRpdERlc3RpbmF0aW9uVXNlckF1dG9Db21wbGV0ZS5MYWJlbEtleSA9IFwiVXNlclwiO1xyXG4gICAgICB0aGlzLkVkaXREZXN0aW5hdGlvblVzZXJBdXRvQ29tcGxldGUuVHlwZSA9IElucHV0VHlwZS5UZXh0O1xyXG4gICAgICB0aGlzLkVkaXREZXN0aW5hdGlvblVzZXJBdXRvQ29tcGxldGUuSXNSZXF1aXJlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuRWRpdERlc3RpbmF0aW9uVXNlckF1dG9Db21wbGV0ZS5TZWxlY3RlZFZhbHVlID0gZGVzdGluYXRpb25Vc2VyTW9kZWxcclxuICAgICAgdGhpcy5FZGl0RGVzdGluYXRpb25Vc2VyQXV0b0NvbXBsZXRlLkFjdGlvblVSTCA9IHRoaXMuZW52aXJvbm1lbnRTZXJ2aWNlLmdldEFwaVVybCgpICsgdGhpcy5BcGlVcmwgKyBcIkF1dG9Db21wbGV0ZVVzZXJcIlxyXG4gICAgICB0aGlzLkVkaXREZXN0aW5hdGlvblVzZXJBdXRvQ29tcGxldGUuVmFsaWRhdGlvblRva2VuID0gdGhpcy5hdXRoU2VydmljZS5hdXRob3JpemF0aW9uSGVhZGVyVmFsdWUoKVxyXG5cclxuICAgICAgdGhpcy5FZGl0SXNBY3RpdmUgPSBuZXcgQ2hlY2tCb3hPcHRpb25zKCk7XHJcbiAgICAgIHRoaXMuRWRpdElzQWN0aXZlLk5hbWUgPSBcIkVkaXRJc0FjdGl2ZVwiXHJcbiAgICAgIHRoaXMuRWRpdElzQWN0aXZlLkxhYmVsS2V5ID0gXCJBY3RpdmVcIlxyXG4gICAgICB0aGlzLkVkaXRJc0FjdGl2ZS5Jc0Rpc2FibGVkID0gdHJ1ZVxyXG4gICAgICB0aGlzLkVkaXRJc0FjdGl2ZS5WYWx1ZSA9IHRydWVcclxuXHJcbiAgICAgIHRoaXMuRWRpdEV4cGlyZXNBdCA9IG5ldyBEYXRlUGlja2VyT3B0aW9ucygpO1xyXG4gICAgICB0aGlzLkVkaXRFeHBpcmVzQXQuTmFtZSA9IFwiRWRpdEV4cGlyZXNBdFwiXHJcbiAgICAgIHRoaXMuRWRpdEV4cGlyZXNBdC5MYWJlbEtleSA9IFwiRXhwaXJlc0F0XCJcclxuICAgICAgdGhpcy5FZGl0RXhwaXJlc0F0LklzUmVxdWlyZWQgPSB0cnVlXHJcbiAgICAgIHRoaXMuRWRpdEV4cGlyZXNBdC5WYWx1ZSA9IGltcGVyc29uYXRpb24uZXhwaXJlc0F0XHJcbiAgICAgIHRoaXMuRWRpdEV4cGlyZXNBdC5TdGFydFZpZXcgPSBTdGFydFZpZXcuTW9udGhcclxuICAgICAgdGhpcy5FZGl0RXhwaXJlc0F0LlBpY2tlclR5cGUgPSBQaWNrZXJUeXBlLkNhbGVuZGFyXHJcbiAgICAgIHRoaXMuRWRpdEV4cGlyZXNBdC5TZWxlY3RNb2RlID0gU2VsZWN0TW9kZS5TaW5nbGVcclxuXHJcbiAgICAgIHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oZWRpdEltcGVyc29uYXRpb25Nb2RhbCk7XHJcbiAgICAgIHRoaXMudXRpbGl0eVNlcnZpY2Uuc3RvcEJsb2NrVUkoKVxyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0RWRpdEltcGVyc29uYXRpb25SdWxlTW9kZWwgPSAoKSA9PiB7XHJcbiAgICBsZXQgcGFyYW1BcnJheTogYW55W10gPSBbXTtcclxuICAgIGxldCBSZXN1bHRNb2RlbCA9IHRoaXMuRWRpdEltcGVyc29uYXRpb25Gb3JtLnZhbHVlO1xyXG5cclxuICAgIGxldCBFZGl0TW9kZWw6IEltcGVyc29uYXRpb25SdWxlTW9kZWwgPSBuZXcgSW1wZXJzb25hdGlvblJ1bGVNb2RlbCgpO1xyXG4gICAgRWRpdE1vZGVsLklEID0gdGhpcy5JbXBlcnNvbmF0aW9uSWRcclxuICAgIEVkaXRNb2RlbC5EZXN0aW5hdGlvblBhcnRpY2lwYW50RFRPLklEID0gdGhpcy5EZXN0aW5hdGlvblBhcnRpY2lwYW50SWRcclxuICAgIEVkaXRNb2RlbC5Tb3VyY2VQYXJ0aWNpcGFudERUTy5JRCA9IHRoaXMuU291cmNlUGFydGljaXBhbnRJZFxyXG4gICAgRWRpdE1vZGVsLlNvdXJjZVBhcnRpY2lwYW50RFRPLlBhcnRpY2lwYW50VHlwZUl0ZW1JRCA9IE51bWJlcihSZXN1bHRNb2RlbC5FZGl0U291cmNlUGFydGljaXBhbnRUeXBlKVxyXG4gICAgRWRpdE1vZGVsLkRlc3RpbmF0aW9uUGFydGljaXBhbnREVE8uUGFydGljaXBhbnRUeXBlSXRlbUlEID0gTnVtYmVyKFJlc3VsdE1vZGVsLkVkaXREZXN0aW5hdGlvblBhcnRpY2lwYW50VHlwZSlcclxuICAgIEVkaXRNb2RlbC5FeHBpcmVzQXQgPSBSZXN1bHRNb2RlbC5FZGl0RXhwaXJlc0F0XHJcbiAgICBFZGl0TW9kZWwuSXNBY3RpdmUgPSBSZXN1bHRNb2RlbC5FZGl0SXNBY3RpdmVcclxuICAgIGNvbnNvbGUubG9nKFwiRGF0YTpcIik7XHJcbiAgICBjb25zb2xlLmxvZyhSZXN1bHRNb2RlbCk7XHJcbiAgICBpZiAoRWRpdE1vZGVsLkRlc3RpbmF0aW9uUGFydGljaXBhbnREVE8uUGFydGljaXBhbnRUeXBlSXRlbUlEID09IFBhcnRpY2lwYW50VHlwZS5Vc2VyKVxyXG4gICAgICBFZGl0TW9kZWwuRGVzdGluYXRpb25QYXJ0aWNpcGFudERUTy5Vc2VySUQgPSBOdW1iZXIoUmVzdWx0TW9kZWwuRWRpdERlc3RpbmF0aW9uVXNlckF1dG9Db21wbGV0ZS5rZXkpXHJcbiAgICBlbHNlXHJcbiAgICAgIEVkaXRNb2RlbC5EZXN0aW5hdGlvblBhcnRpY2lwYW50RFRPLlBlcm1pc3Npb25TZXRJRCA9IE51bWJlcihSZXN1bHRNb2RlbC5FZGl0RGVzdGluYXRpb25QZXJtaXNzaW9uU2V0TGlzdClcclxuICAgIGlmIChFZGl0TW9kZWwuU291cmNlUGFydGljaXBhbnREVE8uUGFydGljaXBhbnRUeXBlSXRlbUlEID09IFBhcnRpY2lwYW50VHlwZS5Vc2VyKVxyXG4gICAgICBFZGl0TW9kZWwuU291cmNlUGFydGljaXBhbnREVE8uVXNlcklEID0gTnVtYmVyKFJlc3VsdE1vZGVsLkVkaXRTb3VyY2VVc2VyQXV0b0NvbXBsZXRlLmtleSlcclxuICAgIGVsc2VcclxuICAgICAgRWRpdE1vZGVsLlNvdXJjZVBhcnRpY2lwYW50RFRPLlBlcm1pc3Npb25TZXRJRCA9IE51bWJlcihSZXN1bHRNb2RlbC5FZGl0U291cmNlUGVybWlzc2lvblNldExpc3QpXHJcbiAgICBwYXJhbUFycmF5LnB1c2goRWRpdE1vZGVsKTtcclxuICAgIHJldHVybiBwYXJhbUFycmF5O1xyXG4gIH1cclxuXHJcbiAgZ2V0RWRpdEltcGVyc29uYXRpb25SdWxlRnVuY3Rpb24gPSAoRWRpdE1vZGVsKTogT2JzZXJ2YWJsZTxhbnk+ID0+IHtcclxuICAgIHJldHVybiB0aGlzLkltcGVyc29uYXRpb25SdWxlU2VydmljZS5lZGl0SW1wZXJzb25hdGlvblJ1bGUoRWRpdE1vZGVsKVxyXG4gIH1cclxuXHJcbiAgZWRpdERlc3RpbmF0aW9uUGFydGljaXBhbnRPbkNoYW5nZShrZXkpIHtcclxuICAgIGxldCBzb3VyY2VJdGVtID0gdGhpcy5QYXJ0aWNpcGFudFR5cGVMaXN0LmZpbHRlcigoaXRlbSkgPT4geyByZXR1cm4gcGFyc2VJbnQoaXRlbS5rZXkpID09IGtleTsgfSkubWFwKChpdGVtKSA9PiBpdGVtKVswXTtcclxuICAgIHN3aXRjaCAoc291cmNlSXRlbS52YWx1ZSkge1xyXG4gICAgICBjYXNlIFwiUGVybWlzc2lvblNldFwiOlxyXG4gICAgICAgIHRoaXMuRWRpdFNob3dEZXN0aW5hdGlvblBlcm1pc3Npb25MaXN0ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLkVkaXRTaG93RGVzdGluYXRpb25Vc2VyQXV0b0NvbXBsZXRlID0gZmFsc2U7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJVc2VyXCI6XHJcbiAgICAgICAgdGhpcy5FZGl0U2hvd0Rlc3RpbmF0aW9uUGVybWlzc2lvbkxpc3QgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLkVkaXRTaG93RGVzdGluYXRpb25Vc2VyQXV0b0NvbXBsZXRlID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBlZGl0U291cmNlUGFydGljaXBhbnRPbkNoYW5nZShrZXkpIHtcclxuICAgIGxldCBzb3VyY2VJdGVtID0gdGhpcy5QYXJ0aWNpcGFudFR5cGVMaXN0LmZpbHRlcigoaXRlbSkgPT4geyByZXR1cm4gcGFyc2VJbnQoaXRlbS5rZXkpID09IGtleTsgfSkubWFwKChpdGVtKSA9PiBpdGVtKVswXTtcclxuICAgIHN3aXRjaCAoc291cmNlSXRlbS52YWx1ZSkge1xyXG4gICAgICBjYXNlIFwiUGVybWlzc2lvblNldFwiOlxyXG4gICAgICAgIHRoaXMuRWRpdFNob3dTb3VyY2VQZXJtaXNzaW9uTGlzdCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5FZGl0U2hvd1NvdXJjZVVzZXJBdXRvQ29tcGxldGUgPSBmYWxzZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcIlVzZXJcIjpcclxuICAgICAgICB0aGlzLkVkaXRTaG93U291cmNlUGVybWlzc2lvbkxpc3QgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLkVkaXRTaG93U291cmNlVXNlckF1dG9Db21wbGV0ZSA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL0RlbGV0ZSBJbXBlcnNvbmF0aW9uUnVsZVxyXG4gIHNob3dEZWxldGVJbXBlcnNvbmF0aW9uTW9kYWwoaW1wZXJzb25hdGlvblJ1bGVJRDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmRlbGV0ZUltcGVyc29uYXRpb25SdWxlSWQgPSBpbXBlcnNvbmF0aW9uUnVsZUlEO1xyXG5cclxuICAgIC8vYXJyYXkgc2VudCB0byBzZXJ2aWNlIGZ1bmN0aW9uXHJcbiAgICBsZXQgcGFyYW1BcnJheTogYW55W10gPSBbXTtcclxuICAgIHBhcmFtQXJyYXkucHVzaCh0aGlzLmRlbGV0ZUltcGVyc29uYXRpb25SdWxlSWQpO1xyXG5cclxuICAgIHRoaXMuRGVsZXRlQ29uZmlybWF0aW9uT3B0aW9ucyA9IG5ldyBDb25maXJtYXRpb25Nb2RhbE9wdGlvbnMoKTtcclxuICAgIHRoaXMuRGVsZXRlQ29uZmlybWF0aW9uT3B0aW9ucy5TZXJ2aWNlU3VibWl0RnVuY3Rpb24gPSB0aGlzLmRlbGV0ZUltcGVyc29uYXRpb247XHJcbiAgICB0aGlzLkRlbGV0ZUNvbmZpcm1hdGlvbk9wdGlvbnMuU2VydmljZVN1Ym1pdE1vZGVsID0gcGFyYW1BcnJheTtcclxuICAgIHRoaXMuRGVsZXRlQ29uZmlybWF0aW9uT3B0aW9ucy5QYWdpbmdSZWZlcmVuY2UgPSB0aGlzLnBhZ2luZ0VsZW1lbnQ7XHJcblxyXG4gICAgdGhpcy5kZWxldGVDb250cm9sTG9hZGVkID0gdHJ1ZTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLkNvbmZpcm1hdGlvbk1vZGFsQ29udHJvbC5zaG93TW9kYWwoKTtcclxuICAgIH0sIDIwMCk7XHJcbiAgfVxyXG5cclxuICBkZWxldGVJbXBlcnNvbmF0aW9uID0gKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4gPT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuSW1wZXJzb25hdGlvblJ1bGVTZXJ2aWNlLmRlbGV0ZUltcGVyc29uYXRpb25SdWxlKGlkKTtcclxuICB9XHJcblxyXG4gIC8vT24gZGVzdHJveVxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5yZXF1ZXN0SGFuZGxlclNlcnZpY2UuZGVzdHJveUhhbmRsZXIoKTtcclxuICB9XHJcblxyXG59XHJcbiIsIjxibG9jay11aT48L2Jsb2NrLXVpPlxyXG48IS0tIFBhZ2UgQ29udGVudCAtLT5cclxuPGRpdiAqbmdJZj1cIlNob3dQYWdlQ29udGVudFwiIGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+XHJcbiAgPGRpdiBjbGFzcz1cImNhcmQgY2FyZC1jdXN0b20taFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIGJvcmRlci0wIHB0LTVcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQtdGl0bGUgYWxpZ24taXRlbXMtc3RhcnQgZmxleC1jb2x1bW5cIiAqbmdJZj1cIklzRmlsdGVyTG9hZGVkXCI+XHJcbiAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJJbXBlcnNvbmF0aW9uRm9ybVwiPlxyXG4gICAgICAgICAgPEJCU0YtVGV4dEJveCAoT25DaGFuZ2UpPVwic2VhcmNoQ2xpZW50U2lkZSgkZXZlbnQpXCIgW29wdGlvbnNdPVwic2VhcmNoVGV4dEJveFwiIFtncm91cF09XCJJbXBlcnNvbmF0aW9uRm9ybVwiPjwvQkJTRi1UZXh0Qm94PlxyXG4gICAgICAgIDwvZm9ybT5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLXRvb2xiYXJcIj5cclxuICAgICAgICA8IS0tIGJlZ2luOjpNZW51IC0tPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tcHJpbWFyeVwiIHRpdGxlPVwiQWRkXCIgKGNsaWNrKT1cInNob3dBZGRJbXBlcnNvbmF0aW9uTW9kYWwoQWRkSW1wZXJzb25hdGlvbk1vZGFsKVwiPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtcGx1cyBtZS0xXCI+PC9pPlxyXG4gICAgICAgICAge3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiQWRkXCIpfX1cclxuICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgPCEtLSBlbmQ6Ok1lbnUgLS0+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHB5LTNcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmVcIj5cclxuICAgICAgICA8IS0tYmVnaW46OlBlcm1pc3Npb24gbGlzdC0tPlxyXG4gICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIGFsaWduLW1pZGRsZSB0YWJsZS1yb3ctZGFzaGVkIGZzLTYgZ3ktNSBkYXRhVGFibGUgbm8tZm9vdGVyXCI+XHJcbiAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgIDx0ciBjbGFzcz1cInRleHQtc3RhcnQgdGV4dC1ncmF5LTQwMCBmdy1ib2xkZXIgZnMtNyB0ZXh0LXVwcGVyY2FzZSBncy0wXCI+XHJcblxyXG4gICAgICAgICAgICAgIDx0aCBjbGFzcz1cIm1pbi13LTE1MHB4XCI+IFt7e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJQYXJ0aWNpcGFudFR5cGVcIil9fV17e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJTb3VyY2VcIil9fTwvdGg+XHJcbiAgICAgICAgICAgICAgPHRoIGNsYXNzPVwibWluLXctMTUwcHhcIj4gW3t7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlBhcnRpY2lwYW50VHlwZVwiKX19XXt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkRlc3RpbmF0aW9uXCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgIDx0aCBjbGFzcz1cIm1pbi13LTE1MHB4XCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiRXhwaXJlc0F0XCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgIDx0aCBjbGFzcz1cIm1pbi13LTE1MHB4XCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiQWN0aXZlXCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgIDx0aCBjbGFzcz1cIm1pbi13LTUwcHhcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJBY3Rpb25cIil9fTwvdGg+XHJcbiAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgPHRib2R5IGlkPVwibGlzdGluZ0NvbnRhaW5lclwiIGNsYXNzPVwiZnctYm9sZCB0ZXh0LWdyYXktNjAwIGJvcmRlci0wXCI+XHJcblxyXG4gICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IEltcGVyc29uYXRpb24gb2YgY2xpZW50U2lkZVBhZ2luZ1Jlc3VsdFwiPlxyXG5cclxuICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFya1wiPlxyXG4gICAgICAgICAgICAgICAgICBbe3tJbXBlcnNvbmF0aW9uLnNvdXJjZVBhcnRpY2lwYW50RFRPLnBhcnRpY2lwYW50VHlwZUl0ZW1OYW1lU3RyfX1dIHt7SW1wZXJzb25hdGlvbi5zb3VyY2VQYXJ0aWNpcGFudERUTy5wYXJ0aWNpcGFudE5hbWVTdHJ9fVxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZD4gIFt7e0ltcGVyc29uYXRpb24uZGVzdGluYXRpb25QYXJ0aWNpcGFudERUTy5wYXJ0aWNpcGFudFR5cGVJdGVtTmFtZVN0cn19XSB7e0ltcGVyc29uYXRpb24uZGVzdGluYXRpb25QYXJ0aWNpcGFudERUTy5wYXJ0aWNpcGFudE5hbWVTdHJ9fTwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgIDx0ZD57e0ltcGVyc29uYXRpb24uZXhwaXJlc0F0fX08L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZD57e0ltcGVyc29uYXRpb24uaXNBY3RpdmV9fTwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgIDx0ZD5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1lbnVcIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWljb24gYnRuLWxpZ2h0IGJ0bi1hY3RpdmUtbGlnaHQtcHJpbWFyeVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZWxsaXBzaXMtaFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtbWVudSAjbWVudT1cIm1hdE1lbnVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRyb3AtaXRlbSBweC0zXCIgbmdiRHJvcGRvd25JdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dFZGl0SW1wZXJzb25hdGlvbk1vZGFsKEltcGVyc29uYXRpb24uaWQsSW1wZXJzb25hdGlvbi5pZEVuY3J5cHRlZCxFZGl0SW1wZXJzb25hdGlvbk1vZGFsKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkcm9wLWxpbmsgcHgtM1wiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkVkaXRcIil9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgPGEgbmdiRHJvcGRvd25JdGVtIGNsYXNzPVwiZHJvcC1pdGVtIHB4LTNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzaG93RGVsZXRlSW1wZXJzb25hdGlvbk1vZGFsKEltcGVyc29uYXRpb24uaWRFbmNyeXB0ZWQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRyb3AtbGluayBweC0zXCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiRGVsZXRlXCIpfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPHRyICpuZ0lmPVwiY2xpZW50U2lkZVBhZ2luZ1Jlc3VsdC5sZW5ndGggPT0gMFwiPlxyXG4gICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiNVwiPlxyXG4gICAgICAgICAgICAgICAgPGxpYi1lbXB0eS1kYXRhPjwvbGliLWVtcHR5LWRhdGE+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgPC90YWJsZT5cclxuXHJcbiAgICAgICAgPCEtLWVuZDo6UGVybWlzc2lvbiBsaXN0LS0+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImNhcmQtZm9vdGVyIGJvcmRlci0wXCI+XHJcbiAgICAgIDxCQlNGLVBhZ2luZyAoSXRlbXMpPVwic2V0SW1wZXJzb25hdGlvbkxpc3RSZXN1bHQoJGV2ZW50KVwiICpuZ0lmPVwiSXNGaWx0ZXJMb2FkZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiSW1wZXJzb25hdGlvblBhZ2luZ1wiIFtncm91cF09XCJJbXBlcnNvbmF0aW9uRm9ybVwiICNJbXBlcnNvbmF0aW9uUGFnaW5nVmlld0VsZW1lbnQ+XHJcbiAgICAgIDwvQkJTRi1QYWdpbmc+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbjwvZGl2PlxyXG48IS0tIEFkZCBNb2RhbCAtLT5cclxuPG5nLXRlbXBsYXRlICNBZGRJbXBlcnNvbmF0aW9uTW9kYWwgbGV0LW1vZGFsPlxyXG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXIgcGItMCBib3JkZXItMCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICA8aDUgY2xhc3M9XCJtb2RhbC10aXRsZVwiIGlkPVwiZXhhbXBsZU1vZGFsTGFiZWxcIj48L2g1PlxyXG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWljb24gYnRuLWFjdGl2ZS1jb2xvci1wcmltYXJ5XCIgKGNsaWNrKT1cIm1vZGFsLmRpc21pc3MoKVwiPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cInN2Zy1pY29uIHN2Zy1pY29uLTFcIj5cclxuICAgICAgICA8c3BhbiBbaW5saW5lU1ZHXT1cIicuL3NyYy9hc3NldHMvaW1hZ2VzL2FycjA2MS5zdmcnXCI+PC9zcGFuPlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBzY3JvbGwteSBweC0xMCBweC1sZy0xNSBwdC0wIHBiLTE1XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibWItMTMgdGV4dC1jZW50ZXJcIj5cclxuICAgICAgPGgxIGNsYXNzPVwibWItM1wiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkFkZFwiKX19IHt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkltcGVyc29uYXRpb25SdWxlXCIpfX08L2gxPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPEJCU0YtRm9ybSBbb3B0aW9uc109XCJBZGRJbXBlcnNvbmF0aW9uRm9ybU9wdGlvbnNcIj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICA8QkJTRi1Ecm9wZG93bkxpc3QgW29wdGlvbnNdPVwiQWRkU291cmNlUGFydGljaXBhbnRUeXBlXCIgKE9uQ2hhbmdlKT1cImFkZFNvdXJjZVBhcnRpY2lwYW50T25DaGFuZ2UoJGV2ZW50KVwiIFtncm91cF09XCJBZGRJbXBlcnNvbmF0aW9uRm9ybVwiPlxyXG4gICAgICAgICAgPC9CQlNGLURyb3Bkb3duTGlzdD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICA8QkJTRi1Ecm9wZG93bkxpc3QgW29wdGlvbnNdPVwiQWRkU291cmNlUGVybWlzc2lvblNldExpc3RcIiAqbmdJZj1cIkFkZFNob3dTb3VyY2VQZXJtaXNzaW9uTGlzdFwiIFtncm91cF09XCJBZGRJbXBlcnNvbmF0aW9uRm9ybVwiPlxyXG4gICAgICAgICAgPC9CQlNGLURyb3Bkb3duTGlzdD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICA8QkJTRi1BdXRvY29tcGxldGVUZXh0Qm94IFtvcHRpb25zXT1cIkFkZFNvdXJjZVVzZXJBdXRvQ29tcGxldGVcIiAqbmdJZj1cIkFkZFNob3dTb3VyY2VVc2VyQXV0b0NvbXBsZXRlXCIgW2dyb3VwXT1cIkFkZEltcGVyc29uYXRpb25Gb3JtXCI+XHJcbiAgICAgICAgICA8L0JCU0YtQXV0b2NvbXBsZXRlVGV4dEJveD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgPEJCU0YtRHJvcGRvd25MaXN0IFtvcHRpb25zXT1cIkFkZERlc3RpbmF0aW9uUGFydGljaXBhbnRUeXBlXCIgKE9uQ2hhbmdlKT1cImFkZERlc3RpbmF0aW9uUGFydGljaXBhbnRPbkNoYW5nZSgkZXZlbnQpXCIgW2dyb3VwXT1cIkFkZEltcGVyc29uYXRpb25Gb3JtXCI+XHJcbiAgICAgICAgICA8L0JCU0YtRHJvcGRvd25MaXN0PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgIDxCQlNGLURyb3Bkb3duTGlzdCBbb3B0aW9uc109XCJBZGREZXN0aW5hdGlvblBlcm1pc3Npb25TZXRMaXN0XCIgKm5nSWY9XCJBZGRTaG93RGVzdGluYXRpb25QZXJtaXNzaW9uTGlzdFwiIFtncm91cF09XCJBZGRJbXBlcnNvbmF0aW9uRm9ybVwiPlxyXG4gICAgICAgICAgPC9CQlNGLURyb3Bkb3duTGlzdD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICA8QkJTRi1BdXRvY29tcGxldGVUZXh0Qm94IFtvcHRpb25zXT1cIkFkZERlc3RpbmF0aW9uVXNlckF1dG9Db21wbGV0ZVwiICpuZ0lmPVwiQWRkU2hvd0Rlc3RpbmF0aW9uVXNlckF1dG9Db21wbGV0ZVwiIFtncm91cF09XCJBZGRJbXBlcnNvbmF0aW9uRm9ybVwiPlxyXG4gICAgICAgICAgPC9CQlNGLUF1dG9jb21wbGV0ZVRleHRCb3g+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgPEJCU0YtQ2hlY2tCb3ggW29wdGlvbnNdPVwiQWRkSXNBY3RpdmVcIiBbZ3JvdXBdPVwiQWRkSW1wZXJzb25hdGlvbkZvcm1cIj5cclxuICAgICAgICAgIDwvQkJTRi1DaGVja0JveD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgPEJCU0YtRGF0ZVRpbWVQaWNrZXIgW29wdGlvbnNdPVwiQWRkRXhwaXJlc0F0XCIgW2dyb3VwXT1cIkFkZEltcGVyc29uYXRpb25Gb3JtXCI+XHJcblxyXG4gICAgICAgICAgPC9CQlNGLURhdGVUaW1lUGlja2VyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIHB0LTdcIj5cclxuICAgICAgICA8YnV0dG9uIENsb3NlSW1wZXJzb25hdGlvbk1vZGFsIGlkPVwiQ2xvc2VJbXBlcnNvbmF0aW9uTW9kYWxcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IG1lLTMgYnRuLXNtXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJtb2RhbC5kaXNtaXNzKClcIj5cclxuICAgICAgICAgIHt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkNhbmNlbExhYmVsXCIpfX1cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc21cIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJTYXZlTGFiZWxcIil9fTwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvQkJTRi1Gb3JtPlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPCEtLUVkaXQgTW9kYWwtLT5cclxuPG5nLXRlbXBsYXRlICNFZGl0SW1wZXJzb25hdGlvbk1vZGFsIGxldC1tb2RhbD5cclxuICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyIHBiLTAgYm9yZGVyLTAganVzdGlmeS1jb250ZW50LWVuZFwiPlxyXG4gICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cImV4YW1wbGVNb2RhbExhYmVsXCI+PC9oNT5cclxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1pY29uIGJ0bi1hY3RpdmUtY29sb3ItcHJpbWFyeVwiIChjbGljayk9XCJtb2RhbC5kaXNtaXNzKClcIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJzdmctaWNvbiBzdmctaWNvbi0xXCI+XHJcbiAgICAgICAgPHNwYW4gW2lubGluZVNWR109XCInLi9zcmMvYXNzZXRzL2ltYWdlcy9hcnIwNjEuc3ZnJ1wiPjwvc3Bhbj5cclxuICAgICAgPC9zcGFuPlxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHkgc2Nyb2xsLXkgcHgtMTAgcHgtbGctMTUgcHQtMCBwYi0xNVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1iLTEzIHRleHQtY2VudGVyXCI+XHJcbiAgICAgIDxoMSBjbGFzcz1cIm1iLTNcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJFZGl0XCIpfX0ge3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiSW1wZXJzb25hdGlvblJ1bGVcIil9fTwvaDE+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxCQlNGLUZvcm0gW29wdGlvbnNdPVwiRWRpdEltcGVyc29uYXRpb25Gb3JtT3B0aW9uc1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgPEJCU0YtRHJvcGRvd25MaXN0IFtvcHRpb25zXT1cIkVkaXRTb3VyY2VQYXJ0aWNpcGFudFR5cGVcIiAoT25DaGFuZ2UpPVwiZWRpdFNvdXJjZVBhcnRpY2lwYW50T25DaGFuZ2UoJGV2ZW50KVwiIFtncm91cF09XCJFZGl0SW1wZXJzb25hdGlvbkZvcm1cIj5cclxuICAgICAgICAgIDwvQkJTRi1Ecm9wZG93bkxpc3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgPEJCU0YtRHJvcGRvd25MaXN0IFtvcHRpb25zXT1cIkVkaXRTb3VyY2VQZXJtaXNzaW9uU2V0TGlzdFwiICpuZ0lmPVwiRWRpdFNob3dTb3VyY2VQZXJtaXNzaW9uTGlzdFwiIFtncm91cF09XCJFZGl0SW1wZXJzb25hdGlvbkZvcm1cIj5cclxuICAgICAgICAgIDwvQkJTRi1Ecm9wZG93bkxpc3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgPEJCU0YtQXV0b2NvbXBsZXRlVGV4dEJveCBbb3B0aW9uc109XCJFZGl0U291cmNlVXNlckF1dG9Db21wbGV0ZVwiICpuZ0lmPVwiRWRpdFNob3dTb3VyY2VVc2VyQXV0b0NvbXBsZXRlXCIgW2dyb3VwXT1cIkVkaXRJbXBlcnNvbmF0aW9uRm9ybVwiPlxyXG4gICAgICAgICAgPC9CQlNGLUF1dG9jb21wbGV0ZVRleHRCb3g+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgPEJCU0YtRHJvcGRvd25MaXN0IFtvcHRpb25zXT1cIkVkaXREZXN0aW5hdGlvblBhcnRpY2lwYW50VHlwZVwiIChPbkNoYW5nZSk9XCJlZGl0RGVzdGluYXRpb25QYXJ0aWNpcGFudE9uQ2hhbmdlKCRldmVudClcIiBbZ3JvdXBdPVwiRWRpdEltcGVyc29uYXRpb25Gb3JtXCI+XHJcbiAgICAgICAgICA8L0JCU0YtRHJvcGRvd25MaXN0PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgIDxCQlNGLURyb3Bkb3duTGlzdCBbb3B0aW9uc109XCJFZGl0RGVzdGluYXRpb25QZXJtaXNzaW9uU2V0TGlzdFwiICpuZ0lmPVwiRWRpdFNob3dEZXN0aW5hdGlvblBlcm1pc3Npb25MaXN0XCIgW2dyb3VwXT1cIkVkaXRJbXBlcnNvbmF0aW9uRm9ybVwiPlxyXG4gICAgICAgICAgPC9CQlNGLURyb3Bkb3duTGlzdD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICA8QkJTRi1BdXRvY29tcGxldGVUZXh0Qm94IFtvcHRpb25zXT1cIkVkaXREZXN0aW5hdGlvblVzZXJBdXRvQ29tcGxldGVcIiAqbmdJZj1cIkVkaXRTaG93RGVzdGluYXRpb25Vc2VyQXV0b0NvbXBsZXRlXCIgW2dyb3VwXT1cIkVkaXRJbXBlcnNvbmF0aW9uRm9ybVwiPlxyXG4gICAgICAgICAgPC9CQlNGLUF1dG9jb21wbGV0ZVRleHRCb3g+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgPEJCU0YtQ2hlY2tCb3ggW29wdGlvbnNdPVwiRWRpdElzQWN0aXZlXCIgW2dyb3VwXT1cIkVkaXRJbXBlcnNvbmF0aW9uRm9ybVwiPlxyXG4gICAgICAgICAgPC9CQlNGLUNoZWNrQm94PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICA8QkJTRi1EYXRlVGltZVBpY2tlciBbb3B0aW9uc109XCJFZGl0RXhwaXJlc0F0XCIgW2dyb3VwXT1cIkVkaXRJbXBlcnNvbmF0aW9uRm9ybVwiPlxyXG5cclxuICAgICAgICAgIDwvQkJTRi1EYXRlVGltZVBpY2tlcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciBwdC03XCI+XHJcbiAgICAgICAgPGJ1dHRvbiAjQ2xvc2VFZGl0SW1wZXJzb25hdGlvbk1vZGFsIGlkPVwiQ2xvc2VFZGl0SW1wZXJzb25hdGlvbk1vZGFsXCIgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tbGlnaHQgYnRuLXNtICBtZS0zXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIiAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygpXCI+XHJcbiAgICAgICAgICB7e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJDYW5jZWxMYWJlbFwiKX19XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLXNtXCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiU2F2ZUxhYmVsXCIpfX08L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L0JCU0YtRm9ybT5cclxuICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcblxyXG48IS0tZGVsZXRlIE1vZGFsLS0+XHJcbjxCQlNGLUNvbmZpcm1hdGlvbk1vZGFsICpuZ0lmPVwiZGVsZXRlQ29udHJvbExvYWRlZFwiIFtvcHRpb25zXT1cIkRlbGV0ZUNvbmZpcm1hdGlvbk9wdGlvbnNcIiBpZD1cIkNvbmZpcm1hdGlvbk1vZGFsQ29udHJvbFwiICNDb25maXJtYXRpb25Nb2RhbENvbnRyb2w+PC9CQlNGLUNvbmZpcm1hdGlvbk1vZGFsPlxyXG5cclxuIl19