@bnsights/bbsf-admin-portal 1.0.0 → 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bnsights-bbsf-admin-portal-1.0.5.tgz +0 -0
- package/bundles/bnsights-bbsf-admin-portal.umd.js +19694 -20386
- package/bundles/bnsights-bbsf-admin-portal.umd.js.map +1 -1
- package/esm2015/lib/Pages/_layout/components/aside/aside-menu/aside-menu.component.js +2 -2
- package/esm2015/lib/Pages/account/account-routing.module.js +3 -1
- package/esm2015/lib/Pages/account/account.component.js +15 -6
- package/esm2015/lib/Pages/account/account.module.js +16 -8
- package/esm2015/lib/Pages/account/forgot-password/forgot-password.component.js +48 -0
- package/esm2015/lib/Pages/configurations/configuration/configuration.component.js +392 -387
- package/esm2015/lib/Pages/core/authentication/auth.service.js +1 -2
- package/esm2015/lib/Pages/departments/department/department.component.js +59 -98
- package/esm2015/lib/Pages/departments/department-info/department-info.component.js +85 -94
- package/esm2015/lib/Pages/departments/departments.module.js +4 -1
- package/esm2015/lib/Pages/helpCenter/help-center/help-center.component.js +224 -223
- package/esm2015/lib/Pages/helpCenter/help-center-secondlevel/help-center-secondlevel.component.js +137 -146
- package/esm2015/lib/Pages/helpCenter/help-center-thirdlevel/help-center-thirdlevel.component.js +136 -153
- package/esm2015/lib/Pages/home/home.component.js +32 -26
- package/esm2015/lib/Pages/home/home.module.js +5 -10
- package/esm2015/lib/Pages/impersonation-rules/impersonation-rules/impersonation-rules.component.js +336 -317
- package/esm2015/lib/Pages/jobs/jobs/jobs.component.js +168 -227
- package/esm2015/lib/Pages/license/license/license.component.js +68 -99
- package/esm2015/lib/Pages/localizations/localizations.component.js +378 -341
- package/esm2015/lib/Pages/logs/log/log.component.js +18 -27
- package/esm2015/lib/Pages/lookups/lookup/lookup.component.js +297 -288
- package/esm2015/lib/Pages/lookups/lookup-group/lookup-group.component.js +143 -165
- package/esm2015/lib/Pages/lookups/lookup-item/lookup-item.component.js +234 -233
- package/esm2015/lib/Pages/lookups/lookups-routing.module.js +2 -2
- package/esm2015/lib/Pages/notifications/add/add.component.js +83 -76
- package/esm2015/lib/Pages/notifications/edit/edit.component.js +60 -63
- package/esm2015/lib/Pages/notifications/edit-email/edit-email.component.js +128 -126
- package/esm2015/lib/Pages/notifications/edit-sms/edit-sms.component.js +87 -85
- package/esm2015/lib/Pages/notifications/master-layouts/master-layouts.component.js +57 -58
- package/esm2015/lib/Pages/notifications/notifications-routing.module.js +1 -3
- package/esm2015/lib/Pages/notifications/notifications.module.js +3 -4
- package/esm2015/lib/Pages/notifications/template-info/template-info.component.js +232 -228
- package/esm2015/lib/Pages/notifications/templates/templates.component.js +347 -310
- package/esm2015/lib/Pages/providers/provider/provider.component.js +54 -52
- package/esm2015/lib/Pages/publicHolidays/public-holiday/public-holiday.component.js +268 -270
- package/esm2015/lib/Pages/roles/permission-set-info/permission-set-info.component.js +136 -152
- package/esm2015/lib/Pages/roles/permissions/permissions.component.js +182 -218
- package/esm2015/lib/Pages/roles/permissionsets/permissionsets.component.js +219 -254
- package/esm2015/lib/Pages/sectors/department-info/department-info.component.js +134 -142
- package/esm2015/lib/Pages/sectors/sector/sector.component.js +127 -144
- package/esm2015/lib/Pages/sectors/sector-info/sector-info.component.js +123 -139
- package/esm2015/lib/Pages/shared/Enums/ConfigurationScope.js +8 -0
- package/esm2015/lib/Pages/shared/Enums/ConfigurationType.js +8 -0
- package/esm2015/lib/Pages/shared/Enums/ConfigurationValueSource.js +6 -0
- package/esm2015/lib/Pages/shared/Enums/ParticipantType.js +8 -0
- package/esm2015/lib/Pages/shared/Services/AccountService.service.js +21 -0
- package/esm2015/lib/Pages/shared/Services/ConfigurationsService.service.js +15 -12
- package/esm2015/lib/Pages/shared/Services/DepartmentService.service.js +5 -8
- package/esm2015/lib/Pages/shared/Services/EmailHeaderAndFooterTemplateService.Service.js +10 -9
- package/esm2015/lib/Pages/shared/Services/HelpCenterService.service.js +10 -7
- package/esm2015/lib/Pages/shared/Services/ImpersonationRuleService.service.js +14 -8
- package/esm2015/lib/Pages/shared/Services/LicenseService.service.js +3 -3
- package/esm2015/lib/Pages/shared/Services/LogsService.js +1 -1
- package/esm2015/lib/Pages/shared/Services/LookupGroupsService.service.js +11 -5
- package/esm2015/lib/Pages/shared/Services/LookupService.service.js +31 -15
- package/esm2015/lib/Pages/shared/Services/PermissionSetService.service.js +18 -8
- package/esm2015/lib/Pages/shared/Services/PermissionsService.service.js +12 -9
- package/esm2015/lib/Pages/shared/Services/PublicHolidayService.service.js +9 -3
- package/esm2015/lib/Pages/shared/Services/SectorService.service.js +18 -13
- package/esm2015/lib/Pages/shared/Services/TemplateService.service.js +36 -29
- package/esm2015/lib/Pages/shared/Services/localizationsService.service .js +23 -13
- package/esm2015/lib/Pages/shared/Services/provider.service.js +5 -7
- package/esm2015/lib/Pages/shared/Services/userService.service.js +10 -2
- package/esm2015/lib/Pages/shared/models/AccountModels/forgotPasswordModel.js +6 -0
- package/esm2015/lib/Pages/shared/models/ConfigurationModels/ConfigurationModel.js +1 -1
- package/esm2015/lib/Pages/shared/models/DepartmentModels/DepartmentUsersIDRequestModel.js +1 -1
- package/esm2015/lib/Pages/shared/models/ImpersonationRuleModels/ImpersonationRuleModel.js +1 -1
- package/esm2015/lib/Pages/shared/models/Lookups/LookupItem.js +1 -1
- package/esm2015/lib/Pages/shared/models/Lookups/LookupModel.js +1 -2
- package/esm2015/lib/Pages/shared/models/PermissionsModels/PermissionSetUsersIDRequestModel.js +1 -1
- package/esm2015/lib/Pages/shared/models/SectorModels/SectorDepartmentModel.js +1 -1
- package/esm2015/lib/Pages/users/users.component.js +398 -409
- package/esm2015/lib/masterlayout-routing.module.js +5 -4
- package/esm2015/lib/masterlayout.component.js +22 -32
- package/esm2015/lib/masterlayout.module.js +25 -19
- package/fesm2015/bnsights-bbsf-admin-portal.js +17295 -17401
- package/fesm2015/bnsights-bbsf-admin-portal.js.map +1 -1
- package/lib/Pages/account/account.component.d.ts +5 -1
- package/lib/Pages/account/account.module.d.ts +8 -6
- package/lib/Pages/account/forgot-password/forgot-password.component.d.ts +20 -0
- package/lib/Pages/configurations/configuration/configuration.component.d.ts +39 -31
- package/lib/Pages/departments/department/department.component.d.ts +19 -15
- package/lib/Pages/departments/department-info/department-info.component.d.ts +31 -28
- package/lib/Pages/helpCenter/help-center/help-center.component.d.ts +34 -32
- package/lib/Pages/helpCenter/help-center-secondlevel/help-center-secondlevel.component.d.ts +31 -34
- package/lib/Pages/helpCenter/help-center-thirdlevel/help-center-thirdlevel.component.d.ts +30 -35
- package/lib/Pages/home/home.component.d.ts +4 -4
- package/lib/Pages/impersonation-rules/impersonation-rules/impersonation-rules.component.d.ts +43 -42
- package/lib/Pages/jobs/jobs/jobs.component.d.ts +56 -62
- package/lib/Pages/license/license/license.component.d.ts +25 -23
- package/lib/Pages/localizations/localizations.component.d.ts +77 -65
- package/lib/Pages/logs/log/log.component.d.ts +7 -11
- package/lib/Pages/lookups/lookup/lookup.component.d.ts +64 -59
- package/lib/Pages/lookups/lookup-group/lookup-group.component.d.ts +44 -45
- package/lib/Pages/lookups/lookup-item/lookup-item.component.d.ts +62 -56
- package/lib/Pages/notifications/add/add.component.d.ts +13 -11
- package/lib/Pages/notifications/edit/edit.component.d.ts +14 -14
- package/lib/Pages/notifications/edit-email/edit-email.component.d.ts +18 -20
- package/lib/Pages/notifications/edit-sms/edit-sms.component.d.ts +15 -16
- package/lib/Pages/notifications/master-layouts/master-layouts.component.d.ts +24 -25
- package/lib/Pages/notifications/notifications.module.d.ts +15 -16
- package/lib/Pages/notifications/template-info/template-info.component.d.ts +32 -32
- package/lib/Pages/notifications/templates/templates.component.d.ts +54 -46
- package/lib/Pages/providers/provider/provider.component.d.ts +13 -12
- package/lib/Pages/publicHolidays/public-holiday/public-holiday.component.d.ts +29 -27
- package/lib/Pages/roles/permission-set-info/permission-set-info.component.d.ts +39 -40
- package/lib/Pages/roles/permissions/permissions.component.d.ts +49 -54
- package/lib/Pages/roles/permissionsets/permissionsets.component.d.ts +53 -55
- package/lib/Pages/sectors/department-info/department-info.component.d.ts +41 -44
- package/lib/Pages/sectors/sector/sector.component.d.ts +35 -33
- package/lib/Pages/sectors/sector-info/sector-info.component.d.ts +40 -44
- package/lib/Pages/shared/Enums/ConfigurationScope.d.ts +5 -0
- package/lib/Pages/shared/Enums/ConfigurationType.d.ts +6 -0
- package/lib/Pages/shared/Enums/ConfigurationValueSource.d.ts +4 -0
- package/lib/Pages/shared/Enums/ParticipantType.d.ts +6 -0
- package/lib/Pages/shared/Services/AccountService.service.d.ts +10 -0
- package/lib/Pages/shared/Services/ConfigurationsService.service.d.ts +7 -8
- package/lib/Pages/shared/Services/DepartmentService.service.d.ts +2 -2
- package/lib/Pages/shared/Services/EmailHeaderAndFooterTemplateService.Service.d.ts +5 -5
- package/lib/Pages/shared/Services/HelpCenterService.service.d.ts +2 -1
- package/lib/Pages/shared/Services/ImpersonationRuleService.service.d.ts +5 -5
- package/lib/Pages/shared/Services/LicenseService.service.d.ts +2 -2
- package/lib/Pages/shared/Services/LookupGroupsService.service.d.ts +4 -4
- package/lib/Pages/shared/Services/LookupService.service.d.ts +14 -11
- package/lib/Pages/shared/Services/PermissionSetService.service.d.ts +8 -7
- package/lib/Pages/shared/Services/PermissionsService.service.d.ts +5 -6
- package/lib/Pages/shared/Services/PublicHolidayService.service.d.ts +2 -2
- package/lib/Pages/shared/Services/SectorService.service.d.ts +7 -7
- package/lib/Pages/shared/Services/TemplateService.service.d.ts +20 -19
- package/lib/Pages/shared/Services/localizationsService.service .d.ts +12 -11
- package/lib/Pages/shared/Services/provider.service.d.ts +1 -1
- package/lib/Pages/shared/Services/userService.service.d.ts +2 -0
- package/lib/Pages/shared/models/AccountModels/forgotPasswordModel.d.ts +3 -0
- package/lib/Pages/shared/models/ConfigurationModels/ConfigurationModel.d.ts +0 -1
- package/lib/Pages/shared/models/DepartmentModels/DepartmentUsersIDRequestModel.d.ts +1 -1
- package/lib/Pages/shared/models/ImpersonationRuleModels/ImpersonationRuleModel.d.ts +0 -2
- package/lib/Pages/shared/models/Lookups/LookupModel.d.ts +1 -1
- package/lib/Pages/shared/models/PermissionsModels/PermissionSetUsersIDRequestModel.d.ts +1 -1
- package/lib/Pages/shared/models/SectorModels/SectorDepartmentModel.d.ts +1 -1
- package/lib/Pages/users/users.component.d.ts +54 -68
- package/lib/masterlayout.component.d.ts +4 -5
- package/lib/masterlayout.module.d.ts +8 -9
- package/package.json +5 -3
- package/src/lib/assets/sass/core/components/_variables.scss +1 -1
- package/src/lib/assets/sass/custom-styles-rtl.scss +5 -0
- package/src/lib/assets/sass/custom-styles.scss +153 -0
- package/src/lib/assets/sass/style-rtl.scss +2 -0
- package/src/lib/assets/sass/style.scss +2 -2
- package/bnsights-bbsf-admin-portal-0.0.1.tgz +0 -0
- package/bnsights-bbsf-admin-portal-1.0.0.tgz +0 -0
- package/esm2015/lib/Pages/notifications/edit-template/edit-template.component.js +0 -35
- package/lib/Pages/notifications/edit-template/edit-template.component.d.ts +0 -35
|
@@ -1,268 +1,209 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
1
|
import { Component, ViewChild } from '@angular/core';
|
|
3
2
|
import { FormGroup } from '@angular/forms';
|
|
4
3
|
import { FilterItem, FilterType, InputType, PagingOptions, TextBoxOptions } from '@bnsights/bbsf-controls';
|
|
5
4
|
import { PageInfoService } from '../../../_metronic/core/services/page-info.service';
|
|
6
5
|
import { JobCountsModel } from '../../shared/models/JobModels/JobCountsModel';
|
|
7
6
|
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "
|
|
9
|
-
import * as i2 from "
|
|
7
|
+
import * as i1 from "../../../_metronic/core/services/page-info.service";
|
|
8
|
+
import * as i2 from "@bnsights/bbsf-utilities";
|
|
10
9
|
import * as i3 from "./../../shared/Services/JobsService.service";
|
|
11
10
|
import * as i4 from "ng-block-ui";
|
|
12
11
|
import * as i5 from "@bnsights/bbsf-controls";
|
|
13
12
|
import * as i6 from "../../empty-data/empty-data.component";
|
|
14
13
|
import * as i7 from "@ng-bootstrap/ng-bootstrap";
|
|
15
14
|
import * as i8 from "@angular/common";
|
|
16
|
-
import * as i9 from "@angular/forms";
|
|
17
15
|
export class JobsComponent {
|
|
18
|
-
|
|
19
|
-
constructor(authService, pageInfoService, utilityService, bbsfTranslateService, environmentService, JobsService) {
|
|
20
|
-
this.authService = authService;
|
|
16
|
+
constructor(pageInfoService, utilityService, environmentService, jobsService, requestHandlerService) {
|
|
21
17
|
this.pageInfoService = pageInfoService;
|
|
22
18
|
this.utilityService = utilityService;
|
|
23
|
-
this.bbsfTranslateService = bbsfTranslateService;
|
|
24
19
|
this.environmentService = environmentService;
|
|
25
|
-
this.
|
|
26
|
-
this.
|
|
27
|
-
|
|
28
|
-
this.
|
|
29
|
-
this.
|
|
30
|
-
this.
|
|
20
|
+
this.jobsService = jobsService;
|
|
21
|
+
this.requestHandlerService = requestHandlerService;
|
|
22
|
+
//Page requirements
|
|
23
|
+
this.ApiUrl = this.jobsService.ApiUrl;
|
|
24
|
+
this.jobCountsModel = new JobCountsModel();
|
|
25
|
+
this.productionMode = false;
|
|
26
|
+
this.isStatisticsLoaded = false;
|
|
27
|
+
//Filter and paging Enqueued Jobs component
|
|
28
|
+
this.enqueuedForm = new FormGroup({});
|
|
31
29
|
this.showEnqueuedFilter = false;
|
|
32
|
-
this.
|
|
33
|
-
this.
|
|
34
|
-
this.
|
|
35
|
-
|
|
36
|
-
this.
|
|
37
|
-
this.
|
|
38
|
-
this.
|
|
39
|
-
|
|
40
|
-
this.
|
|
41
|
-
this.
|
|
42
|
-
this.
|
|
43
|
-
|
|
44
|
-
this.
|
|
45
|
-
this.
|
|
46
|
-
this.
|
|
47
|
-
|
|
48
|
-
this.
|
|
49
|
-
this.
|
|
30
|
+
this.enqueuedPagingResult = [];
|
|
31
|
+
this.filteredEnqueuedPagingResult = [];
|
|
32
|
+
this.isEnqueuedFilterLoaded = false;
|
|
33
|
+
//Filter and paging Scheduled Jobs component
|
|
34
|
+
this.scheduledForm = new FormGroup({});
|
|
35
|
+
this.scheduledPagingResult = [];
|
|
36
|
+
this.isScheduledFilterLoaded = false;
|
|
37
|
+
//Filter and paging Processing Jobs component
|
|
38
|
+
this.processingForm = new FormGroup({});
|
|
39
|
+
this.processingPagingResult = [];
|
|
40
|
+
this.isProcessingFilterLoaded = false;
|
|
41
|
+
//Filter and paging Succeeded Jobs component
|
|
42
|
+
this.succeededForm = new FormGroup({});
|
|
43
|
+
this.succeededPagingResult = [];
|
|
44
|
+
this.isSucceededFilterLoaded = false;
|
|
45
|
+
//Filter and paging Failed Jobs component
|
|
46
|
+
this.failedForm = new FormGroup({});
|
|
47
|
+
this.failedPagingResult = [];
|
|
48
|
+
this.isFailedFilterLoaded = false;
|
|
49
|
+
//Filter and paging Deleted Jobs component
|
|
50
|
+
this.deletedForm = new FormGroup({});
|
|
51
|
+
this.deletedPagingResult = [];
|
|
52
|
+
this.isDeletedFilterLoaded = false;
|
|
50
53
|
}
|
|
51
54
|
ngOnInit() {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
this.ProductionMode = this.environmentService.getProductionMode();
|
|
66
|
-
this.LoadStatistics();
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
ReinitializeEnqueuedPaging() {
|
|
70
|
-
let element = this.EnqueuedInput;
|
|
71
|
-
element.ReinitializePaging();
|
|
72
|
-
}
|
|
73
|
-
UpdateEnqueuedPaging() {
|
|
74
|
-
let element = this.EnqueuedInput;
|
|
75
|
-
element.UpdatePaging();
|
|
76
|
-
}
|
|
55
|
+
//Page header (breadcrumb and title)
|
|
56
|
+
PageInfoService.PageTitle = this.utilityService.getResourceValue("Jobs");
|
|
57
|
+
PageInfoService.PageBreadcrumbs = [
|
|
58
|
+
{ title: this.utilityService.getResourceValue("Home"), path: '/Admin/Home', isSeparator: false, isActive: false },
|
|
59
|
+
{ title: '', path: '', isSeparator: true, isActive: false }
|
|
60
|
+
];
|
|
61
|
+
this.pageInfoService.calculateTitle();
|
|
62
|
+
this.pageInfoService.calculateBreadcrumbs();
|
|
63
|
+
this.productionMode = this.environmentService.getProductionMode();
|
|
64
|
+
//initialize page
|
|
65
|
+
this.loadStatistics();
|
|
66
|
+
}
|
|
67
|
+
// Enqueued Paging functions
|
|
77
68
|
setEnqueuedListResult(result) {
|
|
78
|
-
this.
|
|
79
|
-
this.
|
|
69
|
+
this.enqueuedPagingResult = result;
|
|
70
|
+
this.filteredEnqueuedPagingResult = this.enqueuedPagingResult;
|
|
80
71
|
}
|
|
72
|
+
//Filter functions
|
|
81
73
|
resetFilters() {
|
|
82
|
-
this.
|
|
83
|
-
let element = this.
|
|
84
|
-
element.ReinitializePaging();
|
|
85
|
-
}
|
|
86
|
-
ReinitializeScheduledPaging() {
|
|
87
|
-
let element = this.ScheduledInput;
|
|
74
|
+
this.enqueuedForm.controls["searchTextBox"].setValue(null);
|
|
75
|
+
let element = this.enqueuedInput;
|
|
88
76
|
element.ReinitializePaging();
|
|
89
77
|
}
|
|
90
|
-
|
|
91
|
-
let element = this.ScheduledInput;
|
|
92
|
-
element.UpdatePaging();
|
|
93
|
-
}
|
|
78
|
+
//Scheduled Paging functions
|
|
94
79
|
setScheduledListResult(result) {
|
|
95
|
-
this.
|
|
96
|
-
this.utilityService.stopBlockUI();
|
|
97
|
-
}
|
|
98
|
-
ReinitializeProcessingPaging() {
|
|
99
|
-
let element = this.ProcessingInput;
|
|
100
|
-
element.ReinitializePaging();
|
|
101
|
-
}
|
|
102
|
-
UpdateProcessingPaging() {
|
|
103
|
-
let element = this.ProcessingInput;
|
|
104
|
-
element.UpdatePaging();
|
|
80
|
+
this.scheduledPagingResult = result;
|
|
105
81
|
}
|
|
82
|
+
//Processing Paging functions
|
|
106
83
|
setProcessingListResult(result) {
|
|
107
|
-
this.
|
|
108
|
-
this.utilityService.stopBlockUI();
|
|
109
|
-
}
|
|
110
|
-
ReinitializeSucceededPaging() {
|
|
111
|
-
let element = this.SucceededInput;
|
|
112
|
-
element.ReinitializePaging();
|
|
113
|
-
}
|
|
114
|
-
UpdateSucceededPaging() {
|
|
115
|
-
let element = this.SucceededInput;
|
|
116
|
-
element.UpdatePaging();
|
|
84
|
+
this.processingPagingResult = result;
|
|
117
85
|
}
|
|
86
|
+
//Succeeded Paging functions
|
|
118
87
|
setSucceededListResult(result) {
|
|
119
|
-
this.
|
|
120
|
-
this.utilityService.stopBlockUI();
|
|
121
|
-
}
|
|
122
|
-
ReinitializeFailedPaging() {
|
|
123
|
-
let element = this.FailedInput;
|
|
124
|
-
element.ReinitializePaging();
|
|
125
|
-
}
|
|
126
|
-
UpdateFailedPaging() {
|
|
127
|
-
let element = this.FailedInput;
|
|
128
|
-
element.UpdatePaging();
|
|
88
|
+
this.succeededPagingResult = result;
|
|
129
89
|
}
|
|
90
|
+
//Failed Paging functions
|
|
130
91
|
setFailedListResult(result) {
|
|
131
|
-
this.
|
|
132
|
-
this.utilityService.stopBlockUI();
|
|
133
|
-
}
|
|
134
|
-
ReinitializeDeletedPaging() {
|
|
135
|
-
let element = this.DeletedInput;
|
|
136
|
-
element.ReinitializePaging();
|
|
137
|
-
}
|
|
138
|
-
UpdateDeletedPaging() {
|
|
139
|
-
let element = this.DeletedInput;
|
|
140
|
-
element.UpdatePaging();
|
|
92
|
+
this.failedPagingResult = result;
|
|
141
93
|
}
|
|
94
|
+
//Deleted Paging functions
|
|
142
95
|
setDeletedListResult(result) {
|
|
143
|
-
this.
|
|
144
|
-
this.utilityService.stopBlockUI();
|
|
96
|
+
this.deletedPagingResult = result;
|
|
145
97
|
}
|
|
146
|
-
|
|
147
|
-
|
|
98
|
+
//initialize page
|
|
99
|
+
loadStatistics() {
|
|
100
|
+
this.jobsService.LoadStatistics().subscribe((result) => {
|
|
148
101
|
let Lists = result;
|
|
149
|
-
this.
|
|
150
|
-
this.
|
|
151
|
-
this.
|
|
152
|
-
this.
|
|
153
|
-
this.
|
|
154
|
-
this.
|
|
155
|
-
|
|
156
|
-
this.IsStatisticsLoaded = true;
|
|
157
|
-
}, 10);
|
|
102
|
+
this.jobCountsModel.Enqueued = Lists.enqueued;
|
|
103
|
+
this.jobCountsModel.Succeeded = Lists.succeeded;
|
|
104
|
+
this.jobCountsModel.Scheduled = Lists.scheduled;
|
|
105
|
+
this.jobCountsModel.Processing = Lists.processing;
|
|
106
|
+
this.jobCountsModel.Failed = Lists.failed;
|
|
107
|
+
this.jobCountsModel.Deleted = Lists.deleted;
|
|
108
|
+
this.isStatisticsLoaded = true;
|
|
158
109
|
});
|
|
159
110
|
}
|
|
160
|
-
|
|
161
|
-
this.
|
|
162
|
-
this.
|
|
163
|
-
this.
|
|
164
|
-
this.
|
|
165
|
-
this.
|
|
166
|
-
this.
|
|
167
|
-
this.utilityService.startBlockUI;
|
|
111
|
+
loadEnqueuedJobs() {
|
|
112
|
+
this.isEnqueuedFilterLoaded = false;
|
|
113
|
+
this.isScheduledFilterLoaded = false;
|
|
114
|
+
this.isProcessingFilterLoaded = false;
|
|
115
|
+
this.isSucceededFilterLoaded = false;
|
|
116
|
+
this.isFailedFilterLoaded = false;
|
|
117
|
+
this.isDeletedFilterLoaded = false;
|
|
168
118
|
// TextBox inti
|
|
169
119
|
this.searchTextBox = new TextBoxOptions();
|
|
170
120
|
this.searchTextBox.Name = "searchTextBox";
|
|
171
121
|
this.searchTextBox.HideLabel = true;
|
|
172
122
|
this.searchTextBox.Type = InputType.Text;
|
|
173
123
|
this.searchTextBox.Placeholder = this.utilityService.getResourceValue("SearchByName");
|
|
174
|
-
this.
|
|
175
|
-
this.
|
|
176
|
-
this.
|
|
177
|
-
this.
|
|
178
|
-
this.
|
|
179
|
-
this.
|
|
180
|
-
this.
|
|
181
|
-
this.
|
|
182
|
-
this.
|
|
183
|
-
this.
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
this.
|
|
190
|
-
this.
|
|
191
|
-
this.
|
|
192
|
-
this.
|
|
193
|
-
this.
|
|
194
|
-
this.
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
this.
|
|
198
|
-
this.
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
this.
|
|
205
|
-
this.
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
this.
|
|
209
|
-
this.
|
|
210
|
-
this.
|
|
211
|
-
this.
|
|
212
|
-
this.
|
|
213
|
-
this.
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
this.
|
|
220
|
-
this.
|
|
221
|
-
this.
|
|
222
|
-
this.
|
|
223
|
-
this.
|
|
224
|
-
this.
|
|
225
|
-
this.
|
|
226
|
-
this.
|
|
227
|
-
this.
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
this.
|
|
235
|
-
this.
|
|
236
|
-
this.
|
|
237
|
-
this.
|
|
238
|
-
this.
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
this.
|
|
253
|
-
this.IsFailedFilterLoaded = false;
|
|
254
|
-
this.IsDeletedFilterLoaded = false;
|
|
255
|
-
this.utilityService.startBlockUI;
|
|
256
|
-
this.DeletedPaging = new PagingOptions();
|
|
257
|
-
this.DeletedPaging.ActionPostURL = this.environmentService.getApiUrl() + this.ApiUrl + 'GetDeletedListByFilter';
|
|
258
|
-
this.DeletedPaging.ValidationToken = this.authService.authorizationHeaderValue();
|
|
259
|
-
setTimeout(() => {
|
|
260
|
-
this.IsDeletedFilterLoaded = true;
|
|
261
|
-
}, 10);
|
|
124
|
+
this.enqueuedTextInputFilter = new FilterItem();
|
|
125
|
+
this.enqueuedTextInputFilter.FormControlName = "searchTextBox";
|
|
126
|
+
this.enqueuedTextInputFilter.ActionParameterName = "searchText";
|
|
127
|
+
this.enqueuedTextInputFilter.IsFormControl = true;
|
|
128
|
+
this.enqueuedTextInputFilter.FilterType = FilterType.TextBox;
|
|
129
|
+
this.enqueuedPaging = new PagingOptions();
|
|
130
|
+
this.enqueuedPaging.ActionPostURL = this.ApiUrl + 'GetQueueListByFilter';
|
|
131
|
+
this.enqueuedPaging.OnKeyPressFiltersControlNames = ["searchTextBox"];
|
|
132
|
+
this.enqueuedPaging.Filters = [this.enqueuedTextInputFilter];
|
|
133
|
+
this.isEnqueuedFilterLoaded = true;
|
|
134
|
+
}
|
|
135
|
+
loadScheduledJobs() {
|
|
136
|
+
this.isEnqueuedFilterLoaded = false;
|
|
137
|
+
this.isScheduledFilterLoaded = false;
|
|
138
|
+
this.isProcessingFilterLoaded = false;
|
|
139
|
+
this.isSucceededFilterLoaded = false;
|
|
140
|
+
this.isFailedFilterLoaded = false;
|
|
141
|
+
this.isDeletedFilterLoaded = false;
|
|
142
|
+
this.scheduledPaging = new PagingOptions();
|
|
143
|
+
this.scheduledPaging.ActionPostURL = this.ApiUrl + 'GetScheduledListByFilter';
|
|
144
|
+
this.isScheduledFilterLoaded = true;
|
|
145
|
+
}
|
|
146
|
+
loadProcessingJobs() {
|
|
147
|
+
this.isEnqueuedFilterLoaded = false;
|
|
148
|
+
this.isScheduledFilterLoaded = false;
|
|
149
|
+
this.isProcessingFilterLoaded = false;
|
|
150
|
+
this.isSucceededFilterLoaded = false;
|
|
151
|
+
this.isFailedFilterLoaded = false;
|
|
152
|
+
this.isDeletedFilterLoaded = false;
|
|
153
|
+
this.processingPaging = new PagingOptions();
|
|
154
|
+
this.processingPaging.ActionPostURL = this.ApiUrl + 'GetProcessingListByFilter';
|
|
155
|
+
this.isProcessingFilterLoaded = true;
|
|
156
|
+
}
|
|
157
|
+
loadSucceededJobs() {
|
|
158
|
+
this.isEnqueuedFilterLoaded = false;
|
|
159
|
+
this.isScheduledFilterLoaded = false;
|
|
160
|
+
this.isProcessingFilterLoaded = false;
|
|
161
|
+
this.isSucceededFilterLoaded = false;
|
|
162
|
+
this.isFailedFilterLoaded = false;
|
|
163
|
+
this.isDeletedFilterLoaded = false;
|
|
164
|
+
this.succeededPaging = new PagingOptions();
|
|
165
|
+
this.succeededPaging.ActionPostURL = this.ApiUrl + 'GetSucceededListByFilter';
|
|
166
|
+
this.isSucceededFilterLoaded = true;
|
|
167
|
+
}
|
|
168
|
+
loadFailedJobs() {
|
|
169
|
+
this.isEnqueuedFilterLoaded = false;
|
|
170
|
+
this.isScheduledFilterLoaded = false;
|
|
171
|
+
this.isProcessingFilterLoaded = false;
|
|
172
|
+
this.isSucceededFilterLoaded = false;
|
|
173
|
+
this.isFailedFilterLoaded = false;
|
|
174
|
+
this.isDeletedFilterLoaded = false;
|
|
175
|
+
this.failedPaging = new PagingOptions();
|
|
176
|
+
this.failedPaging.ActionPostURL = this.ApiUrl + 'GetFailedListByFilter';
|
|
177
|
+
this.isFailedFilterLoaded = true;
|
|
178
|
+
}
|
|
179
|
+
loadDeletedJobs() {
|
|
180
|
+
this.isEnqueuedFilterLoaded = false;
|
|
181
|
+
this.isScheduledFilterLoaded = false;
|
|
182
|
+
this.isProcessingFilterLoaded = false;
|
|
183
|
+
this.isSucceededFilterLoaded = false;
|
|
184
|
+
this.isFailedFilterLoaded = false;
|
|
185
|
+
this.isDeletedFilterLoaded = false;
|
|
186
|
+
this.deletedPaging = new PagingOptions();
|
|
187
|
+
this.deletedPaging.ActionPostURL = this.ApiUrl + 'GetDeletedListByFilter';
|
|
188
|
+
this.isDeletedFilterLoaded = true;
|
|
189
|
+
}
|
|
190
|
+
/**FunctionName:filterEnqueuedList*/
|
|
191
|
+
/**Declaration:function to filter EnqueuedList in client-side */
|
|
192
|
+
/**Parameters:*/
|
|
193
|
+
/**searchValue: current value of search box*/
|
|
194
|
+
filterEnqueuedList(searchValue) {
|
|
195
|
+
if (searchValue)
|
|
196
|
+
this.filteredEnqueuedPagingResult = this.enqueuedPagingResult.filter(item => item.job.toLowerCase().includes(searchValue.toLowerCase()));
|
|
197
|
+
else
|
|
198
|
+
this.filteredEnqueuedPagingResult = this.enqueuedPagingResult;
|
|
199
|
+
}
|
|
200
|
+
///////////Destroy Observable //////////////////////
|
|
201
|
+
ngOnDestroy() {
|
|
202
|
+
this.requestHandlerService.destroyHandler();
|
|
262
203
|
}
|
|
263
204
|
}
|
|
264
|
-
JobsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: JobsComponent, deps: [{ token: i1.
|
|
265
|
-
JobsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.13", type: JobsComponent, selector: "lib-jobs", viewQueries: [{ propertyName: "EnqueuedInput", first: true, predicate: ["EnqueuedPagingViewElement"], descendants: true }, { propertyName: "ScheduledInput", first: true, predicate: ["ScheduledPagingViewElement"], descendants: true }, { propertyName: "ProcessingInput", first: true, predicate: ["ProcessingPagingViewElement"], descendants: true }, { propertyName: "SucceededInput", first: true, predicate: ["SucceededPagingViewElement"], descendants: true }, { propertyName: "FailedInput", first: true, predicate: ["FailedPagingViewElement"], descendants: true }, { propertyName: "DeletedInput", first: true, predicate: ["DeletedPagingViewElement"], descendants: true }], ngImport: i0, template: "<block-ui> </block-ui>\r\n <div class=\"container-fluid\">\r\n <div class=\"card card-custom-h\">\r\n <div class=\"card-body\">\r\n <ul ngbNav #nav=\"ngbNav\" class=\"nav nav-stretch nav-line-tabs nav-line-tabs-2x border-transparent fs-5 fw-bolder\">\r\n <li ngbNavItem class=\"nav-item mt-2\">\r\n <a ngbNavLink class=\"nav-link text-active-primary ms-0 me-10 py-5\" (click)=\"LoadEnqueuedJobs()\">{{utilityService.getResourceValue(\"Enqueued\")}}({{JobCountsModel.Enqueued}})</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"card\">\r\n <div class=\"card-header border-0 pt-5 px-0 justify-content-end\">\r\n <div class=\"card-title\" *ngIf=\"IsEnqueuedFilterLoaded\">\r\n <form [formGroup]=\"EnqueuedForm\">\r\n <BBSF-TextBox [options]=\"searchTextBox\" [group]=\"EnqueuedForm\"></BBSF-TextBox>\r\n </form>\r\n </div>\r\n </div>\r\n <div class=\"card-body py-3 px-0\">\r\n <!--begin::Permission list-->\r\n <div class=\"table-responsive\">\r\n <!-- begin::Table -->\r\n <table class=\"table align-middle table-row-dashed fs-6 gy-5 dataTable no-footer\">\r\n <thead>\r\n <tr class=\"text-start text-gray-400 fw-bolder fs-7 text-uppercase gs-0\">\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"Job\")}}</th>\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"State\")}}</th>\r\n </tr>\r\n </thead>\r\n <tbody id=\"listingContainer\" class=\"fw-bold text-gray-600 border-0\">\r\n <tr *ngFor=\"let job of EnqueuedPagingResult\">\r\n <td class=\"text-dark\">{{job.job}}</td>\r\n <td>{{job.state}}</td>\r\n </tr>\r\n <tr *ngIf=\"EnqueuedPagingResult.length == 0\">\r\n <td colspan=\"2\">\r\n <lib-empty-data></lib-empty-data>\r\n </td>\r\n </tr>\r\n\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"card-footer border-0\">\r\n <BBSF-Paging (Items)=\"setEnqueuedListResult($event)\" *ngIf=\"IsEnqueuedFilterLoaded\"\r\n [options]=\"EnqueuedPaging\" [group]=\"EnqueuedForm\" #EnqueuedPagingViewElement>\r\n </BBSF-Paging>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </li>\r\n <li ngbNavItem class=\"nav-item mt-2\">\r\n <a ngbNavLink class=\"nav-link text-active-primary ms-0 me-10 py-5\" (click)=\"LoadScheduledJobs()\">{{utilityService.getResourceValue(\"Scheduled\")}}({{JobCountsModel.Scheduled}})</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"card\">\r\n <div class=\"card-body py-3 px-0\">\r\n <!--begin::Permission list-->\r\n <div class=\"table-responsive\">\r\n <!-- begin::Table -->\r\n <table class=\"table align-middle table-row-dashed fs-6 gy-5 dataTable no-footer\">\r\n <thead>\r\n <tr class=\"text-start text-gray-400 fw-bolder fs-7 text-uppercase gs-0\">\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"Job\")}}</th>\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"Enqueued\")}}</th>\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"Scheduled\")}}</th>\r\n </tr>\r\n </thead>\r\n <tbody id=\"listingContainer\" class=\"fw-bold text-gray-600 border-0\">\r\n <tr *ngFor=\"let job of ScheduledPagingResult\">\r\n <td>{{job.job}}</td>\r\n <td>{{job.enqueueAt}}</td>\r\n <td>{{job.scheduledAt}}</td>\r\n </tr>\r\n <tr *ngIf=\"ScheduledPagingResult.length == 0\">\r\n <td colspan=\"3\">\r\n <lib-empty-data></lib-empty-data>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"card-footer border-0\">\r\n <BBSF-Paging (Items)=\"setScheduledListResult($event)\" *ngIf=\"IsScheduledFilterLoaded\"\r\n [options]=\"ScheduledPaging\" [group]=\"ScheduledForm\" #ScheduledPagingViewElement>\r\n </BBSF-Paging>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </li>\r\n <li ngbNavItem class=\"nav-item mt-2\">\r\n <a ngbNavLink class=\"nav-link text-active-primary ms-0 me-10 py-5\" (click)=\"LoadProcessingJobs()\">{{utilityService.getResourceValue(\"Processing\")}}({{JobCountsModel.Processing}})</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"card\">\r\n <div class=\"card-body py-3 px-0\">\r\n <!--begin::Permission list-->\r\n <div class=\"table-responsive\">\r\n <!-- begin::Table -->\r\n <table class=\"table align-middle table-row-dashed fs-6 gy-5 dataTable no-footer\">\r\n <thead>\r\n <tr class=\"text-start text-gray-400 fw-bolder fs-7 text-uppercase gs-0\">\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"Job\")}}</th>\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"StartedAt\")}}</th>\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"ServerId\")}}</th>\r\n </tr>\r\n </thead>\r\n <tbody id=\"listingContainer\" class=\"fw-bold text-gray-600 border-0\">\r\n <tr *ngFor=\"let job of ProcessingPagingResult\">\r\n <td>{{job.job}}</td>\r\n <td>{{job.startedAt}}</td>\r\n <td>{{job.serverId}}</td>\r\n </tr>\r\n <tr *ngIf=\"ProcessingPagingResult.length == 0\">\r\n <td colspan=\"3\">\r\n <lib-empty-data></lib-empty-data>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"card-footer border-0\">\r\n <BBSF-Paging (Items)=\"setProcessingListResult($event)\" *ngIf=\"IsProcessingFilterLoaded\"\r\n [options]=\"ProcessingPaging\" [group]=\"ProcessingForm\" #ProcessingPagingViewElement>\r\n </BBSF-Paging>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </li>\r\n <li ngbNavItem class=\"nav-item mt-2\">\r\n <a ngbNavLink class=\"nav-link text-active-primary ms-0 me-10 py-5\" (click)=\"LoadSucceededJobs()\">{{utilityService.getResourceValue(\"Succeeded\")}}({{JobCountsModel.Succeeded}})</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"card\">\r\n <div class=\"card-body py-3 px-0\">\r\n <div class=\"table-responsive\">\r\n <!-- begin::Table -->\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-150\">{{utilityService.getResourceValue(\"Job\")}}</th>\r\n <th class=\"min-w-150\">{{utilityService.getResourceValue(\"SucceededAt\")}}</th>\r\n <th class=\"min-w-150\">{{utilityService.getResourceValue(\"TotalDuration\")}}</th>\r\n </tr>\r\n </thead>\r\n <tbody id=\"listingContainer\" class=\"fw-bold text-gray-600 border-0\">\r\n <tr *ngFor=\"let job of SucceededPagingResult\">\r\n <td>{{job.job}}</td>\r\n <td>{{job.succeededAt}}</td>\r\n <td>{{job.totalDuration}}</td>\r\n </tr>\r\n <tr *ngIf=\"SucceededPagingResult.length == 0\">\r\n <td colspan=\"3\">\r\n <lib-empty-data></lib-empty-data>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n </div>\r\n <div class=\"card-footer border-0\">\r\n <BBSF-Paging (Items)=\"setSucceededListResult($event)\" *ngIf=\"IsSucceededFilterLoaded\"\r\n [options]=\"SucceededPaging\" [group]=\"SucceededForm\" #SucceededPagingViewElement>\r\n </BBSF-Paging>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </li>\r\n <li ngbNavItem class=\"nav-item mt-2\">\r\n <a ngbNavLink class=\"nav-link text-active-primary ms-0 me-10 py-5\" (click)=\"LoadFailedJobs()\">{{utilityService.getResourceValue(\"Failed\")}}({{JobCountsModel.Failed}})</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"card\">\r\n <div class=\"card-body py-3 px-0\">\r\n <div class=\"table-responsive\">\r\n <!-- begin::Table -->\r\n <table class=\"table align-middle table-row-dashed fs-6 gy-5 dataTable no-footer\">\r\n <thead>\r\n <tr class=\"text-start text-gray-400 fw-bolder fs-7 text-uppercase gs-0\">\r\n <th class=\"min-w-150\">{{utilityService.getResourceValue(\"FailedAt\")}}</th>\r\n <th class=\"min-w-150\">{{utilityService.getResourceValue(\"Job\")}}</th>\r\n <th class=\"min-w-150\">{{utilityService.getResourceValue(\"ErrorMessage\")}}</th>\r\n <th class=\"min-w-150\">{{utilityService.getResourceValue(\"ErrorMessage\")}}</th>\r\n </tr>\r\n </thead>\r\n <tbody id=\"listingContainer\" class=\"fw-bold text-gray-600 border-0\">\r\n <tr *ngFor=\"let job of FailedPagingResult\">\r\n <td>{{job.failedAt}}</td>\r\n <td>{{job.job}}</td>\r\n <td>{{job.reason}}</td>\r\n <td class=\"failed-job-details directionLtr\" *ngIf=\"job.inFailedState\">\r\n <div class=\"expandable\">\r\n <p> {{job.exceptionType}}</p>\r\n <p class=\"text-muted\">\r\n {{job.exceptionMessage}}\r\n </p>\r\n\r\n </div>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"FailedPagingResult.length == 0\">\r\n <td colspan=\"4\">\r\n <lib-empty-data></lib-empty-data>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"card-footer border-0\">\r\n <BBSF-Paging (Items)=\"setFailedListResult($event)\" *ngIf=\"IsFailedFilterLoaded\" [options]=\"FailedPaging\"\r\n [group]=\"FailedForm\" #FailedPagingViewElement>\r\n </BBSF-Paging>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </li>\r\n <li ngbNavItem class=\"nav-item mt-2\">\r\n <a ngbNavLink class=\"nav-link text-active-primary ms-0 me-10 py-5\" (click)=\"LoadDeletedJobs()\">{{utilityService.getResourceValue(\"Deleted\")}}({{JobCountsModel.Deleted}})</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"card\">\r\n <div class=\"card-body py-3 px-0\">\r\n <div class=\"table-responsive\">\r\n <!-- begin::Table -->\r\n <table class=\"table align-middle table-row-dashed fs-6 gy-5 dataTable no-footer\">\r\n <thead>\r\n <tr class=\"text-start text-gray-400 fw-bolder fs-7 text-uppercase gs-0\">\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"Job\")}}</th>\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"DeletedAt\")}}</th>\r\n </tr>\r\n </thead>\r\n <tbody id=\"listingContainer\" class=\"fw-bold text-gray-600 border-0\">\r\n <tr *ngFor=\"let job of DeletedPagingResult\">\r\n <td>{{job.job}}</td>\r\n <td>{{job.deletedAt}}</td>\r\n </tr>\r\n <tr *ngIf=\"DeletedPagingResult.length == 0\">\r\n <td colspan=\"2\">\r\n <lib-empty-data></lib-empty-data>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"card-footer border-0\">\r\n <BBSF-Paging (Items)=\"setDeletedListResult($event)\" *ngIf=\"IsDeletedFilterLoaded\"\r\n [options]=\"DeletedPaging\" [group]=\"DeletedForm\" #DeletedPagingViewElement>\r\n </BBSF-Paging>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </li>\r\n </ul>\r\n <div [ngbNavOutlet]=\"nav\"></div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n \r\n\r\n", styles: [".card-deck .card{align-items:center;justify-content:center;text-align:center;border-radius:4px;background:#f8f9fa;cursor:pointer}.card-title{margin-bottom:0;font-size:16px}.filter-container.text-dark .form-group label{color:#3f4254}.kt-portlet.custom-portlet{box-shadow:none;background:#f8f9fa;margin-top:35px}.card-deck .card .card-block{padding:20px}\n"], components: [{ type: i4.BlockUIComponent, selector: "block-ui", inputs: ["name", "template", "message", "delayStart", "delayStop"] }, { type: i5.ɵd, selector: "BBSF-TextBox", inputs: ["group", "options"], outputs: ["OnChange"] }, { type: i6.EmptyDataComponent, selector: "lib-empty-data", inputs: ["Message", "ShowImage", "ImgURL"] }, { type: i5.ɵs, selector: "BBSF-Paging", inputs: ["options", "group"], outputs: ["Items"] }, { type: i7.NgbNavOutlet, selector: "[ngbNavOutlet]", inputs: ["paneRole", "ngbNavOutlet"] }], directives: [{ type: i7.NgbNav, selector: "[ngbNav]", inputs: ["animation", "destroyOnHide", "orientation", "roles", "keyboard", "activeId"], outputs: ["activeIdChange", "shown", "hidden", "navChange"], exportAs: ["ngbNav"] }, { type: i7.NgbNavItem, selector: "[ngbNavItem]", inputs: ["disabled", "domId", "destroyOnHide", "ngbNavItem"], outputs: ["shown", "hidden"], exportAs: ["ngbNavItem"] }, { type: i7.NgbNavLink, selector: "a[ngbNavLink]" }, { type: i7.NgbNavContent, selector: "ng-template[ngbNavContent]" }, { type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i9.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i9.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
|
|
205
|
+
JobsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: JobsComponent, deps: [{ token: i1.PageInfoService }, { token: i2.UtilityService }, { token: i2.EnvironmentService }, { token: i3.JobsService }, { token: i2.RequestHandlerService }], target: i0.ɵɵFactoryTarget.Component });
|
|
206
|
+
JobsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.13", type: JobsComponent, selector: "lib-jobs", viewQueries: [{ propertyName: "enqueuedInput", first: true, predicate: ["EnqueuedPagingViewElement"], descendants: true }, { propertyName: "scheduledInput", first: true, predicate: ["ScheduledPagingViewElement"], descendants: true }, { propertyName: "processingInput", first: true, predicate: ["ProcessingPagingViewElement"], descendants: true }, { propertyName: "succeededInput", first: true, predicate: ["SucceededPagingViewElement"], descendants: true }, { propertyName: "failedInput", first: true, predicate: ["FailedPagingViewElement"], descendants: true }, { propertyName: "deletedInput", first: true, predicate: ["DeletedPagingViewElement"], descendants: true }], ngImport: i0, template: "<block-ui> </block-ui>\r\n <div class=\"container-fluid\">\r\n <div class=\"card card-custom-h\">\r\n <div class=\"card-body\">\r\n <ul ngbNav #nav=\"ngbNav\" class=\"nav nav-stretch nav-line-tabs nav-line-tabs-2x border-transparent fs-5 fw-bolder\">\r\n <li ngbNavItem class=\"nav-item mt-2\">\r\n <a ngbNavLink class=\"nav-link text-active-primary ms-0 me-10 py-5\" (click)=\"loadEnqueuedJobs()\">{{utilityService.getResourceValue(\"Enqueued\")}}({{jobCountsModel.Enqueued}})</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"card\">\r\n <div class=\"card-header border-0 pt-5 px-0 justify-content-end\">\r\n <div class=\"card-title\" *ngIf=\"isEnqueuedFilterLoaded\">\r\n <BBSF-TextBox [options]=\"searchTextBox\" (OnChange)=\"filterEnqueuedList($event)\" [group]=\"enqueuedForm\"></BBSF-TextBox>\r\n </div>\r\n </div>\r\n <div class=\"card-body py-3 px-0\">\r\n <!--begin::Permission list-->\r\n <div class=\"table-responsive\">\r\n <!-- begin::Table -->\r\n <table class=\"table align-middle table-row-dashed fs-6 gy-5 dataTable no-footer\">\r\n <thead>\r\n <tr class=\"text-start text-gray-400 fw-bolder fs-7 text-uppercase gs-0\">\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"Job\")}}</th>\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"State\")}}</th>\r\n </tr>\r\n </thead>\r\n <tbody id=\"listingContainer\" class=\"fw-bold text-gray-600 border-0\">\r\n <tr *ngFor=\"let job of filteredEnqueuedPagingResult\">\r\n <td class=\"text-dark\">{{job.job}}</td>\r\n <td>{{job.state}}</td>\r\n </tr>\r\n <tr *ngIf=\"filteredEnqueuedPagingResult.length == 0\">\r\n <td colspan=\"2\">\r\n <lib-empty-data></lib-empty-data>\r\n </td>\r\n </tr>\r\n\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"card-footer border-0\">\r\n <BBSF-Paging (Items)=\"setEnqueuedListResult($event)\" *ngIf=\"isEnqueuedFilterLoaded\"\r\n [options]=\"enqueuedPaging\" [group]=\"enqueuedForm\" #EnqueuedPagingViewElement>\r\n </BBSF-Paging>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </li>\r\n <li ngbNavItem class=\"nav-item mt-2\">\r\n <a ngbNavLink class=\"nav-link text-active-primary ms-0 me-10 py-5\" (click)=\"loadScheduledJobs()\">{{utilityService.getResourceValue(\"Scheduled\")}}({{jobCountsModel.Scheduled}})</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"card\">\r\n <div class=\"card-body py-3 px-0\">\r\n <!--begin::Permission list-->\r\n <div class=\"table-responsive\">\r\n <!-- begin::Table -->\r\n <table class=\"table align-middle table-row-dashed fs-6 gy-5 dataTable no-footer\">\r\n <thead>\r\n <tr class=\"text-start text-gray-400 fw-bolder fs-7 text-uppercase gs-0\">\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"Job\")}}</th>\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"Enqueued\")}}</th>\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"Scheduled\")}}</th>\r\n </tr>\r\n </thead>\r\n <tbody id=\"listingContainer\" class=\"fw-bold text-gray-600 border-0\">\r\n <tr *ngFor=\"let job of scheduledPagingResult\">\r\n <td>{{job.job}}</td>\r\n <td>{{job.enqueueAt}}</td>\r\n <td>{{job.scheduledAt}}</td>\r\n </tr>\r\n <tr *ngIf=\"scheduledPagingResult.length == 0\">\r\n <td colspan=\"3\">\r\n <lib-empty-data></lib-empty-data>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"card-footer border-0\">\r\n <BBSF-Paging (Items)=\"setScheduledListResult($event)\" *ngIf=\"isScheduledFilterLoaded\"\r\n [options]=\"scheduledPaging\" [group]=\"scheduledForm\" #ScheduledPagingViewElement>\r\n </BBSF-Paging>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </li>\r\n <li ngbNavItem class=\"nav-item mt-2\">\r\n <a ngbNavLink class=\"nav-link text-active-primary ms-0 me-10 py-5\" (click)=\"loadProcessingJobs()\">{{utilityService.getResourceValue(\"Processing\")}}({{jobCountsModel.Processing}})</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"card\">\r\n <div class=\"card-body py-3 px-0\">\r\n <!--begin::Permission list-->\r\n <div class=\"table-responsive\">\r\n <!-- begin::Table -->\r\n <table class=\"table align-middle table-row-dashed fs-6 gy-5 dataTable no-footer\">\r\n <thead>\r\n <tr class=\"text-start text-gray-400 fw-bolder fs-7 text-uppercase gs-0\">\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"Job\")}}</th>\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"StartedAt\")}}</th>\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"ServerId\")}}</th>\r\n </tr>\r\n </thead>\r\n <tbody id=\"listingContainer\" class=\"fw-bold text-gray-600 border-0\">\r\n <tr *ngFor=\"let job of processingPagingResult\">\r\n <td>{{job.job}}</td>\r\n <td>{{job.startedAt}}</td>\r\n <td>{{job.serverId}}</td>\r\n </tr>\r\n <tr *ngIf=\"processingPagingResult.length == 0\">\r\n <td colspan=\"3\">\r\n <lib-empty-data></lib-empty-data>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"card-footer border-0\">\r\n <BBSF-Paging (Items)=\"setProcessingListResult($event)\" *ngIf=\"isProcessingFilterLoaded\"\r\n [options]=\"processingPaging\" [group]=\"processingForm\" #ProcessingPagingViewElement>\r\n </BBSF-Paging>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </li>\r\n <li ngbNavItem class=\"nav-item mt-2\">\r\n <a ngbNavLink class=\"nav-link text-active-primary ms-0 me-10 py-5\" (click)=\"loadSucceededJobs()\">{{utilityService.getResourceValue(\"Succeeded\")}}({{jobCountsModel.Succeeded}})</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"card\">\r\n <div class=\"card-body py-3 px-0\">\r\n <div class=\"table-responsive\">\r\n <!-- begin::Table -->\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-150\">{{utilityService.getResourceValue(\"Job\")}}</th>\r\n <th class=\"min-w-150\">{{utilityService.getResourceValue(\"SucceededAt\")}}</th>\r\n <th class=\"min-w-150\">{{utilityService.getResourceValue(\"TotalDuration\")}}</th>\r\n </tr>\r\n </thead>\r\n <tbody id=\"listingContainer\" class=\"fw-bold text-gray-600 border-0\">\r\n <tr *ngFor=\"let job of succeededPagingResult\">\r\n <td>{{job.job}}</td>\r\n <td>{{job.succeededAt}}</td>\r\n <td>{{job.totalDuration}}</td>\r\n </tr>\r\n <tr *ngIf=\"succeededPagingResult.length == 0\">\r\n <td colspan=\"3\">\r\n <lib-empty-data></lib-empty-data>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n </div>\r\n <div class=\"card-footer border-0\">\r\n <BBSF-Paging (Items)=\"setSucceededListResult($event)\" *ngIf=\"isSucceededFilterLoaded\"\r\n [options]=\"succeededPaging\" [group]=\"succeededForm\" #SucceededPagingViewElement>\r\n </BBSF-Paging>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </li>\r\n <li ngbNavItem class=\"nav-item mt-2\">\r\n <a ngbNavLink class=\"nav-link text-active-primary ms-0 me-10 py-5\" (click)=\"loadFailedJobs()\">{{utilityService.getResourceValue(\"Failed\")}}({{jobCountsModel.Failed}})</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"card\">\r\n <div class=\"card-body py-3 px-0\">\r\n <div class=\"table-responsive\">\r\n <!-- begin::Table -->\r\n <table class=\"table align-middle table-row-dashed fs-6 gy-5 dataTable no-footer\">\r\n <thead>\r\n <tr class=\"text-start text-gray-400 fw-bolder fs-7 text-uppercase gs-0\">\r\n <th class=\"min-w-150\">{{utilityService.getResourceValue(\"FailedAt\")}}</th>\r\n <th class=\"min-w-150\">{{utilityService.getResourceValue(\"Job\")}}</th>\r\n <th class=\"min-w-150\">{{utilityService.getResourceValue(\"ErrorMessage\")}}</th>\r\n <th class=\"min-w-150\">{{utilityService.getResourceValue(\"ErrorMessage\")}}</th>\r\n </tr>\r\n </thead>\r\n <tbody id=\"listingContainer\" class=\"fw-bold text-gray-600 border-0\">\r\n <tr *ngFor=\"let job of failedPagingResult\">\r\n <td>{{job.failedAt}}</td>\r\n <td>{{job.job}}</td>\r\n <td>{{job.reason}}</td>\r\n <td class=\"failed-job-details directionLtr\" *ngIf=\"job.inFailedState\">\r\n <div class=\"expandable\">\r\n <p> {{job.exceptionType}}</p>\r\n <p class=\"text-muted\">\r\n {{job.exceptionMessage}}\r\n </p>\r\n\r\n </div>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"failedPagingResult.length == 0\">\r\n <td colspan=\"4\">\r\n <lib-empty-data></lib-empty-data>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"card-footer border-0\">\r\n <BBSF-Paging (Items)=\"setFailedListResult($event)\" *ngIf=\"isFailedFilterLoaded\" [options]=\"failedPaging\"\r\n [group]=\"failedForm\" #FailedPagingViewElement>\r\n </BBSF-Paging>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </li>\r\n <li ngbNavItem class=\"nav-item mt-2\">\r\n <a ngbNavLink class=\"nav-link text-active-primary ms-0 me-10 py-5\" (click)=\"loadDeletedJobs()\">{{utilityService.getResourceValue(\"Deleted\")}}({{jobCountsModel.Deleted}})</a>\r\n <ng-template ngbNavContent>\r\n <div class=\"card\">\r\n <div class=\"card-body py-3 px-0\">\r\n <div class=\"table-responsive\">\r\n <!-- begin::Table -->\r\n <table class=\"table align-middle table-row-dashed fs-6 gy-5 dataTable no-footer\">\r\n <thead>\r\n <tr class=\"text-start text-gray-400 fw-bolder fs-7 text-uppercase gs-0\">\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"Job\")}}</th>\r\n <th class=\"min-w-150px\">{{utilityService.getResourceValue(\"DeletedAt\")}}</th>\r\n </tr>\r\n </thead>\r\n <tbody id=\"listingContainer\" class=\"fw-bold text-gray-600 border-0\">\r\n <tr *ngFor=\"let job of deletedPagingResult\">\r\n <td>{{job.job}}</td>\r\n <td>{{job.deletedAt}}</td>\r\n </tr>\r\n <tr *ngIf=\"deletedPagingResult.length == 0\">\r\n <td colspan=\"2\">\r\n <lib-empty-data></lib-empty-data>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"card-footer border-0\">\r\n <BBSF-Paging (Items)=\"setDeletedListResult($event)\" *ngIf=\"isDeletedFilterLoaded\"\r\n [options]=\"deletedPaging\" [group]=\"deletedForm\" #DeletedPagingViewElement>\r\n </BBSF-Paging>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </li>\r\n </ul>\r\n <div [ngbNavOutlet]=\"nav\"></div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n \r\n\r\n", styles: [".card-deck .card{align-items:center;justify-content:center;text-align:center;border-radius:4px;background:#f8f9fa;cursor:pointer}.card-title{margin-bottom:0;font-size:16px}.filter-container.text-dark .form-group label{color:#3f4254}.kt-portlet.custom-portlet{box-shadow:none;background:#f8f9fa;margin-top:35px}.card-deck .card .card-block{padding:20px}\n"], components: [{ type: i4.BlockUIComponent, selector: "block-ui", inputs: ["name", "template", "message", "delayStart", "delayStop"] }, { type: i5.ɵd, selector: "BBSF-TextBox", inputs: ["group", "options"], outputs: ["OnChange"] }, { type: i6.EmptyDataComponent, selector: "lib-empty-data", inputs: ["Message", "ShowImage", "ImgURL"] }, { type: i5.ɵs, selector: "BBSF-Paging", inputs: ["options", "group"], outputs: ["Items"] }, { type: i7.NgbNavOutlet, selector: "[ngbNavOutlet]", inputs: ["paneRole", "ngbNavOutlet"] }], directives: [{ type: i7.NgbNav, selector: "[ngbNav]", inputs: ["animation", "destroyOnHide", "orientation", "roles", "keyboard", "activeId"], outputs: ["activeIdChange", "shown", "hidden", "navChange"], exportAs: ["ngbNav"] }, { type: i7.NgbNavItem, selector: "[ngbNavItem]", inputs: ["disabled", "domId", "destroyOnHide", "ngbNavItem"], outputs: ["shown", "hidden"], exportAs: ["ngbNavItem"] }, { type: i7.NgbNavLink, selector: "a[ngbNavLink]" }, { type: i7.NgbNavContent, selector: "ng-template[ngbNavContent]" }, { type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
|
|
266
207
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: JobsComponent, decorators: [{
|
|
267
208
|
type: Component,
|
|
268
209
|
args: [{
|
|
@@ -270,23 +211,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImpo
|
|
|
270
211
|
templateUrl: './jobs.component.html',
|
|
271
212
|
styleUrls: ['./jobs.component.css']
|
|
272
213
|
}]
|
|
273
|
-
}], ctorParameters: function () { return [{ type: i1.
|
|
214
|
+
}], ctorParameters: function () { return [{ type: i1.PageInfoService }, { type: i2.UtilityService }, { type: i2.EnvironmentService }, { type: i3.JobsService }, { type: i2.RequestHandlerService }]; }, propDecorators: { enqueuedInput: [{
|
|
274
215
|
type: ViewChild,
|
|
275
216
|
args: ['EnqueuedPagingViewElement', { static: false }]
|
|
276
|
-
}],
|
|
217
|
+
}], scheduledInput: [{
|
|
277
218
|
type: ViewChild,
|
|
278
219
|
args: ['ScheduledPagingViewElement', { static: false }]
|
|
279
|
-
}],
|
|
220
|
+
}], processingInput: [{
|
|
280
221
|
type: ViewChild,
|
|
281
222
|
args: ['ProcessingPagingViewElement', { static: false }]
|
|
282
|
-
}],
|
|
223
|
+
}], succeededInput: [{
|
|
283
224
|
type: ViewChild,
|
|
284
225
|
args: ['SucceededPagingViewElement', { static: false }]
|
|
285
|
-
}],
|
|
226
|
+
}], failedInput: [{
|
|
286
227
|
type: ViewChild,
|
|
287
228
|
args: ['FailedPagingViewElement', { static: false }]
|
|
288
|
-
}],
|
|
229
|
+
}], deletedInput: [{
|
|
289
230
|
type: ViewChild,
|
|
290
231
|
args: ['DeletedPagingViewElement', { static: false }]
|
|
291
232
|
}] } });
|
|
292
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam9icy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYnNmLWFkbWluLXBvcnRhbC9zcmMvbGliL1BhZ2VzL2pvYnMvam9icy9qb2JzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtYWRtaW4tcG9ydGFsL3NyYy9saWIvUGFnZXMvam9icy9qb2JzL2pvYnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXNCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMzRyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDckYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDhDQUE4QyxDQUFDOzs7Ozs7Ozs7OztBQVM5RSxNQUFNLE9BQU8sYUFBYTtJQWtEdkIsc0NBQXNDO0lBQ3ZDLFlBQXFCLFdBQXVCLEVBQVMsZUFBK0IsRUFBUyxjQUE2QixFQUFTLG9CQUF5QyxFQUFTLGtCQUFxQyxFQUFVLFdBQXdCO1FBQXZPLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQVMsb0JBQWUsR0FBZixlQUFlLENBQWdCO1FBQVMsbUJBQWMsR0FBZCxjQUFjLENBQWU7UUFBUyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXFCO1FBQVMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFtQjtRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBakQ1UCxXQUFNLEdBQUcsa0JBQWtCLENBQUE7UUFFM0IsbUJBQWMsR0FBaUIsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUNw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QUMsYUFBYSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyx3QkFBd0IsQ0FBQztRQUNoSCxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLHdCQUF3QixFQUFFLENBQUE7UUFDaEYsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7UUFDcEMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRVgsQ0FBQzs7MkdBeFRVLGFBQWE7K0ZBQWIsYUFBYSwrc0JDYjFCLHFrZUFvUUE7NEZEdlBhLGFBQWE7a0JBTHpCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLFVBQVU7b0JBQ3BCLFdBQVcsRUFBRSx1QkFBdUI7b0JBQ3BDLFNBQVMsRUFBRSxDQUFDLHNCQUFzQixDQUFDO2lCQUNwQzsyUEFlNEQsYUFBYTtzQkFBdkUsU0FBUzt1QkFBQywyQkFBMkIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBTUcsY0FBYztzQkFBekUsU0FBUzt1QkFBQyw0QkFBNEIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBTUcsZUFBZTtzQkFBM0UsU0FBUzt1QkFBQyw2QkFBNkIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBT0MsY0FBYztzQkFBekUsU0FBUzt1QkFBQyw0QkFBNEIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBTUQsV0FBVztzQkFBbkUsU0FBUzt1QkFBQyx5QkFBeUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBTUcsWUFBWTtzQkFBckUsU0FBUzt1QkFBQywwQkFBMEIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgRmlsdGVySXRlbSwgRmlsdGVyVHlwZSwgSW5wdXRUeXBlLCBQYWdpbmdPcHRpb25zLCBUZXh0Qm94T3B0aW9ucyB9IGZyb20gJ0BibnNpZ2h0cy9iYnNmLWNvbnRyb2xzJztcclxuaW1wb3J0IHsgUGFnZUluZm9TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vX21ldHJvbmljL2NvcmUvc2VydmljZXMvcGFnZS1pbmZvLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBKb2JDb3VudHNNb2RlbCB9IGZyb20gJy4uLy4uL3NoYXJlZC9tb2RlbHMvSm9iTW9kZWxzL0pvYkNvdW50c01vZGVsJztcclxuaW1wb3J0IHsgSm9ic1NlcnZpY2UgfSBmcm9tICcuLy4uLy4uL3NoYXJlZC9TZXJ2aWNlcy9Kb2JzU2VydmljZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXV0aFNlcnZpY2UsIFV0aWxpdHlTZXJ2aWNlLCBCQlNGVHJhbnNsYXRlU2VydmljZSwgRW52aXJvbm1lbnRTZXJ2aWNlIH0gZnJvbSAnQGJuc2lnaHRzL2Jic2YtdXRpbGl0aWVzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWpvYnMnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9qb2JzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9qb2JzLmNvbXBvbmVudC5jc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgSm9ic0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIEFwaVVybCA9IFwiL2FwaS9hZG1pbi9Kb2JzL1wiXHJcbiAgc2VhcmNoVGV4dEJveDogVGV4dEJveE9wdGlvbnM7XHJcbiAgSm9iQ291bnRzTW9kZWw6Sm9iQ291bnRzTW9kZWw9IG5ldyBKb2JDb3VudHNNb2RlbCgpO1xyXG4gIFByb2R1Y3Rpb25Nb2RlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgSXNTdGF0aXN0aWNzTG9hZGVkOmJvb2xlYW49ZmFsc2U7XHJcblxyXG4gIEVucXVldWVkRm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gIHNob3dFbnF1ZXVlZEZpbHRlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEVucXVldWVkUGFnaW5nUmVzdWx0OiBhbnlbXSA9IFtdO1xyXG4gIEVucXVldWVkUGFnaW5nOiBQYWdpbmdPcHRpb25zO1xyXG4gIEVucXVldWVkVGV4dElucHV0RmlsdGVyOiBGaWx0ZXJJdGVtO1xyXG4gIElzRW5xdWV1ZWRGaWx0ZXJMb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBAVmlld0NoaWxkKCdFbnF1ZXVlZFBhZ2luZ1ZpZXdFbGVtZW50JywgeyBzdGF0aWM6IGZhbHNlIH0pIEVucXVldWVkSW5wdXQ6IEVsZW1lbnRSZWY7XHJcblxyXG4gIFNjaGVkdWxlZEZvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuICBTY2hlZHVsZWRQYWdpbmdSZXN1bHQ6IGFueVtdID0gW107XHJcbiAgU2NoZWR1bGVkUGFnaW5nOiBQYWdpbmdPcHRpb25zO1xyXG4gIElzU2NoZWR1bGVkRmlsdGVyTG9hZGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQFZpZXdDaGlsZCgnU2NoZWR1bGVkUGFnaW5nVmlld0VsZW1lbnQnLCB7IHN0YXRpYzogZmFsc2UgfSkgU2NoZWR1bGVkSW5wdXQ6IEVsZW1lbnRSZWY7XHJcblxyXG4gIFByb2Nlc3NpbmdGb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcbiAgUHJvY2Vzc2luZ1BhZ2luZ1Jlc3VsdDogYW55W10gPSBbXTtcclxuICBQcm9jZXNzaW5nUGFnaW5nOiBQYWdpbmdPcHRpb25zO1xyXG4gIElzUHJvY2Vzc2luZ0ZpbHRlckxvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBWaWV3Q2hpbGQoJ1Byb2Nlc3NpbmdQYWdpbmdWaWV3RWxlbWVudCcsIHsgc3RhdGljOiBmYWxzZSB9KSBQcm9jZXNzaW5nSW5wdXQ6IEVsZW1lbnRSZWY7XHJcblxyXG5cclxuICBTdWNjZWVkZWRGb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcbiAgU3VjY2VlZGVkUGFnaW5nUmVzdWx0OiBhbnlbXSA9IFtdO1xyXG4gIFN1Y2NlZWRlZFBhZ2luZzogUGFnaW5nT3B0aW9ucztcclxuICBJc1N1Y2NlZWRlZEZpbHRlckxvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBWaWV3Q2hpbGQoJ1N1Y2NlZWRlZFBhZ2luZ1ZpZXdFbGVtZW50JywgeyBzdGF0aWM6IGZhbHNlIH0pIFN1Y2NlZWRlZElucHV0OiBFbGVtZW50UmVmO1xyXG5cclxuICBGYWlsZWRGb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcbiAgRmFpbGVkUGFnaW5nUmVzdWx0OiBhbnlbXSA9IFtdO1xyXG4gIEZhaWxlZFBhZ2luZzogUGFnaW5nT3B0aW9ucztcclxuICBJc0ZhaWxlZEZpbHRlckxvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBWaWV3Q2hpbGQoJ0ZhaWxlZFBhZ2luZ1ZpZXdFbGVtZW50JywgeyBzdGF0aWM6IGZhbHNlIH0pIEZhaWxlZElucHV0OiBFbGVtZW50UmVmO1xyXG5cclxuICBEZWxldGVkRm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gIERlbGV0ZWRQYWdpbmdSZXN1bHQ6IGFueVtdID0gW107XHJcbiAgRGVsZXRlZFBhZ2luZzogUGFnaW5nT3B0aW9ucztcclxuICBJc0RlbGV0ZWRGaWx0ZXJMb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBAVmlld0NoaWxkKCdEZWxldGVkUGFnaW5nVmlld0VsZW1lbnQnLCB7IHN0YXRpYzogZmFsc2UgfSkgRGVsZXRlZElucHV0OiBFbGVtZW50UmVmO1xyXG5cclxuICBsYW5ndWFnZTpzdHJpbmc9XCJcIlxyXG5cclxuICBcclxuICAgLy8gRGVjb3JhdG9yIHdpcmVzIHVwIGJsb2NrVUkgaW5zdGFuY2VcclxuICBjb25zdHJ1Y3RvciggcHJpdmF0ZSBhdXRoU2VydmljZTpBdXRoU2VydmljZSxwcml2YXRlIHBhZ2VJbmZvU2VydmljZTpQYWdlSW5mb1NlcnZpY2UsIHB1YmxpYyB1dGlsaXR5U2VydmljZTpVdGlsaXR5U2VydmljZSxwcml2YXRlIGJic2ZUcmFuc2xhdGVTZXJ2aWNlOkJCU0ZUcmFuc2xhdGVTZXJ2aWNlLHByaXZhdGUgZW52aXJvbm1lbnRTZXJ2aWNlOkVudmlyb25tZW50U2VydmljZSwgcHJpdmF0ZSBKb2JzU2VydmljZTogSm9ic1NlcnZpY2UpIHtcclxuICB9XHJcbiAgYXN5bmMgbmdPbkluaXQoKSB7XHJcbiAgICBQYWdlSW5mb1NlcnZpY2UuUGFnZVRpdGxlPXRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkpvYnNcIilcclxuICAgIFBhZ2VJbmZvU2VydmljZS5QYWdlQnJlYWRjcnVtYnM9W1xyXG4gICAgICAge3RpdGxlOiB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJIb21lXCIpICwgcGF0aDogJy9BZG1pbi9Ib21lJywgaXNTZXBhcmF0b3I6IGZhbHNlLCBpc0FjdGl2ZTogZmFsc2V9LFxyXG4gICAgICAge3RpdGxlOiAnJywgcGF0aDogJycsIGlzU2VwYXJhdG9yOiB0cnVlLCBpc0FjdGl2ZTogZmFsc2V9XHJcblxyXG4gICAgXTtcclxuICAgIFxyXG4gICAgdGhpcy5wYWdlSW5mb1NlcnZpY2UuY2FsY3VsYXRlVGl0bGUoKTtcclxuICAgIHRoaXMucGFnZUluZm9TZXJ2aWNlLmNhbGN1bGF0ZUJyZWFkY3J1bWJzKCk7XHJcbiAgICB0aGlzLmJic2ZUcmFuc2xhdGVTZXJ2aWNlLm9uTGFuZ0NoYW5nZS5zdWJzY3JpYmUoKGV2ZW50KT0+e1xyXG4gICAgICB0aGlzLmxhbmd1YWdlID0gZXZlbnQubGFuZztcclxuICAgICAgdGhpcy5uZ09uSW5pdCgpO1xyXG4gICAgfSlcclxuICAgIHRoaXMubGFuZ3VhZ2UgPSBhd2FpdCB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldEN1cnJlbnRMYW5ndWFnZSgpO1xyXG4gICAgdGhpcy5Qcm9kdWN0aW9uTW9kZSA9IHRoaXMuZW52aXJvbm1lbnRTZXJ2aWNlLmdldFByb2R1Y3Rpb25Nb2RlKClcclxuICAgIHRoaXMuTG9hZFN0YXRpc3RpY3MoKTtcclxuICB9XHJcblxyXG5cclxuICBSZWluaXRpYWxpemVFbnF1ZXVlZFBhZ2luZygpIHtcclxuICAgIGxldCBlbGVtZW50ID0gdGhpcy4gRW5xdWV1ZWRJbnB1dCBhcyBhbnk7XHJcbiAgICBlbGVtZW50LlJlaW5pdGlhbGl6ZVBhZ2luZygpO1xyXG4gIH1cclxuICBVcGRhdGVFbnF1ZXVlZFBhZ2luZygpIHtcclxuICAgIGxldCBlbGVtZW50ID0gdGhpcy5FbnF1ZXVlZElucHV0IGFzIGFueTtcclxuICAgIGVsZW1lbnQuVXBkYXRlUGFnaW5nKCk7XHJcbiAgfVxyXG4gIHNldEVucXVldWVkTGlzdFJlc3VsdChyZXN1bHQpIHtcclxuICAgIHRoaXMuRW5xdWV1ZWRQYWdpbmdSZXN1bHQgPSByZXN1bHRcclxuICAgIHRoaXMudXRpbGl0eVNlcnZpY2Uuc3RhcnRCbG9ja1VJKCk7XHJcbiAgfVxyXG4gIHJlc2V0RmlsdGVycygpIHtcclxuICAgIHRoaXMuRW5xdWV1ZWRGb3JtLmNvbnRyb2xzW1wic2VhcmNoVGV4dEJveFwiXS5zZXRWYWx1ZShudWxsKTtcclxuICAgIGxldCBlbGVtZW50ID0gdGhpcy5FbnF1ZXVlZElucHV0IGFzIGFueTtcclxuICAgIGVsZW1lbnQuUmVpbml0aWFsaXplUGFnaW5nKCk7XHJcblxyXG4gIH1cclxuXHJcbiAgUmVpbml0aWFsaXplU2NoZWR1bGVkUGFnaW5nKCkge1xyXG4gICAgbGV0IGVsZW1lbnQgPSB0aGlzLlNjaGVkdWxlZElucHV0IGFzIGFueTtcclxuICAgIGVsZW1lbnQuUmVpbml0aWFsaXplUGFnaW5nKCk7XHJcbiAgfVxyXG4gIFVwZGF0ZVNjaGVkdWxlZFBhZ2luZygpIHtcclxuICAgIGxldCBlbGVtZW50ID0gdGhpcy5TY2hlZHVsZWRJbnB1dCBhcyBhbnk7XHJcbiAgICBlbGVtZW50LlVwZGF0ZVBhZ2luZygpO1xyXG4gIH1cclxuICBzZXRTY2hlZHVsZWRMaXN0UmVzdWx0KHJlc3VsdCkge1xyXG4gICAgdGhpcy5TY2hlZHVsZWRQYWdpbmdSZXN1bHQgPSByZXN1bHRcclxuICAgIHRoaXMudXRpbGl0eVNlcnZpY2Uuc3RvcEJsb2NrVUkoKTtcclxuICB9XHJcblxyXG4gIFJlaW5pdGlhbGl6ZVByb2Nlc3NpbmdQYWdpbmcoKSB7XHJcbiAgICBsZXQgZWxlbWVudCA9IHRoaXMuUHJvY2Vzc2luZ0lucHV0IGFzIGFueTtcclxuICAgIGVsZW1lbnQuUmVpbml0aWFsaXplUGFnaW5nKCk7XHJcbiAgfVxyXG4gIFVwZGF0ZVByb2Nlc3NpbmdQYWdpbmcoKSB7XHJcbiAgICBsZXQgZWxlbWVudCA9IHRoaXMuUHJvY2Vzc2luZ0lucHV0IGFzIGFueTtcclxuICAgIGVsZW1lbnQuVXBkYXRlUGFnaW5nKCk7XHJcbiAgfVxyXG4gIHNldFByb2Nlc3NpbmdMaXN0UmVzdWx0KHJlc3VsdCkge1xyXG4gICAgdGhpcy5Qcm9jZXNzaW5nUGFnaW5nUmVzdWx0ID0gcmVzdWx0XHJcbiAgICB0aGlzLnV0aWxpdHlTZXJ2aWNlLnN0b3BCbG9ja1VJKClcclxuXHJcbiAgfVxyXG5cclxuICBSZWluaXRpYWxpemVTdWNjZWVkZWRQYWdpbmcoKSB7XHJcbiAgICBsZXQgZWxlbWVudCA9IHRoaXMuU3VjY2VlZGVkSW5wdXQgYXMgYW55O1xyXG4gICAgZWxlbWVudC5SZWluaXRpYWxpemVQYWdpbmcoKTtcclxuICB9XHJcbiAgVXBkYXRlU3VjY2VlZGVkUGFnaW5nKCkge1xyXG4gICAgbGV0IGVsZW1lbnQgPSB0aGlzLlN1Y2NlZWRlZElucHV0IGFzIGFueTtcclxuICAgIGVsZW1lbnQuVXBkYXRlUGFnaW5nKCk7XHJcbiAgfVxyXG4gIHNldFN1Y2NlZWRlZExpc3RSZXN1bHQocmVzdWx0KSB7XHJcbiAgICB0aGlzLlN1Y2NlZWRlZFBhZ2luZ1Jlc3VsdCA9IHJlc3VsdFxyXG4gICAgdGhpcy51dGlsaXR5U2VydmljZS5zdG9wQmxvY2tVSSgpO1xyXG4gIH1cclxuXHJcbiAgUmVpbml0aWFsaXplRmFpbGVkUGFnaW5nKCkge1xyXG4gICAgbGV0IGVsZW1lbnQgPSB0aGlzLkZhaWxlZElucHV0IGFzIGFueTtcclxuICAgIGVsZW1lbnQuUmVpbml0aWFsaXplUGFnaW5nKCk7XHJcbiAgfVxyXG4gIFVwZGF0ZUZhaWxlZFBhZ2luZygpIHtcclxuICAgIGxldCBlbGVtZW50ID0gdGhpcy5GYWlsZWRJbnB1dCBhcyBhbnk7XHJcbiAgICBlbGVtZW50LlVwZGF0ZVBhZ2luZygpO1xyXG4gIH1cclxuICBzZXRGYWlsZWRMaXN0UmVzdWx0KHJlc3VsdCkge1xyXG4gICAgdGhpcy5GYWlsZWRQYWdpbmdSZXN1bHQgPSByZXN1bHRcclxuICAgIHRoaXMudXRpbGl0eVNlcnZpY2Uuc3RvcEJsb2NrVUkoKVxyXG4gIH1cclxuXHJcblxyXG4gIFJlaW5pdGlhbGl6ZURlbGV0ZWRQYWdpbmcoKSB7XHJcbiAgICBsZXQgZWxlbWVudCA9IHRoaXMuRGVsZXRlZElucHV0IGFzIGFueTtcclxuICAgIGVsZW1lbnQuUmVpbml0aWFsaXplUGFnaW5nKCk7XHJcbiAgfVxyXG4gIFVwZGF0ZURlbGV0ZWRQYWdpbmcoKSB7XHJcbiAgICBsZXQgZWxlbWVudCA9IHRoaXMuRGVsZXRlZElucHV0IGFzIGFueTtcclxuICAgIGVsZW1lbnQuVXBkYXRlUGFnaW5nKCk7XHJcbiAgfVxyXG4gIHNldERlbGV0ZWRMaXN0UmVzdWx0KHJlc3VsdCkge1xyXG4gICAgdGhpcy5EZWxldGVkUGFnaW5nUmVzdWx0ID0gcmVzdWx0XHJcbiAgICB0aGlzLnV0aWxpdHlTZXJ2aWNlLnN0b3BCbG9ja1VJKClcclxuXHJcbiAgfVxyXG5cclxuICBMb2FkU3RhdGlzdGljcygpIHtcclxuICAgIHRoaXMuSm9ic1NlcnZpY2UuTG9hZFN0YXRpc3RpY3MoKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xyXG4gICAgICBsZXQgTGlzdHMgPSByZXN1bHQgYXMgYW55XHJcbiAgICAgIHRoaXMuSm9iQ291bnRzTW9kZWwuRW5xdWV1ZWQ9TGlzdHMuZW5xdWV1ZWRcclxuICAgICAgdGhpcy5Kb2JDb3VudHNNb2RlbC5TdWNjZWVkZWQ9TGlzdHMuc3VjY2VlZGVkXHJcbiAgICAgIHRoaXMuSm9iQ291bnRzTW9kZWwuU2NoZWR1bGVkPUxpc3RzLnNjaGVkdWxlZFxyXG4gICAgICB0aGlzLkpvYkNvdW50c01vZGVsLlByb2Nlc3Npbmc9TGlzdHMucHJvY2Vzc2luZ1xyXG4gICAgICB0aGlzLkpvYkNvdW50c01vZGVsLkZhaWxlZD1MaXN0cy5mYWlsZWRcclxuICAgICAgdGhpcy5Kb2JDb3VudHNNb2RlbC5EZWxldGVkPUxpc3RzLmRlbGV0ZWRcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5Jc1N0YXRpc3RpY3NMb2FkZWQgPSB0cnVlO1xyXG5cclxuICAgICAgfSwgMTApO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIFxyXG5cclxuICBMb2FkRW5xdWV1ZWRKb2JzKCkgXHJcbiAge1xyXG4gICAgdGhpcy5Jc0VucXVldWVkRmlsdGVyTG9hZGVkID0gZmFsc2U7XHJcbiAgICB0aGlzLklzU2NoZWR1bGVkRmlsdGVyTG9hZGVkID0gZmFsc2U7XHJcbiAgICB0aGlzLklzUHJvY2Vzc2luZ0ZpbHRlckxvYWRlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5Jc1N1Y2NlZWRlZEZpbHRlckxvYWRlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5Jc0ZhaWxlZEZpbHRlckxvYWRlZCA9IGZhbHNlO1xyXG5cclxuICAgIHRoaXMuSXNEZWxldGVkRmlsdGVyTG9hZGVkID0gZmFsc2U7XHJcblxyXG5cclxuICAgIHRoaXMudXRpbGl0eVNlcnZpY2Uuc3RhcnRCbG9ja1VJXHJcbiAgICAgIC8vIFRleHRCb3ggaW50aVxyXG4gICAgICB0aGlzLnNlYXJjaFRleHRCb3ggPSBuZXcgVGV4dEJveE9wdGlvbnMoKTtcclxuICAgICAgdGhpcy5zZWFyY2hUZXh0Qm94Lk5hbWUgPSBcInNlYXJjaFRleHRCb3hcIlxyXG4gICAgdGhpcy5zZWFyY2hUZXh0Qm94LkhpZGVMYWJlbCA9IHRydWVcclxuICAgIHRoaXMuc2VhcmNoVGV4dEJveC5UeXBlID0gSW5wdXRUeXBlLlRleHRcclxuICAgIHRoaXMuc2VhcmNoVGV4dEJveC5QbGFjZWhvbGRlciA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlNlYXJjaEJ5TmFtZVwiKVxyXG5cclxuICAgICAgdGhpcy5FbnF1ZXVlZFRleHRJbnB1dEZpbHRlciA9IG5ldyBGaWx0ZXJJdGVtKCk7XHJcbiAgICAgIHRoaXMuRW5xdWV1ZWRUZXh0SW5wdXRGaWx0ZXIuRm9ybUNvbnRyb2xOYW1lID0gXCJzZWFyY2hUZXh0Qm94XCJcclxuICAgICAgdGhpcy5FbnF1ZXVlZFRleHRJbnB1dEZpbHRlci5BY3Rpb25QYXJhbWV0ZXJOYW1lID0gXCJzZWFyY2hUZXh0XCJcclxuICAgICAgdGhpcy5FbnF1ZXVlZFRleHRJbnB1dEZpbHRlci5Jc0Zvcm1Db250cm9sID0gdHJ1ZVxyXG4gICAgICB0aGlzLkVucXVldWVkVGV4dElucHV0RmlsdGVyLkZpbHRlclR5cGUgPSBGaWx0ZXJUeXBlLlRleHRCb3hcclxuXHJcbiAgICAgIHRoaXMuRW5xdWV1ZWRQYWdpbmcgPSBuZXcgUGFnaW5nT3B0aW9ucygpO1xyXG4gICAgICB0aGlzLkVucXVldWVkUGFnaW5nLkFjdGlvblBvc3RVUkwgPSB0aGlzLmVudmlyb25tZW50U2VydmljZS5nZXRBcGlVcmwoKSArIHRoaXMuQXBpVXJsICsgJ0dldFF1ZXVlTGlzdEJ5RmlsdGVyJztcclxuICAgICAgdGhpcy5FbnF1ZXVlZFBhZ2luZy5PbktleVByZXNzRmlsdGVyc0NvbnRyb2xOYW1lcyA9IFtcInNlYXJjaFRleHRCb3hcIl1cclxuICAgICAgdGhpcy5FbnF1ZXVlZFBhZ2luZy5GaWx0ZXJzID0gWyB0aGlzLkVucXVldWVkVGV4dElucHV0RmlsdGVyXVxyXG4gICAgICB0aGlzLkVucXVldWVkUGFnaW5nLlZhbGlkYXRpb25Ub2tlbiA9IHRoaXMuYXV0aFNlcnZpY2UuYXV0aG9yaXphdGlvbkhlYWRlclZhbHVlKClcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcblxyXG4gICAgICAgIHRoaXMuSXNFbnF1ZXVlZEZpbHRlckxvYWRlZCA9IHRydWU7XHJcbiAgICAgIH0sIDEwKTtcclxuICBcclxuICB9XHJcblxyXG5cclxuICBMb2FkU2NoZWR1bGVkSm9icygpIFxyXG4gIHtcclxuICAgIHRoaXMuSXNFbnF1ZXVlZEZpbHRlckxvYWRlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5Jc1NjaGVkdWxlZEZpbHRlckxvYWRlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5Jc1Byb2Nlc3NpbmdGaWx0ZXJMb2FkZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuSXNTdWNjZWVkZWRGaWx0ZXJMb2FkZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuSXNGYWlsZWRGaWx0ZXJMb2FkZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuSXNEZWxldGVkRmlsdGVyTG9hZGVkID0gZmFsc2U7XHJcbiAgICB0aGlzLnV0aWxpdHlTZXJ2aWNlLnN0YXJ0QmxvY2tVSVxyXG4gICAgIFxyXG4gICAgICB0aGlzLlNjaGVkdWxlZFBhZ2luZyA9IG5ldyBQYWdpbmdPcHRpb25zKCk7XHJcbiAgICAgIHRoaXMuU2NoZWR1bGVkUGFnaW5nLkFjdGlvblBvc3RVUkwgPSB0aGlzLmVudmlyb25tZW50U2VydmljZS5nZXRBcGlVcmwoKSArIHRoaXMuQXBpVXJsICsgJ0dldFNjaGVkdWxlZExpc3RCeUZpbHRlcic7XHJcbiAgICAgIHRoaXMuU2NoZWR1bGVkUGFnaW5nLlZhbGlkYXRpb25Ub2tlbiA9IHRoaXMuYXV0aFNlcnZpY2UuYXV0aG9yaXphdGlvbkhlYWRlclZhbHVlKClcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5Jc1NjaGVkdWxlZEZpbHRlckxvYWRlZCA9IHRydWU7XHJcbiAgICAgIH0sIDEwKTtcclxuICBcclxuICB9XHJcblxyXG4gIExvYWRQcm9jZXNzaW5nSm9icygpIFxyXG4gIHtcclxuICAgIHRoaXMuSXNFbnF1ZXVlZEZpbHRlckxvYWRlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5Jc1NjaGVkdWxlZEZpbHRlckxvYWRlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5Jc1Byb2Nlc3NpbmdGaWx0ZXJMb2FkZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuSXNTdWNjZWVkZWRGaWx0ZXJMb2FkZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuSXNGYWlsZWRGaWx0ZXJMb2FkZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuSXNEZWxldGVkRmlsdGVyTG9hZGVkID0gZmFsc2U7XHJcbiAgICB0aGlzLnV0aWxpdHlTZXJ2aWNlLnN0YXJ0QmxvY2tVSVxyXG4gICAgIFxyXG4gICAgICB0aGlzLlByb2Nlc3NpbmdQYWdpbmcgPSBuZXcgUGFnaW5nT3B0aW9ucygpO1xyXG4gICAgICB0aGlzLlByb2Nlc3NpbmdQYWdpbmcuQWN0aW9uUG9zdFVSTCA9IHRoaXMuZW52aXJvbm1lbnRTZXJ2aWNlLmdldEFwaVVybCgpICsgdGhpcy5BcGlVcmwgKyAnR2V0UHJvY2Vzc2luZ0xpc3RCeUZpbHRlcic7XHJcbiAgICAgIHRoaXMuUHJvY2Vzc2luZ1BhZ2luZy5WYWxpZGF0aW9uVG9rZW4gPSB0aGlzLmF1dGhTZXJ2aWNlLmF1dGhvcml6YXRpb25IZWFkZXJWYWx1ZSgpXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuSXNQcm9jZXNzaW5nRmlsdGVyTG9hZGVkID0gdHJ1ZTtcclxuICAgICAgfSwgMTApO1xyXG4gIFxyXG4gIH1cclxuXHJcbiAgTG9hZFN1Y2NlZWRlZEpvYnMoKSBcclxuICB7XHJcbiAgICB0aGlzLklzRW5xdWV1ZWRGaWx0ZXJMb2FkZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuSXNTY2hlZHVsZWRGaWx0ZXJMb2FkZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuSXNQcm9jZXNzaW5nRmlsdGVyTG9hZGVkID0gZmFsc2U7XHJcbiAgICB0aGlzLklzU3VjY2VlZGVkRmlsdGVyTG9hZGVkID0gZmFsc2U7XHJcbiAgICB0aGlzLklzRmFpbGVkRmlsdGVyTG9hZGVkID0gZmFsc2U7XHJcbiAgICB0aGlzLklzRGVsZXRlZEZpbHRlckxvYWRlZCA9IGZhbHNlO1xyXG5cclxuICAgIHRoaXMudXRpbGl0eVNlcnZpY2Uuc3RhcnRCbG9ja1VJXHJcbiAgICAgXHJcbiAgICAgIHRoaXMuU3VjY2VlZGVkUGFnaW5nID0gbmV3IFBhZ2luZ09wdGlvbnMoKTtcclxuICAgICAgdGhpcy5TdWNjZWVkZWRQYWdpbmcuQWN0aW9uUG9zdFVSTCA9IHRoaXMuZW52aXJvbm1lbnRTZXJ2aWNlLmdldEFwaVVybCgpICsgdGhpcy5BcGlVcmwgKyAnR2V0U3VjY2VlZGVkTGlzdEJ5RmlsdGVyJztcclxuICAgICAgdGhpcy5TdWNjZWVkZWRQYWdpbmcuVmFsaWRhdGlvblRva2VuID0gdGhpcy5hdXRoU2VydmljZS5hdXRob3JpemF0aW9uSGVhZGVyVmFsdWUoKVxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLklzU3VjY2VlZGVkRmlsdGVyTG9hZGVkID0gdHJ1ZTtcclxuICAgICAgICB9LCAxMCk7XHJcbiAgXHJcbiAgfVxyXG5cclxuICBMb2FkRmFpbGVkSm9icygpIFxyXG4gIHtcclxuICAgIHRoaXMuSXNFbnF1ZXVlZEZpbHRlckxvYWRlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5Jc1NjaGVkdWxlZEZpbHRlckxvYWRlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5Jc1Byb2Nlc3NpbmdGaWx0ZXJMb2FkZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuSXNTdWNjZWVkZWRGaWx0ZXJMb2FkZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuSXNGYWlsZWRGaWx0ZXJMb2FkZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuSXNEZWxldGVkRmlsdGVyTG9hZGVkID0gZmFsc2U7XHJcblxyXG4gICAgdGhpcy51dGlsaXR5U2VydmljZS5zdGFydEJsb2NrVUlcclxuICAgICBcclxuICAgICAgdGhpcy5GYWlsZWRQYWdpbmcgPSBuZXcgUGFnaW5nT3B0aW9ucygpO1xyXG4gICAgICB0aGlzLkZhaWxlZFBhZ2luZy5BY3Rpb25Qb3N0VVJMID0gdGhpcy5lbnZpcm9ubWVudFNlcnZpY2UuZ2V0QXBpVXJsKCkgKyB0aGlzLkFwaVVybCArICdHZXRGYWlsZWRMaXN0QnlGaWx0ZXInO1xyXG4gICAgICB0aGlzLkZhaWxlZFBhZ2luZy5WYWxpZGF0aW9uVG9rZW4gPSB0aGlzLmF1dGhTZXJ2aWNlLmF1dGhvcml6YXRpb25IZWFkZXJWYWx1ZSgpXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuSXNGYWlsZWRGaWx0ZXJMb2FkZWQgPSB0cnVlO1xyXG4gICAgICB9LCAxMCk7XHJcbiAgXHJcbiAgfVxyXG5cclxuICBMb2FkRGVsZXRlZEpvYnMoKSBcclxuICB7XHJcbiAgICB0aGlzLklzRW5xdWV1ZWRGaWx0ZXJMb2FkZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuSXNTY2hlZHVsZWRGaWx0ZXJMb2FkZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuSXNQcm9jZXNzaW5nRmlsdGVyTG9hZGVkID0gZmFsc2U7XHJcbiAgICB0aGlzLklzU3VjY2VlZGVkRmlsdGVyTG9hZGVkID0gZmFsc2U7XHJcbiAgICB0aGlzLklzRmFpbGVkRmlsdGVyTG9hZGVkID0gZmFsc2U7XHJcbiAgICB0aGlzLklzRGVsZXRlZEZpbHRlckxvYWRlZCA9IGZhbHNlO1xyXG5cclxuICAgIHRoaXMudXRpbGl0eVNlcnZpY2Uuc3RhcnRCbG9ja1VJXHJcbiAgICAgXHJcbiAgICAgIHRoaXMuRGVsZXRlZFBhZ2luZyA9IG5ldyBQYWdpbmdPcHRpb25zKCk7XHJcbiAgICAgIHRoaXMuRGVsZXRlZFBhZ2luZy5BY3Rpb25Qb3N0VVJMID0gdGhpcy5lbnZpcm9ubWVudFNlcnZpY2UuZ2V0QXBpVXJsKCkgKyB0aGlzLkFwaVVybCArICdHZXREZWxldGVkTGlzdEJ5RmlsdGVyJztcclxuICAgICAgdGhpcy5EZWxldGVkUGFnaW5nLlZhbGlkYXRpb25Ub2tlbiA9IHRoaXMuYXV0aFNlcnZpY2UuYXV0aG9yaXphdGlvbkhlYWRlclZhbHVlKClcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5Jc0RlbGV0ZWRGaWx0ZXJMb2FkZWQgPSB0cnVlO1xyXG4gICAgICB9LCAxMCk7XHJcbiAgXHJcbiAgfVxyXG5cclxufVxyXG4iLCI8YmxvY2stdWk+IDwvYmxvY2stdWk+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNhcmQtY3VzdG9tLWhcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICA8dWwgbmdiTmF2ICNuYXY9XCJuZ2JOYXZcIiBjbGFzcz1cIm5hdiBuYXYtc3RyZXRjaCBuYXYtbGluZS10YWJzIG5hdi1saW5lLXRhYnMtMnggYm9yZGVyLXRyYW5zcGFyZW50IGZzLTUgZnctYm9sZGVyXCI+XHJcbiAgICAgICAgICAgIDxsaSBuZ2JOYXZJdGVtIGNsYXNzPVwibmF2LWl0ZW0gbXQtMlwiPlxyXG4gICAgICAgICAgICAgIDxhIG5nYk5hdkxpbmsgY2xhc3M9XCJuYXYtbGluayB0ZXh0LWFjdGl2ZS1wcmltYXJ5IG1zLTAgbWUtMTAgcHktNVwiIChjbGljayk9XCJMb2FkRW5xdWV1ZWRKb2JzKClcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJFbnF1ZXVlZFwiKX19KHt7Sm9iQ291bnRzTW9kZWwuRW5xdWV1ZWR9fSk8L2E+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG5nYk5hdkNvbnRlbnQ+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgYm9yZGVyLTAgcHQtNSBweC0wICBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtdGl0bGVcIiAqbmdJZj1cIklzRW5xdWV1ZWRGaWx0ZXJMb2FkZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiRW5xdWV1ZWRGb3JtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxCQlNGLVRleHRCb3ggW29wdGlvbnNdPVwic2VhcmNoVGV4dEJveFwiIFtncm91cF09XCJFbnF1ZXVlZEZvcm1cIj48L0JCU0YtVGV4dEJveD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcHktMyBweC0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLWJlZ2luOjpQZXJtaXNzaW9uIGxpc3QtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBiZWdpbjo6VGFibGUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBhbGlnbi1taWRkbGUgdGFibGUtcm93LWRhc2hlZCBmcy02IGd5LTUgZGF0YVRhYmxlIG5vLWZvb3RlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwidGV4dC1zdGFydCB0ZXh0LWdyYXktNDAwIGZ3LWJvbGRlciBmcy03IHRleHQtdXBwZXJjYXNlIGdzLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cIm1pbi13LTE1MHB4XCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiSm9iXCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwibWluLXctMTUwcHhcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJTdGF0ZVwiKX19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHkgaWQ9XCJsaXN0aW5nQ29udGFpbmVyXCIgY2xhc3M9XCJmdy1ib2xkIHRleHQtZ3JheS02MDAgYm9yZGVyLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IGpvYiBvZiBFbnF1ZXVlZFBhZ2luZ1Jlc3VsdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwidGV4dC1kYXJrXCI+e3tqb2Iuam9ifX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7am9iLnN0YXRlfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyICAqbmdJZj1cIkVucXVldWVkUGFnaW5nUmVzdWx0Lmxlbmd0aCA9PSAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1lbXB0eS1kYXRhPjwvbGliLWVtcHR5LWRhdGE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWZvb3RlciBib3JkZXItMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxCQlNGLVBhZ2luZyAoSXRlbXMpPVwic2V0RW5xdWV1ZWRMaXN0UmVzdWx0KCRldmVudClcIiAqbmdJZj1cIklzRW5xdWV1ZWRGaWx0ZXJMb2FkZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJFbnF1ZXVlZFBhZ2luZ1wiIFtncm91cF09XCJFbnF1ZXVlZEZvcm1cIiAjRW5xdWV1ZWRQYWdpbmdWaWV3RWxlbWVudD5cclxuICAgICAgICAgICAgICAgICAgICA8L0JCU0YtUGFnaW5nPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgIDxsaSBuZ2JOYXZJdGVtIGNsYXNzPVwibmF2LWl0ZW0gbXQtMlwiPlxyXG4gICAgICAgICAgICAgIDxhIG5nYk5hdkxpbmsgY2xhc3M9XCJuYXYtbGluayB0ZXh0LWFjdGl2ZS1wcmltYXJ5IG1zLTAgbWUtMTAgcHktNVwiIChjbGljayk9XCJMb2FkU2NoZWR1bGVkSm9icygpXCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiU2NoZWR1bGVkXCIpfX0oe3tKb2JDb3VudHNNb2RlbC5TY2hlZHVsZWR9fSk8L2E+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG5nYk5hdkNvbnRlbnQ+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHB5LTMgcHgtMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS1iZWdpbjo6UGVybWlzc2lvbiBsaXN0LS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYmVnaW46OlRhYmxlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgYWxpZ24tbWlkZGxlIHRhYmxlLXJvdy1kYXNoZWQgZnMtNiBneS01IGRhdGFUYWJsZSBuby1mb290ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cInRleHQtc3RhcnQgdGV4dC1ncmF5LTQwMCBmdy1ib2xkZXIgZnMtNyB0ZXh0LXVwcGVyY2FzZSBncy0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJtaW4tdy0xNTBweFwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkpvYlwiKX19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cIm1pbi13LTE1MHB4XCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiRW5xdWV1ZWRcIil9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJtaW4tdy0xNTBweFwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlNjaGVkdWxlZFwiKX19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHkgaWQ9XCJsaXN0aW5nQ29udGFpbmVyXCIgY2xhc3M9XCJmdy1ib2xkIHRleHQtZ3JheS02MDAgYm9yZGVyLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IGpvYiBvZiBTY2hlZHVsZWRQYWdpbmdSZXN1bHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2pvYi5qb2J9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tqb2IuZW5xdWV1ZUF0fX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7am9iLnNjaGVkdWxlZEF0fX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyICAqbmdJZj1cIlNjaGVkdWxlZFBhZ2luZ1Jlc3VsdC5sZW5ndGggPT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItZW1wdHktZGF0YT48L2xpYi1lbXB0eS1kYXRhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWZvb3RlciBib3JkZXItMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxCQlNGLVBhZ2luZyAoSXRlbXMpPVwic2V0U2NoZWR1bGVkTGlzdFJlc3VsdCgkZXZlbnQpXCIgKm5nSWY9XCJJc1NjaGVkdWxlZEZpbHRlckxvYWRlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cIlNjaGVkdWxlZFBhZ2luZ1wiIFtncm91cF09XCJTY2hlZHVsZWRGb3JtXCIgI1NjaGVkdWxlZFBhZ2luZ1ZpZXdFbGVtZW50PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvQkJTRi1QYWdpbmc+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgPGxpIG5nYk5hdkl0ZW0gY2xhc3M9XCJuYXYtaXRlbSBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgPGEgbmdiTmF2TGluayBjbGFzcz1cIm5hdi1saW5rIHRleHQtYWN0aXZlLXByaW1hcnkgbXMtMCBtZS0xMCBweS01XCIgKGNsaWNrKT1cIkxvYWRQcm9jZXNzaW5nSm9icygpXCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiUHJvY2Vzc2luZ1wiKX19KHt7Sm9iQ291bnRzTW9kZWwuUHJvY2Vzc2luZ319KTwvYT5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbmdiTmF2Q29udGVudD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcHktMyBweC0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLWJlZ2luOjpQZXJtaXNzaW9uIGxpc3QtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBiZWdpbjo6VGFibGUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBhbGlnbi1taWRkbGUgdGFibGUtcm93LWRhc2hlZCBmcy02IGd5LTUgZGF0YVRhYmxlIG5vLWZvb3RlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwidGV4dC1zdGFydCB0ZXh0LWdyYXktNDAwIGZ3LWJvbGRlciBmcy03IHRleHQtdXBwZXJjYXNlIGdzLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cIm1pbi13LTE1MHB4XCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiSm9iXCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwibWluLXctMTUwcHhcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJTdGFydGVkQXRcIil9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJtaW4tdy0xNTBweFwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlNlcnZlcklkXCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keSBpZD1cImxpc3RpbmdDb250YWluZXJcIiBjbGFzcz1cImZ3LWJvbGQgdGV4dC1ncmF5LTYwMCBib3JkZXItMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgam9iIG9mIFByb2Nlc3NpbmdQYWdpbmdSZXN1bHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2pvYi5qb2J9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tqb2Iuc3RhcnRlZEF0fX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7am9iLnNlcnZlcklkfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0lmPVwiUHJvY2Vzc2luZ1BhZ2luZ1Jlc3VsdC5sZW5ndGggPT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItZW1wdHktZGF0YT48L2xpYi1lbXB0eS1kYXRhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWZvb3RlciBib3JkZXItMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxCQlNGLVBhZ2luZyAoSXRlbXMpPVwic2V0UHJvY2Vzc2luZ0xpc3RSZXN1bHQoJGV2ZW50KVwiICpuZ0lmPVwiSXNQcm9jZXNzaW5nRmlsdGVyTG9hZGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiUHJvY2Vzc2luZ1BhZ2luZ1wiIFtncm91cF09XCJQcm9jZXNzaW5nRm9ybVwiICNQcm9jZXNzaW5nUGFnaW5nVmlld0VsZW1lbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9CQlNGLVBhZ2luZz5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICA8bGkgbmdiTmF2SXRlbSBjbGFzcz1cIm5hdi1pdGVtIG10LTJcIj5cclxuICAgICAgICAgICAgICA8YSBuZ2JOYXZMaW5rIGNsYXNzPVwibmF2LWxpbmsgdGV4dC1hY3RpdmUtcHJpbWFyeSBtcy0wIG1lLTEwIHB5LTVcIiAoY2xpY2spPVwiTG9hZFN1Y2NlZWRlZEpvYnMoKVwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlN1Y2NlZWRlZFwiKX19KHt7Sm9iQ291bnRzTW9kZWwuU3VjY2VlZGVkfX0pPC9hPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuZ2JOYXZDb250ZW50PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmRcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBweS0zIHB4LTBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBiZWdpbjo6VGFibGUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBhbGlnbi1taWRkbGUgdGFibGUtcm93LWRhc2hlZCBmcy02IGd5LTUgZGF0YVRhYmxlIG5vLWZvb3RlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwidGV4dC1zdGFydCB0ZXh0LWdyYXktNDAwIGZ3LWJvbGRlciBmcy03IHRleHQtdXBwZXJjYXNlIGdzLTBcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJtaW4tdy0xNTBcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJKb2JcIil9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJtaW4tdy0xNTBcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJTdWNjZWVkZWRBdFwiKX19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cIm1pbi13LTE1MFwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlRvdGFsRHVyYXRpb25cIil9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5IGlkPVwibGlzdGluZ0NvbnRhaW5lclwiIGNsYXNzPVwiZnctYm9sZCB0ZXh0LWdyYXktNjAwIGJvcmRlci0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBqb2Igb2YgU3VjY2VlZGVkUGFnaW5nUmVzdWx0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tqb2Iuam9ifX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7am9iLnN1Y2NlZWRlZEF0fX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7am9iLnRvdGFsRHVyYXRpb259fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgKm5nSWY9XCJTdWNjZWVkZWRQYWdpbmdSZXN1bHQubGVuZ3RoID09IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLWVtcHR5LWRhdGE+PC9saWItZW1wdHktZGF0YT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtZm9vdGVyIGJvcmRlci0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPEJCU0YtUGFnaW5nIChJdGVtcyk9XCJzZXRTdWNjZWVkZWRMaXN0UmVzdWx0KCRldmVudClcIiAqbmdJZj1cIklzU3VjY2VlZGVkRmlsdGVyTG9hZGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiU3VjY2VlZGVkUGFnaW5nXCIgW2dyb3VwXT1cIlN1Y2NlZWRlZEZvcm1cIiAjU3VjY2VlZGVkUGFnaW5nVmlld0VsZW1lbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9CQlNGLVBhZ2luZz5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICA8bGkgbmdiTmF2SXRlbSBjbGFzcz1cIm5hdi1pdGVtIG10LTJcIj5cclxuICAgICAgICAgICAgICA8YSBuZ2JOYXZMaW5rIGNsYXNzPVwibmF2LWxpbmsgdGV4dC1hY3RpdmUtcHJpbWFyeSBtcy0wIG1lLTEwIHB5LTVcIiAoY2xpY2spPVwiTG9hZEZhaWxlZEpvYnMoKVwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkZhaWxlZFwiKX19KHt7Sm9iQ291bnRzTW9kZWwuRmFpbGVkfX0pPC9hPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuZ2JOYXZDb250ZW50PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmRcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBweS0zIHB4LTBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBiZWdpbjo6VGFibGUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBhbGlnbi1taWRkbGUgdGFibGUtcm93LWRhc2hlZCBmcy02IGd5LTUgZGF0YVRhYmxlIG5vLWZvb3RlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwidGV4dC1zdGFydCB0ZXh0LWdyYXktNDAwIGZ3LWJvbGRlciBmcy03IHRleHQtdXBwZXJjYXNlIGdzLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cIm1pbi13LTE1MFwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkZhaWxlZEF0XCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwibWluLXctMTUwXCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiSm9iXCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwibWluLXctMTUwXCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiRXJyb3JNZXNzYWdlXCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwibWluLXctMTUwXCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiRXJyb3JNZXNzYWdlXCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keSBpZD1cImxpc3RpbmdDb250YWluZXJcIiBjbGFzcz1cImZ3LWJvbGQgdGV4dC1ncmF5LTYwMCBib3JkZXItMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgam9iIG9mIEZhaWxlZFBhZ2luZ1Jlc3VsdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7am9iLmZhaWxlZEF0fX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7am9iLmpvYn19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2pvYi5yZWFzb259fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJmYWlsZWQtam9iLWRldGFpbHMgZGlyZWN0aW9uTHRyXCIgKm5nSWY9XCJqb2IuaW5GYWlsZWRTdGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXhwYW5kYWJsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPiB7e2pvYi5leGNlcHRpb25UeXBlfX08L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2pvYi5leGNlcHRpb25NZXNzYWdlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgKm5nSWY9XCJGYWlsZWRQYWdpbmdSZXN1bHQubGVuZ3RoID09IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLWVtcHR5LWRhdGE+PC9saWItZW1wdHktZGF0YT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1mb290ZXIgYm9yZGVyLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8QkJTRi1QYWdpbmcgKEl0ZW1zKT1cInNldEZhaWxlZExpc3RSZXN1bHQoJGV2ZW50KVwiICpuZ0lmPVwiSXNGYWlsZWRGaWx0ZXJMb2FkZWRcIiBbb3B0aW9uc109XCJGYWlsZWRQYWdpbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZ3JvdXBdPVwiRmFpbGVkRm9ybVwiICNGYWlsZWRQYWdpbmdWaWV3RWxlbWVudD5cclxuICAgICAgICAgICAgICAgICAgICA8L0JCU0YtUGFnaW5nPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgIDxsaSBuZ2JOYXZJdGVtIGNsYXNzPVwibmF2LWl0ZW0gbXQtMlwiPlxyXG4gICAgICAgICAgICAgIDxhIG5nYk5hdkxpbmsgY2xhc3M9XCJuYXYtbGluayB0ZXh0LWFjdGl2ZS1wcmltYXJ5IG1zLTAgbWUtMTAgcHktNVwiIChjbGljayk9XCJMb2FkRGVsZXRlZEpvYnMoKVwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkRlbGV0ZWRcIil9fSh7e0pvYkNvdW50c01vZGVsLkRlbGV0ZWR9fSk8L2E+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG5nYk5hdkNvbnRlbnQ+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHB5LTMgcHgtMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIGJlZ2luOjpUYWJsZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIGFsaWduLW1pZGRsZSB0YWJsZS1yb3ctZGFzaGVkIGZzLTYgZ3ktNSBkYXRhVGFibGUgbm8tZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJ0ZXh0LXN0YXJ0IHRleHQtZ3JheS00MDAgZnctYm9sZGVyIGZzLTcgdGV4dC11cHBlcmNhc2UgZ3MtMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwibWluLXctMTUwcHhcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJKb2JcIil9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJtaW4tdy0xNTBweFwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkRlbGV0ZWRBdFwiKX19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHkgaWQ9XCJsaXN0aW5nQ29udGFpbmVyXCIgY2xhc3M9XCJmdy1ib2xkIHRleHQtZ3JheS02MDAgYm9yZGVyLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IGpvYiBvZiBEZWxldGVkUGFnaW5nUmVzdWx0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tqb2Iuam9ifX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7am9iLmRlbGV0ZWRBdH19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciAgKm5nSWY9XCJEZWxldGVkUGFnaW5nUmVzdWx0Lmxlbmd0aCA9PSAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1lbXB0eS1kYXRhPjwvbGliLWVtcHR5LWRhdGE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtZm9vdGVyIGJvcmRlci0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPEJCU0YtUGFnaW5nIChJdGVtcyk9XCJzZXREZWxldGVkTGlzdFJlc3VsdCgkZXZlbnQpXCIgKm5nSWY9XCJJc0RlbGV0ZWRGaWx0ZXJMb2FkZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJEZWxldGVkUGFnaW5nXCIgW2dyb3VwXT1cIkRlbGV0ZWRGb3JtXCIgI0RlbGV0ZWRQYWdpbmdWaWV3RWxlbWVudD5cclxuICAgICAgICAgICAgICAgICAgICA8L0JCU0YtUGFnaW5nPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgPGRpdiBbbmdiTmF2T3V0bGV0XT1cIm5hdlwiPjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICA8L2Rpdj5cclxuIFxyXG5cclxuIl19
|
|
233
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam9icy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYnNmLWFkbWluLXBvcnRhbC9zcmMvbGliL1BhZ2VzL2pvYnMvam9icy9qb2JzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtYWRtaW4tcG9ydGFsL3NyYy9saWIvUGFnZXMvam9icy9qb2JzL2pvYnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDeEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDM0csT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQzs7Ozs7Ozs7OztBQVU5RSxNQUFNLE9BQU8sYUFBYTtJQTJEeEIsWUFDVSxlQUFnQyxFQUNqQyxjQUE4QixFQUM3QixrQkFBc0MsRUFDdEMsV0FBd0IsRUFDeEIscUJBQTRDO1FBSjVDLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNqQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDN0IsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUN0QyxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QiwwQkFBcUIsR0FBckIscUJBQXFCLENBQXVCO1FBOUR0RCxtQkFBbUI7UUFDbkIsV0FBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFBO1FBSWhDLG1CQUFjLEdBQW1CLElBQUksY0FBYyxFQUFFLENBQUM7UUFDdEQsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFDaEMsdUJBQWtCLEdBQVksS0FBSyxDQUFDO1FBR3BDLDJDQUEyQztRQUMzQyxpQkFBWSxHQUFHLElBQUksU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pDLHVCQUFrQixHQUFZLEtBQUssQ0FBQztRQUNwQyx5QkFBb0IsR0FBVSxFQUFFLENBQUM7UUFDakMsaUNBQTRCLEdBQVUsRUFBRSxDQUFDO1FBR3pDLDJCQUFzQixHQUFZLEtBQUssQ0FBQztRQUd4Qyw0Q0FBNEM7UUFDNUMsa0JBQWEsR0FBRyxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNsQywwQkFBcUIsR0FBVSxFQUFFLENBQUM7UUFFbEMsNEJBQXVCLEdBQVksS0FBSyxDQUFDO1FBR3pDLDZDQUE2QztRQUM3QyxtQkFBYyxHQUFHLElBQUksU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25DLDJCQUFzQixHQUFVLEVBQUUsQ0FBQztRQUVuQyw2QkFBd0IsR0FBWSxLQUFLLENBQUM7UUFHMUMsNENBQTRDO1FBQzVDLGtCQUFhLEdBQUcsSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEMsMEJBQXFCLEdBQVUsRUFBRSxDQUFDO1FBRWxDLDRCQUF1QixHQUFZLEtBQUssQ0FBQztRQUd6QywwQ0FBMEM7UUFDMUMsZUFBVSxHQUFHLElBQUksU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLHVCQUFrQixHQUFVLEVBQUUsQ0FBQztRQUUvQix5QkFBb0IsR0FBWSxLQUFLLENBQUM7UUFHdEMsMENBQTBDO1FBQzFDLGdCQUFXLEdBQUcsSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEMsd0JBQW1CLEdBQVUsRUFBRSxDQUFDO1FBRWhDLDBCQUFxQixHQUFZLEtBQUssQ0FBQztJQVl2QyxDQUFDO0lBQ0QsUUFBUTtRQUNOLG9DQUFvQztRQUNwQyxlQUFlLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDeEUsZUFBZSxDQUFDLGVBQWUsR0FBRztZQUNoQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO1lBQ2pILEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRTtTQUU1RCxDQUFDO1FBRUYsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsZUFBZSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtRQUNqRSxpQkFBaUI7UUFDakIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFJRCw0QkFBNEI7SUFFNUIscUJBQXFCLENBQUMsTUFBTTtRQUMxQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsTUFBTSxDQUFBO1FBQ2xDLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUE7SUFDL0QsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixZQUFZO1FBQ1YsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNELElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFvQixDQUFDO1FBQ3hDLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBRS9CLENBQUM7SUFFRCw0QkFBNEI7SUFFNUIsc0JBQXNCLENBQUMsTUFBTTtRQUMzQixJQUFJLENBQUMscUJBQXFCLEdBQUcsTUFBTSxDQUFBO0lBQ3JDLENBQUM7SUFFRCw2QkFBNkI7SUFFN0IsdUJBQXVCLENBQUMsTUFBTTtRQUM1QixJQUFJLENBQUMsc0JBQXNCLEdBQUcsTUFBTSxDQUFBO0lBRXRDLENBQUM7SUFFRCw0QkFBNEI7SUFFNUIsc0JBQXNCLENBQUMsTUFBTTtRQUMzQixJQUFJLENBQUMscUJBQXFCLEdBQUcsTUFBTSxDQUFBO0lBQ3JDLENBQUM7SUFDRCx5QkFBeUI7SUFFekIsbUJBQW1CLENBQUMsTUFBTTtRQUN4QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxDQUFBO0lBQ2xDLENBQUM7SUFFRCwwQkFBMEI7SUFFMUIsb0JBQW9CLENBQUMsTUFBTTtRQUN6QixJQUFJLENBQUMsbUJBQW1CLEdBQUcsTUFBTSxDQUFBO0lBRW5DLENBQUM7SUFFRCxpQkFBaUI7SUFFakIsY0FBYztRQUNaLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDckQsSUFBSSxLQUFLLEdBQUcsTUFBYSxDQUFBO1lBQ3pCLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUE7WUFDN0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQTtZQUMvQyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFBO1lBQy9DLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUE7WUFDakQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQTtZQUN6QyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFBO1lBQzNDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBSUQsZ0JBQWdCO1FBQ2QsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQztRQUNwQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO1FBQ3JDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxLQUFLLENBQUM7UUFDdEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQztRQUNyQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUM7UUFFbkMsZUFBZTtRQUNmLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUMxQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksR0FBRyxlQUFlLENBQUE7UUFDekMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFBO1FBQ25DLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUE7UUFDeEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUVyRixJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNoRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQTtRQUM5RCxJQUFJLENBQUMsdUJBQXVCLENBQUMsbUJBQW1CLEdBQUcsWUFBWSxDQUFBO1FBQy9ELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFBO1FBQ2pELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQTtRQUU1RCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7UUFDMUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxzQkFBc0IsQ0FBQztRQUN6RSxJQUFJLENBQUMsY0FBYyxDQUFDLDZCQUE2QixHQUFHLENBQUMsZUFBZSxDQUFDLENBQUE7UUFDckUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQTtRQUU1RCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDO0lBRXJDLENBQUM7SUFHRCxpQkFBaUI7UUFDZixJQUFJLENBQUMsc0JBQXNCLEdBQUcsS0FBSyxDQUFDO1FBQ3BDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7UUFDckMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLEtBQUssQ0FBQztRQUN0QyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7UUFDbEMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztRQUVuQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7UUFDM0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRywwQkFBMEIsQ0FBQztRQUM5RSxJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDO0lBR3RDLENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQztRQUNwQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO1FBQ3JDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxLQUFLLENBQUM7UUFDdEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQztRQUNyQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUM7UUFFbkMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7UUFDNUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLDJCQUEyQixDQUFDO1FBQ2hGLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUM7SUFFdkMsQ0FBQztJQUVELGlCQUFpQjtRQUNmLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxLQUFLLENBQUM7UUFDcEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQztRQUNyQyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsS0FBSyxDQUFDO1FBQ3RDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7UUFDckMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztRQUNsQyxJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDO1FBRW5DLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLDBCQUEwQixDQUFDO1FBQzlFLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUM7SUFHdEMsQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLENBQUMsc0JBQXNCLEdBQUcsS0FBSyxDQUFDO1FBQ3BDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7UUFDckMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLEtBQUssQ0FBQztRQUN0QyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7UUFDbEMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztRQUVuQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyx1QkFBdUIsQ0FBQztRQUN4RSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO0lBR25DLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQztRQUNwQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO1FBQ3JDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxLQUFLLENBQUM7UUFDdEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQztRQUNyQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUM7UUFFbkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsd0JBQXdCLENBQUM7UUFDMUUsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQztJQUVwQyxDQUFDO0lBRUQsb0NBQW9DO0lBQ3BDLGdFQUFnRTtJQUNoRSxnQkFBZ0I7SUFDaEIsNkNBQTZDO0lBQzdDLGtCQUFrQixDQUFDLFdBQVc7UUFDNUIsSUFBSSxXQUFXO1lBQ2IsSUFBSSxDQUFDLDRCQUE0QixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDOztZQUV6SSxJQUFJLENBQUMsNEJBQTRCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFBO0lBQ2pFLENBQUM7SUFFRCxvREFBb0Q7SUFDcEQsV0FBVztRQUNULElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUM5QyxDQUFDOzsyR0ExUVUsYUFBYTsrRkFBYixhQUFhLCtzQkNkMUIsa2llQWtRQTs0RkRwUGEsYUFBYTtrQkFMekIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsVUFBVTtvQkFDcEIsV0FBVyxFQUFFLHVCQUF1QjtvQkFDcEMsU0FBUyxFQUFFLENBQUMsc0JBQXNCLENBQUM7aUJBQ3BDO2tPQXFCNEQsYUFBYTtzQkFBdkUsU0FBUzt1QkFBQywyQkFBMkIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBT0csY0FBYztzQkFBekUsU0FBUzt1QkFBQyw0QkFBNEIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBT0csZUFBZTtzQkFBM0UsU0FBUzt1QkFBQyw2QkFBNkIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBT0MsY0FBYztzQkFBekUsU0FBUzt1QkFBQyw0QkFBNEIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBT0QsV0FBVztzQkFBbkUsU0FBUzt1QkFBQyx5QkFBeUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBT0csWUFBWTtzQkFBckUsU0FBUzt1QkFBQywwQkFBMEIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgVmlld0NoaWxkLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBGaWx0ZXJJdGVtLCBGaWx0ZXJUeXBlLCBJbnB1dFR5cGUsIFBhZ2luZ09wdGlvbnMsIFRleHRCb3hPcHRpb25zIH0gZnJvbSAnQGJuc2lnaHRzL2Jic2YtY29udHJvbHMnO1xyXG5pbXBvcnQgeyBQYWdlSW5mb1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9fbWV0cm9uaWMvY29yZS9zZXJ2aWNlcy9wYWdlLWluZm8uc2VydmljZSc7XHJcbmltcG9ydCB7IEpvYkNvdW50c01vZGVsIH0gZnJvbSAnLi4vLi4vc2hhcmVkL21vZGVscy9Kb2JNb2RlbHMvSm9iQ291bnRzTW9kZWwnO1xyXG5pbXBvcnQgeyBKb2JzU2VydmljZSB9IGZyb20gJy4vLi4vLi4vc2hhcmVkL1NlcnZpY2VzL0pvYnNTZXJ2aWNlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVdGlsaXR5U2VydmljZSwgRW52aXJvbm1lbnRTZXJ2aWNlLCBSZXF1ZXN0SGFuZGxlclNlcnZpY2UgfSBmcm9tICdAYm5zaWdodHMvYmJzZi11dGlsaXRpZXMnO1xyXG5pbXBvcnQgeyBQYWdpbmdDb21wb25lbnQgfSBmcm9tICdAYm5zaWdodHMvYmJzZi1jb250cm9scy9saWIvY29udHJvbHMvUGFnaW5nL1BhZ2luZy5jb21wb25lbnQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItam9icycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2pvYnMuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2pvYnMuY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBKb2JzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG5cclxuICAvL1BhZ2UgcmVxdWlyZW1lbnRzXHJcbiAgQXBpVXJsID0gdGhpcy5qb2JzU2VydmljZS5BcGlVcmxcclxuXHJcbiAgLy9QYWdlIENvbnRlbnRcclxuICBzZWFyY2hUZXh0Qm94OiBUZXh0Qm94T3B0aW9ucztcclxuICBqb2JDb3VudHNNb2RlbDogSm9iQ291bnRzTW9kZWwgPSBuZXcgSm9iQ291bnRzTW9kZWwoKTtcclxuICBwcm9kdWN0aW9uTW9kZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzU3RhdGlzdGljc0xvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHJcbiAgLy9GaWx0ZXIgYW5kIHBhZ2luZyBFbnF1ZXVlZCBKb2JzIGNvbXBvbmVudFxyXG4gIGVucXVldWVkRm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gIHNob3dFbnF1ZXVlZEZpbHRlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGVucXVldWVkUGFnaW5nUmVzdWx0OiBhbnlbXSA9IFtdO1xyXG4gIGZpbHRlcmVkRW5xdWV1ZWRQYWdpbmdSZXN1bHQ6IGFueVtdID0gW107XHJcbiAgZW5xdWV1ZWRQYWdpbmc6IFBhZ2luZ09wdGlvbnM7XHJcbiAgZW5xdWV1ZWRUZXh0SW5wdXRGaWx0ZXI6IEZpbHRlckl0ZW07XHJcbiAgaXNFbnF1ZXVlZEZpbHRlckxvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBWaWV3Q2hpbGQoJ0VucXVldWVkUGFnaW5nVmlld0VsZW1lbnQnLCB7IHN0YXRpYzogZmFsc2UgfSkgZW5xdWV1ZWRJbnB1dDogUGFnaW5nQ29tcG9uZW50O1xyXG5cclxuICAvL0ZpbHRlciBhbmQgcGFnaW5nIFNjaGVkdWxlZCBKb2JzIGNvbXBvbmVudFxyXG4gIHNjaGVkdWxlZEZvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuICBzY2hlZHVsZWRQYWdpbmdSZXN1bHQ6IGFueVtdID0gW107XHJcbiAgc2NoZWR1bGVkUGFnaW5nOiBQYWdpbmdPcHRpb25zO1xyXG4gIGlzU2NoZWR1bGVkRmlsdGVyTG9hZGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQFZpZXdDaGlsZCgnU2NoZWR1bGVkUGFnaW5nVmlld0VsZW1lbnQnLCB7IHN0YXRpYzogZmFsc2UgfSkgc2NoZWR1bGVkSW5wdXQ6IFBhZ2luZ0NvbXBvbmVudDtcclxuXHJcbiAgLy9GaWx0ZXIgYW5kIHBhZ2luZyBQcm9jZXNzaW5nIEpvYnMgY29tcG9uZW50XHJcbiAgcHJvY2Vzc2luZ0Zvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuICBwcm9jZXNzaW5nUGFnaW5nUmVzdWx0OiBhbnlbXSA9IFtdO1xyXG4gIHByb2Nlc3NpbmdQYWdpbmc6IFBhZ2luZ09wdGlvbnM7XHJcbiAgaXNQcm9jZXNzaW5nRmlsdGVyTG9hZGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQFZpZXdDaGlsZCgnUHJvY2Vzc2luZ1BhZ2luZ1ZpZXdFbGVtZW50JywgeyBzdGF0aWM6IGZhbHNlIH0pIHByb2Nlc3NpbmdJbnB1dDogUGFnaW5nQ29tcG9uZW50O1xyXG5cclxuICAvL0ZpbHRlciBhbmQgcGFnaW5nIFN1Y2NlZWRlZCBKb2JzIGNvbXBvbmVudFxyXG4gIHN1Y2NlZWRlZEZvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuICBzdWNjZWVkZWRQYWdpbmdSZXN1bHQ6IGFueVtdID0gW107XHJcbiAgc3VjY2VlZGVkUGFnaW5nOiBQYWdpbmdPcHRpb25zO1xyXG4gIGlzU3VjY2VlZGVkRmlsdGVyTG9hZGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQFZpZXdDaGlsZCgnU3VjY2VlZGVkUGFnaW5nVmlld0VsZW1lbnQnLCB7IHN0YXRpYzogZmFsc2UgfSkgc3VjY2VlZGVkSW5wdXQ6IFBhZ2luZ0NvbXBvbmVudDtcclxuXHJcbiAgLy9GaWx0ZXIgYW5kIHBhZ2luZyAgRmFpbGVkIEpvYnMgY29tcG9uZW50XHJcbiAgZmFpbGVkRm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gIGZhaWxlZFBhZ2luZ1Jlc3VsdDogYW55W10gPSBbXTtcclxuICBmYWlsZWRQYWdpbmc6IFBhZ2luZ09wdGlvbnM7XHJcbiAgaXNGYWlsZWRGaWx0ZXJMb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBAVmlld0NoaWxkKCdGYWlsZWRQYWdpbmdWaWV3RWxlbWVudCcsIHsgc3RhdGljOiBmYWxzZSB9KSBmYWlsZWRJbnB1dDogUGFnaW5nQ29tcG9uZW50O1xyXG5cclxuICAvL0ZpbHRlciBhbmQgcGFnaW5nIERlbGV0ZWQgSm9icyBjb21wb25lbnRcclxuICBkZWxldGVkRm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gIGRlbGV0ZWRQYWdpbmdSZXN1bHQ6IGFueVtdID0gW107XHJcbiAgZGVsZXRlZFBhZ2luZzogUGFnaW5nT3B0aW9ucztcclxuICBpc0RlbGV0ZWRGaWx0ZXJMb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBAVmlld0NoaWxkKCdEZWxldGVkUGFnaW5nVmlld0VsZW1lbnQnLCB7IHN0YXRpYzogZmFsc2UgfSkgZGVsZXRlZElucHV0OiBQYWdpbmdDb21wb25lbnQ7XHJcblxyXG5cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHBhZ2VJbmZvU2VydmljZTogUGFnZUluZm9TZXJ2aWNlLFxyXG4gICAgcHVibGljIHV0aWxpdHlTZXJ2aWNlOiBVdGlsaXR5U2VydmljZSxcclxuICAgIHByaXZhdGUgZW52aXJvbm1lbnRTZXJ2aWNlOiBFbnZpcm9ubWVudFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGpvYnNTZXJ2aWNlOiBKb2JzU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVxdWVzdEhhbmRsZXJTZXJ2aWNlOiBSZXF1ZXN0SGFuZGxlclNlcnZpY2VcclxuICApIHtcclxuICB9XHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICAvL1BhZ2UgaGVhZGVyIChicmVhZGNydW1iIGFuZCB0aXRsZSlcclxuICAgIFBhZ2VJbmZvU2VydmljZS5QYWdlVGl0bGUgPSB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJKb2JzXCIpXHJcbiAgICBQYWdlSW5mb1NlcnZpY2UuUGFnZUJyZWFkY3J1bWJzID0gW1xyXG4gICAgICB7IHRpdGxlOiB0aGlzLnV0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJIb21lXCIpLCBwYXRoOiAnL0FkbWluL0hvbWUnLCBpc1NlcGFyYXRvcjogZmFsc2UsIGlzQWN0aXZlOiBmYWxzZSB9LFxyXG4gICAgICB7IHRpdGxlOiAnJywgcGF0aDogJycsIGlzU2VwYXJhdG9yOiB0cnVlLCBpc0FjdGl2ZTogZmFsc2UgfVxyXG5cclxuICAgIF07XHJcblxyXG4gICAgdGhpcy5wYWdlSW5mb1NlcnZpY2UuY2FsY3VsYXRlVGl0bGUoKTtcclxuICAgIHRoaXMucGFnZUluZm9TZXJ2aWNlLmNhbGN1bGF0ZUJyZWFkY3J1bWJzKCk7XHJcbiAgICB0aGlzLnByb2R1Y3Rpb25Nb2RlID0gdGhpcy5lbnZpcm9ubWVudFNlcnZpY2UuZ2V0UHJvZHVjdGlvbk1vZGUoKVxyXG4gICAgLy9pbml0aWFsaXplIHBhZ2VcclxuICAgIHRoaXMubG9hZFN0YXRpc3RpY3MoKTtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgLy8gRW5xdWV1ZWQgUGFnaW5nIGZ1bmN0aW9uc1xyXG5cclxuICBzZXRFbnF1ZXVlZExpc3RSZXN1bHQocmVzdWx0KSB7XHJcbiAgICB0aGlzLmVucXVldWVkUGFnaW5nUmVzdWx0ID0gcmVzdWx0XHJcbiAgICB0aGlzLmZpbHRlcmVkRW5xdWV1ZWRQYWdpbmdSZXN1bHQgPSB0aGlzLmVucXVldWVkUGFnaW5nUmVzdWx0XHJcbiAgfVxyXG5cclxuICAvL0ZpbHRlciBmdW5jdGlvbnNcclxuICByZXNldEZpbHRlcnMoKSB7XHJcbiAgICB0aGlzLmVucXVldWVkRm9ybS5jb250cm9sc1tcInNlYXJjaFRleHRCb3hcIl0uc2V0VmFsdWUobnVsbCk7XHJcbiAgICBsZXQgZWxlbWVudCA9IHRoaXMuZW5xdWV1ZWRJbnB1dCBhcyBhbnk7XHJcbiAgICBlbGVtZW50LlJlaW5pdGlhbGl6ZVBhZ2luZygpO1xyXG5cclxuICB9XHJcblxyXG4gIC8vU2NoZWR1bGVkIFBhZ2luZyBmdW5jdGlvbnNcclxuXHJcbiAgc2V0U2NoZWR1bGVkTGlzdFJlc3VsdChyZXN1bHQpIHtcclxuICAgIHRoaXMuc2NoZWR1bGVkUGFnaW5nUmVzdWx0ID0gcmVzdWx0XHJcbiAgfVxyXG5cclxuICAvL1Byb2Nlc3NpbmcgUGFnaW5nIGZ1bmN0aW9uc1xyXG5cclxuICBzZXRQcm9jZXNzaW5nTGlzdFJlc3VsdChyZXN1bHQpIHtcclxuICAgIHRoaXMucHJvY2Vzc2luZ1BhZ2luZ1Jlc3VsdCA9IHJlc3VsdFxyXG5cclxuICB9XHJcblxyXG4gIC8vU3VjY2VlZGVkIFBhZ2luZyBmdW5jdGlvbnNcclxuXHJcbiAgc2V0U3VjY2VlZGVkTGlzdFJlc3VsdChyZXN1bHQpIHtcclxuICAgIHRoaXMuc3VjY2VlZGVkUGFnaW5nUmVzdWx0ID0gcmVzdWx0XHJcbiAgfVxyXG4gIC8vRmFpbGVkIFBhZ2luZyBmdW5jdGlvbnNcclxuXHJcbiAgc2V0RmFpbGVkTGlzdFJlc3VsdChyZXN1bHQpIHtcclxuICAgIHRoaXMuZmFpbGVkUGFnaW5nUmVzdWx0ID0gcmVzdWx0XHJcbiAgfVxyXG5cclxuICAvL0RlbGV0ZWQgUGFnaW5nIGZ1bmN0aW9uc1xyXG5cclxuICBzZXREZWxldGVkTGlzdFJlc3VsdChyZXN1bHQpIHtcclxuICAgIHRoaXMuZGVsZXRlZFBhZ2luZ1Jlc3VsdCA9IHJlc3VsdFxyXG5cclxuICB9XHJcblxyXG4gIC8vaW5pdGlhbGl6ZSBwYWdlXHJcblxyXG4gIGxvYWRTdGF0aXN0aWNzKCkge1xyXG4gICAgdGhpcy5qb2JzU2VydmljZS5Mb2FkU3RhdGlzdGljcygpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XHJcbiAgICAgIGxldCBMaXN0cyA9IHJlc3VsdCBhcyBhbnlcclxuICAgICAgdGhpcy5qb2JDb3VudHNNb2RlbC5FbnF1ZXVlZCA9IExpc3RzLmVucXVldWVkXHJcbiAgICAgIHRoaXMuam9iQ291bnRzTW9kZWwuU3VjY2VlZGVkID0gTGlzdHMuc3VjY2VlZGVkXHJcbiAgICAgIHRoaXMuam9iQ291bnRzTW9kZWwuU2NoZWR1bGVkID0gTGlzdHMuc2NoZWR1bGVkXHJcbiAgICAgIHRoaXMuam9iQ291bnRzTW9kZWwuUHJvY2Vzc2luZyA9IExpc3RzLnByb2Nlc3NpbmdcclxuICAgICAgdGhpcy5qb2JDb3VudHNNb2RlbC5GYWlsZWQgPSBMaXN0cy5mYWlsZWRcclxuICAgICAgdGhpcy5qb2JDb3VudHNNb2RlbC5EZWxldGVkID0gTGlzdHMuZGVsZXRlZFxyXG4gICAgICB0aGlzLmlzU3RhdGlzdGljc0xvYWRlZCA9IHRydWU7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcblxyXG5cclxuICBsb2FkRW5xdWV1ZWRKb2JzKCkge1xyXG4gICAgdGhpcy5pc0VucXVldWVkRmlsdGVyTG9hZGVkID0gZmFsc2U7XHJcbiAgICB0aGlzLmlzU2NoZWR1bGVkRmlsdGVyTG9hZGVkID0gZmFsc2U7XHJcbiAgICB0aGlzLmlzUHJvY2Vzc2luZ0ZpbHRlckxvYWRlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc1N1Y2NlZWRlZEZpbHRlckxvYWRlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc0ZhaWxlZEZpbHRlckxvYWRlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc0RlbGV0ZWRGaWx0ZXJMb2FkZWQgPSBmYWxzZTtcclxuXHJcbiAgICAvLyBUZXh0Qm94IGludGlcclxuICAgIHRoaXMuc2VhcmNoVGV4dEJveCA9IG5ldyBUZXh0Qm94T3B0aW9ucygpO1xyXG4gICAgdGhpcy5zZWFyY2hUZXh0Qm94Lk5hbWUgPSBcInNlYXJjaFRleHRCb3hcIlxyXG4gICAgdGhpcy5zZWFyY2hUZXh0Qm94LkhpZGVMYWJlbCA9IHRydWVcclxuICAgIHRoaXMuc2VhcmNoVGV4dEJveC5UeXBlID0gSW5wdXRUeXBlLlRleHRcclxuICAgIHRoaXMuc2VhcmNoVGV4dEJveC5QbGFjZWhvbGRlciA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlNlYXJjaEJ5TmFtZVwiKVxyXG5cclxuICAgIHRoaXMuZW5xdWV1ZWRUZXh0SW5wdXRGaWx0ZXIgPSBuZXcgRmlsdGVySXRlbSgpO1xyXG4gICAgdGhpcy5lbnF1ZXVlZFRleHRJbnB1dEZpbHRlci5Gb3JtQ29udHJvbE5hbWUgPSBcInNlYXJjaFRleHRCb3hcIlxyXG4gICAgdGhpcy5lbnF1ZXVlZFRleHRJbnB1dEZpbHRlci5BY3Rpb25QYXJhbWV0ZXJOYW1lID0gXCJzZWFyY2hUZXh0XCJcclxuICAgIHRoaXMuZW5xdWV1ZWRUZXh0SW5wdXRGaWx0ZXIuSXNGb3JtQ29udHJvbCA9IHRydWVcclxuICAgIHRoaXMuZW5xdWV1ZWRUZXh0SW5wdXRGaWx0ZXIuRmlsdGVyVHlwZSA9IEZpbHRlclR5cGUuVGV4dEJveFxyXG5cclxuICAgIHRoaXMuZW5xdWV1ZWRQYWdpbmcgPSBuZXcgUGFnaW5nT3B0aW9ucygpO1xyXG4gICAgdGhpcy5lbnF1ZXVlZFBhZ2luZy5BY3Rpb25Qb3N0VVJMID0gdGhpcy5BcGlVcmwgKyAnR2V0UXVldWVMaXN0QnlGaWx0ZXInO1xyXG4gICAgdGhpcy5lbnF1ZXVlZFBhZ2luZy5PbktleVByZXNzRmlsdGVyc0NvbnRyb2xOYW1lcyA9IFtcInNlYXJjaFRleHRCb3hcIl1cclxuICAgIHRoaXMuZW5xdWV1ZWRQYWdpbmcuRmlsdGVycyA9IFt0aGlzLmVucXVldWVkVGV4dElucHV0RmlsdGVyXVxyXG5cclxuICAgIHRoaXMuaXNFbnF1ZXVlZEZpbHRlckxvYWRlZCA9IHRydWU7XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIGxvYWRTY2hlZHVsZWRKb2JzKCkge1xyXG4gICAgdGhpcy5pc0VucXVldWVkRmlsdGVyTG9hZGVkID0gZmFsc2U7XHJcbiAgICB0aGlzLmlzU2NoZWR1bGVkRmlsdGVyTG9hZGVkID0gZmFsc2U7XHJcbiAgICB0aGlzLmlzUHJvY2Vzc2luZ0ZpbHRlckxvYWRlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc1N1Y2NlZWRlZEZpbHRlckxvYWRlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc0ZhaWxlZEZpbHRlckxvYWRlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc0RlbGV0ZWRGaWx0ZXJMb2FkZWQgPSBmYWxzZTtcclxuXHJcbiAgICB0aGlzLnNjaGVkdWxlZFBhZ2luZyA9IG5ldyBQYWdpbmdPcHRpb25zKCk7XHJcbiAgICB0aGlzLnNjaGVkdWxlZFBhZ2luZy5BY3Rpb25Qb3N0VVJMID0gdGhpcy5BcGlVcmwgKyAnR2V0U2NoZWR1bGVkTGlzdEJ5RmlsdGVyJztcclxuICAgIHRoaXMuaXNTY2hlZHVsZWRGaWx0ZXJMb2FkZWQgPSB0cnVlO1xyXG5cclxuXHJcbiAgfVxyXG5cclxuICBsb2FkUHJvY2Vzc2luZ0pvYnMoKSB7XHJcbiAgICB0aGlzLmlzRW5xdWV1ZWRGaWx0ZXJMb2FkZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuaXNTY2hlZHVsZWRGaWx0ZXJMb2FkZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuaXNQcm9jZXNzaW5nRmlsdGVyTG9hZGVkID0gZmFsc2U7XHJcbiAgICB0aGlzLmlzU3VjY2VlZGVkRmlsdGVyTG9hZGVkID0gZmFsc2U7XHJcbiAgICB0aGlzLmlzRmFpbGVkRmlsdGVyTG9hZGVkID0gZmFsc2U7XHJcbiAgICB0aGlzLmlzRGVsZXRlZEZpbHRlckxvYWRlZCA9IGZhbHNlO1xyXG5cclxuICAgIHRoaXMucHJvY2Vzc2luZ1BhZ2luZyA9IG5ldyBQYWdpbmdPcHRpb25zKCk7XHJcbiAgICB0aGlzLnByb2Nlc3NpbmdQYWdpbmcuQWN0aW9uUG9zdFVSTCA9IHRoaXMuQXBpVXJsICsgJ0dldFByb2Nlc3NpbmdMaXN0QnlGaWx0ZXInO1xyXG4gICAgdGhpcy5pc1Byb2Nlc3NpbmdGaWx0ZXJMb2FkZWQgPSB0cnVlO1xyXG5cclxuICB9XHJcblxyXG4gIGxvYWRTdWNjZWVkZWRKb2JzKCkge1xyXG4gICAgdGhpcy5pc0VucXVldWVkRmlsdGVyTG9hZGVkID0gZmFsc2U7XHJcbiAgICB0aGlzLmlzU2NoZWR1bGVkRmlsdGVyTG9hZGVkID0gZmFsc2U7XHJcbiAgICB0aGlzLmlzUHJvY2Vzc2luZ0ZpbHRlckxvYWRlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc1N1Y2NlZWRlZEZpbHRlckxvYWRlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc0ZhaWxlZEZpbHRlckxvYWRlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc0RlbGV0ZWRGaWx0ZXJMb2FkZWQgPSBmYWxzZTtcclxuXHJcbiAgICB0aGlzLnN1Y2NlZWRlZFBhZ2luZyA9IG5ldyBQYWdpbmdPcHRpb25zKCk7XHJcbiAgICB0aGlzLnN1Y2NlZWRlZFBhZ2luZy5BY3Rpb25Qb3N0VVJMID0gdGhpcy5BcGlVcmwgKyAnR2V0U3VjY2VlZGVkTGlzdEJ5RmlsdGVyJztcclxuICAgIHRoaXMuaXNTdWNjZWVkZWRGaWx0ZXJMb2FkZWQgPSB0cnVlO1xyXG5cclxuXHJcbiAgfVxyXG5cclxuICBsb2FkRmFpbGVkSm9icygpIHtcclxuICAgIHRoaXMuaXNFbnF1ZXVlZEZpbHRlckxvYWRlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc1NjaGVkdWxlZEZpbHRlckxvYWRlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc1Byb2Nlc3NpbmdGaWx0ZXJMb2FkZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuaXNTdWNjZWVkZWRGaWx0ZXJMb2FkZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuaXNGYWlsZWRGaWx0ZXJMb2FkZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuaXNEZWxldGVkRmlsdGVyTG9hZGVkID0gZmFsc2U7XHJcblxyXG4gICAgdGhpcy5mYWlsZWRQYWdpbmcgPSBuZXcgUGFnaW5nT3B0aW9ucygpO1xyXG4gICAgdGhpcy5mYWlsZWRQYWdpbmcuQWN0aW9uUG9zdFVSTCA9IHRoaXMuQXBpVXJsICsgJ0dldEZhaWxlZExpc3RCeUZpbHRlcic7XHJcbiAgICB0aGlzLmlzRmFpbGVkRmlsdGVyTG9hZGVkID0gdHJ1ZTtcclxuXHJcblxyXG4gIH1cclxuXHJcbiAgbG9hZERlbGV0ZWRKb2JzKCkge1xyXG4gICAgdGhpcy5pc0VucXVldWVkRmlsdGVyTG9hZGVkID0gZmFsc2U7XHJcbiAgICB0aGlzLmlzU2NoZWR1bGVkRmlsdGVyTG9hZGVkID0gZmFsc2U7XHJcbiAgICB0aGlzLmlzUHJvY2Vzc2luZ0ZpbHRlckxvYWRlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc1N1Y2NlZWRlZEZpbHRlckxvYWRlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc0ZhaWxlZEZpbHRlckxvYWRlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc0RlbGV0ZWRGaWx0ZXJMb2FkZWQgPSBmYWxzZTtcclxuXHJcbiAgICB0aGlzLmRlbGV0ZWRQYWdpbmcgPSBuZXcgUGFnaW5nT3B0aW9ucygpO1xyXG4gICAgdGhpcy5kZWxldGVkUGFnaW5nLkFjdGlvblBvc3RVUkwgPSB0aGlzLkFwaVVybCArICdHZXREZWxldGVkTGlzdEJ5RmlsdGVyJztcclxuICAgIHRoaXMuaXNEZWxldGVkRmlsdGVyTG9hZGVkID0gdHJ1ZTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipGdW5jdGlvbk5hbWU6ZmlsdGVyRW5xdWV1ZWRMaXN0Ki9cclxuICAvKipEZWNsYXJhdGlvbjpmdW5jdGlvbiB0byBmaWx0ZXIgRW5xdWV1ZWRMaXN0IGluIGNsaWVudC1zaWRlICovXHJcbiAgLyoqUGFyYW1ldGVyczoqL1xyXG4gIC8qKnNlYXJjaFZhbHVlOiBjdXJyZW50IHZhbHVlIG9mIHNlYXJjaCBib3gqL1xyXG4gIGZpbHRlckVucXVldWVkTGlzdChzZWFyY2hWYWx1ZSkge1xyXG4gICAgaWYgKHNlYXJjaFZhbHVlKVxyXG4gICAgICB0aGlzLmZpbHRlcmVkRW5xdWV1ZWRQYWdpbmdSZXN1bHQgPSB0aGlzLmVucXVldWVkUGFnaW5nUmVzdWx0LmZpbHRlcihpdGVtID0+IGl0ZW0uam9iLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVmFsdWUudG9Mb3dlckNhc2UoKSkpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLmZpbHRlcmVkRW5xdWV1ZWRQYWdpbmdSZXN1bHQgPSB0aGlzLmVucXVldWVkUGFnaW5nUmVzdWx0XHJcbiAgfVxyXG5cclxuICAvLy8vLy8vLy8vL0Rlc3Ryb3kgT2JzZXJ2YWJsZSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlcXVlc3RIYW5kbGVyU2VydmljZS5kZXN0cm95SGFuZGxlcigpO1xyXG4gIH1cclxuXHJcblxyXG59XHJcbiIsIjxibG9jay11aT4gPC9ibG9jay11aT5cclxuICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQgY2FyZC1jdXN0b20taFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj5cclxuICAgICAgICAgIDx1bCBuZ2JOYXYgI25hdj1cIm5nYk5hdlwiIGNsYXNzPVwibmF2IG5hdi1zdHJldGNoIG5hdi1saW5lLXRhYnMgbmF2LWxpbmUtdGFicy0yeCBib3JkZXItdHJhbnNwYXJlbnQgZnMtNSBmdy1ib2xkZXJcIj5cclxuICAgICAgICAgICAgPGxpIG5nYk5hdkl0ZW0gY2xhc3M9XCJuYXYtaXRlbSBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgPGEgbmdiTmF2TGluayBjbGFzcz1cIm5hdi1saW5rIHRleHQtYWN0aXZlLXByaW1hcnkgbXMtMCBtZS0xMCBweS01XCIgKGNsaWNrKT1cImxvYWRFbnF1ZXVlZEpvYnMoKVwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkVucXVldWVkXCIpfX0oe3tqb2JDb3VudHNNb2RlbC5FbnF1ZXVlZH19KTwvYT5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbmdiTmF2Q29udGVudD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBib3JkZXItMCBwdC01IHB4LTAgIGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC10aXRsZVwiICpuZ0lmPVwiaXNFbnF1ZXVlZEZpbHRlckxvYWRlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8QkJTRi1UZXh0Qm94IFtvcHRpb25zXT1cInNlYXJjaFRleHRCb3hcIiAgKE9uQ2hhbmdlKT1cImZpbHRlckVucXVldWVkTGlzdCgkZXZlbnQpXCIgW2dyb3VwXT1cImVucXVldWVkRm9ybVwiPjwvQkJTRi1UZXh0Qm94PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBweS0zIHB4LTBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tYmVnaW46OlBlcm1pc3Npb24gbGlzdC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIGJlZ2luOjpUYWJsZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIGFsaWduLW1pZGRsZSB0YWJsZS1yb3ctZGFzaGVkIGZzLTYgZ3ktNSBkYXRhVGFibGUgbm8tZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJ0ZXh0LXN0YXJ0IHRleHQtZ3JheS00MDAgZnctYm9sZGVyIGZzLTcgdGV4dC11cHBlcmNhc2UgZ3MtMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwibWluLXctMTUwcHhcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJKb2JcIil9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJtaW4tdy0xNTBweFwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlN0YXRlXCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keSBpZD1cImxpc3RpbmdDb250YWluZXJcIiBjbGFzcz1cImZ3LWJvbGQgdGV4dC1ncmF5LTYwMCBib3JkZXItMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgam9iIG9mIGZpbHRlcmVkRW5xdWV1ZWRQYWdpbmdSZXN1bHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtZGFya1wiPnt7am9iLmpvYn19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2pvYi5zdGF0ZX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciAgKm5nSWY9XCJmaWx0ZXJlZEVucXVldWVkUGFnaW5nUmVzdWx0Lmxlbmd0aCA9PSAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1lbXB0eS1kYXRhPjwvbGliLWVtcHR5LWRhdGE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWZvb3RlciBib3JkZXItMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxCQlNGLVBhZ2luZyAoSXRlbXMpPVwic2V0RW5xdWV1ZWRMaXN0UmVzdWx0KCRldmVudClcIiAqbmdJZj1cImlzRW5xdWV1ZWRGaWx0ZXJMb2FkZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJlbnF1ZXVlZFBhZ2luZ1wiIFtncm91cF09XCJlbnF1ZXVlZEZvcm1cIiAjRW5xdWV1ZWRQYWdpbmdWaWV3RWxlbWVudD5cclxuICAgICAgICAgICAgICAgICAgICA8L0JCU0YtUGFnaW5nPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgIDxsaSBuZ2JOYXZJdGVtIGNsYXNzPVwibmF2LWl0ZW0gbXQtMlwiPlxyXG4gICAgICAgICAgICAgIDxhIG5nYk5hdkxpbmsgY2xhc3M9XCJuYXYtbGluayB0ZXh0LWFjdGl2ZS1wcmltYXJ5IG1zLTAgbWUtMTAgcHktNVwiIChjbGljayk9XCJsb2FkU2NoZWR1bGVkSm9icygpXCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiU2NoZWR1bGVkXCIpfX0oe3tqb2JDb3VudHNNb2RlbC5TY2hlZHVsZWR9fSk8L2E+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG5nYk5hdkNvbnRlbnQ+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHB5LTMgcHgtMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS1iZWdpbjo6UGVybWlzc2lvbiBsaXN0LS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYmVnaW46OlRhYmxlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgYWxpZ24tbWlkZGxlIHRhYmxlLXJvdy1kYXNoZWQgZnMtNiBneS01IGRhdGFUYWJsZSBuby1mb290ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cInRleHQtc3RhcnQgdGV4dC1ncmF5LTQwMCBmdy1ib2xkZXIgZnMtNyB0ZXh0LXVwcGVyY2FzZSBncy0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJtaW4tdy0xNTBweFwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkpvYlwiKX19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cIm1pbi13LTE1MHB4XCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiRW5xdWV1ZWRcIil9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJtaW4tdy0xNTBweFwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlNjaGVkdWxlZFwiKX19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHkgaWQ9XCJsaXN0aW5nQ29udGFpbmVyXCIgY2xhc3M9XCJmdy1ib2xkIHRleHQtZ3JheS02MDAgYm9yZGVyLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IGpvYiBvZiBzY2hlZHVsZWRQYWdpbmdSZXN1bHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2pvYi5qb2J9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tqb2IuZW5xdWV1ZUF0fX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7am9iLnNjaGVkdWxlZEF0fX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyICAqbmdJZj1cInNjaGVkdWxlZFBhZ2luZ1Jlc3VsdC5sZW5ndGggPT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItZW1wdHktZGF0YT48L2xpYi1lbXB0eS1kYXRhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWZvb3RlciBib3JkZXItMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxCQlNGLVBhZ2luZyAoSXRlbXMpPVwic2V0U2NoZWR1bGVkTGlzdFJlc3VsdCgkZXZlbnQpXCIgKm5nSWY9XCJpc1NjaGVkdWxlZEZpbHRlckxvYWRlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cInNjaGVkdWxlZFBhZ2luZ1wiIFtncm91cF09XCJzY2hlZHVsZWRGb3JtXCIgI1NjaGVkdWxlZFBhZ2luZ1ZpZXdFbGVtZW50PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvQkJTRi1QYWdpbmc+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgPGxpIG5nYk5hdkl0ZW0gY2xhc3M9XCJuYXYtaXRlbSBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgPGEgbmdiTmF2TGluayBjbGFzcz1cIm5hdi1saW5rIHRleHQtYWN0aXZlLXByaW1hcnkgbXMtMCBtZS0xMCBweS01XCIgKGNsaWNrKT1cImxvYWRQcm9jZXNzaW5nSm9icygpXCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiUHJvY2Vzc2luZ1wiKX19KHt7am9iQ291bnRzTW9kZWwuUHJvY2Vzc2luZ319KTwvYT5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbmdiTmF2Q29udGVudD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcHktMyBweC0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLWJlZ2luOjpQZXJtaXNzaW9uIGxpc3QtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBiZWdpbjo6VGFibGUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBhbGlnbi1taWRkbGUgdGFibGUtcm93LWRhc2hlZCBmcy02IGd5LTUgZGF0YVRhYmxlIG5vLWZvb3RlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwidGV4dC1zdGFydCB0ZXh0LWdyYXktNDAwIGZ3LWJvbGRlciBmcy03IHRleHQtdXBwZXJjYXNlIGdzLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cIm1pbi13LTE1MHB4XCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiSm9iXCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwibWluLXctMTUwcHhcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJTdGFydGVkQXRcIil9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJtaW4tdy0xNTBweFwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlNlcnZlcklkXCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keSBpZD1cImxpc3RpbmdDb250YWluZXJcIiBjbGFzcz1cImZ3LWJvbGQgdGV4dC1ncmF5LTYwMCBib3JkZXItMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgam9iIG9mIHByb2Nlc3NpbmdQYWdpbmdSZXN1bHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2pvYi5qb2J9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tqb2Iuc3RhcnRlZEF0fX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7am9iLnNlcnZlcklkfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0lmPVwicHJvY2Vzc2luZ1BhZ2luZ1Jlc3VsdC5sZW5ndGggPT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItZW1wdHktZGF0YT48L2xpYi1lbXB0eS1kYXRhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWZvb3RlciBib3JkZXItMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxCQlNGLVBhZ2luZyAoSXRlbXMpPVwic2V0UHJvY2Vzc2luZ0xpc3RSZXN1bHQoJGV2ZW50KVwiICpuZ0lmPVwiaXNQcm9jZXNzaW5nRmlsdGVyTG9hZGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwicHJvY2Vzc2luZ1BhZ2luZ1wiIFtncm91cF09XCJwcm9jZXNzaW5nRm9ybVwiICNQcm9jZXNzaW5nUGFnaW5nVmlld0VsZW1lbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9CQlNGLVBhZ2luZz5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICA8bGkgbmdiTmF2SXRlbSBjbGFzcz1cIm5hdi1pdGVtIG10LTJcIj5cclxuICAgICAgICAgICAgICA8YSBuZ2JOYXZMaW5rIGNsYXNzPVwibmF2LWxpbmsgdGV4dC1hY3RpdmUtcHJpbWFyeSBtcy0wIG1lLTEwIHB5LTVcIiAoY2xpY2spPVwibG9hZFN1Y2NlZWRlZEpvYnMoKVwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlN1Y2NlZWRlZFwiKX19KHt7am9iQ291bnRzTW9kZWwuU3VjY2VlZGVkfX0pPC9hPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuZ2JOYXZDb250ZW50PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmRcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBweS0zIHB4LTBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBiZWdpbjo6VGFibGUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBhbGlnbi1taWRkbGUgdGFibGUtcm93LWRhc2hlZCBmcy02IGd5LTUgZGF0YVRhYmxlIG5vLWZvb3RlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwidGV4dC1zdGFydCB0ZXh0LWdyYXktNDAwIGZ3LWJvbGRlciBmcy03IHRleHQtdXBwZXJjYXNlIGdzLTBcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJtaW4tdy0xNTBcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJKb2JcIil9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJtaW4tdy0xNTBcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJTdWNjZWVkZWRBdFwiKX19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cIm1pbi13LTE1MFwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIlRvdGFsRHVyYXRpb25cIil9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5IGlkPVwibGlzdGluZ0NvbnRhaW5lclwiIGNsYXNzPVwiZnctYm9sZCB0ZXh0LWdyYXktNjAwIGJvcmRlci0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBqb2Igb2Ygc3VjY2VlZGVkUGFnaW5nUmVzdWx0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tqb2Iuam9ifX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7am9iLnN1Y2NlZWRlZEF0fX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7am9iLnRvdGFsRHVyYXRpb259fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgKm5nSWY9XCJzdWNjZWVkZWRQYWdpbmdSZXN1bHQubGVuZ3RoID09IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLWVtcHR5LWRhdGE+PC9saWItZW1wdHktZGF0YT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtZm9vdGVyIGJvcmRlci0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPEJCU0YtUGFnaW5nIChJdGVtcyk9XCJzZXRTdWNjZWVkZWRMaXN0UmVzdWx0KCRldmVudClcIiAqbmdJZj1cImlzU3VjY2VlZGVkRmlsdGVyTG9hZGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwic3VjY2VlZGVkUGFnaW5nXCIgW2dyb3VwXT1cInN1Y2NlZWRlZEZvcm1cIiAjU3VjY2VlZGVkUGFnaW5nVmlld0VsZW1lbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9CQlNGLVBhZ2luZz5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICA8bGkgbmdiTmF2SXRlbSBjbGFzcz1cIm5hdi1pdGVtIG10LTJcIj5cclxuICAgICAgICAgICAgICA8YSBuZ2JOYXZMaW5rIGNsYXNzPVwibmF2LWxpbmsgdGV4dC1hY3RpdmUtcHJpbWFyeSBtcy0wIG1lLTEwIHB5LTVcIiAoY2xpY2spPVwibG9hZEZhaWxlZEpvYnMoKVwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkZhaWxlZFwiKX19KHt7am9iQ291bnRzTW9kZWwuRmFpbGVkfX0pPC9hPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBuZ2JOYXZDb250ZW50PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmRcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBweS0zIHB4LTBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBiZWdpbjo6VGFibGUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBhbGlnbi1taWRkbGUgdGFibGUtcm93LWRhc2hlZCBmcy02IGd5LTUgZGF0YVRhYmxlIG5vLWZvb3RlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwidGV4dC1zdGFydCB0ZXh0LWdyYXktNDAwIGZ3LWJvbGRlciBmcy03IHRleHQtdXBwZXJjYXNlIGdzLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cIm1pbi13LTE1MFwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkZhaWxlZEF0XCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwibWluLXctMTUwXCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiSm9iXCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwibWluLXctMTUwXCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiRXJyb3JNZXNzYWdlXCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwibWluLXctMTUwXCI+e3t1dGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKFwiRXJyb3JNZXNzYWdlXCIpfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keSBpZD1cImxpc3RpbmdDb250YWluZXJcIiBjbGFzcz1cImZ3LWJvbGQgdGV4dC1ncmF5LTYwMCBib3JkZXItMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgam9iIG9mIGZhaWxlZFBhZ2luZ1Jlc3VsdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7am9iLmZhaWxlZEF0fX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7am9iLmpvYn19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2pvYi5yZWFzb259fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJmYWlsZWQtam9iLWRldGFpbHMgZGlyZWN0aW9uTHRyXCIgKm5nSWY9XCJqb2IuaW5GYWlsZWRTdGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXhwYW5kYWJsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPiB7e2pvYi5leGNlcHRpb25UeXBlfX08L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2pvYi5leGNlcHRpb25NZXNzYWdlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgKm5nSWY9XCJmYWlsZWRQYWdpbmdSZXN1bHQubGVuZ3RoID09IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLWVtcHR5LWRhdGE+PC9saWItZW1wdHktZGF0YT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1mb290ZXIgYm9yZGVyLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8QkJTRi1QYWdpbmcgKEl0ZW1zKT1cInNldEZhaWxlZExpc3RSZXN1bHQoJGV2ZW50KVwiICpuZ0lmPVwiaXNGYWlsZWRGaWx0ZXJMb2FkZWRcIiBbb3B0aW9uc109XCJmYWlsZWRQYWdpbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZ3JvdXBdPVwiZmFpbGVkRm9ybVwiICNGYWlsZWRQYWdpbmdWaWV3RWxlbWVudD5cclxuICAgICAgICAgICAgICAgICAgICA8L0JCU0YtUGFnaW5nPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgIDxsaSBuZ2JOYXZJdGVtIGNsYXNzPVwibmF2LWl0ZW0gbXQtMlwiPlxyXG4gICAgICAgICAgICAgIDxhIG5nYk5hdkxpbmsgY2xhc3M9XCJuYXYtbGluayB0ZXh0LWFjdGl2ZS1wcmltYXJ5IG1zLTAgbWUtMTAgcHktNVwiIChjbGljayk9XCJsb2FkRGVsZXRlZEpvYnMoKVwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkRlbGV0ZWRcIil9fSh7e2pvYkNvdW50c01vZGVsLkRlbGV0ZWR9fSk8L2E+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG5nYk5hdkNvbnRlbnQ+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHB5LTMgcHgtMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIGJlZ2luOjpUYWJsZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIGFsaWduLW1pZGRsZSB0YWJsZS1yb3ctZGFzaGVkIGZzLTYgZ3ktNSBkYXRhVGFibGUgbm8tZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJ0ZXh0LXN0YXJ0IHRleHQtZ3JheS00MDAgZnctYm9sZGVyIGZzLTcgdGV4dC11cHBlcmNhc2UgZ3MtMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwibWluLXctMTUwcHhcIj57e3V0aWxpdHlTZXJ2aWNlLmdldFJlc291cmNlVmFsdWUoXCJKb2JcIil9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJtaW4tdy0xNTBweFwiPnt7dXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShcIkRlbGV0ZWRBdFwiKX19PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHkgaWQ9XCJsaXN0aW5nQ29udGFpbmVyXCIgY2xhc3M9XCJmdy1ib2xkIHRleHQtZ3JheS02MDAgYm9yZGVyLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IGpvYiBvZiBkZWxldGVkUGFnaW5nUmVzdWx0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3tqb2Iuam9ifX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPnt7am9iLmRlbGV0ZWRBdH19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciAgKm5nSWY9XCJkZWxldGVkUGFnaW5nUmVzdWx0Lmxlbmd0aCA9PSAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj1cIjJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1lbXB0eS1kYXRhPjwvbGliLWVtcHR5LWRhdGE+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtZm9vdGVyIGJvcmRlci0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPEJCU0YtUGFnaW5nIChJdGVtcyk9XCJzZXREZWxldGVkTGlzdFJlc3VsdCgkZXZlbnQpXCIgKm5nSWY9XCJpc0RlbGV0ZWRGaWx0ZXJMb2FkZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJkZWxldGVkUGFnaW5nXCIgW2dyb3VwXT1cImRlbGV0ZWRGb3JtXCIgI0RlbGV0ZWRQYWdpbmdWaWV3RWxlbWVudD5cclxuICAgICAgICAgICAgICAgICAgICA8L0JCU0YtUGFnaW5nPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgPGRpdiBbbmdiTmF2T3V0bGV0XT1cIm5hdlwiPjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICA8L2Rpdj5cclxuIFxyXG5cclxuIl19
|